diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml index b6b83c5f..d4677580 100644 --- a/.pre-commit-config.yaml +++ b/.pre-commit-config.yaml @@ -13,8 +13,13 @@ repos: - id: pretty-format-json exclude: ^.devcontainer/devcontainer.json args: [--autofix, --no-sort-keys] + # Generated bundles are excluded from the fixers: minified code may legitimately end + # a line inside a template literal with whitespace, and rewriting it would corrupt + # the artifact the CDN pin serves byte-for-byte. - id: end-of-file-fixer + exclude: '(^|/)(dist|node_modules)/' - id: trailing-whitespace + exclude: '(^|/)(dist|node_modules)/' - repo: https://github.com/astral-sh/ruff-pre-commit rev: "v0.11.5" diff --git a/src/panelini/panels/monacoeditor/js/dist/monacoeditor.mjs b/src/panelini/panels/monacoeditor/js/dist/monacoeditor.mjs index c52f467f..44022efd 100644 --- a/src/panelini/panels/monacoeditor/js/dist/monacoeditor.mjs +++ b/src/panelini/panels/monacoeditor/js/dist/monacoeditor.mjs @@ -1,27 +1,27 @@ -var R8 = Object.defineProperty; -var E8 = (s, e, t) => e in s ? R8(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t; -var Gi = (s, e, t) => E8(s, typeof e != "symbol" ? e + "" : e, t); -function aH() { +var R6 = Object.defineProperty; +var N6 = (s, e, t) => e in s ? R6(s, e, { enumerable: !0, configurable: !0, writable: !0, value: t }) : s[e] = t; +var qt = (s, e, t) => N6(s, typeof e != "symbol" ? e + "" : e, t); +function KP() { return globalThis._VSCODE_NLS_MESSAGES; } -function PR() { +function bv() { return globalThis._VSCODE_NLS_LANGUAGE; } -const X8 = PR() === "pseudo" || typeof document < "u" && document.location && document.location.hash.indexOf("pseudo=true") >= 0; -function KL(s, e) { +const w6 = bv() === "pseudo" || typeof document < "u" && document.location && document.location.hash.indexOf("pseudo=true") >= 0; +function aV(s, e) { let t; return e.length === 0 ? t = s : t = s.replace(/\{(\d+)\}/g, (i, n) => { - const o = n[0], r = e[o]; - let l = i; - return typeof r == "string" ? l = r : (typeof r == "number" || typeof r == "boolean" || r === void 0 || r === null) && (l = String(r)), l; - }), X8 && (t = "[" + t.replace(/[aouei]/g, "$&$&") + "]"), t; + const o = n[0], l = e[o]; + let r = i; + return typeof l == "string" ? r = l : (typeof l == "number" || typeof l == "boolean" || l === void 0 || l === null) && (r = String(l)), r; + }), w6 && (t = "[" + t.replace(/[aouei]/g, "$&$&") + "]"), t; } function p(s, e, ...t) { - return KL(typeof s == "number" ? cH(s, e) : e, t); + return aV(typeof s == "number" ? UP(s, e) : e, t); } -function cH(s, e) { +function UP(s, e) { var i; - const t = (i = aH()) == null ? void 0 : i[s]; + const t = (i = KP()) == null ? void 0 : i[s]; if (typeof t != "string") { if (typeof e == "string") return e; @@ -29,22 +29,22 @@ function cH(s, e) { } return t; } -function Ie(s, e, ...t) { +function Ce(s, e, ...t) { let i; - typeof s == "number" ? i = cH(s, e) : i = e; - const n = KL(i, t); + typeof s == "number" ? i = UP(s, e) : i = e; + const n = aV(i, t); return { value: n, - original: e === i ? n : KL(e, t) + original: e === i ? n : aV(e, t) }; } -function F8(s, e) { +function T6(s, e) { const t = s; typeof t.vscodeWindowId != "number" && Object.defineProperty(t, "vscodeWindowId", { get: () => e }); } -const vt = window, QM = class QM { +const wt = window, h2 = class h2 { constructor() { this.mapWindowIdToZoomFactor = /* @__PURE__ */ new Map(); } @@ -55,108 +55,108 @@ const vt = window, QM = class QM { return e.vscodeWindowId; } }; -QM.INSTANCE = new QM(); -let g2 = QM; -function dH(s, e, t) { +h2.INSTANCE = new h2(); +let YN = h2; +function PP(s, e, t) { typeof e == "string" && (e = s.matchMedia(e)), e.addEventListener("change", t); } -function Y8(s) { - return g2.INSTANCE.getZoomFactor(s); -} -const Kb = navigator.userAgent, pr = Kb.indexOf("Firefox") >= 0, Z_ = Kb.indexOf("AppleWebKit") >= 0, lC = Kb.indexOf("Chrome") >= 0, xh = !lC && Kb.indexOf("Safari") >= 0, hH = !lC && !xh && Z_; -Kb.indexOf("Electron/") >= 0; -const D9 = Kb.indexOf("Android") >= 0; -let uN = !1; -if (typeof vt.matchMedia == "function") { - const s = vt.matchMedia("(display-mode: standalone) or (display-mode: window-controls-overlay)"), e = vt.matchMedia("(display-mode: fullscreen)"); - uN = s.matches, dH(vt, s, ({ matches: t }) => { - uN && e.matches || (uN = t); +function M6(s) { + return YN.INSTANCE.getZoomFactor(s); +} +const t0 = navigator.userAgent, fl = t0.indexOf("Firefox") >= 0, FS = t0.indexOf("AppleWebKit") >= 0, WG = t0.indexOf("Chrome") >= 0, Ch = !WG && t0.indexOf("Safari") >= 0, BP = !WG && !Ch && FS; +t0.indexOf("Electron/") >= 0; +const sD = t0.indexOf("Android") >= 0; +let CC = !1; +if (typeof wt.matchMedia == "function") { + const s = wt.matchMedia("(display-mode: standalone) or (display-mode: window-controls-overlay)"), e = wt.matchMedia("(display-mode: fullscreen)"); + CC = s.matches, PP(wt, s, ({ matches: t }) => { + CC && e.matches || (CC = t); }); } -function Vs(s) { +function vs(s) { return typeof s == "string"; } -function tn(s) { +function nn(s) { return typeof s == "object" && s !== null && !Array.isArray(s) && !(s instanceof RegExp) && !(s instanceof Date); } -function z8(s) { +function Y6(s) { const e = Object.getPrototypeOf(Uint8Array); return typeof s == "object" && s instanceof e; } -function Mh(s) { +function Rh(s) { return typeof s == "number" && !isNaN(s); } -function V9(s) { +function oD(s) { return !!s && typeof s[Symbol.iterator] == "function"; } -function uH(s) { +function _P(s) { return s === !0 || s === !1; } -function jn(s) { +function $n(s) { return typeof s > "u"; } -function xa(s) { - return !Do(s); +function Cc(s) { + return !ko(s); } -function Do(s) { - return jn(s) || s === null; +function ko(s) { + return $n(s) || s === null; } function ht(s, e) { if (!s) throw new Error(e ? `Unexpected type, expected '${e}'` : "Unexpected type"); } -function Ed(s) { - if (Do(s)) +function za(s) { + if (ko(s)) throw new Error("Assertion Failed: argument is undefined or null"); return s; } -function QL(s) { +function hV(s) { return typeof s == "function"; } -function P8(s, e) { +function k6(s, e) { const t = Math.min(s.length, e.length); for (let i = 0; i < t; i++) - B8(s[i], e[i]); + v6(s[i], e[i]); } -function B8(s, e) { - if (Vs(e)) { +function v6(s, e) { + if (vs(e)) { if (typeof s !== e) throw new Error(`argument does not match constraint: typeof ${e}`); - } else if (QL(e)) { + } else if (hV(e)) { try { if (s instanceof e) return; } catch { } - if (!Do(s) && s.constructor === e || e.length === 1 && e.call(void 0, s) === !0) + if (!ko(s) && s.constructor === e || e.length === 1 && e.call(void 0, s) === !0) return; throw new Error("argument does not match one of these constraints: arg instanceof constraint, arg.constructor === constraint, nor constraint(arg) === true"); } } -const vp = "en"; -let jL = !1, qL = !1, lL = !1, gH = !1, BR = !1, OR = !1, mH = !1, UC, aL = vp, k9 = vp, O8, nl; -const kc = globalThis; -let ss; -var sH; -typeof kc.vscode < "u" && typeof kc.vscode.process < "u" ? ss = kc.vscode.process : typeof process < "u" && typeof ((sH = process == null ? void 0 : process.versions) == null ? void 0 : sH.node) == "string" && (ss = process); -var oH; -const H8 = typeof ((oH = ss == null ? void 0 : ss.versions) == null ? void 0 : oH.electron) == "string", J8 = H8 && (ss == null ? void 0 : ss.type) === "renderer"; -var rH; -if (typeof ss == "object") { - jL = ss.platform === "win32", qL = ss.platform === "darwin", lL = ss.platform === "linux", lL && ss.env.SNAP && ss.env.SNAP_REVISION, ss.env.CI || ss.env.BUILD_ARTIFACTSTAGINGDIRECTORY, UC = vp, aL = vp; - const s = ss.env.VSCODE_NLS_CONFIG; +const Jp = "en"; +let uV = !1, mV = !1, XX = !1, QP = !1, pv = !1, gv = !1, OP = !1, r1, VX = Jp, lD = Jp, J6, lr; +const Ed = globalThis; +let ls; +var DP; +typeof Ed.vscode < "u" && typeof Ed.vscode.process < "u" ? ls = Ed.vscode.process : typeof process < "u" && typeof ((DP = process == null ? void 0 : process.versions) == null ? void 0 : DP.node) == "string" && (ls = process); +var FP; +const H6 = typeof ((FP = ls == null ? void 0 : ls.versions) == null ? void 0 : FP.electron) == "string", E6 = H6 && (ls == null ? void 0 : ls.type) === "renderer"; +var zP; +if (typeof ls == "object") { + uV = ls.platform === "win32", mV = ls.platform === "darwin", XX = ls.platform === "linux", XX && ls.env.SNAP && ls.env.SNAP_REVISION, ls.env.CI || ls.env.BUILD_ARTIFACTSTAGINGDIRECTORY, r1 = Jp, VX = Jp; + const s = ls.env.VSCODE_NLS_CONFIG; if (s) try { const e = JSON.parse(s); - UC = e.userLocale, k9 = e.osLocale, aL = e.resolvedLanguage || vp, O8 = (rH = e.languagePack) == null ? void 0 : rH.translationsConfigFile; + r1 = e.userLocale, lD = e.osLocale, VX = e.resolvedLanguage || Jp, J6 = (zP = e.languagePack) == null ? void 0 : zP.translationsConfigFile; } catch { } - gH = !0; -} else typeof navigator == "object" && !J8 ? (nl = navigator.userAgent, jL = nl.indexOf("Windows") >= 0, qL = nl.indexOf("Macintosh") >= 0, OR = (nl.indexOf("Macintosh") >= 0 || nl.indexOf("iPad") >= 0 || nl.indexOf("iPhone") >= 0) && !!navigator.maxTouchPoints && navigator.maxTouchPoints > 0, lL = nl.indexOf("Linux") >= 0, mH = (nl == null ? void 0 : nl.indexOf("Mobi")) >= 0, BR = !0, aL = PR() || vp, UC = navigator.language.toLowerCase(), k9 = UC) : console.error("Unable to resolve platform."); -const kn = jL, qe = qL, fs = lL, Na = gH, Dm = BR, U8 = BR && typeof kc.importScripts == "function", K8 = U8 ? kc.origin : void 0, Wa = OR, pH = mH, va = nl, Q8 = aL, j8 = typeof kc.postMessage == "function" && !kc.importScripts, fH = (() => { - if (j8) { + QP = !0; +} else typeof navigator == "object" && !E6 ? (lr = navigator.userAgent, uV = lr.indexOf("Windows") >= 0, mV = lr.indexOf("Macintosh") >= 0, gv = (lr.indexOf("Macintosh") >= 0 || lr.indexOf("iPad") >= 0 || lr.indexOf("iPhone") >= 0) && !!navigator.maxTouchPoints && navigator.maxTouchPoints > 0, XX = lr.indexOf("Linux") >= 0, OP = (lr == null ? void 0 : lr.indexOf("Mobi")) >= 0, pv = !0, VX = bv() || Jp, r1 = navigator.language.toLowerCase(), lD = r1) : console.error("Unable to resolve platform."); +const Jn = uV, qe = mV, fs = XX, Mc = QP, Hb = pv, D6 = pv && typeof Ed.importScripts == "function", F6 = D6 ? Ed.origin : void 0, Yc = gv, jP = OP, kc = lr, z6 = VX, A6 = typeof Ed.postMessage == "function" && !Ed.importScripts, qP = (() => { + if (A6) { const s = []; - kc.addEventListener("message", (t) => { + Ed.addEventListener("message", (t) => { if (t.data && t.data.vscodeScheduleAsyncWork) for (let i = 0, n = s.length; i < n; i++) { const o = s[i]; @@ -172,28 +172,28 @@ const kn = jL, qe = qL, fs = lL, Na = gH, Dm = BR, U8 = BR && typeof kc.importSc s.push({ id: i, callback: t - }), kc.postMessage({ vscodeScheduleAsyncWork: i }, "*"); + }), Ed.postMessage({ vscodeScheduleAsyncWork: i }, "*"); }; } return (s) => setTimeout(s); -})(), ro = qL || OR ? 2 : jL ? 1 : 3; -let G9 = !0, R9 = !1; -function bH() { - if (!R9) { - R9 = !0; +})(), co = mV || gv ? 2 : uV ? 1 : 3; +let rD = !0, cD = !1; +function $P() { + if (!cD) { + cD = !0; const s = new Uint8Array(2); - s[0] = 1, s[1] = 2, G9 = new Uint16Array(s.buffer)[0] === 513; + s[0] = 1, s[1] = 2, rD = new Uint16Array(s.buffer)[0] === 513; } - return G9; + return rD; } -const yH = !!(va && va.indexOf("Chrome") >= 0), q8 = !!(va && va.indexOf("Firefox") >= 0), $8 = !!(!yH && va && va.indexOf("Safari") >= 0), e6 = !!(va && va.indexOf("Edg/") >= 0), t6 = !!(va && va.indexOf("Android") >= 0), HR = { +const eB = !!(kc && kc.indexOf("Chrome") >= 0), K6 = !!(kc && kc.indexOf("Firefox") >= 0), U6 = !!(!eB && kc && kc.indexOf("Safari") >= 0), P6 = !!(kc && kc.indexOf("Edg/") >= 0), B6 = !!(kc && kc.indexOf("Android") >= 0), Zv = { clipboard: { - writeText: Na || document.queryCommandSupported && document.queryCommandSupported("copy") || !!(navigator && navigator.clipboard && navigator.clipboard.writeText), - readText: Na || !!(navigator && navigator.clipboard && navigator.clipboard.readText) + writeText: Mc || document.queryCommandSupported && document.queryCommandSupported("copy") || !!(navigator && navigator.clipboard && navigator.clipboard.writeText), + readText: Mc || !!(navigator && navigator.clipboard && navigator.clipboard.readText) }, - pointerEvents: vt.PointerEvent && ("ontouchstart" in vt || navigator.maxTouchPoints > 0) + pointerEvents: wt.PointerEvent && ("ontouchstart" in wt || navigator.maxTouchPoints > 0) }; -class JR { +class fv { constructor() { this._keyCodeToStr = [], this._strToKeyCode = /* @__PURE__ */ Object.create(null); } @@ -207,9 +207,9 @@ class JR { return this._strToKeyCode[e.toLowerCase()] || 0; } } -const cL = new JR(), m2 = new JR(), p2 = new JR(), wH = new Array(230), i6 = /* @__PURE__ */ Object.create(null), n6 = /* @__PURE__ */ Object.create(null), UR = []; +const LX = new fv(), kN = new fv(), vN = new fv(), tB = new Array(230), _6 = /* @__PURE__ */ Object.create(null), Q6 = /* @__PURE__ */ Object.create(null), yv = []; for (let s = 0; s <= 193; s++) - UR[s] = -1; + yv[s] = -1; (function() { const s = "", e = [ // immutable, scanCode, scanCodeStr, keyCode, keyCodeStr, eventKeyCode, vkey, usUserSettingsLabel, generalUserSettingsLabel @@ -447,41 +447,41 @@ for (let s = 0; s <= 193; s++) [1, 0, s, 0, s, 0, "VK_OEM_CLEAR", s, s] ], t = [], i = []; for (const n of e) { - const [o, r, l, a, c, d, h, u, g] = n; - if (i[r] || (i[r] = !0, i6[l] = r, n6[l.toLowerCase()] = r, o && (UR[r] = a)), !t[a]) { - if (t[a] = !0, !c) - throw new Error(`String representation missing for key code ${a} around scan code ${l}`); - cL.define(a, c), m2.define(a, u || c), p2.define(a, g || u || c); + const [o, l, r, c, d, a, h, u, m] = n; + if (i[l] || (i[l] = !0, _6[r] = l, Q6[r.toLowerCase()] = l, o && (yv[l] = c)), !t[c]) { + if (t[c] = !0, !d) + throw new Error(`String representation missing for key code ${c} around scan code ${r}`); + LX.define(c, d), kN.define(c, u || d), vN.define(c, m || u || d); } - d && (wH[d] = a); + a && (tB[a] = c); } })(); -var bc; +var Gd; (function(s) { - function e(l) { - return cL.keyCodeToStr(l); + function e(r) { + return LX.keyCodeToStr(r); } s.toString = e; - function t(l) { - return cL.strToKeyCode(l); + function t(r) { + return LX.strToKeyCode(r); } s.fromString = t; - function i(l) { - return m2.keyCodeToStr(l); + function i(r) { + return kN.keyCodeToStr(r); } s.toUserSettingsUS = i; - function n(l) { - return p2.keyCodeToStr(l); + function n(r) { + return vN.keyCodeToStr(r); } s.toUserSettingsGeneral = n; - function o(l) { - return m2.strToKeyCode(l) || p2.strToKeyCode(l); + function o(r) { + return kN.strToKeyCode(r) || vN.strToKeyCode(r); } s.fromUserSettings = o; - function r(l) { - if (l >= 98 && l <= 113) + function l(r) { + if (r >= 98 && r <= 113) return null; - switch (l) { + switch (r) { case 16: return "Up"; case 18: @@ -491,19 +491,19 @@ var bc; case 17: return "Right"; } - return cL.keyCodeToStr(l); + return LX.keyCodeToStr(r); } - s.toElectronAccelerator = r; -})(bc || (bc = {})); -function Xi(s, e) { + s.toElectronAccelerator = l; +})(Gd || (Gd = {})); +function Di(s, e) { const t = (e & 65535) << 16 >>> 0; return (s | t) >>> 0; } -class s6 { +class O6 { constructor() { this.listeners = [], this.unexpectedErrorHandler = function(e) { setTimeout(() => { - throw e.stack ? sb.isErrorNoTelemetry(e) ? new sb(e.message + ` + throw e.stack ? aZ.isErrorNoTelemetry(e) ? new aZ(e.message + ` ` + e.stack) : new Error(e.message + ` @@ -524,14 +524,14 @@ class s6 { this.unexpectedErrorHandler(e); } } -const CH = new s6(); -function De(s) { - jr(s) || CH.onUnexpectedError(s); +const iB = new O6(); +function Me(s) { + er(s) || iB.onUnexpectedError(s); } -function wi(s) { - jr(s) || CH.onUnexpectedExternalError(s); +function Wi(s) { + er(s) || iB.onUnexpectedExternalError(s); } -function E9(s) { +function dD(s) { if (s instanceof Error) { const { name: e, message: t } = s, i = s.stacktrace || s.stack; return { @@ -539,80 +539,80 @@ function E9(s) { name: e, message: t, stack: i, - noTelemetry: sb.isErrorNoTelemetry(s) + noTelemetry: aZ.isErrorNoTelemetry(s) }; } return s; } -const $L = "Canceled"; -function jr(s) { - return s instanceof Pr ? !0 : s instanceof Error && s.name === $L && s.message === $L; +const bV = "Canceled"; +function er(s) { + return s instanceof Pl ? !0 : s instanceof Error && s.name === bV && s.message === bV; } -class Pr extends Error { +class Pl extends Error { constructor() { - super($L), this.name = this.message; + super(bV), this.name = this.message; } } -function o6() { - const s = new Error($L); +function j6() { + const s = new Error(bV); return s.name = s.message, s; } -function hr(s) { +function bl(s) { return s ? new Error(`Illegal argument: ${s}`) : new Error("Illegal argument"); } -function KR(s) { +function Wv(s) { return s ? new Error(`Illegal state: ${s}`) : new Error("Illegal state"); } -class r6 extends Error { +class q6 extends Error { constructor(e) { super("NotSupported"), e && (this.message = e); } } -class sb extends Error { +class aZ extends Error { constructor(e) { super(e), this.name = "CodeExpectedError"; } static fromError(e) { - if (e instanceof sb) + if (e instanceof aZ) return e; - const t = new sb(); + const t = new aZ(); return t.message = e.message, t.stack = e.stack, t; } static isErrorNoTelemetry(e) { return e.name === "CodeExpectedError"; } } -class mt extends Error { +class bt extends Error { constructor(e) { - super(e || "An unexpected bug occurred."), Object.setPrototypeOf(this, mt.prototype); + super(e || "An unexpected bug occurred."), Object.setPrototypeOf(this, bt.prototype); } } -function f2(s, e) { +function JN(s, e) { if (typeof s == "number") { if (s === 0) return null; const t = (s & 65535) >>> 0, i = (s & 4294901760) >>> 16; - return i !== 0 ? new gN([ - KC(t, e), - KC(i, e) - ]) : new gN([KC(t, e)]); + return i !== 0 ? new RC([ + c1(t, e), + c1(i, e) + ]) : new RC([c1(t, e)]); } else { const t = []; for (let i = 0; i < s.length; i++) - t.push(KC(s[i], e)); - return new gN(t); + t.push(c1(s[i], e)); + return new RC(t); } } -function KC(s, e) { - const t = !!(s & 2048), i = !!(s & 256), n = e === 2 ? i : t, o = !!(s & 1024), r = !!(s & 512), l = e === 2 ? t : i, a = s & 255; - return new zc(n, o, r, l, a); +function c1(s, e) { + const t = !!(s & 2048), i = !!(s & 256), n = e === 2 ? i : t, o = !!(s & 1024), l = !!(s & 512), r = e === 2 ? t : i, c = s & 255; + return new Pd(n, o, l, r, c); } -class zc { +class Pd { constructor(e, t, i, n, o) { this.ctrlKey = e, this.shiftKey = t, this.altKey = i, this.metaKey = n, this.keyCode = o; } equals(e) { - return e instanceof zc && this.ctrlKey === e.ctrlKey && this.shiftKey === e.shiftKey && this.altKey === e.altKey && this.metaKey === e.metaKey && this.keyCode === e.keyCode; + return e instanceof Pd && this.ctrlKey === e.ctrlKey && this.shiftKey === e.shiftKey && this.altKey === e.altKey && this.metaKey === e.metaKey && this.keyCode === e.keyCode; } isModifierKey() { return this.keyCode === 0 || this.keyCode === 5 || this.keyCode === 57 || this.keyCode === 6 || this.keyCode === 4; @@ -624,29 +624,29 @@ class zc { return this.ctrlKey && this.keyCode === 5 || this.shiftKey && this.keyCode === 4 || this.altKey && this.keyCode === 6 || this.metaKey && this.keyCode === 57; } } -class gN { +class RC { constructor(e) { if (e.length === 0) - throw hr("chords"); + throw bl("chords"); this.chords = e; } } -class l6 { - constructor(e, t, i, n, o, r) { - this.ctrlKey = e, this.shiftKey = t, this.altKey = i, this.metaKey = n, this.keyLabel = o, this.keyAriaLabel = r; +class $6 { + constructor(e, t, i, n, o, l) { + this.ctrlKey = e, this.shiftKey = t, this.altKey = i, this.metaKey = n, this.keyLabel = o, this.keyAriaLabel = l; } } -class a6 { +class eq { } -function c6(s) { +function tq(s) { if (s.charCode) { const t = String.fromCharCode(s.charCode).toUpperCase(); - return bc.fromString(t); + return Gd.fromString(t); } const e = s.keyCode; if (e === 3) return 7; - if (pr) + if (fl) switch (e) { case 59: return 85; @@ -667,21 +667,21 @@ function c6(s) { return 57; break; } - else if (Z_) { + else if (FS) { if (qe && e === 93) return 57; if (!qe && e === 92) return 57; } - return wH[e] || 0; + return tB[e] || 0; } -const d6 = qe ? 256 : 2048, h6 = 512, u6 = 1024, g6 = qe ? 2048 : 256; -class Vt { +const iq = qe ? 256 : 2048, nq = 512, sq = 1024, oq = qe ? 2048 : 256; +class Yt { constructor(e) { var i; this._standardKeyboardEventBrand = !0; const t = e; - this.browserEvent = t, this.target = t.target, this.ctrlKey = t.ctrlKey, this.shiftKey = t.shiftKey, this.altKey = t.altKey, this.metaKey = t.metaKey, this.altGraphKey = (i = t.getModifierState) == null ? void 0 : i.call(t, "AltGraph"), this.keyCode = c6(t), this.code = t.code, this.ctrlKey = this.ctrlKey || this.keyCode === 5, this.altKey = this.altKey || this.keyCode === 6, this.shiftKey = this.shiftKey || this.keyCode === 4, this.metaKey = this.metaKey || this.keyCode === 57, this._asKeybinding = this._computeKeybinding(), this._asKeyCodeChord = this._computeKeyCodeChord(); + this.browserEvent = t, this.target = t.target, this.ctrlKey = t.ctrlKey, this.shiftKey = t.shiftKey, this.altKey = t.altKey, this.metaKey = t.metaKey, this.altGraphKey = (i = t.getModifierState) == null ? void 0 : i.call(t, "AltGraph"), this.keyCode = tq(t), this.code = t.code, this.ctrlKey = this.ctrlKey || this.keyCode === 5, this.altKey = this.altKey || this.keyCode === 6, this.shiftKey = this.shiftKey || this.keyCode === 4, this.metaKey = this.metaKey || this.keyCode === 57, this._asKeybinding = this._computeKeybinding(), this._asKeyCodeChord = this._computeKeyCodeChord(); } preventDefault() { this.browserEvent && this.browserEvent.preventDefault && this.browserEvent.preventDefault(); @@ -699,15 +699,15 @@ class Vt { let e = 0; this.keyCode !== 5 && this.keyCode !== 4 && this.keyCode !== 6 && this.keyCode !== 57 && (e = this.keyCode); let t = 0; - return this.ctrlKey && (t |= d6), this.altKey && (t |= h6), this.shiftKey && (t |= u6), this.metaKey && (t |= g6), t |= e, t; + return this.ctrlKey && (t |= iq), this.altKey && (t |= nq), this.shiftKey && (t |= sq), this.metaKey && (t |= oq), t |= e, t; } _computeKeyCodeChord() { let e = 0; - return this.keyCode !== 5 && this.keyCode !== 4 && this.keyCode !== 6 && this.keyCode !== 57 && (e = this.keyCode), new zc(this.ctrlKey, this.shiftKey, this.altKey, this.metaKey, e); + return this.keyCode !== 5 && this.keyCode !== 4 && this.keyCode !== 6 && this.keyCode !== 57 && (e = this.keyCode), new Pd(this.ctrlKey, this.shiftKey, this.altKey, this.metaKey, e); } } -const X9 = /* @__PURE__ */ new WeakMap(); -function m6(s) { +const aD = /* @__PURE__ */ new WeakMap(); +function lq(s) { if (!s.parent || s.parent === s) return null; try { @@ -719,18 +719,18 @@ function m6(s) { } return s.parent; } -class p6 { +class rq { /** * Returns a chain of embedded windows with the same origin (which can be accessed programmatically). * Having a chain of length 1 might mean that the current execution environment is running outside of an iframe or inside an iframe embedded in a window with a different origin. */ static getSameOriginWindowChain(e) { - let t = X9.get(e); + let t = aD.get(e); if (!t) { - t = [], X9.set(e, t); + t = [], aD.set(e, t); let i = e, n; do - n = m6(i), n ? t.push({ + n = lq(i), n ? t.push({ window: new WeakRef(i), iframeElement: i.frameElement || null }) : t.push({ @@ -752,12 +752,12 @@ class p6 { }; let i = 0, n = 0; const o = this.getSameOriginWindowChain(e); - for (const r of o) { - const l = r.window.deref(); - if (i += (l == null ? void 0 : l.scrollY) ?? 0, n += (l == null ? void 0 : l.scrollX) ?? 0, l === t || !r.iframeElement) + for (const l of o) { + const r = l.window.deref(); + if (i += (r == null ? void 0 : r.scrollY) ?? 0, n += (r == null ? void 0 : r.scrollX) ?? 0, r === t || !l.iframeElement) break; - const a = r.iframeElement.getBoundingClientRect(); - i += a.top, n += a.left; + const c = l.iframeElement.getBoundingClientRect(); + i += c.top, n += c.left; } return { top: i, @@ -765,10 +765,10 @@ class p6 { }; } } -class Er { +class Fl { constructor(e, t) { this.timestamp = Date.now(), this.browserEvent = t, this.leftButton = t.button === 0, this.middleButton = t.button === 1, this.rightButton = t.button === 2, this.buttons = t.buttons, this.target = t.target, this.detail = t.detail || 1, t.type === "dblclick" && (this.detail = 2), this.ctrlKey = t.ctrlKey, this.shiftKey = t.shiftKey, this.altKey = t.altKey, this.metaKey = t.metaKey, typeof t.pageX == "number" ? (this.posx = t.pageX, this.posy = t.pageY) : (this.posx = t.clientX + this.target.ownerDocument.body.scrollLeft + this.target.ownerDocument.documentElement.scrollLeft, this.posy = t.clientY + this.target.ownerDocument.body.scrollTop + this.target.ownerDocument.documentElement.scrollTop); - const i = p6.getPositionOfChildWindowRelativeToAncestorWindow(e, t.view); + const i = rq.getPositionOfChildWindowRelativeToAncestorWindow(e, t.view); this.posx -= i.left, this.posy -= i.top; } preventDefault() { @@ -778,34 +778,34 @@ class Er { this.browserEvent.stopPropagation(); } } -class am { +class mb { constructor(e, t = 0, i = 0) { var o; this.browserEvent = e || null, this.target = e ? e.target || e.targetNode || e.srcElement : null, this.deltaY = i, this.deltaX = t; let n = !1; - if (lC) { - const r = navigator.userAgent.match(/Chrome\/(\d+)/); - n = (r ? parseInt(r[1]) : 123) <= 122; + if (WG) { + const l = navigator.userAgent.match(/Chrome\/(\d+)/); + n = (l ? parseInt(l[1]) : 123) <= 122; } if (e) { - const r = e, l = e, a = ((o = e.view) == null ? void 0 : o.devicePixelRatio) || 1; - if (typeof r.wheelDeltaY < "u") - n ? this.deltaY = r.wheelDeltaY / (120 * a) : this.deltaY = r.wheelDeltaY / 120; - else if (typeof l.VERTICAL_AXIS < "u" && l.axis === l.VERTICAL_AXIS) - this.deltaY = -l.detail / 3; + const l = e, r = e, c = ((o = e.view) == null ? void 0 : o.devicePixelRatio) || 1; + if (typeof l.wheelDeltaY < "u") + n ? this.deltaY = l.wheelDeltaY / (120 * c) : this.deltaY = l.wheelDeltaY / 120; + else if (typeof r.VERTICAL_AXIS < "u" && r.axis === r.VERTICAL_AXIS) + this.deltaY = -r.detail / 3; else if (e.type === "wheel") { - const c = e; - c.deltaMode === c.DOM_DELTA_LINE ? pr && !qe ? this.deltaY = -e.deltaY / 3 : this.deltaY = -e.deltaY : this.deltaY = -e.deltaY / 40; + const d = e; + d.deltaMode === d.DOM_DELTA_LINE ? fl && !qe ? this.deltaY = -e.deltaY / 3 : this.deltaY = -e.deltaY : this.deltaY = -e.deltaY / 40; } - if (typeof r.wheelDeltaX < "u") - xh && kn ? this.deltaX = -(r.wheelDeltaX / 120) : n ? this.deltaX = r.wheelDeltaX / (120 * a) : this.deltaX = r.wheelDeltaX / 120; - else if (typeof l.HORIZONTAL_AXIS < "u" && l.axis === l.HORIZONTAL_AXIS) + if (typeof l.wheelDeltaX < "u") + Ch && Jn ? this.deltaX = -(l.wheelDeltaX / 120) : n ? this.deltaX = l.wheelDeltaX / (120 * c) : this.deltaX = l.wheelDeltaX / 120; + else if (typeof r.HORIZONTAL_AXIS < "u" && r.axis === r.HORIZONTAL_AXIS) this.deltaX = -e.detail / 3; else if (e.type === "wheel") { - const c = e; - c.deltaMode === c.DOM_DELTA_LINE ? pr && !qe ? this.deltaX = -e.deltaX / 3 : this.deltaX = -e.deltaX : this.deltaX = -e.deltaX / 40; + const d = e; + d.deltaMode === d.DOM_DELTA_LINE ? fl && !qe ? this.deltaX = -e.deltaX / 3 : this.deltaX = -e.deltaX : this.deltaX = -e.deltaX / 40; } - this.deltaY === 0 && this.deltaX === 0 && e.wheelDelta && (n ? this.deltaY = e.wheelDelta / (120 * a) : this.deltaY = e.wheelDelta / 120); + this.deltaY === 0 && this.deltaX === 0 && e.wheelDelta && (n ? this.deltaY = e.wheelDelta / (120 * c) : this.deltaY = e.wheelDelta / 120); } } preventDefault() { @@ -817,7 +817,7 @@ class am { (e = this.browserEvent) == null || e.stopPropagation(); } } -function ob(s, e) { +function hZ(s, e) { const t = this; let i = !1, n; return function() { @@ -826,8 +826,8 @@ function ob(s, e) { } var nt; (function(s) { - function e(S) { - return S && typeof S == "object" && typeof S[Symbol.iterator] == "function"; + function e(G) { + return G && typeof G == "object" && typeof G[Symbol.iterator] == "function"; } s.is = e; const t = Object.freeze([]); @@ -835,107 +835,107 @@ var nt; return t; } s.empty = i; - function* n(S) { - yield S; + function* n(G) { + yield G; } s.single = n; - function o(S) { - return e(S) ? S : n(S); + function o(G) { + return e(G) ? G : n(G); } s.wrap = o; - function r(S) { - return S || t; - } - s.from = r; - function* l(S) { - for (let L = S.length - 1; L >= 0; L--) - yield S[L]; - } - s.reverse = l; - function a(S) { - return !S || S[Symbol.iterator]().next().done === !0; - } - s.isEmpty = a; - function c(S) { - return S[Symbol.iterator]().next().value; - } - s.first = c; - function d(S, L) { - let x = 0; - for (const Z of S) - if (L(Z, x++)) + function l(G) { + return G || t; + } + s.from = l; + function* r(G) { + for (let X = G.length - 1; X >= 0; X--) + yield G[X]; + } + s.reverse = r; + function c(G) { + return !G || G[Symbol.iterator]().next().done === !0; + } + s.isEmpty = c; + function d(G) { + return G[Symbol.iterator]().next().value; + } + s.first = d; + function a(G, X) { + let L = 0; + for (const S of G) + if (X(S, L++)) return !0; return !1; } - s.some = d; - function h(S, L) { - for (const x of S) - if (L(x)) - return x; + s.some = a; + function h(G, X) { + for (const L of G) + if (X(L)) + return L; } s.find = h; - function* u(S, L) { - for (const x of S) - L(x) && (yield x); + function* u(G, X) { + for (const L of G) + X(L) && (yield L); } s.filter = u; - function* g(S, L) { - let x = 0; - for (const Z of S) - yield L(Z, x++); - } - s.map = g; - function* m(S, L) { - let x = 0; - for (const Z of S) - yield* L(Z, x++); - } - s.flatMap = m; - function* f(...S) { - for (const L of S) - yield* L; - } - s.concat = f; - function b(S, L, x) { - let Z = x; - for (const _ of S) - Z = L(Z, _); - return Z; - } - s.reduce = b; - function* y(S, L, x = S.length) { - for (L < 0 && (L += S.length), x < 0 ? x += S.length : x > S.length && (x = S.length); L < x; L++) - yield S[L]; - } - s.slice = y; - function w(S, L = Number.POSITIVE_INFINITY) { - const x = []; - if (L === 0) - return [x, S]; - const Z = S[Symbol.iterator](); - for (let _ = 0; _ < L; _++) { - const v = Z.next(); - if (v.done) - return [x, s.empty()]; - x.push(v.value); - } - return [x, { [Symbol.iterator]() { - return Z; + function* m(G, X) { + let L = 0; + for (const S of G) + yield X(S, L++); + } + s.map = m; + function* b(G, X) { + let L = 0; + for (const S of G) + yield* X(S, L++); + } + s.flatMap = b; + function* g(...G) { + for (const X of G) + yield* X; + } + s.concat = g; + function Z(G, X, L) { + let S = L; + for (const x of G) + S = X(S, x); + return S; + } + s.reduce = Z; + function* f(G, X, L = G.length) { + for (X < 0 && (X += G.length), L < 0 ? L += G.length : L > G.length && (L = G.length); X < L; X++) + yield G[X]; + } + s.slice = f; + function y(G, X = Number.POSITIVE_INFINITY) { + const L = []; + if (X === 0) + return [L, G]; + const S = G[Symbol.iterator](); + for (let x = 0; x < X; x++) { + const w = S.next(); + if (w.done) + return [L, s.empty()]; + L.push(w.value); + } + return [L, { [Symbol.iterator]() { + return S; } }]; } - s.consume = w; - async function C(S) { - const L = []; - for await (const x of S) - L.push(x); - return Promise.resolve(L); + s.consume = y; + async function W(G) { + const X = []; + for await (const L of G) + X.push(L); + return Promise.resolve(X); } - s.asyncToArray = C; + s.asyncToArray = W; })(nt || (nt = {})); -function __(s) { +function zS(s) { return typeof s == "object" && s !== null && typeof s.dispose == "function" && s.dispose.length === 0; } -function Wt(s) { +function Nt(s) { if (nt.is(s)) { const e = []; for (const t of s) @@ -953,17 +953,17 @@ function Wt(s) { } else if (s) return s.dispose(), s; } -function Yr(...s) { - return Ce(() => Wt(s)); +function Kl(...s) { + return We(() => Nt(s)); } -function Ce(s) { +function We(s) { return { - dispose: ob(() => { + dispose: hZ(() => { s(); }) }; } -const jM = class jM { +const u2 = class u2 { constructor() { this._toDispose = /* @__PURE__ */ new Set(), this._isDisposed = !1; } @@ -987,7 +987,7 @@ const jM = class jM { clear() { if (this._toDispose.size !== 0) try { - Wt(this._toDispose); + Nt(this._toDispose); } finally { this._toDispose.clear(); } @@ -1000,7 +1000,7 @@ const jM = class jM { return e; if (e === this) throw new Error("Cannot register a disposable on itself!"); - return this._isDisposed ? jM.DISABLE_DISPOSED_WARNING || console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack) : this._toDispose.add(e), e; + return this._isDisposed ? u2.DISABLE_DISPOSED_WARNING || console.warn(new Error("Trying to add a disposable to a DisposableStore that has already been disposed of. The added object will be leaked!").stack) : this._toDispose.add(e), e; } /** * Deletes the value from the store, but does not dispose it. @@ -1009,11 +1009,11 @@ const jM = class jM { e && this._toDispose.has(e) && this._toDispose.delete(e); } }; -jM.DISABLE_DISPOSED_WARNING = !1; -let U = jM; -const A9 = class A9 { +u2.DISABLE_DISPOSED_WARNING = !1; +let _ = u2; +const _E = class _E { constructor() { - this._store = new U(), this._store; + this._store = new _(), this._store; } dispose() { this._store.dispose(); @@ -1027,10 +1027,10 @@ const A9 = class A9 { return this._store.add(e); } }; -A9.None = Object.freeze({ dispose() { +_E.None = Object.freeze({ dispose() { } }); -let R = A9; -class fn { +let J = _E; +class Zn { constructor() { this._isDisposed = !1; } @@ -1052,7 +1052,7 @@ class fn { this._isDisposed = !0, (e = this._value) == null || e.dispose(), this._value = void 0; } } -class f6 { +class cq { constructor(e) { this._disposable = e, this._counter = 1; } @@ -1063,14 +1063,14 @@ class f6 { return --this._counter === 0 && this._disposable.dispose(), this; } } -class b6 { +class dq { constructor(e) { this.object = e; } dispose() { } } -class QR { +class Gv { constructor() { this._store = /* @__PURE__ */ new Map(), this._isDisposed = !1; } @@ -1088,7 +1088,7 @@ class QR { clearAndDisposeAll() { if (this._store.size) try { - Wt(this._store.values()); + Nt(this._store.values()); } finally { this._store.clear(); } @@ -1111,29 +1111,29 @@ class QR { return this._store[Symbol.iterator](); } } -var Nc; -let Bi = (Nc = class { +var Md; +let Ui = (Md = class { constructor(e) { - this.element = e, this.next = Nc.Undefined, this.prev = Nc.Undefined; + this.element = e, this.next = Md.Undefined, this.prev = Md.Undefined; } -}, Nc.Undefined = new Nc(void 0), Nc); -class cs { +}, Md.Undefined = new Md(void 0), Md); +class hs { constructor() { - this._first = Bi.Undefined, this._last = Bi.Undefined, this._size = 0; + this._first = Ui.Undefined, this._last = Ui.Undefined, this._size = 0; } get size() { return this._size; } isEmpty() { - return this._first === Bi.Undefined; + return this._first === Ui.Undefined; } clear() { let e = this._first; - for (; e !== Bi.Undefined; ) { + for (; e !== Ui.Undefined; ) { const t = e.next; - e.prev = Bi.Undefined, e.next = Bi.Undefined, e = t; + e.prev = Ui.Undefined, e.next = Ui.Undefined, e = t; } - this._first = Bi.Undefined, this._last = Bi.Undefined, this._size = 0; + this._first = Ui.Undefined, this._last = Ui.Undefined, this._size = 0; } unshift(e) { return this._insert(e, !1); @@ -1142,8 +1142,8 @@ class cs { return this._insert(e, !0); } _insert(e, t) { - const i = new Bi(e); - if (this._first === Bi.Undefined) + const i = new Ui(e); + if (this._first === Ui.Undefined) this._first = i, this._last = i; else if (t) { const o = this._last; @@ -1159,37 +1159,37 @@ class cs { }; } shift() { - if (this._first !== Bi.Undefined) { + if (this._first !== Ui.Undefined) { const e = this._first.element; return this._remove(this._first), e; } } pop() { - if (this._last !== Bi.Undefined) { + if (this._last !== Ui.Undefined) { const e = this._last.element; return this._remove(this._last), e; } } _remove(e) { - if (e.prev !== Bi.Undefined && e.next !== Bi.Undefined) { + if (e.prev !== Ui.Undefined && e.next !== Ui.Undefined) { const t = e.prev; t.next = e.next, e.next.prev = t; - } else e.prev === Bi.Undefined && e.next === Bi.Undefined ? (this._first = Bi.Undefined, this._last = Bi.Undefined) : e.next === Bi.Undefined ? (this._last = this._last.prev, this._last.next = Bi.Undefined) : e.prev === Bi.Undefined && (this._first = this._first.next, this._first.prev = Bi.Undefined); + } else e.prev === Ui.Undefined && e.next === Ui.Undefined ? (this._first = Ui.Undefined, this._last = Ui.Undefined) : e.next === Ui.Undefined ? (this._last = this._last.prev, this._last.next = Ui.Undefined) : e.prev === Ui.Undefined && (this._first = this._first.next, this._first.prev = Ui.Undefined); this._size -= 1; } *[Symbol.iterator]() { let e = this._first; - for (; e !== Bi.Undefined; ) + for (; e !== Ui.Undefined; ) yield e.element, e = e.next; } } -const y6 = globalThis.performance && typeof globalThis.performance.now == "function"; -class on { +const aq = globalThis.performance && typeof globalThis.performance.now == "function"; +class ln { static create(e) { - return new on(e); + return new ln(e); } constructor(e) { - this._now = y6 && e === !1 ? Date.now : globalThis.performance.now.bind(globalThis.performance), this._startTime = this._now(), this._stopTime = -1; + this._now = aq && e === !1 ? Date.now : globalThis.performance.now.bind(globalThis.performance), this._startTime = this._now(), this._stopTime = -1; } stop() { this._stopTime = this._now(); @@ -1203,270 +1203,270 @@ class on { } var se; (function(s) { - s.None = () => R.None; - function e(B, X) { - return u(B, () => { - }, 0, void 0, !0, void 0, X); + s.None = () => J.None; + function e(K, E) { + return u(K, () => { + }, 0, void 0, !0, void 0, E); } s.defer = e; - function t(B) { - return (X, j = null, le) => { - let ue = !1, be; - return be = B((me) => { + function t(K) { + return (E, j = null, re) => { + let ue = !1, Ze; + return Ze = K((be) => { if (!ue) - return be ? be.dispose() : ue = !0, X.call(j, me); - }, null, le), ue && be.dispose(), be; + return Ze ? Ze.dispose() : ue = !0, E.call(j, be); + }, null, re), ue && Ze.dispose(), Ze; }; } s.once = t; - function i(B, X) { - return s.once(s.filter(B, X)); + function i(K, E) { + return s.once(s.filter(K, E)); } s.onceIf = i; - function n(B, X, j) { - return d((le, ue = null, be) => B((me) => le.call(ue, X(me)), null, be), j); + function n(K, E, j) { + return a((re, ue = null, Ze) => K((be) => re.call(ue, E(be)), null, Ze), j); } s.map = n; - function o(B, X, j) { - return d((le, ue = null, be) => B((me) => { - X(me), le.call(ue, me); - }, null, be), j); + function o(K, E, j) { + return a((re, ue = null, Ze) => K((be) => { + E(be), re.call(ue, be); + }, null, Ze), j); } s.forEach = o; - function r(B, X, j) { - return d((le, ue = null, be) => B((me) => X(me) && le.call(ue, me), null, be), j); - } - s.filter = r; - function l(B) { - return B; - } - s.signal = l; - function a(...B) { - return (X, j = null, le) => { - const ue = Yr(...B.map((be) => be((me) => X.call(j, me)))); - return h(ue, le); + function l(K, E, j) { + return a((re, ue = null, Ze) => K((be) => E(be) && re.call(ue, be), null, Ze), j); + } + s.filter = l; + function r(K) { + return K; + } + s.signal = r; + function c(...K) { + return (E, j = null, re) => { + const ue = Kl(...K.map((Ze) => Ze((be) => E.call(j, be)))); + return h(ue, re); }; } - s.any = a; - function c(B, X, j, le) { + s.any = c; + function d(K, E, j, re) { let ue = j; - return n(B, (be) => (ue = X(ue, be), ue), le); + return n(K, (Ze) => (ue = E(ue, Ze), ue), re); } - s.reduce = c; - function d(B, X) { + s.reduce = d; + function a(K, E) { let j; - const le = { + const re = { onWillAddFirstListener() { - j = B(ue.fire, ue); + j = K(ue.fire, ue); }, onDidRemoveLastListener() { j == null || j.dispose(); } - }, ue = new k(le); - return X == null || X.add(ue), ue.event; + }, ue = new k(re); + return E == null || E.add(ue), ue.event; } - function h(B, X) { - return X instanceof Array ? X.push(B) : X && X.add(B), B; + function h(K, E) { + return E instanceof Array ? E.push(K) : E && E.add(K), K; } - function u(B, X, j = 100, le = !1, ue = !1, be, me) { - let Ve, ke, ci, Ee = 0, _t; - const wt = { - leakWarningThreshold: be, + function u(K, E, j = 100, re = !1, ue = !1, Ze, be) { + let Ye, ke, ai, He = 0, xt; + const yt = { + leakWarningThreshold: Ze, onWillAddFirstListener() { - Ve = B((ts) => { - Ee++, ke = X(ke, ts), le && !ci && (_i.fire(ke), ke = void 0), _t = () => { - const Zs = ke; - ke = void 0, ci = void 0, (!le || Ee > 1) && _i.fire(Zs), Ee = 0; - }, typeof j == "number" ? (clearTimeout(ci), ci = setTimeout(_t, j)) : ci === void 0 && (ci = 0, queueMicrotask(_t)); + Ye = K((ns) => { + He++, ke = E(ke, ns), re && !ai && (Ci.fire(ke), ke = void 0), xt = () => { + const Cs = ke; + ke = void 0, ai = void 0, (!re || He > 1) && Ci.fire(Cs), He = 0; + }, typeof j == "number" ? (clearTimeout(ai), ai = setTimeout(xt, j)) : ai === void 0 && (ai = 0, queueMicrotask(xt)); }); }, onWillRemoveListener() { - ue && Ee > 0 && (_t == null || _t()); + ue && He > 0 && (xt == null || xt()); }, onDidRemoveLastListener() { - _t = void 0, Ve.dispose(); + xt = void 0, Ye.dispose(); } - }, _i = new k(wt); - return me == null || me.add(_i), _i.event; + }, Ci = new k(yt); + return be == null || be.add(Ci), Ci.event; } s.debounce = u; - function g(B, X = 0, j) { - return s.debounce(B, (le, ue) => le ? (le.push(ue), le) : [ue], X, void 0, !0, void 0, j); - } - s.accumulate = g; - function m(B, X = (le, ue) => le === ue, j) { - let le = !0, ue; - return r(B, (be) => { - const me = le || !X(be, ue); - return le = !1, ue = be, me; + function m(K, E = 0, j) { + return s.debounce(K, (re, ue) => re ? (re.push(ue), re) : [ue], E, void 0, !0, void 0, j); + } + s.accumulate = m; + function b(K, E = (re, ue) => re === ue, j) { + let re = !0, ue; + return l(K, (Ze) => { + const be = re || !E(Ze, ue); + return re = !1, ue = Ze, be; }, j); } - s.latch = m; - function f(B, X, j) { + s.latch = b; + function g(K, E, j) { return [ - s.filter(B, X, j), - s.filter(B, (le) => !X(le), j) + s.filter(K, E, j), + s.filter(K, (re) => !E(re), j) ]; } - s.split = f; - function b(B, X = !1, j = [], le) { - let ue = j.slice(), be = B((ke) => { - ue ? ue.push(ke) : Ve.fire(ke); + s.split = g; + function Z(K, E = !1, j = [], re) { + let ue = j.slice(), Ze = K((ke) => { + ue ? ue.push(ke) : Ye.fire(ke); }); - le && le.add(be); - const me = () => { - ue == null || ue.forEach((ke) => Ve.fire(ke)), ue = null; - }, Ve = new k({ + re && re.add(Ze); + const be = () => { + ue == null || ue.forEach((ke) => Ye.fire(ke)), ue = null; + }, Ye = new k({ onWillAddFirstListener() { - be || (be = B((ke) => Ve.fire(ke)), le && le.add(be)); + Ze || (Ze = K((ke) => Ye.fire(ke)), re && re.add(Ze)); }, onDidAddFirstListener() { - ue && (X ? setTimeout(me) : me()); + ue && (E ? setTimeout(be) : be()); }, onDidRemoveLastListener() { - be && be.dispose(), be = null; + Ze && Ze.dispose(), Ze = null; } }); - return le && le.add(Ve), Ve.event; + return re && re.add(Ye), Ye.event; } - s.buffer = b; - function y(B, X) { - return (le, ue, be) => { - const me = X(new C()); - return B(function(Ve) { - const ke = me.evaluate(Ve); - ke !== w && le.call(ue, ke); - }, void 0, be); + s.buffer = Z; + function f(K, E) { + return (re, ue, Ze) => { + const be = E(new W()); + return K(function(Ye) { + const ke = be.evaluate(Ye); + ke !== y && re.call(ue, ke); + }, void 0, Ze); }; } - s.chain = y; - const w = Symbol("HaltChainable"); - class C { + s.chain = f; + const y = Symbol("HaltChainable"); + class W { constructor() { this.steps = []; } - map(X) { - return this.steps.push(X), this; + map(E) { + return this.steps.push(E), this; } - forEach(X) { - return this.steps.push((j) => (X(j), j)), this; + forEach(E) { + return this.steps.push((j) => (E(j), j)), this; } - filter(X) { - return this.steps.push((j) => X(j) ? j : w), this; + filter(E) { + return this.steps.push((j) => E(j) ? j : y), this; } - reduce(X, j) { - let le = j; - return this.steps.push((ue) => (le = X(le, ue), le)), this; + reduce(E, j) { + let re = j; + return this.steps.push((ue) => (re = E(re, ue), re)), this; } - latch(X = (j, le) => j === le) { - let j = !0, le; + latch(E = (j, re) => j === re) { + let j = !0, re; return this.steps.push((ue) => { - const be = j || !X(ue, le); - return j = !1, le = ue, be ? ue : w; + const Ze = j || !E(ue, re); + return j = !1, re = ue, Ze ? ue : y; }), this; } - evaluate(X) { + evaluate(E) { for (const j of this.steps) - if (X = j(X), X === w) + if (E = j(E), E === y) break; - return X; + return E; } } - function S(B, X, j = (le) => le) { - const le = (...Ve) => me.fire(j(...Ve)), ue = () => B.on(X, le), be = () => B.removeListener(X, le), me = new k({ onWillAddFirstListener: ue, onDidRemoveLastListener: be }); - return me.event; + function G(K, E, j = (re) => re) { + const re = (...Ye) => be.fire(j(...Ye)), ue = () => K.on(E, re), Ze = () => K.removeListener(E, re), be = new k({ onWillAddFirstListener: ue, onDidRemoveLastListener: Ze }); + return be.event; } - s.fromNodeEventEmitter = S; - function L(B, X, j = (le) => le) { - const le = (...Ve) => me.fire(j(...Ve)), ue = () => B.addEventListener(X, le), be = () => B.removeEventListener(X, le), me = new k({ onWillAddFirstListener: ue, onDidRemoveLastListener: be }); - return me.event; + s.fromNodeEventEmitter = G; + function X(K, E, j = (re) => re) { + const re = (...Ye) => be.fire(j(...Ye)), ue = () => K.addEventListener(E, re), Ze = () => K.removeEventListener(E, re), be = new k({ onWillAddFirstListener: ue, onDidRemoveLastListener: Ze }); + return be.event; } - s.fromDOMEventEmitter = L; - function x(B) { - return new Promise((X) => t(B)(X)); + s.fromDOMEventEmitter = X; + function L(K) { + return new Promise((E) => t(K)(E)); } - s.toPromise = x; - function Z(B) { - const X = new k(); - return B.then((j) => { - X.fire(j); + s.toPromise = L; + function S(K) { + const E = new k(); + return K.then((j) => { + E.fire(j); }, () => { - X.fire(void 0); + E.fire(void 0); }).finally(() => { - X.dispose(); - }), X.event; - } - s.fromPromise = Z; - function _(B, X) { - return B((j) => X.fire(j)); - } - s.forward = _; - function v(B, X, j) { - return X(j), B((le) => X(le)); - } - s.runAndSubscribe = v; - class P { - constructor(X, j) { - this._observable = X, this._counter = 0, this._hasChanged = !1; - const le = { + E.dispose(); + }), E.event; + } + s.fromPromise = S; + function x(K, E) { + return K((j) => E.fire(j)); + } + s.forward = x; + function w(K, E, j) { + return E(j), K((re) => E(re)); + } + s.runAndSubscribe = w; + class A { + constructor(E, j) { + this._observable = E, this._counter = 0, this._hasChanged = !1; + const re = { onWillAddFirstListener: () => { - X.addObserver(this), this._observable.reportChanges(); + E.addObserver(this), this._observable.reportChanges(); }, onDidRemoveLastListener: () => { - X.removeObserver(this); + E.removeObserver(this); } }; - this.emitter = new k(le), j && j.add(this.emitter); + this.emitter = new k(re), j && j.add(this.emitter); } - beginUpdate(X) { + beginUpdate(E) { this._counter++; } - handlePossibleChange(X) { + handlePossibleChange(E) { } - handleChange(X, j) { + handleChange(E, j) { this._hasChanged = !0; } - endUpdate(X) { + endUpdate(E) { this._counter--, this._counter === 0 && (this._observable.reportChanges(), this._hasChanged && (this._hasChanged = !1, this.emitter.fire(this._observable.get()))); } } - function E(B, X) { - return new P(B, X).emitter.event; + function H(K, E) { + return new A(K, E).emitter.event; } - s.fromObservable = E; - function Y(B) { - return (X, j, le) => { - let ue = 0, be = !1; - const me = { + s.fromObservable = H; + function F(K) { + return (E, j, re) => { + let ue = 0, Ze = !1; + const be = { beginUpdate() { ue++; }, endUpdate() { - ue--, ue === 0 && (B.reportChanges(), be && (be = !1, X.call(j))); + ue--, ue === 0 && (K.reportChanges(), Ze && (Ze = !1, E.call(j))); }, handlePossibleChange() { }, handleChange() { - be = !0; + Ze = !0; } }; - B.addObserver(me), B.reportChanges(); - const Ve = { + K.addObserver(be), K.reportChanges(); + const Ye = { dispose() { - B.removeObserver(me); + K.removeObserver(be); } }; - return le instanceof U ? le.add(Ve) : Array.isArray(le) && le.push(Ve), Ve; + return re instanceof _ ? re.add(Ye) : Array.isArray(re) && re.push(Ye), Ye; }; } - s.fromObservableLight = Y; + s.fromObservableLight = F; })(se || (se = {})); -const nf = class nf { +const dg = class dg { constructor(e) { - this.listenerCount = 0, this.invocationCount = 0, this.elapsedOverall = 0, this.durations = [], this.name = `${e}_${nf._idPool++}`, nf.all.add(this); + this.listenerCount = 0, this.invocationCount = 0, this.elapsedOverall = 0, this.durations = [], this.name = `${e}_${dg._idPool++}`, dg.all.add(this); } start(e) { - this._stopWatch = new on(), this.listenerCount = e; + this._stopWatch = new ln(), this.listenerCount = e; } stop() { if (this._stopWatch) { @@ -1475,10 +1475,10 @@ const nf = class nf { } } }; -nf.all = /* @__PURE__ */ new Set(), nf._idPool = 0; -let b2 = nf, w6 = -1; -const qM = class qM { - constructor(e, t, i = (qM._idPool++).toString(16).padStart(3, "0")) { +dg.all = /* @__PURE__ */ new Set(), dg._idPool = 0; +let HN = dg, hq = -1; +const m2 = class m2 { + constructor(e, t, i = (m2._idPool++).toString(16).padStart(3, "0")) { this._errorHandler = e, this.threshold = t, this.name = i, this._warnCountdown = 0; } dispose() { @@ -1493,10 +1493,10 @@ const qM = class qM { const n = this._stacks.get(e.value) || 0; if (this._stacks.set(e.value, n + 1), this._warnCountdown -= 1, this._warnCountdown <= 0) { this._warnCountdown = i * 0.5; - const [o, r] = this.getMostFrequentStack(), l = `[${this.name}] potential listener LEAK detected, having ${t} listeners already. MOST frequent listener (${r}):`; - console.warn(l), console.warn(o); - const a = new C6(l, o); - this._errorHandler(a); + const [o, l] = this.getMostFrequentStack(), r = `[${this.name}] potential listener LEAK detected, having ${t} listeners already. MOST frequent listener (${l}):`; + console.warn(r), console.warn(o); + const c = new uq(r, o); + this._errorHandler(c); } return () => { const o = this._stacks.get(e.value) || 0; @@ -1512,12 +1512,12 @@ const qM = class qM { return e; } }; -qM._idPool = 1; -let y2 = qM; -class jR { +m2._idPool = 1; +let EN = m2; +class Xv { static create() { const e = new Error(); - return new jR(e.stack ?? ""); + return new Xv(e.stack ?? ""); } constructor(e) { this.value = e; @@ -1528,26 +1528,26 @@ class jR { `)); } } -class C6 extends Error { +class uq extends Error { constructor(e, t) { super(e), this.name = "ListenerLeakError", this.stack = t; } } -class S6 extends Error { +class mq extends Error { constructor(e, t) { super(e), this.name = "ListenerRefusalError", this.stack = t; } } -class mN { +class NC { constructor(e) { this.value = e; } } -const L6 = 2; +const bq = 2; let k = class { constructor(e) { var t, i, n, o; - this._size = 0, this._options = e, this._leakageMon = (t = this._options) != null && t.leakWarningThreshold ? new y2((e == null ? void 0 : e.onListenerError) ?? De, ((i = this._options) == null ? void 0 : i.leakWarningThreshold) ?? w6) : void 0, this._perfMon = (n = this._options) != null && n._profName ? new b2(this._options._profName) : void 0, this._deliveryQueue = (o = this._options) == null ? void 0 : o.deliveryQueue; + this._size = 0, this._options = e, this._leakageMon = (t = this._options) != null && t.leakWarningThreshold ? new EN((e == null ? void 0 : e.onListenerError) ?? Me, ((i = this._options) == null ? void 0 : i.leakWarningThreshold) ?? hq) : void 0, this._perfMon = (n = this._options) != null && n._profName ? new HN(this._options._profName) : void 0, this._deliveryQueue = (o = this._options) == null ? void 0 : o.deliveryQueue; } dispose() { var e, t, i, n; @@ -1559,31 +1559,31 @@ let k = class { */ get event() { return this._event ?? (this._event = (e, t, i) => { - var l, a, c, d, h; + var r, c, d, a, h; if (this._leakageMon && this._size > this._leakageMon.threshold ** 2) { const u = `[${this._leakageMon.name}] REFUSES to accept new listeners because it exceeded its threshold by far (${this._size} vs ${this._leakageMon.threshold})`; console.warn(u); - const g = this._leakageMon.getMostFrequentStack() ?? ["UNKNOWN stack", -1], m = new S6(`${u}. HINT: Stack shows most frequent listener (${g[1]}-times)`, g[0]); - return (((l = this._options) == null ? void 0 : l.onListenerError) || De)(m), R.None; + const m = this._leakageMon.getMostFrequentStack() ?? ["UNKNOWN stack", -1], b = new mq(`${u}. HINT: Stack shows most frequent listener (${m[1]}-times)`, m[0]); + return (((r = this._options) == null ? void 0 : r.onListenerError) || Me)(b), J.None; } if (this._disposed) - return R.None; + return J.None; t && (e = e.bind(t)); - const n = new mN(e); + const n = new NC(e); let o; - this._leakageMon && this._size >= Math.ceil(this._leakageMon.threshold * 0.2) && (n.stack = jR.create(), o = this._leakageMon.check(n.stack, this._size + 1)), this._listeners ? this._listeners instanceof mN ? (this._deliveryQueue ?? (this._deliveryQueue = new SH()), this._listeners = [this._listeners, n]) : this._listeners.push(n) : ((c = (a = this._options) == null ? void 0 : a.onWillAddFirstListener) == null || c.call(a, this), this._listeners = n, (h = (d = this._options) == null ? void 0 : d.onDidAddFirstListener) == null || h.call(d, this)), this._size++; - const r = Ce(() => { + this._leakageMon && this._size >= Math.ceil(this._leakageMon.threshold * 0.2) && (n.stack = Xv.create(), o = this._leakageMon.check(n.stack, this._size + 1)), this._listeners ? this._listeners instanceof NC ? (this._deliveryQueue ?? (this._deliveryQueue = new nB()), this._listeners = [this._listeners, n]) : this._listeners.push(n) : ((d = (c = this._options) == null ? void 0 : c.onWillAddFirstListener) == null || d.call(c, this), this._listeners = n, (h = (a = this._options) == null ? void 0 : a.onDidAddFirstListener) == null || h.call(a, this)), this._size++; + const l = We(() => { o == null || o(), this._removeListener(n); }); - return i instanceof U ? i.add(r) : Array.isArray(i) && i.push(r), r; + return i instanceof _ ? i.add(l) : Array.isArray(i) && i.push(l), l; }), this._event; } _removeListener(e) { - var o, r, l, a; - if ((r = (o = this._options) == null ? void 0 : o.onWillRemoveListener) == null || r.call(o, this), !this._listeners) + var o, l, r, c; + if ((l = (o = this._options) == null ? void 0 : o.onWillRemoveListener) == null || l.call(o, this), !this._listeners) return; if (this._size === 1) { - this._listeners = void 0, (a = (l = this._options) == null ? void 0 : l.onDidRemoveLastListener) == null || a.call(l, this), this._size = 0; + this._listeners = void 0, (c = (r = this._options) == null ? void 0 : r.onDidRemoveLastListener) == null || c.call(r, this), this._size = 0; return; } const t = this._listeners, i = t.indexOf(e); @@ -1591,18 +1591,18 @@ let k = class { throw console.log("disposed?", this._disposed), console.log("size?", this._size), console.log("arr?", JSON.stringify(this._listeners)), new Error("Attempted to dispose unknown listener"); this._size--, t[i] = void 0; const n = this._deliveryQueue.current === this; - if (this._size * L6 <= t.length) { - let c = 0; - for (let d = 0; d < t.length; d++) - t[d] ? t[c++] = t[d] : n && (this._deliveryQueue.end--, c < this._deliveryQueue.i && this._deliveryQueue.i--); - t.length = c; + if (this._size * bq <= t.length) { + let d = 0; + for (let a = 0; a < t.length; a++) + t[a] ? t[d++] = t[a] : n && (this._deliveryQueue.end--, d < this._deliveryQueue.i && this._deliveryQueue.i--); + t.length = d; } } _deliver(e, t) { var n; if (!e) return; - const i = ((n = this._options) == null ? void 0 : n.onListenerError) || De; + const i = ((n = this._options) == null ? void 0 : n.onListenerError) || Me; if (!i) { e.value(t); return; @@ -1626,11 +1626,11 @@ let k = class { */ fire(e) { var t, i, n, o; - if ((t = this._deliveryQueue) != null && t.current && (this._deliverQueue(this._deliveryQueue), (i = this._perfMon) == null || i.stop()), (n = this._perfMon) == null || n.start(this._size), this._listeners) if (this._listeners instanceof mN) + if ((t = this._deliveryQueue) != null && t.current && (this._deliverQueue(this._deliveryQueue), (i = this._perfMon) == null || i.stop()), (n = this._perfMon) == null || n.start(this._size), this._listeners) if (this._listeners instanceof NC) this._deliver(this._listeners, e); else { - const r = this._deliveryQueue; - r.enqueue(this, e, this._listeners.length), this._deliverQueue(r); + const l = this._deliveryQueue; + l.enqueue(this, e, this._listeners.length), this._deliverQueue(l); } (o = this._perfMon) == null || o.stop(); } @@ -1638,8 +1638,8 @@ let k = class { return this._size > 0; } }; -const A6 = () => new SH(); -class SH { +const pq = () => new nB(); +class nB { constructor() { this.i = -1, this.end = 0; } @@ -1650,9 +1650,9 @@ class SH { this.i = this.end, this.current = void 0, this.value = void 0; } } -class cm extends k { +class bb extends k { constructor(e) { - super(e), this._isPaused = 0, this._eventQueue = new cs(), this._mergeFn = e == null ? void 0 : e.merge; + super(e), this._isPaused = 0, this._eventQueue = new hs(), this._mergeFn = e == null ? void 0 : e.merge; } pause() { this._isPaused++; @@ -1672,7 +1672,7 @@ class cm extends k { this._size && (this._isPaused !== 0 ? this._eventQueue.push(e) : super.fire(e)); } } -class LH extends cm { +class sB extends bb { constructor(e) { super(e), this._delay = e.delay ?? 100; } @@ -1682,7 +1682,7 @@ class LH extends cm { }, this._delay)), super.fire(e); } } -class x6 extends k { +class gq extends k { constructor(e) { super(e), this._queuedEvents = [], this._mergeFn = e == null ? void 0 : e.merge; } @@ -1692,7 +1692,7 @@ class x6 extends k { })); } } -class M6 { +class Zq { constructor() { this.hasListeners = !1, this.events = [], this.emitter = new k({ onWillAddFirstListener: () => this.onFirstListenerAdd(), @@ -1704,7 +1704,7 @@ class M6 { } add(e) { const t = { event: e, listener: null }; - return this.events.push(t), this.hasListeners && this.hook(t), Ce(ob(() => { + return this.events.push(t), this.hasListeners && this.hook(t), We(hZ(() => { this.hasListeners && this.unhook(t); const n = this.events.indexOf(t); this.events.splice(n, 1); @@ -1731,26 +1731,26 @@ class M6 { this.events = []; } } -class aC { +class GG { constructor() { this.data = []; } wrapEvent(e, t, i) { - return (n, o, r) => e((l) => { - const a = this.data[this.data.length - 1]; + return (n, o, l) => e((r) => { + const c = this.data[this.data.length - 1]; if (!t) { - a ? a.buffers.push(() => n.call(o, l)) : n.call(o, l); + c ? c.buffers.push(() => n.call(o, r)) : n.call(o, r); return; } - const c = a; - if (!c) { - n.call(o, t(i, l)); + const d = c; + if (!d) { + n.call(o, t(i, r)); return; } - c.items ?? (c.items = []), c.items.push(l), c.buffers.length === 0 && a.buffers.push(() => { - c.reducedResult ?? (c.reducedResult = i ? c.items.reduce(t, i) : c.items.reduce(t)), n.call(o, c.reducedResult); + d.items ?? (d.items = []), d.items.push(r), d.buffers.length === 0 && c.buffers.push(() => { + d.reducedResult ?? (d.reducedResult = i ? d.items.reduce(t, i) : d.items.reduce(t)), n.call(o, d.reducedResult); }); - }, void 0, r); + }, void 0, l); } bufferEvents(e) { const t = { buffers: new Array() }; @@ -1759,9 +1759,9 @@ class aC { return this.data.pop(), t.buffers.forEach((n) => n()), i; } } -class F9 { +class hD { constructor() { - this.listening = !1, this.inputEvent = se.None, this.inputEventListener = R.None, this.emitter = new k({ + this.listening = !1, this.inputEvent = se.None, this.inputEventListener = J.None, this.emitter = new k({ onDidAddFirstListener: () => { this.listening = !0, this.inputEventListener = this.inputEvent(this.emitter.fire, this.emitter); }, @@ -1777,26 +1777,26 @@ class F9 { this.inputEventListener.dispose(), this.emitter.dispose(); } } -const AH = Object.freeze(function(s, e) { +const oB = Object.freeze(function(s, e) { const t = setTimeout(s.bind(e), 0); return { dispose() { clearTimeout(t); } }; }); -var Ye; +var Fe; (function(s) { function e(t) { - return t === s.None || t === s.Cancelled || t instanceof dL ? !0 : !t || typeof t != "object" ? !1 : typeof t.isCancellationRequested == "boolean" && typeof t.onCancellationRequested == "function"; + return t === s.None || t === s.Cancelled || t instanceof IX ? !0 : !t || typeof t != "object" ? !1 : typeof t.isCancellationRequested == "boolean" && typeof t.onCancellationRequested == "function"; } s.isCancellationToken = e, s.None = Object.freeze({ isCancellationRequested: !1, onCancellationRequested: se.None }), s.Cancelled = Object.freeze({ isCancellationRequested: !0, - onCancellationRequested: AH + onCancellationRequested: oB }); -})(Ye || (Ye = {})); -class dL { +})(Fe || (Fe = {})); +class IX { constructor() { this._isCancelled = !1, this._emitter = null; } @@ -1807,46 +1807,46 @@ class dL { return this._isCancelled; } get onCancellationRequested() { - return this._isCancelled ? AH : (this._emitter || (this._emitter = new k()), this._emitter.event); + return this._isCancelled ? oB : (this._emitter || (this._emitter = new k()), this._emitter.event); } dispose() { this._emitter && (this._emitter.dispose(), this._emitter = null); } } -let mi = class { +let pi = class { constructor(e) { this._token = void 0, this._parentListener = void 0, this._parentListener = e && e.onCancellationRequested(this.cancel, this); } get token() { - return this._token || (this._token = new dL()), this._token; + return this._token || (this._token = new IX()), this._token; } cancel() { - this._token ? this._token instanceof dL && this._token.cancel() : this._token = Ye.Cancelled; + this._token ? this._token instanceof IX && this._token.cancel() : this._token = Fe.Cancelled; } dispose(e = !1) { var t; - e && this.cancel(), (t = this._parentListener) == null || t.dispose(), this._token ? this._token instanceof dL && this._token.dispose() : this._token = Ye.None; + e && this.cancel(), (t = this._parentListener) == null || t.dispose(), this._token ? this._token instanceof IX && this._token.dispose() : this._token = Fe.None; } }; -function w2(s) { - const e = new mi(); +function DN(s) { + const e = new pi(); return s.add({ dispose() { e.cancel(); } }), e.token; } -const xH = Symbol("MicrotaskDelay"); -function C2(s) { +const lB = Symbol("MicrotaskDelay"); +function FN(s) { return !!s && typeof s.then == "function"; } -function Ui(s) { - const e = new mi(), t = s(e.token), i = new Promise((n, o) => { - const r = e.token.onCancellationRequested(() => { - r.dispose(), o(new Pr()); +function Qi(s) { + const e = new pi(), t = s(e.token), i = new Promise((n, o) => { + const l = e.token.onCancellationRequested(() => { + l.dispose(), o(new Pl()); }); - Promise.resolve(t).then((l) => { - r.dispose(), e.dispose(), n(l); - }, (l) => { - r.dispose(), e.dispose(), o(l); + Promise.resolve(t).then((r) => { + l.dispose(), e.dispose(), n(r); + }, (r) => { + l.dispose(), e.dispose(), o(r); }); }); return new class { @@ -1864,7 +1864,7 @@ function Ui(s) { } }(); } -function cC(s, e, t) { +function XG(s, e, t) { return new Promise((i, n) => { const o = e.onCancellationRequested(() => { o.dispose(), i(t); @@ -1872,7 +1872,7 @@ function cC(s, e, t) { s.then(i, n).finally(() => o.dispose()); }); } -class Z6 { +class fq { constructor() { this.isDisposed = !1, this.activePromise = null, this.queuedPromise = null, this.queuedPromiseFactory = null; } @@ -1907,7 +1907,7 @@ class Z6 { this.isDisposed = !0; } } -const _6 = (s, e) => { +const yq = (s, e) => { let t = !0; const i = setTimeout(() => { t = !1, e(); @@ -1918,7 +1918,7 @@ const _6 = (s, e) => { clearTimeout(i), t = !1; } }; -}, I6 = (s) => { +}, Wq = (s) => { let e = !0; return queueMicrotask(() => { e && (e = !1, s()); @@ -1929,7 +1929,7 @@ const _6 = (s, e) => { } }; }; -class fr { +class yl { constructor(e) { this.defaultDelay = e, this.deferred = null, this.completionPromise = null, this.doResolve = null, this.doReject = null, this.task = null; } @@ -1946,7 +1946,7 @@ class fr { var n; this.deferred = null, (n = this.doResolve) == null || n.call(this, null); }; - return this.deferred = t === xH ? I6(i) : _6(t, i), this.completionPromise; + return this.deferred = t === lB ? Wq(i) : yq(t, i), this.completionPromise; } isTriggered() { var e; @@ -1954,7 +1954,7 @@ class fr { } cancel() { var e; - this.cancelTimeout(), this.completionPromise && ((e = this.doReject) == null || e.call(this, new Pr()), this.completionPromise = null); + this.cancelTimeout(), this.completionPromise && ((e = this.doReject) == null || e.call(this, new Pl()), this.completionPromise = null); } cancelTimeout() { var e; @@ -1964,9 +1964,9 @@ class fr { this.cancel(); } } -class MH { +class rB { constructor(e) { - this.delayer = new fr(e), this.throttler = new Z6(); + this.delayer = new yl(e), this.throttler = new fq(); } trigger(e, t) { return this.delayer.trigger(() => this.throttler.queue(e), t); @@ -1978,34 +1978,34 @@ class MH { this.delayer.dispose(), this.throttler.dispose(); } } -function Zh(s, e) { +function Nh(s, e) { return e ? new Promise((t, i) => { const n = setTimeout(() => { o.dispose(), t(); }, s), o = e.onCancellationRequested(() => { - clearTimeout(n), o.dispose(), i(new Pr()); + clearTimeout(n), o.dispose(), i(new Pl()); }); - }) : Ui((t) => Zh(s, t)); + }) : Qi((t) => Nh(s, t)); } -function _h(s, e = 0, t) { +function wh(s, e = 0, t) { const i = setTimeout(() => { s(), t && n.dispose(); - }, e), n = Ce(() => { + }, e), n = We(() => { clearTimeout(i), t == null || t.deleteAndLeak(n); }); return t == null || t.add(n), n; } -function qR(s, e = (i) => !!i, t = null) { +function Vv(s, e = (i) => !!i, t = null) { let i = 0; const n = s.length, o = () => { if (i >= n) return Promise.resolve(t); - const r = s[i++]; - return Promise.resolve(r()).then((a) => e(a) ? Promise.resolve(a) : o()); + const l = s[i++]; + return Promise.resolve(l()).then((c) => e(c) ? Promise.resolve(c) : o()); }; return o(); } -class qr { +class tr { constructor(e, t) { this._isDisposed = !1, this._token = -1, typeof e == "function" && typeof t == "number" && this.setIfNotSet(e, t); } @@ -2017,20 +2017,20 @@ class qr { } cancelAndSet(e, t) { if (this._isDisposed) - throw new mt("Calling 'cancelAndSet' on a disposed TimeoutTimer"); + throw new bt("Calling 'cancelAndSet' on a disposed TimeoutTimer"); this.cancel(), this._token = setTimeout(() => { this._token = -1, e(); }, t); } setIfNotSet(e, t) { if (this._isDisposed) - throw new mt("Calling 'setIfNotSet' on a disposed TimeoutTimer"); + throw new bt("Calling 'setIfNotSet' on a disposed TimeoutTimer"); this._token === -1 && (this._token = setTimeout(() => { this._token = -1, e(); }, t)); } } -class $R { +class Lv { constructor() { this.disposable = void 0, this.isDisposed = !1; } @@ -2040,12 +2040,12 @@ class $R { } cancelAndSet(e, t, i = globalThis) { if (this.isDisposed) - throw new mt("Calling 'cancelAndSet' on a disposed IntervalTimer"); + throw new bt("Calling 'cancelAndSet' on a disposed IntervalTimer"); this.cancel(); const n = i.setInterval(() => { e(); }, t); - this.disposable = Ce(() => { + this.disposable = We(() => { i.clearInterval(n), this.disposable = void 0; }); } @@ -2053,7 +2053,7 @@ class $R { this.cancel(), this.isDisposed = !0; } } -class Zt { +class St { constructor(e, t) { this.timeoutToken = -1, this.runner = e, this.timeout = t, this.timeoutHandler = this.onTimeout.bind(this); } @@ -2095,10 +2095,10 @@ class Zt { (e = this.runner) == null || e.call(this); } } -let ZH, Zy; +let cB, Jf; (function() { - typeof globalThis.requestIdleCallback != "function" || typeof globalThis.cancelIdleCallback != "function" ? Zy = (s, e) => { - fH(() => { + typeof globalThis.requestIdleCallback != "function" || typeof globalThis.cancelIdleCallback != "function" ? Jf = (s, e) => { + qP(() => { if (t) return; const i = Date.now() + 15; @@ -2115,7 +2115,7 @@ let ZH, Zy; t || (t = !0); } }; - } : Zy = (s, e, t) => { + } : Jf = (s, e, t) => { const i = s.requestIdleCallback(e, typeof t == "number" ? { timeout: t } : void 0); let n = !1; return { @@ -2123,9 +2123,9 @@ let ZH, Zy; n || (n = !0, s.cancelIdleCallback(i)); } }; - }, ZH = (s) => Zy(globalThis, s); + }, cB = (s) => Jf(globalThis, s); })(); -class _H { +class dB { constructor(e, t) { this._didRun = !1, this._executor = () => { try { @@ -2135,7 +2135,7 @@ class _H { } finally { this._didRun = !0; } - }, this._handle = Zy(e, () => this._executor()); + }, this._handle = Jf(e, () => this._executor()); } dispose() { this._handle.dispose(); @@ -2149,12 +2149,12 @@ class _H { return this._didRun; } } -class N6 extends _H { +class Gq extends dB { constructor(e) { super(globalThis, e); } } -class dC { +class VG { get isRejected() { var e; return ((e = this.outcome) == null ? void 0 : e.outcome) === 1; @@ -2178,15 +2178,15 @@ class dC { }); } cancel() { - return this.error(new Pr()); + return this.error(new Pl()); } } -var S2; +var zN; (function(s) { async function e(i) { let n; - const o = await Promise.all(i.map((r) => r.then((l) => l, (l) => { - n || (n = l); + const o = await Promise.all(i.map((l) => l.then((r) => r, (r) => { + n || (n = r); }))); if (typeof n < "u") throw n; @@ -2197,31 +2197,31 @@ var S2; return new Promise(async (n, o) => { try { await i(n, o); - } catch (r) { - o(r); + } catch (l) { + o(l); } }); } s.withAsyncBody = t; -})(S2 || (S2 = {})); -const Qs = class Qs { +})(zN || (zN = {})); +const qs = class qs { static fromArray(e) { - return new Qs((t) => { + return new qs((t) => { t.emitMany(e); }); } static fromPromise(e) { - return new Qs(async (t) => { + return new qs(async (t) => { t.emitMany(await e); }); } static fromPromises(e) { - return new Qs(async (t) => { + return new qs(async (t) => { await Promise.all(e.map(async (i) => t.emitOne(await i))); }); } static merge(e) { - return new Qs(async (t) => { + return new qs(async (t) => { await Promise.all(e.map(async (i) => { for await (const n of i) t.emitOne(n); @@ -2265,28 +2265,28 @@ const Qs = class Qs { }; } static map(e, t) { - return new Qs(async (i) => { + return new qs(async (i) => { for await (const n of e) i.emitOne(t(n)); }); } map(e) { - return Qs.map(this, e); + return qs.map(this, e); } static filter(e, t) { - return new Qs(async (i) => { + return new qs(async (i) => { for await (const n of e) t(n) && i.emitOne(n); }); } filter(e) { - return Qs.filter(this, e); + return qs.filter(this, e); } static coalesce(e) { - return Qs.filter(e, (t) => !!t); + return qs.filter(e, (t) => !!t); } coalesce() { - return Qs.coalesce(this); + return qs.coalesce(this); } static async toPromise(e) { const t = []; @@ -2295,7 +2295,7 @@ const Qs = class Qs { return t; } toPromise() { - return Qs.toPromise(this); + return qs.toPromise(this); } /** * The value will be appended at the end. @@ -2332,9 +2332,9 @@ const Qs = class Qs { this._state === 0 && (this._state = 2, this._error = e, this._onStateChanged.fire()); } }; -Qs.EMPTY = Qs.fromArray([]); -let Ro = Qs; -class W6 extends Ro { +qs.EMPTY = qs.fromArray([]); +let Eo = qs; +class Xq extends Eo { constructor(e, t) { super(t), this._source = e; } @@ -2342,11 +2342,11 @@ class W6 extends Ro { this._source.cancel(); } } -function v6(s) { - const e = new mi(), t = s(e.token); - return new W6(e, async (i) => { +function Vq(s) { + const e = new pi(), t = s(e.token); + return new Xq(e, async (i) => { const n = e.token.onCancellationRequested(() => { - n.dispose(), e.dispose(), i.reject(new Pr()); + n.dispose(), e.dispose(), i.reject(new Pl()); }); try { for await (const o of t) { @@ -2362,118 +2362,118 @@ function v6(s) { } /*! @license DOMPurify 3.1.7 | (c) Cure53 and other contributors | Released under the Apache license 2.0 and Mozilla Public License 2.0 | github.com/cure53/DOMPurify/blob/3.1.7/LICENSE */ const { - entries: IH, - setPrototypeOf: Y9, - isFrozen: T6, - getPrototypeOf: D6, - getOwnPropertyDescriptor: V6 + entries: aB, + setPrototypeOf: uD, + isFrozen: Lq, + getPrototypeOf: Iq, + getOwnPropertyDescriptor: Sq } = Object; let { - freeze: mo, - seal: Br, - create: NH + freeze: go, + seal: Bl, + create: hB } = Object, { - apply: L2, - construct: A2 + apply: AN, + construct: KN } = typeof Reflect < "u" && Reflect; -mo || (mo = function(e) { +go || (go = function(e) { return e; }); -Br || (Br = function(e) { +Bl || (Bl = function(e) { return e; }); -L2 || (L2 = function(e, t, i) { +AN || (AN = function(e, t, i) { return e.apply(t, i); }); -A2 || (A2 = function(e, t) { +KN || (KN = function(e, t) { return new e(...t); }); -const QC = br(Array.prototype.forEach), z9 = br(Array.prototype.pop), _0 = br(Array.prototype.push), hL = br(String.prototype.toLowerCase), pN = br(String.prototype.toString), P9 = br(String.prototype.match), I0 = br(String.prototype.replace), k6 = br(String.prototype.indexOf), G6 = br(String.prototype.trim), al = br(Object.prototype.hasOwnProperty), Js = br(RegExp.prototype.test), N0 = R6(TypeError); -function br(s) { +const d1 = Wl(Array.prototype.forEach), mD = Wl(Array.prototype.pop), Y0 = Wl(Array.prototype.push), SX = Wl(String.prototype.toLowerCase), wC = Wl(String.prototype.toString), bD = Wl(String.prototype.match), k0 = Wl(String.prototype.replace), xq = Wl(String.prototype.indexOf), Cq = Wl(String.prototype.trim), hr = Wl(Object.prototype.hasOwnProperty), Qs = Wl(RegExp.prototype.test), v0 = Rq(TypeError); +function Wl(s) { return function(e) { for (var t = arguments.length, i = new Array(t > 1 ? t - 1 : 0), n = 1; n < t; n++) i[n - 1] = arguments[n]; - return L2(s, e, i); + return AN(s, e, i); }; } -function R6(s) { +function Rq(s) { return function() { for (var e = arguments.length, t = new Array(e), i = 0; i < e; i++) t[i] = arguments[i]; - return A2(s, t); + return KN(s, t); }; } function Tt(s, e) { - let t = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : hL; - Y9 && Y9(s, null); + let t = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : SX; + uD && uD(s, null); let i = e.length; for (; i--; ) { let n = e[i]; if (typeof n == "string") { const o = t(n); - o !== n && (T6(e) || (e[i] = o), n = o); + o !== n && (Lq(e) || (e[i] = o), n = o); } s[n] = !0; } return s; } -function E6(s) { +function Nq(s) { for (let e = 0; e < s.length; e++) - al(s, e) || (s[e] = null); + hr(s, e) || (s[e] = null); return s; } -function Cu(s) { - const e = NH(null); - for (const [t, i] of IH(s)) - al(s, t) && (Array.isArray(i) ? e[t] = E6(i) : i && typeof i == "object" && i.constructor === Object ? e[t] = Cu(i) : e[t] = i); +function Iu(s) { + const e = hB(null); + for (const [t, i] of aB(s)) + hr(s, t) && (Array.isArray(i) ? e[t] = Nq(i) : i && typeof i == "object" && i.constructor === Object ? e[t] = Iu(i) : e[t] = i); return e; } -function W0(s, e) { +function J0(s, e) { for (; s !== null; ) { - const i = V6(s, e); + const i = Sq(s, e); if (i) { if (i.get) - return br(i.get); + return Wl(i.get); if (typeof i.value == "function") - return br(i.value); + return Wl(i.value); } - s = D6(s); + s = Iq(s); } function t() { return null; } return t; } -const B9 = mo(["a", "abbr", "acronym", "address", "area", "article", "aside", "audio", "b", "bdi", "bdo", "big", "blink", "blockquote", "body", "br", "button", "canvas", "caption", "center", "cite", "code", "col", "colgroup", "content", "data", "datalist", "dd", "decorator", "del", "details", "dfn", "dialog", "dir", "div", "dl", "dt", "element", "em", "fieldset", "figcaption", "figure", "font", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html", "i", "img", "input", "ins", "kbd", "label", "legend", "li", "main", "map", "mark", "marquee", "menu", "menuitem", "meter", "nav", "nobr", "ol", "optgroup", "option", "output", "p", "picture", "pre", "progress", "q", "rp", "rt", "ruby", "s", "samp", "section", "select", "shadow", "small", "source", "spacer", "span", "strike", "strong", "style", "sub", "summary", "sup", "table", "tbody", "td", "template", "textarea", "tfoot", "th", "thead", "time", "tr", "track", "tt", "u", "ul", "var", "video", "wbr"]), fN = mo(["svg", "a", "altglyph", "altglyphdef", "altglyphitem", "animatecolor", "animatemotion", "animatetransform", "circle", "clippath", "defs", "desc", "ellipse", "filter", "font", "g", "glyph", "glyphref", "hkern", "image", "line", "lineargradient", "marker", "mask", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialgradient", "rect", "stop", "style", "switch", "symbol", "text", "textpath", "title", "tref", "tspan", "view", "vkern"]), bN = mo(["feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence"]), X6 = mo(["animate", "color-profile", "cursor", "discard", "font-face", "font-face-format", "font-face-name", "font-face-src", "font-face-uri", "foreignobject", "hatch", "hatchpath", "mesh", "meshgradient", "meshpatch", "meshrow", "missing-glyph", "script", "set", "solidcolor", "unknown", "use"]), yN = mo(["math", "menclose", "merror", "mfenced", "mfrac", "mglyph", "mi", "mlabeledtr", "mmultiscripts", "mn", "mo", "mover", "mpadded", "mphantom", "mroot", "mrow", "ms", "mspace", "msqrt", "mstyle", "msub", "msup", "msubsup", "mtable", "mtd", "mtext", "mtr", "munder", "munderover", "mprescripts"]), F6 = mo(["maction", "maligngroup", "malignmark", "mlongdiv", "mscarries", "mscarry", "msgroup", "mstack", "msline", "msrow", "semantics", "annotation", "annotation-xml", "mprescripts", "none"]), O9 = mo(["#text"]), H9 = mo(["accept", "action", "align", "alt", "autocapitalize", "autocomplete", "autopictureinpicture", "autoplay", "background", "bgcolor", "border", "capture", "cellpadding", "cellspacing", "checked", "cite", "class", "clear", "color", "cols", "colspan", "controls", "controlslist", "coords", "crossorigin", "datetime", "decoding", "default", "dir", "disabled", "disablepictureinpicture", "disableremoteplayback", "download", "draggable", "enctype", "enterkeyhint", "face", "for", "headers", "height", "hidden", "high", "href", "hreflang", "id", "inputmode", "integrity", "ismap", "kind", "label", "lang", "list", "loading", "loop", "low", "max", "maxlength", "media", "method", "min", "minlength", "multiple", "muted", "name", "nonce", "noshade", "novalidate", "nowrap", "open", "optimum", "pattern", "placeholder", "playsinline", "popover", "popovertarget", "popovertargetaction", "poster", "preload", "pubdate", "radiogroup", "readonly", "rel", "required", "rev", "reversed", "role", "rows", "rowspan", "spellcheck", "scope", "selected", "shape", "size", "sizes", "span", "srclang", "start", "src", "srcset", "step", "style", "summary", "tabindex", "title", "translate", "type", "usemap", "valign", "value", "width", "wrap", "xmlns", "slot"]), wN = mo(["accent-height", "accumulate", "additive", "alignment-baseline", "amplitude", "ascent", "attributename", "attributetype", "azimuth", "basefrequency", "baseline-shift", "begin", "bias", "by", "class", "clip", "clippathunits", "clip-path", "clip-rule", "color", "color-interpolation", "color-interpolation-filters", "color-profile", "color-rendering", "cx", "cy", "d", "dx", "dy", "diffuseconstant", "direction", "display", "divisor", "dur", "edgemode", "elevation", "end", "exponent", "fill", "fill-opacity", "fill-rule", "filter", "filterunits", "flood-color", "flood-opacity", "font-family", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-variant", "font-weight", "fx", "fy", "g1", "g2", "glyph-name", "glyphref", "gradientunits", "gradienttransform", "height", "href", "id", "image-rendering", "in", "in2", "intercept", "k", "k1", "k2", "k3", "k4", "kerning", "keypoints", "keysplines", "keytimes", "lang", "lengthadjust", "letter-spacing", "kernelmatrix", "kernelunitlength", "lighting-color", "local", "marker-end", "marker-mid", "marker-start", "markerheight", "markerunits", "markerwidth", "maskcontentunits", "maskunits", "max", "mask", "media", "method", "mode", "min", "name", "numoctaves", "offset", "operator", "opacity", "order", "orient", "orientation", "origin", "overflow", "paint-order", "path", "pathlength", "patterncontentunits", "patterntransform", "patternunits", "points", "preservealpha", "preserveaspectratio", "primitiveunits", "r", "rx", "ry", "radius", "refx", "refy", "repeatcount", "repeatdur", "restart", "result", "rotate", "scale", "seed", "shape-rendering", "slope", "specularconstant", "specularexponent", "spreadmethod", "startoffset", "stddeviation", "stitchtiles", "stop-color", "stop-opacity", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke", "stroke-width", "style", "surfacescale", "systemlanguage", "tabindex", "tablevalues", "targetx", "targety", "transform", "transform-origin", "text-anchor", "text-decoration", "text-rendering", "textlength", "type", "u1", "u2", "unicode", "values", "viewbox", "visibility", "version", "vert-adv-y", "vert-origin-x", "vert-origin-y", "width", "word-spacing", "wrap", "writing-mode", "xchannelselector", "ychannelselector", "x", "x1", "x2", "xmlns", "y", "y1", "y2", "z", "zoomandpan"]), J9 = mo(["accent", "accentunder", "align", "bevelled", "close", "columnsalign", "columnlines", "columnspan", "denomalign", "depth", "dir", "display", "displaystyle", "encoding", "fence", "frame", "height", "href", "id", "largeop", "length", "linethickness", "lspace", "lquote", "mathbackground", "mathcolor", "mathsize", "mathvariant", "maxsize", "minsize", "movablelimits", "notation", "numalign", "open", "rowalign", "rowlines", "rowspacing", "rowspan", "rspace", "rquote", "scriptlevel", "scriptminsize", "scriptsizemultiplier", "selection", "separator", "separators", "stretchy", "subscriptshift", "supscriptshift", "symmetric", "voffset", "width", "xmlns"]), jC = mo(["xlink:href", "xml:id", "xlink:title", "xml:space", "xmlns:xlink"]), Y6 = Br(/\{\{[\w\W]*|[\w\W]*\}\}/gm), z6 = Br(/<%[\w\W]*|[\w\W]*%>/gm), P6 = Br(/\${[\w\W]*}/gm), B6 = Br(/^data-[\-\w.\u00B7-\uFFFF]/), O6 = Br(/^aria-[\-\w]+$/), WH = Br( +const pD = go(["a", "abbr", "acronym", "address", "area", "article", "aside", "audio", "b", "bdi", "bdo", "big", "blink", "blockquote", "body", "br", "button", "canvas", "caption", "center", "cite", "code", "col", "colgroup", "content", "data", "datalist", "dd", "decorator", "del", "details", "dfn", "dialog", "dir", "div", "dl", "dt", "element", "em", "fieldset", "figcaption", "figure", "font", "footer", "form", "h1", "h2", "h3", "h4", "h5", "h6", "head", "header", "hgroup", "hr", "html", "i", "img", "input", "ins", "kbd", "label", "legend", "li", "main", "map", "mark", "marquee", "menu", "menuitem", "meter", "nav", "nobr", "ol", "optgroup", "option", "output", "p", "picture", "pre", "progress", "q", "rp", "rt", "ruby", "s", "samp", "section", "select", "shadow", "small", "source", "spacer", "span", "strike", "strong", "style", "sub", "summary", "sup", "table", "tbody", "td", "template", "textarea", "tfoot", "th", "thead", "time", "tr", "track", "tt", "u", "ul", "var", "video", "wbr"]), TC = go(["svg", "a", "altglyph", "altglyphdef", "altglyphitem", "animatecolor", "animatemotion", "animatetransform", "circle", "clippath", "defs", "desc", "ellipse", "filter", "font", "g", "glyph", "glyphref", "hkern", "image", "line", "lineargradient", "marker", "mask", "metadata", "mpath", "path", "pattern", "polygon", "polyline", "radialgradient", "rect", "stop", "style", "switch", "symbol", "text", "textpath", "title", "tref", "tspan", "view", "vkern"]), MC = go(["feBlend", "feColorMatrix", "feComponentTransfer", "feComposite", "feConvolveMatrix", "feDiffuseLighting", "feDisplacementMap", "feDistantLight", "feDropShadow", "feFlood", "feFuncA", "feFuncB", "feFuncG", "feFuncR", "feGaussianBlur", "feImage", "feMerge", "feMergeNode", "feMorphology", "feOffset", "fePointLight", "feSpecularLighting", "feSpotLight", "feTile", "feTurbulence"]), wq = go(["animate", "color-profile", "cursor", "discard", "font-face", "font-face-format", "font-face-name", "font-face-src", "font-face-uri", "foreignobject", "hatch", "hatchpath", "mesh", "meshgradient", "meshpatch", "meshrow", "missing-glyph", "script", "set", "solidcolor", "unknown", "use"]), YC = go(["math", "menclose", "merror", "mfenced", "mfrac", "mglyph", "mi", "mlabeledtr", "mmultiscripts", "mn", "mo", "mover", "mpadded", "mphantom", "mroot", "mrow", "ms", "mspace", "msqrt", "mstyle", "msub", "msup", "msubsup", "mtable", "mtd", "mtext", "mtr", "munder", "munderover", "mprescripts"]), Tq = go(["maction", "maligngroup", "malignmark", "mlongdiv", "mscarries", "mscarry", "msgroup", "mstack", "msline", "msrow", "semantics", "annotation", "annotation-xml", "mprescripts", "none"]), gD = go(["#text"]), ZD = go(["accept", "action", "align", "alt", "autocapitalize", "autocomplete", "autopictureinpicture", "autoplay", "background", "bgcolor", "border", "capture", "cellpadding", "cellspacing", "checked", "cite", "class", "clear", "color", "cols", "colspan", "controls", "controlslist", "coords", "crossorigin", "datetime", "decoding", "default", "dir", "disabled", "disablepictureinpicture", "disableremoteplayback", "download", "draggable", "enctype", "enterkeyhint", "face", "for", "headers", "height", "hidden", "high", "href", "hreflang", "id", "inputmode", "integrity", "ismap", "kind", "label", "lang", "list", "loading", "loop", "low", "max", "maxlength", "media", "method", "min", "minlength", "multiple", "muted", "name", "nonce", "noshade", "novalidate", "nowrap", "open", "optimum", "pattern", "placeholder", "playsinline", "popover", "popovertarget", "popovertargetaction", "poster", "preload", "pubdate", "radiogroup", "readonly", "rel", "required", "rev", "reversed", "role", "rows", "rowspan", "spellcheck", "scope", "selected", "shape", "size", "sizes", "span", "srclang", "start", "src", "srcset", "step", "style", "summary", "tabindex", "title", "translate", "type", "usemap", "valign", "value", "width", "wrap", "xmlns", "slot"]), kC = go(["accent-height", "accumulate", "additive", "alignment-baseline", "amplitude", "ascent", "attributename", "attributetype", "azimuth", "basefrequency", "baseline-shift", "begin", "bias", "by", "class", "clip", "clippathunits", "clip-path", "clip-rule", "color", "color-interpolation", "color-interpolation-filters", "color-profile", "color-rendering", "cx", "cy", "d", "dx", "dy", "diffuseconstant", "direction", "display", "divisor", "dur", "edgemode", "elevation", "end", "exponent", "fill", "fill-opacity", "fill-rule", "filter", "filterunits", "flood-color", "flood-opacity", "font-family", "font-size", "font-size-adjust", "font-stretch", "font-style", "font-variant", "font-weight", "fx", "fy", "g1", "g2", "glyph-name", "glyphref", "gradientunits", "gradienttransform", "height", "href", "id", "image-rendering", "in", "in2", "intercept", "k", "k1", "k2", "k3", "k4", "kerning", "keypoints", "keysplines", "keytimes", "lang", "lengthadjust", "letter-spacing", "kernelmatrix", "kernelunitlength", "lighting-color", "local", "marker-end", "marker-mid", "marker-start", "markerheight", "markerunits", "markerwidth", "maskcontentunits", "maskunits", "max", "mask", "media", "method", "mode", "min", "name", "numoctaves", "offset", "operator", "opacity", "order", "orient", "orientation", "origin", "overflow", "paint-order", "path", "pathlength", "patterncontentunits", "patterntransform", "patternunits", "points", "preservealpha", "preserveaspectratio", "primitiveunits", "r", "rx", "ry", "radius", "refx", "refy", "repeatcount", "repeatdur", "restart", "result", "rotate", "scale", "seed", "shape-rendering", "slope", "specularconstant", "specularexponent", "spreadmethod", "startoffset", "stddeviation", "stitchtiles", "stop-color", "stop-opacity", "stroke-dasharray", "stroke-dashoffset", "stroke-linecap", "stroke-linejoin", "stroke-miterlimit", "stroke-opacity", "stroke", "stroke-width", "style", "surfacescale", "systemlanguage", "tabindex", "tablevalues", "targetx", "targety", "transform", "transform-origin", "text-anchor", "text-decoration", "text-rendering", "textlength", "type", "u1", "u2", "unicode", "values", "viewbox", "visibility", "version", "vert-adv-y", "vert-origin-x", "vert-origin-y", "width", "word-spacing", "wrap", "writing-mode", "xchannelselector", "ychannelselector", "x", "x1", "x2", "xmlns", "y", "y1", "y2", "z", "zoomandpan"]), fD = go(["accent", "accentunder", "align", "bevelled", "close", "columnsalign", "columnlines", "columnspan", "denomalign", "depth", "dir", "display", "displaystyle", "encoding", "fence", "frame", "height", "href", "id", "largeop", "length", "linethickness", "lspace", "lquote", "mathbackground", "mathcolor", "mathsize", "mathvariant", "maxsize", "minsize", "movablelimits", "notation", "numalign", "open", "rowalign", "rowlines", "rowspacing", "rowspan", "rspace", "rquote", "scriptlevel", "scriptminsize", "scriptsizemultiplier", "selection", "separator", "separators", "stretchy", "subscriptshift", "supscriptshift", "symmetric", "voffset", "width", "xmlns"]), a1 = go(["xlink:href", "xml:id", "xlink:title", "xml:space", "xmlns:xlink"]), Mq = Bl(/\{\{[\w\W]*|[\w\W]*\}\}/gm), Yq = Bl(/<%[\w\W]*|[\w\W]*%>/gm), kq = Bl(/\${[\w\W]*}/gm), vq = Bl(/^data-[\-\w.\u00B7-\uFFFF]/), Jq = Bl(/^aria-[\-\w]+$/), uB = Bl( /^(?:(?:(?:f|ht)tps?|mailto|tel|callto|sms|cid|xmpp):|[^a-z]|[a-z+.\-]+(?:[^a-z+.\-:]|$))/i // eslint-disable-line no-useless-escape -), H6 = Br(/^(?:\w+script|data):/i), J6 = Br( +), Hq = Bl(/^(?:\w+script|data):/i), Eq = Bl( /[\u0000-\u0020\u00A0\u1680\u180E\u2000-\u2029\u205F\u3000]/g // eslint-disable-line no-control-regex -), vH = Br(/^html$/i), U6 = Br(/^[a-z][.\w]*(-[.\w]+)+$/i); -var U9 = /* @__PURE__ */ Object.freeze({ +), mB = Bl(/^html$/i), Dq = Bl(/^[a-z][.\w]*(-[.\w]+)+$/i); +var yD = /* @__PURE__ */ Object.freeze({ __proto__: null, - MUSTACHE_EXPR: Y6, - ERB_EXPR: z6, - TMPLIT_EXPR: P6, - DATA_ATTR: B6, - ARIA_ATTR: O6, - IS_ALLOWED_URI: WH, - IS_SCRIPT_OR_DATA: H6, - ATTR_WHITESPACE: J6, - DOCTYPE_NAME: vH, - CUSTOM_ELEMENT: U6 + MUSTACHE_EXPR: Mq, + ERB_EXPR: Yq, + TMPLIT_EXPR: kq, + DATA_ATTR: vq, + ARIA_ATTR: Jq, + IS_ALLOWED_URI: uB, + IS_SCRIPT_OR_DATA: Hq, + ATTR_WHITESPACE: Eq, + DOCTYPE_NAME: mB, + CUSTOM_ELEMENT: Dq }); -const v0 = { +const H0 = { element: 1, text: 3, // Deprecated progressingInstruction: 7, comment: 8, document: 9 -}, K6 = function() { +}, Fq = function() { return typeof window > "u" ? null : window; -}, Q6 = function(e, t) { +}, zq = function(e, t) { if (typeof e != "object" || typeof e.createPolicy != "function") return null; let i = null; @@ -2482,68 +2482,68 @@ const v0 = { const o = "dompurify" + (i ? "#" + i : ""); try { return e.createPolicy(o, { - createHTML(r) { - return r; + createHTML(l) { + return l; }, - createScriptURL(r) { - return r; + createScriptURL(l) { + return l; } }); } catch { return console.warn("TrustedTypes policy " + o + " could not be created."), null; } }; -function TH() { - let s = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : K6(); - const e = (Ue) => TH(Ue); - if (e.version = "3.1.7", e.removed = [], !s || !s.document || s.document.nodeType !== v0.document) +function bB() { + let s = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : Fq(); + const e = (_e) => bB(_e); + if (e.version = "3.1.7", e.removed = [], !s || !s.document || s.document.nodeType !== H0.document) return e.isSupported = !1, e; let { document: t } = s; const i = t, n = i.currentScript, { DocumentFragment: o, - HTMLTemplateElement: r, - Node: l, - Element: a, - NodeFilter: c, - NamedNodeMap: d = s.NamedNodeMap || s.MozNamedAttrMap, + HTMLTemplateElement: l, + Node: r, + Element: c, + NodeFilter: d, + NamedNodeMap: a = s.NamedNodeMap || s.MozNamedAttrMap, HTMLFormElement: h, DOMParser: u, - trustedTypes: g - } = s, m = a.prototype, f = W0(m, "cloneNode"), b = W0(m, "remove"), y = W0(m, "nextSibling"), w = W0(m, "childNodes"), C = W0(m, "parentNode"); - if (typeof r == "function") { - const Ue = t.createElement("template"); - Ue.content && Ue.content.ownerDocument && (t = Ue.content.ownerDocument); + trustedTypes: m + } = s, b = c.prototype, g = J0(b, "cloneNode"), Z = J0(b, "remove"), f = J0(b, "nextSibling"), y = J0(b, "childNodes"), W = J0(b, "parentNode"); + if (typeof l == "function") { + const _e = t.createElement("template"); + _e.content && _e.content.ownerDocument && (t = _e.content.ownerDocument); } - let S, L = ""; + let G, X = ""; const { - implementation: x, - createNodeIterator: Z, - createDocumentFragment: _, - getElementsByTagName: v + implementation: L, + createNodeIterator: S, + createDocumentFragment: x, + getElementsByTagName: w } = t, { - importNode: P + importNode: A } = i; - let E = {}; - e.isSupported = typeof IH == "function" && typeof C == "function" && x && x.createHTMLDocument !== void 0; + let H = {}; + e.isSupported = typeof aB == "function" && typeof W == "function" && L && L.createHTMLDocument !== void 0; const { - MUSTACHE_EXPR: Y, - ERB_EXPR: B, - TMPLIT_EXPR: X, + MUSTACHE_EXPR: F, + ERB_EXPR: K, + TMPLIT_EXPR: E, DATA_ATTR: j, - ARIA_ATTR: le, + ARIA_ATTR: re, IS_SCRIPT_OR_DATA: ue, - ATTR_WHITESPACE: be, - CUSTOM_ELEMENT: me - } = U9; + ATTR_WHITESPACE: Ze, + CUSTOM_ELEMENT: be + } = yD; let { - IS_ALLOWED_URI: Ve - } = U9, ke = null; - const ci = Tt({}, [...B9, ...fN, ...bN, ...yN, ...O9]); - let Ee = null; - const _t = Tt({}, [...H9, ...wN, ...J9, ...jC]); - let wt = Object.seal(NH(null, { + IS_ALLOWED_URI: Ye + } = yD, ke = null; + const ai = Tt({}, [...pD, ...TC, ...MC, ...YC, ...gD]); + let He = null; + const xt = Tt({}, [...ZD, ...kC, ...fD, ...a1]); + let yt = Object.seal(hB(null, { tagNameCheck: { writable: !0, configurable: !1, @@ -2562,178 +2562,178 @@ function TH() { enumerable: !0, value: !1 } - })), _i = null, ts = null, Zs = !0, xr = !0, So = !1, su = !0, Fi = !1, Mr = !0, Ja = !1, L0 = !1, A0 = !1, dd = !1, Qm = !1, jm = !1, ou = !0, BC = !1; - const OC = "user-content-"; - let qm = !0, ru = !1, zl = {}, hd = null; - const $m = Tt({}, ["annotation-xml", "audio", "colgroup", "desc", "foreignobject", "head", "iframe", "math", "mi", "mn", "mo", "ms", "mtext", "noembed", "noframes", "noscript", "plaintext", "script", "style", "svg", "template", "thead", "title", "video", "xmp"]); - let HC = null; - const lu = Tt({}, ["audio", "video", "img", "source", "image", "track"]); - let Ua = null; - const Lo = Tt({}, ["alt", "class", "for", "id", "label", "name", "pattern", "placeholder", "role", "summary", "title", "value", "style", "xmlns"]), Pl = "http://www.w3.org/1998/Math/MathML", Ka = "http://www.w3.org/2000/svg", ln = "http://www.w3.org/1999/xhtml"; - let qo = ln, ep = !1, tl = null; - const ti = Tt({}, [Pl, Ka, ln], pN); - let au = null; - const cN = ["application/xhtml+xml", "text/html"], dN = "text/html"; - let bn = null, ud = null; - const hN = t.createElement("form"), JC = function(J) { - return J instanceof RegExp || J instanceof Function; - }, x0 = function() { - let J = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; - if (!(ud && ud === J)) { - if ((!J || typeof J != "object") && (J = {}), J = Cu(J), au = // eslint-disable-next-line unicorn/prefer-includes - cN.indexOf(J.PARSER_MEDIA_TYPE) === -1 ? dN : J.PARSER_MEDIA_TYPE, bn = au === "application/xhtml+xml" ? pN : hL, ke = al(J, "ALLOWED_TAGS") ? Tt({}, J.ALLOWED_TAGS, bn) : ci, Ee = al(J, "ALLOWED_ATTR") ? Tt({}, J.ALLOWED_ATTR, bn) : _t, tl = al(J, "ALLOWED_NAMESPACES") ? Tt({}, J.ALLOWED_NAMESPACES, pN) : ti, Ua = al(J, "ADD_URI_SAFE_ATTR") ? Tt( - Cu(Lo), + })), Ci = null, ns = null, Cs = !0, xl = !0, Vo = !1, cu = !0, Fi = !1, Cl = !0, jc = !1, R0 = !1, N0 = !1, ba = !1, tp = !1, ip = !1, du = !0, n1 = !1; + const s1 = "user-content-"; + let np = !0, au = !1, Pr = {}, pa = null; + const sp = Tt({}, ["annotation-xml", "audio", "colgroup", "desc", "foreignobject", "head", "iframe", "math", "mi", "mn", "mo", "ms", "mtext", "noembed", "noframes", "noscript", "plaintext", "script", "style", "svg", "template", "thead", "title", "video", "xmp"]); + let o1 = null; + const hu = Tt({}, ["audio", "video", "img", "source", "image", "track"]); + let qc = null; + const Lo = Tt({}, ["alt", "class", "for", "id", "label", "name", "pattern", "placeholder", "role", "summary", "title", "value", "style", "xmlns"]), Br = "http://www.w3.org/1998/Math/MathML", $c = "http://www.w3.org/2000/svg", cn = "http://www.w3.org/1999/xhtml"; + let el = cn, op = !1, sr = null; + const ii = Tt({}, [Br, $c, cn], wC); + let uu = null; + const IC = ["application/xhtml+xml", "text/html"], SC = "text/html"; + let fn = null, ga = null; + const xC = t.createElement("form"), l1 = function(B) { + return B instanceof RegExp || B instanceof Function; + }, w0 = function() { + let B = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; + if (!(ga && ga === B)) { + if ((!B || typeof B != "object") && (B = {}), B = Iu(B), uu = // eslint-disable-next-line unicorn/prefer-includes + IC.indexOf(B.PARSER_MEDIA_TYPE) === -1 ? SC : B.PARSER_MEDIA_TYPE, fn = uu === "application/xhtml+xml" ? wC : SX, ke = hr(B, "ALLOWED_TAGS") ? Tt({}, B.ALLOWED_TAGS, fn) : ai, He = hr(B, "ALLOWED_ATTR") ? Tt({}, B.ALLOWED_ATTR, fn) : xt, sr = hr(B, "ALLOWED_NAMESPACES") ? Tt({}, B.ALLOWED_NAMESPACES, wC) : ii, qc = hr(B, "ADD_URI_SAFE_ATTR") ? Tt( + Iu(Lo), // eslint-disable-line indent - J.ADD_URI_SAFE_ATTR, + B.ADD_URI_SAFE_ATTR, // eslint-disable-line indent - bn + fn // eslint-disable-line indent - ) : Lo, HC = al(J, "ADD_DATA_URI_TAGS") ? Tt( - Cu(lu), + ) : Lo, o1 = hr(B, "ADD_DATA_URI_TAGS") ? Tt( + Iu(hu), // eslint-disable-line indent - J.ADD_DATA_URI_TAGS, + B.ADD_DATA_URI_TAGS, // eslint-disable-line indent - bn + fn // eslint-disable-line indent - ) : lu, hd = al(J, "FORBID_CONTENTS") ? Tt({}, J.FORBID_CONTENTS, bn) : $m, _i = al(J, "FORBID_TAGS") ? Tt({}, J.FORBID_TAGS, bn) : {}, ts = al(J, "FORBID_ATTR") ? Tt({}, J.FORBID_ATTR, bn) : {}, zl = al(J, "USE_PROFILES") ? J.USE_PROFILES : !1, Zs = J.ALLOW_ARIA_ATTR !== !1, xr = J.ALLOW_DATA_ATTR !== !1, So = J.ALLOW_UNKNOWN_PROTOCOLS || !1, su = J.ALLOW_SELF_CLOSE_IN_ATTR !== !1, Fi = J.SAFE_FOR_TEMPLATES || !1, Mr = J.SAFE_FOR_XML !== !1, Ja = J.WHOLE_DOCUMENT || !1, dd = J.RETURN_DOM || !1, Qm = J.RETURN_DOM_FRAGMENT || !1, jm = J.RETURN_TRUSTED_TYPE || !1, A0 = J.FORCE_BODY || !1, ou = J.SANITIZE_DOM !== !1, BC = J.SANITIZE_NAMED_PROPS || !1, qm = J.KEEP_CONTENT !== !1, ru = J.IN_PLACE || !1, Ve = J.ALLOWED_URI_REGEXP || WH, qo = J.NAMESPACE || ln, wt = J.CUSTOM_ELEMENT_HANDLING || {}, J.CUSTOM_ELEMENT_HANDLING && JC(J.CUSTOM_ELEMENT_HANDLING.tagNameCheck) && (wt.tagNameCheck = J.CUSTOM_ELEMENT_HANDLING.tagNameCheck), J.CUSTOM_ELEMENT_HANDLING && JC(J.CUSTOM_ELEMENT_HANDLING.attributeNameCheck) && (wt.attributeNameCheck = J.CUSTOM_ELEMENT_HANDLING.attributeNameCheck), J.CUSTOM_ELEMENT_HANDLING && typeof J.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements == "boolean" && (wt.allowCustomizedBuiltInElements = J.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements), Fi && (xr = !1), Qm && (dd = !0), zl && (ke = Tt({}, O9), Ee = [], zl.html === !0 && (Tt(ke, B9), Tt(Ee, H9)), zl.svg === !0 && (Tt(ke, fN), Tt(Ee, wN), Tt(Ee, jC)), zl.svgFilters === !0 && (Tt(ke, bN), Tt(Ee, wN), Tt(Ee, jC)), zl.mathMl === !0 && (Tt(ke, yN), Tt(Ee, J9), Tt(Ee, jC))), J.ADD_TAGS && (ke === ci && (ke = Cu(ke)), Tt(ke, J.ADD_TAGS, bn)), J.ADD_ATTR && (Ee === _t && (Ee = Cu(Ee)), Tt(Ee, J.ADD_ATTR, bn)), J.ADD_URI_SAFE_ATTR && Tt(Ua, J.ADD_URI_SAFE_ATTR, bn), J.FORBID_CONTENTS && (hd === $m && (hd = Cu(hd)), Tt(hd, J.FORBID_CONTENTS, bn)), qm && (ke["#text"] = !0), Ja && Tt(ke, ["html", "head", "body"]), ke.table && (Tt(ke, ["tbody"]), delete _i.tbody), J.TRUSTED_TYPES_POLICY) { - if (typeof J.TRUSTED_TYPES_POLICY.createHTML != "function") - throw N0('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.'); - if (typeof J.TRUSTED_TYPES_POLICY.createScriptURL != "function") - throw N0('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.'); - S = J.TRUSTED_TYPES_POLICY, L = S.createHTML(""); + ) : hu, pa = hr(B, "FORBID_CONTENTS") ? Tt({}, B.FORBID_CONTENTS, fn) : sp, Ci = hr(B, "FORBID_TAGS") ? Tt({}, B.FORBID_TAGS, fn) : {}, ns = hr(B, "FORBID_ATTR") ? Tt({}, B.FORBID_ATTR, fn) : {}, Pr = hr(B, "USE_PROFILES") ? B.USE_PROFILES : !1, Cs = B.ALLOW_ARIA_ATTR !== !1, xl = B.ALLOW_DATA_ATTR !== !1, Vo = B.ALLOW_UNKNOWN_PROTOCOLS || !1, cu = B.ALLOW_SELF_CLOSE_IN_ATTR !== !1, Fi = B.SAFE_FOR_TEMPLATES || !1, Cl = B.SAFE_FOR_XML !== !1, jc = B.WHOLE_DOCUMENT || !1, ba = B.RETURN_DOM || !1, tp = B.RETURN_DOM_FRAGMENT || !1, ip = B.RETURN_TRUSTED_TYPE || !1, N0 = B.FORCE_BODY || !1, du = B.SANITIZE_DOM !== !1, n1 = B.SANITIZE_NAMED_PROPS || !1, np = B.KEEP_CONTENT !== !1, au = B.IN_PLACE || !1, Ye = B.ALLOWED_URI_REGEXP || uB, el = B.NAMESPACE || cn, yt = B.CUSTOM_ELEMENT_HANDLING || {}, B.CUSTOM_ELEMENT_HANDLING && l1(B.CUSTOM_ELEMENT_HANDLING.tagNameCheck) && (yt.tagNameCheck = B.CUSTOM_ELEMENT_HANDLING.tagNameCheck), B.CUSTOM_ELEMENT_HANDLING && l1(B.CUSTOM_ELEMENT_HANDLING.attributeNameCheck) && (yt.attributeNameCheck = B.CUSTOM_ELEMENT_HANDLING.attributeNameCheck), B.CUSTOM_ELEMENT_HANDLING && typeof B.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements == "boolean" && (yt.allowCustomizedBuiltInElements = B.CUSTOM_ELEMENT_HANDLING.allowCustomizedBuiltInElements), Fi && (xl = !1), tp && (ba = !0), Pr && (ke = Tt({}, gD), He = [], Pr.html === !0 && (Tt(ke, pD), Tt(He, ZD)), Pr.svg === !0 && (Tt(ke, TC), Tt(He, kC), Tt(He, a1)), Pr.svgFilters === !0 && (Tt(ke, MC), Tt(He, kC), Tt(He, a1)), Pr.mathMl === !0 && (Tt(ke, YC), Tt(He, fD), Tt(He, a1))), B.ADD_TAGS && (ke === ai && (ke = Iu(ke)), Tt(ke, B.ADD_TAGS, fn)), B.ADD_ATTR && (He === xt && (He = Iu(He)), Tt(He, B.ADD_ATTR, fn)), B.ADD_URI_SAFE_ATTR && Tt(qc, B.ADD_URI_SAFE_ATTR, fn), B.FORBID_CONTENTS && (pa === sp && (pa = Iu(pa)), Tt(pa, B.FORBID_CONTENTS, fn)), np && (ke["#text"] = !0), jc && Tt(ke, ["html", "head", "body"]), ke.table && (Tt(ke, ["tbody"]), delete Ci.tbody), B.TRUSTED_TYPES_POLICY) { + if (typeof B.TRUSTED_TYPES_POLICY.createHTML != "function") + throw v0('TRUSTED_TYPES_POLICY configuration option must provide a "createHTML" hook.'); + if (typeof B.TRUSTED_TYPES_POLICY.createScriptURL != "function") + throw v0('TRUSTED_TYPES_POLICY configuration option must provide a "createScriptURL" hook.'); + G = B.TRUSTED_TYPES_POLICY, X = G.createHTML(""); } else - S === void 0 && (S = Q6(g, n)), S !== null && typeof L == "string" && (L = S.createHTML("")); - mo && mo(J), ud = J; + G === void 0 && (G = zq(m, n)), G !== null && typeof X == "string" && (X = G.createHTML("")); + go && go(B), ga = B; } - }, at = Tt({}, ["mi", "mo", "mn", "ms", "mtext"]), T = Tt({}, ["annotation-xml"]), D = Tt({}, ["title", "style", "font", "a", "script"]), G = Tt({}, [...fN, ...bN, ...X6]), F = Tt({}, [...yN, ...F6]), O = function(J) { - let Ae = C(J); - (!Ae || !Ae.tagName) && (Ae = { - namespaceURI: qo, + }, ct = Tt({}, ["mi", "mo", "mn", "ms", "mtext"]), T = Tt({}, ["annotation-xml"]), M = Tt({}, ["title", "style", "font", "a", "script"]), v = Tt({}, [...TC, ...MC, ...wq]), D = Tt({}, [...YC, ...Tq]), U = function(B) { + let Ve = W(B); + (!Ve || !Ve.tagName) && (Ve = { + namespaceURI: el, tagName: "template" }); - const Fe = hL(J.tagName), ki = hL(Ae.tagName); - return tl[J.namespaceURI] ? J.namespaceURI === Ka ? Ae.namespaceURI === ln ? Fe === "svg" : Ae.namespaceURI === Pl ? Fe === "svg" && (ki === "annotation-xml" || at[ki]) : !!G[Fe] : J.namespaceURI === Pl ? Ae.namespaceURI === ln ? Fe === "math" : Ae.namespaceURI === Ka ? Fe === "math" && T[ki] : !!F[Fe] : J.namespaceURI === ln ? Ae.namespaceURI === Ka && !T[ki] || Ae.namespaceURI === Pl && !at[ki] ? !1 : !F[Fe] && (D[Fe] || !G[Fe]) : !!(au === "application/xhtml+xml" && tl[J.namespaceURI]) : !1; - }, q = function(J) { - _0(e.removed, { - element: J + const De = SX(B.tagName), Ji = SX(Ve.tagName); + return sr[B.namespaceURI] ? B.namespaceURI === $c ? Ve.namespaceURI === cn ? De === "svg" : Ve.namespaceURI === Br ? De === "svg" && (Ji === "annotation-xml" || ct[Ji]) : !!v[De] : B.namespaceURI === Br ? Ve.namespaceURI === cn ? De === "math" : Ve.namespaceURI === $c ? De === "math" && T[Ji] : !!D[De] : B.namespaceURI === cn ? Ve.namespaceURI === $c && !T[Ji] || Ve.namespaceURI === Br && !ct[Ji] ? !1 : !D[De] && (M[De] || !v[De]) : !!(uu === "application/xhtml+xml" && sr[B.namespaceURI]) : !1; + }, q = function(B) { + Y0(e.removed, { + element: B }); try { - C(J).removeChild(J); + W(B).removeChild(B); } catch { - b(J); + Z(B); } - }, re = function(J, Ae) { + }, le = function(B, Ve) { try { - _0(e.removed, { - attribute: Ae.getAttributeNode(J), - from: Ae + Y0(e.removed, { + attribute: Ve.getAttributeNode(B), + from: Ve }); } catch { - _0(e.removed, { + Y0(e.removed, { attribute: null, - from: Ae + from: Ve }); } - if (Ae.removeAttribute(J), J === "is" && !Ee[J]) - if (dd || Qm) + if (Ve.removeAttribute(B), B === "is" && !He[B]) + if (ba || tp) try { - q(Ae); + q(Ve); } catch { } else try { - Ae.setAttribute(J, ""); + Ve.setAttribute(B, ""); } catch { } - }, Me = function(J) { - let Ae = null, Fe = null; - if (A0) - J = "" + J; + }, Ie = function(B) { + let Ve = null, De = null; + if (N0) + B = "" + B; else { - const is = P9(J, /^[\r\n\t ]+/); - Fe = is && is[0]; + const ss = bD(B, /^[\r\n\t ]+/); + De = ss && ss[0]; } - au === "application/xhtml+xml" && qo === ln && (J = '' + J + ""); - const ki = S ? S.createHTML(J) : J; - if (qo === ln) + uu === "application/xhtml+xml" && el === cn && (B = '' + B + ""); + const Ji = G ? G.createHTML(B) : B; + if (el === cn) try { - Ae = new u().parseFromString(ki, au); + Ve = new u().parseFromString(Ji, uu); } catch { } - if (!Ae || !Ae.documentElement) { - Ae = x.createDocument(qo, "template", null); + if (!Ve || !Ve.documentElement) { + Ve = L.createDocument(el, "template", null); try { - Ae.documentElement.innerHTML = ep ? L : ki; + Ve.documentElement.innerHTML = op ? X : Ji; } catch { } } - const _s = Ae.body || Ae.documentElement; - return J && Fe && _s.insertBefore(t.createTextNode(Fe), _s.childNodes[0] || null), qo === ln ? v.call(Ae, Ja ? "html" : "body")[0] : Ja ? Ae.documentElement : _s; - }, ve = function(J) { - return Z.call( - J.ownerDocument || J, - J, + const Rs = Ve.body || Ve.documentElement; + return B && De && Rs.insertBefore(t.createTextNode(De), Rs.childNodes[0] || null), el === cn ? w.call(Ve, jc ? "html" : "body")[0] : jc ? Ve.documentElement : Rs; + }, we = function(B) { + return S.call( + B.ownerDocument || B, + B, // eslint-disable-next-line no-bitwise - c.SHOW_ELEMENT | c.SHOW_COMMENT | c.SHOW_TEXT | c.SHOW_PROCESSING_INSTRUCTION | c.SHOW_CDATA_SECTION, + d.SHOW_ELEMENT | d.SHOW_COMMENT | d.SHOW_TEXT | d.SHOW_PROCESSING_INSTRUCTION | d.SHOW_CDATA_SECTION, null ); - }, ot = function(J) { - return J instanceof h && (typeof J.nodeName != "string" || typeof J.textContent != "string" || typeof J.removeChild != "function" || !(J.attributes instanceof d) || typeof J.removeAttribute != "function" || typeof J.setAttribute != "function" || typeof J.namespaceURI != "string" || typeof J.insertBefore != "function" || typeof J.hasChildNodes != "function"); - }, It = function(J) { - return typeof l == "function" && J instanceof l; - }, Gt = function(J, Ae, Fe) { - E[J] && QC(E[J], (ki) => { - ki.call(e, Ae, Fe, ud); - }); - }, Ci = function(J) { - let Ae = null; - if (Gt("beforeSanitizeElements", J, null), ot(J)) - return q(J), !0; - const Fe = bn(J.nodeName); - if (Gt("uponSanitizeElement", J, { - tagName: Fe, + }, ot = function(B) { + return B instanceof h && (typeof B.nodeName != "string" || typeof B.textContent != "string" || typeof B.removeChild != "function" || !(B.attributes instanceof a) || typeof B.removeAttribute != "function" || typeof B.setAttribute != "function" || typeof B.namespaceURI != "string" || typeof B.insertBefore != "function" || typeof B.hasChildNodes != "function"); + }, Ct = function(B) { + return typeof r == "function" && B instanceof r; + }, vt = function(B, Ve, De) { + H[B] && d1(H[B], (Ji) => { + Ji.call(e, Ve, De, ga); + }); + }, Gi = function(B) { + let Ve = null; + if (vt("beforeSanitizeElements", B, null), ot(B)) + return q(B), !0; + const De = fn(B.nodeName); + if (vt("uponSanitizeElement", B, { + tagName: De, allowedTags: ke - }), J.hasChildNodes() && !It(J.firstElementChild) && Js(/<[/\w]/g, J.innerHTML) && Js(/<[/\w]/g, J.textContent) || J.nodeType === v0.progressingInstruction || Mr && J.nodeType === v0.comment && Js(/<[/\w]/g, J.data)) - return q(J), !0; - if (!ke[Fe] || _i[Fe]) { - if (!_i[Fe] && Os(Fe) && (wt.tagNameCheck instanceof RegExp && Js(wt.tagNameCheck, Fe) || wt.tagNameCheck instanceof Function && wt.tagNameCheck(Fe))) + }), B.hasChildNodes() && !Ct(B.firstElementChild) && Qs(/<[/\w]/g, B.innerHTML) && Qs(/<[/\w]/g, B.textContent) || B.nodeType === H0.progressingInstruction || Cl && B.nodeType === H0.comment && Qs(/<[/\w]/g, B.data)) + return q(B), !0; + if (!ke[De] || Ci[De]) { + if (!Ci[De] && Bs(De) && (yt.tagNameCheck instanceof RegExp && Qs(yt.tagNameCheck, De) || yt.tagNameCheck instanceof Function && yt.tagNameCheck(De))) return !1; - if (qm && !hd[Fe]) { - const ki = C(J) || J.parentNode, _s = w(J) || J.childNodes; - if (_s && ki) { - const is = _s.length; - for (let Ao = is - 1; Ao >= 0; --Ao) { - const Bl = f(_s[Ao], !0); - Bl.__removalCount = (J.__removalCount || 0) + 1, ki.insertBefore(Bl, y(J)); + if (np && !pa[De]) { + const Ji = W(B) || B.parentNode, Rs = y(B) || B.childNodes; + if (Rs && Ji) { + const ss = Rs.length; + for (let Io = ss - 1; Io >= 0; --Io) { + const _r = g(Rs[Io], !0); + _r.__removalCount = (B.__removalCount || 0) + 1, Ji.insertBefore(_r, f(B)); } } } - return q(J), !0; + return q(B), !0; } - return J instanceof a && !O(J) || (Fe === "noscript" || Fe === "noembed" || Fe === "noframes") && Js(/<\/no(script|embed|frames)/i, J.innerHTML) ? (q(J), !0) : (Fi && J.nodeType === v0.text && (Ae = J.textContent, QC([Y, B, X], (ki) => { - Ae = I0(Ae, ki, " "); - }), J.textContent !== Ae && (_0(e.removed, { - element: J.cloneNode() - }), J.textContent = Ae)), Gt("afterSanitizeElements", J, null), !1); - }, Si = function(J, Ae, Fe) { - if (ou && (Ae === "id" || Ae === "name") && (Fe in t || Fe in hN)) + return B instanceof c && !U(B) || (De === "noscript" || De === "noembed" || De === "noframes") && Qs(/<\/no(script|embed|frames)/i, B.innerHTML) ? (q(B), !0) : (Fi && B.nodeType === H0.text && (Ve = B.textContent, d1([F, K, E], (Ji) => { + Ve = k0(Ve, Ji, " "); + }), B.textContent !== Ve && (Y0(e.removed, { + element: B.cloneNode() + }), B.textContent = Ve)), vt("afterSanitizeElements", B, null), !1); + }, Xi = function(B, Ve, De) { + if (du && (Ve === "id" || Ve === "name") && (De in t || De in xC)) return !1; - if (!(xr && !ts[Ae] && Js(j, Ae))) { - if (!(Zs && Js(le, Ae))) { - if (!Ee[Ae] || ts[Ae]) { + if (!(xl && !ns[Ve] && Qs(j, Ve))) { + if (!(Cs && Qs(re, Ve))) { + if (!He[Ve] || ns[Ve]) { if ( // First condition does a very basic check if a) it's basically a valid custom element tagname AND // b) if the tagName passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck // and c) if the attribute name passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.attributeNameCheck - !(Os(J) && (wt.tagNameCheck instanceof RegExp && Js(wt.tagNameCheck, J) || wt.tagNameCheck instanceof Function && wt.tagNameCheck(J)) && (wt.attributeNameCheck instanceof RegExp && Js(wt.attributeNameCheck, Ae) || wt.attributeNameCheck instanceof Function && wt.attributeNameCheck(Ae)) || // Alternative, second condition checks if it's an `is`-attribute, AND + !(Bs(B) && (yt.tagNameCheck instanceof RegExp && Qs(yt.tagNameCheck, B) || yt.tagNameCheck instanceof Function && yt.tagNameCheck(B)) && (yt.attributeNameCheck instanceof RegExp && Qs(yt.attributeNameCheck, Ve) || yt.attributeNameCheck instanceof Function && yt.attributeNameCheck(Ve)) || // Alternative, second condition checks if it's an `is`-attribute, AND // the value passes whatever the user has configured for CUSTOM_ELEMENT_HANDLING.tagNameCheck - Ae === "is" && wt.allowCustomizedBuiltInElements && (wt.tagNameCheck instanceof RegExp && Js(wt.tagNameCheck, Fe) || wt.tagNameCheck instanceof Function && wt.tagNameCheck(Fe))) + Ve === "is" && yt.allowCustomizedBuiltInElements && (yt.tagNameCheck instanceof RegExp && Qs(yt.tagNameCheck, De) || yt.tagNameCheck instanceof Function && yt.tagNameCheck(De))) ) return !1; - } else if (!Ua[Ae]) { - if (!Js(Ve, I0(Fe, be, ""))) { - if (!((Ae === "src" || Ae === "xlink:href" || Ae === "href") && J !== "script" && k6(Fe, "data:") === 0 && HC[J])) { - if (!(So && !Js(ue, I0(Fe, be, "")))) { - if (Fe) + } else if (!qc[Ve]) { + if (!Qs(Ye, k0(De, Ze, ""))) { + if (!((Ve === "src" || Ve === "xlink:href" || Ve === "href") && B !== "script" && xq(De, "data:") === 0 && o1[B])) { + if (!(Vo && !Qs(ue, k0(De, Ze, "")))) { + if (De) return !1; } } @@ -2742,161 +2742,161 @@ function TH() { } } return !0; - }, Os = function(J) { - return J !== "annotation-xml" && P9(J, me); - }, $o = function(J) { - Gt("beforeSanitizeAttributes", J, null); + }, Bs = function(B) { + return B !== "annotation-xml" && bD(B, be); + }, tl = function(B) { + vt("beforeSanitizeAttributes", B, null); const { - attributes: Ae - } = J; - if (!Ae) + attributes: Ve + } = B; + if (!Ve) return; - const Fe = { + const De = { attrName: "", attrValue: "", keepAttr: !0, - allowedAttributes: Ee + allowedAttributes: He }; - let ki = Ae.length; - for (; ki--; ) { - const _s = Ae[ki], { - name: is, - namespaceURI: Ao, - value: Bl - } = _s, Z0 = bn(is); - let Hs = is === "value" ? Bl : G6(Bl); - if (Fe.attrName = Z0, Fe.attrValue = Hs, Fe.keepAttr = !0, Fe.forceKeepAttr = void 0, Gt("uponSanitizeAttribute", J, Fe), Hs = Fe.attrValue, Fe.forceKeepAttr || (re(is, J), !Fe.keepAttr)) + let Ji = Ve.length; + for (; Ji--; ) { + const Rs = Ve[Ji], { + name: ss, + namespaceURI: Io, + value: _r + } = Rs, M0 = fn(ss); + let _s = ss === "value" ? _r : Cq(_r); + if (De.attrName = M0, De.attrValue = _s, De.keepAttr = !0, De.forceKeepAttr = void 0, vt("uponSanitizeAttribute", B, De), _s = De.attrValue, De.forceKeepAttr || (le(ss, B), !De.keepAttr)) continue; - if (!su && Js(/\/>/i, Hs)) { - re(is, J); + if (!cu && Qs(/\/>/i, _s)) { + le(ss, B); continue; } - Fi && QC([Y, B, X], (T9) => { - Hs = I0(Hs, T9, " "); + Fi && d1([F, K, E], (nD) => { + _s = k0(_s, nD, " "); }); - const v9 = bn(J.nodeName); - if (Si(v9, Z0, Hs)) { - if (BC && (Z0 === "id" || Z0 === "name") && (re(is, J), Hs = OC + Hs), Mr && Js(/((--!?|])>)|<\/(style|title)/i, Hs)) { - re(is, J); + const iD = fn(B.nodeName); + if (Xi(iD, M0, _s)) { + if (n1 && (M0 === "id" || M0 === "name") && (le(ss, B), _s = s1 + _s), Cl && Qs(/((--!?|])>)|<\/(style|title)/i, _s)) { + le(ss, B); continue; } - if (S && typeof g == "object" && typeof g.getAttributeType == "function" && !Ao) - switch (g.getAttributeType(v9, Z0)) { + if (G && typeof m == "object" && typeof m.getAttributeType == "function" && !Io) + switch (m.getAttributeType(iD, M0)) { case "TrustedHTML": { - Hs = S.createHTML(Hs); + _s = G.createHTML(_s); break; } case "TrustedScriptURL": { - Hs = S.createScriptURL(Hs); + _s = G.createScriptURL(_s); break; } } try { - Ao ? J.setAttributeNS(Ao, is, Hs) : J.setAttribute(is, Hs), ot(J) ? q(J) : z9(e.removed); + Io ? B.setAttributeNS(Io, ss, _s) : B.setAttribute(ss, _s), ot(B) ? q(B) : mD(e.removed); } catch { } } } - Gt("afterSanitizeAttributes", J, null); - }, M0 = function Ue(J) { - let Ae = null; - const Fe = ve(J); - for (Gt("beforeSanitizeShadowDOM", J, null); Ae = Fe.nextNode(); ) - Gt("uponSanitizeShadowNode", Ae, null), !Ci(Ae) && (Ae.content instanceof o && Ue(Ae.content), $o(Ae)); - Gt("afterSanitizeShadowDOM", J, null); + vt("afterSanitizeAttributes", B, null); + }, T0 = function _e(B) { + let Ve = null; + const De = we(B); + for (vt("beforeSanitizeShadowDOM", B, null); Ve = De.nextNode(); ) + vt("uponSanitizeShadowNode", Ve, null), !Gi(Ve) && (Ve.content instanceof o && _e(Ve.content), tl(Ve)); + vt("afterSanitizeShadowDOM", B, null); }; - return e.sanitize = function(Ue) { - let J = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, Ae = null, Fe = null, ki = null, _s = null; - if (ep = !Ue, ep && (Ue = ""), typeof Ue != "string" && !It(Ue)) - if (typeof Ue.toString == "function") { - if (Ue = Ue.toString(), typeof Ue != "string") - throw N0("dirty is not a string, aborting"); + return e.sanitize = function(_e) { + let B = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : {}, Ve = null, De = null, Ji = null, Rs = null; + if (op = !_e, op && (_e = ""), typeof _e != "string" && !Ct(_e)) + if (typeof _e.toString == "function") { + if (_e = _e.toString(), typeof _e != "string") + throw v0("dirty is not a string, aborting"); } else - throw N0("toString is not a function"); + throw v0("toString is not a function"); if (!e.isSupported) - return Ue; - if (L0 || x0(J), e.removed = [], typeof Ue == "string" && (ru = !1), ru) { - if (Ue.nodeName) { - const Bl = bn(Ue.nodeName); - if (!ke[Bl] || _i[Bl]) - throw N0("root node is forbidden and cannot be sanitized in-place"); - } - } else if (Ue instanceof l) - Ae = Me(""), Fe = Ae.ownerDocument.importNode(Ue, !0), Fe.nodeType === v0.element && Fe.nodeName === "BODY" || Fe.nodeName === "HTML" ? Ae = Fe : Ae.appendChild(Fe); + return _e; + if (R0 || w0(B), e.removed = [], typeof _e == "string" && (au = !1), au) { + if (_e.nodeName) { + const _r = fn(_e.nodeName); + if (!ke[_r] || Ci[_r]) + throw v0("root node is forbidden and cannot be sanitized in-place"); + } + } else if (_e instanceof r) + Ve = Ie(""), De = Ve.ownerDocument.importNode(_e, !0), De.nodeType === H0.element && De.nodeName === "BODY" || De.nodeName === "HTML" ? Ve = De : Ve.appendChild(De); else { - if (!dd && !Fi && !Ja && // eslint-disable-next-line unicorn/prefer-includes - Ue.indexOf("<") === -1) - return S && jm ? S.createHTML(Ue) : Ue; - if (Ae = Me(Ue), !Ae) - return dd ? null : jm ? L : ""; - } - Ae && A0 && q(Ae.firstChild); - const is = ve(ru ? Ue : Ae); - for (; ki = is.nextNode(); ) - Ci(ki) || (ki.content instanceof o && M0(ki.content), $o(ki)); - if (ru) - return Ue; - if (dd) { - if (Qm) - for (_s = _.call(Ae.ownerDocument); Ae.firstChild; ) - _s.appendChild(Ae.firstChild); + if (!ba && !Fi && !jc && // eslint-disable-next-line unicorn/prefer-includes + _e.indexOf("<") === -1) + return G && ip ? G.createHTML(_e) : _e; + if (Ve = Ie(_e), !Ve) + return ba ? null : ip ? X : ""; + } + Ve && N0 && q(Ve.firstChild); + const ss = we(au ? _e : Ve); + for (; Ji = ss.nextNode(); ) + Gi(Ji) || (Ji.content instanceof o && T0(Ji.content), tl(Ji)); + if (au) + return _e; + if (ba) { + if (tp) + for (Rs = x.call(Ve.ownerDocument); Ve.firstChild; ) + Rs.appendChild(Ve.firstChild); else - _s = Ae; - return (Ee.shadowroot || Ee.shadowrootmode) && (_s = P.call(i, _s, !0)), _s; - } - let Ao = Ja ? Ae.outerHTML : Ae.innerHTML; - return Ja && ke["!doctype"] && Ae.ownerDocument && Ae.ownerDocument.doctype && Ae.ownerDocument.doctype.name && Js(vH, Ae.ownerDocument.doctype.name) && (Ao = " -` + Ao), Fi && QC([Y, B, X], (Bl) => { - Ao = I0(Ao, Bl, " "); - }), S && jm ? S.createHTML(Ao) : Ao; + Rs = Ve; + return (He.shadowroot || He.shadowrootmode) && (Rs = A.call(i, Rs, !0)), Rs; + } + let Io = jc ? Ve.outerHTML : Ve.innerHTML; + return jc && ke["!doctype"] && Ve.ownerDocument && Ve.ownerDocument.doctype && Ve.ownerDocument.doctype.name && Qs(mB, Ve.ownerDocument.doctype.name) && (Io = " +` + Io), Fi && d1([F, K, E], (_r) => { + Io = k0(Io, _r, " "); + }), G && ip ? G.createHTML(Io) : Io; }, e.setConfig = function() { - let Ue = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; - x0(Ue), L0 = !0; + let _e = arguments.length > 0 && arguments[0] !== void 0 ? arguments[0] : {}; + w0(_e), R0 = !0; }, e.clearConfig = function() { - ud = null, L0 = !1; - }, e.isValidAttribute = function(Ue, J, Ae) { - ud || x0({}); - const Fe = bn(Ue), ki = bn(J); - return Si(Fe, ki, Ae); - }, e.addHook = function(Ue, J) { - typeof J == "function" && (E[Ue] = E[Ue] || [], _0(E[Ue], J)); - }, e.removeHook = function(Ue) { - if (E[Ue]) - return z9(E[Ue]); - }, e.removeHooks = function(Ue) { - E[Ue] && (E[Ue] = []); + ga = null, R0 = !1; + }, e.isValidAttribute = function(_e, B, Ve) { + ga || w0({}); + const De = fn(_e), Ji = fn(B); + return Xi(De, Ji, Ve); + }, e.addHook = function(_e, B) { + typeof B == "function" && (H[_e] = H[_e] || [], Y0(H[_e], B)); + }, e.removeHook = function(_e) { + if (H[_e]) + return mD(H[_e]); + }, e.removeHooks = function(_e) { + H[_e] && (H[_e] = []); }, e.removeAllHooks = function() { - E = {}; + H = {}; }, e; } -var Xa = TH(); -Xa.version; -Xa.isSupported; -const DH = Xa.sanitize; -Xa.setConfig; -Xa.clearConfig; -Xa.isValidAttribute; -const VH = Xa.addHook, kH = Xa.removeHook; -Xa.removeHooks; -Xa.removeAllHooks; -function GH(s) { +var Ac = bB(); +Ac.version; +Ac.isSupported; +const pB = Ac.sanitize; +Ac.setConfig; +Ac.clearConfig; +Ac.isValidAttribute; +const gB = Ac.addHook, ZB = Ac.removeHook; +Ac.removeHooks; +Ac.removeAllHooks; +function fB(s) { return s; } -class j6 { +class Aq { constructor(e, t) { - this.lastCache = void 0, this.lastArgKey = void 0, typeof e == "function" ? (this._fn = e, this._computeKey = GH) : (this._fn = t, this._computeKey = e.getCacheKey); + this.lastCache = void 0, this.lastArgKey = void 0, typeof e == "function" ? (this._fn = e, this._computeKey = fB) : (this._fn = t, this._computeKey = e.getCacheKey); } get(e) { const t = this._computeKey(e); return this.lastArgKey !== t && (this.lastArgKey = t, this.lastCache = this._fn(e)), this.lastCache; } } -class K9 { +class WD { get cachedValues() { return this._map; } constructor(e, t) { - this._map = /* @__PURE__ */ new Map(), this._map2 = /* @__PURE__ */ new Map(), typeof e == "function" ? (this._fn = e, this._computeKey = GH) : (this._fn = t, this._computeKey = e.getCacheKey); + this._map = /* @__PURE__ */ new Map(), this._map2 = /* @__PURE__ */ new Map(), typeof e == "function" ? (this._fn = e, this._computeKey = fB) : (this._fn = t, this._computeKey = e.getCacheKey); } get(e) { const t = this._computeKey(e); @@ -2906,7 +2906,7 @@ class K9 { return this._map.set(e, i), this._map2.set(t, i), i; } } -class Wl { +class Yr { constructor(e) { this.executor = e, this._didRun = !1; } @@ -2936,17 +2936,17 @@ class Wl { return this._value; } } -function RH(s) { +function yB(s) { return !s || typeof s != "string" ? !0 : s.trim().length === 0; } -const q6 = /{(\d+)}/g; -function rb(s, ...e) { - return e.length === 0 ? s : s.replace(q6, function(t, i) { +const Kq = /{(\d+)}/g; +function uZ(s, ...e) { + return e.length === 0 ? s : s.replace(Kq, function(t, i) { const n = parseInt(i, 10); return isNaN(n) || n < 0 || n >= e.length ? t : e[n]; }); } -function $6(s) { +function Uq(s) { return s.replace(/[<>"'&]/g, (e) => { switch (e) { case "<": @@ -2963,7 +2963,7 @@ function $6(s) { return e; }); } -function _y(s) { +function Hf(s) { return s.replace(/[<>&]/g, function(e) { switch (e) { case "<": @@ -2977,10 +2977,10 @@ function _y(s) { } }); } -function Po(s) { +function Uo(s) { return s.replace(/[\\\{\}\*\+\?\|\^\$\.\[\]\(\)]/g, "\\$&"); } -function I_(s, e) { +function AS(s, e) { if (!s || !e) return s; const t = e.length; @@ -2991,7 +2991,7 @@ function I_(s, e) { i = i + t; return s.substring(i); } -function eq(s, e) { +function Pq(s, e) { if (!s || !e) return s; const t = e.length, i = s.length; @@ -3005,29 +3005,29 @@ function eq(s, e) { } return s.substring(0, n); } -function tq(s) { +function Bq(s) { return s.replace(/[\-\\\{\}\+\?\|\^\$\.\,\[\]\(\)\#\s]/g, "\\$&").replace(/[\*]/g, ".*"); } -function EH(s, e, t = {}) { +function WB(s, e, t = {}) { if (!s) throw new Error("Cannot create regex from empty string"); - e || (s = Po(s)), t.wholeWord && (/\B/.test(s.charAt(0)) || (s = "\\b" + s), /\B/.test(s.charAt(s.length - 1)) || (s = s + "\\b")); + e || (s = Uo(s)), t.wholeWord && (/\B/.test(s.charAt(0)) || (s = "\\b" + s), /\B/.test(s.charAt(s.length - 1)) || (s = s + "\\b")); let i = ""; return t.global && (i += "g"), t.matchCase || (i += "i"), t.multiline && (i += "m"), t.unicode && (i += "u"), new RegExp(s, i); } -function iq(s) { +function _q(s) { return s.source === "^" || s.source === "^$" || s.source === "$" || s.source === "^\\s*$" ? !1 : !!(s.exec("") && s.lastIndex === 0); } -function Fa(s) { +function Kc(s) { return s.split(/\r\n|\r|\n/); } -function nq(s) { +function Qq(s) { const e = [], t = s.split(/(\r\n|\r|\n)/); for (let i = 0; i < Math.ceil(t.length / 2); i++) e.push(t[2 * i] + (t[2 * i + 1] ?? "")); return e; } -function qn(s) { +function es(s) { for (let e = 0, t = s.length; e < t; e++) { const i = s.charCodeAt(e); if (i !== 32 && i !== 9) @@ -3035,7 +3035,7 @@ function qn(s) { } return -1; } -function Nt(s, e = 0, t = s.length) { +function Rt(s, e = 0, t = s.length) { for (let i = e; i < t; i++) { const n = s.charCodeAt(i); if (n !== 32 && n !== 9) @@ -3043,7 +3043,7 @@ function Nt(s, e = 0, t = s.length) { } return s.substring(e, t); } -function Ml(s, e = s.length - 1) { +function Rr(s, e = s.length - 1) { for (let t = e; t >= 0; t--) { const i = s.charCodeAt(t); if (i !== 32 && i !== 9) @@ -3051,55 +3051,55 @@ function Ml(s, e = s.length - 1) { } return -1; } -function vw(s, e) { +function Ay(s, e) { return s < e ? -1 : s > e ? 1 : 0; } -function eE(s, e, t = 0, i = s.length, n = 0, o = e.length) { +function Iv(s, e, t = 0, i = s.length, n = 0, o = e.length) { for (; t < i && n < o; t++, n++) { - const a = s.charCodeAt(t), c = e.charCodeAt(n); - if (a < c) + const c = s.charCodeAt(t), d = e.charCodeAt(n); + if (c < d) return -1; - if (a > c) + if (c > d) return 1; } - const r = i - t, l = o - n; - return r < l ? -1 : r > l ? 1 : 0; + const l = i - t, r = o - n; + return l < r ? -1 : l > r ? 1 : 0; } -function x2(s, e) { - return hC(s, e, 0, s.length, 0, e.length); +function UN(s, e) { + return LG(s, e, 0, s.length, 0, e.length); } -function hC(s, e, t = 0, i = s.length, n = 0, o = e.length) { +function LG(s, e, t = 0, i = s.length, n = 0, o = e.length) { for (; t < i && n < o; t++, n++) { - let a = s.charCodeAt(t), c = e.charCodeAt(n); - if (a === c) + let c = s.charCodeAt(t), d = e.charCodeAt(n); + if (c === d) continue; - if (a >= 128 || c >= 128) - return eE(s.toLowerCase(), e.toLowerCase(), t, i, n, o); - Xd(a) && (a -= 32), Xd(c) && (c -= 32); - const d = a - c; - if (d !== 0) - return d; + if (c >= 128 || d >= 128) + return Iv(s.toLowerCase(), e.toLowerCase(), t, i, n, o); + Aa(c) && (c -= 32), Aa(d) && (d -= 32); + const a = c - d; + if (a !== 0) + return a; } - const r = i - t, l = o - n; - return r < l ? -1 : r > l ? 1 : 0; + const l = i - t, r = o - n; + return l < r ? -1 : l > r ? 1 : 0; } -function qC(s) { +function h1(s) { return s >= 48 && s <= 57; } -function Xd(s) { +function Aa(s) { return s >= 97 && s <= 122; } -function ua(s) { +function gc(s) { return s >= 65 && s <= 90; } -function Tp(s, e) { - return s.length === e.length && hC(s, e) === 0; +function Hp(s, e) { + return s.length === e.length && LG(s, e) === 0; } -function tE(s, e) { +function Sv(s, e) { const t = e.length; - return e.length > s.length ? !1 : hC(s, e, 0, t) === 0; + return e.length > s.length ? !1 : LG(s, e, 0, t) === 0; } -function Ih(s, e) { +function Th(s, e) { const t = Math.min(s.length, e.length); let i; for (i = 0; i < t; i++) @@ -3107,7 +3107,7 @@ function Ih(s, e) { return i; return t; } -function eA(s, e) { +function pV(s, e) { const t = Math.min(s.length, e.length); let i; const n = s.length - 1, o = e.length - 1; @@ -3116,34 +3116,34 @@ function eA(s, e) { return i; return t; } -function Hi(s) { +function Bi(s) { return 55296 <= s && s <= 56319; } -function dm(s) { +function pb(s) { return 56320 <= s && s <= 57343; } -function iE(s, e) { +function xv(s, e) { return (s - 55296 << 10) + (e - 56320) + 65536; } -function tA(s, e, t) { +function gV(s, e, t) { const i = s.charCodeAt(t); - if (Hi(i) && t + 1 < e) { + if (Bi(i) && t + 1 < e) { const n = s.charCodeAt(t + 1); - if (dm(n)) - return iE(i, n); + if (pb(n)) + return xv(i, n); } return i; } -function sq(s, e) { +function Oq(s, e) { const t = s.charCodeAt(e - 1); - if (dm(t) && e > 1) { + if (pb(t) && e > 1) { const i = s.charCodeAt(e - 2); - if (Hi(i)) - return iE(i, t); + if (Bi(i)) + return xv(i, t); } return t; } -class nE { +class Cv { get offset() { return this._offset; } @@ -3154,47 +3154,47 @@ class nE { this._offset = e; } prevCodePoint() { - const e = sq(this._str, this._offset); + const e = Oq(this._str, this._offset); return this._offset -= e >= 65536 ? 2 : 1, e; } nextCodePoint() { - const e = tA(this._str, this._len, this._offset); + const e = gV(this._str, this._len, this._offset); return this._offset += e >= 65536 ? 2 : 1, e; } eol() { return this._offset >= this._len; } } -class iA { +class ZV { get offset() { return this._iterator.offset; } constructor(e, t = 0) { - this._iterator = new nE(e, t); + this._iterator = new Cv(e, t); } nextGraphemeLength() { - const e = nA.getInstance(), t = this._iterator, i = t.offset; + const e = fV.getInstance(), t = this._iterator, i = t.offset; let n = e.getGraphemeBreakType(t.nextCodePoint()); for (; !t.eol(); ) { - const o = t.offset, r = e.getGraphemeBreakType(t.nextCodePoint()); - if (Q9(n, r)) { + const o = t.offset, l = e.getGraphemeBreakType(t.nextCodePoint()); + if (GD(n, l)) { t.setOffset(o); break; } - n = r; + n = l; } return t.offset - i; } prevGraphemeLength() { - const e = nA.getInstance(), t = this._iterator, i = t.offset; + const e = fV.getInstance(), t = this._iterator, i = t.offset; let n = e.getGraphemeBreakType(t.prevCodePoint()); for (; t.offset > 0; ) { - const o = t.offset, r = e.getGraphemeBreakType(t.prevCodePoint()); - if (Q9(r, n)) { + const o = t.offset, l = e.getGraphemeBreakType(t.prevCodePoint()); + if (GD(l, n)) { t.setOffset(o); break; } - n = r; + n = l; } return i - t.offset; } @@ -3202,57 +3202,57 @@ class iA { return this._iterator.eol(); } } -function sE(s, e) { - return new iA(s, e).nextGraphemeLength(); +function Rv(s, e) { + return new ZV(s, e).nextGraphemeLength(); } -function XH(s, e) { - return new iA(s, e).prevGraphemeLength(); +function GB(s, e) { + return new ZV(s, e).prevGraphemeLength(); } -function oq(s, e) { - e > 0 && dm(s.charCodeAt(e)) && e--; - const t = e + sE(s, e); - return [t - XH(s, t), t]; +function jq(s, e) { + e > 0 && pb(s.charCodeAt(e)) && e--; + const t = e + Rv(s, e); + return [t - GB(s, t), t]; } -let CN; -function rq() { +let vC; +function qq() { return /(?:[\u05BE\u05C0\u05C3\u05C6\u05D0-\u05F4\u0608\u060B\u060D\u061B-\u064A\u066D-\u066F\u0671-\u06D5\u06E5\u06E6\u06EE\u06EF\u06FA-\u0710\u0712-\u072F\u074D-\u07A5\u07B1-\u07EA\u07F4\u07F5\u07FA\u07FE-\u0815\u081A\u0824\u0828\u0830-\u0858\u085E-\u088E\u08A0-\u08C9\u200F\uFB1D\uFB1F-\uFB28\uFB2A-\uFD3D\uFD50-\uFDC7\uFDF0-\uFDFC\uFE70-\uFEFC]|\uD802[\uDC00-\uDD1B\uDD20-\uDE00\uDE10-\uDE35\uDE40-\uDEE4\uDEEB-\uDF35\uDF40-\uDFFF]|\uD803[\uDC00-\uDD23\uDE80-\uDEA9\uDEAD-\uDF45\uDF51-\uDF81\uDF86-\uDFF6]|\uD83A[\uDC00-\uDCCF\uDD00-\uDD43\uDD4B-\uDFFF]|\uD83B[\uDC00-\uDEBB])/; } -function lb(s) { - return CN || (CN = rq()), CN.test(s); +function mZ(s) { + return vC || (vC = qq()), vC.test(s); } -const lq = /^[\t\n\r\x20-\x7E]*$/; -function uC(s) { - return lq.test(s); +const $q = /^[\t\n\r\x20-\x7E]*$/; +function IG(s) { + return $q.test(s); } -const FH = /[\u2028\u2029]/; -function YH(s) { - return FH.test(s); +const XB = /[\u2028\u2029]/; +function VB(s) { + return XB.test(s); } -function Nh(s) { +function Mh(s) { return s >= 11904 && s <= 55215 || s >= 63744 && s <= 64255 || s >= 65281 && s <= 65374; } -function oE(s) { +function Nv(s) { return s >= 127462 && s <= 127487 || s === 8986 || s === 8987 || s === 9200 || s === 9203 || s >= 9728 && s <= 10175 || s === 11088 || s === 11093 || s >= 127744 && s <= 128591 || s >= 128640 && s <= 128764 || s >= 128992 && s <= 129008 || s >= 129280 && s <= 129535 || s >= 129648 && s <= 129782; } -const aq = "\uFEFF"; -function rE(s) { +const e$ = "\uFEFF"; +function wv(s) { return !!(s && s.length > 0 && s.charCodeAt(0) === 65279); } -function cq(s, e = !1) { +function t$(s, e = !1) { return s ? (e && (s = s.replace(/\\./g, "")), s.toLowerCase() !== s) : !1; } -function zH(s) { +function LB(s) { return s = s % (2 * 26), s < 26 ? String.fromCharCode(97 + s) : String.fromCharCode(65 + s - 26); } -function Q9(s, e) { +function GD(s, e) { return s === 0 ? e !== 5 && e !== 7 : s === 2 && e === 3 ? !1 : s === 4 || s === 2 || s === 3 || e === 4 || e === 2 || e === 3 ? !0 : !(s === 8 && (e === 8 || e === 9 || e === 11 || e === 12) || (s === 11 || s === 9) && (e === 9 || e === 10) || (s === 12 || s === 10) && e === 10 || e === 5 || e === 13 || e === 7 || s === 1 || s === 13 && e === 14 || s === 6 && e === 6); } -const Bu = class Bu { +const Qu = class Qu { static getInstance() { - return Bu._INSTANCE || (Bu._INSTANCE = new Bu()), Bu._INSTANCE; + return Qu._INSTANCE || (Qu._INSTANCE = new Qu()), Qu._INSTANCE; } constructor() { - this._data = dq(); + this._data = i$(); } getGraphemeBreakType(e) { if (e < 32) @@ -3271,42 +3271,42 @@ const Bu = class Bu { return 0; } }; -Bu._INSTANCE = null; -let nA = Bu; -function dq() { +Qu._INSTANCE = null; +let fV = Qu; +function i$() { return JSON.parse("[0,0,0,51229,51255,12,44061,44087,12,127462,127487,6,7083,7085,5,47645,47671,12,54813,54839,12,128678,128678,14,3270,3270,5,9919,9923,14,45853,45879,12,49437,49463,12,53021,53047,12,71216,71218,7,128398,128399,14,129360,129374,14,2519,2519,5,4448,4519,9,9742,9742,14,12336,12336,14,44957,44983,12,46749,46775,12,48541,48567,12,50333,50359,12,52125,52151,12,53917,53943,12,69888,69890,5,73018,73018,5,127990,127990,14,128558,128559,14,128759,128760,14,129653,129655,14,2027,2035,5,2891,2892,7,3761,3761,5,6683,6683,5,8293,8293,4,9825,9826,14,9999,9999,14,43452,43453,5,44509,44535,12,45405,45431,12,46301,46327,12,47197,47223,12,48093,48119,12,48989,49015,12,49885,49911,12,50781,50807,12,51677,51703,12,52573,52599,12,53469,53495,12,54365,54391,12,65279,65279,4,70471,70472,7,72145,72147,7,119173,119179,5,127799,127818,14,128240,128244,14,128512,128512,14,128652,128652,14,128721,128722,14,129292,129292,14,129445,129450,14,129734,129743,14,1476,1477,5,2366,2368,7,2750,2752,7,3076,3076,5,3415,3415,5,4141,4144,5,6109,6109,5,6964,6964,5,7394,7400,5,9197,9198,14,9770,9770,14,9877,9877,14,9968,9969,14,10084,10084,14,43052,43052,5,43713,43713,5,44285,44311,12,44733,44759,12,45181,45207,12,45629,45655,12,46077,46103,12,46525,46551,12,46973,46999,12,47421,47447,12,47869,47895,12,48317,48343,12,48765,48791,12,49213,49239,12,49661,49687,12,50109,50135,12,50557,50583,12,51005,51031,12,51453,51479,12,51901,51927,12,52349,52375,12,52797,52823,12,53245,53271,12,53693,53719,12,54141,54167,12,54589,54615,12,55037,55063,12,69506,69509,5,70191,70193,5,70841,70841,7,71463,71467,5,72330,72342,5,94031,94031,5,123628,123631,5,127763,127765,14,127941,127941,14,128043,128062,14,128302,128317,14,128465,128467,14,128539,128539,14,128640,128640,14,128662,128662,14,128703,128703,14,128745,128745,14,129004,129007,14,129329,129330,14,129402,129402,14,129483,129483,14,129686,129704,14,130048,131069,14,173,173,4,1757,1757,1,2200,2207,5,2434,2435,7,2631,2632,5,2817,2817,5,3008,3008,5,3201,3201,5,3387,3388,5,3542,3542,5,3902,3903,7,4190,4192,5,6002,6003,5,6439,6440,5,6765,6770,7,7019,7027,5,7154,7155,7,8205,8205,13,8505,8505,14,9654,9654,14,9757,9757,14,9792,9792,14,9852,9853,14,9890,9894,14,9937,9937,14,9981,9981,14,10035,10036,14,11035,11036,14,42654,42655,5,43346,43347,7,43587,43587,5,44006,44007,7,44173,44199,12,44397,44423,12,44621,44647,12,44845,44871,12,45069,45095,12,45293,45319,12,45517,45543,12,45741,45767,12,45965,45991,12,46189,46215,12,46413,46439,12,46637,46663,12,46861,46887,12,47085,47111,12,47309,47335,12,47533,47559,12,47757,47783,12,47981,48007,12,48205,48231,12,48429,48455,12,48653,48679,12,48877,48903,12,49101,49127,12,49325,49351,12,49549,49575,12,49773,49799,12,49997,50023,12,50221,50247,12,50445,50471,12,50669,50695,12,50893,50919,12,51117,51143,12,51341,51367,12,51565,51591,12,51789,51815,12,52013,52039,12,52237,52263,12,52461,52487,12,52685,52711,12,52909,52935,12,53133,53159,12,53357,53383,12,53581,53607,12,53805,53831,12,54029,54055,12,54253,54279,12,54477,54503,12,54701,54727,12,54925,54951,12,55149,55175,12,68101,68102,5,69762,69762,7,70067,70069,7,70371,70378,5,70720,70721,7,71087,71087,5,71341,71341,5,71995,71996,5,72249,72249,7,72850,72871,5,73109,73109,5,118576,118598,5,121505,121519,5,127245,127247,14,127568,127569,14,127777,127777,14,127872,127891,14,127956,127967,14,128015,128016,14,128110,128172,14,128259,128259,14,128367,128368,14,128424,128424,14,128488,128488,14,128530,128532,14,128550,128551,14,128566,128566,14,128647,128647,14,128656,128656,14,128667,128673,14,128691,128693,14,128715,128715,14,128728,128732,14,128752,128752,14,128765,128767,14,129096,129103,14,129311,129311,14,129344,129349,14,129394,129394,14,129413,129425,14,129466,129471,14,129511,129535,14,129664,129666,14,129719,129722,14,129760,129767,14,917536,917631,5,13,13,2,1160,1161,5,1564,1564,4,1807,1807,1,2085,2087,5,2307,2307,7,2382,2383,7,2497,2500,5,2563,2563,7,2677,2677,5,2763,2764,7,2879,2879,5,2914,2915,5,3021,3021,5,3142,3144,5,3263,3263,5,3285,3286,5,3398,3400,7,3530,3530,5,3633,3633,5,3864,3865,5,3974,3975,5,4155,4156,7,4229,4230,5,5909,5909,7,6078,6085,7,6277,6278,5,6451,6456,7,6744,6750,5,6846,6846,5,6972,6972,5,7074,7077,5,7146,7148,7,7222,7223,5,7416,7417,5,8234,8238,4,8417,8417,5,9000,9000,14,9203,9203,14,9730,9731,14,9748,9749,14,9762,9763,14,9776,9783,14,9800,9811,14,9831,9831,14,9872,9873,14,9882,9882,14,9900,9903,14,9929,9933,14,9941,9960,14,9974,9974,14,9989,9989,14,10006,10006,14,10062,10062,14,10160,10160,14,11647,11647,5,12953,12953,14,43019,43019,5,43232,43249,5,43443,43443,5,43567,43568,7,43696,43696,5,43765,43765,7,44013,44013,5,44117,44143,12,44229,44255,12,44341,44367,12,44453,44479,12,44565,44591,12,44677,44703,12,44789,44815,12,44901,44927,12,45013,45039,12,45125,45151,12,45237,45263,12,45349,45375,12,45461,45487,12,45573,45599,12,45685,45711,12,45797,45823,12,45909,45935,12,46021,46047,12,46133,46159,12,46245,46271,12,46357,46383,12,46469,46495,12,46581,46607,12,46693,46719,12,46805,46831,12,46917,46943,12,47029,47055,12,47141,47167,12,47253,47279,12,47365,47391,12,47477,47503,12,47589,47615,12,47701,47727,12,47813,47839,12,47925,47951,12,48037,48063,12,48149,48175,12,48261,48287,12,48373,48399,12,48485,48511,12,48597,48623,12,48709,48735,12,48821,48847,12,48933,48959,12,49045,49071,12,49157,49183,12,49269,49295,12,49381,49407,12,49493,49519,12,49605,49631,12,49717,49743,12,49829,49855,12,49941,49967,12,50053,50079,12,50165,50191,12,50277,50303,12,50389,50415,12,50501,50527,12,50613,50639,12,50725,50751,12,50837,50863,12,50949,50975,12,51061,51087,12,51173,51199,12,51285,51311,12,51397,51423,12,51509,51535,12,51621,51647,12,51733,51759,12,51845,51871,12,51957,51983,12,52069,52095,12,52181,52207,12,52293,52319,12,52405,52431,12,52517,52543,12,52629,52655,12,52741,52767,12,52853,52879,12,52965,52991,12,53077,53103,12,53189,53215,12,53301,53327,12,53413,53439,12,53525,53551,12,53637,53663,12,53749,53775,12,53861,53887,12,53973,53999,12,54085,54111,12,54197,54223,12,54309,54335,12,54421,54447,12,54533,54559,12,54645,54671,12,54757,54783,12,54869,54895,12,54981,55007,12,55093,55119,12,55243,55291,10,66045,66045,5,68325,68326,5,69688,69702,5,69817,69818,5,69957,69958,7,70089,70092,5,70198,70199,5,70462,70462,5,70502,70508,5,70750,70750,5,70846,70846,7,71100,71101,5,71230,71230,7,71351,71351,5,71737,71738,5,72000,72000,7,72160,72160,5,72273,72278,5,72752,72758,5,72882,72883,5,73031,73031,5,73461,73462,7,94192,94193,7,119149,119149,7,121403,121452,5,122915,122916,5,126980,126980,14,127358,127359,14,127535,127535,14,127759,127759,14,127771,127771,14,127792,127793,14,127825,127867,14,127897,127899,14,127945,127945,14,127985,127986,14,128000,128007,14,128021,128021,14,128066,128100,14,128184,128235,14,128249,128252,14,128266,128276,14,128335,128335,14,128379,128390,14,128407,128419,14,128444,128444,14,128481,128481,14,128499,128499,14,128526,128526,14,128536,128536,14,128543,128543,14,128556,128556,14,128564,128564,14,128577,128580,14,128643,128645,14,128649,128649,14,128654,128654,14,128660,128660,14,128664,128664,14,128675,128675,14,128686,128689,14,128695,128696,14,128705,128709,14,128717,128719,14,128725,128725,14,128736,128741,14,128747,128748,14,128755,128755,14,128762,128762,14,128981,128991,14,129009,129023,14,129160,129167,14,129296,129304,14,129320,129327,14,129340,129342,14,129356,129356,14,129388,129392,14,129399,129400,14,129404,129407,14,129432,129442,14,129454,129455,14,129473,129474,14,129485,129487,14,129648,129651,14,129659,129660,14,129671,129679,14,129709,129711,14,129728,129730,14,129751,129753,14,129776,129782,14,917505,917505,4,917760,917999,5,10,10,3,127,159,4,768,879,5,1471,1471,5,1536,1541,1,1648,1648,5,1767,1768,5,1840,1866,5,2070,2073,5,2137,2139,5,2274,2274,1,2363,2363,7,2377,2380,7,2402,2403,5,2494,2494,5,2507,2508,7,2558,2558,5,2622,2624,7,2641,2641,5,2691,2691,7,2759,2760,5,2786,2787,5,2876,2876,5,2881,2884,5,2901,2902,5,3006,3006,5,3014,3016,7,3072,3072,5,3134,3136,5,3157,3158,5,3260,3260,5,3266,3266,5,3274,3275,7,3328,3329,5,3391,3392,7,3405,3405,5,3457,3457,5,3536,3537,7,3551,3551,5,3636,3642,5,3764,3772,5,3895,3895,5,3967,3967,7,3993,4028,5,4146,4151,5,4182,4183,7,4226,4226,5,4253,4253,5,4957,4959,5,5940,5940,7,6070,6070,7,6087,6088,7,6158,6158,4,6432,6434,5,6448,6449,7,6679,6680,5,6742,6742,5,6754,6754,5,6783,6783,5,6912,6915,5,6966,6970,5,6978,6978,5,7042,7042,7,7080,7081,5,7143,7143,7,7150,7150,7,7212,7219,5,7380,7392,5,7412,7412,5,8203,8203,4,8232,8232,4,8265,8265,14,8400,8412,5,8421,8432,5,8617,8618,14,9167,9167,14,9200,9200,14,9410,9410,14,9723,9726,14,9733,9733,14,9745,9745,14,9752,9752,14,9760,9760,14,9766,9766,14,9774,9774,14,9786,9786,14,9794,9794,14,9823,9823,14,9828,9828,14,9833,9850,14,9855,9855,14,9875,9875,14,9880,9880,14,9885,9887,14,9896,9897,14,9906,9916,14,9926,9927,14,9935,9935,14,9939,9939,14,9962,9962,14,9972,9972,14,9978,9978,14,9986,9986,14,9997,9997,14,10002,10002,14,10017,10017,14,10055,10055,14,10071,10071,14,10133,10135,14,10548,10549,14,11093,11093,14,12330,12333,5,12441,12442,5,42608,42610,5,43010,43010,5,43045,43046,5,43188,43203,7,43302,43309,5,43392,43394,5,43446,43449,5,43493,43493,5,43571,43572,7,43597,43597,7,43703,43704,5,43756,43757,5,44003,44004,7,44009,44010,7,44033,44059,12,44089,44115,12,44145,44171,12,44201,44227,12,44257,44283,12,44313,44339,12,44369,44395,12,44425,44451,12,44481,44507,12,44537,44563,12,44593,44619,12,44649,44675,12,44705,44731,12,44761,44787,12,44817,44843,12,44873,44899,12,44929,44955,12,44985,45011,12,45041,45067,12,45097,45123,12,45153,45179,12,45209,45235,12,45265,45291,12,45321,45347,12,45377,45403,12,45433,45459,12,45489,45515,12,45545,45571,12,45601,45627,12,45657,45683,12,45713,45739,12,45769,45795,12,45825,45851,12,45881,45907,12,45937,45963,12,45993,46019,12,46049,46075,12,46105,46131,12,46161,46187,12,46217,46243,12,46273,46299,12,46329,46355,12,46385,46411,12,46441,46467,12,46497,46523,12,46553,46579,12,46609,46635,12,46665,46691,12,46721,46747,12,46777,46803,12,46833,46859,12,46889,46915,12,46945,46971,12,47001,47027,12,47057,47083,12,47113,47139,12,47169,47195,12,47225,47251,12,47281,47307,12,47337,47363,12,47393,47419,12,47449,47475,12,47505,47531,12,47561,47587,12,47617,47643,12,47673,47699,12,47729,47755,12,47785,47811,12,47841,47867,12,47897,47923,12,47953,47979,12,48009,48035,12,48065,48091,12,48121,48147,12,48177,48203,12,48233,48259,12,48289,48315,12,48345,48371,12,48401,48427,12,48457,48483,12,48513,48539,12,48569,48595,12,48625,48651,12,48681,48707,12,48737,48763,12,48793,48819,12,48849,48875,12,48905,48931,12,48961,48987,12,49017,49043,12,49073,49099,12,49129,49155,12,49185,49211,12,49241,49267,12,49297,49323,12,49353,49379,12,49409,49435,12,49465,49491,12,49521,49547,12,49577,49603,12,49633,49659,12,49689,49715,12,49745,49771,12,49801,49827,12,49857,49883,12,49913,49939,12,49969,49995,12,50025,50051,12,50081,50107,12,50137,50163,12,50193,50219,12,50249,50275,12,50305,50331,12,50361,50387,12,50417,50443,12,50473,50499,12,50529,50555,12,50585,50611,12,50641,50667,12,50697,50723,12,50753,50779,12,50809,50835,12,50865,50891,12,50921,50947,12,50977,51003,12,51033,51059,12,51089,51115,12,51145,51171,12,51201,51227,12,51257,51283,12,51313,51339,12,51369,51395,12,51425,51451,12,51481,51507,12,51537,51563,12,51593,51619,12,51649,51675,12,51705,51731,12,51761,51787,12,51817,51843,12,51873,51899,12,51929,51955,12,51985,52011,12,52041,52067,12,52097,52123,12,52153,52179,12,52209,52235,12,52265,52291,12,52321,52347,12,52377,52403,12,52433,52459,12,52489,52515,12,52545,52571,12,52601,52627,12,52657,52683,12,52713,52739,12,52769,52795,12,52825,52851,12,52881,52907,12,52937,52963,12,52993,53019,12,53049,53075,12,53105,53131,12,53161,53187,12,53217,53243,12,53273,53299,12,53329,53355,12,53385,53411,12,53441,53467,12,53497,53523,12,53553,53579,12,53609,53635,12,53665,53691,12,53721,53747,12,53777,53803,12,53833,53859,12,53889,53915,12,53945,53971,12,54001,54027,12,54057,54083,12,54113,54139,12,54169,54195,12,54225,54251,12,54281,54307,12,54337,54363,12,54393,54419,12,54449,54475,12,54505,54531,12,54561,54587,12,54617,54643,12,54673,54699,12,54729,54755,12,54785,54811,12,54841,54867,12,54897,54923,12,54953,54979,12,55009,55035,12,55065,55091,12,55121,55147,12,55177,55203,12,65024,65039,5,65520,65528,4,66422,66426,5,68152,68154,5,69291,69292,5,69633,69633,5,69747,69748,5,69811,69814,5,69826,69826,5,69932,69932,7,70016,70017,5,70079,70080,7,70095,70095,5,70196,70196,5,70367,70367,5,70402,70403,7,70464,70464,5,70487,70487,5,70709,70711,7,70725,70725,7,70833,70834,7,70843,70844,7,70849,70849,7,71090,71093,5,71103,71104,5,71227,71228,7,71339,71339,5,71344,71349,5,71458,71461,5,71727,71735,5,71985,71989,7,71998,71998,5,72002,72002,7,72154,72155,5,72193,72202,5,72251,72254,5,72281,72283,5,72344,72345,5,72766,72766,7,72874,72880,5,72885,72886,5,73023,73029,5,73104,73105,5,73111,73111,5,92912,92916,5,94095,94098,5,113824,113827,4,119142,119142,7,119155,119162,4,119362,119364,5,121476,121476,5,122888,122904,5,123184,123190,5,125252,125258,5,127183,127183,14,127340,127343,14,127377,127386,14,127491,127503,14,127548,127551,14,127744,127756,14,127761,127761,14,127769,127769,14,127773,127774,14,127780,127788,14,127796,127797,14,127820,127823,14,127869,127869,14,127894,127895,14,127902,127903,14,127943,127943,14,127947,127950,14,127972,127972,14,127988,127988,14,127992,127994,14,128009,128011,14,128019,128019,14,128023,128041,14,128064,128064,14,128102,128107,14,128174,128181,14,128238,128238,14,128246,128247,14,128254,128254,14,128264,128264,14,128278,128299,14,128329,128330,14,128348,128359,14,128371,128377,14,128392,128393,14,128401,128404,14,128421,128421,14,128433,128434,14,128450,128452,14,128476,128478,14,128483,128483,14,128495,128495,14,128506,128506,14,128519,128520,14,128528,128528,14,128534,128534,14,128538,128538,14,128540,128542,14,128544,128549,14,128552,128555,14,128557,128557,14,128560,128563,14,128565,128565,14,128567,128576,14,128581,128591,14,128641,128642,14,128646,128646,14,128648,128648,14,128650,128651,14,128653,128653,14,128655,128655,14,128657,128659,14,128661,128661,14,128663,128663,14,128665,128666,14,128674,128674,14,128676,128677,14,128679,128685,14,128690,128690,14,128694,128694,14,128697,128702,14,128704,128704,14,128710,128714,14,128716,128716,14,128720,128720,14,128723,128724,14,128726,128727,14,128733,128735,14,128742,128744,14,128746,128746,14,128749,128751,14,128753,128754,14,128756,128758,14,128761,128761,14,128763,128764,14,128884,128895,14,128992,129003,14,129008,129008,14,129036,129039,14,129114,129119,14,129198,129279,14,129293,129295,14,129305,129310,14,129312,129319,14,129328,129328,14,129331,129338,14,129343,129343,14,129351,129355,14,129357,129359,14,129375,129387,14,129393,129393,14,129395,129398,14,129401,129401,14,129403,129403,14,129408,129412,14,129426,129431,14,129443,129444,14,129451,129453,14,129456,129465,14,129472,129472,14,129475,129482,14,129484,129484,14,129488,129510,14,129536,129647,14,129652,129652,14,129656,129658,14,129661,129663,14,129667,129670,14,129680,129685,14,129705,129708,14,129712,129718,14,129723,129727,14,129731,129733,14,129744,129750,14,129754,129759,14,129768,129775,14,129783,129791,14,917504,917504,4,917506,917535,4,917632,917759,4,918000,921599,4,0,9,4,11,12,4,14,31,4,169,169,14,174,174,14,1155,1159,5,1425,1469,5,1473,1474,5,1479,1479,5,1552,1562,5,1611,1631,5,1750,1756,5,1759,1764,5,1770,1773,5,1809,1809,5,1958,1968,5,2045,2045,5,2075,2083,5,2089,2093,5,2192,2193,1,2250,2273,5,2275,2306,5,2362,2362,5,2364,2364,5,2369,2376,5,2381,2381,5,2385,2391,5,2433,2433,5,2492,2492,5,2495,2496,7,2503,2504,7,2509,2509,5,2530,2531,5,2561,2562,5,2620,2620,5,2625,2626,5,2635,2637,5,2672,2673,5,2689,2690,5,2748,2748,5,2753,2757,5,2761,2761,7,2765,2765,5,2810,2815,5,2818,2819,7,2878,2878,5,2880,2880,7,2887,2888,7,2893,2893,5,2903,2903,5,2946,2946,5,3007,3007,7,3009,3010,7,3018,3020,7,3031,3031,5,3073,3075,7,3132,3132,5,3137,3140,7,3146,3149,5,3170,3171,5,3202,3203,7,3262,3262,7,3264,3265,7,3267,3268,7,3271,3272,7,3276,3277,5,3298,3299,5,3330,3331,7,3390,3390,5,3393,3396,5,3402,3404,7,3406,3406,1,3426,3427,5,3458,3459,7,3535,3535,5,3538,3540,5,3544,3550,7,3570,3571,7,3635,3635,7,3655,3662,5,3763,3763,7,3784,3789,5,3893,3893,5,3897,3897,5,3953,3966,5,3968,3972,5,3981,3991,5,4038,4038,5,4145,4145,7,4153,4154,5,4157,4158,5,4184,4185,5,4209,4212,5,4228,4228,7,4237,4237,5,4352,4447,8,4520,4607,10,5906,5908,5,5938,5939,5,5970,5971,5,6068,6069,5,6071,6077,5,6086,6086,5,6089,6099,5,6155,6157,5,6159,6159,5,6313,6313,5,6435,6438,7,6441,6443,7,6450,6450,5,6457,6459,5,6681,6682,7,6741,6741,7,6743,6743,7,6752,6752,5,6757,6764,5,6771,6780,5,6832,6845,5,6847,6862,5,6916,6916,7,6965,6965,5,6971,6971,7,6973,6977,7,6979,6980,7,7040,7041,5,7073,7073,7,7078,7079,7,7082,7082,7,7142,7142,5,7144,7145,5,7149,7149,5,7151,7153,5,7204,7211,7,7220,7221,7,7376,7378,5,7393,7393,7,7405,7405,5,7415,7415,7,7616,7679,5,8204,8204,5,8206,8207,4,8233,8233,4,8252,8252,14,8288,8292,4,8294,8303,4,8413,8416,5,8418,8420,5,8482,8482,14,8596,8601,14,8986,8987,14,9096,9096,14,9193,9196,14,9199,9199,14,9201,9202,14,9208,9210,14,9642,9643,14,9664,9664,14,9728,9729,14,9732,9732,14,9735,9741,14,9743,9744,14,9746,9746,14,9750,9751,14,9753,9756,14,9758,9759,14,9761,9761,14,9764,9765,14,9767,9769,14,9771,9773,14,9775,9775,14,9784,9785,14,9787,9791,14,9793,9793,14,9795,9799,14,9812,9822,14,9824,9824,14,9827,9827,14,9829,9830,14,9832,9832,14,9851,9851,14,9854,9854,14,9856,9861,14,9874,9874,14,9876,9876,14,9878,9879,14,9881,9881,14,9883,9884,14,9888,9889,14,9895,9895,14,9898,9899,14,9904,9905,14,9917,9918,14,9924,9925,14,9928,9928,14,9934,9934,14,9936,9936,14,9938,9938,14,9940,9940,14,9961,9961,14,9963,9967,14,9970,9971,14,9973,9973,14,9975,9977,14,9979,9980,14,9982,9985,14,9987,9988,14,9992,9996,14,9998,9998,14,10000,10001,14,10004,10004,14,10013,10013,14,10024,10024,14,10052,10052,14,10060,10060,14,10067,10069,14,10083,10083,14,10085,10087,14,10145,10145,14,10175,10175,14,11013,11015,14,11088,11088,14,11503,11505,5,11744,11775,5,12334,12335,5,12349,12349,14,12951,12951,14,42607,42607,5,42612,42621,5,42736,42737,5,43014,43014,5,43043,43044,7,43047,43047,7,43136,43137,7,43204,43205,5,43263,43263,5,43335,43345,5,43360,43388,8,43395,43395,7,43444,43445,7,43450,43451,7,43454,43456,7,43561,43566,5,43569,43570,5,43573,43574,5,43596,43596,5,43644,43644,5,43698,43700,5,43710,43711,5,43755,43755,7,43758,43759,7,43766,43766,5,44005,44005,5,44008,44008,5,44012,44012,7,44032,44032,11,44060,44060,11,44088,44088,11,44116,44116,11,44144,44144,11,44172,44172,11,44200,44200,11,44228,44228,11,44256,44256,11,44284,44284,11,44312,44312,11,44340,44340,11,44368,44368,11,44396,44396,11,44424,44424,11,44452,44452,11,44480,44480,11,44508,44508,11,44536,44536,11,44564,44564,11,44592,44592,11,44620,44620,11,44648,44648,11,44676,44676,11,44704,44704,11,44732,44732,11,44760,44760,11,44788,44788,11,44816,44816,11,44844,44844,11,44872,44872,11,44900,44900,11,44928,44928,11,44956,44956,11,44984,44984,11,45012,45012,11,45040,45040,11,45068,45068,11,45096,45096,11,45124,45124,11,45152,45152,11,45180,45180,11,45208,45208,11,45236,45236,11,45264,45264,11,45292,45292,11,45320,45320,11,45348,45348,11,45376,45376,11,45404,45404,11,45432,45432,11,45460,45460,11,45488,45488,11,45516,45516,11,45544,45544,11,45572,45572,11,45600,45600,11,45628,45628,11,45656,45656,11,45684,45684,11,45712,45712,11,45740,45740,11,45768,45768,11,45796,45796,11,45824,45824,11,45852,45852,11,45880,45880,11,45908,45908,11,45936,45936,11,45964,45964,11,45992,45992,11,46020,46020,11,46048,46048,11,46076,46076,11,46104,46104,11,46132,46132,11,46160,46160,11,46188,46188,11,46216,46216,11,46244,46244,11,46272,46272,11,46300,46300,11,46328,46328,11,46356,46356,11,46384,46384,11,46412,46412,11,46440,46440,11,46468,46468,11,46496,46496,11,46524,46524,11,46552,46552,11,46580,46580,11,46608,46608,11,46636,46636,11,46664,46664,11,46692,46692,11,46720,46720,11,46748,46748,11,46776,46776,11,46804,46804,11,46832,46832,11,46860,46860,11,46888,46888,11,46916,46916,11,46944,46944,11,46972,46972,11,47000,47000,11,47028,47028,11,47056,47056,11,47084,47084,11,47112,47112,11,47140,47140,11,47168,47168,11,47196,47196,11,47224,47224,11,47252,47252,11,47280,47280,11,47308,47308,11,47336,47336,11,47364,47364,11,47392,47392,11,47420,47420,11,47448,47448,11,47476,47476,11,47504,47504,11,47532,47532,11,47560,47560,11,47588,47588,11,47616,47616,11,47644,47644,11,47672,47672,11,47700,47700,11,47728,47728,11,47756,47756,11,47784,47784,11,47812,47812,11,47840,47840,11,47868,47868,11,47896,47896,11,47924,47924,11,47952,47952,11,47980,47980,11,48008,48008,11,48036,48036,11,48064,48064,11,48092,48092,11,48120,48120,11,48148,48148,11,48176,48176,11,48204,48204,11,48232,48232,11,48260,48260,11,48288,48288,11,48316,48316,11,48344,48344,11,48372,48372,11,48400,48400,11,48428,48428,11,48456,48456,11,48484,48484,11,48512,48512,11,48540,48540,11,48568,48568,11,48596,48596,11,48624,48624,11,48652,48652,11,48680,48680,11,48708,48708,11,48736,48736,11,48764,48764,11,48792,48792,11,48820,48820,11,48848,48848,11,48876,48876,11,48904,48904,11,48932,48932,11,48960,48960,11,48988,48988,11,49016,49016,11,49044,49044,11,49072,49072,11,49100,49100,11,49128,49128,11,49156,49156,11,49184,49184,11,49212,49212,11,49240,49240,11,49268,49268,11,49296,49296,11,49324,49324,11,49352,49352,11,49380,49380,11,49408,49408,11,49436,49436,11,49464,49464,11,49492,49492,11,49520,49520,11,49548,49548,11,49576,49576,11,49604,49604,11,49632,49632,11,49660,49660,11,49688,49688,11,49716,49716,11,49744,49744,11,49772,49772,11,49800,49800,11,49828,49828,11,49856,49856,11,49884,49884,11,49912,49912,11,49940,49940,11,49968,49968,11,49996,49996,11,50024,50024,11,50052,50052,11,50080,50080,11,50108,50108,11,50136,50136,11,50164,50164,11,50192,50192,11,50220,50220,11,50248,50248,11,50276,50276,11,50304,50304,11,50332,50332,11,50360,50360,11,50388,50388,11,50416,50416,11,50444,50444,11,50472,50472,11,50500,50500,11,50528,50528,11,50556,50556,11,50584,50584,11,50612,50612,11,50640,50640,11,50668,50668,11,50696,50696,11,50724,50724,11,50752,50752,11,50780,50780,11,50808,50808,11,50836,50836,11,50864,50864,11,50892,50892,11,50920,50920,11,50948,50948,11,50976,50976,11,51004,51004,11,51032,51032,11,51060,51060,11,51088,51088,11,51116,51116,11,51144,51144,11,51172,51172,11,51200,51200,11,51228,51228,11,51256,51256,11,51284,51284,11,51312,51312,11,51340,51340,11,51368,51368,11,51396,51396,11,51424,51424,11,51452,51452,11,51480,51480,11,51508,51508,11,51536,51536,11,51564,51564,11,51592,51592,11,51620,51620,11,51648,51648,11,51676,51676,11,51704,51704,11,51732,51732,11,51760,51760,11,51788,51788,11,51816,51816,11,51844,51844,11,51872,51872,11,51900,51900,11,51928,51928,11,51956,51956,11,51984,51984,11,52012,52012,11,52040,52040,11,52068,52068,11,52096,52096,11,52124,52124,11,52152,52152,11,52180,52180,11,52208,52208,11,52236,52236,11,52264,52264,11,52292,52292,11,52320,52320,11,52348,52348,11,52376,52376,11,52404,52404,11,52432,52432,11,52460,52460,11,52488,52488,11,52516,52516,11,52544,52544,11,52572,52572,11,52600,52600,11,52628,52628,11,52656,52656,11,52684,52684,11,52712,52712,11,52740,52740,11,52768,52768,11,52796,52796,11,52824,52824,11,52852,52852,11,52880,52880,11,52908,52908,11,52936,52936,11,52964,52964,11,52992,52992,11,53020,53020,11,53048,53048,11,53076,53076,11,53104,53104,11,53132,53132,11,53160,53160,11,53188,53188,11,53216,53216,11,53244,53244,11,53272,53272,11,53300,53300,11,53328,53328,11,53356,53356,11,53384,53384,11,53412,53412,11,53440,53440,11,53468,53468,11,53496,53496,11,53524,53524,11,53552,53552,11,53580,53580,11,53608,53608,11,53636,53636,11,53664,53664,11,53692,53692,11,53720,53720,11,53748,53748,11,53776,53776,11,53804,53804,11,53832,53832,11,53860,53860,11,53888,53888,11,53916,53916,11,53944,53944,11,53972,53972,11,54000,54000,11,54028,54028,11,54056,54056,11,54084,54084,11,54112,54112,11,54140,54140,11,54168,54168,11,54196,54196,11,54224,54224,11,54252,54252,11,54280,54280,11,54308,54308,11,54336,54336,11,54364,54364,11,54392,54392,11,54420,54420,11,54448,54448,11,54476,54476,11,54504,54504,11,54532,54532,11,54560,54560,11,54588,54588,11,54616,54616,11,54644,54644,11,54672,54672,11,54700,54700,11,54728,54728,11,54756,54756,11,54784,54784,11,54812,54812,11,54840,54840,11,54868,54868,11,54896,54896,11,54924,54924,11,54952,54952,11,54980,54980,11,55008,55008,11,55036,55036,11,55064,55064,11,55092,55092,11,55120,55120,11,55148,55148,11,55176,55176,11,55216,55238,9,64286,64286,5,65056,65071,5,65438,65439,5,65529,65531,4,66272,66272,5,68097,68099,5,68108,68111,5,68159,68159,5,68900,68903,5,69446,69456,5,69632,69632,7,69634,69634,7,69744,69744,5,69759,69761,5,69808,69810,7,69815,69816,7,69821,69821,1,69837,69837,1,69927,69931,5,69933,69940,5,70003,70003,5,70018,70018,7,70070,70078,5,70082,70083,1,70094,70094,7,70188,70190,7,70194,70195,7,70197,70197,7,70206,70206,5,70368,70370,7,70400,70401,5,70459,70460,5,70463,70463,7,70465,70468,7,70475,70477,7,70498,70499,7,70512,70516,5,70712,70719,5,70722,70724,5,70726,70726,5,70832,70832,5,70835,70840,5,70842,70842,5,70845,70845,5,70847,70848,5,70850,70851,5,71088,71089,7,71096,71099,7,71102,71102,7,71132,71133,5,71219,71226,5,71229,71229,5,71231,71232,5,71340,71340,7,71342,71343,7,71350,71350,7,71453,71455,5,71462,71462,7,71724,71726,7,71736,71736,7,71984,71984,5,71991,71992,7,71997,71997,7,71999,71999,1,72001,72001,1,72003,72003,5,72148,72151,5,72156,72159,7,72164,72164,7,72243,72248,5,72250,72250,1,72263,72263,5,72279,72280,7,72324,72329,1,72343,72343,7,72751,72751,7,72760,72765,5,72767,72767,5,72873,72873,7,72881,72881,7,72884,72884,7,73009,73014,5,73020,73021,5,73030,73030,1,73098,73102,7,73107,73108,7,73110,73110,7,73459,73460,5,78896,78904,4,92976,92982,5,94033,94087,7,94180,94180,5,113821,113822,5,118528,118573,5,119141,119141,5,119143,119145,5,119150,119154,5,119163,119170,5,119210,119213,5,121344,121398,5,121461,121461,5,121499,121503,5,122880,122886,5,122907,122913,5,122918,122922,5,123566,123566,5,125136,125142,5,126976,126979,14,126981,127182,14,127184,127231,14,127279,127279,14,127344,127345,14,127374,127374,14,127405,127461,14,127489,127490,14,127514,127514,14,127538,127546,14,127561,127567,14,127570,127743,14,127757,127758,14,127760,127760,14,127762,127762,14,127766,127768,14,127770,127770,14,127772,127772,14,127775,127776,14,127778,127779,14,127789,127791,14,127794,127795,14,127798,127798,14,127819,127819,14,127824,127824,14,127868,127868,14,127870,127871,14,127892,127893,14,127896,127896,14,127900,127901,14,127904,127940,14,127942,127942,14,127944,127944,14,127946,127946,14,127951,127955,14,127968,127971,14,127973,127984,14,127987,127987,14,127989,127989,14,127991,127991,14,127995,127999,5,128008,128008,14,128012,128014,14,128017,128018,14,128020,128020,14,128022,128022,14,128042,128042,14,128063,128063,14,128065,128065,14,128101,128101,14,128108,128109,14,128173,128173,14,128182,128183,14,128236,128237,14,128239,128239,14,128245,128245,14,128248,128248,14,128253,128253,14,128255,128258,14,128260,128263,14,128265,128265,14,128277,128277,14,128300,128301,14,128326,128328,14,128331,128334,14,128336,128347,14,128360,128366,14,128369,128370,14,128378,128378,14,128391,128391,14,128394,128397,14,128400,128400,14,128405,128406,14,128420,128420,14,128422,128423,14,128425,128432,14,128435,128443,14,128445,128449,14,128453,128464,14,128468,128475,14,128479,128480,14,128482,128482,14,128484,128487,14,128489,128494,14,128496,128498,14,128500,128505,14,128507,128511,14,128513,128518,14,128521,128525,14,128527,128527,14,128529,128529,14,128533,128533,14,128535,128535,14,128537,128537,14]"); } -function hq(s, e) { +function n$(s, e) { if (s === 0) return 0; - const t = uq(s, e); + const t = s$(s, e); if (t !== void 0) return t; - const i = new nE(e, s); + const i = new Cv(e, s); return i.prevCodePoint(), i.offset; } -function uq(s, e) { - const t = new nE(e, s); +function s$(s, e) { + const t = new Cv(e, s); let i = t.prevCodePoint(); - for (; gq(i) || i === 65039 || i === 8419; ) { + for (; o$(i) || i === 65039 || i === 8419; ) { if (t.offset === 0) return; i = t.prevCodePoint(); } - if (!oE(i)) + if (!Nv(i)) return; let n = t.offset; return n > 0 && t.prevCodePoint() === 8205 && (n = t.offset), n; } -function gq(s) { +function o$(s) { return 127995 <= s && s <= 127999; } -const PH = " ", ia = class ia { +const IB = " ", lc = class lc { static getInstance(e) { - return ia.cache.get(Array.from(e)); + return lc.cache.get(Array.from(e)); } static getLocales() { - return ia._locales.value; + return lc._locales.value; } constructor(e) { this.confusableDictionary = e; @@ -3325,60 +3325,60 @@ const PH = " ", ia = class ia { return new Set(this.confusableDictionary.keys()); } }; -ia.ambiguousCharacterData = new Wl(() => JSON.parse('{"_common":[8232,32,8233,32,5760,32,8192,32,8193,32,8194,32,8195,32,8196,32,8197,32,8198,32,8200,32,8201,32,8202,32,8287,32,8199,32,8239,32,2042,95,65101,95,65102,95,65103,95,8208,45,8209,45,8210,45,65112,45,1748,45,8259,45,727,45,8722,45,10134,45,11450,45,1549,44,1643,44,8218,44,184,44,42233,44,894,59,2307,58,2691,58,1417,58,1795,58,1796,58,5868,58,65072,58,6147,58,6153,58,8282,58,1475,58,760,58,42889,58,8758,58,720,58,42237,58,451,33,11601,33,660,63,577,63,2429,63,5038,63,42731,63,119149,46,8228,46,1793,46,1794,46,42510,46,68176,46,1632,46,1776,46,42232,46,1373,96,65287,96,8219,96,8242,96,1370,96,1523,96,8175,96,65344,96,900,96,8189,96,8125,96,8127,96,8190,96,697,96,884,96,712,96,714,96,715,96,756,96,699,96,701,96,700,96,702,96,42892,96,1497,96,2036,96,2037,96,5194,96,5836,96,94033,96,94034,96,65339,91,10088,40,10098,40,12308,40,64830,40,65341,93,10089,41,10099,41,12309,41,64831,41,10100,123,119060,123,10101,125,65342,94,8270,42,1645,42,8727,42,66335,42,5941,47,8257,47,8725,47,8260,47,9585,47,10187,47,10744,47,119354,47,12755,47,12339,47,11462,47,20031,47,12035,47,65340,92,65128,92,8726,92,10189,92,10741,92,10745,92,119311,92,119355,92,12756,92,20022,92,12034,92,42872,38,708,94,710,94,5869,43,10133,43,66203,43,8249,60,10094,60,706,60,119350,60,5176,60,5810,60,5120,61,11840,61,12448,61,42239,61,8250,62,10095,62,707,62,119351,62,5171,62,94015,62,8275,126,732,126,8128,126,8764,126,65372,124,65293,45,120784,50,120794,50,120804,50,120814,50,120824,50,130034,50,42842,50,423,50,1000,50,42564,50,5311,50,42735,50,119302,51,120785,51,120795,51,120805,51,120815,51,120825,51,130035,51,42923,51,540,51,439,51,42858,51,11468,51,1248,51,94011,51,71882,51,120786,52,120796,52,120806,52,120816,52,120826,52,130036,52,5070,52,71855,52,120787,53,120797,53,120807,53,120817,53,120827,53,130037,53,444,53,71867,53,120788,54,120798,54,120808,54,120818,54,120828,54,130038,54,11474,54,5102,54,71893,54,119314,55,120789,55,120799,55,120809,55,120819,55,120829,55,130039,55,66770,55,71878,55,2819,56,2538,56,2666,56,125131,56,120790,56,120800,56,120810,56,120820,56,120830,56,130040,56,547,56,546,56,66330,56,2663,57,2920,57,2541,57,3437,57,120791,57,120801,57,120811,57,120821,57,120831,57,130041,57,42862,57,11466,57,71884,57,71852,57,71894,57,9082,97,65345,97,119834,97,119886,97,119938,97,119990,97,120042,97,120094,97,120146,97,120198,97,120250,97,120302,97,120354,97,120406,97,120458,97,593,97,945,97,120514,97,120572,97,120630,97,120688,97,120746,97,65313,65,119808,65,119860,65,119912,65,119964,65,120016,65,120068,65,120120,65,120172,65,120224,65,120276,65,120328,65,120380,65,120432,65,913,65,120488,65,120546,65,120604,65,120662,65,120720,65,5034,65,5573,65,42222,65,94016,65,66208,65,119835,98,119887,98,119939,98,119991,98,120043,98,120095,98,120147,98,120199,98,120251,98,120303,98,120355,98,120407,98,120459,98,388,98,5071,98,5234,98,5551,98,65314,66,8492,66,119809,66,119861,66,119913,66,120017,66,120069,66,120121,66,120173,66,120225,66,120277,66,120329,66,120381,66,120433,66,42932,66,914,66,120489,66,120547,66,120605,66,120663,66,120721,66,5108,66,5623,66,42192,66,66178,66,66209,66,66305,66,65347,99,8573,99,119836,99,119888,99,119940,99,119992,99,120044,99,120096,99,120148,99,120200,99,120252,99,120304,99,120356,99,120408,99,120460,99,7428,99,1010,99,11429,99,43951,99,66621,99,128844,67,71922,67,71913,67,65315,67,8557,67,8450,67,8493,67,119810,67,119862,67,119914,67,119966,67,120018,67,120174,67,120226,67,120278,67,120330,67,120382,67,120434,67,1017,67,11428,67,5087,67,42202,67,66210,67,66306,67,66581,67,66844,67,8574,100,8518,100,119837,100,119889,100,119941,100,119993,100,120045,100,120097,100,120149,100,120201,100,120253,100,120305,100,120357,100,120409,100,120461,100,1281,100,5095,100,5231,100,42194,100,8558,68,8517,68,119811,68,119863,68,119915,68,119967,68,120019,68,120071,68,120123,68,120175,68,120227,68,120279,68,120331,68,120383,68,120435,68,5024,68,5598,68,5610,68,42195,68,8494,101,65349,101,8495,101,8519,101,119838,101,119890,101,119942,101,120046,101,120098,101,120150,101,120202,101,120254,101,120306,101,120358,101,120410,101,120462,101,43826,101,1213,101,8959,69,65317,69,8496,69,119812,69,119864,69,119916,69,120020,69,120072,69,120124,69,120176,69,120228,69,120280,69,120332,69,120384,69,120436,69,917,69,120492,69,120550,69,120608,69,120666,69,120724,69,11577,69,5036,69,42224,69,71846,69,71854,69,66182,69,119839,102,119891,102,119943,102,119995,102,120047,102,120099,102,120151,102,120203,102,120255,102,120307,102,120359,102,120411,102,120463,102,43829,102,42905,102,383,102,7837,102,1412,102,119315,70,8497,70,119813,70,119865,70,119917,70,120021,70,120073,70,120125,70,120177,70,120229,70,120281,70,120333,70,120385,70,120437,70,42904,70,988,70,120778,70,5556,70,42205,70,71874,70,71842,70,66183,70,66213,70,66853,70,65351,103,8458,103,119840,103,119892,103,119944,103,120048,103,120100,103,120152,103,120204,103,120256,103,120308,103,120360,103,120412,103,120464,103,609,103,7555,103,397,103,1409,103,119814,71,119866,71,119918,71,119970,71,120022,71,120074,71,120126,71,120178,71,120230,71,120282,71,120334,71,120386,71,120438,71,1292,71,5056,71,5107,71,42198,71,65352,104,8462,104,119841,104,119945,104,119997,104,120049,104,120101,104,120153,104,120205,104,120257,104,120309,104,120361,104,120413,104,120465,104,1211,104,1392,104,5058,104,65320,72,8459,72,8460,72,8461,72,119815,72,119867,72,119919,72,120023,72,120179,72,120231,72,120283,72,120335,72,120387,72,120439,72,919,72,120494,72,120552,72,120610,72,120668,72,120726,72,11406,72,5051,72,5500,72,42215,72,66255,72,731,105,9075,105,65353,105,8560,105,8505,105,8520,105,119842,105,119894,105,119946,105,119998,105,120050,105,120102,105,120154,105,120206,105,120258,105,120310,105,120362,105,120414,105,120466,105,120484,105,618,105,617,105,953,105,8126,105,890,105,120522,105,120580,105,120638,105,120696,105,120754,105,1110,105,42567,105,1231,105,43893,105,5029,105,71875,105,65354,106,8521,106,119843,106,119895,106,119947,106,119999,106,120051,106,120103,106,120155,106,120207,106,120259,106,120311,106,120363,106,120415,106,120467,106,1011,106,1112,106,65322,74,119817,74,119869,74,119921,74,119973,74,120025,74,120077,74,120129,74,120181,74,120233,74,120285,74,120337,74,120389,74,120441,74,42930,74,895,74,1032,74,5035,74,5261,74,42201,74,119844,107,119896,107,119948,107,120000,107,120052,107,120104,107,120156,107,120208,107,120260,107,120312,107,120364,107,120416,107,120468,107,8490,75,65323,75,119818,75,119870,75,119922,75,119974,75,120026,75,120078,75,120130,75,120182,75,120234,75,120286,75,120338,75,120390,75,120442,75,922,75,120497,75,120555,75,120613,75,120671,75,120729,75,11412,75,5094,75,5845,75,42199,75,66840,75,1472,108,8739,73,9213,73,65512,73,1633,108,1777,73,66336,108,125127,108,120783,73,120793,73,120803,73,120813,73,120823,73,130033,73,65321,73,8544,73,8464,73,8465,73,119816,73,119868,73,119920,73,120024,73,120128,73,120180,73,120232,73,120284,73,120336,73,120388,73,120440,73,65356,108,8572,73,8467,108,119845,108,119897,108,119949,108,120001,108,120053,108,120105,73,120157,73,120209,73,120261,73,120313,73,120365,73,120417,73,120469,73,448,73,120496,73,120554,73,120612,73,120670,73,120728,73,11410,73,1030,73,1216,73,1493,108,1503,108,1575,108,126464,108,126592,108,65166,108,65165,108,1994,108,11599,73,5825,73,42226,73,93992,73,66186,124,66313,124,119338,76,8556,76,8466,76,119819,76,119871,76,119923,76,120027,76,120079,76,120131,76,120183,76,120235,76,120287,76,120339,76,120391,76,120443,76,11472,76,5086,76,5290,76,42209,76,93974,76,71843,76,71858,76,66587,76,66854,76,65325,77,8559,77,8499,77,119820,77,119872,77,119924,77,120028,77,120080,77,120132,77,120184,77,120236,77,120288,77,120340,77,120392,77,120444,77,924,77,120499,77,120557,77,120615,77,120673,77,120731,77,1018,77,11416,77,5047,77,5616,77,5846,77,42207,77,66224,77,66321,77,119847,110,119899,110,119951,110,120003,110,120055,110,120107,110,120159,110,120211,110,120263,110,120315,110,120367,110,120419,110,120471,110,1400,110,1404,110,65326,78,8469,78,119821,78,119873,78,119925,78,119977,78,120029,78,120081,78,120185,78,120237,78,120289,78,120341,78,120393,78,120445,78,925,78,120500,78,120558,78,120616,78,120674,78,120732,78,11418,78,42208,78,66835,78,3074,111,3202,111,3330,111,3458,111,2406,111,2662,111,2790,111,3046,111,3174,111,3302,111,3430,111,3664,111,3792,111,4160,111,1637,111,1781,111,65359,111,8500,111,119848,111,119900,111,119952,111,120056,111,120108,111,120160,111,120212,111,120264,111,120316,111,120368,111,120420,111,120472,111,7439,111,7441,111,43837,111,959,111,120528,111,120586,111,120644,111,120702,111,120760,111,963,111,120532,111,120590,111,120648,111,120706,111,120764,111,11423,111,4351,111,1413,111,1505,111,1607,111,126500,111,126564,111,126596,111,65259,111,65260,111,65258,111,65257,111,1726,111,64428,111,64429,111,64427,111,64426,111,1729,111,64424,111,64425,111,64423,111,64422,111,1749,111,3360,111,4125,111,66794,111,71880,111,71895,111,66604,111,1984,79,2534,79,2918,79,12295,79,70864,79,71904,79,120782,79,120792,79,120802,79,120812,79,120822,79,130032,79,65327,79,119822,79,119874,79,119926,79,119978,79,120030,79,120082,79,120134,79,120186,79,120238,79,120290,79,120342,79,120394,79,120446,79,927,79,120502,79,120560,79,120618,79,120676,79,120734,79,11422,79,1365,79,11604,79,4816,79,2848,79,66754,79,42227,79,71861,79,66194,79,66219,79,66564,79,66838,79,9076,112,65360,112,119849,112,119901,112,119953,112,120005,112,120057,112,120109,112,120161,112,120213,112,120265,112,120317,112,120369,112,120421,112,120473,112,961,112,120530,112,120544,112,120588,112,120602,112,120646,112,120660,112,120704,112,120718,112,120762,112,120776,112,11427,112,65328,80,8473,80,119823,80,119875,80,119927,80,119979,80,120031,80,120083,80,120187,80,120239,80,120291,80,120343,80,120395,80,120447,80,929,80,120504,80,120562,80,120620,80,120678,80,120736,80,11426,80,5090,80,5229,80,42193,80,66197,80,119850,113,119902,113,119954,113,120006,113,120058,113,120110,113,120162,113,120214,113,120266,113,120318,113,120370,113,120422,113,120474,113,1307,113,1379,113,1382,113,8474,81,119824,81,119876,81,119928,81,119980,81,120032,81,120084,81,120188,81,120240,81,120292,81,120344,81,120396,81,120448,81,11605,81,119851,114,119903,114,119955,114,120007,114,120059,114,120111,114,120163,114,120215,114,120267,114,120319,114,120371,114,120423,114,120475,114,43847,114,43848,114,7462,114,11397,114,43905,114,119318,82,8475,82,8476,82,8477,82,119825,82,119877,82,119929,82,120033,82,120189,82,120241,82,120293,82,120345,82,120397,82,120449,82,422,82,5025,82,5074,82,66740,82,5511,82,42211,82,94005,82,65363,115,119852,115,119904,115,119956,115,120008,115,120060,115,120112,115,120164,115,120216,115,120268,115,120320,115,120372,115,120424,115,120476,115,42801,115,445,115,1109,115,43946,115,71873,115,66632,115,65331,83,119826,83,119878,83,119930,83,119982,83,120034,83,120086,83,120138,83,120190,83,120242,83,120294,83,120346,83,120398,83,120450,83,1029,83,1359,83,5077,83,5082,83,42210,83,94010,83,66198,83,66592,83,119853,116,119905,116,119957,116,120009,116,120061,116,120113,116,120165,116,120217,116,120269,116,120321,116,120373,116,120425,116,120477,116,8868,84,10201,84,128872,84,65332,84,119827,84,119879,84,119931,84,119983,84,120035,84,120087,84,120139,84,120191,84,120243,84,120295,84,120347,84,120399,84,120451,84,932,84,120507,84,120565,84,120623,84,120681,84,120739,84,11430,84,5026,84,42196,84,93962,84,71868,84,66199,84,66225,84,66325,84,119854,117,119906,117,119958,117,120010,117,120062,117,120114,117,120166,117,120218,117,120270,117,120322,117,120374,117,120426,117,120478,117,42911,117,7452,117,43854,117,43858,117,651,117,965,117,120534,117,120592,117,120650,117,120708,117,120766,117,1405,117,66806,117,71896,117,8746,85,8899,85,119828,85,119880,85,119932,85,119984,85,120036,85,120088,85,120140,85,120192,85,120244,85,120296,85,120348,85,120400,85,120452,85,1357,85,4608,85,66766,85,5196,85,42228,85,94018,85,71864,85,8744,118,8897,118,65366,118,8564,118,119855,118,119907,118,119959,118,120011,118,120063,118,120115,118,120167,118,120219,118,120271,118,120323,118,120375,118,120427,118,120479,118,7456,118,957,118,120526,118,120584,118,120642,118,120700,118,120758,118,1141,118,1496,118,71430,118,43945,118,71872,118,119309,86,1639,86,1783,86,8548,86,119829,86,119881,86,119933,86,119985,86,120037,86,120089,86,120141,86,120193,86,120245,86,120297,86,120349,86,120401,86,120453,86,1140,86,11576,86,5081,86,5167,86,42719,86,42214,86,93960,86,71840,86,66845,86,623,119,119856,119,119908,119,119960,119,120012,119,120064,119,120116,119,120168,119,120220,119,120272,119,120324,119,120376,119,120428,119,120480,119,7457,119,1121,119,1309,119,1377,119,71434,119,71438,119,71439,119,43907,119,71919,87,71910,87,119830,87,119882,87,119934,87,119986,87,120038,87,120090,87,120142,87,120194,87,120246,87,120298,87,120350,87,120402,87,120454,87,1308,87,5043,87,5076,87,42218,87,5742,120,10539,120,10540,120,10799,120,65368,120,8569,120,119857,120,119909,120,119961,120,120013,120,120065,120,120117,120,120169,120,120221,120,120273,120,120325,120,120377,120,120429,120,120481,120,5441,120,5501,120,5741,88,9587,88,66338,88,71916,88,65336,88,8553,88,119831,88,119883,88,119935,88,119987,88,120039,88,120091,88,120143,88,120195,88,120247,88,120299,88,120351,88,120403,88,120455,88,42931,88,935,88,120510,88,120568,88,120626,88,120684,88,120742,88,11436,88,11613,88,5815,88,42219,88,66192,88,66228,88,66327,88,66855,88,611,121,7564,121,65369,121,119858,121,119910,121,119962,121,120014,121,120066,121,120118,121,120170,121,120222,121,120274,121,120326,121,120378,121,120430,121,120482,121,655,121,7935,121,43866,121,947,121,8509,121,120516,121,120574,121,120632,121,120690,121,120748,121,1199,121,4327,121,71900,121,65337,89,119832,89,119884,89,119936,89,119988,89,120040,89,120092,89,120144,89,120196,89,120248,89,120300,89,120352,89,120404,89,120456,89,933,89,978,89,120508,89,120566,89,120624,89,120682,89,120740,89,11432,89,1198,89,5033,89,5053,89,42220,89,94019,89,71844,89,66226,89,119859,122,119911,122,119963,122,120015,122,120067,122,120119,122,120171,122,120223,122,120275,122,120327,122,120379,122,120431,122,120483,122,7458,122,43923,122,71876,122,66293,90,71909,90,65338,90,8484,90,8488,90,119833,90,119885,90,119937,90,119989,90,120041,90,120197,90,120249,90,120301,90,120353,90,120405,90,120457,90,918,90,120493,90,120551,90,120609,90,120667,90,120725,90,5059,90,42204,90,71849,90,65282,34,65284,36,65285,37,65286,38,65290,42,65291,43,65294,46,65295,47,65296,48,65297,49,65298,50,65299,51,65300,52,65301,53,65302,54,65303,55,65304,56,65305,57,65308,60,65309,61,65310,62,65312,64,65316,68,65318,70,65319,71,65324,76,65329,81,65330,82,65333,85,65334,86,65335,87,65343,95,65346,98,65348,100,65350,102,65355,107,65357,109,65358,110,65361,113,65362,114,65364,116,65365,117,65367,119,65370,122,65371,123,65373,125,119846,109],"_default":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"cs":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"de":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"es":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"fr":[65374,126,65306,58,65281,33,8216,96,8245,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"it":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ja":[8211,45,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65292,44,65307,59],"ko":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pl":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pt-BR":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"qps-ploc":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ru":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,305,105,921,73,1009,112,215,120,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"tr":[160,32,8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"zh-hans":[65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41],"zh-hant":[8211,45,65374,126,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65307,59]}')), ia.cache = new j6({ getCacheKey: JSON.stringify }, (e) => { - function t(d) { +lc.ambiguousCharacterData = new Yr(() => JSON.parse('{"_common":[8232,32,8233,32,5760,32,8192,32,8193,32,8194,32,8195,32,8196,32,8197,32,8198,32,8200,32,8201,32,8202,32,8287,32,8199,32,8239,32,2042,95,65101,95,65102,95,65103,95,8208,45,8209,45,8210,45,65112,45,1748,45,8259,45,727,45,8722,45,10134,45,11450,45,1549,44,1643,44,8218,44,184,44,42233,44,894,59,2307,58,2691,58,1417,58,1795,58,1796,58,5868,58,65072,58,6147,58,6153,58,8282,58,1475,58,760,58,42889,58,8758,58,720,58,42237,58,451,33,11601,33,660,63,577,63,2429,63,5038,63,42731,63,119149,46,8228,46,1793,46,1794,46,42510,46,68176,46,1632,46,1776,46,42232,46,1373,96,65287,96,8219,96,8242,96,1370,96,1523,96,8175,96,65344,96,900,96,8189,96,8125,96,8127,96,8190,96,697,96,884,96,712,96,714,96,715,96,756,96,699,96,701,96,700,96,702,96,42892,96,1497,96,2036,96,2037,96,5194,96,5836,96,94033,96,94034,96,65339,91,10088,40,10098,40,12308,40,64830,40,65341,93,10089,41,10099,41,12309,41,64831,41,10100,123,119060,123,10101,125,65342,94,8270,42,1645,42,8727,42,66335,42,5941,47,8257,47,8725,47,8260,47,9585,47,10187,47,10744,47,119354,47,12755,47,12339,47,11462,47,20031,47,12035,47,65340,92,65128,92,8726,92,10189,92,10741,92,10745,92,119311,92,119355,92,12756,92,20022,92,12034,92,42872,38,708,94,710,94,5869,43,10133,43,66203,43,8249,60,10094,60,706,60,119350,60,5176,60,5810,60,5120,61,11840,61,12448,61,42239,61,8250,62,10095,62,707,62,119351,62,5171,62,94015,62,8275,126,732,126,8128,126,8764,126,65372,124,65293,45,120784,50,120794,50,120804,50,120814,50,120824,50,130034,50,42842,50,423,50,1000,50,42564,50,5311,50,42735,50,119302,51,120785,51,120795,51,120805,51,120815,51,120825,51,130035,51,42923,51,540,51,439,51,42858,51,11468,51,1248,51,94011,51,71882,51,120786,52,120796,52,120806,52,120816,52,120826,52,130036,52,5070,52,71855,52,120787,53,120797,53,120807,53,120817,53,120827,53,130037,53,444,53,71867,53,120788,54,120798,54,120808,54,120818,54,120828,54,130038,54,11474,54,5102,54,71893,54,119314,55,120789,55,120799,55,120809,55,120819,55,120829,55,130039,55,66770,55,71878,55,2819,56,2538,56,2666,56,125131,56,120790,56,120800,56,120810,56,120820,56,120830,56,130040,56,547,56,546,56,66330,56,2663,57,2920,57,2541,57,3437,57,120791,57,120801,57,120811,57,120821,57,120831,57,130041,57,42862,57,11466,57,71884,57,71852,57,71894,57,9082,97,65345,97,119834,97,119886,97,119938,97,119990,97,120042,97,120094,97,120146,97,120198,97,120250,97,120302,97,120354,97,120406,97,120458,97,593,97,945,97,120514,97,120572,97,120630,97,120688,97,120746,97,65313,65,119808,65,119860,65,119912,65,119964,65,120016,65,120068,65,120120,65,120172,65,120224,65,120276,65,120328,65,120380,65,120432,65,913,65,120488,65,120546,65,120604,65,120662,65,120720,65,5034,65,5573,65,42222,65,94016,65,66208,65,119835,98,119887,98,119939,98,119991,98,120043,98,120095,98,120147,98,120199,98,120251,98,120303,98,120355,98,120407,98,120459,98,388,98,5071,98,5234,98,5551,98,65314,66,8492,66,119809,66,119861,66,119913,66,120017,66,120069,66,120121,66,120173,66,120225,66,120277,66,120329,66,120381,66,120433,66,42932,66,914,66,120489,66,120547,66,120605,66,120663,66,120721,66,5108,66,5623,66,42192,66,66178,66,66209,66,66305,66,65347,99,8573,99,119836,99,119888,99,119940,99,119992,99,120044,99,120096,99,120148,99,120200,99,120252,99,120304,99,120356,99,120408,99,120460,99,7428,99,1010,99,11429,99,43951,99,66621,99,128844,67,71922,67,71913,67,65315,67,8557,67,8450,67,8493,67,119810,67,119862,67,119914,67,119966,67,120018,67,120174,67,120226,67,120278,67,120330,67,120382,67,120434,67,1017,67,11428,67,5087,67,42202,67,66210,67,66306,67,66581,67,66844,67,8574,100,8518,100,119837,100,119889,100,119941,100,119993,100,120045,100,120097,100,120149,100,120201,100,120253,100,120305,100,120357,100,120409,100,120461,100,1281,100,5095,100,5231,100,42194,100,8558,68,8517,68,119811,68,119863,68,119915,68,119967,68,120019,68,120071,68,120123,68,120175,68,120227,68,120279,68,120331,68,120383,68,120435,68,5024,68,5598,68,5610,68,42195,68,8494,101,65349,101,8495,101,8519,101,119838,101,119890,101,119942,101,120046,101,120098,101,120150,101,120202,101,120254,101,120306,101,120358,101,120410,101,120462,101,43826,101,1213,101,8959,69,65317,69,8496,69,119812,69,119864,69,119916,69,120020,69,120072,69,120124,69,120176,69,120228,69,120280,69,120332,69,120384,69,120436,69,917,69,120492,69,120550,69,120608,69,120666,69,120724,69,11577,69,5036,69,42224,69,71846,69,71854,69,66182,69,119839,102,119891,102,119943,102,119995,102,120047,102,120099,102,120151,102,120203,102,120255,102,120307,102,120359,102,120411,102,120463,102,43829,102,42905,102,383,102,7837,102,1412,102,119315,70,8497,70,119813,70,119865,70,119917,70,120021,70,120073,70,120125,70,120177,70,120229,70,120281,70,120333,70,120385,70,120437,70,42904,70,988,70,120778,70,5556,70,42205,70,71874,70,71842,70,66183,70,66213,70,66853,70,65351,103,8458,103,119840,103,119892,103,119944,103,120048,103,120100,103,120152,103,120204,103,120256,103,120308,103,120360,103,120412,103,120464,103,609,103,7555,103,397,103,1409,103,119814,71,119866,71,119918,71,119970,71,120022,71,120074,71,120126,71,120178,71,120230,71,120282,71,120334,71,120386,71,120438,71,1292,71,5056,71,5107,71,42198,71,65352,104,8462,104,119841,104,119945,104,119997,104,120049,104,120101,104,120153,104,120205,104,120257,104,120309,104,120361,104,120413,104,120465,104,1211,104,1392,104,5058,104,65320,72,8459,72,8460,72,8461,72,119815,72,119867,72,119919,72,120023,72,120179,72,120231,72,120283,72,120335,72,120387,72,120439,72,919,72,120494,72,120552,72,120610,72,120668,72,120726,72,11406,72,5051,72,5500,72,42215,72,66255,72,731,105,9075,105,65353,105,8560,105,8505,105,8520,105,119842,105,119894,105,119946,105,119998,105,120050,105,120102,105,120154,105,120206,105,120258,105,120310,105,120362,105,120414,105,120466,105,120484,105,618,105,617,105,953,105,8126,105,890,105,120522,105,120580,105,120638,105,120696,105,120754,105,1110,105,42567,105,1231,105,43893,105,5029,105,71875,105,65354,106,8521,106,119843,106,119895,106,119947,106,119999,106,120051,106,120103,106,120155,106,120207,106,120259,106,120311,106,120363,106,120415,106,120467,106,1011,106,1112,106,65322,74,119817,74,119869,74,119921,74,119973,74,120025,74,120077,74,120129,74,120181,74,120233,74,120285,74,120337,74,120389,74,120441,74,42930,74,895,74,1032,74,5035,74,5261,74,42201,74,119844,107,119896,107,119948,107,120000,107,120052,107,120104,107,120156,107,120208,107,120260,107,120312,107,120364,107,120416,107,120468,107,8490,75,65323,75,119818,75,119870,75,119922,75,119974,75,120026,75,120078,75,120130,75,120182,75,120234,75,120286,75,120338,75,120390,75,120442,75,922,75,120497,75,120555,75,120613,75,120671,75,120729,75,11412,75,5094,75,5845,75,42199,75,66840,75,1472,108,8739,73,9213,73,65512,73,1633,108,1777,73,66336,108,125127,108,120783,73,120793,73,120803,73,120813,73,120823,73,130033,73,65321,73,8544,73,8464,73,8465,73,119816,73,119868,73,119920,73,120024,73,120128,73,120180,73,120232,73,120284,73,120336,73,120388,73,120440,73,65356,108,8572,73,8467,108,119845,108,119897,108,119949,108,120001,108,120053,108,120105,73,120157,73,120209,73,120261,73,120313,73,120365,73,120417,73,120469,73,448,73,120496,73,120554,73,120612,73,120670,73,120728,73,11410,73,1030,73,1216,73,1493,108,1503,108,1575,108,126464,108,126592,108,65166,108,65165,108,1994,108,11599,73,5825,73,42226,73,93992,73,66186,124,66313,124,119338,76,8556,76,8466,76,119819,76,119871,76,119923,76,120027,76,120079,76,120131,76,120183,76,120235,76,120287,76,120339,76,120391,76,120443,76,11472,76,5086,76,5290,76,42209,76,93974,76,71843,76,71858,76,66587,76,66854,76,65325,77,8559,77,8499,77,119820,77,119872,77,119924,77,120028,77,120080,77,120132,77,120184,77,120236,77,120288,77,120340,77,120392,77,120444,77,924,77,120499,77,120557,77,120615,77,120673,77,120731,77,1018,77,11416,77,5047,77,5616,77,5846,77,42207,77,66224,77,66321,77,119847,110,119899,110,119951,110,120003,110,120055,110,120107,110,120159,110,120211,110,120263,110,120315,110,120367,110,120419,110,120471,110,1400,110,1404,110,65326,78,8469,78,119821,78,119873,78,119925,78,119977,78,120029,78,120081,78,120185,78,120237,78,120289,78,120341,78,120393,78,120445,78,925,78,120500,78,120558,78,120616,78,120674,78,120732,78,11418,78,42208,78,66835,78,3074,111,3202,111,3330,111,3458,111,2406,111,2662,111,2790,111,3046,111,3174,111,3302,111,3430,111,3664,111,3792,111,4160,111,1637,111,1781,111,65359,111,8500,111,119848,111,119900,111,119952,111,120056,111,120108,111,120160,111,120212,111,120264,111,120316,111,120368,111,120420,111,120472,111,7439,111,7441,111,43837,111,959,111,120528,111,120586,111,120644,111,120702,111,120760,111,963,111,120532,111,120590,111,120648,111,120706,111,120764,111,11423,111,4351,111,1413,111,1505,111,1607,111,126500,111,126564,111,126596,111,65259,111,65260,111,65258,111,65257,111,1726,111,64428,111,64429,111,64427,111,64426,111,1729,111,64424,111,64425,111,64423,111,64422,111,1749,111,3360,111,4125,111,66794,111,71880,111,71895,111,66604,111,1984,79,2534,79,2918,79,12295,79,70864,79,71904,79,120782,79,120792,79,120802,79,120812,79,120822,79,130032,79,65327,79,119822,79,119874,79,119926,79,119978,79,120030,79,120082,79,120134,79,120186,79,120238,79,120290,79,120342,79,120394,79,120446,79,927,79,120502,79,120560,79,120618,79,120676,79,120734,79,11422,79,1365,79,11604,79,4816,79,2848,79,66754,79,42227,79,71861,79,66194,79,66219,79,66564,79,66838,79,9076,112,65360,112,119849,112,119901,112,119953,112,120005,112,120057,112,120109,112,120161,112,120213,112,120265,112,120317,112,120369,112,120421,112,120473,112,961,112,120530,112,120544,112,120588,112,120602,112,120646,112,120660,112,120704,112,120718,112,120762,112,120776,112,11427,112,65328,80,8473,80,119823,80,119875,80,119927,80,119979,80,120031,80,120083,80,120187,80,120239,80,120291,80,120343,80,120395,80,120447,80,929,80,120504,80,120562,80,120620,80,120678,80,120736,80,11426,80,5090,80,5229,80,42193,80,66197,80,119850,113,119902,113,119954,113,120006,113,120058,113,120110,113,120162,113,120214,113,120266,113,120318,113,120370,113,120422,113,120474,113,1307,113,1379,113,1382,113,8474,81,119824,81,119876,81,119928,81,119980,81,120032,81,120084,81,120188,81,120240,81,120292,81,120344,81,120396,81,120448,81,11605,81,119851,114,119903,114,119955,114,120007,114,120059,114,120111,114,120163,114,120215,114,120267,114,120319,114,120371,114,120423,114,120475,114,43847,114,43848,114,7462,114,11397,114,43905,114,119318,82,8475,82,8476,82,8477,82,119825,82,119877,82,119929,82,120033,82,120189,82,120241,82,120293,82,120345,82,120397,82,120449,82,422,82,5025,82,5074,82,66740,82,5511,82,42211,82,94005,82,65363,115,119852,115,119904,115,119956,115,120008,115,120060,115,120112,115,120164,115,120216,115,120268,115,120320,115,120372,115,120424,115,120476,115,42801,115,445,115,1109,115,43946,115,71873,115,66632,115,65331,83,119826,83,119878,83,119930,83,119982,83,120034,83,120086,83,120138,83,120190,83,120242,83,120294,83,120346,83,120398,83,120450,83,1029,83,1359,83,5077,83,5082,83,42210,83,94010,83,66198,83,66592,83,119853,116,119905,116,119957,116,120009,116,120061,116,120113,116,120165,116,120217,116,120269,116,120321,116,120373,116,120425,116,120477,116,8868,84,10201,84,128872,84,65332,84,119827,84,119879,84,119931,84,119983,84,120035,84,120087,84,120139,84,120191,84,120243,84,120295,84,120347,84,120399,84,120451,84,932,84,120507,84,120565,84,120623,84,120681,84,120739,84,11430,84,5026,84,42196,84,93962,84,71868,84,66199,84,66225,84,66325,84,119854,117,119906,117,119958,117,120010,117,120062,117,120114,117,120166,117,120218,117,120270,117,120322,117,120374,117,120426,117,120478,117,42911,117,7452,117,43854,117,43858,117,651,117,965,117,120534,117,120592,117,120650,117,120708,117,120766,117,1405,117,66806,117,71896,117,8746,85,8899,85,119828,85,119880,85,119932,85,119984,85,120036,85,120088,85,120140,85,120192,85,120244,85,120296,85,120348,85,120400,85,120452,85,1357,85,4608,85,66766,85,5196,85,42228,85,94018,85,71864,85,8744,118,8897,118,65366,118,8564,118,119855,118,119907,118,119959,118,120011,118,120063,118,120115,118,120167,118,120219,118,120271,118,120323,118,120375,118,120427,118,120479,118,7456,118,957,118,120526,118,120584,118,120642,118,120700,118,120758,118,1141,118,1496,118,71430,118,43945,118,71872,118,119309,86,1639,86,1783,86,8548,86,119829,86,119881,86,119933,86,119985,86,120037,86,120089,86,120141,86,120193,86,120245,86,120297,86,120349,86,120401,86,120453,86,1140,86,11576,86,5081,86,5167,86,42719,86,42214,86,93960,86,71840,86,66845,86,623,119,119856,119,119908,119,119960,119,120012,119,120064,119,120116,119,120168,119,120220,119,120272,119,120324,119,120376,119,120428,119,120480,119,7457,119,1121,119,1309,119,1377,119,71434,119,71438,119,71439,119,43907,119,71919,87,71910,87,119830,87,119882,87,119934,87,119986,87,120038,87,120090,87,120142,87,120194,87,120246,87,120298,87,120350,87,120402,87,120454,87,1308,87,5043,87,5076,87,42218,87,5742,120,10539,120,10540,120,10799,120,65368,120,8569,120,119857,120,119909,120,119961,120,120013,120,120065,120,120117,120,120169,120,120221,120,120273,120,120325,120,120377,120,120429,120,120481,120,5441,120,5501,120,5741,88,9587,88,66338,88,71916,88,65336,88,8553,88,119831,88,119883,88,119935,88,119987,88,120039,88,120091,88,120143,88,120195,88,120247,88,120299,88,120351,88,120403,88,120455,88,42931,88,935,88,120510,88,120568,88,120626,88,120684,88,120742,88,11436,88,11613,88,5815,88,42219,88,66192,88,66228,88,66327,88,66855,88,611,121,7564,121,65369,121,119858,121,119910,121,119962,121,120014,121,120066,121,120118,121,120170,121,120222,121,120274,121,120326,121,120378,121,120430,121,120482,121,655,121,7935,121,43866,121,947,121,8509,121,120516,121,120574,121,120632,121,120690,121,120748,121,1199,121,4327,121,71900,121,65337,89,119832,89,119884,89,119936,89,119988,89,120040,89,120092,89,120144,89,120196,89,120248,89,120300,89,120352,89,120404,89,120456,89,933,89,978,89,120508,89,120566,89,120624,89,120682,89,120740,89,11432,89,1198,89,5033,89,5053,89,42220,89,94019,89,71844,89,66226,89,119859,122,119911,122,119963,122,120015,122,120067,122,120119,122,120171,122,120223,122,120275,122,120327,122,120379,122,120431,122,120483,122,7458,122,43923,122,71876,122,66293,90,71909,90,65338,90,8484,90,8488,90,119833,90,119885,90,119937,90,119989,90,120041,90,120197,90,120249,90,120301,90,120353,90,120405,90,120457,90,918,90,120493,90,120551,90,120609,90,120667,90,120725,90,5059,90,42204,90,71849,90,65282,34,65284,36,65285,37,65286,38,65290,42,65291,43,65294,46,65295,47,65296,48,65297,49,65298,50,65299,51,65300,52,65301,53,65302,54,65303,55,65304,56,65305,57,65308,60,65309,61,65310,62,65312,64,65316,68,65318,70,65319,71,65324,76,65329,81,65330,82,65333,85,65334,86,65335,87,65343,95,65346,98,65348,100,65350,102,65355,107,65357,109,65358,110,65361,113,65362,114,65364,116,65365,117,65367,119,65370,122,65371,123,65373,125,119846,109],"_default":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"cs":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"de":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"es":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"fr":[65374,126,65306,58,65281,33,8216,96,8245,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"it":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ja":[8211,45,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65292,44,65307,59],"ko":[8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pl":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"pt-BR":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"qps-ploc":[160,32,8211,45,65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"ru":[65374,126,65306,58,65281,33,8216,96,8217,96,8245,96,180,96,12494,47,305,105,921,73,1009,112,215,120,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"tr":[160,32,8211,45,65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65288,40,65289,41,65292,44,65307,59,65311,63],"zh-hans":[65374,126,65306,58,65281,33,8245,96,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65288,40,65289,41],"zh-hant":[8211,45,65374,126,180,96,12494,47,1047,51,1073,54,1072,97,1040,65,1068,98,1042,66,1089,99,1057,67,1077,101,1045,69,1053,72,305,105,1050,75,921,73,1052,77,1086,111,1054,79,1009,112,1088,112,1056,80,1075,114,1058,84,215,120,1093,120,1061,88,1091,121,1059,89,65283,35,65307,59]}')), lc.cache = new Aq({ getCacheKey: JSON.stringify }, (e) => { + function t(a) { const h = /* @__PURE__ */ new Map(); - for (let u = 0; u < d.length; u += 2) - h.set(d[u], d[u + 1]); + for (let u = 0; u < a.length; u += 2) + h.set(a[u], a[u + 1]); return h; } - function i(d, h) { - const u = new Map(d); - for (const [g, m] of h) - u.set(g, m); + function i(a, h) { + const u = new Map(a); + for (const [m, b] of h) + u.set(m, b); return u; } - function n(d, h) { - if (!d) + function n(a, h) { + if (!a) return h; const u = /* @__PURE__ */ new Map(); - for (const [g, m] of d) - h.has(g) && u.set(g, m); + for (const [m, b] of a) + h.has(m) && u.set(m, b); return u; } - const o = ia.ambiguousCharacterData.value; - let r = e.filter((d) => !d.startsWith("_") && d in o); - r.length === 0 && (r = ["_default"]); - let l; - for (const d of r) { - const h = t(o[d]); - l = n(l, h); - } - const a = t(o._common), c = i(a, l); - return new ia(c); -}), ia._locales = new Wl(() => Object.keys(ia.ambiguousCharacterData.value).filter((e) => !e.startsWith("_"))); -let Tw = ia; -const sf = class sf { + const o = lc.ambiguousCharacterData.value; + let l = e.filter((a) => !a.startsWith("_") && a in o); + l.length === 0 && (l = ["_default"]); + let r; + for (const a of l) { + const h = t(o[a]); + r = n(r, h); + } + const c = t(o._common), d = i(c, r); + return new lc(d); +}), lc._locales = new Yr(() => Object.keys(lc.ambiguousCharacterData.value).filter((e) => !e.startsWith("_"))); +let Ky = lc; +const ag = class ag { static getRawData() { return JSON.parse("[9,10,11,12,13,32,127,160,173,847,1564,4447,4448,6068,6069,6155,6156,6157,6158,7355,7356,8192,8193,8194,8195,8196,8197,8198,8199,8200,8201,8202,8203,8204,8205,8206,8207,8234,8235,8236,8237,8238,8239,8287,8288,8289,8290,8291,8292,8293,8294,8295,8296,8297,8298,8299,8300,8301,8302,8303,10240,12288,12644,65024,65025,65026,65027,65028,65029,65030,65031,65032,65033,65034,65035,65036,65037,65038,65039,65279,65440,65520,65521,65522,65523,65524,65525,65526,65527,65528,65532,78844,119155,119156,119157,119158,119159,119160,119161,119162,917504,917505,917506,917507,917508,917509,917510,917511,917512,917513,917514,917515,917516,917517,917518,917519,917520,917521,917522,917523,917524,917525,917526,917527,917528,917529,917530,917531,917532,917533,917534,917535,917536,917537,917538,917539,917540,917541,917542,917543,917544,917545,917546,917547,917548,917549,917550,917551,917552,917553,917554,917555,917556,917557,917558,917559,917560,917561,917562,917563,917564,917565,917566,917567,917568,917569,917570,917571,917572,917573,917574,917575,917576,917577,917578,917579,917580,917581,917582,917583,917584,917585,917586,917587,917588,917589,917590,917591,917592,917593,917594,917595,917596,917597,917598,917599,917600,917601,917602,917603,917604,917605,917606,917607,917608,917609,917610,917611,917612,917613,917614,917615,917616,917617,917618,917619,917620,917621,917622,917623,917624,917625,917626,917627,917628,917629,917630,917631,917760,917761,917762,917763,917764,917765,917766,917767,917768,917769,917770,917771,917772,917773,917774,917775,917776,917777,917778,917779,917780,917781,917782,917783,917784,917785,917786,917787,917788,917789,917790,917791,917792,917793,917794,917795,917796,917797,917798,917799,917800,917801,917802,917803,917804,917805,917806,917807,917808,917809,917810,917811,917812,917813,917814,917815,917816,917817,917818,917819,917820,917821,917822,917823,917824,917825,917826,917827,917828,917829,917830,917831,917832,917833,917834,917835,917836,917837,917838,917839,917840,917841,917842,917843,917844,917845,917846,917847,917848,917849,917850,917851,917852,917853,917854,917855,917856,917857,917858,917859,917860,917861,917862,917863,917864,917865,917866,917867,917868,917869,917870,917871,917872,917873,917874,917875,917876,917877,917878,917879,917880,917881,917882,917883,917884,917885,917886,917887,917888,917889,917890,917891,917892,917893,917894,917895,917896,917897,917898,917899,917900,917901,917902,917903,917904,917905,917906,917907,917908,917909,917910,917911,917912,917913,917914,917915,917916,917917,917918,917919,917920,917921,917922,917923,917924,917925,917926,917927,917928,917929,917930,917931,917932,917933,917934,917935,917936,917937,917938,917939,917940,917941,917942,917943,917944,917945,917946,917947,917948,917949,917950,917951,917952,917953,917954,917955,917956,917957,917958,917959,917960,917961,917962,917963,917964,917965,917966,917967,917968,917969,917970,917971,917972,917973,917974,917975,917976,917977,917978,917979,917980,917981,917982,917983,917984,917985,917986,917987,917988,917989,917990,917991,917992,917993,917994,917995,917996,917997,917998,917999]"); } static getData() { - return this._data || (this._data = new Set(sf.getRawData())), this._data; + return this._data || (this._data = new Set(ag.getRawData())), this._data; } static isInvisibleCharacter(e) { - return sf.getData().has(e); + return ag.getData().has(e); } static get codePoints() { - return sf.getData(); + return ag.getData(); } }; -sf._data = void 0; -let sg = sf, wf; -const SN = globalThis.vscode; -var lH; -if (typeof SN < "u" && typeof SN.process < "u") { - const s = SN.process; - wf = { +ag._data = void 0; +let dm = ag, Ig; +const JC = globalThis.vscode; +var AP; +if (typeof JC < "u" && typeof JC.process < "u") { + const s = JC.process; + Ig = { get platform() { return s.platform; }, @@ -3392,7 +3392,7 @@ if (typeof SN < "u" && typeof SN.process < "u") { return s.cwd(); } }; -} else typeof process < "u" && typeof ((lH = process == null ? void 0 : process.versions) == null ? void 0 : lH.node) == "string" ? wf = { +} else typeof process < "u" && typeof ((AP = process == null ? void 0 : process.versions) == null ? void 0 : AP.node) == "string" ? Ig = { get platform() { return process.platform; }, @@ -3405,10 +3405,10 @@ if (typeof SN < "u" && typeof SN.process < "u") { cwd() { return process.env.VSCODE_CWD || process.cwd(); } -} : wf = { +} : Ig = { // Supported get platform() { - return kn ? "win32" : qe ? "darwin" : "linux"; + return Jn ? "win32" : qe ? "darwin" : "linux"; }, get arch() { }, @@ -3420,283 +3420,283 @@ if (typeof SN < "u" && typeof SN.process < "u") { return "/"; } }; -const sA = wf.cwd, M2 = wf.env, mq = wf.platform, pq = 65, fq = 97, bq = 90, yq = 122, qd = 46, Bn = 47, Mo = 92, gd = 58, wq = 63; -class BH extends Error { +const yV = Ig.cwd, PN = Ig.env, l$ = Ig.platform, r$ = 65, c$ = 97, d$ = 90, a$ = 122, ih = 46, Pn = 47, xo = 92, Za = 58, h$ = 63; +class SB extends Error { constructor(e, t, i) { let n; typeof t == "string" && t.indexOf("not ") === 0 ? (n = "must not be", t = t.replace(/^not /, "")) : n = "must be"; const o = e.indexOf(".") !== -1 ? "property" : "argument"; - let r = `The "${e}" ${o} ${n} of type ${t}`; - r += `. Received type ${typeof i}`, super(r), this.code = "ERR_INVALID_ARG_TYPE"; + let l = `The "${e}" ${o} ${n} of type ${t}`; + l += `. Received type ${typeof i}`, super(l), this.code = "ERR_INVALID_ARG_TYPE"; } } -function Cq(s, e) { +function u$(s, e) { if (s === null || typeof s != "object") - throw new BH(e, "Object", s); + throw new SB(e, "Object", s); } -function $i(s, e) { +function en(s, e) { if (typeof s != "string") - throw new BH(e, "string", s); + throw new SB(e, "string", s); } -const td = mq === "win32"; -function Mt(s) { - return s === Bn || s === Mo; +const oa = l$ === "win32"; +function It(s) { + return s === Pn || s === xo; } -function Z2(s) { - return s === Bn; +function BN(s) { + return s === Pn; } -function md(s) { - return s >= pq && s <= bq || s >= fq && s <= yq; +function fa(s) { + return s >= r$ && s <= d$ || s >= c$ && s <= a$; } -function oA(s, e, t, i) { - let n = "", o = 0, r = -1, l = 0, a = 0; - for (let c = 0; c <= s.length; ++c) { - if (c < s.length) - a = s.charCodeAt(c); +function WV(s, e, t, i) { + let n = "", o = 0, l = -1, r = 0, c = 0; + for (let d = 0; d <= s.length; ++d) { + if (d < s.length) + c = s.charCodeAt(d); else { - if (i(a)) + if (i(c)) break; - a = Bn; + c = Pn; } - if (i(a)) { - if (!(r === c - 1 || l === 1)) if (l === 2) { - if (n.length < 2 || o !== 2 || n.charCodeAt(n.length - 1) !== qd || n.charCodeAt(n.length - 2) !== qd) { + if (i(c)) { + if (!(l === d - 1 || r === 1)) if (r === 2) { + if (n.length < 2 || o !== 2 || n.charCodeAt(n.length - 1) !== ih || n.charCodeAt(n.length - 2) !== ih) { if (n.length > 2) { - const d = n.lastIndexOf(t); - d === -1 ? (n = "", o = 0) : (n = n.slice(0, d), o = n.length - 1 - n.lastIndexOf(t)), r = c, l = 0; + const a = n.lastIndexOf(t); + a === -1 ? (n = "", o = 0) : (n = n.slice(0, a), o = n.length - 1 - n.lastIndexOf(t)), l = d, r = 0; continue; } else if (n.length !== 0) { - n = "", o = 0, r = c, l = 0; + n = "", o = 0, l = d, r = 0; continue; } } e && (n += n.length > 0 ? `${t}..` : "..", o = 2); } else - n.length > 0 ? n += `${t}${s.slice(r + 1, c)}` : n = s.slice(r + 1, c), o = c - r - 1; - r = c, l = 0; - } else a === qd && l !== -1 ? ++l : l = -1; + n.length > 0 ? n += `${t}${s.slice(l + 1, d)}` : n = s.slice(l + 1, d), o = d - l - 1; + l = d, r = 0; + } else c === ih && r !== -1 ? ++r : r = -1; } return n; } -function Sq(s) { +function m$(s) { return s ? `${s[0] === "." ? "" : "."}${s}` : ""; } -function OH(s, e) { - Cq(e, "pathObject"); - const t = e.dir || e.root, i = e.base || `${e.name || ""}${Sq(e.ext)}`; +function xB(s, e) { + u$(e, "pathObject"); + const t = e.dir || e.root, i = e.base || `${e.name || ""}${m$(e.ext)}`; return t ? t === e.root ? `${t}${i}` : `${t}${s}${i}` : i; } -const Ds = { +const ks = { // path.resolve([from ...], to) resolve(...s) { let e = "", t = "", i = !1; for (let n = s.length - 1; n >= -1; n--) { let o; if (n >= 0) { - if (o = s[n], $i(o, `paths[${n}]`), o.length === 0) + if (o = s[n], en(o, `paths[${n}]`), o.length === 0) continue; - } else e.length === 0 ? o = sA() : (o = M2[`=${e}`] || sA(), (o === void 0 || o.slice(0, 2).toLowerCase() !== e.toLowerCase() && o.charCodeAt(2) === Mo) && (o = `${e}\\`)); - const r = o.length; - let l = 0, a = "", c = !1; - const d = o.charCodeAt(0); - if (r === 1) - Mt(d) && (l = 1, c = !0); - else if (Mt(d)) - if (c = !0, Mt(o.charCodeAt(1))) { + } else e.length === 0 ? o = yV() : (o = PN[`=${e}`] || yV(), (o === void 0 || o.slice(0, 2).toLowerCase() !== e.toLowerCase() && o.charCodeAt(2) === xo) && (o = `${e}\\`)); + const l = o.length; + let r = 0, c = "", d = !1; + const a = o.charCodeAt(0); + if (l === 1) + It(a) && (r = 1, d = !0); + else if (It(a)) + if (d = !0, It(o.charCodeAt(1))) { let h = 2, u = h; - for (; h < r && !Mt(o.charCodeAt(h)); ) + for (; h < l && !It(o.charCodeAt(h)); ) h++; - if (h < r && h !== u) { - const g = o.slice(u, h); - for (u = h; h < r && Mt(o.charCodeAt(h)); ) + if (h < l && h !== u) { + const m = o.slice(u, h); + for (u = h; h < l && It(o.charCodeAt(h)); ) h++; - if (h < r && h !== u) { - for (u = h; h < r && !Mt(o.charCodeAt(h)); ) + if (h < l && h !== u) { + for (u = h; h < l && !It(o.charCodeAt(h)); ) h++; - (h === r || h !== u) && (a = `\\\\${g}\\${o.slice(u, h)}`, l = h); + (h === l || h !== u) && (c = `\\\\${m}\\${o.slice(u, h)}`, r = h); } } } else - l = 1; - else md(d) && o.charCodeAt(1) === gd && (a = o.slice(0, 2), l = 2, r > 2 && Mt(o.charCodeAt(2)) && (c = !0, l = 3)); - if (a.length > 0) + r = 1; + else fa(a) && o.charCodeAt(1) === Za && (c = o.slice(0, 2), r = 2, l > 2 && It(o.charCodeAt(2)) && (d = !0, r = 3)); + if (c.length > 0) if (e.length > 0) { - if (a.toLowerCase() !== e.toLowerCase()) + if (c.toLowerCase() !== e.toLowerCase()) continue; } else - e = a; + e = c; if (i) { if (e.length > 0) break; - } else if (t = `${o.slice(l)}\\${t}`, i = c, c && e.length > 0) + } else if (t = `${o.slice(r)}\\${t}`, i = d, d && e.length > 0) break; } - return t = oA(t, !i, "\\", Mt), i ? `${e}\\${t}` : `${e}${t}` || "."; + return t = WV(t, !i, "\\", It), i ? `${e}\\${t}` : `${e}${t}` || "."; }, normalize(s) { - $i(s, "path"); + en(s, "path"); const e = s.length; if (e === 0) return "."; let t = 0, i, n = !1; const o = s.charCodeAt(0); if (e === 1) - return Z2(o) ? "\\" : s; - if (Mt(o)) - if (n = !0, Mt(s.charCodeAt(1))) { - let l = 2, a = l; - for (; l < e && !Mt(s.charCodeAt(l)); ) - l++; - if (l < e && l !== a) { - const c = s.slice(a, l); - for (a = l; l < e && Mt(s.charCodeAt(l)); ) - l++; - if (l < e && l !== a) { - for (a = l; l < e && !Mt(s.charCodeAt(l)); ) - l++; - if (l === e) - return `\\\\${c}\\${s.slice(a)}\\`; - l !== a && (i = `\\\\${c}\\${s.slice(a, l)}`, t = l); + return BN(o) ? "\\" : s; + if (It(o)) + if (n = !0, It(s.charCodeAt(1))) { + let r = 2, c = r; + for (; r < e && !It(s.charCodeAt(r)); ) + r++; + if (r < e && r !== c) { + const d = s.slice(c, r); + for (c = r; r < e && It(s.charCodeAt(r)); ) + r++; + if (r < e && r !== c) { + for (c = r; r < e && !It(s.charCodeAt(r)); ) + r++; + if (r === e) + return `\\\\${d}\\${s.slice(c)}\\`; + r !== c && (i = `\\\\${d}\\${s.slice(c, r)}`, t = r); } } } else t = 1; - else md(o) && s.charCodeAt(1) === gd && (i = s.slice(0, 2), t = 2, e > 2 && Mt(s.charCodeAt(2)) && (n = !0, t = 3)); - let r = t < e ? oA(s.slice(t), !n, "\\", Mt) : ""; - return r.length === 0 && !n && (r = "."), r.length > 0 && Mt(s.charCodeAt(e - 1)) && (r += "\\"), i === void 0 ? n ? `\\${r}` : r : n ? `${i}\\${r}` : `${i}${r}`; + else fa(o) && s.charCodeAt(1) === Za && (i = s.slice(0, 2), t = 2, e > 2 && It(s.charCodeAt(2)) && (n = !0, t = 3)); + let l = t < e ? WV(s.slice(t), !n, "\\", It) : ""; + return l.length === 0 && !n && (l = "."), l.length > 0 && It(s.charCodeAt(e - 1)) && (l += "\\"), i === void 0 ? n ? `\\${l}` : l : n ? `${i}\\${l}` : `${i}${l}`; }, isAbsolute(s) { - $i(s, "path"); + en(s, "path"); const e = s.length; if (e === 0) return !1; const t = s.charCodeAt(0); - return Mt(t) || // Possible device root - e > 2 && md(t) && s.charCodeAt(1) === gd && Mt(s.charCodeAt(2)); + return It(t) || // Possible device root + e > 2 && fa(t) && s.charCodeAt(1) === Za && It(s.charCodeAt(2)); }, join(...s) { if (s.length === 0) return "."; let e, t; for (let o = 0; o < s.length; ++o) { - const r = s[o]; - $i(r, "path"), r.length > 0 && (e === void 0 ? e = t = r : e += `\\${r}`); + const l = s[o]; + en(l, "path"), l.length > 0 && (e === void 0 ? e = t = l : e += `\\${l}`); } if (e === void 0) return "."; let i = !0, n = 0; - if (typeof t == "string" && Mt(t.charCodeAt(0))) { + if (typeof t == "string" && It(t.charCodeAt(0))) { ++n; const o = t.length; - o > 1 && Mt(t.charCodeAt(1)) && (++n, o > 2 && (Mt(t.charCodeAt(2)) ? ++n : i = !1)); + o > 1 && It(t.charCodeAt(1)) && (++n, o > 2 && (It(t.charCodeAt(2)) ? ++n : i = !1)); } if (i) { - for (; n < e.length && Mt(e.charCodeAt(n)); ) + for (; n < e.length && It(e.charCodeAt(n)); ) n++; n >= 2 && (e = `\\${e.slice(n)}`); } - return Ds.normalize(e); + return ks.normalize(e); }, // It will solve the relative path from `from` to `to`, for instance: // from = 'C:\\orandea\\test\\aaa' // to = 'C:\\orandea\\impl\\bbb' // The output of the function should be: '..\\..\\impl\\bbb' relative(s, e) { - if ($i(s, "from"), $i(e, "to"), s === e) + if (en(s, "from"), en(e, "to"), s === e) return ""; - const t = Ds.resolve(s), i = Ds.resolve(e); + const t = ks.resolve(s), i = ks.resolve(e); if (t === i || (s = t.toLowerCase(), e = i.toLowerCase(), s === e)) return ""; let n = 0; - for (; n < s.length && s.charCodeAt(n) === Mo; ) + for (; n < s.length && s.charCodeAt(n) === xo; ) n++; let o = s.length; - for (; o - 1 > n && s.charCodeAt(o - 1) === Mo; ) + for (; o - 1 > n && s.charCodeAt(o - 1) === xo; ) o--; - const r = o - n; - let l = 0; - for (; l < e.length && e.charCodeAt(l) === Mo; ) - l++; - let a = e.length; - for (; a - 1 > l && e.charCodeAt(a - 1) === Mo; ) - a--; - const c = a - l, d = r < c ? r : c; + const l = o - n; + let r = 0; + for (; r < e.length && e.charCodeAt(r) === xo; ) + r++; + let c = e.length; + for (; c - 1 > r && e.charCodeAt(c - 1) === xo; ) + c--; + const d = c - r, a = l < d ? l : d; let h = -1, u = 0; - for (; u < d; u++) { - const m = s.charCodeAt(n + u); - if (m !== e.charCodeAt(l + u)) + for (; u < a; u++) { + const b = s.charCodeAt(n + u); + if (b !== e.charCodeAt(r + u)) break; - m === Mo && (h = u); + b === xo && (h = u); } - if (u !== d) { + if (u !== a) { if (h === -1) return i; } else { - if (c > d) { - if (e.charCodeAt(l + u) === Mo) - return i.slice(l + u + 1); + if (d > a) { + if (e.charCodeAt(r + u) === xo) + return i.slice(r + u + 1); if (u === 2) - return i.slice(l + u); + return i.slice(r + u); } - r > d && (s.charCodeAt(n + u) === Mo ? h = u : u === 2 && (h = 3)), h === -1 && (h = 0); + l > a && (s.charCodeAt(n + u) === xo ? h = u : u === 2 && (h = 3)), h === -1 && (h = 0); } - let g = ""; + let m = ""; for (u = n + h + 1; u <= o; ++u) - (u === o || s.charCodeAt(u) === Mo) && (g += g.length === 0 ? ".." : "\\.."); - return l += h, g.length > 0 ? `${g}${i.slice(l, a)}` : (i.charCodeAt(l) === Mo && ++l, i.slice(l, a)); + (u === o || s.charCodeAt(u) === xo) && (m += m.length === 0 ? ".." : "\\.."); + return r += h, m.length > 0 ? `${m}${i.slice(r, c)}` : (i.charCodeAt(r) === xo && ++r, i.slice(r, c)); }, toNamespacedPath(s) { if (typeof s != "string" || s.length === 0) return s; - const e = Ds.resolve(s); + const e = ks.resolve(s); if (e.length <= 2) return s; - if (e.charCodeAt(0) === Mo) { - if (e.charCodeAt(1) === Mo) { + if (e.charCodeAt(0) === xo) { + if (e.charCodeAt(1) === xo) { const t = e.charCodeAt(2); - if (t !== wq && t !== qd) + if (t !== h$ && t !== ih) return `\\\\?\\UNC\\${e.slice(2)}`; } - } else if (md(e.charCodeAt(0)) && e.charCodeAt(1) === gd && e.charCodeAt(2) === Mo) + } else if (fa(e.charCodeAt(0)) && e.charCodeAt(1) === Za && e.charCodeAt(2) === xo) return `\\\\?\\${e}`; return s; }, dirname(s) { - $i(s, "path"); + en(s, "path"); const e = s.length; if (e === 0) return "."; let t = -1, i = 0; const n = s.charCodeAt(0); if (e === 1) - return Mt(n) ? s : "."; - if (Mt(n)) { - if (t = i = 1, Mt(s.charCodeAt(1))) { - let l = 2, a = l; - for (; l < e && !Mt(s.charCodeAt(l)); ) - l++; - if (l < e && l !== a) { - for (a = l; l < e && Mt(s.charCodeAt(l)); ) - l++; - if (l < e && l !== a) { - for (a = l; l < e && !Mt(s.charCodeAt(l)); ) - l++; - if (l === e) + return It(n) ? s : "."; + if (It(n)) { + if (t = i = 1, It(s.charCodeAt(1))) { + let r = 2, c = r; + for (; r < e && !It(s.charCodeAt(r)); ) + r++; + if (r < e && r !== c) { + for (c = r; r < e && It(s.charCodeAt(r)); ) + r++; + if (r < e && r !== c) { + for (c = r; r < e && !It(s.charCodeAt(r)); ) + r++; + if (r === e) return s; - l !== a && (t = i = l + 1); + r !== c && (t = i = r + 1); } } } - } else md(n) && s.charCodeAt(1) === gd && (t = e > 2 && Mt(s.charCodeAt(2)) ? 3 : 2, i = t); - let o = -1, r = !0; - for (let l = e - 1; l >= i; --l) - if (Mt(s.charCodeAt(l))) { - if (!r) { - o = l; + } else fa(n) && s.charCodeAt(1) === Za && (t = e > 2 && It(s.charCodeAt(2)) ? 3 : 2, i = t); + let o = -1, l = !0; + for (let r = e - 1; r >= i; --r) + if (It(s.charCodeAt(r))) { + if (!l) { + o = r; break; } } else - r = !1; + l = !1; if (o === -1) { if (t === -1) return "."; @@ -3705,26 +3705,26 @@ const Ds = { return s.slice(0, o); }, basename(s, e) { - e !== void 0 && $i(e, "suffix"), $i(s, "path"); + e !== void 0 && en(e, "suffix"), en(s, "path"); let t = 0, i = -1, n = !0, o; - if (s.length >= 2 && md(s.charCodeAt(0)) && s.charCodeAt(1) === gd && (t = 2), e !== void 0 && e.length > 0 && e.length <= s.length) { + if (s.length >= 2 && fa(s.charCodeAt(0)) && s.charCodeAt(1) === Za && (t = 2), e !== void 0 && e.length > 0 && e.length <= s.length) { if (e === s) return ""; - let r = e.length - 1, l = -1; + let l = e.length - 1, r = -1; for (o = s.length - 1; o >= t; --o) { - const a = s.charCodeAt(o); - if (Mt(a)) { + const c = s.charCodeAt(o); + if (It(c)) { if (!n) { t = o + 1; break; } } else - l === -1 && (n = !1, l = o + 1), r >= 0 && (a === e.charCodeAt(r) ? --r === -1 && (i = o) : (r = -1, i = l)); + r === -1 && (n = !1, r = o + 1), l >= 0 && (c === e.charCodeAt(l) ? --l === -1 && (i = o) : (l = -1, i = r)); } - return t === i ? i = l : i === -1 && (i = s.length), s.slice(t, i); + return t === i ? i = r : i === -1 && (i = s.length), s.slice(t, i); } for (o = s.length - 1; o >= t; --o) - if (Mt(s.charCodeAt(o))) { + if (It(s.charCodeAt(o))) { if (!n) { t = o + 1; break; @@ -3733,105 +3733,105 @@ const Ds = { return i === -1 ? "" : s.slice(t, i); }, extname(s) { - $i(s, "path"); - let e = 0, t = -1, i = 0, n = -1, o = !0, r = 0; - s.length >= 2 && s.charCodeAt(1) === gd && md(s.charCodeAt(0)) && (e = i = 2); - for (let l = s.length - 1; l >= e; --l) { - const a = s.charCodeAt(l); - if (Mt(a)) { + en(s, "path"); + let e = 0, t = -1, i = 0, n = -1, o = !0, l = 0; + s.length >= 2 && s.charCodeAt(1) === Za && fa(s.charCodeAt(0)) && (e = i = 2); + for (let r = s.length - 1; r >= e; --r) { + const c = s.charCodeAt(r); + if (It(c)) { if (!o) { - i = l + 1; + i = r + 1; break; } continue; } - n === -1 && (o = !1, n = l + 1), a === qd ? t === -1 ? t = l : r !== 1 && (r = 1) : t !== -1 && (r = -1); + n === -1 && (o = !1, n = r + 1), c === ih ? t === -1 ? t = r : l !== 1 && (l = 1) : t !== -1 && (l = -1); } return t === -1 || n === -1 || // We saw a non-dot character immediately before the dot - r === 0 || // The (right-most) trimmed path component is exactly '..' - r === 1 && t === n - 1 && t === i + 1 ? "" : s.slice(t, n); + l === 0 || // The (right-most) trimmed path component is exactly '..' + l === 1 && t === n - 1 && t === i + 1 ? "" : s.slice(t, n); }, - format: OH.bind(null, "\\"), + format: xB.bind(null, "\\"), parse(s) { - $i(s, "path"); + en(s, "path"); const e = { root: "", dir: "", base: "", ext: "", name: "" }; if (s.length === 0) return e; const t = s.length; let i = 0, n = s.charCodeAt(0); if (t === 1) - return Mt(n) ? (e.root = e.dir = s, e) : (e.base = e.name = s, e); - if (Mt(n)) { - if (i = 1, Mt(s.charCodeAt(1))) { + return It(n) ? (e.root = e.dir = s, e) : (e.base = e.name = s, e); + if (It(n)) { + if (i = 1, It(s.charCodeAt(1))) { let h = 2, u = h; - for (; h < t && !Mt(s.charCodeAt(h)); ) + for (; h < t && !It(s.charCodeAt(h)); ) h++; if (h < t && h !== u) { - for (u = h; h < t && Mt(s.charCodeAt(h)); ) + for (u = h; h < t && It(s.charCodeAt(h)); ) h++; if (h < t && h !== u) { - for (u = h; h < t && !Mt(s.charCodeAt(h)); ) + for (u = h; h < t && !It(s.charCodeAt(h)); ) h++; h === t ? i = h : h !== u && (i = h + 1); } } } - } else if (md(n) && s.charCodeAt(1) === gd) { + } else if (fa(n) && s.charCodeAt(1) === Za) { if (t <= 2) return e.root = e.dir = s, e; - if (i = 2, Mt(s.charCodeAt(2))) { + if (i = 2, It(s.charCodeAt(2))) { if (t === 3) return e.root = e.dir = s, e; i = 3; } } i > 0 && (e.root = s.slice(0, i)); - let o = -1, r = i, l = -1, a = !0, c = s.length - 1, d = 0; - for (; c >= i; --c) { - if (n = s.charCodeAt(c), Mt(n)) { - if (!a) { - r = c + 1; + let o = -1, l = i, r = -1, c = !0, d = s.length - 1, a = 0; + for (; d >= i; --d) { + if (n = s.charCodeAt(d), It(n)) { + if (!c) { + l = d + 1; break; } continue; } - l === -1 && (a = !1, l = c + 1), n === qd ? o === -1 ? o = c : d !== 1 && (d = 1) : o !== -1 && (d = -1); + r === -1 && (c = !1, r = d + 1), n === ih ? o === -1 ? o = d : a !== 1 && (a = 1) : o !== -1 && (a = -1); } - return l !== -1 && (o === -1 || // We saw a non-dot character immediately before the dot - d === 0 || // The (right-most) trimmed path component is exactly '..' - d === 1 && o === l - 1 && o === r + 1 ? e.base = e.name = s.slice(r, l) : (e.name = s.slice(r, o), e.base = s.slice(r, l), e.ext = s.slice(o, l))), r > 0 && r !== i ? e.dir = s.slice(0, r - 1) : e.dir = e.root, e; + return r !== -1 && (o === -1 || // We saw a non-dot character immediately before the dot + a === 0 || // The (right-most) trimmed path component is exactly '..' + a === 1 && o === r - 1 && o === l + 1 ? e.base = e.name = s.slice(l, r) : (e.name = s.slice(l, o), e.base = s.slice(l, r), e.ext = s.slice(o, r))), l > 0 && l !== i ? e.dir = s.slice(0, l - 1) : e.dir = e.root, e; }, sep: "\\", delimiter: ";", win32: null, posix: null -}, Lq = (() => { - if (td) { +}, b$ = (() => { + if (oa) { const s = /\\/g; return () => { - const e = sA().replace(s, "/"); + const e = yV().replace(s, "/"); return e.slice(e.indexOf("/")); }; } - return () => sA(); -})(), vi = { + return () => yV(); +})(), Mi = { // path.resolve([from ...], to) resolve(...s) { let e = "", t = !1; for (let i = s.length - 1; i >= -1 && !t; i--) { - const n = i >= 0 ? s[i] : Lq(); - $i(n, `paths[${i}]`), n.length !== 0 && (e = `${n}/${e}`, t = n.charCodeAt(0) === Bn); + const n = i >= 0 ? s[i] : b$(); + en(n, `paths[${i}]`), n.length !== 0 && (e = `${n}/${e}`, t = n.charCodeAt(0) === Pn); } - return e = oA(e, !t, "/", Z2), t ? `/${e}` : e.length > 0 ? e : "."; + return e = WV(e, !t, "/", BN), t ? `/${e}` : e.length > 0 ? e : "."; }, normalize(s) { - if ($i(s, "path"), s.length === 0) + if (en(s, "path"), s.length === 0) return "."; - const e = s.charCodeAt(0) === Bn, t = s.charCodeAt(s.length - 1) === Bn; - return s = oA(s, !e, "/", Z2), s.length === 0 ? e ? "/" : t ? "./" : "." : (t && (s += "/"), e ? `/${s}` : s); + const e = s.charCodeAt(0) === Pn, t = s.charCodeAt(s.length - 1) === Pn; + return s = WV(s, !e, "/", BN), s.length === 0 ? e ? "/" : t ? "./" : "." : (t && (s += "/"), e ? `/${s}` : s); }, isAbsolute(s) { - return $i(s, "path"), s.length > 0 && s.charCodeAt(0) === Bn; + return en(s, "path"), s.length > 0 && s.charCodeAt(0) === Pn; }, join(...s) { if (s.length === 0) @@ -3839,43 +3839,43 @@ const Ds = { let e; for (let t = 0; t < s.length; ++t) { const i = s[t]; - $i(i, "path"), i.length > 0 && (e === void 0 ? e = i : e += `/${i}`); + en(i, "path"), i.length > 0 && (e === void 0 ? e = i : e += `/${i}`); } - return e === void 0 ? "." : vi.normalize(e); + return e === void 0 ? "." : Mi.normalize(e); }, relative(s, e) { - if ($i(s, "from"), $i(e, "to"), s === e || (s = vi.resolve(s), e = vi.resolve(e), s === e)) + if (en(s, "from"), en(e, "to"), s === e || (s = Mi.resolve(s), e = Mi.resolve(e), s === e)) return ""; - const t = 1, i = s.length, n = i - t, o = 1, r = e.length - o, l = n < r ? n : r; - let a = -1, c = 0; - for (; c < l; c++) { - const h = s.charCodeAt(t + c); - if (h !== e.charCodeAt(o + c)) + const t = 1, i = s.length, n = i - t, o = 1, l = e.length - o, r = n < l ? n : l; + let c = -1, d = 0; + for (; d < r; d++) { + const h = s.charCodeAt(t + d); + if (h !== e.charCodeAt(o + d)) break; - h === Bn && (a = c); - } - if (c === l) - if (r > l) { - if (e.charCodeAt(o + c) === Bn) - return e.slice(o + c + 1); - if (c === 0) - return e.slice(o + c); - } else n > l && (s.charCodeAt(t + c) === Bn ? a = c : c === 0 && (a = 0)); - let d = ""; - for (c = t + a + 1; c <= i; ++c) - (c === i || s.charCodeAt(c) === Bn) && (d += d.length === 0 ? ".." : "/.."); - return `${d}${e.slice(o + a)}`; + h === Pn && (c = d); + } + if (d === r) + if (l > r) { + if (e.charCodeAt(o + d) === Pn) + return e.slice(o + d + 1); + if (d === 0) + return e.slice(o + d); + } else n > r && (s.charCodeAt(t + d) === Pn ? c = d : d === 0 && (c = 0)); + let a = ""; + for (d = t + c + 1; d <= i; ++d) + (d === i || s.charCodeAt(d) === Pn) && (a += a.length === 0 ? ".." : "/.."); + return `${a}${e.slice(o + c)}`; }, toNamespacedPath(s) { return s; }, dirname(s) { - if ($i(s, "path"), s.length === 0) + if (en(s, "path"), s.length === 0) return "."; - const e = s.charCodeAt(0) === Bn; + const e = s.charCodeAt(0) === Pn; let t = -1, i = !0; for (let n = s.length - 1; n >= 1; --n) - if (s.charCodeAt(n) === Bn) { + if (s.charCodeAt(n) === Pn) { if (!i) { t = n; break; @@ -3885,26 +3885,26 @@ const Ds = { return t === -1 ? e ? "/" : "." : e && t === 1 ? "//" : s.slice(0, t); }, basename(s, e) { - e !== void 0 && $i(e, "ext"), $i(s, "path"); + e !== void 0 && en(e, "ext"), en(s, "path"); let t = 0, i = -1, n = !0, o; if (e !== void 0 && e.length > 0 && e.length <= s.length) { if (e === s) return ""; - let r = e.length - 1, l = -1; + let l = e.length - 1, r = -1; for (o = s.length - 1; o >= 0; --o) { - const a = s.charCodeAt(o); - if (a === Bn) { + const c = s.charCodeAt(o); + if (c === Pn) { if (!n) { t = o + 1; break; } } else - l === -1 && (n = !1, l = o + 1), r >= 0 && (a === e.charCodeAt(r) ? --r === -1 && (i = o) : (r = -1, i = l)); + r === -1 && (n = !1, r = o + 1), l >= 0 && (c === e.charCodeAt(l) ? --l === -1 && (i = o) : (l = -1, i = r)); } - return t === i ? i = l : i === -1 && (i = s.length), s.slice(t, i); + return t === i ? i = r : i === -1 && (i = s.length), s.slice(t, i); } for (o = s.length - 1; o >= 0; --o) - if (s.charCodeAt(o) === Bn) { + if (s.charCodeAt(o) === Pn) { if (!n) { t = o + 1; break; @@ -3913,49 +3913,49 @@ const Ds = { return i === -1 ? "" : s.slice(t, i); }, extname(s) { - $i(s, "path"); + en(s, "path"); let e = -1, t = 0, i = -1, n = !0, o = 0; - for (let r = s.length - 1; r >= 0; --r) { - const l = s.charCodeAt(r); - if (l === Bn) { + for (let l = s.length - 1; l >= 0; --l) { + const r = s.charCodeAt(l); + if (r === Pn) { if (!n) { - t = r + 1; + t = l + 1; break; } continue; } - i === -1 && (n = !1, i = r + 1), l === qd ? e === -1 ? e = r : o !== 1 && (o = 1) : e !== -1 && (o = -1); + i === -1 && (n = !1, i = l + 1), r === ih ? e === -1 ? e = l : o !== 1 && (o = 1) : e !== -1 && (o = -1); } return e === -1 || i === -1 || // We saw a non-dot character immediately before the dot o === 0 || // The (right-most) trimmed path component is exactly '..' o === 1 && e === i - 1 && e === t + 1 ? "" : s.slice(e, i); }, - format: OH.bind(null, "/"), + format: xB.bind(null, "/"), parse(s) { - $i(s, "path"); + en(s, "path"); const e = { root: "", dir: "", base: "", ext: "", name: "" }; if (s.length === 0) return e; - const t = s.charCodeAt(0) === Bn; + const t = s.charCodeAt(0) === Pn; let i; t ? (e.root = "/", i = 1) : i = 0; - let n = -1, o = 0, r = -1, l = !0, a = s.length - 1, c = 0; - for (; a >= i; --a) { - const d = s.charCodeAt(a); - if (d === Bn) { - if (!l) { - o = a + 1; + let n = -1, o = 0, l = -1, r = !0, c = s.length - 1, d = 0; + for (; c >= i; --c) { + const a = s.charCodeAt(c); + if (a === Pn) { + if (!r) { + o = c + 1; break; } continue; } - r === -1 && (l = !1, r = a + 1), d === qd ? n === -1 ? n = a : c !== 1 && (c = 1) : n !== -1 && (c = -1); + l === -1 && (r = !1, l = c + 1), a === ih ? n === -1 ? n = c : d !== 1 && (d = 1) : n !== -1 && (d = -1); } - if (r !== -1) { - const d = o === 0 && t ? 1 : o; + if (l !== -1) { + const a = o === 0 && t ? 1 : o; n === -1 || // We saw a non-dot character immediately before the dot - c === 0 || // The (right-most) trimmed path component is exactly '..' - c === 1 && n === r - 1 && n === o + 1 ? e.base = e.name = s.slice(d, r) : (e.name = s.slice(d, n), e.base = s.slice(d, r), e.ext = s.slice(n, r)); + d === 0 || // The (right-most) trimmed path component is exactly '..' + d === 1 && n === l - 1 && n === o + 1 ? e.base = e.name = s.slice(a, l) : (e.name = s.slice(a, n), e.base = s.slice(a, l), e.ext = s.slice(n, l)); } return o > 0 ? e.dir = s.slice(0, o - 1) : t && (e.dir = "/"), e; }, @@ -3964,45 +3964,45 @@ const Ds = { win32: null, posix: null }; -vi.win32 = Ds.win32 = Ds; -vi.posix = Ds.posix = vi; -const HH = td ? Ds.normalize : vi.normalize, Aq = td ? Ds.join : vi.join, xq = td ? Ds.resolve : vi.resolve, Mq = td ? Ds.relative : vi.relative, JH = td ? Ds.dirname : vi.dirname, $d = td ? Ds.basename : vi.basename, Zq = td ? Ds.extname : vi.extname, eh = td ? Ds.sep : vi.sep, _q = /^\w[\w\d+.-]*$/, Iq = /^\//, Nq = /^\/\//; -function Wq(s, e) { +Mi.win32 = ks.win32 = ks; +Mi.posix = ks.posix = Mi; +const CB = oa ? ks.normalize : Mi.normalize, p$ = oa ? ks.join : Mi.join, g$ = oa ? ks.resolve : Mi.resolve, Z$ = oa ? ks.relative : Mi.relative, RB = oa ? ks.dirname : Mi.dirname, nh = oa ? ks.basename : Mi.basename, f$ = oa ? ks.extname : Mi.extname, sh = oa ? ks.sep : Mi.sep, y$ = /^\w[\w\d+.-]*$/, W$ = /^\//, G$ = /^\/\//; +function X$(s, e) { if (!s.scheme && e) throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${s.authority}", path: "${s.path}", query: "${s.query}", fragment: "${s.fragment}"}`); - if (s.scheme && !_q.test(s.scheme)) + if (s.scheme && !y$.test(s.scheme)) throw new Error("[UriError]: Scheme contains illegal characters."); if (s.path) { if (s.authority) { - if (!Iq.test(s.path)) + if (!W$.test(s.path)) throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character'); - } else if (Nq.test(s.path)) + } else if (G$.test(s.path)) throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")'); } } -function vq(s, e) { +function V$(s, e) { return !s && !e ? "file" : s; } -function Tq(s, e) { +function L$(s, e) { switch (s) { case "https": case "http": case "file": - e ? e[0] !== fl && (e = fl + e) : e = fl; + e ? e[0] !== Wr && (e = Wr + e) : e = Wr; break; } return e; } -const Ii = "", fl = "/", Dq = /^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/; -let Le = class uL { +const Ri = "", Wr = "/", I$ = /^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/; +let Xe = class xX { static isUri(e) { - return e instanceof uL ? !0 : e ? typeof e.authority == "string" && typeof e.fragment == "string" && typeof e.path == "string" && typeof e.query == "string" && typeof e.scheme == "string" && typeof e.fsPath == "string" && typeof e.with == "function" && typeof e.toString == "function" : !1; + return e instanceof xX ? !0 : e ? typeof e.authority == "string" && typeof e.fragment == "string" && typeof e.path == "string" && typeof e.query == "string" && typeof e.scheme == "string" && typeof e.fsPath == "string" && typeof e.with == "function" && typeof e.toString == "function" : !1; } /** * @internal */ - constructor(e, t, i, n, o, r = !1) { - typeof e == "object" ? (this.scheme = e.scheme || Ii, this.authority = e.authority || Ii, this.path = e.path || Ii, this.query = e.query || Ii, this.fragment = e.fragment || Ii) : (this.scheme = vq(e, r), this.authority = t || Ii, this.path = Tq(this.scheme, i || Ii), this.query = n || Ii, this.fragment = o || Ii, Wq(this, r)); + constructor(e, t, i, n, o, l = !1) { + typeof e == "object" ? (this.scheme = e.scheme || Ri, this.authority = e.authority || Ri, this.path = e.path || Ri, this.query = e.query || Ri, this.fragment = e.fragment || Ri) : (this.scheme = V$(e, l), this.authority = t || Ri, this.path = L$(this.scheme, i || Ri), this.query = n || Ri, this.fragment = o || Ri, X$(this, l)); } // ---- filesystem path ----------------------- /** @@ -4030,14 +4030,14 @@ let Le = class uL { * with URIs that represent files on disk (`file` scheme). */ get fsPath() { - return rA(this, !1); + return GV(this, !1); } // ---- modify to new ------------------------- with(e) { if (!e) return this; - let { scheme: t, authority: i, path: n, query: o, fragment: r } = e; - return t === void 0 ? t = this.scheme : t === null && (t = Ii), i === void 0 ? i = this.authority : i === null && (i = Ii), n === void 0 ? n = this.path : n === null && (n = Ii), o === void 0 ? o = this.query : o === null && (o = Ii), r === void 0 ? r = this.fragment : r === null && (r = Ii), t === this.scheme && i === this.authority && n === this.path && o === this.query && r === this.fragment ? this : new tp(t, i, n, o, r); + let { scheme: t, authority: i, path: n, query: o, fragment: l } = e; + return t === void 0 ? t = this.scheme : t === null && (t = Ri), i === void 0 ? i = this.authority : i === null && (i = Ri), n === void 0 ? n = this.path : n === null && (n = Ri), o === void 0 ? o = this.query : o === null && (o = Ri), l === void 0 ? l = this.fragment : l === null && (l = Ri), t === this.scheme && i === this.authority && n === this.path && o === this.query && l === this.fragment ? this : new lp(t, i, n, o, l); } // ---- parse & validate ------------------------ /** @@ -4047,8 +4047,8 @@ let Le = class uL { * @param value A string which represents an URI (see `URI#toString`). */ static parse(e, t = !1) { - const i = Dq.exec(e); - return i ? new tp(i[2] || Ii, $C(i[4] || Ii), $C(i[5] || Ii), $C(i[7] || Ii), $C(i[9] || Ii), t) : new tp(Ii, Ii, Ii, Ii, Ii); + const i = I$.exec(e); + return i ? new lp(i[2] || Ri, u1(i[4] || Ri), u1(i[5] || Ri), u1(i[7] || Ri), u1(i[9] || Ri), t) : new lp(Ri, Ri, Ri, Ri, Ri); } /** * Creates a new URI from a file system path, e.g. `c:\my\files`, @@ -4072,12 +4072,12 @@ let Le = class uL { * @param path A file system path (see `URI#fsPath`) */ static file(e) { - let t = Ii; - if (kn && (e = e.replace(/\\/g, fl)), e[0] === fl && e[1] === fl) { - const i = e.indexOf(fl, 2); - i === -1 ? (t = e.substring(2), e = fl) : (t = e.substring(2, i), e = e.substring(i) || fl); + let t = Ri; + if (Jn && (e = e.replace(/\\/g, Wr)), e[0] === Wr && e[1] === Wr) { + const i = e.indexOf(Wr, 2); + i === -1 ? (t = e.substring(2), e = Wr) : (t = e.substring(2, i), e = e.substring(i) || Wr); } - return new tp("file", t, e, Ii, Ii); + return new lp("file", t, e, Ri, Ri); } /** * Creates new URI from uri components. @@ -4087,7 +4087,7 @@ let Le = class uL { * user input, command arguments etc */ static from(e, t) { - return new tp(e.scheme, e.authority, e.path, e.query, e.fragment, t); + return new lp(e.scheme, e.authority, e.path, e.query, e.fragment, t); } /** * Join a URI path with path fragments and normalizes the resulting path. @@ -4100,7 +4100,7 @@ let Le = class uL { if (!e.path) throw new Error("[UriError]: cannot call joinPath on URI without path"); let i; - return kn && e.scheme === "file" ? i = uL.file(Ds.join(rA(e, !0), ...t)).path : i = vi.join(e.path, ...t), e.with({ path: i }); + return Jn && e.scheme === "file" ? i = xX.file(ks.join(GV(e, !0), ...t)).path : i = Mi.join(e.path, ...t), e.with({ path: i }); } // ---- printing/externalize --------------------------- /** @@ -4115,42 +4115,42 @@ let Le = class uL { * @param skipEncoding Do not encode the result, default is `false` */ toString(e = !1) { - return _2(this, e); + return _N(this, e); } toJSON() { return this; } static revive(e) { if (e) { - if (e instanceof uL) + if (e instanceof xX) return e; { - const t = new tp(e); - return t._formatted = e.external ?? null, t._fsPath = e._sep === UH ? e.fsPath ?? null : null, t; + const t = new lp(e); + return t._formatted = e.external ?? null, t._fsPath = e._sep === NB ? e.fsPath ?? null : null, t; } } else return e; } }; -const UH = kn ? 1 : void 0; -let tp = class extends Le { +const NB = Jn ? 1 : void 0; +let lp = class extends Xe { constructor() { super(...arguments), this._formatted = null, this._fsPath = null; } get fsPath() { - return this._fsPath || (this._fsPath = rA(this, !1)), this._fsPath; + return this._fsPath || (this._fsPath = GV(this, !1)), this._fsPath; } toString(e = !1) { - return e ? _2(this, !0) : (this._formatted || (this._formatted = _2(this, !1)), this._formatted); + return e ? _N(this, !0) : (this._formatted || (this._formatted = _N(this, !1)), this._formatted); } toJSON() { const e = { $mid: 1 /* MarshalledId.Uri */ }; - return this._fsPath && (e.fsPath = this._fsPath, e._sep = UH), this._formatted && (e.external = this._formatted), this.path && (e.path = this.path), this.scheme && (e.scheme = this.scheme), this.authority && (e.authority = this.authority), this.query && (e.query = this.query), this.fragment && (e.fragment = this.fragment), e; + return this._fsPath && (e.fsPath = this._fsPath, e._sep = NB), this._formatted && (e.external = this._formatted), this.path && (e.path = this.path), this.scheme && (e.scheme = this.scheme), this.authority && (e.authority = this.authority), this.query && (e.query = this.query), this.fragment && (e.fragment = this.fragment), e; } }; -const KH = { +const wB = { 58: "%3A", // gen-delims 47: "%2F", @@ -4173,78 +4173,78 @@ const KH = { 61: "%3D", 32: "%20" }; -function j9(s, e, t) { +function XD(s, e, t) { let i, n = -1; for (let o = 0; o < s.length; o++) { - const r = s.charCodeAt(o); - if (r >= 97 && r <= 122 || r >= 65 && r <= 90 || r >= 48 && r <= 57 || r === 45 || r === 46 || r === 95 || r === 126 || e && r === 47 || t && r === 91 || t && r === 93 || t && r === 58) + const l = s.charCodeAt(o); + if (l >= 97 && l <= 122 || l >= 65 && l <= 90 || l >= 48 && l <= 57 || l === 45 || l === 46 || l === 95 || l === 126 || e && l === 47 || t && l === 91 || t && l === 93 || t && l === 58) n !== -1 && (i += encodeURIComponent(s.substring(n, o)), n = -1), i !== void 0 && (i += s.charAt(o)); else { i === void 0 && (i = s.substr(0, o)); - const l = KH[r]; - l !== void 0 ? (n !== -1 && (i += encodeURIComponent(s.substring(n, o)), n = -1), i += l) : n === -1 && (n = o); + const r = wB[l]; + r !== void 0 ? (n !== -1 && (i += encodeURIComponent(s.substring(n, o)), n = -1), i += r) : n === -1 && (n = o); } } return n !== -1 && (i += encodeURIComponent(s.substring(n))), i !== void 0 ? i : s; } -function Vq(s) { +function S$(s) { let e; for (let t = 0; t < s.length; t++) { const i = s.charCodeAt(t); - i === 35 || i === 63 ? (e === void 0 && (e = s.substr(0, t)), e += KH[i]) : e !== void 0 && (e += s[t]); + i === 35 || i === 63 ? (e === void 0 && (e = s.substr(0, t)), e += wB[i]) : e !== void 0 && (e += s[t]); } return e !== void 0 ? e : s; } -function rA(s, e) { +function GV(s, e) { let t; - return s.authority && s.path.length > 1 && s.scheme === "file" ? t = `//${s.authority}${s.path}` : s.path.charCodeAt(0) === 47 && (s.path.charCodeAt(1) >= 65 && s.path.charCodeAt(1) <= 90 || s.path.charCodeAt(1) >= 97 && s.path.charCodeAt(1) <= 122) && s.path.charCodeAt(2) === 58 ? e ? t = s.path.substr(1) : t = s.path[1].toLowerCase() + s.path.substr(2) : t = s.path, kn && (t = t.replace(/\//g, "\\")), t; + return s.authority && s.path.length > 1 && s.scheme === "file" ? t = `//${s.authority}${s.path}` : s.path.charCodeAt(0) === 47 && (s.path.charCodeAt(1) >= 65 && s.path.charCodeAt(1) <= 90 || s.path.charCodeAt(1) >= 97 && s.path.charCodeAt(1) <= 122) && s.path.charCodeAt(2) === 58 ? e ? t = s.path.substr(1) : t = s.path[1].toLowerCase() + s.path.substr(2) : t = s.path, Jn && (t = t.replace(/\//g, "\\")), t; } -function _2(s, e) { - const t = e ? Vq : j9; - let i = "", { scheme: n, authority: o, path: r, query: l, fragment: a } = s; - if (n && (i += n, i += ":"), (o || n === "file") && (i += fl, i += fl), o) { - let c = o.indexOf("@"); - if (c !== -1) { - const d = o.substr(0, c); - o = o.substr(c + 1), c = d.lastIndexOf(":"), c === -1 ? i += t(d, !1, !1) : (i += t(d.substr(0, c), !1, !1), i += ":", i += t(d.substr(c + 1), !1, !0)), i += "@"; +function _N(s, e) { + const t = e ? S$ : XD; + let i = "", { scheme: n, authority: o, path: l, query: r, fragment: c } = s; + if (n && (i += n, i += ":"), (o || n === "file") && (i += Wr, i += Wr), o) { + let d = o.indexOf("@"); + if (d !== -1) { + const a = o.substr(0, d); + o = o.substr(d + 1), d = a.lastIndexOf(":"), d === -1 ? i += t(a, !1, !1) : (i += t(a.substr(0, d), !1, !1), i += ":", i += t(a.substr(d + 1), !1, !0)), i += "@"; } - o = o.toLowerCase(), c = o.lastIndexOf(":"), c === -1 ? i += t(o, !1, !0) : (i += t(o.substr(0, c), !1, !0), i += o.substr(c)); + o = o.toLowerCase(), d = o.lastIndexOf(":"), d === -1 ? i += t(o, !1, !0) : (i += t(o.substr(0, d), !1, !0), i += o.substr(d)); } - if (r) { - if (r.length >= 3 && r.charCodeAt(0) === 47 && r.charCodeAt(2) === 58) { - const c = r.charCodeAt(1); - c >= 65 && c <= 90 && (r = `/${String.fromCharCode(c + 32)}:${r.substr(3)}`); - } else if (r.length >= 2 && r.charCodeAt(1) === 58) { - const c = r.charCodeAt(0); - c >= 65 && c <= 90 && (r = `${String.fromCharCode(c + 32)}:${r.substr(2)}`); + if (l) { + if (l.length >= 3 && l.charCodeAt(0) === 47 && l.charCodeAt(2) === 58) { + const d = l.charCodeAt(1); + d >= 65 && d <= 90 && (l = `/${String.fromCharCode(d + 32)}:${l.substr(3)}`); + } else if (l.length >= 2 && l.charCodeAt(1) === 58) { + const d = l.charCodeAt(0); + d >= 65 && d <= 90 && (l = `${String.fromCharCode(d + 32)}:${l.substr(2)}`); } - i += t(r, !0, !1); + i += t(l, !0, !1); } - return l && (i += "?", i += t(l, !1, !1)), a && (i += "#", i += e ? a : j9(a, !1, !1)), i; + return r && (i += "?", i += t(r, !1, !1)), c && (i += "#", i += e ? c : XD(c, !1, !1)), i; } -function QH(s) { +function TB(s) { try { return decodeURIComponent(s); } catch { - return s.length > 3 ? s.substr(0, 3) + QH(s.substr(3)) : s; + return s.length > 3 ? s.substr(0, 3) + TB(s.substr(3)) : s; } } -const q9 = /(%[0-9A-Za-z][0-9A-Za-z])+/g; -function $C(s) { - return s.match(q9) ? s.replace(q9, (e) => QH(e)) : s; +const VD = /(%[0-9A-Za-z][0-9A-Za-z])+/g; +function u1(s) { + return s.match(VD) ? s.replace(VD, (e) => TB(e)) : s; } -var Ge; +var ve; (function(s) { s.inMemory = "inmemory", s.vscode = "vscode", s.internal = "private", s.walkThrough = "walkThrough", s.walkThroughSnippet = "walkThroughSnippet", s.http = "http", s.https = "https", s.file = "file", s.mailto = "mailto", s.untitled = "untitled", s.data = "data", s.command = "command", s.vscodeRemote = "vscode-remote", s.vscodeRemoteResource = "vscode-remote-resource", s.vscodeManagedRemoteResource = "vscode-managed-remote-resource", s.vscodeUserData = "vscode-userdata", s.vscodeCustomEditor = "vscode-custom-editor", s.vscodeNotebookCell = "vscode-notebook-cell", s.vscodeNotebookCellMetadata = "vscode-notebook-cell-metadata", s.vscodeNotebookCellMetadataDiff = "vscode-notebook-cell-metadata-diff", s.vscodeNotebookCellOutput = "vscode-notebook-cell-output", s.vscodeNotebookCellOutputDiff = "vscode-notebook-cell-output-diff", s.vscodeNotebookMetadata = "vscode-notebook-metadata", s.vscodeInteractiveInput = "vscode-interactive-input", s.vscodeSettings = "vscode-settings", s.vscodeWorkspaceTrust = "vscode-workspace-trust", s.vscodeTerminal = "vscode-terminal", s.vscodeChatCodeBlock = "vscode-chat-code-block", s.vscodeChatCodeCompareBlock = "vscode-chat-code-compare-block", s.vscodeChatSesssion = "vscode-chat-editor", s.webviewPanel = "webview-panel", s.vscodeWebview = "vscode-webview", s.extension = "extension", s.vscodeFileResource = "vscode-file", s.tmp = "tmp", s.vsls = "vsls", s.vscodeSourceControl = "vscode-scm", s.commentsInput = "comment", s.codeSetting = "code-setting", s.outputChannel = "output"; -})(Ge || (Ge = {})); -function N_(s, e) { - return Le.isUri(s) ? Tp(s.scheme, e) : tE(s, e + ":"); +})(ve || (ve = {})); +function KS(s, e) { + return Xe.isUri(s) ? Hp(s.scheme, e) : Sv(s, e + ":"); } -function I2(s, ...e) { - return e.some((t) => N_(s, t)); +function QN(s, ...e) { + return e.some((t) => KS(s, t)); } -const kq = "tkn"; -class Gq { +const x$ = "tkn"; +class C$ { constructor() { this._hosts = /* @__PURE__ */ Object.create(null), this._ports = /* @__PURE__ */ Object.create(null), this._connectionTokens = /* @__PURE__ */ Object.create(null), this._preferredWebSchema = "http", this._delegate = null, this._serverRootPath = "/"; } @@ -4252,29 +4252,29 @@ class Gq { this._preferredWebSchema = e; } get _remoteResourcesPath() { - return vi.join(this._serverRootPath, Ge.vscodeRemoteResource); + return Mi.join(this._serverRootPath, ve.vscodeRemoteResource); } rewrite(e) { if (this._delegate) try { return this._delegate(e); - } catch (l) { - return De(l), e; + } catch (r) { + return Me(r), e; } const t = e.authority; let i = this._hosts[t]; i && i.indexOf(":") !== -1 && i.indexOf("[") === -1 && (i = `[${i}]`); const n = this._ports[t], o = this._connectionTokens[t]; - let r = `path=${encodeURIComponent(e.path)}`; - return typeof o == "string" && (r += `&${kq}=${encodeURIComponent(o)}`), Le.from({ - scheme: Dm ? this._preferredWebSchema : Ge.vscodeRemoteResource, + let l = `path=${encodeURIComponent(e.path)}`; + return typeof o == "string" && (l += `&${x$}=${encodeURIComponent(o)}`), Xe.from({ + scheme: Hb ? this._preferredWebSchema : ve.vscodeRemoteResource, authority: `${i}:${n}`, path: this._remoteResourcesPath, - query: r + query: l }); } } -const jH = new Gq(), Rq = "vscode-app", gw = class gw { +const MB = new C$(), R$ = "vscode-app", Iy = class Iy { /** * Returns a URI to use in contexts where the browser is responsible * for loading (e.g. fetch()) or when used within the DOM. @@ -4292,39 +4292,39 @@ const jH = new Gq(), Rq = "vscode-app", gw = class gw { * **Note:** use `dom.ts#asCSSUrl` whenever the URL is to be used in CSS context. */ uriToBrowserUri(e) { - return e.scheme === Ge.vscodeRemote ? jH.rewrite(e) : ( + return e.scheme === ve.vscodeRemote ? MB.rewrite(e) : ( // ...only ever for `file` resources - e.scheme === Ge.file && // ...and we run in native environments - (Na || // ...or web worker extensions on desktop - K8 === `${Ge.vscodeFileResource}://${gw.FALLBACK_AUTHORITY}`) ? e.with({ - scheme: Ge.vscodeFileResource, + e.scheme === ve.file && // ...and we run in native environments + (Mc || // ...or web worker extensions on desktop + F6 === `${ve.vscodeFileResource}://${Iy.FALLBACK_AUTHORITY}`) ? e.with({ + scheme: ve.vscodeFileResource, // We need to provide an authority here so that it can serve // as origin for network and loading matters in chromium. // If the URI is not coming with an authority already, we // add our own - authority: e.authority || gw.FALLBACK_AUTHORITY, + authority: e.authority || Iy.FALLBACK_AUTHORITY, query: null, fragment: null }) : e ); } toUri(e, t) { - if (Le.isUri(e)) + if (Xe.isUri(e)) return e; if (globalThis._VSCODE_FILE_ROOT) { const i = globalThis._VSCODE_FILE_ROOT; if (/^\w[\w\d+.-]*:\/\//.test(i)) - return Le.joinPath(Le.parse(i, !0), e); - const n = Aq(i, e); - return Le.file(n); + return Xe.joinPath(Xe.parse(i, !0), e); + const n = p$(i, e); + return Xe.file(n); } - return Le.parse(t.toUrl(e)); + return Xe.parse(t.toUrl(e)); } }; -gw.FALLBACK_AUTHORITY = Rq; -let N2 = gw; -const W_ = new N2(); -var W2; +Iy.FALLBACK_AUTHORITY = R$; +let ON = Iy; +const US = new ON(); +var jN; (function(s) { const e = /* @__PURE__ */ new Map([ ["1", { "Cross-Origin-Opener-Policy": "same-origin" }], @@ -4334,75 +4334,75 @@ var W2; s.CoopAndCoep = Object.freeze(e.get("3")); const t = "vscode-coi"; function i(o) { - let r; - typeof o == "string" ? r = new URL(o).searchParams : o instanceof URL ? r = o.searchParams : Le.isUri(o) && (r = new URL(o.toString(!0)).searchParams); - const l = r == null ? void 0 : r.get(t); - if (l) - return e.get(l); + let l; + typeof o == "string" ? l = new URL(o).searchParams : o instanceof URL ? l = o.searchParams : Xe.isUri(o) && (l = new URL(o.toString(!0)).searchParams); + const r = l == null ? void 0 : l.get(t); + if (r) + return e.get(r); } s.getHeadersFromQuery = i; - function n(o, r, l) { + function n(o, l, r) { if (!globalThis.crossOriginIsolated) return; - const a = r && l ? "3" : l ? "2" : "1"; - o instanceof URLSearchParams ? o.set(t, a) : o[t] = a; + const c = l && r ? "3" : r ? "2" : "1"; + o instanceof URLSearchParams ? o.set(t, c) : o[t] = c; } s.addSearchParam = n; -})(W2 || (W2 = {})); -function v_(s) { - return T_(s, 0); +})(jN || (jN = {})); +function PS(s) { + return BS(s, 0); } -function T_(s, e) { +function BS(s, e) { switch (typeof s) { case "object": - return s === null ? Sc(349, e) : Array.isArray(s) ? Xq(s, e) : Fq(s, e); + return s === null ? Id(349, e) : Array.isArray(s) ? w$(s, e) : T$(s, e); case "string": - return lE(s, e); + return Tv(s, e); case "boolean": - return Eq(s, e); + return N$(s, e); case "number": - return Sc(s, e); + return Id(s, e); case "undefined": - return Sc(937, e); + return Id(937, e); default: - return Sc(617, e); + return Id(617, e); } } -function Sc(s, e) { +function Id(s, e) { return (e << 5) - e + s | 0; } -function Eq(s, e) { - return Sc(s ? 433 : 863, e); +function N$(s, e) { + return Id(s ? 433 : 863, e); } -function lE(s, e) { - e = Sc(149417, e); +function Tv(s, e) { + e = Id(149417, e); for (let t = 0, i = s.length; t < i; t++) - e = Sc(s.charCodeAt(t), e); + e = Id(s.charCodeAt(t), e); return e; } -function Xq(s, e) { - return e = Sc(104579, e), s.reduce((t, i) => T_(i, t), e); +function w$(s, e) { + return e = Id(104579, e), s.reduce((t, i) => BS(i, t), e); } -function Fq(s, e) { - return e = Sc(181387, e), Object.keys(s).sort().reduce((t, i) => (t = lE(i, t), T_(s[i], t)), e); +function T$(s, e) { + return e = Id(181387, e), Object.keys(s).sort().reduce((t, i) => (t = Tv(i, t), BS(s[i], t)), e); } -function LN(s, e, t = 32) { +function HC(s, e, t = 32) { const i = t - e, n = ~((1 << i) - 1); return (s << e | (n & s) >>> i) >>> 0; } -function $9(s, e = 0, t = s.byteLength, i = 0) { +function LD(s, e = 0, t = s.byteLength, i = 0) { for (let n = 0; n < t; n++) s[e + n] = i; } -function Yq(s, e, t = "0") { +function M$(s, e, t = "0") { for (; s.length < e; ) s = t + s; return s; } -function T0(s, e = 32) { - return s instanceof ArrayBuffer ? Array.from(new Uint8Array(s)).map((t) => t.toString(16).padStart(2, "0")).join("") : Yq((s >>> 0).toString(16), e / 4); +function E0(s, e = 32) { + return s instanceof ArrayBuffer ? Array.from(new Uint8Array(s)).map((t) => t.toString(16).padStart(2, "0")).join("") : M$((s >>> 0).toString(16), e / 4); } -const $M = class $M { +const b2 = class b2 { // 80 * 4 = 320 constructor() { this._h0 = 1732584193, this._h1 = 4023233417, this._h2 = 2562383102, this._h3 = 271733878, this._h4 = 3285377520, this._buff = new Uint8Array( @@ -4415,20 +4415,20 @@ const $M = class $M { if (t === 0) return; const i = this._buff; - let n = this._buffLen, o = this._leftoverHighSurrogate, r, l; - for (o !== 0 ? (r = o, l = -1, o = 0) : (r = e.charCodeAt(0), l = 0); ; ) { - let a = r; - if (Hi(r)) - if (l + 1 < t) { - const c = e.charCodeAt(l + 1); - dm(c) ? (l++, a = iE(r, c)) : a = 65533; + let n = this._buffLen, o = this._leftoverHighSurrogate, l, r; + for (o !== 0 ? (l = o, r = -1, o = 0) : (l = e.charCodeAt(0), r = 0); ; ) { + let c = l; + if (Bi(l)) + if (r + 1 < t) { + const d = e.charCodeAt(r + 1); + pb(d) ? (r++, c = xv(l, d)) : c = 65533; } else { - o = r; + o = l; break; } - else dm(r) && (a = 65533); - if (n = this._push(i, n, a), l++, l < t) - r = e.charCodeAt(l); + else pb(l) && (c = 65533); + if (n = this._push(i, n, c), r++, r < t) + l = e.charCodeAt(r); else break; } @@ -4443,52 +4443,52 @@ const $M = class $M { this._buffLen, 65533 /* SHA1Constant.UNICODE_REPLACEMENT */ - )), this._totalLen += this._buffLen, this._wrapUp()), T0(this._h0) + T0(this._h1) + T0(this._h2) + T0(this._h3) + T0(this._h4); + )), this._totalLen += this._buffLen, this._wrapUp()), E0(this._h0) + E0(this._h1) + E0(this._h2) + E0(this._h3) + E0(this._h4); } _wrapUp() { - this._buff[this._buffLen++] = 128, $9(this._buff, this._buffLen), this._buffLen > 56 && (this._step(), $9(this._buff)); + this._buff[this._buffLen++] = 128, LD(this._buff, this._buffLen), this._buffLen > 56 && (this._step(), LD(this._buff)); const e = 8 * this._totalLen; this._buffDV.setUint32(56, Math.floor(e / 4294967296), !1), this._buffDV.setUint32(60, e % 4294967296, !1), this._step(); } _step() { - const e = $M._bigBlock32, t = this._buffDV; + const e = b2._bigBlock32, t = this._buffDV; for (let h = 0; h < 64; h += 4) e.setUint32(h, t.getUint32(h, !1), !1); for (let h = 64; h < 320; h += 4) - e.setUint32(h, LN(e.getUint32(h - 12, !1) ^ e.getUint32(h - 32, !1) ^ e.getUint32(h - 56, !1) ^ e.getUint32(h - 64, !1), 1), !1); - let i = this._h0, n = this._h1, o = this._h2, r = this._h3, l = this._h4, a, c, d; + e.setUint32(h, HC(e.getUint32(h - 12, !1) ^ e.getUint32(h - 32, !1) ^ e.getUint32(h - 56, !1) ^ e.getUint32(h - 64, !1), 1), !1); + let i = this._h0, n = this._h1, o = this._h2, l = this._h3, r = this._h4, c, d, a; for (let h = 0; h < 80; h++) - h < 20 ? (a = n & o | ~n & r, c = 1518500249) : h < 40 ? (a = n ^ o ^ r, c = 1859775393) : h < 60 ? (a = n & o | n & r | o & r, c = 2400959708) : (a = n ^ o ^ r, c = 3395469782), d = LN(i, 5) + a + l + c + e.getUint32(h * 4, !1) & 4294967295, l = r, r = o, o = LN(n, 30), n = i, i = d; - this._h0 = this._h0 + i & 4294967295, this._h1 = this._h1 + n & 4294967295, this._h2 = this._h2 + o & 4294967295, this._h3 = this._h3 + r & 4294967295, this._h4 = this._h4 + l & 4294967295; + h < 20 ? (c = n & o | ~n & l, d = 1518500249) : h < 40 ? (c = n ^ o ^ l, d = 1859775393) : h < 60 ? (c = n & o | n & l | o & l, d = 2400959708) : (c = n ^ o ^ l, d = 3395469782), a = HC(i, 5) + c + r + d + e.getUint32(h * 4, !1) & 4294967295, r = l, l = o, o = HC(n, 30), n = i, i = a; + this._h0 = this._h0 + i & 4294967295, this._h1 = this._h1 + n & 4294967295, this._h2 = this._h2 + o & 4294967295, this._h3 = this._h3 + l & 4294967295, this._h4 = this._h4 + r & 4294967295; } }; -$M._bigBlock32 = new DataView(new ArrayBuffer(320)); -let v2 = $M; -const { getWindow: xe, getWindows: qH, getWindowsCount: zq, getWindowId: lA, getWindowById: eF, onDidRegisterWindow: D_, onWillUnregisterWindow: Pq, onDidUnregisterWindow: Bq } = function() { +b2._bigBlock32 = new DataView(new ArrayBuffer(320)); +let qN = b2; +const { getWindow: Le, getWindows: YB, getWindowsCount: Y$, getWindowId: XV, getWindowById: ID, onDidRegisterWindow: _S, onWillUnregisterWindow: k$, onDidUnregisterWindow: v$ } = function() { const s = /* @__PURE__ */ new Map(); - F8(vt, 1); - const e = { window: vt, disposables: new U() }; - s.set(vt.vscodeWindowId, e); + T6(wt, 1); + const e = { window: wt, disposables: new _() }; + s.set(wt.vscodeWindowId, e); const t = new k(), i = new k(), n = new k(); - function o(r, l) { - return (typeof r == "number" ? s.get(r) : void 0) ?? (l ? e : void 0); + function o(l, r) { + return (typeof l == "number" ? s.get(l) : void 0) ?? (r ? e : void 0); } return { onDidRegisterWindow: t.event, onWillUnregisterWindow: n.event, onDidUnregisterWindow: i.event, - registerWindow(r) { - if (s.has(r.vscodeWindowId)) - return R.None; - const l = new U(), a = { - window: r, - disposables: l.add(new U()) + registerWindow(l) { + if (s.has(l.vscodeWindowId)) + return J.None; + const r = new _(), c = { + window: l, + disposables: r.add(new _()) }; - return s.set(r.vscodeWindowId, a), l.add(Ce(() => { - s.delete(r.vscodeWindowId), i.fire(r); - })), l.add(z(r, ie.BEFORE_UNLOAD, () => { - n.fire(r); - })), t.fire(a), l; + return s.set(l.vscodeWindowId, c), r.add(We(() => { + s.delete(l.vscodeWindowId), i.fire(l); + })), r.add(z(l, ie.BEFORE_UNLOAD, () => { + n.fire(l); + })), t.fire(c), r; }, getWindows() { return s.values(); @@ -4496,31 +4496,31 @@ const { getWindow: xe, getWindows: qH, getWindowsCount: zq, getWindowId: lA, get getWindowsCount() { return s.size; }, - getWindowId(r) { - return r.vscodeWindowId; + getWindowId(l) { + return l.vscodeWindowId; }, - hasWindow(r) { - return s.has(r); + hasWindow(l) { + return s.has(l); }, getWindowById: o, - getWindow(r) { - var c; - const l = r; - if ((c = l == null ? void 0 : l.ownerDocument) != null && c.defaultView) - return l.ownerDocument.defaultView.window; - const a = r; - return a != null && a.view ? a.view.window : vt; + getWindow(l) { + var d; + const r = l; + if ((d = r == null ? void 0 : r.ownerDocument) != null && d.defaultView) + return r.ownerDocument.defaultView.window; + const c = l; + return c != null && c.view ? c.view.window : wt; }, - getDocument(r) { - return xe(r).document; + getDocument(l) { + return Le(l).document; } }; }(); -function gn(s) { +function bn(s) { for (; s.firstChild; ) s.firstChild.remove(); } -class Oq { +class J$ { constructor(e, t, i, n) { this._node = e, this._type = t, this._handler = i, this._options = n || !1, this._node.addEventListener(this._type, this._handler, this._options); } @@ -4529,50 +4529,50 @@ class Oq { } } function z(s, e, t, i) { - return new Oq(s, e, t, i); + return new J$(s, e, t, i); } -function $H(s, e) { +function kB(s, e) { return function(t) { - return e(new Er(s, t)); + return e(new Fl(s, t)); }; } -function Hq(s) { +function H$(s) { return function(e) { - return s(new Vt(e)); + return s(new Yt(e)); }; } -const ai = function(e, t, i, n) { +const di = function(e, t, i, n) { let o = i; - return t === "click" || t === "mousedown" || t === "contextmenu" ? o = $H(xe(e), i) : (t === "keydown" || t === "keypress" || t === "keyup") && (o = Hq(i)), z(e, t, o, n); -}, Jq = function(e, t, i) { - const n = $H(xe(e), t); - return Uq(e, n, i); + return t === "click" || t === "mousedown" || t === "contextmenu" ? o = kB(Le(e), i) : (t === "keydown" || t === "keypress" || t === "keyup") && (o = H$(i)), z(e, t, o, n); +}, E$ = function(e, t, i) { + const n = kB(Le(e), t); + return D$(e, n, i); }; -function Uq(s, e, t) { - return z(s, Wa && HR.pointerEvents ? ie.POINTER_DOWN : ie.MOUSE_DOWN, e, t); +function D$(s, e, t) { + return z(s, Yc && Zv.pointerEvents ? ie.POINTER_DOWN : ie.MOUSE_DOWN, e, t); } -function ny(s, e, t) { - return Zy(s, e, t); +function mf(s, e, t) { + return Jf(s, e, t); } -class AN extends _H { +class EC extends dB { constructor(e, t) { super(e, t); } } -let aA, po; -class aE extends $R { +let VV, Zo; +class Mv extends Lv { /** * * @param node The optional node from which the target window is determined */ constructor(e) { - super(), this.defaultTarget = e && xe(e); + super(), this.defaultTarget = e && Le(e); } cancelAndSet(e, t, i) { return super.cancelAndSet(e, t, i ?? this.defaultTarget); } } -class xN { +class DC { constructor(e, t = 0) { this._runner = e, this.priority = t, this._canceled = !1; } @@ -4584,7 +4584,7 @@ class xN { try { this._runner(); } catch (e) { - De(e); + Me(e); } } // Sort by priority (largest to lowest) @@ -4595,87 +4595,87 @@ class xN { (function() { const s = /* @__PURE__ */ new Map(), e = /* @__PURE__ */ new Map(), t = /* @__PURE__ */ new Map(), i = /* @__PURE__ */ new Map(), n = (o) => { t.set(o, !1); - const r = s.get(o) ?? []; - for (e.set(o, r), s.set(o, []), i.set(o, !0); r.length > 0; ) - r.sort(xN.sort), r.shift().execute(); + const l = s.get(o) ?? []; + for (e.set(o, l), s.set(o, []), i.set(o, !0); l.length > 0; ) + l.sort(DC.sort), l.shift().execute(); i.set(o, !1); }; - po = (o, r, l = 0) => { - const a = lA(o), c = new xN(r, l); - let d = s.get(a); - return d || (d = [], s.set(a, d)), d.push(c), t.get(a) || (t.set(a, !0), o.requestAnimationFrame(() => n(a))), c; - }, aA = (o, r, l) => { - const a = lA(o); - if (i.get(a)) { - const c = new xN(r, l); - let d = e.get(a); - return d || (d = [], e.set(a, d)), d.push(c), c; + Zo = (o, l, r = 0) => { + const c = XV(o), d = new DC(l, r); + let a = s.get(c); + return a || (a = [], s.set(c, a)), a.push(d), t.get(c) || (t.set(c, !0), o.requestAnimationFrame(() => n(c))), d; + }, VV = (o, l, r) => { + const c = XV(o); + if (i.get(c)) { + const d = new DC(l, r); + let a = e.get(c); + return a || (a = [], e.set(c, a)), a.push(d), d; } else - return po(o, r, l); + return Zo(o, l, r); }; })(); -function V_(s) { - return xe(s).getComputedStyle(s, null); +function QS(s) { + return Le(s).getComputedStyle(s, null); } -function Wh(s, e) { - const t = xe(s), i = t.document; +function Yh(s, e) { + const t = Le(s), i = t.document; if (s !== i.body) - return new Lt(s.clientWidth, s.clientHeight); - if (Wa && (t != null && t.visualViewport)) - return new Lt(t.visualViewport.width, t.visualViewport.height); + return new Xt(s.clientWidth, s.clientHeight); + if (Yc && (t != null && t.visualViewport)) + return new Xt(t.visualViewport.width, t.visualViewport.height); if (t != null && t.innerWidth && t.innerHeight) - return new Lt(t.innerWidth, t.innerHeight); + return new Xt(t.innerWidth, t.innerHeight); if (i.body && i.body.clientWidth && i.body.clientHeight) - return new Lt(i.body.clientWidth, i.body.clientHeight); + return new Xt(i.body.clientWidth, i.body.clientHeight); if (i.documentElement && i.documentElement.clientWidth && i.documentElement.clientHeight) - return new Lt(i.documentElement.clientWidth, i.documentElement.clientHeight); + return new Xt(i.documentElement.clientWidth, i.documentElement.clientHeight); throw new Error("Unable to figure out browser width and height"); } -class xi { +class Ii { // Adapted from WinJS // Converts a CSS positioning string for the specified element to pixels. static convertToPixels(e, t) { return parseFloat(t) || 0; } static getDimension(e, t, i) { - const n = V_(e), o = n ? n.getPropertyValue(t) : "0"; - return xi.convertToPixels(e, o); + const n = QS(e), o = n ? n.getPropertyValue(t) : "0"; + return Ii.convertToPixels(e, o); } static getBorderLeftWidth(e) { - return xi.getDimension(e, "border-left-width", "borderLeftWidth"); + return Ii.getDimension(e, "border-left-width", "borderLeftWidth"); } static getBorderRightWidth(e) { - return xi.getDimension(e, "border-right-width", "borderRightWidth"); + return Ii.getDimension(e, "border-right-width", "borderRightWidth"); } static getBorderTopWidth(e) { - return xi.getDimension(e, "border-top-width", "borderTopWidth"); + return Ii.getDimension(e, "border-top-width", "borderTopWidth"); } static getBorderBottomWidth(e) { - return xi.getDimension(e, "border-bottom-width", "borderBottomWidth"); + return Ii.getDimension(e, "border-bottom-width", "borderBottomWidth"); } static getPaddingLeft(e) { - return xi.getDimension(e, "padding-left", "paddingLeft"); + return Ii.getDimension(e, "padding-left", "paddingLeft"); } static getPaddingRight(e) { - return xi.getDimension(e, "padding-right", "paddingRight"); + return Ii.getDimension(e, "padding-right", "paddingRight"); } static getPaddingTop(e) { - return xi.getDimension(e, "padding-top", "paddingTop"); + return Ii.getDimension(e, "padding-top", "paddingTop"); } static getPaddingBottom(e) { - return xi.getDimension(e, "padding-bottom", "paddingBottom"); + return Ii.getDimension(e, "padding-bottom", "paddingBottom"); } static getMarginLeft(e) { - return xi.getDimension(e, "margin-left", "marginLeft"); + return Ii.getDimension(e, "margin-left", "marginLeft"); } static getMarginTop(e) { - return xi.getDimension(e, "margin-top", "marginTop"); + return Ii.getDimension(e, "margin-top", "marginTop"); } static getMarginRight(e) { - return xi.getDimension(e, "margin-right", "marginRight"); + return Ii.getDimension(e, "margin-right", "marginRight"); } static getMarginBottom(e) { - return xi.getDimension(e, "margin-bottom", "marginBottom"); + return Ii.getDimension(e, "margin-bottom", "marginBottom"); } } const Ou = class Ou { @@ -4696,24 +4696,24 @@ const Ou = class Ou { } }; Ou.None = new Ou(0, 0); -let Lt = Ou; -function eJ(s) { +let Xt = Ou; +function vB(s) { let e = s.offsetParent, t = s.offsetTop, i = s.offsetLeft; for (; (s = s.parentNode) !== null && s !== s.ownerDocument.body && s !== s.ownerDocument.documentElement; ) { t -= s.scrollTop; - const n = iJ(s) ? null : V_(s); - n && (i -= n.direction !== "rtl" ? s.scrollLeft : -s.scrollLeft), s === e && (i += xi.getBorderLeftWidth(s), t += xi.getBorderTopWidth(s), t += s.offsetTop, i += s.offsetLeft, e = s.offsetParent); + const n = HB(s) ? null : QS(s); + n && (i -= n.direction !== "rtl" ? s.scrollLeft : -s.scrollLeft), s === e && (i += Ii.getBorderLeftWidth(s), t += Ii.getBorderTopWidth(s), t += s.offsetTop, i += s.offsetLeft, e = s.offsetParent); } return { left: i, top: t }; } -function Kq(s, e, t) { +function F$(s, e, t) { typeof e == "number" && (s.style.width = `${e}px`), typeof t == "number" && (s.style.height = `${t}px`); } function yi(s) { - const e = s.getBoundingClientRect(), t = xe(s); + const e = s.getBoundingClientRect(), t = Le(s); return { left: e.left + t.scrollX, top: e.top + t.scrollY, @@ -4721,34 +4721,34 @@ function yi(s) { height: e.height }; } -function tJ(s) { +function JB(s) { let e = s, t = 1; do { - const i = V_(e).zoom; + const i = QS(e).zoom; i != null && i !== "1" && (t *= i), e = e.parentElement; } while (e !== null && e !== e.ownerDocument.documentElement); return t; } -function $s(s) { - const e = xi.getMarginLeft(s) + xi.getMarginRight(s); +function to(s) { + const e = Ii.getMarginLeft(s) + Ii.getMarginRight(s); return s.offsetWidth + e; } -function MN(s) { - const e = xi.getBorderLeftWidth(s) + xi.getBorderRightWidth(s), t = xi.getPaddingLeft(s) + xi.getPaddingRight(s); +function FC(s) { + const e = Ii.getBorderLeftWidth(s) + Ii.getBorderRightWidth(s), t = Ii.getPaddingLeft(s) + Ii.getPaddingRight(s); return s.offsetWidth - e - t; } -function Qq(s) { - const e = xi.getBorderTopWidth(s) + xi.getBorderBottomWidth(s), t = xi.getPaddingTop(s) + xi.getPaddingBottom(s); +function z$(s) { + const e = Ii.getBorderTopWidth(s) + Ii.getBorderBottomWidth(s), t = Ii.getPaddingTop(s) + Ii.getPaddingBottom(s); return s.offsetHeight - e - t; } -function Lc(s) { - const e = xi.getMarginTop(s) + xi.getMarginBottom(s); +function Sd(s) { + const e = Ii.getMarginTop(s) + Ii.getMarginBottom(s); return s.offsetHeight + e; } -function Ji(s, e) { +function _i(s, e) { return !!(e != null && e.contains(s)); } -function jq(s, e, t) { +function A$(s, e, t) { for (; s && s.nodeType === s.ELEMENT_NODE; ) { if (s.classList.contains(e)) return s; @@ -4763,155 +4763,155 @@ function jq(s, e, t) { } return null; } -function ZN(s, e, t) { - return !!jq(s, e, t); +function zC(s, e, t) { + return !!A$(s, e, t); } -function iJ(s) { +function HB(s) { return s && !!s.host && !!s.mode; } -function cA(s) { - return !!hm(s); +function LV(s) { + return !!gb(s); } -function hm(s) { +function gb(s) { var e; for (; s.parentNode; ) { if (s === ((e = s.ownerDocument) == null ? void 0 : e.body)) return null; s = s.parentNode; } - return iJ(s) ? s : null; + return HB(s) ? s : null; } -function _n() { - let s = Qb().activeElement; +function Cn() { + let s = i0().activeElement; for (; s != null && s.shadowRoot; ) s = s.shadowRoot.activeElement; return s; } -function k_(s) { - return _n() === s; +function OS(s) { + return Cn() === s; } -function nJ(s) { - return Ji(_n(), s); +function EB(s) { + return _i(Cn(), s); } -function Qb() { - return zq() <= 1 ? vt.document : Array.from(qH()).map(({ window: e }) => e.document).find((e) => e.hasFocus()) ?? vt.document; +function i0() { + return Y$() <= 1 ? wt.document : Array.from(YB()).map(({ window: e }) => e.document).find((e) => e.hasFocus()) ?? wt.document; } -function sy() { +function bf() { var e; - return ((e = Qb().defaultView) == null ? void 0 : e.window) ?? vt; + return ((e = i0().defaultView) == null ? void 0 : e.window) ?? wt; } -const cE = /* @__PURE__ */ new Map(); -function sJ() { - return new qq(); +const Yv = /* @__PURE__ */ new Map(); +function DB() { + return new K$(); } -class qq { +class K$ { constructor() { this._currentCssStyle = "", this._styleSheet = void 0; } setStyle(e) { - e !== this._currentCssStyle && (this._currentCssStyle = e, this._styleSheet ? this._styleSheet.innerText = e : this._styleSheet = Bo(vt.document.head, (t) => t.innerText = e)); + e !== this._currentCssStyle && (this._currentCssStyle = e, this._styleSheet ? this._styleSheet.innerText = e : this._styleSheet = Po(wt.document.head, (t) => t.innerText = e)); } dispose() { this._styleSheet && (this._styleSheet.remove(), this._styleSheet = void 0); } } -function Bo(s = vt.document.head, e, t) { +function Po(s = wt.document.head, e, t) { const i = document.createElement("style"); - if (i.type = "text/css", i.media = "screen", e == null || e(i), s.appendChild(i), t && t.add(Ce(() => i.remove())), s === vt.document.head) { + if (i.type = "text/css", i.media = "screen", e == null || e(i), s.appendChild(i), t && t.add(We(() => i.remove())), s === wt.document.head) { const n = /* @__PURE__ */ new Set(); - cE.set(i, n); - for (const { window: o, disposables: r } of qH()) { - if (o === vt) + Yv.set(i, n); + for (const { window: o, disposables: l } of YB()) { + if (o === wt) continue; - const l = r.add($q(i, n, o)); - t == null || t.add(l); + const r = l.add(U$(i, n, o)); + t == null || t.add(r); } } return i; } -function $q(s, e, t) { - var o, r; - const i = new U(), n = s.cloneNode(!0); - t.document.head.appendChild(n), i.add(Ce(() => n.remove())); - for (const l of rJ(s)) - (r = n.sheet) == null || r.insertRule(l.cssText, (o = n.sheet) == null ? void 0 : o.cssRules.length); - return i.add(e$.observe(s, i, { childList: !0 })(() => { +function U$(s, e, t) { + var o, l; + const i = new _(), n = s.cloneNode(!0); + t.document.head.appendChild(n), i.add(We(() => n.remove())); + for (const r of zB(s)) + (l = n.sheet) == null || l.insertRule(r.cssText, (o = n.sheet) == null ? void 0 : o.cssRules.length); + return i.add(P$.observe(s, i, { childList: !0 })(() => { n.textContent = s.textContent; - })), e.add(n), i.add(Ce(() => e.delete(n))), i; + })), e.add(n), i.add(We(() => e.delete(n))), i; } -const e$ = new class { +const P$ = new class { constructor() { this.mutationObservers = /* @__PURE__ */ new Map(); } observe(s, e, t) { let i = this.mutationObservers.get(s); i || (i = /* @__PURE__ */ new Map(), this.mutationObservers.set(s, i)); - const n = v_(t); + const n = PS(t); let o = i.get(n); if (o) o.users += 1; else { - const r = new k(), l = new MutationObserver((c) => r.fire(c)); - l.observe(s, t); - const a = o = { + const l = new k(), r = new MutationObserver((d) => l.fire(d)); + r.observe(s, t); + const c = o = { users: 1, - observer: l, - onDidMutate: r.event + observer: r, + onDidMutate: l.event }; - e.add(Ce(() => { - a.users -= 1, a.users === 0 && (r.dispose(), l.disconnect(), i == null || i.delete(n), (i == null ? void 0 : i.size) === 0 && this.mutationObservers.delete(s)); + e.add(We(() => { + c.users -= 1, c.users === 0 && (l.dispose(), r.disconnect(), i == null || i.delete(n), (i == null ? void 0 : i.size) === 0 && this.mutationObservers.delete(s)); })), i.set(n, o); } return o.onDidMutate; } }(); -let _N = null; -function oJ() { - return _N || (_N = Bo()), _N; +let AC = null; +function FB() { + return AC || (AC = Po()), AC; } -function rJ(s) { +function zB(s) { var e, t; return (e = s == null ? void 0 : s.sheet) != null && e.rules ? s.sheet.rules : (t = s == null ? void 0 : s.sheet) != null && t.cssRules ? s.sheet.cssRules : []; } -function dA(s, e, t = oJ()) { +function IV(s, e, t = FB()) { var i; if (!(!t || !e)) { (i = t.sheet) == null || i.insertRule(`${s} {${e}}`, 0); - for (const n of cE.get(t) ?? []) - dA(s, e, n); + for (const n of Yv.get(t) ?? []) + IV(s, e, n); } } -function T2(s, e = oJ()) { +function $N(s, e = FB()) { var n; if (!e) return; - const t = rJ(e), i = []; + const t = zB(e), i = []; for (let o = 0; o < t.length; o++) { - const r = t[o]; - t$(r) && r.selectorText.indexOf(s) !== -1 && i.push(o); + const l = t[o]; + B$(l) && l.selectorText.indexOf(s) !== -1 && i.push(o); } for (let o = i.length - 1; o >= 0; o--) (n = e.sheet) == null || n.deleteRule(i[o]); - for (const o of cE.get(e) ?? []) - T2(s, o); + for (const o of Yv.get(e) ?? []) + $N(s, o); } -function t$(s) { +function B$(s) { return typeof s.selectorText == "string"; } -function Ki(s) { - return s instanceof HTMLElement || s instanceof xe(s).HTMLElement; +function Oi(s) { + return s instanceof HTMLElement || s instanceof Le(s).HTMLElement; } -function tF(s) { - return s instanceof HTMLAnchorElement || s instanceof xe(s).HTMLAnchorElement; +function SD(s) { + return s instanceof HTMLAnchorElement || s instanceof Le(s).HTMLAnchorElement; } -function i$(s) { - return s instanceof SVGElement || s instanceof xe(s).SVGElement; +function _$(s) { + return s instanceof SVGElement || s instanceof Le(s).SVGElement; } -function dE(s) { - return s instanceof MouseEvent || s instanceof xe(s).MouseEvent; +function kv(s) { + return s instanceof MouseEvent || s instanceof Le(s).MouseEvent; } -function uc(s) { - return s instanceof KeyboardEvent || s instanceof xe(s).KeyboardEvent; +function gd(s) { + return s instanceof KeyboardEvent || s instanceof Le(s).KeyboardEvent; } const ie = { // Mouse @@ -4950,131 +4950,131 @@ const ie = { DROP: "drop", DRAG_END: "dragend" }; -function n$(s) { +function Q$(s) { const e = s; return !!(e && typeof e.preventDefault == "function" && typeof e.stopPropagation == "function"); } const tt = { stop: (s, e) => (s.preventDefault(), e && s.stopPropagation(), s) }; -function s$(s) { +function O$(s) { const e = []; for (let t = 0; s && s.nodeType === s.ELEMENT_NODE; t++) e[t] = s.scrollTop, s = s.parentNode; return e; } -function o$(s, e) { +function j$(s, e) { for (let t = 0; s && s.nodeType === s.ELEMENT_NODE; t++) s.scrollTop !== e[t] && (s.scrollTop = e[t]), s = s.parentNode; } -class hA extends R { +class SV extends J { static hasFocusWithin(e) { - if (Ki(e)) { - const t = hm(e), i = t ? t.activeElement : e.ownerDocument.activeElement; - return Ji(i, e); + if (Oi(e)) { + const t = gb(e), i = t ? t.activeElement : e.ownerDocument.activeElement; + return _i(i, e); } else { const t = e; - return Ji(t.document.activeElement, t.document); + return _i(t.document.activeElement, t.document); } } constructor(e) { super(), this._onDidFocus = this._register(new k()), this.onDidFocus = this._onDidFocus.event, this._onDidBlur = this._register(new k()), this.onDidBlur = this._onDidBlur.event; - let t = hA.hasFocusWithin(e), i = !1; + let t = SV.hasFocusWithin(e), i = !1; const n = () => { i = !1, t || (t = !0, this._onDidFocus.fire()); }, o = () => { - t && (i = !0, (Ki(e) ? xe(e) : e).setTimeout(() => { + t && (i = !0, (Oi(e) ? Le(e) : e).setTimeout(() => { i && (i = !1, t = !1, this._onDidBlur.fire()); }, 0)); }; this._refreshStateHandler = () => { - hA.hasFocusWithin(e) !== t && (t ? o() : n()); - }, this._register(z(e, ie.FOCUS, n, !0)), this._register(z(e, ie.BLUR, o, !0)), Ki(e) && (this._register(z(e, ie.FOCUS_IN, () => this._refreshStateHandler())), this._register(z(e, ie.FOCUS_OUT, () => this._refreshStateHandler()))); + SV.hasFocusWithin(e) !== t && (t ? o() : n()); + }, this._register(z(e, ie.FOCUS, n, !0)), this._register(z(e, ie.BLUR, o, !0)), Oi(e) && (this._register(z(e, ie.FOCUS_IN, () => this._refreshStateHandler())), this._register(z(e, ie.FOCUS_OUT, () => this._refreshStateHandler()))); } } -function vl(s) { - return new hA(s); +function kr(s) { + return new SV(s); } -function r$(s, e) { +function q$(s, e) { return s.after(e), e; } -function Q(s, ...e) { +function O(s, ...e) { if (s.append(...e), e.length === 1 && typeof e[0] != "string") return e[0]; } -function hE(s, e) { +function vv(s, e) { return s.insertBefore(e, s.firstChild), e; } -function In(s, ...e) { - s.innerText = "", Q(s, ...e); +function Rn(s, ...e) { + s.innerText = "", O(s, ...e); } -const l$ = /([\w\-]+)?(#([\w\-]+))?((\.([\w\-]+))*)/; -var Dw; +const $$ = /([\w\-]+)?(#([\w\-]+))?((\.([\w\-]+))*)/; +var Uy; (function(s) { s.HTML = "http://www.w3.org/1999/xhtml", s.SVG = "http://www.w3.org/2000/svg"; -})(Dw || (Dw = {})); -function lJ(s, e, t, ...i) { - const n = l$.exec(e); +})(Uy || (Uy = {})); +function AB(s, e, t, ...i) { + const n = $$.exec(e); if (!n) throw new Error("Bad use of emmet"); const o = n[1] || "div"; - let r; - return s !== Dw.HTML ? r = document.createElementNS(s, o) : r = document.createElement(o), n[3] && (r.id = n[3]), n[4] && (r.className = n[4].replace(/\./g, " ").trim()), t && Object.entries(t).forEach(([l, a]) => { - typeof a > "u" || (/^on\w+$/.test(l) ? r[l] = a : l === "selected" ? a && r.setAttribute(l, "true") : r.setAttribute(l, a)); - }), r.append(...i), r; + let l; + return s !== Uy.HTML ? l = document.createElementNS(s, o) : l = document.createElement(o), n[3] && (l.id = n[3]), n[4] && (l.className = n[4].replace(/\./g, " ").trim()), t && Object.entries(t).forEach(([r, c]) => { + typeof c > "u" || (/^on\w+$/.test(r) ? l[r] = c : r === "selected" ? c && l.setAttribute(r, "true") : l.setAttribute(r, c)); + }), l.append(...i), l; } -function ce(s, e, ...t) { - return lJ(Dw.HTML, s, e, ...t); +function de(s, e, ...t) { + return AB(Uy.HTML, s, e, ...t); } -ce.SVG = function(s, e, ...t) { - return lJ(Dw.SVG, s, e, ...t); +de.SVG = function(s, e, ...t) { + return AB(Uy.SVG, s, e, ...t); }; -function a$(s, ...e) { - s ? no(...e) : rs(...e); +function eee(s, ...e) { + s ? oo(...e) : cs(...e); } -function no(...s) { +function oo(...s) { for (const e of s) e.style.display = "", e.removeAttribute("aria-hidden"); } -function rs(...s) { +function cs(...s) { for (const e of s) e.style.display = "none", e.setAttribute("aria-hidden", "true"); } -function iF(s, e) { +function xD(s, e) { const t = s.devicePixelRatio * e; return Math.max(1, Math.floor(t)) / s.devicePixelRatio; } -function aJ(s) { - vt.open(s, "_blank", "noopener"); +function KB(s) { + wt.open(s, "_blank", "noopener"); } -function c$(s, e) { +function tee(s, e) { const t = () => { - e(), i = po(s, t); + e(), i = Zo(s, t); }; - let i = po(s, t); - return Ce(() => i.dispose()); + let i = Zo(s, t); + return We(() => i.dispose()); } -jH.setPreferredWebSchema(/^https:/.test(vt.location.href) ? "https" : "http"); -function Pc(s) { - return s ? `url('${W_.uriToBrowserUri(s).toString(!0).replace(/'/g, "%27")}')` : "url('')"; +MB.setPreferredWebSchema(/^https:/.test(wt.location.href) ? "https" : "http"); +function Bd(s) { + return s ? `url('${US.uriToBrowserUri(s).toString(!0).replace(/'/g, "%27")}')` : "url('')"; } -function IN(s) { +function KC(s) { return `'${s.replace(/'/g, "%27")}'`; } -function Gc(s, e) { +function Dd(s, e) { if (s !== void 0) { const t = s.match(/^\s*var\((.+)\)$/); if (t) { const i = t[1].split(",", 2); - return i.length === 2 && (e = Gc(i[1].trim(), e)), `var(${i[0]}, ${e})`; + return i.length === 2 && (e = Dd(i[1].trim(), e)), `var(${i[0]}, ${e})`; } return s; } return e; } -function d$(s, e = !1) { +function iee(s, e = !1) { const t = document.createElement("a"); - return VH("afterSanitizeAttributes", (i) => { + return gB("afterSanitizeAttributes", (i) => { for (const n of ["href", "src"]) if (i.hasAttribute(n)) { const o = i.getAttribute(n); @@ -5086,11 +5086,11 @@ function d$(s, e = !1) { i.removeAttribute(n); } } - }), Ce(() => { - kH("afterSanitizeAttributes"); + }), We(() => { + ZB("afterSanitizeAttributes"); }); } -const h$ = Object.freeze([ +const nee = Object.freeze([ "a", "abbr", "b", @@ -5159,20 +5159,20 @@ const h$ = Object.freeze([ "video", "wbr" ]); -class Ac extends k { +class xd extends k { constructor() { - super(), this._subscriptions = new U(), this._keyStatus = { + super(), this._subscriptions = new _(), this._keyStatus = { altKey: !1, shiftKey: !1, ctrlKey: !1, metaKey: !1 - }, this._subscriptions.add(se.runAndSubscribe(D_, ({ window: e, disposables: t }) => this.registerListeners(e, t), { window: vt, disposables: this._subscriptions })); + }, this._subscriptions.add(se.runAndSubscribe(_S, ({ window: e, disposables: t }) => this.registerListeners(e, t), { window: wt, disposables: this._subscriptions })); } registerListeners(e, t) { t.add(z(e, "keydown", (i) => { if (i.defaultPrevented) return; - const n = new Vt(i); + const n = new Yt(i); if (!(n.keyCode === 6 && i.repeat)) { if (i.altKey && !this._keyStatus.altKey) this._keyStatus.lastKeyPressed = "alt"; @@ -5218,13 +5218,13 @@ class Ac extends k { }; } static getInstance() { - return Ac.instance || (Ac.instance = new Ac()), Ac.instance; + return xd.instance || (xd.instance = new xd()), xd.instance; } dispose() { super.dispose(), this._subscriptions.dispose(); } } -class u$ extends R { +class see extends J { constructor(e, t) { super(), this.element = e, this.callbacks = t, this.counter = 0, this.dragStartTime = 0, this.registerListeners(); } @@ -5253,114 +5253,114 @@ class u$ extends R { })); } } -const cJ = /(?[\w\-]+)?(?:#(?[\w\-]+))?(?(?:\.(?:[\w\-]+))*)(?:@(?(?:[\w\_])+))?/; -function Qe(s, ...e) { +const UB = /(?[\w\-]+)?(?:#(?[\w\-]+))?(?(?:\.(?:[\w\-]+))*)(?:@(?(?:[\w\_])+))?/; +function Oe(s, ...e) { let t, i; Array.isArray(e[0]) ? (t = {}, i = e[0]) : (t = e[0] || {}, i = e[1]); - const n = cJ.exec(s); + const n = UB.exec(s); if (!n || !n.groups) throw new Error("Bad use of h"); - const o = n.groups.tag || "div", r = document.createElement(o); - n.groups.id && (r.id = n.groups.id); - const l = []; + const o = n.groups.tag || "div", l = document.createElement(o); + n.groups.id && (l.id = n.groups.id); + const r = []; if (n.groups.class) - for (const c of n.groups.class.split(".")) - c !== "" && l.push(c); + for (const d of n.groups.class.split(".")) + d !== "" && r.push(d); if (t.className !== void 0) - for (const c of t.className.split(".")) - c !== "" && l.push(c); - l.length > 0 && (r.className = l.join(" ")); - const a = {}; - if (n.groups.name && (a[n.groups.name] = r), i) - for (const c of i) - Ki(c) ? r.appendChild(c) : typeof c == "string" ? r.append(c) : "root" in c && (Object.assign(a, c), r.appendChild(c.root)); - for (const [c, d] of Object.entries(t)) - if (c !== "className") - if (c === "style") - for (const [h, u] of Object.entries(d)) - r.style.setProperty(uA(h), typeof u == "number" ? u + "px" : "" + u); - else c === "tabIndex" ? r.tabIndex = d : r.setAttribute(uA(c), d.toString()); - return a.root = r, a; -} -function ip(s, ...e) { + for (const d of t.className.split(".")) + d !== "" && r.push(d); + r.length > 0 && (l.className = r.join(" ")); + const c = {}; + if (n.groups.name && (c[n.groups.name] = l), i) + for (const d of i) + Oi(d) ? l.appendChild(d) : typeof d == "string" ? l.append(d) : "root" in d && (Object.assign(c, d), l.appendChild(d.root)); + for (const [d, a] of Object.entries(t)) + if (d !== "className") + if (d === "style") + for (const [h, u] of Object.entries(a)) + l.style.setProperty(xV(h), typeof u == "number" ? u + "px" : "" + u); + else d === "tabIndex" ? l.tabIndex = a : l.setAttribute(xV(d), a.toString()); + return c.root = l, c; +} +function rp(s, ...e) { let t, i; Array.isArray(e[0]) ? (t = {}, i = e[0]) : (t = e[0] || {}, i = e[1]); - const n = cJ.exec(s); + const n = UB.exec(s); if (!n || !n.groups) throw new Error("Bad use of h"); - const o = n.groups.tag || "div", r = document.createElementNS("http://www.w3.org/2000/svg", o); - n.groups.id && (r.id = n.groups.id); - const l = []; + const o = n.groups.tag || "div", l = document.createElementNS("http://www.w3.org/2000/svg", o); + n.groups.id && (l.id = n.groups.id); + const r = []; if (n.groups.class) - for (const c of n.groups.class.split(".")) - c !== "" && l.push(c); + for (const d of n.groups.class.split(".")) + d !== "" && r.push(d); if (t.className !== void 0) - for (const c of t.className.split(".")) - c !== "" && l.push(c); - l.length > 0 && (r.className = l.join(" ")); - const a = {}; - if (n.groups.name && (a[n.groups.name] = r), i) - for (const c of i) - Ki(c) ? r.appendChild(c) : typeof c == "string" ? r.append(c) : "root" in c && (Object.assign(a, c), r.appendChild(c.root)); - for (const [c, d] of Object.entries(t)) - if (c !== "className") - if (c === "style") - for (const [h, u] of Object.entries(d)) - r.style.setProperty(uA(h), typeof u == "number" ? u + "px" : "" + u); - else c === "tabIndex" ? r.tabIndex = d : r.setAttribute(uA(c), d.toString()); - return a.root = r, a; -} -function uA(s) { + for (const d of t.className.split(".")) + d !== "" && r.push(d); + r.length > 0 && (l.className = r.join(" ")); + const c = {}; + if (n.groups.name && (c[n.groups.name] = l), i) + for (const d of i) + Oi(d) ? l.appendChild(d) : typeof d == "string" ? l.append(d) : "root" in d && (Object.assign(c, d), l.appendChild(d.root)); + for (const [d, a] of Object.entries(t)) + if (d !== "className") + if (d === "style") + for (const [h, u] of Object.entries(a)) + l.style.setProperty(xV(h), typeof u == "number" ? u + "px" : "" + u); + else d === "tabIndex" ? l.tabIndex = a : l.setAttribute(xV(d), a.toString()); + return c.root = l, c; +} +function xV(s) { return s.replace(/([a-z])([A-Z])/g, "$1-$2").toLowerCase(); } -const nF = 2e4; -let vu, gL, D2, mL, V2; -function g$(s) { +const CD = 2e4; +let vu, CX, ew, RX, tw; +function oee(s) { vu = document.createElement("div"), vu.className = "monaco-aria-container"; const e = () => { const i = document.createElement("div"); return i.className = "monaco-alert", i.setAttribute("role", "alert"), i.setAttribute("aria-atomic", "true"), vu.appendChild(i), i; }; - gL = e(), D2 = e(); + CX = e(), ew = e(); const t = () => { const i = document.createElement("div"); return i.className = "monaco-status", i.setAttribute("aria-live", "polite"), i.setAttribute("aria-atomic", "true"), vu.appendChild(i), i; }; - mL = t(), V2 = t(), s.appendChild(vu); + RX = t(), tw = t(), s.appendChild(vu); } -function bs(s) { - vu && (gL.textContent !== s ? (gn(D2), gA(gL, s)) : (gn(gL), gA(D2, s))); +function ys(s) { + vu && (CX.textContent !== s ? (bn(ew), CV(CX, s)) : (bn(CX), CV(ew, s))); } -function Bc(s) { - vu && (mL.textContent !== s ? (gn(V2), gA(mL, s)) : (gn(mL), gA(V2, s))); +function _d(s) { + vu && (RX.textContent !== s ? (bn(tw), CV(RX, s)) : (bn(RX), CV(tw, s))); } -function gA(s, e) { - gn(s), e.length > nF && (e = e.substr(0, nF)), s.textContent = e, s.style.visibility = "hidden", s.style.visibility = "visible"; +function CV(s, e) { + bn(s), e.length > CD && (e = e.substr(0, CD)), s.textContent = e, s.style.visibility = "hidden", s.style.visibility = "visible"; } -var Ll; +var Sr; (function(s) { s.serviceIds = /* @__PURE__ */ new Map(), s.DI_TARGET = "$di$target", s.DI_DEPENDENCIES = "$di$dependencies"; function e(t) { return t[s.DI_DEPENDENCIES] || []; } s.getServiceDependencies = e; -})(Ll || (Ll = {})); -const Se = $e("instantiationService"); -function m$(s, e, t) { - e[Ll.DI_TARGET] === e ? e[Ll.DI_DEPENDENCIES].push({ id: s, index: t }) : (e[Ll.DI_DEPENDENCIES] = [{ id: s, index: t }], e[Ll.DI_TARGET] = e); +})(Sr || (Sr = {})); +const Ge = $e("instantiationService"); +function lee(s, e, t) { + e[Sr.DI_TARGET] === e ? e[Sr.DI_DEPENDENCIES].push({ id: s, index: t }) : (e[Sr.DI_DEPENDENCIES] = [{ id: s, index: t }], e[Sr.DI_TARGET] = e); } function $e(s) { - if (Ll.serviceIds.has(s)) - return Ll.serviceIds.get(s); + if (Sr.serviceIds.has(s)) + return Sr.serviceIds.get(s); const e = function(t, i, n) { if (arguments.length !== 3) throw new Error("@IServiceName-decorator can only be used to decorate a parameter"); - m$(e, t, n); + lee(e, t, n); }; - return e.toString = () => s, Ll.serviceIds.set(s, e), e; + return e.toString = () => s, Sr.serviceIds.set(s, e), e; } -const ft = $e("codeEditorService"); -let V = class Su { +const gt = $e("codeEditorService"); +let Y = class Su { constructor(e, t) { this.lineNumber = e, this.column = t; } @@ -5428,8 +5428,8 @@ let V = class Su { static compare(e, t) { const i = e.lineNumber | 0, n = t.lineNumber | 0; if (i === n) { - const o = e.column | 0, r = t.column | 0; - return o - r; + const o = e.column | 0, l = t.column | 0; + return o - l; } return i - n; } @@ -5465,8 +5465,8 @@ let V = class Su { }; } }; -const Pt = $e("modelService"), Ys = $e("textModelService"); -class lo extends R { +const At = $e("modelService"), As = $e("textModelService"); +class ao extends J { constructor(e, t = "", i = "", n = !0, o) { super(), this._onDidChange = this._register(new k()), this.onDidChange = this._onDidChange.event, this._enabled = !0, this._id = e, this._label = t, this._cssClass = i, this._enabled = n, this._actionCallback = o; } @@ -5522,7 +5522,7 @@ class lo extends R { this._actionCallback && await this._actionCallback(e); } } -class um extends R { +class Zb extends J { constructor() { super(...arguments), this._onWillRun = this._register(new k()), this.onWillRun = this._onWillRun.event, this._onDidRun = this._register(new k()), this.onDidRun = this._onDidRun.event; } @@ -5542,9 +5542,9 @@ class um extends R { await e.run(t); } } -const mw = class mw { +const Sy = class Sy { constructor() { - this.id = mw.ID, this.label = "", this.tooltip = "", this.class = "separator", this.enabled = !1, this.checked = !1; + this.id = Sy.ID, this.label = "", this.tooltip = "", this.class = "separator", this.enabled = !1, this.checked = !1; } /** * Joins all non-empty lists of actions with separators. @@ -5552,15 +5552,15 @@ const mw = class mw { static join(...e) { let t = []; for (const i of e) - i.length && (t.length ? t = [...t, new mw(), ...i] : t = i); + i.length && (t.length ? t = [...t, new Sy(), ...i] : t = i); return t; } async run() { } }; -mw.ID = "vs.actions.separator"; -let Qi = mw; -class ab { +Sy.ID = "vs.actions.separator"; +let ji = Sy; +class bZ { get actions() { return this._actions; } @@ -5570,14 +5570,14 @@ class ab { async run() { } } -const eZ = class eZ extends lo { +const p2 = class p2 extends ao { constructor() { - super(eZ.ID, p("submenu.empty", "(empty)"), void 0, !1); + super(p2.ID, p("submenu.empty", "(empty)"), void 0, !1); } }; -eZ.ID = "vs.actions.empty"; -let k2 = eZ; -function og(s) { +p2.ID = "vs.actions.empty"; +let iw = p2; +function am(s) { return { id: s.id, label: s.label, @@ -5588,641 +5588,641 @@ function og(s) { run: async (...e) => s.run(...e) }; } -const G2 = /* @__PURE__ */ Object.create(null); -function A(s, e) { - if (Vs(e)) { - const t = G2[e]; +const nw = /* @__PURE__ */ Object.create(null); +function V(s, e) { + if (vs(e)) { + const t = nw[e]; if (t === void 0) throw new Error(`${s} references an unknown codicon: ${e}`); e = t; } - return G2[s] = e, { id: s }; -} -function dJ() { - return G2; -} -const p$ = { - add: A("add", 6e4), - plus: A("plus", 6e4), - gistNew: A("gist-new", 6e4), - repoCreate: A("repo-create", 6e4), - lightbulb: A("lightbulb", 60001), - lightBulb: A("light-bulb", 60001), - repo: A("repo", 60002), - repoDelete: A("repo-delete", 60002), - gistFork: A("gist-fork", 60003), - repoForked: A("repo-forked", 60003), - gitPullRequest: A("git-pull-request", 60004), - gitPullRequestAbandoned: A("git-pull-request-abandoned", 60004), - recordKeys: A("record-keys", 60005), - keyboard: A("keyboard", 60005), - tag: A("tag", 60006), - gitPullRequestLabel: A("git-pull-request-label", 60006), - tagAdd: A("tag-add", 60006), - tagRemove: A("tag-remove", 60006), - person: A("person", 60007), - personFollow: A("person-follow", 60007), - personOutline: A("person-outline", 60007), - personFilled: A("person-filled", 60007), - gitBranch: A("git-branch", 60008), - gitBranchCreate: A("git-branch-create", 60008), - gitBranchDelete: A("git-branch-delete", 60008), - sourceControl: A("source-control", 60008), - mirror: A("mirror", 60009), - mirrorPublic: A("mirror-public", 60009), - star: A("star", 60010), - starAdd: A("star-add", 60010), - starDelete: A("star-delete", 60010), - starEmpty: A("star-empty", 60010), - comment: A("comment", 60011), - commentAdd: A("comment-add", 60011), - alert: A("alert", 60012), - warning: A("warning", 60012), - search: A("search", 60013), - searchSave: A("search-save", 60013), - logOut: A("log-out", 60014), - signOut: A("sign-out", 60014), - logIn: A("log-in", 60015), - signIn: A("sign-in", 60015), - eye: A("eye", 60016), - eyeUnwatch: A("eye-unwatch", 60016), - eyeWatch: A("eye-watch", 60016), - circleFilled: A("circle-filled", 60017), - primitiveDot: A("primitive-dot", 60017), - closeDirty: A("close-dirty", 60017), - debugBreakpoint: A("debug-breakpoint", 60017), - debugBreakpointDisabled: A("debug-breakpoint-disabled", 60017), - debugHint: A("debug-hint", 60017), - terminalDecorationSuccess: A("terminal-decoration-success", 60017), - primitiveSquare: A("primitive-square", 60018), - edit: A("edit", 60019), - pencil: A("pencil", 60019), - info: A("info", 60020), - issueOpened: A("issue-opened", 60020), - gistPrivate: A("gist-private", 60021), - gitForkPrivate: A("git-fork-private", 60021), - lock: A("lock", 60021), - mirrorPrivate: A("mirror-private", 60021), - close: A("close", 60022), - removeClose: A("remove-close", 60022), - x: A("x", 60022), - repoSync: A("repo-sync", 60023), - sync: A("sync", 60023), - clone: A("clone", 60024), - desktopDownload: A("desktop-download", 60024), - beaker: A("beaker", 60025), - microscope: A("microscope", 60025), - vm: A("vm", 60026), - deviceDesktop: A("device-desktop", 60026), - file: A("file", 60027), - fileText: A("file-text", 60027), - more: A("more", 60028), - ellipsis: A("ellipsis", 60028), - kebabHorizontal: A("kebab-horizontal", 60028), - mailReply: A("mail-reply", 60029), - reply: A("reply", 60029), - organization: A("organization", 60030), - organizationFilled: A("organization-filled", 60030), - organizationOutline: A("organization-outline", 60030), - newFile: A("new-file", 60031), - fileAdd: A("file-add", 60031), - newFolder: A("new-folder", 60032), - fileDirectoryCreate: A("file-directory-create", 60032), - trash: A("trash", 60033), - trashcan: A("trashcan", 60033), - history: A("history", 60034), - clock: A("clock", 60034), - folder: A("folder", 60035), - fileDirectory: A("file-directory", 60035), - symbolFolder: A("symbol-folder", 60035), - logoGithub: A("logo-github", 60036), - markGithub: A("mark-github", 60036), - github: A("github", 60036), - terminal: A("terminal", 60037), - console: A("console", 60037), - repl: A("repl", 60037), - zap: A("zap", 60038), - symbolEvent: A("symbol-event", 60038), - error: A("error", 60039), - stop: A("stop", 60039), - variable: A("variable", 60040), - symbolVariable: A("symbol-variable", 60040), - array: A("array", 60042), - symbolArray: A("symbol-array", 60042), - symbolModule: A("symbol-module", 60043), - symbolPackage: A("symbol-package", 60043), - symbolNamespace: A("symbol-namespace", 60043), - symbolObject: A("symbol-object", 60043), - symbolMethod: A("symbol-method", 60044), - symbolFunction: A("symbol-function", 60044), - symbolConstructor: A("symbol-constructor", 60044), - symbolBoolean: A("symbol-boolean", 60047), - symbolNull: A("symbol-null", 60047), - symbolNumeric: A("symbol-numeric", 60048), - symbolNumber: A("symbol-number", 60048), - symbolStructure: A("symbol-structure", 60049), - symbolStruct: A("symbol-struct", 60049), - symbolParameter: A("symbol-parameter", 60050), - symbolTypeParameter: A("symbol-type-parameter", 60050), - symbolKey: A("symbol-key", 60051), - symbolText: A("symbol-text", 60051), - symbolReference: A("symbol-reference", 60052), - goToFile: A("go-to-file", 60052), - symbolEnum: A("symbol-enum", 60053), - symbolValue: A("symbol-value", 60053), - symbolRuler: A("symbol-ruler", 60054), - symbolUnit: A("symbol-unit", 60054), - activateBreakpoints: A("activate-breakpoints", 60055), - archive: A("archive", 60056), - arrowBoth: A("arrow-both", 60057), - arrowDown: A("arrow-down", 60058), - arrowLeft: A("arrow-left", 60059), - arrowRight: A("arrow-right", 60060), - arrowSmallDown: A("arrow-small-down", 60061), - arrowSmallLeft: A("arrow-small-left", 60062), - arrowSmallRight: A("arrow-small-right", 60063), - arrowSmallUp: A("arrow-small-up", 60064), - arrowUp: A("arrow-up", 60065), - bell: A("bell", 60066), - bold: A("bold", 60067), - book: A("book", 60068), - bookmark: A("bookmark", 60069), - debugBreakpointConditionalUnverified: A("debug-breakpoint-conditional-unverified", 60070), - debugBreakpointConditional: A("debug-breakpoint-conditional", 60071), - debugBreakpointConditionalDisabled: A("debug-breakpoint-conditional-disabled", 60071), - debugBreakpointDataUnverified: A("debug-breakpoint-data-unverified", 60072), - debugBreakpointData: A("debug-breakpoint-data", 60073), - debugBreakpointDataDisabled: A("debug-breakpoint-data-disabled", 60073), - debugBreakpointLogUnverified: A("debug-breakpoint-log-unverified", 60074), - debugBreakpointLog: A("debug-breakpoint-log", 60075), - debugBreakpointLogDisabled: A("debug-breakpoint-log-disabled", 60075), - briefcase: A("briefcase", 60076), - broadcast: A("broadcast", 60077), - browser: A("browser", 60078), - bug: A("bug", 60079), - calendar: A("calendar", 60080), - caseSensitive: A("case-sensitive", 60081), - check: A("check", 60082), - checklist: A("checklist", 60083), - chevronDown: A("chevron-down", 60084), - chevronLeft: A("chevron-left", 60085), - chevronRight: A("chevron-right", 60086), - chevronUp: A("chevron-up", 60087), - chromeClose: A("chrome-close", 60088), - chromeMaximize: A("chrome-maximize", 60089), - chromeMinimize: A("chrome-minimize", 60090), - chromeRestore: A("chrome-restore", 60091), - circleOutline: A("circle-outline", 60092), - circle: A("circle", 60092), - debugBreakpointUnverified: A("debug-breakpoint-unverified", 60092), - terminalDecorationIncomplete: A("terminal-decoration-incomplete", 60092), - circleSlash: A("circle-slash", 60093), - circuitBoard: A("circuit-board", 60094), - clearAll: A("clear-all", 60095), - clippy: A("clippy", 60096), - closeAll: A("close-all", 60097), - cloudDownload: A("cloud-download", 60098), - cloudUpload: A("cloud-upload", 60099), - code: A("code", 60100), - collapseAll: A("collapse-all", 60101), - colorMode: A("color-mode", 60102), - commentDiscussion: A("comment-discussion", 60103), - creditCard: A("credit-card", 60105), - dash: A("dash", 60108), - dashboard: A("dashboard", 60109), - database: A("database", 60110), - debugContinue: A("debug-continue", 60111), - debugDisconnect: A("debug-disconnect", 60112), - debugPause: A("debug-pause", 60113), - debugRestart: A("debug-restart", 60114), - debugStart: A("debug-start", 60115), - debugStepInto: A("debug-step-into", 60116), - debugStepOut: A("debug-step-out", 60117), - debugStepOver: A("debug-step-over", 60118), - debugStop: A("debug-stop", 60119), - debug: A("debug", 60120), - deviceCameraVideo: A("device-camera-video", 60121), - deviceCamera: A("device-camera", 60122), - deviceMobile: A("device-mobile", 60123), - diffAdded: A("diff-added", 60124), - diffIgnored: A("diff-ignored", 60125), - diffModified: A("diff-modified", 60126), - diffRemoved: A("diff-removed", 60127), - diffRenamed: A("diff-renamed", 60128), - diff: A("diff", 60129), - diffSidebyside: A("diff-sidebyside", 60129), - discard: A("discard", 60130), - editorLayout: A("editor-layout", 60131), - emptyWindow: A("empty-window", 60132), - exclude: A("exclude", 60133), - extensions: A("extensions", 60134), - eyeClosed: A("eye-closed", 60135), - fileBinary: A("file-binary", 60136), - fileCode: A("file-code", 60137), - fileMedia: A("file-media", 60138), - filePdf: A("file-pdf", 60139), - fileSubmodule: A("file-submodule", 60140), - fileSymlinkDirectory: A("file-symlink-directory", 60141), - fileSymlinkFile: A("file-symlink-file", 60142), - fileZip: A("file-zip", 60143), - files: A("files", 60144), - filter: A("filter", 60145), - flame: A("flame", 60146), - foldDown: A("fold-down", 60147), - foldUp: A("fold-up", 60148), - fold: A("fold", 60149), - folderActive: A("folder-active", 60150), - folderOpened: A("folder-opened", 60151), - gear: A("gear", 60152), - gift: A("gift", 60153), - gistSecret: A("gist-secret", 60154), - gist: A("gist", 60155), - gitCommit: A("git-commit", 60156), - gitCompare: A("git-compare", 60157), - compareChanges: A("compare-changes", 60157), - gitMerge: A("git-merge", 60158), - githubAction: A("github-action", 60159), - githubAlt: A("github-alt", 60160), - globe: A("globe", 60161), - grabber: A("grabber", 60162), - graph: A("graph", 60163), - gripper: A("gripper", 60164), - heart: A("heart", 60165), - home: A("home", 60166), - horizontalRule: A("horizontal-rule", 60167), - hubot: A("hubot", 60168), - inbox: A("inbox", 60169), - issueReopened: A("issue-reopened", 60171), - issues: A("issues", 60172), - italic: A("italic", 60173), - jersey: A("jersey", 60174), - json: A("json", 60175), - kebabVertical: A("kebab-vertical", 60176), - key: A("key", 60177), - law: A("law", 60178), - lightbulbAutofix: A("lightbulb-autofix", 60179), - linkExternal: A("link-external", 60180), - link: A("link", 60181), - listOrdered: A("list-ordered", 60182), - listUnordered: A("list-unordered", 60183), - liveShare: A("live-share", 60184), - loading: A("loading", 60185), - location: A("location", 60186), - mailRead: A("mail-read", 60187), - mail: A("mail", 60188), - markdown: A("markdown", 60189), - megaphone: A("megaphone", 60190), - mention: A("mention", 60191), - milestone: A("milestone", 60192), - gitPullRequestMilestone: A("git-pull-request-milestone", 60192), - mortarBoard: A("mortar-board", 60193), - move: A("move", 60194), - multipleWindows: A("multiple-windows", 60195), - mute: A("mute", 60196), - noNewline: A("no-newline", 60197), - note: A("note", 60198), - octoface: A("octoface", 60199), - openPreview: A("open-preview", 60200), - package: A("package", 60201), - paintcan: A("paintcan", 60202), - pin: A("pin", 60203), - play: A("play", 60204), - run: A("run", 60204), - plug: A("plug", 60205), - preserveCase: A("preserve-case", 60206), - preview: A("preview", 60207), - project: A("project", 60208), - pulse: A("pulse", 60209), - question: A("question", 60210), - quote: A("quote", 60211), - radioTower: A("radio-tower", 60212), - reactions: A("reactions", 60213), - references: A("references", 60214), - refresh: A("refresh", 60215), - regex: A("regex", 60216), - remoteExplorer: A("remote-explorer", 60217), - remote: A("remote", 60218), - remove: A("remove", 60219), - replaceAll: A("replace-all", 60220), - replace: A("replace", 60221), - repoClone: A("repo-clone", 60222), - repoForcePush: A("repo-force-push", 60223), - repoPull: A("repo-pull", 60224), - repoPush: A("repo-push", 60225), - report: A("report", 60226), - requestChanges: A("request-changes", 60227), - rocket: A("rocket", 60228), - rootFolderOpened: A("root-folder-opened", 60229), - rootFolder: A("root-folder", 60230), - rss: A("rss", 60231), - ruby: A("ruby", 60232), - saveAll: A("save-all", 60233), - saveAs: A("save-as", 60234), - save: A("save", 60235), - screenFull: A("screen-full", 60236), - screenNormal: A("screen-normal", 60237), - searchStop: A("search-stop", 60238), - server: A("server", 60240), - settingsGear: A("settings-gear", 60241), - settings: A("settings", 60242), - shield: A("shield", 60243), - smiley: A("smiley", 60244), - sortPrecedence: A("sort-precedence", 60245), - splitHorizontal: A("split-horizontal", 60246), - splitVertical: A("split-vertical", 60247), - squirrel: A("squirrel", 60248), - starFull: A("star-full", 60249), - starHalf: A("star-half", 60250), - symbolClass: A("symbol-class", 60251), - symbolColor: A("symbol-color", 60252), - symbolConstant: A("symbol-constant", 60253), - symbolEnumMember: A("symbol-enum-member", 60254), - symbolField: A("symbol-field", 60255), - symbolFile: A("symbol-file", 60256), - symbolInterface: A("symbol-interface", 60257), - symbolKeyword: A("symbol-keyword", 60258), - symbolMisc: A("symbol-misc", 60259), - symbolOperator: A("symbol-operator", 60260), - symbolProperty: A("symbol-property", 60261), - wrench: A("wrench", 60261), - wrenchSubaction: A("wrench-subaction", 60261), - symbolSnippet: A("symbol-snippet", 60262), - tasklist: A("tasklist", 60263), - telescope: A("telescope", 60264), - textSize: A("text-size", 60265), - threeBars: A("three-bars", 60266), - thumbsdown: A("thumbsdown", 60267), - thumbsup: A("thumbsup", 60268), - tools: A("tools", 60269), - triangleDown: A("triangle-down", 60270), - triangleLeft: A("triangle-left", 60271), - triangleRight: A("triangle-right", 60272), - triangleUp: A("triangle-up", 60273), - twitter: A("twitter", 60274), - unfold: A("unfold", 60275), - unlock: A("unlock", 60276), - unmute: A("unmute", 60277), - unverified: A("unverified", 60278), - verified: A("verified", 60279), - versions: A("versions", 60280), - vmActive: A("vm-active", 60281), - vmOutline: A("vm-outline", 60282), - vmRunning: A("vm-running", 60283), - watch: A("watch", 60284), - whitespace: A("whitespace", 60285), - wholeWord: A("whole-word", 60286), - window: A("window", 60287), - wordWrap: A("word-wrap", 60288), - zoomIn: A("zoom-in", 60289), - zoomOut: A("zoom-out", 60290), - listFilter: A("list-filter", 60291), - listFlat: A("list-flat", 60292), - listSelection: A("list-selection", 60293), - selection: A("selection", 60293), - listTree: A("list-tree", 60294), - debugBreakpointFunctionUnverified: A("debug-breakpoint-function-unverified", 60295), - debugBreakpointFunction: A("debug-breakpoint-function", 60296), - debugBreakpointFunctionDisabled: A("debug-breakpoint-function-disabled", 60296), - debugStackframeActive: A("debug-stackframe-active", 60297), - circleSmallFilled: A("circle-small-filled", 60298), - debugStackframeDot: A("debug-stackframe-dot", 60298), - terminalDecorationMark: A("terminal-decoration-mark", 60298), - debugStackframe: A("debug-stackframe", 60299), - debugStackframeFocused: A("debug-stackframe-focused", 60299), - debugBreakpointUnsupported: A("debug-breakpoint-unsupported", 60300), - symbolString: A("symbol-string", 60301), - debugReverseContinue: A("debug-reverse-continue", 60302), - debugStepBack: A("debug-step-back", 60303), - debugRestartFrame: A("debug-restart-frame", 60304), - debugAlt: A("debug-alt", 60305), - callIncoming: A("call-incoming", 60306), - callOutgoing: A("call-outgoing", 60307), - menu: A("menu", 60308), - expandAll: A("expand-all", 60309), - feedback: A("feedback", 60310), - gitPullRequestReviewer: A("git-pull-request-reviewer", 60310), - groupByRefType: A("group-by-ref-type", 60311), - ungroupByRefType: A("ungroup-by-ref-type", 60312), - account: A("account", 60313), - gitPullRequestAssignee: A("git-pull-request-assignee", 60313), - bellDot: A("bell-dot", 60314), - debugConsole: A("debug-console", 60315), - library: A("library", 60316), - output: A("output", 60317), - runAll: A("run-all", 60318), - syncIgnored: A("sync-ignored", 60319), - pinned: A("pinned", 60320), - githubInverted: A("github-inverted", 60321), - serverProcess: A("server-process", 60322), - serverEnvironment: A("server-environment", 60323), - pass: A("pass", 60324), - issueClosed: A("issue-closed", 60324), - stopCircle: A("stop-circle", 60325), - playCircle: A("play-circle", 60326), - record: A("record", 60327), - debugAltSmall: A("debug-alt-small", 60328), - vmConnect: A("vm-connect", 60329), - cloud: A("cloud", 60330), - merge: A("merge", 60331), - export: A("export", 60332), - graphLeft: A("graph-left", 60333), - magnet: A("magnet", 60334), - notebook: A("notebook", 60335), - redo: A("redo", 60336), - checkAll: A("check-all", 60337), - pinnedDirty: A("pinned-dirty", 60338), - passFilled: A("pass-filled", 60339), - circleLargeFilled: A("circle-large-filled", 60340), - circleLarge: A("circle-large", 60341), - circleLargeOutline: A("circle-large-outline", 60341), - combine: A("combine", 60342), - gather: A("gather", 60342), - table: A("table", 60343), - variableGroup: A("variable-group", 60344), - typeHierarchy: A("type-hierarchy", 60345), - typeHierarchySub: A("type-hierarchy-sub", 60346), - typeHierarchySuper: A("type-hierarchy-super", 60347), - gitPullRequestCreate: A("git-pull-request-create", 60348), - runAbove: A("run-above", 60349), - runBelow: A("run-below", 60350), - notebookTemplate: A("notebook-template", 60351), - debugRerun: A("debug-rerun", 60352), - workspaceTrusted: A("workspace-trusted", 60353), - workspaceUntrusted: A("workspace-untrusted", 60354), - workspaceUnknown: A("workspace-unknown", 60355), - terminalCmd: A("terminal-cmd", 60356), - terminalDebian: A("terminal-debian", 60357), - terminalLinux: A("terminal-linux", 60358), - terminalPowershell: A("terminal-powershell", 60359), - terminalTmux: A("terminal-tmux", 60360), - terminalUbuntu: A("terminal-ubuntu", 60361), - terminalBash: A("terminal-bash", 60362), - arrowSwap: A("arrow-swap", 60363), - copy: A("copy", 60364), - personAdd: A("person-add", 60365), - filterFilled: A("filter-filled", 60366), - wand: A("wand", 60367), - debugLineByLine: A("debug-line-by-line", 60368), - inspect: A("inspect", 60369), - layers: A("layers", 60370), - layersDot: A("layers-dot", 60371), - layersActive: A("layers-active", 60372), - compass: A("compass", 60373), - compassDot: A("compass-dot", 60374), - compassActive: A("compass-active", 60375), - azure: A("azure", 60376), - issueDraft: A("issue-draft", 60377), - gitPullRequestClosed: A("git-pull-request-closed", 60378), - gitPullRequestDraft: A("git-pull-request-draft", 60379), - debugAll: A("debug-all", 60380), - debugCoverage: A("debug-coverage", 60381), - runErrors: A("run-errors", 60382), - folderLibrary: A("folder-library", 60383), - debugContinueSmall: A("debug-continue-small", 60384), - beakerStop: A("beaker-stop", 60385), - graphLine: A("graph-line", 60386), - graphScatter: A("graph-scatter", 60387), - pieChart: A("pie-chart", 60388), - bracket: A("bracket", 60175), - bracketDot: A("bracket-dot", 60389), - bracketError: A("bracket-error", 60390), - lockSmall: A("lock-small", 60391), - azureDevops: A("azure-devops", 60392), - verifiedFilled: A("verified-filled", 60393), - newline: A("newline", 60394), - layout: A("layout", 60395), - layoutActivitybarLeft: A("layout-activitybar-left", 60396), - layoutActivitybarRight: A("layout-activitybar-right", 60397), - layoutPanelLeft: A("layout-panel-left", 60398), - layoutPanelCenter: A("layout-panel-center", 60399), - layoutPanelJustify: A("layout-panel-justify", 60400), - layoutPanelRight: A("layout-panel-right", 60401), - layoutPanel: A("layout-panel", 60402), - layoutSidebarLeft: A("layout-sidebar-left", 60403), - layoutSidebarRight: A("layout-sidebar-right", 60404), - layoutStatusbar: A("layout-statusbar", 60405), - layoutMenubar: A("layout-menubar", 60406), - layoutCentered: A("layout-centered", 60407), - target: A("target", 60408), - indent: A("indent", 60409), - recordSmall: A("record-small", 60410), - errorSmall: A("error-small", 60411), - terminalDecorationError: A("terminal-decoration-error", 60411), - arrowCircleDown: A("arrow-circle-down", 60412), - arrowCircleLeft: A("arrow-circle-left", 60413), - arrowCircleRight: A("arrow-circle-right", 60414), - arrowCircleUp: A("arrow-circle-up", 60415), - layoutSidebarRightOff: A("layout-sidebar-right-off", 60416), - layoutPanelOff: A("layout-panel-off", 60417), - layoutSidebarLeftOff: A("layout-sidebar-left-off", 60418), - blank: A("blank", 60419), - heartFilled: A("heart-filled", 60420), - map: A("map", 60421), - mapHorizontal: A("map-horizontal", 60421), - foldHorizontal: A("fold-horizontal", 60421), - mapFilled: A("map-filled", 60422), - mapHorizontalFilled: A("map-horizontal-filled", 60422), - foldHorizontalFilled: A("fold-horizontal-filled", 60422), - circleSmall: A("circle-small", 60423), - bellSlash: A("bell-slash", 60424), - bellSlashDot: A("bell-slash-dot", 60425), - commentUnresolved: A("comment-unresolved", 60426), - gitPullRequestGoToChanges: A("git-pull-request-go-to-changes", 60427), - gitPullRequestNewChanges: A("git-pull-request-new-changes", 60428), - searchFuzzy: A("search-fuzzy", 60429), - commentDraft: A("comment-draft", 60430), - send: A("send", 60431), - sparkle: A("sparkle", 60432), - insert: A("insert", 60433), - mic: A("mic", 60434), - thumbsdownFilled: A("thumbsdown-filled", 60435), - thumbsupFilled: A("thumbsup-filled", 60436), - coffee: A("coffee", 60437), - snake: A("snake", 60438), - game: A("game", 60439), - vr: A("vr", 60440), - chip: A("chip", 60441), - piano: A("piano", 60442), - music: A("music", 60443), - micFilled: A("mic-filled", 60444), - repoFetch: A("repo-fetch", 60445), - copilot: A("copilot", 60446), - lightbulbSparkle: A("lightbulb-sparkle", 60447), - robot: A("robot", 60448), - sparkleFilled: A("sparkle-filled", 60449), - diffSingle: A("diff-single", 60450), - diffMultiple: A("diff-multiple", 60451), - surroundWith: A("surround-with", 60452), - share: A("share", 60453), - gitStash: A("git-stash", 60454), - gitStashApply: A("git-stash-apply", 60455), - gitStashPop: A("git-stash-pop", 60456), - vscode: A("vscode", 60457), - vscodeInsiders: A("vscode-insiders", 60458), - codeOss: A("code-oss", 60459), - runCoverage: A("run-coverage", 60460), - runAllCoverage: A("run-all-coverage", 60461), - coverage: A("coverage", 60462), - githubProject: A("github-project", 60463), - mapVertical: A("map-vertical", 60464), - foldVertical: A("fold-vertical", 60464), - mapVerticalFilled: A("map-vertical-filled", 60465), - foldVerticalFilled: A("fold-vertical-filled", 60465), - goToSearch: A("go-to-search", 60466), - percentage: A("percentage", 60467), - sortPercentage: A("sort-percentage", 60467), - attach: A("attach", 60468) -}, f$ = { - dialogError: A("dialog-error", "error"), - dialogWarning: A("dialog-warning", "warning"), - dialogInfo: A("dialog-info", "info"), - dialogClose: A("dialog-close", "close"), - treeItemExpanded: A("tree-item-expanded", "chevron-down"), + return nw[s] = e, { id: s }; +} +function PB() { + return nw; +} +const ree = { + add: V("add", 6e4), + plus: V("plus", 6e4), + gistNew: V("gist-new", 6e4), + repoCreate: V("repo-create", 6e4), + lightbulb: V("lightbulb", 60001), + lightBulb: V("light-bulb", 60001), + repo: V("repo", 60002), + repoDelete: V("repo-delete", 60002), + gistFork: V("gist-fork", 60003), + repoForked: V("repo-forked", 60003), + gitPullRequest: V("git-pull-request", 60004), + gitPullRequestAbandoned: V("git-pull-request-abandoned", 60004), + recordKeys: V("record-keys", 60005), + keyboard: V("keyboard", 60005), + tag: V("tag", 60006), + gitPullRequestLabel: V("git-pull-request-label", 60006), + tagAdd: V("tag-add", 60006), + tagRemove: V("tag-remove", 60006), + person: V("person", 60007), + personFollow: V("person-follow", 60007), + personOutline: V("person-outline", 60007), + personFilled: V("person-filled", 60007), + gitBranch: V("git-branch", 60008), + gitBranchCreate: V("git-branch-create", 60008), + gitBranchDelete: V("git-branch-delete", 60008), + sourceControl: V("source-control", 60008), + mirror: V("mirror", 60009), + mirrorPublic: V("mirror-public", 60009), + star: V("star", 60010), + starAdd: V("star-add", 60010), + starDelete: V("star-delete", 60010), + starEmpty: V("star-empty", 60010), + comment: V("comment", 60011), + commentAdd: V("comment-add", 60011), + alert: V("alert", 60012), + warning: V("warning", 60012), + search: V("search", 60013), + searchSave: V("search-save", 60013), + logOut: V("log-out", 60014), + signOut: V("sign-out", 60014), + logIn: V("log-in", 60015), + signIn: V("sign-in", 60015), + eye: V("eye", 60016), + eyeUnwatch: V("eye-unwatch", 60016), + eyeWatch: V("eye-watch", 60016), + circleFilled: V("circle-filled", 60017), + primitiveDot: V("primitive-dot", 60017), + closeDirty: V("close-dirty", 60017), + debugBreakpoint: V("debug-breakpoint", 60017), + debugBreakpointDisabled: V("debug-breakpoint-disabled", 60017), + debugHint: V("debug-hint", 60017), + terminalDecorationSuccess: V("terminal-decoration-success", 60017), + primitiveSquare: V("primitive-square", 60018), + edit: V("edit", 60019), + pencil: V("pencil", 60019), + info: V("info", 60020), + issueOpened: V("issue-opened", 60020), + gistPrivate: V("gist-private", 60021), + gitForkPrivate: V("git-fork-private", 60021), + lock: V("lock", 60021), + mirrorPrivate: V("mirror-private", 60021), + close: V("close", 60022), + removeClose: V("remove-close", 60022), + x: V("x", 60022), + repoSync: V("repo-sync", 60023), + sync: V("sync", 60023), + clone: V("clone", 60024), + desktopDownload: V("desktop-download", 60024), + beaker: V("beaker", 60025), + microscope: V("microscope", 60025), + vm: V("vm", 60026), + deviceDesktop: V("device-desktop", 60026), + file: V("file", 60027), + fileText: V("file-text", 60027), + more: V("more", 60028), + ellipsis: V("ellipsis", 60028), + kebabHorizontal: V("kebab-horizontal", 60028), + mailReply: V("mail-reply", 60029), + reply: V("reply", 60029), + organization: V("organization", 60030), + organizationFilled: V("organization-filled", 60030), + organizationOutline: V("organization-outline", 60030), + newFile: V("new-file", 60031), + fileAdd: V("file-add", 60031), + newFolder: V("new-folder", 60032), + fileDirectoryCreate: V("file-directory-create", 60032), + trash: V("trash", 60033), + trashcan: V("trashcan", 60033), + history: V("history", 60034), + clock: V("clock", 60034), + folder: V("folder", 60035), + fileDirectory: V("file-directory", 60035), + symbolFolder: V("symbol-folder", 60035), + logoGithub: V("logo-github", 60036), + markGithub: V("mark-github", 60036), + github: V("github", 60036), + terminal: V("terminal", 60037), + console: V("console", 60037), + repl: V("repl", 60037), + zap: V("zap", 60038), + symbolEvent: V("symbol-event", 60038), + error: V("error", 60039), + stop: V("stop", 60039), + variable: V("variable", 60040), + symbolVariable: V("symbol-variable", 60040), + array: V("array", 60042), + symbolArray: V("symbol-array", 60042), + symbolModule: V("symbol-module", 60043), + symbolPackage: V("symbol-package", 60043), + symbolNamespace: V("symbol-namespace", 60043), + symbolObject: V("symbol-object", 60043), + symbolMethod: V("symbol-method", 60044), + symbolFunction: V("symbol-function", 60044), + symbolConstructor: V("symbol-constructor", 60044), + symbolBoolean: V("symbol-boolean", 60047), + symbolNull: V("symbol-null", 60047), + symbolNumeric: V("symbol-numeric", 60048), + symbolNumber: V("symbol-number", 60048), + symbolStructure: V("symbol-structure", 60049), + symbolStruct: V("symbol-struct", 60049), + symbolParameter: V("symbol-parameter", 60050), + symbolTypeParameter: V("symbol-type-parameter", 60050), + symbolKey: V("symbol-key", 60051), + symbolText: V("symbol-text", 60051), + symbolReference: V("symbol-reference", 60052), + goToFile: V("go-to-file", 60052), + symbolEnum: V("symbol-enum", 60053), + symbolValue: V("symbol-value", 60053), + symbolRuler: V("symbol-ruler", 60054), + symbolUnit: V("symbol-unit", 60054), + activateBreakpoints: V("activate-breakpoints", 60055), + archive: V("archive", 60056), + arrowBoth: V("arrow-both", 60057), + arrowDown: V("arrow-down", 60058), + arrowLeft: V("arrow-left", 60059), + arrowRight: V("arrow-right", 60060), + arrowSmallDown: V("arrow-small-down", 60061), + arrowSmallLeft: V("arrow-small-left", 60062), + arrowSmallRight: V("arrow-small-right", 60063), + arrowSmallUp: V("arrow-small-up", 60064), + arrowUp: V("arrow-up", 60065), + bell: V("bell", 60066), + bold: V("bold", 60067), + book: V("book", 60068), + bookmark: V("bookmark", 60069), + debugBreakpointConditionalUnverified: V("debug-breakpoint-conditional-unverified", 60070), + debugBreakpointConditional: V("debug-breakpoint-conditional", 60071), + debugBreakpointConditionalDisabled: V("debug-breakpoint-conditional-disabled", 60071), + debugBreakpointDataUnverified: V("debug-breakpoint-data-unverified", 60072), + debugBreakpointData: V("debug-breakpoint-data", 60073), + debugBreakpointDataDisabled: V("debug-breakpoint-data-disabled", 60073), + debugBreakpointLogUnverified: V("debug-breakpoint-log-unverified", 60074), + debugBreakpointLog: V("debug-breakpoint-log", 60075), + debugBreakpointLogDisabled: V("debug-breakpoint-log-disabled", 60075), + briefcase: V("briefcase", 60076), + broadcast: V("broadcast", 60077), + browser: V("browser", 60078), + bug: V("bug", 60079), + calendar: V("calendar", 60080), + caseSensitive: V("case-sensitive", 60081), + check: V("check", 60082), + checklist: V("checklist", 60083), + chevronDown: V("chevron-down", 60084), + chevronLeft: V("chevron-left", 60085), + chevronRight: V("chevron-right", 60086), + chevronUp: V("chevron-up", 60087), + chromeClose: V("chrome-close", 60088), + chromeMaximize: V("chrome-maximize", 60089), + chromeMinimize: V("chrome-minimize", 60090), + chromeRestore: V("chrome-restore", 60091), + circleOutline: V("circle-outline", 60092), + circle: V("circle", 60092), + debugBreakpointUnverified: V("debug-breakpoint-unverified", 60092), + terminalDecorationIncomplete: V("terminal-decoration-incomplete", 60092), + circleSlash: V("circle-slash", 60093), + circuitBoard: V("circuit-board", 60094), + clearAll: V("clear-all", 60095), + clippy: V("clippy", 60096), + closeAll: V("close-all", 60097), + cloudDownload: V("cloud-download", 60098), + cloudUpload: V("cloud-upload", 60099), + code: V("code", 60100), + collapseAll: V("collapse-all", 60101), + colorMode: V("color-mode", 60102), + commentDiscussion: V("comment-discussion", 60103), + creditCard: V("credit-card", 60105), + dash: V("dash", 60108), + dashboard: V("dashboard", 60109), + database: V("database", 60110), + debugContinue: V("debug-continue", 60111), + debugDisconnect: V("debug-disconnect", 60112), + debugPause: V("debug-pause", 60113), + debugRestart: V("debug-restart", 60114), + debugStart: V("debug-start", 60115), + debugStepInto: V("debug-step-into", 60116), + debugStepOut: V("debug-step-out", 60117), + debugStepOver: V("debug-step-over", 60118), + debugStop: V("debug-stop", 60119), + debug: V("debug", 60120), + deviceCameraVideo: V("device-camera-video", 60121), + deviceCamera: V("device-camera", 60122), + deviceMobile: V("device-mobile", 60123), + diffAdded: V("diff-added", 60124), + diffIgnored: V("diff-ignored", 60125), + diffModified: V("diff-modified", 60126), + diffRemoved: V("diff-removed", 60127), + diffRenamed: V("diff-renamed", 60128), + diff: V("diff", 60129), + diffSidebyside: V("diff-sidebyside", 60129), + discard: V("discard", 60130), + editorLayout: V("editor-layout", 60131), + emptyWindow: V("empty-window", 60132), + exclude: V("exclude", 60133), + extensions: V("extensions", 60134), + eyeClosed: V("eye-closed", 60135), + fileBinary: V("file-binary", 60136), + fileCode: V("file-code", 60137), + fileMedia: V("file-media", 60138), + filePdf: V("file-pdf", 60139), + fileSubmodule: V("file-submodule", 60140), + fileSymlinkDirectory: V("file-symlink-directory", 60141), + fileSymlinkFile: V("file-symlink-file", 60142), + fileZip: V("file-zip", 60143), + files: V("files", 60144), + filter: V("filter", 60145), + flame: V("flame", 60146), + foldDown: V("fold-down", 60147), + foldUp: V("fold-up", 60148), + fold: V("fold", 60149), + folderActive: V("folder-active", 60150), + folderOpened: V("folder-opened", 60151), + gear: V("gear", 60152), + gift: V("gift", 60153), + gistSecret: V("gist-secret", 60154), + gist: V("gist", 60155), + gitCommit: V("git-commit", 60156), + gitCompare: V("git-compare", 60157), + compareChanges: V("compare-changes", 60157), + gitMerge: V("git-merge", 60158), + githubAction: V("github-action", 60159), + githubAlt: V("github-alt", 60160), + globe: V("globe", 60161), + grabber: V("grabber", 60162), + graph: V("graph", 60163), + gripper: V("gripper", 60164), + heart: V("heart", 60165), + home: V("home", 60166), + horizontalRule: V("horizontal-rule", 60167), + hubot: V("hubot", 60168), + inbox: V("inbox", 60169), + issueReopened: V("issue-reopened", 60171), + issues: V("issues", 60172), + italic: V("italic", 60173), + jersey: V("jersey", 60174), + json: V("json", 60175), + kebabVertical: V("kebab-vertical", 60176), + key: V("key", 60177), + law: V("law", 60178), + lightbulbAutofix: V("lightbulb-autofix", 60179), + linkExternal: V("link-external", 60180), + link: V("link", 60181), + listOrdered: V("list-ordered", 60182), + listUnordered: V("list-unordered", 60183), + liveShare: V("live-share", 60184), + loading: V("loading", 60185), + location: V("location", 60186), + mailRead: V("mail-read", 60187), + mail: V("mail", 60188), + markdown: V("markdown", 60189), + megaphone: V("megaphone", 60190), + mention: V("mention", 60191), + milestone: V("milestone", 60192), + gitPullRequestMilestone: V("git-pull-request-milestone", 60192), + mortarBoard: V("mortar-board", 60193), + move: V("move", 60194), + multipleWindows: V("multiple-windows", 60195), + mute: V("mute", 60196), + noNewline: V("no-newline", 60197), + note: V("note", 60198), + octoface: V("octoface", 60199), + openPreview: V("open-preview", 60200), + package: V("package", 60201), + paintcan: V("paintcan", 60202), + pin: V("pin", 60203), + play: V("play", 60204), + run: V("run", 60204), + plug: V("plug", 60205), + preserveCase: V("preserve-case", 60206), + preview: V("preview", 60207), + project: V("project", 60208), + pulse: V("pulse", 60209), + question: V("question", 60210), + quote: V("quote", 60211), + radioTower: V("radio-tower", 60212), + reactions: V("reactions", 60213), + references: V("references", 60214), + refresh: V("refresh", 60215), + regex: V("regex", 60216), + remoteExplorer: V("remote-explorer", 60217), + remote: V("remote", 60218), + remove: V("remove", 60219), + replaceAll: V("replace-all", 60220), + replace: V("replace", 60221), + repoClone: V("repo-clone", 60222), + repoForcePush: V("repo-force-push", 60223), + repoPull: V("repo-pull", 60224), + repoPush: V("repo-push", 60225), + report: V("report", 60226), + requestChanges: V("request-changes", 60227), + rocket: V("rocket", 60228), + rootFolderOpened: V("root-folder-opened", 60229), + rootFolder: V("root-folder", 60230), + rss: V("rss", 60231), + ruby: V("ruby", 60232), + saveAll: V("save-all", 60233), + saveAs: V("save-as", 60234), + save: V("save", 60235), + screenFull: V("screen-full", 60236), + screenNormal: V("screen-normal", 60237), + searchStop: V("search-stop", 60238), + server: V("server", 60240), + settingsGear: V("settings-gear", 60241), + settings: V("settings", 60242), + shield: V("shield", 60243), + smiley: V("smiley", 60244), + sortPrecedence: V("sort-precedence", 60245), + splitHorizontal: V("split-horizontal", 60246), + splitVertical: V("split-vertical", 60247), + squirrel: V("squirrel", 60248), + starFull: V("star-full", 60249), + starHalf: V("star-half", 60250), + symbolClass: V("symbol-class", 60251), + symbolColor: V("symbol-color", 60252), + symbolConstant: V("symbol-constant", 60253), + symbolEnumMember: V("symbol-enum-member", 60254), + symbolField: V("symbol-field", 60255), + symbolFile: V("symbol-file", 60256), + symbolInterface: V("symbol-interface", 60257), + symbolKeyword: V("symbol-keyword", 60258), + symbolMisc: V("symbol-misc", 60259), + symbolOperator: V("symbol-operator", 60260), + symbolProperty: V("symbol-property", 60261), + wrench: V("wrench", 60261), + wrenchSubaction: V("wrench-subaction", 60261), + symbolSnippet: V("symbol-snippet", 60262), + tasklist: V("tasklist", 60263), + telescope: V("telescope", 60264), + textSize: V("text-size", 60265), + threeBars: V("three-bars", 60266), + thumbsdown: V("thumbsdown", 60267), + thumbsup: V("thumbsup", 60268), + tools: V("tools", 60269), + triangleDown: V("triangle-down", 60270), + triangleLeft: V("triangle-left", 60271), + triangleRight: V("triangle-right", 60272), + triangleUp: V("triangle-up", 60273), + twitter: V("twitter", 60274), + unfold: V("unfold", 60275), + unlock: V("unlock", 60276), + unmute: V("unmute", 60277), + unverified: V("unverified", 60278), + verified: V("verified", 60279), + versions: V("versions", 60280), + vmActive: V("vm-active", 60281), + vmOutline: V("vm-outline", 60282), + vmRunning: V("vm-running", 60283), + watch: V("watch", 60284), + whitespace: V("whitespace", 60285), + wholeWord: V("whole-word", 60286), + window: V("window", 60287), + wordWrap: V("word-wrap", 60288), + zoomIn: V("zoom-in", 60289), + zoomOut: V("zoom-out", 60290), + listFilter: V("list-filter", 60291), + listFlat: V("list-flat", 60292), + listSelection: V("list-selection", 60293), + selection: V("selection", 60293), + listTree: V("list-tree", 60294), + debugBreakpointFunctionUnverified: V("debug-breakpoint-function-unverified", 60295), + debugBreakpointFunction: V("debug-breakpoint-function", 60296), + debugBreakpointFunctionDisabled: V("debug-breakpoint-function-disabled", 60296), + debugStackframeActive: V("debug-stackframe-active", 60297), + circleSmallFilled: V("circle-small-filled", 60298), + debugStackframeDot: V("debug-stackframe-dot", 60298), + terminalDecorationMark: V("terminal-decoration-mark", 60298), + debugStackframe: V("debug-stackframe", 60299), + debugStackframeFocused: V("debug-stackframe-focused", 60299), + debugBreakpointUnsupported: V("debug-breakpoint-unsupported", 60300), + symbolString: V("symbol-string", 60301), + debugReverseContinue: V("debug-reverse-continue", 60302), + debugStepBack: V("debug-step-back", 60303), + debugRestartFrame: V("debug-restart-frame", 60304), + debugAlt: V("debug-alt", 60305), + callIncoming: V("call-incoming", 60306), + callOutgoing: V("call-outgoing", 60307), + menu: V("menu", 60308), + expandAll: V("expand-all", 60309), + feedback: V("feedback", 60310), + gitPullRequestReviewer: V("git-pull-request-reviewer", 60310), + groupByRefType: V("group-by-ref-type", 60311), + ungroupByRefType: V("ungroup-by-ref-type", 60312), + account: V("account", 60313), + gitPullRequestAssignee: V("git-pull-request-assignee", 60313), + bellDot: V("bell-dot", 60314), + debugConsole: V("debug-console", 60315), + library: V("library", 60316), + output: V("output", 60317), + runAll: V("run-all", 60318), + syncIgnored: V("sync-ignored", 60319), + pinned: V("pinned", 60320), + githubInverted: V("github-inverted", 60321), + serverProcess: V("server-process", 60322), + serverEnvironment: V("server-environment", 60323), + pass: V("pass", 60324), + issueClosed: V("issue-closed", 60324), + stopCircle: V("stop-circle", 60325), + playCircle: V("play-circle", 60326), + record: V("record", 60327), + debugAltSmall: V("debug-alt-small", 60328), + vmConnect: V("vm-connect", 60329), + cloud: V("cloud", 60330), + merge: V("merge", 60331), + export: V("export", 60332), + graphLeft: V("graph-left", 60333), + magnet: V("magnet", 60334), + notebook: V("notebook", 60335), + redo: V("redo", 60336), + checkAll: V("check-all", 60337), + pinnedDirty: V("pinned-dirty", 60338), + passFilled: V("pass-filled", 60339), + circleLargeFilled: V("circle-large-filled", 60340), + circleLarge: V("circle-large", 60341), + circleLargeOutline: V("circle-large-outline", 60341), + combine: V("combine", 60342), + gather: V("gather", 60342), + table: V("table", 60343), + variableGroup: V("variable-group", 60344), + typeHierarchy: V("type-hierarchy", 60345), + typeHierarchySub: V("type-hierarchy-sub", 60346), + typeHierarchySuper: V("type-hierarchy-super", 60347), + gitPullRequestCreate: V("git-pull-request-create", 60348), + runAbove: V("run-above", 60349), + runBelow: V("run-below", 60350), + notebookTemplate: V("notebook-template", 60351), + debugRerun: V("debug-rerun", 60352), + workspaceTrusted: V("workspace-trusted", 60353), + workspaceUntrusted: V("workspace-untrusted", 60354), + workspaceUnknown: V("workspace-unknown", 60355), + terminalCmd: V("terminal-cmd", 60356), + terminalDebian: V("terminal-debian", 60357), + terminalLinux: V("terminal-linux", 60358), + terminalPowershell: V("terminal-powershell", 60359), + terminalTmux: V("terminal-tmux", 60360), + terminalUbuntu: V("terminal-ubuntu", 60361), + terminalBash: V("terminal-bash", 60362), + arrowSwap: V("arrow-swap", 60363), + copy: V("copy", 60364), + personAdd: V("person-add", 60365), + filterFilled: V("filter-filled", 60366), + wand: V("wand", 60367), + debugLineByLine: V("debug-line-by-line", 60368), + inspect: V("inspect", 60369), + layers: V("layers", 60370), + layersDot: V("layers-dot", 60371), + layersActive: V("layers-active", 60372), + compass: V("compass", 60373), + compassDot: V("compass-dot", 60374), + compassActive: V("compass-active", 60375), + azure: V("azure", 60376), + issueDraft: V("issue-draft", 60377), + gitPullRequestClosed: V("git-pull-request-closed", 60378), + gitPullRequestDraft: V("git-pull-request-draft", 60379), + debugAll: V("debug-all", 60380), + debugCoverage: V("debug-coverage", 60381), + runErrors: V("run-errors", 60382), + folderLibrary: V("folder-library", 60383), + debugContinueSmall: V("debug-continue-small", 60384), + beakerStop: V("beaker-stop", 60385), + graphLine: V("graph-line", 60386), + graphScatter: V("graph-scatter", 60387), + pieChart: V("pie-chart", 60388), + bracket: V("bracket", 60175), + bracketDot: V("bracket-dot", 60389), + bracketError: V("bracket-error", 60390), + lockSmall: V("lock-small", 60391), + azureDevops: V("azure-devops", 60392), + verifiedFilled: V("verified-filled", 60393), + newline: V("newline", 60394), + layout: V("layout", 60395), + layoutActivitybarLeft: V("layout-activitybar-left", 60396), + layoutActivitybarRight: V("layout-activitybar-right", 60397), + layoutPanelLeft: V("layout-panel-left", 60398), + layoutPanelCenter: V("layout-panel-center", 60399), + layoutPanelJustify: V("layout-panel-justify", 60400), + layoutPanelRight: V("layout-panel-right", 60401), + layoutPanel: V("layout-panel", 60402), + layoutSidebarLeft: V("layout-sidebar-left", 60403), + layoutSidebarRight: V("layout-sidebar-right", 60404), + layoutStatusbar: V("layout-statusbar", 60405), + layoutMenubar: V("layout-menubar", 60406), + layoutCentered: V("layout-centered", 60407), + target: V("target", 60408), + indent: V("indent", 60409), + recordSmall: V("record-small", 60410), + errorSmall: V("error-small", 60411), + terminalDecorationError: V("terminal-decoration-error", 60411), + arrowCircleDown: V("arrow-circle-down", 60412), + arrowCircleLeft: V("arrow-circle-left", 60413), + arrowCircleRight: V("arrow-circle-right", 60414), + arrowCircleUp: V("arrow-circle-up", 60415), + layoutSidebarRightOff: V("layout-sidebar-right-off", 60416), + layoutPanelOff: V("layout-panel-off", 60417), + layoutSidebarLeftOff: V("layout-sidebar-left-off", 60418), + blank: V("blank", 60419), + heartFilled: V("heart-filled", 60420), + map: V("map", 60421), + mapHorizontal: V("map-horizontal", 60421), + foldHorizontal: V("fold-horizontal", 60421), + mapFilled: V("map-filled", 60422), + mapHorizontalFilled: V("map-horizontal-filled", 60422), + foldHorizontalFilled: V("fold-horizontal-filled", 60422), + circleSmall: V("circle-small", 60423), + bellSlash: V("bell-slash", 60424), + bellSlashDot: V("bell-slash-dot", 60425), + commentUnresolved: V("comment-unresolved", 60426), + gitPullRequestGoToChanges: V("git-pull-request-go-to-changes", 60427), + gitPullRequestNewChanges: V("git-pull-request-new-changes", 60428), + searchFuzzy: V("search-fuzzy", 60429), + commentDraft: V("comment-draft", 60430), + send: V("send", 60431), + sparkle: V("sparkle", 60432), + insert: V("insert", 60433), + mic: V("mic", 60434), + thumbsdownFilled: V("thumbsdown-filled", 60435), + thumbsupFilled: V("thumbsup-filled", 60436), + coffee: V("coffee", 60437), + snake: V("snake", 60438), + game: V("game", 60439), + vr: V("vr", 60440), + chip: V("chip", 60441), + piano: V("piano", 60442), + music: V("music", 60443), + micFilled: V("mic-filled", 60444), + repoFetch: V("repo-fetch", 60445), + copilot: V("copilot", 60446), + lightbulbSparkle: V("lightbulb-sparkle", 60447), + robot: V("robot", 60448), + sparkleFilled: V("sparkle-filled", 60449), + diffSingle: V("diff-single", 60450), + diffMultiple: V("diff-multiple", 60451), + surroundWith: V("surround-with", 60452), + share: V("share", 60453), + gitStash: V("git-stash", 60454), + gitStashApply: V("git-stash-apply", 60455), + gitStashPop: V("git-stash-pop", 60456), + vscode: V("vscode", 60457), + vscodeInsiders: V("vscode-insiders", 60458), + codeOss: V("code-oss", 60459), + runCoverage: V("run-coverage", 60460), + runAllCoverage: V("run-all-coverage", 60461), + coverage: V("coverage", 60462), + githubProject: V("github-project", 60463), + mapVertical: V("map-vertical", 60464), + foldVertical: V("fold-vertical", 60464), + mapVerticalFilled: V("map-vertical-filled", 60465), + foldVerticalFilled: V("fold-vertical-filled", 60465), + goToSearch: V("go-to-search", 60466), + percentage: V("percentage", 60467), + sortPercentage: V("sort-percentage", 60467), + attach: V("attach", 60468) +}, cee = { + dialogError: V("dialog-error", "error"), + dialogWarning: V("dialog-warning", "warning"), + dialogInfo: V("dialog-info", "info"), + dialogClose: V("dialog-close", "close"), + treeItemExpanded: V("tree-item-expanded", "chevron-down"), // collapsed is done with rotation - treeFilterOnTypeOn: A("tree-filter-on-type-on", "list-filter"), - treeFilterOnTypeOff: A("tree-filter-on-type-off", "list-selection"), - treeFilterClear: A("tree-filter-clear", "close"), - treeItemLoading: A("tree-item-loading", "loading"), - menuSelection: A("menu-selection", "check"), - menuSubmenu: A("menu-submenu", "chevron-right"), - menuBarMore: A("menubar-more", "more"), - scrollbarButtonLeft: A("scrollbar-button-left", "triangle-left"), - scrollbarButtonRight: A("scrollbar-button-right", "triangle-right"), - scrollbarButtonUp: A("scrollbar-button-up", "triangle-up"), - scrollbarButtonDown: A("scrollbar-button-down", "triangle-down"), - toolBarMore: A("toolbar-more", "more"), - quickInputBack: A("quick-input-back", "arrow-left"), - dropDownButton: A("drop-down-button", 60084), - symbolCustomColor: A("symbol-customcolor", 60252), - exportIcon: A("export", 60332), - workspaceUnspecified: A("workspace-unspecified", 60355), - newLine: A("newline", 60394), - thumbsDownFilled: A("thumbsdown-filled", 60435), - thumbsUpFilled: A("thumbsup-filled", 60436), - gitFetch: A("git-fetch", 60445), - lightbulbSparkleAutofix: A("lightbulb-sparkle-autofix", 60447), - debugBreakpointPending: A("debug-breakpoint-pending", 60377) + treeFilterOnTypeOn: V("tree-filter-on-type-on", "list-filter"), + treeFilterOnTypeOff: V("tree-filter-on-type-off", "list-selection"), + treeFilterClear: V("tree-filter-clear", "close"), + treeItemLoading: V("tree-item-loading", "loading"), + menuSelection: V("menu-selection", "check"), + menuSubmenu: V("menu-submenu", "chevron-right"), + menuBarMore: V("menubar-more", "more"), + scrollbarButtonLeft: V("scrollbar-button-left", "triangle-left"), + scrollbarButtonRight: V("scrollbar-button-right", "triangle-right"), + scrollbarButtonUp: V("scrollbar-button-up", "triangle-up"), + scrollbarButtonDown: V("scrollbar-button-down", "triangle-down"), + toolBarMore: V("toolbar-more", "more"), + quickInputBack: V("quick-input-back", "arrow-left"), + dropDownButton: V("drop-down-button", 60084), + symbolCustomColor: V("symbol-customcolor", 60252), + exportIcon: V("export", 60332), + workspaceUnspecified: V("workspace-unspecified", 60355), + newLine: V("newline", 60394), + thumbsDownFilled: V("thumbsdown-filled", 60435), + thumbsUpFilled: V("thumbsup-filled", 60436), + gitFetch: V("git-fetch", 60445), + lightbulbSparkleAutofix: V("lightbulb-sparkle-autofix", 60447), + debugBreakpointPending: V("debug-breakpoint-pending", 60377) }, te = { - ...p$, - ...f$ + ...ree, + ...cee }; -var R2; +var sw; (function(s) { function e(t) { return t && typeof t == "object" && typeof t.id == "string"; } s.isThemeColor = e; -})(R2 || (R2 = {})); -var Ze; +})(sw || (sw = {})); +var Se; (function(s) { s.iconNameSegment = "[A-Za-z0-9]+", s.iconNameExpression = "[A-Za-z0-9-]+", s.iconModifierExpression = "~[A-Za-z]+", s.iconNameCharacter = "[A-Za-z0-9~-]"; const e = new RegExp(`^(${s.iconNameExpression})(${s.iconModifierExpression})?$`); function t(u) { - const g = e.exec(u.id); - if (!g) + const m = e.exec(u.id); + if (!m) return t(te.error); - const [, m, f] = g, b = ["codicon", "codicon-" + m]; - return f && b.push("codicon-modifier-" + f.substring(1)), b; + const [, b, g] = m, Z = ["codicon", "codicon-" + b]; + return g && Z.push("codicon-modifier-" + g.substring(1)), Z; } s.asClassNameArray = t; function i(u) { @@ -6234,41 +6234,41 @@ var Ze; } s.asCSSSelector = n; function o(u) { - return u && typeof u == "object" && typeof u.id == "string" && (typeof u.color > "u" || R2.isThemeColor(u.color)); + return u && typeof u == "object" && typeof u.id == "string" && (typeof u.color > "u" || sw.isThemeColor(u.color)); } s.isThemeIcon = o; - const r = new RegExp(`^\\$\\((${s.iconNameExpression}(?:${s.iconModifierExpression})?)\\)$`); - function l(u) { - const g = r.exec(u); - if (!g) + const l = new RegExp(`^\\$\\((${s.iconNameExpression}(?:${s.iconModifierExpression})?)\\)$`); + function r(u) { + const m = l.exec(u); + if (!m) return; - const [, m] = g; - return { id: m }; + const [, b] = m; + return { id: b }; } - s.fromString = l; - function a(u) { + s.fromString = r; + function c(u) { return { id: u }; } - s.fromId = a; - function c(u, g) { - let m = u.id; - const f = m.lastIndexOf("~"); - return f !== -1 && (m = m.substring(0, f)), g && (m = `${m}~${g}`), { id: m }; + s.fromId = c; + function d(u, m) { + let b = u.id; + const g = b.lastIndexOf("~"); + return g !== -1 && (b = b.substring(0, g)), m && (b = `${b}~${m}`), { id: b }; } - s.modify = c; - function d(u) { - const g = u.id.lastIndexOf("~"); - if (g !== -1) - return u.id.substring(g + 1); + s.modify = d; + function a(u) { + const m = u.id.lastIndexOf("~"); + if (m !== -1) + return u.id.substring(m + 1); } - s.getModifier = d; - function h(u, g) { - var m, f; - return u.id === g.id && ((m = u.color) == null ? void 0 : m.id) === ((f = g.color) == null ? void 0 : f.id); + s.getModifier = a; + function h(u, m) { + var b, g; + return u.id === m.id && ((b = u.color) == null ? void 0 : b.id) === ((g = m.color) == null ? void 0 : g.id); } s.isEqual = h; -})(Ze || (Ze = {})); -const Qt = $e("commandService"), st = new class { +})(Se || (Se = {})); +const Ot = $e("commandService"), st = new class { constructor() { this._commands = /* @__PURE__ */ new Map(), this._onDidRegisterCommand = new k(), this.onDidRegisterCommand = this._onDidRegisterCommand.event; } @@ -6281,26 +6281,26 @@ const Qt = $e("commandService"), st = new class { return this.registerCommand({ id: s, handler: e }); } if (s.metadata && Array.isArray(s.metadata.args)) { - const r = []; - for (const a of s.metadata.args) - r.push(a.constraint); - const l = s.handler; - s.handler = function(a, ...c) { - return P8(c, r), l(a, ...c); + const l = []; + for (const c of s.metadata.args) + l.push(c.constraint); + const r = s.handler; + s.handler = function(c, ...d) { + return k6(d, l), r(c, ...d); }; } const { id: t } = s; let i = this._commands.get(t); - i || (i = new cs(), this._commands.set(t, i)); - const n = i.unshift(s), o = Ce(() => { + i || (i = new hs(), this._commands.set(t, i)); + const n = i.unshift(s), o = We(() => { n(); - const r = this._commands.get(t); - r != null && r.isEmpty() && this._commands.delete(t); + const l = this._commands.get(t); + l != null && l.isEmpty() && this._commands.delete(t); }); return this._onDidRegisterCommand.fire(t), o; } registerCommandAlias(s, e) { - return st.registerCommand(s, (t, ...i) => t.get(Qt).executeCommand(e, ...i)); + return st.registerCommand(s, (t, ...i) => t.get(Ot).executeCommand(e, ...i)); } getCommand(s) { const e = this._commands.get(s); @@ -6318,7 +6318,7 @@ const Qt = $e("commandService"), st = new class { }(); st.registerCommand("noop", () => { }); -function NN(...s) { +function UC(...s) { switch (s.length) { case 1: return p("contextkey.scanner.hint.didYouMean1", "Did you mean {0}?", s[0]); @@ -6330,9 +6330,9 @@ function NN(...s) { return; } } -const b$ = p("contextkey.scanner.hint.didYouForgetToOpenOrCloseQuote", "Did you forget to open or close the quote?"), y$ = p("contextkey.scanner.hint.didYouForgetToEscapeSlash", "Did you forget to escape the '/' (slash) character? Put two backslashes before it to escape, e.g., '\\\\/'."); -var Wc; -let D0 = (Wc = class { +const dee = p("contextkey.scanner.hint.didYouForgetToOpenOrCloseQuote", "Did you forget to open or close the quote?"), aee = p("contextkey.scanner.hint.didYouForgetToEscapeSlash", "Did you forget to escape the '/' (slash) character? Put two backslashes before it to escape, e.g., '\\\\/'."); +var Yd; +let D0 = (Yd = class { constructor() { this._input = "", this._start = 0, this._current = 0, this._tokens = [], this._errors = [], this.stringRe = /[a-zA-Z0-9_<>\-\./\\:\*\?\+\[\]\^,#@;"%\$\p{L}-]+/uy; } @@ -6381,7 +6381,7 @@ let D0 = (Wc = class { case 20: return "EOF"; default: - throw KR(`unhandled token type: ${JSON.stringify(e)}; have you forgotten to add a case?`); + throw Wv(`unhandled token type: ${JSON.stringify(e)}; have you forgotten to add a case?`); } } reset(e) { @@ -6440,7 +6440,7 @@ let D0 = (Wc = class { ) ? this._addToken( 9 /* TokenType.RegexOp */ - ) : this._error(NN("==", "=~")); + ) : this._error(UC("==", "=~")); break; case 60: this._addToken( @@ -6467,7 +6467,7 @@ let D0 = (Wc = class { ) ? this._addToken( 15 /* TokenType.And */ - ) : this._error(NN("&&")); + ) : this._error(UC("&&")); break; case 124: this._match( @@ -6476,7 +6476,7 @@ let D0 = (Wc = class { ) ? this._addToken( 16 /* TokenType.Or */ - ) : this._error(NN("||")); + ) : this._error(UC("||")); break; case 32: case 13: @@ -6513,7 +6513,7 @@ let D0 = (Wc = class { const e = this.stringRe.exec(this._input); if (e) { this._current = this._start + e[0].length; - const t = this._input.substring(this._start, this._current), i = Wc._keywords.get(t); + const t = this._input.substring(this._start, this._current), i = Yd._keywords.get(t); i ? this._addToken(i) : this._tokens.push({ type: 17, lexeme: t, offset: this._start }); } } @@ -6522,7 +6522,7 @@ let D0 = (Wc = class { for (; this._peek() !== 39 && !this._isAtEnd(); ) this._advance(); if (this._isAtEnd()) { - this._error(b$); + this._error(dee); return; } this._advance(), this._tokens.push({ type: 18, lexeme: this._input.substring(this._start + 1, this._current - 1), offset: this._start + 1 }); @@ -6537,7 +6537,7 @@ let D0 = (Wc = class { let e = this._current, t = !1, i = !1; for (; ; ) { if (e >= this._input.length) { - this._current = e, this._error(y$); + this._current = e, this._error(aee); return; } const o = this._input.charCodeAt(e); @@ -6549,7 +6549,7 @@ let D0 = (Wc = class { } else o === 91 ? i = !0 : o === 92 ? t = !0 : o === 93 && (i = !1); e++; } - for (; e < this._input.length && Wc._regexFlags.has(this._input.charCodeAt(e)); ) + for (; e < this._input.length && Yd._regexFlags.has(this._input.charCodeAt(e)); ) e++; this._current = e; const n = this._input.substring(this._start, this._current); @@ -6558,7 +6558,7 @@ let D0 = (Wc = class { _isAtEnd() { return this._current >= this._input.length; } -}, Wc._regexFlags = new Set(["i", "g", "s", "m", "y", "u"].map((e) => e.charCodeAt(0))), Wc._keywords = /* @__PURE__ */ new Map([ +}, Yd._regexFlags = new Set(["i", "g", "s", "m", "y", "u"].map((e) => e.charCodeAt(0))), Yd._keywords = /* @__PURE__ */ new Map([ [ "not", 14 @@ -6579,25 +6579,25 @@ let D0 = (Wc = class { 11 /* TokenType.True */ ] -]), Wc); -const Gn = /* @__PURE__ */ new Map(); -Gn.set("false", !1); -Gn.set("true", !0); -Gn.set("isMac", qe); -Gn.set("isLinux", fs); -Gn.set("isWindows", kn); -Gn.set("isWeb", Dm); -Gn.set("isMacNative", qe && !Dm); -Gn.set("isEdge", e6); -Gn.set("isFirefox", q8); -Gn.set("isChrome", yH); -Gn.set("isSafari", $8); -const w$ = Object.prototype.hasOwnProperty, C$ = { +]), Yd); +const Hn = /* @__PURE__ */ new Map(); +Hn.set("false", !1); +Hn.set("true", !0); +Hn.set("isMac", qe); +Hn.set("isLinux", fs); +Hn.set("isWindows", Jn); +Hn.set("isWeb", Hb); +Hn.set("isMacNative", qe && !Hb); +Hn.set("isEdge", P6); +Hn.set("isFirefox", K6); +Hn.set("isChrome", eB); +Hn.set("isSafari", U6); +const hee = Object.prototype.hasOwnProperty, uee = { regexParsingWithErrorRecovery: !0 -}, S$ = p("contextkey.parser.error.emptyString", "Empty context key expression"), L$ = p("contextkey.parser.error.emptyString.hint", "Did you forget to write an expression? You can also put 'false' or 'true' to always evaluate to false or true, respectively."), A$ = p("contextkey.parser.error.noInAfterNot", "'in' after 'not'."), sF = p("contextkey.parser.error.closingParenthesis", "closing parenthesis ')'"), x$ = p("contextkey.parser.error.unexpectedToken", "Unexpected token"), M$ = p("contextkey.parser.error.unexpectedToken.hint", "Did you forget to put && or || before the token?"), Z$ = p("contextkey.parser.error.unexpectedEOF", "Unexpected end of expression"), _$ = p("contextkey.parser.error.unexpectedEOF.hint", "Did you forget to put a context key?"); -var Ca; -let I$ = (Ca = class { - constructor(e = C$) { +}, mee = p("contextkey.parser.error.emptyString", "Empty context key expression"), bee = p("contextkey.parser.error.emptyString.hint", "Did you forget to write an expression? You can also put 'false' or 'true' to always evaluate to false or true, respectively."), pee = p("contextkey.parser.error.noInAfterNot", "'in' after 'not'."), RD = p("contextkey.parser.error.closingParenthesis", "closing parenthesis ')'"), gee = p("contextkey.parser.error.unexpectedToken", "Unexpected token"), Zee = p("contextkey.parser.error.unexpectedToken.hint", "Did you forget to put && or || before the token?"), fee = p("contextkey.parser.error.unexpectedEOF", "Unexpected end of expression"), yee = p("contextkey.parser.error.unexpectedEOF.hint", "Did you forget to put a context key?"); +var Lc; +let Wee = (Lc = class { + constructor(e = uee) { this._config = e, this._scanner = new D0(), this._tokens = [], this._current = 0, this._parsingErrors = [], this._flagsGYRe = /g|y/g; } /** @@ -6608,19 +6608,19 @@ let I$ = (Ca = class { */ parse(e) { if (e === "") { - this._parsingErrors.push({ message: S$, offset: 0, lexeme: "", additionalInfo: L$ }); + this._parsingErrors.push({ message: mee, offset: 0, lexeme: "", additionalInfo: bee }); return; } this._tokens = this._scanner.reset(e).scan(), this._current = 0, this._parsingErrors = []; try { const t = this._expr(); if (!this._isAtEnd()) { - const i = this._peek(), n = i.type === 17 ? M$ : void 0; - throw this._parsingErrors.push({ message: x$, offset: i.offset, lexeme: D0.getLexeme(i), additionalInfo: n }), Ca._parseError; + const i = this._peek(), n = i.type === 17 ? Zee : void 0; + throw this._parsingErrors.push({ message: gee, offset: i.offset, lexeme: D0.getLexeme(i), additionalInfo: n }), Lc._parseError; } return t; } catch (t) { - if (t !== Ca._parseError) + if (t !== Lc._parseError) throw t; return; } @@ -6637,7 +6637,7 @@ let I$ = (Ca = class { const t = this._and(); e.push(t); } - return e.length === 1 ? e[0] : H.or(...e); + return e.length === 1 ? e[0] : P.or(...e); } _and() { const e = [this._term()]; @@ -6648,7 +6648,7 @@ let I$ = (Ca = class { const t = this._term(); e.push(t); } - return e.length === 1 ? e[0] : H.and(...e); + return e.length === 1 ? e[0] : P.and(...e); } _term() { if (this._matchOne( @@ -6658,16 +6658,16 @@ let I$ = (Ca = class { const e = this._peek(); switch (e.type) { case 11: - return this._advance(), ys.INSTANCE; + return this._advance(), Ws.INSTANCE; case 12: - return this._advance(), Rs.INSTANCE; + return this._advance(), Es.INSTANCE; case 0: { this._advance(); const t = this._expr(); - return this._consume(1, sF), t == null ? void 0 : t.negate(); + return this._consume(1, RD), t == null ? void 0 : t.negate(); } case 17: - return this._advance(), km.create(e.lexeme); + return this._advance(), Db.create(e.lexeme); default: throw this._errExpectedButGot("KEY | true | false | '(' expression ')'", e); } @@ -6678,13 +6678,13 @@ let I$ = (Ca = class { const e = this._peek(); switch (e.type) { case 11: - return this._advance(), H.true(); + return this._advance(), P.true(); case 12: - return this._advance(), H.false(); + return this._advance(), P.false(); case 0: { this._advance(); const t = this._expr(); - return this._consume(1, sF), t; + return this._consume(1, RD), t; } case 17: { const t = e.lexeme; @@ -6696,67 +6696,67 @@ let I$ = (Ca = class { if (!this._config.regexParsingWithErrorRecovery) { if (this._advance(), n.type !== 10) throw this._errExpectedButGot("REGEX", n); - const o = n.lexeme, r = o.lastIndexOf("/"), l = r === o.length - 1 ? void 0 : this._removeFlagsGY(o.substring(r + 1)); - let a; + const o = n.lexeme, l = o.lastIndexOf("/"), r = l === o.length - 1 ? void 0 : this._removeFlagsGY(o.substring(l + 1)); + let c; try { - a = new RegExp(o.substring(1, r), l); + c = new RegExp(o.substring(1, l), r); } catch { throw this._errExpectedButGot("REGEX", n); } - return Vw.create(t, a); + return Py.create(t, c); } switch (n.type) { case 10: case 19: { const o = [n.lexeme]; this._advance(); - let r = this._peek(), l = 0; + let l = this._peek(), r = 0; for (let u = 0; u < n.lexeme.length; u++) - n.lexeme.charCodeAt(u) === 40 ? l++ : n.lexeme.charCodeAt(u) === 41 && l--; - for (; !this._isAtEnd() && r.type !== 15 && r.type !== 16; ) { - switch (r.type) { + n.lexeme.charCodeAt(u) === 40 ? r++ : n.lexeme.charCodeAt(u) === 41 && r--; + for (; !this._isAtEnd() && l.type !== 15 && l.type !== 16; ) { + switch (l.type) { case 0: - l++; + r++; break; case 1: - l--; + r--; break; case 10: case 18: - for (let u = 0; u < r.lexeme.length; u++) - r.lexeme.charCodeAt(u) === 40 ? l++ : n.lexeme.charCodeAt(u) === 41 && l--; + for (let u = 0; u < l.lexeme.length; u++) + l.lexeme.charCodeAt(u) === 40 ? r++ : n.lexeme.charCodeAt(u) === 41 && r--; } - if (l < 0) + if (r < 0) break; - o.push(D0.getLexeme(r)), this._advance(), r = this._peek(); + o.push(D0.getLexeme(l)), this._advance(), l = this._peek(); } - const a = o.join(""), c = a.lastIndexOf("/"), d = c === a.length - 1 ? void 0 : this._removeFlagsGY(a.substring(c + 1)); + const c = o.join(""), d = c.lastIndexOf("/"), a = d === c.length - 1 ? void 0 : this._removeFlagsGY(c.substring(d + 1)); let h; try { - h = new RegExp(a.substring(1, c), d); + h = new RegExp(c.substring(1, d), a); } catch { throw this._errExpectedButGot("REGEX", n); } - return H.regex(t, h); + return P.regex(t, h); } case 18: { const o = n.lexeme; this._advance(); - let r = null; - if (!RH(o)) { - const l = o.indexOf("/"), a = o.lastIndexOf("/"); - if (l !== a && l >= 0) { - const c = o.slice(l + 1, a), d = o[a + 1] === "i" ? "i" : ""; + let l = null; + if (!yB(o)) { + const r = o.indexOf("/"), c = o.lastIndexOf("/"); + if (r !== c && r >= 0) { + const d = o.slice(r + 1, c), a = o[c + 1] === "i" ? "i" : ""; try { - r = new RegExp(c, d); + l = new RegExp(d, a); } catch { throw this._errExpectedButGot("REGEX", n); } } } - if (r === null) + if (l === null) throw this._errExpectedButGot("REGEX", n); - return Vw.create(t, r); + return Py.create(t, l); } default: throw this._errExpectedButGot("REGEX", this._peek()); @@ -6766,58 +6766,58 @@ let I$ = (Ca = class { 14 /* TokenType.Not */ )) { - this._consume(13, A$); + this._consume(13, pee); const n = this._value(); - return H.notIn(t, n); + return P.notIn(t, n); } switch (this._peek().type) { case 3: { this._advance(); const n = this._value(); if (this._previous().type === 18) - return H.equals(t, n); + return P.equals(t, n); switch (n) { case "true": - return H.has(t); + return P.has(t); case "false": - return H.not(t); + return P.not(t); default: - return H.equals(t, n); + return P.equals(t, n); } } case 4: { this._advance(); const n = this._value(); if (this._previous().type === 18) - return H.notEquals(t, n); + return P.notEquals(t, n); switch (n) { case "true": - return H.not(t); + return P.not(t); case "false": - return H.has(t); + return P.has(t); default: - return H.notEquals(t, n); + return P.notEquals(t, n); } } case 5: - return this._advance(), z_.create(t, this._value()); + return this._advance(), nx.create(t, this._value()); case 6: - return this._advance(), P_.create(t, this._value()); + return this._advance(), sx.create(t, this._value()); case 7: - return this._advance(), F_.create(t, this._value()); + return this._advance(), tx.create(t, this._value()); case 8: - return this._advance(), Y_.create(t, this._value()); + return this._advance(), ix.create(t, this._value()); case 13: - return this._advance(), H.in(t, this._value()); + return this._advance(), P.in(t, this._value()); default: - return H.has(t); + return P.has(t); } } case 20: - throw this._parsingErrors.push({ message: Z$, offset: e.offset, lexeme: "", additionalInfo: _$ }), Ca._parseError; + throw this._parsingErrors.push({ message: fee, offset: e.offset, lexeme: "", additionalInfo: yee }), Lc._parseError; default: - throw this._errExpectedButGot(`true | false | KEY - | KEY '=~' REGEX + throw this._errExpectedButGot(`true | false | KEY + | KEY '=~' REGEX | KEY ('==' | '!=' | '<' | '<=' | '>' | '>=' | 'in' | 'not' 'in') value`, this._peek()); } } @@ -6857,8 +6857,8 @@ let I$ = (Ca = class { } _errExpectedButGot(e, t, i) { const n = p("contextkey.parser.error.expectedButGot", `Expected: {0} -Received: '{1}'.`, e, D0.getLexeme(t)), o = t.offset, r = D0.getLexeme(t); - return this._parsingErrors.push({ message: n, offset: o, lexeme: r, additionalInfo: i }), Ca._parseError; +Received: '{1}'.`, e, D0.getLexeme(t)), o = t.offset, l = D0.getLexeme(t); + return this._parsingErrors.push({ message: n, offset: o, lexeme: l, additionalInfo: i }), Lc._parseError; } _check(e) { return this._peek().type === e; @@ -6869,55 +6869,55 @@ Received: '{1}'.`, e, D0.getLexeme(t)), o = t.offset, r = D0.getLexeme(t); _isAtEnd() { return this._peek().type === 20; } -}, Ca._parseError = new Error(), Ca); -const x9 = class x9 { +}, Lc._parseError = new Error(), Lc); +const QE = class QE { static false() { - return ys.INSTANCE; + return Ws.INSTANCE; } static true() { - return Rs.INSTANCE; + return Es.INSTANCE; } static has(e) { - return Vm.create(e); + return Eb.create(e); } static equals(e, t) { - return jb.create(e, t); + return n0.create(e, t); } static notEquals(e, t) { - return E_.create(e, t); + return $S.create(e, t); } static regex(e, t) { - return Vw.create(e, t); + return Py.create(e, t); } static in(e, t) { - return G_.create(e, t); + return jS.create(e, t); } static notIn(e, t) { - return R_.create(e, t); + return qS.create(e, t); } static not(e) { - return km.create(e); + return Db.create(e); } static and(...e) { - return ju.create(e, null, !0); + return im.create(e, null, !0); } static or(...e) { - return yc.create(e, null, !0); + return Xd.create(e, null, !0); } static deserialize(e) { return e == null ? void 0 : this._parser.parse(e); } }; -x9._parser = new I$({ regexParsingWithErrorRecovery: !1 }); -let H = x9; -function N$(s, e) { +QE._parser = new Wee({ regexParsingWithErrorRecovery: !1 }); +let P = QE; +function Gee(s, e) { const t = s ? s.substituteConstants() : void 0, i = e ? e.substituteConstants() : void 0; return !t && !i ? !0 : !t || !i ? !1 : t.equals(i); } -function Iy(s, e) { +function Ef(s, e) { return s.cmp(e); } -const tZ = class tZ { +const g2 = class g2 { constructor() { this.type = 0; } @@ -6940,12 +6940,12 @@ const tZ = class tZ { return []; } negate() { - return Rs.INSTANCE; + return Es.INSTANCE; } }; -tZ.INSTANCE = new tZ(); -let ys = tZ; -const iZ = class iZ { +g2.INSTANCE = new g2(); +let Ws = g2; +const Z2 = class Z2 { constructor() { this.type = 1; } @@ -6968,28 +6968,28 @@ const iZ = class iZ { return []; } negate() { - return ys.INSTANCE; + return Ws.INSTANCE; } }; -iZ.INSTANCE = new iZ(); -let Rs = iZ; -class Vm { +Z2.INSTANCE = new Z2(); +let Es = Z2; +class Eb { static create(e, t = null) { - const i = Gn.get(e); - return typeof i == "boolean" ? i ? Rs.INSTANCE : ys.INSTANCE : new Vm(e, t); + const i = Hn.get(e); + return typeof i == "boolean" ? i ? Es.INSTANCE : Ws.INSTANCE : new Eb(e, t); } constructor(e, t) { this.key = e, this.negated = t, this.type = 2; } cmp(e) { - return e.type !== this.type ? this.type - e.type : uJ(this.key, e.key); + return e.type !== this.type ? this.type - e.type : _B(this.key, e.key); } equals(e) { return e.type === this.type ? this.key === e.key : !1; } substituteConstants() { - const e = Gn.get(this.key); - return typeof e == "boolean" ? e ? Rs.INSTANCE : ys.INSTANCE : this; + const e = Hn.get(this.key); + return typeof e == "boolean" ? e ? Es.INSTANCE : Ws.INSTANCE : this; } evaluate(e) { return !!e.getValue(this.key); @@ -7001,30 +7001,30 @@ class Vm { return [this.key]; } negate() { - return this.negated || (this.negated = km.create(this.key, this)), this.negated; + return this.negated || (this.negated = Db.create(this.key, this)), this.negated; } } -class jb { +class n0 { static create(e, t, i = null) { if (typeof t == "boolean") - return t ? Vm.create(e, i) : km.create(e, i); - const n = Gn.get(e); - return typeof n == "boolean" ? t === (n ? "true" : "false") ? Rs.INSTANCE : ys.INSTANCE : new jb(e, t, i); + return t ? Eb.create(e, i) : Db.create(e, i); + const n = Hn.get(e); + return typeof n == "boolean" ? t === (n ? "true" : "false") ? Es.INSTANCE : Ws.INSTANCE : new n0(e, t, i); } constructor(e, t, i) { this.key = e, this.value = t, this.negated = i, this.type = 4; } cmp(e) { - return e.type !== this.type ? this.type - e.type : Gm(this.key, this.value, e.key, e.value); + return e.type !== this.type ? this.type - e.type : Fb(this.key, this.value, e.key, e.value); } equals(e) { return e.type === this.type ? this.key === e.key && this.value === e.value : !1; } substituteConstants() { - const e = Gn.get(this.key); + const e = Hn.get(this.key); if (typeof e == "boolean") { const t = e ? "true" : "false"; - return this.value === t ? Rs.INSTANCE : ys.INSTANCE; + return this.value === t ? Es.INSTANCE : Ws.INSTANCE; } return this; } @@ -7038,18 +7038,18 @@ class jb { return [this.key]; } negate() { - return this.negated || (this.negated = E_.create(this.key, this.value, this)), this.negated; + return this.negated || (this.negated = $S.create(this.key, this.value, this)), this.negated; } } -class G_ { +class jS { static create(e, t) { - return new G_(e, t); + return new jS(e, t); } constructor(e, t) { this.key = e, this.valueKey = t, this.type = 10, this.negated = null; } cmp(e) { - return e.type !== this.type ? this.type - e.type : Gm(this.key, this.valueKey, e.key, e.valueKey); + return e.type !== this.type ? this.type - e.type : Fb(this.key, this.valueKey, e.key, e.valueKey); } equals(e) { return e.type === this.type ? this.key === e.key && this.valueKey === e.valueKey : !1; @@ -7059,7 +7059,7 @@ class G_ { } evaluate(e) { const t = e.getValue(this.valueKey), i = e.getValue(this.key); - return Array.isArray(t) ? t.includes(i) : typeof i == "string" && typeof t == "object" && t !== null ? w$.call(t, i) : !1; + return Array.isArray(t) ? t.includes(i) : typeof i == "string" && typeof t == "object" && t !== null ? hee.call(t, i) : !1; } serialize() { return `${this.key} in '${this.valueKey}'`; @@ -7068,15 +7068,15 @@ class G_ { return [this.key, this.valueKey]; } negate() { - return this.negated || (this.negated = R_.create(this.key, this.valueKey)), this.negated; + return this.negated || (this.negated = qS.create(this.key, this.valueKey)), this.negated; } } -class R_ { +class qS { static create(e, t) { - return new R_(e, t); + return new qS(e, t); } constructor(e, t) { - this.key = e, this.valueKey = t, this.type = 11, this._negated = G_.create(e, t); + this.key = e, this.valueKey = t, this.type = 11, this._negated = jS.create(e, t); } cmp(e) { return e.type !== this.type ? this.type - e.type : this._negated.cmp(e._negated); @@ -7100,27 +7100,27 @@ class R_ { return this._negated; } } -class E_ { +class $S { static create(e, t, i = null) { if (typeof t == "boolean") - return t ? km.create(e, i) : Vm.create(e, i); - const n = Gn.get(e); - return typeof n == "boolean" ? t === (n ? "true" : "false") ? ys.INSTANCE : Rs.INSTANCE : new E_(e, t, i); + return t ? Db.create(e, i) : Eb.create(e, i); + const n = Hn.get(e); + return typeof n == "boolean" ? t === (n ? "true" : "false") ? Ws.INSTANCE : Es.INSTANCE : new $S(e, t, i); } constructor(e, t, i) { this.key = e, this.value = t, this.negated = i, this.type = 5; } cmp(e) { - return e.type !== this.type ? this.type - e.type : Gm(this.key, this.value, e.key, e.value); + return e.type !== this.type ? this.type - e.type : Fb(this.key, this.value, e.key, e.value); } equals(e) { return e.type === this.type ? this.key === e.key && this.value === e.value : !1; } substituteConstants() { - const e = Gn.get(this.key); + const e = Hn.get(this.key); if (typeof e == "boolean") { const t = e ? "true" : "false"; - return this.value === t ? ys.INSTANCE : Rs.INSTANCE; + return this.value === t ? Ws.INSTANCE : Es.INSTANCE; } return this; } @@ -7134,26 +7134,26 @@ class E_ { return [this.key]; } negate() { - return this.negated || (this.negated = jb.create(this.key, this.value, this)), this.negated; + return this.negated || (this.negated = n0.create(this.key, this.value, this)), this.negated; } } -class km { +class Db { static create(e, t = null) { - const i = Gn.get(e); - return typeof i == "boolean" ? i ? ys.INSTANCE : Rs.INSTANCE : new km(e, t); + const i = Hn.get(e); + return typeof i == "boolean" ? i ? Ws.INSTANCE : Es.INSTANCE : new Db(e, t); } constructor(e, t) { this.key = e, this.negated = t, this.type = 3; } cmp(e) { - return e.type !== this.type ? this.type - e.type : uJ(this.key, e.key); + return e.type !== this.type ? this.type - e.type : _B(this.key, e.key); } equals(e) { return e.type === this.type ? this.key === e.key : !1; } substituteConstants() { - const e = Gn.get(this.key); - return typeof e == "boolean" ? e ? ys.INSTANCE : Rs.INSTANCE : this; + const e = Hn.get(this.key); + return typeof e == "boolean" ? e ? Ws.INSTANCE : Es.INSTANCE : this; } evaluate(e) { return !e.getValue(this.key); @@ -7165,25 +7165,25 @@ class km { return [this.key]; } negate() { - return this.negated || (this.negated = Vm.create(this.key, this)), this.negated; + return this.negated || (this.negated = Eb.create(this.key, this)), this.negated; } } -function X_(s, e) { +function ex(s, e) { if (typeof s == "string") { const t = parseFloat(s); isNaN(t) || (s = t); } - return typeof s == "string" || typeof s == "number" ? e(s) : ys.INSTANCE; + return typeof s == "string" || typeof s == "number" ? e(s) : Ws.INSTANCE; } -class F_ { +class tx { static create(e, t, i = null) { - return X_(t, (n) => new F_(e, n, i)); + return ex(t, (n) => new tx(e, n, i)); } constructor(e, t, i) { this.key = e, this.value = t, this.negated = i, this.type = 12; } cmp(e) { - return e.type !== this.type ? this.type - e.type : Gm(this.key, this.value, e.key, e.value); + return e.type !== this.type ? this.type - e.type : Fb(this.key, this.value, e.key, e.value); } equals(e) { return e.type === this.type ? this.key === e.key && this.value === e.value : !1; @@ -7201,18 +7201,18 @@ class F_ { return [this.key]; } negate() { - return this.negated || (this.negated = P_.create(this.key, this.value, this)), this.negated; + return this.negated || (this.negated = sx.create(this.key, this.value, this)), this.negated; } } -class Y_ { +class ix { static create(e, t, i = null) { - return X_(t, (n) => new Y_(e, n, i)); + return ex(t, (n) => new ix(e, n, i)); } constructor(e, t, i) { this.key = e, this.value = t, this.negated = i, this.type = 13; } cmp(e) { - return e.type !== this.type ? this.type - e.type : Gm(this.key, this.value, e.key, e.value); + return e.type !== this.type ? this.type - e.type : Fb(this.key, this.value, e.key, e.value); } equals(e) { return e.type === this.type ? this.key === e.key && this.value === e.value : !1; @@ -7230,18 +7230,18 @@ class Y_ { return [this.key]; } negate() { - return this.negated || (this.negated = z_.create(this.key, this.value, this)), this.negated; + return this.negated || (this.negated = nx.create(this.key, this.value, this)), this.negated; } } -class z_ { +class nx { static create(e, t, i = null) { - return X_(t, (n) => new z_(e, n, i)); + return ex(t, (n) => new nx(e, n, i)); } constructor(e, t, i) { this.key = e, this.value = t, this.negated = i, this.type = 14; } cmp(e) { - return e.type !== this.type ? this.type - e.type : Gm(this.key, this.value, e.key, e.value); + return e.type !== this.type ? this.type - e.type : Fb(this.key, this.value, e.key, e.value); } equals(e) { return e.type === this.type ? this.key === e.key && this.value === e.value : !1; @@ -7259,18 +7259,18 @@ class z_ { return [this.key]; } negate() { - return this.negated || (this.negated = Y_.create(this.key, this.value, this)), this.negated; + return this.negated || (this.negated = ix.create(this.key, this.value, this)), this.negated; } } -class P_ { +class sx { static create(e, t, i = null) { - return X_(t, (n) => new P_(e, n, i)); + return ex(t, (n) => new sx(e, n, i)); } constructor(e, t, i) { this.key = e, this.value = t, this.negated = i, this.type = 15; } cmp(e) { - return e.type !== this.type ? this.type - e.type : Gm(this.key, this.value, e.key, e.value); + return e.type !== this.type ? this.type - e.type : Fb(this.key, this.value, e.key, e.value); } equals(e) { return e.type === this.type ? this.key === e.key && this.value === e.value : !1; @@ -7288,12 +7288,12 @@ class P_ { return [this.key]; } negate() { - return this.negated || (this.negated = F_.create(this.key, this.value, this)), this.negated; + return this.negated || (this.negated = tx.create(this.key, this.value, this)), this.negated; } } -class Vw { +class Py { static create(e, t) { - return new Vw(e, t); + return new Py(e, t); } constructor(e, t) { this.key = e, this.regexp = t, this.type = 7, this.negated = null; @@ -7330,12 +7330,12 @@ class Vw { return [this.key]; } negate() { - return this.negated || (this.negated = uE.create(this)), this.negated; + return this.negated || (this.negated = Jv.create(this)), this.negated; } } -class uE { +class Jv { static create(e) { - return new uE(e); + return new Jv(e); } constructor(e) { this._actual = e, this.type = 8; @@ -7362,7 +7362,7 @@ class uE { return this._actual; } } -function hJ(s) { +function BB(s) { let e = null; for (let t = 0, i = s.length; t < i; t++) { const n = s[t].substituteConstants(); @@ -7375,9 +7375,9 @@ function hJ(s) { } return e === null ? s : e; } -class ju { +class im { static create(e, t, i) { - return ju._normalizeArr(e, t, i); + return im._normalizeArr(e, t, i); } constructor(e, t) { this.expr = e, this.negated = t, this.type = 6; @@ -7390,7 +7390,7 @@ class ju { if (this.expr.length > e.expr.length) return 1; for (let t = 0, i = this.expr.length; t < i; t++) { - const n = Iy(this.expr[t], e.expr[t]); + const n = Ef(this.expr[t], e.expr[t]); if (n !== 0) return n; } @@ -7408,8 +7408,8 @@ class ju { return !1; } substituteConstants() { - const e = hJ(this.expr); - return e === this.expr ? this : ju.create(e, this.negated, !1); + const e = BB(this.expr); + return e === this.expr ? this : im.create(e, this.negated, !1); } evaluate(e) { for (let t = 0, i = this.expr.length; t < i; t++) @@ -7420,49 +7420,49 @@ class ju { static _normalizeArr(e, t, i) { const n = []; let o = !1; - for (const r of e) - if (r) { - if (r.type === 1) { + for (const l of e) + if (l) { + if (l.type === 1) { o = !0; continue; } - if (r.type === 0) - return ys.INSTANCE; - if (r.type === 6) { - n.push(...r.expr); + if (l.type === 0) + return Ws.INSTANCE; + if (l.type === 6) { + n.push(...l.expr); continue; } - n.push(r); + n.push(l); } if (n.length === 0 && o) - return Rs.INSTANCE; + return Es.INSTANCE; if (n.length !== 0) { if (n.length === 1) return n[0]; - n.sort(Iy); - for (let r = 1; r < n.length; r++) - n[r - 1].equals(n[r]) && (n.splice(r, 1), r--); + n.sort(Ef); + for (let l = 1; l < n.length; l++) + n[l - 1].equals(n[l]) && (n.splice(l, 1), l--); if (n.length === 1) return n[0]; for (; n.length > 1; ) { - const r = n[n.length - 1]; - if (r.type !== 9) + const l = n[n.length - 1]; + if (l.type !== 9) break; n.pop(); - const l = n.pop(), a = n.length === 0, c = yc.create(r.expr.map((d) => ju.create([d, l], null, i)), null, a); - c && (n.push(c), n.sort(Iy)); + const r = n.pop(), c = n.length === 0, d = Xd.create(l.expr.map((a) => im.create([a, r], null, i)), null, c); + d && (n.push(d), n.sort(Ef)); } if (n.length === 1) return n[0]; if (i) { - for (let r = 0; r < n.length; r++) - for (let l = r + 1; l < n.length; l++) - if (n[r].negate().equals(n[l])) - return ys.INSTANCE; + for (let l = 0; l < n.length; l++) + for (let r = l + 1; r < n.length; r++) + if (n[l].negate().equals(n[r])) + return Ws.INSTANCE; if (n.length === 1) return n[0]; } - return new ju(n, t); + return new im(n, t); } } serialize() { @@ -7479,14 +7479,14 @@ class ju { const e = []; for (const t of this.expr) e.push(t.negate()); - this.negated = yc.create(e, this, !0); + this.negated = Xd.create(e, this, !0); } return this.negated; } } -class yc { +class Xd { static create(e, t, i) { - return yc._normalizeArr(e, t, i); + return Xd._normalizeArr(e, t, i); } constructor(e, t) { this.expr = e, this.negated = t, this.type = 9; @@ -7499,7 +7499,7 @@ class yc { if (this.expr.length > e.expr.length) return 1; for (let t = 0, i = this.expr.length; t < i; t++) { - const n = Iy(this.expr[t], e.expr[t]); + const n = Ef(this.expr[t], e.expr[t]); if (n !== 0) return n; } @@ -7517,8 +7517,8 @@ class yc { return !1; } substituteConstants() { - const e = hJ(this.expr); - return e === this.expr ? this : yc.create(e, this.negated, !1); + const e = BB(this.expr); + return e === this.expr ? this : Xd.create(e, this.negated, !1); } evaluate(e) { for (let t = 0, i = this.expr.length; t < i; t++) @@ -7529,42 +7529,42 @@ class yc { static _normalizeArr(e, t, i) { let n = [], o = !1; if (e) { - for (let r = 0, l = e.length; r < l; r++) { - const a = e[r]; - if (a) { - if (a.type === 0) { + for (let l = 0, r = e.length; l < r; l++) { + const c = e[l]; + if (c) { + if (c.type === 0) { o = !0; continue; } - if (a.type === 1) - return Rs.INSTANCE; - if (a.type === 9) { - n = n.concat(a.expr); + if (c.type === 1) + return Es.INSTANCE; + if (c.type === 9) { + n = n.concat(c.expr); continue; } - n.push(a); + n.push(c); } } if (n.length === 0 && o) - return ys.INSTANCE; - n.sort(Iy); + return Ws.INSTANCE; + n.sort(Ef); } if (n.length !== 0) { if (n.length === 1) return n[0]; - for (let r = 1; r < n.length; r++) - n[r - 1].equals(n[r]) && (n.splice(r, 1), r--); + for (let l = 1; l < n.length; l++) + n[l - 1].equals(n[l]) && (n.splice(l, 1), l--); if (n.length === 1) return n[0]; if (i) { - for (let r = 0; r < n.length; r++) - for (let l = r + 1; l < n.length; l++) - if (n[r].negate().equals(n[l])) - return Rs.INSTANCE; + for (let l = 0; l < n.length; l++) + for (let r = l + 1; r < n.length; r++) + if (n[l].negate().equals(n[r])) + return Es.INSTANCE; if (n.length === 1) return n[0]; } - return new yc(n, t); + return new Xd(n, t); } } serialize() { @@ -7583,22 +7583,22 @@ class yc { e.push(t.negate()); for (; e.length > 1; ) { const t = e.shift(), i = e.shift(), n = []; - for (const o of rF(t)) - for (const r of rF(i)) - n.push(ju.create([o, r], null, !1)); - e.unshift(yc.create(n, null, !1)); + for (const o of wD(t)) + for (const l of wD(i)) + n.push(im.create([o, l], null, !1)); + e.unshift(Xd.create(n, null, !1)); } - this.negated = yc.create(e, this, !0); + this.negated = Xd.create(e, this, !0); } return this.negated; } } -const of = class of extends Vm { +const hg = class hg extends Eb { static all() { - return of._info.values(); + return hg._info.values(); } constructor(e, t, i) { - super(e, null), this._defaultValue = t, typeof i == "object" ? of._info.push({ ...i, key: e }) : i !== !0 && of._info.push({ key: e, description: i, type: t != null ? typeof t : void 0 }); + super(e, null), this._defaultValue = t, typeof i == "object" ? hg._info.push({ ...i, key: e }) : i !== !0 && hg._info.push({ key: e, description: i, type: t != null ? typeof t : void 0 }); } bindTo(e) { return e.createKey(this.key, this._defaultValue); @@ -7610,40 +7610,40 @@ const of = class of extends Vm { return this.negate(); } isEqualTo(e) { - return jb.create(this.key, e); + return n0.create(this.key, e); } }; -of._info = []; -let ae = of; -const _e = $e("contextKeyService"); -function uJ(s, e) { +hg._info = []; +let ce = hg; +const xe = $e("contextKeyService"); +function _B(s, e) { return s < e ? -1 : s > e ? 1 : 0; } -function Gm(s, e, t, i) { +function Fb(s, e, t, i) { return s < t ? -1 : s > t ? 1 : e < i ? -1 : e > i ? 1 : 0; } -function E2(s, e) { +function ow(s, e) { if (s.type === 0 || e.type === 1) return !0; if (s.type === 9) - return e.type === 9 ? oF(s.expr, e.expr) : !1; + return e.type === 9 ? ND(s.expr, e.expr) : !1; if (e.type === 9) { for (const t of e.expr) - if (E2(s, t)) + if (ow(s, t)) return !0; return !1; } if (s.type === 6) { if (e.type === 6) - return oF(e.expr, s.expr); + return ND(e.expr, s.expr); for (const t of s.expr) - if (E2(t, e)) + if (ow(t, e)) return !0; return !1; } return s.equals(e); } -function oF(s, e) { +function ND(s, e) { let t = 0, i = 0; for (; t < s.length && i < e.length; ) { const n = s[t].cmp(e[i]); @@ -7653,26 +7653,26 @@ function oF(s, e) { } return t === s.length; } -function rF(s) { +function wD(s) { return s.type === 9 ? s.expr : [s]; } -function WN(s, e) { +function PC(s, e) { if (!s) throw new Error(e ? `Assertion failed (${e})` : "Assertion Failed"); } -function B_(s, e = "Unreachable") { +function ox(s, e = "Unreachable") { throw new Error(e); } -function lF(s) { - s || De(new mt("Soft Assertion Failed")); +function TD(s) { + s || Me(new bt("Soft Assertion Failed")); } -function gm(s) { +function fb(s) { if (!s()) { debugger; - s(), De(new mt("Assertion Failed")); + s(), Me(new bt("Assertion Failed")); } } -function gE(s, e) { +function Hv(s, e) { let t = 0; for (; t < s.length - 1; ) { const i = s[t], n = s[t + 1]; @@ -7682,30 +7682,30 @@ function gE(s, e) { } return !0; } -class W$ { +class Xee { constructor() { this.data = /* @__PURE__ */ new Map(); } add(e, t) { - WN(Vs(e)), WN(tn(t)), WN(!this.data.has(e), "There is already an extension with this id"), this.data.set(e, t); + PC(vs(e)), PC(nn(t)), PC(!this.data.has(e), "There is already an extension with this id"), this.data.set(e, t); } as(e) { return this.data.get(e) || null; } } -const Di = new W$(); -class mE { +const ki = new Xee(); +class Ev { constructor() { - this._coreKeybindings = new cs(), this._extensionKeybindings = [], this._cachedMergedKeybindings = null; + this._coreKeybindings = new hs(), this._extensionKeybindings = [], this._cachedMergedKeybindings = null; } /** * Take current platform into account and reduce to primary & secondary. */ static bindToCurrentPlatform(e) { - if (ro === 1) { + if (co === 1) { if (e && e.win) return e.win; - } else if (ro === 2) { + } else if (co === 2) { if (e && e.mac) return e.mac; } else if (e && e.linux) @@ -7713,45 +7713,45 @@ class mE { return e; } registerKeybindingRule(e) { - const t = mE.bindToCurrentPlatform(e), i = new U(); + const t = Ev.bindToCurrentPlatform(e), i = new _(); if (t && t.primary) { - const n = f2(t.primary, ro); + const n = JN(t.primary, co); n && i.add(this._registerDefaultKeybinding(n, e.id, e.args, e.weight, 0, e.when)); } if (t && Array.isArray(t.secondary)) for (let n = 0, o = t.secondary.length; n < o; n++) { - const r = t.secondary[n], l = f2(r, ro); - l && i.add(this._registerDefaultKeybinding(l, e.id, e.args, e.weight, -n - 1, e.when)); + const l = t.secondary[n], r = JN(l, co); + r && i.add(this._registerDefaultKeybinding(r, e.id, e.args, e.weight, -n - 1, e.when)); } return i; } registerCommandAndKeybindingRule(e) { - return Yr(this.registerKeybindingRule(e), st.registerCommand(e)); + return Kl(this.registerKeybindingRule(e), st.registerCommand(e)); } - _registerDefaultKeybinding(e, t, i, n, o, r) { - const l = this._coreKeybindings.push({ + _registerDefaultKeybinding(e, t, i, n, o, l) { + const r = this._coreKeybindings.push({ keybinding: e, command: t, commandArgs: i, - when: r, + when: l, weight1: n, weight2: o, extensionId: null, isBuiltinExtension: !1 }); - return this._cachedMergedKeybindings = null, Ce(() => { - l(), this._cachedMergedKeybindings = null; + return this._cachedMergedKeybindings = null, We(() => { + r(), this._cachedMergedKeybindings = null; }); } getDefaultKeybindings() { - return this._cachedMergedKeybindings || (this._cachedMergedKeybindings = Array.from(this._coreKeybindings).concat(this._extensionKeybindings), this._cachedMergedKeybindings.sort(T$)), this._cachedMergedKeybindings.slice(0); + return this._cachedMergedKeybindings || (this._cachedMergedKeybindings = Array.from(this._coreKeybindings).concat(this._extensionKeybindings), this._cachedMergedKeybindings.sort(Lee)), this._cachedMergedKeybindings.slice(0); } } -const ws = new mE(), v$ = { +const Gs = new Ev(), Vee = { EditorModes: "platform.keybindingsRegistry" }; -Di.add(v$.EditorModes, ws); -function T$(s, e) { +ki.add(Vee.EditorModes, Gs); +function Lee(s, e) { if (s.weight1 !== e.weight1) return s.weight1 - e.weight1; if (s.command && e.command) { @@ -7762,62 +7762,62 @@ function T$(s, e) { } return s.weight2 - e.weight2; } -var D$ = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Iee = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, aF = function(s, e) { +}, MD = function(s, e) { return function(t, i) { e(t, i, s); }; -}, pL; -function Cf(s) { +}, NX; +function Sg(s) { return s.command !== void 0; } -function V$(s) { +function See(s) { return s.submenu !== void 0; } -const W = class W { +const N = class N { /** * Create a new `MenuId` with the unique identifier. Will throw if a menu * with the identifier already exists, use `MenuId.for(ident)` or a unique * identifier */ constructor(e) { - if (W._instances.has(e)) + if (N._instances.has(e)) throw new TypeError(`MenuId with identifier '${e}' already exists. Use MenuId.for(ident) or a unique identifier`); - W._instances.set(e, this), this.id = e; + N._instances.set(e, this), this.id = e; } }; -W._instances = /* @__PURE__ */ new Map(), W.CommandPalette = new W("CommandPalette"), W.DebugBreakpointsContext = new W("DebugBreakpointsContext"), W.DebugCallStackContext = new W("DebugCallStackContext"), W.DebugConsoleContext = new W("DebugConsoleContext"), W.DebugVariablesContext = new W("DebugVariablesContext"), W.NotebookVariablesContext = new W("NotebookVariablesContext"), W.DebugHoverContext = new W("DebugHoverContext"), W.DebugWatchContext = new W("DebugWatchContext"), W.DebugToolBar = new W("DebugToolBar"), W.DebugToolBarStop = new W("DebugToolBarStop"), W.DebugCallStackToolbar = new W("DebugCallStackToolbar"), W.DebugCreateConfiguration = new W("DebugCreateConfiguration"), W.EditorContext = new W("EditorContext"), W.SimpleEditorContext = new W("SimpleEditorContext"), W.EditorContent = new W("EditorContent"), W.EditorLineNumberContext = new W("EditorLineNumberContext"), W.EditorContextCopy = new W("EditorContextCopy"), W.EditorContextPeek = new W("EditorContextPeek"), W.EditorContextShare = new W("EditorContextShare"), W.EditorTitle = new W("EditorTitle"), W.EditorTitleRun = new W("EditorTitleRun"), W.EditorTitleContext = new W("EditorTitleContext"), W.EditorTitleContextShare = new W("EditorTitleContextShare"), W.EmptyEditorGroup = new W("EmptyEditorGroup"), W.EmptyEditorGroupContext = new W("EmptyEditorGroupContext"), W.EditorTabsBarContext = new W("EditorTabsBarContext"), W.EditorTabsBarShowTabsSubmenu = new W("EditorTabsBarShowTabsSubmenu"), W.EditorTabsBarShowTabsZenModeSubmenu = new W("EditorTabsBarShowTabsZenModeSubmenu"), W.EditorActionsPositionSubmenu = new W("EditorActionsPositionSubmenu"), W.ExplorerContext = new W("ExplorerContext"), W.ExplorerContextShare = new W("ExplorerContextShare"), W.ExtensionContext = new W("ExtensionContext"), W.GlobalActivity = new W("GlobalActivity"), W.CommandCenter = new W("CommandCenter"), W.CommandCenterCenter = new W("CommandCenterCenter"), W.LayoutControlMenuSubmenu = new W("LayoutControlMenuSubmenu"), W.LayoutControlMenu = new W("LayoutControlMenu"), W.MenubarMainMenu = new W("MenubarMainMenu"), W.MenubarAppearanceMenu = new W("MenubarAppearanceMenu"), W.MenubarDebugMenu = new W("MenubarDebugMenu"), W.MenubarEditMenu = new W("MenubarEditMenu"), W.MenubarCopy = new W("MenubarCopy"), W.MenubarFileMenu = new W("MenubarFileMenu"), W.MenubarGoMenu = new W("MenubarGoMenu"), W.MenubarHelpMenu = new W("MenubarHelpMenu"), W.MenubarLayoutMenu = new W("MenubarLayoutMenu"), W.MenubarNewBreakpointMenu = new W("MenubarNewBreakpointMenu"), W.PanelAlignmentMenu = new W("PanelAlignmentMenu"), W.PanelPositionMenu = new W("PanelPositionMenu"), W.ActivityBarPositionMenu = new W("ActivityBarPositionMenu"), W.MenubarPreferencesMenu = new W("MenubarPreferencesMenu"), W.MenubarRecentMenu = new W("MenubarRecentMenu"), W.MenubarSelectionMenu = new W("MenubarSelectionMenu"), W.MenubarShare = new W("MenubarShare"), W.MenubarSwitchEditorMenu = new W("MenubarSwitchEditorMenu"), W.MenubarSwitchGroupMenu = new W("MenubarSwitchGroupMenu"), W.MenubarTerminalMenu = new W("MenubarTerminalMenu"), W.MenubarViewMenu = new W("MenubarViewMenu"), W.MenubarHomeMenu = new W("MenubarHomeMenu"), W.OpenEditorsContext = new W("OpenEditorsContext"), W.OpenEditorsContextShare = new W("OpenEditorsContextShare"), W.ProblemsPanelContext = new W("ProblemsPanelContext"), W.SCMInputBox = new W("SCMInputBox"), W.SCMChangesSeparator = new W("SCMChangesSeparator"), W.SCMChangesContext = new W("SCMChangesContext"), W.SCMIncomingChanges = new W("SCMIncomingChanges"), W.SCMIncomingChangesContext = new W("SCMIncomingChangesContext"), W.SCMIncomingChangesSetting = new W("SCMIncomingChangesSetting"), W.SCMOutgoingChanges = new W("SCMOutgoingChanges"), W.SCMOutgoingChangesContext = new W("SCMOutgoingChangesContext"), W.SCMOutgoingChangesSetting = new W("SCMOutgoingChangesSetting"), W.SCMIncomingChangesAllChangesContext = new W("SCMIncomingChangesAllChangesContext"), W.SCMIncomingChangesHistoryItemContext = new W("SCMIncomingChangesHistoryItemContext"), W.SCMOutgoingChangesAllChangesContext = new W("SCMOutgoingChangesAllChangesContext"), W.SCMOutgoingChangesHistoryItemContext = new W("SCMOutgoingChangesHistoryItemContext"), W.SCMChangeContext = new W("SCMChangeContext"), W.SCMResourceContext = new W("SCMResourceContext"), W.SCMResourceContextShare = new W("SCMResourceContextShare"), W.SCMResourceFolderContext = new W("SCMResourceFolderContext"), W.SCMResourceGroupContext = new W("SCMResourceGroupContext"), W.SCMSourceControl = new W("SCMSourceControl"), W.SCMSourceControlInline = new W("SCMSourceControlInline"), W.SCMSourceControlTitle = new W("SCMSourceControlTitle"), W.SCMHistoryTitle = new W("SCMHistoryTitle"), W.SCMTitle = new W("SCMTitle"), W.SearchContext = new W("SearchContext"), W.SearchActionMenu = new W("SearchActionContext"), W.StatusBarWindowIndicatorMenu = new W("StatusBarWindowIndicatorMenu"), W.StatusBarRemoteIndicatorMenu = new W("StatusBarRemoteIndicatorMenu"), W.StickyScrollContext = new W("StickyScrollContext"), W.TestItem = new W("TestItem"), W.TestItemGutter = new W("TestItemGutter"), W.TestProfilesContext = new W("TestProfilesContext"), W.TestMessageContext = new W("TestMessageContext"), W.TestMessageContent = new W("TestMessageContent"), W.TestPeekElement = new W("TestPeekElement"), W.TestPeekTitle = new W("TestPeekTitle"), W.TestCallStack = new W("TestCallStack"), W.TouchBarContext = new W("TouchBarContext"), W.TitleBarContext = new W("TitleBarContext"), W.TitleBarTitleContext = new W("TitleBarTitleContext"), W.TunnelContext = new W("TunnelContext"), W.TunnelPrivacy = new W("TunnelPrivacy"), W.TunnelProtocol = new W("TunnelProtocol"), W.TunnelPortInline = new W("TunnelInline"), W.TunnelTitle = new W("TunnelTitle"), W.TunnelLocalAddressInline = new W("TunnelLocalAddressInline"), W.TunnelOriginInline = new W("TunnelOriginInline"), W.ViewItemContext = new W("ViewItemContext"), W.ViewContainerTitle = new W("ViewContainerTitle"), W.ViewContainerTitleContext = new W("ViewContainerTitleContext"), W.ViewTitle = new W("ViewTitle"), W.ViewTitleContext = new W("ViewTitleContext"), W.CommentEditorActions = new W("CommentEditorActions"), W.CommentThreadTitle = new W("CommentThreadTitle"), W.CommentThreadActions = new W("CommentThreadActions"), W.CommentThreadAdditionalActions = new W("CommentThreadAdditionalActions"), W.CommentThreadTitleContext = new W("CommentThreadTitleContext"), W.CommentThreadCommentContext = new W("CommentThreadCommentContext"), W.CommentTitle = new W("CommentTitle"), W.CommentActions = new W("CommentActions"), W.CommentsViewThreadActions = new W("CommentsViewThreadActions"), W.InteractiveToolbar = new W("InteractiveToolbar"), W.InteractiveCellTitle = new W("InteractiveCellTitle"), W.InteractiveCellDelete = new W("InteractiveCellDelete"), W.InteractiveCellExecute = new W("InteractiveCellExecute"), W.InteractiveInputExecute = new W("InteractiveInputExecute"), W.InteractiveInputConfig = new W("InteractiveInputConfig"), W.ReplInputExecute = new W("ReplInputExecute"), W.IssueReporter = new W("IssueReporter"), W.NotebookToolbar = new W("NotebookToolbar"), W.NotebookStickyScrollContext = new W("NotebookStickyScrollContext"), W.NotebookCellTitle = new W("NotebookCellTitle"), W.NotebookCellDelete = new W("NotebookCellDelete"), W.NotebookCellInsert = new W("NotebookCellInsert"), W.NotebookCellBetween = new W("NotebookCellBetween"), W.NotebookCellListTop = new W("NotebookCellTop"), W.NotebookCellExecute = new W("NotebookCellExecute"), W.NotebookCellExecuteGoTo = new W("NotebookCellExecuteGoTo"), W.NotebookCellExecutePrimary = new W("NotebookCellExecutePrimary"), W.NotebookDiffCellInputTitle = new W("NotebookDiffCellInputTitle"), W.NotebookDiffCellMetadataTitle = new W("NotebookDiffCellMetadataTitle"), W.NotebookDiffCellOutputsTitle = new W("NotebookDiffCellOutputsTitle"), W.NotebookOutputToolbar = new W("NotebookOutputToolbar"), W.NotebookOutlineFilter = new W("NotebookOutlineFilter"), W.NotebookOutlineActionMenu = new W("NotebookOutlineActionMenu"), W.NotebookEditorLayoutConfigure = new W("NotebookEditorLayoutConfigure"), W.NotebookKernelSource = new W("NotebookKernelSource"), W.BulkEditTitle = new W("BulkEditTitle"), W.BulkEditContext = new W("BulkEditContext"), W.TimelineItemContext = new W("TimelineItemContext"), W.TimelineTitle = new W("TimelineTitle"), W.TimelineTitleContext = new W("TimelineTitleContext"), W.TimelineFilterSubMenu = new W("TimelineFilterSubMenu"), W.AccountsContext = new W("AccountsContext"), W.SidebarTitle = new W("SidebarTitle"), W.PanelTitle = new W("PanelTitle"), W.AuxiliaryBarTitle = new W("AuxiliaryBarTitle"), W.AuxiliaryBarHeader = new W("AuxiliaryBarHeader"), W.TerminalInstanceContext = new W("TerminalInstanceContext"), W.TerminalEditorInstanceContext = new W("TerminalEditorInstanceContext"), W.TerminalNewDropdownContext = new W("TerminalNewDropdownContext"), W.TerminalTabContext = new W("TerminalTabContext"), W.TerminalTabEmptyAreaContext = new W("TerminalTabEmptyAreaContext"), W.TerminalStickyScrollContext = new W("TerminalStickyScrollContext"), W.WebviewContext = new W("WebviewContext"), W.InlineCompletionsActions = new W("InlineCompletionsActions"), W.InlineEditsActions = new W("InlineEditsActions"), W.InlineEditActions = new W("InlineEditActions"), W.NewFile = new W("NewFile"), W.MergeInput1Toolbar = new W("MergeToolbar1Toolbar"), W.MergeInput2Toolbar = new W("MergeToolbar2Toolbar"), W.MergeBaseToolbar = new W("MergeBaseToolbar"), W.MergeInputResultToolbar = new W("MergeToolbarResultToolbar"), W.InlineSuggestionToolbar = new W("InlineSuggestionToolbar"), W.InlineEditToolbar = new W("InlineEditToolbar"), W.ChatContext = new W("ChatContext"), W.ChatCodeBlock = new W("ChatCodeblock"), W.ChatCompareBlock = new W("ChatCompareBlock"), W.ChatMessageTitle = new W("ChatMessageTitle"), W.ChatExecute = new W("ChatExecute"), W.ChatExecuteSecondary = new W("ChatExecuteSecondary"), W.ChatInputSide = new W("ChatInputSide"), W.AccessibleView = new W("AccessibleView"), W.MultiDiffEditorFileToolbar = new W("MultiDiffEditorFileToolbar"), W.DiffEditorHunkToolbar = new W("DiffEditorHunkToolbar"), W.DiffEditorSelectionToolbar = new W("DiffEditorSelectionToolbar"); -let pe = W; -const Uo = $e("menuService"), pw = class pw { +N._instances = /* @__PURE__ */ new Map(), N.CommandPalette = new N("CommandPalette"), N.DebugBreakpointsContext = new N("DebugBreakpointsContext"), N.DebugCallStackContext = new N("DebugCallStackContext"), N.DebugConsoleContext = new N("DebugConsoleContext"), N.DebugVariablesContext = new N("DebugVariablesContext"), N.NotebookVariablesContext = new N("NotebookVariablesContext"), N.DebugHoverContext = new N("DebugHoverContext"), N.DebugWatchContext = new N("DebugWatchContext"), N.DebugToolBar = new N("DebugToolBar"), N.DebugToolBarStop = new N("DebugToolBarStop"), N.DebugCallStackToolbar = new N("DebugCallStackToolbar"), N.DebugCreateConfiguration = new N("DebugCreateConfiguration"), N.EditorContext = new N("EditorContext"), N.SimpleEditorContext = new N("SimpleEditorContext"), N.EditorContent = new N("EditorContent"), N.EditorLineNumberContext = new N("EditorLineNumberContext"), N.EditorContextCopy = new N("EditorContextCopy"), N.EditorContextPeek = new N("EditorContextPeek"), N.EditorContextShare = new N("EditorContextShare"), N.EditorTitle = new N("EditorTitle"), N.EditorTitleRun = new N("EditorTitleRun"), N.EditorTitleContext = new N("EditorTitleContext"), N.EditorTitleContextShare = new N("EditorTitleContextShare"), N.EmptyEditorGroup = new N("EmptyEditorGroup"), N.EmptyEditorGroupContext = new N("EmptyEditorGroupContext"), N.EditorTabsBarContext = new N("EditorTabsBarContext"), N.EditorTabsBarShowTabsSubmenu = new N("EditorTabsBarShowTabsSubmenu"), N.EditorTabsBarShowTabsZenModeSubmenu = new N("EditorTabsBarShowTabsZenModeSubmenu"), N.EditorActionsPositionSubmenu = new N("EditorActionsPositionSubmenu"), N.ExplorerContext = new N("ExplorerContext"), N.ExplorerContextShare = new N("ExplorerContextShare"), N.ExtensionContext = new N("ExtensionContext"), N.GlobalActivity = new N("GlobalActivity"), N.CommandCenter = new N("CommandCenter"), N.CommandCenterCenter = new N("CommandCenterCenter"), N.LayoutControlMenuSubmenu = new N("LayoutControlMenuSubmenu"), N.LayoutControlMenu = new N("LayoutControlMenu"), N.MenubarMainMenu = new N("MenubarMainMenu"), N.MenubarAppearanceMenu = new N("MenubarAppearanceMenu"), N.MenubarDebugMenu = new N("MenubarDebugMenu"), N.MenubarEditMenu = new N("MenubarEditMenu"), N.MenubarCopy = new N("MenubarCopy"), N.MenubarFileMenu = new N("MenubarFileMenu"), N.MenubarGoMenu = new N("MenubarGoMenu"), N.MenubarHelpMenu = new N("MenubarHelpMenu"), N.MenubarLayoutMenu = new N("MenubarLayoutMenu"), N.MenubarNewBreakpointMenu = new N("MenubarNewBreakpointMenu"), N.PanelAlignmentMenu = new N("PanelAlignmentMenu"), N.PanelPositionMenu = new N("PanelPositionMenu"), N.ActivityBarPositionMenu = new N("ActivityBarPositionMenu"), N.MenubarPreferencesMenu = new N("MenubarPreferencesMenu"), N.MenubarRecentMenu = new N("MenubarRecentMenu"), N.MenubarSelectionMenu = new N("MenubarSelectionMenu"), N.MenubarShare = new N("MenubarShare"), N.MenubarSwitchEditorMenu = new N("MenubarSwitchEditorMenu"), N.MenubarSwitchGroupMenu = new N("MenubarSwitchGroupMenu"), N.MenubarTerminalMenu = new N("MenubarTerminalMenu"), N.MenubarViewMenu = new N("MenubarViewMenu"), N.MenubarHomeMenu = new N("MenubarHomeMenu"), N.OpenEditorsContext = new N("OpenEditorsContext"), N.OpenEditorsContextShare = new N("OpenEditorsContextShare"), N.ProblemsPanelContext = new N("ProblemsPanelContext"), N.SCMInputBox = new N("SCMInputBox"), N.SCMChangesSeparator = new N("SCMChangesSeparator"), N.SCMChangesContext = new N("SCMChangesContext"), N.SCMIncomingChanges = new N("SCMIncomingChanges"), N.SCMIncomingChangesContext = new N("SCMIncomingChangesContext"), N.SCMIncomingChangesSetting = new N("SCMIncomingChangesSetting"), N.SCMOutgoingChanges = new N("SCMOutgoingChanges"), N.SCMOutgoingChangesContext = new N("SCMOutgoingChangesContext"), N.SCMOutgoingChangesSetting = new N("SCMOutgoingChangesSetting"), N.SCMIncomingChangesAllChangesContext = new N("SCMIncomingChangesAllChangesContext"), N.SCMIncomingChangesHistoryItemContext = new N("SCMIncomingChangesHistoryItemContext"), N.SCMOutgoingChangesAllChangesContext = new N("SCMOutgoingChangesAllChangesContext"), N.SCMOutgoingChangesHistoryItemContext = new N("SCMOutgoingChangesHistoryItemContext"), N.SCMChangeContext = new N("SCMChangeContext"), N.SCMResourceContext = new N("SCMResourceContext"), N.SCMResourceContextShare = new N("SCMResourceContextShare"), N.SCMResourceFolderContext = new N("SCMResourceFolderContext"), N.SCMResourceGroupContext = new N("SCMResourceGroupContext"), N.SCMSourceControl = new N("SCMSourceControl"), N.SCMSourceControlInline = new N("SCMSourceControlInline"), N.SCMSourceControlTitle = new N("SCMSourceControlTitle"), N.SCMHistoryTitle = new N("SCMHistoryTitle"), N.SCMTitle = new N("SCMTitle"), N.SearchContext = new N("SearchContext"), N.SearchActionMenu = new N("SearchActionContext"), N.StatusBarWindowIndicatorMenu = new N("StatusBarWindowIndicatorMenu"), N.StatusBarRemoteIndicatorMenu = new N("StatusBarRemoteIndicatorMenu"), N.StickyScrollContext = new N("StickyScrollContext"), N.TestItem = new N("TestItem"), N.TestItemGutter = new N("TestItemGutter"), N.TestProfilesContext = new N("TestProfilesContext"), N.TestMessageContext = new N("TestMessageContext"), N.TestMessageContent = new N("TestMessageContent"), N.TestPeekElement = new N("TestPeekElement"), N.TestPeekTitle = new N("TestPeekTitle"), N.TestCallStack = new N("TestCallStack"), N.TouchBarContext = new N("TouchBarContext"), N.TitleBarContext = new N("TitleBarContext"), N.TitleBarTitleContext = new N("TitleBarTitleContext"), N.TunnelContext = new N("TunnelContext"), N.TunnelPrivacy = new N("TunnelPrivacy"), N.TunnelProtocol = new N("TunnelProtocol"), N.TunnelPortInline = new N("TunnelInline"), N.TunnelTitle = new N("TunnelTitle"), N.TunnelLocalAddressInline = new N("TunnelLocalAddressInline"), N.TunnelOriginInline = new N("TunnelOriginInline"), N.ViewItemContext = new N("ViewItemContext"), N.ViewContainerTitle = new N("ViewContainerTitle"), N.ViewContainerTitleContext = new N("ViewContainerTitleContext"), N.ViewTitle = new N("ViewTitle"), N.ViewTitleContext = new N("ViewTitleContext"), N.CommentEditorActions = new N("CommentEditorActions"), N.CommentThreadTitle = new N("CommentThreadTitle"), N.CommentThreadActions = new N("CommentThreadActions"), N.CommentThreadAdditionalActions = new N("CommentThreadAdditionalActions"), N.CommentThreadTitleContext = new N("CommentThreadTitleContext"), N.CommentThreadCommentContext = new N("CommentThreadCommentContext"), N.CommentTitle = new N("CommentTitle"), N.CommentActions = new N("CommentActions"), N.CommentsViewThreadActions = new N("CommentsViewThreadActions"), N.InteractiveToolbar = new N("InteractiveToolbar"), N.InteractiveCellTitle = new N("InteractiveCellTitle"), N.InteractiveCellDelete = new N("InteractiveCellDelete"), N.InteractiveCellExecute = new N("InteractiveCellExecute"), N.InteractiveInputExecute = new N("InteractiveInputExecute"), N.InteractiveInputConfig = new N("InteractiveInputConfig"), N.ReplInputExecute = new N("ReplInputExecute"), N.IssueReporter = new N("IssueReporter"), N.NotebookToolbar = new N("NotebookToolbar"), N.NotebookStickyScrollContext = new N("NotebookStickyScrollContext"), N.NotebookCellTitle = new N("NotebookCellTitle"), N.NotebookCellDelete = new N("NotebookCellDelete"), N.NotebookCellInsert = new N("NotebookCellInsert"), N.NotebookCellBetween = new N("NotebookCellBetween"), N.NotebookCellListTop = new N("NotebookCellTop"), N.NotebookCellExecute = new N("NotebookCellExecute"), N.NotebookCellExecuteGoTo = new N("NotebookCellExecuteGoTo"), N.NotebookCellExecutePrimary = new N("NotebookCellExecutePrimary"), N.NotebookDiffCellInputTitle = new N("NotebookDiffCellInputTitle"), N.NotebookDiffCellMetadataTitle = new N("NotebookDiffCellMetadataTitle"), N.NotebookDiffCellOutputsTitle = new N("NotebookDiffCellOutputsTitle"), N.NotebookOutputToolbar = new N("NotebookOutputToolbar"), N.NotebookOutlineFilter = new N("NotebookOutlineFilter"), N.NotebookOutlineActionMenu = new N("NotebookOutlineActionMenu"), N.NotebookEditorLayoutConfigure = new N("NotebookEditorLayoutConfigure"), N.NotebookKernelSource = new N("NotebookKernelSource"), N.BulkEditTitle = new N("BulkEditTitle"), N.BulkEditContext = new N("BulkEditContext"), N.TimelineItemContext = new N("TimelineItemContext"), N.TimelineTitle = new N("TimelineTitle"), N.TimelineTitleContext = new N("TimelineTitleContext"), N.TimelineFilterSubMenu = new N("TimelineFilterSubMenu"), N.AccountsContext = new N("AccountsContext"), N.SidebarTitle = new N("SidebarTitle"), N.PanelTitle = new N("PanelTitle"), N.AuxiliaryBarTitle = new N("AuxiliaryBarTitle"), N.AuxiliaryBarHeader = new N("AuxiliaryBarHeader"), N.TerminalInstanceContext = new N("TerminalInstanceContext"), N.TerminalEditorInstanceContext = new N("TerminalEditorInstanceContext"), N.TerminalNewDropdownContext = new N("TerminalNewDropdownContext"), N.TerminalTabContext = new N("TerminalTabContext"), N.TerminalTabEmptyAreaContext = new N("TerminalTabEmptyAreaContext"), N.TerminalStickyScrollContext = new N("TerminalStickyScrollContext"), N.WebviewContext = new N("WebviewContext"), N.InlineCompletionsActions = new N("InlineCompletionsActions"), N.InlineEditsActions = new N("InlineEditsActions"), N.InlineEditActions = new N("InlineEditActions"), N.NewFile = new N("NewFile"), N.MergeInput1Toolbar = new N("MergeToolbar1Toolbar"), N.MergeInput2Toolbar = new N("MergeToolbar2Toolbar"), N.MergeBaseToolbar = new N("MergeBaseToolbar"), N.MergeInputResultToolbar = new N("MergeToolbarResultToolbar"), N.InlineSuggestionToolbar = new N("InlineSuggestionToolbar"), N.InlineEditToolbar = new N("InlineEditToolbar"), N.ChatContext = new N("ChatContext"), N.ChatCodeBlock = new N("ChatCodeblock"), N.ChatCompareBlock = new N("ChatCompareBlock"), N.ChatMessageTitle = new N("ChatMessageTitle"), N.ChatExecute = new N("ChatExecute"), N.ChatExecuteSecondary = new N("ChatExecuteSecondary"), N.ChatInputSide = new N("ChatInputSide"), N.AccessibleView = new N("AccessibleView"), N.MultiDiffEditorFileToolbar = new N("MultiDiffEditorFileToolbar"), N.DiffEditorHunkToolbar = new N("DiffEditorHunkToolbar"), N.DiffEditorSelectionToolbar = new N("DiffEditorSelectionToolbar"); +let pe = N; +const Oo = $e("menuService"), xy = class xy { static for(e) { let t = this._all.get(e); - return t || (t = new pw(e), this._all.set(e, t)), t; + return t || (t = new xy(e), this._all.set(e, t)), t; } static merge(e) { const t = /* @__PURE__ */ new Set(); for (const i of e) - i instanceof pw && t.add(i.id); + i instanceof xy && t.add(i.id); return t; } constructor(e) { this.id = e, this.has = (t) => t === e; } }; -pw._all = /* @__PURE__ */ new Map(); -let Tu = pw; -const nn = new class { +xy._all = /* @__PURE__ */ new Map(); +let Ju = xy; +const sn = new class { constructor() { - this._commands = /* @__PURE__ */ new Map(), this._menuItems = /* @__PURE__ */ new Map(), this._onDidChangeMenu = new x6({ - merge: Tu.merge + this._commands = /* @__PURE__ */ new Map(), this._menuItems = /* @__PURE__ */ new Map(), this._onDidChangeMenu = new gq({ + merge: Ju.merge }), this.onDidChangeMenu = this._onDidChangeMenu.event; } addCommand(s) { - return this._commands.set(s.id, s), this._onDidChangeMenu.fire(Tu.for(pe.CommandPalette)), Ce(() => { - this._commands.delete(s.id) && this._onDidChangeMenu.fire(Tu.for(pe.CommandPalette)); + return this._commands.set(s.id, s), this._onDidChangeMenu.fire(Ju.for(pe.CommandPalette)), We(() => { + this._commands.delete(s.id) && this._onDidChangeMenu.fire(Ju.for(pe.CommandPalette)); }); } getCommand(s) { @@ -7829,14 +7829,14 @@ const nn = new class { } appendMenuItem(s, e) { let t = this._menuItems.get(s); - t || (t = new cs(), this._menuItems.set(s, t)); + t || (t = new hs(), this._menuItems.set(s, t)); const i = t.push(e); - return this._onDidChangeMenu.fire(Tu.for(s)), Ce(() => { - i(), this._onDidChangeMenu.fire(Tu.for(s)); + return this._onDidChangeMenu.fire(Ju.for(s)), We(() => { + i(), this._onDidChangeMenu.fire(Ju.for(s)); }); } appendMenuItems(s) { - const e = new U(); + const e = new _(); for (const { id: t, item: i } of s) e.add(this.appendMenuItem(t, i)); return e; @@ -7848,30 +7848,30 @@ const nn = new class { _appendImplicitItems(s) { const e = /* @__PURE__ */ new Set(); for (const t of s) - Cf(t) && (e.add(t.command.id), t.alt && e.add(t.alt.id)); + Sg(t) && (e.add(t.command.id), t.alt && e.add(t.alt.id)); this._commands.forEach((t, i) => { e.has(i) || s.push({ command: t }); }); } }(); -class Sf extends ab { +class xg extends bZ { constructor(e, t, i) { super(`submenuitem.${e.submenu.id}`, typeof e.title == "string" ? e.title : e.title.value, i, "submenu"), this.item = e, this.hideActions = t; } } -let ao = pL = class { +let ho = NX = class { static label(e, t) { return t != null && t.renderShortTitle && e.shortTitle ? typeof e.shortTitle == "string" ? e.shortTitle : e.shortTitle.value : typeof e.title == "string" ? e.title : e.title.value; } - constructor(e, t, i, n, o, r, l) { - var c; - this.hideActions = n, this.menuKeybinding = o, this._commandService = l, this.id = e.id, this.label = pL.label(e, i), this.tooltip = (typeof e.tooltip == "string" ? e.tooltip : (c = e.tooltip) == null ? void 0 : c.value) ?? "", this.enabled = !e.precondition || r.contextMatchesRules(e.precondition), this.checked = void 0; - let a; + constructor(e, t, i, n, o, l, r) { + var d; + this.hideActions = n, this.menuKeybinding = o, this._commandService = r, this.id = e.id, this.label = NX.label(e, i), this.tooltip = (typeof e.tooltip == "string" ? e.tooltip : (d = e.tooltip) == null ? void 0 : d.value) ?? "", this.enabled = !e.precondition || l.contextMatchesRules(e.precondition), this.checked = void 0; + let c; if (e.toggled) { - const d = e.toggled.condition ? e.toggled : { condition: e.toggled }; - this.checked = r.contextMatchesRules(d.condition), this.checked && d.tooltip && (this.tooltip = typeof d.tooltip == "string" ? d.tooltip : d.tooltip.value), this.checked && Ze.isThemeIcon(d.icon) && (a = d.icon), this.checked && d.title && (this.label = typeof d.title == "string" ? d.title : d.title.value); + const a = e.toggled.condition ? e.toggled : { condition: e.toggled }; + this.checked = l.contextMatchesRules(a.condition), this.checked && a.tooltip && (this.tooltip = typeof a.tooltip == "string" ? a.tooltip : a.tooltip.value), this.checked && Se.isThemeIcon(a.icon) && (c = a.icon), this.checked && a.title && (this.label = typeof a.title == "string" ? a.title : a.title.value); } - a || (a = Ze.isThemeIcon(e.icon) ? e.icon : void 0), this.item = e, this.alt = t ? new pL(t, void 0, i, n, void 0, r, l) : void 0, this._options = i, this.class = a && Ze.asClassName(a); + c || (c = Se.isThemeIcon(e.icon) ? e.icon : void 0), this.item = e, this.alt = t ? new NX(t, void 0, i, n, void 0, l, r) : void 0, this._options = i, this.class = c && Se.asClassName(c); } run(...e) { var i, n; @@ -7879,54 +7879,54 @@ let ao = pL = class { return (i = this._options) != null && i.arg && (t = [...t, this._options.arg]), (n = this._options) != null && n.shouldForwardArgs && (t = [...t, ...e]), this._commandService.executeCommand(this.id, ...t); } }; -ao = pL = D$([ - aF(5, _e), - aF(6, Qt) -], ao); -class Ss { +ho = NX = Iee([ + MD(5, xe), + MD(6, Ot) +], ho); +class Vs { constructor(e) { this.desc = e; } } function kt(s) { - const e = [], t = new s(), { f1: i, menu: n, keybinding: o, ...r } = t.desc; - if (st.getCommand(r.id)) - throw new Error(`Cannot register two commands with the same id: ${r.id}`); + const e = [], t = new s(), { f1: i, menu: n, keybinding: o, ...l } = t.desc; + if (st.getCommand(l.id)) + throw new Error(`Cannot register two commands with the same id: ${l.id}`); if (e.push(st.registerCommand({ - id: r.id, - handler: (l, ...a) => t.run(l, ...a), - metadata: r.metadata + id: l.id, + handler: (r, ...c) => t.run(r, ...c), + metadata: l.metadata })), Array.isArray(n)) - for (const l of n) - e.push(nn.appendMenuItem(l.id, { command: { ...r, precondition: l.precondition === null ? void 0 : r.precondition }, ...l })); - else n && e.push(nn.appendMenuItem(n.id, { command: { ...r, precondition: n.precondition === null ? void 0 : r.precondition }, ...n })); - if (i && (e.push(nn.appendMenuItem(pe.CommandPalette, { command: r, when: r.precondition })), e.push(nn.addCommand(r))), Array.isArray(o)) - for (const l of o) - e.push(ws.registerKeybindingRule({ - ...l, - id: r.id, - when: r.precondition ? H.and(r.precondition, l.when) : l.when + for (const r of n) + e.push(sn.appendMenuItem(r.id, { command: { ...l, precondition: r.precondition === null ? void 0 : l.precondition }, ...r })); + else n && e.push(sn.appendMenuItem(n.id, { command: { ...l, precondition: n.precondition === null ? void 0 : l.precondition }, ...n })); + if (i && (e.push(sn.appendMenuItem(pe.CommandPalette, { command: l, when: l.precondition })), e.push(sn.addCommand(l))), Array.isArray(o)) + for (const r of o) + e.push(Gs.registerKeybindingRule({ + ...r, + id: l.id, + when: l.precondition ? P.and(l.precondition, r.when) : r.when })); - else o && e.push(ws.registerKeybindingRule({ + else o && e.push(Gs.registerKeybindingRule({ ...o, - id: r.id, - when: r.precondition ? H.and(r.precondition, o.when) : o.when + id: l.id, + when: l.precondition ? P.and(l.precondition, o.when) : o.when })); return { dispose() { - Wt(e); + Nt(e); } }; } -const Ls = $e("telemetryService"), Xn = $e("logService"); -var vs; +const Ls = $e("telemetryService"), Fn = $e("logService"); +var Ms; (function(s) { s[s.Off = 0] = "Off", s[s.Trace = 1] = "Trace", s[s.Debug = 2] = "Debug", s[s.Info = 3] = "Info", s[s.Warning = 4] = "Warning", s[s.Error = 5] = "Error"; -})(vs || (vs = {})); -const gJ = vs.Info; -class mJ extends R { +})(Ms || (Ms = {})); +const QB = Ms.Info; +class OB extends J { constructor() { - super(...arguments), this.level = gJ, this._onDidChangeLogLevel = this._register(new k()), this.onDidChangeLogLevel = this._onDidChangeLogLevel.event; + super(...arguments), this.level = QB, this._onDidChangeLogLevel = this._register(new k()), this.onDidChangeLogLevel = this._onDidChangeLogLevel.event; } setLevel(e) { this.level !== e && (this.level = e, this._onDidChangeLogLevel.fire(this.level)); @@ -7935,30 +7935,30 @@ class mJ extends R { return this.level; } checkLogLevel(e) { - return this.level !== vs.Off && this.level <= e; + return this.level !== Ms.Off && this.level <= e; } } -class k$ extends mJ { - constructor(e = gJ, t = !0) { +class xee extends OB { + constructor(e = QB, t = !0) { super(), this.useColors = t, this.setLevel(e); } trace(e, ...t) { - this.checkLogLevel(vs.Trace) && (this.useColors ? console.log("%cTRACE", "color: #888", e, ...t) : console.log(e, ...t)); + this.checkLogLevel(Ms.Trace) && (this.useColors ? console.log("%cTRACE", "color: #888", e, ...t) : console.log(e, ...t)); } debug(e, ...t) { - this.checkLogLevel(vs.Debug) && (this.useColors ? console.log("%cDEBUG", "background: #eee; color: #888", e, ...t) : console.log(e, ...t)); + this.checkLogLevel(Ms.Debug) && (this.useColors ? console.log("%cDEBUG", "background: #eee; color: #888", e, ...t) : console.log(e, ...t)); } info(e, ...t) { - this.checkLogLevel(vs.Info) && (this.useColors ? console.log("%c INFO", "color: #33f", e, ...t) : console.log(e, ...t)); + this.checkLogLevel(Ms.Info) && (this.useColors ? console.log("%c INFO", "color: #33f", e, ...t) : console.log(e, ...t)); } warn(e, ...t) { - this.checkLogLevel(vs.Warning) && (this.useColors ? console.log("%c WARN", "color: #993", e, ...t) : console.log(e, ...t)); + this.checkLogLevel(Ms.Warning) && (this.useColors ? console.log("%c WARN", "color: #993", e, ...t) : console.log(e, ...t)); } error(e, ...t) { - this.checkLogLevel(vs.Error) && (this.useColors ? console.log("%c ERR", "color: #f33", e, ...t) : console.error(e, ...t)); + this.checkLogLevel(Ms.Error) && (this.useColors ? console.log("%c ERR", "color: #f33", e, ...t) : console.error(e, ...t)); } } -class G$ extends mJ { +class Cee extends OB { constructor(e) { super(), this.loggers = e, e.length && this.setLevel(e[0].getLevel()); } @@ -7993,24 +7993,24 @@ class G$ extends mJ { super.dispose(); } } -function R$(s) { +function Ree(s) { switch (s) { - case vs.Trace: + case Ms.Trace: return "trace"; - case vs.Debug: + case Ms.Debug: return "debug"; - case vs.Info: + case Ms.Info: return "info"; - case vs.Warning: + case Ms.Warning: return "warn"; - case vs.Error: + case Ms.Error: return "error"; - case vs.Off: + case Ms.Off: return "off"; } } -new ae("logLevel", R$(vs.Info)); -let O_ = class { +new ce("logLevel", Ree(Ms.Info)); +let lx = class { constructor(e) { this.id = e.id, this.precondition = e.precondition, this._kbOpts = e.kbOpts, this._menuOpts = e.menuOpts, this.metadata = e.metadata; } @@ -8019,7 +8019,7 @@ let O_ = class { const e = Array.isArray(this._kbOpts) ? this._kbOpts : [this._kbOpts]; for (const t of e) { let i = t.kbExpr; - this.precondition && (i ? i = H.and(i, this.precondition) : i = this.precondition); + this.precondition && (i ? i = P.and(i, this.precondition) : i = this.precondition); const n = { id: this.id, weight: t.weight, @@ -8031,7 +8031,7 @@ let O_ = class { linux: t.linux, mac: t.mac }; - ws.registerKeybindingRule(n); + Gs.registerKeybindingRule(n); } } st.registerCommand({ @@ -8041,7 +8041,7 @@ let O_ = class { }); } _registerMenuItem(e) { - nn.appendMenuItem(e.menuId, { + sn.appendMenuItem(e.menuId, { group: e.group, command: { id: this.id, @@ -8054,7 +8054,7 @@ let O_ = class { }); } }; -class qb extends O_ { +class s0 extends lx { constructor() { super(...arguments), this._implementations = []; } @@ -8062,7 +8062,7 @@ class qb extends O_ { * A higher priority gets to be looked at first */ addImplementation(e, t, i, n) { - return this._implementations.push({ priority: e, name: t, implementation: i, when: n }), this._implementations.sort((o, r) => r.priority - o.priority), { + return this._implementations.push({ priority: e, name: t, implementation: i, when: n }), this._implementations.sort((o, l) => l.priority - o.priority), { dispose: () => { for (let o = 0; o < this._implementations.length; o++) if (this._implementations[o].implementation === i) { @@ -8073,22 +8073,22 @@ class qb extends O_ { }; } runCommand(e, t) { - const i = e.get(Xn), n = e.get(_e); + const i = e.get(Fn), n = e.get(xe); i.trace(`Executing Command '${this.id}' which has ${this._implementations.length} bound.`); for (const o of this._implementations) { if (o.when) { - const l = n.getContext(_n()); - if (!o.when.evaluate(l)) + const r = n.getContext(Cn()); + if (!o.when.evaluate(r)) continue; } - const r = o.implementation(e, t); - if (r) - return i.trace(`Command '${this.id}' was handled by '${o.name}'.`), typeof r == "boolean" ? void 0 : r; + const l = o.implementation(e, t); + if (l) + return i.trace(`Command '${this.id}' was handled by '${o.name}'.`), typeof l == "boolean" ? void 0 : l; } i.trace(`The Command '${this.id}' was not handled by any implementation.`); } } -class pJ extends O_ { +class jB extends lx { constructor(e, t) { super(t), this.command = e; } @@ -8096,39 +8096,39 @@ class pJ extends O_ { return this.command.runCommand(e, t); } } -class zi extends O_ { +class Ai extends lx { /** * Create a command class that is bound to a certain editor contribution. */ static bindToContribution(e) { - return class extends zi { + return class extends Ai { constructor(i) { super(i), this._callback = i.handler; } runEditorCommand(i, n, o) { - const r = e(n); - r && this._callback(r, o); + const l = e(n); + l && this._callback(l, o); } }; } static runEditorCommand(e, t, i, n) { - const o = e.get(ft), r = o.getFocusedCodeEditor() || o.getActiveCodeEditor(); - if (r) - return r.invokeWithinContext((l) => { - if (l.get(_e).contextMatchesRules(i ?? void 0)) - return n(l, r, t); + const o = e.get(gt), l = o.getFocusedCodeEditor() || o.getActiveCodeEditor(); + if (l) + return l.invokeWithinContext((r) => { + if (r.get(xe).contextMatchesRules(i ?? void 0)) + return n(r, l, t); }); } runCommand(e, t) { - return zi.runEditorCommand(e, t, this.precondition, (i, n, o) => this.runEditorCommand(i, n, o)); + return Ai.runEditorCommand(e, t, this.precondition, (i, n, o) => this.runEditorCommand(i, n, o)); } } -class he extends zi { +class he extends Ai { static convertOptions(e) { let t; Array.isArray(e.menuOpts) ? t = e.menuOpts : e.menuOpts ? t = [e.menuOpts] : t = []; function i(n) { - return n.menuId || (n.menuId = pe.EditorContext), n.title || (n.title = e.label), n.when = H.and(e.precondition, n.when), n; + return n.menuId || (n.menuId = pe.EditorContext), n.title || (n.title = e.label), n.when = P.and(e.precondition, n.when), n; } return Array.isArray(e.contextMenuOpts) ? t.push(...e.contextMenuOpts.map(i)) : e.contextMenuOpts && t.push(i(e.contextMenuOpts)), e.menuOpts = t, e; } @@ -8142,7 +8142,7 @@ class he extends zi { e.get(Ls).publicLog2("editorActionInvoked", { name: this.label, id: this.id }); } } -class fJ extends he { +class qB extends he { constructor() { super(...arguments), this._implementations = []; } @@ -8168,84 +8168,84 @@ class fJ extends he { } } } -class Rl extends Ss { +class Fr extends Vs { run(e, ...t) { - const i = e.get(ft), n = i.getFocusedCodeEditor() || i.getActiveCodeEditor(); + const i = e.get(gt), n = i.getFocusedCodeEditor() || i.getActiveCodeEditor(); if (n) return n.invokeWithinContext((o) => { - var c; - const r = o.get(_e), l = o.get(Xn); - if (!r.contextMatchesRules(this.desc.precondition ?? void 0)) { - l.debug("[EditorAction2] NOT running command because its precondition is FALSE", this.desc.id, (c = this.desc.precondition) == null ? void 0 : c.serialize()); + var d; + const l = o.get(xe), r = o.get(Fn); + if (!l.contextMatchesRules(this.desc.precondition ?? void 0)) { + r.debug("[EditorAction2] NOT running command because its precondition is FALSE", this.desc.id, (d = this.desc.precondition) == null ? void 0 : d.serialize()); return; } return this.runEditorCommand(o, n, ...t); }); } } -function zs(s, e) { +function Ks(s, e) { st.registerCommand(s, function(t, ...i) { - const n = t.get(Se), [o, r] = i; - ht(Le.isUri(o)), ht(V.isIPosition(r)); - const l = t.get(Pt).getModel(o); - if (l) { - const a = V.lift(r); - return n.invokeFunction(e, l, a, ...i.slice(2)); + const n = t.get(Ge), [o, l] = i; + ht(Xe.isUri(o)), ht(Y.isIPosition(l)); + const r = t.get(At).getModel(o); + if (r) { + const c = Y.lift(l); + return n.invokeFunction(e, r, c, ...i.slice(2)); } - return t.get(Ys).createModelReference(o).then((a) => new Promise((c, d) => { + return t.get(As).createModelReference(o).then((c) => new Promise((d, a) => { try { - const h = n.invokeFunction(e, a.object.textEditorModel, V.lift(r), i.slice(2)); - c(h); - } catch (h) { + const h = n.invokeFunction(e, c.object.textEditorModel, Y.lift(l), i.slice(2)); d(h); + } catch (h) { + a(h); } }).finally(() => { - a.dispose(); + c.dispose(); })); }); } function oe(s) { - return rr.INSTANCE.registerEditorCommand(s), s; + return cl.INSTANCE.registerEditorCommand(s), s; } function ee(s) { const e = new s(); - return rr.INSTANCE.registerEditorAction(e), e; + return cl.INSTANCE.registerEditorAction(e), e; } -function bJ(s) { - return rr.INSTANCE.registerEditorAction(s), s; +function $B(s) { + return cl.INSTANCE.registerEditorAction(s), s; } -function E$(s) { - rr.INSTANCE.registerEditorAction(s); +function Nee(s) { + cl.INSTANCE.registerEditorAction(s); } -function gt(s, e, t) { - rr.INSTANCE.registerEditorContribution(s, e, t); +function mt(s, e, t) { + cl.INSTANCE.registerEditorContribution(s, e, t); } -var rg; +var hm; (function(s) { - function e(r) { - return rr.INSTANCE.getEditorCommand(r); + function e(l) { + return cl.INSTANCE.getEditorCommand(l); } s.getEditorCommand = e; function t() { - return rr.INSTANCE.getEditorActions(); + return cl.INSTANCE.getEditorActions(); } s.getEditorActions = t; function i() { - return rr.INSTANCE.getEditorContributions(); + return cl.INSTANCE.getEditorContributions(); } s.getEditorContributions = i; - function n(r) { - return rr.INSTANCE.getEditorContributions().filter((l) => r.indexOf(l.id) >= 0); + function n(l) { + return cl.INSTANCE.getEditorContributions().filter((r) => l.indexOf(r.id) >= 0); } s.getSomeEditorContributions = n; function o() { - return rr.INSTANCE.getDiffEditorContributions(); + return cl.INSTANCE.getDiffEditorContributions(); } s.getDiffEditorContributions = o; -})(rg || (rg = {})); -const X$ = { +})(hm || (hm = {})); +const wee = { EditorCommonContributions: "editor.contributions" -}, nZ = class nZ { +}, f2 = class f2 { constructor() { this.editorContributions = [], this.diffEditorContributions = [], this.editorActions = [], this.editorCommands = /* @__PURE__ */ Object.create(null); } @@ -8271,13 +8271,13 @@ const X$ = { return this.editorCommands[e] || null; } }; -nZ.INSTANCE = new nZ(); -let rr = nZ; -Di.add(X$.EditorCommonContributions, rr.INSTANCE); -function gC(s) { +f2.INSTANCE = new f2(); +let cl = f2; +ki.add(wee.EditorCommonContributions, cl.INSTANCE); +function SG(s) { return s.register(), s; } -const yJ = gC(new qb({ +const e_ = SG(new s0({ id: "undo", precondition: void 0, kbOpts: { @@ -8297,8 +8297,8 @@ const yJ = gC(new qb({ order: 1 }] })); -gC(new pJ(yJ, { id: "default:undo", precondition: void 0 })); -const wJ = gC(new qb({ +SG(new jB(e_, { id: "default:undo", precondition: void 0 })); +const t_ = SG(new s0({ id: "redo", precondition: void 0, kbOpts: { @@ -8325,8 +8325,8 @@ const wJ = gC(new qb({ order: 1 }] })); -gC(new pJ(wJ, { id: "default:redo", precondition: void 0 })); -const F$ = gC(new qb({ +SG(new jB(t_, { id: "default:redo", precondition: void 0 })); +const Tee = SG(new s0({ id: "editor.action.selectAll", precondition: void 0, kbOpts: { @@ -8347,7 +8347,7 @@ const F$ = gC(new qb({ order: 1 }] })); -let M = class an { +let I = class dn { constructor(e, t, i, n) { e > i || e === i && t > n ? (this.startLineNumber = i, this.startColumn = n, this.endLineNumber = e, this.endColumn = t) : (this.startLineNumber = e, this.startColumn = t, this.endLineNumber = i, this.endColumn = n); } @@ -8355,7 +8355,7 @@ let M = class an { * Test if this range is empty. */ isEmpty() { - return an.isEmpty(this); + return dn.isEmpty(this); } /** * Test if `range` is empty. @@ -8367,7 +8367,7 @@ let M = class an { * Test if position is in this range. If the position is at the edges, will return true. */ containsPosition(e) { - return an.containsPosition(this, e); + return dn.containsPosition(this, e); } /** * Test if `position` is in `range`. If the position is at the edges, will return true. @@ -8386,7 +8386,7 @@ let M = class an { * Test if range is in this range. If the range is equal to this range, will return true. */ containsRange(e) { - return an.containsRange(this, e); + return dn.containsRange(this, e); } /** * Test if `otherRange` is in `range`. If the ranges are equal, will return true. @@ -8398,7 +8398,7 @@ let M = class an { * Test if `range` is strictly in this range. `range` must start after and end before this range for the result to be true. */ strictContainsRange(e) { - return an.strictContainsRange(this, e); + return dn.strictContainsRange(this, e); } /** * Test if `otherRange` is strictly in `range` (must start after, and end before). If the ranges are equal, will return false. @@ -8411,35 +8411,35 @@ let M = class an { * The smallest position will be used as the start point, and the largest one as the end point. */ plusRange(e) { - return an.plusRange(this, e); + return dn.plusRange(this, e); } /** * A reunion of the two ranges. * The smallest position will be used as the start point, and the largest one as the end point. */ static plusRange(e, t) { - let i, n, o, r; - return t.startLineNumber < e.startLineNumber ? (i = t.startLineNumber, n = t.startColumn) : t.startLineNumber === e.startLineNumber ? (i = t.startLineNumber, n = Math.min(t.startColumn, e.startColumn)) : (i = e.startLineNumber, n = e.startColumn), t.endLineNumber > e.endLineNumber ? (o = t.endLineNumber, r = t.endColumn) : t.endLineNumber === e.endLineNumber ? (o = t.endLineNumber, r = Math.max(t.endColumn, e.endColumn)) : (o = e.endLineNumber, r = e.endColumn), new an(i, n, o, r); + let i, n, o, l; + return t.startLineNumber < e.startLineNumber ? (i = t.startLineNumber, n = t.startColumn) : t.startLineNumber === e.startLineNumber ? (i = t.startLineNumber, n = Math.min(t.startColumn, e.startColumn)) : (i = e.startLineNumber, n = e.startColumn), t.endLineNumber > e.endLineNumber ? (o = t.endLineNumber, l = t.endColumn) : t.endLineNumber === e.endLineNumber ? (o = t.endLineNumber, l = Math.max(t.endColumn, e.endColumn)) : (o = e.endLineNumber, l = e.endColumn), new dn(i, n, o, l); } /** * A intersection of the two ranges. */ intersectRanges(e) { - return an.intersectRanges(this, e); + return dn.intersectRanges(this, e); } /** * A intersection of the two ranges. */ static intersectRanges(e, t) { - let i = e.startLineNumber, n = e.startColumn, o = e.endLineNumber, r = e.endColumn; - const l = t.startLineNumber, a = t.startColumn, c = t.endLineNumber, d = t.endColumn; - return i < l ? (i = l, n = a) : i === l && (n = Math.max(n, a)), o > c ? (o = c, r = d) : o === c && (r = Math.min(r, d)), i > o || i === o && n > r ? null : new an(i, n, o, r); + let i = e.startLineNumber, n = e.startColumn, o = e.endLineNumber, l = e.endColumn; + const r = t.startLineNumber, c = t.startColumn, d = t.endLineNumber, a = t.endColumn; + return i < r ? (i = r, n = c) : i === r && (n = Math.max(n, c)), o > d ? (o = d, l = a) : o === d && (l = Math.min(l, a)), i > o || i === o && n > l ? null : new dn(i, n, o, l); } /** * Test if this range equals other. */ equalsRange(e) { - return an.equalsRange(this, e); + return dn.equalsRange(this, e); } /** * Test if range `a` equals `b`. @@ -8451,25 +8451,25 @@ let M = class an { * Return the end position (which will be after or equal to the start position) */ getEndPosition() { - return an.getEndPosition(this); + return dn.getEndPosition(this); } /** * Return the end position (which will be after or equal to the start position) */ static getEndPosition(e) { - return new V(e.endLineNumber, e.endColumn); + return new Y(e.endLineNumber, e.endColumn); } /** * Return the start position (which will be before or equal to the end position) */ getStartPosition() { - return an.getStartPosition(this); + return dn.getStartPosition(this); } /** * Return the start position (which will be before or equal to the end position) */ static getStartPosition(e) { - return new V(e.startLineNumber, e.startColumn); + return new Y(e.startLineNumber, e.startColumn); } /** * Transform to a user presentable string representation. @@ -8481,50 +8481,50 @@ let M = class an { * Create a new range using this range's start position, and using endLineNumber and endColumn as the end position. */ setEndPosition(e, t) { - return new an(this.startLineNumber, this.startColumn, e, t); + return new dn(this.startLineNumber, this.startColumn, e, t); } /** * Create a new range using this range's end position, and using startLineNumber and startColumn as the start position. */ setStartPosition(e, t) { - return new an(e, t, this.endLineNumber, this.endColumn); + return new dn(e, t, this.endLineNumber, this.endColumn); } /** * Create a new empty range using this range's start position. */ collapseToStart() { - return an.collapseToStart(this); + return dn.collapseToStart(this); } /** * Create a new empty range using this range's start position. */ static collapseToStart(e) { - return new an(e.startLineNumber, e.startColumn, e.startLineNumber, e.startColumn); + return new dn(e.startLineNumber, e.startColumn, e.startLineNumber, e.startColumn); } /** * Create a new empty range using this range's end position. */ collapseToEnd() { - return an.collapseToEnd(this); + return dn.collapseToEnd(this); } /** * Create a new empty range using this range's end position. */ static collapseToEnd(e) { - return new an(e.endLineNumber, e.endColumn, e.endLineNumber, e.endColumn); + return new dn(e.endLineNumber, e.endColumn, e.endLineNumber, e.endColumn); } /** * Moves the range by the given amount of lines. */ delta(e) { - return new an(this.startLineNumber + e, this.startColumn, this.endLineNumber + e, this.endColumn); + return new dn(this.startLineNumber + e, this.startColumn, this.endLineNumber + e, this.endColumn); } // --- static fromPositions(e, t = e) { - return new an(e.lineNumber, e.column, t.lineNumber, t.column); + return new dn(e.lineNumber, e.column, t.lineNumber, t.column); } static lift(e) { - return e ? new an(e.startLineNumber, e.startColumn, e.endLineNumber, e.endColumn) : null; + return e ? new dn(e.startLineNumber, e.startColumn, e.endLineNumber, e.endColumn) : null; } /** * Test if `obj` is an `IRange`. @@ -8550,20 +8550,20 @@ let M = class an { */ static compareRangesUsingStarts(e, t) { if (e && t) { - const o = e.startLineNumber | 0, r = t.startLineNumber | 0; - if (o === r) { - const l = e.startColumn | 0, a = t.startColumn | 0; - if (l === a) { - const c = e.endLineNumber | 0, d = t.endLineNumber | 0; - if (c === d) { + const o = e.startLineNumber | 0, l = t.startLineNumber | 0; + if (o === l) { + const r = e.startColumn | 0, c = t.startColumn | 0; + if (r === c) { + const d = e.endLineNumber | 0, a = t.endLineNumber | 0; + if (d === a) { const h = e.endColumn | 0, u = t.endColumn | 0; return h - u; } - return c - d; + return d - a; } - return l - a; + return r - c; } - return o - r; + return o - l; } return (e ? 1 : 0) - (t ? 1 : 0); } @@ -8583,7 +8583,7 @@ let M = class an { toJSON() { return this; } -}, fe = class _r extends M { +}, ge = class Nl extends I { constructor(e, t, i, n) { super(e, t, i, n), this.selectionStartLineNumber = e, this.selectionStartColumn = t, this.positionLineNumber = i, this.positionColumn = n; } @@ -8597,7 +8597,7 @@ let M = class an { * Test if equals other selection. */ equalsSelection(e) { - return _r.selectionsEqual(this, e); + return Nl.selectionsEqual(this, e); } /** * Test if the two selections are equal. @@ -8615,44 +8615,44 @@ let M = class an { * Create a new selection with a different `positionLineNumber` and `positionColumn`. */ setEndPosition(e, t) { - return this.getDirection() === 0 ? new _r(this.startLineNumber, this.startColumn, e, t) : new _r(e, t, this.startLineNumber, this.startColumn); + return this.getDirection() === 0 ? new Nl(this.startLineNumber, this.startColumn, e, t) : new Nl(e, t, this.startLineNumber, this.startColumn); } /** * Get the position at `positionLineNumber` and `positionColumn`. */ getPosition() { - return new V(this.positionLineNumber, this.positionColumn); + return new Y(this.positionLineNumber, this.positionColumn); } /** * Get the position at the start of the selection. */ getSelectionStart() { - return new V(this.selectionStartLineNumber, this.selectionStartColumn); + return new Y(this.selectionStartLineNumber, this.selectionStartColumn); } /** * Create a new selection with a different `selectionStartLineNumber` and `selectionStartColumn`. */ setStartPosition(e, t) { - return this.getDirection() === 0 ? new _r(e, t, this.endLineNumber, this.endColumn) : new _r(this.endLineNumber, this.endColumn, e, t); + return this.getDirection() === 0 ? new Nl(e, t, this.endLineNumber, this.endColumn) : new Nl(this.endLineNumber, this.endColumn, e, t); } // ---- /** * Create a `Selection` from one or two positions */ static fromPositions(e, t = e) { - return new _r(e.lineNumber, e.column, t.lineNumber, t.column); + return new Nl(e.lineNumber, e.column, t.lineNumber, t.column); } /** * Creates a `Selection` from a range, given a direction. */ static fromRange(e, t) { - return t === 0 ? new _r(e.startLineNumber, e.startColumn, e.endLineNumber, e.endColumn) : new _r(e.endLineNumber, e.endColumn, e.startLineNumber, e.startColumn); + return t === 0 ? new Nl(e.startLineNumber, e.startColumn, e.endLineNumber, e.endColumn) : new Nl(e.endLineNumber, e.endColumn, e.startLineNumber, e.startColumn); } /** * Create a `Selection` from an `ISelection`. */ static liftSelection(e) { - return new _r(e.selectionStartLineNumber, e.selectionStartColumn, e.positionLineNumber, e.positionColumn); + return new Nl(e.selectionStartLineNumber, e.selectionStartColumn, e.positionLineNumber, e.positionColumn); } /** * `a` equals `b`. @@ -8679,22 +8679,22 @@ let M = class an { * Create with a direction. */ static createWithDirection(e, t, i, n, o) { - return o === 0 ? new _r(e, t, i, n) : new _r(i, n, e, t); + return o === 0 ? new Nl(e, t, i, n) : new Nl(i, n, e, t); } }; -function qu(s, e) { +function nm(s, e) { const t = s.getCount(), i = s.findTokenIndexAtOffset(e), n = s.getLanguageId(i); let o = i; for (; o + 1 < t && s.getLanguageId(o + 1) === n; ) o++; - let r = i; - for (; r > 0 && s.getLanguageId(r - 1) === n; ) - r--; - return new Y$(s, n, r, o + 1, s.getStartOffset(r), s.getEndOffset(o)); + let l = i; + for (; l > 0 && s.getLanguageId(l - 1) === n; ) + l--; + return new Mee(s, n, l, o + 1, s.getStartOffset(l), s.getEndOffset(o)); } -class Y$ { - constructor(e, t, i, n, o, r) { - this._scopedLineTokensBrand = void 0, this._actual = e, this.languageId = t, this._firstTokenIndex = i, this._lastTokenIndex = n, this.firstCharOffset = o, this._lastCharOffset = r, this.languageIdCodec = e.languageIdCodec; +class Mee { + constructor(e, t, i, n, o, l) { + this._scopedLineTokensBrand = void 0, this._actual = e, this.languageId = t, this._firstTokenIndex = i, this._lastTokenIndex = n, this.firstCharOffset = o, this._lastCharOffset = l, this.languageIdCodec = e.languageIdCodec; } getLineContent() { return this._actual.getLineContent().substring(this.firstCharOffset, this._lastCharOffset); @@ -8718,25 +8718,25 @@ class Y$ { return this._actual.sliceAndInflate(this.firstCharOffset, this._lastCharOffset, 0); } } -function jl(s) { +function tc(s) { return (s & 3) !== 0; } -class Yi { +class zi { static _nextVisibleColumn(e, t, i) { - return e === 9 ? Yi.nextRenderTabStop(t, i) : Nh(e) || oE(e) ? t + 2 : t + 1; + return e === 9 ? zi.nextRenderTabStop(t, i) : Mh(e) || Nv(e) ? t + 2 : t + 1; } /** * Returns a visible column from a column. * @see {@link CursorColumns} */ static visibleColumnFromColumn(e, t, i) { - const n = Math.min(t - 1, e.length), o = e.substring(0, n), r = new iA(o); - let l = 0; - for (; !r.eol(); ) { - const a = tA(o, n, r.offset); - r.nextGraphemeLength(), l = this._nextVisibleColumn(a, l, i); + const n = Math.min(t - 1, e.length), o = e.substring(0, n), l = new ZV(o); + let r = 0; + for (; !l.eol(); ) { + const c = gV(o, n, l.offset); + l.nextGraphemeLength(), r = this._nextVisibleColumn(c, r, i); } - return l; + return r; } /** * Returns a column from a visible column. @@ -8745,17 +8745,17 @@ class Yi { static columnFromVisibleColumn(e, t, i) { if (t <= 0) return 1; - const n = e.length, o = new iA(e); - let r = 0, l = 1; + const n = e.length, o = new ZV(e); + let l = 0, r = 1; for (; !o.eol(); ) { - const a = tA(e, n, o.offset); + const c = gV(e, n, o.offset); o.nextGraphemeLength(); - const c = this._nextVisibleColumn(a, r, i), d = o.offset + 1; - if (c >= t) { - const h = t - r; - return c - t < h ? d : l; + const d = this._nextVisibleColumn(c, l, i), a = o.offset + 1; + if (d >= t) { + const h = t - l; + return d - t < h ? a : r; } - r = c, l = d; + l = d, r = a; } return n + 1; } @@ -8788,27 +8788,27 @@ class Yi { return Math.max(0, e - 1 - (e - 1) % t); } } -function z$(s, e, t) { +function Yee(s, e, t) { let i = 0; for (let o = 0; o < s.length; o++) - s.charAt(o) === " " ? i = Yi.nextIndentTabStop(i, e) : i++; + s.charAt(o) === " " ? i = zi.nextIndentTabStop(i, e) : i++; let n = ""; if (!t) { const o = Math.floor(i / e); i = i % e; - for (let r = 0; r < o; r++) + for (let l = 0; l < o; l++) n += " "; } for (let o = 0; o < i; o++) n += " "; return n; } -function pE(s, e, t) { - let i = qn(s); - return i === -1 && (i = s.length), z$(s.substring(0, i), e, t) + s.substring(i); +function Dv(s, e, t) { + let i = es(s); + return i === -1 && (i = s.length), Yee(s.substring(0, i), e, t) + s.substring(i); } -const P$ = () => !0, B$ = () => !1, O$ = (s) => s === " " || s === " "; -class np { +const kee = () => !0, vee = () => !1, Jee = (s) => s === " " || s === " "; +class cp { static shouldRecreate(e) { return e.hasChanged( 146 @@ -8862,10 +8862,10 @@ class np { } constructor(e, t, i, n) { this.languageConfigurationService = n, this._cursorMoveConfigurationBrand = void 0, this._languageId = e; - const o = i.options, r = o.get( + const o = i.options, l = o.get( 146 /* EditorOption.layoutInfo */ - ), l = o.get( + ), r = o.get( 50 /* EditorOption.fontInfo */ ); @@ -8875,7 +8875,7 @@ class np { ), this.tabSize = t.tabSize, this.indentSize = t.indentSize, this.insertSpaces = t.insertSpaces, this.stickyTabStops = o.get( 117 /* EditorOption.stickyTabStops */ - ), this.lineHeight = l.lineHeight, this.typicalHalfwidthCharacterWidth = l.typicalHalfwidthCharacterWidth, this.pageSize = Math.max(1, Math.floor(r.height / this.lineHeight) - 2), this.useTabStops = o.get( + ), this.lineHeight = r.lineHeight, this.typicalHalfwidthCharacterWidth = r.typicalHalfwidthCharacterWidth, this.pageSize = Math.max(1, Math.floor(l.height / this.lineHeight) - 2), this.useTabStops = o.get( 129 /* EditorOption.useTabStops */ ), this.wordSeparators = o.get( @@ -8925,12 +8925,12 @@ class np { comment: this._getShouldAutoClose(e, this.autoClosingComments, !1), bracket: this._getShouldAutoClose(e, this.autoClosingBrackets, !1) }, this.autoClosingPairs = this.languageConfigurationService.getLanguageConfiguration(e).getAutoClosingPairs(); - const a = this.languageConfigurationService.getLanguageConfiguration(e).getSurroundingPairs(); - if (a) - for (const d of a) - this.surroundingPairs[d.open] = d.close; - const c = this.languageConfigurationService.getLanguageConfiguration(e).comments; - this.blockCommentStartToken = (c == null ? void 0 : c.blockCommentStartToken) ?? null; + const c = this.languageConfigurationService.getLanguageConfiguration(e).getSurroundingPairs(); + if (c) + for (const a of c) + this.surroundingPairs[a.open] = a.close; + const d = this.languageConfigurationService.getLanguageConfiguration(e).comments; + this.blockCommentStartToken = (d == null ? void 0 : d.blockCommentStartToken) ?? null; } get electricChars() { var e; @@ -8947,22 +8947,22 @@ class np { * Should return opening bracket type to match indentation with */ onElectricCharacter(e, t, i) { - const n = qu(t, i - 1), o = this.languageConfigurationService.getLanguageConfiguration(n.languageId).electricCharacter; + const n = nm(t, i - 1), o = this.languageConfigurationService.getLanguageConfiguration(n.languageId).electricCharacter; return o ? o.onElectricCharacter(e, n, i - n.firstCharOffset) : null; } normalizeIndentation(e) { - return pE(e, this.indentSize, this.insertSpaces); + return Dv(e, this.indentSize, this.insertSpaces); } _getShouldAutoClose(e, t, i) { switch (t) { case "beforeWhitespace": - return O$; + return Jee; case "languageDefined": return this._getLanguageDefinedShouldAutoClose(e, i); case "always": - return P$; + return kee; case "never": - return B$; + return vee; } } _getLanguageDefinedShouldAutoClose(e, t) { @@ -8974,30 +8974,30 @@ class np { * @see {@link CursorColumns} */ visibleColumnFromColumn(e, t) { - return Yi.visibleColumnFromColumn(e.getLineContent(t.lineNumber), t.column, this.tabSize); + return zi.visibleColumnFromColumn(e.getLineContent(t.lineNumber), t.column, this.tabSize); } /** * Returns a visible column from a column. * @see {@link CursorColumns} */ columnFromVisibleColumn(e, t, i) { - const n = Yi.columnFromVisibleColumn(e.getLineContent(t), i, this.tabSize), o = e.getLineMinColumn(t); + const n = zi.columnFromVisibleColumn(e.getLineContent(t), i, this.tabSize), o = e.getLineMinColumn(t); if (n < o) return o; - const r = e.getLineMaxColumn(t); - return n > r ? r : n; + const l = e.getLineMaxColumn(t); + return n > l ? l : n; } } -let dt = class CJ { +let at = class i_ { static fromModelState(e) { - return new H$(e); + return new Hee(e); } static fromViewState(e) { - return new J$(e); + return new Eee(e); } static fromModelSelection(e) { - const t = fe.liftSelection(e), i = new dn(M.fromPositions(t.getSelectionStart()), 0, 0, t.getPosition(), 0); - return CJ.fromModelState(i); + const t = ge.liftSelection(e), i = new hn(I.fromPositions(t.getSelectionStart()), 0, 0, t.getPosition(), 0); + return i_.fromModelState(i); } static fromModelSelections(e) { const t = []; @@ -9012,19 +9012,19 @@ let dt = class CJ { return this.viewState.equals(e.viewState) && this.modelState.equals(e.modelState); } }; -class H$ { +class Hee { constructor(e) { this.modelState = e, this.viewState = null; } } -class J$ { +class Eee { constructor(e) { this.modelState = null, this.viewState = e; } } -class dn { +class hn { constructor(e, t, i, n, o) { - this.selectionStart = e, this.selectionStartKind = t, this.selectionStartLeftoverVisibleColumns = i, this.position = n, this.leftoverVisibleColumns = o, this._singleCursorStateBrand = void 0, this.selection = dn._computeSelection(this.selectionStart, this.position); + this.selectionStart = e, this.selectionStartKind = t, this.selectionStartLeftoverVisibleColumns = i, this.position = n, this.leftoverVisibleColumns = o, this._singleCursorStateBrand = void 0, this.selection = hn._computeSelection(this.selectionStart, this.position); } equals(e) { return this.selectionStartLeftoverVisibleColumns === e.selectionStartLeftoverVisibleColumns && this.leftoverVisibleColumns === e.leftoverVisibleColumns && this.selectionStartKind === e.selectionStartKind && this.position.equals(e.position) && this.selectionStart.equalsRange(e.selectionStart); @@ -9033,65 +9033,65 @@ class dn { return !this.selection.isEmpty() || !this.selectionStart.isEmpty(); } move(e, t, i, n) { - return e ? new dn(this.selectionStart, this.selectionStartKind, this.selectionStartLeftoverVisibleColumns, new V(t, i), n) : new dn(new M(t, i, t, i), 0, n, new V(t, i), n); + return e ? new hn(this.selectionStart, this.selectionStartKind, this.selectionStartLeftoverVisibleColumns, new Y(t, i), n) : new hn(new I(t, i, t, i), 0, n, new Y(t, i), n); } static _computeSelection(e, t) { - return e.isEmpty() || !t.isBeforeOrEqual(e.getStartPosition()) ? fe.fromPositions(e.getStartPosition(), t) : fe.fromPositions(e.getEndPosition(), t); + return e.isEmpty() || !t.isBeforeOrEqual(e.getStartPosition()) ? ge.fromPositions(e.getStartPosition(), t) : ge.fromPositions(e.getEndPosition(), t); } } -class Es { +class Ds { constructor(e, t, i) { this._editOperationResultBrand = void 0, this.type = e, this.commands = t, this.shouldPushStackElementBefore = i.shouldPushStackElementBefore, this.shouldPushStackElementAfter = i.shouldPushStackElementAfter; } } -function vh(s) { +function kh(s) { return s === "'" || s === '"' || s === "`"; } -class Du { - static columnSelect(e, t, i, n, o, r) { - const l = Math.abs(o - i) + 1, a = i > o, c = n > r, d = n < r, h = []; - for (let u = 0; u < l; u++) { - const g = i + (a ? -u : u), m = e.columnFromVisibleColumn(t, g, n), f = e.columnFromVisibleColumn(t, g, r), b = e.visibleColumnFromColumn(t, new V(g, m)), y = e.visibleColumnFromColumn(t, new V(g, f)); - d && (b > r || y < n) || c && (y > n || b < r) || h.push(new dn(new M(g, m, g, m), 0, 0, new V(g, f), 0)); +class Hu { + static columnSelect(e, t, i, n, o, l) { + const r = Math.abs(o - i) + 1, c = i > o, d = n > l, a = n < l, h = []; + for (let u = 0; u < r; u++) { + const m = i + (c ? -u : u), b = e.columnFromVisibleColumn(t, m, n), g = e.columnFromVisibleColumn(t, m, l), Z = e.visibleColumnFromColumn(t, new Y(m, b)), f = e.visibleColumnFromColumn(t, new Y(m, g)); + a && (Z > l || f < n) || d && (f > n || Z < l) || h.push(new hn(new I(m, b, m, b), 0, 0, new Y(m, g), 0)); } if (h.length === 0) - for (let u = 0; u < l; u++) { - const g = i + (a ? -u : u), m = t.getLineMaxColumn(g); - h.push(new dn(new M(g, m, g, m), 0, 0, new V(g, m), 0)); + for (let u = 0; u < r; u++) { + const m = i + (c ? -u : u), b = t.getLineMaxColumn(m); + h.push(new hn(new I(m, b, m, b), 0, 0, new Y(m, b), 0)); } return { viewStates: h, - reversed: a, + reversed: c, fromLineNumber: i, fromVisualColumn: n, toLineNumber: o, - toVisualColumn: r + toVisualColumn: l }; } static columnSelectLeft(e, t, i) { let n = i.toViewVisualColumn; - return n > 0 && n--, Du.columnSelect(e, t, i.fromViewLineNumber, i.fromViewVisualColumn, i.toViewLineNumber, n); + return n > 0 && n--, Hu.columnSelect(e, t, i.fromViewLineNumber, i.fromViewVisualColumn, i.toViewLineNumber, n); } static columnSelectRight(e, t, i) { let n = 0; - const o = Math.min(i.fromViewLineNumber, i.toViewLineNumber), r = Math.max(i.fromViewLineNumber, i.toViewLineNumber); - for (let a = o; a <= r; a++) { - const c = t.getLineMaxColumn(a), d = e.visibleColumnFromColumn(t, new V(a, c)); - n = Math.max(n, d); + const o = Math.min(i.fromViewLineNumber, i.toViewLineNumber), l = Math.max(i.fromViewLineNumber, i.toViewLineNumber); + for (let c = o; c <= l; c++) { + const d = t.getLineMaxColumn(c), a = e.visibleColumnFromColumn(t, new Y(c, d)); + n = Math.max(n, a); } - let l = i.toViewVisualColumn; - return l < n && l++, this.columnSelect(e, t, i.fromViewLineNumber, i.fromViewVisualColumn, i.toViewLineNumber, l); + let r = i.toViewVisualColumn; + return r < n && r++, this.columnSelect(e, t, i.fromViewLineNumber, i.fromViewVisualColumn, i.toViewLineNumber, r); } static columnSelectUp(e, t, i, n) { - const o = n ? e.pageSize : 1, r = Math.max(1, i.toViewLineNumber - o); - return this.columnSelect(e, t, i.fromViewLineNumber, i.fromViewVisualColumn, r, i.toViewVisualColumn); + const o = n ? e.pageSize : 1, l = Math.max(1, i.toViewLineNumber - o); + return this.columnSelect(e, t, i.fromViewLineNumber, i.fromViewVisualColumn, l, i.toViewVisualColumn); } static columnSelectDown(e, t, i, n) { - const o = n ? e.pageSize : 1, r = Math.min(t.getLineCount(), i.toViewLineNumber + o); - return this.columnSelect(e, t, i.fromViewLineNumber, i.fromViewVisualColumn, r, i.toViewVisualColumn); + const o = n ? e.pageSize : 1, l = Math.min(t.getLineCount(), i.toViewLineNumber + o); + return this.columnSelect(e, t, i.fromViewLineNumber, i.fromViewVisualColumn, l, i.toViewVisualColumn); } } -class Mn { +class Sn { constructor(e, t, i = !1) { this._range = e, this._text = t, this.insertsAutoWhitespace = i; } @@ -9100,10 +9100,10 @@ class Mn { } computeCursorState(e, t) { const n = t.getInverseEditOperations()[0].range; - return fe.fromPositions(n.getEndPosition()); + return ge.fromPositions(n.getEndPosition()); } } -class U$ { +class Dee { constructor(e, t) { this._range = e, this._text = t; } @@ -9112,14 +9112,14 @@ class U$ { } computeCursorState(e, t) { const n = t.getInverseEditOperations()[0].range; - return fe.fromRange( + return ge.fromRange( n, 0 /* SelectionDirection.LTR */ ); } } -class fL { +class wX { constructor(e, t, i = !1) { this._range = e, this._text = t, this.insertsAutoWhitespace = i; } @@ -9128,10 +9128,10 @@ class fL { } computeCursorState(e, t) { const n = t.getInverseEditOperations()[0].range; - return fe.fromPositions(n.getStartPosition()); + return ge.fromPositions(n.getStartPosition()); } } -class mA { +class RV { constructor(e, t, i, n, o = !1) { this._range = e, this._text = t, this._columnDeltaOffset = n, this._lineNumberDeltaOffset = i, this.insertsAutoWhitespace = o; } @@ -9140,10 +9140,10 @@ class mA { } computeCursorState(e, t) { const n = t.getInverseEditOperations()[0].range; - return fe.fromPositions(n.getEndPosition().delta(this._lineNumberDeltaOffset, this._columnDeltaOffset)); + return ge.fromPositions(n.getEndPosition().delta(this._lineNumberDeltaOffset, this._columnDeltaOffset)); } } -class fE { +class Fv { constructor(e, t, i, n = !1) { this._range = e, this._text = t, this._initialSelection = i, this._forceMoveMarkers = n, this._selectionId = null; } @@ -9154,7 +9154,7 @@ class fE { return t.getTrackedSelection(this._selectionId); } } -class kw { +class By { /** * Get the visible column at the position. If we get to a non-whitespace character first * or past the end of string then return -1. @@ -9163,22 +9163,22 @@ class kw { */ static whitespaceVisibleColumn(e, t, i) { const n = e.length; - let o = 0, r = -1, l = -1; - for (let a = 0; a < n; a++) { - if (a === t) - return [r, l, o]; - switch (o % i === 0 && (r = a, l = o), e.charCodeAt(a)) { + let o = 0, l = -1, r = -1; + for (let c = 0; c < n; c++) { + if (c === t) + return [l, r, o]; + switch (o % i === 0 && (l = c, r = o), e.charCodeAt(c)) { case 32: o += 1; break; case 9: - o = Yi.nextRenderTabStop(o, i); + o = zi.nextRenderTabStop(o, i); break; default: return [-1, -1, -1]; } } - return t === n ? [r, l, o] : [-1, -1, -1]; + return t === n ? [l, r, o] : [-1, -1, -1]; } /** * Return the position that should result from a move left, right or to the @@ -9190,218 +9190,218 @@ class kw { * **Note**: `position` and the return value are 0-based. */ static atomicPosition(e, t, i, n) { - const o = e.length, [r, l, a] = kw.whitespaceVisibleColumn(e, t, i); - if (a === -1) + const o = e.length, [l, r, c] = By.whitespaceVisibleColumn(e, t, i); + if (c === -1) return -1; - let c; + let d; switch (n) { case 0: - c = !0; + d = !0; break; case 1: - c = !1; + d = !1; break; case 2: - if (a % i === 0) + if (c % i === 0) return t; - c = a % i <= i / 2; + d = c % i <= i / 2; break; } - if (c) { - if (r === -1) + if (d) { + if (l === -1) return -1; - let u = l; - for (let g = r; g < o; ++g) { - if (u === l + i) - return r; - switch (e.charCodeAt(g)) { + let u = r; + for (let m = l; m < o; ++m) { + if (u === r + i) + return l; + switch (e.charCodeAt(m)) { case 32: u += 1; break; case 9: - u = Yi.nextRenderTabStop(u, i); + u = zi.nextRenderTabStop(u, i); break; default: return -1; } } - return u === l + i ? r : -1; + return u === r + i ? l : -1; } - const d = Yi.nextRenderTabStop(a, i); - let h = a; + const a = zi.nextRenderTabStop(c, i); + let h = c; for (let u = t; u < o; u++) { - if (h === d) + if (h === a) return u; switch (e.charCodeAt(u)) { case 32: h += 1; break; case 9: - h = Yi.nextRenderTabStop(h, i); + h = zi.nextRenderTabStop(h, i); break; default: return -1; } } - return h === d ? o : -1; + return h === a ? o : -1; } } -class vN { +class BC { constructor(e, t, i) { this._cursorPositionBrand = void 0, this.lineNumber = e, this.column = t, this.leftoverVisibleColumns = i; } } -class Ct { +class Wt { static leftPosition(e, t) { if (t.column > e.getLineMinColumn(t.lineNumber)) - return t.delta(void 0, -XH(e.getLineContent(t.lineNumber), t.column - 1)); + return t.delta(void 0, -GB(e.getLineContent(t.lineNumber), t.column - 1)); if (t.lineNumber > 1) { const i = t.lineNumber - 1; - return new V(i, e.getLineMaxColumn(i)); + return new Y(i, e.getLineMaxColumn(i)); } else return t; } static leftPositionAtomicSoftTabs(e, t, i) { if (t.column <= e.getLineIndentColumn(t.lineNumber)) { - const n = e.getLineMinColumn(t.lineNumber), o = e.getLineContent(t.lineNumber), r = kw.atomicPosition( + const n = e.getLineMinColumn(t.lineNumber), o = e.getLineContent(t.lineNumber), l = By.atomicPosition( o, t.column - 1, i, 0 /* Direction.Left */ ); - if (r !== -1 && r + 1 >= n) - return new V(t.lineNumber, r + 1); + if (l !== -1 && l + 1 >= n) + return new Y(t.lineNumber, l + 1); } return this.leftPosition(e, t); } static left(e, t, i) { - const n = e.stickyTabStops ? Ct.leftPositionAtomicSoftTabs(t, i, e.tabSize) : Ct.leftPosition(t, i); - return new vN(n.lineNumber, n.column, 0); + const n = e.stickyTabStops ? Wt.leftPositionAtomicSoftTabs(t, i, e.tabSize) : Wt.leftPosition(t, i); + return new BC(n.lineNumber, n.column, 0); } /** * @param noOfColumns Must be either `1` * or `Math.round(viewModel.getLineContent(viewLineNumber).length / 2)` (for half lines). */ static moveLeft(e, t, i, n, o) { - let r, l; + let l, r; if (i.hasSelection() && !n) - r = i.selection.startLineNumber, l = i.selection.startColumn; + l = i.selection.startLineNumber, r = i.selection.startColumn; else { - const a = i.position.delta(void 0, -(o - 1)), c = t.normalizePosition( - Ct.clipPositionColumn(a, t), + const c = i.position.delta(void 0, -(o - 1)), d = t.normalizePosition( + Wt.clipPositionColumn(c, t), 0 /* PositionAffinity.Left */ - ), d = Ct.left(e, t, c); - r = d.lineNumber, l = d.column; + ), a = Wt.left(e, t, d); + l = a.lineNumber, r = a.column; } - return i.move(n, r, l, 0); + return i.move(n, l, r, 0); } /** * Adjusts the column so that it is within min/max of the line. */ static clipPositionColumn(e, t) { - return new V(e.lineNumber, Ct.clipRange(e.column, t.getLineMinColumn(e.lineNumber), t.getLineMaxColumn(e.lineNumber))); + return new Y(e.lineNumber, Wt.clipRange(e.column, t.getLineMinColumn(e.lineNumber), t.getLineMaxColumn(e.lineNumber))); } static clipRange(e, t, i) { return e < t ? t : e > i ? i : e; } static rightPosition(e, t, i) { - return i < e.getLineMaxColumn(t) ? i = i + sE(e.getLineContent(t), i - 1) : t < e.getLineCount() && (t = t + 1, i = e.getLineMinColumn(t)), new V(t, i); + return i < e.getLineMaxColumn(t) ? i = i + Rv(e.getLineContent(t), i - 1) : t < e.getLineCount() && (t = t + 1, i = e.getLineMinColumn(t)), new Y(t, i); } static rightPositionAtomicSoftTabs(e, t, i, n, o) { if (i < e.getLineIndentColumn(t)) { - const r = e.getLineContent(t), l = kw.atomicPosition( - r, + const l = e.getLineContent(t), r = By.atomicPosition( + l, i - 1, n, 1 /* Direction.Right */ ); - if (l !== -1) - return new V(t, l + 1); + if (r !== -1) + return new Y(t, r + 1); } return this.rightPosition(e, t, i); } static right(e, t, i) { - const n = e.stickyTabStops ? Ct.rightPositionAtomicSoftTabs(t, i.lineNumber, i.column, e.tabSize, e.indentSize) : Ct.rightPosition(t, i.lineNumber, i.column); - return new vN(n.lineNumber, n.column, 0); + const n = e.stickyTabStops ? Wt.rightPositionAtomicSoftTabs(t, i.lineNumber, i.column, e.tabSize, e.indentSize) : Wt.rightPosition(t, i.lineNumber, i.column); + return new BC(n.lineNumber, n.column, 0); } static moveRight(e, t, i, n, o) { - let r, l; + let l, r; if (i.hasSelection() && !n) - r = i.selection.endLineNumber, l = i.selection.endColumn; + l = i.selection.endLineNumber, r = i.selection.endColumn; else { - const a = i.position.delta(void 0, o - 1), c = t.normalizePosition( - Ct.clipPositionColumn(a, t), + const c = i.position.delta(void 0, o - 1), d = t.normalizePosition( + Wt.clipPositionColumn(c, t), 1 /* PositionAffinity.Right */ - ), d = Ct.right(e, t, c); - r = d.lineNumber, l = d.column; + ), a = Wt.right(e, t, d); + l = a.lineNumber, r = a.column; } - return i.move(n, r, l, 0); + return i.move(n, l, r, 0); } - static vertical(e, t, i, n, o, r, l, a) { - const c = Yi.visibleColumnFromColumn(t.getLineContent(i), n, e.tabSize) + o, d = t.getLineCount(), h = i === 1 && n === 1, u = i === d && n === t.getLineMaxColumn(i), g = r < i ? h : u; - if (i = r, i < 1 ? (i = 1, l ? n = t.getLineMinColumn(i) : n = Math.min(t.getLineMaxColumn(i), n)) : i > d ? (i = d, l ? n = t.getLineMaxColumn(i) : n = Math.min(t.getLineMaxColumn(i), n)) : n = e.columnFromVisibleColumn(t, i, c), g ? o = 0 : o = c - Yi.visibleColumnFromColumn(t.getLineContent(i), n, e.tabSize), a !== void 0) { - const m = new V(i, n), f = t.normalizePosition(m, a); - o = o + (n - f.column), i = f.lineNumber, n = f.column; + static vertical(e, t, i, n, o, l, r, c) { + const d = zi.visibleColumnFromColumn(t.getLineContent(i), n, e.tabSize) + o, a = t.getLineCount(), h = i === 1 && n === 1, u = i === a && n === t.getLineMaxColumn(i), m = l < i ? h : u; + if (i = l, i < 1 ? (i = 1, r ? n = t.getLineMinColumn(i) : n = Math.min(t.getLineMaxColumn(i), n)) : i > a ? (i = a, r ? n = t.getLineMaxColumn(i) : n = Math.min(t.getLineMaxColumn(i), n)) : n = e.columnFromVisibleColumn(t, i, d), m ? o = 0 : o = d - zi.visibleColumnFromColumn(t.getLineContent(i), n, e.tabSize), c !== void 0) { + const b = new Y(i, n), g = t.normalizePosition(b, c); + o = o + (n - g.column), i = g.lineNumber, n = g.column; } - return new vN(i, n, o); + return new BC(i, n, o); } - static down(e, t, i, n, o, r, l) { + static down(e, t, i, n, o, l, r) { return this.vertical( e, t, i, n, o, - i + r, - l, + i + l, + r, 4 /* PositionAffinity.RightOfInjectedText */ ); } static moveDown(e, t, i, n, o) { - let r, l; - i.hasSelection() && !n ? (r = i.selection.endLineNumber, l = i.selection.endColumn) : (r = i.position.lineNumber, l = i.position.column); - let a = 0, c; + let l, r; + i.hasSelection() && !n ? (l = i.selection.endLineNumber, r = i.selection.endColumn) : (l = i.position.lineNumber, r = i.position.column); + let c = 0, d; do - if (c = Ct.down(e, t, r + a, l, i.leftoverVisibleColumns, o, !0), t.normalizePosition( - new V(c.lineNumber, c.column), + if (d = Wt.down(e, t, l + c, r, i.leftoverVisibleColumns, o, !0), t.normalizePosition( + new Y(d.lineNumber, d.column), 2 /* PositionAffinity.None */ - ).lineNumber > r) + ).lineNumber > l) break; - while (a++ < 10 && r + a < t.getLineCount()); - return i.move(n, c.lineNumber, c.column, c.leftoverVisibleColumns); + while (c++ < 10 && l + c < t.getLineCount()); + return i.move(n, d.lineNumber, d.column, d.leftoverVisibleColumns); } static translateDown(e, t, i) { - const n = i.selection, o = Ct.down(e, t, n.selectionStartLineNumber, n.selectionStartColumn, i.selectionStartLeftoverVisibleColumns, 1, !1), r = Ct.down(e, t, n.positionLineNumber, n.positionColumn, i.leftoverVisibleColumns, 1, !1); - return new dn(new M(o.lineNumber, o.column, o.lineNumber, o.column), 0, o.leftoverVisibleColumns, new V(r.lineNumber, r.column), r.leftoverVisibleColumns); + const n = i.selection, o = Wt.down(e, t, n.selectionStartLineNumber, n.selectionStartColumn, i.selectionStartLeftoverVisibleColumns, 1, !1), l = Wt.down(e, t, n.positionLineNumber, n.positionColumn, i.leftoverVisibleColumns, 1, !1); + return new hn(new I(o.lineNumber, o.column, o.lineNumber, o.column), 0, o.leftoverVisibleColumns, new Y(l.lineNumber, l.column), l.leftoverVisibleColumns); } - static up(e, t, i, n, o, r, l) { + static up(e, t, i, n, o, l, r) { return this.vertical( e, t, i, n, o, - i - r, - l, + i - l, + r, 3 /* PositionAffinity.LeftOfInjectedText */ ); } static moveUp(e, t, i, n, o) { - let r, l; - i.hasSelection() && !n ? (r = i.selection.startLineNumber, l = i.selection.startColumn) : (r = i.position.lineNumber, l = i.position.column); - const a = Ct.up(e, t, r, l, i.leftoverVisibleColumns, o, !0); - return i.move(n, a.lineNumber, a.column, a.leftoverVisibleColumns); + let l, r; + i.hasSelection() && !n ? (l = i.selection.startLineNumber, r = i.selection.startColumn) : (l = i.position.lineNumber, r = i.position.column); + const c = Wt.up(e, t, l, r, i.leftoverVisibleColumns, o, !0); + return i.move(n, c.lineNumber, c.column, c.leftoverVisibleColumns); } static translateUp(e, t, i) { - const n = i.selection, o = Ct.up(e, t, n.selectionStartLineNumber, n.selectionStartColumn, i.selectionStartLeftoverVisibleColumns, 1, !1), r = Ct.up(e, t, n.positionLineNumber, n.positionColumn, i.leftoverVisibleColumns, 1, !1); - return new dn(new M(o.lineNumber, o.column, o.lineNumber, o.column), 0, o.leftoverVisibleColumns, new V(r.lineNumber, r.column), r.leftoverVisibleColumns); + const n = i.selection, o = Wt.up(e, t, n.selectionStartLineNumber, n.selectionStartColumn, i.selectionStartLeftoverVisibleColumns, 1, !1), l = Wt.up(e, t, n.positionLineNumber, n.positionColumn, i.leftoverVisibleColumns, 1, !1); + return new hn(new I(o.lineNumber, o.column, o.lineNumber, o.column), 0, o.leftoverVisibleColumns, new Y(l.lineNumber, l.column), l.leftoverVisibleColumns); } static _isBlankLine(e, t) { return e.getLineFirstNonWhitespaceColumn(t) === 0; @@ -9416,83 +9416,83 @@ class Ct { } static moveToNextBlankLine(e, t, i, n) { const o = t.getLineCount(); - let r = i.position.lineNumber; - for (; r < o && this._isBlankLine(t, r); ) - r++; - for (; r < o && !this._isBlankLine(t, r); ) - r++; - return i.move(n, r, t.getLineMinColumn(r), 0); + let l = i.position.lineNumber; + for (; l < o && this._isBlankLine(t, l); ) + l++; + for (; l < o && !this._isBlankLine(t, l); ) + l++; + return i.move(n, l, t.getLineMinColumn(l), 0); } static moveToBeginningOfLine(e, t, i, n) { - const o = i.position.lineNumber, r = t.getLineMinColumn(o), l = t.getLineFirstNonWhitespaceColumn(o) || r; - let a; - return i.position.column === l ? a = r : a = l, i.move(n, o, a, 0); + const o = i.position.lineNumber, l = t.getLineMinColumn(o), r = t.getLineFirstNonWhitespaceColumn(o) || l; + let c; + return i.position.column === r ? c = l : c = r, i.move(n, o, c, 0); } static moveToEndOfLine(e, t, i, n, o) { - const r = i.position.lineNumber, l = t.getLineMaxColumn(r); - return i.move(n, r, l, o ? 1073741824 - l : 0); + const l = i.position.lineNumber, r = t.getLineMaxColumn(l); + return i.move(n, l, r, o ? 1073741824 - r : 0); } static moveToBeginningOfBuffer(e, t, i, n) { return i.move(n, 1, 1, 0); } static moveToEndOfBuffer(e, t, i, n) { - const o = t.getLineCount(), r = t.getLineMaxColumn(o); - return i.move(n, o, r, 0); + const o = t.getLineCount(), l = t.getLineMaxColumn(o); + return i.move(n, o, l, 0); } } -class mm { +class yb { static deleteRight(e, t, i, n) { const o = []; - let r = e !== 3; - for (let l = 0, a = n.length; l < a; l++) { - const c = n[l]; - let d = c; - if (d.isEmpty()) { - const h = c.getPosition(), u = Ct.right(t, i, h); - d = new M(u.lineNumber, u.column, h.lineNumber, h.column); - } - if (d.isEmpty()) { - o[l] = null; + let l = e !== 3; + for (let r = 0, c = n.length; r < c; r++) { + const d = n[r]; + let a = d; + if (a.isEmpty()) { + const h = d.getPosition(), u = Wt.right(t, i, h); + a = new I(u.lineNumber, u.column, h.lineNumber, h.column); + } + if (a.isEmpty()) { + o[r] = null; continue; } - d.startLineNumber !== d.endLineNumber && (r = !0), o[l] = new Mn(d, ""); + a.startLineNumber !== a.endLineNumber && (l = !0), o[r] = new Sn(a, ""); } - return [r, o]; + return [l, o]; } - static isAutoClosingPairDelete(e, t, i, n, o, r, l) { + static isAutoClosingPairDelete(e, t, i, n, o, l, r) { if (t === "never" && i === "never" || e === "never") return !1; - for (let a = 0, c = r.length; a < c; a++) { - const d = r[a], h = d.getPosition(); - if (!d.isEmpty()) + for (let c = 0, d = l.length; c < d; c++) { + const a = l[c], h = a.getPosition(); + if (!a.isEmpty()) return !1; const u = o.getLineContent(h.lineNumber); if (h.column < 2 || h.column >= u.length + 1) return !1; - const g = u.charAt(h.column - 2), m = n.get(g); - if (!m) + const m = u.charAt(h.column - 2), b = n.get(m); + if (!b) return !1; - if (vh(g)) { + if (kh(m)) { if (i === "never") return !1; } else if (t === "never") return !1; - const f = u.charAt(h.column - 1); - let b = !1; - for (const y of m) - y.open === g && y.close === f && (b = !0); - if (!b) + const g = u.charAt(h.column - 1); + let Z = !1; + for (const f of b) + f.open === m && f.close === g && (Z = !0); + if (!Z) return !1; if (e === "auto") { - let y = !1; - for (let w = 0, C = l.length; w < C; w++) { - const S = l[w]; - if (h.lineNumber === S.startLineNumber && h.column === S.startColumn) { - y = !0; + let f = !1; + for (let y = 0, W = r.length; y < W; y++) { + const G = r[y]; + if (h.lineNumber === G.startLineNumber && h.column === G.startColumn) { + f = !0; break; } } - if (!y) + if (!f) return !1; } } @@ -9500,99 +9500,99 @@ class mm { } static _runAutoClosingPairDelete(e, t, i) { const n = []; - for (let o = 0, r = i.length; o < r; o++) { - const l = i[o].getPosition(), a = new M(l.lineNumber, l.column - 1, l.lineNumber, l.column + 1); - n[o] = new Mn(a, ""); + for (let o = 0, l = i.length; o < l; o++) { + const r = i[o].getPosition(), c = new I(r.lineNumber, r.column - 1, r.lineNumber, r.column + 1); + n[o] = new Sn(c, ""); } return [!0, n]; } static deleteLeft(e, t, i, n, o) { if (this.isAutoClosingPairDelete(t.autoClosingDelete, t.autoClosingBrackets, t.autoClosingQuotes, t.autoClosingPairs.autoClosingPairsOpenByEnd, i, n, o)) return this._runAutoClosingPairDelete(t, i, n); - const r = []; - let l = e !== 2; - for (let a = 0, c = n.length; a < c; a++) { - const d = mm.getDeleteRange(n[a], i, t); - if (d.isEmpty()) { - r[a] = null; + const l = []; + let r = e !== 2; + for (let c = 0, d = n.length; c < d; c++) { + const a = yb.getDeleteRange(n[c], i, t); + if (a.isEmpty()) { + l[c] = null; continue; } - d.startLineNumber !== d.endLineNumber && (l = !0), r[a] = new Mn(d, ""); + a.startLineNumber !== a.endLineNumber && (r = !0), l[c] = new Sn(a, ""); } - return [l, r]; + return [r, l]; } static getDeleteRange(e, t, i) { if (!e.isEmpty()) return e; const n = e.getPosition(); if (i.useTabStops && n.column > 1) { - const o = t.getLineContent(n.lineNumber), r = qn(o), l = r === -1 ? ( + const o = t.getLineContent(n.lineNumber), l = es(o), r = l === -1 ? ( /* entire string is whitespace */ o.length + 1 - ) : r + 1; - if (n.column <= l) { - const a = i.visibleColumnFromColumn(t, n), c = Yi.prevIndentTabStop(a, i.indentSize), d = i.columnFromVisibleColumn(t, n.lineNumber, c); - return new M(n.lineNumber, d, n.lineNumber, n.column); + ) : l + 1; + if (n.column <= r) { + const c = i.visibleColumnFromColumn(t, n), d = zi.prevIndentTabStop(c, i.indentSize), a = i.columnFromVisibleColumn(t, n.lineNumber, d); + return new I(n.lineNumber, a, n.lineNumber, n.column); } } - return M.fromPositions(mm.getPositionAfterDeleteLeft(n, t), n); + return I.fromPositions(yb.getPositionAfterDeleteLeft(n, t), n); } static getPositionAfterDeleteLeft(e, t) { if (e.column > 1) { - const i = hq(e.column - 1, t.getLineContent(e.lineNumber)); + const i = n$(e.column - 1, t.getLineContent(e.lineNumber)); return e.with(void 0, i + 1); } else if (e.lineNumber > 1) { const i = e.lineNumber - 1; - return new V(i, t.getLineMaxColumn(i)); + return new Y(i, t.getLineMaxColumn(i)); } else return e; } static cut(e, t, i) { const n = []; let o = null; - i.sort((r, l) => V.compare(r.getStartPosition(), l.getEndPosition())); - for (let r = 0, l = i.length; r < l; r++) { - const a = i[r]; - if (a.isEmpty()) + i.sort((l, r) => Y.compare(l.getStartPosition(), r.getEndPosition())); + for (let l = 0, r = i.length; l < r; l++) { + const c = i[l]; + if (c.isEmpty()) if (e.emptySelectionClipboard) { - const c = a.getPosition(); - let d, h, u, g; - c.lineNumber < t.getLineCount() ? (d = c.lineNumber, h = 1, u = c.lineNumber + 1, g = 1) : c.lineNumber > 1 && (o == null ? void 0 : o.endLineNumber) !== c.lineNumber ? (d = c.lineNumber - 1, h = t.getLineMaxColumn(c.lineNumber - 1), u = c.lineNumber, g = t.getLineMaxColumn(c.lineNumber)) : (d = c.lineNumber, h = 1, u = c.lineNumber, g = t.getLineMaxColumn(c.lineNumber)); - const m = new M(d, h, u, g); - o = m, m.isEmpty() ? n[r] = null : n[r] = new Mn(m, ""); + const d = c.getPosition(); + let a, h, u, m; + d.lineNumber < t.getLineCount() ? (a = d.lineNumber, h = 1, u = d.lineNumber + 1, m = 1) : d.lineNumber > 1 && (o == null ? void 0 : o.endLineNumber) !== d.lineNumber ? (a = d.lineNumber - 1, h = t.getLineMaxColumn(d.lineNumber - 1), u = d.lineNumber, m = t.getLineMaxColumn(d.lineNumber)) : (a = d.lineNumber, h = 1, u = d.lineNumber, m = t.getLineMaxColumn(d.lineNumber)); + const b = new I(a, h, u, m); + o = b, b.isEmpty() ? n[l] = null : n[l] = new Sn(b, ""); } else - n[r] = null; + n[l] = null; else - n[r] = new Mn(a, ""); + n[l] = new Sn(c, ""); } - return new Es(0, n, { + return new Ds(0, n, { shouldPushStackElementBefore: !0, shouldPushStackElementAfter: !0 }); } } -var cF, dF; -class K$ { +var YD, kD; +class Fee { constructor(e, t) { this.uri = e, this.value = t; } } -function Q$(s) { +function zee(s) { return Array.isArray(s); } -const Hu = class Hu { +const ju = class ju { constructor(e, t) { - if (this[cF] = "ResourceMap", e instanceof Hu) - this.map = new Map(e.map), this.toKey = t ?? Hu.defaultToKey; - else if (Q$(e)) { - this.map = /* @__PURE__ */ new Map(), this.toKey = t ?? Hu.defaultToKey; + if (this[YD] = "ResourceMap", e instanceof ju) + this.map = new Map(e.map), this.toKey = t ?? ju.defaultToKey; + else if (zee(e)) { + this.map = /* @__PURE__ */ new Map(), this.toKey = t ?? ju.defaultToKey; for (const [i, n] of e) this.set(i, n); } else - this.map = /* @__PURE__ */ new Map(), this.toKey = e ?? Hu.defaultToKey; + this.map = /* @__PURE__ */ new Map(), this.toKey = e ?? ju.defaultToKey; } set(e, t) { - return this.map.set(this.toKey(e), new K$(e, t)), this; + return this.map.set(this.toKey(e), new Fee(e, t)), this; } get(e) { var t; @@ -9627,16 +9627,16 @@ const Hu = class Hu { for (const e of this.map.values()) yield [e.uri, e.value]; } - *[(cF = Symbol.toStringTag, Symbol.iterator)]() { + *[(YD = Symbol.toStringTag, Symbol.iterator)]() { for (const [, e] of this.map) yield [e.uri, e.value]; } }; -Hu.defaultToKey = (e) => e.toString(); -let sn = Hu; -class j$ { +ju.defaultToKey = (e) => e.toString(); +let on = ju; +class Aee { constructor() { - this[dF] = "LinkedMap", this._map = /* @__PURE__ */ new Map(), this._head = void 0, this._tail = void 0, this._size = 0, this._state = 0; + this[kD] = "LinkedMap", this._map = /* @__PURE__ */ new Map(), this._head = void 0, this._tail = void 0, this._size = 0, this._state = 0; } clear() { this._map.clear(), this._head = void 0, this._tail = void 0, this._size = 0, this._state++; @@ -9768,7 +9768,7 @@ class j$ { }; return n; } - [(dF = Symbol.toStringTag, Symbol.iterator)]() { + [(kD = Symbol.toStringTag, Symbol.iterator)]() { return this.entries(); } trimOld(e) { @@ -9861,7 +9861,7 @@ class j$ { this.set(t, i); } } -class q$ extends j$ { +class Kee extends Aee { constructor(e, t = 1) { super(), this._limit = e, this._ratio = Math.min(Math.max(0, t), 1); } @@ -9893,7 +9893,7 @@ class q$ extends j$ { this.size > this._limit && this.trim(Math.round(this._limit * this._ratio)); } } -class id extends q$ { +class la extends Kee { constructor(e, t = 1) { super(e, t); } @@ -9904,7 +9904,7 @@ class id extends q$ { return super.set(e, t), this.checkTrim(), this; } } -class $$ { +class Uee { constructor(e) { if (this._m1 = /* @__PURE__ */ new Map(), this._m2 = /* @__PURE__ */ new Map(), e) for (const [t, i] of e) @@ -9933,7 +9933,7 @@ class $$ { return this._m1.values(); } } -class bE { +class zv { constructor() { this.map = /* @__PURE__ */ new Map(); } @@ -9954,23 +9954,23 @@ class bE { return t || /* @__PURE__ */ new Set(); } } -function pA(s) { +function NV(s) { return s < 0 ? 0 : s > 255 ? 255 : s | 0; } -function sp(s) { +function dp(s) { return s < 0 ? 0 : s > 4294967295 ? 4294967295 : s | 0; } -class $b { +class o0 { constructor(e) { - const t = pA(e); - this._defaultValue = t, this._asciiMap = $b._createAsciiMap(t), this._map = /* @__PURE__ */ new Map(); + const t = NV(e); + this._defaultValue = t, this._asciiMap = o0._createAsciiMap(t), this._map = /* @__PURE__ */ new Map(); } static _createAsciiMap(e) { const t = new Uint8Array(256); return t.fill(e), t; } set(e, t) { - const i = pA(t); + const i = NV(t); e >= 0 && e < 256 ? this._asciiMap[e] = i : this._map.set(e, i); } get(e) { @@ -9980,9 +9980,9 @@ class $b { this._asciiMap.fill(this._defaultValue), this._map.clear(); } } -class fA { +class wV { constructor() { - this._actual = new $b( + this._actual = new o0( 0 /* Boolean.False */ ); @@ -10001,7 +10001,7 @@ class fA { return this._actual.clear(); } } -class eee extends $b { +class Pee extends o0 { constructor(e, t) { super( 0 @@ -10051,13 +10051,13 @@ class eee extends $b { return !!e.isWordLike; } } -const hF = new id(10); -function yr(s, e) { +const vD = new la(10); +function Gl(s, e) { const t = `${s}/${e.join(",")}`; - let i = hF.get(t); - return i || (i = new eee(s, e), hF.set(t, i)), i; + let i = vD.get(t); + return i || (i = new Pee(s, e), vD.set(t, i)), i; } -class bt { +class Zt { static _createWord(e, t, i, n, o) { return { start: n, end: o, wordType: t, nextCharClass: i }; } @@ -10071,31 +10071,31 @@ class bt { static _doFindPreviousWordOnLine(e, t, i) { let n = 0; const o = t.findPrevIntlWordBeforeOrAtOffset(e, i.column - 2); - for (let r = i.column - 2; r >= 0; r--) { - const l = e.charCodeAt(r), a = t.get(l); - if (o && r === o.index) - return this._createIntlWord(o, a); - if (a === 0) { + for (let l = i.column - 2; l >= 0; l--) { + const r = e.charCodeAt(l), c = t.get(r); + if (o && l === o.index) + return this._createIntlWord(o, c); + if (c === 0) { if (n === 2) - return this._createWord(e, n, a, r + 1, this._findEndOfWord(e, t, n, r + 1)); + return this._createWord(e, n, c, l + 1, this._findEndOfWord(e, t, n, l + 1)); n = 1; - } else if (a === 2) { + } else if (c === 2) { if (n === 1) - return this._createWord(e, n, a, r + 1, this._findEndOfWord(e, t, n, r + 1)); + return this._createWord(e, n, c, l + 1, this._findEndOfWord(e, t, n, l + 1)); n = 2; - } else if (a === 1 && n !== 0) - return this._createWord(e, n, a, r + 1, this._findEndOfWord(e, t, n, r + 1)); + } else if (c === 1 && n !== 0) + return this._createWord(e, n, c, l + 1, this._findEndOfWord(e, t, n, l + 1)); } return n !== 0 ? this._createWord(e, n, 1, 0, this._findEndOfWord(e, t, n, 0)) : null; } static _findEndOfWord(e, t, i, n) { - const o = t.findNextIntlWordAtOrAfterOffset(e, n), r = e.length; - for (let l = n; l < r; l++) { - const a = e.charCodeAt(l), c = t.get(a); - if (o && l === o.index + o.segment.length || c === 1 || i === 1 && c === 2 || i === 2 && c === 0) - return l; + const o = t.findNextIntlWordAtOrAfterOffset(e, n), l = e.length; + for (let r = n; r < l; r++) { + const c = e.charCodeAt(r), d = t.get(c); + if (o && r === o.index + o.segment.length || d === 1 || i === 1 && d === 2 || i === 2 && d === 0) + return r; } - return r; + return l; } static _findNextWordOnLine(e, t, i) { const n = t.getLineContent(i.lineNumber); @@ -10103,134 +10103,134 @@ class bt { } static _doFindNextWordOnLine(e, t, i) { let n = 0; - const o = e.length, r = t.findNextIntlWordAtOrAfterOffset(e, i.column - 1); - for (let l = i.column - 1; l < o; l++) { - const a = e.charCodeAt(l), c = t.get(a); - if (r && l === r.index) - return this._createIntlWord(r, c); - if (c === 0) { + const o = e.length, l = t.findNextIntlWordAtOrAfterOffset(e, i.column - 1); + for (let r = i.column - 1; r < o; r++) { + const c = e.charCodeAt(r), d = t.get(c); + if (l && r === l.index) + return this._createIntlWord(l, d); + if (d === 0) { if (n === 2) - return this._createWord(e, n, c, this._findStartOfWord(e, t, n, l - 1), l); + return this._createWord(e, n, d, this._findStartOfWord(e, t, n, r - 1), r); n = 1; - } else if (c === 2) { + } else if (d === 2) { if (n === 1) - return this._createWord(e, n, c, this._findStartOfWord(e, t, n, l - 1), l); + return this._createWord(e, n, d, this._findStartOfWord(e, t, n, r - 1), r); n = 2; - } else if (c === 1 && n !== 0) - return this._createWord(e, n, c, this._findStartOfWord(e, t, n, l - 1), l); + } else if (d === 1 && n !== 0) + return this._createWord(e, n, d, this._findStartOfWord(e, t, n, r - 1), r); } return n !== 0 ? this._createWord(e, n, 1, this._findStartOfWord(e, t, n, o - 1), o) : null; } static _findStartOfWord(e, t, i, n) { const o = t.findPrevIntlWordBeforeOrAtOffset(e, n); - for (let r = n; r >= 0; r--) { - const l = e.charCodeAt(r), a = t.get(l); - if (o && r === o.index) - return r; - if (a === 1 || i === 1 && a === 2 || i === 2 && a === 0) - return r + 1; + for (let l = n; l >= 0; l--) { + const r = e.charCodeAt(l), c = t.get(r); + if (o && l === o.index) + return l; + if (c === 1 || i === 1 && c === 2 || i === 2 && c === 0) + return l + 1; } return 0; } static moveWordLeft(e, t, i, n, o) { - let r = i.lineNumber, l = i.column; - l === 1 && r > 1 && (r = r - 1, l = t.getLineMaxColumn(r)); - let a = bt._findPreviousWordOnLine(e, t, new V(r, l)); + let l = i.lineNumber, r = i.column; + r === 1 && l > 1 && (l = l - 1, r = t.getLineMaxColumn(l)); + let c = Zt._findPreviousWordOnLine(e, t, new Y(l, r)); if (n === 0) - return new V(r, a ? a.start + 1 : 1); + return new Y(l, c ? c.start + 1 : 1); if (n === 1) - return !o && a && a.wordType === 2 && a.end - a.start === 1 && a.nextCharClass === 0 && (a = bt._findPreviousWordOnLine(e, t, new V(r, a.start + 1))), new V(r, a ? a.start + 1 : 1); + return !o && c && c.wordType === 2 && c.end - c.start === 1 && c.nextCharClass === 0 && (c = Zt._findPreviousWordOnLine(e, t, new Y(l, c.start + 1))), new Y(l, c ? c.start + 1 : 1); if (n === 3) { - for (; a && a.wordType === 2; ) - a = bt._findPreviousWordOnLine(e, t, new V(r, a.start + 1)); - return new V(r, a ? a.start + 1 : 1); + for (; c && c.wordType === 2; ) + c = Zt._findPreviousWordOnLine(e, t, new Y(l, c.start + 1)); + return new Y(l, c ? c.start + 1 : 1); } - return a && l <= a.end + 1 && (a = bt._findPreviousWordOnLine(e, t, new V(r, a.start + 1))), new V(r, a ? a.end + 1 : 1); + return c && r <= c.end + 1 && (c = Zt._findPreviousWordOnLine(e, t, new Y(l, c.start + 1))), new Y(l, c ? c.end + 1 : 1); } static _moveWordPartLeft(e, t) { const i = t.lineNumber, n = e.getLineMaxColumn(i); if (t.column === 1) - return i > 1 ? new V(i - 1, e.getLineMaxColumn(i - 1)) : t; + return i > 1 ? new Y(i - 1, e.getLineMaxColumn(i - 1)) : t; const o = e.getLineContent(i); - for (let r = t.column - 1; r > 1; r--) { - const l = o.charCodeAt(r - 2), a = o.charCodeAt(r - 1); - if (l === 95 && a !== 95) - return new V(i, r); - if (l === 45 && a !== 45) - return new V(i, r); - if ((Xd(l) || qC(l)) && ua(a)) - return new V(i, r); - if (ua(l) && ua(a) && r + 1 < n) { - const c = o.charCodeAt(r); - if (Xd(c) || qC(c)) - return new V(i, r); - } - } - return new V(i, 1); + for (let l = t.column - 1; l > 1; l--) { + const r = o.charCodeAt(l - 2), c = o.charCodeAt(l - 1); + if (r === 95 && c !== 95) + return new Y(i, l); + if (r === 45 && c !== 45) + return new Y(i, l); + if ((Aa(r) || h1(r)) && gc(c)) + return new Y(i, l); + if (gc(r) && gc(c) && l + 1 < n) { + const d = o.charCodeAt(l); + if (Aa(d) || h1(d)) + return new Y(i, l); + } + } + return new Y(i, 1); } static moveWordRight(e, t, i, n) { - let o = i.lineNumber, r = i.column, l = !1; - r === t.getLineMaxColumn(o) && o < t.getLineCount() && (l = !0, o = o + 1, r = 1); - let a = bt._findNextWordOnLine(e, t, new V(o, r)); + let o = i.lineNumber, l = i.column, r = !1; + l === t.getLineMaxColumn(o) && o < t.getLineCount() && (r = !0, o = o + 1, l = 1); + let c = Zt._findNextWordOnLine(e, t, new Y(o, l)); if (n === 2) - a && a.wordType === 2 && a.end - a.start === 1 && a.nextCharClass === 0 && (a = bt._findNextWordOnLine(e, t, new V(o, a.end + 1))), a ? r = a.end + 1 : r = t.getLineMaxColumn(o); + c && c.wordType === 2 && c.end - c.start === 1 && c.nextCharClass === 0 && (c = Zt._findNextWordOnLine(e, t, new Y(o, c.end + 1))), c ? l = c.end + 1 : l = t.getLineMaxColumn(o); else if (n === 3) { - for (l && (r = 0); a && (a.wordType === 2 || a.start + 1 <= r); ) - a = bt._findNextWordOnLine(e, t, new V(o, a.end + 1)); - a ? r = a.start + 1 : r = t.getLineMaxColumn(o); + for (r && (l = 0); c && (c.wordType === 2 || c.start + 1 <= l); ) + c = Zt._findNextWordOnLine(e, t, new Y(o, c.end + 1)); + c ? l = c.start + 1 : l = t.getLineMaxColumn(o); } else - a && !l && r >= a.start + 1 && (a = bt._findNextWordOnLine(e, t, new V(o, a.end + 1))), a ? r = a.start + 1 : r = t.getLineMaxColumn(o); - return new V(o, r); + c && !r && l >= c.start + 1 && (c = Zt._findNextWordOnLine(e, t, new Y(o, c.end + 1))), c ? l = c.start + 1 : l = t.getLineMaxColumn(o); + return new Y(o, l); } static _moveWordPartRight(e, t) { const i = t.lineNumber, n = e.getLineMaxColumn(i); if (t.column === n) - return i < e.getLineCount() ? new V(i + 1, 1) : t; + return i < e.getLineCount() ? new Y(i + 1, 1) : t; const o = e.getLineContent(i); - for (let r = t.column + 1; r < n; r++) { - const l = o.charCodeAt(r - 2), a = o.charCodeAt(r - 1); - if (l !== 95 && a === 95) - return new V(i, r); - if (l !== 45 && a === 45) - return new V(i, r); - if ((Xd(l) || qC(l)) && ua(a)) - return new V(i, r); - if (ua(l) && ua(a) && r + 1 < n) { - const c = o.charCodeAt(r); - if (Xd(c) || qC(c)) - return new V(i, r); - } - } - return new V(i, n); + for (let l = t.column + 1; l < n; l++) { + const r = o.charCodeAt(l - 2), c = o.charCodeAt(l - 1); + if (r !== 95 && c === 95) + return new Y(i, l); + if (r !== 45 && c === 45) + return new Y(i, l); + if ((Aa(r) || h1(r)) && gc(c)) + return new Y(i, l); + if (gc(r) && gc(c) && l + 1 < n) { + const d = o.charCodeAt(l); + if (Aa(d) || h1(d)) + return new Y(i, l); + } + } + return new Y(i, n); } static _deleteWordLeftWhitespace(e, t) { - const i = e.getLineContent(t.lineNumber), n = t.column - 2, o = Ml(i, n); - return o + 1 < n ? new M(t.lineNumber, o + 2, t.lineNumber, t.column) : null; + const i = e.getLineContent(t.lineNumber), n = t.column - 2, o = Rr(i, n); + return o + 1 < n ? new I(t.lineNumber, o + 2, t.lineNumber, t.column) : null; } static deleteWordLeft(e, t) { - const i = e.wordSeparators, n = e.model, o = e.selection, r = e.whitespaceHeuristics; + const i = e.wordSeparators, n = e.model, o = e.selection, l = e.whitespaceHeuristics; if (!o.isEmpty()) return o; - if (mm.isAutoClosingPairDelete(e.autoClosingDelete, e.autoClosingBrackets, e.autoClosingQuotes, e.autoClosingPairs.autoClosingPairsOpenByEnd, e.model, [e.selection], e.autoClosedCharacters)) { + if (yb.isAutoClosingPairDelete(e.autoClosingDelete, e.autoClosingBrackets, e.autoClosingQuotes, e.autoClosingPairs.autoClosingPairsOpenByEnd, e.model, [e.selection], e.autoClosedCharacters)) { const h = e.selection.getPosition(); - return new M(h.lineNumber, h.column - 1, h.lineNumber, h.column + 1); + return new I(h.lineNumber, h.column - 1, h.lineNumber, h.column + 1); } - const l = new V(o.positionLineNumber, o.positionColumn); - let a = l.lineNumber, c = l.column; - if (a === 1 && c === 1) + const r = new Y(o.positionLineNumber, o.positionColumn); + let c = r.lineNumber, d = r.column; + if (c === 1 && d === 1) return null; - if (r) { - const h = this._deleteWordLeftWhitespace(n, l); + if (l) { + const h = this._deleteWordLeftWhitespace(n, r); if (h) return h; } - let d = bt._findPreviousWordOnLine(i, n, l); - return t === 0 ? d ? c = d.start + 1 : c > 1 ? c = 1 : (a--, c = n.getLineMaxColumn(a)) : (d && c <= d.end + 1 && (d = bt._findPreviousWordOnLine(i, n, new V(a, d.start + 1))), d ? c = d.end + 1 : c > 1 ? c = 1 : (a--, c = n.getLineMaxColumn(a))), new M(a, c, l.lineNumber, l.column); + let a = Zt._findPreviousWordOnLine(i, n, r); + return t === 0 ? a ? d = a.start + 1 : d > 1 ? d = 1 : (c--, d = n.getLineMaxColumn(c)) : (a && d <= a.end + 1 && (a = Zt._findPreviousWordOnLine(i, n, new Y(c, a.start + 1))), a ? d = a.end + 1 : d > 1 ? d = 1 : (c--, d = n.getLineMaxColumn(c))), new I(c, d, r.lineNumber, r.column); } static deleteInsideWord(e, t, i) { if (!i.isEmpty()) return i; - const n = new V(i.positionLineNumber, i.positionColumn), o = this._deleteInsideWordWhitespace(t, n); + const n = new Y(i.positionLineNumber, i.positionColumn), o = this._deleteInsideWordWhitespace(t, n); return o || this._deleteInsideWordDetermineDeleteRange(e, t, n); } static _charAtIsWhitespace(e, t) { @@ -10244,38 +10244,38 @@ class bt { let o = Math.max(t.column - 2, 0); if (!this._charAtIsWhitespace(i, o)) return null; - let r = Math.min(t.column - 1, n - 1); - if (!this._charAtIsWhitespace(i, r)) + let l = Math.min(t.column - 1, n - 1); + if (!this._charAtIsWhitespace(i, l)) return null; for (; o > 0 && this._charAtIsWhitespace(i, o - 1); ) o--; - for (; r + 1 < n && this._charAtIsWhitespace(i, r + 1); ) - r++; - return new M(t.lineNumber, o + 1, t.lineNumber, r + 2); + for (; l + 1 < n && this._charAtIsWhitespace(i, l + 1); ) + l++; + return new I(t.lineNumber, o + 1, t.lineNumber, l + 2); } static _deleteInsideWordDetermineDeleteRange(e, t, i) { const n = t.getLineContent(i.lineNumber), o = n.length; if (o === 0) - return i.lineNumber > 1 ? new M(i.lineNumber - 1, t.getLineMaxColumn(i.lineNumber - 1), i.lineNumber, 1) : i.lineNumber < t.getLineCount() ? new M(i.lineNumber, 1, i.lineNumber + 1, 1) : new M(i.lineNumber, 1, i.lineNumber, 1); - const r = (h) => h.start + 1 <= i.column && i.column <= h.end + 1, l = (h, u) => (h = Math.min(h, i.column), u = Math.max(u, i.column), new M(i.lineNumber, h, i.lineNumber, u)), a = (h) => { - let u = h.start + 1, g = h.end + 1, m = !1; - for (; g - 1 < o && this._charAtIsWhitespace(n, g - 1); ) - m = !0, g++; - if (!m) + return i.lineNumber > 1 ? new I(i.lineNumber - 1, t.getLineMaxColumn(i.lineNumber - 1), i.lineNumber, 1) : i.lineNumber < t.getLineCount() ? new I(i.lineNumber, 1, i.lineNumber + 1, 1) : new I(i.lineNumber, 1, i.lineNumber, 1); + const l = (h) => h.start + 1 <= i.column && i.column <= h.end + 1, r = (h, u) => (h = Math.min(h, i.column), u = Math.max(u, i.column), new I(i.lineNumber, h, i.lineNumber, u)), c = (h) => { + let u = h.start + 1, m = h.end + 1, b = !1; + for (; m - 1 < o && this._charAtIsWhitespace(n, m - 1); ) + b = !0, m++; + if (!b) for (; u > 1 && this._charAtIsWhitespace(n, u - 2); ) u--; - return l(u, g); - }, c = bt._findPreviousWordOnLine(e, t, i); - if (c && r(c)) - return a(c); - const d = bt._findNextWordOnLine(e, t, i); - return d && r(d) ? a(d) : c && d ? l(c.end + 1, d.start + 1) : c ? l(c.start + 1, c.end + 1) : d ? l(d.start + 1, d.end + 1) : l(1, o + 1); + return r(u, m); + }, d = Zt._findPreviousWordOnLine(e, t, i); + if (d && l(d)) + return c(d); + const a = Zt._findNextWordOnLine(e, t, i); + return a && l(a) ? c(a) : d && a ? r(d.end + 1, a.start + 1) : d ? r(d.start + 1, d.end + 1) : a ? r(a.start + 1, a.end + 1) : r(1, o + 1); } static _deleteWordPartLeft(e, t) { if (!t.isEmpty()) return t; - const i = t.getPosition(), n = bt._moveWordPartLeft(e, i); - return new M(i.lineNumber, i.column, n.lineNumber, n.column); + const i = t.getPosition(), n = Zt._moveWordPartLeft(e, i); + return new I(i.lineNumber, i.column, n.lineNumber, n.column); } static _findFirstNonWhitespaceChar(e, t) { const i = e.length; @@ -10288,33 +10288,33 @@ class bt { } static _deleteWordRightWhitespace(e, t) { const i = e.getLineContent(t.lineNumber), n = t.column - 1, o = this._findFirstNonWhitespaceChar(i, n); - return n + 1 < o ? new M(t.lineNumber, t.column, t.lineNumber, o + 1) : null; + return n + 1 < o ? new I(t.lineNumber, t.column, t.lineNumber, o + 1) : null; } static deleteWordRight(e, t) { - const i = e.wordSeparators, n = e.model, o = e.selection, r = e.whitespaceHeuristics; + const i = e.wordSeparators, n = e.model, o = e.selection, l = e.whitespaceHeuristics; if (!o.isEmpty()) return o; - const l = new V(o.positionLineNumber, o.positionColumn); - let a = l.lineNumber, c = l.column; - const d = n.getLineCount(), h = n.getLineMaxColumn(a); - if (a === d && c === h) + const r = new Y(o.positionLineNumber, o.positionColumn); + let c = r.lineNumber, d = r.column; + const a = n.getLineCount(), h = n.getLineMaxColumn(c); + if (c === a && d === h) return null; - if (r) { - const g = this._deleteWordRightWhitespace(n, l); - if (g) - return g; + if (l) { + const m = this._deleteWordRightWhitespace(n, r); + if (m) + return m; } - let u = bt._findNextWordOnLine(i, n, l); - return t === 2 ? u ? c = u.end + 1 : c < h || a === d ? c = h : (a++, u = bt._findNextWordOnLine(i, n, new V(a, 1)), u ? c = u.start + 1 : c = n.getLineMaxColumn(a)) : (u && c >= u.start + 1 && (u = bt._findNextWordOnLine(i, n, new V(a, u.end + 1))), u ? c = u.start + 1 : c < h || a === d ? c = h : (a++, u = bt._findNextWordOnLine(i, n, new V(a, 1)), u ? c = u.start + 1 : c = n.getLineMaxColumn(a))), new M(a, c, l.lineNumber, l.column); + let u = Zt._findNextWordOnLine(i, n, r); + return t === 2 ? u ? d = u.end + 1 : d < h || c === a ? d = h : (c++, u = Zt._findNextWordOnLine(i, n, new Y(c, 1)), u ? d = u.start + 1 : d = n.getLineMaxColumn(c)) : (u && d >= u.start + 1 && (u = Zt._findNextWordOnLine(i, n, new Y(c, u.end + 1))), u ? d = u.start + 1 : d < h || c === a ? d = h : (c++, u = Zt._findNextWordOnLine(i, n, new Y(c, 1)), u ? d = u.start + 1 : d = n.getLineMaxColumn(c))), new I(c, d, r.lineNumber, r.column); } static _deleteWordPartRight(e, t) { if (!t.isEmpty()) return t; - const i = t.getPosition(), n = bt._moveWordPartRight(e, i); - return new M(i.lineNumber, i.column, n.lineNumber, n.column); + const i = t.getPosition(), n = Zt._moveWordPartRight(e, i); + return new I(i.lineNumber, i.column, n.lineNumber, n.column); } static _createWordAtPosition(e, t, i) { - const n = new M(t, i.start + 1, t, i.end + 1); + const n = new I(t, i.start + 1, t, i.end + 1); return { word: e.getValueInRange(n), startColumn: n.startColumn, @@ -10322,213 +10322,213 @@ class bt { }; } static getWordAtPosition(e, t, i, n) { - const o = yr(t, i), r = bt._findPreviousWordOnLine(o, e, n); - if (r && r.wordType === 1 && r.start <= n.column - 1 && n.column - 1 <= r.end) - return bt._createWordAtPosition(e, n.lineNumber, r); - const l = bt._findNextWordOnLine(o, e, n); - return l && l.wordType === 1 && l.start <= n.column - 1 && n.column - 1 <= l.end ? bt._createWordAtPosition(e, n.lineNumber, l) : null; + const o = Gl(t, i), l = Zt._findPreviousWordOnLine(o, e, n); + if (l && l.wordType === 1 && l.start <= n.column - 1 && n.column - 1 <= l.end) + return Zt._createWordAtPosition(e, n.lineNumber, l); + const r = Zt._findNextWordOnLine(o, e, n); + return r && r.wordType === 1 && r.start <= n.column - 1 && n.column - 1 <= r.end ? Zt._createWordAtPosition(e, n.lineNumber, r) : null; } static word(e, t, i, n, o) { - const r = yr(e.wordSeparators, e.wordSegmenterLocales), l = bt._findPreviousWordOnLine(r, t, o), a = bt._findNextWordOnLine(r, t, o); + const l = Gl(e.wordSeparators, e.wordSegmenterLocales), r = Zt._findPreviousWordOnLine(l, t, o), c = Zt._findNextWordOnLine(l, t, o); if (!n) { - let g, m; - return l && l.wordType === 1 && l.start <= o.column - 1 && o.column - 1 <= l.end ? (g = l.start + 1, m = l.end + 1) : a && a.wordType === 1 && a.start <= o.column - 1 && o.column - 1 <= a.end ? (g = a.start + 1, m = a.end + 1) : (l ? g = l.end + 1 : g = 1, a ? m = a.start + 1 : m = t.getLineMaxColumn(o.lineNumber)), new dn(new M(o.lineNumber, g, o.lineNumber, m), 1, 0, new V(o.lineNumber, m), 0); + let m, b; + return r && r.wordType === 1 && r.start <= o.column - 1 && o.column - 1 <= r.end ? (m = r.start + 1, b = r.end + 1) : c && c.wordType === 1 && c.start <= o.column - 1 && o.column - 1 <= c.end ? (m = c.start + 1, b = c.end + 1) : (r ? m = r.end + 1 : m = 1, c ? b = c.start + 1 : b = t.getLineMaxColumn(o.lineNumber)), new hn(new I(o.lineNumber, m, o.lineNumber, b), 1, 0, new Y(o.lineNumber, b), 0); } - let c, d; - l && l.wordType === 1 && l.start < o.column - 1 && o.column - 1 < l.end ? (c = l.start + 1, d = l.end + 1) : a && a.wordType === 1 && a.start < o.column - 1 && o.column - 1 < a.end ? (c = a.start + 1, d = a.end + 1) : (c = o.column, d = o.column); + let d, a; + r && r.wordType === 1 && r.start < o.column - 1 && o.column - 1 < r.end ? (d = r.start + 1, a = r.end + 1) : c && c.wordType === 1 && c.start < o.column - 1 && o.column - 1 < c.end ? (d = c.start + 1, a = c.end + 1) : (d = o.column, a = o.column); const h = o.lineNumber; let u; if (i.selectionStart.containsPosition(o)) u = i.selectionStart.endColumn; else if (o.isBeforeOrEqual(i.selectionStart.getStartPosition())) { - u = c; - const g = new V(h, u); - i.selectionStart.containsPosition(g) && (u = i.selectionStart.endColumn); - } else { u = d; - const g = new V(h, u); - i.selectionStart.containsPosition(g) && (u = i.selectionStart.startColumn); + const m = new Y(h, u); + i.selectionStart.containsPosition(m) && (u = i.selectionStart.endColumn); + } else { + u = a; + const m = new Y(h, u); + i.selectionStart.containsPosition(m) && (u = i.selectionStart.startColumn); } return i.move(!0, h, u, 0); } } -class H_ extends bt { +class rx extends Zt { static deleteWordPartLeft(e) { - const t = eS([ - bt.deleteWordLeft( + const t = m1([ + Zt.deleteWordLeft( e, 0 /* WordNavigationType.WordStart */ ), - bt.deleteWordLeft( + Zt.deleteWordLeft( e, 2 /* WordNavigationType.WordEnd */ ), - bt._deleteWordPartLeft(e.model, e.selection) + Zt._deleteWordPartLeft(e.model, e.selection) ]); - return t.sort(M.compareRangesUsingEnds), t[2]; + return t.sort(I.compareRangesUsingEnds), t[2]; } static deleteWordPartRight(e) { - const t = eS([ - bt.deleteWordRight( + const t = m1([ + Zt.deleteWordRight( e, 0 /* WordNavigationType.WordStart */ ), - bt.deleteWordRight( + Zt.deleteWordRight( e, 2 /* WordNavigationType.WordEnd */ ), - bt._deleteWordPartRight(e.model, e.selection) + Zt._deleteWordPartRight(e.model, e.selection) ]); - return t.sort(M.compareRangesUsingStarts), t[0]; + return t.sort(I.compareRangesUsingStarts), t[0]; } static moveWordPartLeft(e, t, i, n) { - const o = eS([ - bt.moveWordLeft(e, t, i, 0, n), - bt.moveWordLeft(e, t, i, 2, n), - bt._moveWordPartLeft(t, i) + const o = m1([ + Zt.moveWordLeft(e, t, i, 0, n), + Zt.moveWordLeft(e, t, i, 2, n), + Zt._moveWordPartLeft(t, i) ]); - return o.sort(V.compare), o[2]; + return o.sort(Y.compare), o[2]; } static moveWordPartRight(e, t, i) { - const n = eS([ - bt.moveWordRight( + const n = m1([ + Zt.moveWordRight( e, t, i, 0 /* WordNavigationType.WordStart */ ), - bt.moveWordRight( + Zt.moveWordRight( e, t, i, 2 /* WordNavigationType.WordEnd */ ), - bt._moveWordPartRight(t, i) + Zt._moveWordPartRight(t, i) ]); - return n.sort(V.compare), n[0]; + return n.sort(Y.compare), n[0]; } } -function eS(s) { +function m1(s) { return s.filter((e) => !!e); } -class cn { +class an { static addCursorDown(e, t, i) { const n = []; let o = 0; - for (let r = 0, l = t.length; r < l; r++) { - const a = t[r]; - n[o++] = new dt(a.modelState, a.viewState), i ? n[o++] = dt.fromModelState(Ct.translateDown(e.cursorConfig, e.model, a.modelState)) : n[o++] = dt.fromViewState(Ct.translateDown(e.cursorConfig, e, a.viewState)); + for (let l = 0, r = t.length; l < r; l++) { + const c = t[l]; + n[o++] = new at(c.modelState, c.viewState), i ? n[o++] = at.fromModelState(Wt.translateDown(e.cursorConfig, e.model, c.modelState)) : n[o++] = at.fromViewState(Wt.translateDown(e.cursorConfig, e, c.viewState)); } return n; } static addCursorUp(e, t, i) { const n = []; let o = 0; - for (let r = 0, l = t.length; r < l; r++) { - const a = t[r]; - n[o++] = new dt(a.modelState, a.viewState), i ? n[o++] = dt.fromModelState(Ct.translateUp(e.cursorConfig, e.model, a.modelState)) : n[o++] = dt.fromViewState(Ct.translateUp(e.cursorConfig, e, a.viewState)); + for (let l = 0, r = t.length; l < r; l++) { + const c = t[l]; + n[o++] = new at(c.modelState, c.viewState), i ? n[o++] = at.fromModelState(Wt.translateUp(e.cursorConfig, e.model, c.modelState)) : n[o++] = at.fromViewState(Wt.translateUp(e.cursorConfig, e, c.viewState)); } return n; } static moveToBeginningOfLine(e, t, i) { const n = []; - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o]; - n[o] = this._moveToLineStart(e, l, i); + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o]; + n[o] = this._moveToLineStart(e, r, i); } return n; } static _moveToLineStart(e, t, i) { - const n = t.viewState.position.column, o = t.modelState.position.column, r = n === o, l = t.viewState.position.lineNumber, a = e.getLineFirstNonWhitespaceColumn(l); - return !r && !(n === a) ? this._moveToLineStartByView(e, t, i) : this._moveToLineStartByModel(e, t, i); + const n = t.viewState.position.column, o = t.modelState.position.column, l = n === o, r = t.viewState.position.lineNumber, c = e.getLineFirstNonWhitespaceColumn(r); + return !l && !(n === c) ? this._moveToLineStartByView(e, t, i) : this._moveToLineStartByModel(e, t, i); } static _moveToLineStartByView(e, t, i) { - return dt.fromViewState(Ct.moveToBeginningOfLine(e.cursorConfig, e, t.viewState, i)); + return at.fromViewState(Wt.moveToBeginningOfLine(e.cursorConfig, e, t.viewState, i)); } static _moveToLineStartByModel(e, t, i) { - return dt.fromModelState(Ct.moveToBeginningOfLine(e.cursorConfig, e.model, t.modelState, i)); + return at.fromModelState(Wt.moveToBeginningOfLine(e.cursorConfig, e.model, t.modelState, i)); } static moveToEndOfLine(e, t, i, n) { const o = []; - for (let r = 0, l = t.length; r < l; r++) { - const a = t[r]; - o[r] = this._moveToLineEnd(e, a, i, n); + for (let l = 0, r = t.length; l < r; l++) { + const c = t[l]; + o[l] = this._moveToLineEnd(e, c, i, n); } return o; } static _moveToLineEnd(e, t, i, n) { - const o = t.viewState.position, r = e.getLineMaxColumn(o.lineNumber), l = o.column === r, a = t.modelState.position, c = e.model.getLineMaxColumn(a.lineNumber), d = r - o.column === c - a.column; - return l || d ? this._moveToLineEndByModel(e, t, i, n) : this._moveToLineEndByView(e, t, i, n); + const o = t.viewState.position, l = e.getLineMaxColumn(o.lineNumber), r = o.column === l, c = t.modelState.position, d = e.model.getLineMaxColumn(c.lineNumber), a = l - o.column === d - c.column; + return r || a ? this._moveToLineEndByModel(e, t, i, n) : this._moveToLineEndByView(e, t, i, n); } static _moveToLineEndByView(e, t, i, n) { - return dt.fromViewState(Ct.moveToEndOfLine(e.cursorConfig, e, t.viewState, i, n)); + return at.fromViewState(Wt.moveToEndOfLine(e.cursorConfig, e, t.viewState, i, n)); } static _moveToLineEndByModel(e, t, i, n) { - return dt.fromModelState(Ct.moveToEndOfLine(e.cursorConfig, e.model, t.modelState, i, n)); + return at.fromModelState(Wt.moveToEndOfLine(e.cursorConfig, e.model, t.modelState, i, n)); } static expandLineSelection(e, t) { const i = []; for (let n = 0, o = t.length; n < o; n++) { - const r = t[n], l = r.modelState.selection.startLineNumber, a = e.model.getLineCount(); - let c = r.modelState.selection.endLineNumber, d; - c === a ? d = e.model.getLineMaxColumn(a) : (c++, d = 1), i[n] = dt.fromModelState(new dn(new M(l, 1, l, 1), 0, 0, new V(c, d), 0)); + const l = t[n], r = l.modelState.selection.startLineNumber, c = e.model.getLineCount(); + let d = l.modelState.selection.endLineNumber, a; + d === c ? a = e.model.getLineMaxColumn(c) : (d++, a = 1), i[n] = at.fromModelState(new hn(new I(r, 1, r, 1), 0, 0, new Y(d, a), 0)); } return i; } static moveToBeginningOfBuffer(e, t, i) { const n = []; - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o]; - n[o] = dt.fromModelState(Ct.moveToBeginningOfBuffer(e.cursorConfig, e.model, l.modelState, i)); + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o]; + n[o] = at.fromModelState(Wt.moveToBeginningOfBuffer(e.cursorConfig, e.model, r.modelState, i)); } return n; } static moveToEndOfBuffer(e, t, i) { const n = []; - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o]; - n[o] = dt.fromModelState(Ct.moveToEndOfBuffer(e.cursorConfig, e.model, l.modelState, i)); + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o]; + n[o] = at.fromModelState(Wt.moveToEndOfBuffer(e.cursorConfig, e.model, r.modelState, i)); } return n; } static selectAll(e, t) { const i = e.model.getLineCount(), n = e.model.getLineMaxColumn(i); - return dt.fromModelState(new dn(new M(1, 1, 1, 1), 0, 0, new V(i, n), 0)); + return at.fromModelState(new hn(new I(1, 1, 1, 1), 0, 0, new Y(i, n), 0)); } static line(e, t, i, n, o) { - const r = e.model.validatePosition(n), l = o ? e.coordinatesConverter.validateViewPosition(new V(o.lineNumber, o.column), r) : e.coordinatesConverter.convertModelPositionToViewPosition(r); + const l = e.model.validatePosition(n), r = o ? e.coordinatesConverter.validateViewPosition(new Y(o.lineNumber, o.column), l) : e.coordinatesConverter.convertModelPositionToViewPosition(l); if (!i) { - const c = e.model.getLineCount(); - let d = r.lineNumber + 1, h = 1; - return d > c && (d = c, h = e.model.getLineMaxColumn(d)), dt.fromModelState(new dn(new M(r.lineNumber, 1, d, h), 2, 0, new V(d, h), 0)); - } - const a = t.modelState.selectionStart.getStartPosition().lineNumber; - if (r.lineNumber < a) - return dt.fromViewState(t.viewState.move(!0, l.lineNumber, 1, 0)); - if (r.lineNumber > a) { - const c = e.getLineCount(); - let d = l.lineNumber + 1, h = 1; - return d > c && (d = c, h = e.getLineMaxColumn(d)), dt.fromViewState(t.viewState.move(!0, d, h, 0)); + const d = e.model.getLineCount(); + let a = l.lineNumber + 1, h = 1; + return a > d && (a = d, h = e.model.getLineMaxColumn(a)), at.fromModelState(new hn(new I(l.lineNumber, 1, a, h), 2, 0, new Y(a, h), 0)); + } + const c = t.modelState.selectionStart.getStartPosition().lineNumber; + if (l.lineNumber < c) + return at.fromViewState(t.viewState.move(!0, r.lineNumber, 1, 0)); + if (l.lineNumber > c) { + const d = e.getLineCount(); + let a = r.lineNumber + 1, h = 1; + return a > d && (a = d, h = e.getLineMaxColumn(a)), at.fromViewState(t.viewState.move(!0, a, h, 0)); } else { - const c = t.modelState.selectionStart.getEndPosition(); - return dt.fromModelState(t.modelState.move(!0, c.lineNumber, c.column, 0)); + const d = t.modelState.selectionStart.getEndPosition(); + return at.fromModelState(t.modelState.move(!0, d.lineNumber, d.column, 0)); } } static word(e, t, i, n) { const o = e.model.validatePosition(n); - return dt.fromModelState(bt.word(e.cursorConfig, e.model, t.modelState, i, o)); + return at.fromModelState(Zt.word(e.cursorConfig, e.model, t.modelState, i, o)); } static cancelSelection(e, t) { if (!t.modelState.hasSelection()) - return new dt(t.modelState, t.viewState); + return new at(t.modelState, t.viewState); const i = t.viewState.position.lineNumber, n = t.viewState.position.column; - return dt.fromViewState(new dn(new M(i, n, i, n), 0, 0, new V(i, n), 0)); + return at.fromViewState(new hn(new I(i, n, i, n), 0, 0, new Y(i, n), 0)); } static moveTo(e, t, i, n, o) { if (i) { @@ -10537,23 +10537,23 @@ class cn { if (t.modelState.selectionStartKind === 2) return this.line(e, t, i, n, o); } - const r = e.model.validatePosition(n), l = o ? e.coordinatesConverter.validateViewPosition(new V(o.lineNumber, o.column), r) : e.coordinatesConverter.convertModelPositionToViewPosition(r); - return dt.fromViewState(t.viewState.move(i, l.lineNumber, l.column, 0)); + const l = e.model.validatePosition(n), r = o ? e.coordinatesConverter.validateViewPosition(new Y(o.lineNumber, o.column), l) : e.coordinatesConverter.convertModelPositionToViewPosition(l); + return at.fromViewState(t.viewState.move(i, r.lineNumber, r.column, 0)); } - static simpleMove(e, t, i, n, o, r) { + static simpleMove(e, t, i, n, o, l) { switch (i) { case 0: - return r === 4 ? this._moveHalfLineLeft(e, t, n) : this._moveLeft(e, t, n, o); + return l === 4 ? this._moveHalfLineLeft(e, t, n) : this._moveLeft(e, t, n, o); case 1: - return r === 4 ? this._moveHalfLineRight(e, t, n) : this._moveRight(e, t, n, o); + return l === 4 ? this._moveHalfLineRight(e, t, n) : this._moveRight(e, t, n, o); case 2: - return r === 2 ? this._moveUpByViewLines(e, t, n, o) : this._moveUpByModelLines(e, t, n, o); + return l === 2 ? this._moveUpByViewLines(e, t, n, o) : this._moveUpByModelLines(e, t, n, o); case 3: - return r === 2 ? this._moveDownByViewLines(e, t, n, o) : this._moveDownByModelLines(e, t, n, o); + return l === 2 ? this._moveDownByViewLines(e, t, n, o) : this._moveDownByModelLines(e, t, n, o); case 4: - return r === 2 ? t.map((l) => dt.fromViewState(Ct.moveToPrevBlankLine(e.cursorConfig, e, l.viewState, n))) : t.map((l) => dt.fromModelState(Ct.moveToPrevBlankLine(e.cursorConfig, e.model, l.modelState, n))); + return l === 2 ? t.map((r) => at.fromViewState(Wt.moveToPrevBlankLine(e.cursorConfig, e, r.viewState, n))) : t.map((r) => at.fromModelState(Wt.moveToPrevBlankLine(e.cursorConfig, e.model, r.modelState, n))); case 5: - return r === 2 ? t.map((l) => dt.fromViewState(Ct.moveToNextBlankLine(e.cursorConfig, e, l.viewState, n))) : t.map((l) => dt.fromModelState(Ct.moveToNextBlankLine(e.cursorConfig, e.model, l.modelState, n))); + return l === 2 ? t.map((r) => at.fromViewState(Wt.moveToNextBlankLine(e.cursorConfig, e, r.viewState, n))) : t.map((r) => at.fromModelState(Wt.moveToNextBlankLine(e.cursorConfig, e.model, r.modelState, n))); case 6: return this._moveToViewMinColumn(e, t, n); case 7: @@ -10569,27 +10569,27 @@ class cn { } } static viewportMove(e, t, i, n, o) { - const r = e.getCompletelyVisibleViewRange(), l = e.coordinatesConverter.convertViewRangeToModelRange(r); + const l = e.getCompletelyVisibleViewRange(), r = e.coordinatesConverter.convertViewRangeToModelRange(l); switch (i) { case 11: { - const a = this._firstLineNumberInRange(e.model, l, o), c = e.model.getLineFirstNonWhitespaceColumn(a); - return [this._moveToModelPosition(e, t[0], n, a, c)]; + const c = this._firstLineNumberInRange(e.model, r, o), d = e.model.getLineFirstNonWhitespaceColumn(c); + return [this._moveToModelPosition(e, t[0], n, c, d)]; } case 13: { - const a = this._lastLineNumberInRange(e.model, l, o), c = e.model.getLineFirstNonWhitespaceColumn(a); - return [this._moveToModelPosition(e, t[0], n, a, c)]; + const c = this._lastLineNumberInRange(e.model, r, o), d = e.model.getLineFirstNonWhitespaceColumn(c); + return [this._moveToModelPosition(e, t[0], n, c, d)]; } case 12: { - const a = Math.round((l.startLineNumber + l.endLineNumber) / 2), c = e.model.getLineFirstNonWhitespaceColumn(a); - return [this._moveToModelPosition(e, t[0], n, a, c)]; + const c = Math.round((r.startLineNumber + r.endLineNumber) / 2), d = e.model.getLineFirstNonWhitespaceColumn(c); + return [this._moveToModelPosition(e, t[0], n, c, d)]; } case 14: { - const a = []; - for (let c = 0, d = t.length; c < d; c++) { - const h = t[c]; - a[c] = this.findPositionInViewportIfOutside(e, h, r, n); + const c = []; + for (let d = 0, a = t.length; d < a; d++) { + const h = t[d]; + c[d] = this.findPositionInViewportIfOutside(e, h, l, n); } - return a; + return c; } default: return null; @@ -10598,12 +10598,12 @@ class cn { static findPositionInViewportIfOutside(e, t, i, n) { const o = t.viewState.position.lineNumber; if (i.startLineNumber <= o && o <= i.endLineNumber - 1) - return new dt(t.modelState, t.viewState); + return new at(t.modelState, t.viewState); { - let r; - o > i.endLineNumber - 1 ? r = i.endLineNumber - 1 : o < i.startLineNumber ? r = i.startLineNumber : r = o; - const l = Ct.vertical(e.cursorConfig, e, o, t.viewState.position.column, t.viewState.leftoverVisibleColumns, r, !1); - return dt.fromViewState(t.viewState.move(n, l.lineNumber, l.column, l.leftoverVisibleColumns)); + let l; + o > i.endLineNumber - 1 ? l = i.endLineNumber - 1 : o < i.startLineNumber ? l = i.startLineNumber : l = o; + const r = Wt.vertical(e.cursorConfig, e, o, t.viewState.position.column, t.viewState.leftoverVisibleColumns, l, !1); + return at.fromViewState(t.viewState.move(n, r.lineNumber, r.column, r.leftoverVisibleColumns)); } } /** @@ -10621,113 +10621,113 @@ class cn { return t.startColumn !== e.getLineMinColumn(n) && n++, Math.max(n, t.endLineNumber - i + 1); } static _moveLeft(e, t, i, n) { - return t.map((o) => dt.fromViewState(Ct.moveLeft(e.cursorConfig, e, o.viewState, i, n))); + return t.map((o) => at.fromViewState(Wt.moveLeft(e.cursorConfig, e, o.viewState, i, n))); } static _moveHalfLineLeft(e, t, i) { const n = []; - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o], a = l.viewState.position.lineNumber, c = Math.round(e.getLineLength(a) / 2); - n[o] = dt.fromViewState(Ct.moveLeft(e.cursorConfig, e, l.viewState, i, c)); + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o], c = r.viewState.position.lineNumber, d = Math.round(e.getLineLength(c) / 2); + n[o] = at.fromViewState(Wt.moveLeft(e.cursorConfig, e, r.viewState, i, d)); } return n; } static _moveRight(e, t, i, n) { - return t.map((o) => dt.fromViewState(Ct.moveRight(e.cursorConfig, e, o.viewState, i, n))); + return t.map((o) => at.fromViewState(Wt.moveRight(e.cursorConfig, e, o.viewState, i, n))); } static _moveHalfLineRight(e, t, i) { const n = []; - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o], a = l.viewState.position.lineNumber, c = Math.round(e.getLineLength(a) / 2); - n[o] = dt.fromViewState(Ct.moveRight(e.cursorConfig, e, l.viewState, i, c)); + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o], c = r.viewState.position.lineNumber, d = Math.round(e.getLineLength(c) / 2); + n[o] = at.fromViewState(Wt.moveRight(e.cursorConfig, e, r.viewState, i, d)); } return n; } static _moveDownByViewLines(e, t, i, n) { const o = []; - for (let r = 0, l = t.length; r < l; r++) { - const a = t[r]; - o[r] = dt.fromViewState(Ct.moveDown(e.cursorConfig, e, a.viewState, i, n)); + for (let l = 0, r = t.length; l < r; l++) { + const c = t[l]; + o[l] = at.fromViewState(Wt.moveDown(e.cursorConfig, e, c.viewState, i, n)); } return o; } static _moveDownByModelLines(e, t, i, n) { const o = []; - for (let r = 0, l = t.length; r < l; r++) { - const a = t[r]; - o[r] = dt.fromModelState(Ct.moveDown(e.cursorConfig, e.model, a.modelState, i, n)); + for (let l = 0, r = t.length; l < r; l++) { + const c = t[l]; + o[l] = at.fromModelState(Wt.moveDown(e.cursorConfig, e.model, c.modelState, i, n)); } return o; } static _moveUpByViewLines(e, t, i, n) { const o = []; - for (let r = 0, l = t.length; r < l; r++) { - const a = t[r]; - o[r] = dt.fromViewState(Ct.moveUp(e.cursorConfig, e, a.viewState, i, n)); + for (let l = 0, r = t.length; l < r; l++) { + const c = t[l]; + o[l] = at.fromViewState(Wt.moveUp(e.cursorConfig, e, c.viewState, i, n)); } return o; } static _moveUpByModelLines(e, t, i, n) { const o = []; - for (let r = 0, l = t.length; r < l; r++) { - const a = t[r]; - o[r] = dt.fromModelState(Ct.moveUp(e.cursorConfig, e.model, a.modelState, i, n)); + for (let l = 0, r = t.length; l < r; l++) { + const c = t[l]; + o[l] = at.fromModelState(Wt.moveUp(e.cursorConfig, e.model, c.modelState, i, n)); } return o; } static _moveToViewPosition(e, t, i, n, o) { - return dt.fromViewState(t.viewState.move(i, n, o, 0)); + return at.fromViewState(t.viewState.move(i, n, o, 0)); } static _moveToModelPosition(e, t, i, n, o) { - return dt.fromModelState(t.modelState.move(i, n, o, 0)); + return at.fromModelState(t.modelState.move(i, n, o, 0)); } static _moveToViewMinColumn(e, t, i) { const n = []; - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o], a = l.viewState.position.lineNumber, c = e.getLineMinColumn(a); - n[o] = this._moveToViewPosition(e, l, i, a, c); + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o], c = r.viewState.position.lineNumber, d = e.getLineMinColumn(c); + n[o] = this._moveToViewPosition(e, r, i, c, d); } return n; } static _moveToViewFirstNonWhitespaceColumn(e, t, i) { const n = []; - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o], a = l.viewState.position.lineNumber, c = e.getLineFirstNonWhitespaceColumn(a); - n[o] = this._moveToViewPosition(e, l, i, a, c); + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o], c = r.viewState.position.lineNumber, d = e.getLineFirstNonWhitespaceColumn(c); + n[o] = this._moveToViewPosition(e, r, i, c, d); } return n; } static _moveToViewCenterColumn(e, t, i) { const n = []; - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o], a = l.viewState.position.lineNumber, c = Math.round((e.getLineMaxColumn(a) + e.getLineMinColumn(a)) / 2); - n[o] = this._moveToViewPosition(e, l, i, a, c); + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o], c = r.viewState.position.lineNumber, d = Math.round((e.getLineMaxColumn(c) + e.getLineMinColumn(c)) / 2); + n[o] = this._moveToViewPosition(e, r, i, c, d); } return n; } static _moveToViewMaxColumn(e, t, i) { const n = []; - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o], a = l.viewState.position.lineNumber, c = e.getLineMaxColumn(a); - n[o] = this._moveToViewPosition(e, l, i, a, c); + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o], c = r.viewState.position.lineNumber, d = e.getLineMaxColumn(c); + n[o] = this._moveToViewPosition(e, r, i, c, d); } return n; } static _moveToViewLastNonWhitespaceColumn(e, t, i) { const n = []; - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o], a = l.viewState.position.lineNumber, c = e.getLineLastNonWhitespaceColumn(a); - n[o] = this._moveToViewPosition(e, l, i, a, c); + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o], c = r.viewState.position.lineNumber, d = e.getLineLastNonWhitespaceColumn(c); + n[o] = this._moveToViewPosition(e, r, i, c, d); } return n; } } -var bA; +var TV; (function(s) { const e = function(i) { - if (!tn(i)) + if (!nn(i)) return !1; const n = i; - return !(!Vs(n.to) || !jn(n.select) && !uH(n.select) || !jn(n.by) && !Vs(n.by) || !jn(n.value) && !Mh(n.value)); + return !(!vs(n.to) || !$n(n.select) && !_P(n.select) || !$n(n.by) && !vs(n.by) || !$n(n.value) && !Rh(n.value)); }; s.metadata = { description: "Move cursor to a logical position in the view", @@ -10872,12 +10872,12 @@ var bA; }; } s.parse = t; -})(bA || (bA = {})); +})(TV || (TV = {})); var Ei; (function(s) { s[s.None = 0] = "None", s[s.Indent = 1] = "Indent", s[s.IndentOutdent = 2] = "IndentOutdent", s[s.Outdent = 3] = "Outdent"; })(Ei || (Ei = {})); -class TN { +class _C { constructor(e) { if (this._neutralCharacter = null, this._neutralCharacterSearched = !1, this.open = e.open, this.close = e.close, this._inString = !0, this._inComment = !0, this._inRegEx = !0, Array.isArray(e.notIn)) for (let t = 0, i = e.notIn.length; t < i; t++) @@ -10938,26 +10938,26 @@ class TN { ))), this._neutralCharacter; } } -class tee { +class Bee { constructor(e) { this.autoClosingPairsOpenByStart = /* @__PURE__ */ new Map(), this.autoClosingPairsOpenByEnd = /* @__PURE__ */ new Map(), this.autoClosingPairsCloseByStart = /* @__PURE__ */ new Map(), this.autoClosingPairsCloseByEnd = /* @__PURE__ */ new Map(), this.autoClosingPairsCloseSingleChar = /* @__PURE__ */ new Map(); for (const t of e) - V0(this.autoClosingPairsOpenByStart, t.open.charAt(0), t), V0(this.autoClosingPairsOpenByEnd, t.open.charAt(t.open.length - 1), t), V0(this.autoClosingPairsCloseByStart, t.close.charAt(0), t), V0(this.autoClosingPairsCloseByEnd, t.close.charAt(t.close.length - 1), t), t.close.length === 1 && t.open.length === 1 && V0(this.autoClosingPairsCloseSingleChar, t.close, t); + F0(this.autoClosingPairsOpenByStart, t.open.charAt(0), t), F0(this.autoClosingPairsOpenByEnd, t.open.charAt(t.open.length - 1), t), F0(this.autoClosingPairsCloseByStart, t.close.charAt(0), t), F0(this.autoClosingPairsCloseByEnd, t.close.charAt(t.close.length - 1), t), t.close.length === 1 && t.open.length === 1 && F0(this.autoClosingPairsCloseSingleChar, t.close, t); } } -function V0(s, e, t) { +function F0(s, e, t) { s.has(e) ? s.get(e).push(t) : s.set(e, [t]); } -const yA = "`~!@#$%^&*()-=+[{]}\\|;:'\",.<>/?"; -function iee(s = "") { +const MV = "`~!@#$%^&*()-=+[{]}\\|;:'\",.<>/?"; +function _ee(s = "") { let e = "(-?\\d*\\.\\d\\w*)|([^"; - for (const t of yA) + for (const t of MV) s.indexOf(t) >= 0 || (e += "\\" + t); return e += "\\s]+)", new RegExp(e, "g"); } -const yE = iee(); -function wE(s) { - let e = yE; +const Av = _ee(); +function Kv(s) { + let e = Av; if (s && s instanceof RegExp) if (s.global) e = s; @@ -10967,38 +10967,38 @@ function wE(s) { } return e.lastIndex = 0, e; } -const SJ = new cs(); -SJ.unshift({ +const n_ = new hs(); +n_.unshift({ maxLen: 1e3, windowSize: 15, timeBudget: 150 }); -function Gw(s, e, t, i, n) { - if (e = wE(e), n || (n = nt.first(SJ)), t.length > n.maxLen) { - let c = s - n.maxLen / 2; - return c < 0 ? c = 0 : i += c, t = t.substring(c, s + n.maxLen / 2), Gw(s, e, t, i, n); - } - const o = Date.now(), r = s - 1 - i; - let l = -1, a = null; - for (let c = 1; !(Date.now() - o >= n.timeBudget); c++) { - const d = r - n.windowSize * c; - e.lastIndex = Math.max(0, d); - const h = nee(e, t, r, l); - if (!h && a || (a = h, d <= 0)) +function _y(s, e, t, i, n) { + if (e = Kv(e), n || (n = nt.first(n_)), t.length > n.maxLen) { + let d = s - n.maxLen / 2; + return d < 0 ? d = 0 : i += d, t = t.substring(d, s + n.maxLen / 2), _y(s, e, t, i, n); + } + const o = Date.now(), l = s - 1 - i; + let r = -1, c = null; + for (let d = 1; !(Date.now() - o >= n.timeBudget); d++) { + const a = l - n.windowSize * d; + e.lastIndex = Math.max(0, a); + const h = Qee(e, t, l, r); + if (!h && c || (c = h, a <= 0)) break; - l = d; + r = a; } - if (a) { - const c = { - word: a[0], - startColumn: i + 1 + a.index, - endColumn: i + 1 + a.index + a[0].length + if (c) { + const d = { + word: c[0], + startColumn: i + 1 + c.index, + endColumn: i + 1 + c.index + c[0].length }; - return e.lastIndex = 0, c; + return e.lastIndex = 0, d; } return null; } -function nee(s, e, t, i) { +function Qee(s, e, t, i) { let n; for (; n = s.exec(e); ) { const o = n.index || 0; @@ -11009,13 +11009,13 @@ function nee(s, e, t, i) { } return null; } -const rf = class rf { +const ug = class ug { constructor(e) { - if (e.autoClosingPairs ? this._autoClosingPairs = e.autoClosingPairs.map((t) => new TN(t)) : e.brackets ? this._autoClosingPairs = e.brackets.map((t) => new TN({ open: t[0], close: t[1] })) : this._autoClosingPairs = [], e.__electricCharacterSupport && e.__electricCharacterSupport.docComment) { + if (e.autoClosingPairs ? this._autoClosingPairs = e.autoClosingPairs.map((t) => new _C(t)) : e.brackets ? this._autoClosingPairs = e.brackets.map((t) => new _C({ open: t[0], close: t[1] })) : this._autoClosingPairs = [], e.__electricCharacterSupport && e.__electricCharacterSupport.docComment) { const t = e.__electricCharacterSupport.docComment; - this._autoClosingPairs.push(new TN({ open: t.open, close: t.close || "" })); + this._autoClosingPairs.push(new _C({ open: t.open, close: t.close || "" })); } - this._autoCloseBeforeForQuotes = typeof e.autoCloseBefore == "string" ? e.autoCloseBefore : rf.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_QUOTES, this._autoCloseBeforeForBrackets = typeof e.autoCloseBefore == "string" ? e.autoCloseBefore : rf.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_BRACKETS, this._surroundingPairs = e.surroundingPairs || this._autoClosingPairs; + this._autoCloseBeforeForQuotes = typeof e.autoCloseBefore == "string" ? e.autoCloseBefore : ug.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_QUOTES, this._autoCloseBeforeForBrackets = typeof e.autoCloseBefore == "string" ? e.autoCloseBefore : ug.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_BRACKETS, this._surroundingPairs = e.surroundingPairs || this._autoClosingPairs; } getAutoClosingPairs() { return this._autoClosingPairs; @@ -11027,19 +11027,19 @@ const rf = class rf { return this._surroundingPairs; } }; -rf.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_QUOTES = `;:.,=}])> - `, rf.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_BRACKETS = `'"\`;:.,=}])> +ug.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_QUOTES = `;:.,=}])> + `, ug.DEFAULT_AUTOCLOSE_BEFORE_LANGUAGE_DEFINED_BRACKETS = `'"\`;:.,=}])> `; -let X2 = rf; -function er(s, e = 0) { +let lw = ug; +function il(s, e = 0) { return s[s.length - (1 + e)]; } -function see(s) { +function Oee(s) { if (s.length === 0) throw new Error("Invalid tail call"); return [s.slice(0, s.length - 1), s[s.length - 1]]; } -function ei(s, e, t = (i, n) => i === n) { +function ti(s, e, t = (i, n) => i === n) { if (s === e) return !0; if (!s || !e || s.length !== e.length) @@ -11049,14 +11049,14 @@ function ei(s, e, t = (i, n) => i === n) { return !1; return !0; } -function oee(s, e) { +function jee(s, e) { const t = s.length - 1; e < t && (s[e] = s[t]), s.pop(); } -function Rw(s, e, t) { - return ree(s.length, (i) => t(s[i], e)); +function Qy(s, e, t) { + return qee(s.length, (i) => t(s[i], e)); } -function ree(s, e) { +function qee(s, e) { let t = 0, i = s - 1; for (; t <= i; ) { const n = (t + i) / 2 | 0, o = e(n); @@ -11069,63 +11069,63 @@ function ree(s, e) { } return -(t + 1); } -function F2(s, e, t) { +function rw(s, e, t) { if (s = s | 0, s >= e.length) throw new TypeError("invalid index"); - const i = e[Math.floor(e.length * Math.random())], n = [], o = [], r = []; - for (const l of e) { - const a = t(l, i); - a < 0 ? n.push(l) : a > 0 ? o.push(l) : r.push(l); + const i = e[Math.floor(e.length * Math.random())], n = [], o = [], l = []; + for (const r of e) { + const c = t(r, i); + c < 0 ? n.push(r) : c > 0 ? o.push(r) : l.push(r); } - return s < n.length ? F2(s, n, t) : s < n.length + r.length ? r[0] : F2(s - (n.length + r.length), o, t); + return s < n.length ? rw(s, n, t) : s < n.length + l.length ? l[0] : rw(s - (n.length + l.length), o, t); } -function uF(s, e) { +function JD(s, e) { const t = []; let i; for (const n of s.slice(0).sort(e)) !i || e(i[0], n) !== 0 ? (i = [n], t.push(i)) : i.push(n); return t; } -function* CE(s, e) { +function* Uv(s, e) { let t, i; for (const n of s) i !== void 0 && e(i, n) ? t.push(n) : (t && (yield t), t = [n]), i = n; t && (yield t); } -function LJ(s, e) { +function s_(s, e) { for (let t = 0; t <= s.length; t++) e(t === 0 ? void 0 : s[t - 1], t === s.length ? void 0 : s[t]); } -function lee(s, e) { +function $ee(s, e) { for (let t = 0; t < s.length; t++) e(t === 0 ? void 0 : s[t - 1], s[t], t + 1 === s.length ? void 0 : s[t + 1]); } -function Or(s) { +function _l(s) { return s.filter((e) => !!e); } -function gF(s) { +function HD(s) { let e = 0; for (let t = 0; t < s.length; t++) s[t] && (s[e] = s[t], e += 1); s.length = e; } -function AJ(s) { +function o_(s) { return !Array.isArray(s) || s.length === 0; } -function $n(s) { +function ts(s) { return Array.isArray(s) && s.length > 0; } -function Oc(s, e = (t) => t) { +function Qd(s, e = (t) => t) { const t = /* @__PURE__ */ new Set(); return s.filter((i) => { const n = e(i); return t.has(n) ? !1 : (t.add(n), !0); }); } -function SE(s, e) { +function Pv(s, e) { return s.length > 0 ? s[0] : e; } -function Ns(s, e) { +function ws(s, e) { let t = typeof e == "number" ? s : 0; typeof e == "number" ? t = s : (t = 0, e = s); const i = []; @@ -11137,42 +11137,42 @@ function Ns(s, e) { i.push(n); return i; } -function J_(s, e, t) { +function cx(s, e, t) { const i = s.slice(0, e), n = s.slice(e); return i.concat(t, n); } -function DN(s, e) { +function QC(s, e) { const t = s.indexOf(e); t > -1 && (s.splice(t, 1), s.unshift(e)); } -function tS(s, e) { +function b1(s, e) { const t = s.indexOf(e); t > -1 && (s.splice(t, 1), s.push(e)); } -function Y2(s, e) { +function cw(s, e) { for (const t of e) s.push(t); } -function LE(s) { +function Bv(s) { return Array.isArray(s) ? s : [s]; } -function aee(s, e, t) { - const i = xJ(s, e), n = s.length, o = t.length; +function ete(s, e, t) { + const i = l_(s, e), n = s.length, o = t.length; s.length = n + o; - for (let r = n - 1; r >= i; r--) - s[r + o] = s[r]; - for (let r = 0; r < o; r++) - s[r + i] = t[r]; + for (let l = n - 1; l >= i; l--) + s[l + o] = s[l]; + for (let l = 0; l < o; l++) + s[l + i] = t[l]; } -function mF(s, e, t, i) { - const n = xJ(s, e); +function ED(s, e, t, i) { + const n = l_(s, e); let o = s.splice(n, t); - return o === void 0 && (o = []), aee(s, n, i), o; + return o === void 0 && (o = []), ete(s, n, i), o; } -function xJ(s, e) { +function l_(s, e) { return e < 0 ? Math.max(e + s.length, 0) : Math.min(e, s.length); } -var Ew; +var Oy; (function(s) { function e(o) { return o < 0; @@ -11190,25 +11190,25 @@ var Ew; return o === 0; } s.isNeitherLessOrGreaterThan = n, s.greaterThan = 1, s.lessThan = -1, s.neitherLessOrGreaterThan = 0; -})(Ew || (Ew = {})); -function gs(s, e) { +})(Oy || (Oy = {})); +function ps(s, e) { return (t, i) => e(s(t), s(i)); } -function cee(...s) { +function tte(...s) { return (e, t) => { for (const i of s) { const n = i(e, t); - if (!Ew.isNeitherLessOrGreaterThan(n)) + if (!Oy.isNeitherLessOrGreaterThan(n)) return n; } - return Ew.neitherLessOrGreaterThan; + return Oy.neitherLessOrGreaterThan; }; } -const zr = (s, e) => s - e, dee = (s, e) => zr(s ? 1 : 0, e ? 1 : 0); -function MJ(s) { +const Ul = (s, e) => s - e, ite = (s, e) => Ul(s ? 1 : 0, e ? 1 : 0); +function r_(s) { return (e, t) => -s(e, t); } -class Hc { +class Od { /** * Constructs a queue that is backed by the given array. Runtime is O(1). */ @@ -11254,7 +11254,7 @@ class Hc { return this.firstIdx += e, t; } } -const lf = class lf { +const mg = class mg { constructor(e) { this.iterate = e; } @@ -11263,10 +11263,10 @@ const lf = class lf { return this.iterate((t) => (e.push(t), !0)), e; } filter(e) { - return new lf((t) => this.iterate((i) => e(i) ? t(i) : !0)); + return new mg((t) => this.iterate((i) => e(i) ? t(i) : !0)); } map(e) { - return new lf((t) => this.iterate((i) => t(e(i)))); + return new mg((t) => this.iterate((i) => t(e(i)))); } findLast(e) { let t; @@ -11274,13 +11274,13 @@ const lf = class lf { } findLastMaxBy(e) { let t, i = !0; - return this.iterate((n) => ((i || Ew.isGreaterThan(e(n, t))) && (i = !1, t = n), !0)), t; + return this.iterate((n) => ((i || Oy.isGreaterThan(e(n, t))) && (i = !1, t = n), !0)), t; } }; -lf.empty = new lf((e) => { +mg.empty = new mg((e) => { }); -let lg = lf; -class wA { +let um = mg; +class YV { constructor(e) { this._indexMap = e; } @@ -11289,7 +11289,7 @@ class wA { */ static createSortPermutation(e, t) { const i = Array.from(e.keys()).sort((n, o) => t(e[n], e[o])); - return new wA(i); + return new YV(i); } /** * Returns a new array with the elements of the given array re-arranged according to this permutation. @@ -11304,71 +11304,71 @@ class wA { const e = this._indexMap.slice(); for (let t = 0; t < this._indexMap.length; t++) e[this._indexMap[t]] = t; - return new wA(e); + return new YV(e); } } -const pF = typeof Buffer < "u"; -let VN; -class U_ { +const DD = typeof Buffer < "u"; +let OC; +class dx { /** * When running in a nodejs context, if `actual` is not a nodejs Buffer, the backing store for * the returned `VSBuffer` instance might use a nodejs Buffer allocated from node's Buffer pool, * which is not transferrable. */ static wrap(e) { - return pF && !Buffer.isBuffer(e) && (e = Buffer.from(e.buffer, e.byteOffset, e.byteLength)), new U_(e); + return DD && !Buffer.isBuffer(e) && (e = Buffer.from(e.buffer, e.byteOffset, e.byteLength)), new dx(e); } constructor(e) { this.buffer = e, this.byteLength = this.buffer.byteLength; } toString() { - return pF ? this.buffer.toString() : (VN || (VN = new TextDecoder()), VN.decode(this.buffer)); + return DD ? this.buffer.toString() : (OC || (OC = new TextDecoder()), OC.decode(this.buffer)); } } -function hee(s, e) { +function nte(s, e) { return s[e + 0] << 0 >>> 0 | s[e + 1] << 8 >>> 0; } -function uee(s, e, t) { +function ste(s, e, t) { s[t + 0] = e & 255, e = e >>> 8, s[t + 1] = e & 255; } -function ul(s, e) { +function gr(s, e) { return s[e] * 2 ** 24 + s[e + 1] * 2 ** 16 + s[e + 2] * 2 ** 8 + s[e + 3]; } -function gl(s, e, t) { +function Zr(s, e, t) { s[t + 3] = e, e = e >>> 8, s[t + 2] = e, e = e >>> 8, s[t + 1] = e, e = e >>> 8, s[t] = e; } -function fF(s, e) { +function FD(s, e) { return s[e]; } -function bF(s, e, t) { +function zD(s, e, t) { s[t] = e; } -let kN; -function ZJ() { - return kN || (kN = new TextDecoder("UTF-16LE")), kN; +let jC; +function c_() { + return jC || (jC = new TextDecoder("UTF-16LE")), jC; } -let GN; -function gee() { - return GN || (GN = new TextDecoder("UTF-16BE")), GN; +let qC; +function ote() { + return qC || (qC = new TextDecoder("UTF-16BE")), qC; } -let RN; -function _J() { - return RN || (RN = bH() ? ZJ() : gee()), RN; +let $C; +function d_() { + return $C || ($C = $P() ? c_() : ote()), $C; } -function mee(s, e, t) { +function lte(s, e, t) { const i = new Uint16Array(s.buffer, e, t); - return t > 0 && (i[0] === 65279 || i[0] === 65534) ? pee(s, e, t) : ZJ().decode(i); + return t > 0 && (i[0] === 65279 || i[0] === 65534) ? rte(s, e, t) : c_().decode(i); } -function pee(s, e, t) { +function rte(s, e, t) { const i = []; let n = 0; for (let o = 0; o < t; o++) { - const r = hee(s, e); - e += 2, i[n++] = String.fromCharCode(r); + const l = nte(s, e); + e += 2, i[n++] = String.fromCharCode(l); } return i.join(""); } -class e0 { +class l0 { constructor(e) { this._capacity = e | 0, this._buffer = new Uint16Array(this._capacity), this._completedStrings = null, this._bufferLength = 0; } @@ -11382,7 +11382,7 @@ class e0 { if (this._bufferLength === 0) return ""; const e = new Uint16Array(this._buffer.buffer, 0, this._bufferLength); - return _J().decode(e); + return d_().decode(e); } _flushBuffer() { const e = this._buildBuffer(); @@ -11393,7 +11393,7 @@ class e0 { */ appendCharCode(e) { const t = this._capacity - this._bufferLength; - t <= 1 && (t === 0 || Hi(e)) && this._flushBuffer(), this._buffer[this._bufferLength++] = e; + t <= 1 && (t === 0 || Bi(e)) && this._flushBuffer(), this._buffer[this._bufferLength++] = e; } /** * Append an ASCII char code (<2^8) @@ -11411,9 +11411,9 @@ class e0 { this._buffer[this._bufferLength++] = e.charCodeAt(i); } } -class CA { - constructor(e, t, i, n, o, r) { - this._richEditBracketBrand = void 0, this.languageId = e, this.index = t, this.open = i, this.close = n, this.forwardRegex = o, this.reversedRegex = r, this._openSet = CA._toSet(this.open), this._closeSet = CA._toSet(this.close); +class kV { + constructor(e, t, i, n, o, l) { + this._richEditBracketBrand = void 0, this.languageId = e, this.index = t, this.open = i, this.close = n, this.forwardRegex = o, this.reversedRegex = l, this._openSet = kV._toSet(this.open), this._closeSet = kV._toSet(this.close); } /** * Check if the provided `text` is an open bracket in this group. @@ -11434,47 +11434,47 @@ class CA { return t; } } -function fee(s) { +function cte(s) { const e = s.length; - s = s.map((r) => [r[0].toLowerCase(), r[1].toLowerCase()]); + s = s.map((l) => [l[0].toLowerCase(), l[1].toLowerCase()]); const t = []; - for (let r = 0; r < e; r++) - t[r] = r; - const i = (r, l) => { - const [a, c] = r, [d, h] = l; - return a === d || a === h || c === d || c === h; - }, n = (r, l) => { - const a = Math.min(r, l), c = Math.max(r, l); - for (let d = 0; d < e; d++) - t[d] === c && (t[d] = a); + for (let l = 0; l < e; l++) + t[l] = l; + const i = (l, r) => { + const [c, d] = l, [a, h] = r; + return c === a || c === h || d === a || d === h; + }, n = (l, r) => { + const c = Math.min(l, r), d = Math.max(l, r); + for (let a = 0; a < e; a++) + t[a] === d && (t[a] = c); }; - for (let r = 0; r < e; r++) { - const l = s[r]; - for (let a = r + 1; a < e; a++) { - const c = s[a]; - i(l, c) && n(t[r], t[a]); + for (let l = 0; l < e; l++) { + const r = s[l]; + for (let c = l + 1; c < e; c++) { + const d = s[c]; + i(r, d) && n(t[l], t[c]); } } const o = []; - for (let r = 0; r < e; r++) { - const l = [], a = []; - for (let c = 0; c < e; c++) - if (t[c] === r) { - const [d, h] = s[c]; - l.push(d), a.push(h); + for (let l = 0; l < e; l++) { + const r = [], c = []; + for (let d = 0; d < e; d++) + if (t[d] === l) { + const [a, h] = s[d]; + r.push(a), c.push(h); } - l.length > 0 && o.push({ - open: l, - close: a + r.length > 0 && o.push({ + open: r, + close: c }); } return o; } -class bee { +class dte { constructor(e, t) { this._richEditBracketsBrand = void 0; - const i = fee(t); - this.brackets = i.map((n, o) => new CA(e, o, n.open, n.close, yee(n.open, n.close, i, o), wee(n.open, n.close, i, o))), this.forwardRegex = Cee(this.brackets), this.reversedRegex = See(this.brackets), this.textIsBracket = {}, this.textIsOpenBracket = {}, this.maxBracketLength = 0; + const i = cte(t); + this.brackets = i.map((n, o) => new kV(e, o, n.open, n.close, ate(n.open, n.close, i, o), hte(n.open, n.close, i, o))), this.forwardRegex = ute(this.brackets), this.reversedRegex = mte(this.brackets), this.textIsBracket = {}, this.textIsOpenBracket = {}, this.maxBracketLength = 0; for (const n of this.brackets) { for (const o of n.open) this.textIsBracket[o] = n, this.textIsOpenBracket[o] = !0, this.maxBracketLength = Math.max(this.maxBracketLength, o.length); @@ -11483,21 +11483,21 @@ class bee { } } } -function IJ(s, e, t, i) { +function a_(s, e, t, i) { for (let n = 0, o = e.length; n < o; n++) { if (n === t) continue; - const r = e[n]; - for (const l of r.open) - l.indexOf(s) >= 0 && i.push(l); - for (const l of r.close) - l.indexOf(s) >= 0 && i.push(l); + const l = e[n]; + for (const r of l.open) + r.indexOf(s) >= 0 && i.push(r); + for (const r of l.close) + r.indexOf(s) >= 0 && i.push(r); } } -function NJ(s, e) { +function h_(s, e) { return s.length - e.length; } -function K_(s) { +function ax(s) { if (s.length <= 1) return s; const e = [], t = /* @__PURE__ */ new Set(); @@ -11505,21 +11505,21 @@ function K_(s) { t.has(i) || (e.push(i), t.add(i)); return e; } -function yee(s, e, t, i) { +function ate(s, e, t, i) { let n = []; n = n.concat(s), n = n.concat(e); - for (let o = 0, r = n.length; o < r; o++) - IJ(n[o], t, i, n); - return n = K_(n), n.sort(NJ), n.reverse(), mC(n); + for (let o = 0, l = n.length; o < l; o++) + a_(n[o], t, i, n); + return n = ax(n), n.sort(h_), n.reverse(), xG(n); } -function wee(s, e, t, i) { +function hte(s, e, t, i) { let n = []; n = n.concat(s), n = n.concat(e); - for (let o = 0, r = n.length; o < r; o++) - IJ(n[o], t, i, n); - return n = K_(n), n.sort(NJ), n.reverse(), mC(n.map(AE)); + for (let o = 0, l = n.length; o < l; o++) + a_(n[o], t, i, n); + return n = ax(n), n.sort(h_), n.reverse(), xG(n.map(_v)); } -function Cee(s) { +function ute(s) { let e = []; for (const t of s) { for (const i of t.open) @@ -11527,9 +11527,9 @@ function Cee(s) { for (const i of t.close) e.push(i); } - return e = K_(e), mC(e); + return e = ax(e), xG(e); } -function See(s) { +function mte(s) { let e = []; for (const t of s) { for (const i of t.open) @@ -11537,57 +11537,57 @@ function See(s) { for (const i of t.close) e.push(i); } - return e = K_(e), mC(e.map(AE)); + return e = ax(e), xG(e.map(_v)); } -function Lee(s) { +function bte(s) { const e = /^[\w ]+$/.test(s); - return s = Po(s), e ? `\\b${s}\\b` : s; + return s = Uo(s), e ? `\\b${s}\\b` : s; } -function mC(s, e) { - const t = `(${s.map(Lee).join(")|(")})`; - return EH(t, !0, e); +function xG(s, e) { + const t = `(${s.map(bte).join(")|(")})`; + return WB(t, !0, e); } -const AE = /* @__PURE__ */ function() { +const _v = /* @__PURE__ */ function() { function s(i) { const n = new Uint16Array(i.length); let o = 0; - for (let r = i.length - 1; r >= 0; r--) - n[o++] = i.charCodeAt(r); - return _J().decode(n); + for (let l = i.length - 1; l >= 0; l--) + n[o++] = i.charCodeAt(l); + return d_().decode(n); } let e = null, t = null; return function(n) { return e !== n && (e = n, t = s(e)), t; }; }(); -class Ir { +class wl { static _findPrevBracketInText(e, t, i, n) { const o = i.match(e); if (!o) return null; - const r = i.length - (o.index || 0), l = o[0].length, a = n + r; - return new M(t, a - l + 1, t, a + 1); + const l = i.length - (o.index || 0), r = o[0].length, c = n + l; + return new I(t, c - r + 1, t, c + 1); } static findPrevBracketInRange(e, t, i, n, o) { - const l = AE(i).substring(i.length - o, i.length - n); - return this._findPrevBracketInText(e, t, l, n); + const r = _v(i).substring(i.length - o, i.length - n); + return this._findPrevBracketInText(e, t, r, n); } static findNextBracketInText(e, t, i, n) { const o = i.match(e); if (!o) return null; - const r = o.index || 0, l = o[0].length; - if (l === 0) + const l = o.index || 0, r = o[0].length; + if (r === 0) return null; - const a = n + r; - return new M(t, a + 1, t, a + 1 + l); + const c = n + l; + return new I(t, c + 1, t, c + 1 + r); } static findNextBracketInRange(e, t, i, n, o) { - const r = i.substring(n, o); - return this.findNextBracketInText(e, t, r, n); + const l = i.substring(n, o); + return this.findNextBracketInText(e, t, l, n); } } -class Aee { +class pte { constructor(e) { this._richEditBrackets = e; } @@ -11599,58 +11599,58 @@ class Aee { const n = i.charAt(i.length - 1); e.push(n); } - return Oc(e); + return Qd(e); } onElectricCharacter(e, t, i) { if (!this._richEditBrackets || this._richEditBrackets.brackets.length === 0) return null; const n = t.findTokenIndexAtOffset(i - 1); - if (jl(t.getStandardTokenType(n))) + if (tc(t.getStandardTokenType(n))) return null; - const o = this._richEditBrackets.reversedRegex, r = t.getLineContent().substring(0, i - 1) + e, l = Ir.findPrevBracketInRange(o, 1, r, 0, r.length); - if (!l) + const o = this._richEditBrackets.reversedRegex, l = t.getLineContent().substring(0, i - 1) + e, r = wl.findPrevBracketInRange(o, 1, l, 0, l.length); + if (!r) return null; - const a = r.substring(l.startColumn - 1, l.endColumn - 1).toLowerCase(); - if (this._richEditBrackets.textIsOpenBracket[a]) + const c = l.substring(r.startColumn - 1, r.endColumn - 1).toLowerCase(); + if (this._richEditBrackets.textIsOpenBracket[c]) return null; - const d = t.getActualLineContentBefore(l.startColumn - 1); - return /^\s*$/.test(d) ? { - matchOpenBracket: a + const a = t.getActualLineContentBefore(r.startColumn - 1); + return /^\s*$/.test(a) ? { + matchOpenBracket: c } : null; } } -function iS(s) { +function p1(s) { return s.global && (s.lastIndex = 0), !0; } -class xee { +class gte { constructor(e) { this._indentationRules = e; } shouldIncrease(e) { - return !!(this._indentationRules && this._indentationRules.increaseIndentPattern && iS(this._indentationRules.increaseIndentPattern) && this._indentationRules.increaseIndentPattern.test(e)); + return !!(this._indentationRules && this._indentationRules.increaseIndentPattern && p1(this._indentationRules.increaseIndentPattern) && this._indentationRules.increaseIndentPattern.test(e)); } shouldDecrease(e) { - return !!(this._indentationRules && this._indentationRules.decreaseIndentPattern && iS(this._indentationRules.decreaseIndentPattern) && this._indentationRules.decreaseIndentPattern.test(e)); + return !!(this._indentationRules && this._indentationRules.decreaseIndentPattern && p1(this._indentationRules.decreaseIndentPattern) && this._indentationRules.decreaseIndentPattern.test(e)); } shouldIndentNextLine(e) { - return !!(this._indentationRules && this._indentationRules.indentNextLinePattern && iS(this._indentationRules.indentNextLinePattern) && this._indentationRules.indentNextLinePattern.test(e)); + return !!(this._indentationRules && this._indentationRules.indentNextLinePattern && p1(this._indentationRules.indentNextLinePattern) && this._indentationRules.indentNextLinePattern.test(e)); } shouldIgnore(e) { - return !!(this._indentationRules && this._indentationRules.unIndentedLinePattern && iS(this._indentationRules.unIndentedLinePattern) && this._indentationRules.unIndentedLinePattern.test(e)); + return !!(this._indentationRules && this._indentationRules.unIndentedLinePattern && p1(this._indentationRules.unIndentedLinePattern) && this._indentationRules.unIndentedLinePattern.test(e)); } getIndentMetadata(e) { let t = 0; return this.shouldIncrease(e) && (t += 1), this.shouldDecrease(e) && (t += 2), this.shouldIndentNextLine(e) && (t += 4), this.shouldIgnore(e) && (t += 8), t; } } -class Dp { +class Ep { constructor(e) { e = e || {}, e.brackets = e.brackets || [ ["(", ")"], ["{", "}"], ["[", "]"] ], this._brackets = [], e.brackets.forEach((t) => { - const i = Dp._createOpenBracketRegExp(t[0]), n = Dp._createCloseBracketRegExp(t[1]); + const i = Ep._createOpenBracketRegExp(t[0]), n = Ep._createCloseBracketRegExp(t[1]); i && n && this._brackets.push({ open: t[0], openRegExp: i, @@ -11661,92 +11661,92 @@ class Dp { } onEnter(e, t, i, n) { if (e >= 3) - for (let o = 0, r = this._regExpRules.length; o < r; o++) { - const l = this._regExpRules[o]; + for (let o = 0, l = this._regExpRules.length; o < l; o++) { + const r = this._regExpRules[o]; if ([{ - reg: l.beforeText, + reg: r.beforeText, text: i }, { - reg: l.afterText, + reg: r.afterText, text: n }, { - reg: l.previousLineText, + reg: r.previousLineText, text: t - }].every((c) => c.reg ? (c.reg.lastIndex = 0, c.reg.test(c.text)) : !0)) - return l.action; + }].every((d) => d.reg ? (d.reg.lastIndex = 0, d.reg.test(d.text)) : !0)) + return r.action; } if (e >= 2 && i.length > 0 && n.length > 0) - for (let o = 0, r = this._brackets.length; o < r; o++) { - const l = this._brackets[o]; - if (l.openRegExp.test(i) && l.closeRegExp.test(n)) + for (let o = 0, l = this._brackets.length; o < l; o++) { + const r = this._brackets[o]; + if (r.openRegExp.test(i) && r.closeRegExp.test(n)) return { indentAction: Ei.IndentOutdent }; } if (e >= 2 && i.length > 0) { - for (let o = 0, r = this._brackets.length; o < r; o++) + for (let o = 0, l = this._brackets.length; o < l; o++) if (this._brackets[o].openRegExp.test(i)) return { indentAction: Ei.Indent }; } return null; } static _createOpenBracketRegExp(e) { - let t = Po(e); - return /\B/.test(t.charAt(0)) || (t = "\\b" + t), t += "\\s*$", Dp._safeRegExp(t); + let t = Uo(e); + return /\B/.test(t.charAt(0)) || (t = "\\b" + t), t += "\\s*$", Ep._safeRegExp(t); } static _createCloseBracketRegExp(e) { - let t = Po(e); - return /\B/.test(t.charAt(t.length - 1)) || (t = t + "\\b"), t = "^\\s*" + t, Dp._safeRegExp(t); + let t = Uo(e); + return /\B/.test(t.charAt(t.length - 1)) || (t = t + "\\b"), t = "^\\s*" + t, Ep._safeRegExp(t); } static _safeRegExp(e) { try { return new RegExp(e); } catch (t) { - return De(t), null; + return Me(t), null; } } } -const Ke = $e("configurationService"); -function z2(s, e) { +const Qe = $e("configurationService"); +function dw(s, e) { const t = /* @__PURE__ */ Object.create(null); for (const i in s) - WJ(t, i, s[i], e); + u_(t, i, s[i], e); return t; } -function WJ(s, e, t, i) { +function u_(s, e, t, i) { const n = e.split("."), o = n.pop(); - let r = s; - for (let l = 0; l < n.length; l++) { - const a = n[l]; - let c = r[a]; - switch (typeof c) { + let l = s; + for (let r = 0; r < n.length; r++) { + const c = n[r]; + let d = l[c]; + switch (typeof d) { case "undefined": - c = r[a] = /* @__PURE__ */ Object.create(null); + d = l[c] = /* @__PURE__ */ Object.create(null); break; case "object": - if (c === null) { - i(`Ignoring ${e} as ${n.slice(0, l + 1).join(".")} is null`); + if (d === null) { + i(`Ignoring ${e} as ${n.slice(0, r + 1).join(".")} is null`); return; } break; default: - i(`Ignoring ${e} as ${n.slice(0, l + 1).join(".")} is ${JSON.stringify(c)}`); + i(`Ignoring ${e} as ${n.slice(0, r + 1).join(".")} is ${JSON.stringify(d)}`); return; } - r = c; + l = d; } - if (typeof r == "object" && r !== null) + if (typeof l == "object" && l !== null) try { - r[o] = t; + l[o] = t; } catch { - i(`Ignoring ${e} as ${n.join(".")} is ${JSON.stringify(r)}`); + i(`Ignoring ${e} as ${n.join(".")} is ${JSON.stringify(l)}`); } else - i(`Ignoring ${e} as ${n.join(".")} is ${JSON.stringify(r)}`); + i(`Ignoring ${e} as ${n.join(".")} is ${JSON.stringify(l)}`); } -function Mee(s, e) { +function Zte(s, e) { const t = e.split("."); - vJ(s, t); + m_(s, t); } -function vJ(s, e) { +function m_(s, e) { const t = e.shift(); if (e.length === 0) { delete s[t]; @@ -11754,68 +11754,68 @@ function vJ(s, e) { } if (Object.keys(s).indexOf(t) !== -1) { const i = s[t]; - typeof i == "object" && !Array.isArray(i) && (vJ(i, e), Object.keys(i).length === 0 && delete s[t]); + typeof i == "object" && !Array.isArray(i) && (m_(i, e), Object.keys(i).length === 0 && delete s[t]); } } -function yF(s, e, t) { - function i(r, l) { - let a = r; - for (const c of l) { - if (typeof a != "object" || a === null) +function AD(s, e, t) { + function i(l, r) { + let c = l; + for (const d of r) { + if (typeof c != "object" || c === null) return; - a = a[c]; + c = c[d]; } - return a; + return c; } const n = e.split("."), o = i(s, n); return typeof o > "u" ? t : o; } -function Zee(s) { +function fte(s) { return s.replace(/[\[\]]/g, ""); } const ri = $e("languageService"); -class ga { +class Zc { constructor(e, t = [], i = !1) { this.ctor = e, this.staticArguments = t, this.supportsDelayedInstantiation = i; } } -const TJ = []; +const b_ = []; function it(s, e, t) { - e instanceof ga || (e = new ga(e, [], !!t)), TJ.push([s, e]); + e instanceof Zc || (e = new Zc(e, [], !!t)), b_.push([s, e]); } -function wF() { - return TJ; +function KD() { + return b_; } -const bi = Object.freeze({ +const fi = Object.freeze({ text: "text/plain", binary: "application/octet-stream", unknown: "application/unknown", markdown: "text/markdown", latex: "text/latex", uriList: "text/uri-list" -}), Q_ = { +}), hx = { JSONContribution: "base.contributions.json" }; -function _ee(s) { +function yte(s) { return s.length > 0 && s.charAt(s.length - 1) === "#" ? s.substring(0, s.length - 1) : s; } -class Iee { +class Wte { constructor() { this._onDidChangeSchema = new k(), this.schemasById = {}; } registerSchema(e, t) { - this.schemasById[_ee(e)] = t, this._onDidChangeSchema.fire(e); + this.schemasById[yte(e)] = t, this._onDidChangeSchema.fire(e); } notifySchemaChanged(e) { this._onDidChangeSchema.fire(e); } } -const Nee = new Iee(); -Di.add(Q_.JSONContribution, Nee); -const $r = { +const Gte = new Wte(); +ki.add(hx.JSONContribution, Gte); +const ir = { Configuration: "base.contributions.configuration" -}, nS = "vscode://schemas/settings/resourceLanguage", CF = Di.as(Q_.JSONContribution); -class Wee { +}, g1 = "vscode://schemas/settings/resourceLanguage", UD = ki.as(hx.JSONContribution); +class Xte { constructor() { this.registeredConfigurationDefaults = [], this.overrideIdentifiers = /* @__PURE__ */ new Set(), this._onDidSchemaChange = new k(), this._onDidUpdateConfiguration = new k(), this.configurationDefaultsOverrides = /* @__PURE__ */ new Map(), this.defaultLanguageConfigurationOverridesNode = { id: "defaultOverrides", @@ -11827,14 +11827,14 @@ class Wee { additionalProperties: !0, allowTrailingCommas: !0, allowComments: !0 - }, this.configurationProperties = {}, this.policyConfigurations = /* @__PURE__ */ new Map(), this.excludedConfigurationProperties = {}, CF.registerSchema(nS, this.resourceLanguageSettingsSchema), this.registerOverridePropertyPatternKey(); + }, this.configurationProperties = {}, this.policyConfigurations = /* @__PURE__ */ new Map(), this.excludedConfigurationProperties = {}, UD.registerSchema(g1, this.resourceLanguageSettingsSchema), this.registerOverridePropertyPatternKey(); } registerConfiguration(e, t = !0) { this.registerConfigurations([e], t); } registerConfigurations(e, t = !0) { const i = /* @__PURE__ */ new Set(); - this.doRegisterConfigurations(e, t, i), CF.registerSchema(nS, this.resourceLanguageSettingsSchema), this._onDidSchemaChange.fire(), this._onDidUpdateConfiguration.fire({ properties: i }); + this.doRegisterConfigurations(e, t, i), UD.registerSchema(g1, this.resourceLanguageSettingsSchema), this._onDidSchemaChange.fire(), this._onDidUpdateConfiguration.fire({ properties: i }); } registerDefaultConfigurations(e) { const t = /* @__PURE__ */ new Set(); @@ -11844,21 +11844,21 @@ class Wee { this.registeredConfigurationDefaults.push(...e); const i = []; for (const { overrides: n, source: o } of e) - for (const r in n) { - t.add(r); - const l = this.configurationDefaultsOverrides.get(r) ?? this.configurationDefaultsOverrides.set(r, { configurationDefaultOverrides: [] }).get(r), a = n[r]; - if (l.configurationDefaultOverrides.push({ value: a, source: o }), Th.test(r)) { - const c = this.mergeDefaultConfigurationsForOverrideIdentifier(r, a, o, l.configurationDefaultOverrideValue); - if (!c) + for (const l in n) { + t.add(l); + const r = this.configurationDefaultsOverrides.get(l) ?? this.configurationDefaultsOverrides.set(l, { configurationDefaultOverrides: [] }).get(l), c = n[l]; + if (r.configurationDefaultOverrides.push({ value: c, source: o }), vh.test(l)) { + const d = this.mergeDefaultConfigurationsForOverrideIdentifier(l, c, o, r.configurationDefaultOverrideValue); + if (!d) continue; - l.configurationDefaultOverrideValue = c, this.updateDefaultOverrideProperty(r, c, o), i.push(...SA(r)); + r.configurationDefaultOverrideValue = d, this.updateDefaultOverrideProperty(l, d, o), i.push(...vV(l)); } else { - const c = this.mergeDefaultConfigurationsForConfigurationProperty(r, a, o, l.configurationDefaultOverrideValue); - if (!c) + const d = this.mergeDefaultConfigurationsForConfigurationProperty(l, c, o, r.configurationDefaultOverrideValue); + if (!d) continue; - l.configurationDefaultOverrideValue = c; - const d = this.configurationProperties[r]; - d && (this.updatePropertyDefaultValue(r, d), this.updateSchema(r, d)); + r.configurationDefaultOverrideValue = d; + const a = this.configurationProperties[l]; + a && (this.updatePropertyDefaultValue(l, a), this.updateSchema(l, a)); } } this.doRegisterOverrideIdentifiers(i); @@ -11867,8 +11867,8 @@ class Wee { const n = { type: "object", default: t.value, - description: p("defaultLanguageConfiguration.description", "Configure settings to be overridden for the {0} language.", Zee(e)), - $ref: nS, + description: p("defaultLanguageConfiguration.description", "Configure settings to be overridden for the {0} language.", fte(e)), + $ref: g1, defaultDefaultValue: t.value, source: i, defaultValueSource: i @@ -11876,35 +11876,35 @@ class Wee { this.configurationProperties[e] = n, this.defaultLanguageConfigurationOverridesNode.properties[e] = n; } mergeDefaultConfigurationsForOverrideIdentifier(e, t, i, n) { - const o = (n == null ? void 0 : n.value) || {}, r = (n == null ? void 0 : n.source) ?? /* @__PURE__ */ new Map(); - if (!(r instanceof Map)) { + const o = (n == null ? void 0 : n.value) || {}, l = (n == null ? void 0 : n.source) ?? /* @__PURE__ */ new Map(); + if (!(l instanceof Map)) { console.error("objectConfigurationSources is not a Map"); return; } - for (const l of Object.keys(t)) { - const a = t[l]; - if (tn(a) && (jn(o[l]) || tn(o[l]))) { - if (o[l] = { ...o[l] ?? {}, ...a }, i) - for (const d in a) - r.set(`${l}.${d}`, i); + for (const r of Object.keys(t)) { + const c = t[r]; + if (nn(c) && ($n(o[r]) || nn(o[r]))) { + if (o[r] = { ...o[r] ?? {}, ...c }, i) + for (const a in c) + l.set(`${r}.${a}`, i); } else - o[l] = a, i ? r.set(l, i) : r.delete(l); + o[r] = c, i ? l.set(r, i) : l.delete(r); } - return { value: o, source: r }; + return { value: o, source: l }; } mergeDefaultConfigurationsForConfigurationProperty(e, t, i, n) { - const o = this.configurationProperties[e], r = (n == null ? void 0 : n.value) ?? (o == null ? void 0 : o.defaultDefaultValue); - let l = i; - if (tn(t) && (o !== void 0 && o.type === "object" || o === void 0 && (jn(r) || tn(r)))) { - if (l = (n == null ? void 0 : n.source) ?? /* @__PURE__ */ new Map(), !(l instanceof Map)) { + const o = this.configurationProperties[e], l = (n == null ? void 0 : n.value) ?? (o == null ? void 0 : o.defaultDefaultValue); + let r = i; + if (nn(t) && (o !== void 0 && o.type === "object" || o === void 0 && ($n(l) || nn(l)))) { + if (r = (n == null ? void 0 : n.source) ?? /* @__PURE__ */ new Map(), !(r instanceof Map)) { console.error("defaultValueSource is not a Map"); return; } - for (const c in t) - i && l.set(`${e}.${c}`, i); - t = { ...tn(r) ? r : {}, ...t }; + for (const d in t) + i && r.set(`${e}.${d}`, i); + t = { ...nn(l) ? l : {}, ...t }; } - return { value: t, source: l }; + return { value: t, source: r }; } registerOverrideIdentifiers(e) { this.doRegisterOverrideIdentifiers(e), this._onDidSchemaChange.fire(); @@ -11919,28 +11919,28 @@ class Wee { this.validateAndRegisterProperties(n, t, n.extensionInfo, n.restrictedProperties, void 0, i), this.configurationContributors.push(n), this.registerJSONConfiguration(n); }); } - validateAndRegisterProperties(e, t = !0, i, n, o = 3, r) { - var c; - o = Do(e.scope) ? o : e.scope; - const l = e.properties; - if (l) - for (const d in l) { - const h = l[d]; - if (t && Dee(d, h)) { - delete l[d]; + validateAndRegisterProperties(e, t = !0, i, n, o = 3, l) { + var d; + o = ko(e.scope) ? o : e.scope; + const r = e.properties; + if (r) + for (const a in r) { + const h = r[a]; + if (t && Ite(a, h)) { + delete r[a]; continue; } - if (h.source = i, h.defaultDefaultValue = l[d].default, this.updatePropertyDefaultValue(d, h), Th.test(d) ? h.scope = void 0 : (h.scope = Do(h.scope) ? o : h.scope, h.restricted = Do(h.restricted) ? !!(n != null && n.includes(d)) : h.restricted), l[d].hasOwnProperty("included") && !l[d].included) { - this.excludedConfigurationProperties[d] = l[d], delete l[d]; + if (h.source = i, h.defaultDefaultValue = r[a].default, this.updatePropertyDefaultValue(a, h), vh.test(a) ? h.scope = void 0 : (h.scope = ko(h.scope) ? o : h.scope, h.restricted = ko(h.restricted) ? !!(n != null && n.includes(a)) : h.restricted), r[a].hasOwnProperty("included") && !r[a].included) { + this.excludedConfigurationProperties[a] = r[a], delete r[a]; continue; } else - this.configurationProperties[d] = l[d], (c = l[d].policy) != null && c.name && this.policyConfigurations.set(l[d].policy.name, d); - !l[d].deprecationMessage && l[d].markdownDeprecationMessage && (l[d].deprecationMessage = l[d].markdownDeprecationMessage), r.add(d); + this.configurationProperties[a] = r[a], (d = r[a].policy) != null && d.name && this.policyConfigurations.set(r[a].policy.name, a); + !r[a].deprecationMessage && r[a].markdownDeprecationMessage && (r[a].deprecationMessage = r[a].markdownDeprecationMessage), l.add(a); } - const a = e.allOf; - if (a) - for (const d of a) - this.validateAndRegisterProperties(d, t, i, n, o, r); + const c = e.allOf; + if (c) + for (const a of c) + this.validateAndRegisterProperties(a, t, i, n, o, l); } getConfigurationProperties() { return this.configurationProperties; @@ -11952,8 +11952,8 @@ class Wee { const t = (i) => { const n = i.properties; if (n) - for (const r in n) - this.updateSchema(r, n[r]); + for (const l in n) + this.updateSchema(l, n[l]); const o = i.allOf; o == null || o.forEach(t); }; @@ -11982,7 +11982,7 @@ class Wee { type: "object", description: p("overrideSettings.defaultDescription", "Configure editor settings to be overridden for a language."), errorMessage: p("overrideSettings.errorMessage", "This setting does not support per-language configuration."), - $ref: nS + $ref: g1 }; this.updatePropertyDefaultValue(t, i); } @@ -11991,25 +11991,25 @@ class Wee { p("overrideSettings.defaultDescription", "Configure editor settings to be overridden for a language."), p("overrideSettings.errorMessage", "This setting does not support per-language configuration."), this._onDidSchemaChange.fire(); } updatePropertyDefaultValue(e, t) { - var r; - const i = (r = this.configurationDefaultsOverrides.get(e)) == null ? void 0 : r.configurationDefaultOverrideValue; + var l; + const i = (l = this.configurationDefaultsOverrides.get(e)) == null ? void 0 : l.configurationDefaultOverrideValue; let n, o; - i && (!t.disallowConfigurationDefault || !i.source) && (n = i.value, o = i.source), jn(n) && (n = t.defaultDefaultValue, o = void 0), jn(n) && (n = Tee(t.type)), t.default = n, t.defaultValueSource = o; + i && (!t.disallowConfigurationDefault || !i.source) && (n = i.value, o = i.source), $n(n) && (n = t.defaultDefaultValue, o = void 0), $n(n) && (n = Lte(t.type)), t.default = n, t.defaultValueSource = o; } } -const DJ = "\\[([^\\]]+)\\]", SF = new RegExp(DJ, "g"), vee = `^(${DJ})+$`, Th = new RegExp(vee); -function SA(s) { +const p_ = "\\[([^\\]]+)\\]", PD = new RegExp(p_, "g"), Vte = `^(${p_})+$`, vh = new RegExp(Vte); +function vV(s) { const e = []; - if (Th.test(s)) { - let t = SF.exec(s); + if (vh.test(s)) { + let t = PD.exec(s); for (; t != null && t.length; ) { const i = t[1].trim(); - i && e.push(i), t = SF.exec(s); + i && e.push(i), t = PD.exec(s); } } - return Oc(e); + return Qd(e); } -function Tee(s) { +function Lte(s) { switch (Array.isArray(s) ? s[0] : s) { case "boolean": return !1; @@ -12026,16 +12026,16 @@ function Tee(s) { return null; } } -const bL = new Wee(); -Di.add($r.Configuration, bL); -function Dee(s, e) { +const TX = new Xte(); +ki.add(ir.Configuration, TX); +function Ite(s, e) { var t, i, n, o; - return s.trim() ? Th.test(s) ? p("config.property.languageDefault", "Cannot register '{0}'. This matches property pattern '\\\\[.*\\\\]$' for describing language specific editor settings. Use 'configurationDefaults' contribution.", s) : bL.getConfigurationProperties()[s] !== void 0 ? p("config.property.duplicate", "Cannot register '{0}'. This property is already registered.", s) : (t = e.policy) != null && t.name && bL.getPolicyConfigurations().get((i = e.policy) == null ? void 0 : i.name) !== void 0 ? p("config.policy.duplicate", "Cannot register '{0}'. The associated policy {1} is already registered with {2}.", s, (n = e.policy) == null ? void 0 : n.name, bL.getPolicyConfigurations().get((o = e.policy) == null ? void 0 : o.name)) : null : p("config.property.empty", "Cannot register an empty property"); + return s.trim() ? vh.test(s) ? p("config.property.languageDefault", "Cannot register '{0}'. This matches property pattern '\\\\[.*\\\\]$' for describing language specific editor settings. Use 'configurationDefaults' contribution.", s) : TX.getConfigurationProperties()[s] !== void 0 ? p("config.property.duplicate", "Cannot register '{0}'. This property is already registered.", s) : (t = e.policy) != null && t.name && TX.getPolicyConfigurations().get((i = e.policy) == null ? void 0 : i.name) !== void 0 ? p("config.policy.duplicate", "Cannot register '{0}'. The associated policy {1} is already registered with {2}.", s, (n = e.policy) == null ? void 0 : n.name, TX.getPolicyConfigurations().get((o = e.policy) == null ? void 0 : o.name)) : null : p("config.property.empty", "Cannot register an empty property"); } -const Vee = { +const Ste = { ModesRegistry: "editor.modesRegistry" }; -class kee { +class xte { constructor() { this._onDidChangeLanguages = new k(), this.onDidChangeLanguages = this._onDidChangeLanguages.event, this._languages = []; } @@ -12054,16 +12054,16 @@ class kee { return this._languages; } } -const cb = new kee(); -Di.add(Vee.ModesRegistry, cb); -const ms = "plaintext", Gee = ".txt"; -cb.registerLanguage({ - id: ms, - extensions: [Gee], +const pZ = new xte(); +ki.add(Ste.ModesRegistry, pZ); +const gs = "plaintext", Cte = ".txt"; +pZ.registerLanguage({ + id: gs, + extensions: [Cte], aliases: [p("plainText.alias", "Plain Text"), "text"], - mimetypes: [bi.text] + mimetypes: [fi.text] }); -Di.as($r.Configuration).registerDefaultConfigurations([{ +ki.as(ir.Configuration).registerDefaultConfigurations([{ overrides: { "[plaintext]": { "editor.unicodeHighlight.ambiguousCharacters": !1, @@ -12071,33 +12071,33 @@ Di.as($r.Configuration).registerDefaultConfigurations([{ } } }]); -class Ree { +class Rte { constructor(e, t) { this.languageId = e; - const i = t.brackets ? LF(t.brackets) : [], n = new K9((l) => { - const a = /* @__PURE__ */ new Set(); + const i = t.brackets ? BD(t.brackets) : [], n = new WD((r) => { + const c = /* @__PURE__ */ new Set(); return { - info: new Eee(this, l, a), - closing: a + info: new Nte(this, r, c), + closing: c }; - }), o = new K9((l) => { - const a = /* @__PURE__ */ new Set(), c = /* @__PURE__ */ new Set(); + }), o = new WD((r) => { + const c = /* @__PURE__ */ new Set(), d = /* @__PURE__ */ new Set(); return { - info: new Xee(this, l, a, c), - opening: a, - openingColorized: c + info: new wte(this, r, c, d), + opening: c, + openingColorized: d }; }); - for (const [l, a] of i) { - const c = n.get(l), d = o.get(a); - c.closing.add(d.info), d.opening.add(c.info); + for (const [r, c] of i) { + const d = n.get(r), a = o.get(c); + d.closing.add(a.info), a.opening.add(d.info); } - const r = t.colorizedBracketPairs ? LF(t.colorizedBracketPairs) : i.filter((l) => !(l[0] === "<" && l[1] === ">")); - for (const [l, a] of r) { - const c = n.get(l), d = o.get(a); - c.closing.add(d.info), d.openingColorized.add(c.info), d.opening.add(c.info); + const l = t.colorizedBracketPairs ? BD(t.colorizedBracketPairs) : i.filter((r) => !(r[0] === "<" && r[1] === ">")); + for (const [r, c] of l) { + const d = n.get(r), a = o.get(c); + d.closing.add(a.info), a.openingColorized.add(d.info), a.opening.add(d.info); } - this._openingBrackets = new Map([...n.cachedValues].map(([l, a]) => [l, a.info])), this._closingBrackets = new Map([...o.cachedValues].map(([l, a]) => [l, a.info])); + this._openingBrackets = new Map([...n.cachedValues].map(([r, c]) => [r, c.info])), this._closingBrackets = new Map([...o.cachedValues].map(([r, c]) => [r, c.info])); } /** * No two brackets have the same bracket text. @@ -12122,13 +12122,13 @@ class Ree { } getBracketRegExp(e) { const t = Array.from([...this._openingBrackets.keys(), ...this._closingBrackets.keys()]); - return mC(t, e); + return xG(t, e); } } -function LF(s) { +function BD(s) { return s.filter(([e, t]) => e !== "" && t !== ""); } -class VJ { +class g_ { constructor(e, t) { this.config = e, this.bracketText = t; } @@ -12136,12 +12136,12 @@ class VJ { return this.config.languageId; } } -class Eee extends VJ { +class Nte extends g_ { constructor(e, t, i) { super(e, t), this.openedBrackets = i, this.isOpeningBracket = !0; } } -class Xee extends VJ { +class wte extends g_ { constructor(e, t, i, n) { super(e, t), this.openingBrackets = i, this.openingColorizedBrackets = n, this.isOpeningBracket = !1; } @@ -12159,17 +12159,17 @@ class Xee extends VJ { return [...this.openingBrackets]; } } -var Fee = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Tte = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, AF = function(s, e) { +}, _D = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class EN { +class eR { constructor(e) { this.languageId = e; } @@ -12177,20 +12177,20 @@ class EN { return this.languageId ? this.languageId === e : !0; } } -const li = $e("languageConfigurationService"); -let P2 = class extends R { +const ci = $e("languageConfigurationService"); +let aw = class extends J { constructor(e, t) { - super(), this.configurationService = e, this.languageService = t, this._registry = this._register(new Bee()), this.onDidChangeEmitter = this._register(new k()), this.onDidChange = this.onDidChangeEmitter.event, this.configurations = /* @__PURE__ */ new Map(); - const i = new Set(Object.values(B2)); + super(), this.configurationService = e, this.languageService = t, this._registry = this._register(new vte()), this.onDidChangeEmitter = this._register(new k()), this.onDidChange = this.onDidChangeEmitter.event, this.configurations = /* @__PURE__ */ new Map(); + const i = new Set(Object.values(hw)); this._register(this.configurationService.onDidChangeConfiguration((n) => { - const o = n.change.keys.some((l) => i.has(l)), r = n.change.overrides.filter(([l, a]) => a.some((c) => i.has(c))).map(([l]) => l); + const o = n.change.keys.some((r) => i.has(r)), l = n.change.overrides.filter(([r, c]) => c.some((d) => i.has(d))).map(([r]) => r); if (o) - this.configurations.clear(), this.onDidChangeEmitter.fire(new EN(void 0)); + this.configurations.clear(), this.onDidChangeEmitter.fire(new eR(void 0)); else - for (const l of r) - this.languageService.isRegisteredLanguageId(l) && (this.configurations.delete(l), this.onDidChangeEmitter.fire(new EN(l))); + for (const r of l) + this.languageService.isRegisteredLanguageId(r) && (this.configurations.delete(r), this.onDidChangeEmitter.fire(new eR(r))); })), this._register(this._registry.onDidChange((n) => { - this.configurations.delete(n.languageId), this.onDidChangeEmitter.fire(new EN(n.languageId)); + this.configurations.delete(n.languageId), this.onDidChangeEmitter.fire(new eR(n.languageId)); })); } register(e, t, i) { @@ -12198,57 +12198,57 @@ let P2 = class extends R { } getLanguageConfiguration(e) { let t = this.configurations.get(e); - return t || (t = Yee(e, this._registry, this.configurationService, this.languageService), this.configurations.set(e, t)), t; + return t || (t = Mte(e, this._registry, this.configurationService, this.languageService), this.configurations.set(e, t)), t; } }; -P2 = Fee([ - AF(0, Ke), - AF(1, ri) -], P2); -function Yee(s, e, t, i) { +aw = Tte([ + _D(0, Qe), + _D(1, ri) +], aw); +function Mte(s, e, t, i) { let n = e.getLanguageConfiguration(s); if (!n) { if (!i.isRegisteredLanguageId(s)) - return new Lf(s, {}); - n = new Lf(s, {}); + return new Cg(s, {}); + n = new Cg(s, {}); } - const o = zee(n.languageId, t), r = GJ([n.underlyingConfig, o]); - return new Lf(n.languageId, r); + const o = Yte(n.languageId, t), l = f_([n.underlyingConfig, o]); + return new Cg(n.languageId, l); } -const B2 = { +const hw = { brackets: "editor.language.brackets", colorizedBracketPairs: "editor.language.colorizedBracketPairs" }; -function zee(s, e) { - const t = e.getValue(B2.brackets, { +function Yte(s, e) { + const t = e.getValue(hw.brackets, { overrideIdentifier: s - }), i = e.getValue(B2.colorizedBracketPairs, { + }), i = e.getValue(hw.colorizedBracketPairs, { overrideIdentifier: s }); return { - brackets: xF(t), - colorizedBracketPairs: xF(i) + brackets: QD(t), + colorizedBracketPairs: QD(i) }; } -function xF(s) { +function QD(s) { if (Array.isArray(s)) return s.map((e) => { if (!(!Array.isArray(e) || e.length !== 2)) return [e[0], e[1]]; }).filter((e) => !!e); } -function kJ(s, e, t) { +function Z_(s, e, t) { const i = s.getLineContent(e); - let n = Nt(i); + let n = Rt(i); return n.length > t - 1 && (n = n.substring(0, t - 1)), n; } -class Pee { +class kte { constructor(e) { this.languageId = e, this._resolved = null, this._entries = [], this._order = 0, this._resolved = null; } register(e, t) { - const i = new MF(e, t, ++this._order); - return this._entries.push(i), this._resolved = null, Ce(() => { + const i = new OD(e, t, ++this._order); + return this._entries.push(i), this._resolved = null, We(() => { for (let n = 0; n < this._entries.length; n++) if (this._entries[n] === i) { this._entries.splice(n, 1), this._resolved = null; @@ -12259,15 +12259,15 @@ class Pee { getResolvedConfiguration() { if (!this._resolved) { const e = this._resolve(); - e && (this._resolved = new Lf(this.languageId, e)); + e && (this._resolved = new Cg(this.languageId, e)); } return this._resolved; } _resolve() { - return this._entries.length === 0 ? null : (this._entries.sort(MF.cmp), GJ(this._entries.map((e) => e.configuration))); + return this._entries.length === 0 ? null : (this._entries.sort(OD.cmp), f_(this._entries.map((e) => e.configuration))); } } -function GJ(s) { +function f_(s) { let e = { comments: void 0, brackets: void 0, @@ -12297,7 +12297,7 @@ function GJ(s) { }; return e; } -class MF { +class OD { constructor(e, t, i) { this.configuration = e, this.priority = t, this.order = i; } @@ -12305,14 +12305,14 @@ class MF { return e.priority === t.priority ? e.order - t.order : e.priority - t.priority; } } -class ZF { +class jD { constructor(e) { this.languageId = e; } } -class Bee extends R { +class vte extends J { constructor() { - super(), this._entries = /* @__PURE__ */ new Map(), this._onDidChange = this._register(new k()), this.onDidChange = this._onDidChange.event, this._register(this.register(ms, { + super(), this._entries = /* @__PURE__ */ new Map(), this._onDidChange = this._register(new k()), this.onDidChange = this._onDidChange.event, this._register(this.register(gs, { brackets: [ ["(", ")"], ["[", "]"], @@ -12338,10 +12338,10 @@ class Bee extends R { */ register(e, t, i = 0) { let n = this._entries.get(e); - n || (n = new Pee(e), this._entries.set(e, n)); + n || (n = new kte(e), this._entries.set(e, n)); const o = n.register(t, i); - return this._onDidChange.fire(new ZF(e)), Ce(() => { - o.dispose(), this._onDidChange.fire(new ZF(e)); + return this._onDidChange.fire(new jD(e)), We(() => { + o.dispose(), this._onDidChange.fire(new jD(e)); }); } getLanguageConfiguration(e) { @@ -12349,24 +12349,24 @@ class Bee extends R { return (t == null ? void 0 : t.getResolvedConfiguration()) || null; } } -class Lf { +class Cg { constructor(e, t) { - this.languageId = e, this.underlyingConfig = t, this._brackets = null, this._electricCharacter = null, this._onEnterSupport = this.underlyingConfig.brackets || this.underlyingConfig.indentationRules || this.underlyingConfig.onEnterRules ? new Dp(this.underlyingConfig) : null, this.comments = Lf._handleComments(this.underlyingConfig), this.characterPair = new X2(this.underlyingConfig), this.wordDefinition = this.underlyingConfig.wordPattern || yE, this.indentationRules = this.underlyingConfig.indentationRules, this.underlyingConfig.indentationRules ? this.indentRulesSupport = new xee(this.underlyingConfig.indentationRules) : this.indentRulesSupport = null, this.foldingRules = this.underlyingConfig.folding || {}, this.bracketsNew = new Ree(e, this.underlyingConfig); + this.languageId = e, this.underlyingConfig = t, this._brackets = null, this._electricCharacter = null, this._onEnterSupport = this.underlyingConfig.brackets || this.underlyingConfig.indentationRules || this.underlyingConfig.onEnterRules ? new Ep(this.underlyingConfig) : null, this.comments = Cg._handleComments(this.underlyingConfig), this.characterPair = new lw(this.underlyingConfig), this.wordDefinition = this.underlyingConfig.wordPattern || Av, this.indentationRules = this.underlyingConfig.indentationRules, this.underlyingConfig.indentationRules ? this.indentRulesSupport = new gte(this.underlyingConfig.indentationRules) : this.indentRulesSupport = null, this.foldingRules = this.underlyingConfig.folding || {}, this.bracketsNew = new Rte(e, this.underlyingConfig); } getWordDefinition() { - return wE(this.wordDefinition); + return Kv(this.wordDefinition); } get brackets() { - return !this._brackets && this.underlyingConfig.brackets && (this._brackets = new bee(this.languageId, this.underlyingConfig.brackets)), this._brackets; + return !this._brackets && this.underlyingConfig.brackets && (this._brackets = new dte(this.languageId, this.underlyingConfig.brackets)), this._brackets; } get electricCharacter() { - return this._electricCharacter || (this._electricCharacter = new Aee(this.brackets)), this._electricCharacter; + return this._electricCharacter || (this._electricCharacter = new pte(this.brackets)), this._electricCharacter; } onEnter(e, t, i, n) { return this._onEnterSupport ? this._onEnterSupport.onEnter(e, t, i, n) : null; } getAutoClosingPairs() { - return new tee(this.characterPair.getAutoClosingPairs()); + return new Bee(this.characterPair.getAutoClosingPairs()); } getAutoCloseBeforeSet(e) { return this.characterPair.getAutoCloseBeforeSet(e); @@ -12387,12 +12387,12 @@ class Lf { } } it( - li, - P2, + ci, + aw, 1 /* InstantiationType.Delayed */ ); -class bl { +class Gr { static getLanguageId(e) { return (e & 255) >>> 0; } @@ -12420,8 +12420,8 @@ class bl { const i = this.getForeground(e), n = this.getFontStyle(e); let o = `color: ${t[i]};`; n & 1 && (o += "font-style: italic;"), n & 2 && (o += "font-weight: bold;"); - let r = ""; - return n & 4 && (r += " underline"), n & 8 && (r += " line-through"), r && (o += `text-decoration:${r};`), o; + let l = ""; + return n & 4 && (l += " underline"), n & 8 && (l += " line-through"), l && (o += `text-decoration:${l};`), o; } static getPresentationFromMetadata(e) { const t = this.getForeground(e), i = this.getFontStyle(e); @@ -12434,30 +12434,30 @@ class bl { }; } } -const lc = class lc { +const hd = class hd { static createEmpty(e, t) { - const i = lc.defaultTokenMetadata, n = new Uint32Array(2); - return n[0] = e.length, n[1] = i, new lc(n, e, t); + const i = hd.defaultTokenMetadata, n = new Uint32Array(2); + return n[0] = e.length, n[1] = i, new hd(n, e, t); } static createFromTextAndMetadata(e, t) { let i = 0, n = ""; const o = new Array(); - for (const { text: r, metadata: l } of e) - o.push(i + r.length, l), i += r.length, n += r; - return new lc(new Uint32Array(o), n, t); + for (const { text: l, metadata: r } of e) + o.push(i + l.length, r), i += l.length, n += l; + return new hd(new Uint32Array(o), n, t); } constructor(e, t, i) { this._lineTokensBrand = void 0, this._tokens = e, this._tokensCount = this._tokens.length >>> 1, this._text = t, this.languageIdCodec = i; } equals(e) { - return e instanceof lc ? this.slicedEquals(e, 0, this._tokensCount) : !1; + return e instanceof hd ? this.slicedEquals(e, 0, this._tokensCount) : !1; } slicedEquals(e, t, i) { if (this._text !== e._text || this._tokensCount !== e._tokensCount) return !1; const n = t << 1, o = n + (i << 1); - for (let r = n; r < o; r++) - if (this._tokens[r] !== e._tokens[r]) + for (let l = n; l < o; l++) + if (this._tokens[l] !== e._tokens[l]) return !1; return !0; } @@ -12474,28 +12474,28 @@ const lc = class lc { return this._tokens[(e << 1) + 1]; } getLanguageId(e) { - const t = this._tokens[(e << 1) + 1], i = bl.getLanguageId(t); + const t = this._tokens[(e << 1) + 1], i = Gr.getLanguageId(t); return this.languageIdCodec.decodeLanguageId(i); } getStandardTokenType(e) { const t = this._tokens[(e << 1) + 1]; - return bl.getTokenType(t); + return Gr.getTokenType(t); } getForeground(e) { const t = this._tokens[(e << 1) + 1]; - return bl.getForeground(t); + return Gr.getForeground(t); } getClassName(e) { const t = this._tokens[(e << 1) + 1]; - return bl.getClassNameFromMetadata(t); + return Gr.getClassNameFromMetadata(t); } getInlineStyle(e, t) { const i = this._tokens[(e << 1) + 1]; - return bl.getInlineStyleFromMetadata(i, t); + return Gr.getInlineStyleFromMetadata(i, t); } getPresentation(e) { const t = this._tokens[(e << 1) + 1]; - return bl.getPresentationFromMetadata(t); + return Gr.getPresentationFromMetadata(t); } getEndOffset(e) { return this._tokens[e << 1]; @@ -12506,13 +12506,13 @@ const lc = class lc { * @return The index of the token containing the offset. */ findTokenIndexAtOffset(e) { - return lc.findIndexInTokensArray(this._tokens, e); + return hd.findIndexInTokensArray(this._tokens, e); } inflate() { return this; } sliceAndInflate(e, t, i) { - return new xE(this, e, t, i); + return new Qv(this, e, t, i); } static convertToEndOffset(e, t) { const n = (e.length >>> 1) - 1; @@ -12525,10 +12525,10 @@ const lc = class lc { return 0; let i = 0, n = (e.length >>> 1) - 1; for (; i < n; ) { - const o = i + Math.floor((n - i) / 2), r = e[o << 1]; - if (r === t) + const o = i + Math.floor((n - i) / 2), l = e[o << 1]; + if (l === t) return o + 1; - r < t ? i = o + 1 : r > t && (n = o); + l < t ? i = o + 1 : l > t && (n = o); } return i; } @@ -12541,24 +12541,24 @@ const lc = class lc { return this; let t = 0, i = 0, n = ""; const o = new Array(); - let r = 0; + let l = 0; for (; ; ) { - const l = t < this._tokensCount ? this._tokens[t << 1] : -1, a = i < e.length ? e[i] : null; - if (l !== -1 && (a === null || l <= a.offset)) { - n += this._text.substring(r, l); - const c = this._tokens[(t << 1) + 1]; - o.push(n.length, c), t++, r = l; - } else if (a) { - if (a.offset > r) { - n += this._text.substring(r, a.offset); - const c = this._tokens[(t << 1) + 1]; - o.push(n.length, c), r = a.offset; + const r = t < this._tokensCount ? this._tokens[t << 1] : -1, c = i < e.length ? e[i] : null; + if (r !== -1 && (c === null || r <= c.offset)) { + n += this._text.substring(l, r); + const d = this._tokens[(t << 1) + 1]; + o.push(n.length, d), t++, l = r; + } else if (c) { + if (c.offset > l) { + n += this._text.substring(l, c.offset); + const d = this._tokens[(t << 1) + 1]; + o.push(n.length, d), l = c.offset; } - n += a.text, o.push(n.length, a.tokenMetadata), i++; + n += c.text, o.push(n.length, c.tokenMetadata), i++; } else break; } - return new lc(new Uint32Array(o), n, this.languageIdCodec); + return new hd(new Uint32Array(o), n, this.languageIdCodec); } getTokenText(e) { const t = this.getStartOffset(e), i = this.getEndOffset(e); @@ -12570,12 +12570,12 @@ const lc = class lc { e(i); } }; -lc.defaultTokenMetadata = (32768 | 2 << 24) >>> 0; -let rn = lc; -class xE { +hd.defaultTokenMetadata = (32768 | 2 << 24) >>> 0; +let rn = hd; +class Qv { constructor(e, t, i, n) { this._source = e, this._startOffset = t, this._endOffset = i, this._deltaOffset = n, this._firstTokenIndex = e.findTokenIndexAtOffset(t), this.languageIdCodec = e.languageIdCodec, this._tokensCount = 0; - for (let o = this._firstTokenIndex, r = e.getCount(); o < r && !(e.getStartOffset(o) >= i); o++) + for (let o = this._firstTokenIndex, l = e.getCount(); o < l && !(e.getStartOffset(o) >= i); o++) this._tokensCount++; } getMetadata(e) { @@ -12588,7 +12588,7 @@ class xE { return this._source.getLineContent().substring(this._startOffset, this._endOffset); } equals(e) { - return e instanceof xE ? this._startOffset === e._startOffset && this._endOffset === e._endOffset && this._deltaOffset === e._deltaOffset && this._source.slicedEquals(e._source, this._firstTokenIndex, this._tokensCount) : !1; + return e instanceof Qv ? this._startOffset === e._startOffset && this._endOffset === e._endOffset && this._deltaOffset === e._deltaOffset && this._source.slicedEquals(e._source, this._firstTokenIndex, this._tokensCount) : !1; } getCount() { return this._tokensCount; @@ -12625,7 +12625,7 @@ class xE { e(t); } } -function Oee(s, e) { +function Jte(s, e) { const t = e.lineNumber; if (!s.tokenization.isCheapToTokenize(t)) return; @@ -12633,9 +12633,9 @@ function Oee(s, e) { const i = s.tokenization.getLineTokens(t), n = i.findTokenIndexAtOffset(e.column - 1); return i.getStandardTokenType(n); } -class ME { +class Ov { constructor(e, t, i) { - this._indentRulesSupport = t, this._indentationLineProcessor = new RJ(e, i); + this._indentRulesSupport = t, this._indentationLineProcessor = new y_(e, i); } /** * Apply the new indentation and return whether the indentation level should be increased after the given line number @@ -12666,9 +12666,9 @@ class ME { return this._indentRulesSupport.shouldIndentNextLine(i); } } -class ZE { +class jv { constructor(e, t) { - this.model = e, this.indentationLineProcessor = new RJ(e, t); + this.model = e, this.indentationLineProcessor = new y_(e, t); } /** * Returns the processed text, stripped from the language configuration brackets within the string, comment and regex tokens, around the given range @@ -12679,41 +12679,41 @@ class ZE { } _getProcessedTokensBeforeRange(e) { this.model.tokenization.forceTokenization(e.startLineNumber); - const t = this.model.tokenization.getLineTokens(e.startLineNumber), i = qu(t, e.startColumn - 1); + const t = this.model.tokenization.getLineTokens(e.startLineNumber), i = nm(t, e.startColumn - 1); let n; - if (_E(this.model, e.getStartPosition())) { - const r = e.startColumn - 1 - i.firstCharOffset, l = i.firstCharOffset, a = l + r; - n = t.sliceAndInflate(l, a, 0); + if (qv(this.model, e.getStartPosition())) { + const l = e.startColumn - 1 - i.firstCharOffset, r = i.firstCharOffset, c = r + l; + n = t.sliceAndInflate(r, c, 0); } else { - const r = e.startColumn - 1; - n = t.sliceAndInflate(0, r, 0); + const l = e.startColumn - 1; + n = t.sliceAndInflate(0, l, 0); } return this.indentationLineProcessor.getProcessedTokens(n); } _getProcessedTokensAfterRange(e) { const t = e.isEmpty() ? e.getStartPosition() : e.getEndPosition(); this.model.tokenization.forceTokenization(t.lineNumber); - const i = this.model.tokenization.getLineTokens(t.lineNumber), n = qu(i, t.column - 1), o = t.column - 1 - n.firstCharOffset, r = n.firstCharOffset + o, l = n.firstCharOffset + n.getLineLength(), a = i.sliceAndInflate(r, l, 0); - return this.indentationLineProcessor.getProcessedTokens(a); + const i = this.model.tokenization.getLineTokens(t.lineNumber), n = nm(i, t.column - 1), o = t.column - 1 - n.firstCharOffset, l = n.firstCharOffset + o, r = n.firstCharOffset + n.getLineLength(), c = i.sliceAndInflate(l, r, 0); + return this.indentationLineProcessor.getProcessedTokens(c); } _getProcessedPreviousLineTokens(e) { - const t = (g) => { - this.model.tokenization.forceTokenization(g); - const m = this.model.tokenization.getLineTokens(g), f = this.model.getLineMaxColumn(g) - 1; - return qu(m, f); + const t = (m) => { + this.model.tokenization.forceTokenization(m); + const b = this.model.tokenization.getLineTokens(m), g = this.model.getLineMaxColumn(m) - 1; + return nm(b, g); }; this.model.tokenization.forceTokenization(e.startLineNumber); - const i = this.model.tokenization.getLineTokens(e.startLineNumber), n = qu(i, e.startColumn - 1), o = rn.createEmpty("", n.languageIdCodec), r = e.startLineNumber - 1; - if (r === 0 || !(n.firstCharOffset === 0)) + const i = this.model.tokenization.getLineTokens(e.startLineNumber), n = nm(i, e.startColumn - 1), o = rn.createEmpty("", n.languageIdCodec), l = e.startLineNumber - 1; + if (l === 0 || !(n.firstCharOffset === 0)) return o; - const c = t(r); - if (!(n.languageId === c.languageId)) + const d = t(l); + if (!(n.languageId === d.languageId)) return o; - const h = c.toIViewLineTokens(); + const h = d.toIViewLineTokens(); return this.indentationLineProcessor.getProcessedTokens(h); } } -class RJ { +class y_ { constructor(e, t) { this.model = e, this.languageConfigurationService = t; } @@ -12722,12 +12722,12 @@ class RJ { * Remove the language configuration brackets from the regex, string and comment tokens. */ getProcessedLine(e, t) { - var r, l; - const i = (a, c) => { - const d = Nt(a); - return c + a.substring(d.length); + var l, r; + const i = (c, d) => { + const a = Rt(c); + return d + c.substring(a.length); }; - (l = (r = this.model.tokenization).forceTokenization) == null || l.call(r, e); + (r = (l = this.model.tokenization).forceTokenization) == null || r.call(l, e); const n = this.model.tokenization.getLineTokens(e); let o = this.getProcessedTokens(n).getLineContent(); return t !== void 0 && (o = i(o, t)), o; @@ -12736,80 +12736,80 @@ class RJ { * Process the line with the given tokens, remove the language configuration brackets from the regex, string and comment tokens. */ getProcessedTokens(e) { - const t = (a) => a === 2 || a === 3 || a === 1, i = e.getLanguageId(0), o = this.languageConfigurationService.getLanguageConfiguration(i).bracketsNew.getBracketRegExp({ global: !0 }), r = []; - return e.forEach((a) => { - const c = e.getStandardTokenType(a); - let d = e.getTokenText(a); - t(c) && (d = d.replace(o, "")); - const h = e.getMetadata(a); - r.push({ text: d, metadata: h }); - }), rn.createFromTextAndMetadata(r, e.languageIdCodec); + const t = (c) => c === 2 || c === 3 || c === 1, i = e.getLanguageId(0), o = this.languageConfigurationService.getLanguageConfiguration(i).bracketsNew.getBracketRegExp({ global: !0 }), l = []; + return e.forEach((c) => { + const d = e.getStandardTokenType(c); + let a = e.getTokenText(c); + t(d) && (a = a.replace(o, "")); + const h = e.getMetadata(c); + l.push({ text: a, metadata: h }); + }), rn.createFromTextAndMetadata(l, e.languageIdCodec); } } -function _E(s, e) { +function qv(s, e) { s.tokenization.forceTokenization(e.lineNumber); - const t = s.tokenization.getLineTokens(e.lineNumber), i = qu(t, e.column - 1), n = i.firstCharOffset === 0, o = t.getLanguageId(0) === i.languageId; + const t = s.tokenization.getLineTokens(e.lineNumber), i = nm(t, e.column - 1), n = i.firstCharOffset === 0, o = t.getLanguageId(0) === i.languageId; return !n && !o; } -function Af(s, e, t, i) { +function Rg(s, e, t, i) { e.tokenization.forceTokenization(t.startLineNumber); const n = e.getLanguageIdAtPosition(t.startLineNumber, t.startColumn), o = i.getLanguageConfiguration(n); if (!o) return null; - const l = new ZE(e, i).getProcessedTokenContextAroundRange(t), a = l.previousLineProcessedTokens.getLineContent(), c = l.beforeRangeProcessedTokens.getLineContent(), d = l.afterRangeProcessedTokens.getLineContent(), h = o.onEnter(s, a, c, d); + const r = new jv(e, i).getProcessedTokenContextAroundRange(t), c = r.previousLineProcessedTokens.getLineContent(), d = r.beforeRangeProcessedTokens.getLineContent(), a = r.afterRangeProcessedTokens.getLineContent(), h = o.onEnter(s, c, d, a); if (!h) return null; const u = h.indentAction; - let g = h.appendText; - const m = h.removeText || 0; - g ? u === Ei.Indent && (g = " " + g) : u === Ei.Indent || u === Ei.IndentOutdent ? g = " " : g = ""; - let f = kJ(e, t.startLineNumber, t.startColumn); - return m && (f = f.substring(0, f.length - m)), { + let m = h.appendText; + const b = h.removeText || 0; + m ? u === Ei.Indent && (m = " " + m) : u === Ei.Indent || u === Ei.IndentOutdent ? m = " " : m = ""; + let g = Z_(e, t.startLineNumber, t.startColumn); + return b && (g = g.substring(0, g.length - b)), { indentAction: u, - appendText: g, - removeText: m, - indentation: f + appendText: m, + removeText: b, + indentation: g }; } -var Hee = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Hte = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Jee = function(s, e) { +}, Ete = function(s, e) { return function(t, i) { e(t, i, s); }; -}, yL; -const XN = /* @__PURE__ */ Object.create(null); -function cu(s, e) { +}, MX; +const tR = /* @__PURE__ */ Object.create(null); +function mu(s, e) { if (e <= 0) return ""; - XN[s] || (XN[s] = ["", s]); - const t = XN[s]; + tR[s] || (tR[s] = ["", s]); + const t = tR[s]; for (let i = t.length; i <= e; i++) t[i] = t[i - 1] + s; return t[e]; } -let wr = yL = class { +let Xl = MX = class { static unshiftIndent(e, t, i, n, o) { - const r = Yi.visibleColumnFromColumn(e, t, i); + const l = zi.visibleColumnFromColumn(e, t, i); if (o) { - const l = cu(" ", n), c = Yi.prevIndentTabStop(r, n) / n; - return cu(l, c); + const r = mu(" ", n), d = zi.prevIndentTabStop(l, n) / n; + return mu(r, d); } else { - const l = " ", c = Yi.prevRenderTabStop(r, i) / i; - return cu(l, c); + const r = " ", d = zi.prevRenderTabStop(l, i) / i; + return mu(r, d); } } static shiftIndent(e, t, i, n, o) { - const r = Yi.visibleColumnFromColumn(e, t, i); + const l = zi.visibleColumnFromColumn(e, t, i); if (o) { - const l = cu(" ", n), c = Yi.nextIndentTabStop(r, n) / n; - return cu(l, c); + const r = mu(" ", n), d = zi.nextIndentTabStop(l, n) / n; + return mu(r, d); } else { - const l = " ", c = Yi.nextRenderTabStop(r, i) / i; - return cu(l, c); + const r = " ", d = zi.nextRenderTabStop(l, i) / i; + return mu(r, d); } } constructor(e, t, i) { @@ -12822,49 +12822,49 @@ let wr = yL = class { const i = this._selection.startLineNumber; let n = this._selection.endLineNumber; this._selection.endColumn === 1 && i !== n && (n = n - 1); - const { tabSize: o, indentSize: r, insertSpaces: l } = this._opts, a = i === n; + const { tabSize: o, indentSize: l, insertSpaces: r } = this._opts, c = i === n; if (this._opts.useTabStops) { this._selection.isEmpty() && /^\s*$/.test(e.getLineContent(i)) && (this._useLastEditRangeForCursorEndPosition = !0); - let c = 0, d = 0; - for (let h = i; h <= n; h++, c = d) { - d = 0; + let d = 0, a = 0; + for (let h = i; h <= n; h++, d = a) { + a = 0; const u = e.getLineContent(h); - let g = qn(u); - if (this._opts.isUnshift && (u.length === 0 || g === 0) || !a && !this._opts.isUnshift && u.length === 0) + let m = es(u); + if (this._opts.isUnshift && (u.length === 0 || m === 0) || !c && !this._opts.isUnshift && u.length === 0) continue; - if (g === -1 && (g = u.length), h > 1 && Yi.visibleColumnFromColumn(u, g + 1, o) % r !== 0 && e.tokenization.isCheapToTokenize(h - 1)) { - const b = Af(this._opts.autoIndent, e, new M(h - 1, e.getLineMaxColumn(h - 1), h - 1, e.getLineMaxColumn(h - 1)), this._languageConfigurationService); - if (b) { - if (d = c, b.appendText) - for (let y = 0, w = b.appendText.length; y < w && d < r && b.appendText.charCodeAt(y) === 32; y++) - d++; - b.removeText && (d = Math.max(0, d - b.removeText)); - for (let y = 0; y < d && !(g === 0 || u.charCodeAt(g - 1) !== 32); y++) - g--; + if (m === -1 && (m = u.length), h > 1 && zi.visibleColumnFromColumn(u, m + 1, o) % l !== 0 && e.tokenization.isCheapToTokenize(h - 1)) { + const Z = Rg(this._opts.autoIndent, e, new I(h - 1, e.getLineMaxColumn(h - 1), h - 1, e.getLineMaxColumn(h - 1)), this._languageConfigurationService); + if (Z) { + if (a = d, Z.appendText) + for (let f = 0, y = Z.appendText.length; f < y && a < l && Z.appendText.charCodeAt(f) === 32; f++) + a++; + Z.removeText && (a = Math.max(0, a - Z.removeText)); + for (let f = 0; f < a && !(m === 0 || u.charCodeAt(m - 1) !== 32); f++) + m--; } } - if (this._opts.isUnshift && g === 0) + if (this._opts.isUnshift && m === 0) continue; - let m; - this._opts.isUnshift ? m = yL.unshiftIndent(u, g + 1, o, r, l) : m = yL.shiftIndent(u, g + 1, o, r, l), this._addEditOperation(t, new M(h, 1, h, g + 1), m), h === i && !this._selection.isEmpty() && (this._selectionStartColumnStaysPut = this._selection.startColumn <= g + 1); + let b; + this._opts.isUnshift ? b = MX.unshiftIndent(u, m + 1, o, l, r) : b = MX.shiftIndent(u, m + 1, o, l, r), this._addEditOperation(t, new I(h, 1, h, m + 1), b), h === i && !this._selection.isEmpty() && (this._selectionStartColumnStaysPut = this._selection.startColumn <= m + 1); } } else { !this._opts.isUnshift && this._selection.isEmpty() && e.getLineLength(i) === 0 && (this._useLastEditRangeForCursorEndPosition = !0); - const c = l ? cu(" ", r) : " "; - for (let d = i; d <= n; d++) { - const h = e.getLineContent(d); - let u = qn(h); - if (!(this._opts.isUnshift && (h.length === 0 || u === 0)) && !(!a && !this._opts.isUnshift && h.length === 0) && (u === -1 && (u = h.length), !(this._opts.isUnshift && u === 0))) + const d = r ? mu(" ", l) : " "; + for (let a = i; a <= n; a++) { + const h = e.getLineContent(a); + let u = es(h); + if (!(this._opts.isUnshift && (h.length === 0 || u === 0)) && !(!c && !this._opts.isUnshift && h.length === 0) && (u === -1 && (u = h.length), !(this._opts.isUnshift && u === 0))) if (this._opts.isUnshift) { - u = Math.min(u, r); - for (let g = 0; g < u; g++) - if (h.charCodeAt(g) === 9) { - u = g + 1; + u = Math.min(u, l); + for (let m = 0; m < u; m++) + if (h.charCodeAt(m) === 9) { + u = m + 1; break; } - this._addEditOperation(t, new M(d, 1, d, u + 1), ""); + this._addEditOperation(t, new I(a, 1, a, u + 1), ""); } else - this._addEditOperation(t, new M(d, 1, d, 1), c), d === i && !this._selection.isEmpty() && (this._selectionStartColumnStaysPut = this._selection.startColumn === 1); + this._addEditOperation(t, new I(a, 1, a, 1), d), a === i && !this._selection.isEmpty() && (this._selectionStartColumnStaysPut = this._selection.startColumn === 1); } } this._selectionId = t.trackSelection(this._selection); @@ -12872,52 +12872,52 @@ let wr = yL = class { computeCursorState(e, t) { if (this._useLastEditRangeForCursorEndPosition) { const n = t.getInverseEditOperations()[0]; - return new fe(n.range.endLineNumber, n.range.endColumn, n.range.endLineNumber, n.range.endColumn); + return new ge(n.range.endLineNumber, n.range.endColumn, n.range.endLineNumber, n.range.endColumn); } const i = t.getTrackedSelection(this._selectionId); if (this._selectionStartColumnStaysPut) { const n = this._selection.startColumn; - return i.startColumn <= n ? i : i.getDirection() === 0 ? new fe(i.startLineNumber, n, i.endLineNumber, i.endColumn) : new fe(i.endLineNumber, i.endColumn, i.startLineNumber, n); + return i.startColumn <= n ? i : i.getDirection() === 0 ? new ge(i.startLineNumber, n, i.endLineNumber, i.endColumn) : new ge(i.endLineNumber, i.endColumn, i.startLineNumber, n); } return i; } }; -wr = yL = Hee([ - Jee(2, li) -], wr); -class Uee { +Xl = MX = Hte([ + Ete(2, ci) +], Xl); +class Dte { constructor(e, t, i) { this._range = e, this._charBeforeSelection = t, this._charAfterSelection = i; } getEditOperations(e, t) { - t.addTrackedEditOperation(new M(this._range.startLineNumber, this._range.startColumn, this._range.startLineNumber, this._range.startColumn), this._charBeforeSelection), t.addTrackedEditOperation(new M(this._range.endLineNumber, this._range.endColumn, this._range.endLineNumber, this._range.endColumn), this._charAfterSelection); + t.addTrackedEditOperation(new I(this._range.startLineNumber, this._range.startColumn, this._range.startLineNumber, this._range.startColumn), this._charBeforeSelection), t.addTrackedEditOperation(new I(this._range.endLineNumber, this._range.endColumn, this._range.endLineNumber, this._range.endColumn), this._charAfterSelection); } computeCursorState(e, t) { const i = t.getInverseEditOperations(), n = i[0].range, o = i[1].range; - return new fe(n.endLineNumber, n.endColumn, o.endLineNumber, o.endColumn - this._charAfterSelection.length); + return new ge(n.endLineNumber, n.endColumn, o.endLineNumber, o.endColumn - this._charAfterSelection.length); } } -class Kee { +class Fte { constructor(e, t, i) { this._position = e, this._text = t, this._charAfter = i; } getEditOperations(e, t) { - t.addTrackedEditOperation(new M(this._position.lineNumber, this._position.column, this._position.lineNumber, this._position.column), this._text + this._charAfter); + t.addTrackedEditOperation(new I(this._position.lineNumber, this._position.column, this._position.lineNumber, this._position.column), this._text + this._charAfter); } computeCursorState(e, t) { const n = t.getInverseEditOperations()[0].range; - return new fe(n.endLineNumber, n.startColumn, n.endLineNumber, n.endColumn - this._charAfter.length); + return new ge(n.endLineNumber, n.startColumn, n.endLineNumber, n.endColumn - this._charAfter.length); } } -function Qee(s, e, t) { +function zte(s, e, t) { const i = s.tokenization.getLanguageIdAtPosition(e, 0); if (e > 1) { let n, o = -1; for (n = e - 1; n >= 1; n--) { if (s.tokenization.getLanguageIdAtPosition(n, 0) !== i) return o; - const r = s.getLineContent(n); - if (t.shouldIgnore(n) || /^\s+$/.test(r) || r === "") { + const l = s.getLineContent(n); + if (t.shouldIgnore(n) || /^\s+$/.test(l) || l === "") { o = n; continue; } @@ -12926,192 +12926,192 @@ function Qee(s, e, t) { } return -1; } -function Xw(s, e, t, i = !0, n) { +function jy(s, e, t, i = !0, n) { if (s < 4) return null; const o = n.getLanguageConfiguration(e.tokenization.getLanguageId()).indentRulesSupport; if (!o) return null; - const r = new ME(e, o, n); + const l = new Ov(e, o, n); if (t <= 1) return { indentation: "", action: null }; - for (let a = t - 1; a > 0 && e.getLineContent(a) === ""; a--) - if (a === 1) + for (let c = t - 1; c > 0 && e.getLineContent(c) === ""; c--) + if (c === 1) return { indentation: "", action: null }; - const l = Qee(e, t, r); - if (l < 0) + const r = zte(e, t, l); + if (r < 0) return null; - if (l < 1) + if (r < 1) return { indentation: "", action: null }; - if (r.shouldIncrease(l) || r.shouldIndentNextLine(l)) { - const a = e.getLineContent(l); + if (l.shouldIncrease(r) || l.shouldIndentNextLine(r)) { + const c = e.getLineContent(r); return { - indentation: Nt(a), + indentation: Rt(c), action: Ei.Indent, - line: l + line: r }; - } else if (r.shouldDecrease(l)) { - const a = e.getLineContent(l); + } else if (l.shouldDecrease(r)) { + const c = e.getLineContent(r); return { - indentation: Nt(a), + indentation: Rt(c), action: null, - line: l + line: r }; } else { - if (l === 1) + if (r === 1) return { - indentation: Nt(e.getLineContent(l)), + indentation: Rt(e.getLineContent(r)), action: null, - line: l + line: r }; - const a = l - 1, c = o.getIndentMetadata(e.getLineContent(a)); - if (!(c & 3) && c & 4) { - let d = 0; - for (let h = a - 1; h > 0; h--) - if (!r.shouldIndentNextLine(h)) { - d = h; + const c = r - 1, d = o.getIndentMetadata(e.getLineContent(c)); + if (!(d & 3) && d & 4) { + let a = 0; + for (let h = c - 1; h > 0; h--) + if (!l.shouldIndentNextLine(h)) { + a = h; break; } return { - indentation: Nt(e.getLineContent(d + 1)), + indentation: Rt(e.getLineContent(a + 1)), action: null, - line: d + 1 + line: a + 1 }; } if (i) return { - indentation: Nt(e.getLineContent(l)), + indentation: Rt(e.getLineContent(r)), action: null, - line: l + line: r }; - for (let d = l; d > 0; d--) { - if (r.shouldIncrease(d)) + for (let a = r; a > 0; a--) { + if (l.shouldIncrease(a)) return { - indentation: Nt(e.getLineContent(d)), + indentation: Rt(e.getLineContent(a)), action: Ei.Indent, - line: d + line: a }; - if (r.shouldIndentNextLine(d)) { + if (l.shouldIndentNextLine(a)) { let h = 0; - for (let u = d - 1; u > 0; u--) - if (!r.shouldIndentNextLine(d)) { + for (let u = a - 1; u > 0; u--) + if (!l.shouldIndentNextLine(a)) { h = u; break; } return { - indentation: Nt(e.getLineContent(h + 1)), + indentation: Rt(e.getLineContent(h + 1)), action: null, line: h + 1 }; - } else if (r.shouldDecrease(d)) + } else if (l.shouldDecrease(a)) return { - indentation: Nt(e.getLineContent(d)), + indentation: Rt(e.getLineContent(a)), action: null, - line: d + line: a }; } return { - indentation: Nt(e.getLineContent(1)), + indentation: Rt(e.getLineContent(1)), action: null, line: 1 }; } } -function Ny(s, e, t, i, n, o) { +function Df(s, e, t, i, n, o) { if (s < 4) return null; - const r = o.getLanguageConfiguration(t); - if (!r) - return null; - const l = o.getLanguageConfiguration(t).indentRulesSupport; + const l = o.getLanguageConfiguration(t); if (!l) return null; - const a = new ME(e, l, o), c = Xw(s, e, i, void 0, o); - if (c) { - const d = c.line; - if (d !== void 0) { + const r = o.getLanguageConfiguration(t).indentRulesSupport; + if (!r) + return null; + const c = new Ov(e, r, o), d = jy(s, e, i, void 0, o); + if (d) { + const a = d.line; + if (a !== void 0) { let h = !0; - for (let u = d; u < i - 1; u++) + for (let u = a; u < i - 1; u++) if (!/^\s*$/.test(e.getLineContent(u))) { h = !1; break; } if (h) { - const u = r.onEnter(s, "", e.getLineContent(d), ""); + const u = l.onEnter(s, "", e.getLineContent(a), ""); if (u) { - let g = Nt(e.getLineContent(d)); - return u.removeText && (g = g.substring(0, g.length - u.removeText)), u.indentAction === Ei.Indent || u.indentAction === Ei.IndentOutdent ? g = n.shiftIndent(g) : u.indentAction === Ei.Outdent && (g = n.unshiftIndent(g)), a.shouldDecrease(i) && (g = n.unshiftIndent(g)), u.appendText && (g += u.appendText), Nt(g); + let m = Rt(e.getLineContent(a)); + return u.removeText && (m = m.substring(0, m.length - u.removeText)), u.indentAction === Ei.Indent || u.indentAction === Ei.IndentOutdent ? m = n.shiftIndent(m) : u.indentAction === Ei.Outdent && (m = n.unshiftIndent(m)), c.shouldDecrease(i) && (m = n.unshiftIndent(m)), u.appendText && (m += u.appendText), Rt(m); } } } - return a.shouldDecrease(i) ? c.action === Ei.Indent ? c.indentation : n.unshiftIndent(c.indentation) : c.action === Ei.Indent ? n.shiftIndent(c.indentation) : c.indentation; + return c.shouldDecrease(i) ? d.action === Ei.Indent ? d.indentation : n.unshiftIndent(d.indentation) : d.action === Ei.Indent ? n.shiftIndent(d.indentation) : d.indentation; } return null; } -function jee(s, e, t, i, n) { +function Ate(s, e, t, i, n) { if (s < 4) return null; - const o = e.getLanguageIdAtPosition(t.startLineNumber, t.startColumn), r = n.getLanguageConfiguration(o).indentRulesSupport; - if (!r) + const o = e.getLanguageIdAtPosition(t.startLineNumber, t.startColumn), l = n.getLanguageConfiguration(o).indentRulesSupport; + if (!l) return null; e.tokenization.forceTokenization(t.startLineNumber); - const a = new ZE(e, n).getProcessedTokenContextAroundRange(t), c = a.afterRangeProcessedTokens, d = a.beforeRangeProcessedTokens, h = Nt(d.getLineContent()), u = $ee(e, t.startLineNumber, d), g = _E(e, t.getStartPosition()), m = e.getLineContent(t.startLineNumber), f = Nt(m), b = Xw(s, u, t.startLineNumber + 1, void 0, n); - if (!b) { - const w = g ? f : h; + const c = new jv(e, n).getProcessedTokenContextAroundRange(t), d = c.afterRangeProcessedTokens, a = c.beforeRangeProcessedTokens, h = Rt(a.getLineContent()), u = Ute(e, t.startLineNumber, a), m = qv(e, t.getStartPosition()), b = e.getLineContent(t.startLineNumber), g = Rt(b), Z = jy(s, u, t.startLineNumber + 1, void 0, n); + if (!Z) { + const y = m ? g : h; return { - beforeEnter: w, - afterEnter: w + beforeEnter: y, + afterEnter: y }; } - let y = g ? f : b.indentation; - return b.action === Ei.Indent && (y = i.shiftIndent(y)), r.shouldDecrease(c.getLineContent()) && (y = i.unshiftIndent(y)), { - beforeEnter: g ? f : h, - afterEnter: y + let f = m ? g : Z.indentation; + return Z.action === Ei.Indent && (f = i.shiftIndent(f)), l.shouldDecrease(d.getLineContent()) && (f = i.unshiftIndent(f)), { + beforeEnter: m ? g : h, + afterEnter: f }; } -function qee(s, e, t, i, n, o) { - const r = s.autoIndent; - if (r < 4 || _E(e, t.getStartPosition())) +function Kte(s, e, t, i, n, o) { + const l = s.autoIndent; + if (l < 4 || qv(e, t.getStartPosition())) return null; - const a = e.getLanguageIdAtPosition(t.startLineNumber, t.startColumn), c = o.getLanguageConfiguration(a).indentRulesSupport; - if (!c) + const c = e.getLanguageIdAtPosition(t.startLineNumber, t.startColumn), d = o.getLanguageConfiguration(c).indentRulesSupport; + if (!d) return null; - const h = new ZE(e, o).getProcessedTokenContextAroundRange(t), u = h.beforeRangeProcessedTokens.getLineContent(), g = h.afterRangeProcessedTokens.getLineContent(), m = u + g, f = u + i + g; - if (!c.shouldDecrease(m) && c.shouldDecrease(f)) { - const y = Xw(r, e, t.startLineNumber, !1, o); - if (!y) + const h = new jv(e, o).getProcessedTokenContextAroundRange(t), u = h.beforeRangeProcessedTokens.getLineContent(), m = h.afterRangeProcessedTokens.getLineContent(), b = u + m, g = u + i + m; + if (!d.shouldDecrease(b) && d.shouldDecrease(g)) { + const f = jy(l, e, t.startLineNumber, !1, o); + if (!f) return null; - let w = y.indentation; - return y.action !== Ei.Indent && (w = n.unshiftIndent(w)), w; + let y = f.indentation; + return f.action !== Ei.Indent && (y = n.unshiftIndent(y)), y; } - const b = t.startLineNumber - 1; - if (b > 0) { - const y = e.getLineContent(b); - if (c.shouldIndentNextLine(y) && c.shouldIncrease(f)) { - const w = Xw(r, e, t.startLineNumber, !1, o), C = w == null ? void 0 : w.indentation; - if (C !== void 0) { - const S = e.getLineContent(t.startLineNumber), L = Nt(S), Z = n.shiftIndent(C) === L, _ = /^\s*$/.test(m), v = s.autoClosingPairs.autoClosingPairsOpenByEnd.get(i), E = v && v.length > 0 && _; - if (Z && E) - return C; + const Z = t.startLineNumber - 1; + if (Z > 0) { + const f = e.getLineContent(Z); + if (d.shouldIndentNextLine(f) && d.shouldIncrease(g)) { + const y = jy(l, e, t.startLineNumber, !1, o), W = y == null ? void 0 : y.indentation; + if (W !== void 0) { + const G = e.getLineContent(t.startLineNumber), X = Rt(G), S = n.shiftIndent(W) === X, x = /^\s*$/.test(b), w = s.autoClosingPairs.autoClosingPairsOpenByEnd.get(i), H = w && w.length > 0 && x; + if (S && H) + return W; } } } return null; } -function EJ(s, e, t) { +function W_(s, e, t) { const i = t.getLanguageConfiguration(s.getLanguageId()).indentRulesSupport; return !i || e < 1 || e > s.getLineCount() ? null : i.getIndentMetadata(s.getLineContent(e)); } -function $ee(s, e, t) { +function Ute(s, e, t) { return { tokenization: { getLineTokens: (n) => n === e ? t : s.tokenization.getLineTokens(n), @@ -13121,18 +13121,18 @@ function $ee(s, e, t) { getLineContent: (n) => n === e ? t.getLineContent() : s.getLineContent(n) }; } -class ete { +class Pte { static getEdits(e, t, i, n, o) { if (!o && this._isAutoIndentType(e, t, i)) { - const r = []; - for (const a of i) { - const c = this._findActualIndentationForSelection(e, t, a, n); - if (c === null) + const l = []; + for (const c of i) { + const d = this._findActualIndentationForSelection(e, t, c, n); + if (d === null) return; - r.push({ selection: a, indentation: c }); + l.push({ selection: c, indentation: d }); } - const l = O2.getAutoClosingPairClose(e, t, i, n, !1); - return this._getIndentationAndAutoClosingPairEdits(e, t, r, n, l); + const r = uw.getAutoClosingPairClose(e, t, i, n, !1); + return this._getIndentationAndAutoClosingPairEdits(e, t, l, n, r); } } static _isAutoIndentType(e, t, i) { @@ -13144,50 +13144,50 @@ class ete { return !0; } static _findActualIndentationForSelection(e, t, i, n) { - const o = qee(e, t, i, n, { - shiftIndent: (l) => WE(e, l), - unshiftIndent: (l) => LA(e, l) + const o = Kte(e, t, i, n, { + shiftIndent: (r) => tJ(e, r), + unshiftIndent: (r) => JV(e, r) }, e.languageConfigurationService); if (o === null) return null; - const r = kJ(t, i.startLineNumber, i.startColumn); - return o === e.normalizeIndentation(r) ? null : o; + const l = Z_(t, i.startLineNumber, i.startColumn); + return o === e.normalizeIndentation(l) ? null : o; } static _getIndentationAndAutoClosingPairEdits(e, t, i, n, o) { - const r = i.map(({ selection: a, indentation: c }) => { + const l = i.map(({ selection: c, indentation: d }) => { if (o !== null) { - const d = this._getEditFromIndentationAndSelection(e, t, c, a, n, !1); - return new hte(d, a, n, o); + const a = this._getEditFromIndentationAndSelection(e, t, d, c, n, !1); + return new nie(a, c, n, o); } else { - const d = this._getEditFromIndentationAndSelection(e, t, c, a, n, !0); - return Lu(d.range, d.text, !1); + const a = this._getEditFromIndentationAndSelection(e, t, d, c, n, !0); + return xu(a.range, a.text, !1); } - }), l = { shouldPushStackElementBefore: !0, shouldPushStackElementAfter: !1 }; - return new Es(4, r, l); + }), r = { shouldPushStackElementBefore: !0, shouldPushStackElementAfter: !1 }; + return new Ds(4, l, r); } - static _getEditFromIndentationAndSelection(e, t, i, n, o, r = !0) { - const l = n.startLineNumber, a = t.getLineFirstNonWhitespaceColumn(l); - let c = e.normalizeIndentation(i); - if (a !== 0) { - const h = t.getLineContent(l); - c += h.substring(a - 1, n.startColumn - 1); + static _getEditFromIndentationAndSelection(e, t, i, n, o, l = !0) { + const r = n.startLineNumber, c = t.getLineFirstNonWhitespaceColumn(r); + let d = e.normalizeIndentation(i); + if (c !== 0) { + const h = t.getLineContent(r); + d += h.substring(c - 1, n.startColumn - 1); } - return c += r ? o : "", { range: new M(l, 1, n.endLineNumber, n.endColumn), text: c }; + return d += l ? o : "", { range: new I(r, 1, n.endLineNumber, n.endColumn), text: d }; } } -class tte { - static getEdits(e, t, i, n, o, r) { - if (XJ(t, i, n, o, r)) - return this._runAutoClosingOvertype(e, n, r); +class Bte { + static getEdits(e, t, i, n, o, l) { + if (G_(t, i, n, o, l)) + return this._runAutoClosingOvertype(e, n, l); } static _runAutoClosingOvertype(e, t, i) { const n = []; - for (let o = 0, r = t.length; o < r; o++) { - const a = t[o].getPosition(), c = new M(a.lineNumber, a.column, a.lineNumber, a.column + 1); - n[o] = new Mn(c, i); + for (let o = 0, l = t.length; o < l; o++) { + const c = t[o].getPosition(), d = new I(c.lineNumber, c.column, c.lineNumber, c.column + 1); + n[o] = new Sn(d, i); } - return new Es(4, n, { - shouldPushStackElementBefore: q_( + return new Ds(4, n, { + shouldPushStackElementBefore: mx( e, 4 /* EditOperationType.TypingOther */ @@ -13196,80 +13196,80 @@ class tte { }); } } -class ite { +class _te { static getEdits(e, t, i, n, o) { - if (XJ(e, t, i, n, o)) { - const r = i.map((l) => new Mn(new M(l.positionLineNumber, l.positionColumn, l.positionLineNumber, l.positionColumn + 1), "", !1)); - return new Es(4, r, { + if (G_(e, t, i, n, o)) { + const l = i.map((r) => new Sn(new I(r.positionLineNumber, r.positionColumn, r.positionLineNumber, r.positionColumn + 1), "", !1)); + return new Ds(4, l, { shouldPushStackElementBefore: !0, shouldPushStackElementAfter: !1 }); } } } -class O2 { - static getEdits(e, t, i, n, o, r) { - if (!r) { - const l = this.getAutoClosingPairClose(e, t, i, n, o); - if (l !== null) - return this._runAutoClosingOpenCharType(i, n, o, l); +class uw { + static getEdits(e, t, i, n, o, l) { + if (!l) { + const r = this.getAutoClosingPairClose(e, t, i, n, o); + if (r !== null) + return this._runAutoClosingOpenCharType(i, n, o, r); } } static _runAutoClosingOpenCharType(e, t, i, n) { const o = []; - for (let r = 0, l = e.length; r < l; r++) { - const a = e[r]; - o[r] = new dte(a, t, !i, n); + for (let l = 0, r = e.length; l < r; l++) { + const c = e[l]; + o[l] = new iie(c, t, !i, n); } - return new Es(4, o, { + return new Ds(4, o, { shouldPushStackElementBefore: !0, shouldPushStackElementAfter: !1 }); } static getAutoClosingPairClose(e, t, i, n, o) { - for (const m of i) - if (!m.isEmpty()) + for (const b of i) + if (!b.isEmpty()) return null; - const r = i.map((m) => { - const f = m.getPosition(); - return o ? { lineNumber: f.lineNumber, beforeColumn: f.column - n.length, afterColumn: f.column } : { lineNumber: f.lineNumber, beforeColumn: f.column, afterColumn: f.column }; - }), l = this._findAutoClosingPairOpen(e, t, r.map((m) => new V(m.lineNumber, m.beforeColumn)), n); - if (!l) + const l = i.map((b) => { + const g = b.getPosition(); + return o ? { lineNumber: g.lineNumber, beforeColumn: g.column - n.length, afterColumn: g.column } : { lineNumber: g.lineNumber, beforeColumn: g.column, afterColumn: g.column }; + }), r = this._findAutoClosingPairOpen(e, t, l.map((b) => new Y(b.lineNumber, b.beforeColumn)), n); + if (!r) return null; - let a, c; - if (vh(n) ? (a = e.autoClosingQuotes, c = e.shouldAutoCloseBefore.quote) : (e.blockCommentStartToken ? l.open.includes(e.blockCommentStartToken) : !1) ? (a = e.autoClosingComments, c = e.shouldAutoCloseBefore.comment) : (a = e.autoClosingBrackets, c = e.shouldAutoCloseBefore.bracket), a === "never") + let c, d; + if (kh(n) ? (c = e.autoClosingQuotes, d = e.shouldAutoCloseBefore.quote) : (e.blockCommentStartToken ? r.open.includes(e.blockCommentStartToken) : !1) ? (c = e.autoClosingComments, d = e.shouldAutoCloseBefore.comment) : (c = e.autoClosingBrackets, d = e.shouldAutoCloseBefore.bracket), c === "never") return null; - const h = this._findContainedAutoClosingPair(e, l), u = h ? h.close : ""; - let g = !0; - for (const m of r) { - const { lineNumber: f, beforeColumn: b, afterColumn: y } = m, w = t.getLineContent(f), C = w.substring(0, b - 1), S = w.substring(y - 1); - if (S.startsWith(u) || (g = !1), S.length > 0) { - const _ = S.charAt(0); - if (!this._isBeforeClosingBrace(e, S) && !c(_)) + const h = this._findContainedAutoClosingPair(e, r), u = h ? h.close : ""; + let m = !0; + for (const b of l) { + const { lineNumber: g, beforeColumn: Z, afterColumn: f } = b, y = t.getLineContent(g), W = y.substring(0, Z - 1), G = y.substring(f - 1); + if (G.startsWith(u) || (m = !1), G.length > 0) { + const x = G.charAt(0); + if (!this._isBeforeClosingBrace(e, G) && !d(x)) return null; } - if (l.open.length === 1 && (n === "'" || n === '"') && a !== "always") { - const _ = yr(e.wordSeparators, []); - if (C.length > 0) { - const v = C.charCodeAt(C.length - 1); - if (_.get(v) === 0) + if (r.open.length === 1 && (n === "'" || n === '"') && c !== "always") { + const x = Gl(e.wordSeparators, []); + if (W.length > 0) { + const w = W.charCodeAt(W.length - 1); + if (x.get(w) === 0) return null; } } - if (!t.tokenization.isCheapToTokenize(f)) + if (!t.tokenization.isCheapToTokenize(g)) return null; - t.tokenization.forceTokenization(f); - const L = t.tokenization.getLineTokens(f), x = qu(L, b - 1); - if (!l.shouldAutoClose(x, b - x.firstCharOffset)) + t.tokenization.forceTokenization(g); + const X = t.tokenization.getLineTokens(g), L = nm(X, Z - 1); + if (!r.shouldAutoClose(L, Z - L.firstCharOffset)) return null; - const Z = l.findNeutralCharacter(); - if (Z) { - const _ = t.tokenization.getTokenTypeIfInsertingCharacter(f, b, Z); - if (!l.isOK(_)) + const S = r.findNeutralCharacter(); + if (S) { + const x = t.tokenization.getTokenTypeIfInsertingCharacter(g, Z, S); + if (!r.isOK(x)) return null; } } - return g ? l.close.substring(0, l.close.length - u.length) : l.close; + return m ? r.close.substring(0, r.close.length - u.length) : r.close; } /** * Find another auto-closing pair that is contained by the one passed in. @@ -13282,8 +13282,8 @@ class O2 { return null; const i = t.close.charAt(t.close.length - 1), n = e.autoClosingPairs.autoClosingPairsCloseByEnd.get(i) || []; let o = null; - for (const r of n) - r.open !== t.open && t.open.includes(r.open) && t.close.endsWith(r.close) && (!o || r.open.length > o.open.length) && (o = r); + for (const l of n) + l.open !== t.open && t.open.includes(l.open) && t.close.endsWith(l.close) && (!o || l.open.length > o.open.length) && (o = l); return o; } /** @@ -13298,72 +13298,72 @@ class O2 { const o = e.autoClosingPairs.autoClosingPairsOpenByEnd.get(n); if (!o) return null; - let r = null; - for (const l of o) - if (r === null || l.open.length > r.open.length) { - let a = !0; - for (const c of i) - if (t.getValueInRange(new M(c.lineNumber, c.column - l.open.length + 1, c.lineNumber, c.column)) + n !== l.open) { - a = !1; + let l = null; + for (const r of o) + if (l === null || r.open.length > l.open.length) { + let c = !0; + for (const d of i) + if (t.getValueInRange(new I(d.lineNumber, d.column - r.open.length + 1, d.lineNumber, d.column)) + n !== r.open) { + c = !1; break; } - a && (r = l); + c && (l = r); } - return r; + return l; } static _isBeforeClosingBrace(e, t) { - const i = t.charAt(0), n = e.autoClosingPairs.autoClosingPairsOpenByStart.get(i) || [], o = e.autoClosingPairs.autoClosingPairsCloseByStart.get(i) || [], r = n.some((a) => t.startsWith(a.open)), l = o.some((a) => t.startsWith(a.close)); - return !r && l; + const i = t.charAt(0), n = e.autoClosingPairs.autoClosingPairsOpenByStart.get(i) || [], o = e.autoClosingPairs.autoClosingPairsCloseByStart.get(i) || [], l = n.some((c) => t.startsWith(c.open)), r = o.some((c) => t.startsWith(c.close)); + return !l && r; } } -class nte { +class Qte { static getEdits(e, t, i, n, o) { if (!o && this._isSurroundSelectionType(e, t, i, n)) return this._runSurroundSelectionType(e, i, n); } static _runSurroundSelectionType(e, t, i) { const n = []; - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o], a = e.surroundingPairs[i]; - n[o] = new Uee(l, i, a); + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o], c = e.surroundingPairs[i]; + n[o] = new Dte(r, i, c); } - return new Es(0, n, { + return new Ds(0, n, { shouldPushStackElementBefore: !0, shouldPushStackElementAfter: !0 }); } static _isSurroundSelectionType(e, t, i, n) { - if (!FJ(e, n) || !e.surroundingPairs.hasOwnProperty(n)) + if (!X_(e, n) || !e.surroundingPairs.hasOwnProperty(n)) return !1; - const o = vh(n); - for (const r of i) { - if (r.isEmpty()) + const o = kh(n); + for (const l of i) { + if (l.isEmpty()) return !1; - let l = !0; - for (let a = r.startLineNumber; a <= r.endLineNumber; a++) { - const c = t.getLineContent(a), d = a === r.startLineNumber ? r.startColumn - 1 : 0, h = a === r.endLineNumber ? r.endColumn - 1 : c.length, u = c.substring(d, h); + let r = !0; + for (let c = l.startLineNumber; c <= l.endLineNumber; c++) { + const d = t.getLineContent(c), a = c === l.startLineNumber ? l.startColumn - 1 : 0, h = c === l.endLineNumber ? l.endColumn - 1 : d.length, u = d.substring(a, h); if (/[^ \t]/.test(u)) { - l = !1; + r = !1; break; } } - if (l) + if (r) return !1; - if (o && r.startLineNumber === r.endLineNumber && r.startColumn + 1 === r.endColumn) { - const a = t.getValueInRange(r); - if (vh(a)) + if (o && l.startLineNumber === l.endLineNumber && l.startColumn + 1 === l.endColumn) { + const c = t.getValueInRange(l); + if (kh(c)) return !1; } } return !0; } } -class ste { - static getEdits(e, t, i, n, o, r) { - if (!r && this._isTypeInterceptorElectricChar(t, i, n)) { - const l = this._typeInterceptorElectricChar(e, t, i, n[0], o); - if (l) - return l; +class Ote { + static getEdits(e, t, i, n, o, l) { + if (!l && this._isTypeInterceptorElectricChar(t, i, n)) { + const r = this._typeInterceptorElectricChar(e, t, i, n[0], o); + if (r) + return r; } } static _isTypeInterceptorElectricChar(e, t, i) { @@ -13372,32 +13372,32 @@ class ste { static _typeInterceptorElectricChar(e, t, i, n, o) { if (!t.electricChars.hasOwnProperty(o) || !n.isEmpty()) return null; - const r = n.getPosition(); - i.tokenization.forceTokenization(r.lineNumber); - const l = i.tokenization.getLineTokens(r.lineNumber); - let a; + const l = n.getPosition(); + i.tokenization.forceTokenization(l.lineNumber); + const r = i.tokenization.getLineTokens(l.lineNumber); + let c; try { - a = t.onElectricCharacter(o, l, r.column); - } catch (c) { - return De(c), null; + c = t.onElectricCharacter(o, r, l.column); + } catch (d) { + return Me(d), null; } - if (!a) + if (!c) return null; - if (a.matchOpenBracket) { - const c = (l.getLineContent() + o).lastIndexOf(a.matchOpenBracket) + 1, d = i.bracketPairs.findMatchingBracketUp( - a.matchOpenBracket, + if (c.matchOpenBracket) { + const d = (r.getLineContent() + o).lastIndexOf(c.matchOpenBracket) + 1, a = i.bracketPairs.findMatchingBracketUp( + c.matchOpenBracket, { - lineNumber: r.lineNumber, - column: c + lineNumber: l.lineNumber, + column: d }, 500 /* give at most 500ms to compute */ ); - if (d) { - if (d.startLineNumber === r.lineNumber) + if (a) { + if (a.startLineNumber === l.lineNumber) return null; - const h = i.getLineContent(d.startLineNumber), u = Nt(h), g = t.normalizeIndentation(u), m = i.getLineContent(r.lineNumber), f = i.getLineFirstNonWhitespaceColumn(r.lineNumber) || r.column, b = m.substring(f - 1, r.column - 1), y = g + b + o, w = new M(r.lineNumber, 1, r.lineNumber, r.column), C = new Mn(w, y); - return new Es(NE(y, e), [C], { + const h = i.getLineContent(a.startLineNumber), u = Rt(h), m = t.normalizeIndentation(u), b = i.getLineContent(l.lineNumber), g = i.getLineFirstNonWhitespaceColumn(l.lineNumber) || l.column, Z = b.substring(g - 1, l.column - 1), f = m + Z + o, y = new I(l.lineNumber, 1, l.lineNumber, l.column), W = new Sn(y, f); + return new Ds(eJ(f, e), [W], { shouldPushStackElementBefore: !1, shouldPushStackElementAfter: !0 }); @@ -13406,26 +13406,26 @@ class ste { return null; } } -class ote { +class jte { static getEdits(e, t, i) { const n = []; - for (let r = 0, l = t.length; r < l; r++) - n[r] = new Mn(t[r], i); - const o = NE(i, e); - return new Es(o, n, { - shouldPushStackElementBefore: q_(e, o), + for (let l = 0, r = t.length; l < r; l++) + n[l] = new Sn(t[l], i); + const o = eJ(i, e); + return new Ds(o, n, { + shouldPushStackElementBefore: mx(e, o), shouldPushStackElementAfter: !1 }); } } -class j_ { +class ux { static getEdits(e, t, i, n, o) { if (!o && n === ` `) { - const r = []; - for (let l = 0, a = i.length; l < a; l++) - r[l] = this._enter(e, t, !1, i[l]); - return new Es(4, r, { + const l = []; + for (let r = 0, c = i.length; r < c; r++) + l[r] = this._enter(e, t, !1, i[r]); + return new Ds(4, l, { shouldPushStackElementBefore: !0, shouldPushStackElementAfter: !1 }); @@ -13433,68 +13433,68 @@ class j_ { } static _enter(e, t, i, n) { if (e.autoIndent === 0) - return Lu(n, ` + return xu(n, ` `, i); if (!t.tokenization.isCheapToTokenize(n.getStartPosition().lineNumber) || e.autoIndent === 1) { - const a = t.getLineContent(n.startLineNumber), c = Nt(a).substring(0, n.startColumn - 1); - return Lu(n, ` -` + e.normalizeIndentation(c), i); + const c = t.getLineContent(n.startLineNumber), d = Rt(c).substring(0, n.startColumn - 1); + return xu(n, ` +` + e.normalizeIndentation(d), i); } - const o = Af(e.autoIndent, t, n, e.languageConfigurationService); + const o = Rg(e.autoIndent, t, n, e.languageConfigurationService); if (o) { if (o.indentAction === Ei.None) - return Lu(n, ` + return xu(n, ` ` + e.normalizeIndentation(o.indentation + o.appendText), i); if (o.indentAction === Ei.Indent) - return Lu(n, ` + return xu(n, ` ` + e.normalizeIndentation(o.indentation + o.appendText), i); if (o.indentAction === Ei.IndentOutdent) { - const a = e.normalizeIndentation(o.indentation), c = e.normalizeIndentation(o.indentation + o.appendText), d = ` -` + c + ` -` + a; - return i ? new fL(n, d, !0) : new mA(n, d, -1, c.length - a.length, !0); + const c = e.normalizeIndentation(o.indentation), d = e.normalizeIndentation(o.indentation + o.appendText), a = ` +` + d + ` +` + c; + return i ? new wX(n, a, !0) : new RV(n, a, -1, d.length - c.length, !0); } else if (o.indentAction === Ei.Outdent) { - const a = LA(e, o.indentation); - return Lu(n, ` -` + e.normalizeIndentation(a + o.appendText), i); + const c = JV(e, o.indentation); + return xu(n, ` +` + e.normalizeIndentation(c + o.appendText), i); } } - const r = t.getLineContent(n.startLineNumber), l = Nt(r).substring(0, n.startColumn - 1); + const l = t.getLineContent(n.startLineNumber), r = Rt(l).substring(0, n.startColumn - 1); if (e.autoIndent >= 4) { - const a = jee(e.autoIndent, t, n, { - unshiftIndent: (c) => LA(e, c), - shiftIndent: (c) => WE(e, c), - normalizeIndentation: (c) => e.normalizeIndentation(c) + const c = Ate(e.autoIndent, t, n, { + unshiftIndent: (d) => JV(e, d), + shiftIndent: (d) => tJ(e, d), + normalizeIndentation: (d) => e.normalizeIndentation(d) }, e.languageConfigurationService); - if (a) { - let c = e.visibleColumnFromColumn(t, n.getEndPosition()); - const d = n.endColumn, h = t.getLineContent(n.endLineNumber), u = qn(h); + if (c) { + let d = e.visibleColumnFromColumn(t, n.getEndPosition()); + const a = n.endColumn, h = t.getLineContent(n.endLineNumber), u = es(h); if (u >= 0 ? n = n.setEndPosition(n.endLineNumber, Math.max(n.endColumn, u + 1)) : n = n.setEndPosition(n.endLineNumber, t.getLineMaxColumn(n.endLineNumber)), i) - return new fL(n, ` -` + e.normalizeIndentation(a.afterEnter), !0); + return new wX(n, ` +` + e.normalizeIndentation(c.afterEnter), !0); { - let g = 0; - return d <= u + 1 && (e.insertSpaces || (c = Math.ceil(c / e.indentSize)), g = Math.min(c + 1 - e.normalizeIndentation(a.afterEnter).length - 1, 0)), new mA(n, ` -` + e.normalizeIndentation(a.afterEnter), 0, g, !0); + let m = 0; + return a <= u + 1 && (e.insertSpaces || (d = Math.ceil(d / e.indentSize)), m = Math.min(d + 1 - e.normalizeIndentation(c.afterEnter).length - 1, 0)), new RV(n, ` +` + e.normalizeIndentation(c.afterEnter), 0, m, !0); } } } - return Lu(n, ` -` + e.normalizeIndentation(l), i); + return xu(n, ` +` + e.normalizeIndentation(r), i); } static lineInsertBefore(e, t, i) { if (t === null || i === null) return []; const n = []; - for (let o = 0, r = i.length; o < r; o++) { - let l = i[o].positionLineNumber; - if (l === 1) - n[o] = new fL(new M(1, 1, 1, 1), ` + for (let o = 0, l = i.length; o < l; o++) { + let r = i[o].positionLineNumber; + if (r === 1) + n[o] = new wX(new I(1, 1, 1, 1), ` `); else { - l--; - const a = t.getLineMaxColumn(l); - n[o] = this._enter(e, t, !1, new M(l, a, l, a)); + r--; + const c = t.getLineMaxColumn(r); + n[o] = this._enter(e, t, !1, new I(r, c, r, c)); } } return n; @@ -13503,23 +13503,23 @@ class j_ { if (t === null || i === null) return []; const n = []; - for (let o = 0, r = i.length; o < r; o++) { - const l = i[o].positionLineNumber, a = t.getLineMaxColumn(l); - n[o] = this._enter(e, t, !1, new M(l, a, l, a)); + for (let o = 0, l = i.length; o < l; o++) { + const r = i[o].positionLineNumber, c = t.getLineMaxColumn(r); + n[o] = this._enter(e, t, !1, new I(r, c, r, c)); } return n; } static lineBreakInsert(e, t, i) { const n = []; - for (let o = 0, r = i.length; o < r; o++) + for (let o = 0, l = i.length; o < l; o++) n[o] = this._enter(e, t, !0, i[o]); return n; } } -class rte { - static getEdits(e, t, i, n, o, r) { - const l = this._distributePasteToCursors(e, i, n, o, r); - return l ? (i = i.sort(M.compareRangesUsingStarts), this._distributedPaste(e, t, i, l)) : this._simplePaste(e, t, i, n, o); +class qte { + static getEdits(e, t, i, n, o, l) { + const r = this._distributePasteToCursors(e, i, n, o, l); + return r ? (i = i.sort(I.compareRangesUsingStarts), this._distributedPaste(e, t, i, r)) : this._simplePaste(e, t, i, n, o); } static _distributePasteToCursors(e, t, i, n, o) { if (n || t.length === 1) @@ -13528,43 +13528,43 @@ class rte { return o; if (e.multiCursorPaste === "spread") { i.charCodeAt(i.length - 1) === 10 && (i = i.substring(0, i.length - 1)), i.charCodeAt(i.length - 1) === 13 && (i = i.substring(0, i.length - 1)); - const r = Fa(i); - if (r.length === t.length) - return r; + const l = Kc(i); + if (l.length === t.length) + return l; } return null; } static _distributedPaste(e, t, i, n) { const o = []; - for (let r = 0, l = i.length; r < l; r++) - o[r] = new Mn(i[r], n[r]); - return new Es(0, o, { + for (let l = 0, r = i.length; l < r; l++) + o[l] = new Sn(i[l], n[l]); + return new Ds(0, o, { shouldPushStackElementBefore: !0, shouldPushStackElementAfter: !0 }); } static _simplePaste(e, t, i, n, o) { - const r = []; - for (let l = 0, a = i.length; l < a; l++) { - const c = i[l], d = c.getPosition(); - if (o && !c.isEmpty() && (o = !1), o && n.indexOf(` + const l = []; + for (let r = 0, c = i.length; r < c; r++) { + const d = i[r], a = d.getPosition(); + if (o && !d.isEmpty() && (o = !1), o && n.indexOf(` `) !== n.length - 1 && (o = !1), o) { - const h = new M(d.lineNumber, 1, d.lineNumber, 1); - r[l] = new fE(h, n, c, !0); + const h = new I(a.lineNumber, 1, a.lineNumber, 1); + l[r] = new Fv(h, n, d, !0); } else - r[l] = new Mn(c, n); + l[r] = new Sn(d, n); } - return new Es(0, r, { + return new Ds(0, l, { shouldPushStackElementBefore: !0, shouldPushStackElementAfter: !0 }); } } -class lte { - static getEdits(e, t, i, n, o, r, l, a) { - const c = n.map((d) => this._compositionType(i, d, o, r, l, a)); - return new Es(4, c, { - shouldPushStackElementBefore: q_( +class $te { + static getEdits(e, t, i, n, o, l, r, c) { + const d = n.map((a) => this._compositionType(i, a, o, l, r, c)); + return new Ds(4, d, { + shouldPushStackElementBefore: mx( e, 4 /* EditOperationType.TypingOther */ @@ -13572,51 +13572,51 @@ class lte { shouldPushStackElementAfter: !1 }); } - static _compositionType(e, t, i, n, o, r) { + static _compositionType(e, t, i, n, o, l) { if (!t.isEmpty()) return null; - const l = t.getPosition(), a = Math.max(1, l.column - n), c = Math.min(e.getLineMaxColumn(l.lineNumber), l.column + o), d = new M(l.lineNumber, a, l.lineNumber, c); - return e.getValueInRange(d) === i && r === 0 ? null : new mA(d, i, 0, r); + const r = t.getPosition(), c = Math.max(1, r.column - n), d = Math.min(e.getLineMaxColumn(r.lineNumber), r.column + o), a = new I(r.lineNumber, c, r.lineNumber, d); + return e.getValueInRange(a) === i && l === 0 ? null : new RV(a, i, 0, l); } } -class ate { +class eie { static getEdits(e, t, i) { const n = []; - for (let r = 0, l = t.length; r < l; r++) - n[r] = new Mn(t[r], i); - const o = NE(i, e); - return new Es(o, n, { - shouldPushStackElementBefore: q_(e, o), + for (let l = 0, r = t.length; l < r; l++) + n[l] = new Sn(t[l], i); + const o = eJ(i, e); + return new Ds(o, n, { + shouldPushStackElementBefore: mx(e, o), shouldPushStackElementAfter: !1 }); } } -class cte { +class tie { static getCommands(e, t, i) { const n = []; - for (let o = 0, r = i.length; o < r; o++) { - const l = i[o]; - if (l.isEmpty()) { - const a = t.getLineContent(l.startLineNumber); - if (/^\s*$/.test(a) && t.tokenization.isCheapToTokenize(l.startLineNumber)) { - let c = this._goodIndentForLine(e, t, l.startLineNumber); - c = c || " "; - const d = e.normalizeIndentation(c); - if (!a.startsWith(d)) { - n[o] = new Mn(new M(l.startLineNumber, 1, l.startLineNumber, a.length + 1), d, !0); + for (let o = 0, l = i.length; o < l; o++) { + const r = i[o]; + if (r.isEmpty()) { + const c = t.getLineContent(r.startLineNumber); + if (/^\s*$/.test(c) && t.tokenization.isCheapToTokenize(r.startLineNumber)) { + let d = this._goodIndentForLine(e, t, r.startLineNumber); + d = d || " "; + const a = e.normalizeIndentation(d); + if (!c.startsWith(a)) { + n[o] = new Sn(new I(r.startLineNumber, 1, r.startLineNumber, c.length + 1), a, !0); continue; } } - n[o] = this._replaceJumpToNextIndent(e, t, l, !0); + n[o] = this._replaceJumpToNextIndent(e, t, r, !0); } else { - if (l.startLineNumber === l.endLineNumber) { - const a = t.getLineMaxColumn(l.startLineNumber); - if (l.startColumn !== 1 || l.endColumn !== a) { - n[o] = this._replaceJumpToNextIndent(e, t, l, !1); + if (r.startLineNumber === r.endLineNumber) { + const c = t.getLineMaxColumn(r.startLineNumber); + if (r.startColumn !== 1 || r.endColumn !== c) { + n[o] = this._replaceJumpToNextIndent(e, t, r, !1); continue; } } - n[o] = new wr(l, { + n[o] = new Xl(r, { isUnshift: !1, tabSize: e.tabSize, indentSize: e.indentSize, @@ -13630,57 +13630,57 @@ class cte { } static _goodIndentForLine(e, t, i) { let n = null, o = ""; - const r = Xw(e.autoIndent, t, i, !1, e.languageConfigurationService); - if (r) - n = r.action, o = r.indentation; + const l = jy(e.autoIndent, t, i, !1, e.languageConfigurationService); + if (l) + n = l.action, o = l.indentation; else if (i > 1) { - let l; - for (l = i - 1; l >= 1; l--) { - const d = t.getLineContent(l); - if (Ml(d) >= 0) + let r; + for (r = i - 1; r >= 1; r--) { + const a = t.getLineContent(r); + if (Rr(a) >= 0) break; } - if (l < 1) + if (r < 1) return null; - const a = t.getLineMaxColumn(l), c = Af(e.autoIndent, t, new M(l, a, l, a), e.languageConfigurationService); - c && (o = c.indentation + c.appendText); + const c = t.getLineMaxColumn(r), d = Rg(e.autoIndent, t, new I(r, c, r, c), e.languageConfigurationService); + d && (o = d.indentation + d.appendText); } - return n && (n === Ei.Indent && (o = WE(e, o)), n === Ei.Outdent && (o = LA(e, o)), o = e.normalizeIndentation(o)), o || null; + return n && (n === Ei.Indent && (o = tJ(e, o)), n === Ei.Outdent && (o = JV(e, o)), o = e.normalizeIndentation(o)), o || null; } static _replaceJumpToNextIndent(e, t, i, n) { let o = ""; - const r = i.getStartPosition(); + const l = i.getStartPosition(); if (e.insertSpaces) { - const l = e.visibleColumnFromColumn(t, r), a = e.indentSize, c = a - l % a; - for (let d = 0; d < c; d++) + const r = e.visibleColumnFromColumn(t, l), c = e.indentSize, d = c - r % c; + for (let a = 0; a < d; a++) o += " "; } else o = " "; - return new Mn(i, o, n); + return new Sn(i, o, n); } } -class IE extends mA { - constructor(e, t, i, n, o, r) { - super(e, t, i, n), this._openCharacter = o, this._closeCharacter = r, this.closeCharacterRange = null, this.enclosingRange = null; +class $v extends RV { + constructor(e, t, i, n, o, l) { + super(e, t, i, n), this._openCharacter = o, this._closeCharacter = l, this.closeCharacterRange = null, this.enclosingRange = null; } _computeCursorStateWithRange(e, t, i) { - return this.closeCharacterRange = new M(t.startLineNumber, t.endColumn - this._closeCharacter.length, t.endLineNumber, t.endColumn), this.enclosingRange = new M(t.startLineNumber, t.endColumn - this._openCharacter.length - this._closeCharacter.length, t.endLineNumber, t.endColumn), super.computeCursorState(e, i); + return this.closeCharacterRange = new I(t.startLineNumber, t.endColumn - this._closeCharacter.length, t.endLineNumber, t.endColumn), this.enclosingRange = new I(t.startLineNumber, t.endColumn - this._openCharacter.length - this._closeCharacter.length, t.endLineNumber, t.endColumn), super.computeCursorState(e, i); } } -class dte extends IE { +class iie extends $v { constructor(e, t, i, n) { - const o = (i ? t : "") + n, r = 0, l = -n.length; - super(e, o, r, l, t, n); + const o = (i ? t : "") + n, l = 0, r = -n.length; + super(e, o, l, r, t, n); } computeCursorState(e, t) { const n = t.getInverseEditOperations()[0].range; return this._computeCursorStateWithRange(e, n, t); } } -class hte extends IE { +class nie extends $v { constructor(e, t, i, n) { - const o = i + n, r = 0, l = i.length; - super(t, o, r, l, i, n), this._autoIndentationEdit = e, this._autoClosingEdit = { range: t, text: o }; + const o = i + n, l = 0, r = i.length; + super(t, o, l, r, i, n), this._autoIndentationEdit = e, this._autoClosingEdit = { range: t, text: o }; } getEditOperations(e, t) { t.addTrackedEditOperation(this._autoIndentationEdit.range, this._autoIndentationEdit.text), t.addTrackedEditOperation(this._autoClosingEdit.range, this._autoClosingEdit.text); @@ -13689,69 +13689,69 @@ class hte extends IE { const i = t.getInverseEditOperations(); if (i.length !== 2) throw new Error("There should be two inverse edit operations!"); - const n = i[0].range, o = i[1].range, r = n.plusRange(o); - return this._computeCursorStateWithRange(e, r, t); + const n = i[0].range, o = i[1].range, l = n.plusRange(o); + return this._computeCursorStateWithRange(e, l, t); } } -function NE(s, e) { +function eJ(s, e) { return s === " " ? e === 5 || e === 6 ? 6 : 5 : 4; } -function q_(s, e) { - return IF(s) && !IF(e) ? !0 : s === 5 ? !1 : _F(s) !== _F(e); +function mx(s, e) { + return $D(s) && !$D(e) ? !0 : s === 5 ? !1 : qD(s) !== qD(e); } -function _F(s) { +function qD(s) { return s === 6 || s === 5 ? "space" : s; } -function IF(s) { +function $D(s) { return s === 4 || s === 5 || s === 6; } -function XJ(s, e, t, i, n) { +function G_(s, e, t, i, n) { if (s.autoClosingOvertype === "never" || !s.autoClosingPairs.autoClosingPairsCloseSingleChar.has(n)) return !1; - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o]; - if (!l.isEmpty()) + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o]; + if (!r.isEmpty()) return !1; - const a = l.getPosition(), c = e.getLineContent(a.lineNumber); - if (c.charAt(a.column - 1) !== n) + const c = r.getPosition(), d = e.getLineContent(c.lineNumber); + if (d.charAt(c.column - 1) !== n) return !1; - const h = vh(n); - if ((a.column > 2 ? c.charCodeAt(a.column - 2) : 0) === 92 && h) + const h = kh(n); + if ((c.column > 2 ? d.charCodeAt(c.column - 2) : 0) === 92 && h) return !1; if (s.autoClosingOvertype === "auto") { - let g = !1; - for (let m = 0, f = i.length; m < f; m++) { - const b = i[m]; - if (a.lineNumber === b.startLineNumber && a.column === b.startColumn) { - g = !0; + let m = !1; + for (let b = 0, g = i.length; b < g; b++) { + const Z = i[b]; + if (c.lineNumber === Z.startLineNumber && c.column === Z.startColumn) { + m = !0; break; } } - if (!g) + if (!m) return !1; } } return !0; } -function Lu(s, e, t) { - return t ? new fL(s, e, !0) : new Mn(s, e, !0); +function xu(s, e, t) { + return t ? new wX(s, e, !0) : new Sn(s, e, !0); } -function WE(s, e, t) { - return t = t || 1, wr.shiftIndent(e, e.length + t, s.tabSize, s.indentSize, s.insertSpaces); +function tJ(s, e, t) { + return t = t || 1, Xl.shiftIndent(e, e.length + t, s.tabSize, s.indentSize, s.insertSpaces); } -function LA(s, e, t) { - return t = t || 1, wr.unshiftIndent(e, e.length + t, s.tabSize, s.indentSize, s.insertSpaces); +function JV(s, e, t) { + return t = t || 1, Xl.unshiftIndent(e, e.length + t, s.tabSize, s.indentSize, s.insertSpaces); } -function FJ(s, e) { - return vh(e) ? s.autoSurround === "quotes" || s.autoSurround === "languageDefined" : s.autoSurround === "brackets" || s.autoSurround === "languageDefined"; +function X_(s, e) { + return kh(e) ? s.autoSurround === "quotes" || s.autoSurround === "languageDefined" : s.autoSurround === "brackets" || s.autoSurround === "languageDefined"; } -class vd { +class ka { static indent(e, t, i) { if (t === null || i === null) return []; const n = []; - for (let o = 0, r = i.length; o < r; o++) - n[o] = new wr(i[o], { + for (let o = 0, l = i.length; o < l; o++) + n[o] = new Xl(i[o], { isUnshift: !1, tabSize: e.tabSize, indentSize: e.indentSize, @@ -13763,8 +13763,8 @@ class vd { } static outdent(e, t, i) { const n = []; - for (let o = 0, r = i.length; o < r; o++) - n[o] = new wr(i[o], { + for (let o = 0, l = i.length; o < l; o++) + n[o] = new Xl(i[o], { isUnshift: !0, tabSize: e.tabSize, indentSize: e.indentSize, @@ -13774,111 +13774,111 @@ class vd { }, e.languageConfigurationService); return n; } - static paste(e, t, i, n, o, r) { - return rte.getEdits(e, t, i, n, o, r); + static paste(e, t, i, n, o, l) { + return qte.getEdits(e, t, i, n, o, l); } static tab(e, t, i) { - return cte.getCommands(e, t, i); + return tie.getCommands(e, t, i); } - static compositionType(e, t, i, n, o, r, l, a) { - return lte.getEdits(e, t, i, n, o, r, l, a); + static compositionType(e, t, i, n, o, l, r, c) { + return $te.getEdits(e, t, i, n, o, l, r, c); } /** * This is very similar with typing, but the character is already in the text buffer! */ - static compositionEndWithInterceptors(e, t, i, n, o, r) { + static compositionEndWithInterceptors(e, t, i, n, o, l) { if (!n) return null; - let l = null; + let r = null; for (const u of n) - if (l === null) - l = u.insertedText; - else if (l !== u.insertedText) + if (r === null) + r = u.insertedText; + else if (r !== u.insertedText) return null; - if (!l || l.length !== 1) + if (!r || r.length !== 1) return null; - const a = l; - let c = !1; + const c = r; + let d = !1; for (const u of n) if (u.deletedText.length !== 0) { - c = !0; + d = !0; break; } - if (c) { - if (!FJ(t, a) || !t.surroundingPairs.hasOwnProperty(a)) + if (d) { + if (!X_(t, c) || !t.surroundingPairs.hasOwnProperty(c)) return null; - const u = vh(a); - for (const f of n) - if (f.deletedSelectionStart !== 0 || f.deletedSelectionEnd !== f.deletedText.length || /^[ \t]+$/.test(f.deletedText) || u && vh(f.deletedText)) + const u = kh(c); + for (const g of n) + if (g.deletedSelectionStart !== 0 || g.deletedSelectionEnd !== g.deletedText.length || /^[ \t]+$/.test(g.deletedText) || u && kh(g.deletedText)) return null; - const g = []; - for (const f of o) { - if (!f.isEmpty()) + const m = []; + for (const g of o) { + if (!g.isEmpty()) return null; - g.push(f.getPosition()); + m.push(g.getPosition()); } - if (g.length !== n.length) + if (m.length !== n.length) return null; - const m = []; - for (let f = 0, b = g.length; f < b; f++) - m.push(new Kee(g[f], n[f].deletedText, t.surroundingPairs[a])); - return new Es(4, m, { + const b = []; + for (let g = 0, Z = m.length; g < Z; g++) + b.push(new Fte(m[g], n[g].deletedText, t.surroundingPairs[c])); + return new Ds(4, b, { shouldPushStackElementBefore: !0, shouldPushStackElementAfter: !1 }); } - const d = ite.getEdits(t, i, o, r, a); - if (d !== void 0) - return d; - const h = O2.getEdits(t, i, o, a, !0, !1); - return h !== void 0 ? h : null; - } - static typeWithInterceptors(e, t, i, n, o, r, l) { - const a = j_.getEdits(i, n, o, l, e); + const a = _te.getEdits(t, i, o, l, c); if (a !== void 0) return a; - const c = ete.getEdits(i, n, o, l, e); + const h = uw.getEdits(t, i, o, c, !0, !1); + return h !== void 0 ? h : null; + } + static typeWithInterceptors(e, t, i, n, o, l, r) { + const c = ux.getEdits(i, n, o, r, e); if (c !== void 0) return c; - const d = tte.getEdits(t, i, n, o, r, l); + const d = Pte.getEdits(i, n, o, r, e); if (d !== void 0) return d; - const h = O2.getEdits(i, n, o, l, !1, e); + const a = Bte.getEdits(t, i, n, o, l, r); + if (a !== void 0) + return a; + const h = uw.getEdits(i, n, o, r, !1, e); if (h !== void 0) return h; - const u = nte.getEdits(i, n, o, l, e); + const u = Qte.getEdits(i, n, o, r, e); if (u !== void 0) return u; - const g = ste.getEdits(t, i, n, o, l, e); - return g !== void 0 ? g : ote.getEdits(t, o, l); + const m = Ote.getEdits(t, i, n, o, r, e); + return m !== void 0 ? m : jte.getEdits(t, o, r); } static typeWithoutInterceptors(e, t, i, n, o) { - return ate.getEdits(e, n, o); + return eie.getEdits(e, n, o); } } -class ute { - constructor(e, t, i, n, o, r) { - this.deletedText = e, this.deletedSelectionStart = t, this.deletedSelectionEnd = i, this.insertedText = n, this.insertedSelectionStart = o, this.insertedSelectionEnd = r; +class sie { + constructor(e, t, i, n, o, l) { + this.deletedText = e, this.deletedSelectionStart = t, this.deletedSelectionEnd = i, this.insertedText = n, this.insertedSelectionStart = o, this.insertedSelectionEnd = l; } } -var I; +var C; (function(s) { - s.editorSimpleInput = new ae("editorSimpleInput", !1, !0), s.editorTextFocus = new ae("editorTextFocus", !1, p("editorTextFocus", "Whether the editor text has focus (cursor is blinking)")), s.focus = new ae("editorFocus", !1, p("editorFocus", "Whether the editor or an editor widget has focus (e.g. focus is in the find widget)")), s.textInputFocus = new ae("textInputFocus", !1, p("textInputFocus", "Whether an editor or a rich text input has focus (cursor is blinking)")), s.readOnly = new ae("editorReadonly", !1, p("editorReadonly", "Whether the editor is read-only")), s.inDiffEditor = new ae("inDiffEditor", !1, p("inDiffEditor", "Whether the context is a diff editor")), s.isEmbeddedDiffEditor = new ae("isEmbeddedDiffEditor", !1, p("isEmbeddedDiffEditor", "Whether the context is an embedded diff editor")), s.inMultiDiffEditor = new ae("inMultiDiffEditor", !1, p("inMultiDiffEditor", "Whether the context is a multi diff editor")), s.multiDiffEditorAllCollapsed = new ae("multiDiffEditorAllCollapsed", void 0, p("multiDiffEditorAllCollapsed", "Whether all files in multi diff editor are collapsed")), s.hasChanges = new ae("diffEditorHasChanges", !1, p("diffEditorHasChanges", "Whether the diff editor has changes")), s.comparingMovedCode = new ae("comparingMovedCode", !1, p("comparingMovedCode", "Whether a moved code block is selected for comparison")), s.accessibleDiffViewerVisible = new ae("accessibleDiffViewerVisible", !1, p("accessibleDiffViewerVisible", "Whether the accessible diff viewer is visible")), s.diffEditorRenderSideBySideInlineBreakpointReached = new ae("diffEditorRenderSideBySideInlineBreakpointReached", !1, p("diffEditorRenderSideBySideInlineBreakpointReached", "Whether the diff editor render side by side inline breakpoint is reached")), s.diffEditorInlineMode = new ae("diffEditorInlineMode", !1, p("diffEditorInlineMode", "Whether inline mode is active")), s.diffEditorOriginalWritable = new ae("diffEditorOriginalWritable", !1, p("diffEditorOriginalWritable", "Whether modified is writable in the diff editor")), s.diffEditorModifiedWritable = new ae("diffEditorModifiedWritable", !1, p("diffEditorModifiedWritable", "Whether modified is writable in the diff editor")), s.diffEditorOriginalUri = new ae("diffEditorOriginalUri", "", p("diffEditorOriginalUri", "The uri of the original document")), s.diffEditorModifiedUri = new ae("diffEditorModifiedUri", "", p("diffEditorModifiedUri", "The uri of the modified document")), s.columnSelection = new ae("editorColumnSelection", !1, p("editorColumnSelection", "Whether `editor.columnSelection` is enabled")), s.writable = s.readOnly.toNegated(), s.hasNonEmptySelection = new ae("editorHasSelection", !1, p("editorHasSelection", "Whether the editor has text selected")), s.hasOnlyEmptySelection = s.hasNonEmptySelection.toNegated(), s.hasMultipleSelections = new ae("editorHasMultipleSelections", !1, p("editorHasMultipleSelections", "Whether the editor has multiple selections")), s.hasSingleSelection = s.hasMultipleSelections.toNegated(), s.tabMovesFocus = new ae("editorTabMovesFocus", !1, p("editorTabMovesFocus", "Whether `Tab` will move focus out of the editor")), s.tabDoesNotMoveFocus = s.tabMovesFocus.toNegated(), s.isInEmbeddedEditor = new ae("isInEmbeddedEditor", !1, !0), s.canUndo = new ae("canUndo", !1, !0), s.canRedo = new ae("canRedo", !1, !0), s.hoverVisible = new ae("editorHoverVisible", !1, p("editorHoverVisible", "Whether the editor hover is visible")), s.hoverFocused = new ae("editorHoverFocused", !1, p("editorHoverFocused", "Whether the editor hover is focused")), s.stickyScrollFocused = new ae("stickyScrollFocused", !1, p("stickyScrollFocused", "Whether the sticky scroll is focused")), s.stickyScrollVisible = new ae("stickyScrollVisible", !1, p("stickyScrollVisible", "Whether the sticky scroll is visible")), s.standaloneColorPickerVisible = new ae("standaloneColorPickerVisible", !1, p("standaloneColorPickerVisible", "Whether the standalone color picker is visible")), s.standaloneColorPickerFocused = new ae("standaloneColorPickerFocused", !1, p("standaloneColorPickerFocused", "Whether the standalone color picker is focused")), s.inCompositeEditor = new ae("inCompositeEditor", void 0, p("inCompositeEditor", "Whether the editor is part of a larger editor (e.g. notebooks)")), s.notInCompositeEditor = s.inCompositeEditor.toNegated(), s.languageId = new ae("editorLangId", "", p("editorLangId", "The language identifier of the editor")), s.hasCompletionItemProvider = new ae("editorHasCompletionItemProvider", !1, p("editorHasCompletionItemProvider", "Whether the editor has a completion item provider")), s.hasCodeActionsProvider = new ae("editorHasCodeActionsProvider", !1, p("editorHasCodeActionsProvider", "Whether the editor has a code actions provider")), s.hasCodeLensProvider = new ae("editorHasCodeLensProvider", !1, p("editorHasCodeLensProvider", "Whether the editor has a code lens provider")), s.hasDefinitionProvider = new ae("editorHasDefinitionProvider", !1, p("editorHasDefinitionProvider", "Whether the editor has a definition provider")), s.hasDeclarationProvider = new ae("editorHasDeclarationProvider", !1, p("editorHasDeclarationProvider", "Whether the editor has a declaration provider")), s.hasImplementationProvider = new ae("editorHasImplementationProvider", !1, p("editorHasImplementationProvider", "Whether the editor has an implementation provider")), s.hasTypeDefinitionProvider = new ae("editorHasTypeDefinitionProvider", !1, p("editorHasTypeDefinitionProvider", "Whether the editor has a type definition provider")), s.hasHoverProvider = new ae("editorHasHoverProvider", !1, p("editorHasHoverProvider", "Whether the editor has a hover provider")), s.hasDocumentHighlightProvider = new ae("editorHasDocumentHighlightProvider", !1, p("editorHasDocumentHighlightProvider", "Whether the editor has a document highlight provider")), s.hasDocumentSymbolProvider = new ae("editorHasDocumentSymbolProvider", !1, p("editorHasDocumentSymbolProvider", "Whether the editor has a document symbol provider")), s.hasReferenceProvider = new ae("editorHasReferenceProvider", !1, p("editorHasReferenceProvider", "Whether the editor has a reference provider")), s.hasRenameProvider = new ae("editorHasRenameProvider", !1, p("editorHasRenameProvider", "Whether the editor has a rename provider")), s.hasSignatureHelpProvider = new ae("editorHasSignatureHelpProvider", !1, p("editorHasSignatureHelpProvider", "Whether the editor has a signature help provider")), s.hasInlayHintsProvider = new ae("editorHasInlayHintsProvider", !1, p("editorHasInlayHintsProvider", "Whether the editor has an inline hints provider")), s.hasDocumentFormattingProvider = new ae("editorHasDocumentFormattingProvider", !1, p("editorHasDocumentFormattingProvider", "Whether the editor has a document formatting provider")), s.hasDocumentSelectionFormattingProvider = new ae("editorHasDocumentSelectionFormattingProvider", !1, p("editorHasDocumentSelectionFormattingProvider", "Whether the editor has a document selection formatting provider")), s.hasMultipleDocumentFormattingProvider = new ae("editorHasMultipleDocumentFormattingProvider", !1, p("editorHasMultipleDocumentFormattingProvider", "Whether the editor has multiple document formatting providers")), s.hasMultipleDocumentSelectionFormattingProvider = new ae("editorHasMultipleDocumentSelectionFormattingProvider", !1, p("editorHasMultipleDocumentSelectionFormattingProvider", "Whether the editor has multiple document selection formatting providers")); -})(I || (I = {})); + s.editorSimpleInput = new ce("editorSimpleInput", !1, !0), s.editorTextFocus = new ce("editorTextFocus", !1, p("editorTextFocus", "Whether the editor text has focus (cursor is blinking)")), s.focus = new ce("editorFocus", !1, p("editorFocus", "Whether the editor or an editor widget has focus (e.g. focus is in the find widget)")), s.textInputFocus = new ce("textInputFocus", !1, p("textInputFocus", "Whether an editor or a rich text input has focus (cursor is blinking)")), s.readOnly = new ce("editorReadonly", !1, p("editorReadonly", "Whether the editor is read-only")), s.inDiffEditor = new ce("inDiffEditor", !1, p("inDiffEditor", "Whether the context is a diff editor")), s.isEmbeddedDiffEditor = new ce("isEmbeddedDiffEditor", !1, p("isEmbeddedDiffEditor", "Whether the context is an embedded diff editor")), s.inMultiDiffEditor = new ce("inMultiDiffEditor", !1, p("inMultiDiffEditor", "Whether the context is a multi diff editor")), s.multiDiffEditorAllCollapsed = new ce("multiDiffEditorAllCollapsed", void 0, p("multiDiffEditorAllCollapsed", "Whether all files in multi diff editor are collapsed")), s.hasChanges = new ce("diffEditorHasChanges", !1, p("diffEditorHasChanges", "Whether the diff editor has changes")), s.comparingMovedCode = new ce("comparingMovedCode", !1, p("comparingMovedCode", "Whether a moved code block is selected for comparison")), s.accessibleDiffViewerVisible = new ce("accessibleDiffViewerVisible", !1, p("accessibleDiffViewerVisible", "Whether the accessible diff viewer is visible")), s.diffEditorRenderSideBySideInlineBreakpointReached = new ce("diffEditorRenderSideBySideInlineBreakpointReached", !1, p("diffEditorRenderSideBySideInlineBreakpointReached", "Whether the diff editor render side by side inline breakpoint is reached")), s.diffEditorInlineMode = new ce("diffEditorInlineMode", !1, p("diffEditorInlineMode", "Whether inline mode is active")), s.diffEditorOriginalWritable = new ce("diffEditorOriginalWritable", !1, p("diffEditorOriginalWritable", "Whether modified is writable in the diff editor")), s.diffEditorModifiedWritable = new ce("diffEditorModifiedWritable", !1, p("diffEditorModifiedWritable", "Whether modified is writable in the diff editor")), s.diffEditorOriginalUri = new ce("diffEditorOriginalUri", "", p("diffEditorOriginalUri", "The uri of the original document")), s.diffEditorModifiedUri = new ce("diffEditorModifiedUri", "", p("diffEditorModifiedUri", "The uri of the modified document")), s.columnSelection = new ce("editorColumnSelection", !1, p("editorColumnSelection", "Whether `editor.columnSelection` is enabled")), s.writable = s.readOnly.toNegated(), s.hasNonEmptySelection = new ce("editorHasSelection", !1, p("editorHasSelection", "Whether the editor has text selected")), s.hasOnlyEmptySelection = s.hasNonEmptySelection.toNegated(), s.hasMultipleSelections = new ce("editorHasMultipleSelections", !1, p("editorHasMultipleSelections", "Whether the editor has multiple selections")), s.hasSingleSelection = s.hasMultipleSelections.toNegated(), s.tabMovesFocus = new ce("editorTabMovesFocus", !1, p("editorTabMovesFocus", "Whether `Tab` will move focus out of the editor")), s.tabDoesNotMoveFocus = s.tabMovesFocus.toNegated(), s.isInEmbeddedEditor = new ce("isInEmbeddedEditor", !1, !0), s.canUndo = new ce("canUndo", !1, !0), s.canRedo = new ce("canRedo", !1, !0), s.hoverVisible = new ce("editorHoverVisible", !1, p("editorHoverVisible", "Whether the editor hover is visible")), s.hoverFocused = new ce("editorHoverFocused", !1, p("editorHoverFocused", "Whether the editor hover is focused")), s.stickyScrollFocused = new ce("stickyScrollFocused", !1, p("stickyScrollFocused", "Whether the sticky scroll is focused")), s.stickyScrollVisible = new ce("stickyScrollVisible", !1, p("stickyScrollVisible", "Whether the sticky scroll is visible")), s.standaloneColorPickerVisible = new ce("standaloneColorPickerVisible", !1, p("standaloneColorPickerVisible", "Whether the standalone color picker is visible")), s.standaloneColorPickerFocused = new ce("standaloneColorPickerFocused", !1, p("standaloneColorPickerFocused", "Whether the standalone color picker is focused")), s.inCompositeEditor = new ce("inCompositeEditor", void 0, p("inCompositeEditor", "Whether the editor is part of a larger editor (e.g. notebooks)")), s.notInCompositeEditor = s.inCompositeEditor.toNegated(), s.languageId = new ce("editorLangId", "", p("editorLangId", "The language identifier of the editor")), s.hasCompletionItemProvider = new ce("editorHasCompletionItemProvider", !1, p("editorHasCompletionItemProvider", "Whether the editor has a completion item provider")), s.hasCodeActionsProvider = new ce("editorHasCodeActionsProvider", !1, p("editorHasCodeActionsProvider", "Whether the editor has a code actions provider")), s.hasCodeLensProvider = new ce("editorHasCodeLensProvider", !1, p("editorHasCodeLensProvider", "Whether the editor has a code lens provider")), s.hasDefinitionProvider = new ce("editorHasDefinitionProvider", !1, p("editorHasDefinitionProvider", "Whether the editor has a definition provider")), s.hasDeclarationProvider = new ce("editorHasDeclarationProvider", !1, p("editorHasDeclarationProvider", "Whether the editor has a declaration provider")), s.hasImplementationProvider = new ce("editorHasImplementationProvider", !1, p("editorHasImplementationProvider", "Whether the editor has an implementation provider")), s.hasTypeDefinitionProvider = new ce("editorHasTypeDefinitionProvider", !1, p("editorHasTypeDefinitionProvider", "Whether the editor has a type definition provider")), s.hasHoverProvider = new ce("editorHasHoverProvider", !1, p("editorHasHoverProvider", "Whether the editor has a hover provider")), s.hasDocumentHighlightProvider = new ce("editorHasDocumentHighlightProvider", !1, p("editorHasDocumentHighlightProvider", "Whether the editor has a document highlight provider")), s.hasDocumentSymbolProvider = new ce("editorHasDocumentSymbolProvider", !1, p("editorHasDocumentSymbolProvider", "Whether the editor has a document symbol provider")), s.hasReferenceProvider = new ce("editorHasReferenceProvider", !1, p("editorHasReferenceProvider", "Whether the editor has a reference provider")), s.hasRenameProvider = new ce("editorHasRenameProvider", !1, p("editorHasRenameProvider", "Whether the editor has a rename provider")), s.hasSignatureHelpProvider = new ce("editorHasSignatureHelpProvider", !1, p("editorHasSignatureHelpProvider", "Whether the editor has a signature help provider")), s.hasInlayHintsProvider = new ce("editorHasInlayHintsProvider", !1, p("editorHasInlayHintsProvider", "Whether the editor has an inline hints provider")), s.hasDocumentFormattingProvider = new ce("editorHasDocumentFormattingProvider", !1, p("editorHasDocumentFormattingProvider", "Whether the editor has a document formatting provider")), s.hasDocumentSelectionFormattingProvider = new ce("editorHasDocumentSelectionFormattingProvider", !1, p("editorHasDocumentSelectionFormattingProvider", "Whether the editor has a document selection formatting provider")), s.hasMultipleDocumentFormattingProvider = new ce("editorHasMultipleDocumentFormattingProvider", !1, p("editorHasMultipleDocumentFormattingProvider", "Whether the editor has multiple document formatting providers")), s.hasMultipleDocumentSelectionFormattingProvider = new ce("editorHasMultipleDocumentSelectionFormattingProvider", !1, p("editorHasMultipleDocumentSelectionFormattingProvider", "Whether the editor has multiple document selection formatting providers")); +})(C || (C = {})); const pt = 0; -class pi extends zi { +class gi extends Ai { runEditorCommand(e, t, i) { const n = t._getViewModel(); n && this.runCoreEditorCommand(n, i || {}); } } -var wn; +var Wn; (function(s) { const e = function(i) { - if (!tn(i)) + if (!nn(i)) return !1; const n = i; - return !(!Vs(n.to) || !jn(n.by) && !Vs(n.by) || !jn(n.value) && !Mh(n.value) || !jn(n.revealCursor) && !uH(n.revealCursor)); + return !(!vs(n.to) || !$n(n.by) && !vs(n.by) || !$n(n.value) && !Rh(n.value) || !$n(n.revealCursor) && !_P(n.revealCursor)); }; s.metadata = { description: "Scroll editor in the given direction", @@ -13964,24 +13964,24 @@ var wn; default: o = 2; } - const r = Math.floor(i.value || 1), l = !!i.revealCursor; + const l = Math.floor(i.value || 1), r = !!i.revealCursor; return { direction: n, unit: o, - value: r, - revealCursor: l, + value: l, + revealCursor: r, select: !!i.select }; } s.parse = t; -})(wn || (wn = {})); -var Vp; +})(Wn || (Wn = {})); +var Dp; (function(s) { const e = function(t) { - if (!tn(t)) + if (!nn(t)) return !1; const i = t; - return !(!Mh(i.lineNumber) && !Vs(i.lineNumber) || !jn(i.at) && !Vs(i.at)); + return !(!Rh(i.lineNumber) && !vs(i.lineNumber) || !$n(i.at) && !vs(i.at)); }; s.metadata = { description: "Reveal the given line at the given logical position", @@ -14010,17 +14010,17 @@ var Vp; Center: "center", Bottom: "bottom" }; -})(Vp || (Vp = {})); -class H2 { +})(Dp || (Dp = {})); +class mw { constructor(e) { e.addImplementation(1e4, "code-editor", (t, i) => { - const n = t.get(ft).getFocusedCodeEditor(); + const n = t.get(gt).getFocusedCodeEditor(); return n && n.hasTextFocus() ? this._runEditorCommand(t, n, i) : !1; }), e.addImplementation(1e3, "generic-dom-input-textarea", (t, i) => { - const n = _n(); + const n = Cn(); return n && ["input", "textarea"].indexOf(n.tagName.toLowerCase()) >= 0 ? (this.runDOMCommand(n), !0) : !1; }), e.addImplementation(0, "generic-dom", (t, i) => { - const n = t.get(ft).getActiveCodeEditor(); + const n = t.get(gt).getActiveCodeEditor(); return n ? (n.focus(), this._runEditorCommand(t, n, i)) : !1; }); } @@ -14029,18 +14029,18 @@ class H2 { return n || !0; } } -var ji; +var qi; (function(s) { - class e extends pi { - constructor(w) { - super(w), this._inSelectionMode = w.inSelectionMode; + class e extends gi { + constructor(y) { + super(y), this._inSelectionMode = y.inSelectionMode; } - runCoreEditorCommand(w, C) { - if (!C.position) + runCoreEditorCommand(y, W) { + if (!W.position) return; - w.model.pushStackElement(), w.setCursorStates(C.source, 3, [ - cn.moveTo(w, w.getPrimaryCursorState(), this._inSelectionMode, C.position, C.viewPosition) - ]) && C.revealType !== 2 && w.revealAllCursors(C.source, !0, !0); + y.model.pushStackElement(), y.setCursorStates(W.source, 3, [ + an.moveTo(y, y.getPrimaryCursorState(), this._inSelectionMode, W.position, W.viewPosition) + ]) && W.revealType !== 2 && y.revealAllCursors(W.source, !0, !0); } } s.MoveTo = oe(new e({ @@ -14052,17 +14052,17 @@ var ji; inSelectionMode: !0, precondition: void 0 })); - class t extends pi { - runCoreEditorCommand(w, C) { - w.model.pushStackElement(); - const S = this._getColumnSelectResult(w, w.getPrimaryCursorState(), w.getCursorColumnSelectData(), C); - S !== null && (w.setCursorStates(C.source, 3, S.viewStates.map((L) => dt.fromViewState(L))), w.setCursorColumnSelectData({ + class t extends gi { + runCoreEditorCommand(y, W) { + y.model.pushStackElement(); + const G = this._getColumnSelectResult(y, y.getPrimaryCursorState(), y.getCursorColumnSelectData(), W); + G !== null && (y.setCursorStates(W.source, 3, G.viewStates.map((X) => at.fromViewState(X))), y.setCursorColumnSelectData({ isReal: !0, - fromViewLineNumber: S.fromLineNumber, - fromViewVisualColumn: S.fromVisualColumn, - toViewLineNumber: S.toLineNumber, - toViewVisualColumn: S.toVisualColumn - }), S.reversed ? w.revealTopMostCursor(C.source) : w.revealBottomMostCursor(C.source)); + fromViewLineNumber: G.fromLineNumber, + fromViewVisualColumn: G.fromVisualColumn, + toViewLineNumber: G.toLineNumber, + toViewVisualColumn: G.toVisualColumn + }), G.reversed ? y.revealTopMostCursor(W.source) : y.revealBottomMostCursor(W.source)); } } s.ColumnSelect = oe(new class extends t { @@ -14072,11 +14072,11 @@ var ji; precondition: void 0 }); } - _getColumnSelectResult(y, w, C, S) { - if (typeof S.position > "u" || typeof S.viewPosition > "u" || typeof S.mouseColumn > "u") + _getColumnSelectResult(f, y, W, G) { + if (typeof G.position > "u" || typeof G.viewPosition > "u" || typeof G.mouseColumn > "u") return null; - const L = y.model.validatePosition(S.position), x = y.coordinatesConverter.validateViewPosition(new V(S.viewPosition.lineNumber, S.viewPosition.column), L), Z = S.doColumnSelect ? C.fromViewLineNumber : x.lineNumber, _ = S.doColumnSelect ? C.fromViewVisualColumn : S.mouseColumn - 1; - return Du.columnSelect(y.cursorConfig, y, Z, _, x.lineNumber, S.mouseColumn - 1); + const X = f.model.validatePosition(G.position), L = f.coordinatesConverter.validateViewPosition(new Y(G.viewPosition.lineNumber, G.viewPosition.column), X), S = G.doColumnSelect ? W.fromViewLineNumber : L.lineNumber, x = G.doColumnSelect ? W.fromViewVisualColumn : G.mouseColumn - 1; + return Hu.columnSelect(f.cursorConfig, f, S, x, L.lineNumber, G.mouseColumn - 1); } }()), s.CursorColumnSelectLeft = oe(new class extends t { constructor() { @@ -14085,14 +14085,14 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 3599, linux: { primary: 0 } } }); } - _getColumnSelectResult(y, w, C, S) { - return Du.columnSelectLeft(y.cursorConfig, y, C); + _getColumnSelectResult(f, y, W, G) { + return Hu.columnSelectLeft(f.cursorConfig, f, W); } }()), s.CursorColumnSelectRight = oe(new class extends t { constructor() { @@ -14101,22 +14101,22 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 3601, linux: { primary: 0 } } }); } - _getColumnSelectResult(y, w, C, S) { - return Du.columnSelectRight(y.cursorConfig, y, C); + _getColumnSelectResult(f, y, W, G) { + return Hu.columnSelectRight(f.cursorConfig, f, W); } }()); class i extends t { - constructor(w) { - super(w), this._isPaged = w.isPaged; + constructor(y) { + super(y), this._isPaged = y.isPaged; } - _getColumnSelectResult(w, C, S, L) { - return Du.columnSelectUp(w.cursorConfig, w, S, this._isPaged); + _getColumnSelectResult(y, W, G, X) { + return Hu.columnSelectUp(y.cursorConfig, y, G, this._isPaged); } } s.CursorColumnSelectUp = oe(new i({ @@ -14125,7 +14125,7 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 3600, linux: { primary: 0 } } @@ -14135,17 +14135,17 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 3595, linux: { primary: 0 } } })); class n extends t { - constructor(w) { - super(w), this._isPaged = w.isPaged; + constructor(y) { + super(y), this._isPaged = y.isPaged; } - _getColumnSelectResult(w, C, S, L) { - return Du.columnSelectDown(w.cursorConfig, w, S, this._isPaged); + _getColumnSelectResult(y, W, G, X) { + return Hu.columnSelectDown(y.cursorConfig, y, G, this._isPaged); } } s.CursorColumnSelectDown = oe(new n({ @@ -14154,7 +14154,7 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 3602, linux: { primary: 0 } } @@ -14164,29 +14164,29 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 3596, linux: { primary: 0 } } })); - class o extends pi { + class o extends gi { constructor() { super({ id: "cursorMove", precondition: void 0, - metadata: bA.metadata + metadata: TV.metadata }); } - runCoreEditorCommand(w, C) { - const S = bA.parse(C); - S && this._runCursorMove(w, C.source, S); + runCoreEditorCommand(y, W) { + const G = TV.parse(W); + G && this._runCursorMove(y, W.source, G); } - _runCursorMove(w, C, S) { - w.model.pushStackElement(), w.setCursorStates(C, 3, o._move(w, w.getCursorStates(), S)), w.revealAllCursors(C, !0); + _runCursorMove(y, W, G) { + y.model.pushStackElement(), y.setCursorStates(W, 3, o._move(y, y.getCursorStates(), G)), y.revealAllCursors(W, !0); } - static _move(w, C, S) { - const L = S.select, x = S.value; - switch (S.direction) { + static _move(y, W, G) { + const X = G.select, L = G.value; + switch (G.direction) { case 0: case 1: case 2: @@ -14198,33 +14198,33 @@ var ji; case 8: case 9: case 10: - return cn.simpleMove(w, C, S.direction, L, x, S.unit); + return an.simpleMove(y, W, G.direction, X, L, G.unit); case 11: case 13: case 12: case 14: - return cn.viewportMove(w, C, S.direction, L, x); + return an.viewportMove(y, W, G.direction, X, L); default: return null; } } } s.CursorMoveImpl = o, s.CursorMove = oe(new o()); - class r extends pi { - constructor(w) { - super(w), this._staticArgs = w.args; + class l extends gi { + constructor(y) { + super(y), this._staticArgs = y.args; } - runCoreEditorCommand(w, C) { - let S = this._staticArgs; - this._staticArgs.value === -1 && (S = { + runCoreEditorCommand(y, W) { + let G = this._staticArgs; + this._staticArgs.value === -1 && (G = { direction: this._staticArgs.direction, unit: this._staticArgs.unit, select: this._staticArgs.select, - value: C.pageSize || w.cursorConfig.pageSize - }), w.model.pushStackElement(), w.setCursorStates(C.source, 3, cn.simpleMove(w, w.getCursorStates(), S.direction, S.select, S.value, S.unit)), w.revealAllCursors(C.source, !0); + value: W.pageSize || y.cursorConfig.pageSize + }), y.model.pushStackElement(), y.setCursorStates(W.source, 3, an.simpleMove(y, y.getCursorStates(), G.direction, G.select, G.value, G.unit)), y.revealAllCursors(W.source, !0); } } - s.CursorLeft = oe(new r({ + s.CursorLeft = oe(new l({ args: { direction: 0, unit: 0, @@ -14235,14 +14235,14 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 15, mac: { primary: 15, secondary: [ 288 /* KeyCode.KeyB */ ] } } - })), s.CursorLeftSelect = oe(new r({ + })), s.CursorLeftSelect = oe(new l({ args: { direction: 0, unit: 0, @@ -14253,11 +14253,11 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 1039 /* KeyCode.LeftArrow */ } - })), s.CursorRight = oe(new r({ + })), s.CursorRight = oe(new l({ args: { direction: 1, unit: 0, @@ -14268,14 +14268,14 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 17, mac: { primary: 17, secondary: [ 292 /* KeyCode.KeyF */ ] } } - })), s.CursorRightSelect = oe(new r({ + })), s.CursorRightSelect = oe(new l({ args: { direction: 1, unit: 0, @@ -14286,11 +14286,11 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 1041 /* KeyCode.RightArrow */ } - })), s.CursorUp = oe(new r({ + })), s.CursorUp = oe(new l({ args: { direction: 2, unit: 2, @@ -14301,14 +14301,14 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 16, mac: { primary: 16, secondary: [ 302 /* KeyCode.KeyP */ ] } } - })), s.CursorUpSelect = oe(new r({ + })), s.CursorUpSelect = oe(new l({ args: { direction: 2, unit: 2, @@ -14319,7 +14319,7 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 1040, secondary: [ 3088 @@ -14334,7 +14334,7 @@ var ji; /* KeyCode.UpArrow */ } } - })), s.CursorPageUp = oe(new r({ + })), s.CursorPageUp = oe(new l({ args: { direction: 2, unit: 2, @@ -14346,11 +14346,11 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 11 /* KeyCode.PageUp */ } - })), s.CursorPageUpSelect = oe(new r({ + })), s.CursorPageUpSelect = oe(new l({ args: { direction: 2, unit: 2, @@ -14362,11 +14362,11 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 1035 /* KeyCode.PageUp */ } - })), s.CursorDown = oe(new r({ + })), s.CursorDown = oe(new l({ args: { direction: 3, unit: 2, @@ -14377,14 +14377,14 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 18, mac: { primary: 18, secondary: [ 300 /* KeyCode.KeyN */ ] } } - })), s.CursorDownSelect = oe(new r({ + })), s.CursorDownSelect = oe(new l({ args: { direction: 3, unit: 2, @@ -14395,7 +14395,7 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 1042, secondary: [ 3090 @@ -14410,7 +14410,7 @@ var ji; /* KeyCode.DownArrow */ } } - })), s.CursorPageDown = oe(new r({ + })), s.CursorPageDown = oe(new l({ args: { direction: 3, unit: 2, @@ -14422,11 +14422,11 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 12 /* KeyCode.PageDown */ } - })), s.CursorPageDownSelect = oe(new r({ + })), s.CursorPageDownSelect = oe(new l({ args: { direction: 3, unit: 2, @@ -14438,77 +14438,77 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 1036 /* KeyCode.PageDown */ } - })), s.CreateCursor = oe(new class extends pi { + })), s.CreateCursor = oe(new class extends gi { constructor() { super({ id: "createCursor", precondition: void 0 }); } - runCoreEditorCommand(y, w) { - if (!w.position) + runCoreEditorCommand(f, y) { + if (!y.position) return; - let C; - w.wholeLine ? C = cn.line(y, y.getPrimaryCursorState(), !1, w.position, w.viewPosition) : C = cn.moveTo(y, y.getPrimaryCursorState(), !1, w.position, w.viewPosition); - const S = y.getCursorStates(); - if (S.length > 1) { - const L = C.modelState ? C.modelState.position : null, x = C.viewState ? C.viewState.position : null; - for (let Z = 0, _ = S.length; Z < _; Z++) { - const v = S[Z]; - if (!(L && !v.modelState.selection.containsPosition(L)) && !(x && !v.viewState.selection.containsPosition(x))) { - S.splice(Z, 1), y.model.pushStackElement(), y.setCursorStates(w.source, 3, S); + let W; + y.wholeLine ? W = an.line(f, f.getPrimaryCursorState(), !1, y.position, y.viewPosition) : W = an.moveTo(f, f.getPrimaryCursorState(), !1, y.position, y.viewPosition); + const G = f.getCursorStates(); + if (G.length > 1) { + const X = W.modelState ? W.modelState.position : null, L = W.viewState ? W.viewState.position : null; + for (let S = 0, x = G.length; S < x; S++) { + const w = G[S]; + if (!(X && !w.modelState.selection.containsPosition(X)) && !(L && !w.viewState.selection.containsPosition(L))) { + G.splice(S, 1), f.model.pushStackElement(), f.setCursorStates(y.source, 3, G); return; } } } - S.push(C), y.model.pushStackElement(), y.setCursorStates(w.source, 3, S); + G.push(W), f.model.pushStackElement(), f.setCursorStates(y.source, 3, G); } - }()), s.LastCursorMoveToSelect = oe(new class extends pi { + }()), s.LastCursorMoveToSelect = oe(new class extends gi { constructor() { super({ id: "_lastCursorMoveToSelect", precondition: void 0 }); } - runCoreEditorCommand(y, w) { - if (!w.position) + runCoreEditorCommand(f, y) { + if (!y.position) return; - const C = y.getLastAddedCursorIndex(), S = y.getCursorStates(), L = S.slice(0); - L[C] = cn.moveTo(y, S[C], !0, w.position, w.viewPosition), y.model.pushStackElement(), y.setCursorStates(w.source, 3, L); + const W = f.getLastAddedCursorIndex(), G = f.getCursorStates(), X = G.slice(0); + X[W] = an.moveTo(f, G[W], !0, y.position, y.viewPosition), f.model.pushStackElement(), f.setCursorStates(y.source, 3, X); } }()); - class l extends pi { - constructor(w) { - super(w), this._inSelectionMode = w.inSelectionMode; + class r extends gi { + constructor(y) { + super(y), this._inSelectionMode = y.inSelectionMode; } - runCoreEditorCommand(w, C) { - w.model.pushStackElement(), w.setCursorStates(C.source, 3, cn.moveToBeginningOfLine(w, w.getCursorStates(), this._inSelectionMode)), w.revealAllCursors(C.source, !0); + runCoreEditorCommand(y, W) { + y.model.pushStackElement(), y.setCursorStates(W.source, 3, an.moveToBeginningOfLine(y, y.getCursorStates(), this._inSelectionMode)), y.revealAllCursors(W.source, !0); } } - s.CursorHome = oe(new l({ + s.CursorHome = oe(new r({ inSelectionMode: !1, id: "cursorHome", precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 14, mac: { primary: 14, secondary: [ 2063 /* KeyCode.LeftArrow */ ] } } - })), s.CursorHomeSelect = oe(new l({ + })), s.CursorHomeSelect = oe(new r({ inSelectionMode: !0, id: "cursorHomeSelect", precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 1038, mac: { primary: 1038, secondary: [ 3087 @@ -14516,42 +14516,42 @@ var ji; ] } } })); - class a extends pi { - constructor(w) { - super(w), this._inSelectionMode = w.inSelectionMode; + class c extends gi { + constructor(y) { + super(y), this._inSelectionMode = y.inSelectionMode; } - runCoreEditorCommand(w, C) { - w.model.pushStackElement(), w.setCursorStates(C.source, 3, this._exec(w.getCursorStates())), w.revealAllCursors(C.source, !0); + runCoreEditorCommand(y, W) { + y.model.pushStackElement(), y.setCursorStates(W.source, 3, this._exec(y.getCursorStates())), y.revealAllCursors(W.source, !0); } - _exec(w) { - const C = []; - for (let S = 0, L = w.length; S < L; S++) { - const x = w[S], Z = x.modelState.position.lineNumber; - C[S] = dt.fromModelState(x.modelState.move(this._inSelectionMode, Z, 1, 0)); + _exec(y) { + const W = []; + for (let G = 0, X = y.length; G < X; G++) { + const L = y[G], S = L.modelState.position.lineNumber; + W[G] = at.fromModelState(L.modelState.move(this._inSelectionMode, S, 1, 0)); } - return C; + return W; } } - s.CursorLineStart = oe(new a({ + s.CursorLineStart = oe(new c({ inSelectionMode: !1, id: "cursorLineStart", precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 0, mac: { primary: 287 /* KeyCode.KeyA */ } } - })), s.CursorLineStartSelect = oe(new a({ + })), s.CursorLineStartSelect = oe(new c({ inSelectionMode: !0, id: "cursorLineStartSelect", precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 0, mac: { primary: 1311 @@ -14559,22 +14559,22 @@ var ji; } } })); - class c extends pi { - constructor(w) { - super(w), this._inSelectionMode = w.inSelectionMode; + class d extends gi { + constructor(y) { + super(y), this._inSelectionMode = y.inSelectionMode; } - runCoreEditorCommand(w, C) { - w.model.pushStackElement(), w.setCursorStates(C.source, 3, cn.moveToEndOfLine(w, w.getCursorStates(), this._inSelectionMode, C.sticky || !1)), w.revealAllCursors(C.source, !0); + runCoreEditorCommand(y, W) { + y.model.pushStackElement(), y.setCursorStates(W.source, 3, an.moveToEndOfLine(y, y.getCursorStates(), this._inSelectionMode, W.sticky || !1)), y.revealAllCursors(W.source, !0); } } - s.CursorEnd = oe(new c({ + s.CursorEnd = oe(new d({ inSelectionMode: !1, id: "cursorEnd", precondition: void 0, kbOpts: { args: { sticky: !1 }, weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 13, mac: { primary: 13, secondary: [ 2065 @@ -14597,14 +14597,14 @@ var ji; } }] } - })), s.CursorEndSelect = oe(new c({ + })), s.CursorEndSelect = oe(new d({ inSelectionMode: !0, id: "cursorEndSelect", precondition: void 0, kbOpts: { args: { sticky: !1 }, weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 1037, mac: { primary: 1037, secondary: [ 3089 @@ -14628,42 +14628,42 @@ var ji; }] } })); - class d extends pi { - constructor(w) { - super(w), this._inSelectionMode = w.inSelectionMode; + class a extends gi { + constructor(y) { + super(y), this._inSelectionMode = y.inSelectionMode; } - runCoreEditorCommand(w, C) { - w.model.pushStackElement(), w.setCursorStates(C.source, 3, this._exec(w, w.getCursorStates())), w.revealAllCursors(C.source, !0); + runCoreEditorCommand(y, W) { + y.model.pushStackElement(), y.setCursorStates(W.source, 3, this._exec(y, y.getCursorStates())), y.revealAllCursors(W.source, !0); } - _exec(w, C) { - const S = []; - for (let L = 0, x = C.length; L < x; L++) { - const Z = C[L], _ = Z.modelState.position.lineNumber, v = w.model.getLineMaxColumn(_); - S[L] = dt.fromModelState(Z.modelState.move(this._inSelectionMode, _, v, 0)); + _exec(y, W) { + const G = []; + for (let X = 0, L = W.length; X < L; X++) { + const S = W[X], x = S.modelState.position.lineNumber, w = y.model.getLineMaxColumn(x); + G[X] = at.fromModelState(S.modelState.move(this._inSelectionMode, x, w, 0)); } - return S; + return G; } } - s.CursorLineEnd = oe(new d({ + s.CursorLineEnd = oe(new a({ inSelectionMode: !1, id: "cursorLineEnd", precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 0, mac: { primary: 291 /* KeyCode.KeyE */ } } - })), s.CursorLineEndSelect = oe(new d({ + })), s.CursorLineEndSelect = oe(new a({ inSelectionMode: !0, id: "cursorLineEndSelect", precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 0, mac: { primary: 1315 @@ -14671,12 +14671,12 @@ var ji; } } })); - class h extends pi { - constructor(w) { - super(w), this._inSelectionMode = w.inSelectionMode; + class h extends gi { + constructor(y) { + super(y), this._inSelectionMode = y.inSelectionMode; } - runCoreEditorCommand(w, C) { - w.model.pushStackElement(), w.setCursorStates(C.source, 3, cn.moveToBeginningOfBuffer(w, w.getCursorStates(), this._inSelectionMode)), w.revealAllCursors(C.source, !0); + runCoreEditorCommand(y, W) { + y.model.pushStackElement(), y.setCursorStates(W.source, 3, an.moveToBeginningOfBuffer(y, y.getCursorStates(), this._inSelectionMode)), y.revealAllCursors(W.source, !0); } } s.CursorTop = oe(new h({ @@ -14685,7 +14685,7 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 2062, mac: { primary: 2064 @@ -14698,7 +14698,7 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 3086, mac: { primary: 3088 @@ -14706,12 +14706,12 @@ var ji; } } })); - class u extends pi { - constructor(w) { - super(w), this._inSelectionMode = w.inSelectionMode; + class u extends gi { + constructor(y) { + super(y), this._inSelectionMode = y.inSelectionMode; } - runCoreEditorCommand(w, C) { - w.model.pushStackElement(), w.setCursorStates(C.source, 3, cn.moveToEndOfBuffer(w, w.getCursorStates(), this._inSelectionMode)), w.revealAllCursors(C.source, !0); + runCoreEditorCommand(y, W) { + y.model.pushStackElement(), y.setCursorStates(W.source, 3, an.moveToEndOfBuffer(y, y.getCursorStates(), this._inSelectionMode)), y.revealAllCursors(W.source, !0); } } s.CursorBottom = oe(new u({ @@ -14720,7 +14720,7 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 2061, mac: { primary: 2066 @@ -14733,7 +14733,7 @@ var ji; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 3085, mac: { primary: 3090 @@ -14741,19 +14741,19 @@ var ji; } } })); - class g extends pi { + class m extends gi { constructor() { super({ id: "editorScroll", precondition: void 0, - metadata: wn.metadata + metadata: Wn.metadata }); } - determineScrollMethod(w) { - const C = [ + determineScrollMethod(y) { + const W = [ 6 /* EditorScroll_.Unit.Column */ - ], S = [ + ], G = [ 1, 2, 3, @@ -14761,76 +14761,76 @@ var ji; 5, 6 /* EditorScroll_.Unit.Column */ - ], L = [ + ], X = [ 4, 2 /* EditorScroll_.Direction.Right */ - ], x = [ + ], L = [ 1, 3 /* EditorScroll_.Direction.Down */ ]; - return C.includes(w.unit) && L.includes(w.direction) ? this._runHorizontalEditorScroll.bind(this) : S.includes(w.unit) && x.includes(w.direction) ? this._runVerticalEditorScroll.bind(this) : null; + return W.includes(y.unit) && X.includes(y.direction) ? this._runHorizontalEditorScroll.bind(this) : G.includes(y.unit) && L.includes(y.direction) ? this._runVerticalEditorScroll.bind(this) : null; } - runCoreEditorCommand(w, C) { - const S = wn.parse(C); - if (!S) + runCoreEditorCommand(y, W) { + const G = Wn.parse(W); + if (!G) return; - const L = this.determineScrollMethod(S); - L && L(w, C.source, S); - } - _runVerticalEditorScroll(w, C, S) { - const L = this._computeDesiredScrollTop(w, S); - if (S.revealCursor) { - const x = w.getCompletelyVisibleViewRangeAtScrollTop(L); - w.setCursorStates(C, 3, [ - cn.findPositionInViewportIfOutside(w, w.getPrimaryCursorState(), x, S.select) + const X = this.determineScrollMethod(G); + X && X(y, W.source, G); + } + _runVerticalEditorScroll(y, W, G) { + const X = this._computeDesiredScrollTop(y, G); + if (G.revealCursor) { + const L = y.getCompletelyVisibleViewRangeAtScrollTop(X); + y.setCursorStates(W, 3, [ + an.findPositionInViewportIfOutside(y, y.getPrimaryCursorState(), L, G.select) ]); } - w.viewLayout.setScrollPosition( - { scrollTop: L }, + y.viewLayout.setScrollPosition( + { scrollTop: X }, 0 /* ScrollType.Smooth */ ); } - _computeDesiredScrollTop(w, C) { - if (C.unit === 1) { - const x = w.viewLayout.getFutureViewport(), Z = w.getCompletelyVisibleViewRangeAtScrollTop(x.top), _ = w.coordinatesConverter.convertViewRangeToModelRange(Z); - let v; - C.direction === 1 ? v = Math.max(1, _.startLineNumber - C.value) : v = Math.min(w.model.getLineCount(), _.startLineNumber + C.value); - const P = w.coordinatesConverter.convertModelPositionToViewPosition(new V(v, 1)); - return w.viewLayout.getVerticalOffsetForLineNumber(P.lineNumber); - } - if (C.unit === 5) { - let x = 0; - return C.direction === 3 && (x = w.model.getLineCount() - w.cursorConfig.pageSize), w.viewLayout.getVerticalOffsetForLineNumber(x); - } - let S; - C.unit === 3 ? S = w.cursorConfig.pageSize * C.value : C.unit === 4 ? S = Math.round(w.cursorConfig.pageSize / 2) * C.value : S = C.value; - const L = (C.direction === 1 ? -1 : 1) * S; - return w.viewLayout.getCurrentScrollTop() + L * w.cursorConfig.lineHeight; - } - _runHorizontalEditorScroll(w, C, S) { - const L = this._computeDesiredScrollLeft(w, S); - w.viewLayout.setScrollPosition( - { scrollLeft: L }, + _computeDesiredScrollTop(y, W) { + if (W.unit === 1) { + const L = y.viewLayout.getFutureViewport(), S = y.getCompletelyVisibleViewRangeAtScrollTop(L.top), x = y.coordinatesConverter.convertViewRangeToModelRange(S); + let w; + W.direction === 1 ? w = Math.max(1, x.startLineNumber - W.value) : w = Math.min(y.model.getLineCount(), x.startLineNumber + W.value); + const A = y.coordinatesConverter.convertModelPositionToViewPosition(new Y(w, 1)); + return y.viewLayout.getVerticalOffsetForLineNumber(A.lineNumber); + } + if (W.unit === 5) { + let L = 0; + return W.direction === 3 && (L = y.model.getLineCount() - y.cursorConfig.pageSize), y.viewLayout.getVerticalOffsetForLineNumber(L); + } + let G; + W.unit === 3 ? G = y.cursorConfig.pageSize * W.value : W.unit === 4 ? G = Math.round(y.cursorConfig.pageSize / 2) * W.value : G = W.value; + const X = (W.direction === 1 ? -1 : 1) * G; + return y.viewLayout.getCurrentScrollTop() + X * y.cursorConfig.lineHeight; + } + _runHorizontalEditorScroll(y, W, G) { + const X = this._computeDesiredScrollLeft(y, G); + y.viewLayout.setScrollPosition( + { scrollLeft: X }, 0 /* ScrollType.Smooth */ ); } - _computeDesiredScrollLeft(w, C) { - const S = (C.direction === 4 ? -1 : 1) * C.value; - return w.viewLayout.getCurrentScrollLeft() + S * w.cursorConfig.typicalHalfwidthCharacterWidth; + _computeDesiredScrollLeft(y, W) { + const G = (W.direction === 4 ? -1 : 1) * W.value; + return y.viewLayout.getCurrentScrollLeft() + G * y.cursorConfig.typicalHalfwidthCharacterWidth; } } - s.EditorScrollImpl = g, s.EditorScroll = oe(new g()), s.ScrollLineUp = oe(new class extends pi { + s.EditorScrollImpl = m, s.EditorScroll = oe(new m()), s.ScrollLineUp = oe(new class extends gi { constructor() { super({ id: "scrollLineUp", precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 2064, mac: { primary: 267 @@ -14839,24 +14839,24 @@ var ji; } }); } - runCoreEditorCommand(y, w) { - s.EditorScroll.runCoreEditorCommand(y, { - to: wn.RawDirection.Up, - by: wn.RawUnit.WrappedLine, + runCoreEditorCommand(f, y) { + s.EditorScroll.runCoreEditorCommand(f, { + to: Wn.RawDirection.Up, + by: Wn.RawUnit.WrappedLine, value: 1, revealCursor: !1, select: !1, - source: w.source + source: y.source }); } - }()), s.ScrollPageUp = oe(new class extends pi { + }()), s.ScrollPageUp = oe(new class extends gi { constructor() { super({ id: "scrollPageUp", precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 2059, win: { primary: 523 @@ -14869,45 +14869,45 @@ var ji; } }); } - runCoreEditorCommand(y, w) { - s.EditorScroll.runCoreEditorCommand(y, { - to: wn.RawDirection.Up, - by: wn.RawUnit.Page, + runCoreEditorCommand(f, y) { + s.EditorScroll.runCoreEditorCommand(f, { + to: Wn.RawDirection.Up, + by: Wn.RawUnit.Page, value: 1, revealCursor: !1, select: !1, - source: w.source + source: y.source }); } - }()), s.ScrollEditorTop = oe(new class extends pi { + }()), s.ScrollEditorTop = oe(new class extends gi { constructor() { super({ id: "scrollEditorTop", precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus + kbExpr: C.textInputFocus } }); } - runCoreEditorCommand(y, w) { - s.EditorScroll.runCoreEditorCommand(y, { - to: wn.RawDirection.Up, - by: wn.RawUnit.Editor, + runCoreEditorCommand(f, y) { + s.EditorScroll.runCoreEditorCommand(f, { + to: Wn.RawDirection.Up, + by: Wn.RawUnit.Editor, value: 1, revealCursor: !1, select: !1, - source: w.source + source: y.source }); } - }()), s.ScrollLineDown = oe(new class extends pi { + }()), s.ScrollLineDown = oe(new class extends gi { constructor() { super({ id: "scrollLineDown", precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 2066, mac: { primary: 268 @@ -14916,24 +14916,24 @@ var ji; } }); } - runCoreEditorCommand(y, w) { - s.EditorScroll.runCoreEditorCommand(y, { - to: wn.RawDirection.Down, - by: wn.RawUnit.WrappedLine, + runCoreEditorCommand(f, y) { + s.EditorScroll.runCoreEditorCommand(f, { + to: Wn.RawDirection.Down, + by: Wn.RawUnit.WrappedLine, value: 1, revealCursor: !1, select: !1, - source: w.source + source: y.source }); } - }()), s.ScrollPageDown = oe(new class extends pi { + }()), s.ScrollPageDown = oe(new class extends gi { constructor() { super({ id: "scrollPageDown", precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 2060, win: { primary: 524 @@ -14946,158 +14946,158 @@ var ji; } }); } - runCoreEditorCommand(y, w) { - s.EditorScroll.runCoreEditorCommand(y, { - to: wn.RawDirection.Down, - by: wn.RawUnit.Page, + runCoreEditorCommand(f, y) { + s.EditorScroll.runCoreEditorCommand(f, { + to: Wn.RawDirection.Down, + by: Wn.RawUnit.Page, value: 1, revealCursor: !1, select: !1, - source: w.source + source: y.source }); } - }()), s.ScrollEditorBottom = oe(new class extends pi { + }()), s.ScrollEditorBottom = oe(new class extends gi { constructor() { super({ id: "scrollEditorBottom", precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus + kbExpr: C.textInputFocus } }); } - runCoreEditorCommand(y, w) { - s.EditorScroll.runCoreEditorCommand(y, { - to: wn.RawDirection.Down, - by: wn.RawUnit.Editor, + runCoreEditorCommand(f, y) { + s.EditorScroll.runCoreEditorCommand(f, { + to: Wn.RawDirection.Down, + by: Wn.RawUnit.Editor, value: 1, revealCursor: !1, select: !1, - source: w.source + source: y.source }); } - }()), s.ScrollLeft = oe(new class extends pi { + }()), s.ScrollLeft = oe(new class extends gi { constructor() { super({ id: "scrollLeft", precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus + kbExpr: C.textInputFocus } }); } - runCoreEditorCommand(y, w) { - s.EditorScroll.runCoreEditorCommand(y, { - to: wn.RawDirection.Left, - by: wn.RawUnit.Column, + runCoreEditorCommand(f, y) { + s.EditorScroll.runCoreEditorCommand(f, { + to: Wn.RawDirection.Left, + by: Wn.RawUnit.Column, value: 2, revealCursor: !1, select: !1, - source: w.source + source: y.source }); } - }()), s.ScrollRight = oe(new class extends pi { + }()), s.ScrollRight = oe(new class extends gi { constructor() { super({ id: "scrollRight", precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus + kbExpr: C.textInputFocus } }); } - runCoreEditorCommand(y, w) { - s.EditorScroll.runCoreEditorCommand(y, { - to: wn.RawDirection.Right, - by: wn.RawUnit.Column, + runCoreEditorCommand(f, y) { + s.EditorScroll.runCoreEditorCommand(f, { + to: Wn.RawDirection.Right, + by: Wn.RawUnit.Column, value: 2, revealCursor: !1, select: !1, - source: w.source + source: y.source }); } }()); - class m extends pi { - constructor(w) { - super(w), this._inSelectionMode = w.inSelectionMode; + class b extends gi { + constructor(y) { + super(y), this._inSelectionMode = y.inSelectionMode; } - runCoreEditorCommand(w, C) { - C.position && (w.model.pushStackElement(), w.setCursorStates(C.source, 3, [ - cn.word(w, w.getPrimaryCursorState(), this._inSelectionMode, C.position) - ]), C.revealType !== 2 && w.revealAllCursors(C.source, !0, !0)); + runCoreEditorCommand(y, W) { + W.position && (y.model.pushStackElement(), y.setCursorStates(W.source, 3, [ + an.word(y, y.getPrimaryCursorState(), this._inSelectionMode, W.position) + ]), W.revealType !== 2 && y.revealAllCursors(W.source, !0, !0)); } } - s.WordSelect = oe(new m({ + s.WordSelect = oe(new b({ inSelectionMode: !1, id: "_wordSelect", precondition: void 0 - })), s.WordSelectDrag = oe(new m({ + })), s.WordSelectDrag = oe(new b({ inSelectionMode: !0, id: "_wordSelectDrag", precondition: void 0 - })), s.LastCursorWordSelect = oe(new class extends pi { + })), s.LastCursorWordSelect = oe(new class extends gi { constructor() { super({ id: "lastCursorWordSelect", precondition: void 0 }); } - runCoreEditorCommand(y, w) { - if (!w.position) + runCoreEditorCommand(f, y) { + if (!y.position) return; - const C = y.getLastAddedCursorIndex(), S = y.getCursorStates(), L = S.slice(0), x = S[C]; - L[C] = cn.word(y, x, x.modelState.hasSelection(), w.position), y.model.pushStackElement(), y.setCursorStates(w.source, 3, L); + const W = f.getLastAddedCursorIndex(), G = f.getCursorStates(), X = G.slice(0), L = G[W]; + X[W] = an.word(f, L, L.modelState.hasSelection(), y.position), f.model.pushStackElement(), f.setCursorStates(y.source, 3, X); } }()); - class f extends pi { - constructor(w) { - super(w), this._inSelectionMode = w.inSelectionMode; + class g extends gi { + constructor(y) { + super(y), this._inSelectionMode = y.inSelectionMode; } - runCoreEditorCommand(w, C) { - C.position && (w.model.pushStackElement(), w.setCursorStates(C.source, 3, [ - cn.line(w, w.getPrimaryCursorState(), this._inSelectionMode, C.position, C.viewPosition) - ]), C.revealType !== 2 && w.revealAllCursors(C.source, !1, !0)); + runCoreEditorCommand(y, W) { + W.position && (y.model.pushStackElement(), y.setCursorStates(W.source, 3, [ + an.line(y, y.getPrimaryCursorState(), this._inSelectionMode, W.position, W.viewPosition) + ]), W.revealType !== 2 && y.revealAllCursors(W.source, !1, !0)); } } - s.LineSelect = oe(new f({ + s.LineSelect = oe(new g({ inSelectionMode: !1, id: "_lineSelect", precondition: void 0 - })), s.LineSelectDrag = oe(new f({ + })), s.LineSelectDrag = oe(new g({ inSelectionMode: !0, id: "_lineSelectDrag", precondition: void 0 })); - class b extends pi { - constructor(w) { - super(w), this._inSelectionMode = w.inSelectionMode; + class Z extends gi { + constructor(y) { + super(y), this._inSelectionMode = y.inSelectionMode; } - runCoreEditorCommand(w, C) { - if (!C.position) + runCoreEditorCommand(y, W) { + if (!W.position) return; - const S = w.getLastAddedCursorIndex(), L = w.getCursorStates(), x = L.slice(0); - x[S] = cn.line(w, L[S], this._inSelectionMode, C.position, C.viewPosition), w.model.pushStackElement(), w.setCursorStates(C.source, 3, x); + const G = y.getLastAddedCursorIndex(), X = y.getCursorStates(), L = X.slice(0); + L[G] = an.line(y, X[G], this._inSelectionMode, W.position, W.viewPosition), y.model.pushStackElement(), y.setCursorStates(W.source, 3, L); } } - s.LastCursorLineSelect = oe(new b({ + s.LastCursorLineSelect = oe(new Z({ inSelectionMode: !1, id: "lastCursorLineSelect", precondition: void 0 - })), s.LastCursorLineSelectDrag = oe(new b({ + })), s.LastCursorLineSelectDrag = oe(new Z({ inSelectionMode: !0, id: "lastCursorLineSelectDrag", precondition: void 0 - })), s.CancelSelection = oe(new class extends pi { + })), s.CancelSelection = oe(new class extends gi { constructor() { super({ id: "cancelSelection", - precondition: I.hasNonEmptySelection, + precondition: C.hasNonEmptySelection, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 9, secondary: [ 1033 @@ -15106,19 +15106,19 @@ var ji; } }); } - runCoreEditorCommand(y, w) { - y.model.pushStackElement(), y.setCursorStates(w.source, 3, [ - cn.cancelSelection(y, y.getPrimaryCursorState()) - ]), y.revealAllCursors(w.source, !0); + runCoreEditorCommand(f, y) { + f.model.pushStackElement(), f.setCursorStates(y.source, 3, [ + an.cancelSelection(f, f.getPrimaryCursorState()) + ]), f.revealAllCursors(y.source, !0); } - }()), s.RemoveSecondaryCursors = oe(new class extends pi { + }()), s.RemoveSecondaryCursors = oe(new class extends gi { constructor() { super({ id: "removeSecondaryCursors", - precondition: I.hasMultipleSelections, + precondition: C.hasMultipleSelections, kbOpts: { weight: pt + 1, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 9, secondary: [ 1033 @@ -15127,137 +15127,137 @@ var ji; } }); } - runCoreEditorCommand(y, w) { - y.model.pushStackElement(), y.setCursorStates(w.source, 3, [ - y.getPrimaryCursorState() - ]), y.revealAllCursors(w.source, !0), Bc(p("removedCursor", "Removed secondary cursors")); + runCoreEditorCommand(f, y) { + f.model.pushStackElement(), f.setCursorStates(y.source, 3, [ + f.getPrimaryCursorState() + ]), f.revealAllCursors(y.source, !0), _d(p("removedCursor", "Removed secondary cursors")); } - }()), s.RevealLine = oe(new class extends pi { + }()), s.RevealLine = oe(new class extends gi { constructor() { super({ id: "revealLine", precondition: void 0, - metadata: Vp.metadata + metadata: Dp.metadata }); } - runCoreEditorCommand(y, w) { - const C = w, S = C.lineNumber || 0; - let L = typeof S == "number" ? S + 1 : parseInt(S) + 1; - L < 1 && (L = 1); - const x = y.model.getLineCount(); - L > x && (L = x); - const Z = new M(L, 1, L, y.model.getLineMaxColumn(L)); - let _ = 0; - if (C.at) - switch (C.at) { - case Vp.RawAtArgument.Top: - _ = 3; + runCoreEditorCommand(f, y) { + const W = y, G = W.lineNumber || 0; + let X = typeof G == "number" ? G + 1 : parseInt(G) + 1; + X < 1 && (X = 1); + const L = f.model.getLineCount(); + X > L && (X = L); + const S = new I(X, 1, X, f.model.getLineMaxColumn(X)); + let x = 0; + if (W.at) + switch (W.at) { + case Dp.RawAtArgument.Top: + x = 3; break; - case Vp.RawAtArgument.Center: - _ = 1; + case Dp.RawAtArgument.Center: + x = 1; break; - case Vp.RawAtArgument.Bottom: - _ = 4; + case Dp.RawAtArgument.Bottom: + x = 4; break; } - const v = y.coordinatesConverter.convertModelRangeToViewRange(Z); - y.revealRange( - w.source, + const w = f.coordinatesConverter.convertModelRangeToViewRange(S); + f.revealRange( + y.source, !1, - v, - _, + w, + x, 0 /* ScrollType.Smooth */ ); } - }()), s.SelectAll = new class extends H2 { + }()), s.SelectAll = new class extends mw { constructor() { - super(F$); + super(Tee); } - runDOMCommand(y) { - pr && (y.focus(), y.select()), y.ownerDocument.execCommand("selectAll"); + runDOMCommand(f) { + fl && (f.focus(), f.select()), f.ownerDocument.execCommand("selectAll"); } - runEditorCommand(y, w, C) { - const S = w._getViewModel(); - S && this.runCoreEditorCommand(S, C); + runEditorCommand(f, y, W) { + const G = y._getViewModel(); + G && this.runCoreEditorCommand(G, W); } - runCoreEditorCommand(y, w) { - y.model.pushStackElement(), y.setCursorStates("keyboard", 3, [ - cn.selectAll(y, y.getPrimaryCursorState()) + runCoreEditorCommand(f, y) { + f.model.pushStackElement(), f.setCursorStates("keyboard", 3, [ + an.selectAll(f, f.getPrimaryCursorState()) ]); } - }(), s.SetSelection = oe(new class extends pi { + }(), s.SetSelection = oe(new class extends gi { constructor() { super({ id: "setSelection", precondition: void 0 }); } - runCoreEditorCommand(y, w) { - w.selection && (y.model.pushStackElement(), y.setCursorStates(w.source, 3, [ - dt.fromModelSelection(w.selection) + runCoreEditorCommand(f, y) { + y.selection && (f.model.pushStackElement(), f.setCursorStates(y.source, 3, [ + at.fromModelSelection(y.selection) ])); } }()); -})(ji || (ji = {})); -const gte = H.and(I.textInputFocus, I.columnSelection); -function t0(s, e) { - ws.registerKeybindingRule({ +})(qi || (qi = {})); +const oie = P.and(C.textInputFocus, C.columnSelection); +function r0(s, e) { + Gs.registerKeybindingRule({ id: s, primary: e, - when: gte, + when: oie, weight: pt + 1 }); } -t0( - ji.CursorColumnSelectLeft.id, +r0( + qi.CursorColumnSelectLeft.id, 1039 /* KeyCode.LeftArrow */ ); -t0( - ji.CursorColumnSelectRight.id, +r0( + qi.CursorColumnSelectRight.id, 1041 /* KeyCode.RightArrow */ ); -t0( - ji.CursorColumnSelectUp.id, +r0( + qi.CursorColumnSelectUp.id, 1040 /* KeyCode.UpArrow */ ); -t0( - ji.CursorColumnSelectPageUp.id, +r0( + qi.CursorColumnSelectPageUp.id, 1035 /* KeyCode.PageUp */ ); -t0( - ji.CursorColumnSelectDown.id, +r0( + qi.CursorColumnSelectDown.id, 1042 /* KeyCode.DownArrow */ ); -t0( - ji.CursorColumnSelectPageDown.id, +r0( + qi.CursorColumnSelectPageDown.id, 1036 /* KeyCode.PageDown */ ); -function NF(s) { +function eF(s) { return s.register(), s; } -var xf; +var Ng; (function(s) { - class e extends zi { + class e extends Ai { runEditorCommand(i, n, o) { - const r = n._getViewModel(); - r && this.runCoreEditingCommand(n, r, o || {}); + const l = n._getViewModel(); + l && this.runCoreEditingCommand(n, l, o || {}); } } s.CoreEditingCommand = e, s.LineBreakInsert = oe(new class extends e { constructor() { super({ id: "lineBreakInsert", - precondition: I.writable, + precondition: C.writable, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 0, mac: { primary: 301 @@ -15267,39 +15267,39 @@ var xf; }); } runCoreEditingCommand(t, i, n) { - t.pushUndoStop(), t.executeCommands(this.id, j_.lineBreakInsert(i.cursorConfig, i.model, i.getCursorStates().map((o) => o.modelState.selection))); + t.pushUndoStop(), t.executeCommands(this.id, ux.lineBreakInsert(i.cursorConfig, i.model, i.getCursorStates().map((o) => o.modelState.selection))); } }()), s.Outdent = oe(new class extends e { constructor() { super({ id: "outdent", - precondition: I.writable, + precondition: C.writable, kbOpts: { weight: pt, - kbExpr: H.and(I.editorTextFocus, I.tabDoesNotMoveFocus), + kbExpr: P.and(C.editorTextFocus, C.tabDoesNotMoveFocus), primary: 1026 /* KeyCode.Tab */ } }); } runCoreEditingCommand(t, i, n) { - t.pushUndoStop(), t.executeCommands(this.id, vd.outdent(i.cursorConfig, i.model, i.getCursorStates().map((o) => o.modelState.selection))), t.pushUndoStop(); + t.pushUndoStop(), t.executeCommands(this.id, ka.outdent(i.cursorConfig, i.model, i.getCursorStates().map((o) => o.modelState.selection))), t.pushUndoStop(); } }()), s.Tab = oe(new class extends e { constructor() { super({ id: "tab", - precondition: I.writable, + precondition: C.writable, kbOpts: { weight: pt, - kbExpr: H.and(I.editorTextFocus, I.tabDoesNotMoveFocus), + kbExpr: P.and(C.editorTextFocus, C.tabDoesNotMoveFocus), primary: 2 /* KeyCode.Tab */ } }); } runCoreEditingCommand(t, i, n) { - t.pushUndoStop(), t.executeCommands(this.id, vd.tab(i.cursorConfig, i.model, i.getCursorStates().map((o) => o.modelState.selection))), t.pushUndoStop(); + t.pushUndoStop(), t.executeCommands(this.id, ka.tab(i.cursorConfig, i.model, i.getCursorStates().map((o) => o.modelState.selection))), t.pushUndoStop(); } }()), s.DeleteLeft = oe(new class extends e { constructor() { @@ -15308,7 +15308,7 @@ var xf; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 1, secondary: [ 1025 @@ -15324,8 +15324,8 @@ var xf; }); } runCoreEditingCommand(t, i, n) { - const [o, r] = mm.deleteLeft(i.getPrevEditOperationType(), i.cursorConfig, i.model, i.getCursorStates().map((l) => l.modelState.selection), i.getCursorAutoClosedCharacters()); - o && t.pushUndoStop(), t.executeCommands(this.id, r), i.setPrevEditOperationType( + const [o, l] = yb.deleteLeft(i.getPrevEditOperationType(), i.cursorConfig, i.model, i.getCursorStates().map((r) => r.modelState.selection), i.getCursorAutoClosedCharacters()); + o && t.pushUndoStop(), t.executeCommands(this.id, l), i.setPrevEditOperationType( 2 /* EditOperationType.DeletingLeft */ ); @@ -15337,7 +15337,7 @@ var xf; precondition: void 0, kbOpts: { weight: pt, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 20, mac: { primary: 20, secondary: [ 290, @@ -15348,15 +15348,15 @@ var xf; }); } runCoreEditingCommand(t, i, n) { - const [o, r] = mm.deleteRight(i.getPrevEditOperationType(), i.cursorConfig, i.model, i.getCursorStates().map((l) => l.modelState.selection)); - o && t.pushUndoStop(), t.executeCommands(this.id, r), i.setPrevEditOperationType( + const [o, l] = yb.deleteRight(i.getPrevEditOperationType(), i.cursorConfig, i.model, i.getCursorStates().map((r) => r.modelState.selection)); + o && t.pushUndoStop(), t.executeCommands(this.id, l), i.setPrevEditOperationType( 3 /* EditOperationType.DeletingRight */ ); } - }()), s.Undo = new class extends H2 { + }()), s.Undo = new class extends mw { constructor() { - super(yJ); + super(e_); } runDOMCommand(t) { t.ownerDocument.execCommand("undo"); @@ -15368,9 +15368,9 @@ var xf; ) === !0)) return i.getModel().undo(); } - }(), s.Redo = new class extends H2 { + }(), s.Redo = new class extends mw { constructor() { - super(wJ); + super(t_); } runDOMCommand(t) { t.ownerDocument.execCommand("redo"); @@ -15383,8 +15383,8 @@ var xf; return i.getModel().redo(); } }(); -})(xf || (xf = {})); -class WF extends O_ { +})(Ng || (Ng = {})); +class tF extends lx { constructor(e, t, i) { super({ id: e, @@ -15393,14 +15393,14 @@ class WF extends O_ { }), this._handlerId = t; } runCommand(e, t) { - const i = e.get(ft).getFocusedCodeEditor(); + const i = e.get(gt).getFocusedCodeEditor(); i && i.trigger("keyboard", this._handlerId, t); } } -function Rm(s, e) { - NF(new WF("default:" + s, s)), NF(new WF(s, s, e)); +function zb(s, e) { + eF(new tF("default:" + s, s)), eF(new tF(s, s, e)); } -Rm("type", { +zb("type", { description: "Type", args: [{ name: "args", @@ -15415,90 +15415,90 @@ Rm("type", { } }] }); -Rm( +zb( "replacePreviousChar" /* Handler.ReplacePreviousChar */ ); -Rm( +zb( "compositionType" /* Handler.CompositionType */ ); -Rm( +zb( "compositionStart" /* Handler.CompositionStart */ ); -Rm( +zb( "compositionEnd" /* Handler.CompositionEnd */ ); -Rm( +zb( "paste" /* Handler.Paste */ ); -Rm( +zb( "cut" /* Handler.Cut */ ); -const vE = $e("markerDecorationsService"); -var mte = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +const iJ = $e("markerDecorationsService"); +var lie = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, pte = function(s, e) { +}, rie = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Hf; -let AA = (Hf = class { +}, qg; +let HV = (qg = class { constructor(e, t) { } dispose() { } -}, Hf.ID = "editor.contrib.markerDecorations", Hf); -AA = mte([ - pte(1, vE) -], AA); -gt( - AA.ID, - AA, +}, qg.ID = "editor.contrib.markerDecorations", qg); +HV = lie([ + rie(1, iJ) +], HV); +mt( + HV.ID, + HV, 0 /* EditorContributionInstantiation.Eager */ ); -class YJ { +class V_ { constructor(e) { this.domNode = e, this._maxWidth = "", this._width = "", this._height = "", this._top = "", this._left = "", this._bottom = "", this._right = "", this._paddingLeft = "", this._fontFamily = "", this._fontWeight = "", this._fontSize = "", this._fontStyle = "", this._fontFeatureSettings = "", this._fontVariationSettings = "", this._textDecoration = "", this._lineHeight = "", this._letterSpacing = "", this._className = "", this._display = "", this._position = "", this._visibility = "", this._color = "", this._backgroundColor = "", this._layerHint = !1, this._contain = "none", this._boxShadow = ""; } setMaxWidth(e) { - const t = il(e); + const t = or(e); this._maxWidth !== t && (this._maxWidth = t, this.domNode.style.maxWidth = this._maxWidth); } setWidth(e) { - const t = il(e); + const t = or(e); this._width !== t && (this._width = t, this.domNode.style.width = this._width); } setHeight(e) { - const t = il(e); + const t = or(e); this._height !== t && (this._height = t, this.domNode.style.height = this._height); } setTop(e) { - const t = il(e); + const t = or(e); this._top !== t && (this._top = t, this.domNode.style.top = this._top); } setLeft(e) { - const t = il(e); + const t = or(e); this._left !== t && (this._left = t, this.domNode.style.left = this._left); } setBottom(e) { - const t = il(e); + const t = or(e); this._bottom !== t && (this._bottom = t, this.domNode.style.bottom = this._bottom); } setRight(e) { - const t = il(e); + const t = or(e); this._right !== t && (this._right = t, this.domNode.style.right = this._right); } setPaddingLeft(e) { - const t = il(e); + const t = or(e); this._paddingLeft !== t && (this._paddingLeft = t, this.domNode.style.paddingLeft = this._paddingLeft); } setFontFamily(e) { @@ -15508,7 +15508,7 @@ class YJ { this._fontWeight !== e && (this._fontWeight = e, this.domNode.style.fontWeight = this._fontWeight); } setFontSize(e) { - const t = il(e); + const t = or(e); this._fontSize !== t && (this._fontSize = t, this.domNode.style.fontSize = this._fontSize); } setFontStyle(e) { @@ -15524,11 +15524,11 @@ class YJ { this._textDecoration !== e && (this._textDecoration = e, this.domNode.style.textDecoration = this._textDecoration); } setLineHeight(e) { - const t = il(e); + const t = or(e); this._lineHeight !== t && (this._lineHeight = t, this.domNode.style.lineHeight = this._lineHeight); } setLetterSpacing(e) { - const t = il(e); + const t = or(e); this._letterSpacing !== t && (this._letterSpacing = t, this.domNode.style.letterSpacing = this._letterSpacing); } setClassName(e) { @@ -15574,24 +15574,24 @@ class YJ { this.domNode.removeChild(e.domNode); } } -function il(s) { +function or(s) { return typeof s == "number" ? `${s}px` : s; } -function yt(s) { - return new YJ(s); +function ft(s) { + return new V_(s); } -function mn(s, e) { - s instanceof YJ ? (s.setFontFamily(e.getMassagedFontFamily()), s.setFontWeight(e.fontWeight), s.setFontSize(e.fontSize), s.setFontFeatureSettings(e.fontFeatureSettings), s.setFontVariationSettings(e.fontVariationSettings), s.setLineHeight(e.lineHeight), s.setLetterSpacing(e.letterSpacing)) : (s.style.fontFamily = e.getMassagedFontFamily(), s.style.fontWeight = e.fontWeight, s.style.fontSize = e.fontSize + "px", s.style.fontFeatureSettings = e.fontFeatureSettings, s.style.fontVariationSettings = e.fontVariationSettings, s.style.lineHeight = e.lineHeight + "px", s.style.letterSpacing = e.letterSpacing + "px"); +function pn(s, e) { + s instanceof V_ ? (s.setFontFamily(e.getMassagedFontFamily()), s.setFontWeight(e.fontWeight), s.setFontSize(e.fontSize), s.setFontFeatureSettings(e.fontFeatureSettings), s.setFontVariationSettings(e.fontVariationSettings), s.setLineHeight(e.lineHeight), s.setLetterSpacing(e.letterSpacing)) : (s.style.fontFamily = e.getMassagedFontFamily(), s.style.fontWeight = e.fontWeight, s.style.fontSize = e.fontSize + "px", s.style.fontFeatureSettings = e.fontFeatureSettings, s.style.fontVariationSettings = e.fontVariationSettings, s.style.lineHeight = e.lineHeight + "px", s.style.letterSpacing = e.letterSpacing + "px"); } -function gc(s) { +function Zd(s) { if (!s || typeof s != "object" || s instanceof RegExp) return s; const e = Array.isArray(s) ? [] : {}; return Object.entries(s).forEach(([t, i]) => { - e[t] = i && typeof i == "object" ? gc(i) : i; + e[t] = i && typeof i == "object" ? Zd(i) : i; }), e; } -function fte(s) { +function cie(s) { if (!s || typeof s != "object") return s; const e = [s]; @@ -15599,19 +15599,19 @@ function fte(s) { const t = e.shift(); Object.freeze(t); for (const i in t) - if (zJ.call(t, i)) { + if (L_.call(t, i)) { const n = t[i]; - typeof n == "object" && !Object.isFrozen(n) && !z8(n) && e.push(n); + typeof n == "object" && !Object.isFrozen(n) && !Y6(n) && e.push(n); } } return s; } -const zJ = Object.prototype.hasOwnProperty; -function PJ(s, e) { - return J2(s, e, /* @__PURE__ */ new Set()); +const L_ = Object.prototype.hasOwnProperty; +function I_(s, e) { + return bw(s, e, /* @__PURE__ */ new Set()); } -function J2(s, e, t) { - if (Do(s)) +function bw(s, e, t) { + if (ko(s)) return s; const i = e(s); if (typeof i < "u") @@ -15619,26 +15619,26 @@ function J2(s, e, t) { if (Array.isArray(s)) { const n = []; for (const o of s) - n.push(J2(o, e, t)); + n.push(bw(o, e, t)); return n; } - if (tn(s)) { + if (nn(s)) { if (t.has(s)) throw new Error("Cannot clone recursive data-structure"); t.add(s); const n = {}; for (const o in s) - zJ.call(s, o) && (n[o] = J2(s[o], e, t)); + L_.call(s, o) && (n[o] = bw(s[o], e, t)); return t.delete(s), n; } return s; } -function $_(s, e, t = !0) { - return tn(s) ? (tn(e) && Object.keys(e).forEach((i) => { - i in s ? t && (tn(s[i]) && tn(e[i]) ? $_(s[i], e[i], t) : s[i] = e[i]) : s[i] = e[i]; +function bx(s, e, t = !0) { + return nn(s) ? (nn(e) && Object.keys(e).forEach((i) => { + i in s ? t && (nn(s[i]) && nn(e[i]) ? bx(s[i], e[i], t) : s[i] = e[i]) : s[i] = e[i]; }), s) : e; } -function co(s, e) { +function uo(s, e) { if (s === e) return !0; if (s == null || e === null || e === void 0 || typeof s != typeof e || typeof s != "object" || Array.isArray(s) !== Array.isArray(e)) @@ -15648,7 +15648,7 @@ function co(s, e) { if (s.length !== e.length) return !1; for (t = 0; t < s.length; t++) - if (!co(s[t], e[t])) + if (!uo(s[t], e[t])) return !1; } else { const n = []; @@ -15658,27 +15658,27 @@ function co(s, e) { const o = []; for (i in e) o.push(i); - if (o.sort(), !co(n, o)) + if (o.sort(), !uo(n, o)) return !1; for (t = 0; t < n.length; t++) - if (!co(s[n[t]], e[n[t]])) + if (!uo(s[n[t]], e[n[t]])) return !1; } return !0; } -function bte(s) { +function die(s) { let e = []; for (; Object.prototype !== s; ) e = e.concat(Object.getOwnPropertyNames(s)), s = Object.getPrototypeOf(s); return e; } -function U2(s) { +function pw(s) { const e = []; - for (const t of bte(s)) + for (const t of die(s)) typeof s[t] == "function" && e.push(t); return e; } -function yte(s, e) { +function aie(s, e) { const t = (n) => function() { const o = Array.prototype.slice.call(arguments, 0); return e(n, o); @@ -15687,7 +15687,7 @@ function yte(s, e) { i[n] = t(n); return i; } -class BJ extends R { +class S_ extends J { constructor(e, t) { super(), this._onDidChange = this._register(new k()), this.onDidChange = this._onDidChange.event, this._referenceDomElement = e, this._width = -1, this._height = -1, this._resizeObserver = null, this.measureReferenceDomElement(!1, t); } @@ -15712,13 +15712,13 @@ class BJ extends R { try { i = !1, n = !0, t(); } finally { - po(xe(this._referenceDomElement), () => { + Zo(Le(this._referenceDomElement), () => { n = !1, o(); }); } }; - this._resizeObserver = new ResizeObserver((r) => { - r && r[0] && r[0].contentRect ? e = { width: r[0].contentRect.width, height: r[0].contentRect.height } : e = null, i = !0, o(); + this._resizeObserver = new ResizeObserver((l) => { + l && l[0] && l[0].contentRect ? e = { width: l[0].contentRect.width, height: l[0].contentRect.height } : e = null, i = !0, o(); }), this._resizeObserver.observe(this._referenceDomElement); } } @@ -15733,7 +15733,7 @@ class BJ extends R { t ? (i = t.width, n = t.height) : this._referenceDomElement && (i = this._referenceDomElement.clientWidth, n = this._referenceDomElement.clientHeight), i = Math.max(5, i), n = Math.max(5, n), (this._width !== i || this._height !== n) && (this._width = i, this._height = n, e && this._onDidChange.fire()); } } -class wte extends R { +class hie extends J { constructor(e) { super(), this._onDidChange = this._register(new k()), this.onDidChange = this._onDidChange.event, this._listener = () => this._handleChange(e, !0), this._mediaQueryList = null, this._handleChange(e, !1); } @@ -15742,13 +15742,13 @@ class wte extends R { (i = this._mediaQueryList) == null || i.removeEventListener("change", this._listener), this._mediaQueryList = e.matchMedia(`(resolution: ${e.devicePixelRatio}dppx)`), this._mediaQueryList.addEventListener("change", this._listener), t && this._onDidChange.fire(); } } -class Cte extends R { +class uie extends J { get value() { return this._value; } constructor(e) { super(), this._onDidChange = this._register(new k()), this.onDidChange = this._onDidChange.event, this._value = this._getPixelRatio(e); - const t = this._register(new wte(e)); + const t = this._register(new hie(e)); this._register(t.onDidChange(() => { this._value = this._getPixelRatio(e), this._onDidChange.fire(this._value); })); @@ -15758,14 +15758,14 @@ class Cte extends R { return i / n; } } -class Ste { +class mie { constructor() { this.mapWindowIdToPixelRatioMonitor = /* @__PURE__ */ new Map(); } _getOrCreatePixelRatioMonitor(e) { - const t = lA(e); + const t = XV(e); let i = this.mapWindowIdToPixelRatioMonitor.get(t); - return i || (i = new Cte(e), this.mapWindowIdToPixelRatioMonitor.set(t, i), se.once(Bq)(({ vscodeWindowId: n }) => { + return i || (i = new uie(e), this.mapWindowIdToPixelRatioMonitor.set(t, i), se.once(v$)(({ vscodeWindowId: n }) => { n === t && (i == null || i.dispose(), this.mapWindowIdToPixelRatioMonitor.delete(t)); })), i; } @@ -15773,8 +15773,8 @@ class Ste { return this._getOrCreatePixelRatioMonitor(e); } } -const Fw = new Ste(); -class Lte { +const qy = new mie(); +class bie { constructor(e, t) { this.chr = e, this.type = t, this.width = 0; } @@ -15782,7 +15782,7 @@ class Lte { this.width = e; } } -class TE { +class nJ { constructor(e, t) { this._bareFontInfo = e, this._requests = t, this._container = null, this._testElements = null; } @@ -15794,17 +15794,17 @@ class TE { const e = document.createElement("div"); e.style.position = "absolute", e.style.top = "-50000px", e.style.width = "50000px"; const t = document.createElement("div"); - mn(t, this._bareFontInfo), e.appendChild(t); + pn(t, this._bareFontInfo), e.appendChild(t); const i = document.createElement("div"); - mn(i, this._bareFontInfo), i.style.fontWeight = "bold", e.appendChild(i); + pn(i, this._bareFontInfo), i.style.fontWeight = "bold", e.appendChild(i); const n = document.createElement("div"); - mn(n, this._bareFontInfo), n.style.fontStyle = "italic", e.appendChild(n); + pn(n, this._bareFontInfo), n.style.fontStyle = "italic", e.appendChild(n); const o = []; - for (const r of this._requests) { - let l; - r.type === 0 && (l = t), r.type === 2 && (l = i), r.type === 1 && (l = n), l.appendChild(document.createElement("br")); - const a = document.createElement("span"); - TE._render(a, r), l.appendChild(a), o.push(a); + for (const l of this._requests) { + let r; + l.type === 0 && (r = t), l.type === 2 && (r = i), l.type === 1 && (r = n), r.appendChild(document.createElement("br")); + const c = document.createElement("span"); + nJ._render(c, l), r.appendChild(c), o.push(c); } this._container = e, this._testElements = o; } @@ -15828,10 +15828,10 @@ class TE { } } } -function Ate(s, e, t) { - new TE(e, t).read(s); +function pie(s, e, t) { + new nJ(e, t).read(s); } -const Dn = { +const Yn = { tabSize: 4, indentSize: 4, insertSpaces: !0, @@ -15842,8 +15842,8 @@ const Dn = { enabled: !0, independentColorPoolPerBracketType: !1 } -}, ql = 8; -class OJ { +}, ic = 8; +class x_ { /** * @internal */ @@ -15854,7 +15854,7 @@ class OJ { return this._values[e]; } } -class HJ { +class C_ { constructor() { this.stableMinimapLayoutInput = null, this.stableFitMaxMinimapScale = 0, this.stableFitRemainingWidth = 0; } @@ -15864,49 +15864,49 @@ class jt { this.id = e, this.name = t, this.defaultValue = i, this.schema = n; } applyUpdate(e, t) { - return eI(e, t); + return px(e, t); } compute(e, t, i) { return i; } } -class Wy { +class Ff { constructor(e, t) { this.newValue = e, this.didChange = t; } } -function eI(s, e) { +function px(s, e) { if (typeof s != "object" || typeof e != "object" || !s || !e) - return new Wy(e, s !== e); + return new Ff(e, s !== e); if (Array.isArray(s) || Array.isArray(e)) { - const i = Array.isArray(s) && Array.isArray(e) && ei(s, e); - return new Wy(e, !i); + const i = Array.isArray(s) && Array.isArray(e) && ti(s, e); + return new Ff(e, !i); } let t = !1; for (const i in e) if (e.hasOwnProperty(i)) { - const n = eI(s[i], e[i]); + const n = px(s[i], e[i]); n.didChange && (s[i] = n.newValue, t = !0); } - return new Wy(s, t); + return new Ff(s, t); } -class pC { +class CG { constructor(e) { this.schema = void 0, this.id = e, this.name = "_never_", this.defaultValue = void 0; } applyUpdate(e, t) { - return eI(e, t); + return px(e, t); } validate(e) { return this.defaultValue; } } -class i0 { +class c0 { constructor(e, t, i, n) { this.id = e, this.name = t, this.defaultValue = i, this.schema = n; } applyUpdate(e, t) { - return eI(e, t); + return px(e, t); } validate(e) { return typeof e > "u" ? this.defaultValue : e; @@ -15915,41 +15915,41 @@ class i0 { return i; } } -function we(s, e) { +function ye(s, e) { return typeof s > "u" ? e : s === "false" ? !1 : !!s; } -class ct extends i0 { +class dt extends c0 { constructor(e, t, i, n = void 0) { typeof n < "u" && (n.type = "boolean", n.default = i), super(e, t, i, n); } validate(e) { - return we(e, this.defaultValue); + return ye(e, this.defaultValue); } } -function Au(s, e, t, i) { +function Cu(s, e, t, i) { if (typeof s > "u") return e; let n = parseInt(s, 10); return isNaN(n) ? e : (n = Math.max(t, n), n = Math.min(i, n), n | 0); } -class Dt extends i0 { +class Mt extends c0 { static clampedInt(e, t, i, n) { - return Au(e, t, i, n); + return Cu(e, t, i, n); } - constructor(e, t, i, n, o, r = void 0) { - typeof r < "u" && (r.type = "integer", r.default = i, r.minimum = n, r.maximum = o), super(e, t, i, r), this.minimum = n, this.maximum = o; + constructor(e, t, i, n, o, l = void 0) { + typeof l < "u" && (l.type = "integer", l.default = i, l.minimum = n, l.maximum = o), super(e, t, i, l), this.minimum = n, this.maximum = o; } validate(e) { - return Dt.clampedInt(e, this.defaultValue, this.minimum, this.maximum); + return Mt.clampedInt(e, this.defaultValue, this.minimum, this.maximum); } } -function xte(s, e, t, i) { +function gie(s, e, t, i) { if (typeof s > "u") return e; - const n = Eo.float(s, e); - return Eo.clamp(n, t, i); + const n = Do.float(s, e); + return Do.clamp(n, t, i); } -class Eo extends i0 { +class Do extends c0 { static clamp(e, t, i) { return e < t ? t : e > i ? i : e; } @@ -15965,10 +15965,10 @@ class Eo extends i0 { typeof o < "u" && (o.type = "number", o.default = i), super(e, t, i, o), this.validationFn = n; } validate(e) { - return this.validationFn(Eo.float(e, this.defaultValue)); + return this.validationFn(Do.float(e, this.defaultValue)); } } -class Kn extends i0 { +class jn extends c0 { static string(e, t) { return typeof e != "string" ? t : e; } @@ -15976,29 +15976,29 @@ class Kn extends i0 { typeof n < "u" && (n.type = "string", n.default = i), super(e, t, i, n); } validate(e) { - return Kn.string(e, this.defaultValue); + return jn.string(e, this.defaultValue); } } -function hi(s, e, t, i) { +function ui(s, e, t, i) { return typeof s != "string" ? e : i && s in i ? i[s] : t.indexOf(s) === -1 ? e : s; } -class di extends i0 { +class hi extends c0 { constructor(e, t, i, n, o = void 0) { typeof o < "u" && (o.type = "string", o.enum = n, o.default = i), super(e, t, i, o), this._allowedValues = n; } validate(e) { - return hi(e, this.defaultValue, this._allowedValues); + return ui(e, this.defaultValue, this._allowedValues); } } -class sS extends jt { - constructor(e, t, i, n, o, r, l = void 0) { - typeof l < "u" && (l.type = "string", l.enum = o, l.default = n), super(e, t, i, l), this._allowedValues = o, this._convert = r; +class Z1 extends jt { + constructor(e, t, i, n, o, l, r = void 0) { + typeof r < "u" && (r.type = "string", r.enum = o, r.default = n), super(e, t, i, r), this._allowedValues = o, this._convert = l; } validate(e) { return typeof e != "string" ? this.defaultValue : this._allowedValues.indexOf(e) === -1 ? this.defaultValue : this._convert(e); } } -function Mte(s) { +function Zie(s) { switch (s) { case "none": return 0; @@ -16012,7 +16012,7 @@ function Mte(s) { return 4; } } -class Zte extends jt { +class fie extends jt { constructor() { super(2, "accessibilitySupport", 0, { type: "string", @@ -16042,7 +16042,7 @@ class Zte extends jt { return i === 0 ? e.accessibilitySupport : i; } } -class _te extends jt { +class yie extends jt { constructor() { const e = { insertSpace: !0, @@ -16066,12 +16066,12 @@ class _te extends jt { return this.defaultValue; const t = e; return { - insertSpace: we(t.insertSpace, this.defaultValue.insertSpace), - ignoreEmptyLines: we(t.ignoreEmptyLines, this.defaultValue.ignoreEmptyLines) + insertSpace: ye(t.insertSpace, this.defaultValue.insertSpace), + ignoreEmptyLines: ye(t.ignoreEmptyLines, this.defaultValue.ignoreEmptyLines) }; } } -function Ite(s) { +function Wie(s) { switch (s) { case "blink": return 1; @@ -16085,27 +16085,27 @@ function Ite(s) { return 5; } } -var hn; +var un; (function(s) { s[s.Line = 1] = "Line", s[s.Block = 2] = "Block", s[s.Underline = 3] = "Underline", s[s.LineThin = 4] = "LineThin", s[s.BlockOutline = 5] = "BlockOutline", s[s.UnderlineThin = 6] = "UnderlineThin"; -})(hn || (hn = {})); -function Nte(s) { +})(un || (un = {})); +function Gie(s) { switch (s) { case "line": - return hn.Line; + return un.Line; case "block": - return hn.Block; + return un.Block; case "underline": - return hn.Underline; + return un.Underline; case "line-thin": - return hn.LineThin; + return un.LineThin; case "block-outline": - return hn.BlockOutline; + return un.BlockOutline; case "underline-thin": - return hn.UnderlineThin; + return un.UnderlineThin; } } -class Wte extends pC { +class Xie extends CG { constructor() { super( 143 @@ -16135,7 +16135,7 @@ class Wte extends pC { ) && n.push("showDeprecated"), n.join(" "); } } -class vte extends ct { +class Vie extends dt { constructor() { super(37, "emptySelectionClipboard", !0, { description: p("emptySelectionClipboard", "Controls whether copying without a selection copies the current line.") }); } @@ -16143,7 +16143,7 @@ class vte extends ct { return i && e.emptySelectionClipboard; } } -class Tte extends jt { +class Lie extends jt { constructor() { const e = { cursorMoveOnType: !0, @@ -16204,18 +16204,18 @@ class Tte extends jt { return this.defaultValue; const t = e; return { - cursorMoveOnType: we(t.cursorMoveOnType, this.defaultValue.cursorMoveOnType), - seedSearchStringFromSelection: typeof e.seedSearchStringFromSelection == "boolean" ? e.seedSearchStringFromSelection ? "always" : "never" : hi(t.seedSearchStringFromSelection, this.defaultValue.seedSearchStringFromSelection, ["never", "always", "selection"]), - autoFindInSelection: typeof e.autoFindInSelection == "boolean" ? e.autoFindInSelection ? "always" : "never" : hi(t.autoFindInSelection, this.defaultValue.autoFindInSelection, ["never", "always", "multiline"]), - globalFindClipboard: we(t.globalFindClipboard, this.defaultValue.globalFindClipboard), - addExtraSpaceOnTop: we(t.addExtraSpaceOnTop, this.defaultValue.addExtraSpaceOnTop), - loop: we(t.loop, this.defaultValue.loop) + cursorMoveOnType: ye(t.cursorMoveOnType, this.defaultValue.cursorMoveOnType), + seedSearchStringFromSelection: typeof e.seedSearchStringFromSelection == "boolean" ? e.seedSearchStringFromSelection ? "always" : "never" : ui(t.seedSearchStringFromSelection, this.defaultValue.seedSearchStringFromSelection, ["never", "always", "selection"]), + autoFindInSelection: typeof e.autoFindInSelection == "boolean" ? e.autoFindInSelection ? "always" : "never" : ui(t.autoFindInSelection, this.defaultValue.autoFindInSelection, ["never", "always", "multiline"]), + globalFindClipboard: ye(t.globalFindClipboard, this.defaultValue.globalFindClipboard), + addExtraSpaceOnTop: ye(t.addExtraSpaceOnTop, this.defaultValue.addExtraSpaceOnTop), + loop: ye(t.loop, this.defaultValue.loop) }; } } -const ac = class ac extends jt { +const ud = class ud extends jt { constructor() { - super(51, "fontLigatures", ac.OFF, { + super(51, "fontLigatures", ud.OFF, { anyOf: [ { type: "boolean", @@ -16231,14 +16231,14 @@ const ac = class ac extends jt { }); } validate(e) { - return typeof e > "u" ? this.defaultValue : typeof e == "string" ? e === "false" || e.length === 0 ? ac.OFF : e === "true" ? ac.ON : e : e ? ac.ON : ac.OFF; + return typeof e > "u" ? this.defaultValue : typeof e == "string" ? e === "false" || e.length === 0 ? ud.OFF : e === "true" ? ud.ON : e : e ? ud.ON : ud.OFF; } }; -ac.OFF = '"liga" off, "calt" off', ac.ON = '"liga" on, "calt" on'; -let Dh = ac; -const cc = class cc extends jt { +ud.OFF = '"liga" off, "calt" off', ud.ON = '"liga" on, "calt" on'; +let Jh = ud; +const md = class md extends jt { constructor() { - super(54, "fontVariations", cc.OFF, { + super(54, "fontVariations", md.OFF, { anyOf: [ { type: "boolean", @@ -16254,15 +16254,15 @@ const cc = class cc extends jt { }); } validate(e) { - return typeof e > "u" ? this.defaultValue : typeof e == "string" ? e === "false" ? cc.OFF : e === "true" ? cc.TRANSLATE : e : e ? cc.TRANSLATE : cc.OFF; + return typeof e > "u" ? this.defaultValue : typeof e == "string" ? e === "false" ? md.OFF : e === "true" ? md.TRANSLATE : e : e ? md.TRANSLATE : md.OFF; } compute(e, t, i) { return e.fontInfo.fontVariationSettings; } }; -cc.OFF = "normal", cc.TRANSLATE = "translate"; -let Yw = cc; -class Dte extends pC { +md.OFF = "normal", md.TRANSLATE = "translate"; +let $y = md; +class Iie extends CG { constructor() { super( 50 @@ -16273,32 +16273,32 @@ class Dte extends pC { return e.fontInfo; } } -class Vte extends i0 { +class Sie extends c0 { constructor() { - super(52, "fontSize", ps.fontSize, { + super(52, "fontSize", Zs.fontSize, { type: "number", minimum: 6, maximum: 100, - default: ps.fontSize, + default: Zs.fontSize, description: p("fontSize", "Controls the font size in pixels.") }); } validate(e) { - const t = Eo.float(e, this.defaultValue); - return t === 0 ? ps.fontSize : Eo.clamp(t, 6, 100); + const t = Do.float(e, this.defaultValue); + return t === 0 ? Zs.fontSize : Do.clamp(t, 6, 100); } compute(e, t, i) { return e.fontInfo.fontSize; } } -const na = class na extends jt { +const rc = class rc extends jt { constructor() { - super(53, "fontWeight", ps.fontWeight, { + super(53, "fontWeight", Zs.fontWeight, { anyOf: [ { type: "number", - minimum: na.MINIMUM_VALUE, - maximum: na.MAXIMUM_VALUE, + minimum: rc.MINIMUM_VALUE, + maximum: rc.MAXIMUM_VALUE, errorMessage: p("fontWeightErrorMessage", 'Only "normal" and "bold" keywords or numbers between 1 and 1000 are allowed.') }, { @@ -16306,20 +16306,20 @@ const na = class na extends jt { pattern: "^(normal|bold|1000|[1-9][0-9]{0,2})$" }, { - enum: na.SUGGESTION_VALUES + enum: rc.SUGGESTION_VALUES } ], - default: ps.fontWeight, + default: Zs.fontWeight, description: p("fontWeight", 'Controls the font weight. Accepts "normal" and "bold" keywords or numbers between 1 and 1000.') }); } validate(e) { - return e === "normal" || e === "bold" ? e : String(Dt.clampedInt(e, ps.fontWeight, na.MINIMUM_VALUE, na.MAXIMUM_VALUE)); + return e === "normal" || e === "bold" ? e : String(Mt.clampedInt(e, Zs.fontWeight, rc.MINIMUM_VALUE, rc.MAXIMUM_VALUE)); } }; -na.SUGGESTION_VALUES = ["normal", "bold", "100", "200", "300", "400", "500", "600", "700", "800", "900"], na.MINIMUM_VALUE = 1, na.MAXIMUM_VALUE = 1e3; -let K2 = na; -class kte extends jt { +rc.SUGGESTION_VALUES = ["normal", "bold", "100", "200", "300", "400", "500", "600", "700", "800", "900"], rc.MINIMUM_VALUE = 1, rc.MAXIMUM_VALUE = 1e3; +let gw = rc; +class xie extends jt { constructor() { const e = { multiple: "peek", @@ -16406,23 +16406,23 @@ class kte extends jt { return this.defaultValue; const t = e; return { - multiple: hi(t.multiple, this.defaultValue.multiple, ["peek", "gotoAndPeek", "goto"]), - multipleDefinitions: t.multipleDefinitions ?? hi(t.multipleDefinitions, "peek", ["peek", "gotoAndPeek", "goto"]), - multipleTypeDefinitions: t.multipleTypeDefinitions ?? hi(t.multipleTypeDefinitions, "peek", ["peek", "gotoAndPeek", "goto"]), - multipleDeclarations: t.multipleDeclarations ?? hi(t.multipleDeclarations, "peek", ["peek", "gotoAndPeek", "goto"]), - multipleImplementations: t.multipleImplementations ?? hi(t.multipleImplementations, "peek", ["peek", "gotoAndPeek", "goto"]), - multipleReferences: t.multipleReferences ?? hi(t.multipleReferences, "peek", ["peek", "gotoAndPeek", "goto"]), - multipleTests: t.multipleTests ?? hi(t.multipleTests, "peek", ["peek", "gotoAndPeek", "goto"]), - alternativeDefinitionCommand: Kn.string(t.alternativeDefinitionCommand, this.defaultValue.alternativeDefinitionCommand), - alternativeTypeDefinitionCommand: Kn.string(t.alternativeTypeDefinitionCommand, this.defaultValue.alternativeTypeDefinitionCommand), - alternativeDeclarationCommand: Kn.string(t.alternativeDeclarationCommand, this.defaultValue.alternativeDeclarationCommand), - alternativeImplementationCommand: Kn.string(t.alternativeImplementationCommand, this.defaultValue.alternativeImplementationCommand), - alternativeReferenceCommand: Kn.string(t.alternativeReferenceCommand, this.defaultValue.alternativeReferenceCommand), - alternativeTestsCommand: Kn.string(t.alternativeTestsCommand, this.defaultValue.alternativeTestsCommand) + multiple: ui(t.multiple, this.defaultValue.multiple, ["peek", "gotoAndPeek", "goto"]), + multipleDefinitions: t.multipleDefinitions ?? ui(t.multipleDefinitions, "peek", ["peek", "gotoAndPeek", "goto"]), + multipleTypeDefinitions: t.multipleTypeDefinitions ?? ui(t.multipleTypeDefinitions, "peek", ["peek", "gotoAndPeek", "goto"]), + multipleDeclarations: t.multipleDeclarations ?? ui(t.multipleDeclarations, "peek", ["peek", "gotoAndPeek", "goto"]), + multipleImplementations: t.multipleImplementations ?? ui(t.multipleImplementations, "peek", ["peek", "gotoAndPeek", "goto"]), + multipleReferences: t.multipleReferences ?? ui(t.multipleReferences, "peek", ["peek", "gotoAndPeek", "goto"]), + multipleTests: t.multipleTests ?? ui(t.multipleTests, "peek", ["peek", "gotoAndPeek", "goto"]), + alternativeDefinitionCommand: jn.string(t.alternativeDefinitionCommand, this.defaultValue.alternativeDefinitionCommand), + alternativeTypeDefinitionCommand: jn.string(t.alternativeTypeDefinitionCommand, this.defaultValue.alternativeTypeDefinitionCommand), + alternativeDeclarationCommand: jn.string(t.alternativeDeclarationCommand, this.defaultValue.alternativeDeclarationCommand), + alternativeImplementationCommand: jn.string(t.alternativeImplementationCommand, this.defaultValue.alternativeImplementationCommand), + alternativeReferenceCommand: jn.string(t.alternativeReferenceCommand, this.defaultValue.alternativeReferenceCommand), + alternativeTestsCommand: jn.string(t.alternativeTestsCommand, this.defaultValue.alternativeTestsCommand) }; } } -class Gte extends jt { +class Cie extends jt { constructor() { const e = { enabled: !0, @@ -16467,15 +16467,15 @@ class Gte extends jt { return this.defaultValue; const t = e; return { - enabled: we(t.enabled, this.defaultValue.enabled), - delay: Dt.clampedInt(t.delay, this.defaultValue.delay, 0, 1e4), - sticky: we(t.sticky, this.defaultValue.sticky), - hidingDelay: Dt.clampedInt(t.hidingDelay, this.defaultValue.hidingDelay, 0, 6e5), - above: we(t.above, this.defaultValue.above) + enabled: ye(t.enabled, this.defaultValue.enabled), + delay: Mt.clampedInt(t.delay, this.defaultValue.delay, 0, 1e4), + sticky: ye(t.sticky, this.defaultValue.sticky), + hidingDelay: Mt.clampedInt(t.hidingDelay, this.defaultValue.hidingDelay, 0, 6e5), + above: ye(t.above, this.defaultValue.above) }; } } -class Mf extends pC { +class wg extends CG { constructor() { super( 146 @@ -16483,7 +16483,7 @@ class Mf extends pC { ); } compute(e, t, i) { - return Mf.computeLayout(t, { + return wg.computeLayout(t, { memory: e.memory, outerWidth: e.outerWidth, outerHeight: e.outerHeight, @@ -16501,8 +16501,8 @@ class Mf extends pC { const t = e.height / e.lineHeight, i = Math.floor(e.paddingTop / e.lineHeight); let n = Math.floor(e.paddingBottom / e.lineHeight); e.scrollBeyondLastLine && (n = Math.max(n, t - 1)); - const o = (i + e.viewLineCount + n) / (e.pixelRatio * e.height), r = Math.floor(e.viewLineCount / o); - return { typicalViewportLineCount: t, extraLinesBeforeFirstLine: i, extraLinesBeyondLastLine: n, desiredRatio: o, minimapLineCount: r }; + const o = (i + e.viewLineCount + n) / (e.pixelRatio * e.height), l = Math.floor(e.viewLineCount / o); + return { typicalViewportLineCount: t, extraLinesBeforeFirstLine: i, extraLinesBeyondLastLine: n, desiredRatio: o, minimapLineCount: l }; } static _computeMinimapLayout(e, t) { const i = e.outerWidth, n = e.outerHeight, o = e.pixelRatio; @@ -16520,159 +16520,159 @@ class Mf extends pC { minimapCanvasOuterWidth: 0, minimapCanvasOuterHeight: n }; - const r = t.stableMinimapLayoutInput, l = r && e.outerHeight === r.outerHeight && e.lineHeight === r.lineHeight && e.typicalHalfwidthCharacterWidth === r.typicalHalfwidthCharacterWidth && e.pixelRatio === r.pixelRatio && e.scrollBeyondLastLine === r.scrollBeyondLastLine && e.paddingTop === r.paddingTop && e.paddingBottom === r.paddingBottom && e.minimap.enabled === r.minimap.enabled && e.minimap.side === r.minimap.side && e.minimap.size === r.minimap.size && e.minimap.showSlider === r.minimap.showSlider && e.minimap.renderCharacters === r.minimap.renderCharacters && e.minimap.maxColumn === r.minimap.maxColumn && e.minimap.scale === r.minimap.scale && e.verticalScrollbarWidth === r.verticalScrollbarWidth && e.isViewportWrapping === r.isViewportWrapping, a = e.lineHeight, c = e.typicalHalfwidthCharacterWidth, d = e.scrollBeyondLastLine, h = e.minimap.renderCharacters; + const l = t.stableMinimapLayoutInput, r = l && e.outerHeight === l.outerHeight && e.lineHeight === l.lineHeight && e.typicalHalfwidthCharacterWidth === l.typicalHalfwidthCharacterWidth && e.pixelRatio === l.pixelRatio && e.scrollBeyondLastLine === l.scrollBeyondLastLine && e.paddingTop === l.paddingTop && e.paddingBottom === l.paddingBottom && e.minimap.enabled === l.minimap.enabled && e.minimap.side === l.minimap.side && e.minimap.size === l.minimap.size && e.minimap.showSlider === l.minimap.showSlider && e.minimap.renderCharacters === l.minimap.renderCharacters && e.minimap.maxColumn === l.minimap.maxColumn && e.minimap.scale === l.minimap.scale && e.verticalScrollbarWidth === l.verticalScrollbarWidth && e.isViewportWrapping === l.isViewportWrapping, c = e.lineHeight, d = e.typicalHalfwidthCharacterWidth, a = e.scrollBeyondLastLine, h = e.minimap.renderCharacters; let u = o >= 2 ? Math.round(e.minimap.scale * 2) : e.minimap.scale; - const g = e.minimap.maxColumn, m = e.minimap.size, f = e.minimap.side, b = e.verticalScrollbarWidth, y = e.viewLineCount, w = e.remainingWidth, C = e.isViewportWrapping, S = h ? 2 : 3; - let L = Math.floor(o * n); - const x = L / o; - let Z = !1, _ = !1, v = S * u, P = u / o, E = 1; - if (m === "fill" || m === "fit") { - const { typicalViewportLineCount: be, extraLinesBeforeFirstLine: me, extraLinesBeyondLastLine: Ve, desiredRatio: ke, minimapLineCount: ci } = Mf.computeContainedMinimapLineCount({ - viewLineCount: y, - scrollBeyondLastLine: d, + const m = e.minimap.maxColumn, b = e.minimap.size, g = e.minimap.side, Z = e.verticalScrollbarWidth, f = e.viewLineCount, y = e.remainingWidth, W = e.isViewportWrapping, G = h ? 2 : 3; + let X = Math.floor(o * n); + const L = X / o; + let S = !1, x = !1, w = G * u, A = u / o, H = 1; + if (b === "fill" || b === "fit") { + const { typicalViewportLineCount: Ze, extraLinesBeforeFirstLine: be, extraLinesBeyondLastLine: Ye, desiredRatio: ke, minimapLineCount: ai } = wg.computeContainedMinimapLineCount({ + viewLineCount: f, + scrollBeyondLastLine: a, paddingTop: e.paddingTop, paddingBottom: e.paddingBottom, height: n, - lineHeight: a, + lineHeight: c, pixelRatio: o }); - if (y / ci > 1) - Z = !0, _ = !0, u = 1, v = 1, P = u / o; + if (f / ai > 1) + S = !0, x = !0, u = 1, w = 1, A = u / o; else { - let _t = !1, wt = u + 1; - if (m === "fit") { - const _i = Math.ceil((me + y + Ve) * v); - C && l && w <= t.stableFitRemainingWidth ? (_t = !0, wt = t.stableFitMaxMinimapScale) : _t = _i > L; + let xt = !1, yt = u + 1; + if (b === "fit") { + const Ci = Math.ceil((be + f + Ye) * w); + W && r && y <= t.stableFitRemainingWidth ? (xt = !0, yt = t.stableFitMaxMinimapScale) : xt = Ci > X; } - if (m === "fill" || _t) { - Z = !0; - const _i = u; - v = Math.min(a * o, Math.max(1, Math.floor(1 / ke))), C && l && w <= t.stableFitRemainingWidth && (wt = t.stableFitMaxMinimapScale), u = Math.min(wt, Math.max(1, Math.floor(v / S))), u > _i && (E = Math.min(2, u / _i)), P = u / o / E, L = Math.ceil(Math.max(be, me + y + Ve) * v), C ? (t.stableMinimapLayoutInput = e, t.stableFitRemainingWidth = w, t.stableFitMaxMinimapScale = u) : (t.stableMinimapLayoutInput = null, t.stableFitRemainingWidth = 0); + if (b === "fill" || xt) { + S = !0; + const Ci = u; + w = Math.min(c * o, Math.max(1, Math.floor(1 / ke))), W && r && y <= t.stableFitRemainingWidth && (yt = t.stableFitMaxMinimapScale), u = Math.min(yt, Math.max(1, Math.floor(w / G))), u > Ci && (H = Math.min(2, u / Ci)), A = u / o / H, X = Math.ceil(Math.max(Ze, be + f + Ye) * w), W ? (t.stableMinimapLayoutInput = e, t.stableFitRemainingWidth = y, t.stableFitMaxMinimapScale = u) : (t.stableMinimapLayoutInput = null, t.stableFitRemainingWidth = 0); } } } - const Y = Math.floor(g * P), B = Math.min(Y, Math.max(0, Math.floor((w - b - 2) * P / (c + P))) + ql); - let X = Math.floor(o * B); - const j = X / o; - X = Math.floor(X * E); - const le = h ? 1 : 2, ue = f === "left" ? 0 : i - B - b; + const F = Math.floor(m * A), K = Math.min(F, Math.max(0, Math.floor((y - Z - 2) * A / (d + A))) + ic); + let E = Math.floor(o * K); + const j = E / o; + E = Math.floor(E * H); + const re = h ? 1 : 2, ue = g === "left" ? 0 : i - K - Z; return { - renderMinimap: le, + renderMinimap: re, minimapLeft: ue, - minimapWidth: B, - minimapHeightIsEditorHeight: Z, - minimapIsSampling: _, + minimapWidth: K, + minimapHeightIsEditorHeight: S, + minimapIsSampling: x, minimapScale: u, - minimapLineHeight: v, - minimapCanvasInnerWidth: X, - minimapCanvasInnerHeight: L, + minimapLineHeight: w, + minimapCanvasInnerWidth: E, + minimapCanvasInnerHeight: X, minimapCanvasOuterWidth: j, - minimapCanvasOuterHeight: x + minimapCanvasOuterHeight: L }; } static computeLayout(e, t) { - const i = t.outerWidth | 0, n = t.outerHeight | 0, o = t.lineHeight | 0, r = t.lineNumbersDigitCount | 0, l = t.typicalHalfwidthCharacterWidth, a = t.maxDigitWidth, c = t.pixelRatio, d = t.viewLineCount, h = e.get( + const i = t.outerWidth | 0, n = t.outerHeight | 0, o = t.lineHeight | 0, l = t.lineNumbersDigitCount | 0, r = t.typicalHalfwidthCharacterWidth, c = t.maxDigitWidth, d = t.pixelRatio, a = t.viewLineCount, h = e.get( 138 /* EditorOption.wordWrapOverride2 */ ), u = h === "inherit" ? e.get( 137 /* EditorOption.wordWrapOverride1 */ - ) : h, g = u === "inherit" ? e.get( + ) : h, m = u === "inherit" ? e.get( 133 /* EditorOption.wordWrap */ - ) : u, m = e.get( + ) : u, b = e.get( 136 /* EditorOption.wordWrapColumn */ - ), f = t.isDominatedByLongLines, b = e.get( + ), g = t.isDominatedByLongLines, Z = e.get( 57 /* EditorOption.glyphMargin */ - ), y = e.get( + ), f = e.get( 68 /* EditorOption.lineNumbers */ - ).renderType !== 0, w = e.get( + ).renderType !== 0, y = e.get( 69 /* EditorOption.lineNumbersMinChars */ - ), C = e.get( + ), W = e.get( 106 /* EditorOption.scrollBeyondLastLine */ - ), S = e.get( + ), G = e.get( 84 /* EditorOption.padding */ - ), L = e.get( + ), X = e.get( 73 /* EditorOption.minimap */ - ), x = e.get( + ), L = e.get( 104 /* EditorOption.scrollbar */ - ), Z = x.verticalScrollbarSize, _ = x.verticalHasArrows, v = x.arrowSize, P = x.horizontalScrollbarSize, E = e.get( + ), S = L.verticalScrollbarSize, x = L.verticalHasArrows, w = L.arrowSize, A = L.horizontalScrollbarSize, H = e.get( 43 /* EditorOption.folding */ - ), Y = e.get( + ), F = e.get( 111 /* EditorOption.showFoldingControls */ ) !== "never"; - let B = e.get( + let K = e.get( 66 /* EditorOption.lineDecorationsWidth */ ); - E && Y && (B += 16); - let X = 0; - if (y) { - const Zs = Math.max(r, w); - X = Math.round(Zs * a); + H && F && (K += 16); + let E = 0; + if (f) { + const Cs = Math.max(l, y); + E = Math.round(Cs * c); } let j = 0; - b && (j = o * t.glyphMarginDecorationLaneCount); - let le = 0, ue = le + j, be = ue + X, me = be + B; - const Ve = i - j - X - B; - let ke = !1, ci = !1, Ee = -1; - u === "inherit" && f ? (ke = !0, ci = !0) : g === "on" || g === "bounded" ? ci = !0 : g === "wordWrapColumn" && (Ee = m); - const _t = Mf._computeMinimapLayout({ + Z && (j = o * t.glyphMarginDecorationLaneCount); + let re = 0, ue = re + j, Ze = ue + E, be = Ze + K; + const Ye = i - j - E - K; + let ke = !1, ai = !1, He = -1; + u === "inherit" && g ? (ke = !0, ai = !0) : m === "on" || m === "bounded" ? ai = !0 : m === "wordWrapColumn" && (He = b); + const xt = wg._computeMinimapLayout({ outerWidth: i, outerHeight: n, lineHeight: o, - typicalHalfwidthCharacterWidth: l, - pixelRatio: c, - scrollBeyondLastLine: C, - paddingTop: S.top, - paddingBottom: S.bottom, - minimap: L, - verticalScrollbarWidth: Z, - viewLineCount: d, - remainingWidth: Ve, - isViewportWrapping: ci - }, t.memory || new HJ()); - _t.renderMinimap !== 0 && _t.minimapLeft === 0 && (le += _t.minimapWidth, ue += _t.minimapWidth, be += _t.minimapWidth, me += _t.minimapWidth); - const wt = Ve - _t.minimapWidth, _i = Math.max(1, Math.floor((wt - Z - 2) / l)), ts = _ ? v : 0; - return ci && (Ee = Math.max(1, _i), g === "bounded" && (Ee = Math.min(Ee, m))), { + typicalHalfwidthCharacterWidth: r, + pixelRatio: d, + scrollBeyondLastLine: W, + paddingTop: G.top, + paddingBottom: G.bottom, + minimap: X, + verticalScrollbarWidth: S, + viewLineCount: a, + remainingWidth: Ye, + isViewportWrapping: ai + }, t.memory || new C_()); + xt.renderMinimap !== 0 && xt.minimapLeft === 0 && (re += xt.minimapWidth, ue += xt.minimapWidth, Ze += xt.minimapWidth, be += xt.minimapWidth); + const yt = Ye - xt.minimapWidth, Ci = Math.max(1, Math.floor((yt - S - 2) / r)), ns = x ? w : 0; + return ai && (He = Math.max(1, Ci), m === "bounded" && (He = Math.min(He, b))), { width: i, height: n, - glyphMarginLeft: le, + glyphMarginLeft: re, glyphMarginWidth: j, glyphMarginDecorationLaneCount: t.glyphMarginDecorationLaneCount, lineNumbersLeft: ue, - lineNumbersWidth: X, - decorationsLeft: be, - decorationsWidth: B, - contentLeft: me, - contentWidth: wt, - minimap: _t, - viewportColumn: _i, + lineNumbersWidth: E, + decorationsLeft: Ze, + decorationsWidth: K, + contentLeft: be, + contentWidth: yt, + minimap: xt, + viewportColumn: Ci, isWordWrapMinified: ke, - isViewportWrapping: ci, - wrappingColumn: Ee, - verticalScrollbarWidth: Z, - horizontalScrollbarHeight: P, + isViewportWrapping: ai, + wrappingColumn: He, + verticalScrollbarWidth: S, + horizontalScrollbarHeight: A, overviewRuler: { - top: ts, - width: Z, - height: n - 2 * ts, + top: ns, + width: S, + height: n - 2 * ns, right: 0 } }; } } -class Rte extends jt { +class Rie extends jt { constructor() { super(140, "wrappingStrategy", "simple", { "editor.wrappingStrategy": { @@ -16688,7 +16688,7 @@ class Rte extends jt { }); } validate(e) { - return hi(e, "simple", ["simple", "advanced"]); + return ui(e, "simple", ["simple", "advanced"]); } compute(e, t, i) { return t.get( @@ -16697,18 +16697,18 @@ class Rte extends jt { ) === 2 ? "advanced" : i; } } -var Dr; +var vl; (function(s) { s.Off = "off", s.OnCode = "onCode", s.On = "on"; -})(Dr || (Dr = {})); -class Ete extends jt { +})(vl || (vl = {})); +class Nie extends jt { constructor() { - const e = { enabled: Dr.OnCode }; + const e = { enabled: vl.OnCode }; super(65, "lightbulb", e, { "editor.lightbulb.enabled": { type: "string", tags: ["experimental"], - enum: [Dr.Off, Dr.OnCode, Dr.On], + enum: [vl.Off, vl.OnCode, vl.On], default: e.enabled, enumDescriptions: [ p("editor.lightbulb.enabled.off", "Disable the code action menu."), @@ -16721,11 +16721,11 @@ class Ete extends jt { } validate(e) { return !e || typeof e != "object" ? this.defaultValue : { - enabled: hi(e.enabled, this.defaultValue.enabled, [Dr.Off, Dr.OnCode, Dr.On]) + enabled: ui(e.enabled, this.defaultValue.enabled, [vl.Off, vl.OnCode, vl.On]) }; } } -class Xte extends jt { +class wie extends jt { constructor() { const e = { enabled: !0, maxLineCount: 5, defaultModel: "outlineModel", scrollWithEditor: !0 }; super(116, "stickyScroll", e, { @@ -16760,14 +16760,14 @@ class Xte extends jt { return this.defaultValue; const t = e; return { - enabled: we(t.enabled, this.defaultValue.enabled), - maxLineCount: Dt.clampedInt(t.maxLineCount, this.defaultValue.maxLineCount, 1, 20), - defaultModel: hi(t.defaultModel, this.defaultValue.defaultModel, ["outlineModel", "foldingProviderModel", "indentationModel"]), - scrollWithEditor: we(t.scrollWithEditor, this.defaultValue.scrollWithEditor) + enabled: ye(t.enabled, this.defaultValue.enabled), + maxLineCount: Mt.clampedInt(t.maxLineCount, this.defaultValue.maxLineCount, 1, 20), + defaultModel: ui(t.defaultModel, this.defaultValue.defaultModel, ["outlineModel", "foldingProviderModel", "indentationModel"]), + scrollWithEditor: ye(t.scrollWithEditor, this.defaultValue.scrollWithEditor) }; } } -class Fte extends jt { +class Tie extends jt { constructor() { const e = { enabled: "on", fontSize: 0, fontFamily: "", padding: !1 }; super(142, "inlayHints", e, { @@ -16805,27 +16805,27 @@ class Fte extends jt { return this.defaultValue; const t = e; return typeof t.enabled == "boolean" && (t.enabled = t.enabled ? "on" : "off"), { - enabled: hi(t.enabled, this.defaultValue.enabled, ["on", "off", "offUnlessPressed", "onUnlessPressed"]), - fontSize: Dt.clampedInt(t.fontSize, this.defaultValue.fontSize, 0, 100), - fontFamily: Kn.string(t.fontFamily, this.defaultValue.fontFamily), - padding: we(t.padding, this.defaultValue.padding) + enabled: ui(t.enabled, this.defaultValue.enabled, ["on", "off", "offUnlessPressed", "onUnlessPressed"]), + fontSize: Mt.clampedInt(t.fontSize, this.defaultValue.fontSize, 0, 100), + fontFamily: jn.string(t.fontFamily, this.defaultValue.fontFamily), + padding: ye(t.padding, this.defaultValue.padding) }; } } -class Yte extends jt { +class Mie extends jt { constructor() { super(66, "lineDecorationsWidth", 10); } validate(e) { - return typeof e == "string" && /^\d+(\.\d+)?ch$/.test(e) ? -parseFloat(e.substring(0, e.length - 2)) : Dt.clampedInt(e, this.defaultValue, 0, 1e3); + return typeof e == "string" && /^\d+(\.\d+)?ch$/.test(e) ? -parseFloat(e.substring(0, e.length - 2)) : Mt.clampedInt(e, this.defaultValue, 0, 1e3); } compute(e, t, i) { - return i < 0 ? Dt.clampedInt(-i * e.fontInfo.typicalHalfwidthCharacterWidth, this.defaultValue, 0, 1e3) : i; + return i < 0 ? Mt.clampedInt(-i * e.fontInfo.typicalHalfwidthCharacterWidth, this.defaultValue, 0, 1e3) : i; } } -class zte extends Eo { +class Yie extends Do { constructor() { - super(67, "lineHeight", ps.lineHeight, (e) => Eo.clamp(e, 0, 150), { markdownDescription: p("lineHeight", `Controls the line height. + super(67, "lineHeight", Zs.lineHeight, (e) => Do.clamp(e, 0, 150), { markdownDescription: p("lineHeight", `Controls the line height. - Use 0 to automatically compute the line height from the font size. - Values between 0 and 8 will be used as a multiplier with the font size. - Values greater than or equal to 8 will be used as effective values.`) }); @@ -16834,7 +16834,7 @@ class zte extends Eo { return e.fontInfo.lineHeight; } } -class Pte extends jt { +class kie extends jt { constructor() { const e = { enabled: !0, @@ -16929,25 +16929,25 @@ class Pte extends jt { return this.defaultValue; const t = e; return { - enabled: we(t.enabled, this.defaultValue.enabled), - autohide: we(t.autohide, this.defaultValue.autohide), - size: hi(t.size, this.defaultValue.size, ["proportional", "fill", "fit"]), - side: hi(t.side, this.defaultValue.side, ["right", "left"]), - showSlider: hi(t.showSlider, this.defaultValue.showSlider, ["always", "mouseover"]), - renderCharacters: we(t.renderCharacters, this.defaultValue.renderCharacters), - scale: Dt.clampedInt(t.scale, 1, 1, 3), - maxColumn: Dt.clampedInt(t.maxColumn, this.defaultValue.maxColumn, 1, 1e4), - showRegionSectionHeaders: we(t.showRegionSectionHeaders, this.defaultValue.showRegionSectionHeaders), - showMarkSectionHeaders: we(t.showMarkSectionHeaders, this.defaultValue.showMarkSectionHeaders), - sectionHeaderFontSize: Eo.clamp(t.sectionHeaderFontSize ?? this.defaultValue.sectionHeaderFontSize, 4, 32), - sectionHeaderLetterSpacing: Eo.clamp(t.sectionHeaderLetterSpacing ?? this.defaultValue.sectionHeaderLetterSpacing, 0, 5) + enabled: ye(t.enabled, this.defaultValue.enabled), + autohide: ye(t.autohide, this.defaultValue.autohide), + size: ui(t.size, this.defaultValue.size, ["proportional", "fill", "fit"]), + side: ui(t.side, this.defaultValue.side, ["right", "left"]), + showSlider: ui(t.showSlider, this.defaultValue.showSlider, ["always", "mouseover"]), + renderCharacters: ye(t.renderCharacters, this.defaultValue.renderCharacters), + scale: Mt.clampedInt(t.scale, 1, 1, 3), + maxColumn: Mt.clampedInt(t.maxColumn, this.defaultValue.maxColumn, 1, 1e4), + showRegionSectionHeaders: ye(t.showRegionSectionHeaders, this.defaultValue.showRegionSectionHeaders), + showMarkSectionHeaders: ye(t.showMarkSectionHeaders, this.defaultValue.showMarkSectionHeaders), + sectionHeaderFontSize: Do.clamp(t.sectionHeaderFontSize ?? this.defaultValue.sectionHeaderFontSize, 4, 32), + sectionHeaderLetterSpacing: Do.clamp(t.sectionHeaderLetterSpacing ?? this.defaultValue.sectionHeaderLetterSpacing, 0, 5) }; } } -function Bte(s) { +function vie(s) { return s === "ctrlCmd" ? qe ? "metaKey" : "ctrlKey" : "altKey"; } -class Ote extends jt { +class Jie extends jt { constructor() { super(84, "padding", { top: 0, bottom: 0 }, { "editor.padding.top": { @@ -16971,12 +16971,12 @@ class Ote extends jt { return this.defaultValue; const t = e; return { - top: Dt.clampedInt(t.top, 0, 0, 1e3), - bottom: Dt.clampedInt(t.bottom, 0, 0, 1e3) + top: Mt.clampedInt(t.top, 0, 0, 1e3), + bottom: Mt.clampedInt(t.bottom, 0, 0, 1e3) }; } } -class Hte extends jt { +class Hie extends jt { constructor() { const e = { enabled: !0, @@ -17000,12 +17000,12 @@ class Hte extends jt { return this.defaultValue; const t = e; return { - enabled: we(t.enabled, this.defaultValue.enabled), - cycle: we(t.cycle, this.defaultValue.cycle) + enabled: ye(t.enabled, this.defaultValue.enabled), + cycle: ye(t.cycle, this.defaultValue.cycle) }; } } -class Jte extends pC { +class Eie extends CG { constructor() { super( 144 @@ -17016,7 +17016,7 @@ class Jte extends pC { return e.pixelRatio; } } -class Ute extends jt { +class Die extends jt { constructor() { super(88, "placeholder", void 0); } @@ -17024,7 +17024,7 @@ class Ute extends jt { return typeof e > "u" ? this.defaultValue : typeof e == "string" ? e : this.defaultValue; } } -class Kte extends jt { +class Fie extends jt { constructor() { const e = { other: "on", @@ -17064,21 +17064,21 @@ class Kte extends jt { } validate(e) { if (typeof e == "boolean") { - const c = e ? "on" : "off"; - return { comments: c, strings: c, other: c }; + const d = e ? "on" : "off"; + return { comments: d, strings: d, other: d }; } if (!e || typeof e != "object") return this.defaultValue; const { other: t, comments: i, strings: n } = e, o = ["on", "inline", "off"]; - let r, l, a; - return typeof t == "boolean" ? r = t ? "on" : "off" : r = hi(t, this.defaultValue.other, o), typeof i == "boolean" ? l = i ? "on" : "off" : l = hi(i, this.defaultValue.comments, o), typeof n == "boolean" ? a = n ? "on" : "off" : a = hi(n, this.defaultValue.strings, o), { - other: r, - comments: l, - strings: a + let l, r, c; + return typeof t == "boolean" ? l = t ? "on" : "off" : l = ui(t, this.defaultValue.other, o), typeof i == "boolean" ? r = i ? "on" : "off" : r = ui(i, this.defaultValue.comments, o), typeof n == "boolean" ? c = n ? "on" : "off" : c = ui(n, this.defaultValue.strings, o), { + other: l, + comments: r, + strings: c }; } } -class Qte extends jt { +class zie extends jt { constructor() { super(68, "lineNumbers", { renderType: 1, renderFn: null }, { type: "string", @@ -17101,7 +17101,7 @@ class Qte extends jt { }; } } -function xA(s) { +function EV(s) { const e = s.get( 99 /* EditorOption.renderValidationDecorations */ @@ -17111,7 +17111,7 @@ function xA(s) { /* EditorOption.readOnly */ ) : e !== "on"; } -class jte extends jt { +class Aie extends jt { constructor() { const e = [], t = { type: "number", description: p("rulers.size", "Number of monospace characters at which this editor ruler will render.") }; super(103, "rulers", e, { @@ -17144,13 +17144,13 @@ class jte extends jt { for (const i of e) if (typeof i == "number") t.push({ - column: Dt.clampedInt(i, 0, 0, 1e4), + column: Mt.clampedInt(i, 0, 0, 1e4), color: null }); else if (i && typeof i == "object") { const n = i; t.push({ - column: Dt.clampedInt(n.column, 0, 0, 1e4), + column: Mt.clampedInt(n.column, 0, 0, 1e4), color: n.color }); } @@ -17159,7 +17159,7 @@ class jte extends jt { return this.defaultValue; } } -class qte extends jt { +class Kie extends jt { constructor() { super(93, "readOnlyMessage", void 0); } @@ -17167,7 +17167,7 @@ class qte extends jt { return !e || typeof e != "object" ? this.defaultValue : e; } } -function vF(s, e) { +function iF(s, e) { if (typeof s != "string") return e; switch (s) { @@ -17179,7 +17179,7 @@ function vF(s, e) { return 1; } } -let $te = class extends jt { +let Uie = class extends jt { constructor() { const e = { vertical: 1, @@ -17245,26 +17245,26 @@ let $te = class extends jt { validate(e) { if (!e || typeof e != "object") return this.defaultValue; - const t = e, i = Dt.clampedInt(t.horizontalScrollbarSize, this.defaultValue.horizontalScrollbarSize, 0, 1e3), n = Dt.clampedInt(t.verticalScrollbarSize, this.defaultValue.verticalScrollbarSize, 0, 1e3); + const t = e, i = Mt.clampedInt(t.horizontalScrollbarSize, this.defaultValue.horizontalScrollbarSize, 0, 1e3), n = Mt.clampedInt(t.verticalScrollbarSize, this.defaultValue.verticalScrollbarSize, 0, 1e3); return { - arrowSize: Dt.clampedInt(t.arrowSize, this.defaultValue.arrowSize, 0, 1e3), - vertical: vF(t.vertical, this.defaultValue.vertical), - horizontal: vF(t.horizontal, this.defaultValue.horizontal), - useShadows: we(t.useShadows, this.defaultValue.useShadows), - verticalHasArrows: we(t.verticalHasArrows, this.defaultValue.verticalHasArrows), - horizontalHasArrows: we(t.horizontalHasArrows, this.defaultValue.horizontalHasArrows), - handleMouseWheel: we(t.handleMouseWheel, this.defaultValue.handleMouseWheel), - alwaysConsumeMouseWheel: we(t.alwaysConsumeMouseWheel, this.defaultValue.alwaysConsumeMouseWheel), + arrowSize: Mt.clampedInt(t.arrowSize, this.defaultValue.arrowSize, 0, 1e3), + vertical: iF(t.vertical, this.defaultValue.vertical), + horizontal: iF(t.horizontal, this.defaultValue.horizontal), + useShadows: ye(t.useShadows, this.defaultValue.useShadows), + verticalHasArrows: ye(t.verticalHasArrows, this.defaultValue.verticalHasArrows), + horizontalHasArrows: ye(t.horizontalHasArrows, this.defaultValue.horizontalHasArrows), + handleMouseWheel: ye(t.handleMouseWheel, this.defaultValue.handleMouseWheel), + alwaysConsumeMouseWheel: ye(t.alwaysConsumeMouseWheel, this.defaultValue.alwaysConsumeMouseWheel), horizontalScrollbarSize: i, - horizontalSliderSize: Dt.clampedInt(t.horizontalSliderSize, i, 0, 1e3), + horizontalSliderSize: Mt.clampedInt(t.horizontalSliderSize, i, 0, 1e3), verticalScrollbarSize: n, - verticalSliderSize: Dt.clampedInt(t.verticalSliderSize, n, 0, 1e3), - scrollByPage: we(t.scrollByPage, this.defaultValue.scrollByPage), - ignoreHorizontalScrollbarInContentHeight: we(t.ignoreHorizontalScrollbarInContentHeight, this.defaultValue.ignoreHorizontalScrollbarInContentHeight) + verticalSliderSize: Mt.clampedInt(t.verticalSliderSize, n, 0, 1e3), + scrollByPage: ye(t.scrollByPage, this.defaultValue.scrollByPage), + ignoreHorizontalScrollbarInContentHeight: ye(t.ignoreHorizontalScrollbarInContentHeight, this.defaultValue.ignoreHorizontalScrollbarInContentHeight) }; } }; -const _o = "inUntrustedWorkspace", Ws = { +const Ro = "inUntrustedWorkspace", Ts = { allowedCharacters: "editor.unicodeHighlight.allowedCharacters", invisibleCharacters: "editor.unicodeHighlight.invisibleCharacters", nonBasicASCII: "editor.unicodeHighlight.nonBasicASCII", @@ -17273,52 +17273,52 @@ const _o = "inUntrustedWorkspace", Ws = { includeStrings: "editor.unicodeHighlight.includeStrings", allowedLocales: "editor.unicodeHighlight.allowedLocales" }; -class eie extends jt { +class Pie extends jt { constructor() { const e = { - nonBasicASCII: _o, + nonBasicASCII: Ro, invisibleCharacters: !0, ambiguousCharacters: !0, - includeComments: _o, + includeComments: Ro, includeStrings: !0, allowedCharacters: {}, allowedLocales: { _os: !0, _vscode: !0 } }; super(126, "unicodeHighlight", e, { - [Ws.nonBasicASCII]: { + [Ts.nonBasicASCII]: { restricted: !0, type: ["boolean", "string"], - enum: [!0, !1, _o], + enum: [!0, !1, Ro], default: e.nonBasicASCII, description: p("unicodeHighlight.nonBasicASCII", "Controls whether all non-basic ASCII characters are highlighted. Only characters between U+0020 and U+007E, tab, line-feed and carriage-return are considered basic ASCII.") }, - [Ws.invisibleCharacters]: { + [Ts.invisibleCharacters]: { restricted: !0, type: "boolean", default: e.invisibleCharacters, description: p("unicodeHighlight.invisibleCharacters", "Controls whether characters that just reserve space or have no width at all are highlighted.") }, - [Ws.ambiguousCharacters]: { + [Ts.ambiguousCharacters]: { restricted: !0, type: "boolean", default: e.ambiguousCharacters, description: p("unicodeHighlight.ambiguousCharacters", "Controls whether characters are highlighted that can be confused with basic ASCII characters, except those that are common in the current user locale.") }, - [Ws.includeComments]: { + [Ts.includeComments]: { restricted: !0, type: ["boolean", "string"], - enum: [!0, !1, _o], + enum: [!0, !1, Ro], default: e.includeComments, description: p("unicodeHighlight.includeComments", "Controls whether characters in comments should also be subject to Unicode highlighting.") }, - [Ws.includeStrings]: { + [Ts.includeStrings]: { restricted: !0, type: ["boolean", "string"], - enum: [!0, !1, _o], + enum: [!0, !1, Ro], default: e.includeStrings, description: p("unicodeHighlight.includeStrings", "Controls whether characters in strings should also be subject to Unicode highlighting.") }, - [Ws.allowedCharacters]: { + [Ts.allowedCharacters]: { restricted: !0, type: "object", default: e.allowedCharacters, @@ -17327,7 +17327,7 @@ class eie extends jt { type: "boolean" } }, - [Ws.allowedLocales]: { + [Ts.allowedLocales]: { restricted: !0, type: "object", additionalProperties: { @@ -17340,20 +17340,20 @@ class eie extends jt { } applyUpdate(e, t) { let i = !1; - t.allowedCharacters && e && (co(e.allowedCharacters, t.allowedCharacters) || (e = { ...e, allowedCharacters: t.allowedCharacters }, i = !0)), t.allowedLocales && e && (co(e.allowedLocales, t.allowedLocales) || (e = { ...e, allowedLocales: t.allowedLocales }, i = !0)); + t.allowedCharacters && e && (uo(e.allowedCharacters, t.allowedCharacters) || (e = { ...e, allowedCharacters: t.allowedCharacters }, i = !0)), t.allowedLocales && e && (uo(e.allowedLocales, t.allowedLocales) || (e = { ...e, allowedLocales: t.allowedLocales }, i = !0)); const n = super.applyUpdate(e, t); - return i ? new Wy(n.newValue, !0) : n; + return i ? new Ff(n.newValue, !0) : n; } validate(e) { if (!e || typeof e != "object") return this.defaultValue; const t = e; return { - nonBasicASCII: Zf(t.nonBasicASCII, _o, [!0, !1, _o]), - invisibleCharacters: we(t.invisibleCharacters, this.defaultValue.invisibleCharacters), - ambiguousCharacters: we(t.ambiguousCharacters, this.defaultValue.ambiguousCharacters), - includeComments: Zf(t.includeComments, _o, [!0, !1, _o]), - includeStrings: Zf(t.includeStrings, _o, [!0, !1, _o]), + nonBasicASCII: Tg(t.nonBasicASCII, Ro, [!0, !1, Ro]), + invisibleCharacters: ye(t.invisibleCharacters, this.defaultValue.invisibleCharacters), + ambiguousCharacters: ye(t.ambiguousCharacters, this.defaultValue.ambiguousCharacters), + includeComments: Tg(t.includeComments, Ro, [!0, !1, Ro]), + includeStrings: Tg(t.includeStrings, Ro, [!0, !1, Ro]), allowedCharacters: this.validateBooleanMap(e.allowedCharacters, this.defaultValue.allowedCharacters), allowedLocales: this.validateBooleanMap(e.allowedLocales, this.defaultValue.allowedLocales) }; @@ -17367,7 +17367,7 @@ class eie extends jt { return i; } } -class tie extends jt { +class Bie extends jt { constructor() { const e = { enabled: !0, @@ -17411,16 +17411,16 @@ class tie extends jt { return this.defaultValue; const t = e; return { - enabled: we(t.enabled, this.defaultValue.enabled), - mode: hi(t.mode, this.defaultValue.mode, ["prefix", "subword", "subwordSmart"]), - showToolbar: hi(t.showToolbar, this.defaultValue.showToolbar, ["always", "onHover", "never"]), - suppressSuggestions: we(t.suppressSuggestions, this.defaultValue.suppressSuggestions), - keepOnBlur: we(t.keepOnBlur, this.defaultValue.keepOnBlur), - fontFamily: Kn.string(t.fontFamily, this.defaultValue.fontFamily) + enabled: ye(t.enabled, this.defaultValue.enabled), + mode: ui(t.mode, this.defaultValue.mode, ["prefix", "subword", "subwordSmart"]), + showToolbar: ui(t.showToolbar, this.defaultValue.showToolbar, ["always", "onHover", "never"]), + suppressSuggestions: ye(t.suppressSuggestions, this.defaultValue.suppressSuggestions), + keepOnBlur: ye(t.keepOnBlur, this.defaultValue.keepOnBlur), + fontFamily: jn.string(t.fontFamily, this.defaultValue.fontFamily) }; } } -class iie extends jt { +class _ie extends jt { constructor() { const e = { enabled: !1, @@ -17457,18 +17457,18 @@ class iie extends jt { return this.defaultValue; const t = e; return { - enabled: we(t.enabled, this.defaultValue.enabled), - showToolbar: hi(t.showToolbar, this.defaultValue.showToolbar, ["always", "onHover", "never"]), - fontFamily: Kn.string(t.fontFamily, this.defaultValue.fontFamily), - keepOnBlur: we(t.keepOnBlur, this.defaultValue.keepOnBlur) + enabled: ye(t.enabled, this.defaultValue.enabled), + showToolbar: ui(t.showToolbar, this.defaultValue.showToolbar, ["always", "onHover", "never"]), + fontFamily: jn.string(t.fontFamily, this.defaultValue.fontFamily), + keepOnBlur: ye(t.keepOnBlur, this.defaultValue.keepOnBlur) }; } } -class nie extends jt { +class Qie extends jt { constructor() { const e = { - enabled: Dn.bracketPairColorizationOptions.enabled, - independentColorPoolPerBracketType: Dn.bracketPairColorizationOptions.independentColorPoolPerBracketType + enabled: Yn.bracketPairColorizationOptions.enabled, + independentColorPoolPerBracketType: Yn.bracketPairColorizationOptions.independentColorPoolPerBracketType }; super(15, "bracketPairColorization", e, { "editor.bracketPairColorization.enabled": { @@ -17488,12 +17488,12 @@ class nie extends jt { return this.defaultValue; const t = e; return { - enabled: we(t.enabled, this.defaultValue.enabled), - independentColorPoolPerBracketType: we(t.independentColorPoolPerBracketType, this.defaultValue.independentColorPoolPerBracketType) + enabled: ye(t.enabled, this.defaultValue.enabled), + independentColorPoolPerBracketType: ye(t.independentColorPoolPerBracketType, this.defaultValue.independentColorPoolPerBracketType) }; } } -class sie extends jt { +class Oie extends jt { constructor() { const e = { bracketPairs: !1, @@ -17553,19 +17553,19 @@ class sie extends jt { return this.defaultValue; const t = e; return { - bracketPairs: Zf(t.bracketPairs, this.defaultValue.bracketPairs, [!0, !1, "active"]), - bracketPairsHorizontal: Zf(t.bracketPairsHorizontal, this.defaultValue.bracketPairsHorizontal, [!0, !1, "active"]), - highlightActiveBracketPair: we(t.highlightActiveBracketPair, this.defaultValue.highlightActiveBracketPair), - indentation: we(t.indentation, this.defaultValue.indentation), - highlightActiveIndentation: Zf(t.highlightActiveIndentation, this.defaultValue.highlightActiveIndentation, [!0, !1, "always"]) + bracketPairs: Tg(t.bracketPairs, this.defaultValue.bracketPairs, [!0, !1, "active"]), + bracketPairsHorizontal: Tg(t.bracketPairsHorizontal, this.defaultValue.bracketPairsHorizontal, [!0, !1, "active"]), + highlightActiveBracketPair: ye(t.highlightActiveBracketPair, this.defaultValue.highlightActiveBracketPair), + indentation: ye(t.indentation, this.defaultValue.indentation), + highlightActiveIndentation: Tg(t.highlightActiveIndentation, this.defaultValue.highlightActiveIndentation, [!0, !1, "always"]) }; } } -function Zf(s, e, t) { +function Tg(s, e, t) { const i = t.indexOf(s); return i === -1 ? e : t[i]; } -class oie extends jt { +class jie extends jt { constructor() { const e = { insertMode: "insert", @@ -17837,50 +17837,50 @@ class oie extends jt { return this.defaultValue; const t = e; return { - insertMode: hi(t.insertMode, this.defaultValue.insertMode, ["insert", "replace"]), - filterGraceful: we(t.filterGraceful, this.defaultValue.filterGraceful), - snippetsPreventQuickSuggestions: we(t.snippetsPreventQuickSuggestions, this.defaultValue.filterGraceful), - localityBonus: we(t.localityBonus, this.defaultValue.localityBonus), - shareSuggestSelections: we(t.shareSuggestSelections, this.defaultValue.shareSuggestSelections), - selectionMode: hi(t.selectionMode, this.defaultValue.selectionMode, ["always", "never", "whenQuickSuggestion", "whenTriggerCharacter"]), - showIcons: we(t.showIcons, this.defaultValue.showIcons), - showStatusBar: we(t.showStatusBar, this.defaultValue.showStatusBar), - preview: we(t.preview, this.defaultValue.preview), - previewMode: hi(t.previewMode, this.defaultValue.previewMode, ["prefix", "subword", "subwordSmart"]), - showInlineDetails: we(t.showInlineDetails, this.defaultValue.showInlineDetails), - showMethods: we(t.showMethods, this.defaultValue.showMethods), - showFunctions: we(t.showFunctions, this.defaultValue.showFunctions), - showConstructors: we(t.showConstructors, this.defaultValue.showConstructors), - showDeprecated: we(t.showDeprecated, this.defaultValue.showDeprecated), - matchOnWordStartOnly: we(t.matchOnWordStartOnly, this.defaultValue.matchOnWordStartOnly), - showFields: we(t.showFields, this.defaultValue.showFields), - showVariables: we(t.showVariables, this.defaultValue.showVariables), - showClasses: we(t.showClasses, this.defaultValue.showClasses), - showStructs: we(t.showStructs, this.defaultValue.showStructs), - showInterfaces: we(t.showInterfaces, this.defaultValue.showInterfaces), - showModules: we(t.showModules, this.defaultValue.showModules), - showProperties: we(t.showProperties, this.defaultValue.showProperties), - showEvents: we(t.showEvents, this.defaultValue.showEvents), - showOperators: we(t.showOperators, this.defaultValue.showOperators), - showUnits: we(t.showUnits, this.defaultValue.showUnits), - showValues: we(t.showValues, this.defaultValue.showValues), - showConstants: we(t.showConstants, this.defaultValue.showConstants), - showEnums: we(t.showEnums, this.defaultValue.showEnums), - showEnumMembers: we(t.showEnumMembers, this.defaultValue.showEnumMembers), - showKeywords: we(t.showKeywords, this.defaultValue.showKeywords), - showWords: we(t.showWords, this.defaultValue.showWords), - showColors: we(t.showColors, this.defaultValue.showColors), - showFiles: we(t.showFiles, this.defaultValue.showFiles), - showReferences: we(t.showReferences, this.defaultValue.showReferences), - showFolders: we(t.showFolders, this.defaultValue.showFolders), - showTypeParameters: we(t.showTypeParameters, this.defaultValue.showTypeParameters), - showSnippets: we(t.showSnippets, this.defaultValue.showSnippets), - showUsers: we(t.showUsers, this.defaultValue.showUsers), - showIssues: we(t.showIssues, this.defaultValue.showIssues) + insertMode: ui(t.insertMode, this.defaultValue.insertMode, ["insert", "replace"]), + filterGraceful: ye(t.filterGraceful, this.defaultValue.filterGraceful), + snippetsPreventQuickSuggestions: ye(t.snippetsPreventQuickSuggestions, this.defaultValue.filterGraceful), + localityBonus: ye(t.localityBonus, this.defaultValue.localityBonus), + shareSuggestSelections: ye(t.shareSuggestSelections, this.defaultValue.shareSuggestSelections), + selectionMode: ui(t.selectionMode, this.defaultValue.selectionMode, ["always", "never", "whenQuickSuggestion", "whenTriggerCharacter"]), + showIcons: ye(t.showIcons, this.defaultValue.showIcons), + showStatusBar: ye(t.showStatusBar, this.defaultValue.showStatusBar), + preview: ye(t.preview, this.defaultValue.preview), + previewMode: ui(t.previewMode, this.defaultValue.previewMode, ["prefix", "subword", "subwordSmart"]), + showInlineDetails: ye(t.showInlineDetails, this.defaultValue.showInlineDetails), + showMethods: ye(t.showMethods, this.defaultValue.showMethods), + showFunctions: ye(t.showFunctions, this.defaultValue.showFunctions), + showConstructors: ye(t.showConstructors, this.defaultValue.showConstructors), + showDeprecated: ye(t.showDeprecated, this.defaultValue.showDeprecated), + matchOnWordStartOnly: ye(t.matchOnWordStartOnly, this.defaultValue.matchOnWordStartOnly), + showFields: ye(t.showFields, this.defaultValue.showFields), + showVariables: ye(t.showVariables, this.defaultValue.showVariables), + showClasses: ye(t.showClasses, this.defaultValue.showClasses), + showStructs: ye(t.showStructs, this.defaultValue.showStructs), + showInterfaces: ye(t.showInterfaces, this.defaultValue.showInterfaces), + showModules: ye(t.showModules, this.defaultValue.showModules), + showProperties: ye(t.showProperties, this.defaultValue.showProperties), + showEvents: ye(t.showEvents, this.defaultValue.showEvents), + showOperators: ye(t.showOperators, this.defaultValue.showOperators), + showUnits: ye(t.showUnits, this.defaultValue.showUnits), + showValues: ye(t.showValues, this.defaultValue.showValues), + showConstants: ye(t.showConstants, this.defaultValue.showConstants), + showEnums: ye(t.showEnums, this.defaultValue.showEnums), + showEnumMembers: ye(t.showEnumMembers, this.defaultValue.showEnumMembers), + showKeywords: ye(t.showKeywords, this.defaultValue.showKeywords), + showWords: ye(t.showWords, this.defaultValue.showWords), + showColors: ye(t.showColors, this.defaultValue.showColors), + showFiles: ye(t.showFiles, this.defaultValue.showFiles), + showReferences: ye(t.showReferences, this.defaultValue.showReferences), + showFolders: ye(t.showFolders, this.defaultValue.showFolders), + showTypeParameters: ye(t.showTypeParameters, this.defaultValue.showTypeParameters), + showSnippets: ye(t.showSnippets, this.defaultValue.showSnippets), + showUsers: ye(t.showUsers, this.defaultValue.showUsers), + showIssues: ye(t.showIssues, this.defaultValue.showIssues) }; } } -class rie extends jt { +class qie extends jt { constructor() { super(114, "smartSelect", { selectLeadingAndTrailingWhitespace: !0, @@ -17900,12 +17900,12 @@ class rie extends jt { } validate(e) { return !e || typeof e != "object" ? this.defaultValue : { - selectLeadingAndTrailingWhitespace: we(e.selectLeadingAndTrailingWhitespace, this.defaultValue.selectLeadingAndTrailingWhitespace), - selectSubwords: we(e.selectSubwords, this.defaultValue.selectSubwords) + selectLeadingAndTrailingWhitespace: ye(e.selectLeadingAndTrailingWhitespace, this.defaultValue.selectLeadingAndTrailingWhitespace), + selectSubwords: ye(e.selectSubwords, this.defaultValue.selectSubwords) }; } } -class lie extends jt { +class $ie extends jt { constructor() { const e = []; super(131, "wordSegmenterLocales", e, { @@ -17938,7 +17938,7 @@ class lie extends jt { return this.defaultValue; } } -class aie extends jt { +class ene extends jt { constructor() { super(139, "wrappingIndent", 1, { "editor.wrappingIndent": { @@ -17975,7 +17975,7 @@ class aie extends jt { ) === 2 ? 0 : i; } } -class cie extends pC { +class tne extends CG { constructor() { super( 147 @@ -17995,7 +17995,7 @@ class cie extends pC { }; } } -class die extends jt { +class ine extends jt { constructor() { const e = { enabled: !0, showDropSelector: "afterDrop" }; super(36, "dropIntoEditor", e, { @@ -18024,12 +18024,12 @@ class die extends jt { return this.defaultValue; const t = e; return { - enabled: we(t.enabled, this.defaultValue.enabled), - showDropSelector: hi(t.showDropSelector, this.defaultValue.showDropSelector, ["afterDrop", "never"]) + enabled: ye(t.enabled, this.defaultValue.enabled), + showDropSelector: ui(t.showDropSelector, this.defaultValue.showDropSelector, ["afterDrop", "never"]) }; } } -class hie extends jt { +class nne extends jt { constructor() { const e = { enabled: !0, showPasteSelector: "afterPaste" }; super(85, "pasteAs", e, { @@ -18058,24 +18058,24 @@ class hie extends jt { return this.defaultValue; const t = e; return { - enabled: we(t.enabled, this.defaultValue.enabled), - showPasteSelector: hi(t.showPasteSelector, this.defaultValue.showPasteSelector, ["afterPaste", "never"]) + enabled: ye(t.enabled, this.defaultValue.enabled), + showPasteSelector: ui(t.showPasteSelector, this.defaultValue.showPasteSelector, ["afterPaste", "never"]) }; } } -const uie = "Consolas, 'Courier New', monospace", gie = "Menlo, Monaco, 'Courier New', monospace", mie = "'Droid Sans Mono', 'monospace', monospace", ps = { - fontFamily: qe ? gie : fs ? mie : uie, +const sne = "Consolas, 'Courier New', monospace", one = "Menlo, Monaco, 'Courier New', monospace", lne = "'Droid Sans Mono', 'monospace', monospace", Zs = { + fontFamily: qe ? one : fs ? lne : sne, fontWeight: "normal", fontSize: qe ? 12 : 14, lineHeight: 0, letterSpacing: 0 -}, kp = []; +}, Fp = []; function ne(s) { - return kp[s.id] = s, s; + return Fp[s.id] = s, s; } -const El = { - acceptSuggestionOnCommitCharacter: ne(new ct(0, "acceptSuggestionOnCommitCharacter", !0, { markdownDescription: p("acceptSuggestionOnCommitCharacter", "Controls whether suggestions should be accepted on commit characters. For example, in JavaScript, the semi-colon (`;`) can be a commit character that accepts a suggestion and types that character.") })), - acceptSuggestionOnEnter: ne(new di(1, "acceptSuggestionOnEnter", "on", ["on", "smart", "off"], { +const zr = { + acceptSuggestionOnCommitCharacter: ne(new dt(0, "acceptSuggestionOnCommitCharacter", !0, { markdownDescription: p("acceptSuggestionOnCommitCharacter", "Controls whether suggestions should be accepted on commit characters. For example, in JavaScript, the semi-colon (`;`) can be a commit character that accepts a suggestion and types that character.") })), + acceptSuggestionOnEnter: ne(new hi(1, "acceptSuggestionOnEnter", "on", ["on", "smart", "off"], { markdownEnumDescriptions: [ "", p("acceptSuggestionOnEnterSmart", "Only accept a suggestion with `Enter` when it makes a textual change."), @@ -18083,18 +18083,18 @@ const El = { ], markdownDescription: p("acceptSuggestionOnEnter", "Controls whether suggestions should be accepted on `Enter`, in addition to `Tab`. Helps to avoid ambiguity between inserting new lines or accepting suggestions.") })), - accessibilitySupport: ne(new Zte()), - accessibilityPageSize: ne(new Dt(3, "accessibilityPageSize", 10, 1, 1073741824, { + accessibilitySupport: ne(new fie()), + accessibilityPageSize: ne(new Mt(3, "accessibilityPageSize", 10, 1, 1073741824, { description: p("accessibilityPageSize", "Controls the number of lines in the editor that can be read out by a screen reader at once. When we detect a screen reader we automatically set the default to be 500. Warning: this has a performance implication for numbers larger than the default."), tags: ["accessibility"] })), - ariaLabel: ne(new Kn(4, "ariaLabel", p("editorViewAccessibleLabel", "Editor content"))), - ariaRequired: ne(new ct(5, "ariaRequired", !1, void 0)), - screenReaderAnnounceInlineSuggestion: ne(new ct(8, "screenReaderAnnounceInlineSuggestion", !0, { + ariaLabel: ne(new jn(4, "ariaLabel", p("editorViewAccessibleLabel", "Editor content"))), + ariaRequired: ne(new dt(5, "ariaRequired", !1, void 0)), + screenReaderAnnounceInlineSuggestion: ne(new dt(8, "screenReaderAnnounceInlineSuggestion", !0, { description: p("screenReaderAnnounceInlineSuggestion", "Control whether inline suggestions are announced by a screen reader."), tags: ["accessibility"] })), - autoClosingBrackets: ne(new di(6, "autoClosingBrackets", "languageDefined", ["always", "languageDefined", "beforeWhitespace", "never"], { + autoClosingBrackets: ne(new hi(6, "autoClosingBrackets", "languageDefined", ["always", "languageDefined", "beforeWhitespace", "never"], { enumDescriptions: [ "", p("editor.autoClosingBrackets.languageDefined", "Use language configurations to determine when to autoclose brackets."), @@ -18103,7 +18103,7 @@ const El = { ], description: p("autoClosingBrackets", "Controls whether the editor should automatically close brackets after the user adds an opening bracket.") })), - autoClosingComments: ne(new di(7, "autoClosingComments", "languageDefined", ["always", "languageDefined", "beforeWhitespace", "never"], { + autoClosingComments: ne(new hi(7, "autoClosingComments", "languageDefined", ["always", "languageDefined", "beforeWhitespace", "never"], { enumDescriptions: [ "", p("editor.autoClosingComments.languageDefined", "Use language configurations to determine when to autoclose comments."), @@ -18112,7 +18112,7 @@ const El = { ], description: p("autoClosingComments", "Controls whether the editor should automatically close comments after the user adds an opening comment.") })), - autoClosingDelete: ne(new di(9, "autoClosingDelete", "auto", ["always", "auto", "never"], { + autoClosingDelete: ne(new hi(9, "autoClosingDelete", "auto", ["always", "auto", "never"], { enumDescriptions: [ "", p("editor.autoClosingDelete.auto", "Remove adjacent closing quotes or brackets only if they were automatically inserted."), @@ -18120,7 +18120,7 @@ const El = { ], description: p("autoClosingDelete", "Controls whether the editor should remove adjacent closing quotes or brackets when deleting.") })), - autoClosingOvertype: ne(new di(10, "autoClosingOvertype", "auto", ["always", "auto", "never"], { + autoClosingOvertype: ne(new hi(10, "autoClosingOvertype", "auto", ["always", "auto", "never"], { enumDescriptions: [ "", p("editor.autoClosingOvertype.auto", "Type over closing quotes or brackets only if they were automatically inserted."), @@ -18128,7 +18128,7 @@ const El = { ], description: p("autoClosingOvertype", "Controls whether the editor should type over closing quotes or brackets.") })), - autoClosingQuotes: ne(new di(11, "autoClosingQuotes", "languageDefined", ["always", "languageDefined", "beforeWhitespace", "never"], { + autoClosingQuotes: ne(new hi(11, "autoClosingQuotes", "languageDefined", ["always", "languageDefined", "beforeWhitespace", "never"], { enumDescriptions: [ "", p("editor.autoClosingQuotes.languageDefined", "Use language configurations to determine when to autoclose quotes."), @@ -18137,7 +18137,7 @@ const El = { ], description: p("autoClosingQuotes", "Controls whether the editor should automatically close quotes after the user adds an opening quote.") })), - autoIndent: ne(new sS(12, "autoIndent", 4, "full", ["none", "keep", "brackets", "advanced", "full"], Mte, { + autoIndent: ne(new Z1(12, "autoIndent", 4, "full", ["none", "keep", "brackets", "advanced", "full"], Zie, { enumDescriptions: [ p("editor.autoIndent.none", "The editor will not insert indentation automatically."), p("editor.autoIndent.keep", "The editor will keep the current line's indentation."), @@ -18147,8 +18147,8 @@ const El = { ], description: p("autoIndent", "Controls whether the editor should automatically adjust the indentation when users type, paste, move or indent lines.") })), - automaticLayout: ne(new ct(13, "automaticLayout", !1)), - autoSurround: ne(new di(14, "autoSurround", "languageDefined", ["languageDefined", "quotes", "brackets", "never"], { + automaticLayout: ne(new dt(13, "automaticLayout", !1)), + autoSurround: ne(new hi(14, "autoSurround", "languageDefined", ["languageDefined", "quotes", "brackets", "never"], { enumDescriptions: [ p("editor.autoSurround.languageDefined", "Use language configurations to determine when to automatically surround selections."), p("editor.autoSurround.quotes", "Surround with quotes but not brackets."), @@ -18157,20 +18157,20 @@ const El = { ], description: p("autoSurround", "Controls whether the editor should automatically surround selections when typing quotes or brackets.") })), - bracketPairColorization: ne(new nie()), - bracketPairGuides: ne(new sie()), - stickyTabStops: ne(new ct(117, "stickyTabStops", !1, { description: p("stickyTabStops", "Emulate selection behavior of tab characters when using spaces for indentation. Selection will stick to tab stops.") })), - codeLens: ne(new ct(17, "codeLens", !0, { description: p("codeLens", "Controls whether the editor shows CodeLens.") })), - codeLensFontFamily: ne(new Kn(18, "codeLensFontFamily", "", { description: p("codeLensFontFamily", "Controls the font family for CodeLens.") })), - codeLensFontSize: ne(new Dt(19, "codeLensFontSize", 0, 0, 100, { + bracketPairColorization: ne(new Qie()), + bracketPairGuides: ne(new Oie()), + stickyTabStops: ne(new dt(117, "stickyTabStops", !1, { description: p("stickyTabStops", "Emulate selection behavior of tab characters when using spaces for indentation. Selection will stick to tab stops.") })), + codeLens: ne(new dt(17, "codeLens", !0, { description: p("codeLens", "Controls whether the editor shows CodeLens.") })), + codeLensFontFamily: ne(new jn(18, "codeLensFontFamily", "", { description: p("codeLensFontFamily", "Controls the font family for CodeLens.") })), + codeLensFontSize: ne(new Mt(19, "codeLensFontSize", 0, 0, 100, { type: "number", default: 0, minimum: 0, maximum: 100, markdownDescription: p("codeLensFontSize", "Controls the font size in pixels for CodeLens. When set to 0, 90% of `#editor.fontSize#` is used.") })), - colorDecorators: ne(new ct(20, "colorDecorators", !0, { description: p("colorDecorators", "Controls whether the editor should render the inline color decorators and color picker.") })), - colorDecoratorActivatedOn: ne(new di(149, "colorDecoratorsActivatedOn", "clickAndHover", ["clickAndHover", "hover", "click"], { + colorDecorators: ne(new dt(20, "colorDecorators", !0, { description: p("colorDecorators", "Controls whether the editor should render the inline color decorators and color picker.") })), + colorDecoratorActivatedOn: ne(new hi(149, "colorDecoratorsActivatedOn", "clickAndHover", ["clickAndHover", "hover", "click"], { enumDescriptions: [ p("editor.colorDecoratorActivatedOn.clickAndHover", "Make the color picker appear both on click and hover of the color decorator"), p("editor.colorDecoratorActivatedOn.hover", "Make the color picker appear on hover of the color decorator"), @@ -18178,15 +18178,15 @@ const El = { ], description: p("colorDecoratorActivatedOn", "Controls the condition to make a color picker appear from a color decorator") })), - colorDecoratorsLimit: ne(new Dt(21, "colorDecoratorsLimit", 500, 1, 1e6, { + colorDecoratorsLimit: ne(new Mt(21, "colorDecoratorsLimit", 500, 1, 1e6, { markdownDescription: p("colorDecoratorsLimit", "Controls the max number of color decorators that can be rendered in an editor at once.") })), - columnSelection: ne(new ct(22, "columnSelection", !1, { description: p("columnSelection", "Enable that the selection with the mouse and keys is doing column selection.") })), - comments: ne(new _te()), - contextmenu: ne(new ct(24, "contextmenu", !0)), - copyWithSyntaxHighlighting: ne(new ct(25, "copyWithSyntaxHighlighting", !0, { description: p("copyWithSyntaxHighlighting", "Controls whether syntax highlighting should be copied into the clipboard.") })), - cursorBlinking: ne(new sS(26, "cursorBlinking", 1, "blink", ["blink", "smooth", "phase", "expand", "solid"], Ite, { description: p("cursorBlinking", "Control the cursor animation style.") })), - cursorSmoothCaretAnimation: ne(new di(27, "cursorSmoothCaretAnimation", "off", ["off", "explicit", "on"], { + columnSelection: ne(new dt(22, "columnSelection", !1, { description: p("columnSelection", "Enable that the selection with the mouse and keys is doing column selection.") })), + comments: ne(new yie()), + contextmenu: ne(new dt(24, "contextmenu", !0)), + copyWithSyntaxHighlighting: ne(new dt(25, "copyWithSyntaxHighlighting", !0, { description: p("copyWithSyntaxHighlighting", "Controls whether syntax highlighting should be copied into the clipboard.") })), + cursorBlinking: ne(new Z1(26, "cursorBlinking", 1, "blink", ["blink", "smooth", "phase", "expand", "solid"], Wie, { description: p("cursorBlinking", "Control the cursor animation style.") })), + cursorSmoothCaretAnimation: ne(new hi(27, "cursorSmoothCaretAnimation", "off", ["off", "explicit", "on"], { enumDescriptions: [ p("cursorSmoothCaretAnimation.off", "Smooth caret animation is disabled."), p("cursorSmoothCaretAnimation.explicit", "Smooth caret animation is enabled only when the user moves the cursor with an explicit gesture."), @@ -18194,24 +18194,24 @@ const El = { ], description: p("cursorSmoothCaretAnimation", "Controls whether the smooth caret animation should be enabled.") })), - cursorStyle: ne(new sS(28, "cursorStyle", hn.Line, "line", ["line", "block", "underline", "line-thin", "block-outline", "underline-thin"], Nte, { description: p("cursorStyle", "Controls the cursor style.") })), - cursorSurroundingLines: ne(new Dt(29, "cursorSurroundingLines", 0, 0, 1073741824, { description: p("cursorSurroundingLines", "Controls the minimal number of visible leading lines (minimum 0) and trailing lines (minimum 1) surrounding the cursor. Known as 'scrollOff' or 'scrollOffset' in some other editors.") })), - cursorSurroundingLinesStyle: ne(new di(30, "cursorSurroundingLinesStyle", "default", ["default", "all"], { + cursorStyle: ne(new Z1(28, "cursorStyle", un.Line, "line", ["line", "block", "underline", "line-thin", "block-outline", "underline-thin"], Gie, { description: p("cursorStyle", "Controls the cursor style.") })), + cursorSurroundingLines: ne(new Mt(29, "cursorSurroundingLines", 0, 0, 1073741824, { description: p("cursorSurroundingLines", "Controls the minimal number of visible leading lines (minimum 0) and trailing lines (minimum 1) surrounding the cursor. Known as 'scrollOff' or 'scrollOffset' in some other editors.") })), + cursorSurroundingLinesStyle: ne(new hi(30, "cursorSurroundingLinesStyle", "default", ["default", "all"], { enumDescriptions: [ p("cursorSurroundingLinesStyle.default", "`cursorSurroundingLines` is enforced only when triggered via the keyboard or API."), p("cursorSurroundingLinesStyle.all", "`cursorSurroundingLines` is enforced always.") ], markdownDescription: p("cursorSurroundingLinesStyle", "Controls when `#editor.cursorSurroundingLines#` should be enforced.") })), - cursorWidth: ne(new Dt(31, "cursorWidth", 0, 0, 1073741824, { markdownDescription: p("cursorWidth", "Controls the width of the cursor when `#editor.cursorStyle#` is set to `line`.") })), - disableLayerHinting: ne(new ct(32, "disableLayerHinting", !1)), - disableMonospaceOptimizations: ne(new ct(33, "disableMonospaceOptimizations", !1)), - domReadOnly: ne(new ct(34, "domReadOnly", !1)), - dragAndDrop: ne(new ct(35, "dragAndDrop", !0, { description: p("dragAndDrop", "Controls whether the editor should allow moving selections via drag and drop.") })), - emptySelectionClipboard: ne(new vte()), - dropIntoEditor: ne(new die()), - stickyScroll: ne(new Xte()), - experimentalWhitespaceRendering: ne(new di(38, "experimentalWhitespaceRendering", "svg", ["svg", "font", "off"], { + cursorWidth: ne(new Mt(31, "cursorWidth", 0, 0, 1073741824, { markdownDescription: p("cursorWidth", "Controls the width of the cursor when `#editor.cursorStyle#` is set to `line`.") })), + disableLayerHinting: ne(new dt(32, "disableLayerHinting", !1)), + disableMonospaceOptimizations: ne(new dt(33, "disableMonospaceOptimizations", !1)), + domReadOnly: ne(new dt(34, "domReadOnly", !1)), + dragAndDrop: ne(new dt(35, "dragAndDrop", !0, { description: p("dragAndDrop", "Controls whether the editor should allow moving selections via drag and drop.") })), + emptySelectionClipboard: ne(new Vie()), + dropIntoEditor: ne(new ine()), + stickyScroll: ne(new wie()), + experimentalWhitespaceRendering: ne(new hi(38, "experimentalWhitespaceRendering", "svg", ["svg", "font", "off"], { enumDescriptions: [ p("experimentalWhitespaceRendering.svg", "Use a new rendering method with svgs."), p("experimentalWhitespaceRendering.font", "Use a new rendering method with font characters."), @@ -18219,21 +18219,21 @@ const El = { ], description: p("experimentalWhitespaceRendering", "Controls whether whitespace is rendered with a new, experimental method.") })), - extraEditorClassName: ne(new Kn(39, "extraEditorClassName", "")), - fastScrollSensitivity: ne(new Eo(40, "fastScrollSensitivity", 5, (s) => s <= 0 ? 5 : s, { markdownDescription: p("fastScrollSensitivity", "Scrolling speed multiplier when pressing `Alt`.") })), - find: ne(new Tte()), - fixedOverflowWidgets: ne(new ct(42, "fixedOverflowWidgets", !1)), - folding: ne(new ct(43, "folding", !0, { description: p("folding", "Controls whether the editor has code folding enabled.") })), - foldingStrategy: ne(new di(44, "foldingStrategy", "auto", ["auto", "indentation"], { + extraEditorClassName: ne(new jn(39, "extraEditorClassName", "")), + fastScrollSensitivity: ne(new Do(40, "fastScrollSensitivity", 5, (s) => s <= 0 ? 5 : s, { markdownDescription: p("fastScrollSensitivity", "Scrolling speed multiplier when pressing `Alt`.") })), + find: ne(new Lie()), + fixedOverflowWidgets: ne(new dt(42, "fixedOverflowWidgets", !1)), + folding: ne(new dt(43, "folding", !0, { description: p("folding", "Controls whether the editor has code folding enabled.") })), + foldingStrategy: ne(new hi(44, "foldingStrategy", "auto", ["auto", "indentation"], { enumDescriptions: [ p("foldingStrategy.auto", "Use a language-specific folding strategy if available, else the indentation-based one."), p("foldingStrategy.indentation", "Use the indentation-based folding strategy.") ], description: p("foldingStrategy", "Controls the strategy for computing folding ranges.") })), - foldingHighlight: ne(new ct(45, "foldingHighlight", !0, { description: p("foldingHighlight", "Controls whether the editor should highlight folded ranges.") })), - foldingImportsByDefault: ne(new ct(46, "foldingImportsByDefault", !1, { description: p("foldingImportsByDefault", "Controls whether the editor automatically collapses import ranges.") })), - foldingMaximumRegions: ne(new Dt( + foldingHighlight: ne(new dt(45, "foldingHighlight", !0, { description: p("foldingHighlight", "Controls whether the editor should highlight folded ranges.") })), + foldingImportsByDefault: ne(new dt(46, "foldingImportsByDefault", !1, { description: p("foldingImportsByDefault", "Controls whether the editor automatically collapses import ranges.") })), + foldingMaximumRegions: ne(new Mt( 47, "foldingMaximumRegions", 5e3, @@ -18242,37 +18242,37 @@ const El = { // limit must be less than foldingRanges MAX_FOLDING_REGIONS { description: p("foldingMaximumRegions", "The maximum number of foldable regions. Increasing this value may result in the editor becoming less responsive when the current source has a large number of foldable regions.") } )), - unfoldOnClickAfterEndOfLine: ne(new ct(48, "unfoldOnClickAfterEndOfLine", !1, { description: p("unfoldOnClickAfterEndOfLine", "Controls whether clicking on the empty content after a folded line will unfold the line.") })), - fontFamily: ne(new Kn(49, "fontFamily", ps.fontFamily, { description: p("fontFamily", "Controls the font family.") })), - fontInfo: ne(new Dte()), - fontLigatures2: ne(new Dh()), - fontSize: ne(new Vte()), - fontWeight: ne(new K2()), - fontVariations: ne(new Yw()), - formatOnPaste: ne(new ct(55, "formatOnPaste", !1, { description: p("formatOnPaste", "Controls whether the editor should automatically format the pasted content. A formatter must be available and the formatter should be able to format a range in a document.") })), - formatOnType: ne(new ct(56, "formatOnType", !1, { description: p("formatOnType", "Controls whether the editor should automatically format the line after typing.") })), - glyphMargin: ne(new ct(57, "glyphMargin", !0, { description: p("glyphMargin", "Controls whether the editor should render the vertical glyph margin. Glyph margin is mostly used for debugging.") })), - gotoLocation: ne(new kte()), - hideCursorInOverviewRuler: ne(new ct(59, "hideCursorInOverviewRuler", !1, { description: p("hideCursorInOverviewRuler", "Controls whether the cursor should be hidden in the overview ruler.") })), - hover: ne(new Gte()), - inDiffEditor: ne(new ct(61, "inDiffEditor", !1)), - letterSpacing: ne(new Eo(64, "letterSpacing", ps.letterSpacing, (s) => Eo.clamp(s, -5, 20), { description: p("letterSpacing", "Controls the letter spacing in pixels.") })), - lightbulb: ne(new Ete()), - lineDecorationsWidth: ne(new Yte()), - lineHeight: ne(new zte()), - lineNumbers: ne(new Qte()), - lineNumbersMinChars: ne(new Dt(69, "lineNumbersMinChars", 5, 1, 300)), - linkedEditing: ne(new ct(70, "linkedEditing", !1, { description: p("linkedEditing", "Controls whether the editor has linked editing enabled. Depending on the language, related symbols such as HTML tags, are updated while editing.") })), - links: ne(new ct(71, "links", !0, { description: p("links", "Controls whether the editor should detect links and make them clickable.") })), - matchBrackets: ne(new di(72, "matchBrackets", "always", ["always", "near", "never"], { description: p("matchBrackets", "Highlight matching brackets.") })), - minimap: ne(new Pte()), - mouseStyle: ne(new di(74, "mouseStyle", "text", ["text", "default", "copy"])), - mouseWheelScrollSensitivity: ne(new Eo(75, "mouseWheelScrollSensitivity", 1, (s) => s === 0 ? 1 : s, { markdownDescription: p("mouseWheelScrollSensitivity", "A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.") })), - mouseWheelZoom: ne(new ct(76, "mouseWheelZoom", !1, { + unfoldOnClickAfterEndOfLine: ne(new dt(48, "unfoldOnClickAfterEndOfLine", !1, { description: p("unfoldOnClickAfterEndOfLine", "Controls whether clicking on the empty content after a folded line will unfold the line.") })), + fontFamily: ne(new jn(49, "fontFamily", Zs.fontFamily, { description: p("fontFamily", "Controls the font family.") })), + fontInfo: ne(new Iie()), + fontLigatures2: ne(new Jh()), + fontSize: ne(new Sie()), + fontWeight: ne(new gw()), + fontVariations: ne(new $y()), + formatOnPaste: ne(new dt(55, "formatOnPaste", !1, { description: p("formatOnPaste", "Controls whether the editor should automatically format the pasted content. A formatter must be available and the formatter should be able to format a range in a document.") })), + formatOnType: ne(new dt(56, "formatOnType", !1, { description: p("formatOnType", "Controls whether the editor should automatically format the line after typing.") })), + glyphMargin: ne(new dt(57, "glyphMargin", !0, { description: p("glyphMargin", "Controls whether the editor should render the vertical glyph margin. Glyph margin is mostly used for debugging.") })), + gotoLocation: ne(new xie()), + hideCursorInOverviewRuler: ne(new dt(59, "hideCursorInOverviewRuler", !1, { description: p("hideCursorInOverviewRuler", "Controls whether the cursor should be hidden in the overview ruler.") })), + hover: ne(new Cie()), + inDiffEditor: ne(new dt(61, "inDiffEditor", !1)), + letterSpacing: ne(new Do(64, "letterSpacing", Zs.letterSpacing, (s) => Do.clamp(s, -5, 20), { description: p("letterSpacing", "Controls the letter spacing in pixels.") })), + lightbulb: ne(new Nie()), + lineDecorationsWidth: ne(new Mie()), + lineHeight: ne(new Yie()), + lineNumbers: ne(new zie()), + lineNumbersMinChars: ne(new Mt(69, "lineNumbersMinChars", 5, 1, 300)), + linkedEditing: ne(new dt(70, "linkedEditing", !1, { description: p("linkedEditing", "Controls whether the editor has linked editing enabled. Depending on the language, related symbols such as HTML tags, are updated while editing.") })), + links: ne(new dt(71, "links", !0, { description: p("links", "Controls whether the editor should detect links and make them clickable.") })), + matchBrackets: ne(new hi(72, "matchBrackets", "always", ["always", "near", "never"], { description: p("matchBrackets", "Highlight matching brackets.") })), + minimap: ne(new kie()), + mouseStyle: ne(new hi(74, "mouseStyle", "text", ["text", "default", "copy"])), + mouseWheelScrollSensitivity: ne(new Do(75, "mouseWheelScrollSensitivity", 1, (s) => s === 0 ? 1 : s, { markdownDescription: p("mouseWheelScrollSensitivity", "A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.") })), + mouseWheelZoom: ne(new dt(76, "mouseWheelZoom", !1, { markdownDescription: qe ? p("mouseWheelZoom.mac", "Zoom the font of the editor when using mouse wheel and holding `Cmd`.") : p("mouseWheelZoom", "Zoom the font of the editor when using mouse wheel and holding `Ctrl`.") })), - multiCursorMergeOverlapping: ne(new ct(77, "multiCursorMergeOverlapping", !0, { description: p("multiCursorMergeOverlapping", "Merge multiple cursors when they are overlapping.") })), - multiCursorModifier: ne(new sS(78, "multiCursorModifier", "altKey", "alt", ["ctrlCmd", "alt"], Bte, { + multiCursorMergeOverlapping: ne(new dt(77, "multiCursorMergeOverlapping", !0, { description: p("multiCursorMergeOverlapping", "Merge multiple cursors when they are overlapping.") })), + multiCursorModifier: ne(new Z1(78, "multiCursorModifier", "altKey", "alt", ["ctrlCmd", "alt"], vie, { markdownEnumDescriptions: [ p("multiCursorModifier.ctrlCmd", "Maps to `Control` on Windows and Linux and to `Command` on macOS."), p("multiCursorModifier.alt", "Maps to `Alt` on Windows and Linux and to `Option` on macOS.") @@ -18285,17 +18285,17 @@ const El = { ] }, "The modifier to be used to add multiple cursors with the mouse. The Go to Definition and Open Link mouse gestures will adapt such that they do not conflict with the [multicursor modifier](https://code.visualstudio.com/docs/editor/codebasics#_multicursor-modifier).") })), - multiCursorPaste: ne(new di(79, "multiCursorPaste", "spread", ["spread", "full"], { + multiCursorPaste: ne(new hi(79, "multiCursorPaste", "spread", ["spread", "full"], { markdownEnumDescriptions: [ p("multiCursorPaste.spread", "Each cursor pastes a single line of the text."), p("multiCursorPaste.full", "Each cursor pastes the full text.") ], markdownDescription: p("multiCursorPaste", "Controls pasting when the line count of the pasted text matches the cursor count.") })), - multiCursorLimit: ne(new Dt(80, "multiCursorLimit", 1e4, 1, 1e5, { + multiCursorLimit: ne(new Mt(80, "multiCursorLimit", 1e4, 1, 1e5, { markdownDescription: p("multiCursorLimit", "Controls the max number of cursors that can be in an active editor at once.") })), - occurrencesHighlight: ne(new di(81, "occurrencesHighlight", "singleFile", ["off", "singleFile", "multiFile"], { + occurrencesHighlight: ne(new hi(81, "occurrencesHighlight", "singleFile", ["off", "singleFile", "multiFile"], { markdownEnumDescriptions: [ p("occurrencesHighlight.off", "Does not highlight occurrences."), p("occurrencesHighlight.singleFile", "Highlights occurrences only in the current file."), @@ -18303,28 +18303,28 @@ const El = { ], markdownDescription: p("occurrencesHighlight", "Controls whether occurrences should be highlighted across open files.") })), - overviewRulerBorder: ne(new ct(82, "overviewRulerBorder", !0, { description: p("overviewRulerBorder", "Controls whether a border should be drawn around the overview ruler.") })), - overviewRulerLanes: ne(new Dt(83, "overviewRulerLanes", 3, 0, 3)), - padding: ne(new Ote()), - pasteAs: ne(new hie()), - parameterHints: ne(new Hte()), - peekWidgetDefaultFocus: ne(new di(87, "peekWidgetDefaultFocus", "tree", ["tree", "editor"], { + overviewRulerBorder: ne(new dt(82, "overviewRulerBorder", !0, { description: p("overviewRulerBorder", "Controls whether a border should be drawn around the overview ruler.") })), + overviewRulerLanes: ne(new Mt(83, "overviewRulerLanes", 3, 0, 3)), + padding: ne(new Jie()), + pasteAs: ne(new nne()), + parameterHints: ne(new Hie()), + peekWidgetDefaultFocus: ne(new hi(87, "peekWidgetDefaultFocus", "tree", ["tree", "editor"], { enumDescriptions: [ p("peekWidgetDefaultFocus.tree", "Focus the tree when opening peek"), p("peekWidgetDefaultFocus.editor", "Focus the editor when opening peek") ], description: p("peekWidgetDefaultFocus", "Controls whether to focus the inline editor or the tree in the peek widget.") })), - placeholder: ne(new Ute()), - definitionLinkOpensInPeek: ne(new ct(89, "definitionLinkOpensInPeek", !1, { description: p("definitionLinkOpensInPeek", "Controls whether the Go to Definition mouse gesture always opens the peek widget.") })), - quickSuggestions: ne(new Kte()), - quickSuggestionsDelay: ne(new Dt(91, "quickSuggestionsDelay", 10, 0, 1073741824, { description: p("quickSuggestionsDelay", "Controls the delay in milliseconds after which quick suggestions will show up.") })), - readOnly: ne(new ct(92, "readOnly", !1)), - readOnlyMessage: ne(new qte()), - renameOnType: ne(new ct(94, "renameOnType", !1, { description: p("renameOnType", "Controls whether the editor auto renames on type."), markdownDeprecationMessage: p("renameOnTypeDeprecate", "Deprecated, use `editor.linkedEditing` instead.") })), - renderControlCharacters: ne(new ct(95, "renderControlCharacters", !0, { description: p("renderControlCharacters", "Controls whether the editor should render control characters."), restricted: !0 })), - renderFinalNewline: ne(new di(96, "renderFinalNewline", fs ? "dimmed" : "on", ["off", "on", "dimmed"], { description: p("renderFinalNewline", "Render last line number when the file ends with a newline.") })), - renderLineHighlight: ne(new di(97, "renderLineHighlight", "line", ["none", "gutter", "line", "all"], { + placeholder: ne(new Die()), + definitionLinkOpensInPeek: ne(new dt(89, "definitionLinkOpensInPeek", !1, { description: p("definitionLinkOpensInPeek", "Controls whether the Go to Definition mouse gesture always opens the peek widget.") })), + quickSuggestions: ne(new Fie()), + quickSuggestionsDelay: ne(new Mt(91, "quickSuggestionsDelay", 10, 0, 1073741824, { description: p("quickSuggestionsDelay", "Controls the delay in milliseconds after which quick suggestions will show up.") })), + readOnly: ne(new dt(92, "readOnly", !1)), + readOnlyMessage: ne(new Kie()), + renameOnType: ne(new dt(94, "renameOnType", !1, { description: p("renameOnType", "Controls whether the editor auto renames on type."), markdownDeprecationMessage: p("renameOnTypeDeprecate", "Deprecated, use `editor.linkedEditing` instead.") })), + renderControlCharacters: ne(new dt(95, "renderControlCharacters", !0, { description: p("renderControlCharacters", "Controls whether the editor should render control characters."), restricted: !0 })), + renderFinalNewline: ne(new hi(96, "renderFinalNewline", fs ? "dimmed" : "on", ["off", "on", "dimmed"], { description: p("renderFinalNewline", "Render last line number when the file ends with a newline.") })), + renderLineHighlight: ne(new hi(97, "renderLineHighlight", "line", ["none", "gutter", "line", "all"], { enumDescriptions: [ "", "", @@ -18333,9 +18333,9 @@ const El = { ], description: p("renderLineHighlight", "Controls how the editor should render the current line highlight.") })), - renderLineHighlightOnlyWhenFocus: ne(new ct(98, "renderLineHighlightOnlyWhenFocus", !1, { description: p("renderLineHighlightOnlyWhenFocus", "Controls if the editor should render the current line highlight only when the editor is focused.") })), - renderValidationDecorations: ne(new di(99, "renderValidationDecorations", "editable", ["editable", "on", "off"])), - renderWhitespace: ne(new di(100, "renderWhitespace", "selection", ["none", "boundary", "selection", "trailing", "all"], { + renderLineHighlightOnlyWhenFocus: ne(new dt(98, "renderLineHighlightOnlyWhenFocus", !1, { description: p("renderLineHighlightOnlyWhenFocus", "Controls if the editor should render the current line highlight only when the editor is focused.") })), + renderValidationDecorations: ne(new hi(99, "renderValidationDecorations", "editable", ["editable", "on", "off"])), + renderWhitespace: ne(new hi(100, "renderWhitespace", "selection", ["none", "boundary", "selection", "trailing", "all"], { enumDescriptions: [ "", p("renderWhitespace.boundary", "Render whitespace characters except for single spaces between words."), @@ -18345,20 +18345,20 @@ const El = { ], description: p("renderWhitespace", "Controls how the editor should render whitespace characters.") })), - revealHorizontalRightPadding: ne(new Dt(101, "revealHorizontalRightPadding", 15, 0, 1e3)), - roundedSelection: ne(new ct(102, "roundedSelection", !0, { description: p("roundedSelection", "Controls whether selections should have rounded corners.") })), - rulers: ne(new jte()), - scrollbar: ne(new $te()), - scrollBeyondLastColumn: ne(new Dt(105, "scrollBeyondLastColumn", 4, 0, 1073741824, { description: p("scrollBeyondLastColumn", "Controls the number of extra characters beyond which the editor will scroll horizontally.") })), - scrollBeyondLastLine: ne(new ct(106, "scrollBeyondLastLine", !0, { description: p("scrollBeyondLastLine", "Controls whether the editor will scroll beyond the last line.") })), - scrollPredominantAxis: ne(new ct(107, "scrollPredominantAxis", !0, { description: p("scrollPredominantAxis", "Scroll only along the predominant axis when scrolling both vertically and horizontally at the same time. Prevents horizontal drift when scrolling vertically on a trackpad.") })), - selectionClipboard: ne(new ct(108, "selectionClipboard", !0, { + revealHorizontalRightPadding: ne(new Mt(101, "revealHorizontalRightPadding", 15, 0, 1e3)), + roundedSelection: ne(new dt(102, "roundedSelection", !0, { description: p("roundedSelection", "Controls whether selections should have rounded corners.") })), + rulers: ne(new Aie()), + scrollbar: ne(new Uie()), + scrollBeyondLastColumn: ne(new Mt(105, "scrollBeyondLastColumn", 4, 0, 1073741824, { description: p("scrollBeyondLastColumn", "Controls the number of extra characters beyond which the editor will scroll horizontally.") })), + scrollBeyondLastLine: ne(new dt(106, "scrollBeyondLastLine", !0, { description: p("scrollBeyondLastLine", "Controls whether the editor will scroll beyond the last line.") })), + scrollPredominantAxis: ne(new dt(107, "scrollPredominantAxis", !0, { description: p("scrollPredominantAxis", "Scroll only along the predominant axis when scrolling both vertically and horizontally at the same time. Prevents horizontal drift when scrolling vertically on a trackpad.") })), + selectionClipboard: ne(new dt(108, "selectionClipboard", !0, { description: p("selectionClipboard", "Controls whether the Linux primary clipboard should be supported."), included: fs })), - selectionHighlight: ne(new ct(109, "selectionHighlight", !0, { description: p("selectionHighlight", "Controls whether the editor should highlight matches similar to the selection.") })), - selectOnLineNumbers: ne(new ct(110, "selectOnLineNumbers", !0)), - showFoldingControls: ne(new di(111, "showFoldingControls", "mouseover", ["always", "never", "mouseover"], { + selectionHighlight: ne(new dt(109, "selectionHighlight", !0, { description: p("selectionHighlight", "Controls whether the editor should highlight matches similar to the selection.") })), + selectOnLineNumbers: ne(new dt(110, "selectOnLineNumbers", !0)), + showFoldingControls: ne(new hi(111, "showFoldingControls", "mouseover", ["always", "never", "mouseover"], { enumDescriptions: [ p("showFoldingControls.always", "Always show the folding controls."), p("showFoldingControls.never", "Never show the folding controls and reduce the gutter size."), @@ -18366,10 +18366,10 @@ const El = { ], description: p("showFoldingControls", "Controls when the folding controls on the gutter are shown.") })), - showUnused: ne(new ct(112, "showUnused", !0, { description: p("showUnused", "Controls fading out of unused code.") })), - showDeprecated: ne(new ct(141, "showDeprecated", !0, { description: p("showDeprecated", "Controls strikethrough deprecated variables.") })), - inlayHints: ne(new Fte()), - snippetSuggestions: ne(new di(113, "snippetSuggestions", "inline", ["top", "bottom", "inline", "none"], { + showUnused: ne(new dt(112, "showUnused", !0, { description: p("showUnused", "Controls fading out of unused code.") })), + showDeprecated: ne(new dt(141, "showDeprecated", !0, { description: p("showDeprecated", "Controls strikethrough deprecated variables.") })), + inlayHints: ne(new Tie()), + snippetSuggestions: ne(new hi(113, "snippetSuggestions", "inline", ["top", "bottom", "inline", "none"], { enumDescriptions: [ p("snippetSuggestions.top", "Show snippet suggestions on top of other suggestions."), p("snippetSuggestions.bottom", "Show snippet suggestions below other suggestions."), @@ -18378,9 +18378,9 @@ const El = { ], description: p("snippetSuggestions", "Controls whether snippets are shown with other suggestions and how they are sorted.") })), - smartSelect: ne(new rie()), - smoothScrolling: ne(new ct(115, "smoothScrolling", !1, { description: p("smoothScrolling", "Controls whether the editor will scroll using an animation.") })), - stopRenderingLineAfter: ne(new Dt( + smartSelect: ne(new qie()), + smoothScrolling: ne(new dt(115, "smoothScrolling", !1, { description: p("smoothScrolling", "Controls whether the editor will scroll using an animation.") })), + stopRenderingLineAfter: ne(new Mt( 118, "stopRenderingLineAfter", 1e4, @@ -18388,14 +18388,14 @@ const El = { 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */ )), - suggest: ne(new oie()), - inlineSuggest: ne(new tie()), - inlineEdit: ne(new iie()), - inlineCompletionsAccessibilityVerbose: ne(new ct(150, "inlineCompletionsAccessibilityVerbose", !1, { description: p("inlineCompletionsAccessibilityVerbose", "Controls whether the accessibility hint should be provided to screen reader users when an inline completion is shown.") })), - suggestFontSize: ne(new Dt(120, "suggestFontSize", 0, 0, 1e3, { markdownDescription: p("suggestFontSize", "Font size for the suggest widget. When set to {0}, the value of {1} is used.", "`0`", "`#editor.fontSize#`") })), - suggestLineHeight: ne(new Dt(121, "suggestLineHeight", 0, 0, 1e3, { markdownDescription: p("suggestLineHeight", "Line height for the suggest widget. When set to {0}, the value of {1} is used. The minimum value is 8.", "`0`", "`#editor.lineHeight#`") })), - suggestOnTriggerCharacters: ne(new ct(122, "suggestOnTriggerCharacters", !0, { description: p("suggestOnTriggerCharacters", "Controls whether suggestions should automatically show up when typing trigger characters.") })), - suggestSelection: ne(new di(123, "suggestSelection", "first", ["first", "recentlyUsed", "recentlyUsedByPrefix"], { + suggest: ne(new jie()), + inlineSuggest: ne(new Bie()), + inlineEdit: ne(new _ie()), + inlineCompletionsAccessibilityVerbose: ne(new dt(150, "inlineCompletionsAccessibilityVerbose", !1, { description: p("inlineCompletionsAccessibilityVerbose", "Controls whether the accessibility hint should be provided to screen reader users when an inline completion is shown.") })), + suggestFontSize: ne(new Mt(120, "suggestFontSize", 0, 0, 1e3, { markdownDescription: p("suggestFontSize", "Font size for the suggest widget. When set to {0}, the value of {1} is used.", "`0`", "`#editor.fontSize#`") })), + suggestLineHeight: ne(new Mt(121, "suggestLineHeight", 0, 0, 1e3, { markdownDescription: p("suggestLineHeight", "Line height for the suggest widget. When set to {0}, the value of {1} is used. The minimum value is 8.", "`0`", "`#editor.lineHeight#`") })), + suggestOnTriggerCharacters: ne(new dt(122, "suggestOnTriggerCharacters", !0, { description: p("suggestOnTriggerCharacters", "Controls whether suggestions should automatically show up when typing trigger characters.") })), + suggestSelection: ne(new hi(123, "suggestSelection", "first", ["first", "recentlyUsed", "recentlyUsedByPrefix"], { markdownEnumDescriptions: [ p("suggestSelection.first", "Always select the first suggestion."), p("suggestSelection.recentlyUsed", "Select recent suggestions unless further typing selects one, e.g. `console.| -> console.log` because `log` has been completed recently."), @@ -18403,7 +18403,7 @@ const El = { ], description: p("suggestSelection", "Controls how suggestions are pre-selected when showing the suggest list.") })), - tabCompletion: ne(new di(124, "tabCompletion", "off", ["on", "off", "onlySnippets"], { + tabCompletion: ne(new hi(124, "tabCompletion", "off", ["on", "off", "onlySnippets"], { enumDescriptions: [ p("tabCompletion.on", "Tab complete will insert the best matching suggestion when pressing tab."), p("tabCompletion.off", "Disable tab completions."), @@ -18411,7 +18411,7 @@ const El = { ], description: p("tabCompletion", "Enables tab completions.") })), - tabIndex: ne(new Dt( + tabIndex: ne(new Mt( 125, "tabIndex", 0, @@ -18419,8 +18419,8 @@ const El = { 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */ )), - unicodeHighlight: ne(new eie()), - unusualLineTerminators: ne(new di(127, "unusualLineTerminators", "prompt", ["auto", "off", "prompt"], { + unicodeHighlight: ne(new Pie()), + unusualLineTerminators: ne(new hi(127, "unusualLineTerminators", "prompt", ["auto", "off", "prompt"], { enumDescriptions: [ p("unusualLineTerminators.auto", "Unusual line terminators are automatically removed."), p("unusualLineTerminators.off", "Unusual line terminators are ignored."), @@ -18428,18 +18428,18 @@ const El = { ], description: p("unusualLineTerminators", "Remove unusual line terminators that might cause problems.") })), - useShadowDOM: ne(new ct(128, "useShadowDOM", !0)), - useTabStops: ne(new ct(129, "useTabStops", !0, { description: p("useTabStops", "Spaces and tabs are inserted and deleted in alignment with tab stops.") })), - wordBreak: ne(new di(130, "wordBreak", "normal", ["normal", "keepAll"], { + useShadowDOM: ne(new dt(128, "useShadowDOM", !0)), + useTabStops: ne(new dt(129, "useTabStops", !0, { description: p("useTabStops", "Spaces and tabs are inserted and deleted in alignment with tab stops.") })), + wordBreak: ne(new hi(130, "wordBreak", "normal", ["normal", "keepAll"], { markdownEnumDescriptions: [ p("wordBreak.normal", "Use the default line break rule."), p("wordBreak.keepAll", "Word breaks should not be used for Chinese/Japanese/Korean (CJK) text. Non-CJK text behavior is the same as for normal.") ], description: p("wordBreak", "Controls the word break rules used for Chinese/Japanese/Korean (CJK) text.") })), - wordSegmenterLocales: ne(new lie()), - wordSeparators: ne(new Kn(132, "wordSeparators", yA, { description: p("wordSeparators", "Characters that will be used as word separators when doing word related navigations or operations.") })), - wordWrap: ne(new di(133, "wordWrap", "off", ["off", "on", "wordWrapColumn", "bounded"], { + wordSegmenterLocales: ne(new $ie()), + wordSeparators: ne(new jn(132, "wordSeparators", MV, { description: p("wordSeparators", "Characters that will be used as word separators when doing word related navigations or operations.") })), + wordWrap: ne(new hi(133, "wordWrap", "off", ["off", "on", "wordWrapColumn", "bounded"], { markdownEnumDescriptions: [ p("wordWrap.off", "Lines will never wrap."), p("wordWrap.on", "Lines will wrap at the viewport width."), @@ -18465,19 +18465,19 @@ const El = { ] }, "Controls how lines should wrap.") })), - wordWrapBreakAfterCharacters: ne(new Kn( + wordWrapBreakAfterCharacters: ne(new jn( 134, "wordWrapBreakAfterCharacters", // allow-any-unicode-next-line " })]?|/&.,;¢°′″‰℃、。。、¢,.:;?!%・・ゝゞヽヾーァィゥェォッャュョヮヵヶぁぃぅぇぉっゃゅょゎゕゖㇰㇱㇲㇳㇴㇵㇶㇷㇸㇹㇺㇻㇼㇽㇾㇿ々〻ァィゥェォャュョッー”〉》」』】〕)]}」" )), - wordWrapBreakBeforeCharacters: ne(new Kn( + wordWrapBreakBeforeCharacters: ne(new jn( 135, "wordWrapBreakBeforeCharacters", // allow-any-unicode-next-line "([{‘“〈《「『【〔([{「£¥$£¥++" )), - wordWrapColumn: ne(new Dt(136, "wordWrapColumn", 80, 1, 1073741824, { + wordWrapColumn: ne(new Mt(136, "wordWrapColumn", 80, 1, 1073741824, { markdownDescription: p({ key: "wordWrapColumn", comment: [ @@ -18486,18 +18486,18 @@ const El = { ] }, "Controls the wrapping column of the editor when `#editor.wordWrap#` is `wordWrapColumn` or `bounded`.") })), - wordWrapOverride1: ne(new di(137, "wordWrapOverride1", "inherit", ["off", "on", "inherit"])), - wordWrapOverride2: ne(new di(138, "wordWrapOverride2", "inherit", ["off", "on", "inherit"])), + wordWrapOverride1: ne(new hi(137, "wordWrapOverride1", "inherit", ["off", "on", "inherit"])), + wordWrapOverride2: ne(new hi(138, "wordWrapOverride2", "inherit", ["off", "on", "inherit"])), // Leave these at the end (because they have dependencies!) - editorClassName: ne(new Wte()), - defaultColorDecorators: ne(new ct(148, "defaultColorDecorators", !1, { markdownDescription: p("defaultColorDecorators", "Controls whether inline color decorations should be shown using the default document color provider") })), - pixelRatio: ne(new Jte()), - tabFocusMode: ne(new ct(145, "tabFocusMode", !1, { markdownDescription: p("tabFocusMode", "Controls whether the editor receives tabs or defers them to the workbench for navigation.") })), - layoutInfo: ne(new Mf()), - wrappingInfo: ne(new cie()), - wrappingIndent: ne(new aie()), - wrappingStrategy: ne(new Rte()) -}, lr = new class { + editorClassName: ne(new Xie()), + defaultColorDecorators: ne(new dt(148, "defaultColorDecorators", !1, { markdownDescription: p("defaultColorDecorators", "Controls whether inline color decorations should be shown using the default document color provider") })), + pixelRatio: ne(new Eie()), + tabFocusMode: ne(new dt(145, "tabFocusMode", !1, { markdownDescription: p("tabFocusMode", "Controls whether the editor receives tabs or defers them to the workbench for navigation.") })), + layoutInfo: ne(new wg()), + wrappingInfo: ne(new tne()), + wrappingIndent: ne(new ene()), + wrappingStrategy: ne(new Rie()) +}, dl = new class { constructor() { this._zoomLevel = 0, this._onDidChangeZoomLevel = new k(), this.onDidChangeZoomLevel = this._onDidChangeZoomLevel.event; } @@ -18507,8 +18507,8 @@ const El = { setZoomLevel(s) { s = Math.min(Math.max(-5, s), 20), this._zoomLevel !== s && (this._zoomLevel = s, this._onDidChangeZoomLevel.fire(this._zoomLevel)); } -}(), pie = qe ? 1.5 : 1.35, FN = 8; -class ag { +}(), rne = qe ? 1.5 : 1.35, iR = 8; +class mm { /** * @internal */ @@ -18519,39 +18519,39 @@ class ag { ), o = e.get( 53 /* EditorOption.fontWeight */ - ), r = e.get( + ), l = e.get( 52 /* EditorOption.fontSize */ - ), l = e.get( + ), r = e.get( 51 /* EditorOption.fontLigatures */ - ), a = e.get( + ), c = e.get( 54 /* EditorOption.fontVariations */ - ), c = e.get( + ), d = e.get( 67 /* EditorOption.lineHeight */ - ), d = e.get( + ), a = e.get( 64 /* EditorOption.letterSpacing */ ); - return ag._create(n, o, r, l, a, c, d, t, i); + return mm._create(n, o, l, r, c, d, a, t, i); } /** * @internal */ - static _create(e, t, i, n, o, r, l, a, c) { - r === 0 ? r = pie * i : r < FN && (r = r * i), r = Math.round(r), r < FN && (r = FN); - const d = 1 + (c ? 0 : lr.getZoomLevel() * 0.1); - return i *= d, r *= d, o === Yw.TRANSLATE && (t === "normal" || t === "bold" ? o = Yw.OFF : (o = `'wght' ${parseInt(t, 10)}`, t = "normal")), new ag({ - pixelRatio: a, + static _create(e, t, i, n, o, l, r, c, d) { + l === 0 ? l = rne * i : l < iR && (l = l * i), l = Math.round(l), l < iR && (l = iR); + const a = 1 + (d ? 0 : dl.getZoomLevel() * 0.1); + return i *= a, l *= a, o === $y.TRANSLATE && (t === "normal" || t === "bold" ? o = $y.OFF : (o = `'wght' ${parseInt(t, 10)}`, t = "normal")), new mm({ + pixelRatio: c, fontFamily: e, fontWeight: t, fontSize: i, fontFeatureSettings: n, fontVariationSettings: o, - lineHeight: r, - letterSpacing: l + lineHeight: l, + letterSpacing: r }); } /** @@ -18570,20 +18570,20 @@ class ag { * @internal */ getMassagedFontFamily() { - const e = ps.fontFamily, t = ag._wrapInQuotes(this.fontFamily); + const e = Zs.fontFamily, t = mm._wrapInQuotes(this.fontFamily); return this.fontFamily !== e ? `${t}, ${e}` : t; } static _wrapInQuotes(e) { return /[,"']/.test(e) ? e : /[+ ]/.test(e) ? `"${e}"` : e; } } -const fie = 2; -class Q2 extends ag { +const cne = 2; +class Zw extends mm { /** * @internal */ constructor(e, t) { - super(e), this._editorStylingBrand = void 0, this.version = fie, this.isTrusted = t, this.isMonospace = e.isMonospace, this.typicalHalfwidthCharacterWidth = e.typicalHalfwidthCharacterWidth, this.typicalFullwidthCharacterWidth = e.typicalFullwidthCharacterWidth, this.canUseHalfwidthRightwardsArrow = e.canUseHalfwidthRightwardsArrow, this.spaceWidth = e.spaceWidth, this.middotWidth = e.middotWidth, this.wsmiddotWidth = e.wsmiddotWidth, this.maxDigitWidth = e.maxDigitWidth; + super(e), this._editorStylingBrand = void 0, this.version = cne, this.isTrusted = t, this.isMonospace = e.isMonospace, this.typicalHalfwidthCharacterWidth = e.typicalHalfwidthCharacterWidth, this.typicalFullwidthCharacterWidth = e.typicalFullwidthCharacterWidth, this.canUseHalfwidthRightwardsArrow = e.canUseHalfwidthRightwardsArrow, this.spaceWidth = e.spaceWidth, this.middotWidth = e.middotWidth, this.wsmiddotWidth = e.wsmiddotWidth, this.maxDigitWidth = e.maxDigitWidth; } /** * @internal @@ -18592,7 +18592,7 @@ class Q2 extends ag { return this.fontFamily === e.fontFamily && this.fontWeight === e.fontWeight && this.fontSize === e.fontSize && this.fontFeatureSettings === e.fontFeatureSettings && this.fontVariationSettings === e.fontVariationSettings && this.lineHeight === e.lineHeight && this.letterSpacing === e.letterSpacing && this.typicalHalfwidthCharacterWidth === e.typicalHalfwidthCharacterWidth && this.typicalFullwidthCharacterWidth === e.typicalFullwidthCharacterWidth && this.canUseHalfwidthRightwardsArrow === e.canUseHalfwidthRightwardsArrow && this.spaceWidth === e.spaceWidth && this.middotWidth === e.middotWidth && this.wsmiddotWidth === e.wsmiddotWidth && this.maxDigitWidth === e.maxDigitWidth; } } -class bie extends R { +class dne extends J { constructor() { super(...arguments), this._cache = /* @__PURE__ */ new Map(), this._evictUntrustedReadingsTimeout = -1, this._onDidChange = this._register(new k()), this.onDidChange = this._onDidChange.event; } @@ -18606,9 +18606,9 @@ class bie extends R { this._cache.clear(), this._onDidChange.fire(); } _ensureCache(e) { - const t = lA(e); + const t = XV(e); let i = this._cache.get(t); - return i || (i = new yie(), this._cache.set(t, i)), i; + return i || (i = new ane(), this._cache.set(t, i)), i; } _writeToCache(e, t, i) { this._ensureCache(e).put(t, i), !i.isTrusted && this._evictUntrustedReadingsTimeout === -1 && (this._evictUntrustedReadingsTimeout = e.setTimeout(() => { @@ -18629,8 +18629,8 @@ class bie extends R { const i = this._ensureCache(e); if (!i.has(t)) { let n = this._actualReadFontInfo(e, t); - (n.typicalHalfwidthCharacterWidth <= 2 || n.typicalFullwidthCharacterWidth <= 2 || n.spaceWidth <= 2 || n.maxDigitWidth <= 2) && (n = new Q2({ - pixelRatio: Fw.getInstance(e).value, + (n.typicalHalfwidthCharacterWidth <= 2 || n.typicalFullwidthCharacterWidth <= 2 || n.spaceWidth <= 2 || n.maxDigitWidth <= 2) && (n = new Zw({ + pixelRatio: qy.getInstance(e).value, fontFamily: n.fontFamily, fontWeight: n.fontWeight, fontSize: n.fontSize, @@ -18651,27 +18651,27 @@ class bie extends R { return i.get(t); } _createRequest(e, t, i, n) { - const o = new Lte(e, t); + const o = new bie(e, t); return i.push(o), n == null || n.push(o), o; } _actualReadFontInfo(e, t) { - const i = [], n = [], o = this._createRequest("n", 0, i, n), r = this._createRequest("m", 0, i, null), l = this._createRequest(" ", 0, i, n), a = this._createRequest("0", 0, i, n), c = this._createRequest("1", 0, i, n), d = this._createRequest("2", 0, i, n), h = this._createRequest("3", 0, i, n), u = this._createRequest("4", 0, i, n), g = this._createRequest("5", 0, i, n), m = this._createRequest("6", 0, i, n), f = this._createRequest("7", 0, i, n), b = this._createRequest("8", 0, i, n), y = this._createRequest("9", 0, i, n), w = this._createRequest("→", 0, i, n), C = this._createRequest("→", 0, i, null), S = this._createRequest("·", 0, i, n), L = this._createRequest("⸱", 0, i, null), x = "|/-_ilm%"; - for (let E = 0, Y = x.length; E < Y; E++) - this._createRequest(x.charAt(E), 0, i, n), this._createRequest(x.charAt(E), 1, i, n), this._createRequest(x.charAt(E), 2, i, n); - Ate(e, t, i); - const Z = Math.max(a.width, c.width, d.width, h.width, u.width, g.width, m.width, f.width, b.width, y.width); - let _ = t.fontFeatureSettings === Dh.OFF; - const v = n[0].width; - for (let E = 1, Y = n.length; _ && E < Y; E++) { - const B = v - n[E].width; - if (B < -1e-3 || B > 1e-3) { - _ = !1; + const i = [], n = [], o = this._createRequest("n", 0, i, n), l = this._createRequest("m", 0, i, null), r = this._createRequest(" ", 0, i, n), c = this._createRequest("0", 0, i, n), d = this._createRequest("1", 0, i, n), a = this._createRequest("2", 0, i, n), h = this._createRequest("3", 0, i, n), u = this._createRequest("4", 0, i, n), m = this._createRequest("5", 0, i, n), b = this._createRequest("6", 0, i, n), g = this._createRequest("7", 0, i, n), Z = this._createRequest("8", 0, i, n), f = this._createRequest("9", 0, i, n), y = this._createRequest("→", 0, i, n), W = this._createRequest("→", 0, i, null), G = this._createRequest("·", 0, i, n), X = this._createRequest("⸱", 0, i, null), L = "|/-_ilm%"; + for (let H = 0, F = L.length; H < F; H++) + this._createRequest(L.charAt(H), 0, i, n), this._createRequest(L.charAt(H), 1, i, n), this._createRequest(L.charAt(H), 2, i, n); + pie(e, t, i); + const S = Math.max(c.width, d.width, a.width, h.width, u.width, m.width, b.width, g.width, Z.width, f.width); + let x = t.fontFeatureSettings === Jh.OFF; + const w = n[0].width; + for (let H = 1, F = n.length; x && H < F; H++) { + const K = w - n[H].width; + if (K < -1e-3 || K > 1e-3) { + x = !1; break; } } - let P = !0; - return _ && C.width !== v && (P = !1), C.width > w.width && (P = !1), new Q2({ - pixelRatio: Fw.getInstance(e).value, + let A = !0; + return x && W.width !== w && (A = !1), W.width > y.width && (A = !1), new Zw({ + pixelRatio: qy.getInstance(e).value, fontFamily: t.fontFamily, fontWeight: t.fontWeight, fontSize: t.fontSize, @@ -18679,18 +18679,18 @@ class bie extends R { fontVariationSettings: t.fontVariationSettings, lineHeight: t.lineHeight, letterSpacing: t.letterSpacing, - isMonospace: _, + isMonospace: x, typicalHalfwidthCharacterWidth: o.width, - typicalFullwidthCharacterWidth: r.width, - canUseHalfwidthRightwardsArrow: P, - spaceWidth: l.width, - middotWidth: S.width, - wsmiddotWidth: L.width, - maxDigitWidth: Z + typicalFullwidthCharacterWidth: l.width, + canUseHalfwidthRightwardsArrow: A, + spaceWidth: r.width, + middotWidth: G.width, + wsmiddotWidth: X.width, + maxDigitWidth: S }, !0); } } -class yie { +class ane { constructor() { this._keys = /* @__PURE__ */ Object.create(null), this._values = /* @__PURE__ */ Object.create(null); } @@ -18714,12 +18714,12 @@ class yie { return Object.keys(this._keys).map((e) => this._values[e]); } } -const j2 = new bie(), af = class af { +const fw = new dne(), bg = class bg { constructor(e, t) { this.key = e, this.migrate = t; } apply(e) { - const t = af._read(e, this.key), i = (o) => af._read(e, o), n = (o, r) => af._write(e, o, r); + const t = bg._read(e, this.key), i = (o) => bg._read(e, o), n = (o, l) => bg._write(e, o, l); this.migrate(t, i, n); } static _read(e, t) { @@ -18742,50 +18742,50 @@ const j2 = new bie(), af = class af { e[t] = i; } }; -af.items = []; -let zw = af; -function Xl(s, e) { - zw.items.push(new zw(s, e)); +bg.items = []; +let eW = bg; +function Ar(s, e) { + eW.items.push(new eW(s, e)); } -function bo(s, e) { - Xl(s, (t, i, n) => { +function yo(s, e) { + Ar(s, (t, i, n) => { if (typeof t < "u") { - for (const [o, r] of e) + for (const [o, l] of e) if (t === o) { - n(s, r); + n(s, l); return; } } }); } -function wie(s) { - zw.items.forEach((e) => e.apply(s)); -} -bo("wordWrap", [[!0, "on"], [!1, "off"]]); -bo("lineNumbers", [[!0, "on"], [!1, "off"]]); -bo("cursorBlinking", [["visible", "solid"]]); -bo("renderWhitespace", [[!0, "boundary"], [!1, "none"]]); -bo("renderLineHighlight", [[!0, "line"], [!1, "none"]]); -bo("acceptSuggestionOnEnter", [[!0, "on"], [!1, "off"]]); -bo("tabCompletion", [[!1, "off"], [!0, "onlySnippets"]]); -bo("hover", [[!0, { enabled: !0 }], [!1, { enabled: !1 }]]); -bo("parameterHints", [[!0, { enabled: !0 }], [!1, { enabled: !1 }]]); -bo("autoIndent", [[!1, "advanced"], [!0, "full"]]); -bo("matchBrackets", [[!0, "always"], [!1, "never"]]); -bo("renderFinalNewline", [[!0, "on"], [!1, "off"]]); -bo("cursorSmoothCaretAnimation", [[!0, "on"], [!1, "off"]]); -bo("occurrencesHighlight", [[!0, "singleFile"], [!1, "off"]]); -bo("wordBasedSuggestions", [[!0, "matchingDocuments"], [!1, "off"]]); -Xl("autoClosingBrackets", (s, e, t) => { +function hne(s) { + eW.items.forEach((e) => e.apply(s)); +} +yo("wordWrap", [[!0, "on"], [!1, "off"]]); +yo("lineNumbers", [[!0, "on"], [!1, "off"]]); +yo("cursorBlinking", [["visible", "solid"]]); +yo("renderWhitespace", [[!0, "boundary"], [!1, "none"]]); +yo("renderLineHighlight", [[!0, "line"], [!1, "none"]]); +yo("acceptSuggestionOnEnter", [[!0, "on"], [!1, "off"]]); +yo("tabCompletion", [[!1, "off"], [!0, "onlySnippets"]]); +yo("hover", [[!0, { enabled: !0 }], [!1, { enabled: !1 }]]); +yo("parameterHints", [[!0, { enabled: !0 }], [!1, { enabled: !1 }]]); +yo("autoIndent", [[!1, "advanced"], [!0, "full"]]); +yo("matchBrackets", [[!0, "always"], [!1, "never"]]); +yo("renderFinalNewline", [[!0, "on"], [!1, "off"]]); +yo("cursorSmoothCaretAnimation", [[!0, "on"], [!1, "off"]]); +yo("occurrencesHighlight", [[!0, "singleFile"], [!1, "off"]]); +yo("wordBasedSuggestions", [[!0, "matchingDocuments"], [!1, "off"]]); +Ar("autoClosingBrackets", (s, e, t) => { s === !1 && (t("autoClosingBrackets", "never"), typeof e("autoClosingQuotes") > "u" && t("autoClosingQuotes", "never"), typeof e("autoSurround") > "u" && t("autoSurround", "never")); }); -Xl("renderIndentGuides", (s, e, t) => { +Ar("renderIndentGuides", (s, e, t) => { typeof s < "u" && (t("renderIndentGuides", void 0), typeof e("guides.indentation") > "u" && t("guides.indentation", !!s)); }); -Xl("highlightActiveIndentGuide", (s, e, t) => { +Ar("highlightActiveIndentGuide", (s, e, t) => { typeof s < "u" && (t("highlightActiveIndentGuide", void 0), typeof e("guides.highlightActiveIndentation") > "u" && t("guides.highlightActiveIndentation", !!s)); }); -const Cie = { +const une = { method: "showMethods", function: "showFunctions", constructor: "showConstructors", @@ -18813,26 +18813,26 @@ const Cie = { typeParameter: "showTypeParameters", snippet: "showSnippets" }; -Xl("suggest.filteredTypes", (s, e, t) => { +Ar("suggest.filteredTypes", (s, e, t) => { if (s && typeof s == "object") { - for (const i of Object.entries(Cie)) + for (const i of Object.entries(une)) s[i[0]] === !1 && typeof e(`suggest.${i[1]}`) > "u" && t(`suggest.${i[1]}`, !1); t("suggest.filteredTypes", void 0); } }); -Xl("quickSuggestions", (s, e, t) => { +Ar("quickSuggestions", (s, e, t) => { if (typeof s == "boolean") { const i = s ? "on" : "off"; t("quickSuggestions", { comments: i, strings: i, other: i }); } }); -Xl("experimental.stickyScroll.enabled", (s, e, t) => { +Ar("experimental.stickyScroll.enabled", (s, e, t) => { typeof s == "boolean" && (t("experimental.stickyScroll.enabled", void 0), typeof e("stickyScroll.enabled") > "u" && t("stickyScroll.enabled", s)); }); -Xl("experimental.stickyScroll.maxLineCount", (s, e, t) => { +Ar("experimental.stickyScroll.maxLineCount", (s, e, t) => { typeof s == "number" && (t("experimental.stickyScroll.maxLineCount", void 0), typeof e("stickyScroll.maxLineCount") > "u" && t("stickyScroll.maxLineCount", s)); }); -Xl("codeActionsOnSave", (s, e, t) => { +Ar("codeActionsOnSave", (s, e, t) => { if (s && typeof s == "object") { let i = !1; const n = {}; @@ -18841,13 +18841,13 @@ Xl("codeActionsOnSave", (s, e, t) => { i && t("codeActionsOnSave", n); } }); -Xl("codeActionWidget.includeNearbyQuickfixes", (s, e, t) => { +Ar("codeActionWidget.includeNearbyQuickfixes", (s, e, t) => { typeof s == "boolean" && (t("codeActionWidget.includeNearbyQuickfixes", void 0), typeof e("codeActionWidget.includeNearbyQuickFixes") > "u" && t("codeActionWidget.includeNearbyQuickFixes", s)); }); -Xl("lightbulb.enabled", (s, e, t) => { +Ar("lightbulb.enabled", (s, e, t) => { typeof s == "boolean" && t("lightbulb.enabled", s ? void 0 : "off"); }); -class Sie { +class mne { constructor() { this._tabFocus = !1, this._onDidChangeTabFocus = new k(), this.onDidChangeTabFocus = this._onDidChangeTabFocus.event; } @@ -18858,30 +18858,30 @@ class Sie { this._tabFocus = e, this._onDidChangeTabFocus.fire(this._tabFocus); } } -const db = new Sie(), yo = $e("accessibilityService"), fC = new ae("accessibilityModeEnabled", !1); -var Lie = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +const gZ = new mne(), Wo = $e("accessibilityService"), RG = new ce("accessibilityModeEnabled", !1); +var bne = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Aie = function(s, e) { +}, pne = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let q2 = class extends R { +let yw = class extends J { constructor(e, t, i, n, o) { - super(), this._accessibilityService = o, this._onDidChange = this._register(new k()), this.onDidChange = this._onDidChange.event, this._onDidChangeFast = this._register(new k()), this.onDidChangeFast = this._onDidChangeFast.event, this._isDominatedByLongLines = !1, this._viewLineCount = 1, this._lineNumbersDigitCount = 1, this._reservedHeight = 0, this._glyphMarginDecorationLaneCount = 1, this._computeOptionsMemory = new HJ(), this.isSimpleWidget = e, this.contextMenuId = t, this._containerObserver = this._register(new BJ(n, i.dimension)), this._targetWindowId = xe(n).vscodeWindowId, this._rawOptions = TF(i), this._validatedOptions = Td.validateOptions(this._rawOptions), this.options = this._computeOptions(), this.options.get( + super(), this._accessibilityService = o, this._onDidChange = this._register(new k()), this.onDidChange = this._onDidChange.event, this._onDidChangeFast = this._register(new k()), this.onDidChangeFast = this._onDidChangeFast.event, this._isDominatedByLongLines = !1, this._viewLineCount = 1, this._lineNumbersDigitCount = 1, this._reservedHeight = 0, this._glyphMarginDecorationLaneCount = 1, this._computeOptionsMemory = new C_(), this.isSimpleWidget = e, this.contextMenuId = t, this._containerObserver = this._register(new S_(n, i.dimension)), this._targetWindowId = Le(n).vscodeWindowId, this._rawOptions = nF(i), this._validatedOptions = va.validateOptions(this._rawOptions), this.options = this._computeOptions(), this.options.get( 13 /* EditorOption.automaticLayout */ - ) && this._containerObserver.startObserving(), this._register(lr.onDidChangeZoomLevel(() => this._recomputeOptions())), this._register(db.onDidChangeTabFocus(() => this._recomputeOptions())), this._register(this._containerObserver.onDidChange(() => this._recomputeOptions())), this._register(j2.onDidChange(() => this._recomputeOptions())), this._register(Fw.getInstance(xe(n)).onDidChange(() => this._recomputeOptions())), this._register(this._accessibilityService.onDidChangeScreenReaderOptimized(() => this._recomputeOptions())); + ) && this._containerObserver.startObserving(), this._register(dl.onDidChangeZoomLevel(() => this._recomputeOptions())), this._register(gZ.onDidChangeTabFocus(() => this._recomputeOptions())), this._register(this._containerObserver.onDidChange(() => this._recomputeOptions())), this._register(fw.onDidChange(() => this._recomputeOptions())), this._register(qy.getInstance(Le(n)).onDidChange(() => this._recomputeOptions())), this._register(this._accessibilityService.onDidChangeScreenReaderOptimized(() => this._recomputeOptions())); } _recomputeOptions() { - const e = this._computeOptions(), t = Td.checkEquals(this.options, e); + const e = this._computeOptions(), t = va.checkEquals(this.options, e); t !== null && (this.options = e, this._onDidChangeFast.fire(t), this._onDidChange.fire(t)); } _computeOptions() { - const e = this._readEnvConfiguration(), t = ag.createFromValidatedSettings(this._validatedOptions, e.pixelRatio, this.isSimpleWidget), i = this._readFontInfo(t), n = { + const e = this._readEnvConfiguration(), t = mm.createFromValidatedSettings(this._validatedOptions, e.pixelRatio, this.isSimpleWidget), i = this._readFontInfo(t), n = { memory: this._computeOptionsMemory, outerWidth: e.outerWidth, outerHeight: e.outerHeight - this._reservedHeight, @@ -18892,31 +18892,31 @@ let q2 = class extends R { lineNumbersDigitCount: this._lineNumbersDigitCount, emptySelectionClipboard: e.emptySelectionClipboard, pixelRatio: e.pixelRatio, - tabFocusMode: db.getTabFocusMode(), + tabFocusMode: gZ.getTabFocusMode(), accessibilitySupport: e.accessibilitySupport, glyphMarginDecorationLaneCount: this._glyphMarginDecorationLaneCount }; - return Td.computeOptions(this._validatedOptions, n); + return va.computeOptions(this._validatedOptions, n); } _readEnvConfiguration() { return { - extraEditorClassName: Mie(), + extraEditorClassName: Zne(), outerWidth: this._containerObserver.getWidth(), outerHeight: this._containerObserver.getHeight(), - emptySelectionClipboard: Z_ || pr, - pixelRatio: Fw.getInstance(eF(this._targetWindowId, !0).window).value, + emptySelectionClipboard: FS || fl, + pixelRatio: qy.getInstance(ID(this._targetWindowId, !0).window).value, accessibilitySupport: this._accessibilityService.isScreenReaderOptimized() ? 2 : this._accessibilityService.getAccessibilitySupport() }; } _readFontInfo(e) { - return j2.readFontInfo(eF(this._targetWindowId, !0).window, e); + return fw.readFontInfo(ID(this._targetWindowId, !0).window, e); } getRawOptions() { return this._rawOptions; } updateOptions(e) { - const t = TF(e); - Td.applyUpdate(this._rawOptions, t) && (this._validatedOptions = Td.validateOptions(this._rawOptions), this._recomputeOptions()); + const t = nF(e); + va.applyUpdate(this._rawOptions, t) && (this._validatedOptions = va.validateOptions(this._rawOptions), this._recomputeOptions()); } observeContainer(e) { this._containerObserver.observe(e); @@ -18925,7 +18925,7 @@ let q2 = class extends R { this._isDominatedByLongLines !== e && (this._isDominatedByLongLines = e, this._recomputeOptions()); } setModelLineCount(e) { - const t = xie(e); + const t = gne(e); this._lineNumbersDigitCount !== t && (this._lineNumbersDigitCount = t, this._recomputeOptions()); } setViewLineCount(e) { @@ -18938,20 +18938,20 @@ let q2 = class extends R { this._glyphMarginDecorationLaneCount !== e && (this._glyphMarginDecorationLaneCount = e, this._recomputeOptions()); } }; -q2 = Lie([ - Aie(4, yo) -], q2); -function xie(s) { +yw = bne([ + pne(4, Wo) +], yw); +function gne(s) { let e = 0; for (; s; ) s = Math.floor(s / 10), e++; return e || 1; } -function Mie() { +function Zne() { let s = ""; - return !xh && !hH && (s += "no-user-select "), xh && (s += "no-minimap-shadow ", s += "enable-user-select "), qe && (s += "mac "), s; + return !Ch && !BP && (s += "no-user-select "), Ch && (s += "no-minimap-shadow ", s += "enable-user-select "), qe && (s += "mac "), s; } -class Zie { +class fne { constructor() { this._values = []; } @@ -18965,7 +18965,7 @@ class Zie { this._values[e] = t; } } -class _ie { +class yne { constructor() { this._values = []; } @@ -18981,18 +18981,18 @@ class _ie { this._values[e] = t; } } -class Td { +class va { static validateOptions(e) { - const t = new Zie(); - for (const i of kp) { + const t = new fne(); + for (const i of Fp) { const n = i.name === "_never_" ? void 0 : e[i.name]; t._write(i.id, i.validate(n)); } return t; } static computeOptions(e, t) { - const i = new _ie(); - for (const n of kp) + const i = new yne(); + for (const n of Fp) i._write(n.id, n.compute(t, i, e._read(n.id))); return i; } @@ -19000,22 +19000,22 @@ class Td { if (typeof e != "object" || typeof t != "object" || !e || !t) return e === t; if (Array.isArray(e) || Array.isArray(t)) - return Array.isArray(e) && Array.isArray(t) ? ei(e, t) : !1; + return Array.isArray(e) && Array.isArray(t) ? ti(e, t) : !1; if (Object.keys(e).length !== Object.keys(t).length) return !1; for (const i in e) - if (!Td._deepEquals(e[i], t[i])) + if (!va._deepEquals(e[i], t[i])) return !1; return !0; } static checkEquals(e, t) { const i = []; let n = !1; - for (const o of kp) { - const r = !Td._deepEquals(e._read(o.id), t._read(o.id)); - i[o.id] = r, r && (n = !0); + for (const o of Fp) { + const l = !va._deepEquals(e._read(o.id), t._read(o.id)); + i[o.id] = l, l && (n = !0); } - return n ? new OJ(i) : null; + return n ? new x_(i) : null; } /** * Returns true if something changed. @@ -19023,7 +19023,7 @@ class Td { */ static applyUpdate(e, t) { let i = !1; - for (const n of kp) + for (const n of Fp) if (t.hasOwnProperty(n.name)) { const o = n.applyUpdate(e[n.name], t[n.name]); e[n.name] = o.newValue, i = i || o.didChange; @@ -19031,92 +19031,92 @@ class Td { return i; } } -function TF(s) { - const e = gc(s); - return wie(e), e; +function nF(s) { + const e = Zd(s); + return hne(e), e; } -var Fd; +var Ka; (function(s) { const e = { total: 0, min: Number.MAX_VALUE, max: 0 }, t = { ...e }, i = { ...e }, n = { ...e }; let o = 0; - const r = { + const l = { keydown: 0, input: 0, render: 0 }; - function l() { - y(), performance.mark("inputlatency/start"), performance.mark("keydown/start"), r.keydown = 1, queueMicrotask(a); - } - s.onKeyDown = l; - function a() { - r.keydown === 1 && (performance.mark("keydown/end"), r.keydown = 2); + function r() { + f(), performance.mark("inputlatency/start"), performance.mark("keydown/start"), l.keydown = 1, queueMicrotask(c); } + s.onKeyDown = r; function c() { - performance.mark("input/start"), r.input = 1, b(); + l.keydown === 1 && (performance.mark("keydown/end"), l.keydown = 2); } - s.onBeforeInput = c; function d() { - r.input === 0 && c(), queueMicrotask(h); + performance.mark("input/start"), l.input = 1, Z(); + } + s.onBeforeInput = d; + function a() { + l.input === 0 && d(), queueMicrotask(h); } - s.onInput = d; + s.onInput = a; function h() { - r.input === 1 && (performance.mark("input/end"), r.input = 2); + l.input === 1 && (performance.mark("input/end"), l.input = 2); } function u() { - y(); + f(); } s.onKeyUp = u; - function g() { - y(); - } - s.onSelectionChange = g; function m() { - r.keydown === 2 && r.input === 2 && r.render === 0 && (performance.mark("render/start"), r.render = 1, queueMicrotask(f), b()); - } - s.onRenderStart = m; - function f() { - r.render === 1 && (performance.mark("render/end"), r.render = 2); + f(); } + s.onSelectionChange = m; function b() { - setTimeout(y); + l.keydown === 2 && l.input === 2 && l.render === 0 && (performance.mark("render/start"), l.render = 1, queueMicrotask(g), Z()); } - function y() { - r.keydown === 2 && r.input === 2 && r.render === 2 && (performance.mark("inputlatency/end"), performance.measure("keydown", "keydown/start", "keydown/end"), performance.measure("input", "input/start", "input/end"), performance.measure("render", "render/start", "render/end"), performance.measure("inputlatency", "inputlatency/start", "inputlatency/end"), w("keydown", e), w("input", t), w("render", i), w("inputlatency", n), o++, C()); + s.onRenderStart = b; + function g() { + l.render === 1 && (performance.mark("render/end"), l.render = 2); + } + function Z() { + setTimeout(f); + } + function f() { + l.keydown === 2 && l.input === 2 && l.render === 2 && (performance.mark("inputlatency/end"), performance.measure("keydown", "keydown/start", "keydown/end"), performance.measure("input", "input/start", "input/end"), performance.measure("render", "render/start", "render/end"), performance.measure("inputlatency", "inputlatency/start", "inputlatency/end"), y("keydown", e), y("input", t), y("render", i), y("inputlatency", n), o++, W()); } - function w(Z, _) { - const v = performance.getEntriesByName(Z)[0].duration; - _.total += v, _.min = Math.min(_.min, v), _.max = Math.max(_.max, v); + function y(S, x) { + const w = performance.getEntriesByName(S)[0].duration; + x.total += w, x.min = Math.min(x.min, w), x.max = Math.max(x.max, w); } - function C() { - performance.clearMarks("keydown/start"), performance.clearMarks("keydown/end"), performance.clearMarks("input/start"), performance.clearMarks("input/end"), performance.clearMarks("render/start"), performance.clearMarks("render/end"), performance.clearMarks("inputlatency/start"), performance.clearMarks("inputlatency/end"), performance.clearMeasures("keydown"), performance.clearMeasures("input"), performance.clearMeasures("render"), performance.clearMeasures("inputlatency"), r.keydown = 0, r.input = 0, r.render = 0; + function W() { + performance.clearMarks("keydown/start"), performance.clearMarks("keydown/end"), performance.clearMarks("input/start"), performance.clearMarks("input/end"), performance.clearMarks("render/start"), performance.clearMarks("render/end"), performance.clearMarks("inputlatency/start"), performance.clearMarks("inputlatency/end"), performance.clearMeasures("keydown"), performance.clearMeasures("input"), performance.clearMeasures("render"), performance.clearMeasures("inputlatency"), l.keydown = 0, l.input = 0, l.render = 0; } - function S() { + function G() { if (o === 0) return; - const Z = { - keydown: L(e), - input: L(t), - render: L(i), - total: L(n), + const S = { + keydown: X(e), + input: X(t), + render: X(i), + total: X(n), sampleCount: o }; - return x(e), x(t), x(i), x(n), o = 0, Z; + return L(e), L(t), L(i), L(n), o = 0, S; } - s.getAndClearMeasurements = S; - function L(Z) { + s.getAndClearMeasurements = G; + function X(S) { return { - average: Z.total / o, - max: Z.max, - min: Z.min + average: S.total / o, + max: S.max, + min: S.min }; } - function x(Z) { - Z.total = 0, Z.min = Number.MAX_VALUE, Z.max = 0; + function L(S) { + S.total = 0, S.min = Number.MAX_VALUE, S.max = 0; } -})(Fd || (Fd = {})); -class n0 { +})(Ka || (Ka = {})); +class d0 { constructor() { - this._hooks = new U(), this._pointerMoveCallback = null, this._onStopCallback = null; + this._hooks = new _(), this._pointerMoveCallback = null, this._onStopCallback = null; } dispose() { this.stopMonitoring(!1), this._hooks.dispose(); @@ -19133,41 +19133,41 @@ class n0 { } startMonitoring(e, t, i, n, o) { this.isMonitoring() && this.stopMonitoring(!1), this._pointerMoveCallback = n, this._onStopCallback = o; - let r = e; + let l = e; try { - e.setPointerCapture(t), this._hooks.add(Ce(() => { + e.setPointerCapture(t), this._hooks.add(We(() => { try { e.releasePointerCapture(t); } catch { } })); } catch { - r = xe(e); + l = Le(e); } - this._hooks.add(z(r, ie.POINTER_MOVE, (l) => { - if (l.buttons !== i) { + this._hooks.add(z(l, ie.POINTER_MOVE, (r) => { + if (r.buttons !== i) { this.stopMonitoring(!0); return; } - l.preventDefault(), this._pointerMoveCallback(l); - })), this._hooks.add(z(r, ie.POINTER_UP, (l) => this.stopMonitoring(!0))); + r.preventDefault(), this._pointerMoveCallback(r); + })), this._hooks.add(z(l, ie.POINTER_UP, (r) => this.stopMonitoring(!0))); } } -function th(s, e) { +function oh(s, e) { const t = Math.pow(10, e); return Math.round(s * t) / t; } -class lt { +class rt { constructor(e, t, i, n = 1) { - this._rgbaBrand = void 0, this.r = Math.min(255, Math.max(0, e)) | 0, this.g = Math.min(255, Math.max(0, t)) | 0, this.b = Math.min(255, Math.max(0, i)) | 0, this.a = th(Math.max(Math.min(1, n), 0), 3); + this._rgbaBrand = void 0, this.r = Math.min(255, Math.max(0, e)) | 0, this.g = Math.min(255, Math.max(0, t)) | 0, this.b = Math.min(255, Math.max(0, i)) | 0, this.a = oh(Math.max(Math.min(1, n), 0), 3); } static equals(e, t) { return e.r === t.r && e.g === t.g && e.b === t.b && e.a === t.a; } } -class Vr { +class Jl { constructor(e, t, i, n) { - this._hslaBrand = void 0, this.h = Math.max(Math.min(360, e), 0) | 0, this.s = th(Math.max(Math.min(1, t), 0), 3), this.l = th(Math.max(Math.min(1, i), 0), 3), this.a = th(Math.max(Math.min(1, n), 0), 3); + this._hslaBrand = void 0, this.h = Math.max(Math.min(360, e), 0) | 0, this.s = oh(Math.max(Math.min(1, t), 0), 3), this.l = oh(Math.max(Math.min(1, i), 0), 3), this.a = oh(Math.max(Math.min(1, n), 0), 3); } static equals(e, t) { return e.h === t.h && e.s === t.s && e.l === t.l && e.a === t.a; @@ -19179,24 +19179,24 @@ class Vr { * returns h in the set [0, 360], s, and l in the set [0, 1]. */ static fromRGBA(e) { - const t = e.r / 255, i = e.g / 255, n = e.b / 255, o = e.a, r = Math.max(t, i, n), l = Math.min(t, i, n); - let a = 0, c = 0; - const d = (l + r) / 2, h = r - l; + const t = e.r / 255, i = e.g / 255, n = e.b / 255, o = e.a, l = Math.max(t, i, n), r = Math.min(t, i, n); + let c = 0, d = 0; + const a = (r + l) / 2, h = l - r; if (h > 0) { - switch (c = Math.min(d <= 0.5 ? h / (2 * d) : h / (2 - 2 * d), 1), r) { + switch (d = Math.min(a <= 0.5 ? h / (2 * a) : h / (2 - 2 * a), 1), l) { case t: - a = (i - n) / h + (i < n ? 6 : 0); + c = (i - n) / h + (i < n ? 6 : 0); break; case i: - a = (n - t) / h + 2; + c = (n - t) / h + 2; break; case n: - a = (t - i) / h + 4; + c = (t - i) / h + 4; break; } - a *= 60, a = Math.round(a); + c *= 60, c = Math.round(c); } - return new Vr(a, c, d, o); + return new Jl(c, d, a, o); } static _hue2rgb(e, t, i) { return i < 0 && (i += 1), i > 1 && (i -= 1), i < 1 / 6 ? e + (t - e) * 6 * i : i < 1 / 2 ? t : i < 2 / 3 ? e + (t - e) * (2 / 3 - i) * 6 : e; @@ -19209,72 +19209,72 @@ class Vr { */ static toRGBA(e) { const t = e.h / 360, { s: i, l: n, a: o } = e; - let r, l, a; + let l, r, c; if (i === 0) - r = l = a = n; + l = r = c = n; else { - const c = n < 0.5 ? n * (1 + i) : n + i - n * i, d = 2 * n - c; - r = Vr._hue2rgb(d, c, t + 1 / 3), l = Vr._hue2rgb(d, c, t), a = Vr._hue2rgb(d, c, t - 1 / 3); + const d = n < 0.5 ? n * (1 + i) : n + i - n * i, a = 2 * n - d; + l = Jl._hue2rgb(a, d, t + 1 / 3), r = Jl._hue2rgb(a, d, t), c = Jl._hue2rgb(a, d, t - 1 / 3); } - return new lt(Math.round(r * 255), Math.round(l * 255), Math.round(a * 255), o); + return new rt(Math.round(l * 255), Math.round(r * 255), Math.round(c * 255), o); } } -class La { +class Sc { constructor(e, t, i, n) { - this._hsvaBrand = void 0, this.h = Math.max(Math.min(360, e), 0) | 0, this.s = th(Math.max(Math.min(1, t), 0), 3), this.v = th(Math.max(Math.min(1, i), 0), 3), this.a = th(Math.max(Math.min(1, n), 0), 3); + this._hsvaBrand = void 0, this.h = Math.max(Math.min(360, e), 0) | 0, this.s = oh(Math.max(Math.min(1, t), 0), 3), this.v = oh(Math.max(Math.min(1, i), 0), 3), this.a = oh(Math.max(Math.min(1, n), 0), 3); } static equals(e, t) { return e.h === t.h && e.s === t.s && e.v === t.v && e.a === t.a; } // from http://www.rapidtables.com/convert/color/rgb-to-hsv.htm static fromRGBA(e) { - const t = e.r / 255, i = e.g / 255, n = e.b / 255, o = Math.max(t, i, n), r = Math.min(t, i, n), l = o - r, a = o === 0 ? 0 : l / o; - let c; - return l === 0 ? c = 0 : o === t ? c = ((i - n) / l % 6 + 6) % 6 : o === i ? c = (n - t) / l + 2 : c = (t - i) / l + 4, new La(Math.round(c * 60), a, o, e.a); + const t = e.r / 255, i = e.g / 255, n = e.b / 255, o = Math.max(t, i, n), l = Math.min(t, i, n), r = o - l, c = o === 0 ? 0 : r / o; + let d; + return r === 0 ? d = 0 : o === t ? d = ((i - n) / r % 6 + 6) % 6 : o === i ? d = (n - t) / r + 2 : d = (t - i) / r + 4, new Sc(Math.round(d * 60), c, o, e.a); } // from http://www.rapidtables.com/convert/color/hsv-to-rgb.htm static toRGBA(e) { - const { h: t, s: i, v: n, a: o } = e, r = n * i, l = r * (1 - Math.abs(t / 60 % 2 - 1)), a = n - r; - let [c, d, h] = [0, 0, 0]; - return t < 60 ? (c = r, d = l) : t < 120 ? (c = l, d = r) : t < 180 ? (d = r, h = l) : t < 240 ? (d = l, h = r) : t < 300 ? (c = l, h = r) : t <= 360 && (c = r, h = l), c = Math.round((c + a) * 255), d = Math.round((d + a) * 255), h = Math.round((h + a) * 255), new lt(c, d, h, o); + const { h: t, s: i, v: n, a: o } = e, l = n * i, r = l * (1 - Math.abs(t / 60 % 2 - 1)), c = n - l; + let [d, a, h] = [0, 0, 0]; + return t < 60 ? (d = l, a = r) : t < 120 ? (d = r, a = l) : t < 180 ? (a = l, h = r) : t < 240 ? (a = r, h = l) : t < 300 ? (d = r, h = l) : t <= 360 && (d = l, h = r), d = Math.round((d + c) * 255), a = Math.round((a + c) * 255), h = Math.round((h + c) * 255), new rt(d, a, h, o); } } -var ni; -let K = (ni = class { +var si; +let Q = (si = class { static fromHex(e) { - return ni.Format.CSS.parseHex(e) || ni.red; + return si.Format.CSS.parseHex(e) || si.red; } static equals(e, t) { return !e && !t ? !0 : !e || !t ? !1 : e.equals(t); } get hsla() { - return this._hsla ? this._hsla : Vr.fromRGBA(this.rgba); + return this._hsla ? this._hsla : Jl.fromRGBA(this.rgba); } get hsva() { - return this._hsva ? this._hsva : La.fromRGBA(this.rgba); + return this._hsva ? this._hsva : Sc.fromRGBA(this.rgba); } constructor(e) { if (e) - if (e instanceof lt) + if (e instanceof rt) this.rgba = e; - else if (e instanceof Vr) - this._hsla = e, this.rgba = Vr.toRGBA(e); - else if (e instanceof La) - this._hsva = e, this.rgba = La.toRGBA(e); + else if (e instanceof Jl) + this._hsla = e, this.rgba = Jl.toRGBA(e); + else if (e instanceof Sc) + this._hsva = e, this.rgba = Sc.toRGBA(e); else throw new Error("Invalid color ctor argument"); else throw new Error("Color needs a value"); } equals(e) { - return !!e && lt.equals(this.rgba, e.rgba) && Vr.equals(this.hsla, e.hsla) && La.equals(this.hsva, e.hsva); + return !!e && rt.equals(this.rgba, e.rgba) && Jl.equals(this.hsla, e.hsla) && Sc.equals(this.hsva, e.hsva); } /** * http://www.w3.org/TR/WCAG20/#relativeluminancedef * Returns the number in the set [0, 1]. O => Darkest Black. 1 => Lightest white. */ getRelativeLuminance() { - const e = ni._relativeLuminanceForComponent(this.rgba.r), t = ni._relativeLuminanceForComponent(this.rgba.g), i = ni._relativeLuminanceForComponent(this.rgba.b), n = 0.2126 * e + 0.7152 * t + 0.0722 * i; - return th(n, 4); + const e = si._relativeLuminanceForComponent(this.rgba.r), t = si._relativeLuminanceForComponent(this.rgba.g), i = si._relativeLuminanceForComponent(this.rgba.b), n = 0.2126 * e + 0.7152 * t + 0.0722 * i; + return oh(n, 4); } static _relativeLuminanceForComponent(e) { const t = e / 255; @@ -19296,14 +19296,14 @@ let K = (ni = class { return t < i; } lighten(e) { - return new ni(new Vr(this.hsla.h, this.hsla.s, this.hsla.l + this.hsla.l * e, this.hsla.a)); + return new si(new Jl(this.hsla.h, this.hsla.s, this.hsla.l + this.hsla.l * e, this.hsla.a)); } darken(e) { - return new ni(new Vr(this.hsla.h, this.hsla.s, this.hsla.l - this.hsla.l * e, this.hsla.a)); + return new si(new Jl(this.hsla.h, this.hsla.s, this.hsla.l - this.hsla.l * e, this.hsla.a)); } transparent(e) { const { r: t, g: i, b: n, a: o } = this.rgba; - return new ni(new lt(t, i, n, o * e)); + return new si(new rt(t, i, n, o * e)); } isTransparent() { return this.rgba.a === 0; @@ -19312,16 +19312,16 @@ let K = (ni = class { return this.rgba.a === 1; } opposite() { - return new ni(new lt(255 - this.rgba.r, 255 - this.rgba.g, 255 - this.rgba.b, this.rgba.a)); + return new si(new rt(255 - this.rgba.r, 255 - this.rgba.g, 255 - this.rgba.b, this.rgba.a)); } makeOpaque(e) { if (this.isOpaque() || e.rgba.a !== 1) return this; const { r: t, g: i, b: n, a: o } = this.rgba; - return new ni(new lt(e.rgba.r - o * (e.rgba.r - t), e.rgba.g - o * (e.rgba.g - i), e.rgba.b - o * (e.rgba.b - n), 1)); + return new si(new rt(e.rgba.r - o * (e.rgba.r - t), e.rgba.g - o * (e.rgba.g - i), e.rgba.b - o * (e.rgba.b - n), 1)); } toString() { - return this._toString || (this._toString = ni.Format.CSS.format(this)), this._toString; + return this._toString || (this._toString = si.Format.CSS.format(this)), this._toString; } static getLighterColor(e, t, i) { if (e.isLighterThan(t)) @@ -19337,67 +19337,67 @@ let K = (ni = class { const n = e.getRelativeLuminance(), o = t.getRelativeLuminance(); return i = i * (n - o) / n, e.darken(i); } -}, ni.white = new ni(new lt(255, 255, 255, 1)), ni.black = new ni(new lt(0, 0, 0, 1)), ni.red = new ni(new lt(255, 0, 0, 1)), ni.blue = new ni(new lt(0, 0, 255, 1)), ni.green = new ni(new lt(0, 255, 0, 1)), ni.cyan = new ni(new lt(0, 255, 255, 1)), ni.lightgrey = new ni(new lt(211, 211, 211, 1)), ni.transparent = new ni(new lt(0, 0, 0, 0)), ni); +}, si.white = new si(new rt(255, 255, 255, 1)), si.black = new si(new rt(0, 0, 0, 1)), si.red = new si(new rt(255, 0, 0, 1)), si.blue = new si(new rt(0, 0, 255, 1)), si.green = new si(new rt(0, 255, 0, 1)), si.cyan = new si(new rt(0, 255, 255, 1)), si.lightgrey = new si(new rt(211, 211, 211, 1)), si.transparent = new si(new rt(0, 0, 0, 0)), si); (function(s) { (function(e) { (function(t) { - function i(g) { - return g.rgba.a === 1 ? `rgb(${g.rgba.r}, ${g.rgba.g}, ${g.rgba.b})` : s.Format.CSS.formatRGBA(g); + function i(m) { + return m.rgba.a === 1 ? `rgb(${m.rgba.r}, ${m.rgba.g}, ${m.rgba.b})` : s.Format.CSS.formatRGBA(m); } t.formatRGB = i; - function n(g) { - return `rgba(${g.rgba.r}, ${g.rgba.g}, ${g.rgba.b}, ${+g.rgba.a.toFixed(2)})`; + function n(m) { + return `rgba(${m.rgba.r}, ${m.rgba.g}, ${m.rgba.b}, ${+m.rgba.a.toFixed(2)})`; } t.formatRGBA = n; - function o(g) { - return g.hsla.a === 1 ? `hsl(${g.hsla.h}, ${(g.hsla.s * 100).toFixed(2)}%, ${(g.hsla.l * 100).toFixed(2)}%)` : s.Format.CSS.formatHSLA(g); + function o(m) { + return m.hsla.a === 1 ? `hsl(${m.hsla.h}, ${(m.hsla.s * 100).toFixed(2)}%, ${(m.hsla.l * 100).toFixed(2)}%)` : s.Format.CSS.formatHSLA(m); } t.formatHSL = o; - function r(g) { - return `hsla(${g.hsla.h}, ${(g.hsla.s * 100).toFixed(2)}%, ${(g.hsla.l * 100).toFixed(2)}%, ${g.hsla.a.toFixed(2)})`; + function l(m) { + return `hsla(${m.hsla.h}, ${(m.hsla.s * 100).toFixed(2)}%, ${(m.hsla.l * 100).toFixed(2)}%, ${m.hsla.a.toFixed(2)})`; } - t.formatHSLA = r; - function l(g) { - const m = g.toString(16); - return m.length !== 2 ? "0" + m : m; + t.formatHSLA = l; + function r(m) { + const b = m.toString(16); + return b.length !== 2 ? "0" + b : b; } - function a(g) { - return `#${l(g.rgba.r)}${l(g.rgba.g)}${l(g.rgba.b)}`; + function c(m) { + return `#${r(m.rgba.r)}${r(m.rgba.g)}${r(m.rgba.b)}`; } - t.formatHex = a; - function c(g, m = !1) { - return m && g.rgba.a === 1 ? s.Format.CSS.formatHex(g) : `#${l(g.rgba.r)}${l(g.rgba.g)}${l(g.rgba.b)}${l(Math.round(g.rgba.a * 255))}`; + t.formatHex = c; + function d(m, b = !1) { + return b && m.rgba.a === 1 ? s.Format.CSS.formatHex(m) : `#${r(m.rgba.r)}${r(m.rgba.g)}${r(m.rgba.b)}${r(Math.round(m.rgba.a * 255))}`; } - t.formatHexA = c; - function d(g) { - return g.isOpaque() ? s.Format.CSS.formatHex(g) : s.Format.CSS.formatRGBA(g); + t.formatHexA = d; + function a(m) { + return m.isOpaque() ? s.Format.CSS.formatHex(m) : s.Format.CSS.formatRGBA(m); } - t.format = d; - function h(g) { - const m = g.length; - if (m === 0 || g.charCodeAt(0) !== 35) + t.format = a; + function h(m) { + const b = m.length; + if (b === 0 || m.charCodeAt(0) !== 35) return null; - if (m === 7) { - const f = 16 * u(g.charCodeAt(1)) + u(g.charCodeAt(2)), b = 16 * u(g.charCodeAt(3)) + u(g.charCodeAt(4)), y = 16 * u(g.charCodeAt(5)) + u(g.charCodeAt(6)); - return new s(new lt(f, b, y, 1)); + if (b === 7) { + const g = 16 * u(m.charCodeAt(1)) + u(m.charCodeAt(2)), Z = 16 * u(m.charCodeAt(3)) + u(m.charCodeAt(4)), f = 16 * u(m.charCodeAt(5)) + u(m.charCodeAt(6)); + return new s(new rt(g, Z, f, 1)); } - if (m === 9) { - const f = 16 * u(g.charCodeAt(1)) + u(g.charCodeAt(2)), b = 16 * u(g.charCodeAt(3)) + u(g.charCodeAt(4)), y = 16 * u(g.charCodeAt(5)) + u(g.charCodeAt(6)), w = 16 * u(g.charCodeAt(7)) + u(g.charCodeAt(8)); - return new s(new lt(f, b, y, w / 255)); + if (b === 9) { + const g = 16 * u(m.charCodeAt(1)) + u(m.charCodeAt(2)), Z = 16 * u(m.charCodeAt(3)) + u(m.charCodeAt(4)), f = 16 * u(m.charCodeAt(5)) + u(m.charCodeAt(6)), y = 16 * u(m.charCodeAt(7)) + u(m.charCodeAt(8)); + return new s(new rt(g, Z, f, y / 255)); } - if (m === 4) { - const f = u(g.charCodeAt(1)), b = u(g.charCodeAt(2)), y = u(g.charCodeAt(3)); - return new s(new lt(16 * f + f, 16 * b + b, 16 * y + y)); + if (b === 4) { + const g = u(m.charCodeAt(1)), Z = u(m.charCodeAt(2)), f = u(m.charCodeAt(3)); + return new s(new rt(16 * g + g, 16 * Z + Z, 16 * f + f)); } - if (m === 5) { - const f = u(g.charCodeAt(1)), b = u(g.charCodeAt(2)), y = u(g.charCodeAt(3)), w = u(g.charCodeAt(4)); - return new s(new lt(16 * f + f, 16 * b + b, 16 * y + y, (16 * w + w) / 255)); + if (b === 5) { + const g = u(m.charCodeAt(1)), Z = u(m.charCodeAt(2)), f = u(m.charCodeAt(3)), y = u(m.charCodeAt(4)); + return new s(new rt(16 * g + g, 16 * Z + Z, 16 * f + f, (16 * y + y) / 255)); } return null; } t.parseHex = h; - function u(g) { - switch (g) { + function u(m) { + switch (m) { case 48: return 0; case 49: @@ -19447,35 +19447,35 @@ let K = (ni = class { } })(e.CSS || (e.CSS = {})); })(s.Format || (s.Format = {})); -})(K || (K = {})); -function DE(s) { +})(Q || (Q = {})); +function sJ(s) { return `--vscode-${s.replace(/\./g, "-")}`; } -function de(s) { - return `var(${DE(s)})`; +function ae(s) { + return `var(${sJ(s)})`; } -function Iie(s, e) { - return `var(${DE(s)}, ${e})`; +function Wne(s, e) { + return `var(${sJ(s)}, ${e})`; } -function Nie(s) { +function Gne(s) { return s !== null && typeof s == "object" && "light" in s && "dark" in s; } -const JJ = { +const R_ = { ColorContribution: "base.contributions.colors" -}, Wie = "default"; -class vie { +}, Xne = "default"; +class Vne { constructor() { this._onDidChangeSchema = new k(), this.onDidChangeSchema = this._onDidChangeSchema.event, this.colorSchema = { type: "object", properties: {} }, this.colorReferenceSchema = { type: "string", enum: [], enumDescriptions: [] }, this.colorsById = {}; } registerColor(e, t, i, n = !1, o) { - const r = { id: e, description: i, defaults: t, needsTransparency: n, deprecationMessage: o }; - this.colorsById[e] = r; - const l = { type: "string", format: "color-hex", defaultSnippets: [{ body: "${1:#ff0000}" }] }; - return o && (l.deprecationMessage = o), n && (l.pattern = "^#(?:(?[0-9a-fA-f]{3}[0-9a-eA-E])|(?:[0-9a-fA-F]{6}(?:(?![fF]{2})(?:[0-9a-fA-F]{2}))))?$", l.patternErrorMessage = p("transparecyRequired", "This color must be transparent or it will obscure content")), this.colorSchema.properties[e] = { + const l = { id: e, description: i, defaults: t, needsTransparency: n, deprecationMessage: o }; + this.colorsById[e] = l; + const r = { type: "string", format: "color-hex", defaultSnippets: [{ body: "${1:#ff0000}" }] }; + return o && (r.deprecationMessage = o), n && (r.pattern = "^#(?:(?[0-9a-fA-f]{3}[0-9a-eA-E])|(?:[0-9a-fA-F]{6}(?:(?![fF]{2})(?:[0-9a-fA-F]{2}))))?$", r.patternErrorMessage = p("transparecyRequired", "This color must be transparent or it will obscure content")), this.colorSchema.properties[e] = { description: i, oneOf: [ - l, - { type: "string", const: Wie, description: p("useDefault", "Use the default color.") } + r, + { type: "string", const: Xne, description: p("useDefault", "Use the default color.") } ] }, this.colorReferenceSchema.enum.push(e), this.colorReferenceSchema.enumDescriptions.push(i), this._onDidChangeSchema.fire(), e; } @@ -19485,8 +19485,8 @@ class vie { resolveDefaultColor(e, t) { const i = this.colorsById[e]; if (i != null && i.defaults) { - const n = Nie(i.defaults) ? i.defaults[t.type] : i.defaults; - return sl(n, t); + const n = Gne(i.defaults) ? i.defaults[t.type] : i.defaults; + return rr(n, t); } } getColorSchema() { @@ -19501,232 +19501,232 @@ class vie { `); } } -const tI = new vie(); -Di.add(JJ.ColorContribution, tI); -function N(s, e, t, i, n) { - return tI.registerColor(s, e, t, i, n); +const gx = new Vne(); +ki.add(R_.ColorContribution, gx); +function R(s, e, t, i, n) { + return gx.registerColor(s, e, t, i, n); } -function Tie(s, e) { +function Lne(s, e) { var t, i, n, o; switch (s.op) { case 0: - return (t = sl(s.value, e)) == null ? void 0 : t.darken(s.factor); + return (t = rr(s.value, e)) == null ? void 0 : t.darken(s.factor); case 1: - return (i = sl(s.value, e)) == null ? void 0 : i.lighten(s.factor); + return (i = rr(s.value, e)) == null ? void 0 : i.lighten(s.factor); case 2: - return (n = sl(s.value, e)) == null ? void 0 : n.transparent(s.factor); + return (n = rr(s.value, e)) == null ? void 0 : n.transparent(s.factor); case 3: { - const r = sl(s.background, e); - return r ? (o = sl(s.value, e)) == null ? void 0 : o.makeOpaque(r) : sl(s.value, e); + const l = rr(s.background, e); + return l ? (o = rr(s.value, e)) == null ? void 0 : o.makeOpaque(l) : rr(s.value, e); } case 4: - for (const r of s.values) { - const l = sl(r, e); - if (l) - return l; + for (const l of s.values) { + const r = rr(l, e); + if (r) + return r; } return; case 6: - return sl(e.defines(s.if) ? s.then : s.else, e); + return rr(e.defines(s.if) ? s.then : s.else, e); case 5: { - const r = sl(s.value, e); - if (!r) + const l = rr(s.value, e); + if (!l) return; - const l = sl(s.background, e); - return l ? r.isDarkerThan(l) ? K.getLighterColor(r, l, s.factor).transparent(s.transparency) : K.getDarkerColor(r, l, s.factor).transparent(s.transparency) : r.transparent(s.factor * s.transparency); + const r = rr(s.background, e); + return r ? l.isDarkerThan(r) ? Q.getLighterColor(l, r, s.factor).transparent(s.transparency) : Q.getDarkerColor(l, r, s.factor).transparent(s.transparency) : l.transparent(s.factor * s.transparency); } default: - throw B_(); + throw ox(); } } -function Em(s, e) { +function Ab(s, e) { return { op: 0, value: s, factor: e }; } -function Zl(s, e) { +function Nr(s, e) { return { op: 1, value: s, factor: e }; } -function Pe(s, e) { +function Ae(s, e) { return { op: 2, value: s, factor: e }; } -function Pw(...s) { +function tW(...s) { return { op: 4, values: s }; } -function Die(s, e, t) { +function Ine(s, e, t) { return { op: 6, if: s, then: e, else: t }; } -function DF(s, e, t, i) { +function sF(s, e, t, i) { return { op: 5, value: s, background: e, factor: t, transparency: i }; } -function sl(s, e) { +function rr(s, e) { if (s !== null) { if (typeof s == "string") - return s[0] === "#" ? K.fromHex(s) : e.getColor(s); - if (s instanceof K) + return s[0] === "#" ? Q.fromHex(s) : e.getColor(s); + if (s instanceof Q) return s; if (typeof s == "object") - return Tie(s, e); + return Lne(s, e); } } -const UJ = "vscode://schemas/workbench-colors", KJ = Di.as(Q_.JSONContribution); -KJ.registerSchema(UJ, tI.getColorSchema()); -const VF = new Zt(() => KJ.notifySchemaChanged(UJ), 200); -tI.onDidChangeSchema(() => { - VF.isScheduled() || VF.schedule(); +const N_ = "vscode://schemas/workbench-colors", w_ = ki.as(hx.JSONContribution); +w_.registerSchema(N_, gx.getColorSchema()); +const oF = new St(() => w_.notifySchemaChanged(N_), 200); +gx.onDidChangeSchema(() => { + oF.isScheduled() || oF.schedule(); }); -const Je = N("foreground", { dark: "#CCCCCC", light: "#616161", hcDark: "#FFFFFF", hcLight: "#292929" }, p("foreground", "Overall foreground color. This color is only used if not overridden by a component.")); -N("disabledForeground", { dark: "#CCCCCC80", light: "#61616180", hcDark: "#A5A5A5", hcLight: "#7F7F7F" }, p("disabledForeground", "Overall foreground for disabled elements. This color is only used if not overridden by a component.")); -N("errorForeground", { dark: "#F48771", light: "#A1260D", hcDark: "#F48771", hcLight: "#B5200D" }, p("errorForeground", "Overall foreground color for error messages. This color is only used if not overridden by a component.")); -N("descriptionForeground", { light: "#717171", dark: Pe(Je, 0.7), hcDark: Pe(Je, 0.7), hcLight: Pe(Je, 0.7) }, p("descriptionForeground", "Foreground color for description text providing additional information, for example for a label.")); -const MA = N("icon.foreground", { dark: "#C5C5C5", light: "#424242", hcDark: "#FFFFFF", hcLight: "#292929" }, p("iconForeground", "The default color for icons in the workbench.")), Ta = N("focusBorder", { dark: "#007FD4", light: "#0090F1", hcDark: "#F38518", hcLight: "#006BBD" }, p("focusBorder", "Overall border color for focused elements. This color is only used if not overridden by a component.")), rt = N("contrastBorder", { light: null, dark: null, hcDark: "#6FC3DF", hcLight: "#0F4A85" }, p("contrastBorder", "An extra border around elements to separate them from others for greater contrast.")), Ut = N("contrastActiveBorder", { light: null, dark: null, hcDark: Ta, hcLight: Ta }, p("activeContrastBorder", "An extra border around active elements to separate them from others for greater contrast.")); -N("selection.background", null, p("selectionBackground", "The background color of text selections in the workbench (e.g. for input fields or text areas). Note that this does not apply to selections within the editor.")); -const Vie = N("textLink.foreground", { light: "#006AB1", dark: "#3794FF", hcDark: "#21A6FF", hcLight: "#0F4A85" }, p("textLinkForeground", "Foreground color for links in text.")); -N("textLink.activeForeground", { light: "#006AB1", dark: "#3794FF", hcDark: "#21A6FF", hcLight: "#0F4A85" }, p("textLinkActiveForeground", "Foreground color for links in text when clicked on and on mouse hover.")); -N("textSeparator.foreground", { light: "#0000002e", dark: "#ffffff2e", hcDark: K.black, hcLight: "#292929" }, p("textSeparatorForeground", "Color for text separators.")); -N("textPreformat.foreground", { light: "#A31515", dark: "#D7BA7D", hcDark: "#000000", hcLight: "#FFFFFF" }, p("textPreformatForeground", "Foreground color for preformatted text segments.")); -N("textPreformat.background", { light: "#0000001A", dark: "#FFFFFF1A", hcDark: "#FFFFFF", hcLight: "#09345f" }, p("textPreformatBackground", "Background color for preformatted text segments.")); -N("textBlockQuote.background", { light: "#f2f2f2", dark: "#222222", hcDark: null, hcLight: "#F2F2F2" }, p("textBlockQuoteBackground", "Background color for block quotes in text.")); -N("textBlockQuote.border", { light: "#007acc80", dark: "#007acc80", hcDark: K.white, hcLight: "#292929" }, p("textBlockQuoteBorder", "Border color for block quotes in text.")); -N("textCodeBlock.background", { light: "#dcdcdc66", dark: "#0a0a0a66", hcDark: K.black, hcLight: "#F2F2F2" }, p("textCodeBlockBackground", "Background color for code blocks in text.")); -N("sash.hoverBorder", Ta, p("sashActiveBorder", "Border color of active sashes.")); -const wL = N("badge.background", { dark: "#4D4D4D", light: "#C4C4C4", hcDark: K.black, hcLight: "#0F4A85" }, p("badgeBackground", "Badge background color. Badges are small information labels, e.g. for search results count.")), kie = N("badge.foreground", { dark: K.white, light: "#333", hcDark: K.white, hcLight: K.white }, p("badgeForeground", "Badge foreground color. Badges are small information labels, e.g. for search results count.")), VE = N("scrollbar.shadow", { dark: "#000000", light: "#DDDDDD", hcDark: null, hcLight: null }, p("scrollbarShadow", "Scrollbar shadow to indicate that the view is scrolled.")), QJ = N("scrollbarSlider.background", { dark: K.fromHex("#797979").transparent(0.4), light: K.fromHex("#646464").transparent(0.4), hcDark: Pe(rt, 0.6), hcLight: Pe(rt, 0.4) }, p("scrollbarSliderBackground", "Scrollbar slider background color.")), jJ = N("scrollbarSlider.hoverBackground", { dark: K.fromHex("#646464").transparent(0.7), light: K.fromHex("#646464").transparent(0.7), hcDark: Pe(rt, 0.8), hcLight: Pe(rt, 0.8) }, p("scrollbarSliderHoverBackground", "Scrollbar slider background color when hovering.")), qJ = N("scrollbarSlider.activeBackground", { dark: K.fromHex("#BFBFBF").transparent(0.4), light: K.fromHex("#000000").transparent(0.6), hcDark: rt, hcLight: rt }, p("scrollbarSliderActiveBackground", "Scrollbar slider background color when clicked on.")), Gie = N("progressBar.background", { dark: K.fromHex("#0E70C0"), light: K.fromHex("#0E70C0"), hcDark: rt, hcLight: rt }, p("progressBarBackground", "Background color of the progress bar that can show for long running operations.")), Hr = N("editor.background", { light: "#ffffff", dark: "#1E1E1E", hcDark: K.black, hcLight: K.white }, p("editorBackground", "Editor background color.")), Ya = N("editor.foreground", { light: "#333333", dark: "#BBBBBB", hcDark: K.white, hcLight: Je }, p("editorForeground", "Editor default foreground color.")); -N("editorStickyScroll.background", Hr, p("editorStickyScrollBackground", "Background color of sticky scroll in the editor")); -N("editorStickyScrollHover.background", { dark: "#2A2D2E", light: "#F0F0F0", hcDark: null, hcLight: K.fromHex("#0F4A85").transparent(0.1) }, p("editorStickyScrollHoverBackground", "Background color of sticky scroll on hover in the editor")); -N("editorStickyScroll.border", { dark: null, light: null, hcDark: rt, hcLight: rt }, p("editorStickyScrollBorder", "Border color of sticky scroll in the editor")); -N("editorStickyScroll.shadow", VE, p("editorStickyScrollShadow", " Shadow color of sticky scroll in the editor")); -const Xo = N("editorWidget.background", { dark: "#252526", light: "#F3F3F3", hcDark: "#0C141F", hcLight: K.white }, p("editorWidgetBackground", "Background color of editor widgets, such as find/replace.")), iI = N("editorWidget.foreground", Je, p("editorWidgetForeground", "Foreground color of editor widgets, such as find/replace.")), kE = N("editorWidget.border", { dark: "#454545", light: "#C8C8C8", hcDark: rt, hcLight: rt }, p("editorWidgetBorder", "Border color of editor widgets. The color is only used if the widget chooses to have a border and if the color is not overridden by a widget.")); -N("editorWidget.resizeBorder", null, p("editorWidgetResizeBorder", "Border color of the resize bar of editor widgets. The color is only used if the widget chooses to have a resize border and if the color is not overridden by a widget.")); -N("editorError.background", null, p("editorError.background", "Background color of error text in the editor. The color must not be opaque so as not to hide underlying decorations."), !0); -const nI = N("editorError.foreground", { dark: "#F14C4C", light: "#E51400", hcDark: "#F48771", hcLight: "#B5200D" }, p("editorError.foreground", "Foreground color of error squigglies in the editor.")), Rie = N("editorError.border", { dark: null, light: null, hcDark: K.fromHex("#E47777").transparent(0.8), hcLight: "#B5200D" }, p("errorBorder", "If set, color of double underlines for errors in the editor.")), Eie = N("editorWarning.background", null, p("editorWarning.background", "Background color of warning text in the editor. The color must not be opaque so as not to hide underlying decorations."), !0), Jc = N("editorWarning.foreground", { dark: "#CCA700", light: "#BF8803", hcDark: "#FFD370", hcLight: "#895503" }, p("editorWarning.foreground", "Foreground color of warning squigglies in the editor.")), Bw = N("editorWarning.border", { dark: null, light: null, hcDark: K.fromHex("#FFCC00").transparent(0.8), hcLight: K.fromHex("#FFCC00").transparent(0.8) }, p("warningBorder", "If set, color of double underlines for warnings in the editor.")); -N("editorInfo.background", null, p("editorInfo.background", "Background color of info text in the editor. The color must not be opaque so as not to hide underlying decorations."), !0); -const Da = N("editorInfo.foreground", { dark: "#3794FF", light: "#1a85ff", hcDark: "#3794FF", hcLight: "#1a85ff" }, p("editorInfo.foreground", "Foreground color of info squigglies in the editor.")), Ow = N("editorInfo.border", { dark: null, light: null, hcDark: K.fromHex("#3794FF").transparent(0.8), hcLight: "#292929" }, p("infoBorder", "If set, color of double underlines for infos in the editor.")), Xie = N("editorHint.foreground", { dark: K.fromHex("#eeeeee").transparent(0.7), light: "#6c6c6c", hcDark: null, hcLight: null }, p("editorHint.foreground", "Foreground color of hint squigglies in the editor.")); -N("editorHint.border", { dark: null, light: null, hcDark: K.fromHex("#eeeeee").transparent(0.8), hcLight: "#292929" }, p("hintBorder", "If set, color of double underlines for hints in the editor.")); -const Fie = N("editorLink.activeForeground", { dark: "#4E94CE", light: K.blue, hcDark: K.cyan, hcLight: "#292929" }, p("activeLinkForeground", "Color of active links.")), Yd = N("editor.selectionBackground", { light: "#ADD6FF", dark: "#264F78", hcDark: "#f3f518", hcLight: "#0F4A85" }, p("editorSelectionBackground", "Color of the editor selection.")), Yie = N("editor.selectionForeground", { light: null, dark: null, hcDark: "#000000", hcLight: K.white }, p("editorSelectionForeground", "Color of the selected text for high contrast.")), $J = N("editor.inactiveSelectionBackground", { light: Pe(Yd, 0.5), dark: Pe(Yd, 0.5), hcDark: Pe(Yd, 0.7), hcLight: Pe(Yd, 0.5) }, p("editorInactiveSelection", "Color of the selection in an inactive editor. The color must not be opaque so as not to hide underlying decorations."), !0), GE = N("editor.selectionHighlightBackground", { light: DF(Yd, Hr, 0.3, 0.6), dark: DF(Yd, Hr, 0.3, 0.6), hcDark: null, hcLight: null }, p("editorSelectionHighlight", "Color for regions with the same content as the selection. The color must not be opaque so as not to hide underlying decorations."), !0); -N("editor.selectionHighlightBorder", { light: null, dark: null, hcDark: Ut, hcLight: Ut }, p("editorSelectionHighlightBorder", "Border color for regions with the same content as the selection.")); -N("editor.findMatchBackground", { light: "#A8AC94", dark: "#515C6A", hcDark: null, hcLight: null }, p("editorFindMatch", "Color of the current search match.")); -const zie = N("editor.findMatchForeground", null, p("editorFindMatchForeground", "Text color of the current search match.")), xc = N("editor.findMatchHighlightBackground", { light: "#EA5C0055", dark: "#EA5C0055", hcDark: null, hcLight: null }, p("findMatchHighlight", "Color of the other search matches. The color must not be opaque so as not to hide underlying decorations."), !0), Pie = N("editor.findMatchHighlightForeground", null, p("findMatchHighlightForeground", "Foreground color of the other search matches."), !0); -N("editor.findRangeHighlightBackground", { dark: "#3a3d4166", light: "#b4b4b44d", hcDark: null, hcLight: null }, p("findRangeHighlight", "Color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations."), !0); -N("editor.findMatchBorder", { light: null, dark: null, hcDark: Ut, hcLight: Ut }, p("editorFindMatchBorder", "Border color of the current search match.")); -const zd = N("editor.findMatchHighlightBorder", { light: null, dark: null, hcDark: Ut, hcLight: Ut }, p("findMatchHighlightBorder", "Border color of the other search matches.")), Bie = N("editor.findRangeHighlightBorder", { dark: null, light: null, hcDark: Pe(Ut, 0.4), hcLight: Pe(Ut, 0.4) }, p("findRangeHighlightBorder", "Border color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations."), !0); -N("editor.hoverHighlightBackground", { light: "#ADD6FF26", dark: "#264f7840", hcDark: "#ADD6FF26", hcLight: null }, p("hoverHighlight", "Highlight below the word for which a hover is shown. The color must not be opaque so as not to hide underlying decorations."), !0); -const ZA = N("editorHoverWidget.background", Xo, p("hoverBackground", "Background color of the editor hover.")); -N("editorHoverWidget.foreground", iI, p("hoverForeground", "Foreground color of the editor hover.")); -const eU = N("editorHoverWidget.border", kE, p("hoverBorder", "Border color of the editor hover.")); -N("editorHoverWidget.statusBarBackground", { dark: Zl(ZA, 0.2), light: Em(ZA, 0.05), hcDark: Xo, hcLight: Xo }, p("statusBarBackground", "Background color of the editor hover status bar.")); -const RE = N("editorInlayHint.foreground", { dark: "#969696", light: "#969696", hcDark: K.white, hcLight: K.black }, p("editorInlayHintForeground", "Foreground color of inline hints")), EE = N("editorInlayHint.background", { dark: Pe(wL, 0.1), light: Pe(wL, 0.1), hcDark: Pe(K.white, 0.1), hcLight: Pe(wL, 0.1) }, p("editorInlayHintBackground", "Background color of inline hints")), Oie = N("editorInlayHint.typeForeground", RE, p("editorInlayHintForegroundTypes", "Foreground color of inline hints for types")), Hie = N("editorInlayHint.typeBackground", EE, p("editorInlayHintBackgroundTypes", "Background color of inline hints for types")), Jie = N("editorInlayHint.parameterForeground", RE, p("editorInlayHintForegroundParameter", "Foreground color of inline hints for parameters")), Uie = N("editorInlayHint.parameterBackground", EE, p("editorInlayHintBackgroundParameter", "Background color of inline hints for parameters")), Kie = N("editorLightBulb.foreground", { dark: "#FFCC00", light: "#DDB100", hcDark: "#FFCC00", hcLight: "#007ACC" }, p("editorLightBulbForeground", "The color used for the lightbulb actions icon.")); -N("editorLightBulbAutoFix.foreground", { dark: "#75BEFF", light: "#007ACC", hcDark: "#75BEFF", hcLight: "#007ACC" }, p("editorLightBulbAutoFixForeground", "The color used for the lightbulb auto fix actions icon.")); -N("editorLightBulbAi.foreground", Kie, p("editorLightBulbAiForeground", "The color used for the lightbulb AI icon.")); -N("editor.snippetTabstopHighlightBackground", { dark: new K(new lt(124, 124, 124, 0.3)), light: new K(new lt(10, 50, 100, 0.2)), hcDark: new K(new lt(124, 124, 124, 0.3)), hcLight: new K(new lt(10, 50, 100, 0.2)) }, p("snippetTabstopHighlightBackground", "Highlight background color of a snippet tabstop.")); -N("editor.snippetTabstopHighlightBorder", null, p("snippetTabstopHighlightBorder", "Highlight border color of a snippet tabstop.")); -N("editor.snippetFinalTabstopHighlightBackground", null, p("snippetFinalTabstopHighlightBackground", "Highlight background color of the final tabstop of a snippet.")); -N("editor.snippetFinalTabstopHighlightBorder", { dark: "#525252", light: new K(new lt(10, 50, 100, 0.5)), hcDark: "#525252", hcLight: "#292929" }, p("snippetFinalTabstopHighlightBorder", "Highlight border color of the final tabstop of a snippet.")); -const $2 = new K(new lt(155, 185, 85, 0.2)), ev = new K(new lt(255, 0, 0, 0.2)), Qie = N("diffEditor.insertedTextBackground", { dark: "#9ccc2c33", light: "#9ccc2c40", hcDark: null, hcLight: null }, p("diffEditorInserted", "Background color for text that got inserted. The color must not be opaque so as not to hide underlying decorations."), !0), jie = N("diffEditor.removedTextBackground", { dark: "#ff000033", light: "#ff000033", hcDark: null, hcLight: null }, p("diffEditorRemoved", "Background color for text that got removed. The color must not be opaque so as not to hide underlying decorations."), !0); -N("diffEditor.insertedLineBackground", { dark: $2, light: $2, hcDark: null, hcLight: null }, p("diffEditorInsertedLines", "Background color for lines that got inserted. The color must not be opaque so as not to hide underlying decorations."), !0); -N("diffEditor.removedLineBackground", { dark: ev, light: ev, hcDark: null, hcLight: null }, p("diffEditorRemovedLines", "Background color for lines that got removed. The color must not be opaque so as not to hide underlying decorations."), !0); -N("diffEditorGutter.insertedLineBackground", null, p("diffEditorInsertedLineGutter", "Background color for the margin where lines got inserted.")); -N("diffEditorGutter.removedLineBackground", null, p("diffEditorRemovedLineGutter", "Background color for the margin where lines got removed.")); -const qie = N("diffEditorOverview.insertedForeground", null, p("diffEditorOverviewInserted", "Diff overview ruler foreground for inserted content.")), $ie = N("diffEditorOverview.removedForeground", null, p("diffEditorOverviewRemoved", "Diff overview ruler foreground for removed content.")); -N("diffEditor.insertedTextBorder", { dark: null, light: null, hcDark: "#33ff2eff", hcLight: "#374E06" }, p("diffEditorInsertedOutline", "Outline color for the text that got inserted.")); -N("diffEditor.removedTextBorder", { dark: null, light: null, hcDark: "#FF008F", hcLight: "#AD0707" }, p("diffEditorRemovedOutline", "Outline color for text that got removed.")); -N("diffEditor.border", { dark: null, light: null, hcDark: rt, hcLight: rt }, p("diffEditorBorder", "Border color between the two text editors.")); -N("diffEditor.diagonalFill", { dark: "#cccccc33", light: "#22222233", hcDark: null, hcLight: null }, p("diffDiagonalFill", "Color of the diff editor's diagonal fill. The diagonal fill is used in side-by-side diff views.")); -N("diffEditor.unchangedRegionBackground", "sideBar.background", p("diffEditor.unchangedRegionBackground", "The background color of unchanged blocks in the diff editor.")); -N("diffEditor.unchangedRegionForeground", "foreground", p("diffEditor.unchangedRegionForeground", "The foreground color of unchanged blocks in the diff editor.")); -N("diffEditor.unchangedCodeBackground", { dark: "#74747429", light: "#b8b8b829", hcDark: null, hcLight: null }, p("diffEditor.unchangedCodeBackground", "The background color of unchanged code in the diff editor.")); -const s0 = N("widget.shadow", { dark: Pe(K.black, 0.36), light: Pe(K.black, 0.16), hcDark: null, hcLight: null }, p("widgetShadow", "Shadow color of widgets such as find/replace inside the editor.")), tU = N("widget.border", { dark: null, light: null, hcDark: rt, hcLight: rt }, p("widgetBorder", "Border color of widgets such as find/replace inside the editor.")), kF = N("toolbar.hoverBackground", { dark: "#5a5d5e50", light: "#b8b8b850", hcDark: null, hcLight: null }, p("toolbarHoverBackground", "Toolbar background when hovering over actions using the mouse")); -N("toolbar.hoverOutline", { dark: null, light: null, hcDark: Ut, hcLight: Ut }, p("toolbarHoverOutline", "Toolbar outline when hovering over actions using the mouse")); -N("toolbar.activeBackground", { dark: Zl(kF, 0.1), light: Em(kF, 0.1), hcDark: null, hcLight: null }, p("toolbarActiveBackground", "Toolbar background when holding the mouse over actions")); -const ene = N("breadcrumb.foreground", Pe(Je, 0.8), p("breadcrumbsFocusForeground", "Color of focused breadcrumb items.")), tne = N("breadcrumb.background", Hr, p("breadcrumbsBackground", "Background color of breadcrumb items.")), GF = N("breadcrumb.focusForeground", { light: Em(Je, 0.2), dark: Zl(Je, 0.1), hcDark: Zl(Je, 0.1), hcLight: Zl(Je, 0.1) }, p("breadcrumbsFocusForeground", "Color of focused breadcrumb items.")), ine = N("breadcrumb.activeSelectionForeground", { light: Em(Je, 0.2), dark: Zl(Je, 0.1), hcDark: Zl(Je, 0.1), hcLight: Zl(Je, 0.1) }, p("breadcrumbsSelectedForeground", "Color of selected breadcrumb items.")); -N("breadcrumbPicker.background", Xo, p("breadcrumbsSelectedBackground", "Background color of breadcrumb item picker.")); -const iU = 0.5, RF = K.fromHex("#40C8AE").transparent(iU), EF = K.fromHex("#40A6FF").transparent(iU), XF = K.fromHex("#606060").transparent(0.4), XE = 0.4, hb = 1, tv = N("merge.currentHeaderBackground", { dark: RF, light: RF, hcDark: null, hcLight: null }, p("mergeCurrentHeaderBackground", "Current header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), !0); -N("merge.currentContentBackground", Pe(tv, XE), p("mergeCurrentContentBackground", "Current content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), !0); -const iv = N("merge.incomingHeaderBackground", { dark: EF, light: EF, hcDark: null, hcLight: null }, p("mergeIncomingHeaderBackground", "Incoming header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), !0); -N("merge.incomingContentBackground", Pe(iv, XE), p("mergeIncomingContentBackground", "Incoming content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), !0); -const nv = N("merge.commonHeaderBackground", { dark: XF, light: XF, hcDark: null, hcLight: null }, p("mergeCommonHeaderBackground", "Common ancestor header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), !0); -N("merge.commonContentBackground", Pe(nv, XE), p("mergeCommonContentBackground", "Common ancestor content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), !0); -const ub = N("merge.border", { dark: null, light: null, hcDark: "#C3DF6F", hcLight: "#007ACC" }, p("mergeBorder", "Border color on headers and the splitter in inline merge-conflicts.")); -N("editorOverviewRuler.currentContentForeground", { dark: Pe(tv, hb), light: Pe(tv, hb), hcDark: ub, hcLight: ub }, p("overviewRulerCurrentContentForeground", "Current overview ruler foreground for inline merge-conflicts.")); -N("editorOverviewRuler.incomingContentForeground", { dark: Pe(iv, hb), light: Pe(iv, hb), hcDark: ub, hcLight: ub }, p("overviewRulerIncomingContentForeground", "Incoming overview ruler foreground for inline merge-conflicts.")); -N("editorOverviewRuler.commonContentForeground", { dark: Pe(nv, hb), light: Pe(nv, hb), hcDark: ub, hcLight: ub }, p("overviewRulerCommonContentForeground", "Common ancestor overview ruler foreground for inline merge-conflicts.")); -const YN = N("editorOverviewRuler.findMatchForeground", { dark: "#d186167e", light: "#d186167e", hcDark: "#AB5A00", hcLight: "#AB5A00" }, p("overviewRulerFindMatchForeground", "Overview ruler marker color for find matches. The color must not be opaque so as not to hide underlying decorations."), !0), nU = N("editorOverviewRuler.selectionHighlightForeground", "#A0A0A0CC", p("overviewRulerSelectionHighlightForeground", "Overview ruler marker color for selection highlights. The color must not be opaque so as not to hide underlying decorations."), !0), nne = N("problemsErrorIcon.foreground", nI, p("problemsErrorIconForeground", "The color used for the problems error icon.")), sne = N("problemsWarningIcon.foreground", Jc, p("problemsWarningIconForeground", "The color used for the problems warning icon.")), one = N("problemsInfoIcon.foreground", Da, p("problemsInfoIconForeground", "The color used for the problems info icon.")), sv = N("minimap.findMatchHighlight", { light: "#d18616", dark: "#d18616", hcDark: "#AB5A00", hcLight: "#0F4A85" }, p("minimapFindMatchHighlight", "Minimap marker color for find matches."), !0), sI = N("minimap.selectionOccurrenceHighlight", { light: "#c9c9c9", dark: "#676767", hcDark: "#ffffff", hcLight: "#0F4A85" }, p("minimapSelectionOccurrenceHighlight", "Minimap marker color for repeating editor selections."), !0), FF = N("minimap.selectionHighlight", { light: "#ADD6FF", dark: "#264F78", hcDark: "#ffffff", hcLight: "#0F4A85" }, p("minimapSelectionHighlight", "Minimap marker color for the editor selection."), !0), rne = N("minimap.infoHighlight", { dark: Da, light: Da, hcDark: Ow, hcLight: Ow }, p("minimapInfo", "Minimap marker color for infos.")), lne = N("minimap.warningHighlight", { dark: Jc, light: Jc, hcDark: Bw, hcLight: Bw }, p("overviewRuleWarning", "Minimap marker color for warnings.")), ane = N("minimap.errorHighlight", { dark: new K(new lt(255, 18, 18, 0.7)), light: new K(new lt(255, 18, 18, 0.7)), hcDark: new K(new lt(255, 50, 50, 1)), hcLight: "#B5200D" }, p("minimapError", "Minimap marker color for errors.")), cne = N("minimap.background", null, p("minimapBackground", "Minimap background color.")), dne = N("minimap.foregroundOpacity", K.fromHex("#000f"), p("minimapForegroundOpacity", 'Opacity of foreground elements rendered in the minimap. For example, "#000000c0" will render the elements with 75% opacity.')); -N("minimapSlider.background", Pe(QJ, 0.5), p("minimapSliderBackground", "Minimap slider background color.")); -N("minimapSlider.hoverBackground", Pe(jJ, 0.5), p("minimapSliderHoverBackground", "Minimap slider background color when hovering.")); -N("minimapSlider.activeBackground", Pe(qJ, 0.5), p("minimapSliderActiveBackground", "Minimap slider background color when clicked on.")); -N("charts.foreground", Je, p("chartsForeground", "The foreground color used in charts.")); -N("charts.lines", Pe(Je, 0.5), p("chartsLines", "The color used for horizontal lines in charts.")); -N("charts.red", nI, p("chartsRed", "The red color used in chart visualizations.")); -N("charts.blue", Da, p("chartsBlue", "The blue color used in chart visualizations.")); -N("charts.yellow", Jc, p("chartsYellow", "The yellow color used in chart visualizations.")); -N("charts.orange", sv, p("chartsOrange", "The orange color used in chart visualizations.")); -N("charts.green", { dark: "#89D185", light: "#388A34", hcDark: "#89D185", hcLight: "#374e06" }, p("chartsGreen", "The green color used in chart visualizations.")); -N("charts.purple", { dark: "#B180D7", light: "#652D90", hcDark: "#B180D7", hcLight: "#652D90" }, p("chartsPurple", "The purple color used in chart visualizations.")); -const ov = N("input.background", { dark: "#3C3C3C", light: K.white, hcDark: K.black, hcLight: K.white }, p("inputBoxBackground", "Input box background.")), sU = N("input.foreground", Je, p("inputBoxForeground", "Input box foreground.")), oU = N("input.border", { dark: null, light: null, hcDark: rt, hcLight: rt }, p("inputBoxBorder", "Input box border.")), oI = N("inputOption.activeBorder", { dark: "#007ACC", light: "#007ACC", hcDark: rt, hcLight: rt }, p("inputBoxActiveOptionBorder", "Border color of activated options in input fields.")), hne = N("inputOption.hoverBackground", { dark: "#5a5d5e80", light: "#b8b8b850", hcDark: null, hcLight: null }, p("inputOption.hoverBackground", "Background color of activated options in input fields.")), bC = N("inputOption.activeBackground", { dark: Pe(Ta, 0.4), light: Pe(Ta, 0.2), hcDark: K.transparent, hcLight: K.transparent }, p("inputOption.activeBackground", "Background hover color of options in input fields.")), rI = N("inputOption.activeForeground", { dark: K.white, light: K.black, hcDark: Je, hcLight: Je }, p("inputOption.activeForeground", "Foreground color of activated options in input fields.")); -N("input.placeholderForeground", { light: Pe(Je, 0.5), dark: Pe(Je, 0.5), hcDark: Pe(Je, 0.7), hcLight: Pe(Je, 0.7) }, p("inputPlaceholderForeground", "Input box foreground color for placeholder text.")); -const une = N("inputValidation.infoBackground", { dark: "#063B49", light: "#D6ECF2", hcDark: K.black, hcLight: K.white }, p("inputValidationInfoBackground", "Input validation background color for information severity.")), gne = N("inputValidation.infoForeground", { dark: null, light: null, hcDark: null, hcLight: Je }, p("inputValidationInfoForeground", "Input validation foreground color for information severity.")), mne = N("inputValidation.infoBorder", { dark: "#007acc", light: "#007acc", hcDark: rt, hcLight: rt }, p("inputValidationInfoBorder", "Input validation border color for information severity.")), pne = N("inputValidation.warningBackground", { dark: "#352A05", light: "#F6F5D2", hcDark: K.black, hcLight: K.white }, p("inputValidationWarningBackground", "Input validation background color for warning severity.")), fne = N("inputValidation.warningForeground", { dark: null, light: null, hcDark: null, hcLight: Je }, p("inputValidationWarningForeground", "Input validation foreground color for warning severity.")), bne = N("inputValidation.warningBorder", { dark: "#B89500", light: "#B89500", hcDark: rt, hcLight: rt }, p("inputValidationWarningBorder", "Input validation border color for warning severity.")), yne = N("inputValidation.errorBackground", { dark: "#5A1D1D", light: "#F2DEDE", hcDark: K.black, hcLight: K.white }, p("inputValidationErrorBackground", "Input validation background color for error severity.")), wne = N("inputValidation.errorForeground", { dark: null, light: null, hcDark: null, hcLight: Je }, p("inputValidationErrorForeground", "Input validation foreground color for error severity.")), Cne = N("inputValidation.errorBorder", { dark: "#BE1100", light: "#BE1100", hcDark: rt, hcLight: rt }, p("inputValidationErrorBorder", "Input validation border color for error severity.")), lI = N("dropdown.background", { dark: "#3C3C3C", light: K.white, hcDark: K.black, hcLight: K.white }, p("dropdownBackground", "Dropdown background.")), Sne = N("dropdown.listBackground", { dark: null, light: null, hcDark: K.black, hcLight: K.white }, p("dropdownListBackground", "Dropdown list background.")), FE = N("dropdown.foreground", { dark: "#F0F0F0", light: Je, hcDark: K.white, hcLight: Je }, p("dropdownForeground", "Dropdown foreground.")), YE = N("dropdown.border", { dark: lI, light: "#CECECE", hcDark: rt, hcLight: rt }, p("dropdownBorder", "Dropdown border.")), rU = N("button.foreground", K.white, p("buttonForeground", "Button foreground color.")), Lne = N("button.separator", Pe(rU, 0.4), p("buttonSeparator", "Button separator color.")), oy = N("button.background", { dark: "#0E639C", light: "#007ACC", hcDark: null, hcLight: "#0F4A85" }, p("buttonBackground", "Button background color.")), Ane = N("button.hoverBackground", { dark: Zl(oy, 0.2), light: Em(oy, 0.2), hcDark: oy, hcLight: oy }, p("buttonHoverBackground", "Button background color when hovering.")), xne = N("button.border", rt, p("buttonBorder", "Button border color.")), Mne = N("button.secondaryForeground", { dark: K.white, light: K.white, hcDark: K.white, hcLight: Je }, p("buttonSecondaryForeground", "Secondary button foreground color.")), rv = N("button.secondaryBackground", { dark: "#3A3D41", light: "#5F6A79", hcDark: null, hcLight: K.white }, p("buttonSecondaryBackground", "Secondary button background color.")), Zne = N("button.secondaryHoverBackground", { dark: Zl(rv, 0.2), light: Em(rv, 0.2), hcDark: null, hcLight: null }, p("buttonSecondaryHoverBackground", "Secondary button background color when hovering.")), ry = N("radio.activeForeground", rI, p("radioActiveForeground", "Foreground color of active radio option.")), _ne = N("radio.activeBackground", bC, p("radioBackground", "Background color of active radio option.")), Ine = N("radio.activeBorder", oI, p("radioActiveBorder", "Border color of the active radio option.")), Nne = N("radio.inactiveForeground", null, p("radioInactiveForeground", "Foreground color of inactive radio option.")), Wne = N("radio.inactiveBackground", null, p("radioInactiveBackground", "Background color of inactive radio option.")), vne = N("radio.inactiveBorder", { light: Pe(ry, 0.2), dark: Pe(ry, 0.2), hcDark: Pe(ry, 0.4), hcLight: Pe(ry, 0.2) }, p("radioInactiveBorder", "Border color of the inactive radio option.")), Tne = N("radio.inactiveHoverBackground", hne, p("radioHoverBackground", "Background color of inactive active radio option when hovering.")), Dne = N("checkbox.background", lI, p("checkbox.background", "Background color of checkbox widget.")); -N("checkbox.selectBackground", Xo, p("checkbox.select.background", "Background color of checkbox widget when the element it's in is selected.")); -const Vne = N("checkbox.foreground", FE, p("checkbox.foreground", "Foreground color of checkbox widget.")), kne = N("checkbox.border", YE, p("checkbox.border", "Border color of checkbox widget.")); -N("checkbox.selectBorder", MA, p("checkbox.select.border", "Border color of checkbox widget when the element it's in is selected.")); -const Gne = N("keybindingLabel.background", { dark: new K(new lt(128, 128, 128, 0.17)), light: new K(new lt(221, 221, 221, 0.4)), hcDark: K.transparent, hcLight: K.transparent }, p("keybindingLabelBackground", "Keybinding label background color. The keybinding label is used to represent a keyboard shortcut.")), Rne = N("keybindingLabel.foreground", { dark: K.fromHex("#CCCCCC"), light: K.fromHex("#555555"), hcDark: K.white, hcLight: Je }, p("keybindingLabelForeground", "Keybinding label foreground color. The keybinding label is used to represent a keyboard shortcut.")), Ene = N("keybindingLabel.border", { dark: new K(new lt(51, 51, 51, 0.6)), light: new K(new lt(204, 204, 204, 0.4)), hcDark: new K(new lt(111, 195, 223)), hcLight: rt }, p("keybindingLabelBorder", "Keybinding label border color. The keybinding label is used to represent a keyboard shortcut.")), Xne = N("keybindingLabel.bottomBorder", { dark: new K(new lt(68, 68, 68, 0.6)), light: new K(new lt(187, 187, 187, 0.4)), hcDark: new K(new lt(111, 195, 223)), hcLight: Je }, p("keybindingLabelBottomBorder", "Keybinding label border bottom color. The keybinding label is used to represent a keyboard shortcut.")), Fne = N("list.focusBackground", null, p("listFocusBackground", "List/Tree background color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")), Yne = N("list.focusForeground", null, p("listFocusForeground", "List/Tree foreground color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")), zne = N("list.focusOutline", { dark: Ta, light: Ta, hcDark: Ut, hcLight: Ut }, p("listFocusOutline", "List/Tree outline color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")), Pne = N("list.focusAndSelectionOutline", null, p("listFocusAndSelectionOutline", "List/Tree outline color for the focused item when the list/tree is active and selected. An active list/tree has keyboard focus, an inactive does not.")), pm = N("list.activeSelectionBackground", { dark: "#04395E", light: "#0060C0", hcDark: null, hcLight: K.fromHex("#0F4A85").transparent(0.1) }, p("listActiveSelectionBackground", "List/Tree background color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")), Hw = N("list.activeSelectionForeground", { dark: K.white, light: K.white, hcDark: null, hcLight: null }, p("listActiveSelectionForeground", "List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")), lU = N("list.activeSelectionIconForeground", null, p("listActiveSelectionIconForeground", "List/Tree icon foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")), Bne = N("list.inactiveSelectionBackground", { dark: "#37373D", light: "#E4E6F1", hcDark: null, hcLight: K.fromHex("#0F4A85").transparent(0.1) }, p("listInactiveSelectionBackground", "List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")), One = N("list.inactiveSelectionForeground", null, p("listInactiveSelectionForeground", "List/Tree foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")), Hne = N("list.inactiveSelectionIconForeground", null, p("listInactiveSelectionIconForeground", "List/Tree icon foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")), Jne = N("list.inactiveFocusBackground", null, p("listInactiveFocusBackground", "List/Tree background color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")), Une = N("list.inactiveFocusOutline", null, p("listInactiveFocusOutline", "List/Tree outline color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")), aU = N("list.hoverBackground", { dark: "#2A2D2E", light: "#F0F0F0", hcDark: K.white.transparent(0.1), hcLight: K.fromHex("#0F4A85").transparent(0.1) }, p("listHoverBackground", "List/Tree background when hovering over items using the mouse.")), cU = N("list.hoverForeground", null, p("listHoverForeground", "List/Tree foreground when hovering over items using the mouse.")), Kne = N("list.dropBackground", { dark: "#062F4A", light: "#D6EBFF", hcDark: null, hcLight: null }, p("listDropBackground", "List/Tree drag and drop background when moving items over other items when using the mouse.")), Qne = N("list.dropBetweenBackground", { dark: MA, light: MA, hcDark: null, hcLight: null }, p("listDropBetweenBackground", "List/Tree drag and drop border color when moving items between items when using the mouse.")), Gp = N("list.highlightForeground", { dark: "#2AAAFF", light: "#0066BF", hcDark: Ta, hcLight: Ta }, p("highlight", "List/Tree foreground color of the match highlights when searching inside the list/tree.")), jne = N("list.focusHighlightForeground", { dark: Gp, light: Die(pm, Gp, "#BBE7FF"), hcDark: Gp, hcLight: Gp }, p("listFocusHighlightForeground", "List/Tree foreground color of the match highlights on actively focused items when searching inside the list/tree.")); -N("list.invalidItemForeground", { dark: "#B89500", light: "#B89500", hcDark: "#B89500", hcLight: "#B5200D" }, p("invalidItemForeground", "List/Tree foreground color for invalid items, for example an unresolved root in explorer.")); -N("list.errorForeground", { dark: "#F88070", light: "#B01011", hcDark: null, hcLight: null }, p("listErrorForeground", "Foreground color of list items containing errors.")); -N("list.warningForeground", { dark: "#CCA700", light: "#855F00", hcDark: null, hcLight: null }, p("listWarningForeground", "Foreground color of list items containing warnings.")); -const qne = N("listFilterWidget.background", { light: Em(Xo, 0), dark: Zl(Xo, 0), hcDark: Xo, hcLight: Xo }, p("listFilterWidgetBackground", "Background color of the type filter widget in lists and trees.")), $ne = N("listFilterWidget.outline", { dark: K.transparent, light: K.transparent, hcDark: "#f38518", hcLight: "#007ACC" }, p("listFilterWidgetOutline", "Outline color of the type filter widget in lists and trees.")), ese = N("listFilterWidget.noMatchesOutline", { dark: "#BE1100", light: "#BE1100", hcDark: rt, hcLight: rt }, p("listFilterWidgetNoMatchesOutline", "Outline color of the type filter widget in lists and trees, when there are no matches.")), tse = N("listFilterWidget.shadow", s0, p("listFilterWidgetShadow", "Shadow color of the type filter widget in lists and trees.")); -N("list.filterMatchBackground", { dark: xc, light: xc, hcDark: null, hcLight: null }, p("listFilterMatchHighlight", "Background color of the filtered match.")); -N("list.filterMatchBorder", { dark: zd, light: zd, hcDark: rt, hcLight: Ut }, p("listFilterMatchHighlightBorder", "Border color of the filtered match.")); -N("list.deemphasizedForeground", { dark: "#8C8C8C", light: "#8E8E90", hcDark: "#A7A8A9", hcLight: "#666666" }, p("listDeemphasizedForeground", "List/Tree foreground color for items that are deemphasized.")); -const dU = N("tree.indentGuidesStroke", { dark: "#585858", light: "#a9a9a9", hcDark: "#a9a9a9", hcLight: "#a5a5a5" }, p("treeIndentGuidesStroke", "Tree stroke color for the indentation guides.")), ise = N("tree.inactiveIndentGuidesStroke", Pe(dU, 0.4), p("treeInactiveIndentGuidesStroke", "Tree stroke color for the indentation guides that are not active.")), nse = N("tree.tableColumnsBorder", { dark: "#CCCCCC20", light: "#61616120", hcDark: null, hcLight: null }, p("tableColumnsBorder", "Table border color between columns.")), sse = N("tree.tableOddRowsBackground", { dark: Pe(Je, 0.04), light: Pe(Je, 0.04), hcDark: null, hcLight: null }, p("tableOddRowsBackgroundColor", "Background color for odd table rows.")); -N("editorActionList.background", Xo, p("editorActionListBackground", "Action List background color.")); -N("editorActionList.foreground", iI, p("editorActionListForeground", "Action List foreground color.")); -N("editorActionList.focusForeground", Hw, p("editorActionListFocusForeground", "Action List foreground color for the focused item.")); -N("editorActionList.focusBackground", pm, p("editorActionListFocusBackground", "Action List background color for the focused item.")); -const ose = N("menu.border", { dark: null, light: null, hcDark: rt, hcLight: rt }, p("menuBorder", "Border color of menus.")), rse = N("menu.foreground", FE, p("menuForeground", "Foreground color of menu items.")), lse = N("menu.background", lI, p("menuBackground", "Background color of menu items.")), ase = N("menu.selectionForeground", Hw, p("menuSelectionForeground", "Foreground color of the selected menu item in menus.")), cse = N("menu.selectionBackground", pm, p("menuSelectionBackground", "Background color of the selected menu item in menus.")), dse = N("menu.selectionBorder", { dark: null, light: null, hcDark: Ut, hcLight: Ut }, p("menuSelectionBorder", "Border color of the selected menu item in menus.")), hse = N("menu.separatorBackground", { dark: "#606060", light: "#D4D4D4", hcDark: rt, hcLight: rt }, p("menuSeparatorBackground", "Color of a separator menu item in menus.")), YF = N("quickInput.background", Xo, p("pickerBackground", "Quick picker background color. The quick picker widget is the container for pickers like the command palette.")), use = N("quickInput.foreground", iI, p("pickerForeground", "Quick picker foreground color. The quick picker widget is the container for pickers like the command palette.")), gse = N("quickInputTitle.background", { dark: new K(new lt(255, 255, 255, 0.105)), light: new K(new lt(0, 0, 0, 0.06)), hcDark: "#000000", hcLight: K.white }, p("pickerTitleBackground", "Quick picker title background color. The quick picker widget is the container for pickers like the command palette.")), hU = N("pickerGroup.foreground", { dark: "#3794FF", light: "#0066BF", hcDark: K.white, hcLight: "#0F4A85" }, p("pickerGroupForeground", "Quick picker color for grouping labels.")), mse = N("pickerGroup.border", { dark: "#3F3F46", light: "#CCCEDB", hcDark: K.white, hcLight: "#0F4A85" }, p("pickerGroupBorder", "Quick picker color for grouping borders.")), zF = N("quickInput.list.focusBackground", null, "", void 0, p("quickInput.list.focusBackground deprecation", "Please use quickInputList.focusBackground instead")), Jw = N("quickInputList.focusForeground", Hw, p("quickInput.listFocusForeground", "Quick picker foreground color for the focused item.")), zE = N("quickInputList.focusIconForeground", lU, p("quickInput.listFocusIconForeground", "Quick picker icon foreground color for the focused item.")), Uw = N("quickInputList.focusBackground", { dark: Pw(zF, pm), light: Pw(zF, pm), hcDark: null, hcLight: null }, p("quickInput.listFocusBackground", "Quick picker background color for the focused item.")); -N("search.resultsInfoForeground", { light: Je, dark: Pe(Je, 0.65), hcDark: Je, hcLight: Je }, p("search.resultsInfoForeground", "Color of the text in the search viewlet's completion message.")); -N("searchEditor.findMatchBackground", { light: Pe(xc, 0.66), dark: Pe(xc, 0.66), hcDark: xc, hcLight: xc }, p("searchEditor.queryMatch", "Color of the Search Editor query matches.")); -N("searchEditor.findMatchBorder", { light: Pe(zd, 0.66), dark: Pe(zd, 0.66), hcDark: zd, hcLight: zd }, p("searchEditor.editorFindMatchBorder", "Border color of the Search Editor query matches.")); -class aI { +const Be = R("foreground", { dark: "#CCCCCC", light: "#616161", hcDark: "#FFFFFF", hcLight: "#292929" }, p("foreground", "Overall foreground color. This color is only used if not overridden by a component.")); +R("disabledForeground", { dark: "#CCCCCC80", light: "#61616180", hcDark: "#A5A5A5", hcLight: "#7F7F7F" }, p("disabledForeground", "Overall foreground for disabled elements. This color is only used if not overridden by a component.")); +R("errorForeground", { dark: "#F48771", light: "#A1260D", hcDark: "#F48771", hcLight: "#B5200D" }, p("errorForeground", "Overall foreground color for error messages. This color is only used if not overridden by a component.")); +R("descriptionForeground", { light: "#717171", dark: Ae(Be, 0.7), hcDark: Ae(Be, 0.7), hcLight: Ae(Be, 0.7) }, p("descriptionForeground", "Foreground color for description text providing additional information, for example for a label.")); +const DV = R("icon.foreground", { dark: "#C5C5C5", light: "#424242", hcDark: "#FFFFFF", hcLight: "#292929" }, p("iconForeground", "The default color for icons in the workbench.")), vc = R("focusBorder", { dark: "#007FD4", light: "#0090F1", hcDark: "#F38518", hcLight: "#006BBD" }, p("focusBorder", "Overall border color for focused elements. This color is only used if not overridden by a component.")), lt = R("contrastBorder", { light: null, dark: null, hcDark: "#6FC3DF", hcLight: "#0F4A85" }, p("contrastBorder", "An extra border around elements to separate them from others for greater contrast.")), _t = R("contrastActiveBorder", { light: null, dark: null, hcDark: vc, hcLight: vc }, p("activeContrastBorder", "An extra border around active elements to separate them from others for greater contrast.")); +R("selection.background", null, p("selectionBackground", "The background color of text selections in the workbench (e.g. for input fields or text areas). Note that this does not apply to selections within the editor.")); +const Sne = R("textLink.foreground", { light: "#006AB1", dark: "#3794FF", hcDark: "#21A6FF", hcLight: "#0F4A85" }, p("textLinkForeground", "Foreground color for links in text.")); +R("textLink.activeForeground", { light: "#006AB1", dark: "#3794FF", hcDark: "#21A6FF", hcLight: "#0F4A85" }, p("textLinkActiveForeground", "Foreground color for links in text when clicked on and on mouse hover.")); +R("textSeparator.foreground", { light: "#0000002e", dark: "#ffffff2e", hcDark: Q.black, hcLight: "#292929" }, p("textSeparatorForeground", "Color for text separators.")); +R("textPreformat.foreground", { light: "#A31515", dark: "#D7BA7D", hcDark: "#000000", hcLight: "#FFFFFF" }, p("textPreformatForeground", "Foreground color for preformatted text segments.")); +R("textPreformat.background", { light: "#0000001A", dark: "#FFFFFF1A", hcDark: "#FFFFFF", hcLight: "#09345f" }, p("textPreformatBackground", "Background color for preformatted text segments.")); +R("textBlockQuote.background", { light: "#f2f2f2", dark: "#222222", hcDark: null, hcLight: "#F2F2F2" }, p("textBlockQuoteBackground", "Background color for block quotes in text.")); +R("textBlockQuote.border", { light: "#007acc80", dark: "#007acc80", hcDark: Q.white, hcLight: "#292929" }, p("textBlockQuoteBorder", "Border color for block quotes in text.")); +R("textCodeBlock.background", { light: "#dcdcdc66", dark: "#0a0a0a66", hcDark: Q.black, hcLight: "#F2F2F2" }, p("textCodeBlockBackground", "Background color for code blocks in text.")); +R("sash.hoverBorder", vc, p("sashActiveBorder", "Border color of active sashes.")); +const YX = R("badge.background", { dark: "#4D4D4D", light: "#C4C4C4", hcDark: Q.black, hcLight: "#0F4A85" }, p("badgeBackground", "Badge background color. Badges are small information labels, e.g. for search results count.")), xne = R("badge.foreground", { dark: Q.white, light: "#333", hcDark: Q.white, hcLight: Q.white }, p("badgeForeground", "Badge foreground color. Badges are small information labels, e.g. for search results count.")), oJ = R("scrollbar.shadow", { dark: "#000000", light: "#DDDDDD", hcDark: null, hcLight: null }, p("scrollbarShadow", "Scrollbar shadow to indicate that the view is scrolled.")), T_ = R("scrollbarSlider.background", { dark: Q.fromHex("#797979").transparent(0.4), light: Q.fromHex("#646464").transparent(0.4), hcDark: Ae(lt, 0.6), hcLight: Ae(lt, 0.4) }, p("scrollbarSliderBackground", "Scrollbar slider background color.")), M_ = R("scrollbarSlider.hoverBackground", { dark: Q.fromHex("#646464").transparent(0.7), light: Q.fromHex("#646464").transparent(0.7), hcDark: Ae(lt, 0.8), hcLight: Ae(lt, 0.8) }, p("scrollbarSliderHoverBackground", "Scrollbar slider background color when hovering.")), Y_ = R("scrollbarSlider.activeBackground", { dark: Q.fromHex("#BFBFBF").transparent(0.4), light: Q.fromHex("#000000").transparent(0.6), hcDark: lt, hcLight: lt }, p("scrollbarSliderActiveBackground", "Scrollbar slider background color when clicked on.")), Cne = R("progressBar.background", { dark: Q.fromHex("#0E70C0"), light: Q.fromHex("#0E70C0"), hcDark: lt, hcLight: lt }, p("progressBarBackground", "Background color of the progress bar that can show for long running operations.")), Ql = R("editor.background", { light: "#ffffff", dark: "#1E1E1E", hcDark: Q.black, hcLight: Q.white }, p("editorBackground", "Editor background color.")), Uc = R("editor.foreground", { light: "#333333", dark: "#BBBBBB", hcDark: Q.white, hcLight: Be }, p("editorForeground", "Editor default foreground color.")); +R("editorStickyScroll.background", Ql, p("editorStickyScrollBackground", "Background color of sticky scroll in the editor")); +R("editorStickyScrollHover.background", { dark: "#2A2D2E", light: "#F0F0F0", hcDark: null, hcLight: Q.fromHex("#0F4A85").transparent(0.1) }, p("editorStickyScrollHoverBackground", "Background color of sticky scroll on hover in the editor")); +R("editorStickyScroll.border", { dark: null, light: null, hcDark: lt, hcLight: lt }, p("editorStickyScrollBorder", "Border color of sticky scroll in the editor")); +R("editorStickyScroll.shadow", oJ, p("editorStickyScrollShadow", " Shadow color of sticky scroll in the editor")); +const Fo = R("editorWidget.background", { dark: "#252526", light: "#F3F3F3", hcDark: "#0C141F", hcLight: Q.white }, p("editorWidgetBackground", "Background color of editor widgets, such as find/replace.")), Zx = R("editorWidget.foreground", Be, p("editorWidgetForeground", "Foreground color of editor widgets, such as find/replace.")), lJ = R("editorWidget.border", { dark: "#454545", light: "#C8C8C8", hcDark: lt, hcLight: lt }, p("editorWidgetBorder", "Border color of editor widgets. The color is only used if the widget chooses to have a border and if the color is not overridden by a widget.")); +R("editorWidget.resizeBorder", null, p("editorWidgetResizeBorder", "Border color of the resize bar of editor widgets. The color is only used if the widget chooses to have a resize border and if the color is not overridden by a widget.")); +R("editorError.background", null, p("editorError.background", "Background color of error text in the editor. The color must not be opaque so as not to hide underlying decorations."), !0); +const fx = R("editorError.foreground", { dark: "#F14C4C", light: "#E51400", hcDark: "#F48771", hcLight: "#B5200D" }, p("editorError.foreground", "Foreground color of error squigglies in the editor.")), Rne = R("editorError.border", { dark: null, light: null, hcDark: Q.fromHex("#E47777").transparent(0.8), hcLight: "#B5200D" }, p("errorBorder", "If set, color of double underlines for errors in the editor.")), Nne = R("editorWarning.background", null, p("editorWarning.background", "Background color of warning text in the editor. The color must not be opaque so as not to hide underlying decorations."), !0), jd = R("editorWarning.foreground", { dark: "#CCA700", light: "#BF8803", hcDark: "#FFD370", hcLight: "#895503" }, p("editorWarning.foreground", "Foreground color of warning squigglies in the editor.")), iW = R("editorWarning.border", { dark: null, light: null, hcDark: Q.fromHex("#FFCC00").transparent(0.8), hcLight: Q.fromHex("#FFCC00").transparent(0.8) }, p("warningBorder", "If set, color of double underlines for warnings in the editor.")); +R("editorInfo.background", null, p("editorInfo.background", "Background color of info text in the editor. The color must not be opaque so as not to hide underlying decorations."), !0); +const Jc = R("editorInfo.foreground", { dark: "#3794FF", light: "#1a85ff", hcDark: "#3794FF", hcLight: "#1a85ff" }, p("editorInfo.foreground", "Foreground color of info squigglies in the editor.")), nW = R("editorInfo.border", { dark: null, light: null, hcDark: Q.fromHex("#3794FF").transparent(0.8), hcLight: "#292929" }, p("infoBorder", "If set, color of double underlines for infos in the editor.")), wne = R("editorHint.foreground", { dark: Q.fromHex("#eeeeee").transparent(0.7), light: "#6c6c6c", hcDark: null, hcLight: null }, p("editorHint.foreground", "Foreground color of hint squigglies in the editor.")); +R("editorHint.border", { dark: null, light: null, hcDark: Q.fromHex("#eeeeee").transparent(0.8), hcLight: "#292929" }, p("hintBorder", "If set, color of double underlines for hints in the editor.")); +const Tne = R("editorLink.activeForeground", { dark: "#4E94CE", light: Q.blue, hcDark: Q.cyan, hcLight: "#292929" }, p("activeLinkForeground", "Color of active links.")), Ua = R("editor.selectionBackground", { light: "#ADD6FF", dark: "#264F78", hcDark: "#f3f518", hcLight: "#0F4A85" }, p("editorSelectionBackground", "Color of the editor selection.")), Mne = R("editor.selectionForeground", { light: null, dark: null, hcDark: "#000000", hcLight: Q.white }, p("editorSelectionForeground", "Color of the selected text for high contrast.")), k_ = R("editor.inactiveSelectionBackground", { light: Ae(Ua, 0.5), dark: Ae(Ua, 0.5), hcDark: Ae(Ua, 0.7), hcLight: Ae(Ua, 0.5) }, p("editorInactiveSelection", "Color of the selection in an inactive editor. The color must not be opaque so as not to hide underlying decorations."), !0), rJ = R("editor.selectionHighlightBackground", { light: sF(Ua, Ql, 0.3, 0.6), dark: sF(Ua, Ql, 0.3, 0.6), hcDark: null, hcLight: null }, p("editorSelectionHighlight", "Color for regions with the same content as the selection. The color must not be opaque so as not to hide underlying decorations."), !0); +R("editor.selectionHighlightBorder", { light: null, dark: null, hcDark: _t, hcLight: _t }, p("editorSelectionHighlightBorder", "Border color for regions with the same content as the selection.")); +R("editor.findMatchBackground", { light: "#A8AC94", dark: "#515C6A", hcDark: null, hcLight: null }, p("editorFindMatch", "Color of the current search match.")); +const Yne = R("editor.findMatchForeground", null, p("editorFindMatchForeground", "Text color of the current search match.")), Cd = R("editor.findMatchHighlightBackground", { light: "#EA5C0055", dark: "#EA5C0055", hcDark: null, hcLight: null }, p("findMatchHighlight", "Color of the other search matches. The color must not be opaque so as not to hide underlying decorations."), !0), kne = R("editor.findMatchHighlightForeground", null, p("findMatchHighlightForeground", "Foreground color of the other search matches."), !0); +R("editor.findRangeHighlightBackground", { dark: "#3a3d4166", light: "#b4b4b44d", hcDark: null, hcLight: null }, p("findRangeHighlight", "Color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations."), !0); +R("editor.findMatchBorder", { light: null, dark: null, hcDark: _t, hcLight: _t }, p("editorFindMatchBorder", "Border color of the current search match.")); +const Pa = R("editor.findMatchHighlightBorder", { light: null, dark: null, hcDark: _t, hcLight: _t }, p("findMatchHighlightBorder", "Border color of the other search matches.")), vne = R("editor.findRangeHighlightBorder", { dark: null, light: null, hcDark: Ae(_t, 0.4), hcLight: Ae(_t, 0.4) }, p("findRangeHighlightBorder", "Border color of the range limiting the search. The color must not be opaque so as not to hide underlying decorations."), !0); +R("editor.hoverHighlightBackground", { light: "#ADD6FF26", dark: "#264f7840", hcDark: "#ADD6FF26", hcLight: null }, p("hoverHighlight", "Highlight below the word for which a hover is shown. The color must not be opaque so as not to hide underlying decorations."), !0); +const FV = R("editorHoverWidget.background", Fo, p("hoverBackground", "Background color of the editor hover.")); +R("editorHoverWidget.foreground", Zx, p("hoverForeground", "Foreground color of the editor hover.")); +const v_ = R("editorHoverWidget.border", lJ, p("hoverBorder", "Border color of the editor hover.")); +R("editorHoverWidget.statusBarBackground", { dark: Nr(FV, 0.2), light: Ab(FV, 0.05), hcDark: Fo, hcLight: Fo }, p("statusBarBackground", "Background color of the editor hover status bar.")); +const cJ = R("editorInlayHint.foreground", { dark: "#969696", light: "#969696", hcDark: Q.white, hcLight: Q.black }, p("editorInlayHintForeground", "Foreground color of inline hints")), dJ = R("editorInlayHint.background", { dark: Ae(YX, 0.1), light: Ae(YX, 0.1), hcDark: Ae(Q.white, 0.1), hcLight: Ae(YX, 0.1) }, p("editorInlayHintBackground", "Background color of inline hints")), Jne = R("editorInlayHint.typeForeground", cJ, p("editorInlayHintForegroundTypes", "Foreground color of inline hints for types")), Hne = R("editorInlayHint.typeBackground", dJ, p("editorInlayHintBackgroundTypes", "Background color of inline hints for types")), Ene = R("editorInlayHint.parameterForeground", cJ, p("editorInlayHintForegroundParameter", "Foreground color of inline hints for parameters")), Dne = R("editorInlayHint.parameterBackground", dJ, p("editorInlayHintBackgroundParameter", "Background color of inline hints for parameters")), Fne = R("editorLightBulb.foreground", { dark: "#FFCC00", light: "#DDB100", hcDark: "#FFCC00", hcLight: "#007ACC" }, p("editorLightBulbForeground", "The color used for the lightbulb actions icon.")); +R("editorLightBulbAutoFix.foreground", { dark: "#75BEFF", light: "#007ACC", hcDark: "#75BEFF", hcLight: "#007ACC" }, p("editorLightBulbAutoFixForeground", "The color used for the lightbulb auto fix actions icon.")); +R("editorLightBulbAi.foreground", Fne, p("editorLightBulbAiForeground", "The color used for the lightbulb AI icon.")); +R("editor.snippetTabstopHighlightBackground", { dark: new Q(new rt(124, 124, 124, 0.3)), light: new Q(new rt(10, 50, 100, 0.2)), hcDark: new Q(new rt(124, 124, 124, 0.3)), hcLight: new Q(new rt(10, 50, 100, 0.2)) }, p("snippetTabstopHighlightBackground", "Highlight background color of a snippet tabstop.")); +R("editor.snippetTabstopHighlightBorder", null, p("snippetTabstopHighlightBorder", "Highlight border color of a snippet tabstop.")); +R("editor.snippetFinalTabstopHighlightBackground", null, p("snippetFinalTabstopHighlightBackground", "Highlight background color of the final tabstop of a snippet.")); +R("editor.snippetFinalTabstopHighlightBorder", { dark: "#525252", light: new Q(new rt(10, 50, 100, 0.5)), hcDark: "#525252", hcLight: "#292929" }, p("snippetFinalTabstopHighlightBorder", "Highlight border color of the final tabstop of a snippet.")); +const Ww = new Q(new rt(155, 185, 85, 0.2)), Gw = new Q(new rt(255, 0, 0, 0.2)), zne = R("diffEditor.insertedTextBackground", { dark: "#9ccc2c33", light: "#9ccc2c40", hcDark: null, hcLight: null }, p("diffEditorInserted", "Background color for text that got inserted. The color must not be opaque so as not to hide underlying decorations."), !0), Ane = R("diffEditor.removedTextBackground", { dark: "#ff000033", light: "#ff000033", hcDark: null, hcLight: null }, p("diffEditorRemoved", "Background color for text that got removed. The color must not be opaque so as not to hide underlying decorations."), !0); +R("diffEditor.insertedLineBackground", { dark: Ww, light: Ww, hcDark: null, hcLight: null }, p("diffEditorInsertedLines", "Background color for lines that got inserted. The color must not be opaque so as not to hide underlying decorations."), !0); +R("diffEditor.removedLineBackground", { dark: Gw, light: Gw, hcDark: null, hcLight: null }, p("diffEditorRemovedLines", "Background color for lines that got removed. The color must not be opaque so as not to hide underlying decorations."), !0); +R("diffEditorGutter.insertedLineBackground", null, p("diffEditorInsertedLineGutter", "Background color for the margin where lines got inserted.")); +R("diffEditorGutter.removedLineBackground", null, p("diffEditorRemovedLineGutter", "Background color for the margin where lines got removed.")); +const Kne = R("diffEditorOverview.insertedForeground", null, p("diffEditorOverviewInserted", "Diff overview ruler foreground for inserted content.")), Une = R("diffEditorOverview.removedForeground", null, p("diffEditorOverviewRemoved", "Diff overview ruler foreground for removed content.")); +R("diffEditor.insertedTextBorder", { dark: null, light: null, hcDark: "#33ff2eff", hcLight: "#374E06" }, p("diffEditorInsertedOutline", "Outline color for the text that got inserted.")); +R("diffEditor.removedTextBorder", { dark: null, light: null, hcDark: "#FF008F", hcLight: "#AD0707" }, p("diffEditorRemovedOutline", "Outline color for text that got removed.")); +R("diffEditor.border", { dark: null, light: null, hcDark: lt, hcLight: lt }, p("diffEditorBorder", "Border color between the two text editors.")); +R("diffEditor.diagonalFill", { dark: "#cccccc33", light: "#22222233", hcDark: null, hcLight: null }, p("diffDiagonalFill", "Color of the diff editor's diagonal fill. The diagonal fill is used in side-by-side diff views.")); +R("diffEditor.unchangedRegionBackground", "sideBar.background", p("diffEditor.unchangedRegionBackground", "The background color of unchanged blocks in the diff editor.")); +R("diffEditor.unchangedRegionForeground", "foreground", p("diffEditor.unchangedRegionForeground", "The foreground color of unchanged blocks in the diff editor.")); +R("diffEditor.unchangedCodeBackground", { dark: "#74747429", light: "#b8b8b829", hcDark: null, hcLight: null }, p("diffEditor.unchangedCodeBackground", "The background color of unchanged code in the diff editor.")); +const a0 = R("widget.shadow", { dark: Ae(Q.black, 0.36), light: Ae(Q.black, 0.16), hcDark: null, hcLight: null }, p("widgetShadow", "Shadow color of widgets such as find/replace inside the editor.")), J_ = R("widget.border", { dark: null, light: null, hcDark: lt, hcLight: lt }, p("widgetBorder", "Border color of widgets such as find/replace inside the editor.")), lF = R("toolbar.hoverBackground", { dark: "#5a5d5e50", light: "#b8b8b850", hcDark: null, hcLight: null }, p("toolbarHoverBackground", "Toolbar background when hovering over actions using the mouse")); +R("toolbar.hoverOutline", { dark: null, light: null, hcDark: _t, hcLight: _t }, p("toolbarHoverOutline", "Toolbar outline when hovering over actions using the mouse")); +R("toolbar.activeBackground", { dark: Nr(lF, 0.1), light: Ab(lF, 0.1), hcDark: null, hcLight: null }, p("toolbarActiveBackground", "Toolbar background when holding the mouse over actions")); +const Pne = R("breadcrumb.foreground", Ae(Be, 0.8), p("breadcrumbsFocusForeground", "Color of focused breadcrumb items.")), Bne = R("breadcrumb.background", Ql, p("breadcrumbsBackground", "Background color of breadcrumb items.")), rF = R("breadcrumb.focusForeground", { light: Ab(Be, 0.2), dark: Nr(Be, 0.1), hcDark: Nr(Be, 0.1), hcLight: Nr(Be, 0.1) }, p("breadcrumbsFocusForeground", "Color of focused breadcrumb items.")), _ne = R("breadcrumb.activeSelectionForeground", { light: Ab(Be, 0.2), dark: Nr(Be, 0.1), hcDark: Nr(Be, 0.1), hcLight: Nr(Be, 0.1) }, p("breadcrumbsSelectedForeground", "Color of selected breadcrumb items.")); +R("breadcrumbPicker.background", Fo, p("breadcrumbsSelectedBackground", "Background color of breadcrumb item picker.")); +const H_ = 0.5, cF = Q.fromHex("#40C8AE").transparent(H_), dF = Q.fromHex("#40A6FF").transparent(H_), aF = Q.fromHex("#606060").transparent(0.4), aJ = 0.4, ZZ = 1, Xw = R("merge.currentHeaderBackground", { dark: cF, light: cF, hcDark: null, hcLight: null }, p("mergeCurrentHeaderBackground", "Current header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), !0); +R("merge.currentContentBackground", Ae(Xw, aJ), p("mergeCurrentContentBackground", "Current content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), !0); +const Vw = R("merge.incomingHeaderBackground", { dark: dF, light: dF, hcDark: null, hcLight: null }, p("mergeIncomingHeaderBackground", "Incoming header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), !0); +R("merge.incomingContentBackground", Ae(Vw, aJ), p("mergeIncomingContentBackground", "Incoming content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), !0); +const Lw = R("merge.commonHeaderBackground", { dark: aF, light: aF, hcDark: null, hcLight: null }, p("mergeCommonHeaderBackground", "Common ancestor header background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), !0); +R("merge.commonContentBackground", Ae(Lw, aJ), p("mergeCommonContentBackground", "Common ancestor content background in inline merge-conflicts. The color must not be opaque so as not to hide underlying decorations."), !0); +const fZ = R("merge.border", { dark: null, light: null, hcDark: "#C3DF6F", hcLight: "#007ACC" }, p("mergeBorder", "Border color on headers and the splitter in inline merge-conflicts.")); +R("editorOverviewRuler.currentContentForeground", { dark: Ae(Xw, ZZ), light: Ae(Xw, ZZ), hcDark: fZ, hcLight: fZ }, p("overviewRulerCurrentContentForeground", "Current overview ruler foreground for inline merge-conflicts.")); +R("editorOverviewRuler.incomingContentForeground", { dark: Ae(Vw, ZZ), light: Ae(Vw, ZZ), hcDark: fZ, hcLight: fZ }, p("overviewRulerIncomingContentForeground", "Incoming overview ruler foreground for inline merge-conflicts.")); +R("editorOverviewRuler.commonContentForeground", { dark: Ae(Lw, ZZ), light: Ae(Lw, ZZ), hcDark: fZ, hcLight: fZ }, p("overviewRulerCommonContentForeground", "Common ancestor overview ruler foreground for inline merge-conflicts.")); +const nR = R("editorOverviewRuler.findMatchForeground", { dark: "#d186167e", light: "#d186167e", hcDark: "#AB5A00", hcLight: "#AB5A00" }, p("overviewRulerFindMatchForeground", "Overview ruler marker color for find matches. The color must not be opaque so as not to hide underlying decorations."), !0), E_ = R("editorOverviewRuler.selectionHighlightForeground", "#A0A0A0CC", p("overviewRulerSelectionHighlightForeground", "Overview ruler marker color for selection highlights. The color must not be opaque so as not to hide underlying decorations."), !0), Qne = R("problemsErrorIcon.foreground", fx, p("problemsErrorIconForeground", "The color used for the problems error icon.")), One = R("problemsWarningIcon.foreground", jd, p("problemsWarningIconForeground", "The color used for the problems warning icon.")), jne = R("problemsInfoIcon.foreground", Jc, p("problemsInfoIconForeground", "The color used for the problems info icon.")), Iw = R("minimap.findMatchHighlight", { light: "#d18616", dark: "#d18616", hcDark: "#AB5A00", hcLight: "#0F4A85" }, p("minimapFindMatchHighlight", "Minimap marker color for find matches."), !0), yx = R("minimap.selectionOccurrenceHighlight", { light: "#c9c9c9", dark: "#676767", hcDark: "#ffffff", hcLight: "#0F4A85" }, p("minimapSelectionOccurrenceHighlight", "Minimap marker color for repeating editor selections."), !0), hF = R("minimap.selectionHighlight", { light: "#ADD6FF", dark: "#264F78", hcDark: "#ffffff", hcLight: "#0F4A85" }, p("minimapSelectionHighlight", "Minimap marker color for the editor selection."), !0), qne = R("minimap.infoHighlight", { dark: Jc, light: Jc, hcDark: nW, hcLight: nW }, p("minimapInfo", "Minimap marker color for infos.")), $ne = R("minimap.warningHighlight", { dark: jd, light: jd, hcDark: iW, hcLight: iW }, p("overviewRuleWarning", "Minimap marker color for warnings.")), ese = R("minimap.errorHighlight", { dark: new Q(new rt(255, 18, 18, 0.7)), light: new Q(new rt(255, 18, 18, 0.7)), hcDark: new Q(new rt(255, 50, 50, 1)), hcLight: "#B5200D" }, p("minimapError", "Minimap marker color for errors.")), tse = R("minimap.background", null, p("minimapBackground", "Minimap background color.")), ise = R("minimap.foregroundOpacity", Q.fromHex("#000f"), p("minimapForegroundOpacity", 'Opacity of foreground elements rendered in the minimap. For example, "#000000c0" will render the elements with 75% opacity.')); +R("minimapSlider.background", Ae(T_, 0.5), p("minimapSliderBackground", "Minimap slider background color.")); +R("minimapSlider.hoverBackground", Ae(M_, 0.5), p("minimapSliderHoverBackground", "Minimap slider background color when hovering.")); +R("minimapSlider.activeBackground", Ae(Y_, 0.5), p("minimapSliderActiveBackground", "Minimap slider background color when clicked on.")); +R("charts.foreground", Be, p("chartsForeground", "The foreground color used in charts.")); +R("charts.lines", Ae(Be, 0.5), p("chartsLines", "The color used for horizontal lines in charts.")); +R("charts.red", fx, p("chartsRed", "The red color used in chart visualizations.")); +R("charts.blue", Jc, p("chartsBlue", "The blue color used in chart visualizations.")); +R("charts.yellow", jd, p("chartsYellow", "The yellow color used in chart visualizations.")); +R("charts.orange", Iw, p("chartsOrange", "The orange color used in chart visualizations.")); +R("charts.green", { dark: "#89D185", light: "#388A34", hcDark: "#89D185", hcLight: "#374e06" }, p("chartsGreen", "The green color used in chart visualizations.")); +R("charts.purple", { dark: "#B180D7", light: "#652D90", hcDark: "#B180D7", hcLight: "#652D90" }, p("chartsPurple", "The purple color used in chart visualizations.")); +const Sw = R("input.background", { dark: "#3C3C3C", light: Q.white, hcDark: Q.black, hcLight: Q.white }, p("inputBoxBackground", "Input box background.")), D_ = R("input.foreground", Be, p("inputBoxForeground", "Input box foreground.")), F_ = R("input.border", { dark: null, light: null, hcDark: lt, hcLight: lt }, p("inputBoxBorder", "Input box border.")), Wx = R("inputOption.activeBorder", { dark: "#007ACC", light: "#007ACC", hcDark: lt, hcLight: lt }, p("inputBoxActiveOptionBorder", "Border color of activated options in input fields.")), nse = R("inputOption.hoverBackground", { dark: "#5a5d5e80", light: "#b8b8b850", hcDark: null, hcLight: null }, p("inputOption.hoverBackground", "Background color of activated options in input fields.")), NG = R("inputOption.activeBackground", { dark: Ae(vc, 0.4), light: Ae(vc, 0.2), hcDark: Q.transparent, hcLight: Q.transparent }, p("inputOption.activeBackground", "Background hover color of options in input fields.")), Gx = R("inputOption.activeForeground", { dark: Q.white, light: Q.black, hcDark: Be, hcLight: Be }, p("inputOption.activeForeground", "Foreground color of activated options in input fields.")); +R("input.placeholderForeground", { light: Ae(Be, 0.5), dark: Ae(Be, 0.5), hcDark: Ae(Be, 0.7), hcLight: Ae(Be, 0.7) }, p("inputPlaceholderForeground", "Input box foreground color for placeholder text.")); +const sse = R("inputValidation.infoBackground", { dark: "#063B49", light: "#D6ECF2", hcDark: Q.black, hcLight: Q.white }, p("inputValidationInfoBackground", "Input validation background color for information severity.")), ose = R("inputValidation.infoForeground", { dark: null, light: null, hcDark: null, hcLight: Be }, p("inputValidationInfoForeground", "Input validation foreground color for information severity.")), lse = R("inputValidation.infoBorder", { dark: "#007acc", light: "#007acc", hcDark: lt, hcLight: lt }, p("inputValidationInfoBorder", "Input validation border color for information severity.")), rse = R("inputValidation.warningBackground", { dark: "#352A05", light: "#F6F5D2", hcDark: Q.black, hcLight: Q.white }, p("inputValidationWarningBackground", "Input validation background color for warning severity.")), cse = R("inputValidation.warningForeground", { dark: null, light: null, hcDark: null, hcLight: Be }, p("inputValidationWarningForeground", "Input validation foreground color for warning severity.")), dse = R("inputValidation.warningBorder", { dark: "#B89500", light: "#B89500", hcDark: lt, hcLight: lt }, p("inputValidationWarningBorder", "Input validation border color for warning severity.")), ase = R("inputValidation.errorBackground", { dark: "#5A1D1D", light: "#F2DEDE", hcDark: Q.black, hcLight: Q.white }, p("inputValidationErrorBackground", "Input validation background color for error severity.")), hse = R("inputValidation.errorForeground", { dark: null, light: null, hcDark: null, hcLight: Be }, p("inputValidationErrorForeground", "Input validation foreground color for error severity.")), use = R("inputValidation.errorBorder", { dark: "#BE1100", light: "#BE1100", hcDark: lt, hcLight: lt }, p("inputValidationErrorBorder", "Input validation border color for error severity.")), Xx = R("dropdown.background", { dark: "#3C3C3C", light: Q.white, hcDark: Q.black, hcLight: Q.white }, p("dropdownBackground", "Dropdown background.")), mse = R("dropdown.listBackground", { dark: null, light: null, hcDark: Q.black, hcLight: Q.white }, p("dropdownListBackground", "Dropdown list background.")), hJ = R("dropdown.foreground", { dark: "#F0F0F0", light: Be, hcDark: Q.white, hcLight: Be }, p("dropdownForeground", "Dropdown foreground.")), uJ = R("dropdown.border", { dark: Xx, light: "#CECECE", hcDark: lt, hcLight: lt }, p("dropdownBorder", "Dropdown border.")), z_ = R("button.foreground", Q.white, p("buttonForeground", "Button foreground color.")), bse = R("button.separator", Ae(z_, 0.4), p("buttonSeparator", "Button separator color.")), pf = R("button.background", { dark: "#0E639C", light: "#007ACC", hcDark: null, hcLight: "#0F4A85" }, p("buttonBackground", "Button background color.")), pse = R("button.hoverBackground", { dark: Nr(pf, 0.2), light: Ab(pf, 0.2), hcDark: pf, hcLight: pf }, p("buttonHoverBackground", "Button background color when hovering.")), gse = R("button.border", lt, p("buttonBorder", "Button border color.")), Zse = R("button.secondaryForeground", { dark: Q.white, light: Q.white, hcDark: Q.white, hcLight: Be }, p("buttonSecondaryForeground", "Secondary button foreground color.")), xw = R("button.secondaryBackground", { dark: "#3A3D41", light: "#5F6A79", hcDark: null, hcLight: Q.white }, p("buttonSecondaryBackground", "Secondary button background color.")), fse = R("button.secondaryHoverBackground", { dark: Nr(xw, 0.2), light: Ab(xw, 0.2), hcDark: null, hcLight: null }, p("buttonSecondaryHoverBackground", "Secondary button background color when hovering.")), gf = R("radio.activeForeground", Gx, p("radioActiveForeground", "Foreground color of active radio option.")), yse = R("radio.activeBackground", NG, p("radioBackground", "Background color of active radio option.")), Wse = R("radio.activeBorder", Wx, p("radioActiveBorder", "Border color of the active radio option.")), Gse = R("radio.inactiveForeground", null, p("radioInactiveForeground", "Foreground color of inactive radio option.")), Xse = R("radio.inactiveBackground", null, p("radioInactiveBackground", "Background color of inactive radio option.")), Vse = R("radio.inactiveBorder", { light: Ae(gf, 0.2), dark: Ae(gf, 0.2), hcDark: Ae(gf, 0.4), hcLight: Ae(gf, 0.2) }, p("radioInactiveBorder", "Border color of the inactive radio option.")), Lse = R("radio.inactiveHoverBackground", nse, p("radioHoverBackground", "Background color of inactive active radio option when hovering.")), Ise = R("checkbox.background", Xx, p("checkbox.background", "Background color of checkbox widget.")); +R("checkbox.selectBackground", Fo, p("checkbox.select.background", "Background color of checkbox widget when the element it's in is selected.")); +const Sse = R("checkbox.foreground", hJ, p("checkbox.foreground", "Foreground color of checkbox widget.")), xse = R("checkbox.border", uJ, p("checkbox.border", "Border color of checkbox widget.")); +R("checkbox.selectBorder", DV, p("checkbox.select.border", "Border color of checkbox widget when the element it's in is selected.")); +const Cse = R("keybindingLabel.background", { dark: new Q(new rt(128, 128, 128, 0.17)), light: new Q(new rt(221, 221, 221, 0.4)), hcDark: Q.transparent, hcLight: Q.transparent }, p("keybindingLabelBackground", "Keybinding label background color. The keybinding label is used to represent a keyboard shortcut.")), Rse = R("keybindingLabel.foreground", { dark: Q.fromHex("#CCCCCC"), light: Q.fromHex("#555555"), hcDark: Q.white, hcLight: Be }, p("keybindingLabelForeground", "Keybinding label foreground color. The keybinding label is used to represent a keyboard shortcut.")), Nse = R("keybindingLabel.border", { dark: new Q(new rt(51, 51, 51, 0.6)), light: new Q(new rt(204, 204, 204, 0.4)), hcDark: new Q(new rt(111, 195, 223)), hcLight: lt }, p("keybindingLabelBorder", "Keybinding label border color. The keybinding label is used to represent a keyboard shortcut.")), wse = R("keybindingLabel.bottomBorder", { dark: new Q(new rt(68, 68, 68, 0.6)), light: new Q(new rt(187, 187, 187, 0.4)), hcDark: new Q(new rt(111, 195, 223)), hcLight: Be }, p("keybindingLabelBottomBorder", "Keybinding label border bottom color. The keybinding label is used to represent a keyboard shortcut.")), Tse = R("list.focusBackground", null, p("listFocusBackground", "List/Tree background color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")), Mse = R("list.focusForeground", null, p("listFocusForeground", "List/Tree foreground color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")), Yse = R("list.focusOutline", { dark: vc, light: vc, hcDark: _t, hcLight: _t }, p("listFocusOutline", "List/Tree outline color for the focused item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")), kse = R("list.focusAndSelectionOutline", null, p("listFocusAndSelectionOutline", "List/Tree outline color for the focused item when the list/tree is active and selected. An active list/tree has keyboard focus, an inactive does not.")), Wb = R("list.activeSelectionBackground", { dark: "#04395E", light: "#0060C0", hcDark: null, hcLight: Q.fromHex("#0F4A85").transparent(0.1) }, p("listActiveSelectionBackground", "List/Tree background color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")), sW = R("list.activeSelectionForeground", { dark: Q.white, light: Q.white, hcDark: null, hcLight: null }, p("listActiveSelectionForeground", "List/Tree foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")), A_ = R("list.activeSelectionIconForeground", null, p("listActiveSelectionIconForeground", "List/Tree icon foreground color for the selected item when the list/tree is active. An active list/tree has keyboard focus, an inactive does not.")), vse = R("list.inactiveSelectionBackground", { dark: "#37373D", light: "#E4E6F1", hcDark: null, hcLight: Q.fromHex("#0F4A85").transparent(0.1) }, p("listInactiveSelectionBackground", "List/Tree background color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")), Jse = R("list.inactiveSelectionForeground", null, p("listInactiveSelectionForeground", "List/Tree foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")), Hse = R("list.inactiveSelectionIconForeground", null, p("listInactiveSelectionIconForeground", "List/Tree icon foreground color for the selected item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")), Ese = R("list.inactiveFocusBackground", null, p("listInactiveFocusBackground", "List/Tree background color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")), Dse = R("list.inactiveFocusOutline", null, p("listInactiveFocusOutline", "List/Tree outline color for the focused item when the list/tree is inactive. An active list/tree has keyboard focus, an inactive does not.")), K_ = R("list.hoverBackground", { dark: "#2A2D2E", light: "#F0F0F0", hcDark: Q.white.transparent(0.1), hcLight: Q.fromHex("#0F4A85").transparent(0.1) }, p("listHoverBackground", "List/Tree background when hovering over items using the mouse.")), U_ = R("list.hoverForeground", null, p("listHoverForeground", "List/Tree foreground when hovering over items using the mouse.")), Fse = R("list.dropBackground", { dark: "#062F4A", light: "#D6EBFF", hcDark: null, hcLight: null }, p("listDropBackground", "List/Tree drag and drop background when moving items over other items when using the mouse.")), zse = R("list.dropBetweenBackground", { dark: DV, light: DV, hcDark: null, hcLight: null }, p("listDropBetweenBackground", "List/Tree drag and drop border color when moving items between items when using the mouse.")), zp = R("list.highlightForeground", { dark: "#2AAAFF", light: "#0066BF", hcDark: vc, hcLight: vc }, p("highlight", "List/Tree foreground color of the match highlights when searching inside the list/tree.")), Ase = R("list.focusHighlightForeground", { dark: zp, light: Ine(Wb, zp, "#BBE7FF"), hcDark: zp, hcLight: zp }, p("listFocusHighlightForeground", "List/Tree foreground color of the match highlights on actively focused items when searching inside the list/tree.")); +R("list.invalidItemForeground", { dark: "#B89500", light: "#B89500", hcDark: "#B89500", hcLight: "#B5200D" }, p("invalidItemForeground", "List/Tree foreground color for invalid items, for example an unresolved root in explorer.")); +R("list.errorForeground", { dark: "#F88070", light: "#B01011", hcDark: null, hcLight: null }, p("listErrorForeground", "Foreground color of list items containing errors.")); +R("list.warningForeground", { dark: "#CCA700", light: "#855F00", hcDark: null, hcLight: null }, p("listWarningForeground", "Foreground color of list items containing warnings.")); +const Kse = R("listFilterWidget.background", { light: Ab(Fo, 0), dark: Nr(Fo, 0), hcDark: Fo, hcLight: Fo }, p("listFilterWidgetBackground", "Background color of the type filter widget in lists and trees.")), Use = R("listFilterWidget.outline", { dark: Q.transparent, light: Q.transparent, hcDark: "#f38518", hcLight: "#007ACC" }, p("listFilterWidgetOutline", "Outline color of the type filter widget in lists and trees.")), Pse = R("listFilterWidget.noMatchesOutline", { dark: "#BE1100", light: "#BE1100", hcDark: lt, hcLight: lt }, p("listFilterWidgetNoMatchesOutline", "Outline color of the type filter widget in lists and trees, when there are no matches.")), Bse = R("listFilterWidget.shadow", a0, p("listFilterWidgetShadow", "Shadow color of the type filter widget in lists and trees.")); +R("list.filterMatchBackground", { dark: Cd, light: Cd, hcDark: null, hcLight: null }, p("listFilterMatchHighlight", "Background color of the filtered match.")); +R("list.filterMatchBorder", { dark: Pa, light: Pa, hcDark: lt, hcLight: _t }, p("listFilterMatchHighlightBorder", "Border color of the filtered match.")); +R("list.deemphasizedForeground", { dark: "#8C8C8C", light: "#8E8E90", hcDark: "#A7A8A9", hcLight: "#666666" }, p("listDeemphasizedForeground", "List/Tree foreground color for items that are deemphasized.")); +const P_ = R("tree.indentGuidesStroke", { dark: "#585858", light: "#a9a9a9", hcDark: "#a9a9a9", hcLight: "#a5a5a5" }, p("treeIndentGuidesStroke", "Tree stroke color for the indentation guides.")), _se = R("tree.inactiveIndentGuidesStroke", Ae(P_, 0.4), p("treeInactiveIndentGuidesStroke", "Tree stroke color for the indentation guides that are not active.")), Qse = R("tree.tableColumnsBorder", { dark: "#CCCCCC20", light: "#61616120", hcDark: null, hcLight: null }, p("tableColumnsBorder", "Table border color between columns.")), Ose = R("tree.tableOddRowsBackground", { dark: Ae(Be, 0.04), light: Ae(Be, 0.04), hcDark: null, hcLight: null }, p("tableOddRowsBackgroundColor", "Background color for odd table rows.")); +R("editorActionList.background", Fo, p("editorActionListBackground", "Action List background color.")); +R("editorActionList.foreground", Zx, p("editorActionListForeground", "Action List foreground color.")); +R("editorActionList.focusForeground", sW, p("editorActionListFocusForeground", "Action List foreground color for the focused item.")); +R("editorActionList.focusBackground", Wb, p("editorActionListFocusBackground", "Action List background color for the focused item.")); +const jse = R("menu.border", { dark: null, light: null, hcDark: lt, hcLight: lt }, p("menuBorder", "Border color of menus.")), qse = R("menu.foreground", hJ, p("menuForeground", "Foreground color of menu items.")), $se = R("menu.background", Xx, p("menuBackground", "Background color of menu items.")), eoe = R("menu.selectionForeground", sW, p("menuSelectionForeground", "Foreground color of the selected menu item in menus.")), toe = R("menu.selectionBackground", Wb, p("menuSelectionBackground", "Background color of the selected menu item in menus.")), ioe = R("menu.selectionBorder", { dark: null, light: null, hcDark: _t, hcLight: _t }, p("menuSelectionBorder", "Border color of the selected menu item in menus.")), noe = R("menu.separatorBackground", { dark: "#606060", light: "#D4D4D4", hcDark: lt, hcLight: lt }, p("menuSeparatorBackground", "Color of a separator menu item in menus.")), uF = R("quickInput.background", Fo, p("pickerBackground", "Quick picker background color. The quick picker widget is the container for pickers like the command palette.")), soe = R("quickInput.foreground", Zx, p("pickerForeground", "Quick picker foreground color. The quick picker widget is the container for pickers like the command palette.")), ooe = R("quickInputTitle.background", { dark: new Q(new rt(255, 255, 255, 0.105)), light: new Q(new rt(0, 0, 0, 0.06)), hcDark: "#000000", hcLight: Q.white }, p("pickerTitleBackground", "Quick picker title background color. The quick picker widget is the container for pickers like the command palette.")), B_ = R("pickerGroup.foreground", { dark: "#3794FF", light: "#0066BF", hcDark: Q.white, hcLight: "#0F4A85" }, p("pickerGroupForeground", "Quick picker color for grouping labels.")), loe = R("pickerGroup.border", { dark: "#3F3F46", light: "#CCCEDB", hcDark: Q.white, hcLight: "#0F4A85" }, p("pickerGroupBorder", "Quick picker color for grouping borders.")), mF = R("quickInput.list.focusBackground", null, "", void 0, p("quickInput.list.focusBackground deprecation", "Please use quickInputList.focusBackground instead")), oW = R("quickInputList.focusForeground", sW, p("quickInput.listFocusForeground", "Quick picker foreground color for the focused item.")), mJ = R("quickInputList.focusIconForeground", A_, p("quickInput.listFocusIconForeground", "Quick picker icon foreground color for the focused item.")), lW = R("quickInputList.focusBackground", { dark: tW(mF, Wb), light: tW(mF, Wb), hcDark: null, hcLight: null }, p("quickInput.listFocusBackground", "Quick picker background color for the focused item.")); +R("search.resultsInfoForeground", { light: Be, dark: Ae(Be, 0.65), hcDark: Be, hcLight: Be }, p("search.resultsInfoForeground", "Color of the text in the search viewlet's completion message.")); +R("searchEditor.findMatchBackground", { light: Ae(Cd, 0.66), dark: Ae(Cd, 0.66), hcDark: Cd, hcLight: Cd }, p("searchEditor.queryMatch", "Color of the Search Editor query matches.")); +R("searchEditor.findMatchBorder", { light: Ae(Pa, 0.66), dark: Ae(Pa, 0.66), hcDark: Pa, hcLight: Pa }, p("searchEditor.editorFindMatchBorder", "Border color of the Search Editor query matches.")); +class Vx { constructor(e, t) { this.x = e, this.y = t, this._pageCoordinatesBrand = void 0; } toClientCoordinates(e) { - return new uU(this.x - e.scrollX, this.y - e.scrollY); + return new __(this.x - e.scrollX, this.y - e.scrollY); } } -class uU { +class __ { constructor(e, t) { this.clientX = e, this.clientY = t, this._clientCoordinatesBrand = void 0; } toPageCoordinates(e) { - return new aI(this.clientX + e.scrollX, this.clientY + e.scrollY); + return new Vx(this.clientX + e.scrollX, this.clientY + e.scrollY); } } -class pse { +class roe { constructor(e, t, i, n) { this.x = e, this.y = t, this.width = i, this.height = n, this._editorPagePositionBrand = void 0; } } -class fse { +class coe { constructor(e, t) { this.x = e, this.y = t, this._positionRelativeToEditorBrand = void 0; } } -function PE(s) { +function bJ(s) { const e = yi(s); - return new pse(e.left, e.top, e.width, e.height); + return new roe(e.left, e.top, e.width, e.height); } -function BE(s, e, t) { - const i = e.width / s.offsetWidth, n = e.height / s.offsetHeight, o = (t.x - e.x) / i, r = (t.y - e.y) / n; - return new fse(o, r); +function pJ(s, e, t) { + const i = e.width / s.offsetWidth, n = e.height / s.offsetHeight, o = (t.x - e.x) / i, l = (t.y - e.y) / n; + return new coe(o, l); } -class Vh extends Er { +class Hh extends Fl { constructor(e, t, i) { - super(xe(i), e), this._editorMouseEventBrand = void 0, this.isFromPointerCapture = t, this.pos = new aI(this.posx, this.posy), this.editorPos = PE(i), this.relativePos = BE(i, this.editorPos, this.pos); + super(Le(i), e), this._editorMouseEventBrand = void 0, this.isFromPointerCapture = t, this.pos = new Vx(this.posx, this.posy), this.editorPos = bJ(i), this.relativePos = pJ(i, this.editorPos, this.pos); } } -class bse { +class doe { constructor(e) { this._editorViewDomNode = e; } _create(e) { - return new Vh(e, !1, this._editorViewDomNode); + return new Hh(e, !1, this._editorViewDomNode); } onContextMenu(e, t) { return z(e, "contextmenu", (i) => { @@ -19757,12 +19757,12 @@ class bse { return z(e, "mousemove", (i) => t(this._create(i))); } } -class yse { +class aoe { constructor(e) { this._editorViewDomNode = e; } _create(e) { - return new Vh(e, !1, this._editorViewDomNode); + return new Hh(e, !1, this._editorViewDomNode); } onPointerUp(e, t) { return z(e, "pointerup", (i) => { @@ -19783,26 +19783,26 @@ class yse { return z(e, "pointermove", (i) => t(this._create(i))); } } -class wse extends R { +class hoe extends J { constructor(e) { - super(), this._editorViewDomNode = e, this._globalPointerMoveMonitor = this._register(new n0()), this._keydownListener = null; + super(), this._editorViewDomNode = e, this._globalPointerMoveMonitor = this._register(new d0()), this._keydownListener = null; } startMonitoring(e, t, i, n, o) { - this._keydownListener = ai(e.ownerDocument, "keydown", (r) => { - r.toKeyCodeChord().isModifierKey() || this._globalPointerMoveMonitor.stopMonitoring(!0, r.browserEvent); - }, !0), this._globalPointerMoveMonitor.startMonitoring(e, t, i, (r) => { - n(new Vh(r, !0, this._editorViewDomNode)); - }, (r) => { - this._keydownListener.dispose(), o(r); + this._keydownListener = di(e.ownerDocument, "keydown", (l) => { + l.toKeyCodeChord().isModifierKey() || this._globalPointerMoveMonitor.stopMonitoring(!0, l.browserEvent); + }, !0), this._globalPointerMoveMonitor.startMonitoring(e, t, i, (l) => { + n(new Hh(l, !0, this._editorViewDomNode)); + }, (l) => { + this._keydownListener.dispose(), o(l); }); } stopMonitoring() { this._globalPointerMoveMonitor.stopMonitoring(!0); } } -const sZ = class sZ { +const y2 = class y2 { constructor(e) { - this._editor = e, this._instanceId = ++sZ._idPool, this._counter = 0, this._rules = /* @__PURE__ */ new Map(), this._garbageCollectionScheduler = new Zt(() => this.garbageCollect(), 1e3); + this._editor = e, this._instanceId = ++y2._idPool, this._counter = 0, this._rules = /* @__PURE__ */ new Map(), this._garbageCollectionScheduler = new St(() => this.garbageCollect(), 1e3); } createClassNameRef(e) { const t = this.getOrCreateRule(e); @@ -19818,7 +19818,7 @@ const sZ = class sZ { let i = this._rules.get(t); if (!i) { const n = this._counter++; - i = new Cse(t, `dyn-rule-${this._instanceId}-${n}`, cA(this._editor.getContainerDomNode()) ? this._editor.getContainerDomNode() : void 0, e), this._rules.set(t, i); + i = new uoe(t, `dyn-rule-${this._instanceId}-${n}`, LV(this._editor.getContainerDomNode()) ? this._editor.getContainerDomNode() : void 0, e), this._rules.set(t, i); } return i; } @@ -19830,21 +19830,21 @@ const sZ = class sZ { e.hasReferences() || (this._rules.delete(e.key), e.dispose()); } }; -sZ._idPool = 0; -let _A = sZ; -class Cse { +y2._idPool = 0; +let zV = y2; +class uoe { constructor(e, t, i, n) { - this.key = e, this.className = t, this.properties = n, this._referenceCount = 0, this._styleElementDisposables = new U(), this._styleElement = Bo(i, void 0, this._styleElementDisposables), this._styleElement.textContent = this.getCssText(this.className, this.properties); + this.key = e, this.className = t, this.properties = n, this._referenceCount = 0, this._styleElementDisposables = new _(), this._styleElement = Po(i, void 0, this._styleElementDisposables), this._styleElement.textContent = this.getCssText(this.className, this.properties); } getCssText(e, t) { let i = `.${e} {`; for (const n in t) { const o = t[n]; - let r; - typeof o == "object" ? r = de(o.id) : r = o; - const l = Sse(n); + let l; + typeof o == "object" ? l = ae(o.id) : l = o; + const r = moe(n); i += ` - ${l}: ${r};`; + ${r}: ${l};`; } return i += ` }`, i; @@ -19862,10 +19862,10 @@ class Cse { return this._referenceCount > 0; } } -function Sse(s) { +function moe(s) { return s.replace(/(^[A-Z])/, ([e]) => e.toLowerCase()).replace(/([A-Z])/g, ([e]) => `-${e.toLowerCase()}`); } -class yC extends R { +class wG extends J { constructor() { super(), this._shouldRender = !0; } @@ -20003,7 +20003,7 @@ class yC extends R { t && (this._shouldRender = !0); } } -class wo extends yC { +class Go extends wG { constructor(e) { super(), this._context = e, this._context.addEventHandler(this); } @@ -20011,7 +20011,7 @@ class wo extends yC { this._context.removeEventHandler(this), super.dispose(); } } -class Tl { +class vr { static write(e, t) { e.setAttribute("data-mprt", String(t)); } @@ -20025,12 +20025,12 @@ class Tl { for (; e && e !== e.ownerDocument.body && e !== t; ) e.nodeType === e.ELEMENT_NODE && (i[n++] = this.read(e)), e = e.parentElement; const o = new Uint8Array(n); - for (let r = 0; r < n; r++) - o[r] = i[n - r - 1]; + for (let l = 0; l < n; l++) + o[l] = i[n - l - 1]; return o; } } -class Lse { +class boe { constructor(e, t) { this._restrictedRenderingContextBrand = void 0, this._viewLayout = e, this.viewportData = t, this.scrollWidth = this._viewLayout.getScrollWidth(), this.scrollHeight = this._viewLayout.getScrollHeight(), this.visibleRange = this.viewportData.visibleRange, this.bigNumbersDelta = this.viewportData.bigNumbersDelta; const i = this._viewLayout.getCurrentViewport(); @@ -20049,7 +20049,7 @@ class Lse { return this.viewportData.getDecorationsInViewport(); } } -class Ase extends Lse { +class poe extends boe { constructor(e, t, i) { super(e, t), this._renderingContextBrand = void 0, this._viewLines = i; } @@ -20060,17 +20060,17 @@ class Ase extends Lse { return this._viewLines.visibleRangeForPosition(e); } } -class xse { +class goe { constructor(e, t, i, n) { this.outsideRenderedLine = e, this.lineNumber = t, this.ranges = i, this.continuesOnNextLine = n; } } -class cI { +class Lx { static from(e) { const t = new Array(e.length); for (let i = 0, n = e.length; i < n; i++) { const o = e[i]; - t[i] = new cI(o.left, o.width); + t[i] = new Lx(o.left, o.width); } return t; } @@ -20081,7 +20081,7 @@ class cI { return `[${this.left},${this.width}]`; } } -class cg { +class bm { constructor(e, t) { this._floatHorizontalRangeBrand = void 0, this.left = e, this.width = t; } @@ -20092,17 +20092,17 @@ class cg { return e.left - t.left; } } -class Mse { +class Zoe { constructor(e, t) { this.outsideRenderedLine = e, this.originalLeft = t, this.left = Math.round(this.originalLeft); } } -class PF { +class bF { constructor(e, t) { this.outsideRenderedLine = e, this.ranges = t; } } -class CL { +class kX { static _createRange() { return this._handyReadyRange || (this._handyReadyRange = document.createRange()), this._handyReadyRange; } @@ -20110,24 +20110,24 @@ class CL { e.selectNodeContents(t); } static _readClientRects(e, t, i, n, o) { - const r = this._createRange(); + const l = this._createRange(); try { - return r.setStart(e, t), r.setEnd(i, n), r.getClientRects(); + return l.setStart(e, t), l.setEnd(i, n), l.getClientRects(); } catch { return null; } finally { - this._detachRange(r, o); + this._detachRange(l, o); } } static _mergeAdjacentRanges(e) { if (e.length === 1) return e; - e.sort(cg.compare); + e.sort(bm.compare); const t = []; let i = 0, n = e[0]; - for (let o = 1, r = e.length; o < r; o++) { - const l = e[o]; - n.left + n.width + 0.9 >= l.left ? n.width = Math.max(n.width, l.left + l.width - n.left) : (t[i++] = n, n = l); + for (let o = 1, l = e.length; o < l; o++) { + const r = e[o]; + n.left + n.width + 0.9 >= r.left ? n.width = Math.max(n.width, r.left + r.width - n.left) : (t[i++] = n, n = r); } return t[i++] = n, t; } @@ -20135,30 +20135,30 @@ class CL { if (!e || e.length === 0) return null; const n = []; - for (let o = 0, r = e.length; o < r; o++) { - const l = e[o]; - n[o] = new cg(Math.max(0, (l.left - t) / i), l.width / i); + for (let o = 0, l = e.length; o < l; o++) { + const r = e[o]; + n[o] = new bm(Math.max(0, (r.left - t) / i), r.width / i); } return this._mergeAdjacentRanges(n); } - static readHorizontalRanges(e, t, i, n, o, r) { - const a = e.children.length - 1; - if (0 > a) + static readHorizontalRanges(e, t, i, n, o, l) { + const c = e.children.length - 1; + if (0 > c) return null; - if (t = Math.min(a, Math.max(0, t)), n = Math.min(a, Math.max(0, n)), t === n && i === o && i === 0 && !e.children[t].firstChild) { + if (t = Math.min(c, Math.max(0, t)), n = Math.min(c, Math.max(0, n)), t === n && i === o && i === 0 && !e.children[t].firstChild) { const u = e.children[t].getClientRects(); - return r.markDidDomLayout(), this._createHorizontalRangesFromClientRects(u, r.clientRectDeltaLeft, r.clientRectScale); + return l.markDidDomLayout(), this._createHorizontalRangesFromClientRects(u, l.clientRectDeltaLeft, l.clientRectScale); } t !== n && n > 0 && o === 0 && (n--, o = 1073741824); - let c = e.children[t].firstChild, d = e.children[n].firstChild; - if ((!c || !d) && (!c && i === 0 && t > 0 && (c = e.children[t - 1].firstChild, i = 1073741824), !d && o === 0 && n > 0 && (d = e.children[n - 1].firstChild, o = 1073741824)), !c || !d) + let d = e.children[t].firstChild, a = e.children[n].firstChild; + if ((!d || !a) && (!d && i === 0 && t > 0 && (d = e.children[t - 1].firstChild, i = 1073741824), !a && o === 0 && n > 0 && (a = e.children[n - 1].firstChild, o = 1073741824)), !d || !a) return null; - i = Math.min(c.textContent.length, Math.max(0, i)), o = Math.min(d.textContent.length, Math.max(0, o)); - const h = this._readClientRects(c, i, d, o, r.endNode); - return r.markDidDomLayout(), this._createHorizontalRangesFromClientRects(h, r.clientRectDeltaLeft, r.clientRectScale); + i = Math.min(d.textContent.length, Math.max(0, i)), o = Math.min(a.textContent.length, Math.max(0, o)); + const h = this._readClientRects(d, i, a, o, l.endNode); + return l.markDidDomLayout(), this._createHorizontalRangesFromClientRects(h, l.clientRectDeltaLeft, l.clientRectScale); } } -class ds { +class us { constructor(e, t, i, n) { this.startColumn = e, this.endColumn = t, this.className = i, this.type = n, this._lineDecorationBrand = void 0; } @@ -20170,30 +20170,30 @@ class ds { if (i !== n) return !1; for (let o = 0; o < i; o++) - if (!ds._equals(e[o], t[o])) + if (!us._equals(e[o], t[o])) return !1; return !0; } static extractWrapped(e, t, i) { if (e.length === 0) return e; - const n = t + 1, o = i + 1, r = i - t, l = []; - let a = 0; - for (const c of e) - c.endColumn <= n || c.startColumn >= o || (l[a++] = new ds(Math.max(1, c.startColumn - n + 1), Math.min(r + 1, c.endColumn - n + 1), c.className, c.type)); - return l; + const n = t + 1, o = i + 1, l = i - t, r = []; + let c = 0; + for (const d of e) + d.endColumn <= n || d.startColumn >= o || (r[c++] = new us(Math.max(1, d.startColumn - n + 1), Math.min(l + 1, d.endColumn - n + 1), d.className, d.type)); + return r; } static filter(e, t, i, n) { if (e.length === 0) return []; const o = []; - let r = 0; - for (let l = 0, a = e.length; l < a; l++) { - const c = e[l], d = c.range; - if (d.endLineNumber < t || d.startLineNumber > t || d.isEmpty() && (c.type === 0 || c.type === 3)) + let l = 0; + for (let r = 0, c = e.length; r < c; r++) { + const d = e[r], a = d.range; + if (a.endLineNumber < t || a.startLineNumber > t || a.isEmpty() && (d.type === 0 || d.type === 3)) continue; - const h = d.startLineNumber === t ? d.startColumn : i, u = d.endLineNumber === t ? d.endColumn : n; - o[r++] = new ds(h, u, c.inlineClassName, c.type); + const h = a.startLineNumber === t ? a.startColumn : i, u = a.endLineNumber === t ? a.endColumn : n; + o[l++] = new us(h, u, d.inlineClassName, d.type); } return o; } @@ -20206,16 +20206,16 @@ class ds { return e.startColumn - t.startColumn; if (e.endColumn !== t.endColumn) return e.endColumn - t.endColumn; - const i = ds._typeCompare(e.type, t.type); + const i = us._typeCompare(e.type, t.type); return i !== 0 ? i : e.className !== t.className ? e.className < t.className ? -1 : 1 : 0; } } -class BF { +class pF { constructor(e, t, i, n) { this.startOffset = e, this.endOffset = t, this.className = i, this.metadata = n; } } -class IA { +class AV { constructor() { this.stopOffsets = [], this.classNames = [], this.metadata = [], this.count = 0; } @@ -20230,9 +20230,9 @@ class IA { let n = 0; for (; n + 1 < this.count && this.stopOffsets[n] === this.stopOffsets[n + 1]; ) n++; - i.push(new BF(t, this.stopOffsets[n], this.classNames.join(" "), IA._metadata(this.metadata))), t = this.stopOffsets[n] + 1, this.stopOffsets.splice(0, n + 1), this.classNames.splice(0, n + 1), this.metadata.splice(0, n + 1), this.count -= n + 1; + i.push(new pF(t, this.stopOffsets[n], this.classNames.join(" "), AV._metadata(this.metadata))), t = this.stopOffsets[n] + 1, this.stopOffsets.splice(0, n + 1), this.classNames.splice(0, n + 1), this.metadata.splice(0, n + 1), this.count -= n + 1; } - return this.count > 0 && t < e && (i.push(new BF(t, e - 1, this.classNames.join(" "), IA._metadata(this.metadata))), t = e), t; + return this.count > 0 && t < e && (i.push(new pF(t, e - 1, this.classNames.join(" "), AV._metadata(this.metadata))), t = e), t; } insert(e, t, i) { if (this.count === 0 || this.stopOffsets[this.count - 1] <= e) @@ -20246,34 +20246,34 @@ class IA { this.count++; } } -class Zse { +class foe { /** * Normalize line decorations. Overlapping decorations will generate multiple segments */ static normalize(e, t) { if (t.length === 0) return []; - const i = [], n = new IA(); + const i = [], n = new AV(); let o = 0; - for (let r = 0, l = t.length; r < l; r++) { - const a = t[r]; - let c = a.startColumn, d = a.endColumn; - const h = a.className, u = a.type === 1 ? 2 : a.type === 2 ? 4 : 0; - if (c > 1) { - const f = e.charCodeAt(c - 2); - Hi(f) && c--; - } + for (let l = 0, r = t.length; l < r; l++) { + const c = t[l]; + let d = c.startColumn, a = c.endColumn; + const h = c.className, u = c.type === 1 ? 2 : c.type === 2 ? 4 : 0; if (d > 1) { - const f = e.charCodeAt(d - 2); - Hi(f) && d--; + const g = e.charCodeAt(d - 2); + Bi(g) && d--; + } + if (a > 1) { + const g = e.charCodeAt(a - 2); + Bi(g) && a--; } - const g = c - 1, m = d - 2; - o = n.consumeLowerThan(g, o, i), n.count === 0 && (o = g), n.insert(m, h, u); + const m = d - 1, b = a - 2; + o = n.consumeLowerThan(m, o, i), n.count === 0 && (o = m), n.insert(b, h, u); } return n.consumeLowerThan(1073741824, o, i), i; } } -class en { +class tn { constructor(e, t, i, n) { this.endIndex = e, this.type = t, this.metadata = i, this.containsRTL = n, this._linePartBrand = void 0; } @@ -20284,7 +20284,7 @@ class en { return !!(this.metadata & 4); } } -let gU = class { +let Q_ = class { constructor(e, t) { this.startOffset = e, this.endOffset = t; } @@ -20292,11 +20292,11 @@ let gU = class { return this.startOffset === e.startOffset && this.endOffset === e.endOffset; } }; -class Jh { - constructor(e, t, i, n, o, r, l, a, c, d, h, u, g, m, f, b, y, w, C) { - this.useMonospaceOptimizations = e, this.canUseHalfwidthRightwardsArrow = t, this.lineContent = i, this.continuesWithWrappedLine = n, this.isBasicASCII = o, this.containsRTL = r, this.fauxIndentLength = l, this.lineTokens = a, this.lineDecorations = c.sort(ds.compare), this.tabSize = d, this.startVisibleColumn = h, this.spaceWidth = u, this.stopRenderingLineAfter = f, this.renderWhitespace = b === "all" ? 4 : b === "boundary" ? 1 : b === "selection" ? 2 : b === "trailing" ? 3 : 0, this.renderControlCharacters = y, this.fontLigatures = w, this.selectionsOnLine = C && C.sort((x, Z) => x.startOffset < Z.startOffset ? -1 : 1); - const S = Math.abs(m - u), L = Math.abs(g - u); - S < L ? (this.renderSpaceWidth = m, this.renderSpaceCharCode = 11825) : (this.renderSpaceWidth = g, this.renderSpaceCharCode = 183); +class jh { + constructor(e, t, i, n, o, l, r, c, d, a, h, u, m, b, g, Z, f, y, W) { + this.useMonospaceOptimizations = e, this.canUseHalfwidthRightwardsArrow = t, this.lineContent = i, this.continuesWithWrappedLine = n, this.isBasicASCII = o, this.containsRTL = l, this.fauxIndentLength = r, this.lineTokens = c, this.lineDecorations = d.sort(us.compare), this.tabSize = a, this.startVisibleColumn = h, this.spaceWidth = u, this.stopRenderingLineAfter = g, this.renderWhitespace = Z === "all" ? 4 : Z === "boundary" ? 1 : Z === "selection" ? 2 : Z === "trailing" ? 3 : 0, this.renderControlCharacters = f, this.fontLigatures = y, this.selectionsOnLine = W && W.sort((L, S) => L.startOffset < S.startOffset ? -1 : 1); + const G = Math.abs(b - u), X = Math.abs(m - u); + G < X ? (this.renderSpaceWidth = b, this.renderSpaceCharCode = 11825) : (this.renderSpaceWidth = m, this.renderSpaceCharCode = 183); } sameSelection(e) { if (this.selectionsOnLine === null) @@ -20309,15 +20309,15 @@ class Jh { return !0; } equals(e) { - return this.useMonospaceOptimizations === e.useMonospaceOptimizations && this.canUseHalfwidthRightwardsArrow === e.canUseHalfwidthRightwardsArrow && this.lineContent === e.lineContent && this.continuesWithWrappedLine === e.continuesWithWrappedLine && this.isBasicASCII === e.isBasicASCII && this.containsRTL === e.containsRTL && this.fauxIndentLength === e.fauxIndentLength && this.tabSize === e.tabSize && this.startVisibleColumn === e.startVisibleColumn && this.spaceWidth === e.spaceWidth && this.renderSpaceWidth === e.renderSpaceWidth && this.renderSpaceCharCode === e.renderSpaceCharCode && this.stopRenderingLineAfter === e.stopRenderingLineAfter && this.renderWhitespace === e.renderWhitespace && this.renderControlCharacters === e.renderControlCharacters && this.fontLigatures === e.fontLigatures && ds.equalsArr(this.lineDecorations, e.lineDecorations) && this.lineTokens.equals(e.lineTokens) && this.sameSelection(e.selectionsOnLine); + return this.useMonospaceOptimizations === e.useMonospaceOptimizations && this.canUseHalfwidthRightwardsArrow === e.canUseHalfwidthRightwardsArrow && this.lineContent === e.lineContent && this.continuesWithWrappedLine === e.continuesWithWrappedLine && this.isBasicASCII === e.isBasicASCII && this.containsRTL === e.containsRTL && this.fauxIndentLength === e.fauxIndentLength && this.tabSize === e.tabSize && this.startVisibleColumn === e.startVisibleColumn && this.spaceWidth === e.spaceWidth && this.renderSpaceWidth === e.renderSpaceWidth && this.renderSpaceCharCode === e.renderSpaceCharCode && this.stopRenderingLineAfter === e.stopRenderingLineAfter && this.renderWhitespace === e.renderWhitespace && this.renderControlCharacters === e.renderControlCharacters && this.fontLigatures === e.fontLigatures && us.equalsArr(this.lineDecorations, e.lineDecorations) && this.lineTokens.equals(e.lineTokens) && this.sameSelection(e.selectionsOnLine); } } -class mU { +class O_ { constructor(e, t) { this.partIndex = e, this.charIndex = t; } } -class ma { +class fc { static getPartIndex(e) { return (e & 4294901760) >>> 16; } @@ -20338,8 +20338,8 @@ class ma { return this.length === 0 ? 0 : e < 0 ? this._data[0] : e >= this.length ? this._data[this.length - 1] : this._data[e]; } getDomPosition(e) { - const t = this.charOffsetToPartData(e - 1), i = ma.getPartIndex(t), n = ma.getCharIndex(t); - return new mU(i, n); + const t = this.charOffsetToPartData(e - 1), i = fc.getPartIndex(t), n = fc.getCharIndex(t); + return new O_(i, n); } getColumn(e, t) { return this.partDataToCharOffset(e.partIndex, t, e.charIndex) + 1; @@ -20348,286 +20348,286 @@ class ma { if (this.length === 0) return 0; const n = (e << 16 | i << 0) >>> 0; - let o = 0, r = this.length - 1; - for (; o + 1 < r; ) { - const f = o + r >>> 1, b = this._data[f]; - if (b === n) - return f; - b > n ? r = f : o = f; - } - if (o === r) + let o = 0, l = this.length - 1; + for (; o + 1 < l; ) { + const g = o + l >>> 1, Z = this._data[g]; + if (Z === n) + return g; + Z > n ? l = g : o = g; + } + if (o === l) return o; - const l = this._data[o], a = this._data[r]; - if (l === n) + const r = this._data[o], c = this._data[l]; + if (r === n) return o; - if (a === n) - return r; - const c = ma.getPartIndex(l), d = ma.getCharIndex(l), h = ma.getPartIndex(a); + if (c === n) + return l; + const d = fc.getPartIndex(r), a = fc.getCharIndex(r), h = fc.getPartIndex(c); let u; - c !== h ? u = t : u = ma.getCharIndex(a); - const g = i - d, m = u - i; - return g <= m ? o : r; + d !== h ? u = t : u = fc.getCharIndex(c); + const m = i - a, b = u - i; + return m <= b ? o : l; } } -class lv { +class Cw { constructor(e, t, i) { this._renderLineOutputBrand = void 0, this.characterMapping = e, this.containsRTL = t, this.containsForeignElements = i; } } -function wC(s, e) { +function TG(s, e) { if (s.lineContent.length === 0) { if (s.lineDecorations.length > 0) { e.appendString(""); let t = 0, i = 0, n = 0; - for (const r of s.lineDecorations) - (r.type === 1 || r.type === 2) && (e.appendString(''), r.type === 1 && (n |= 1, t++), r.type === 2 && (n |= 2, i++)); + for (const l of s.lineDecorations) + (l.type === 1 || l.type === 2) && (e.appendString(''), l.type === 1 && (n |= 1, t++), l.type === 2 && (n |= 2, i++)); e.appendString(""); - const o = new ma(1, t + i); - return o.setColumnInfo(1, t, 0, 0), new lv(o, !1, n); + const o = new fc(1, t + i); + return o.setColumnInfo(1, t, 0, 0), new Cw(o, !1, n); } - return e.appendString(""), new lv( - new ma(0, 0), + return e.appendString(""), new Cw( + new fc(0, 0), !1, 0 /* ForeignElementType.None */ ); } - return kse(Nse(s), e); + return xoe(Goe(s), e); } -class _se { +class yoe { constructor(e, t, i, n) { this.characterMapping = e, this.html = t, this.containsRTL = i, this.containsForeignElements = n; } } -function dI(s) { - const e = new e0(1e4), t = wC(s, e); - return new _se(t.characterMapping, e.build(), t.containsRTL, t.containsForeignElements); +function Ix(s) { + const e = new l0(1e4), t = TG(s, e); + return new yoe(t.characterMapping, e.build(), t.containsRTL, t.containsForeignElements); } -class Ise { - constructor(e, t, i, n, o, r, l, a, c, d, h, u, g, m, f, b) { - this.fontIsMonospace = e, this.canUseHalfwidthRightwardsArrow = t, this.lineContent = i, this.len = n, this.isOverflowing = o, this.overflowingCharCount = r, this.parts = l, this.containsForeignElements = a, this.fauxIndentLength = c, this.tabSize = d, this.startVisibleColumn = h, this.containsRTL = u, this.spaceWidth = g, this.renderSpaceCharCode = m, this.renderWhitespace = f, this.renderControlCharacters = b; +class Woe { + constructor(e, t, i, n, o, l, r, c, d, a, h, u, m, b, g, Z) { + this.fontIsMonospace = e, this.canUseHalfwidthRightwardsArrow = t, this.lineContent = i, this.len = n, this.isOverflowing = o, this.overflowingCharCount = l, this.parts = r, this.containsForeignElements = c, this.fauxIndentLength = d, this.tabSize = a, this.startVisibleColumn = h, this.containsRTL = u, this.spaceWidth = m, this.renderSpaceCharCode = b, this.renderWhitespace = g, this.renderControlCharacters = Z; } } -function Nse(s) { +function Goe(s) { const e = s.lineContent; let t, i, n; s.stopRenderingLineAfter !== -1 && s.stopRenderingLineAfter < e.length ? (t = !0, i = e.length - s.stopRenderingLineAfter, n = s.stopRenderingLineAfter) : (t = !1, i = 0, n = e.length); - let o = Wse(e, s.containsRTL, s.lineTokens, s.fauxIndentLength, n); - s.renderControlCharacters && !s.isBasicASCII && (o = Tse(e, o)), (s.renderWhitespace === 4 || s.renderWhitespace === 1 || s.renderWhitespace === 2 && s.selectionsOnLine || s.renderWhitespace === 3 && !s.continuesWithWrappedLine) && (o = Dse(s, e, n, o)); - let r = 0; + let o = Xoe(e, s.containsRTL, s.lineTokens, s.fauxIndentLength, n); + s.renderControlCharacters && !s.isBasicASCII && (o = Loe(e, o)), (s.renderWhitespace === 4 || s.renderWhitespace === 1 || s.renderWhitespace === 2 && s.selectionsOnLine || s.renderWhitespace === 3 && !s.continuesWithWrappedLine) && (o = Ioe(s, e, n, o)); + let l = 0; if (s.lineDecorations.length > 0) { - for (let l = 0, a = s.lineDecorations.length; l < a; l++) { - const c = s.lineDecorations[l]; - c.type === 3 || c.type === 1 ? r |= 1 : c.type === 2 && (r |= 2); + for (let r = 0, c = s.lineDecorations.length; r < c; r++) { + const d = s.lineDecorations[r]; + d.type === 3 || d.type === 1 ? l |= 1 : d.type === 2 && (l |= 2); } - o = Vse(e, n, o, s.lineDecorations); + o = Soe(e, n, o, s.lineDecorations); } - return s.containsRTL || (o = vse(e, o, !s.isBasicASCII || s.fontLigatures)), new Ise(s.useMonospaceOptimizations, s.canUseHalfwidthRightwardsArrow, e, n, t, i, o, r, s.fauxIndentLength, s.tabSize, s.startVisibleColumn, s.containsRTL, s.spaceWidth, s.renderSpaceCharCode, s.renderWhitespace, s.renderControlCharacters); + return s.containsRTL || (o = Voe(e, o, !s.isBasicASCII || s.fontLigatures)), new Woe(s.useMonospaceOptimizations, s.canUseHalfwidthRightwardsArrow, e, n, t, i, o, l, s.fauxIndentLength, s.tabSize, s.startVisibleColumn, s.containsRTL, s.spaceWidth, s.renderSpaceCharCode, s.renderWhitespace, s.renderControlCharacters); } -function Wse(s, e, t, i, n) { +function Xoe(s, e, t, i, n) { const o = []; - let r = 0; - i > 0 && (o[r++] = new en(i, "", 0, !1)); - let l = i; - for (let a = 0, c = t.getCount(); a < c; a++) { - const d = t.getEndOffset(a); - if (d <= i) + let l = 0; + i > 0 && (o[l++] = new tn(i, "", 0, !1)); + let r = i; + for (let c = 0, d = t.getCount(); c < d; c++) { + const a = t.getEndOffset(c); + if (a <= i) continue; - const h = t.getClassName(a); - if (d >= n) { - const g = e ? lb(s.substring(l, n)) : !1; - o[r++] = new en(n, h, 0, g); + const h = t.getClassName(c); + if (a >= n) { + const m = e ? mZ(s.substring(r, n)) : !1; + o[l++] = new tn(n, h, 0, m); break; } - const u = e ? lb(s.substring(l, d)) : !1; - o[r++] = new en(d, h, 0, u), l = d; + const u = e ? mZ(s.substring(r, a)) : !1; + o[l++] = new tn(a, h, 0, u), r = a; } return o; } -function vse(s, e, t) { +function Voe(s, e, t) { let i = 0; const n = []; let o = 0; if (t) - for (let r = 0, l = e.length; r < l; r++) { - const a = e[r], c = a.endIndex; - if (i + 50 < c) { - const d = a.type, h = a.metadata, u = a.containsRTL; - let g = -1, m = i; - for (let f = i; f < c; f++) - s.charCodeAt(f) === 32 && (g = f), g !== -1 && f - m >= 50 && (n[o++] = new en(g + 1, d, h, u), m = g + 1, g = -1); - m !== c && (n[o++] = new en(c, d, h, u)); + for (let l = 0, r = e.length; l < r; l++) { + const c = e[l], d = c.endIndex; + if (i + 50 < d) { + const a = c.type, h = c.metadata, u = c.containsRTL; + let m = -1, b = i; + for (let g = i; g < d; g++) + s.charCodeAt(g) === 32 && (m = g), m !== -1 && g - b >= 50 && (n[o++] = new tn(m + 1, a, h, u), b = m + 1, m = -1); + b !== d && (n[o++] = new tn(d, a, h, u)); } else - n[o++] = a; - i = c; + n[o++] = c; + i = d; } else - for (let r = 0, l = e.length; r < l; r++) { - const a = e[r], c = a.endIndex, d = c - i; - if (d > 50) { - const h = a.type, u = a.metadata, g = a.containsRTL, m = Math.ceil( - d / 50 + for (let l = 0, r = e.length; l < r; l++) { + const c = e[l], d = c.endIndex, a = d - i; + if (a > 50) { + const h = c.type, u = c.metadata, m = c.containsRTL, b = Math.ceil( + a / 50 /* Constants.LongToken */ ); - for (let f = 1; f < m; f++) { - const b = i + f * 50; - n[o++] = new en(b, h, u, g); + for (let g = 1; g < b; g++) { + const Z = i + g * 50; + n[o++] = new tn(Z, h, u, m); } - n[o++] = new en(c, h, u, g); + n[o++] = new tn(d, h, u, m); } else - n[o++] = a; - i = c; + n[o++] = c; + i = d; } return n; } -function pU(s) { +function j_(s) { return s < 32 ? s !== 9 : s === 127 || s >= 8234 && s <= 8238 || s >= 8294 && s <= 8297 || s >= 8206 && s <= 8207 || s === 1564; } -function Tse(s, e) { +function Loe(s, e) { const t = []; - let i = new en(0, "", 0, !1), n = 0; + let i = new tn(0, "", 0, !1), n = 0; for (const o of e) { - const r = o.endIndex; - for (; n < r; n++) { - const l = s.charCodeAt(n); - pU(l) && (n > i.endIndex && (i = new en(n, o.type, o.metadata, o.containsRTL), t.push(i)), i = new en(n + 1, "mtkcontrol", o.metadata, !1), t.push(i)); + const l = o.endIndex; + for (; n < l; n++) { + const r = s.charCodeAt(n); + j_(r) && (n > i.endIndex && (i = new tn(n, o.type, o.metadata, o.containsRTL), t.push(i)), i = new tn(n + 1, "mtkcontrol", o.metadata, !1), t.push(i)); } - n > i.endIndex && (i = new en(r, o.type, o.metadata, o.containsRTL), t.push(i)); + n > i.endIndex && (i = new tn(l, o.type, o.metadata, o.containsRTL), t.push(i)); } return t; } -function Dse(s, e, t, i) { - const n = s.continuesWithWrappedLine, o = s.fauxIndentLength, r = s.tabSize, l = s.startVisibleColumn, a = s.useMonospaceOptimizations, c = s.selectionsOnLine, d = s.renderWhitespace === 1, h = s.renderWhitespace === 3, u = s.renderSpaceWidth !== s.spaceWidth, g = []; - let m = 0, f = 0, b = i[f].type, y = i[f].containsRTL, w = i[f].endIndex; - const C = i.length; - let S = !1, L = qn(e), x; - L === -1 ? (S = !0, L = t, x = t) : x = Ml(e); - let Z = !1, _ = 0, v = c && c[_], P = l % r; - for (let Y = o; Y < t; Y++) { - const B = e.charCodeAt(Y); - v && Y >= v.endOffset && (_++, v = c && c[_]); - let X; - if (Y < L || Y > x) - X = !0; - else if (B === 9) - X = !0; - else if (B === 32) - if (d) - if (Z) - X = !0; +function Ioe(s, e, t, i) { + const n = s.continuesWithWrappedLine, o = s.fauxIndentLength, l = s.tabSize, r = s.startVisibleColumn, c = s.useMonospaceOptimizations, d = s.selectionsOnLine, a = s.renderWhitespace === 1, h = s.renderWhitespace === 3, u = s.renderSpaceWidth !== s.spaceWidth, m = []; + let b = 0, g = 0, Z = i[g].type, f = i[g].containsRTL, y = i[g].endIndex; + const W = i.length; + let G = !1, X = es(e), L; + X === -1 ? (G = !0, X = t, L = t) : L = Rr(e); + let S = !1, x = 0, w = d && d[x], A = r % l; + for (let F = o; F < t; F++) { + const K = e.charCodeAt(F); + w && F >= w.endOffset && (x++, w = d && d[x]); + let E; + if (F < X || F > L) + E = !0; + else if (K === 9) + E = !0; + else if (K === 32) + if (a) + if (S) + E = !0; else { - const j = Y + 1 < t ? e.charCodeAt(Y + 1) : 0; - X = j === 32 || j === 9; + const j = F + 1 < t ? e.charCodeAt(F + 1) : 0; + E = j === 32 || j === 9; } else - X = !0; + E = !0; else - X = !1; - if (X && c && (X = !!v && v.startOffset <= Y && v.endOffset > Y), X && h && (X = S || Y > x), X && y && Y >= L && Y <= x && (X = !1), Z) { - if (!X || !a && P >= r) { + E = !1; + if (E && d && (E = !!w && w.startOffset <= F && w.endOffset > F), E && h && (E = G || F > L), E && f && F >= X && F <= L && (E = !1), S) { + if (!E || !c && A >= l) { if (u) { - const j = m > 0 ? g[m - 1].endIndex : o; - for (let le = j + 1; le <= Y; le++) - g[m++] = new en(le, "mtkw", 1, !1); + const j = b > 0 ? m[b - 1].endIndex : o; + for (let re = j + 1; re <= F; re++) + m[b++] = new tn(re, "mtkw", 1, !1); } else - g[m++] = new en(Y, "mtkw", 1, !1); - P = P % r; + m[b++] = new tn(F, "mtkw", 1, !1); + A = A % l; } } else - (Y === w || X && Y > o) && (g[m++] = new en(Y, b, 0, y), P = P % r); - for (B === 9 ? P = r : Nh(B) ? P += 2 : P++, Z = X; Y === w && (f++, f < C); ) - b = i[f].type, y = i[f].containsRTL, w = i[f].endIndex; - } - let E = !1; - if (Z) - if (n && d) { - const Y = t > 0 ? e.charCodeAt(t - 1) : 0, B = t > 1 ? e.charCodeAt(t - 2) : 0; - Y === 32 && B !== 32 && B !== 9 || (E = !0); + (F === y || E && F > o) && (m[b++] = new tn(F, Z, 0, f), A = A % l); + for (K === 9 ? A = l : Mh(K) ? A += 2 : A++, S = E; F === y && (g++, g < W); ) + Z = i[g].type, f = i[g].containsRTL, y = i[g].endIndex; + } + let H = !1; + if (S) + if (n && a) { + const F = t > 0 ? e.charCodeAt(t - 1) : 0, K = t > 1 ? e.charCodeAt(t - 2) : 0; + F === 32 && K !== 32 && K !== 9 || (H = !0); } else - E = !0; - if (E) + H = !0; + if (H) if (u) { - const Y = m > 0 ? g[m - 1].endIndex : o; - for (let B = Y + 1; B <= t; B++) - g[m++] = new en(B, "mtkw", 1, !1); + const F = b > 0 ? m[b - 1].endIndex : o; + for (let K = F + 1; K <= t; K++) + m[b++] = new tn(K, "mtkw", 1, !1); } else - g[m++] = new en(t, "mtkw", 1, !1); + m[b++] = new tn(t, "mtkw", 1, !1); else - g[m++] = new en(t, b, 0, y); - return g; + m[b++] = new tn(t, Z, 0, f); + return m; } -function Vse(s, e, t, i) { - i.sort(ds.compare); - const n = Zse.normalize(s, i), o = n.length; - let r = 0; - const l = []; - let a = 0, c = 0; +function Soe(s, e, t, i) { + i.sort(us.compare); + const n = foe.normalize(s, i), o = n.length; + let l = 0; + const r = []; + let c = 0, d = 0; for (let h = 0, u = t.length; h < u; h++) { - const g = t[h], m = g.endIndex, f = g.type, b = g.metadata, y = g.containsRTL; - for (; r < o && n[r].startOffset < m; ) { - const w = n[r]; - if (w.startOffset > c && (c = w.startOffset, l[a++] = new en(c, f, b, y)), w.endOffset + 1 <= m) - c = w.endOffset + 1, l[a++] = new en(c, f + " " + w.className, b | w.metadata, y), r++; + const m = t[h], b = m.endIndex, g = m.type, Z = m.metadata, f = m.containsRTL; + for (; l < o && n[l].startOffset < b; ) { + const y = n[l]; + if (y.startOffset > d && (d = y.startOffset, r[c++] = new tn(d, g, Z, f)), y.endOffset + 1 <= b) + d = y.endOffset + 1, r[c++] = new tn(d, g + " " + y.className, Z | y.metadata, f), l++; else { - c = m, l[a++] = new en(c, f + " " + w.className, b | w.metadata, y); + d = b, r[c++] = new tn(d, g + " " + y.className, Z | y.metadata, f); break; } } - m > c && (c = m, l[a++] = new en(c, f, b, y)); + b > d && (d = b, r[c++] = new tn(d, g, Z, f)); } - const d = t[t.length - 1].endIndex; - if (r < o && n[r].startOffset === d) - for (; r < o && n[r].startOffset === d; ) { - const h = n[r]; - l[a++] = new en(c, h.className, h.metadata, !1), r++; + const a = t[t.length - 1].endIndex; + if (l < o && n[l].startOffset === a) + for (; l < o && n[l].startOffset === a; ) { + const h = n[l]; + r[c++] = new tn(d, h.className, h.metadata, !1), l++; } - return l; + return r; } -function kse(s, e) { - const t = s.fontIsMonospace, i = s.canUseHalfwidthRightwardsArrow, n = s.containsForeignElements, o = s.lineContent, r = s.len, l = s.isOverflowing, a = s.overflowingCharCount, c = s.parts, d = s.fauxIndentLength, h = s.tabSize, u = s.startVisibleColumn, g = s.containsRTL, m = s.spaceWidth, f = s.renderSpaceCharCode, b = s.renderWhitespace, y = s.renderControlCharacters, w = new ma(r + 1, c.length); - let C = !1, S = 0, L = u, x = 0, Z = 0, _ = 0; - g ? e.appendString('') : e.appendString(""); - for (let v = 0, P = c.length; v < P; v++) { - const E = c[v], Y = E.endIndex, B = E.type, X = E.containsRTL, j = b !== 0 && E.isWhitespace(), le = j && !t && (B === "mtkw" || !n), ue = S === Y && E.isPseudoAfter(); - if (x = 0, e.appendString("') : e.appendString(""); + for (let w = 0, A = d.length; w < A; w++) { + const H = d[w], F = H.endIndex, K = H.type, E = H.containsRTL, j = Z !== 0 && H.isWhitespace(), re = j && !t && (K === "mtkw" || !n), ue = G === F && H.isPseudoAfter(); + if (L = 0, e.appendString("= d && (Ve += ci); + let be = G, Ye = X; + for (; be < F; be++) { + const ai = (o.charCodeAt(be) === 9 ? h - Ye % h : 1) | 0; + Ze += ai, be >= a && (Ye += ai); } } - for (le && (e.appendString(' style="width:'), e.appendString(String(m * be)), e.appendString('px"')), e.appendASCIICharCode( + for (re && (e.appendString(' style="width:'), e.appendString(String(b * Ze)), e.appendString('px"')), e.appendASCIICharCode( 62 /* CharCode.GreaterThan */ - ); S < Y; S++) { - w.setColumnInfo(S + 1, v - _, x, Z), _ = 0; - const me = o.charCodeAt(S); - let Ve, ke; - if (me === 9) { - Ve = h - L % h | 0, ke = Ve, !i || ke > 1 ? e.appendCharCode(8594) : e.appendCharCode(65515); - for (let ci = 2; ci <= ke; ci++) + ); G < F; G++) { + y.setColumnInfo(G + 1, w - x, L, S), x = 0; + const be = o.charCodeAt(G); + let Ye, ke; + if (be === 9) { + Ye = h - X % h | 0, ke = Ye, !i || ke > 1 ? e.appendCharCode(8594) : e.appendCharCode(65515); + for (let ai = 2; ai <= ke; ai++) e.appendCharCode(160); } else - Ve = 2, ke = 1, e.appendCharCode(f), e.appendCharCode(8204); - x += Ve, Z += ke, S >= d && (L += ke); + Ye = 2, ke = 1, e.appendCharCode(g), e.appendCharCode(8204); + L += Ye, S += ke, G >= a && (X += ke); } } else for (e.appendASCIICharCode( 62 /* CharCode.GreaterThan */ - ); S < Y; S++) { - w.setColumnInfo(S + 1, v - _, x, Z), _ = 0; - const be = o.charCodeAt(S); - let me = 1, Ve = 1; - switch (be) { + ); G < F; G++) { + y.setColumnInfo(G + 1, w - x, L, S), x = 0; + const Ze = o.charCodeAt(G); + let be = 1, Ye = 1; + switch (Ze) { case 9: - me = h - L % h, Ve = me; - for (let ke = 1; ke <= me; ke++) + be = h - X % h, Ye = be; + for (let ke = 1; ke <= be; ke++) e.appendCharCode(160); break; case 32: @@ -20643,7 +20643,7 @@ function kse(s, e) { e.appendString("&"); break; case 0: - y ? e.appendCharCode(9216) : e.appendString("�"); + f ? e.appendCharCode(9216) : e.appendString("�"); break; case 65279: case 8232: @@ -20652,35 +20652,35 @@ function kse(s, e) { e.appendCharCode(65533); break; default: - Nh(be) && Ve++, y && be < 32 ? e.appendCharCode(9216 + be) : y && be === 127 ? e.appendCharCode(9249) : y && pU(be) ? (e.appendString("[U+"), e.appendString(Gse(be)), e.appendString("]"), me = 8, Ve = me) : e.appendCharCode(be); + Mh(Ze) && Ye++, f && Ze < 32 ? e.appendCharCode(9216 + Ze) : f && Ze === 127 ? e.appendCharCode(9249) : f && j_(Ze) ? (e.appendString("[U+"), e.appendString(Coe(Ze)), e.appendString("]"), be = 8, Ye = be) : e.appendCharCode(Ze); } - x += me, Z += Ve, S >= d && (L += Ve); + L += be, S += Ye, G >= a && (X += Ye); } - ue ? _++ : _ = 0, S >= r && !C && E.isPseudoAfter() && (C = !0, w.setColumnInfo(S + 1, v, x, Z)), e.appendString(""); + ue ? x++ : x = 0, G >= l && !W && H.isPseudoAfter() && (W = !0, y.setColumnInfo(G + 1, w, L, S)), e.appendString(""); } - return C || w.setColumnInfo(r + 1, c.length - 1, x, Z), l && (e.appendString(''), e.appendString(p("showMore", "Show more ({0})", Rse(a))), e.appendString("")), e.appendString(""), new lv(w, g, n); + return W || y.setColumnInfo(l + 1, d.length - 1, L, S), r && (e.appendString(''), e.appendString(p("showMore", "Show more ({0})", Roe(c))), e.appendString("")), e.appendString(""), new Cw(y, m, n); } -function Gse(s) { +function Coe(s) { return s.toString(16).toUpperCase().padStart(4, "0"); } -function Rse(s) { +function Roe(s) { return s < 1024 ? p("overflow.chars", "{0} chars", s) : s < 1024 * 1024 ? `${(s / 1024).toFixed(1)} KB` : `${(s / 1024 / 1024).toFixed(1)} MB`; } -var cr; +var hl; (function(s) { s.DARK = "dark", s.LIGHT = "light", s.HIGH_CONTRAST_DARK = "hcDark", s.HIGH_CONTRAST_LIGHT = "hcLight"; -})(cr || (cr = {})); -function Ma(s) { - return s === cr.HIGH_CONTRAST_DARK || s === cr.HIGH_CONTRAST_LIGHT; +})(hl || (hl = {})); +function Rc(s) { + return s === hl.HIGH_CONTRAST_DARK || s === hl.HIGH_CONTRAST_LIGHT; } -function hI(s) { - return s === cr.DARK || s === cr.HIGH_CONTRAST_DARK; +function Sx(s) { + return s === hl.DARK || s === hl.HIGH_CONTRAST_DARK; } -const Ese = /* @__PURE__ */ function() { - return Na ? !0 : !(fs || pr || xh); +const Noe = /* @__PURE__ */ function() { + return Mc ? !0 : !(fs || fl || Ch); }(); -let _f = !0; -class OF { +let Mg = !0; +class gF { constructor(e, t) { this.themeType = t; const i = e.options, n = i.get( @@ -20714,7 +20714,7 @@ class OF { return this.themeType === e.themeType && this.renderWhitespace === e.renderWhitespace && this.renderControlCharacters === e.renderControlCharacters && this.spaceWidth === e.spaceWidth && this.middotWidth === e.middotWidth && this.wsmiddotWidth === e.wsmiddotWidth && this.useMonospaceOptimizations === e.useMonospaceOptimizations && this.canUseHalfwidthRightwardsArrow === e.canUseHalfwidthRightwardsArrow && this.lineHeight === e.lineHeight && this.stopRenderingLineAfter === e.stopRenderingLineAfter && this.fontLigatures === e.fontLigatures; } } -const oZ = class oZ { +const W2 = class W2 { constructor(e) { this._options = e, this._isMaybeInvalid = !0, this._renderedViewLine = null; } @@ -20724,7 +20724,7 @@ const oZ = class oZ { } setDomNode(e) { if (this._renderedViewLine) - this._renderedViewLine.domNode = yt(e); + this._renderedViewLine.domNode = ft(e); else throw new Error("I have no rendered view line to set the dom node to..."); } @@ -20741,37 +20741,37 @@ const oZ = class oZ { this._isMaybeInvalid = !0, this._options = e; } onSelectionChanged() { - return Ma(this._options.themeType) || this._options.renderWhitespace === "selection" ? (this._isMaybeInvalid = !0, !0) : !1; + return Rc(this._options.themeType) || this._options.renderWhitespace === "selection" ? (this._isMaybeInvalid = !0, !0) : !1; } renderLine(e, t, i, n, o) { if (this._isMaybeInvalid === !1) return !1; this._isMaybeInvalid = !1; - const r = n.getViewLineRenderingData(e), l = this._options, a = ds.filter(r.inlineDecorations, e, r.minColumn, r.maxColumn); - let c = null; - if (Ma(l.themeType) || this._options.renderWhitespace === "selection") { - const g = n.selections; - for (const m of g) { - if (m.endLineNumber < e || m.startLineNumber > e) + const l = n.getViewLineRenderingData(e), r = this._options, c = us.filter(l.inlineDecorations, e, l.minColumn, l.maxColumn); + let d = null; + if (Rc(r.themeType) || this._options.renderWhitespace === "selection") { + const m = n.selections; + for (const b of m) { + if (b.endLineNumber < e || b.startLineNumber > e) continue; - const f = m.startLineNumber === e ? m.startColumn : r.minColumn, b = m.endLineNumber === e ? m.endColumn : r.maxColumn; - f < b && (Ma(l.themeType) && a.push(new ds( - f, - b, + const g = b.startLineNumber === e ? b.startColumn : l.minColumn, Z = b.endLineNumber === e ? b.endColumn : l.maxColumn; + g < Z && (Rc(r.themeType) && c.push(new us( + g, + Z, "inline-selected-text", 0 /* InlineDecorationType.Regular */ - )), this._options.renderWhitespace === "selection" && (c || (c = []), c.push(new gU(f - 1, b - 1)))); + )), this._options.renderWhitespace === "selection" && (d || (d = []), d.push(new Q_(g - 1, Z - 1)))); } } - const d = new Jh(l.useMonospaceOptimizations, l.canUseHalfwidthRightwardsArrow, r.content, r.continuesWithWrappedLine, r.isBasicASCII, r.containsRTL, r.minColumn - 1, r.tokens, a, r.tabSize, r.startVisibleColumn, l.spaceWidth, l.middotWidth, l.wsmiddotWidth, l.stopRenderingLineAfter, l.renderWhitespace, l.renderControlCharacters, l.fontLigatures !== Dh.OFF, c); - if (this._renderedViewLine && this._renderedViewLine.input.equals(d)) + const a = new jh(r.useMonospaceOptimizations, r.canUseHalfwidthRightwardsArrow, l.content, l.continuesWithWrappedLine, l.isBasicASCII, l.containsRTL, l.minColumn - 1, l.tokens, c, l.tabSize, l.startVisibleColumn, r.spaceWidth, r.middotWidth, r.wsmiddotWidth, r.stopRenderingLineAfter, r.renderWhitespace, r.renderControlCharacters, r.fontLigatures !== Jh.OFF, d); + if (this._renderedViewLine && this._renderedViewLine.input.equals(a)) return !1; - o.appendString('
'); - const h = wC(d, o); + o.appendString('
'); + const h = TG(a, o); o.appendString("
"); let u = null; - return _f && Ese && r.isBasicASCII && l.useMonospaceOptimizations && h.containsForeignElements === 0 && (u = new oS(this._renderedViewLine ? this._renderedViewLine.domNode : null, d, h.characterMapping)), u || (u = bU(this._renderedViewLine ? this._renderedViewLine.domNode : null, d, h.characterMapping, h.containsRTL, h.containsForeignElements)), this._renderedViewLine = u, !0; + return Mg && Noe && l.isBasicASCII && r.useMonospaceOptimizations && h.containsForeignElements === 0 && (u = new f1(this._renderedViewLine ? this._renderedViewLine.domNode : null, a, h.characterMapping)), u || (u = $_(this._renderedViewLine ? this._renderedViewLine.domNode : null, a, h.characterMapping, h.containsRTL, h.containsForeignElements)), this._renderedViewLine = u, !0; } layoutLine(e, t, i) { this._renderedViewLine && this._renderedViewLine.domNode && (this._renderedViewLine.domNode.setTop(t), this._renderedViewLine.domNode.setHeight(i)); @@ -20784,13 +20784,13 @@ const oZ = class oZ { return this._renderedViewLine ? this._renderedViewLine.getWidthIsFast() : !0; } needsMonospaceFontCheck() { - return this._renderedViewLine ? this._renderedViewLine instanceof oS : !1; + return this._renderedViewLine ? this._renderedViewLine instanceof f1 : !1; } monospaceAssumptionsAreValid() { - return this._renderedViewLine && this._renderedViewLine instanceof oS ? this._renderedViewLine.monospaceAssumptionsAreValid() : _f; + return this._renderedViewLine && this._renderedViewLine instanceof f1 ? this._renderedViewLine.monospaceAssumptionsAreValid() : Mg; } onMonospaceAssumptionsInvalidated() { - this._renderedViewLine && this._renderedViewLine instanceof oS && (this._renderedViewLine = this._renderedViewLine.toSlowRenderedLine()); + this._renderedViewLine && this._renderedViewLine instanceof f1 && (this._renderedViewLine = this._renderedViewLine.toSlowRenderedLine()); } getVisibleRangesForRange(e, t, i, n) { if (!this._renderedViewLine) @@ -20798,18 +20798,18 @@ const oZ = class oZ { t = Math.min(this._renderedViewLine.input.lineContent.length + 1, Math.max(1, t)), i = Math.min(this._renderedViewLine.input.lineContent.length + 1, Math.max(1, i)); const o = this._renderedViewLine.input.stopRenderingLineAfter; if (o !== -1 && t > o + 1 && i > o + 1) - return new PF(!0, [new cg(this.getWidth(n), 0)]); + return new bF(!0, [new bm(this.getWidth(n), 0)]); o !== -1 && t > o + 1 && (t = o + 1), o !== -1 && i > o + 1 && (i = o + 1); - const r = this._renderedViewLine.getVisibleRangesForRange(e, t, i, n); - return r && r.length > 0 ? new PF(!1, r) : null; + const l = this._renderedViewLine.getVisibleRangesForRange(e, t, i, n); + return l && l.length > 0 ? new bF(!1, l) : null; } getColumnOfNodeOffset(e, t) { return this._renderedViewLine ? this._renderedViewLine.getColumnOfNodeOffset(e, t) : 1; } }; -oZ.CLASS_NAME = "view-line"; -let wc = oZ; -class oS { +W2.CLASS_NAME = "view-line"; +let Vd = W2; +class f1 { constructor(e, t, i) { this._cachedWidth = -1, this.domNode = e, this.input = t; const n = Math.floor( @@ -20836,15 +20836,15 @@ class oS { } monospaceAssumptionsAreValid() { if (!this.domNode) - return _f; + return Mg; if (this.input.lineContent.length < 300) { const e = this.getWidth(null), t = this.domNode.domNode.firstChild.offsetWidth; - Math.abs(e - t) >= 2 && (console.warn("monospace assumptions have been violated, therefore disabling monospace optimizations!"), _f = !1); + Math.abs(e - t) >= 2 && (console.warn("monospace assumptions have been violated, therefore disabling monospace optimizations!"), Mg = !1); } - return _f; + return Mg; } toSlowRenderedLine() { - return bU( + return $_( this.domNode, this.input, this._characterMapping, @@ -20854,25 +20854,25 @@ class oS { ); } getVisibleRangesForRange(e, t, i, n) { - const o = this._getColumnPixelOffset(e, t, n), r = this._getColumnPixelOffset(e, i, n); - return [new cg(o, r - o)]; + const o = this._getColumnPixelOffset(e, t, n), l = this._getColumnPixelOffset(e, i, n); + return [new bm(o, l - o)]; } _getColumnPixelOffset(e, t, i) { if (t <= 300) { - const c = this._characterMapping.getHorizontalOffset(t); - return this._charWidth * c; + const d = this._characterMapping.getHorizontalOffset(t); + return this._charWidth * d; } const n = Math.floor( (t - 1) / 300 /* Constants.MaxMonospaceDistance */ ) - 1, o = (n + 1) * 300 + 1; - let r = -1; - if (this._keyColumnPixelOffsetCache && (r = this._keyColumnPixelOffsetCache[n], r === -1 && (r = this._actualReadPixelOffset(e, o, i), this._keyColumnPixelOffsetCache[n] = r)), r === -1) { - const c = this._characterMapping.getHorizontalOffset(t); - return this._charWidth * c; + let l = -1; + if (this._keyColumnPixelOffsetCache && (l = this._keyColumnPixelOffsetCache[n], l === -1 && (l = this._actualReadPixelOffset(e, o, i), this._keyColumnPixelOffsetCache[n] = l)), l === -1) { + const d = this._characterMapping.getHorizontalOffset(t); + return this._charWidth * d; } - const l = this._characterMapping.getHorizontalOffset(o), a = this._characterMapping.getHorizontalOffset(t); - return r + this._charWidth * (a - l); + const r = this._characterMapping.getHorizontalOffset(o), c = this._characterMapping.getHorizontalOffset(t); + return l + this._charWidth * (c - r); } _getReadingTarget(e) { return e.domNode.firstChild; @@ -20880,19 +20880,19 @@ class oS { _actualReadPixelOffset(e, t, i) { if (!this.domNode) return -1; - const n = this._characterMapping.getDomPosition(t), o = CL.readHorizontalRanges(this._getReadingTarget(this.domNode), n.partIndex, n.charIndex, n.partIndex, n.charIndex, i); + const n = this._characterMapping.getDomPosition(t), o = kX.readHorizontalRanges(this._getReadingTarget(this.domNode), n.partIndex, n.charIndex, n.partIndex, n.charIndex, i); return !o || o.length === 0 ? -1 : o[0].left; } getColumnOfNodeOffset(e, t) { - return OE(this._characterMapping, e, t); + return gJ(this._characterMapping, e, t); } } -class fU { +class q_ { constructor(e, t, i, n, o) { if (this.domNode = e, this.input = t, this._characterMapping = i, this._isWhitespaceOnly = /^\s*$/.test(t.lineContent), this._containsForeignElements = o, this._cachedWidth = -1, this._pixelOffsetCache = null, !n || this._characterMapping.length === 0) { this._pixelOffsetCache = new Float32Array(Math.max(2, this._characterMapping.length + 1)); - for (let r = 0, l = this._characterMapping.length; r <= l; r++) - this._pixelOffsetCache[r] = -1; + for (let l = 0, r = this._characterMapping.length; l <= r; l++) + this._pixelOffsetCache[l] = -1; } } // --- Reading from the DOM methods @@ -20918,15 +20918,15 @@ class fU { const o = this._readPixelOffset(this.domNode, e, t, n); if (o === -1) return null; - const r = this._readPixelOffset(this.domNode, e, i, n); - return r === -1 ? null : [new cg(o, r - o)]; + const l = this._readPixelOffset(this.domNode, e, i, n); + return l === -1 ? null : [new bm(o, l - o)]; } return this._readVisibleRangesForRange(this.domNode, e, t, i, n); } _readVisibleRangesForRange(e, t, i, n, o) { if (i === n) { - const r = this._readPixelOffset(e, t, i, o); - return r === -1 ? null : [new cg(r, 0)]; + const l = this._readPixelOffset(e, t, i, o); + return l === -1 ? null : [new bm(l, 0)]; } else return this._readRawVisibleRangesForRange(e, i, n, o); } @@ -20943,79 +20943,79 @@ class fU { const o = this._pixelOffsetCache[i]; if (o !== -1) return o; - const r = this._actualReadPixelOffset(e, t, i, n); - return this._pixelOffsetCache[i] = r, r; + const l = this._actualReadPixelOffset(e, t, i, n); + return this._pixelOffsetCache[i] = l, l; } return this._actualReadPixelOffset(e, t, i, n); } _actualReadPixelOffset(e, t, i, n) { if (this._characterMapping.length === 0) { - const a = CL.readHorizontalRanges(this._getReadingTarget(e), 0, 0, 0, 0, n); - return !a || a.length === 0 ? -1 : a[0].left; + const c = kX.readHorizontalRanges(this._getReadingTarget(e), 0, 0, 0, 0, n); + return !c || c.length === 0 ? -1 : c[0].left; } if (i === this._characterMapping.length && this._isWhitespaceOnly && this._containsForeignElements === 0) return this.getWidth(n); - const o = this._characterMapping.getDomPosition(i), r = CL.readHorizontalRanges(this._getReadingTarget(e), o.partIndex, o.charIndex, o.partIndex, o.charIndex, n); - if (!r || r.length === 0) + const o = this._characterMapping.getDomPosition(i), l = kX.readHorizontalRanges(this._getReadingTarget(e), o.partIndex, o.charIndex, o.partIndex, o.charIndex, n); + if (!l || l.length === 0) return -1; - const l = r[0].left; + const r = l[0].left; if (this.input.isBasicASCII) { - const a = this._characterMapping.getHorizontalOffset(i), c = Math.round(this.input.spaceWidth * a); - if (Math.abs(c - l) <= 1) - return c; + const c = this._characterMapping.getHorizontalOffset(i), d = Math.round(this.input.spaceWidth * c); + if (Math.abs(d - r) <= 1) + return d; } - return l; + return r; } _readRawVisibleRangesForRange(e, t, i, n) { if (t === 1 && i === this._characterMapping.length) - return [new cg(0, this.getWidth(n))]; - const o = this._characterMapping.getDomPosition(t), r = this._characterMapping.getDomPosition(i); - return CL.readHorizontalRanges(this._getReadingTarget(e), o.partIndex, o.charIndex, r.partIndex, r.charIndex, n); + return [new bm(0, this.getWidth(n))]; + const o = this._characterMapping.getDomPosition(t), l = this._characterMapping.getDomPosition(i); + return kX.readHorizontalRanges(this._getReadingTarget(e), o.partIndex, o.charIndex, l.partIndex, l.charIndex, n); } /** * Returns the column for the text found at a specific offset inside a rendered dom node */ getColumnOfNodeOffset(e, t) { - return OE(this._characterMapping, e, t); + return gJ(this._characterMapping, e, t); } } -class Xse extends fU { +class woe extends q_ { _readVisibleRangesForRange(e, t, i, n, o) { - const r = super._readVisibleRangesForRange(e, t, i, n, o); - if (!r || r.length === 0 || i === n || i === 1 && n === this._characterMapping.length) - return r; + const l = super._readVisibleRangesForRange(e, t, i, n, o); + if (!l || l.length === 0 || i === n || i === 1 && n === this._characterMapping.length) + return l; if (!this.input.containsRTL) { - const l = this._readPixelOffset(e, t, n, o); - if (l !== -1) { - const a = r[r.length - 1]; - a.left < l && (a.width = l - a.left); + const r = this._readPixelOffset(e, t, n, o); + if (r !== -1) { + const c = l[l.length - 1]; + c.left < r && (c.width = r - c.left); } } - return r; + return l; } } -const bU = /* @__PURE__ */ function() { - return Z_ ? Fse : Yse; +const $_ = /* @__PURE__ */ function() { + return FS ? Toe : Moe; }(); -function Fse(s, e, t, i, n) { - return new Xse(s, e, t, i, n); +function Toe(s, e, t, i, n) { + return new woe(s, e, t, i, n); } -function Yse(s, e, t, i, n) { - return new fU(s, e, t, i, n); +function Moe(s, e, t, i, n) { + return new q_(s, e, t, i, n); } -function OE(s, e, t) { +function gJ(s, e, t) { const i = e.textContent.length; let n = -1; for (; e; ) e = e.previousSibling, n++; - return s.getColumn(new mU(n, t), i); + return s.getColumn(new O_(n, t), i); } -class wd { +class Va { constructor(e = null) { this.hitTarget = e, this.type = 0; } } -class yU { +class eQ { get hitTarget() { return this.spanNode; } @@ -21023,22 +21023,22 @@ class yU { this.position = e, this.spanNode = t, this.injectedText = i, this.type = 1; } } -var Vu; +var Eu; (function(s) { function e(t, i, n) { const o = t.getPositionFromDOMInfo(i, n); - return o ? new yU(o, i, null) : new wd(i); + return o ? new eQ(o, i, null) : new Va(i); } s.createFromDOMInfo = e; -})(Vu || (Vu = {})); -class zse { +})(Eu || (Eu = {})); +class Yoe { constructor(e, t) { this.lastViewCursorsRenderData = e, this.lastTextareaPosition = t; } } -class Hn { +class _n { static _deduceRage(e, t = null) { - return !t && e ? new M(e.lineNumber, e.column, e.lineNumber, e.column) : t ?? null; + return !t && e ? new I(e.lineNumber, e.column, e.lineNumber, e.column) : t ?? null; } static createUnknown(e, t, i) { return { type: 0, element: e, mouseColumn: t, position: i, range: this._deduceRage(i) }; @@ -21046,8 +21046,8 @@ class Hn { static createTextarea(e, t) { return { type: 1, element: e, mouseColumn: t, position: null, range: null }; } - static createMargin(e, t, i, n, o, r) { - return { type: e, element: t, mouseColumn: i, position: n, range: o, detail: r }; + static createMargin(e, t, i, n, o, l) { + return { type: e, element: t, mouseColumn: i, position: n, range: o, detail: l }; } static createViewZone(e, t, i, n, o) { return { type: e, element: t, mouseColumn: i, position: n, range: this._deduceRage(n), detail: o }; @@ -21077,7 +21077,7 @@ class Hn { return this._typeToString(e.type) + ": " + e.position + " - " + e.range + " - " + JSON.stringify(e.detail); } } -class ns { +class os { static isTextArea(e) { return e.length === 2 && e[0] === 3 && e[1] === 7; } @@ -21109,7 +21109,7 @@ class ns { return e.length >= 1 && e[0] === 5; } } -class gb { +class yZ { constructor(e, t, i) { this.viewModel = e.viewModel; const n = e.configuration.options; @@ -21128,19 +21128,19 @@ class gb { ).typicalHalfwidthCharacterWidth, this.lastRenderData = i, this._context = e, this._viewHelper = t; } getZoneAtCoord(e) { - return gb.getZoneAtCoord(this._context, e); + return yZ.getZoneAtCoord(this._context, e); } static getZoneAtCoord(e, t) { const i = e.viewLayout.getWhitespaceAtVerticalOffset(t); if (i) { const n = i.verticalOffset + i.height / 2, o = e.viewModel.getLineCount(); - let r = null, l, a = null; - return i.afterLineNumber !== o && (a = new V(i.afterLineNumber + 1, 1)), i.afterLineNumber > 0 && (r = new V(i.afterLineNumber, e.viewModel.getLineMaxColumn(i.afterLineNumber))), a === null ? l = r : r === null ? l = a : t < n ? l = r : l = a, { + let l = null, r, c = null; + return i.afterLineNumber !== o && (c = new Y(i.afterLineNumber + 1, 1)), i.afterLineNumber > 0 && (l = new Y(i.afterLineNumber, e.viewModel.getLineMaxColumn(i.afterLineNumber))), c === null ? r = l : l === null ? r = c : t < n ? r = l : r = c, { viewZoneId: i.id, afterLineNumber: i.afterLineNumber, - positionBefore: r, - positionAfter: a, - position: l + positionBefore: l, + positionAfter: c, + position: r }; } return null; @@ -21149,13 +21149,13 @@ class gb { if (this._context.viewLayout.isAfterLines(e)) { const n = this._context.viewModel.getLineCount(), o = this._context.viewModel.getLineMaxColumn(n); return { - range: new M(n, o, n, o), + range: new I(n, o, n, o), isAfterLines: !0 }; } const t = this._context.viewLayout.getLineNumberAtVerticalOffset(e), i = this._context.viewModel.getLineMaxColumn(t); return { - range: new M(t, 1, t, i), + range: new I(t, 1, t, i), isAfterLines: !1 }; } @@ -21175,7 +21175,7 @@ class gb { return this._context.viewLayout.getVerticalOffsetForLineNumber(e); } findAttribute(e, t) { - return gb._findAttribute(e, t, this._viewHelper.viewDomNode); + return yZ._findAttribute(e, t, this._viewHelper.viewDomNode); } static _findAttribute(e, t, i) { for (; e && e !== e.ownerDocument.body; ) { @@ -21203,22 +21203,22 @@ class gb { return this._context.viewLayout.getCurrentScrollLeft(); } } -class Pse { +class koe { constructor(e, t, i, n) { - this.editorPos = t, this.pos = i, this.relativePos = n, this.mouseVerticalOffset = Math.max(0, e.getCurrentScrollTop() + this.relativePos.y), this.mouseContentHorizontalOffset = e.getCurrentScrollLeft() + this.relativePos.x - e.layoutInfo.contentLeft, this.isInMarginArea = this.relativePos.x < e.layoutInfo.contentLeft && this.relativePos.x >= e.layoutInfo.glyphMarginLeft, this.isInContentArea = !this.isInMarginArea, this.mouseColumn = Math.max(0, On._getMouseColumn(this.mouseContentHorizontalOffset, e.typicalHalfwidthCharacterWidth)); + this.editorPos = t, this.pos = i, this.relativePos = n, this.mouseVerticalOffset = Math.max(0, e.getCurrentScrollTop() + this.relativePos.y), this.mouseContentHorizontalOffset = e.getCurrentScrollLeft() + this.relativePos.x - e.layoutInfo.contentLeft, this.isInMarginArea = this.relativePos.x < e.layoutInfo.contentLeft && this.relativePos.x >= e.layoutInfo.glyphMarginLeft, this.isInContentArea = !this.isInMarginArea, this.mouseColumn = Math.max(0, Bn._getMouseColumn(this.mouseContentHorizontalOffset, e.typicalHalfwidthCharacterWidth)); } } -class Bse extends Pse { +class voe extends koe { get target() { return this._useHitTestTarget ? this.hitTestResult.value.hitTarget : this._eventTarget; } get targetPath() { - return this._targetPathCacheElement !== this.target && (this._targetPathCacheElement = this.target, this._targetPathCacheValue = Tl.collect(this.target, this._ctx.viewDomNode)), this._targetPathCacheValue; + return this._targetPathCacheElement !== this.target && (this._targetPathCacheElement = this.target, this._targetPathCacheValue = vr.collect(this.target, this._ctx.viewDomNode)), this._targetPathCacheValue; } constructor(e, t, i, n, o) { - super(e, t, i, n), this.hitTestResult = new Wl(() => On.doHitTest(this._ctx, this)), this._targetPathCacheElement = null, this._targetPathCacheValue = new Uint8Array(0), this._ctx = e, this._eventTarget = o; - const r = !!this._eventTarget; - this._useHitTestTarget = !r; + super(e, t, i, n), this.hitTestResult = new Yr(() => Bn.doHitTest(this._ctx, this)), this._targetPathCacheElement = null, this._targetPathCacheValue = new Uint8Array(0), this._ctx = e, this._eventTarget = o; + const l = !!this._eventTarget; + this._useHitTestTarget = !l; } toString() { return `pos(${this.pos.x},${this.pos.y}), editorPos(${this.editorPos.x},${this.editorPos.y}), relativePos(${this.relativePos.x},${this.relativePos.y}), mouseVerticalOffset: ${this.mouseVerticalOffset}, mouseContentHorizontalOffset: ${this.mouseContentHorizontalOffset} @@ -21231,62 +21231,62 @@ class Bse extends Pse { this._useHitTestTarget = !0; } _getMouseColumn(e = null) { - return e && e.column < this._ctx.viewModel.getLineMaxColumn(e.lineNumber) ? Yi.visibleColumnFromColumn(this._ctx.viewModel.getLineContent(e.lineNumber), e.column, this._ctx.viewModel.model.getOptions().tabSize) + 1 : this.mouseColumn; + return e && e.column < this._ctx.viewModel.getLineMaxColumn(e.lineNumber) ? zi.visibleColumnFromColumn(this._ctx.viewModel.getLineContent(e.lineNumber), e.column, this._ctx.viewModel.model.getOptions().tabSize) + 1 : this.mouseColumn; } fulfillUnknown(e = null) { - return Hn.createUnknown(this.target, this._getMouseColumn(e), e); + return _n.createUnknown(this.target, this._getMouseColumn(e), e); } fulfillTextarea() { - return Hn.createTextarea(this.target, this._getMouseColumn()); + return _n.createTextarea(this.target, this._getMouseColumn()); } fulfillMargin(e, t, i, n) { - return Hn.createMargin(e, this.target, this._getMouseColumn(t), t, i, n); + return _n.createMargin(e, this.target, this._getMouseColumn(t), t, i, n); } fulfillViewZone(e, t, i) { - return Hn.createViewZone(e, this.target, this._getMouseColumn(t), t, i); + return _n.createViewZone(e, this.target, this._getMouseColumn(t), t, i); } fulfillContentText(e, t, i) { - return Hn.createContentText(this.target, this._getMouseColumn(e), e, t, i); + return _n.createContentText(this.target, this._getMouseColumn(e), e, t, i); } fulfillContentEmpty(e, t) { - return Hn.createContentEmpty(this.target, this._getMouseColumn(e), e, t); + return _n.createContentEmpty(this.target, this._getMouseColumn(e), e, t); } fulfillContentWidget(e) { - return Hn.createContentWidget(this.target, this._getMouseColumn(), e); + return _n.createContentWidget(this.target, this._getMouseColumn(), e); } fulfillScrollbar(e) { - return Hn.createScrollbar(this.target, this._getMouseColumn(e), e); + return _n.createScrollbar(this.target, this._getMouseColumn(e), e); } fulfillOverlayWidget(e) { - return Hn.createOverlayWidget(this.target, this._getMouseColumn(), e); + return _n.createOverlayWidget(this.target, this._getMouseColumn(), e); } } -const HF = { isAfterLines: !0 }; -function zN(s) { +const ZF = { isAfterLines: !0 }; +function sR(s) { return { isAfterLines: !1, horizontalDistanceToText: s }; } -class On { +class Bn { constructor(e, t) { this._context = e, this._viewHelper = t; } mouseTargetIsWidget(e) { - const t = e.target, i = Tl.collect(t, this._viewHelper.viewDomNode); - return !!(ns.isChildOfContentWidgets(i) || ns.isChildOfOverflowingContentWidgets(i) || ns.isChildOfOverlayWidgets(i) || ns.isChildOfOverflowingOverlayWidgets(i)); + const t = e.target, i = vr.collect(t, this._viewHelper.viewDomNode); + return !!(os.isChildOfContentWidgets(i) || os.isChildOfOverflowingContentWidgets(i) || os.isChildOfOverlayWidgets(i) || os.isChildOfOverflowingOverlayWidgets(i)); } createMouseTarget(e, t, i, n, o) { - const r = new gb(this._context, this._viewHelper, e), l = new Bse(r, t, i, n, o); + const l = new yZ(this._context, this._viewHelper, e), r = new voe(l, t, i, n, o); try { - const a = On._createMouseTarget(r, l); - if (a.type === 6 && r.stickyTabStops && a.position !== null) { - const c = On._snapToSoftTabBoundary(a.position, r.viewModel), d = M.fromPositions(c, c).plusRange(a.range); - return l.fulfillContentText(c, d, a.detail); + const c = Bn._createMouseTarget(l, r); + if (c.type === 6 && l.stickyTabStops && c.position !== null) { + const d = Bn._snapToSoftTabBoundary(c.position, l.viewModel), a = I.fromPositions(d, d).plusRange(c.range); + return r.fulfillContentText(d, a, c.detail); } - return a; + return c; } catch { - return l.fulfillUnknown(); + return r.fulfillUnknown(); } } static _createMouseTarget(e, t) { @@ -21294,17 +21294,17 @@ class On { return t.fulfillUnknown(); const i = t; let n = null; - return !ns.isChildOfOverflowGuard(t.targetPath) && !ns.isChildOfOverflowingContentWidgets(t.targetPath) && !ns.isChildOfOverflowingOverlayWidgets(t.targetPath) && (n = n || t.fulfillUnknown()), n = n || On._hitTestContentWidget(e, i), n = n || On._hitTestOverlayWidget(e, i), n = n || On._hitTestMinimap(e, i), n = n || On._hitTestScrollbarSlider(e, i), n = n || On._hitTestViewZone(e, i), n = n || On._hitTestMargin(e, i), n = n || On._hitTestViewCursor(e, i), n = n || On._hitTestTextArea(e, i), n = n || On._hitTestViewLines(e, i), n = n || On._hitTestScrollbar(e, i), n || t.fulfillUnknown(); + return !os.isChildOfOverflowGuard(t.targetPath) && !os.isChildOfOverflowingContentWidgets(t.targetPath) && !os.isChildOfOverflowingOverlayWidgets(t.targetPath) && (n = n || t.fulfillUnknown()), n = n || Bn._hitTestContentWidget(e, i), n = n || Bn._hitTestOverlayWidget(e, i), n = n || Bn._hitTestMinimap(e, i), n = n || Bn._hitTestScrollbarSlider(e, i), n = n || Bn._hitTestViewZone(e, i), n = n || Bn._hitTestMargin(e, i), n = n || Bn._hitTestViewCursor(e, i), n = n || Bn._hitTestTextArea(e, i), n = n || Bn._hitTestViewLines(e, i), n = n || Bn._hitTestScrollbar(e, i), n || t.fulfillUnknown(); } static _hitTestContentWidget(e, t) { - if (ns.isChildOfContentWidgets(t.targetPath) || ns.isChildOfOverflowingContentWidgets(t.targetPath)) { + if (os.isChildOfContentWidgets(t.targetPath) || os.isChildOfOverflowingContentWidgets(t.targetPath)) { const i = e.findAttribute(t.target, "widgetId"); return i ? t.fulfillContentWidget(i) : t.fulfillUnknown(); } return null; } static _hitTestOverlayWidget(e, t) { - if (ns.isChildOfOverlayWidgets(t.targetPath) || ns.isChildOfOverflowingOverlayWidgets(t.targetPath)) { + if (os.isChildOfOverlayWidgets(t.targetPath) || os.isChildOfOverflowingOverlayWidgets(t.targetPath)) { const i = e.findAttribute(t.target, "widgetId"); return i ? t.fulfillOverlayWidget(i) : t.fulfillUnknown(); } @@ -21319,12 +21319,12 @@ class On { } if (t.isInContentArea) { const i = e.lastRenderData.lastViewCursorsRenderData, n = t.mouseContentHorizontalOffset, o = t.mouseVerticalOffset; - for (const r of i) { - if (n < r.contentLeft || n > r.contentLeft + r.width) + for (const l of i) { + if (n < l.contentLeft || n > l.contentLeft + l.width) continue; - const l = e.getVerticalOffsetForLineNumber(r.position.lineNumber); - if (l <= o && o <= l + r.height) - return t.fulfillContentText(r.position, null, { mightBeForeignElement: !1, injectedText: null }); + const r = e.getVerticalOffsetForLineNumber(l.position.lineNumber); + if (r <= o && o <= r + l.height) + return t.fulfillContentText(l.position, null, { mightBeForeignElement: !1, injectedText: null }); } } return null; @@ -21338,13 +21338,13 @@ class On { return null; } static _hitTestTextArea(e, t) { - return ns.isTextArea(t.targetPath) ? e.lastRenderData.lastTextareaPosition ? t.fulfillContentText(e.lastRenderData.lastTextareaPosition, null, { mightBeForeignElement: !1, injectedText: null }) : t.fulfillTextarea() : null; + return os.isTextArea(t.targetPath) ? e.lastRenderData.lastTextareaPosition ? t.fulfillContentText(e.lastRenderData.lastTextareaPosition, null, { mightBeForeignElement: !1, injectedText: null }) : t.fulfillTextarea() : null; } static _hitTestMargin(e, t) { if (t.isInMarginArea) { const i = e.getFullLineRangeAtCoord(t.mouseVerticalOffset), n = i.range.getStartPosition(); let o = Math.abs(t.relativePos.x); - const r = { + const l = { isAfterLines: i.isAfterLines, glyphMarginLeft: e.layoutInfo.glyphMarginLeft, glyphMarginWidth: e.layoutInfo.glyphMarginWidth, @@ -21352,58 +21352,58 @@ class On { offsetX: o }; if (o -= e.layoutInfo.glyphMarginLeft, o <= e.layoutInfo.glyphMarginWidth) { - const l = e.viewModel.coordinatesConverter.convertViewPositionToModelPosition(i.range.getStartPosition()), a = e.viewModel.glyphLanes.getLanesAtLine(l.lineNumber); - return r.glyphMarginLane = a[Math.floor(o / e.lineHeight)], t.fulfillMargin(2, n, i.range, r); + const r = e.viewModel.coordinatesConverter.convertViewPositionToModelPosition(i.range.getStartPosition()), c = e.viewModel.glyphLanes.getLanesAtLine(r.lineNumber); + return l.glyphMarginLane = c[Math.floor(o / e.lineHeight)], t.fulfillMargin(2, n, i.range, l); } - return o -= e.layoutInfo.glyphMarginWidth, o <= e.layoutInfo.lineNumbersWidth ? t.fulfillMargin(3, n, i.range, r) : (o -= e.layoutInfo.lineNumbersWidth, t.fulfillMargin(4, n, i.range, r)); + return o -= e.layoutInfo.glyphMarginWidth, o <= e.layoutInfo.lineNumbersWidth ? t.fulfillMargin(3, n, i.range, l) : (o -= e.layoutInfo.lineNumbersWidth, t.fulfillMargin(4, n, i.range, l)); } return null; } static _hitTestViewLines(e, t) { - if (!ns.isChildOfViewLines(t.targetPath)) + if (!os.isChildOfViewLines(t.targetPath)) return null; if (e.isInTopPadding(t.mouseVerticalOffset)) - return t.fulfillContentEmpty(new V(1, 1), HF); + return t.fulfillContentEmpty(new Y(1, 1), ZF); if (e.isAfterLines(t.mouseVerticalOffset) || e.isInBottomPadding(t.mouseVerticalOffset)) { const n = e.viewModel.getLineCount(), o = e.viewModel.getLineMaxColumn(n); - return t.fulfillContentEmpty(new V(n, o), HF); + return t.fulfillContentEmpty(new Y(n, o), ZF); } - if (ns.isStrictChildOfViewLines(t.targetPath)) { + if (os.isStrictChildOfViewLines(t.targetPath)) { const n = e.getLineNumberAtVerticalOffset(t.mouseVerticalOffset); if (e.viewModel.getLineLength(n) === 0) { - const r = e.getLineWidth(n), l = zN(t.mouseContentHorizontalOffset - r); - return t.fulfillContentEmpty(new V(n, 1), l); + const l = e.getLineWidth(n), r = sR(t.mouseContentHorizontalOffset - l); + return t.fulfillContentEmpty(new Y(n, 1), r); } const o = e.getLineWidth(n); if (t.mouseContentHorizontalOffset >= o) { - const r = zN(t.mouseContentHorizontalOffset - o), l = new V(n, e.viewModel.getLineMaxColumn(n)); - return t.fulfillContentEmpty(l, r); + const l = sR(t.mouseContentHorizontalOffset - o), r = new Y(n, e.viewModel.getLineMaxColumn(n)); + return t.fulfillContentEmpty(r, l); } } const i = t.hitTestResult.value; - return i.type === 1 ? On.createMouseTargetFromHitTestPosition(e, t, i.spanNode, i.position, i.injectedText) : t.wouldBenefitFromHitTestTargetSwitch ? (t.switchToHitTestTarget(), this._createMouseTarget(e, t)) : t.fulfillUnknown(); + return i.type === 1 ? Bn.createMouseTargetFromHitTestPosition(e, t, i.spanNode, i.position, i.injectedText) : t.wouldBenefitFromHitTestTargetSwitch ? (t.switchToHitTestTarget(), this._createMouseTarget(e, t)) : t.fulfillUnknown(); } static _hitTestMinimap(e, t) { - if (ns.isChildOfMinimap(t.targetPath)) { + if (os.isChildOfMinimap(t.targetPath)) { const i = e.getLineNumberAtVerticalOffset(t.mouseVerticalOffset), n = e.viewModel.getLineMaxColumn(i); - return t.fulfillScrollbar(new V(i, n)); + return t.fulfillScrollbar(new Y(i, n)); } return null; } static _hitTestScrollbarSlider(e, t) { - if (ns.isChildOfScrollableElement(t.targetPath) && t.target && t.target.nodeType === 1) { + if (os.isChildOfScrollableElement(t.targetPath) && t.target && t.target.nodeType === 1) { const i = t.target.className; if (i && /\b(slider|scrollbar)\b/.test(i)) { const n = e.getLineNumberAtVerticalOffset(t.mouseVerticalOffset), o = e.viewModel.getLineMaxColumn(n); - return t.fulfillScrollbar(new V(n, o)); + return t.fulfillScrollbar(new Y(n, o)); } } return null; } static _hitTestScrollbar(e, t) { - if (ns.isChildOfScrollableElement(t.targetPath)) { + if (os.isChildOfScrollableElement(t.targetPath)) { const i = e.getLineNumberAtVerticalOffset(t.mouseVerticalOffset), n = e.viewModel.getLineMaxColumn(i); - return t.fulfillScrollbar(new V(i, n)); + return t.fulfillScrollbar(new Y(i, n)); } return null; } @@ -21412,7 +21412,7 @@ class On { 146 /* EditorOption.layoutInfo */ ), n = this._context.viewLayout.getCurrentScrollLeft() + e.x - i.contentLeft; - return On._getMouseColumn(n, t.get( + return Bn._getMouseColumn(n, t.get( 50 /* EditorOption.fontInfo */ ).typicalHalfwidthCharacterWidth); @@ -21421,40 +21421,40 @@ class On { return e < 0 ? 1 : Math.round(e / t) + 1; } static createMouseTargetFromHitTestPosition(e, t, i, n, o) { - const r = n.lineNumber, l = n.column, a = e.getLineWidth(r); - if (t.mouseContentHorizontalOffset > a) { - const y = zN(t.mouseContentHorizontalOffset - a); - return t.fulfillContentEmpty(n, y); + const l = n.lineNumber, r = n.column, c = e.getLineWidth(l); + if (t.mouseContentHorizontalOffset > c) { + const f = sR(t.mouseContentHorizontalOffset - c); + return t.fulfillContentEmpty(n, f); } - const c = e.visibleRangeForPosition(r, l); - if (!c) + const d = e.visibleRangeForPosition(l, r); + if (!d) return t.fulfillUnknown(n); - const d = c.left; - if (Math.abs(t.mouseContentHorizontalOffset - d) < 1) + const a = d.left; + if (Math.abs(t.mouseContentHorizontalOffset - a) < 1) return t.fulfillContentText(n, null, { mightBeForeignElement: !!o, injectedText: o }); const h = []; - if (h.push({ offset: c.left, column: l }), l > 1) { - const y = e.visibleRangeForPosition(r, l - 1); - y && h.push({ offset: y.left, column: l - 1 }); - } - const u = e.viewModel.getLineMaxColumn(r); - if (l < u) { - const y = e.visibleRangeForPosition(r, l + 1); - y && h.push({ offset: y.left, column: l + 1 }); - } - h.sort((y, w) => y.offset - w.offset); - const g = t.pos.toClientCoordinates(xe(e.viewDomNode)), m = i.getBoundingClientRect(), f = m.left <= g.clientX && g.clientX <= m.right; - let b = null; - for (let y = 1; y < h.length; y++) { - const w = h[y - 1], C = h[y]; - if (w.offset <= t.mouseContentHorizontalOffset && t.mouseContentHorizontalOffset <= C.offset) { - b = new M(r, w.column, r, C.column); - const S = Math.abs(w.offset - t.mouseContentHorizontalOffset), L = Math.abs(C.offset - t.mouseContentHorizontalOffset); - n = S < L ? new V(r, w.column) : new V(r, C.column); + if (h.push({ offset: d.left, column: r }), r > 1) { + const f = e.visibleRangeForPosition(l, r - 1); + f && h.push({ offset: f.left, column: r - 1 }); + } + const u = e.viewModel.getLineMaxColumn(l); + if (r < u) { + const f = e.visibleRangeForPosition(l, r + 1); + f && h.push({ offset: f.left, column: r + 1 }); + } + h.sort((f, y) => f.offset - y.offset); + const m = t.pos.toClientCoordinates(Le(e.viewDomNode)), b = i.getBoundingClientRect(), g = b.left <= m.clientX && m.clientX <= b.right; + let Z = null; + for (let f = 1; f < h.length; f++) { + const y = h[f - 1], W = h[f]; + if (y.offset <= t.mouseContentHorizontalOffset && t.mouseContentHorizontalOffset <= W.offset) { + Z = new I(l, y.column, l, W.column); + const G = Math.abs(y.offset - t.mouseContentHorizontalOffset), X = Math.abs(W.offset - t.mouseContentHorizontalOffset); + n = G < X ? new Y(l, y.column) : new Y(l, W.column); break; } } - return t.fulfillContentText(n, b, { mightBeForeignElement: !f || !!o, injectedText: o }); + return t.fulfillContentText(n, Z, { mightBeForeignElement: !g || !!o, injectedText: o }); } /** * Most probably WebKit browsers and Edge @@ -21462,29 +21462,29 @@ class On { static _doHitTestWithCaretRangeFromPoint(e, t) { const i = e.getLineNumberAtVerticalOffset(t.mouseVerticalOffset), n = e.getVerticalOffsetForLineNumber(i), o = n + e.lineHeight; if (!(i === e.viewModel.getLineCount() && t.mouseVerticalOffset > o)) { - const l = Math.floor((n + o) / 2); - let a = t.pos.y + (l - t.mouseVerticalOffset); - a <= t.editorPos.y && (a = t.editorPos.y + 1), a >= t.editorPos.y + t.editorPos.height && (a = t.editorPos.y + t.editorPos.height - 1); - const c = new aI(t.pos.x, a), d = this._actualDoHitTestWithCaretRangeFromPoint(e, c.toClientCoordinates(xe(e.viewDomNode))); - if (d.type === 1) - return d; + const r = Math.floor((n + o) / 2); + let c = t.pos.y + (r - t.mouseVerticalOffset); + c <= t.editorPos.y && (c = t.editorPos.y + 1), c >= t.editorPos.y + t.editorPos.height && (c = t.editorPos.y + t.editorPos.height - 1); + const d = new Vx(t.pos.x, c), a = this._actualDoHitTestWithCaretRangeFromPoint(e, d.toClientCoordinates(Le(e.viewDomNode))); + if (a.type === 1) + return a; } - return this._actualDoHitTestWithCaretRangeFromPoint(e, t.pos.toClientCoordinates(xe(e.viewDomNode))); + return this._actualDoHitTestWithCaretRangeFromPoint(e, t.pos.toClientCoordinates(Le(e.viewDomNode))); } static _actualDoHitTestWithCaretRangeFromPoint(e, t) { - const i = hm(e.viewDomNode); + const i = gb(e.viewDomNode); let n; - if (i ? typeof i.caretRangeFromPoint > "u" ? n = Ose(i, t.clientX, t.clientY) : n = i.caretRangeFromPoint(t.clientX, t.clientY) : n = e.viewDomNode.ownerDocument.caretRangeFromPoint(t.clientX, t.clientY), !n || !n.startContainer) - return new wd(); + if (i ? typeof i.caretRangeFromPoint > "u" ? n = Joe(i, t.clientX, t.clientY) : n = i.caretRangeFromPoint(t.clientX, t.clientY) : n = e.viewDomNode.ownerDocument.caretRangeFromPoint(t.clientX, t.clientY), !n || !n.startContainer) + return new Va(); const o = n.startContainer; if (o.nodeType === o.TEXT_NODE) { - const r = o.parentNode, l = r ? r.parentNode : null, a = l ? l.parentNode : null; - return (a && a.nodeType === a.ELEMENT_NODE ? a.className : null) === wc.CLASS_NAME ? Vu.createFromDOMInfo(e, r, n.startOffset) : new wd(o.parentNode); + const l = o.parentNode, r = l ? l.parentNode : null, c = r ? r.parentNode : null; + return (c && c.nodeType === c.ELEMENT_NODE ? c.className : null) === Vd.CLASS_NAME ? Eu.createFromDOMInfo(e, l, n.startOffset) : new Va(o.parentNode); } else if (o.nodeType === o.ELEMENT_NODE) { - const r = o.parentNode, l = r ? r.parentNode : null; - return (l && l.nodeType === l.ELEMENT_NODE ? l.className : null) === wc.CLASS_NAME ? Vu.createFromDOMInfo(e, o, o.textContent.length) : new wd(o); + const l = o.parentNode, r = l ? l.parentNode : null; + return (r && r.nodeType === r.ELEMENT_NODE ? r.className : null) === Vd.CLASS_NAME ? Eu.createFromDOMInfo(e, o, o.textContent.length) : new Va(o); } - return new wd(); + return new Va(); } /** * Most probably Gecko @@ -21492,70 +21492,70 @@ class On { static _doHitTestWithCaretPositionFromPoint(e, t) { const i = e.viewDomNode.ownerDocument.caretPositionFromPoint(t.clientX, t.clientY); if (i.offsetNode.nodeType === i.offsetNode.TEXT_NODE) { - const n = i.offsetNode.parentNode, o = n ? n.parentNode : null, r = o ? o.parentNode : null; - return (r && r.nodeType === r.ELEMENT_NODE ? r.className : null) === wc.CLASS_NAME ? Vu.createFromDOMInfo(e, i.offsetNode.parentNode, i.offset) : new wd(i.offsetNode.parentNode); + const n = i.offsetNode.parentNode, o = n ? n.parentNode : null, l = o ? o.parentNode : null; + return (l && l.nodeType === l.ELEMENT_NODE ? l.className : null) === Vd.CLASS_NAME ? Eu.createFromDOMInfo(e, i.offsetNode.parentNode, i.offset) : new Va(i.offsetNode.parentNode); } if (i.offsetNode.nodeType === i.offsetNode.ELEMENT_NODE) { - const n = i.offsetNode.parentNode, o = n && n.nodeType === n.ELEMENT_NODE ? n.className : null, r = n ? n.parentNode : null, l = r && r.nodeType === r.ELEMENT_NODE ? r.className : null; - if (o === wc.CLASS_NAME) { - const a = i.offsetNode.childNodes[Math.min(i.offset, i.offsetNode.childNodes.length - 1)]; - if (a) - return Vu.createFromDOMInfo(e, a, 0); - } else if (l === wc.CLASS_NAME) - return Vu.createFromDOMInfo(e, i.offsetNode, 0); + const n = i.offsetNode.parentNode, o = n && n.nodeType === n.ELEMENT_NODE ? n.className : null, l = n ? n.parentNode : null, r = l && l.nodeType === l.ELEMENT_NODE ? l.className : null; + if (o === Vd.CLASS_NAME) { + const c = i.offsetNode.childNodes[Math.min(i.offset, i.offsetNode.childNodes.length - 1)]; + if (c) + return Eu.createFromDOMInfo(e, c, 0); + } else if (r === Vd.CLASS_NAME) + return Eu.createFromDOMInfo(e, i.offsetNode, 0); } - return new wd(i.offsetNode); + return new Va(i.offsetNode); } static _snapToSoftTabBoundary(e, t) { - const i = t.getLineContent(e.lineNumber), { tabSize: n } = t.model.getOptions(), o = kw.atomicPosition( + const i = t.getLineContent(e.lineNumber), { tabSize: n } = t.model.getOptions(), o = By.atomicPosition( i, e.column - 1, n, 2 /* Direction.Nearest */ ); - return o !== -1 ? new V(e.lineNumber, o + 1) : e; + return o !== -1 ? new Y(e.lineNumber, o + 1) : e; } static doHitTest(e, t) { - let i = new wd(); - if (typeof e.viewDomNode.ownerDocument.caretRangeFromPoint == "function" ? i = this._doHitTestWithCaretRangeFromPoint(e, t) : e.viewDomNode.ownerDocument.caretPositionFromPoint && (i = this._doHitTestWithCaretPositionFromPoint(e, t.pos.toClientCoordinates(xe(e.viewDomNode)))), i.type === 1) { + let i = new Va(); + if (typeof e.viewDomNode.ownerDocument.caretRangeFromPoint == "function" ? i = this._doHitTestWithCaretRangeFromPoint(e, t) : e.viewDomNode.ownerDocument.caretPositionFromPoint && (i = this._doHitTestWithCaretPositionFromPoint(e, t.pos.toClientCoordinates(Le(e.viewDomNode)))), i.type === 1) { const n = e.viewModel.getInjectedTextAt(i.position), o = e.viewModel.normalizePosition( i.position, 2 /* PositionAffinity.None */ ); - (n || !o.equals(i.position)) && (i = new yU(o, i.spanNode, n)); + (n || !o.equals(i.position)) && (i = new eQ(o, i.spanNode, n)); } return i; } } -function Ose(s, e, t) { +function Joe(s, e, t) { const i = document.createRange(); let n = s.elementFromPoint(e, t); if (n !== null) { for (; n && n.firstChild && n.firstChild.nodeType !== n.firstChild.TEXT_NODE && n.lastChild && n.lastChild.firstChild; ) n = n.lastChild; - const o = n.getBoundingClientRect(), r = xe(n), l = r.getComputedStyle(n, null).getPropertyValue("font-style"), a = r.getComputedStyle(n, null).getPropertyValue("font-variant"), c = r.getComputedStyle(n, null).getPropertyValue("font-weight"), d = r.getComputedStyle(n, null).getPropertyValue("font-size"), h = r.getComputedStyle(n, null).getPropertyValue("line-height"), u = r.getComputedStyle(n, null).getPropertyValue("font-family"), g = `${l} ${a} ${c} ${d}/${h} ${u}`, m = n.innerText; - let f = o.left, b = 0, y; + const o = n.getBoundingClientRect(), l = Le(n), r = l.getComputedStyle(n, null).getPropertyValue("font-style"), c = l.getComputedStyle(n, null).getPropertyValue("font-variant"), d = l.getComputedStyle(n, null).getPropertyValue("font-weight"), a = l.getComputedStyle(n, null).getPropertyValue("font-size"), h = l.getComputedStyle(n, null).getPropertyValue("line-height"), u = l.getComputedStyle(n, null).getPropertyValue("font-family"), m = `${r} ${c} ${d} ${a}/${h} ${u}`, b = n.innerText; + let g = o.left, Z = 0, f; if (e > o.left + o.width) - b = m.length; + Z = b.length; else { - const w = av.getInstance(); - for (let C = 0; C < m.length + 1; C++) { - if (y = w.getCharWidth(m.charAt(C), g) / 2, f += y, e < f) { - b = C; + const y = Rw.getInstance(); + for (let W = 0; W < b.length + 1; W++) { + if (f = y.getCharWidth(b.charAt(W), m) / 2, g += f, e < g) { + Z = W; break; } - f += y; + g += f; } } - i.setStart(n.firstChild, b), i.setEnd(n.firstChild, b); + i.setStart(n.firstChild, Z), i.setEnd(n.firstChild, Z); } return i; } -const Ju = class Ju { +const qu = class qu { static getInstance() { - return Ju._INSTANCE || (Ju._INSTANCE = new Ju()), Ju._INSTANCE; + return qu._INSTANCE || (qu._INSTANCE = new qu()), qu._INSTANCE; } constructor() { this._cache = {}, this._canvas = document.createElement("canvas"); @@ -21566,58 +21566,58 @@ const Ju = class Ju { return this._cache[i]; const n = this._canvas.getContext("2d"); n.font = t; - const r = n.measureText(e).width; - return this._cache[i] = r, r; + const l = n.measureText(e).width; + return this._cache[i] = l, l; } }; -Ju._INSTANCE = null; -let av = Ju; -function Zi(s, e, t) { +qu._INSTANCE = null; +let Rw = qu; +function xi(s, e, t) { let i = null, n = null; if (typeof t.value == "function" ? (i = "value", n = t.value, n.length !== 0 && console.warn("Memoize should only be used in functions with zero parameters")) : typeof t.get == "function" && (i = "get", n = t.get), !n) throw new Error("not supported"); const o = `$memoize$${e}`; - t[i] = function(...r) { + t[i] = function(...l) { return this.hasOwnProperty(o) || Object.defineProperty(this, o, { configurable: !1, enumerable: !1, writable: !1, - value: n.apply(this, r) + value: n.apply(this, l) }), this[o]; }; } -var Hse = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Hoe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Rt; +}, Jt; (function(s) { s.Tap = "-monaco-gesturetap", s.Change = "-monaco-gesturechange", s.Start = "-monaco-gesturestart", s.End = "-monaco-gesturesend", s.Contextmenu = "-monaco-gesturecontextmenu"; -})(Rt || (Rt = {})); -const An = class An extends R { +})(Jt || (Jt = {})); +const Ln = class Ln extends J { // ms constructor() { - super(), this.dispatched = !1, this.targets = new cs(), this.ignoreTargets = new cs(), this.activeTouches = {}, this.handle = null, this._lastSetTapCountTime = 0, this._register(se.runAndSubscribe(D_, ({ window: e, disposables: t }) => { + super(), this.dispatched = !1, this.targets = new hs(), this.ignoreTargets = new hs(), this.activeTouches = {}, this.handle = null, this._lastSetTapCountTime = 0, this._register(se.runAndSubscribe(_S, ({ window: e, disposables: t }) => { t.add(z(e.document, "touchstart", (i) => this.onTouchStart(i), { passive: !1 })), t.add(z(e.document, "touchend", (i) => this.onTouchEnd(e, i))), t.add(z(e.document, "touchmove", (i) => this.onTouchMove(i), { passive: !1 })); - }, { window: vt, disposables: this._store })); + }, { window: wt, disposables: this._store })); } static addTarget(e) { - if (!An.isTouchDevice()) - return R.None; - An.INSTANCE || (An.INSTANCE = new An()); - const t = An.INSTANCE.targets.push(e); - return Ce(t); + if (!Ln.isTouchDevice()) + return J.None; + Ln.INSTANCE || (Ln.INSTANCE = new Ln()); + const t = Ln.INSTANCE.targets.push(e); + return We(t); } static ignoreTarget(e) { - if (!An.isTouchDevice()) - return R.None; - An.INSTANCE || (An.INSTANCE = new An()); - const t = An.INSTANCE.ignoreTargets.push(e); - return Ce(t); + if (!Ln.isTouchDevice()) + return J.None; + Ln.INSTANCE || (Ln.INSTANCE = new Ln()); + const t = Ln.INSTANCE.ignoreTargets.push(e); + return We(t); } static isTouchDevice() { - return "ontouchstart" in vt || navigator.maxTouchPoints > 0; + return "ontouchstart" in wt || navigator.maxTouchPoints > 0; } dispose() { this.handle && (this.handle.dispose(), this.handle = null), super.dispose(); @@ -21637,48 +21637,48 @@ const An = class An extends R { rollingPageX: [o.pageX], rollingPageY: [o.pageY] }; - const r = this.newGestureEvent(Rt.Start, o.target); - r.pageX = o.pageX, r.pageY = o.pageY, this.dispatchEvent(r); + const l = this.newGestureEvent(Jt.Start, o.target); + l.pageX = o.pageX, l.pageY = o.pageY, this.dispatchEvent(l); } this.dispatched && (e.preventDefault(), e.stopPropagation(), this.dispatched = !1); } onTouchEnd(e, t) { const i = Date.now(), n = Object.keys(this.activeTouches).length; - for (let o = 0, r = t.changedTouches.length; o < r; o++) { - const l = t.changedTouches.item(o); - if (!this.activeTouches.hasOwnProperty(String(l.identifier))) { - console.warn("move of an UNKNOWN touch", l); + for (let o = 0, l = t.changedTouches.length; o < l; o++) { + const r = t.changedTouches.item(o); + if (!this.activeTouches.hasOwnProperty(String(r.identifier))) { + console.warn("move of an UNKNOWN touch", r); continue; } - const a = this.activeTouches[l.identifier], c = Date.now() - a.initialTimeStamp; - if (c < An.HOLD_DELAY && Math.abs(a.initialPageX - er(a.rollingPageX)) < 30 && Math.abs(a.initialPageY - er(a.rollingPageY)) < 30) { - const d = this.newGestureEvent(Rt.Tap, a.initialTarget); - d.pageX = er(a.rollingPageX), d.pageY = er(a.rollingPageY), this.dispatchEvent(d); - } else if (c >= An.HOLD_DELAY && Math.abs(a.initialPageX - er(a.rollingPageX)) < 30 && Math.abs(a.initialPageY - er(a.rollingPageY)) < 30) { - const d = this.newGestureEvent(Rt.Contextmenu, a.initialTarget); - d.pageX = er(a.rollingPageX), d.pageY = er(a.rollingPageY), this.dispatchEvent(d); + const c = this.activeTouches[r.identifier], d = Date.now() - c.initialTimeStamp; + if (d < Ln.HOLD_DELAY && Math.abs(c.initialPageX - il(c.rollingPageX)) < 30 && Math.abs(c.initialPageY - il(c.rollingPageY)) < 30) { + const a = this.newGestureEvent(Jt.Tap, c.initialTarget); + a.pageX = il(c.rollingPageX), a.pageY = il(c.rollingPageY), this.dispatchEvent(a); + } else if (d >= Ln.HOLD_DELAY && Math.abs(c.initialPageX - il(c.rollingPageX)) < 30 && Math.abs(c.initialPageY - il(c.rollingPageY)) < 30) { + const a = this.newGestureEvent(Jt.Contextmenu, c.initialTarget); + a.pageX = il(c.rollingPageX), a.pageY = il(c.rollingPageY), this.dispatchEvent(a); } else if (n === 1) { - const d = er(a.rollingPageX), h = er(a.rollingPageY), u = er(a.rollingTimestamps) - a.rollingTimestamps[0], g = d - a.rollingPageX[0], m = h - a.rollingPageY[0], f = [...this.targets].filter((b) => a.initialTarget instanceof Node && b.contains(a.initialTarget)); + const a = il(c.rollingPageX), h = il(c.rollingPageY), u = il(c.rollingTimestamps) - c.rollingTimestamps[0], m = a - c.rollingPageX[0], b = h - c.rollingPageY[0], g = [...this.targets].filter((Z) => c.initialTarget instanceof Node && Z.contains(c.initialTarget)); this.inertia( e, - f, + g, i, // time now - Math.abs(g) / u, + Math.abs(m) / u, // speed - g > 0 ? 1 : -1, + m > 0 ? 1 : -1, // x direction - d, + a, // x now - Math.abs(m) / u, + Math.abs(b) / u, // y speed - m > 0 ? 1 : -1, + b > 0 ? 1 : -1, // y direction h // y now ); } - this.dispatchEvent(this.newGestureEvent(Rt.End, a.initialTarget)), delete this.activeTouches[l.identifier]; + this.dispatchEvent(this.newGestureEvent(Jt.End, c.initialTarget)), delete this.activeTouches[r.identifier]; } this.dispatched && (t.preventDefault(), t.stopPropagation(), this.dispatched = !1); } @@ -21687,11 +21687,11 @@ const An = class An extends R { return i.initEvent(e, !1, !0), i.initialTarget = t, i.tapCount = 0, i; } dispatchEvent(e) { - if (e.type === Rt.Tap) { + if (e.type === Jt.Tap) { const t = (/* @__PURE__ */ new Date()).getTime(); let i = 0; - t - this._lastSetTapCountTime > An.CLEAR_TAP_COUNT_TIME ? i = 1 : i = 2, this._lastSetTapCountTime = t, e.tapCount = i; - } else (e.type === Rt.Change || e.type === Rt.Contextmenu) && (this._lastSetTapCountTime = 0); + t - this._lastSetTapCountTime > Ln.CLEAR_TAP_COUNT_TIME ? i = 1 : i = 2, this._lastSetTapCountTime = t, e.tapCount = i; + } else (e.type === Jt.Change || e.type === Jt.Contextmenu) && (this._lastSetTapCountTime = 0); if (e.initialTarget instanceof Node) { for (const i of this.ignoreTargets) if (i.contains(e.initialTarget)) @@ -21709,13 +21709,13 @@ const An = class An extends R { n.dispatchEvent(e), this.dispatched = !0; } } - inertia(e, t, i, n, o, r, l, a, c) { - this.handle = po(e, () => { - const d = Date.now(), h = d - i; - let u = 0, g = 0, m = !0; - n += An.SCROLL_FRICTION * h, l += An.SCROLL_FRICTION * h, n > 0 && (m = !1, u = o * n * h), l > 0 && (m = !1, g = a * l * h); - const f = this.newGestureEvent(Rt.Change); - f.translationX = u, f.translationY = g, t.forEach((b) => b.dispatchEvent(f)), m || this.inertia(e, t, d, n, o, r + u, l, a, c + g); + inertia(e, t, i, n, o, l, r, c, d) { + this.handle = Zo(e, () => { + const a = Date.now(), h = a - i; + let u = 0, m = 0, b = !0; + n += Ln.SCROLL_FRICTION * h, r += Ln.SCROLL_FRICTION * h, n > 0 && (b = !1, u = o * n * h), r > 0 && (b = !1, m = c * r * h); + const g = this.newGestureEvent(Jt.Change); + g.translationX = u, g.translationY = m, t.forEach((Z) => Z.dispatchEvent(g)), b || this.inertia(e, t, a, n, o, l + u, r, c, d + m); }); } onTouchMove(e) { @@ -21726,35 +21726,35 @@ const An = class An extends R { console.warn("end of an UNKNOWN touch", o); continue; } - const r = this.activeTouches[o.identifier], l = this.newGestureEvent(Rt.Change, r.initialTarget); - l.translationX = o.pageX - er(r.rollingPageX), l.translationY = o.pageY - er(r.rollingPageY), l.pageX = o.pageX, l.pageY = o.pageY, this.dispatchEvent(l), r.rollingPageX.length > 3 && (r.rollingPageX.shift(), r.rollingPageY.shift(), r.rollingTimestamps.shift()), r.rollingPageX.push(o.pageX), r.rollingPageY.push(o.pageY), r.rollingTimestamps.push(t); + const l = this.activeTouches[o.identifier], r = this.newGestureEvent(Jt.Change, l.initialTarget); + r.translationX = o.pageX - il(l.rollingPageX), r.translationY = o.pageY - il(l.rollingPageY), r.pageX = o.pageX, r.pageY = o.pageY, this.dispatchEvent(r), l.rollingPageX.length > 3 && (l.rollingPageX.shift(), l.rollingPageY.shift(), l.rollingTimestamps.shift()), l.rollingPageX.push(o.pageX), l.rollingPageY.push(o.pageY), l.rollingTimestamps.push(t); } this.dispatched && (e.preventDefault(), e.stopPropagation(), this.dispatched = !1); } }; -An.SCROLL_FRICTION = -5e-3, An.HOLD_DELAY = 700, An.CLEAR_TAP_COUNT_TIME = 400; -let Rn = An; -Hse([ - Zi -], Rn, "isTouchDevice", null); -let Ko = class extends R { +Ln.SCROLL_FRICTION = -5e-3, Ln.HOLD_DELAY = 700, Ln.CLEAR_TAP_COUNT_TIME = 400; +let En = Ln; +Hoe([ + xi +], En, "isTouchDevice", null); +let jo = class extends J { onclick(e, t) { - this._register(z(e, ie.CLICK, (i) => t(new Er(xe(e), i)))); + this._register(z(e, ie.CLICK, (i) => t(new Fl(Le(e), i)))); } onmousedown(e, t) { - this._register(z(e, ie.MOUSE_DOWN, (i) => t(new Er(xe(e), i)))); + this._register(z(e, ie.MOUSE_DOWN, (i) => t(new Fl(Le(e), i)))); } onmouseover(e, t) { - this._register(z(e, ie.MOUSE_OVER, (i) => t(new Er(xe(e), i)))); + this._register(z(e, ie.MOUSE_OVER, (i) => t(new Fl(Le(e), i)))); } onmouseleave(e, t) { - this._register(z(e, ie.MOUSE_LEAVE, (i) => t(new Er(xe(e), i)))); + this._register(z(e, ie.MOUSE_LEAVE, (i) => t(new Fl(Le(e), i)))); } onkeydown(e, t) { - this._register(z(e, ie.KEY_DOWN, (i) => t(new Vt(i)))); + this._register(z(e, ie.KEY_DOWN, (i) => t(new Yt(i)))); } onkeyup(e, t) { - this._register(z(e, ie.KEY_UP, (i) => t(new Vt(i)))); + this._register(z(e, ie.KEY_UP, (i) => t(new Yt(i)))); } oninput(e, t) { this._register(z(e, ie.INPUT, t)); @@ -21766,19 +21766,19 @@ let Ko = class extends R { this._register(z(e, ie.FOCUS, t)); } ignoreGesture(e) { - return Rn.ignoreTarget(e); + return En.ignoreTarget(e); } }; -const mb = 11; -class Jse extends Ko { +const WZ = 11; +class Eoe extends jo { constructor(e) { - super(), this._onActivate = e.onActivate, this.bgDomNode = document.createElement("div"), this.bgDomNode.className = "arrow-background", this.bgDomNode.style.position = "absolute", this.bgDomNode.style.width = e.bgWidth + "px", this.bgDomNode.style.height = e.bgHeight + "px", typeof e.top < "u" && (this.bgDomNode.style.top = "0px"), typeof e.left < "u" && (this.bgDomNode.style.left = "0px"), typeof e.bottom < "u" && (this.bgDomNode.style.bottom = "0px"), typeof e.right < "u" && (this.bgDomNode.style.right = "0px"), this.domNode = document.createElement("div"), this.domNode.className = e.className, this.domNode.classList.add(...Ze.asClassNameArray(e.icon)), this.domNode.style.position = "absolute", this.domNode.style.width = mb + "px", this.domNode.style.height = mb + "px", typeof e.top < "u" && (this.domNode.style.top = e.top + "px"), typeof e.left < "u" && (this.domNode.style.left = e.left + "px"), typeof e.bottom < "u" && (this.domNode.style.bottom = e.bottom + "px"), typeof e.right < "u" && (this.domNode.style.right = e.right + "px"), this._pointerMoveMonitor = this._register(new n0()), this._register(ai(this.bgDomNode, ie.POINTER_DOWN, (t) => this._arrowPointerDown(t))), this._register(ai(this.domNode, ie.POINTER_DOWN, (t) => this._arrowPointerDown(t))), this._pointerdownRepeatTimer = this._register(new aE()), this._pointerdownScheduleRepeatTimer = this._register(new qr()); + super(), this._onActivate = e.onActivate, this.bgDomNode = document.createElement("div"), this.bgDomNode.className = "arrow-background", this.bgDomNode.style.position = "absolute", this.bgDomNode.style.width = e.bgWidth + "px", this.bgDomNode.style.height = e.bgHeight + "px", typeof e.top < "u" && (this.bgDomNode.style.top = "0px"), typeof e.left < "u" && (this.bgDomNode.style.left = "0px"), typeof e.bottom < "u" && (this.bgDomNode.style.bottom = "0px"), typeof e.right < "u" && (this.bgDomNode.style.right = "0px"), this.domNode = document.createElement("div"), this.domNode.className = e.className, this.domNode.classList.add(...Se.asClassNameArray(e.icon)), this.domNode.style.position = "absolute", this.domNode.style.width = WZ + "px", this.domNode.style.height = WZ + "px", typeof e.top < "u" && (this.domNode.style.top = e.top + "px"), typeof e.left < "u" && (this.domNode.style.left = e.left + "px"), typeof e.bottom < "u" && (this.domNode.style.bottom = e.bottom + "px"), typeof e.right < "u" && (this.domNode.style.right = e.right + "px"), this._pointerMoveMonitor = this._register(new d0()), this._register(di(this.bgDomNode, ie.POINTER_DOWN, (t) => this._arrowPointerDown(t))), this._register(di(this.domNode, ie.POINTER_DOWN, (t) => this._arrowPointerDown(t))), this._pointerdownRepeatTimer = this._register(new Mv()), this._pointerdownScheduleRepeatTimer = this._register(new tr()); } _arrowPointerDown(e) { if (!e.target || !(e.target instanceof Element)) return; const t = () => { - this._pointerdownRepeatTimer.cancelAndSet(() => this._onActivate(), 1e3 / 24, xe(e)); + this._pointerdownRepeatTimer.cancelAndSet(() => this._onActivate(), 1e3 / 24, Le(e)); }; this._onActivate(), this._pointerdownRepeatTimer.cancel(), this._pointerdownScheduleRepeatTimer.cancelAndSet(t, 200), this._pointerMoveMonitor.startMonitoring(e.target, e.pointerId, e.buttons, (i) => { }, () => { @@ -21786,9 +21786,9 @@ class Jse extends Ko { }), e.preventDefault(); } } -class Use extends R { +class Doe extends J { constructor(e, t, i) { - super(), this._visibility = e, this._visibleClassName = t, this._invisibleClassName = i, this._domNode = null, this._isVisible = !1, this._isNeeded = !1, this._rawShouldBeVisible = !1, this._shouldBeVisible = !1, this._revealTimer = this._register(new qr()); + super(), this._visibility = e, this._visibleClassName = t, this._invisibleClassName = i, this._domNode = null, this._isVisible = !1, this._isNeeded = !1, this._rawShouldBeVisible = !1, this._shouldBeVisible = !1, this._revealTimer = this._register(new tr()); } setVisibility(e) { this._visibility !== e && (this._visibility = e, this._updateShouldBeVisible()); @@ -21828,24 +21828,24 @@ class Use extends R { this._revealTimer.cancel(), this._isVisible && (this._isVisible = !1, (t = this._domNode) == null || t.setClassName(this._invisibleClassName + (e ? " fade" : ""))); } } -const Kse = 140; -class wU extends Ko { +const Foe = 140; +class tQ extends jo { constructor(e) { - super(), this._lazyRender = e.lazyRender, this._host = e.host, this._scrollable = e.scrollable, this._scrollByPage = e.scrollByPage, this._scrollbarState = e.scrollbarState, this._visibilityController = this._register(new Use(e.visibility, "visible scrollbar " + e.extraScrollbarClassName, "invisible scrollbar " + e.extraScrollbarClassName)), this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()), this._pointerMoveMonitor = this._register(new n0()), this._shouldRender = !0, this.domNode = yt(document.createElement("div")), this.domNode.setAttribute("role", "presentation"), this.domNode.setAttribute("aria-hidden", "true"), this._visibilityController.setDomNode(this.domNode), this.domNode.setPosition("absolute"), this._register(z(this.domNode.domNode, ie.POINTER_DOWN, (t) => this._domNodePointerDown(t))); + super(), this._lazyRender = e.lazyRender, this._host = e.host, this._scrollable = e.scrollable, this._scrollByPage = e.scrollByPage, this._scrollbarState = e.scrollbarState, this._visibilityController = this._register(new Doe(e.visibility, "visible scrollbar " + e.extraScrollbarClassName, "invisible scrollbar " + e.extraScrollbarClassName)), this._visibilityController.setIsNeeded(this._scrollbarState.isNeeded()), this._pointerMoveMonitor = this._register(new d0()), this._shouldRender = !0, this.domNode = ft(document.createElement("div")), this.domNode.setAttribute("role", "presentation"), this.domNode.setAttribute("aria-hidden", "true"), this._visibilityController.setDomNode(this.domNode), this.domNode.setPosition("absolute"), this._register(z(this.domNode.domNode, ie.POINTER_DOWN, (t) => this._domNodePointerDown(t))); } // ----------------- creation /** * Creates the dom node for an arrow & adds it to the container */ _createArrow(e) { - const t = this._register(new Jse(e)); + const t = this._register(new Eoe(e)); this.domNode.domNode.appendChild(t.bgDomNode), this.domNode.domNode.appendChild(t.domNode); } /** * Creates the slider dom node, adds it to the container & hooks up the events */ _createSlider(e, t, i, n) { - this.slider = yt(document.createElement("div")), this.slider.setClassName("slider"), this.slider.setPosition("absolute"), this.slider.setTop(e), this.slider.setLeft(t), typeof i == "number" && this.slider.setWidth(i), typeof n == "number" && this.slider.setHeight(n), this.slider.setLayerHinting(!0), this.slider.setContain("strict"), this.domNode.domNode.appendChild(this.slider.domNode), this._register(z(this.slider.domNode, ie.POINTER_DOWN, (o) => { + this.slider = ft(document.createElement("div")), this.slider.setClassName("slider"), this.slider.setPosition("absolute"), this.slider.setTop(e), this.slider.setLeft(t), typeof i == "number" && this.slider.setWidth(i), typeof n == "number" && this.slider.setHeight(n), this.slider.setLayerHinting(!0), this.slider.setContain("strict"), this.domNode.domNode.appendChild(this.slider.domNode), this._register(z(this.slider.domNode, ie.POINTER_DOWN, (o) => { o.button === 0 && (o.preventDefault(), this._sliderPointerDown(o)); })), this.onclick(this.slider.domNode, (o) => { o.leftButton && o.stopPropagation(); @@ -21895,13 +21895,13 @@ class wU extends Ko { return; const t = this._sliderPointerPosition(e), i = this._sliderOrthogonalPointerPosition(e), n = this._scrollbarState.clone(); this.slider.toggleClassName("active", !0), this._pointerMoveMonitor.startMonitoring(e.target, e.pointerId, e.buttons, (o) => { - const r = this._sliderOrthogonalPointerPosition(o), l = Math.abs(r - i); - if (kn && l > Kse) { + const l = this._sliderOrthogonalPointerPosition(o), r = Math.abs(l - i); + if (Jn && r > Foe) { this._setDesiredScrollPositionNow(n.getScrollPosition()); return; } - const c = this._sliderPointerPosition(o) - t; - this._setDesiredScrollPositionNow(n.getDesiredScrollPositionFromDelta(c)); + const d = this._sliderPointerPosition(o) - t; + this._setDesiredScrollPositionNow(n.getDesiredScrollPositionFromDelta(d)); }, () => { this.slider.toggleClassName("active", !1), this._host.onDragEnd(); }), this._host.onDragStart(); @@ -21917,13 +21917,13 @@ class wU extends Ko { return this._scrollbarState.isNeeded(); } } -const Qse = 20; -class pb { - constructor(e, t, i, n, o, r) { - this._scrollbarSize = Math.round(t), this._oppositeScrollbarSize = Math.round(i), this._arrowSize = Math.round(e), this._visibleSize = n, this._scrollSize = o, this._scrollPosition = r, this._computedAvailableSize = 0, this._computedIsNeeded = !1, this._computedSliderSize = 0, this._computedSliderRatio = 0, this._computedSliderPosition = 0, this._refreshComputedValues(); +const zoe = 20; +class GZ { + constructor(e, t, i, n, o, l) { + this._scrollbarSize = Math.round(t), this._oppositeScrollbarSize = Math.round(i), this._arrowSize = Math.round(e), this._visibleSize = n, this._scrollSize = o, this._scrollPosition = l, this._computedAvailableSize = 0, this._computedIsNeeded = !1, this._computedSliderSize = 0, this._computedSliderRatio = 0, this._computedSliderPosition = 0, this._refreshComputedValues(); } clone() { - return new pb(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize, this._visibleSize, this._scrollSize, this._scrollPosition); + return new GZ(this._arrowSize, this._scrollbarSize, this._oppositeScrollbarSize, this._visibleSize, this._scrollSize, this._scrollPosition); } setVisibleSize(e) { const t = Math.round(e); @@ -21944,26 +21944,26 @@ class pb { this._oppositeScrollbarSize = Math.round(e); } static _computeValues(e, t, i, n, o) { - const r = Math.max(0, i - e), l = Math.max(0, r - 2 * t), a = n > 0 && n > i; - if (!a) + const l = Math.max(0, i - e), r = Math.max(0, l - 2 * t), c = n > 0 && n > i; + if (!c) return { - computedAvailableSize: Math.round(r), - computedIsNeeded: a, - computedSliderSize: Math.round(l), + computedAvailableSize: Math.round(l), + computedIsNeeded: c, + computedSliderSize: Math.round(r), computedSliderRatio: 0, computedSliderPosition: 0 }; - const c = Math.round(Math.max(Qse, Math.floor(i * l / n))), d = (l - c) / (n - i), h = o * d; + const d = Math.round(Math.max(zoe, Math.floor(i * r / n))), a = (r - d) / (n - i), h = o * a; return { - computedAvailableSize: Math.round(r), - computedIsNeeded: a, - computedSliderSize: Math.round(c), - computedSliderRatio: d, + computedAvailableSize: Math.round(l), + computedIsNeeded: c, + computedSliderSize: Math.round(d), + computedSliderRatio: a, computedSliderPosition: Math.round(h) }; } _refreshComputedValues() { - const e = pb._computeValues(this._oppositeScrollbarSize, this._arrowSize, this._visibleSize, this._scrollSize, this._scrollPosition); + const e = GZ._computeValues(this._oppositeScrollbarSize, this._arrowSize, this._visibleSize, this._scrollSize, this._scrollPosition); this._computedAvailableSize = e.computedAvailableSize, this._computedIsNeeded = e.computedIsNeeded, this._computedSliderSize = e.computedSliderSize, this._computedSliderRatio = e.computedSliderRatio, this._computedSliderPosition = e.computedSliderPosition; } getArrowSize() { @@ -22020,39 +22020,39 @@ class pb { return Math.round(t / this._computedSliderRatio); } } -class jse extends wU { +class Aoe extends tQ { constructor(e, t, i) { const n = e.getScrollDimensions(), o = e.getCurrentScrollPosition(); if (super({ lazyRender: t.lazyRender, host: i, - scrollbarState: new pb(t.horizontalHasArrows ? t.arrowSize : 0, t.horizontal === 2 ? 0 : t.horizontalScrollbarSize, t.vertical === 2 ? 0 : t.verticalScrollbarSize, n.width, n.scrollWidth, o.scrollLeft), + scrollbarState: new GZ(t.horizontalHasArrows ? t.arrowSize : 0, t.horizontal === 2 ? 0 : t.horizontalScrollbarSize, t.vertical === 2 ? 0 : t.verticalScrollbarSize, n.width, n.scrollWidth, o.scrollLeft), visibility: t.horizontal, extraScrollbarClassName: "horizontal", scrollable: e, scrollByPage: t.scrollByPage }), t.horizontalHasArrows) { - const r = (t.arrowSize - mb) / 2, l = (t.horizontalScrollbarSize - mb) / 2; + const l = (t.arrowSize - WZ) / 2, r = (t.horizontalScrollbarSize - WZ) / 2; this._createArrow({ className: "scra", icon: te.scrollbarButtonLeft, - top: l, - left: r, + top: r, + left: l, bottom: void 0, right: void 0, bgWidth: t.arrowSize, bgHeight: t.horizontalScrollbarSize, - onActivate: () => this._host.onMouseWheel(new am(null, 1, 0)) + onActivate: () => this._host.onMouseWheel(new mb(null, 1, 0)) }), this._createArrow({ className: "scra", icon: te.scrollbarButtonRight, - top: l, + top: r, left: void 0, bottom: void 0, - right: r, + right: l, bgWidth: t.arrowSize, bgHeight: t.horizontalScrollbarSize, - onActivate: () => this._host.onMouseWheel(new am(null, -1, 0)) + onActivate: () => this._host.onMouseWheel(new mb(null, -1, 0)) }); } this._createSlider(Math.floor((t.horizontalScrollbarSize - t.horizontalSliderSize) / 2), 0, void 0, t.horizontalSliderSize); @@ -22085,13 +22085,13 @@ class jse extends wU { this.updateScrollbarSize(e.horizontal === 2 ? 0 : e.horizontalScrollbarSize), this._scrollbarState.setOppositeScrollbarSize(e.vertical === 2 ? 0 : e.verticalScrollbarSize), this._visibilityController.setVisibility(e.horizontal), this._scrollByPage = e.scrollByPage; } } -class qse extends wU { +class Koe extends tQ { constructor(e, t, i) { const n = e.getScrollDimensions(), o = e.getCurrentScrollPosition(); if (super({ lazyRender: t.lazyRender, host: i, - scrollbarState: new pb( + scrollbarState: new GZ( t.verticalHasArrows ? t.arrowSize : 0, t.vertical === 2 ? 0 : t.verticalScrollbarSize, // give priority to vertical scroll bar over horizontal and let it scroll all the way to the bottom @@ -22105,27 +22105,27 @@ class qse extends wU { scrollable: e, scrollByPage: t.scrollByPage }), t.verticalHasArrows) { - const r = (t.arrowSize - mb) / 2, l = (t.verticalScrollbarSize - mb) / 2; + const l = (t.arrowSize - WZ) / 2, r = (t.verticalScrollbarSize - WZ) / 2; this._createArrow({ className: "scra", icon: te.scrollbarButtonUp, - top: r, - left: l, + top: l, + left: r, bottom: void 0, right: void 0, bgWidth: t.verticalScrollbarSize, bgHeight: t.arrowSize, - onActivate: () => this._host.onMouseWheel(new am(null, 0, 1)) + onActivate: () => this._host.onMouseWheel(new mb(null, 0, 1)) }), this._createArrow({ className: "scra", icon: te.scrollbarButtonDown, top: void 0, - left: l, - bottom: r, + left: r, + bottom: l, right: void 0, bgWidth: t.verticalScrollbarSize, bgHeight: t.arrowSize, - onActivate: () => this._host.onMouseWheel(new am(null, 0, -1)) + onActivate: () => this._host.onMouseWheel(new mb(null, 0, -1)) }); } this._createSlider(0, Math.floor((t.verticalScrollbarSize - t.verticalSliderSize) / 2), t.verticalSliderSize, void 0); @@ -22158,21 +22158,21 @@ class qse extends wU { this.updateScrollbarSize(e.vertical === 2 ? 0 : e.verticalScrollbarSize), this._scrollbarState.setOppositeScrollbarSize(0), this._visibilityController.setVisibility(e.vertical), this._scrollByPage = e.scrollByPage; } } -class NA { - constructor(e, t, i, n, o, r, l) { - this._forceIntegerValues = e, this._scrollStateBrand = void 0, this._forceIntegerValues && (t = t | 0, i = i | 0, n = n | 0, o = o | 0, r = r | 0, l = l | 0), this.rawScrollLeft = n, this.rawScrollTop = l, t < 0 && (t = 0), n + t > i && (n = i - t), n < 0 && (n = 0), o < 0 && (o = 0), l + o > r && (l = r - o), l < 0 && (l = 0), this.width = t, this.scrollWidth = i, this.scrollLeft = n, this.height = o, this.scrollHeight = r, this.scrollTop = l; +class KV { + constructor(e, t, i, n, o, l, r) { + this._forceIntegerValues = e, this._scrollStateBrand = void 0, this._forceIntegerValues && (t = t | 0, i = i | 0, n = n | 0, o = o | 0, l = l | 0, r = r | 0), this.rawScrollLeft = n, this.rawScrollTop = r, t < 0 && (t = 0), n + t > i && (n = i - t), n < 0 && (n = 0), o < 0 && (o = 0), r + o > l && (r = l - o), r < 0 && (r = 0), this.width = t, this.scrollWidth = i, this.scrollLeft = n, this.height = o, this.scrollHeight = l, this.scrollTop = r; } equals(e) { return this.rawScrollLeft === e.rawScrollLeft && this.rawScrollTop === e.rawScrollTop && this.width === e.width && this.scrollWidth === e.scrollWidth && this.scrollLeft === e.scrollLeft && this.height === e.height && this.scrollHeight === e.scrollHeight && this.scrollTop === e.scrollTop; } withScrollDimensions(e, t) { - return new NA(this._forceIntegerValues, typeof e.width < "u" ? e.width : this.width, typeof e.scrollWidth < "u" ? e.scrollWidth : this.scrollWidth, t ? this.rawScrollLeft : this.scrollLeft, typeof e.height < "u" ? e.height : this.height, typeof e.scrollHeight < "u" ? e.scrollHeight : this.scrollHeight, t ? this.rawScrollTop : this.scrollTop); + return new KV(this._forceIntegerValues, typeof e.width < "u" ? e.width : this.width, typeof e.scrollWidth < "u" ? e.scrollWidth : this.scrollWidth, t ? this.rawScrollLeft : this.scrollLeft, typeof e.height < "u" ? e.height : this.height, typeof e.scrollHeight < "u" ? e.scrollHeight : this.scrollHeight, t ? this.rawScrollTop : this.scrollTop); } withScrollPosition(e) { - return new NA(this._forceIntegerValues, this.width, this.scrollWidth, typeof e.scrollLeft < "u" ? e.scrollLeft : this.rawScrollLeft, this.height, this.scrollHeight, typeof e.scrollTop < "u" ? e.scrollTop : this.rawScrollTop); + return new KV(this._forceIntegerValues, this.width, this.scrollWidth, typeof e.scrollLeft < "u" ? e.scrollLeft : this.rawScrollLeft, this.height, this.scrollHeight, typeof e.scrollTop < "u" ? e.scrollTop : this.rawScrollTop); } createScrollEvent(e, t) { - const i = this.width !== e.width, n = this.scrollWidth !== e.scrollWidth, o = this.scrollLeft !== e.scrollLeft, r = this.height !== e.height, l = this.scrollHeight !== e.scrollHeight, a = this.scrollTop !== e.scrollTop; + const i = this.width !== e.width, n = this.scrollWidth !== e.scrollWidth, o = this.scrollLeft !== e.scrollLeft, l = this.height !== e.height, r = this.scrollHeight !== e.scrollHeight, c = this.scrollTop !== e.scrollTop; return { inSmoothScrolling: t, oldWidth: e.width, @@ -22190,15 +22190,15 @@ class NA { widthChanged: i, scrollWidthChanged: n, scrollLeftChanged: o, - heightChanged: r, - scrollHeightChanged: l, - scrollTopChanged: a + heightChanged: l, + scrollHeightChanged: r, + scrollTopChanged: c }; } } -class o0 extends R { +class h0 extends J { constructor(e) { - super(), this._scrollableBrand = void 0, this._onScroll = this._register(new k()), this.onScroll = this._onScroll.event, this._smoothScrollDuration = e.smoothScrollDuration, this._scheduleAtNextAnimationFrame = e.scheduleAtNextAnimationFrame, this._state = new NA(e.forceIntegerValues, 0, 0, 0, 0, 0, 0), this._smoothScrolling = null; + super(), this._scrollableBrand = void 0, this._onScroll = this._register(new k()), this.onScroll = this._onScroll.event, this._smoothScrollDuration = e.smoothScrollDuration, this._scheduleAtNextAnimationFrame = e.scheduleAtNextAnimationFrame, this._state = new KV(e.forceIntegerValues, 0, 0, 0, 0, 0, 0), this._smoothScrolling = null; } dispose() { this._smoothScrolling && (this._smoothScrolling.dispose(), this._smoothScrolling = null), super.dispose(); @@ -22247,10 +22247,10 @@ class o0 extends R { if (this._smoothScrolling.to.scrollLeft === i.scrollLeft && this._smoothScrolling.to.scrollTop === i.scrollTop) return; let n; - t ? n = new Kw(this._smoothScrolling.from, i, this._smoothScrolling.startTime, this._smoothScrolling.duration) : n = this._smoothScrolling.combine(this._state, i, this._smoothScrollDuration), this._smoothScrolling.dispose(), this._smoothScrolling = n; + t ? n = new rW(this._smoothScrolling.from, i, this._smoothScrolling.startTime, this._smoothScrolling.duration) : n = this._smoothScrolling.combine(this._state, i, this._smoothScrollDuration), this._smoothScrolling.dispose(), this._smoothScrolling = n; } else { const i = this._state.withScrollPosition(e); - this._smoothScrolling = Kw.start(this._state, i, this._smoothScrollDuration); + this._smoothScrolling = rW.start(this._state, i, this._smoothScrollDuration); } this._smoothScrolling.animationFrameDisposable = this._scheduleAtNextAnimationFrame(() => { this._smoothScrolling && (this._smoothScrolling.animationFrameDisposable = null, this._performSmoothScrolling()); @@ -22278,23 +22278,23 @@ class o0 extends R { i.equals(e) || (this._state = e, this._onScroll.fire(this._state.createScrollEvent(i, t))); } } -class JF { +class fF { constructor(e, t, i) { this.scrollLeft = e, this.scrollTop = t, this.isDone = i; } } -function PN(s, e) { +function oR(s, e) { const t = e - s; return function(i) { - return s + t * toe(i); + return s + t * Boe(i); }; } -function $se(s, e, t) { +function Uoe(s, e, t) { return function(i) { return i < t ? s(i / t) : e((i - t) / (1 - t)); }; } -class Kw { +class rW { constructor(e, t, i, n) { this.from = e, this.to = t, this.duration = n, this.startTime = i, this.animationFrameDisposable = null, this._initAnimations(); } @@ -22303,10 +22303,10 @@ class Kw { } _initAnimation(e, t, i) { if (Math.abs(e - t) > 2.5 * i) { - let o, r; - return e < t ? (o = e + 0.75 * i, r = t - 0.75 * i) : (o = e - 0.75 * i, r = t + 0.75 * i), $se(PN(e, o), PN(r, t), 0.33); + let o, l; + return e < t ? (o = e + 0.75 * i, l = t - 0.75 * i) : (o = e - 0.75 * i, l = t + 0.75 * i), Uoe(oR(e, o), oR(l, t), 0.33); } - return PN(e, t); + return oR(e, t); } dispose() { this.animationFrameDisposable !== null && (this.animationFrameDisposable.dispose(), this.animationFrameDisposable = null); @@ -22321,32 +22321,32 @@ class Kw { const t = (e - this.startTime) / this.duration; if (t < 1) { const i = this.scrollLeft(t), n = this.scrollTop(t); - return new JF(i, n, !1); + return new fF(i, n, !1); } - return new JF(this.to.scrollLeft, this.to.scrollTop, !0); + return new fF(this.to.scrollLeft, this.to.scrollTop, !0); } combine(e, t, i) { - return Kw.start(e, t, i); + return rW.start(e, t, i); } static start(e, t, i) { i = i + 10; const n = Date.now() - 10; - return new Kw(e, t, n, i); + return new rW(e, t, n, i); } } -function eoe(s) { +function Poe(s) { return Math.pow(s, 3); } -function toe(s) { - return 1 - eoe(1 - s); +function Boe(s) { + return 1 - Poe(1 - s); } -const ioe = 500, UF = 50; -class noe { +const _oe = 500, yF = 50; +class Qoe { constructor(e, t, i) { this.timestamp = e, this.deltaX = t, this.deltaY = i, this.score = 0; } } -const rZ = class rZ { +const G2 = class G2 { constructor() { this._capacity = 5, this._memory = [], this._front = -1, this._rear = -1; } @@ -22363,15 +22363,15 @@ const rZ = class rZ { return t <= 0.5; } acceptStandardWheelEvent(e) { - if (lC) { - const t = xe(e.browserEvent), i = Y8(t); + if (WG) { + const t = Le(e.browserEvent), i = M6(t); this.accept(Date.now(), e.deltaX * i, e.deltaY * i); } else this.accept(Date.now(), e.deltaX, e.deltaY); } accept(e, t, i) { let n = null; - const o = new noe(e, t, i); + const o = new Qoe(e, t, i); this._front === -1 && this._rear === -1 ? (this._memory[0] = o, this._front = 0, this._rear = 0) : (n = this._memory[this._rear], this._rear = (this._rear + 1) % this._capacity, this._rear === this._front && (this._front = (this._front + 1) % this._capacity), this._memory[this._rear] = o), o.score = this._computeScore(o, n); } /** @@ -22384,8 +22384,8 @@ const rZ = class rZ { return 1; let i = 0.5; if ((!this._isAlmostInt(e.deltaX) || !this._isAlmostInt(e.deltaY)) && (i += 0.25), t) { - const n = Math.abs(e.deltaX), o = Math.abs(e.deltaY), r = Math.abs(t.deltaX), l = Math.abs(t.deltaY), a = Math.max(Math.min(n, r), 1), c = Math.max(Math.min(o, l), 1), d = Math.max(n, r), h = Math.max(o, l); - d % a === 0 && h % c === 0 && (i -= 0.5); + const n = Math.abs(e.deltaX), o = Math.abs(e.deltaY), l = Math.abs(t.deltaX), r = Math.abs(t.deltaY), c = Math.max(Math.min(n, l), 1), d = Math.max(Math.min(o, r), 1), a = Math.max(n, l), h = Math.max(o, r); + a % c === 0 && h % d === 0 && (i -= 0.5); } return Math.min(Math.max(i, 0), 1); } @@ -22393,14 +22393,14 @@ const rZ = class rZ { return Math.abs(Math.round(e) - e) < 0.01; } }; -rZ.INSTANCE = new rZ(); -let WA = rZ; -class HE extends Ko { +G2.INSTANCE = new G2(); +let UV = G2; +class ZJ extends jo { get options() { return this._options; } constructor(e, t, i) { - super(), this._onScroll = this._register(new k()), this.onScroll = this._onScroll.event, this._onWillScroll = this._register(new k()), e.style.overflow = "hidden", this._options = soe(t), this._scrollable = i, this._register(this._scrollable.onScroll((o) => { + super(), this._onScroll = this._register(new k()), this.onScroll = this._onScroll.event, this._onWillScroll = this._register(new k()), e.style.overflow = "hidden", this._options = Ooe(t), this._scrollable = i, this._register(this._scrollable.onScroll((o) => { this._onWillScroll.fire(o), this._onDidScroll(o), this._onScroll.fire(o); })); const n = { @@ -22408,10 +22408,10 @@ class HE extends Ko { onDragStart: () => this._onDragStart(), onDragEnd: () => this._onDragEnd() }; - this._verticalScrollbar = this._register(new qse(this._scrollable, this._options, n)), this._horizontalScrollbar = this._register(new jse(this._scrollable, this._options, n)), this._domNode = document.createElement("div"), this._domNode.className = "monaco-scrollable-element " + this._options.className, this._domNode.setAttribute("role", "presentation"), this._domNode.style.position = "relative", this._domNode.style.overflow = "hidden", this._domNode.appendChild(e), this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode), this._domNode.appendChild(this._verticalScrollbar.domNode.domNode), this._options.useShadows ? (this._leftShadowDomNode = yt(document.createElement("div")), this._leftShadowDomNode.setClassName("shadow"), this._domNode.appendChild(this._leftShadowDomNode.domNode), this._topShadowDomNode = yt(document.createElement("div")), this._topShadowDomNode.setClassName("shadow"), this._domNode.appendChild(this._topShadowDomNode.domNode), this._topLeftShadowDomNode = yt(document.createElement("div")), this._topLeftShadowDomNode.setClassName("shadow"), this._domNode.appendChild(this._topLeftShadowDomNode.domNode)) : (this._leftShadowDomNode = null, this._topShadowDomNode = null, this._topLeftShadowDomNode = null), this._listenOnDomNode = this._options.listenOnDomNode || this._domNode, this._mouseWheelToDispose = [], this._setListeningToMouseWheel(this._options.handleMouseWheel), this.onmouseover(this._listenOnDomNode, (o) => this._onMouseOver(o)), this.onmouseleave(this._listenOnDomNode, (o) => this._onMouseLeave(o)), this._hideTimeout = this._register(new qr()), this._isDragging = !1, this._mouseIsOver = !1, this._shouldRender = !0, this._revealOnScroll = !0; + this._verticalScrollbar = this._register(new Koe(this._scrollable, this._options, n)), this._horizontalScrollbar = this._register(new Aoe(this._scrollable, this._options, n)), this._domNode = document.createElement("div"), this._domNode.className = "monaco-scrollable-element " + this._options.className, this._domNode.setAttribute("role", "presentation"), this._domNode.style.position = "relative", this._domNode.style.overflow = "hidden", this._domNode.appendChild(e), this._domNode.appendChild(this._horizontalScrollbar.domNode.domNode), this._domNode.appendChild(this._verticalScrollbar.domNode.domNode), this._options.useShadows ? (this._leftShadowDomNode = ft(document.createElement("div")), this._leftShadowDomNode.setClassName("shadow"), this._domNode.appendChild(this._leftShadowDomNode.domNode), this._topShadowDomNode = ft(document.createElement("div")), this._topShadowDomNode.setClassName("shadow"), this._domNode.appendChild(this._topShadowDomNode.domNode), this._topLeftShadowDomNode = ft(document.createElement("div")), this._topLeftShadowDomNode.setClassName("shadow"), this._domNode.appendChild(this._topLeftShadowDomNode.domNode)) : (this._leftShadowDomNode = null, this._topShadowDomNode = null, this._topLeftShadowDomNode = null), this._listenOnDomNode = this._options.listenOnDomNode || this._domNode, this._mouseWheelToDispose = [], this._setListeningToMouseWheel(this._options.handleMouseWheel), this.onmouseover(this._listenOnDomNode, (o) => this._onMouseOver(o)), this.onmouseleave(this._listenOnDomNode, (o) => this._onMouseLeave(o)), this._hideTimeout = this._register(new tr()), this._isDragging = !1, this._mouseIsOver = !1, this._shouldRender = !0, this._revealOnScroll = !0; } dispose() { - this._mouseWheelToDispose = Wt(this._mouseWheelToDispose), super.dispose(); + this._mouseWheelToDispose = Nt(this._mouseWheelToDispose), super.dispose(); } /** * Get the generated 'scrollable' dom node @@ -22451,13 +22451,13 @@ class HE extends Ko { typeof e.handleMouseWheel < "u" && (this._options.handleMouseWheel = e.handleMouseWheel, this._setListeningToMouseWheel(this._options.handleMouseWheel)), typeof e.mouseWheelScrollSensitivity < "u" && (this._options.mouseWheelScrollSensitivity = e.mouseWheelScrollSensitivity), typeof e.fastScrollSensitivity < "u" && (this._options.fastScrollSensitivity = e.fastScrollSensitivity), typeof e.scrollPredominantAxis < "u" && (this._options.scrollPredominantAxis = e.scrollPredominantAxis), typeof e.horizontal < "u" && (this._options.horizontal = e.horizontal), typeof e.vertical < "u" && (this._options.vertical = e.vertical), typeof e.horizontalScrollbarSize < "u" && (this._options.horizontalScrollbarSize = e.horizontalScrollbarSize), typeof e.verticalScrollbarSize < "u" && (this._options.verticalScrollbarSize = e.verticalScrollbarSize), typeof e.scrollByPage < "u" && (this._options.scrollByPage = e.scrollByPage), this._horizontalScrollbar.updateOptions(this._options), this._verticalScrollbar.updateOptions(this._options), this._options.lazyRender || this._render(); } delegateScrollFromMouseWheelEvent(e) { - this._onMouseWheel(new am(e)); + this._onMouseWheel(new mb(e)); } // -------------------- mouse wheel scrolling -------------------- _setListeningToMouseWheel(e) { - if (this._mouseWheelToDispose.length > 0 !== e && (this._mouseWheelToDispose = Wt(this._mouseWheelToDispose), e)) { + if (this._mouseWheelToDispose.length > 0 !== e && (this._mouseWheelToDispose = Nt(this._mouseWheelToDispose), e)) { const i = (n) => { - this._onMouseWheel(new am(n)); + this._onMouseWheel(new mb(n)); }; this._mouseWheelToDispose.push(z(this._listenOnDomNode, ie.MOUSE_WHEEL, i, { passive: !1 })); } @@ -22466,25 +22466,25 @@ class HE extends Ko { var o; if ((o = e.browserEvent) != null && o.defaultPrevented) return; - const t = WA.INSTANCE; + const t = UV.INSTANCE; t.acceptStandardWheelEvent(e); let i = !1; if (e.deltaY || e.deltaX) { - let r = e.deltaY * this._options.mouseWheelScrollSensitivity, l = e.deltaX * this._options.mouseWheelScrollSensitivity; - this._options.scrollPredominantAxis && (this._options.scrollYToX && l + r === 0 ? l = r = 0 : Math.abs(r) >= Math.abs(l) ? l = 0 : r = 0), this._options.flipAxes && ([r, l] = [l, r]); - const a = !qe && e.browserEvent && e.browserEvent.shiftKey; - (this._options.scrollYToX || a) && !l && (l = r, r = 0), e.browserEvent && e.browserEvent.altKey && (l = l * this._options.fastScrollSensitivity, r = r * this._options.fastScrollSensitivity); - const c = this._scrollable.getFutureScrollPosition(); - let d = {}; - if (r) { - const h = UF * r, u = c.scrollTop - (h < 0 ? Math.floor(h) : Math.ceil(h)); - this._verticalScrollbar.writeScrollPosition(d, u); - } + let l = e.deltaY * this._options.mouseWheelScrollSensitivity, r = e.deltaX * this._options.mouseWheelScrollSensitivity; + this._options.scrollPredominantAxis && (this._options.scrollYToX && r + l === 0 ? r = l = 0 : Math.abs(l) >= Math.abs(r) ? r = 0 : l = 0), this._options.flipAxes && ([l, r] = [r, l]); + const c = !qe && e.browserEvent && e.browserEvent.shiftKey; + (this._options.scrollYToX || c) && !r && (r = l, l = 0), e.browserEvent && e.browserEvent.altKey && (r = r * this._options.fastScrollSensitivity, l = l * this._options.fastScrollSensitivity); + const d = this._scrollable.getFutureScrollPosition(); + let a = {}; if (l) { - const h = UF * l, u = c.scrollLeft - (h < 0 ? Math.floor(h) : Math.ceil(h)); - this._horizontalScrollbar.writeScrollPosition(d, u); + const h = yF * l, u = d.scrollTop - (h < 0 ? Math.floor(h) : Math.ceil(h)); + this._verticalScrollbar.writeScrollPosition(a, u); + } + if (r) { + const h = yF * r, u = d.scrollLeft - (h < 0 ? Math.floor(h) : Math.ceil(h)); + this._horizontalScrollbar.writeScrollPosition(a, u); } - d = this._scrollable.validateScrollPosition(d), (c.scrollLeft !== d.scrollLeft || c.scrollTop !== d.scrollTop) && (this._options.mouseWheelSmoothScroll && t.isPhysicalMouseWheel() ? this._scrollable.setScrollPositionSmooth(d) : this._scrollable.setScrollPositionNow(d), i = !0); + a = this._scrollable.validateScrollPosition(a), (d.scrollLeft !== a.scrollLeft || d.scrollTop !== a.scrollTop) && (this._options.mouseWheelSmoothScroll && t.isPhysicalMouseWheel() ? this._scrollable.setScrollPositionSmooth(a) : this._scrollable.setScrollPositionNow(a), i = !0); } let n = i; !n && this._options.alwaysConsumeMouseWheel && (n = !0), !n && this._options.consumeMouseWheelIfScrollbarIsNeeded && (this._verticalScrollbar.isNeeded() || this._horizontalScrollbar.isNeeded()) && (n = !0), n && (e.preventDefault(), e.stopPropagation()); @@ -22503,8 +22503,8 @@ class HE extends Ko { } _render() { if (this._shouldRender && (this._shouldRender = !1, this._horizontalScrollbar.render(), this._verticalScrollbar.render(), this._options.useShadows)) { - const e = this._scrollable.getCurrentScrollPosition(), t = e.scrollTop > 0, i = e.scrollLeft > 0, n = i ? " left" : "", o = t ? " top" : "", r = i || t ? " top-left-corner" : ""; - this._leftShadowDomNode.setClassName(`shadow${n}`), this._topShadowDomNode.setClassName(`shadow${o}`), this._topLeftShadowDomNode.setClassName(`shadow${r}${o}${n}`); + const e = this._scrollable.getCurrentScrollPosition(), t = e.scrollTop > 0, i = e.scrollLeft > 0, n = i ? " left" : "", o = t ? " top" : "", l = i || t ? " top-left-corner" : ""; + this._leftShadowDomNode.setClassName(`shadow${n}`), this._topShadowDomNode.setClassName(`shadow${o}`), this._topLeftShadowDomNode.setClassName(`shadow${l}${o}${n}`); } } // -------------------- fade in / fade out -------------------- @@ -22527,16 +22527,16 @@ class HE extends Ko { !this._mouseIsOver && !this._isDragging && (this._verticalScrollbar.beginHide(), this._horizontalScrollbar.beginHide()); } _scheduleHide() { - !this._mouseIsOver && !this._isDragging && this._hideTimeout.cancelAndSet(() => this._hide(), ioe); + !this._mouseIsOver && !this._isDragging && this._hideTimeout.cancelAndSet(() => this._hide(), _oe); } } -class CU extends HE { +class iQ extends ZJ { constructor(e, t) { t = t || {}, t.mouseWheelSmoothScroll = !1; - const i = new o0({ + const i = new h0({ forceIntegerValues: !0, smoothScrollDuration: 0, - scheduleAtNextAnimationFrame: (n) => po(xe(e), n) + scheduleAtNextAnimationFrame: (n) => Zo(Le(e), n) }); super(e, t, i), this._register(i); } @@ -22544,7 +22544,7 @@ class CU extends HE { this._scrollable.setScrollPositionNow(e); } } -class uI extends HE { +class xx extends ZJ { constructor(e, t, i) { super(e, t, i); } @@ -22555,14 +22555,14 @@ class uI extends HE { return this._scrollable.getCurrentScrollPosition(); } } -class CC extends HE { +class MG extends ZJ { constructor(e, t) { t = t || {}, t.mouseWheelSmoothScroll = !1; - const i = new o0({ + const i = new h0({ forceIntegerValues: !1, // See https://github.com/microsoft/vscode/issues/139877 smoothScrollDuration: 0, - scheduleAtNextAnimationFrame: (n) => po(xe(e), n) + scheduleAtNextAnimationFrame: (n) => Zo(Le(e), n) }); super(e, t, i), this._register(i), this._element = e, this._register(this.onScroll((n) => { n.scrollTopChanged && (this._element.scrollTop = n.scrollTop), n.scrollLeftChanged && (this._element.scrollLeft = n.scrollLeft); @@ -22586,7 +22586,7 @@ class CC extends HE { }); } } -function soe(s) { +function Ooe(s) { const e = { lazyRender: typeof s.lazyRender < "u" ? s.lazyRender : !1, className: typeof s.className < "u" ? s.className : "", @@ -22614,46 +22614,46 @@ function soe(s) { }; return e.horizontalSliderSize = typeof s.horizontalSliderSize < "u" ? s.horizontalSliderSize : e.horizontalScrollbarSize, e.verticalSliderSize = typeof s.verticalSliderSize < "u" ? s.verticalSliderSize : e.verticalScrollbarSize, qe && (e.className += " mac"), e; } -class JE extends yC { +class fJ extends wG { constructor(e, t, i) { - super(), this._mouseLeaveMonitor = null, this._context = e, this.viewController = t, this.viewHelper = i, this.mouseTargetFactory = new On(this._context, i), this._mouseDownOperation = this._register(new ooe(this._context, this.viewController, this.viewHelper, this.mouseTargetFactory, (r, l) => this._createMouseTarget(r, l), (r) => this._getMouseColumn(r))), this.lastMouseLeaveTime = -1, this._height = this._context.configuration.options.get( + super(), this._mouseLeaveMonitor = null, this._context = e, this.viewController = t, this.viewHelper = i, this.mouseTargetFactory = new Bn(this._context, i), this._mouseDownOperation = this._register(new joe(this._context, this.viewController, this.viewHelper, this.mouseTargetFactory, (l, r) => this._createMouseTarget(l, r), (l) => this._getMouseColumn(l))), this.lastMouseLeaveTime = -1, this._height = this._context.configuration.options.get( 146 /* EditorOption.layoutInfo */ ).height; - const n = new bse(this.viewHelper.viewDomNode); - this._register(n.onContextMenu(this.viewHelper.viewDomNode, (r) => this._onContextMenu(r, !0))), this._register(n.onMouseMove(this.viewHelper.viewDomNode, (r) => { - this._onMouseMove(r), this._mouseLeaveMonitor || (this._mouseLeaveMonitor = z(this.viewHelper.viewDomNode.ownerDocument, "mousemove", (l) => { - this.viewHelper.viewDomNode.contains(l.target) || this._onMouseLeave(new Vh(l, !1, this.viewHelper.viewDomNode)); + const n = new doe(this.viewHelper.viewDomNode); + this._register(n.onContextMenu(this.viewHelper.viewDomNode, (l) => this._onContextMenu(l, !0))), this._register(n.onMouseMove(this.viewHelper.viewDomNode, (l) => { + this._onMouseMove(l), this._mouseLeaveMonitor || (this._mouseLeaveMonitor = z(this.viewHelper.viewDomNode.ownerDocument, "mousemove", (r) => { + this.viewHelper.viewDomNode.contains(r.target) || this._onMouseLeave(new Hh(r, !1, this.viewHelper.viewDomNode)); })); - })), this._register(n.onMouseUp(this.viewHelper.viewDomNode, (r) => this._onMouseUp(r))), this._register(n.onMouseLeave(this.viewHelper.viewDomNode, (r) => this._onMouseLeave(r))); + })), this._register(n.onMouseUp(this.viewHelper.viewDomNode, (l) => this._onMouseUp(l))), this._register(n.onMouseLeave(this.viewHelper.viewDomNode, (l) => this._onMouseLeave(l))); let o = 0; - this._register(n.onPointerDown(this.viewHelper.viewDomNode, (r, l) => { - o = l; - })), this._register(z(this.viewHelper.viewDomNode, ie.POINTER_UP, (r) => { + this._register(n.onPointerDown(this.viewHelper.viewDomNode, (l, r) => { + o = r; + })), this._register(z(this.viewHelper.viewDomNode, ie.POINTER_UP, (l) => { this._mouseDownOperation.onPointerUp(); - })), this._register(n.onMouseDown(this.viewHelper.viewDomNode, (r) => this._onMouseDown(r, o))), this._setupMouseWheelZoomListener(), this._context.addEventHandler(this); + })), this._register(n.onMouseDown(this.viewHelper.viewDomNode, (l) => this._onMouseDown(l, o))), this._setupMouseWheelZoomListener(), this._context.addEventHandler(this); } _setupMouseWheelZoomListener() { - const e = WA.INSTANCE; - let t = 0, i = lr.getZoomLevel(), n = !1, o = 0; - const r = (a) => { - if (this.viewController.emitMouseWheel(a), !this._context.configuration.options.get( + const e = UV.INSTANCE; + let t = 0, i = dl.getZoomLevel(), n = !1, o = 0; + const l = (c) => { + if (this.viewController.emitMouseWheel(c), !this._context.configuration.options.get( 76 /* EditorOption.mouseWheelZoom */ )) return; - const c = new am(a); - if (e.acceptStandardWheelEvent(c), e.isPhysicalMouseWheel()) { - if (l(a)) { - const d = lr.getZoomLevel(), h = c.deltaY > 0 ? 1 : -1; - lr.setZoomLevel(d + h), c.preventDefault(), c.stopPropagation(); + const d = new mb(c); + if (e.acceptStandardWheelEvent(d), e.isPhysicalMouseWheel()) { + if (r(c)) { + const a = dl.getZoomLevel(), h = d.deltaY > 0 ? 1 : -1; + dl.setZoomLevel(a + h), d.preventDefault(), d.stopPropagation(); } } else - Date.now() - t > 50 && (i = lr.getZoomLevel(), n = l(a), o = 0), t = Date.now(), o += c.deltaY, n && (lr.setZoomLevel(i + o / 5), c.preventDefault(), c.stopPropagation()); + Date.now() - t > 50 && (i = dl.getZoomLevel(), n = r(c), o = 0), t = Date.now(), o += d.deltaY, n && (dl.setZoomLevel(i + o / 5), d.preventDefault(), d.stopPropagation()); }; - this._register(z(this.viewHelper.viewDomNode, ie.MOUSE_WHEEL, r, { capture: !0, passive: !1 })); - function l(a) { - return qe ? (a.metaKey || a.ctrlKey) && !a.shiftKey && !a.altKey : a.ctrlKey && !a.metaKey && !a.shiftKey && !a.altKey; + this._register(z(this.viewHelper.viewDomNode, ie.MOUSE_WHEEL, l, { capture: !0, passive: !1 })); + function r(c) { + return qe ? (c.metaKey || c.ctrlKey) && !c.shiftKey && !c.altKey : c.ctrlKey && !c.metaKey && !c.shiftKey && !c.altKey; } } dispose() { @@ -22681,16 +22681,16 @@ class JE extends yC { } // --- end event handlers getTargetAtClientPoint(e, t) { - const n = new uU(e, t).toPageCoordinates(xe(this.viewHelper.viewDomNode)), o = PE(this.viewHelper.viewDomNode); + const n = new __(e, t).toPageCoordinates(Le(this.viewHelper.viewDomNode)), o = bJ(this.viewHelper.viewDomNode); if (n.y < o.y || n.y > o.y + o.height || n.x < o.x || n.x > o.x + o.width) return null; - const r = BE(this.viewHelper.viewDomNode, o, n); - return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(), o, n, r, null); + const l = pJ(this.viewHelper.viewDomNode, o, n); + return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(), o, n, l, null); } _createMouseTarget(e, t) { let i = e.target; if (!this.viewHelper.viewDomNode.contains(i)) { - const n = hm(this.viewHelper.viewDomNode); + const n = gb(this.viewHelper.viewDomNode); n && (i = n.elementsFromPoint(e.posx, e.posy).find((o) => this.viewHelper.viewDomNode.contains(o))); } return this.mouseTargetFactory.createMouseTarget(this.viewHelper.getLastRenderData(), e.editorPos, e.pos, e.relativePos, t ? i : null); @@ -22723,32 +22723,32 @@ class JE extends yC { }); } _onMouseDown(e, t) { - const i = this._createMouseTarget(e, !0), n = i.type === 6 || i.type === 7, o = i.type === 2 || i.type === 3 || i.type === 4, r = i.type === 3, l = this._context.configuration.options.get( + const i = this._createMouseTarget(e, !0), n = i.type === 6 || i.type === 7, o = i.type === 2 || i.type === 3 || i.type === 4, l = i.type === 3, r = this._context.configuration.options.get( 110 /* EditorOption.selectOnLineNumbers */ - ), a = i.type === 8 || i.type === 5, c = i.type === 9; - let d = e.leftButton || e.middleButton; - qe && e.leftButton && e.ctrlKey && (d = !1); + ), c = i.type === 8 || i.type === 5, d = i.type === 9; + let a = e.leftButton || e.middleButton; + qe && e.leftButton && e.ctrlKey && (a = !1); const h = () => { e.preventDefault(), this.viewHelper.focusTextArea(); }; - if (d && (n || r && l)) + if (a && (n || l && r)) h(), this._mouseDownOperation.start(i.type, e, t); else if (o) e.preventDefault(); - else if (a) { + else if (c) { const u = i.detail; - d && this.viewHelper.shouldSuppressMouseDownOnViewZone(u.viewZoneId) && (h(), this._mouseDownOperation.start(i.type, e, t), e.preventDefault()); - } else c && this.viewHelper.shouldSuppressMouseDownOnWidget(i.detail) && (h(), e.preventDefault()); + a && this.viewHelper.shouldSuppressMouseDownOnViewZone(u.viewZoneId) && (h(), this._mouseDownOperation.start(i.type, e, t), e.preventDefault()); + } else d && this.viewHelper.shouldSuppressMouseDownOnWidget(i.detail) && (h(), e.preventDefault()); this.viewController.emitMouseDown({ event: e, target: i }); } } -class ooe extends R { - constructor(e, t, i, n, o, r) { - super(), this._context = e, this._viewController = t, this._viewHelper = i, this._mouseTargetFactory = n, this._createMouseTarget = o, this._getMouseColumn = r, this._mouseMoveMonitor = this._register(new wse(this._viewHelper.viewDomNode)), this._topBottomDragScrolling = this._register(new roe(this._context, this._viewHelper, this._mouseTargetFactory, (l, a, c) => this._dispatchMouse(l, a, c))), this._mouseState = new cv(), this._currentSelection = new fe(1, 1, 1, 1), this._isActive = !1, this._lastMouseEvent = null; +class joe extends J { + constructor(e, t, i, n, o, l) { + super(), this._context = e, this._viewController = t, this._viewHelper = i, this._mouseTargetFactory = n, this._createMouseTarget = o, this._getMouseColumn = l, this._mouseMoveMonitor = this._register(new hoe(this._viewHelper.viewDomNode)), this._topBottomDragScrolling = this._register(new qoe(this._context, this._viewHelper, this._mouseTargetFactory, (r, c, d) => this._dispatchMouse(r, c, d))), this._mouseState = new Nw(), this._currentSelection = new ge(1, 1, 1, 1), this._isActive = !1, this._lastMouseEvent = null; } dispose() { super.dispose(); @@ -22789,11 +22789,11 @@ class ooe extends R { 22 /* EditorOption.columnSelection */ ) && !this._mouseState.altKey && t.detail < 2 && !this._isActive && !this._currentSelection.isEmpty() && n.type === 6 && n.position && this._currentSelection.containsPosition(n.position)) { - this._mouseState.isDragAndDrop = !0, this._isActive = !0, this._mouseMoveMonitor.startMonitoring(this._viewHelper.viewLinesDomNode, i, t.buttons, (r) => this._onMouseDownThenMove(r), (r) => { - const l = this._findMousePosition(this._lastMouseEvent, !1); - uc(r) ? this._viewController.emitMouseDropCanceled() : this._viewController.emitMouseDrop({ + this._mouseState.isDragAndDrop = !0, this._isActive = !0, this._mouseMoveMonitor.startMonitoring(this._viewHelper.viewLinesDomNode, i, t.buttons, (l) => this._onMouseDownThenMove(l), (l) => { + const r = this._findMousePosition(this._lastMouseEvent, !1); + gd(l) ? this._viewController.emitMouseDropCanceled() : this._viewController.emitMouseDrop({ event: this._lastMouseEvent, - target: l ? this._createMouseTarget(this._lastMouseEvent, !0) : null + target: r ? this._createMouseTarget(this._lastMouseEvent, !0) : null // Ignoring because position is unknown, e.g., Content View Zone }), this._stop(); }); @@ -22804,7 +22804,7 @@ class ooe extends R { t.shiftKey, 1 /* NavigationCommandRevealType.Minimal */ - ), this._isActive || (this._isActive = !0, this._mouseMoveMonitor.startMonitoring(this._viewHelper.viewLinesDomNode, i, t.buttons, (r) => this._onMouseDownThenMove(r), () => this._stop())); + ), this._isActive || (this._isActive = !0, this._mouseMoveMonitor.startMonitoring(this._viewHelper.viewLinesDomNode, i, t.buttons, (l) => this._onMouseDownThenMove(l), () => this._stop())); } _stop() { this._isActive = !1, this._topBottomDragScrolling.stop(); @@ -22821,33 +22821,33 @@ class ooe extends R { _getPositionOutsideEditor(e) { const t = e.editorPos, i = this._context.viewModel, n = this._context.viewLayout, o = this._getMouseColumn(e); if (e.posy < t.y) { - const l = t.y - e.posy, a = Math.max(n.getCurrentScrollTop() - l, 0), c = gb.getZoneAtCoord(this._context, a); - if (c) { - const h = this._helpPositionJumpOverViewZone(c); + const r = t.y - e.posy, c = Math.max(n.getCurrentScrollTop() - r, 0), d = yZ.getZoneAtCoord(this._context, c); + if (d) { + const h = this._helpPositionJumpOverViewZone(d); if (h) - return Hn.createOutsideEditor(o, h, "above", l); + return _n.createOutsideEditor(o, h, "above", r); } - const d = n.getLineNumberAtVerticalOffset(a); - return Hn.createOutsideEditor(o, new V(d, 1), "above", l); + const a = n.getLineNumberAtVerticalOffset(c); + return _n.createOutsideEditor(o, new Y(a, 1), "above", r); } if (e.posy > t.y + t.height) { - const l = e.posy - t.y - t.height, a = n.getCurrentScrollTop() + e.relativePos.y, c = gb.getZoneAtCoord(this._context, a); - if (c) { - const h = this._helpPositionJumpOverViewZone(c); + const r = e.posy - t.y - t.height, c = n.getCurrentScrollTop() + e.relativePos.y, d = yZ.getZoneAtCoord(this._context, c); + if (d) { + const h = this._helpPositionJumpOverViewZone(d); if (h) - return Hn.createOutsideEditor(o, h, "below", l); + return _n.createOutsideEditor(o, h, "below", r); } - const d = n.getLineNumberAtVerticalOffset(a); - return Hn.createOutsideEditor(o, new V(d, i.getLineMaxColumn(d)), "below", l); + const a = n.getLineNumberAtVerticalOffset(c); + return _n.createOutsideEditor(o, new Y(a, i.getLineMaxColumn(a)), "below", r); } - const r = n.getLineNumberAtVerticalOffset(n.getCurrentScrollTop() + e.relativePos.y); + const l = n.getLineNumberAtVerticalOffset(n.getCurrentScrollTop() + e.relativePos.y); if (e.posx < t.x) { - const l = t.x - e.posx; - return Hn.createOutsideEditor(o, new V(r, 1), "left", l); + const r = t.x - e.posx; + return _n.createOutsideEditor(o, new Y(l, 1), "left", r); } if (e.posx > t.x + t.width) { - const l = e.posx - t.x - t.width; - return Hn.createOutsideEditor(o, new V(r, i.getLineMaxColumn(r)), "right", l); + const r = e.posx - t.x - t.width; + return _n.createOutsideEditor(o, new Y(l, i.getLineMaxColumn(l)), "right", r); } return null; } @@ -22859,14 +22859,14 @@ class ooe extends R { if (!n.position) return null; if (n.type === 8 || n.type === 5) { - const r = this._helpPositionJumpOverViewZone(n.detail); - if (r) - return Hn.createViewZone(n.type, n.element, n.mouseColumn, r, n.detail); + const l = this._helpPositionJumpOverViewZone(n.detail); + if (l) + return _n.createViewZone(n.type, n.element, n.mouseColumn, l, n.detail); } return n; } _helpPositionJumpOverViewZone(e) { - const t = new V(this._currentSelection.selectionStartLineNumber, this._currentSelection.selectionStartColumn), i = e.positionBefore, n = e.positionAfter; + const t = new Y(this._currentSelection.selectionStartLineNumber, this._currentSelection.selectionStartColumn), i = e.positionBefore, n = e.positionAfter; return i && n ? i.isBefore(t) ? i : n : null; } _dispatchMouse(e, t, i) { @@ -22887,7 +22887,7 @@ class ooe extends R { }); } } -class roe extends R { +class qoe extends J { constructor(e, t, i, n) { super(), this._context = e, this._viewHelper = t, this._mouseTargetFactory = i, this._dispatchMouse = n, this._operation = null; } @@ -22895,15 +22895,15 @@ class roe extends R { super.dispose(), this.stop(); } start(e, t) { - this._operation ? this._operation.setPosition(e, t) : this._operation = new loe(this._context, this._viewHelper, this._mouseTargetFactory, this._dispatchMouse, e, t); + this._operation ? this._operation.setPosition(e, t) : this._operation = new $oe(this._context, this._viewHelper, this._mouseTargetFactory, this._dispatchMouse, e, t); } stop() { this._operation && (this._operation.dispose(), this._operation = null); } } -class loe extends R { - constructor(e, t, i, n, o, r) { - super(), this._context = e, this._viewHelper = t, this._mouseTargetFactory = i, this._dispatchMouse = n, this._position = o, this._mouseEvent = r, this._lastTime = Date.now(), this._animationFrameDisposable = po(xe(r.browserEvent), () => this._execute()); +class $oe extends J { + constructor(e, t, i, n, o, l) { + super(), this._context = e, this._viewHelper = t, this._mouseTargetFactory = i, this._dispatchMouse = n, this._position = o, this._mouseEvent = l, this._lastTime = Date.now(), this._animationFrameDisposable = Zo(Le(l.browserEvent), () => this._execute()); } dispose() { this._animationFrameDisposable.dispose(), super.dispose(); @@ -22937,24 +22937,24 @@ class loe extends R { /* EditorOption.lineHeight */ ), t = this._getScrollSpeed(), i = this._tick(), n = t * (i / 1e3) * e, o = this._position.outsidePosition === "above" ? -n : n; this._context.viewModel.viewLayout.deltaScrollNow(0, o), this._viewHelper.renderNow(); - const r = this._context.viewLayout.getLinesViewportData(), l = this._position.outsidePosition === "above" ? r.startLineNumber : r.endLineNumber; - let a; + const l = this._context.viewLayout.getLinesViewportData(), r = this._position.outsidePosition === "above" ? l.startLineNumber : l.endLineNumber; + let c; { - const c = PE(this._viewHelper.viewDomNode), d = this._context.configuration.options.get( + const d = bJ(this._viewHelper.viewDomNode), a = this._context.configuration.options.get( 146 /* EditorOption.layoutInfo */ - ).horizontalScrollbarHeight, h = new aI(this._mouseEvent.pos.x, c.y + c.height - d - 0.1), u = BE(this._viewHelper.viewDomNode, c, h); - a = this._mouseTargetFactory.createMouseTarget(this._viewHelper.getLastRenderData(), c, h, u, null); + ).horizontalScrollbarHeight, h = new Vx(this._mouseEvent.pos.x, d.y + d.height - a - 0.1), u = pJ(this._viewHelper.viewDomNode, d, h); + c = this._mouseTargetFactory.createMouseTarget(this._viewHelper.getLastRenderData(), d, h, u, null); } - (!a.position || a.position.lineNumber !== l) && (this._position.outsidePosition === "above" ? a = Hn.createOutsideEditor(this._position.mouseColumn, new V(l, 1), "above", this._position.outsideDistance) : a = Hn.createOutsideEditor(this._position.mouseColumn, new V(l, this._context.viewModel.getLineMaxColumn(l)), "below", this._position.outsideDistance)), this._dispatchMouse( - a, + (!c.position || c.position.lineNumber !== r) && (this._position.outsidePosition === "above" ? c = _n.createOutsideEditor(this._position.mouseColumn, new Y(r, 1), "above", this._position.outsideDistance) : c = _n.createOutsideEditor(this._position.mouseColumn, new Y(r, this._context.viewModel.getLineMaxColumn(r)), "below", this._position.outsideDistance)), this._dispatchMouse( + c, !0, 2 /* NavigationCommandRevealType.None */ - ), this._animationFrameDisposable = po(xe(a.element), () => this._execute()); + ), this._animationFrameDisposable = Zo(Le(c.element), () => this._execute()); } } -const lZ = class lZ { +const X2 = class X2 { // ms get altKey() { return this._altKey; @@ -22994,11 +22994,11 @@ const lZ = class lZ { } trySetCount(e, t) { const i = (/* @__PURE__ */ new Date()).getTime(); - i - this._lastSetMouseDownCountTime > lZ.CLEAR_MOUSE_DOWN_COUNT_TIME && (e = 1), this._lastSetMouseDownCountTime = i, e > this._lastMouseDownCount + 1 && (e = this._lastMouseDownCount + 1), this._lastMouseDownPosition && this._lastMouseDownPosition.equals(t) ? this._lastMouseDownPositionEqualCount++ : this._lastMouseDownPositionEqualCount = 1, this._lastMouseDownPosition = t, this._lastMouseDownCount = Math.min(e, this._lastMouseDownPositionEqualCount); + i - this._lastSetMouseDownCountTime > X2.CLEAR_MOUSE_DOWN_COUNT_TIME && (e = 1), this._lastSetMouseDownCountTime = i, e > this._lastMouseDownCount + 1 && (e = this._lastMouseDownCount + 1), this._lastMouseDownPosition && this._lastMouseDownPosition.equals(t) ? this._lastMouseDownPositionEqualCount++ : this._lastMouseDownPositionEqualCount = 1, this._lastMouseDownPosition = t, this._lastMouseDownCount = Math.min(e, this._lastMouseDownPositionEqualCount); } }; -lZ.CLEAR_MOUSE_DOWN_COUNT_TIME = 400; -let cv = lZ; +X2.CLEAR_MOUSE_DOWN_COUNT_TIME = 400; +let Nw = X2; class et { get event() { return this.emitter.event; @@ -23014,7 +23014,7 @@ class et { this.emitter.dispose(); } } -const cf = class cf { +const pg = class pg { constructor(e, t, i, n, o) { this.value = e, this.selectionStart = t, this.selectionEnd = i, this.selection = n, this.newlineCountBeforeSelection = o; } @@ -23023,34 +23023,34 @@ const cf = class cf { } static readFromTextArea(e, t) { const i = e.getValue(), n = e.getSelectionStart(), o = e.getSelectionEnd(); - let r; + let l; if (t) { - const l = i.substring(0, n), a = t.value.substring(0, t.selectionStart); - l === a && (r = t.newlineCountBeforeSelection); + const r = i.substring(0, n), c = t.value.substring(0, t.selectionStart); + r === c && (l = t.newlineCountBeforeSelection); } - return new cf(i, n, o, null, r); + return new pg(i, n, o, null, l); } collapseSelection() { - return this.selectionStart === this.value.length ? this : new cf(this.value, this.value.length, this.value.length, null, void 0); + return this.selectionStart === this.value.length ? this : new pg(this.value, this.value.length, this.value.length, null, void 0); } writeToTextArea(e, t, i) { t.setValue(e, this.value), i && t.setSelectionRange(e, this.selectionStart, this.selectionEnd); } deduceEditorPosition(e) { - var n, o, r, l; + var n, o, l, r; if (e <= this.selectionStart) { - const a = this.value.substring(e, this.selectionStart); - return this._finishDeduceEditorPosition(((n = this.selection) == null ? void 0 : n.getStartPosition()) ?? null, a, -1); + const c = this.value.substring(e, this.selectionStart); + return this._finishDeduceEditorPosition(((n = this.selection) == null ? void 0 : n.getStartPosition()) ?? null, c, -1); } if (e >= this.selectionEnd) { - const a = this.value.substring(this.selectionEnd, e); - return this._finishDeduceEditorPosition(((o = this.selection) == null ? void 0 : o.getEndPosition()) ?? null, a, 1); + const c = this.value.substring(this.selectionEnd, e); + return this._finishDeduceEditorPosition(((o = this.selection) == null ? void 0 : o.getEndPosition()) ?? null, c, 1); } const t = this.value.substring(this.selectionStart, e); if (t.indexOf("…") === -1) - return this._finishDeduceEditorPosition(((r = this.selection) == null ? void 0 : r.getStartPosition()) ?? null, t, 1); + return this._finishDeduceEditorPosition(((l = this.selection) == null ? void 0 : l.getStartPosition()) ?? null, t, 1); const i = this.value.substring(e, this.selectionEnd); - return this._finishDeduceEditorPosition(((l = this.selection) == null ? void 0 : l.getEndPosition()) ?? null, i, -1); + return this._finishDeduceEditorPosition(((r = this.selection) == null ? void 0 : r.getEndPosition()) ?? null, i, -1); } _finishDeduceEditorPosition(e, t, i) { let n = 0, o = -1; @@ -23067,21 +23067,21 @@ const cf = class cf { replaceNextCharCnt: 0, positionDelta: 0 }; - const n = Math.min(Ih(e.value, t.value), e.selectionStart, t.selectionStart), o = Math.min(eA(e.value, t.value), e.value.length - e.selectionEnd, t.value.length - t.selectionEnd); + const n = Math.min(Th(e.value, t.value), e.selectionStart, t.selectionStart), o = Math.min(pV(e.value, t.value), e.value.length - e.selectionEnd, t.value.length - t.selectionEnd); e.value.substring(n, e.value.length - o); - const r = t.value.substring(n, t.value.length - o), l = e.selectionStart - n, a = e.selectionEnd - n, c = t.selectionStart - n, d = t.selectionEnd - n; - if (c === d) { + const l = t.value.substring(n, t.value.length - o), r = e.selectionStart - n, c = e.selectionEnd - n, d = t.selectionStart - n, a = t.selectionEnd - n; + if (d === a) { const u = e.selectionStart - n; return { - text: r, + text: l, replacePrevCharCnt: u, replaceNextCharCnt: 0, positionDelta: 0 }; } - const h = a - l; + const h = c - r; return { - text: r, + text: l, replacePrevCharCnt: h, replaceNextCharCnt: 0, positionDelta: 0 @@ -23102,97 +23102,97 @@ const cf = class cf { replaceNextCharCnt: 0, positionDelta: t.selectionEnd - e.selectionEnd }; - const i = Math.min(Ih(e.value, t.value), e.selectionEnd), n = Math.min(eA(e.value, t.value), e.value.length - e.selectionEnd), o = e.value.substring(i, e.value.length - n), r = t.value.substring(i, t.value.length - n); + const i = Math.min(Th(e.value, t.value), e.selectionEnd), n = Math.min(pV(e.value, t.value), e.value.length - e.selectionEnd), o = e.value.substring(i, e.value.length - n), l = t.value.substring(i, t.value.length - n); e.selectionStart - i; - const l = e.selectionEnd - i; + const r = e.selectionEnd - i; t.selectionStart - i; - const a = t.selectionEnd - i; + const c = t.selectionEnd - i; return { - text: r, - replacePrevCharCnt: l, - replaceNextCharCnt: o.length - l, - positionDelta: a - r.length + text: l, + replacePrevCharCnt: r, + replaceNextCharCnt: o.length - r, + positionDelta: c - l.length }; } }; -cf.EMPTY = new cf("", 0, 0, null, void 0); -let Jn = cf; -class Rp { +pg.EMPTY = new pg("", 0, 0, null, void 0); +let Qn = pg; +class Ap { static _getPageOfLine(e, t) { return Math.floor((e - 1) / t); } static _getRangeForPage(e, t) { const i = e * t, n = i + 1, o = i + t; - return new M(n, 1, o + 1, 1); + return new I(n, 1, o + 1, 1); } static fromEditorSelection(e, t, i, n) { - const r = Rp._getPageOfLine(t.startLineNumber, i), l = Rp._getRangeForPage(r, i), a = Rp._getPageOfLine(t.endLineNumber, i), c = Rp._getRangeForPage(a, i); - let d = l.intersectRanges(new M(1, 1, t.startLineNumber, t.startColumn)); + const l = Ap._getPageOfLine(t.startLineNumber, i), r = Ap._getRangeForPage(l, i), c = Ap._getPageOfLine(t.endLineNumber, i), d = Ap._getRangeForPage(c, i); + let a = r.intersectRanges(new I(1, 1, t.startLineNumber, t.startColumn)); if (n && e.getValueLengthInRange( - d, + a, 1 /* EndOfLinePreference.LF */ ) > 500) { - const y = e.modifyPosition(d.getEndPosition(), -500); - d = M.fromPositions(y, d.getEndPosition()); + const f = e.modifyPosition(a.getEndPosition(), -500); + a = I.fromPositions(f, a.getEndPosition()); } const h = e.getValueInRange( - d, + a, 1 /* EndOfLinePreference.LF */ - ), u = e.getLineCount(), g = e.getLineMaxColumn(u); - let m = c.intersectRanges(new M(t.endLineNumber, t.endColumn, u, g)); + ), u = e.getLineCount(), m = e.getLineMaxColumn(u); + let b = d.intersectRanges(new I(t.endLineNumber, t.endColumn, u, m)); if (n && e.getValueLengthInRange( - m, + b, 1 /* EndOfLinePreference.LF */ ) > 500) { - const y = e.modifyPosition(m.getStartPosition(), 500); - m = M.fromPositions(m.getStartPosition(), y); + const f = e.modifyPosition(b.getStartPosition(), 500); + b = I.fromPositions(b.getStartPosition(), f); } - const f = e.getValueInRange( - m, + const g = e.getValueInRange( + b, 1 /* EndOfLinePreference.LF */ ); - let b; - if (r === a || r + 1 === a) - b = e.getValueInRange( + let Z; + if (l === c || l + 1 === c) + Z = e.getValueInRange( t, 1 /* EndOfLinePreference.LF */ ); else { - const y = l.intersectRanges(t), w = c.intersectRanges(t); - b = e.getValueInRange( - y, + const f = r.intersectRanges(t), y = d.intersectRanges(t); + Z = e.getValueInRange( + f, 1 /* EndOfLinePreference.LF */ ) + "…" + e.getValueInRange( - w, + y, 1 /* EndOfLinePreference.LF */ ); } - return n && b.length > 2 * 500 && (b = b.substring(0, 500) + "…" + b.substring(b.length - 500, b.length)), new Jn(h + b + f, h.length, h.length + b.length, t, d.endLineNumber - d.startLineNumber); + return n && Z.length > 2 * 500 && (Z = Z.substring(0, 500) + "…" + Z.substring(Z.length - 500, Z.length)), new Qn(h + Z + g, h.length, h.length + Z.length, t, a.endLineNumber - a.startLineNumber); } } -var aoe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var ele = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, KF = function(s, e) { +}, WF = function(s, e) { return function(t, i) { e(t, i, s); }; -}, vA; +}, PV; (function(s) { s.Tap = "-monaco-textarea-synthetic-tap"; -})(vA || (vA = {})); -const dv = { +})(PV || (PV = {})); +const ww = { forceCopyWithSyntaxHighlighting: !1 -}, aZ = class aZ { +}, V2 = class V2 { constructor() { this._lastState = null; } @@ -23203,9 +23203,9 @@ const dv = { return this._lastState && this._lastState.lastCopiedValue === e ? this._lastState.data : (this._lastState = null, null); } }; -aZ.INSTANCE = new aZ(); -let Qw = aZ; -class coe { +V2.INSTANCE = new V2(); +let cW = V2; +class tle { constructor() { this._lastTypeTextLength = 0; } @@ -23220,90 +23220,90 @@ class coe { return this._lastTypeTextLength = e.length, t; } } -let hv = class extends R { +let Tw = class extends J { get textAreaState() { return this._textAreaState; } - constructor(e, t, i, n, o, r) { - super(), this._host = e, this._textArea = t, this._OS = i, this._browser = n, this._accessibilityService = o, this._logService = r, this._onFocus = this._register(new k()), this.onFocus = this._onFocus.event, this._onBlur = this._register(new k()), this.onBlur = this._onBlur.event, this._onKeyDown = this._register(new k()), this.onKeyDown = this._onKeyDown.event, this._onKeyUp = this._register(new k()), this.onKeyUp = this._onKeyUp.event, this._onCut = this._register(new k()), this.onCut = this._onCut.event, this._onPaste = this._register(new k()), this.onPaste = this._onPaste.event, this._onType = this._register(new k()), this.onType = this._onType.event, this._onCompositionStart = this._register(new k()), this.onCompositionStart = this._onCompositionStart.event, this._onCompositionUpdate = this._register(new k()), this.onCompositionUpdate = this._onCompositionUpdate.event, this._onCompositionEnd = this._register(new k()), this.onCompositionEnd = this._onCompositionEnd.event, this._onSelectionChangeRequest = this._register(new k()), this.onSelectionChangeRequest = this._onSelectionChangeRequest.event, this._asyncFocusGainWriteScreenReaderContent = this._register(new fn()), this._asyncTriggerCut = this._register(new Zt(() => this._onCut.fire(), 0)), this._textAreaState = Jn.EMPTY, this._selectionChangeListener = null, this._accessibilityService.isScreenReaderOptimized() && this.writeNativeTextAreaContent("ctor"), this._register(se.runAndSubscribe(this._accessibilityService.onDidChangeScreenReaderOptimized, () => { - this._accessibilityService.isScreenReaderOptimized() && !this._asyncFocusGainWriteScreenReaderContent.value ? this._asyncFocusGainWriteScreenReaderContent.value = this._register(new Zt(() => this.writeNativeTextAreaContent("asyncFocusGain"), 0)) : this._asyncFocusGainWriteScreenReaderContent.clear(); + constructor(e, t, i, n, o, l) { + super(), this._host = e, this._textArea = t, this._OS = i, this._browser = n, this._accessibilityService = o, this._logService = l, this._onFocus = this._register(new k()), this.onFocus = this._onFocus.event, this._onBlur = this._register(new k()), this.onBlur = this._onBlur.event, this._onKeyDown = this._register(new k()), this.onKeyDown = this._onKeyDown.event, this._onKeyUp = this._register(new k()), this.onKeyUp = this._onKeyUp.event, this._onCut = this._register(new k()), this.onCut = this._onCut.event, this._onPaste = this._register(new k()), this.onPaste = this._onPaste.event, this._onType = this._register(new k()), this.onType = this._onType.event, this._onCompositionStart = this._register(new k()), this.onCompositionStart = this._onCompositionStart.event, this._onCompositionUpdate = this._register(new k()), this.onCompositionUpdate = this._onCompositionUpdate.event, this._onCompositionEnd = this._register(new k()), this.onCompositionEnd = this._onCompositionEnd.event, this._onSelectionChangeRequest = this._register(new k()), this.onSelectionChangeRequest = this._onSelectionChangeRequest.event, this._asyncFocusGainWriteScreenReaderContent = this._register(new Zn()), this._asyncTriggerCut = this._register(new St(() => this._onCut.fire(), 0)), this._textAreaState = Qn.EMPTY, this._selectionChangeListener = null, this._accessibilityService.isScreenReaderOptimized() && this.writeNativeTextAreaContent("ctor"), this._register(se.runAndSubscribe(this._accessibilityService.onDidChangeScreenReaderOptimized, () => { + this._accessibilityService.isScreenReaderOptimized() && !this._asyncFocusGainWriteScreenReaderContent.value ? this._asyncFocusGainWriteScreenReaderContent.value = this._register(new St(() => this.writeNativeTextAreaContent("asyncFocusGain"), 0)) : this._asyncFocusGainWriteScreenReaderContent.clear(); })), this._hasFocus = !1, this._currentComposition = null; - let l = null; - this._register(this._textArea.onKeyDown((a) => { - const c = new Vt(a); - (c.keyCode === 114 || this._currentComposition && c.keyCode === 1) && c.stopPropagation(), c.equals( + let r = null; + this._register(this._textArea.onKeyDown((c) => { + const d = new Yt(c); + (d.keyCode === 114 || this._currentComposition && d.keyCode === 1) && d.stopPropagation(), d.equals( 9 /* KeyCode.Escape */ - ) && c.preventDefault(), l = c, this._onKeyDown.fire(c); - })), this._register(this._textArea.onKeyUp((a) => { - const c = new Vt(a); - this._onKeyUp.fire(c); - })), this._register(this._textArea.onCompositionStart((a) => { - const c = new coe(); + ) && d.preventDefault(), r = d, this._onKeyDown.fire(d); + })), this._register(this._textArea.onKeyUp((c) => { + const d = new Yt(c); + this._onKeyUp.fire(d); + })), this._register(this._textArea.onCompositionStart((c) => { + const d = new tle(); if (this._currentComposition) { - this._currentComposition = c; + this._currentComposition = d; return; } - if (this._currentComposition = c, this._OS === 2 && l && l.equals( + if (this._currentComposition = d, this._OS === 2 && r && r.equals( 114 /* KeyCode.KEY_IN_COMPOSITION */ - ) && this._textAreaState.selectionStart === this._textAreaState.selectionEnd && this._textAreaState.selectionStart > 0 && this._textAreaState.value.substr(this._textAreaState.selectionStart - 1, 1) === a.data && (l.code === "ArrowRight" || l.code === "ArrowLeft")) { - c.handleCompositionUpdate("x"), this._onCompositionStart.fire({ data: a.data }); + ) && this._textAreaState.selectionStart === this._textAreaState.selectionEnd && this._textAreaState.selectionStart > 0 && this._textAreaState.value.substr(this._textAreaState.selectionStart - 1, 1) === c.data && (r.code === "ArrowRight" || r.code === "ArrowLeft")) { + d.handleCompositionUpdate("x"), this._onCompositionStart.fire({ data: c.data }); return; } if (this._browser.isAndroid) { - this._onCompositionStart.fire({ data: a.data }); + this._onCompositionStart.fire({ data: c.data }); return; } - this._onCompositionStart.fire({ data: a.data }); - })), this._register(this._textArea.onCompositionUpdate((a) => { - const c = this._currentComposition; - if (!c) + this._onCompositionStart.fire({ data: c.data }); + })), this._register(this._textArea.onCompositionUpdate((c) => { + const d = this._currentComposition; + if (!d) return; if (this._browser.isAndroid) { - const h = Jn.readFromTextArea(this._textArea, this._textAreaState), u = Jn.deduceAndroidCompositionInput(this._textAreaState, h); - this._textAreaState = h, this._onType.fire(u), this._onCompositionUpdate.fire(a); + const h = Qn.readFromTextArea(this._textArea, this._textAreaState), u = Qn.deduceAndroidCompositionInput(this._textAreaState, h); + this._textAreaState = h, this._onType.fire(u), this._onCompositionUpdate.fire(c); return; } - const d = c.handleCompositionUpdate(a.data); - this._textAreaState = Jn.readFromTextArea(this._textArea, this._textAreaState), this._onType.fire(d), this._onCompositionUpdate.fire(a); - })), this._register(this._textArea.onCompositionEnd((a) => { - const c = this._currentComposition; - if (!c) + const a = d.handleCompositionUpdate(c.data); + this._textAreaState = Qn.readFromTextArea(this._textArea, this._textAreaState), this._onType.fire(a), this._onCompositionUpdate.fire(c); + })), this._register(this._textArea.onCompositionEnd((c) => { + const d = this._currentComposition; + if (!d) return; if (this._currentComposition = null, this._browser.isAndroid) { - const h = Jn.readFromTextArea(this._textArea, this._textAreaState), u = Jn.deduceAndroidCompositionInput(this._textAreaState, h); + const h = Qn.readFromTextArea(this._textArea, this._textAreaState), u = Qn.deduceAndroidCompositionInput(this._textAreaState, h); this._textAreaState = h, this._onType.fire(u), this._onCompositionEnd.fire(); return; } - const d = c.handleCompositionUpdate(a.data); - this._textAreaState = Jn.readFromTextArea(this._textArea, this._textAreaState), this._onType.fire(d), this._onCompositionEnd.fire(); - })), this._register(this._textArea.onInput((a) => { + const a = d.handleCompositionUpdate(c.data); + this._textAreaState = Qn.readFromTextArea(this._textArea, this._textAreaState), this._onType.fire(a), this._onCompositionEnd.fire(); + })), this._register(this._textArea.onInput((c) => { if (this._textArea.setIgnoreSelectionChangeTime("received input event"), this._currentComposition) return; - const c = Jn.readFromTextArea(this._textArea, this._textAreaState), d = Jn.deduceInput( + const d = Qn.readFromTextArea(this._textArea, this._textAreaState), a = Qn.deduceInput( this._textAreaState, - c, + d, /*couldBeEmojiInput*/ this._OS === 2 /* OperatingSystem.Macintosh */ ); - d.replacePrevCharCnt === 0 && d.text.length === 1 && (Hi(d.text.charCodeAt(0)) || d.text.charCodeAt(0) === 127) || (this._textAreaState = c, (d.text !== "" || d.replacePrevCharCnt !== 0 || d.replaceNextCharCnt !== 0 || d.positionDelta !== 0) && this._onType.fire(d)); - })), this._register(this._textArea.onCut((a) => { - this._textArea.setIgnoreSelectionChangeTime("received cut event"), this._ensureClipboardGetsEditorSelection(a), this._asyncTriggerCut.schedule(); - })), this._register(this._textArea.onCopy((a) => { - this._ensureClipboardGetsEditorSelection(a); - })), this._register(this._textArea.onPaste((a) => { - if (this._textArea.setIgnoreSelectionChangeTime("received paste event"), a.preventDefault(), !a.clipboardData) + a.replacePrevCharCnt === 0 && a.text.length === 1 && (Bi(a.text.charCodeAt(0)) || a.text.charCodeAt(0) === 127) || (this._textAreaState = d, (a.text !== "" || a.replacePrevCharCnt !== 0 || a.replaceNextCharCnt !== 0 || a.positionDelta !== 0) && this._onType.fire(a)); + })), this._register(this._textArea.onCut((c) => { + this._textArea.setIgnoreSelectionChangeTime("received cut event"), this._ensureClipboardGetsEditorSelection(c), this._asyncTriggerCut.schedule(); + })), this._register(this._textArea.onCopy((c) => { + this._ensureClipboardGetsEditorSelection(c); + })), this._register(this._textArea.onPaste((c) => { + if (this._textArea.setIgnoreSelectionChangeTime("received paste event"), c.preventDefault(), !c.clipboardData) return; - let [c, d] = uv.getTextData(a.clipboardData); - c && (d = d || Qw.INSTANCE.get(c), this._onPaste.fire({ - text: c, - metadata: d + let [d, a] = Mw.getTextData(c.clipboardData); + d && (a = a || cW.INSTANCE.get(d), this._onPaste.fire({ + text: d, + metadata: a })); })), this._register(this._textArea.onFocus(() => { - const a = this._hasFocus; - this._setHasFocus(!0), this._accessibilityService.isScreenReaderOptimized() && this._browser.isSafari && !a && this._hasFocus && (this._asyncFocusGainWriteScreenReaderContent.value || (this._asyncFocusGainWriteScreenReaderContent.value = new Zt(() => this.writeNativeTextAreaContent("asyncFocusGain"), 0)), this._asyncFocusGainWriteScreenReaderContent.value.schedule()); + const c = this._hasFocus; + this._setHasFocus(!0), this._accessibilityService.isScreenReaderOptimized() && this._browser.isSafari && !c && this._hasFocus && (this._asyncFocusGainWriteScreenReaderContent.value || (this._asyncFocusGainWriteScreenReaderContent.value = new St(() => this.writeNativeTextAreaContent("asyncFocusGain"), 0)), this._asyncFocusGainWriteScreenReaderContent.value.schedule()); })), this._register(this._textArea.onBlur(() => { this._currentComposition && (this._currentComposition = null, this.writeNativeTextAreaContent("blurWithoutCompositionEnd"), this._onCompositionEnd.fire()), this._setHasFocus(!1); })), this._register(this._textArea.onSyntheticTap(() => { @@ -23313,7 +23313,7 @@ let hv = class extends R { _installSelectionChangeListener() { let e = 0; return z(this._textArea.ownerDocument, "selectionchange", (t) => { - if (Fd.onSelectionChange(), !this._hasFocus || this._currentComposition || !this._browser.isChrome) + if (Ka.onSelectionChange(), !this._hasFocus || this._currentComposition || !this._browser.isChrome) return; const i = Date.now(), n = i - e; if (e = i, n < 5) @@ -23321,14 +23321,14 @@ let hv = class extends R { const o = i - this._textArea.getIgnoreSelectionChangeTime(); if (this._textArea.resetSelectionChangeTime(), o < 100 || !this._textAreaState.selection) return; - const r = this._textArea.getValue(); - if (this._textAreaState.value !== r) + const l = this._textArea.getValue(); + if (this._textAreaState.value !== l) return; - const l = this._textArea.getSelectionStart(), a = this._textArea.getSelectionEnd(); - if (this._textAreaState.selectionStart === l && this._textAreaState.selectionEnd === a) + const r = this._textArea.getSelectionStart(), c = this._textArea.getSelectionEnd(); + if (this._textAreaState.selectionStart === r && this._textAreaState.selectionEnd === c) return; - const c = this._textAreaState.deduceEditorPosition(l), d = this._host.deduceModelPosition(c[0], c[1], c[2]), h = this._textAreaState.deduceEditorPosition(a), u = this._host.deduceModelPosition(h[0], h[1], h[2]), g = new fe(d.lineNumber, d.column, u.lineNumber, u.column); - this._onSelectionChangeRequest.fire(g); + const d = this._textAreaState.deduceEditorPosition(r), a = this._host.deduceModelPosition(d[0], d[1], d[2]), h = this._textAreaState.deduceEditorPosition(c), u = this._host.deduceModelPosition(h[0], h[1], h[2]), m = new ge(a.lineNumber, a.column, u.lineNumber, u.column); + this._onSelectionChangeRequest.fire(m); }); } dispose() { @@ -23359,22 +23359,22 @@ let hv = class extends R { multicursorText: t.multicursorText, mode: t.mode }; - Qw.INSTANCE.set( + cW.INSTANCE.set( // When writing "LINE\r\n" to the clipboard and then pasting, // Firefox pastes "LINE\n", so let's work around this quirk this._browser.isFirefox ? t.text.replace(/\r\n/g, ` `) : t.text, i - ), e.preventDefault(), e.clipboardData && uv.setTextData(e.clipboardData, t.text, t.html, i); + ), e.preventDefault(), e.clipboardData && Mw.setTextData(e.clipboardData, t.text, t.html, i); } }; -hv = aoe([ - KF(4, yo), - KF(5, Xn) -], hv); -const uv = { +Tw = ele([ + WF(4, Wo), + WF(5, Fn) +], Tw); +const Mw = { getTextData(s) { - const e = s.getData(bi.text); + const e = s.getData(fi.text); let t = null; const i = s.getData("vscode-editor-data"); if (typeof i == "string") @@ -23386,19 +23386,19 @@ const uv = { `), null] : [e, t]; }, setTextData(s, e, t, i) { - s.setData(bi.text, e), typeof t == "string" && s.setData("text/html", t), s.setData("vscode-editor-data", JSON.stringify(i)); + s.setData(fi.text, e), typeof t == "string" && s.setData("text/html", t), s.setData("vscode-editor-data", JSON.stringify(i)); } }; -class doe extends R { +class ile extends J { get ownerDocument() { return this._actual.ownerDocument; } constructor(e) { - super(), this._actual = e, this.onKeyDown = this._register(new et(this._actual, "keydown")).event, this.onKeyUp = this._register(new et(this._actual, "keyup")).event, this.onCompositionStart = this._register(new et(this._actual, "compositionstart")).event, this.onCompositionUpdate = this._register(new et(this._actual, "compositionupdate")).event, this.onCompositionEnd = this._register(new et(this._actual, "compositionend")).event, this.onBeforeInput = this._register(new et(this._actual, "beforeinput")).event, this.onInput = this._register(new et(this._actual, "input")).event, this.onCut = this._register(new et(this._actual, "cut")).event, this.onCopy = this._register(new et(this._actual, "copy")).event, this.onPaste = this._register(new et(this._actual, "paste")).event, this.onFocus = this._register(new et(this._actual, "focus")).event, this.onBlur = this._register(new et(this._actual, "blur")).event, this._onSyntheticTap = this._register(new k()), this.onSyntheticTap = this._onSyntheticTap.event, this._ignoreSelectionChangeTime = 0, this._register(this.onKeyDown(() => Fd.onKeyDown())), this._register(this.onBeforeInput(() => Fd.onBeforeInput())), this._register(this.onInput(() => Fd.onInput())), this._register(this.onKeyUp(() => Fd.onKeyUp())), this._register(z(this._actual, vA.Tap, () => this._onSyntheticTap.fire())); + super(), this._actual = e, this.onKeyDown = this._register(new et(this._actual, "keydown")).event, this.onKeyUp = this._register(new et(this._actual, "keyup")).event, this.onCompositionStart = this._register(new et(this._actual, "compositionstart")).event, this.onCompositionUpdate = this._register(new et(this._actual, "compositionupdate")).event, this.onCompositionEnd = this._register(new et(this._actual, "compositionend")).event, this.onBeforeInput = this._register(new et(this._actual, "beforeinput")).event, this.onInput = this._register(new et(this._actual, "input")).event, this.onCut = this._register(new et(this._actual, "cut")).event, this.onCopy = this._register(new et(this._actual, "copy")).event, this.onPaste = this._register(new et(this._actual, "paste")).event, this.onFocus = this._register(new et(this._actual, "focus")).event, this.onBlur = this._register(new et(this._actual, "blur")).event, this._onSyntheticTap = this._register(new k()), this.onSyntheticTap = this._onSyntheticTap.event, this._ignoreSelectionChangeTime = 0, this._register(this.onKeyDown(() => Ka.onKeyDown())), this._register(this.onBeforeInput(() => Ka.onBeforeInput())), this._register(this.onInput(() => Ka.onInput())), this._register(this.onKeyUp(() => Ka.onKeyUp())), this._register(z(this._actual, PV.Tap, () => this._onSyntheticTap.fire())); } hasFocus() { - const e = hm(this._actual); - return e ? e.activeElement === this._actual : this._actual.isConnected ? _n() === this._actual : !1; + const e = gb(this._actual); + return e ? e.activeElement === this._actual : this._actual.isConnected ? Cn() === this._actual : !1; } setIgnoreSelectionChangeTime(e) { this._ignoreSelectionChangeTime = Date.now(); @@ -23425,35 +23425,35 @@ class doe extends R { setSelectionRange(e, t, i) { const n = this._actual; let o = null; - const r = hm(n); - r ? o = r.activeElement : o = _n(); - const l = xe(o), a = o === n, c = n.selectionStart, d = n.selectionEnd; - if (a && c === t && d === i) { - pr && l.parent !== l && n.focus(); + const l = gb(n); + l ? o = l.activeElement : o = Cn(); + const r = Le(o), c = o === n, d = n.selectionStart, a = n.selectionEnd; + if (c && d === t && a === i) { + fl && r.parent !== r && n.focus(); return; } - if (a) { - this.setIgnoreSelectionChangeTime("setSelectionRange"), n.setSelectionRange(t, i), pr && l.parent !== l && n.focus(); + if (c) { + this.setIgnoreSelectionChangeTime("setSelectionRange"), n.setSelectionRange(t, i), fl && r.parent !== r && n.focus(); return; } try { - const h = s$(n); - this.setIgnoreSelectionChangeTime("setSelectionRange"), n.focus(), n.setSelectionRange(t, i), o$(n, h); + const h = O$(n); + this.setIgnoreSelectionChangeTime("setSelectionRange"), n.focus(), n.setSelectionRange(t, i), j$(n, h); } catch { } } } -class hoe extends JE { +class nle extends fJ { constructor(e, t, i) { - super(e, t, i), this._register(Rn.addTarget(this.viewHelper.linesContentDomNode)), this._register(z(this.viewHelper.linesContentDomNode, Rt.Tap, (o) => this.onTap(o))), this._register(z(this.viewHelper.linesContentDomNode, Rt.Change, (o) => this.onChange(o))), this._register(z(this.viewHelper.linesContentDomNode, Rt.Contextmenu, (o) => this._onContextMenu(new Vh(o, !1, this.viewHelper.viewDomNode), !1))), this._lastPointerType = "mouse", this._register(z(this.viewHelper.linesContentDomNode, "pointerdown", (o) => { - const r = o.pointerType; - if (r === "mouse") { + super(e, t, i), this._register(En.addTarget(this.viewHelper.linesContentDomNode)), this._register(z(this.viewHelper.linesContentDomNode, Jt.Tap, (o) => this.onTap(o))), this._register(z(this.viewHelper.linesContentDomNode, Jt.Change, (o) => this.onChange(o))), this._register(z(this.viewHelper.linesContentDomNode, Jt.Contextmenu, (o) => this._onContextMenu(new Hh(o, !1, this.viewHelper.viewDomNode), !1))), this._lastPointerType = "mouse", this._register(z(this.viewHelper.linesContentDomNode, "pointerdown", (o) => { + const l = o.pointerType; + if (l === "mouse") { this._lastPointerType = "mouse"; return; - } else r === "touch" ? this._lastPointerType = "touch" : this._lastPointerType = "pen"; + } else l === "touch" ? this._lastPointerType = "touch" : this._lastPointerType = "pen"; })); - const n = new yse(this.viewHelper.viewDomNode); - this._register(n.onPointerMove(this.viewHelper.viewDomNode, (o) => this._onMouseMove(o))), this._register(n.onPointerUp(this.viewHelper.viewDomNode, (o) => this._onMouseUp(o))), this._register(n.onPointerLeave(this.viewHelper.viewDomNode, (o) => this._onMouseLeave(o))), this._register(n.onPointerDown(this.viewHelper.viewDomNode, (o, r) => this._onMouseDown(o, r))); + const n = new aoe(this.viewHelper.viewDomNode); + this._register(n.onPointerMove(this.viewHelper.viewDomNode, (o) => this._onMouseMove(o))), this._register(n.onPointerUp(this.viewHelper.viewDomNode, (o) => this._onMouseUp(o))), this._register(n.onPointerLeave(this.viewHelper.viewDomNode, (o) => this._onMouseLeave(o))), this._register(n.onPointerDown(this.viewHelper.viewDomNode, (o, l) => this._onMouseDown(o, l))); } onTap(e) { !e.initialTarget || !this.viewHelper.linesContentDomNode.contains(e.initialTarget) || (e.preventDefault(), this.viewHelper.focusTextArea(), this._dispatchGesture( @@ -23470,7 +23470,7 @@ class hoe extends JE { ); } _dispatchGesture(e, t) { - const i = this._createMouseTarget(new Vh(e, !1, this.viewHelper.viewDomNode), !1); + const i = this._createMouseTarget(new Hh(e, !1, this.viewHelper.viewDomNode), !1); i.position && this.viewController.dispatchMouse({ position: i.position, mouseColumn: i.position.column, @@ -23491,16 +23491,16 @@ class hoe extends JE { e.browserEvent.pointerType !== "touch" && super._onMouseDown(e, t); } } -class uoe extends JE { +class sle extends fJ { constructor(e, t, i) { - super(e, t, i), this._register(Rn.addTarget(this.viewHelper.linesContentDomNode)), this._register(z(this.viewHelper.linesContentDomNode, Rt.Tap, (n) => this.onTap(n))), this._register(z(this.viewHelper.linesContentDomNode, Rt.Change, (n) => this.onChange(n))), this._register(z(this.viewHelper.linesContentDomNode, Rt.Contextmenu, (n) => this._onContextMenu(new Vh(n, !1, this.viewHelper.viewDomNode), !1))); + super(e, t, i), this._register(En.addTarget(this.viewHelper.linesContentDomNode)), this._register(z(this.viewHelper.linesContentDomNode, Jt.Tap, (n) => this.onTap(n))), this._register(z(this.viewHelper.linesContentDomNode, Jt.Change, (n) => this.onChange(n))), this._register(z(this.viewHelper.linesContentDomNode, Jt.Contextmenu, (n) => this._onContextMenu(new Hh(n, !1, this.viewHelper.viewDomNode), !1))); } onTap(e) { e.preventDefault(), this.viewHelper.focusTextArea(); - const t = this._createMouseTarget(new Vh(e, !1, this.viewHelper.viewDomNode), !1); + const t = this._createMouseTarget(new Hh(e, !1, this.viewHelper.viewDomNode), !1); if (t.position) { const i = document.createEvent("CustomEvent"); - i.initEvent(vA.Tap, !1, !0), this.viewHelper.dispatchTextAreaEvent(i), this.viewController.moveTo( + i.initEvent(PV.Tap, !1, !0), this.viewHelper.dispatchTextAreaEvent(i), this.viewController.moveTo( t.position, 1 /* NavigationCommandRevealType.Minimal */ @@ -23511,41 +23511,41 @@ class uoe extends JE { this._context.viewModel.viewLayout.deltaScrollNow(-e.translationX, -e.translationY); } } -class goe extends R { +class ole extends J { constructor(e, t, i) { - super(), (Wa || t6 && pH) && HR.pointerEvents ? this.handler = this._register(new hoe(e, t, i)) : vt.TouchEvent ? this.handler = this._register(new uoe(e, t, i)) : this.handler = this._register(new JE(e, t, i)); + super(), (Yc || B6 && jP) && Zv.pointerEvents ? this.handler = this._register(new nle(e, t, i)) : wt.TouchEvent ? this.handler = this._register(new sle(e, t, i)) : this.handler = this._register(new fJ(e, t, i)); } getTargetAtClientPoint(e, t) { return this.handler.getTargetAtClientPoint(e, t); } } -class Xm extends yC { +class Kb extends wG { } -const Pi = $e("themeService"); -function fi(s) { +const Ki = $e("themeService"); +function Zi(s) { return { id: s }; } -function gv(s) { +function Yw(s) { switch (s) { - case cr.DARK: + case hl.DARK: return "vs-dark"; - case cr.HIGH_CONTRAST_DARK: + case hl.HIGH_CONTRAST_DARK: return "hc-black"; - case cr.HIGH_CONTRAST_LIGHT: + case hl.HIGH_CONTRAST_LIGHT: return "hc-light"; default: return "vs"; } } -const SU = { +const nQ = { ThemingContribution: "base.contributions.theming" }; -class moe { +class lle { constructor() { this.themingParticipants = [], this.themingParticipants = [], this.onThemingParticipantAddedEmitter = new k(); } onColorThemeChange(e) { - return this.themingParticipants.push(e), this.onThemingParticipantAddedEmitter.fire(e), Ce(() => { + return this.themingParticipants.push(e), this.onThemingParticipantAddedEmitter.fire(e), We(() => { const t = this.themingParticipants.indexOf(e); this.themingParticipants.splice(t, 1); }); @@ -23554,12 +23554,12 @@ class moe { return this.themingParticipants; } } -const LU = new moe(); -Di.add(SU.ThemingContribution, LU); -function Lr(s) { - return LU.onColorThemeChange(s); +const sQ = new lle(); +ki.add(nQ.ThemingContribution, sQ); +function Il(s) { + return sQ.onColorThemeChange(s); } -class poe extends R { +class rle extends J { constructor(e) { super(), this.themeService = e, this.theme = e.getColorTheme(), this._register(this.themeService.onDidColorThemeChange((t) => this.onThemeChange(t))); } @@ -23569,35 +23569,35 @@ class poe extends R { updateStyles() { } } -const AU = N("editor.lineHighlightBackground", null, p("lineHighlight", "Background color for the highlight of line at the cursor position.")), QF = N("editor.lineHighlightBorder", { dark: "#282828", light: "#eeeeee", hcDark: "#f38518", hcLight: rt }, p("lineHighlightBorderBox", "Background color for the border around the line at the cursor position.")); -N("editor.rangeHighlightBackground", { dark: "#ffffff0b", light: "#fdff0033", hcDark: null, hcLight: null }, p("rangeHighlight", "Background color of highlighted ranges, like by quick open and find features. The color must not be opaque so as not to hide underlying decorations."), !0); -N("editor.rangeHighlightBorder", { dark: null, light: null, hcDark: Ut, hcLight: Ut }, p("rangeHighlightBorder", "Background color of the border around highlighted ranges.")); -N("editor.symbolHighlightBackground", { dark: xc, light: xc, hcDark: null, hcLight: null }, p("symbolHighlight", "Background color of highlighted symbol, like for go to definition or go next/previous symbol. The color must not be opaque so as not to hide underlying decorations."), !0); -N("editor.symbolHighlightBorder", { dark: null, light: null, hcDark: Ut, hcLight: Ut }, p("symbolHighlightBorder", "Background color of the border around highlighted symbols.")); -const gI = N("editorCursor.foreground", { dark: "#AEAFAD", light: K.black, hcDark: K.white, hcLight: "#0F4A85" }, p("caret", "Color of the editor cursor.")), UE = N("editorCursor.background", null, p("editorCursorBackground", "The background color of the editor cursor. Allows customizing the color of a character overlapped by a block cursor.")), xU = N("editorMultiCursor.primary.foreground", gI, p("editorMultiCursorPrimaryForeground", "Color of the primary editor cursor when multiple cursors are present.")), foe = N("editorMultiCursor.primary.background", UE, p("editorMultiCursorPrimaryBackground", "The background color of the primary editor cursor when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.")), MU = N("editorMultiCursor.secondary.foreground", gI, p("editorMultiCursorSecondaryForeground", "Color of secondary editor cursors when multiple cursors are present.")), boe = N("editorMultiCursor.secondary.background", UE, p("editorMultiCursorSecondaryBackground", "The background color of secondary editor cursors when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.")), KE = N("editorWhitespace.foreground", { dark: "#e3e4e229", light: "#33333333", hcDark: "#e3e4e229", hcLight: "#CCCCCC" }, p("editorWhitespaces", "Color of whitespace characters in the editor.")), yoe = N("editorLineNumber.foreground", { dark: "#858585", light: "#237893", hcDark: K.white, hcLight: "#292929" }, p("editorLineNumbers", "Color of editor line numbers.")), woe = N("editorIndentGuide.background", KE, p("editorIndentGuides", "Color of the editor indentation guides."), !1, p("deprecatedEditorIndentGuides", "'editorIndentGuide.background' is deprecated. Use 'editorIndentGuide.background1' instead.")), Coe = N("editorIndentGuide.activeBackground", KE, p("editorActiveIndentGuide", "Color of the active editor indentation guides."), !1, p("deprecatedEditorActiveIndentGuide", "'editorIndentGuide.activeBackground' is deprecated. Use 'editorIndentGuide.activeBackground1' instead.")), SC = N("editorIndentGuide.background1", woe, p("editorIndentGuides1", "Color of the editor indentation guides (1).")), Soe = N("editorIndentGuide.background2", "#00000000", p("editorIndentGuides2", "Color of the editor indentation guides (2).")), Loe = N("editorIndentGuide.background3", "#00000000", p("editorIndentGuides3", "Color of the editor indentation guides (3).")), Aoe = N("editorIndentGuide.background4", "#00000000", p("editorIndentGuides4", "Color of the editor indentation guides (4).")), xoe = N("editorIndentGuide.background5", "#00000000", p("editorIndentGuides5", "Color of the editor indentation guides (5).")), Moe = N("editorIndentGuide.background6", "#00000000", p("editorIndentGuides6", "Color of the editor indentation guides (6).")), LC = N("editorIndentGuide.activeBackground1", Coe, p("editorActiveIndentGuide1", "Color of the active editor indentation guides (1).")), Zoe = N("editorIndentGuide.activeBackground2", "#00000000", p("editorActiveIndentGuide2", "Color of the active editor indentation guides (2).")), _oe = N("editorIndentGuide.activeBackground3", "#00000000", p("editorActiveIndentGuide3", "Color of the active editor indentation guides (3).")), Ioe = N("editorIndentGuide.activeBackground4", "#00000000", p("editorActiveIndentGuide4", "Color of the active editor indentation guides (4).")), Noe = N("editorIndentGuide.activeBackground5", "#00000000", p("editorActiveIndentGuide5", "Color of the active editor indentation guides (5).")), Woe = N("editorIndentGuide.activeBackground6", "#00000000", p("editorActiveIndentGuide6", "Color of the active editor indentation guides (6).")), voe = N("editorActiveLineNumber.foreground", { dark: "#c6c6c6", light: "#0B216F", hcDark: Ut, hcLight: Ut }, p("editorActiveLineNumber", "Color of editor active line number"), !1, p("deprecatedEditorActiveLineNumber", "Id is deprecated. Use 'editorLineNumber.activeForeground' instead.")); -N("editorLineNumber.activeForeground", voe, p("editorActiveLineNumber", "Color of editor active line number")); -const Toe = N("editorLineNumber.dimmedForeground", null, p("editorDimmedLineNumber", "Color of the final editor line when editor.renderFinalNewline is set to dimmed.")); -N("editorRuler.foreground", { dark: "#5A5A5A", light: K.lightgrey, hcDark: K.white, hcLight: "#292929" }, p("editorRuler", "Color of the editor rulers.")); -N("editorCodeLens.foreground", { dark: "#999999", light: "#919191", hcDark: "#999999", hcLight: "#292929" }, p("editorCodeLensForeground", "Foreground color of editor CodeLens")); -N("editorBracketMatch.background", { dark: "#0064001a", light: "#0064001a", hcDark: "#0064001a", hcLight: "#0000" }, p("editorBracketMatchBackground", "Background color behind matching brackets")); -N("editorBracketMatch.border", { dark: "#888", light: "#B9B9B9", hcDark: rt, hcLight: rt }, p("editorBracketMatchBorder", "Color for matching brackets boxes")); -const Doe = N("editorOverviewRuler.border", { dark: "#7f7f7f4d", light: "#7f7f7f4d", hcDark: "#7f7f7f4d", hcLight: "#666666" }, p("editorOverviewRulerBorder", "Color of the overview ruler border.")), Voe = N("editorOverviewRuler.background", null, p("editorOverviewRulerBackground", "Background color of the editor overview ruler.")); -N("editorGutter.background", Hr, p("editorGutter", "Background color of the editor gutter. The gutter contains the glyph margins and the line numbers.")); -N("editorUnnecessaryCode.border", { dark: null, light: null, hcDark: K.fromHex("#fff").transparent(0.8), hcLight: rt }, p("unnecessaryCodeBorder", "Border color of unnecessary (unused) source code in the editor.")); -const koe = N("editorUnnecessaryCode.opacity", { dark: K.fromHex("#000a"), light: K.fromHex("#0007"), hcDark: null, hcLight: null }, p("unnecessaryCodeOpacity", `Opacity of unnecessary (unused) source code in the editor. For example, "#000000c0" will render the code with 75% opacity. For high contrast themes, use the 'editorUnnecessaryCode.border' theme color to underline unnecessary code instead of fading it out.`)); -N("editorGhostText.border", { dark: null, light: null, hcDark: K.fromHex("#fff").transparent(0.8), hcLight: K.fromHex("#292929").transparent(0.8) }, p("editorGhostTextBorder", "Border color of ghost text in the editor.")); -const Goe = N("editorGhostText.foreground", { dark: K.fromHex("#ffffff56"), light: K.fromHex("#0007"), hcDark: null, hcLight: null }, p("editorGhostTextForeground", "Foreground color of the ghost text in the editor.")); -N("editorGhostText.background", null, p("editorGhostTextBackground", "Background color of the ghost text in the editor.")); -const Roe = new K(new lt(0, 122, 204, 0.6)), Eoe = N("editorOverviewRuler.rangeHighlightForeground", Roe, p("overviewRulerRangeHighlight", "Overview ruler marker color for range highlights. The color must not be opaque so as not to hide underlying decorations."), !0), Xoe = N("editorOverviewRuler.errorForeground", { dark: new K(new lt(255, 18, 18, 0.7)), light: new K(new lt(255, 18, 18, 0.7)), hcDark: new K(new lt(255, 50, 50, 1)), hcLight: "#B5200D" }, p("overviewRuleError", "Overview ruler marker color for errors.")), Foe = N("editorOverviewRuler.warningForeground", { dark: Jc, light: Jc, hcDark: Bw, hcLight: Bw }, p("overviewRuleWarning", "Overview ruler marker color for warnings.")), Yoe = N("editorOverviewRuler.infoForeground", { dark: Da, light: Da, hcDark: Ow, hcLight: Ow }, p("overviewRuleInfo", "Overview ruler marker color for infos.")), ZU = N("editorBracketHighlight.foreground1", { dark: "#FFD700", light: "#0431FAFF", hcDark: "#FFD700", hcLight: "#0431FAFF" }, p("editorBracketHighlightForeground1", "Foreground color of brackets (1). Requires enabling bracket pair colorization.")), _U = N("editorBracketHighlight.foreground2", { dark: "#DA70D6", light: "#319331FF", hcDark: "#DA70D6", hcLight: "#319331FF" }, p("editorBracketHighlightForeground2", "Foreground color of brackets (2). Requires enabling bracket pair colorization.")), IU = N("editorBracketHighlight.foreground3", { dark: "#179FFF", light: "#7B3814FF", hcDark: "#87CEFA", hcLight: "#7B3814FF" }, p("editorBracketHighlightForeground3", "Foreground color of brackets (3). Requires enabling bracket pair colorization.")), NU = N("editorBracketHighlight.foreground4", "#00000000", p("editorBracketHighlightForeground4", "Foreground color of brackets (4). Requires enabling bracket pair colorization.")), WU = N("editorBracketHighlight.foreground5", "#00000000", p("editorBracketHighlightForeground5", "Foreground color of brackets (5). Requires enabling bracket pair colorization.")), vU = N("editorBracketHighlight.foreground6", "#00000000", p("editorBracketHighlightForeground6", "Foreground color of brackets (6). Requires enabling bracket pair colorization.")), zoe = N("editorBracketHighlight.unexpectedBracket.foreground", { dark: new K(new lt(255, 18, 18, 0.8)), light: new K(new lt(255, 18, 18, 0.8)), hcDark: "new Color(new RGBA(255, 50, 50, 1))", hcLight: "#B5200D" }, p("editorBracketHighlightUnexpectedBracketForeground", "Foreground color of unexpected brackets.")), Poe = N("editorBracketPairGuide.background1", "#00000000", p("editorBracketPairGuide.background1", "Background color of inactive bracket pair guides (1). Requires enabling bracket pair guides.")), Boe = N("editorBracketPairGuide.background2", "#00000000", p("editorBracketPairGuide.background2", "Background color of inactive bracket pair guides (2). Requires enabling bracket pair guides.")), Ooe = N("editorBracketPairGuide.background3", "#00000000", p("editorBracketPairGuide.background3", "Background color of inactive bracket pair guides (3). Requires enabling bracket pair guides.")), Hoe = N("editorBracketPairGuide.background4", "#00000000", p("editorBracketPairGuide.background4", "Background color of inactive bracket pair guides (4). Requires enabling bracket pair guides.")), Joe = N("editorBracketPairGuide.background5", "#00000000", p("editorBracketPairGuide.background5", "Background color of inactive bracket pair guides (5). Requires enabling bracket pair guides.")), Uoe = N("editorBracketPairGuide.background6", "#00000000", p("editorBracketPairGuide.background6", "Background color of inactive bracket pair guides (6). Requires enabling bracket pair guides.")), Koe = N("editorBracketPairGuide.activeBackground1", "#00000000", p("editorBracketPairGuide.activeBackground1", "Background color of active bracket pair guides (1). Requires enabling bracket pair guides.")), Qoe = N("editorBracketPairGuide.activeBackground2", "#00000000", p("editorBracketPairGuide.activeBackground2", "Background color of active bracket pair guides (2). Requires enabling bracket pair guides.")), joe = N("editorBracketPairGuide.activeBackground3", "#00000000", p("editorBracketPairGuide.activeBackground3", "Background color of active bracket pair guides (3). Requires enabling bracket pair guides.")), qoe = N("editorBracketPairGuide.activeBackground4", "#00000000", p("editorBracketPairGuide.activeBackground4", "Background color of active bracket pair guides (4). Requires enabling bracket pair guides.")), $oe = N("editorBracketPairGuide.activeBackground5", "#00000000", p("editorBracketPairGuide.activeBackground5", "Background color of active bracket pair guides (5). Requires enabling bracket pair guides.")), ere = N("editorBracketPairGuide.activeBackground6", "#00000000", p("editorBracketPairGuide.activeBackground6", "Background color of active bracket pair guides (6). Requires enabling bracket pair guides.")); -N("editorUnicodeHighlight.border", Jc, p("editorUnicodeHighlight.border", "Border color used to highlight unicode characters.")); -N("editorUnicodeHighlight.background", Eie, p("editorUnicodeHighlight.background", "Background color used to highlight unicode characters.")); -Lr((s, e) => { - const t = s.getColor(Hr), i = s.getColor(AU), n = i && !i.isTransparent() ? i : t; +const oQ = R("editor.lineHighlightBackground", null, p("lineHighlight", "Background color for the highlight of line at the cursor position.")), GF = R("editor.lineHighlightBorder", { dark: "#282828", light: "#eeeeee", hcDark: "#f38518", hcLight: lt }, p("lineHighlightBorderBox", "Background color for the border around the line at the cursor position.")); +R("editor.rangeHighlightBackground", { dark: "#ffffff0b", light: "#fdff0033", hcDark: null, hcLight: null }, p("rangeHighlight", "Background color of highlighted ranges, like by quick open and find features. The color must not be opaque so as not to hide underlying decorations."), !0); +R("editor.rangeHighlightBorder", { dark: null, light: null, hcDark: _t, hcLight: _t }, p("rangeHighlightBorder", "Background color of the border around highlighted ranges.")); +R("editor.symbolHighlightBackground", { dark: Cd, light: Cd, hcDark: null, hcLight: null }, p("symbolHighlight", "Background color of highlighted symbol, like for go to definition or go next/previous symbol. The color must not be opaque so as not to hide underlying decorations."), !0); +R("editor.symbolHighlightBorder", { dark: null, light: null, hcDark: _t, hcLight: _t }, p("symbolHighlightBorder", "Background color of the border around highlighted symbols.")); +const Cx = R("editorCursor.foreground", { dark: "#AEAFAD", light: Q.black, hcDark: Q.white, hcLight: "#0F4A85" }, p("caret", "Color of the editor cursor.")), yJ = R("editorCursor.background", null, p("editorCursorBackground", "The background color of the editor cursor. Allows customizing the color of a character overlapped by a block cursor.")), lQ = R("editorMultiCursor.primary.foreground", Cx, p("editorMultiCursorPrimaryForeground", "Color of the primary editor cursor when multiple cursors are present.")), cle = R("editorMultiCursor.primary.background", yJ, p("editorMultiCursorPrimaryBackground", "The background color of the primary editor cursor when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.")), rQ = R("editorMultiCursor.secondary.foreground", Cx, p("editorMultiCursorSecondaryForeground", "Color of secondary editor cursors when multiple cursors are present.")), dle = R("editorMultiCursor.secondary.background", yJ, p("editorMultiCursorSecondaryBackground", "The background color of secondary editor cursors when multiple cursors are present. Allows customizing the color of a character overlapped by a block cursor.")), WJ = R("editorWhitespace.foreground", { dark: "#e3e4e229", light: "#33333333", hcDark: "#e3e4e229", hcLight: "#CCCCCC" }, p("editorWhitespaces", "Color of whitespace characters in the editor.")), ale = R("editorLineNumber.foreground", { dark: "#858585", light: "#237893", hcDark: Q.white, hcLight: "#292929" }, p("editorLineNumbers", "Color of editor line numbers.")), hle = R("editorIndentGuide.background", WJ, p("editorIndentGuides", "Color of the editor indentation guides."), !1, p("deprecatedEditorIndentGuides", "'editorIndentGuide.background' is deprecated. Use 'editorIndentGuide.background1' instead.")), ule = R("editorIndentGuide.activeBackground", WJ, p("editorActiveIndentGuide", "Color of the active editor indentation guides."), !1, p("deprecatedEditorActiveIndentGuide", "'editorIndentGuide.activeBackground' is deprecated. Use 'editorIndentGuide.activeBackground1' instead.")), YG = R("editorIndentGuide.background1", hle, p("editorIndentGuides1", "Color of the editor indentation guides (1).")), mle = R("editorIndentGuide.background2", "#00000000", p("editorIndentGuides2", "Color of the editor indentation guides (2).")), ble = R("editorIndentGuide.background3", "#00000000", p("editorIndentGuides3", "Color of the editor indentation guides (3).")), ple = R("editorIndentGuide.background4", "#00000000", p("editorIndentGuides4", "Color of the editor indentation guides (4).")), gle = R("editorIndentGuide.background5", "#00000000", p("editorIndentGuides5", "Color of the editor indentation guides (5).")), Zle = R("editorIndentGuide.background6", "#00000000", p("editorIndentGuides6", "Color of the editor indentation guides (6).")), kG = R("editorIndentGuide.activeBackground1", ule, p("editorActiveIndentGuide1", "Color of the active editor indentation guides (1).")), fle = R("editorIndentGuide.activeBackground2", "#00000000", p("editorActiveIndentGuide2", "Color of the active editor indentation guides (2).")), yle = R("editorIndentGuide.activeBackground3", "#00000000", p("editorActiveIndentGuide3", "Color of the active editor indentation guides (3).")), Wle = R("editorIndentGuide.activeBackground4", "#00000000", p("editorActiveIndentGuide4", "Color of the active editor indentation guides (4).")), Gle = R("editorIndentGuide.activeBackground5", "#00000000", p("editorActiveIndentGuide5", "Color of the active editor indentation guides (5).")), Xle = R("editorIndentGuide.activeBackground6", "#00000000", p("editorActiveIndentGuide6", "Color of the active editor indentation guides (6).")), Vle = R("editorActiveLineNumber.foreground", { dark: "#c6c6c6", light: "#0B216F", hcDark: _t, hcLight: _t }, p("editorActiveLineNumber", "Color of editor active line number"), !1, p("deprecatedEditorActiveLineNumber", "Id is deprecated. Use 'editorLineNumber.activeForeground' instead.")); +R("editorLineNumber.activeForeground", Vle, p("editorActiveLineNumber", "Color of editor active line number")); +const Lle = R("editorLineNumber.dimmedForeground", null, p("editorDimmedLineNumber", "Color of the final editor line when editor.renderFinalNewline is set to dimmed.")); +R("editorRuler.foreground", { dark: "#5A5A5A", light: Q.lightgrey, hcDark: Q.white, hcLight: "#292929" }, p("editorRuler", "Color of the editor rulers.")); +R("editorCodeLens.foreground", { dark: "#999999", light: "#919191", hcDark: "#999999", hcLight: "#292929" }, p("editorCodeLensForeground", "Foreground color of editor CodeLens")); +R("editorBracketMatch.background", { dark: "#0064001a", light: "#0064001a", hcDark: "#0064001a", hcLight: "#0000" }, p("editorBracketMatchBackground", "Background color behind matching brackets")); +R("editorBracketMatch.border", { dark: "#888", light: "#B9B9B9", hcDark: lt, hcLight: lt }, p("editorBracketMatchBorder", "Color for matching brackets boxes")); +const Ile = R("editorOverviewRuler.border", { dark: "#7f7f7f4d", light: "#7f7f7f4d", hcDark: "#7f7f7f4d", hcLight: "#666666" }, p("editorOverviewRulerBorder", "Color of the overview ruler border.")), Sle = R("editorOverviewRuler.background", null, p("editorOverviewRulerBackground", "Background color of the editor overview ruler.")); +R("editorGutter.background", Ql, p("editorGutter", "Background color of the editor gutter. The gutter contains the glyph margins and the line numbers.")); +R("editorUnnecessaryCode.border", { dark: null, light: null, hcDark: Q.fromHex("#fff").transparent(0.8), hcLight: lt }, p("unnecessaryCodeBorder", "Border color of unnecessary (unused) source code in the editor.")); +const xle = R("editorUnnecessaryCode.opacity", { dark: Q.fromHex("#000a"), light: Q.fromHex("#0007"), hcDark: null, hcLight: null }, p("unnecessaryCodeOpacity", `Opacity of unnecessary (unused) source code in the editor. For example, "#000000c0" will render the code with 75% opacity. For high contrast themes, use the 'editorUnnecessaryCode.border' theme color to underline unnecessary code instead of fading it out.`)); +R("editorGhostText.border", { dark: null, light: null, hcDark: Q.fromHex("#fff").transparent(0.8), hcLight: Q.fromHex("#292929").transparent(0.8) }, p("editorGhostTextBorder", "Border color of ghost text in the editor.")); +const Cle = R("editorGhostText.foreground", { dark: Q.fromHex("#ffffff56"), light: Q.fromHex("#0007"), hcDark: null, hcLight: null }, p("editorGhostTextForeground", "Foreground color of the ghost text in the editor.")); +R("editorGhostText.background", null, p("editorGhostTextBackground", "Background color of the ghost text in the editor.")); +const Rle = new Q(new rt(0, 122, 204, 0.6)), Nle = R("editorOverviewRuler.rangeHighlightForeground", Rle, p("overviewRulerRangeHighlight", "Overview ruler marker color for range highlights. The color must not be opaque so as not to hide underlying decorations."), !0), wle = R("editorOverviewRuler.errorForeground", { dark: new Q(new rt(255, 18, 18, 0.7)), light: new Q(new rt(255, 18, 18, 0.7)), hcDark: new Q(new rt(255, 50, 50, 1)), hcLight: "#B5200D" }, p("overviewRuleError", "Overview ruler marker color for errors.")), Tle = R("editorOverviewRuler.warningForeground", { dark: jd, light: jd, hcDark: iW, hcLight: iW }, p("overviewRuleWarning", "Overview ruler marker color for warnings.")), Mle = R("editorOverviewRuler.infoForeground", { dark: Jc, light: Jc, hcDark: nW, hcLight: nW }, p("overviewRuleInfo", "Overview ruler marker color for infos.")), cQ = R("editorBracketHighlight.foreground1", { dark: "#FFD700", light: "#0431FAFF", hcDark: "#FFD700", hcLight: "#0431FAFF" }, p("editorBracketHighlightForeground1", "Foreground color of brackets (1). Requires enabling bracket pair colorization.")), dQ = R("editorBracketHighlight.foreground2", { dark: "#DA70D6", light: "#319331FF", hcDark: "#DA70D6", hcLight: "#319331FF" }, p("editorBracketHighlightForeground2", "Foreground color of brackets (2). Requires enabling bracket pair colorization.")), aQ = R("editorBracketHighlight.foreground3", { dark: "#179FFF", light: "#7B3814FF", hcDark: "#87CEFA", hcLight: "#7B3814FF" }, p("editorBracketHighlightForeground3", "Foreground color of brackets (3). Requires enabling bracket pair colorization.")), hQ = R("editorBracketHighlight.foreground4", "#00000000", p("editorBracketHighlightForeground4", "Foreground color of brackets (4). Requires enabling bracket pair colorization.")), uQ = R("editorBracketHighlight.foreground5", "#00000000", p("editorBracketHighlightForeground5", "Foreground color of brackets (5). Requires enabling bracket pair colorization.")), mQ = R("editorBracketHighlight.foreground6", "#00000000", p("editorBracketHighlightForeground6", "Foreground color of brackets (6). Requires enabling bracket pair colorization.")), Yle = R("editorBracketHighlight.unexpectedBracket.foreground", { dark: new Q(new rt(255, 18, 18, 0.8)), light: new Q(new rt(255, 18, 18, 0.8)), hcDark: "new Color(new RGBA(255, 50, 50, 1))", hcLight: "#B5200D" }, p("editorBracketHighlightUnexpectedBracketForeground", "Foreground color of unexpected brackets.")), kle = R("editorBracketPairGuide.background1", "#00000000", p("editorBracketPairGuide.background1", "Background color of inactive bracket pair guides (1). Requires enabling bracket pair guides.")), vle = R("editorBracketPairGuide.background2", "#00000000", p("editorBracketPairGuide.background2", "Background color of inactive bracket pair guides (2). Requires enabling bracket pair guides.")), Jle = R("editorBracketPairGuide.background3", "#00000000", p("editorBracketPairGuide.background3", "Background color of inactive bracket pair guides (3). Requires enabling bracket pair guides.")), Hle = R("editorBracketPairGuide.background4", "#00000000", p("editorBracketPairGuide.background4", "Background color of inactive bracket pair guides (4). Requires enabling bracket pair guides.")), Ele = R("editorBracketPairGuide.background5", "#00000000", p("editorBracketPairGuide.background5", "Background color of inactive bracket pair guides (5). Requires enabling bracket pair guides.")), Dle = R("editorBracketPairGuide.background6", "#00000000", p("editorBracketPairGuide.background6", "Background color of inactive bracket pair guides (6). Requires enabling bracket pair guides.")), Fle = R("editorBracketPairGuide.activeBackground1", "#00000000", p("editorBracketPairGuide.activeBackground1", "Background color of active bracket pair guides (1). Requires enabling bracket pair guides.")), zle = R("editorBracketPairGuide.activeBackground2", "#00000000", p("editorBracketPairGuide.activeBackground2", "Background color of active bracket pair guides (2). Requires enabling bracket pair guides.")), Ale = R("editorBracketPairGuide.activeBackground3", "#00000000", p("editorBracketPairGuide.activeBackground3", "Background color of active bracket pair guides (3). Requires enabling bracket pair guides.")), Kle = R("editorBracketPairGuide.activeBackground4", "#00000000", p("editorBracketPairGuide.activeBackground4", "Background color of active bracket pair guides (4). Requires enabling bracket pair guides.")), Ule = R("editorBracketPairGuide.activeBackground5", "#00000000", p("editorBracketPairGuide.activeBackground5", "Background color of active bracket pair guides (5). Requires enabling bracket pair guides.")), Ple = R("editorBracketPairGuide.activeBackground6", "#00000000", p("editorBracketPairGuide.activeBackground6", "Background color of active bracket pair guides (6). Requires enabling bracket pair guides.")); +R("editorUnicodeHighlight.border", jd, p("editorUnicodeHighlight.border", "Border color used to highlight unicode characters.")); +R("editorUnicodeHighlight.background", Nne, p("editorUnicodeHighlight.background", "Background color used to highlight unicode characters.")); +Il((s, e) => { + const t = s.getColor(Ql), i = s.getColor(oQ), n = i && !i.isTransparent() ? i : t; n && e.addRule(`.monaco-editor .inputarea.ime-input { background-color: ${n}; }`); }); -const cZ = class cZ extends Xm { +const L2 = class L2 extends Kb { constructor(e) { - super(), this._context = e, this._readConfig(), this._lastCursorModelPosition = new V(1, 1), this._renderResult = null, this._activeLineNumber = 1, this._context.addEventHandler(this); + super(), this._context = e, this._readConfig(), this._lastCursorModelPosition = new Y(1, 1), this._renderResult = null, this._activeLineNumber = 1, this._context.addEventHandler(this); } _readConfig() { const e = this._context.configuration.options; @@ -23655,7 +23655,7 @@ const cZ = class cZ extends Xm { } // --- end event handlers _getLineRenderLineNumber(e) { - const t = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new V(e, 1)); + const t = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Y(e, 1)); if (t.column !== 1) return ""; const i = t.lineNumber; @@ -23678,26 +23678,26 @@ const cZ = class cZ extends Xm { this._renderResult = null; return; } - const t = fs ? this._lineHeight % 2 === 0 ? " lh-even" : " lh-odd" : "", i = e.visibleRange.startLineNumber, n = e.visibleRange.endLineNumber, o = this._context.viewModel.getDecorationsInViewport(e.visibleRange).filter((c) => !!c.options.lineNumberClassName); - o.sort((c, d) => M.compareRangesUsingEnds(c.range, d.range)); - let r = 0; - const l = this._context.viewModel.getLineCount(), a = []; - for (let c = i; c <= n; c++) { - const d = c - i; - let h = this._getLineRenderLineNumber(c), u = ""; - for (; r < o.length && o[r].range.endLineNumber < c; ) - r++; - for (let g = r; g < o.length; g++) { - const { range: m, options: f } = o[g]; - m.startLineNumber <= c && (u += " " + f.lineNumberClassName); + const t = fs ? this._lineHeight % 2 === 0 ? " lh-even" : " lh-odd" : "", i = e.visibleRange.startLineNumber, n = e.visibleRange.endLineNumber, o = this._context.viewModel.getDecorationsInViewport(e.visibleRange).filter((d) => !!d.options.lineNumberClassName); + o.sort((d, a) => I.compareRangesUsingEnds(d.range, a.range)); + let l = 0; + const r = this._context.viewModel.getLineCount(), c = []; + for (let d = i; d <= n; d++) { + const a = d - i; + let h = this._getLineRenderLineNumber(d), u = ""; + for (; l < o.length && o[l].range.endLineNumber < d; ) + l++; + for (let m = l; m < o.length; m++) { + const { range: b, options: g } = o[m]; + b.startLineNumber <= d && (u += " " + g.lineNumberClassName); } if (!h && !u) { - a[d] = ""; + c[a] = ""; continue; } - c === l && this._context.viewModel.getLineLength(c) === 0 && (this._renderFinalNewline === "off" && (h = ""), this._renderFinalNewline === "dimmed" && (u += " dimmed-line-number")), c === this._activeLineNumber && (u += " active-line-number"), a[d] = `
${h}
`; + d === r && this._context.viewModel.getLineLength(d) === 0 && (this._renderFinalNewline === "off" && (h = ""), this._renderFinalNewline === "dimmed" && (u += " dimmed-line-number")), d === this._activeLineNumber && (u += " active-line-number"), c[a] = `
${h}
`; } - this._renderResult = a; + this._renderResult = c; } render(e, t) { if (!this._renderResult) @@ -23706,13 +23706,13 @@ const cZ = class cZ extends Xm { return i < 0 || i >= this._renderResult.length ? "" : this._renderResult[i]; } }; -cZ.CLASS_NAME = "line-numbers"; -let TA = cZ; -Lr((s, e) => { - const t = s.getColor(yoe), i = s.getColor(Toe); +L2.CLASS_NAME = "line-numbers"; +let BV = L2; +Il((s, e) => { + const t = s.getColor(ale), i = s.getColor(Lle); i ? e.addRule(`.monaco-editor .line-numbers.dimmed-line-number { color: ${i}; }`) : t && e.addRule(`.monaco-editor .line-numbers.dimmed-line-number { color: ${t.transparent(0.4)}; }`); }); -const df = class df extends wo { +const gg = class gg extends Go { constructor(e) { super(e); const t = this._context.configuration.options, i = t.get( @@ -23722,7 +23722,7 @@ const df = class df extends wo { this._canUseLayerHinting = !t.get( 32 /* EditorOption.disableLayerHinting */ - ), this._contentLeft = i.contentLeft, this._glyphMarginLeft = i.glyphMarginLeft, this._glyphMarginWidth = i.glyphMarginWidth, this._domNode = yt(document.createElement("div")), this._domNode.setClassName(df.OUTER_CLASS_NAME), this._domNode.setPosition("absolute"), this._domNode.setAttribute("role", "presentation"), this._domNode.setAttribute("aria-hidden", "true"), this._glyphMarginBackgroundDomNode = yt(document.createElement("div")), this._glyphMarginBackgroundDomNode.setClassName(df.CLASS_NAME), this._domNode.appendChild(this._glyphMarginBackgroundDomNode); + ), this._contentLeft = i.contentLeft, this._glyphMarginLeft = i.glyphMarginLeft, this._glyphMarginWidth = i.glyphMarginWidth, this._domNode = ft(document.createElement("div")), this._domNode.setClassName(gg.OUTER_CLASS_NAME), this._domNode.setPosition("absolute"), this._domNode.setAttribute("role", "presentation"), this._domNode.setAttribute("aria-hidden", "true"), this._glyphMarginBackgroundDomNode = ft(document.createElement("div")), this._glyphMarginBackgroundDomNode.setClassName(gg.CLASS_NAME), this._domNode.appendChild(this._glyphMarginBackgroundDomNode); } dispose() { super.dispose(); @@ -23755,10 +23755,10 @@ const df = class df extends wo { this._domNode.setHeight(i), this._domNode.setWidth(this._contentLeft), this._glyphMarginBackgroundDomNode.setLeft(this._glyphMarginLeft), this._glyphMarginBackgroundDomNode.setWidth(this._glyphMarginWidth), this._glyphMarginBackgroundDomNode.setHeight(i); } }; -df.CLASS_NAME = "glyph-margin", df.OUTER_CLASS_NAME = "margin"; -let DA = df; -const If = "monaco-mouse-cursor-text"; -let TU = class { +gg.CLASS_NAME = "glyph-margin", gg.OUTER_CLASS_NAME = "margin"; +let _V = gg; +const Yg = "monaco-mouse-cursor-text"; +let bQ = class { constructor() { this._tokenizationSupports = /* @__PURE__ */ new Map(), this._factories = /* @__PURE__ */ new Map(), this._onDidChange = new k(), this.onDidChange = this._onDidChange.event, this._colorMap = null; } @@ -23769,7 +23769,7 @@ let TU = class { }); } register(e, t) { - return this._tokenizationSupports.set(e, t), this.handleChange([e]), Ce(() => { + return this._tokenizationSupports.set(e, t), this.handleChange([e]), We(() => { this._tokenizationSupports.get(e) === t && (this._tokenizationSupports.delete(e), this.handleChange([e])); }); } @@ -23779,8 +23779,8 @@ let TU = class { registerFactory(e, t) { var n; (n = this._factories.get(e)) == null || n.dispose(); - const i = new tre(this, e, t); - return this._factories.set(e, i), Ce(() => { + const i = new Ble(this, e, t); + return this._factories.set(e, i), We(() => { const o = this._factories.get(e); !o || o !== i || (this._factories.delete(e), o.dispose()); }); @@ -23814,7 +23814,7 @@ let TU = class { ] : null; } }; -class tre extends R { +class Ble extends J { get isResolved() { return this._isResolved; } @@ -23832,7 +23832,7 @@ class tre extends R { this._isResolved = !0, e && !this._isDisposed && this._register(this._registry.register(this._languageId, e)); } } -let jw = class { +let dW = class { constructor(e, t, i) { this.offset = e, this.type = t, this.language = i, this._tokenBrand = void 0; } @@ -23840,27 +23840,27 @@ let jw = class { return "(" + this.offset + ", " + this.type + ")"; } }; -class QE { +class GJ { constructor(e, t) { this.tokens = e, this.endState = t, this._tokenizationResultBrand = void 0; } } -class mI { +class Rx { constructor(e, t) { this.tokens = e, this.endState = t, this._encodedTokenizationResultBrand = void 0; } } -var io; +var so; (function(s) { s[s.Increase = 0] = "Increase", s[s.Decrease = 1] = "Decrease"; -})(io || (io = {})); -var qw; +})(so || (so = {})); +var aW; (function(s) { const e = /* @__PURE__ */ new Map(); e.set(0, te.symbolMethod), e.set(1, te.symbolFunction), e.set(2, te.symbolConstructor), e.set(3, te.symbolField), e.set(4, te.symbolVariable), e.set(5, te.symbolClass), e.set(6, te.symbolStruct), e.set(7, te.symbolInterface), e.set(8, te.symbolModule), e.set(9, te.symbolProperty), e.set(10, te.symbolEvent), e.set(11, te.symbolOperator), e.set(12, te.symbolUnit), e.set(13, te.symbolValue), e.set(15, te.symbolEnum), e.set(14, te.symbolConstant), e.set(15, te.symbolEnum), e.set(16, te.symbolEnumMember), e.set(17, te.symbolKeyword), e.set(27, te.symbolSnippet), e.set(18, te.symbolText), e.set(19, te.symbolColor), e.set(20, te.symbolFile), e.set(21, te.symbolReference), e.set(22, te.symbolCustomColor), e.set(23, te.symbolFolder), e.set(24, te.symbolTypeParameter), e.set(25, te.account), e.set(26, te.issues); function t(o) { - let r = e.get(o); - return r || (console.info("No codicon found for CompletionItemKind " + o), r = te.symbolProperty), r; + let l = e.get(o); + return l || (console.info("No codicon found for CompletionItemKind " + o), l = te.symbolProperty), l; } s.toIcon = t; const i = /* @__PURE__ */ new Map(); @@ -23985,41 +23985,41 @@ var qw; 26 /* CompletionItemKind.Issue */ ); - function n(o, r) { - let l = i.get(o); - return typeof l > "u" && !r && (l = 9), l; + function n(o, l) { + let r = i.get(o); + return typeof r > "u" && !l && (r = 9), r; } s.fromString = n; -})(qw || (qw = {})); -var _l; +})(aW || (aW = {})); +var wr; (function(s) { s[s.Automatic = 0] = "Automatic", s[s.Explicit = 1] = "Explicit"; -})(_l || (_l = {})); -class DU { +})(wr || (wr = {})); +class pQ { constructor(e, t, i, n) { this.range = e, this.text = t, this.completionKind = i, this.isSnippetText = n; } equals(e) { - return M.lift(this.range).equalsRange(e.range) && this.text === e.text && this.completionKind === e.completionKind && this.isSnippetText === e.isSnippetText; + return I.lift(this.range).equalsRange(e.range) && this.text === e.text && this.completionKind === e.completionKind && this.isSnippetText === e.isSnippetText; } } -var $w; +var hW; (function(s) { s[s.Automatic = 0] = "Automatic", s[s.PasteAs = 1] = "PasteAs"; -})($w || ($w = {})); -var Za; +})(hW || (hW = {})); +var Nc; (function(s) { s[s.Invoke = 1] = "Invoke", s[s.TriggerCharacter = 2] = "TriggerCharacter", s[s.ContentChange = 3] = "ContentChange"; -})(Za || (Za = {})); -var fb; +})(Nc || (Nc = {})); +var XZ; (function(s) { s[s.Text = 0] = "Text", s[s.Read = 1] = "Read", s[s.Write = 2] = "Write"; -})(fb || (fb = {})); -function ire(s) { - return s && Le.isUri(s.uri) && M.isIRange(s.range) && (M.isIRange(s.originSelectionRange) || M.isIRange(s.targetSelectionRange)); +})(XZ || (XZ = {})); +function _le(s) { + return s && Xe.isUri(s.uri) && I.isIRange(s.range) && (I.isIRange(s.originSelectionRange) || I.isIRange(s.targetSelectionRange)); } p("Array", "array"), p("Boolean", "boolean"), p("Class", "class"), p("Constant", "constant"), p("Constructor", "constructor"), p("Enum", "enumeration"), p("EnumMember", "enumeration member"), p("Event", "event"), p("Field", "field"), p("File", "file"), p("Function", "function"), p("Interface", "interface"), p("Key", "key"), p("Method", "method"), p("Module", "module"), p("Namespace", "namespace"), p("Null", "null"), p("Number", "number"), p("Object", "object"), p("Operator", "operator"), p("Package", "package"), p("Property", "property"), p("String", "string"), p("Struct", "struct"), p("TypeParameter", "type parameter"), p("Variable", "variable"); -var mv; +var kw; (function(s) { const e = /* @__PURE__ */ new Map(); e.set(0, te.symbolFile), e.set(1, te.symbolModule), e.set(2, te.symbolNamespace), e.set(3, te.symbolPackage), e.set(4, te.symbolClass), e.set(5, te.symbolMethod), e.set(6, te.symbolProperty), e.set(7, te.symbolField), e.set(8, te.symbolConstructor), e.set(9, te.symbolEnum), e.set(10, te.symbolInterface), e.set(11, te.symbolFunction), e.set(12, te.symbolVariable), e.set(13, te.symbolConstant), e.set(14, te.symbolString), e.set(15, te.symbolNumber), e.set(16, te.symbolBoolean), e.set(17, te.symbolArray), e.set(18, te.symbolObject), e.set(19, te.symbolKey), e.set(20, te.symbolNull), e.set(21, te.symbolEnumMember), e.set(22, te.symbolStruct), e.set(23, te.symbolEvent), e.set(24, te.symbolOperator), e.set(25, te.symbolTypeParameter); @@ -24028,9 +24028,9 @@ var mv; return n || (console.info("No codicon found for SymbolKind " + i), n = te.symbolProperty), n; } s.toIcon = t; -})(mv || (mv = {})); -var qs; -let r0 = (qs = class { +})(kw || (kw = {})); +var eo; +let u0 = (eo = class { /** * Returns a {@link FoldingRangeKind} for the given value. * @@ -24039,13 +24039,13 @@ let r0 = (qs = class { static fromValue(e) { switch (e) { case "comment": - return qs.Comment; + return eo.Comment; case "imports": - return qs.Imports; + return eo.Imports; case "region": - return qs.Region; + return eo.Region; } - return new qs(e); + return new eo(e); } /** * Creates a new {@link FoldingRangeKind}. @@ -24055,27 +24055,27 @@ let r0 = (qs = class { constructor(e) { this.value = e; } -}, qs.Comment = new qs("comment"), qs.Imports = new qs("imports"), qs.Region = new qs("region"), qs); -var pv; +}, eo.Comment = new eo("comment"), eo.Imports = new eo("imports"), eo.Region = new eo("region"), eo); +var vw; (function(s) { s[s.AIGenerated = 1] = "AIGenerated"; -})(pv || (pv = {})); -var e1; +})(vw || (vw = {})); +var uW; (function(s) { s[s.Invoke = 0] = "Invoke", s[s.Automatic = 1] = "Automatic"; -})(e1 || (e1 = {})); -var fv; +})(uW || (uW = {})); +var Jw; (function(s) { function e(t) { return !t || typeof t != "object" ? !1 : typeof t.id == "string" && typeof t.title == "string"; } s.is = e; -})(fv || (fv = {})); -var VA; +})(Jw || (Jw = {})); +var QV; (function(s) { s[s.Type = 1] = "Type", s[s.Parameter = 2] = "Parameter"; -})(VA || (VA = {})); -class nre { +})(QV || (QV = {})); +class Qle { constructor(e) { this.createSupport = e, this._tokenizationSupport = null; } @@ -24088,12 +24088,12 @@ class nre { return this._tokenizationSupport || (this._tokenizationSupport = this.createSupport()), this._tokenizationSupport; } } -const Wi = new TU(), bv = new TU(); -var kA; +const Ti = new bQ(), Hw = new bQ(); +var OV; (function(s) { s[s.Invoke = 0] = "Invoke", s[s.Automatic = 1] = "Automatic"; -})(kA || (kA = {})); -class sre { +})(OV || (OV = {})); +class Ole { constructor() { this._onDidChange = new k(), this.onDidChange = this._onDidChange.event, this._enabled = !0; } @@ -24113,23 +24113,23 @@ class sre { this._enabled = !1, this._onDidChange.fire(); } } -const vy = new sre(), xt = $e("keybindingService"); -var ore = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +const zf = new Ole(), Lt = $e("keybindingService"); +var jle = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, jF = function(s, e) { +}, XF = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class rre { +class qle { constructor(e, t, i, n, o) { this._context = e, this.modelLineNumber = t, this.distanceToModelLineStart = i, this.widthOfHiddenLineTextBefore = n, this.distanceToModelLineEnd = o, this._visibleTextAreaBrand = void 0, this.startPosition = null, this.endPosition = null, this.visibleTextareaStart = null, this.visibleTextareaEnd = null, this._previousPresentation = null; } prepareRender(e) { - const t = new V(this.modelLineNumber, this.distanceToModelLineStart + 1), i = new V(this.modelLineNumber, this._context.viewModel.model.getLineMaxColumn(this.modelLineNumber) - this.distanceToModelLineEnd); + const t = new Y(this.modelLineNumber, this.distanceToModelLineStart + 1), i = new Y(this.modelLineNumber, this._context.viewModel.model.getLineMaxColumn(this.modelLineNumber) - this.distanceToModelLineEnd); this.startPosition = this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(t), this.endPosition = this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(i), this.startPosition.lineNumber === this.endPosition.lineNumber ? (this.visibleTextareaStart = e.visibleRangeForPosition(this.startPosition), this.visibleTextareaEnd = e.visibleRangeForPosition(this.endPosition)) : (this.visibleTextareaStart = null, this.visibleTextareaEnd = null); } definePresentation(e) { @@ -24142,122 +24142,122 @@ class rre { }), this._previousPresentation; } } -const BN = pr; -let yv = class extends wo { +const lR = fl; +let Ew = class extends Go { constructor(e, t, i, n, o) { - super(e), this._keybindingService = n, this._instantiationService = o, this._primaryCursorPosition = new V(1, 1), this._primaryCursorVisibleRange = null, this._viewController = t, this._visibleRangeProvider = i, this._scrollLeft = 0, this._scrollTop = 0; - const r = this._context.configuration.options, l = r.get( + super(e), this._keybindingService = n, this._instantiationService = o, this._primaryCursorPosition = new Y(1, 1), this._primaryCursorVisibleRange = null, this._viewController = t, this._visibleRangeProvider = i, this._scrollLeft = 0, this._scrollTop = 0; + const l = this._context.configuration.options, r = l.get( 146 /* EditorOption.layoutInfo */ ); - this._setAccessibilityOptions(r), this._contentLeft = l.contentLeft, this._contentWidth = l.contentWidth, this._contentHeight = l.height, this._fontInfo = r.get( + this._setAccessibilityOptions(l), this._contentLeft = r.contentLeft, this._contentWidth = r.contentWidth, this._contentHeight = r.height, this._fontInfo = l.get( 50 /* EditorOption.fontInfo */ - ), this._lineHeight = r.get( + ), this._lineHeight = l.get( 67 /* EditorOption.lineHeight */ - ), this._emptySelectionClipboard = r.get( + ), this._emptySelectionClipboard = l.get( 37 /* EditorOption.emptySelectionClipboard */ - ), this._copyWithSyntaxHighlighting = r.get( + ), this._copyWithSyntaxHighlighting = l.get( 25 /* EditorOption.copyWithSyntaxHighlighting */ - ), this._visibleTextArea = null, this._selections = [new fe(1, 1, 1, 1)], this._modelSelections = [new fe(1, 1, 1, 1)], this._lastRenderPosition = null, this.textArea = yt(document.createElement("textarea")), Tl.write( + ), this._visibleTextArea = null, this._selections = [new ge(1, 1, 1, 1)], this._modelSelections = [new ge(1, 1, 1, 1)], this._lastRenderPosition = null, this.textArea = ft(document.createElement("textarea")), vr.write( this.textArea, 7 /* PartFingerprint.TextArea */ - ), this.textArea.setClassName(`inputarea ${If}`), this.textArea.setAttribute("wrap", this._textAreaWrapping && !this._visibleTextArea ? "on" : "off"); - const { tabSize: a } = this._context.viewModel.model.getOptions(); - this.textArea.domNode.style.tabSize = `${a * this._fontInfo.spaceWidth}px`, this.textArea.setAttribute("autocorrect", "off"), this.textArea.setAttribute("autocapitalize", "off"), this.textArea.setAttribute("autocomplete", "off"), this.textArea.setAttribute("spellcheck", "false"), this.textArea.setAttribute("aria-label", this._getAriaLabel(r)), this.textArea.setAttribute("aria-required", r.get( + ), this.textArea.setClassName(`inputarea ${Yg}`), this.textArea.setAttribute("wrap", this._textAreaWrapping && !this._visibleTextArea ? "on" : "off"); + const { tabSize: c } = this._context.viewModel.model.getOptions(); + this.textArea.domNode.style.tabSize = `${c * this._fontInfo.spaceWidth}px`, this.textArea.setAttribute("autocorrect", "off"), this.textArea.setAttribute("autocapitalize", "off"), this.textArea.setAttribute("autocomplete", "off"), this.textArea.setAttribute("spellcheck", "false"), this.textArea.setAttribute("aria-label", this._getAriaLabel(l)), this.textArea.setAttribute("aria-required", l.get( 5 /* EditorOption.ariaRequired */ - ) ? "true" : "false"), this.textArea.setAttribute("tabindex", String(r.get( + ) ? "true" : "false"), this.textArea.setAttribute("tabindex", String(l.get( 125 /* EditorOption.tabIndex */ - ))), this.textArea.setAttribute("role", "textbox"), this.textArea.setAttribute("aria-roledescription", p("editor", "editor")), this.textArea.setAttribute("aria-multiline", "true"), this.textArea.setAttribute("aria-autocomplete", r.get( + ))), this.textArea.setAttribute("role", "textbox"), this.textArea.setAttribute("aria-roledescription", p("editor", "editor")), this.textArea.setAttribute("aria-multiline", "true"), this.textArea.setAttribute("aria-autocomplete", l.get( 92 /* EditorOption.readOnly */ - ) ? "none" : "both"), this._ensureReadOnlyAttribute(), this.textAreaCover = yt(document.createElement("div")), this.textAreaCover.setPosition("absolute"); - const c = { + ) ? "none" : "both"), this._ensureReadOnlyAttribute(), this.textAreaCover = ft(document.createElement("div")), this.textAreaCover.setPosition("absolute"); + const d = { getLineCount: () => this._context.viewModel.getLineCount(), getLineMaxColumn: (u) => this._context.viewModel.getLineMaxColumn(u), - getValueInRange: (u, g) => this._context.viewModel.getValueInRange(u, g), - getValueLengthInRange: (u, g) => this._context.viewModel.getValueLengthInRange(u, g), - modifyPosition: (u, g) => this._context.viewModel.modifyPosition(u, g) - }, d = { + getValueInRange: (u, m) => this._context.viewModel.getValueInRange(u, m), + getValueLengthInRange: (u, m) => this._context.viewModel.getValueLengthInRange(u, m), + modifyPosition: (u, m) => this._context.viewModel.modifyPosition(u, m) + }, a = { getDataToCopy: () => { - const u = this._context.viewModel.getPlainTextToCopy(this._modelSelections, this._emptySelectionClipboard, kn), g = this._context.viewModel.model.getEOL(), m = this._emptySelectionClipboard && this._modelSelections.length === 1 && this._modelSelections[0].isEmpty(), f = Array.isArray(u) ? u : null, b = Array.isArray(u) ? u.join(g) : u; - let y, w = null; - if (dv.forceCopyWithSyntaxHighlighting || this._copyWithSyntaxHighlighting && b.length < 65536) { - const C = this._context.viewModel.getRichTextToCopy(this._modelSelections, this._emptySelectionClipboard); - C && (y = C.html, w = C.mode); + const u = this._context.viewModel.getPlainTextToCopy(this._modelSelections, this._emptySelectionClipboard, Jn), m = this._context.viewModel.model.getEOL(), b = this._emptySelectionClipboard && this._modelSelections.length === 1 && this._modelSelections[0].isEmpty(), g = Array.isArray(u) ? u : null, Z = Array.isArray(u) ? u.join(m) : u; + let f, y = null; + if (ww.forceCopyWithSyntaxHighlighting || this._copyWithSyntaxHighlighting && Z.length < 65536) { + const W = this._context.viewModel.getRichTextToCopy(this._modelSelections, this._emptySelectionClipboard); + W && (f = W.html, y = W.mode); } return { - isFromEmptySelection: m, - multicursorText: f, - text: b, - html: y, - mode: w + isFromEmptySelection: b, + multicursorText: g, + text: Z, + html: f, + mode: y }; }, getScreenReaderContent: () => { if (this._accessibilitySupport === 1) { const u = this._selections[0]; if (qe && u.isEmpty()) { - const m = u.getStartPosition(); - let f = this._getWordBeforePosition(m); - if (f.length === 0 && (f = this._getCharacterBeforePosition(m)), f.length > 0) - return new Jn(f, f.length, f.length, M.fromPositions(m), 0); + const b = u.getStartPosition(); + let g = this._getWordBeforePosition(b); + if (g.length === 0 && (g = this._getCharacterBeforePosition(b)), g.length > 0) + return new Qn(g, g.length, g.length, I.fromPositions(b), 0); } - if (qe && !u.isEmpty() && c.getValueLengthInRange( + if (qe && !u.isEmpty() && d.getValueLengthInRange( u, 0 /* EndOfLinePreference.TextDefined */ ) < 500) { - const m = c.getValueInRange( + const b = d.getValueInRange( u, 0 /* EndOfLinePreference.TextDefined */ ); - return new Jn(m, 0, m.length, u, 0); + return new Qn(b, 0, b.length, u, 0); } - if (xh && !u.isEmpty()) { - const m = "vscode-placeholder"; - return new Jn(m, 0, m.length, null, void 0); + if (Ch && !u.isEmpty()) { + const b = "vscode-placeholder"; + return new Qn(b, 0, b.length, null, void 0); } - return Jn.EMPTY; + return Qn.EMPTY; } - if (D9) { + if (sD) { const u = this._selections[0]; if (u.isEmpty()) { - const g = u.getStartPosition(), [m, f] = this._getAndroidWordAtPosition(g); - if (m.length > 0) - return new Jn(m, f, f, M.fromPositions(g), 0); + const m = u.getStartPosition(), [b, g] = this._getAndroidWordAtPosition(m); + if (b.length > 0) + return new Qn(b, g, g, I.fromPositions(m), 0); } - return Jn.EMPTY; + return Qn.EMPTY; } - return Rp.fromEditorSelection( - c, + return Ap.fromEditorSelection( + d, this._selections[0], this._accessibilityPageSize, this._accessibilitySupport === 0 /* AccessibilitySupport.Unknown */ ); }, - deduceModelPosition: (u, g, m) => this._context.viewModel.deduceModelPositionRelativeToViewPosition(u, g, m) - }, h = this._register(new doe(this.textArea.domNode)); - this._textAreaInput = this._register(this._instantiationService.createInstance(hv, d, h, ro, { - isAndroid: D9, - isChrome: lC, - isFirefox: pr, - isSafari: xh + deduceModelPosition: (u, m, b) => this._context.viewModel.deduceModelPositionRelativeToViewPosition(u, m, b) + }, h = this._register(new ile(this.textArea.domNode)); + this._textAreaInput = this._register(this._instantiationService.createInstance(Tw, a, h, co, { + isAndroid: sD, + isChrome: WG, + isFirefox: fl, + isSafari: Ch })), this._register(this._textAreaInput.onKeyDown((u) => { this._viewController.emitKeyDown(u); })), this._register(this._textAreaInput.onKeyUp((u) => { this._viewController.emitKeyUp(u); })), this._register(this._textAreaInput.onPaste((u) => { - let g = !1, m = null, f = null; - u.metadata && (g = this._emptySelectionClipboard && !!u.metadata.isFromEmptySelection, m = typeof u.metadata.multicursorText < "u" ? u.metadata.multicursorText : null, f = u.metadata.mode), this._viewController.paste(u.text, g, m, f); + let m = !1, b = null, g = null; + u.metadata && (m = this._emptySelectionClipboard && !!u.metadata.isFromEmptySelection, b = typeof u.metadata.multicursorText < "u" ? u.metadata.multicursorText : null, g = u.metadata.mode), this._viewController.paste(u.text, m, b, g); })), this._register(this._textAreaInput.onCut(() => { this._viewController.cut(); })), this._register(this._textAreaInput.onType((u) => { @@ -24265,32 +24265,32 @@ let yv = class extends wo { })), this._register(this._textAreaInput.onSelectionChangeRequest((u) => { this._viewController.setSelection(u); })), this._register(this._textAreaInput.onCompositionStart((u) => { - const g = this.textArea.domNode, m = this._modelSelections[0], { distanceToModelLineStart: f, widthOfHiddenTextBefore: b } = (() => { - const w = g.value.substring(0, Math.min(g.selectionStart, g.selectionEnd)), C = w.lastIndexOf(` -`), S = w.substring(C + 1), L = S.lastIndexOf(" "), x = S.length - L - 1, Z = m.getStartPosition(), _ = Math.min(Z.column - 1, x), v = Z.column - 1 - _, P = S.substring(0, S.length - _), { tabSize: E } = this._context.viewModel.model.getOptions(), Y = lre(this.textArea.domNode.ownerDocument, P, this._fontInfo, E); - return { distanceToModelLineStart: v, widthOfHiddenTextBefore: Y }; - })(), { distanceToModelLineEnd: y } = (() => { - const w = g.value.substring(Math.max(g.selectionStart, g.selectionEnd)), C = w.indexOf(` -`), S = C === -1 ? w : w.substring(0, C), L = S.indexOf(" "), x = L === -1 ? S.length : S.length - L - 1, Z = m.getEndPosition(), _ = Math.min(this._context.viewModel.model.getLineMaxColumn(Z.lineNumber) - Z.column, x); - return { distanceToModelLineEnd: this._context.viewModel.model.getLineMaxColumn(Z.lineNumber) - Z.column - _ }; + const m = this.textArea.domNode, b = this._modelSelections[0], { distanceToModelLineStart: g, widthOfHiddenTextBefore: Z } = (() => { + const y = m.value.substring(0, Math.min(m.selectionStart, m.selectionEnd)), W = y.lastIndexOf(` +`), G = y.substring(W + 1), X = G.lastIndexOf(" "), L = G.length - X - 1, S = b.getStartPosition(), x = Math.min(S.column - 1, L), w = S.column - 1 - x, A = G.substring(0, G.length - x), { tabSize: H } = this._context.viewModel.model.getOptions(), F = $le(this.textArea.domNode.ownerDocument, A, this._fontInfo, H); + return { distanceToModelLineStart: w, widthOfHiddenTextBefore: F }; + })(), { distanceToModelLineEnd: f } = (() => { + const y = m.value.substring(Math.max(m.selectionStart, m.selectionEnd)), W = y.indexOf(` +`), G = W === -1 ? y : y.substring(0, W), X = G.indexOf(" "), L = X === -1 ? G.length : G.length - X - 1, S = b.getEndPosition(), x = Math.min(this._context.viewModel.model.getLineMaxColumn(S.lineNumber) - S.column, L); + return { distanceToModelLineEnd: this._context.viewModel.model.getLineMaxColumn(S.lineNumber) - S.column - x }; })(); this._context.viewModel.revealRange( "keyboard", !0, - M.fromPositions(this._selections[0].getStartPosition()), + I.fromPositions(this._selections[0].getStartPosition()), 0, 1 /* ScrollType.Immediate */ - ), this._visibleTextArea = new rre(this._context, m.startLineNumber, f, b, y), this.textArea.setAttribute("wrap", this._textAreaWrapping && !this._visibleTextArea ? "on" : "off"), this._visibleTextArea.prepareRender(this._visibleRangeProvider), this._render(), this.textArea.setClassName(`inputarea ${If} ime-input`), this._viewController.compositionStart(), this._context.viewModel.onCompositionStart(); + ), this._visibleTextArea = new qle(this._context, b.startLineNumber, g, Z, f), this.textArea.setAttribute("wrap", this._textAreaWrapping && !this._visibleTextArea ? "on" : "off"), this._visibleTextArea.prepareRender(this._visibleRangeProvider), this._render(), this.textArea.setClassName(`inputarea ${Yg} ime-input`), this._viewController.compositionStart(), this._context.viewModel.onCompositionStart(); })), this._register(this._textAreaInput.onCompositionUpdate((u) => { this._visibleTextArea && (this._visibleTextArea.prepareRender(this._visibleRangeProvider), this._render()); })), this._register(this._textAreaInput.onCompositionEnd(() => { - this._visibleTextArea = null, this.textArea.setAttribute("wrap", this._textAreaWrapping && !this._visibleTextArea ? "on" : "off"), this._render(), this.textArea.setClassName(`inputarea ${If}`), this._viewController.compositionEnd(), this._context.viewModel.onCompositionEnd(); + this._visibleTextArea = null, this.textArea.setAttribute("wrap", this._textAreaWrapping && !this._visibleTextArea ? "on" : "off"), this._render(), this.textArea.setClassName(`inputarea ${Yg}`), this._viewController.compositionEnd(), this._context.viewModel.onCompositionEnd(); })), this._register(this._textAreaInput.onFocus(() => { this._context.viewModel.setHasFocus(!0); })), this._register(this._textAreaInput.onBlur(() => { this._context.viewModel.setHasFocus(!1); - })), this._register(vy.onDidChange(() => { + })), this._register(zf.onDidChange(() => { this._ensureReadOnlyAttribute(); })); } @@ -24301,30 +24301,30 @@ let yv = class extends wo { super.dispose(); } _getAndroidWordAtPosition(e) { - const t = '`~!@#$%^&*()-=+[{]}\\|;:",.<>/?', i = this._context.viewModel.getLineContent(e.lineNumber), n = yr(t, []); - let o = !0, r = e.column, l = !0, a = e.column, c = 0; - for (; c < 50 && (o || l); ) { - if (o && r <= 1 && (o = !1), o) { - const d = i.charCodeAt(r - 2); - n.get(d) !== 0 ? o = !1 : r--; + const t = '`~!@#$%^&*()-=+[{]}\\|;:",.<>/?', i = this._context.viewModel.getLineContent(e.lineNumber), n = Gl(t, []); + let o = !0, l = e.column, r = !0, c = e.column, d = 0; + for (; d < 50 && (o || r); ) { + if (o && l <= 1 && (o = !1), o) { + const a = i.charCodeAt(l - 2); + n.get(a) !== 0 ? o = !1 : l--; } - if (l && a > i.length && (l = !1), l) { - const d = i.charCodeAt(a - 1); - n.get(d) !== 0 ? l = !1 : a++; + if (r && c > i.length && (r = !1), r) { + const a = i.charCodeAt(c - 1); + n.get(a) !== 0 ? r = !1 : c++; } - c++; + d++; } - return [i.substring(r - 1, a - 1), e.column - r]; + return [i.substring(l - 1, c - 1), e.column - l]; } _getWordBeforePosition(e) { - const t = this._context.viewModel.getLineContent(e.lineNumber), i = yr(this._context.configuration.options.get( + const t = this._context.viewModel.getLineContent(e.lineNumber), i = Gl(this._context.configuration.options.get( 132 /* EditorOption.wordSeparators */ ), []); let n = e.column, o = 0; for (; n > 1; ) { - const r = t.charCodeAt(n - 2); - if (i.get(r) !== 0 || o > 50) + const l = t.charCodeAt(n - 2); + if (i.get(l) !== 0 || o > 50) return t.substring(n - 1, e.column - 1); o++, n--; } @@ -24333,7 +24333,7 @@ let yv = class extends wo { _getCharacterBeforePosition(e) { if (e.column > 1) { const i = this._context.viewModel.getLineContent(e.lineNumber).charAt(e.column - 2); - if (!Hi(i.charCodeAt(0))) + if (!Bi(i.charCodeAt(0))) return i; } return ""; @@ -24344,8 +24344,8 @@ let yv = class extends wo { 2 /* EditorOption.accessibilitySupport */ ) === 1) { - const r = (i = this._keybindingService.lookupKeybinding("editor.action.toggleScreenReaderAccessibilityMode")) == null ? void 0 : i.getAriaLabel(), l = (n = this._keybindingService.lookupKeybinding("workbench.action.showCommands")) == null ? void 0 : n.getAriaLabel(), a = (o = this._keybindingService.lookupKeybinding("workbench.action.openGlobalKeybindings")) == null ? void 0 : o.getAriaLabel(), c = p("accessibilityModeOff", "The editor is not accessible at this time."); - return r ? p("accessibilityOffAriaLabel", "{0} To enable screen reader optimized mode, use {1}", c, r) : l ? p("accessibilityOffAriaLabelNoKb", "{0} To enable screen reader optimized mode, open the quick pick with {1} and run the command Toggle Screen Reader Accessibility Mode, which is currently not triggerable via keyboard.", c, l) : a ? p("accessibilityOffAriaLabelNoKbs", "{0} Please assign a keybinding for the command Toggle Screen Reader Accessibility Mode by accessing the keybindings editor with {1} and run it.", c, a) : c; + const l = (i = this._keybindingService.lookupKeybinding("editor.action.toggleScreenReaderAccessibilityMode")) == null ? void 0 : i.getAriaLabel(), r = (n = this._keybindingService.lookupKeybinding("workbench.action.showCommands")) == null ? void 0 : n.getAriaLabel(), c = (o = this._keybindingService.lookupKeybinding("workbench.action.openGlobalKeybindings")) == null ? void 0 : o.getAriaLabel(), d = p("accessibilityModeOff", "The editor is not accessible at this time."); + return l ? p("accessibilityOffAriaLabel", "{0} To enable screen reader optimized mode, use {1}", d, l) : r ? p("accessibilityOffAriaLabelNoKb", "{0} To enable screen reader optimized mode, open the quick pick with {1} and run the command Toggle Screen Reader Accessibility Mode, which is currently not triggerable via keyboard.", d, r) : c ? p("accessibilityOffAriaLabelNoKbs", "{0} Please assign a keybinding for the command Toggle Screen Reader Accessibility Mode by accessing the keybindings editor with {1} and run it.", d, c) : d; } return e.get( 4 @@ -24361,7 +24361,7 @@ let yv = class extends wo { 3 /* EditorOption.accessibilityPageSize */ ); - this._accessibilitySupport === 2 && t === El.accessibilityPageSize.defaultValue ? this._accessibilityPageSize = 500 : this._accessibilityPageSize = t; + this._accessibilitySupport === 2 && t === zr.accessibilityPageSize.defaultValue ? this._accessibilityPageSize = 500 : this._accessibilityPageSize = t; const n = e.get( 146 /* EditorOption.layoutInfo */ @@ -24373,7 +24373,7 @@ let yv = class extends wo { ); this._textAreaWrapping = !0, this._textAreaWidth = Math.round(n * o.typicalHalfwidthCharacterWidth); } else - this._textAreaWrapping = !1, this._textAreaWidth = BN ? 0 : 1; + this._textAreaWrapping = !1, this._textAreaWidth = lR ? 0 : 1; } // --- begin event handlers onConfigurationChanged(e) { @@ -24453,7 +24453,7 @@ let yv = class extends wo { // --- end view API _ensureReadOnlyAttribute() { const e = this._context.configuration.options; - !vy.enabled || e.get( + !zf.enabled || e.get( 34 /* EditorOption.domReadOnly */ ) && e.get( @@ -24463,35 +24463,35 @@ let yv = class extends wo { } prepareRender(e) { var t; - this._primaryCursorPosition = new V(this._selections[0].positionLineNumber, this._selections[0].positionColumn), this._primaryCursorVisibleRange = e.visibleRangeForPosition(this._primaryCursorPosition), (t = this._visibleTextArea) == null || t.prepareRender(e); + this._primaryCursorPosition = new Y(this._selections[0].positionLineNumber, this._selections[0].positionColumn), this._primaryCursorVisibleRange = e.visibleRangeForPosition(this._primaryCursorPosition), (t = this._visibleTextArea) == null || t.prepareRender(e); } render(e) { this._textAreaInput.writeNativeTextAreaContent("render"), this._render(); } _render() { if (this._visibleTextArea) { - const i = this._visibleTextArea.visibleTextareaStart, n = this._visibleTextArea.visibleTextareaEnd, o = this._visibleTextArea.startPosition, r = this._visibleTextArea.endPosition; - if (o && r && i && n && n.left >= this._scrollLeft && i.left <= this._scrollLeft + this._contentWidth) { - const l = this._context.viewLayout.getVerticalOffsetForLineNumber(this._primaryCursorPosition.lineNumber) - this._scrollTop, a = this._newlinecount(this.textArea.domNode.value.substr(0, this.textArea.domNode.selectionStart)); - let c = this._visibleTextArea.widthOfHiddenLineTextBefore, d = this._contentLeft + i.left - this._scrollLeft, h = n.left - i.left + 1; - if (d < this._contentLeft) { - const y = this._contentLeft - d; - d += y, c += y, h -= y; + const i = this._visibleTextArea.visibleTextareaStart, n = this._visibleTextArea.visibleTextareaEnd, o = this._visibleTextArea.startPosition, l = this._visibleTextArea.endPosition; + if (o && l && i && n && n.left >= this._scrollLeft && i.left <= this._scrollLeft + this._contentWidth) { + const r = this._context.viewLayout.getVerticalOffsetForLineNumber(this._primaryCursorPosition.lineNumber) - this._scrollTop, c = this._newlinecount(this.textArea.domNode.value.substr(0, this.textArea.domNode.selectionStart)); + let d = this._visibleTextArea.widthOfHiddenLineTextBefore, a = this._contentLeft + i.left - this._scrollLeft, h = n.left - i.left + 1; + if (a < this._contentLeft) { + const f = this._contentLeft - a; + a += f, d += f, h -= f; } h > this._contentWidth && (h = this._contentWidth); - const u = this._context.viewModel.getViewLineData(o.lineNumber), g = u.tokens.findTokenIndexAtOffset(o.column - 1), m = u.tokens.findTokenIndexAtOffset(r.column - 1), f = g === m, b = this._visibleTextArea.definePresentation(f ? u.tokens.getPresentation(g) : null); - this.textArea.domNode.scrollTop = a * this._lineHeight, this.textArea.domNode.scrollLeft = c, this._doRender({ + const u = this._context.viewModel.getViewLineData(o.lineNumber), m = u.tokens.findTokenIndexAtOffset(o.column - 1), b = u.tokens.findTokenIndexAtOffset(l.column - 1), g = m === b, Z = this._visibleTextArea.definePresentation(g ? u.tokens.getPresentation(m) : null); + this.textArea.domNode.scrollTop = c * this._lineHeight, this.textArea.domNode.scrollLeft = d, this._doRender({ lastRenderPosition: null, - top: l, - left: d, + top: r, + left: a, width: h, height: this._lineHeight, useCover: !1, - color: (Wi.getColorMap() || [])[b.foreground], - italic: b.italic, - bold: b.bold, - underline: b.underline, - strikethrough: b.strikethrough + color: (Ti.getColorMap() || [])[Z.foreground], + italic: Z.italic, + bold: Z.bold, + underline: Z.underline, + strikethrough: Z.strikethrough }); } return; @@ -24528,7 +24528,7 @@ let yv = class extends wo { top: t, left: this._textAreaWrapping ? this._contentLeft : e, width: this._textAreaWidth, - height: BN ? 0 : 1, + height: lR ? 0 : 1, useCover: !1 }); } @@ -24548,39 +24548,39 @@ let yv = class extends wo { top: 0, left: 0, width: this._textAreaWidth, - height: BN ? 0 : 1, + height: lR ? 0 : 1, useCover: !0 }); } _doRender(e) { this._lastRenderPosition = e.lastRenderPosition; const t = this.textArea, i = this.textAreaCover; - mn(t, this._fontInfo), t.setTop(e.top), t.setLeft(e.left), t.setWidth(e.width), t.setHeight(e.height), t.setColor(e.color ? K.Format.CSS.formatHex(e.color) : ""), t.setFontStyle(e.italic ? "italic" : ""), e.bold && t.setFontWeight("bold"), t.setTextDecoration(`${e.underline ? " underline" : ""}${e.strikethrough ? " line-through" : ""}`), i.setTop(e.useCover ? e.top : 0), i.setLeft(e.useCover ? e.left : 0), i.setWidth(e.useCover ? e.width : 0), i.setHeight(e.useCover ? e.height : 0); + pn(t, this._fontInfo), t.setTop(e.top), t.setLeft(e.left), t.setWidth(e.width), t.setHeight(e.height), t.setColor(e.color ? Q.Format.CSS.formatHex(e.color) : ""), t.setFontStyle(e.italic ? "italic" : ""), e.bold && t.setFontWeight("bold"), t.setTextDecoration(`${e.underline ? " underline" : ""}${e.strikethrough ? " line-through" : ""}`), i.setTop(e.useCover ? e.top : 0), i.setLeft(e.useCover ? e.left : 0), i.setWidth(e.useCover ? e.width : 0), i.setHeight(e.useCover ? e.height : 0); const n = this._context.configuration.options; n.get( 57 /* EditorOption.glyphMargin */ - ) ? i.setClassName("monaco-editor-background textAreaCover " + DA.OUTER_CLASS_NAME) : n.get( + ) ? i.setClassName("monaco-editor-background textAreaCover " + _V.OUTER_CLASS_NAME) : n.get( 68 /* EditorOption.lineNumbers */ - ).renderType !== 0 ? i.setClassName("monaco-editor-background textAreaCover " + TA.CLASS_NAME) : i.setClassName("monaco-editor-background textAreaCover"); + ).renderType !== 0 ? i.setClassName("monaco-editor-background textAreaCover " + BV.CLASS_NAME) : i.setClassName("monaco-editor-background textAreaCover"); } }; -yv = ore([ - jF(3, xt), - jF(4, Se) -], yv); -function lre(s, e, t, i) { +Ew = jle([ + XF(3, Lt), + XF(4, Ge) +], Ew); +function $le(s, e, t, i) { if (e.length === 0) return 0; const n = s.createElement("div"); n.style.position = "absolute", n.style.top = "-50000px", n.style.width = "50000px"; const o = s.createElement("span"); - mn(o, t), o.style.whiteSpace = "pre", o.style.tabSize = `${i * t.spaceWidth}px`, o.append(e), n.appendChild(o), s.body.appendChild(n); - const r = o.offsetWidth; - return n.remove(), r; + pn(o, t), o.style.whiteSpace = "pre", o.style.tabSize = `${i * t.spaceWidth}px`, o.append(e), n.appendChild(o), s.body.appendChild(n); + const l = o.offsetWidth; + return n.remove(), l; } -class are { +class ere { constructor(e, t, i, n) { this.configuration = e, this.viewModel = t, this.userInputEvents = i, this.commandDelegate = n; } @@ -24603,14 +24603,14 @@ class are { this.commandDelegate.cut(); } setSelection(e) { - ji.SetSelection.runCoreEditorCommand(this.viewModel, { + qi.SetSelection.runCoreEditorCommand(this.viewModel, { source: "keyboard", selection: e }); } _validateViewColumn(e) { const t = this.viewModel.getLineMinColumn(e.lineNumber); - return e.column < t ? new V(e.lineNumber, t) : e; + return e.column < t ? new Y(e.lineNumber, t) : e; } _hasMulticursorModifier(e) { switch (this.configuration.options.get( @@ -24661,13 +24661,13 @@ class are { }; } moveTo(e, t) { - ji.MoveTo.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); + qi.MoveTo.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); } _moveToSelect(e, t) { - ji.MoveToSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); + qi.MoveToSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); } _columnSelect(e, t, i) { - e = this._validateViewColumn(e), ji.ColumnSelect.runCoreEditorCommand(this.viewModel, { + e = this._validateViewColumn(e), qi.ColumnSelect.runCoreEditorCommand(this.viewModel, { source: "mouse", position: this._convertViewToModelPosition(e), viewPosition: e, @@ -24676,7 +24676,7 @@ class are { }); } _createCursor(e, t) { - e = this._validateViewColumn(e), ji.CreateCursor.runCoreEditorCommand(this.viewModel, { + e = this._validateViewColumn(e), qi.CreateCursor.runCoreEditorCommand(this.viewModel, { source: "mouse", position: this._convertViewToModelPosition(e), viewPosition: e, @@ -24684,31 +24684,31 @@ class are { }); } _lastCursorMoveToSelect(e, t) { - ji.LastCursorMoveToSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); + qi.LastCursorMoveToSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); } _wordSelect(e, t) { - ji.WordSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); + qi.WordSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); } _wordSelectDrag(e, t) { - ji.WordSelectDrag.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); + qi.WordSelectDrag.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); } _lastCursorWordSelect(e, t) { - ji.LastCursorWordSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); + qi.LastCursorWordSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); } _lineSelect(e, t) { - ji.LineSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); + qi.LineSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); } _lineSelectDrag(e, t) { - ji.LineSelectDrag.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); + qi.LineSelectDrag.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); } _lastCursorLineSelect(e, t) { - ji.LastCursorLineSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); + qi.LastCursorLineSelect.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); } _lastCursorLineSelectDrag(e, t) { - ji.LastCursorLineSelectDrag.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); + qi.LastCursorLineSelectDrag.runCoreEditorCommand(this.viewModel, this._usualArgs(e, t)); } _selectAll() { - ji.SelectAll.runCoreEditorCommand(this.viewModel, { source: "mouse" }); + qi.SelectAll.runCoreEditorCommand(this.viewModel, { source: "mouse" }); } // ---------------------- _convertViewToModelPosition(e) { @@ -24748,24 +24748,24 @@ class are { this.userInputEvents.emitMouseWheel(e); } } -function nd(s, e) { +function ra(s, e) { var i; const t = globalThis.MonacoEnvironment; if (t != null && t.createTrustedTypesPolicy) try { return t.createTrustedTypesPolicy(s, e); } catch (n) { - De(n); + Me(n); return; } try { return (i = globalThis.trustedTypes) == null ? void 0 : i.createPolicy(s, e); } catch (n) { - De(n); + Me(n); return; } } -class VU { +class gQ { constructor(e) { this._lineFactory = e, this._set(1, []); } @@ -24799,7 +24799,7 @@ class VU { getLine(e) { const t = e - this._rendLineNumberStart; if (t < 0 || t >= this._lines.length) - throw new mt("Illegal value for lineNumber"); + throw new bt("Illegal value for lineNumber"); return this._lines[t]; } /** @@ -24810,31 +24810,31 @@ class VU { return null; const i = this.getStartLineNumber(), n = this.getEndLineNumber(); if (t < i) { - const a = t - e + 1; - return this._rendLineNumberStart -= a, null; + const c = t - e + 1; + return this._rendLineNumberStart -= c, null; } if (e > n) return null; - let o = 0, r = 0; - for (let a = i; a <= n; a++) { - const c = a - this._rendLineNumberStart; - e <= a && a <= t && (r === 0 ? (o = c, r = 1) : r++); + let o = 0, l = 0; + for (let c = i; c <= n; c++) { + const d = c - this._rendLineNumberStart; + e <= c && c <= t && (l === 0 ? (o = d, l = 1) : l++); } if (e < i) { - let a = 0; - t < i ? a = t - e + 1 : a = i - e, this._rendLineNumberStart -= a; + let c = 0; + t < i ? c = t - e + 1 : c = i - e, this._rendLineNumberStart -= c; } - return this._lines.splice(o, r); + return this._lines.splice(o, l); } onLinesChanged(e, t) { const i = e + t - 1; if (this.getCount() === 0) return !1; const n = this.getStartLineNumber(), o = this.getEndLineNumber(); - let r = !1; - for (let l = e; l <= i; l++) - l >= n && l <= o && (this._lines[l - this._rendLineNumberStart].onContentChanged(), r = !0); - return r; + let l = !1; + for (let r = e; r <= i; r++) + r >= n && r <= o && (this._lines[r - this._rendLineNumberStart].onContentChanged(), l = !0); + return l; } onLinesInserted(e, t) { if (this.getCount() === 0) @@ -24846,36 +24846,36 @@ class VU { return null; if (i + e > o) return this._lines.splice(e - this._rendLineNumberStart, o - e + 1); - const r = []; + const l = []; for (let h = 0; h < i; h++) - r[h] = this._lineFactory.createLine(); - const l = e - this._rendLineNumberStart, a = this._lines.slice(0, l), c = this._lines.slice(l, this._lines.length - i), d = this._lines.slice(this._lines.length - i, this._lines.length); - return this._lines = a.concat(r).concat(c), d; + l[h] = this._lineFactory.createLine(); + const r = e - this._rendLineNumberStart, c = this._lines.slice(0, r), d = this._lines.slice(r, this._lines.length - i), a = this._lines.slice(this._lines.length - i, this._lines.length); + return this._lines = c.concat(l).concat(d), a; } onTokensChanged(e) { if (this.getCount() === 0) return !1; const t = this.getStartLineNumber(), i = this.getEndLineNumber(); let n = !1; - for (let o = 0, r = e.length; o < r; o++) { - const l = e[o]; - if (l.toLineNumber < t || l.fromLineNumber > i) + for (let o = 0, l = e.length; o < l; o++) { + const r = e[o]; + if (r.toLineNumber < t || r.fromLineNumber > i) continue; - const a = Math.max(t, l.fromLineNumber), c = Math.min(i, l.toLineNumber); - for (let d = a; d <= c; d++) { - const h = d - this._rendLineNumberStart; + const c = Math.max(t, r.fromLineNumber), d = Math.min(i, r.toLineNumber); + for (let a = c; a <= d; a++) { + const h = a - this._rendLineNumberStart; this._lines[h].onTokensChanged(), n = !0; } } return n; } } -class kU { +class ZQ { constructor(e) { - this._lineFactory = e, this.domNode = this._createDomNode(), this._linesCollection = new VU(this._lineFactory); + this._lineFactory = e, this.domNode = this._createDomNode(), this._linesCollection = new gQ(this._lineFactory); } _createDomNode() { - const e = yt(document.createElement("div")); + const e = ft(document.createElement("div")); return e.setClassName("view-layer"), e.setPosition("absolute"), e.domNode.setAttribute("role", "presentation"), e.domNode.setAttribute("aria-hidden", "true"), e; } // ---- begin view event handlers @@ -24929,7 +24929,7 @@ class kU { return this._linesCollection.getLine(e); } renderLines(e) { - const t = this._linesCollection._get(), i = new wv(this.domNode.domNode, this._lineFactory, e), n = { + const t = this._linesCollection._get(), i = new Dw(this.domNode.domNode, this._lineFactory, e), n = { rendLineNumberStart: t.rendLineNumberStart, lines: t.lines, linesLength: t.lines.length @@ -24937,7 +24937,7 @@ class kU { this._linesCollection._set(o.rendLineNumberStart, o.lines); } } -const dc = class dc { +const bd = class bd { constructor(e, t, i) { this._domNode = e, this._lineFactory = t, this._viewportData = i; } @@ -24949,39 +24949,39 @@ const dc = class dc { }; if (o.rendLineNumberStart + o.linesLength - 1 < t || i < o.rendLineNumberStart) { o.rendLineNumberStart = t, o.linesLength = i - t + 1, o.lines = []; - for (let r = t; r <= i; r++) - o.lines[r - t] = this._lineFactory.createLine(); + for (let l = t; l <= i; l++) + o.lines[l - t] = this._lineFactory.createLine(); return this._finishRendering(o, !0, n), o; } if (this._renderUntouchedLines(o, Math.max(t - o.rendLineNumberStart, 0), Math.min(i - o.rendLineNumberStart, o.linesLength - 1), n, t), o.rendLineNumberStart > t) { - const r = t, l = Math.min(i, o.rendLineNumberStart - 1); - r <= l && (this._insertLinesBefore(o, r, l, n, t), o.linesLength += l - r + 1); + const l = t, r = Math.min(i, o.rendLineNumberStart - 1); + l <= r && (this._insertLinesBefore(o, l, r, n, t), o.linesLength += r - l + 1); } else if (o.rendLineNumberStart < t) { - const r = Math.min(o.linesLength, t - o.rendLineNumberStart); - r > 0 && (this._removeLinesBefore(o, r), o.linesLength -= r); + const l = Math.min(o.linesLength, t - o.rendLineNumberStart); + l > 0 && (this._removeLinesBefore(o, l), o.linesLength -= l); } if (o.rendLineNumberStart = t, o.rendLineNumberStart + o.linesLength - 1 < i) { - const r = o.rendLineNumberStart + o.linesLength, l = i; - r <= l && (this._insertLinesAfter(o, r, l, n, t), o.linesLength += l - r + 1); + const l = o.rendLineNumberStart + o.linesLength, r = i; + l <= r && (this._insertLinesAfter(o, l, r, n, t), o.linesLength += r - l + 1); } else if (o.rendLineNumberStart + o.linesLength - 1 > i) { - const r = Math.max(0, i - o.rendLineNumberStart + 1), a = o.linesLength - 1 - r + 1; - a > 0 && (this._removeLinesAfter(o, a), o.linesLength -= a); + const l = Math.max(0, i - o.rendLineNumberStart + 1), c = o.linesLength - 1 - l + 1; + c > 0 && (this._removeLinesAfter(o, c), o.linesLength -= c); } return this._finishRendering(o, !1, n), o; } _renderUntouchedLines(e, t, i, n, o) { - const r = e.rendLineNumberStart, l = e.lines; - for (let a = t; a <= i; a++) { - const c = r + a; - l[a].layoutLine(c, n[c - o], this._viewportData.lineHeight); + const l = e.rendLineNumberStart, r = e.lines; + for (let c = t; c <= i; c++) { + const d = l + c; + r[c].layoutLine(d, n[d - o], this._viewportData.lineHeight); } } _insertLinesBefore(e, t, i, n, o) { - const r = []; - let l = 0; - for (let a = t; a <= i; a++) - r[l++] = this._lineFactory.createLine(); - e.lines = r.concat(e.lines); + const l = []; + let r = 0; + for (let c = t; c <= i; c++) + l[r++] = this._lineFactory.createLine(); + e.lines = l.concat(e.lines); } _removeLinesBefore(e, t) { for (let i = 0; i < t; i++) { @@ -24991,11 +24991,11 @@ const dc = class dc { e.lines.splice(0, t); } _insertLinesAfter(e, t, i, n, o) { - const r = []; - let l = 0; - for (let a = t; a <= i; a++) - r[l++] = this._lineFactory.createLine(); - e.lines = e.lines.concat(r); + const l = []; + let r = 0; + for (let c = t; c <= i; c++) + l[r++] = this._lineFactory.createLine(); + e.lines = e.lines.concat(l); } _removeLinesAfter(e, t) { const i = e.linesLength - t; @@ -25006,61 +25006,61 @@ const dc = class dc { e.lines.splice(i, t); } _finishRenderingNewLines(e, t, i, n) { - dc._ttPolicy && (i = dc._ttPolicy.createHTML(i)); + bd._ttPolicy && (i = bd._ttPolicy.createHTML(i)); const o = this._domNode.lastChild; t || !o ? this._domNode.innerHTML = i : o.insertAdjacentHTML("afterend", i); - let r = this._domNode.lastChild; - for (let l = e.linesLength - 1; l >= 0; l--) { - const a = e.lines[l]; - n[l] && (a.setDomNode(r), r = r.previousSibling); + let l = this._domNode.lastChild; + for (let r = e.linesLength - 1; r >= 0; r--) { + const c = e.lines[r]; + n[r] && (c.setDomNode(l), l = l.previousSibling); } } _finishRenderingInvalidLines(e, t, i) { const n = document.createElement("div"); - dc._ttPolicy && (t = dc._ttPolicy.createHTML(t)), n.innerHTML = t; + bd._ttPolicy && (t = bd._ttPolicy.createHTML(t)), n.innerHTML = t; for (let o = 0; o < e.linesLength; o++) { - const r = e.lines[o]; + const l = e.lines[o]; if (i[o]) { - const l = n.firstChild, a = r.getDomNode(); - a.parentNode.replaceChild(l, a), r.setDomNode(l); + const r = n.firstChild, c = l.getDomNode(); + c.parentNode.replaceChild(r, c), l.setDomNode(r); } } } _finishRendering(e, t, i) { - const n = dc._sb, o = e.linesLength, r = e.lines, l = e.rendLineNumberStart, a = []; + const n = bd._sb, o = e.linesLength, l = e.lines, r = e.rendLineNumberStart, c = []; { n.reset(); - let c = !1; - for (let d = 0; d < o; d++) { - const h = r[d]; - a[d] = !1, !(h.getDomNode() || !h.renderLine(d + l, i[d], this._viewportData.lineHeight, this._viewportData, n)) && (a[d] = !0, c = !0); + let d = !1; + for (let a = 0; a < o; a++) { + const h = l[a]; + c[a] = !1, !(h.getDomNode() || !h.renderLine(a + r, i[a], this._viewportData.lineHeight, this._viewportData, n)) && (c[a] = !0, d = !0); } - c && this._finishRenderingNewLines(e, t, n.build(), a); + d && this._finishRenderingNewLines(e, t, n.build(), c); } { n.reset(); - let c = !1; - const d = []; + let d = !1; + const a = []; for (let h = 0; h < o; h++) { - const u = r[h]; - d[h] = !1, !(a[h] || !u.renderLine(h + l, i[h], this._viewportData.lineHeight, this._viewportData, n)) && (d[h] = !0, c = !0); + const u = l[h]; + a[h] = !1, !(c[h] || !u.renderLine(h + r, i[h], this._viewportData.lineHeight, this._viewportData, n)) && (a[h] = !0, d = !0); } - c && this._finishRenderingInvalidLines(e, n.build(), d); + d && this._finishRenderingInvalidLines(e, n.build(), a); } } }; -dc._ttPolicy = nd("editorViewLayer", { createHTML: (e) => e }), dc._sb = new e0(1e5); -let wv = dc; -class GU extends wo { +bd._ttPolicy = ra("editorViewLayer", { createHTML: (e) => e }), bd._sb = new l0(1e5); +let Dw = bd; +class fQ extends Go { constructor(e) { - super(e), this._dynamicOverlays = [], this._isFocused = !1, this._visibleLines = new kU({ - createLine: () => new cre(this._dynamicOverlays) + super(e), this._dynamicOverlays = [], this._isFocused = !1, this._visibleLines = new ZQ({ + createLine: () => new tre(this._dynamicOverlays) }), this.domNode = this._visibleLines.domNode; const i = this._context.configuration.options.get( 50 /* EditorOption.fontInfo */ ); - mn(this.domNode, i), this.domNode.setClassName("view-overlays"); + pn(this.domNode, i), this.domNode.setClassName("view-overlays"); } shouldRender() { if (super.shouldRender()) @@ -25089,7 +25089,7 @@ class GU extends wo { 50 /* EditorOption.fontInfo */ ); - return mn(this.domNode, i), !0; + return pn(this.domNode, i), !0; } onFlushed(e) { return this._visibleLines.onFlushed(e); @@ -25130,7 +25130,7 @@ class GU extends wo { this._visibleLines.renderLines(e.viewportData); } } -class cre { +class tre { constructor(e) { this._dynamicOverlays = e, this._domNode = null, this._renderedContent = null; } @@ -25138,25 +25138,25 @@ class cre { return this._domNode ? this._domNode.domNode : null; } setDomNode(e) { - this._domNode = yt(e); + this._domNode = ft(e); } onContentChanged() { } onTokensChanged() { } renderLine(e, t, i, n, o) { - let r = ""; - for (let l = 0, a = this._dynamicOverlays.length; l < a; l++) { - const c = this._dynamicOverlays[l]; - r += c.render(n.startLineNumber, e); + let l = ""; + for (let r = 0, c = this._dynamicOverlays.length; r < c; r++) { + const d = this._dynamicOverlays[r]; + l += d.render(n.startLineNumber, e); } - return this._renderedContent === r ? !1 : (this._renderedContent = r, o.appendString('
'), o.appendString(r), o.appendString("
"), !0); + return this._renderedContent === l ? !1 : (this._renderedContent = l, o.appendString('
'), o.appendString(l), o.appendString("
"), !0); } layoutLine(e, t, i) { this._domNode && (this._domNode.setTop(t), this._domNode.setHeight(i)); } } -class dre extends GU { +class ire extends fQ { constructor(e) { super(e); const i = this._context.configuration.options.get( @@ -25181,21 +25181,21 @@ class dre extends GU { super._viewOverlaysRender(e), this.domNode.setWidth(Math.max(e.scrollWidth, this._contentWidth)); } } -class hre extends GU { +class nre extends fQ { constructor(e) { super(e); const t = this._context.configuration.options, i = t.get( 146 /* EditorOption.layoutInfo */ ); - this._contentLeft = i.contentLeft, this.domNode.setClassName("margin-view-overlays"), this.domNode.setWidth(1), mn(this.domNode, t.get( + this._contentLeft = i.contentLeft, this.domNode.setClassName("margin-view-overlays"), this.domNode.setWidth(1), pn(this.domNode, t.get( 50 /* EditorOption.fontInfo */ )); } onConfigurationChanged(e) { const t = this._context.configuration.options; - mn(this.domNode, t.get( + pn(this.domNode, t.get( 50 /* EditorOption.fontInfo */ )); @@ -25214,7 +25214,7 @@ class hre extends GU { this.domNode.setHeight(t), this.domNode.setWidth(this._contentLeft); } } -class pI { +class Nx { constructor(e) { this.onKeyDown = null, this.onKeyUp = null, this.onContextMenu = null, this.onMouseMove = null, this.onMouseLeave = null, this.onMouseDown = null, this.onMouseUp = null, this.onMouseDrag = null, this.onMouseDrop = null, this.onMouseDropCanceled = null, this.onMouseWheel = null, this._coordinatesConverter = e; } @@ -25269,7 +25269,7 @@ class pI { } : e; } _convertViewToModelMouseTarget(e) { - return pI.convertViewToModelMouseTarget(e, this._coordinatesConverter); + return Nx.convertViewToModelMouseTarget(e, this._coordinatesConverter); } static convertViewToModelMouseTarget(e, t) { const i = { ...e }; @@ -25281,13 +25281,13 @@ class pI { positionBefore: e.positionBefore ? t.convertViewPositionToModelPosition(e.positionBefore) : e.positionBefore, positionAfter: e.positionAfter ? t.convertViewPositionToModelPosition(e.positionAfter) : e.positionAfter, position: t.convertViewPositionToModelPosition(e.position), - afterLineNumber: t.convertViewPositionToModelPosition(new V(e.afterLineNumber, 1)).lineNumber + afterLineNumber: t.convertViewPositionToModelPosition(new Y(e.afterLineNumber, 1)).lineNumber }; } } -class ure extends wo { +class sre extends Go { constructor(e) { - super(e), this.blocks = [], this.contentWidth = -1, this.contentLeft = 0, this.domNode = yt(document.createElement("div")), this.domNode.setAttribute("role", "presentation"), this.domNode.setAttribute("aria-hidden", "true"), this.domNode.setClassName("blockDecorations-container"), this.update(); + super(e), this.blocks = [], this.contentWidth = -1, this.contentLeft = 0, this.domNode = ft(document.createElement("div")), this.domNode.setAttribute("role", "presentation"), this.domNode.setAttribute("aria-hidden", "true"), this.domNode.setClassName("blockDecorations-container"), this.update(); } update() { let e = !1; @@ -25325,24 +25325,24 @@ class ure extends wo { if (!n.options.blockClassName) continue; let o = this.blocks[t]; - o || (o = this.blocks[t] = yt(document.createElement("div")), this.domNode.appendChild(o)); - let r, l; - n.options.blockIsAfterEnd ? (r = e.getVerticalOffsetAfterLineNumber(n.range.endLineNumber, !1), l = e.getVerticalOffsetAfterLineNumber(n.range.endLineNumber, !0)) : (r = e.getVerticalOffsetForLineNumber(n.range.startLineNumber, !0), l = n.range.isEmpty() && !n.options.blockDoesNotCollapse ? e.getVerticalOffsetForLineNumber(n.range.startLineNumber, !1) : e.getVerticalOffsetAfterLineNumber(n.range.endLineNumber, !0)); - const [a, c, d, h] = n.options.blockPadding ?? [0, 0, 0, 0]; - o.setClassName("blockDecorations-block " + n.options.blockClassName), o.setLeft(this.contentLeft - h), o.setWidth(this.contentWidth + h + c), o.setTop(r - e.scrollTop - a), o.setHeight(l - r + a + d), t++; + o || (o = this.blocks[t] = ft(document.createElement("div")), this.domNode.appendChild(o)); + let l, r; + n.options.blockIsAfterEnd ? (l = e.getVerticalOffsetAfterLineNumber(n.range.endLineNumber, !1), r = e.getVerticalOffsetAfterLineNumber(n.range.endLineNumber, !0)) : (l = e.getVerticalOffsetForLineNumber(n.range.startLineNumber, !0), r = n.range.isEmpty() && !n.options.blockDoesNotCollapse ? e.getVerticalOffsetForLineNumber(n.range.startLineNumber, !1) : e.getVerticalOffsetAfterLineNumber(n.range.endLineNumber, !0)); + const [c, d, a, h] = n.options.blockPadding ?? [0, 0, 0, 0]; + o.setClassName("blockDecorations-block " + n.options.blockClassName), o.setLeft(this.contentLeft - h), o.setWidth(this.contentWidth + h + d), o.setTop(l - e.scrollTop - c), o.setHeight(r - l + c + a), t++; } for (let n = t; n < this.blocks.length; n++) this.blocks[n].domNode.remove(); this.blocks.length = t; } } -class gre extends wo { +class ore extends Go { constructor(e, t) { - super(e), this._viewDomNode = t, this._widgets = {}, this.domNode = yt(document.createElement("div")), Tl.write( + super(e), this._viewDomNode = t, this._widgets = {}, this.domNode = ft(document.createElement("div")), vr.write( this.domNode, 1 /* PartFingerprint.ContentWidgets */ - ), this.domNode.setClassName("contentWidgets"), this.domNode.setPosition("absolute"), this.domNode.setTop(0), this.overflowingContentWidgetsDomNode = yt(document.createElement("div")), Tl.write( + ), this.domNode.setClassName("contentWidgets"), this.domNode.setPosition("absolute"), this.domNode.setTop(0), this.overflowingContentWidgetsDomNode = ft(document.createElement("div")), vr.write( this.overflowingContentWidgetsDomNode, 2 /* PartFingerprint.OverflowingContentWidgets */ @@ -25389,7 +25389,7 @@ class gre extends wo { this._widgets[t].updateAnchorViewPosition(); } addWidget(e) { - const t = new mre(this._context, this._viewDomNode, e); + const t = new lre(this._context, this._viewDomNode, e); this._widgets[t.id] = t, t.allowEditorOverflow ? this.overflowingContentWidgetsDomNode.appendChild(t.domNode) : this.domNode.appendChild(t.domNode), this.setShouldRender(); } setWidgetPosition(e, t, i, n, o) { @@ -25423,9 +25423,9 @@ class gre extends wo { this._widgets[i].render(e); } } -class mre { +class lre { constructor(e, t, i) { - this._primaryAnchor = new k0(null, null), this._secondaryAnchor = new k0(null, null), this._context = e, this._viewDomNode = t, this._actual = i, this.domNode = yt(this._actual.getDomNode()), this.id = this._actual.getId(), this.allowEditorOverflow = this._actual.allowEditorOverflow || !1, this.suppressMouseDown = this._actual.suppressMouseDown || !1; + this._primaryAnchor = new z0(null, null), this._secondaryAnchor = new z0(null, null), this._context = e, this._viewDomNode = t, this._actual = i, this.domNode = ft(this._actual.getDomNode()), this.id = this._actual.getId(), this.allowEditorOverflow = this._actual.allowEditorOverflow || !1, this.suppressMouseDown = this._actual.suppressMouseDown || !1; const n = this._context.configuration.options, o = n.get( 146 /* EditorOption.layoutInfo */ @@ -25459,15 +25459,15 @@ class mre { } _setPosition(e, t, i) { this._affinity = e, this._primaryAnchor = n(t, this._context.viewModel, this._affinity), this._secondaryAnchor = n(i, this._context.viewModel, this._affinity); - function n(o, r, l) { + function n(o, l, r) { if (!o) - return new k0(null, null); - const a = r.model.validatePosition(o); - if (r.coordinatesConverter.modelPositionIsVisible(a)) { - const c = r.coordinatesConverter.convertModelPositionToViewPosition(a, l ?? void 0); - return new k0(o, c); + return new z0(null, null); + const c = l.model.validatePosition(o); + if (l.coordinatesConverter.modelPositionIsVisible(c)) { + const d = l.coordinatesConverter.convertModelPositionToViewPosition(c, r ?? void 0); + return new z0(o, d); } - return new k0(o, null); + return new z0(o, null); } } _getMaxWidth() { @@ -25478,35 +25478,35 @@ class mre { this._setPosition(n, e, t), this._preference = i, this._primaryAnchor.viewPosition && this._preference && this._preference.length > 0 ? this.domNode.setDisplay("block") : this.domNode.setDisplay("none"), this._cachedDomNodeOffsetWidth = -1, this._cachedDomNodeOffsetHeight = -1; } _layoutBoxInViewport(e, t, i, n) { - const o = e.top, r = o, l = e.top + e.height, a = n.viewportHeight - l, c = o - i, d = r >= i, h = l, u = a >= i; - let g = e.left; - return g + t > n.scrollLeft + n.viewportWidth && (g = n.scrollLeft + n.viewportWidth - t), g < n.scrollLeft && (g = n.scrollLeft), { fitsAbove: d, aboveTop: c, fitsBelow: u, belowTop: h, left: g }; + const o = e.top, l = o, r = e.top + e.height, c = n.viewportHeight - r, d = o - i, a = l >= i, h = r, u = c >= i; + let m = e.left; + return m + t > n.scrollLeft + n.viewportWidth && (m = n.scrollLeft + n.viewportWidth - t), m < n.scrollLeft && (m = n.scrollLeft), { fitsAbove: a, aboveTop: d, fitsBelow: u, belowTop: h, left: m }; } _layoutHorizontalSegmentInPage(e, t, i, n) { - const l = Math.max(15, t.left - n), a = Math.min(t.left + t.width + n, e.width - 15), d = this._viewDomNode.domNode.ownerDocument.defaultView; - let h = t.left + i - ((d == null ? void 0 : d.scrollX) ?? 0); - if (h + n > a) { - const u = h - (a - n); + const r = Math.max(15, t.left - n), c = Math.min(t.left + t.width + n, e.width - 15), a = this._viewDomNode.domNode.ownerDocument.defaultView; + let h = t.left + i - ((a == null ? void 0 : a.scrollX) ?? 0); + if (h + n > c) { + const u = h - (c - n); h -= u, i -= u; } - if (h < l) { - const u = h - l; + if (h < r) { + const u = h - r; h -= u, i -= u; } return [i, h]; } _layoutBoxInPage(e, t, i, n) { - const o = e.top - i, r = e.top + e.height, l = yi(this._viewDomNode.domNode), a = this._viewDomNode.domNode.ownerDocument, c = a.defaultView, d = l.top + o - ((c == null ? void 0 : c.scrollY) ?? 0), h = l.top + r - ((c == null ? void 0 : c.scrollY) ?? 0), u = Wh(a.body), [g, m] = this._layoutHorizontalSegmentInPage(u, l, e.left - n.scrollLeft + this._contentLeft, t), f = 22, b = 22, y = d >= f, w = h + i <= u.height - b; + const o = e.top - i, l = e.top + e.height, r = yi(this._viewDomNode.domNode), c = this._viewDomNode.domNode.ownerDocument, d = c.defaultView, a = r.top + o - ((d == null ? void 0 : d.scrollY) ?? 0), h = r.top + l - ((d == null ? void 0 : d.scrollY) ?? 0), u = Yh(c.body), [m, b] = this._layoutHorizontalSegmentInPage(u, r, e.left - n.scrollLeft + this._contentLeft, t), g = 22, Z = 22, f = a >= g, y = h + i <= u.height - Z; return this._fixedOverflowWidgets ? { - fitsAbove: y, - aboveTop: Math.max(d, f), - fitsBelow: w, + fitsAbove: f, + aboveTop: Math.max(a, g), + fitsBelow: y, belowTop: h, - left: m - } : { fitsAbove: y, aboveTop: o, fitsBelow: w, belowTop: r, left: g }; + left: b + } : { fitsAbove: f, aboveTop: o, fitsBelow: y, belowTop: l, left: m }; } _prepareRenderWidgetAtExactPositionOverflowing(e) { - return new G0(e.top, e.left + this._contentLeft); + return new A0(e.top, e.left + this._contentLeft); } /** * Compute the coordinates above and below the primary and secondary anchors. @@ -25514,17 +25514,17 @@ class mre { * The content widget should touch if possible the secondary anchor. */ _getAnchorsCoordinates(e) { - var r, l; - const t = o(this._primaryAnchor.viewPosition, this._affinity, this._lineHeight), i = ((r = this._secondaryAnchor.viewPosition) == null ? void 0 : r.lineNumber) === ((l = this._primaryAnchor.viewPosition) == null ? void 0 : l.lineNumber) ? this._secondaryAnchor.viewPosition : null, n = o(i, this._affinity, this._lineHeight); + var l, r; + const t = o(this._primaryAnchor.viewPosition, this._affinity, this._lineHeight), i = ((l = this._secondaryAnchor.viewPosition) == null ? void 0 : l.lineNumber) === ((r = this._primaryAnchor.viewPosition) == null ? void 0 : r.lineNumber) ? this._secondaryAnchor.viewPosition : null, n = o(i, this._affinity, this._lineHeight); return { primary: t, secondary: n }; - function o(a, c, d) { - if (!a) + function o(c, d, a) { + if (!c) return null; - const h = e.visibleRangeForPosition(a); + const h = e.visibleRangeForPosition(c); if (!h) return null; - const u = a.column === 1 && c === 3 ? 0 : h.left, g = e.getVerticalOffsetForLineNumber(a.lineNumber) - e.scrollTop; - return new qF(g, u, d); + const u = c.column === 1 && d === 3 ? 0 : h.left, m = e.getVerticalOffsetForLineNumber(c.lineNumber) - e.scrollTop; + return new VF(m, u, a); } } _reduceAnchorCoordinates(e, t, i) { @@ -25535,7 +25535,7 @@ class mre { /* EditorOption.fontInfo */ ); let o = t.left; - return o < e.left ? o = Math.max(o, e.left - i + n.typicalFullwidthCharacterWidth) : o = Math.min(o, e.left + i - n.typicalFullwidthCharacterWidth), new qF(e.top, o, e.height); + return o < e.left ? o = Math.max(o, e.left - i + n.typicalFullwidthCharacterWidth) : o = Math.min(o, e.left + i - n.typicalFullwidthCharacterWidth), new VF(e.top, o, e.height); } _prepareRenderWidget(e) { if (!this._preference || this._preference.length === 0) @@ -25547,48 +25547,48 @@ class mre { preserveFocus: this.domNode.domNode.contains(this.domNode.domNode.ownerDocument.activeElement) }; if (this._cachedDomNodeOffsetWidth === -1 || this._cachedDomNodeOffsetHeight === -1) { - let r = null; - if (typeof this._actual.beforeRender == "function" && (r = ON(this._actual.beforeRender, this._actual)), r) - this._cachedDomNodeOffsetWidth = r.width, this._cachedDomNodeOffsetHeight = r.height; + let l = null; + if (typeof this._actual.beforeRender == "function" && (l = rR(this._actual.beforeRender, this._actual)), l) + this._cachedDomNodeOffsetWidth = l.width, this._cachedDomNodeOffsetHeight = l.height; else { - const a = this.domNode.domNode.getBoundingClientRect(); - this._cachedDomNodeOffsetWidth = Math.round(a.width), this._cachedDomNodeOffsetHeight = Math.round(a.height); + const c = this.domNode.domNode.getBoundingClientRect(); + this._cachedDomNodeOffsetWidth = Math.round(c.width), this._cachedDomNodeOffsetHeight = Math.round(c.height); } } const n = this._reduceAnchorCoordinates(t, i, this._cachedDomNodeOffsetWidth); let o; this.allowEditorOverflow ? o = this._layoutBoxInPage(n, this._cachedDomNodeOffsetWidth, this._cachedDomNodeOffsetHeight, e) : o = this._layoutBoxInViewport(n, this._cachedDomNodeOffsetWidth, this._cachedDomNodeOffsetHeight, e); - for (let r = 1; r <= 2; r++) - for (const l of this._preference) - if (l === 1) { + for (let l = 1; l <= 2; l++) + for (const r of this._preference) + if (r === 1) { if (!o) return null; - if (r === 2 || o.fitsAbove) + if (l === 2 || o.fitsAbove) return { kind: "inViewport", - coordinate: new G0(o.aboveTop, o.left), + coordinate: new A0(o.aboveTop, o.left), position: 1 /* ContentWidgetPositionPreference.ABOVE */ }; - } else if (l === 2) { + } else if (r === 2) { if (!o) return null; - if (r === 2 || o.fitsBelow) + if (l === 2 || o.fitsBelow) return { kind: "inViewport", - coordinate: new G0(o.belowTop, o.left), + coordinate: new A0(o.belowTop, o.left), position: 2 /* ContentWidgetPositionPreference.BELOW */ }; } else return this.allowEditorOverflow ? { kind: "inViewport", - coordinate: this._prepareRenderWidgetAtExactPositionOverflowing(new G0(n.top, n.left)), + coordinate: this._prepareRenderWidgetAtExactPositionOverflowing(new A0(n.top, n.left)), position: 0 /* ContentWidgetPositionPreference.EXACT */ } : { kind: "inViewport", - coordinate: new G0(n.top, n.left), + coordinate: new A0(n.top, n.left), position: 0 /* ContentWidgetPositionPreference.EXACT */ }; @@ -25606,35 +25606,35 @@ class mre { render(e) { var t; if (!this._renderData || this._renderData.kind === "offViewport") { - this._isVisible && (this.domNode.removeAttribute("monaco-visible-content-widget"), this._isVisible = !1, ((t = this._renderData) == null ? void 0 : t.kind) === "offViewport" && this._renderData.preserveFocus ? this.domNode.setTop(-1e3) : this.domNode.setVisibility("hidden")), typeof this._actual.afterRender == "function" && ON(this._actual.afterRender, this._actual, null); + this._isVisible && (this.domNode.removeAttribute("monaco-visible-content-widget"), this._isVisible = !1, ((t = this._renderData) == null ? void 0 : t.kind) === "offViewport" && this._renderData.preserveFocus ? this.domNode.setTop(-1e3) : this.domNode.setVisibility("hidden")), typeof this._actual.afterRender == "function" && rR(this._actual.afterRender, this._actual, null); return; } - this.allowEditorOverflow ? (this.domNode.setTop(this._renderData.coordinate.top), this.domNode.setLeft(this._renderData.coordinate.left)) : (this.domNode.setTop(this._renderData.coordinate.top + e.scrollTop - e.bigNumbersDelta), this.domNode.setLeft(this._renderData.coordinate.left)), this._isVisible || (this.domNode.setVisibility("inherit"), this.domNode.setAttribute("monaco-visible-content-widget", "true"), this._isVisible = !0), typeof this._actual.afterRender == "function" && ON(this._actual.afterRender, this._actual, this._renderData.position); + this.allowEditorOverflow ? (this.domNode.setTop(this._renderData.coordinate.top), this.domNode.setLeft(this._renderData.coordinate.left)) : (this.domNode.setTop(this._renderData.coordinate.top + e.scrollTop - e.bigNumbersDelta), this.domNode.setLeft(this._renderData.coordinate.left)), this._isVisible || (this.domNode.setVisibility("inherit"), this.domNode.setAttribute("monaco-visible-content-widget", "true"), this._isVisible = !0), typeof this._actual.afterRender == "function" && rR(this._actual.afterRender, this._actual, this._renderData.position); } } -class k0 { +class z0 { constructor(e, t) { this.modelPosition = e, this.viewPosition = t; } } -class G0 { +class A0 { constructor(e, t) { this.top = e, this.left = t, this._coordinateBrand = void 0; } } -class qF { +class VF { constructor(e, t, i) { this.top = e, this.left = t, this.height = i, this._anchorCoordinateBrand = void 0; } } -function ON(s, e, ...t) { +function rR(s, e, ...t) { try { return s.call(e, ...t); } catch { return null; } } -class RU extends Xm { +class yQ extends Kb { constructor(e) { super(), this._context = e; const t = this._context.configuration.options, i = t.get( @@ -25647,7 +25647,7 @@ class RU extends Xm { ), this._renderLineHighlightOnlyWhenFocus = t.get( 98 /* EditorOption.renderLineHighlightOnlyWhenFocus */ - ), this._wordWrap = i.isViewportWrapping, this._contentLeft = i.contentLeft, this._contentWidth = i.contentWidth, this._selectionIsEmpty = !0, this._focused = !1, this._cursorLineNumbers = [1], this._selections = [new fe(1, 1, 1, 1)], this._renderData = null, this._context.addEventHandler(this); + ), this._wordWrap = i.isViewportWrapping, this._contentLeft = i.contentLeft, this._contentWidth = i.contentWidth, this._selectionIsEmpty = !0, this._focused = !1, this._cursorLineNumbers = [1], this._selections = [new ge(1, 1, 1, 1)], this._renderData = null, this._context.addEventHandler(this); } dispose() { this._context.removeEventHandler(this), super.dispose(); @@ -25658,7 +25658,7 @@ class RU extends Xm { for (const o of this._selections) t.add(o.positionLineNumber); const i = Array.from(t); - i.sort((o, r) => o - r), ei(this._cursorLineNumbers, i) || (this._cursorLineNumbers = i, e = !0); + i.sort((o, l) => o - l), ti(this._cursorLineNumbers, i) || (this._cursorLineNumbers = i, e = !0); const n = this._selections.every((o) => o.isEmpty()); return this._selectionIsEmpty !== n && (this._selectionIsEmpty = n, e = !0), e; } @@ -25707,26 +25707,26 @@ class RU extends Xm { return; } const t = e.visibleRange.startLineNumber, i = e.visibleRange.endLineNumber, n = []; - for (let r = t; r <= i; r++) { - const l = r - t; - n[l] = ""; + for (let l = t; l <= i; l++) { + const r = l - t; + n[r] = ""; } if (this._wordWrap) { - const r = this._renderOne(e, !1); - for (const l of this._cursorLineNumbers) { - const a = this._context.viewModel.coordinatesConverter, c = a.convertViewPositionToModelPosition(new V(l, 1)).lineNumber, d = a.convertModelPositionToViewPosition(new V(c, 1)).lineNumber, h = a.convertModelPositionToViewPosition(new V(c, this._context.viewModel.model.getLineMaxColumn(c))).lineNumber, u = Math.max(d, t), g = Math.min(h, i); - for (let m = u; m <= g; m++) { - const f = m - t; - n[f] = r; + const l = this._renderOne(e, !1); + for (const r of this._cursorLineNumbers) { + const c = this._context.viewModel.coordinatesConverter, d = c.convertViewPositionToModelPosition(new Y(r, 1)).lineNumber, a = c.convertModelPositionToViewPosition(new Y(d, 1)).lineNumber, h = c.convertModelPositionToViewPosition(new Y(d, this._context.viewModel.model.getLineMaxColumn(d))).lineNumber, u = Math.max(a, t), m = Math.min(h, i); + for (let b = u; b <= m; b++) { + const g = b - t; + n[g] = l; } } } const o = this._renderOne(e, !0); - for (const r of this._cursorLineNumbers) { - if (r < t || r > i) + for (const l of this._cursorLineNumbers) { + if (l < t || l > i) continue; - const l = r - t; - n[l] = o; + const r = l - t; + n[r] = o; } this._renderData = n; } @@ -25743,7 +25743,7 @@ class RU extends Xm { return (this._renderLineHighlight === "line" || this._renderLineHighlight === "all") && this._selectionIsEmpty && (!this._renderLineHighlightOnlyWhenFocus || this._focused); } } -class pre extends RU { +class rre extends yQ { _renderOne(e, t) { return `
`; } @@ -25754,7 +25754,7 @@ class pre extends RU { return this._shouldRenderInMargin(); } } -class fre extends RU { +class cre extends yQ { _renderOne(e, t) { return `
`; } @@ -25765,14 +25765,14 @@ class fre extends RU { return this._shouldRenderInContent(); } } -Lr((s, e) => { - const t = s.getColor(AU); - if (t && (e.addRule(`.monaco-editor .view-overlays .current-line { background-color: ${t}; }`), e.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { background-color: ${t}; border: none; }`)), !t || t.isTransparent() || s.defines(QF)) { - const i = s.getColor(QF); - i && (e.addRule(`.monaco-editor .view-overlays .current-line-exact { border: 2px solid ${i}; }`), e.addRule(`.monaco-editor .margin-view-overlays .current-line-exact-margin { border: 2px solid ${i}; }`), Ma(s.type) && (e.addRule(".monaco-editor .view-overlays .current-line-exact { border-width: 1px; }"), e.addRule(".monaco-editor .margin-view-overlays .current-line-exact-margin { border-width: 1px; }"))); +Il((s, e) => { + const t = s.getColor(oQ); + if (t && (e.addRule(`.monaco-editor .view-overlays .current-line { background-color: ${t}; }`), e.addRule(`.monaco-editor .margin-view-overlays .current-line-margin { background-color: ${t}; border: none; }`)), !t || t.isTransparent() || s.defines(GF)) { + const i = s.getColor(GF); + i && (e.addRule(`.monaco-editor .view-overlays .current-line-exact { border: 2px solid ${i}; }`), e.addRule(`.monaco-editor .margin-view-overlays .current-line-exact-margin { border: 2px solid ${i}; }`), Rc(s.type) && (e.addRule(".monaco-editor .view-overlays .current-line-exact { border-width: 1px; }"), e.addRule(".monaco-editor .margin-view-overlays .current-line-exact-margin { border-width: 1px; }"))); } }); -class bre extends Xm { +class dre extends Kb { constructor(e) { super(), this._context = e; const t = this._context.configuration.options; @@ -25817,77 +25817,77 @@ class bre extends Xm { prepareRender(e) { const t = e.getDecorationsInViewport(); let i = [], n = 0; - for (let a = 0, c = t.length; a < c; a++) { - const d = t[a]; - d.options.className && (i[n++] = d); + for (let c = 0, d = t.length; c < d; c++) { + const a = t[c]; + a.options.className && (i[n++] = a); } - i = i.sort((a, c) => { - if (a.options.zIndex < c.options.zIndex) + i = i.sort((c, d) => { + if (c.options.zIndex < d.options.zIndex) return -1; - if (a.options.zIndex > c.options.zIndex) + if (c.options.zIndex > d.options.zIndex) return 1; - const d = a.options.className, h = c.options.className; - return d < h ? -1 : d > h ? 1 : M.compareRangesUsingStarts(a.range, c.range); + const a = c.options.className, h = d.options.className; + return a < h ? -1 : a > h ? 1 : I.compareRangesUsingStarts(c.range, d.range); }); - const o = e.visibleRange.startLineNumber, r = e.visibleRange.endLineNumber, l = []; - for (let a = o; a <= r; a++) { - const c = a - o; - l[c] = ""; + const o = e.visibleRange.startLineNumber, l = e.visibleRange.endLineNumber, r = []; + for (let c = o; c <= l; c++) { + const d = c - o; + r[d] = ""; } - this._renderWholeLineDecorations(e, i, l), this._renderNormalDecorations(e, i, l), this._renderResult = l; + this._renderWholeLineDecorations(e, i, r), this._renderNormalDecorations(e, i, r), this._renderResult = r; } _renderWholeLineDecorations(e, t, i) { const n = e.visibleRange.startLineNumber, o = e.visibleRange.endLineNumber; - for (let r = 0, l = t.length; r < l; r++) { - const a = t[r]; - if (!a.options.isWholeLine) + for (let l = 0, r = t.length; l < r; l++) { + const c = t[l]; + if (!c.options.isWholeLine) continue; - const c = '
', d = Math.max(a.range.startLineNumber, n), h = Math.min(a.range.endLineNumber, o); - for (let u = d; u <= h; u++) { - const g = u - n; - i[g] += c; + const d = '
', a = Math.max(c.range.startLineNumber, n), h = Math.min(c.range.endLineNumber, o); + for (let u = a; u <= h; u++) { + const m = u - n; + i[m] += d; } } } _renderNormalDecorations(e, t, i) { const n = e.visibleRange.startLineNumber; - let o = null, r = !1, l = null, a = !1; - for (let c = 0, d = t.length; c < d; c++) { - const h = t[c]; + let o = null, l = !1, r = null, c = !1; + for (let d = 0, a = t.length; d < a; d++) { + const h = t[d]; if (h.options.isWholeLine) continue; - const u = h.options.className, g = !!h.options.showIfCollapsed; - let m = h.range; - if (g && m.endColumn === 1 && m.endLineNumber !== m.startLineNumber && (m = new M(m.startLineNumber, m.startColumn, m.endLineNumber - 1, this._context.viewModel.getLineMaxColumn(m.endLineNumber - 1))), o === u && r === g && M.areIntersectingOrTouching(l, m)) { - l = M.plusRange(l, m); + const u = h.options.className, m = !!h.options.showIfCollapsed; + let b = h.range; + if (m && b.endColumn === 1 && b.endLineNumber !== b.startLineNumber && (b = new I(b.startLineNumber, b.startColumn, b.endLineNumber - 1, this._context.viewModel.getLineMaxColumn(b.endLineNumber - 1))), o === u && l === m && I.areIntersectingOrTouching(r, b)) { + r = I.plusRange(r, b); continue; } - o !== null && this._renderNormalDecoration(e, l, o, a, r, n, i), o = u, r = g, l = m, a = h.options.shouldFillLineOnLineBreak ?? !1; + o !== null && this._renderNormalDecoration(e, r, o, c, l, n, i), o = u, l = m, r = b, c = h.options.shouldFillLineOnLineBreak ?? !1; } - o !== null && this._renderNormalDecoration(e, l, o, a, r, n, i); + o !== null && this._renderNormalDecoration(e, r, o, c, l, n, i); } - _renderNormalDecoration(e, t, i, n, o, r, l) { - const a = e.linesVisibleRangesForRange( + _renderNormalDecoration(e, t, i, n, o, l, r) { + const c = e.linesVisibleRangesForRange( t, /*TODO@Alex*/ i === "findMatch" ); - if (a) - for (let c = 0, d = a.length; c < d; c++) { - const h = a[c]; + if (c) + for (let d = 0, a = c.length; d < a; d++) { + const h = c[d]; if (h.outsideRenderedLine) continue; - const u = h.lineNumber - r; + const u = h.lineNumber - l; if (o && h.ranges.length === 1) { - const g = h.ranges[0]; - if (g.width < this._typicalHalfwidthCharacterWidth) { - const m = Math.round(g.left + g.width / 2), f = Math.max(0, Math.round(m - this._typicalHalfwidthCharacterWidth / 2)); - h.ranges[0] = new cI(f, this._typicalHalfwidthCharacterWidth); + const m = h.ranges[0]; + if (m.width < this._typicalHalfwidthCharacterWidth) { + const b = Math.round(m.left + m.width / 2), g = Math.max(0, Math.round(b - this._typicalHalfwidthCharacterWidth / 2)); + h.ranges[0] = new Lx(g, this._typicalHalfwidthCharacterWidth); } } - for (let g = 0, m = h.ranges.length; g < m; g++) { - const f = n && h.continuesOnNextLine && m === 1, b = h.ranges[g], y = '
'; - l[u] += y; + for (let m = 0, b = h.ranges.length; m < b; m++) { + const g = n && h.continuesOnNextLine && b === 1, Z = h.ranges[m], f = '
'; + r[u] += f; } } } @@ -25898,59 +25898,59 @@ class bre extends Xm { return i < 0 || i >= this._renderResult.length ? "" : this._renderResult[i]; } } -class yre extends wo { +class are extends Go { constructor(e, t, i, n) { super(e); - const o = this._context.configuration.options, r = o.get( + const o = this._context.configuration.options, l = o.get( 104 /* EditorOption.scrollbar */ - ), l = o.get( + ), r = o.get( 75 /* EditorOption.mouseWheelScrollSensitivity */ - ), a = o.get( + ), c = o.get( 40 /* EditorOption.fastScrollSensitivity */ - ), c = o.get( + ), d = o.get( 107 /* EditorOption.scrollPredominantAxis */ - ), d = { + ), a = { listenOnDomNode: i.domNode, - className: "editor-scrollable " + gv(e.theme.type), + className: "editor-scrollable " + Yw(e.theme.type), useShadows: !1, lazyRender: !0, - vertical: r.vertical, - horizontal: r.horizontal, - verticalHasArrows: r.verticalHasArrows, - horizontalHasArrows: r.horizontalHasArrows, - verticalScrollbarSize: r.verticalScrollbarSize, - verticalSliderSize: r.verticalSliderSize, - horizontalScrollbarSize: r.horizontalScrollbarSize, - horizontalSliderSize: r.horizontalSliderSize, - handleMouseWheel: r.handleMouseWheel, - alwaysConsumeMouseWheel: r.alwaysConsumeMouseWheel, - arrowSize: r.arrowSize, - mouseWheelScrollSensitivity: l, - fastScrollSensitivity: a, - scrollPredominantAxis: c, - scrollByPage: r.scrollByPage + vertical: l.vertical, + horizontal: l.horizontal, + verticalHasArrows: l.verticalHasArrows, + horizontalHasArrows: l.horizontalHasArrows, + verticalScrollbarSize: l.verticalScrollbarSize, + verticalSliderSize: l.verticalSliderSize, + horizontalScrollbarSize: l.horizontalScrollbarSize, + horizontalSliderSize: l.horizontalSliderSize, + handleMouseWheel: l.handleMouseWheel, + alwaysConsumeMouseWheel: l.alwaysConsumeMouseWheel, + arrowSize: l.arrowSize, + mouseWheelScrollSensitivity: r, + fastScrollSensitivity: c, + scrollPredominantAxis: d, + scrollByPage: l.scrollByPage }; - this.scrollbar = this._register(new uI(t.domNode, d, this._context.viewLayout.getScrollable())), Tl.write( + this.scrollbar = this._register(new xx(t.domNode, a, this._context.viewLayout.getScrollable())), vr.write( this.scrollbar.getDomNode(), 6 /* PartFingerprint.ScrollableElement */ - ), this.scrollbarDomNode = yt(this.scrollbar.getDomNode()), this.scrollbarDomNode.setPosition("absolute"), this._setLayout(); - const h = (u, g, m) => { - const f = {}; + ), this.scrollbarDomNode = ft(this.scrollbar.getDomNode()), this.scrollbarDomNode.setPosition("absolute"), this._setLayout(); + const h = (u, m, b) => { + const g = {}; { - const b = u.scrollTop; - b && (f.scrollTop = this._context.viewLayout.getCurrentScrollTop() + b, u.scrollTop = 0); + const Z = u.scrollTop; + Z && (g.scrollTop = this._context.viewLayout.getCurrentScrollTop() + Z, u.scrollTop = 0); } - if (m) { - const b = u.scrollLeft; - b && (f.scrollLeft = this._context.viewLayout.getCurrentScrollLeft() + b, u.scrollLeft = 0); + if (b) { + const Z = u.scrollLeft; + Z && (g.scrollLeft = this._context.viewLayout.getCurrentScrollLeft() + Z, u.scrollLeft = 0); } this._context.viewModel.viewLayout.setScrollPosition( - f, + g, 1 /* ScrollType.Immediate */ ); @@ -26003,10 +26003,10 @@ class yre extends wo { ), o = t.get( 40 /* EditorOption.fastScrollSensitivity */ - ), r = t.get( + ), l = t.get( 107 /* EditorOption.scrollPredominantAxis */ - ), l = { + ), r = { vertical: i.vertical, horizontal: i.horizontal, verticalScrollbarSize: i.verticalScrollbarSize, @@ -26015,9 +26015,9 @@ class yre extends wo { handleMouseWheel: i.handleMouseWheel, mouseWheelScrollSensitivity: n, fastScrollSensitivity: o, - scrollPredominantAxis: r + scrollPredominantAxis: l }; - this.scrollbar.updateOptions(l); + this.scrollbar.updateOptions(r); } return e.hasChanged( 146 @@ -26028,7 +26028,7 @@ class yre extends wo { return !0; } onThemeChanged(e) { - return this.scrollbar.updateClassName("editor-scrollable " + gv(this._context.theme.type)), !0; + return this.scrollbar.updateClassName("editor-scrollable " + Yw(this._context.theme.type)), !0; } // --- end event handlers prepareRender(e) { @@ -26037,19 +26037,19 @@ class yre extends wo { this.scrollbar.renderNow(); } } -var ur; +var pl; (function(s) { s[s.Left = 1] = "Left", s[s.Center = 2] = "Center", s[s.Right = 4] = "Right", s[s.Full = 7] = "Full"; -})(ur || (ur = {})); -var Jr; +})(pl || (pl = {})); +var Ol; (function(s) { s[s.Left = 1] = "Left", s[s.Center = 2] = "Center", s[s.Right = 3] = "Right"; -})(Jr || (Jr = {})); -var Xr; +})(Ol || (Ol = {})); +var zl; (function(s) { s[s.Both = 0] = "Both", s[s.Right = 1] = "Right", s[s.Left = 2] = "Left", s[s.None = 3] = "None"; -})(Xr || (Xr = {})); -class SL { +})(zl || (zl = {})); +class vX { get originalIndentSize() { return this._indentSizeIsTabSize ? "tabSize" : this.indentSize; } @@ -26063,7 +26063,7 @@ class SL { * @internal */ equals(e) { - return this.tabSize === e.tabSize && this._indentSizeIsTabSize === e._indentSizeIsTabSize && this.indentSize === e.indentSize && this.insertSpaces === e.insertSpaces && this.defaultEOL === e.defaultEOL && this.trimAutoWhitespace === e.trimAutoWhitespace && co(this.bracketPairColorizationOptions, e.bracketPairColorizationOptions); + return this.tabSize === e.tabSize && this._indentSizeIsTabSize === e._indentSizeIsTabSize && this.indentSize === e.indentSize && this.insertSpaces === e.insertSpaces && this.defaultEOL === e.defaultEOL && this.trimAutoWhitespace === e.trimAutoWhitespace && uo(this.bracketPairColorizationOptions, e.bracketPairColorizationOptions); } /** * @internal @@ -26077,7 +26077,7 @@ class SL { }; } } -class t1 { +class mW { /** * @internal */ @@ -26085,38 +26085,38 @@ class t1 { this._findMatchBrand = void 0, this.range = e, this.matches = t; } } -function wre(s) { +function hre(s) { return s && typeof s.read == "function"; } -class HN { - constructor(e, t, i, n, o, r) { - this.identifier = e, this.range = t, this.text = i, this.forceMoveMarkers = n, this.isAutoWhitespaceEdit = o, this._isTracked = r; +class cR { + constructor(e, t, i, n, o, l) { + this.identifier = e, this.range = t, this.text = i, this.forceMoveMarkers = n, this.isAutoWhitespaceEdit = o, this._isTracked = l; } } -class Cre { +class ure { constructor(e, t, i) { this.regex = e, this.wordSeparators = t, this.simpleSearch = i; } } -class Sre { +class mre { constructor(e, t, i) { this.reverseEdits = e, this.changes = t, this.trimAutoWhitespaceLineNumbers = i; } } -function EU(s) { +function WQ(s) { return !s.isTooLargeForSyncing() && !s.isForSimpleWidget; } -class Cv { +class Fw { constructor(e, t, i, n, o) { this.startLineNumber = e, this.endLineNumber = t, this.className = i, this.tooltip = n, this._decorationToRenderBrand = void 0, this.zIndex = o ?? 0; } } -class Lre { +class bre { constructor(e, t, i) { this.className = e, this.zIndex = t, this.tooltip = i; } } -class Are { +class pre { constructor() { this.decorations = []; } @@ -26127,39 +26127,39 @@ class Are { return this.decorations; } } -class XU extends Xm { +class GQ extends Kb { /** * Returns an array with an element for each visible line number. */ _render(e, t, i) { const n = []; - for (let l = e; l <= t; l++) { - const a = l - e; - n[a] = new Are(); + for (let r = e; r <= t; r++) { + const c = r - e; + n[c] = new pre(); } if (i.length === 0) return n; - i.sort((l, a) => l.className === a.className ? l.startLineNumber === a.startLineNumber ? l.endLineNumber - a.endLineNumber : l.startLineNumber - a.startLineNumber : l.className < a.className ? -1 : 1); - let o = null, r = 0; - for (let l = 0, a = i.length; l < a; l++) { - const c = i[l], d = c.className, h = c.zIndex; - let u = Math.max(c.startLineNumber, e) - e; - const g = Math.min(c.endLineNumber, t) - e; - o === d ? (u = Math.max(r + 1, u), r = Math.max(r, g)) : (o = d, r = g); - for (let m = u; m <= r; m++) - n[m].add(new Lre(d, h, c.tooltip)); + i.sort((r, c) => r.className === c.className ? r.startLineNumber === c.startLineNumber ? r.endLineNumber - c.endLineNumber : r.startLineNumber - c.startLineNumber : r.className < c.className ? -1 : 1); + let o = null, l = 0; + for (let r = 0, c = i.length; r < c; r++) { + const d = i[r], a = d.className, h = d.zIndex; + let u = Math.max(d.startLineNumber, e) - e; + const m = Math.min(d.endLineNumber, t) - e; + o === a ? (u = Math.max(l + 1, u), l = Math.max(l, m)) : (o = a, l = m); + for (let b = u; b <= l; b++) + n[b].add(new bre(a, h, d.tooltip)); } return n; } } -class xre extends wo { +class gre extends Go { constructor(e) { super(e), this._widgets = {}, this._context = e; const t = this._context.configuration.options, i = t.get( 146 /* EditorOption.layoutInfo */ ); - this.domNode = yt(document.createElement("div")), this.domNode.setClassName("glyph-margin-widgets"), this.domNode.setPosition("absolute"), this.domNode.setTop(0), this._lineHeight = t.get( + this.domNode = ft(document.createElement("div")), this.domNode.setClassName("glyph-margin-widgets"), this.domNode.setPosition("absolute"), this.domNode.setTop(0), this._lineHeight = t.get( 67 /* EditorOption.lineHeight */ ), this._glyphMargin = t.get( @@ -26211,7 +26211,7 @@ class xre extends wo { // --- end event handlers // --- begin widget management addWidget(e) { - const t = yt(e.getDomNode()); + const t = ft(e.getDomNode()); this._widgets[e.getId()] = { widget: e, preference: e.getPosition(), @@ -26221,7 +26221,7 @@ class xre extends wo { } setWidgetPosition(e, t) { const i = this._widgets[e.getId()]; - return i.preference.lane === t.lane && i.preference.zIndex === t.zIndex && M.equalsRange(i.preference.range, t.range) ? !1 : (i.preference = t, this.setShouldRender(), !0); + return i.preference.lane === t.lane && i.preference.zIndex === t.zIndex && I.equalsRange(i.preference.range, t.range) ? !1 : (i.preference = t, this.setShouldRender(), !0); } removeWidget(e) { const t = e.getId(); @@ -26232,27 +26232,27 @@ class xre extends wo { } // --- end widget management _collectDecorationBasedGlyphRenderRequest(e, t) { - var r; + var l; const i = e.visibleRange.startLineNumber, n = e.visibleRange.endLineNumber, o = e.getDecorationsInViewport(); - for (const l of o) { - const a = l.options.glyphMarginClassName; - if (!a) + for (const r of o) { + const c = r.options.glyphMarginClassName; + if (!c) continue; - const c = Math.max(l.range.startLineNumber, i), d = Math.min(l.range.endLineNumber, n), h = ((r = l.options.glyphMargin) == null ? void 0 : r.position) ?? Jr.Center, u = l.options.zIndex ?? 0; - for (let g = c; g <= d; g++) { - const m = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new V(g, 0)), f = this._context.viewModel.glyphLanes.getLanesAtLine(m.lineNumber).indexOf(h); - t.push(new Mre(g, f, u, a)); + const d = Math.max(r.range.startLineNumber, i), a = Math.min(r.range.endLineNumber, n), h = ((l = r.options.glyphMargin) == null ? void 0 : l.position) ?? Ol.Center, u = r.options.zIndex ?? 0; + for (let m = d; m <= a; m++) { + const b = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Y(m, 0)), g = this._context.viewModel.glyphLanes.getLanesAtLine(b.lineNumber).indexOf(h); + t.push(new Zre(m, g, u, c)); } } } _collectWidgetBasedGlyphRenderRequest(e, t) { const i = e.visibleRange.startLineNumber, n = e.visibleRange.endLineNumber; for (const o of Object.values(this._widgets)) { - const r = o.preference.range, { startLineNumber: l, endLineNumber: a } = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(M.lift(r)); - if (!l || !a || a < i || l > n) + const l = o.preference.range, { startLineNumber: r, endLineNumber: c } = this._context.viewModel.coordinatesConverter.convertModelRangeToViewRange(I.lift(l)); + if (!r || !c || c < i || r > n) continue; - const c = Math.max(l, i), d = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new V(c, 0)), h = this._context.viewModel.glyphLanes.getLanesAtLine(d.lineNumber).indexOf(o.preference.lane); - t.push(new Zre(c, h, o.preference.zIndex, o)); + const d = Math.max(r, i), a = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Y(d, 0)), h = this._context.viewModel.glyphLanes.getLanesAtLine(a.lineNumber).indexOf(o.preference.lane); + t.push(new fre(d, h, o.preference.zIndex, o)); } } _collectSortedGlyphRenderRequests(e) { @@ -26269,27 +26269,27 @@ class xre extends wo { } for (const n of Object.values(this._widgets)) n.renderInfo = null; - const t = new Hc(this._collectSortedGlyphRenderRequests(e)), i = []; + const t = new Od(this._collectSortedGlyphRenderRequests(e)), i = []; for (; t.length > 0; ) { const n = t.peek(); if (!n) break; - const o = t.takeWhile((l) => l.lineNumber === n.lineNumber && l.laneIndex === n.laneIndex); + const o = t.takeWhile((r) => r.lineNumber === n.lineNumber && r.laneIndex === n.laneIndex); if (!o || o.length === 0) break; - const r = o[0]; - if (r.type === 0) { - const l = []; - for (const a of o) { - if (a.zIndex !== r.zIndex || a.type !== r.type) + const l = o[0]; + if (l.type === 0) { + const r = []; + for (const c of o) { + if (c.zIndex !== l.zIndex || c.type !== l.type) break; - (l.length === 0 || l[l.length - 1] !== a.className) && l.push(a.className); + (r.length === 0 || r[r.length - 1] !== c.className) && r.push(c.className); } - i.push(r.accept(l.join(" "))); + i.push(l.accept(r.join(" "))); } else - r.widget.renderInfo = { - lineNumber: r.lineNumber, - laneIndex: r.laneIndex + l.widget.renderInfo = { + lineNumber: l.lineNumber, + laneIndex: l.laneIndex }; } this._decorationGlyphsToRender = i; @@ -26313,9 +26313,9 @@ class xre extends wo { i.domNode.setDisplay("block"), i.domNode.setTop(n), i.domNode.setLeft(o), i.domNode.setWidth(t), i.domNode.setHeight(this._lineHeight); } for (let i = 0; i < this._decorationGlyphsToRender.length; i++) { - const n = this._decorationGlyphsToRender[i], o = e.viewportData.relativeVerticalOffset[n.lineNumber - e.viewportData.startLineNumber], r = this._glyphMarginLeft + n.laneIndex * this._lineHeight; - let l; - i < this._managedDomNodes.length ? l = this._managedDomNodes[i] : (l = yt(document.createElement("div")), this._managedDomNodes.push(l), this.domNode.appendChild(l)), l.setClassName("cgmr codicon " + n.combinedClassName), l.setPosition("absolute"), l.setTop(o), l.setLeft(r), l.setWidth(t), l.setHeight(this._lineHeight); + const n = this._decorationGlyphsToRender[i], o = e.viewportData.relativeVerticalOffset[n.lineNumber - e.viewportData.startLineNumber], l = this._glyphMarginLeft + n.laneIndex * this._lineHeight; + let r; + i < this._managedDomNodes.length ? r = this._managedDomNodes[i] : (r = ft(document.createElement("div")), this._managedDomNodes.push(r), this.domNode.appendChild(r)), r.setClassName("cgmr codicon " + n.combinedClassName), r.setPosition("absolute"), r.setTop(o), r.setLeft(l), r.setWidth(t), r.setHeight(this._lineHeight); } for (; this._managedDomNodes.length > this._decorationGlyphsToRender.length; ) { const i = this._managedDomNodes.pop(); @@ -26323,30 +26323,30 @@ class xre extends wo { } } } -class Mre { +class Zre { constructor(e, t, i, n) { this.lineNumber = e, this.laneIndex = t, this.zIndex = i, this.className = n, this.type = 0; } accept(e) { - return new _re(this.lineNumber, this.laneIndex, e); + return new yre(this.lineNumber, this.laneIndex, e); } } -class Zre { +class fre { constructor(e, t, i, n) { this.lineNumber = e, this.laneIndex = t, this.zIndex = i, this.widget = n, this.type = 1; } } -class _re { +class yre { constructor(e, t, i) { this.lineNumber = e, this.laneIndex = t, this.combinedClassName = i; } } -function GA(s, e) { - const t = Ire(s, e); +function jV(s, e) { + const t = Wre(s, e); if (t !== -1) return s[t]; } -function Ire(s, e, t = s.length - 1) { +function Wre(s, e, t = s.length - 1) { for (let i = t; i >= 0; i--) { const n = s[i]; if (e(n)) @@ -26354,31 +26354,31 @@ function Ire(s, e, t = s.length - 1) { } return -1; } -function bb(s, e) { - const t = i1(s, e); +function VZ(s, e) { + const t = bW(s, e); return t === -1 ? void 0 : s[t]; } -function i1(s, e, t = 0, i = s.length) { +function bW(s, e, t = 0, i = s.length) { let n = t, o = i; for (; n < o; ) { - const r = Math.floor((n + o) / 2); - e(s[r]) ? n = r + 1 : o = r; + const l = Math.floor((n + o) / 2); + e(s[l]) ? n = l + 1 : o = l; } return n - 1; } -function Nre(s, e) { - const t = n1(s, e); +function Gre(s, e) { + const t = pW(s, e); return t === s.length ? void 0 : s[t]; } -function n1(s, e, t = 0, i = s.length) { +function pW(s, e, t = 0, i = s.length) { let n = t, o = i; for (; n < o; ) { - const r = Math.floor((n + o) / 2); - e(s[r]) ? o = r : n = r + 1; + const l = Math.floor((n + o) / 2); + e(s[l]) ? o = l : n = l + 1; } return n; } -const dZ = class dZ { +const I2 = class I2 { constructor(e) { this._array = e, this._findLastMonotonousLastIdx = 0; } @@ -26387,7 +26387,7 @@ const dZ = class dZ { * For subsequent calls, current predicate must be weaker than (or equal to) the previous predicate, i.e. more entries must be `true`. */ findLastMonotonous(e) { - if (dZ.assertInvariants) { + if (I2.assertInvariants) { if (this._prevFindLastPredicate) { for (const i of this._array) if (this._prevFindLastPredicate(i) && !e(i)) @@ -26395,13 +26395,13 @@ const dZ = class dZ { } this._prevFindLastPredicate = e; } - const t = i1(this._array, e, this._findLastMonotonousLastIdx); + const t = bW(this._array, e, this._findLastMonotonousLastIdx); return this._findLastMonotonousLastIdx = t + 1, t === -1 ? void 0 : this._array[t]; } }; -dZ.assertInvariants = !1; -let RA = dZ; -function jE(s, e) { +I2.assertInvariants = !1; +let qV = I2; +function XJ(s, e) { if (s.length === 0) return; let t = s[0]; @@ -26411,7 +26411,7 @@ function jE(s, e) { } return t; } -function Wre(s, e) { +function Xre(s, e) { if (s.length === 0) return; let t = s[0]; @@ -26421,10 +26421,10 @@ function Wre(s, e) { } return t; } -function vre(s, e) { - return jE(s, (t, i) => -e(t, i)); +function Vre(s, e) { + return XJ(s, (t, i) => -e(t, i)); } -function Tre(s, e) { +function Lre(s, e) { if (s.length === 0) return -1; let t = 0; @@ -26434,14 +26434,14 @@ function Tre(s, e) { } return t; } -function Dre(s, e) { +function Ire(s, e) { for (const t of s) { const i = e(t); if (i !== void 0) return i; } } -class FU extends R { +class XQ extends J { constructor() { super(...arguments), this._isDisposed = !1; } @@ -26453,7 +26453,7 @@ class FU extends R { throw new Error("TextModelPart is disposed!"); } } -function fI(s, e) { +function wx(s, e) { let t = 0, i = 0; const n = s.length; for (; i < n; ) { @@ -26468,22 +26468,22 @@ function fI(s, e) { } return i === n ? -1 : t; } -var dg; +var pm; (function(s) { s[s.Disabled = 0] = "Disabled", s[s.EnabledForActive = 1] = "EnabledForActive", s[s.Enabled = 2] = "Enabled"; -})(dg || (dg = {})); -class $u { - constructor(e, t, i, n, o, r) { - if (this.visibleColumn = e, this.column = t, this.className = i, this.horizontalLine = n, this.forWrappedLinesAfterColumn = o, this.forWrappedLinesBeforeOrAtColumn = r, e !== -1 == (t !== -1)) +})(pm || (pm = {})); +class sm { + constructor(e, t, i, n, o, l) { + if (this.visibleColumn = e, this.column = t, this.className = i, this.horizontalLine = n, this.forWrappedLinesAfterColumn = o, this.forWrappedLinesBeforeOrAtColumn = l, e !== -1 == (t !== -1)) throw new Error(); } } -class Ty { +class Af { constructor(e, t) { this.top = e, this.endColumn = t; } } -class Vre extends FU { +class Sre extends XQ { constructor(e, t) { super(), this.textModel = e, this.languageConfigurationService = t; } @@ -26491,131 +26491,131 @@ class Vre extends FU { return this.languageConfigurationService.getLanguageConfiguration(e); } _computeIndentLevel(e) { - return fI(this.textModel.getLineContent(e + 1), this.textModel.getOptions().tabSize); + return wx(this.textModel.getLineContent(e + 1), this.textModel.getOptions().tabSize); } getActiveIndentGuide(e, t, i) { this.assertNotDisposed(); const n = this.textModel.getLineCount(); if (e < 1 || e > n) - throw new mt("Illegal value for lineNumber"); - const o = this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules, r = !!(o && o.offSide); - let l = -2, a = -1, c = -2, d = -1; - const h = (Z) => { - if (l !== -1 && (l === -2 || l > Z - 1)) { - l = -1, a = -1; - for (let _ = Z - 2; _ >= 0; _--) { - const v = this._computeIndentLevel(_); - if (v >= 0) { - l = _, a = v; + throw new bt("Illegal value for lineNumber"); + const o = this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules, l = !!(o && o.offSide); + let r = -2, c = -1, d = -2, a = -1; + const h = (S) => { + if (r !== -1 && (r === -2 || r > S - 1)) { + r = -1, c = -1; + for (let x = S - 2; x >= 0; x--) { + const w = this._computeIndentLevel(x); + if (w >= 0) { + r = x, c = w; break; } } } - if (c === -2) { - c = -1, d = -1; - for (let _ = Z; _ < n; _++) { - const v = this._computeIndentLevel(_); - if (v >= 0) { - c = _, d = v; + if (d === -2) { + d = -1, a = -1; + for (let x = S; x < n; x++) { + const w = this._computeIndentLevel(x); + if (w >= 0) { + d = x, a = w; break; } } } }; - let u = -2, g = -1, m = -2, f = -1; - const b = (Z) => { + let u = -2, m = -1, b = -2, g = -1; + const Z = (S) => { if (u === -2) { - u = -1, g = -1; - for (let _ = Z - 2; _ >= 0; _--) { - const v = this._computeIndentLevel(_); - if (v >= 0) { - u = _, g = v; + u = -1, m = -1; + for (let x = S - 2; x >= 0; x--) { + const w = this._computeIndentLevel(x); + if (w >= 0) { + u = x, m = w; break; } } } - if (m !== -1 && (m === -2 || m < Z - 1)) { - m = -1, f = -1; - for (let _ = Z; _ < n; _++) { - const v = this._computeIndentLevel(_); - if (v >= 0) { - m = _, f = v; + if (b !== -1 && (b === -2 || b < S - 1)) { + b = -1, g = -1; + for (let x = S; x < n; x++) { + const w = this._computeIndentLevel(x); + if (w >= 0) { + b = x, g = w; break; } } } }; - let y = 0, w = !0, C = 0, S = !0, L = 0, x = 0; - for (let Z = 0; w || S; Z++) { - const _ = e - Z, v = e + Z; - Z > 1 && (_ < 1 || _ < t) && (w = !1), Z > 1 && (v > n || v > i) && (S = !1), Z > 5e4 && (w = !1, S = !1); - let P = -1; - if (w && _ >= 1) { - const Y = this._computeIndentLevel(_ - 1); - Y >= 0 ? (c = _ - 1, d = Y, P = Math.ceil(Y / this.textModel.getOptions().indentSize)) : (h(_), P = this._getIndentLevelForWhitespaceLine(r, a, d)); - } - let E = -1; - if (S && v <= n) { - const Y = this._computeIndentLevel(v - 1); - Y >= 0 ? (u = v - 1, g = Y, E = Math.ceil(Y / this.textModel.getOptions().indentSize)) : (b(v), E = this._getIndentLevelForWhitespaceLine(r, g, f)); - } - if (Z === 0) { - x = P; + let f = 0, y = !0, W = 0, G = !0, X = 0, L = 0; + for (let S = 0; y || G; S++) { + const x = e - S, w = e + S; + S > 1 && (x < 1 || x < t) && (y = !1), S > 1 && (w > n || w > i) && (G = !1), S > 5e4 && (y = !1, G = !1); + let A = -1; + if (y && x >= 1) { + const F = this._computeIndentLevel(x - 1); + F >= 0 ? (d = x - 1, a = F, A = Math.ceil(F / this.textModel.getOptions().indentSize)) : (h(x), A = this._getIndentLevelForWhitespaceLine(l, c, a)); + } + let H = -1; + if (G && w <= n) { + const F = this._computeIndentLevel(w - 1); + F >= 0 ? (u = w - 1, m = F, H = Math.ceil(F / this.textModel.getOptions().indentSize)) : (Z(w), H = this._getIndentLevelForWhitespaceLine(l, m, g)); + } + if (S === 0) { + L = A; continue; } - if (Z === 1) { - if (v <= n && E >= 0 && x + 1 === E) { - w = !1, y = v, C = v, L = E; + if (S === 1) { + if (w <= n && H >= 0 && L + 1 === H) { + y = !1, f = w, W = w, X = H; continue; } - if (_ >= 1 && P >= 0 && P - 1 === x) { - S = !1, y = _, C = _, L = P; + if (x >= 1 && A >= 0 && A - 1 === L) { + G = !1, f = x, W = x, X = A; continue; } - if (y = e, C = e, L = x, L === 0) - return { startLineNumber: y, endLineNumber: C, indent: L }; + if (f = e, W = e, X = L, X === 0) + return { startLineNumber: f, endLineNumber: W, indent: X }; } - w && (P >= L ? y = _ : w = !1), S && (E >= L ? C = v : S = !1); + y && (A >= X ? f = x : y = !1), G && (H >= X ? W = w : G = !1); } - return { startLineNumber: y, endLineNumber: C, indent: L }; + return { startLineNumber: f, endLineNumber: W, indent: X }; } getLinesBracketGuides(e, t, i, n) { var h; const o = []; for (let u = e; u <= t; u++) o.push([]); - const r = !0, l = this.textModel.bracketPairs.getBracketPairsInRangeWithMinIndentation(new M(e, 1, t, this.textModel.getLineMaxColumn(t))).toArray(); - let a; - if (i && l.length > 0) { - const u = (e <= i.lineNumber && i.lineNumber <= t ? l : this.textModel.bracketPairs.getBracketPairsInRange(M.fromPositions(i)).toArray()).filter((g) => M.strictContainsPosition(g.range, i)); - a = (h = GA(u, (g) => r)) == null ? void 0 : h.range; + const l = !0, r = this.textModel.bracketPairs.getBracketPairsInRangeWithMinIndentation(new I(e, 1, t, this.textModel.getLineMaxColumn(t))).toArray(); + let c; + if (i && r.length > 0) { + const u = (e <= i.lineNumber && i.lineNumber <= t ? r : this.textModel.bracketPairs.getBracketPairsInRange(I.fromPositions(i)).toArray()).filter((m) => I.strictContainsPosition(m.range, i)); + c = (h = jV(u, (m) => l)) == null ? void 0 : h.range; } - const c = this.textModel.getOptions().bracketPairColorizationOptions.independentColorPoolPerBracketType, d = new YU(); - for (const u of l) { + const d = this.textModel.getOptions().bracketPairColorizationOptions.independentColorPoolPerBracketType, a = new VQ(); + for (const u of r) { if (!u.closingBracketRange) continue; - const g = a && u.range.equalsRange(a); - if (!g && !n.includeInactive) + const m = c && u.range.equalsRange(c); + if (!m && !n.includeInactive) continue; - const m = d.getInlineClassName(u.nestingLevel, u.nestingLevelOfEqualBracketType, c) + (n.highlightActive && g ? " " + d.activeClassName : ""), f = u.openingBracketRange.getStartPosition(), b = u.closingBracketRange.getStartPosition(), y = n.horizontalGuides === dg.Enabled || n.horizontalGuides === dg.EnabledForActive && g; + const b = a.getInlineClassName(u.nestingLevel, u.nestingLevelOfEqualBracketType, d) + (n.highlightActive && m ? " " + a.activeClassName : ""), g = u.openingBracketRange.getStartPosition(), Z = u.closingBracketRange.getStartPosition(), f = n.horizontalGuides === pm.Enabled || n.horizontalGuides === pm.EnabledForActive && m; if (u.range.startLineNumber === u.range.endLineNumber) { - y && o[u.range.startLineNumber - e].push(new $u(-1, u.openingBracketRange.getEndPosition().column, m, new Ty(!1, b.column), -1, -1)); + f && o[u.range.startLineNumber - e].push(new sm(-1, u.openingBracketRange.getEndPosition().column, b, new Af(!1, Z.column), -1, -1)); continue; } - const w = this.getVisibleColumnFromPosition(b), C = this.getVisibleColumnFromPosition(u.openingBracketRange.getStartPosition()), S = Math.min(C, w, u.minVisibleColumnIndentation + 1); - let L = !1; - qn(this.textModel.getLineContent(u.closingBracketRange.startLineNumber)) < u.closingBracketRange.startColumn - 1 && (L = !0); - const _ = Math.max(f.lineNumber, e), v = Math.min(b.lineNumber, t), P = L ? 1 : 0; - for (let E = _; E < v + P; E++) - o[E - e].push(new $u(S, -1, m, null, E === f.lineNumber ? f.column : -1, E === b.lineNumber ? b.column : -1)); - y && (f.lineNumber >= e && C > S && o[f.lineNumber - e].push(new $u(S, -1, m, new Ty(!1, f.column), -1, -1)), b.lineNumber <= t && w > S && o[b.lineNumber - e].push(new $u(S, -1, m, new Ty(!L, b.column), -1, -1))); + const y = this.getVisibleColumnFromPosition(Z), W = this.getVisibleColumnFromPosition(u.openingBracketRange.getStartPosition()), G = Math.min(W, y, u.minVisibleColumnIndentation + 1); + let X = !1; + es(this.textModel.getLineContent(u.closingBracketRange.startLineNumber)) < u.closingBracketRange.startColumn - 1 && (X = !0); + const x = Math.max(g.lineNumber, e), w = Math.min(Z.lineNumber, t), A = X ? 1 : 0; + for (let H = x; H < w + A; H++) + o[H - e].push(new sm(G, -1, b, null, H === g.lineNumber ? g.column : -1, H === Z.lineNumber ? Z.column : -1)); + f && (g.lineNumber >= e && W > G && o[g.lineNumber - e].push(new sm(G, -1, b, new Af(!1, g.column), -1, -1)), Z.lineNumber <= t && y > G && o[Z.lineNumber - e].push(new sm(G, -1, b, new Af(!X, Z.column), -1, -1))); } for (const u of o) - u.sort((g, m) => g.visibleColumn - m.visibleColumn); + u.sort((m, b) => m.visibleColumn - b.visibleColumn); return o; } getVisibleColumnFromPosition(e) { - return Yi.visibleColumnFromColumn(this.textModel.getLineContent(e.lineNumber), e.column, this.textModel.getOptions().tabSize) + 1; + return zi.visibleColumnFromColumn(this.textModel.getLineContent(e.lineNumber), e.column, this.textModel.getOptions().tabSize) + 1; } getLinesIndentGuides(e, t) { this.assertNotDisposed(); @@ -26624,44 +26624,44 @@ class Vre extends FU { throw new Error("Illegal value for startLineNumber"); if (t < 1 || t > i) throw new Error("Illegal value for endLineNumber"); - const n = this.textModel.getOptions(), o = this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules, r = !!(o && o.offSide), l = new Array(t - e + 1); - let a = -2, c = -1, d = -2, h = -1; + const n = this.textModel.getOptions(), o = this.getLanguageConfiguration(this.textModel.getLanguageId()).foldingRules, l = !!(o && o.offSide), r = new Array(t - e + 1); + let c = -2, d = -1, a = -2, h = -1; for (let u = e; u <= t; u++) { - const g = u - e, m = this._computeIndentLevel(u - 1); - if (m >= 0) { - a = u - 1, c = m, l[g] = Math.ceil(m / n.indentSize); + const m = u - e, b = this._computeIndentLevel(u - 1); + if (b >= 0) { + c = u - 1, d = b, r[m] = Math.ceil(b / n.indentSize); continue; } - if (a === -2) { - a = -1, c = -1; - for (let f = u - 2; f >= 0; f--) { - const b = this._computeIndentLevel(f); - if (b >= 0) { - a = f, c = b; + if (c === -2) { + c = -1, d = -1; + for (let g = u - 2; g >= 0; g--) { + const Z = this._computeIndentLevel(g); + if (Z >= 0) { + c = g, d = Z; break; } } } - if (d !== -1 && (d === -2 || d < u - 1)) { - d = -1, h = -1; - for (let f = u; f < i; f++) { - const b = this._computeIndentLevel(f); - if (b >= 0) { - d = f, h = b; + if (a !== -1 && (a === -2 || a < u - 1)) { + a = -1, h = -1; + for (let g = u; g < i; g++) { + const Z = this._computeIndentLevel(g); + if (Z >= 0) { + a = g, h = Z; break; } } } - l[g] = this._getIndentLevelForWhitespaceLine(r, c, h); + r[m] = this._getIndentLevelForWhitespaceLine(l, d, h); } - return l; + return r; } _getIndentLevelForWhitespaceLine(e, t, i) { const n = this.textModel.getOptions(); return t === -1 || i === -1 ? 0 : t < i ? 1 + Math.floor(t / n.indentSize) : t === i || e ? Math.ceil(i / n.indentSize) : 1 + Math.floor(i / n.indentSize); } } -class YU { +class VQ { constructor() { this.activeClassName = "indent-active"; } @@ -26672,7 +26672,7 @@ class YU { return `bracket-indent-guide lvl-${e % 30}`; } } -class kre extends Xm { +class xre extends Kb { constructor(e) { super(), this._context = e, this._primaryPosition = null; const t = this._context.configuration.options, i = t.get( @@ -26735,55 +26735,55 @@ class kre extends Xm { } // --- end event handlers prepareRender(e) { - var a, c; + var c, d; if (!this._bracketPairGuideOptions.indentation && this._bracketPairGuideOptions.bracketPairs === !1) { this._renderResult = null; return; } - const t = e.visibleRange.startLineNumber, i = e.visibleRange.endLineNumber, n = e.scrollWidth, o = this._primaryPosition, r = this.getGuidesByLine(t, Math.min(i + 1, this._context.viewModel.getLineCount()), o), l = []; - for (let d = t; d <= i; d++) { - const h = d - t, u = r[h]; - let g = ""; - const m = ((a = e.visibleRangeForPosition(new V(d, 1))) == null ? void 0 : a.left) ?? 0; - for (const f of u) { - const b = f.column === -1 ? m + (f.visibleColumn - 1) * this._spaceWidth : e.visibleRangeForPosition(new V(d, f.column)).left; - if (b > n || this._maxIndentLeft > 0 && b > this._maxIndentLeft) + const t = e.visibleRange.startLineNumber, i = e.visibleRange.endLineNumber, n = e.scrollWidth, o = this._primaryPosition, l = this.getGuidesByLine(t, Math.min(i + 1, this._context.viewModel.getLineCount()), o), r = []; + for (let a = t; a <= i; a++) { + const h = a - t, u = l[h]; + let m = ""; + const b = ((c = e.visibleRangeForPosition(new Y(a, 1))) == null ? void 0 : c.left) ?? 0; + for (const g of u) { + const Z = g.column === -1 ? b + (g.visibleColumn - 1) * this._spaceWidth : e.visibleRangeForPosition(new Y(a, g.column)).left; + if (Z > n || this._maxIndentLeft > 0 && Z > this._maxIndentLeft) break; - const y = f.horizontalLine ? f.horizontalLine.top ? "horizontal-top" : "horizontal-bottom" : "vertical", w = f.horizontalLine ? (((c = e.visibleRangeForPosition(new V(d, f.horizontalLine.endColumn))) == null ? void 0 : c.left) ?? b + this._spaceWidth) - b : this._spaceWidth; - g += `
`; + const f = g.horizontalLine ? g.horizontalLine.top ? "horizontal-top" : "horizontal-bottom" : "vertical", y = g.horizontalLine ? (((d = e.visibleRangeForPosition(new Y(a, g.horizontalLine.endColumn))) == null ? void 0 : d.left) ?? Z + this._spaceWidth) - Z : this._spaceWidth; + m += `
`; } - l[h] = g; + r[h] = m; } - this._renderResult = l; + this._renderResult = r; } getGuidesByLine(e, t, i) { const n = this._bracketPairGuideOptions.bracketPairs !== !1 ? this._context.viewModel.getBracketGuidesInRangeByLine(e, t, i, { highlightActive: this._bracketPairGuideOptions.highlightActiveBracketPair, - horizontalGuides: this._bracketPairGuideOptions.bracketPairsHorizontal === !0 ? dg.Enabled : this._bracketPairGuideOptions.bracketPairsHorizontal === "active" ? dg.EnabledForActive : dg.Disabled, + horizontalGuides: this._bracketPairGuideOptions.bracketPairsHorizontal === !0 ? pm.Enabled : this._bracketPairGuideOptions.bracketPairsHorizontal === "active" ? pm.EnabledForActive : pm.Disabled, includeInactive: this._bracketPairGuideOptions.bracketPairs === !0 }) : null, o = this._bracketPairGuideOptions.indentation ? this._context.viewModel.getLinesIndentGuides(e, t) : null; - let r = 0, l = 0, a = 0; + let l = 0, r = 0, c = 0; if (this._bracketPairGuideOptions.highlightActiveIndentation !== !1 && i) { const h = this._context.viewModel.getActiveIndentGuide(i.lineNumber, e, t); - r = h.startLineNumber, l = h.endLineNumber, a = h.indent; + l = h.startLineNumber, r = h.endLineNumber, c = h.indent; } - const { indentSize: c } = this._context.viewModel.model.getOptions(), d = []; + const { indentSize: d } = this._context.viewModel.model.getOptions(), a = []; for (let h = e; h <= t; h++) { const u = new Array(); - d.push(u); - const g = n ? n[h - e] : [], m = new Hc(g), f = o ? o[h - e] : 0; - for (let b = 1; b <= f; b++) { - const y = (b - 1) * c + 1, w = ( + a.push(u); + const m = n ? n[h - e] : [], b = new Od(m), g = o ? o[h - e] : 0; + for (let Z = 1; Z <= g; Z++) { + const f = (Z - 1) * d + 1, y = ( // Disable active indent guide if there are bracket guides. - (this._bracketPairGuideOptions.highlightActiveIndentation === "always" || g.length === 0) && r <= h && h <= l && b === a + (this._bracketPairGuideOptions.highlightActiveIndentation === "always" || m.length === 0) && l <= h && h <= r && Z === c ); - u.push(...m.takeWhile((S) => S.visibleColumn < y) || []); - const C = m.peek(); - (!C || C.visibleColumn !== y || C.horizontalLine) && u.push(new $u(y, -1, `core-guide-indent lvl-${(b - 1) % 30}` + (w ? " indent-active" : ""), null, -1, -1)); + u.push(...b.takeWhile((G) => G.visibleColumn < f) || []); + const W = b.peek(); + (!W || W.visibleColumn !== f || W.horizontalLine) && u.push(new sm(f, -1, `core-guide-indent lvl-${(Z - 1) % 30}` + (y ? " indent-active" : ""), null, -1, -1)); } - u.push(...m.takeWhile((b) => !0) || []); + u.push(...b.takeWhile((Z) => !0) || []); } - return d; + return a; } render(e, t) { if (!this._renderResult) @@ -26792,56 +26792,56 @@ class kre extends Xm { return i < 0 || i >= this._renderResult.length ? "" : this._renderResult[i]; } } -function op(s) { +function ap(s) { if (!(s && s.isTransparent())) return s; } -Lr((s, e) => { +Il((s, e) => { const t = [ - { bracketColor: ZU, guideColor: Poe, guideColorActive: Koe }, - { bracketColor: _U, guideColor: Boe, guideColorActive: Qoe }, - { bracketColor: IU, guideColor: Ooe, guideColorActive: joe }, - { bracketColor: NU, guideColor: Hoe, guideColorActive: qoe }, - { bracketColor: WU, guideColor: Joe, guideColorActive: $oe }, - { bracketColor: vU, guideColor: Uoe, guideColorActive: ere } - ], i = new YU(), n = [ - { indentColor: SC, indentColorActive: LC }, - { indentColor: Soe, indentColorActive: Zoe }, - { indentColor: Loe, indentColorActive: _oe }, - { indentColor: Aoe, indentColorActive: Ioe }, - { indentColor: xoe, indentColorActive: Noe }, - { indentColor: Moe, indentColorActive: Woe } - ], o = t.map((l) => { - const a = s.getColor(l.bracketColor), c = s.getColor(l.guideColor), d = s.getColor(l.guideColorActive), h = op(op(c) ?? (a == null ? void 0 : a.transparent(0.3))), u = op(op(d) ?? a); + { bracketColor: cQ, guideColor: kle, guideColorActive: Fle }, + { bracketColor: dQ, guideColor: vle, guideColorActive: zle }, + { bracketColor: aQ, guideColor: Jle, guideColorActive: Ale }, + { bracketColor: hQ, guideColor: Hle, guideColorActive: Kle }, + { bracketColor: uQ, guideColor: Ele, guideColorActive: Ule }, + { bracketColor: mQ, guideColor: Dle, guideColorActive: Ple } + ], i = new VQ(), n = [ + { indentColor: YG, indentColorActive: kG }, + { indentColor: mle, indentColorActive: fle }, + { indentColor: ble, indentColorActive: yle }, + { indentColor: ple, indentColorActive: Wle }, + { indentColor: gle, indentColorActive: Gle }, + { indentColor: Zle, indentColorActive: Xle } + ], o = t.map((r) => { + const c = s.getColor(r.bracketColor), d = s.getColor(r.guideColor), a = s.getColor(r.guideColorActive), h = ap(ap(d) ?? (c == null ? void 0 : c.transparent(0.3))), u = ap(ap(a) ?? c); if (!(!h || !u)) return { guideColor: h, guideColorActive: u }; - }).filter(xa), r = n.map((l) => { - const a = s.getColor(l.indentColor), c = s.getColor(l.indentColorActive), d = op(a), h = op(c); - if (!(!d || !h)) + }).filter(Cc), l = n.map((r) => { + const c = s.getColor(r.indentColor), d = s.getColor(r.indentColorActive), a = ap(c), h = ap(d); + if (!(!a || !h)) return { - indentColor: d, + indentColor: a, indentColorActive: h }; - }).filter(xa); + }).filter(Cc); if (o.length > 0) { - for (let l = 0; l < 30; l++) { - const a = o[l % o.length]; - e.addRule(`.monaco-editor .${i.getInlineClassNameOfLevel(l).replace(/ /g, ".")} { --guide-color: ${a.guideColor}; --guide-color-active: ${a.guideColorActive}; }`); + for (let r = 0; r < 30; r++) { + const c = o[r % o.length]; + e.addRule(`.monaco-editor .${i.getInlineClassNameOfLevel(r).replace(/ /g, ".")} { --guide-color: ${c.guideColor}; --guide-color-active: ${c.guideColorActive}; }`); } e.addRule(".monaco-editor .vertical { box-shadow: 1px 0 0 0 var(--guide-color) inset; }"), e.addRule(".monaco-editor .horizontal-top { border-top: 1px solid var(--guide-color); }"), e.addRule(".monaco-editor .horizontal-bottom { border-bottom: 1px solid var(--guide-color); }"), e.addRule(`.monaco-editor .vertical.${i.activeClassName} { box-shadow: 1px 0 0 0 var(--guide-color-active) inset; }`), e.addRule(`.monaco-editor .horizontal-top.${i.activeClassName} { border-top: 1px solid var(--guide-color-active); }`), e.addRule(`.monaco-editor .horizontal-bottom.${i.activeClassName} { border-bottom: 1px solid var(--guide-color-active); }`); } - if (r.length > 0) { - for (let l = 0; l < 30; l++) { - const a = r[l % r.length]; - e.addRule(`.monaco-editor .lines-content .core-guide-indent.lvl-${l} { --indent-color: ${a.indentColor}; --indent-color-active: ${a.indentColorActive}; }`); + if (l.length > 0) { + for (let r = 0; r < 30; r++) { + const c = l[r % l.length]; + e.addRule(`.monaco-editor .lines-content .core-guide-indent.lvl-${r} { --indent-color: ${c.indentColor}; --indent-color-active: ${c.indentColorActive}; }`); } e.addRule(".monaco-editor .lines-content .core-guide-indent { box-shadow: 1px 0 0 0 var(--indent-color) inset; }"), e.addRule(".monaco-editor .lines-content .core-guide-indent.indent-active { box-shadow: 1px 0 0 0 var(--indent-color-active) inset; }"); } }); -class JN { +class dR { get didDomLayout() { return this._didDomLayout; } @@ -26865,9 +26865,9 @@ class JN { this._didDomLayout = !0; } } -class Gre { +class Cre { constructor() { - this._currentVisibleRange = new M(1, 1, 1, 1); + this._currentVisibleRange = new I(1, 1, 1, 1); } getCurrentVisibleRange() { return this._currentVisibleRange; @@ -26877,35 +26877,35 @@ class Gre { } } class Rre { - constructor(e, t, i, n, o, r, l) { - this.minimalReveal = e, this.lineNumber = t, this.startColumn = i, this.endColumn = n, this.startScrollTop = o, this.stopScrollTop = r, this.scrollType = l, this.type = "range", this.minLineNumber = t, this.maxLineNumber = t; + constructor(e, t, i, n, o, l, r) { + this.minimalReveal = e, this.lineNumber = t, this.startColumn = i, this.endColumn = n, this.startScrollTop = o, this.stopScrollTop = l, this.scrollType = r, this.type = "range", this.minLineNumber = t, this.maxLineNumber = t; } } -class Ere { +class Nre { constructor(e, t, i, n, o) { this.minimalReveal = e, this.selections = t, this.startScrollTop = i, this.stopScrollTop = n, this.scrollType = o, this.type = "selections"; - let r = t[0].startLineNumber, l = t[0].endLineNumber; - for (let a = 1, c = t.length; a < c; a++) { - const d = t[a]; - r = Math.min(r, d.startLineNumber), l = Math.max(l, d.endLineNumber); + let l = t[0].startLineNumber, r = t[0].endLineNumber; + for (let c = 1, d = t.length; c < d; c++) { + const a = t[c]; + l = Math.min(l, a.startLineNumber), r = Math.max(r, a.endLineNumber); } - this.minLineNumber = r, this.maxLineNumber = l; + this.minLineNumber = l, this.maxLineNumber = r; } } -const hZ = class hZ extends wo { +const S2 = class S2 extends Go { constructor(e, t) { super(e); const i = this._context.configuration, n = this._context.configuration.options, o = n.get( 50 /* EditorOption.fontInfo */ - ), r = n.get( + ), l = n.get( 147 /* EditorOption.wrappingInfo */ ); this._lineHeight = n.get( 67 /* EditorOption.lineHeight */ - ), this._typicalHalfwidthCharacterWidth = o.typicalHalfwidthCharacterWidth, this._isViewportWrapping = r.isViewportWrapping, this._revealHorizontalRightPadding = n.get( + ), this._typicalHalfwidthCharacterWidth = o.typicalHalfwidthCharacterWidth, this._isViewportWrapping = l.isViewportWrapping, this._revealHorizontalRightPadding = n.get( 101 /* EditorOption.revealHorizontalRightPadding */ ), this._cursorSurroundingLines = n.get( @@ -26917,17 +26917,17 @@ const hZ = class hZ extends wo { ), this._canUseLayerHinting = !n.get( 32 /* EditorOption.disableLayerHinting */ - ), this._viewLineOptions = new OF(i, this._context.theme.type), this._linesContent = t, this._textRangeRestingSpot = document.createElement("div"), this._visibleLines = new kU({ - createLine: () => new wc(this._viewLineOptions) - }), this.domNode = this._visibleLines.domNode, Tl.write( + ), this._viewLineOptions = new gF(i, this._context.theme.type), this._linesContent = t, this._textRangeRestingSpot = document.createElement("div"), this._visibleLines = new ZQ({ + createLine: () => new Vd(this._viewLineOptions) + }), this.domNode = this._visibleLines.domNode, vr.write( this.domNode, 8 /* PartFingerprint.ViewLines */ - ), this.domNode.setClassName(`view-lines ${If}`), mn(this.domNode, o), this._maxLineWidth = 0, this._asyncUpdateLineWidths = new Zt(() => { + ), this.domNode.setClassName(`view-lines ${Yg}`), pn(this.domNode, o), this._maxLineWidth = 0, this._asyncUpdateLineWidths = new St(() => { this._updateLineWidthsSlow(); - }, 200), this._asyncCheckMonospaceFontAssumptions = new Zt(() => { + }, 200), this._asyncCheckMonospaceFontAssumptions = new St(() => { this._checkMonospaceFontAssumptions(); - }, 2e3), this._lastRenderedData = new Gre(), this._horizontalRevealRequest = null, this._stickyScrollEnabled = n.get( + }, 2e3), this._lastRenderedData = new Cre(), this._horizontalRevealRequest = null, this._stickyScrollEnabled = n.get( 116 /* EditorOption.stickyScroll */ ).enabled, this._maxNumberStickyLines = n.get( @@ -26975,13 +26975,13 @@ const hZ = class hZ extends wo { ).enabled, this._maxNumberStickyLines = t.get( 116 /* EditorOption.stickyScroll */ - ).maxLineCount, mn(this.domNode, i), this._onOptionsMaybeChanged(), e.hasChanged( + ).maxLineCount, pn(this.domNode, i), this._onOptionsMaybeChanged(), e.hasChanged( 146 /* EditorOption.layoutInfo */ ) && (this._maxLineWidth = 0), !0; } _onOptionsMaybeChanged() { - const e = this._context.configuration, t = new OF(e, this._context.theme.type); + const e = this._context.configuration, t = new gF(e, this._context.theme.type); if (!this._viewLineOptions.equals(t)) { this._viewLineOptions = t; const i = this._visibleLines.getStartLineNumber(), n = this._visibleLines.getEndLineNumber(); @@ -27027,7 +27027,7 @@ const hZ = class hZ extends wo { e.revealHorizontal ? e.range && e.range.startLineNumber !== e.range.endLineNumber ? i = { scrollTop: i.scrollTop, scrollLeft: 0 - } : e.range ? this._horizontalRevealRequest = new Rre(e.minimalReveal, e.range.startLineNumber, e.range.startColumn, e.range.endColumn, this._context.viewLayout.getCurrentScrollTop(), i.scrollTop, e.scrollType) : e.selections && e.selections.length > 0 && (this._horizontalRevealRequest = new Ere(e.minimalReveal, e.selections, this._context.viewLayout.getCurrentScrollTop(), i.scrollTop, e.scrollType)) : this._horizontalRevealRequest = null; + } : e.range ? this._horizontalRevealRequest = new Rre(e.minimalReveal, e.range.startLineNumber, e.range.startColumn, e.range.endColumn, this._context.viewLayout.getCurrentScrollTop(), i.scrollTop, e.scrollType) : e.selections && e.selections.length > 0 && (this._horizontalRevealRequest = new Nre(e.minimalReveal, e.selections, this._context.viewLayout.getCurrentScrollTop(), i.scrollTop, e.scrollType)) : this._horizontalRevealRequest = null; const o = Math.abs(this._context.viewLayout.getCurrentScrollTop() - i.scrollTop) <= this._lineHeight ? 1 : e.scrollType; return this._context.viewModel.viewLayout.setScrollPosition(i, o), !0; } @@ -27057,17 +27057,17 @@ const hZ = class hZ extends wo { if (n === -1 || n < 1 || n > this._context.viewModel.getLineCount()) return null; if (this._context.viewModel.getLineMaxColumn(n) === 1) - return new V(n, 1); - const o = this._visibleLines.getStartLineNumber(), r = this._visibleLines.getEndLineNumber(); - if (n < o || n > r) + return new Y(n, 1); + const o = this._visibleLines.getStartLineNumber(), l = this._visibleLines.getEndLineNumber(); + if (n < o || n > l) return null; - let l = this._visibleLines.getVisibleLine(n).getColumnOfNodeOffset(e, t); - const a = this._context.viewModel.getLineMinColumn(n); - return l < a && (l = a), new V(n, l); + let r = this._visibleLines.getVisibleLine(n).getColumnOfNodeOffset(e, t); + const c = this._context.viewModel.getLineMinColumn(n); + return r < c && (r = c), new Y(n, r); } _getViewLineDomNode(e) { for (; e && e.nodeType === 1; ) { - if (e.className === wc.CLASS_NAME) + if (e.className === Vd.CLASS_NAME) return e; e = e.parentElement; } @@ -27089,44 +27089,44 @@ const hZ = class hZ extends wo { const t = this._visibleLines.getStartLineNumber(), i = this._visibleLines.getEndLineNumber(); if (e < t || e > i) return -1; - const n = new JN(this.domNode.domNode, this._textRangeRestingSpot), o = this._visibleLines.getVisibleLine(e).getWidth(n); + const n = new dR(this.domNode.domNode, this._textRangeRestingSpot), o = this._visibleLines.getVisibleLine(e).getWidth(n); return this._updateLineWidthsSlowIfDomDidLayout(n), o; } linesVisibleRangesForRange(e, t) { if (this.shouldRender()) return null; - const i = e.endLineNumber, n = M.intersectRanges(e, this._lastRenderedData.getCurrentVisibleRange()); + const i = e.endLineNumber, n = I.intersectRanges(e, this._lastRenderedData.getCurrentVisibleRange()); if (!n) return null; const o = []; - let r = 0; - const l = new JN(this.domNode.domNode, this._textRangeRestingSpot); - let a = 0; - t && (a = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new V(n.startLineNumber, 1)).lineNumber); - const c = this._visibleLines.getStartLineNumber(), d = this._visibleLines.getEndLineNumber(); + let l = 0; + const r = new dR(this.domNode.domNode, this._textRangeRestingSpot); + let c = 0; + t && (c = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Y(n.startLineNumber, 1)).lineNumber); + const d = this._visibleLines.getStartLineNumber(), a = this._visibleLines.getEndLineNumber(); for (let h = n.startLineNumber; h <= n.endLineNumber; h++) { - if (h < c || h > d) + if (h < d || h > a) continue; - const u = h === n.startLineNumber ? n.startColumn : 1, g = h !== n.endLineNumber, m = g ? this._context.viewModel.getLineMaxColumn(h) : n.endColumn, f = this._visibleLines.getVisibleLine(h).getVisibleRangesForRange(h, u, m, l); - if (f) { + const u = h === n.startLineNumber ? n.startColumn : 1, m = h !== n.endLineNumber, b = m ? this._context.viewModel.getLineMaxColumn(h) : n.endColumn, g = this._visibleLines.getVisibleLine(h).getVisibleRangesForRange(h, u, b, r); + if (g) { if (t && h < i) { - const b = a; - a = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new V(h + 1, 1)).lineNumber, b !== a && (f.ranges[f.ranges.length - 1].width += this._typicalHalfwidthCharacterWidth); + const Z = c; + c = this._context.viewModel.coordinatesConverter.convertViewPositionToModelPosition(new Y(h + 1, 1)).lineNumber, Z !== c && (g.ranges[g.ranges.length - 1].width += this._typicalHalfwidthCharacterWidth); } - o[r++] = new xse(f.outsideRenderedLine, h, cI.from(f.ranges), g); + o[l++] = new goe(g.outsideRenderedLine, h, Lx.from(g.ranges), m); } } - return this._updateLineWidthsSlowIfDomDidLayout(l), r === 0 ? null : o; + return this._updateLineWidthsSlowIfDomDidLayout(r), l === 0 ? null : o; } _visibleRangesForLineRange(e, t, i) { if (this.shouldRender() || e < this._visibleLines.getStartLineNumber() || e > this._visibleLines.getEndLineNumber()) return null; - const n = new JN(this.domNode.domNode, this._textRangeRestingSpot), o = this._visibleLines.getVisibleLine(e).getVisibleRangesForRange(e, t, i, n); + const n = new dR(this.domNode.domNode, this._textRangeRestingSpot), o = this._visibleLines.getVisibleLine(e).getVisibleRangesForRange(e, t, i, n); return this._updateLineWidthsSlowIfDomDidLayout(n), o; } visibleRangeForPosition(e) { const t = this._visibleRangesForLineRange(e.lineNumber, e.column, e.column); - return t ? new Mse(t.outsideRenderedLine, t.ranges[0].left) : null; + return t ? new Zoe(t.outsideRenderedLine, t.ranges[0].left) : null; } /** * Updates the max line width if it is fast to compute. @@ -27149,13 +27149,13 @@ const hZ = class hZ extends wo { _updateLineWidths(e) { const t = this._visibleLines.getStartLineNumber(), i = this._visibleLines.getEndLineNumber(); let n = 1, o = !0; - for (let r = t; r <= i; r++) { - const l = this._visibleLines.getVisibleLine(r); - if (e && !l.getWidthIsFast()) { + for (let l = t; l <= i; l++) { + const r = this._visibleLines.getVisibleLine(l); + if (e && !r.getWidthIsFast()) { o = !1; continue; } - n = Math.max(n, l.getWidth(null)); + n = Math.max(n, r.getWidth(null)); } return o && t === 1 && i === this._context.viewModel.getLineCount() && (this._maxLineWidth = 0), this._ensureMaxLineWidth(n), o; } @@ -27163,10 +27163,10 @@ const hZ = class hZ extends wo { let e = -1, t = -1; const i = this._visibleLines.getStartLineNumber(), n = this._visibleLines.getEndLineNumber(); for (let o = i; o <= n; o++) { - const r = this._visibleLines.getVisibleLine(o); - if (r.needsMonospaceFontCheck()) { - const l = r.getWidth(null); - l > t && (t = l, e = o); + const l = this._visibleLines.getVisibleLine(o); + if (l.needsMonospaceFontCheck()) { + const r = l.getWidth(null); + r > t && (t = r, e = o); } } if (e !== -1 && !this._visibleLines.getVisibleLine(e).monospaceAssumptionsAreValid()) @@ -27207,107 +27207,107 @@ const hZ = class hZ extends wo { const t = Math.ceil(e); this._maxLineWidth < t && (this._maxLineWidth = t, this._context.viewModel.viewLayout.setMaxLineWidth(this._maxLineWidth)); } - _computeScrollTopToRevealRange(e, t, i, n, o, r) { - const l = e.top, a = e.height, c = l + a; - let d, h, u; + _computeScrollTopToRevealRange(e, t, i, n, o, l) { + const r = e.top, c = e.height, d = r + c; + let a, h, u; if (o && o.length > 0) { - let y = o[0].startLineNumber, w = o[0].endLineNumber; - for (let C = 1, S = o.length; C < S; C++) { - const L = o[C]; - y = Math.min(y, L.startLineNumber), w = Math.max(w, L.endLineNumber); + let f = o[0].startLineNumber, y = o[0].endLineNumber; + for (let W = 1, G = o.length; W < G; W++) { + const X = o[W]; + f = Math.min(f, X.startLineNumber), y = Math.max(y, X.endLineNumber); } - d = !1, h = this._context.viewLayout.getVerticalOffsetForLineNumber(y), u = this._context.viewLayout.getVerticalOffsetForLineNumber(w) + this._lineHeight; + a = !1, h = this._context.viewLayout.getVerticalOffsetForLineNumber(f), u = this._context.viewLayout.getVerticalOffsetForLineNumber(y) + this._lineHeight; } else if (n) - d = !0, h = this._context.viewLayout.getVerticalOffsetForLineNumber(n.startLineNumber), u = this._context.viewLayout.getVerticalOffsetForLineNumber(n.endLineNumber) + this._lineHeight; + a = !0, h = this._context.viewLayout.getVerticalOffsetForLineNumber(n.startLineNumber), u = this._context.viewLayout.getVerticalOffsetForLineNumber(n.endLineNumber) + this._lineHeight; else return -1; - const g = (t === "mouse" || i) && this._cursorSurroundingLinesStyle === "default"; - let m = 0, f = 0; - if (g) - i || (m = this._lineHeight); + const m = (t === "mouse" || i) && this._cursorSurroundingLinesStyle === "default"; + let b = 0, g = 0; + if (m) + i || (b = this._lineHeight); else { - const y = a / this._lineHeight, w = Math.max(this._cursorSurroundingLines, this._stickyScrollEnabled ? this._maxNumberStickyLines : 0), C = Math.min(y / 2, w); - m = C * this._lineHeight, f = Math.max(0, C - 1) * this._lineHeight; + const f = c / this._lineHeight, y = Math.max(this._cursorSurroundingLines, this._stickyScrollEnabled ? this._maxNumberStickyLines : 0), W = Math.min(f / 2, y); + b = W * this._lineHeight, g = Math.max(0, W - 1) * this._lineHeight; } - i || (r === 0 || r === 4) && (f += this._lineHeight), h -= m, u += f; - let b; - if (u - h > a) { - if (!d) + i || (l === 0 || l === 4) && (g += this._lineHeight), h -= b, u += g; + let Z; + if (u - h > c) { + if (!a) return -1; - b = h; - } else if (r === 5 || r === 6) - if (r === 6 && l <= h && u <= c) - b = l; + Z = h; + } else if (l === 5 || l === 6) + if (l === 6 && r <= h && u <= d) + Z = r; else { - const y = Math.max(5 * this._lineHeight, a * 0.2), w = h - y, C = u - a; - b = Math.max(C, w); + const f = Math.max(5 * this._lineHeight, c * 0.2), y = h - f, W = u - c; + Z = Math.max(W, y); } - else if (r === 1 || r === 2) - if (r === 2 && l <= h && u <= c) - b = l; + else if (l === 1 || l === 2) + if (l === 2 && r <= h && u <= d) + Z = r; else { - const y = (h + u) / 2; - b = Math.max(0, y - a / 2); + const f = (h + u) / 2; + Z = Math.max(0, f - c / 2); } else - b = this._computeMinimumScrolling( - l, - c, + Z = this._computeMinimumScrolling( + r, + d, h, u, - r === 3, - r === 4 + l === 3, + l === 4 /* viewEvents.VerticalRevealType.Bottom */ ); - return b; + return Z; } _computeScrollLeftToReveal(e) { const t = this._context.viewLayout.getCurrentViewport(), i = this._context.configuration.options.get( 146 /* EditorOption.layoutInfo */ ), n = t.left, o = n + t.width - i.verticalScrollbarWidth; - let r = 1073741824, l = 0; + let l = 1073741824, r = 0; if (e.type === "range") { - const c = this._visibleRangesForLineRange(e.lineNumber, e.startColumn, e.endColumn); - if (!c) + const d = this._visibleRangesForLineRange(e.lineNumber, e.startColumn, e.endColumn); + if (!d) return null; - for (const d of c.ranges) - r = Math.min(r, Math.round(d.left)), l = Math.max(l, Math.round(d.left + d.width)); + for (const a of d.ranges) + l = Math.min(l, Math.round(a.left)), r = Math.max(r, Math.round(a.left + a.width)); } else - for (const c of e.selections) { - if (c.startLineNumber !== c.endLineNumber) + for (const d of e.selections) { + if (d.startLineNumber !== d.endLineNumber) return null; - const d = this._visibleRangesForLineRange(c.startLineNumber, c.startColumn, c.endColumn); - if (!d) + const a = this._visibleRangesForLineRange(d.startLineNumber, d.startColumn, d.endColumn); + if (!a) return null; - for (const h of d.ranges) - r = Math.min(r, Math.round(h.left)), l = Math.max(l, Math.round(h.left + h.width)); + for (const h of a.ranges) + l = Math.min(l, Math.round(h.left)), r = Math.max(r, Math.round(h.left + h.width)); } - return e.minimalReveal || (r = Math.max(0, r - hZ.HORIZONTAL_EXTRA_PX), l += this._revealHorizontalRightPadding), e.type === "selections" && l - r > t.width ? null : { - scrollLeft: this._computeMinimumScrolling(n, o, r, l), - maxHorizontalOffset: l + return e.minimalReveal || (l = Math.max(0, l - S2.HORIZONTAL_EXTRA_PX), r += this._revealHorizontalRightPadding), e.type === "selections" && r - l > t.width ? null : { + scrollLeft: this._computeMinimumScrolling(n, o, l, r), + maxHorizontalOffset: r }; } - _computeMinimumScrolling(e, t, i, n, o, r) { - e = e | 0, t = t | 0, i = i | 0, n = n | 0, o = !!o, r = !!r; - const l = t - e; - if (n - i < l) { + _computeMinimumScrolling(e, t, i, n, o, l) { + e = e | 0, t = t | 0, i = i | 0, n = n | 0, o = !!o, l = !!l; + const r = t - e; + if (n - i < r) { if (o) return i; - if (r) - return Math.max(0, n - l); + if (l) + return Math.max(0, n - r); if (i < e) return i; if (n > t) - return Math.max(0, n - l); + return Math.max(0, n - r); } else return i; return e; } }; -hZ.HORIZONTAL_EXTRA_PX = 30; -let Sv = hZ; -class Xre extends XU { +S2.HORIZONTAL_EXTRA_PX = 30; +let zw = S2; +class wre extends GQ { constructor(e) { super(), this._context = e; const i = this._context.configuration.options.get( @@ -27352,32 +27352,32 @@ class Xre extends XU { _getDecorations(e) { const t = e.getDecorationsInViewport(), i = []; let n = 0; - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o], a = l.options.linesDecorationsClassName, c = l.options.zIndex; - a && (i[n++] = new Cv(l.range.startLineNumber, l.range.endLineNumber, a, l.options.linesDecorationsTooltip ?? null, c)); - const d = l.options.firstLineDecorationClassName; - d && (i[n++] = new Cv(l.range.startLineNumber, l.range.startLineNumber, d, l.options.linesDecorationsTooltip ?? null, c)); + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o], c = r.options.linesDecorationsClassName, d = r.options.zIndex; + c && (i[n++] = new Fw(r.range.startLineNumber, r.range.endLineNumber, c, r.options.linesDecorationsTooltip ?? null, d)); + const a = r.options.firstLineDecorationClassName; + a && (i[n++] = new Fw(r.range.startLineNumber, r.range.startLineNumber, a, r.options.linesDecorationsTooltip ?? null, d)); } return i; } prepareRender(e) { - const t = e.visibleRange.startLineNumber, i = e.visibleRange.endLineNumber, n = this._render(t, i, this._getDecorations(e)), o = this._decorationsLeft.toString(), r = this._decorationsWidth.toString(), l = '" style="left:' + o + "px;width:" + r + 'px;">
', a = []; - for (let c = t; c <= i; c++) { - const d = c - t, h = n[d].getDecorations(); + const t = e.visibleRange.startLineNumber, i = e.visibleRange.endLineNumber, n = this._render(t, i, this._getDecorations(e)), o = this._decorationsLeft.toString(), l = this._decorationsWidth.toString(), r = '" style="left:' + o + "px;width:" + l + 'px;">', c = []; + for (let d = t; d <= i; d++) { + const a = d - t, h = n[a].getDecorations(); let u = ""; - for (const g of h) { - let m = '
'; - o[l] = c; + for (let l = t; l <= i; l++) { + const r = l - t, c = n[r].getDecorations(); + let d = ""; + for (const a of c) + d += '
'; + o[r] = d; } this._renderResult = o; } @@ -27434,9 +27434,9 @@ class Fre extends XU { return this._renderResult ? this._renderResult[t - e] : ""; } } -const Md = class Md { +const Ra = class Ra { constructor(e, t, i, n) { - this._rgba8Brand = void 0, this.r = Md._clamp(e), this.g = Md._clamp(t), this.b = Md._clamp(i), this.a = Md._clamp(n); + this._rgba8Brand = void 0, this.r = Ra._clamp(e), this.g = Ra._clamp(t), this.b = Ra._clamp(i), this.a = Ra._clamp(n); } equals(e) { return this.r === e.r && this.g === e.g && this.b === e.b && this.a === e.a; @@ -27445,27 +27445,27 @@ const Md = class Md { return e < 0 ? 0 : e > 255 ? 255 : e | 0; } }; -Md.Empty = new Md(0, 0, 0, 0); -let Rc = Md; -const uZ = class uZ extends R { +Ra.Empty = new Ra(0, 0, 0, 0); +let Fd = Ra; +const x2 = class x2 extends J { static getInstance() { - return this._INSTANCE || (this._INSTANCE = new uZ()), this._INSTANCE; + return this._INSTANCE || (this._INSTANCE = new x2()), this._INSTANCE; } constructor() { - super(), this._onDidChange = new k(), this.onDidChange = this._onDidChange.event, this._updateColorMap(), this._register(Wi.onDidChange((e) => { + super(), this._onDidChange = new k(), this.onDidChange = this._onDidChange.event, this._updateColorMap(), this._register(Ti.onDidChange((e) => { e.changedColorMap && this._updateColorMap(); })); } _updateColorMap() { - const e = Wi.getColorMap(); + const e = Ti.getColorMap(); if (!e) { - this._colors = [Rc.Empty], this._backgroundIsLight = !0; + this._colors = [Fd.Empty], this._backgroundIsLight = !0; return; } - this._colors = [Rc.Empty]; + this._colors = [Fd.Empty]; for (let i = 1; i < e.length; i++) { const n = e[i].rgba; - this._colors[i] = new Rc(n.r, n.g, n.b, Math.round(n.a * 255)); + this._colors[i] = new Fd(n.r, n.g, n.b, Math.round(n.a * 255)); } const t = e[ 2 @@ -27480,58 +27480,58 @@ const uZ = class uZ extends R { return this._backgroundIsLight; } }; -uZ._INSTANCE = null; -let EA = uZ; -class $F { +x2._INSTANCE = null; +let $V = x2; +class LF { constructor(e, t, i, n) { this._viewportBrand = void 0, this.top = e | 0, this.left = t | 0, this.width = i | 0, this.height = n | 0; } } -class Yre { +class Mre { constructor(e, t) { this.tabSize = e, this.data = t; } } -class qE { - constructor(e, t, i, n, o, r, l) { - this._viewLineDataBrand = void 0, this.content = e, this.continuesWithWrappedLine = t, this.minColumn = i, this.maxColumn = n, this.startVisibleColumn = o, this.tokens = r, this.inlineDecorations = l; +class VJ { + constructor(e, t, i, n, o, l, r) { + this._viewLineDataBrand = void 0, this.content = e, this.continuesWithWrappedLine = t, this.minColumn = i, this.maxColumn = n, this.startVisibleColumn = o, this.tokens = l, this.inlineDecorations = r; } } -class Oo { - constructor(e, t, i, n, o, r, l, a, c, d) { - this.minColumn = e, this.maxColumn = t, this.content = i, this.continuesWithWrappedLine = n, this.isBasicASCII = Oo.isBasicASCII(i, r), this.containsRTL = Oo.containsRTL(i, this.isBasicASCII, o), this.tokens = l, this.inlineDecorations = a, this.tabSize = c, this.startVisibleColumn = d; +class Bo { + constructor(e, t, i, n, o, l, r, c, d, a) { + this.minColumn = e, this.maxColumn = t, this.content = i, this.continuesWithWrappedLine = n, this.isBasicASCII = Bo.isBasicASCII(i, l), this.containsRTL = Bo.containsRTL(i, this.isBasicASCII, o), this.tokens = r, this.inlineDecorations = c, this.tabSize = d, this.startVisibleColumn = a; } static isBasicASCII(e, t) { - return t ? uC(e) : !0; + return t ? IG(e) : !0; } static containsRTL(e, t, i) { - return !t && i ? lb(e) : !1; + return !t && i ? mZ(e) : !1; } } -class Dy { +class Kf { constructor(e, t, i) { this.range = e, this.inlineClassName = t, this.type = i; } } -class zre { +class Yre { constructor(e, t, i, n) { this.startOffset = e, this.endOffset = t, this.inlineClassName = i, this.inlineClassNameAffectsLetterSpacing = n; } toInlineDecoration(e) { - return new Dy( - new M(e, this.startOffset + 1, e, this.endOffset + 1), + return new Kf( + new I(e, this.startOffset + 1, e, this.endOffset + 1), this.inlineClassName, this.inlineClassNameAffectsLetterSpacing ? 3 : 0 /* InlineDecorationType.Regular */ ); } } -class zU { +class LQ { constructor(e, t) { this._viewModelDecorationBrand = void 0, this.range = e, this.options = t; } } -class s1 { +class gW { constructor(e, t, i) { this.color = e, this.zIndex = t, this.data = i; } @@ -27539,13 +27539,13 @@ class s1 { return e.zIndex === t.zIndex ? e.color < t.color ? -1 : e.color > t.color ? 1 : 0 : e.zIndex - t.zIndex; } static equals(e, t) { - return e.color === t.color && e.zIndex === t.zIndex && ei(e.data, t.data); + return e.color === t.color && e.zIndex === t.zIndex && ti(e.data, t.data); } static equalsArr(e, t) { - return ei(e, t, s1.equals); + return ti(e, t, gW.equals); } } -const Pre = (() => { +const kre = (() => { const s = []; for (let e = 32; e <= 126; e++) s.push(e); @@ -27553,51 +27553,51 @@ const Pre = (() => { 65533 /* Constants.UNKNOWN_CODE */ ), s; -})(), Bre = (s, e) => (s -= 32, s < 0 || s > 96 ? e <= 2 ? (s + 96) % 96 : 95 : s); -class o1 { +})(), vre = (s, e) => (s -= 32, s < 0 || s > 96 ? e <= 2 ? (s + 96) % 96 : 95 : s); +class ZW { constructor(e, t) { - this.scale = t, this._minimapCharRendererBrand = void 0, this.charDataNormal = o1.soften(e, 12 / 15), this.charDataLight = o1.soften(e, 50 / 60); + this.scale = t, this._minimapCharRendererBrand = void 0, this.charDataNormal = ZW.soften(e, 12 / 15), this.charDataLight = ZW.soften(e, 50 / 60); } static soften(e, t) { const i = new Uint8ClampedArray(e.length); for (let n = 0, o = e.length; n < o; n++) - i[n] = pA(e[n] * t); + i[n] = NV(e[n] * t); return i; } - renderChar(e, t, i, n, o, r, l, a, c, d, h) { - const u = 1 * this.scale, g = 2 * this.scale, m = h ? 1 : g; - if (t + u > e.width || i + m > e.height) { + renderChar(e, t, i, n, o, l, r, c, d, a, h) { + const u = 1 * this.scale, m = 2 * this.scale, b = h ? 1 : m; + if (t + u > e.width || i + b > e.height) { console.warn("bad render request outside image data"); return; } - const f = d ? this.charDataLight : this.charDataNormal, b = Bre(n, c), y = e.width * 4, w = l.r, C = l.g, S = l.b, L = o.r - w, x = o.g - C, Z = o.b - S, _ = Math.max(r, a), v = e.data; - let P = b * u * g, E = i * y + t * 4; - for (let Y = 0; Y < m; Y++) { - let B = E; - for (let X = 0; X < u; X++) { - const j = f[P++] / 255 * (r / 255); - v[B++] = w + L * j, v[B++] = C + x * j, v[B++] = S + Z * j, v[B++] = _; + const g = a ? this.charDataLight : this.charDataNormal, Z = vre(n, d), f = e.width * 4, y = r.r, W = r.g, G = r.b, X = o.r - y, L = o.g - W, S = o.b - G, x = Math.max(l, c), w = e.data; + let A = Z * u * m, H = i * f + t * 4; + for (let F = 0; F < b; F++) { + let K = H; + for (let E = 0; E < u; E++) { + const j = g[A++] / 255 * (l / 255); + w[K++] = y + X * j, w[K++] = W + L * j, w[K++] = G + S * j, w[K++] = x; } - E += y; + H += f; } } - blockRenderChar(e, t, i, n, o, r, l, a) { - const c = 1 * this.scale, d = 2 * this.scale, h = a ? 1 : d; - if (t + c > e.width || i + h > e.height) { + blockRenderChar(e, t, i, n, o, l, r, c) { + const d = 1 * this.scale, a = 2 * this.scale, h = c ? 1 : a; + if (t + d > e.width || i + h > e.height) { console.warn("bad render request outside image data"); return; } - const u = e.width * 4, g = 0.5 * (o / 255), m = r.r, f = r.g, b = r.b, y = n.r - m, w = n.g - f, C = n.b - b, S = m + y * g, L = f + w * g, x = b + C * g, Z = Math.max(o, l), _ = e.data; - let v = i * u + t * 4; - for (let P = 0; P < h; P++) { - let E = v; - for (let Y = 0; Y < c; Y++) - _[E++] = S, _[E++] = L, _[E++] = x, _[E++] = Z; - v += u; + const u = e.width * 4, m = 0.5 * (o / 255), b = l.r, g = l.g, Z = l.b, f = n.r - b, y = n.g - g, W = n.b - Z, G = b + f * m, X = g + y * m, L = Z + W * m, S = Math.max(o, r), x = e.data; + let w = i * u + t * 4; + for (let A = 0; A < h; A++) { + let H = w; + for (let F = 0; F < d; F++) + x[H++] = G, x[H++] = X, x[H++] = L, x[H++] = S; + w += u; } } } -const eY = { +const IF = { 0: 0, 1: 1, 2: 2, @@ -27614,16 +27614,16 @@ const eY = { D: 13, E: 14, F: 15 -}, tY = (s) => { +}, SF = (s) => { const e = new Uint8ClampedArray(s.length / 2); for (let t = 0; t < s.length; t += 2) - e[t >> 1] = eY[s[t]] << 4 | eY[s[t + 1]] & 15; + e[t >> 1] = IF[s[t]] << 4 | IF[s[t + 1]] & 15; return e; -}, iY = { - 1: ob(() => tY("0000511D6300CF609C709645A78432005642574171487021003C451900274D35D762755E8B629C5BA856AF57BA649530C167D1512A272A3F6038604460398526BCA2A968DB6F8957C768BE5FBE2FB467CF5D8D5B795DC7625B5DFF50DE64C466DB2FC47CD860A65E9A2EB96CB54CE06DA763AB2EA26860524D3763536601005116008177A8705E53AB738E6A982F88BAA35B5F5B626D9C636B449B737E5B7B678598869A662F6B5B8542706C704C80736A607578685B70594A49715A4522E792")), - 2: ob(() => tY("000000000000000055394F383D2800008B8B1F210002000081B1CBCBCC820000847AAF6B9AAF2119BE08B8881AD60000A44FD07DCCF107015338130C00000000385972265F390B406E2437634B4B48031B12B8A0847000001E15B29A402F0000000000004B33460B00007A752C2A0000000000004D3900000084394B82013400ABA5CFC7AD9C0302A45A3E5A98AB000089A43382D97900008BA54AA087A70A0248A6A7AE6DBE0000BF6F94987EA40A01A06DCFA7A7A9030496C32F77891D0000A99FB1A0AFA80603B29AB9CA75930D010C0948354D3900000C0948354F37460D0028BE673D8400000000AF9D7B6E00002B007AA8933400007AA642675C2700007984CFB9C3985B768772A8A6B7B20000CAAECAAFC4B700009F94A6009F840009D09F9BA4CA9C0000CC8FC76DC87F0000C991C472A2000000A894A48CA7B501079BA2C9C69BA20000B19A5D3FA89000005CA6009DA2960901B0A7F0669FB200009D009E00B7890000DAD0F5D092820000D294D4C48BD10000B5A7A4A3B1A50402CAB6CBA6A2000000B5A7A4A3B1A8044FCDADD19D9CB00000B7778F7B8AAE0803C9AB5D3F5D3F00009EA09EA0BAB006039EA0989A8C7900009B9EF4D6B7C00000A9A7816CACA80000ABAC84705D3F000096DA635CDC8C00006F486F266F263D4784006124097B00374F6D2D6D2D6D4A3A95872322000000030000000000008D8939130000000000002E22A5C9CBC70600AB25C0B5C9B400061A2DB04CA67001082AA6BEBEBFC606002321DACBC19E03087AA08B6768380000282FBAC0B8CA7A88AD25BBA5A29900004C396C5894A6000040485A6E356E9442A32CD17EADA70000B4237923628600003E2DE9C1D7B500002F25BBA5A2990000231DB6AFB4A804023025C0B5CAB588062B2CBDBEC0C706882435A75CA20000002326BD6A82A908048B4B9A5A668000002423A09CB4BB060025259C9D8A7900001C1FCAB2C7C700002A2A9387ABA200002626A4A47D6E9D14333163A0C87500004B6F9C2D643A257049364936493647358A34438355497F1A0000A24C1D590000D38DFFBDD4CD3126")) +}, xF = { + 1: hZ(() => SF("0000511D6300CF609C709645A78432005642574171487021003C451900274D35D762755E8B629C5BA856AF57BA649530C167D1512A272A3F6038604460398526BCA2A968DB6F8957C768BE5FBE2FB467CF5D8D5B795DC7625B5DFF50DE64C466DB2FC47CD860A65E9A2EB96CB54CE06DA763AB2EA26860524D3763536601005116008177A8705E53AB738E6A982F88BAA35B5F5B626D9C636B449B737E5B7B678598869A662F6B5B8542706C704C80736A607578685B70594A49715A4522E792")), + 2: hZ(() => SF("000000000000000055394F383D2800008B8B1F210002000081B1CBCBCC820000847AAF6B9AAF2119BE08B8881AD60000A44FD07DCCF107015338130C00000000385972265F390B406E2437634B4B48031B12B8A0847000001E15B29A402F0000000000004B33460B00007A752C2A0000000000004D3900000084394B82013400ABA5CFC7AD9C0302A45A3E5A98AB000089A43382D97900008BA54AA087A70A0248A6A7AE6DBE0000BF6F94987EA40A01A06DCFA7A7A9030496C32F77891D0000A99FB1A0AFA80603B29AB9CA75930D010C0948354D3900000C0948354F37460D0028BE673D8400000000AF9D7B6E00002B007AA8933400007AA642675C2700007984CFB9C3985B768772A8A6B7B20000CAAECAAFC4B700009F94A6009F840009D09F9BA4CA9C0000CC8FC76DC87F0000C991C472A2000000A894A48CA7B501079BA2C9C69BA20000B19A5D3FA89000005CA6009DA2960901B0A7F0669FB200009D009E00B7890000DAD0F5D092820000D294D4C48BD10000B5A7A4A3B1A50402CAB6CBA6A2000000B5A7A4A3B1A8044FCDADD19D9CB00000B7778F7B8AAE0803C9AB5D3F5D3F00009EA09EA0BAB006039EA0989A8C7900009B9EF4D6B7C00000A9A7816CACA80000ABAC84705D3F000096DA635CDC8C00006F486F266F263D4784006124097B00374F6D2D6D2D6D4A3A95872322000000030000000000008D8939130000000000002E22A5C9CBC70600AB25C0B5C9B400061A2DB04CA67001082AA6BEBEBFC606002321DACBC19E03087AA08B6768380000282FBAC0B8CA7A88AD25BBA5A29900004C396C5894A6000040485A6E356E9442A32CD17EADA70000B4237923628600003E2DE9C1D7B500002F25BBA5A2990000231DB6AFB4A804023025C0B5CAB588062B2CBDBEC0C706882435A75CA20000002326BD6A82A908048B4B9A5A668000002423A09CB4BB060025259C9D8A7900001C1FCAB2C7C700002A2A9387ABA200002626A4A47D6E9D14333163A0C87500004B6F9C2D643A257049364936493647358A34438355497F1A0000A24C1D590000D38DFFBDD4CD3126")) }; -class Vy { +class Uf { /** * Creates a new character renderer factory with the given scale. */ @@ -27631,7 +27631,7 @@ class Vy { if (this.lastCreated && e === this.lastCreated.scale && t === this.lastFontFamily) return this.lastCreated; let i; - return iY[e] ? i = new o1(iY[e](), e) : i = Vy.createFromSampleData(Vy.createSampleData(t).data, e), this.lastFontFamily = t, this.lastCreated = i, i; + return xF[e] ? i = new ZW(xF[e](), e) : i = Uf.createFromSampleData(Uf.createSampleData(t).data, e), this.lastFontFamily = t, this.lastCreated = i, i; } /** * Creates the font sample data, writing to a canvas. @@ -27640,7 +27640,7 @@ class Vy { const t = document.createElement("canvas"), i = t.getContext("2d"); t.style.height = "16px", t.height = 16, t.width = 96 * 10, t.style.width = 96 * 10 + "px", i.fillStyle = "#ffffff", i.font = `bold 16px ${e}`, i.textBaseline = "middle"; let n = 0; - for (const o of Pre) + for (const o of kre) i.fillText(String.fromCharCode(o), n, 16 / 2), n += 10; return i.getImageData( 0, @@ -27656,60 +27656,60 @@ class Vy { static createFromSampleData(e, t) { if (e.length !== 61440) throw new Error("Unexpected source in MinimapCharRenderer"); - const n = Vy._downsample(e, t); - return new o1(n, t); + const n = Uf._downsample(e, t); + return new ZW(n, t); } static _downsampleChar(e, t, i, n, o) { - const r = 1 * o, l = 2 * o; - let a = n, c = 0; - for (let d = 0; d < l; d++) { - const h = d / l * 16, u = (d + 1) / l * 16; - for (let g = 0; g < r; g++) { - const m = g / r * 10, f = (g + 1) / r * 10; - let b = 0, y = 0; - for (let C = h; C < u; C++) { - const S = t + Math.floor(C) * 3840, L = 1 - (C - Math.floor(C)); - for (let x = m; x < f; x++) { - const Z = 1 - (x - Math.floor(x)), _ = S + Math.floor(x) * 4, v = Z * L; - y += v, b += e[_] * e[_ + 3] / 255 * v; + const l = 1 * o, r = 2 * o; + let c = n, d = 0; + for (let a = 0; a < r; a++) { + const h = a / r * 16, u = (a + 1) / r * 16; + for (let m = 0; m < l; m++) { + const b = m / l * 10, g = (m + 1) / l * 10; + let Z = 0, f = 0; + for (let W = h; W < u; W++) { + const G = t + Math.floor(W) * 3840, X = 1 - (W - Math.floor(W)); + for (let L = b; L < g; L++) { + const S = 1 - (L - Math.floor(L)), x = G + Math.floor(L) * 4, w = S * X; + f += w, Z += e[x] * e[x + 3] / 255 * w; } } - const w = b / y; - c = Math.max(c, w), i[a++] = pA(w); + const y = Z / f; + d = Math.max(d, y), i[c++] = NV(y); } } - return c; + return d; } static _downsample(e, t) { const i = 2 * t * 1 * t, n = i * 96, o = new Uint8ClampedArray(n); - let r = 0, l = 0, a = 0; - for (let c = 0; c < 96; c++) - a = Math.max(a, this._downsampleChar(e, l, o, r, t)), r += i, l += 10 * 4; - if (a > 0) { - const c = 255 / a; - for (let d = 0; d < n; d++) - o[d] *= c; + let l = 0, r = 0, c = 0; + for (let d = 0; d < 96; d++) + c = Math.max(c, this._downsampleChar(e, r, o, l, t)), l += i, r += 10 * 4; + if (c > 0) { + const d = 255 / c; + for (let a = 0; a < n; a++) + o[a] *= d; } return o; } } -const PU = kn ? '"Segoe WPC", "Segoe UI", sans-serif' : qe ? "-apple-system, BlinkMacSystemFont, sans-serif" : 'system-ui, "Ubuntu", "Droid Sans", sans-serif', Ore = 140, Hre = 2; -class Nf { +const IQ = Jn ? '"Segoe WPC", "Segoe UI", sans-serif' : qe ? "-apple-system, BlinkMacSystemFont, sans-serif" : 'system-ui, "Ubuntu", "Droid Sans", sans-serif', Jre = 140, Hre = 2; +class kg { constructor(e, t, i) { const n = e.options, o = n.get( 144 /* EditorOption.pixelRatio */ - ), r = n.get( + ), l = n.get( 146 /* EditorOption.layoutInfo */ - ), l = r.minimap, a = n.get( + ), r = l.minimap, c = n.get( 50 /* EditorOption.fontInfo */ - ), c = n.get( + ), d = n.get( 73 /* EditorOption.minimap */ ); - this.renderMinimap = l.renderMinimap, this.size = c.size, this.minimapHeightIsEditorHeight = l.minimapHeightIsEditorHeight, this.scrollBeyondLastLine = n.get( + this.renderMinimap = r.renderMinimap, this.size = d.size, this.minimapHeightIsEditorHeight = r.minimapHeightIsEditorHeight, this.scrollBeyondLastLine = n.get( 106 /* EditorOption.scrollBeyondLastLine */ ), this.paddingTop = n.get( @@ -27718,36 +27718,36 @@ class Nf { ).top, this.paddingBottom = n.get( 84 /* EditorOption.padding */ - ).bottom, this.showSlider = c.showSlider, this.autohide = c.autohide, this.pixelRatio = o, this.typicalHalfwidthCharacterWidth = a.typicalHalfwidthCharacterWidth, this.lineHeight = n.get( + ).bottom, this.showSlider = d.showSlider, this.autohide = d.autohide, this.pixelRatio = o, this.typicalHalfwidthCharacterWidth = c.typicalHalfwidthCharacterWidth, this.lineHeight = n.get( 67 /* EditorOption.lineHeight */ - ), this.minimapLeft = l.minimapLeft, this.minimapWidth = l.minimapWidth, this.minimapHeight = r.height, this.canvasInnerWidth = l.minimapCanvasInnerWidth, this.canvasInnerHeight = l.minimapCanvasInnerHeight, this.canvasOuterWidth = l.minimapCanvasOuterWidth, this.canvasOuterHeight = l.minimapCanvasOuterHeight, this.isSampling = l.minimapIsSampling, this.editorHeight = r.height, this.fontScale = l.minimapScale, this.minimapLineHeight = l.minimapLineHeight, this.minimapCharWidth = 1 * this.fontScale, this.sectionHeaderFontFamily = PU, this.sectionHeaderFontSize = c.sectionHeaderFontSize * o, this.sectionHeaderLetterSpacing = c.sectionHeaderLetterSpacing, this.sectionHeaderFontColor = Nf._getSectionHeaderColor(t, i.getColor( + ), this.minimapLeft = r.minimapLeft, this.minimapWidth = r.minimapWidth, this.minimapHeight = l.height, this.canvasInnerWidth = r.minimapCanvasInnerWidth, this.canvasInnerHeight = r.minimapCanvasInnerHeight, this.canvasOuterWidth = r.minimapCanvasOuterWidth, this.canvasOuterHeight = r.minimapCanvasOuterHeight, this.isSampling = r.minimapIsSampling, this.editorHeight = l.height, this.fontScale = r.minimapScale, this.minimapLineHeight = r.minimapLineHeight, this.minimapCharWidth = 1 * this.fontScale, this.sectionHeaderFontFamily = IQ, this.sectionHeaderFontSize = d.sectionHeaderFontSize * o, this.sectionHeaderLetterSpacing = d.sectionHeaderLetterSpacing, this.sectionHeaderFontColor = kg._getSectionHeaderColor(t, i.getColor( 1 /* ColorId.DefaultForeground */ - )), this.charRenderer = ob(() => Vy.create(this.fontScale, a.fontFamily)), this.defaultBackgroundColor = i.getColor( + )), this.charRenderer = hZ(() => Uf.create(this.fontScale, c.fontFamily)), this.defaultBackgroundColor = i.getColor( 2 /* ColorId.DefaultBackground */ - ), this.backgroundColor = Nf._getMinimapBackground(t, this.defaultBackgroundColor), this.foregroundAlpha = Nf._getMinimapForegroundOpacity(t); + ), this.backgroundColor = kg._getMinimapBackground(t, this.defaultBackgroundColor), this.foregroundAlpha = kg._getMinimapForegroundOpacity(t); } static _getMinimapBackground(e, t) { - const i = e.getColor(cne); - return i ? new Rc(i.rgba.r, i.rgba.g, i.rgba.b, Math.round(255 * i.rgba.a)) : t; + const i = e.getColor(tse); + return i ? new Fd(i.rgba.r, i.rgba.g, i.rgba.b, Math.round(255 * i.rgba.a)) : t; } static _getMinimapForegroundOpacity(e) { - const t = e.getColor(dne); - return t ? Rc._clamp(Math.round(255 * t.rgba.a)) : 255; + const t = e.getColor(ise); + return t ? Fd._clamp(Math.round(255 * t.rgba.a)) : 255; } static _getSectionHeaderColor(e, t) { - const i = e.getColor(Ya); - return i ? new Rc(i.rgba.r, i.rgba.g, i.rgba.b, Math.round(255 * i.rgba.a)) : t; + const i = e.getColor(Uc); + return i ? new Fd(i.rgba.r, i.rgba.g, i.rgba.b, Math.round(255 * i.rgba.a)) : t; } equals(e) { return this.renderMinimap === e.renderMinimap && this.size === e.size && this.minimapHeightIsEditorHeight === e.minimapHeightIsEditorHeight && this.scrollBeyondLastLine === e.scrollBeyondLastLine && this.paddingTop === e.paddingTop && this.paddingBottom === e.paddingBottom && this.showSlider === e.showSlider && this.autohide === e.autohide && this.pixelRatio === e.pixelRatio && this.typicalHalfwidthCharacterWidth === e.typicalHalfwidthCharacterWidth && this.lineHeight === e.lineHeight && this.minimapLeft === e.minimapLeft && this.minimapWidth === e.minimapWidth && this.minimapHeight === e.minimapHeight && this.canvasInnerWidth === e.canvasInnerWidth && this.canvasInnerHeight === e.canvasInnerHeight && this.canvasOuterWidth === e.canvasOuterWidth && this.canvasOuterHeight === e.canvasOuterHeight && this.isSampling === e.isSampling && this.editorHeight === e.editorHeight && this.fontScale === e.fontScale && this.minimapLineHeight === e.minimapLineHeight && this.minimapCharWidth === e.minimapCharWidth && this.sectionHeaderFontSize === e.sectionHeaderFontSize && this.sectionHeaderLetterSpacing === e.sectionHeaderLetterSpacing && this.defaultBackgroundColor && this.defaultBackgroundColor.equals(e.defaultBackgroundColor) && this.backgroundColor && this.backgroundColor.equals(e.backgroundColor) && this.foregroundAlpha === e.foregroundAlpha; } } -class ky { - constructor(e, t, i, n, o, r, l, a, c) { - this.scrollTop = e, this.scrollHeight = t, this.sliderNeeded = i, this._computedSliderRatio = n, this.sliderTop = o, this.sliderHeight = r, this.topPaddingLineCount = l, this.startLineNumber = a, this.endLineNumber = c; +class Pf { + constructor(e, t, i, n, o, l, r, c, d) { + this.scrollTop = e, this.scrollHeight = t, this.sliderNeeded = i, this._computedSliderRatio = n, this.sliderTop = o, this.sliderHeight = l, this.topPaddingLineCount = r, this.startLineNumber = c, this.endLineNumber = d; } /** * Compute a desired `scrollPosition` such that the slider moves by `delta`. @@ -27771,51 +27771,51 @@ class ky { getYForLineNumber(e, t) { return +(e - this.startLineNumber + this.topPaddingLineCount) * t; } - static create(e, t, i, n, o, r, l, a, c, d, h) { - const u = e.pixelRatio, g = e.minimapLineHeight, m = Math.floor(e.canvasInnerHeight / g), f = e.lineHeight; + static create(e, t, i, n, o, l, r, c, d, a, h) { + const u = e.pixelRatio, m = e.minimapLineHeight, b = Math.floor(e.canvasInnerHeight / m), g = e.lineHeight; if (e.minimapHeightIsEditorHeight) { - let x = a * e.lineHeight + e.paddingTop + e.paddingBottom; - e.scrollBeyondLastLine && (x += Math.max(0, o - e.lineHeight - e.paddingBottom)); - const Z = Math.max(1, Math.floor(o * o / x)), _ = Math.max(0, e.minimapHeight - Z), v = _ / (d - o), P = c * v, E = _ > 0, Y = Math.floor(e.canvasInnerHeight / e.minimapLineHeight), B = Math.floor(e.paddingTop / e.lineHeight); - return new ky(c, d, E, v, P, Z, B, 1, Math.min(l, Y)); + let L = c * e.lineHeight + e.paddingTop + e.paddingBottom; + e.scrollBeyondLastLine && (L += Math.max(0, o - e.lineHeight - e.paddingBottom)); + const S = Math.max(1, Math.floor(o * o / L)), x = Math.max(0, e.minimapHeight - S), w = x / (a - o), A = d * w, H = x > 0, F = Math.floor(e.canvasInnerHeight / e.minimapLineHeight), K = Math.floor(e.paddingTop / e.lineHeight); + return new Pf(d, a, H, w, A, S, K, 1, Math.min(r, F)); } - let b; - if (r && i !== l) { - const x = i - t + 1; - b = Math.floor(x * g / u); + let Z; + if (l && i !== r) { + const L = i - t + 1; + Z = Math.floor(L * m / u); } else { - const x = o / f; - b = Math.floor(x * g / u); + const L = o / g; + Z = Math.floor(L * m / u); } - const y = Math.floor(e.paddingTop / f); - let w = Math.floor(e.paddingBottom / f); + const f = Math.floor(e.paddingTop / g); + let y = Math.floor(e.paddingBottom / g); if (e.scrollBeyondLastLine) { - const x = o / f; - w = Math.max(w, x - 1); + const L = o / g; + y = Math.max(y, L - 1); } - let C; - if (w > 0) { - const x = o / f; - C = (y + l + w - x - 1) * g / u; + let W; + if (y > 0) { + const L = o / g; + W = (f + r + y - L - 1) * m / u; } else - C = Math.max(0, (y + l) * g / u - b); - C = Math.min(e.minimapHeight - b, C); - const S = C / (d - o), L = c * S; - if (m >= y + l + w) { - const x = C > 0; - return new ky(c, d, x, S, L, b, y, 1, l); + W = Math.max(0, (f + r) * m / u - Z); + W = Math.min(e.minimapHeight - Z, W); + const G = W / (a - o), X = d * G; + if (b >= f + r + y) { + const L = W > 0; + return new Pf(d, a, L, G, X, Z, f, 1, r); } else { - let x; - t > 1 ? x = t + y : x = Math.max(1, c / f); - let Z, _ = Math.max(1, Math.floor(x - L * u / g)); - _ < y ? (Z = y - _ + 1, _ = 1) : (Z = 0, _ = Math.max(1, _ - y)), h && h.scrollHeight === d && (h.scrollTop > c && (_ = Math.min(_, h.startLineNumber), Z = Math.max(Z, h.topPaddingLineCount)), h.scrollTop < c && (_ = Math.max(_, h.startLineNumber), Z = Math.min(Z, h.topPaddingLineCount))); - const v = Math.min(l, _ - Z + m - 1), P = (c - n) / f; - let E; - return c >= e.paddingTop ? E = (t - _ + Z + P) * g / u : E = c / e.paddingTop * (Z + P) * g / u, new ky(c, d, !0, S, E, b, Z, _, v); + let L; + t > 1 ? L = t + f : L = Math.max(1, d / g); + let S, x = Math.max(1, Math.floor(L - X * u / m)); + x < f ? (S = f - x + 1, x = 1) : (S = 0, x = Math.max(1, x - f)), h && h.scrollHeight === a && (h.scrollTop > d && (x = Math.min(x, h.startLineNumber), S = Math.max(S, h.topPaddingLineCount)), h.scrollTop < d && (x = Math.max(x, h.startLineNumber), S = Math.min(S, h.topPaddingLineCount))); + const w = Math.min(r, x - S + b - 1), A = (d - n) / g; + let H; + return d >= e.paddingTop ? H = (t - x + S + A) * m / u : H = d / e.paddingTop * (S + A) * m / u, new Pf(d, a, !0, G, H, Z, S, x, w); } } } -const gZ = class gZ { +const C2 = class C2 { constructor(e) { this.dy = e; } @@ -27826,12 +27826,12 @@ const gZ = class gZ { this.dy = -1; } }; -gZ.INVALID = new gZ(-1); -let XA = gZ; -class nY { +C2.INVALID = new C2(-1); +let eL = C2; +class CF { constructor(e, t, i) { - this.renderedLayout = e, this._imageData = t, this._renderedLines = new VU({ - createLine: () => XA.INVALID + this.renderedLayout = e, this._imageData = t, this._renderedLines = new gQ({ + createLine: () => eL.INVALID }), this._renderedLines._set(e.startLineNumber, i); } /** @@ -27873,9 +27873,9 @@ class nY { return this._renderedLines.onTokensChanged(e); } } -class $E { +class LJ { constructor(e, t, i, n) { - this._backgroundFillData = $E._createBackgroundFillData(t, i, n), this._buffers = [ + this._backgroundFillData = LJ._createBackgroundFillData(t, i, n), this._buffers = [ e.createImageData(t, i), e.createImageData(t, i) ], this._lastUsedBuffer = 0; @@ -27886,19 +27886,19 @@ class $E { return e.data.set(this._backgroundFillData), e; } static _createBackgroundFillData(e, t, i) { - const n = i.r, o = i.g, r = i.b, l = i.a, a = new Uint8ClampedArray(e * t * 4); - let c = 0; - for (let d = 0; d < t; d++) + const n = i.r, o = i.g, l = i.b, r = i.a, c = new Uint8ClampedArray(e * t * 4); + let d = 0; + for (let a = 0; a < t; a++) for (let h = 0; h < e; h++) - a[c] = n, a[c + 1] = o, a[c + 2] = r, a[c + 3] = l, c += 4; - return a; + c[d] = n, c[d + 1] = o, c[d + 2] = l, c[d + 3] = r, d += 4; + return c; } } -class r1 { +class fW { static compute(e, t, i) { if (e.renderMinimap === 0 || !e.isSampling) return [null, []]; - const { minimapLineCount: n } = Mf.computeContainedMinimapLineCount({ + const { minimapLineCount: n } = wg.computeContainedMinimapLineCount({ viewLineCount: t, scrollBeyondLastLine: e.scrollBeyondLastLine, paddingTop: e.paddingTop, @@ -27906,46 +27906,46 @@ class r1 { height: e.editorHeight, lineHeight: e.lineHeight, pixelRatio: e.pixelRatio - }), o = t / n, r = o / 2; + }), o = t / n, l = o / 2; if (!i || i.minimapLines.length === 0) { - const b = []; - if (b[0] = 1, n > 1) { - for (let y = 0, w = n - 1; y < w; y++) - b[y] = Math.round(y * o + r); - b[n - 1] = t; - } - return [new r1(o, b), []]; - } - const l = i.minimapLines, a = l.length, c = []; - let d = 0, h = 0, u = 1; - const g = 10; - let m = [], f = null; - for (let b = 0; b < n; b++) { - const y = Math.max(u, Math.round(b * o)), w = Math.max(y, Math.round((b + 1) * o)); - for (; d < a && l[d] < y; ) { - if (m.length < g) { - const S = d + 1 + h; - f && f.type === "deleted" && f._oldIndex === d - 1 ? f.deleteToLineNumber++ : (f = { type: "deleted", _oldIndex: d, deleteFromLineNumber: S, deleteToLineNumber: S }, m.push(f)), h--; + const Z = []; + if (Z[0] = 1, n > 1) { + for (let f = 0, y = n - 1; f < y; f++) + Z[f] = Math.round(f * o + l); + Z[n - 1] = t; + } + return [new fW(o, Z), []]; + } + const r = i.minimapLines, c = r.length, d = []; + let a = 0, h = 0, u = 1; + const m = 10; + let b = [], g = null; + for (let Z = 0; Z < n; Z++) { + const f = Math.max(u, Math.round(Z * o)), y = Math.max(f, Math.round((Z + 1) * o)); + for (; a < c && r[a] < f; ) { + if (b.length < m) { + const G = a + 1 + h; + g && g.type === "deleted" && g._oldIndex === a - 1 ? g.deleteToLineNumber++ : (g = { type: "deleted", _oldIndex: a, deleteFromLineNumber: G, deleteToLineNumber: G }, b.push(g)), h--; } - d++; + a++; } - let C; - if (d < a && l[d] <= w) - C = l[d], d++; - else if (b === 0 ? C = 1 : b + 1 === n ? C = t : C = Math.round(b * o + r), m.length < g) { - const S = d + 1 + h; - f && f.type === "inserted" && f._i === b - 1 ? f.insertToLineNumber++ : (f = { type: "inserted", _i: b, insertFromLineNumber: S, insertToLineNumber: S }, m.push(f)), h++; + let W; + if (a < c && r[a] <= y) + W = r[a], a++; + else if (Z === 0 ? W = 1 : Z + 1 === n ? W = t : W = Math.round(Z * o + l), b.length < m) { + const G = a + 1 + h; + g && g.type === "inserted" && g._i === Z - 1 ? g.insertToLineNumber++ : (g = { type: "inserted", _i: Z, insertFromLineNumber: G, insertToLineNumber: G }, b.push(g)), h++; } - c[b] = C, u = C; + d[Z] = W, u = W; } - if (m.length < g) - for (; d < a; ) { - const b = d + 1 + h; - f && f.type === "deleted" && f._oldIndex === d - 1 ? f.deleteToLineNumber++ : (f = { type: "deleted", _oldIndex: d, deleteFromLineNumber: b, deleteToLineNumber: b }, m.push(f)), h--, d++; + if (b.length < m) + for (; a < c; ) { + const Z = a + 1 + h; + g && g.type === "deleted" && g._oldIndex === a - 1 ? g.deleteToLineNumber++ : (g = { type: "deleted", _oldIndex: a, deleteFromLineNumber: Z, deleteToLineNumber: Z }, b.push(g)), h--, a++; } else - m = [{ type: "flush" }]; - return [new r1(o, c), m]; + b = [{ type: "flush" }]; + return [new fW(o, d), b]; } constructor(e, t) { this.samplingRatio = e, this.minimapLines = t; @@ -27990,11 +27990,11 @@ class r1 { this.minimapLines[i] += t; } } -class Jre extends wo { +class Ere extends Go { constructor(e) { - super(e), this._sectionHeaderCache = new id(10, 1.5), this.tokensColorTracker = EA.getInstance(), this._selections = [], this._minimapSelections = null, this.options = new Nf(this._context.configuration, this._context.theme, this.tokensColorTracker); - const [t] = r1.compute(this.options, this._context.viewModel.getLineCount(), null); - this._samplingState = t, this._shouldCheckSampling = !1, this._actual = new Ep(e.theme, this); + super(e), this._sectionHeaderCache = new la(10, 1.5), this.tokensColorTracker = $V.getInstance(), this._selections = [], this._minimapSelections = null, this.options = new kg(this._context.configuration, this._context.theme, this.tokensColorTracker); + const [t] = fW.compute(this.options, this._context.viewModel.getLineCount(), null); + this._samplingState = t, this._shouldCheckSampling = !1, this._actual = new Kp(e.theme, this); } dispose() { this._actual.dispose(), super.dispose(); @@ -28003,7 +28003,7 @@ class Jre extends wo { return this._actual.getDomNode(); } _onOptionsMaybeChanged() { - const e = new Nf(this._context.configuration, this._context.theme, this.tokensColorTracker); + const e = new kg(this._context.configuration, this._context.theme, this.tokensColorTracker); return this.options.equals(e) ? !1 : (this.options = e, this._recreateLineSampling(), this._actual.onDidChangeOptions(), !0); } // ---- begin view event handlers @@ -28083,7 +28083,7 @@ class Jre extends wo { //#region IMinimapModel _recreateLineSampling() { this._minimapSelections = null; - const e = !!this._samplingState, [t, i] = r1.compute(this.options, this._context.viewModel.getLineCount(), this._samplingState); + const e = !!this._samplingState, [t, i] = fW.compute(this.options, this._context.viewModel.getLineCount(), this._samplingState); if (this._samplingState = t, e && this._samplingState) for (const n of i) switch (n.type) { @@ -28113,7 +28113,7 @@ class Jre extends wo { getMinimapLinesRenderingData(e, t, i) { if (this._samplingState) { const n = []; - for (let o = 0, r = t - e + 1; o < r; o++) + for (let o = 0, l = t - e + 1; o < l; o++) i[o] ? n[o] = this._context.viewModel.getViewLineData(this._samplingState.minimapLines[e + o - 1]) : n[o] = null; return n; } @@ -28125,7 +28125,7 @@ class Jre extends wo { this._minimapSelections = []; for (const e of this._selections) { const [t, i] = this._samplingState.decorationLineRangeToMinimapLineRange(e.startLineNumber, e.endLineNumber); - this._minimapSelections.push(new fe(t, e.startColumn, i, e.endColumn)); + this._minimapSelections.push(new ge(t, e.startColumn, i, e.endColumn)); } } else this._minimapSelections = this._selections; @@ -28141,8 +28141,8 @@ class Jre extends wo { for (const o of i) { if (!o.options.minimap) continue; - const r = o.range, l = this._samplingState.modelLineToMinimapLine(r.startLineNumber), a = this._samplingState.modelLineToMinimapLine(r.endLineNumber); - n.push(new zU(new M(l, r.startColumn, a, r.endColumn), o.options)); + const l = o.range, r = this._samplingState.modelLineToMinimapLine(l.startLineNumber), c = this._samplingState.modelLineToMinimapLine(l.endLineNumber); + n.push(new LQ(new I(r, l.startColumn, c, l.endColumn), o.options)); } return n; } @@ -28150,23 +28150,23 @@ class Jre extends wo { } getSectionHeaderDecorationsInViewport(e, t) { const i = this.options.minimapLineHeight, o = this.options.sectionHeaderFontSize / i; - return e = Math.floor(Math.max(1, e - o)), this._getMinimapDecorationsInViewport(e, t).filter((r) => { - var l; - return !!((l = r.options.minimap) != null && l.sectionHeaderStyle); + return e = Math.floor(Math.max(1, e - o)), this._getMinimapDecorationsInViewport(e, t).filter((l) => { + var r; + return !!((r = l.options.minimap) != null && r.sectionHeaderStyle); }); } _getMinimapDecorationsInViewport(e, t) { let i; if (this._samplingState) { const n = this._samplingState.minimapLines[e - 1], o = this._samplingState.minimapLines[t - 1]; - i = new M(n, 1, o, this._context.viewModel.getLineMaxColumn(o)); + i = new I(n, 1, o, this._context.viewModel.getLineMaxColumn(o)); } else - i = new M(e, 1, t, this._context.viewModel.getLineMaxColumn(t)); + i = new I(e, 1, t, this._context.viewModel.getLineMaxColumn(t)); return this._context.viewModel.getMinimapDecorationsInRange(i); } getSectionHeaderText(e, t) { - var r; - const i = (r = e.options.minimap) == null ? void 0 : r.sectionHeaderText; + var l; + const i = (l = e.options.minimap) == null ? void 0 : l.sectionHeaderText; if (!i) return null; const n = this._sectionHeaderCache.get(i); @@ -28182,7 +28182,7 @@ class Jre extends wo { this._samplingState && (e = this._samplingState.minimapLines[e - 1]), this._context.viewModel.revealRange( "mouse", !1, - new M(e, 1, e, 1), + new I(e, 1, e, 1), 1, 0 /* ScrollType.Smooth */ @@ -28198,32 +28198,32 @@ class Jre extends wo { ); } } -class Ep extends R { +class Kp extends J { constructor(e, t) { - super(), this._renderDecorations = !1, this._gestureInProgress = !1, this._theme = e, this._model = t, this._lastRenderData = null, this._buffers = null, this._selectionColor = this._theme.getColor(FF), this._domNode = yt(document.createElement("div")), Tl.write( + super(), this._renderDecorations = !1, this._gestureInProgress = !1, this._theme = e, this._model = t, this._lastRenderData = null, this._buffers = null, this._selectionColor = this._theme.getColor(hF), this._domNode = ft(document.createElement("div")), vr.write( this._domNode, 9 /* PartFingerprint.Minimap */ - ), this._domNode.setClassName(this._getMinimapDomNodeClassName()), this._domNode.setPosition("absolute"), this._domNode.setAttribute("role", "presentation"), this._domNode.setAttribute("aria-hidden", "true"), this._shadow = yt(document.createElement("div")), this._shadow.setClassName("minimap-shadow-hidden"), this._domNode.appendChild(this._shadow), this._canvas = yt(document.createElement("canvas")), this._canvas.setPosition("absolute"), this._canvas.setLeft(0), this._domNode.appendChild(this._canvas), this._decorationsCanvas = yt(document.createElement("canvas")), this._decorationsCanvas.setPosition("absolute"), this._decorationsCanvas.setClassName("minimap-decorations-layer"), this._decorationsCanvas.setLeft(0), this._domNode.appendChild(this._decorationsCanvas), this._slider = yt(document.createElement("div")), this._slider.setPosition("absolute"), this._slider.setClassName("minimap-slider"), this._slider.setLayerHinting(!0), this._slider.setContain("strict"), this._domNode.appendChild(this._slider), this._sliderHorizontal = yt(document.createElement("div")), this._sliderHorizontal.setPosition("absolute"), this._sliderHorizontal.setClassName("minimap-slider-horizontal"), this._slider.appendChild(this._sliderHorizontal), this._applyLayout(), this._pointerDownListener = ai(this._domNode.domNode, ie.POINTER_DOWN, (i) => { + ), this._domNode.setClassName(this._getMinimapDomNodeClassName()), this._domNode.setPosition("absolute"), this._domNode.setAttribute("role", "presentation"), this._domNode.setAttribute("aria-hidden", "true"), this._shadow = ft(document.createElement("div")), this._shadow.setClassName("minimap-shadow-hidden"), this._domNode.appendChild(this._shadow), this._canvas = ft(document.createElement("canvas")), this._canvas.setPosition("absolute"), this._canvas.setLeft(0), this._domNode.appendChild(this._canvas), this._decorationsCanvas = ft(document.createElement("canvas")), this._decorationsCanvas.setPosition("absolute"), this._decorationsCanvas.setClassName("minimap-decorations-layer"), this._decorationsCanvas.setLeft(0), this._domNode.appendChild(this._decorationsCanvas), this._slider = ft(document.createElement("div")), this._slider.setPosition("absolute"), this._slider.setClassName("minimap-slider"), this._slider.setLayerHinting(!0), this._slider.setContain("strict"), this._domNode.appendChild(this._slider), this._sliderHorizontal = ft(document.createElement("div")), this._sliderHorizontal.setPosition("absolute"), this._sliderHorizontal.setClassName("minimap-slider-horizontal"), this._slider.appendChild(this._sliderHorizontal), this._applyLayout(), this._pointerDownListener = di(this._domNode.domNode, ie.POINTER_DOWN, (i) => { if (i.preventDefault(), this._model.options.renderMinimap === 0 || !this._lastRenderData) return; if (this._model.options.size !== "proportional") { if (i.button === 0 && this._lastRenderData) { - const c = yi(this._slider.domNode), d = c.top + c.height / 2; - this._startSliderDragging(i, d, this._lastRenderData.renderedLayout); + const d = yi(this._slider.domNode), a = d.top + d.height / 2; + this._startSliderDragging(i, a, this._lastRenderData.renderedLayout); } return; } - const o = this._model.options.minimapLineHeight, r = this._model.options.canvasInnerHeight / this._model.options.canvasOuterHeight * i.offsetY; - let a = Math.floor(r / o) + this._lastRenderData.renderedLayout.startLineNumber - this._lastRenderData.renderedLayout.topPaddingLineCount; - a = Math.min(a, this._model.getLineCount()), this._model.revealLineNumber(a); - }), this._sliderPointerMoveMonitor = new n0(), this._sliderPointerDownListener = ai(this._slider.domNode, ie.POINTER_DOWN, (i) => { + const o = this._model.options.minimapLineHeight, l = this._model.options.canvasInnerHeight / this._model.options.canvasOuterHeight * i.offsetY; + let c = Math.floor(l / o) + this._lastRenderData.renderedLayout.startLineNumber - this._lastRenderData.renderedLayout.topPaddingLineCount; + c = Math.min(c, this._model.getLineCount()), this._model.revealLineNumber(c); + }), this._sliderPointerMoveMonitor = new d0(), this._sliderPointerDownListener = di(this._slider.domNode, ie.POINTER_DOWN, (i) => { i.preventDefault(), i.stopPropagation(), i.button === 0 && this._lastRenderData && this._startSliderDragging(i, i.pageY, this._lastRenderData.renderedLayout); - }), this._gestureDisposable = Rn.addTarget(this._domNode.domNode), this._sliderTouchStartListener = z(this._domNode.domNode, Rt.Start, (i) => { + }), this._gestureDisposable = En.addTarget(this._domNode.domNode), this._sliderTouchStartListener = z(this._domNode.domNode, Jt.Start, (i) => { i.preventDefault(), i.stopPropagation(), this._lastRenderData && (this._slider.toggleClassName("active", !0), this._gestureInProgress = !0, this.scrollDueToTouchEvent(i)); - }, { passive: !1 }), this._sliderTouchMoveListener = z(this._domNode.domNode, Rt.Change, (i) => { + }, { passive: !1 }), this._sliderTouchMoveListener = z(this._domNode.domNode, Jt.Change, (i) => { i.preventDefault(), i.stopPropagation(), this._lastRenderData && this._gestureInProgress && this.scrollDueToTouchEvent(i); - }, { passive: !1 }), this._sliderTouchEndListener = ai(this._domNode.domNode, Rt.End, (i) => { + }, { passive: !1 }), this._sliderTouchEndListener = di(this._domNode.domNode, Jt.End, (i) => { i.preventDefault(), i.stopPropagation(), this._gestureInProgress = !1, this._slider.toggleClassName("active", !1); }); } @@ -28232,16 +28232,16 @@ class Ep extends R { return; const n = e.pageX; this._slider.toggleClassName("active", !0); - const o = (r, l) => { - const a = yi(this._domNode.domNode), c = Math.min(Math.abs(l - n), Math.abs(l - a.left), Math.abs(l - a.left - a.width)); - if (kn && c > Ore) { + const o = (l, r) => { + const c = yi(this._domNode.domNode), d = Math.min(Math.abs(r - n), Math.abs(r - c.left), Math.abs(r - c.left - c.width)); + if (Jn && d > Jre) { this._model.setScrollTop(i.scrollTop); return; } - const d = r - t; - this._model.setScrollTop(i.getDesiredScrollTopFromDelta(d)); + const a = l - t; + this._model.setScrollTop(i.getDesiredScrollTopFromDelta(a)); }; - e.pageY !== t && o(e.pageY, n), this._sliderPointerMoveMonitor.startMonitoring(e.target, e.pointerId, e.buttons, (r) => o(r.pageY, r.pageX), () => { + e.pageY !== t && o(e.pageY, n), this._sliderPointerMoveMonitor.startMonitoring(e.target, e.pointerId, e.buttons, (l) => o(l.pageY, l.pageX), () => { this._slider.toggleClassName("active", !1); }); } @@ -28263,7 +28263,7 @@ class Ep extends R { this._domNode.setLeft(this._model.options.minimapLeft), this._domNode.setWidth(this._model.options.minimapWidth), this._domNode.setHeight(this._model.options.minimapHeight), this._shadow.setHeight(this._model.options.minimapHeight), this._canvas.setWidth(this._model.options.canvasOuterWidth), this._canvas.setHeight(this._model.options.canvasOuterHeight), this._canvas.domNode.width = this._model.options.canvasInnerWidth, this._canvas.domNode.height = this._model.options.canvasInnerHeight, this._decorationsCanvas.setWidth(this._model.options.canvasOuterWidth), this._decorationsCanvas.setHeight(this._model.options.canvasOuterHeight), this._decorationsCanvas.domNode.width = this._model.options.canvasInnerWidth, this._decorationsCanvas.domNode.height = this._model.options.canvasInnerHeight, this._slider.setWidth(this._model.options.minimapWidth); } _getBuffer() { - return this._buffers || this._model.options.canvasInnerWidth > 0 && this._model.options.canvasInnerHeight > 0 && (this._buffers = new $E(this._canvas.domNode.getContext("2d"), this._model.options.canvasInnerWidth, this._model.options.canvasInnerHeight, this._model.options.backgroundColor)), this._buffers ? this._buffers.getBuffer() : null; + return this._buffers || this._model.options.canvasInnerWidth > 0 && this._model.options.canvasInnerHeight > 0 && (this._buffers = new LJ(this._canvas.domNode.getContext("2d"), this._model.options.canvasInnerWidth, this._model.options.canvasInnerHeight, this._model.options.backgroundColor)), this._buffers ? this._buffers.getBuffer() : null; } // ---- begin view event handlers onDidChangeOptions() { @@ -28293,7 +28293,7 @@ class Ep extends R { return this._renderDecorations = !0, !0; } onThemeChanged() { - return this._selectionColor = this._theme.getColor(FF), this._renderDecorations = !0, !0; + return this._selectionColor = this._theme.getColor(hF), this._renderDecorations = !0, !0; } onTokensChanged(e) { return this._lastRenderData ? this._lastRenderData.onTokensChanged(e) : !1; @@ -28311,221 +28311,221 @@ class Ep extends R { return; } e.scrollLeft + e.viewportWidth >= e.scrollWidth ? this._shadow.setClassName("minimap-shadow-hidden") : this._shadow.setClassName("minimap-shadow-visible"); - const i = ky.create(this._model.options, e.viewportStartLineNumber, e.viewportEndLineNumber, e.viewportStartLineNumberVerticalOffset, e.viewportHeight, e.viewportContainsWhitespaceGaps, this._model.getLineCount(), this._model.getRealLineCount(), e.scrollTop, e.scrollHeight, this._lastRenderData ? this._lastRenderData.renderedLayout : null); + const i = Pf.create(this._model.options, e.viewportStartLineNumber, e.viewportEndLineNumber, e.viewportStartLineNumberVerticalOffset, e.viewportHeight, e.viewportContainsWhitespaceGaps, this._model.getLineCount(), this._model.getRealLineCount(), e.scrollTop, e.scrollHeight, this._lastRenderData ? this._lastRenderData.renderedLayout : null); this._slider.setDisplay(i.sliderNeeded ? "block" : "none"), this._slider.setTop(i.sliderTop), this._slider.setHeight(i.sliderHeight), this._sliderHorizontal.setLeft(0), this._sliderHorizontal.setWidth(this._model.options.minimapWidth), this._sliderHorizontal.setTop(0), this._sliderHorizontal.setHeight(i.sliderHeight), this.renderDecorations(i), this._lastRenderData = this.renderLines(i); } renderDecorations(e) { if (this._renderDecorations) { this._renderDecorations = !1; const t = this._model.getSelections(); - t.sort(M.compareRangesUsingStarts); + t.sort(I.compareRangesUsingStarts); const i = this._model.getMinimapDecorationsInViewport(e.startLineNumber, e.endLineNumber); - i.sort((u, g) => (u.options.zIndex || 0) - (g.options.zIndex || 0)); - const { canvasInnerWidth: n, canvasInnerHeight: o } = this._model.options, r = this._model.options.minimapLineHeight, l = this._model.options.minimapCharWidth, a = this._model.getOptions().tabSize, c = this._decorationsCanvas.domNode.getContext("2d"); - c.clearRect(0, 0, n, o); - const d = new sY(e.startLineNumber, e.endLineNumber, !1); - this._renderSelectionLineHighlights(c, t, d, e, r), this._renderDecorationsLineHighlights(c, i, d, e, r); - const h = new sY(e.startLineNumber, e.endLineNumber, null); - this._renderSelectionsHighlights(c, t, h, e, r, a, l, n), this._renderDecorationsHighlights(c, i, h, e, r, a, l, n), this._renderSectionHeaders(e); + i.sort((u, m) => (u.options.zIndex || 0) - (m.options.zIndex || 0)); + const { canvasInnerWidth: n, canvasInnerHeight: o } = this._model.options, l = this._model.options.minimapLineHeight, r = this._model.options.minimapCharWidth, c = this._model.getOptions().tabSize, d = this._decorationsCanvas.domNode.getContext("2d"); + d.clearRect(0, 0, n, o); + const a = new RF(e.startLineNumber, e.endLineNumber, !1); + this._renderSelectionLineHighlights(d, t, a, e, l), this._renderDecorationsLineHighlights(d, i, a, e, l); + const h = new RF(e.startLineNumber, e.endLineNumber, null); + this._renderSelectionsHighlights(d, t, h, e, l, c, r, n), this._renderDecorationsHighlights(d, i, h, e, l, c, r, n), this._renderSectionHeaders(e); } } _renderSelectionLineHighlights(e, t, i, n, o) { if (!this._selectionColor || this._selectionColor.isTransparent()) return; e.fillStyle = this._selectionColor.transparent(0.5).toString(); - let r = 0, l = 0; - for (const a of t) { - const c = n.intersectWithViewport(a); - if (!c) + let l = 0, r = 0; + for (const c of t) { + const d = n.intersectWithViewport(c); + if (!d) continue; - const [d, h] = c; - for (let m = d; m <= h; m++) - i.set(m, !0); - const u = n.getYForLineNumber(d, o), g = n.getYForLineNumber(h, o); - l >= u || (l > r && e.fillRect(ql, r, e.canvas.width, l - r), r = u), l = g; + const [a, h] = d; + for (let b = a; b <= h; b++) + i.set(b, !0); + const u = n.getYForLineNumber(a, o), m = n.getYForLineNumber(h, o); + r >= u || (r > l && e.fillRect(ic, l, e.canvas.width, r - l), l = u), r = m; } - l > r && e.fillRect(ql, r, e.canvas.width, l - r); + r > l && e.fillRect(ic, l, e.canvas.width, r - l); } _renderDecorationsLineHighlights(e, t, i, n, o) { - const r = /* @__PURE__ */ new Map(); - for (let l = t.length - 1; l >= 0; l--) { - const a = t[l], c = a.options.minimap; - if (!c || c.position !== 1) + const l = /* @__PURE__ */ new Map(); + for (let r = t.length - 1; r >= 0; r--) { + const c = t[r], d = c.options.minimap; + if (!d || d.position !== 1) continue; - const d = n.intersectWithViewport(a.range); - if (!d) + const a = n.intersectWithViewport(c.range); + if (!a) continue; - const [h, u] = d, g = c.getColor(this._theme.value); - if (!g || g.isTransparent()) + const [h, u] = a, m = d.getColor(this._theme.value); + if (!m || m.isTransparent()) continue; - let m = r.get(g.toString()); - m || (m = g.transparent(0.5).toString(), r.set(g.toString(), m)), e.fillStyle = m; - for (let f = h; f <= u; f++) { - if (i.has(f)) + let b = l.get(m.toString()); + b || (b = m.transparent(0.5).toString(), l.set(m.toString(), b)), e.fillStyle = b; + for (let g = h; g <= u; g++) { + if (i.has(g)) continue; - i.set(f, !0); - const b = n.getYForLineNumber(h, o); - e.fillRect(ql, b, e.canvas.width, o); + i.set(g, !0); + const Z = n.getYForLineNumber(h, o); + e.fillRect(ic, Z, e.canvas.width, o); } } } - _renderSelectionsHighlights(e, t, i, n, o, r, l, a) { + _renderSelectionsHighlights(e, t, i, n, o, l, r, c) { if (!(!this._selectionColor || this._selectionColor.isTransparent())) - for (const c of t) { - const d = n.intersectWithViewport(c); - if (!d) + for (const d of t) { + const a = n.intersectWithViewport(d); + if (!a) continue; - const [h, u] = d; - for (let g = h; g <= u; g++) - this.renderDecorationOnLine(e, i, c, this._selectionColor, n, g, o, o, r, l, a); + const [h, u] = a; + for (let m = h; m <= u; m++) + this.renderDecorationOnLine(e, i, d, this._selectionColor, n, m, o, o, l, r, c); } } - _renderDecorationsHighlights(e, t, i, n, o, r, l, a) { - for (const c of t) { - const d = c.options.minimap; - if (!d) + _renderDecorationsHighlights(e, t, i, n, o, l, r, c) { + for (const d of t) { + const a = d.options.minimap; + if (!a) continue; - const h = n.intersectWithViewport(c.range); + const h = n.intersectWithViewport(d.range); if (!h) continue; - const [u, g] = h, m = d.getColor(this._theme.value); - if (!(!m || m.isTransparent())) - for (let f = u; f <= g; f++) - switch (d.position) { + const [u, m] = h, b = a.getColor(this._theme.value); + if (!(!b || b.isTransparent())) + for (let g = u; g <= m; g++) + switch (a.position) { case 1: - this.renderDecorationOnLine(e, i, c.range, m, n, f, o, o, r, l, a); + this.renderDecorationOnLine(e, i, d.range, b, n, g, o, o, l, r, c); continue; case 2: { - const b = n.getYForLineNumber(f, o); - this.renderDecoration(e, m, 2, b, Hre, o); + const Z = n.getYForLineNumber(g, o); + this.renderDecoration(e, b, 2, Z, Hre, o); continue; } } } } - renderDecorationOnLine(e, t, i, n, o, r, l, a, c, d, h) { - const u = o.getYForLineNumber(r, a); - if (u + l < 0 || u > this._model.options.canvasInnerHeight) + renderDecorationOnLine(e, t, i, n, o, l, r, c, d, a, h) { + const u = o.getYForLineNumber(l, c); + if (u + r < 0 || u > this._model.options.canvasInnerHeight) return; - const { startLineNumber: g, endLineNumber: m } = i, f = g === r ? i.startColumn : 1, b = m === r ? i.endColumn : this._model.getLineMaxColumn(r), y = this.getXOffsetForPosition(t, r, f, c, d, h), w = this.getXOffsetForPosition(t, r, b, c, d, h); - this.renderDecoration(e, n, y, u, w - y, l); + const { startLineNumber: m, endLineNumber: b } = i, g = m === l ? i.startColumn : 1, Z = b === l ? i.endColumn : this._model.getLineMaxColumn(l), f = this.getXOffsetForPosition(t, l, g, d, a, h), y = this.getXOffsetForPosition(t, l, Z, d, a, h); + this.renderDecoration(e, n, f, u, y - f, r); } - getXOffsetForPosition(e, t, i, n, o, r) { + getXOffsetForPosition(e, t, i, n, o, l) { if (i === 1) - return ql; - if ((i - 1) * o >= r) - return r; - let a = e.get(t); - if (!a) { - const c = this._model.getLineContent(t); - a = [ql]; - let d = ql; - for (let h = 1; h < c.length + 1; h++) { - const u = c.charCodeAt(h - 1), g = u === 9 ? n * o : Nh(u) ? 2 * o : o, m = d + g; - if (m >= r) { - a[h] = r; + return ic; + if ((i - 1) * o >= l) + return l; + let c = e.get(t); + if (!c) { + const d = this._model.getLineContent(t); + c = [ic]; + let a = ic; + for (let h = 1; h < d.length + 1; h++) { + const u = d.charCodeAt(h - 1), m = u === 9 ? n * o : Mh(u) ? 2 * o : o, b = a + m; + if (b >= l) { + c[h] = l; break; } - a[h] = m, d = m; + c[h] = b, a = b; } - e.set(t, a); + e.set(t, c); } - return i - 1 < a.length ? a[i - 1] : r; + return i - 1 < c.length ? c[i - 1] : l; } - renderDecoration(e, t, i, n, o, r) { - e.fillStyle = t && t.toString() || "", e.fillRect(i, n, o, r); + renderDecoration(e, t, i, n, o, l) { + e.fillStyle = t && t.toString() || "", e.fillRect(i, n, o, l); } _renderSectionHeaders(e) { - var f; - const t = this._model.options.minimapLineHeight, i = this._model.options.sectionHeaderFontSize, n = this._model.options.sectionHeaderLetterSpacing, o = i * 1.5, { canvasInnerWidth: r } = this._model.options, l = this._model.options.backgroundColor, a = `rgb(${l.r} ${l.g} ${l.b} / .7)`, c = this._model.options.sectionHeaderFontColor, d = `rgb(${c.r} ${c.g} ${c.b})`, h = d, u = this._decorationsCanvas.domNode.getContext("2d"); + var g; + const t = this._model.options.minimapLineHeight, i = this._model.options.sectionHeaderFontSize, n = this._model.options.sectionHeaderLetterSpacing, o = i * 1.5, { canvasInnerWidth: l } = this._model.options, r = this._model.options.backgroundColor, c = `rgb(${r.r} ${r.g} ${r.b} / .7)`, d = this._model.options.sectionHeaderFontColor, a = `rgb(${d.r} ${d.g} ${d.b})`, h = a, u = this._decorationsCanvas.domNode.getContext("2d"); u.letterSpacing = n + "px", u.font = "500 " + i + "px " + this._model.options.sectionHeaderFontFamily, u.strokeStyle = h, u.lineWidth = 0.2; - const g = this._model.getSectionHeaderDecorationsInViewport(e.startLineNumber, e.endLineNumber); - g.sort((b, y) => b.range.startLineNumber - y.range.startLineNumber); - const m = Ep._fitSectionHeader.bind(null, u, r - ql); - for (const b of g) { - const y = e.getYForLineNumber(b.range.startLineNumber, t) + i, w = y - i, C = w + 2, S = this._model.getSectionHeaderText(b, m); - Ep._renderSectionLabel(u, S, ((f = b.options.minimap) == null ? void 0 : f.sectionHeaderStyle) === 2, a, d, r, w, o, y, C); + const m = this._model.getSectionHeaderDecorationsInViewport(e.startLineNumber, e.endLineNumber); + m.sort((Z, f) => Z.range.startLineNumber - f.range.startLineNumber); + const b = Kp._fitSectionHeader.bind(null, u, l - ic); + for (const Z of m) { + const f = e.getYForLineNumber(Z.range.startLineNumber, t) + i, y = f - i, W = y + 2, G = this._model.getSectionHeaderText(Z, b); + Kp._renderSectionLabel(u, G, ((g = Z.options.minimap) == null ? void 0 : g.sectionHeaderStyle) === 2, c, a, l, y, o, f, W); } } static _fitSectionHeader(e, t, i) { if (!i) return i; - const n = "…", o = e.measureText(i).width, r = e.measureText(n).width; - if (o <= t || o <= r) + const n = "…", o = e.measureText(i).width, l = e.measureText(n).width; + if (o <= t || o <= l) return i; - const l = i.length, a = o / i.length, c = Math.floor((t - r) / a) - 1; - let d = Math.ceil(c / 2); - for (; d > 0 && /\s/.test(i[d - 1]); ) - --d; - return i.substring(0, d) + n + i.substring(l - (c - d)); + const r = i.length, c = o / i.length, d = Math.floor((t - l) / c) - 1; + let a = Math.ceil(d / 2); + for (; a > 0 && /\s/.test(i[a - 1]); ) + --a; + return i.substring(0, a) + n + i.substring(r - (d - a)); } - static _renderSectionLabel(e, t, i, n, o, r, l, a, c, d) { - t && (e.fillStyle = n, e.fillRect(0, l, r, a), e.fillStyle = o, e.fillText(t, ql, c)), i && (e.beginPath(), e.moveTo(0, d), e.lineTo(r, d), e.closePath(), e.stroke()); + static _renderSectionLabel(e, t, i, n, o, l, r, c, d, a) { + t && (e.fillStyle = n, e.fillRect(0, r, l, c), e.fillStyle = o, e.fillText(t, ic, d)), i && (e.beginPath(), e.moveTo(0, a), e.lineTo(l, a), e.closePath(), e.stroke()); } renderLines(e) { const t = e.startLineNumber, i = e.endLineNumber, n = this._model.options.minimapLineHeight; if (this._lastRenderData && this._lastRenderData.linesEquals(e)) { const j = this._lastRenderData._get(); - return new nY(e, j.imageData, j.lines); + return new CF(e, j.imageData, j.lines); } const o = this._getBuffer(); if (!o) return null; - const [r, l, a] = Ep._renderUntouchedLines(o, e.topPaddingLineCount, t, i, n, this._lastRenderData), c = this._model.getMinimapLinesRenderingData(t, i, a), d = this._model.getOptions().tabSize, h = this._model.options.defaultBackgroundColor, u = this._model.options.backgroundColor, g = this._model.options.foregroundAlpha, m = this._model.tokensColorTracker, f = m.backgroundIsLight(), b = this._model.options.renderMinimap, y = this._model.options.charRenderer(), w = this._model.options.fontScale, C = this._model.options.minimapCharWidth, L = (b === 1 ? 2 : 3) * w, x = n > L ? Math.floor((n - L) / 2) : 0, Z = u.a / 255, _ = new Rc(Math.round((u.r - h.r) * Z + h.r), Math.round((u.g - h.g) * Z + h.g), Math.round((u.b - h.b) * Z + h.b), 255); - let v = e.topPaddingLineCount * n; - const P = []; - for (let j = 0, le = i - t + 1; j < le; j++) - a[j] && Ep._renderLine(o, _, u.a, f, b, C, m, g, y, v, x, d, c[j], w, n), P[j] = new XA(v), v += n; - const E = r === -1 ? 0 : r, B = (l === -1 ? o.height : l) - E; - return this._canvas.domNode.getContext("2d").putImageData(o, 0, 0, 0, E, o.width, B), new nY(e, o, P); - } - static _renderUntouchedLines(e, t, i, n, o, r) { - const l = []; - if (!r) { - for (let v = 0, P = n - i + 1; v < P; v++) - l[v] = !0; - return [-1, -1, l]; - } - const a = r._get(), c = a.imageData.data, d = a.rendLineNumberStart, h = a.lines, u = h.length, g = e.width, m = e.data, f = (n - i + 1) * o * g * 4; - let b = -1, y = -1, w = -1, C = -1, S = -1, L = -1, x = t * o; - for (let v = i; v <= n; v++) { - const P = v - i, E = v - d, Y = E >= 0 && E < u ? h[E].dy : -1; - if (Y === -1) { - l[P] = !0, x += o; + const [l, r, c] = Kp._renderUntouchedLines(o, e.topPaddingLineCount, t, i, n, this._lastRenderData), d = this._model.getMinimapLinesRenderingData(t, i, c), a = this._model.getOptions().tabSize, h = this._model.options.defaultBackgroundColor, u = this._model.options.backgroundColor, m = this._model.options.foregroundAlpha, b = this._model.tokensColorTracker, g = b.backgroundIsLight(), Z = this._model.options.renderMinimap, f = this._model.options.charRenderer(), y = this._model.options.fontScale, W = this._model.options.minimapCharWidth, X = (Z === 1 ? 2 : 3) * y, L = n > X ? Math.floor((n - X) / 2) : 0, S = u.a / 255, x = new Fd(Math.round((u.r - h.r) * S + h.r), Math.round((u.g - h.g) * S + h.g), Math.round((u.b - h.b) * S + h.b), 255); + let w = e.topPaddingLineCount * n; + const A = []; + for (let j = 0, re = i - t + 1; j < re; j++) + c[j] && Kp._renderLine(o, x, u.a, g, Z, W, b, m, f, w, L, a, d[j], y, n), A[j] = new eL(w), w += n; + const H = l === -1 ? 0 : l, K = (r === -1 ? o.height : r) - H; + return this._canvas.domNode.getContext("2d").putImageData(o, 0, 0, 0, H, o.width, K), new CF(e, o, A); + } + static _renderUntouchedLines(e, t, i, n, o, l) { + const r = []; + if (!l) { + for (let w = 0, A = n - i + 1; w < A; w++) + r[w] = !0; + return [-1, -1, r]; + } + const c = l._get(), d = c.imageData.data, a = c.rendLineNumberStart, h = c.lines, u = h.length, m = e.width, b = e.data, g = (n - i + 1) * o * m * 4; + let Z = -1, f = -1, y = -1, W = -1, G = -1, X = -1, L = t * o; + for (let w = i; w <= n; w++) { + const A = w - i, H = w - a, F = H >= 0 && H < u ? h[H].dy : -1; + if (F === -1) { + r[A] = !0, L += o; continue; } - const B = Y * g * 4, X = (Y + o) * g * 4, j = x * g * 4, le = (x + o) * g * 4; - C === B && L === j ? (C = X, L = le) : (w !== -1 && (m.set(c.subarray(w, C), S), b === -1 && w === 0 && w === S && (b = C), y === -1 && C === f && w === S && (y = w)), w = B, C = X, S = j, L = le), l[P] = !1, x += o; + const K = F * m * 4, E = (F + o) * m * 4, j = L * m * 4, re = (L + o) * m * 4; + W === K && X === j ? (W = E, X = re) : (y !== -1 && (b.set(d.subarray(y, W), G), Z === -1 && y === 0 && y === G && (Z = W), f === -1 && W === g && y === G && (f = y)), y = K, W = E, G = j, X = re), r[A] = !1, L += o; } - w !== -1 && (m.set(c.subarray(w, C), S), b === -1 && w === 0 && w === S && (b = C), y === -1 && C === f && w === S && (y = w)); - const Z = b === -1 ? -1 : b / (g * 4), _ = y === -1 ? -1 : y / (g * 4); - return [Z, _, l]; + y !== -1 && (b.set(d.subarray(y, W), G), Z === -1 && y === 0 && y === G && (Z = W), f === -1 && W === g && y === G && (f = y)); + const S = Z === -1 ? -1 : Z / (m * 4), x = f === -1 ? -1 : f / (m * 4); + return [S, x, r]; } - static _renderLine(e, t, i, n, o, r, l, a, c, d, h, u, g, m, f) { - const b = g.content, y = g.tokens, w = e.width - r, C = f === 1; - let S = ql, L = 0, x = 0; - for (let Z = 0, _ = y.getCount(); Z < _; Z++) { - const v = y.getEndOffset(Z), P = y.getForeground(Z), E = l.getColor(P); - for (; L < v; L++) { - if (S > w) + static _renderLine(e, t, i, n, o, l, r, c, d, a, h, u, m, b, g) { + const Z = m.content, f = m.tokens, y = e.width - l, W = g === 1; + let G = ic, X = 0, L = 0; + for (let S = 0, x = f.getCount(); S < x; S++) { + const w = f.getEndOffset(S), A = f.getForeground(S), H = r.getColor(A); + for (; X < w; X++) { + if (G > y) return; - const Y = b.charCodeAt(L); - if (Y === 9) { - const B = u - (L + x) % u; - x += B - 1, S += B * r; - } else if (Y === 32) - S += r; + const F = Z.charCodeAt(X); + if (F === 9) { + const K = u - (X + L) % u; + L += K - 1, G += K * l; + } else if (F === 32) + G += l; else { - const B = Nh(Y) ? 2 : 1; - for (let X = 0; X < B; X++) - if (o === 2 ? c.blockRenderChar(e, S, d + h, E, a, t, i, C) : c.renderChar(e, S, d + h, Y, E, a, t, i, m, n, C), S += r, S > w) + const K = Mh(F) ? 2 : 1; + for (let E = 0; E < K; E++) + if (o === 2 ? d.blockRenderChar(e, G, a + h, H, c, t, i, W) : d.renderChar(e, G, a + h, F, H, c, t, i, b, n, W), G += l, G > y) return; } } } } } -class sY { +class RF { constructor(e, t, i) { this._startLineNumber = e, this._endLineNumber = t, this._defaultValue = i, this._values = []; for (let n = 0, o = this._endLineNumber - this._startLineNumber + 1; n < o; n++) @@ -28541,18 +28541,18 @@ class sY { return e < this._startLineNumber || e > this._endLineNumber ? this._defaultValue : this._values[e - this._startLineNumber]; } } -class Ure extends wo { +class Dre extends Go { constructor(e, t) { super(e), this._viewDomNode = t; const n = this._context.configuration.options.get( 146 /* EditorOption.layoutInfo */ ); - this._widgets = {}, this._verticalScrollbarWidth = n.verticalScrollbarWidth, this._minimapWidth = n.minimap.minimapWidth, this._horizontalScrollbarHeight = n.horizontalScrollbarHeight, this._editorHeight = n.height, this._editorWidth = n.width, this._viewDomNodeRect = { top: 0, left: 0, width: 0, height: 0 }, this._domNode = yt(document.createElement("div")), Tl.write( + this._widgets = {}, this._verticalScrollbarWidth = n.verticalScrollbarWidth, this._minimapWidth = n.minimap.minimapWidth, this._horizontalScrollbarHeight = n.horizontalScrollbarHeight, this._editorHeight = n.height, this._editorWidth = n.width, this._viewDomNodeRect = { top: 0, left: 0, width: 0, height: 0 }, this._domNode = ft(document.createElement("div")), vr.write( this._domNode, 4 /* PartFingerprint.OverlayWidgets */ - ), this._domNode.setClassName("overlayWidgets"), this.overflowingOverlayWidgetsDomNode = yt(document.createElement("div")), Tl.write( + ), this._domNode.setClassName("overlayWidgets"), this.overflowingOverlayWidgetsDomNode = ft(document.createElement("div")), vr.write( this.overflowingOverlayWidgetsDomNode, 5 /* PartFingerprint.OverflowingOverlayWidgets */ @@ -28574,7 +28574,7 @@ class Ure extends wo { } // ---- end view event handlers addWidget(e) { - const t = yt(e.getDomNode()); + const t = ft(e.getDomNode()); this._widgets[e.getId()] = { widget: e, preference: null, @@ -28596,9 +28596,9 @@ class Ure extends wo { var i, n; let e = 0; const t = Object.keys(this._widgets); - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o], c = (n = (i = this._widgets[l].widget).getMinContentWidthInPx) == null ? void 0 : n.call(i); - typeof c < "u" && (e = Math.max(e, c)); + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o], d = (n = (i = this._widgets[r].widget).getMinContentWidthInPx) == null ? void 0 : n.call(i); + typeof d < "u" && (e = Math.max(e, d)); } this._context.viewLayout.setOverlayWidgetsMinWidth(e); } @@ -28625,15 +28625,15 @@ class Ure extends wo { /* OverlayWidgetPositionPreference.TOP_CENTER */ ] += i.domNode.clientHeight) : i.setTop(0); else { - const { top: o, left: r } = e.preference; + const { top: o, left: l } = e.preference; if (this._context.configuration.options.get( 42 /* EditorOption.fixedOverflowWidgets */ ) && e.widget.allowEditorOverflow) { - const a = this._viewDomNodeRect; - i.setTop(o + a.top), i.setLeft(r + a.left), i.setPosition("fixed"); + const c = this._viewDomNodeRect; + i.setTop(o + c.top), i.setLeft(l + c.left), i.setPosition("fixed"); } else - i.setTop(o), i.setLeft(r), i.setPosition("absolute"); + i.setTop(o), i.setLeft(l), i.setPosition("absolute"); } } prepareRender(e) { @@ -28644,12 +28644,12 @@ class Ure extends wo { const t = Object.keys(this._widgets), i = Array.from({ length: 3 }, () => 0); t.sort((n, o) => (this._widgets[n].stack || 0) - (this._widgets[o].stack || 0)); for (let n = 0, o = t.length; n < o; n++) { - const r = t[n]; - this._renderWidget(this._widgets[r], i); + const l = t[n]; + this._renderWidget(this._widgets[l], i); } } } -class Kre { +class Fre { constructor(e, t) { const i = e.options; this.lineHeight = i.get( @@ -28665,88 +28665,88 @@ class Kre { 82 /* EditorOption.overviewRulerBorder */ ); - const n = t.getColor(Doe); + const n = t.getColor(Ile); this.borderColor = n ? n.toString() : null, this.hideCursor = i.get( 59 /* EditorOption.hideCursorInOverviewRuler */ ); - const o = t.getColor(gI); + const o = t.getColor(Cx); this.cursorColorSingle = o ? o.transparent(0.7).toString() : null; - const r = t.getColor(xU); - this.cursorColorPrimary = r ? r.transparent(0.7).toString() : null; - const l = t.getColor(MU); - this.cursorColorSecondary = l ? l.transparent(0.7).toString() : null, this.themeType = t.type; - const a = i.get( + const l = t.getColor(lQ); + this.cursorColorPrimary = l ? l.transparent(0.7).toString() : null; + const r = t.getColor(rQ); + this.cursorColorSecondary = r ? r.transparent(0.7).toString() : null, this.themeType = t.type; + const c = i.get( 73 /* EditorOption.minimap */ - ), c = a.enabled, d = a.side, h = t.getColor(Voe), u = Wi.getDefaultBackground(); - h ? this.backgroundColor = h : c && d === "right" ? this.backgroundColor = u : this.backgroundColor = null; - const m = i.get( + ), d = c.enabled, a = c.side, h = t.getColor(Sle), u = Ti.getDefaultBackground(); + h ? this.backgroundColor = h : d && a === "right" ? this.backgroundColor = u : this.backgroundColor = null; + const b = i.get( 146 /* EditorOption.layoutInfo */ ).overviewRuler; - this.top = m.top, this.right = m.right, this.domWidth = m.width, this.domHeight = m.height, this.overviewRulerLanes === 0 ? (this.canvasWidth = 0, this.canvasHeight = 0) : (this.canvasWidth = this.domWidth * this.pixelRatio | 0, this.canvasHeight = this.domHeight * this.pixelRatio | 0); - const [f, b] = this._initLanes(1, this.canvasWidth, this.overviewRulerLanes); - this.x = f, this.w = b; + this.top = b.top, this.right = b.right, this.domWidth = b.width, this.domHeight = b.height, this.overviewRulerLanes === 0 ? (this.canvasWidth = 0, this.canvasHeight = 0) : (this.canvasWidth = this.domWidth * this.pixelRatio | 0, this.canvasHeight = this.domHeight * this.pixelRatio | 0); + const [g, Z] = this._initLanes(1, this.canvasWidth, this.overviewRulerLanes); + this.x = g, this.w = Z; } _initLanes(e, t, i) { const n = t - e; if (i >= 3) { - const o = Math.floor(n / 3), r = Math.floor(n / 3), l = n - o - r, a = e, c = a + o, d = a + o + l; + const o = Math.floor(n / 3), l = Math.floor(n / 3), r = n - o - l, c = e, d = c + o, a = c + o + r; return [ [ 0, - a, - // Left c, + // Left + d, // Center - a, + c, // Left | Center - d, - // Right a, - // Left | Right + // Right c, + // Left | Right + d, // Center | Right - a + c // Left | Center | Right ], [ 0, o, // Left - l, + r, // Center - o + l, + o + r, // Left | Center - r, + l, // Right - o + l + r, + o + r + l, // Left | Right - l + r, + r + l, // Center | Right - o + l + r + o + r + l // Left | Center | Right ] ]; } else if (i === 2) { - const o = Math.floor(n / 2), r = n - o, l = e, a = l + o; + const o = Math.floor(n / 2), l = n - o, r = e, c = r + o; return [ [ 0, - l, + r, // Left - l, + r, // Center - l, + r, // Left | Center - a, + c, // Right - l, + r, // Left | Right - l, + r, // Center | Right - l + r // Left | Center | Right ], [ @@ -28757,18 +28757,18 @@ class Kre { // Center o, // Left | Center - r, + l, // Right - o + r, + o + l, // Left | Right - o + r, + o + l, // Center | Right - o + r + o + l // Left | Center | Right ] ]; } else { - const o = e, r = n; + const o = e, l = n; return [ [ 0, @@ -28789,39 +28789,39 @@ class Kre { ], [ 0, - r, + l, // Left - r, + l, // Center - r, + l, // Left | Center - r, + l, // Right - r, + l, // Left | Right - r, + l, // Center | Right - r + l // Left | Center | Right ] ]; } } equals(e) { - return this.lineHeight === e.lineHeight && this.pixelRatio === e.pixelRatio && this.overviewRulerLanes === e.overviewRulerLanes && this.renderBorder === e.renderBorder && this.borderColor === e.borderColor && this.hideCursor === e.hideCursor && this.cursorColorSingle === e.cursorColorSingle && this.cursorColorPrimary === e.cursorColorPrimary && this.cursorColorSecondary === e.cursorColorSecondary && this.themeType === e.themeType && K.equals(this.backgroundColor, e.backgroundColor) && this.top === e.top && this.right === e.right && this.domWidth === e.domWidth && this.domHeight === e.domHeight && this.canvasWidth === e.canvasWidth && this.canvasHeight === e.canvasHeight; + return this.lineHeight === e.lineHeight && this.pixelRatio === e.pixelRatio && this.overviewRulerLanes === e.overviewRulerLanes && this.renderBorder === e.renderBorder && this.borderColor === e.borderColor && this.hideCursor === e.hideCursor && this.cursorColorSingle === e.cursorColorSingle && this.cursorColorPrimary === e.cursorColorPrimary && this.cursorColorSecondary === e.cursorColorSecondary && this.themeType === e.themeType && Q.equals(this.backgroundColor, e.backgroundColor) && this.top === e.top && this.right === e.right && this.domWidth === e.domWidth && this.domHeight === e.domHeight && this.canvasWidth === e.canvasWidth && this.canvasHeight === e.canvasHeight; } } -class Qre extends wo { +class zre extends Go { constructor(e) { - super(e), this._actualShouldRender = 0, this._renderedDecorations = [], this._renderedCursorPositions = [], this._domNode = yt(document.createElement("canvas")), this._domNode.setClassName("decorationsOverviewRuler"), this._domNode.setPosition("absolute"), this._domNode.setLayerHinting(!0), this._domNode.setContain("strict"), this._domNode.setAttribute("aria-hidden", "true"), this._updateSettings(!1), this._tokensColorTrackerListener = Wi.onDidChange((t) => { + super(e), this._actualShouldRender = 0, this._renderedDecorations = [], this._renderedCursorPositions = [], this._domNode = ft(document.createElement("canvas")), this._domNode.setClassName("decorationsOverviewRuler"), this._domNode.setPosition("absolute"), this._domNode.setLayerHinting(!0), this._domNode.setContain("strict"), this._domNode.setAttribute("aria-hidden", "true"), this._updateSettings(!1), this._tokensColorTrackerListener = Ti.onDidChange((t) => { t.changedColorMap && this._updateSettings(!0); - }), this._cursorPositions = [{ position: new V(1, 1), color: this._settings.cursorColorSingle }]; + }), this._cursorPositions = [{ position: new Y(1, 1), color: this._settings.cursorColorSingle }]; } dispose() { super.dispose(), this._tokensColorTrackerListener.dispose(); } _updateSettings(e) { - const t = new Kre(this._context.configuration, this._context.theme); + const t = new Fre(this._context.configuration, this._context.theme); return this._settings && this._settings.equals(t) ? !1 : (this._settings = t, this._domNode.setTop(this._settings.top), this._domNode.setRight(this._settings.right), this._domNode.setWidth(this._settings.domWidth), this._domNode.setHeight(this._settings.domHeight), this._domNode.domNode.width = this._settings.canvasWidth, this._domNode.domNode.height = this._settings.canvasHeight, e && this._render(), !0); } // ---- begin view event handlers @@ -28840,7 +28840,7 @@ class Qre extends wo { let n = this._settings.cursorColorSingle; i > 1 && (n = t === 0 ? this._settings.cursorColorPrimary : this._settings.cursorColorSecondary), this._cursorPositions.push({ position: e.selections[t].getPosition(), color: n }); } - return this._cursorPositions.sort((t, i) => V.compare(t.position, i.position)), this._markRenderingIsMaybeNeeded(); + return this._cursorPositions.sort((t, i) => Y.compare(t.position, i.position)), this._markRenderingIsMaybeNeeded(); } onDecorationsChanged(e) { return e.affectsOverviewRuler ? this._markRenderingIsMaybeNeeded() : !1; @@ -28869,56 +28869,56 @@ class Qre extends wo { _render() { const e = this._settings.backgroundColor; if (this._settings.overviewRulerLanes === 0) { - this._domNode.setBackgroundColor(e ? K.Format.CSS.formatHexA(e) : ""), this._domNode.setDisplay("none"); + this._domNode.setBackgroundColor(e ? Q.Format.CSS.formatHexA(e) : ""), this._domNode.setDisplay("none"); return; } const t = this._context.viewModel.getAllOverviewRulerDecorations(this._context.theme); - if (t.sort(s1.compareByRenderingProps), this._actualShouldRender === 1 && !s1.equalsArr(this._renderedDecorations, t) && (this._actualShouldRender = 2), this._actualShouldRender === 1 && !ei(this._renderedCursorPositions, this._cursorPositions, (m, f) => m.position.lineNumber === f.position.lineNumber && m.color === f.color) && (this._actualShouldRender = 2), this._actualShouldRender === 1) + if (t.sort(gW.compareByRenderingProps), this._actualShouldRender === 1 && !gW.equalsArr(this._renderedDecorations, t) && (this._actualShouldRender = 2), this._actualShouldRender === 1 && !ti(this._renderedCursorPositions, this._cursorPositions, (b, g) => b.position.lineNumber === g.position.lineNumber && b.color === g.color) && (this._actualShouldRender = 2), this._actualShouldRender === 1) return; this._renderedDecorations = t, this._renderedCursorPositions = this._cursorPositions, this._domNode.setDisplay("block"); - const i = this._settings.canvasWidth, n = this._settings.canvasHeight, o = this._settings.lineHeight, r = this._context.viewLayout, l = this._context.viewLayout.getScrollHeight(), a = n / l, c = 6 * this._settings.pixelRatio | 0, d = c / 2 | 0, h = this._domNode.domNode.getContext("2d"); - e ? e.isOpaque() ? (h.fillStyle = K.Format.CSS.formatHexA(e), h.fillRect(0, 0, i, n)) : (h.clearRect(0, 0, i, n), h.fillStyle = K.Format.CSS.formatHexA(e), h.fillRect(0, 0, i, n)) : h.clearRect(0, 0, i, n); - const u = this._settings.x, g = this._settings.w; - for (const m of t) { - const f = m.color, b = m.data; - h.fillStyle = f; - let y = 0, w = 0, C = 0; - for (let S = 0, L = b.length / 3; S < L; S++) { - const x = b[3 * S], Z = b[3 * S + 1], _ = b[3 * S + 2]; - let v = r.getVerticalOffsetForLineNumber(Z) * a | 0, P = (r.getVerticalOffsetForLineNumber(_) + o) * a | 0; - if (P - v < c) { - let Y = (v + P) / 2 | 0; - Y < d ? Y = d : Y + d > n && (Y = n - d), v = Y - d, P = Y + d; + const i = this._settings.canvasWidth, n = this._settings.canvasHeight, o = this._settings.lineHeight, l = this._context.viewLayout, r = this._context.viewLayout.getScrollHeight(), c = n / r, d = 6 * this._settings.pixelRatio | 0, a = d / 2 | 0, h = this._domNode.domNode.getContext("2d"); + e ? e.isOpaque() ? (h.fillStyle = Q.Format.CSS.formatHexA(e), h.fillRect(0, 0, i, n)) : (h.clearRect(0, 0, i, n), h.fillStyle = Q.Format.CSS.formatHexA(e), h.fillRect(0, 0, i, n)) : h.clearRect(0, 0, i, n); + const u = this._settings.x, m = this._settings.w; + for (const b of t) { + const g = b.color, Z = b.data; + h.fillStyle = g; + let f = 0, y = 0, W = 0; + for (let G = 0, X = Z.length / 3; G < X; G++) { + const L = Z[3 * G], S = Z[3 * G + 1], x = Z[3 * G + 2]; + let w = l.getVerticalOffsetForLineNumber(S) * c | 0, A = (l.getVerticalOffsetForLineNumber(x) + o) * c | 0; + if (A - w < d) { + let F = (w + A) / 2 | 0; + F < a ? F = a : F + a > n && (F = n - a), w = F - a, A = F + a; } - v > C + 1 || x !== y ? (S !== 0 && h.fillRect(u[y], w, g[y], C - w), y = x, w = v, C = P) : P > C && (C = P); + w > W + 1 || L !== f ? (G !== 0 && h.fillRect(u[f], y, m[f], W - y), f = L, y = w, W = A) : A > W && (W = A); } - h.fillRect(u[y], w, g[y], C - w); + h.fillRect(u[f], y, m[f], W - y); } if (!this._settings.hideCursor) { - const m = 2 * this._settings.pixelRatio | 0, f = m / 2 | 0, b = this._settings.x[ + const b = 2 * this._settings.pixelRatio | 0, g = b / 2 | 0, Z = this._settings.x[ 7 /* OverviewRulerLane.Full */ - ], y = this._settings.w[ + ], f = this._settings.w[ 7 /* OverviewRulerLane.Full */ ]; - let w = -100, C = -100, S = null; - for (let L = 0, x = this._cursorPositions.length; L < x; L++) { - const Z = this._cursorPositions[L].color; - if (!Z) + let y = -100, W = -100, G = null; + for (let X = 0, L = this._cursorPositions.length; X < L; X++) { + const S = this._cursorPositions[X].color; + if (!S) continue; - const _ = this._cursorPositions[L].position; - let v = r.getVerticalOffsetForLineNumber(_.lineNumber) * a | 0; - v < f ? v = f : v + f > n && (v = n - f); - const P = v - f, E = P + m; - P > C + 1 || Z !== S ? (L !== 0 && S && h.fillRect(b, w, y, C - w), w = P, C = E) : E > C && (C = E), S = Z, h.fillStyle = Z; + const x = this._cursorPositions[X].position; + let w = l.getVerticalOffsetForLineNumber(x.lineNumber) * c | 0; + w < g ? w = g : w + g > n && (w = n - g); + const A = w - g, H = A + b; + A > W + 1 || S !== G ? (X !== 0 && G && h.fillRect(Z, y, f, W - y), y = A, W = H) : H > W && (W = H), G = S, h.fillStyle = S; } - S && h.fillRect(b, w, y, C - w); + G && h.fillRect(Z, y, f, W - y); } this._settings.renderBorder && this._settings.borderColor && this._settings.overviewRulerLanes > 0 && (h.beginPath(), h.lineWidth = 1, h.strokeStyle = this._settings.borderColor, h.moveTo(0, 0), h.lineTo(0, n), h.moveTo(1, 0), h.lineTo(i, 0), h.stroke()); } } -class oY { +class NF { constructor(e, t, i) { this._colorZoneBrand = void 0, this.from = e | 0, this.to = t | 0, this.colorId = i | 0; } @@ -28926,7 +28926,7 @@ class oY { return e.colorId === t.colorId ? e.from === t.from ? e.to - t.to : e.from - t.from : e.colorId - t.colorId; } } -class BU { +class SQ { constructor(e, t, i, n) { this._overviewRulerZoneBrand = void 0, this.startLineNumber = e, this.endLineNumber = t, this.heightInLines = i, this.color = n, this._colorZone = null; } @@ -28940,7 +28940,7 @@ class BU { return this._colorZone; } } -class jre { +class Are { constructor(e) { this._getVerticalOffsetForLine = e, this._zones = [], this._colorZonesInvalid = !1, this._lineHeight = 0, this._domWidth = 0, this._domHeight = 0, this._outerHeight = 0, this._pixelRatio = 1, this._lastAssignedId = 0, this._color2Id = /* @__PURE__ */ Object.create(null), this._id2Color = []; } @@ -28948,7 +28948,7 @@ class jre { return this._id2Color; } setZones(e) { - this._zones = e, this._zones.sort(BU.compare); + this._zones = e, this._zones.sort(SQ.compare); } setLineHeight(e) { return this._lineHeight === e ? !1 : (this._lineHeight = e, this._colorZonesInvalid = !0, !0); @@ -28981,33 +28981,33 @@ class jre { return this._outerHeight === e ? !1 : (this._outerHeight = e, this._colorZonesInvalid = !0, !0); } resolveColorZones() { - const e = this._colorZonesInvalid, t = Math.floor(this._lineHeight), i = Math.floor(this.getCanvasHeight()), n = Math.floor(this._outerHeight), o = i / n, r = Math.floor(4 * this._pixelRatio / 2), l = []; - for (let a = 0, c = this._zones.length; a < c; a++) { - const d = this._zones[a]; + const e = this._colorZonesInvalid, t = Math.floor(this._lineHeight), i = Math.floor(this.getCanvasHeight()), n = Math.floor(this._outerHeight), o = i / n, l = Math.floor(4 * this._pixelRatio / 2), r = []; + for (let c = 0, d = this._zones.length; c < d; c++) { + const a = this._zones[c]; if (!e) { - const S = d.getColorZones(); - if (S) { - l.push(S); + const G = a.getColorZones(); + if (G) { + r.push(G); continue; } } - const h = this._getVerticalOffsetForLine(d.startLineNumber), u = d.heightInLines === 0 ? this._getVerticalOffsetForLine(d.endLineNumber) + t : h + d.heightInLines * t, g = Math.floor(o * h), m = Math.floor(o * u); - let f = Math.floor((g + m) / 2), b = m - f; - b < r && (b = r), f - b < 0 && (f = b), f + b > i && (f = i - b); - const y = d.color; - let w = this._color2Id[y]; - w || (w = ++this._lastAssignedId, this._color2Id[y] = w, this._id2Color[w] = y); - const C = new oY(f - b, f + b, w); - d.setColorZone(C), l.push(C); + const h = this._getVerticalOffsetForLine(a.startLineNumber), u = a.heightInLines === 0 ? this._getVerticalOffsetForLine(a.endLineNumber) + t : h + a.heightInLines * t, m = Math.floor(o * h), b = Math.floor(o * u); + let g = Math.floor((m + b) / 2), Z = b - g; + Z < l && (Z = l), g - Z < 0 && (g = Z), g + Z > i && (g = i - Z); + const f = a.color; + let y = this._color2Id[f]; + y || (y = ++this._lastAssignedId, this._color2Id[f] = y, this._id2Color[y] = f); + const W = new NF(g - Z, g + Z, y); + a.setColorZone(W), r.push(W); } - return this._colorZonesInvalid = !1, l.sort(oY.compare), l; + return this._colorZonesInvalid = !1, r.sort(NF.compare), r; } } -class qre extends yC { +class Kre extends wG { constructor(e, t) { super(), this._context = e; const i = this._context.configuration.options; - this._domNode = yt(document.createElement("canvas")), this._domNode.setClassName(t), this._domNode.setPosition("absolute"), this._domNode.setLayerHinting(!0), this._domNode.setContain("strict"), this._zoneManager = new jre((n) => this._context.viewLayout.getVerticalOffsetForLineNumber(n)), this._zoneManager.setDOMWidth(0), this._zoneManager.setDOMHeight(0), this._zoneManager.setOuterHeight(this._context.viewLayout.getScrollHeight()), this._zoneManager.setLineHeight(i.get( + this._domNode = ft(document.createElement("canvas")), this._domNode.setClassName(t), this._domNode.setPosition("absolute"), this._domNode.setLayerHinting(!0), this._domNode.setContain("strict"), this._zoneManager = new Are((n) => this._context.viewLayout.getVerticalOffsetForLineNumber(n)), this._zoneManager.setDOMWidth(0), this._zoneManager.setDOMHeight(0), this._zoneManager.setOuterHeight(this._context.viewLayout.getScrollHeight()), this._zoneManager.setLineHeight(i.get( 67 /* EditorOption.lineHeight */ )), this._zoneManager.setPixelRatio(i.get( @@ -29063,17 +29063,17 @@ class qre extends yC { return o.clearRect(0, 0, e, t), i.length > 0 && this._renderOneLane(o, i, n, e), !0; } _renderOneLane(e, t, i, n) { - let o = 0, r = 0, l = 0; - for (const a of t) { - const c = a.colorId, d = a.from, h = a.to; - c !== o ? (e.fillRect(0, r, n, l - r), o = c, e.fillStyle = i[o], r = d, l = h) : l >= d ? l = Math.max(l, h) : (e.fillRect(0, r, n, l - r), r = d, l = h); + let o = 0, l = 0, r = 0; + for (const c of t) { + const d = c.colorId, a = c.from, h = c.to; + d !== o ? (e.fillRect(0, l, n, r - l), o = d, e.fillStyle = i[o], l = a, r = h) : r >= a ? r = Math.max(r, h) : (e.fillRect(0, l, n, r - l), l = a, r = h); } - e.fillRect(0, r, n, l - r); + e.fillRect(0, l, n, r - l); } } -class $re extends wo { +class Ure extends Go { constructor(e) { - super(e), this.domNode = yt(document.createElement("div")), this.domNode.setAttribute("role", "presentation"), this.domNode.setAttribute("aria-hidden", "true"), this.domNode.setClassName("view-rulers"), this._renderedRulers = []; + super(e), this.domNode = ft(document.createElement("div")), this.domNode.setAttribute("role", "presentation"), this.domNode.setAttribute("aria-hidden", "true"), this.domNode.setClassName("view-rulers"), this._renderedRulers = []; const t = this._context.configuration.options; this._rulers = t.get( 103 @@ -29109,10 +29109,10 @@ class $re extends wo { return; if (e < t) { const { tabSize: n } = this._context.viewModel.model.getOptions(), o = n; - let r = t - e; - for (; r > 0; ) { - const l = yt(document.createElement("div")); - l.setClassName("view-ruler"), l.setWidth(o), this.domNode.appendChild(l), this._renderedRulers.push(l), r--; + let l = t - e; + for (; l > 0; ) { + const r = ft(document.createElement("div")); + r.setClassName("view-ruler"), r.setWidth(o), this.domNode.appendChild(r), this._renderedRulers.push(r), l--; } return; } @@ -29130,14 +29130,14 @@ class $re extends wo { } } } -class ele extends wo { +class Pre extends Go { constructor(e) { super(e), this._scrollTop = 0, this._width = 0, this._updateWidth(), this._shouldShow = !1; const i = this._context.configuration.options.get( 104 /* EditorOption.scrollbar */ ); - this._useShadows = i.useShadows, this._domNode = yt(document.createElement("div")), this._domNode.setAttribute("role", "presentation"), this._domNode.setAttribute("aria-hidden", "true"); + this._useShadows = i.useShadows, this._domNode = ft(document.createElement("div")), this._domNode.setAttribute("role", "presentation"), this._domNode.setAttribute("aria-hidden", "true"); } dispose() { super.dispose(); @@ -29174,23 +29174,23 @@ class ele extends wo { this._domNode.setWidth(this._width), this._domNode.setClassName(this._shouldShow ? "scroll-decoration" : ""); } } -class tle { +class Bre { constructor(e) { this.left = e.left, this.width = e.width, this.startStyle = null, this.endStyle = null; } } -class ile { +class _re { constructor(e, t) { this.lineNumber = e, this.ranges = t; } } -function nle(s) { - return new tle(s); +function Qre(s) { + return new Bre(s); } -function sle(s) { - return new ile(s.lineNumber, s.ranges.map(nle)); +function Ore(s) { + return new _re(s.lineNumber, s.ranges.map(Qre)); } -const Ai = class Ai extends Xm { +const Li = class Li extends Kb { constructor(e) { super(), this._previousFrameVisibleRangesWithStyle = [], this._context = e; const t = this._context.configuration.options; @@ -29249,41 +29249,41 @@ const Ai = class Ai extends Xm { } _enrichVisibleRangesWithStyle(e, t, i) { const n = this._typicalHalfwidthCharacterWidth / 4; - let o = null, r = null; + let o = null, l = null; if (i && i.length > 0 && t.length > 0) { - const l = t[0].lineNumber; - if (l === e.startLineNumber) - for (let c = 0; !o && c < i.length; c++) - i[c].lineNumber === l && (o = i[c].ranges[0]); - const a = t[t.length - 1].lineNumber; - if (a === e.endLineNumber) - for (let c = i.length - 1; !r && c >= 0; c--) - i[c].lineNumber === a && (r = i[c].ranges[0]); - o && !o.startStyle && (o = null), r && !r.startStyle && (r = null); - } - for (let l = 0, a = t.length; l < a; l++) { - const c = t[l].ranges[0], d = c.left, h = c.left + c.width, u = { + const r = t[0].lineNumber; + if (r === e.startLineNumber) + for (let d = 0; !o && d < i.length; d++) + i[d].lineNumber === r && (o = i[d].ranges[0]); + const c = t[t.length - 1].lineNumber; + if (c === e.endLineNumber) + for (let d = i.length - 1; !l && d >= 0; d--) + i[d].lineNumber === c && (l = i[d].ranges[0]); + o && !o.startStyle && (o = null), l && !l.startStyle && (l = null); + } + for (let r = 0, c = t.length; r < c; r++) { + const d = t[r].ranges[0], a = d.left, h = d.left + d.width, u = { top: 0, bottom: 0 /* CornerStyle.EXTERN */ - }, g = { + }, m = { top: 0, bottom: 0 /* CornerStyle.EXTERN */ }; - if (l > 0) { - const m = t[l - 1].ranges[0].left, f = t[l - 1].ranges[0].left + t[l - 1].ranges[0].width; - rS(d - m) < n ? u.top = 2 : d > m && (u.top = 1), rS(h - f) < n ? g.top = 2 : m < h && h < f && (g.top = 1); - } else o && (u.top = o.startStyle.top, g.top = o.endStyle.top); - if (l + 1 < a) { - const m = t[l + 1].ranges[0].left, f = t[l + 1].ranges[0].left + t[l + 1].ranges[0].width; - rS(d - m) < n ? u.bottom = 2 : m < d && d < f && (u.bottom = 1), rS(h - f) < n ? g.bottom = 2 : h < f && (g.bottom = 1); - } else r && (u.bottom = r.startStyle.bottom, g.bottom = r.endStyle.bottom); - c.startStyle = u, c.endStyle = g; + if (r > 0) { + const b = t[r - 1].ranges[0].left, g = t[r - 1].ranges[0].left + t[r - 1].ranges[0].width; + y1(a - b) < n ? u.top = 2 : a > b && (u.top = 1), y1(h - g) < n ? m.top = 2 : b < h && h < g && (m.top = 1); + } else o && (u.top = o.startStyle.top, m.top = o.endStyle.top); + if (r + 1 < c) { + const b = t[r + 1].ranges[0].left, g = t[r + 1].ranges[0].left + t[r + 1].ranges[0].width; + y1(a - b) < n ? u.bottom = 2 : b < a && a < g && (u.bottom = 1), y1(h - g) < n ? m.bottom = 2 : h < g && (m.bottom = 1); + } else l && (u.bottom = l.startStyle.bottom, m.bottom = l.endStyle.bottom); + d.startStyle = u, d.endStyle = m; } } _getVisibleRangesWithStyle(e, t, i) { - const o = (t.linesVisibleRangesForRange(e, !0) || []).map(sle); + const o = (t.linesVisibleRangesForRange(e, !0) || []).map(Ore); return !this._visibleRangesHaveGaps(o) && this._roundedSelection && this._enrichVisibleRangesWithStyle(t.visibleRange, o, i), o; } _createSelectionPiece(e, t, i, n, o) { @@ -29292,52 +29292,52 @@ const Ai = class Ai extends Xm { _actualRenderOneSelection(e, t, i, n) { if (n.length === 0) return; - const o = !!n[0].ranges[0].startStyle, r = n[0].lineNumber, l = n[n.length - 1].lineNumber; - for (let a = 0, c = n.length; a < c; a++) { - const d = n[a], h = d.lineNumber, u = h - t, g = i && h === r ? 1 : 0, m = i && h !== r && h === l ? 1 : 0; - let f = "", b = ""; - for (let y = 0, w = d.ranges.length; y < w; y++) { - const C = d.ranges[y]; + const o = !!n[0].ranges[0].startStyle, l = n[0].lineNumber, r = n[n.length - 1].lineNumber; + for (let c = 0, d = n.length; c < d; c++) { + const a = n[c], h = a.lineNumber, u = h - t, m = i && h === l ? 1 : 0, b = i && h !== l && h === r ? 1 : 0; + let g = "", Z = ""; + for (let f = 0, y = a.ranges.length; f < y; f++) { + const W = a.ranges[f]; if (o) { - const L = C.startStyle, x = C.endStyle; - if (L.top === 1 || L.bottom === 1) { - f += this._createSelectionPiece(g, m, Ai.SELECTION_CLASS_NAME, C.left - Ai.ROUNDED_PIECE_WIDTH, Ai.ROUNDED_PIECE_WIDTH); - let Z = Ai.EDITOR_BACKGROUND_CLASS_NAME; - L.top === 1 && (Z += " " + Ai.SELECTION_TOP_RIGHT), L.bottom === 1 && (Z += " " + Ai.SELECTION_BOTTOM_RIGHT), f += this._createSelectionPiece(g, m, Z, C.left - Ai.ROUNDED_PIECE_WIDTH, Ai.ROUNDED_PIECE_WIDTH); + const X = W.startStyle, L = W.endStyle; + if (X.top === 1 || X.bottom === 1) { + g += this._createSelectionPiece(m, b, Li.SELECTION_CLASS_NAME, W.left - Li.ROUNDED_PIECE_WIDTH, Li.ROUNDED_PIECE_WIDTH); + let S = Li.EDITOR_BACKGROUND_CLASS_NAME; + X.top === 1 && (S += " " + Li.SELECTION_TOP_RIGHT), X.bottom === 1 && (S += " " + Li.SELECTION_BOTTOM_RIGHT), g += this._createSelectionPiece(m, b, S, W.left - Li.ROUNDED_PIECE_WIDTH, Li.ROUNDED_PIECE_WIDTH); } - if (x.top === 1 || x.bottom === 1) { - f += this._createSelectionPiece(g, m, Ai.SELECTION_CLASS_NAME, C.left + C.width, Ai.ROUNDED_PIECE_WIDTH); - let Z = Ai.EDITOR_BACKGROUND_CLASS_NAME; - x.top === 1 && (Z += " " + Ai.SELECTION_TOP_LEFT), x.bottom === 1 && (Z += " " + Ai.SELECTION_BOTTOM_LEFT), f += this._createSelectionPiece(g, m, Z, C.left + C.width, Ai.ROUNDED_PIECE_WIDTH); + if (L.top === 1 || L.bottom === 1) { + g += this._createSelectionPiece(m, b, Li.SELECTION_CLASS_NAME, W.left + W.width, Li.ROUNDED_PIECE_WIDTH); + let S = Li.EDITOR_BACKGROUND_CLASS_NAME; + L.top === 1 && (S += " " + Li.SELECTION_TOP_LEFT), L.bottom === 1 && (S += " " + Li.SELECTION_BOTTOM_LEFT), g += this._createSelectionPiece(m, b, S, W.left + W.width, Li.ROUNDED_PIECE_WIDTH); } } - let S = Ai.SELECTION_CLASS_NAME; + let G = Li.SELECTION_CLASS_NAME; if (o) { - const L = C.startStyle, x = C.endStyle; - L.top === 0 && (S += " " + Ai.SELECTION_TOP_LEFT), L.bottom === 0 && (S += " " + Ai.SELECTION_BOTTOM_LEFT), x.top === 0 && (S += " " + Ai.SELECTION_TOP_RIGHT), x.bottom === 0 && (S += " " + Ai.SELECTION_BOTTOM_RIGHT); + const X = W.startStyle, L = W.endStyle; + X.top === 0 && (G += " " + Li.SELECTION_TOP_LEFT), X.bottom === 0 && (G += " " + Li.SELECTION_BOTTOM_LEFT), L.top === 0 && (G += " " + Li.SELECTION_TOP_RIGHT), L.bottom === 0 && (G += " " + Li.SELECTION_BOTTOM_RIGHT); } - b += this._createSelectionPiece(g, m, S, C.left, C.width); + Z += this._createSelectionPiece(m, b, G, W.left, W.width); } - e[u][0] += f, e[u][1] += b; + e[u][0] += g, e[u][1] += Z; } } prepareRender(e) { const t = [], i = e.visibleRange.startLineNumber, n = e.visibleRange.endLineNumber; - for (let r = i; r <= n; r++) { - const l = r - i; - t[l] = ["", ""]; + for (let l = i; l <= n; l++) { + const r = l - i; + t[r] = ["", ""]; } const o = []; - for (let r = 0, l = this._selections.length; r < l; r++) { - const a = this._selections[r]; - if (a.isEmpty()) { - o[r] = null; + for (let l = 0, r = this._selections.length; l < r; l++) { + const c = this._selections[l]; + if (c.isEmpty()) { + o[l] = null; continue; } - const c = this._getVisibleRangesWithStyle(a, e, this._previousFrameVisibleRangesWithStyle[r]); - o[r] = c, this._actualRenderOneSelection(t, i, this._selections.length > 1, c); + const d = this._getVisibleRangesWithStyle(c, e, this._previousFrameVisibleRangesWithStyle[l]); + o[l] = d, this._actualRenderOneSelection(t, i, this._selections.length > 1, d); } - this._previousFrameVisibleRangesWithStyle = o, this._renderResult = t.map(([r, l]) => r + l); + this._previousFrameVisibleRangesWithStyle = o, this._renderResult = t.map(([l, r]) => l + r); } render(e, t) { if (!this._renderResult) @@ -29346,25 +29346,25 @@ const Ai = class Ai extends Xm { return i < 0 || i >= this._renderResult.length ? "" : this._renderResult[i]; } }; -Ai.SELECTION_CLASS_NAME = "selected-text", Ai.SELECTION_TOP_LEFT = "top-left-radius", Ai.SELECTION_BOTTOM_LEFT = "bottom-left-radius", Ai.SELECTION_TOP_RIGHT = "top-right-radius", Ai.SELECTION_BOTTOM_RIGHT = "bottom-right-radius", Ai.EDITOR_BACKGROUND_CLASS_NAME = "monaco-editor-background", Ai.ROUNDED_PIECE_WIDTH = 10; -let Lv = Ai; -Lr((s, e) => { - const t = s.getColor(Yie); +Li.SELECTION_CLASS_NAME = "selected-text", Li.SELECTION_TOP_LEFT = "top-left-radius", Li.SELECTION_BOTTOM_LEFT = "bottom-left-radius", Li.SELECTION_TOP_RIGHT = "top-right-radius", Li.SELECTION_BOTTOM_RIGHT = "bottom-right-radius", Li.EDITOR_BACKGROUND_CLASS_NAME = "monaco-editor-background", Li.ROUNDED_PIECE_WIDTH = 10; +let Aw = Li; +Il((s, e) => { + const t = s.getColor(Mne); t && !t.isTransparent() && e.addRule(`.monaco-editor .view-line span.inline-selected-text { color: ${t}; }`); }); -function rS(s) { +function y1(s) { return s < 0 ? -s : s; } -class rY { - constructor(e, t, i, n, o, r, l) { - this.top = e, this.left = t, this.paddingLeft = i, this.width = n, this.height = o, this.textContent = r, this.textContentClassName = l; +class wF { + constructor(e, t, i, n, o, l, r) { + this.top = e, this.left = t, this.paddingLeft = i, this.width = n, this.height = o, this.textContent = l, this.textContentClassName = r; } } -var Mc; +var Rd; (function(s) { s[s.Single = 0] = "Single", s[s.MultiPrimary = 1] = "MultiPrimary", s[s.MultiSecondary = 2] = "MultiSecondary"; -})(Mc || (Mc = {})); -class lY { +})(Rd || (Rd = {})); +class TF { constructor(e, t) { this._context = e; const i = this._context.configuration.options, n = i.get( @@ -29380,7 +29380,7 @@ class lY { ), this._typicalHalfwidthCharacterWidth = n.typicalHalfwidthCharacterWidth, this._lineCursorWidth = Math.min(i.get( 31 /* EditorOption.cursorWidth */ - ), this._typicalHalfwidthCharacterWidth), this._isVisible = !0, this._domNode = yt(document.createElement("div")), this._domNode.setClassName(`cursor ${If}`), this._domNode.setHeight(this._lineHeight), this._domNode.setTop(0), this._domNode.setLeft(0), mn(this._domNode, n), this._domNode.setDisplay("none"), this._position = new V(1, 1), this._pluralityClass = "", this.setPlurality(t), this._lastRenderedContent = "", this._renderData = null; + ), this._typicalHalfwidthCharacterWidth), this._isVisible = !0, this._domNode = ft(document.createElement("div")), this._domNode.setClassName(`cursor ${Yg}`), this._domNode.setHeight(this._lineHeight), this._domNode.setTop(0), this._domNode.setLeft(0), pn(this._domNode, n), this._domNode.setDisplay("none"), this._position = new Y(1, 1), this._pluralityClass = "", this.setPlurality(t), this._lastRenderedContent = "", this._renderData = null; } getDomNode() { return this._domNode; @@ -29391,13 +29391,13 @@ class lY { setPlurality(e) { switch (e) { default: - case Mc.Single: + case Rd.Single: this._pluralityClass = ""; break; - case Mc.MultiPrimary: + case Rd.MultiPrimary: this._pluralityClass = "cursor-primary"; break; - case Mc.MultiSecondary: + case Rd.MultiSecondary: this._pluralityClass = "cursor-secondary"; break; } @@ -29422,7 +29422,7 @@ class lY { ), this._typicalHalfwidthCharacterWidth = i.typicalHalfwidthCharacterWidth, this._lineCursorWidth = Math.min(t.get( 31 /* EditorOption.cursorWidth */ - ), this._typicalHalfwidthCharacterWidth), mn(this._domNode, i), !0; + ), this._typicalHalfwidthCharacterWidth), pn(this._domNode, i), !0; } onCursorPositionChanged(e, t) { return t ? this._domNode.domNode.style.transitionProperty = "none" : this._domNode.domNode.style.transitionProperty = "", this._position = e, !0; @@ -29432,34 +29432,34 @@ class lY { * Also returns the next grapheme. */ _getGraphemeAwarePosition() { - const { lineNumber: e, column: t } = this._position, i = this._context.viewModel.getLineContent(e), [n, o] = oq(i, t - 1); - return [new V(e, n + 1), i.substring(n, o)]; + const { lineNumber: e, column: t } = this._position, i = this._context.viewModel.getLineContent(e), [n, o] = jq(i, t - 1); + return [new Y(e, n + 1), i.substring(n, o)]; } _prepareRender(e) { let t = "", i = ""; const [n, o] = this._getGraphemeAwarePosition(); - if (this._cursorStyle === hn.Line || this._cursorStyle === hn.LineThin) { + if (this._cursorStyle === un.Line || this._cursorStyle === un.LineThin) { const u = e.visibleRangeForPosition(n); if (!u || u.outsideRenderedLine) return null; - const g = xe(this._domNode.domNode); - let m; - this._cursorStyle === hn.Line ? (m = iF(g, this._lineCursorWidth > 0 ? this._lineCursorWidth : 2), m > 2 && (t = o, i = this._getTokenClassName(n))) : m = iF(g, 1); - let f = u.left, b = 0; - m >= 2 && f >= 1 && (b = 1, f -= b); - const y = e.getVerticalOffsetForLineNumber(n.lineNumber) - e.bigNumbersDelta; - return new rY(y, f, b, m, this._lineHeight, t, i); - } - const r = e.linesVisibleRangesForRange(new M(n.lineNumber, n.column, n.lineNumber, n.column + o.length), !1); - if (!r || r.length === 0) + const m = Le(this._domNode.domNode); + let b; + this._cursorStyle === un.Line ? (b = xD(m, this._lineCursorWidth > 0 ? this._lineCursorWidth : 2), b > 2 && (t = o, i = this._getTokenClassName(n))) : b = xD(m, 1); + let g = u.left, Z = 0; + b >= 2 && g >= 1 && (Z = 1, g -= Z); + const f = e.getVerticalOffsetForLineNumber(n.lineNumber) - e.bigNumbersDelta; + return new wF(f, g, Z, b, this._lineHeight, t, i); + } + const l = e.linesVisibleRangesForRange(new I(n.lineNumber, n.column, n.lineNumber, n.column + o.length), !1); + if (!l || l.length === 0) return null; - const l = r[0]; - if (l.outsideRenderedLine || l.ranges.length === 0) + const r = l[0]; + if (r.outsideRenderedLine || r.ranges.length === 0) return null; - const a = l.ranges[0], c = o === " " ? this._typicalHalfwidthCharacterWidth : a.width < 1 ? this._typicalHalfwidthCharacterWidth : a.width; - this._cursorStyle === hn.Block && (t = o, i = this._getTokenClassName(n)); - let d = e.getVerticalOffsetForLineNumber(n.lineNumber) - e.bigNumbersDelta, h = this._lineHeight; - return (this._cursorStyle === hn.Underline || this._cursorStyle === hn.UnderlineThin) && (d += this._lineHeight - 2, h = 2), new rY(d, a.left, 0, c, h, t, i); + const c = r.ranges[0], d = o === " " ? this._typicalHalfwidthCharacterWidth : c.width < 1 ? this._typicalHalfwidthCharacterWidth : c.width; + this._cursorStyle === un.Block && (t = o, i = this._getTokenClassName(n)); + let a = e.getVerticalOffsetForLineNumber(n.lineNumber) - e.bigNumbersDelta, h = this._lineHeight; + return (this._cursorStyle === un.Underline || this._cursorStyle === un.UnderlineThin) && (a += this._lineHeight - 2, h = 2), new wF(a, c.left, 0, d, h, t, i); } _getTokenClassName(e) { const t = this._context.viewModel.getViewLineData(e.lineNumber), i = t.tokens.findTokenIndexAtOffset(e.column - 1); @@ -29469,7 +29469,7 @@ class lY { this._renderData = this._prepareRender(e); } render(e) { - return this._renderData ? (this._lastRenderedContent !== this._renderData.textContent && (this._lastRenderedContent = this._renderData.textContent, this._domNode.domNode.textContent = this._lastRenderedContent), this._domNode.setClassName(`cursor ${this._pluralityClass} ${If} ${this._renderData.textContentClassName}`), this._domNode.setDisplay("block"), this._domNode.setTop(this._renderData.top), this._domNode.setLeft(this._renderData.left), this._domNode.setPaddingLeft(this._renderData.paddingLeft), this._domNode.setWidth(this._renderData.width), this._domNode.setLineHeight(this._renderData.height), this._domNode.setHeight(this._renderData.height), { + return this._renderData ? (this._lastRenderedContent !== this._renderData.textContent && (this._lastRenderedContent = this._renderData.textContent, this._domNode.domNode.textContent = this._lastRenderedContent), this._domNode.setClassName(`cursor ${this._pluralityClass} ${Yg} ${this._renderData.textContentClassName}`), this._domNode.setDisplay("block"), this._domNode.setTop(this._renderData.top), this._domNode.setLeft(this._renderData.left), this._domNode.setPaddingLeft(this._renderData.paddingLeft), this._domNode.setWidth(this._renderData.width), this._domNode.setLineHeight(this._renderData.height), this._domNode.setHeight(this._renderData.height), { domNode: this._domNode.domNode, position: this._position, contentLeft: this._renderData.left, @@ -29478,7 +29478,7 @@ class lY { }) : (this._domNode.setDisplay("none"), null); } } -const fw = class fw extends wo { +const Cy = class Cy extends Go { constructor(e) { super(e); const t = this._context.configuration.options; @@ -29494,7 +29494,7 @@ const fw = class fw extends wo { ), this._cursorSmoothCaretAnimation = t.get( 27 /* EditorOption.cursorSmoothCaretAnimation */ - ), this._selectionIsEmpty = !0, this._isComposingInput = !1, this._isVisible = !1, this._primaryCursor = new lY(this._context, Mc.Single), this._secondaryCursors = [], this._renderData = [], this._domNode = yt(document.createElement("div")), this._domNode.setAttribute("role", "presentation"), this._domNode.setAttribute("aria-hidden", "true"), this._updateDomClassName(), this._domNode.appendChild(this._primaryCursor.getDomNode()), this._startCursorBlinkAnimation = new qr(), this._cursorFlatBlinkInterval = new aE(), this._blinkingEnabled = !1, this._editorHasFocus = !1, this._updateBlinking(); + ), this._selectionIsEmpty = !0, this._isComposingInput = !1, this._isVisible = !1, this._primaryCursor = new TF(this._context, Rd.Single), this._secondaryCursors = [], this._renderData = [], this._domNode = ft(document.createElement("div")), this._domNode.setAttribute("role", "presentation"), this._domNode.setAttribute("aria-hidden", "true"), this._updateDomClassName(), this._domNode.appendChild(this._primaryCursor.getDomNode()), this._startCursorBlinkAnimation = new tr(), this._cursorFlatBlinkInterval = new Mv(), this._blinkingEnabled = !1, this._editorHasFocus = !1, this._updateBlinking(); } dispose() { super.dispose(), this._startCursorBlinkAnimation.dispose(), this._cursorFlatBlinkInterval.dispose(); @@ -29530,15 +29530,15 @@ const fw = class fw extends wo { } _onCursorPositionChanged(e, t, i) { const n = this._secondaryCursors.length !== t.length || this._cursorSmoothCaretAnimation === "explicit" && i !== 3; - if (this._primaryCursor.setPlurality(t.length ? Mc.MultiPrimary : Mc.Single), this._primaryCursor.onCursorPositionChanged(e, n), this._updateBlinking(), this._secondaryCursors.length < t.length) { + if (this._primaryCursor.setPlurality(t.length ? Rd.MultiPrimary : Rd.Single), this._primaryCursor.onCursorPositionChanged(e, n), this._updateBlinking(), this._secondaryCursors.length < t.length) { const o = t.length - this._secondaryCursors.length; - for (let r = 0; r < o; r++) { - const l = new lY(this._context, Mc.MultiSecondary); - this._domNode.domNode.insertBefore(l.getDomNode().domNode, this._primaryCursor.getDomNode().domNode.nextSibling), this._secondaryCursors.push(l); + for (let l = 0; l < o; l++) { + const r = new TF(this._context, Rd.MultiSecondary); + this._domNode.domNode.insertBefore(r.getDomNode().domNode, this._primaryCursor.getDomNode().domNode.nextSibling), this._secondaryCursors.push(r); } } else if (this._secondaryCursors.length > t.length) { const o = this._secondaryCursors.length - t.length; - for (let r = 0; r < o; r++) + for (let l = 0; l < o; l++) this._domNode.removeChild(this._secondaryCursors[0].getDomNode()), this._secondaryCursors.splice(0, 1); } for (let o = 0; o < t.length; o++) @@ -29600,9 +29600,9 @@ const fw = class fw extends wo { const e = this._getCursorBlinking(), t = e === 0, i = e === 5; t ? this._hide() : this._show(), this._blinkingEnabled = !1, this._updateDomClassName(), !t && !i && (e === 1 ? this._cursorFlatBlinkInterval.cancelAndSet(() => { this._isVisible ? this._hide() : this._show(); - }, fw.BLINK_INTERVAL, xe(this._domNode.domNode)) : this._startCursorBlinkAnimation.setIfNotSet(() => { + }, Cy.BLINK_INTERVAL, Le(this._domNode.domNode)) : this._startCursorBlinkAnimation.setIfNotSet(() => { this._blinkingEnabled = !0, this._updateDomClassName(); - }, fw.BLINK_INTERVAL)); + }, Cy.BLINK_INTERVAL)); } // --- end blinking logic _updateDomClassName() { @@ -29611,22 +29611,22 @@ const fw = class fw extends wo { _getClassName() { let e = "cursors-layer"; switch (this._selectionIsEmpty || (e += " has-selection"), this._cursorStyle) { - case hn.Line: + case un.Line: e += " cursor-line-style"; break; - case hn.Block: + case un.Block: e += " cursor-block-style"; break; - case hn.Underline: + case un.Underline: e += " cursor-underline-style"; break; - case hn.LineThin: + case un.LineThin: e += " cursor-line-thin-style"; break; - case hn.BlockOutline: + case un.BlockOutline: e += " cursor-block-outline-style"; break; - case hn.UnderlineThin: + case un.UnderlineThin: e += " cursor-underline-thin-style"; break; default: @@ -29679,9 +29679,9 @@ const fw = class fw extends wo { let i = 0; const n = this._primaryCursor.render(e); n && (t[i++] = n); - for (let o = 0, r = this._secondaryCursors.length; o < r; o++) { - const l = this._secondaryCursors[o].render(e); - l && (t[i++] = l); + for (let o = 0, l = this._secondaryCursors.length; o < l; o++) { + const r = this._secondaryCursors[o].render(e); + r && (t[i++] = r); } this._renderData = t; } @@ -29689,26 +29689,26 @@ const fw = class fw extends wo { return this._renderData; } }; -fw.BLINK_INTERVAL = 500; -let Av = fw; -Lr((s, e) => { +Cy.BLINK_INTERVAL = 500; +let Kw = Cy; +Il((s, e) => { const t = [ - { class: ".cursor", foreground: gI, background: UE }, - { class: ".cursor-primary", foreground: xU, background: foe }, - { class: ".cursor-secondary", foreground: MU, background: boe } + { class: ".cursor", foreground: Cx, background: yJ }, + { class: ".cursor-primary", foreground: lQ, background: cle }, + { class: ".cursor-secondary", foreground: rQ, background: dle } ]; for (const i of t) { const n = s.getColor(i.foreground); if (n) { let o = s.getColor(i.background); - o || (o = n.opposite()), e.addRule(`.monaco-editor .cursors-layer ${i.class} { background-color: ${n}; border-color: ${n}; color: ${o}; }`), Ma(s.type) && e.addRule(`.monaco-editor .cursors-layer.has-selection ${i.class} { border-left: 1px solid ${o}; border-right: 1px solid ${o}; }`); + o || (o = n.opposite()), e.addRule(`.monaco-editor .cursors-layer ${i.class} { background-color: ${n}; border-color: ${n}; color: ${o}; }`), Rc(s.type) && e.addRule(`.monaco-editor .cursors-layer.has-selection ${i.class} { border-left: 1px solid ${o}; border-right: 1px solid ${o}; }`); } } }); -const UN = () => { +const aR = () => { throw new Error("Invalid change accessor"); }; -class ole extends wo { +class jre extends Go { constructor(e) { super(e); const t = this._context.configuration.options, i = t.get( @@ -29718,7 +29718,7 @@ class ole extends wo { this._lineHeight = t.get( 67 /* EditorOption.lineHeight */ - ), this._contentWidth = i.contentWidth, this._contentLeft = i.contentLeft, this.domNode = yt(document.createElement("div")), this.domNode.setClassName("view-zones"), this.domNode.setPosition("absolute"), this.domNode.setAttribute("role", "presentation"), this.domNode.setAttribute("aria-hidden", "true"), this.marginDomNode = yt(document.createElement("div")), this.marginDomNode.setClassName("margin-view-zones"), this.marginDomNode.setPosition("absolute"), this.marginDomNode.setAttribute("role", "presentation"), this.marginDomNode.setAttribute("aria-hidden", "true"), this._zones = {}; + ), this._contentWidth = i.contentWidth, this._contentLeft = i.contentLeft, this.domNode = ft(document.createElement("div")), this.domNode.setClassName("view-zones"), this.domNode.setPosition("absolute"), this.domNode.setAttribute("role", "presentation"), this.domNode.setAttribute("aria-hidden", "true"), this.marginDomNode = ft(document.createElement("div")), this.marginDomNode.setClassName("margin-view-zones"), this.marginDomNode.setPosition("absolute"), this.marginDomNode.setAttribute("role", "presentation"), this.marginDomNode.setAttribute("aria-hidden", "true"), this._zones = {}; } dispose() { super.dispose(), this._zones = {}; @@ -29731,11 +29731,11 @@ class ole extends wo { let i = !1; return this._context.viewModel.changeWhitespace((n) => { const o = Object.keys(this._zones); - for (let r = 0, l = o.length; r < l; r++) { - const a = o[r], c = this._zones[a], d = this._computeWhitespaceProps(c.delegate); - c.isInHiddenArea = d.isInHiddenArea; - const h = t.get(a); - h && (h.afterLineNumber !== d.afterViewLineNumber || h.height !== d.heightInPx) && (n.changeOneWhitespace(a, d.afterViewLineNumber, d.heightInPx), this._safeCallOnComputedHeight(c.delegate, d.heightInPx), i = !0); + for (let l = 0, r = o.length; l < r; l++) { + const c = o[l], d = this._zones[c], a = this._computeWhitespaceProps(d.delegate); + d.isInHiddenArea = a.isInHiddenArea; + const h = t.get(c); + h && (h.afterLineNumber !== a.afterViewLineNumber || h.height !== a.heightInPx) && (n.changeOneWhitespace(c, a.afterViewLineNumber, a.heightInPx), this._safeCallOnComputedHeight(d.delegate, a.heightInPx), i = !0); } }), i; } @@ -29786,11 +29786,11 @@ class ole extends wo { column: e.afterColumn }); else { - const r = this._context.viewModel.model.validatePosition({ + const l = this._context.viewModel.model.validatePosition({ lineNumber: e.afterLineNumber, column: 1 }).lineNumber; - t = new V(r, this._context.viewModel.model.getLineMaxColumn(r)); + t = new Y(l, this._context.viewModel.model.getLineMaxColumn(l)); } let i; t.column === this._context.viewModel.model.getLineMaxColumn(t.lineNumber) ? i = this._context.viewModel.model.validatePosition({ @@ -29820,7 +29820,7 @@ class ole extends wo { o && (t = this._layoutZone(i, o) || t); } }; - rle(e, n), n.addZone = UN, n.removeZone = UN, n.layoutZone = UN; + qre(e, n), n.addZone = aR, n.removeZone = aR, n.layoutZone = aR; }), t; } _addZone(e, t) { @@ -29829,8 +29829,8 @@ class ole extends wo { delegate: t, isInHiddenArea: i.isInHiddenArea, isVisible: !1, - domNode: yt(t.domNode), - marginDomNode: t.marginDomNode ? yt(t.marginDomNode) : null + domNode: ft(t.domNode), + marginDomNode: t.marginDomNode ? ft(t.marginDomNode) : null }; return this._safeCallOnComputedHeight(o.delegate, i.heightInPx), o.domNode.setPosition("absolute"), o.domNode.domNode.style.width = "100%", o.domNode.setDisplay("none"), o.domNode.setAttribute("monaco-view-zone", o.whitespaceId), this.domNode.appendChild(o.domNode), o.marginDomNode && (o.marginDomNode.setPosition("absolute"), o.marginDomNode.domNode.style.width = "100%", o.marginDomNode.setDisplay("none"), o.marginDomNode.setAttribute("monaco-view-zone", o.whitespaceId), this.marginDomNode.appendChild(o.marginDomNode)), this._zones[o.whitespaceId] = o, this.setShouldRender(), o.whitespaceId; } @@ -29862,7 +29862,7 @@ class ole extends wo { try { e.onComputedHeight(t); } catch (i) { - De(i); + Me(i); } } _safeCallOnDomNodeTop(e, t) { @@ -29870,7 +29870,7 @@ class ole extends wo { try { e.onDomNodeTop(t); } catch (i) { - De(i); + Me(i); } } prepareRender(e) { @@ -29878,34 +29878,34 @@ class ole extends wo { render(e) { const t = e.viewportData.whitespaceViewportData, i = {}; let n = !1; - for (const r of t) - this._zones[r.id].isInHiddenArea || (i[r.id] = r, n = !0); + for (const l of t) + this._zones[l.id].isInHiddenArea || (i[l.id] = l, n = !0); const o = Object.keys(this._zones); - for (let r = 0, l = o.length; r < l; r++) { - const a = o[r], c = this._zones[a]; - let d = 0, h = 0, u = "none"; - i.hasOwnProperty(a) ? (d = i[a].verticalOffset - e.bigNumbersDelta, h = i[a].height, u = "block", c.isVisible || (c.domNode.setAttribute("monaco-visible-view-zone", "true"), c.isVisible = !0), this._safeCallOnDomNodeTop(c.delegate, e.getScrolledTopFromAbsoluteTop(i[a].verticalOffset))) : (c.isVisible && (c.domNode.removeAttribute("monaco-visible-view-zone"), c.isVisible = !1), this._safeCallOnDomNodeTop(c.delegate, e.getScrolledTopFromAbsoluteTop(-1e6))), c.domNode.setTop(d), c.domNode.setHeight(h), c.domNode.setDisplay(u), c.marginDomNode && (c.marginDomNode.setTop(d), c.marginDomNode.setHeight(h), c.marginDomNode.setDisplay(u)); + for (let l = 0, r = o.length; l < r; l++) { + const c = o[l], d = this._zones[c]; + let a = 0, h = 0, u = "none"; + i.hasOwnProperty(c) ? (a = i[c].verticalOffset - e.bigNumbersDelta, h = i[c].height, u = "block", d.isVisible || (d.domNode.setAttribute("monaco-visible-view-zone", "true"), d.isVisible = !0), this._safeCallOnDomNodeTop(d.delegate, e.getScrolledTopFromAbsoluteTop(i[c].verticalOffset))) : (d.isVisible && (d.domNode.removeAttribute("monaco-visible-view-zone"), d.isVisible = !1), this._safeCallOnDomNodeTop(d.delegate, e.getScrolledTopFromAbsoluteTop(-1e6))), d.domNode.setTop(a), d.domNode.setHeight(h), d.domNode.setDisplay(u), d.marginDomNode && (d.marginDomNode.setTop(a), d.marginDomNode.setHeight(h), d.marginDomNode.setDisplay(u)); } n && (this.domNode.setWidth(Math.max(e.scrollWidth, this._contentWidth)), this.marginDomNode.setWidth(this._contentLeft)); } } -function rle(s, e) { +function qre(s, e) { try { return s(e); } catch (t) { - De(t); + Me(t); } } -class lle extends Xm { +class $re extends Kb { constructor(e) { - super(), this._context = e, this._options = new aY(this._context.configuration), this._selection = [], this._renderResult = null, this._context.addEventHandler(this); + super(), this._context = e, this._options = new MF(this._context.configuration), this._selection = [], this._renderResult = null, this._context.addEventHandler(this); } dispose() { this._context.removeEventHandler(this), this._renderResult = null, super.dispose(); } // --- begin event handlers onConfigurationChanged(e) { - const t = new aY(this._context.configuration); + const t = new MF(this._context.configuration); return this._options.equals(t) ? e.hasChanged( 146 /* EditorOption.layoutInfo */ @@ -29942,56 +29942,56 @@ class lle extends Xm { return; } const t = e.visibleRange.startLineNumber, n = e.visibleRange.endLineNumber - t + 1, o = new Array(n); - for (let l = 0; l < n; l++) - o[l] = !0; - const r = this._context.viewModel.getMinimapLinesRenderingData(e.viewportData.startLineNumber, e.viewportData.endLineNumber, o); + for (let r = 0; r < n; r++) + o[r] = !0; + const l = this._context.viewModel.getMinimapLinesRenderingData(e.viewportData.startLineNumber, e.viewportData.endLineNumber, o); this._renderResult = []; - for (let l = e.viewportData.startLineNumber; l <= e.viewportData.endLineNumber; l++) { - const a = l - e.viewportData.startLineNumber, c = r.data[a]; - let d = null; + for (let r = e.viewportData.startLineNumber; r <= e.viewportData.endLineNumber; r++) { + const c = r - e.viewportData.startLineNumber, d = l.data[c]; + let a = null; if (this._options.renderWhitespace === "selection") { const h = this._selection; for (const u of h) { - if (u.endLineNumber < l || u.startLineNumber > l) + if (u.endLineNumber < r || u.startLineNumber > r) continue; - const g = u.startLineNumber === l ? u.startColumn : c.minColumn, m = u.endLineNumber === l ? u.endColumn : c.maxColumn; - g < m && (d || (d = []), d.push(new gU(g - 1, m - 1))); + const m = u.startLineNumber === r ? u.startColumn : d.minColumn, b = u.endLineNumber === r ? u.endColumn : d.maxColumn; + m < b && (a || (a = []), a.push(new Q_(m - 1, b - 1))); } } - this._renderResult[a] = this._applyRenderWhitespace(e, l, d, c); + this._renderResult[c] = this._applyRenderWhitespace(e, r, a, d); } } _applyRenderWhitespace(e, t, i, n) { if (this._options.renderWhitespace === "selection" && !i || this._options.renderWhitespace === "trailing" && n.continuesWithWrappedLine) return ""; - const o = this._context.theme.getColor(KE), r = this._options.renderWithSVG, l = n.content, a = this._options.stopRenderingLineAfter === -1 ? l.length : Math.min(this._options.stopRenderingLineAfter, l.length), c = n.continuesWithWrappedLine, d = n.minColumn - 1, h = this._options.renderWhitespace === "boundary", u = this._options.renderWhitespace === "trailing", g = this._options.lineHeight, m = this._options.middotWidth, f = this._options.wsmiddotWidth, b = this._options.spaceWidth, y = Math.abs(f - b), w = Math.abs(m - b), C = y < w ? 11825 : 183, S = this._options.canUseHalfwidthRightwardsArrow; - let L = "", x = !1, Z = qn(l), _; - Z === -1 ? (x = !0, Z = a, _ = a) : _ = Ml(l); - let v = 0, P = i && i[v], E = 0; - for (let Y = d; Y < a; Y++) { - const B = l.charCodeAt(Y); - if (P && Y >= P.endOffset && (v++, P = i && i[v]), B !== 9 && B !== 32 || u && !x && Y <= _) + const o = this._context.theme.getColor(WJ), l = this._options.renderWithSVG, r = n.content, c = this._options.stopRenderingLineAfter === -1 ? r.length : Math.min(this._options.stopRenderingLineAfter, r.length), d = n.continuesWithWrappedLine, a = n.minColumn - 1, h = this._options.renderWhitespace === "boundary", u = this._options.renderWhitespace === "trailing", m = this._options.lineHeight, b = this._options.middotWidth, g = this._options.wsmiddotWidth, Z = this._options.spaceWidth, f = Math.abs(g - Z), y = Math.abs(b - Z), W = f < y ? 11825 : 183, G = this._options.canUseHalfwidthRightwardsArrow; + let X = "", L = !1, S = es(r), x; + S === -1 ? (L = !0, S = c, x = c) : x = Rr(r); + let w = 0, A = i && i[w], H = 0; + for (let F = a; F < c; F++) { + const K = r.charCodeAt(F); + if (A && F >= A.endOffset && (w++, A = i && i[w]), K !== 9 && K !== 32 || u && !L && F <= x) continue; - if (h && Y >= Z && Y <= _ && B === 32) { - const j = Y - 1 >= 0 ? l.charCodeAt(Y - 1) : 0, le = Y + 1 < a ? l.charCodeAt(Y + 1) : 0; - if (j !== 32 && le !== 32) + if (h && F >= S && F <= x && K === 32) { + const j = F - 1 >= 0 ? r.charCodeAt(F - 1) : 0, re = F + 1 < c ? r.charCodeAt(F + 1) : 0; + if (j !== 32 && re !== 32) continue; } - if (h && c && Y === a - 1) { - const j = Y - 1 >= 0 ? l.charCodeAt(Y - 1) : 0; - if (B === 32 && j !== 32 && j !== 9) + if (h && d && F === c - 1) { + const j = F - 1 >= 0 ? r.charCodeAt(F - 1) : 0; + if (K === 32 && j !== 32 && j !== 9) continue; } - if (i && (!P || P.startOffset > Y || P.endOffset <= Y)) + if (i && (!A || A.startOffset > F || A.endOffset <= F)) continue; - const X = e.visibleRangeForPosition(new V(t, Y + 1)); - X && (r ? (E = Math.max(E, X.left), B === 9 ? L += this._renderArrow(g, b, X.left) : L += ``) : B === 9 ? L += `
${S ? "→" : "→"}
` : L += `
${String.fromCharCode(C)}
`); + const E = e.visibleRangeForPosition(new Y(t, F + 1)); + E && (l ? (H = Math.max(H, E.left), K === 9 ? X += this._renderArrow(m, Z, E.left) : X += ``) : K === 9 ? X += `
${G ? "→" : "→"}
` : X += `
${String.fromCharCode(W)}
`); } - return r ? (E = Math.round(E + b), `` + L + "") : L; + return l ? (H = Math.round(H + Z), `` + X + "") : X; } _renderArrow(e, t, i) { - const n = t / 7, o = t, r = e / 2, l = i, a = { x: 0, y: n / 2 }, c = { x: 100 / 125 * o, y: a.y }, d = { x: c.x - 0.2 * c.x, y: c.y + 0.2 * c.x }, h = { x: d.x + 0.1 * c.x, y: d.y + 0.1 * c.x }, u = { x: h.x + 0.35 * c.x, y: h.y - 0.35 * c.x }, g = { x: u.x, y: -u.y }, m = { x: h.x, y: -h.y }, f = { x: d.x, y: -d.y }, b = { x: c.x, y: -c.y }, y = { x: a.x, y: -a.y }; - return ``; + const n = t / 7, o = t, l = e / 2, r = i, c = { x: 0, y: n / 2 }, d = { x: 100 / 125 * o, y: c.y }, a = { x: d.x - 0.2 * d.x, y: d.y + 0.2 * d.x }, h = { x: a.x + 0.1 * d.x, y: a.y + 0.1 * d.x }, u = { x: h.x + 0.35 * d.x, y: h.y - 0.35 * d.x }, m = { x: u.x, y: -u.y }, b = { x: h.x, y: -h.y }, g = { x: a.x, y: -a.y }, Z = { x: d.x, y: -d.y }, f = { x: c.x, y: -c.y }; + return ``; } render(e, t) { if (!this._renderResult) @@ -30000,7 +30000,7 @@ class lle extends Xm { return i < 0 || i >= this._renderResult.length ? "" : this._renderResult[i]; } } -class aY { +class MF { constructor(e) { const t = e.options, i = t.get( 50 @@ -30027,9 +30027,9 @@ class aY { return this.renderWhitespace === e.renderWhitespace && this.renderWithSVG === e.renderWithSVG && this.spaceWidth === e.spaceWidth && this.middotWidth === e.middotWidth && this.wsmiddotWidth === e.wsmiddotWidth && this.canUseHalfwidthRightwardsArrow === e.canUseHalfwidthRightwardsArrow && this.lineHeight === e.lineHeight && this.stopRenderingLineAfter === e.stopRenderingLineAfter; } } -class ale { +class ece { constructor(e, t, i, n) { - this.selections = e, this.startLineNumber = t.startLineNumber | 0, this.endLineNumber = t.endLineNumber | 0, this.relativeVerticalOffset = t.relativeVerticalOffset, this.bigNumbersDelta = t.bigNumbersDelta | 0, this.lineHeight = t.lineHeight | 0, this.whitespaceViewportData = i, this._model = n, this.visibleRange = new M(t.startLineNumber, this._model.getLineMinColumn(t.startLineNumber), t.endLineNumber, this._model.getLineMaxColumn(t.endLineNumber)); + this.selections = e, this.startLineNumber = t.startLineNumber | 0, this.endLineNumber = t.endLineNumber | 0, this.relativeVerticalOffset = t.relativeVerticalOffset, this.bigNumbersDelta = t.bigNumbersDelta | 0, this.lineHeight = t.lineHeight | 0, this.whitespaceViewportData = i, this._model = n, this.visibleRange = new I(t.startLineNumber, this._model.getLineMinColumn(t.startLineNumber), t.endLineNumber, this._model.getLineMaxColumn(t.endLineNumber)); } getViewLineRenderingData(e) { return this._model.getViewportViewLineRenderingData(this.visibleRange, e); @@ -30038,7 +30038,7 @@ class ale { return this._model.getDecorationsInViewport(this.visibleRange); } } -class cle { +class tce { get type() { return this._theme.type; } @@ -30055,9 +30055,9 @@ class cle { return this._theme.getColor(e); } } -class dle { +class ice { constructor(e, t, i) { - this.configuration = e, this.theme = new cle(t), this.viewModel = i, this.viewLayout = i.viewLayout; + this.configuration = e, this.theme = new tce(t), this.viewModel = i, this.viewLayout = i.viewLayout; } addEventHandler(e) { this.viewModel.addViewEventHandler(e); @@ -30066,57 +30066,57 @@ class dle { this.viewModel.removeViewEventHandler(e); } } -var hle = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var nce = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, ule = function(s, e) { +}, sce = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let xv = class extends yC { - constructor(e, t, i, n, o, r, l) { - super(), this._instantiationService = l, this._shouldRecomputeGlyphMarginLanes = !1, this._selections = [new fe(1, 1, 1, 1)], this._renderAnimationFrame = null; - const a = new are(t, n, o, e); - this._context = new dle(t, i, n), this._context.addEventHandler(this), this._viewParts = [], this._textAreaHandler = this._instantiationService.createInstance(yv, this._context, a, this._createTextAreaHandlerHelper()), this._viewParts.push(this._textAreaHandler), this._linesContent = yt(document.createElement("div")), this._linesContent.setClassName("lines-content monaco-editor-background"), this._linesContent.setPosition("absolute"), this.domNode = yt(document.createElement("div")), this.domNode.setClassName(this._getEditorClassName()), this.domNode.setAttribute("role", "code"), this._overflowGuardContainer = yt(document.createElement("div")), Tl.write( +let Uw = class extends wG { + constructor(e, t, i, n, o, l, r) { + super(), this._instantiationService = r, this._shouldRecomputeGlyphMarginLanes = !1, this._selections = [new ge(1, 1, 1, 1)], this._renderAnimationFrame = null; + const c = new ere(t, n, o, e); + this._context = new ice(t, i, n), this._context.addEventHandler(this), this._viewParts = [], this._textAreaHandler = this._instantiationService.createInstance(Ew, this._context, c, this._createTextAreaHandlerHelper()), this._viewParts.push(this._textAreaHandler), this._linesContent = ft(document.createElement("div")), this._linesContent.setClassName("lines-content monaco-editor-background"), this._linesContent.setPosition("absolute"), this.domNode = ft(document.createElement("div")), this.domNode.setClassName(this._getEditorClassName()), this.domNode.setAttribute("role", "code"), this._overflowGuardContainer = ft(document.createElement("div")), vr.write( this._overflowGuardContainer, 3 /* PartFingerprint.OverflowGuard */ - ), this._overflowGuardContainer.setClassName("overflow-guard"), this._scrollbar = new yre(this._context, this._linesContent, this.domNode, this._overflowGuardContainer), this._viewParts.push(this._scrollbar), this._viewLines = new Sv(this._context, this._linesContent), this._viewZones = new ole(this._context), this._viewParts.push(this._viewZones); - const c = new Qre(this._context); - this._viewParts.push(c); - const d = new ele(this._context); + ), this._overflowGuardContainer.setClassName("overflow-guard"), this._scrollbar = new are(this._context, this._linesContent, this.domNode, this._overflowGuardContainer), this._viewParts.push(this._scrollbar), this._viewLines = new zw(this._context, this._linesContent), this._viewZones = new jre(this._context), this._viewParts.push(this._viewZones); + const d = new zre(this._context); this._viewParts.push(d); - const h = new dre(this._context); - this._viewParts.push(h), h.addDynamicOverlay(new pre(this._context)), h.addDynamicOverlay(new Lv(this._context)), h.addDynamicOverlay(new kre(this._context)), h.addDynamicOverlay(new bre(this._context)), h.addDynamicOverlay(new lle(this._context)); - const u = new hre(this._context); - this._viewParts.push(u), u.addDynamicOverlay(new fre(this._context)), u.addDynamicOverlay(new Fre(this._context)), u.addDynamicOverlay(new Xre(this._context)), u.addDynamicOverlay(new TA(this._context)), this._glyphMarginWidgets = new xre(this._context), this._viewParts.push(this._glyphMarginWidgets); - const g = new DA(this._context); - g.getDomNode().appendChild(this._viewZones.marginDomNode), g.getDomNode().appendChild(u.getDomNode()), g.getDomNode().appendChild(this._glyphMarginWidgets.domNode), this._viewParts.push(g), this._contentWidgets = new gre(this._context, this.domNode), this._viewParts.push(this._contentWidgets), this._viewCursors = new Av(this._context), this._viewParts.push(this._viewCursors), this._overlayWidgets = new Ure(this._context, this.domNode), this._viewParts.push(this._overlayWidgets); - const m = new $re(this._context); - this._viewParts.push(m); - const f = new ure(this._context); - this._viewParts.push(f); - const b = new Jre(this._context); - if (this._viewParts.push(b), c) { - const y = this._scrollbar.getOverviewRulerLayoutInfo(); - y.parent.insertBefore(c.getDomNode(), y.insertBefore); - } - this._linesContent.appendChild(h.getDomNode()), this._linesContent.appendChild(m.domNode), this._linesContent.appendChild(this._viewZones.domNode), this._linesContent.appendChild(this._viewLines.getDomNode()), this._linesContent.appendChild(this._contentWidgets.domNode), this._linesContent.appendChild(this._viewCursors.getDomNode()), this._overflowGuardContainer.appendChild(g.getDomNode()), this._overflowGuardContainer.appendChild(this._scrollbar.getDomNode()), this._overflowGuardContainer.appendChild(d.getDomNode()), this._overflowGuardContainer.appendChild(this._textAreaHandler.textArea), this._overflowGuardContainer.appendChild(this._textAreaHandler.textAreaCover), this._overflowGuardContainer.appendChild(this._overlayWidgets.getDomNode()), this._overflowGuardContainer.appendChild(b.getDomNode()), this._overflowGuardContainer.appendChild(f.domNode), this.domNode.appendChild(this._overflowGuardContainer), r ? (r.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode.domNode), r.appendChild(this._overlayWidgets.overflowingOverlayWidgetsDomNode.domNode)) : (this.domNode.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode), this.domNode.appendChild(this._overlayWidgets.overflowingOverlayWidgetsDomNode)), this._applyLayout(), this._pointerHandler = this._register(new goe(this._context, a, this._createPointerHandlerHelper())); + const a = new Pre(this._context); + this._viewParts.push(a); + const h = new ire(this._context); + this._viewParts.push(h), h.addDynamicOverlay(new rre(this._context)), h.addDynamicOverlay(new Aw(this._context)), h.addDynamicOverlay(new xre(this._context)), h.addDynamicOverlay(new dre(this._context)), h.addDynamicOverlay(new $re(this._context)); + const u = new nre(this._context); + this._viewParts.push(u), u.addDynamicOverlay(new cre(this._context)), u.addDynamicOverlay(new Tre(this._context)), u.addDynamicOverlay(new wre(this._context)), u.addDynamicOverlay(new BV(this._context)), this._glyphMarginWidgets = new gre(this._context), this._viewParts.push(this._glyphMarginWidgets); + const m = new _V(this._context); + m.getDomNode().appendChild(this._viewZones.marginDomNode), m.getDomNode().appendChild(u.getDomNode()), m.getDomNode().appendChild(this._glyphMarginWidgets.domNode), this._viewParts.push(m), this._contentWidgets = new ore(this._context, this.domNode), this._viewParts.push(this._contentWidgets), this._viewCursors = new Kw(this._context), this._viewParts.push(this._viewCursors), this._overlayWidgets = new Dre(this._context, this.domNode), this._viewParts.push(this._overlayWidgets); + const b = new Ure(this._context); + this._viewParts.push(b); + const g = new sre(this._context); + this._viewParts.push(g); + const Z = new Ere(this._context); + if (this._viewParts.push(Z), d) { + const f = this._scrollbar.getOverviewRulerLayoutInfo(); + f.parent.insertBefore(d.getDomNode(), f.insertBefore); + } + this._linesContent.appendChild(h.getDomNode()), this._linesContent.appendChild(b.domNode), this._linesContent.appendChild(this._viewZones.domNode), this._linesContent.appendChild(this._viewLines.getDomNode()), this._linesContent.appendChild(this._contentWidgets.domNode), this._linesContent.appendChild(this._viewCursors.getDomNode()), this._overflowGuardContainer.appendChild(m.getDomNode()), this._overflowGuardContainer.appendChild(this._scrollbar.getDomNode()), this._overflowGuardContainer.appendChild(a.getDomNode()), this._overflowGuardContainer.appendChild(this._textAreaHandler.textArea), this._overflowGuardContainer.appendChild(this._textAreaHandler.textAreaCover), this._overflowGuardContainer.appendChild(this._overlayWidgets.getDomNode()), this._overflowGuardContainer.appendChild(Z.getDomNode()), this._overflowGuardContainer.appendChild(g.domNode), this.domNode.appendChild(this._overflowGuardContainer), l ? (l.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode.domNode), l.appendChild(this._overlayWidgets.overflowingOverlayWidgetsDomNode.domNode)) : (this.domNode.appendChild(this._contentWidgets.overflowingContentWidgetsDomNode), this.domNode.appendChild(this._overlayWidgets.overflowingOverlayWidgetsDomNode)), this._applyLayout(), this._pointerHandler = this._register(new ole(this._context, c, this._createPointerHandlerHelper())); } _computeGlyphMarginLanes() { const e = this._context.viewModel.model, t = this._context.viewModel.glyphLanes; let i = [], n = 0; i = i.concat(e.getAllMarginDecorations().map((o) => { - var l, a; - const r = ((l = o.options.glyphMargin) == null ? void 0 : l.position) ?? Jr.Center; - return n = Math.max(n, o.range.endLineNumber), { range: o.range, lane: r, persist: (a = o.options.glyphMargin) == null ? void 0 : a.persistLane }; + var r, c; + const l = ((r = o.options.glyphMargin) == null ? void 0 : r.position) ?? Ol.Center; + return n = Math.max(n, o.range.endLineNumber), { range: o.range, lane: l, persist: (c = o.options.glyphMargin) == null ? void 0 : c.persistLane }; })), i = i.concat(this._glyphMarginWidgets.getWidgets().map((o) => { - const r = e.validateRange(o.preference.range); - return n = Math.max(n, r.endLineNumber), { range: r, lane: o.preference.lane }; - })), i.sort((o, r) => M.compareRangesUsingStarts(o.range, r.range)), t.reset(n); + const l = e.validateRange(o.preference.range); + return n = Math.max(n, l.endLineNumber), { range: l, lane: o.preference.lane }; + })), i.sort((o, l) => I.compareRangesUsingStarts(o.range, l.range)), t.reset(n); for (const o of i) t.push(o.lane, o.range, o.persist); return t; @@ -30134,7 +30134,7 @@ let xv = class extends yC { }, getLastRenderData: () => { const e = this._viewCursors.getLastRenderData() || [], t = this._textAreaHandler.getLastRenderData(); - return new zse(e, t); + return new Yoe(e, t); }, renderNow: () => { this.render(!0, !1); @@ -30142,7 +30142,7 @@ let xv = class extends yC { shouldSuppressMouseDownOnViewZone: (e) => this._viewZones.shouldSuppressMouseDownOnViewZone(e), shouldSuppressMouseDownOnWidget: (e) => this._contentWidgets.shouldSuppressMouseDownOnWidget(e), getPositionFromDOMInfo: (e, t) => (this._flushAccumulatedAndRenderNow(), this._viewLines.getPositionFromDOMInfo(e, t)), - visibleRangeForPosition: (e, t) => (this._flushAccumulatedAndRenderNow(), this._viewLines.visibleRangeForPosition(new V(e, t))), + visibleRangeForPosition: (e, t) => (this._flushAccumulatedAndRenderNow(), this._viewLines.visibleRangeForPosition(new Y(e, t))), getLineWidth: (e) => (this._flushAccumulatedAndRenderNow(), this._viewLines.getLineWidth(e)) }; } @@ -30163,7 +30163,7 @@ let xv = class extends yC { return this._context.configuration.options.get( 143 /* EditorOption.editorClassName */ - ) + " " + gv(this._context.theme.type) + e; + ) + " " + Yw(this._context.theme.type) + e; } // --- begin event handlers handleEvents(e) { @@ -30194,14 +30194,14 @@ let xv = class extends yC { _scheduleRender() { var e; if (this._store.isDisposed) - throw new mt(); + throw new bt(); if (this._renderAnimationFrame === null) { const t = this._createCoordinatedRendering(); - this._renderAnimationFrame = Mv.INSTANCE.scheduleCoordinatedRendering({ - window: xe((e = this.domNode) == null ? void 0 : e.domNode), + this._renderAnimationFrame = Pw.INSTANCE.scheduleCoordinatedRendering({ + window: Le((e = this.domNode) == null ? void 0 : e.domNode), prepareRenderText: () => { if (this._store.isDisposed) - throw new mt(); + throw new bt(); try { return t.prepareRenderText(); } finally { @@ -30210,17 +30210,17 @@ let xv = class extends yC { }, renderText: () => { if (this._store.isDisposed) - throw new mt(); + throw new bt(); return t.renderText(); }, prepareRender: (i, n) => { if (this._store.isDisposed) - throw new mt(); + throw new bt(); return t.prepareRender(i, n); }, render: (i, n) => { if (this._store.isDisposed) - throw new mt(); + throw new bt(); return t.render(i, n); } }); @@ -30228,11 +30228,11 @@ let xv = class extends yC { } _flushAccumulatedAndRenderNow() { const e = this._createCoordinatedRendering(); - Pd(() => e.prepareRenderText()); - const t = Pd(() => e.renderText()); + Ba(() => e.prepareRenderText()); + const t = Ba(() => e.renderText()); if (t) { const [i, n] = t; - Pd(() => e.prepareRender(i, n)), Pd(() => e.render(i, n)); + Ba(() => e.prepareRender(i, n)), Ba(() => e.render(i, n)); } } _getViewPartsToRender() { @@ -30250,7 +30250,7 @@ let xv = class extends yC { const e = this._computeGlyphMarginLanes(); this._context.configuration.setGlyphMarginDecorationLaneCount(e.requiredLanes); } - Fd.onRenderStart(); + Ka.onRenderStart(); }, renderText: () => { if (!this.domNode.domNode.isConnected) @@ -30260,8 +30260,8 @@ let xv = class extends yC { return null; const t = this._context.viewLayout.getLinesViewportData(); this._context.viewModel.setViewport(t.startLineNumber, t.endLineNumber, t.centeredLineNumber); - const i = new ale(this._selections, t, this._context.viewLayout.getWhitespaceViewportData(), this._context.viewModel); - return this._contentWidgets.shouldRender() && this._contentWidgets.onBeforeRender(i), this._viewLines.shouldRender() && (this._viewLines.renderText(i), this._viewLines.onDidRender(), e = this._getViewPartsToRender()), [e, new Ase(this._context.viewLayout, i, this._viewLines)]; + const i = new ece(this._selections, t, this._context.viewLayout.getWhitespaceViewportData(), this._context.viewModel); + return this._contentWidgets.shouldRender() && this._contentWidgets.onBeforeRender(i), this._viewLines.shouldRender() && (this._viewLines.renderText(i), this._viewLines.onDidRender(), e = this._getViewPartsToRender()), [e, new poe(this._context.viewLayout, i, this._viewLines)]; }, prepareRender: (e, t) => { for (const i of e) @@ -30296,15 +30296,15 @@ let xv = class extends yC { column: t }), n = this._context.viewModel.coordinatesConverter.convertModelPositionToViewPosition(i); this._flushAccumulatedAndRenderNow(); - const o = this._viewLines.visibleRangeForPosition(new V(n.lineNumber, n.column)); + const o = this._viewLines.visibleRangeForPosition(new Y(n.lineNumber, n.column)); return o ? o.left : -1; } getTargetAtClientPoint(e, t) { const i = this._pointerHandler.getTargetAtClientPoint(e, t); - return i ? pI.convertViewToModelMouseTarget(i, this._context.viewModel.coordinatesConverter) : null; + return i ? Nx.convertViewToModelMouseTarget(i, this._context.viewModel.coordinatesConverter) : null; } createOverviewRuler(e) { - return new qre(this._context, e); + return new Kre(this._context, e); } change(e) { this._viewZones.changeViewZones(e), this._scheduleRender(); @@ -30359,17 +30359,17 @@ let xv = class extends yC { this._glyphMarginWidgets.removeWidget(e.widget), this._shouldRecomputeGlyphMarginLanes = !0, this._scheduleRender(); } }; -xv = hle([ - ule(6, Se) -], xv); -function Pd(s) { +Uw = nce([ + sce(6, Ge) +], Uw); +function Ba(s) { try { return s(); } catch (e) { - return De(e), null; + return Me(e), null; } } -const mZ = class mZ { +const R2 = class R2 { constructor() { this._coordinatedRenderings = [], this._animationFrameRunners = /* @__PURE__ */ new Map(); } @@ -30390,38 +30390,38 @@ const mZ = class mZ { const t = () => { this._animationFrameRunners.delete(e), this._onRenderScheduled(); }; - this._animationFrameRunners.set(e, aA(e, t, 100)); + this._animationFrameRunners.set(e, VV(e, t, 100)); } } _onRenderScheduled() { const e = this._coordinatedRenderings.slice(0); this._coordinatedRenderings = []; for (const i of e) - Pd(() => i.prepareRenderText()); + Ba(() => i.prepareRenderText()); const t = []; for (let i = 0, n = e.length; i < n; i++) { const o = e[i]; - t[i] = Pd(() => o.renderText()); + t[i] = Ba(() => o.renderText()); } for (let i = 0, n = e.length; i < n; i++) { - const o = e[i], r = t[i]; - if (!r) + const o = e[i], l = t[i]; + if (!l) continue; - const [l, a] = r; - Pd(() => o.prepareRender(l, a)); + const [r, c] = l; + Ba(() => o.prepareRender(r, c)); } for (let i = 0, n = e.length; i < n; i++) { - const o = e[i], r = t[i]; - if (!r) + const o = e[i], l = t[i]; + if (!l) continue; - const [l, a] = r; - Pd(() => o.render(l, a)); + const [r, c] = l; + Ba(() => o.render(r, c)); } } }; -mZ.INSTANCE = new mZ(); -let Mv = mZ; -class Gy { +R2.INSTANCE = new R2(); +let Pw = R2; +class Bf { constructor(e, t, i, n, o) { this.injectionOffsets = e, this.injectionOptions = t, this.breakOffsets = i, this.breakOffsetsVisibleColumn = n, this.wrappedTextIndentLength = o; } @@ -30455,26 +30455,26 @@ class Gy { return this.offsetInInputWithInjectionsToOutputPosition(i, t); } offsetInInputWithInjectionsToOutputPosition(e, t = 2) { - let i = 0, n = this.breakOffsets.length - 1, o = 0, r = 0; + let i = 0, n = this.breakOffsets.length - 1, o = 0, l = 0; for (; i <= n; ) { o = i + (n - i) / 2 | 0; - const a = this.breakOffsets[o]; - if (r = o > 0 ? this.breakOffsets[o - 1] : 0, t === 0) - if (e <= r) + const c = this.breakOffsets[o]; + if (l = o > 0 ? this.breakOffsets[o - 1] : 0, t === 0) + if (e <= l) n = o - 1; - else if (e > a) + else if (e > c) i = o + 1; else break; - else if (e < r) + else if (e < l) n = o - 1; - else if (e >= a) + else if (e >= c) i = o + 1; else break; } - let l = e - r; - return o > 0 && (l += this.wrappedTextIndentLength), new lS(o, l); + let r = e - l; + return o > 0 && (r += this.wrappedTextIndentLength), new W1(o, r); } normalizeOutputPosition(e, t, i) { if (this.injectionOffsets !== null) { @@ -30484,13 +30484,13 @@ class Gy { } if (i === 0) { if (e > 0 && t === this.getMinOutputOffset(e)) - return new lS(e - 1, this.getMaxOutputOffset(e - 1)); + return new W1(e - 1, this.getMaxOutputOffset(e - 1)); } else if (i === 1) { const n = this.getOutputLineCount() - 1; if (e < n && t === this.getMaxOutputOffset(e)) - return new lS(e + 1, this.getMinOutputOffset(e + 1)); + return new W1(e + 1, this.getMinOutputOffset(e + 1)); } - return new lS(e, t); + return new W1(e, t); } outputPositionToOffsetInInputWithInjections(e, t) { return e > 0 && (t = Math.max(0, t - this.wrappedTextIndentLength)), (e > 0 ? this.breakOffsets[e - 1] : 0) + t; @@ -30500,14 +30500,14 @@ class Gy { if (!i) return e; if (t === 2) { - if (e === i.offsetInInputWithInjections + i.length && cY(this.injectionOptions[i.injectedTextIndex].cursorStops)) + if (e === i.offsetInInputWithInjections + i.length && YF(this.injectionOptions[i.injectedTextIndex].cursorStops)) return i.offsetInInputWithInjections + i.length; { let n = i.offsetInInputWithInjections; - if (dY(this.injectionOptions[i.injectedTextIndex].cursorStops)) + if (kF(this.injectionOptions[i.injectedTextIndex].cursorStops)) return n; let o = i.injectedTextIndex - 1; - for (; o >= 0 && this.injectionOffsets[o] === this.injectionOffsets[i.injectedTextIndex] && !(cY(this.injectionOptions[o].cursorStops) || (n -= this.injectionOptions[o].content.length, dY(this.injectionOptions[o].cursorStops))); ) + for (; o >= 0 && this.injectionOffsets[o] === this.injectionOffsets[i.injectedTextIndex] && !(YF(this.injectionOptions[o].cursorStops) || (n -= this.injectionOptions[o].content.length, kF(this.injectionOptions[o].cursorStops))); ) o--; return n; } @@ -30522,7 +30522,7 @@ class Gy { n -= this.injectionOptions[o - 1].content.length, o--; return n; } - B_(); + ox(); } getInjectedText(e, t) { const i = this.outputPositionToOffsetInInputWithInjections(e, t), n = this.getInjectedTextAtOffset(i); @@ -30535,27 +30535,27 @@ class Gy { if (t !== null) { let n = 0; for (let o = 0; o < t.length; o++) { - const r = i[o].content.length, l = t[o] + n, a = t[o] + n + r; - if (l > e) + const l = i[o].content.length, r = t[o] + n, c = t[o] + n + l; + if (r > e) break; - if (e <= a) + if (e <= c) return { injectedTextIndex: o, - offsetInInputWithInjections: l, - length: r + offsetInInputWithInjections: r, + length: l }; - n += r; + n += l; } } } } -function cY(s) { - return s == null ? !0 : s === Xr.Right || s === Xr.Both; +function YF(s) { + return s == null ? !0 : s === zl.Right || s === zl.Both; } -function dY(s) { - return s == null ? !0 : s === Xr.Left || s === Xr.Both; +function kF(s) { + return s == null ? !0 : s === zl.Left || s === zl.Both; } -class lS { +class W1 { constructor(e, t) { this.outputLineIndex = e, this.outputOffset = t; } @@ -30563,15 +30563,15 @@ class lS { return `${this.outputLineIndex}:${this.outputOffset}`; } toPosition(e) { - return new V(e + this.outputLineIndex, this.outputOffset + 1); + return new Y(e + this.outputLineIndex, this.outputOffset + 1); } } -class gle { +class oce { constructor() { this.changeType = 1; } } -class Dl { +class Jr { static applyInjectedText(e, t) { if (!t || t.length === 0) return e; @@ -30583,34 +30583,34 @@ class Dl { static fromDecorations(e) { const t = []; for (const i of e) - i.options.before && i.options.before.content.length > 0 && t.push(new Dl(i.ownerId, i.range.startLineNumber, i.range.startColumn, i.options.before, 0)), i.options.after && i.options.after.content.length > 0 && t.push(new Dl(i.ownerId, i.range.endLineNumber, i.range.endColumn, i.options.after, 1)); + i.options.before && i.options.before.content.length > 0 && t.push(new Jr(i.ownerId, i.range.startLineNumber, i.range.startColumn, i.options.before, 0)), i.options.after && i.options.after.content.length > 0 && t.push(new Jr(i.ownerId, i.range.endLineNumber, i.range.endColumn, i.options.after, 1)); return t.sort((i, n) => i.lineNumber === n.lineNumber ? i.column === n.column ? i.order - n.order : i.column - n.column : i.lineNumber - n.lineNumber), t; } constructor(e, t, i, n, o) { this.ownerId = e, this.lineNumber = t, this.column = i, this.options = n, this.order = o; } } -class hY { +class vF { constructor(e, t, i) { this.changeType = 2, this.lineNumber = e, this.detail = t, this.injectedText = i; } } -class mle { +class lce { constructor(e, t) { this.changeType = 3, this.fromLineNumber = e, this.toLineNumber = t; } } -class ple { +class rce { constructor(e, t, i, n) { this.changeType = 4, this.injectedTexts = n, this.fromLineNumber = e, this.toLineNumber = t, this.detail = i; } } -class fle { +class cce { constructor() { this.changeType = 5; } } -class Wf { +class vg { constructor(e, t, i, n) { this.changes = e, this.versionId = t, this.isUndoing = i, this.isRedoing = n, this.resultingSelection = null; } @@ -30621,132 +30621,132 @@ class Wf { return !1; } static merge(e, t) { - const i = [].concat(e.changes).concat(t.changes), n = t.versionId, o = e.isUndoing || t.isUndoing, r = e.isRedoing || t.isRedoing; - return new Wf(i, n, o, r); + const i = [].concat(e.changes).concat(t.changes), n = t.versionId, o = e.isUndoing || t.isUndoing, l = e.isRedoing || t.isRedoing; + return new vg(i, n, o, l); } } -class OU { +class xQ { constructor(e) { this.changes = e; } } -class hg { +class gm { constructor(e, t) { this.rawContentChangedEvent = e, this.contentChangedEvent = t; } merge(e) { - const t = Wf.merge(this.rawContentChangedEvent, e.rawContentChangedEvent), i = hg._mergeChangeEvents(this.contentChangedEvent, e.contentChangedEvent); - return new hg(t, i); + const t = vg.merge(this.rawContentChangedEvent, e.rawContentChangedEvent), i = gm._mergeChangeEvents(this.contentChangedEvent, e.contentChangedEvent); + return new gm(t, i); } static _mergeChangeEvents(e, t) { - const i = [].concat(e.changes).concat(t.changes), n = t.eol, o = t.versionId, r = e.isUndoing || t.isUndoing, l = e.isRedoing || t.isRedoing, a = e.isFlush || t.isFlush, c = e.isEolChange && t.isEolChange; + const i = [].concat(e.changes).concat(t.changes), n = t.eol, o = t.versionId, l = e.isUndoing || t.isUndoing, r = e.isRedoing || t.isRedoing, c = e.isFlush || t.isFlush, d = e.isEolChange && t.isEolChange; return { changes: i, eol: n, - isEolChange: c, + isEolChange: d, versionId: o, - isUndoing: r, - isRedoing: l, - isFlush: a + isUndoing: l, + isRedoing: r, + isFlush: c }; } } -const KN = nd("domLineBreaksComputer", { createHTML: (s) => s }); -class eX { +const hR = ra("domLineBreaksComputer", { createHTML: (s) => s }); +class IJ { static create(e) { - return new eX(new WeakRef(e)); + return new IJ(new WeakRef(e)); } constructor(e) { this.targetWindow = e; } createLineBreaksComputer(e, t, i, n, o) { - const r = [], l = []; + const l = [], r = []; return { - addRequest: (a, c, d) => { - r.push(a), l.push(c); + addRequest: (c, d, a) => { + l.push(c), r.push(d); }, - finalize: () => ble(Ed(this.targetWindow.deref()), r, e, t, i, n, o, l) + finalize: () => dce(za(this.targetWindow.deref()), l, e, t, i, n, o, r) }; } } -function ble(s, e, t, i, n, o, r, l) { - function a(v) { - const P = l[v]; - if (P) { - const E = Dl.applyInjectedText(e[v], P), Y = P.map((X) => X.options), B = P.map((X) => X.column - 1); - return new Gy(B, Y, [E.length], [], 0); +function dce(s, e, t, i, n, o, l, r) { + function c(w) { + const A = r[w]; + if (A) { + const H = Jr.applyInjectedText(e[w], A), F = A.map((E) => E.options), K = A.map((E) => E.column - 1); + return new Bf(K, F, [H.length], [], 0); } else return null; } if (n === -1) { - const v = []; - for (let P = 0, E = e.length; P < E; P++) - v[P] = a(P); - return v; - } - const c = Math.round(n * t.typicalHalfwidthCharacterWidth), h = Math.round(i * (o === 3 ? 2 : o === 2 ? 1 : 0)), u = Math.ceil(t.spaceWidth * h), g = document.createElement("div"); - mn(g, t); - const m = new e0(1e4), f = [], b = [], y = [], w = [], C = []; - for (let v = 0; v < e.length; v++) { - const P = Dl.applyInjectedText(e[v], l[v]); - let E = 0, Y = 0, B = c; + const w = []; + for (let A = 0, H = e.length; A < H; A++) + w[A] = c(A); + return w; + } + const d = Math.round(n * t.typicalHalfwidthCharacterWidth), h = Math.round(i * (o === 3 ? 2 : o === 2 ? 1 : 0)), u = Math.ceil(t.spaceWidth * h), m = document.createElement("div"); + pn(m, t); + const b = new l0(1e4), g = [], Z = [], f = [], y = [], W = []; + for (let w = 0; w < e.length; w++) { + const A = Jr.applyInjectedText(e[w], r[w]); + let H = 0, F = 0, K = d; if (o !== 0) - if (E = qn(P), E === -1) - E = 0; + if (H = es(A), H === -1) + H = 0; else { - for (let ue = 0; ue < E; ue++) { - const be = P.charCodeAt(ue) === 9 ? i - Y % i : 1; - Y += be; + for (let ue = 0; ue < H; ue++) { + const Ze = A.charCodeAt(ue) === 9 ? i - F % i : 1; + F += Ze; } - const le = Math.ceil(t.spaceWidth * Y); - le + t.typicalFullwidthCharacterWidth > c ? (E = 0, Y = 0) : B = c - le; - } - const X = P.substr(E), j = yle(X, Y, i, B, m, u); - f[v] = E, b[v] = Y, y[v] = X, w[v] = j[0], C[v] = j[1]; - } - const S = m.build(), L = (KN == null ? void 0 : KN.createHTML(S)) ?? S; - g.innerHTML = L, g.style.position = "absolute", g.style.top = "10000", r === "keepAll" ? (g.style.wordBreak = "keep-all", g.style.overflowWrap = "anywhere") : (g.style.wordBreak = "inherit", g.style.overflowWrap = "break-word"), s.document.body.appendChild(g); - const x = document.createRange(), Z = Array.prototype.slice.call(g.children, 0), _ = []; - for (let v = 0; v < e.length; v++) { - const P = Z[v], E = wle(x, P, y[v], w[v]); - if (E === null) { - _[v] = a(v); + const re = Math.ceil(t.spaceWidth * F); + re + t.typicalFullwidthCharacterWidth > d ? (H = 0, F = 0) : K = d - re; + } + const E = A.substr(H), j = ace(E, F, i, K, b, u); + g[w] = H, Z[w] = F, f[w] = E, y[w] = j[0], W[w] = j[1]; + } + const G = b.build(), X = (hR == null ? void 0 : hR.createHTML(G)) ?? G; + m.innerHTML = X, m.style.position = "absolute", m.style.top = "10000", l === "keepAll" ? (m.style.wordBreak = "keep-all", m.style.overflowWrap = "anywhere") : (m.style.wordBreak = "inherit", m.style.overflowWrap = "break-word"), s.document.body.appendChild(m); + const L = document.createRange(), S = Array.prototype.slice.call(m.children, 0), x = []; + for (let w = 0; w < e.length; w++) { + const A = S[w], H = hce(L, A, f[w], y[w]); + if (H === null) { + x[w] = c(w); continue; } - const Y = f[v], B = b[v] + h, X = C[v], j = []; - for (let me = 0, Ve = E.length; me < Ve; me++) - j[me] = X[E[me]]; - if (Y !== 0) - for (let me = 0, Ve = E.length; me < Ve; me++) - E[me] += Y; - let le, ue; - const be = l[v]; - be ? (le = be.map((me) => me.options), ue = be.map((me) => me.column - 1)) : (le = null, ue = null), _[v] = new Gy(ue, le, E, j, B); + const F = g[w], K = Z[w] + h, E = W[w], j = []; + for (let be = 0, Ye = H.length; be < Ye; be++) + j[be] = E[H[be]]; + if (F !== 0) + for (let be = 0, Ye = H.length; be < Ye; be++) + H[be] += F; + let re, ue; + const Ze = r[w]; + Ze ? (re = Ze.map((be) => be.options), ue = Ze.map((be) => be.column - 1)) : (re = null, ue = null), x[w] = new Bf(ue, re, H, j, K); } - return g.remove(), _; + return m.remove(), x; } -function yle(s, e, t, i, n, o) { +function ace(s, e, t, i, n, o) { if (o !== 0) { const u = String(o); n.appendString('
'); - const r = s.length; - let l = e, a = 0; - const c = [], d = []; - let h = 0 < r ? s.charCodeAt(0) : 0; + const l = s.length; + let r = e, c = 0; + const d = [], a = []; + let h = 0 < l ? s.charCodeAt(0) : 0; n.appendString(""); - for (let u = 0; u < r; u++) { - u !== 0 && u % 16384 === 0 && n.appendString(""), c[u] = a, d[u] = l; - const g = h; - h = u + 1 < r ? s.charCodeAt(u + 1) : 0; - let m = 1, f = 1; - switch (g) { + for (let u = 0; u < l; u++) { + u !== 0 && u % 16384 === 0 && n.appendString(""), d[u] = c, a[u] = r; + const m = h; + h = u + 1 < l ? s.charCodeAt(u + 1) : 0; + let b = 1, g = 1; + switch (m) { case 9: - m = t - l % t, f = m; - for (let b = 1; b <= m; b++) - b < m ? n.appendCharCode(160) : n.appendASCIICharCode( + b = t - r % t, g = b; + for (let Z = 1; Z <= b; Z++) + Z < b ? n.appendCharCode(160) : n.appendASCIICharCode( 32 /* CharCode.Space */ ); @@ -30776,34 +30776,34 @@ function yle(s, e, t, i, n, o) { n.appendCharCode(65533); break; default: - Nh(g) && f++, g < 32 ? n.appendCharCode(9216 + g) : n.appendCharCode(g); + Mh(m) && g++, m < 32 ? n.appendCharCode(9216 + m) : n.appendCharCode(m); } - a += m, l += f; + c += b, r += g; } - return n.appendString(""), c[s.length] = a, d[s.length] = l, n.appendString("
"), [c, d]; + return n.appendString("
"), d[s.length] = c, a[s.length] = r, n.appendString(""), [d, a]; } -function wle(s, e, t, i) { +function hce(s, e, t, i) { if (t.length <= 1) return null; const n = Array.prototype.slice.call(e.children, 0), o = []; try { - Zv(s, n, i, 0, null, t.length - 1, null, o); - } catch (r) { - return console.log(r), null; + Bw(s, n, i, 0, null, t.length - 1, null, o); + } catch (l) { + return console.log(l), null; } return o.length === 0 ? null : (o.push(t.length), o); } -function Zv(s, e, t, i, n, o, r, l) { - if (i === o || (n = n || QN(s, e, t[i], t[i + 1]), r = r || QN(s, e, t[o], t[o + 1]), Math.abs(n[0].top - r[0].top) <= 0.1)) +function Bw(s, e, t, i, n, o, l, r) { + if (i === o || (n = n || uR(s, e, t[i], t[i + 1]), l = l || uR(s, e, t[o], t[o + 1]), Math.abs(n[0].top - l[0].top) <= 0.1)) return; if (i + 1 === o) { - l.push(o); + r.push(o); return; } - const a = i + (o - i) / 2 | 0, c = QN(s, e, t[a], t[a + 1]); - Zv(s, e, t, i, n, a, c, l), Zv(s, e, t, a, c, o, r, l); + const c = i + (o - i) / 2 | 0, d = uR(s, e, t[c], t[c + 1]); + Bw(s, e, t, i, n, c, d, r), Bw(s, e, t, c, d, o, l, r); } -function QN(s, e, t, i) { +function uR(s, e, t, i) { return s.setStart( e[t / 16384 | 0].firstChild, t % 16384 @@ -30814,9 +30814,9 @@ function QN(s, e, t, i) { /* Constants.SPAN_MODULO_LIMIT */ ), s.getClientRects(); } -class Cle extends R { +class uce extends J { constructor() { - super(), this._editor = null, this._instantiationService = null, this._instances = this._register(new QR()), this._pending = /* @__PURE__ */ new Map(), this._finishedInstantiation = [], this._finishedInstantiation[ + super(), this._editor = null, this._instantiationService = null, this._instances = this._register(new Gv()), this._pending = /* @__PURE__ */ new Map(), this._finishedInstantiation = [], this._finishedInstantiation[ 0 /* EditorContributionInstantiation.Eager */ ] = !1, this._finishedInstantiation[ @@ -30834,7 +30834,7 @@ class Cle extends R { this._editor = e, this._instantiationService = i; for (const n of t) { if (this._pending.has(n.id)) { - De(new Error(`Cannot have two contributions with the same id ${n.id}`)); + Me(new Error(`Cannot have two contributions with the same id ${n.id}`)); continue; } this._pending.set(n.id, n); @@ -30842,17 +30842,17 @@ class Cle extends R { this._instantiateSome( 0 /* EditorContributionInstantiation.Eager */ - ), this._register(ny(xe(this._editor.getDomNode()), () => { + ), this._register(mf(Le(this._editor.getDomNode()), () => { this._instantiateSome( 1 /* EditorContributionInstantiation.AfterFirstRender */ ); - })), this._register(ny(xe(this._editor.getDomNode()), () => { + })), this._register(mf(Le(this._editor.getDomNode()), () => { this._instantiateSome( 2 /* EditorContributionInstantiation.BeforeFirstInteraction */ ); - })), this._register(ny(xe(this._editor.getDomNode()), () => { + })), this._register(mf(Le(this._editor.getDomNode()), () => { this._instantiateSome( 3 /* EditorContributionInstantiation.Eventually */ @@ -30880,7 +30880,7 @@ class Cle extends R { } onAfterModelAttached() { var e; - return ny(xe((e = this._editor) == null ? void 0 : e.getDomNode()), () => { + return mf(Le((e = this._editor) == null ? void 0 : e.getDomNode()), () => { this._instantiateSome( 1 /* EditorContributionInstantiation.AfterFirstRender */ @@ -30910,14 +30910,14 @@ class Cle extends R { const i = this._instantiationService.createInstance(t.ctor, this._editor); this._instances.set(t.id, i), typeof i.restoreViewState == "function" && t.instantiation !== 0 && console.warn(`Editor contribution '${t.id}' should be eager instantiated because it uses saveViewState / restoreViewState.`); } catch (i) { - De(i); + Me(i); } } } } -class HU { - constructor(e, t, i, n, o, r, l) { - this.id = e, this.label = t, this.alias = i, this.metadata = n, this._precondition = o, this._run = r, this._contextKeyService = l; +class CQ { + constructor(e, t, i, n, o, l, r) { + this.id = e, this.label = t, this.alias = i, this.metadata = n, this._precondition = o, this._run = l, this._contextKeyService = r; } isSupported() { return this._contextKeyService.contextMatchesRules(this._precondition); @@ -30926,49 +30926,49 @@ class HU { return this.isSupported() ? this._run(e) : Promise.resolve(void 0); } } -const AC = { +const vG = { ICodeEditor: "vs.editor.ICodeEditor", IDiffEditor: "vs.editor.IDiffEditor" }; -function kh(s) { +function Eh(s) { let e = 0, t = 0, i = 0, n = 0; - for (let o = 0, r = s.length; o < r; o++) { - const l = s.charCodeAt(o); - l === 13 ? (e === 0 && (t = o), e++, o + 1 < r && s.charCodeAt(o + 1) === 10 ? (n |= 2, o++) : n |= 3, i = o + 1) : l === 10 && (n |= 1, e === 0 && (t = o), e++, i = o + 1); + for (let o = 0, l = s.length; o < l; o++) { + const r = s.charCodeAt(o); + r === 13 ? (e === 0 && (t = o), e++, o + 1 < l && s.charCodeAt(o + 1) === 10 ? (n |= 2, o++) : n |= 3, i = o + 1) : r === 10 && (n |= 1, e === 0 && (t = o), e++, i = o + 1); } return e === 0 && (t = s.length), [e, t, s.length - i, n]; } -class uY { +class JF { constructor(e, t, i, n) { this.range = e, this.nestingLevel = t, this.nestingLevelOfEqualBracketType = i, this.isInvalid = n; } } -class Sle { - constructor(e, t, i, n, o, r) { - this.range = e, this.openingBracketRange = t, this.closingBracketRange = i, this.nestingLevel = n, this.nestingLevelOfEqualBracketType = o, this.bracketPairNode = r; +class mce { + constructor(e, t, i, n, o, l) { + this.range = e, this.openingBracketRange = t, this.closingBracketRange = i, this.nestingLevel = n, this.nestingLevelOfEqualBracketType = o, this.bracketPairNode = l; } get openingBracketInfo() { return this.bracketPairNode.openingBracket.bracketInfo; } } -class Lle extends Sle { - constructor(e, t, i, n, o, r, l) { - super(e, t, i, n, o, r), this.minVisibleColumnIndentation = l; +class bce extends mce { + constructor(e, t, i, n, o, l, r) { + super(e, t, i, n, o, l), this.minVisibleColumnIndentation = r; } } -const Zd = class Zd { +const Na = class Na { static betweenPositions(e, t) { - return e.lineNumber === t.lineNumber ? new Zd(0, t.column - e.column) : new Zd(t.lineNumber - e.lineNumber, t.column - 1); + return e.lineNumber === t.lineNumber ? new Na(0, t.column - e.column) : new Na(t.lineNumber - e.lineNumber, t.column - 1); } static ofRange(e) { - return Zd.betweenPositions(e.getStartPosition(), e.getEndPosition()); + return Na.betweenPositions(e.getStartPosition(), e.getEndPosition()); } static ofText(e) { let t = 0, i = 0; for (const n of e) n === ` ` ? (t++, i = 0) : i++; - return new Zd(t, i); + return new Na(t, i); } constructor(e, t) { this.lineCount = e, this.columnCount = t; @@ -30977,96 +30977,96 @@ const Zd = class Zd { return this.lineCount !== e.lineCount ? this.lineCount > e.lineCount : this.columnCount >= e.columnCount; } createRange(e) { - return this.lineCount === 0 ? new M(e.lineNumber, e.column, e.lineNumber, e.column + this.columnCount) : new M(e.lineNumber, e.column, e.lineNumber + this.lineCount, this.columnCount + 1); + return this.lineCount === 0 ? new I(e.lineNumber, e.column, e.lineNumber, e.column + this.columnCount) : new I(e.lineNumber, e.column, e.lineNumber + this.lineCount, this.columnCount + 1); } addToPosition(e) { - return this.lineCount === 0 ? new V(e.lineNumber, e.column + this.columnCount) : new V(e.lineNumber + this.lineCount, this.columnCount + 1); + return this.lineCount === 0 ? new Y(e.lineNumber, e.column + this.columnCount) : new Y(e.lineNumber + this.lineCount, this.columnCount + 1); } toString() { return `${this.lineCount},${this.columnCount}`; } }; -Zd.zero = new Zd(0, 0); -let Ur = Zd; -function Ale(s, e, t, i) { - return s !== t ? Ni(t - s, i) : Ni(0, i - e); +Na.zero = new Na(0, 0); +let jl = Na; +function pce(s, e, t, i) { + return s !== t ? wi(t - s, i) : wi(0, i - e); } -const hs = 0; -function FA(s) { +const ms = 0; +function tL(s) { return s === 0; } -const Fo = 2 ** 26; -function Ni(s, e) { - return s * Fo + e; +const zo = 2 ** 26; +function wi(s, e) { + return s * zo + e; } -function gr(s) { - const e = s, t = Math.floor(e / Fo), i = e - t * Fo; - return new Ur(t, i); +function gl(s) { + const e = s, t = Math.floor(e / zo), i = e - t * zo; + return new jl(t, i); } -function xle(s) { - return Math.floor(s / Fo); +function gce(s) { + return Math.floor(s / zo); } -function ui(s, e) { +function mi(s, e) { let t = s + e; - return e >= Fo && (t = t - s % Fo), t; + return e >= zo && (t = t - s % zo), t; } -function Mle(s, e) { - return s.reduce((t, i) => ui(t, e(i)), hs); +function Zce(s, e) { + return s.reduce((t, i) => mi(t, e(i)), ms); } -function JU(s, e) { +function RQ(s, e) { return s === e; } -function l1(s, e) { +function yW(s, e) { const t = s, i = e; if (i - t <= 0) - return hs; - const o = Math.floor(t / Fo), r = Math.floor(i / Fo), l = i - r * Fo; - if (o === r) { - const a = t - o * Fo; - return Ni(0, l - a); + return ms; + const o = Math.floor(t / zo), l = Math.floor(i / zo), r = i - l * zo; + if (o === l) { + const c = t - o * zo; + return wi(0, r - c); } else - return Ni(r - o, l); + return wi(l - o, r); } -function vf(s, e) { +function Jg(s, e) { return s < e; } -function Tf(s, e) { +function Hg(s, e) { return s <= e; } -function ly(s, e) { +function Zf(s, e) { return s >= e; } -function Xp(s) { - return Ni(s.lineNumber - 1, s.column - 1); +function Up(s) { + return wi(s.lineNumber - 1, s.column - 1); } -function ug(s, e) { - const t = s, i = Math.floor(t / Fo), n = t - i * Fo, o = e, r = Math.floor(o / Fo), l = o - r * Fo; - return new M(i + 1, n + 1, r + 1, l + 1); +function Zm(s, e) { + const t = s, i = Math.floor(t / zo), n = t - i * zo, o = e, l = Math.floor(o / zo), r = o - l * zo; + return new I(i + 1, n + 1, l + 1, r + 1); } -function Zle(s) { - const e = Fa(s); - return Ni(e.length - 1, e[e.length - 1].length); +function fce(s) { + const e = Kc(s); + return wi(e.length - 1, e[e.length - 1].length); } -class Zc { +class Nd { static fromModelContentChanges(e) { return e.map((i) => { - const n = M.lift(i.range); - return new Zc(Xp(n.getStartPosition()), Xp(n.getEndPosition()), Zle(i.text)); + const n = I.lift(i.range); + return new Nd(Up(n.getStartPosition()), Up(n.getEndPosition()), fce(i.text)); }).reverse(); } constructor(e, t, i) { this.startOffset = e, this.endOffset = t, this.newLength = i; } toString() { - return `[${gr(this.startOffset)}...${gr(this.endOffset)}) -> ${gr(this.newLength)}`; + return `[${gl(this.startOffset)}...${gl(this.endOffset)}) -> ${gl(this.newLength)}`; } } -class _le { +class yce { /** * @param edits Must be sorted by offset in ascending order. */ constructor(e) { - this.nextEditIdx = 0, this.deltaOldToNewLineCount = 0, this.deltaOldToNewColumnCount = 0, this.deltaLineIdxInOld = -1, this.edits = e.map((t) => tX.from(t)); + this.nextEditIdx = 0, this.deltaOldToNewLineCount = 0, this.deltaOldToNewColumnCount = 0, this.deltaLineIdxInOld = -1, this.edits = e.map((t) => SJ.from(t)); } /** * @param offset Must be equal to or greater than the last offset this method has been called with. @@ -31081,44 +31081,44 @@ class _le { getDistanceToNextChange(e) { this.adjustNextEdit(e); const t = this.edits[this.nextEditIdx], i = t ? this.translateOldToCur(t.offsetObj) : null; - return i === null ? null : l1(e, i); + return i === null ? null : yW(e, i); } translateOldToCur(e) { - return e.lineCount === this.deltaLineIdxInOld ? Ni(e.lineCount + this.deltaOldToNewLineCount, e.columnCount + this.deltaOldToNewColumnCount) : Ni(e.lineCount + this.deltaOldToNewLineCount, e.columnCount); + return e.lineCount === this.deltaLineIdxInOld ? wi(e.lineCount + this.deltaOldToNewLineCount, e.columnCount + this.deltaOldToNewColumnCount) : wi(e.lineCount + this.deltaOldToNewLineCount, e.columnCount); } translateCurToOld(e) { - const t = gr(e); - return t.lineCount - this.deltaOldToNewLineCount === this.deltaLineIdxInOld ? Ni(t.lineCount - this.deltaOldToNewLineCount, t.columnCount - this.deltaOldToNewColumnCount) : Ni(t.lineCount - this.deltaOldToNewLineCount, t.columnCount); + const t = gl(e); + return t.lineCount - this.deltaOldToNewLineCount === this.deltaLineIdxInOld ? wi(t.lineCount - this.deltaOldToNewLineCount, t.columnCount - this.deltaOldToNewColumnCount) : wi(t.lineCount - this.deltaOldToNewLineCount, t.columnCount); } adjustNextEdit(e) { for (; this.nextEditIdx < this.edits.length; ) { const t = this.edits[this.nextEditIdx], i = this.translateOldToCur(t.endOffsetAfterObj); - if (Tf(i, e)) { + if (Hg(i, e)) { this.nextEditIdx++; - const n = gr(i), o = gr(this.translateOldToCur(t.endOffsetBeforeObj)), r = n.lineCount - o.lineCount; - this.deltaOldToNewLineCount += r; - const l = this.deltaLineIdxInOld === t.endOffsetBeforeObj.lineCount ? this.deltaOldToNewColumnCount : 0, a = n.columnCount - o.columnCount; - this.deltaOldToNewColumnCount = l + a, this.deltaLineIdxInOld = t.endOffsetBeforeObj.lineCount; + const n = gl(i), o = gl(this.translateOldToCur(t.endOffsetBeforeObj)), l = n.lineCount - o.lineCount; + this.deltaOldToNewLineCount += l; + const r = this.deltaLineIdxInOld === t.endOffsetBeforeObj.lineCount ? this.deltaOldToNewColumnCount : 0, c = n.columnCount - o.columnCount; + this.deltaOldToNewColumnCount = r + c, this.deltaLineIdxInOld = t.endOffsetBeforeObj.lineCount; } else break; } } } -class tX { +class SJ { static from(e) { - return new tX(e.startOffset, e.endOffset, e.newLength); + return new SJ(e.startOffset, e.endOffset, e.newLength); } constructor(e, t, i) { - this.endOffsetBeforeObj = gr(t), this.endOffsetAfterObj = gr(ui(e, i)), this.offsetObj = gr(e); + this.endOffsetBeforeObj = gl(t), this.endOffsetAfterObj = gl(mi(e, i)), this.offsetObj = gl(e); } } -const aS = [], tr = class tr { +const G1 = [], nl = class nl { static create(e, t) { if (e <= 128 && t.length === 0) { - let i = tr.cache[e]; - return i || (i = new tr(e, t), tr.cache[e] = i), i; + let i = nl.cache[e]; + return i || (i = new nl(e, t), nl.cache[e] = i), i; } - return new tr(e, t); + return new nl(e, t); } static getEmpty() { return this.empty; @@ -31130,25 +31130,25 @@ const aS = [], tr = class tr { const i = t.getKey(e); let n = i >> 5; if (n === 0) { - const r = 1 << i | this.items; - return r === this.items ? this : tr.create(r, this.additionalItems); + const l = 1 << i | this.items; + return l === this.items ? this : nl.create(l, this.additionalItems); } n--; const o = this.additionalItems.slice(0); for (; o.length < n; ) o.push(0); - return o[n] |= 1 << (i & 31), tr.create(this.items, o); + return o[n] |= 1 << (i & 31), nl.create(this.items, o); } merge(e) { const t = this.items | e.items; - if (this.additionalItems === aS && e.additionalItems === aS) - return t === this.items ? this : t === e.items ? e : tr.create(t, aS); + if (this.additionalItems === G1 && e.additionalItems === G1) + return t === this.items ? this : t === e.items ? e : nl.create(t, G1); const i = []; for (let n = 0; n < Math.max(this.additionalItems.length, e.additionalItems.length); n++) { - const o = this.additionalItems[n] || 0, r = e.additionalItems[n] || 0; - i.push(o | r); + const o = this.additionalItems[n] || 0, l = e.additionalItems[n] || 0; + i.push(o | l); } - return tr.create(t, i); + return nl.create(t, i); } intersects(e) { if (this.items & e.items) @@ -31159,14 +31159,14 @@ const aS = [], tr = class tr { return !1; } }; -tr.cache = new Array(129), tr.empty = tr.create(0, aS); -let so = tr; -const gY = { +nl.cache = new Array(129), nl.empty = nl.create(0, G1); +let lo = nl; +const HF = { getKey(s) { return s; } }; -class UU { +class NQ { constructor() { this.items = /* @__PURE__ */ new Map(); } @@ -31175,7 +31175,7 @@ class UU { return t === void 0 && (t = this.items.size, this.items.set(e, t)), t; } } -class iX { +class xJ { /** * The length of the entire node, which should equal the sum of lengths of all children. */ @@ -31186,10 +31186,10 @@ class iX { this._length = e; } } -class a1 extends iX { +class WW extends xJ { static create(e, t, i) { let n = e.length; - return t && (n = ui(n, t.length)), i && (n = ui(n, i.length)), new a1(n, e, t, i, t ? t.missingOpeningBracketIds : so.getEmpty()); + return t && (n = mi(n, t.length)), i && (n = mi(n, i.length)), new WW(n, e, t, i, t ? t.missingOpeningBracketIds : lo.getEmpty()); } get kind() { return 2; @@ -31225,29 +31225,29 @@ class a1 extends iX { return !(this.closingBracket === null || e.intersects(this.missingOpeningBracketIds)); } deepClone() { - return new a1(this.length, this.openingBracket.deepClone(), this.child && this.child.deepClone(), this.closingBracket && this.closingBracket.deepClone(), this.missingOpeningBracketIds); + return new WW(this.length, this.openingBracket.deepClone(), this.child && this.child.deepClone(), this.closingBracket && this.closingBracket.deepClone(), this.missingOpeningBracketIds); } computeMinIndentation(e, t) { - return this.child ? this.child.computeMinIndentation(ui(e, this.openingBracket.length), t) : Number.MAX_SAFE_INTEGER; + return this.child ? this.child.computeMinIndentation(mi(e, this.openingBracket.length), t) : Number.MAX_SAFE_INTEGER; } } -class Va extends iX { +class Hc extends xJ { /** * This method uses more memory-efficient list nodes that can only store 2 or 3 children. */ static create23(e, t, i, n = !1) { - let o = e.length, r = e.missingOpeningBracketIds; + let o = e.length, l = e.missingOpeningBracketIds; if (e.listHeight !== t.listHeight) throw new Error("Invalid list heights"); - if (o = ui(o, t.length), r = r.merge(t.missingOpeningBracketIds), i) { + if (o = mi(o, t.length), l = l.merge(t.missingOpeningBracketIds), i) { if (e.listHeight !== i.listHeight) throw new Error("Invalid list heights"); - o = ui(o, i.length), r = r.merge(i.missingOpeningBracketIds); + o = mi(o, i.length), l = l.merge(i.missingOpeningBracketIds); } - return n ? new Ile(o, e.listHeight + 1, e, t, i, r) : new c1(o, e.listHeight + 1, e, t, i, r); + return n ? new Wce(o, e.listHeight + 1, e, t, i, l) : new GW(o, e.listHeight + 1, e, t, i, l); } static getEmpty() { - return new Nle(hs, 0, [], so.getEmpty()); + return new Gce(ms, 0, [], lo.getEmpty()); } get kind() { return 4; @@ -31284,7 +31284,7 @@ class Va extends iX { for (; t.kind === 4; ) { const i = t.childrenLength; if (i === 0) - throw new mt(); + throw new bt(); t = t.getChild(i - 1); } return t.canBeReused(e); @@ -31295,7 +31295,7 @@ class Va extends iX { let t = this.getChild(0).length, i = this.getChild(0).missingOpeningBracketIds; for (let n = 1; n < e; n++) { const o = this.getChild(n); - t = ui(t, o.length), i = i.merge(o.missingOpeningBracketIds); + t = mi(t, o.length), i = i.merge(o.missingOpeningBracketIds); } this._length = t, this._missingOpeningBracketIds = i, this.cachedMinIndentation = -1; } @@ -31304,13 +31304,13 @@ class Va extends iX { return this.cachedMinIndentation; let i = Number.MAX_SAFE_INTEGER, n = e; for (let o = 0; o < this.childrenLength; o++) { - const r = this.getChild(o); - r && (i = Math.min(i, r.computeMinIndentation(n, t)), n = ui(n, r.length)); + const l = this.getChild(o); + l && (i = Math.min(i, l.computeMinIndentation(n, t)), n = mi(n, l.length)); } return this.cachedMinIndentation = i, i; } } -class c1 extends Va { +class GW extends Hc { get childrenLength() { return this._item3 !== null ? 3 : 2; } @@ -31351,11 +31351,11 @@ class c1 extends Va { get item3() { return this._item3; } - constructor(e, t, i, n, o, r) { - super(e, t, r), this._item1 = i, this._item2 = n, this._item3 = o; + constructor(e, t, i, n, o, l) { + super(e, t, l), this._item1 = i, this._item2 = n, this._item3 = o; } deepClone() { - return new c1(this.length, this.listHeight, this._item1.deepClone(), this._item2.deepClone(), this._item3 ? this._item3.deepClone() : null, this.missingOpeningBracketIds); + return new GW(this.length, this.listHeight, this._item1.deepClone(), this._item2.deepClone(), this._item3 ? this._item3.deepClone() : null, this.missingOpeningBracketIds); } appendChildOfSameHeight(e) { if (this._item3) @@ -31385,15 +31385,15 @@ class c1 extends Va { return this; } } -class Ile extends c1 { +class Wce extends GW { toMutable() { - return new c1(this.length, this.listHeight, this.item1, this.item2, this.item3, this.missingOpeningBracketIds); + return new GW(this.length, this.listHeight, this.item1, this.item2, this.item3, this.missingOpeningBracketIds); } throwIfImmutable() { throw new Error("this instance is immutable"); } } -class YA extends Va { +class iL extends Hc { get childrenLength() { return this._children.length; } @@ -31413,7 +31413,7 @@ class YA extends Va { const e = new Array(this._children.length); for (let t = 0; t < this._children.length; t++) e[t] = this._children[t].deepClone(); - return new YA(this.length, this.listHeight, e, this.missingOpeningBracketIds); + return new iL(this.length, this.listHeight, e, this.missingOpeningBracketIds); } appendChildOfSameHeight(e) { this.throwIfImmutable(), this._children.push(e), this.handleChildrenChanged(); @@ -31435,16 +31435,16 @@ class YA extends Va { return this; } } -class Nle extends YA { +class Gce extends iL { toMutable() { - return new YA(this.length, this.listHeight, [...this.children], this.missingOpeningBracketIds); + return new iL(this.length, this.listHeight, [...this.children], this.missingOpeningBracketIds); } throwIfImmutable() { throw new Error("this instance is immutable"); } } -const Wle = []; -class nX extends iX { +const Xce = []; +class CJ extends xJ { get listHeight() { return 0; } @@ -31455,44 +31455,44 @@ class nX extends iX { return null; } get children() { - return Wle; + return Xce; } deepClone() { return this; } } -class ku extends nX { +class Du extends CJ { get kind() { return 0; } get missingOpeningBracketIds() { - return so.getEmpty(); + return lo.getEmpty(); } canBeReused(e) { return !0; } computeMinIndentation(e, t) { - const i = gr(e), n = (i.columnCount === 0 ? i.lineCount : i.lineCount + 1) + 1, o = xle(ui(e, this.length)) + 1; - let r = Number.MAX_SAFE_INTEGER; - for (let l = n; l <= o; l++) { - const a = t.getLineFirstNonWhitespaceColumn(l), c = t.getLineContent(l); - if (a === 0) + const i = gl(e), n = (i.columnCount === 0 ? i.lineCount : i.lineCount + 1) + 1, o = gce(mi(e, this.length)) + 1; + let l = Number.MAX_SAFE_INTEGER; + for (let r = n; r <= o; r++) { + const c = t.getLineFirstNonWhitespaceColumn(r), d = t.getLineContent(r); + if (c === 0) continue; - const d = Yi.visibleColumnFromColumn(c, a, t.getOptions().tabSize); - r = Math.min(r, d); + const a = zi.visibleColumnFromColumn(d, c, t.getOptions().tabSize); + l = Math.min(l, a); } - return r; + return l; } } -class zA extends nX { +class nL extends CJ { static create(e, t, i) { - return new zA(e, t, i); + return new nL(e, t, i); } get kind() { return 1; } get missingOpeningBracketIds() { - return so.getEmpty(); + return lo.getEmpty(); } constructor(e, t, i) { super(e), this.bracketInfo = t, this.bracketIds = i; @@ -31510,7 +31510,7 @@ class zA extends nX { return Number.MAX_SAFE_INTEGER; } } -class vle extends nX { +class Vce extends CJ { get kind() { return 3; } @@ -31524,35 +31524,35 @@ class vle extends nX { return Number.MAX_SAFE_INTEGER; } } -let Dd = class { +let Ja = class { constructor(e, t, i, n, o) { this.length = e, this.kind = t, this.bracketId = i, this.bracketIds = n, this.astNode = o; } }; -class KU { +class wQ { constructor(e, t) { - this.textModel = e, this.bracketTokens = t, this.reader = new Tle(this.textModel, this.bracketTokens), this._offset = hs, this.didPeek = !1, this.peeked = null, this.textBufferLineCount = e.getLineCount(), this.textBufferLastLineLength = e.getLineLength(this.textBufferLineCount); + this.textModel = e, this.bracketTokens = t, this.reader = new Lce(this.textModel, this.bracketTokens), this._offset = ms, this.didPeek = !1, this.peeked = null, this.textBufferLineCount = e.getLineCount(), this.textBufferLastLineLength = e.getLineLength(this.textBufferLineCount); } get offset() { return this._offset; } get length() { - return Ni(this.textBufferLineCount - 1, this.textBufferLastLineLength); + return wi(this.textBufferLineCount - 1, this.textBufferLastLineLength); } skip(e) { - this.didPeek = !1, this._offset = ui(this._offset, e); - const t = gr(this._offset); + this.didPeek = !1, this._offset = mi(this._offset, e); + const t = gl(this._offset); this.reader.setPosition(t.lineCount, t.columnCount); } read() { let e; - return this.peeked ? (this.didPeek = !1, e = this.peeked) : e = this.reader.read(), e && (this._offset = ui(this._offset, e.length)), e; + return this.peeked ? (this.didPeek = !1, e = this.peeked) : e = this.reader.read(), e && (this._offset = mi(this._offset, e.length)), e; } peek() { return this.didPeek || (this.peeked = this.reader.read(), this.didPeek = !0), this.peeked; } } -class Tle { +class Lce { constructor(e, t) { this.textModel = e, this.bracketTokens = t, this.lineIdx = 0, this.line = null, this.lineCharOffset = 0, this.lineTokens = null, this.lineTokenOffset = 0, this.peekedToken = null, this.textBufferLineCount = e.getLineCount(), this.textBufferLastLineLength = e.getLineLength(this.textBufferLineCount); } @@ -31570,27 +31570,27 @@ class Tle { const e = this.lineIdx, t = this.lineCharOffset; let i = 0; for (; ; ) { - const o = this.lineTokens, r = o.getCount(); - let l = null; - if (this.lineTokenOffset < r) { - const a = o.getMetadata(this.lineTokenOffset); - for (; this.lineTokenOffset + 1 < r && a === o.getMetadata(this.lineTokenOffset + 1); ) + const o = this.lineTokens, l = o.getCount(); + let r = null; + if (this.lineTokenOffset < l) { + const c = o.getMetadata(this.lineTokenOffset); + for (; this.lineTokenOffset + 1 < l && c === o.getMetadata(this.lineTokenOffset + 1); ) this.lineTokenOffset++; - const c = bl.getTokenType(a) === 0, d = bl.containsBalancedBrackets(a), h = o.getEndOffset(this.lineTokenOffset); - if (d && c && this.lineCharOffset < h) { - const u = o.getLanguageId(this.lineTokenOffset), g = this.line.substring(this.lineCharOffset, h), m = this.bracketTokens.getSingleLanguageBracketTokens(u), f = m.regExpGlobal; - if (f) { - f.lastIndex = 0; - const b = f.exec(g); - b && (l = m.getToken(b[0]), l && (this.lineCharOffset += b.index)); + const d = Gr.getTokenType(c) === 0, a = Gr.containsBalancedBrackets(c), h = o.getEndOffset(this.lineTokenOffset); + if (a && d && this.lineCharOffset < h) { + const u = o.getLanguageId(this.lineTokenOffset), m = this.line.substring(this.lineCharOffset, h), b = this.bracketTokens.getSingleLanguageBracketTokens(u), g = b.regExpGlobal; + if (g) { + g.lastIndex = 0; + const Z = g.exec(m); + Z && (r = b.getToken(Z[0]), r && (this.lineCharOffset += Z.index)); } } - if (i += h - this.lineCharOffset, l) + if (i += h - this.lineCharOffset, r) if (e !== this.lineIdx || t !== this.lineCharOffset) { - this.peekedToken = l; + this.peekedToken = r; break; } else - return this.lineCharOffset += l.length, l; + return this.lineCharOffset += r.length, r; else this.lineTokenOffset++, this.lineCharOffset = h; } else if (this.lineIdx === this.textBufferLineCount - 1 || (this.lineIdx++, this.lineTokens = this.textModel.tokenization.getLineTokens(this.lineIdx + 1), this.lineTokenOffset = 0, this.line = this.lineTokens.getLineContent(), this.lineCharOffset = 0, i += 33, i > 1e3)) @@ -31598,59 +31598,59 @@ class Tle { if (i > 1500) break; } - const n = Ale(e, t, this.lineIdx, this.lineCharOffset); - return new Dd(n, 0, -1, so.getEmpty(), new ku(n)); + const n = pce(e, t, this.lineIdx, this.lineCharOffset); + return new Ja(n, 0, -1, lo.getEmpty(), new Du(n)); } } -class Dle { +class Ice { constructor(e, t) { - this.text = e, this._offset = hs, this.idx = 0; + this.text = e, this._offset = ms, this.idx = 0; const i = t.getRegExpStr(), n = i ? new RegExp(i + `| `, "gi") : null, o = []; - let r, l = 0, a = 0, c = 0, d = 0; + let l, r = 0, c = 0, d = 0, a = 0; const h = []; - for (let m = 0; m < 60; m++) - h.push(new Dd(Ni(0, m), 0, -1, so.getEmpty(), new ku(Ni(0, m)))); + for (let b = 0; b < 60; b++) + h.push(new Ja(wi(0, b), 0, -1, lo.getEmpty(), new Du(wi(0, b)))); const u = []; - for (let m = 0; m < 60; m++) - u.push(new Dd(Ni(1, m), 0, -1, so.getEmpty(), new ku(Ni(1, m)))); + for (let b = 0; b < 60; b++) + u.push(new Ja(wi(1, b), 0, -1, lo.getEmpty(), new Du(wi(1, b)))); if (n) - for (n.lastIndex = 0; (r = n.exec(e)) !== null; ) { - const m = r.index, f = r[0]; - if (f === ` + for (n.lastIndex = 0; (l = n.exec(e)) !== null; ) { + const b = l.index, g = l[0]; + if (g === ` `) - l++, a = m + 1; + r++, c = b + 1; else { - if (c !== m) { - let b; - if (d === l) { - const y = m - c; - if (y < h.length) - b = h[y]; + if (d !== b) { + let Z; + if (a === r) { + const f = b - d; + if (f < h.length) + Z = h[f]; else { - const w = Ni(0, y); - b = new Dd(w, 0, -1, so.getEmpty(), new ku(w)); + const y = wi(0, f); + Z = new Ja(y, 0, -1, lo.getEmpty(), new Du(y)); } } else { - const y = l - d, w = m - a; - if (y === 1 && w < u.length) - b = u[w]; + const f = r - a, y = b - c; + if (f === 1 && y < u.length) + Z = u[y]; else { - const C = Ni(y, w); - b = new Dd(C, 0, -1, so.getEmpty(), new ku(C)); + const W = wi(f, y); + Z = new Ja(W, 0, -1, lo.getEmpty(), new Du(W)); } } - o.push(b); + o.push(Z); } - o.push(t.getToken(f)), c = m + f.length, d = l; + o.push(t.getToken(g)), d = b + g.length, a = r; } } - const g = e.length; - if (c !== g) { - const m = d === l ? Ni(0, g - c) : Ni(l - d, g - a); - o.push(new Dd(m, 0, -1, so.getEmpty(), new ku(m))); + const m = e.length; + if (d !== m) { + const b = a === r ? wi(0, m - d) : wi(r - a, m - c); + o.push(new Ja(b, 0, -1, lo.getEmpty(), new Du(b))); } - this.length = Ni(l, g - a), this.tokens = o; + this.length = wi(r, m - c), this.tokens = o; } get offset() { return this._offset; @@ -31662,28 +31662,28 @@ class Dle { return this.tokens[this.idx] || null; } skip(e) { - throw new r6(); + throw new q6(); } } -class sX { +class RJ { static createFromLanguage(e, t) { function i(o) { return t.getKey(`${o.languageId}:::${o.bracketText}`); } const n = /* @__PURE__ */ new Map(); for (const o of e.bracketsNew.openingBrackets) { - const r = Ni(0, o.bracketText.length), l = i(o), a = so.getEmpty().add(l, gY); - n.set(o.bracketText, new Dd(r, 1, l, a, zA.create(r, o, a))); + const l = wi(0, o.bracketText.length), r = i(o), c = lo.getEmpty().add(r, HF); + n.set(o.bracketText, new Ja(l, 1, r, c, nL.create(l, o, c))); } for (const o of e.bracketsNew.closingBrackets) { - const r = Ni(0, o.bracketText.length); - let l = so.getEmpty(); - const a = o.getOpeningBrackets(); - for (const c of a) - l = l.add(i(c), gY); - n.set(o.bracketText, new Dd(r, 2, i(a[0]), l, zA.create(r, o, l))); + const l = wi(0, o.bracketText.length); + let r = lo.getEmpty(); + const c = o.getOpeningBrackets(); + for (const d of c) + r = r.add(i(d), HF); + n.set(o.bracketText, new Ja(l, 2, i(c[0]), r, nL.create(l, o, r))); } - return new sX(n); + return new RJ(n); } constructor(e) { this.map = e, this.hasRegExp = !1, this._regExpGlobal = null; @@ -31693,7 +31693,7 @@ class sX { return null; { const e = [...this.map.keys()]; - return e.sort(), e.reverse(), e.map((t) => Vle(t)).join("|"); + return e.sort(), e.reverse(), e.map((t) => Sce(t)).join("|"); } } /** @@ -31718,11 +31718,11 @@ class sX { return this.map.size === 0; } } -function Vle(s) { - let e = Po(s); +function Sce(s) { + let e = Uo(s); return /^[\w ]+/.test(s) && (e = `\\b${e}`), /[\w ]+$/.test(s) && (e = `${e}\\b`), e; } -class QU { +class TQ { constructor(e, t) { this.denseKeyProvider = e, this.getLanguageConfiguration = t, this.languageIdToBracketTokens = /* @__PURE__ */ new Map(); } @@ -31731,10 +31731,10 @@ class QU { } getSingleLanguageBracketTokens(e) { let t = this.languageIdToBracketTokens.get(e); - return t || (t = sX.createFromLanguage(this.getLanguageConfiguration(e), this.denseKeyProvider), this.languageIdToBracketTokens.set(e, t)), t; + return t || (t = RJ.createFromLanguage(this.getLanguageConfiguration(e), this.denseKeyProvider), this.languageIdToBracketTokens.set(e, t)), t; } } -function kle(s) { +function xce(s) { if (s.length === 0) return null; if (s.length === 1) @@ -31743,19 +31743,19 @@ function kle(s) { function t() { if (e >= s.length) return null; - const r = e, l = s[r].listHeight; - for (e++; e < s.length && s[e].listHeight === l; ) + const l = e, r = s[l].listHeight; + for (e++; e < s.length && s[e].listHeight === r; ) e++; - return e - r >= 2 ? jU(r === 0 && e === s.length ? s : s.slice(r, e), !1) : s[r]; + return e - l >= 2 ? MQ(l === 0 && e === s.length ? s : s.slice(l, e), !1) : s[l]; } let i = t(), n = t(); if (!n) return i; - for (let r = t(); r; r = t()) - mY(i, n) <= mY(n, r) ? (i = jN(i, n), n = r) : n = jN(n, r); - return jN(i, n); + for (let l = t(); l; l = t()) + EF(i, n) <= EF(n, l) ? (i = mR(i, n), n = l) : n = mR(n, l); + return mR(i, n); } -function jU(s, e = !1) { +function MQ(s, e = !1) { if (s.length === 0) return null; if (s.length === 1) @@ -31765,19 +31765,19 @@ function jU(s, e = !1) { const i = t >> 1; for (let n = 0; n < i; n++) { const o = n << 1; - s[n] = Va.create23(s[o], s[o + 1], o + 3 === t ? s[o + 2] : null, e); + s[n] = Hc.create23(s[o], s[o + 1], o + 3 === t ? s[o + 2] : null, e); } t = i; } - return Va.create23(s[0], s[1], t >= 3 ? s[2] : null, e); + return Hc.create23(s[0], s[1], t >= 3 ? s[2] : null, e); } -function mY(s, e) { +function EF(s, e) { return Math.abs(s.listHeight - e.listHeight); } -function jN(s, e) { - return s.listHeight === e.listHeight ? Va.create23(s, e, null, !1) : s.listHeight > e.listHeight ? Gle(s, e) : Rle(e, s); +function mR(s, e) { + return s.listHeight === e.listHeight ? Hc.create23(s, e, null, !1) : s.listHeight > e.listHeight ? Cce(s, e) : Rce(e, s); } -function Gle(s, e) { +function Cce(s, e) { s = s.toMutable(); let t = s; const i = []; @@ -31792,12 +31792,12 @@ function Gle(s, e) { i.push(t), t = t.makeLastElementMutable(); } for (let o = i.length - 1; o >= 0; o--) { - const r = i[o]; - n ? r.childrenLength >= 3 ? n = Va.create23(r.unappendChild(), n, null, !1) : (r.appendChildOfSameHeight(n), n = void 0) : r.handleChildrenChanged(); + const l = i[o]; + n ? l.childrenLength >= 3 ? n = Hc.create23(l.unappendChild(), n, null, !1) : (l.appendChildOfSameHeight(n), n = void 0) : l.handleChildrenChanged(); } - return n ? Va.create23(s, n, null, !1) : s; + return n ? Hc.create23(s, n, null, !1) : s; } -function Rle(s, e) { +function Rce(s, e) { s = s.toMutable(); let t = s; const i = []; @@ -31808,41 +31808,41 @@ function Rle(s, e) { } let n = e; for (let o = i.length - 1; o >= 0; o--) { - const r = i[o]; - n ? r.childrenLength >= 3 ? n = Va.create23(n, r.unprependChild(), null, !1) : (r.prependChildOfSameHeight(n), n = void 0) : r.handleChildrenChanged(); + const l = i[o]; + n ? l.childrenLength >= 3 ? n = Hc.create23(n, l.unprependChild(), null, !1) : (l.prependChildOfSameHeight(n), n = void 0) : l.handleChildrenChanged(); } - return n ? Va.create23(n, s, null, !1) : s; + return n ? Hc.create23(n, s, null, !1) : s; } -class Ele { +class Nce { constructor(e) { - this.lastOffset = hs, this.nextNodes = [e], this.offsets = [hs], this.idxs = []; + this.lastOffset = ms, this.nextNodes = [e], this.offsets = [ms], this.idxs = []; } /** * Returns the longest node at `offset` that satisfies the predicate. * @param offset must be greater than or equal to the last offset this method has been called with! */ readLongestNodeAt(e, t) { - if (vf(e, this.lastOffset)) + if (Jg(e, this.lastOffset)) throw new Error("Invalid offset"); for (this.lastOffset = e; ; ) { - const i = R0(this.nextNodes); + const i = K0(this.nextNodes); if (!i) return; - const n = R0(this.offsets); - if (vf(e, n)) + const n = K0(this.offsets); + if (Jg(e, n)) return; - if (vf(n, e)) - if (ui(n, i.length) <= e) + if (Jg(n, e)) + if (mi(n, i.length) <= e) this.nextNodeAfterCurrent(); else { - const o = qN(i); + const o = bR(i); o !== -1 ? (this.nextNodes.push(i.getChild(o)), this.offsets.push(n), this.idxs.push(o)) : this.nextNodeAfterCurrent(); } else { if (t(i)) return this.nextNodeAfterCurrent(), i; { - const o = qN(i); + const o = bR(i); if (o === -1) { this.nextNodeAfterCurrent(); return; @@ -31855,19 +31855,19 @@ class Ele { // Navigates to the longest node that continues after the current node. nextNodeAfterCurrent() { for (; ; ) { - const e = R0(this.offsets), t = R0(this.nextNodes); + const e = K0(this.offsets), t = K0(this.nextNodes); if (this.nextNodes.pop(), this.offsets.pop(), this.idxs.length === 0) break; - const i = R0(this.nextNodes), n = qN(i, this.idxs[this.idxs.length - 1]); + const i = K0(this.nextNodes), n = bR(i, this.idxs[this.idxs.length - 1]); if (n !== -1) { - this.nextNodes.push(i.getChild(n)), this.offsets.push(ui(e, t.length)), this.idxs[this.idxs.length - 1] = n; + this.nextNodes.push(i.getChild(n)), this.offsets.push(mi(e, t.length)), this.idxs[this.idxs.length - 1] = n; break; } else this.idxs.pop(); } } } -function qN(s, e = -1) { +function bR(s, e = -1) { for (; ; ) { if (e++, e >= s.childrenLength) return -1; @@ -31875,42 +31875,42 @@ function qN(s, e = -1) { return e; } } -function R0(s) { +function K0(s) { return s.length > 0 ? s[s.length - 1] : void 0; } -function _v(s, e, t, i) { - return new Xle(s, e, t, i).parseDocument(); +function _w(s, e, t, i) { + return new wce(s, e, t, i).parseDocument(); } -class Xle { +class wce { constructor(e, t, i, n) { if (this.tokenizer = e, this.createImmutableLists = n, this._itemsConstructed = 0, this._itemsFromCache = 0, i && n) throw new Error("Not supported"); - this.oldNodeReader = i ? new Ele(i) : void 0, this.positionMapper = new _le(t); + this.oldNodeReader = i ? new Nce(i) : void 0, this.positionMapper = new yce(t); } parseDocument() { this._itemsConstructed = 0, this._itemsFromCache = 0; - let e = this.parseList(so.getEmpty(), 0); - return e || (e = Va.getEmpty()), e; + let e = this.parseList(lo.getEmpty(), 0); + return e || (e = Hc.getEmpty()), e; } parseList(e, t) { const i = []; for (; ; ) { let o = this.tryReadChildFromCache(e); if (!o) { - const r = this.tokenizer.peek(); - if (!r || r.kind === 2 && r.bracketIds.intersects(e)) + const l = this.tokenizer.peek(); + if (!l || l.kind === 2 && l.bracketIds.intersects(e)) break; o = this.parseChild(e, t + 1); } o.kind === 4 && o.childrenLength === 0 || i.push(o); } - return this.oldNodeReader ? kle(i) : jU(i, this.createImmutableLists); + return this.oldNodeReader ? xce(i) : MQ(i, this.createImmutableLists); } tryReadChildFromCache(e) { if (this.oldNodeReader) { const t = this.positionMapper.getDistanceToNextChange(this.tokenizer.offset); - if (t === null || !FA(t)) { - const i = this.oldNodeReader.readLongestNodeAt(this.positionMapper.getOffsetBeforeChange(this.tokenizer.offset), (n) => t !== null && !vf(n.length, t) ? !1 : n.canBeReused(e)); + if (t === null || !tL(t)) { + const i = this.oldNodeReader.readLongestNodeAt(this.positionMapper.getOffsetBeforeChange(this.tokenizer.offset), (n) => t !== null && !Jg(n.length, t) ? !1 : n.canBeReused(e)); if (i) return this._itemsFromCache++, this.tokenizer.skip(i.length), i; } @@ -31921,101 +31921,101 @@ class Xle { const i = this.tokenizer.read(); switch (i.kind) { case 2: - return new vle(i.bracketIds, i.length); + return new Vce(i.bracketIds, i.length); case 0: return i.astNode; case 1: { if (t > 300) - return new ku(i.length); - const n = e.merge(i.bracketIds), o = this.parseList(n, t + 1), r = this.tokenizer.peek(); - return r && r.kind === 2 && (r.bracketId === i.bracketId || r.bracketIds.intersects(i.bracketIds)) ? (this.tokenizer.read(), a1.create(i.astNode, o, r.astNode)) : a1.create(i.astNode, o, null); + return new Du(i.length); + const n = e.merge(i.bracketIds), o = this.parseList(n, t + 1), l = this.tokenizer.peek(); + return l && l.kind === 2 && (l.bracketId === i.bracketId || l.bracketIds.intersects(i.bracketIds)) ? (this.tokenizer.read(), WW.create(i.astNode, o, l.astNode)) : WW.create(i.astNode, o, null); } default: throw new Error("unexpected"); } } } -function PA(s, e) { +function sL(s, e) { if (s.length === 0) return e; if (e.length === 0) return s; - const t = new Hc(pY(s)), i = pY(e); + const t = new Od(DF(s)), i = DF(e); i.push({ modified: !1, lengthBefore: void 0, lengthAfter: void 0 }); let n = t.dequeue(); - function o(c) { - if (c === void 0) { + function o(d) { + if (d === void 0) { const h = t.takeWhile((u) => !0) || []; return n && h.unshift(n), h; } - const d = []; - for (; n && !FA(c); ) { - const [h, u] = n.splitAt(c); - d.push(h), c = l1(h.lengthAfter, c), n = u ?? t.dequeue(); + const a = []; + for (; n && !tL(d); ) { + const [h, u] = n.splitAt(d); + a.push(h), d = yW(h.lengthAfter, d), n = u ?? t.dequeue(); } - return FA(c) || d.push(new Bd(!1, c, c)), d; + return tL(d) || a.push(new _a(!1, d, d)), a; } - const r = []; - function l(c, d, h) { - if (r.length > 0 && JU(r[r.length - 1].endOffset, c)) { - const u = r[r.length - 1]; - r[r.length - 1] = new Zc(u.startOffset, d, ui(u.newLength, h)); + const l = []; + function r(d, a, h) { + if (l.length > 0 && RQ(l[l.length - 1].endOffset, d)) { + const u = l[l.length - 1]; + l[l.length - 1] = new Nd(u.startOffset, a, mi(u.newLength, h)); } else - r.push({ startOffset: c, endOffset: d, newLength: h }); - } - let a = hs; - for (const c of i) { - const d = o(c.lengthBefore); - if (c.modified) { - const h = Mle(d, (g) => g.lengthBefore), u = ui(a, h); - l(a, u, c.lengthAfter), a = u; + l.push({ startOffset: d, endOffset: a, newLength: h }); + } + let c = ms; + for (const d of i) { + const a = o(d.lengthBefore); + if (d.modified) { + const h = Zce(a, (m) => m.lengthBefore), u = mi(c, h); + r(c, u, d.lengthAfter), c = u; } else - for (const h of d) { - const u = a; - a = ui(a, h.lengthBefore), h.modified && l(u, a, h.lengthAfter); + for (const h of a) { + const u = c; + c = mi(c, h.lengthBefore), h.modified && r(u, c, h.lengthAfter); } } - return r; + return l; } -class Bd { +class _a { constructor(e, t, i) { this.modified = e, this.lengthBefore = t, this.lengthAfter = i; } splitAt(e) { - const t = l1(e, this.lengthAfter); - return JU(t, hs) ? [this, void 0] : this.modified ? [ - new Bd(this.modified, this.lengthBefore, e), - new Bd(this.modified, hs, t) + const t = yW(e, this.lengthAfter); + return RQ(t, ms) ? [this, void 0] : this.modified ? [ + new _a(this.modified, this.lengthBefore, e), + new _a(this.modified, ms, t) ] : [ - new Bd(this.modified, e, e), - new Bd(this.modified, t, t) + new _a(this.modified, e, e), + new _a(this.modified, t, t) ]; } toString() { - return `${this.modified ? "M" : "U"}:${gr(this.lengthBefore)} -> ${gr(this.lengthAfter)}`; + return `${this.modified ? "M" : "U"}:${gl(this.lengthBefore)} -> ${gl(this.lengthAfter)}`; } } -function pY(s) { +function DF(s) { const e = []; - let t = hs; + let t = ms; for (const i of s) { - const n = l1(t, i.startOffset); - FA(n) || e.push(new Bd(!1, n, n)); - const o = l1(i.startOffset, i.endOffset); - e.push(new Bd(!0, o, i.newLength)), t = i.endOffset; + const n = yW(t, i.startOffset); + tL(n) || e.push(new _a(!1, n, n)); + const o = yW(i.startOffset, i.endOffset); + e.push(new _a(!0, o, i.newLength)), t = i.endOffset; } return e; } -class Fle extends R { +class Tce extends J { didLanguageChange(e) { return this.brackets.didLanguageChange(e); } constructor(e, t) { - if (super(), this.textModel = e, this.getLanguageConfiguration = t, this.didChangeEmitter = new k(), this.denseKeyProvider = new UU(), this.brackets = new QU(this.denseKeyProvider, this.getLanguageConfiguration), this.onDidChange = this.didChangeEmitter.event, this.queuedTextEditsForInitialAstWithoutTokens = [], this.queuedTextEdits = [], e.tokenization.hasTokens) + if (super(), this.textModel = e, this.getLanguageConfiguration = t, this.didChangeEmitter = new k(), this.denseKeyProvider = new NQ(), this.brackets = new TQ(this.denseKeyProvider, this.getLanguageConfiguration), this.onDidChange = this.didChangeEmitter.event, this.queuedTextEditsForInitialAstWithoutTokens = [], this.queuedTextEdits = [], e.tokenization.hasTokens) e.tokenization.backgroundTokenizationState === 2 ? (this.initialAstWithoutTokens = void 0, this.astWithTokens = this.parseDocumentFromTextBuffer([], void 0, !1)) : (this.initialAstWithoutTokens = this.parseDocumentFromTextBuffer([], void 0, !0), this.astWithTokens = this.initialAstWithoutTokens); else { - const i = this.brackets.getSingleLanguageBracketTokens(this.textModel.getLanguageId()), n = new Dle(this.textModel.getValue(), i); - this.initialAstWithoutTokens = _v(n, [], void 0, !0), this.astWithTokens = this.initialAstWithoutTokens; + const i = this.brackets.getSingleLanguageBracketTokens(this.textModel.getLanguageId()), n = new Ice(this.textModel.getValue(), i); + this.initialAstWithoutTokens = _w(n, [], void 0, !0), this.astWithTokens = this.initialAstWithoutTokens; } } //#region TextModel events @@ -32026,16 +32026,16 @@ class Fle extends R { } } handleDidChangeTokens({ ranges: e }) { - const t = e.map((i) => new Zc(Ni(i.fromLineNumber - 1, 0), Ni(i.toLineNumber, 0), Ni(i.toLineNumber - i.fromLineNumber + 1, 0))); + const t = e.map((i) => new Nd(wi(i.fromLineNumber - 1, 0), wi(i.toLineNumber, 0), wi(i.toLineNumber - i.fromLineNumber + 1, 0))); this.handleEdits(t, !0), this.initialAstWithoutTokens || this.didChangeEmitter.fire(); } handleContentChanged(e) { - const t = Zc.fromModelContentChanges(e.changes); + const t = Nd.fromModelContentChanges(e.changes); this.handleEdits(t, !1); } handleEdits(e, t) { - const i = PA(this.queuedTextEdits, e); - this.queuedTextEdits = i, this.initialAstWithoutTokens && !t && (this.queuedTextEditsForInitialAstWithoutTokens = PA(this.queuedTextEditsForInitialAstWithoutTokens, e)); + const i = sL(this.queuedTextEdits, e); + this.queuedTextEdits = i, this.initialAstWithoutTokens && !t && (this.queuedTextEditsForInitialAstWithoutTokens = sL(this.queuedTextEditsForInitialAstWithoutTokens, e)); } //#endregion flushQueue() { @@ -32045,47 +32045,47 @@ class Fle extends R { * @pure (only if isPure = true) */ parseDocumentFromTextBuffer(e, t, i) { - const n = t, o = new KU(this.textModel, this.brackets); - return _v(o, e, n, i); + const n = t, o = new wQ(this.textModel, this.brackets); + return _w(o, e, n, i); } getBracketsInRange(e, t) { this.flushQueue(); - const i = Ni(e.startLineNumber - 1, e.startColumn - 1), n = Ni(e.endLineNumber - 1, e.endColumn - 1); - return new lg((o) => { - const r = this.initialAstWithoutTokens || this.astWithTokens; - Iv(r, hs, r.length, i, n, o, 0, 0, /* @__PURE__ */ new Map(), t); + const i = wi(e.startLineNumber - 1, e.startColumn - 1), n = wi(e.endLineNumber - 1, e.endColumn - 1); + return new um((o) => { + const l = this.initialAstWithoutTokens || this.astWithTokens; + Qw(l, ms, l.length, i, n, o, 0, 0, /* @__PURE__ */ new Map(), t); }); } getBracketPairsInRange(e, t) { this.flushQueue(); - const i = Xp(e.getStartPosition()), n = Xp(e.getEndPosition()); - return new lg((o) => { - const r = this.initialAstWithoutTokens || this.astWithTokens, l = new Yle(o, t, this.textModel); - Nv(r, hs, r.length, i, n, l, 0, /* @__PURE__ */ new Map()); + const i = Up(e.getStartPosition()), n = Up(e.getEndPosition()); + return new um((o) => { + const l = this.initialAstWithoutTokens || this.astWithTokens, r = new Mce(o, t, this.textModel); + Ow(l, ms, l.length, i, n, r, 0, /* @__PURE__ */ new Map()); }); } getFirstBracketAfter(e) { this.flushQueue(); const t = this.initialAstWithoutTokens || this.astWithTokens; - return $U(t, hs, t.length, Xp(e)); + return kQ(t, ms, t.length, Up(e)); } getFirstBracketBefore(e) { this.flushQueue(); const t = this.initialAstWithoutTokens || this.astWithTokens; - return qU(t, hs, t.length, Xp(e)); + return YQ(t, ms, t.length, Up(e)); } } -function qU(s, e, t, i) { +function YQ(s, e, t, i) { if (s.kind === 4 || s.kind === 2) { const n = []; for (const o of s.children) - t = ui(e, o.length), n.push({ nodeOffsetStart: e, nodeOffsetEnd: t }), e = t; + t = mi(e, o.length), n.push({ nodeOffsetStart: e, nodeOffsetEnd: t }), e = t; for (let o = n.length - 1; o >= 0; o--) { - const { nodeOffsetStart: r, nodeOffsetEnd: l } = n[o]; - if (vf(r, i)) { - const a = qU(s.children[o], r, l, i); - if (a) - return a; + const { nodeOffsetStart: l, nodeOffsetEnd: r } = n[o]; + if (Jg(l, i)) { + const c = YQ(s.children[o], l, r, i); + if (c) + return c; } } return null; @@ -32093,7 +32093,7 @@ function qU(s, e, t, i) { if (s.kind === 3) return null; if (s.kind === 1) { - const n = ug(e, t); + const n = Zm(e, t); return { bracketInfo: s.bracketInfo, range: n @@ -32102,11 +32102,11 @@ function qU(s, e, t, i) { } return null; } -function $U(s, e, t, i) { +function kQ(s, e, t, i) { if (s.kind === 4 || s.kind === 2) { for (const n of s.children) { - if (t = ui(e, n.length), vf(i, t)) { - const o = $U(n, e, t, i); + if (t = mi(e, n.length), Jg(i, t)) { + const o = kQ(n, e, t, i); if (o) return o; } @@ -32117,7 +32117,7 @@ function $U(s, e, t, i) { if (s.kind === 3) return null; if (s.kind === 1) { - const n = ug(e, t); + const n = Zm(e, t); return { bracketInfo: s.bracketInfo, range: n @@ -32126,22 +32126,22 @@ function $U(s, e, t, i) { } return null; } -function Iv(s, e, t, i, n, o, r, l, a, c, d = !1) { - if (r > 200) +function Qw(s, e, t, i, n, o, l, r, c, d, a = !1) { + if (l > 200) return !0; e: for (; ; ) switch (s.kind) { case 4: { const h = s.childrenLength; for (let u = 0; u < h; u++) { - const g = s.getChild(u); - if (g) { - if (t = ui(e, g.length), Tf(e, n) && ly(t, i)) { - if (ly(t, n)) { - s = g; + const m = s.getChild(u); + if (m) { + if (t = mi(e, m.length), Hg(e, n) && Zf(t, i)) { + if (Zf(t, n)) { + s = m; continue e; } - if (!Iv(g, e, t, i, n, o, r, 0, a, c)) + if (!Qw(m, e, t, i, n, o, l, 0, c, d)) return !1; } e = t; @@ -32150,81 +32150,81 @@ function Iv(s, e, t, i, n, o, r, l, a, c, d = !1) { return !0; } case 2: { - const h = !c || !s.closingBracket || s.closingBracket.bracketInfo.closesColorized(s.openingBracket.bracketInfo); + const h = !d || !s.closingBracket || s.closingBracket.bracketInfo.closesColorized(s.openingBracket.bracketInfo); let u = 0; - if (a) { - let m = a.get(s.openingBracket.text); - m === void 0 && (m = 0), u = m, h && (m++, a.set(s.openingBracket.text, m)); + if (c) { + let b = c.get(s.openingBracket.text); + b === void 0 && (b = 0), u = b, h && (b++, c.set(s.openingBracket.text, b)); } - const g = s.childrenLength; - for (let m = 0; m < g; m++) { - const f = s.getChild(m); - if (f) { - if (t = ui(e, f.length), Tf(e, n) && ly(t, i)) { - if (ly(t, n) && f.kind !== 1) { - s = f, h ? (r++, l = u + 1) : l = u; + const m = s.childrenLength; + for (let b = 0; b < m; b++) { + const g = s.getChild(b); + if (g) { + if (t = mi(e, g.length), Hg(e, n) && Zf(t, i)) { + if (Zf(t, n) && g.kind !== 1) { + s = g, h ? (l++, r = u + 1) : r = u; continue e; } - if ((h || f.kind !== 1 || !s.closingBracket) && !Iv(f, e, t, i, n, o, h ? r + 1 : r, h ? u + 1 : u, a, c, !s.closingBracket)) + if ((h || g.kind !== 1 || !s.closingBracket) && !Qw(g, e, t, i, n, o, h ? l + 1 : l, h ? u + 1 : u, c, d, !s.closingBracket)) return !1; } e = t; } } - return a == null || a.set(s.openingBracket.text, u), !0; + return c == null || c.set(s.openingBracket.text, u), !0; } case 3: { - const h = ug(e, t); - return o(new uY(h, r - 1, 0, !0)); + const h = Zm(e, t); + return o(new JF(h, l - 1, 0, !0)); } case 1: { - const h = ug(e, t); - return o(new uY(h, r - 1, l - 1, d)); + const h = Zm(e, t); + return o(new JF(h, l - 1, r - 1, a)); } case 0: return !0; } } -class Yle { +class Mce { constructor(e, t, i) { this.push = e, this.includeMinIndentation = t, this.textModel = i; } } -function Nv(s, e, t, i, n, o, r, l) { - var c; - if (r > 200) +function Ow(s, e, t, i, n, o, l, r) { + var d; + if (l > 200) return !0; - let a = !0; + let c = !0; if (s.kind === 2) { - let d = 0; - if (l) { - let g = l.get(s.openingBracket.text); - g === void 0 && (g = 0), d = g, g++, l.set(s.openingBracket.text, g); + let a = 0; + if (r) { + let m = r.get(s.openingBracket.text); + m === void 0 && (m = 0), a = m, m++, r.set(s.openingBracket.text, m); } - const h = ui(e, s.openingBracket.length); + const h = mi(e, s.openingBracket.length); let u = -1; - if (o.includeMinIndentation && (u = s.computeMinIndentation(e, o.textModel)), a = o.push(new Lle(ug(e, t), ug(e, h), s.closingBracket ? ug(ui(h, ((c = s.child) == null ? void 0 : c.length) || hs), t) : void 0, r, d, s, u)), e = h, a && s.child) { - const g = s.child; - if (t = ui(e, g.length), Tf(e, n) && ly(t, i) && (a = Nv(g, e, t, i, n, o, r + 1, l), !a)) + if (o.includeMinIndentation && (u = s.computeMinIndentation(e, o.textModel)), c = o.push(new bce(Zm(e, t), Zm(e, h), s.closingBracket ? Zm(mi(h, ((d = s.child) == null ? void 0 : d.length) || ms), t) : void 0, l, a, s, u)), e = h, c && s.child) { + const m = s.child; + if (t = mi(e, m.length), Hg(e, n) && Zf(t, i) && (c = Ow(m, e, t, i, n, o, l + 1, r), !c)) return !1; } - l == null || l.set(s.openingBracket.text, d); + r == null || r.set(s.openingBracket.text, a); } else { - let d = e; + let a = e; for (const h of s.children) { - const u = d; - if (d = ui(d, h.length), Tf(u, n) && Tf(i, d) && (a = Nv(h, u, d, i, n, o, r, l), !a)) + const u = a; + if (a = mi(a, h.length), Hg(u, n) && Hg(i, a) && (c = Ow(h, u, a, i, n, o, l, r), !c)) return !1; } } - return a; + return c; } -class zle extends R { +class Yce extends J { get canBuildAST() { return this.textModel.getValueLength() <= 5e6; } constructor(e, t) { - super(), this.textModel = e, this.languageConfigurationService = t, this.bracketPairsTree = this._register(new fn()), this.onDidChangeEmitter = new k(), this.onDidChange = this.onDidChangeEmitter.event, this.bracketsRequested = !1; + super(), this.textModel = e, this.languageConfigurationService = t, this.bracketPairsTree = this._register(new Zn()), this.onDidChangeEmitter = new k(), this.onDidChange = this.onDidChangeEmitter.event, this.bracketsRequested = !1; } //#region TextModel events handleLanguageConfigurationServiceChange(e) { @@ -32253,8 +32253,8 @@ class zle extends R { updateBracketPairsTree() { if (this.bracketsRequested && this.canBuildAST) { if (!this.bracketPairsTree.value) { - const e = new U(); - this.bracketPairsTree.value = Ple(e.add(new Fle(this.textModel, (t) => this.languageConfigurationService.getLanguageConfiguration(t))), e), e.add(this.bracketPairsTree.value.object.onDidChange((t) => this.onDidChangeEmitter.fire(t))), this.onDidChangeEmitter.fire(); + const e = new _(); + this.bracketPairsTree.value = kce(e.add(new Tce(this.textModel, (t) => this.languageConfigurationService.getLanguageConfiguration(t))), e), e.add(this.bracketPairsTree.value.object.onDidChange((t) => this.onDidChangeEmitter.fire(t))), this.onDidChangeEmitter.fire(); } } else this.bracketPairsTree.value && (this.bracketPairsTree.clear(), this.onDidChangeEmitter.fire()); @@ -32265,97 +32265,97 @@ class zle extends R { */ getBracketPairsInRange(e) { var t; - return this.bracketsRequested = !0, this.updateBracketPairsTree(), ((t = this.bracketPairsTree.value) == null ? void 0 : t.object.getBracketPairsInRange(e, !1)) || lg.empty; + return this.bracketsRequested = !0, this.updateBracketPairsTree(), ((t = this.bracketPairsTree.value) == null ? void 0 : t.object.getBracketPairsInRange(e, !1)) || um.empty; } getBracketPairsInRangeWithMinIndentation(e) { var t; - return this.bracketsRequested = !0, this.updateBracketPairsTree(), ((t = this.bracketPairsTree.value) == null ? void 0 : t.object.getBracketPairsInRange(e, !0)) || lg.empty; + return this.bracketsRequested = !0, this.updateBracketPairsTree(), ((t = this.bracketPairsTree.value) == null ? void 0 : t.object.getBracketPairsInRange(e, !0)) || um.empty; } getBracketsInRange(e, t = !1) { var i; - return this.bracketsRequested = !0, this.updateBracketPairsTree(), ((i = this.bracketPairsTree.value) == null ? void 0 : i.object.getBracketsInRange(e, t)) || lg.empty; + return this.bracketsRequested = !0, this.updateBracketPairsTree(), ((i = this.bracketPairsTree.value) == null ? void 0 : i.object.getBracketsInRange(e, t)) || um.empty; } findMatchingBracketUp(e, t, i) { const n = this.textModel.validatePosition(t), o = this.textModel.getLanguageIdAtPosition(n.lineNumber, n.column); if (this.canBuildAST) { - const r = this.languageConfigurationService.getLanguageConfiguration(o).bracketsNew.getClosingBracketInfo(e); - if (!r) + const l = this.languageConfigurationService.getLanguageConfiguration(o).bracketsNew.getClosingBracketInfo(e); + if (!l) return null; - const l = this.getBracketPairsInRange(M.fromPositions(t, t)).findLast((a) => r.closes(a.openingBracketInfo)); - return l ? l.openingBracketRange : null; + const r = this.getBracketPairsInRange(I.fromPositions(t, t)).findLast((c) => l.closes(c.openingBracketInfo)); + return r ? r.openingBracketRange : null; } else { - const r = e.toLowerCase(), l = this.languageConfigurationService.getLanguageConfiguration(o).brackets; - if (!l) + const l = e.toLowerCase(), r = this.languageConfigurationService.getLanguageConfiguration(o).brackets; + if (!r) return null; - const a = l.textIsBracket[r]; - return a ? cS(this._findMatchingBracketUp(a, n, $N(i))) : null; + const c = r.textIsBracket[l]; + return c ? X1(this._findMatchingBracketUp(c, n, pR(i))) : null; } } matchBracket(e, t) { if (this.canBuildAST) { - const i = this.getBracketPairsInRange(M.fromPositions(e, e)).filter((n) => n.closingBracketRange !== void 0 && (n.openingBracketRange.containsPosition(e) || n.closingBracketRange.containsPosition(e))).findLastMaxBy(gs((n) => n.openingBracketRange.containsPosition(e) ? n.openingBracketRange : n.closingBracketRange, M.compareRangesUsingStarts)); + const i = this.getBracketPairsInRange(I.fromPositions(e, e)).filter((n) => n.closingBracketRange !== void 0 && (n.openingBracketRange.containsPosition(e) || n.closingBracketRange.containsPosition(e))).findLastMaxBy(ps((n) => n.openingBracketRange.containsPosition(e) ? n.openingBracketRange : n.closingBracketRange, I.compareRangesUsingStarts)); return i ? [i.openingBracketRange, i.closingBracketRange] : null; } else { - const i = $N(t); + const i = pR(t); return this._matchBracket(this.textModel.validatePosition(e), i); } } _establishBracketSearchOffsets(e, t, i, n) { - const o = t.getCount(), r = t.getLanguageId(n); - let l = Math.max(0, e.column - 1 - i.maxBracketLength); - for (let c = n - 1; c >= 0; c--) { - const d = t.getEndOffset(c); - if (d <= l) + const o = t.getCount(), l = t.getLanguageId(n); + let r = Math.max(0, e.column - 1 - i.maxBracketLength); + for (let d = n - 1; d >= 0; d--) { + const a = t.getEndOffset(d); + if (a <= r) break; - if (jl(t.getStandardTokenType(c)) || t.getLanguageId(c) !== r) { - l = d; + if (tc(t.getStandardTokenType(d)) || t.getLanguageId(d) !== l) { + r = a; break; } } - let a = Math.min(t.getLineContent().length, e.column - 1 + i.maxBracketLength); - for (let c = n + 1; c < o; c++) { - const d = t.getStartOffset(c); - if (d >= a) + let c = Math.min(t.getLineContent().length, e.column - 1 + i.maxBracketLength); + for (let d = n + 1; d < o; d++) { + const a = t.getStartOffset(d); + if (a >= c) break; - if (jl(t.getStandardTokenType(c)) || t.getLanguageId(c) !== r) { - a = d; + if (tc(t.getStandardTokenType(d)) || t.getLanguageId(d) !== l) { + c = a; break; } } - return { searchStartOffset: l, searchEndOffset: a }; + return { searchStartOffset: r, searchEndOffset: c }; } _matchBracket(e, t) { - const i = e.lineNumber, n = this.textModel.tokenization.getLineTokens(i), o = this.textModel.getLineContent(i), r = n.findTokenIndexAtOffset(e.column - 1); - if (r < 0) + const i = e.lineNumber, n = this.textModel.tokenization.getLineTokens(i), o = this.textModel.getLineContent(i), l = n.findTokenIndexAtOffset(e.column - 1); + if (l < 0) return null; - const l = this.languageConfigurationService.getLanguageConfiguration(n.getLanguageId(r)).brackets; - if (l && !jl(n.getStandardTokenType(r))) { - let { searchStartOffset: a, searchEndOffset: c } = this._establishBracketSearchOffsets(e, n, l, r), d = null; + const r = this.languageConfigurationService.getLanguageConfiguration(n.getLanguageId(l)).brackets; + if (r && !tc(n.getStandardTokenType(l))) { + let { searchStartOffset: c, searchEndOffset: d } = this._establishBracketSearchOffsets(e, n, r, l), a = null; for (; ; ) { - const h = Ir.findNextBracketInRange(l.forwardRegex, i, o, a, c); + const h = wl.findNextBracketInRange(r.forwardRegex, i, o, c, d); if (!h) break; if (h.startColumn <= e.column && e.column <= h.endColumn) { - const u = o.substring(h.startColumn - 1, h.endColumn - 1).toLowerCase(), g = this._matchFoundBracket(h, l.textIsBracket[u], l.textIsOpenBracket[u], t); - if (g) { - if (g instanceof mc) + const u = o.substring(h.startColumn - 1, h.endColumn - 1).toLowerCase(), m = this._matchFoundBracket(h, r.textIsBracket[u], r.textIsOpenBracket[u], t); + if (m) { + if (m instanceof fd) return null; - d = g; + a = m; } } - a = h.endColumn - 1; + c = h.endColumn - 1; } - if (d) - return d; + if (a) + return a; } - if (r > 0 && n.getStartOffset(r) === e.column - 1) { - const a = r - 1, c = this.languageConfigurationService.getLanguageConfiguration(n.getLanguageId(a)).brackets; - if (c && !jl(n.getStandardTokenType(a))) { - const { searchStartOffset: d, searchEndOffset: h } = this._establishBracketSearchOffsets(e, n, c, a), u = Ir.findPrevBracketInRange(c.reversedRegex, i, o, d, h); + if (l > 0 && n.getStartOffset(l) === e.column - 1) { + const c = l - 1, d = this.languageConfigurationService.getLanguageConfiguration(n.getLanguageId(c)).brackets; + if (d && !tc(n.getStandardTokenType(c))) { + const { searchStartOffset: a, searchEndOffset: h } = this._establishBracketSearchOffsets(e, n, d, c), u = wl.findPrevBracketInRange(d.reversedRegex, i, o, a, h); if (u && u.startColumn <= e.column && e.column <= u.endColumn) { - const g = o.substring(u.startColumn - 1, u.endColumn - 1).toLowerCase(), m = this._matchFoundBracket(u, c.textIsBracket[g], c.textIsOpenBracket[g], t); - if (m) - return m instanceof mc ? null : m; + const m = o.substring(u.startColumn - 1, u.endColumn - 1).toLowerCase(), b = this._matchFoundBracket(u, d.textIsBracket[m], d.textIsOpenBracket[m], t); + if (b) + return b instanceof fd ? null : b; } } } @@ -32365,175 +32365,175 @@ class zle extends R { if (!t) return null; const o = i ? this._findMatchingBracketDown(t, e.getEndPosition(), n) : this._findMatchingBracketUp(t, e.getStartPosition(), n); - return o ? o instanceof mc ? o : [e, o] : null; + return o ? o instanceof fd ? o : [e, o] : null; } _findMatchingBracketUp(e, t, i) { const n = e.languageId, o = e.reversedRegex; - let r = -1, l = 0; - const a = (c, d, h, u) => { + let l = -1, r = 0; + const c = (d, a, h, u) => { for (; ; ) { - if (i && ++l % 100 === 0 && !i()) - return mc.INSTANCE; - const g = Ir.findPrevBracketInRange(o, c, d, h, u); - if (!g) + if (i && ++r % 100 === 0 && !i()) + return fd.INSTANCE; + const m = wl.findPrevBracketInRange(o, d, a, h, u); + if (!m) break; - const m = d.substring(g.startColumn - 1, g.endColumn - 1).toLowerCase(); - if (e.isOpen(m) ? r++ : e.isClose(m) && r--, r === 0) - return g; - u = g.startColumn - 1; + const b = a.substring(m.startColumn - 1, m.endColumn - 1).toLowerCase(); + if (e.isOpen(b) ? l++ : e.isClose(b) && l--, l === 0) + return m; + u = m.startColumn - 1; } return null; }; - for (let c = t.lineNumber; c >= 1; c--) { - const d = this.textModel.tokenization.getLineTokens(c), h = d.getCount(), u = this.textModel.getLineContent(c); - let g = h - 1, m = u.length, f = u.length; - c === t.lineNumber && (g = d.findTokenIndexAtOffset(t.column - 1), m = t.column - 1, f = t.column - 1); - let b = !0; - for (; g >= 0; g--) { - const y = d.getLanguageId(g) === n && !jl(d.getStandardTokenType(g)); - if (y) - b ? m = d.getStartOffset(g) : (m = d.getStartOffset(g), f = d.getEndOffset(g)); - else if (b && m !== f) { - const w = a(c, u, m, f); - if (w) - return w; + for (let d = t.lineNumber; d >= 1; d--) { + const a = this.textModel.tokenization.getLineTokens(d), h = a.getCount(), u = this.textModel.getLineContent(d); + let m = h - 1, b = u.length, g = u.length; + d === t.lineNumber && (m = a.findTokenIndexAtOffset(t.column - 1), b = t.column - 1, g = t.column - 1); + let Z = !0; + for (; m >= 0; m--) { + const f = a.getLanguageId(m) === n && !tc(a.getStandardTokenType(m)); + if (f) + Z ? b = a.getStartOffset(m) : (b = a.getStartOffset(m), g = a.getEndOffset(m)); + else if (Z && b !== g) { + const y = c(d, u, b, g); + if (y) + return y; } - b = y; + Z = f; } - if (b && m !== f) { - const y = a(c, u, m, f); - if (y) - return y; + if (Z && b !== g) { + const f = c(d, u, b, g); + if (f) + return f; } } return null; } _findMatchingBracketDown(e, t, i) { const n = e.languageId, o = e.forwardRegex; - let r = 1, l = 0; - const a = (d, h, u, g) => { + let l = 1, r = 0; + const c = (a, h, u, m) => { for (; ; ) { - if (i && ++l % 100 === 0 && !i()) - return mc.INSTANCE; - const m = Ir.findNextBracketInRange(o, d, h, u, g); - if (!m) + if (i && ++r % 100 === 0 && !i()) + return fd.INSTANCE; + const b = wl.findNextBracketInRange(o, a, h, u, m); + if (!b) break; - const f = h.substring(m.startColumn - 1, m.endColumn - 1).toLowerCase(); - if (e.isOpen(f) ? r++ : e.isClose(f) && r--, r === 0) - return m; - u = m.endColumn - 1; + const g = h.substring(b.startColumn - 1, b.endColumn - 1).toLowerCase(); + if (e.isOpen(g) ? l++ : e.isClose(g) && l--, l === 0) + return b; + u = b.endColumn - 1; } return null; - }, c = this.textModel.getLineCount(); - for (let d = t.lineNumber; d <= c; d++) { - const h = this.textModel.tokenization.getLineTokens(d), u = h.getCount(), g = this.textModel.getLineContent(d); - let m = 0, f = 0, b = 0; - d === t.lineNumber && (m = h.findTokenIndexAtOffset(t.column - 1), f = t.column - 1, b = t.column - 1); - let y = !0; - for (; m < u; m++) { - const w = h.getLanguageId(m) === n && !jl(h.getStandardTokenType(m)); - if (w) - y || (f = h.getStartOffset(m)), b = h.getEndOffset(m); - else if (y && f !== b) { - const C = a(d, g, f, b); - if (C) - return C; + }, d = this.textModel.getLineCount(); + for (let a = t.lineNumber; a <= d; a++) { + const h = this.textModel.tokenization.getLineTokens(a), u = h.getCount(), m = this.textModel.getLineContent(a); + let b = 0, g = 0, Z = 0; + a === t.lineNumber && (b = h.findTokenIndexAtOffset(t.column - 1), g = t.column - 1, Z = t.column - 1); + let f = !0; + for (; b < u; b++) { + const y = h.getLanguageId(b) === n && !tc(h.getStandardTokenType(b)); + if (y) + f || (g = h.getStartOffset(b)), Z = h.getEndOffset(b); + else if (f && g !== Z) { + const W = c(a, m, g, Z); + if (W) + return W; } - y = w; + f = y; } - if (y && f !== b) { - const w = a(d, g, f, b); - if (w) - return w; + if (f && g !== Z) { + const y = c(a, m, g, Z); + if (y) + return y; } } return null; } findPrevBracket(e) { - var r; + var l; const t = this.textModel.validatePosition(e); if (this.canBuildAST) - return this.bracketsRequested = !0, this.updateBracketPairsTree(), ((r = this.bracketPairsTree.value) == null ? void 0 : r.object.getFirstBracketBefore(t)) || null; + return this.bracketsRequested = !0, this.updateBracketPairsTree(), ((l = this.bracketPairsTree.value) == null ? void 0 : l.object.getFirstBracketBefore(t)) || null; let i = null, n = null, o = null; - for (let l = t.lineNumber; l >= 1; l--) { - const a = this.textModel.tokenization.getLineTokens(l), c = a.getCount(), d = this.textModel.getLineContent(l); - let h = c - 1, u = d.length, g = d.length; - if (l === t.lineNumber) { - h = a.findTokenIndexAtOffset(t.column - 1), u = t.column - 1, g = t.column - 1; - const f = a.getLanguageId(h); - i !== f && (i = f, n = this.languageConfigurationService.getLanguageConfiguration(i).brackets, o = this.languageConfigurationService.getLanguageConfiguration(i).bracketsNew); - } - let m = !0; + for (let r = t.lineNumber; r >= 1; r--) { + const c = this.textModel.tokenization.getLineTokens(r), d = c.getCount(), a = this.textModel.getLineContent(r); + let h = d - 1, u = a.length, m = a.length; + if (r === t.lineNumber) { + h = c.findTokenIndexAtOffset(t.column - 1), u = t.column - 1, m = t.column - 1; + const g = c.getLanguageId(h); + i !== g && (i = g, n = this.languageConfigurationService.getLanguageConfiguration(i).brackets, o = this.languageConfigurationService.getLanguageConfiguration(i).bracketsNew); + } + let b = !0; for (; h >= 0; h--) { - const f = a.getLanguageId(h); - if (i !== f) { - if (n && o && m && u !== g) { - const y = Ir.findPrevBracketInRange(n.reversedRegex, l, d, u, g); - if (y) - return this._toFoundBracket(o, y); - m = !1; + const g = c.getLanguageId(h); + if (i !== g) { + if (n && o && b && u !== m) { + const f = wl.findPrevBracketInRange(n.reversedRegex, r, a, u, m); + if (f) + return this._toFoundBracket(o, f); + b = !1; } - i = f, n = this.languageConfigurationService.getLanguageConfiguration(i).brackets, o = this.languageConfigurationService.getLanguageConfiguration(i).bracketsNew; + i = g, n = this.languageConfigurationService.getLanguageConfiguration(i).brackets, o = this.languageConfigurationService.getLanguageConfiguration(i).bracketsNew; } - const b = !!n && !jl(a.getStandardTokenType(h)); - if (b) - m ? u = a.getStartOffset(h) : (u = a.getStartOffset(h), g = a.getEndOffset(h)); - else if (o && n && m && u !== g) { - const y = Ir.findPrevBracketInRange(n.reversedRegex, l, d, u, g); - if (y) - return this._toFoundBracket(o, y); + const Z = !!n && !tc(c.getStandardTokenType(h)); + if (Z) + b ? u = c.getStartOffset(h) : (u = c.getStartOffset(h), m = c.getEndOffset(h)); + else if (o && n && b && u !== m) { + const f = wl.findPrevBracketInRange(n.reversedRegex, r, a, u, m); + if (f) + return this._toFoundBracket(o, f); } - m = b; + b = Z; } - if (o && n && m && u !== g) { - const f = Ir.findPrevBracketInRange(n.reversedRegex, l, d, u, g); - if (f) - return this._toFoundBracket(o, f); + if (o && n && b && u !== m) { + const g = wl.findPrevBracketInRange(n.reversedRegex, r, a, u, m); + if (g) + return this._toFoundBracket(o, g); } } return null; } findNextBracket(e) { - var l; + var r; const t = this.textModel.validatePosition(e); if (this.canBuildAST) - return this.bracketsRequested = !0, this.updateBracketPairsTree(), ((l = this.bracketPairsTree.value) == null ? void 0 : l.object.getFirstBracketAfter(t)) || null; + return this.bracketsRequested = !0, this.updateBracketPairsTree(), ((r = this.bracketPairsTree.value) == null ? void 0 : r.object.getFirstBracketAfter(t)) || null; const i = this.textModel.getLineCount(); - let n = null, o = null, r = null; - for (let a = t.lineNumber; a <= i; a++) { - const c = this.textModel.tokenization.getLineTokens(a), d = c.getCount(), h = this.textModel.getLineContent(a); - let u = 0, g = 0, m = 0; - if (a === t.lineNumber) { - u = c.findTokenIndexAtOffset(t.column - 1), g = t.column - 1, m = t.column - 1; - const b = c.getLanguageId(u); - n !== b && (n = b, o = this.languageConfigurationService.getLanguageConfiguration(n).brackets, r = this.languageConfigurationService.getLanguageConfiguration(n).bracketsNew); - } - let f = !0; - for (; u < d; u++) { - const b = c.getLanguageId(u); - if (n !== b) { - if (r && o && f && g !== m) { - const w = Ir.findNextBracketInRange(o.forwardRegex, a, h, g, m); - if (w) - return this._toFoundBracket(r, w); - f = !1; + let n = null, o = null, l = null; + for (let c = t.lineNumber; c <= i; c++) { + const d = this.textModel.tokenization.getLineTokens(c), a = d.getCount(), h = this.textModel.getLineContent(c); + let u = 0, m = 0, b = 0; + if (c === t.lineNumber) { + u = d.findTokenIndexAtOffset(t.column - 1), m = t.column - 1, b = t.column - 1; + const Z = d.getLanguageId(u); + n !== Z && (n = Z, o = this.languageConfigurationService.getLanguageConfiguration(n).brackets, l = this.languageConfigurationService.getLanguageConfiguration(n).bracketsNew); + } + let g = !0; + for (; u < a; u++) { + const Z = d.getLanguageId(u); + if (n !== Z) { + if (l && o && g && m !== b) { + const y = wl.findNextBracketInRange(o.forwardRegex, c, h, m, b); + if (y) + return this._toFoundBracket(l, y); + g = !1; } - n = b, o = this.languageConfigurationService.getLanguageConfiguration(n).brackets, r = this.languageConfigurationService.getLanguageConfiguration(n).bracketsNew; + n = Z, o = this.languageConfigurationService.getLanguageConfiguration(n).brackets, l = this.languageConfigurationService.getLanguageConfiguration(n).bracketsNew; } - const y = !!o && !jl(c.getStandardTokenType(u)); - if (y) - f || (g = c.getStartOffset(u)), m = c.getEndOffset(u); - else if (r && o && f && g !== m) { - const w = Ir.findNextBracketInRange(o.forwardRegex, a, h, g, m); - if (w) - return this._toFoundBracket(r, w); + const f = !!o && !tc(d.getStandardTokenType(u)); + if (f) + g || (m = d.getStartOffset(u)), b = d.getEndOffset(u); + else if (l && o && g && m !== b) { + const y = wl.findNextBracketInRange(o.forwardRegex, c, h, m, b); + if (y) + return this._toFoundBracket(l, y); } - f = y; + g = f; } - if (r && o && f && g !== m) { - const b = Ir.findNextBracketInRange(o.forwardRegex, a, h, g, m); - if (b) - return this._toFoundBracket(r, b); + if (l && o && g && m !== b) { + const Z = wl.findNextBracketInRange(o.forwardRegex, c, h, m, b); + if (Z) + return this._toFoundBracket(l, Z); } } return null; @@ -32541,70 +32541,70 @@ class zle extends R { findEnclosingBrackets(e, t) { const i = this.textModel.validatePosition(e); if (this.canBuildAST) { - const g = M.fromPositions(i), m = this.getBracketPairsInRange(M.fromPositions(i, i)).findLast((f) => f.closingBracketRange !== void 0 && f.range.strictContainsRange(g)); - return m ? [m.openingBracketRange, m.closingBracketRange] : null; - } - const n = $N(t), o = this.textModel.getLineCount(), r = /* @__PURE__ */ new Map(); - let l = []; - const a = (g, m) => { - if (!r.has(g)) { - const f = []; - for (let b = 0, y = m ? m.brackets.length : 0; b < y; b++) - f[b] = 0; - r.set(g, f); - } - l = r.get(g); + const m = I.fromPositions(i), b = this.getBracketPairsInRange(I.fromPositions(i, i)).findLast((g) => g.closingBracketRange !== void 0 && g.range.strictContainsRange(m)); + return b ? [b.openingBracketRange, b.closingBracketRange] : null; + } + const n = pR(t), o = this.textModel.getLineCount(), l = /* @__PURE__ */ new Map(); + let r = []; + const c = (m, b) => { + if (!l.has(m)) { + const g = []; + for (let Z = 0, f = b ? b.brackets.length : 0; Z < f; Z++) + g[Z] = 0; + l.set(m, g); + } + r = l.get(m); }; - let c = 0; - const d = (g, m, f, b, y) => { + let d = 0; + const a = (m, b, g, Z, f) => { for (; ; ) { - if (n && ++c % 100 === 0 && !n()) - return mc.INSTANCE; - const w = Ir.findNextBracketInRange(g.forwardRegex, m, f, b, y); - if (!w) + if (n && ++d % 100 === 0 && !n()) + return fd.INSTANCE; + const y = wl.findNextBracketInRange(m.forwardRegex, b, g, Z, f); + if (!y) break; - const C = f.substring(w.startColumn - 1, w.endColumn - 1).toLowerCase(), S = g.textIsBracket[C]; - if (S && (S.isOpen(C) ? l[S.index]++ : S.isClose(C) && l[S.index]--, l[S.index] === -1)) - return this._matchFoundBracket(w, S, !1, n); - b = w.endColumn - 1; + const W = g.substring(y.startColumn - 1, y.endColumn - 1).toLowerCase(), G = m.textIsBracket[W]; + if (G && (G.isOpen(W) ? r[G.index]++ : G.isClose(W) && r[G.index]--, r[G.index] === -1)) + return this._matchFoundBracket(y, G, !1, n); + Z = y.endColumn - 1; } return null; }; let h = null, u = null; - for (let g = i.lineNumber; g <= o; g++) { - const m = this.textModel.tokenization.getLineTokens(g), f = m.getCount(), b = this.textModel.getLineContent(g); - let y = 0, w = 0, C = 0; - if (g === i.lineNumber) { - y = m.findTokenIndexAtOffset(i.column - 1), w = i.column - 1, C = i.column - 1; - const L = m.getLanguageId(y); - h !== L && (h = L, u = this.languageConfigurationService.getLanguageConfiguration(h).brackets, a(h, u)); - } - let S = !0; - for (; y < f; y++) { - const L = m.getLanguageId(y); - if (h !== L) { - if (u && S && w !== C) { - const Z = d(u, g, b, w, C); - if (Z) - return cS(Z); - S = !1; + for (let m = i.lineNumber; m <= o; m++) { + const b = this.textModel.tokenization.getLineTokens(m), g = b.getCount(), Z = this.textModel.getLineContent(m); + let f = 0, y = 0, W = 0; + if (m === i.lineNumber) { + f = b.findTokenIndexAtOffset(i.column - 1), y = i.column - 1, W = i.column - 1; + const X = b.getLanguageId(f); + h !== X && (h = X, u = this.languageConfigurationService.getLanguageConfiguration(h).brackets, c(h, u)); + } + let G = !0; + for (; f < g; f++) { + const X = b.getLanguageId(f); + if (h !== X) { + if (u && G && y !== W) { + const S = a(u, m, Z, y, W); + if (S) + return X1(S); + G = !1; } - h = L, u = this.languageConfigurationService.getLanguageConfiguration(h).brackets, a(h, u); + h = X, u = this.languageConfigurationService.getLanguageConfiguration(h).brackets, c(h, u); } - const x = !!u && !jl(m.getStandardTokenType(y)); - if (x) - S || (w = m.getStartOffset(y)), C = m.getEndOffset(y); - else if (u && S && w !== C) { - const Z = d(u, g, b, w, C); - if (Z) - return cS(Z); + const L = !!u && !tc(b.getStandardTokenType(f)); + if (L) + G || (y = b.getStartOffset(f)), W = b.getEndOffset(f); + else if (u && G && y !== W) { + const S = a(u, m, Z, y, W); + if (S) + return X1(S); } - S = x; + G = L; } - if (u && S && w !== C) { - const L = d(u, g, b, w, C); - if (L) - return cS(L); + if (u && G && y !== W) { + const X = a(u, m, Z, y, W); + if (X) + return X1(X); } } return null; @@ -32621,13 +32621,13 @@ class zle extends R { } : null; } } -function Ple(s, e) { +function kce(s, e) { return { object: s, dispose: () => e == null ? void 0 : e.dispose() }; } -function $N(s) { +function pR(s) { if (typeof s > "u") return () => !0; { @@ -32635,19 +32635,19 @@ function $N(s) { return () => Date.now() - e <= s; } } -const pZ = class pZ { +const N2 = class N2 { constructor() { this._searchCanceledBrand = void 0; } }; -pZ.INSTANCE = new pZ(); -let mc = pZ; -function cS(s) { - return s instanceof mc ? null : s; +N2.INSTANCE = new N2(); +let fd = N2; +function X1(s) { + return s instanceof fd ? null : s; } -class Ble extends R { +class vce extends J { constructor(e) { - super(), this.textModel = e, this.colorProvider = new eK(), this.onDidChangeEmitter = new k(), this.onDidChange = this.onDidChangeEmitter.event, this.colorizationOptions = e.getOptions().bracketPairColorizationOptions, this._register(e.bracketPairs.onDidChange((t) => { + super(), this.textModel = e, this.colorProvider = new vQ(), this.onDidChangeEmitter = new k(), this.onDidChange = this.onDidChangeEmitter.event, this.colorizationOptions = e.getOptions().bracketPairColorizationOptions, this._register(e.bracketPairs.onDidChange((t) => { this.onDidChangeEmitter.fire(); })); } @@ -32657,21 +32657,21 @@ class Ble extends R { } //#endregion getDecorationsInRange(e, t, i, n) { - return n ? [] : t === void 0 ? [] : this.colorizationOptions.enabled ? this.textModel.bracketPairs.getBracketsInRange(e, !0).map((r) => ({ - id: `bracket${r.range.toString()}-${r.nestingLevel}`, + return n ? [] : t === void 0 ? [] : this.colorizationOptions.enabled ? this.textModel.bracketPairs.getBracketsInRange(e, !0).map((l) => ({ + id: `bracket${l.range.toString()}-${l.nestingLevel}`, options: { description: "BracketPairColorization", - inlineClassName: this.colorProvider.getInlineClassName(r, this.colorizationOptions.independentColorPoolPerBracketType) + inlineClassName: this.colorProvider.getInlineClassName(l, this.colorizationOptions.independentColorPoolPerBracketType) }, ownerId: 0, - range: r.range + range: l.range })).toArray() : []; } getAllDecorations(e, t) { - return e === void 0 ? [] : this.colorizationOptions.enabled ? this.getDecorationsInRange(new M(1, 1, this.textModel.getLineCount(), 1), e, t) : []; + return e === void 0 ? [] : this.colorizationOptions.enabled ? this.getDecorationsInRange(new I(1, 1, this.textModel.getLineCount(), 1), e, t) : []; } } -class eK { +class vQ { constructor() { this.unexpectedClosingBracketClassName = "unexpected-closing-bracket"; } @@ -32682,26 +32682,26 @@ class eK { return `bracket-highlighting-${e % 30}`; } } -Lr((s, e) => { +Il((s, e) => { const t = [ - ZU, - _U, - IU, - NU, - WU, - vU - ], i = new eK(); - e.addRule(`.monaco-editor .${i.unexpectedClosingBracketClassName} { color: ${s.getColor(zoe)}; }`); + cQ, + dQ, + aQ, + hQ, + uQ, + mQ + ], i = new vQ(); + e.addRule(`.monaco-editor .${i.unexpectedClosingBracketClassName} { color: ${s.getColor(Yle)}; }`); const n = t.map((o) => s.getColor(o)).filter((o) => !!o).filter((o) => !o.isTransparent()); for (let o = 0; o < 30; o++) { - const r = n[o % n.length]; - e.addRule(`.monaco-editor .${i.getInlineClassNameOfLevel(o)} { color: ${r}; }`); + const l = n[o % n.length]; + e.addRule(`.monaco-editor .${i.getInlineClassNameOfLevel(o)} { color: ${l}; }`); } }); -function dS(s) { +function V1(s) { return s.replace(/\n/g, "\\n").replace(/\r/g, "\\r"); } -class xn { +class In { get oldLength() { return this.oldText.length; } @@ -32718,43 +32718,43 @@ class xn { this.oldPosition = e, this.oldText = t, this.newPosition = i, this.newText = n; } toString() { - return this.oldText.length === 0 ? `(insert@${this.oldPosition} "${dS(this.newText)}")` : this.newText.length === 0 ? `(delete@${this.oldPosition} "${dS(this.oldText)}")` : `(replace@${this.oldPosition} "${dS(this.oldText)}" with "${dS(this.newText)}")`; + return this.oldText.length === 0 ? `(insert@${this.oldPosition} "${V1(this.newText)}")` : this.newText.length === 0 ? `(delete@${this.oldPosition} "${V1(this.oldText)}")` : `(replace@${this.oldPosition} "${V1(this.oldText)}" with "${V1(this.newText)}")`; } static _writeStringSize(e) { return 4 + 2 * e.length; } static _writeString(e, t, i) { const n = t.length; - gl(e, n, i), i += 4; + Zr(e, n, i), i += 4; for (let o = 0; o < n; o++) - uee(e, t.charCodeAt(o), i), i += 2; + ste(e, t.charCodeAt(o), i), i += 2; return i; } static _readString(e, t) { - const i = ul(e, t); - return t += 4, mee(e, t, i); + const i = gr(e, t); + return t += 4, lte(e, t, i); } writeSize() { - return 8 + xn._writeStringSize(this.oldText) + xn._writeStringSize(this.newText); + return 8 + In._writeStringSize(this.oldText) + In._writeStringSize(this.newText); } write(e, t) { - return gl(e, this.oldPosition, t), t += 4, gl(e, this.newPosition, t), t += 4, t = xn._writeString(e, this.oldText, t), t = xn._writeString(e, this.newText, t), t; + return Zr(e, this.oldPosition, t), t += 4, Zr(e, this.newPosition, t), t += 4, t = In._writeString(e, this.oldText, t), t = In._writeString(e, this.newText, t), t; } static read(e, t, i) { - const n = ul(e, t); + const n = gr(e, t); t += 4; - const o = ul(e, t); + const o = gr(e, t); t += 4; - const r = xn._readString(e, t); - t += xn._writeStringSize(r); - const l = xn._readString(e, t); - return t += xn._writeStringSize(l), i.push(new xn(n, r, o, l)), t; + const l = In._readString(e, t); + t += In._writeStringSize(l); + const r = In._readString(e, t); + return t += In._writeStringSize(r), i.push(new In(n, l, o, r)), t; } } -function Ole(s, e) { - return s === null || s.length === 0 ? e : new ta(s, e).compress(); +function Jce(s, e) { + return s === null || s.length === 0 ? e : new oc(s, e).compress(); } -class ta { +class oc { constructor(e, t) { this._prevEdits = e, this._currEdits = t, this._result = [], this._resultLen = 0, this._prevLen = this._prevEdits.length, this._prevDeltaOffset = 0, this._currLen = this._currEdits.length, this._currDeltaOffset = 0; } @@ -32778,60 +32778,60 @@ class ta { continue; } if (n.oldPosition < i.newPosition) { - const [c, d] = ta._splitCurr(n, i.newPosition - n.oldPosition); - this._acceptCurr(c), n = d; + const [d, a] = oc._splitCurr(n, i.newPosition - n.oldPosition); + this._acceptCurr(d), n = a; continue; } if (i.newPosition < n.oldPosition) { - const [c, d] = ta._splitPrev(i, n.oldPosition - i.newPosition); - this._acceptPrev(c), i = d; + const [d, a] = oc._splitPrev(i, n.oldPosition - i.newPosition); + this._acceptPrev(d), i = a; continue; } - let l, a; + let r, c; if (n.oldEnd === i.newEnd) - l = i, a = n, i = this._getPrev(++e), n = this._getCurr(++t); + r = i, c = n, i = this._getPrev(++e), n = this._getCurr(++t); else if (n.oldEnd < i.newEnd) { - const [c, d] = ta._splitPrev(i, n.oldLength); - l = c, a = n, i = d, n = this._getCurr(++t); + const [d, a] = oc._splitPrev(i, n.oldLength); + r = d, c = n, i = a, n = this._getCurr(++t); } else { - const [c, d] = ta._splitCurr(n, i.newLength); - l = i, a = c, i = this._getPrev(++e), n = d; + const [d, a] = oc._splitCurr(n, i.newLength); + r = i, c = d, i = this._getPrev(++e), n = a; } - this._result[this._resultLen++] = new xn(l.oldPosition, l.oldText, a.newPosition, a.newText), this._prevDeltaOffset += l.newLength - l.oldLength, this._currDeltaOffset += a.newLength - a.oldLength; + this._result[this._resultLen++] = new In(r.oldPosition, r.oldText, c.newPosition, c.newText), this._prevDeltaOffset += r.newLength - r.oldLength, this._currDeltaOffset += c.newLength - c.oldLength; } - const o = ta._merge(this._result); - return ta._removeNoOps(o); + const o = oc._merge(this._result); + return oc._removeNoOps(o); } _acceptCurr(e) { - this._result[this._resultLen++] = ta._rebaseCurr(this._prevDeltaOffset, e), this._currDeltaOffset += e.newLength - e.oldLength; + this._result[this._resultLen++] = oc._rebaseCurr(this._prevDeltaOffset, e), this._currDeltaOffset += e.newLength - e.oldLength; } _getCurr(e) { return e < this._currLen ? this._currEdits[e] : null; } _acceptPrev(e) { - this._result[this._resultLen++] = ta._rebasePrev(this._currDeltaOffset, e), this._prevDeltaOffset += e.newLength - e.oldLength; + this._result[this._resultLen++] = oc._rebasePrev(this._currDeltaOffset, e), this._prevDeltaOffset += e.newLength - e.oldLength; } _getPrev(e) { return e < this._prevLen ? this._prevEdits[e] : null; } static _rebaseCurr(e, t) { - return new xn(t.oldPosition - e, t.oldText, t.newPosition, t.newText); + return new In(t.oldPosition - e, t.oldText, t.newPosition, t.newText); } static _rebasePrev(e, t) { - return new xn(t.oldPosition, t.oldText, t.newPosition + e, t.newText); + return new In(t.oldPosition, t.oldText, t.newPosition + e, t.newText); } static _splitPrev(e, t) { const i = e.newText.substr(0, t), n = e.newText.substr(t); return [ - new xn(e.oldPosition, e.oldText, e.newPosition, i), - new xn(e.oldEnd, "", e.newPosition + t, n) + new In(e.oldPosition, e.oldText, e.newPosition, i), + new In(e.oldEnd, "", e.newPosition + t, n) ]; } static _splitCurr(e, t) { const i = e.oldText.substr(0, t), n = e.oldText.substr(t); return [ - new xn(e.oldPosition, i, e.newPosition, e.newText), - new xn(e.oldPosition + t, n, e.newEnd, "") + new In(e.oldPosition, i, e.newPosition, e.newText), + new In(e.oldPosition + t, n, e.newEnd, "") ]; } static _merge(e) { @@ -32840,8 +32840,8 @@ class ta { const t = []; let i = 0, n = e[0]; for (let o = 1; o < e.length; o++) { - const r = e[o]; - n.oldEnd === r.oldPosition ? n = new xn(n.oldPosition, n.oldText + r.oldText, n.newPosition, n.newText + r.newText) : (t[i++] = n, n = r); + const l = e[o]; + n.oldEnd === l.oldPosition ? n = new In(n.oldPosition, n.oldText + l.oldText, n.newPosition, n.newText + l.newText) : (t[i++] = n, n = l); } return t[i++] = n, t; } @@ -32857,49 +32857,49 @@ class ta { return t; } } -function pd(s) { +function ya(s) { return s === 47 || s === 92; } -function tK(s) { - return s.replace(/[\\/]/g, vi.sep); +function JQ(s) { + return s.replace(/[\\/]/g, Mi.sep); } -function Hle(s) { - return s.indexOf("/") === -1 && (s = tK(s)), /^[a-zA-Z]:(\/|$)/.test(s) && (s = "/" + s), s; +function Hce(s) { + return s.indexOf("/") === -1 && (s = JQ(s)), /^[a-zA-Z]:(\/|$)/.test(s) && (s = "/" + s), s; } -function fY(s, e = vi.sep) { +function FF(s, e = Mi.sep) { if (!s) return ""; const t = s.length, i = s.charCodeAt(0); - if (pd(i)) { - if (pd(s.charCodeAt(1)) && !pd(s.charCodeAt(2))) { + if (ya(i)) { + if (ya(s.charCodeAt(1)) && !ya(s.charCodeAt(2))) { let o = 3; - const r = o; - for (; o < t && !pd(s.charCodeAt(o)); o++) + const l = o; + for (; o < t && !ya(s.charCodeAt(o)); o++) ; - if (r !== o && !pd(s.charCodeAt(o + 1))) { + if (l !== o && !ya(s.charCodeAt(o + 1))) { for (o += 1; o < t; o++) - if (pd(s.charCodeAt(o))) + if (ya(s.charCodeAt(o))) return s.slice(0, o + 1).replace(/[\\/]/g, e); } } return e; - } else if (iK(i) && s.charCodeAt(1) === 58) - return pd(s.charCodeAt(2)) ? s.slice(0, 2) + e : s.slice(0, 2); + } else if (HQ(i) && s.charCodeAt(1) === 58) + return ya(s.charCodeAt(2)) ? s.slice(0, 2) + e : s.slice(0, 2); let n = s.indexOf("://"); if (n !== -1) { for (n += 3; n < t; n++) - if (pd(s.charCodeAt(n))) + if (ya(s.charCodeAt(n))) return s.slice(0, n + 1); } return ""; } -function Wv(s, e, t, i = eh) { +function jw(s, e, t, i = sh) { if (s === e) return !0; if (!s || !e || e.length > s.length) return !1; if (t) { - if (!tE(s, e)) + if (!Sv(s, e)) return !1; if (e.length === s.length) return !0; @@ -32908,21 +32908,21 @@ function Wv(s, e, t, i = eh) { } return e.charAt(e.length - 1) !== i && (e += i), s.indexOf(e) === 0; } -function iK(s) { +function HQ(s) { return s >= 65 && s <= 90 || s >= 97 && s <= 122; } -function Jle(s, e = kn) { - return e ? iK(s.charCodeAt(0)) && s.charCodeAt(1) === 58 : !1; +function Ece(s, e = Jn) { + return e ? HQ(s.charCodeAt(0)) && s.charCodeAt(1) === 58 : !1; } -function $l(s) { - return rA(s, !0); +function nc(s) { + return GV(s, !0); } -class Ule { +class Dce { constructor(e) { this._ignorePathCasing = e; } compare(e, t, i = !1) { - return e === t ? 0 : vw(this.getComparisonKey(e, i), this.getComparisonKey(t, i)); + return e === t ? 0 : Ay(this.getComparisonKey(e, i), this.getComparisonKey(t, i)); } isEqual(e, t, i = !1) { return e === t ? !0 : !e || !t ? !1 : this.getComparisonKey(e, i) === this.getComparisonKey(t, i); @@ -32935,31 +32935,31 @@ class Ule { } isEqualOrParent(e, t, i = !1) { if (e.scheme === t.scheme) { - if (e.scheme === Ge.file) - return Wv($l(e), $l(t), this._ignorePathCasing(e)) && e.query === t.query && (i || e.fragment === t.fragment); - if (yY(e.authority, t.authority)) - return Wv(e.path, t.path, this._ignorePathCasing(e), "/") && e.query === t.query && (i || e.fragment === t.fragment); + if (e.scheme === ve.file) + return jw(nc(e), nc(t), this._ignorePathCasing(e)) && e.query === t.query && (i || e.fragment === t.fragment); + if (AF(e.authority, t.authority)) + return jw(e.path, t.path, this._ignorePathCasing(e), "/") && e.query === t.query && (i || e.fragment === t.fragment); } return !1; } // --- path math joinPath(e, ...t) { - return Le.joinPath(e, ...t); + return Xe.joinPath(e, ...t); } basenameOrAuthority(e) { - return Cr(e) || e.authority; + return Vl(e) || e.authority; } basename(e) { - return vi.basename(e.path); + return Mi.basename(e.path); } extname(e) { - return vi.extname(e.path); + return Mi.extname(e.path); } dirname(e) { if (e.path.length === 0) return e; let t; - return e.scheme === Ge.file ? t = Le.file(JH($l(e))).path : (t = vi.dirname(e.path), e.authority && t.length && t.charCodeAt(0) !== 47 && (console.error(`dirname("${e.toString})) resulted in a relative path`), t = "/")), e.with({ + return e.scheme === ve.file ? t = Xe.file(RB(nc(e))).path : (t = Mi.dirname(e.path), e.authority && t.length && t.charCodeAt(0) !== 47 && (console.error(`dirname("${e.toString})) resulted in a relative path`), t = "/")), e.with({ path: t }); } @@ -32967,37 +32967,37 @@ class Ule { if (!e.path.length) return e; let t; - return e.scheme === Ge.file ? t = Le.file(HH($l(e))).path : t = vi.normalize(e.path), e.with({ + return e.scheme === ve.file ? t = Xe.file(CB(nc(e))).path : t = Mi.normalize(e.path), e.with({ path: t }); } relativePath(e, t) { - if (e.scheme !== t.scheme || !yY(e.authority, t.authority)) + if (e.scheme !== t.scheme || !AF(e.authority, t.authority)) return; - if (e.scheme === Ge.file) { - const o = Mq($l(e), $l(t)); - return kn ? tK(o) : o; + if (e.scheme === ve.file) { + const o = Z$(nc(e), nc(t)); + return Jn ? JQ(o) : o; } let i = e.path || "/"; const n = t.path || "/"; if (this._ignorePathCasing(e)) { let o = 0; - for (const r = Math.min(i.length, n.length); o < r && !(i.charCodeAt(o) !== n.charCodeAt(o) && i.charAt(o).toLowerCase() !== n.charAt(o).toLowerCase()); o++) + for (const l = Math.min(i.length, n.length); o < l && !(i.charCodeAt(o) !== n.charCodeAt(o) && i.charAt(o).toLowerCase() !== n.charAt(o).toLowerCase()); o++) ; i = n.substr(0, o) + i.substr(o); } - return vi.relative(i, n); + return Mi.relative(i, n); } resolvePath(e, t) { - if (e.scheme === Ge.file) { - const i = Le.file(xq($l(e), t)); + if (e.scheme === ve.file) { + const i = Xe.file(g$(nc(e), t)); return e.with({ authority: i.authority, path: i.path }); } - return t = Hle(t), e.with({ - path: vi.resolve(e.path, t) + return t = Hce(t), e.with({ + path: Mi.resolve(e.path, t) }); } // --- misc @@ -33005,100 +33005,100 @@ class Ule { return !!e.path && e.path[0] === "/"; } isEqualAuthority(e, t) { - return e === t || e !== void 0 && t !== void 0 && Tp(e, t); + return e === t || e !== void 0 && t !== void 0 && Hp(e, t); } - hasTrailingPathSeparator(e, t = eh) { - if (e.scheme === Ge.file) { - const i = $l(e); - return i.length > fY(i).length && i[i.length - 1] === t; + hasTrailingPathSeparator(e, t = sh) { + if (e.scheme === ve.file) { + const i = nc(e); + return i.length > FF(i).length && i[i.length - 1] === t; } else { const i = e.path; return i.length > 1 && i.charCodeAt(i.length - 1) === 47 && !/^[a-zA-Z]:(\/$|\\$)/.test(e.fsPath); } } - removeTrailingPathSeparator(e, t = eh) { - return wY(e, t) ? e.with({ path: e.path.substr(0, e.path.length - 1) }) : e; + removeTrailingPathSeparator(e, t = sh) { + return KF(e, t) ? e.with({ path: e.path.substr(0, e.path.length - 1) }) : e; } - addTrailingPathSeparator(e, t = eh) { + addTrailingPathSeparator(e, t = sh) { let i = !1; - if (e.scheme === Ge.file) { - const n = $l(e); - i = n !== void 0 && n.length === fY(n).length && n[n.length - 1] === t; + if (e.scheme === ve.file) { + const n = nc(e); + i = n !== void 0 && n.length === FF(n).length && n[n.length - 1] === t; } else { t = "/"; const n = e.path; i = n.length === 1 && n.charCodeAt(n.length - 1) === 47; } - return !i && !wY(e, t) ? e.with({ path: e.path + "/" }) : e; + return !i && !KF(e, t) ? e.with({ path: e.path + "/" }) : e; } } -const Kt = new Ule(() => !1), d1 = Kt.isEqual.bind(Kt); -Kt.isEqualOrParent.bind(Kt); -Kt.getComparisonKey.bind(Kt); -const Kle = Kt.basenameOrAuthority.bind(Kt), Cr = Kt.basename.bind(Kt), Qle = Kt.extname.bind(Kt), bI = Kt.dirname.bind(Kt), jle = Kt.joinPath.bind(Kt), qle = Kt.normalizePath.bind(Kt), $le = Kt.relativePath.bind(Kt), bY = Kt.resolvePath.bind(Kt); -Kt.isAbsolutePath.bind(Kt); -const yY = Kt.isEqualAuthority.bind(Kt), wY = Kt.hasTrailingPathSeparator.bind(Kt); -Kt.removeTrailingPathSeparator.bind(Kt); -Kt.addTrailingPathSeparator.bind(Kt); -var Gh; +const Qt = new Dce(() => !1), XW = Qt.isEqual.bind(Qt); +Qt.isEqualOrParent.bind(Qt); +Qt.getComparisonKey.bind(Qt); +const Fce = Qt.basenameOrAuthority.bind(Qt), Vl = Qt.basename.bind(Qt), zce = Qt.extname.bind(Qt), Tx = Qt.dirname.bind(Qt), Ace = Qt.joinPath.bind(Qt), Kce = Qt.normalizePath.bind(Qt), Uce = Qt.relativePath.bind(Qt), zF = Qt.resolvePath.bind(Qt); +Qt.isAbsolutePath.bind(Qt); +const AF = Qt.isEqualAuthority.bind(Qt), KF = Qt.hasTrailingPathSeparator.bind(Qt); +Qt.removeTrailingPathSeparator.bind(Qt); +Qt.addTrailingPathSeparator.bind(Qt); +var Dh; (function(s) { s.META_DATA_LABEL = "label", s.META_DATA_DESCRIPTION = "description", s.META_DATA_SIZE = "size", s.META_DATA_MIME = "mime"; function e(t) { const i = /* @__PURE__ */ new Map(); - t.path.substring(t.path.indexOf(";") + 1, t.path.lastIndexOf(";")).split(";").forEach((r) => { - const [l, a] = r.split(":"); - l && a && i.set(l, a); + t.path.substring(t.path.indexOf(";") + 1, t.path.lastIndexOf(";")).split(";").forEach((l) => { + const [r, c] = l.split(":"); + r && c && i.set(r, c); }); const o = t.path.substring(0, t.path.indexOf(";")); return o && i.set(s.META_DATA_MIME, o), i; } s.parseMetaData = e; -})(Gh || (Gh = {})); -function rp(s) { +})(Dh || (Dh = {})); +function hp(s) { return s.toString(); } -class qi { +class $i { static create(e, t) { - const i = e.getAlternativeVersionId(), n = vv(e); - return new qi(i, i, n, n, t, t, []); + const i = e.getAlternativeVersionId(), n = qw(e); + return new $i(i, i, n, n, t, t, []); } - constructor(e, t, i, n, o, r, l) { - this.beforeVersionId = e, this.afterVersionId = t, this.beforeEOL = i, this.afterEOL = n, this.beforeCursorState = o, this.afterCursorState = r, this.changes = l; + constructor(e, t, i, n, o, l, r) { + this.beforeVersionId = e, this.afterVersionId = t, this.beforeEOL = i, this.afterEOL = n, this.beforeCursorState = o, this.afterCursorState = l, this.changes = r; } append(e, t, i, n, o) { - t.length > 0 && (this.changes = Ole(this.changes, t)), this.afterEOL = i, this.afterVersionId = n, this.afterCursorState = o; + t.length > 0 && (this.changes = Jce(this.changes, t)), this.afterEOL = i, this.afterVersionId = n, this.afterCursorState = o; } static _writeSelectionsSize(e) { return 4 + 4 * 4 * (e ? e.length : 0); } static _writeSelections(e, t, i) { - if (gl(e, t ? t.length : 0, i), i += 4, t) + if (Zr(e, t ? t.length : 0, i), i += 4, t) for (const n of t) - gl(e, n.selectionStartLineNumber, i), i += 4, gl(e, n.selectionStartColumn, i), i += 4, gl(e, n.positionLineNumber, i), i += 4, gl(e, n.positionColumn, i), i += 4; + Zr(e, n.selectionStartLineNumber, i), i += 4, Zr(e, n.selectionStartColumn, i), i += 4, Zr(e, n.positionLineNumber, i), i += 4, Zr(e, n.positionColumn, i), i += 4; return i; } static _readSelections(e, t, i) { - const n = ul(e, t); + const n = gr(e, t); t += 4; for (let o = 0; o < n; o++) { - const r = ul(e, t); + const l = gr(e, t); t += 4; - const l = ul(e, t); + const r = gr(e, t); t += 4; - const a = ul(e, t); + const c = gr(e, t); t += 4; - const c = ul(e, t); - t += 4, i.push(new fe(r, l, a, c)); + const d = gr(e, t); + t += 4, i.push(new ge(l, r, c, d)); } return t; } serialize() { - let e = 10 + qi._writeSelectionsSize(this.beforeCursorState) + qi._writeSelectionsSize(this.afterCursorState) + 4; + let e = 10 + $i._writeSelectionsSize(this.beforeCursorState) + $i._writeSelectionsSize(this.afterCursorState) + 4; for (const n of this.changes) e += n.writeSize(); const t = new Uint8Array(e); let i = 0; - gl(t, this.beforeVersionId, i), i += 4, gl(t, this.afterVersionId, i), i += 4, bF(t, this.beforeEOL, i), i += 1, bF(t, this.afterEOL, i), i += 1, i = qi._writeSelections(t, this.beforeCursorState, i), i = qi._writeSelections(t, this.afterCursorState, i), gl(t, this.changes.length, i), i += 4; + Zr(t, this.beforeVersionId, i), i += 4, Zr(t, this.afterVersionId, i), i += 4, zD(t, this.beforeEOL, i), i += 1, zD(t, this.afterEOL, i), i += 1, i = $i._writeSelections(t, this.beforeCursorState, i), i = $i._writeSelections(t, this.afterCursorState, i), Zr(t, this.changes.length, i), i += 4; for (const n of this.changes) i = n.write(t, i); return t.buffer; @@ -33106,83 +33106,83 @@ class qi { static deserialize(e) { const t = new Uint8Array(e); let i = 0; - const n = ul(t, i); + const n = gr(t, i); i += 4; - const o = ul(t, i); + const o = gr(t, i); i += 4; - const r = fF(t, i); + const l = FD(t, i); i += 1; - const l = fF(t, i); + const r = FD(t, i); i += 1; - const a = []; - i = qi._readSelections(t, i, a); const c = []; - i = qi._readSelections(t, i, c); - const d = ul(t, i); + i = $i._readSelections(t, i, c); + const d = []; + i = $i._readSelections(t, i, d); + const a = gr(t, i); i += 4; const h = []; - for (let u = 0; u < d; u++) - i = xn.read(t, i, h); - return new qi(n, o, r, l, a, c, h); + for (let u = 0; u < a; u++) + i = In.read(t, i, h); + return new $i(n, o, l, r, c, d, h); } } -class nK { +class EQ { get type() { return 0; } get resource() { - return Le.isUri(this.model) ? this.model : this.model.uri; + return Xe.isUri(this.model) ? this.model : this.model.uri; } constructor(e, t, i, n) { - this.label = e, this.code = t, this.model = i, this._data = qi.create(i, n); + this.label = e, this.code = t, this.model = i, this._data = $i.create(i, n); } toString() { - return (this._data instanceof qi ? this._data : qi.deserialize(this._data)).changes.map((t) => t.toString()).join(", "); + return (this._data instanceof $i ? this._data : $i.deserialize(this._data)).changes.map((t) => t.toString()).join(", "); } matchesResource(e) { - return (Le.isUri(this.model) ? this.model : this.model.uri).toString() === e.toString(); + return (Xe.isUri(this.model) ? this.model : this.model.uri).toString() === e.toString(); } setModel(e) { this.model = e; } canAppend(e) { - return this.model === e && this._data instanceof qi; + return this.model === e && this._data instanceof $i; } append(e, t, i, n, o) { - this._data instanceof qi && this._data.append(e, t, i, n, o); + this._data instanceof $i && this._data.append(e, t, i, n, o); } close() { - this._data instanceof qi && (this._data = this._data.serialize()); + this._data instanceof $i && (this._data = this._data.serialize()); } open() { - this._data instanceof qi || (this._data = qi.deserialize(this._data)); + this._data instanceof $i || (this._data = $i.deserialize(this._data)); } undo() { - if (Le.isUri(this.model)) + if (Xe.isUri(this.model)) throw new Error("Invalid SingleModelEditStackElement"); - this._data instanceof qi && (this._data = this._data.serialize()); - const e = qi.deserialize(this._data); + this._data instanceof $i && (this._data = this._data.serialize()); + const e = $i.deserialize(this._data); this.model._applyUndo(e.changes, e.beforeEOL, e.beforeVersionId, e.beforeCursorState); } redo() { - if (Le.isUri(this.model)) + if (Xe.isUri(this.model)) throw new Error("Invalid SingleModelEditStackElement"); - this._data instanceof qi && (this._data = this._data.serialize()); - const e = qi.deserialize(this._data); + this._data instanceof $i && (this._data = this._data.serialize()); + const e = $i.deserialize(this._data); this.model._applyRedo(e.changes, e.afterEOL, e.afterVersionId, e.afterCursorState); } heapSize() { - return this._data instanceof qi && (this._data = this._data.serialize()), this._data.byteLength + 168; + return this._data instanceof $i && (this._data = this._data.serialize()), this._data.byteLength + 168; } } -class eae { +class Pce { get resources() { return this._editStackElementsArr.map((e) => e.resource); } constructor(e, t, i) { this.label = e, this.code = t, this.type = 1, this._isOpen = !0, this._editStackElementsArr = i.slice(0), this._editStackElementsMap = /* @__PURE__ */ new Map(); for (const n of this._editStackElementsArr) { - const o = rp(n.resource); + const o = hp(n.resource); this._editStackElementsMap.set(o, n); } this._delegate = null; @@ -33192,22 +33192,22 @@ class eae { return this._delegate.prepareUndoRedo(this); } matchesResource(e) { - const t = rp(e); + const t = hp(e); return this._editStackElementsMap.has(t); } setModel(e) { - const t = rp(Le.isUri(e) ? e : e.uri); + const t = hp(Xe.isUri(e) ? e : e.uri); this._editStackElementsMap.has(t) && this._editStackElementsMap.get(t).setModel(e); } canAppend(e) { if (!this._isOpen) return !1; - const t = rp(e.uri); + const t = hp(e.uri); return this._editStackElementsMap.has(t) ? this._editStackElementsMap.get(t).canAppend(e) : !1; } append(e, t, i, n, o) { - const r = rp(e.uri); - this._editStackElementsMap.get(r).append(e, t, i, n, o); + const l = hp(e.uri); + this._editStackElementsMap.get(l).append(e, t, i, n, o); } close() { this._isOpen = !1; @@ -33224,7 +33224,7 @@ class eae { e.redo(); } heapSize(e) { - const t = rp(e); + const t = hp(e); return this._editStackElementsMap.has(t) ? this._editStackElementsMap.get(t).heapSize() : 0; } split() { @@ -33233,171 +33233,171 @@ class eae { toString() { const e = []; for (const t of this._editStackElementsArr) - e.push(`${Cr(t.resource)}: ${t}`); + e.push(`${Vl(t.resource)}: ${t}`); return `{${e.join(", ")}}`; } } -function vv(s) { +function qw(s) { return s.getEOL() === ` ` ? 0 : 1; } -function pc(s) { - return s ? s instanceof nK || s instanceof eae : !1; +function yd(s) { + return s ? s instanceof EQ || s instanceof Pce : !1; } -class oX { +class NJ { constructor(e, t) { this._model = e, this._undoRedoService = t; } pushStackElement() { const e = this._undoRedoService.getLastElement(this._model.uri); - pc(e) && e.close(); + yd(e) && e.close(); } popStackElement() { const e = this._undoRedoService.getLastElement(this._model.uri); - pc(e) && e.open(); + yd(e) && e.open(); } clear() { this._undoRedoService.removeElements(this._model.uri); } _getOrCreateEditStackElement(e, t) { const i = this._undoRedoService.getLastElement(this._model.uri); - if (pc(i) && i.canAppend(this._model)) + if (yd(i) && i.canAppend(this._model)) return i; - const n = new nK(p("edit", "Typing"), "undoredo.textBufferEdit", this._model, e); + const n = new EQ(p("edit", "Typing"), "undoredo.textBufferEdit", this._model, e); return this._undoRedoService.pushElement(n, t), n; } pushEOL(e) { const t = this._getOrCreateEditStackElement(null, void 0); - this._model.setEOL(e), t.append(this._model, [], vv(this._model), this._model.getAlternativeVersionId(), null); + this._model.setEOL(e), t.append(this._model, [], qw(this._model), this._model.getAlternativeVersionId(), null); } pushEditOperation(e, t, i, n) { - const o = this._getOrCreateEditStackElement(e, n), r = this._model.applyEdits(t, !0), l = oX._computeCursorState(i, r), a = r.map((c, d) => ({ index: d, textChange: c.textChange })); - return a.sort((c, d) => c.textChange.oldPosition === d.textChange.oldPosition ? c.index - d.index : c.textChange.oldPosition - d.textChange.oldPosition), o.append(this._model, a.map((c) => c.textChange), vv(this._model), this._model.getAlternativeVersionId(), l), l; + const o = this._getOrCreateEditStackElement(e, n), l = this._model.applyEdits(t, !0), r = NJ._computeCursorState(i, l), c = l.map((d, a) => ({ index: a, textChange: d.textChange })); + return c.sort((d, a) => d.textChange.oldPosition === a.textChange.oldPosition ? d.index - a.index : d.textChange.oldPosition - a.textChange.oldPosition), o.append(this._model, c.map((d) => d.textChange), qw(this._model), this._model.getAlternativeVersionId(), r), r; } static _computeCursorState(e, t) { try { return e ? e(t) : null; } catch (i) { - return De(i), null; + return Me(i), null; } } } -class tae { +class Bce { constructor() { this.spacesDiff = 0, this.looksLikeAlignment = !1; } } -function iae(s, e, t, i, n) { +function _ce(s, e, t, i, n) { n.spacesDiff = 0, n.looksLikeAlignment = !1; let o; for (o = 0; o < e && o < i; o++) { - const u = s.charCodeAt(o), g = t.charCodeAt(o); - if (u !== g) + const u = s.charCodeAt(o), m = t.charCodeAt(o); + if (u !== m) break; } - let r = 0, l = 0; + let l = 0, r = 0; for (let u = o; u < e; u++) - s.charCodeAt(u) === 32 ? r++ : l++; - let a = 0, c = 0; + s.charCodeAt(u) === 32 ? l++ : r++; + let c = 0, d = 0; for (let u = o; u < i; u++) - t.charCodeAt(u) === 32 ? a++ : c++; - if (r > 0 && l > 0 || a > 0 && c > 0) + t.charCodeAt(u) === 32 ? c++ : d++; + if (l > 0 && r > 0 || c > 0 && d > 0) return; - const d = Math.abs(l - c), h = Math.abs(r - a); - if (d === 0) { - n.spacesDiff = h, h > 0 && 0 <= a - 1 && a - 1 < s.length && a < t.length && t.charCodeAt(a) !== 32 && s.charCodeAt(a - 1) === 32 && s.charCodeAt(s.length - 1) === 44 && (n.looksLikeAlignment = !0); + const a = Math.abs(r - d), h = Math.abs(l - c); + if (a === 0) { + n.spacesDiff = h, h > 0 && 0 <= c - 1 && c - 1 < s.length && c < t.length && t.charCodeAt(c) !== 32 && s.charCodeAt(c - 1) === 32 && s.charCodeAt(s.length - 1) === 44 && (n.looksLikeAlignment = !0); return; } - if (h % d === 0) { - n.spacesDiff = h / d; + if (h % a === 0) { + n.spacesDiff = h / a; return; } } -function CY(s, e, t) { +function UF(s, e, t) { const i = Math.min(s.getLineCount(), 1e4); - let n = 0, o = 0, r = "", l = 0; - const a = [2, 4, 6, 8, 3, 5, 7], c = 8, d = [0, 0, 0, 0, 0, 0, 0, 0, 0], h = new tae(); - for (let m = 1; m <= i; m++) { - const f = s.getLineLength(m), b = s.getLineContent(m), y = f <= 65536; - let w = !1, C = 0, S = 0, L = 0; - for (let Z = 0, _ = f; Z < _; Z++) { - const v = y ? b.charCodeAt(Z) : s.getLineCharCode(m, Z); - if (v === 9) - L++; - else if (v === 32) - S++; + let n = 0, o = 0, l = "", r = 0; + const c = [2, 4, 6, 8, 3, 5, 7], d = 8, a = [0, 0, 0, 0, 0, 0, 0, 0, 0], h = new Bce(); + for (let b = 1; b <= i; b++) { + const g = s.getLineLength(b), Z = s.getLineContent(b), f = g <= 65536; + let y = !1, W = 0, G = 0, X = 0; + for (let S = 0, x = g; S < x; S++) { + const w = f ? Z.charCodeAt(S) : s.getLineCharCode(b, S); + if (w === 9) + X++; + else if (w === 32) + G++; else { - w = !0, C = Z; + y = !0, W = S; break; } } - if (!w || (L > 0 ? n++ : S > 1 && o++, iae(r, l, b, C, h), h.looksLikeAlignment && !(t && e === h.spacesDiff))) + if (!y || (X > 0 ? n++ : G > 1 && o++, _ce(l, r, Z, W, h), h.looksLikeAlignment && !(t && e === h.spacesDiff))) continue; - const x = h.spacesDiff; - x <= c && d[x]++, r = b, l = C; + const L = h.spacesDiff; + L <= d && a[L]++, l = Z, r = W; } let u = t; n !== o && (u = n < o); - let g = e; + let m = e; if (u) { - let m = u ? 0 : 0.1 * i; - a.forEach((f) => { - const b = d[f]; - b > m && (m = b, g = f); - }), g === 4 && d[4] > 0 && d[2] > 0 && d[2] >= d[4] / 2 && (g = 2); + let b = u ? 0 : 0.1 * i; + c.forEach((g) => { + const Z = a[g]; + Z > b && (b = Z, m = g); + }), m === 4 && a[4] > 0 && a[2] > 0 && a[2] >= a[4] / 2 && (m = 2); } return { insertSpaces: u, - tabSize: g + tabSize: m }; } -function Is(s) { +function Ns(s) { return (s.metadata & 1) >>> 0; } -function Ot(s, e) { +function Ut(s, e) { s.metadata = s.metadata & 254 | e << 0; } function Nn(s) { return (s.metadata & 2) >>> 1 === 1; } -function Yt(s, e) { +function Ft(s, e) { s.metadata = s.metadata & 253 | (e ? 1 : 0) << 1; } -function sK(s) { +function DQ(s) { return (s.metadata & 4) >>> 2 === 1; } -function SY(s, e) { +function PF(s, e) { s.metadata = s.metadata & 251 | (e ? 1 : 0) << 2; } -function oK(s) { +function FQ(s) { return (s.metadata & 64) >>> 6 === 1; } -function LY(s, e) { +function BF(s, e) { s.metadata = s.metadata & 191 | (e ? 1 : 0) << 6; } -function nae(s) { +function Qce(s) { return (s.metadata & 24) >>> 3; } -function AY(s, e) { +function _F(s, e) { s.metadata = s.metadata & 231 | e << 3; } -function sae(s) { +function Oce(s) { return (s.metadata & 32) >>> 5 === 1; } -function xY(s, e) { +function QF(s, e) { s.metadata = s.metadata & 223 | (e ? 1 : 0) << 5; } -class rK { +class zQ { constructor(e, t, i) { - this.metadata = 0, this.parent = this, this.left = this, this.right = this, Ot( + this.metadata = 0, this.parent = this, this.left = this, this.right = this, Ut( this, 1 /* NodeColor.Red */ - ), this.start = t, this.end = i, this.delta = 0, this.maxEnd = i, this.id = e, this.ownerId = 0, this.options = null, SY(this, !1), LY(this, !1), AY( + ), this.start = t, this.end = i, this.delta = 0, this.maxEnd = i, this.id = e, this.ownerId = 0, this.options = null, PF(this, !1), BF(this, !1), _F( this, 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ - ), xY(this, !1), this.cachedVersionId = 0, this.cachedAbsoluteStart = t, this.cachedAbsoluteEnd = i, this.range = null, Yt(this, !1); + ), QF(this, !1), this.cachedVersionId = 0, this.cachedAbsoluteStart = t, this.cachedAbsoluteEnd = i, this.range = null, Ft(this, !1); } reset(e, t, i, n) { this.start = t, this.end = i, this.maxEnd = i, this.cachedVersionId = e, this.cachedAbsoluteStart = t, this.cachedAbsoluteEnd = i, this.range = n; @@ -33405,7 +33405,7 @@ class rK { setOptions(e) { this.options = e; const t = this.options.className; - SY(this, t === "squiggly-error" || t === "squiggly-warning" || t === "squiggly-info"), LY(this, this.options.glyphMarginClassName !== null), AY(this, this.options.stickiness), xY(this, this.options.collapseOnReplaceEdit); + PF(this, t === "squiggly-error" || t === "squiggly-warning" || t === "squiggly-info"), BF(this, this.options.glyphMarginClassName !== null), _F(this, this.options.stickiness), QF(this, this.options.collapseOnReplaceEdit); } setCachedOffsets(e, t, i) { this.cachedVersionId !== i && (this.range = null), this.cachedVersionId = i, this.cachedAbsoluteStart = e, this.cachedAbsoluteEnd = t; @@ -33414,69 +33414,69 @@ class rK { this.parent = null, this.left = null, this.right = null; } } -const je = new rK(null, 0, 0); +const je = new zQ(null, 0, 0); je.parent = je; je.left = je; je.right = je; -Ot( +Ut( je, 0 /* NodeColor.Black */ ); -class eW { +class gR { constructor() { this.root = je, this.requestNormalizeDelta = !1; } - intervalSearch(e, t, i, n, o, r) { - return this.root === je ? [] : uae(this, e, t, i, n, o, r); + intervalSearch(e, t, i, n, o, l) { + return this.root === je ? [] : sde(this, e, t, i, n, o, l); } search(e, t, i, n) { - return this.root === je ? [] : hae(this, e, t, i, n); + return this.root === je ? [] : nde(this, e, t, i, n); } /** * Will not set `cachedAbsoluteStart` nor `cachedAbsoluteEnd` on the returned nodes! */ collectNodesFromOwner(e) { - return cae(this, e); + return tde(this, e); } /** * Will not set `cachedAbsoluteStart` nor `cachedAbsoluteEnd` on the returned nodes! */ collectNodesPostOrder() { - return dae(this); + return ide(this); } insert(e) { - MY(this, e), this._normalizeDeltaIfNecessary(); + OF(this, e), this._normalizeDeltaIfNecessary(); } delete(e) { - ZY(this, e), this._normalizeDeltaIfNecessary(); + jF(this, e), this._normalizeDeltaIfNecessary(); } resolveNode(e, t) { const i = e; let n = 0; for (; e !== this.root; ) e === e.parent.right && (n += e.parent.delta), e = e.parent; - const o = i.start + n, r = i.end + n; - i.setCachedOffsets(o, r, t); + const o = i.start + n, l = i.end + n; + i.setCachedOffsets(o, l, t); } acceptReplace(e, t, i, n) { - const o = lae(this, e, e + t); - for (let r = 0, l = o.length; r < l; r++) { - const a = o[r]; - ZY(this, a); + const o = $ce(this, e, e + t); + for (let l = 0, r = o.length; l < r; l++) { + const c = o[l]; + jF(this, c); } - this._normalizeDeltaIfNecessary(), aae(this, e, e + t, i), this._normalizeDeltaIfNecessary(); - for (let r = 0, l = o.length; r < l; r++) { - const a = o[r]; - a.start = a.cachedAbsoluteStart, a.end = a.cachedAbsoluteEnd, rae(a, e, e + t, i, n), a.maxEnd = a.end, MY(this, a); + this._normalizeDeltaIfNecessary(), ede(this, e, e + t, i), this._normalizeDeltaIfNecessary(); + for (let l = 0, r = o.length; l < r; l++) { + const c = o[l]; + c.start = c.cachedAbsoluteStart, c.end = c.cachedAbsoluteEnd, qce(c, e, e + t, i, n), c.maxEnd = c.end, OF(this, c); } this._normalizeDeltaIfNecessary(); } _normalizeDeltaIfNecessary() { - this.requestNormalizeDelta && (this.requestNormalizeDelta = !1, oae(this)); + this.requestNormalizeDelta && (this.requestNormalizeDelta = !1, jce(this)); } } -function oae(s) { +function jce(s) { let e = s.root, t = 0; for (; e !== je; ) { if (e.left !== je && !Nn(e.left)) { @@ -33487,46 +33487,46 @@ function oae(s) { t += e.delta, e = e.right; continue; } - e.start = t + e.start, e.end = t + e.end, e.delta = 0, Rh(e), Yt(e, !0), Yt(e.left, !1), Yt(e.right, !1), e === e.parent.right && (t -= e.parent.delta), e = e.parent; + e.start = t + e.start, e.end = t + e.end, e.delta = 0, Fh(e), Ft(e, !0), Ft(e.left, !1), Ft(e.right, !1), e === e.parent.right && (t -= e.parent.delta), e = e.parent; } - Yt(s.root, !1); + Ft(s.root, !1); } -function lp(s, e, t, i) { +function up(s, e, t, i) { return s < t ? !0 : s > t || i === 1 ? !1 : i === 2 ? !0 : e; } -function rae(s, e, t, i, n) { - const o = nae(s), r = o === 0 || o === 2, l = o === 1 || o === 2, a = t - e, c = i, d = Math.min(a, c), h = s.start; +function qce(s, e, t, i, n) { + const o = Qce(s), l = o === 0 || o === 2, r = o === 1 || o === 2, c = t - e, d = i, a = Math.min(c, d), h = s.start; let u = !1; - const g = s.end; - let m = !1; - e <= h && g <= t && sae(s) && (s.start = e, u = !0, s.end = e, m = !0); + const m = s.end; + let b = !1; + e <= h && m <= t && Oce(s) && (s.start = e, u = !0, s.end = e, b = !0); { - const b = n ? 1 : a > 0 ? 2 : 0; - !u && lp(h, r, e, b) && (u = !0), !m && lp(g, l, e, b) && (m = !0); + const Z = n ? 1 : c > 0 ? 2 : 0; + !u && up(h, l, e, Z) && (u = !0), !b && up(m, r, e, Z) && (b = !0); } - if (d > 0 && !n) { - const b = a > c ? 2 : 0; - !u && lp(h, r, e + d, b) && (u = !0), !m && lp(g, l, e + d, b) && (m = !0); + if (a > 0 && !n) { + const Z = c > d ? 2 : 0; + !u && up(h, l, e + a, Z) && (u = !0), !b && up(m, r, e + a, Z) && (b = !0); } { - const b = n ? 1 : 0; - !u && lp(h, r, t, b) && (s.start = e + c, u = !0), !m && lp(g, l, t, b) && (s.end = e + c, m = !0); + const Z = n ? 1 : 0; + !u && up(h, l, t, Z) && (s.start = e + d, u = !0), !b && up(m, r, t, Z) && (s.end = e + d, b = !0); } - const f = c - a; - u || (s.start = Math.max(0, h + f)), m || (s.end = Math.max(0, g + f)), s.start > s.end && (s.end = s.start); + const g = d - c; + u || (s.start = Math.max(0, h + g)), b || (s.end = Math.max(0, m + g)), s.start > s.end && (s.end = s.start); } -function lae(s, e, t) { - let i = s.root, n = 0, o = 0, r = 0, l = 0; - const a = []; - let c = 0; +function $ce(s, e, t) { + let i = s.root, n = 0, o = 0, l = 0, r = 0; + const c = []; + let d = 0; for (; i !== je; ) { if (Nn(i)) { - Yt(i.left, !1), Yt(i.right, !1), i === i.parent.right && (n -= i.parent.delta), i = i.parent; + Ft(i.left, !1), Ft(i.right, !1), i === i.parent.right && (n -= i.parent.delta), i = i.parent; continue; } if (!Nn(i.left)) { if (o = n + i.maxEnd, o < e) { - Yt(i, !0); + Ft(i, !0); continue; } if (i.left !== je) { @@ -33534,28 +33534,28 @@ function lae(s, e, t) { continue; } } - if (r = n + i.start, r > t) { - Yt(i, !0); + if (l = n + i.start, l > t) { + Ft(i, !0); continue; } - if (l = n + i.end, l >= e && (i.setCachedOffsets(r, l, 0), a[c++] = i), Yt(i, !0), i.right !== je && !Nn(i.right)) { + if (r = n + i.end, r >= e && (i.setCachedOffsets(l, r, 0), c[d++] = i), Ft(i, !0), i.right !== je && !Nn(i.right)) { n += i.delta, i = i.right; continue; } } - return Yt(s.root, !1), a; + return Ft(s.root, !1), c; } -function aae(s, e, t, i) { - let n = s.root, o = 0, r = 0, l = 0; - const a = i - (t - e); +function ede(s, e, t, i) { + let n = s.root, o = 0, l = 0, r = 0; + const c = i - (t - e); for (; n !== je; ) { if (Nn(n)) { - Yt(n.left, !1), Yt(n.right, !1), n === n.parent.right && (o -= n.parent.delta), Rh(n), n = n.parent; + Ft(n.left, !1), Ft(n.right, !1), n === n.parent.right && (o -= n.parent.delta), Fh(n), n = n.parent; continue; } if (!Nn(n.left)) { - if (r = o + n.maxEnd, r < e) { - Yt(n, !0); + if (l = o + n.maxEnd, l < e) { + Ft(n, !0); continue; } if (n.left !== je) { @@ -33563,44 +33563,44 @@ function aae(s, e, t, i) { continue; } } - if (l = o + n.start, l > t) { - n.start += a, n.end += a, n.delta += a, (n.delta < -1073741824 || n.delta > 1073741824) && (s.requestNormalizeDelta = !0), Yt(n, !0); + if (r = o + n.start, r > t) { + n.start += c, n.end += c, n.delta += c, (n.delta < -1073741824 || n.delta > 1073741824) && (s.requestNormalizeDelta = !0), Ft(n, !0); continue; } - if (Yt(n, !0), n.right !== je && !Nn(n.right)) { + if (Ft(n, !0), n.right !== je && !Nn(n.right)) { o += n.delta, n = n.right; continue; } } - Yt(s.root, !1); + Ft(s.root, !1); } -function cae(s, e) { +function tde(s, e) { let t = s.root; const i = []; let n = 0; for (; t !== je; ) { if (Nn(t)) { - Yt(t.left, !1), Yt(t.right, !1), t = t.parent; + Ft(t.left, !1), Ft(t.right, !1), t = t.parent; continue; } if (t.left !== je && !Nn(t.left)) { t = t.left; continue; } - if (t.ownerId === e && (i[n++] = t), Yt(t, !0), t.right !== je && !Nn(t.right)) { + if (t.ownerId === e && (i[n++] = t), Ft(t, !0), t.right !== je && !Nn(t.right)) { t = t.right; continue; } } - return Yt(s.root, !1), i; + return Ft(s.root, !1), i; } -function dae(s) { +function ide(s) { let e = s.root; const t = []; let i = 0; for (; e !== je; ) { if (Nn(e)) { - Yt(e.left, !1), Yt(e.right, !1), e = e.parent; + Ft(e.left, !1), Ft(e.right, !1), e = e.parent; continue; } if (e.left !== je && !Nn(e.left)) { @@ -33611,135 +33611,135 @@ function dae(s) { e = e.right; continue; } - t[i++] = e, Yt(e, !0); + t[i++] = e, Ft(e, !0); } - return Yt(s.root, !1), t; + return Ft(s.root, !1), t; } -function hae(s, e, t, i, n) { - let o = s.root, r = 0, l = 0, a = 0; - const c = []; - let d = 0; +function nde(s, e, t, i, n) { + let o = s.root, l = 0, r = 0, c = 0; + const d = []; + let a = 0; for (; o !== je; ) { if (Nn(o)) { - Yt(o.left, !1), Yt(o.right, !1), o === o.parent.right && (r -= o.parent.delta), o = o.parent; + Ft(o.left, !1), Ft(o.right, !1), o === o.parent.right && (l -= o.parent.delta), o = o.parent; continue; } if (o.left !== je && !Nn(o.left)) { o = o.left; continue; } - l = r + o.start, a = r + o.end, o.setCachedOffsets(l, a, i); + r = l + o.start, c = l + o.end, o.setCachedOffsets(r, c, i); let h = !0; - if (e && o.ownerId && o.ownerId !== e && (h = !1), t && sK(o) && (h = !1), n && !oK(o) && (h = !1), h && (c[d++] = o), Yt(o, !0), o.right !== je && !Nn(o.right)) { - r += o.delta, o = o.right; + if (e && o.ownerId && o.ownerId !== e && (h = !1), t && DQ(o) && (h = !1), n && !FQ(o) && (h = !1), h && (d[a++] = o), Ft(o, !0), o.right !== je && !Nn(o.right)) { + l += o.delta, o = o.right; continue; } } - return Yt(s.root, !1), c; + return Ft(s.root, !1), d; } -function uae(s, e, t, i, n, o, r) { - let l = s.root, a = 0, c = 0, d = 0, h = 0; +function sde(s, e, t, i, n, o, l) { + let r = s.root, c = 0, d = 0, a = 0, h = 0; const u = []; - let g = 0; - for (; l !== je; ) { - if (Nn(l)) { - Yt(l.left, !1), Yt(l.right, !1), l === l.parent.right && (a -= l.parent.delta), l = l.parent; + let m = 0; + for (; r !== je; ) { + if (Nn(r)) { + Ft(r.left, !1), Ft(r.right, !1), r === r.parent.right && (c -= r.parent.delta), r = r.parent; continue; } - if (!Nn(l.left)) { - if (c = a + l.maxEnd, c < e) { - Yt(l, !0); + if (!Nn(r.left)) { + if (d = c + r.maxEnd, d < e) { + Ft(r, !0); continue; } - if (l.left !== je) { - l = l.left; + if (r.left !== je) { + r = r.left; continue; } } - if (d = a + l.start, d > t) { - Yt(l, !0); + if (a = c + r.start, a > t) { + Ft(r, !0); continue; } - if (h = a + l.end, h >= e) { - l.setCachedOffsets(d, h, o); - let m = !0; - i && l.ownerId && l.ownerId !== i && (m = !1), n && sK(l) && (m = !1), r && !oK(l) && (m = !1), m && (u[g++] = l); + if (h = c + r.end, h >= e) { + r.setCachedOffsets(a, h, o); + let b = !0; + i && r.ownerId && r.ownerId !== i && (b = !1), n && DQ(r) && (b = !1), l && !FQ(r) && (b = !1), b && (u[m++] = r); } - if (Yt(l, !0), l.right !== je && !Nn(l.right)) { - a += l.delta, l = l.right; + if (Ft(r, !0), r.right !== je && !Nn(r.right)) { + c += r.delta, r = r.right; continue; } } - return Yt(s.root, !1), u; + return Ft(s.root, !1), u; } -function MY(s, e) { +function OF(s, e) { if (s.root === je) - return e.parent = je, e.left = je, e.right = je, Ot( + return e.parent = je, e.left = je, e.right = je, Ut( e, 0 /* NodeColor.Black */ ), s.root = e, s.root; - gae(s, e), Cd(e.parent); + ode(s, e), La(e.parent); let t = e; - for (; t !== s.root && Is(t.parent) === 1; ) + for (; t !== s.root && Ns(t.parent) === 1; ) if (t.parent === t.parent.parent.left) { const i = t.parent.parent.right; - Is(i) === 1 ? (Ot( + Ns(i) === 1 ? (Ut( t.parent, 0 /* NodeColor.Black */ - ), Ot( + ), Ut( i, 0 /* NodeColor.Black */ - ), Ot( + ), Ut( t.parent.parent, 1 /* NodeColor.Red */ - ), t = t.parent.parent) : (t === t.parent.right && (t = t.parent, Ry(s, t)), Ot( + ), t = t.parent.parent) : (t === t.parent.right && (t = t.parent, _f(s, t)), Ut( t.parent, 0 /* NodeColor.Black */ - ), Ot( + ), Ut( t.parent.parent, 1 /* NodeColor.Red */ - ), Ey(s, t.parent.parent)); + ), Qf(s, t.parent.parent)); } else { const i = t.parent.parent.left; - Is(i) === 1 ? (Ot( + Ns(i) === 1 ? (Ut( t.parent, 0 /* NodeColor.Black */ - ), Ot( + ), Ut( i, 0 /* NodeColor.Black */ - ), Ot( + ), Ut( t.parent.parent, 1 /* NodeColor.Red */ - ), t = t.parent.parent) : (t === t.parent.left && (t = t.parent, Ey(s, t)), Ot( + ), t = t.parent.parent) : (t === t.parent.left && (t = t.parent, Qf(s, t)), Ut( t.parent, 0 /* NodeColor.Black */ - ), Ot( + ), Ut( t.parent.parent, 1 /* NodeColor.Red */ - ), Ry(s, t.parent.parent)); + ), _f(s, t.parent.parent)); } - return Ot( + return Ut( s.root, 0 /* NodeColor.Black */ ), e; } -function gae(s, e) { +function ode(s, e) { let t = 0, i = s.root; const n = e.start, o = e.end; for (; ; ) - if (pae(n, o, i.start + t, i.end + t) < 0) + if (rde(n, o, i.start + t, i.end + t) < 0) if (i.left === je) { e.start -= t, e.end -= t, e.maxEnd -= t, i.left = e; break; @@ -33750,110 +33750,110 @@ function gae(s, e) { break; } else t += i.delta, i = i.right; - e.parent = i, e.left = je, e.right = je, Ot( + e.parent = i, e.left = je, e.right = je, Ut( e, 1 /* NodeColor.Red */ ); } -function ZY(s, e) { +function jF(s, e) { let t, i; - if (e.left === je ? (t = e.right, i = e, t.delta += e.delta, (t.delta < -1073741824 || t.delta > 1073741824) && (s.requestNormalizeDelta = !0), t.start += e.delta, t.end += e.delta) : e.right === je ? (t = e.left, i = e) : (i = mae(e.right), t = i.right, t.start += i.delta, t.end += i.delta, t.delta += i.delta, (t.delta < -1073741824 || t.delta > 1073741824) && (s.requestNormalizeDelta = !0), i.start += e.delta, i.end += e.delta, i.delta = e.delta, (i.delta < -1073741824 || i.delta > 1073741824) && (s.requestNormalizeDelta = !0)), i === s.root) { - s.root = t, Ot( + if (e.left === je ? (t = e.right, i = e, t.delta += e.delta, (t.delta < -1073741824 || t.delta > 1073741824) && (s.requestNormalizeDelta = !0), t.start += e.delta, t.end += e.delta) : e.right === je ? (t = e.left, i = e) : (i = lde(e.right), t = i.right, t.start += i.delta, t.end += i.delta, t.delta += i.delta, (t.delta < -1073741824 || t.delta > 1073741824) && (s.requestNormalizeDelta = !0), i.start += e.delta, i.end += e.delta, i.delta = e.delta, (i.delta < -1073741824 || i.delta > 1073741824) && (s.requestNormalizeDelta = !0)), i === s.root) { + s.root = t, Ut( t, 0 /* NodeColor.Black */ - ), e.detach(), tW(), Rh(t), s.root.parent = je; + ), e.detach(), ZR(), Fh(t), s.root.parent = je; return; } - const n = Is(i) === 1; - if (i === i.parent.left ? i.parent.left = t : i.parent.right = t, i === e ? t.parent = i.parent : (i.parent === e ? t.parent = i : t.parent = i.parent, i.left = e.left, i.right = e.right, i.parent = e.parent, Ot(i, Is(e)), e === s.root ? s.root = i : e === e.parent.left ? e.parent.left = i : e.parent.right = i, i.left !== je && (i.left.parent = i), i.right !== je && (i.right.parent = i)), e.detach(), n) { - Cd(t.parent), i !== e && (Cd(i), Cd(i.parent)), tW(); + const n = Ns(i) === 1; + if (i === i.parent.left ? i.parent.left = t : i.parent.right = t, i === e ? t.parent = i.parent : (i.parent === e ? t.parent = i : t.parent = i.parent, i.left = e.left, i.right = e.right, i.parent = e.parent, Ut(i, Ns(e)), e === s.root ? s.root = i : e === e.parent.left ? e.parent.left = i : e.parent.right = i, i.left !== je && (i.left.parent = i), i.right !== je && (i.right.parent = i)), e.detach(), n) { + La(t.parent), i !== e && (La(i), La(i.parent)), ZR(); return; } - Cd(t), Cd(t.parent), i !== e && (Cd(i), Cd(i.parent)); + La(t), La(t.parent), i !== e && (La(i), La(i.parent)); let o; - for (; t !== s.root && Is(t) === 0; ) - t === t.parent.left ? (o = t.parent.right, Is(o) === 1 && (Ot( + for (; t !== s.root && Ns(t) === 0; ) + t === t.parent.left ? (o = t.parent.right, Ns(o) === 1 && (Ut( o, 0 /* NodeColor.Black */ - ), Ot( + ), Ut( t.parent, 1 /* NodeColor.Red */ - ), Ry(s, t.parent), o = t.parent.right), Is(o.left) === 0 && Is(o.right) === 0 ? (Ot( + ), _f(s, t.parent), o = t.parent.right), Ns(o.left) === 0 && Ns(o.right) === 0 ? (Ut( o, 1 /* NodeColor.Red */ - ), t = t.parent) : (Is(o.right) === 0 && (Ot( + ), t = t.parent) : (Ns(o.right) === 0 && (Ut( o.left, 0 /* NodeColor.Black */ - ), Ot( + ), Ut( o, 1 /* NodeColor.Red */ - ), Ey(s, o), o = t.parent.right), Ot(o, Is(t.parent)), Ot( + ), Qf(s, o), o = t.parent.right), Ut(o, Ns(t.parent)), Ut( t.parent, 0 /* NodeColor.Black */ - ), Ot( + ), Ut( o.right, 0 /* NodeColor.Black */ - ), Ry(s, t.parent), t = s.root)) : (o = t.parent.left, Is(o) === 1 && (Ot( + ), _f(s, t.parent), t = s.root)) : (o = t.parent.left, Ns(o) === 1 && (Ut( o, 0 /* NodeColor.Black */ - ), Ot( + ), Ut( t.parent, 1 /* NodeColor.Red */ - ), Ey(s, t.parent), o = t.parent.left), Is(o.left) === 0 && Is(o.right) === 0 ? (Ot( + ), Qf(s, t.parent), o = t.parent.left), Ns(o.left) === 0 && Ns(o.right) === 0 ? (Ut( o, 1 /* NodeColor.Red */ - ), t = t.parent) : (Is(o.left) === 0 && (Ot( + ), t = t.parent) : (Ns(o.left) === 0 && (Ut( o.right, 0 /* NodeColor.Black */ - ), Ot( + ), Ut( o, 1 /* NodeColor.Red */ - ), Ry(s, o), o = t.parent.left), Ot(o, Is(t.parent)), Ot( + ), _f(s, o), o = t.parent.left), Ut(o, Ns(t.parent)), Ut( t.parent, 0 /* NodeColor.Black */ - ), Ot( + ), Ut( o.left, 0 /* NodeColor.Black */ - ), Ey(s, t.parent), t = s.root)); - Ot( + ), Qf(s, t.parent), t = s.root)); + Ut( t, 0 /* NodeColor.Black */ - ), tW(); + ), ZR(); } -function mae(s) { +function lde(s) { for (; s.left !== je; ) s = s.left; return s; } -function tW() { +function ZR() { je.parent = je, je.delta = 0, je.start = 0, je.end = 0; } -function Ry(s, e) { +function _f(s, e) { const t = e.right; - t.delta += e.delta, (t.delta < -1073741824 || t.delta > 1073741824) && (s.requestNormalizeDelta = !0), t.start += e.delta, t.end += e.delta, e.right = t.left, t.left !== je && (t.left.parent = e), t.parent = e.parent, e.parent === je ? s.root = t : e === e.parent.left ? e.parent.left = t : e.parent.right = t, t.left = e, e.parent = t, Rh(e), Rh(t); + t.delta += e.delta, (t.delta < -1073741824 || t.delta > 1073741824) && (s.requestNormalizeDelta = !0), t.start += e.delta, t.end += e.delta, e.right = t.left, t.left !== je && (t.left.parent = e), t.parent = e.parent, e.parent === je ? s.root = t : e === e.parent.left ? e.parent.left = t : e.parent.right = t, t.left = e, e.parent = t, Fh(e), Fh(t); } -function Ey(s, e) { +function Qf(s, e) { const t = e.left; - e.delta -= t.delta, (e.delta < -1073741824 || e.delta > 1073741824) && (s.requestNormalizeDelta = !0), e.start -= t.delta, e.end -= t.delta, e.left = t.right, t.right !== je && (t.right.parent = e), t.parent = e.parent, e.parent === je ? s.root = t : e === e.parent.right ? e.parent.right = t : e.parent.left = t, t.right = e, e.parent = t, Rh(e), Rh(t); + e.delta -= t.delta, (e.delta < -1073741824 || e.delta > 1073741824) && (s.requestNormalizeDelta = !0), e.start -= t.delta, e.end -= t.delta, e.left = t.right, t.right !== je && (t.right.parent = e), t.parent = e.parent, e.parent === je ? s.root = t : e === e.parent.right ? e.parent.right = t : e.parent.left = t, t.right = e, e.parent = t, Fh(e), Fh(t); } -function lK(s) { +function AQ(s) { let e = s.end; if (s.left !== je) { const t = s.left.maxEnd; @@ -33865,130 +33865,130 @@ function lK(s) { } return e; } -function Rh(s) { - s.maxEnd = lK(s); +function Fh(s) { + s.maxEnd = AQ(s); } -function Cd(s) { +function La(s) { for (; s !== je; ) { - const e = lK(s); + const e = AQ(s); if (s.maxEnd === e) return; s.maxEnd = e, s = s.parent; } } -function pae(s, e, t, i) { +function rde(s, e, t, i) { return s === t ? e - i : s - t; } -class Tv { +class $w { constructor(e, t) { this.piece = e, this.color = t, this.size_left = 0, this.lf_left = 0, this.parent = this, this.left = this, this.right = this; } next() { - if (this.right !== Xe) - return rX(this.right); + if (this.right !== Ee) + return wJ(this.right); let e = this; - for (; e.parent !== Xe && e.parent.left !== e; ) + for (; e.parent !== Ee && e.parent.left !== e; ) e = e.parent; - return e.parent === Xe ? Xe : e.parent; + return e.parent === Ee ? Ee : e.parent; } prev() { - if (this.left !== Xe) - return aK(this.left); + if (this.left !== Ee) + return KQ(this.left); let e = this; - for (; e.parent !== Xe && e.parent.right !== e; ) + for (; e.parent !== Ee && e.parent.right !== e; ) e = e.parent; - return e.parent === Xe ? Xe : e.parent; + return e.parent === Ee ? Ee : e.parent; } detach() { this.parent = null, this.left = null, this.right = null; } } -const Xe = new Tv( +const Ee = new $w( null, 0 /* NodeColor.Black */ ); -Xe.parent = Xe; -Xe.left = Xe; -Xe.right = Xe; -Xe.color = 0; -function rX(s) { - for (; s.left !== Xe; ) +Ee.parent = Ee; +Ee.left = Ee; +Ee.right = Ee; +Ee.color = 0; +function wJ(s) { + for (; s.left !== Ee; ) s = s.left; return s; } -function aK(s) { - for (; s.right !== Xe; ) +function KQ(s) { + for (; s.right !== Ee; ) s = s.right; return s; } -function lX(s) { - return s === Xe ? 0 : s.size_left + s.piece.length + lX(s.right); +function TJ(s) { + return s === Ee ? 0 : s.size_left + s.piece.length + TJ(s.right); } -function aX(s) { - return s === Xe ? 0 : s.lf_left + s.piece.lineFeedCnt + aX(s.right); +function MJ(s) { + return s === Ee ? 0 : s.lf_left + s.piece.lineFeedCnt + MJ(s.right); } -function iW() { - Xe.parent = Xe; +function fR() { + Ee.parent = Ee; } -function Xy(s, e) { +function Of(s, e) { const t = e.right; - t.size_left += e.size_left + (e.piece ? e.piece.length : 0), t.lf_left += e.lf_left + (e.piece ? e.piece.lineFeedCnt : 0), e.right = t.left, t.left !== Xe && (t.left.parent = e), t.parent = e.parent, e.parent === Xe ? s.root = t : e.parent.left === e ? e.parent.left = t : e.parent.right = t, t.left = e, e.parent = t; + t.size_left += e.size_left + (e.piece ? e.piece.length : 0), t.lf_left += e.lf_left + (e.piece ? e.piece.lineFeedCnt : 0), e.right = t.left, t.left !== Ee && (t.left.parent = e), t.parent = e.parent, e.parent === Ee ? s.root = t : e.parent.left === e ? e.parent.left = t : e.parent.right = t, t.left = e, e.parent = t; } -function Fy(s, e) { +function jf(s, e) { const t = e.left; - e.left = t.right, t.right !== Xe && (t.right.parent = e), t.parent = e.parent, e.size_left -= t.size_left + (t.piece ? t.piece.length : 0), e.lf_left -= t.lf_left + (t.piece ? t.piece.lineFeedCnt : 0), e.parent === Xe ? s.root = t : e === e.parent.right ? e.parent.right = t : e.parent.left = t, t.right = e, e.parent = t; + e.left = t.right, t.right !== Ee && (t.right.parent = e), t.parent = e.parent, e.size_left -= t.size_left + (t.piece ? t.piece.length : 0), e.lf_left -= t.lf_left + (t.piece ? t.piece.lineFeedCnt : 0), e.parent === Ee ? s.root = t : e === e.parent.right ? e.parent.right = t : e.parent.left = t, t.right = e, e.parent = t; } -function hS(s, e) { +function L1(s, e) { let t, i; - if (e.left === Xe ? (i = e, t = i.right) : e.right === Xe ? (i = e, t = i.left) : (i = rX(e.right), t = i.right), i === s.root) { - s.root = t, t.color = 0, e.detach(), iW(), s.root.parent = Xe; + if (e.left === Ee ? (i = e, t = i.right) : e.right === Ee ? (i = e, t = i.left) : (i = wJ(e.right), t = i.right), i === s.root) { + s.root = t, t.color = 0, e.detach(), fR(), s.root.parent = Ee; return; } const n = i.color === 1; - if (i === i.parent.left ? i.parent.left = t : i.parent.right = t, i === e ? (t.parent = i.parent, ay(s, t)) : (i.parent === e ? t.parent = i : t.parent = i.parent, ay(s, t), i.left = e.left, i.right = e.right, i.parent = e.parent, i.color = e.color, e === s.root ? s.root = i : e === e.parent.left ? e.parent.left = i : e.parent.right = i, i.left !== Xe && (i.left.parent = i), i.right !== Xe && (i.right.parent = i), i.size_left = e.size_left, i.lf_left = e.lf_left, ay(s, i)), e.detach(), t.parent.left === t) { - const r = lX(t), l = aX(t); - if (r !== t.parent.size_left || l !== t.parent.lf_left) { - const a = r - t.parent.size_left, c = l - t.parent.lf_left; - t.parent.size_left = r, t.parent.lf_left = l, tc(s, t.parent, a, c); + if (i === i.parent.left ? i.parent.left = t : i.parent.right = t, i === e ? (t.parent = i.parent, ff(s, t)) : (i.parent === e ? t.parent = i : t.parent = i.parent, ff(s, t), i.left = e.left, i.right = e.right, i.parent = e.parent, i.color = e.color, e === s.root ? s.root = i : e === e.parent.left ? e.parent.left = i : e.parent.right = i, i.left !== Ee && (i.left.parent = i), i.right !== Ee && (i.right.parent = i), i.size_left = e.size_left, i.lf_left = e.lf_left, ff(s, i)), e.detach(), t.parent.left === t) { + const l = TJ(t), r = MJ(t); + if (l !== t.parent.size_left || r !== t.parent.lf_left) { + const c = l - t.parent.size_left, d = r - t.parent.lf_left; + t.parent.size_left = l, t.parent.lf_left = r, od(s, t.parent, c, d); } } - if (ay(s, t.parent), n) { - iW(); + if (ff(s, t.parent), n) { + fR(); return; } let o; for (; t !== s.root && t.color === 0; ) - t === t.parent.left ? (o = t.parent.right, o.color === 1 && (o.color = 0, t.parent.color = 1, Xy(s, t.parent), o = t.parent.right), o.left.color === 0 && o.right.color === 0 ? (o.color = 1, t = t.parent) : (o.right.color === 0 && (o.left.color = 0, o.color = 1, Fy(s, o), o = t.parent.right), o.color = t.parent.color, t.parent.color = 0, o.right.color = 0, Xy(s, t.parent), t = s.root)) : (o = t.parent.left, o.color === 1 && (o.color = 0, t.parent.color = 1, Fy(s, t.parent), o = t.parent.left), o.left.color === 0 && o.right.color === 0 ? (o.color = 1, t = t.parent) : (o.left.color === 0 && (o.right.color = 0, o.color = 1, Xy(s, o), o = t.parent.left), o.color = t.parent.color, t.parent.color = 0, o.left.color = 0, Fy(s, t.parent), t = s.root)); - t.color = 0, iW(); + t === t.parent.left ? (o = t.parent.right, o.color === 1 && (o.color = 0, t.parent.color = 1, Of(s, t.parent), o = t.parent.right), o.left.color === 0 && o.right.color === 0 ? (o.color = 1, t = t.parent) : (o.right.color === 0 && (o.left.color = 0, o.color = 1, jf(s, o), o = t.parent.right), o.color = t.parent.color, t.parent.color = 0, o.right.color = 0, Of(s, t.parent), t = s.root)) : (o = t.parent.left, o.color === 1 && (o.color = 0, t.parent.color = 1, jf(s, t.parent), o = t.parent.left), o.left.color === 0 && o.right.color === 0 ? (o.color = 1, t = t.parent) : (o.left.color === 0 && (o.right.color = 0, o.color = 1, Of(s, o), o = t.parent.left), o.color = t.parent.color, t.parent.color = 0, o.left.color = 0, jf(s, t.parent), t = s.root)); + t.color = 0, fR(); } -function _Y(s, e) { - for (ay(s, e); e !== s.root && e.parent.color === 1; ) +function qF(s, e) { + for (ff(s, e); e !== s.root && e.parent.color === 1; ) if (e.parent === e.parent.parent.left) { const t = e.parent.parent.right; - t.color === 1 ? (e.parent.color = 0, t.color = 0, e.parent.parent.color = 1, e = e.parent.parent) : (e === e.parent.right && (e = e.parent, Xy(s, e)), e.parent.color = 0, e.parent.parent.color = 1, Fy(s, e.parent.parent)); + t.color === 1 ? (e.parent.color = 0, t.color = 0, e.parent.parent.color = 1, e = e.parent.parent) : (e === e.parent.right && (e = e.parent, Of(s, e)), e.parent.color = 0, e.parent.parent.color = 1, jf(s, e.parent.parent)); } else { const t = e.parent.parent.left; - t.color === 1 ? (e.parent.color = 0, t.color = 0, e.parent.parent.color = 1, e = e.parent.parent) : (e === e.parent.left && (e = e.parent, Fy(s, e)), e.parent.color = 0, e.parent.parent.color = 1, Xy(s, e.parent.parent)); + t.color === 1 ? (e.parent.color = 0, t.color = 0, e.parent.parent.color = 1, e = e.parent.parent) : (e === e.parent.left && (e = e.parent, jf(s, e)), e.parent.color = 0, e.parent.parent.color = 1, Of(s, e.parent.parent)); } s.root.color = 0; } -function tc(s, e, t, i) { - for (; e !== s.root && e !== Xe; ) +function od(s, e, t, i) { + for (; e !== s.root && e !== Ee; ) e.parent.left === e && (e.parent.size_left += t, e.parent.lf_left += i), e = e.parent; } -function ay(s, e) { +function ff(s, e) { let t = 0, i = 0; if (e !== s.root) { for (; e !== s.root && e === e.parent.right; ) e = e.parent; if (e !== s.root) - for (e = e.parent, t = lX(e.left) - e.size_left, i = aX(e.left) - e.lf_left, e.size_left += t, e.lf_left += i; e !== s.root && (t !== 0 || i !== 0); ) + for (e = e.parent, t = TJ(e.left) - e.size_left, i = MJ(e.left) - e.lf_left, e.size_left += t, e.lf_left += i; e !== s.root && (t !== 0 || i !== 0); ) e.parent.left === e && (e.parent.size_left += t, e.parent.lf_left += i), e = e.parent; } } -const fae = 999; -class xu { +const cde = 999; +class Ru { constructor(e, t, i, n) { this.searchString = e, this.isRegex = t, this.matchCase = i, this.wordSeparators = n; } @@ -33996,11 +33996,11 @@ class xu { if (this.searchString === "") return null; let e; - this.isRegex ? e = bae(this.searchString) : e = this.searchString.indexOf(` + this.isRegex ? e = dde(this.searchString) : e = this.searchString.indexOf(` `) >= 0; let t = null; try { - t = EH(this.searchString, this.isRegex, { + t = WB(this.searchString, this.isRegex, { matchCase: this.matchCase, wholeWord: !1, multiline: e, @@ -34013,10 +34013,10 @@ class xu { if (!t) return null; let i = !this.isRegex && !e; - return i && this.searchString.toLowerCase() !== this.searchString.toUpperCase() && (i = this.matchCase), new Cre(t, this.wordSeparators ? yr(this.wordSeparators, []) : null, i ? this.searchString : null); + return i && this.searchString.toLowerCase() !== this.searchString.toUpperCase() && (i = this.matchCase), new ure(t, this.wordSeparators ? Gl(this.wordSeparators, []) : null, i ? this.searchString : null); } } -function bae(s) { +function dde(s) { if (!s || s.length === 0) return !1; for (let e = 0, t = s.length; e < t; e++) { @@ -34033,15 +34033,15 @@ function bae(s) { } return !1; } -function Gu(s, e, t) { +function Fu(s, e, t) { if (!t) - return new t1(s, null); + return new mW(s, null); const i = []; for (let n = 0, o = e.length; n < o; n++) i[n] = e[n]; - return new t1(s, i); + return new mW(s, i); } -class IY { +class $F { constructor(e) { const t = []; let i = 0; @@ -34061,72 +34061,72 @@ class IY { return i + 1; } } -class uS { +class I1 { static findMatches(e, t, i, n, o) { - const r = t.parseSearchRequest(); - return r ? r.regex.multiline ? this._doFindMatchesMultiline(e, i, new Fp(r.wordSeparators, r.regex), n, o) : this._doFindMatchesLineByLine(e, i, r, n, o) : []; + const l = t.parseSearchRequest(); + return l ? l.regex.multiline ? this._doFindMatchesMultiline(e, i, new Pp(l.wordSeparators, l.regex), n, o) : this._doFindMatchesLineByLine(e, i, l, n, o) : []; } /** * Multiline search always executes on the lines concatenated with \n. * We must therefore compensate for the count of \n in case the model is CRLF */ - static _getMultilineMatchRange(e, t, i, n, o, r) { - let l, a = 0; - n ? (a = n.findLineFeedCountBeforeOffset(o), l = t + o + a) : l = t + o; - let c; + static _getMultilineMatchRange(e, t, i, n, o, l) { + let r, c = 0; + n ? (c = n.findLineFeedCountBeforeOffset(o), r = t + o + c) : r = t + o; + let d; if (n) { - const g = n.findLineFeedCountBeforeOffset(o + r.length) - a; - c = l + r.length + g; + const m = n.findLineFeedCountBeforeOffset(o + l.length) - c; + d = r + l.length + m; } else - c = l + r.length; - const d = e.getPositionAt(l), h = e.getPositionAt(c); - return new M(d.lineNumber, d.column, h.lineNumber, h.column); + d = r + l.length; + const a = e.getPositionAt(r), h = e.getPositionAt(d); + return new I(a.lineNumber, a.column, h.lineNumber, h.column); } static _doFindMatchesMultiline(e, t, i, n, o) { - const r = e.getOffsetAt(t.getStartPosition()), l = e.getValueInRange( + const l = e.getOffsetAt(t.getStartPosition()), r = e.getValueInRange( t, 1 /* EndOfLinePreference.LF */ - ), a = e.getEOL() === `\r -` ? new IY(l) : null, c = []; - let d = 0, h; - for (i.reset(0); h = i.next(l); ) - if (c[d++] = Gu(this._getMultilineMatchRange(e, r, l, a, h.index, h[0]), h, n), d >= o) - return c; - return c; + ), c = e.getEOL() === `\r +` ? new $F(r) : null, d = []; + let a = 0, h; + for (i.reset(0); h = i.next(r); ) + if (d[a++] = Fu(this._getMultilineMatchRange(e, l, r, c, h.index, h[0]), h, n), a >= o) + return d; + return d; } static _doFindMatchesLineByLine(e, t, i, n, o) { - const r = []; - let l = 0; + const l = []; + let r = 0; if (t.startLineNumber === t.endLineNumber) { - const c = e.getLineContent(t.startLineNumber).substring(t.startColumn - 1, t.endColumn - 1); - return l = this._findMatchesInLine(i, c, t.startLineNumber, t.startColumn - 1, l, r, n, o), r; + const d = e.getLineContent(t.startLineNumber).substring(t.startColumn - 1, t.endColumn - 1); + return r = this._findMatchesInLine(i, d, t.startLineNumber, t.startColumn - 1, r, l, n, o), l; } - const a = e.getLineContent(t.startLineNumber).substring(t.startColumn - 1); - l = this._findMatchesInLine(i, a, t.startLineNumber, t.startColumn - 1, l, r, n, o); - for (let c = t.startLineNumber + 1; c < t.endLineNumber && l < o; c++) - l = this._findMatchesInLine(i, e.getLineContent(c), c, 0, l, r, n, o); - if (l < o) { - const c = e.getLineContent(t.endLineNumber).substring(0, t.endColumn - 1); - l = this._findMatchesInLine(i, c, t.endLineNumber, 0, l, r, n, o); + const c = e.getLineContent(t.startLineNumber).substring(t.startColumn - 1); + r = this._findMatchesInLine(i, c, t.startLineNumber, t.startColumn - 1, r, l, n, o); + for (let d = t.startLineNumber + 1; d < t.endLineNumber && r < o; d++) + r = this._findMatchesInLine(i, e.getLineContent(d), d, 0, r, l, n, o); + if (r < o) { + const d = e.getLineContent(t.endLineNumber).substring(0, t.endColumn - 1); + r = this._findMatchesInLine(i, d, t.endLineNumber, 0, r, l, n, o); } - return r; + return l; } - static _findMatchesInLine(e, t, i, n, o, r, l, a) { - const c = e.wordSeparators; - if (!l && e.simpleSearch) { - const u = e.simpleSearch, g = u.length, m = t.length; - let f = -g; - for (; (f = t.indexOf(u, f + g)) !== -1; ) - if ((!c || cX(c, t, m, f, g)) && (r[o++] = new t1(new M(i, f + 1 + n, i, f + 1 + g + n), null), o >= a)) + static _findMatchesInLine(e, t, i, n, o, l, r, c) { + const d = e.wordSeparators; + if (!r && e.simpleSearch) { + const u = e.simpleSearch, m = u.length, b = t.length; + let g = -m; + for (; (g = t.indexOf(u, g + m)) !== -1; ) + if ((!d || YJ(d, t, b, g, m)) && (l[o++] = new mW(new I(i, g + 1 + n, i, g + 1 + m + n), null), o >= c)) return o; return o; } - const d = new Fp(e.wordSeparators, e.regex); + const a = new Pp(e.wordSeparators, e.regex); let h; - d.reset(0); + a.reset(0); do - if (h = d.next(t), h && (r[o++] = Gu(new M(i, h.index + 1 + n, i, h.index + 1 + h[0].length + n), h, l), o >= a)) + if (h = a.next(t), h && (l[o++] = Fu(new I(i, h.index + 1 + n, i, h.index + 1 + h[0].length + n), h, r), o >= c)) return o; while (h); return o; @@ -34135,26 +34135,26 @@ class uS { const o = t.parseSearchRequest(); if (!o) return null; - const r = new Fp(o.wordSeparators, o.regex); - return o.regex.multiline ? this._doFindNextMatchMultiline(e, i, r, n) : this._doFindNextMatchLineByLine(e, i, r, n); + const l = new Pp(o.wordSeparators, o.regex); + return o.regex.multiline ? this._doFindNextMatchMultiline(e, i, l, n) : this._doFindNextMatchLineByLine(e, i, l, n); } static _doFindNextMatchMultiline(e, t, i, n) { - const o = new V(t.lineNumber, 1), r = e.getOffsetAt(o), l = e.getLineCount(), a = e.getValueInRange( - new M(o.lineNumber, o.column, l, e.getLineMaxColumn(l)), + const o = new Y(t.lineNumber, 1), l = e.getOffsetAt(o), r = e.getLineCount(), c = e.getValueInRange( + new I(o.lineNumber, o.column, r, e.getLineMaxColumn(r)), 1 /* EndOfLinePreference.LF */ - ), c = e.getEOL() === `\r -` ? new IY(a) : null; + ), d = e.getEOL() === `\r +` ? new $F(c) : null; i.reset(t.column - 1); - const d = i.next(a); - return d ? Gu(this._getMultilineMatchRange(e, r, a, c, d.index, d[0]), d, n) : t.lineNumber !== 1 || t.column !== 1 ? this._doFindNextMatchMultiline(e, new V(1, 1), i, n) : null; + const a = i.next(c); + return a ? Fu(this._getMultilineMatchRange(e, l, c, d, a.index, a[0]), a, n) : t.lineNumber !== 1 || t.column !== 1 ? this._doFindNextMatchMultiline(e, new Y(1, 1), i, n) : null; } static _doFindNextMatchLineByLine(e, t, i, n) { - const o = e.getLineCount(), r = t.lineNumber, l = e.getLineContent(r), a = this._findFirstMatchInLine(i, l, r, t.column, n); - if (a) - return a; - for (let c = 1; c <= o; c++) { - const d = (r + c - 1) % o, h = e.getLineContent(d + 1), u = this._findFirstMatchInLine(i, h, d + 1, 1, n); + const o = e.getLineCount(), l = t.lineNumber, r = e.getLineContent(l), c = this._findFirstMatchInLine(i, r, l, t.column, n); + if (c) + return c; + for (let d = 1; d <= o; d++) { + const a = (l + d - 1) % o, h = e.getLineContent(a + 1), u = this._findFirstMatchInLine(i, h, a + 1, 1, n); if (u) return u; } @@ -34162,71 +34162,71 @@ class uS { } static _findFirstMatchInLine(e, t, i, n, o) { e.reset(n - 1); - const r = e.next(t); - return r ? Gu(new M(i, r.index + 1, i, r.index + 1 + r[0].length), r, o) : null; + const l = e.next(t); + return l ? Fu(new I(i, l.index + 1, i, l.index + 1 + l[0].length), l, o) : null; } static findPreviousMatch(e, t, i, n) { const o = t.parseSearchRequest(); if (!o) return null; - const r = new Fp(o.wordSeparators, o.regex); - return o.regex.multiline ? this._doFindPreviousMatchMultiline(e, i, r, n) : this._doFindPreviousMatchLineByLine(e, i, r, n); + const l = new Pp(o.wordSeparators, o.regex); + return o.regex.multiline ? this._doFindPreviousMatchMultiline(e, i, l, n) : this._doFindPreviousMatchLineByLine(e, i, l, n); } static _doFindPreviousMatchMultiline(e, t, i, n) { - const o = this._doFindMatchesMultiline(e, new M(1, 1, t.lineNumber, t.column), i, n, 10 * fae); + const o = this._doFindMatchesMultiline(e, new I(1, 1, t.lineNumber, t.column), i, n, 10 * cde); if (o.length > 0) return o[o.length - 1]; - const r = e.getLineCount(); - return t.lineNumber !== r || t.column !== e.getLineMaxColumn(r) ? this._doFindPreviousMatchMultiline(e, new V(r, e.getLineMaxColumn(r)), i, n) : null; + const l = e.getLineCount(); + return t.lineNumber !== l || t.column !== e.getLineMaxColumn(l) ? this._doFindPreviousMatchMultiline(e, new Y(l, e.getLineMaxColumn(l)), i, n) : null; } static _doFindPreviousMatchLineByLine(e, t, i, n) { - const o = e.getLineCount(), r = t.lineNumber, l = e.getLineContent(r).substring(0, t.column - 1), a = this._findLastMatchInLine(i, l, r, n); - if (a) - return a; - for (let c = 1; c <= o; c++) { - const d = (o + r - c - 1) % o, h = e.getLineContent(d + 1), u = this._findLastMatchInLine(i, h, d + 1, n); + const o = e.getLineCount(), l = t.lineNumber, r = e.getLineContent(l).substring(0, t.column - 1), c = this._findLastMatchInLine(i, r, l, n); + if (c) + return c; + for (let d = 1; d <= o; d++) { + const a = (o + l - d - 1) % o, h = e.getLineContent(a + 1), u = this._findLastMatchInLine(i, h, a + 1, n); if (u) return u; } return null; } static _findLastMatchInLine(e, t, i, n) { - let o = null, r; - for (e.reset(0); r = e.next(t); ) - o = Gu(new M(i, r.index + 1, i, r.index + 1 + r[0].length), r, n); + let o = null, l; + for (e.reset(0); l = e.next(t); ) + o = Fu(new I(i, l.index + 1, i, l.index + 1 + l[0].length), l, n); return o; } } -function yae(s, e, t, i, n) { +function ade(s, e, t, i, n) { if (i === 0) return !0; const o = e.charCodeAt(i - 1); if (s.get(o) !== 0 || o === 13 || o === 10) return !0; if (n > 0) { - const r = e.charCodeAt(i); - if (s.get(r) !== 0) + const l = e.charCodeAt(i); + if (s.get(l) !== 0) return !0; } return !1; } -function wae(s, e, t, i, n) { +function hde(s, e, t, i, n) { if (i + n === t) return !0; const o = e.charCodeAt(i + n); if (s.get(o) !== 0 || o === 13 || o === 10) return !0; if (n > 0) { - const r = e.charCodeAt(i + n - 1); - if (s.get(r) !== 0) + const l = e.charCodeAt(i + n - 1); + if (s.get(l) !== 0) return !0; } return !1; } -function cX(s, e, t, i, n) { - return yae(s, e, t, i, n) && wae(s, e, t, i, n); +function YJ(s, e, t, i, n) { + return ade(s, e, t, i, n) && hde(s, e, t, i, n); } -class Fp { +class Pp { constructor(e, t) { this._wordSeparators = e, this._searchRegex = t, this._prevMatchStartIndex = -1, this._prevMatchLength = 0; } @@ -34242,65 +34242,65 @@ class Fp { const n = i.index, o = i[0].length; if (n === this._prevMatchStartIndex && o === this._prevMatchLength) { if (o === 0) { - tA(e, t, this._searchRegex.lastIndex) > 65535 ? this._searchRegex.lastIndex += 2 : this._searchRegex.lastIndex += 1; + gV(e, t, this._searchRegex.lastIndex) > 65535 ? this._searchRegex.lastIndex += 2 : this._searchRegex.lastIndex += 1; continue; } return null; } - if (this._prevMatchStartIndex = n, this._prevMatchLength = o, !this._wordSeparators || cX(this._wordSeparators, e, t, n, o)) + if (this._prevMatchStartIndex = n, this._prevMatchLength = o, !this._wordSeparators || YJ(this._wordSeparators, e, t, n, o)) return i; } while (i); return null; } } -const Qa = 65535; -function cK(s) { +const ed = 65535; +function UQ(s) { let e; return s[s.length - 1] < 65536 ? e = new Uint16Array(s.length) : e = new Uint32Array(s.length), e.set(s, 0), e; } -class Cae { +class ude { constructor(e, t, i, n, o) { this.lineStarts = e, this.cr = t, this.lf = i, this.crlf = n, this.isBasicASCII = o; } } -function ic(s, e = !0) { +function ld(s, e = !0) { const t = [0]; let i = 1; for (let n = 0, o = s.length; n < o; n++) { - const r = s.charCodeAt(n); - r === 13 ? n + 1 < o && s.charCodeAt(n + 1) === 10 ? (t[i++] = n + 2, n++) : t[i++] = n + 1 : r === 10 && (t[i++] = n + 1); + const l = s.charCodeAt(n); + l === 13 ? n + 1 < o && s.charCodeAt(n + 1) === 10 ? (t[i++] = n + 2, n++) : t[i++] = n + 1 : l === 10 && (t[i++] = n + 1); } - return e ? cK(t) : t; + return e ? UQ(t) : t; } -function Sae(s, e) { +function mde(s, e) { s.length = 0, s[0] = 0; - let t = 1, i = 0, n = 0, o = 0, r = !0; - for (let a = 0, c = e.length; a < c; a++) { - const d = e.charCodeAt(a); - d === 13 ? a + 1 < c && e.charCodeAt(a + 1) === 10 ? (o++, s[t++] = a + 2, a++) : (i++, s[t++] = a + 1) : d === 10 ? (n++, s[t++] = a + 1) : r && d !== 9 && (d < 32 || d > 126) && (r = !1); + let t = 1, i = 0, n = 0, o = 0, l = !0; + for (let c = 0, d = e.length; c < d; c++) { + const a = e.charCodeAt(c); + a === 13 ? c + 1 < d && e.charCodeAt(c + 1) === 10 ? (o++, s[t++] = c + 2, c++) : (i++, s[t++] = c + 1) : a === 10 ? (n++, s[t++] = c + 1) : l && a !== 9 && (a < 32 || a > 126) && (l = !1); } - const l = new Cae(cK(s), i, n, o, r); - return s.length = 0, l; + const r = new ude(UQ(s), i, n, o, l); + return s.length = 0, r; } -class Us { +class Os { constructor(e, t, i, n, o) { this.bufferIndex = e, this.start = t, this.end = i, this.lineFeedCnt = n, this.length = o; } } -class Ru { +class zu { constructor(e, t) { this.buffer = e, this.lineStarts = t; } } -class Lae { +class bde { constructor(e, t) { - this._pieces = [], this._tree = e, this._BOM = t, this._index = 0, e.root !== Xe && e.iterate(e.root, (i) => (i !== Xe && this._pieces.push(i.piece), !0)); + this._pieces = [], this._tree = e, this._BOM = t, this._index = 0, e.root !== Ee && e.iterate(e.root, (i) => (i !== Ee && this._pieces.push(i.piece), !0)); } read() { return this._pieces.length === 0 ? this._index === 0 ? (this._index++, this._BOM) : null : this._index > this._pieces.length - 1 ? null : this._index === 0 ? this._BOM + this._tree.getPieceContent(this._pieces[this._index++]) : this._tree.getPieceContent(this._pieces[this._index++]); } } -class Aae { +class pde { constructor(e) { this._limit = e, this._cache = []; } @@ -34341,38 +34341,38 @@ class Aae { } } } -class xae { +class gde { constructor(e, t, i) { this.create(e, t, i); } create(e, t, i) { this._buffers = [ - new Ru("", [0]) - ], this._lastChangeBufferPos = { line: 0, column: 0 }, this.root = Xe, this._lineCnt = 1, this._length = 0, this._EOL = t, this._EOLLength = t.length, this._EOLNormalized = i; + new zu("", [0]) + ], this._lastChangeBufferPos = { line: 0, column: 0 }, this.root = Ee, this._lineCnt = 1, this._length = 0, this._EOL = t, this._EOLLength = t.length, this._EOLNormalized = i; let n = null; - for (let o = 0, r = e.length; o < r; o++) + for (let o = 0, l = e.length; o < l; o++) if (e[o].buffer.length > 0) { - e[o].lineStarts || (e[o].lineStarts = ic(e[o].buffer)); - const l = new Us(o + 1, { line: 0, column: 0 }, { line: e[o].lineStarts.length - 1, column: e[o].buffer.length - e[o].lineStarts[e[o].lineStarts.length - 1] }, e[o].lineStarts.length - 1, e[o].buffer.length); - this._buffers.push(e[o]), n = this.rbInsertRight(n, l); + e[o].lineStarts || (e[o].lineStarts = ld(e[o].buffer)); + const r = new Os(o + 1, { line: 0, column: 0 }, { line: e[o].lineStarts.length - 1, column: e[o].buffer.length - e[o].lineStarts[e[o].lineStarts.length - 1] }, e[o].lineStarts.length - 1, e[o].buffer.length); + this._buffers.push(e[o]), n = this.rbInsertRight(n, r); } - this._searchCache = new Aae(1), this._lastVisitedLine = { lineNumber: 0, value: "" }, this.computeBufferMetadata(); + this._searchCache = new pde(1), this._lastVisitedLine = { lineNumber: 0, value: "" }, this.computeBufferMetadata(); } normalizeEOL(e) { - const t = Qa, i = t - Math.floor(t / 3), n = i * 2; - let o = "", r = 0; - const l = []; - if (this.iterate(this.root, (a) => { - const c = this.getNodeContent(a), d = c.length; - if (r <= i || r + d < n) - return o += c, r += d, !0; + const t = ed, i = t - Math.floor(t / 3), n = i * 2; + let o = "", l = 0; + const r = []; + if (this.iterate(this.root, (c) => { + const d = this.getNodeContent(c), a = d.length; + if (l <= i || l + a < n) + return o += d, l += a, !0; const h = o.replace(/\r\n|\r|\n/g, e); - return l.push(new Ru(h, ic(h))), o = c, r = d, !0; - }), r > 0) { - const a = o.replace(/\r\n|\r|\n/g, e); - l.push(new Ru(a, ic(a))); + return r.push(new zu(h, ld(h))), o = d, l = a, !0; + }), l > 0) { + const c = o.replace(/\r\n|\r|\n/g, e); + r.push(new zu(c, ld(c))); } - this.create(l, e, !0); + this.create(r, e, !0); } // #region Buffer API getEOL() { @@ -34382,12 +34382,12 @@ class xae { this._EOL = e, this._EOLLength = this._EOL.length, this.normalizeEOL(e); } createSnapshot(e) { - return new Lae(this, e); + return new bde(this, e); } getOffsetAt(e, t) { let i = 0, n = this.root; - for (; n !== Xe; ) - if (n.left !== Xe && n.lf_left + 1 >= e) + for (; n !== Ee; ) + if (n.left !== Ee && n.lf_left + 1 >= e) n = n.left; else if (n.lf_left + n.piece.lineFeedCnt + 1 >= e) { i += n.size_left; @@ -34401,22 +34401,22 @@ class xae { e = Math.floor(e), e = Math.max(0, e); let t = this.root, i = 0; const n = e; - for (; t !== Xe; ) + for (; t !== Ee; ) if (t.size_left !== 0 && t.size_left >= e) t = t.left; else if (t.size_left + t.piece.length >= e) { const o = this.getIndexOf(t, e - t.size_left); if (i += t.lf_left + o.index, o.index === 0) { - const r = this.getOffsetAt(i + 1, 1), l = n - r; - return new V(i + 1, l + 1); + const l = this.getOffsetAt(i + 1, 1), r = n - l; + return new Y(i + 1, r + 1); } - return new V(i + 1, o.remainder + 1); - } else if (e -= t.size_left + t.piece.length, i += t.lf_left + t.piece.lineFeedCnt, t.right === Xe) { - const o = this.getOffsetAt(i + 1, 1), r = n - e - o; - return new V(i + 1, r + 1); + return new Y(i + 1, o.remainder + 1); + } else if (e -= t.size_left + t.piece.length, i += t.lf_left + t.piece.lineFeedCnt, t.right === Ee) { + const o = this.getOffsetAt(i + 1, 1), l = n - e - o; + return new Y(i + 1, l + 1); } else t = t.right; - return new V(1, 1); + return new Y(1, 1); } getValueInRange(e, t) { if (e.startLineNumber === e.endLineNumber && e.startColumn === e.endColumn) @@ -34426,43 +34426,43 @@ class xae { } getValueInRange2(e, t) { if (e.node === t.node) { - const l = e.node, a = this._buffers[l.piece.bufferIndex].buffer, c = this.offsetInBuffer(l.piece.bufferIndex, l.piece.start); - return a.substring(c + e.remainder, c + t.remainder); + const r = e.node, c = this._buffers[r.piece.bufferIndex].buffer, d = this.offsetInBuffer(r.piece.bufferIndex, r.piece.start); + return c.substring(d + e.remainder, d + t.remainder); } let i = e.node; const n = this._buffers[i.piece.bufferIndex].buffer, o = this.offsetInBuffer(i.piece.bufferIndex, i.piece.start); - let r = n.substring(o + e.remainder, o + i.piece.length); - for (i = i.next(); i !== Xe; ) { - const l = this._buffers[i.piece.bufferIndex].buffer, a = this.offsetInBuffer(i.piece.bufferIndex, i.piece.start); + let l = n.substring(o + e.remainder, o + i.piece.length); + for (i = i.next(); i !== Ee; ) { + const r = this._buffers[i.piece.bufferIndex].buffer, c = this.offsetInBuffer(i.piece.bufferIndex, i.piece.start); if (i === t.node) { - r += l.substring(a, a + t.remainder); + l += r.substring(c, c + t.remainder); break; } else - r += l.substr(a, i.piece.length); + l += r.substr(c, i.piece.length); i = i.next(); } - return r; + return l; } getLinesContent() { const e = []; let t = 0, i = "", n = !1; return this.iterate(this.root, (o) => { - if (o === Xe) + if (o === Ee) return !0; - const r = o.piece; - let l = r.length; - if (l === 0) + const l = o.piece; + let r = l.length; + if (r === 0) return !0; - const a = this._buffers[r.bufferIndex].buffer, c = this._buffers[r.bufferIndex].lineStarts, d = r.start.line, h = r.end.line; - let u = c[d] + r.start.column; - if (n && (a.charCodeAt(u) === 10 && (u++, l--), e[t++] = i, i = "", n = !1, l === 0)) + const c = this._buffers[l.bufferIndex].buffer, d = this._buffers[l.bufferIndex].lineStarts, a = l.start.line, h = l.end.line; + let u = d[a] + l.start.column; + if (n && (c.charCodeAt(u) === 10 && (u++, r--), e[t++] = i, i = "", n = !1, r === 0)) return !0; - if (d === h) - return !this._EOLNormalized && a.charCodeAt(u + l - 1) === 13 ? (n = !0, i += a.substr(u, l - 1)) : i += a.substr(u, l), !0; - i += this._EOLNormalized ? a.substring(u, Math.max(u, c[d + 1] - this._EOLLength)) : a.substring(u, c[d + 1]).replace(/(\r\n|\r|\n)$/, ""), e[t++] = i; - for (let g = d + 1; g < h; g++) - i = this._EOLNormalized ? a.substring(c[g], c[g + 1] - this._EOLLength) : a.substring(c[g], c[g + 1]).replace(/(\r\n|\r|\n)$/, ""), e[t++] = i; - return !this._EOLNormalized && a.charCodeAt(c[h] + r.end.column - 1) === 13 ? (n = !0, r.end.column === 0 ? t-- : i = a.substr(c[h], r.end.column - 1)) : i = a.substr(c[h], r.end.column), !0; + if (a === h) + return !this._EOLNormalized && c.charCodeAt(u + r - 1) === 13 ? (n = !0, i += c.substr(u, r - 1)) : i += c.substr(u, r), !0; + i += this._EOLNormalized ? c.substring(u, Math.max(u, d[a + 1] - this._EOLLength)) : c.substring(u, d[a + 1]).replace(/(\r\n|\r|\n)$/, ""), e[t++] = i; + for (let m = a + 1; m < h; m++) + i = this._EOLNormalized ? c.substring(d[m], d[m + 1] - this._EOLLength) : c.substring(d[m], d[m + 1]).replace(/(\r\n|\r|\n)$/, ""), e[t++] = i; + return !this._EOLNormalized && c.charCodeAt(d[h] + l.end.column - 1) === 13 ? (n = !0, l.end.column === 0 ? t-- : i = c.substr(d[h], l.end.column - 1)) : i = c.substr(d[h], l.end.column), !0; }), n && (e[t++] = i, i = ""), e[t++] = i, e; } getLength() { @@ -34497,167 +34497,167 @@ class xae { } return this.getOffsetAt(e + 1, 1) - this.getOffsetAt(e, 1) - this._EOLLength; } - findMatchesInNode(e, t, i, n, o, r, l, a, c, d, h) { - const u = this._buffers[e.piece.bufferIndex], g = this.offsetInBuffer(e.piece.bufferIndex, e.piece.start), m = this.offsetInBuffer(e.piece.bufferIndex, o), f = this.offsetInBuffer(e.piece.bufferIndex, r); - let b; - const y = { line: 0, column: 0 }; - let w, C; - t._wordSeparators ? (w = u.buffer.substring(m, f), C = (S) => S + m, t.reset(0)) : (w = u.buffer, C = (S) => S, t.reset(m)); + findMatchesInNode(e, t, i, n, o, l, r, c, d, a, h) { + const u = this._buffers[e.piece.bufferIndex], m = this.offsetInBuffer(e.piece.bufferIndex, e.piece.start), b = this.offsetInBuffer(e.piece.bufferIndex, o), g = this.offsetInBuffer(e.piece.bufferIndex, l); + let Z; + const f = { line: 0, column: 0 }; + let y, W; + t._wordSeparators ? (y = u.buffer.substring(b, g), W = (G) => G + b, t.reset(0)) : (y = u.buffer, W = (G) => G, t.reset(b)); do - if (b = t.next(w), b) { - if (C(b.index) >= f) - return d; - this.positionInBuffer(e, C(b.index) - g, y); - const S = this.getLineFeedCnt(e.piece.bufferIndex, o, y), L = y.line === o.line ? y.column - o.column + n : y.column + 1, x = L + b[0].length; - if (h[d++] = Gu(new M(i + S, L, i + S, x), b, a), C(b.index) + b[0].length >= f || d >= c) - return d; + if (Z = t.next(y), Z) { + if (W(Z.index) >= g) + return a; + this.positionInBuffer(e, W(Z.index) - m, f); + const G = this.getLineFeedCnt(e.piece.bufferIndex, o, f), X = f.line === o.line ? f.column - o.column + n : f.column + 1, L = X + Z[0].length; + if (h[a++] = Fu(new I(i + G, X, i + G, L), Z, c), W(Z.index) + Z[0].length >= g || a >= d) + return a; } - while (b); - return d; + while (Z); + return a; } findMatchesLineByLine(e, t, i, n) { const o = []; - let r = 0; - const l = new Fp(t.wordSeparators, t.regex); - let a = this.nodeAt2(e.startLineNumber, e.startColumn); - if (a === null) - return []; - const c = this.nodeAt2(e.endLineNumber, e.endColumn); + let l = 0; + const r = new Pp(t.wordSeparators, t.regex); + let c = this.nodeAt2(e.startLineNumber, e.startColumn); if (c === null) return []; - let d = this.positionInBuffer(a.node, a.remainder); - const h = this.positionInBuffer(c.node, c.remainder); - if (a.node === c.node) - return this.findMatchesInNode(a.node, l, e.startLineNumber, e.startColumn, d, h, t, i, n, r, o), o; - let u = e.startLineNumber, g = a.node; - for (; g !== c.node; ) { - const f = this.getLineFeedCnt(g.piece.bufferIndex, d, g.piece.end); - if (f >= 1) { - const y = this._buffers[g.piece.bufferIndex].lineStarts, w = this.offsetInBuffer(g.piece.bufferIndex, g.piece.start), C = y[d.line + f], S = u === e.startLineNumber ? e.startColumn : 1; - if (r = this.findMatchesInNode(g, l, u, S, d, this.positionInBuffer(g, C - w), t, i, n, r, o), r >= n) + const d = this.nodeAt2(e.endLineNumber, e.endColumn); + if (d === null) + return []; + let a = this.positionInBuffer(c.node, c.remainder); + const h = this.positionInBuffer(d.node, d.remainder); + if (c.node === d.node) + return this.findMatchesInNode(c.node, r, e.startLineNumber, e.startColumn, a, h, t, i, n, l, o), o; + let u = e.startLineNumber, m = c.node; + for (; m !== d.node; ) { + const g = this.getLineFeedCnt(m.piece.bufferIndex, a, m.piece.end); + if (g >= 1) { + const f = this._buffers[m.piece.bufferIndex].lineStarts, y = this.offsetInBuffer(m.piece.bufferIndex, m.piece.start), W = f[a.line + g], G = u === e.startLineNumber ? e.startColumn : 1; + if (l = this.findMatchesInNode(m, r, u, G, a, this.positionInBuffer(m, W - y), t, i, n, l, o), l >= n) return o; - u += f; + u += g; } - const b = u === e.startLineNumber ? e.startColumn - 1 : 0; + const Z = u === e.startLineNumber ? e.startColumn - 1 : 0; if (u === e.endLineNumber) { - const y = this.getLineContent(u).substring(b, e.endColumn - 1); - return r = this._findMatchesInLine(t, l, y, e.endLineNumber, b, r, o, i, n), o; + const f = this.getLineContent(u).substring(Z, e.endColumn - 1); + return l = this._findMatchesInLine(t, r, f, e.endLineNumber, Z, l, o, i, n), o; } - if (r = this._findMatchesInLine(t, l, this.getLineContent(u).substr(b), u, b, r, o, i, n), r >= n) + if (l = this._findMatchesInLine(t, r, this.getLineContent(u).substr(Z), u, Z, l, o, i, n), l >= n) return o; - u++, a = this.nodeAt2(u, 1), g = a.node, d = this.positionInBuffer(a.node, a.remainder); + u++, c = this.nodeAt2(u, 1), m = c.node, a = this.positionInBuffer(c.node, c.remainder); } if (u === e.endLineNumber) { - const f = u === e.startLineNumber ? e.startColumn - 1 : 0, b = this.getLineContent(u).substring(f, e.endColumn - 1); - return r = this._findMatchesInLine(t, l, b, e.endLineNumber, f, r, o, i, n), o; - } - const m = u === e.startLineNumber ? e.startColumn : 1; - return r = this.findMatchesInNode(c.node, l, u, m, d, h, t, i, n, r, o), o; - } - _findMatchesInLine(e, t, i, n, o, r, l, a, c) { - const d = e.wordSeparators; - if (!a && e.simpleSearch) { - const u = e.simpleSearch, g = u.length, m = i.length; - let f = -g; - for (; (f = i.indexOf(u, f + g)) !== -1; ) - if ((!d || cX(d, i, m, f, g)) && (l[r++] = new t1(new M(n, f + 1 + o, n, f + 1 + g + o), null), r >= c)) - return r; - return r; + const g = u === e.startLineNumber ? e.startColumn - 1 : 0, Z = this.getLineContent(u).substring(g, e.endColumn - 1); + return l = this._findMatchesInLine(t, r, Z, e.endLineNumber, g, l, o, i, n), o; + } + const b = u === e.startLineNumber ? e.startColumn : 1; + return l = this.findMatchesInNode(d.node, r, u, b, a, h, t, i, n, l, o), o; + } + _findMatchesInLine(e, t, i, n, o, l, r, c, d) { + const a = e.wordSeparators; + if (!c && e.simpleSearch) { + const u = e.simpleSearch, m = u.length, b = i.length; + let g = -m; + for (; (g = i.indexOf(u, g + m)) !== -1; ) + if ((!a || YJ(a, i, b, g, m)) && (r[l++] = new mW(new I(n, g + 1 + o, n, g + 1 + m + o), null), l >= d)) + return l; + return l; } let h; t.reset(0); do - if (h = t.next(i), h && (l[r++] = Gu(new M(n, h.index + 1 + o, n, h.index + 1 + h[0].length + o), h, a), r >= c)) - return r; + if (h = t.next(i), h && (r[l++] = Fu(new I(n, h.index + 1 + o, n, h.index + 1 + h[0].length + o), h, c), l >= d)) + return l; while (h); - return r; + return l; } // #endregion // #region Piece Table insert(e, t, i = !1) { - if (this._EOLNormalized = this._EOLNormalized && i, this._lastVisitedLine.lineNumber = 0, this._lastVisitedLine.value = "", this.root !== Xe) { - const { node: n, remainder: o, nodeStartOffset: r } = this.nodeAt(e), l = n.piece, a = l.bufferIndex, c = this.positionInBuffer(n, o); - if (n.piece.bufferIndex === 0 && l.end.line === this._lastChangeBufferPos.line && l.end.column === this._lastChangeBufferPos.column && r + l.length === e && t.length < Qa) { + if (this._EOLNormalized = this._EOLNormalized && i, this._lastVisitedLine.lineNumber = 0, this._lastVisitedLine.value = "", this.root !== Ee) { + const { node: n, remainder: o, nodeStartOffset: l } = this.nodeAt(e), r = n.piece, c = r.bufferIndex, d = this.positionInBuffer(n, o); + if (n.piece.bufferIndex === 0 && r.end.line === this._lastChangeBufferPos.line && r.end.column === this._lastChangeBufferPos.column && l + r.length === e && t.length < ed) { this.appendToNode(n, t), this.computeBufferMetadata(); return; } - if (r === e) + if (l === e) this.insertContentToNodeLeft(t, n), this._searchCache.validate(e); - else if (r + n.piece.length > e) { - const d = []; - let h = new Us(l.bufferIndex, c, l.end, this.getLineFeedCnt(l.bufferIndex, c, l.end), this.offsetInBuffer(a, l.end) - this.offsetInBuffer(a, c)); + else if (l + n.piece.length > e) { + const a = []; + let h = new Os(r.bufferIndex, d, r.end, this.getLineFeedCnt(r.bufferIndex, d, r.end), this.offsetInBuffer(c, r.end) - this.offsetInBuffer(c, d)); if (this.shouldCheckCRLF() && this.endWithCR(t) && this.nodeCharCodeAt(n, o) === 10) { - const f = { line: h.start.line + 1, column: 0 }; - h = new Us(h.bufferIndex, f, h.end, this.getLineFeedCnt(h.bufferIndex, f, h.end), h.length - 1), t += ` + const g = { line: h.start.line + 1, column: 0 }; + h = new Os(h.bufferIndex, g, h.end, this.getLineFeedCnt(h.bufferIndex, g, h.end), h.length - 1), t += ` `; } if (this.shouldCheckCRLF() && this.startWithLF(t)) if (this.nodeCharCodeAt(n, o - 1) === 13) { - const f = this.positionInBuffer(n, o - 1); - this.deleteNodeTail(n, f), t = "\r" + t, n.piece.length === 0 && d.push(n); + const g = this.positionInBuffer(n, o - 1); + this.deleteNodeTail(n, g), t = "\r" + t, n.piece.length === 0 && a.push(n); } else - this.deleteNodeTail(n, c); + this.deleteNodeTail(n, d); else - this.deleteNodeTail(n, c); + this.deleteNodeTail(n, d); const u = this.createNewPieces(t); h.length > 0 && this.rbInsertRight(n, h); - let g = n; - for (let m = 0; m < u.length; m++) - g = this.rbInsertRight(g, u[m]); - this.deleteNodes(d); + let m = n; + for (let b = 0; b < u.length; b++) + m = this.rbInsertRight(m, u[b]); + this.deleteNodes(a); } else this.insertContentToNodeRight(t, n); } else { const n = this.createNewPieces(t); let o = this.rbInsertLeft(null, n[0]); - for (let r = 1; r < n.length; r++) - o = this.rbInsertRight(o, n[r]); + for (let l = 1; l < n.length; l++) + o = this.rbInsertRight(o, n[l]); } this.computeBufferMetadata(); } delete(e, t) { - if (this._lastVisitedLine.lineNumber = 0, this._lastVisitedLine.value = "", t <= 0 || this.root === Xe) + if (this._lastVisitedLine.lineNumber = 0, this._lastVisitedLine.value = "", t <= 0 || this.root === Ee) return; - const i = this.nodeAt(e), n = this.nodeAt(e + t), o = i.node, r = n.node; - if (o === r) { - const u = this.positionInBuffer(o, i.remainder), g = this.positionInBuffer(o, n.remainder); + const i = this.nodeAt(e), n = this.nodeAt(e + t), o = i.node, l = n.node; + if (o === l) { + const u = this.positionInBuffer(o, i.remainder), m = this.positionInBuffer(o, n.remainder); if (i.nodeStartOffset === e) { if (t === o.piece.length) { - const m = o.next(); - hS(this, o), this.validateCRLFWithPrevNode(m), this.computeBufferMetadata(); + const b = o.next(); + L1(this, o), this.validateCRLFWithPrevNode(b), this.computeBufferMetadata(); return; } - this.deleteNodeHead(o, g), this._searchCache.validate(e), this.validateCRLFWithPrevNode(o), this.computeBufferMetadata(); + this.deleteNodeHead(o, m), this._searchCache.validate(e), this.validateCRLFWithPrevNode(o), this.computeBufferMetadata(); return; } if (i.nodeStartOffset + o.piece.length === e + t) { this.deleteNodeTail(o, u), this.validateCRLFWithNextNode(o), this.computeBufferMetadata(); return; } - this.shrinkNode(o, u, g), this.computeBufferMetadata(); + this.shrinkNode(o, u, m), this.computeBufferMetadata(); return; } - const l = [], a = this.positionInBuffer(o, i.remainder); - this.deleteNodeTail(o, a), this._searchCache.validate(e), o.piece.length === 0 && l.push(o); - const c = this.positionInBuffer(r, n.remainder); - this.deleteNodeHead(r, c), r.piece.length === 0 && l.push(r); - const d = o.next(); - for (let u = d; u !== Xe && u !== r; u = u.next()) - l.push(u); + const r = [], c = this.positionInBuffer(o, i.remainder); + this.deleteNodeTail(o, c), this._searchCache.validate(e), o.piece.length === 0 && r.push(o); + const d = this.positionInBuffer(l, n.remainder); + this.deleteNodeHead(l, d), l.piece.length === 0 && r.push(l); + const a = o.next(); + for (let u = a; u !== Ee && u !== l; u = u.next()) + r.push(u); const h = o.piece.length === 0 ? o.prev() : o; - this.deleteNodes(l), this.validateCRLFWithNextNode(h), this.computeBufferMetadata(); + this.deleteNodes(r), this.validateCRLFWithNextNode(h), this.computeBufferMetadata(); } insertContentToNodeLeft(e, t) { const i = []; if (this.shouldCheckCRLF() && this.endWithCR(e) && this.startWithLF(t)) { - const r = t.piece, l = { line: r.start.line + 1, column: 0 }, a = new Us(r.bufferIndex, l, r.end, this.getLineFeedCnt(r.bufferIndex, l, r.end), r.length - 1); - t.piece = a, e += ` -`, tc(this, t, -1, -1), t.piece.length === 0 && i.push(t); + const l = t.piece, r = { line: l.start.line + 1, column: 0 }, c = new Os(l.bufferIndex, r, l.end, this.getLineFeedCnt(l.bufferIndex, r, l.end), l.length - 1); + t.piece = c, e += ` +`, od(this, t, -1, -1), t.piece.length === 0 && i.push(t); } const n = this.createNewPieces(e); let o = this.rbInsertLeft(t, n[n.length - 1]); - for (let r = n.length - 2; r >= 0; r--) - o = this.rbInsertLeft(o, n[r]); + for (let l = n.length - 2; l >= 0; l--) + o = this.rbInsertLeft(o, n[l]); this.validateCRLFWithPrevNode(o), this.deleteNodes(i); } insertContentToNodeRight(e, t) { @@ -34665,23 +34665,23 @@ class xae { `); const i = this.createNewPieces(e), n = this.rbInsertRight(t, i[0]); let o = n; - for (let r = 1; r < i.length; r++) - o = this.rbInsertRight(o, i[r]); + for (let l = 1; l < i.length; l++) + o = this.rbInsertRight(o, i[l]); this.validateCRLFWithPrevNode(n); } positionInBuffer(e, t, i) { - const n = e.piece, o = e.piece.bufferIndex, r = this._buffers[o].lineStarts, a = r[n.start.line] + n.start.column + t; - let c = n.start.line, d = n.end.line, h = 0, u = 0, g = 0; - for (; c <= d && (h = c + (d - c) / 2 | 0, g = r[h], h !== d); ) - if (u = r[h + 1], a < g) - d = h - 1; - else if (a >= u) - c = h + 1; + const n = e.piece, o = e.piece.bufferIndex, l = this._buffers[o].lineStarts, c = l[n.start.line] + n.start.column + t; + let d = n.start.line, a = n.end.line, h = 0, u = 0, m = 0; + for (; d <= a && (h = d + (a - d) / 2 | 0, m = l[h], h !== a); ) + if (u = l[h + 1], c < m) + a = h - 1; + else if (c >= u) + d = h + 1; else break; - return i ? (i.line = h, i.column = a - g, null) : { + return i ? (i.line = h, i.column = c - m, null) : { line: h, - column: a - g + column: c - m }; } getLineFeedCnt(e, t, i) { @@ -34690,110 +34690,110 @@ class xae { const n = this._buffers[e].lineStarts; if (i.line === n.length - 1) return i.line - t.line; - const o = n[i.line + 1], r = n[i.line] + i.column; - if (o > r + 1) + const o = n[i.line + 1], l = n[i.line] + i.column; + if (o > l + 1) return i.line - t.line; - const l = r - 1; - return this._buffers[e].buffer.charCodeAt(l) === 13 ? i.line - t.line + 1 : i.line - t.line; + const r = l - 1; + return this._buffers[e].buffer.charCodeAt(r) === 13 ? i.line - t.line + 1 : i.line - t.line; } offsetInBuffer(e, t) { return this._buffers[e].lineStarts[t.line] + t.column; } deleteNodes(e) { for (let t = 0; t < e.length; t++) - hS(this, e[t]); + L1(this, e[t]); } createNewPieces(e) { - if (e.length > Qa) { - const d = []; - for (; e.length > Qa; ) { - const u = e.charCodeAt(Qa - 1); - let g; - u === 13 || u >= 55296 && u <= 56319 ? (g = e.substring(0, Qa - 1), e = e.substring(Qa - 1)) : (g = e.substring(0, Qa), e = e.substring(Qa)); - const m = ic(g); - d.push(new Us( + if (e.length > ed) { + const a = []; + for (; e.length > ed; ) { + const u = e.charCodeAt(ed - 1); + let m; + u === 13 || u >= 55296 && u <= 56319 ? (m = e.substring(0, ed - 1), e = e.substring(ed - 1)) : (m = e.substring(0, ed), e = e.substring(ed)); + const b = ld(m); + a.push(new Os( this._buffers.length, /* buffer index */ { line: 0, column: 0 }, - { line: m.length - 1, column: g.length - m[m.length - 1] }, - m.length - 1, - g.length - )), this._buffers.push(new Ru(g, m)); + { line: b.length - 1, column: m.length - b[b.length - 1] }, + b.length - 1, + m.length + )), this._buffers.push(new zu(m, b)); } - const h = ic(e); - return d.push(new Us( + const h = ld(e); + return a.push(new Os( this._buffers.length, /* buffer index */ { line: 0, column: 0 }, { line: h.length - 1, column: e.length - h[h.length - 1] }, h.length - 1, e.length - )), this._buffers.push(new Ru(e, h)), d; + )), this._buffers.push(new zu(e, h)), a; } let t = this._buffers[0].buffer.length; - const i = ic(e, !1); + const i = ld(e, !1); let n = this._lastChangeBufferPos; if (this._buffers[0].lineStarts[this._buffers[0].lineStarts.length - 1] === t && t !== 0 && this.startWithLF(e) && this.endWithCR(this._buffers[0].buffer)) { this._lastChangeBufferPos = { line: this._lastChangeBufferPos.line, column: this._lastChangeBufferPos.column + 1 }, n = this._lastChangeBufferPos; - for (let d = 0; d < i.length; d++) - i[d] += t + 1; + for (let a = 0; a < i.length; a++) + i[a] += t + 1; this._buffers[0].lineStarts = this._buffers[0].lineStarts.concat(i.slice(1)), this._buffers[0].buffer += "_" + e, t += 1; } else { if (t !== 0) - for (let d = 0; d < i.length; d++) - i[d] += t; + for (let a = 0; a < i.length; a++) + i[a] += t; this._buffers[0].lineStarts = this._buffers[0].lineStarts.concat(i.slice(1)), this._buffers[0].buffer += e; } - const o = this._buffers[0].buffer.length, r = this._buffers[0].lineStarts.length - 1, l = o - this._buffers[0].lineStarts[r], a = { line: r, column: l }, c = new Us( + const o = this._buffers[0].buffer.length, l = this._buffers[0].lineStarts.length - 1, r = o - this._buffers[0].lineStarts[l], c = { line: l, column: r }, d = new Os( 0, /** todo@peng */ n, - a, - this.getLineFeedCnt(0, n, a), + c, + this.getLineFeedCnt(0, n, c), o - t ); - return this._lastChangeBufferPos = a, [c]; + return this._lastChangeBufferPos = c, [d]; } getLineRawContent(e, t = 0) { let i = this.root, n = ""; const o = this._searchCache.get2(e); if (o) { i = o.node; - const r = this.getAccumulatedValue(i, e - o.nodeStartLineNumber - 1), l = this._buffers[i.piece.bufferIndex].buffer, a = this.offsetInBuffer(i.piece.bufferIndex, i.piece.start); + const l = this.getAccumulatedValue(i, e - o.nodeStartLineNumber - 1), r = this._buffers[i.piece.bufferIndex].buffer, c = this.offsetInBuffer(i.piece.bufferIndex, i.piece.start); if (o.nodeStartLineNumber + i.piece.lineFeedCnt === e) - n = l.substring(a + r, a + i.piece.length); + n = r.substring(c + l, c + i.piece.length); else { - const c = this.getAccumulatedValue(i, e - o.nodeStartLineNumber); - return l.substring(a + r, a + c - t); + const d = this.getAccumulatedValue(i, e - o.nodeStartLineNumber); + return r.substring(c + l, c + d - t); } } else { - let r = 0; - const l = e; - for (; i !== Xe; ) - if (i.left !== Xe && i.lf_left >= e - 1) + let l = 0; + const r = e; + for (; i !== Ee; ) + if (i.left !== Ee && i.lf_left >= e - 1) i = i.left; else if (i.lf_left + i.piece.lineFeedCnt > e - 1) { - const a = this.getAccumulatedValue(i, e - i.lf_left - 2), c = this.getAccumulatedValue(i, e - i.lf_left - 1), d = this._buffers[i.piece.bufferIndex].buffer, h = this.offsetInBuffer(i.piece.bufferIndex, i.piece.start); - return r += i.size_left, this._searchCache.set({ + const c = this.getAccumulatedValue(i, e - i.lf_left - 2), d = this.getAccumulatedValue(i, e - i.lf_left - 1), a = this._buffers[i.piece.bufferIndex].buffer, h = this.offsetInBuffer(i.piece.bufferIndex, i.piece.start); + return l += i.size_left, this._searchCache.set({ node: i, - nodeStartOffset: r, - nodeStartLineNumber: l - (e - 1 - i.lf_left) - }), d.substring(h + a, h + c - t); + nodeStartOffset: l, + nodeStartLineNumber: r - (e - 1 - i.lf_left) + }), a.substring(h + c, h + d - t); } else if (i.lf_left + i.piece.lineFeedCnt === e - 1) { - const a = this.getAccumulatedValue(i, e - i.lf_left - 2), c = this._buffers[i.piece.bufferIndex].buffer, d = this.offsetInBuffer(i.piece.bufferIndex, i.piece.start); - n = c.substring(d + a, d + i.piece.length); + const c = this.getAccumulatedValue(i, e - i.lf_left - 2), d = this._buffers[i.piece.bufferIndex].buffer, a = this.offsetInBuffer(i.piece.bufferIndex, i.piece.start); + n = d.substring(a + c, a + i.piece.length); break; } else - e -= i.lf_left + i.piece.lineFeedCnt, r += i.size_left + i.piece.length, i = i.right; + e -= i.lf_left + i.piece.lineFeedCnt, l += i.size_left + i.piece.length, i = i.right; } - for (i = i.next(); i !== Xe; ) { - const r = this._buffers[i.piece.bufferIndex].buffer; + for (i = i.next(); i !== Ee; ) { + const l = this._buffers[i.piece.bufferIndex].buffer; if (i.piece.lineFeedCnt > 0) { - const l = this.getAccumulatedValue(i, 0), a = this.offsetInBuffer(i.piece.bufferIndex, i.piece.start); - return n += r.substring(a, a + l - t), n; + const r = this.getAccumulatedValue(i, 0), c = this.offsetInBuffer(i.piece.bufferIndex, i.piece.start); + return n += l.substring(c, c + r - t), n; } else { - const l = this.offsetInBuffer(i.piece.bufferIndex, i.piece.start); - n += r.substr(l, i.piece.length); + const r = this.offsetInBuffer(i.piece.bufferIndex, i.piece.start); + n += l.substr(r, i.piece.length); } i = i.next(); } @@ -34801,7 +34801,7 @@ class xae { } computeBufferMetadata() { let e = this.root, t = 1, i = 0; - for (; e !== Xe; ) + for (; e !== Ee; ) t += e.lf_left + e.piece.lineFeedCnt, i += e.size_left + e.piece.length, e = e.right; this._lineCnt = t, this._length = i, this._searchCache.validate(this._length); } @@ -34809,9 +34809,9 @@ class xae { getIndexOf(e, t) { const i = e.piece, n = this.positionInBuffer(e, t), o = n.line - i.start.line; if (this.offsetInBuffer(i.bufferIndex, i.end) - this.offsetInBuffer(i.bufferIndex, i.start) === t) { - const r = this.getLineFeedCnt(e.piece.bufferIndex, i.start, n); - if (r !== o) - return { index: r, remainder: 0 }; + const l = this.getLineFeedCnt(e.piece.bufferIndex, i.start, n); + if (l !== o) + return { index: l, remainder: 0 }; } return { index: o, remainder: n.column }; } @@ -34822,34 +34822,34 @@ class xae { return o > i.end.line ? n[i.end.line] + i.end.column - n[i.start.line] - i.start.column : n[o] - n[i.start.line] - i.start.column; } deleteNodeTail(e, t) { - const i = e.piece, n = i.lineFeedCnt, o = this.offsetInBuffer(i.bufferIndex, i.end), r = t, l = this.offsetInBuffer(i.bufferIndex, r), a = this.getLineFeedCnt(i.bufferIndex, i.start, r), c = a - n, d = l - o, h = i.length + d; - e.piece = new Us(i.bufferIndex, i.start, r, a, h), tc(this, e, d, c); + const i = e.piece, n = i.lineFeedCnt, o = this.offsetInBuffer(i.bufferIndex, i.end), l = t, r = this.offsetInBuffer(i.bufferIndex, l), c = this.getLineFeedCnt(i.bufferIndex, i.start, l), d = c - n, a = r - o, h = i.length + a; + e.piece = new Os(i.bufferIndex, i.start, l, c, h), od(this, e, a, d); } deleteNodeHead(e, t) { - const i = e.piece, n = i.lineFeedCnt, o = this.offsetInBuffer(i.bufferIndex, i.start), r = t, l = this.getLineFeedCnt(i.bufferIndex, r, i.end), a = this.offsetInBuffer(i.bufferIndex, r), c = l - n, d = o - a, h = i.length + d; - e.piece = new Us(i.bufferIndex, r, i.end, l, h), tc(this, e, d, c); + const i = e.piece, n = i.lineFeedCnt, o = this.offsetInBuffer(i.bufferIndex, i.start), l = t, r = this.getLineFeedCnt(i.bufferIndex, l, i.end), c = this.offsetInBuffer(i.bufferIndex, l), d = r - n, a = o - c, h = i.length + a; + e.piece = new Os(i.bufferIndex, l, i.end, r, h), od(this, e, a, d); } shrinkNode(e, t, i) { - const n = e.piece, o = n.start, r = n.end, l = n.length, a = n.lineFeedCnt, c = t, d = this.getLineFeedCnt(n.bufferIndex, n.start, c), h = this.offsetInBuffer(n.bufferIndex, t) - this.offsetInBuffer(n.bufferIndex, o); - e.piece = new Us(n.bufferIndex, n.start, c, d, h), tc(this, e, h - l, d - a); - const u = new Us(n.bufferIndex, i, r, this.getLineFeedCnt(n.bufferIndex, i, r), this.offsetInBuffer(n.bufferIndex, r) - this.offsetInBuffer(n.bufferIndex, i)), g = this.rbInsertRight(e, u); - this.validateCRLFWithPrevNode(g); + const n = e.piece, o = n.start, l = n.end, r = n.length, c = n.lineFeedCnt, d = t, a = this.getLineFeedCnt(n.bufferIndex, n.start, d), h = this.offsetInBuffer(n.bufferIndex, t) - this.offsetInBuffer(n.bufferIndex, o); + e.piece = new Os(n.bufferIndex, n.start, d, a, h), od(this, e, h - r, a - c); + const u = new Os(n.bufferIndex, i, l, this.getLineFeedCnt(n.bufferIndex, i, l), this.offsetInBuffer(n.bufferIndex, l) - this.offsetInBuffer(n.bufferIndex, i)), m = this.rbInsertRight(e, u); + this.validateCRLFWithPrevNode(m); } appendToNode(e, t) { this.adjustCarriageReturnFromNext(t, e) && (t += ` `); const i = this.shouldCheckCRLF() && this.startWithLF(t) && this.endWithCR(e), n = this._buffers[0].buffer.length; this._buffers[0].buffer += t; - const o = ic(t, !1); - for (let g = 0; g < o.length; g++) - o[g] += n; + const o = ld(t, !1); + for (let m = 0; m < o.length; m++) + o[m] += n; if (i) { - const g = this._buffers[0].lineStarts[this._buffers[0].lineStarts.length - 2]; - this._buffers[0].lineStarts.pop(), this._lastChangeBufferPos = { line: this._lastChangeBufferPos.line - 1, column: n - g }; + const m = this._buffers[0].lineStarts[this._buffers[0].lineStarts.length - 2]; + this._buffers[0].lineStarts.pop(), this._lastChangeBufferPos = { line: this._lastChangeBufferPos.line - 1, column: n - m }; } this._buffers[0].lineStarts = this._buffers[0].lineStarts.concat(o.slice(1)); - const r = this._buffers[0].lineStarts.length - 1, l = this._buffers[0].buffer.length - this._buffers[0].lineStarts[r], a = { line: r, column: l }, c = e.piece.length + t.length, d = e.piece.lineFeedCnt, h = this.getLineFeedCnt(0, e.piece.start, a), u = h - d; - e.piece = new Us(e.piece.bufferIndex, e.piece.start, a, h, c), this._lastChangeBufferPos = a, tc(this, e, t.length, u); + const l = this._buffers[0].lineStarts.length - 1, r = this._buffers[0].buffer.length - this._buffers[0].lineStarts[l], c = { line: l, column: r }, d = e.piece.length + t.length, a = e.piece.lineFeedCnt, h = this.getLineFeedCnt(0, e.piece.start, c), u = h - a; + e.piece = new Os(e.piece.bufferIndex, e.piece.start, c, h, d), this._lastChangeBufferPos = c, od(this, e, t.length, u); } nodeAt(e) { let t = this.root; @@ -34861,7 +34861,7 @@ class xae { remainder: e - i.nodeStartOffset }; let n = 0; - for (; t !== Xe; ) + for (; t !== Ee; ) if (t.size_left > e) t = t.left; else if (t.size_left + t.piece.length >= e) { @@ -34878,14 +34878,14 @@ class xae { } nodeAt2(e, t) { let i = this.root, n = 0; - for (; i !== Xe; ) - if (i.left !== Xe && i.lf_left >= e - 1) + for (; i !== Ee; ) + if (i.left !== Ee && i.lf_left >= e - 1) i = i.left; else if (i.lf_left + i.piece.lineFeedCnt > e - 1) { - const o = this.getAccumulatedValue(i, e - i.lf_left - 2), r = this.getAccumulatedValue(i, e - i.lf_left - 1); + const o = this.getAccumulatedValue(i, e - i.lf_left - 2), l = this.getAccumulatedValue(i, e - i.lf_left - 1); return n += i.size_left, { node: i, - remainder: Math.min(o + t - 1, r), + remainder: Math.min(o + t - 1, l), nodeStartOffset: n }; } else if (i.lf_left + i.piece.lineFeedCnt === e - 1) { @@ -34900,13 +34900,13 @@ class xae { break; } else e -= i.lf_left + i.piece.lineFeedCnt, n += i.size_left + i.piece.length, i = i.right; - for (i = i.next(); i !== Xe; ) { + for (i = i.next(); i !== Ee; ) { if (i.piece.lineFeedCnt > 0) { - const o = this.getAccumulatedValue(i, 0), r = this.offsetOfNode(i); + const o = this.getAccumulatedValue(i, 0), l = this.offsetOfNode(i); return { node: i, remainder: Math.min(t - 1, o), - nodeStartOffset: r + nodeStartOffset: l }; } else if (i.piece.length >= t - 1) { const o = this.offsetOfNode(i); @@ -34944,13 +34944,13 @@ class xae { startWithLF(e) { if (typeof e == "string") return e.charCodeAt(0) === 10; - if (e === Xe || e.piece.lineFeedCnt === 0) + if (e === Ee || e.piece.lineFeedCnt === 0) return !1; const t = e.piece, i = this._buffers[t.bufferIndex].lineStarts, n = t.start.line, o = i[n] + t.start.column; return n === i.length - 1 || i[n + 1] > o + 1 ? !1 : this._buffers[t.bufferIndex].buffer.charCodeAt(o) === 10; } endWithCR(e) { - return typeof e == "string" ? e.charCodeAt(e.length - 1) === 13 : e === Xe || e.piece.lineFeedCnt === 0 ? !1 : this.nodeCharCodeAt(e, e.piece.length - 1) === 13; + return typeof e == "string" ? e.charCodeAt(e.length - 1) === 13 : e === Ee || e.piece.lineFeedCnt === 0 ? !1 : this.nodeCharCodeAt(e, e.piece.length - 1) === 13; } validateCRLFWithPrevNode(e) { if (this.shouldCheckCRLF() && this.startWithLF(e)) { @@ -34968,15 +34968,15 @@ class xae { const i = [], n = this._buffers[e.piece.bufferIndex].lineStarts; let o; e.piece.end.column === 0 ? o = { line: e.piece.end.line - 1, column: n[e.piece.end.line] - n[e.piece.end.line - 1] - 1 } : o = { line: e.piece.end.line, column: e.piece.end.column - 1 }; - const r = e.piece.length - 1, l = e.piece.lineFeedCnt - 1; - e.piece = new Us(e.piece.bufferIndex, e.piece.start, o, l, r), tc(this, e, -1, -1), e.piece.length === 0 && i.push(e); - const a = { line: t.piece.start.line + 1, column: 0 }, c = t.piece.length - 1, d = this.getLineFeedCnt(t.piece.bufferIndex, a, t.piece.end); - t.piece = new Us(t.piece.bufferIndex, a, t.piece.end, d, c), tc(this, t, -1, -1), t.piece.length === 0 && i.push(t); + const l = e.piece.length - 1, r = e.piece.lineFeedCnt - 1; + e.piece = new Os(e.piece.bufferIndex, e.piece.start, o, r, l), od(this, e, -1, -1), e.piece.length === 0 && i.push(e); + const c = { line: t.piece.start.line + 1, column: 0 }, d = t.piece.length - 1, a = this.getLineFeedCnt(t.piece.bufferIndex, c, t.piece.end); + t.piece = new Os(t.piece.bufferIndex, c, t.piece.end, a, d), od(this, t, -1, -1), t.piece.length === 0 && i.push(t); const h = this.createNewPieces(`\r `); this.rbInsertRight(e, h[0]); for (let u = 0; u < i.length; u++) - hS(this, i[u]); + L1(this, i[u]); } adjustCarriageReturnFromNext(e, t) { if (this.shouldCheckCRLF() && this.endWithCR(e)) { @@ -34984,10 +34984,10 @@ class xae { if (this.startWithLF(i)) { if (e += ` `, i.piece.length === 1) - hS(this, i); + L1(this, i); else { - const n = i.piece, o = { line: n.start.line + 1, column: 0 }, r = n.length - 1, l = this.getLineFeedCnt(n.bufferIndex, o, n.end); - i.piece = new Us(n.bufferIndex, o, n.end, l, r), tc(this, i, -1, -1); + const n = i.piece, o = { line: n.start.line + 1, column: 0 }, l = n.length - 1, r = this.getLineFeedCnt(n.bufferIndex, o, n.end); + i.piece = new Os(n.bufferIndex, o, n.end, r, l), od(this, i, -1, -1); } return !0; } @@ -34998,13 +34998,13 @@ class xae { // #endregion // #region Tree operations iterate(e, t) { - if (e === Xe) - return t(Xe); + if (e === Ee) + return t(Ee); const i = this.iterate(e.left, t); return i && t(e) && this.iterate(e.right, t); } getNodeContent(e) { - if (e === Xe) + if (e === Ee) return ""; const t = this._buffers[e.piece.bufferIndex], i = e.piece, n = this.offsetInBuffer(i.bufferIndex, i.start), o = this.offsetInBuffer(i.bufferIndex, i.end); return t.buffer.substring(n, o); @@ -35021,20 +35021,20 @@ class xae { * z */ rbInsertRight(e, t) { - const i = new Tv( + const i = new $w( t, 1 /* NodeColor.Red */ ); - if (i.left = Xe, i.right = Xe, i.parent = Xe, i.size_left = 0, i.lf_left = 0, this.root === Xe) + if (i.left = Ee, i.right = Ee, i.parent = Ee, i.size_left = 0, i.lf_left = 0, this.root === Ee) this.root = i, i.color = 0; - else if (e.right === Xe) + else if (e.right === Ee) e.right = i, i.parent = e; else { - const o = rX(e.right); + const o = wJ(e.right); o.left = i, i.parent = o; } - return _Y(this, i), i; + return qF(this, i), i; } /** * node node @@ -35044,25 +35044,25 @@ class xae { * z */ rbInsertLeft(e, t) { - const i = new Tv( + const i = new $w( t, 1 /* NodeColor.Red */ ); - if (i.left = Xe, i.right = Xe, i.parent = Xe, i.size_left = 0, i.lf_left = 0, this.root === Xe) + if (i.left = Ee, i.right = Ee, i.parent = Ee, i.size_left = 0, i.lf_left = 0, this.root === Ee) this.root = i, i.color = 0; - else if (e.left === Xe) + else if (e.left === Ee) e.left = i, i.parent = e; else { - const n = aK(e.left); + const n = KQ(e.left); n.right = i, i.parent = n; } - return _Y(this, i), i; + return qF(this, i), i; } } -class Df extends R { - constructor(e, t, i, n, o, r, l) { - super(), this._onDidChangeContent = this._register(new k()), this._BOM = t, this._mightContainNonBasicASCII = !r, this._mightContainRTL = n, this._mightContainUnusualLineTerminators = o, this._pieceTree = new xae(e, i, l); +class Eg extends J { + constructor(e, t, i, n, o, l, r) { + super(), this._onDidChangeContent = this._register(new k()), this._BOM = t, this._mightContainNonBasicASCII = !l, this._mightContainRTL = n, this._mightContainUnusualLineTerminators = o, this._pieceTree = new gde(e, i, r); } mightContainRTL() { return this._mightContainRTL; @@ -35093,7 +35093,7 @@ class Df extends R { } getRangeAt(e, t) { const i = e + t, n = this.getPositionAt(e), o = this.getPositionAt(i); - return new M(n.lineNumber, n.column, o.lineNumber, o.column); + return new I(n.lineNumber, n.column, o.lineNumber, o.column); } getValueInRange(e, t = 0) { if (e.isEmpty()) @@ -35108,10 +35108,10 @@ class Df extends R { return e.endColumn - e.startColumn; const i = this.getOffsetAt(e.startLineNumber, e.startColumn), n = this.getOffsetAt(e.endLineNumber, e.endColumn); let o = 0; - const r = this._getEndOfLine(t), l = this.getEOL(); - if (r.length !== l.length) { - const a = r.length - l.length, c = e.endLineNumber - e.startLineNumber; - o = a * c; + const l = this._getEndOfLine(t), r = this.getEOL(); + if (l.length !== r.length) { + const c = l.length - r.length, d = e.endLineNumber - e.startLineNumber; + o = c * d; } return n - i + o; } @@ -35119,10 +35119,10 @@ class Df extends R { if (this._mightContainNonBasicASCII) { let i = 0; const n = e.startLineNumber, o = e.endLineNumber; - for (let r = n; r <= o; r++) { - const l = this.getLineContent(r), a = r === n ? e.startColumn - 1 : 0, c = r === o ? e.endColumn - 1 : l.length; - for (let d = a; d < c; d++) - Hi(l.charCodeAt(d)) ? (i = i + 1, d = d + 1) : i = i + 1; + for (let l = n; l <= o; l++) { + const r = this.getLineContent(l), c = l === n ? e.startColumn - 1 : 0, d = l === o ? e.endColumn - 1 : r.length; + for (let a = c; a < d; a++) + Bi(r.charCodeAt(a)) ? (i = i + 1, a = a + 1) : i = i + 1; } return i += this._getEndOfLine(t).length * (o - n), i; } @@ -35147,11 +35147,11 @@ class Df extends R { return this._pieceTree.getLineLength(e); } getLineFirstNonWhitespaceColumn(e) { - const t = qn(this.getLineContent(e)); + const t = es(this.getLineContent(e)); return t === -1 ? 0 : t + 1; } getLineLastNonWhitespaceColumn(e) { - const t = Ml(this.getLineContent(e)); + const t = Rr(this.getLineContent(e)); return t === -1 ? 0 : t + 2; } _getEndOfLine(e) { @@ -35172,88 +35172,88 @@ class Df extends R { this._pieceTree.setEOL(e); } applyEdits(e, t, i) { - let n = this._mightContainRTL, o = this._mightContainUnusualLineTerminators, r = this._mightContainNonBasicASCII, l = !0, a = []; - for (let f = 0; f < e.length; f++) { - const b = e[f]; - l && b._isTracked && (l = !1); - const y = b.range; - if (b.text) { - let x = !0; - r || (x = !uC(b.text), r = x), !n && x && (n = lb(b.text)), !o && x && (o = YH(b.text)); - } - let w = "", C = 0, S = 0, L = 0; - if (b.text) { - let x; - [C, S, L, x] = kh(b.text); - const Z = this.getEOL(); - x === 0 || x === (Z === `\r -` ? 2 : 1) ? w = b.text : w = b.text.replace(/\r\n|\r|\n/g, Z); - } - a[f] = { - sortIndex: f, - identifier: b.identifier || null, - range: y, - rangeOffset: this.getOffsetAt(y.startLineNumber, y.startColumn), - rangeLength: this.getValueLengthInRange(y), - text: w, - eolCount: C, - firstLineLength: S, - lastLineLength: L, - forceMoveMarkers: !!b.forceMoveMarkers, - isAutoWhitespaceEdit: b.isAutoWhitespaceEdit || !1 + let n = this._mightContainRTL, o = this._mightContainUnusualLineTerminators, l = this._mightContainNonBasicASCII, r = !0, c = []; + for (let g = 0; g < e.length; g++) { + const Z = e[g]; + r && Z._isTracked && (r = !1); + const f = Z.range; + if (Z.text) { + let L = !0; + l || (L = !IG(Z.text), l = L), !n && L && (n = mZ(Z.text)), !o && L && (o = VB(Z.text)); + } + let y = "", W = 0, G = 0, X = 0; + if (Z.text) { + let L; + [W, G, X, L] = Eh(Z.text); + const S = this.getEOL(); + L === 0 || L === (S === `\r +` ? 2 : 1) ? y = Z.text : y = Z.text.replace(/\r\n|\r|\n/g, S); + } + c[g] = { + sortIndex: g, + identifier: Z.identifier || null, + range: f, + rangeOffset: this.getOffsetAt(f.startLineNumber, f.startColumn), + rangeLength: this.getValueLengthInRange(f), + text: y, + eolCount: W, + firstLineLength: G, + lastLineLength: X, + forceMoveMarkers: !!Z.forceMoveMarkers, + isAutoWhitespaceEdit: Z.isAutoWhitespaceEdit || !1 }; } - a.sort(Df._sortOpsAscending); - let c = !1; - for (let f = 0, b = a.length - 1; f < b; f++) { - const y = a[f].range.getEndPosition(), w = a[f + 1].range.getStartPosition(); - if (w.isBeforeOrEqual(y)) { - if (w.isBefore(y)) + c.sort(Eg._sortOpsAscending); + let d = !1; + for (let g = 0, Z = c.length - 1; g < Z; g++) { + const f = c[g].range.getEndPosition(), y = c[g + 1].range.getStartPosition(); + if (y.isBeforeOrEqual(f)) { + if (y.isBefore(f)) throw new Error("Overlapping ranges are not allowed!"); - c = !0; + d = !0; } } - l && (a = this._reduceOperations(a)); - const d = i || t ? Df._getInverseEditRanges(a) : [], h = []; + r && (c = this._reduceOperations(c)); + const a = i || t ? Eg._getInverseEditRanges(c) : [], h = []; if (t) - for (let f = 0; f < a.length; f++) { - const b = a[f], y = d[f]; - if (b.isAutoWhitespaceEdit && b.range.isEmpty()) - for (let w = y.startLineNumber; w <= y.endLineNumber; w++) { - let C = ""; - w === y.startLineNumber && (C = this.getLineContent(b.range.startLineNumber), qn(C) !== -1) || h.push({ lineNumber: w, oldContent: C }); + for (let g = 0; g < c.length; g++) { + const Z = c[g], f = a[g]; + if (Z.isAutoWhitespaceEdit && Z.range.isEmpty()) + for (let y = f.startLineNumber; y <= f.endLineNumber; y++) { + let W = ""; + y === f.startLineNumber && (W = this.getLineContent(Z.range.startLineNumber), es(W) !== -1) || h.push({ lineNumber: y, oldContent: W }); } } let u = null; if (i) { - let f = 0; + let g = 0; u = []; - for (let b = 0; b < a.length; b++) { - const y = a[b], w = d[b], C = this.getValueInRange(y.range), S = y.rangeOffset + f; - f += y.text.length - C.length, u[b] = { - sortIndex: y.sortIndex, - identifier: y.identifier, - range: w, - text: C, - textChange: new xn(y.rangeOffset, C, S, y.text) + for (let Z = 0; Z < c.length; Z++) { + const f = c[Z], y = a[Z], W = this.getValueInRange(f.range), G = f.rangeOffset + g; + g += f.text.length - W.length, u[Z] = { + sortIndex: f.sortIndex, + identifier: f.identifier, + range: y, + text: W, + textChange: new In(f.rangeOffset, W, G, f.text) }; } - c || u.sort((b, y) => b.sortIndex - y.sortIndex); + d || u.sort((Z, f) => Z.sortIndex - f.sortIndex); } - this._mightContainRTL = n, this._mightContainUnusualLineTerminators = o, this._mightContainNonBasicASCII = r; - const g = this._doApplyEdits(a); - let m = null; + this._mightContainRTL = n, this._mightContainUnusualLineTerminators = o, this._mightContainNonBasicASCII = l; + const m = this._doApplyEdits(c); + let b = null; if (t && h.length > 0) { - h.sort((f, b) => b.lineNumber - f.lineNumber), m = []; - for (let f = 0, b = h.length; f < b; f++) { - const y = h[f].lineNumber; - if (f > 0 && h[f - 1].lineNumber === y) + h.sort((g, Z) => Z.lineNumber - g.lineNumber), b = []; + for (let g = 0, Z = h.length; g < Z; g++) { + const f = h[g].lineNumber; + if (g > 0 && h[g - 1].lineNumber === f) continue; - const w = h[f].oldContent, C = this.getLineContent(y); - C.length === 0 || C === w || qn(C) !== -1 || m.push(y); + const y = h[g].oldContent, W = this.getLineContent(f); + W.length === 0 || W === y || es(W) !== -1 || b.push(f); } } - return this._onDidChangeContent.fire(), new Sre(u, g, m); + return this._onDidChangeContent.fire(), new mre(u, m, b); } /** * Transform operations such that they represent the same logic edit, @@ -35264,14 +35264,14 @@ class Df extends R { } _toSingleEditOperation(e) { let t = !1; - const i = e[0].range, n = e[e.length - 1].range, o = new M(i.startLineNumber, i.startColumn, n.endLineNumber, n.endColumn); - let r = i.startLineNumber, l = i.startColumn; - const a = []; - for (let g = 0, m = e.length; g < m; g++) { - const f = e[g], b = f.range; - t = t || f.forceMoveMarkers, a.push(this.getValueInRange(new M(r, l, b.startLineNumber, b.startColumn))), f.text.length > 0 && a.push(f.text), r = b.endLineNumber, l = b.endColumn; + const i = e[0].range, n = e[e.length - 1].range, o = new I(i.startLineNumber, i.startColumn, n.endLineNumber, n.endColumn); + let l = i.startLineNumber, r = i.startColumn; + const c = []; + for (let m = 0, b = e.length; m < b; m++) { + const g = e[m], Z = g.range; + t = t || g.forceMoveMarkers, c.push(this.getValueInRange(new I(l, r, Z.startLineNumber, Z.startColumn))), g.text.length > 0 && c.push(g.text), l = Z.endLineNumber, r = Z.endColumn; } - const c = a.join(""), [d, h, u] = kh(c); + const d = c.join(""), [a, h, u] = Eh(d); return { sortIndex: 0, identifier: e[0].identifier, @@ -35282,8 +35282,8 @@ class Df extends R { 0 /* EndOfLinePreference.TextDefined */ ), - text: c, - eolCount: d, + text: d, + eolCount: a, firstLineLength: h, lastLineLength: u, forceMoveMarkers: t, @@ -35291,16 +35291,16 @@ class Df extends R { }; } _doApplyEdits(e) { - e.sort(Df._sortOpsDescending); + e.sort(Eg._sortOpsDescending); const t = []; for (let i = 0; i < e.length; i++) { - const n = e[i], o = n.range.startLineNumber, r = n.range.startColumn, l = n.range.endLineNumber, a = n.range.endColumn; - if (o === l && r === a && n.text.length === 0) + const n = e[i], o = n.range.startLineNumber, l = n.range.startColumn, r = n.range.endLineNumber, c = n.range.endColumn; + if (o === r && l === c && n.text.length === 0) continue; n.text ? (this._pieceTree.delete(n.rangeOffset, n.rangeLength), this._pieceTree.insert(n.rangeOffset, n.text, !0)) : this._pieceTree.delete(n.rangeOffset, n.rangeLength); - const c = new M(o, r, l, a); + const d = new I(o, l, r, c); t.push({ - range: c, + range: d, rangeLength: n.rangeLength, text: n.text, rangeOffset: n.rangeOffset, @@ -35318,32 +35318,32 @@ class Df extends R { static _getInverseEditRanges(e) { const t = []; let i = 0, n = 0, o = null; - for (let r = 0, l = e.length; r < l; r++) { - const a = e[r]; - let c, d; - o ? o.range.endLineNumber === a.range.startLineNumber ? (c = i, d = n + (a.range.startColumn - o.range.endColumn)) : (c = i + (a.range.startLineNumber - o.range.endLineNumber), d = a.range.startColumn) : (c = a.range.startLineNumber, d = a.range.startColumn); + for (let l = 0, r = e.length; l < r; l++) { + const c = e[l]; + let d, a; + o ? o.range.endLineNumber === c.range.startLineNumber ? (d = i, a = n + (c.range.startColumn - o.range.endColumn)) : (d = i + (c.range.startLineNumber - o.range.endLineNumber), a = c.range.startColumn) : (d = c.range.startLineNumber, a = c.range.startColumn); let h; - if (a.text.length > 0) { - const u = a.eolCount + 1; - u === 1 ? h = new M(c, d, c, d + a.firstLineLength) : h = new M(c, d, c + u - 1, a.lastLineLength + 1); + if (c.text.length > 0) { + const u = c.eolCount + 1; + u === 1 ? h = new I(d, a, d, a + c.firstLineLength) : h = new I(d, a, d + u - 1, c.lastLineLength + 1); } else - h = new M(c, d, c, d); - i = h.endLineNumber, n = h.endColumn, t.push(h), o = a; + h = new I(d, a, d, a); + i = h.endLineNumber, n = h.endColumn, t.push(h), o = c; } return t; } static _sortOpsAscending(e, t) { - const i = M.compareRangesUsingEnds(e.range, t.range); + const i = I.compareRangesUsingEnds(e.range, t.range); return i === 0 ? e.sortIndex - t.sortIndex : i; } static _sortOpsDescending(e, t) { - const i = M.compareRangesUsingEnds(e.range, t.range); + const i = I.compareRangesUsingEnds(e.range, t.range); return i === 0 ? t.sortIndex - e.sortIndex : -i; } } -class Mae { - constructor(e, t, i, n, o, r, l, a, c) { - this._chunks = e, this._bom = t, this._cr = i, this._lf = n, this._crlf = o, this._containsRTL = r, this._containsUnusualLineTerminators = l, this._isBasicASCII = a, this._normalizeEOL = c; +class Zde { + constructor(e, t, i, n, o, l, r, c, d) { + this._chunks = e, this._bom = t, this._cr = i, this._lf = n, this._crlf = o, this._containsRTL = l, this._containsUnusualLineTerminators = r, this._isBasicASCII = c, this._normalizeEOL = d; } _getEOL(e) { const t = this._cr + this._lf + this._crlf, i = this._cr + this._crlf; @@ -35358,22 +35358,22 @@ class Mae { if (this._normalizeEOL && (t === `\r ` && (this._cr > 0 || this._lf > 0) || t === ` ` && (this._cr > 0 || this._crlf > 0))) - for (let o = 0, r = i.length; o < r; o++) { - const l = i[o].buffer.replace(/\r\n|\r|\n/g, t), a = ic(l); - i[o] = new Ru(l, a); + for (let o = 0, l = i.length; o < l; o++) { + const r = i[o].buffer.replace(/\r\n|\r|\n/g, t), c = ld(r); + i[o] = new zu(r, c); } - const n = new Df(i, this._bom, t, this._containsRTL, this._containsUnusualLineTerminators, this._isBasicASCII, this._normalizeEOL); + const n = new Eg(i, this._bom, t, this._containsRTL, this._containsUnusualLineTerminators, this._isBasicASCII, this._normalizeEOL); return { textBuffer: n, disposable: n }; } } -class dK { +class PQ { constructor() { this.chunks = [], this.BOM = "", this._hasPreviousChar = !1, this._previousChar = 0, this._tmpLineStarts = [], this.cr = 0, this.lf = 0, this.crlf = 0, this.containsRTL = !1, this.containsUnusualLineTerminators = !1, this.isBasicASCII = !0; } acceptChunk(e) { if (e.length === 0) return; - this.chunks.length === 0 && rE(e) && (this.BOM = aq, e = e.substr(1)); + this.chunks.length === 0 && wv(e) && (this.BOM = e$, e = e.substr(1)); const t = e.charCodeAt(e.length - 1); t === 13 || t >= 55296 && t <= 56319 ? (this._acceptChunk1(e.substr(0, e.length - 1), !1), this._hasPreviousChar = !0, this._previousChar = t) : (this._acceptChunk1(e, !1), this._hasPreviousChar = !1, this._previousChar = t); } @@ -35381,23 +35381,23 @@ class dK { !t && e.length === 0 || (this._hasPreviousChar ? this._acceptChunk2(String.fromCharCode(this._previousChar) + e) : this._acceptChunk2(e)); } _acceptChunk2(e) { - const t = Sae(this._tmpLineStarts, e); - this.chunks.push(new Ru(e, t.lineStarts)), this.cr += t.cr, this.lf += t.lf, this.crlf += t.crlf, t.isBasicASCII || (this.isBasicASCII = !1, this.containsRTL || (this.containsRTL = lb(e)), this.containsUnusualLineTerminators || (this.containsUnusualLineTerminators = YH(e))); + const t = mde(this._tmpLineStarts, e); + this.chunks.push(new zu(e, t.lineStarts)), this.cr += t.cr, this.lf += t.lf, this.crlf += t.crlf, t.isBasicASCII || (this.isBasicASCII = !1, this.containsRTL || (this.containsRTL = mZ(e)), this.containsUnusualLineTerminators || (this.containsUnusualLineTerminators = VB(e))); } finish(e = !0) { - return this._finish(), new Mae(this.chunks, this.BOM, this.cr, this.lf, this.crlf, this.containsRTL, this.containsUnusualLineTerminators, this.isBasicASCII, e); + return this._finish(), new Zde(this.chunks, this.BOM, this.cr, this.lf, this.crlf, this.containsRTL, this.containsUnusualLineTerminators, this.isBasicASCII, e); } _finish() { if (this.chunks.length === 0 && this._acceptChunk1("", !0), this._hasPreviousChar) { this._hasPreviousChar = !1; const e = this.chunks[this.chunks.length - 1]; e.buffer += String.fromCharCode(this._previousChar); - const t = ic(e.buffer); + const t = ld(e.buffer); e.lineStarts = t, this._previousChar === 13 && this.cr++; } } } -class He { +class Pe { static addRange(e, t) { let i = 0; for (; i < t.length && t[i].endExclusive < e.start; ) @@ -35408,35 +35408,35 @@ class He { if (i === n) t.splice(i, 0, e); else { - const o = Math.min(e.start, t[i].start), r = Math.max(e.endExclusive, t[n - 1].endExclusive); - t.splice(i, n - i, new He(o, r)); + const o = Math.min(e.start, t[i].start), l = Math.max(e.endExclusive, t[n - 1].endExclusive); + t.splice(i, n - i, new Pe(o, l)); } } static tryCreate(e, t) { if (!(e > t)) - return new He(e, t); + return new Pe(e, t); } static ofLength(e) { - return new He(0, e); + return new Pe(0, e); } static ofStartAndLength(e, t) { - return new He(e, e + t); + return new Pe(e, e + t); } constructor(e, t) { if (this.start = e, this.endExclusive = t, e > t) - throw new mt(`Invalid range: ${this.toString()}`); + throw new bt(`Invalid range: ${this.toString()}`); } get isEmpty() { return this.start === this.endExclusive; } delta(e) { - return new He(this.start + e, this.endExclusive + e); + return new Pe(this.start + e, this.endExclusive + e); } deltaStart(e) { - return new He(this.start + e, this.endExclusive); + return new Pe(this.start + e, this.endExclusive); } deltaEnd(e) { - return new He(this.start, this.endExclusive + e); + return new Pe(this.start, this.endExclusive + e); } get length() { return this.endExclusive - this.start; @@ -35452,7 +35452,7 @@ class He { * The joined range is the smallest range that contains both ranges. */ join(e) { - return new He(Math.min(this.start, e.start), Math.max(this.endExclusive, e.endExclusive)); + return new Pe(Math.min(this.start, e.start), Math.max(this.endExclusive, e.endExclusive)); } /** * for all numbers n: range1.contains(n) and range2.contains(n) <=> range1.intersect(range2).contains(n) @@ -35463,7 +35463,7 @@ class He { intersect(e) { const t = Math.max(this.start, e.start), i = Math.min(this.endExclusive, e.endExclusive); if (t <= i) - return new He(t, i); + return new Pe(t, i); } intersects(e) { const t = Math.max(this.start, e.start), i = Math.min(this.endExclusive, e.endExclusive); @@ -35487,7 +35487,7 @@ class He { */ clip(e) { if (this.isEmpty) - throw new mt(`Invalid clipping range: ${this.toString()}`); + throw new bt(`Invalid clipping range: ${this.toString()}`); return Math.max(this.start, Math.min(this.endExclusive - 1, e)); } /** @@ -35498,7 +35498,7 @@ class He { */ clipCyclic(e) { if (this.isEmpty) - throw new mt(`Invalid clipping range: ${this.toString()}`); + throw new bt(`Invalid clipping range: ${this.toString()}`); return e < this.start ? this.endExclusive - (this.start - e) % this.length : e >= this.endExclusive ? this.start + (e - this.start) % this.length : e; } forEach(e) { @@ -35506,7 +35506,7 @@ class He { e(t); } } -class dX { +class kJ { constructor() { this._sortedRanges = []; } @@ -35521,7 +35521,7 @@ class dX { this._sortedRanges.splice(t, 0, e); else { const n = Math.min(e.start, this._sortedRanges[t].start), o = Math.max(e.endExclusive, this._sortedRanges[i - 1].endExclusive); - this._sortedRanges.splice(t, i - t, new He(n, o)); + this._sortedRanges.splice(t, i - t, new Pe(n, o)); } } toString() { @@ -35537,7 +35537,7 @@ class dX { return t < this._sortedRanges.length && this._sortedRanges[t].start < e.endExclusive; } intersectWithRange(e) { - const t = new dX(); + const t = new kJ(); for (const i of this._sortedRanges) { const n = i.intersect(e); n && t.addRange(n); @@ -35551,9 +35551,9 @@ class dX { return this._sortedRanges.reduce((e, t) => e + t.length, 0); } } -class We { +class Ne { static fromRangeInclusive(e) { - return new We(e.startLineNumber, e.endLineNumber + 1); + return new Ne(e.startLineNumber, e.endLineNumber + 1); } /** * @param lineRanges An array of sorted line ranges. @@ -35561,31 +35561,31 @@ class We { static joinMany(e) { if (e.length === 0) return []; - let t = new ar(e[0].slice()); + let t = new al(e[0].slice()); for (let i = 1; i < e.length; i++) - t = t.getUnion(new ar(e[i].slice())); + t = t.getUnion(new al(e[i].slice())); return t.ranges; } static join(e) { if (e.length === 0) - throw new mt("lineRanges cannot be empty"); + throw new bt("lineRanges cannot be empty"); let t = e[0].startLineNumber, i = e[0].endLineNumberExclusive; for (let n = 1; n < e.length; n++) t = Math.min(t, e[n].startLineNumber), i = Math.max(i, e[n].endLineNumberExclusive); - return new We(t, i); + return new Ne(t, i); } static ofLength(e, t) { - return new We(e, e + t); + return new Ne(e, e + t); } /** * @internal */ static deserialize(e) { - return new We(e[0], e[1]); + return new Ne(e[0], e[1]); } constructor(e, t) { if (e > t) - throw new mt(`startLineNumber ${e} cannot be after endLineNumberExclusive ${t}`); + throw new bt(`startLineNumber ${e} cannot be after endLineNumberExclusive ${t}`); this.startLineNumber = e, this.endLineNumberExclusive = t; } /** @@ -35604,10 +35604,10 @@ class We { * Moves this line range by the given offset of line numbers. */ delta(e) { - return new We(this.startLineNumber + e, this.endLineNumberExclusive + e); + return new Ne(this.startLineNumber + e, this.endLineNumberExclusive + e); } deltaLength(e) { - return new We(this.startLineNumber, this.endLineNumberExclusive + e); + return new Ne(this.startLineNumber, this.endLineNumberExclusive + e); } /** * The number of lines this line range spans. @@ -35619,7 +35619,7 @@ class We { * Creates a line range that combines this and the given line range. */ join(e) { - return new We(Math.min(this.startLineNumber, e.startLineNumber), Math.max(this.endLineNumberExclusive, e.endLineNumberExclusive)); + return new Ne(Math.min(this.startLineNumber, e.startLineNumber), Math.max(this.endLineNumberExclusive, e.endLineNumberExclusive)); } toString() { return `[${this.startLineNumber},${this.endLineNumberExclusive})`; @@ -35631,7 +35631,7 @@ class We { intersect(e) { const t = Math.max(this.startLineNumber, e.startLineNumber), i = Math.min(this.endLineNumberExclusive, e.endLineNumberExclusive); if (t <= i) - return new We(t, i); + return new Ne(t, i); } intersectsStrict(e) { return this.startLineNumber < e.endLineNumberExclusive && e.startLineNumber < this.endLineNumberExclusive; @@ -35643,13 +35643,13 @@ class We { return this.startLineNumber === e.startLineNumber && this.endLineNumberExclusive === e.endLineNumberExclusive; } toInclusiveRange() { - return this.isEmpty ? null : new M(this.startLineNumber, 1, this.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER); + return this.isEmpty ? null : new I(this.startLineNumber, 1, this.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER); } /** * @deprecated Using this function is discouraged because it might lead to bugs: The end position is not guaranteed to be a valid position! */ toExclusiveRange() { - return new M(this.startLineNumber, 1, this.endLineNumberExclusive, 1); + return new I(this.startLineNumber, 1, this.endLineNumberExclusive, 1); } mapToLineArray(e) { const t = []; @@ -35675,10 +35675,10 @@ class We { * @internal */ toOffsetRange() { - return new He(this.startLineNumber - 1, this.endLineNumberExclusive - 1); + return new Pe(this.startLineNumber - 1, this.endLineNumberExclusive - 1); } } -class ar { +class al { constructor(e = []) { this._normalizedRanges = e; } @@ -35688,7 +35688,7 @@ class ar { addRange(e) { if (e.length === 0) return; - const t = n1(this._normalizedRanges, (n) => n.endLineNumberExclusive >= e.startLineNumber), i = i1(this._normalizedRanges, (n) => n.startLineNumber <= e.endLineNumberExclusive) + 1; + const t = pW(this._normalizedRanges, (n) => n.endLineNumberExclusive >= e.startLineNumber), i = bW(this._normalizedRanges, (n) => n.startLineNumber <= e.endLineNumberExclusive) + 1; if (t === i) this._normalizedRanges.splice(t, 0, e); else if (t === i - 1) { @@ -35700,11 +35700,11 @@ class ar { } } contains(e) { - const t = bb(this._normalizedRanges, (i) => i.startLineNumber <= e); + const t = VZ(this._normalizedRanges, (i) => i.startLineNumber <= e); return !!t && t.endLineNumberExclusive > e; } intersects(e) { - const t = bb(this._normalizedRanges, (i) => i.startLineNumber < e.endLineNumberExclusive); + const t = VZ(this._normalizedRanges, (i) => i.startLineNumber < e.endLineNumberExclusive); return !!t && t.endLineNumberExclusive > e.startLineNumber; } getUnion(e) { @@ -35715,29 +35715,29 @@ class ar { const t = []; let i = 0, n = 0, o = null; for (; i < this._normalizedRanges.length || n < e._normalizedRanges.length; ) { - let r = null; + let l = null; if (i < this._normalizedRanges.length && n < e._normalizedRanges.length) { - const l = this._normalizedRanges[i], a = e._normalizedRanges[n]; - l.startLineNumber < a.startLineNumber ? (r = l, i++) : (r = a, n++); - } else i < this._normalizedRanges.length ? (r = this._normalizedRanges[i], i++) : (r = e._normalizedRanges[n], n++); - o === null ? o = r : o.endLineNumberExclusive >= r.startLineNumber ? o = new We(o.startLineNumber, Math.max(o.endLineNumberExclusive, r.endLineNumberExclusive)) : (t.push(o), o = r); + const r = this._normalizedRanges[i], c = e._normalizedRanges[n]; + r.startLineNumber < c.startLineNumber ? (l = r, i++) : (l = c, n++); + } else i < this._normalizedRanges.length ? (l = this._normalizedRanges[i], i++) : (l = e._normalizedRanges[n], n++); + o === null ? o = l : o.endLineNumberExclusive >= l.startLineNumber ? o = new Ne(o.startLineNumber, Math.max(o.endLineNumberExclusive, l.endLineNumberExclusive)) : (t.push(o), o = l); } - return o !== null && t.push(o), new ar(t); + return o !== null && t.push(o), new al(t); } /** * Subtracts all ranges in this set from `range` and returns the result. */ subtractFrom(e) { - const t = n1(this._normalizedRanges, (r) => r.endLineNumberExclusive >= e.startLineNumber), i = i1(this._normalizedRanges, (r) => r.startLineNumber <= e.endLineNumberExclusive) + 1; + const t = pW(this._normalizedRanges, (l) => l.endLineNumberExclusive >= e.startLineNumber), i = bW(this._normalizedRanges, (l) => l.startLineNumber <= e.endLineNumberExclusive) + 1; if (t === i) - return new ar([e]); + return new al([e]); const n = []; let o = e.startLineNumber; - for (let r = t; r < i; r++) { - const l = this._normalizedRanges[r]; - l.startLineNumber > o && n.push(new We(o, l.startLineNumber)), o = l.endLineNumberExclusive; + for (let l = t; l < i; l++) { + const r = this._normalizedRanges[l]; + r.startLineNumber > o && n.push(new Ne(o, r.startLineNumber)), o = r.endLineNumberExclusive; } - return o < e.endLineNumberExclusive && n.push(new We(o, e.endLineNumberExclusive)), new ar(n); + return o < e.endLineNumberExclusive && n.push(new Ne(o, e.endLineNumberExclusive)), new al(n); } toString() { return this._normalizedRanges.map((e) => e.toString()).join(", "); @@ -35746,16 +35746,16 @@ class ar { const t = []; let i = 0, n = 0; for (; i < this._normalizedRanges.length && n < e._normalizedRanges.length; ) { - const o = this._normalizedRanges[i], r = e._normalizedRanges[n], l = o.intersect(r); - l && !l.isEmpty && t.push(l), o.endLineNumberExclusive < r.endLineNumberExclusive ? i++ : n++; + const o = this._normalizedRanges[i], l = e._normalizedRanges[n], r = o.intersect(l); + r && !r.isEmpty && t.push(r), o.endLineNumberExclusive < l.endLineNumberExclusive ? i++ : n++; } - return new ar(t); + return new al(t); } getWithDelta(e) { - return new ar(this._normalizedRanges.map((t) => t.delta(e))); + return new al(this._normalizedRanges.map((t) => t.delta(e))); } } -const h1 = new class { +const VW = new class { clone() { return this; } @@ -35763,14 +35763,14 @@ const h1 = new class { return this === s; } }(); -function hK(s, e) { - return new QE([new jw(0, "", s)], e); +function BQ(s, e) { + return new GJ([new dW(0, "", s)], e); } -function hX(s, e) { +function vJ(s, e) { const t = new Uint32Array(2); - return t[0] = 0, t[1] = (s << 0 | 0 | 0 | 32768 | 2 << 24) >>> 0, new mI(t, e === null ? h1 : e); + return t[0] = 0, t[1] = (s << 0 | 0 | 0 | 32768 | 2 << 24) >>> 0, new Rx(t, e === null ? VW : e); } -class Zae { +class fde { constructor(e) { this._default = e, this._store = []; } @@ -35792,8 +35792,8 @@ class Zae { this.delete(e, t); return; } - const n = this._store.slice(0, e), o = this._store.slice(e + t), r = _ae(i, this._default); - this._store = n.concat(r, o); + const n = this._store.slice(0, e), o = this._store.slice(e + t), l = yde(i, this._default); + this._store = n.concat(l, o); } delete(e, t) { t === 0 || e >= this._store.length || this._store.splice(e, t); @@ -35804,16 +35804,16 @@ class Zae { const i = []; for (let n = 0; n < t; n++) i[n] = this._default; - this._store = J_(this._store, e, i); + this._store = cx(this._store, e, i); } } -function _ae(s, e) { +function yde(s, e) { const t = []; for (let i = 0; i < s; i++) t[i] = e; return t; } -class Iae { +class Wde { /** * (Inclusive) start line number for these tokens. */ @@ -35839,7 +35839,7 @@ class Iae { this._tokens.push(e); } } -class Dv { +class eT { constructor() { this._tokens = []; } @@ -35851,15 +35851,15 @@ class Dv { return; } } - this._tokens.push(new Iae(e, [t])); + this._tokens.push(new Wde(e, [t])); } finalize() { return this._tokens; } } -class Nae { +class Gde { constructor(e, t) { - this.tokenizationSupport = t, this.initialState = this.tokenizationSupport.getInitialState(), this.store = new Vv(e); + this.tokenizationSupport = t, this.initialState = this.tokenizationSupport.getInitialState(), this.store = new tT(e); } getStartState(e) { return this.store.getStartState(e, this.initialState); @@ -35868,7 +35868,7 @@ class Nae { return this.store.getFirstInvalidLine(this.initialState); } } -class Wae extends Nae { +class Xde extends Gde { constructor(e, t, i, n) { super(e, t), this._textModel = i, this._languageIdCodec = n; } @@ -35878,8 +35878,8 @@ class Wae extends Nae { const n = this.getFirstInvalidLine(); if (!n || n.lineNumber > t) break; - const o = this._textModel.getLineContent(n.lineNumber), r = E0(this._languageIdCodec, i, this.tokenizationSupport, o, !0, n.startState); - e.add(n.lineNumber, r.tokens), this.store.setEndState(n.lineNumber, r.endState); + const o = this._textModel.getLineContent(n.lineNumber), l = U0(this._languageIdCodec, i, this.tokenizationSupport, o, !0, n.startState); + e.add(n.lineNumber, l.tokens), this.store.setEndState(n.lineNumber, l.endState); } } /** assumes state is up to date */ @@ -35887,19 +35887,19 @@ class Wae extends Nae { const i = this.getStartState(e.lineNumber); if (!i) return 0; - const n = this._textModel.getLanguageId(), o = this._textModel.getLineContent(e.lineNumber), r = o.substring(0, e.column - 1) + t + o.substring(e.column - 1), l = E0(this._languageIdCodec, n, this.tokenizationSupport, r, !0, i), a = new rn(l.tokens, r, this._languageIdCodec); - if (a.getCount() === 0) + const n = this._textModel.getLanguageId(), o = this._textModel.getLineContent(e.lineNumber), l = o.substring(0, e.column - 1) + t + o.substring(e.column - 1), r = U0(this._languageIdCodec, n, this.tokenizationSupport, l, !0, i), c = new rn(r.tokens, l, this._languageIdCodec); + if (c.getCount() === 0) return 0; - const c = a.findTokenIndexAtOffset(e.column - 1); - return a.getStandardTokenType(c); + const d = c.findTokenIndexAtOffset(e.column - 1); + return c.getStandardTokenType(d); } /** assumes state is up to date */ tokenizeLineWithEdit(e, t, i) { - const n = e.lineNumber, o = e.column, r = this.getStartState(n); - if (!r) + const n = e.lineNumber, o = e.column, l = this.getStartState(n); + if (!l) return null; - const l = this._textModel.getLineContent(n), a = l.substring(0, o - 1) + i + l.substring(o - 1 + t), c = this._textModel.getLanguageIdAtPosition(n, 0), d = E0(this._languageIdCodec, c, this.tokenizationSupport, a, !0, r); - return new rn(d.tokens, a, this._languageIdCodec); + const r = this._textModel.getLineContent(n), c = r.substring(0, o - 1) + i + r.substring(o - 1 + t), d = this._textModel.getLanguageIdAtPosition(n, 0), a = U0(this._languageIdCodec, d, this.tokenizationSupport, c, !0, l); + return new rn(a.tokens, c, this._languageIdCodec); } hasAccurateTokensForLine(e) { const t = this.store.getFirstInvalidEndStateLineNumberOrMax(); @@ -35919,9 +35919,9 @@ class Wae extends Nae { return this.updateTokensUntilLine(e, i), { heuristicTokens: !1 }; let n = this.guessStartState(t); const o = this._textModel.getLanguageId(); - for (let r = t; r <= i; r++) { - const l = this._textModel.getLineContent(r), a = E0(this._languageIdCodec, o, this.tokenizationSupport, l, !0, n); - e.add(r, a.tokens), n = a.endState; + for (let l = t; l <= i; l++) { + const r = this._textModel.getLineContent(l), c = U0(this._languageIdCodec, o, this.tokenizationSupport, r, !0, n); + e.add(l, c.tokens), n = c.endState; } return { heuristicTokens: !0 }; } @@ -35929,22 +35929,22 @@ class Wae extends Nae { let t = this._textModel.getLineFirstNonWhitespaceColumn(e); const i = []; let n = null; - for (let l = e - 1; t > 1 && l >= 1; l--) { - const a = this._textModel.getLineFirstNonWhitespaceColumn(l); - if (a !== 0 && a < t && (i.push(this._textModel.getLineContent(l)), t = a, n = this.getStartState(l), n)) + for (let r = e - 1; t > 1 && r >= 1; r--) { + const c = this._textModel.getLineFirstNonWhitespaceColumn(r); + if (c !== 0 && c < t && (i.push(this._textModel.getLineContent(r)), t = c, n = this.getStartState(r), n)) break; } n || (n = this.tokenizationSupport.getInitialState()), i.reverse(); const o = this._textModel.getLanguageId(); - let r = n; - for (const l of i) - r = E0(this._languageIdCodec, o, this.tokenizationSupport, l, !1, r).endState; - return r; + let l = n; + for (const r of i) + l = U0(this._languageIdCodec, o, this.tokenizationSupport, r, !1, l).endState; + return l; } } -class Vv { +class tT { constructor(e) { - this.lineCount = e, this._tokenizationStateStore = new vae(), this._invalidEndStatesLineNumbers = new Tae(), this._invalidEndStatesLineNumbers.addRange(new He(1, e + 1)); + this.lineCount = e, this._tokenizationStateStore = new Vde(), this._invalidEndStatesLineNumbers = new Lde(), this._invalidEndStatesLineNumbers.addRange(new Pe(1, e + 1)); } getEndState(e) { return this._tokenizationStateStore.getEndState(e); @@ -35954,22 +35954,22 @@ class Vv { */ setEndState(e, t) { if (!t) - throw new mt("Cannot set null/undefined state"); + throw new bt("Cannot set null/undefined state"); this._invalidEndStatesLineNumbers.delete(e); const i = this._tokenizationStateStore.setEndState(e, t); - return i && e < this.lineCount && this._invalidEndStatesLineNumbers.addRange(new He(e + 1, e + 2)), i; + return i && e < this.lineCount && this._invalidEndStatesLineNumbers.addRange(new Pe(e + 1, e + 2)), i; } acceptChange(e, t) { - this.lineCount += t - e.length, this._tokenizationStateStore.acceptChange(e, t), this._invalidEndStatesLineNumbers.addRangeAndResize(new He(e.startLineNumber, e.endLineNumberExclusive), t); + this.lineCount += t - e.length, this._tokenizationStateStore.acceptChange(e, t), this._invalidEndStatesLineNumbers.addRangeAndResize(new Pe(e.startLineNumber, e.endLineNumberExclusive), t); } acceptChanges(e) { for (const t of e) { - const [i] = kh(t.text); - this.acceptChange(new We(t.range.startLineNumber, t.range.endLineNumber + 1), i + 1); + const [i] = Eh(t.text); + this.acceptChange(new Ne(t.range.startLineNumber, t.range.endLineNumber + 1), i + 1); } } invalidateEndStateRange(e) { - this._invalidEndStatesLineNumbers.addRange(new He(e.startLineNumber, e.endLineNumberExclusive)); + this._invalidEndStatesLineNumbers.addRange(new Pe(e.startLineNumber, e.endLineNumberExclusive)); } getFirstInvalidEndStateLineNumber() { return this._invalidEndStatesLineNumbers.min; @@ -35989,13 +35989,13 @@ class Vv { return null; const i = this.getStartState(t, e); if (!i) - throw new mt("Start state must be defined"); + throw new bt("Start state must be defined"); return { lineNumber: t, startState: i }; } } -class vae { +class Vde { constructor() { - this._lineEndStates = new Zae(null); + this._lineEndStates = new fde(null); } getEndState(e) { return this._lineEndStates.get(e); @@ -36009,7 +36009,7 @@ class vae { t > 0 && i > 0 && (i--, t--), this._lineEndStates.replace(e.startLineNumber, i, t); } } -class Tae { +class Lde { constructor() { this._ranges = []; } @@ -36020,11 +36020,11 @@ class Tae { const t = this._ranges.findIndex((i) => i.contains(e)); if (t !== -1) { const i = this._ranges[t]; - i.start === e ? i.endExclusive === e + 1 ? this._ranges.splice(t, 1) : this._ranges[t] = new He(e + 1, i.endExclusive) : i.endExclusive === e + 1 ? this._ranges[t] = new He(i.start, e) : this._ranges.splice(t, 1, new He(i.start, e), new He(e + 1, i.endExclusive)); + i.start === e ? i.endExclusive === e + 1 ? this._ranges.splice(t, 1) : this._ranges[t] = new Pe(e + 1, i.endExclusive) : i.endExclusive === e + 1 ? this._ranges[t] = new Pe(i.start, e) : this._ranges.splice(t, 1, new Pe(i.start, e), new Pe(e + 1, i.endExclusive)); } } addRange(e) { - He.addRange(e, this._ranges); + Pe.addRange(e, this._ranges); } addRangeAndResize(e, t) { let i = 0; @@ -36034,31 +36034,31 @@ class Tae { for (; !(n >= this._ranges.length || e.endExclusive < this._ranges[n].start); ) n++; const o = t - e.length; - for (let r = n; r < this._ranges.length; r++) - this._ranges[r] = this._ranges[r].delta(o); + for (let l = n; l < this._ranges.length; l++) + this._ranges[l] = this._ranges[l].delta(o); if (i === n) { - const r = new He(e.start, e.start + t); - r.isEmpty || this._ranges.splice(i, 0, r); + const l = new Pe(e.start, e.start + t); + l.isEmpty || this._ranges.splice(i, 0, l); } else { - const r = Math.min(e.start, this._ranges[i].start), l = Math.max(e.endExclusive, this._ranges[n - 1].endExclusive), a = new He(r, l + o); - a.isEmpty ? this._ranges.splice(i, n - i) : this._ranges.splice(i, n - i, a); + const l = Math.min(e.start, this._ranges[i].start), r = Math.max(e.endExclusive, this._ranges[n - 1].endExclusive), c = new Pe(l, r + o); + c.isEmpty ? this._ranges.splice(i, n - i) : this._ranges.splice(i, n - i, c); } } toString() { return this._ranges.map((e) => e.toString()).join(" + "); } } -function E0(s, e, t, i, n, o) { - let r = null; +function U0(s, e, t, i, n, o) { + let l = null; if (t) try { - r = t.tokenizeEncoded(i, n, o.clone()); - } catch (l) { - De(l); + l = t.tokenizeEncoded(i, n, o.clone()); + } catch (r) { + Me(r); } - return r || (r = hX(s.encodeLanguageId(e), o)), rn.convertToEndOffset(r.tokens, i.length), r; + return l || (l = vJ(s.encodeLanguageId(e), o)), rn.convertToEndOffset(l.tokens, i.length), l; } -class Dae { +class Ide { constructor(e, t) { this._tokenizerWithStateStore = e, this._backgroundTokenStore = t, this._isDisposed = !1, this._isScheduled = !1; } @@ -36069,7 +36069,7 @@ class Dae { this._beginBackgroundTokenization(); } _beginBackgroundTokenization() { - this._isScheduled || !this._tokenizerWithStateStore._textModel.isAttachedToEditor() || !this._hasLinesToTokenize() || (this._isScheduled = !0, ZH((e) => { + this._isScheduled || !this._tokenizerWithStateStore._textModel.isAttachedToEditor() || !this._hasLinesToTokenize() || (this._isScheduled = !0, cB((e) => { this._isScheduled = !1, this._backgroundTokenizeWithDeadline(e); })); } @@ -36078,7 +36078,7 @@ class Dae { */ _backgroundTokenizeWithDeadline(e) { const t = Date.now() + e.timeRemaining(), i = () => { - this._isDisposed || !this._tokenizerWithStateStore._textModel.isAttachedToEditor() || !this._hasLinesToTokenize() || (this._backgroundTokenizeForAtLeast1ms(), Date.now() < t ? fH(i) : this._beginBackgroundTokenization()); + this._isDisposed || !this._tokenizerWithStateStore._textModel.isAttachedToEditor() || !this._hasLinesToTokenize() || (this._backgroundTokenizeForAtLeast1ms(), Date.now() < t ? qP(i) : this._beginBackgroundTokenization()); }; i(); } @@ -36086,7 +36086,7 @@ class Dae { * Tokenize for at least 1ms. */ _backgroundTokenizeForAtLeast1ms() { - const e = this._tokenizerWithStateStore._textModel.getLineCount(), t = new Dv(), i = on.create(!1); + const e = this._tokenizerWithStateStore._textModel.getLineCount(), t = new eT(), i = ln.create(!1); do if (i.elapsed() > 1 || this._tokenizeOneInvalidLine(t) >= e) break; @@ -36105,15 +36105,15 @@ class Dae { this._isDisposed || this._tokenizerWithStateStore.store.allStatesValid() && this._backgroundTokenStore.backgroundTokenizationFinished(); } requestTokens(e, t) { - this._tokenizerWithStateStore.store.invalidateEndStateRange(new We(e, t)); + this._tokenizerWithStateStore.store.invalidateEndStateRange(new Ne(e, t)); } } -class Vae { +class Sde { constructor() { this._onDidChangeVisibleRanges = new k(), this.onDidChangeVisibleRanges = this._onDidChangeVisibleRanges.event, this._views = /* @__PURE__ */ new Set(); } attachView() { - const e = new kae((t) => { + const e = new xde((t) => { this._onDidChangeVisibleRanges.fire({ view: e, state: t }); }); return this._views.add(e), e; @@ -36122,30 +36122,30 @@ class Vae { this._views.delete(e), this._onDidChangeVisibleRanges.fire({ view: e, state: void 0 }); } } -class kae { +class xde { constructor(e) { this.handleStateChange = e; } setVisibleLines(e, t) { - const i = e.map((n) => new We(n.startLineNumber, n.endLineNumber + 1)); + const i = e.map((n) => new Ne(n.startLineNumber, n.endLineNumber + 1)); this.handleStateChange({ visibleLineRanges: i, stabilized: t }); } } -class Gae extends R { +class Cde extends J { get lineRanges() { return this._lineRanges; } constructor(e) { - super(), this._refreshTokens = e, this.runner = this._register(new Zt(() => this.update(), 50)), this._computedLineRanges = [], this._lineRanges = []; + super(), this._refreshTokens = e, this.runner = this._register(new St(() => this.update(), 50)), this._computedLineRanges = [], this._lineRanges = []; } update() { - ei(this._computedLineRanges, this._lineRanges, (e, t) => e.equals(t)) || (this._computedLineRanges = this._lineRanges, this._refreshTokens()); + ti(this._computedLineRanges, this._lineRanges, (e, t) => e.equals(t)) || (this._computedLineRanges = this._lineRanges, this._refreshTokens()); } handleStateChange(e) { this._lineRanges = e.visibleLineRanges, e.stabilized ? (this.runner.cancel(), this.update()) : this.runner.schedule(); } } -class uK extends R { +class _Q extends J { get backgroundTokenizationState() { return this._backgroundTokenizationState; } @@ -36156,13 +36156,13 @@ class uK extends R { this.isCheapToTokenize(e) && this.forceTokenization(e); } } -class NY extends uK { +class ez extends _Q { constructor(e, t, i, n) { super(t, i, n), this._treeSitterService = e, this._tokenizationSupport = null, this._initialize(); } _initialize() { const e = this.getLanguageId(); - (!this._tokenizationSupport || this._lastLanguageId !== e) && (this._lastLanguageId = e, this._tokenizationSupport = bv.get(e)); + (!this._tokenizationSupport || this._lastLanguageId !== e) && (this._lastLanguageId = e, this._tokenizationSupport = Hw.get(e)); } getLineTokens(e) { const t = this._textModel.getLineContent(e); @@ -36207,74 +36207,74 @@ class NY extends uK { return this._treeSitterService.getParseResult(this._textModel) !== void 0; } } -const gK = $e("treeSitterParserService"), nc = new Uint32Array(0).buffer; -class ca { +const QQ = $e("treeSitterParserService"), rd = new Uint32Array(0).buffer; +class mc { static deleteBeginning(e, t) { - return e === null || e === nc ? e : ca.delete(e, 0, t); + return e === null || e === rd ? e : mc.delete(e, 0, t); } static deleteEnding(e, t) { - if (e === null || e === nc) + if (e === null || e === rd) return e; - const i = Cc(e), n = i[i.length - 2]; - return ca.delete(e, t, n); + const i = Ld(e), n = i[i.length - 2]; + return mc.delete(e, t, n); } static delete(e, t, i) { - if (e === null || e === nc || t === i) + if (e === null || e === rd || t === i) return e; - const n = Cc(e), o = n.length >>> 1; + const n = Ld(e), o = n.length >>> 1; if (t === 0 && n[n.length - 2] === i) - return nc; - const r = rn.findIndexInTokensArray(n, t), l = r > 0 ? n[r - 1 << 1] : 0, a = n[r << 1]; - if (i < a) { - const g = i - t; - for (let m = r; m < o; m++) - n[m << 1] -= g; + return rd; + const l = rn.findIndexInTokensArray(n, t), r = l > 0 ? n[l - 1 << 1] : 0, c = n[l << 1]; + if (i < c) { + const m = i - t; + for (let b = l; b < o; b++) + n[b << 1] -= m; return e; } - let c, d; - l !== t ? (n[r << 1] = t, c = r + 1 << 1, d = t) : (c = r << 1, d = l); + let d, a; + r !== t ? (n[l << 1] = t, d = l + 1 << 1, a = t) : (d = l << 1, a = r); const h = i - t; - for (let g = r + 1; g < o; g++) { - const m = n[g << 1] - h; - m > d && (n[c++] = m, n[c++] = n[(g << 1) + 1], d = m); + for (let m = l + 1; m < o; m++) { + const b = n[m << 1] - h; + b > a && (n[d++] = b, n[d++] = n[(m << 1) + 1], a = b); } - if (c === n.length) + if (d === n.length) return e; - const u = new Uint32Array(c); - return u.set(n.subarray(0, c), 0), u.buffer; + const u = new Uint32Array(d); + return u.set(n.subarray(0, d), 0), u.buffer; } static append(e, t) { - if (t === nc) + if (t === rd) return e; - if (e === nc) + if (e === rd) return t; if (e === null) return e; if (t === null) return null; - const i = Cc(e), n = Cc(t), o = n.length >>> 1, r = new Uint32Array(i.length + n.length); - r.set(i, 0); - let l = i.length; - const a = i[i.length - 2]; - for (let c = 0; c < o; c++) - r[l++] = n[c << 1] + a, r[l++] = n[(c << 1) + 1]; - return r.buffer; + const i = Ld(e), n = Ld(t), o = n.length >>> 1, l = new Uint32Array(i.length + n.length); + l.set(i, 0); + let r = i.length; + const c = i[i.length - 2]; + for (let d = 0; d < o; d++) + l[r++] = n[d << 1] + c, l[r++] = n[(d << 1) + 1]; + return l.buffer; } static insert(e, t, i) { - if (e === null || e === nc) + if (e === null || e === rd) return e; - const n = Cc(e), o = n.length >>> 1; - let r = rn.findIndexInTokensArray(n, t); - r > 0 && n[r - 1 << 1] === t && r--; - for (let l = r; l < o; l++) - n[l << 1] += i; + const n = Ld(e), o = n.length >>> 1; + let l = rn.findIndexInTokensArray(n, t); + l > 0 && n[l - 1 << 1] === t && l--; + for (let r = l; r < o; r++) + n[r << 1] += i; return e; } } -function Cc(s) { +function Ld(s) { return s instanceof Uint32Array ? s : new Uint32Array(s); } -class u1 { +class LW { constructor(e) { this._lineTokens = [], this._len = 0, this._languageIdCodec = e; } @@ -36286,21 +36286,21 @@ class u1 { } getTokens(e, t, i) { let n = null; - if (t < this._len && (n = this._lineTokens[t]), n !== null && n !== nc) - return new rn(Cc(n), i, this._languageIdCodec); + if (t < this._len && (n = this._lineTokens[t]), n !== null && n !== rd) + return new rn(Ld(n), i, this._languageIdCodec); const o = new Uint32Array(2); - return o[0] = i.length, o[1] = WY(this._languageIdCodec.encodeLanguageId(e)), new rn(o, i, this._languageIdCodec); + return o[0] = i.length, o[1] = tz(this._languageIdCodec.encodeLanguageId(e)), new rn(o, i, this._languageIdCodec); } static _massageTokens(e, t, i) { - const n = i ? Cc(i) : null; + const n = i ? Ld(i) : null; if (t === 0) { let o = !1; - if (n && n.length > 1 && (o = bl.getLanguageId(n[1]) !== e), !o) - return nc; + if (n && n.length > 1 && (o = Gr.getLanguageId(n[1]) !== e), !o) + return rd; } if (!n || n.length === 0) { const o = new Uint32Array(2); - return o[0] = t, o[1] = WY(e), o.buffer; + return o[0] = t, o[1] = tz(e), o.buffer; } return n[n.length - 2] = t, n.byteOffset === 0 && n.byteLength === n.buffer.byteLength ? n.buffer : n; } @@ -36317,28 +36317,28 @@ class u1 { const i = []; for (let n = 0; n < t; n++) i[n] = null; - this._lineTokens = J_(this._lineTokens, e, i), this._len += t; + this._lineTokens = cx(this._lineTokens, e, i), this._len += t; } setTokens(e, t, i, n, o) { - const r = u1._massageTokens(this._languageIdCodec.encodeLanguageId(e), i, n); + const l = LW._massageTokens(this._languageIdCodec.encodeLanguageId(e), i, n); this._ensureLine(t); - const l = this._lineTokens[t]; - return this._lineTokens[t] = r, o ? !u1._equals(l, r) : !1; + const r = this._lineTokens[t]; + return this._lineTokens[t] = l, o ? !LW._equals(r, l) : !1; } static _equals(e, t) { if (!e || !t) return !e && !t; - const i = Cc(e), n = Cc(t); + const i = Ld(e), n = Ld(t); if (i.length !== n.length) return !1; - for (let o = 0, r = i.length; o < r; o++) + for (let o = 0, l = i.length; o < l; o++) if (i[o] !== n[o]) return !1; return !0; } //#region Editing acceptEdit(e, t, i) { - this._acceptDeleteRange(e), this._acceptInsertText(new V(e.startLineNumber, e.startColumn), t, i); + this._acceptDeleteRange(e), this._acceptInsertText(new Y(e.startLineNumber, e.startColumn), t, i); } _acceptDeleteRange(e) { const t = e.startLineNumber - 1; @@ -36347,13 +36347,13 @@ class u1 { if (e.startLineNumber === e.endLineNumber) { if (e.startColumn === e.endColumn) return; - this._lineTokens[t] = ca.delete(this._lineTokens[t], e.startColumn - 1, e.endColumn - 1); + this._lineTokens[t] = mc.delete(this._lineTokens[t], e.startColumn - 1, e.endColumn - 1); return; } - this._lineTokens[t] = ca.deleteEnding(this._lineTokens[t], e.startColumn - 1); + this._lineTokens[t] = mc.deleteEnding(this._lineTokens[t], e.startColumn - 1); const i = e.endLineNumber - 1; let n = null; - i < this._len && (n = ca.deleteBeginning(this._lineTokens[i], e.endColumn - 1)), this._lineTokens[t] = ca.append(this._lineTokens[t], n), this._deleteLines(e.startLineNumber, e.endLineNumber - e.startLineNumber); + i < this._len && (n = mc.deleteBeginning(this._lineTokens[i], e.endColumn - 1)), this._lineTokens[t] = mc.append(this._lineTokens[t], n), this._deleteLines(e.startLineNumber, e.endLineNumber - e.startLineNumber); } _acceptInsertText(e, t, i) { if (t === 0 && i === 0) @@ -36361,10 +36361,10 @@ class u1 { const n = e.lineNumber - 1; if (!(n >= this._len)) { if (t === 0) { - this._lineTokens[n] = ca.insert(this._lineTokens[n], e.column - 1, i); + this._lineTokens[n] = mc.insert(this._lineTokens[n], e.column - 1, i); return; } - this._lineTokens[n] = ca.deleteEnding(this._lineTokens[n], e.column - 1), this._lineTokens[n] = ca.insert(this._lineTokens[n], e.column - 1, i), this._insertLines(e.lineNumber, t); + this._lineTokens[n] = mc.deleteEnding(this._lineTokens[n], e.column - 1), this._lineTokens[n] = mc.insert(this._lineTokens[n], e.column - 1, i), this._insertLines(e.lineNumber, t); } } //#endregion @@ -36373,19 +36373,19 @@ class u1 { return { changes: [] }; const i = []; for (let n = 0, o = e.length; n < o; n++) { - const r = e[n]; - let l = 0, a = 0, c = !1; - for (let d = r.startLineNumber; d <= r.endLineNumber; d++) - c ? (this.setTokens(t.getLanguageId(), d - 1, t.getLineLength(d), r.getLineTokens(d), !1), a = d) : this.setTokens(t.getLanguageId(), d - 1, t.getLineLength(d), r.getLineTokens(d), !0) && (c = !0, l = d, a = d); - c && i.push({ fromLineNumber: l, toLineNumber: a }); + const l = e[n]; + let r = 0, c = 0, d = !1; + for (let a = l.startLineNumber; a <= l.endLineNumber; a++) + d ? (this.setTokens(t.getLanguageId(), a - 1, t.getLineLength(a), l.getLineTokens(a), !1), c = a) : this.setTokens(t.getLanguageId(), a - 1, t.getLineLength(a), l.getLineTokens(a), !0) && (d = !0, r = a, c = a); + d && i.push({ fromLineNumber: r, toLineNumber: c }); } return { changes: i }; } } -function WY(s) { +function tz(s) { return (s << 0 | 0 | 0 | 32768 | 2 << 24 | 1024) >>> 0; } -class uX { +class JJ { constructor(e) { this._pieces = [], this._isComplete = !1, this._languageIdCodec = e; } @@ -36401,38 +36401,38 @@ class uX { setPartial(e, t) { let i = e; if (t.length > 0) { - const o = t[0].getRange(), r = t[t.length - 1].getRange(); - if (!o || !r) + const o = t[0].getRange(), l = t[t.length - 1].getRange(); + if (!o || !l) return e; - i = e.plusRange(o).plusRange(r); + i = e.plusRange(o).plusRange(l); } let n = null; - for (let o = 0, r = this._pieces.length; o < r; o++) { - const l = this._pieces[o]; - if (l.endLineNumber < i.startLineNumber) + for (let o = 0, l = this._pieces.length; o < l; o++) { + const r = this._pieces[o]; + if (r.endLineNumber < i.startLineNumber) continue; - if (l.startLineNumber > i.endLineNumber) { + if (r.startLineNumber > i.endLineNumber) { n = n || { index: o }; break; } - if (l.removeTokens(i), l.isEmpty()) { - this._pieces.splice(o, 1), o--, r--; + if (r.removeTokens(i), r.isEmpty()) { + this._pieces.splice(o, 1), o--, l--; continue; } - if (l.endLineNumber < i.startLineNumber) + if (r.endLineNumber < i.startLineNumber) continue; - if (l.startLineNumber > i.endLineNumber) { + if (r.startLineNumber > i.endLineNumber) { n = n || { index: o }; continue; } - const [a, c] = l.split(i); - if (a.isEmpty()) { + const [c, d] = r.split(i); + if (c.isEmpty()) { n = n || { index: o }; continue; } - c.isEmpty() || (this._pieces.splice(o, 1, a, c), o++, r++, n = n || { index: o }); + d.isEmpty() || (this._pieces.splice(o, 1, c, d), o++, l++, n = n || { index: o }); } - return n = n || { index: this._pieces.length }, t.length > 0 && (this._pieces = J_(this._pieces, n.index, t)), i; + return n = n || { index: this._pieces.length }, t.length > 0 && (this._pieces = cx(this._pieces, n.index, t)), i; } isComplete() { return this._isComplete; @@ -36443,32 +36443,32 @@ class uX { const i = this._pieces; if (i.length === 0) return t; - const n = uX._findFirstPieceWithLine(i, e), o = i[n].getLineTokens(e); + const n = JJ._findFirstPieceWithLine(i, e), o = i[n].getLineTokens(e); if (!o) return t; - const r = t.getCount(), l = o.getCount(); - let a = 0; - const c = []; - let d = 0, h = 0; - const u = (g, m) => { - g !== h && (h = g, c[d++] = g, c[d++] = m); + const l = t.getCount(), r = o.getCount(); + let c = 0; + const d = []; + let a = 0, h = 0; + const u = (m, b) => { + m !== h && (h = m, d[a++] = m, d[a++] = b); }; - for (let g = 0; g < l; g++) { - const m = o.getStartCharacter(g), f = o.getEndCharacter(g), b = o.getMetadata(g), y = ((b & 1 ? 2048 : 0) | (b & 2 ? 4096 : 0) | (b & 4 ? 8192 : 0) | (b & 8 ? 16384 : 0) | (b & 16 ? 16744448 : 0) | (b & 32 ? 4278190080 : 0)) >>> 0, w = ~y >>> 0; - for (; a < r && t.getEndOffset(a) <= m; ) - u(t.getEndOffset(a), t.getMetadata(a)), a++; - for (a < r && t.getStartOffset(a) < m && u(m, t.getMetadata(a)); a < r && t.getEndOffset(a) < f; ) - u(t.getEndOffset(a), t.getMetadata(a) & w | b & y), a++; - if (a < r) - u(f, t.getMetadata(a) & w | b & y), t.getEndOffset(a) === f && a++; + for (let m = 0; m < r; m++) { + const b = o.getStartCharacter(m), g = o.getEndCharacter(m), Z = o.getMetadata(m), f = ((Z & 1 ? 2048 : 0) | (Z & 2 ? 4096 : 0) | (Z & 4 ? 8192 : 0) | (Z & 8 ? 16384 : 0) | (Z & 16 ? 16744448 : 0) | (Z & 32 ? 4278190080 : 0)) >>> 0, y = ~f >>> 0; + for (; c < l && t.getEndOffset(c) <= b; ) + u(t.getEndOffset(c), t.getMetadata(c)), c++; + for (c < l && t.getStartOffset(c) < b && u(b, t.getMetadata(c)); c < l && t.getEndOffset(c) < g; ) + u(t.getEndOffset(c), t.getMetadata(c) & y | Z & f), c++; + if (c < l) + u(g, t.getMetadata(c) & y | Z & f), t.getEndOffset(c) === g && c++; else { - const C = Math.min(Math.max(0, a - 1), r - 1); - u(f, t.getMetadata(C) & w | b & y); + const W = Math.min(Math.max(0, c - 1), l - 1); + u(g, t.getMetadata(W) & y | Z & f); } } - for (; a < r; ) - u(t.getEndOffset(a), t.getMetadata(a)), a++; - return new rn(new Uint32Array(c), t.getLineContent(), this._languageIdCodec); + for (; c < l; ) + u(t.getEndOffset(c), t.getMetadata(c)), c++; + return new rn(new Uint32Array(d), t.getLineContent(), this._languageIdCodec); } static _findFirstPieceWithLine(e, t) { let i = 0, n = e.length - 1; @@ -36487,33 +36487,33 @@ class uX { return i; } acceptEdit(e, t, i, n, o) { - for (const r of this._pieces) - r.acceptEdit(e, t, i, n, o); + for (const l of this._pieces) + l.acceptEdit(e, t, i, n, o); } } -var Rae = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Rde = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, nW = function(s, e) { +}, yR = function(s, e) { return function(t, i) { e(t, i, s); }; -}, LL; -let kv = LL = class extends FU { - constructor(e, t, i, n, o, r, l) { - super(), this._textModel = e, this._bracketPairsTextModelPart = t, this._languageId = i, this._attachedViews = n, this._languageService = o, this._languageConfigurationService = r, this._treeSitterService = l, this._semanticTokens = new uX(this._languageService.languageIdCodec), this._onDidChangeLanguage = this._register(new k()), this.onDidChangeLanguage = this._onDidChangeLanguage.event, this._onDidChangeLanguageConfiguration = this._register(new k()), this.onDidChangeLanguageConfiguration = this._onDidChangeLanguageConfiguration.event, this._onDidChangeTokens = this._register(new k()), this.onDidChangeTokens = this._onDidChangeTokens.event, this._tokensDisposables = this._register(new U()), this._register(this._languageConfigurationService.onDidChange((a) => { - a.affects(this._languageId) && this._onDidChangeLanguageConfiguration.fire({}); - })), this._register(se.filter(bv.onDidChange, (a) => a.changedLanguages.includes(this._languageId))(() => { +}, JX; +let iT = JX = class extends XQ { + constructor(e, t, i, n, o, l, r) { + super(), this._textModel = e, this._bracketPairsTextModelPart = t, this._languageId = i, this._attachedViews = n, this._languageService = o, this._languageConfigurationService = l, this._treeSitterService = r, this._semanticTokens = new JJ(this._languageService.languageIdCodec), this._onDidChangeLanguage = this._register(new k()), this.onDidChangeLanguage = this._onDidChangeLanguage.event, this._onDidChangeLanguageConfiguration = this._register(new k()), this.onDidChangeLanguageConfiguration = this._onDidChangeLanguageConfiguration.event, this._onDidChangeTokens = this._register(new k()), this.onDidChangeTokens = this._onDidChangeTokens.event, this._tokensDisposables = this._register(new _()), this._register(this._languageConfigurationService.onDidChange((c) => { + c.affects(this._languageId) && this._onDidChangeLanguageConfiguration.fire({}); + })), this._register(se.filter(Hw.onDidChange, (c) => c.changedLanguages.includes(this._languageId))(() => { this.createPreferredTokenProvider(); })), this.createPreferredTokenProvider(); } createGrammarTokens() { - return this._register(new vY(this._languageService.languageIdCodec, this._textModel, () => this._languageId, this._attachedViews)); + return this._register(new iz(this._languageService.languageIdCodec, this._textModel, () => this._languageId, this._attachedViews)); } createTreeSitterTokens() { - return this._register(new NY(this._treeSitterService, this._languageService.languageIdCodec, this._textModel, () => this._languageId)); + return this._register(new ez(this._treeSitterService, this._languageService.languageIdCodec, this._textModel, () => this._languageId)); } createTokens(e) { var i; @@ -36525,7 +36525,7 @@ let kv = LL = class extends FU { })), t && this._tokens.resetTokenization(); } createPreferredTokenProvider() { - bv.get(this._languageId) ? this._tokens instanceof NY || this.createTokens(!0) : this._tokens instanceof vY || this.createTokens(!1); + Hw.get(this._languageId) ? this._tokens instanceof ez || this.createTokens(!0) : this._tokens instanceof iz || this.createTokens(!1); } handleLanguageConfigurationServiceChange(e) { e.affects(this._languageId) && this._onDidChangeLanguageConfiguration.fire({}); @@ -36535,7 +36535,7 @@ let kv = LL = class extends FU { this._semanticTokens.flush(); else if (!e.isEolChange) for (const t of e.changes) { - const [i, n, o] = kh(t.text); + const [i, n, o] = Eh(t.text); this._semanticTokens.acceptEdit( t.range, i, @@ -36564,7 +36564,7 @@ let kv = LL = class extends FU { // #region Grammar Tokens validateLineNumber(e) { if (e < 1 || e > this._textModel.getLineCount()) - throw new mt("Illegal value for lineNumber"); + throw new bt("Illegal value for lineNumber"); } get hasTokens() { return this._tokens.hasTokens; @@ -36625,11 +36625,11 @@ let kv = LL = class extends FU { // #region Utility Methods getWordAtPosition(e) { this.assertNotDisposed(); - const t = this._textModel.validatePosition(e), i = this._textModel.getLineContent(t.lineNumber), n = this.getLineTokens(t.lineNumber), o = n.findTokenIndexAtOffset(t.column - 1), [r, l] = LL._findLanguageBoundaries(n, o), a = Gw(t.column, this.getLanguageConfiguration(n.getLanguageId(o)).getWordDefinition(), i.substring(r, l), r); - if (a && a.startColumn <= e.column && e.column <= a.endColumn) - return a; - if (o > 0 && r === t.column - 1) { - const [c, d] = LL._findLanguageBoundaries(n, o - 1), h = Gw(t.column, this.getLanguageConfiguration(n.getLanguageId(o - 1)).getWordDefinition(), i.substring(c, d), c); + const t = this._textModel.validatePosition(e), i = this._textModel.getLineContent(t.lineNumber), n = this.getLineTokens(t.lineNumber), o = n.findTokenIndexAtOffset(t.column - 1), [l, r] = JX._findLanguageBoundaries(n, o), c = _y(t.column, this.getLanguageConfiguration(n.getLanguageId(o)).getWordDefinition(), i.substring(l, r), l); + if (c && c.startColumn <= e.column && e.column <= c.endColumn) + return c; + if (o > 0 && l === t.column - 1) { + const [d, a] = JX._findLanguageBoundaries(n, o - 1), h = _y(t.column, this.getLanguageConfiguration(n.getLanguageId(o - 1)).getWordDefinition(), i.substring(d, a), d); if (h && h.startColumn <= e.column && e.column <= h.endColumn) return h; } @@ -36641,11 +36641,11 @@ let kv = LL = class extends FU { static _findLanguageBoundaries(e, t) { const i = e.getLanguageId(t); let n = 0; - for (let r = t; r >= 0 && e.getLanguageId(r) === i; r--) - n = e.getStartOffset(r); + for (let l = t; l >= 0 && e.getLanguageId(l) === i; l--) + n = e.getStartOffset(l); let o = e.getLineContent().length; - for (let r = t, l = e.getCount(); r < l && e.getLanguageId(r) === i; r++) - o = e.getEndOffset(r); + for (let l = t, r = e.getCount(); l < r && e.getLanguageId(l) === i; l++) + o = e.getEndOffset(l); return [n, o]; } getWordUntilPosition(e) { @@ -36662,7 +36662,7 @@ let kv = LL = class extends FU { return this._languageId; } getLanguageIdAtPosition(e, t) { - const i = this._textModel.validatePosition(new V(e, t)), n = this.getLineTokens(i.lineNumber); + const i = this._textModel.validatePosition(new Y(e, t)), n = this.getLineTokens(i.lineNumber); return n.getLanguageId(n.findTokenIndexAtOffset(i.column - 1)); } setLanguageId(e, t = "api") { @@ -36676,27 +36676,27 @@ let kv = LL = class extends FU { this._languageId = e, this._bracketPairsTextModelPart.handleDidChangeLanguage(i), this._tokens.resetTokenization(), this.createPreferredTokenProvider(), this._onDidChangeLanguage.fire(i), this._onDidChangeLanguageConfiguration.fire({}); } }; -kv = LL = Rae([ - nW(4, ri), - nW(5, li), - nW(6, gK) -], kv); -class vY extends uK { +iT = JX = Rde([ + yR(4, ri), + yR(5, ci), + yR(6, QQ) +], iT); +class iz extends _Q { constructor(e, t, i, n) { - super(e, t, i), this._tokenizer = null, this._defaultBackgroundTokenizer = null, this._backgroundTokenizer = this._register(new fn()), this._tokens = new u1(this._languageIdCodec), this._debugBackgroundTokenizer = this._register(new fn()), this._attachedViewStates = this._register(new QR()), this._register(Wi.onDidChange((o) => { - const r = this.getLanguageId(); - o.changedLanguages.indexOf(r) !== -1 && this.resetTokenization(); - })), this.resetTokenization(), this._register(n.onDidChangeVisibleRanges(({ view: o, state: r }) => { - if (r) { - let l = this._attachedViewStates.get(o); - l || (l = new Gae(() => this.refreshRanges(l.lineRanges)), this._attachedViewStates.set(o, l)), l.handleStateChange(r); + super(e, t, i), this._tokenizer = null, this._defaultBackgroundTokenizer = null, this._backgroundTokenizer = this._register(new Zn()), this._tokens = new LW(this._languageIdCodec), this._debugBackgroundTokenizer = this._register(new Zn()), this._attachedViewStates = this._register(new Gv()), this._register(Ti.onDidChange((o) => { + const l = this.getLanguageId(); + o.changedLanguages.indexOf(l) !== -1 && this.resetTokenization(); + })), this.resetTokenization(), this._register(n.onDidChangeVisibleRanges(({ view: o, state: l }) => { + if (l) { + let r = this._attachedViewStates.get(o); + r || (r = new Cde(() => this.refreshRanges(r.lineRanges)), this._attachedViewStates.set(o, r)), r.handleStateChange(l); } else this._attachedViewStates.deleteAndDispose(o); })); } resetTokenization(e = !0) { var o; - this._tokens.flush(), (o = this._debugBackgroundTokens) == null || o.flush(), this._debugBackgroundStates && (this._debugBackgroundStates = new Vv(this._textModel.getLineCount())), e && this._onDidChangeTokens.fire({ + this._tokens.flush(), (o = this._debugBackgroundTokens) == null || o.flush(), this._debugBackgroundStates && (this._debugBackgroundStates = new tT(this._textModel.getLineCount())), e && this._onDidChangeTokens.fire({ semanticTokensApplied: !1, ranges: [ { @@ -36708,46 +36708,46 @@ class vY extends uK { const t = () => { if (this._textModel.isTooLargeForTokenization()) return [null, null]; - const r = Wi.get(this.getLanguageId()); - if (!r) + const l = Ti.get(this.getLanguageId()); + if (!l) return [null, null]; - let l; + let r; try { - l = r.getInitialState(); - } catch (a) { - return De(a), [null, null]; + r = l.getInitialState(); + } catch (c) { + return Me(c), [null, null]; } - return [r, l]; + return [l, r]; }, [i, n] = t(); - if (i && n ? this._tokenizer = new Wae(this._textModel.getLineCount(), i, this._textModel, this._languageIdCodec) : this._tokenizer = null, this._backgroundTokenizer.clear(), this._defaultBackgroundTokenizer = null, this._tokenizer) { - const r = { - setTokens: (l) => { - this.setTokens(l); + if (i && n ? this._tokenizer = new Xde(this._textModel.getLineCount(), i, this._textModel, this._languageIdCodec) : this._tokenizer = null, this._backgroundTokenizer.clear(), this._defaultBackgroundTokenizer = null, this._tokenizer) { + const l = { + setTokens: (r) => { + this.setTokens(r); }, backgroundTokenizationFinished: () => { if (this._backgroundTokenizationState === 2) return; - const l = 2; - this._backgroundTokenizationState = l, this._onDidChangeBackgroundTokenizationState.fire(); + const r = 2; + this._backgroundTokenizationState = r, this._onDidChangeBackgroundTokenizationState.fire(); }, - setEndState: (l, a) => { - var d; + setEndState: (r, c) => { + var a; if (!this._tokenizer) return; - const c = this._tokenizer.store.getFirstInvalidEndStateLineNumber(); - c !== null && l >= c && ((d = this._tokenizer) == null || d.store.setEndState(l, a)); + const d = this._tokenizer.store.getFirstInvalidEndStateLineNumber(); + d !== null && r >= d && ((a = this._tokenizer) == null || a.store.setEndState(r, c)); } }; - i && i.createBackgroundTokenizer && !i.backgroundTokenizerShouldOnlyVerifyTokens && (this._backgroundTokenizer.value = i.createBackgroundTokenizer(this._textModel, r)), !this._backgroundTokenizer.value && !this._textModel.isTooLargeForTokenization() && (this._backgroundTokenizer.value = this._defaultBackgroundTokenizer = new Dae(this._tokenizer, r), this._defaultBackgroundTokenizer.handleChanges()), i != null && i.backgroundTokenizerShouldOnlyVerifyTokens && i.createBackgroundTokenizer ? (this._debugBackgroundTokens = new u1(this._languageIdCodec), this._debugBackgroundStates = new Vv(this._textModel.getLineCount()), this._debugBackgroundTokenizer.clear(), this._debugBackgroundTokenizer.value = i.createBackgroundTokenizer(this._textModel, { - setTokens: (l) => { - var a; - (a = this._debugBackgroundTokens) == null || a.setMultilineTokens(l, this._textModel); + i && i.createBackgroundTokenizer && !i.backgroundTokenizerShouldOnlyVerifyTokens && (this._backgroundTokenizer.value = i.createBackgroundTokenizer(this._textModel, l)), !this._backgroundTokenizer.value && !this._textModel.isTooLargeForTokenization() && (this._backgroundTokenizer.value = this._defaultBackgroundTokenizer = new Ide(this._tokenizer, l), this._defaultBackgroundTokenizer.handleChanges()), i != null && i.backgroundTokenizerShouldOnlyVerifyTokens && i.createBackgroundTokenizer ? (this._debugBackgroundTokens = new LW(this._languageIdCodec), this._debugBackgroundStates = new tT(this._textModel.getLineCount()), this._debugBackgroundTokenizer.clear(), this._debugBackgroundTokenizer.value = i.createBackgroundTokenizer(this._textModel, { + setTokens: (r) => { + var c; + (c = this._debugBackgroundTokens) == null || c.setMultilineTokens(r, this._textModel); }, backgroundTokenizationFinished() { }, - setEndState: (l, a) => { - var c; - (c = this._debugBackgroundStates) == null || c.setEndState(l, a); + setEndState: (r, c) => { + var d; + (d = this._debugBackgroundStates) == null || d.setEndState(r, c); } })) : (this._debugBackgroundTokens = void 0, this._debugBackgroundStates = void 0, this._debugBackgroundTokenizer.value = void 0); } @@ -36763,8 +36763,8 @@ class vY extends uK { this.resetTokenization(!1); else if (!e.isEolChange) { for (const o of e.changes) { - const [r, l] = kh(o.text); - this._tokens.acceptEdit(o.range, r, l), (t = this._debugBackgroundTokens) == null || t.acceptEdit(o.range, r, l); + const [l, r] = Eh(o.text); + this._tokens.acceptEdit(o.range, l, r), (t = this._debugBackgroundTokens) == null || t.acceptEdit(o.range, l, r); } (i = this._debugBackgroundStates) == null || i.acceptChanges(e.changes), this._tokenizer && this._tokenizer.store.acceptChanges(e.changes), (n = this._defaultBackgroundTokenizer) == null || n.handleChanges(); } @@ -36774,7 +36774,7 @@ class vY extends uK { return t.length > 0 && this._onDidChangeTokens.fire({ semanticTokensApplied: !1, ranges: t }), { changes: t }; } refreshAllVisibleLineTokens() { - const e = We.joinMany([...this._attachedViewStates].map(([t, i]) => i.lineRanges)); + const e = Ne.joinMany([...this._attachedViewStates].map(([t, i]) => i.lineRanges)); this.refreshRanges(e); } refreshRanges(e) { @@ -36782,19 +36782,19 @@ class vY extends uK { this.refreshRange(t.startLineNumber, t.endLineNumberExclusive - 1); } refreshRange(e, t) { - var r, l; + var l, r; if (!this._tokenizer) return; e = Math.max(1, Math.min(this._textModel.getLineCount(), e)), t = Math.min(this._textModel.getLineCount(), t); - const i = new Dv(), { heuristicTokens: n } = this._tokenizer.tokenizeHeuristically(i, e, t), o = this.setTokens(i.finalize()); + const i = new eT(), { heuristicTokens: n } = this._tokenizer.tokenizeHeuristically(i, e, t), o = this.setTokens(i.finalize()); if (n) - for (const a of o.changes) - (r = this._backgroundTokenizer.value) == null || r.requestTokens(a.fromLineNumber, a.toLineNumber + 1); - (l = this._defaultBackgroundTokenizer) == null || l.checkFinished(); + for (const c of o.changes) + (l = this._backgroundTokenizer.value) == null || l.requestTokens(c.fromLineNumber, c.toLineNumber + 1); + (r = this._defaultBackgroundTokenizer) == null || r.checkFinished(); } forceTokenization(e) { var i, n; - const t = new Dv(); + const t = new eT(); (i = this._tokenizer) == null || i.updateTokensUntilLine(t, e), this.setTokens(t.finalize()), (n = this._defaultBackgroundTokenizer) == null || n.checkFinished(); } hasAccurateTokensForLine(e) { @@ -36815,7 +36815,7 @@ class vY extends uK { getTokenTypeIfInsertingCharacter(e, t, i) { if (!this._tokenizer) return 0; - const n = this._textModel.validatePosition(new V(e, t)); + const n = this._textModel.validatePosition(new Y(e, t)); return this.forceTokenization(n.lineNumber), this._tokenizer.getTokenTypeIfInsertingCharacter(n, i); } tokenizeLineWithEdit(e, t, i) { @@ -36828,60 +36828,60 @@ class vY extends uK { return this._tokens.hasTokens; } } -const gX = $e("undoRedoService"); -class mK { +const HJ = $e("undoRedoService"); +class OQ { constructor(e, t) { this.resource = e, this.elements = t; } } -const hf = class hf { +const Zg = class Zg { constructor() { - this.id = hf._ID++, this.order = 1; + this.id = Zg._ID++, this.order = 1; } nextOrder() { return this.id === 0 ? 0 : this.order++; } }; -hf._ID = 0, hf.None = new hf(); -let Gv = hf; -const uf = class uf { +Zg._ID = 0, Zg.None = new Zg(); +let nT = Zg; +const fg = class fg { constructor() { - this.id = uf._ID++, this.order = 1; + this.id = fg._ID++, this.order = 1; } nextOrder() { return this.id === 0 ? 0 : this.order++; } }; -uf._ID = 0, uf.None = new uf(); -let Eu = uf; -var Eae = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +fg._ID = 0, fg.None = new fg(); +let Au = fg; +var Nde = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, gS = function(s, e) { +}, S1 = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Mu; -function Xae(s) { - const e = new dK(); +}, Nu; +function wde(s) { + const e = new PQ(); return e.acceptChunk(s), e.finish(); } -function Fae(s) { - const e = new dK(); +function Tde(s) { + const e = new PQ(); let t; for (; typeof (t = s.read()) == "string"; ) e.acceptChunk(t); return e.finish(); } -function TY(s, e) { +function nz(s, e) { let t; - return typeof s == "string" ? t = Xae(s) : wre(s) ? t = Fae(s) : t = s, t.create(e); + return typeof s == "string" ? t = wde(s) : hre(s) ? t = Tde(s) : t = s, t.create(e); } -let mS = 0; -const Yae = 999, zae = 1e4; -class Pae { +let x1 = 0; +const Mde = 999, Yde = 1e4; +class kde { constructor(e) { this._source = e, this._eos = !1; } @@ -36899,15 +36899,15 @@ class Pae { } while (!0); } } -const X0 = () => { +const P0 = () => { throw new Error("Invalid change accessor"); }; -var Cl; -let Al = (Cl = class extends R { +var Lr; +let xr = (Lr = class extends J { static resolveOptions(e, t) { if (t.detectIndentation) { - const i = CY(e, t.tabSize, t.insertSpaces); - return new SL({ + const i = UF(e, t.tabSize, t.insertSpaces); + return new vX({ tabSize: i.tabSize, indentSize: "tabSize", // TODO@Alex: guess indentSize independent of tabSize @@ -36917,7 +36917,7 @@ let Al = (Cl = class extends R { bracketPairColorizationOptions: t.bracketPairColorizationOptions }); } - return new SL(t); + return new vX(t); } get onDidChangeLanguage() { return this._tokenizationTextModelPart.onDidChangeLanguage; @@ -36932,7 +36932,7 @@ let Al = (Cl = class extends R { return this._eventEmitter.slowEvent((t) => e(t.contentChangedEvent)); } onDidChangeContentOrInjectedText(e) { - return Yr(this._eventEmitter.fastEvent((t) => e(t)), this._onDidChangeInjectedText.event((t) => e(t))); + return Kl(this._eventEmitter.fastEvent((t) => e(t)), this._onDidChangeInjectedText.event((t) => e(t))); } _isDisposing() { return this.__isDisposing; @@ -36946,43 +36946,43 @@ let Al = (Cl = class extends R { get guides() { return this._guidesTextModelPart; } - constructor(e, t, i, n = null, o, r, l, a) { - super(), this._undoRedoService = o, this._languageService = r, this._languageConfigurationService = l, this.instantiationService = a, this._onWillDispose = this._register(new k()), this.onWillDispose = this._onWillDispose.event, this._onDidChangeDecorations = this._register(new Kae((m) => this.handleBeforeFireDecorationsChangedEvent(m))), this.onDidChangeDecorations = this._onDidChangeDecorations.event, this._onDidChangeOptions = this._register(new k()), this.onDidChangeOptions = this._onDidChangeOptions.event, this._onDidChangeAttached = this._register(new k()), this.onDidChangeAttached = this._onDidChangeAttached.event, this._onDidChangeInjectedText = this._register(new k()), this._eventEmitter = this._register(new Qae()), this._languageSelectionListener = this._register(new fn()), this._deltaDecorationCallCnt = 0, this._attachedViews = new Vae(), mS++, this.id = "$model" + mS, this.isForSimpleWidget = i.isForSimpleWidget, typeof n > "u" || n === null ? this._associatedResource = Le.parse("inmemory://model/" + mS) : this._associatedResource = n, this._attachedEditorCount = 0; - const { textBuffer: c, disposable: d } = TY(e, i.defaultEOL); - this._buffer = c, this._bufferDisposable = d, this._options = Mu.resolveOptions(this._buffer, i); + constructor(e, t, i, n = null, o, l, r, c) { + super(), this._undoRedoService = o, this._languageService = l, this._languageConfigurationService = r, this.instantiationService = c, this._onWillDispose = this._register(new k()), this.onWillDispose = this._onWillDispose.event, this._onDidChangeDecorations = this._register(new Fde((b) => this.handleBeforeFireDecorationsChangedEvent(b))), this.onDidChangeDecorations = this._onDidChangeDecorations.event, this._onDidChangeOptions = this._register(new k()), this.onDidChangeOptions = this._onDidChangeOptions.event, this._onDidChangeAttached = this._register(new k()), this.onDidChangeAttached = this._onDidChangeAttached.event, this._onDidChangeInjectedText = this._register(new k()), this._eventEmitter = this._register(new zde()), this._languageSelectionListener = this._register(new Zn()), this._deltaDecorationCallCnt = 0, this._attachedViews = new Sde(), x1++, this.id = "$model" + x1, this.isForSimpleWidget = i.isForSimpleWidget, typeof n > "u" || n === null ? this._associatedResource = Xe.parse("inmemory://model/" + x1) : this._associatedResource = n, this._attachedEditorCount = 0; + const { textBuffer: d, disposable: a } = nz(e, i.defaultEOL); + this._buffer = d, this._bufferDisposable = a, this._options = Nu.resolveOptions(this._buffer, i); const h = typeof t == "string" ? t : t.languageId; - typeof t != "string" && (this._languageSelectionListener.value = t.onDidChange(() => this._setLanguage(t.languageId))), this._bracketPairs = this._register(new zle(this, this._languageConfigurationService)), this._guidesTextModelPart = this._register(new Vre(this, this._languageConfigurationService)), this._decorationProvider = this._register(new Ble(this)), this._tokenizationTextModelPart = this.instantiationService.createInstance(kv, this, this._bracketPairs, h, this._attachedViews); - const u = this._buffer.getLineCount(), g = this._buffer.getValueLengthInRange( - new M(1, 1, u, this._buffer.getLineLength(u) + 1), + typeof t != "string" && (this._languageSelectionListener.value = t.onDidChange(() => this._setLanguage(t.languageId))), this._bracketPairs = this._register(new Yce(this, this._languageConfigurationService)), this._guidesTextModelPart = this._register(new Sre(this, this._languageConfigurationService)), this._decorationProvider = this._register(new vce(this)), this._tokenizationTextModelPart = this.instantiationService.createInstance(iT, this, this._bracketPairs, h, this._attachedViews); + const u = this._buffer.getLineCount(), m = this._buffer.getValueLengthInRange( + new I(1, 1, u, this._buffer.getLineLength(u) + 1), 0 /* model.EndOfLinePreference.TextDefined */ ); - i.largeFileOptimizations ? (this._isTooLargeForTokenization = g > Mu.LARGE_FILE_SIZE_THRESHOLD || u > Mu.LARGE_FILE_LINE_COUNT_THRESHOLD, this._isTooLargeForHeapOperation = g > Mu.LARGE_FILE_HEAP_OPERATION_THRESHOLD) : (this._isTooLargeForTokenization = !1, this._isTooLargeForHeapOperation = !1), this._isTooLargeForSyncing = g > Mu._MODEL_SYNC_LIMIT, this._versionId = 1, this._alternativeVersionId = 1, this._initialUndoRedoSnapshot = null, this._isDisposed = !1, this.__isDisposing = !1, this._instanceId = zH(mS), this._lastDecorationId = 0, this._decorations = /* @__PURE__ */ Object.create(null), this._decorationsTree = new DY(), this._commandManager = new oX(this, this._undoRedoService), this._isUndoing = !1, this._isRedoing = !1, this._trimAutoWhitespaceLines = null, this._register(this._decorationProvider.onDidChange(() => { + i.largeFileOptimizations ? (this._isTooLargeForTokenization = m > Nu.LARGE_FILE_SIZE_THRESHOLD || u > Nu.LARGE_FILE_LINE_COUNT_THRESHOLD, this._isTooLargeForHeapOperation = m > Nu.LARGE_FILE_HEAP_OPERATION_THRESHOLD) : (this._isTooLargeForTokenization = !1, this._isTooLargeForHeapOperation = !1), this._isTooLargeForSyncing = m > Nu._MODEL_SYNC_LIMIT, this._versionId = 1, this._alternativeVersionId = 1, this._initialUndoRedoSnapshot = null, this._isDisposed = !1, this.__isDisposing = !1, this._instanceId = LB(x1), this._lastDecorationId = 0, this._decorations = /* @__PURE__ */ Object.create(null), this._decorationsTree = new sz(), this._commandManager = new NJ(this, this._undoRedoService), this._isUndoing = !1, this._isRedoing = !1, this._trimAutoWhitespaceLines = null, this._register(this._decorationProvider.onDidChange(() => { this._onDidChangeDecorations.beginDeferredEmit(), this._onDidChangeDecorations.fire(), this._onDidChangeDecorations.endDeferredEmit(); - })), this._languageService.requestRichLanguageFeatures(h), this._register(this._languageConfigurationService.onDidChange((m) => { - this._bracketPairs.handleLanguageConfigurationServiceChange(m), this._tokenizationTextModelPart.handleLanguageConfigurationServiceChange(m); + })), this._languageService.requestRichLanguageFeatures(h), this._register(this._languageConfigurationService.onDidChange((b) => { + this._bracketPairs.handleLanguageConfigurationServiceChange(b), this._tokenizationTextModelPart.handleLanguageConfigurationServiceChange(b); })); } dispose() { this.__isDisposing = !0, this._onWillDispose.fire(), this._tokenizationTextModelPart.dispose(), this._isDisposed = !0, super.dispose(), this._bufferDisposable.dispose(), this.__isDisposing = !1; - const e = new Df([], "", ` + const e = new Eg([], "", ` `, !1, !1, !0, !0); - e.dispose(), this._buffer = e, this._bufferDisposable = R.None; + e.dispose(), this._buffer = e, this._bufferDisposable = J.None; } _assertNotDisposed() { if (this._isDisposed) - throw new mt("Model is disposed!"); + throw new bt("Model is disposed!"); } _emitContentChangedEvent(e, t) { - this.__isDisposing || (this._tokenizationTextModelPart.handleDidChangeContent(t), this._bracketPairs.handleDidChangeContent(t), this._eventEmitter.fire(new hg(e, t))); + this.__isDisposing || (this._tokenizationTextModelPart.handleDidChangeContent(t), this._bracketPairs.handleDidChangeContent(t), this._eventEmitter.fire(new gm(e, t))); } setValue(e) { if (this._assertNotDisposed(), e == null) - throw hr(); - const { textBuffer: t, disposable: i } = TY(e, this._options.defaultEOL); + throw bl(); + const { textBuffer: t, disposable: i } = nz(e, this._options.defaultEOL); this._setValueFromTextBuffer(t, i); } - _createContentChanged2(e, t, i, n, o, r, l, a) { + _createContentChanged2(e, t, i, n, o, l, r, c) { return { changes: [{ range: e, @@ -36991,19 +36991,19 @@ let Al = (Cl = class extends R { text: n }], eol: this._buffer.getEOL(), - isEolChange: a, + isEolChange: c, versionId: this.getVersionId(), isUndoing: o, - isRedoing: r, - isFlush: l + isRedoing: l, + isFlush: r }; } _setValueFromTextBuffer(e, t) { this._assertNotDisposed(); - const i = this.getFullModelRange(), n = this.getValueLengthInRange(i), o = this.getLineCount(), r = this.getLineMaxColumn(o); - this._buffer = e, this._bufferDisposable.dispose(), this._bufferDisposable = t, this._increaseVersionId(), this._decorations = /* @__PURE__ */ Object.create(null), this._decorationsTree = new DY(), this._commandManager.clear(), this._trimAutoWhitespaceLines = null, this._emitContentChangedEvent(new Wf([ - new gle() - ], this._versionId, !1, !1), this._createContentChanged2(new M(1, 1, o, r), 0, n, this.getValue(), !1, !1, !0, !1)); + const i = this.getFullModelRange(), n = this.getValueLengthInRange(i), o = this.getLineCount(), l = this.getLineMaxColumn(o); + this._buffer = e, this._bufferDisposable.dispose(), this._bufferDisposable = t, this._increaseVersionId(), this._decorations = /* @__PURE__ */ Object.create(null), this._decorationsTree = new sz(), this._commandManager.clear(), this._trimAutoWhitespaceLines = null, this._emitContentChangedEvent(new vg([ + new oce() + ], this._versionId, !1, !1), this._createContentChanged2(new I(1, 1, o, l), 0, n, this.getValue(), !1, !1, !0, !1)); } setEOL(e) { this._assertNotDisposed(); @@ -37012,10 +37012,10 @@ let Al = (Cl = class extends R { `; if (this._buffer.getEOL() === t) return; - const i = this.getFullModelRange(), n = this.getValueLengthInRange(i), o = this.getLineCount(), r = this.getLineMaxColumn(o); - this._onBeforeEOLChange(), this._buffer.setEOL(t), this._increaseVersionId(), this._onAfterEOLChange(), this._emitContentChangedEvent(new Wf([ - new fle() - ], this._versionId, !1, !1), this._createContentChanged2(new M(1, 1, o, r), 0, n, this.getValue(), !1, !1, !1, !0)); + const i = this.getFullModelRange(), n = this.getValueLengthInRange(i), o = this.getLineCount(), l = this.getLineMaxColumn(o); + this._onBeforeEOLChange(), this._buffer.setEOL(t), this._increaseVersionId(), this._onAfterEOLChange(), this._emitContentChangedEvent(new vg([ + new cce() + ], this._versionId, !1, !1), this._createContentChanged2(new I(1, 1, o, l), 0, n, this.getValue(), !1, !1, !1, !0)); } _onBeforeEOLChange() { this._decorationsTree.ensureAllNodesHaveRanges(this); @@ -37023,8 +37023,8 @@ let Al = (Cl = class extends R { _onAfterEOLChange() { const e = this.getVersionId(), t = this._decorationsTree.collectNodesPostOrder(); for (let i = 0, n = t.length; i < n; i++) { - const o = t[i], r = o.range, l = o.cachedAbsoluteStart - o.start, a = this._buffer.getOffsetAt(r.startLineNumber, r.startColumn), c = this._buffer.getOffsetAt(r.endLineNumber, r.endColumn); - o.cachedAbsoluteStart = a, o.cachedAbsoluteEnd = c, o.cachedVersionId = e, o.start = a - l, o.end = c - l, Rh(o); + const o = t[i], l = o.range, r = o.cachedAbsoluteStart - o.start, c = this._buffer.getOffsetAt(l.startLineNumber, l.startColumn), d = this._buffer.getOffsetAt(l.endLineNumber, l.endColumn); + o.cachedAbsoluteStart = c, o.cachedAbsoluteEnd = d, o.cachedVersionId = e, o.start = c - r, o.end = d - r, Fh(o); } } onBeforeAttached() { @@ -37058,7 +37058,7 @@ let Al = (Cl = class extends R { const i = this._buffer.getLineCount(); for (let n = 1; n <= i; n++) { const o = this._buffer.getLineLength(n); - o >= zae ? t += o : e += o; + o >= Yde ? t += o : e += o; } return t > e; } @@ -37077,22 +37077,22 @@ let Al = (Cl = class extends R { } updateOptions(e) { this._assertNotDisposed(); - const t = typeof e.tabSize < "u" ? e.tabSize : this._options.tabSize, i = typeof e.indentSize < "u" ? e.indentSize : this._options.originalIndentSize, n = typeof e.insertSpaces < "u" ? e.insertSpaces : this._options.insertSpaces, o = typeof e.trimAutoWhitespace < "u" ? e.trimAutoWhitespace : this._options.trimAutoWhitespace, r = typeof e.bracketColorizationOptions < "u" ? e.bracketColorizationOptions : this._options.bracketPairColorizationOptions, l = new SL({ + const t = typeof e.tabSize < "u" ? e.tabSize : this._options.tabSize, i = typeof e.indentSize < "u" ? e.indentSize : this._options.originalIndentSize, n = typeof e.insertSpaces < "u" ? e.insertSpaces : this._options.insertSpaces, o = typeof e.trimAutoWhitespace < "u" ? e.trimAutoWhitespace : this._options.trimAutoWhitespace, l = typeof e.bracketColorizationOptions < "u" ? e.bracketColorizationOptions : this._options.bracketPairColorizationOptions, r = new vX({ tabSize: t, indentSize: i, insertSpaces: n, defaultEOL: this._options.defaultEOL, trimAutoWhitespace: o, - bracketPairColorizationOptions: r + bracketPairColorizationOptions: l }); - if (this._options.equals(l)) + if (this._options.equals(r)) return; - const a = this._options.createChangeEvent(l); - this._options = l, this._bracketPairs.handleDidChangeOptions(a), this._decorationProvider.handleDidChangeOptions(a), this._onDidChangeOptions.fire(a); + const c = this._options.createChangeEvent(r); + this._options = r, this._bracketPairs.handleDidChangeOptions(c), this._decorationProvider.handleDidChangeOptions(c), this._onDidChangeOptions.fire(c); } detectIndentation(e, t) { this._assertNotDisposed(); - const i = CY(this._buffer, t, e); + const i = UF(this._buffer, t, e); this.updateOptions({ insertSpaces: i.insertSpaces, tabSize: i.tabSize, @@ -37101,7 +37101,7 @@ let Al = (Cl = class extends R { }); } normalizeIndentation(e) { - return this._assertNotDisposed(), pE(e, this._options.indentSize, this._options.insertSpaces); + return this._assertNotDisposed(), Dv(e, this._options.indentSize, this._options.insertSpaces); } //#endregion //#region Reading @@ -37116,7 +37116,7 @@ let Al = (Cl = class extends R { } removeUnusualLineTerminators(e = null) { const t = this.findMatches( - FH.source, + XB.source, !1, !0, !1, @@ -37165,12 +37165,12 @@ let Al = (Cl = class extends R { } getValue(e, t = !1) { if (this._assertNotDisposed(), this.isTooLargeForHeapOperation()) - throw new mt("Operation would exceed heap memory limits"); + throw new bt("Operation would exceed heap memory limits"); const i = this.getFullModelRange(), n = this.getValueInRange(i, e); return t ? this._buffer.getBOM() + n : n; } createSnapshot(e = !1) { - return new Pae(this._buffer.createSnapshot(e)); + return new kde(this._buffer.createSnapshot(e)); } getValueLength(e, t = !1) { this._assertNotDisposed(); @@ -37191,17 +37191,17 @@ let Al = (Cl = class extends R { } getLineContent(e) { if (this._assertNotDisposed(), e < 1 || e > this.getLineCount()) - throw new mt("Illegal value for lineNumber"); + throw new bt("Illegal value for lineNumber"); return this._buffer.getLineContent(e); } getLineLength(e) { if (this._assertNotDisposed(), e < 1 || e > this.getLineCount()) - throw new mt("Illegal value for lineNumber"); + throw new bt("Illegal value for lineNumber"); return this._buffer.getLineLength(e); } getLinesContent() { if (this._assertNotDisposed(), this.isTooLargeForHeapOperation()) - throw new mt("Operation would exceed heap memory limits"); + throw new bt("Operation would exceed heap memory limits"); return this._buffer.getLinesContent(); } getEOL() { @@ -37216,17 +37216,17 @@ let Al = (Cl = class extends R { } getLineMaxColumn(e) { if (this._assertNotDisposed(), e < 1 || e > this.getLineCount()) - throw new mt("Illegal value for lineNumber"); + throw new bt("Illegal value for lineNumber"); return this._buffer.getLineLength(e) + 1; } getLineFirstNonWhitespaceColumn(e) { if (this._assertNotDisposed(), e < 1 || e > this.getLineCount()) - throw new mt("Illegal value for lineNumber"); + throw new bt("Illegal value for lineNumber"); return this._buffer.getLineFirstNonWhitespaceColumn(e); } getLineLastNonWhitespaceColumn(e) { if (this._assertNotDisposed(), e < 1 || e > this.getLineCount()) - throw new mt("Illegal value for lineNumber"); + throw new bt("Illegal value for lineNumber"); return this._buffer.getLineLastNonWhitespaceColumn(e); } /** @@ -37235,30 +37235,30 @@ let Al = (Cl = class extends R { */ _validateRangeRelaxedNoAllocations(e) { const t = this._buffer.getLineCount(), i = e.startLineNumber, n = e.startColumn; - let o = Math.floor(typeof i == "number" && !isNaN(i) ? i : 1), r = Math.floor(typeof n == "number" && !isNaN(n) ? n : 1); + let o = Math.floor(typeof i == "number" && !isNaN(i) ? i : 1), l = Math.floor(typeof n == "number" && !isNaN(n) ? n : 1); if (o < 1) - o = 1, r = 1; + o = 1, l = 1; else if (o > t) - o = t, r = this.getLineMaxColumn(o); - else if (r <= 1) - r = 1; + o = t, l = this.getLineMaxColumn(o); + else if (l <= 1) + l = 1; else { const h = this.getLineMaxColumn(o); - r >= h && (r = h); - } - const l = e.endLineNumber, a = e.endColumn; - let c = Math.floor(typeof l == "number" && !isNaN(l) ? l : 1), d = Math.floor(typeof a == "number" && !isNaN(a) ? a : 1); - if (c < 1) - c = 1, d = 1; - else if (c > t) - c = t, d = this.getLineMaxColumn(c); - else if (d <= 1) - d = 1; + l >= h && (l = h); + } + const r = e.endLineNumber, c = e.endColumn; + let d = Math.floor(typeof r == "number" && !isNaN(r) ? r : 1), a = Math.floor(typeof c == "number" && !isNaN(c) ? c : 1); + if (d < 1) + d = 1, a = 1; + else if (d > t) + d = t, a = this.getLineMaxColumn(d); + else if (a <= 1) + a = 1; else { - const h = this.getLineMaxColumn(c); - d >= h && (d = h); + const h = this.getLineMaxColumn(d); + a >= h && (a = h); } - return i === o && n === r && l === c && a === d && e instanceof M && !(e instanceof fe) ? e : new M(o, r, c, d); + return i === o && n === l && r === d && c === a && e instanceof I && !(e instanceof ge) ? e : new I(o, l, d, a); } _isValidPosition(e, t, i) { if (typeof e != "number" || typeof t != "number" || isNaN(e) || isNaN(t) || e < 1 || t < 1 || (e | 0) !== e || (t | 0) !== t) @@ -37272,35 +37272,35 @@ let Al = (Cl = class extends R { if (t > o) return !1; if (i === 1) { - const r = this._buffer.getLineCharCode(e, t - 2); - if (Hi(r)) + const l = this._buffer.getLineCharCode(e, t - 2); + if (Bi(l)) return !1; } return !0; } _validatePosition(e, t, i) { - const n = Math.floor(typeof e == "number" && !isNaN(e) ? e : 1), o = Math.floor(typeof t == "number" && !isNaN(t) ? t : 1), r = this._buffer.getLineCount(); + const n = Math.floor(typeof e == "number" && !isNaN(e) ? e : 1), o = Math.floor(typeof t == "number" && !isNaN(t) ? t : 1), l = this._buffer.getLineCount(); if (n < 1) - return new V(1, 1); - if (n > r) - return new V(r, this.getLineMaxColumn(r)); + return new Y(1, 1); + if (n > l) + return new Y(l, this.getLineMaxColumn(l)); if (o <= 1) - return new V(n, 1); - const l = this.getLineMaxColumn(n); - if (o >= l) - return new V(n, l); + return new Y(n, 1); + const r = this.getLineMaxColumn(n); + if (o >= r) + return new Y(n, r); if (i === 1) { - const a = this._buffer.getLineCharCode(n, o - 2); - if (Hi(a)) - return new V(n, o - 1); + const c = this._buffer.getLineCharCode(n, o - 2); + if (Bi(c)) + return new Y(n, o - 1); } - return new V(n, o); + return new Y(n, o); } validatePosition(e) { - return this._assertNotDisposed(), e instanceof V && this._isValidPosition(e.lineNumber, e.column, 1) ? e : this._validatePosition(e.lineNumber, e.column, 1); + return this._assertNotDisposed(), e instanceof Y && this._isValidPosition(e.lineNumber, e.column, 1) ? e : this._validatePosition(e.lineNumber, e.column, 1); } _isValidRange(e, t) { - const i = e.startLineNumber, n = e.startColumn, o = e.endLineNumber, r = e.endColumn; + const i = e.startLineNumber, n = e.startColumn, o = e.endLineNumber, l = e.endColumn; if (!this._isValidPosition( i, n, @@ -37308,19 +37308,19 @@ let Al = (Cl = class extends R { /* StringOffsetValidationType.Relaxed */ ) || !this._isValidPosition( o, - r, + l, 0 /* StringOffsetValidationType.Relaxed */ )) return !1; if (t === 1) { - const l = n > 1 ? this._buffer.getLineCharCode(i, n - 2) : 0, a = r > 1 && r <= this._buffer.getLineLength(o) ? this._buffer.getLineCharCode(o, r - 2) : 0, c = Hi(l), d = Hi(a); - return !c && !d; + const r = n > 1 ? this._buffer.getLineCharCode(i, n - 2) : 0, c = l > 1 && l <= this._buffer.getLineLength(o) ? this._buffer.getLineCharCode(o, l - 2) : 0, d = Bi(r), a = Bi(c); + return !d && !a; } return !0; } validateRange(e) { - if (this._assertNotDisposed(), e instanceof M && !(e instanceof fe) && this._isValidRange(e, 1)) + if (this._assertNotDisposed(), e instanceof I && !(e instanceof ge) && this._isValidRange(e, 1)) return e; const i = this._validatePosition( e.startLineNumber, @@ -37332,10 +37332,10 @@ let Al = (Cl = class extends R { e.endColumn, 0 /* StringOffsetValidationType.Relaxed */ - ), o = i.lineNumber, r = i.column, l = n.lineNumber, a = n.column; + ), o = i.lineNumber, l = i.column, r = n.lineNumber, c = n.column; { - const c = r > 1 ? this._buffer.getLineCharCode(o, r - 2) : 0, d = a > 1 && a <= this._buffer.getLineLength(l) ? this._buffer.getLineCharCode(l, a - 2) : 0, h = Hi(c), u = Hi(d); - return !h && !u ? new M(o, r, l, a) : o === l && r === a ? new M(o, r - 1, l, a - 1) : h && u ? new M(o, r - 1, l, a + 1) : h ? new M(o, r - 1, l, a) : new M(o, r, l, a + 1); + const d = l > 1 ? this._buffer.getLineCharCode(o, l - 2) : 0, a = c > 1 && c <= this._buffer.getLineLength(r) ? this._buffer.getLineCharCode(r, c - 2) : 0, h = Bi(d), u = Bi(a); + return !h && !u ? new I(o, l, r, c) : o === r && l === c ? new I(o, l - 1, r, c - 1) : h && u ? new I(o, l - 1, r, c + 1) : h ? new I(o, l - 1, r, c) : new I(o, l, r, c + 1); } } modifyPosition(e, t) { @@ -37346,46 +37346,46 @@ let Al = (Cl = class extends R { getFullModelRange() { this._assertNotDisposed(); const e = this.getLineCount(); - return new M(1, 1, e, this.getLineMaxColumn(e)); + return new I(1, 1, e, this.getLineMaxColumn(e)); } findMatchesLineByLine(e, t, i, n) { return this._buffer.findMatchesLineByLine(e, t, i, n); } - findMatches(e, t, i, n, o, r, l = Yae) { + findMatches(e, t, i, n, o, l, r = Mde) { this._assertNotDisposed(); - let a = null; - t !== null && (Array.isArray(t) || (t = [t]), t.every((h) => M.isIRange(h)) && (a = t.map((h) => this.validateRange(h)))), a === null && (a = [this.getFullModelRange()]), a = a.sort((h, u) => h.startLineNumber - u.startLineNumber || h.startColumn - u.startColumn); - const c = []; - c.push(a.reduce((h, u) => M.areIntersecting(h, u) ? h.plusRange(u) : (c.push(h), u))); - let d; + let c = null; + t !== null && (Array.isArray(t) || (t = [t]), t.every((h) => I.isIRange(h)) && (c = t.map((h) => this.validateRange(h)))), c === null && (c = [this.getFullModelRange()]), c = c.sort((h, u) => h.startLineNumber - u.startLineNumber || h.startColumn - u.startColumn); + const d = []; + d.push(c.reduce((h, u) => I.areIntersecting(h, u) ? h.plusRange(u) : (d.push(h), u))); + let a; if (!i && e.indexOf(` `) < 0) { - const u = new xu(e, i, n, o).parseSearchRequest(); + const u = new Ru(e, i, n, o).parseSearchRequest(); if (!u) return []; - d = (g) => this.findMatchesLineByLine(g, u, r, l); + a = (m) => this.findMatchesLineByLine(m, u, l, r); } else - d = (h) => uS.findMatches(this, new xu(e, i, n, o), h, r, l); - return c.map(d).reduce((h, u) => h.concat(u), []); + a = (h) => I1.findMatches(this, new Ru(e, i, n, o), h, l, r); + return d.map(a).reduce((h, u) => h.concat(u), []); } - findNextMatch(e, t, i, n, o, r) { + findNextMatch(e, t, i, n, o, l) { this._assertNotDisposed(); - const l = this.validatePosition(t); + const r = this.validatePosition(t); if (!i && e.indexOf(` `) < 0) { - const c = new xu(e, i, n, o).parseSearchRequest(); - if (!c) + const d = new Ru(e, i, n, o).parseSearchRequest(); + if (!d) return null; - const d = this.getLineCount(); - let h = new M(l.lineNumber, l.column, d, this.getLineMaxColumn(d)), u = this.findMatchesLineByLine(h, c, r, 1); - return uS.findNextMatch(this, new xu(e, i, n, o), l, r), u.length > 0 || (h = new M(1, 1, l.lineNumber, this.getLineMaxColumn(l.lineNumber)), u = this.findMatchesLineByLine(h, c, r, 1), u.length > 0) ? u[0] : null; + const a = this.getLineCount(); + let h = new I(r.lineNumber, r.column, a, this.getLineMaxColumn(a)), u = this.findMatchesLineByLine(h, d, l, 1); + return I1.findNextMatch(this, new Ru(e, i, n, o), r, l), u.length > 0 || (h = new I(1, 1, r.lineNumber, this.getLineMaxColumn(r.lineNumber)), u = this.findMatchesLineByLine(h, d, l, 1), u.length > 0) ? u[0] : null; } - return uS.findNextMatch(this, new xu(e, i, n, o), l, r); + return I1.findNextMatch(this, new Ru(e, i, n, o), r, l); } - findPreviousMatch(e, t, i, n, o, r) { + findPreviousMatch(e, t, i, n, o, l) { this._assertNotDisposed(); - const l = this.validatePosition(t); - return uS.findPreviousMatch(this, new xu(e, i, n, o), l, r); + const r = this.validatePosition(t); + return I1.findPreviousMatch(this, new Ru(e, i, n, o), r, l); } //#endregion //#region Editing @@ -37405,7 +37405,7 @@ let Al = (Cl = class extends R { } } _validateEditOperation(e) { - return e instanceof HN ? e : new HN(e.identifier || null, this.validateRange(e.range), e.text, e.forceMoveMarkers || !1, e.isAutoWhitespaceEdit || !1, e._isTracked || !1); + return e instanceof cR ? e : new cR(e.identifier || null, this.validateRange(e.range), e.text, e.forceMoveMarkers || !1, e.isAutoWhitespaceEdit || !1, e._isTracked || !1); } _validateEditOperations(e) { const t = []; @@ -37422,43 +37422,43 @@ let Al = (Cl = class extends R { } _pushEditOperations(e, t, i, n) { if (this._options.trimAutoWhitespace && this._trimAutoWhitespaceLines) { - const o = t.map((l) => ({ - range: this.validateRange(l.range), - text: l.text + const o = t.map((r) => ({ + range: this.validateRange(r.range), + text: r.text })); - let r = !0; + let l = !0; if (e) - for (let l = 0, a = e.length; l < a; l++) { - const c = e[l]; - let d = !1; + for (let r = 0, c = e.length; r < c; r++) { + const d = e[r]; + let a = !1; for (let h = 0, u = o.length; h < u; h++) { - const g = o[h].range, m = g.startLineNumber > c.endLineNumber, f = c.startLineNumber > g.endLineNumber; - if (!m && !f) { - d = !0; + const m = o[h].range, b = m.startLineNumber > d.endLineNumber, g = d.startLineNumber > m.endLineNumber; + if (!b && !g) { + a = !0; break; } } - if (!d) { - r = !1; + if (!a) { + l = !1; break; } } - if (r) - for (let l = 0, a = this._trimAutoWhitespaceLines.length; l < a; l++) { - const c = this._trimAutoWhitespaceLines[l], d = this.getLineMaxColumn(c); + if (l) + for (let r = 0, c = this._trimAutoWhitespaceLines.length; r < c; r++) { + const d = this._trimAutoWhitespaceLines[r], a = this.getLineMaxColumn(d); let h = !0; - for (let u = 0, g = o.length; u < g; u++) { - const m = o[u].range, f = o[u].text; - if (!(c < m.startLineNumber || c > m.endLineNumber) && !(c === m.startLineNumber && m.startColumn === d && m.isEmpty() && f && f.length > 0 && f.charAt(0) === ` -`) && !(c === m.startLineNumber && m.startColumn === 1 && m.isEmpty() && f && f.length > 0 && f.charAt(f.length - 1) === ` + for (let u = 0, m = o.length; u < m; u++) { + const b = o[u].range, g = o[u].text; + if (!(d < b.startLineNumber || d > b.endLineNumber) && !(d === b.startLineNumber && b.startColumn === a && b.isEmpty() && g && g.length > 0 && g.charAt(0) === ` +`) && !(d === b.startLineNumber && b.startColumn === 1 && b.isEmpty() && g && g.length > 0 && g.charAt(g.length - 1) === ` `)) { h = !1; break; } } if (h) { - const u = new M(c, 1, c, d); - t.push(new HN(null, u, null, !1, !1, !1)); + const u = new I(d, 1, d, a); + t.push(new cR(null, u, null, !1, !1, !1)); } } this._trimAutoWhitespaceLines = null; @@ -37466,30 +37466,30 @@ let Al = (Cl = class extends R { return this._initialUndoRedoSnapshot === null && (this._initialUndoRedoSnapshot = this._undoRedoService.createSnapshot(this.uri)), this._commandManager.pushEditOperation(e, t, i, n); } _applyUndo(e, t, i, n) { - const o = e.map((r) => { - const l = this.getPositionAt(r.newPosition), a = this.getPositionAt(r.newEnd); + const o = e.map((l) => { + const r = this.getPositionAt(l.newPosition), c = this.getPositionAt(l.newEnd); return { - range: new M(l.lineNumber, l.column, a.lineNumber, a.column), - text: r.oldText + range: new I(r.lineNumber, r.column, c.lineNumber, c.column), + text: l.oldText }; }); this._applyUndoRedoEdits(o, t, !0, !1, i, n); } _applyRedo(e, t, i, n) { - const o = e.map((r) => { - const l = this.getPositionAt(r.oldPosition), a = this.getPositionAt(r.oldEnd); + const o = e.map((l) => { + const r = this.getPositionAt(l.oldPosition), c = this.getPositionAt(l.oldEnd); return { - range: new M(l.lineNumber, l.column, a.lineNumber, a.column), - text: r.newText + range: new I(r.lineNumber, r.column, c.lineNumber, c.column), + text: l.newText }; }); this._applyUndoRedoEdits(o, t, !1, !0, i, n); } - _applyUndoRedoEdits(e, t, i, n, o, r) { + _applyUndoRedoEdits(e, t, i, n, o, l) { try { this._onDidChangeDecorations.beginDeferredEmit(), this._eventEmitter.beginDeferredEmit(), this._isUndoing = i, this._isRedoing = n, this.applyEdits(e, !1), this.setEOL(t), this._overwriteAlternativeVersionId(o); } finally { - this._isUndoing = !1, this._isRedoing = !1, this._eventEmitter.endDeferredEmit(r), this._onDidChangeDecorations.endDeferredEmit(); + this._isUndoing = !1, this._isRedoing = !1, this._eventEmitter.endDeferredEmit(l), this._onDidChangeDecorations.endDeferredEmit(); } } applyEdits(e, t = !1) { @@ -37502,41 +37502,41 @@ let Al = (Cl = class extends R { } } _doApplyEdits(e, t) { - const i = this._buffer.getLineCount(), n = this._buffer.applyEdits(e, this._options.trimAutoWhitespace, t), o = this._buffer.getLineCount(), r = n.changes; - if (this._trimAutoWhitespaceLines = n.trimAutoWhitespaceLineNumbers, r.length !== 0) { - for (let c = 0, d = r.length; c < d; c++) { - const h = r[c]; + const i = this._buffer.getLineCount(), n = this._buffer.applyEdits(e, this._options.trimAutoWhitespace, t), o = this._buffer.getLineCount(), l = n.changes; + if (this._trimAutoWhitespaceLines = n.trimAutoWhitespaceLineNumbers, l.length !== 0) { + for (let d = 0, a = l.length; d < a; d++) { + const h = l[d]; this._decorationsTree.acceptReplace(h.rangeOffset, h.rangeLength, h.text.length, h.forceMoveMarkers); } - const l = []; + const r = []; this._increaseVersionId(); - let a = i; - for (let c = 0, d = r.length; c < d; c++) { - const h = r[c], [u] = kh(h.text); + let c = i; + for (let d = 0, a = l.length; d < a; d++) { + const h = l[d], [u] = Eh(h.text); this._onDidChangeDecorations.fire(); - const g = h.range.startLineNumber, m = h.range.endLineNumber, f = m - g, b = u, y = Math.min(f, b), w = b - f, C = o - a - w + g, S = C, L = C + b, x = this._decorationsTree.getInjectedTextInInterval(this, this.getOffsetAt(new V(S, 1)), this.getOffsetAt(new V(L, this.getLineMaxColumn(L))), 0), Z = Dl.fromDecorations(x), _ = new Hc(Z); - for (let v = y; v >= 0; v--) { - const P = g + v, E = C + v; - _.takeFromEndWhile((B) => B.lineNumber > E); - const Y = _.takeFromEndWhile((B) => B.lineNumber === E); - l.push(new hY(P, this.getLineContent(E), Y)); + const m = h.range.startLineNumber, b = h.range.endLineNumber, g = b - m, Z = u, f = Math.min(g, Z), y = Z - g, W = o - c - y + m, G = W, X = W + Z, L = this._decorationsTree.getInjectedTextInInterval(this, this.getOffsetAt(new Y(G, 1)), this.getOffsetAt(new Y(X, this.getLineMaxColumn(X))), 0), S = Jr.fromDecorations(L), x = new Od(S); + for (let w = f; w >= 0; w--) { + const A = m + w, H = W + w; + x.takeFromEndWhile((K) => K.lineNumber > H); + const F = x.takeFromEndWhile((K) => K.lineNumber === H); + r.push(new vF(A, this.getLineContent(H), F)); } - if (y < f) { - const v = g + y; - l.push(new mle(v + 1, m)); + if (f < g) { + const w = m + f; + r.push(new lce(w + 1, b)); } - if (y < b) { - const v = new Hc(Z), P = g + y, E = b - y, Y = o - a - E + P + 1, B = [], X = []; - for (let j = 0; j < E; j++) { - const le = Y + j; - X[j] = this.getLineContent(le), v.takeWhile((ue) => ue.lineNumber < le), B[j] = v.takeWhile((ue) => ue.lineNumber === le); + if (f < Z) { + const w = new Od(S), A = m + f, H = Z - f, F = o - c - H + A + 1, K = [], E = []; + for (let j = 0; j < H; j++) { + const re = F + j; + E[j] = this.getLineContent(re), w.takeWhile((ue) => ue.lineNumber < re), K[j] = w.takeWhile((ue) => ue.lineNumber === re); } - l.push(new ple(P + 1, g + b, X, B)); + r.push(new rce(A + 1, m + Z, E, K)); } - a += w; + c += y; } - this._emitContentChangedEvent(new Wf(l, this.getVersionId(), this._isUndoing, this._isRedoing), { - changes: r, + this._emitContentChangedEvent(new vg(r, this.getVersionId(), this._isUndoing, this._isRedoing), { + changes: l, eol: this._buffer.getEOL(), isEolChange: !1, versionId: this.getVersionId(), @@ -37564,8 +37564,8 @@ let Al = (Cl = class extends R { handleBeforeFireDecorationsChangedEvent(e) { if (e === null || e.size === 0) return; - const i = Array.from(e).map((n) => new hY(n, this.getLineContent(n), this._getInjectedTextInLine(n))); - this._onDidChangeInjectedText.fire(new OU(i)); + const i = Array.from(e).map((n) => new vF(n, this.getLineContent(n), this._getInjectedTextInLine(n))); + this._onDidChangeInjectedText.fire(new xQ(i)); } changeDecorations(e, t = 0) { this._assertNotDisposed(); @@ -37577,31 +37577,31 @@ let Al = (Cl = class extends R { } _changeDecorations(e, t) { const i = { - addDecoration: (o, r) => this._deltaDecorationsImpl(e, [], [{ range: o, options: r }])[0], - changeDecoration: (o, r) => { - this._changeDecorationImpl(o, r); + addDecoration: (o, l) => this._deltaDecorationsImpl(e, [], [{ range: o, options: l }])[0], + changeDecoration: (o, l) => { + this._changeDecorationImpl(o, l); }, - changeDecorationOptions: (o, r) => { - this._changeDecorationOptionsImpl(o, kY(r)); + changeDecorationOptions: (o, l) => { + this._changeDecorationOptionsImpl(o, lz(l)); }, removeDecoration: (o) => { this._deltaDecorationsImpl(e, [o], []); }, - deltaDecorations: (o, r) => o.length === 0 && r.length === 0 ? [] : this._deltaDecorationsImpl(e, o, r) + deltaDecorations: (o, l) => o.length === 0 && l.length === 0 ? [] : this._deltaDecorationsImpl(e, o, l) }; let n = null; try { n = t(i); } catch (o) { - De(o); + Me(o); } - return i.addDecoration = X0, i.changeDecoration = X0, i.changeDecorationOptions = X0, i.removeDecoration = X0, i.deltaDecorations = X0, n; + return i.addDecoration = P0, i.changeDecoration = P0, i.changeDecorationOptions = P0, i.removeDecoration = P0, i.deltaDecorations = P0, n; } deltaDecorations(e, t, i = 0) { if (this._assertNotDisposed(), e || (e = []), e.length === 0 && t.length === 0) return []; try { - return this._deltaDecorationCallCnt++, this._deltaDecorationCallCnt > 1 && (console.warn("Invoking deltaDecorations recursively could lead to leaking decorations."), De(new Error("Invoking deltaDecorations recursively could lead to leaking decorations."))), this._onDidChangeDecorations.beginDeferredEmit(), this._deltaDecorationsImpl(i, e, t); + return this._deltaDecorationCallCnt++, this._deltaDecorationCallCnt > 1 && (console.warn("Invoking deltaDecorations recursively could lead to leaking decorations."), Me(new Error("Invoking deltaDecorations recursively could lead to leaking decorations."))), this._onDidChangeDecorations.beginDeferredEmit(), this._deltaDecorationsImpl(i, e, t); } finally { this._onDidChangeDecorations.endDeferredEmit(), this._deltaDecorationCallCnt--; } @@ -37612,11 +37612,11 @@ let Al = (Cl = class extends R { _setTrackedRange(e, t, i) { const n = e ? this._decorations[e] : null; if (!n) - return t ? this._deltaDecorationsImpl(0, [], [{ range: t, options: VY[i] }], !0)[0] : null; + return t ? this._deltaDecorationsImpl(0, [], [{ range: t, options: oz[i] }], !0)[0] : null; if (!t) return this._decorationsTree.delete(n), delete this._decorations[n.id], null; - const o = this._validateRangeRelaxedNoAllocations(t), r = this._buffer.getOffsetAt(o.startLineNumber, o.startColumn), l = this._buffer.getOffsetAt(o.endLineNumber, o.endColumn); - return this._decorationsTree.delete(n), n.reset(this.getVersionId(), r, l, o), n.setOptions(VY[i]), this._decorationsTree.insert(n), n.id; + const o = this._validateRangeRelaxedNoAllocations(t), l = this._buffer.getOffsetAt(o.startLineNumber, o.startColumn), r = this._buffer.getOffsetAt(o.endLineNumber, o.endColumn); + return this._decorationsTree.delete(n), n.reset(this.getVersionId(), l, r, o), n.setOptions(oz[i]), this._decorationsTree.insert(n), n.id; } removeAllDecorationsWithOwnerId(e) { if (this._isDisposed) @@ -37639,12 +37639,12 @@ let Al = (Cl = class extends R { return e < 1 || e > this.getLineCount() ? [] : this.getLinesDecorations(e, e, t, i); } getLinesDecorations(e, t, i = 0, n = !1, o = !1) { - const r = this.getLineCount(), l = Math.min(r, Math.max(1, e)), a = Math.min(r, Math.max(1, t)), c = this.getLineMaxColumn(a), d = new M(l, 1, a, c), h = this._getDecorationsInRange(d, i, n, o); - return Y2(h, this._decorationProvider.getDecorationsInRange(d, i, n)), h; + const l = this.getLineCount(), r = Math.min(l, Math.max(1, e)), c = Math.min(l, Math.max(1, t)), d = this.getLineMaxColumn(c), a = new I(r, 1, c, d), h = this._getDecorationsInRange(a, i, n, o); + return cw(h, this._decorationProvider.getDecorationsInRange(a, i, n)), h; } getDecorationsInRange(e, t = 0, i = !1, n = !1, o = !1) { - const r = this.validateRange(e), l = this._getDecorationsInRange(r, t, i, o); - return Y2(l, this._decorationProvider.getDecorationsInRange(r, t, i, n)), l; + const l = this.validateRange(e), r = this._getDecorationsInRange(l, t, i, o); + return cw(r, this._decorationProvider.getDecorationsInRange(l, t, i, n)), r; } getOverviewRulerDecorations(e = 0, t = !1) { return this._decorationsTree.getAll(this, e, t, !0, !1); @@ -37654,7 +37654,7 @@ let Al = (Cl = class extends R { } _getInjectedTextInLine(e) { const t = this._buffer.getOffsetAt(e, 1), i = t + this._buffer.getLineLength(e), n = this._decorationsTree.getInjectedTextInInterval(this, t, i, 0); - return Dl.fromDecorations(n).filter((o) => o.lineNumber === e); + return Jr.fromDecorations(n).filter((o) => o.lineNumber === e); } getAllDecorations(e = 0, t = !1) { let i = this._decorationsTree.getAll(this, e, t, !1, !1); @@ -37664,8 +37664,8 @@ let Al = (Cl = class extends R { return this._decorationsTree.getAll(this, e, !1, !1, !0); } _getDecorationsInRange(e, t, i, n) { - const o = this._buffer.getOffsetAt(e.startLineNumber, e.startColumn), r = this._buffer.getOffsetAt(e.endLineNumber, e.endColumn); - return this._decorationsTree.getAllInInterval(this, o, r, t, i, n); + const o = this._buffer.getOffsetAt(e.startLineNumber, e.startColumn), l = this._buffer.getOffsetAt(e.endLineNumber, e.endColumn); + return this._decorationsTree.getAllInInterval(this, o, l, t, i, n); } getRangeAt(e, t) { return this._buffer.getRangeAt(e, t - e); @@ -37675,15 +37675,15 @@ let Al = (Cl = class extends R { if (!i) return; if (i.options.after) { - const l = this.getDecorationRange(e); - this._onDidChangeDecorations.recordLineAffectedByInjectedText(l.endLineNumber); + const r = this.getDecorationRange(e); + this._onDidChangeDecorations.recordLineAffectedByInjectedText(r.endLineNumber); } if (i.options.before) { - const l = this.getDecorationRange(e); - this._onDidChangeDecorations.recordLineAffectedByInjectedText(l.startLineNumber); + const r = this.getDecorationRange(e); + this._onDidChangeDecorations.recordLineAffectedByInjectedText(r.startLineNumber); } - const n = this._validateRangeRelaxedNoAllocations(t), o = this._buffer.getOffsetAt(n.startLineNumber, n.startColumn), r = this._buffer.getOffsetAt(n.endLineNumber, n.endColumn); - this._decorationsTree.delete(i), i.reset(this.getVersionId(), o, r, n), this._decorationsTree.insert(i), this._onDidChangeDecorations.checkAffectedAndFire(i.options), i.options.after && this._onDidChangeDecorations.recordLineAffectedByInjectedText(n.endLineNumber), i.options.before && this._onDidChangeDecorations.recordLineAffectedByInjectedText(n.startLineNumber); + const n = this._validateRangeRelaxedNoAllocations(t), o = this._buffer.getOffsetAt(n.startLineNumber, n.startColumn), l = this._buffer.getOffsetAt(n.endLineNumber, n.endColumn); + this._decorationsTree.delete(i), i.reset(this.getVersionId(), o, l, n), this._decorationsTree.insert(i), this._onDidChangeDecorations.checkAffectedAndFire(i.options), i.options.after && this._onDidChangeDecorations.recordLineAffectedByInjectedText(n.endLineNumber), i.options.before && this._onDidChangeDecorations.recordLineAffectedByInjectedText(n.startLineNumber); } _changeDecorationOptionsImpl(e, t) { const i = this._decorations[e]; @@ -37691,30 +37691,30 @@ let Al = (Cl = class extends R { return; const n = !!(i.options.overviewRuler && i.options.overviewRuler.color), o = !!(t.overviewRuler && t.overviewRuler.color); if (this._onDidChangeDecorations.checkAffectedAndFire(i.options), this._onDidChangeDecorations.checkAffectedAndFire(t), i.options.after || t.after) { - const a = this._decorationsTree.getNodeRange(this, i); - this._onDidChangeDecorations.recordLineAffectedByInjectedText(a.endLineNumber); + const c = this._decorationsTree.getNodeRange(this, i); + this._onDidChangeDecorations.recordLineAffectedByInjectedText(c.endLineNumber); } if (i.options.before || t.before) { - const a = this._decorationsTree.getNodeRange(this, i); - this._onDidChangeDecorations.recordLineAffectedByInjectedText(a.startLineNumber); + const c = this._decorationsTree.getNodeRange(this, i); + this._onDidChangeDecorations.recordLineAffectedByInjectedText(c.startLineNumber); } - const r = n !== o, l = Oae(t) !== AL(i); - r || l ? (this._decorationsTree.delete(i), i.setOptions(t), this._decorationsTree.insert(i)) : i.setOptions(t); + const l = n !== o, r = Jde(t) !== HX(i); + l || r ? (this._decorationsTree.delete(i), i.setOptions(t), this._decorationsTree.insert(i)) : i.setOptions(t); } _deltaDecorationsImpl(e, t, i, n = !1) { - const o = this.getVersionId(), r = t.length; - let l = 0; - const a = i.length; - let c = 0; + const o = this.getVersionId(), l = t.length; + let r = 0; + const c = i.length; + let d = 0; this._onDidChangeDecorations.beginDeferredEmit(); try { - const d = new Array(a); - for (; l < r || c < a; ) { + const a = new Array(c); + for (; r < l || d < c; ) { let h = null; - if (l < r) { + if (r < l) { do - h = this._decorations[t[l++]]; - while (!h && l < r); + h = this._decorations[t[r++]]; + while (!h && r < l); if (h) { if (h.options.after) { const u = this._decorationsTree.getNodeRange(this, h); @@ -37727,17 +37727,17 @@ let Al = (Cl = class extends R { this._decorationsTree.delete(h), n || this._onDidChangeDecorations.checkAffectedAndFire(h.options); } } - if (c < a) { + if (d < c) { if (!h) { - const y = ++this._lastDecorationId, w = `${this._instanceId};${y}`; - h = new rK(w, 0, 0), this._decorations[w] = h; + const f = ++this._lastDecorationId, y = `${this._instanceId};${f}`; + h = new zQ(y, 0, 0), this._decorations[y] = h; } - const u = i[c], g = this._validateRangeRelaxedNoAllocations(u.range), m = kY(u.options), f = this._buffer.getOffsetAt(g.startLineNumber, g.startColumn), b = this._buffer.getOffsetAt(g.endLineNumber, g.endColumn); - h.ownerId = e, h.reset(o, f, b, g), h.setOptions(m), h.options.after && this._onDidChangeDecorations.recordLineAffectedByInjectedText(g.endLineNumber), h.options.before && this._onDidChangeDecorations.recordLineAffectedByInjectedText(g.startLineNumber), n || this._onDidChangeDecorations.checkAffectedAndFire(m), this._decorationsTree.insert(h), d[c] = h.id, c++; + const u = i[d], m = this._validateRangeRelaxedNoAllocations(u.range), b = lz(u.options), g = this._buffer.getOffsetAt(m.startLineNumber, m.startColumn), Z = this._buffer.getOffsetAt(m.endLineNumber, m.endColumn); + h.ownerId = e, h.reset(o, g, Z, m), h.setOptions(b), h.options.after && this._onDidChangeDecorations.recordLineAffectedByInjectedText(m.endLineNumber), h.options.before && this._onDidChangeDecorations.recordLineAffectedByInjectedText(m.startLineNumber), n || this._onDidChangeDecorations.checkAffectedAndFire(b), this._decorationsTree.insert(h), a[d] = h.id, d++; } else h && delete this._decorations[h.id]; } - return d; + return a; } finally { this._onDidChangeDecorations.endDeferredEmit(); } @@ -37772,26 +37772,26 @@ let Al = (Cl = class extends R { * @internal */ getLineIndentColumn(e) { - return Bae(this.getLineContent(e)) + 1; + return vde(this.getLineContent(e)) + 1; } -}, Mu = Cl, Cl._MODEL_SYNC_LIMIT = 50 * 1024 * 1024, Cl.LARGE_FILE_SIZE_THRESHOLD = 20 * 1024 * 1024, Cl.LARGE_FILE_LINE_COUNT_THRESHOLD = 300 * 1e3, Cl.LARGE_FILE_HEAP_OPERATION_THRESHOLD = 256 * 1024 * 1024, Cl.DEFAULT_CREATION_OPTIONS = { +}, Nu = Lr, Lr._MODEL_SYNC_LIMIT = 50 * 1024 * 1024, Lr.LARGE_FILE_SIZE_THRESHOLD = 20 * 1024 * 1024, Lr.LARGE_FILE_LINE_COUNT_THRESHOLD = 300 * 1e3, Lr.LARGE_FILE_HEAP_OPERATION_THRESHOLD = 256 * 1024 * 1024, Lr.DEFAULT_CREATION_OPTIONS = { isForSimpleWidget: !1, - tabSize: Dn.tabSize, - indentSize: Dn.indentSize, - insertSpaces: Dn.insertSpaces, + tabSize: Yn.tabSize, + indentSize: Yn.indentSize, + insertSpaces: Yn.insertSpaces, detectIndentation: !1, defaultEOL: 1, - trimAutoWhitespace: Dn.trimAutoWhitespace, - largeFileOptimizations: Dn.largeFileOptimizations, - bracketPairColorizationOptions: Dn.bracketPairColorizationOptions -}, Cl); -Al = Mu = Eae([ - gS(4, gX), - gS(5, ri), - gS(6, li), - gS(7, Se) -], Al); -function Bae(s) { + trimAutoWhitespace: Yn.trimAutoWhitespace, + largeFileOptimizations: Yn.largeFileOptimizations, + bracketPairColorizationOptions: Yn.bracketPairColorizationOptions +}, Lr); +xr = Nu = Nde([ + S1(4, HJ), + S1(5, ri), + S1(6, ci), + S1(7, Ge) +], xr); +function vde(s) { let e = 0; for (const t of s) if (t === " " || t === " ") @@ -37800,18 +37800,18 @@ function Bae(s) { break; return e; } -function sW(s) { +function WR(s) { return !!(s.options.overviewRuler && s.options.overviewRuler.color); } -function Oae(s) { +function Jde(s) { return !!s.after || !!s.before; } -function AL(s) { +function HX(s) { return !!s.options.after || !!s.options.before; } -class DY { +class sz { constructor() { - this._decorationsTree0 = new eW(), this._decorationsTree1 = new eW(), this._injectedTextDecorationsTree = new eW(); + this._decorationsTree0 = new gR(), this._decorationsTree1 = new gR(), this._injectedTextDecorationsTree = new gR(); } ensureAllNodesHaveRanges(e) { this.getAll(e, 0, !1, !1, !1); @@ -37821,32 +37821,32 @@ class DY { i.range === null && (i.range = e.getRangeAt(i.cachedAbsoluteStart, i.cachedAbsoluteEnd)); return t; } - getAllInInterval(e, t, i, n, o, r) { - const l = e.getVersionId(), a = this._intervalSearch(t, i, n, o, l, r); - return this._ensureNodesHaveRanges(e, a); + getAllInInterval(e, t, i, n, o, l) { + const r = e.getVersionId(), c = this._intervalSearch(t, i, n, o, r, l); + return this._ensureNodesHaveRanges(e, c); } - _intervalSearch(e, t, i, n, o, r) { - const l = this._decorationsTree0.intervalSearch(e, t, i, n, o, r), a = this._decorationsTree1.intervalSearch(e, t, i, n, o, r), c = this._injectedTextDecorationsTree.intervalSearch(e, t, i, n, o, r); - return l.concat(a).concat(c); + _intervalSearch(e, t, i, n, o, l) { + const r = this._decorationsTree0.intervalSearch(e, t, i, n, o, l), c = this._decorationsTree1.intervalSearch(e, t, i, n, o, l), d = this._injectedTextDecorationsTree.intervalSearch(e, t, i, n, o, l); + return r.concat(c).concat(d); } getInjectedTextInInterval(e, t, i, n) { - const o = e.getVersionId(), r = this._injectedTextDecorationsTree.intervalSearch(t, i, n, !1, o, !1); - return this._ensureNodesHaveRanges(e, r).filter((l) => l.options.showIfCollapsed || !l.range.isEmpty()); + const o = e.getVersionId(), l = this._injectedTextDecorationsTree.intervalSearch(t, i, n, !1, o, !1); + return this._ensureNodesHaveRanges(e, l).filter((r) => r.options.showIfCollapsed || !r.range.isEmpty()); } getAllInjectedText(e, t) { const i = e.getVersionId(), n = this._injectedTextDecorationsTree.search(t, !1, i, !1); return this._ensureNodesHaveRanges(e, n).filter((o) => o.options.showIfCollapsed || !o.range.isEmpty()); } getAll(e, t, i, n, o) { - const r = e.getVersionId(), l = this._search(t, i, n, r, o); - return this._ensureNodesHaveRanges(e, l); + const l = e.getVersionId(), r = this._search(t, i, n, l, o); + return this._ensureNodesHaveRanges(e, r); } _search(e, t, i, n, o) { if (i) return this._decorationsTree1.search(e, t, n, o); { - const r = this._decorationsTree0.search(e, t, n, o), l = this._decorationsTree1.search(e, t, n, o), a = this._injectedTextDecorationsTree.search(e, t, n, o); - return r.concat(l).concat(a); + const l = this._decorationsTree0.search(e, t, n, o), r = this._decorationsTree1.search(e, t, n, o), c = this._injectedTextDecorationsTree.search(e, t, n, o); + return l.concat(r).concat(c); } } collectNodesFromOwner(e) { @@ -37858,33 +37858,33 @@ class DY { return e.concat(t).concat(i); } insert(e) { - AL(e) ? this._injectedTextDecorationsTree.insert(e) : sW(e) ? this._decorationsTree1.insert(e) : this._decorationsTree0.insert(e); + HX(e) ? this._injectedTextDecorationsTree.insert(e) : WR(e) ? this._decorationsTree1.insert(e) : this._decorationsTree0.insert(e); } delete(e) { - AL(e) ? this._injectedTextDecorationsTree.delete(e) : sW(e) ? this._decorationsTree1.delete(e) : this._decorationsTree0.delete(e); + HX(e) ? this._injectedTextDecorationsTree.delete(e) : WR(e) ? this._decorationsTree1.delete(e) : this._decorationsTree0.delete(e); } getNodeRange(e, t) { const i = e.getVersionId(); return t.cachedVersionId !== i && this._resolveNode(t, i), t.range === null && (t.range = e.getRangeAt(t.cachedAbsoluteStart, t.cachedAbsoluteEnd)), t.range; } _resolveNode(e, t) { - AL(e) ? this._injectedTextDecorationsTree.resolveNode(e, t) : sW(e) ? this._decorationsTree1.resolveNode(e, t) : this._decorationsTree0.resolveNode(e, t); + HX(e) ? this._injectedTextDecorationsTree.resolveNode(e, t) : WR(e) ? this._decorationsTree1.resolveNode(e, t) : this._decorationsTree0.resolveNode(e, t); } acceptReplace(e, t, i, n) { this._decorationsTree0.acceptReplace(e, t, i, n), this._decorationsTree1.acceptReplace(e, t, i, n), this._injectedTextDecorationsTree.acceptReplace(e, t, i, n); } } -function Ol(s) { +function Qr(s) { return s.replace(/[^a-z0-9\-_]/gi, " "); } -class pK { +class jQ { constructor(e) { this.color = e.color || "", this.darkColor = e.darkColor || ""; } } -class Hae extends pK { +class Hde extends jQ { constructor(e) { - super(e), this._resolvedColor = null, this.position = typeof e.position == "number" ? e.position : ur.Center; + super(e), this._resolvedColor = null, this.position = typeof e.position == "number" ? e.position : pl.Center; } getColor(e) { return this._resolvedColor || (e.type !== "light" && this.darkColor ? this._resolvedColor = this._resolveColor(this.darkColor, e) : this._resolvedColor = this._resolveColor(this.color, e)), this._resolvedColor; @@ -37899,12 +37899,12 @@ class Hae extends pK { return i ? i.toString() : ""; } } -class Jae { +class Ede { constructor(e) { - this.position = (e == null ? void 0 : e.position) ?? Jr.Center, this.persistLane = e == null ? void 0 : e.persistLane; + this.position = (e == null ? void 0 : e.position) ?? Ol.Center, this.persistLane = e == null ? void 0 : e.persistLane; } } -class Uae extends pK { +class Dde extends jQ { constructor(e) { super(e), this.position = e.position, this.sectionHeaderStyle = e.sectionHeaderStyle ?? null, this.sectionHeaderText = e.sectionHeaderText ?? null; } @@ -37915,55 +37915,55 @@ class Uae extends pK { this._resolvedColor = void 0; } _resolveColor(e, t) { - return typeof e == "string" ? K.fromHex(e) : t.getColor(e.id); + return typeof e == "string" ? Q.fromHex(e) : t.getColor(e.id); } } -class Eh { +class zh { static from(e) { - return e instanceof Eh ? e : new Eh(e); + return e instanceof zh ? e : new zh(e); } constructor(e) { this.content = e.content || "", this.inlineClassName = e.inlineClassName || null, this.inlineClassNameAffectsLetterSpacing = e.inlineClassNameAffectsLetterSpacing || !1, this.attachedData = e.attachedData || null, this.cursorStops = e.cursorStops || null; } } -class Re { +class Je { static register(e) { - return new Re(e); + return new Je(e); } static createDynamic(e) { - return new Re(e); + return new Je(e); } constructor(e) { - this.description = e.description, this.blockClassName = e.blockClassName ? Ol(e.blockClassName) : null, this.blockDoesNotCollapse = e.blockDoesNotCollapse ?? null, this.blockIsAfterEnd = e.blockIsAfterEnd ?? null, this.blockPadding = e.blockPadding ?? null, this.stickiness = e.stickiness || 0, this.zIndex = e.zIndex || 0, this.className = e.className ? Ol(e.className) : null, this.shouldFillLineOnLineBreak = e.shouldFillLineOnLineBreak ?? null, this.hoverMessage = e.hoverMessage || null, this.glyphMarginHoverMessage = e.glyphMarginHoverMessage || null, this.lineNumberHoverMessage = e.lineNumberHoverMessage || null, this.isWholeLine = e.isWholeLine || !1, this.showIfCollapsed = e.showIfCollapsed || !1, this.collapseOnReplaceEdit = e.collapseOnReplaceEdit || !1, this.overviewRuler = e.overviewRuler ? new Hae(e.overviewRuler) : null, this.minimap = e.minimap ? new Uae(e.minimap) : null, this.glyphMargin = e.glyphMarginClassName ? new Jae(e.glyphMargin) : null, this.glyphMarginClassName = e.glyphMarginClassName ? Ol(e.glyphMarginClassName) : null, this.linesDecorationsClassName = e.linesDecorationsClassName ? Ol(e.linesDecorationsClassName) : null, this.lineNumberClassName = e.lineNumberClassName ? Ol(e.lineNumberClassName) : null, this.linesDecorationsTooltip = e.linesDecorationsTooltip ? $6(e.linesDecorationsTooltip) : null, this.firstLineDecorationClassName = e.firstLineDecorationClassName ? Ol(e.firstLineDecorationClassName) : null, this.marginClassName = e.marginClassName ? Ol(e.marginClassName) : null, this.inlineClassName = e.inlineClassName ? Ol(e.inlineClassName) : null, this.inlineClassNameAffectsLetterSpacing = e.inlineClassNameAffectsLetterSpacing || !1, this.beforeContentClassName = e.beforeContentClassName ? Ol(e.beforeContentClassName) : null, this.afterContentClassName = e.afterContentClassName ? Ol(e.afterContentClassName) : null, this.after = e.after ? Eh.from(e.after) : null, this.before = e.before ? Eh.from(e.before) : null, this.hideInCommentTokens = e.hideInCommentTokens ?? !1, this.hideInStringTokens = e.hideInStringTokens ?? !1; + this.description = e.description, this.blockClassName = e.blockClassName ? Qr(e.blockClassName) : null, this.blockDoesNotCollapse = e.blockDoesNotCollapse ?? null, this.blockIsAfterEnd = e.blockIsAfterEnd ?? null, this.blockPadding = e.blockPadding ?? null, this.stickiness = e.stickiness || 0, this.zIndex = e.zIndex || 0, this.className = e.className ? Qr(e.className) : null, this.shouldFillLineOnLineBreak = e.shouldFillLineOnLineBreak ?? null, this.hoverMessage = e.hoverMessage || null, this.glyphMarginHoverMessage = e.glyphMarginHoverMessage || null, this.lineNumberHoverMessage = e.lineNumberHoverMessage || null, this.isWholeLine = e.isWholeLine || !1, this.showIfCollapsed = e.showIfCollapsed || !1, this.collapseOnReplaceEdit = e.collapseOnReplaceEdit || !1, this.overviewRuler = e.overviewRuler ? new Hde(e.overviewRuler) : null, this.minimap = e.minimap ? new Dde(e.minimap) : null, this.glyphMargin = e.glyphMarginClassName ? new Ede(e.glyphMargin) : null, this.glyphMarginClassName = e.glyphMarginClassName ? Qr(e.glyphMarginClassName) : null, this.linesDecorationsClassName = e.linesDecorationsClassName ? Qr(e.linesDecorationsClassName) : null, this.lineNumberClassName = e.lineNumberClassName ? Qr(e.lineNumberClassName) : null, this.linesDecorationsTooltip = e.linesDecorationsTooltip ? Uq(e.linesDecorationsTooltip) : null, this.firstLineDecorationClassName = e.firstLineDecorationClassName ? Qr(e.firstLineDecorationClassName) : null, this.marginClassName = e.marginClassName ? Qr(e.marginClassName) : null, this.inlineClassName = e.inlineClassName ? Qr(e.inlineClassName) : null, this.inlineClassNameAffectsLetterSpacing = e.inlineClassNameAffectsLetterSpacing || !1, this.beforeContentClassName = e.beforeContentClassName ? Qr(e.beforeContentClassName) : null, this.afterContentClassName = e.afterContentClassName ? Qr(e.afterContentClassName) : null, this.after = e.after ? zh.from(e.after) : null, this.before = e.before ? zh.from(e.before) : null, this.hideInCommentTokens = e.hideInCommentTokens ?? !1, this.hideInStringTokens = e.hideInStringTokens ?? !1; } } -Re.EMPTY = Re.register({ description: "empty" }); -const VY = [ - Re.register({ +Je.EMPTY = Je.register({ description: "empty" }); +const oz = [ + Je.register({ description: "tracked-range-always-grows-when-typing-at-edges", stickiness: 0 /* model.TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */ }), - Re.register({ + Je.register({ description: "tracked-range-never-grows-when-typing-at-edges", stickiness: 1 /* model.TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ }), - Re.register({ + Je.register({ description: "tracked-range-grows-only-when-typing-before", stickiness: 2 /* model.TrackedRangeStickiness.GrowsOnlyWhenTypingBefore */ }), - Re.register({ + Je.register({ description: "tracked-range-grows-only-when-typing-after", stickiness: 3 /* model.TrackedRangeStickiness.GrowsOnlyWhenTypingAfter */ }) ]; -function kY(s) { - return s instanceof Re ? s : Re.createDynamic(s); +function lz(s) { + return s instanceof Je ? s : Je.createDynamic(s); } -class Kae extends R { +class Fde extends J { constructor(e) { super(), this.handleBeforeFire = e, this._actual = this._register(new k()), this.event = this._actual.event, this._affectedInjectedTextLines = null, this._deferredCnt = 0, this._shouldFireDeferred = !1, this._affectsMinimap = !1, this._affectsOverviewRuler = !1, this._affectsGlyphMargin = !1, this._affectsLineNumber = !1; } @@ -37998,7 +37998,7 @@ class Kae extends R { this._shouldFireDeferred = !1, this._affectsMinimap = !1, this._affectsOverviewRuler = !1, this._affectsGlyphMargin = !1, this._actual.fire(e); } } -class Qae extends R { +class zde extends J { constructor() { super(), this._fastEmitter = this._register(new k()), this.fastEvent = this._fastEmitter.event, this._slowEmitter = this._register(new k()), this.slowEvent = this._slowEmitter.event, this._deferredCnt = 0, this._deferredEvent = null; } @@ -38020,10 +38020,10 @@ class Qae extends R { this._fastEmitter.fire(e), this._slowEmitter.fire(e); } } -const ge = $e("ILanguageFeaturesService"); -class mX { +const me = $e("ILanguageFeaturesService"); +class EJ { static create(e) { - return new mX(e.get( + return new EJ(e.get( 135 /* EditorOption.wordWrapBreakBeforeCharacters */ ), e.get( @@ -38032,26 +38032,26 @@ class mX { )); } constructor(e, t) { - this.classifier = new jae(e, t); + this.classifier = new Ade(e, t); } createLineBreaksComputer(e, t, i, n, o) { - const r = [], l = [], a = []; + const l = [], r = [], c = []; return { - addRequest: (c, d, h) => { - r.push(c), l.push(d), a.push(h); + addRequest: (d, a, h) => { + l.push(d), r.push(a), c.push(h); }, finalize: () => { - const c = e.typicalFullwidthCharacterWidth / e.typicalHalfwidthCharacterWidth, d = []; - for (let h = 0, u = r.length; h < u; h++) { - const g = l[h], m = a[h]; - m && !m.injectionOptions && !g ? d[h] = qae(this.classifier, m, r[h], t, i, c, n, o) : d[h] = $ae(this.classifier, r[h], g, t, i, c, n, o); + const d = e.typicalFullwidthCharacterWidth / e.typicalHalfwidthCharacterWidth, a = []; + for (let h = 0, u = l.length; h < u; h++) { + const m = r[h], b = c[h]; + b && !b.injectionOptions && !m ? a[h] = Kde(this.classifier, b, l[h], t, i, d, n, o) : a[h] = Ude(this.classifier, l[h], m, t, i, d, n, o); } - return Rv.length = 0, Ev.length = 0, d; + return sT.length = 0, oT.length = 0, a; } }; } } -class jae extends $b { +class Ade extends o0 { constructor(e, t) { super( 0 @@ -38074,143 +38074,143 @@ class jae extends $b { return e >= 0 && e < 256 ? this._asciiMap[e] : e >= 12352 && e <= 12543 || e >= 13312 && e <= 19903 || e >= 19968 && e <= 40959 ? 3 : this._map.get(e) || this._defaultValue; } } -let Rv = [], Ev = []; -function qae(s, e, t, i, n, o, r, l) { +let sT = [], oT = []; +function Kde(s, e, t, i, n, o, l, r) { if (n === -1) return null; - const a = t.length; - if (a <= 1) + const c = t.length; + if (c <= 1) return null; - const c = l === "keepAll", d = e.breakOffsets, h = e.breakOffsetsVisibleColumn, u = fK(t, i, n, o, r), g = n - u, m = Rv, f = Ev; - let b = 0, y = 0, w = 0, C = n; - const S = d.length; - let L = 0; - if (L >= 0) { - let x = Math.abs(h[L] - C); - for (; L + 1 < S; ) { - const Z = Math.abs(h[L + 1] - C); - if (Z >= x) + const d = r === "keepAll", a = e.breakOffsets, h = e.breakOffsetsVisibleColumn, u = qQ(t, i, n, o, l), m = n - u, b = sT, g = oT; + let Z = 0, f = 0, y = 0, W = n; + const G = a.length; + let X = 0; + if (X >= 0) { + let L = Math.abs(h[X] - W); + for (; X + 1 < G; ) { + const S = Math.abs(h[X + 1] - W); + if (S >= L) break; - x = Z, L++; - } - } - for (; L < S; ) { - let x = L < 0 ? 0 : d[L], Z = L < 0 ? 0 : h[L]; - y > x && (x = y, Z = w); - let _ = 0, v = 0, P = 0, E = 0; - if (Z <= C) { - let B = Z, X = x === 0 ? 0 : t.charCodeAt(x - 1), j = x === 0 ? 0 : s.get(X), le = !0; - for (let ue = x; ue < a; ue++) { - const be = ue, me = t.charCodeAt(ue); - let Ve, ke; - if (Hi(me) ? (ue++, Ve = 0, ke = 2) : (Ve = s.get(me), ke = Yy(me, B, i, o)), be > y && Xv(X, j, me, Ve, c) && (_ = be, v = B), B += ke, B > C) { - be > y ? (P = be, E = B - ke) : (P = ue + 1, E = B), B - v > g && (_ = 0), le = !1; + L = S, X++; + } + } + for (; X < G; ) { + let L = X < 0 ? 0 : a[X], S = X < 0 ? 0 : h[X]; + f > L && (L = f, S = y); + let x = 0, w = 0, A = 0, H = 0; + if (S <= W) { + let K = S, E = L === 0 ? 0 : t.charCodeAt(L - 1), j = L === 0 ? 0 : s.get(E), re = !0; + for (let ue = L; ue < c; ue++) { + const Ze = ue, be = t.charCodeAt(ue); + let Ye, ke; + if (Bi(be) ? (ue++, Ye = 0, ke = 2) : (Ye = s.get(be), ke = qf(be, K, i, o)), Ze > f && lT(E, j, be, Ye, d) && (x = Ze, w = K), K += ke, K > W) { + Ze > f ? (A = Ze, H = K - ke) : (A = ue + 1, H = K), K - w > m && (x = 0), re = !1; break; } - X = me, j = Ve; + E = be, j = Ye; } - if (le) { - b > 0 && (m[b] = d[d.length - 1], f[b] = h[d.length - 1], b++); + if (re) { + Z > 0 && (b[Z] = a[a.length - 1], g[Z] = h[a.length - 1], Z++); break; } } - if (_ === 0) { - let B = Z, X = t.charCodeAt(x), j = s.get(X), le = !1; - for (let ue = x - 1; ue >= y; ue--) { - const be = ue + 1, me = t.charCodeAt(ue); - if (me === 9) { - le = !0; + if (x === 0) { + let K = S, E = t.charCodeAt(L), j = s.get(E), re = !1; + for (let ue = L - 1; ue >= f; ue--) { + const Ze = ue + 1, be = t.charCodeAt(ue); + if (be === 9) { + re = !0; break; } - let Ve, ke; - if (dm(me) ? (ue--, Ve = 0, ke = 2) : (Ve = s.get(me), ke = Nh(me) ? o : 1), B <= C) { - if (P === 0 && (P = be, E = B), B <= C - g) + let Ye, ke; + if (pb(be) ? (ue--, Ye = 0, ke = 2) : (Ye = s.get(be), ke = Mh(be) ? o : 1), K <= W) { + if (A === 0 && (A = Ze, H = K), K <= W - m) break; - if (Xv(me, Ve, X, j, c)) { - _ = be, v = B; + if (lT(be, Ye, E, j, d)) { + x = Ze, w = K; break; } } - B -= ke, X = me, j = Ve; + K -= ke, E = be, j = Ye; } - if (_ !== 0) { - const ue = g - (E - v); + if (x !== 0) { + const ue = m - (H - w); if (ue <= i) { - const be = t.charCodeAt(P); - let me; - Hi(be) ? me = 2 : me = Yy(be, E, i, o), ue - me < 0 && (_ = 0); + const Ze = t.charCodeAt(A); + let be; + Bi(Ze) ? be = 2 : be = qf(Ze, H, i, o), ue - be < 0 && (x = 0); } } - if (le) { - L--; + if (re) { + X--; continue; } } - if (_ === 0 && (_ = P, v = E), _ <= y) { - const B = t.charCodeAt(y); - Hi(B) ? (_ = y + 2, v = w + 2) : (_ = y + 1, v = w + Yy(B, w, i, o)); + if (x === 0 && (x = A, w = H), x <= f) { + const K = t.charCodeAt(f); + Bi(K) ? (x = f + 2, w = y + 2) : (x = f + 1, w = y + qf(K, y, i, o)); } - for (y = _, m[b] = _, w = v, f[b] = v, b++, C = v + g; L < 0 || L < S && h[L] < v; ) - L++; - let Y = Math.abs(h[L] - C); - for (; L + 1 < S; ) { - const B = Math.abs(h[L + 1] - C); - if (B >= Y) + for (f = x, b[Z] = x, y = w, g[Z] = w, Z++, W = w + m; X < 0 || X < G && h[X] < w; ) + X++; + let F = Math.abs(h[X] - W); + for (; X + 1 < G; ) { + const K = Math.abs(h[X + 1] - W); + if (K >= F) break; - Y = B, L++; + F = K, X++; } } - return b === 0 ? null : (m.length = b, f.length = b, Rv = e.breakOffsets, Ev = e.breakOffsetsVisibleColumn, e.breakOffsets = m, e.breakOffsetsVisibleColumn = f, e.wrappedTextIndentLength = u, e); + return Z === 0 ? null : (b.length = Z, g.length = Z, sT = e.breakOffsets, oT = e.breakOffsetsVisibleColumn, e.breakOffsets = b, e.breakOffsetsVisibleColumn = g, e.wrappedTextIndentLength = u, e); } -function $ae(s, e, t, i, n, o, r, l) { - const a = Dl.applyInjectedText(e, t); - let c, d; - if (t && t.length > 0 ? (c = t.map((v) => v.options), d = t.map((v) => v.column - 1)) : (c = null, d = null), n === -1) - return c ? new Gy(d, c, [a.length], [], 0) : null; - const h = a.length; +function Ude(s, e, t, i, n, o, l, r) { + const c = Jr.applyInjectedText(e, t); + let d, a; + if (t && t.length > 0 ? (d = t.map((w) => w.options), a = t.map((w) => w.column - 1)) : (d = null, a = null), n === -1) + return d ? new Bf(a, d, [c.length], [], 0) : null; + const h = c.length; if (h <= 1) - return c ? new Gy(d, c, [a.length], [], 0) : null; - const u = l === "keepAll", g = fK(a, i, n, o, r), m = n - g, f = [], b = []; - let y = 0, w = 0, C = 0, S = n, L = a.charCodeAt(0), x = s.get(L), Z = Yy(L, 0, i, o), _ = 1; - Hi(L) && (Z += 1, L = a.charCodeAt(1), x = s.get(L), _++); - for (let v = _; v < h; v++) { - const P = v, E = a.charCodeAt(v); - let Y, B; - Hi(E) ? (v++, Y = 0, B = 2) : (Y = s.get(E), B = Yy(E, Z, i, o)), Xv(L, x, E, Y, u) && (w = P, C = Z), Z += B, Z > S && ((w === 0 || Z - C > m) && (w = P, C = Z - B), f[y] = w, b[y] = C, y++, S = C + m, w = 0), L = E, x = Y; + return d ? new Bf(a, d, [c.length], [], 0) : null; + const u = r === "keepAll", m = qQ(c, i, n, o, l), b = n - m, g = [], Z = []; + let f = 0, y = 0, W = 0, G = n, X = c.charCodeAt(0), L = s.get(X), S = qf(X, 0, i, o), x = 1; + Bi(X) && (S += 1, X = c.charCodeAt(1), L = s.get(X), x++); + for (let w = x; w < h; w++) { + const A = w, H = c.charCodeAt(w); + let F, K; + Bi(H) ? (w++, F = 0, K = 2) : (F = s.get(H), K = qf(H, S, i, o)), lT(X, L, H, F, u) && (y = A, W = S), S += K, S > G && ((y === 0 || S - W > b) && (y = A, W = S - K), g[f] = y, Z[f] = W, f++, G = W + b, y = 0), X = H, L = F; } - return y === 0 && (!t || t.length === 0) ? null : (f[y] = h, b[y] = Z, new Gy(d, c, f, b, g)); + return f === 0 && (!t || t.length === 0) ? null : (g[f] = h, Z[f] = S, new Bf(a, d, g, Z, m)); } -function Yy(s, e, t, i) { - return s === 9 ? t - e % t : Nh(s) || s < 32 ? i : 1; +function qf(s, e, t, i) { + return s === 9 ? t - e % t : Mh(s) || s < 32 ? i : 1; } -function GY(s, e) { +function rz(s, e) { return e - s % e; } -function Xv(s, e, t, i, n) { +function lT(s, e, t, i, n) { return t !== 32 && (e === 2 && i !== 2 || e !== 1 && i === 1 || !n && e === 3 && i !== 2 || !n && i === 3 && e !== 1); } -function fK(s, e, t, i, n) { +function qQ(s, e, t, i, n) { let o = 0; if (n !== 0) { - const r = qn(s); - if (r !== -1) { - for (let a = 0; a < r; a++) { - const c = s.charCodeAt(a) === 9 ? GY(o, e) : 1; - o += c; + const l = es(s); + if (l !== -1) { + for (let c = 0; c < l; c++) { + const d = s.charCodeAt(c) === 9 ? rz(o, e) : 1; + o += d; } - const l = n === 3 ? 2 : n === 2 ? 1 : 0; - for (let a = 0; a < l; a++) { - const c = GY(o, e); - o += c; + const r = n === 3 ? 2 : n === 2 ? 1 : 0; + for (let c = 0; c < r; c++) { + const d = rz(o, e); + o += d; } o + i > t && (o = 0); } } return o; } -class BA { +class oL { constructor(e) { - this._selTrackedRange = null, this._trackSelection = !0, this._setState(e, new dn(new M(1, 1, 1, 1), 0, 0, new V(1, 1), 0), new dn(new M(1, 1, 1, 1), 0, 0, new V(1, 1), 0)); + this._selTrackedRange = null, this._trackSelection = !0, this._setState(e, new hn(new I(1, 1, 1, 1), 0, 0, new Y(1, 1), 0), new hn(new I(1, 1, 1, 1), 0, 0, new Y(1, 1), 0)); } dispose(e) { this._removeTrackedRange(e); @@ -38238,11 +38238,11 @@ class BA { ); } asCursorState() { - return new dt(this.modelState, this.viewState); + return new at(this.modelState, this.viewState); } readSelectionFromMarkers(e) { const t = e.model._getTrackedRange(this._selTrackedRange); - return this.modelState.selection.isEmpty() && !t.isEmpty() ? fe.fromRange(t.collapseToEnd(), this.modelState.selection.getDirection()) : fe.fromRange(t, this.modelState.selection.getDirection()); + return this.modelState.selection.isEmpty() && !t.isEmpty() ? ge.fromRange(t.collapseToEnd(), this.modelState.selection.getDirection()) : ge.fromRange(t, this.modelState.selection.getDirection()); } ensureValidState(e) { this._setState(e, this.modelState, this.viewState); @@ -38258,36 +38258,36 @@ class BA { ); } static _validateViewState(e, t) { - const i = t.position, n = t.selectionStart.getStartPosition(), o = t.selectionStart.getEndPosition(), r = e.normalizePosition( + const i = t.position, n = t.selectionStart.getStartPosition(), o = t.selectionStart.getEndPosition(), l = e.normalizePosition( i, 2 /* PositionAffinity.None */ - ), l = this._validatePositionWithCache(e, n, i, r), a = this._validatePositionWithCache(e, o, n, l); - return i.equals(r) && n.equals(l) && o.equals(a) ? t : new dn(M.fromPositions(l, a), t.selectionStartKind, t.selectionStartLeftoverVisibleColumns + n.column - l.column, r, t.leftoverVisibleColumns + i.column - r.column); + ), r = this._validatePositionWithCache(e, n, i, l), c = this._validatePositionWithCache(e, o, n, r); + return i.equals(l) && n.equals(r) && o.equals(c) ? t : new hn(I.fromPositions(r, c), t.selectionStartKind, t.selectionStartLeftoverVisibleColumns + n.column - r.column, l, t.leftoverVisibleColumns + i.column - l.column); } _setState(e, t, i) { - if (i && (i = BA._validateViewState(e.viewModel, i)), t) { - const n = e.model.validateRange(t.selectionStart), o = t.selectionStart.equalsRange(n) ? t.selectionStartLeftoverVisibleColumns : 0, r = e.model.validatePosition(t.position), l = t.position.equals(r) ? t.leftoverVisibleColumns : 0; - t = new dn(n, t.selectionStartKind, o, r, l); + if (i && (i = oL._validateViewState(e.viewModel, i)), t) { + const n = e.model.validateRange(t.selectionStart), o = t.selectionStart.equalsRange(n) ? t.selectionStartLeftoverVisibleColumns : 0, l = e.model.validatePosition(t.position), r = t.position.equals(l) ? t.leftoverVisibleColumns : 0; + t = new hn(n, t.selectionStartKind, o, l, r); } else { if (!i) return; const n = e.model.validateRange(e.coordinatesConverter.convertViewRangeToModelRange(i.selectionStart)), o = e.model.validatePosition(e.coordinatesConverter.convertViewPositionToModelPosition(i.position)); - t = new dn(n, i.selectionStartKind, i.selectionStartLeftoverVisibleColumns, o, i.leftoverVisibleColumns); + t = new hn(n, i.selectionStartKind, i.selectionStartLeftoverVisibleColumns, o, i.leftoverVisibleColumns); } if (i) { const n = e.coordinatesConverter.validateViewRange(i.selectionStart, t.selectionStart), o = e.coordinatesConverter.validateViewPosition(i.position, t.position); - i = new dn(n, t.selectionStartKind, t.selectionStartLeftoverVisibleColumns, o, t.leftoverVisibleColumns); + i = new hn(n, t.selectionStartKind, t.selectionStartLeftoverVisibleColumns, o, t.leftoverVisibleColumns); } else { - const n = e.coordinatesConverter.convertModelPositionToViewPosition(new V(t.selectionStart.startLineNumber, t.selectionStart.startColumn)), o = e.coordinatesConverter.convertModelPositionToViewPosition(new V(t.selectionStart.endLineNumber, t.selectionStart.endColumn)), r = new M(n.lineNumber, n.column, o.lineNumber, o.column), l = e.coordinatesConverter.convertModelPositionToViewPosition(t.position); - i = new dn(r, t.selectionStartKind, t.selectionStartLeftoverVisibleColumns, l, t.leftoverVisibleColumns); + const n = e.coordinatesConverter.convertModelPositionToViewPosition(new Y(t.selectionStart.startLineNumber, t.selectionStart.startColumn)), o = e.coordinatesConverter.convertModelPositionToViewPosition(new Y(t.selectionStart.endLineNumber, t.selectionStart.endColumn)), l = new I(n.lineNumber, n.column, o.lineNumber, o.column), r = e.coordinatesConverter.convertModelPositionToViewPosition(t.position); + i = new hn(l, t.selectionStartKind, t.selectionStartLeftoverVisibleColumns, r, t.leftoverVisibleColumns); } this.modelState = t, this.viewState = i, this._updateTrackedRange(e); } } -class RY { +class cz { constructor(e) { - this.context = e, this.cursors = [new BA(e)], this.lastAddedCursorIndex = 0; + this.context = e, this.cursors = [new oL(e)], this.lastAddedCursorIndex = 0; } dispose() { for (const e of this.cursors) @@ -38318,10 +38318,10 @@ class RY { return this.cursors.map((e) => e.viewState.position); } getTopMostViewPosition() { - return vre(this.cursors, gs((e) => e.viewState.position, V.compare)).viewState.position; + return Vre(this.cursors, ps((e) => e.viewState.position, Y.compare)).viewState.position; } getBottomMostViewPosition() { - return Wre(this.cursors, gs((e) => e.viewState.position, V.compare)).viewState.position; + return Xre(this.cursors, ps((e) => e.viewState.position, Y.compare)).viewState.position; } getSelections() { return this.cursors.map((e) => e.modelState.selection); @@ -38330,7 +38330,7 @@ class RY { return this.cursors.map((e) => e.viewState.selection); } setSelections(e) { - this.setStates(dt.fromModelSelections(e)); + this.setStates(at.fromModelSelections(e)); } getPrimaryCursor() { return this.cursors[0].asCursorState(); @@ -38359,7 +38359,7 @@ class RY { this._setSecondaryStates([]); } _addSecondaryCursor() { - this.cursors.push(new BA(this.context)), this.lastAddedCursorIndex = this.cursors.length - 1; + this.cursors.push(new oL(this.context)), this.lastAddedCursorIndex = this.cursors.length - 1; } getLastAddedCursorIndex() { return this.cursors.length === 1 || this.lastAddedCursorIndex === 0 ? 0 : this.lastAddedCursorIndex; @@ -38376,46 +38376,46 @@ class RY { index: i, selection: e[i].modelState.selection }); - t.sort(gs((i) => i.selection, M.compareRangesUsingStarts)); + t.sort(ps((i) => i.selection, I.compareRangesUsingStarts)); for (let i = 0; i < t.length - 1; i++) { - const n = t[i], o = t[i + 1], r = n.selection, l = o.selection; + const n = t[i], o = t[i + 1], l = n.selection, r = o.selection; if (!this.context.cursorConfig.multiCursorMergeOverlapping) continue; - let a; - if (l.isEmpty() || r.isEmpty() ? a = l.getStartPosition().isBeforeOrEqual(r.getEndPosition()) : a = l.getStartPosition().isBefore(r.getEndPosition()), a) { - const c = n.index < o.index ? i : i + 1, d = n.index < o.index ? i + 1 : i, h = t[d].index, u = t[c].index, g = t[d].selection, m = t[c].selection; - if (!g.equalsSelection(m)) { - const f = g.plusRange(m), b = g.selectionStartLineNumber === g.startLineNumber && g.selectionStartColumn === g.startColumn, y = m.selectionStartLineNumber === m.startLineNumber && m.selectionStartColumn === m.startColumn; - let w; - h === this.lastAddedCursorIndex ? (w = b, this.lastAddedCursorIndex = u) : w = y; - let C; - w ? C = new fe(f.startLineNumber, f.startColumn, f.endLineNumber, f.endColumn) : C = new fe(f.endLineNumber, f.endColumn, f.startLineNumber, f.startColumn), t[c].selection = C; - const S = dt.fromModelSelection(C); - e[u].setState(this.context, S.modelState, S.viewState); + let c; + if (r.isEmpty() || l.isEmpty() ? c = r.getStartPosition().isBeforeOrEqual(l.getEndPosition()) : c = r.getStartPosition().isBefore(l.getEndPosition()), c) { + const d = n.index < o.index ? i : i + 1, a = n.index < o.index ? i + 1 : i, h = t[a].index, u = t[d].index, m = t[a].selection, b = t[d].selection; + if (!m.equalsSelection(b)) { + const g = m.plusRange(b), Z = m.selectionStartLineNumber === m.startLineNumber && m.selectionStartColumn === m.startColumn, f = b.selectionStartLineNumber === b.startLineNumber && b.selectionStartColumn === b.startColumn; + let y; + h === this.lastAddedCursorIndex ? (y = Z, this.lastAddedCursorIndex = u) : y = f; + let W; + y ? W = new ge(g.startLineNumber, g.startColumn, g.endLineNumber, g.endColumn) : W = new ge(g.endLineNumber, g.endColumn, g.startLineNumber, g.startColumn), t[d].selection = W; + const G = at.fromModelSelection(W); + e[u].setState(this.context, G.modelState, G.viewState); } - for (const f of t) - f.index > h && f.index--; - e.splice(h, 1), t.splice(d, 1), this._removeSecondaryCursor(h - 1), i--; + for (const g of t) + g.index > h && g.index--; + e.splice(h, 1), t.splice(a, 1), this._removeSecondaryCursor(h - 1), i--; } } } } -class EY { +class dz { constructor(e, t, i, n) { this._cursorContextBrand = void 0, this.model = e, this.viewModel = t, this.coordinatesConverter = i, this.cursorConfig = n; } } -class ece { +class Pde { constructor() { this.type = 0; } } -class tce { +class Bde { constructor() { this.type = 1; } } -class ice { +class _de { constructor(e) { this.type = 2, this._source = e; } @@ -38423,82 +38423,82 @@ class ice { return this._source.hasChanged(e); } } -class nce { +class Qde { constructor(e, t, i) { this.selections = e, this.modelSelections = t, this.reason = i, this.type = 3; } } -class du { +class bu { constructor(e) { this.type = 4, e ? (this.affectsMinimap = e.affectsMinimap, this.affectsOverviewRuler = e.affectsOverviewRuler, this.affectsGlyphMargin = e.affectsGlyphMargin, this.affectsLineNumber = e.affectsLineNumber) : (this.affectsMinimap = !0, this.affectsOverviewRuler = !0, this.affectsGlyphMargin = !0, this.affectsLineNumber = !0); } } -class pS { +class C1 { constructor() { this.type = 5; } } -class sce { +class Ode { constructor(e) { this.type = 6, this.isFocused = e; } } -class oce { +class jde { constructor() { this.type = 7; } } -class fS { +class R1 { constructor() { this.type = 8; } } -class bK { +class $Q { constructor(e, t) { this.fromLineNumber = e, this.count = t, this.type = 9; } } -class Fv { +class rT { constructor(e, t) { this.type = 10, this.fromLineNumber = e, this.toLineNumber = t; } } -class Yv { +class cT { constructor(e, t) { this.type = 11, this.fromLineNumber = e, this.toLineNumber = t; } } -class zy { - constructor(e, t, i, n, o, r, l) { - this.source = e, this.minimalReveal = t, this.range = i, this.selections = n, this.verticalType = o, this.revealHorizontal = r, this.scrollType = l, this.type = 12; +class $f { + constructor(e, t, i, n, o, l, r) { + this.source = e, this.minimalReveal = t, this.range = i, this.selections = n, this.verticalType = o, this.revealHorizontal = l, this.scrollType = r, this.type = 12; } } -class rce { +class qde { constructor(e) { this.type = 13, this.scrollWidth = e.scrollWidth, this.scrollLeft = e.scrollLeft, this.scrollHeight = e.scrollHeight, this.scrollTop = e.scrollTop, this.scrollWidthChanged = e.scrollWidthChanged, this.scrollLeftChanged = e.scrollLeftChanged, this.scrollHeightChanged = e.scrollHeightChanged, this.scrollTopChanged = e.scrollTopChanged; } } -class lce { +class $de { constructor(e) { this.theme = e, this.type = 14; } } -class ace { +class eae { constructor(e) { this.type = 15, this.ranges = e; } } -class cce { +class tae { constructor() { this.type = 16; } } -let dce = class { +let iae = class { constructor() { this.type = 17; } }; -class hce extends R { +class nae extends J { constructor() { super(), this._onEvent = this._register(new k()), this.onEvent = this._onEvent.event, this._eventHandlers = [], this._viewEventQueue = null, this._isConsumingViewEventQueue = !1, this._collector = null, this._collectorCnt = 0, this._outgoingEvents = []; } @@ -38536,7 +38536,7 @@ class hce extends R { } } beginEmitViewEvents() { - return this._collectorCnt++, this._collectorCnt === 1 && (this._collector = new uce()), this._collector; + return this._collectorCnt++, this._collectorCnt === 1 && (this._collector = new sae()), this._collector; } endEmitViewEvents() { if (this._collectorCnt--, this._collectorCnt === 0) { @@ -38575,7 +38575,7 @@ class hce extends R { } } } -class uce { +class sae { constructor() { this.viewEvents = [], this.outgoingEvents = []; } @@ -38586,7 +38586,7 @@ class uce { this.outgoingEvents.push(e); } } -class pX { +class DJ { constructor(e, t, i, n) { this.kind = 0, this._oldContentWidth = e, this._oldContentHeight = t, this.contentWidth = i, this.contentHeight = n, this.contentWidthChanged = this._oldContentWidth !== this.contentWidth, this.contentHeightChanged = this._oldContentHeight !== this.contentHeight; } @@ -38594,10 +38594,10 @@ class pX { return !this.contentWidthChanged && !this.contentHeightChanged; } attemptToMerge(e) { - return e.kind !== this.kind ? null : new pX(this._oldContentWidth, this._oldContentHeight, e.contentWidth, e.contentHeight); + return e.kind !== this.kind ? null : new DJ(this._oldContentWidth, this._oldContentHeight, e.contentWidth, e.contentHeight); } } -class fX { +class FJ { constructor(e, t) { this.kind = 1, this.oldHasFocus = e, this.hasFocus = t; } @@ -38605,21 +38605,21 @@ class fX { return this.oldHasFocus === this.hasFocus; } attemptToMerge(e) { - return e.kind !== this.kind ? null : new fX(this.oldHasFocus, e.hasFocus); + return e.kind !== this.kind ? null : new FJ(this.oldHasFocus, e.hasFocus); } } -class bX { - constructor(e, t, i, n, o, r, l, a) { - this.kind = 2, this._oldScrollWidth = e, this._oldScrollLeft = t, this._oldScrollHeight = i, this._oldScrollTop = n, this.scrollWidth = o, this.scrollLeft = r, this.scrollHeight = l, this.scrollTop = a, this.scrollWidthChanged = this._oldScrollWidth !== this.scrollWidth, this.scrollLeftChanged = this._oldScrollLeft !== this.scrollLeft, this.scrollHeightChanged = this._oldScrollHeight !== this.scrollHeight, this.scrollTopChanged = this._oldScrollTop !== this.scrollTop; +class zJ { + constructor(e, t, i, n, o, l, r, c) { + this.kind = 2, this._oldScrollWidth = e, this._oldScrollLeft = t, this._oldScrollHeight = i, this._oldScrollTop = n, this.scrollWidth = o, this.scrollLeft = l, this.scrollHeight = r, this.scrollTop = c, this.scrollWidthChanged = this._oldScrollWidth !== this.scrollWidth, this.scrollLeftChanged = this._oldScrollLeft !== this.scrollLeft, this.scrollHeightChanged = this._oldScrollHeight !== this.scrollHeight, this.scrollTopChanged = this._oldScrollTop !== this.scrollTop; } isNoOp() { return !this.scrollWidthChanged && !this.scrollLeftChanged && !this.scrollHeightChanged && !this.scrollTopChanged; } attemptToMerge(e) { - return e.kind !== this.kind ? null : new bX(this._oldScrollWidth, this._oldScrollLeft, this._oldScrollHeight, this._oldScrollTop, e.scrollWidth, e.scrollLeft, e.scrollHeight, e.scrollTop); + return e.kind !== this.kind ? null : new zJ(this._oldScrollWidth, this._oldScrollLeft, this._oldScrollHeight, this._oldScrollTop, e.scrollWidth, e.scrollLeft, e.scrollHeight, e.scrollTop); } } -class gce { +class oae { constructor() { this.kind = 3; } @@ -38630,7 +38630,7 @@ class gce { return e.kind !== this.kind ? null : this; } } -class mce { +class lae { constructor() { this.kind = 4; } @@ -38641,9 +38641,9 @@ class mce { return e.kind !== this.kind ? null : this; } } -class OA { - constructor(e, t, i, n, o, r, l) { - this.kind = 6, this.oldSelections = e, this.selections = t, this.oldModelVersionId = i, this.modelVersionId = n, this.source = o, this.reason = r, this.reachedMaxCursorCount = l; +class lL { + constructor(e, t, i, n, o, l, r) { + this.kind = 6, this.oldSelections = e, this.selections = t, this.oldModelVersionId = i, this.modelVersionId = n, this.source = o, this.reason = l, this.reachedMaxCursorCount = r; } static _selectionsAreEqual(e, t) { if (!e && !t) @@ -38659,13 +38659,13 @@ class OA { return !0; } isNoOp() { - return OA._selectionsAreEqual(this.oldSelections, this.selections) && this.oldModelVersionId === this.modelVersionId; + return lL._selectionsAreEqual(this.oldSelections, this.selections) && this.oldModelVersionId === this.modelVersionId; } attemptToMerge(e) { - return e.kind !== this.kind ? null : new OA(this.oldSelections, e.selections, this.oldModelVersionId, e.modelVersionId, e.source, e.reason, this.reachedMaxCursorCount || e.reachedMaxCursorCount); + return e.kind !== this.kind ? null : new lL(this.oldSelections, e.selections, this.oldModelVersionId, e.modelVersionId, e.source, e.reason, this.reachedMaxCursorCount || e.reachedMaxCursorCount); } } -class pce { +class rae { constructor() { this.kind = 5; } @@ -38676,7 +38676,7 @@ class pce { return e.kind !== this.kind ? null : this; } } -class fce { +class cae { constructor(e) { this.event = e, this.kind = 7; } @@ -38687,7 +38687,7 @@ class fce { return null; } } -class bce { +class dae { constructor(e) { this.event = e, this.kind = 8; } @@ -38698,7 +38698,7 @@ class bce { return null; } } -class yce { +class aae { constructor(e) { this.event = e, this.kind = 9; } @@ -38709,7 +38709,7 @@ class yce { return null; } } -class wce { +class hae { constructor(e) { this.event = e, this.kind = 10; } @@ -38720,7 +38720,7 @@ class wce { return null; } } -class Cce { +class uae { constructor(e) { this.event = e, this.kind = 11; } @@ -38731,7 +38731,7 @@ class Cce { return null; } } -class Sce { +class mae { constructor(e) { this.event = e, this.kind = 12; } @@ -38742,15 +38742,15 @@ class Sce { return null; } } -class Lce extends R { +class bae extends J { constructor(e, t, i, n) { - super(), this._model = e, this._knownModelVersionId = this._model.getVersionId(), this._viewModel = t, this._coordinatesConverter = i, this.context = new EY(this._model, this._viewModel, this._coordinatesConverter, n), this._cursors = new RY(this.context), this._hasFocus = !1, this._isHandling = !1, this._compositionState = null, this._columnSelectData = null, this._autoClosedActions = [], this._prevEditOperationType = 0; + super(), this._model = e, this._knownModelVersionId = this._model.getVersionId(), this._viewModel = t, this._coordinatesConverter = i, this.context = new dz(this._model, this._viewModel, this._coordinatesConverter, n), this._cursors = new cz(this.context), this._hasFocus = !1, this._isHandling = !1, this._compositionState = null, this._columnSelectData = null, this._autoClosedActions = [], this._prevEditOperationType = 0; } dispose() { - this._cursors.dispose(), this._autoClosedActions = Wt(this._autoClosedActions), super.dispose(); + this._cursors.dispose(), this._autoClosedActions = Nt(this._autoClosedActions), super.dispose(); } updateConfiguration(e) { - this.context = new EY(this._model, this._viewModel, this._coordinatesConverter, e), this._cursors.updateContext(this.context); + this.context = new dz(this._model, this._viewModel, this._coordinatesConverter, e), this._cursors.updateContext(this.context); } onLineMappingChanged(e) { this._knownModelVersionId === this._model.getVersionId() && this.setStates(e, "viewModel", 0, this.getCursorStates()); @@ -38779,22 +38779,22 @@ class Lce extends R { } setStates(e, t, i, n) { let o = !1; - const r = this.context.cursorConfig.multiCursorLimit; - n !== null && n.length > r && (n = n.slice(0, r), o = !0); - const l = Py.from(this._model, this); - return this._cursors.setStates(n), this._cursors.normalize(), this._columnSelectData = null, this._validateAutoClosedActions(), this._emitStateChangedIfNecessary(e, t, i, l, o); + const l = this.context.cursorConfig.multiCursorLimit; + n !== null && n.length > l && (n = n.slice(0, l), o = !0); + const r = ey.from(this._model, this); + return this._cursors.setStates(n), this._cursors.normalize(), this._columnSelectData = null, this._validateAutoClosedActions(), this._emitStateChangedIfNecessary(e, t, i, r, o); } setCursorColumnSelectData(e) { this._columnSelectData = e; } - revealAll(e, t, i, n, o, r) { - const l = this._cursors.getViewPositions(); - let a = null, c = null; - l.length > 1 ? c = this._cursors.getViewSelections() : a = M.fromPositions(l[0], l[0]), e.emitViewEvent(new zy(t, i, a, c, n, o, r)); + revealAll(e, t, i, n, o, l) { + const r = this._cursors.getViewPositions(); + let c = null, d = null; + r.length > 1 ? d = this._cursors.getViewSelections() : c = I.fromPositions(r[0], r[0]), e.emitViewEvent(new $f(t, i, c, d, n, o, l)); } - revealPrimary(e, t, i, n, o, r) { - const a = [this._cursors.getPrimaryCursor().viewState.selection]; - e.emitViewEvent(new zy(t, i, null, a, n, o, r)); + revealPrimary(e, t, i, n, o, l) { + const c = [this._cursors.getPrimaryCursor().viewState.selection]; + e.emitViewEvent(new $f(t, i, null, c, n, o, l)); } saveState() { const e = [], t = this._cursors.getSelections(); @@ -38817,18 +38817,18 @@ class Lce extends R { restoreState(e, t) { const i = []; for (let n = 0, o = t.length; n < o; n++) { - const r = t[n]; - let l = 1, a = 1; - r.position && r.position.lineNumber && (l = r.position.lineNumber), r.position && r.position.column && (a = r.position.column); - let c = l, d = a; - r.selectionStart && r.selectionStart.lineNumber && (c = r.selectionStart.lineNumber), r.selectionStart && r.selectionStart.column && (d = r.selectionStart.column), i.push({ - selectionStartLineNumber: c, - selectionStartColumn: d, - positionLineNumber: l, - positionColumn: a + const l = t[n]; + let r = 1, c = 1; + l.position && l.position.lineNumber && (r = l.position.lineNumber), l.position && l.position.column && (c = l.position.column); + let d = r, a = c; + l.selectionStart && l.selectionStart.lineNumber && (d = l.selectionStart.lineNumber), l.selectionStart && l.selectionStart.column && (a = l.selectionStart.column), i.push({ + selectionStartLineNumber: d, + selectionStartColumn: a, + positionLineNumber: r, + positionColumn: c }); } - this.setStates(e, "restoreState", 0, dt.fromModelSelections(i)), this.revealAll( + this.setStates(e, "restoreState", 0, at.fromModelSelections(i)), this.revealAll( e, "restoreState", !1, @@ -38839,7 +38839,7 @@ class Lce extends R { ); } onModelContentChanged(e, t) { - if (t instanceof OU) { + if (t instanceof xQ) { if (this._isHandling) return; this._isHandling = !0; @@ -38857,9 +38857,9 @@ class Lce extends R { /* RawContentChangedType.Flush */ ); if (this._prevEditOperationType = 0, n) - this._cursors.dispose(), this._cursors = new RY(this.context), this._validateAutoClosedActions(), this._emitStateChangedIfNecessary(e, "model", 1, null, !1); + this._cursors.dispose(), this._cursors = new cz(this.context), this._validateAutoClosedActions(), this._emitStateChangedIfNecessary(e, "model", 1, null, !1); else if (this._hasFocus && i.resultingSelection && i.resultingSelection.length > 0) { - const o = dt.fromModelSelections(i.resultingSelection); + const o = at.fromModelSelections(i.resultingSelection); this.setStates(e, "modelChange", i.isUndoing ? 5 : i.isRedoing ? 6 : 2, o) && this.revealAll( e, "modelChange", @@ -38871,7 +38871,7 @@ class Lce extends R { ); } else { const o = this._cursors.readSelectionFromMarkers(); - this.setStates(e, "modelChange", 2, dt.fromModelSelections(o)); + this.setStates(e, "modelChange", 2, at.fromModelSelections(o)); } } } @@ -38900,7 +38900,7 @@ class Lce extends R { return this._cursors.getSelections(); } setSelections(e, t, i, n) { - this.setStates(e, t, n, dt.fromModelSelections(i)); + this.setStates(e, t, n, at.fromModelSelections(i)); } getPrevEditOperationType() { return this._prevEditOperationType; @@ -38911,9 +38911,9 @@ class Lce extends R { // ------ auxiliary handling logic _pushAutoClosedAction(e, t) { const i = [], n = []; - for (let l = 0, a = e.length; l < a; l++) + for (let r = 0, c = e.length; r < c; r++) i.push({ - range: e[l], + range: e[r], options: { description: "auto-closed-character", inlineClassName: "auto-closed-character", @@ -38921,27 +38921,27 @@ class Lce extends R { /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ } }), n.push({ - range: t[l], + range: t[r], options: { description: "auto-closed-enclosing", stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ } }); - const o = this._model.deltaDecorations([], i), r = this._model.deltaDecorations([], n); - this._autoClosedActions.push(new XY(this._model, o, r)); + const o = this._model.deltaDecorations([], i), l = this._model.deltaDecorations([], n); + this._autoClosedActions.push(new az(this._model, o, l)); } _executeEditOperation(e) { if (!e) return; e.shouldPushStackElementBefore && this._model.pushStackElement(); - const t = Ace.executeCommands(this._model, this._cursors.getSelections(), e.commands); + const t = pae.executeCommands(this._model, this._cursors.getSelections(), e.commands); if (t) { this._interpretCommandResult(t); const i = [], n = []; for (let o = 0; o < e.commands.length; o++) { - const r = e.commands[o]; - r instanceof IE && r.enclosingRange && r.closeCharacterRange && (i.push(r.closeCharacterRange), n.push(r.enclosingRange)); + const l = e.commands[o]; + l instanceof $v && l.enclosingRange && l.closeCharacterRange && (i.push(l.closeCharacterRange), n.push(l.enclosingRange)); } i.length > 0 && this._pushAutoClosedAction(i, n), this._prevEditOperationType = e.type; } @@ -38953,13 +38953,13 @@ class Lce extends R { // ----------------------------------------------------------------------------------------------------------- // ----- emitting events _emitStateChangedIfNecessary(e, t, i, n, o) { - const r = Py.from(this._model, this); - if (r.equals(n)) + const l = ey.from(this._model, this); + if (l.equals(n)) return !1; - const l = this._cursors.getSelections(), a = this._cursors.getViewSelections(); - if (e.emitViewEvent(new nce(a, l, i)), !n || n.cursorState.length !== r.cursorState.length || r.cursorState.some((c, d) => !c.modelState.equals(n.cursorState[d].modelState))) { - const c = n ? n.cursorState.map((h) => h.modelState.selection) : null, d = n ? n.modelVersionId : 0; - e.emitOutgoingEvent(new OA(c, l, d, r.modelVersionId, t || "keyboard", i, o)); + const r = this._cursors.getSelections(), c = this._cursors.getViewSelections(); + if (e.emitViewEvent(new Qde(c, r, i)), !n || n.cursorState.length !== l.cursorState.length || l.cursorState.some((d, a) => !d.modelState.equals(n.cursorState[a].modelState))) { + const d = n ? n.cursorState.map((h) => h.modelState.selection) : null, a = n ? n.modelVersionId : 0; + e.emitOutgoingEvent(new lL(d, r, a, l.modelVersionId, t || "keyboard", i, o)); } return !0; } @@ -38974,48 +38974,48 @@ class Lce extends R { if (!o.text || o.text.indexOf(` `) >= 0) return null; - const r = o.text.match(/([)\]}>'"`])([^)\]}>'"`]*)$/); - if (!r) + const l = o.text.match(/([)\]}>'"`])([^)\]}>'"`]*)$/); + if (!l) return null; - const l = r[1], a = this.context.cursorConfig.autoClosingPairs.autoClosingPairsCloseSingleChar.get(l); - if (!a || a.length !== 1) + const r = l[1], c = this.context.cursorConfig.autoClosingPairs.autoClosingPairsCloseSingleChar.get(r); + if (!c || c.length !== 1) return null; - const c = a[0].open, d = o.text.length - r[2].length - 1, h = o.text.lastIndexOf(c, d - 1); + const d = c[0].open, a = o.text.length - l[2].length - 1, h = o.text.lastIndexOf(d, a - 1); if (h === -1) return null; - t.push([h, d]); + t.push([h, a]); } return t; } executeEdits(e, t, i, n) { let o = null; t === "snippet" && (o = this._findAutoClosingPairs(i)), o && (i[0]._isTracked = !0); - const r = [], l = [], a = this._model.pushEditOperations(this.getSelections(), i, (c) => { + const l = [], r = [], c = this._model.pushEditOperations(this.getSelections(), i, (d) => { if (o) for (let h = 0, u = o.length; h < u; h++) { - const [g, m] = o[h], f = c[h], b = f.range.startLineNumber, y = f.range.startColumn - 1 + g, w = f.range.startColumn - 1 + m; - r.push(new M(b, w + 1, b, w + 2)), l.push(new M(b, y + 1, b, w + 2)); + const [m, b] = o[h], g = d[h], Z = g.range.startLineNumber, f = g.range.startColumn - 1 + m, y = g.range.startColumn - 1 + b; + l.push(new I(Z, y + 1, Z, y + 2)), r.push(new I(Z, f + 1, Z, y + 2)); } - const d = n(c); - return d && (this._isHandling = !0), d; + const a = n(d); + return a && (this._isHandling = !0), a; }); - a && (this._isHandling = !1, this.setSelections( + c && (this._isHandling = !1, this.setSelections( e, t, - a, + c, 0 /* CursorChangeReason.NotSet */ - )), r.length > 0 && this._pushAutoClosedAction(r, l); + )), l.length > 0 && this._pushAutoClosedAction(l, r); } _executeEdit(e, t, i, n = 0) { if (this.context.cursorConfig.readOnly) return; - const o = Py.from(this._model, this); + const o = ey.from(this._model, this); this._cursors.stopTrackingSelections(), this._isHandling = !0; try { this._cursors.ensureValidState(), e(); - } catch (r) { - De(r); + } catch (l) { + Me(l); } this._isHandling = !1, this._cursors.startTrackingSelections(), this._validateAutoClosedActions(), this._emitStateChangedIfNecessary(t, i, n, o, !1) && this.revealAll( t, @@ -39028,15 +39028,15 @@ class Lce extends R { ); } getAutoClosedCharacters() { - return XY.getAllAutoClosedCharacters(this._autoClosedActions); + return az.getAllAutoClosedCharacters(this._autoClosedActions); } startComposition(e) { - this._compositionState = new By(this._model, this.getSelections()); + this._compositionState = new ty(this._model, this.getSelections()); } endComposition(e, t) { const i = this._compositionState ? this._compositionState.deduceOutcome(this._model, this.getSelections()) : null; this._compositionState = null, this._executeEdit(() => { - t === "keyboard" && this._executeEditOperation(vd.compositionEndWithInterceptors(this._prevEditOperationType, this.context.cursorConfig, this._model, i, this.getSelections(), this.getAutoClosedCharacters())); + t === "keyboard" && this._executeEditOperation(ka.compositionEndWithInterceptors(this._prevEditOperationType, this.context.cursorConfig, this._model, i, this.getSelections(), this.getAutoClosedCharacters())); }, e, t); } type(e, t, i) { @@ -39045,24 +39045,24 @@ class Lce extends R { const n = t.length; let o = 0; for (; o < n; ) { - const r = sE(t, o), l = t.substr(o, r); - this._executeEditOperation(vd.typeWithInterceptors(!!this._compositionState, this._prevEditOperationType, this.context.cursorConfig, this._model, this.getSelections(), this.getAutoClosedCharacters(), l)), o += r; + const l = Rv(t, o), r = t.substr(o, l); + this._executeEditOperation(ka.typeWithInterceptors(!!this._compositionState, this._prevEditOperationType, this.context.cursorConfig, this._model, this.getSelections(), this.getAutoClosedCharacters(), r)), o += l; } } else - this._executeEditOperation(vd.typeWithoutInterceptors(this._prevEditOperationType, this.context.cursorConfig, this._model, this.getSelections(), t)); + this._executeEditOperation(ka.typeWithoutInterceptors(this._prevEditOperationType, this.context.cursorConfig, this._model, this.getSelections(), t)); }, e, i); } - compositionType(e, t, i, n, o, r) { + compositionType(e, t, i, n, o, l) { if (t.length === 0 && i === 0 && n === 0) { if (o !== 0) { - const l = this.getSelections().map((a) => { - const c = a.getPosition(); - return new fe(c.lineNumber, c.column + o, c.lineNumber, c.column + o); + const r = this.getSelections().map((c) => { + const d = c.getPosition(); + return new ge(d.lineNumber, d.column + o, d.lineNumber, d.column + o); }); this.setSelections( e, - r, l, + r, 0 /* CursorChangeReason.NotSet */ ); @@ -39070,13 +39070,13 @@ class Lce extends R { return; } this._executeEdit(() => { - this._executeEditOperation(vd.compositionType(this._prevEditOperationType, this.context.cursorConfig, this._model, this.getSelections(), t, i, n, o)); - }, e, r); + this._executeEditOperation(ka.compositionType(this._prevEditOperationType, this.context.cursorConfig, this._model, this.getSelections(), t, i, n, o)); + }, e, l); } paste(e, t, i, n, o) { this._executeEdit( () => { - this._executeEditOperation(vd.paste(this.context.cursorConfig, this._model, this.getSelections(), t, i, n || [])); + this._executeEditOperation(ka.paste(this.context.cursorConfig, this._model, this.getSelections(), t, i, n || [])); }, e, o, @@ -39086,12 +39086,12 @@ class Lce extends R { } cut(e, t) { this._executeEdit(() => { - this._executeEditOperation(mm.cut(this.context.cursorConfig, this._model, this.getSelections())); + this._executeEditOperation(yb.cut(this.context.cursorConfig, this._model, this.getSelections())); }, e, t); } executeCommand(e, t, i) { this._executeEdit(() => { - this._cursors.killSecondaryCursors(), this._executeEditOperation(new Es(0, [t], { + this._cursors.killSecondaryCursors(), this._executeEditOperation(new Ds(0, [t], { shouldPushStackElementBefore: !1, shouldPushStackElementAfter: !1 })); @@ -39099,16 +39099,16 @@ class Lce extends R { } executeCommands(e, t, i) { this._executeEdit(() => { - this._executeEditOperation(new Es(0, t, { + this._executeEditOperation(new Ds(0, t, { shouldPushStackElementBefore: !1, shouldPushStackElementAfter: !1 })); }, e, i); } } -class Py { +class ey { static from(e, t) { - return new Py(e.getVersionId(), t.getCursorStates()); + return new ey(e.getVersionId(), t.getCursorStates()); } constructor(e, t) { this.modelVersionId = e, this.cursorState = t; @@ -39122,7 +39122,7 @@ class Py { return !0; } } -class XY { +class az { static getAllAutoClosedCharacters(e) { let t = []; for (const i of e) @@ -39150,14 +39150,14 @@ class XY { if (n && (t.push(n), n.startLineNumber !== n.endLineNumber)) return !1; } - t.sort(M.compareRangesUsingStarts), e.sort(M.compareRangesUsingStarts); + t.sort(I.compareRangesUsingStarts), e.sort(I.compareRangesUsingStarts); for (let i = 0; i < e.length; i++) if (i >= t.length || !t[i].strictContainsRange(e[i])) return !1; return !0; } } -class Ace { +class pae { static executeCommands(e, t, i) { const n = { model: e, @@ -39165,9 +39165,9 @@ class Ace { trackedRanges: [], trackedRangesDirection: [] }, o = this._innerExecuteCommands(n, i); - for (let r = 0, l = n.trackedRanges.length; r < l; r++) + for (let l = 0, r = n.trackedRanges.length; l < r; l++) n.model._setTrackedRange( - n.trackedRanges[r], + n.trackedRanges[l], null, 0 /* TrackedRangeStickiness.AlwaysGrowsWhenTypingAtEdges */ @@ -39183,35 +39183,35 @@ class Ace { const n = i.operations, o = this._getLoserCursorMap(n); if (o.hasOwnProperty("0")) return console.warn("Ignoring commands"), null; - const r = []; - for (let c = 0, d = n.length; c < d; c++) - o.hasOwnProperty(n[c].identifier.major.toString()) || r.push(n[c]); - i.hadTrackedEditOperation && r.length > 0 && (r[0]._isTracked = !0); - let l = e.model.pushEditOperations(e.selectionsBefore, r, (c) => { - const d = []; - for (let g = 0; g < e.selectionsBefore.length; g++) - d[g] = []; - for (const g of c) - g.identifier && d[g.identifier.major].push(g); - const h = (g, m) => g.identifier.minor - m.identifier.minor, u = []; - for (let g = 0; g < e.selectionsBefore.length; g++) - d[g].length > 0 ? (d[g].sort(h), u[g] = t[g].computeCursorState(e.model, { - getInverseEditOperations: () => d[g], - getTrackedSelection: (m) => { - const f = parseInt(m, 10), b = e.model._getTrackedRange(e.trackedRanges[f]); - return e.trackedRangesDirection[f] === 0 ? new fe(b.startLineNumber, b.startColumn, b.endLineNumber, b.endColumn) : new fe(b.endLineNumber, b.endColumn, b.startLineNumber, b.startColumn); + const l = []; + for (let d = 0, a = n.length; d < a; d++) + o.hasOwnProperty(n[d].identifier.major.toString()) || l.push(n[d]); + i.hadTrackedEditOperation && l.length > 0 && (l[0]._isTracked = !0); + let r = e.model.pushEditOperations(e.selectionsBefore, l, (d) => { + const a = []; + for (let m = 0; m < e.selectionsBefore.length; m++) + a[m] = []; + for (const m of d) + m.identifier && a[m.identifier.major].push(m); + const h = (m, b) => m.identifier.minor - b.identifier.minor, u = []; + for (let m = 0; m < e.selectionsBefore.length; m++) + a[m].length > 0 ? (a[m].sort(h), u[m] = t[m].computeCursorState(e.model, { + getInverseEditOperations: () => a[m], + getTrackedSelection: (b) => { + const g = parseInt(b, 10), Z = e.model._getTrackedRange(e.trackedRanges[g]); + return e.trackedRangesDirection[g] === 0 ? new ge(Z.startLineNumber, Z.startColumn, Z.endLineNumber, Z.endColumn) : new ge(Z.endLineNumber, Z.endColumn, Z.startLineNumber, Z.startColumn); } - })) : u[g] = e.selectionsBefore[g]; + })) : u[m] = e.selectionsBefore[m]; return u; }); - l || (l = e.selectionsBefore); - const a = []; - for (const c in o) - o.hasOwnProperty(c) && a.push(parseInt(c, 10)); - a.sort((c, d) => d - c); - for (const c of a) - l.splice(c, 1); - return l; + r || (r = e.selectionsBefore); + const c = []; + for (const d in o) + o.hasOwnProperty(d) && c.push(parseInt(d, 10)); + c.sort((d, a) => a - d); + for (const d of c) + r.splice(d, 1); + return r; } static _arrayIsEmpty(e) { for (let t = 0, i = e.length; t < i; t++) @@ -39221,11 +39221,11 @@ class Ace { } static _getEditOperations(e, t) { let i = [], n = !1; - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o]; - if (l) { - const a = this._getEditOperationsFromCommand(e, o, l); - i = i.concat(a.operations), n = n || a.hadTrackedEditOperation; + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o]; + if (r) { + const c = this._getEditOperationsFromCommand(e, o, r); + i = i.concat(c.operations), n = n || c.hadTrackedEditOperation; } } return { @@ -39236,86 +39236,86 @@ class Ace { static _getEditOperationsFromCommand(e, t, i) { const n = []; let o = 0; - const r = (h, u, g = !1) => { - M.isEmpty(h) && u === "" || n.push({ + const l = (h, u, m = !1) => { + I.isEmpty(h) && u === "" || n.push({ identifier: { major: t, minor: o++ }, range: h, text: u, - forceMoveMarkers: g, + forceMoveMarkers: m, isAutoWhitespaceEdit: i.insertsAutoWhitespace }); }; - let l = !1; - const d = { - addEditOperation: r, - addTrackedEditOperation: (h, u, g) => { - l = !0, r(h, u, g); + let r = !1; + const a = { + addEditOperation: l, + addTrackedEditOperation: (h, u, m) => { + r = !0, l(h, u, m); }, trackSelection: (h, u) => { - const g = fe.liftSelection(h); - let m; - if (g.isEmpty()) + const m = ge.liftSelection(h); + let b; + if (m.isEmpty()) if (typeof u == "boolean") - u ? m = 2 : m = 3; + u ? b = 2 : b = 3; else { - const y = e.model.getLineMaxColumn(g.startLineNumber); - g.startColumn === y ? m = 2 : m = 3; + const f = e.model.getLineMaxColumn(m.startLineNumber); + m.startColumn === f ? b = 2 : b = 3; } else - m = 1; - const f = e.trackedRanges.length, b = e.model._setTrackedRange(null, g, m); - return e.trackedRanges[f] = b, e.trackedRangesDirection[f] = g.getDirection(), f.toString(); + b = 1; + const g = e.trackedRanges.length, Z = e.model._setTrackedRange(null, m, b); + return e.trackedRanges[g] = Z, e.trackedRangesDirection[g] = m.getDirection(), g.toString(); } }; try { - i.getEditOperations(e.model, d); + i.getEditOperations(e.model, a); } catch (h) { - return De(h), { + return Me(h), { operations: [], hadTrackedEditOperation: !1 }; } return { operations: n, - hadTrackedEditOperation: l + hadTrackedEditOperation: r }; } static _getLoserCursorMap(e) { - e = e.slice(0), e.sort((i, n) => -M.compareRangesUsingEnds(i.range, n.range)); + e = e.slice(0), e.sort((i, n) => -I.compareRangesUsingEnds(i.range, n.range)); const t = {}; for (let i = 1; i < e.length; i++) { const n = e[i - 1], o = e[i]; - if (M.getStartPosition(n.range).isBefore(M.getEndPosition(o.range))) { - let r; - n.identifier.major > o.identifier.major ? r = n.identifier.major : r = o.identifier.major, t[r.toString()] = !0; - for (let l = 0; l < e.length; l++) - e[l].identifier.major === r && (e.splice(l, 1), l < i && i--, l--); + if (I.getStartPosition(n.range).isBefore(I.getEndPosition(o.range))) { + let l; + n.identifier.major > o.identifier.major ? l = n.identifier.major : l = o.identifier.major, t[l.toString()] = !0; + for (let r = 0; r < e.length; r++) + e[r].identifier.major === l && (e.splice(r, 1), r < i && i--, r--); i > 0 && i--; } } return t; } } -class xce { +class gae { constructor(e, t, i) { this.text = e, this.startSelection = t, this.endSelection = i; } } -class By { +class ty { static _capture(e, t) { const i = []; for (const n of t) { if (n.startLineNumber !== n.endLineNumber) return null; - i.push(new xce(e.getLineContent(n.startLineNumber), n.startColumn - 1, n.endColumn - 1)); + i.push(new gae(e.getLineContent(n.startLineNumber), n.startColumn - 1, n.endColumn - 1)); } return i; } constructor(e, t) { - this._original = By._capture(e, t); + this._original = ty._capture(e, t); } /** * Returns the inserted text during this composition. @@ -39324,98 +39324,98 @@ class By { deduceOutcome(e, t) { if (!this._original) return null; - const i = By._capture(e, t); + const i = ty._capture(e, t); if (!i || this._original.length !== i.length) return null; const n = []; - for (let o = 0, r = this._original.length; o < r; o++) - n.push(By._deduceOutcome(this._original[o], i[o])); + for (let o = 0, l = this._original.length; o < l; o++) + n.push(ty._deduceOutcome(this._original[o], i[o])); return n; } static _deduceOutcome(e, t) { - const i = Math.min(e.startSelection, t.startSelection, Ih(e.text, t.text)), n = Math.min(e.text.length - e.endSelection, t.text.length - t.endSelection, eA(e.text, t.text)), o = e.text.substring(i, e.text.length - n), r = t.text.substring(i, t.text.length - n); - return new ute(o, e.startSelection - i, e.endSelection - i, r, t.startSelection - i, t.endSelection - i); + const i = Math.min(e.startSelection, t.startSelection, Th(e.text, t.text)), n = Math.min(e.text.length - e.endSelection, t.text.length - t.endSelection, pV(e.text, t.text)), o = e.text.substring(i, e.text.length - n), l = t.text.substring(i, t.text.length - n); + return new sie(o, e.startSelection - i, e.endSelection - i, l, t.startSelection - i, t.endSelection - i); } } -const FY = { - getInitialState: () => h1, - tokenizeEncoded: (s, e, t) => hX(0, t) +const hz = { + getInitialState: () => VW, + tokenizeEncoded: (s, e, t) => vJ(0, t) }; -async function Mce(s, e, t) { +async function Zae(s, e, t) { if (!t) - return YY(e, s.languageIdCodec, FY); - const i = await Wi.getOrCreate(t); - return YY(e, s.languageIdCodec, i || FY); + return uz(e, s.languageIdCodec, hz); + const i = await Ti.getOrCreate(t); + return uz(e, s.languageIdCodec, i || hz); } -function Zce(s, e, t, i, n, o, r) { - let l = "
", a = i, c = 0, d = !0; +function fae(s, e, t, i, n, o, l) { + let r = "
", c = i, d = 0, a = !0; for (let h = 0, u = e.getCount(); h < u; h++) { - const g = e.getEndOffset(h); - if (g <= i) + const m = e.getEndOffset(h); + if (m <= i) continue; - let m = ""; - for (; a < g && a < n; a++) { - const f = s.charCodeAt(a); - switch (f) { + let b = ""; + for (; c < m && c < n; c++) { + const g = s.charCodeAt(c); + switch (g) { case 9: { - let b = o - (a + c) % o; - for (c += b - 1; b > 0; ) - r && d ? (m += " ", d = !1) : (m += " ", d = !0), b--; + let Z = o - (c + d) % o; + for (d += Z - 1; Z > 0; ) + l && a ? (b += " ", a = !1) : (b += " ", a = !0), Z--; break; } case 60: - m += "<", d = !1; + b += "<", a = !1; break; case 62: - m += ">", d = !1; + b += ">", a = !1; break; case 38: - m += "&", d = !1; + b += "&", a = !1; break; case 0: - m += "�", d = !1; + b += "�", a = !1; break; case 65279: case 8232: case 8233: case 133: - m += "�", d = !1; + b += "�", a = !1; break; case 13: - m += "​", d = !1; + b += "​", a = !1; break; case 32: - r && d ? (m += " ", d = !1) : (m += " ", d = !0); + l && a ? (b += " ", a = !1) : (b += " ", a = !0); break; default: - m += String.fromCharCode(f), d = !1; + b += String.fromCharCode(g), a = !1; } } - if (l += `${m}`, g > n || a >= n) + if (r += `${b}`, m > n || c >= n) break; } - return l += "
", l; + return r += "
", r; } -function YY(s, e, t) { +function uz(s, e, t) { let i = '
'; - const n = Fa(s); + const n = Kc(s); let o = t.getInitialState(); - for (let r = 0, l = n.length; r < l; r++) { - const a = n[r]; - r > 0 && (i += "
"); - const c = t.tokenizeEncoded(a, !0, o); - rn.convertToEndOffset(c.tokens, a.length); - const h = new rn(c.tokens, a, e).inflate(); + for (let l = 0, r = n.length; l < r; l++) { + const c = n[l]; + l > 0 && (i += "
"); + const d = t.tokenizeEncoded(c, !0, o); + rn.convertToEndOffset(d.tokens, c.length); + const h = new rn(d.tokens, c, e).inflate(); let u = 0; - for (let g = 0, m = h.getCount(); g < m; g++) { - const f = h.getClassName(g), b = h.getEndOffset(g); - i += `${_y(a.substring(u, b))}`, u = b; + for (let m = 0, b = h.getCount(); m < b; m++) { + const g = h.getClassName(m), Z = h.getEndOffset(m); + i += `${Hf(c.substring(u, Z))}`, u = Z; } - o = c.endState; + o = d.endState; } return i += "
", i; } -class _ce { +class yae { constructor() { this._hasPending = !1, this._inserts = [], this._changes = [], this._removes = []; } @@ -39438,15 +39438,15 @@ class _ce { this._hasPending = !1, this._inserts = [], this._changes = [], this._removes = [], e._commitPendingChanges(t, i, n); } } -class Ice { +class Wae { constructor(e, t, i, n, o) { this.id = e, this.afterLineNumber = t, this.ordinal = i, this.height = n, this.minWidth = o, this.prefixSum = 0; } } -var lh; -let Nce = (lh = class { +var hh; +let Gae = (hh = class { constructor(e, t, i, n) { - this._instanceId = zH(++lh.INSTANCE_COUNT), this._pendingChanges = new _ce(), this._lastWhitespaceId = 0, this._arr = [], this._prefixSumValidIndex = -1, this._minWidth = -1, this._lineCount = e, this._lineHeight = t, this._paddingTop = i, this._paddingBottom = n; + this._instanceId = LB(++hh.INSTANCE_COUNT), this._pendingChanges = new yae(), this._lastWhitespaceId = 0, this._arr = [], this._prefixSumValidIndex = -1, this._minWidth = -1, this._lineCount = e, this._lineHeight = t, this._paddingTop = i, this._paddingBottom = n; } /** * Find the insertion index for a new value inside a sorted array of values. @@ -39455,8 +39455,8 @@ let Nce = (lh = class { static findInsertionIndex(e, t, i) { let n = 0, o = e.length; for (; n < o; ) { - const r = n + o >>> 1; - t === e[r].afterLineNumber ? i < e[r].ordinal ? o = r : n = r + 1 : t < e[r].afterLineNumber ? o = r : n = r + 1; + const l = n + o >>> 1; + t === e[l].afterLineNumber ? i < e[l].ordinal ? o = l : n = l + 1 : t < e[l].afterLineNumber ? o = l : n = l + 1; } return n; } @@ -39484,13 +39484,13 @@ let Nce = (lh = class { let t = !1; try { e({ - insertWhitespace: (n, o, r, l) => { - t = !0, n = n | 0, o = o | 0, r = r | 0, l = l | 0; - const a = this._instanceId + ++this._lastWhitespaceId; - return this._pendingChanges.insert(new Ice(a, n, o, r, l)), a; + insertWhitespace: (n, o, l, r) => { + t = !0, n = n | 0, o = o | 0, l = l | 0, r = r | 0; + const c = this._instanceId + ++this._lastWhitespaceId; + return this._pendingChanges.insert(new Wae(c, n, o, l, r)), c; }, - changeOneWhitespace: (n, o, r) => { - t = !0, o = o | 0, r = r | 0, this._pendingChanges.change({ id: n, newAfterLineNumber: o, newHeight: r }); + changeOneWhitespace: (n, o, l) => { + t = !0, o = o | 0, l = l | 0, this._pendingChanges.change({ id: n, newAfterLineNumber: o, newHeight: l }); }, removeWhitespace: (n) => { t = !0, this._pendingChanges.remove({ id: n }); @@ -39503,41 +39503,41 @@ let Nce = (lh = class { } _commitPendingChanges(e, t, i) { if ((e.length > 0 || i.length > 0) && (this._minWidth = -1), e.length + t.length + i.length <= 1) { - for (const a of e) - this._insertWhitespace(a); - for (const a of t) - this._changeOneWhitespace(a.id, a.newAfterLineNumber, a.newHeight); - for (const a of i) { - const c = this._findWhitespaceIndex(a.id); - c !== -1 && this._removeWhitespace(c); + for (const c of e) + this._insertWhitespace(c); + for (const c of t) + this._changeOneWhitespace(c.id, c.newAfterLineNumber, c.newHeight); + for (const c of i) { + const d = this._findWhitespaceIndex(c.id); + d !== -1 && this._removeWhitespace(d); } return; } const n = /* @__PURE__ */ new Set(); - for (const a of i) - n.add(a.id); + for (const c of i) + n.add(c.id); const o = /* @__PURE__ */ new Map(); - for (const a of t) - o.set(a.id, a); - const r = (a) => { - const c = []; - for (const d of a) - if (!n.has(d.id)) { - if (o.has(d.id)) { - const h = o.get(d.id); - d.afterLineNumber = h.newAfterLineNumber, d.height = h.newHeight; + for (const c of t) + o.set(c.id, c); + const l = (c) => { + const d = []; + for (const a of c) + if (!n.has(a.id)) { + if (o.has(a.id)) { + const h = o.get(a.id); + a.afterLineNumber = h.newAfterLineNumber, a.height = h.newHeight; } - c.push(d); + d.push(a); } - return c; - }, l = r(this._arr).concat(r(e)); - l.sort((a, c) => a.afterLineNumber === c.afterLineNumber ? a.ordinal - c.ordinal : a.afterLineNumber - c.afterLineNumber), this._arr = l, this._prefixSumValidIndex = -1; + return d; + }, r = l(this._arr).concat(l(e)); + r.sort((c, d) => c.afterLineNumber === d.afterLineNumber ? c.ordinal - d.ordinal : c.afterLineNumber - d.afterLineNumber), this._arr = r, this._prefixSumValidIndex = -1; } _checkPendingChanges() { this._pendingChanges.mustCommit() && this._pendingChanges.commit(this); } _insertWhitespace(e) { - const t = lh.findInsertionIndex(this._arr, e.afterLineNumber, e.ordinal); + const t = hh.findInsertionIndex(this._arr, e.afterLineNumber, e.ordinal); this._arr.splice(t, 0, e), this._prefixSumValidIndex = Math.min(this._prefixSumValidIndex, t - 1); } _findWhitespaceIndex(e) { @@ -39629,13 +39629,13 @@ let Nce = (lh = class { const t = this._arr; let i = 0, n = t.length - 1; for (; i <= n; ) { - const r = (n - i | 0) / 2 | 0, l = i + r | 0; - if (t[l].afterLineNumber < e) { - if (l + 1 >= t.length || t[l + 1].afterLineNumber >= e) - return l; - i = l + 1 | 0; + const l = (n - i | 0) / 2 | 0, r = i + l | 0; + if (t[r].afterLineNumber < e) { + if (r + 1 >= t.length || t[r + 1].afterLineNumber >= e) + return r; + i = r + 1 | 0; } else - n = l - 1 | 0; + n = r - 1 | 0; } return -1; } @@ -39719,13 +39719,13 @@ let Nce = (lh = class { const t = this._lineCount | 0, i = this._lineHeight; let n = 1, o = t; for (; n < o; ) { - const r = (n + o) / 2 | 0, l = this.getVerticalOffsetForLineNumber(r) | 0; - if (e >= l + i) - n = r + 1; + const l = (n + o) / 2 | 0, r = this.getVerticalOffsetForLineNumber(l) | 0; + if (e >= r + i) + n = l + 1; else { - if (e >= l) - return r; - o = r; + if (e >= r) + return l; + o = l; } } return n > t ? t : n; @@ -39740,39 +39740,39 @@ let Nce = (lh = class { getLinesViewportData(e, t) { this._checkPendingChanges(), e = e | 0, t = t | 0; const i = this._lineHeight, n = this.getLineNumberAtOrAfterVerticalOffset(e) | 0, o = this.getVerticalOffsetForLineNumber(n) | 0; - let r = this._lineCount | 0, l = this.getFirstWhitespaceIndexAfterLineNumber(n) | 0; - const a = this.getWhitespacesCount() | 0; - let c, d; - l === -1 ? (l = a, d = r + 1, c = 0) : (d = this.getAfterLineNumberForWhitespaceIndex(l) | 0, c = this.getHeightForWhitespaceIndex(l) | 0); + let l = this._lineCount | 0, r = this.getFirstWhitespaceIndexAfterLineNumber(n) | 0; + const c = this.getWhitespacesCount() | 0; + let d, a; + r === -1 ? (r = c, a = l + 1, d = 0) : (a = this.getAfterLineNumberForWhitespaceIndex(r) | 0, d = this.getHeightForWhitespaceIndex(r) | 0); let h = o, u = h; - const g = 5e5; - let m = 0; - o >= g && (m = Math.floor(o / g) * g, m = Math.floor(m / i) * i, u -= m); - const f = [], b = e + (t - e) / 2; - let y = -1; - for (let L = n; L <= r; L++) { - if (y === -1) { - const x = h, Z = h + i; - (x <= b && b < Z || x > b) && (y = L); - } - for (h += i, f[L - n] = u, u += i; d === L; ) - u += c, h += c, l++, l >= a ? d = r + 1 : (d = this.getAfterLineNumberForWhitespaceIndex(l) | 0, c = this.getHeightForWhitespaceIndex(l) | 0); + const m = 5e5; + let b = 0; + o >= m && (b = Math.floor(o / m) * m, b = Math.floor(b / i) * i, u -= b); + const g = [], Z = e + (t - e) / 2; + let f = -1; + for (let X = n; X <= l; X++) { + if (f === -1) { + const L = h, S = h + i; + (L <= Z && Z < S || L > Z) && (f = X); + } + for (h += i, g[X - n] = u, u += i; a === X; ) + u += d, h += d, r++, r >= c ? a = l + 1 : (a = this.getAfterLineNumberForWhitespaceIndex(r) | 0, d = this.getHeightForWhitespaceIndex(r) | 0); if (h >= t) { - r = L; + l = X; break; } } - y === -1 && (y = r); - const w = this.getVerticalOffsetForLineNumber(r) | 0; - let C = n, S = r; - return C < S && o < e && C++, C < S && w + i > t && S--, { - bigNumbersDelta: m, + f === -1 && (f = l); + const y = this.getVerticalOffsetForLineNumber(l) | 0; + let W = n, G = l; + return W < G && o < e && W++, W < G && y + i > t && G--, { + bigNumbersDelta: b, startLineNumber: n, - endLineNumber: r, - relativeVerticalOffset: f, - centeredLineNumber: y, - completelyVisibleStartLineNumber: C, - completelyVisibleEndLineNumber: S, + endLineNumber: l, + relativeVerticalOffset: g, + centeredLineNumber: f, + completelyVisibleStartLineNumber: W, + completelyVisibleEndLineNumber: G, lineHeight: this._lineHeight }; } @@ -39793,13 +39793,13 @@ let Nce = (lh = class { if (e >= n + o) return -1; for (; t < i; ) { - const r = Math.floor((t + i) / 2), l = this.getVerticalOffsetForWhitespaceIndex(r), a = this.getHeightForWhitespaceIndex(r); - if (e >= l + a) - t = r + 1; + const l = Math.floor((t + i) / 2), r = this.getVerticalOffsetForWhitespaceIndex(l), c = this.getHeightForWhitespaceIndex(l); + if (e >= r + c) + t = l + 1; else { - if (e >= l) - return r; - i = r; + if (e >= r) + return l; + i = l; } } return t; @@ -39818,10 +39818,10 @@ let Nce = (lh = class { const i = this.getVerticalOffsetForWhitespaceIndex(t); if (i > e) return null; - const n = this.getHeightForWhitespaceIndex(t), o = this.getIdForWhitespaceIndex(t), r = this.getAfterLineNumberForWhitespaceIndex(t); + const n = this.getHeightForWhitespaceIndex(t), o = this.getIdForWhitespaceIndex(t), l = this.getAfterLineNumberForWhitespaceIndex(t); return { id: o, - afterLineNumber: r, + afterLineNumber: l, verticalOffset: i, height: n }; @@ -39839,15 +39839,15 @@ let Nce = (lh = class { if (i < 0) return []; const o = []; - for (let r = i; r <= n; r++) { - const l = this.getVerticalOffsetForWhitespaceIndex(r), a = this.getHeightForWhitespaceIndex(r); - if (l >= t) + for (let l = i; l <= n; l++) { + const r = this.getVerticalOffsetForWhitespaceIndex(l), c = this.getHeightForWhitespaceIndex(l); + if (r >= t) break; o.push({ - id: this.getIdForWhitespaceIndex(r), - afterLineNumber: this.getAfterLineNumberForWhitespaceIndex(r), - verticalOffset: l, - height: a + id: this.getIdForWhitespaceIndex(l), + afterLineNumber: this.getAfterLineNumberForWhitespaceIndex(l), + verticalOffset: r, + height: c }); } return o; @@ -39891,9 +39891,9 @@ let Nce = (lh = class { getHeightForWhitespaceIndex(e) { return this._checkPendingChanges(), e = e | 0, this._arr[e].height; } -}, lh.INSTANCE_COUNT = 0, lh); -const Wce = 125; -class cy { +}, hh.INSTANCE_COUNT = 0, hh); +const Xae = 125; +class yf { constructor(e, t, i, n) { e = e | 0, t = t | 0, i = i | 0, n = n | 0, e < 0 && (e = 0), t < 0 && (t = 0), i < 0 && (i = 0), n < 0 && (n = 0), this.width = e, this.contentWidth = t, this.scrollWidth = Math.max(e, t), this.height = i, this.contentHeight = n, this.scrollHeight = Math.max(i, n); } @@ -39901,9 +39901,9 @@ class cy { return this.width === e.width && this.contentWidth === e.contentWidth && this.height === e.height && this.contentHeight === e.contentHeight; } } -class vce extends R { +class Vae extends J { constructor(e, t) { - super(), this._onDidContentSizeChange = this._register(new k()), this.onDidContentSizeChange = this._onDidContentSizeChange.event, this._dimensions = new cy(0, 0, 0, 0), this._scrollable = this._register(new o0({ + super(), this._onDidContentSizeChange = this._register(new k()), this.onDidContentSizeChange = this._onDidContentSizeChange.event, this._dimensions = new yf(0, 0, 0, 0), this._scrollable = this._register(new h0({ forceIntegerValues: !0, smoothScrollDuration: e, scheduleAtNextAnimationFrame: t @@ -39932,7 +39932,7 @@ class vce extends R { scrollHeight: e.scrollHeight }, !0); const i = t.contentWidth !== e.contentWidth, n = t.contentHeight !== e.contentHeight; - (i || n) && this._onDidContentSizeChange.fire(new pX(t.contentWidth, t.contentHeight, e.contentWidth, e.contentHeight)); + (i || n) && this._onDidContentSizeChange.fire(new DJ(t.contentWidth, t.contentHeight, e.contentWidth, e.contentHeight)); } getFutureScrollPosition() { return this._scrollable.getFutureScrollPosition(); @@ -39950,20 +39950,20 @@ class vce extends R { return this._scrollable.hasPendingScrollAnimation(); } } -class Tce extends R { +class Lae extends J { constructor(e, t, i) { super(), this._configuration = e; const n = this._configuration.options, o = n.get( 146 /* EditorOption.layoutInfo */ - ), r = n.get( + ), l = n.get( 84 /* EditorOption.padding */ ); - this._linesLayout = new Nce(t, n.get( + this._linesLayout = new Gae(t, n.get( 67 /* EditorOption.lineHeight */ - ), r.top, r.bottom), this._maxLineWidth = 0, this._overlayWidgetsMinWidth = 0, this._scrollable = this._register(new vce(0, i)), this._configureSmoothScrollDuration(), this._scrollable.setScrollDimensions(new cy(o.contentWidth, 0, o.height, 0)), this.onDidScroll = this._scrollable.onDidScroll, this.onDidContentSizeChange = this._scrollable.onDidContentSizeChange, this._updateHeight(); + ), l.top, l.bottom), this._maxLineWidth = 0, this._overlayWidgetsMinWidth = 0, this._scrollable = this._register(new Vae(0, i)), this._configureSmoothScrollDuration(), this._scrollable.setScrollDimensions(new yf(o.contentWidth, 0, o.height, 0)), this.onDidScroll = this._scrollable.onDidScroll, this.onDidContentSizeChange = this._scrollable.onDidContentSizeChange, this._updateHeight(); } dispose() { super.dispose(); @@ -39978,7 +39978,7 @@ class Tce extends R { this._scrollable.setSmoothScrollDuration(this._configuration.options.get( 115 /* EditorOption.smoothScrolling */ - ) ? Wce : 0); + ) ? Xae : 0); } // ---- begin view event handlers onConfigurationChanged(e) { @@ -40006,8 +40006,8 @@ class Tce extends R { const i = t.get( 146 /* EditorOption.layoutInfo */ - ), n = i.contentWidth, o = i.height, r = this._scrollable.getScrollDimensions(), l = r.contentWidth; - this._scrollable.setScrollDimensions(new cy(n, r.contentWidth, o, this._getContentHeight(n, o, l))); + ), n = i.contentWidth, o = i.height, l = this._scrollable.getScrollDimensions(), r = l.contentWidth; + this._scrollable.setScrollDimensions(new yf(n, l.contentWidth, o, this._getContentHeight(n, o, r))); } else this._updateHeight(); e.hasChanged( @@ -40051,16 +40051,16 @@ class Tce extends R { } _updateHeight() { const e = this._scrollable.getScrollDimensions(), t = e.width, i = e.height, n = e.contentWidth; - this._scrollable.setScrollDimensions(new cy(t, e.contentWidth, i, this._getContentHeight(t, i, n))); + this._scrollable.setScrollDimensions(new yf(t, e.contentWidth, i, this._getContentHeight(t, i, n))); } // ---- Layouting logic getCurrentViewport() { const e = this._scrollable.getScrollDimensions(), t = this._scrollable.getCurrentScrollPosition(); - return new $F(t.scrollTop, t.scrollLeft, e.width, e.height); + return new LF(t.scrollTop, t.scrollLeft, e.width, e.height); } getFutureViewport() { const e = this._scrollable.getScrollDimensions(), t = this._scrollable.getFutureScrollPosition(); - return new $F(t.scrollTop, t.scrollLeft, e.width, e.height); + return new LF(t.scrollTop, t.scrollLeft, e.width, e.height); } _computeContentWidth() { const e = this._configuration.options, t = this._maxLineWidth, i = e.get( @@ -40074,17 +40074,17 @@ class Tce extends R { /* EditorOption.layoutInfo */ ); if (i.isViewportWrapping) { - const r = e.get( + const l = e.get( 73 /* EditorOption.minimap */ ); - return t > o.contentWidth + n.typicalHalfwidthCharacterWidth && r.enabled && r.side === "right" ? t + o.verticalScrollbarWidth : t; + return t > o.contentWidth + n.typicalHalfwidthCharacterWidth && l.enabled && l.side === "right" ? t + o.verticalScrollbarWidth : t; } else { - const r = e.get( + const l = e.get( 105 /* EditorOption.scrollBeyondLastColumn */ - ) * n.typicalHalfwidthCharacterWidth, l = this._linesLayout.getWhitespaceMinWidth(); - return Math.max(t + r + o.verticalScrollbarWidth, l, this._overlayWidgetsMinWidth); + ) * n.typicalHalfwidthCharacterWidth, r = this._linesLayout.getWhitespaceMinWidth(); + return Math.max(t + l + o.verticalScrollbarWidth, r, this._overlayWidgetsMinWidth); } } setMaxLineWidth(e) { @@ -40095,7 +40095,7 @@ class Tce extends R { } _updateContentWidth() { const e = this._scrollable.getScrollDimensions(); - this._scrollable.setScrollDimensions(new cy(e.width, this._computeContentWidth(), e.height, e.contentHeight)), this._updateHeight(); + this._scrollable.setScrollDimensions(new yf(e.width, this._computeContentWidth(), e.height, e.contentHeight)), this._updateHeight(); } // ---- view state saveState() { @@ -40183,7 +40183,7 @@ class Tce extends R { }); } } -class Dce { +class Iae { constructor(e, t, i, n, o) { this.editorId = e, this.model = t, this.configuration = i, this._linesCollection = n, this._coordinatesConverter = o, this._decorationsCache = /* @__PURE__ */ Object.create(null), this._cachedModelDecorationsResolver = null, this._cachedModelDecorationsResolverViewRange = null; } @@ -40207,21 +40207,21 @@ class Dce { let i = this._decorationsCache[t]; if (!i) { const n = e.range, o = e.options; - let r; + let l; if (o.isWholeLine) { - const l = this._coordinatesConverter.convertModelPositionToViewPosition(new V(n.startLineNumber, 1), 0, !1, !0), a = this._coordinatesConverter.convertModelPositionToViewPosition( - new V(n.endLineNumber, this.model.getLineMaxColumn(n.endLineNumber)), + const r = this._coordinatesConverter.convertModelPositionToViewPosition(new Y(n.startLineNumber, 1), 0, !1, !0), c = this._coordinatesConverter.convertModelPositionToViewPosition( + new Y(n.endLineNumber, this.model.getLineMaxColumn(n.endLineNumber)), 1 /* PositionAffinity.Right */ ); - r = new M(l.lineNumber, l.column, a.lineNumber, a.column); + l = new I(r.lineNumber, r.column, c.lineNumber, c.column); } else - r = this._coordinatesConverter.convertModelRangeToViewRange( + l = this._coordinatesConverter.convertModelRangeToViewRange( n, 1 /* PositionAffinity.Right */ ); - i = new zU(r, o), this._decorationsCache[t] = i; + i = new LQ(l, o), this._decorationsCache[t] = i; } return i; } @@ -40233,90 +40233,90 @@ class Dce { return t = t && e.equalsRange(this._cachedModelDecorationsResolverViewRange), t || (this._cachedModelDecorationsResolver = this._getDecorationsInRange(e, !1, !1), this._cachedModelDecorationsResolverViewRange = e), this._cachedModelDecorationsResolver; } getInlineDecorationsOnLine(e, t = !1, i = !1) { - const n = new M(e, this._linesCollection.getViewLineMinColumn(e), e, this._linesCollection.getViewLineMaxColumn(e)); + const n = new I(e, this._linesCollection.getViewLineMinColumn(e), e, this._linesCollection.getViewLineMaxColumn(e)); return this._getDecorationsInRange(n, t, i).inlineDecorations[0]; } _getDecorationsInRange(e, t, i) { - const n = this._linesCollection.getDecorationsInRange(e, this.editorId, xA(this.configuration.options), t, i), o = e.startLineNumber, r = e.endLineNumber, l = []; - let a = 0; - const c = []; - for (let d = o; d <= r; d++) - c[d - o] = []; - for (let d = 0, h = n.length; d < h; d++) { - const u = n[d], g = u.options; - if (!yX(this.model, u)) + const n = this._linesCollection.getDecorationsInRange(e, this.editorId, EV(this.configuration.options), t, i), o = e.startLineNumber, l = e.endLineNumber, r = []; + let c = 0; + const d = []; + for (let a = o; a <= l; a++) + d[a - o] = []; + for (let a = 0, h = n.length; a < h; a++) { + const u = n[a], m = u.options; + if (!AJ(this.model, u)) continue; - const m = this._getOrCreateViewModelDecoration(u), f = m.range; - if (l[a++] = m, g.inlineClassName) { - const b = new Dy( - f, - g.inlineClassName, - g.inlineClassNameAffectsLetterSpacing ? 3 : 0 + const b = this._getOrCreateViewModelDecoration(u), g = b.range; + if (r[c++] = b, m.inlineClassName) { + const Z = new Kf( + g, + m.inlineClassName, + m.inlineClassNameAffectsLetterSpacing ? 3 : 0 /* InlineDecorationType.Regular */ - ), y = Math.max(o, f.startLineNumber), w = Math.min(r, f.endLineNumber); - for (let C = y; C <= w; C++) - c[C - o].push(b); - } - if (g.beforeContentClassName && o <= f.startLineNumber && f.startLineNumber <= r) { - const b = new Dy( - new M(f.startLineNumber, f.startColumn, f.startLineNumber, f.startColumn), - g.beforeContentClassName, + ), f = Math.max(o, g.startLineNumber), y = Math.min(l, g.endLineNumber); + for (let W = f; W <= y; W++) + d[W - o].push(Z); + } + if (m.beforeContentClassName && o <= g.startLineNumber && g.startLineNumber <= l) { + const Z = new Kf( + new I(g.startLineNumber, g.startColumn, g.startLineNumber, g.startColumn), + m.beforeContentClassName, 1 /* InlineDecorationType.Before */ ); - c[f.startLineNumber - o].push(b); + d[g.startLineNumber - o].push(Z); } - if (g.afterContentClassName && o <= f.endLineNumber && f.endLineNumber <= r) { - const b = new Dy( - new M(f.endLineNumber, f.endColumn, f.endLineNumber, f.endColumn), - g.afterContentClassName, + if (m.afterContentClassName && o <= g.endLineNumber && g.endLineNumber <= l) { + const Z = new Kf( + new I(g.endLineNumber, g.endColumn, g.endLineNumber, g.endColumn), + m.afterContentClassName, 2 /* InlineDecorationType.After */ ); - c[f.endLineNumber - o].push(b); + d[g.endLineNumber - o].push(Z); } } return { - decorations: l, - inlineDecorations: c + decorations: r, + inlineDecorations: d }; } } -function yX(s, e) { - return !(e.options.hideInCommentTokens && wX(s, e) || e.options.hideInStringTokens && CX(s, e)); +function AJ(s, e) { + return !(e.options.hideInCommentTokens && KJ(s, e) || e.options.hideInStringTokens && UJ(s, e)); } -function wX(s, e) { - return yK( +function KJ(s, e) { + return eO( s, e.range, (t) => t === 1 /* StandardTokenType.Comment */ ); } -function CX(s, e) { - return yK( +function UJ(s, e) { + return eO( s, e.range, (t) => t === 2 /* StandardTokenType.String */ ); } -function yK(s, e, t) { +function eO(s, e, t) { for (let i = e.startLineNumber; i <= e.endLineNumber; i++) { - const n = s.tokenization.getLineTokens(i), o = i === e.startLineNumber, r = i === e.endLineNumber; - let l = o ? n.findTokenIndexAtOffset(e.startColumn - 1) : 0; - for (; l < n.getCount() && !(r && n.getStartOffset(l) > e.endColumn - 1); ) { - if (!t(n.getStandardTokenType(l))) + const n = s.tokenization.getLineTokens(i), o = i === e.startLineNumber, l = i === e.endLineNumber; + let r = o ? n.findTokenIndexAtOffset(e.startColumn - 1) : 0; + for (; r < n.getCount() && !(l && n.getStartOffset(r) > e.endColumn - 1); ) { + if (!t(n.getStandardTokenType(r))) return !1; - l++; + r++; } } return !0; } -function oW(s, e) { - return s === null ? e ? HA.INSTANCE : JA.INSTANCE : new Vce(s, e); +function GR(s, e) { + return s === null ? e ? rL.INSTANCE : cL.INSTANCE : new Sae(s, e); } -class Vce { +class Sae { constructor(e, t) { this._projectionData = e, this._isVisible = t; } @@ -40335,18 +40335,18 @@ class Vce { getViewLineContent(e, t, i) { this._assertVisible(); const n = i > 0 ? this._projectionData.breakOffsets[i - 1] : 0, o = this._projectionData.breakOffsets[i]; - let r; + let l; if (this._projectionData.injectionOffsets !== null) { - const l = this._projectionData.injectionOffsets.map((c, d) => new Dl(0, 0, c + 1, this._projectionData.injectionOptions[d], 0)); - r = Dl.applyInjectedText(e.getLineContent(t), l).substring(n, o); + const r = this._projectionData.injectionOffsets.map((d, a) => new Jr(0, 0, d + 1, this._projectionData.injectionOptions[a], 0)); + l = Jr.applyInjectedText(e.getLineContent(t), r).substring(n, o); } else - r = e.getValueInRange({ + l = e.getValueInRange({ startLineNumber: t, startColumn: n + 1, endLineNumber: t, endColumn: o + 1 }); - return i > 0 && (r = zY(this._projectionData.wrappedTextIndentLength) + r), r; + return i > 0 && (l = mz(this._projectionData.wrappedTextIndentLength) + l), l; } getViewLineLength(e, t, i) { return this._assertVisible(), this._projectionData.getLineLength(i); @@ -40364,57 +40364,57 @@ class Vce { const n = new Array(); return this.getViewLinesData(e, t, i, 1, 0, [!0], n), n[0]; } - getViewLinesData(e, t, i, n, o, r, l) { + getViewLinesData(e, t, i, n, o, l, r) { this._assertVisible(); - const a = this._projectionData, c = a.injectionOffsets, d = a.injectionOptions; + const c = this._projectionData, d = c.injectionOffsets, a = c.injectionOptions; let h = null; - if (c) { + if (d) { h = []; - let g = 0, m = 0; - for (let f = 0; f < a.getOutputLineCount(); f++) { - const b = new Array(); - h[f] = b; - const y = f > 0 ? a.breakOffsets[f - 1] : 0, w = a.breakOffsets[f]; - for (; m < c.length; ) { - const C = d[m].content.length, S = c[m] + g, L = S + C; - if (S > w) + let m = 0, b = 0; + for (let g = 0; g < c.getOutputLineCount(); g++) { + const Z = new Array(); + h[g] = Z; + const f = g > 0 ? c.breakOffsets[g - 1] : 0, y = c.breakOffsets[g]; + for (; b < d.length; ) { + const W = a[b].content.length, G = d[b] + m, X = G + W; + if (G > y) break; - if (y < L) { - const x = d[m]; - if (x.inlineClassName) { - const Z = f > 0 ? a.wrappedTextIndentLength : 0, _ = Z + Math.max(S - y, 0), v = Z + Math.min(L - y, w - y); - _ !== v && b.push(new zre(_, v, x.inlineClassName, x.inlineClassNameAffectsLetterSpacing)); + if (f < X) { + const L = a[b]; + if (L.inlineClassName) { + const S = g > 0 ? c.wrappedTextIndentLength : 0, x = S + Math.max(G - f, 0), w = S + Math.min(X - f, y - f); + x !== w && Z.push(new Yre(x, w, L.inlineClassName, L.inlineClassNameAffectsLetterSpacing)); } } - if (L <= w) - g += C, m++; + if (X <= y) + m += W, b++; else break; } } } let u; - c ? u = e.tokenization.getLineTokens(t).withInserted(c.map((g, m) => ({ - offset: g, - text: d[m].content, + d ? u = e.tokenization.getLineTokens(t).withInserted(d.map((m, b) => ({ + offset: m, + text: a[b].content, tokenMetadata: rn.defaultTokenMetadata }))) : u = e.tokenization.getLineTokens(t); - for (let g = i; g < i + n; g++) { - const m = o + g - i; - if (!r[m]) { - l[m] = null; + for (let m = i; m < i + n; m++) { + const b = o + m - i; + if (!l[b]) { + r[b] = null; continue; } - l[m] = this._getViewLineData(u, h ? h[g] : null, g); + r[b] = this._getViewLineData(u, h ? h[m] : null, m); } } _getViewLineData(e, t, i) { this._assertVisible(); - const n = this._projectionData, o = i > 0 ? n.wrappedTextIndentLength : 0, r = i > 0 ? n.breakOffsets[i - 1] : 0, l = n.breakOffsets[i], a = e.sliceAndInflate(r, l, o); - let c = a.getLineContent(); - i > 0 && (c = zY(n.wrappedTextIndentLength) + c); - const d = this._projectionData.getMinOutputOffset(i) + 1, h = c.length + 1, u = i + 1 < this.getViewLineCount(), g = i === 0 ? 0 : n.breakOffsetsVisibleColumn[i - 1]; - return new qE(c, u, d, h, g, a, t); + const n = this._projectionData, o = i > 0 ? n.wrappedTextIndentLength : 0, l = i > 0 ? n.breakOffsets[i - 1] : 0, r = n.breakOffsets[i], c = e.sliceAndInflate(l, r, o); + let d = c.getLineContent(); + i > 0 && (d = mz(n.wrappedTextIndentLength) + d); + const a = this._projectionData.getMinOutputOffset(i) + 1, h = d.length + 1, u = i + 1 < this.getViewLineCount(), m = i === 0 ? 0 : n.breakOffsetsVisibleColumn[i - 1]; + return new VJ(d, u, a, h, m, c, t); } getModelColumnOfViewPosition(e, t) { return this._assertVisible(), this._projectionData.translateToInputOffset(e, t - 1) + 1; @@ -40439,14 +40439,14 @@ class Vce { throw new Error("Not supported"); } } -const fZ = class fZ { +const w2 = class w2 { constructor() { } isVisible() { return !0; } setVisible(e) { - return e ? this : JA.INSTANCE; + return e ? this : cL.INSTANCE; } getProjectionData() { return null; @@ -40468,20 +40468,20 @@ const fZ = class fZ { } getViewLineData(e, t, i) { const n = e.tokenization.getLineTokens(t), o = n.getLineContent(); - return new qE(o, !1, 1, o.length + 1, 0, n.inflate(), null); + return new VJ(o, !1, 1, o.length + 1, 0, n.inflate(), null); } - getViewLinesData(e, t, i, n, o, r, l) { - if (!r[o]) { - l[o] = null; + getViewLinesData(e, t, i, n, o, l, r) { + if (!l[o]) { + r[o] = null; return; } - l[o] = this.getViewLineData(e, t, 0); + r[o] = this.getViewLineData(e, t, 0); } getModelColumnOfViewPosition(e, t) { return t; } getViewPositionOfModelPosition(e, t) { - return new V(e, t); + return new Y(e, t); } getViewLineNumberOfModelPosition(e, t) { return e; @@ -40493,16 +40493,16 @@ const fZ = class fZ { return null; } }; -fZ.INSTANCE = new fZ(); -let HA = fZ; -const bZ = class bZ { +w2.INSTANCE = new w2(); +let rL = w2; +const T2 = class T2 { constructor() { } isVisible() { return !1; } setVisible(e) { - return e ? HA.INSTANCE : this; + return e ? rL.INSTANCE : this; } getProjectionData() { return null; @@ -40525,7 +40525,7 @@ const bZ = class bZ { getViewLineData(e, t, i) { throw new Error("Not supported"); } - getViewLinesData(e, t, i, n, o, r, l) { + getViewLinesData(e, t, i, n, o, l, r) { throw new Error("Not supported"); } getModelColumnOfViewPosition(e, t) { @@ -40544,32 +40544,32 @@ const bZ = class bZ { throw new Error("Not supported"); } }; -bZ.INSTANCE = new bZ(); -let JA = bZ; -const rW = [""]; -function zY(s) { - if (s >= rW.length) +T2.INSTANCE = new T2(); +let cL = T2; +const XR = [""]; +function mz(s) { + if (s >= XR.length) for (let e = 1; e <= s; e++) - rW[e] = kce(e); - return rW[s]; + XR[e] = xae(e); + return XR[s]; } -function kce(s) { +function xae(s) { return new Array(s + 1).join(" "); } -class Gce { +class Cae { constructor(e) { this.values = e, this.prefixSum = new Uint32Array(e.length), this.prefixSumValidIndex = new Int32Array(1), this.prefixSumValidIndex[0] = -1; } insertValues(e, t) { - e = sp(e); + e = dp(e); const i = this.values, n = this.prefixSum, o = t.length; return o === 0 ? !1 : (this.values = new Uint32Array(i.length + o), this.values.set(i.subarray(0, e), 0), this.values.set(i.subarray(e), e + o), this.values.set(t, e), e - 1 < this.prefixSumValidIndex[0] && (this.prefixSumValidIndex[0] = e - 1), this.prefixSum = new Uint32Array(this.values.length), this.prefixSumValidIndex[0] >= 0 && this.prefixSum.set(n.subarray(0, this.prefixSumValidIndex[0] + 1)), !0); } setValue(e, t) { - return e = sp(e), t = sp(t), this.values[e] === t ? !1 : (this.values[e] = t, e - 1 < this.prefixSumValidIndex[0] && (this.prefixSumValidIndex[0] = e - 1), !0); + return e = dp(e), t = dp(t), this.values[e] === t ? !1 : (this.values[e] = t, e - 1 < this.prefixSumValidIndex[0] && (this.prefixSumValidIndex[0] = e - 1), !0); } removeValues(e, t) { - e = sp(e), t = sp(t); + e = dp(e), t = dp(t); const i = this.values, n = this.prefixSum; if (e >= i.length) return !1; @@ -40584,7 +40584,7 @@ class Gce { * @returns `SUM(0 <= j <= index, values[j])`. */ getPrefixSum(e) { - return e < 0 ? 0 : (e = sp(e), this._getPrefixSum(e)); + return e < 0 ? 0 : (e = dp(e), this._getPrefixSum(e)); } _getPrefixSum(e) { if (e <= this.prefixSumValidIndex[0]) @@ -40597,18 +40597,18 @@ class Gce { } getIndexOf(e) { e = Math.floor(e), this.getTotalSum(); - let t = 0, i = this.values.length - 1, n = 0, o = 0, r = 0; + let t = 0, i = this.values.length - 1, n = 0, o = 0, l = 0; for (; t <= i; ) - if (n = t + (i - t) / 2 | 0, o = this.prefixSum[n], r = o - this.values[n], e < r) + if (n = t + (i - t) / 2 | 0, o = this.prefixSum[n], l = o - this.values[n], e < l) i = n - 1; else if (e >= o) t = n + 1; else break; - return new wK(n, e - r); + return new tO(n, e - l); } } -class Rce { +class Rae { constructor(e) { this._values = e, this._isValid = !1, this._validEndIndex = -1, this._prefixSum = [], this._indexBySum = []; } @@ -40631,13 +40631,13 @@ class Rce { getIndexOf(e) { this._ensureValid(); const t = this._indexBySum[e], i = t > 0 ? this._prefixSum[t - 1] : 0; - return new wK(t, e - i); + return new tO(t, e - i); } removeValues(e, t) { this._values.splice(e, t), this._invalidate(e); } insertValues(e, t) { - this._values = J_(this._values, e, t), this._invalidate(e); + this._values = cx(this._values, e, t), this._invalidate(e); } _invalidate(e) { this._isValid = !1, this._validEndIndex = Math.min(this._validEndIndex, e - 1); @@ -40657,14 +40657,14 @@ class Rce { this._values[e] !== t && (this._values[e] = t, this._invalidate(e)); } } -class wK { +class tO { constructor(e, t) { this.index = e, this.remainder = t, this._prefixSumIndexOfResultBrand = void 0, this.index = e, this.remainder = t; } } -class Ece { - constructor(e, t, i, n, o, r, l, a, c, d) { - this._editorId = e, this.model = t, this._validModelVersionId = -1, this._domLineBreaksComputerFactory = i, this._monospaceLineBreaksComputerFactory = n, this.fontInfo = o, this.tabSize = r, this.wrappingStrategy = l, this.wrappingColumn = a, this.wrappingIndent = c, this.wordBreak = d, this._constructLines( +class Nae { + constructor(e, t, i, n, o, l, r, c, d, a) { + this._editorId = e, this.model = t, this._validModelVersionId = -1, this._domLineBreaksComputerFactory = i, this._monospaceLineBreaksComputerFactory = n, this.fontInfo = o, this.tabSize = l, this.wrappingStrategy = r, this.wrappingColumn = c, this.wrappingIndent = d, this.wordBreak = a, this._constructLines( /*resetHiddenAreas*/ !0, null @@ -40674,34 +40674,34 @@ class Ece { this.hiddenAreasDecorationIds = this.model.deltaDecorations(this.hiddenAreasDecorationIds, []); } createCoordinatesConverter() { - return new Fce(this); + return new Tae(this); } _constructLines(e, t) { this.modelLineProjections = [], e && (this.hiddenAreasDecorationIds = this.model.deltaDecorations(this.hiddenAreasDecorationIds, [])); - const i = this.model.getLinesContent(), n = this.model.getInjectedTextDecorations(this._editorId), o = i.length, r = this.createLineBreaksComputer(), l = new Hc(Dl.fromDecorations(n)); - for (let f = 0; f < o; f++) { - const b = l.takeWhile((y) => y.lineNumber === f + 1); - r.addRequest(i[f], b, t ? t[f] : null); + const i = this.model.getLinesContent(), n = this.model.getInjectedTextDecorations(this._editorId), o = i.length, l = this.createLineBreaksComputer(), r = new Od(Jr.fromDecorations(n)); + for (let g = 0; g < o; g++) { + const Z = r.takeWhile((f) => f.lineNumber === g + 1); + l.addRequest(i[g], Z, t ? t[g] : null); } - const a = r.finalize(), c = [], d = this.hiddenAreasDecorationIds.map((f) => this.model.getDecorationRange(f)).sort(M.compareRangesUsingStarts); - let h = 1, u = 0, g = -1, m = g + 1 < d.length ? u + 1 : o + 2; - for (let f = 0; f < o; f++) { - const b = f + 1; - b === m && (g++, h = d[g].startLineNumber, u = d[g].endLineNumber, m = g + 1 < d.length ? u + 1 : o + 2); - const y = b >= h && b <= u, w = oW(a[f], !y); - c[f] = w.getViewLineCount(), this.modelLineProjections[f] = w; + const c = l.finalize(), d = [], a = this.hiddenAreasDecorationIds.map((g) => this.model.getDecorationRange(g)).sort(I.compareRangesUsingStarts); + let h = 1, u = 0, m = -1, b = m + 1 < a.length ? u + 1 : o + 2; + for (let g = 0; g < o; g++) { + const Z = g + 1; + Z === b && (m++, h = a[m].startLineNumber, u = a[m].endLineNumber, b = m + 1 < a.length ? u + 1 : o + 2); + const f = Z >= h && Z <= u, y = GR(c[g], !f); + d[g] = y.getViewLineCount(), this.modelLineProjections[g] = y; } - this._validModelVersionId = this.model.getVersionId(), this.projectedModelLineLineCounts = new Rce(c); + this._validModelVersionId = this.model.getVersionId(), this.projectedModelLineLineCounts = new Rae(d); } getHiddenAreas() { return this.hiddenAreasDecorationIds.map((e) => this.model.getDecorationRange(e)); } setHiddenAreas(e) { - const t = e.map((u) => this.model.validateRange(u)), i = Xce(t), n = this.hiddenAreasDecorationIds.map((u) => this.model.getDecorationRange(u)).sort(M.compareRangesUsingStarts); + const t = e.map((u) => this.model.validateRange(u)), i = wae(t), n = this.hiddenAreasDecorationIds.map((u) => this.model.getDecorationRange(u)).sort(I.compareRangesUsingStarts); if (i.length === n.length) { let u = !1; - for (let g = 0; g < i.length; g++) - if (!i[g].equalsRange(n[g])) { + for (let m = 0; m < i.length; m++) + if (!i[m].equalsRange(n[m])) { u = !0; break; } @@ -40710,18 +40710,18 @@ class Ece { } const o = i.map((u) => ({ range: u, - options: Re.EMPTY + options: Je.EMPTY })); this.hiddenAreasDecorationIds = this.model.deltaDecorations(this.hiddenAreasDecorationIds, o); - const r = i; - let l = 1, a = 0, c = -1, d = c + 1 < r.length ? a + 1 : this.modelLineProjections.length + 2, h = !1; + const l = i; + let r = 1, c = 0, d = -1, a = d + 1 < l.length ? c + 1 : this.modelLineProjections.length + 2, h = !1; for (let u = 0; u < this.modelLineProjections.length; u++) { - const g = u + 1; - g === d && (c++, l = r[c].startLineNumber, a = r[c].endLineNumber, d = c + 1 < r.length ? a + 1 : this.modelLineProjections.length + 2); - let m = !1; - if (g >= l && g <= a ? this.modelLineProjections[u].isVisible() && (this.modelLineProjections[u] = this.modelLineProjections[u].setVisible(!1), m = !0) : (h = !0, this.modelLineProjections[u].isVisible() || (this.modelLineProjections[u] = this.modelLineProjections[u].setVisible(!0), m = !0)), m) { - const f = this.modelLineProjections[u].getViewLineCount(); - this.projectedModelLineLineCounts.setValue(u, f); + const m = u + 1; + m === a && (d++, r = l[d].startLineNumber, c = l[d].endLineNumber, a = d + 1 < l.length ? c + 1 : this.modelLineProjections.length + 2); + let b = !1; + if (m >= r && m <= c ? this.modelLineProjections[u].isVisible() && (this.modelLineProjections[u] = this.modelLineProjections[u].setVisible(!1), b = !0) : (h = !0, this.modelLineProjections[u].isVisible() || (this.modelLineProjections[u] = this.modelLineProjections[u].setVisible(!0), b = !0)), b) { + const g = this.modelLineProjections[u].getViewLineCount(); + this.projectedModelLineLineCounts.setValue(u, g); } } return h || this.setHiddenAreas([]), !0; @@ -40740,16 +40740,16 @@ class Ece { ), !0); } setWrappingSettings(e, t, i, n, o) { - const r = this.fontInfo.equals(e), l = this.wrappingStrategy === t, a = this.wrappingColumn === i, c = this.wrappingIndent === n, d = this.wordBreak === o; - if (r && l && a && c && d) + const l = this.fontInfo.equals(e), r = this.wrappingStrategy === t, c = this.wrappingColumn === i, d = this.wrappingIndent === n, a = this.wordBreak === o; + if (l && r && c && d && a) return !1; - const h = r && l && !a && c && d; + const h = l && r && !c && d && a; this.fontInfo = e, this.wrappingStrategy = t, this.wrappingColumn = i, this.wrappingIndent = n, this.wordBreak = o; let u = null; if (h) { u = []; - for (let g = 0, m = this.modelLineProjections.length; g < m; g++) - u[g] = this.modelLineProjections[g].getProjectionData(); + for (let m = 0, b = this.modelLineProjections.length; m < b; m++) + u[m] = this.modelLineProjections[m].getProjectionData(); } return this._constructLines( /*resetHiddenAreas*/ @@ -40771,32 +40771,32 @@ class Ece { if (!e || e <= this._validModelVersionId) return null; const n = t === 1 ? 1 : this.projectedModelLineLineCounts.getPrefixSum(t - 1) + 1, o = this.projectedModelLineLineCounts.getPrefixSum(i); - return this.modelLineProjections.splice(t - 1, i - t + 1), this.projectedModelLineLineCounts.removeValues(t - 1, i - t + 1), new Fv(n, o); + return this.modelLineProjections.splice(t - 1, i - t + 1), this.projectedModelLineLineCounts.removeValues(t - 1, i - t + 1), new rT(n, o); } onModelLinesInserted(e, t, i, n) { if (!e || e <= this._validModelVersionId) return null; - const o = t > 2 && !this.modelLineProjections[t - 2].isVisible(), r = t === 1 ? 1 : this.projectedModelLineLineCounts.getPrefixSum(t - 1) + 1; - let l = 0; - const a = [], c = []; - for (let d = 0, h = n.length; d < h; d++) { - const u = oW(n[d], !o); - a.push(u); - const g = u.getViewLineCount(); - l += g, c[d] = g; + const o = t > 2 && !this.modelLineProjections[t - 2].isVisible(), l = t === 1 ? 1 : this.projectedModelLineLineCounts.getPrefixSum(t - 1) + 1; + let r = 0; + const c = [], d = []; + for (let a = 0, h = n.length; a < h; a++) { + const u = GR(n[a], !o); + c.push(u); + const m = u.getViewLineCount(); + r += m, d[a] = m; } - return this.modelLineProjections = this.modelLineProjections.slice(0, t - 1).concat(a).concat(this.modelLineProjections.slice(t - 1)), this.projectedModelLineLineCounts.insertValues(t - 1, c), new Yv(r, r + l - 1); + return this.modelLineProjections = this.modelLineProjections.slice(0, t - 1).concat(c).concat(this.modelLineProjections.slice(t - 1)), this.projectedModelLineLineCounts.insertValues(t - 1, d), new cT(l, l + r - 1); } onModelLineChanged(e, t, i) { if (e !== null && e <= this._validModelVersionId) return [!1, null, null, null]; - const n = t - 1, o = this.modelLineProjections[n].getViewLineCount(), r = this.modelLineProjections[n].isVisible(), l = oW(i, r); - this.modelLineProjections[n] = l; - const a = this.modelLineProjections[n].getViewLineCount(); - let c = !1, d = 0, h = -1, u = 0, g = -1, m = 0, f = -1; - o > a ? (d = this.projectedModelLineLineCounts.getPrefixSum(t - 1) + 1, h = d + a - 1, m = h + 1, f = m + (o - a) - 1, c = !0) : o < a ? (d = this.projectedModelLineLineCounts.getPrefixSum(t - 1) + 1, h = d + o - 1, u = h + 1, g = u + (a - o) - 1, c = !0) : (d = this.projectedModelLineLineCounts.getPrefixSum(t - 1) + 1, h = d + a - 1), this.projectedModelLineLineCounts.setValue(n, a); - const b = d <= h ? new bK(d, h - d + 1) : null, y = u <= g ? new Yv(u, g) : null, w = m <= f ? new Fv(m, f) : null; - return [c, b, y, w]; + const n = t - 1, o = this.modelLineProjections[n].getViewLineCount(), l = this.modelLineProjections[n].isVisible(), r = GR(i, l); + this.modelLineProjections[n] = r; + const c = this.modelLineProjections[n].getViewLineCount(); + let d = !1, a = 0, h = -1, u = 0, m = -1, b = 0, g = -1; + o > c ? (a = this.projectedModelLineLineCounts.getPrefixSum(t - 1) + 1, h = a + c - 1, b = h + 1, g = b + (o - c) - 1, d = !0) : o < c ? (a = this.projectedModelLineLineCounts.getPrefixSum(t - 1) + 1, h = a + o - 1, u = h + 1, m = u + (c - o) - 1, d = !0) : (a = this.projectedModelLineLineCounts.getPrefixSum(t - 1) + 1, h = a + c - 1), this.projectedModelLineLineCounts.setValue(n, c); + const Z = a <= h ? new $Q(a, h - a + 1) : null, f = u <= m ? new cT(u, m) : null, y = b <= g ? new rT(b, g) : null; + return [d, Z, f, y]; } acceptVersionId(e) { this._validModelVersionId = e, this.modelLineProjections.length === 1 && !this.modelLineProjections[0].isVisible() && this.setHiddenAreas([]); @@ -40812,18 +40812,18 @@ class Ece { } getActiveIndentGuide(e, t, i) { e = this._toValidViewLineNumber(e), t = this._toValidViewLineNumber(t), i = this._toValidViewLineNumber(i); - const n = this.convertViewPositionToModelPosition(e, this.getViewLineMinColumn(e)), o = this.convertViewPositionToModelPosition(t, this.getViewLineMinColumn(t)), r = this.convertViewPositionToModelPosition(i, this.getViewLineMinColumn(i)), l = this.model.guides.getActiveIndentGuide(n.lineNumber, o.lineNumber, r.lineNumber), a = this.convertModelPositionToViewPosition(l.startLineNumber, 1), c = this.convertModelPositionToViewPosition(l.endLineNumber, this.model.getLineMaxColumn(l.endLineNumber)); + const n = this.convertViewPositionToModelPosition(e, this.getViewLineMinColumn(e)), o = this.convertViewPositionToModelPosition(t, this.getViewLineMinColumn(t)), l = this.convertViewPositionToModelPosition(i, this.getViewLineMinColumn(i)), r = this.model.guides.getActiveIndentGuide(n.lineNumber, o.lineNumber, l.lineNumber), c = this.convertModelPositionToViewPosition(r.startLineNumber, 1), d = this.convertModelPositionToViewPosition(r.endLineNumber, this.model.getLineMaxColumn(r.endLineNumber)); return { - startLineNumber: a.lineNumber, - endLineNumber: c.lineNumber, - indent: l.indent + startLineNumber: c.lineNumber, + endLineNumber: d.lineNumber, + indent: r.indent }; } // #region ViewLineInfo getViewLineInfo(e) { e = this._toValidViewLineNumber(e); const t = this.projectedModelLineLineCounts.getIndexOf(e - 1), i = t.index, n = t.remainder; - return new PY(i + 1, n); + return new bz(i + 1, n); } getMinColumnOfViewLine(e) { return this.modelLineProjections[e.modelLineNumber - 1].getViewLineMinColumn(this.model, e.modelLineNumber, e.modelLineWrappedLineIdx); @@ -40833,87 +40833,87 @@ class Ece { } getModelStartPositionOfViewLine(e) { const t = this.modelLineProjections[e.modelLineNumber - 1], i = t.getViewLineMinColumn(this.model, e.modelLineNumber, e.modelLineWrappedLineIdx), n = t.getModelColumnOfViewPosition(e.modelLineWrappedLineIdx, i); - return new V(e.modelLineNumber, n); + return new Y(e.modelLineNumber, n); } getModelEndPositionOfViewLine(e) { const t = this.modelLineProjections[e.modelLineNumber - 1], i = t.getViewLineMaxColumn(this.model, e.modelLineNumber, e.modelLineWrappedLineIdx), n = t.getModelColumnOfViewPosition(e.modelLineWrappedLineIdx, i); - return new V(e.modelLineNumber, n); + return new Y(e.modelLineNumber, n); } getViewLineInfosGroupedByModelRanges(e, t) { const i = this.getViewLineInfo(e), n = this.getViewLineInfo(t), o = new Array(); - let r = this.getModelStartPositionOfViewLine(i), l = new Array(); - for (let a = i.modelLineNumber; a <= n.modelLineNumber; a++) { - const c = this.modelLineProjections[a - 1]; - if (c.isVisible()) { - const d = a === i.modelLineNumber ? i.modelLineWrappedLineIdx : 0, h = a === n.modelLineNumber ? n.modelLineWrappedLineIdx + 1 : c.getViewLineCount(); - for (let u = d; u < h; u++) - l.push(new PY(a, u)); - } - if (!c.isVisible() && r) { - const d = new V(a - 1, this.model.getLineMaxColumn(a - 1) + 1), h = M.fromPositions(r, d); - o.push(new BY(h, l)), l = [], r = null; - } else c.isVisible() && !r && (r = new V(a, 1)); + let l = this.getModelStartPositionOfViewLine(i), r = new Array(); + for (let c = i.modelLineNumber; c <= n.modelLineNumber; c++) { + const d = this.modelLineProjections[c - 1]; + if (d.isVisible()) { + const a = c === i.modelLineNumber ? i.modelLineWrappedLineIdx : 0, h = c === n.modelLineNumber ? n.modelLineWrappedLineIdx + 1 : d.getViewLineCount(); + for (let u = a; u < h; u++) + r.push(new bz(c, u)); + } + if (!d.isVisible() && l) { + const a = new Y(c - 1, this.model.getLineMaxColumn(c - 1) + 1), h = I.fromPositions(l, a); + o.push(new pz(h, r)), r = [], l = null; + } else d.isVisible() && !l && (l = new Y(c, 1)); } - if (r) { - const a = M.fromPositions(r, this.getModelEndPositionOfViewLine(n)); - o.push(new BY(a, l)); + if (l) { + const c = I.fromPositions(l, this.getModelEndPositionOfViewLine(n)); + o.push(new pz(c, r)); } return o; } // #endregion getViewLinesBracketGuides(e, t, i, n) { - const o = i ? this.convertViewPositionToModelPosition(i.lineNumber, i.column) : null, r = []; - for (const l of this.getViewLineInfosGroupedByModelRanges(e, t)) { - const a = l.modelRange.startLineNumber, c = this.model.guides.getLinesBracketGuides(a, l.modelRange.endLineNumber, o, n); - for (const d of l.viewLines) { - const u = c[d.modelLineNumber - a].map((g) => { - if (g.forWrappedLinesAfterColumn !== -1 && this.modelLineProjections[d.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.forWrappedLinesAfterColumn).lineNumber >= d.modelLineWrappedLineIdx || g.forWrappedLinesBeforeOrAtColumn !== -1 && this.modelLineProjections[d.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.forWrappedLinesBeforeOrAtColumn).lineNumber < d.modelLineWrappedLineIdx) + const o = i ? this.convertViewPositionToModelPosition(i.lineNumber, i.column) : null, l = []; + for (const r of this.getViewLineInfosGroupedByModelRanges(e, t)) { + const c = r.modelRange.startLineNumber, d = this.model.guides.getLinesBracketGuides(c, r.modelRange.endLineNumber, o, n); + for (const a of r.viewLines) { + const u = d[a.modelLineNumber - c].map((m) => { + if (m.forWrappedLinesAfterColumn !== -1 && this.modelLineProjections[a.modelLineNumber - 1].getViewPositionOfModelPosition(0, m.forWrappedLinesAfterColumn).lineNumber >= a.modelLineWrappedLineIdx || m.forWrappedLinesBeforeOrAtColumn !== -1 && this.modelLineProjections[a.modelLineNumber - 1].getViewPositionOfModelPosition(0, m.forWrappedLinesBeforeOrAtColumn).lineNumber < a.modelLineWrappedLineIdx) return; - if (!g.horizontalLine) - return g; - let m = -1; - if (g.column !== -1) { - const y = this.modelLineProjections[d.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.column); - if (y.lineNumber === d.modelLineWrappedLineIdx) - m = y.column; - else if (y.lineNumber < d.modelLineWrappedLineIdx) - m = this.getMinColumnOfViewLine(d); - else if (y.lineNumber > d.modelLineWrappedLineIdx) + if (!m.horizontalLine) + return m; + let b = -1; + if (m.column !== -1) { + const f = this.modelLineProjections[a.modelLineNumber - 1].getViewPositionOfModelPosition(0, m.column); + if (f.lineNumber === a.modelLineWrappedLineIdx) + b = f.column; + else if (f.lineNumber < a.modelLineWrappedLineIdx) + b = this.getMinColumnOfViewLine(a); + else if (f.lineNumber > a.modelLineWrappedLineIdx) return; } - const f = this.convertModelPositionToViewPosition(d.modelLineNumber, g.horizontalLine.endColumn), b = this.modelLineProjections[d.modelLineNumber - 1].getViewPositionOfModelPosition(0, g.horizontalLine.endColumn); - return b.lineNumber === d.modelLineWrappedLineIdx ? new $u(g.visibleColumn, m, g.className, new Ty(g.horizontalLine.top, f.column), -1, -1) : b.lineNumber < d.modelLineWrappedLineIdx || g.visibleColumn !== -1 ? void 0 : new $u(g.visibleColumn, m, g.className, new Ty(g.horizontalLine.top, this.getMaxColumnOfViewLine(d)), -1, -1); + const g = this.convertModelPositionToViewPosition(a.modelLineNumber, m.horizontalLine.endColumn), Z = this.modelLineProjections[a.modelLineNumber - 1].getViewPositionOfModelPosition(0, m.horizontalLine.endColumn); + return Z.lineNumber === a.modelLineWrappedLineIdx ? new sm(m.visibleColumn, b, m.className, new Af(m.horizontalLine.top, g.column), -1, -1) : Z.lineNumber < a.modelLineWrappedLineIdx || m.visibleColumn !== -1 ? void 0 : new sm(m.visibleColumn, b, m.className, new Af(m.horizontalLine.top, this.getMaxColumnOfViewLine(a)), -1, -1); }); - r.push(u.filter((g) => !!g)); + l.push(u.filter((m) => !!m)); } } - return r; + return l; } getViewLinesIndentGuides(e, t) { e = this._toValidViewLineNumber(e), t = this._toValidViewLineNumber(t); const i = this.convertViewPositionToModelPosition(e, this.getViewLineMinColumn(e)), n = this.convertViewPositionToModelPosition(t, this.getViewLineMaxColumn(t)); let o = []; - const r = [], l = [], a = i.lineNumber - 1, c = n.lineNumber - 1; - let d = null; - for (let m = a; m <= c; m++) { - const f = this.modelLineProjections[m]; - if (f.isVisible()) { - const b = f.getViewLineNumberOfModelPosition(0, m === a ? i.column : 1), y = f.getViewLineNumberOfModelPosition(0, this.model.getLineMaxColumn(m + 1)), w = y - b + 1; - let C = 0; - w > 1 && f.getViewLineMinColumn(this.model, m + 1, y) === 1 && (C = b === 0 ? 1 : 2), r.push(w), l.push(C), d === null && (d = new V(m + 1, 0)); + const l = [], r = [], c = i.lineNumber - 1, d = n.lineNumber - 1; + let a = null; + for (let b = c; b <= d; b++) { + const g = this.modelLineProjections[b]; + if (g.isVisible()) { + const Z = g.getViewLineNumberOfModelPosition(0, b === c ? i.column : 1), f = g.getViewLineNumberOfModelPosition(0, this.model.getLineMaxColumn(b + 1)), y = f - Z + 1; + let W = 0; + y > 1 && g.getViewLineMinColumn(this.model, b + 1, f) === 1 && (W = Z === 0 ? 1 : 2), l.push(y), r.push(W), a === null && (a = new Y(b + 1, 0)); } else - d !== null && (o = o.concat(this.model.guides.getLinesIndentGuides(d.lineNumber, m)), d = null); + a !== null && (o = o.concat(this.model.guides.getLinesIndentGuides(a.lineNumber, b)), a = null); } - d !== null && (o = o.concat(this.model.guides.getLinesIndentGuides(d.lineNumber, n.lineNumber)), d = null); + a !== null && (o = o.concat(this.model.guides.getLinesIndentGuides(a.lineNumber, n.lineNumber)), a = null); const h = t - e + 1, u = new Array(h); - let g = 0; - for (let m = 0, f = o.length; m < f; m++) { - let b = o[m]; - const y = Math.min(h - g, r[m]), w = l[m]; - let C; - w === 2 ? C = 0 : w === 1 ? C = 1 : C = y; - for (let S = 0; S < y; S++) - S === C && (b = 0), u[g++] = b; + let m = 0; + for (let b = 0, g = o.length; b < g; b++) { + let Z = o[b]; + const f = Math.min(h - m, l[b]), y = r[b]; + let W; + y === 2 ? W = 0 : y === 1 ? W = 1 : W = f; + for (let G = 0; G < f; G++) + G === W && (Z = 0), u[m++] = Z; } return u; } @@ -40941,51 +40941,51 @@ class Ece { e = this._toValidViewLineNumber(e), t = this._toValidViewLineNumber(t); const n = this.projectedModelLineLineCounts.getIndexOf(e - 1); let o = e; - const r = n.index, l = n.remainder, a = []; - for (let c = r, d = this.model.getLineCount(); c < d; c++) { - const h = this.modelLineProjections[c]; + const l = n.index, r = n.remainder, c = []; + for (let d = l, a = this.model.getLineCount(); d < a; d++) { + const h = this.modelLineProjections[d]; if (!h.isVisible()) continue; - const u = c === r ? l : 0; - let g = h.getViewLineCount() - u, m = !1; - if (o + g > t && (m = !0, g = t - o + 1), h.getViewLinesData(this.model, c + 1, u, g, o - e, i, a), o += g, m) + const u = d === l ? r : 0; + let m = h.getViewLineCount() - u, b = !1; + if (o + m > t && (b = !0, m = t - o + 1), h.getViewLinesData(this.model, d + 1, u, m, o - e, i, c), o += m, b) break; } - return a; + return c; } validateViewPosition(e, t, i) { e = this._toValidViewLineNumber(e); - const n = this.projectedModelLineLineCounts.getIndexOf(e - 1), o = n.index, r = n.remainder, l = this.modelLineProjections[o], a = l.getViewLineMinColumn(this.model, o + 1, r), c = l.getViewLineMaxColumn(this.model, o + 1, r); - t < a && (t = a), t > c && (t = c); - const d = l.getModelColumnOfViewPosition(r, t); - return this.model.validatePosition(new V(o + 1, d)).equals(i) ? new V(e, t) : this.convertModelPositionToViewPosition(i.lineNumber, i.column); + const n = this.projectedModelLineLineCounts.getIndexOf(e - 1), o = n.index, l = n.remainder, r = this.modelLineProjections[o], c = r.getViewLineMinColumn(this.model, o + 1, l), d = r.getViewLineMaxColumn(this.model, o + 1, l); + t < c && (t = c), t > d && (t = d); + const a = r.getModelColumnOfViewPosition(l, t); + return this.model.validatePosition(new Y(o + 1, a)).equals(i) ? new Y(e, t) : this.convertModelPositionToViewPosition(i.lineNumber, i.column); } validateViewRange(e, t) { const i = this.validateViewPosition(e.startLineNumber, e.startColumn, t.getStartPosition()), n = this.validateViewPosition(e.endLineNumber, e.endColumn, t.getEndPosition()); - return new M(i.lineNumber, i.column, n.lineNumber, n.column); + return new I(i.lineNumber, i.column, n.lineNumber, n.column); } convertViewPositionToModelPosition(e, t) { const i = this.getViewLineInfo(e), n = this.modelLineProjections[i.modelLineNumber - 1].getModelColumnOfViewPosition(i.modelLineWrappedLineIdx, t); - return this.model.validatePosition(new V(i.modelLineNumber, n)); + return this.model.validatePosition(new Y(i.modelLineNumber, n)); } convertViewRangeToModelRange(e) { const t = this.convertViewPositionToModelPosition(e.startLineNumber, e.startColumn), i = this.convertViewPositionToModelPosition(e.endLineNumber, e.endColumn); - return new M(t.lineNumber, t.column, i.lineNumber, i.column); + return new I(t.lineNumber, t.column, i.lineNumber, i.column); } convertModelPositionToViewPosition(e, t, i = 2, n = !1, o = !1) { - const r = this.model.validatePosition(new V(e, t)), l = r.lineNumber, a = r.column; - let c = l - 1, d = !1; + const l = this.model.validatePosition(new Y(e, t)), r = l.lineNumber, c = l.column; + let d = r - 1, a = !1; if (o) - for (; c < this.modelLineProjections.length && !this.modelLineProjections[c].isVisible(); ) - c++, d = !0; + for (; d < this.modelLineProjections.length && !this.modelLineProjections[d].isVisible(); ) + d++, a = !0; else - for (; c > 0 && !this.modelLineProjections[c].isVisible(); ) - c--, d = !0; - if (c === 0 && !this.modelLineProjections[c].isVisible()) - return new V(n ? 0 : 1, 1); - const h = 1 + this.projectedModelLineLineCounts.getPrefixSum(c); + for (; d > 0 && !this.modelLineProjections[d].isVisible(); ) + d--, a = !0; + if (d === 0 && !this.modelLineProjections[d].isVisible()) + return new Y(n ? 0 : 1, 1); + const h = 1 + this.projectedModelLineLineCounts.getPrefixSum(d); let u; - return d ? o ? u = this.modelLineProjections[c].getViewPositionOfModelPosition(h, 1, i) : u = this.modelLineProjections[c].getViewPositionOfModelPosition(h, this.model.getLineMaxColumn(c + 1), i) : u = this.modelLineProjections[l - 1].getViewPositionOfModelPosition(h, a, i), u; + return a ? o ? u = this.modelLineProjections[d].getViewPositionOfModelPosition(h, 1, i) : u = this.modelLineProjections[d].getViewPositionOfModelPosition(h, this.model.getLineMaxColumn(d + 1), i) : u = this.modelLineProjections[r - 1].getViewPositionOfModelPosition(h, c, i), u; } /** * @param affinity The affinity in case of an empty range. Has no effect for non-empty ranges. @@ -40993,7 +40993,7 @@ class Ece { convertModelRangeToViewRange(e, t = 0) { if (e.isEmpty()) { const i = this.convertModelPositionToViewPosition(e.startLineNumber, e.startColumn, t); - return M.fromPositions(i); + return I.fromPositions(i); } else { const i = this.convertModelPositionToViewPosition( e.startLineNumber, @@ -41006,7 +41006,7 @@ class Ece { 0 /* PositionAffinity.Left */ ); - return new M(i.lineNumber, i.column, n.lineNumber, n.column); + return new I(i.lineNumber, i.column, n.lineNumber, n.column); } } getViewLineNumberOfModelPosition(e, t) { @@ -41023,28 +41023,28 @@ class Ece { return this.modelLineProjections[i].getViewLineNumberOfModelPosition(n, this.model.getLineMaxColumn(i + 1)); } getDecorationsInRange(e, t, i, n, o) { - const r = this.convertViewPositionToModelPosition(e.startLineNumber, e.startColumn), l = this.convertViewPositionToModelPosition(e.endLineNumber, e.endColumn); - if (l.lineNumber - r.lineNumber <= e.endLineNumber - e.startLineNumber) - return this.model.getDecorationsInRange(new M(r.lineNumber, 1, l.lineNumber, l.column), t, i, n, o); - let a = []; - const c = r.lineNumber - 1, d = l.lineNumber - 1; + const l = this.convertViewPositionToModelPosition(e.startLineNumber, e.startColumn), r = this.convertViewPositionToModelPosition(e.endLineNumber, e.endColumn); + if (r.lineNumber - l.lineNumber <= e.endLineNumber - e.startLineNumber) + return this.model.getDecorationsInRange(new I(l.lineNumber, 1, r.lineNumber, r.column), t, i, n, o); + let c = []; + const d = l.lineNumber - 1, a = r.lineNumber - 1; let h = null; - for (let f = c; f <= d; f++) - if (this.modelLineProjections[f].isVisible()) - h === null && (h = new V(f + 1, f === c ? r.column : 1)); + for (let g = d; g <= a; g++) + if (this.modelLineProjections[g].isVisible()) + h === null && (h = new Y(g + 1, g === d ? l.column : 1)); else if (h !== null) { - const y = this.model.getLineMaxColumn(f); - a = a.concat(this.model.getDecorationsInRange(new M(h.lineNumber, h.column, f, y), t, i, n)), h = null; + const f = this.model.getLineMaxColumn(g); + c = c.concat(this.model.getDecorationsInRange(new I(h.lineNumber, h.column, g, f), t, i, n)), h = null; } - h !== null && (a = a.concat(this.model.getDecorationsInRange(new M(h.lineNumber, h.column, l.lineNumber, l.column), t, i, n)), h = null), a.sort((f, b) => { - const y = M.compareRangesUsingStarts(f.range, b.range); - return y === 0 ? f.id < b.id ? -1 : f.id > b.id ? 1 : 0 : y; + h !== null && (c = c.concat(this.model.getDecorationsInRange(new I(h.lineNumber, h.column, r.lineNumber, r.column), t, i, n)), h = null), c.sort((g, Z) => { + const f = I.compareRangesUsingStarts(g.range, Z.range); + return f === 0 ? g.id < Z.id ? -1 : g.id > Z.id ? 1 : 0 : f; }); const u = []; - let g = 0, m = null; - for (const f of a) { - const b = f.id; - m !== b && (m = b, u[g++] = f); + let m = 0, b = null; + for (const g of c) { + const Z = g.id; + b !== Z && (b = Z, u[m++] = g); } return u; } @@ -41061,30 +41061,30 @@ class Ece { return t.modelLineWrappedLineIdx === 0 ? this.model.getLineIndentColumn(t.modelLineNumber) : 0; } } -function Xce(s) { +function wae(s) { if (s.length === 0) return []; const e = s.slice(); - e.sort(M.compareRangesUsingStarts); + e.sort(I.compareRangesUsingStarts); const t = []; let i = e[0].startLineNumber, n = e[0].endLineNumber; - for (let o = 1, r = e.length; o < r; o++) { - const l = e[o]; - l.startLineNumber > n + 1 ? (t.push(new M(i, 1, n, 1)), i = l.startLineNumber, n = l.endLineNumber) : l.endLineNumber > n && (n = l.endLineNumber); + for (let o = 1, l = e.length; o < l; o++) { + const r = e[o]; + r.startLineNumber > n + 1 ? (t.push(new I(i, 1, n, 1)), i = r.startLineNumber, n = r.endLineNumber) : r.endLineNumber > n && (n = r.endLineNumber); } - return t.push(new M(i, 1, n, 1)), t; + return t.push(new I(i, 1, n, 1)), t; } -class PY { +class bz { constructor(e, t) { this.modelLineNumber = e, this.modelLineWrappedLineIdx = t; } } -class BY { +class pz { constructor(e, t) { this.modelRange = e, this.viewLines = t; } } -class Fce { +class Tae { constructor(e) { this._lines = e; } @@ -41118,14 +41118,14 @@ class Fce { return this._lines.getViewLineNumberOfModelPosition(e, t); } } -class Yce { +class Mae { constructor(e) { this.model = e; } dispose() { } createCoordinatesConverter() { - return new zce(this); + return new Yae(this); } getHiddenAreas() { return []; @@ -41151,13 +41151,13 @@ class Yce { onModelFlushed() { } onModelLinesDeleted(e, t, i) { - return new Fv(t, i); + return new rT(t, i); } onModelLinesInserted(e, t, i, n) { - return new Yv(t, i); + return new cT(t, i); } onModelLineChanged(e, t, i) { - return [!1, new bK(t, 1), null, null]; + return [!1, new $Q(t, 1), null, null]; } acceptVersionId(e) { } @@ -41194,15 +41194,15 @@ class Yce { } getViewLineData(e) { const t = this.model.tokenization.getLineTokens(e), i = t.getLineContent(); - return new qE(i, !1, 1, i.length + 1, 0, t.inflate(), null); + return new VJ(i, !1, 1, i.length + 1, 0, t.inflate(), null); } getViewLinesData(e, t, i) { const n = this.model.getLineCount(); e = Math.min(Math.max(1, e), n), t = Math.min(Math.max(1, t), n); const o = []; - for (let r = e; r <= t; r++) { - const l = r - e; - o[l] = i[l] ? this.getViewLineData(r) : null; + for (let l = e; l <= t; l++) { + const r = l - e; + o[r] = i[r] ? this.getViewLineData(l) : null; } return o; } @@ -41219,7 +41219,7 @@ class Yce { return null; } } -class zce { +class Yae { constructor(e) { this._lines = e; } @@ -41260,13 +41260,13 @@ class zce { return e; } } -const hu = Jr.Right; -class Pce { +const pu = Ol.Right; +class kae { constructor(e) { - this.persist = 0, this._requiredLanes = 1, this.lanes = new Uint8Array(Math.ceil((e + 1) * hu / 8)); + this.persist = 0, this._requiredLanes = 1, this.lanes = new Uint8Array(Math.ceil((e + 1) * pu / 8)); } reset(e) { - const t = Math.ceil((e + 1) * hu / 8); + const t = Math.ceil((e + 1) * pu / 8); this.lanes.length < t ? this.lanes = new Uint8Array(t) : this.lanes.fill(0), this._requiredLanes = 1; } get requiredLanes() { @@ -41275,62 +41275,62 @@ class Pce { push(e, t, i) { i && (this.persist |= 1 << e - 1); for (let n = t.startLineNumber; n <= t.endLineNumber; n++) { - const o = hu * n + (e - 1); + const o = pu * n + (e - 1); this.lanes[o >>> 3] |= 1 << o % 8, this._requiredLanes = Math.max(this._requiredLanes, this.countAtLine(n)); } } getLanesAtLine(e) { const t = []; - let i = hu * e; - for (let n = 0; n < hu; n++) + let i = pu * e; + for (let n = 0; n < pu; n++) (this.persist & 1 << n || this.lanes[i >>> 3] & 1 << i % 8) && t.push(n + 1), i++; - return t.length ? t : [Jr.Center]; + return t.length ? t : [Ol.Center]; } countAtLine(e) { - let t = hu * e, i = 0; - for (let n = 0; n < hu; n++) + let t = pu * e, i = 0; + for (let n = 0; n < pu; n++) (this.persist & 1 << n || this.lanes[t >>> 3] & 1 << t % 8) && i++, t++; return i; } } -let Bce = class extends R { - constructor(e, t, i, n, o, r, l, a, c, d) { - if (super(), this.languageConfigurationService = l, this._themeService = a, this._attachedView = c, this._transactionalTarget = d, this.hiddenAreasModel = new Hce(), this.previousHiddenAreas = [], this._editorId = e, this._configuration = t, this.model = i, this._eventDispatcher = new hce(), this.onEvent = this._eventDispatcher.onEvent, this.cursorConfig = new np(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService), this._updateConfigurationViewLineCount = this._register(new Zt(() => this._updateConfigurationViewLineCountNow(), 0)), this._hasFocus = !1, this._viewportStart = SX.create(this.model), this.glyphLanes = new Pce(0), this.model.isTooLargeForTokenization()) - this._lines = new Yce(this.model); +let vae = class extends J { + constructor(e, t, i, n, o, l, r, c, d, a) { + if (super(), this.languageConfigurationService = r, this._themeService = c, this._attachedView = d, this._transactionalTarget = a, this.hiddenAreasModel = new Hae(), this.previousHiddenAreas = [], this._editorId = e, this._configuration = t, this.model = i, this._eventDispatcher = new nae(), this.onEvent = this._eventDispatcher.onEvent, this.cursorConfig = new cp(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService), this._updateConfigurationViewLineCount = this._register(new St(() => this._updateConfigurationViewLineCountNow(), 0)), this._hasFocus = !1, this._viewportStart = PJ.create(this.model), this.glyphLanes = new kae(0), this.model.isTooLargeForTokenization()) + this._lines = new Mae(this.model); else { const h = this._configuration.options, u = h.get( 50 /* EditorOption.fontInfo */ - ), g = h.get( + ), m = h.get( 140 /* EditorOption.wrappingStrategy */ - ), m = h.get( + ), b = h.get( 147 /* EditorOption.wrappingInfo */ - ), f = h.get( + ), g = h.get( 139 /* EditorOption.wrappingIndent */ - ), b = h.get( + ), Z = h.get( 130 /* EditorOption.wordBreak */ ); - this._lines = new Ece(this._editorId, this.model, n, o, u, this.model.getOptions().tabSize, g, m.wrappingColumn, f, b); + this._lines = new Nae(this._editorId, this.model, n, o, u, this.model.getOptions().tabSize, m, b.wrappingColumn, g, Z); } - this.coordinatesConverter = this._lines.createCoordinatesConverter(), this._cursor = this._register(new Lce(i, this, this.coordinatesConverter, this.cursorConfig)), this.viewLayout = this._register(new Tce(this._configuration, this.getLineCount(), r)), this._register(this.viewLayout.onDidScroll((h) => { - h.scrollTopChanged && this._handleVisibleLinesChanged(), h.scrollTopChanged && this._viewportStart.invalidate(), this._eventDispatcher.emitSingleViewEvent(new rce(h)), this._eventDispatcher.emitOutgoingEvent(new bX(h.oldScrollWidth, h.oldScrollLeft, h.oldScrollHeight, h.oldScrollTop, h.scrollWidth, h.scrollLeft, h.scrollHeight, h.scrollTop)); + this.coordinatesConverter = this._lines.createCoordinatesConverter(), this._cursor = this._register(new bae(i, this, this.coordinatesConverter, this.cursorConfig)), this.viewLayout = this._register(new Lae(this._configuration, this.getLineCount(), l)), this._register(this.viewLayout.onDidScroll((h) => { + h.scrollTopChanged && this._handleVisibleLinesChanged(), h.scrollTopChanged && this._viewportStart.invalidate(), this._eventDispatcher.emitSingleViewEvent(new qde(h)), this._eventDispatcher.emitOutgoingEvent(new zJ(h.oldScrollWidth, h.oldScrollLeft, h.oldScrollHeight, h.oldScrollTop, h.scrollWidth, h.scrollLeft, h.scrollHeight, h.scrollTop)); })), this._register(this.viewLayout.onDidContentSizeChange((h) => { this._eventDispatcher.emitOutgoingEvent(h); - })), this._decorations = new Dce(this._editorId, this.model, this._configuration, this._lines, this.coordinatesConverter), this._registerModelEvents(), this._register(this._configuration.onDidChangeFast((h) => { + })), this._decorations = new Iae(this._editorId, this.model, this._configuration, this._lines, this.coordinatesConverter), this._registerModelEvents(), this._register(this._configuration.onDidChangeFast((h) => { try { const u = this._eventDispatcher.beginEmitViewEvents(); this._onConfigurationChanged(u, h); } finally { this._eventDispatcher.endEmitViewEvents(); } - })), this._register(EA.getInstance().onDidChange(() => { - this._eventDispatcher.emitSingleViewEvent(new cce()); + })), this._register($V.getInstance().onDidChange(() => { + this._eventDispatcher.emitSingleViewEvent(new tae()); })), this._register(this._themeService.onDidColorThemeChange((h) => { - this._invalidateDecorationsColorCache(), this._eventDispatcher.emitSingleViewEvent(new lce(h)); + this._invalidateDecorationsColorCache(), this._eventDispatcher.emitSingleViewEvent(new $de(h)); })), this._updateConfigurationViewLineCountNow(); } dispose() { @@ -41349,7 +41349,7 @@ let Bce = class extends R { this._configuration.setViewLineCount(this._lines.getViewLineCount()); } getModelVisibleRanges() { - const e = this.viewLayout.getLinesViewportData(), t = new M(e.startLineNumber, this.getLineMinColumn(e.startLineNumber), e.endLineNumber, this.getLineMaxColumn(e.endLineNumber)); + const e = this.viewLayout.getLinesViewportData(), t = new I(e.startLineNumber, this.getLineMinColumn(e.startLineNumber), e.endLineNumber, this.getLineMaxColumn(e.endLineNumber)); return this._toModelVisibleRanges(t); } visibleLinesStabilized() { @@ -41361,94 +41361,94 @@ let Bce = class extends R { this._attachedView.setVisibleLines(e, !1); } setHasFocus(e) { - this._hasFocus = e, this._cursor.setHasFocus(e), this._eventDispatcher.emitSingleViewEvent(new sce(e)), this._eventDispatcher.emitOutgoingEvent(new fX(!e, e)); + this._hasFocus = e, this._cursor.setHasFocus(e), this._eventDispatcher.emitSingleViewEvent(new Ode(e)), this._eventDispatcher.emitOutgoingEvent(new FJ(!e, e)); } onCompositionStart() { - this._eventDispatcher.emitSingleViewEvent(new ece()); + this._eventDispatcher.emitSingleViewEvent(new Pde()); } onCompositionEnd() { - this._eventDispatcher.emitSingleViewEvent(new tce()); + this._eventDispatcher.emitSingleViewEvent(new Bde()); } _captureStableViewport() { if (this._viewportStart.isValid && this.viewLayout.getCurrentScrollTop() > 0) { - const e = new V(this._viewportStart.viewLineNumber, this.getLineMinColumn(this._viewportStart.viewLineNumber)), t = this.coordinatesConverter.convertViewPositionToModelPosition(e); - return new HY(t, this._viewportStart.startLineDelta); + const e = new Y(this._viewportStart.viewLineNumber, this.getLineMinColumn(this._viewportStart.viewLineNumber)), t = this.coordinatesConverter.convertViewPositionToModelPosition(e); + return new Zz(t, this._viewportStart.startLineDelta); } - return new HY(null, 0); + return new Zz(null, 0); } _onConfigurationChanged(e, t) { const i = this._captureStableViewport(), n = this._configuration.options, o = n.get( 50 /* EditorOption.fontInfo */ - ), r = n.get( + ), l = n.get( 140 /* EditorOption.wrappingStrategy */ - ), l = n.get( + ), r = n.get( 147 /* EditorOption.wrappingInfo */ - ), a = n.get( + ), c = n.get( 139 /* EditorOption.wrappingIndent */ - ), c = n.get( + ), d = n.get( 130 /* EditorOption.wordBreak */ ); - this._lines.setWrappingSettings(o, r, l.wrappingColumn, a, c) && (e.emitViewEvent(new pS()), e.emitViewEvent(new fS()), e.emitViewEvent(new du(null)), this._cursor.onLineMappingChanged(e), this._decorations.onLineMappingChanged(), this.viewLayout.onFlushed(this.getLineCount()), this._updateConfigurationViewLineCount.schedule()), t.hasChanged( + this._lines.setWrappingSettings(o, l, r.wrappingColumn, c, d) && (e.emitViewEvent(new C1()), e.emitViewEvent(new R1()), e.emitViewEvent(new bu(null)), this._cursor.onLineMappingChanged(e), this._decorations.onLineMappingChanged(), this.viewLayout.onFlushed(this.getLineCount()), this._updateConfigurationViewLineCount.schedule()), t.hasChanged( 92 /* EditorOption.readOnly */ - ) && (this._decorations.reset(), e.emitViewEvent(new du(null))), t.hasChanged( + ) && (this._decorations.reset(), e.emitViewEvent(new bu(null))), t.hasChanged( 99 /* EditorOption.renderValidationDecorations */ - ) && (this._decorations.reset(), e.emitViewEvent(new du(null))), e.emitViewEvent(new ice(t)), this.viewLayout.onConfigurationChanged(t), i.recoverViewportStart(this.coordinatesConverter, this.viewLayout), np.shouldRecreate(t) && (this.cursorConfig = new np(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService), this._cursor.updateConfiguration(this.cursorConfig)); + ) && (this._decorations.reset(), e.emitViewEvent(new bu(null))), e.emitViewEvent(new _de(t)), this.viewLayout.onConfigurationChanged(t), i.recoverViewportStart(this.coordinatesConverter, this.viewLayout), cp.shouldRecreate(t) && (this.cursorConfig = new cp(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService), this._cursor.updateConfiguration(this.cursorConfig)); } _registerModelEvents() { this._register(this.model.onDidChangeContentOrInjectedText((e) => { try { const i = this._eventDispatcher.beginEmitViewEvents(); let n = !1, o = !1; - const r = e instanceof hg ? e.rawContentChangedEvent.changes : e.changes, l = e instanceof hg ? e.rawContentChangedEvent.versionId : null, a = this._lines.createLineBreaksComputer(); - for (const h of r) + const l = e instanceof gm ? e.rawContentChangedEvent.changes : e.changes, r = e instanceof gm ? e.rawContentChangedEvent.versionId : null, c = this._lines.createLineBreaksComputer(); + for (const h of l) switch (h.changeType) { case 4: { for (let u = 0; u < h.detail.length; u++) { - const g = h.detail[u]; - let m = h.injectedTexts[u]; - m && (m = m.filter((f) => !f.ownerId || f.ownerId === this._editorId)), a.addRequest(g, m, null); + const m = h.detail[u]; + let b = h.injectedTexts[u]; + b && (b = b.filter((g) => !g.ownerId || g.ownerId === this._editorId)), c.addRequest(m, b, null); } break; } case 2: { let u = null; - h.injectedText && (u = h.injectedText.filter((g) => !g.ownerId || g.ownerId === this._editorId)), a.addRequest(h.detail, u, null); + h.injectedText && (u = h.injectedText.filter((m) => !m.ownerId || m.ownerId === this._editorId)), c.addRequest(h.detail, u, null); break; } } - const c = a.finalize(), d = new Hc(c); - for (const h of r) + const d = c.finalize(), a = new Od(d); + for (const h of l) switch (h.changeType) { case 1: { - this._lines.onModelFlushed(), i.emitViewEvent(new pS()), this._decorations.reset(), this.viewLayout.onFlushed(this.getLineCount()), n = !0; + this._lines.onModelFlushed(), i.emitViewEvent(new C1()), this._decorations.reset(), this.viewLayout.onFlushed(this.getLineCount()), n = !0; break; } case 3: { - const u = this._lines.onModelLinesDeleted(l, h.fromLineNumber, h.toLineNumber); + const u = this._lines.onModelLinesDeleted(r, h.fromLineNumber, h.toLineNumber); u !== null && (i.emitViewEvent(u), this.viewLayout.onLinesDeleted(u.fromLineNumber, u.toLineNumber)), n = !0; break; } case 4: { - const u = d.takeCount(h.detail.length), g = this._lines.onModelLinesInserted(l, h.fromLineNumber, h.toLineNumber, u); - g !== null && (i.emitViewEvent(g), this.viewLayout.onLinesInserted(g.fromLineNumber, g.toLineNumber)), n = !0; + const u = a.takeCount(h.detail.length), m = this._lines.onModelLinesInserted(r, h.fromLineNumber, h.toLineNumber, u); + m !== null && (i.emitViewEvent(m), this.viewLayout.onLinesInserted(m.fromLineNumber, m.toLineNumber)), n = !0; break; } case 2: { - const u = d.dequeue(), [g, m, f, b] = this._lines.onModelLineChanged(l, h.lineNumber, u); - o = g, m && i.emitViewEvent(m), f && (i.emitViewEvent(f), this.viewLayout.onLinesInserted(f.fromLineNumber, f.toLineNumber)), b && (i.emitViewEvent(b), this.viewLayout.onLinesDeleted(b.fromLineNumber, b.toLineNumber)); + const u = a.dequeue(), [m, b, g, Z] = this._lines.onModelLineChanged(r, h.lineNumber, u); + o = m, b && i.emitViewEvent(b), g && (i.emitViewEvent(g), this.viewLayout.onLinesInserted(g.fromLineNumber, g.toLineNumber)), Z && (i.emitViewEvent(Z), this.viewLayout.onLinesDeleted(Z.fromLineNumber, Z.toLineNumber)); break; } case 5: break; } - l !== null && this._lines.acceptVersionId(l), this.viewLayout.onHeightMaybeChanged(), !n && o && (i.emitViewEvent(new fS()), i.emitViewEvent(new du(null)), this._cursor.onLineMappingChanged(i), this._decorations.onLineMappingChanged()); + r !== null && this._lines.acceptVersionId(r), this.viewLayout.onHeightMaybeChanged(), !n && o && (i.emitViewEvent(new R1()), i.emitViewEvent(new bu(null)), this._cursor.onLineMappingChanged(i), this._decorations.onLineMappingChanged()); } finally { this._eventDispatcher.endEmitViewEvents(); } @@ -41466,7 +41466,7 @@ let Bce = class extends R { } try { const i = this._eventDispatcher.beginEmitViewEvents(); - e instanceof hg && i.emitOutgoingEvent(new wce(e.contentChangedEvent)), this._cursor.onModelContentChanged(i, e); + e instanceof gm && i.emitOutgoingEvent(new hae(e.contentChangedEvent)), this._cursor.onModelContentChanged(i, e); } finally { this._eventDispatcher.endEmitViewEvents(); } @@ -41474,34 +41474,34 @@ let Bce = class extends R { })), this._register(this.model.onDidChangeTokens((e) => { const t = []; for (let i = 0, n = e.ranges.length; i < n; i++) { - const o = e.ranges[i], r = this.coordinatesConverter.convertModelPositionToViewPosition(new V(o.fromLineNumber, 1)).lineNumber, l = this.coordinatesConverter.convertModelPositionToViewPosition(new V(o.toLineNumber, this.model.getLineMaxColumn(o.toLineNumber))).lineNumber; + const o = e.ranges[i], l = this.coordinatesConverter.convertModelPositionToViewPosition(new Y(o.fromLineNumber, 1)).lineNumber, r = this.coordinatesConverter.convertModelPositionToViewPosition(new Y(o.toLineNumber, this.model.getLineMaxColumn(o.toLineNumber))).lineNumber; t[i] = { - fromLineNumber: r, - toLineNumber: l + fromLineNumber: l, + toLineNumber: r }; } - this._eventDispatcher.emitSingleViewEvent(new ace(t)), this._eventDispatcher.emitOutgoingEvent(new Sce(e)); + this._eventDispatcher.emitSingleViewEvent(new eae(t)), this._eventDispatcher.emitOutgoingEvent(new mae(e)); })), this._register(this.model.onDidChangeLanguageConfiguration((e) => { - this._eventDispatcher.emitSingleViewEvent(new oce()), this.cursorConfig = new np(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService), this._cursor.updateConfiguration(this.cursorConfig), this._eventDispatcher.emitOutgoingEvent(new yce(e)); + this._eventDispatcher.emitSingleViewEvent(new jde()), this.cursorConfig = new cp(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService), this._cursor.updateConfiguration(this.cursorConfig), this._eventDispatcher.emitOutgoingEvent(new aae(e)); })), this._register(this.model.onDidChangeLanguage((e) => { - this.cursorConfig = new np(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService), this._cursor.updateConfiguration(this.cursorConfig), this._eventDispatcher.emitOutgoingEvent(new bce(e)); + this.cursorConfig = new cp(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService), this._cursor.updateConfiguration(this.cursorConfig), this._eventDispatcher.emitOutgoingEvent(new dae(e)); })), this._register(this.model.onDidChangeOptions((e) => { if (this._lines.setTabSize(this.model.getOptions().tabSize)) { try { const t = this._eventDispatcher.beginEmitViewEvents(); - t.emitViewEvent(new pS()), t.emitViewEvent(new fS()), t.emitViewEvent(new du(null)), this._cursor.onLineMappingChanged(t), this._decorations.onLineMappingChanged(), this.viewLayout.onFlushed(this.getLineCount()); + t.emitViewEvent(new C1()), t.emitViewEvent(new R1()), t.emitViewEvent(new bu(null)), this._cursor.onLineMappingChanged(t), this._decorations.onLineMappingChanged(), this.viewLayout.onFlushed(this.getLineCount()); } finally { this._eventDispatcher.endEmitViewEvents(); } this._updateConfigurationViewLineCount.schedule(); } - this.cursorConfig = new np(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService), this._cursor.updateConfiguration(this.cursorConfig), this._eventDispatcher.emitOutgoingEvent(new Cce(e)); + this.cursorConfig = new cp(this.model.getLanguageId(), this.model.getOptions(), this._configuration, this.languageConfigurationService), this._cursor.updateConfiguration(this.cursorConfig), this._eventDispatcher.emitOutgoingEvent(new uae(e)); })), this._register(this.model.onDidChangeDecorations((e) => { - this._decorations.onModelDecorationsChanged(), this._eventDispatcher.emitSingleViewEvent(new du(e)), this._eventDispatcher.emitOutgoingEvent(new fce(e)); + this._decorations.onModelDecorationsChanged(), this._eventDispatcher.emitSingleViewEvent(new bu(e)), this._eventDispatcher.emitOutgoingEvent(new cae(e)); })); } setHiddenAreas(e, t) { - var r; + var l; this.hiddenAreasModel.setHiddenAreas(t, e); const i = this.hiddenAreasModel.getMergedRanges(); if (i === this.previousHiddenAreas) @@ -41510,14 +41510,14 @@ let Bce = class extends R { const n = this._captureStableViewport(); let o = !1; try { - const l = this._eventDispatcher.beginEmitViewEvents(); - o = this._lines.setHiddenAreas(i), o && (l.emitViewEvent(new pS()), l.emitViewEvent(new fS()), l.emitViewEvent(new du(null)), this._cursor.onLineMappingChanged(l), this._decorations.onLineMappingChanged(), this.viewLayout.onFlushed(this.getLineCount()), this.viewLayout.onHeightMaybeChanged()); - const a = (r = n.viewportStartModelPosition) == null ? void 0 : r.lineNumber; - a && i.some((d) => d.startLineNumber <= a && a <= d.endLineNumber) || n.recoverViewportStart(this.coordinatesConverter, this.viewLayout); + const r = this._eventDispatcher.beginEmitViewEvents(); + o = this._lines.setHiddenAreas(i), o && (r.emitViewEvent(new C1()), r.emitViewEvent(new R1()), r.emitViewEvent(new bu(null)), this._cursor.onLineMappingChanged(r), this._decorations.onLineMappingChanged(), this.viewLayout.onFlushed(this.getLineCount()), this.viewLayout.onHeightMaybeChanged()); + const c = (l = n.viewportStartModelPosition) == null ? void 0 : l.lineNumber; + c && i.some((a) => a.startLineNumber <= c && c <= a.endLineNumber) || n.recoverViewportStart(this.coordinatesConverter, this.viewLayout); } finally { this._eventDispatcher.endEmitViewEvents(); } - this._updateConfigurationViewLineCount.schedule(), o && this._eventDispatcher.emitOutgoingEvent(new mce()); + this._updateConfigurationViewLineCount.schedule(), o && this._eventDispatcher.emitOutgoingEvent(new lae()); } getVisibleRangesPlusViewportAboveBelow() { const e = this._configuration.options.get( @@ -41526,8 +41526,8 @@ let Bce = class extends R { ), t = this._configuration.options.get( 67 /* EditorOption.lineHeight */ - ), i = Math.max(20, Math.round(e.height / t)), n = this.viewLayout.getLinesViewportData(), o = Math.max(1, n.completelyVisibleStartLineNumber - i), r = Math.min(this.getLineCount(), n.completelyVisibleEndLineNumber + i); - return this._toModelVisibleRanges(new M(o, this.getLineMinColumn(o), r, this.getLineMaxColumn(r))); + ), i = Math.max(20, Math.round(e.height / t)), n = this.viewLayout.getLinesViewportData(), o = Math.max(1, n.completelyVisibleStartLineNumber - i), l = Math.min(this.getLineCount(), n.completelyVisibleEndLineNumber + i); + return this._toModelVisibleRanges(new I(o, this.getLineMinColumn(o), l, this.getLineMaxColumn(l))); } getVisibleRanges() { const e = this.getCompletelyVisibleViewRange(); @@ -41541,24 +41541,24 @@ let Bce = class extends R { if (i.length === 0) return [t]; const n = []; - let o = 0, r = t.startLineNumber, l = t.startColumn; - const a = t.endLineNumber, c = t.endColumn; - for (let d = 0, h = i.length; d < h; d++) { - const u = i[d].startLineNumber, g = i[d].endLineNumber; - g < r || u > a || (r < u && (n[o++] = new M(r, l, u - 1, this.model.getLineMaxColumn(u - 1))), r = g + 1, l = 1); + let o = 0, l = t.startLineNumber, r = t.startColumn; + const c = t.endLineNumber, d = t.endColumn; + for (let a = 0, h = i.length; a < h; a++) { + const u = i[a].startLineNumber, m = i[a].endLineNumber; + m < l || u > c || (l < u && (n[o++] = new I(l, r, u - 1, this.model.getLineMaxColumn(u - 1))), l = m + 1, r = 1); } - return (r < a || r === a && l < c) && (n[o++] = new M(r, l, a, c)), n; + return (l < c || l === c && r < d) && (n[o++] = new I(l, r, c, d)), n; } getCompletelyVisibleViewRange() { const e = this.viewLayout.getLinesViewportData(), t = e.completelyVisibleStartLineNumber, i = e.completelyVisibleEndLineNumber; - return new M(t, this.getLineMinColumn(t), i, this.getLineMaxColumn(i)); + return new I(t, this.getLineMinColumn(t), i, this.getLineMaxColumn(i)); } getCompletelyVisibleViewRangeAtScrollTop(e) { const t = this.viewLayout.getLinesViewportDataAtScrollTop(e), i = t.completelyVisibleStartLineNumber, n = t.completelyVisibleEndLineNumber; - return new M(i, this.getLineMinColumn(i), n, this.getLineMaxColumn(n)); + return new I(i, this.getLineMinColumn(i), n, this.getLineMaxColumn(n)); } saveState() { - const e = this.viewLayout.saveState(), t = e.scrollTop, i = this.viewLayout.getLineNumberAtVerticalOffset(t), n = this.coordinatesConverter.convertViewPositionToModelPosition(new V(i, this.getLineMinColumn(i))), o = this.viewLayout.getVerticalOffsetForLineNumber(i) - t; + const e = this.viewLayout.saveState(), t = e.scrollTop, i = this.viewLayout.getLineNumberAtVerticalOffset(t), n = this.coordinatesConverter.convertViewPositionToModelPosition(new Y(i, this.getLineMinColumn(i))), o = this.viewLayout.getVerticalOffsetForLineNumber(i) - t; return { scrollLeft: e.scrollLeft, firstPosition: n, @@ -41614,11 +41614,11 @@ let Bce = class extends R { return this._lines.getViewLineMaxColumn(e); } getLineFirstNonWhitespaceColumn(e) { - const t = qn(this.getLineContent(e)); + const t = es(this.getLineContent(e)); return t === -1 ? 0 : t + 1; } getLineLastNonWhitespaceColumn(e) { - const t = Ml(this.getLineContent(e)); + const t = Rr(this.getLineContent(e)); return t === -1 ? 0 : t + 2; } getMinimapDecorationsInRange(e) { @@ -41639,30 +41639,30 @@ let Bce = class extends R { return this._getViewLineRenderingData(e, t); } _getViewLineRenderingData(e, t) { - const i = this.model.mightContainRTL(), n = this.model.mightContainNonBasicASCII(), o = this.getTabSize(), r = this._lines.getViewLineData(e); - return r.inlineDecorations && (t = [ + const i = this.model.mightContainRTL(), n = this.model.mightContainNonBasicASCII(), o = this.getTabSize(), l = this._lines.getViewLineData(e); + return l.inlineDecorations && (t = [ ...t, - ...r.inlineDecorations.map((l) => l.toInlineDecoration(e)) - ]), new Oo(r.minColumn, r.maxColumn, r.content, r.continuesWithWrappedLine, i, n, r.tokens, t, o, r.startVisibleColumn); + ...l.inlineDecorations.map((r) => r.toInlineDecoration(e)) + ]), new Bo(l.minColumn, l.maxColumn, l.content, l.continuesWithWrappedLine, i, n, l.tokens, t, o, l.startVisibleColumn); } getViewLineData(e) { return this._lines.getViewLineData(e); } getMinimapLinesRenderingData(e, t, i) { const n = this._lines.getViewLinesData(e, t, i); - return new Yre(this.getTabSize(), n); + return new Mre(this.getTabSize(), n); } getAllOverviewRulerDecorations(e) { - const t = this.model.getOverviewRulerDecorations(this._editorId, xA(this._configuration.options)), i = new Oce(); + const t = this.model.getOverviewRulerDecorations(this._editorId, EV(this._configuration.options)), i = new Jae(); for (const n of t) { - const o = n.options, r = o.overviewRuler; - if (!r) + const o = n.options, l = o.overviewRuler; + if (!l) continue; - const l = r.position; - if (l === 0) + const r = l.position; + if (r === 0) continue; - const a = r.getColor(e.value), c = this.coordinatesConverter.getViewLineNumberOfModelPosition(n.range.startLineNumber, n.range.startColumn), d = this.coordinatesConverter.getViewLineNumberOfModelPosition(n.range.endLineNumber, n.range.endColumn); - i.accept(a, o.zIndex, c, d, l); + const c = l.getColor(e.value), d = this.coordinatesConverter.getViewLineNumberOfModelPosition(n.range.startLineNumber, n.range.startColumn), a = this.coordinatesConverter.getViewLineNumberOfModelPosition(n.range.endLineNumber, n.range.endColumn); + i.accept(c, o.zIndex, d, a, r); } return i.asArray; } @@ -41690,88 +41690,88 @@ let Bce = class extends R { deduceModelPositionRelativeToViewPosition(e, t, i) { const n = this.coordinatesConverter.convertViewPositionToModelPosition(e); this.model.getEOL().length === 2 && (t < 0 ? t -= i : t += i); - const r = this.model.getOffsetAt(n) + t; - return this.model.getPositionAt(r); + const l = this.model.getOffsetAt(n) + t; + return this.model.getPositionAt(l); } getPlainTextToCopy(e, t, i) { const n = i ? `\r ` : this.model.getEOL(); - e = e.slice(0), e.sort(M.compareRangesUsingStarts); - let o = !1, r = !1; - for (const a of e) - a.isEmpty() ? o = !0 : r = !0; - if (!r) { + e = e.slice(0), e.sort(I.compareRangesUsingStarts); + let o = !1, l = !1; + for (const c of e) + c.isEmpty() ? o = !0 : l = !0; + if (!l) { if (!t) return ""; - const a = e.map((d) => d.startLineNumber); - let c = ""; - for (let d = 0; d < a.length; d++) - d > 0 && a[d - 1] === a[d] || (c += this.model.getLineContent(a[d]) + n); - return c; + const c = e.map((a) => a.startLineNumber); + let d = ""; + for (let a = 0; a < c.length; a++) + a > 0 && c[a - 1] === c[a] || (d += this.model.getLineContent(c[a]) + n); + return d; } if (o && t) { - const a = []; - let c = 0; - for (const d of e) { - const h = d.startLineNumber; - d.isEmpty() ? h !== c && a.push(this.model.getLineContent(h)) : a.push(this.model.getValueInRange( - d, + const c = []; + let d = 0; + for (const a of e) { + const h = a.startLineNumber; + a.isEmpty() ? h !== d && c.push(this.model.getLineContent(h)) : c.push(this.model.getValueInRange( + a, i ? 2 : 0 /* EndOfLinePreference.TextDefined */ - )), c = h; + )), d = h; } - return a.length === 1 ? a[0] : a; + return c.length === 1 ? c[0] : c; } - const l = []; - for (const a of e) - a.isEmpty() || l.push(this.model.getValueInRange( - a, + const r = []; + for (const c of e) + c.isEmpty() || r.push(this.model.getValueInRange( + c, i ? 2 : 0 /* EndOfLinePreference.TextDefined */ )); - return l.length === 1 ? l[0] : l; + return r.length === 1 ? r[0] : r; } getRichTextToCopy(e, t) { const i = this.model.getLanguageId(); - if (i === ms || e.length !== 1) + if (i === gs || e.length !== 1) return null; let n = e[0]; if (n.isEmpty()) { if (!t) return null; - const d = n.startLineNumber; - n = new M(d, this.model.getLineMinColumn(d), d, this.model.getLineMaxColumn(d)); + const a = n.startLineNumber; + n = new I(a, this.model.getLineMinColumn(a), a, this.model.getLineMaxColumn(a)); } const o = this._configuration.options.get( 50 /* EditorOption.fontInfo */ - ), r = this._getColorMap(), a = /[:;\\\/<>]/.test(o.fontFamily) || o.fontFamily === ps.fontFamily; - let c; - return a ? c = ps.fontFamily : (c = o.fontFamily, c = c.replace(/"/g, "'"), /[,']/.test(c) || /[+ ]/.test(c) && (c = `'${c}'`), c = `${c}, ${ps.fontFamily}`), { + ), l = this._getColorMap(), c = /[:;\\\/<>]/.test(o.fontFamily) || o.fontFamily === Zs.fontFamily; + let d; + return c ? d = Zs.fontFamily : (d = o.fontFamily, d = d.replace(/"/g, "'"), /[,']/.test(d) || /[+ ]/.test(d) && (d = `'${d}'`), d = `${d}, ${Zs.fontFamily}`), { mode: i, - html: `
` + this._getHTMLToCopy(n, r) + "
" + ]};font-family: ${d};font-weight: ${o.fontWeight};font-size: ${o.fontSize}px;line-height: ${o.lineHeight}px;white-space: pre;">` + this._getHTMLToCopy(n, l) + "" }; } _getHTMLToCopy(e, t) { - const i = e.startLineNumber, n = e.startColumn, o = e.endLineNumber, r = e.endColumn, l = this.getTabSize(); - let a = ""; - for (let c = i; c <= o; c++) { - const d = this.model.tokenization.getLineTokens(c), h = d.getLineContent(), u = c === i ? n - 1 : 0, g = c === o ? r - 1 : h.length; - h === "" ? a += "
" : a += Zce(h, d.inflate(), t, u, g, l, kn); + const i = e.startLineNumber, n = e.startColumn, o = e.endLineNumber, l = e.endColumn, r = this.getTabSize(); + let c = ""; + for (let d = i; d <= o; d++) { + const a = this.model.tokenization.getLineTokens(d), h = a.getLineContent(), u = d === i ? n - 1 : 0, m = d === o ? l - 1 : h.length; + h === "" ? c += "
" : c += fae(h, a.inflate(), t, u, m, r, Jn); } - return a; + return c; } _getColorMap() { - const e = Wi.getColorMap(), t = ["#000000"]; + const e = Ti.getColorMap(), t = ["#000000"]; if (e) for (let i = 1, n = e.length; i < n; i++) - t[i] = K.Format.CSS.formatHex(e[i]); + t[i] = Q.Format.CSS.formatHex(e[i]); return t; } //#region cursor operations @@ -41822,7 +41822,7 @@ let Bce = class extends R { } _executeCursorEdit(e) { if (this._cursor.context.cursorConfig.readOnly) { - this._eventDispatcher.emitOutgoingEvent(new pce()); + this._eventDispatcher.emitOutgoingEvent(new rae()); return; } this._withViewEventsCollector(e); @@ -41840,7 +41840,7 @@ let Bce = class extends R { this._executeCursorEdit((i) => this._cursor.type(i, e, t)); } compositionType(e, t, i, n, o) { - this._executeCursorEdit((r) => this._cursor.compositionType(r, e, t, i, n, o)); + this._executeCursorEdit((l) => this._cursor.compositionType(l, e, t, i, n, o)); } paste(e, t, i, n) { this._executeCursorEdit((o) => this._cursor.paste(o, e, t, i, n)); @@ -41877,8 +41877,8 @@ let Bce = class extends R { )); } revealTopMostCursor(e) { - const t = this._cursor.getTopMostViewPosition(), i = new M(t.lineNumber, t.column, t.lineNumber, t.column); - this._withViewEventsCollector((n) => n.emitViewEvent(new zy( + const t = this._cursor.getTopMostViewPosition(), i = new I(t.lineNumber, t.column, t.lineNumber, t.column); + this._withViewEventsCollector((n) => n.emitViewEvent(new $f( e, !1, i, @@ -41890,8 +41890,8 @@ let Bce = class extends R { ))); } revealBottomMostCursor(e) { - const t = this._cursor.getBottomMostViewPosition(), i = new M(t.lineNumber, t.column, t.lineNumber, t.column); - this._withViewEventsCollector((n) => n.emitViewEvent(new zy( + const t = this._cursor.getBottomMostViewPosition(), i = new I(t.lineNumber, t.column, t.lineNumber, t.column); + this._withViewEventsCollector((n) => n.emitViewEvent(new $f( e, !1, i, @@ -41903,12 +41903,12 @@ let Bce = class extends R { ))); } revealRange(e, t, i, n, o) { - this._withViewEventsCollector((r) => r.emitViewEvent(new zy(e, !1, i, null, n, t, o))); + this._withViewEventsCollector((l) => l.emitViewEvent(new $f(e, !1, i, null, n, t, o))); } //#endregion //#region viewLayout changeWhitespace(e) { - this.viewLayout.changeWhitespace(e) && (this._eventDispatcher.emitSingleViewEvent(new dce()), this._eventDispatcher.emitOutgoingEvent(new gce())); + this.viewLayout.changeWhitespace(e) && (this._eventDispatcher.emitSingleViewEvent(new iae()), this._eventDispatcher.emitOutgoingEvent(new oae())); } //#endregion _withViewEventsCollector(e) { @@ -41937,15 +41937,15 @@ let Bce = class extends R { return this._lines.getLineIndentColumn(e); } }; -class SX { +class PJ { static create(e) { const t = e._setTrackedRange( null, - new M(1, 1, 1, 1), + new I(1, 1, 1, 1), 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ ); - return new SX(e, 1, !1, t, 0); + return new PJ(e, 1, !1, t, 0); } get viewLineNumber() { return this._viewLineNumber; @@ -41971,44 +41971,44 @@ class SX { ); } update(e, t) { - const i = e.coordinatesConverter.convertViewPositionToModelPosition(new V(t, e.getLineMinColumn(t))), n = e.model._setTrackedRange( + const i = e.coordinatesConverter.convertViewPositionToModelPosition(new Y(t, e.getLineMinColumn(t))), n = e.model._setTrackedRange( this._modelTrackedRange, - new M(i.lineNumber, i.column, i.lineNumber, i.column), + new I(i.lineNumber, i.column, i.lineNumber, i.column), 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ - ), o = e.viewLayout.getVerticalOffsetForLineNumber(t), r = e.viewLayout.getCurrentScrollTop(); - this._viewLineNumber = t, this._isValid = !0, this._modelTrackedRange = n, this._startLineDelta = r - o; + ), o = e.viewLayout.getVerticalOffsetForLineNumber(t), l = e.viewLayout.getCurrentScrollTop(); + this._viewLineNumber = t, this._isValid = !0, this._modelTrackedRange = n, this._startLineDelta = l - o; } invalidate() { this._isValid = !1; } } -class Oce { +class Jae { constructor() { this._asMap = /* @__PURE__ */ Object.create(null), this.asArray = []; } accept(e, t, i, n, o) { - const r = this._asMap[e]; - if (r) { - const l = r.data, a = l[l.length - 3], c = l[l.length - 1]; - if (a === o && c + 1 >= i) { - n > c && (l[l.length - 1] = n); + const l = this._asMap[e]; + if (l) { + const r = l.data, c = r[r.length - 3], d = r[r.length - 1]; + if (c === o && d + 1 >= i) { + n > d && (r[r.length - 1] = n); return; } - l.push(o, i, n); + r.push(o, i, n); } else { - const l = new s1(e, t, [o, i, n]); - this._asMap[e] = l, this.asArray.push(l); + const r = new gW(e, t, [o, i, n]); + this._asMap[e] = r, this.asArray.push(r); } } } -class Hce { +class Hae { constructor() { this.hiddenAreas = /* @__PURE__ */ new Map(), this.shouldRecompute = !1, this.ranges = []; } setHiddenAreas(e, t) { const i = this.hiddenAreas.get(e); - i && OY(i, t) || (this.hiddenAreas.set(e, t), this.shouldRecompute = !0); + i && gz(i, t) || (this.hiddenAreas.set(e, t), this.shouldRecompute = !0); } /** * The returned array is immutable. @@ -42017,22 +42017,22 @@ class Hce { if (!this.shouldRecompute) return this.ranges; this.shouldRecompute = !1; - const e = Array.from(this.hiddenAreas.values()).reduce((t, i) => Jce(t, i), []); - return OY(this.ranges, e) ? this.ranges : (this.ranges = e, this.ranges); + const e = Array.from(this.hiddenAreas.values()).reduce((t, i) => Eae(t, i), []); + return gz(this.ranges, e) ? this.ranges : (this.ranges = e, this.ranges); } } -function Jce(s, e) { +function Eae(s, e) { const t = []; let i = 0, n = 0; for (; i < s.length && n < e.length; ) { - const o = s[i], r = e[n]; - if (o.endLineNumber < r.startLineNumber - 1) + const o = s[i], l = e[n]; + if (o.endLineNumber < l.startLineNumber - 1) t.push(s[i++]); - else if (r.endLineNumber < o.startLineNumber - 1) + else if (l.endLineNumber < o.startLineNumber - 1) t.push(e[n++]); else { - const l = Math.min(o.startLineNumber, r.startLineNumber), a = Math.max(o.endLineNumber, r.endLineNumber); - t.push(new M(l, 1, a, 1)), i++, n++; + const r = Math.min(o.startLineNumber, l.startLineNumber), c = Math.max(o.endLineNumber, l.endLineNumber); + t.push(new I(r, 1, c, 1)), i++, n++; } } for (; i < s.length; ) @@ -42041,7 +42041,7 @@ function Jce(s, e) { t.push(e[n++]); return t; } -function OY(s, e) { +function gz(s, e) { if (s.length !== e.length) return !1; for (let t = 0; t < s.length; t++) @@ -42049,7 +42049,7 @@ function OY(s, e) { return !1; return !0; } -class HY { +class Zz { constructor(e, t) { this.viewportStartModelPosition = e, this.startLineDelta = t; } @@ -42064,7 +42064,7 @@ class HY { ); } } -class l0 { +class m0 { constructor(...e) { this._entries = /* @__PURE__ */ new Map(); for (const [t, i] of e) @@ -42078,18 +42078,18 @@ class l0 { return this._entries.get(e); } } -var g1; +var IW; (function(s) { s[s.Ignore = 0] = "Ignore", s[s.Info = 1] = "Info", s[s.Warning = 2] = "Warning", s[s.Error = 3] = "Error"; -})(g1 || (g1 = {})); +})(IW || (IW = {})); (function(s) { const e = "error", t = "warning", i = "warn", n = "info", o = "ignore"; - function r(a) { - return a ? Tp(e, a) ? s.Error : Tp(t, a) || Tp(i, a) ? s.Warning : Tp(n, a) ? s.Info : s.Ignore : s.Ignore; + function l(c) { + return c ? Hp(e, c) ? s.Error : Hp(t, c) || Hp(i, c) ? s.Warning : Hp(n, c) ? s.Info : s.Ignore : s.Ignore; } - s.fromValue = r; - function l(a) { - switch (a) { + s.fromValue = l; + function r(c) { + switch (c) { case s.Error: return e; case s.Warning: @@ -42100,24 +42100,24 @@ var g1; return o; } } - s.toString = l; -})(g1 || (g1 = {})); -const Mi = g1; -var yI = Mi; -const Vi = $e("notificationService"); -class Uce { + s.toString = r; +})(IW || (IW = {})); +const Si = IW; +var Mx = Si; +const vi = $e("notificationService"); +class Dae { } -var Kce = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Fae = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, ja = function(s, e) { +}, td = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Zu, pg; -let m1 = (pg = class extends R { +}, wu, Wm; +let SW = (Wm = class extends J { //#endregion get isSimpleWidget() { return this._configuration.isSimpleWidget; @@ -42125,54 +42125,54 @@ let m1 = (pg = class extends R { get contextMenuId() { return this._configuration.contextMenuId; } - constructor(e, t, i, n, o, r, l, a, c, d, h, u) { - super(), this.languageConfigurationService = h, this._deliveryQueue = A6(), this._contributions = this._register(new Cle()), this._onDidDispose = this._register(new k()), this.onDidDispose = this._onDidDispose.event, this._onDidChangeModelContent = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeModelContent = this._onDidChangeModelContent.event, this._onDidChangeModelLanguage = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeModelLanguage = this._onDidChangeModelLanguage.event, this._onDidChangeModelLanguageConfiguration = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeModelLanguageConfiguration = this._onDidChangeModelLanguageConfiguration.event, this._onDidChangeModelOptions = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeModelOptions = this._onDidChangeModelOptions.event, this._onDidChangeModelDecorations = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeModelDecorations = this._onDidChangeModelDecorations.event, this._onDidChangeModelTokens = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeModelTokens = this._onDidChangeModelTokens.event, this._onDidChangeConfiguration = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeConfiguration = this._onDidChangeConfiguration.event, this._onWillChangeModel = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onWillChangeModel = this._onWillChangeModel.event, this._onDidChangeModel = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeModel = this._onDidChangeModel.event, this._onDidChangeCursorPosition = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeCursorPosition = this._onDidChangeCursorPosition.event, this._onDidChangeCursorSelection = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeCursorSelection = this._onDidChangeCursorSelection.event, this._onDidAttemptReadOnlyEdit = this._register(new zn(this._contributions, this._deliveryQueue)), this.onDidAttemptReadOnlyEdit = this._onDidAttemptReadOnlyEdit.event, this._onDidLayoutChange = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidLayoutChange = this._onDidLayoutChange.event, this._editorTextFocus = this._register(new JY({ deliveryQueue: this._deliveryQueue })), this.onDidFocusEditorText = this._editorTextFocus.onDidChangeToTrue, this.onDidBlurEditorText = this._editorTextFocus.onDidChangeToFalse, this._editorWidgetFocus = this._register(new JY({ deliveryQueue: this._deliveryQueue })), this.onDidFocusEditorWidget = this._editorWidgetFocus.onDidChangeToTrue, this.onDidBlurEditorWidget = this._editorWidgetFocus.onDidChangeToFalse, this._onWillType = this._register(new zn(this._contributions, this._deliveryQueue)), this.onWillType = this._onWillType.event, this._onDidType = this._register(new zn(this._contributions, this._deliveryQueue)), this.onDidType = this._onDidType.event, this._onDidCompositionStart = this._register(new zn(this._contributions, this._deliveryQueue)), this.onDidCompositionStart = this._onDidCompositionStart.event, this._onDidCompositionEnd = this._register(new zn(this._contributions, this._deliveryQueue)), this.onDidCompositionEnd = this._onDidCompositionEnd.event, this._onDidPaste = this._register(new zn(this._contributions, this._deliveryQueue)), this.onDidPaste = this._onDidPaste.event, this._onMouseUp = this._register(new zn(this._contributions, this._deliveryQueue)), this.onMouseUp = this._onMouseUp.event, this._onMouseDown = this._register(new zn(this._contributions, this._deliveryQueue)), this.onMouseDown = this._onMouseDown.event, this._onMouseDrag = this._register(new zn(this._contributions, this._deliveryQueue)), this.onMouseDrag = this._onMouseDrag.event, this._onMouseDrop = this._register(new zn(this._contributions, this._deliveryQueue)), this.onMouseDrop = this._onMouseDrop.event, this._onMouseDropCanceled = this._register(new zn(this._contributions, this._deliveryQueue)), this.onMouseDropCanceled = this._onMouseDropCanceled.event, this._onDropIntoEditor = this._register(new zn(this._contributions, this._deliveryQueue)), this.onDropIntoEditor = this._onDropIntoEditor.event, this._onContextMenu = this._register(new zn(this._contributions, this._deliveryQueue)), this.onContextMenu = this._onContextMenu.event, this._onMouseMove = this._register(new zn(this._contributions, this._deliveryQueue)), this.onMouseMove = this._onMouseMove.event, this._onMouseLeave = this._register(new zn(this._contributions, this._deliveryQueue)), this.onMouseLeave = this._onMouseLeave.event, this._onMouseWheel = this._register(new zn(this._contributions, this._deliveryQueue)), this.onMouseWheel = this._onMouseWheel.event, this._onKeyUp = this._register(new zn(this._contributions, this._deliveryQueue)), this.onKeyUp = this._onKeyUp.event, this._onKeyDown = this._register(new zn(this._contributions, this._deliveryQueue)), this.onKeyDown = this._onKeyDown.event, this._onDidContentSizeChange = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidContentSizeChange = this._onDidContentSizeChange.event, this._onDidScrollChange = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidScrollChange = this._onDidScrollChange.event, this._onDidChangeViewZones = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeViewZones = this._onDidChangeViewZones.event, this._onDidChangeHiddenAreas = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeHiddenAreas = this._onDidChangeHiddenAreas.event, this._updateCounter = 0, this._onBeginUpdate = this._register(new k()), this.onBeginUpdate = this._onBeginUpdate.event, this._onEndUpdate = this._register(new k()), this.onEndUpdate = this._onEndUpdate.event, this._actions = /* @__PURE__ */ new Map(), this._bannerDomNode = null, this._dropIntoEditorDecorations = this.createDecorationsCollection(), o.willCreateCodeEditor(); - const g = { ...t }; - this._domElement = e, this._overflowWidgetsDomNode = g.overflowWidgetsDomNode, delete g.overflowWidgetsDomNode, this._id = ++Qce, this._decorationTypeKeysToIds = {}, this._decorationTypeSubtypes = {}, this._telemetryData = i.telemetryData, this._configuration = this._register(this._createConfiguration(i.isSimpleWidget || !1, i.contextMenuId ?? (i.isSimpleWidget ? pe.SimpleEditorContext : pe.EditorContext), g, d)), this._register(this._configuration.onDidChange((b) => { - this._onDidChangeConfiguration.fire(b); - const y = this._configuration.options; - if (b.hasChanged( + constructor(e, t, i, n, o, l, r, c, d, a, h, u) { + super(), this.languageConfigurationService = h, this._deliveryQueue = pq(), this._contributions = this._register(new uce()), this._onDidDispose = this._register(new k()), this.onDidDispose = this._onDidDispose.event, this._onDidChangeModelContent = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeModelContent = this._onDidChangeModelContent.event, this._onDidChangeModelLanguage = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeModelLanguage = this._onDidChangeModelLanguage.event, this._onDidChangeModelLanguageConfiguration = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeModelLanguageConfiguration = this._onDidChangeModelLanguageConfiguration.event, this._onDidChangeModelOptions = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeModelOptions = this._onDidChangeModelOptions.event, this._onDidChangeModelDecorations = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeModelDecorations = this._onDidChangeModelDecorations.event, this._onDidChangeModelTokens = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeModelTokens = this._onDidChangeModelTokens.event, this._onDidChangeConfiguration = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeConfiguration = this._onDidChangeConfiguration.event, this._onWillChangeModel = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onWillChangeModel = this._onWillChangeModel.event, this._onDidChangeModel = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeModel = this._onDidChangeModel.event, this._onDidChangeCursorPosition = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeCursorPosition = this._onDidChangeCursorPosition.event, this._onDidChangeCursorSelection = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeCursorSelection = this._onDidChangeCursorSelection.event, this._onDidAttemptReadOnlyEdit = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onDidAttemptReadOnlyEdit = this._onDidAttemptReadOnlyEdit.event, this._onDidLayoutChange = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidLayoutChange = this._onDidLayoutChange.event, this._editorTextFocus = this._register(new fz({ deliveryQueue: this._deliveryQueue })), this.onDidFocusEditorText = this._editorTextFocus.onDidChangeToTrue, this.onDidBlurEditorText = this._editorTextFocus.onDidChangeToFalse, this._editorWidgetFocus = this._register(new fz({ deliveryQueue: this._deliveryQueue })), this.onDidFocusEditorWidget = this._editorWidgetFocus.onDidChangeToTrue, this.onDidBlurEditorWidget = this._editorWidgetFocus.onDidChangeToFalse, this._onWillType = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onWillType = this._onWillType.event, this._onDidType = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onDidType = this._onDidType.event, this._onDidCompositionStart = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onDidCompositionStart = this._onDidCompositionStart.event, this._onDidCompositionEnd = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onDidCompositionEnd = this._onDidCompositionEnd.event, this._onDidPaste = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onDidPaste = this._onDidPaste.event, this._onMouseUp = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onMouseUp = this._onMouseUp.event, this._onMouseDown = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onMouseDown = this._onMouseDown.event, this._onMouseDrag = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onMouseDrag = this._onMouseDrag.event, this._onMouseDrop = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onMouseDrop = this._onMouseDrop.event, this._onMouseDropCanceled = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onMouseDropCanceled = this._onMouseDropCanceled.event, this._onDropIntoEditor = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onDropIntoEditor = this._onDropIntoEditor.event, this._onContextMenu = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onContextMenu = this._onContextMenu.event, this._onMouseMove = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onMouseMove = this._onMouseMove.event, this._onMouseLeave = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onMouseLeave = this._onMouseLeave.event, this._onMouseWheel = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onMouseWheel = this._onMouseWheel.event, this._onKeyUp = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onKeyUp = this._onKeyUp.event, this._onKeyDown = this._register(new Kn(this._contributions, this._deliveryQueue)), this.onKeyDown = this._onKeyDown.event, this._onDidContentSizeChange = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidContentSizeChange = this._onDidContentSizeChange.event, this._onDidScrollChange = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidScrollChange = this._onDidScrollChange.event, this._onDidChangeViewZones = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeViewZones = this._onDidChangeViewZones.event, this._onDidChangeHiddenAreas = this._register(new k({ deliveryQueue: this._deliveryQueue })), this.onDidChangeHiddenAreas = this._onDidChangeHiddenAreas.event, this._updateCounter = 0, this._onBeginUpdate = this._register(new k()), this.onBeginUpdate = this._onBeginUpdate.event, this._onEndUpdate = this._register(new k()), this.onEndUpdate = this._onEndUpdate.event, this._actions = /* @__PURE__ */ new Map(), this._bannerDomNode = null, this._dropIntoEditorDecorations = this.createDecorationsCollection(), o.willCreateCodeEditor(); + const m = { ...t }; + this._domElement = e, this._overflowWidgetsDomNode = m.overflowWidgetsDomNode, delete m.overflowWidgetsDomNode, this._id = ++zae, this._decorationTypeKeysToIds = {}, this._decorationTypeSubtypes = {}, this._telemetryData = i.telemetryData, this._configuration = this._register(this._createConfiguration(i.isSimpleWidget || !1, i.contextMenuId ?? (i.isSimpleWidget ? pe.SimpleEditorContext : pe.EditorContext), m, a)), this._register(this._configuration.onDidChange((Z) => { + this._onDidChangeConfiguration.fire(Z); + const f = this._configuration.options; + if (Z.hasChanged( 146 /* EditorOption.layoutInfo */ )) { - const w = y.get( + const y = f.get( 146 /* EditorOption.layoutInfo */ ); - this._onDidLayoutChange.fire(w); + this._onDidLayoutChange.fire(y); } - })), this._contextKeyService = this._register(l.createScoped(this._domElement)), this._notificationService = c, this._codeEditorService = o, this._commandService = r, this._themeService = a, this._register(new qce(this, this._contextKeyService)), this._register(new $ce(this, this._contextKeyService, u)), this._instantiationService = this._register(n.createChild(new l0([_e, this._contextKeyService]))), this._modelData = null, this._focusTracker = new ede(e, this._overflowWidgetsDomNode), this._register(this._focusTracker.onChange(() => { + })), this._contextKeyService = this._register(r.createScoped(this._domElement)), this._notificationService = d, this._codeEditorService = o, this._commandService = l, this._themeService = c, this._register(new Kae(this, this._contextKeyService)), this._register(new Uae(this, this._contextKeyService, u)), this._instantiationService = this._register(n.createChild(new m0([xe, this._contextKeyService]))), this._modelData = null, this._focusTracker = new Pae(e, this._overflowWidgetsDomNode), this._register(this._focusTracker.onChange(() => { this._editorWidgetFocus.setValue(this._focusTracker.hasFocus()); })), this._contentWidgets = {}, this._overlayWidgets = {}, this._glyphMarginWidgets = {}; - let m; - Array.isArray(i.contributions) ? m = i.contributions : m = rg.getEditorContributions(), this._contributions.initialize(this, m, this._instantiationService); - for (const b of rg.getEditorActions()) { - if (this._actions.has(b.id)) { - De(new Error(`Cannot have two actions with the same id ${b.id}`)); + let b; + Array.isArray(i.contributions) ? b = i.contributions : b = hm.getEditorContributions(), this._contributions.initialize(this, b, this._instantiationService); + for (const Z of hm.getEditorActions()) { + if (this._actions.has(Z.id)) { + Me(new Error(`Cannot have two actions with the same id ${Z.id}`)); continue; } - const y = new HU(b.id, b.label, b.alias, b.metadata, b.precondition ?? void 0, (w) => this._instantiationService.invokeFunction((C) => Promise.resolve(b.runEditorCommand(C, this, w))), this._contextKeyService); - this._actions.set(y.id, y); + const f = new CQ(Z.id, Z.label, Z.alias, Z.metadata, Z.precondition ?? void 0, (y) => this._instantiationService.invokeFunction((W) => Promise.resolve(Z.runEditorCommand(W, this, y))), this._contextKeyService); + this._actions.set(f.id, f); } - const f = () => !this._configuration.options.get( + const g = () => !this._configuration.options.get( 92 /* EditorOption.readOnly */ ) && this._configuration.options.get( 36 /* EditorOption.dropIntoEditor */ ).enabled; - this._register(new u$(this._domElement, { - onDragOver: (b) => { - if (!f()) + this._register(new see(this._domElement, { + onDragOver: (Z) => { + if (!g()) return; - const y = this.getTargetAtClientPoint(b.clientX, b.clientY); - y != null && y.position && this.showDropIndicatorAt(y.position); + const f = this.getTargetAtClientPoint(Z.clientX, Z.clientY); + f != null && f.position && this.showDropIndicatorAt(f.position); }, - onDrop: async (b) => { - if (!f() || (this.removeDropIndicator(), !b.dataTransfer)) + onDrop: async (Z) => { + if (!g() || (this.removeDropIndicator(), !Z.dataTransfer)) return; - const y = this.getTargetAtClientPoint(b.clientX, b.clientY); - y != null && y.position && this._onDropIntoEditor.fire({ position: y.position, event: b }); + const f = this.getTargetAtClientPoint(Z.clientX, Z.clientY); + f != null && f.position && this._onDropIntoEditor.fire({ position: f.position, event: Z }); }, onDragLeave: () => { this.removeDropIndicator(); @@ -42187,13 +42187,13 @@ let m1 = (pg = class extends R { (t = this._modelData) == null || t.view.writeScreenReaderContent(e); } _createConfiguration(e, t, i, n) { - return new q2(e, t, i, this._domElement, n); + return new yw(e, t, i, this._domElement, n); } getId() { return this.getEditorType() + ":" + this._id; } getEditorType() { - return AC.ICodeEditor; + return vG.ICodeEditor; } dispose() { this._codeEditorService.removeCodeEditor(this), this._focusTracker.dispose(), this._actions.clear(), this._contentWidgets = {}, this._overlayWidgets = {}, this._removeDecorationTypes(), this._postDetachModelCleanup(this._detachModel()), this._onDidDispose.fire(), super.dispose(); @@ -42217,7 +42217,7 @@ let m1 = (pg = class extends R { return this._overflowWidgetsDomNode; } getConfiguredWordAtPosition(e) { - return this._modelData ? bt.getWordAtPosition(this._modelData.model, this._configuration.options.get( + return this._modelData ? Zt.getWordAtPosition(this._modelData.model, this._configuration.options.get( 132 /* EditorOption.wordSeparators */ ), this._configuration.options.get( @@ -42258,8 +42258,8 @@ let m1 = (pg = class extends R { newModelUrl: (i == null ? void 0 : i.uri) || null }; this._onWillChangeModel.fire(n); - const o = this.hasTextFocus(), r = this._detachModel(); - this._attachModel(i), o && this.hasModel() && this.focus(), this._removeDecorationTypes(), this._onDidChangeModel.fire(n), this._postDetachModelCleanup(r), this._contributionsDisposable = this._contributions.onAfterModelAttached(); + const o = this.hasTextFocus(), l = this._detachModel(); + this._attachModel(i), o && this.hasModel() && this.focus(), this._removeDecorationTypes(), this._onDidChangeModel.fire(n), this._postDetachModelCleanup(l), this._contributionsDisposable = this._contributions.onAfterModelAttached(); } finally { this._endUpdate(); } @@ -42287,44 +42287,44 @@ let m1 = (pg = class extends R { const o = e.model.validatePosition({ lineNumber: t, column: i - }), r = e.viewModel.coordinatesConverter.convertModelPositionToViewPosition(o); - return e.viewModel.viewLayout.getVerticalOffsetAfterLineNumber(r.lineNumber, n); + }), l = e.viewModel.coordinatesConverter.convertModelPositionToViewPosition(o); + return e.viewModel.viewLayout.getVerticalOffsetAfterLineNumber(l.lineNumber, n); } getTopForLineNumber(e, t = !1) { - return this._modelData ? Zu._getVerticalOffsetForPosition(this._modelData, e, 1, t) : -1; + return this._modelData ? wu._getVerticalOffsetForPosition(this._modelData, e, 1, t) : -1; } getTopForPosition(e, t) { - return this._modelData ? Zu._getVerticalOffsetForPosition(this._modelData, e, t, !1) : -1; + return this._modelData ? wu._getVerticalOffsetForPosition(this._modelData, e, t, !1) : -1; } static _getVerticalOffsetForPosition(e, t, i, n = !1) { const o = e.model.validatePosition({ lineNumber: t, column: i - }), r = e.viewModel.coordinatesConverter.convertModelPositionToViewPosition(o); - return e.viewModel.viewLayout.getVerticalOffsetForLineNumber(r.lineNumber, n); + }), l = e.viewModel.coordinatesConverter.convertModelPositionToViewPosition(o); + return e.viewModel.viewLayout.getVerticalOffsetForLineNumber(l.lineNumber, n); } getBottomForLineNumber(e, t = !1) { if (!this._modelData) return -1; const i = this._modelData.model.getLineMaxColumn(e); - return Zu._getVerticalOffsetAfterPosition(this._modelData, e, i, t); + return wu._getVerticalOffsetAfterPosition(this._modelData, e, i, t); } setHiddenAreas(e, t) { var i; - (i = this._modelData) == null || i.viewModel.setHiddenAreas(e.map((n) => M.lift(n)), t); + (i = this._modelData) == null || i.viewModel.setHiddenAreas(e.map((n) => I.lift(n)), t); } getVisibleColumnFromPosition(e) { if (!this._modelData) return e.column; const t = this._modelData.model.validatePosition(e), i = this._modelData.model.getOptions().tabSize; - return Yi.visibleColumnFromColumn(this._modelData.model.getLineContent(t.lineNumber), t.column, i) + 1; + return zi.visibleColumnFromColumn(this._modelData.model.getLineContent(t.lineNumber), t.column, i) + 1; } getPosition() { return this._modelData ? this._modelData.viewModel.getPosition() : null; } setPosition(e, t = "api") { if (this._modelData) { - if (!V.isIPosition(e)) + if (!Y.isIPosition(e)) throw new Error("Invalid arguments"); this._modelData.viewModel.setSelections(t, [{ selectionStartLineNumber: e.lineNumber, @@ -42337,10 +42337,10 @@ let m1 = (pg = class extends R { _sendRevealRange(e, t, i, n) { if (!this._modelData) return; - if (!M.isIRange(e)) + if (!I.isIRange(e)) throw new Error("Invalid arguments"); - const o = this._modelData.model.validateRange(e), r = this._modelData.viewModel.coordinatesConverter.convertModelRangeToViewRange(o); - this._modelData.viewModel.revealRange("api", i, r, t, n); + const o = this._modelData.model.validateRange(e), l = this._modelData.viewModel.coordinatesConverter.convertModelRangeToViewRange(o); + this._modelData.viewModel.revealRange("api", i, l, t, n); } revealLine(e, t = 0) { this._revealLine(e, 0, t); @@ -42357,7 +42357,7 @@ let m1 = (pg = class extends R { _revealLine(e, t, i) { if (typeof e != "number") throw new Error("Invalid arguments"); - this._sendRevealRange(new M(e, 1, e, 1), t, !1, i); + this._sendRevealRange(new I(e, 1, e, 1), t, !1, i); } revealPosition(e, t = 0) { this._revealPosition(e, 0, !0, t); @@ -42372,9 +42372,9 @@ let m1 = (pg = class extends R { this._revealPosition(e, 5, !0, t); } _revealPosition(e, t, i, n) { - if (!V.isIPosition(e)) + if (!Y.isIPosition(e)) throw new Error("Invalid arguments"); - this._sendRevealRange(new M(e.lineNumber, e.column, e.lineNumber, e.column), t, i, n); + this._sendRevealRange(new I(e.lineNumber, e.column, e.lineNumber, e.column), t, i, n); } getSelection() { return this._modelData ? this._modelData.viewModel.getSelection() : null; @@ -42383,7 +42383,7 @@ let m1 = (pg = class extends R { return this._modelData ? this._modelData.viewModel.getSelections() : null; } setSelection(e, t = "api") { - const i = fe.isISelection(e), n = M.isIRange(e); + const i = ge.isISelection(e), n = I.isIRange(e); if (!i && !n) throw new Error("Invalid arguments"); if (i) @@ -42401,7 +42401,7 @@ let m1 = (pg = class extends R { _setSelectionImpl(e, t) { if (!this._modelData) return; - const i = new fe(e.selectionStartLineNumber, e.selectionStartColumn, e.positionLineNumber, e.positionColumn); + const i = new ge(e.selectionStartLineNumber, e.selectionStartColumn, e.positionLineNumber, e.positionColumn); this._modelData.viewModel.setSelections(t, [i]); } revealLines(e, t, i = 0) { @@ -42419,7 +42419,7 @@ let m1 = (pg = class extends R { _revealLines(e, t, i, n) { if (typeof e != "number" || typeof t != "number") throw new Error("Invalid arguments"); - this._sendRevealRange(new M(e, 1, t, 1), i, !1, n); + this._sendRevealRange(new I(e, 1, t, 1), i, !1, n); } revealRange(e, t = 0, i = !1, n = !0) { this._revealRange(e, i ? 1 : 0, n, t); @@ -42440,16 +42440,16 @@ let m1 = (pg = class extends R { this._revealRange(e, 3, !0, t); } _revealRange(e, t, i, n) { - if (!M.isIRange(e)) + if (!I.isIRange(e)) throw new Error("Invalid arguments"); - this._sendRevealRange(M.lift(e), t, i, n); + this._sendRevealRange(I.lift(e), t, i, n); } setSelections(e, t = "api", i = 0) { if (this._modelData) { if (!e || e.length === 0) throw new Error("Invalid arguments"); for (let n = 0, o = e.length; n < o; n++) - if (!fe.isISelection(e[n])) + if (!ge.isISelection(e[n])) throw new Error("Invalid arguments"); this._modelData.viewModel.setSelections(t, e, i); } @@ -42570,7 +42570,7 @@ let m1 = (pg = class extends R { } const n = this.getAction(t); if (n) { - Promise.resolve(n.run(i)).then(void 0, De); + Promise.resolve(n.run(i)).then(void 0, Me); return; } if (!this._modelData || this._triggerEditorCommand(e, t, i)) @@ -42595,15 +42595,15 @@ let m1 = (pg = class extends R { _compositionType(e, t, i, n, o) { this._modelData && this._modelData.viewModel.compositionType(t, i, n, o, e); } - _paste(e, t, i, n, o, r) { + _paste(e, t, i, n, o, l) { if (!this._modelData) return; - const l = this._modelData.viewModel, a = l.getSelection().getStartPosition(); - l.paste(t, i, n, e); - const c = l.getSelection().getStartPosition(); + const r = this._modelData.viewModel, c = r.getSelection().getStartPosition(); + r.paste(t, i, n, e); + const d = r.getSelection().getStartPosition(); e === "keyboard" && this._onDidPaste.fire({ - clipboardEvent: r, - range: new M(a.lineNumber, a.column, c.lineNumber, c.column), + clipboardEvent: l, + range: new I(c.lineNumber, c.column, d.lineNumber, d.column), languageId: o }); } @@ -42611,9 +42611,9 @@ let m1 = (pg = class extends R { this._modelData && this._modelData.viewModel.cut(e); } _triggerEditorCommand(e, t, i) { - const n = rg.getEditorCommand(t); + const n = hm.getEditorCommand(t); return n ? (i = i || {}, i.source = e, this._instantiationService.invokeFunction((o) => { - Promise.resolve(n.runEditorCommand(o, this, i)).then(void 0, De); + Promise.resolve(n.runEditorCommand(o, this, i)).then(void 0, Me); }), !0) : !1; } _getViewModel() { @@ -42647,16 +42647,16 @@ let m1 = (pg = class extends R { this._modelData && this._modelData.viewModel.executeCommands(t, e); } createDecorationsCollection(e) { - return new tde(this, e); + return new Bae(this, e); } changeDecorations(e) { return this._modelData ? this._modelData.model.changeDecorations(e, this._id) : null; } getLineDecorations(e) { - return this._modelData ? this._modelData.model.getLineDecorations(e, this._id, xA(this._configuration.options)) : null; + return this._modelData ? this._modelData.model.getLineDecorations(e, this._id, EV(this._configuration.options)) : null; } getDecorationsInRange(e) { - return this._modelData ? this._modelData.model.getDecorationsInRange(e, this._id, xA(this._configuration.options)) : null; + return this._modelData ? this._modelData.model.getDecorationsInRange(e, this._id, EV(this._configuration.options)) : null; } /** * @deprecated @@ -42781,10 +42781,10 @@ let m1 = (pg = class extends R { const t = this._modelData.model.validatePosition(e), i = this._configuration.options, n = i.get( 146 /* EditorOption.layoutInfo */ - ), o = Zu._getVerticalOffsetForPosition(this._modelData, t.lineNumber, t.column) - this.getScrollTop(), r = this._modelData.view.getOffsetForColumn(t.lineNumber, t.column) + n.glyphMarginWidth + n.lineNumbersWidth + n.decorationsWidth - this.getScrollLeft(); + ), o = wu._getVerticalOffsetForPosition(this._modelData, t.lineNumber, t.column) - this.getScrollTop(), l = this._modelData.view.getOffsetForColumn(t.lineNumber, t.column) + n.glyphMarginWidth + n.lineNumbersWidth + n.decorationsWidth - this.getScrollLeft(); return { top: o, - left: r, + left: l, height: i.get( 67 /* EditorOption.lineHeight */ @@ -42803,7 +42803,7 @@ let m1 = (pg = class extends R { !this._modelData || !this._modelData.hasRealView || this._modelData.view.setAriaOptions(e); } applyFontInfo(e) { - mn(e, this._configuration.options.get( + pn(e, this._configuration.options.get( 50 /* EditorOption.fontInfo */ )); @@ -42818,25 +42818,25 @@ let m1 = (pg = class extends R { } const t = []; this._domElement.setAttribute("data-mode-id", e.getLanguageId()), this._configuration.setIsDominatedByLongLines(e.isDominatedByLongLines()), this._configuration.setModelLineCount(e.getLineCount()); - const i = e.onBeforeAttached(), n = new Bce(this._id, this._configuration, e, eX.create(xe(this._domElement)), mX.create(this._configuration.options), (l) => po(xe(this._domElement), l), this.languageConfigurationService, this._themeService, i, { - batchChanges: (l) => { + const i = e.onBeforeAttached(), n = new vae(this._id, this._configuration, e, IJ.create(Le(this._domElement)), EJ.create(this._configuration.options), (r) => Zo(Le(this._domElement), r), this.languageConfigurationService, this._themeService, i, { + batchChanges: (r) => { try { - return this._beginUpdate(), l(); + return this._beginUpdate(), r(); } finally { this._endUpdate(); } } }); - t.push(e.onWillDispose(() => this.setModel(null))), t.push(n.onEvent((l) => { - switch (l.kind) { + t.push(e.onWillDispose(() => this.setModel(null))), t.push(n.onEvent((r) => { + switch (r.kind) { case 0: - this._onDidContentSizeChange.fire(l); + this._onDidContentSizeChange.fire(r); break; case 1: - this._editorTextFocus.setValue(l.hasFocus); + this._editorTextFocus.setValue(r.hasFocus); break; case 2: - this._onDidScrollChange.fire(l); + this._onDidScrollChange.fire(r); break; case 3: this._onDidChangeViewZones.fire(); @@ -42848,12 +42848,12 @@ let m1 = (pg = class extends R { this._onDidAttemptReadOnlyEdit.fire(); break; case 6: { - if (l.reachedMaxCursorCount) { + if (r.reachedMaxCursorCount) { const h = this.getOption( 80 /* EditorOption.multiCursorLimit */ ), u = p("cursors.maximum", "The number of cursors has been limited to {0}. Consider using [find and replace](https://code.visualstudio.com/docs/editor/codebasics#_find-and-replace) for larger changes or increase the editor multi cursor limit setting.", h); - this._notificationService.prompt(yI.Warning, u, [ + this._notificationService.prompt(Mx.Warning, u, [ { label: "Find and Replace", run: () => { @@ -42870,81 +42870,81 @@ let m1 = (pg = class extends R { } ]); } - const a = []; - for (let h = 0, u = l.selections.length; h < u; h++) - a[h] = l.selections[h].getPosition(); - const c = { - position: a[0], - secondaryPositions: a.slice(1), - reason: l.reason, - source: l.source - }; - this._onDidChangeCursorPosition.fire(c); + const c = []; + for (let h = 0, u = r.selections.length; h < u; h++) + c[h] = r.selections[h].getPosition(); const d = { - selection: l.selections[0], - secondarySelections: l.selections.slice(1), - modelVersionId: l.modelVersionId, - oldSelections: l.oldSelections, - oldModelVersionId: l.oldModelVersionId, - source: l.source, - reason: l.reason + position: c[0], + secondaryPositions: c.slice(1), + reason: r.reason, + source: r.source }; - this._onDidChangeCursorSelection.fire(d); + this._onDidChangeCursorPosition.fire(d); + const a = { + selection: r.selections[0], + secondarySelections: r.selections.slice(1), + modelVersionId: r.modelVersionId, + oldSelections: r.oldSelections, + oldModelVersionId: r.oldModelVersionId, + source: r.source, + reason: r.reason + }; + this._onDidChangeCursorSelection.fire(a); break; } case 7: - this._onDidChangeModelDecorations.fire(l.event); + this._onDidChangeModelDecorations.fire(r.event); break; case 8: - this._domElement.setAttribute("data-mode-id", e.getLanguageId()), this._onDidChangeModelLanguage.fire(l.event); + this._domElement.setAttribute("data-mode-id", e.getLanguageId()), this._onDidChangeModelLanguage.fire(r.event); break; case 9: - this._onDidChangeModelLanguageConfiguration.fire(l.event); + this._onDidChangeModelLanguageConfiguration.fire(r.event); break; case 10: - this._onDidChangeModelContent.fire(l.event); + this._onDidChangeModelContent.fire(r.event); break; case 11: - this._onDidChangeModelOptions.fire(l.event); + this._onDidChangeModelOptions.fire(r.event); break; case 12: - this._onDidChangeModelTokens.fire(l.event); + this._onDidChangeModelTokens.fire(r.event); break; } })); - const [o, r] = this._createView(n); - if (r) { + const [o, l] = this._createView(n); + if (l) { this._domElement.appendChild(o.domNode.domNode); - let l = Object.keys(this._contentWidgets); - for (let a = 0, c = l.length; a < c; a++) { - const d = l[a]; - o.addContentWidget(this._contentWidgets[d]); + let r = Object.keys(this._contentWidgets); + for (let c = 0, d = r.length; c < d; c++) { + const a = r[c]; + o.addContentWidget(this._contentWidgets[a]); } - l = Object.keys(this._overlayWidgets); - for (let a = 0, c = l.length; a < c; a++) { - const d = l[a]; - o.addOverlayWidget(this._overlayWidgets[d]); + r = Object.keys(this._overlayWidgets); + for (let c = 0, d = r.length; c < d; c++) { + const a = r[c]; + o.addOverlayWidget(this._overlayWidgets[a]); } - l = Object.keys(this._glyphMarginWidgets); - for (let a = 0, c = l.length; a < c; a++) { - const d = l[a]; - o.addGlyphMarginWidget(this._glyphMarginWidgets[d]); + r = Object.keys(this._glyphMarginWidgets); + for (let c = 0, d = r.length; c < d; c++) { + const a = r[c]; + o.addGlyphMarginWidget(this._glyphMarginWidgets[a]); } o.render(!1, !0), o.domNode.domNode.setAttribute("data-uri", e.uri.toString()); } - this._modelData = new jce(e, n, o, r, t, i); + this._modelData = new Aae(e, n, o, l, t, i); } _createView(e) { let t; this.isSimpleWidget ? t = { - paste: (o, r, l, a) => { - this._paste("keyboard", o, r, l, a); + paste: (o, l, r, c) => { + this._paste("keyboard", o, l, r, c); }, type: (o) => { this._type("keyboard", o); }, - compositionType: (o, r, l, a) => { - this._compositionType("keyboard", o, r, l, a); + compositionType: (o, l, r, c) => { + this._compositionType("keyboard", o, l, r, c); }, startComposition: () => { this._startComposition(); @@ -42956,21 +42956,21 @@ let m1 = (pg = class extends R { this._cut("keyboard"); } } : t = { - paste: (o, r, l, a) => { - const c = { text: o, pasteOnNewLine: r, multicursorText: l, mode: a }; - this._commandService.executeCommand("paste", c); + paste: (o, l, r, c) => { + const d = { text: o, pasteOnNewLine: l, multicursorText: r, mode: c }; + this._commandService.executeCommand("paste", d); }, type: (o) => { - const r = { text: o }; - this._commandService.executeCommand("type", r); + const l = { text: o }; + this._commandService.executeCommand("type", l); }, - compositionType: (o, r, l, a) => { - if (l || a) { - const c = { text: o, replacePrevCharCnt: r, replaceNextCharCnt: l, positionDelta: a }; - this._commandService.executeCommand("compositionType", c); + compositionType: (o, l, r, c) => { + if (r || c) { + const d = { text: o, replacePrevCharCnt: l, replaceNextCharCnt: r, positionDelta: c }; + this._commandService.executeCommand("compositionType", d); } else { - const c = { text: o, replaceCharCnt: r }; - this._commandService.executeCommand("replacePreviousChar", c); + const d = { text: o, replaceCharCnt: l }; + this._commandService.executeCommand("replacePreviousChar", d); } }, startComposition: () => { @@ -42983,8 +42983,8 @@ let m1 = (pg = class extends R { this._commandService.executeCommand("cut", {}); } }; - const i = new pI(e.coordinatesConverter); - return i.onKeyDown = (o) => this._onKeyDown.fire(o), i.onKeyUp = (o) => this._onKeyUp.fire(o), i.onContextMenu = (o) => this._onContextMenu.fire(o), i.onMouseMove = (o) => this._onMouseMove.fire(o), i.onMouseLeave = (o) => this._onMouseLeave.fire(o), i.onMouseDown = (o) => this._onMouseDown.fire(o), i.onMouseUp = (o) => this._onMouseUp.fire(o), i.onMouseDrag = (o) => this._onMouseDrag.fire(o), i.onMouseDrop = (o) => this._onMouseDrop.fire(o), i.onMouseDropCanceled = (o) => this._onMouseDropCanceled.fire(o), i.onMouseWheel = (o) => this._onMouseWheel.fire(o), [new xv(t, this._configuration, this._themeService.getColorTheme(), e, i, this._overflowWidgetsDomNode, this._instantiationService), !0]; + const i = new Nx(e.coordinatesConverter); + return i.onKeyDown = (o) => this._onKeyDown.fire(o), i.onKeyUp = (o) => this._onKeyUp.fire(o), i.onContextMenu = (o) => this._onContextMenu.fire(o), i.onMouseMove = (o) => this._onMouseMove.fire(o), i.onMouseLeave = (o) => this._onMouseLeave.fire(o), i.onMouseDown = (o) => this._onMouseDown.fire(o), i.onMouseUp = (o) => this._onMouseUp.fire(o), i.onMouseDrag = (o) => this._onMouseDrag.fire(o), i.onMouseDrop = (o) => this._onMouseDrop.fire(o), i.onMouseDropCanceled = (o) => this._onMouseDropCanceled.fire(o), i.onMouseWheel = (o) => this._onMouseWheel.fire(o), [new Uw(t, this._configuration, this._themeService.getColorTheme(), e, i, this._overflowWidgetsDomNode, this._instantiationService), !0]; } _postDetachModelCleanup(e) { e == null || e.removeAllDecorationsWithOwnerId(this._id); @@ -43004,8 +43004,8 @@ let m1 = (pg = class extends R { } showDropIndicatorAt(e) { const t = [{ - range: new M(e.lineNumber, e.column, e.lineNumber, e.column), - options: Zu.dropIntoEditorDecorationOptions + range: new I(e.lineNumber, e.column, e.lineNumber, e.column), + options: wu.dropIntoEditorDecorationOptions }]; this._dropIntoEditorDecorations.set(t), this.revealPosition( e, @@ -43025,30 +43025,30 @@ let m1 = (pg = class extends R { _endUpdate() { this._updateCounter--, this._updateCounter === 0 && this._onEndUpdate.fire(); } -}, Zu = pg, pg.dropIntoEditorDecorationOptions = Re.register({ +}, wu = Wm, Wm.dropIntoEditorDecorationOptions = Je.register({ description: "workbench-dnd-target", className: "dnd-target" -}), pg); -m1 = Zu = Kce([ - ja(3, Se), - ja(4, ft), - ja(5, Qt), - ja(6, _e), - ja(7, Pi), - ja(8, Vi), - ja(9, yo), - ja(10, li), - ja(11, ge) -], m1); -let Qce = 0, jce = class { - constructor(e, t, i, n, o, r) { - this.model = e, this.viewModel = t, this.view = i, this.hasRealView = n, this.listenersToRemove = o, this.attachedView = r; +}), Wm); +SW = wu = Fae([ + td(3, Ge), + td(4, gt), + td(5, Ot), + td(6, xe), + td(7, Ki), + td(8, vi), + td(9, Wo), + td(10, ci), + td(11, me) +], SW); +let zae = 0, Aae = class { + constructor(e, t, i, n, o, l) { + this.model = e, this.viewModel = t, this.view = i, this.hasRealView = n, this.listenersToRemove = o, this.attachedView = l; } dispose() { - Wt(this.listenersToRemove), this.model.onBeforeDetached(this.attachedView), this.hasRealView && this.view.dispose(), this.viewModel.dispose(); + Nt(this.listenersToRemove), this.model.onBeforeDetached(this.attachedView), this.hasRealView && this.view.dispose(), this.viewModel.dispose(); } }; -class JY extends R { +class fz extends J { constructor(e) { super(), this._emitterOptions = e, this._onDidChangeToTrue = this._register(new k(this._emitterOptions)), this.onDidChangeToTrue = this._onDidChangeToTrue.event, this._onDidChangeToFalse = this._register(new k(this._emitterOptions)), this.onDidChangeToFalse = this._onDidChangeToFalse.event, this._value = 0; } @@ -43057,7 +43057,7 @@ class JY extends R { this._value !== t && (this._value = t, this._value === 2 ? this._onDidChangeToTrue.fire() : this._value === 1 && this._onDidChangeToFalse.fire()); } } -class zn extends k { +class Kn extends k { constructor(e, t) { super({ deliveryQueue: t }), this._contributions = e; } @@ -43065,13 +43065,13 @@ class zn extends k { this._contributions.onBeforeInteractionEvent(), super.fire(e); } } -class qce extends R { +class Kae extends J { constructor(e, t) { - super(), this._editor = e, t.createKey("editorId", e.getId()), this._editorSimpleInput = I.editorSimpleInput.bindTo(t), this._editorFocus = I.focus.bindTo(t), this._textInputFocus = I.textInputFocus.bindTo(t), this._editorTextFocus = I.editorTextFocus.bindTo(t), this._tabMovesFocus = I.tabMovesFocus.bindTo(t), this._editorReadonly = I.readOnly.bindTo(t), this._inDiffEditor = I.inDiffEditor.bindTo(t), this._editorColumnSelection = I.columnSelection.bindTo(t), this._hasMultipleSelections = I.hasMultipleSelections.bindTo(t), this._hasNonEmptySelection = I.hasNonEmptySelection.bindTo(t), this._canUndo = I.canUndo.bindTo(t), this._canRedo = I.canRedo.bindTo(t), this._register(this._editor.onDidChangeConfiguration(() => this._updateFromConfig())), this._register(this._editor.onDidChangeCursorSelection(() => this._updateFromSelection())), this._register(this._editor.onDidFocusEditorWidget(() => this._updateFromFocus())), this._register(this._editor.onDidBlurEditorWidget(() => this._updateFromFocus())), this._register(this._editor.onDidFocusEditorText(() => this._updateFromFocus())), this._register(this._editor.onDidBlurEditorText(() => this._updateFromFocus())), this._register(this._editor.onDidChangeModel(() => this._updateFromModel())), this._register(this._editor.onDidChangeConfiguration(() => this._updateFromModel())), this._register(db.onDidChangeTabFocus((i) => this._tabMovesFocus.set(i))), this._updateFromConfig(), this._updateFromSelection(), this._updateFromFocus(), this._updateFromModel(), this._editorSimpleInput.set(this._editor.isSimpleWidget); + super(), this._editor = e, t.createKey("editorId", e.getId()), this._editorSimpleInput = C.editorSimpleInput.bindTo(t), this._editorFocus = C.focus.bindTo(t), this._textInputFocus = C.textInputFocus.bindTo(t), this._editorTextFocus = C.editorTextFocus.bindTo(t), this._tabMovesFocus = C.tabMovesFocus.bindTo(t), this._editorReadonly = C.readOnly.bindTo(t), this._inDiffEditor = C.inDiffEditor.bindTo(t), this._editorColumnSelection = C.columnSelection.bindTo(t), this._hasMultipleSelections = C.hasMultipleSelections.bindTo(t), this._hasNonEmptySelection = C.hasNonEmptySelection.bindTo(t), this._canUndo = C.canUndo.bindTo(t), this._canRedo = C.canRedo.bindTo(t), this._register(this._editor.onDidChangeConfiguration(() => this._updateFromConfig())), this._register(this._editor.onDidChangeCursorSelection(() => this._updateFromSelection())), this._register(this._editor.onDidFocusEditorWidget(() => this._updateFromFocus())), this._register(this._editor.onDidBlurEditorWidget(() => this._updateFromFocus())), this._register(this._editor.onDidFocusEditorText(() => this._updateFromFocus())), this._register(this._editor.onDidBlurEditorText(() => this._updateFromFocus())), this._register(this._editor.onDidChangeModel(() => this._updateFromModel())), this._register(this._editor.onDidChangeConfiguration(() => this._updateFromModel())), this._register(gZ.onDidChangeTabFocus((i) => this._tabMovesFocus.set(i))), this._updateFromConfig(), this._updateFromSelection(), this._updateFromFocus(), this._updateFromModel(), this._editorSimpleInput.set(this._editor.isSimpleWidget); } _updateFromConfig() { const e = this._editor.getOptions(); - this._tabMovesFocus.set(db.getTabFocusMode()), this._editorReadonly.set(e.get( + this._tabMovesFocus.set(gZ.getTabFocusMode()), this._editorReadonly.set(e.get( 92 /* EditorOption.readOnly */ )), this._inDiffEditor.set(e.get( @@ -43094,9 +43094,9 @@ class qce extends R { this._canUndo.set(!!(e && e.canUndo())), this._canRedo.set(!!(e && e.canRedo())); } } -class $ce extends R { +class Uae extends J { constructor(e, t, i) { - super(), this._editor = e, this._contextKeyService = t, this._languageFeaturesService = i, this._langId = I.languageId.bindTo(t), this._hasCompletionItemProvider = I.hasCompletionItemProvider.bindTo(t), this._hasCodeActionsProvider = I.hasCodeActionsProvider.bindTo(t), this._hasCodeLensProvider = I.hasCodeLensProvider.bindTo(t), this._hasDefinitionProvider = I.hasDefinitionProvider.bindTo(t), this._hasDeclarationProvider = I.hasDeclarationProvider.bindTo(t), this._hasImplementationProvider = I.hasImplementationProvider.bindTo(t), this._hasTypeDefinitionProvider = I.hasTypeDefinitionProvider.bindTo(t), this._hasHoverProvider = I.hasHoverProvider.bindTo(t), this._hasDocumentHighlightProvider = I.hasDocumentHighlightProvider.bindTo(t), this._hasDocumentSymbolProvider = I.hasDocumentSymbolProvider.bindTo(t), this._hasReferenceProvider = I.hasReferenceProvider.bindTo(t), this._hasRenameProvider = I.hasRenameProvider.bindTo(t), this._hasSignatureHelpProvider = I.hasSignatureHelpProvider.bindTo(t), this._hasInlayHintsProvider = I.hasInlayHintsProvider.bindTo(t), this._hasDocumentFormattingProvider = I.hasDocumentFormattingProvider.bindTo(t), this._hasDocumentSelectionFormattingProvider = I.hasDocumentSelectionFormattingProvider.bindTo(t), this._hasMultipleDocumentFormattingProvider = I.hasMultipleDocumentFormattingProvider.bindTo(t), this._hasMultipleDocumentSelectionFormattingProvider = I.hasMultipleDocumentSelectionFormattingProvider.bindTo(t), this._isInEmbeddedEditor = I.isInEmbeddedEditor.bindTo(t); + super(), this._editor = e, this._contextKeyService = t, this._languageFeaturesService = i, this._langId = C.languageId.bindTo(t), this._hasCompletionItemProvider = C.hasCompletionItemProvider.bindTo(t), this._hasCodeActionsProvider = C.hasCodeActionsProvider.bindTo(t), this._hasCodeLensProvider = C.hasCodeLensProvider.bindTo(t), this._hasDefinitionProvider = C.hasDefinitionProvider.bindTo(t), this._hasDeclarationProvider = C.hasDeclarationProvider.bindTo(t), this._hasImplementationProvider = C.hasImplementationProvider.bindTo(t), this._hasTypeDefinitionProvider = C.hasTypeDefinitionProvider.bindTo(t), this._hasHoverProvider = C.hasHoverProvider.bindTo(t), this._hasDocumentHighlightProvider = C.hasDocumentHighlightProvider.bindTo(t), this._hasDocumentSymbolProvider = C.hasDocumentSymbolProvider.bindTo(t), this._hasReferenceProvider = C.hasReferenceProvider.bindTo(t), this._hasRenameProvider = C.hasRenameProvider.bindTo(t), this._hasSignatureHelpProvider = C.hasSignatureHelpProvider.bindTo(t), this._hasInlayHintsProvider = C.hasInlayHintsProvider.bindTo(t), this._hasDocumentFormattingProvider = C.hasDocumentFormattingProvider.bindTo(t), this._hasDocumentSelectionFormattingProvider = C.hasDocumentSelectionFormattingProvider.bindTo(t), this._hasMultipleDocumentFormattingProvider = C.hasMultipleDocumentFormattingProvider.bindTo(t), this._hasMultipleDocumentSelectionFormattingProvider = C.hasMultipleDocumentSelectionFormattingProvider.bindTo(t), this._isInEmbeddedEditor = C.isInEmbeddedEditor.bindTo(t); const n = () => this._update(); this._register(e.onDidChangeModel(n)), this._register(e.onDidChangeModelLanguage(n)), this._register(i.completionProvider.onDidChange(n)), this._register(i.codeActionProvider.onDidChange(n)), this._register(i.codeLensProvider.onDidChange(n)), this._register(i.definitionProvider.onDidChange(n)), this._register(i.declarationProvider.onDidChange(n)), this._register(i.implementationProvider.onDidChange(n)), this._register(i.typeDefinitionProvider.onDidChange(n)), this._register(i.hoverProvider.onDidChange(n)), this._register(i.documentHighlightProvider.onDidChange(n)), this._register(i.documentSymbolProvider.onDidChange(n)), this._register(i.referenceProvider.onDidChange(n)), this._register(i.renameProvider.onDidChange(n)), this._register(i.documentFormattingEditProvider.onDidChange(n)), this._register(i.documentRangeFormattingEditProvider.onDidChange(n)), this._register(i.signatureHelpProvider.onDidChange(n)), this._register(i.inlayHintsProvider.onDidChange(n)), n(); } @@ -43115,17 +43115,17 @@ class $ce extends R { return; } this._contextKeyService.bufferChangeEvents(() => { - this._langId.set(e.getLanguageId()), this._hasCompletionItemProvider.set(this._languageFeaturesService.completionProvider.has(e)), this._hasCodeActionsProvider.set(this._languageFeaturesService.codeActionProvider.has(e)), this._hasCodeLensProvider.set(this._languageFeaturesService.codeLensProvider.has(e)), this._hasDefinitionProvider.set(this._languageFeaturesService.definitionProvider.has(e)), this._hasDeclarationProvider.set(this._languageFeaturesService.declarationProvider.has(e)), this._hasImplementationProvider.set(this._languageFeaturesService.implementationProvider.has(e)), this._hasTypeDefinitionProvider.set(this._languageFeaturesService.typeDefinitionProvider.has(e)), this._hasHoverProvider.set(this._languageFeaturesService.hoverProvider.has(e)), this._hasDocumentHighlightProvider.set(this._languageFeaturesService.documentHighlightProvider.has(e)), this._hasDocumentSymbolProvider.set(this._languageFeaturesService.documentSymbolProvider.has(e)), this._hasReferenceProvider.set(this._languageFeaturesService.referenceProvider.has(e)), this._hasRenameProvider.set(this._languageFeaturesService.renameProvider.has(e)), this._hasSignatureHelpProvider.set(this._languageFeaturesService.signatureHelpProvider.has(e)), this._hasInlayHintsProvider.set(this._languageFeaturesService.inlayHintsProvider.has(e)), this._hasDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.has(e) || this._languageFeaturesService.documentRangeFormattingEditProvider.has(e)), this._hasDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.has(e)), this._hasMultipleDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.all(e).length + this._languageFeaturesService.documentRangeFormattingEditProvider.all(e).length > 1), this._hasMultipleDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.all(e).length > 1), this._isInEmbeddedEditor.set(e.uri.scheme === Ge.walkThroughSnippet || e.uri.scheme === Ge.vscodeChatCodeBlock); + this._langId.set(e.getLanguageId()), this._hasCompletionItemProvider.set(this._languageFeaturesService.completionProvider.has(e)), this._hasCodeActionsProvider.set(this._languageFeaturesService.codeActionProvider.has(e)), this._hasCodeLensProvider.set(this._languageFeaturesService.codeLensProvider.has(e)), this._hasDefinitionProvider.set(this._languageFeaturesService.definitionProvider.has(e)), this._hasDeclarationProvider.set(this._languageFeaturesService.declarationProvider.has(e)), this._hasImplementationProvider.set(this._languageFeaturesService.implementationProvider.has(e)), this._hasTypeDefinitionProvider.set(this._languageFeaturesService.typeDefinitionProvider.has(e)), this._hasHoverProvider.set(this._languageFeaturesService.hoverProvider.has(e)), this._hasDocumentHighlightProvider.set(this._languageFeaturesService.documentHighlightProvider.has(e)), this._hasDocumentSymbolProvider.set(this._languageFeaturesService.documentSymbolProvider.has(e)), this._hasReferenceProvider.set(this._languageFeaturesService.referenceProvider.has(e)), this._hasRenameProvider.set(this._languageFeaturesService.renameProvider.has(e)), this._hasSignatureHelpProvider.set(this._languageFeaturesService.signatureHelpProvider.has(e)), this._hasInlayHintsProvider.set(this._languageFeaturesService.inlayHintsProvider.has(e)), this._hasDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.has(e) || this._languageFeaturesService.documentRangeFormattingEditProvider.has(e)), this._hasDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.has(e)), this._hasMultipleDocumentFormattingProvider.set(this._languageFeaturesService.documentFormattingEditProvider.all(e).length + this._languageFeaturesService.documentRangeFormattingEditProvider.all(e).length > 1), this._hasMultipleDocumentSelectionFormattingProvider.set(this._languageFeaturesService.documentRangeFormattingEditProvider.all(e).length > 1), this._isInEmbeddedEditor.set(e.uri.scheme === ve.walkThroughSnippet || e.uri.scheme === ve.vscodeChatCodeBlock); }); } } -class ede extends R { +class Pae extends J { constructor(e, t) { - super(), this._onChange = this._register(new k()), this.onChange = this._onChange.event, this._hadFocus = void 0, this._hasDomElementFocus = !1, this._domFocusTracker = this._register(vl(e)), this._overflowWidgetsDomNodeHasFocus = !1, this._register(this._domFocusTracker.onDidFocus(() => { + super(), this._onChange = this._register(new k()), this.onChange = this._onChange.event, this._hadFocus = void 0, this._hasDomElementFocus = !1, this._domFocusTracker = this._register(kr(e)), this._overflowWidgetsDomNodeHasFocus = !1, this._register(this._domFocusTracker.onDidFocus(() => { this._hasDomElementFocus = !0, this._update(); })), this._register(this._domFocusTracker.onDidBlur(() => { this._hasDomElementFocus = !1, this._update(); - })), t && (this._overflowWidgetsDomNode = this._register(vl(t)), this._register(this._overflowWidgetsDomNode.onDidFocus(() => { + })), t && (this._overflowWidgetsDomNode = this._register(kr(t)), this._register(this._overflowWidgetsDomNode.onDidFocus(() => { this._overflowWidgetsDomNodeHasFocus = !0, this._update(); })), this._register(this._overflowWidgetsDomNode.onDidBlur(() => { this._overflowWidgetsDomNodeHasFocus = !1, this._update(); @@ -43139,7 +43139,7 @@ class ede extends R { return this._hadFocus ?? !1; } } -class tde { +class Bae { get length() { return this._decorationIds.length; } @@ -43192,34 +43192,34 @@ class tde { return t; } } -const ide = encodeURIComponent(""); -function lW(s) { - return ide + encodeURIComponent(s.toString()) + nde; -} -const sde = encodeURIComponent(''); -function rde(s) { - return sde + encodeURIComponent(s.toString()) + ode; -} -Lr((s, e) => { - const t = s.getColor(nI); - t && e.addRule(`.monaco-editor .squiggly-error { background: url("data:image/svg+xml,${lW(t)}") repeat-x bottom left; }`); - const i = s.getColor(Jc); - i && e.addRule(`.monaco-editor .squiggly-warning { background: url("data:image/svg+xml,${lW(i)}") repeat-x bottom left; }`); - const n = s.getColor(Da); - n && e.addRule(`.monaco-editor .squiggly-info { background: url("data:image/svg+xml,${lW(n)}") repeat-x bottom left; }`); - const o = s.getColor(Xie); - o && e.addRule(`.monaco-editor .squiggly-hint { background: url("data:image/svg+xml,${rde(o)}") no-repeat bottom left; }`); - const r = s.getColor(koe); - r && e.addRule(`.monaco-editor.showUnused .squiggly-inline-unnecessary { opacity: ${r.rgba.a}; }`); +const _ae = encodeURIComponent(""); +function VR(s) { + return _ae + encodeURIComponent(s.toString()) + Qae; +} +const Oae = encodeURIComponent(''); +function qae(s) { + return Oae + encodeURIComponent(s.toString()) + jae; +} +Il((s, e) => { + const t = s.getColor(fx); + t && e.addRule(`.monaco-editor .squiggly-error { background: url("data:image/svg+xml,${VR(t)}") repeat-x bottom left; }`); + const i = s.getColor(jd); + i && e.addRule(`.monaco-editor .squiggly-warning { background: url("data:image/svg+xml,${VR(i)}") repeat-x bottom left; }`); + const n = s.getColor(Jc); + n && e.addRule(`.monaco-editor .squiggly-info { background: url("data:image/svg+xml,${VR(n)}") repeat-x bottom left; }`); + const o = s.getColor(wne); + o && e.addRule(`.monaco-editor .squiggly-hint { background: url("data:image/svg+xml,${qae(o)}") no-repeat bottom left; }`); + const l = s.getColor(xle); + l && e.addRule(`.monaco-editor.showUnused .squiggly-inline-unnecessary { opacity: ${l.rgba.a}; }`); }); -const Ho = (s, e) => s === e; -function UA(s = Ho) { - return (e, t) => ei(e, t, s); +const _o = (s, e) => s === e; +function dL(s = _o) { + return (e, t) => ti(e, t, s); } -function lde() { +function $ae() { return (s, e) => s.equals(e); } -function zv(s, e, t) { +function dT(s, e, t) { if (t !== void 0) { const i = s; return i == null || e === void 0 || e === null ? e === i : t(i, e); @@ -43228,54 +43228,54 @@ function zv(s, e, t) { return (n, o) => n == null || o === void 0 || o === null ? o === n : i(n, o); } } -function KA(s, e) { +function aL(s, e) { if (s === e) return !0; if (Array.isArray(s) && Array.isArray(e)) { if (s.length !== e.length) return !1; for (let t = 0; t < s.length; t++) - if (!KA(s[t], e[t])) + if (!aL(s[t], e[t])) return !1; return !0; } if (s && typeof s == "object" && e && typeof e == "object" && Object.getPrototypeOf(s) === Object.prototype && Object.getPrototypeOf(e) === Object.prototype) { - const t = s, i = e, n = Object.keys(t), o = Object.keys(i), r = new Set(o); + const t = s, i = e, n = Object.keys(t), o = Object.keys(i), l = new Set(o); if (n.length !== o.length) return !1; - for (const l of n) - if (!r.has(l) || !KA(t[l], i[l])) + for (const r of n) + if (!l.has(r) || !aL(t[r], i[r])) return !1; return !0; } return !1; } -class En { +class Dn { constructor(e, t, i) { this.owner = e, this.debugNameSource = t, this.referenceFn = i; } getDebugName(e) { - return ade(e, this); + return ehe(e, this); } } -const UY = /* @__PURE__ */ new Map(), Pv = /* @__PURE__ */ new WeakMap(); -function ade(s, e) { - const t = Pv.get(s); +const yz = /* @__PURE__ */ new Map(), aT = /* @__PURE__ */ new WeakMap(); +function ehe(s, e) { + const t = aT.get(s); if (t) return t; - const i = cde(s, e); + const i = the(s, e); if (i) { - let n = UY.get(i) ?? 0; - n++, UY.set(i, n); + let n = yz.get(i) ?? 0; + n++, yz.set(i, n); const o = n === 1 ? i : `${i}#${n}`; - return Pv.set(s, o), o; + return aT.set(s, o), o; } } -function cde(s, e) { - const t = Pv.get(s); +function the(s, e) { + const t = aT.get(s); if (t) return t; - const i = e.owner ? hde(e.owner) + "." : ""; + const i = e.owner ? nhe(e.owner) + "." : ""; let n; const o = e.debugNameSource; if (o !== void 0) @@ -43284,56 +43284,56 @@ function cde(s, e) { return i + n; } else return i + o; - const r = e.referenceFn; - if (r !== void 0 && (n = LX(r), n !== void 0)) + const l = e.referenceFn; + if (l !== void 0 && (n = BJ(l), n !== void 0)) return i + n; if (e.owner !== void 0) { - const l = dde(e.owner, s); - if (l !== void 0) - return i + l; + const r = ihe(e.owner, s); + if (r !== void 0) + return i + r; } } -function dde(s, e) { +function ihe(s, e) { for (const t in s) if (s[t] === e) return t; } -const KY = /* @__PURE__ */ new Map(), QY = /* @__PURE__ */ new WeakMap(); -function hde(s) { - const e = QY.get(s); +const Wz = /* @__PURE__ */ new Map(), Gz = /* @__PURE__ */ new WeakMap(); +function nhe(s) { + const e = Gz.get(s); if (e) return e; - const t = ude(s); - let i = KY.get(t) ?? 0; - i++, KY.set(t, i); + const t = she(s); + let i = Wz.get(t) ?? 0; + i++, Wz.set(t, i); const n = i === 1 ? t : `${t}#${i}`; - return QY.set(s, n), n; + return Gz.set(s, n), n; } -function ude(s) { +function she(s) { const e = s.constructor; return e ? e.name : "Object"; } -function LX(s) { +function BJ(s) { const e = s.toString(), i = /\/\*\*\s*@description\s*([^*]*)\*\//.exec(e), n = i ? i[1] : void 0; return n == null ? void 0 : n.trim(); } -let gde; -function CK() { - return gde; +let ohe; +function iO() { + return ohe; } -let SK; -function mde(s) { - SK = s; +let nO; +function lhe(s) { + nO = s; } -let LK; -function pde(s) { - LK = s; +let sO; +function rhe(s) { + sO = s; } -let Bv; -function fde(s) { - Bv = s; +let hT; +function che(s) { + hT = s; } -class AK { +class oO { get TChange() { return null; } @@ -43346,15 +43346,15 @@ class AK { } map(e, t) { const i = t === void 0 ? void 0 : e, n = t === void 0 ? e : t; - return Bv({ + return hT({ owner: i, debugName: () => { - const o = LX(n); + const o = BJ(n); if (o !== void 0) return o; - const l = /^\s*\(?\s*([a-zA-Z_$][a-zA-Z_$0-9]*)\s*\)?\s*=>\s*\1(?:\??)\.([a-zA-Z_$][a-zA-Z_$0-9]*)\s*$/.exec(n.toString()); - if (l) - return `${this.debugName}.${l[2]}`; + const r = /^\s*\(?\s*([a-zA-Z_$][a-zA-Z_$0-9]*)\s*\)?\s*=>\s*\1(?:\??)\.([a-zA-Z_$][a-zA-Z_$0-9]*)\s*$/.exec(n.toString()); + if (r) + return `${this.debugName}.${r[2]}`; if (!i) return `${this.debugName} (mapped)`; }, @@ -43366,13 +43366,13 @@ class AK { * Converts an observable of an observable value into a direct observable of the value. */ flatten() { - return Bv({ + return hT({ owner: void 0, debugName: () => `${this.debugName} (flattened)` }, (e) => this.read(e).read(e)); } recomputeInitiallyAndOnChange(e, t) { - return e.add(SK(this, t)), this; + return e.add(nO(this, t)), this; } /** * Ensures that this observable is observed. This keeps the cache alive. @@ -43380,10 +43380,10 @@ class AK { * Use `recomputeInitiallyAndOnChange` for eager evaluation. */ keepObserved(e) { - return e.add(LK(this)), this; + return e.add(sO(this)), this; } } -class a0 extends AK { +class b0 extends oO { constructor() { super(...arguments), this.observers = /* @__PURE__ */ new Set(); } @@ -43399,45 +43399,45 @@ class a0 extends AK { onLastObserverRemoved() { } } -function oi(s, e) { - const t = new c0(s, e); +function li(s, e) { + const t = new p0(s, e); try { s(t); } finally { t.finish(); } } -let bS; -function dy(s) { - if (bS) - s(bS); +let N1; +function Wf(s) { + if (N1) + s(N1); else { - const e = new c0(s, void 0); - bS = e; + const e = new p0(s, void 0); + N1 = e; try { s(e); } finally { - e.finish(), bS = void 0; + e.finish(), N1 = void 0; } } } -async function xK(s, e) { - const t = new c0(s, e); +async function lO(s, e) { + const t = new p0(s, e); try { await s(t); } finally { t.finish(); } } -function fm(s, e, t) { - s ? e(s) : oi(e, t); +function Gb(s, e, t) { + s ? e(s) : li(e, t); } -class c0 { +class p0 { constructor(e, t) { this._fn = e, this._getDebugName = t, this.updatingObservers = []; } getDebugName() { - return this._getDebugName ? this._getDebugName() : LX(this._fn); + return this._getDebugName ? this._getDebugName() : BJ(this._fn); } updateObserver(e, t) { this.updatingObservers.push({ observer: e, observable: t }), e.beginUpdate(t); @@ -43451,11 +43451,11 @@ class c0 { this.updatingObservers = null; } } -function Oe(s, e) { +function Ue(s, e) { let t; - return typeof s == "string" ? t = new En(void 0, s, void 0) : t = new En(s, void 0, void 0), new AX(t, e, Ho); + return typeof s == "string" ? t = new Dn(void 0, s, void 0) : t = new Dn(s, void 0, void 0), new _J(t, e, _o); } -class AX extends a0 { +class _J extends b0 { get debugName() { return this._debugNameData.getDebugName(this) ?? "ObservableValue"; } @@ -43470,13 +43470,13 @@ class AX extends a0 { if (i === void 0 && this._equalityComparator(this._value, e)) return; let n; - t || (t = n = new c0(() => { + t || (t = n = new p0(() => { }, () => `Setting ${this.debugName}`)); try { - const r = this._value; - this._setValue(e), (o = CK()) == null || o.handleObservableChanged(this, { oldValue: r, newValue: e, change: i, didChange: !0, hadValue: !0 }); - for (const l of this.observers) - t.updateObserver(l, this), l.handleChange(this, i); + const l = this._value; + this._setValue(e), (o = iO()) == null || o.handleObservableChanged(this, { oldValue: l, newValue: e, change: i, didChange: !0, hadValue: !0 }); + for (const r of this.observers) + t.updateObserver(r, this), r.handleChange(this, i); } finally { n && n.finish(); } @@ -43488,11 +43488,11 @@ class AX extends a0 { this._value = e; } } -function p1(s, e) { +function xW(s, e) { let t; - return typeof s == "string" ? t = new En(void 0, s, void 0) : t = new En(s, void 0, void 0), new bde(t, e, Ho); + return typeof s == "string" ? t = new Dn(void 0, s, void 0) : t = new Dn(s, void 0, void 0), new dhe(t, e, _o); } -class bde extends AX { +class dhe extends _J { _setValue(e) { this._value !== e && (this._value && this._value.dispose(), this._value = e); } @@ -43501,44 +43501,44 @@ class bde extends AX { (e = this._value) == null || e.dispose(); } } -function ye(s, e) { - return e !== void 0 ? new bm(new En(s, void 0, e), e, void 0, void 0, void 0, Ho) : new bm(new En(void 0, void 0, s), s, void 0, void 0, void 0, Ho); +function fe(s, e) { + return e !== void 0 ? new Xb(new Dn(s, void 0, e), e, void 0, void 0, void 0, _o) : new Xb(new Dn(void 0, void 0, s), s, void 0, void 0, void 0, _o); } -function xC(s, e, t) { - return new yde(new En(s, void 0, e), e, void 0, void 0, void 0, Ho, t); +function JG(s, e, t) { + return new ahe(new Dn(s, void 0, e), e, void 0, void 0, void 0, _o, t); } -function Vo(s, e) { - return new bm(new En(s.owner, s.debugName, s.debugReferenceFn), e, void 0, void 0, s.onLastObserverRemoved, s.equalsFn ?? Ho); +function vo(s, e) { + return new Xb(new Dn(s.owner, s.debugName, s.debugReferenceFn), e, void 0, void 0, s.onLastObserverRemoved, s.equalsFn ?? _o); } -fde(Vo); -function MK(s, e) { - return new bm(new En(s.owner, s.debugName, void 0), e, s.createEmptyChangeSummary, s.handleChange, void 0, s.equalityComparer ?? Ho); +che(vo); +function rO(s, e) { + return new Xb(new Dn(s.owner, s.debugName, void 0), e, s.createEmptyChangeSummary, s.handleChange, void 0, s.equalityComparer ?? _o); } -function Uh(s, e) { +function qh(s, e) { let t, i; e === void 0 ? (t = s, i = void 0) : (i = s, t = e); - const n = new U(); - return new bm(new En(i, void 0, t), (o) => (n.clear(), t(o, n)), void 0, void 0, () => n.dispose(), Ho); + const n = new _(); + return new Xb(new Dn(i, void 0, t), (o) => (n.clear(), t(o, n)), void 0, void 0, () => n.dispose(), _o); } -function Un(s, e) { +function On(s, e) { let t, i; e === void 0 ? (t = s, i = void 0) : (i = s, t = e); let n; - return new bm(new En(i, void 0, t), (o) => { - n ? n.clear() : n = new U(); - const r = t(o); - return r && n.add(r), r; + return new Xb(new Dn(i, void 0, t), (o) => { + n ? n.clear() : n = new _(); + const l = t(o); + return l && n.add(l), l; }, void 0, void 0, () => { n && (n.dispose(), n = void 0); - }, Ho); + }, _o); } -class bm extends a0 { +class Xb extends b0 { get debugName() { return this._debugNameData.getDebugName(this) ?? "(anonymous)"; } - constructor(e, t, i, n, o = void 0, r) { - var l; - super(), this._debugNameData = e, this._computeFn = t, this.createChangeSummary = i, this._handleChange = n, this._handleLastObserverRemoved = o, this._equalityComparator = r, this.state = 0, this.value = void 0, this.updateCount = 0, this.dependencies = /* @__PURE__ */ new Set(), this.dependenciesToBeRemoved = /* @__PURE__ */ new Set(), this.changeSummary = void 0, this.changeSummary = (l = this.createChangeSummary) == null ? void 0 : l.call(this); + constructor(e, t, i, n, o = void 0, l) { + var r; + super(), this._debugNameData = e, this._computeFn = t, this.createChangeSummary = i, this._handleChange = n, this._handleLastObserverRemoved = o, this._equalityComparator = l, this.state = 0, this.value = void 0, this.updateCount = 0, this.dependencies = /* @__PURE__ */ new Set(), this.dependenciesToBeRemoved = /* @__PURE__ */ new Set(), this.changeSummary = void 0, this.changeSummary = (r = this.createChangeSummary) == null ? void 0 : r.call(this); } onLastObserverRemoved() { var e; @@ -43565,7 +43565,7 @@ class bm extends a0 { } } _recomputeIfNeeded() { - var r; + var l; if (this.state === 3) return; const e = this.dependenciesToBeRemoved; @@ -43573,17 +43573,17 @@ class bm extends a0 { const t = this.state !== 0, i = this.value; this.state = 3; const n = this.changeSummary; - this.changeSummary = (r = this.createChangeSummary) == null ? void 0 : r.call(this); + this.changeSummary = (l = this.createChangeSummary) == null ? void 0 : l.call(this); try { this.value = this._computeFn(this, n); } finally { - for (const l of this.dependenciesToBeRemoved) - l.removeObserver(this); + for (const r of this.dependenciesToBeRemoved) + r.removeObserver(this); this.dependenciesToBeRemoved.clear(); } if (t && !this._equalityComparator(i, this.value)) - for (const l of this.observers) - l.handleChange(this, void 0); + for (const r of this.observers) + r.handleChange(this, void 0); } toString() { return `LazyDerived<${this.debugName}>`; @@ -43605,7 +43605,7 @@ class bm extends a0 { for (const i of t) i.endUpdate(this); } - gm(() => this.updateCount >= 0); + fb(() => this.updateCount >= 0); } handlePossibleChange(e) { if (this.state === 3 && this.dependencies.has(e) && !this.dependenciesToBeRemoved.has(e)) { @@ -43641,22 +43641,22 @@ class bm extends a0 { super.removeObserver(e), t && e.endUpdate(this); } } -class yde extends bm { - constructor(e, t, i, n, o = void 0, r, l) { - super(e, t, i, n, o, r), this.set = l; +class ahe extends Xb { + constructor(e, t, i, n, o = void 0, l, r) { + super(e, t, i, n, o, l), this.set = r; } } function Te(s) { - return new wI(new En(void 0, void 0, s), s, void 0, void 0); + return new Yx(new Dn(void 0, void 0, s), s, void 0, void 0); } -function MC(s, e) { - return new wI(new En(s.owner, s.debugName, s.debugReferenceFn ?? e), e, void 0, void 0); +function HG(s, e) { + return new Yx(new Dn(s.owner, s.debugName, s.debugReferenceFn ?? e), e, void 0, void 0); } -function ZC(s, e) { - return new wI(new En(s.owner, s.debugName, s.debugReferenceFn ?? e), e, s.createEmptyChangeSummary, s.handleChange); +function EG(s, e) { + return new Yx(new Dn(s.owner, s.debugName, s.debugReferenceFn ?? e), e, s.createEmptyChangeSummary, s.handleChange); } -function wde(s, e) { - const t = new U(), i = ZC({ +function hhe(s, e) { + const t = new _(), i = EG({ owner: s.owner, debugName: s.debugName, debugReferenceFn: s.debugReferenceFn ?? e, @@ -43665,23 +43665,23 @@ function wde(s, e) { }, (n, o) => { t.clear(), e(n, o, t); }); - return Ce(() => { + return We(() => { i.dispose(), t.dispose(); }); } -function ks(s) { - const e = new U(), t = MC({ +function Js(s) { + const e = new _(), t = HG({ owner: void 0, debugName: void 0, debugReferenceFn: s }, (i) => { e.clear(), s(i, e); }); - return Ce(() => { + return We(() => { t.dispose(), e.dispose(); }); } -class wI { +class Yx { get debugName() { return this._debugNameData.getDebugName(this) ?? "(anonymous)"; } @@ -43704,7 +43704,7 @@ class wI { const t = this.disposed; try { if (!t) { - (i = CK()) == null || i.handleAutorunTriggered(this); + (i = iO()) == null || i.handleAutorunTriggered(this); const o = this.changeSummary; this.changeSummary = (n = this.createChangeSummary) == null ? void 0 : n.call(this), this._runFn(this, o); } @@ -43732,7 +43732,7 @@ class wI { } this._runIfNeeded(); } while (this.state !== 3); - this.updateCount--, gm(() => this.updateCount >= 0); + this.updateCount--, fb(() => this.updateCount >= 0); } handlePossibleChange(e) { this.state === 3 && this.dependencies.has(e) && !this.dependenciesToBeRemoved.has(e) && (this.state = 1); @@ -43754,12 +43754,12 @@ class wI { } } (function(s) { - s.Observer = wI; + s.Observer = Yx; })(Te || (Te = {})); -function dr(s) { - return new Cde(s); +function ul(s) { + return new uhe(s); } -class Cde extends AK { +class uhe extends oO { constructor(e) { super(), this.value = e; } @@ -43777,23 +43777,23 @@ class Cde extends AK { return `Const: ${this.value}`; } } -function St(...s) { +function Gt(...s) { let e, t, i; - return s.length === 3 ? [e, t, i] = s : [t, i] = s, new Od(new En(e, void 0, i), t, i, () => Od.globalTransaction, Ho); + return s.length === 3 ? [e, t, i] = s : [t, i] = s, new Qa(new Dn(e, void 0, i), t, i, () => Qa.globalTransaction, _o); } -function Sde(s, e, t) { - return new Od(new En(s.owner, s.debugName, s.debugReferenceFn ?? t), e, t, () => Od.globalTransaction, s.equalsFn ?? Ho); +function mhe(s, e, t) { + return new Qa(new Dn(s.owner, s.debugName, s.debugReferenceFn ?? t), e, t, () => Qa.globalTransaction, s.equalsFn ?? _o); } -class Od extends a0 { +class Qa extends b0 { constructor(e, t, i, n, o) { - super(), this._debugNameData = e, this.event = t, this._getValue = i, this._getTransaction = n, this._equalityComparator = o, this.hasValue = !1, this.handleEvent = (r) => { - const l = this._getValue(r), a = this.value; - (!this.hasValue || !this._equalityComparator(a, l)) && (this.value = l, this.hasValue && fm(this._getTransaction(), (d) => { + super(), this._debugNameData = e, this.event = t, this._getValue = i, this._getTransaction = n, this._equalityComparator = o, this.hasValue = !1, this.handleEvent = (l) => { + const r = this._getValue(l), c = this.value; + (!this.hasValue || !this._equalityComparator(c, r)) && (this.value = r, this.hasValue && Gb(this._getTransaction(), (a) => { for (const h of this.observers) - d.updateObserver(h, this), h.handleChange(this, void 0); + a.updateObserver(h, this), h.handleChange(this, void 0); }, () => { - const d = this.getDebugName(); - return "Event fired" + (d ? `: ${d}` : ""); + const a = this.getDebugName(); + return "Event fired" + (a ? `: ${a}` : ""); }), this.hasValue = !0); }; } @@ -43815,25 +43815,25 @@ class Od extends a0 { } } (function(s) { - s.Observer = Od; + s.Observer = Qa; function e(t, i) { let n = !1; - Od.globalTransaction === void 0 && (Od.globalTransaction = t, n = !0); + Qa.globalTransaction === void 0 && (Qa.globalTransaction = t, n = !0); try { i(); } finally { - n && (Od.globalTransaction = void 0); + n && (Qa.globalTransaction = void 0); } } s.batchEventsGlobally = e; -})(St || (St = {})); -function Zn(s, e) { - return new Lde(s, e); +})(Gt || (Gt = {})); +function xn(s, e) { + return new bhe(s, e); } -class Lde extends a0 { +class bhe extends b0 { constructor(e, t) { super(), this.debugName = e, this.event = t, this.handleEvent = () => { - oi((i) => { + li((i) => { for (const n of this.observers) i.updateObserver(n, this), n.handleChange(this, void 0); }, () => this.debugName); @@ -43848,12 +43848,12 @@ class Lde extends a0 { get() { } } -function d0(s) { - return typeof s == "string" ? new jY(s) : new jY(void 0, s); +function g0(s) { + return typeof s == "string" ? new Xz(s) : new Xz(void 0, s); } -class jY extends a0 { +class Xz extends b0 { get debugName() { - return new En(this._owner, this._debugName, void 0).getDebugName(this) ?? "Observable Signal"; + return new Dn(this._owner, this._debugName, void 0).getDebugName(this) ?? "Observable Signal"; } toString() { return this.debugName; @@ -43863,7 +43863,7 @@ class jY extends a0 { } trigger(e, t) { if (!e) { - oi((i) => { + li((i) => { this.trigger(i, t); }, () => `Trigger signal ${this.debugName}`); return; @@ -43874,21 +43874,21 @@ class jY extends a0 { get() { } } -function Ade(s) { - const e = new ZK(!1, void 0); - return s.addObserver(e), Ce(() => { +function phe(s) { + const e = new cO(!1, void 0); + return s.addObserver(e), We(() => { s.removeObserver(e); }); } -pde(Ade); -function h0(s, e) { - const t = new ZK(!0, e); - return s.addObserver(t), e ? e(s.get()) : s.reportChanges(), Ce(() => { +rhe(phe); +function Z0(s, e) { + const t = new cO(!0, e); + return s.addObserver(t), e ? e(s.get()) : s.reportChanges(), We(() => { s.removeObserver(t); }); } -mde(h0); -class ZK { +lhe(Z0); +class cO { constructor(e, t) { this._forceRecompute = e, this._handleValue = t, this._counter = 0; } @@ -43903,21 +43903,21 @@ class ZK { handleChange(e, t) { } } -function _C(s, e) { +function DG(s, e) { let t; - return Vo({ owner: s, debugReferenceFn: e }, (n) => (t = e(n, t), t)); + return vo({ owner: s, debugReferenceFn: e }, (n) => (t = e(n, t), t)); } -function xde(s, e, t, i) { - let n = new qY(t, i); - return Vo({ +function ghe(s, e, t, i) { + let n = new Vz(t, i); + return vo({ debugReferenceFn: t, owner: s, onLastObserverRemoved: () => { - n.dispose(), n = new qY(t); + n.dispose(), n = new Vz(t); } - }, (r) => (n.setItems(e.read(r)), n.getItems())); + }, (l) => (n.setItems(e.read(l)), n.getItems())); } -class qY { +class Vz { constructor(e, t) { this._map = e, this._keySelector = t, this._cache = /* @__PURE__ */ new Map(), this._items = []; } @@ -43928,14 +43928,14 @@ class qY { const t = [], i = new Set(this._cache.keys()); for (const n of e) { const o = this._keySelector ? this._keySelector(n) : n; - let r = this._cache.get(o); - if (r) + let l = this._cache.get(o); + if (l) i.delete(o); else { - const l = new U(); - r = { out: this._map(n, l), store: l }, this._cache.set(o, r); + const r = new _(); + l = { out: this._map(n, r), store: r }, this._cache.set(o, l); } - t.push(r.out); + t.push(l.out); } for (const n of i) this._cache.get(n).store.dispose(), this._cache.delete(n); @@ -43945,52 +43945,52 @@ class qY { return this._items; } } -function Mde(s, e) { - return _C(s, (t, i) => i ?? e(t)); +function Zhe(s, e) { + return DG(s, (t, i) => i ?? e(t)); } -class CI { +class kx { static fromFn(e) { - return new CI(e()); + return new kx(e()); } constructor(e) { - this._value = Oe(this, void 0), this.promiseResult = this._value, this.promise = e.then((t) => (oi((i) => { - this._value.set(new $Y(t, void 0), i); + this._value = Ue(this, void 0), this.promiseResult = this._value, this.promise = e.then((t) => (li((i) => { + this._value.set(new Lz(t, void 0), i); }), t), (t) => { - throw oi((i) => { - this._value.set(new $Y(void 0, t), i); + throw li((i) => { + this._value.set(new Lz(void 0, t), i); }), t; }); } } -class $Y { +class Lz { constructor(e, t) { this.data = e, this.error = t; } } -function _K(s, e, t, i) { +function dO(s, e, t, i) { return e || (e = (n) => n != null), new Promise((n, o) => { - let r = !0, l = !1; - const a = s.map((d) => ({ - isFinished: e(d), - error: t ? t(d) : !1, - state: d - })), c = Te((d) => { - const { isFinished: h, error: u, state: g } = a.read(d); - (h || u) && (r ? l = !0 : c.dispose(), u ? o(u === !0 ? g : u) : n(g)); + let l = !0, r = !1; + const c = s.map((a) => ({ + isFinished: e(a), + error: t ? t(a) : !1, + state: a + })), d = Te((a) => { + const { isFinished: h, error: u, state: m } = c.read(a); + (h || u) && (l ? r = !0 : d.dispose(), u ? o(u === !0 ? m : u) : n(m)); }); if (i) { - const d = i.onCancellationRequested(() => { - c.dispose(), d.dispose(), o(new Pr()); + const a = i.onCancellationRequested(() => { + d.dispose(), a.dispose(), o(new Pl()); }); if (i.isCancellationRequested) { - c.dispose(), d.dispose(), o(new Pr()); + d.dispose(), a.dispose(), o(new Pl()); return; } } - r = !1, l && c.dispose(); + l = !1, r && d.dispose(); }); } -class Zde extends a0 { +class fhe extends b0 { get debugName() { return this._debugNameData.getDebugName(this) ?? "LazyObservableValue"; } @@ -44036,13 +44036,13 @@ class Zde extends a0 { if (i === void 0 && this._equalityComparator(this._value, e)) return; let n; - t || (t = n = new c0(() => { + t || (t = n = new p0(() => { }, () => `Setting ${this.debugName}`)); try { if (this._isUpToDate = !1, this._setValue(e), i !== void 0 && this._deltas.push(i), t.updateObserver({ beginUpdate: () => this._beginUpdate(), endUpdate: () => this._endUpdate(), - handleChange: (o, r) => { + handleChange: (o, l) => { }, handlePossibleChange: (o) => { } @@ -44060,13 +44060,13 @@ class Zde extends a0 { this._value = e; } } -function Ov(s, e) { - return s.lazy ? new Zde(new En(s.owner, s.debugName, void 0), e, s.equalsFn ?? Ho) : new AX(new En(s.owner, s.debugName, void 0), e, s.equalsFn ?? Ho); +function uT(s, e) { + return s.lazy ? new fhe(new Dn(s.owner, s.debugName, void 0), e, s.equalsFn ?? _o) : new _J(new Dn(s.owner, s.debugName, void 0), e, s.equalsFn ?? _o); } -class Vl { +class Hr { static capture(e) { if (e.getScrollTop() === 0 || e.hasPendingScrollAnimation()) - return new Vl(e.getScrollTop(), e.getContentHeight(), null, 0, null); + return new Hr(e.getScrollTop(), e.getContentHeight(), null, 0, null); let t = null, i = 0; const n = e.getVisibleRanges(); if (n.length > 0) { @@ -44074,7 +44074,7 @@ class Vl { const o = e.getTopForPosition(t.lineNumber, t.column); i = e.getScrollTop() - o; } - return new Vl(e.getScrollTop(), e.getContentHeight(), t, i, e.getPosition()); + return new Hr(e.getScrollTop(), e.getContentHeight(), t, i, e.getPosition()); } constructor(e, t, i, n, o) { this._initialScrollTop = e, this._initialContentHeight = t, this._visiblePosition = i, this._visiblePositionScrollDelta = n, this._cursorPosition = o; @@ -44099,7 +44099,7 @@ class Vl { ); } } -const f1 = { +const CW = { /** * Application specific resource transfer type */ @@ -44107,14 +44107,14 @@ const f1 = { /** * Typically transfer type for copy/paste transfers. */ - TEXT: bi.text, + TEXT: fi.text, /** * Internal type used to pass around text/uri-list data. * * This is needed to work around https://bugs.chromium.org/p/chromium/issues/detail?id=239745. */ INTERNAL_URI_LIST: "application/vnd.code.uri-list" -}, _de = () => ({ +}, yhe = () => ({ get delay() { return -1; }, @@ -44123,30 +44123,30 @@ const f1 = { showHover: () => { } }); -let SI = _de; -const Ide = new Wl(() => SI("mouse", !1)), Nde = new Wl(() => SI("element", !1)); -function Wde(s) { - SI = s; +let vx = yhe; +const Whe = new Yr(() => vx("mouse", !1)), Ghe = new Yr(() => vx("element", !1)); +function Xhe(s) { + vx = s; } -function As(s) { - return s === "element" ? Nde.value : Ide.value; +function Is(s) { + return s === "element" ? Ghe.value : Whe.value; } -function yb() { - return SI("element", !0); +function LZ() { + return vx("element", !0); } -function vde(s, e = {}) { - const t = xX(e); +function Vhe(s, e = {}) { + const t = QJ(e); return t.textContent = s, t; } -function Tde(s, e = {}) { - const t = xX(e); - return IK(t, Vde(s, !!e.renderCodeSegments), e.actionHandler, e.renderCodeSegments), t; +function Lhe(s, e = {}) { + const t = QJ(e); + return aO(t, She(s, !!e.renderCodeSegments), e.actionHandler, e.renderCodeSegments), t; } -function xX(s) { +function QJ(s) { const e = s.inline ? "span" : "div", t = document.createElement(e); return s.className && (t.className = s.className), t; } -class Dde { +class Ihe { constructor(e) { this.source = e, this.index = 0; } @@ -44164,7 +44164,7 @@ class Dde { this.index++; } } -function IK(s, e, t, i) { +function aO(s, e, t, i) { let n; if (e.type === 2) n = document.createTextNode(e.content || ""); @@ -44176,57 +44176,57 @@ function IK(s, e, t, i) { n = document.createElement("code"); else if (e.type === 5 && t) { const o = document.createElement("a"); - t.disposables.add(ai(o, "click", (r) => { - t.callback(String(e.index), r); + t.disposables.add(di(o, "click", (l) => { + t.callback(String(e.index), l); })), n = o; } else e.type === 8 ? n = document.createElement("br") : e.type === 1 && (n = s); n && s !== n && s.appendChild(n), n && Array.isArray(e.children) && e.children.forEach((o) => { - IK(n, o, t, i); + aO(n, o, t, i); }); } -function Vde(s, e) { +function She(s, e) { const t = { type: 1, children: [] }; let i = 0, n = t; - const o = [], r = new Dde(s); - for (; !r.eos(); ) { - let l = r.next(); - const a = l === "\\" && Hv(r.peek(), e) !== 0; - if (a && (l = r.next()), !a && kde(l, e) && l === r.peek()) { - r.advance(), n.type === 2 && (n = o.pop()); - const c = Hv(l, e); - if (n.type === c || n.type === 5 && c === 6) + const o = [], l = new Ihe(s); + for (; !l.eos(); ) { + let r = l.next(); + const c = r === "\\" && mT(l.peek(), e) !== 0; + if (c && (r = l.next()), !c && xhe(r, e) && r === l.peek()) { + l.advance(), n.type === 2 && (n = o.pop()); + const d = mT(r, e); + if (n.type === d || n.type === 5 && d === 6) n = o.pop(); else { - const d = { - type: c, + const a = { + type: d, children: [] }; - c === 5 && (d.index = i, i++), n.children.push(d), o.push(n), n = d; + d === 5 && (a.index = i, i++), n.children.push(a), o.push(n), n = a; } - } else if (l === ` + } else if (r === ` `) n.type === 2 && (n = o.pop()), n.children.push({ type: 8 /* FormatType.NewLine */ }); else if (n.type !== 2) { - const c = { + const d = { type: 2, - content: l + content: r }; - n.children.push(c), o.push(n), n = c; + n.children.push(d), o.push(n), n = d; } else - n.content += l; + n.content += r; } return n.type === 2 && (n = o.pop()), t; } -function kde(s, e) { - return Hv(s, e) !== 0; +function xhe(s, e) { + return mT(s, e) !== 0; } -function Hv(s, e) { +function mT(s, e) { switch (s) { case "*": return 3; @@ -44242,22 +44242,22 @@ function Hv(s, e) { return 0; } } -const Gde = new RegExp(`(\\\\)?\\$\\((${Ze.iconNameExpression}(?:${Ze.iconModifierExpression})?)\\)`, "g"); -function ih(s) { +const Che = new RegExp(`(\\\\)?\\$\\((${Se.iconNameExpression}(?:${Se.iconModifierExpression})?)\\)`, "g"); +function lh(s) { const e = new Array(); let t, i = 0, n = 0; - for (; (t = Gde.exec(s)) !== null; ) { + for (; (t = Che.exec(s)) !== null; ) { n = t.index || 0, i < n && e.push(s.substring(i, n)), i = (t.index || 0) + t[0].length; - const [, o, r] = t; - e.push(o ? `$(${r})` : ym({ id: r })); + const [, o, l] = t; + e.push(o ? `$(${l})` : Vb({ id: l })); } return i < s.length && e.push(s.substring(i)), e; } -function ym(s) { - const e = ce("span"); - return e.classList.add(...Ze.asClassNameArray(s)), e; +function Vb(s) { + const e = de("span"); + return e.classList.add(...Se.asClassNameArray(s)), e; } -function NK(...s) { +function hO(...s) { return function(e, t) { for (let i = 0, n = s.length; i < n; i++) { const o = s[i](e, t); @@ -44267,61 +44267,61 @@ function NK(...s) { return null; }; } -WK.bind(void 0, !1); -const QA = WK.bind(void 0, !0); -function WK(s, e, t) { +uO.bind(void 0, !1); +const hL = uO.bind(void 0, !0); +function uO(s, e, t) { if (!t || t.length < e.length) return null; let i; - return s ? i = tE(t, e) : i = t.indexOf(e) === 0, i ? e.length > 0 ? [{ start: 0, end: e.length }] : [] : null; + return s ? i = Sv(t, e) : i = t.indexOf(e) === 0, i ? e.length > 0 ? [{ start: 0, end: e.length }] : [] : null; } -function Rde(s, e) { +function Rhe(s, e) { const t = e.toLowerCase().indexOf(s.toLowerCase()); return t === -1 ? null : [{ start: t, end: t + s.length }]; } -function vK(s, e) { - return Jv(s.toLowerCase(), e.toLowerCase(), 0, 0); +function mO(s, e) { + return bT(s.toLowerCase(), e.toLowerCase(), 0, 0); } -function Jv(s, e, t, i) { +function bT(s, e, t, i) { if (t === s.length) return []; if (i === e.length) return null; if (s[t] === e[i]) { let n = null; - return (n = Jv(s, e, t + 1, i + 1)) ? DK({ start: i, end: i + 1 }, n) : null; + return (n = bT(s, e, t + 1, i + 1)) ? pO({ start: i, end: i + 1 }, n) : null; } - return Jv(s, e, t, i + 1); + return bT(s, e, t, i + 1); } -function MX(s) { +function OJ(s) { return 97 <= s && s <= 122; } -function LI(s) { +function Jx(s) { return 65 <= s && s <= 90; } -function ZX(s) { +function jJ(s) { return 48 <= s && s <= 57; } -function Ede(s) { +function Nhe(s) { return s === 32 || s === 9 || s === 10 || s === 13; } -const Xde = /* @__PURE__ */ new Set(); -"()[]{}<>`'\"-/;:,.?!".split("").forEach((s) => Xde.add(s.charCodeAt(0))); -function TK(s) { - return MX(s) || LI(s) || ZX(s); +const whe = /* @__PURE__ */ new Set(); +"()[]{}<>`'\"-/;:,.?!".split("").forEach((s) => whe.add(s.charCodeAt(0))); +function bO(s) { + return OJ(s) || Jx(s) || jJ(s); } -function DK(s, e) { +function pO(s, e) { return e.length === 0 ? e = [s] : s.end === e[0].start ? e[0].start = s.start : e.unshift(s), e; } -function VK(s, e) { +function gO(s, e) { for (let t = e; t < s.length; t++) { const i = s.charCodeAt(t); - if (LI(i) || ZX(i) || t > 0 && !TK(s.charCodeAt(t - 1))) + if (Jx(i) || jJ(i) || t > 0 && !bO(s.charCodeAt(t - 1))) return t; } return s.length; } -function Uv(s, e, t, i) { +function pT(s, e, t, i) { if (t === s.length) return []; if (i === e.length) @@ -44330,70 +44330,70 @@ function Uv(s, e, t, i) { return null; { let n = null, o = i + 1; - for (n = Uv(s, e, t + 1, i + 1); !n && (o = VK(e, o)) < e.length; ) - n = Uv(s, e, t + 1, o), o++; - return n === null ? null : DK({ start: i, end: i + 1 }, n); + for (n = pT(s, e, t + 1, i + 1); !n && (o = gO(e, o)) < e.length; ) + n = pT(s, e, t + 1, o), o++; + return n === null ? null : pO({ start: i, end: i + 1 }, n); } } -function Fde(s) { +function The(s) { let e = 0, t = 0, i = 0, n = 0, o = 0; - for (let d = 0; d < s.length; d++) - o = s.charCodeAt(d), LI(o) && e++, MX(o) && t++, TK(o) && i++, ZX(o) && n++; - const r = e / s.length, l = t / s.length, a = i / s.length, c = n / s.length; - return { upperPercent: r, lowerPercent: l, alphaPercent: a, numericPercent: c }; + for (let a = 0; a < s.length; a++) + o = s.charCodeAt(a), Jx(o) && e++, OJ(o) && t++, bO(o) && i++, jJ(o) && n++; + const l = e / s.length, r = t / s.length, c = i / s.length, d = n / s.length; + return { upperPercent: l, lowerPercent: r, alphaPercent: c, numericPercent: d }; } -function Yde(s) { +function Mhe(s) { const { upperPercent: e, lowerPercent: t } = s; return t === 0 && e > 0.6; } -function zde(s) { +function Yhe(s) { const { upperPercent: e, lowerPercent: t, alphaPercent: i, numericPercent: n } = s; return t > 0.2 && e < 0.8 && i > 0.6 && n < 0.2; } -function Pde(s) { +function khe(s) { let e = 0, t = 0, i = 0, n = 0; for (let o = 0; o < s.length; o++) - i = s.charCodeAt(o), LI(i) && e++, MX(i) && t++, Ede(i) && n++; + i = s.charCodeAt(o), Jx(i) && e++, OJ(i) && t++, Nhe(i) && n++; return (e === 0 || t === 0) && n === 0 ? s.length <= 30 : e <= 5; } -function kK(s, e) { - if (!e || (e = e.trim(), e.length === 0) || !Pde(s)) +function ZO(s, e) { + if (!e || (e = e.trim(), e.length === 0) || !khe(s)) return null; e.length > 60 && (e = e.substring(0, 60)); - const t = Fde(e); - if (!zde(t)) { - if (!Yde(t)) + const t = The(e); + if (!Yhe(t)) { + if (!Mhe(t)) return null; e = e.toLowerCase(); } let i = null, n = 0; - for (s = s.toLowerCase(); n < e.length && (i = Uv(s, e, 0, n)) === null; ) - n = VK(e, n + 1); + for (s = s.toLowerCase(); n < e.length && (i = pT(s, e, 0, n)) === null; ) + n = gO(e, n + 1); return i; } -const Bde = NK(QA, kK, Rde), Ode = NK(QA, kK, vK), ez = new id(1e4); -function tz(s, e, t = !1) { +const vhe = hO(hL, ZO, Rhe), Jhe = hO(hL, ZO, mO), Iz = new la(1e4); +function Sz(s, e, t = !1) { if (typeof s != "string" || typeof e != "string") return null; - let i = ez.get(s); - i || (i = new RegExp(tq(s), "i"), ez.set(s, i)); + let i = Iz.get(s); + i || (i = new RegExp(Bq(s), "i"), Iz.set(s, i)); const n = i.exec(e); - return n ? [{ start: n.index, end: n.index + n[0].length }] : t ? Ode(s, e) : Bde(s, e); + return n ? [{ start: n.index, end: n.index + n[0].length }] : t ? Jhe(s, e) : vhe(s, e); } -function Hde(s, e) { - const t = wb(s, s.toLowerCase(), 0, e, e.toLowerCase(), 0, { firstMatchCanBeWeak: !0, boostFullMatch: !0 }); - return t ? AI(t) : null; +function Hhe(s, e) { + const t = IZ(s, s.toLowerCase(), 0, e, e.toLowerCase(), 0, { firstMatchCanBeWeak: !0, boostFullMatch: !0 }); + return t ? Hx(t) : null; } -function Jde(s, e, t, i, n, o) { - const r = Math.min(13, s.length); - for (; t < r; t++) { - const l = wb(s, e, t, i, n, o, { firstMatchCanBeWeak: !0, boostFullMatch: !0 }); - if (l) - return l; +function Ehe(s, e, t, i, n, o) { + const l = Math.min(13, s.length); + for (; t < l; t++) { + const r = IZ(s, e, t, i, n, o, { firstMatchCanBeWeak: !0, boostFullMatch: !0 }); + if (r) + return r; } return [0, o]; } -function AI(s) { +function Hx(s) { if (typeof s > "u") return []; const e = [], t = s[1]; @@ -44403,23 +44403,23 @@ function AI(s) { } return e; } -const Hd = 128; -function _X() { +const Oa = 128; +function qJ() { const s = [], e = []; - for (let t = 0; t <= Hd; t++) + for (let t = 0; t <= Oa; t++) e[t] = 0; - for (let t = 0; t <= Hd; t++) + for (let t = 0; t <= Oa; t++) s.push(e.slice(0)); return s; } -function GK(s) { +function fO(s) { const e = []; for (let t = 0; t <= s; t++) e[t] = 0; return e; } -const RK = GK(2 * Hd), Kv = GK(2 * Hd), qa = _X(), uu = _X(), yS = _X(); -function wS(s, e) { +const yO = fO(2 * Oa), gT = fO(2 * Oa), id = qJ(), gu = qJ(), w1 = qJ(); +function T1(s, e) { if (e < 0 || e >= s.length) return !1; const t = s.codePointAt(e); @@ -44446,10 +44446,10 @@ function wS(s, e) { case void 0: return !1; default: - return !!oE(t); + return !!Nv(t); } } -function iz(s, e) { +function xz(s, e) { if (e < 0 || e >= s.length) return !1; switch (s.charCodeAt(e)) { @@ -44460,137 +44460,137 @@ function iz(s, e) { return !1; } } -function xL(s, e, t) { +function EX(s, e, t) { return e[s] !== t[s]; } -function Ude(s, e, t, i, n, o, r = !1) { +function Dhe(s, e, t, i, n, o, l = !1) { for (; e < t && n < o; ) - s[e] === i[n] && (r && (RK[e] = n), e += 1), n += 1; + s[e] === i[n] && (l && (yO[e] = n), e += 1), n += 1; return e === t; } -var Il; +var Tr; (function(s) { s.Default = [-100, 0]; function e(t) { return !t || t.length === 2 && t[0] === -100 && t[1] === 0; } s.isDefault = e; -})(Il || (Il = {})); -const M9 = class M9 { +})(Tr || (Tr = {})); +const OE = class OE { constructor(e, t) { this.firstMatchCanBeWeak = e, this.boostFullMatch = t; } }; -M9.default = { boostFullMatch: !0, firstMatchCanBeWeak: !1 }; -let b1 = M9; -function wb(s, e, t, i, n, o, r = b1.default) { - const l = s.length > Hd ? Hd : s.length, a = i.length > Hd ? Hd : i.length; - if (t >= l || o >= a || l - t > a - o || !Ude(e, t, l, n, o, a, !0)) +OE.default = { boostFullMatch: !0, firstMatchCanBeWeak: !1 }; +let RW = OE; +function IZ(s, e, t, i, n, o, l = RW.default) { + const r = s.length > Oa ? Oa : s.length, c = i.length > Oa ? Oa : i.length; + if (t >= r || o >= c || r - t > c - o || !Dhe(e, t, r, n, o, c, !0)) return; - Kde(l, a, t, o, e, n); - let c = 1, d = 1, h = t, u = o; - const g = [!1]; - for (c = 1, h = t; h < l; c++, h++) { - const w = RK[h], C = Kv[h], S = h + 1 < l ? Kv[h + 1] : a; - for (d = w - o + 1, u = w; u < S; d++, u++) { - let L = Number.MIN_SAFE_INTEGER, x = !1; - u <= C && (L = Qde(s, e, h, t, i, n, u, a, o, qa[c - 1][d - 1] === 0, g)); - let Z = 0; - L !== Number.MAX_SAFE_INTEGER && (x = !0, Z = L + uu[c - 1][d - 1]); - const _ = u > w, v = _ ? uu[c][d - 1] + (qa[c][d - 1] > 0 ? -5 : 0) : 0, P = u > w + 1 && qa[c][d - 1] > 0, E = P ? uu[c][d - 2] + (qa[c][d - 2] > 0 ? -5 : 0) : 0; - if (P && (!_ || E >= v) && (!x || E >= Z)) - uu[c][d] = E, yS[c][d] = 3, qa[c][d] = 0; - else if (_ && (!x || v >= Z)) - uu[c][d] = v, yS[c][d] = 2, qa[c][d] = 0; - else if (x) - uu[c][d] = Z, yS[c][d] = 1, qa[c][d] = qa[c - 1][d - 1] + 1; + Fhe(r, c, t, o, e, n); + let d = 1, a = 1, h = t, u = o; + const m = [!1]; + for (d = 1, h = t; h < r; d++, h++) { + const y = yO[h], W = gT[h], G = h + 1 < r ? gT[h + 1] : c; + for (a = y - o + 1, u = y; u < G; a++, u++) { + let X = Number.MIN_SAFE_INTEGER, L = !1; + u <= W && (X = zhe(s, e, h, t, i, n, u, c, o, id[d - 1][a - 1] === 0, m)); + let S = 0; + X !== Number.MAX_SAFE_INTEGER && (L = !0, S = X + gu[d - 1][a - 1]); + const x = u > y, w = x ? gu[d][a - 1] + (id[d][a - 1] > 0 ? -5 : 0) : 0, A = u > y + 1 && id[d][a - 1] > 0, H = A ? gu[d][a - 2] + (id[d][a - 2] > 0 ? -5 : 0) : 0; + if (A && (!x || H >= w) && (!L || H >= S)) + gu[d][a] = H, w1[d][a] = 3, id[d][a] = 0; + else if (x && (!L || w >= S)) + gu[d][a] = w, w1[d][a] = 2, id[d][a] = 0; + else if (L) + gu[d][a] = S, w1[d][a] = 1, id[d][a] = id[d - 1][a - 1] + 1; else throw new Error("not possible"); } } - if (!g[0] && !r.firstMatchCanBeWeak) + if (!m[0] && !l.firstMatchCanBeWeak) return; - c--, d--; - const m = [uu[c][d], o]; - let f = 0, b = 0; - for (; c >= 1; ) { - let w = d; + d--, a--; + const b = [gu[d][a], o]; + let g = 0, Z = 0; + for (; d >= 1; ) { + let y = a; do { - const C = yS[c][w]; - if (C === 3) - w = w - 2; - else if (C === 2) - w = w - 1; + const W = w1[d][y]; + if (W === 3) + y = y - 2; + else if (W === 2) + y = y - 1; else break; - } while (w >= 1); - f > 1 && e[t + c - 1] === n[o + d - 1] && !xL(w + o - 1, i, n) && f + 1 > qa[c][w] && (w = d), w === d ? f++ : f = 1, b || (b = w), c--, d = w - 1, m.push(d); + } while (y >= 1); + g > 1 && e[t + d - 1] === n[o + a - 1] && !EX(y + o - 1, i, n) && g + 1 > id[d][y] && (y = a), y === a ? g++ : g = 1, Z || (Z = y), d--, a = y - 1, b.push(a); } - a - o === l && r.boostFullMatch && (m[0] += 2); - const y = b - l; - return m[0] -= y, m; + c - o === r && l.boostFullMatch && (b[0] += 2); + const f = Z - r; + return b[0] -= f, b; } -function Kde(s, e, t, i, n, o) { - let r = s - 1, l = e - 1; - for (; r >= t && l >= i; ) - n[r] === o[l] && (Kv[r] = l, r--), l--; +function Fhe(s, e, t, i, n, o) { + let l = s - 1, r = e - 1; + for (; l >= t && r >= i; ) + n[l] === o[r] && (gT[l] = r, l--), r--; } -function Qde(s, e, t, i, n, o, r, l, a, c, d) { - if (e[t] !== o[r]) +function zhe(s, e, t, i, n, o, l, r, c, d, a) { + if (e[t] !== o[l]) return Number.MIN_SAFE_INTEGER; let h = 1, u = !1; - return r === t - i ? h = s[t] === n[r] ? 7 : 5 : xL(r, n, o) && (r === 0 || !xL(r - 1, n, o)) ? (h = s[t] === n[r] ? 7 : 5, u = !0) : wS(o, r) && (r === 0 || !wS(o, r - 1)) ? h = 5 : (wS(o, r - 1) || iz(o, r - 1)) && (h = 5, u = !0), h > 1 && t === i && (d[0] = !0), u || (u = xL(r, n, o) || wS(o, r - 1) || iz(o, r - 1)), t === i ? r > a && (h -= u ? 3 : 5) : c ? h += u ? 2 : 0 : h += u ? 0 : 1, r + 1 === l && (h -= u ? 3 : 5), h; + return l === t - i ? h = s[t] === n[l] ? 7 : 5 : EX(l, n, o) && (l === 0 || !EX(l - 1, n, o)) ? (h = s[t] === n[l] ? 7 : 5, u = !0) : T1(o, l) && (l === 0 || !T1(o, l - 1)) ? h = 5 : (T1(o, l - 1) || xz(o, l - 1)) && (h = 5, u = !0), h > 1 && t === i && (a[0] = !0), u || (u = EX(l, n, o) || T1(o, l - 1) || xz(o, l - 1)), t === i ? l > c && (h -= u ? 3 : 5) : d ? h += u ? 2 : 0 : h += u ? 0 : 1, l + 1 === r && (h -= u ? 3 : 5), h; } -function jde(s, e, t, i, n, o, r) { - return qde(s, e, t, i, n, o, !0, r); +function Ahe(s, e, t, i, n, o, l) { + return Khe(s, e, t, i, n, o, !0, l); } -function qde(s, e, t, i, n, o, r, l) { - let a = wb(s, e, t, i, n, o, l); +function Khe(s, e, t, i, n, o, l, r) { + let c = IZ(s, e, t, i, n, o, r); if (s.length >= 3) { - const c = Math.min(7, s.length - 1); - for (let d = t + 1; d < c; d++) { - const h = $de(s, d); + const d = Math.min(7, s.length - 1); + for (let a = t + 1; a < d; a++) { + const h = Uhe(s, a); if (h) { - const u = wb(h, h.toLowerCase(), t, i, n, o, l); - u && (u[0] -= 3, (!a || u[0] > a[0]) && (a = u)); + const u = IZ(h, h.toLowerCase(), t, i, n, o, r); + u && (u[0] -= 3, (!c || u[0] > c[0]) && (c = u)); } } } - return a; + return c; } -function $de(s, e) { +function Uhe(s, e) { if (e + 1 >= s.length) return; const t = s[e], i = s[e + 1]; if (t !== i) return s.slice(0, e) + i + t + s.slice(e + 2); } -const ehe = "$(", IX = new RegExp(`\\$\\(${Ze.iconNameExpression}(?:${Ze.iconModifierExpression})?\\)`, "g"), the = new RegExp(`(\\\\)?${IX.source}`, "g"); -function ihe(s) { - return s.replace(the, (e, t) => t ? e : `\\${e}`); +const Phe = "$(", $J = new RegExp(`\\$\\(${Se.iconNameExpression}(?:${Se.iconModifierExpression})?\\)`, "g"), Bhe = new RegExp(`(\\\\)?${$J.source}`, "g"); +function _he(s) { + return s.replace(Bhe, (e, t) => t ? e : `\\${e}`); } -const nhe = new RegExp(`\\\\${IX.source}`, "g"); -function she(s) { - return s.replace(nhe, (e) => `\\${e}`); +const Qhe = new RegExp(`\\\\${$J.source}`, "g"); +function Ohe(s) { + return s.replace(Qhe, (e) => `\\${e}`); } -const ohe = new RegExp(`(\\s)?(\\\\)?${IX.source}(\\s)?`, "g"); -function EK(s) { - return s.indexOf(ehe) === -1 ? s : s.replace(ohe, (e, t, i, n) => i ? e : t || n || ""); +const jhe = new RegExp(`(\\s)?(\\\\)?${$J.source}(\\s)?`, "g"); +function WO(s) { + return s.indexOf(Phe) === -1 ? s : s.replace(jhe, (e, t, i, n) => i ? e : t || n || ""); } -function rhe(s) { +function qhe(s) { return s ? s.replace(/\$\((.*?)\)/g, (e, t) => ` ${t} `).trim() : ""; } -const aW = new RegExp(`\\$\\(${Ze.iconNameCharacter}+\\)`, "g"); -function hy(s) { - aW.lastIndex = 0; +const LR = new RegExp(`\\$\\(${Se.iconNameCharacter}+\\)`, "g"); +function Gf(s) { + LR.lastIndex = 0; let e = ""; const t = []; let i = 0; for (; ; ) { - const n = aW.lastIndex, o = aW.exec(s), r = s.substring(n, o == null ? void 0 : o.index); - if (r.length > 0) { - e += r; - for (let l = 0; l < r.length; l++) + const n = LR.lastIndex, o = LR.exec(s), l = s.substring(n, o == null ? void 0 : o.index); + if (l.length > 0) { + e += l; + for (let r = 0; r < l.length; r++) t.push(i); } if (!o) @@ -44599,26 +44599,26 @@ function hy(s) { } return { text: e, iconOffsets: t }; } -function cW(s, e, t = !1) { +function IR(s, e, t = !1) { const { text: i, iconOffsets: n } = e; if (!n || n.length === 0) - return tz(s, i, t); - const o = I_(i, " "), r = i.length - o.length, l = tz(s, o, t); - if (l) - for (const a of l) { - const c = n[a.start + r] + r; - a.start += c, a.end += c; + return Sz(s, i, t); + const o = AS(i, " "), l = i.length - o.length, r = Sz(s, o, t); + if (r) + for (const c of r) { + const d = n[c.start + l] + l; + c.start += d, c.end += d; } - return l; + return r; } -class Vn { +class kn { constructor(e = "", t = !1) { if (this.value = e, typeof this.value != "string") - throw hr("value"); + throw bl("value"); typeof t == "boolean" ? (this.isTrusted = t, this.supportThemeIcons = !1, this.supportHtml = !1) : (this.isTrusted = t.isTrusted ?? void 0, this.supportThemeIcons = t.supportThemeIcons ?? !1, this.supportHtml = t.supportHtml ?? !1); } appendText(e, t = 0) { - return this.value += ahe(this.supportThemeIcons ? ihe(e) : e).replace(/([ \t]+)/g, (i, n) => " ".repeat(n.length)).replace(/\>/gm, "\\>").replace(/\n/g, t === 1 ? `\\ + return this.value += eue(this.supportThemeIcons ? _he(e) : e).replace(/([ \t]+)/g, (i, n) => " ".repeat(n.length)).replace(/\>/gm, "\\>").replace(/\n/g, t === 1 ? `\\ ` : ` `), this; @@ -44628,32 +44628,32 @@ class Vn { } appendCodeblock(e, t) { return this.value += ` -${che(t, e)} +${tue(t, e)} `, this; } appendLink(e, t, i) { return this.value += "[", this.value += this._escape(t, "]"), this.value += "](", this.value += this._escape(String(e), ")"), i && (this.value += ` "${this._escape(this._escape(i, '"'), ")")}"`), this.value += ")", this; } _escape(e, t) { - const i = new RegExp(Po(t), "g"); + const i = new RegExp(Uo(t), "g"); return e.replace(i, (n, o) => e.charAt(o - 1) !== "\\" ? `\\${n}` : n); } } -function Cb(s) { - return Nl(s) ? !s.value : Array.isArray(s) ? s.every(Cb) : !0; +function SZ(s) { + return Mr(s) ? !s.value : Array.isArray(s) ? s.every(SZ) : !0; } -function Nl(s) { - return s instanceof Vn ? !0 : s && typeof s == "object" ? typeof s.value == "string" && (typeof s.isTrusted == "boolean" || typeof s.isTrusted == "object" || s.isTrusted === void 0) && (typeof s.supportThemeIcons == "boolean" || s.supportThemeIcons === void 0) : !1; +function Mr(s) { + return s instanceof kn ? !0 : s && typeof s == "object" ? typeof s.value == "string" && (typeof s.isTrusted == "boolean" || typeof s.isTrusted == "object" || s.isTrusted === void 0) && (typeof s.supportThemeIcons == "boolean" || s.supportThemeIcons === void 0) : !1; } -function lhe(s, e) { - return s === e ? !0 : !s || !e ? !1 : s.value === e.value && s.isTrusted === e.isTrusted && s.supportThemeIcons === e.supportThemeIcons && s.supportHtml === e.supportHtml && (s.baseUri === e.baseUri || !!s.baseUri && !!e.baseUri && d1(Le.from(s.baseUri), Le.from(e.baseUri))); +function $he(s, e) { + return s === e ? !0 : !s || !e ? !1 : s.value === e.value && s.isTrusted === e.isTrusted && s.supportThemeIcons === e.supportThemeIcons && s.supportHtml === e.supportHtml && (s.baseUri === e.baseUri || !!s.baseUri && !!e.baseUri && XW(Xe.from(s.baseUri), Xe.from(e.baseUri))); } -function ahe(s) { +function eue(s) { return s.replace(/[\\`*_{}[\]()#+\-!~]/g, "\\$&"); } -function che(s, e) { +function tue(s, e) { var n; - const t = ((n = s.match(/^`+/gm)) == null ? void 0 : n.reduce((o, r) => o.length > r.length ? o : r).length) ?? 0, i = t >= 3 ? t + 1 : 3; + const t = ((n = s.match(/^`+/gm)) == null ? void 0 : n.reduce((o, l) => o.length > l.length ? o : l).length) ?? 0, i = t >= 3 ? t + 1 : 3; return [ `${"`".repeat(i)}${e}`, s, @@ -44661,23 +44661,23 @@ function che(s, e) { ].join(` `); } -function CS(s) { +function M1(s) { return s.replace(/"/g, """); } -function dW(s) { +function SR(s) { return s && s.replace(/\\([\\`*_{}[\]()#+\-.!~])/g, "$1"); } -function dhe(s) { +function iue(s) { const e = [], t = s.split("|").map((n) => n.trim()); s = t[0]; const i = t[1]; if (i) { - const n = /height=(\d+)/.exec(i), o = /width=(\d+)/.exec(i), r = n ? n[1] : "", l = o ? o[1] : "", a = isFinite(parseInt(l)), c = isFinite(parseInt(r)); - a && e.push(`width="${l}"`), c && e.push(`height="${r}"`); + const n = /height=(\d+)/.exec(i), o = /width=(\d+)/.exec(i), l = n ? n[1] : "", r = o ? o[1] : "", c = isFinite(parseInt(r)), d = isFinite(parseInt(l)); + c && e.push(`width="${r}"`), d && e.push(`height="${l}"`); } return { href: s, dimensions: e }; } -class NX { +class eH { constructor(e) { this._prefix = e, this._lastId = 0; } @@ -44685,11 +44685,11 @@ class NX { return this._prefix + ++this._lastId; } } -const Qv = new NX("id#"); -let Fn = {}; +const ZT = new eH("id#"); +let zn = {}; (function() { function s(e, t) { - t(Fn); + t(zn); } s.amd = !0, function(e, t) { typeof s == "function" && s.amd ? s(["exports"], t) : typeof exports == "object" && typeof module < "u" ? t(exports) : (e = typeof globalThis < "u" ? globalThis : e || self, t(e.marked = {})); @@ -44709,711 +44709,711 @@ let Fn = {}; }; } e.defaults = t(); - function i(at) { - e.defaults = at; + function i(ct) { + e.defaults = ct; } - const n = /[&<>"']/, o = new RegExp(n.source, "g"), r = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, l = new RegExp(r.source, "g"), a = { + const n = /[&<>"']/, o = new RegExp(n.source, "g"), l = /[<>"']|&(?!(#\d{1,7}|#[Xx][a-fA-F0-9]{1,6}|\w+);)/, r = new RegExp(l.source, "g"), c = { "&": "&", "<": "<", ">": ">", '"': """, "'": "'" - }, c = (at) => a[at]; - function d(at, T) { + }, d = (ct) => c[ct]; + function a(ct, T) { if (T) { - if (n.test(at)) - return at.replace(o, c); - } else if (r.test(at)) - return at.replace(l, c); - return at; + if (n.test(ct)) + return ct.replace(o, d); + } else if (l.test(ct)) + return ct.replace(r, d); + return ct; } const h = /(^|[^\[])\^/g; - function u(at, T) { - let D = typeof at == "string" ? at : at.source; + function u(ct, T) { + let M = typeof ct == "string" ? ct : ct.source; T = T || ""; - const G = { - replace: (F, O) => { - let q = typeof O == "string" ? O : O.source; - return q = q.replace(h, "$1"), D = D.replace(F, q), G; + const v = { + replace: (D, U) => { + let q = typeof U == "string" ? U : U.source; + return q = q.replace(h, "$1"), M = M.replace(D, q), v; }, - getRegex: () => new RegExp(D, T) + getRegex: () => new RegExp(M, T) }; - return G; + return v; } - function g(at) { + function m(ct) { try { - at = encodeURI(at).replace(/%25/g, "%"); + ct = encodeURI(ct).replace(/%25/g, "%"); } catch { return null; } - return at; - } - const m = { exec: () => null }; - function f(at, T) { - const D = at.replace(/\|/g, (O, q, re) => { - let Me = !1, ve = q; - for (; --ve >= 0 && re[ve] === "\\"; ) - Me = !Me; - return Me ? "|" : " |"; - }), G = D.split(/ \|/); - let F = 0; - if (G[0].trim() || G.shift(), G.length > 0 && !G[G.length - 1].trim() && G.pop(), T) - if (G.length > T) - G.splice(T); - else - for (; G.length < T; ) - G.push(""); - for (; F < G.length; F++) - G[F] = G[F].trim().replace(/\\\|/g, "|"); - return G; + return ct; } - function b(at, T, D) { - const G = at.length; - if (G === 0) + const b = { exec: () => null }; + function g(ct, T) { + const M = ct.replace(/\|/g, (U, q, le) => { + let Ie = !1, we = q; + for (; --we >= 0 && le[we] === "\\"; ) + Ie = !Ie; + return Ie ? "|" : " |"; + }), v = M.split(/ \|/); + let D = 0; + if (v[0].trim() || v.shift(), v.length > 0 && !v[v.length - 1].trim() && v.pop(), T) + if (v.length > T) + v.splice(T); + else + for (; v.length < T; ) + v.push(""); + for (; D < v.length; D++) + v[D] = v[D].trim().replace(/\\\|/g, "|"); + return v; + } + function Z(ct, T, M) { + const v = ct.length; + if (v === 0) return ""; - let F = 0; - for (; F < G && at.charAt(G - F - 1) === T; ) - F++; - return at.slice(0, G - F); + let D = 0; + for (; D < v && ct.charAt(v - D - 1) === T; ) + D++; + return ct.slice(0, v - D); } - function y(at, T) { - if (at.indexOf(T[1]) === -1) + function f(ct, T) { + if (ct.indexOf(T[1]) === -1) return -1; - let D = 0; - for (let G = 0; G < at.length; G++) - if (at[G] === "\\") - G++; - else if (at[G] === T[0]) - D++; - else if (at[G] === T[1] && (D--, D < 0)) - return G; + let M = 0; + for (let v = 0; v < ct.length; v++) + if (ct[v] === "\\") + v++; + else if (ct[v] === T[0]) + M++; + else if (ct[v] === T[1] && (M--, M < 0)) + return v; return -1; } - function w(at, T, D, G) { - const F = T.href, O = T.title ? d(T.title) : null, q = at[1].replace(/\\([\[\]])/g, "$1"); - if (at[0].charAt(0) !== "!") { - G.state.inLink = !0; - const re = { + function y(ct, T, M, v) { + const D = T.href, U = T.title ? a(T.title) : null, q = ct[1].replace(/\\([\[\]])/g, "$1"); + if (ct[0].charAt(0) !== "!") { + v.state.inLink = !0; + const le = { type: "link", - raw: D, - href: F, - title: O, + raw: M, + href: D, + title: U, text: q, - tokens: G.inlineTokens(q) + tokens: v.inlineTokens(q) }; - return G.state.inLink = !1, re; + return v.state.inLink = !1, le; } return { type: "image", - raw: D, - href: F, - title: O, - text: d(q) + raw: M, + href: D, + title: U, + text: a(q) }; } - function C(at, T) { - const D = at.match(/^(\s+)(?:```)/); - if (D === null) + function W(ct, T) { + const M = ct.match(/^(\s+)(?:```)/); + if (M === null) return T; - const G = D[1]; + const v = M[1]; return T.split(` -`).map((F) => { - const O = F.match(/^\s+/); - if (O === null) - return F; - const [q] = O; - return q.length >= G.length ? F.slice(G.length) : F; +`).map((D) => { + const U = D.match(/^\s+/); + if (U === null) + return D; + const [q] = U; + return q.length >= v.length ? D.slice(v.length) : D; }).join(` `); } - class S { + class G { // set by the lexer constructor(T) { - Gi(this, "options"); - Gi(this, "rules"); + qt(this, "options"); + qt(this, "rules"); // set by the lexer - Gi(this, "lexer"); + qt(this, "lexer"); this.options = T || e.defaults; } space(T) { - const D = this.rules.block.newline.exec(T); - if (D && D[0].length > 0) + const M = this.rules.block.newline.exec(T); + if (M && M[0].length > 0) return { type: "space", - raw: D[0] + raw: M[0] }; } code(T) { - const D = this.rules.block.code.exec(T); - if (D) { - const G = D[0].replace(/^ {1,4}/gm, ""); + const M = this.rules.block.code.exec(T); + if (M) { + const v = M[0].replace(/^ {1,4}/gm, ""); return { type: "code", - raw: D[0], + raw: M[0], codeBlockStyle: "indented", - text: this.options.pedantic ? G : b(G, ` + text: this.options.pedantic ? v : Z(v, ` `) }; } } fences(T) { - const D = this.rules.block.fences.exec(T); - if (D) { - const G = D[0], F = C(G, D[3] || ""); + const M = this.rules.block.fences.exec(T); + if (M) { + const v = M[0], D = W(v, M[3] || ""); return { type: "code", - raw: G, - lang: D[2] ? D[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : D[2], - text: F + raw: v, + lang: M[2] ? M[2].trim().replace(this.rules.inline.anyPunctuation, "$1") : M[2], + text: D }; } } heading(T) { - const D = this.rules.block.heading.exec(T); - if (D) { - let G = D[2].trim(); - if (/#$/.test(G)) { - const F = b(G, "#"); - (this.options.pedantic || !F || / $/.test(F)) && (G = F.trim()); + const M = this.rules.block.heading.exec(T); + if (M) { + let v = M[2].trim(); + if (/#$/.test(v)) { + const D = Z(v, "#"); + (this.options.pedantic || !D || / $/.test(D)) && (v = D.trim()); } return { type: "heading", - raw: D[0], - depth: D[1].length, - text: G, - tokens: this.lexer.inline(G) + raw: M[0], + depth: M[1].length, + text: v, + tokens: this.lexer.inline(v) }; } } hr(T) { - const D = this.rules.block.hr.exec(T); - if (D) + const M = this.rules.block.hr.exec(T); + if (M) return { type: "hr", - raw: b(D[0], ` + raw: Z(M[0], ` `) }; } blockquote(T) { - const D = this.rules.block.blockquote.exec(T); - if (D) { - let G = b(D[0], ` + const M = this.rules.block.blockquote.exec(T); + if (M) { + let v = Z(M[0], ` `).split(` -`), F = "", O = ""; +`), D = "", U = ""; const q = []; - for (; G.length > 0; ) { - let re = !1; - const Me = []; - let ve; - for (ve = 0; ve < G.length; ve++) - if (/^ {0,3}>/.test(G[ve])) - Me.push(G[ve]), re = !0; - else if (!re) - Me.push(G[ve]); + for (; v.length > 0; ) { + let le = !1; + const Ie = []; + let we; + for (we = 0; we < v.length; we++) + if (/^ {0,3}>/.test(v[we])) + Ie.push(v[we]), le = !0; + else if (!le) + Ie.push(v[we]); else break; - G = G.slice(ve); - const ot = Me.join(` -`), It = ot.replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g, ` + v = v.slice(we); + const ot = Ie.join(` +`), Ct = ot.replace(/\n {0,3}((?:=+|-+) *)(?=\n|$)/g, ` $1`).replace(/^ {0,3}>[ \t]?/gm, ""); - F = F ? `${F} -${ot}` : ot, O = O ? `${O} -${It}` : It; - const Gt = this.lexer.state.top; - if (this.lexer.state.top = !0, this.lexer.blockTokens(It, q, !0), this.lexer.state.top = Gt, G.length === 0) + D = D ? `${D} +${ot}` : ot, U = U ? `${U} +${Ct}` : Ct; + const vt = this.lexer.state.top; + if (this.lexer.state.top = !0, this.lexer.blockTokens(Ct, q, !0), this.lexer.state.top = vt, v.length === 0) break; - const Ci = q[q.length - 1]; - if ((Ci == null ? void 0 : Ci.type) === "code") + const Gi = q[q.length - 1]; + if ((Gi == null ? void 0 : Gi.type) === "code") break; - if ((Ci == null ? void 0 : Ci.type) === "blockquote") { - const Si = Ci, Os = Si.raw + ` -` + G.join(` -`), $o = this.blockquote(Os); - q[q.length - 1] = $o, F = F.substring(0, F.length - Si.raw.length) + $o.raw, O = O.substring(0, O.length - Si.text.length) + $o.text; + if ((Gi == null ? void 0 : Gi.type) === "blockquote") { + const Xi = Gi, Bs = Xi.raw + ` +` + v.join(` +`), tl = this.blockquote(Bs); + q[q.length - 1] = tl, D = D.substring(0, D.length - Xi.raw.length) + tl.raw, U = U.substring(0, U.length - Xi.text.length) + tl.text; break; - } else if ((Ci == null ? void 0 : Ci.type) === "list") { - const Si = Ci, Os = Si.raw + ` -` + G.join(` -`), $o = this.list(Os); - q[q.length - 1] = $o, F = F.substring(0, F.length - Ci.raw.length) + $o.raw, O = O.substring(0, O.length - Si.raw.length) + $o.raw, G = Os.substring(q[q.length - 1].raw.length).split(` + } else if ((Gi == null ? void 0 : Gi.type) === "list") { + const Xi = Gi, Bs = Xi.raw + ` +` + v.join(` +`), tl = this.list(Bs); + q[q.length - 1] = tl, D = D.substring(0, D.length - Gi.raw.length) + tl.raw, U = U.substring(0, U.length - Xi.raw.length) + tl.raw, v = Bs.substring(q[q.length - 1].raw.length).split(` `); continue; } } return { type: "blockquote", - raw: F, + raw: D, tokens: q, - text: O + text: U }; } } list(T) { - let D = this.rules.block.list.exec(T); - if (D) { - let G = D[1].trim(); - const F = G.length > 1, O = { + let M = this.rules.block.list.exec(T); + if (M) { + let v = M[1].trim(); + const D = v.length > 1, U = { type: "list", raw: "", - ordered: F, - start: F ? +G.slice(0, -1) : "", + ordered: D, + start: D ? +v.slice(0, -1) : "", loose: !1, items: [] }; - G = F ? `\\d{1,9}\\${G.slice(-1)}` : `\\${G}`, this.options.pedantic && (G = F ? G : "[*+-]"); - const q = new RegExp(`^( {0,3}${G})((?:[ ][^\\n]*)?(?:\\n|$))`); - let re = !1; + v = D ? `\\d{1,9}\\${v.slice(-1)}` : `\\${v}`, this.options.pedantic && (v = D ? v : "[*+-]"); + const q = new RegExp(`^( {0,3}${v})((?:[ ][^\\n]*)?(?:\\n|$))`); + let le = !1; for (; T; ) { - let Me = !1, ve = "", ot = ""; - if (!(D = q.exec(T)) || this.rules.block.hr.test(T)) + let Ie = !1, we = "", ot = ""; + if (!(M = q.exec(T)) || this.rules.block.hr.test(T)) break; - ve = D[0], T = T.substring(ve.length); - let It = D[2].split(` -`, 1)[0].replace(/^\t+/, (M0) => " ".repeat(3 * M0.length)), Gt = T.split(` -`, 1)[0], Ci = !It.trim(), Si = 0; - if (this.options.pedantic ? (Si = 2, ot = It.trimStart()) : Ci ? Si = D[1].length + 1 : (Si = D[2].search(/[^ ]/), Si = Si > 4 ? 1 : Si, ot = It.slice(Si), Si += D[1].length), Ci && /^ *$/.test(Gt) && (ve += Gt + ` -`, T = T.substring(Gt.length + 1), Me = !0), !Me) { - const M0 = new RegExp(`^ {0,${Math.min(3, Si - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), Ue = new RegExp(`^ {0,${Math.min(3, Si - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), J = new RegExp(`^ {0,${Math.min(3, Si - 1)}}(?:\`\`\`|~~~)`), Ae = new RegExp(`^ {0,${Math.min(3, Si - 1)}}#`); + we = M[0], T = T.substring(we.length); + let Ct = M[2].split(` +`, 1)[0].replace(/^\t+/, (T0) => " ".repeat(3 * T0.length)), vt = T.split(` +`, 1)[0], Gi = !Ct.trim(), Xi = 0; + if (this.options.pedantic ? (Xi = 2, ot = Ct.trimStart()) : Gi ? Xi = M[1].length + 1 : (Xi = M[2].search(/[^ ]/), Xi = Xi > 4 ? 1 : Xi, ot = Ct.slice(Xi), Xi += M[1].length), Gi && /^ *$/.test(vt) && (we += vt + ` +`, T = T.substring(vt.length + 1), Ie = !0), !Ie) { + const T0 = new RegExp(`^ {0,${Math.min(3, Xi - 1)}}(?:[*+-]|\\d{1,9}[.)])((?:[ ][^\\n]*)?(?:\\n|$))`), _e = new RegExp(`^ {0,${Math.min(3, Xi - 1)}}((?:- *){3,}|(?:_ *){3,}|(?:\\* *){3,})(?:\\n+|$)`), B = new RegExp(`^ {0,${Math.min(3, Xi - 1)}}(?:\`\`\`|~~~)`), Ve = new RegExp(`^ {0,${Math.min(3, Xi - 1)}}#`); for (; T; ) { - const Fe = T.split(` + const De = T.split(` `, 1)[0]; - if (Gt = Fe, this.options.pedantic && (Gt = Gt.replace(/^ {1,4}(?=( {4})*[^ ])/g, " ")), J.test(Gt) || Ae.test(Gt) || M0.test(Gt) || Ue.test(T)) + if (vt = De, this.options.pedantic && (vt = vt.replace(/^ {1,4}(?=( {4})*[^ ])/g, " ")), B.test(vt) || Ve.test(vt) || T0.test(vt) || _e.test(T)) break; - if (Gt.search(/[^ ]/) >= Si || !Gt.trim()) + if (vt.search(/[^ ]/) >= Xi || !vt.trim()) ot += ` -` + Gt.slice(Si); +` + vt.slice(Xi); else { - if (Ci || It.search(/[^ ]/) >= 4 || J.test(It) || Ae.test(It) || Ue.test(It)) + if (Gi || Ct.search(/[^ ]/) >= 4 || B.test(Ct) || Ve.test(Ct) || _e.test(Ct)) break; ot += ` -` + Gt; +` + vt; } - !Ci && !Gt.trim() && (Ci = !0), ve += Fe + ` -`, T = T.substring(Fe.length + 1), It = Gt.slice(Si); + !Gi && !vt.trim() && (Gi = !0), we += De + ` +`, T = T.substring(De.length + 1), Ct = vt.slice(Xi); } } - O.loose || (re ? O.loose = !0 : /\n *\n *$/.test(ve) && (re = !0)); - let Os = null, $o; - this.options.gfm && (Os = /^\[[ xX]\] /.exec(ot), Os && ($o = Os[0] !== "[ ] ", ot = ot.replace(/^\[[ xX]\] +/, ""))), O.items.push({ + U.loose || (le ? U.loose = !0 : /\n *\n *$/.test(we) && (le = !0)); + let Bs = null, tl; + this.options.gfm && (Bs = /^\[[ xX]\] /.exec(ot), Bs && (tl = Bs[0] !== "[ ] ", ot = ot.replace(/^\[[ xX]\] +/, ""))), U.items.push({ type: "list_item", - raw: ve, - task: !!Os, - checked: $o, + raw: we, + task: !!Bs, + checked: tl, loose: !1, text: ot, tokens: [] - }), O.raw += ve; + }), U.raw += we; } - O.items[O.items.length - 1].raw = O.items[O.items.length - 1].raw.trimEnd(), O.items[O.items.length - 1].text = O.items[O.items.length - 1].text.trimEnd(), O.raw = O.raw.trimEnd(); - for (let Me = 0; Me < O.items.length; Me++) - if (this.lexer.state.top = !1, O.items[Me].tokens = this.lexer.blockTokens(O.items[Me].text, []), !O.loose) { - const ve = O.items[Me].tokens.filter((It) => It.type === "space"), ot = ve.length > 0 && ve.some((It) => /\n.*\n/.test(It.raw)); - O.loose = ot; + U.items[U.items.length - 1].raw = U.items[U.items.length - 1].raw.trimEnd(), U.items[U.items.length - 1].text = U.items[U.items.length - 1].text.trimEnd(), U.raw = U.raw.trimEnd(); + for (let Ie = 0; Ie < U.items.length; Ie++) + if (this.lexer.state.top = !1, U.items[Ie].tokens = this.lexer.blockTokens(U.items[Ie].text, []), !U.loose) { + const we = U.items[Ie].tokens.filter((Ct) => Ct.type === "space"), ot = we.length > 0 && we.some((Ct) => /\n.*\n/.test(Ct.raw)); + U.loose = ot; } - if (O.loose) - for (let Me = 0; Me < O.items.length; Me++) - O.items[Me].loose = !0; - return O; + if (U.loose) + for (let Ie = 0; Ie < U.items.length; Ie++) + U.items[Ie].loose = !0; + return U; } } html(T) { - const D = this.rules.block.html.exec(T); - if (D) + const M = this.rules.block.html.exec(T); + if (M) return { type: "html", block: !0, - raw: D[0], - pre: D[1] === "pre" || D[1] === "script" || D[1] === "style", - text: D[0] + raw: M[0], + pre: M[1] === "pre" || M[1] === "script" || M[1] === "style", + text: M[0] }; } def(T) { - const D = this.rules.block.def.exec(T); - if (D) { - const G = D[1].toLowerCase().replace(/\s+/g, " "), F = D[2] ? D[2].replace(/^<(.*)>$/, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "", O = D[3] ? D[3].substring(1, D[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : D[3]; + const M = this.rules.block.def.exec(T); + if (M) { + const v = M[1].toLowerCase().replace(/\s+/g, " "), D = M[2] ? M[2].replace(/^<(.*)>$/, "$1").replace(this.rules.inline.anyPunctuation, "$1") : "", U = M[3] ? M[3].substring(1, M[3].length - 1).replace(this.rules.inline.anyPunctuation, "$1") : M[3]; return { type: "def", - tag: G, - raw: D[0], - href: F, - title: O + tag: v, + raw: M[0], + href: D, + title: U }; } } table(T) { - const D = this.rules.block.table.exec(T); - if (!D || !/[:|]/.test(D[2])) + const M = this.rules.block.table.exec(T); + if (!M || !/[:|]/.test(M[2])) return; - const G = f(D[1]), F = D[2].replace(/^\||\| *$/g, "").split("|"), O = D[3] && D[3].trim() ? D[3].replace(/\n[ \t]*$/, "").split(` + const v = g(M[1]), D = M[2].replace(/^\||\| *$/g, "").split("|"), U = M[3] && M[3].trim() ? M[3].replace(/\n[ \t]*$/, "").split(` `) : [], q = { type: "table", - raw: D[0], + raw: M[0], header: [], align: [], rows: [] }; - if (G.length === F.length) { - for (const re of F) - /^ *-+: *$/.test(re) ? q.align.push("right") : /^ *:-+: *$/.test(re) ? q.align.push("center") : /^ *:-+ *$/.test(re) ? q.align.push("left") : q.align.push(null); - for (let re = 0; re < G.length; re++) + if (v.length === D.length) { + for (const le of D) + /^ *-+: *$/.test(le) ? q.align.push("right") : /^ *:-+: *$/.test(le) ? q.align.push("center") : /^ *:-+ *$/.test(le) ? q.align.push("left") : q.align.push(null); + for (let le = 0; le < v.length; le++) q.header.push({ - text: G[re], - tokens: this.lexer.inline(G[re]), + text: v[le], + tokens: this.lexer.inline(v[le]), header: !0, - align: q.align[re] + align: q.align[le] }); - for (const re of O) - q.rows.push(f(re, q.header.length).map((Me, ve) => ({ - text: Me, - tokens: this.lexer.inline(Me), + for (const le of U) + q.rows.push(g(le, q.header.length).map((Ie, we) => ({ + text: Ie, + tokens: this.lexer.inline(Ie), header: !1, - align: q.align[ve] + align: q.align[we] }))); return q; } } lheading(T) { - const D = this.rules.block.lheading.exec(T); - if (D) + const M = this.rules.block.lheading.exec(T); + if (M) return { type: "heading", - raw: D[0], - depth: D[2].charAt(0) === "=" ? 1 : 2, - text: D[1], - tokens: this.lexer.inline(D[1]) + raw: M[0], + depth: M[2].charAt(0) === "=" ? 1 : 2, + text: M[1], + tokens: this.lexer.inline(M[1]) }; } paragraph(T) { - const D = this.rules.block.paragraph.exec(T); - if (D) { - const G = D[1].charAt(D[1].length - 1) === ` -` ? D[1].slice(0, -1) : D[1]; + const M = this.rules.block.paragraph.exec(T); + if (M) { + const v = M[1].charAt(M[1].length - 1) === ` +` ? M[1].slice(0, -1) : M[1]; return { type: "paragraph", - raw: D[0], - text: G, - tokens: this.lexer.inline(G) + raw: M[0], + text: v, + tokens: this.lexer.inline(v) }; } } text(T) { - const D = this.rules.block.text.exec(T); - if (D) + const M = this.rules.block.text.exec(T); + if (M) return { type: "text", - raw: D[0], - text: D[0], - tokens: this.lexer.inline(D[0]) + raw: M[0], + text: M[0], + tokens: this.lexer.inline(M[0]) }; } escape(T) { - const D = this.rules.inline.escape.exec(T); - if (D) + const M = this.rules.inline.escape.exec(T); + if (M) return { type: "escape", - raw: D[0], - text: d(D[1]) + raw: M[0], + text: a(M[1]) }; } tag(T) { - const D = this.rules.inline.tag.exec(T); - if (D) - return !this.lexer.state.inLink && /^/i.test(D[0]) && (this.lexer.state.inLink = !1), !this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(D[0]) ? this.lexer.state.inRawBlock = !0 : this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(D[0]) && (this.lexer.state.inRawBlock = !1), { + const M = this.rules.inline.tag.exec(T); + if (M) + return !this.lexer.state.inLink && /^/i.test(M[0]) && (this.lexer.state.inLink = !1), !this.lexer.state.inRawBlock && /^<(pre|code|kbd|script)(\s|>)/i.test(M[0]) ? this.lexer.state.inRawBlock = !0 : this.lexer.state.inRawBlock && /^<\/(pre|code|kbd|script)(\s|>)/i.test(M[0]) && (this.lexer.state.inRawBlock = !1), { type: "html", - raw: D[0], + raw: M[0], inLink: this.lexer.state.inLink, inRawBlock: this.lexer.state.inRawBlock, block: !1, - text: D[0] + text: M[0] }; } link(T) { - const D = this.rules.inline.link.exec(T); - if (D) { - const G = D[2].trim(); - if (!this.options.pedantic && /^$/.test(G)) + const M = this.rules.inline.link.exec(T); + if (M) { + const v = M[2].trim(); + if (!this.options.pedantic && /^$/.test(v)) return; - const q = b(G.slice(0, -1), "\\"); - if ((G.length - q.length) % 2 === 0) + const q = Z(v.slice(0, -1), "\\"); + if ((v.length - q.length) % 2 === 0) return; } else { - const q = y(D[2], "()"); + const q = f(M[2], "()"); if (q > -1) { - const Me = (D[0].indexOf("!") === 0 ? 5 : 4) + D[1].length + q; - D[2] = D[2].substring(0, q), D[0] = D[0].substring(0, Me).trim(), D[3] = ""; + const Ie = (M[0].indexOf("!") === 0 ? 5 : 4) + M[1].length + q; + M[2] = M[2].substring(0, q), M[0] = M[0].substring(0, Ie).trim(), M[3] = ""; } } - let F = D[2], O = ""; + let D = M[2], U = ""; if (this.options.pedantic) { - const q = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(F); - q && (F = q[1], O = q[3]); + const q = /^([^'"]*[^\s])\s+(['"])(.*)\2/.exec(D); + q && (D = q[1], U = q[3]); } else - O = D[3] ? D[3].slice(1, -1) : ""; - return F = F.trim(), /^$/.test(G) ? F = F.slice(1) : F = F.slice(1, -1)), w(D, { - href: F && F.replace(this.rules.inline.anyPunctuation, "$1"), - title: O && O.replace(this.rules.inline.anyPunctuation, "$1") - }, D[0], this.lexer); + U = M[3] ? M[3].slice(1, -1) : ""; + return D = D.trim(), /^$/.test(v) ? D = D.slice(1) : D = D.slice(1, -1)), y(M, { + href: D && D.replace(this.rules.inline.anyPunctuation, "$1"), + title: U && U.replace(this.rules.inline.anyPunctuation, "$1") + }, M[0], this.lexer); } } - reflink(T, D) { - let G; - if ((G = this.rules.inline.reflink.exec(T)) || (G = this.rules.inline.nolink.exec(T))) { - const F = (G[2] || G[1]).replace(/\s+/g, " "), O = D[F.toLowerCase()]; - if (!O) { - const q = G[0].charAt(0); + reflink(T, M) { + let v; + if ((v = this.rules.inline.reflink.exec(T)) || (v = this.rules.inline.nolink.exec(T))) { + const D = (v[2] || v[1]).replace(/\s+/g, " "), U = M[D.toLowerCase()]; + if (!U) { + const q = v[0].charAt(0); return { type: "text", raw: q, text: q }; } - return w(G, O, G[0], this.lexer); + return y(v, U, v[0], this.lexer); } } - emStrong(T, D, G = "") { - let F = this.rules.inline.emStrongLDelim.exec(T); - if (!F || F[3] && G.match(/[\p{L}\p{N}]/u)) + emStrong(T, M, v = "") { + let D = this.rules.inline.emStrongLDelim.exec(T); + if (!D || D[3] && v.match(/[\p{L}\p{N}]/u)) return; - if (!(F[1] || F[2] || "") || !G || this.rules.inline.punctuation.exec(G)) { - const q = [...F[0]].length - 1; - let re, Me, ve = q, ot = 0; - const It = F[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; - for (It.lastIndex = 0, D = D.slice(-1 * T.length + q); (F = It.exec(D)) != null; ) { - if (re = F[1] || F[2] || F[3] || F[4] || F[5] || F[6], !re) + if (!(D[1] || D[2] || "") || !v || this.rules.inline.punctuation.exec(v)) { + const q = [...D[0]].length - 1; + let le, Ie, we = q, ot = 0; + const Ct = D[0][0] === "*" ? this.rules.inline.emStrongRDelimAst : this.rules.inline.emStrongRDelimUnd; + for (Ct.lastIndex = 0, M = M.slice(-1 * T.length + q); (D = Ct.exec(M)) != null; ) { + if (le = D[1] || D[2] || D[3] || D[4] || D[5] || D[6], !le) continue; - if (Me = [...re].length, F[3] || F[4]) { - ve += Me; + if (Ie = [...le].length, D[3] || D[4]) { + we += Ie; continue; - } else if ((F[5] || F[6]) && q % 3 && !((q + Me) % 3)) { - ot += Me; + } else if ((D[5] || D[6]) && q % 3 && !((q + Ie) % 3)) { + ot += Ie; continue; } - if (ve -= Me, ve > 0) + if (we -= Ie, we > 0) continue; - Me = Math.min(Me, Me + ve + ot); - const Gt = [...F[0]][0].length, Ci = T.slice(0, q + F.index + Gt + Me); - if (Math.min(q, Me) % 2) { - const Os = Ci.slice(1, -1); + Ie = Math.min(Ie, Ie + we + ot); + const vt = [...D[0]][0].length, Gi = T.slice(0, q + D.index + vt + Ie); + if (Math.min(q, Ie) % 2) { + const Bs = Gi.slice(1, -1); return { type: "em", - raw: Ci, - text: Os, - tokens: this.lexer.inlineTokens(Os) + raw: Gi, + text: Bs, + tokens: this.lexer.inlineTokens(Bs) }; } - const Si = Ci.slice(2, -2); + const Xi = Gi.slice(2, -2); return { type: "strong", - raw: Ci, - text: Si, - tokens: this.lexer.inlineTokens(Si) + raw: Gi, + text: Xi, + tokens: this.lexer.inlineTokens(Xi) }; } } } codespan(T) { - const D = this.rules.inline.code.exec(T); - if (D) { - let G = D[2].replace(/\n/g, " "); - const F = /[^ ]/.test(G), O = /^ /.test(G) && / $/.test(G); - return F && O && (G = G.substring(1, G.length - 1)), G = d(G, !0), { + const M = this.rules.inline.code.exec(T); + if (M) { + let v = M[2].replace(/\n/g, " "); + const D = /[^ ]/.test(v), U = /^ /.test(v) && / $/.test(v); + return D && U && (v = v.substring(1, v.length - 1)), v = a(v, !0), { type: "codespan", - raw: D[0], - text: G + raw: M[0], + text: v }; } } br(T) { - const D = this.rules.inline.br.exec(T); - if (D) + const M = this.rules.inline.br.exec(T); + if (M) return { type: "br", - raw: D[0] + raw: M[0] }; } del(T) { - const D = this.rules.inline.del.exec(T); - if (D) + const M = this.rules.inline.del.exec(T); + if (M) return { type: "del", - raw: D[0], - text: D[2], - tokens: this.lexer.inlineTokens(D[2]) + raw: M[0], + text: M[2], + tokens: this.lexer.inlineTokens(M[2]) }; } autolink(T) { - const D = this.rules.inline.autolink.exec(T); - if (D) { - let G, F; - return D[2] === "@" ? (G = d(D[1]), F = "mailto:" + G) : (G = d(D[1]), F = G), { + const M = this.rules.inline.autolink.exec(T); + if (M) { + let v, D; + return M[2] === "@" ? (v = a(M[1]), D = "mailto:" + v) : (v = a(M[1]), D = v), { type: "link", - raw: D[0], - text: G, - href: F, + raw: M[0], + text: v, + href: D, tokens: [ { type: "text", - raw: G, - text: G + raw: v, + text: v } ] }; } } url(T) { - var G; - let D; - if (D = this.rules.inline.url.exec(T)) { - let F, O; - if (D[2] === "@") - F = d(D[0]), O = "mailto:" + F; + var v; + let M; + if (M = this.rules.inline.url.exec(T)) { + let D, U; + if (M[2] === "@") + D = a(M[0]), U = "mailto:" + D; else { let q; do - q = D[0], D[0] = ((G = this.rules.inline._backpedal.exec(D[0])) == null ? void 0 : G[0]) ?? ""; - while (q !== D[0]); - F = d(D[0]), D[1] === "www." ? O = "http://" + D[0] : O = D[0]; + q = M[0], M[0] = ((v = this.rules.inline._backpedal.exec(M[0])) == null ? void 0 : v[0]) ?? ""; + while (q !== M[0]); + D = a(M[0]), M[1] === "www." ? U = "http://" + M[0] : U = M[0]; } return { type: "link", - raw: D[0], - text: F, - href: O, + raw: M[0], + text: D, + href: U, tokens: [ { type: "text", - raw: F, - text: F + raw: D, + text: D } ] }; } } inlineText(T) { - const D = this.rules.inline.text.exec(T); - if (D) { - let G; - return this.lexer.state.inRawBlock ? G = D[0] : G = d(D[0]), { + const M = this.rules.inline.text.exec(T); + if (M) { + let v; + return this.lexer.state.inRawBlock ? v = M[0] : v = a(M[0]), { type: "text", - raw: D[0], - text: G + raw: M[0], + text: v }; } } } - const L = /^(?: *(?:\n|$))+/, x = /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/, Z = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, _ = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, v = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, P = /(?:[*+-]|\d{1,9}[.)])/, E = u(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g, P).replace(/blockCode/g, / {4}/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).getRegex(), Y = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, B = /^[^\n]+/, X = /(?!\s*\])(?:\\.|[^\[\]\\])+/, j = u(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/).replace("label", X).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(), le = u(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, P).getRegex(), ue = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul", be = /|$))/, me = u("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))", "i").replace("comment", be).replace("tag", ue).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), Ve = u(Y).replace("hr", _).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", ue).getRegex(), ci = { - blockquote: u(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", Ve).getRegex(), - code: x, + const X = /^(?: *(?:\n|$))+/, L = /^( {4}[^\n]+(?:\n(?: *(?:\n|$))*)?)+/, S = /^ {0,3}(`{3,}(?=[^`\n]*(?:\n|$))|~{3,})([^\n]*)(?:\n|$)(?:|([\s\S]*?)(?:\n|$))(?: {0,3}\1[~`]* *(?=\n|$)|$)/, x = /^ {0,3}((?:-[\t ]*){3,}|(?:_[ \t]*){3,}|(?:\*[ \t]*){3,})(?:\n+|$)/, w = /^ {0,3}(#{1,6})(?=\s|$)(.*)(?:\n+|$)/, A = /(?:[*+-]|\d{1,9}[.)])/, H = u(/^(?!bull |blockCode|fences|blockquote|heading|html)((?:.|\n(?!\s*?\n|bull |blockCode|fences|blockquote|heading|html))+?)\n {0,3}(=+|-+) *(?:\n+|$)/).replace(/bull/g, A).replace(/blockCode/g, / {4}/).replace(/fences/g, / {0,3}(?:`{3,}|~{3,})/).replace(/blockquote/g, / {0,3}>/).replace(/heading/g, / {0,3}#{1,6}/).replace(/html/g, / {0,3}<[^\n>]+>\n/).getRegex(), F = /^([^\n]+(?:\n(?!hr|heading|lheading|blockquote|fences|list|html|table| +\n)[^\n]+)*)/, K = /^[^\n]+/, E = /(?!\s*\])(?:\\.|[^\[\]\\])+/, j = u(/^ {0,3}\[(label)\]: *(?:\n *)?([^<\s][^\s]*|<.*?>)(?:(?: +(?:\n *)?| *\n *)(title))? *(?:\n+|$)/).replace("label", E).replace("title", /(?:"(?:\\"?|[^"\\])*"|'[^'\n]*(?:\n[^'\n]+)*\n?'|\([^()]*\))/).getRegex(), re = u(/^( {0,3}bull)([ \t][^\n]+?)?(?:\n|$)/).replace(/bull/g, A).getRegex(), ue = "address|article|aside|base|basefont|blockquote|body|caption|center|col|colgroup|dd|details|dialog|dir|div|dl|dt|fieldset|figcaption|figure|footer|form|frame|frameset|h[1-6]|head|header|hr|html|iframe|legend|li|link|main|menu|menuitem|meta|nav|noframes|ol|optgroup|option|p|param|search|section|summary|table|tbody|td|tfoot|th|thead|title|tr|track|ul", Ze = /|$))/, be = u("^ {0,3}(?:<(script|pre|style|textarea)[\\s>][\\s\\S]*?(?:[^\\n]*\\n+|$)|comment[^\\n]*(\\n+|$)|<\\?[\\s\\S]*?(?:\\?>\\n*|$)|\\n*|$)|\\n*|$)|)[\\s\\S]*?(?:(?:\\n *)+\\n|$)|<(?!script|pre|style|textarea)([a-z][\\w-]*)(?:attribute)*? */?>(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$)|(?=[ \\t]*(?:\\n|$))[\\s\\S]*?(?:(?:\\n *)+\\n|$))", "i").replace("comment", Ze).replace("tag", ue).replace("attribute", / +[a-zA-Z:_][\w.:-]*(?: *= *"[^"\n]*"| *= *'[^'\n]*'| *= *[^\s"'=<>`]+)?/).getRegex(), Ye = u(F).replace("hr", x).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("|table", "").replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", ue).getRegex(), ai = { + blockquote: u(/^( {0,3}> ?(paragraph|[^\n]*)(?:\n|$))+/).replace("paragraph", Ye).getRegex(), + code: L, def: j, - fences: Z, - heading: v, - hr: _, - html: me, - lheading: E, - list: le, - newline: L, - paragraph: Ve, - table: m, - text: B - }, Ee = u("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", _).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", " {4}[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", ue).getRegex(), _t = { - ...ci, - table: Ee, - paragraph: u(Y).replace("hr", _).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", Ee).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", ue).getRegex() - }, wt = { - ...ci, - html: u(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", be).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), + fences: S, + heading: w, + hr: x, + html: be, + lheading: H, + list: re, + newline: X, + paragraph: Ye, + table: b, + text: K + }, He = u("^ *([^\\n ].*)\\n {0,3}((?:\\| *)?:?-+:? *(?:\\| *:?-+:? *)*(?:\\| *)?)(?:\\n((?:(?! *\\n|hr|heading|blockquote|code|fences|list|html).*(?:\\n|$))*)\\n*|$)").replace("hr", x).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("blockquote", " {0,3}>").replace("code", " {4}[^\\n]").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", ue).getRegex(), xt = { + ...ai, + table: He, + paragraph: u(F).replace("hr", x).replace("heading", " {0,3}#{1,6}(?:\\s|$)").replace("|lheading", "").replace("table", He).replace("blockquote", " {0,3}>").replace("fences", " {0,3}(?:`{3,}(?=[^`\\n]*\\n)|~{3,})[^\\n]*\\n").replace("list", " {0,3}(?:[*+-]|1[.)]) ").replace("html", ")|<(?:script|pre|style|textarea|!--)").replace("tag", ue).getRegex() + }, yt = { + ...ai, + html: u(`^ *(?:comment *(?:\\n|\\s*$)|<(tag)[\\s\\S]+? *(?:\\n{2,}|\\s*$)|\\s]*)*?/?> *(?:\\n{2,}|\\s*$))`).replace("comment", Ze).replace(/tag/g, "(?!(?:a|em|strong|small|s|cite|q|dfn|abbr|data|time|code|var|samp|kbd|sub|sup|i|b|u|mark|ruby|rt|rp|bdi|bdo|span|br|wbr|ins|del|img)\\b)\\w+(?!:|[^\\w\\s@]*@)\\b").getRegex(), def: /^ *\[([^\]]+)\]: *]+)>?(?: +(["(][^\n]+[")]))? *(?:\n+|$)/, heading: /^(#{1,6})(.*)(?:\n+|$)/, - fences: m, + fences: b, // fences not supported lheading: /^(.+?)\n {0,3}(=+|-+) *(?:\n+|$)/, - paragraph: u(Y).replace("hr", _).replace("heading", ` *#{1,6} *[^ -]`).replace("lheading", E).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() - }, _i = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, ts = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, Zs = /^( {2,}|\\)\n(?!\s*$)/, xr = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g, Mr = u(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/, "u").replace(/punct/g, So).getRegex(), Ja = u("^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])", "gu").replace(/punct/g, So).getRegex(), L0 = u("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])", "gu").replace(/punct/g, So).getRegex(), A0 = u(/\\([punct])/, "gu").replace(/punct/g, So).getRegex(), dd = u(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(), Qm = u(be).replace("(?:-->|$)", "-->").getRegex(), jm = u("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", Qm).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(), ou = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/, BC = u(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label", ou).replace("href", /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(), OC = u(/^!?\[(label)\]\[(ref)\]/).replace("label", ou).replace("ref", X).getRegex(), qm = u(/^!?\[(ref)\](?:\[\])?/).replace("ref", X).getRegex(), ru = u("reflink|nolink(?!\\()", "g").replace("reflink", OC).replace("nolink", qm).getRegex(), zl = { - _backpedal: m, + paragraph: u(F).replace("hr", x).replace("heading", ` *#{1,6} *[^ +]`).replace("lheading", H).replace("|table", "").replace("blockquote", " {0,3}>").replace("|fences", "").replace("|list", "").replace("|html", "").replace("|tag", "").getRegex() + }, Ci = /^\\([!"#$%&'()*+,\-./:;<=>?@\[\]\\^_`{|}~])/, ns = /^(`+)([^`]|[^`][\s\S]*?[^`])\1(?!`)/, Cs = /^( {2,}|\\)\n(?!\s*$)/, xl = /^(`+|[^`])(?:(?= {2,}\n)|[\s\S]*?(?:(?=[\\]*?>/g, Cl = u(/^(?:\*+(?:((?!\*)[punct])|[^\s*]))|^_+(?:((?!_)[punct])|([^\s_]))/, "u").replace(/punct/g, Vo).getRegex(), jc = u("^[^_*]*?__[^_*]*?\\*[^_*]*?(?=__)|[^*]+(?=[^*])|(?!\\*)[punct](\\*+)(?=[\\s]|$)|[^punct\\s](\\*+)(?!\\*)(?=[punct\\s]|$)|(?!\\*)[punct\\s](\\*+)(?=[^punct\\s])|[\\s](\\*+)(?!\\*)(?=[punct])|(?!\\*)[punct](\\*+)(?!\\*)(?=[punct])|[^punct\\s](\\*+)(?=[^punct\\s])", "gu").replace(/punct/g, Vo).getRegex(), R0 = u("^[^_*]*?\\*\\*[^_*]*?_[^_*]*?(?=\\*\\*)|[^_]+(?=[^_])|(?!_)[punct](_+)(?=[\\s]|$)|[^punct\\s](_+)(?!_)(?=[punct\\s]|$)|(?!_)[punct\\s](_+)(?=[^punct\\s])|[\\s](_+)(?!_)(?=[punct])|(?!_)[punct](_+)(?!_)(?=[punct])", "gu").replace(/punct/g, Vo).getRegex(), N0 = u(/\\([punct])/, "gu").replace(/punct/g, Vo).getRegex(), ba = u(/^<(scheme:[^\s\x00-\x1f<>]*|email)>/).replace("scheme", /[a-zA-Z][a-zA-Z0-9+.-]{1,31}/).replace("email", /[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+(@)[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)+(?![-_])/).getRegex(), tp = u(Ze).replace("(?:-->|$)", "-->").getRegex(), ip = u("^comment|^|^<[a-zA-Z][\\w-]*(?:attribute)*?\\s*/?>|^<\\?[\\s\\S]*?\\?>|^|^").replace("comment", tp).replace("attribute", /\s+[a-zA-Z:_][\w.:-]*(?:\s*=\s*"[^"]*"|\s*=\s*'[^']*'|\s*=\s*[^\s"'=<>`]+)?/).getRegex(), du = /(?:\[(?:\\.|[^\[\]\\])*\]|\\.|`[^`]*`|[^\[\]\\`])*?/, n1 = u(/^!?\[(label)\]\(\s*(href)(?:\s+(title))?\s*\)/).replace("label", du).replace("href", /<(?:\\.|[^\n<>\\])+>|[^\s\x00-\x1f]*/).replace("title", /"(?:\\"?|[^"\\])*"|'(?:\\'?|[^'\\])*'|\((?:\\\)?|[^)\\])*\)/).getRegex(), s1 = u(/^!?\[(label)\]\[(ref)\]/).replace("label", du).replace("ref", E).getRegex(), np = u(/^!?\[(ref)\](?:\[\])?/).replace("ref", E).getRegex(), au = u("reflink|nolink(?!\\()", "g").replace("reflink", s1).replace("nolink", np).getRegex(), Pr = { + _backpedal: b, // only used for GFM url - anyPunctuation: A0, - autolink: dd, + anyPunctuation: N0, + autolink: ba, blockSkip: Fi, - br: Zs, - code: ts, - del: m, - emStrongLDelim: Mr, - emStrongRDelimAst: Ja, - emStrongRDelimUnd: L0, - escape: _i, - link: BC, - nolink: qm, - punctuation: su, - reflink: OC, - reflinkSearch: ru, - tag: jm, - text: xr, - url: m - }, hd = { - ...zl, - link: u(/^!?\[(label)\]\((.*?)\)/).replace("label", ou).getRegex(), - reflink: u(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", ou).getRegex() - }, $m = { - ...zl, - escape: u(_i).replace("])", "~|])").getRegex(), + br: Cs, + code: ns, + del: b, + emStrongLDelim: Cl, + emStrongRDelimAst: jc, + emStrongRDelimUnd: R0, + escape: Ci, + link: n1, + nolink: np, + punctuation: cu, + reflink: s1, + reflinkSearch: au, + tag: ip, + text: xl, + url: b + }, pa = { + ...Pr, + link: u(/^!?\[(label)\]\((.*?)\)/).replace("label", du).getRegex(), + reflink: u(/^!?\[(label)\]\s*\[([^\]]*)\]/).replace("label", du).getRegex() + }, sp = { + ...Pr, + escape: u(Ci).replace("])", "~|])").getRegex(), url: u(/^((?:ftp|https?):\/\/|www\.)(?:[a-zA-Z0-9\-]+\.?)+[^\s<]*|^email/, "i").replace("email", /[A-Za-z0-9._+-]+(@)[a-zA-Z0-9-_]+(?:\.[a-zA-Z0-9-_]*[a-zA-Z0-9])+(?![-_])/).getRegex(), _backpedal: /(?:[^?!.,:;*_'"~()&]+|\([^)]*\)|&(?![a-zA-Z0-9]+;$)|[?!.,:;*_'"~)]+(?!$))+/, del: /^(~~?)(?=[^\s~])([\s\S]*?[^\s~])\1(?=[^~]|$)/, text: /^([`~]+|[^`~])(?:(?= {2,}\n)|(?=[a-zA-Z0-9.!#$%&'*+\/=?_`{\|}~-]+@)|[\s\S]*?(?:(?=[\\ Me + " ".repeat(ve.length)); - let F, O, q; + blockTokens(T, M = [], v = !1) { + this.options.pedantic ? T = T.replace(/\t/g, " ").replace(/^ +$/gm, "") : T = T.replace(/^( *)(\t+)/gm, (le, Ie, we) => Ie + " ".repeat(we.length)); + let D, U, q; for (; T; ) - if (!(this.options.extensions && this.options.extensions.block && this.options.extensions.block.some((re) => (F = re.call({ lexer: this }, T, D)) ? (T = T.substring(F.raw.length), D.push(F), !0) : !1))) { - if (F = this.tokenizer.space(T)) { - T = T.substring(F.raw.length), F.raw.length === 1 && D.length > 0 ? D[D.length - 1].raw += ` -` : D.push(F); + if (!(this.options.extensions && this.options.extensions.block && this.options.extensions.block.some((le) => (D = le.call({ lexer: this }, T, M)) ? (T = T.substring(D.raw.length), M.push(D), !0) : !1))) { + if (D = this.tokenizer.space(T)) { + T = T.substring(D.raw.length), D.raw.length === 1 && M.length > 0 ? M[M.length - 1].raw += ` +` : M.push(D); continue; } - if (F = this.tokenizer.code(T)) { - T = T.substring(F.raw.length), O = D[D.length - 1], O && (O.type === "paragraph" || O.type === "text") ? (O.raw += ` -` + F.raw, O.text += ` -` + F.text, this.inlineQueue[this.inlineQueue.length - 1].src = O.text) : D.push(F); + if (D = this.tokenizer.code(T)) { + T = T.substring(D.raw.length), U = M[M.length - 1], U && (U.type === "paragraph" || U.type === "text") ? (U.raw += ` +` + D.raw, U.text += ` +` + D.text, this.inlineQueue[this.inlineQueue.length - 1].src = U.text) : M.push(D); continue; } - if (F = this.tokenizer.fences(T)) { - T = T.substring(F.raw.length), D.push(F); + if (D = this.tokenizer.fences(T)) { + T = T.substring(D.raw.length), M.push(D); continue; } - if (F = this.tokenizer.heading(T)) { - T = T.substring(F.raw.length), D.push(F); + if (D = this.tokenizer.heading(T)) { + T = T.substring(D.raw.length), M.push(D); continue; } - if (F = this.tokenizer.hr(T)) { - T = T.substring(F.raw.length), D.push(F); + if (D = this.tokenizer.hr(T)) { + T = T.substring(D.raw.length), M.push(D); continue; } - if (F = this.tokenizer.blockquote(T)) { - T = T.substring(F.raw.length), D.push(F); + if (D = this.tokenizer.blockquote(T)) { + T = T.substring(D.raw.length), M.push(D); continue; } - if (F = this.tokenizer.list(T)) { - T = T.substring(F.raw.length), D.push(F); + if (D = this.tokenizer.list(T)) { + T = T.substring(D.raw.length), M.push(D); continue; } - if (F = this.tokenizer.html(T)) { - T = T.substring(F.raw.length), D.push(F); + if (D = this.tokenizer.html(T)) { + T = T.substring(D.raw.length), M.push(D); continue; } - if (F = this.tokenizer.def(T)) { - T = T.substring(F.raw.length), O = D[D.length - 1], O && (O.type === "paragraph" || O.type === "text") ? (O.raw += ` -` + F.raw, O.text += ` -` + F.raw, this.inlineQueue[this.inlineQueue.length - 1].src = O.text) : this.tokens.links[F.tag] || (this.tokens.links[F.tag] = { - href: F.href, - title: F.title + if (D = this.tokenizer.def(T)) { + T = T.substring(D.raw.length), U = M[M.length - 1], U && (U.type === "paragraph" || U.type === "text") ? (U.raw += ` +` + D.raw, U.text += ` +` + D.raw, this.inlineQueue[this.inlineQueue.length - 1].src = U.text) : this.tokens.links[D.tag] || (this.tokens.links[D.tag] = { + href: D.href, + title: D.title }); continue; } - if (F = this.tokenizer.table(T)) { - T = T.substring(F.raw.length), D.push(F); + if (D = this.tokenizer.table(T)) { + T = T.substring(D.raw.length), M.push(D); continue; } - if (F = this.tokenizer.lheading(T)) { - T = T.substring(F.raw.length), D.push(F); + if (D = this.tokenizer.lheading(T)) { + T = T.substring(D.raw.length), M.push(D); continue; } if (q = T, this.options.extensions && this.options.extensions.startBlock) { - let re = 1 / 0; - const Me = T.slice(1); - let ve; + let le = 1 / 0; + const Ie = T.slice(1); + let we; this.options.extensions.startBlock.forEach((ot) => { - ve = ot.call({ lexer: this }, Me), typeof ve == "number" && ve >= 0 && (re = Math.min(re, ve)); - }), re < 1 / 0 && re >= 0 && (q = T.substring(0, re + 1)); + we = ot.call({ lexer: this }, Ie), typeof we == "number" && we >= 0 && (le = Math.min(le, we)); + }), le < 1 / 0 && le >= 0 && (q = T.substring(0, le + 1)); } - if (this.state.top && (F = this.tokenizer.paragraph(q))) { - O = D[D.length - 1], G && (O == null ? void 0 : O.type) === "paragraph" ? (O.raw += ` -` + F.raw, O.text += ` -` + F.text, this.inlineQueue.pop(), this.inlineQueue[this.inlineQueue.length - 1].src = O.text) : D.push(F), G = q.length !== T.length, T = T.substring(F.raw.length); + if (this.state.top && (D = this.tokenizer.paragraph(q))) { + U = M[M.length - 1], v && (U == null ? void 0 : U.type) === "paragraph" ? (U.raw += ` +` + D.raw, U.text += ` +` + D.text, this.inlineQueue.pop(), this.inlineQueue[this.inlineQueue.length - 1].src = U.text) : M.push(D), v = q.length !== T.length, T = T.substring(D.raw.length); continue; } - if (F = this.tokenizer.text(T)) { - T = T.substring(F.raw.length), O = D[D.length - 1], O && O.type === "text" ? (O.raw += ` -` + F.raw, O.text += ` -` + F.text, this.inlineQueue.pop(), this.inlineQueue[this.inlineQueue.length - 1].src = O.text) : D.push(F); + if (D = this.tokenizer.text(T)) { + T = T.substring(D.raw.length), U = M[M.length - 1], U && U.type === "text" ? (U.raw += ` +` + D.raw, U.text += ` +` + D.text, this.inlineQueue.pop(), this.inlineQueue[this.inlineQueue.length - 1].src = U.text) : M.push(D); continue; } if (T) { - const re = "Infinite loop on byte: " + T.charCodeAt(0); + const le = "Infinite loop on byte: " + T.charCodeAt(0); if (this.options.silent) { - console.error(re); + console.error(le); break; } else - throw new Error(re); + throw new Error(le); } } - return this.state.top = !0, D; + return this.state.top = !0, M; } - inline(T, D = []) { - return this.inlineQueue.push({ src: T, tokens: D }), D; + inline(T, M = []) { + return this.inlineQueue.push({ src: T, tokens: M }), M; } /** * Lexing/Compiling */ - inlineTokens(T, D = []) { - let G, F, O, q = T, re, Me, ve; + inlineTokens(T, M = []) { + let v, D, U, q = T, le, Ie, we; if (this.tokens.links) { const ot = Object.keys(this.tokens.links); if (ot.length > 0) - for (; (re = this.tokenizer.rules.inline.reflinkSearch.exec(q)) != null; ) - ot.includes(re[0].slice(re[0].lastIndexOf("[") + 1, -1)) && (q = q.slice(0, re.index) + "[" + "a".repeat(re[0].length - 2) + "]" + q.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex)); + for (; (le = this.tokenizer.rules.inline.reflinkSearch.exec(q)) != null; ) + ot.includes(le[0].slice(le[0].lastIndexOf("[") + 1, -1)) && (q = q.slice(0, le.index) + "[" + "a".repeat(le[0].length - 2) + "]" + q.slice(this.tokenizer.rules.inline.reflinkSearch.lastIndex)); } - for (; (re = this.tokenizer.rules.inline.blockSkip.exec(q)) != null; ) - q = q.slice(0, re.index) + "[" + "a".repeat(re[0].length - 2) + "]" + q.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); - for (; (re = this.tokenizer.rules.inline.anyPunctuation.exec(q)) != null; ) - q = q.slice(0, re.index) + "++" + q.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); + for (; (le = this.tokenizer.rules.inline.blockSkip.exec(q)) != null; ) + q = q.slice(0, le.index) + "[" + "a".repeat(le[0].length - 2) + "]" + q.slice(this.tokenizer.rules.inline.blockSkip.lastIndex); + for (; (le = this.tokenizer.rules.inline.anyPunctuation.exec(q)) != null; ) + q = q.slice(0, le.index) + "++" + q.slice(this.tokenizer.rules.inline.anyPunctuation.lastIndex); for (; T; ) - if (Me || (ve = ""), Me = !1, !(this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some((ot) => (G = ot.call({ lexer: this }, T, D)) ? (T = T.substring(G.raw.length), D.push(G), !0) : !1))) { - if (G = this.tokenizer.escape(T)) { - T = T.substring(G.raw.length), D.push(G); + if (Ie || (we = ""), Ie = !1, !(this.options.extensions && this.options.extensions.inline && this.options.extensions.inline.some((ot) => (v = ot.call({ lexer: this }, T, M)) ? (T = T.substring(v.raw.length), M.push(v), !0) : !1))) { + if (v = this.tokenizer.escape(T)) { + T = T.substring(v.raw.length), M.push(v); continue; } - if (G = this.tokenizer.tag(T)) { - T = T.substring(G.raw.length), F = D[D.length - 1], F && G.type === "text" && F.type === "text" ? (F.raw += G.raw, F.text += G.text) : D.push(G); + if (v = this.tokenizer.tag(T)) { + T = T.substring(v.raw.length), D = M[M.length - 1], D && v.type === "text" && D.type === "text" ? (D.raw += v.raw, D.text += v.text) : M.push(v); continue; } - if (G = this.tokenizer.link(T)) { - T = T.substring(G.raw.length), D.push(G); + if (v = this.tokenizer.link(T)) { + T = T.substring(v.raw.length), M.push(v); continue; } - if (G = this.tokenizer.reflink(T, this.tokens.links)) { - T = T.substring(G.raw.length), F = D[D.length - 1], F && G.type === "text" && F.type === "text" ? (F.raw += G.raw, F.text += G.text) : D.push(G); + if (v = this.tokenizer.reflink(T, this.tokens.links)) { + T = T.substring(v.raw.length), D = M[M.length - 1], D && v.type === "text" && D.type === "text" ? (D.raw += v.raw, D.text += v.text) : M.push(v); continue; } - if (G = this.tokenizer.emStrong(T, q, ve)) { - T = T.substring(G.raw.length), D.push(G); + if (v = this.tokenizer.emStrong(T, q, we)) { + T = T.substring(v.raw.length), M.push(v); continue; } - if (G = this.tokenizer.codespan(T)) { - T = T.substring(G.raw.length), D.push(G); + if (v = this.tokenizer.codespan(T)) { + T = T.substring(v.raw.length), M.push(v); continue; } - if (G = this.tokenizer.br(T)) { - T = T.substring(G.raw.length), D.push(G); + if (v = this.tokenizer.br(T)) { + T = T.substring(v.raw.length), M.push(v); continue; } - if (G = this.tokenizer.del(T)) { - T = T.substring(G.raw.length), D.push(G); + if (v = this.tokenizer.del(T)) { + T = T.substring(v.raw.length), M.push(v); continue; } - if (G = this.tokenizer.autolink(T)) { - T = T.substring(G.raw.length), D.push(G); + if (v = this.tokenizer.autolink(T)) { + T = T.substring(v.raw.length), M.push(v); continue; } - if (!this.state.inLink && (G = this.tokenizer.url(T))) { - T = T.substring(G.raw.length), D.push(G); + if (!this.state.inLink && (v = this.tokenizer.url(T))) { + T = T.substring(v.raw.length), M.push(v); continue; } - if (O = T, this.options.extensions && this.options.extensions.startInline) { + if (U = T, this.options.extensions && this.options.extensions.startInline) { let ot = 1 / 0; - const It = T.slice(1); - let Gt; - this.options.extensions.startInline.forEach((Ci) => { - Gt = Ci.call({ lexer: this }, It), typeof Gt == "number" && Gt >= 0 && (ot = Math.min(ot, Gt)); - }), ot < 1 / 0 && ot >= 0 && (O = T.substring(0, ot + 1)); + const Ct = T.slice(1); + let vt; + this.options.extensions.startInline.forEach((Gi) => { + vt = Gi.call({ lexer: this }, Ct), typeof vt == "number" && vt >= 0 && (ot = Math.min(ot, vt)); + }), ot < 1 / 0 && ot >= 0 && (U = T.substring(0, ot + 1)); } - if (G = this.tokenizer.inlineText(O)) { - T = T.substring(G.raw.length), G.raw.slice(-1) !== "_" && (ve = G.raw.slice(-1)), Me = !0, F = D[D.length - 1], F && F.type === "text" ? (F.raw += G.raw, F.text += G.text) : D.push(G); + if (v = this.tokenizer.inlineText(U)) { + T = T.substring(v.raw.length), v.raw.slice(-1) !== "_" && (we = v.raw.slice(-1)), Ie = !0, D = M[M.length - 1], D && D.type === "text" ? (D.raw += v.raw, D.text += v.text) : M.push(v); continue; } if (T) { @@ -45596,25 +45596,25 @@ ${It}` : It; throw new Error(ot); } } - return D; + return M; } } - class Pl { + class Br { // set by the parser constructor(T) { - Gi(this, "options"); - Gi(this, "parser"); + qt(this, "options"); + qt(this, "parser"); this.options = T || e.defaults; } space(T) { return ""; } - code({ text: T, lang: D, escaped: G }) { + code({ text: T, lang: M, escaped: v }) { var q; - const F = (q = (D || "").match(/^\S*/)) == null ? void 0 : q[0], O = T.replace(/\n$/, "") + ` + const D = (q = (M || "").match(/^\S*/)) == null ? void 0 : q[0], U = T.replace(/\n$/, "") + ` `; - return F ? '
' + (G ? O : d(O, !0)) + `
-` : "
" + (G ? O : d(O, !0)) + `
+ return D ? '
' + (v ? U : a(U, !0)) + `
+` : "
" + (v ? U : a(U, !0)) + `
`; } blockquote({ tokens: T }) { @@ -45625,8 +45625,8 @@ ${this.parser.parse(T)} html({ text: T }) { return T; } - heading({ tokens: T, depth: D }) { - return `${this.parser.parseInline(T)} + heading({ tokens: T, depth: M }) { + return `${this.parser.parseInline(T)} `; } hr(T) { @@ -45634,28 +45634,28 @@ ${this.parser.parse(T)} `; } list(T) { - const D = T.ordered, G = T.start; - let F = ""; - for (let re = 0; re < T.items.length; re++) { - const Me = T.items[re]; - F += this.listitem(Me); + const M = T.ordered, v = T.start; + let D = ""; + for (let le = 0; le < T.items.length; le++) { + const Ie = T.items[le]; + D += this.listitem(Ie); } - const O = D ? "ol" : "ul", q = D && G !== 1 ? ' start="' + G + '"' : ""; - return "<" + O + q + `> -` + F + " + const U = M ? "ol" : "ul", q = M && v !== 1 ? ' start="' + v + '"' : ""; + return "<" + U + q + `> +` + D + " `; } listitem(T) { - let D = ""; + let M = ""; if (T.task) { - const G = this.checkbox({ checked: !!T.checked }); - T.loose ? T.tokens.length > 0 && T.tokens[0].type === "paragraph" ? (T.tokens[0].text = G + " " + T.tokens[0].text, T.tokens[0].tokens && T.tokens[0].tokens.length > 0 && T.tokens[0].tokens[0].type === "text" && (T.tokens[0].tokens[0].text = G + " " + T.tokens[0].tokens[0].text)) : T.tokens.unshift({ + const v = this.checkbox({ checked: !!T.checked }); + T.loose ? T.tokens.length > 0 && T.tokens[0].type === "paragraph" ? (T.tokens[0].text = v + " " + T.tokens[0].text, T.tokens[0].tokens && T.tokens[0].tokens.length > 0 && T.tokens[0].tokens[0].type === "text" && (T.tokens[0].tokens[0].text = v + " " + T.tokens[0].tokens[0].text)) : T.tokens.unshift({ type: "text", - raw: G + " ", - text: G + " " - }) : D += G + " "; + raw: v + " ", + text: v + " " + }) : M += v + " "; } - return D += this.parser.parse(T.tokens, !!T.loose), `
  • ${D}
  • + return M += this.parser.parse(T.tokens, !!T.loose), `
  • ${M}
  • `; } checkbox({ checked: T }) { @@ -45666,22 +45666,22 @@ ${this.parser.parse(T)} `; } table(T) { - let D = "", G = ""; - for (let O = 0; O < T.header.length; O++) - G += this.tablecell(T.header[O]); - D += this.tablerow({ text: G }); - let F = ""; - for (let O = 0; O < T.rows.length; O++) { - const q = T.rows[O]; - G = ""; - for (let re = 0; re < q.length; re++) - G += this.tablecell(q[re]); - F += this.tablerow({ text: G }); + let M = "", v = ""; + for (let U = 0; U < T.header.length; U++) + v += this.tablecell(T.header[U]); + M += this.tablerow({ text: v }); + let D = ""; + for (let U = 0; U < T.rows.length; U++) { + const q = T.rows[U]; + v = ""; + for (let le = 0; le < q.length; le++) + v += this.tablecell(q[le]); + D += this.tablerow({ text: v }); } - return F && (F = `${F}`), ` + return D && (D = `${D}`), `
    -` + D + ` -` + F + `
    +` + M + ` +` + D + ` `; } tablerow({ text: T }) { @@ -45690,8 +45690,8 @@ ${T} `; } tablecell(T) { - const D = this.parser.parseInline(T.tokens), G = T.header ? "th" : "td"; - return (T.align ? `<${G} align="${T.align}">` : `<${G}>`) + D + ` + const M = this.parser.parseInline(T.tokens), v = T.header ? "th" : "td"; + return (T.align ? `<${v} align="${T.align}">` : `<${v}>`) + M + ` `; } /** @@ -45712,27 +45712,27 @@ ${T} del({ tokens: T }) { return `${this.parser.parseInline(T)}`; } - link({ href: T, title: D, tokens: G }) { - const F = this.parser.parseInline(G), O = g(T); - if (O === null) - return F; - T = O; + link({ href: T, title: M, tokens: v }) { + const D = this.parser.parseInline(v), U = m(T); + if (U === null) + return D; + T = U; let q = '
    ", q; + return M && (q += ' title="' + M + '"'), q += ">" + D + "", q; } - image({ href: T, title: D, text: G }) { - const F = g(T); - if (F === null) - return G; - T = F; - let O = `${G} return ""; } } - class ln { + class cn { constructor(T) { - Gi(this, "options"); - Gi(this, "renderer"); - Gi(this, "textRenderer"); - this.options = T || e.defaults, this.options.renderer = this.options.renderer || new Pl(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new Ka(); + qt(this, "options"); + qt(this, "renderer"); + qt(this, "textRenderer"); + this.options = T || e.defaults, this.options.renderer = this.options.renderer || new Br(), this.renderer = this.options.renderer, this.renderer.options = this.options, this.renderer.parser = this, this.textRenderer = new $c(); } /** * Static Parse Method */ - static parse(T, D) { - return new ln(D).parse(T); + static parse(T, M) { + return new cn(M).parse(T); } /** * Static Parse Inline Method */ - static parseInline(T, D) { - return new ln(D).parseInline(T); + static parseInline(T, M) { + return new cn(M).parseInline(T); } /** * Parse Loop */ - parse(T, D = !0) { - let G = ""; - for (let F = 0; F < T.length; F++) { - const O = T[F]; - if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[O.type]) { - const re = O, Me = this.options.extensions.renderers[re.type].call({ parser: this }, re); - if (Me !== !1 || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(re.type)) { - G += Me || ""; + parse(T, M = !0) { + let v = ""; + for (let D = 0; D < T.length; D++) { + const U = T[D]; + if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[U.type]) { + const le = U, Ie = this.options.extensions.renderers[le.type].call({ parser: this }, le); + if (Ie !== !1 || !["space", "hr", "heading", "code", "table", "blockquote", "list", "html", "paragraph", "text"].includes(le.type)) { + v += Ie || ""; continue; } } - const q = O; + const q = U; switch (q.type) { case "space": { - G += this.renderer.space(q); + v += this.renderer.space(q); continue; } case "hr": { - G += this.renderer.hr(q); + v += this.renderer.hr(q); continue; } case "heading": { - G += this.renderer.heading(q); + v += this.renderer.heading(q); continue; } case "code": { - G += this.renderer.code(q); + v += this.renderer.code(q); continue; } case "table": { - G += this.renderer.table(q); + v += this.renderer.table(q); continue; } case "blockquote": { - G += this.renderer.blockquote(q); + v += this.renderer.blockquote(q); continue; } case "list": { - G += this.renderer.list(q); + v += this.renderer.list(q); continue; } case "html": { - G += this.renderer.html(q); + v += this.renderer.html(q); continue; } case "paragraph": { - G += this.renderer.paragraph(q); + v += this.renderer.paragraph(q); continue; } case "text": { - let re = q, Me = this.renderer.text(re); - for (; F + 1 < T.length && T[F + 1].type === "text"; ) - re = T[++F], Me += ` -` + this.renderer.text(re); - D ? G += this.renderer.paragraph({ + let le = q, Ie = this.renderer.text(le); + for (; D + 1 < T.length && T[D + 1].type === "text"; ) + le = T[++D], Ie += ` +` + this.renderer.text(le); + M ? v += this.renderer.paragraph({ type: "paragraph", - raw: Me, - text: Me, - tokens: [{ type: "text", raw: Me, text: Me }] - }) : G += Me; + raw: Ie, + text: Ie, + tokens: [{ type: "text", raw: Ie, text: Ie }] + }) : v += Ie; continue; } default: { - const re = 'Token with "' + q.type + '" type was not found.'; + const le = 'Token with "' + q.type + '" type was not found.'; if (this.options.silent) - return console.error(re), ""; - throw new Error(re); + return console.error(le), ""; + throw new Error(le); } } } - return G; + return v; } /** * Parse Inline Tokens */ - parseInline(T, D) { - D = D || this.renderer; - let G = ""; - for (let F = 0; F < T.length; F++) { - const O = T[F]; - if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[O.type]) { - const re = this.options.extensions.renderers[O.type].call({ parser: this }, O); - if (re !== !1 || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(O.type)) { - G += re || ""; + parseInline(T, M) { + M = M || this.renderer; + let v = ""; + for (let D = 0; D < T.length; D++) { + const U = T[D]; + if (this.options.extensions && this.options.extensions.renderers && this.options.extensions.renderers[U.type]) { + const le = this.options.extensions.renderers[U.type].call({ parser: this }, U); + if (le !== !1 || !["escape", "html", "link", "image", "strong", "em", "codespan", "br", "del", "text"].includes(U.type)) { + v += le || ""; continue; } } - const q = O; + const q = U; switch (q.type) { case "escape": { - G += D.text(q); + v += M.text(q); break; } case "html": { - G += D.html(q); + v += M.html(q); break; } case "link": { - G += D.link(q); + v += M.link(q); break; } case "image": { - G += D.image(q); + v += M.image(q); break; } case "strong": { - G += D.strong(q); + v += M.strong(q); break; } case "em": { - G += D.em(q); + v += M.em(q); break; } case "codespan": { - G += D.codespan(q); + v += M.codespan(q); break; } case "br": { - G += D.br(q); + v += M.br(q); break; } case "del": { - G += D.del(q); + v += M.del(q); break; } case "text": { - G += D.text(q); + v += M.text(q); break; } default: { - const re = 'Token with "' + q.type + '" type was not found.'; + const le = 'Token with "' + q.type + '" type was not found.'; if (this.options.silent) - return console.error(re), ""; - throw new Error(re); + return console.error(le), ""; + throw new Error(le); } } } - return G; + return v; } } - class qo { + class el { constructor(T) { - Gi(this, "options"); + qt(this, "options"); this.options = T || e.defaults; } /** @@ -45948,379 +45948,379 @@ ${T} return T; } } - Gi(qo, "passThroughHooks", /* @__PURE__ */ new Set([ + qt(el, "passThroughHooks", /* @__PURE__ */ new Set([ "preprocess", "postprocess", "processAllTokens" ])); - class ep { + class op { constructor(...T) { - Gi(this, "defaults", t()); - Gi(this, "options", this.setOptions); - Gi(this, "parse", this.parseMarkdown(Lo.lex, ln.parse)); - Gi(this, "parseInline", this.parseMarkdown(Lo.lexInline, ln.parseInline)); - Gi(this, "Parser", ln); - Gi(this, "Renderer", Pl); - Gi(this, "TextRenderer", Ka); - Gi(this, "Lexer", Lo); - Gi(this, "Tokenizer", S); - Gi(this, "Hooks", qo); + qt(this, "defaults", t()); + qt(this, "options", this.setOptions); + qt(this, "parse", this.parseMarkdown(Lo.lex, cn.parse)); + qt(this, "parseInline", this.parseMarkdown(Lo.lexInline, cn.parseInline)); + qt(this, "Parser", cn); + qt(this, "Renderer", Br); + qt(this, "TextRenderer", $c); + qt(this, "Lexer", Lo); + qt(this, "Tokenizer", G); + qt(this, "Hooks", el); this.use(...T); } /** * Run callback for every token */ - walkTokens(T, D) { - var F, O; - let G = []; + walkTokens(T, M) { + var D, U; + let v = []; for (const q of T) - switch (G = G.concat(D.call(this, q)), q.type) { + switch (v = v.concat(M.call(this, q)), q.type) { case "table": { - const re = q; - for (const Me of re.header) - G = G.concat(this.walkTokens(Me.tokens, D)); - for (const Me of re.rows) - for (const ve of Me) - G = G.concat(this.walkTokens(ve.tokens, D)); + const le = q; + for (const Ie of le.header) + v = v.concat(this.walkTokens(Ie.tokens, M)); + for (const Ie of le.rows) + for (const we of Ie) + v = v.concat(this.walkTokens(we.tokens, M)); break; } case "list": { - const re = q; - G = G.concat(this.walkTokens(re.items, D)); + const le = q; + v = v.concat(this.walkTokens(le.items, M)); break; } default: { - const re = q; - (O = (F = this.defaults.extensions) == null ? void 0 : F.childTokens) != null && O[re.type] ? this.defaults.extensions.childTokens[re.type].forEach((Me) => { - const ve = re[Me].flat(1 / 0); - G = G.concat(this.walkTokens(ve, D)); - }) : re.tokens && (G = G.concat(this.walkTokens(re.tokens, D))); + const le = q; + (U = (D = this.defaults.extensions) == null ? void 0 : D.childTokens) != null && U[le.type] ? this.defaults.extensions.childTokens[le.type].forEach((Ie) => { + const we = le[Ie].flat(1 / 0); + v = v.concat(this.walkTokens(we, M)); + }) : le.tokens && (v = v.concat(this.walkTokens(le.tokens, M))); } } - return G; + return v; } use(...T) { - const D = this.defaults.extensions || { renderers: {}, childTokens: {} }; - return T.forEach((G) => { - const F = { ...G }; - if (F.async = this.defaults.async || F.async || !1, G.extensions && (G.extensions.forEach((O) => { - if (!O.name) + const M = this.defaults.extensions || { renderers: {}, childTokens: {} }; + return T.forEach((v) => { + const D = { ...v }; + if (D.async = this.defaults.async || D.async || !1, v.extensions && (v.extensions.forEach((U) => { + if (!U.name) throw new Error("extension name required"); - if ("renderer" in O) { - const q = D.renderers[O.name]; - q ? D.renderers[O.name] = function(...re) { - let Me = O.renderer.apply(this, re); - return Me === !1 && (Me = q.apply(this, re)), Me; - } : D.renderers[O.name] = O.renderer; + if ("renderer" in U) { + const q = M.renderers[U.name]; + q ? M.renderers[U.name] = function(...le) { + let Ie = U.renderer.apply(this, le); + return Ie === !1 && (Ie = q.apply(this, le)), Ie; + } : M.renderers[U.name] = U.renderer; } - if ("tokenizer" in O) { - if (!O.level || O.level !== "block" && O.level !== "inline") + if ("tokenizer" in U) { + if (!U.level || U.level !== "block" && U.level !== "inline") throw new Error("extension level must be 'block' or 'inline'"); - const q = D[O.level]; - q ? q.unshift(O.tokenizer) : D[O.level] = [O.tokenizer], O.start && (O.level === "block" ? D.startBlock ? D.startBlock.push(O.start) : D.startBlock = [O.start] : O.level === "inline" && (D.startInline ? D.startInline.push(O.start) : D.startInline = [O.start])); + const q = M[U.level]; + q ? q.unshift(U.tokenizer) : M[U.level] = [U.tokenizer], U.start && (U.level === "block" ? M.startBlock ? M.startBlock.push(U.start) : M.startBlock = [U.start] : U.level === "inline" && (M.startInline ? M.startInline.push(U.start) : M.startInline = [U.start])); } - "childTokens" in O && O.childTokens && (D.childTokens[O.name] = O.childTokens); - }), F.extensions = D), G.renderer) { - const O = this.defaults.renderer || new Pl(this.defaults); - for (const q in G.renderer) { - if (!(q in O)) + "childTokens" in U && U.childTokens && (M.childTokens[U.name] = U.childTokens); + }), D.extensions = M), v.renderer) { + const U = this.defaults.renderer || new Br(this.defaults); + for (const q in v.renderer) { + if (!(q in U)) throw new Error(`renderer '${q}' does not exist`); if (["options", "parser"].includes(q)) continue; - const re = q, Me = G.renderer[re], ve = O[re]; - O[re] = (...ot) => { - let It = Me.apply(O, ot); - return It === !1 && (It = ve.apply(O, ot)), It || ""; + const le = q, Ie = v.renderer[le], we = U[le]; + U[le] = (...ot) => { + let Ct = Ie.apply(U, ot); + return Ct === !1 && (Ct = we.apply(U, ot)), Ct || ""; }; } - F.renderer = O; + D.renderer = U; } - if (G.tokenizer) { - const O = this.defaults.tokenizer || new S(this.defaults); - for (const q in G.tokenizer) { - if (!(q in O)) + if (v.tokenizer) { + const U = this.defaults.tokenizer || new G(this.defaults); + for (const q in v.tokenizer) { + if (!(q in U)) throw new Error(`tokenizer '${q}' does not exist`); if (["options", "rules", "lexer"].includes(q)) continue; - const re = q, Me = G.tokenizer[re], ve = O[re]; - O[re] = (...ot) => { - let It = Me.apply(O, ot); - return It === !1 && (It = ve.apply(O, ot)), It; + const le = q, Ie = v.tokenizer[le], we = U[le]; + U[le] = (...ot) => { + let Ct = Ie.apply(U, ot); + return Ct === !1 && (Ct = we.apply(U, ot)), Ct; }; } - F.tokenizer = O; + D.tokenizer = U; } - if (G.hooks) { - const O = this.defaults.hooks || new qo(); - for (const q in G.hooks) { - if (!(q in O)) + if (v.hooks) { + const U = this.defaults.hooks || new el(); + for (const q in v.hooks) { + if (!(q in U)) throw new Error(`hook '${q}' does not exist`); if (q === "options") continue; - const re = q, Me = G.hooks[re], ve = O[re]; - qo.passThroughHooks.has(q) ? O[re] = (ot) => { + const le = q, Ie = v.hooks[le], we = U[le]; + el.passThroughHooks.has(q) ? U[le] = (ot) => { if (this.defaults.async) - return Promise.resolve(Me.call(O, ot)).then((Gt) => ve.call(O, Gt)); - const It = Me.call(O, ot); - return ve.call(O, It); - } : O[re] = (...ot) => { - let It = Me.apply(O, ot); - return It === !1 && (It = ve.apply(O, ot)), It; + return Promise.resolve(Ie.call(U, ot)).then((vt) => we.call(U, vt)); + const Ct = Ie.call(U, ot); + return we.call(U, Ct); + } : U[le] = (...ot) => { + let Ct = Ie.apply(U, ot); + return Ct === !1 && (Ct = we.apply(U, ot)), Ct; }; } - F.hooks = O; + D.hooks = U; } - if (G.walkTokens) { - const O = this.defaults.walkTokens, q = G.walkTokens; - F.walkTokens = function(re) { - let Me = []; - return Me.push(q.call(this, re)), O && (Me = Me.concat(O.call(this, re))), Me; + if (v.walkTokens) { + const U = this.defaults.walkTokens, q = v.walkTokens; + D.walkTokens = function(le) { + let Ie = []; + return Ie.push(q.call(this, le)), U && (Ie = Ie.concat(U.call(this, le))), Ie; }; } - this.defaults = { ...this.defaults, ...F }; + this.defaults = { ...this.defaults, ...D }; }), this; } setOptions(T) { return this.defaults = { ...this.defaults, ...T }, this; } - lexer(T, D) { - return Lo.lex(T, D ?? this.defaults); + lexer(T, M) { + return Lo.lex(T, M ?? this.defaults); } - parser(T, D) { - return ln.parse(T, D ?? this.defaults); + parser(T, M) { + return cn.parse(T, M ?? this.defaults); } - parseMarkdown(T, D) { - return (F, O) => { - const q = { ...O }, re = { ...this.defaults, ...q }, Me = this.onError(!!re.silent, !!re.async); + parseMarkdown(T, M) { + return (D, U) => { + const q = { ...U }, le = { ...this.defaults, ...q }, Ie = this.onError(!!le.silent, !!le.async); if (this.defaults.async === !0 && q.async === !1) - return Me(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); - if (typeof F > "u" || F === null) - return Me(new Error("marked(): input parameter is undefined or null")); - if (typeof F != "string") - return Me(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(F) + ", string expected")); - if (re.hooks && (re.hooks.options = re), re.async) - return Promise.resolve(re.hooks ? re.hooks.preprocess(F) : F).then((ve) => T(ve, re)).then((ve) => re.hooks ? re.hooks.processAllTokens(ve) : ve).then((ve) => re.walkTokens ? Promise.all(this.walkTokens(ve, re.walkTokens)).then(() => ve) : ve).then((ve) => D(ve, re)).then((ve) => re.hooks ? re.hooks.postprocess(ve) : ve).catch(Me); + return Ie(new Error("marked(): The async option was set to true by an extension. Remove async: false from the parse options object to return a Promise.")); + if (typeof D > "u" || D === null) + return Ie(new Error("marked(): input parameter is undefined or null")); + if (typeof D != "string") + return Ie(new Error("marked(): input parameter is of type " + Object.prototype.toString.call(D) + ", string expected")); + if (le.hooks && (le.hooks.options = le), le.async) + return Promise.resolve(le.hooks ? le.hooks.preprocess(D) : D).then((we) => T(we, le)).then((we) => le.hooks ? le.hooks.processAllTokens(we) : we).then((we) => le.walkTokens ? Promise.all(this.walkTokens(we, le.walkTokens)).then(() => we) : we).then((we) => M(we, le)).then((we) => le.hooks ? le.hooks.postprocess(we) : we).catch(Ie); try { - re.hooks && (F = re.hooks.preprocess(F)); - let ve = T(F, re); - re.hooks && (ve = re.hooks.processAllTokens(ve)), re.walkTokens && this.walkTokens(ve, re.walkTokens); - let ot = D(ve, re); - return re.hooks && (ot = re.hooks.postprocess(ot)), ot; - } catch (ve) { - return Me(ve); + le.hooks && (D = le.hooks.preprocess(D)); + let we = T(D, le); + le.hooks && (we = le.hooks.processAllTokens(we)), le.walkTokens && this.walkTokens(we, le.walkTokens); + let ot = M(we, le); + return le.hooks && (ot = le.hooks.postprocess(ot)), ot; + } catch (we) { + return Ie(we); } }; } - onError(T, D) { - return (G) => { - if (G.message += ` + onError(T, M) { + return (v) => { + if (v.message += ` Please report this to https://github.com/markedjs/marked.`, T) { - const F = "

    An error occurred:

    " + d(G.message + "", !0) + "
    "; - return D ? Promise.resolve(F) : F; + const D = "

    An error occurred:

    " + a(v.message + "", !0) + "
    "; + return M ? Promise.resolve(D) : D; } - if (D) - return Promise.reject(G); - throw G; + if (M) + return Promise.reject(v); + throw v; }; } } - const tl = new ep(); - function ti(at, T) { - return tl.parse(at, T); + const sr = new op(); + function ii(ct, T) { + return sr.parse(ct, T); } - ti.options = ti.setOptions = function(at) { - return tl.setOptions(at), ti.defaults = tl.defaults, i(ti.defaults), ti; - }, ti.getDefaults = t, ti.defaults = e.defaults, ti.use = function(...at) { - return tl.use(...at), ti.defaults = tl.defaults, i(ti.defaults), ti; - }, ti.walkTokens = function(at, T) { - return tl.walkTokens(at, T); - }, ti.parseInline = tl.parseInline, ti.Parser = ln, ti.parser = ln.parse, ti.Renderer = Pl, ti.TextRenderer = Ka, ti.Lexer = Lo, ti.lexer = Lo.lex, ti.Tokenizer = S, ti.Hooks = qo, ti.parse = ti; - const au = ti.options, cN = ti.setOptions, dN = ti.use, bn = ti.walkTokens, ud = ti.parseInline, hN = ti, JC = ln.parse, x0 = Lo.lex; - e.Hooks = qo, e.Lexer = Lo, e.Marked = ep, e.Parser = ln, e.Renderer = Pl, e.TextRenderer = Ka, e.Tokenizer = S, e.getDefaults = t, e.lexer = x0, e.marked = ti, e.options = au, e.parse = hN, e.parseInline = ud, e.parser = JC, e.setOptions = cN, e.use = dN, e.walkTokens = bn; + ii.options = ii.setOptions = function(ct) { + return sr.setOptions(ct), ii.defaults = sr.defaults, i(ii.defaults), ii; + }, ii.getDefaults = t, ii.defaults = e.defaults, ii.use = function(...ct) { + return sr.use(...ct), ii.defaults = sr.defaults, i(ii.defaults), ii; + }, ii.walkTokens = function(ct, T) { + return sr.walkTokens(ct, T); + }, ii.parseInline = sr.parseInline, ii.Parser = cn, ii.parser = cn.parse, ii.Renderer = Br, ii.TextRenderer = $c, ii.Lexer = Lo, ii.lexer = Lo.lex, ii.Tokenizer = G, ii.Hooks = el, ii.parse = ii; + const uu = ii.options, IC = ii.setOptions, SC = ii.use, fn = ii.walkTokens, ga = ii.parseInline, xC = ii, l1 = cn.parse, w0 = Lo.lex; + e.Hooks = el, e.Lexer = Lo, e.Marked = op, e.Parser = cn, e.Renderer = Br, e.TextRenderer = $c, e.Tokenizer = G, e.getDefaults = t, e.lexer = w0, e.marked = ii, e.options = uu, e.parse = xC, e.parseInline = ga, e.parser = l1, e.setOptions = IC, e.use = SC, e.walkTokens = fn; }); })(); -Fn.Hooks || exports.Hooks; -Fn.Lexer || exports.Lexer; -Fn.Marked || exports.Marked; -Fn.Parser || exports.Parser; -var XK = Fn.Renderer || exports.Renderer; -Fn.TextRenderer || exports.TextRenderer; -Fn.Tokenizer || exports.Tokenizer; -var hhe = Fn.defaults || exports.defaults; -Fn.getDefaults || exports.getDefaults; -var xI = Fn.lexer || exports.lexer; -Fn.marked || exports.marked; -Fn.options || exports.options; -var FK = Fn.parse || exports.parse; -Fn.parseInline || exports.parseInline; -var uhe = Fn.parser || exports.parser; -Fn.setOptions || exports.setOptions; -Fn.use || exports.use; -Fn.walkTokens || exports.walkTokens; -function ghe(s) { - return JSON.stringify(s, mhe); -} -function jv(s) { +zn.Hooks || exports.Hooks; +zn.Lexer || exports.Lexer; +zn.Marked || exports.Marked; +zn.Parser || exports.Parser; +var GO = zn.Renderer || exports.Renderer; +zn.TextRenderer || exports.TextRenderer; +zn.Tokenizer || exports.Tokenizer; +var nue = zn.defaults || exports.defaults; +zn.getDefaults || exports.getDefaults; +var Ex = zn.lexer || exports.lexer; +zn.marked || exports.marked; +zn.options || exports.options; +var XO = zn.parse || exports.parse; +zn.parseInline || exports.parseInline; +var sue = zn.parser || exports.parser; +zn.setOptions || exports.setOptions; +zn.use || exports.use; +zn.walkTokens || exports.walkTokens; +function oue(s) { + return JSON.stringify(s, lue); +} +function fT(s) { let e = JSON.parse(s); - return e = qv(e), e; + return e = yT(e), e; } -function mhe(s, e) { +function lue(s, e) { return e instanceof RegExp ? { $mid: 2, source: e.source, flags: e.flags } : e; } -function qv(s, e = 0) { +function yT(s, e = 0) { if (!s || e > 200) return s; if (typeof s == "object") { switch (s.$mid) { case 1: - return Le.revive(s); + return Xe.revive(s); case 2: return new RegExp(s.source, s.flags); case 17: return new Date(s.source); } - if (s instanceof U_ || s instanceof Uint8Array) + if (s instanceof dx || s instanceof Uint8Array) return s; if (Array.isArray(s)) for (let t = 0; t < s.length; ++t) - s[t] = qv(s[t], e + 1); + s[t] = yT(s[t], e + 1); else for (const t in s) - Object.hasOwnProperty.call(s, t) && (s[t] = qv(s[t], e + 1)); + Object.hasOwnProperty.call(s, t) && (s[t] = yT(s[t], e + 1)); } return s; } -const hW = Object.freeze({ +const xR = Object.freeze({ image: ({ href: s, title: e, text: t }) => { let i = [], n = []; - return s && ({ href: s, dimensions: i } = dhe(s), n.push(`src="${CS(s)}"`)), t && n.push(`alt="${CS(t)}"`), e && n.push(`title="${CS(e)}"`), i.length && (n = n.concat(i)), ""; + return s && ({ href: s, dimensions: i } = iue(s), n.push(`src="${M1(s)}"`)), t && n.push(`alt="${M1(t)}"`), e && n.push(`title="${M1(e)}"`), i.length && (n = n.concat(i)), ""; }, paragraph({ tokens: s }) { return `

    ${this.parser.parseInline(s)}

    `; }, link({ href: s, title: e, tokens: t }) { let i = this.parser.parseInline(t); - return typeof s != "string" ? "" : (s === i && (i = dW(i)), e = typeof e == "string" ? CS(dW(e)) : "", s = dW(s), s = s.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"), `${i}`); + return typeof s != "string" ? "" : (s === i && (i = SR(i)), e = typeof e == "string" ? M1(SR(e)) : "", s = SR(s), s = s.replace(/&/g, "&").replace(//g, ">").replace(/"/g, """).replace(/'/g, "'"), `${i}`); } }); -function MI(s, e = {}, t = {}) { - const i = new U(); +function Dx(s, e = {}, t = {}) { + const i = new _(); let n = !1; - const o = xX(e), r = function(f) { - let b; + const o = QJ(e), l = function(g) { + let Z; try { - b = jv(decodeURIComponent(f)); + Z = fT(decodeURIComponent(g)); } catch { } - return b ? (b = PJ(b, (y) => { - if (s.uris && s.uris[y]) - return Le.revive(s.uris[y]); - }), encodeURIComponent(JSON.stringify(b))) : f; - }, l = function(f, b) { - const y = s.uris && s.uris[f]; - let w = Le.revive(y); - return b ? f.startsWith(Ge.data + ":") ? f : (w || (w = Le.parse(f)), W_.uriToBrowserUri(w).toString(!0)) : !w || Le.parse(f).toString() === w.toString() ? f : (w.query && (w = w.with({ query: r(w.query) })), w.toString()); - }, a = new XK(); - a.image = hW.image, a.link = hW.link, a.paragraph = hW.paragraph; - const c = [], d = []; - if (e.codeBlockRendererSync ? a.code = ({ text: f, lang: b }) => { - const y = Qv.nextId(), w = e.codeBlockRendererSync(nz(b), f); - return d.push([y, w]), `
    ${_y(f)}
    `; - } : e.codeBlockRenderer && (a.code = ({ text: f, lang: b }) => { - const y = Qv.nextId(), w = e.codeBlockRenderer(nz(b), f); - return c.push(w.then((C) => [y, C])), `
    ${_y(f)}
    `; + return Z ? (Z = I_(Z, (f) => { + if (s.uris && s.uris[f]) + return Xe.revive(s.uris[f]); + }), encodeURIComponent(JSON.stringify(Z))) : g; + }, r = function(g, Z) { + const f = s.uris && s.uris[g]; + let y = Xe.revive(f); + return Z ? g.startsWith(ve.data + ":") ? g : (y || (y = Xe.parse(g)), US.uriToBrowserUri(y).toString(!0)) : !y || Xe.parse(g).toString() === y.toString() ? g : (y.query && (y = y.with({ query: l(y.query) })), y.toString()); + }, c = new GO(); + c.image = xR.image, c.link = xR.link, c.paragraph = xR.paragraph; + const d = [], a = []; + if (e.codeBlockRendererSync ? c.code = ({ text: g, lang: Z }) => { + const f = ZT.nextId(), y = e.codeBlockRendererSync(Cz(Z), g); + return a.push([f, y]), `
    ${Hf(g)}
    `; + } : e.codeBlockRenderer && (c.code = ({ text: g, lang: Z }) => { + const f = ZT.nextId(), y = e.codeBlockRenderer(Cz(Z), g); + return d.push(y.then((W) => [f, W])), `
    ${Hf(g)}
    `; }), e.actionHandler) { - const f = function(w) { - let C = w.target; - if (!(C.tagName !== "A" && (C = C.parentElement, !C || C.tagName !== "A"))) + const g = function(y) { + let W = y.target; + if (!(W.tagName !== "A" && (W = W.parentElement, !W || W.tagName !== "A"))) try { - let S = C.dataset.href; - S && (s.baseUri && (S = uW(Le.from(s.baseUri), S)), e.actionHandler.callback(S, w)); - } catch (S) { - De(S); + let G = W.dataset.href; + G && (s.baseUri && (G = CR(Xe.from(s.baseUri), G)), e.actionHandler.callback(G, y)); + } catch (G) { + Me(G); } finally { - w.preventDefault(); + y.preventDefault(); } - }, b = e.actionHandler.disposables.add(new et(o, "click")), y = e.actionHandler.disposables.add(new et(o, "auxclick")); - e.actionHandler.disposables.add(se.any(b.event, y.event)((w) => { - const C = new Er(xe(o), w); - !C.leftButton && !C.middleButton || f(C); - })), e.actionHandler.disposables.add(z(o, "keydown", (w) => { - const C = new Vt(w); - !C.equals( + }, Z = e.actionHandler.disposables.add(new et(o, "click")), f = e.actionHandler.disposables.add(new et(o, "auxclick")); + e.actionHandler.disposables.add(se.any(Z.event, f.event)((y) => { + const W = new Fl(Le(o), y); + !W.leftButton && !W.middleButton || g(W); + })), e.actionHandler.disposables.add(z(o, "keydown", (y) => { + const W = new Yt(y); + !W.equals( 10 /* KeyCode.Space */ - ) && !C.equals( + ) && !W.equals( 3 /* KeyCode.Enter */ - ) || f(C); + ) || g(W); })); } - s.supportHtml || (a.html = ({ text: f }) => { - var y; - return (y = e.sanitizerOptions) != null && y.replaceWithPlaintext ? _y(f) : (s.isTrusted ? f.match(/^(]+>)|(<\/\s*span>)$/) : void 0) ? f : ""; - }), t.renderer = a; + s.supportHtml || (c.html = ({ text: g }) => { + var f; + return (f = e.sanitizerOptions) != null && f.replaceWithPlaintext ? Hf(g) : (s.isTrusted ? g.match(/^(]+>)|(<\/\s*span>)$/) : void 0) ? g : ""; + }), t.renderer = c; let h = s.value ?? ""; - h.length > 1e5 && (h = `${h.substr(0, 1e5)}…`), s.supportThemeIcons && (h = she(h)); + h.length > 1e5 && (h = `${h.substr(0, 1e5)}…`), s.supportThemeIcons && (h = Ohe(h)); let u; if (e.fillInIncompleteTokens) { - const f = { - ...hhe, + const g = { + ...nue, ...t - }, b = xI(h, f), y = _he(b); - u = uhe(y, f); + }, Z = Ex(h, g), f = yue(Z); + u = sue(f, g); } else - u = FK(h, { ...t, async: !1 }); - s.supportThemeIcons && (u = ih(u).map((b) => typeof b == "string" ? b : b.outerHTML).join("")); - const m = new DOMParser().parseFromString($v({ isTrusted: s.isTrusted, ...e.sanitizerOptions }, u), "text/html"); - if (m.body.querySelectorAll("img, audio, video, source").forEach((f) => { - const b = f.getAttribute("src"); - if (b) { - let y = b; + u = XO(h, { ...t, async: !1 }); + s.supportThemeIcons && (u = lh(u).map((Z) => typeof Z == "string" ? Z : Z.outerHTML).join("")); + const b = new DOMParser().parseFromString(WT({ isTrusted: s.isTrusted, ...e.sanitizerOptions }, u), "text/html"); + if (b.body.querySelectorAll("img, audio, video, source").forEach((g) => { + const Z = g.getAttribute("src"); + if (Z) { + let f = Z; try { - s.baseUri && (y = uW(Le.from(s.baseUri), y)); + s.baseUri && (f = CR(Xe.from(s.baseUri), f)); } catch { } - if (f.setAttribute("src", l(y, !0)), e.remoteImageIsAllowed) { - const w = Le.parse(y); - w.scheme !== Ge.file && w.scheme !== Ge.data && !e.remoteImageIsAllowed(w) && f.replaceWith(ce("", void 0, f.outerHTML)); + if (g.setAttribute("src", r(f, !0)), e.remoteImageIsAllowed) { + const y = Xe.parse(f); + y.scheme !== ve.file && y.scheme !== ve.data && !e.remoteImageIsAllowed(y) && g.replaceWith(de("", void 0, g.outerHTML)); } } - }), m.body.querySelectorAll("a").forEach((f) => { - const b = f.getAttribute("href"); - if (f.setAttribute("href", ""), !b || /^data:|javascript:/i.test(b) || /^command:/i.test(b) && !s.isTrusted || /^command:(\/\/\/)?_workbench\.downloadResource/i.test(b)) - f.replaceWith(...f.childNodes); + }), b.body.querySelectorAll("a").forEach((g) => { + const Z = g.getAttribute("href"); + if (g.setAttribute("href", ""), !Z || /^data:|javascript:/i.test(Z) || /^command:/i.test(Z) && !s.isTrusted || /^command:(\/\/\/)?_workbench\.downloadResource/i.test(Z)) + g.replaceWith(...g.childNodes); else { - let y = l(b, !1); - s.baseUri && (y = uW(Le.from(s.baseUri), b)), f.dataset.href = y; + let f = r(Z, !1); + s.baseUri && (f = CR(Xe.from(s.baseUri), Z)), g.dataset.href = f; } - }), o.innerHTML = $v({ isTrusted: s.isTrusted, ...e.sanitizerOptions }, m.body.innerHTML), c.length > 0) - Promise.all(c).then((f) => { - var w; + }), o.innerHTML = WT({ isTrusted: s.isTrusted, ...e.sanitizerOptions }, b.body.innerHTML), d.length > 0) + Promise.all(d).then((g) => { + var y; if (n) return; - const b = new Map(f), y = o.querySelectorAll("div[data-code]"); - for (const C of y) { - const S = b.get(C.dataset.code ?? ""); - S && In(C, S); + const Z = new Map(g), f = o.querySelectorAll("div[data-code]"); + for (const W of f) { + const G = Z.get(W.dataset.code ?? ""); + G && Rn(W, G); } - (w = e.asyncRenderCallback) == null || w.call(e); + (y = e.asyncRenderCallback) == null || y.call(e); }); - else if (d.length > 0) { - const f = new Map(d), b = o.querySelectorAll("div[data-code]"); - for (const y of b) { - const w = f.get(y.dataset.code ?? ""); - w && In(y, w); + else if (a.length > 0) { + const g = new Map(a), Z = o.querySelectorAll("div[data-code]"); + for (const f of Z) { + const y = g.get(f.dataset.code ?? ""); + y && Rn(f, y); } } if (e.asyncRenderCallback) - for (const f of o.getElementsByTagName("img")) { - const b = i.add(z(f, "load", () => { - b.dispose(), e.asyncRenderCallback(); + for (const g of o.getElementsByTagName("img")) { + const Z = i.add(z(g, "load", () => { + Z.dispose(), e.asyncRenderCallback(); })); } return { @@ -46330,64 +46330,64 @@ function MI(s, e = {}, t = {}) { } }; } -function nz(s) { +function Cz(s) { if (!s) return ""; const e = s.split(/[\s+|:|,|\{|\?]/, 1); return e.length ? e[0] : s; } -function uW(s, e) { - return /^\w[\w\d+.-]*:/.test(e) ? e : s.path.endsWith("/") ? bY(s, e).toString() : bY(bI(s), e).toString(); +function CR(s, e) { + return /^\w[\w\d+.-]*:/.test(e) ? e : s.path.endsWith("/") ? zF(s, e).toString() : zF(Tx(s), e).toString(); } -const phe = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]; -function $v(s, e) { - const { config: t, allowedSchemes: i } = bhe(s), n = new U(); - n.add(sz("uponSanitizeAttribute", (o, r) => { - var l; - if (r.attrName === "style" || r.attrName === "class") { +const rue = ["area", "base", "br", "col", "command", "embed", "hr", "img", "input", "keygen", "link", "meta", "param", "source", "track", "wbr"]; +function WT(s, e) { + const { config: t, allowedSchemes: i } = due(s), n = new _(); + n.add(Rz("uponSanitizeAttribute", (o, l) => { + var r; + if (l.attrName === "style" || l.attrName === "class") { if (o.tagName === "SPAN") { - if (r.attrName === "style") { - r.keepAttr = /^(color\:(#[0-9a-fA-F]+|var\(--vscode(-[a-zA-Z]+)+\));)?(background-color\:(#[0-9a-fA-F]+|var\(--vscode(-[a-zA-Z]+)+\));)?(border-radius:[0-9]+px;)?$/.test(r.attrValue); + if (l.attrName === "style") { + l.keepAttr = /^(color\:(#[0-9a-fA-F]+|var\(--vscode(-[a-zA-Z]+)+\));)?(background-color\:(#[0-9a-fA-F]+|var\(--vscode(-[a-zA-Z]+)+\));)?(border-radius:[0-9]+px;)?$/.test(l.attrValue); return; - } else if (r.attrName === "class") { - r.keepAttr = /^codicon codicon-[a-z\-]+( codicon-modifier-[a-z\-]+)?$/.test(r.attrValue); + } else if (l.attrName === "class") { + l.keepAttr = /^codicon codicon-[a-z\-]+( codicon-modifier-[a-z\-]+)?$/.test(l.attrValue); return; } } - r.keepAttr = !1; + l.keepAttr = !1; return; - } else if (o.tagName === "INPUT" && ((l = o.attributes.getNamedItem("type")) == null ? void 0 : l.value) === "checkbox") { - if (r.attrName === "type" && r.attrValue === "checkbox" || r.attrName === "disabled" || r.attrName === "checked") { - r.keepAttr = !0; + } else if (o.tagName === "INPUT" && ((r = o.attributes.getNamedItem("type")) == null ? void 0 : r.value) === "checkbox") { + if (l.attrName === "type" && l.attrValue === "checkbox" || l.attrName === "disabled" || l.attrName === "checked") { + l.keepAttr = !0; return; } - r.keepAttr = !1; + l.keepAttr = !1; } - })), n.add(sz("uponSanitizeElement", (o, r) => { - var l; - if (r.tagName === "input" && (((l = o.attributes.getNamedItem("type")) == null ? void 0 : l.value) === "checkbox" ? o.setAttribute("disabled", "") : s.replaceWithPlaintext || o.remove()), s.replaceWithPlaintext && !r.allowedTags[r.tagName] && r.tagName !== "body" && o.parentElement) { - let a, c; - if (r.tagName === "#comment") - a = ``; + })), n.add(Rz("uponSanitizeElement", (o, l) => { + var r; + if (l.tagName === "input" && (((r = o.attributes.getNamedItem("type")) == null ? void 0 : r.value) === "checkbox" ? o.setAttribute("disabled", "") : s.replaceWithPlaintext || o.remove()), s.replaceWithPlaintext && !l.allowedTags[l.tagName] && l.tagName !== "body" && o.parentElement) { + let c, d; + if (l.tagName === "#comment") + c = ``; else { - const g = phe.includes(r.tagName), m = o.attributes.length ? " " + Array.from(o.attributes).map((f) => `${f.name}="${f.value}"`).join(" ") : ""; - a = `<${r.tagName}${m}>`, g || (c = ``); + const m = rue.includes(l.tagName), b = o.attributes.length ? " " + Array.from(o.attributes).map((g) => `${g.name}="${g.value}"`).join(" ") : ""; + c = `<${l.tagName}${b}>`, m || (d = ``); } - const d = document.createDocumentFragment(), h = o.parentElement.ownerDocument.createTextNode(a); - d.appendChild(h); - const u = c ? o.parentElement.ownerDocument.createTextNode(c) : void 0; + const a = document.createDocumentFragment(), h = o.parentElement.ownerDocument.createTextNode(c); + a.appendChild(h); + const u = d ? o.parentElement.ownerDocument.createTextNode(d) : void 0; for (; o.firstChild; ) - d.appendChild(o.firstChild); - u && d.appendChild(u), o.nodeType === Node.COMMENT_NODE ? o.parentElement.insertBefore(d, o) : o.parentElement.replaceChild(d, o); + a.appendChild(o.firstChild); + u && a.appendChild(u), o.nodeType === Node.COMMENT_NODE ? o.parentElement.insertBefore(a, o) : o.parentElement.replaceChild(a, o); } - })), n.add(d$(i)); + })), n.add(iee(i)); try { - return DH(e, { ...t, RETURN_TRUSTED_TYPE: !0 }); + return pB(e, { ...t, RETURN_TRUSTED_TYPE: !0 }); } finally { n.dispose(); } } -const fhe = [ +const cue = [ "align", "autoplay", "alt", @@ -46414,40 +46414,40 @@ const fhe = [ "width", "start" ]; -function bhe(s) { +function due(s) { const e = [ - Ge.http, - Ge.https, - Ge.mailto, - Ge.data, - Ge.file, - Ge.vscodeFileResource, - Ge.vscodeRemote, - Ge.vscodeRemoteResource + ve.http, + ve.https, + ve.mailto, + ve.data, + ve.file, + ve.vscodeFileResource, + ve.vscodeRemote, + ve.vscodeRemoteResource ]; - return s.isTrusted && e.push(Ge.command), { + return s.isTrusted && e.push(ve.command), { config: { // allowedTags should included everything that markdown renders to. // Since we have our own sanitize function for marked, it's possible we missed some tag so let dompurify make sure. // HTML tags that can result from markdown are from reading https://spec.commonmark.org/0.29/ // HTML table tags that can result from markdown are from https://github.github.com/gfm/#tables-extension- - ALLOWED_TAGS: s.allowedTags ?? [...h$], - ALLOWED_ATTR: fhe, + ALLOWED_TAGS: s.allowedTags ?? [...nee], + ALLOWED_ATTR: cue, ALLOW_UNKNOWN_PROTOCOLS: !0 }, allowedSchemes: e }; } -function yhe(s) { - return typeof s == "string" ? s : whe(s); +function aue(s) { + return typeof s == "string" ? s : hue(s); } -function whe(s, e) { +function hue(s, e) { let t = s.value ?? ""; t.length > 1e5 && (t = `${t.substr(0, 1e5)}…`); - const i = FK(t, { async: !1, renderer: Lhe.value }).replace(/&(#\d+|[a-zA-Z]+);/g, (n) => Che.get(n) ?? n); - return $v({ isTrusted: !1 }, i).toString(); + const i = XO(t, { async: !1, renderer: bue.value }).replace(/&(#\d+|[a-zA-Z]+);/g, (n) => uue.get(n) ?? n); + return WT({ isTrusted: !1 }, i).toString(); } -const Che = /* @__PURE__ */ new Map([ +const uue = /* @__PURE__ */ new Map([ [""", '"'], [" ", " "], ["&", "&"], @@ -46455,8 +46455,8 @@ const Che = /* @__PURE__ */ new Map([ ["<", "<"], [">", ">"] ]); -function She() { - const s = new XK(); +function mue() { + const s = new GO(); return s.code = ({ text: e }) => e, s.blockquote = ({ text: e }) => e + ` `, s.html = (e) => "", s.heading = function({ tokens: e }) { return this.parser.parseInline(e) + ` @@ -46479,71 +46479,71 @@ function She() { }, s.strong = ({ text: e }) => e, s.em = ({ text: e }) => e, s.codespan = ({ text: e }) => e, s.br = (e) => ` `, s.del = ({ text: e }) => e, s.image = (e) => "", s.text = ({ text: e }) => e, s.link = ({ text: e }) => e, s; } -const Lhe = new Wl((s) => She()); -function jA(s) { +const bue = new Yr((s) => mue()); +function uL(s) { let e = ""; return s.forEach((t) => { e += t.raw; }), e; } -function YK(s) { +function VO(s) { var e, t; if (s.tokens) for (let i = s.tokens.length - 1; i >= 0; i--) { const n = s.tokens[i]; if (n.type === "text") { const o = n.raw.split(` -`), r = o[o.length - 1]; - if (r.includes("`")) - return Nhe(s); - if (r.includes("**")) - return khe(s); - if (r.match(/\*\w/)) - return Whe(s); - if (r.match(/(^|\s)__\w/)) - return Ghe(s); - if (r.match(/(^|\s)_\w/)) - return vhe(s); +`), l = o[o.length - 1]; + if (l.includes("`")) + return Gue(s); + if (l.includes("**")) + return xue(s); + if (l.match(/\*\w/)) + return Xue(s); + if (l.match(/(^|\s)__\w/)) + return Cue(s); + if (l.match(/(^|\s)_\w/)) + return Vue(s); if ( // Text with start of link target - Ahe(r) || // This token doesn't have the link text, eg if it contains other markdown constructs that are in other subtokens. + pue(l) || // This token doesn't have the link text, eg if it contains other markdown constructs that are in other subtokens. // But some preceding token does have an unbalanced [ at least - xhe(r) && s.tokens.slice(0, i).some((l) => l.type === "text" && l.raw.match(/\[[^\]]*$/)) + gue(l) && s.tokens.slice(0, i).some((r) => r.type === "text" && r.raw.match(/\[[^\]]*$/)) ) { - const l = s.tokens.slice(i + 1); + const r = s.tokens.slice(i + 1); return ( // If the link was parsed as a link, then look for a link token and a text token with a quote - ((e = l[0]) == null ? void 0 : e.type) === "link" && ((t = l[1]) == null ? void 0 : t.type) === "text" && l[1].raw.match(/^ *"[^"]*$/) || // And if the link was not parsed as a link (eg command link), just look for a single quote in this token - r.match(/^[^"]* +"[^"]*$/) ? Dhe(s) : The(s) + ((e = r[0]) == null ? void 0 : e.type) === "link" && ((t = r[1]) == null ? void 0 : t.type) === "text" && r[1].raw.match(/^ *"[^"]*$/) || // And if the link was not parsed as a link (eg command link), just look for a single quote in this token + l.match(/^[^"]* +"[^"]*$/) ? Iue(s) : Lue(s) ); - } else if (r.match(/(^|\s)\[\w*/)) - return Vhe(s); + } else if (l.match(/(^|\s)\[\w*/)) + return Sue(s); } } } -function Ahe(s) { +function pue(s) { return !!s.match(/(^|\s)\[.*\]\(\w*/); } -function xhe(s) { +function gue(s) { return !!s.match(/^[^\[]*\]\([^\)]*$/); } -function Mhe(s) { - var a; +function Zue(s) { + var c; const e = s.items[s.items.length - 1], t = e.tokens ? e.tokens[e.tokens.length - 1] : void 0; let i; - if ((t == null ? void 0 : t.type) === "text" && !("inRawBlock" in e) && (i = YK(t)), !i || i.type !== "paragraph") + if ((t == null ? void 0 : t.type) === "text" && !("inRawBlock" in e) && (i = VO(t)), !i || i.type !== "paragraph") return; - const n = jA(s.items.slice(0, -1)), o = (a = e.raw.match(/^(\s*(-|\d+\.|\*) +)/)) == null ? void 0 : a[0]; + const n = uL(s.items.slice(0, -1)), o = (c = e.raw.match(/^(\s*(-|\d+\.|\*) +)/)) == null ? void 0 : c[0]; if (!o) return; - const r = o + jA(e.tokens.slice(0, -1)) + i.raw, l = xI(n + r)[0]; - if (l.type === "list") - return l; + const l = o + uL(e.tokens.slice(0, -1)) + i.raw, r = Ex(n + l)[0]; + if (r.type === "list") + return r; } -const Zhe = 3; -function _he(s) { - for (let e = 0; e < Zhe; e++) { - const t = Ihe(s); +const fue = 3; +function yue(s) { + for (let e = 0; e < fue; e++) { + const t = Wue(s); if (t) s = t; else @@ -46551,23 +46551,23 @@ function _he(s) { } return s; } -function Ihe(s) { +function Wue(s) { let e, t; for (e = 0; e < s.length; e++) { const i = s[e]; if (i.type === "paragraph" && i.raw.match(/(\n|^)\|/)) { - t = Rhe(s.slice(e)); + t = Rue(s.slice(e)); break; } if (e === s.length - 1 && i.type === "list") { - const n = Mhe(i); + const n = Zue(i); if (n) { t = [n]; break; } } if (e === s.length - 1 && i.type === "paragraph") { - const n = YK(i); + const n = VO(i); if (n) { t = [n]; break; @@ -46583,45 +46583,45 @@ function Ihe(s) { } return null; } -function Nhe(s) { - return Kh(s, "`"); +function Gue(s) { + return $h(s, "`"); } -function Whe(s) { - return Kh(s, "*"); +function Xue(s) { + return $h(s, "*"); } -function vhe(s) { - return Kh(s, "_"); +function Vue(s) { + return $h(s, "_"); } -function The(s) { - return Kh(s, ")"); +function Lue(s) { + return $h(s, ")"); } -function Dhe(s) { - return Kh(s, '")'); +function Iue(s) { + return $h(s, '")'); } -function Vhe(s) { - return Kh(s, "](https://microsoft.com)"); +function Sue(s) { + return $h(s, "](https://microsoft.com)"); } -function khe(s) { - return Kh(s, "**"); +function xue(s) { + return $h(s, "**"); } -function Ghe(s) { - return Kh(s, "__"); +function Cue(s) { + return $h(s, "__"); } -function Kh(s, e) { - const t = jA(Array.isArray(s) ? s : [s]); - return xI(t + e)[0]; +function $h(s, e) { + const t = uL(Array.isArray(s) ? s : [s]); + return Ex(t + e)[0]; } -function Rhe(s) { - const e = jA(s), t = e.split(` +function Rue(s) { + const e = uL(s), t = e.split(` `); let i, n = !1; for (let o = 0; o < t.length; o++) { - const r = t[o].trim(); - if (typeof i > "u" && r.match(/^\s*\|/)) { - const l = r.match(/(\|[^\|]+)(?=\||$)/g); - l && (i = l.length); + const l = t[o].trim(); + if (typeof i > "u" && l.match(/^\s*\|/)) { + const r = l.match(/(\|[^\|]+)(?=\||$)/g); + r && (i = r.length); } else if (typeof i == "number") - if (r.match(/^\s*\|/)) { + if (l.match(/^\s*\|/)) { if (o !== t.length - 1) return; n = !0; @@ -46630,15 +46630,15 @@ function Rhe(s) { } if (typeof i == "number" && i > 0) { const o = n ? t.slice(0, -1).join(` -`) : e, r = !!o.match(/\|\s*$/), l = o + (r ? "" : "|") + ` +`) : e, l = !!o.match(/\|\s*$/), r = o + (l ? "" : "|") + ` |${" --- |".repeat(i)}`; - return xI(l); + return Ex(r); } } -function sz(s, e) { - return VH(s, e), Ce(() => kH(s)); +function Rz(s, e) { + return gB(s, e), We(() => ZB(s)); } -let zK = { +let LO = { showHover: () => { }, hideHover: () => { @@ -46649,13 +46649,13 @@ let zK = { showManagedHover: () => { } }; -function Ehe(s) { - zK = s; +function Nue(s) { + LO = s; } -function Fl() { - return zK; +function Kr() { + return LO; } -class Xhe { +class wue { constructor(e) { this.spliceables = e; } @@ -46663,10 +46663,10 @@ class Xhe { this.spliceables.forEach((n) => n.splice(e, t, i)); } } -function os(s, e, t) { +function rs(s, e, t) { return Math.min(Math.max(s, e), t); } -class PK { +class IO { constructor() { this._n = 1, this._val = 0; } @@ -46677,7 +46677,7 @@ class PK { return this._val; } } -class Fhe { +class Tue { constructor(e) { this._n = 0, this._val = 0, this._values = [], this._index = 0, this._sum = 0, this._values = new Array(e), this._values.fill(0, 0, e); } @@ -46689,69 +46689,69 @@ class Fhe { return this._val; } } -class gu extends Error { +class Zu extends Error { constructor(e, t) { super(`ListError [${e}] ${t}`); } } -var vn; +var Tn; (function(s) { - function e(o, r) { - if (o.start >= r.end || r.start >= o.end) + function e(o, l) { + if (o.start >= l.end || l.start >= o.end) return { start: 0, end: 0 }; - const l = Math.max(o.start, r.start), a = Math.min(o.end, r.end); - return a - l <= 0 ? { start: 0, end: 0 } : { start: l, end: a }; + const r = Math.max(o.start, l.start), c = Math.min(o.end, l.end); + return c - r <= 0 ? { start: 0, end: 0 } : { start: r, end: c }; } s.intersect = e; function t(o) { return o.end - o.start <= 0; } s.isEmpty = t; - function i(o, r) { - return !t(e(o, r)); + function i(o, l) { + return !t(e(o, l)); } s.intersects = i; - function n(o, r) { - const l = [], a = { start: o.start, end: Math.min(r.start, o.end) }, c = { start: Math.max(r.end, o.start), end: o.end }; - return t(a) || l.push(a), t(c) || l.push(c), l; + function n(o, l) { + const r = [], c = { start: o.start, end: Math.min(l.start, o.end) }, d = { start: Math.max(l.end, o.start), end: o.end }; + return t(c) || r.push(c), t(d) || r.push(d), r; } s.relativeComplement = n; -})(vn || (vn = {})); -function oz(s, e) { +})(Tn || (Tn = {})); +function Nz(s, e) { const t = []; for (const i of e) { if (s.start >= i.range.end) continue; if (s.end < i.range.start) break; - const n = vn.intersect(s, i.range); - vn.isEmpty(n) || t.push({ + const n = Tn.intersect(s, i.range); + Tn.isEmpty(n) || t.push({ range: n, size: i.size }); } return t; } -function eT({ start: s, end: e }, t) { +function GT({ start: s, end: e }, t) { return { start: s + t, end: e + t }; } -function Yhe(s) { +function Mue(s) { const e = []; let t = null; for (const i of s) { - const n = i.range.start, o = i.range.end, r = i.size; - if (t && r === t.size) { + const n = i.range.start, o = i.range.end, l = i.size; + if (t && l === t.size) { t.range.end = o; continue; } - t = { range: { start: n, end: o }, size: r }, e.push(t); + t = { range: { start: n, end: o }, size: l }, e.push(t); } return e; } -function zhe(...s) { - return Yhe(s.reduce((e, t) => e.concat(t), [])); +function Yue(...s) { + return Mue(s.reduce((e, t) => e.concat(t), [])); } -class Phe { +class kue { get paddingTop() { return this._paddingTop; } @@ -46762,11 +46762,11 @@ class Phe { this.groups = [], this._size = 0, this._paddingTop = 0, this._paddingTop = e ?? 0, this._size = this._paddingTop; } splice(e, t, i = []) { - const n = i.length - t, o = oz({ start: 0, end: e }, this.groups), r = oz({ start: e + t, end: Number.POSITIVE_INFINITY }, this.groups).map((a) => ({ range: eT(a.range, n), size: a.size })), l = i.map((a, c) => ({ - range: { start: e + c, end: e + c + 1 }, - size: a.size + const n = i.length - t, o = Nz({ start: 0, end: e }, this.groups), l = Nz({ start: e + t, end: Number.POSITIVE_INFINITY }, this.groups).map((c) => ({ range: GT(c.range, n), size: c.size })), r = i.map((c, d) => ({ + range: { start: e + d, end: e + d + 1 }, + size: c.size })); - this.groups = zhe(o, l, r), this._size = this._paddingTop + this.groups.reduce((a, c) => a + c.size * (c.range.end - c.range.start), 0); + this.groups = Yue(o, r, l), this._size = this._paddingTop + this.groups.reduce((c, d) => c + d.size * (d.range.end - d.range.start), 0); } /** * Returns the number of items in the range map. @@ -46791,10 +46791,10 @@ class Phe { return 0; let t = 0, i = this._paddingTop; for (const n of this.groups) { - const o = n.range.end - n.range.start, r = i + o * n.size; - if (e < r) + const o = n.range.end - n.range.start, l = i + o * n.size; + if (e < l) return t + Math.floor((e - i) / n.size); - t += o, i = r; + t += o, i = l; } return t; } @@ -46813,15 +46813,15 @@ class Phe { return -1; let t = 0, i = 0; for (const n of this.groups) { - const o = n.range.end - n.range.start, r = i + o; - if (e < r) + const o = n.range.end - n.range.start, l = i + o; + if (e < l) return this._paddingTop + t + (e - i) * n.size; - t += o * n.size, i = r; + t += o * n.size, i = l; } return -1; } } -class Bhe { +class vue { constructor(e) { this.renderers = e, this.cache = /* @__PURE__ */ new Map(), this.transactionNodesPendingRemoval = /* @__PURE__ */ new Set(), this.inTransaction = !1; } @@ -46836,8 +46836,8 @@ class Bhe { if (t) i = this.transactionNodesPendingRemoval.has(t.domNode), i && this.transactionNodesPendingRemoval.delete(t.domNode); else { - const n = ce(".monaco-list-row"), r = this.getRenderer(e).renderTemplate(n); - t = { domNode: n, templateId: e, templateData: r }; + const n = de(".monaco-list-row"), l = this.getRenderer(e).renderTemplate(n); + t = { domNode: n, templateId: e, templateData: l }; } return { row: t, isReusingConnectedDomNode: i }; } @@ -46886,15 +46886,15 @@ class Bhe { return t; } } -var sd = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var ca = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; }; -const mu = { +const fu = { CurrentDragAndDropData: void 0 -}, Hl = { +}, Or = { useShadows: !0, verticalScrollMode: 1, setRowLineHeight: !0, @@ -46921,7 +46921,7 @@ const mu = { transformOptimization: !0, alwaysConsumeMouseWheel: !0 }; -class IC { +class FG { constructor(e) { this.elements = e; } @@ -46931,7 +46931,7 @@ class IC { return this.elements; } } -class Ohe { +class Jue { constructor(e) { this.elements = e; } @@ -46941,7 +46941,7 @@ class Ohe { return this.elements; } } -class Hhe { +class Hue { constructor() { this.types = [], this.files = []; } @@ -46961,16 +46961,16 @@ class Hhe { }; } } -function Jhe(s, e) { - return Array.isArray(s) && Array.isArray(e) ? ei(s, e) : s === e; +function Eue(s, e) { + return Array.isArray(s) && Array.isArray(e) ? ti(s, e) : s === e; } -class Uhe { +class Due { constructor(e) { e != null && e.getSetSize ? this.getSetSize = e.getSetSize.bind(e) : this.getSetSize = (t, i, n) => n, e != null && e.getPosInSet ? this.getPosInSet = e.getPosInSet.bind(e) : this.getPosInSet = (t, i) => i + 1, e != null && e.getRole ? this.getRole = e.getRole.bind(e) : this.getRole = (t) => "listitem", e != null && e.isChecked ? this.isChecked = e.isChecked.bind(e) : this.isChecked = (t) => { }; } } -const yZ = class yZ { +const M2 = class M2 { get contentHeight() { return this.rangeMap.size; } @@ -46990,31 +46990,31 @@ const yZ = class yZ { if (this._horizontalScrolling = e, this.domNode.classList.toggle("horizontal-scrolling", this._horizontalScrolling), this._horizontalScrolling) { for (const t of this.items) this.measureItemWidth(t); - this.updateScrollWidth(), this.scrollableElement.setScrollDimensions({ width: MN(this.domNode) }), this.rowsContainer.style.width = `${Math.max(this.scrollWidth || 0, this.renderWidth)}px`; + this.updateScrollWidth(), this.scrollableElement.setScrollDimensions({ width: FC(this.domNode) }), this.rowsContainer.style.width = `${Math.max(this.scrollWidth || 0, this.renderWidth)}px`; } else this.scrollableElementWidthDelayer.cancel(), this.scrollableElement.setScrollDimensions({ width: this.renderWidth, scrollWidth: this.renderWidth }), this.rowsContainer.style.width = ""; } } - constructor(e, t, i, n = Hl) { - var r, l; - if (this.virtualDelegate = t, this.domId = `list_id_${++yZ.InstanceCount}`, this.renderers = /* @__PURE__ */ new Map(), this.renderWidth = 0, this._scrollHeight = 0, this.scrollableElementUpdateDisposable = null, this.scrollableElementWidthDelayer = new fr(50), this.splicing = !1, this.dragOverAnimationStopDisposable = R.None, this.dragOverMouseY = 0, this.canDrop = !1, this.currentDragFeedbackDisposable = R.None, this.onDragLeaveTimeout = R.None, this.disposables = new U(), this._onDidChangeContentHeight = new k(), this._onDidChangeContentWidth = new k(), this.onDidChangeContentHeight = se.latch(this._onDidChangeContentHeight.event, void 0, this.disposables), this._horizontalScrolling = !1, n.horizontalScrolling && n.supportDynamicHeights) + constructor(e, t, i, n = Or) { + var l, r; + if (this.virtualDelegate = t, this.domId = `list_id_${++M2.InstanceCount}`, this.renderers = /* @__PURE__ */ new Map(), this.renderWidth = 0, this._scrollHeight = 0, this.scrollableElementUpdateDisposable = null, this.scrollableElementWidthDelayer = new yl(50), this.splicing = !1, this.dragOverAnimationStopDisposable = J.None, this.dragOverMouseY = 0, this.canDrop = !1, this.currentDragFeedbackDisposable = J.None, this.onDragLeaveTimeout = J.None, this.disposables = new _(), this._onDidChangeContentHeight = new k(), this._onDidChangeContentWidth = new k(), this.onDidChangeContentHeight = se.latch(this._onDidChangeContentHeight.event, void 0, this.disposables), this._horizontalScrolling = !1, n.horizontalScrolling && n.supportDynamicHeights) throw new Error("Horizontal scrolling and dynamic heights not supported simultaneously"); this.items = [], this.itemId = 0, this.rangeMap = this.createRangeMap(n.paddingTop ?? 0); - for (const a of i) - this.renderers.set(a.templateId, a); - this.cache = this.disposables.add(new Bhe(this.renderers)), this.lastRenderTop = 0, this.lastRenderHeight = 0, this.domNode = document.createElement("div"), this.domNode.className = "monaco-list", this.domNode.classList.add(this.domId), this.domNode.tabIndex = 0, this.domNode.classList.toggle("mouse-support", typeof n.mouseSupport == "boolean" ? n.mouseSupport : !0), this._horizontalScrolling = n.horizontalScrolling ?? Hl.horizontalScrolling, this.domNode.classList.toggle("horizontal-scrolling", this._horizontalScrolling), this.paddingBottom = typeof n.paddingBottom > "u" ? 0 : n.paddingBottom, this.accessibilityProvider = new Uhe(n.accessibilityProvider), this.rowsContainer = document.createElement("div"), this.rowsContainer.className = "monaco-list-rows", (n.transformOptimization ?? Hl.transformOptimization) && (this.rowsContainer.style.transform = "translate3d(0px, 0px, 0px)", this.rowsContainer.style.overflow = "hidden", this.rowsContainer.style.contain = "strict"), this.disposables.add(Rn.addTarget(this.rowsContainer)), this.scrollable = this.disposables.add(new o0({ + for (const c of i) + this.renderers.set(c.templateId, c); + this.cache = this.disposables.add(new vue(this.renderers)), this.lastRenderTop = 0, this.lastRenderHeight = 0, this.domNode = document.createElement("div"), this.domNode.className = "monaco-list", this.domNode.classList.add(this.domId), this.domNode.tabIndex = 0, this.domNode.classList.toggle("mouse-support", typeof n.mouseSupport == "boolean" ? n.mouseSupport : !0), this._horizontalScrolling = n.horizontalScrolling ?? Or.horizontalScrolling, this.domNode.classList.toggle("horizontal-scrolling", this._horizontalScrolling), this.paddingBottom = typeof n.paddingBottom > "u" ? 0 : n.paddingBottom, this.accessibilityProvider = new Due(n.accessibilityProvider), this.rowsContainer = document.createElement("div"), this.rowsContainer.className = "monaco-list-rows", (n.transformOptimization ?? Or.transformOptimization) && (this.rowsContainer.style.transform = "translate3d(0px, 0px, 0px)", this.rowsContainer.style.overflow = "hidden", this.rowsContainer.style.contain = "strict"), this.disposables.add(En.addTarget(this.rowsContainer)), this.scrollable = this.disposables.add(new h0({ forceIntegerValues: !0, smoothScrollDuration: n.smoothScrolling ?? !1 ? 125 : 0, - scheduleAtNextAnimationFrame: (a) => po(xe(this.domNode), a) - })), this.scrollableElement = this.disposables.add(new uI(this.rowsContainer, { - alwaysConsumeMouseWheel: n.alwaysConsumeMouseWheel ?? Hl.alwaysConsumeMouseWheel, + scheduleAtNextAnimationFrame: (c) => Zo(Le(this.domNode), c) + })), this.scrollableElement = this.disposables.add(new xx(this.rowsContainer, { + alwaysConsumeMouseWheel: n.alwaysConsumeMouseWheel ?? Or.alwaysConsumeMouseWheel, horizontal: 1, - vertical: n.verticalScrollMode ?? Hl.verticalScrollMode, - useShadows: n.useShadows ?? Hl.useShadows, + vertical: n.verticalScrollMode ?? Or.verticalScrollMode, + useShadows: n.useShadows ?? Or.useShadows, mouseWheelScrollSensitivity: n.mouseWheelScrollSensitivity, fastScrollSensitivity: n.fastScrollSensitivity, scrollByPage: n.scrollByPage - }, this.scrollable)), this.domNode.appendChild(this.scrollableElement.getDomNode()), e.appendChild(this.domNode), this.scrollableElement.onScroll(this.onScroll, this, this.disposables), this.disposables.add(z(this.rowsContainer, Rt.Change, (a) => this.onTouchChange(a))), this.disposables.add(z(this.scrollableElement.getDomNode(), "scroll", (a) => a.target.scrollTop = 0)), this.disposables.add(z(this.domNode, "dragover", (a) => this.onDragOver(this.toDragEvent(a)))), this.disposables.add(z(this.domNode, "drop", (a) => this.onDrop(this.toDragEvent(a)))), this.disposables.add(z(this.domNode, "dragleave", (a) => this.onDragLeave(this.toDragEvent(a)))), this.disposables.add(z(this.domNode, "dragend", (a) => this.onDragEnd(a))), this.setRowLineHeight = n.setRowLineHeight ?? Hl.setRowLineHeight, this.setRowHeight = n.setRowHeight ?? Hl.setRowHeight, this.supportDynamicHeights = n.supportDynamicHeights ?? Hl.supportDynamicHeights, this.dnd = n.dnd ?? this.disposables.add(Hl.dnd), this.layout((r = n.initialSize) == null ? void 0 : r.height, (l = n.initialSize) == null ? void 0 : l.width); + }, this.scrollable)), this.domNode.appendChild(this.scrollableElement.getDomNode()), e.appendChild(this.domNode), this.scrollableElement.onScroll(this.onScroll, this, this.disposables), this.disposables.add(z(this.rowsContainer, Jt.Change, (c) => this.onTouchChange(c))), this.disposables.add(z(this.scrollableElement.getDomNode(), "scroll", (c) => c.target.scrollTop = 0)), this.disposables.add(z(this.domNode, "dragover", (c) => this.onDragOver(this.toDragEvent(c)))), this.disposables.add(z(this.domNode, "drop", (c) => this.onDrop(this.toDragEvent(c)))), this.disposables.add(z(this.domNode, "dragleave", (c) => this.onDragLeave(this.toDragEvent(c)))), this.disposables.add(z(this.domNode, "dragend", (c) => this.onDragEnd(c))), this.setRowLineHeight = n.setRowLineHeight ?? Or.setRowLineHeight, this.setRowHeight = n.setRowHeight ?? Or.setRowHeight, this.supportDynamicHeights = n.supportDynamicHeights ?? Or.supportDynamicHeights, this.dnd = n.dnd ?? this.disposables.add(Or.dnd), this.layout((l = n.initialSize) == null ? void 0 : l.height, (r = n.initialSize) == null ? void 0 : r.width); } updateOptions(e) { e.paddingBottom !== void 0 && (this.paddingBottom = e.paddingBottom, this.scrollableElement.setScrollDimensions({ scrollHeight: this.scrollHeight })), e.smoothScrolling !== void 0 && this.scrollable.setSmoothScrollDuration(e.smoothScrolling ? 125 : 0), e.horizontalScrolling !== void 0 && (this.horizontalScrolling = e.horizontalScrolling); @@ -47025,7 +47025,7 @@ const yZ = class yZ { } } createRangeMap(e) { - return new Phe(e); + return new kue(e); } splice(e, t, i = []) { if (this.splicing) @@ -47038,54 +47038,54 @@ const yZ = class yZ { } } _splice(e, t, i = []) { - const n = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight), o = { start: e, end: e + t }, r = vn.intersect(n, o), l = /* @__PURE__ */ new Map(); - for (let L = r.end - 1; L >= r.start; L--) { - const x = this.items[L]; - if (x.dragStartDisposable.dispose(), x.checkedDisposable.dispose(), x.row) { - let Z = l.get(x.templateId); - Z || (Z = [], l.set(x.templateId, Z)); - const _ = this.renderers.get(x.templateId); - _ && _.disposeElement && _.disposeElement(x.element, L, x.row.templateData, x.size), Z.unshift(x.row); - } - x.row = null, x.stale = !0; - } - const a = { start: e + t, end: this.items.length }, c = vn.intersect(a, n), d = vn.relativeComplement(a, n), h = i.map((L) => ({ + const n = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight), o = { start: e, end: e + t }, l = Tn.intersect(n, o), r = /* @__PURE__ */ new Map(); + for (let X = l.end - 1; X >= l.start; X--) { + const L = this.items[X]; + if (L.dragStartDisposable.dispose(), L.checkedDisposable.dispose(), L.row) { + let S = r.get(L.templateId); + S || (S = [], r.set(L.templateId, S)); + const x = this.renderers.get(L.templateId); + x && x.disposeElement && x.disposeElement(L.element, X, L.row.templateData, L.size), S.unshift(L.row); + } + L.row = null, L.stale = !0; + } + const c = { start: e + t, end: this.items.length }, d = Tn.intersect(c, n), a = Tn.relativeComplement(c, n), h = i.map((X) => ({ id: String(this.itemId++), - element: L, - templateId: this.virtualDelegate.getTemplateId(L), - size: this.virtualDelegate.getHeight(L), + element: X, + templateId: this.virtualDelegate.getTemplateId(X), + size: this.virtualDelegate.getHeight(X), width: void 0, - hasDynamicHeight: !!this.virtualDelegate.hasDynamicHeight && this.virtualDelegate.hasDynamicHeight(L), + hasDynamicHeight: !!this.virtualDelegate.hasDynamicHeight && this.virtualDelegate.hasDynamicHeight(X), lastDynamicHeightWidth: void 0, row: null, uri: void 0, dropTarget: !1, - dragStartDisposable: R.None, - checkedDisposable: R.None, + dragStartDisposable: J.None, + checkedDisposable: J.None, stale: !1 })); let u; e === 0 && t >= this.items.length ? (this.rangeMap = this.createRangeMap(this.rangeMap.paddingTop), this.rangeMap.splice(0, 0, h), u = this.items, this.items = h) : (this.rangeMap.splice(e, t, h), u = this.items.splice(e, t, ...h)); - const g = i.length - t, m = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight), f = eT(c, g), b = vn.intersect(m, f); - for (let L = b.start; L < b.end; L++) - this.updateItemInDOM(this.items[L], L); - const y = vn.relativeComplement(f, m); - for (const L of y) - for (let x = L.start; x < L.end; x++) - this.removeItemFromDOM(x); - const w = d.map((L) => eT(L, g)), S = [{ start: e, end: e + i.length }, ...w].map((L) => vn.intersect(m, L)).reverse(); - for (const L of S) - for (let x = L.end - 1; x >= L.start; x--) { - const Z = this.items[x], _ = l.get(Z.templateId), v = _ == null ? void 0 : _.pop(); - this.insertItemInDOM(x, v); - } - for (const L of l.values()) - for (const x of L) - this.cache.release(x); - return this.eventuallyUpdateScrollDimensions(), this.supportDynamicHeights && this._rerender(this.scrollTop, this.renderHeight), u.map((L) => L.element); + const m = i.length - t, b = this.getRenderRange(this.lastRenderTop, this.lastRenderHeight), g = GT(d, m), Z = Tn.intersect(b, g); + for (let X = Z.start; X < Z.end; X++) + this.updateItemInDOM(this.items[X], X); + const f = Tn.relativeComplement(g, b); + for (const X of f) + for (let L = X.start; L < X.end; L++) + this.removeItemFromDOM(L); + const y = a.map((X) => GT(X, m)), G = [{ start: e, end: e + i.length }, ...y].map((X) => Tn.intersect(b, X)).reverse(); + for (const X of G) + for (let L = X.end - 1; L >= X.start; L--) { + const S = this.items[L], x = r.get(S.templateId), w = x == null ? void 0 : x.pop(); + this.insertItemInDOM(L, w); + } + for (const X of r.values()) + for (const L of X) + this.cache.release(L); + return this.eventuallyUpdateScrollDimensions(), this.supportDynamicHeights && this._rerender(this.scrollTop, this.renderHeight), u.map((X) => X.element); } eventuallyUpdateScrollDimensions() { - this._scrollHeight = this.contentHeight, this.rowsContainer.style.height = `${this._scrollHeight}px`, this.scrollableElementUpdateDisposable || (this.scrollableElementUpdateDisposable = po(xe(this.domNode), () => { + this._scrollHeight = this.contentHeight, this.rowsContainer.style.height = `${this._scrollHeight}px`, this.scrollableElementUpdateDisposable || (this.scrollableElementUpdateDisposable = Zo(Le(this.domNode), () => { this.scrollableElement.setScrollDimensions({ scrollHeight: this.scrollHeight }), this.updateScrollWidth(), this.scrollableElementUpdateDisposable = null; })); } @@ -47144,39 +47144,39 @@ const yZ = class yZ { } layout(e, t) { const i = { - height: typeof e == "number" ? e : Qq(this.domNode) + height: typeof e == "number" ? e : z$(this.domNode) }; this.scrollableElementUpdateDisposable && (this.scrollableElementUpdateDisposable.dispose(), this.scrollableElementUpdateDisposable = null, i.scrollHeight = this.scrollHeight), this.scrollableElement.setScrollDimensions(i), typeof t < "u" && (this.renderWidth = t, this.supportDynamicHeights && this._rerender(this.scrollTop, this.renderHeight)), this.horizontalScrolling && this.scrollableElement.setScrollDimensions({ - width: typeof t == "number" ? t : MN(this.domNode) + width: typeof t == "number" ? t : FC(this.domNode) }); } // Render - render(e, t, i, n, o, r = !1) { - const l = this.getRenderRange(t, i), a = vn.relativeComplement(l, e).reverse(), c = vn.relativeComplement(e, l); - if (r) { - const d = vn.intersect(e, l); - for (let h = d.start; h < d.end; h++) + render(e, t, i, n, o, l = !1) { + const r = this.getRenderRange(t, i), c = Tn.relativeComplement(r, e).reverse(), d = Tn.relativeComplement(e, r); + if (l) { + const a = Tn.intersect(e, r); + for (let h = a.start; h < a.end; h++) this.updateItemInDOM(this.items[h], h); } this.cache.transact(() => { - for (const d of c) - for (let h = d.start; h < d.end; h++) + for (const a of d) + for (let h = a.start; h < a.end; h++) this.removeItemFromDOM(h); - for (const d of a) - for (let h = d.end - 1; h >= d.start; h--) + for (const a of c) + for (let h = a.end - 1; h >= a.start; h--) this.insertItemInDOM(h); }), n !== void 0 && (this.rowsContainer.style.left = `-${n}px`), this.rowsContainer.style.top = `-${t}px`, this.horizontalScrolling && o !== void 0 && (this.rowsContainer.style.width = `${Math.max(o, this.renderWidth)}px`), this.lastRenderTop = t, this.lastRenderHeight = i; } // DOM operations insertItemInDOM(e, t) { - var a, c; + var c, d; const i = this.items[e]; if (!i.row) if (t) i.row = t, i.stale = !0; else { - const d = this.cache.alloc(i.templateId); - i.row = d.row, i.stale || (i.stale = d.isReusingConnectedDomNode); + const a = this.cache.alloc(i.templateId); + i.row = a.row, i.stale || (i.stale = a.isReusingConnectedDomNode); } const n = this.accessibilityProvider.getRole(i.element) || "listitem"; i.row.domNode.setAttribute("role", n); @@ -47184,26 +47184,26 @@ const yZ = class yZ { if (typeof o == "boolean") i.row.domNode.setAttribute("aria-checked", String(!!o)); else if (o) { - const d = (h) => i.row.domNode.setAttribute("aria-checked", String(!!h)); - d(o.value), i.checkedDisposable = o.onDidChange(() => d(o.value)); + const a = (h) => i.row.domNode.setAttribute("aria-checked", String(!!h)); + a(o.value), i.checkedDisposable = o.onDidChange(() => a(o.value)); } if (i.stale || !i.row.domNode.parentElement) { - const d = ((c = (a = this.items.at(e + 1)) == null ? void 0 : a.row) == null ? void 0 : c.domNode) ?? null; - (i.row.domNode.parentElement !== this.rowsContainer || i.row.domNode.nextElementSibling !== d) && this.rowsContainer.insertBefore(i.row.domNode, d), i.stale = !1; + const a = ((d = (c = this.items.at(e + 1)) == null ? void 0 : c.row) == null ? void 0 : d.domNode) ?? null; + (i.row.domNode.parentElement !== this.rowsContainer || i.row.domNode.nextElementSibling !== a) && this.rowsContainer.insertBefore(i.row.domNode, a), i.stale = !1; } this.updateItemInDOM(i, e); - const r = this.renderers.get(i.templateId); - if (!r) + const l = this.renderers.get(i.templateId); + if (!l) throw new Error(`No renderer found for template id ${i.templateId}`); - r == null || r.renderElement(i.element, e, i.row.templateData, i.size); - const l = this.dnd.getDragURI(i.element); - i.dragStartDisposable.dispose(), i.row.domNode.draggable = !!l, l && (i.dragStartDisposable = z(i.row.domNode, "dragstart", (d) => this.onDragStart(i.element, l, d))), this.horizontalScrolling && (this.measureItemWidth(i), this.eventuallyUpdateScrollWidth()); + l == null || l.renderElement(i.element, e, i.row.templateData, i.size); + const r = this.dnd.getDragURI(i.element); + i.dragStartDisposable.dispose(), i.row.domNode.draggable = !!r, r && (i.dragStartDisposable = z(i.row.domNode, "dragstart", (a) => this.onDragStart(i.element, r, a))), this.horizontalScrolling && (this.measureItemWidth(i), this.eventuallyUpdateScrollWidth()); } measureItemWidth(e) { if (!e.row || !e.row.domNode) return; - e.row.domNode.style.width = "fit-content", e.width = MN(e.row.domNode); - const t = xe(e.row.domNode).getComputedStyle(e.row.domNode); + e.row.domNode.style.width = "fit-content", e.width = FC(e.row.domNode); + const t = Le(e.row.domNode).getComputedStyle(e.row.domNode); t.paddingLeft && (e.width += parseFloat(t.paddingLeft)), t.paddingRight && (e.width += parseFloat(t.paddingRight)), e.row.domNode.style.width = ""; } updateItemInDOM(e, t) { @@ -47252,13 +47252,13 @@ const yZ = class yZ { return se.map(this.disposables.add(new et(this.domNode, "mouseout")).event, (e) => this.toMouseEvent(e), this.disposables); } get onContextMenu() { - return se.any(se.map(this.disposables.add(new et(this.domNode, "contextmenu")).event, (e) => this.toMouseEvent(e), this.disposables), se.map(this.disposables.add(new et(this.domNode, Rt.Contextmenu)).event, (e) => this.toGestureEvent(e), this.disposables)); + return se.any(se.map(this.disposables.add(new et(this.domNode, "contextmenu")).event, (e) => this.toMouseEvent(e), this.disposables), se.map(this.disposables.add(new et(this.domNode, Jt.Contextmenu)).event, (e) => this.toGestureEvent(e), this.disposables)); } get onTouchStart() { return se.map(this.disposables.add(new et(this.domNode, "touchstart")).event, (e) => this.toTouchEvent(e), this.disposables); } get onTap() { - return se.map(this.disposables.add(new et(this.rowsContainer, Rt.Tap)).event, (e) => this.toGestureEvent(e), this.disposables); + return se.map(this.disposables.add(new et(this.rowsContainer, Jt.Tap)).event, (e) => this.toGestureEvent(e), this.disposables); } toMouseEvent(e) { const t = this.getItemIndexFromEventTarget(e.target || null), i = typeof t > "u" ? void 0 : this.items[t], n = i && i.element; @@ -47289,60 +47289,60 @@ const yZ = class yZ { } // DND onDragStart(e, t, i) { - var o, r; + var o, l; if (!i.dataTransfer) return; const n = this.dnd.getDragElements(e); - if (i.dataTransfer.effectAllowed = "copyMove", i.dataTransfer.setData(f1.TEXT, t), i.dataTransfer.setDragImage) { - let l; - this.dnd.getDragLabel && (l = this.dnd.getDragLabel(n, i)), typeof l > "u" && (l = String(n.length)); - const a = ce(".monaco-drag-image"); - a.textContent = l, ((h) => { + if (i.dataTransfer.effectAllowed = "copyMove", i.dataTransfer.setData(CW.TEXT, t), i.dataTransfer.setDragImage) { + let r; + this.dnd.getDragLabel && (r = this.dnd.getDragLabel(n, i)), typeof r > "u" && (r = String(n.length)); + const c = de(".monaco-drag-image"); + c.textContent = r, ((h) => { for (; h && !h.classList.contains("monaco-workbench"); ) h = h.parentElement; return h || this.domNode.ownerDocument; - })(this.domNode).appendChild(a), i.dataTransfer.setDragImage(a, -10, -10), setTimeout(() => a.remove(), 0); + })(this.domNode).appendChild(c), i.dataTransfer.setDragImage(c, -10, -10), setTimeout(() => c.remove(), 0); } - this.domNode.classList.add("dragging"), this.currentDragData = new IC(n), mu.CurrentDragAndDropData = new Ohe(n), (r = (o = this.dnd).onDragStart) == null || r.call(o, this.currentDragData, i); + this.domNode.classList.add("dragging"), this.currentDragData = new FG(n), fu.CurrentDragAndDropData = new Jue(n), (l = (o = this.dnd).onDragStart) == null || l.call(o, this.currentDragData, i); } onDragOver(e) { - var o, r; - if (e.browserEvent.preventDefault(), this.onDragLeaveTimeout.dispose(), mu.CurrentDragAndDropData && mu.CurrentDragAndDropData.getData() === "vscode-ui" || (this.setupDragAndDropScrollTopAnimation(e.browserEvent), !e.browserEvent.dataTransfer)) + var o, l; + if (e.browserEvent.preventDefault(), this.onDragLeaveTimeout.dispose(), fu.CurrentDragAndDropData && fu.CurrentDragAndDropData.getData() === "vscode-ui" || (this.setupDragAndDropScrollTopAnimation(e.browserEvent), !e.browserEvent.dataTransfer)) return !1; if (!this.currentDragData) - if (mu.CurrentDragAndDropData) - this.currentDragData = mu.CurrentDragAndDropData; + if (fu.CurrentDragAndDropData) + this.currentDragData = fu.CurrentDragAndDropData; else { if (!e.browserEvent.dataTransfer.types) return !1; - this.currentDragData = new Hhe(); + this.currentDragData = new Hue(); } const t = this.dnd.onDragOver(this.currentDragData, e.element, e.index, e.sector, e.browserEvent); if (this.canDrop = typeof t == "boolean" ? t : t.accept, !this.canDrop) return this.currentDragFeedback = void 0, this.currentDragFeedbackDisposable.dispose(), !1; e.browserEvent.dataTransfer.dropEffect = typeof t != "boolean" && ((o = t.effect) == null ? void 0 : o.type) === 0 ? "copy" : "move"; let i; - typeof t != "boolean" && t.feedback ? i = t.feedback : typeof e.index > "u" ? i = [-1] : i = [e.index], i = Oc(i).filter((l) => l >= -1 && l < this.length).sort((l, a) => l - a), i = i[0] === -1 ? [-1] : i; + typeof t != "boolean" && t.feedback ? i = t.feedback : typeof e.index > "u" ? i = [-1] : i = [e.index], i = Qd(i).filter((r) => r >= -1 && r < this.length).sort((r, c) => r - c), i = i[0] === -1 ? [-1] : i; let n = typeof t != "boolean" && t.effect && t.effect.position ? t.effect.position : "drop-target"; - if (Jhe(this.currentDragFeedback, i) && this.currentDragFeedbackPosition === n) + if (Eue(this.currentDragFeedback, i) && this.currentDragFeedbackPosition === n) return !0; if (this.currentDragFeedback = i, this.currentDragFeedbackPosition = n, this.currentDragFeedbackDisposable.dispose(), i[0] === -1) - this.domNode.classList.add(n), this.rowsContainer.classList.add(n), this.currentDragFeedbackDisposable = Ce(() => { + this.domNode.classList.add(n), this.rowsContainer.classList.add(n), this.currentDragFeedbackDisposable = We(() => { this.domNode.classList.remove(n), this.rowsContainer.classList.remove(n); }); else { if (i.length > 1 && n !== "drop-target") throw new Error("Can't use multiple feedbacks with position different than 'over'"); n === "drop-target-after" && i[0] < this.length - 1 && (i[0] += 1, n = "drop-target-before"); - for (const l of i) { - const a = this.items[l]; - a.dropTarget = !0, (r = a.row) == null || r.domNode.classList.add(n); - } - this.currentDragFeedbackDisposable = Ce(() => { - var l; - for (const a of i) { - const c = this.items[a]; - c.dropTarget = !1, (l = c.row) == null || l.domNode.classList.remove(n); + for (const r of i) { + const c = this.items[r]; + c.dropTarget = !0, (l = c.row) == null || l.domNode.classList.add(n); + } + this.currentDragFeedbackDisposable = We(() => { + var r; + for (const c of i) { + const d = this.items[c]; + d.dropTarget = !1, (r = d.row) == null || r.domNode.classList.remove(n); } }); } @@ -47350,28 +47350,28 @@ const yZ = class yZ { } onDragLeave(e) { var t, i; - this.onDragLeaveTimeout.dispose(), this.onDragLeaveTimeout = _h(() => this.clearDragOverFeedback(), 100, this.disposables), this.currentDragData && ((i = (t = this.dnd).onDragLeave) == null || i.call(t, this.currentDragData, e.element, e.index, e.browserEvent)); + this.onDragLeaveTimeout.dispose(), this.onDragLeaveTimeout = wh(() => this.clearDragOverFeedback(), 100, this.disposables), this.currentDragData && ((i = (t = this.dnd).onDragLeave) == null || i.call(t, this.currentDragData, e.element, e.index, e.browserEvent)); } onDrop(e) { if (!this.canDrop) return; const t = this.currentDragData; - this.teardownDragAndDropScrollTopAnimation(), this.clearDragOverFeedback(), this.domNode.classList.remove("dragging"), this.currentDragData = void 0, mu.CurrentDragAndDropData = void 0, !(!t || !e.browserEvent.dataTransfer) && (e.browserEvent.preventDefault(), t.update(e.browserEvent.dataTransfer), this.dnd.drop(t, e.element, e.index, e.sector, e.browserEvent)); + this.teardownDragAndDropScrollTopAnimation(), this.clearDragOverFeedback(), this.domNode.classList.remove("dragging"), this.currentDragData = void 0, fu.CurrentDragAndDropData = void 0, !(!t || !e.browserEvent.dataTransfer) && (e.browserEvent.preventDefault(), t.update(e.browserEvent.dataTransfer), this.dnd.drop(t, e.element, e.index, e.sector, e.browserEvent)); } onDragEnd(e) { var t, i; - this.canDrop = !1, this.teardownDragAndDropScrollTopAnimation(), this.clearDragOverFeedback(), this.domNode.classList.remove("dragging"), this.currentDragData = void 0, mu.CurrentDragAndDropData = void 0, (i = (t = this.dnd).onDragEnd) == null || i.call(t, e); + this.canDrop = !1, this.teardownDragAndDropScrollTopAnimation(), this.clearDragOverFeedback(), this.domNode.classList.remove("dragging"), this.currentDragData = void 0, fu.CurrentDragAndDropData = void 0, (i = (t = this.dnd).onDragEnd) == null || i.call(t, e); } clearDragOverFeedback() { - this.currentDragFeedback = void 0, this.currentDragFeedbackPosition = void 0, this.currentDragFeedbackDisposable.dispose(), this.currentDragFeedbackDisposable = R.None; + this.currentDragFeedback = void 0, this.currentDragFeedbackPosition = void 0, this.currentDragFeedbackDisposable.dispose(), this.currentDragFeedbackDisposable = J.None; } // DND scroll top animation setupDragAndDropScrollTopAnimation(e) { if (!this.dragOverAnimationDisposable) { - const t = eJ(this.domNode).top; - this.dragOverAnimationDisposable = c$(xe(this.domNode), this.animateDragAndDropScrollTop.bind(this, t)); + const t = vB(this.domNode).top; + this.dragOverAnimationDisposable = tee(Le(this.domNode), this.animateDragAndDropScrollTop.bind(this, t)); } - this.dragOverAnimationStopDisposable.dispose(), this.dragOverAnimationStopDisposable = _h(() => { + this.dragOverAnimationStopDisposable.dispose(), this.dragOverAnimationStopDisposable = wh(() => { this.dragOverAnimationDisposable && (this.dragOverAnimationDisposable.dispose(), this.dragOverAnimationDisposable = void 0); }, 1e3, this.disposables), this.dragOverMouseY = e.pageY; } @@ -47389,12 +47389,12 @@ const yZ = class yZ { if (t === void 0) return; const i = e.offsetY / this.items[t].size, n = Math.floor(i / 0.25); - return os(n, 0, 3); + return rs(n, 0, 3); } getItemIndexFromEventTarget(e) { const t = this.scrollableElement.getDomNode(); let i = e; - for (; (Ki(i) || i$(i)) && i !== this.rowsContainer && t.contains(i); ) { + for (; (Oi(i) || _$(i)) && i !== this.rowsContainer && t.contains(i); ) { const n = i.getAttribute("data-index"); if (n) { const o = Number(n); @@ -47416,31 +47416,31 @@ const yZ = class yZ { */ _rerender(e, t, i) { const n = this.getRenderRange(e, t); - let o, r; - e === this.elementTop(n.start) ? (o = n.start, r = 0) : n.end - n.start > 1 && (o = n.start + 1, r = this.elementTop(o) - e); - let l = 0; + let o, l; + e === this.elementTop(n.start) ? (o = n.start, l = 0) : n.end - n.start > 1 && (o = n.start + 1, l = this.elementTop(o) - e); + let r = 0; for (; ; ) { - const a = this.getRenderRange(e, t); - let c = !1; - for (let d = a.start; d < a.end; d++) { - const h = this.probeDynamicHeight(d); - h !== 0 && this.rangeMap.splice(d, 1, [this.items[d]]), l += h, c = c || h !== 0; - } - if (!c) { - l !== 0 && this.eventuallyUpdateScrollDimensions(); - const d = vn.relativeComplement(n, a); - for (const u of d) - for (let g = u.start; g < u.end; g++) - this.items[g].row && this.removeItemFromDOM(g); - const h = vn.relativeComplement(a, n).reverse(); + const c = this.getRenderRange(e, t); + let d = !1; + for (let a = c.start; a < c.end; a++) { + const h = this.probeDynamicHeight(a); + h !== 0 && this.rangeMap.splice(a, 1, [this.items[a]]), r += h, d = d || h !== 0; + } + if (!d) { + r !== 0 && this.eventuallyUpdateScrollDimensions(); + const a = Tn.relativeComplement(n, c); + for (const u of a) + for (let m = u.start; m < u.end; m++) + this.items[m].row && this.removeItemFromDOM(m); + const h = Tn.relativeComplement(c, n).reverse(); for (const u of h) - for (let g = u.end - 1; g >= u.start; g--) - this.insertItemInDOM(g); - for (let u = a.start; u < a.end; u++) + for (let m = u.end - 1; m >= u.start; m--) + this.insertItemInDOM(m); + for (let u = c.start; u < c.end; u++) this.items[u].row && this.updateItemInDOM(this.items[u], u); if (typeof o == "number") { - const u = this.scrollable.getFutureScrollPosition().scrollTop - e, g = this.elementTop(o) - r + u; - this.setScrollTop(g, i); + const u = this.scrollable.getFutureScrollPosition().scrollTop - e, m = this.elementTop(o) - l + u; + this.setScrollTop(m, i); } this._onDidChangeContentHeight.fire(this.contentHeight); return; @@ -47448,26 +47448,26 @@ const yZ = class yZ { } } probeDynamicHeight(e) { - var r, l, a; + var l, r, c; const t = this.items[e]; if (this.virtualDelegate.getDynamicHeight) { - const c = this.virtualDelegate.getDynamicHeight(t.element); - if (c !== null) { - const d = t.size; - return t.size = c, t.lastDynamicHeightWidth = this.renderWidth, c - d; + const d = this.virtualDelegate.getDynamicHeight(t.element); + if (d !== null) { + const a = t.size; + return t.size = d, t.lastDynamicHeightWidth = this.renderWidth, d - a; } } if (!t.hasDynamicHeight || t.lastDynamicHeightWidth === this.renderWidth || this.virtualDelegate.hasDynamicHeight && !this.virtualDelegate.hasDynamicHeight(t.element)) return 0; const i = t.size; if (t.row) - return t.row.domNode.style.height = "", t.size = t.row.domNode.offsetHeight, t.size === 0 && !Ji(t.row.domNode, xe(t.row.domNode).document.body) && console.warn("Measuring item node that is not in DOM! Add ListView to the DOM before measuring row height!", new Error().stack), t.lastDynamicHeightWidth = this.renderWidth, t.size - i; + return t.row.domNode.style.height = "", t.size = t.row.domNode.offsetHeight, t.size === 0 && !_i(t.row.domNode, Le(t.row.domNode).document.body) && console.warn("Measuring item node that is not in DOM! Add ListView to the DOM before measuring row height!", new Error().stack), t.lastDynamicHeightWidth = this.renderWidth, t.size - i; const { row: n } = this.cache.alloc(t.templateId); n.domNode.style.height = "", this.rowsContainer.appendChild(n.domNode); const o = this.renderers.get(t.templateId); if (!o) - throw new mt("Missing renderer for templateId: " + t.templateId); - return o.renderElement(t.element, e, n.templateData, void 0), t.size = n.domNode.offsetHeight, (r = o.disposeElement) == null || r.call(o, t.element, e, n.templateData, void 0), (a = (l = this.virtualDelegate).setDynamicHeight) == null || a.call(l, t.element, t.size), t.lastDynamicHeightWidth = this.renderWidth, n.domNode.remove(), this.cache.release(n), t.size - i; + throw new bt("Missing renderer for templateId: " + t.templateId); + return o.renderElement(t.element, e, n.templateData, void 0), t.size = n.domNode.offsetHeight, (l = o.disposeElement) == null || l.call(o, t.element, e, n.templateData, void 0), (c = (r = this.virtualDelegate).setDynamicHeight) == null || c.call(r, t.element, t.size), t.lastDynamicHeightWidth = this.renderWidth, n.domNode.remove(), this.cache.release(n), t.size - i; } getElementDomId(e) { return `${this.domId}_${e}`; @@ -47483,42 +47483,42 @@ const yZ = class yZ { this.items = [], (t = this.domNode) == null || t.remove(), (i = this.dragOverAnimationDisposable) == null || i.dispose(), this.disposables.dispose(); } }; -yZ.InstanceCount = 0; -let Kr = yZ; -sd([ - Zi -], Kr.prototype, "onMouseClick", null); -sd([ - Zi -], Kr.prototype, "onMouseDblClick", null); -sd([ - Zi -], Kr.prototype, "onMouseMiddleClick", null); -sd([ - Zi -], Kr.prototype, "onMouseDown", null); -sd([ - Zi -], Kr.prototype, "onMouseOver", null); -sd([ - Zi -], Kr.prototype, "onMouseOut", null); -sd([ - Zi -], Kr.prototype, "onContextMenu", null); -sd([ - Zi -], Kr.prototype, "onTouchStart", null); -sd([ - Zi -], Kr.prototype, "onTap", null); -var Qh = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +M2.InstanceCount = 0; +let ql = M2; +ca([ + xi +], ql.prototype, "onMouseClick", null); +ca([ + xi +], ql.prototype, "onMouseDblClick", null); +ca([ + xi +], ql.prototype, "onMouseMiddleClick", null); +ca([ + xi +], ql.prototype, "onMouseDown", null); +ca([ + xi +], ql.prototype, "onMouseOver", null); +ca([ + xi +], ql.prototype, "onMouseOut", null); +ca([ + xi +], ql.prototype, "onContextMenu", null); +ca([ + xi +], ql.prototype, "onTouchStart", null); +ca([ + xi +], ql.prototype, "onTap", null); +var eu = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; }; -class Khe { +class Fue { constructor(e) { this.trait = e, this.renderedElements = []; } @@ -47557,26 +47557,26 @@ class Khe { t < 0 || this.renderedElements.splice(t, 1); } } -let qA = class { +let mL = class { get name() { return this._trait; } get renderer() { - return new Khe(this); + return new Fue(this); } constructor(e) { this._trait = e, this.indexes = [], this.sortedIndexes = [], this._onChange = new k(), this.onChange = this._onChange.event; } splice(e, t, i) { - const n = i.length - t, o = e + t, r = []; - let l = 0; - for (; l < this.sortedIndexes.length && this.sortedIndexes[l] < e; ) - r.push(this.sortedIndexes[l++]); - for (let a = 0; a < i.length; a++) - i[a] && r.push(a + e); - for (; l < this.sortedIndexes.length && this.sortedIndexes[l] >= o; ) - r.push(this.sortedIndexes[l++] + n); - this.renderer.splice(e, t, i.length), this._set(r, r); + const n = i.length - t, o = e + t, l = []; + let r = 0; + for (; r < this.sortedIndexes.length && this.sortedIndexes[r] < e; ) + l.push(this.sortedIndexes[r++]); + for (let c = 0; c < i.length; c++) + i[c] && l.push(c + e); + for (; r < this.sortedIndexes.length && this.sortedIndexes[r] >= o; ) + l.push(this.sortedIndexes[r++] + n); + this.renderer.splice(e, t, i.length), this._set(l, l); } renderIndex(e, t) { t.classList.toggle(this._trait, this.contains(e)); @@ -47591,28 +47591,28 @@ let qA = class { * @return The old indexes which had this trait. */ set(e, t) { - return this._set(e, [...e].sort(lz), t); + return this._set(e, [...e].sort(Tz), t); } _set(e, t, i) { const n = this.indexes, o = this.sortedIndexes; this.indexes = e, this.sortedIndexes = t; - const r = tT(o, e); - return this.renderer.renderIndexes(r), this._onChange.fire({ indexes: e, browserEvent: i }), n; + const l = XT(o, e); + return this.renderer.renderIndexes(l), this._onChange.fire({ indexes: e, browserEvent: i }), n; } get() { return this.indexes; } contains(e) { - return Rw(this.sortedIndexes, e, lz) >= 0; + return Qy(this.sortedIndexes, e, Tz) >= 0; } dispose() { - Wt(this._onChange); + Nt(this._onChange); } }; -Qh([ - Zi -], qA.prototype, "renderer", null); -class Qhe extends qA { +eu([ + xi +], mL.prototype, "renderer", null); +class zue extends mL { constructor(e) { super("selected"), this.setAriaSelected = e; } @@ -47620,50 +47620,50 @@ class Qhe extends qA { super.renderIndex(e, t), this.setAriaSelected && (this.contains(e) ? t.setAttribute("aria-selected", "true") : t.setAttribute("aria-selected", "false")); } } -class gW { +class RR { constructor(e, t, i) { this.trait = e, this.view = t, this.identityProvider = i; } splice(e, t, i) { if (!this.identityProvider) return this.trait.splice(e, t, new Array(i.length).fill(!1)); - const n = this.trait.get().map((l) => this.identityProvider.getId(this.view.element(l)).toString()); + const n = this.trait.get().map((r) => this.identityProvider.getId(this.view.element(r)).toString()); if (n.length === 0) return this.trait.splice(e, t, new Array(i.length).fill(!1)); - const o = new Set(n), r = i.map((l) => o.has(this.identityProvider.getId(l).toString())); - this.trait.splice(e, t, r); + const o = new Set(n), l = i.map((r) => o.has(this.identityProvider.getId(r).toString())); + this.trait.splice(e, t, l); } } -function nh(s) { +function rh(s) { return s.tagName === "INPUT" || s.tagName === "TEXTAREA"; } -function NC(s, e) { - return s.classList.contains(e) ? !0 : s.classList.contains("monaco-list") || !s.parentElement ? !1 : NC(s.parentElement, e); +function zG(s, e) { + return s.classList.contains(e) ? !0 : s.classList.contains("monaco-list") || !s.parentElement ? !1 : zG(s.parentElement, e); } -function uy(s) { - return NC(s, "monaco-editor"); +function Xf(s) { + return zG(s, "monaco-editor"); } -function jhe(s) { - return NC(s, "monaco-custom-toggle"); +function Aue(s) { + return zG(s, "monaco-custom-toggle"); } -function qhe(s) { - return NC(s, "action-item"); +function Kue(s) { + return zG(s, "action-item"); } -function Oy(s) { - return NC(s, "monaco-tree-sticky-row"); +function iy(s) { + return zG(s, "monaco-tree-sticky-row"); } -function y1(s) { +function NW(s) { return s.classList.contains("monaco-tree-sticky-container"); } -function BK(s) { - return s.tagName === "A" && s.classList.contains("monaco-button") || s.tagName === "DIV" && s.classList.contains("monaco-button-dropdown") ? !0 : s.classList.contains("monaco-list") || !s.parentElement ? !1 : BK(s.parentElement); +function SO(s) { + return s.tagName === "A" && s.classList.contains("monaco-button") || s.tagName === "DIV" && s.classList.contains("monaco-button-dropdown") ? !0 : s.classList.contains("monaco-list") || !s.parentElement ? !1 : SO(s.parentElement); } -class OK { +class xO { get onKeyDown() { - return se.chain(this.disposables.add(new et(this.view.domNode, "keydown")).event, (e) => e.filter((t) => !nh(t.target)).map((t) => new Vt(t))); + return se.chain(this.disposables.add(new et(this.view.domNode, "keydown")).event, (e) => e.filter((t) => !rh(t.target)).map((t) => new Yt(t))); } constructor(e, t, i) { - this.list = e, this.view = t, this.disposables = new U(), this.multipleSelectionDisposables = new U(), this.multipleSelectionSupport = i.multipleSelectionSupport, this.disposables.add(this.onKeyDown((n) => { + this.list = e, this.view = t, this.disposables = new _(), this.multipleSelectionDisposables = new _(), this.multipleSelectionSupport = i.multipleSelectionSupport, this.disposables.add(this.onKeyDown((n) => { switch (n.keyCode) { case 3: return this.onEnter(n); @@ -47709,7 +47709,7 @@ class OK { this.list.setAnchor(t), this.list.reveal(t), this.view.domNode.focus(); } onCtrlA(e) { - e.preventDefault(), e.stopPropagation(), this.list.setSelection(Ns(this.list.length), e.browserEvent), this.list.setAnchor(void 0), this.view.domNode.focus(); + e.preventDefault(), e.stopPropagation(), this.list.setSelection(ws(this.list.length), e.browserEvent), this.list.setAnchor(void 0), this.view.domNode.focus(); } onEscape(e) { this.list.getSelection().length && (e.preventDefault(), e.stopPropagation(), this.list.setSelection([], e.browserEvent), this.list.setAnchor(void 0), this.view.domNode.focus()); @@ -47718,35 +47718,35 @@ class OK { this.disposables.dispose(), this.multipleSelectionDisposables.dispose(); } } -Qh([ - Zi -], OK.prototype, "onKeyDown", null); -var ba; +eu([ + xi +], xO.prototype, "onKeyDown", null); +var Gc; (function(s) { s[s.Automatic = 0] = "Automatic", s[s.Trigger = 1] = "Trigger"; -})(ba || (ba = {})); -var Yp; +})(Gc || (Gc = {})); +var Bp; (function(s) { s[s.Idle = 0] = "Idle", s[s.Typing = 1] = "Typing"; -})(Yp || (Yp = {})); -const $he = new class { +})(Bp || (Bp = {})); +const Uue = new class { mightProducePrintableCharacter(s) { return s.ctrlKey || s.metaKey || s.altKey ? !1 : s.keyCode >= 31 && s.keyCode <= 56 || s.keyCode >= 21 && s.keyCode <= 30 || s.keyCode >= 98 && s.keyCode <= 107 || s.keyCode >= 85 && s.keyCode <= 95; } }(); -class eue { +class Pue { constructor(e, t, i, n, o) { - this.list = e, this.view = t, this.keyboardNavigationLabelProvider = i, this.keyboardNavigationEventFilter = n, this.delegate = o, this.enabled = !1, this.state = Yp.Idle, this.mode = ba.Automatic, this.triggered = !1, this.previouslyFocused = -1, this.enabledDisposables = new U(), this.disposables = new U(), this.updateOptions(e.options); + this.list = e, this.view = t, this.keyboardNavigationLabelProvider = i, this.keyboardNavigationEventFilter = n, this.delegate = o, this.enabled = !1, this.state = Bp.Idle, this.mode = Gc.Automatic, this.triggered = !1, this.previouslyFocused = -1, this.enabledDisposables = new _(), this.disposables = new _(), this.updateOptions(e.options); } updateOptions(e) { - e.typeNavigationEnabled ?? !0 ? this.enable() : this.disable(), this.mode = e.typeNavigationMode ?? ba.Automatic; + e.typeNavigationEnabled ?? !0 ? this.enable() : this.disable(), this.mode = e.typeNavigationMode ?? Gc.Automatic; } enable() { if (this.enabled) return; let e = !1; - const t = se.chain(this.enabledDisposables.add(new et(this.view.domNode, "keydown")).event, (o) => o.filter((r) => !nh(r.target)).filter(() => this.mode === ba.Automatic || this.triggered).map((r) => new Vt(r)).filter((r) => e || this.keyboardNavigationEventFilter(r)).filter((r) => this.delegate.mightProducePrintableCharacter(r)).forEach((r) => tt.stop(r, !0)).map((r) => r.browserEvent.key)), i = se.debounce(t, () => null, 800, void 0, void 0, void 0, this.enabledDisposables); - se.reduce(se.any(t, i), (o, r) => r === null ? null : (o || "") + r, void 0, this.enabledDisposables)(this.onInput, this, this.enabledDisposables), i(this.onClear, this, this.enabledDisposables), t(() => e = !0, void 0, this.enabledDisposables), i(() => e = !1, void 0, this.enabledDisposables), this.enabled = !0, this.triggered = !1; + const t = se.chain(this.enabledDisposables.add(new et(this.view.domNode, "keydown")).event, (o) => o.filter((l) => !rh(l.target)).filter(() => this.mode === Gc.Automatic || this.triggered).map((l) => new Yt(l)).filter((l) => e || this.keyboardNavigationEventFilter(l)).filter((l) => this.delegate.mightProducePrintableCharacter(l)).forEach((l) => tt.stop(l, !0)).map((l) => l.browserEvent.key)), i = se.debounce(t, () => null, 800, void 0, void 0, void 0, this.enabledDisposables); + se.reduce(se.any(t, i), (o, l) => l === null ? null : (o || "") + l, void 0, this.enabledDisposables)(this.onInput, this, this.enabledDisposables), i(this.onClear, this, this.enabledDisposables), t(() => e = !0, void 0, this.enabledDisposables), i(() => e = !1, void 0, this.enabledDisposables), this.enabled = !0, this.triggered = !1; } disable() { this.enabled && (this.enabledDisposables.clear(), this.enabled = !1, this.triggered = !1); @@ -47756,33 +47756,33 @@ class eue { const e = this.list.getFocus(); if (e.length > 0 && e[0] === this.previouslyFocused) { const i = (t = this.list.options.accessibilityProvider) == null ? void 0 : t.getAriaLabel(this.list.element(e[0])); - typeof i == "string" ? bs(i) : i && bs(i.get()); + typeof i == "string" ? ys(i) : i && ys(i.get()); } this.previouslyFocused = -1; } onInput(e) { if (!e) { - this.state = Yp.Idle, this.triggered = !1; + this.state = Bp.Idle, this.triggered = !1; return; } - const t = this.list.getFocus(), i = t.length > 0 ? t[0] : 0, n = this.state === Yp.Idle ? 1 : 0; - this.state = Yp.Typing; + const t = this.list.getFocus(), i = t.length > 0 ? t[0] : 0, n = this.state === Bp.Idle ? 1 : 0; + this.state = Bp.Typing; for (let o = 0; o < this.list.length; o++) { - const r = (i + o + n) % this.list.length, l = this.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(this.view.element(r)), a = l && l.toString(); + const l = (i + o + n) % this.list.length, r = this.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(this.view.element(l)), c = r && r.toString(); if (this.list.options.typeNavigationEnabled) { - if (typeof a < "u") { - if (QA(e, a)) { - this.previouslyFocused = i, this.list.setFocus([r]), this.list.reveal(r); + if (typeof c < "u") { + if (hL(e, c)) { + this.previouslyFocused = i, this.list.setFocus([l]), this.list.reveal(l); return; } - const c = Hde(e, a); - if (c && c[0].end - c[0].start > 1 && c.length === 1) { - this.previouslyFocused = i, this.list.setFocus([r]), this.list.reveal(r); + const d = Hhe(e, c); + if (d && d[0].end - d[0].start > 1 && d.length === 1) { + this.previouslyFocused = i, this.list.setFocus([l]), this.list.reveal(l); return; } } - } else if (typeof a > "u" || QA(e, a)) { - this.previouslyFocused = i, this.list.setFocus([r]), this.list.reveal(r); + } else if (typeof c > "u" || hL(e, c)) { + this.previouslyFocused = i, this.list.setFocus([l]), this.list.reveal(l); return; } } @@ -47791,11 +47791,11 @@ class eue { this.disable(), this.enabledDisposables.dispose(), this.disposables.dispose(); } } -class tue { +class Bue { constructor(e, t) { - this.list = e, this.view = t, this.disposables = new U(); - const i = se.chain(this.disposables.add(new et(t.domNode, "keydown")).event, (o) => o.filter((r) => !nh(r.target)).map((r) => new Vt(r))); - se.chain(i, (o) => o.filter((r) => r.keyCode === 2 && !r.ctrlKey && !r.metaKey && !r.shiftKey && !r.altKey))(this.onTab, this, this.disposables); + this.list = e, this.view = t, this.disposables = new _(); + const i = se.chain(this.disposables.add(new et(t.domNode, "keydown")).event, (o) => o.filter((l) => !rh(l.target)).map((l) => new Yt(l))); + se.chain(i, (o) => o.filter((l) => l.keyCode === 2 && !l.ctrlKey && !l.metaKey && !l.shiftKey && !l.altKey))(this.onTab, this, this.disposables); } onTab(e) { if (e.target !== this.view.domNode) @@ -47807,34 +47807,34 @@ class tue { if (!i) return; const n = i.querySelector("[tabIndex]"); - if (!n || !Ki(n) || n.tabIndex === -1) + if (!n || !Oi(n) || n.tabIndex === -1) return; - const o = xe(n).getComputedStyle(n); + const o = Le(n).getComputedStyle(n); o.visibility === "hidden" || o.display === "none" || (e.preventDefault(), e.stopPropagation(), n.focus()); } dispose() { this.disposables.dispose(); } } -function HK(s) { +function CO(s) { return qe ? s.browserEvent.metaKey : s.browserEvent.ctrlKey; } -function JK(s) { +function RO(s) { return s.browserEvent.shiftKey; } -function iue(s) { - return dE(s) && s.button === 2; +function _ue(s) { + return kv(s) && s.button === 2; } -const rz = { - isSelectionSingleChangeEvent: HK, - isSelectionRangeChangeEvent: JK +const wz = { + isSelectionSingleChangeEvent: CO, + isSelectionRangeChangeEvent: RO }; -class UK { +class NO { constructor(e) { - this.list = e, this.disposables = new U(), this._onPointer = new k(), this.onPointer = this._onPointer.event, e.options.multipleSelectionSupport !== !1 && (this.multipleSelectionController = this.list.options.multipleSelectionController || rz), this.mouseSupport = typeof e.options.mouseSupport > "u" || !!e.options.mouseSupport, this.mouseSupport && (e.onMouseDown(this.onMouseDown, this, this.disposables), e.onContextMenu(this.onContextMenu, this, this.disposables), e.onMouseDblClick(this.onDoubleClick, this, this.disposables), e.onTouchStart(this.onMouseDown, this, this.disposables), this.disposables.add(Rn.addTarget(e.getHTMLElement()))), se.any(e.onMouseClick, e.onMouseMiddleClick, e.onTap)(this.onViewPointer, this, this.disposables); + this.list = e, this.disposables = new _(), this._onPointer = new k(), this.onPointer = this._onPointer.event, e.options.multipleSelectionSupport !== !1 && (this.multipleSelectionController = this.list.options.multipleSelectionController || wz), this.mouseSupport = typeof e.options.mouseSupport > "u" || !!e.options.mouseSupport, this.mouseSupport && (e.onMouseDown(this.onMouseDown, this, this.disposables), e.onContextMenu(this.onContextMenu, this, this.disposables), e.onMouseDblClick(this.onDoubleClick, this, this.disposables), e.onTouchStart(this.onMouseDown, this, this.disposables), this.disposables.add(En.addTarget(e.getHTMLElement()))), se.any(e.onMouseClick, e.onMouseMiddleClick, e.onTap)(this.onViewPointer, this, this.disposables); } updateOptions(e) { - e.multipleSelectionSupport !== void 0 && (this.multipleSelectionController = void 0, e.multipleSelectionSupport && (this.multipleSelectionController = this.list.options.multipleSelectionController || rz)); + e.multipleSelectionSupport !== void 0 && (this.multipleSelectionController = void 0, e.multipleSelectionSupport && (this.multipleSelectionController = this.list.options.multipleSelectionController || wz)); } isSelectionSingleChangeEvent(e) { return this.multipleSelectionController ? this.multipleSelectionController.isSelectionSingleChangeEvent(e) : !1; @@ -47846,16 +47846,16 @@ class UK { return this.isSelectionSingleChangeEvent(e) || this.isSelectionRangeChangeEvent(e); } onMouseDown(e) { - uy(e.browserEvent.target) || _n() !== e.browserEvent.target && this.list.domFocus(); + Xf(e.browserEvent.target) || Cn() !== e.browserEvent.target && this.list.domFocus(); } onContextMenu(e) { - if (nh(e.browserEvent.target) || uy(e.browserEvent.target)) + if (rh(e.browserEvent.target) || Xf(e.browserEvent.target)) return; const t = typeof e.index > "u" ? [] : [e.index]; this.list.setFocus(t, e.browserEvent); } onViewPointer(e) { - if (!this.mouseSupport || nh(e.browserEvent.target) || uy(e.browserEvent.target) || e.browserEvent.isHandledByList) + if (!this.mouseSupport || rh(e.browserEvent.target) || Xf(e.browserEvent.target) || e.browserEvent.isHandledByList) return; e.browserEvent.isHandledByList = !0; const t = e.index; @@ -47865,10 +47865,10 @@ class UK { } if (this.isSelectionChangeEvent(e)) return this.changeSelection(e); - this.list.setFocus([t], e.browserEvent), this.list.setAnchor(t), iue(e.browserEvent) || this.list.setSelection([t], e.browserEvent), this._onPointer.fire(e); + this.list.setFocus([t], e.browserEvent), this.list.setAnchor(t), _ue(e.browserEvent) || this.list.setSelection([t], e.browserEvent), this._onPointer.fire(e); } onDoubleClick(e) { - if (nh(e.browserEvent.target) || uy(e.browserEvent.target) || this.isSelectionChangeEvent(e) || e.browserEvent.isHandledByList) + if (rh(e.browserEvent.target) || Xf(e.browserEvent.target) || this.isSelectionChangeEvent(e) || e.browserEvent.isHandledByList) return; e.browserEvent.isHandledByList = !0; const t = this.list.getFocus(); @@ -47879,13 +47879,13 @@ class UK { let i = this.list.getAnchor(); if (this.isSelectionRangeChangeEvent(e)) { typeof i > "u" && (i = this.list.getFocus()[0] ?? t, this.list.setAnchor(i)); - const n = Math.min(i, t), o = Math.max(i, t), r = Ns(n, o + 1), l = this.list.getSelection(), a = oue(tT(l, [i]), i); - if (a.length === 0) + const n = Math.min(i, t), o = Math.max(i, t), l = ws(n, o + 1), r = this.list.getSelection(), c = jue(XT(r, [i]), i); + if (c.length === 0) return; - const c = tT(r, rue(l, a)); - this.list.setSelection(c, e.browserEvent), this.list.setFocus([t], e.browserEvent); + const d = XT(l, que(r, c)); + this.list.setSelection(d, e.browserEvent), this.list.setFocus([t], e.browserEvent); } else if (this.isSelectionSingleChangeEvent(e)) { - const n = this.list.getSelection(), o = n.filter((r) => r !== t); + const n = this.list.getSelection(), o = n.filter((l) => l !== t); this.list.setFocus([t]), this.list.setAnchor(t), n.length === o.length ? this.list.setSelection([...o, t], e.browserEvent) : this.list.setSelection(o, e.browserEvent); } } @@ -47893,7 +47893,7 @@ class UK { this.disposables.dispose(); } } -class KK { +class wO { constructor(e, t) { this.styleElement = e, this.selectorSuffix = t; } @@ -47906,13 +47906,13 @@ class KK { .monaco-drag-image, .monaco-list${t}:focus .monaco-list-row.selected.focused { color: ${e.listFocusAndSelectionForeground}; } `), e.listInactiveFocusForeground && (i.push(`.monaco-list${t} .monaco-list-row.focused { color: ${e.listInactiveFocusForeground}; }`), i.push(`.monaco-list${t} .monaco-list-row.focused:hover { color: ${e.listInactiveFocusForeground}; }`)), e.listInactiveSelectionIconForeground && i.push(`.monaco-list${t} .monaco-list-row.focused .codicon { color: ${e.listInactiveSelectionIconForeground}; }`), e.listInactiveFocusBackground && (i.push(`.monaco-list${t} .monaco-list-row.focused { background-color: ${e.listInactiveFocusBackground}; }`), i.push(`.monaco-list${t} .monaco-list-row.focused:hover { background-color: ${e.listInactiveFocusBackground}; }`)), e.listInactiveSelectionBackground && (i.push(`.monaco-list${t} .monaco-list-row.selected { background-color: ${e.listInactiveSelectionBackground}; }`), i.push(`.monaco-list${t} .monaco-list-row.selected:hover { background-color: ${e.listInactiveSelectionBackground}; }`)), e.listInactiveSelectionForeground && i.push(`.monaco-list${t} .monaco-list-row.selected { color: ${e.listInactiveSelectionForeground}; }`), e.listHoverBackground && i.push(`.monaco-list${t}:not(.drop-target):not(.dragging) .monaco-list-row:hover:not(.selected):not(.focused) { background-color: ${e.listHoverBackground}; }`), e.listHoverForeground && i.push(`.monaco-list${t}:not(.drop-target):not(.dragging) .monaco-list-row:hover:not(.selected):not(.focused) { color: ${e.listHoverForeground}; }`); - const n = Gc(e.listFocusAndSelectionOutline, Gc(e.listSelectionOutline, e.listFocusOutline ?? "")); + const n = Dd(e.listFocusAndSelectionOutline, Dd(e.listSelectionOutline, e.listFocusOutline ?? "")); n && i.push(`.monaco-list${t}:focus .monaco-list-row.focused.selected { outline: 1px solid ${n}; outline-offset: -1px;}`), e.listFocusOutline && i.push(` .monaco-drag-image, .monaco-list${t}:focus .monaco-list-row.focused { outline: 1px solid ${e.listFocusOutline}; outline-offset: -1px; } .monaco-workbench.context-menu-visible .monaco-list${t}.last-focused .monaco-list-row.focused { outline: 1px solid ${e.listFocusOutline}; outline-offset: -1px; } `); - const o = Gc(e.listSelectionOutline, e.listInactiveFocusOutline ?? ""); + const o = Dd(e.listSelectionOutline, e.listInactiveFocusOutline ?? ""); o && i.push(`.monaco-list${t} .monaco-list-row.focused.selected { outline: 1px dotted ${o}; outline-offset: -1px; }`), e.listSelectionOutline && i.push(`.monaco-list${t} .monaco-list-row.selected { outline: 1px dotted ${e.listSelectionOutline}; outline-offset: -1px; }`), e.listInactiveFocusOutline && i.push(`.monaco-list${t} .monaco-list-row.focused { outline: 1px dotted ${e.listInactiveFocusOutline}; outline-offset: -1px; }`), e.listHoverOutline && i.push(`.monaco-list${t} .monaco-list-row:hover { outline: 1px dashed ${e.listHoverOutline}; outline-offset: -1px; }`), e.listDropOverBackground && i.push(` .monaco-list${t}.drop-target, .monaco-list${t} .monaco-list-rows.drop-target, @@ -47949,7 +47949,7 @@ class KK { `); } } -const nue = { +const Que = { listFocusBackground: "#7FB0D0", listActiveSelectionBackground: "#0E639C", listActiveSelectionForeground: "#FFFFFF", @@ -47963,9 +47963,9 @@ const nue = { listDropOverBackground: "#383B3D", listDropBetweenBackground: "#EEEEEE", treeIndentGuidesStroke: "#a9a9a9", - treeInactiveIndentGuidesStroke: K.fromHex("#a9a9a9").transparent(0.4).toString(), - tableColumnsBorder: K.fromHex("#cccccc").transparent(0.2).toString(), - tableOddRowsBackgroundColor: K.fromHex("#cccccc").transparent(0.04).toString(), + treeInactiveIndentGuidesStroke: Q.fromHex("#a9a9a9").transparent(0.4).toString(), + tableColumnsBorder: Q.fromHex("#cccccc").transparent(0.2).toString(), + tableOddRowsBackgroundColor: Q.fromHex("#cccccc").transparent(0.04).toString(), listBackground: void 0, listFocusForeground: void 0, listInactiveSelectionForeground: void 0, @@ -47979,7 +47979,7 @@ const nue = { treeStickyScrollBackground: void 0, treeStickyScrollBorder: void 0, treeStickyScrollShadow: void 0 -}, sue = { +}, Oue = { keyboardSupport: !0, mouseSupport: !0, multipleSelectionSupport: !0, @@ -47998,7 +47998,7 @@ const nue = { } } }; -function oue(s, e) { +function jue(s, e) { const t = s.indexOf(e); if (t === -1) return []; @@ -48010,7 +48010,7 @@ function oue(s, e) { i.push(s[n++]); return i; } -function tT(s, e) { +function XT(s, e) { const t = []; let i = 0, n = 0; for (; i < s.length || n < e.length; ) @@ -48024,7 +48024,7 @@ function tT(s, e) { } else s[i] < e[n] ? t.push(s[i++]) : t.push(e[n++]); return t; } -function rue(s, e) { +function que(s, e) { const t = []; let i = 0, n = 0; for (; i < s.length || n < e.length; ) @@ -48038,8 +48038,8 @@ function rue(s, e) { } else s[i] < e[n] ? t.push(s[i++]) : n++; return t; } -const lz = (s, e) => s - e; -class lue { +const Tz = (s, e) => s - e; +class $ue { constructor(e, t) { this._templateId = e, this.renderers = t; } @@ -48051,14 +48051,14 @@ class lue { } renderElement(e, t, i, n) { let o = 0; - for (const r of this.renderers) - r.renderElement(e, t, i[o++], n); + for (const l of this.renderers) + l.renderElement(e, t, i[o++], n); } disposeElement(e, t, i, n) { - var r; + var l; let o = 0; - for (const l of this.renderers) - (r = l.disposeElement) == null || r.call(l, e, t, i[o], n), o += 1; + for (const r of this.renderers) + (l = r.disposeElement) == null || l.call(r, e, t, i[o], n), o += 1; } disposeTemplate(e) { let t = 0; @@ -48066,20 +48066,20 @@ class lue { i.disposeTemplate(e[t++]); } } -class aue { +class eme { constructor(e) { this.accessibilityProvider = e, this.templateId = "a18n"; } renderTemplate(e) { - return { container: e, disposables: new U() }; + return { container: e, disposables: new _() }; } renderElement(e, t, i) { - const n = this.accessibilityProvider.getAriaLabel(e), o = n && typeof n != "string" ? n : dr(n); - i.disposables.add(Te((l) => { - this.setAriaLabel(l.readObservable(o), i.container); + const n = this.accessibilityProvider.getAriaLabel(e), o = n && typeof n != "string" ? n : ul(n); + i.disposables.add(Te((r) => { + this.setAriaLabel(r.readObservable(o), i.container); })); - const r = this.accessibilityProvider.getAriaLevel && this.accessibilityProvider.getAriaLevel(e); - typeof r == "number" ? i.container.setAttribute("aria-level", `${r}`) : i.container.removeAttribute("aria-level"); + const l = this.accessibilityProvider.getAriaLevel && this.accessibilityProvider.getAriaLevel(e); + typeof l == "number" ? i.container.setAttribute("aria-level", `${l}`) : i.container.removeAttribute("aria-level"); } setAriaLabel(e, t) { e ? t.setAttribute("aria-label", e) : t.removeAttribute("aria-label"); @@ -48091,7 +48091,7 @@ class aue { e.disposables.dispose(); } } -class cue { +class tme { constructor(e, t) { this.list = e, this.dnd = t; } @@ -48114,8 +48114,8 @@ class cue { return this.dnd.onDragOver(e, t, i, n, o); } onDragLeave(e, t, i, n) { - var o, r; - (r = (o = this.dnd).onDragLeave) == null || r.call(o, e, t, i, n); + var o, l; + (l = (o = this.dnd).onDragLeave) == null || l.call(o, e, t, i, n); } onDragEnd(e) { var t, i; @@ -48128,7 +48128,7 @@ class cue { this.dnd.dispose(); } } -class Qo { +class qo { get onDidChangeFocus() { return se.map(this.eventBufferer.wrapEvent(this.focus.onChange), (e) => this.toListEvent(e), this.disposables); } @@ -48177,10 +48177,10 @@ class Qo { */ get onContextMenu() { let e = !1; - const t = se.chain(this.disposables.add(new et(this.view.domNode, "keydown")).event, (o) => o.map((r) => new Vt(r)).filter((r) => e = r.keyCode === 58 || r.shiftKey && r.keyCode === 68).map((r) => tt.stop(r, !0)).filter(() => !1)), i = se.chain(this.disposables.add(new et(this.view.domNode, "keyup")).event, (o) => o.forEach(() => e = !1).map((r) => new Vt(r)).filter((r) => r.keyCode === 58 || r.shiftKey && r.keyCode === 68).map((r) => tt.stop(r, !0)).map(({ browserEvent: r }) => { - const l = this.getFocus(), a = l.length ? l[0] : void 0, c = typeof a < "u" ? this.view.element(a) : void 0, d = typeof a < "u" ? this.view.domElement(a) : this.view.domNode; - return { index: a, element: c, anchor: d, browserEvent: r }; - })), n = se.chain(this.view.onContextMenu, (o) => o.filter((r) => !e).map(({ element: r, index: l, browserEvent: a }) => ({ element: r, index: l, anchor: new Er(xe(this.view.domNode), a), browserEvent: a }))); + const t = se.chain(this.disposables.add(new et(this.view.domNode, "keydown")).event, (o) => o.map((l) => new Yt(l)).filter((l) => e = l.keyCode === 58 || l.shiftKey && l.keyCode === 68).map((l) => tt.stop(l, !0)).filter(() => !1)), i = se.chain(this.disposables.add(new et(this.view.domNode, "keyup")).event, (o) => o.forEach(() => e = !1).map((l) => new Yt(l)).filter((l) => l.keyCode === 58 || l.shiftKey && l.keyCode === 68).map((l) => tt.stop(l, !0)).map(({ browserEvent: l }) => { + const r = this.getFocus(), c = r.length ? r[0] : void 0, d = typeof c < "u" ? this.view.element(c) : void 0, a = typeof c < "u" ? this.view.domElement(c) : this.view.domNode; + return { index: c, element: d, anchor: a, browserEvent: l }; + })), n = se.chain(this.view.onContextMenu, (o) => o.filter((l) => !e).map(({ element: l, index: r, browserEvent: c }) => ({ element: l, index: r, anchor: new Fl(Le(this.view.domNode), c), browserEvent: c }))); return se.any(t, i, n); } get onKeyDown() { @@ -48192,39 +48192,39 @@ class Qo { get onDidBlur() { return se.signal(this.disposables.add(new et(this.view.domNode, "blur", !0)).event); } - constructor(e, t, i, n, o = sue) { - var c, d, h; - this.user = e, this._options = o, this.focus = new qA("focused"), this.anchor = new qA("anchor"), this.eventBufferer = new aC(), this._ariaLabel = "", this.disposables = new U(), this._onDidDispose = new k(), this.onDidDispose = this._onDidDispose.event; - const r = this._options.accessibilityProvider && this._options.accessibilityProvider.getWidgetRole ? (c = this._options.accessibilityProvider) == null ? void 0 : c.getWidgetRole() : "list"; - this.selection = new Qhe(r !== "listbox"); - const l = [this.focus.renderer, this.selection.renderer]; - this.accessibilityProvider = o.accessibilityProvider, this.accessibilityProvider && (l.push(new aue(this.accessibilityProvider)), (h = (d = this.accessibilityProvider).onDidChangeActiveDescendant) == null || h.call(d, this.onDidChangeActiveDescendant, this, this.disposables)), n = n.map((u) => new lue(u.templateId, [...l, u])); - const a = { + constructor(e, t, i, n, o = Oue) { + var d, a, h; + this.user = e, this._options = o, this.focus = new mL("focused"), this.anchor = new mL("anchor"), this.eventBufferer = new GG(), this._ariaLabel = "", this.disposables = new _(), this._onDidDispose = new k(), this.onDidDispose = this._onDidDispose.event; + const l = this._options.accessibilityProvider && this._options.accessibilityProvider.getWidgetRole ? (d = this._options.accessibilityProvider) == null ? void 0 : d.getWidgetRole() : "list"; + this.selection = new zue(l !== "listbox"); + const r = [this.focus.renderer, this.selection.renderer]; + this.accessibilityProvider = o.accessibilityProvider, this.accessibilityProvider && (r.push(new eme(this.accessibilityProvider)), (h = (a = this.accessibilityProvider).onDidChangeActiveDescendant) == null || h.call(a, this.onDidChangeActiveDescendant, this, this.disposables)), n = n.map((u) => new $ue(u.templateId, [...r, u])); + const c = { ...o, - dnd: o.dnd && new cue(this, o.dnd) + dnd: o.dnd && new tme(this, o.dnd) }; - if (this.view = this.createListView(t, i, n, a), this.view.domNode.setAttribute("role", r), o.styleController) + if (this.view = this.createListView(t, i, n, c), this.view.domNode.setAttribute("role", l), o.styleController) this.styleController = o.styleController(this.view.domId); else { - const u = Bo(this.view.domNode); - this.styleController = new KK(u, this.view.domId); + const u = Po(this.view.domNode); + this.styleController = new wO(u, this.view.domId); } - if (this.spliceable = new Xhe([ - new gW(this.focus, this.view, o.identityProvider), - new gW(this.selection, this.view, o.identityProvider), - new gW(this.anchor, this.view, o.identityProvider), + if (this.spliceable = new wue([ + new RR(this.focus, this.view, o.identityProvider), + new RR(this.selection, this.view, o.identityProvider), + new RR(this.anchor, this.view, o.identityProvider), this.view - ]), this.disposables.add(this.focus), this.disposables.add(this.selection), this.disposables.add(this.anchor), this.disposables.add(this.view), this.disposables.add(this._onDidDispose), this.disposables.add(new tue(this, this.view)), (typeof o.keyboardSupport != "boolean" || o.keyboardSupport) && (this.keyboardController = new OK(this, this.view, o), this.disposables.add(this.keyboardController)), o.keyboardNavigationLabelProvider) { - const u = o.keyboardNavigationDelegate || $he; - this.typeNavigationController = new eue(this, this.view, o.keyboardNavigationLabelProvider, o.keyboardNavigationEventFilter ?? (() => !0), u), this.disposables.add(this.typeNavigationController); + ]), this.disposables.add(this.focus), this.disposables.add(this.selection), this.disposables.add(this.anchor), this.disposables.add(this.view), this.disposables.add(this._onDidDispose), this.disposables.add(new Bue(this, this.view)), (typeof o.keyboardSupport != "boolean" || o.keyboardSupport) && (this.keyboardController = new xO(this, this.view, o), this.disposables.add(this.keyboardController)), o.keyboardNavigationLabelProvider) { + const u = o.keyboardNavigationDelegate || Uue; + this.typeNavigationController = new Pue(this, this.view, o.keyboardNavigationLabelProvider, o.keyboardNavigationEventFilter ?? (() => !0), u), this.disposables.add(this.typeNavigationController); } this.mouseController = this.createMouseController(o), this.disposables.add(this.mouseController), this.onDidChangeFocus(this._onFocusChange, this, this.disposables), this.onDidChangeSelection(this._onSelectionChange, this, this.disposables), this.accessibilityProvider && (this.ariaLabel = this.accessibilityProvider.getWidgetAriaLabel()), this._options.multipleSelectionSupport !== !1 && this.view.domNode.setAttribute("aria-multiselectable", "true"); } createListView(e, t, i, n) { - return new Kr(e, t, i, n); + return new ql(e, t, i, n); } createMouseController(e) { - return new UK(this); + return new NO(this); } updateOptions(e = {}) { var t, i; @@ -48235,9 +48235,9 @@ class Qo { } splice(e, t, i = []) { if (e < 0 || e > this.view.length) - throw new gu(this.user, `Invalid start index: ${e}`); + throw new Zu(this.user, `Invalid start index: ${e}`); if (t < 0) - throw new gu(this.user, `Invalid delete count: ${t}`); + throw new Zu(this.user, `Invalid delete count: ${t}`); t === 0 && i.length === 0 || this.eventBufferer.bufferEvents(() => this.spliceable.splice(e, t, i)); } rerender() { @@ -48291,7 +48291,7 @@ class Qo { setSelection(e, t) { for (const i of e) if (i < 0 || i >= this.length) - throw new gu(this.user, `Invalid index ${i}`); + throw new Zu(this.user, `Invalid index ${i}`); this.selection.set(e, t); } getSelection() { @@ -48306,11 +48306,11 @@ class Qo { return; } if (e < 0 || e >= this.length) - throw new gu(this.user, `Invalid index ${e}`); + throw new Zu(this.user, `Invalid index ${e}`); this.anchor.set([e]); } getAnchor() { - return SE(this.anchor.get(), void 0); + return Pv(this.anchor.get(), void 0); } getAnchorElement() { const e = this.getAnchor(); @@ -48319,20 +48319,20 @@ class Qo { setFocus(e, t) { for (const i of e) if (i < 0 || i >= this.length) - throw new gu(this.user, `Invalid index ${i}`); + throw new Zu(this.user, `Invalid index ${i}`); this.focus.set(e, t); } focusNext(e = 1, t = !1, i, n) { if (this.length === 0) return; - const o = this.focus.get(), r = this.findNextIndex(o.length > 0 ? o[0] + e : 0, t, n); - r > -1 && this.setFocus([r], i); + const o = this.focus.get(), l = this.findNextIndex(o.length > 0 ? o[0] + e : 0, t, n); + l > -1 && this.setFocus([l], i); } focusPrevious(e = 1, t = !1, i, n) { if (this.length === 0) return; - const o = this.focus.get(), r = this.findPreviousIndex(o.length > 0 ? o[0] - e : 0, t, n); - r > -1 && this.setFocus([r], i); + const o = this.focus.get(), l = this.findPreviousIndex(o.length > 0 ? o[0] - e : 0, t, n); + l > -1 && this.setFocus([l], i); } async focusNextPage(e, t) { let i = this.view.indexAt(this.view.getScrollTop() + this.view.renderHeight); @@ -48343,21 +48343,21 @@ class Qo { o > -1 && n !== o ? this.setFocus([o], e) : this.setFocus([i], e); } else { const o = this.view.getScrollTop(); - let r = o + this.view.renderHeight; - i > n && (r -= this.view.elementHeight(i)), this.view.setScrollTop(r), this.view.getScrollTop() !== o && (this.setFocus([]), await Zh(0), await this.focusNextPage(e, t)); + let l = o + this.view.renderHeight; + i > n && (l -= this.view.elementHeight(i)), this.view.setScrollTop(l), this.view.getScrollTop() !== o && (this.setFocus([]), await Nh(0), await this.focusNextPage(e, t)); } } async focusPreviousPage(e, t, i = () => 0) { let n; - const o = i(), r = this.view.getScrollTop() + o; - r === 0 ? n = this.view.indexAt(r) : n = this.view.indexAfter(r - 1); - const l = this.getFocus()[0]; - if (l !== n && (l === void 0 || l >= n)) { - const a = this.findNextIndex(n, !1, t); - a > -1 && l !== a ? this.setFocus([a], e) : this.setFocus([n], e); + const o = i(), l = this.view.getScrollTop() + o; + l === 0 ? n = this.view.indexAt(l) : n = this.view.indexAfter(l - 1); + const r = this.getFocus()[0]; + if (r !== n && (r === void 0 || r >= n)) { + const c = this.findNextIndex(n, !1, t); + c > -1 && r !== c ? this.setFocus([c], e) : this.setFocus([n], e); } else { - const a = r; - this.view.setScrollTop(r - this.view.renderHeight - o), this.view.getScrollTop() + i() !== a && (this.setFocus([]), await Zh(0), await this.focusPreviousPage(e, t, i)); + const c = l; + this.view.setScrollTop(l - this.view.renderHeight - o), this.view.getScrollTop() + i() !== c && (this.setFocus([]), await Nh(0), await this.focusPreviousPage(e, t, i)); } } focusLast(e, t) { @@ -48403,14 +48403,14 @@ class Qo { } reveal(e, t, i = 0) { if (e < 0 || e >= this.length) - throw new gu(this.user, `Invalid index ${e}`); - const n = this.view.getScrollTop(), o = this.view.elementTop(e), r = this.view.elementHeight(e); - if (Mh(t)) { - const l = r - this.view.renderHeight + i; - this.view.setScrollTop(l * os(t, 0, 1) + o - i); + throw new Zu(this.user, `Invalid index ${e}`); + const n = this.view.getScrollTop(), o = this.view.elementTop(e), l = this.view.elementHeight(e); + if (Rh(t)) { + const r = l - this.view.renderHeight + i; + this.view.setScrollTop(r * rs(t, 0, 1) + o - i); } else { - const l = o + r, a = n + this.view.renderHeight; - o < n + i && l >= a || (o < n + i || l >= a && r >= this.view.renderHeight ? this.view.setScrollTop(o - i) : l >= a && this.view.setScrollTop(l - this.view.renderHeight)); + const r = o + l, c = n + this.view.renderHeight; + o < n + i && r >= c || (o < n + i || r >= c && l >= this.view.renderHeight ? this.view.setScrollTop(o - i) : r >= c && this.view.setScrollTop(r - this.view.renderHeight)); } } /** @@ -48419,12 +48419,12 @@ class Qo { */ getRelativeTop(e, t = 0) { if (e < 0 || e >= this.length) - throw new gu(this.user, `Invalid index ${e}`); + throw new Zu(this.user, `Invalid index ${e}`); const i = this.view.getScrollTop(), n = this.view.elementTop(e), o = this.view.elementHeight(e); if (n < i + t || n + o > i + this.view.renderHeight) return null; - const r = o - this.view.renderHeight + t; - return Math.abs((i + t - n) / r); + const l = o - this.view.renderHeight + t; + return Math.abs((i + t - n) / l); } getHTMLElement() { return this.view.domNode; @@ -48465,63 +48465,63 @@ class Qo { this._onDidDispose.fire(), this.disposables.dispose(), this._onDidDispose.dispose(); } } -Qh([ - Zi -], Qo.prototype, "onDidChangeFocus", null); -Qh([ - Zi -], Qo.prototype, "onDidChangeSelection", null); -Qh([ - Zi -], Qo.prototype, "onContextMenu", null); -Qh([ - Zi -], Qo.prototype, "onKeyDown", null); -Qh([ - Zi -], Qo.prototype, "onDidFocus", null); -Qh([ - Zi -], Qo.prototype, "onDidBlur", null); -const eg = ce, QK = "selectOption.entry.template"; -class due { +eu([ + xi +], qo.prototype, "onDidChangeFocus", null); +eu([ + xi +], qo.prototype, "onDidChangeSelection", null); +eu([ + xi +], qo.prototype, "onContextMenu", null); +eu([ + xi +], qo.prototype, "onKeyDown", null); +eu([ + xi +], qo.prototype, "onDidFocus", null); +eu([ + xi +], qo.prototype, "onDidBlur", null); +const om = de, TO = "selectOption.entry.template"; +class ime { get templateId() { - return QK; + return TO; } renderTemplate(e) { const t = /* @__PURE__ */ Object.create(null); - return t.root = e, t.text = Q(e, eg(".option-text")), t.detail = Q(e, eg(".option-detail")), t.decoratorRight = Q(e, eg(".option-decorator-right")), t; + return t.root = e, t.text = O(e, om(".option-text")), t.detail = O(e, om(".option-detail")), t.decoratorRight = O(e, om(".option-decorator-right")), t; } renderElement(e, t, i) { - const n = i, o = e.text, r = e.detail, l = e.decoratorRight, a = e.isDisabled; - n.text.textContent = o, n.detail.textContent = r || "", n.decoratorRight.innerText = l || "", a ? n.root.classList.add("option-disabled") : n.root.classList.remove("option-disabled"); + const n = i, o = e.text, l = e.detail, r = e.decoratorRight, c = e.isDisabled; + n.text.textContent = o, n.detail.textContent = l || "", n.decoratorRight.innerText = r || "", c ? n.root.classList.add("option-disabled") : n.root.classList.remove("option-disabled"); } disposeTemplate(e) { } } -const sa = class sa extends R { +const cc = class cc extends J { constructor(e, t, i, n, o) { - super(), this.options = [], this._currentSelection = 0, this._hasDetails = !1, this._skipLayout = !1, this._sticky = !1, this._isVisible = !1, this.styles = n, this.selectBoxOptions = o || /* @__PURE__ */ Object.create(null), typeof this.selectBoxOptions.minBottomMargin != "number" ? this.selectBoxOptions.minBottomMargin = sa.DEFAULT_DROPDOWN_MINIMUM_BOTTOM_MARGIN : this.selectBoxOptions.minBottomMargin < 0 && (this.selectBoxOptions.minBottomMargin = 0), this.selectElement = document.createElement("select"), this.selectElement.className = "monaco-select-box monaco-select-box-dropdown-padding", typeof this.selectBoxOptions.ariaLabel == "string" && this.selectElement.setAttribute("aria-label", this.selectBoxOptions.ariaLabel), typeof this.selectBoxOptions.ariaDescription == "string" && this.selectElement.setAttribute("aria-description", this.selectBoxOptions.ariaDescription), this._onDidSelect = new k(), this._register(this._onDidSelect), this.registerListeners(), this.constructSelectDropDown(i), this.selected = t || 0, e && this.setOptions(e, t), this.initStyleSheet(); + super(), this.options = [], this._currentSelection = 0, this._hasDetails = !1, this._skipLayout = !1, this._sticky = !1, this._isVisible = !1, this.styles = n, this.selectBoxOptions = o || /* @__PURE__ */ Object.create(null), typeof this.selectBoxOptions.minBottomMargin != "number" ? this.selectBoxOptions.minBottomMargin = cc.DEFAULT_DROPDOWN_MINIMUM_BOTTOM_MARGIN : this.selectBoxOptions.minBottomMargin < 0 && (this.selectBoxOptions.minBottomMargin = 0), this.selectElement = document.createElement("select"), this.selectElement.className = "monaco-select-box monaco-select-box-dropdown-padding", typeof this.selectBoxOptions.ariaLabel == "string" && this.selectElement.setAttribute("aria-label", this.selectBoxOptions.ariaLabel), typeof this.selectBoxOptions.ariaDescription == "string" && this.selectElement.setAttribute("aria-description", this.selectBoxOptions.ariaDescription), this._onDidSelect = new k(), this._register(this._onDidSelect), this.registerListeners(), this.constructSelectDropDown(i), this.selected = t || 0, e && this.setOptions(e, t), this.initStyleSheet(); } setTitle(e) { - !this._hover && e ? this._hover = this._register(Fl().setupManagedHover(As("mouse"), this.selectElement, e)) : this._hover && this._hover.update(e); + !this._hover && e ? this._hover = this._register(Kr().setupManagedHover(Is("mouse"), this.selectElement, e)) : this._hover && this._hover.update(e); } // IDelegate - List renderer getHeight() { return 22; } getTemplateId() { - return QK; + return TO; } constructSelectDropDown(e) { - this.contextViewProvider = e, this.selectDropDownContainer = ce(".monaco-select-box-dropdown-container"), this.selectDropDownContainer.classList.add("monaco-select-box-dropdown-padding"), this.selectionDetailsPane = Q(this.selectDropDownContainer, eg(".select-box-details-pane")); - const t = Q(this.selectDropDownContainer, eg(".select-box-dropdown-container-width-control")), i = Q(t, eg(".width-control-div")); - this.widthControlElement = document.createElement("span"), this.widthControlElement.className = "option-text-width-control", Q(i, this.widthControlElement), this._dropDownPosition = 0, this.styleElement = Bo(this.selectDropDownContainer), this.selectDropDownContainer.setAttribute("draggable", "true"), this._register(z(this.selectDropDownContainer, ie.DRAG_START, (n) => { + this.contextViewProvider = e, this.selectDropDownContainer = de(".monaco-select-box-dropdown-container"), this.selectDropDownContainer.classList.add("monaco-select-box-dropdown-padding"), this.selectionDetailsPane = O(this.selectDropDownContainer, om(".select-box-details-pane")); + const t = O(this.selectDropDownContainer, om(".select-box-dropdown-container-width-control")), i = O(t, om(".width-control-div")); + this.widthControlElement = document.createElement("span"), this.widthControlElement.className = "option-text-width-control", O(i, this.widthControlElement), this._dropDownPosition = 0, this.styleElement = Po(this.selectDropDownContainer), this.selectDropDownContainer.setAttribute("draggable", "true"), this._register(z(this.selectDropDownContainer, ie.DRAG_START, (n) => { tt.stop(n, !0); })); } registerListeners() { - this._register(ai(this.selectElement, "change", (t) => { + this._register(di(this.selectElement, "change", (t) => { this.selected = t.target.selectedIndex, this._onDidSelect.fire({ index: t.target.selectedIndex, selected: t.target.value @@ -48537,7 +48537,7 @@ const sa = class sa extends R { })), this._register(z(this.selectElement, "touchend", (t) => { tt.stop(t), e ? this.hideSelectDropDown(!0) : this.showSelectDropDown(); })), this._register(z(this.selectElement, ie.KEY_DOWN, (t) => { - const i = new Vt(t); + const i = new Yt(t); let n = !1; qe ? (i.keyCode === 18 || i.keyCode === 16 || i.keyCode === 10 || i.keyCode === 3) && (n = !0) : (i.keyCode === 18 && i.altKey || i.keyCode === 16 && i.altKey || i.keyCode === 10 || i.keyCode === 3) && (n = !0), n && (this.showSelectDropDown(), tt.stop(t, !0)); })); @@ -48546,7 +48546,7 @@ const sa = class sa extends R { return this._onDidSelect.event; } setOptions(e, t) { - ei(this.options, e) || (this.options = e, this.selectElement.options.length = 0, this._hasDetails = !1, this._cachedMaxDetailsHeight = void 0, this.options.forEach((i, n) => { + ti(this.options, e) || (this.options = e, this.selectElement.options.length = 0, this._hasDetails = !1, this._cachedMaxDetailsHeight = void 0, this.options.forEach((i, n) => { this.selectElement.add(this.createOption(i.text, n, i.isDisabled)), typeof i.description == "string" && (this._hasDetails = !0); })), t !== void 0 && (this.select(t), this._currentSelection = this.selected); } @@ -48579,7 +48579,7 @@ const sa = class sa extends R { this.selectElement.style.backgroundColor = e, this.selectElement.style.color = t, this.selectElement.style.borderColor = i; } styleList() { - const e = this.styles.selectBackground ?? "", t = Gc(this.styles.selectListBackground, e); + const e = this.styles.selectBackground ?? "", t = Dd(this.styles.selectListBackground, e); this.selectDropDownListContainer.style.backgroundColor = t, this.selectionDetailsPane.style.backgroundColor = t; const i = this.styles.focusBorder ?? ""; this.selectDropDownContainer.style.outlineColor = i, this.selectDropDownContainer.style.outlineOffset = "-1px", this.selectList.style(this.styles); @@ -48632,22 +48632,22 @@ const sa = class sa extends R { return !1; if (this.selectList) { this.selectDropDownContainer.classList.add("visible"); - const t = xe(this.selectElement), i = yi(this.selectElement), n = xe(this.selectElement).getComputedStyle(this.selectElement), o = parseFloat(n.getPropertyValue("--dropdown-padding-top")) + parseFloat(n.getPropertyValue("--dropdown-padding-bottom")), r = t.innerHeight - i.top - i.height - (this.selectBoxOptions.minBottomMargin || 0), l = i.top - sa.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN, a = this.selectElement.offsetWidth, c = this.setWidthControlElement(this.widthControlElement), d = Math.max(c, Math.round(a)).toString() + "px"; - this.selectDropDownContainer.style.width = d, this.selectList.getHTMLElement().style.height = "", this.selectList.layout(); + const t = Le(this.selectElement), i = yi(this.selectElement), n = Le(this.selectElement).getComputedStyle(this.selectElement), o = parseFloat(n.getPropertyValue("--dropdown-padding-top")) + parseFloat(n.getPropertyValue("--dropdown-padding-bottom")), l = t.innerHeight - i.top - i.height - (this.selectBoxOptions.minBottomMargin || 0), r = i.top - cc.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN, c = this.selectElement.offsetWidth, d = this.setWidthControlElement(this.widthControlElement), a = Math.max(d, Math.round(c)).toString() + "px"; + this.selectDropDownContainer.style.width = a, this.selectList.getHTMLElement().style.height = "", this.selectList.layout(); let h = this.selectList.contentHeight; this._hasDetails && this._cachedMaxDetailsHeight === void 0 && (this._cachedMaxDetailsHeight = this.measureMaxDetailsHeight()); - const u = this._hasDetails ? this._cachedMaxDetailsHeight : 0, g = h + o + u, m = Math.floor((r - o - u) / this.getHeight()), f = Math.floor((l - o - u) / this.getHeight()); + const u = this._hasDetails ? this._cachedMaxDetailsHeight : 0, m = h + o + u, b = Math.floor((l - o - u) / this.getHeight()), g = Math.floor((r - o - u) / this.getHeight()); if (e) - return i.top + i.height > t.innerHeight - 22 || i.top < sa.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN || m < 1 && f < 1 ? !1 : (m < sa.DEFAULT_MINIMUM_VISIBLE_OPTIONS && f > m && this.options.length > m ? (this._dropDownPosition = 1, this.selectDropDownListContainer.remove(), this.selectionDetailsPane.remove(), this.selectDropDownContainer.appendChild(this.selectionDetailsPane), this.selectDropDownContainer.appendChild(this.selectDropDownListContainer), this.selectionDetailsPane.classList.remove("border-top"), this.selectionDetailsPane.classList.add("border-bottom")) : (this._dropDownPosition = 0, this.selectDropDownListContainer.remove(), this.selectionDetailsPane.remove(), this.selectDropDownContainer.appendChild(this.selectDropDownListContainer), this.selectDropDownContainer.appendChild(this.selectionDetailsPane), this.selectionDetailsPane.classList.remove("border-bottom"), this.selectionDetailsPane.classList.add("border-top")), !0); - if (i.top + i.height > t.innerHeight - 22 || i.top < sa.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN || this._dropDownPosition === 0 && m < 1 || this._dropDownPosition === 1 && f < 1) + return i.top + i.height > t.innerHeight - 22 || i.top < cc.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN || b < 1 && g < 1 ? !1 : (b < cc.DEFAULT_MINIMUM_VISIBLE_OPTIONS && g > b && this.options.length > b ? (this._dropDownPosition = 1, this.selectDropDownListContainer.remove(), this.selectionDetailsPane.remove(), this.selectDropDownContainer.appendChild(this.selectionDetailsPane), this.selectDropDownContainer.appendChild(this.selectDropDownListContainer), this.selectionDetailsPane.classList.remove("border-top"), this.selectionDetailsPane.classList.add("border-bottom")) : (this._dropDownPosition = 0, this.selectDropDownListContainer.remove(), this.selectionDetailsPane.remove(), this.selectDropDownContainer.appendChild(this.selectDropDownListContainer), this.selectDropDownContainer.appendChild(this.selectionDetailsPane), this.selectionDetailsPane.classList.remove("border-bottom"), this.selectionDetailsPane.classList.add("border-top")), !0); + if (i.top + i.height > t.innerHeight - 22 || i.top < cc.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN || this._dropDownPosition === 0 && b < 1 || this._dropDownPosition === 1 && g < 1) return this.hideSelectDropDown(!0), !1; if (this._dropDownPosition === 0) { - if (this._isVisible && m + f < 1) + if (this._isVisible && b + g < 1) return this.hideSelectDropDown(!0), !1; - g > r && (h = m * this.getHeight()); + m > l && (h = b * this.getHeight()); } else - g > l && (h = f * this.getHeight()); - return this.selectList.layout(h), this.selectList.domFocus(), this.selectList.length > 0 && (this.selectList.setFocus([this.selected || 0]), this.selectList.reveal(this.selectList.getFocus()[0] || 0)), this._hasDetails ? (this.selectList.getHTMLElement().style.height = h + o + "px", this.selectDropDownContainer.style.height = "") : this.selectDropDownContainer.style.height = h + o + "px", this.updateDetail(this.selected), this.selectDropDownContainer.style.width = d, this.selectDropDownListContainer.setAttribute("tabindex", "0"), this.selectElement.classList.add("synthetic-focus"), this.selectDropDownContainer.classList.add("synthetic-focus"), !0; + m > r && (h = g * this.getHeight()); + return this.selectList.layout(h), this.selectList.domFocus(), this.selectList.length > 0 && (this.selectList.setFocus([this.selected || 0]), this.selectList.reveal(this.selectList.getFocus()[0] || 0)), this._hasDetails ? (this.selectList.getHTMLElement().style.height = h + o + "px", this.selectDropDownContainer.style.height = "") : this.selectDropDownContainer.style.height = h + o + "px", this.updateDetail(this.selected), this.selectDropDownContainer.style.width = a, this.selectDropDownListContainer.setAttribute("tabindex", "0"), this.selectElement.classList.add("synthetic-focus"), this.selectDropDownContainer.classList.add("synthetic-focus"), !0; } else return !1; } @@ -48655,17 +48655,17 @@ const sa = class sa extends R { let t = 0; if (e) { let i = 0, n = 0; - this.options.forEach((o, r) => { - const l = o.detail ? o.detail.length : 0, a = o.decoratorRight ? o.decoratorRight.length : 0, c = o.text.length + l + a; - c > n && (i = r, n = c); - }), e.textContent = this.options[i].text + (this.options[i].decoratorRight ? this.options[i].decoratorRight + " " : ""), t = $s(e); + this.options.forEach((o, l) => { + const r = o.detail ? o.detail.length : 0, c = o.decoratorRight ? o.decoratorRight.length : 0, d = o.text.length + r + c; + d > n && (i = l, n = d); + }), e.textContent = this.options[i].text + (this.options[i].decoratorRight ? this.options[i].decoratorRight + " " : ""), t = to(e); } return t; } createSelectList(e) { if (this.selectList) return; - this.selectDropDownListContainer = Q(e, eg(".select-box-dropdown-list-container")), this.listRenderer = new due(), this.selectList = this._register(new Qo("SelectBoxCustom", this.selectDropDownListContainer, this, [this.listRenderer], { + this.selectDropDownListContainer = O(e, om(".select-box-dropdown-list-container")), this.listRenderer = new ime(), this.selectList = this._register(new qo("SelectBoxCustom", this.selectDropDownListContainer, this, [this.listRenderer], { useShadows: !1, verticalScrollMode: 3, keyboardSupport: !1, @@ -48680,7 +48680,7 @@ const sa = class sa extends R { getWidgetRole: () => "listbox" } })), this.selectBoxOptions.ariaLabel && (this.selectList.ariaLabel = this.selectBoxOptions.ariaLabel); - const t = this._register(new et(this.selectDropDownListContainer, "keydown")), i = se.chain(t.event, (n) => n.filter(() => this.selectList.length > 0).map((o) => new Vt(o))); + const t = this._register(new et(this.selectDropDownListContainer, "keydown")), i = se.chain(t.event, (n) => n.filter(() => this.selectList.length > 0).map((o) => new Yt(o))); this._register(se.chain(i, (n) => n.filter( (o) => o.keyCode === 3 /* KeyCode.Enter */ @@ -48709,7 +48709,7 @@ const sa = class sa extends R { (o) => o.keyCode === 13 /* KeyCode.End */ ))(this.onEnd, this)), this._register(se.chain(i, (n) => n.filter((o) => o.keyCode >= 21 && o.keyCode <= 56 || o.keyCode >= 85 && o.keyCode <= 113))(this.onCharacter, this)), this._register(z(this.selectList.getHTMLElement(), ie.POINTER_UP, (n) => this.onPointerUp(n))), this._register(this.selectList.onMouseOver((n) => typeof n.index < "u" && this.selectList.setFocus([n.index]))), this._register(this.selectList.onDidChangeFocus((n) => this.onListFocus(n))), this._register(z(this.selectDropDownContainer, ie.FOCUS_OUT, (n) => { - !this._isVisible || Ji(n.relatedTarget, this.selectDropDownContainer) || this.onListBlur(); + !this._isVisible || _i(n.relatedTarget, this.selectDropDownContainer) || this.onListBlur(); })), this.selectList.getHTMLElement().setAttribute("aria-label", this.selectBoxOptions.ariaLabel || ""), this.selectList.getHTMLElement().setAttribute("aria-expanded", "true"), this.styleList(); } // List methods @@ -48737,11 +48737,11 @@ const sa = class sa extends R { } renderDescriptionMarkdown(e, t) { const i = (o) => { - for (let r = 0; r < o.childNodes.length; r++) { - const l = o.childNodes.item(r); - (l.tagName && l.tagName.toLowerCase()) === "img" ? l.remove() : i(l); + for (let l = 0; l < o.childNodes.length; l++) { + const r = o.childNodes.item(l); + (r.tagName && r.tagName.toLowerCase()) === "img" ? r.remove() : i(r); } - }, n = MI({ value: e, supportThemeIcons: !0 }, { actionHandler: t }); + }, n = Dx({ value: e, supportThemeIcons: !0 }, { actionHandler: t }); return n.element.classList.add("select-box-description-markdown"), i(n.element), n.element; } // List Focus Change - passive - update details pane with newly focused element's data @@ -48810,7 +48810,7 @@ const sa = class sa extends R { } // Mimic option first character navigation of native select onCharacter(e) { - const t = bc.toString(e.keyCode); + const t = Gd.toString(e.keyCode); let i = -1; for (let n = 0; n < this.options.length - 1; n++) if (i = (n + this.selected + 1) % this.options.length, this.options[i].text.charAt(0).toUpperCase() === t && !this.options[i].isDisabled) { @@ -48822,25 +48822,25 @@ const sa = class sa extends R { this.hideSelectDropDown(!1), super.dispose(); } }; -sa.DEFAULT_DROPDOWN_MINIMUM_BOTTOM_MARGIN = 32, sa.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN = 2, sa.DEFAULT_MINIMUM_VISIBLE_OPTIONS = 3; -let iT = sa; -class hue extends R { +cc.DEFAULT_DROPDOWN_MINIMUM_BOTTOM_MARGIN = 32, cc.DEFAULT_DROPDOWN_MINIMUM_TOP_MARGIN = 2, cc.DEFAULT_MINIMUM_VISIBLE_OPTIONS = 3; +let VT = cc; +class nme extends J { constructor(e, t, i, n) { super(), this.selected = 0, this.selectBoxOptions = n || /* @__PURE__ */ Object.create(null), this.options = [], this.selectElement = document.createElement("select"), this.selectElement.className = "monaco-select-box", typeof this.selectBoxOptions.ariaLabel == "string" && this.selectElement.setAttribute("aria-label", this.selectBoxOptions.ariaLabel), typeof this.selectBoxOptions.ariaDescription == "string" && this.selectElement.setAttribute("aria-description", this.selectBoxOptions.ariaDescription), this._onDidSelect = this._register(new k()), this.styles = i, this.registerListeners(), this.setOptions(e, t); } registerListeners() { - this._register(Rn.addTarget(this.selectElement)), [Rt.Tap].forEach((e) => { + this._register(En.addTarget(this.selectElement)), [Jt.Tap].forEach((e) => { this._register(z(this.selectElement, e, (t) => { this.selectElement.focus(); })); - }), this._register(ai(this.selectElement, "click", (e) => { + }), this._register(di(this.selectElement, "click", (e) => { tt.stop(e, !0); - })), this._register(ai(this.selectElement, "change", (e) => { + })), this._register(di(this.selectElement, "change", (e) => { this.selectElement.title = e.target.value, this._onDidSelect.fire({ index: e.target.selectedIndex, selected: e.target.value }); - })), this._register(ai(this.selectElement, "keydown", (e) => { + })), this._register(di(this.selectElement, "keydown", (e) => { let t = !1; qe ? (e.keyCode === 18 || e.keyCode === 16 || e.keyCode === 10) && (t = !0) : (e.keyCode === 18 && e.altKey || e.keyCode === 10 || e.keyCode === 3) && (t = !0), t && e.stopPropagation(); })); @@ -48849,7 +48849,7 @@ class hue extends R { return this._onDidSelect.event; } setOptions(e, t) { - (!this.options || !ei(this.options, e)) && (this.options = e, this.selectElement.options.length = 0, this.options.forEach((i, n) => { + (!this.options || !ti(this.options, e)) && (this.options = e, this.selectElement.options.length = 0, this.options.forEach((i, n) => { this.selectElement.add(this.createOption(i.text, n, i.isDisabled)); })), t !== void 0 && this.select(t); } @@ -48876,9 +48876,9 @@ class hue extends R { return n.value = e, n.text = e, n.disabled = !!i, n; } } -class uue extends Ko { +class sme extends jo { constructor(e, t, i, n, o) { - super(), qe && !(o != null && o.useCustomDrawn) ? this.selectBoxDelegate = new hue(e, t, n, o) : this.selectBoxDelegate = new iT(e, t, i, n, o), this._register(this.selectBoxDelegate); + super(), qe && !(o != null && o.useCustomDrawn) ? this.selectBoxDelegate = new nme(e, t, n, o) : this.selectBoxDelegate = new VT(e, t, i, n, o), this._register(this.selectBoxDelegate); } // Public SelectBox Methods - routed through delegate interface get onDidSelect() { @@ -48903,12 +48903,12 @@ class uue extends Ko { this.selectBoxDelegate.render(e); } } -class yl extends R { +class Xr extends J { get action() { return this._action; } constructor(e, t, i = {}) { - super(), this.options = i, this._context = e || this, this._action = t, t instanceof lo && this._register(t.onDidChange((n) => { + super(), this.options = i, this._context = e || this, this._action = t, t instanceof ao && this._register(t.onDidChange((n) => { this.element && this.handleActionChangeEvent(n); })); } @@ -48916,7 +48916,7 @@ class yl extends R { e.enabled !== void 0 && this.updateEnabled(), e.checked !== void 0 && this.updateChecked(), e.class !== void 0 && this.updateClass(), e.label !== void 0 && (this.updateLabel(), this.updateTooltip()), e.tooltip !== void 0 && this.updateTooltip(); } get actionRunner() { - return this._actionRunner || (this._actionRunner = this._register(new um())), this._actionRunner; + return this._actionRunner || (this._actionRunner = this._register(new Zb())), this._actionRunner; } set actionRunner(e) { this._actionRunner = e; @@ -48929,12 +48929,12 @@ class yl extends R { } render(e) { const t = this.element = e; - this._register(Rn.addTarget(e)); + this._register(En.addTarget(e)); const i = this.options && this.options.draggable; - i && (e.draggable = !0, pr && this._register(z(e, ie.DRAG_START, (n) => { + i && (e.draggable = !0, fl && this._register(z(e, ie.DRAG_START, (n) => { var o; - return (o = n.dataTransfer) == null ? void 0 : o.setData(f1.TEXT, this._action.label); - }))), this._register(z(t, Rt.Tap, (n) => this.onClick(n, !0))), this._register(z(t, ie.MOUSE_DOWN, (n) => { + return (o = n.dataTransfer) == null ? void 0 : o.setData(CW.TEXT, this._action.label); + }))), this._register(z(t, Jt.Tap, (n) => this.onClick(n, !0))), this._register(z(t, ie.MOUSE_DOWN, (n) => { i || tt.stop(n, !0), this._action.enabled && n.button === 0 && t.classList.add("active"); })), qe && this._register(z(t, ie.CONTEXT_MENU, (n) => { n.button === 0 && n.ctrlKey === !0 && this.onClick(n); @@ -48951,7 +48951,7 @@ class yl extends R { onClick(e, t = !1) { var n; tt.stop(e, !0); - const i = Do(this._context) ? (n = this.options) != null && n.useEventAsContext ? e : { preserveFocus: t } : this._context; + const i = ko(this._context) ? (n = this.options) != null && n.useEventAsContext ? e : { preserveFocus: t } : this._context; this.actionRunner.run(this._action, i); } // Only set the tabIndex on the element once it is about to get focused @@ -48986,8 +48986,8 @@ class yl extends R { if (this.updateAriaLabel(), (t = this.options.hoverDelegate) != null && t.showNativeHover) this.element.title = e; else if (!this.customHover && e !== "") { - const i = this.options.hoverDelegate ?? As("element"); - this.customHover = this._store.add(Fl().setupManagedHover(i, this.element, e)); + const i = this.options.hoverDelegate ?? Is("element"); + this.customHover = this._store.add(Kr().setupManagedHover(i, this.element, e)); } else this.customHover && this.customHover.update(e); } updateAriaLabel() { @@ -49004,7 +49004,7 @@ class yl extends R { this.element && (this.element.remove(), this.element = void 0), this._context = void 0, super.dispose(); } } -class Sb extends yl { +class xZ extends Xr { constructor(e, t, i) { super(e, t, i), this.options = i, this.options.icon = i.icon !== void 0 ? i.icon : !1, this.options.label = i.label !== void 0 ? i.label : !0, this.cssClass = ""; } @@ -49018,7 +49018,7 @@ class Sb extends yl { this.updateClass(), this.updateLabel(), this.updateTooltip(), this.updateEnabled(), this.updateChecked(); } getDefaultAriaRole() { - return this._action.id === Qi.ID ? "presentation" : this.options.isMenu ? "menuitem" : this.options.isTabList ? "tab" : "button"; + return this._action.id === ji.ID ? "presentation" : this.options.isMenu ? "menuitem" : this.options.isTabList ? "tab" : "button"; } // Only set the tabIndex on the element once it is about to get focused // That way this element wont be a tab stop when it is not needed #106441 @@ -49056,9 +49056,9 @@ class Sb extends yl { this.label && (this.action.checked !== void 0 ? (this.label.classList.toggle("checked", this.action.checked), this.options.isTabList ? this.label.setAttribute("aria-selected", this.action.checked ? "true" : "false") : (this.label.setAttribute("aria-checked", this.action.checked ? "true" : "false"), this.label.setAttribute("role", "checkbox"))) : (this.label.classList.remove("checked"), this.label.removeAttribute(this.options.isTabList ? "aria-selected" : "aria-checked"), this.label.setAttribute("role", this.getDefaultAriaRole()))); } } -class gue extends yl { - constructor(e, t, i, n, o, r, l) { - super(e, t), this.selectBox = new uue(i, n, o, r, l), this.selectBox.setFocusable(!1), this._register(this.selectBox), this.registerListeners(); +class ome extends Xr { + constructor(e, t, i, n, o, l, r) { + super(e, t), this.selectBox = new sme(i, n, o, l, r), this.selectBox.setFocusable(!1), this._register(this.selectBox), this.registerListeners(); } select(e) { this.selectBox.select(e); @@ -49087,17 +49087,17 @@ class gue extends yl { this.selectBox.render(e); } } -class Yo extends R { +class Ao extends J { constructor(e, t = {}) { - var o, r; - super(), this._actionRunnerDisposables = this._register(new U()), this.viewItemDisposables = this._register(new QR()), this.triggerKeyDown = !1, this.focusable = !0, this._onDidBlur = this._register(new k()), this.onDidBlur = this._onDidBlur.event, this._onDidCancel = this._register(new k({ onWillAddFirstListener: () => this.cancelHasListener = !0 })), this.onDidCancel = this._onDidCancel.event, this.cancelHasListener = !1, this._onDidRun = this._register(new k()), this.onDidRun = this._onDidRun.event, this._onWillRun = this._register(new k()), this.onWillRun = this._onWillRun.event, this.options = t, this._context = t.context ?? null, this._orientation = this.options.orientation ?? 0, this._triggerKeys = { + var o, l; + super(), this._actionRunnerDisposables = this._register(new _()), this.viewItemDisposables = this._register(new Gv()), this.triggerKeyDown = !1, this.focusable = !0, this._onDidBlur = this._register(new k()), this.onDidBlur = this._onDidBlur.event, this._onDidCancel = this._register(new k({ onWillAddFirstListener: () => this.cancelHasListener = !0 })), this.onDidCancel = this._onDidCancel.event, this.cancelHasListener = !1, this._onDidRun = this._register(new k()), this.onDidRun = this._onDidRun.event, this._onWillRun = this._register(new k()), this.onWillRun = this._onWillRun.event, this.options = t, this._context = t.context ?? null, this._orientation = this.options.orientation ?? 0, this._triggerKeys = { keyDown: ((o = this.options.triggerKeys) == null ? void 0 : o.keyDown) ?? !1, - keys: ((r = this.options.triggerKeys) == null ? void 0 : r.keys) ?? [ + keys: ((l = this.options.triggerKeys) == null ? void 0 : l.keys) ?? [ 3, 10 /* KeyCode.Space */ ] - }, this._hoverDelegate = t.hoverDelegate ?? this._register(yb()), this.options.actionRunner ? this._actionRunner = this.options.actionRunner : (this._actionRunner = new um(), this._actionRunnerDisposables.add(this._actionRunner)), this._actionRunnerDisposables.add(this._actionRunner.onDidRun((l) => this._onDidRun.fire(l))), this._actionRunnerDisposables.add(this._actionRunner.onWillRun((l) => this._onWillRun.fire(l))), this.viewItems = [], this.focusedItem = void 0, this.domNode = document.createElement("div"), this.domNode.className = "monaco-action-bar"; + }, this._hoverDelegate = t.hoverDelegate ?? this._register(LZ()), this.options.actionRunner ? this._actionRunner = this.options.actionRunner : (this._actionRunner = new Zb(), this._actionRunnerDisposables.add(this._actionRunner)), this._actionRunnerDisposables.add(this._actionRunner.onDidRun((r) => this._onDidRun.fire(r))), this._actionRunnerDisposables.add(this._actionRunner.onWillRun((r) => this._onWillRun.fire(r))), this.viewItems = [], this.focusedItem = void 0, this.domNode = document.createElement("div"), this.domNode.className = "monaco-action-bar"; let i, n; switch (this._orientation) { case 0: @@ -49119,46 +49119,46 @@ class Yo extends R { ], this.domNode.className += " vertical"; break; } - this._register(z(this.domNode, ie.KEY_DOWN, (l) => { - const a = new Vt(l); - let c = !0; - const d = typeof this.focusedItem == "number" ? this.viewItems[this.focusedItem] : void 0; - i && (a.equals(i[0]) || a.equals(i[1])) ? c = this.focusPrevious() : n && (a.equals(n[0]) || a.equals(n[1])) ? c = this.focusNext() : a.equals( + this._register(z(this.domNode, ie.KEY_DOWN, (r) => { + const c = new Yt(r); + let d = !0; + const a = typeof this.focusedItem == "number" ? this.viewItems[this.focusedItem] : void 0; + i && (c.equals(i[0]) || c.equals(i[1])) ? d = this.focusPrevious() : n && (c.equals(n[0]) || c.equals(n[1])) ? d = this.focusNext() : c.equals( 9 /* KeyCode.Escape */ - ) && this.cancelHasListener ? this._onDidCancel.fire() : a.equals( + ) && this.cancelHasListener ? this._onDidCancel.fire() : c.equals( 14 /* KeyCode.Home */ - ) ? c = this.focusFirst() : a.equals( + ) ? d = this.focusFirst() : c.equals( 13 /* KeyCode.End */ - ) ? c = this.focusLast() : a.equals( + ) ? d = this.focusLast() : c.equals( 2 /* KeyCode.Tab */ - ) && d instanceof yl && d.trapsArrowNavigation ? c = this.focusNext(void 0, !0) : this.isTriggerKeyEvent(a) ? this._triggerKeys.keyDown ? this.doTrigger(a) : this.triggerKeyDown = !0 : c = !1, c && (a.preventDefault(), a.stopPropagation()); - })), this._register(z(this.domNode, ie.KEY_UP, (l) => { - const a = new Vt(l); - this.isTriggerKeyEvent(a) ? (!this._triggerKeys.keyDown && this.triggerKeyDown && (this.triggerKeyDown = !1, this.doTrigger(a)), a.preventDefault(), a.stopPropagation()) : (a.equals( + ) && a instanceof Xr && a.trapsArrowNavigation ? d = this.focusNext(void 0, !0) : this.isTriggerKeyEvent(c) ? this._triggerKeys.keyDown ? this.doTrigger(c) : this.triggerKeyDown = !0 : d = !1, d && (c.preventDefault(), c.stopPropagation()); + })), this._register(z(this.domNode, ie.KEY_UP, (r) => { + const c = new Yt(r); + this.isTriggerKeyEvent(c) ? (!this._triggerKeys.keyDown && this.triggerKeyDown && (this.triggerKeyDown = !1, this.doTrigger(c)), c.preventDefault(), c.stopPropagation()) : (c.equals( 2 /* KeyCode.Tab */ - ) || a.equals( + ) || c.equals( 1026 /* KeyCode.Tab */ - ) || a.equals( + ) || c.equals( 16 /* KeyCode.UpArrow */ - ) || a.equals( + ) || c.equals( 18 /* KeyCode.DownArrow */ - ) || a.equals( + ) || c.equals( 15 /* KeyCode.LeftArrow */ - ) || a.equals( + ) || c.equals( 17 /* KeyCode.RightArrow */ )) && this.updateFocusedItem(); - })), this.focusTracker = this._register(vl(this.domNode)), this._register(this.focusTracker.onDidBlur(() => { - (_n() === this.domNode || !Ji(_n(), this.domNode)) && (this._onDidBlur.fire(), this.previouslyFocusedItem = this.focusedItem, this.focusedItem = void 0, this.triggerKeyDown = !1); + })), this.focusTracker = this._register(kr(this.domNode)), this._register(this.focusTracker.onDidBlur(() => { + (Cn() === this.domNode || !_i(Cn(), this.domNode)) && (this._onDidBlur.fire(), this.previouslyFocusedItem = this.focusedItem, this.focusedItem = void 0, this.triggerKeyDown = !1); })), this._register(this.focusTracker.onDidFocus(() => this.updateFocusedItem())), this.actionsList = document.createElement("ul"), this.actionsList.className = "actions-container", this.options.highlightToggledItems && this.actionsList.classList.add("highlight-toggled"), this.actionsList.setAttribute("role", this.options.ariaRole || "toolbar"), this.options.ariaLabel && this.actionsList.setAttribute("aria-label", this.options.ariaLabel), this.domNode.appendChild(this.actionsList), e.appendChild(this.domNode); } refreshRole() { @@ -49169,11 +49169,11 @@ class Yo extends R { // When an action bar is focusable again, make sure the first item can be focused setFocusable(e) { if (this.focusable = e, this.focusable) { - const t = this.viewItems.find((i) => i instanceof yl && i.isEnabled()); - t instanceof yl && t.setFocusable(!0); + const t = this.viewItems.find((i) => i instanceof Xr && i.isEnabled()); + t instanceof Xr && t.setFocusable(!0); } else this.viewItems.forEach((t) => { - t instanceof yl && t.setFocusable(!1); + t instanceof Xr && t.setFocusable(!1); }); } isTriggerKeyEvent(e) { @@ -49186,7 +49186,7 @@ class Yo extends R { var e, t; for (let i = 0; i < this.actionsList.children.length; i++) { const n = this.actionsList.children[i]; - if (Ji(_n(), n)) { + if (_i(Cn(), n)) { this.focusedItem = i, (t = (e = this.viewItems[this.focusedItem]) == null ? void 0 : e.showHover) == null || t.call(e); break; } @@ -49211,7 +49211,7 @@ class Yo extends R { var t; if (typeof e == "number") return (t = this.viewItems[e]) == null ? void 0 : t.action; - if (Ki(e)) { + if (Oi(e)) { for (; e.parentElement !== this.actionsList; ) { if (!e.parentElement) return; @@ -49224,19 +49224,19 @@ class Yo extends R { } push(e, t = {}) { const i = Array.isArray(e) ? e : [e]; - let n = Mh(t.index) ? t.index : null; + let n = Rh(t.index) ? t.index : null; i.forEach((o) => { - const r = document.createElement("li"); - r.className = "action-item", r.setAttribute("role", "presentation"); - let l; - const a = { hoverDelegate: this._hoverDelegate, ...t, isTabList: this.options.ariaRole === "tablist" }; - this.options.actionViewItemProvider && (l = this.options.actionViewItemProvider(o, a)), l || (l = new Sb(this.context, o, a)), this.options.allowContextMenu || this.viewItemDisposables.set(l, z(r, ie.CONTEXT_MENU, (c) => { - tt.stop(c, !0); - })), l.actionRunner = this._actionRunner, l.setActionContext(this.context), l.render(r), this.focusable && l instanceof yl && this.viewItems.length === 0 && l.setFocusable(!0), n === null || n < 0 || n >= this.actionsList.children.length ? (this.actionsList.appendChild(r), this.viewItems.push(l)) : (this.actionsList.insertBefore(r, this.actionsList.children[n]), this.viewItems.splice(n, 0, l), n++); + const l = document.createElement("li"); + l.className = "action-item", l.setAttribute("role", "presentation"); + let r; + const c = { hoverDelegate: this._hoverDelegate, ...t, isTabList: this.options.ariaRole === "tablist" }; + this.options.actionViewItemProvider && (r = this.options.actionViewItemProvider(o, c)), r || (r = new xZ(this.context, o, c)), this.options.allowContextMenu || this.viewItemDisposables.set(r, z(l, ie.CONTEXT_MENU, (d) => { + tt.stop(d, !0); + })), r.actionRunner = this._actionRunner, r.setActionContext(this.context), r.render(l), this.focusable && r instanceof Xr && this.viewItems.length === 0 && r.setFocusable(!0), n === null || n < 0 || n >= this.actionsList.children.length ? (this.actionsList.appendChild(l), this.viewItems.push(r)) : (this.actionsList.insertBefore(l, this.actionsList.children[n]), this.viewItems.splice(n, 0, r), n++); }), typeof this.focusedItem == "number" && this.focus(this.focusedItem), this.refreshRole(); } clear() { - this.isEmpty() || (this.viewItems = Wt(this.viewItems), this.viewItemDisposables.clearAndDisposeAll(), gn(this.actionsList), this.refreshRole()); + this.isEmpty() || (this.viewItems = Nt(this.viewItems), this.viewItemDisposables.clearAndDisposeAll(), bn(this.actionsList), this.refreshRole()); } length() { return this.viewItems.length; @@ -49269,7 +49269,7 @@ class Yo extends R { if (!e && this.options.preventLoopNavigation && this.focusedItem + 1 >= this.viewItems.length) return this.focusedItem = i, !1; this.focusedItem = (this.focusedItem + 1) % this.viewItems.length, n = this.viewItems[this.focusedItem]; - } while (this.focusedItem !== i && (this.options.focusOnlyEnabledItems && !n.isEnabled() || n.action.id === Qi.ID)); + } while (this.focusedItem !== i && (this.options.focusOnlyEnabledItems && !n.isEnabled() || n.action.id === ji.ID)); return this.updateFocus(void 0, void 0, t), !0; } focusPrevious(e) { @@ -49286,23 +49286,23 @@ class Yo extends R { this.focusedItem = this.viewItems.length - 1; } i = this.viewItems[this.focusedItem]; - } while (this.focusedItem !== t && (this.options.focusOnlyEnabledItems && !i.isEnabled() || i.action.id === Qi.ID)); + } while (this.focusedItem !== t && (this.options.focusOnlyEnabledItems && !i.isEnabled() || i.action.id === ji.ID)); return this.updateFocus(!0), !0; } updateFocus(e, t, i = !1) { - var o, r; + var o, l; typeof this.focusedItem > "u" && this.actionsList.focus({ preventScroll: t }), this.previouslyFocusedItem !== void 0 && this.previouslyFocusedItem !== this.focusedItem && ((o = this.viewItems[this.previouslyFocusedItem]) == null || o.blur()); const n = this.focusedItem !== void 0 ? this.viewItems[this.focusedItem] : void 0; if (n) { - let l = !0; - QL(n.focus) || (l = !1), this.options.focusOnlyEnabledItems && QL(n.isEnabled) && !n.isEnabled() && (l = !1), n.action.id === Qi.ID && (l = !1), l ? (i || this.previouslyFocusedItem !== this.focusedItem) && (n.focus(e), this.previouslyFocusedItem = this.focusedItem) : (this.actionsList.focus({ preventScroll: t }), this.previouslyFocusedItem = void 0), l && ((r = n.showHover) == null || r.call(n)); + let r = !0; + hV(n.focus) || (r = !1), this.options.focusOnlyEnabledItems && hV(n.isEnabled) && !n.isEnabled() && (r = !1), n.action.id === ji.ID && (r = !1), r ? (i || this.previouslyFocusedItem !== this.focusedItem) && (n.focus(e), this.previouslyFocusedItem = this.focusedItem) : (this.actionsList.focus({ preventScroll: t }), this.previouslyFocusedItem = void 0), r && ((l = n.showHover) == null || l.call(n)); } } doTrigger(e) { if (typeof this.focusedItem > "u") return; const t = this.viewItems[this.focusedItem]; - if (t instanceof yl) { + if (t instanceof Xr) { const i = t._context === null || t._context === void 0 ? e : t._context; this.run(t._action, i); } @@ -49311,29 +49311,29 @@ class Yo extends R { await this._actionRunner.run(e, t); } dispose() { - this._context = void 0, this.viewItems = Wt(this.viewItems), this.getContainer().remove(), super.dispose(); + this._context = void 0, this.viewItems = Nt(this.viewItems), this.getContainer().remove(), super.dispose(); } } -function mue(s, e, t, i) { +function lme(s, e, t, i) { if (s.length === 0) return e; if (e.length === 0) return s; const n = []; - let o = 0, r = 0; - for (; o < s.length && r < e.length; ) { - const l = s[o], a = e[r], c = t(l), d = t(a); - c < d ? (n.push(l), o++) : c > d ? (n.push(a), r++) : (n.push(i(l, a)), o++, r++); + let o = 0, l = 0; + for (; o < s.length && l < e.length; ) { + const r = s[o], c = e[l], d = t(r), a = t(c); + d < a ? (n.push(r), o++) : d > a ? (n.push(c), l++) : (n.push(i(r, c)), o++, l++); } for (; o < s.length; ) n.push(s[o]), o++; - for (; r < e.length; ) - n.push(e[r]), r++; + for (; l < e.length; ) + n.push(e[l]), l++; return n; } -function $A(s, e) { - const t = new U(), i = s.createDecorationsCollection(); - return t.add(MC({ debugName: () => `Apply decorations from ${e.debugName}` }, (n) => { +function bL(s, e) { + const t = new _(), i = s.createDecorationsCollection(); + return t.add(HG({ debugName: () => `Apply decorations from ${e.debugName}` }, (n) => { const o = e.read(n); i.set(o); })), t.add({ @@ -49342,17 +49342,17 @@ function $A(s, e) { } }), t; } -function zp(s, e) { - return s.appendChild(e), Ce(() => { +function _p(s, e) { + return s.appendChild(e), We(() => { e.remove(); }); } -function pue(s, e) { - return s.prepend(e), Ce(() => { +function rme(s, e) { + return s.prepend(e), We(() => { e.remove(); }); } -class jK extends R { +class MO extends J { get width() { return this._width; } @@ -49363,7 +49363,7 @@ class jK extends R { return this._automaticLayout; } constructor(e, t) { - super(), this._automaticLayout = !1, this.elementSizeObserver = this._register(new BJ(e, t)), this._width = Oe(this, this.elementSizeObserver.getWidth()), this._height = Oe(this, this.elementSizeObserver.getHeight()), this._register(this.elementSizeObserver.onDidChange((i) => oi((n) => { + super(), this._automaticLayout = !1, this.elementSizeObserver = this._register(new S_(e, t)), this._width = Ue(this, this.elementSizeObserver.getWidth()), this._height = Ue(this, this.elementSizeObserver.getHeight()), this._register(this.elementSizeObserver.onDidChange((i) => li((n) => { this._width.set(this.elementSizeObserver.getWidth(), n), this._height.set(this.elementSizeObserver.getHeight(), n); }))); } @@ -49374,50 +49374,50 @@ class jK extends R { this._automaticLayout = e, e ? this.elementSizeObserver.startObserving() : this.elementSizeObserver.stopObserving(); } } -function az(s, e, t) { +function Mz(s, e, t) { let i = e.get(), n = i, o = i; - const r = Oe("animatedValue", i); - let l = -1; - const a = 300; - let c; - t.add(ZC({ + const l = Ue("animatedValue", i); + let r = -1; + const c = 300; + let d; + t.add(EG({ createEmptyChangeSummary: () => ({ animate: !1 }), handleChange: (h, u) => (h.didChange(e) && (u.animate = u.animate || h.change), !0) }, (h, u) => { - c !== void 0 && (s.cancelAnimationFrame(c), c = void 0), n = o, i = e.read(h), l = Date.now() - (u.animate ? 0 : a), d(); + d !== void 0 && (s.cancelAnimationFrame(d), d = void 0), n = o, i = e.read(h), r = Date.now() - (u.animate ? 0 : c), a(); })); - function d() { - const h = Date.now() - l; - o = Math.floor(fue(h, n, i - n, a)), h < a ? c = s.requestAnimationFrame(d) : o = i, r.set(o, void 0); + function a() { + const h = Date.now() - r; + o = Math.floor(cme(h, n, i - n, c)), h < c ? d = s.requestAnimationFrame(a) : o = i, l.set(o, void 0); } - return r; + return l; } -function fue(s, e, t, i) { +function cme(s, e, t, i) { return s === i ? e + t : t * (-Math.pow(2, -10 * s / i) + 1) + e; } -class WX extends R { +class tH extends J { constructor(e, t, i) { - super(), this._register(new nT(e, i)), this._register(Uc(i, { + super(), this._register(new LT(e, i)), this._register(qd(i, { height: t.actualHeight, top: t.actualTop })); } } -class Pp { +class Qp { get afterLineNumber() { return this._afterLineNumber.get(); } constructor(e, t) { - this._afterLineNumber = e, this.heightInPx = t, this.domNode = document.createElement("div"), this._actualTop = Oe(this, void 0), this._actualHeight = Oe(this, void 0), this.actualTop = this._actualTop, this.actualHeight = this._actualHeight, this.showInHiddenAreas = !0, this.onChange = this._afterLineNumber, this.onDomNodeTop = (i) => { + this._afterLineNumber = e, this.heightInPx = t, this.domNode = document.createElement("div"), this._actualTop = Ue(this, void 0), this._actualHeight = Ue(this, void 0), this.actualTop = this._actualTop, this.actualHeight = this._actualHeight, this.showInHiddenAreas = !0, this.onChange = this._afterLineNumber, this.onDomNodeTop = (i) => { this._actualTop.set(i, void 0); }, this.onComputedHeight = (i) => { this._actualHeight.set(i, void 0); }; } } -const wZ = class wZ { +const Y2 = class Y2 { constructor(e, t) { - this._editor = e, this._domElement = t, this._overlayWidgetId = `managedOverlayWidget-${wZ._counter++}`, this._overlayWidget = { + this._editor = e, this._domElement = t, this._overlayWidgetId = `managedOverlayWidget-${Y2._counter++}`, this._overlayWidget = { getId: () => this._overlayWidgetId, getDomNode: () => this._domElement, getPosition: () => null @@ -49427,98 +49427,98 @@ const wZ = class wZ { this._editor.removeOverlayWidget(this._overlayWidget); } }; -wZ._counter = 0; -let nT = wZ; -function Uc(s, e) { +Y2._counter = 0; +let LT = Y2; +function qd(s, e) { return Te((t) => { for (let [i, n] of Object.entries(e)) n && typeof n == "object" && "read" in n && (n = n.read(t)), typeof n == "number" && (n = `${n}px`), i = i.replace(/[A-Z]/g, (o) => "-" + o.toLowerCase()), s.style[i] = n; }); } -function ex(s, e, t, i) { - const n = new U(), o = []; - return n.add(ks((r, l) => { - const a = e.read(r), c = /* @__PURE__ */ new Map(), d = /* @__PURE__ */ new Map(); +function pL(s, e, t, i) { + const n = new _(), o = []; + return n.add(Js((l, r) => { + const c = e.read(l), d = /* @__PURE__ */ new Map(), a = /* @__PURE__ */ new Map(); t && t(!0), s.changeViewZones((h) => { for (const u of o) h.removeZone(u), i == null || i.delete(u); o.length = 0; - for (const u of a) { - const g = h.addZone(u); - u.setZoneId && u.setZoneId(g), o.push(g), i == null || i.add(g), c.set(u, g); + for (const u of c) { + const m = h.addZone(u); + u.setZoneId && u.setZoneId(m), o.push(m), i == null || i.add(m), d.set(u, m); } - }), t && t(!1), l.add(ZC({ + }), t && t(!1), r.add(EG({ createEmptyChangeSummary() { return { zoneIds: [] }; }, handleChange(h, u) { - const g = d.get(h.changedObservable); - return g !== void 0 && u.zoneIds.push(g), !0; + const m = a.get(h.changedObservable); + return m !== void 0 && u.zoneIds.push(m), !0; } }, (h, u) => { - for (const g of a) - g.onChange && (d.set(g.onChange, c.get(g)), g.onChange.read(h)); - t && t(!0), s.changeViewZones((g) => { - for (const m of u.zoneIds) - g.layoutZone(m); + for (const m of c) + m.onChange && (a.set(m.onChange, d.get(m)), m.onChange.read(h)); + t && t(!0), s.changeViewZones((m) => { + for (const b of u.zoneIds) + m.layoutZone(b); }), t && t(!1); })); })), n.add({ dispose() { - t && t(!0), s.changeViewZones((r) => { - for (const l of o) - r.removeZone(l); + t && t(!0), s.changeViewZones((l) => { + for (const r of o) + l.removeZone(r); }), i == null || i.clear(), t && t(!1); } }), n; } -class bue extends mi { +class dme extends pi { dispose() { super.dispose(!0); } } -function cz(s, e) { - const t = GA(e, (n) => n.original.startLineNumber <= s.lineNumber); +function Yz(s, e) { + const t = jV(e, (n) => n.original.startLineNumber <= s.lineNumber); if (!t) - return M.fromPositions(s); + return I.fromPositions(s); if (t.original.endLineNumberExclusive <= s.lineNumber) { const n = s.lineNumber - t.original.endLineNumberExclusive + t.modified.endLineNumberExclusive; - return M.fromPositions(new V(n, s.column)); + return I.fromPositions(new Y(n, s.column)); } if (!t.innerChanges) - return M.fromPositions(new V(t.modified.startLineNumber, 1)); - const i = GA(t.innerChanges, (n) => n.originalRange.getStartPosition().isBeforeOrEqual(s)); + return I.fromPositions(new Y(t.modified.startLineNumber, 1)); + const i = jV(t.innerChanges, (n) => n.originalRange.getStartPosition().isBeforeOrEqual(s)); if (!i) { const n = s.lineNumber - t.original.startLineNumber + t.modified.startLineNumber; - return M.fromPositions(new V(n, s.column)); + return I.fromPositions(new Y(n, s.column)); } if (i.originalRange.containsPosition(s)) return i.modifiedRange; { - const n = yue(i.originalRange.getEndPosition(), s); - return M.fromPositions(n.addToPosition(i.modifiedRange.getEndPosition())); + const n = ame(i.originalRange.getEndPosition(), s); + return I.fromPositions(n.addToPosition(i.modifiedRange.getEndPosition())); } } -function yue(s, e) { - return s.lineNumber === e.lineNumber ? new Ur(0, e.column - s.column) : new Ur(e.lineNumber - s.lineNumber, e.column - 1); +function ame(s, e) { + return s.lineNumber === e.lineNumber ? new jl(0, e.column - s.column) : new jl(e.lineNumber - s.lineNumber, e.column - 1); } -function wue(s, e) { +function hme(s, e) { let t; return s.filter((i) => { const n = e(i, t); return t = i, n; }); } -class tx { +class gL { static create(e, t = void 0) { - return new dz(e, e, t); + return new kz(e, e, t); } static createWithDisposable(e, t, i = void 0) { - const n = new U(); - return n.add(t), n.add(e), new dz(e, n, i); + const n = new _(); + return n.add(t), n.add(e), new kz(e, n, i); } } -class dz extends tx { +class kz extends gL { constructor(e, t, i) { super(), this.object = e, this._disposable = t, this._debugOwner = i, this._refCount = 1, this._isDisposed = !1, this._owners = [], i && this._addOwner(i); } @@ -49526,7 +49526,7 @@ class dz extends tx { e && this._owners.push(e); } createNewRef(e) { - return this._refCount++, e && this._addOwner(e), new Cue(this, e); + return this._refCount++, e && this._addOwner(e), new ume(this, e); } dispose() { this._isDisposed || (this._isDisposed = !0, this._decreaseRefCount(this._debugOwner)); @@ -49538,7 +49538,7 @@ class dz extends tx { } } } -class Cue extends tx { +class ume extends gL { constructor(e, t) { super(), this._base = e, this._debugOwner = t, this._isDisposed = !1; } @@ -49552,7 +49552,7 @@ class Cue extends tx { this._isDisposed || (this._isDisposed = !0, this._base._decreaseRefCount(this._debugOwner)); } } -class Sue { +class mme { constructor(e) { this.text = e, this.lineStartOffsetByLineIdx = [], this.lineStartOffsetByLineIdx.push(0); for (let t = 0; t < e.length; t++) @@ -49563,44 +49563,44 @@ class Sue { return this.lineStartOffsetByLineIdx[e.lineNumber - 1] + e.column - 1; } getOffsetRange(e) { - return new He(this.getOffset(e.getStartPosition()), this.getOffset(e.getEndPosition())); + return new Pe(this.getOffset(e.getStartPosition()), this.getOffset(e.getEndPosition())); } get textLength() { const e = this.lineStartOffsetByLineIdx.length - 1; - return new Ur(e, this.text.length - this.lineStartOffsetByLineIdx[e]); + return new jl(e, this.text.length - this.lineStartOffsetByLineIdx[e]); } } -let vX = class { +let iH = class { constructor(e) { - this.edits = e, gm(() => gE(e, (t, i) => t.range.getEndPosition().isBeforeOrEqual(i.range.getStartPosition()))); + this.edits = e, fb(() => Hv(e, (t, i) => t.range.getEndPosition().isBeforeOrEqual(i.range.getStartPosition()))); } apply(e) { - let t = "", i = new V(1, 1); + let t = "", i = new Y(1, 1); for (const o of this.edits) { - const r = o.range, l = r.getStartPosition(), a = r.getEndPosition(), c = hz(i, l); - c.isEmpty() || (t += e.getValueOfRange(c)), t += o.text, i = a; + const l = o.range, r = l.getStartPosition(), c = l.getEndPosition(), d = vz(i, r); + d.isEmpty() || (t += e.getValueOfRange(d)), t += o.text, i = c; } - const n = hz(i, e.endPositionExclusive); + const n = vz(i, e.endPositionExclusive); return n.isEmpty() || (t += e.getValueOfRange(n)), t; } applyToString(e) { - const t = new Lue(e); + const t = new bme(e); return this.apply(t); } getNewRanges() { const e = []; let t = 0, i = 0, n = 0; for (const o of this.edits) { - const r = Ur.ofText(o.text), l = V.lift({ + const l = jl.ofText(o.text), r = Y.lift({ lineNumber: o.range.startLineNumber + i, column: o.range.startColumn + (o.range.startLineNumber === t ? n : 0) - }), a = r.createRange(l); - e.push(a), i = a.endLineNumber - o.range.endLineNumber, n = a.endColumn - o.range.endColumn, t = o.range.endLineNumber; + }), c = l.createRange(r); + e.push(c), i = c.endLineNumber - o.range.endLineNumber, n = c.endColumn - o.range.endColumn, t = o.range.endLineNumber; } return e; } }; -class ka { +class Ec { constructor(e, t) { this.range = e, this.text = t; } @@ -49611,21 +49611,21 @@ class ka { }; } } -function hz(s, e) { +function vz(s, e) { if (s.lineNumber === e.lineNumber && s.column === Number.MAX_SAFE_INTEGER) - return M.fromPositions(e, e); + return I.fromPositions(e, e); if (!s.isBeforeOrEqual(e)) - throw new mt("start must be before end"); - return new M(s.lineNumber, s.column, e.lineNumber, e.column); + throw new bt("start must be before end"); + return new I(s.lineNumber, s.column, e.lineNumber, e.column); } -class qK { +class YO { get endPositionExclusive() { - return this.length.addToPosition(new V(1, 1)); + return this.length.addToPosition(new Y(1, 1)); } } -class Lue extends qK { +class bme extends YO { constructor(e) { - super(), this.value = e, this._t = new Sue(this.value); + super(), this.value = e, this._t = new mme(this.value); } getValueOfRange(e) { return this._t.getOffsetRange(e).substring(this.value); @@ -49634,22 +49634,22 @@ class Lue extends qK { return this._t.textLength; } } -class Qn { +class qn { static inverse(e, t, i) { const n = []; - let o = 1, r = 1; - for (const a of e) { - const c = new Qn(new We(o, a.original.startLineNumber), new We(r, a.modified.startLineNumber)); - c.modified.isEmpty || n.push(c), o = a.original.endLineNumberExclusive, r = a.modified.endLineNumberExclusive; + let o = 1, l = 1; + for (const c of e) { + const d = new qn(new Ne(o, c.original.startLineNumber), new Ne(l, c.modified.startLineNumber)); + d.modified.isEmpty || n.push(d), o = c.original.endLineNumberExclusive, l = c.modified.endLineNumberExclusive; } - const l = new Qn(new We(o, t + 1), new We(r, i + 1)); - return l.modified.isEmpty || n.push(l), n; + const r = new qn(new Ne(o, t + 1), new Ne(l, i + 1)); + return r.modified.isEmpty || n.push(r), n; } static clip(e, t, i) { const n = []; for (const o of e) { - const r = o.original.intersect(t), l = o.modified.intersect(i); - r && !r.isEmpty && l && !l.isEmpty && n.push(new Qn(r, l)); + const l = o.original.intersect(t), r = o.modified.intersect(i); + l && !l.isEmpty && r && !r.isEmpty && n.push(new qn(l, r)); } return n; } @@ -49660,10 +49660,10 @@ class Qn { return `{${this.original.toString()}->${this.modified.toString()}}`; } flip() { - return new Qn(this.modified, this.original); + return new qn(this.modified, this.original); } join(e) { - return new Qn(this.original.join(e.original), this.modified.join(e.modified)); + return new qn(this.original.join(e.original), this.modified.join(e.modified)); } /** * This method assumes that the LineRangeMapping describes a valid diff! @@ -49673,13 +49673,13 @@ class Qn { toRangeMapping() { const e = this.original.toInclusiveRange(), t = this.modified.toInclusiveRange(); if (e && t) - return new Wo(e, t); + return new To(e, t); if (this.original.startLineNumber === 1 || this.modified.startLineNumber === 1) { if (!(this.modified.startLineNumber === 1 && this.original.startLineNumber === 1)) - throw new mt("not a valid diff"); - return new Wo(new M(this.original.startLineNumber, 1, this.original.endLineNumberExclusive, 1), new M(this.modified.startLineNumber, 1, this.modified.endLineNumberExclusive, 1)); + throw new bt("not a valid diff"); + return new To(new I(this.original.startLineNumber, 1, this.original.endLineNumberExclusive, 1), new I(this.modified.startLineNumber, 1, this.modified.endLineNumberExclusive, 1)); } else - return new Wo(new M(this.original.startLineNumber - 1, Number.MAX_SAFE_INTEGER, this.original.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), new M(this.modified.startLineNumber - 1, Number.MAX_SAFE_INTEGER, this.modified.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER)); + return new To(new I(this.original.startLineNumber - 1, Number.MAX_SAFE_INTEGER, this.original.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), new I(this.modified.startLineNumber - 1, Number.MAX_SAFE_INTEGER, this.modified.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER)); } /** * This method assumes that the LineRangeMapping describes a valid diff! @@ -49687,48 +49687,48 @@ class Qn { * It avoids various problems when the line range points to non-existing line-numbers. */ toRangeMapping2(e, t) { - if (uz(this.original.endLineNumberExclusive, e) && uz(this.modified.endLineNumberExclusive, t)) - return new Wo(new M(this.original.startLineNumber, 1, this.original.endLineNumberExclusive, 1), new M(this.modified.startLineNumber, 1, this.modified.endLineNumberExclusive, 1)); + if (Jz(this.original.endLineNumberExclusive, e) && Jz(this.modified.endLineNumberExclusive, t)) + return new To(new I(this.original.startLineNumber, 1, this.original.endLineNumberExclusive, 1), new I(this.modified.startLineNumber, 1, this.modified.endLineNumberExclusive, 1)); if (!this.original.isEmpty && !this.modified.isEmpty) - return new Wo(M.fromPositions(new V(this.original.startLineNumber, 1), ap(new V(this.original.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), e)), M.fromPositions(new V(this.modified.startLineNumber, 1), ap(new V(this.modified.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), t))); + return new To(I.fromPositions(new Y(this.original.startLineNumber, 1), mp(new Y(this.original.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), e)), I.fromPositions(new Y(this.modified.startLineNumber, 1), mp(new Y(this.modified.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), t))); if (this.original.startLineNumber > 1 && this.modified.startLineNumber > 1) - return new Wo(M.fromPositions(ap(new V(this.original.startLineNumber - 1, Number.MAX_SAFE_INTEGER), e), ap(new V(this.original.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), e)), M.fromPositions(ap(new V(this.modified.startLineNumber - 1, Number.MAX_SAFE_INTEGER), t), ap(new V(this.modified.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), t))); - throw new mt(); + return new To(I.fromPositions(mp(new Y(this.original.startLineNumber - 1, Number.MAX_SAFE_INTEGER), e), mp(new Y(this.original.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), e)), I.fromPositions(mp(new Y(this.modified.startLineNumber - 1, Number.MAX_SAFE_INTEGER), t), mp(new Y(this.modified.endLineNumberExclusive - 1, Number.MAX_SAFE_INTEGER), t))); + throw new bt(); } } -function ap(s, e) { +function mp(s, e) { if (s.lineNumber < 1) - return new V(1, 1); + return new Y(1, 1); if (s.lineNumber > e.length) - return new V(e.length, e[e.length - 1].length + 1); + return new Y(e.length, e[e.length - 1].length + 1); const t = e[s.lineNumber - 1]; - return s.column > t.length + 1 ? new V(s.lineNumber, t.length + 1) : s; + return s.column > t.length + 1 ? new Y(s.lineNumber, t.length + 1) : s; } -function uz(s, e) { +function Jz(s, e) { return s >= 1 && s <= e.length; } -class zo extends Qn { +class Ko extends qn { static fromRangeMappings(e) { - const t = We.join(e.map((n) => We.fromRangeInclusive(n.originalRange))), i = We.join(e.map((n) => We.fromRangeInclusive(n.modifiedRange))); - return new zo(t, i, e); + const t = Ne.join(e.map((n) => Ne.fromRangeInclusive(n.originalRange))), i = Ne.join(e.map((n) => Ne.fromRangeInclusive(n.modifiedRange))); + return new Ko(t, i, e); } constructor(e, t, i) { super(e, t), this.innerChanges = i; } flip() { var e; - return new zo(this.modified, this.original, (e = this.innerChanges) == null ? void 0 : e.map((t) => t.flip())); + return new Ko(this.modified, this.original, (e = this.innerChanges) == null ? void 0 : e.map((t) => t.flip())); } withInnerChangesFromLineRanges() { - return new zo(this.original, this.modified, [this.toRangeMapping()]); + return new Ko(this.original, this.modified, [this.toRangeMapping()]); } } -class Wo { +class To { static assertSorted(e) { for (let t = 1; t < e.length; t++) { const i = e[t - 1], n = e[t]; if (!(i.originalRange.getEndPosition().isBeforeOrEqual(n.originalRange.getStartPosition()) && i.modifiedRange.getEndPosition().isBeforeOrEqual(n.modifiedRange.getStartPosition()))) - throw new mt("Range mappings must be sorted"); + throw new bt("Range mappings must be sorted"); } } constructor(e, t) { @@ -49738,17 +49738,17 @@ class Wo { return `{${this.originalRange.toString()}->${this.modifiedRange.toString()}}`; } flip() { - return new Wo(this.modifiedRange, this.originalRange); + return new To(this.modifiedRange, this.originalRange); } /** * Creates a single text edit that describes the change from the original to the modified text. */ toTextEdit(e) { const t = e.getValueOfRange(this.modifiedRange); - return new ka(this.originalRange, t); + return new Ec(this.originalRange, t); } } -const jh = $e("accessibilitySignalService"), ut = class ut { +const tu = $e("accessibilitySignalService"), ut = class ut { static register(e) { return new ut(e.fileName); } @@ -49757,217 +49757,217 @@ const jh = $e("accessibilitySignalService"), ut = class ut { } }; ut.error = ut.register({ fileName: "error.mp3" }), ut.warning = ut.register({ fileName: "warning.mp3" }), ut.success = ut.register({ fileName: "success.mp3" }), ut.foldedArea = ut.register({ fileName: "foldedAreas.mp3" }), ut.break = ut.register({ fileName: "break.mp3" }), ut.quickFixes = ut.register({ fileName: "quickFixes.mp3" }), ut.taskCompleted = ut.register({ fileName: "taskCompleted.mp3" }), ut.taskFailed = ut.register({ fileName: "taskFailed.mp3" }), ut.terminalBell = ut.register({ fileName: "terminalBell.mp3" }), ut.diffLineInserted = ut.register({ fileName: "diffLineInserted.mp3" }), ut.diffLineDeleted = ut.register({ fileName: "diffLineDeleted.mp3" }), ut.diffLineModified = ut.register({ fileName: "diffLineModified.mp3" }), ut.chatRequestSent = ut.register({ fileName: "chatRequestSent.mp3" }), ut.chatResponseReceived1 = ut.register({ fileName: "chatResponseReceived1.mp3" }), ut.chatResponseReceived2 = ut.register({ fileName: "chatResponseReceived2.mp3" }), ut.chatResponseReceived3 = ut.register({ fileName: "chatResponseReceived3.mp3" }), ut.chatResponseReceived4 = ut.register({ fileName: "chatResponseReceived4.mp3" }), ut.clear = ut.register({ fileName: "clear.mp3" }), ut.save = ut.register({ fileName: "save.mp3" }), ut.format = ut.register({ fileName: "format.mp3" }), ut.voiceRecordingStarted = ut.register({ fileName: "voiceRecordingStarted.mp3" }), ut.voiceRecordingStopped = ut.register({ fileName: "voiceRecordingStopped.mp3" }), ut.progress = ut.register({ fileName: "progress.mp3" }); -let qt = ut; -class Aue { +let $t = ut; +class pme { constructor(e) { this.randomOneOf = e; } } -const Be = class Be { - constructor(e, t, i, n, o, r) { - this.sound = e, this.name = t, this.legacySoundSettingsKey = i, this.settingsKey = n, this.legacyAnnouncementSettingsKey = o, this.announcementMessage = r; +const Ke = class Ke { + constructor(e, t, i, n, o, l) { + this.sound = e, this.name = t, this.legacySoundSettingsKey = i, this.settingsKey = n, this.legacyAnnouncementSettingsKey = o, this.announcementMessage = l; } static register(e) { - const t = new Aue("randomOneOf" in e.sound ? e.sound.randomOneOf : [e.sound]), i = new Be(t, e.name, e.legacySoundSettingsKey, e.settingsKey, e.legacyAnnouncementSettingsKey, e.announcementMessage); - return Be._signals.add(i), i; + const t = new pme("randomOneOf" in e.sound ? e.sound.randomOneOf : [e.sound]), i = new Ke(t, e.name, e.legacySoundSettingsKey, e.settingsKey, e.legacyAnnouncementSettingsKey, e.announcementMessage); + return Ke._signals.add(i), i; } }; -Be._signals = /* @__PURE__ */ new Set(), Be.errorAtPosition = Be.register({ +Ke._signals = /* @__PURE__ */ new Set(), Ke.errorAtPosition = Ke.register({ name: p("accessibilitySignals.positionHasError.name", "Error at Position"), - sound: qt.error, + sound: $t.error, announcementMessage: p("accessibility.signals.positionHasError", "Error"), settingsKey: "accessibility.signals.positionHasError", delaySettingsKey: "accessibility.signalOptions.delays.errorAtPosition" -}), Be.warningAtPosition = Be.register({ +}), Ke.warningAtPosition = Ke.register({ name: p("accessibilitySignals.positionHasWarning.name", "Warning at Position"), - sound: qt.warning, + sound: $t.warning, announcementMessage: p("accessibility.signals.positionHasWarning", "Warning"), settingsKey: "accessibility.signals.positionHasWarning", delaySettingsKey: "accessibility.signalOptions.delays.warningAtPosition" -}), Be.errorOnLine = Be.register({ +}), Ke.errorOnLine = Ke.register({ name: p("accessibilitySignals.lineHasError.name", "Error on Line"), - sound: qt.error, + sound: $t.error, legacySoundSettingsKey: "audioCues.lineHasError", legacyAnnouncementSettingsKey: "accessibility.alert.error", announcementMessage: p("accessibility.signals.lineHasError", "Error on Line"), settingsKey: "accessibility.signals.lineHasError" -}), Be.warningOnLine = Be.register({ +}), Ke.warningOnLine = Ke.register({ name: p("accessibilitySignals.lineHasWarning.name", "Warning on Line"), - sound: qt.warning, + sound: $t.warning, legacySoundSettingsKey: "audioCues.lineHasWarning", legacyAnnouncementSettingsKey: "accessibility.alert.warning", announcementMessage: p("accessibility.signals.lineHasWarning", "Warning on Line"), settingsKey: "accessibility.signals.lineHasWarning" -}), Be.foldedArea = Be.register({ +}), Ke.foldedArea = Ke.register({ name: p("accessibilitySignals.lineHasFoldedArea.name", "Folded Area on Line"), - sound: qt.foldedArea, + sound: $t.foldedArea, legacySoundSettingsKey: "audioCues.lineHasFoldedArea", legacyAnnouncementSettingsKey: "accessibility.alert.foldedArea", announcementMessage: p("accessibility.signals.lineHasFoldedArea", "Folded"), settingsKey: "accessibility.signals.lineHasFoldedArea" -}), Be.break = Be.register({ +}), Ke.break = Ke.register({ name: p("accessibilitySignals.lineHasBreakpoint.name", "Breakpoint on Line"), - sound: qt.break, + sound: $t.break, legacySoundSettingsKey: "audioCues.lineHasBreakpoint", legacyAnnouncementSettingsKey: "accessibility.alert.breakpoint", announcementMessage: p("accessibility.signals.lineHasBreakpoint", "Breakpoint"), settingsKey: "accessibility.signals.lineHasBreakpoint" -}), Be.inlineSuggestion = Be.register({ +}), Ke.inlineSuggestion = Ke.register({ name: p("accessibilitySignals.lineHasInlineSuggestion.name", "Inline Suggestion on Line"), - sound: qt.quickFixes, + sound: $t.quickFixes, legacySoundSettingsKey: "audioCues.lineHasInlineSuggestion", settingsKey: "accessibility.signals.lineHasInlineSuggestion" -}), Be.terminalQuickFix = Be.register({ +}), Ke.terminalQuickFix = Ke.register({ name: p("accessibilitySignals.terminalQuickFix.name", "Terminal Quick Fix"), - sound: qt.quickFixes, + sound: $t.quickFixes, legacySoundSettingsKey: "audioCues.terminalQuickFix", legacyAnnouncementSettingsKey: "accessibility.alert.terminalQuickFix", announcementMessage: p("accessibility.signals.terminalQuickFix", "Quick Fix"), settingsKey: "accessibility.signals.terminalQuickFix" -}), Be.onDebugBreak = Be.register({ +}), Ke.onDebugBreak = Ke.register({ name: p("accessibilitySignals.onDebugBreak.name", "Debugger Stopped on Breakpoint"), - sound: qt.break, + sound: $t.break, legacySoundSettingsKey: "audioCues.onDebugBreak", legacyAnnouncementSettingsKey: "accessibility.alert.onDebugBreak", announcementMessage: p("accessibility.signals.onDebugBreak", "Breakpoint"), settingsKey: "accessibility.signals.onDebugBreak" -}), Be.noInlayHints = Be.register({ +}), Ke.noInlayHints = Ke.register({ name: p("accessibilitySignals.noInlayHints", "No Inlay Hints on Line"), - sound: qt.error, + sound: $t.error, legacySoundSettingsKey: "audioCues.noInlayHints", legacyAnnouncementSettingsKey: "accessibility.alert.noInlayHints", announcementMessage: p("accessibility.signals.noInlayHints", "No Inlay Hints"), settingsKey: "accessibility.signals.noInlayHints" -}), Be.taskCompleted = Be.register({ +}), Ke.taskCompleted = Ke.register({ name: p("accessibilitySignals.taskCompleted", "Task Completed"), - sound: qt.taskCompleted, + sound: $t.taskCompleted, legacySoundSettingsKey: "audioCues.taskCompleted", legacyAnnouncementSettingsKey: "accessibility.alert.taskCompleted", announcementMessage: p("accessibility.signals.taskCompleted", "Task Completed"), settingsKey: "accessibility.signals.taskCompleted" -}), Be.taskFailed = Be.register({ +}), Ke.taskFailed = Ke.register({ name: p("accessibilitySignals.taskFailed", "Task Failed"), - sound: qt.taskFailed, + sound: $t.taskFailed, legacySoundSettingsKey: "audioCues.taskFailed", legacyAnnouncementSettingsKey: "accessibility.alert.taskFailed", announcementMessage: p("accessibility.signals.taskFailed", "Task Failed"), settingsKey: "accessibility.signals.taskFailed" -}), Be.terminalCommandFailed = Be.register({ +}), Ke.terminalCommandFailed = Ke.register({ name: p("accessibilitySignals.terminalCommandFailed", "Terminal Command Failed"), - sound: qt.error, + sound: $t.error, legacySoundSettingsKey: "audioCues.terminalCommandFailed", legacyAnnouncementSettingsKey: "accessibility.alert.terminalCommandFailed", announcementMessage: p("accessibility.signals.terminalCommandFailed", "Command Failed"), settingsKey: "accessibility.signals.terminalCommandFailed" -}), Be.terminalCommandSucceeded = Be.register({ +}), Ke.terminalCommandSucceeded = Ke.register({ name: p("accessibilitySignals.terminalCommandSucceeded", "Terminal Command Succeeded"), - sound: qt.success, + sound: $t.success, announcementMessage: p("accessibility.signals.terminalCommandSucceeded", "Command Succeeded"), settingsKey: "accessibility.signals.terminalCommandSucceeded" -}), Be.terminalBell = Be.register({ +}), Ke.terminalBell = Ke.register({ name: p("accessibilitySignals.terminalBell", "Terminal Bell"), - sound: qt.terminalBell, + sound: $t.terminalBell, legacySoundSettingsKey: "audioCues.terminalBell", legacyAnnouncementSettingsKey: "accessibility.alert.terminalBell", announcementMessage: p("accessibility.signals.terminalBell", "Terminal Bell"), settingsKey: "accessibility.signals.terminalBell" -}), Be.notebookCellCompleted = Be.register({ +}), Ke.notebookCellCompleted = Ke.register({ name: p("accessibilitySignals.notebookCellCompleted", "Notebook Cell Completed"), - sound: qt.taskCompleted, + sound: $t.taskCompleted, legacySoundSettingsKey: "audioCues.notebookCellCompleted", legacyAnnouncementSettingsKey: "accessibility.alert.notebookCellCompleted", announcementMessage: p("accessibility.signals.notebookCellCompleted", "Notebook Cell Completed"), settingsKey: "accessibility.signals.notebookCellCompleted" -}), Be.notebookCellFailed = Be.register({ +}), Ke.notebookCellFailed = Ke.register({ name: p("accessibilitySignals.notebookCellFailed", "Notebook Cell Failed"), - sound: qt.taskFailed, + sound: $t.taskFailed, legacySoundSettingsKey: "audioCues.notebookCellFailed", legacyAnnouncementSettingsKey: "accessibility.alert.notebookCellFailed", announcementMessage: p("accessibility.signals.notebookCellFailed", "Notebook Cell Failed"), settingsKey: "accessibility.signals.notebookCellFailed" -}), Be.diffLineInserted = Be.register({ +}), Ke.diffLineInserted = Ke.register({ name: p("accessibilitySignals.diffLineInserted", "Diff Line Inserted"), - sound: qt.diffLineInserted, + sound: $t.diffLineInserted, legacySoundSettingsKey: "audioCues.diffLineInserted", settingsKey: "accessibility.signals.diffLineInserted" -}), Be.diffLineDeleted = Be.register({ +}), Ke.diffLineDeleted = Ke.register({ name: p("accessibilitySignals.diffLineDeleted", "Diff Line Deleted"), - sound: qt.diffLineDeleted, + sound: $t.diffLineDeleted, legacySoundSettingsKey: "audioCues.diffLineDeleted", settingsKey: "accessibility.signals.diffLineDeleted" -}), Be.diffLineModified = Be.register({ +}), Ke.diffLineModified = Ke.register({ name: p("accessibilitySignals.diffLineModified", "Diff Line Modified"), - sound: qt.diffLineModified, + sound: $t.diffLineModified, legacySoundSettingsKey: "audioCues.diffLineModified", settingsKey: "accessibility.signals.diffLineModified" -}), Be.chatRequestSent = Be.register({ +}), Ke.chatRequestSent = Ke.register({ name: p("accessibilitySignals.chatRequestSent", "Chat Request Sent"), - sound: qt.chatRequestSent, + sound: $t.chatRequestSent, legacySoundSettingsKey: "audioCues.chatRequestSent", legacyAnnouncementSettingsKey: "accessibility.alert.chatRequestSent", announcementMessage: p("accessibility.signals.chatRequestSent", "Chat Request Sent"), settingsKey: "accessibility.signals.chatRequestSent" -}), Be.chatResponseReceived = Be.register({ +}), Ke.chatResponseReceived = Ke.register({ name: p("accessibilitySignals.chatResponseReceived", "Chat Response Received"), legacySoundSettingsKey: "audioCues.chatResponseReceived", sound: { randomOneOf: [ - qt.chatResponseReceived1, - qt.chatResponseReceived2, - qt.chatResponseReceived3, - qt.chatResponseReceived4 + $t.chatResponseReceived1, + $t.chatResponseReceived2, + $t.chatResponseReceived3, + $t.chatResponseReceived4 ] }, settingsKey: "accessibility.signals.chatResponseReceived" -}), Be.progress = Be.register({ +}), Ke.progress = Ke.register({ name: p("accessibilitySignals.progress", "Progress"), - sound: qt.progress, + sound: $t.progress, legacySoundSettingsKey: "audioCues.chatResponsePending", legacyAnnouncementSettingsKey: "accessibility.alert.progress", announcementMessage: p("accessibility.signals.progress", "Progress"), settingsKey: "accessibility.signals.progress" -}), Be.clear = Be.register({ +}), Ke.clear = Ke.register({ name: p("accessibilitySignals.clear", "Clear"), - sound: qt.clear, + sound: $t.clear, legacySoundSettingsKey: "audioCues.clear", legacyAnnouncementSettingsKey: "accessibility.alert.clear", announcementMessage: p("accessibility.signals.clear", "Clear"), settingsKey: "accessibility.signals.clear" -}), Be.save = Be.register({ +}), Ke.save = Ke.register({ name: p("accessibilitySignals.save", "Save"), - sound: qt.save, + sound: $t.save, legacySoundSettingsKey: "audioCues.save", legacyAnnouncementSettingsKey: "accessibility.alert.save", announcementMessage: p("accessibility.signals.save", "Save"), settingsKey: "accessibility.signals.save" -}), Be.format = Be.register({ +}), Ke.format = Ke.register({ name: p("accessibilitySignals.format", "Format"), - sound: qt.format, + sound: $t.format, legacySoundSettingsKey: "audioCues.format", legacyAnnouncementSettingsKey: "accessibility.alert.format", announcementMessage: p("accessibility.signals.format", "Format"), settingsKey: "accessibility.signals.format" -}), Be.voiceRecordingStarted = Be.register({ +}), Ke.voiceRecordingStarted = Ke.register({ name: p("accessibilitySignals.voiceRecordingStarted", "Voice Recording Started"), - sound: qt.voiceRecordingStarted, + sound: $t.voiceRecordingStarted, legacySoundSettingsKey: "audioCues.voiceRecordingStarted", settingsKey: "accessibility.signals.voiceRecordingStarted" -}), Be.voiceRecordingStopped = Be.register({ +}), Ke.voiceRecordingStopped = Ke.register({ name: p("accessibilitySignals.voiceRecordingStopped", "Voice Recording Stopped"), - sound: qt.voiceRecordingStopped, + sound: $t.voiceRecordingStopped, legacySoundSettingsKey: "audioCues.voiceRecordingStopped", settingsKey: "accessibility.signals.voiceRecordingStopped" }); -let vo = Be; -const xue = { +let Mo = Ke; +const gme = { IconContribution: "base.contributions.icons" }; -var gz; +var Hz; (function(s) { function e(t, i) { let n = t.defaults; - for (; Ze.isThemeIcon(n); ) { - const o = Fm.getIcon(n.id); + for (; Se.isThemeIcon(n); ) { + const o = Ub.getIcon(n.id); if (!o) return; n = o.defaults; @@ -49975,8 +49975,8 @@ var gz; return n; } s.getDefinition = e; -})(gz || (gz = {})); -var mz; +})(Hz || (Hz = {})); +var Ez; (function(s) { function e(i) { return { @@ -49987,17 +49987,17 @@ var mz; } s.toJSONObject = e; function t(i) { - const n = (o) => Vs(o) ? o : void 0; - if (i && Array.isArray(i.src) && i.src.every((o) => Vs(o.format) && Vs(o.location))) + const n = (o) => vs(o) ? o : void 0; + if (i && Array.isArray(i.src) && i.src.every((o) => vs(o.format) && vs(o.location))) return { weight: n(i.weight), style: n(i.style), - src: i.src.map((o) => ({ format: o.format, location: Le.parse(o.location) })) + src: i.src.map((o) => ({ format: o.format, location: Xe.parse(o.location) })) }; } s.fromJSONObject = t; -})(mz || (mz = {})); -class Mue { +})(Ez || (Ez = {})); +class Zme { constructor() { this._onDidChange = new k(), this.onDidChange = this._onDidChange.event, this.iconSchema = { definitions: { @@ -50013,22 +50013,22 @@ class Mue { }, type: "object", properties: {} - }, this.iconReferenceSchema = { type: "string", pattern: `^${Ze.iconNameExpression}$`, enum: [], enumDescriptions: [] }, this.iconsById = {}, this.iconFontsById = {}; + }, this.iconReferenceSchema = { type: "string", pattern: `^${Se.iconNameExpression}$`, enum: [], enumDescriptions: [] }, this.iconsById = {}, this.iconFontsById = {}; } registerIcon(e, t, i, n) { const o = this.iconsById[e]; if (o) { if (i && !o.description) { o.description = i, this.iconSchema.properties[e].markdownDescription = `${i} $(${e})`; - const a = this.iconReferenceSchema.enum.indexOf(e); - a !== -1 && (this.iconReferenceSchema.enumDescriptions[a] = i), this._onDidChange.fire(); + const c = this.iconReferenceSchema.enum.indexOf(e); + c !== -1 && (this.iconReferenceSchema.enumDescriptions[c] = i), this._onDidChange.fire(); } return o; } - const r = { id: e, description: i, defaults: t, deprecationMessage: n }; - this.iconsById[e] = r; - const l = { $ref: "#/definitions/icons" }; - return n && (l.deprecationMessage = n), i && (l.markdownDescription = `${i}: $(${e})`), this.iconSchema.properties[e] = l, this.iconReferenceSchema.enum.push(e), this.iconReferenceSchema.enumDescriptions.push(i || ""), this._onDidChange.fire(), { id: e }; + const l = { id: e, description: i, defaults: t, deprecationMessage: n }; + this.iconsById[e] = l; + const r = { $ref: "#/definitions/icons" }; + return n && (r.deprecationMessage = n), i && (r.markdownDescription = `${i}: $(${e})`), this.iconSchema.properties[e] = r, this.iconReferenceSchema.enum.push(e), this.iconReferenceSchema.enumDescriptions.push(i || ""), this._onDidChange.fire(), { id: e }; } getIcons() { return Object.keys(this.iconsById).map((e) => this.iconsById[e]); @@ -50040,126 +50040,126 @@ class Mue { return this.iconSchema; } toString() { - const e = (o, r) => o.id.localeCompare(r.id), t = (o) => { - for (; Ze.isThemeIcon(o.defaults); ) + const e = (o, l) => o.id.localeCompare(l.id), t = (o) => { + for (; Se.isThemeIcon(o.defaults); ) o = this.iconsById[o.defaults.id]; return `codicon codicon-${o ? o.id : ""}`; }, i = []; i.push("| preview | identifier | default codicon ID | description"), i.push("| ----------- | --------------------------------- | --------------------------------- | --------------------------------- |"); const n = Object.keys(this.iconsById).map((o) => this.iconsById[o]); - for (const o of n.filter((r) => !!r.description).sort(e)) - i.push(`||${o.id}|${Ze.isThemeIcon(o.defaults) ? o.defaults.id : o.id}|${o.description || ""}|`); + for (const o of n.filter((l) => !!l.description).sort(e)) + i.push(`||${o.id}|${Se.isThemeIcon(o.defaults) ? o.defaults.id : o.id}|${o.description || ""}|`); i.push("| preview | identifier "), i.push("| ----------- | --------------------------------- |"); - for (const o of n.filter((r) => !Ze.isThemeIcon(r.defaults)).sort(e)) + for (const o of n.filter((l) => !Se.isThemeIcon(l.defaults)).sort(e)) i.push(`||${o.id}|`); return i.join(` `); } } -const Fm = new Mue(); -Di.add(xue.IconContribution, Fm); -function Bt(s, e, t, i) { - return Fm.registerIcon(s, e, t, i); +const Ub = new Zme(); +ki.add(gme.IconContribution, Ub); +function Kt(s, e, t, i) { + return Ub.registerIcon(s, e, t, i); } -function $K() { - return Fm; +function kO() { + return Ub; } -function Zue() { - const s = dJ(); +function fme() { + const s = PB(); for (const e in s) { const t = "\\" + s[e].toString(16); - Fm.registerIcon(e, { fontCharacter: t }); + Ub.registerIcon(e, { fontCharacter: t }); } } -Zue(); -const e4 = "vscode://schemas/icons", t4 = Di.as(Q_.JSONContribution); -t4.registerSchema(e4, Fm.getIconSchema()); -const pz = new Zt(() => t4.notifySchemaChanged(e4), 200); -Fm.onDidChange(() => { - pz.isScheduled() || pz.schedule(); +fme(); +const vO = "vscode://schemas/icons", JO = ki.as(hx.JSONContribution); +JO.registerSchema(vO, Ub.getIconSchema()); +const Dz = new St(() => JO.notifySchemaChanged(vO), 200); +Ub.onDidChange(() => { + Dz.isScheduled() || Dz.schedule(); }); -const i4 = Bt("widget-close", te.close, p("widgetClose", "Icon for the close action in widgets.")); -Bt("goto-previous-location", te.arrowUp, p("previousChangeIcon", "Icon for goto previous editor location.")); -Bt("goto-next-location", te.arrowDown, p("nextChangeIcon", "Icon for goto next editor location.")); -Ze.modify(te.sync, "spin"); -Ze.modify(te.loading, "spin"); -var TX = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +const HO = Kt("widget-close", te.close, p("widgetClose", "Icon for the close action in widgets.")); +Kt("goto-previous-location", te.arrowUp, p("previousChangeIcon", "Icon for goto previous editor location.")); +Kt("goto-next-location", te.arrowDown, p("nextChangeIcon", "Icon for goto next editor location.")); +Se.modify(te.sync, "spin"); +Se.modify(te.loading, "spin"); +var nH = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, DX = function(s, e) { +}, sH = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const _ue = Bt("diff-review-insert", te.add, p("accessibleDiffViewerInsertIcon", "Icon for 'Insert' in accessible diff viewer.")), Iue = Bt("diff-review-remove", te.remove, p("accessibleDiffViewerRemoveIcon", "Icon for 'Remove' in accessible diff viewer.")), Nue = Bt("diff-review-close", te.close, p("accessibleDiffViewerCloseIcon", "Icon for 'Close' in accessible diff viewer.")); -var Jf; -let tg = (Jf = class extends R { - constructor(e, t, i, n, o, r, l, a, c) { - super(), this._parentNode = e, this._visible = t, this._setVisible = i, this._canClose = n, this._width = o, this._height = r, this._diffs = l, this._models = a, this._instantiationService = c, this._state = Uh(this, (d, h) => { - const u = this._visible.read(d); +const yme = Kt("diff-review-insert", te.add, p("accessibleDiffViewerInsertIcon", "Icon for 'Insert' in accessible diff viewer.")), Wme = Kt("diff-review-remove", te.remove, p("accessibleDiffViewerRemoveIcon", "Icon for 'Remove' in accessible diff viewer.")), Gme = Kt("diff-review-close", te.close, p("accessibleDiffViewerCloseIcon", "Icon for 'Close' in accessible diff viewer.")); +var $g; +let lm = ($g = class extends J { + constructor(e, t, i, n, o, l, r, c, d) { + super(), this._parentNode = e, this._visible = t, this._setVisible = i, this._canClose = n, this._width = o, this._height = l, this._diffs = r, this._models = c, this._instantiationService = d, this._state = qh(this, (a, h) => { + const u = this._visible.read(a); if (this._parentNode.style.visibility = u ? "visible" : "hidden", !u) return null; - const g = h.add(this._instantiationService.createInstance(sT, this._diffs, this._models, this._setVisible, this._canClose)), m = h.add(this._instantiationService.createInstance(oT, this._parentNode, g, this._width, this._height, this._models)); - return { model: g, view: m }; + const m = h.add(this._instantiationService.createInstance(IT, this._diffs, this._models, this._setVisible, this._canClose)), b = h.add(this._instantiationService.createInstance(ST, this._parentNode, m, this._width, this._height, this._models)); + return { model: m, view: b }; }).recomputeInitiallyAndOnChange(this._store); } next() { - oi((e) => { + li((e) => { const t = this._visible.get(); this._setVisible(!0, e), t && this._state.get().model.nextGroup(e); }); } prev() { - oi((e) => { + li((e) => { this._setVisible(!0, e), this._state.get().model.previousGroup(e); }); } close() { - oi((e) => { + li((e) => { this._setVisible(!1, e); }); } -}, Jf._ttPolicy = nd("diffReview", { createHTML: (e) => e }), Jf); -tg = TX([ - DX(8, Se) -], tg); -let sT = class extends R { +}, $g._ttPolicy = ra("diffReview", { createHTML: (e) => e }), $g); +lm = nH([ + sH(8, Ge) +], lm); +let IT = class extends J { constructor(e, t, i, n, o) { - super(), this._diffs = e, this._models = t, this._setVisible = i, this.canClose = n, this._accessibilitySignalService = o, this._groups = Oe(this, []), this._currentGroupIdx = Oe(this, 0), this._currentElementIdx = Oe(this, 0), this.groups = this._groups, this.currentGroup = this._currentGroupIdx.map((r, l) => this._groups.read(l)[r]), this.currentGroupIndex = this._currentGroupIdx, this.currentElement = this._currentElementIdx.map((r, l) => { - var a; - return (a = this.currentGroup.read(l)) == null ? void 0 : a.lines[r]; - }), this._register(Te((r) => { - const l = this._diffs.read(r); - if (!l) { + super(), this._diffs = e, this._models = t, this._setVisible = i, this.canClose = n, this._accessibilitySignalService = o, this._groups = Ue(this, []), this._currentGroupIdx = Ue(this, 0), this._currentElementIdx = Ue(this, 0), this.groups = this._groups, this.currentGroup = this._currentGroupIdx.map((l, r) => this._groups.read(r)[l]), this.currentGroupIndex = this._currentGroupIdx, this.currentElement = this._currentElementIdx.map((l, r) => { + var c; + return (c = this.currentGroup.read(r)) == null ? void 0 : c.lines[l]; + }), this._register(Te((l) => { + const r = this._diffs.read(l); + if (!r) { this._groups.set([], void 0); return; } - const a = Wue(l, this._models.getOriginalModel().getLineCount(), this._models.getModifiedModel().getLineCount()); - oi((c) => { - const d = this._models.getModifiedPosition(); - if (d) { - const h = a.findIndex((u) => (d == null ? void 0 : d.lineNumber) < u.range.modified.endLineNumberExclusive); - h !== -1 && this._currentGroupIdx.set(h, c); + const c = Xme(r, this._models.getOriginalModel().getLineCount(), this._models.getModifiedModel().getLineCount()); + li((d) => { + const a = this._models.getModifiedPosition(); + if (a) { + const h = c.findIndex((u) => (a == null ? void 0 : a.lineNumber) < u.range.modified.endLineNumberExclusive); + h !== -1 && this._currentGroupIdx.set(h, d); } - this._groups.set(a, c); + this._groups.set(c, d); }); - })), this._register(Te((r) => { - const l = this.currentElement.read(r); - (l == null ? void 0 : l.type) === ls.Deleted ? this._accessibilitySignalService.playSignal(vo.diffLineDeleted, { source: "accessibleDiffViewer.currentElementChanged" }) : (l == null ? void 0 : l.type) === ls.Added && this._accessibilitySignalService.playSignal(vo.diffLineInserted, { source: "accessibleDiffViewer.currentElementChanged" }); - })), this._register(Te((r) => { - const l = this.currentElement.read(r); - if (l && l.type !== ls.Header) { - const a = l.modifiedLineNumber ?? l.diff.modified.startLineNumber; - this._models.modifiedSetSelection(M.fromPositions(new V(a, 1))); + })), this._register(Te((l) => { + const r = this.currentElement.read(l); + (r == null ? void 0 : r.type) === ds.Deleted ? this._accessibilitySignalService.playSignal(Mo.diffLineDeleted, { source: "accessibleDiffViewer.currentElementChanged" }) : (r == null ? void 0 : r.type) === ds.Added && this._accessibilitySignalService.playSignal(Mo.diffLineInserted, { source: "accessibleDiffViewer.currentElementChanged" }); + })), this._register(Te((l) => { + const r = this.currentElement.read(l); + if (r && r.type !== ds.Header) { + const c = r.modifiedLineNumber ?? r.diff.modified.startLineNumber; + this._models.modifiedSetSelection(I.fromPositions(new Y(c, 1))); } })); } _goToGroupDelta(e, t) { const i = this.groups.get(); - !i || i.length <= 1 || fm(t, (n) => { - this._currentGroupIdx.set(He.ofLength(i.length).clipCyclic(this._currentGroupIdx.get() + e), n), this._currentElementIdx.set(0, n); + !i || i.length <= 1 || Gb(t, (n) => { + this._currentGroupIdx.set(Pe.ofLength(i.length).clipCyclic(this._currentGroupIdx.get() + e), n), this._currentElementIdx.set(0, n); }); } nextGroup(e) { @@ -50170,8 +50170,8 @@ let sT = class extends R { } _goToLineDelta(e) { const t = this.currentGroup.get(); - !t || t.lines.length <= 1 || oi((i) => { - this._currentElementIdx.set(He.ofLength(t.lines.length).clip(this._currentElementIdx.get() + e), i); + !t || t.lines.length <= 1 || li((i) => { + this._currentElementIdx.set(Pe.ofLength(t.lines.length).clip(this._currentElementIdx.get() + e), i); }); } goToNextLine() { @@ -50185,7 +50185,7 @@ let sT = class extends R { if (!t) return; const i = t.lines.indexOf(e); - i !== -1 && oi((n) => { + i !== -1 && li((n) => { this._currentElementIdx.set(i, n); }); } @@ -50194,140 +50194,140 @@ let sT = class extends R { return; this._setVisible(!1, void 0); const e = this.currentElement.get(); - e && (e.type === ls.Deleted ? this._models.originalReveal(M.fromPositions(new V(e.originalLineNumber, 1))) : this._models.modifiedReveal(e.type !== ls.Header ? M.fromPositions(new V(e.modifiedLineNumber, 1)) : void 0)); + e && (e.type === ds.Deleted ? this._models.originalReveal(I.fromPositions(new Y(e.originalLineNumber, 1))) : this._models.modifiedReveal(e.type !== ds.Header ? I.fromPositions(new Y(e.modifiedLineNumber, 1)) : void 0)); } close() { this.canClose.get() && (this._setVisible(!1, void 0), this._models.modifiedFocus()); } }; -sT = TX([ - DX(4, jh) -], sT); -const F0 = 3; -function Wue(s, e, t) { +IT = nH([ + sH(4, tu) +], IT); +const B0 = 3; +function Xme(s, e, t) { const i = []; - for (const n of CE(s, (o, r) => r.modified.startLineNumber - o.modified.endLineNumberExclusive < 2 * F0)) { + for (const n of Uv(s, (o, l) => l.modified.startLineNumber - o.modified.endLineNumberExclusive < 2 * B0)) { const o = []; - o.push(new Tue()); - const r = new We(Math.max(1, n[0].original.startLineNumber - F0), Math.min(n[n.length - 1].original.endLineNumberExclusive + F0, e + 1)), l = new We(Math.max(1, n[0].modified.startLineNumber - F0), Math.min(n[n.length - 1].modified.endLineNumberExclusive + F0, t + 1)); - LJ(n, (d, h) => { - const u = new We(d ? d.original.endLineNumberExclusive : r.startLineNumber, h ? h.original.startLineNumber : r.endLineNumberExclusive), g = new We(d ? d.modified.endLineNumberExclusive : l.startLineNumber, h ? h.modified.startLineNumber : l.endLineNumberExclusive); - u.forEach((m) => { - o.push(new kue(m, g.startLineNumber + (m - u.startLineNumber))); - }), h && (h.original.forEach((m) => { - o.push(new Due(h, m)); - }), h.modified.forEach((m) => { - o.push(new Vue(h, m)); + o.push(new Lme()); + const l = new Ne(Math.max(1, n[0].original.startLineNumber - B0), Math.min(n[n.length - 1].original.endLineNumberExclusive + B0, e + 1)), r = new Ne(Math.max(1, n[0].modified.startLineNumber - B0), Math.min(n[n.length - 1].modified.endLineNumberExclusive + B0, t + 1)); + s_(n, (a, h) => { + const u = new Ne(a ? a.original.endLineNumberExclusive : l.startLineNumber, h ? h.original.startLineNumber : l.endLineNumberExclusive), m = new Ne(a ? a.modified.endLineNumberExclusive : r.startLineNumber, h ? h.modified.startLineNumber : r.endLineNumberExclusive); + u.forEach((b) => { + o.push(new xme(b, m.startLineNumber + (b - u.startLineNumber))); + }), h && (h.original.forEach((b) => { + o.push(new Ime(h, b)); + }), h.modified.forEach((b) => { + o.push(new Sme(h, b)); })); }); - const a = n[0].modified.join(n[n.length - 1].modified), c = n[0].original.join(n[n.length - 1].original); - i.push(new vue(new Qn(a, c), o)); + const c = n[0].modified.join(n[n.length - 1].modified), d = n[0].original.join(n[n.length - 1].original); + i.push(new Vme(new qn(c, d), o)); } return i; } -var ls; +var ds; (function(s) { s[s.Header = 0] = "Header", s[s.Unchanged = 1] = "Unchanged", s[s.Deleted = 2] = "Deleted", s[s.Added = 3] = "Added"; -})(ls || (ls = {})); -class vue { +})(ds || (ds = {})); +class Vme { constructor(e, t) { this.range = e, this.lines = t; } } -class Tue { +class Lme { constructor() { - this.type = ls.Header; + this.type = ds.Header; } } -class Due { +class Ime { constructor(e, t) { - this.diff = e, this.originalLineNumber = t, this.type = ls.Deleted, this.modifiedLineNumber = void 0; + this.diff = e, this.originalLineNumber = t, this.type = ds.Deleted, this.modifiedLineNumber = void 0; } } -class Vue { +class Sme { constructor(e, t) { - this.diff = e, this.modifiedLineNumber = t, this.type = ls.Added, this.originalLineNumber = void 0; + this.diff = e, this.modifiedLineNumber = t, this.type = ds.Added, this.originalLineNumber = void 0; } } -class kue { +class xme { constructor(e, t) { - this.originalLineNumber = e, this.modifiedLineNumber = t, this.type = ls.Unchanged; + this.originalLineNumber = e, this.modifiedLineNumber = t, this.type = ds.Unchanged; } } -let oT = class extends R { - constructor(e, t, i, n, o, r) { - super(), this._element = e, this._model = t, this._width = i, this._height = n, this._models = o, this._languageService = r, this.domNode = this._element, this.domNode.className = "monaco-component diff-review monaco-editor-background"; - const l = document.createElement("div"); - l.className = "diff-review-actions", this._actionBar = this._register(new Yo(l)), this._register(Te((a) => { - this._actionBar.clear(), this._model.canClose.read(a) && this._actionBar.push(new lo("diffreview.close", p("label.close", "Close"), "close-diff-review " + Ze.asClassName(Nue), !0, async () => t.close()), { label: !1, icon: !0 }); - })), this._content = document.createElement("div"), this._content.className = "diff-review-content", this._content.setAttribute("role", "code"), this._scrollbar = this._register(new CC(this._content, {})), In(this.domNode, this._scrollbar.getDomNode(), l), this._register(Te((a) => { - this._height.read(a), this._width.read(a), this._scrollbar.scanDomNode(); - })), this._register(Ce(() => { - In(this.domNode); - })), this._register(Uc(this.domNode, { width: this._width, height: this._height })), this._register(Uc(this._content, { width: this._width, height: this._height })), this._register(ks((a, c) => { - this._model.currentGroup.read(a), this._render(c); - })), this._register(ai(this.domNode, "keydown", (a) => { - (a.equals( +let ST = class extends J { + constructor(e, t, i, n, o, l) { + super(), this._element = e, this._model = t, this._width = i, this._height = n, this._models = o, this._languageService = l, this.domNode = this._element, this.domNode.className = "monaco-component diff-review monaco-editor-background"; + const r = document.createElement("div"); + r.className = "diff-review-actions", this._actionBar = this._register(new Ao(r)), this._register(Te((c) => { + this._actionBar.clear(), this._model.canClose.read(c) && this._actionBar.push(new ao("diffreview.close", p("label.close", "Close"), "close-diff-review " + Se.asClassName(Gme), !0, async () => t.close()), { label: !1, icon: !0 }); + })), this._content = document.createElement("div"), this._content.className = "diff-review-content", this._content.setAttribute("role", "code"), this._scrollbar = this._register(new MG(this._content, {})), Rn(this.domNode, this._scrollbar.getDomNode(), r), this._register(Te((c) => { + this._height.read(c), this._width.read(c), this._scrollbar.scanDomNode(); + })), this._register(We(() => { + Rn(this.domNode); + })), this._register(qd(this.domNode, { width: this._width, height: this._height })), this._register(qd(this._content, { width: this._width, height: this._height })), this._register(Js((c, d) => { + this._model.currentGroup.read(c), this._render(d); + })), this._register(di(this.domNode, "keydown", (c) => { + (c.equals( 18 /* KeyCode.DownArrow */ - ) || a.equals( + ) || c.equals( 2066 /* KeyCode.DownArrow */ - ) || a.equals( + ) || c.equals( 530 /* KeyCode.DownArrow */ - )) && (a.preventDefault(), this._model.goToNextLine()), (a.equals( + )) && (c.preventDefault(), this._model.goToNextLine()), (c.equals( 16 /* KeyCode.UpArrow */ - ) || a.equals( + ) || c.equals( 2064 /* KeyCode.UpArrow */ - ) || a.equals( + ) || c.equals( 528 /* KeyCode.UpArrow */ - )) && (a.preventDefault(), this._model.goToPreviousLine()), (a.equals( + )) && (c.preventDefault(), this._model.goToPreviousLine()), (c.equals( 9 /* KeyCode.Escape */ - ) || a.equals( + ) || c.equals( 2057 /* KeyCode.Escape */ - ) || a.equals( + ) || c.equals( 521 /* KeyCode.Escape */ - ) || a.equals( + ) || c.equals( 1033 /* KeyCode.Escape */ - )) && (a.preventDefault(), this._model.close()), (a.equals( + )) && (c.preventDefault(), this._model.close()), (c.equals( 10 /* KeyCode.Space */ - ) || a.equals( + ) || c.equals( 3 /* KeyCode.Enter */ - )) && (a.preventDefault(), this._model.revealCurrentElementInEditor()); + )) && (c.preventDefault(), this._model.revealCurrentElementInEditor()); })); } _render(e) { const t = this._models.getOriginalOptions(), i = this._models.getModifiedOptions(), n = document.createElement("div"); - n.className = "diff-review-table", n.setAttribute("role", "list"), n.setAttribute("aria-label", p("ariaLabel", "Accessible Diff Viewer. Use arrow up and down to navigate.")), mn(n, i.get( + n.className = "diff-review-table", n.setAttribute("role", "list"), n.setAttribute("aria-label", p("ariaLabel", "Accessible Diff Viewer. Use arrow up and down to navigate.")), pn(n, i.get( 50 /* EditorOption.fontInfo */ - )), In(this._content, n); - const o = this._models.getOriginalModel(), r = this._models.getModifiedModel(); - if (!o || !r) + )), Rn(this._content, n); + const o = this._models.getOriginalModel(), l = this._models.getModifiedModel(); + if (!o || !l) return; - const l = o.getOptions(), a = r.getOptions(), c = i.get( + const r = o.getOptions(), c = l.getOptions(), d = i.get( 67 /* EditorOption.lineHeight */ - ), d = this._model.currentGroup.get(); - for (const h of (d == null ? void 0 : d.lines) || []) { - if (!d) + ), a = this._model.currentGroup.get(); + for (const h of (a == null ? void 0 : a.lines) || []) { + if (!a) break; let u; - if (h.type === ls.Header) { - const m = document.createElement("div"); - m.className = "diff-review-row", m.setAttribute("role", "listitem"); - const f = d.range, b = this._model.currentGroupIndex.get(), y = this._model.groups.get().length, w = (x) => x === 0 ? p("no_lines_changed", "no lines changed") : x === 1 ? p("one_line_changed", "1 line changed") : p("more_lines_changed", "{0} lines changed", x), C = w(f.original.length), S = w(f.modified.length); - m.setAttribute("aria-label", p({ + if (h.type === ds.Header) { + const b = document.createElement("div"); + b.className = "diff-review-row", b.setAttribute("role", "listitem"); + const g = a.range, Z = this._model.currentGroupIndex.get(), f = this._model.groups.get().length, y = (L) => L === 0 ? p("no_lines_changed", "no lines changed") : L === 1 ? p("one_line_changed", "1 line changed") : p("more_lines_changed", "{0} lines changed", L), W = y(g.original.length), G = y(g.modified.length); + b.setAttribute("aria-label", p({ key: "header", comment: [ "This is the ARIA label for a git diff header.", @@ -50337,91 +50337,91 @@ let oT = class extends R { "Variables 2 and 4 will be numbers (a line number).", 'Variables 3 and 5 will be "no lines changed", "1 line changed" or "X lines changed", localized separately.' ] - }, "Difference {0} of {1}: original line {2}, {3}, modified line {4}, {5}", b + 1, y, f.original.startLineNumber, C, f.modified.startLineNumber, S)); - const L = document.createElement("div"); - L.className = "diff-review-cell diff-review-summary", L.appendChild(document.createTextNode(`${b + 1}/${y}: @@ -${f.original.startLineNumber},${f.original.length} +${f.modified.startLineNumber},${f.modified.length} @@`)), m.appendChild(L), u = m; + }, "Difference {0} of {1}: original line {2}, {3}, modified line {4}, {5}", Z + 1, f, g.original.startLineNumber, W, g.modified.startLineNumber, G)); + const X = document.createElement("div"); + X.className = "diff-review-cell diff-review-summary", X.appendChild(document.createTextNode(`${Z + 1}/${f}: @@ -${g.original.startLineNumber},${g.original.length} +${g.modified.startLineNumber},${g.modified.length} @@`)), b.appendChild(X), u = b; } else - u = this._createRow(h, c, this._width.get(), t, o, l, i, r, a); + u = this._createRow(h, d, this._width.get(), t, o, r, i, l, c); n.appendChild(u); - const g = ye((m) => ( + const m = fe((b) => ( /** @description isSelected */ - this._model.currentElement.read(m) === h + this._model.currentElement.read(b) === h )); - e.add(Te((m) => { - const f = g.read(m); - u.tabIndex = f ? 0 : -1, f && u.focus(); + e.add(Te((b) => { + const g = m.read(b); + u.tabIndex = g ? 0 : -1, g && u.focus(); })), e.add(z(u, "focus", () => { this._model.goToLine(h); })); } this._scrollbar.scanDomNode(); } - _createRow(e, t, i, n, o, r, l, a, c) { - const d = n.get( + _createRow(e, t, i, n, o, l, r, c, d) { + const a = n.get( 146 /* EditorOption.layoutInfo */ - ), h = d.glyphMarginWidth + d.lineNumbersWidth, u = l.get( + ), h = a.glyphMarginWidth + a.lineNumbersWidth, u = r.get( 146 /* EditorOption.layoutInfo */ - ), g = 10 + u.glyphMarginWidth + u.lineNumbersWidth; - let m = "diff-review-row", f = ""; - const b = "diff-review-spacer"; - let y = null; + ), m = 10 + u.glyphMarginWidth + u.lineNumbersWidth; + let b = "diff-review-row", g = ""; + const Z = "diff-review-spacer"; + let f = null; switch (e.type) { - case ls.Added: - m = "diff-review-row line-insert", f = " char-insert", y = _ue; + case ds.Added: + b = "diff-review-row line-insert", g = " char-insert", f = yme; break; - case ls.Deleted: - m = "diff-review-row line-delete", f = " char-delete", y = Iue; + case ds.Deleted: + b = "diff-review-row line-delete", g = " char-delete", f = Wme; break; } - const w = document.createElement("div"); - w.style.minWidth = i + "px", w.className = m, w.setAttribute("role", "listitem"), w.ariaLevel = ""; - const C = document.createElement("div"); - C.className = "diff-review-cell", C.style.height = `${t}px`, w.appendChild(C); - const S = document.createElement("span"); - S.style.width = h + "px", S.style.minWidth = h + "px", S.className = "diff-review-line-number" + f, e.originalLineNumber !== void 0 ? S.appendChild(document.createTextNode(String(e.originalLineNumber))) : S.innerText = " ", C.appendChild(S); + const y = document.createElement("div"); + y.style.minWidth = i + "px", y.className = b, y.setAttribute("role", "listitem"), y.ariaLevel = ""; + const W = document.createElement("div"); + W.className = "diff-review-cell", W.style.height = `${t}px`, y.appendChild(W); + const G = document.createElement("span"); + G.style.width = h + "px", G.style.minWidth = h + "px", G.className = "diff-review-line-number" + g, e.originalLineNumber !== void 0 ? G.appendChild(document.createTextNode(String(e.originalLineNumber))) : G.innerText = " ", W.appendChild(G); + const X = document.createElement("span"); + X.style.width = m + "px", X.style.minWidth = m + "px", X.style.paddingRight = "10px", X.className = "diff-review-line-number" + g, e.modifiedLineNumber !== void 0 ? X.appendChild(document.createTextNode(String(e.modifiedLineNumber))) : X.innerText = " ", W.appendChild(X); const L = document.createElement("span"); - L.style.width = g + "px", L.style.minWidth = g + "px", L.style.paddingRight = "10px", L.className = "diff-review-line-number" + f, e.modifiedLineNumber !== void 0 ? L.appendChild(document.createTextNode(String(e.modifiedLineNumber))) : L.innerText = " ", C.appendChild(L); - const x = document.createElement("span"); - if (x.className = b, y) { - const v = document.createElement("span"); - v.className = Ze.asClassName(y), v.innerText = "  ", x.appendChild(v); + if (L.className = Z, f) { + const w = document.createElement("span"); + w.className = Se.asClassName(f), w.innerText = "  ", L.appendChild(w); } else - x.innerText = "  "; - C.appendChild(x); - let Z; + L.innerText = "  "; + W.appendChild(L); + let S; if (e.modifiedLineNumber !== void 0) { - let v = this._getLineHtml(a, l, c.tabSize, e.modifiedLineNumber, this._languageService.languageIdCodec); - tg._ttPolicy && (v = tg._ttPolicy.createHTML(v)), C.insertAdjacentHTML("beforeend", v), Z = a.getLineContent(e.modifiedLineNumber); + let w = this._getLineHtml(c, r, d.tabSize, e.modifiedLineNumber, this._languageService.languageIdCodec); + lm._ttPolicy && (w = lm._ttPolicy.createHTML(w)), W.insertAdjacentHTML("beforeend", w), S = c.getLineContent(e.modifiedLineNumber); } else { - let v = this._getLineHtml(o, n, r.tabSize, e.originalLineNumber, this._languageService.languageIdCodec); - tg._ttPolicy && (v = tg._ttPolicy.createHTML(v)), C.insertAdjacentHTML("beforeend", v), Z = o.getLineContent(e.originalLineNumber); + let w = this._getLineHtml(o, n, l.tabSize, e.originalLineNumber, this._languageService.languageIdCodec); + lm._ttPolicy && (w = lm._ttPolicy.createHTML(w)), W.insertAdjacentHTML("beforeend", w), S = o.getLineContent(e.originalLineNumber); } - Z.length === 0 && (Z = p("blankLine", "blank")); - let _ = ""; + S.length === 0 && (S = p("blankLine", "blank")); + let x = ""; switch (e.type) { - case ls.Unchanged: - e.originalLineNumber === e.modifiedLineNumber ? _ = p({ key: "unchangedLine", comment: ["The placeholders are contents of the line and should not be translated."] }, "{0} unchanged line {1}", Z, e.originalLineNumber) : _ = p("equalLine", "{0} original line {1} modified line {2}", Z, e.originalLineNumber, e.modifiedLineNumber); + case ds.Unchanged: + e.originalLineNumber === e.modifiedLineNumber ? x = p({ key: "unchangedLine", comment: ["The placeholders are contents of the line and should not be translated."] }, "{0} unchanged line {1}", S, e.originalLineNumber) : x = p("equalLine", "{0} original line {1} modified line {2}", S, e.originalLineNumber, e.modifiedLineNumber); break; - case ls.Added: - _ = p("insertLine", "+ {0} modified line {1}", Z, e.modifiedLineNumber); + case ds.Added: + x = p("insertLine", "+ {0} modified line {1}", S, e.modifiedLineNumber); break; - case ls.Deleted: - _ = p("deleteLine", "- {0} original line {1}", Z, e.originalLineNumber); + case ds.Deleted: + x = p("deleteLine", "- {0} original line {1}", S, e.originalLineNumber); break; } - return w.setAttribute("aria-label", _), w; + return y.setAttribute("aria-label", x), y; } _getLineHtml(e, t, i, n, o) { - const r = e.getLineContent(n), l = t.get( + const l = e.getLineContent(n), r = t.get( 50 /* EditorOption.fontInfo */ - ), a = rn.createEmpty(r, o), c = Oo.isBasicASCII(r, e.mightContainNonBasicASCII()), d = Oo.containsRTL(r, c, e.mightContainRTL()); - return dI(new Jh(l.isMonospace && !t.get( + ), c = rn.createEmpty(l, o), d = Bo.isBasicASCII(l, e.mightContainNonBasicASCII()), a = Bo.containsRTL(l, d, e.mightContainRTL()); + return Ix(new jh(r.isMonospace && !t.get( 33 /* EditorOption.disableMonospaceOptimizations */ - ), l.canUseHalfwidthRightwardsArrow, r, !1, c, d, 0, a, [], i, 0, l.spaceWidth, l.middotWidth, l.wsmiddotWidth, t.get( + ), r.canUseHalfwidthRightwardsArrow, l, !1, d, a, 0, c, [], i, 0, r.spaceWidth, r.middotWidth, r.wsmiddotWidth, t.get( 118 /* EditorOption.stopRenderingLineAfter */ ), t.get( @@ -50433,13 +50433,13 @@ let oT = class extends R { ), t.get( 51 /* EditorOption.fontLigatures */ - ) !== Dh.OFF, null)).html; + ) !== Jh.OFF, null)).html; } }; -oT = TX([ - DX(5, ri) -], oT); -class Gue { +ST = nH([ + sH(5, ri) +], ST); +class Cme { constructor(e) { this.editors = e; } @@ -50471,84 +50471,84 @@ class Gue { return this.editors.modified.getPosition() ?? void 0; } } -N("diffEditor.move.border", "#8b8b8b9c", p("diffEditor.move.border", "The border color for text that got moved in the diff editor.")); -N("diffEditor.moveActive.border", "#FFA500", p("diffEditor.moveActive.border", "The active border color for text that got moved in the diff editor.")); -N("diffEditor.unchangedRegionShadow", { dark: "#000000", light: "#737373BF", hcDark: "#000000", hcLight: "#737373BF" }, p("diffEditor.unchangedRegionShadow", "The color of the shadow around unchanged region widgets.")); -const Rue = Bt("diff-insert", te.add, p("diffInsertIcon", "Line decoration for inserts in the diff editor.")), n4 = Bt("diff-remove", te.remove, p("diffRemoveIcon", "Line decoration for removals in the diff editor.")), ix = Re.register({ +R("diffEditor.move.border", "#8b8b8b9c", p("diffEditor.move.border", "The border color for text that got moved in the diff editor.")); +R("diffEditor.moveActive.border", "#FFA500", p("diffEditor.moveActive.border", "The active border color for text that got moved in the diff editor.")); +R("diffEditor.unchangedRegionShadow", { dark: "#000000", light: "#737373BF", hcDark: "#000000", hcLight: "#737373BF" }, p("diffEditor.unchangedRegionShadow", "The color of the shadow around unchanged region widgets.")); +const Rme = Kt("diff-insert", te.add, p("diffInsertIcon", "Line decoration for inserts in the diff editor.")), EO = Kt("diff-remove", te.remove, p("diffRemoveIcon", "Line decoration for removals in the diff editor.")), ZL = Je.register({ className: "line-insert", description: "line-insert", isWholeLine: !0, - linesDecorationsClassName: "insert-sign " + Ze.asClassName(Rue), + linesDecorationsClassName: "insert-sign " + Se.asClassName(Rme), marginClassName: "gutter-insert" -}), w1 = Re.register({ +}), wW = Je.register({ className: "line-delete", description: "line-delete", isWholeLine: !0, - linesDecorationsClassName: "delete-sign " + Ze.asClassName(n4), + linesDecorationsClassName: "delete-sign " + Se.asClassName(EO), marginClassName: "gutter-delete" -}), fz = Re.register({ +}), Fz = Je.register({ className: "line-insert", description: "line-insert", isWholeLine: !0, marginClassName: "gutter-insert" -}), bz = Re.register({ +}), zz = Je.register({ className: "line-delete", description: "line-delete", isWholeLine: !0, marginClassName: "gutter-delete" -}), nx = Re.register({ +}), fL = Je.register({ className: "char-insert", description: "char-insert", shouldFillLineOnLineBreak: !0 -}), VX = Re.register({ +}), oH = Je.register({ className: "char-insert", description: "char-insert", isWholeLine: !0 -}), kX = Re.register({ +}), lH = Je.register({ className: "char-insert diff-range-empty", description: "char-insert diff-range-empty" -}), Lb = Re.register({ +}), CZ = Je.register({ className: "char-delete", description: "char-delete", shouldFillLineOnLineBreak: !0 -}), GX = Re.register({ +}), rH = Je.register({ className: "char-delete", description: "char-delete", isWholeLine: !0 -}), RX = Re.register({ +}), cH = Je.register({ className: "char-delete diff-range-empty", description: "char-delete diff-range-empty" -}), Ps = $e("editorWorkerService"); -var s4 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +}), Us = $e("editorWorkerService"); +var DO = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, rT = function(s, e) { +}, xT = function(s, e) { return function(t, i) { e(t, i, s); }; -}, _u; -const WC = $e("diffProviderFactoryService"); -let lT = class { +}, Tu; +const AG = $e("diffProviderFactoryService"); +let CT = class { constructor(e) { this.instantiationService = e; } createDiffProvider(e) { - return this.instantiationService.createInstance(aT, e); + return this.instantiationService.createInstance(RT, e); } }; -lT = s4([ - rT(0, Se) -], lT); +CT = DO([ + xT(0, Ge) +], CT); it( - WC, - lT, + AG, + CT, 1 /* InstantiationType.Delayed */ ); -var fg; -let aT = (fg = class { +var Gm; +let RT = (Gm = class { constructor(e, t, i) { this.editorWorkerService = t, this.telemetryService = i, this.onDidChangeEventEmitter = new k(), this.onDidChange = this.onDidChangeEventEmitter.event, this.diffAlgorithm = "advanced", this.diffAlgorithmOnDidChangeSubscription = void 0, this.setOptions(e); } @@ -50574,22 +50574,22 @@ let aT = (fg = class { moves: [] } : { changes: [ - new zo(new We(1, 2), new We(1, t.getLineCount() + 1), [ - new Wo(e.getFullModelRange(), t.getFullModelRange()) + new Ko(new Ne(1, 2), new Ne(1, t.getLineCount() + 1), [ + new To(e.getFullModelRange(), t.getFullModelRange()) ]) ], identical: !1, quitEarly: !1, moves: [] }; - const o = JSON.stringify([e.uri.toString(), t.uri.toString()]), r = JSON.stringify([e.id, t.id, e.getAlternativeVersionId(), t.getAlternativeVersionId(), JSON.stringify(i)]), l = _u.diffCache.get(o); - if (l && l.context === r) - return l.result; - const a = on.create(), c = await this.editorWorkerService.computeDiff(e.uri, t.uri, i, this.diffAlgorithm), d = a.elapsed(); + const o = JSON.stringify([e.uri.toString(), t.uri.toString()]), l = JSON.stringify([e.id, t.id, e.getAlternativeVersionId(), t.getAlternativeVersionId(), JSON.stringify(i)]), r = Tu.diffCache.get(o); + if (r && r.context === l) + return r.result; + const c = ln.create(), d = await this.editorWorkerService.computeDiff(e.uri, t.uri, i, this.diffAlgorithm), a = c.elapsed(); if (this.telemetryService.publicLog2("diffEditor.computeDiff", { - timeMs: d, - timedOut: (c == null ? void 0 : c.quitEarly) ?? !0, - detectedMoves: i.computeMoves ? (c == null ? void 0 : c.moves.length) ?? 0 : -1 + timeMs: a, + timedOut: (d == null ? void 0 : d.quitEarly) ?? !0, + detectedMoves: i.computeMoves ? (d == null ? void 0 : d.moves.length) ?? 0 : -1 }), n.isCancellationRequested) return { changes: [], @@ -50597,26 +50597,26 @@ let aT = (fg = class { quitEarly: !0, moves: [] }; - if (!c) + if (!d) throw new Error("no diff result available"); - return _u.diffCache.size > 10 && _u.diffCache.delete(_u.diffCache.keys().next().value), _u.diffCache.set(o, { result: c, context: r }), c; + return Tu.diffCache.size > 10 && Tu.diffCache.delete(Tu.diffCache.keys().next().value), Tu.diffCache.set(o, { result: d, context: l }), d; } setOptions(e) { var i; let t = !1; e.diffAlgorithm && this.diffAlgorithm !== e.diffAlgorithm && ((i = this.diffAlgorithmOnDidChangeSubscription) == null || i.dispose(), this.diffAlgorithmOnDidChangeSubscription = void 0, this.diffAlgorithm = e.diffAlgorithm, typeof e.diffAlgorithm != "string" && (this.diffAlgorithmOnDidChangeSubscription = e.diffAlgorithm.onDidChange(() => this.onDidChangeEventEmitter.fire())), t = !0), t && this.onDidChangeEventEmitter.fire(); } -}, _u = fg, fg.diffCache = /* @__PURE__ */ new Map(), fg); -aT = _u = s4([ - rT(1, Ps), - rT(2, Ls) -], aT); -function ZI() { - return M2 && !!M2.VSCODE_DEV; -} -function o4(s) { - if (ZI()) { - const e = Eue(); +}, Tu = Gm, Gm.diffCache = /* @__PURE__ */ new Map(), Gm); +RT = Tu = DO([ + xT(1, Us), + xT(2, Ls) +], RT); +function Fx() { + return PN && !!PN.VSCODE_DEV; +} +function FO(s) { + if (Fx()) { + const e = Nme(); return e.add(s), { dispose() { e.delete(s); @@ -50626,80 +50626,80 @@ function o4(s) { return { dispose() { } }; } -function Eue() { - SS || (SS = /* @__PURE__ */ new Set()); +function Nme() { + Y1 || (Y1 = /* @__PURE__ */ new Set()); const s = globalThis; return s.$hotReload_applyNewExports || (s.$hotReload_applyNewExports = (e) => { const t = { config: { mode: void 0 }, ...e }, i = []; - for (const n of SS) { + for (const n of Y1) { const o = n(t); o && i.push(o); } if (i.length > 0) return (n) => { let o = !1; - for (const r of i) - r(n) && (o = !0); + for (const l of i) + l(n) && (o = !0); return o; }; - }), SS; + }), Y1; } -let SS; -ZI() && o4(({ oldExports: s, newSrc: e, config: t }) => { +let Y1; +Fx() && FO(({ oldExports: s, newSrc: e, config: t }) => { if (t.mode === "patch-prototype") return (i) => { var n, o; - for (const r in i) { - const l = i[r]; - if (console.log(`[hot-reload] Patching prototype methods of '${r}'`, { exportedItem: l }), typeof l == "function" && l.prototype) { - const a = s[r]; - if (a) { - for (const c of Object.getOwnPropertyNames(l.prototype)) { - const d = Object.getOwnPropertyDescriptor(l.prototype, c), h = Object.getOwnPropertyDescriptor(a.prototype, c); - ((n = d == null ? void 0 : d.value) == null ? void 0 : n.toString()) !== ((o = h == null ? void 0 : h.value) == null ? void 0 : o.toString()) && console.log(`[hot-reload] Patching prototype method '${r}.${c}'`), Object.defineProperty(a.prototype, c, d); + for (const l in i) { + const r = i[l]; + if (console.log(`[hot-reload] Patching prototype methods of '${l}'`, { exportedItem: r }), typeof r == "function" && r.prototype) { + const c = s[l]; + if (c) { + for (const d of Object.getOwnPropertyNames(r.prototype)) { + const a = Object.getOwnPropertyDescriptor(r.prototype, d), h = Object.getOwnPropertyDescriptor(c.prototype, d); + ((n = a == null ? void 0 : a.value) == null ? void 0 : n.toString()) !== ((o = h == null ? void 0 : h.value) == null ? void 0 : o.toString()) && console.log(`[hot-reload] Patching prototype method '${l}.${d}'`), Object.defineProperty(c.prototype, d, a); } - i[r] = a; + i[l] = c; } } } return !0; }; }); -function eo(s, e) { - return Xue([s], e), s; +function io(s, e) { + return wme([s], e), s; } -function Xue(s, e) { - ZI() && Zn("reload", (i) => o4(({ oldExports: n }) => { +function wme(s, e) { + Fx() && xn("reload", (i) => FO(({ oldExports: n }) => { if ([...Object.values(n)].some((o) => s.includes(o))) return (o) => (i(void 0), !0); })).read(e); } -class Ec { +class zd { static trivial(e, t) { - return new Ec([new Oi(He.ofLength(e.length), He.ofLength(t.length))], !1); + return new zd([new Pi(Pe.ofLength(e.length), Pe.ofLength(t.length))], !1); } static trivialTimedOut(e, t) { - return new Ec([new Oi(He.ofLength(e.length), He.ofLength(t.length))], !0); + return new zd([new Pi(Pe.ofLength(e.length), Pe.ofLength(t.length))], !0); } constructor(e, t) { this.diffs = e, this.hitTimeout = t; } } -class Oi { +class Pi { static invert(e, t) { const i = []; - return LJ(e, (n, o) => { - i.push(Oi.fromOffsetPairs(n ? n.getEndExclusives() : _c.zero, o ? o.getStarts() : new _c(t, (n ? n.seq2Range.endExclusive - n.seq1Range.endExclusive : 0) + t))); + return s_(e, (n, o) => { + i.push(Pi.fromOffsetPairs(n ? n.getEndExclusives() : wd.zero, o ? o.getStarts() : new wd(t, (n ? n.seq2Range.endExclusive - n.seq1Range.endExclusive : 0) + t))); }), i; } static fromOffsetPairs(e, t) { - return new Oi(new He(e.offset1, t.offset1), new He(e.offset2, t.offset2)); + return new Pi(new Pe(e.offset1, t.offset1), new Pe(e.offset2, t.offset2)); } static assertSorted(e) { let t; for (const i of e) { if (t && !(t.seq1Range.endExclusive <= i.seq1Range.start && t.seq2Range.endExclusive <= i.seq2Range.start)) - throw new mt("Sequence diffs must be sorted"); + throw new bt("Sequence diffs must be sorted"); t = i; } } @@ -50707,36 +50707,36 @@ class Oi { this.seq1Range = e, this.seq2Range = t; } swap() { - return new Oi(this.seq2Range, this.seq1Range); + return new Pi(this.seq2Range, this.seq1Range); } toString() { return `${this.seq1Range} <-> ${this.seq2Range}`; } join(e) { - return new Oi(this.seq1Range.join(e.seq1Range), this.seq2Range.join(e.seq2Range)); + return new Pi(this.seq1Range.join(e.seq1Range), this.seq2Range.join(e.seq2Range)); } delta(e) { - return e === 0 ? this : new Oi(this.seq1Range.delta(e), this.seq2Range.delta(e)); + return e === 0 ? this : new Pi(this.seq1Range.delta(e), this.seq2Range.delta(e)); } deltaStart(e) { - return e === 0 ? this : new Oi(this.seq1Range.deltaStart(e), this.seq2Range.deltaStart(e)); + return e === 0 ? this : new Pi(this.seq1Range.deltaStart(e), this.seq2Range.deltaStart(e)); } deltaEnd(e) { - return e === 0 ? this : new Oi(this.seq1Range.deltaEnd(e), this.seq2Range.deltaEnd(e)); + return e === 0 ? this : new Pi(this.seq1Range.deltaEnd(e), this.seq2Range.deltaEnd(e)); } intersect(e) { const t = this.seq1Range.intersect(e.seq1Range), i = this.seq2Range.intersect(e.seq2Range); if (!(!t || !i)) - return new Oi(t, i); + return new Pi(t, i); } getStarts() { - return new _c(this.seq1Range.start, this.seq2Range.start); + return new wd(this.seq1Range.start, this.seq2Range.start); } getEndExclusives() { - return new _c(this.seq1Range.endExclusive, this.seq2Range.endExclusive); + return new wd(this.seq1Range.endExclusive, this.seq2Range.endExclusive); } } -const Uu = class Uu { +const $u = class $u { constructor(e, t) { this.offset1 = e, this.offset2 = t; } @@ -50744,25 +50744,25 @@ const Uu = class Uu { return `${this.offset1} <-> ${this.offset2}`; } delta(e) { - return e === 0 ? this : new Uu(this.offset1 + e, this.offset2 + e); + return e === 0 ? this : new $u(this.offset1 + e, this.offset2 + e); } equals(e) { return this.offset1 === e.offset1 && this.offset2 === e.offset2; } }; -Uu.zero = new Uu(0, 0), Uu.max = new Uu(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER); -let _c = Uu; -const CZ = class CZ { +$u.zero = new $u(0, 0), $u.max = new $u(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER); +let wd = $u; +const k2 = class k2 { isValid() { return !0; } }; -CZ.instance = new CZ(); -let C1 = CZ; -class Fue { +k2.instance = new k2(); +let TW = k2; +class Tme { constructor(e) { if (this.timeout = e, this.startTime = Date.now(), this.valid = !0, e <= 0) - throw new mt("timeout must be positive"); + throw new bt("timeout must be positive"); } // Recommendation: Set a log-point `{this.disable()}` in the body isValid() { @@ -50773,7 +50773,7 @@ class Fue { return this.valid; } } -class mW { +class NR { constructor(e, t) { this.width = e, this.height = t, this.array = [], this.array = new Array(e * t); } @@ -50784,10 +50784,10 @@ class mW { this.array[e + t * this.width] = i; } } -function cT(s) { +function NT(s) { return s === 32 || s === 9; } -const bw = class bw { +const Ry = class Ry { static getKey(e) { let t = this.chrKeys.get(e); return t === void 0 && (t = this.chrKeys.size, this.chrKeys.set(e, t)), t; @@ -50796,16 +50796,16 @@ const bw = class bw { this.range = e, this.lines = t, this.source = i, this.histogram = []; let n = 0; for (let o = e.startLineNumber - 1; o < e.endLineNumberExclusive - 1; o++) { - const r = t[o]; - for (let a = 0; a < r.length; a++) { + const l = t[o]; + for (let c = 0; c < l.length; c++) { n++; - const c = r[a], d = bw.getKey(c); - this.histogram[d] = (this.histogram[d] || 0) + 1; + const d = l[c], a = Ry.getKey(d); + this.histogram[a] = (this.histogram[a] || 0) + 1; } n++; - const l = bw.getKey(` + const r = Ry.getKey(` `); - this.histogram[l] = (this.histogram[l] || 0) + 1; + this.histogram[r] = (this.histogram[r] || 0) + 1; } this.totalCount = n; } @@ -50817,87 +50817,87 @@ const bw = class bw { return 1 - t / (this.totalCount + e.totalCount); } }; -bw.chrKeys = /* @__PURE__ */ new Map(); -let sx = bw; -class Yue { - compute(e, t, i = C1.instance, n) { +Ry.chrKeys = /* @__PURE__ */ new Map(); +let yL = Ry; +class Mme { + compute(e, t, i = TW.instance, n) { if (e.length === 0 || t.length === 0) - return Ec.trivial(e, t); - const o = new mW(e.length, t.length), r = new mW(e.length, t.length), l = new mW(e.length, t.length); - for (let m = 0; m < e.length; m++) - for (let f = 0; f < t.length; f++) { + return zd.trivial(e, t); + const o = new NR(e.length, t.length), l = new NR(e.length, t.length), r = new NR(e.length, t.length); + for (let b = 0; b < e.length; b++) + for (let g = 0; g < t.length; g++) { if (!i.isValid()) - return Ec.trivialTimedOut(e, t); - const b = m === 0 ? 0 : o.get(m - 1, f), y = f === 0 ? 0 : o.get(m, f - 1); - let w; - e.getElement(m) === t.getElement(f) ? (m === 0 || f === 0 ? w = 0 : w = o.get(m - 1, f - 1), m > 0 && f > 0 && r.get(m - 1, f - 1) === 3 && (w += l.get(m - 1, f - 1)), w += n ? n(m, f) : 1) : w = -1; - const C = Math.max(b, y, w); - if (C === w) { - const S = m > 0 && f > 0 ? l.get(m - 1, f - 1) : 0; - l.set(m, f, S + 1), r.set(m, f, 3); - } else C === b ? (l.set(m, f, 0), r.set(m, f, 1)) : C === y && (l.set(m, f, 0), r.set(m, f, 2)); - o.set(m, f, C); + return zd.trivialTimedOut(e, t); + const Z = b === 0 ? 0 : o.get(b - 1, g), f = g === 0 ? 0 : o.get(b, g - 1); + let y; + e.getElement(b) === t.getElement(g) ? (b === 0 || g === 0 ? y = 0 : y = o.get(b - 1, g - 1), b > 0 && g > 0 && l.get(b - 1, g - 1) === 3 && (y += r.get(b - 1, g - 1)), y += n ? n(b, g) : 1) : y = -1; + const W = Math.max(Z, f, y); + if (W === y) { + const G = b > 0 && g > 0 ? r.get(b - 1, g - 1) : 0; + r.set(b, g, G + 1), l.set(b, g, 3); + } else W === Z ? (r.set(b, g, 0), l.set(b, g, 1)) : W === f && (r.set(b, g, 0), l.set(b, g, 2)); + o.set(b, g, W); } - const a = []; - let c = e.length, d = t.length; - function h(m, f) { - (m + 1 !== c || f + 1 !== d) && a.push(new Oi(new He(m + 1, c), new He(f + 1, d))), c = m, d = f; + const c = []; + let d = e.length, a = t.length; + function h(b, g) { + (b + 1 !== d || g + 1 !== a) && c.push(new Pi(new Pe(b + 1, d), new Pe(g + 1, a))), d = b, a = g; } - let u = e.length - 1, g = t.length - 1; - for (; u >= 0 && g >= 0; ) - r.get(u, g) === 3 ? (h(u, g), u--, g--) : r.get(u, g) === 1 ? u-- : g--; - return h(-1, -1), a.reverse(), new Ec(a, !1); + let u = e.length - 1, m = t.length - 1; + for (; u >= 0 && m >= 0; ) + l.get(u, m) === 3 ? (h(u, m), u--, m--) : l.get(u, m) === 1 ? u-- : m--; + return h(-1, -1), c.reverse(), new zd(c, !1); } } -class r4 { - compute(e, t, i = C1.instance) { +class zO { + compute(e, t, i = TW.instance) { if (e.length === 0 || t.length === 0) - return Ec.trivial(e, t); + return zd.trivial(e, t); const n = e, o = t; - function r(f, b) { - for (; f < n.length && b < o.length && n.getElement(f) === o.getElement(b); ) - f++, b++; - return f; + function l(g, Z) { + for (; g < n.length && Z < o.length && n.getElement(g) === o.getElement(Z); ) + g++, Z++; + return g; } - let l = 0; - const a = new zue(); - a.set(0, r(0, 0)); - const c = new Pue(); - c.set(0, a.get(0) === 0 ? null : new yz(null, 0, 0, a.get(0))); - let d = 0; + let r = 0; + const c = new Yme(); + c.set(0, l(0, 0)); + const d = new kme(); + d.set(0, c.get(0) === 0 ? null : new Az(null, 0, 0, c.get(0))); + let a = 0; e: for (; ; ) { - if (l++, !i.isValid()) - return Ec.trivialTimedOut(n, o); - const f = -Math.min(l, o.length + l % 2), b = Math.min(l, n.length + l % 2); - for (d = f; d <= b; d += 2) { - const y = d === b ? -1 : a.get(d + 1), w = d === f ? -1 : a.get(d - 1) + 1, C = Math.min(Math.max(y, w), n.length), S = C - d; - if (C > n.length || S > o.length) + if (r++, !i.isValid()) + return zd.trivialTimedOut(n, o); + const g = -Math.min(r, o.length + r % 2), Z = Math.min(r, n.length + r % 2); + for (a = g; a <= Z; a += 2) { + const f = a === Z ? -1 : c.get(a + 1), y = a === g ? -1 : c.get(a - 1) + 1, W = Math.min(Math.max(f, y), n.length), G = W - a; + if (W > n.length || G > o.length) continue; - const L = r(C, S); - a.set(d, L); - const x = C === y ? c.get(d + 1) : c.get(d - 1); - if (c.set(d, L !== C ? new yz(x, C, S, L - C) : x), a.get(d) === n.length && a.get(d) - d === o.length) + const X = l(W, G); + c.set(a, X); + const L = W === f ? d.get(a + 1) : d.get(a - 1); + if (d.set(a, X !== W ? new Az(L, W, G, X - W) : L), c.get(a) === n.length && c.get(a) - a === o.length) break e; } } - let h = c.get(d); + let h = d.get(a); const u = []; - let g = n.length, m = o.length; + let m = n.length, b = o.length; for (; ; ) { - const f = h ? h.x + h.length : 0, b = h ? h.y + h.length : 0; - if ((f !== g || b !== m) && u.push(new Oi(new He(f, g), new He(b, m))), !h) + const g = h ? h.x + h.length : 0, Z = h ? h.y + h.length : 0; + if ((g !== m || Z !== b) && u.push(new Pi(new Pe(g, m), new Pe(Z, b))), !h) break; - g = h.x, m = h.y, h = h.prev; + m = h.x, b = h.y, h = h.prev; } - return u.reverse(), new Ec(u, !1); + return u.reverse(), new zd(u, !1); } } -class yz { +class Az { constructor(e, t, i, n) { this.prev = e, this.x = t, this.y = i, this.length = n; } } -class zue { +class Yme { constructor() { this.positiveArr = new Int32Array(10), this.negativeArr = new Int32Array(10); } @@ -50920,7 +50920,7 @@ class zue { } } } -class Pue { +class kme { constructor() { this.positiveArr = [], this.negativeArr = []; } @@ -50931,21 +50931,21 @@ class Pue { e < 0 ? (e = -e - 1, this.negativeArr[e] = t) : this.positiveArr[e] = t; } } -class ox { +class WL { constructor(e, t, i) { this.lines = e, this.range = t, this.considerWhitespaceChanges = i, this.elements = [], this.firstElementOffsetByLineIdx = [], this.lineStartOffsets = [], this.trimmedWsLengthsByLineIdx = [], this.firstElementOffsetByLineIdx.push(0); for (let n = this.range.startLineNumber; n <= this.range.endLineNumber; n++) { - let o = e[n - 1], r = 0; - n === this.range.startLineNumber && this.range.startColumn > 1 && (r = this.range.startColumn - 1, o = o.substring(r)), this.lineStartOffsets.push(r); - let l = 0; + let o = e[n - 1], l = 0; + n === this.range.startLineNumber && this.range.startColumn > 1 && (l = this.range.startColumn - 1, o = o.substring(l)), this.lineStartOffsets.push(l); + let r = 0; if (!i) { - const c = o.trimStart(); - l = o.length - c.length, o = c.trimEnd(); + const d = o.trimStart(); + r = o.length - d.length, o = d.trimEnd(); } - this.trimmedWsLengthsByLineIdx.push(l); - const a = n === this.range.endLineNumber ? Math.min(this.range.endColumn - 1 - r - l, o.length) : o.length; - for (let c = 0; c < a; c++) - this.elements.push(o.charCodeAt(c)); + this.trimmedWsLengthsByLineIdx.push(r); + const c = n === this.range.endLineNumber ? Math.min(this.range.endColumn - 1 - l - r, o.length) : o.length; + for (let d = 0; d < c; d++) + this.elements.push(o.charCodeAt(d)); n < this.range.endLineNumber && (this.elements.push(10), this.firstElementOffsetByLineIdx.push(this.elements.length)); } } @@ -50953,7 +50953,7 @@ class ox { return `Slice: "${this.text}"`; } get text() { - return this.getText(new He(0, this.length)); + return this.getText(new Pe(0, this.length)); } getText(e) { return this.elements.slice(e.start, e.endExclusive).map((t) => String.fromCharCode(t)).join(""); @@ -50965,35 +50965,35 @@ class ox { return this.elements.length; } getBoundaryScore(e) { - const t = Cz(e > 0 ? this.elements[e - 1] : -1), i = Cz(e < this.elements.length ? this.elements[e] : -1); + const t = Uz(e > 0 ? this.elements[e - 1] : -1), i = Uz(e < this.elements.length ? this.elements[e] : -1); if (t === 7 && i === 8) return 0; if (t === 8) return 150; let n = 0; - return t !== i && (n += 10, t === 0 && i === 1 && (n += 1)), n += wz(t), n += wz(i), n; + return t !== i && (n += 10, t === 0 && i === 1 && (n += 1)), n += Kz(t), n += Kz(i), n; } translateOffset(e, t = "right") { - const i = i1(this.firstElementOffsetByLineIdx, (o) => o <= e), n = e - this.firstElementOffsetByLineIdx[i]; - return new V(this.range.startLineNumber + i, 1 + this.lineStartOffsets[i] + n + (n === 0 && t === "left" ? 0 : this.trimmedWsLengthsByLineIdx[i])); + const i = bW(this.firstElementOffsetByLineIdx, (o) => o <= e), n = e - this.firstElementOffsetByLineIdx[i]; + return new Y(this.range.startLineNumber + i, 1 + this.lineStartOffsets[i] + n + (n === 0 && t === "left" ? 0 : this.trimmedWsLengthsByLineIdx[i])); } translateRange(e) { const t = this.translateOffset(e.start, "right"), i = this.translateOffset(e.endExclusive, "left"); - return i.isBefore(t) ? M.fromPositions(i, i) : M.fromPositions(t, i); + return i.isBefore(t) ? I.fromPositions(i, i) : I.fromPositions(t, i); } /** * Finds the word that contains the character at the given offset */ findWordContaining(e) { - if (e < 0 || e >= this.elements.length || !pW(this.elements[e])) + if (e < 0 || e >= this.elements.length || !wR(this.elements[e])) return; let t = e; - for (; t > 0 && pW(this.elements[t - 1]); ) + for (; t > 0 && wR(this.elements[t - 1]); ) t--; let i = e; - for (; i < this.elements.length && pW(this.elements[i]); ) + for (; i < this.elements.length && wR(this.elements[i]); ) i++; - return new He(t, i); + return new Pe(t, i); } countLinesIn(e) { return this.translateOffset(e.endExclusive).lineNumber - this.translateOffset(e.start).lineNumber; @@ -51002,14 +51002,14 @@ class ox { return this.elements[e] === this.elements[t]; } extendToFullLines(e) { - const t = bb(this.firstElementOffsetByLineIdx, (n) => n <= e.start) ?? 0, i = Nre(this.firstElementOffsetByLineIdx, (n) => e.endExclusive <= n) ?? this.elements.length; - return new He(t, i); + const t = VZ(this.firstElementOffsetByLineIdx, (n) => n <= e.start) ?? 0, i = Gre(this.firstElementOffsetByLineIdx, (n) => e.endExclusive <= n) ?? this.elements.length; + return new Pe(t, i); } } -function pW(s) { +function wR(s) { return s >= 97 && s <= 122 || s >= 65 && s <= 90 || s >= 48 && s <= 57; } -const Bue = { +const vme = { 0: 0, 1: 0, 2: 0, @@ -51020,132 +51020,132 @@ const Bue = { 7: 10, 8: 10 }; -function wz(s) { - return Bue[s]; +function Kz(s) { + return vme[s]; } -function Cz(s) { - return s === 10 ? 8 : s === 13 ? 7 : cT(s) ? 6 : s >= 97 && s <= 122 ? 0 : s >= 65 && s <= 90 ? 1 : s >= 48 && s <= 57 ? 2 : s === -1 ? 3 : s === 44 || s === 59 ? 5 : 4; +function Uz(s) { + return s === 10 ? 8 : s === 13 ? 7 : NT(s) ? 6 : s >= 97 && s <= 122 ? 0 : s >= 65 && s <= 90 ? 1 : s >= 48 && s <= 57 ? 2 : s === -1 ? 3 : s === 44 || s === 59 ? 5 : 4; } -function Oue(s, e, t, i, n, o) { - let { moves: r, excludedChanges: l } = Jue(s, e, t, o); +function Jme(s, e, t, i, n, o) { + let { moves: l, excludedChanges: r } = Eme(s, e, t, o); if (!o.isValid()) return []; - const a = s.filter((d) => !l.has(d)), c = Uue(a, i, n, e, t, o); - return Y2(r, c), r = Kue(r), r = r.filter((d) => { - const h = d.original.toOffsetRange().slice(e).map((g) => g.trim()); + const c = s.filter((a) => !r.has(a)), d = Dme(c, i, n, e, t, o); + return cw(l, d), l = Fme(l), l = l.filter((a) => { + const h = a.original.toOffsetRange().slice(e).map((m) => m.trim()); return h.join(` -`).length >= 15 && Hue(h, (g) => g.length >= 2) >= 2; - }), r = Que(s, r), r; +`).length >= 15 && Hme(h, (m) => m.length >= 2) >= 2; + }), l = zme(s, l), l; } -function Hue(s, e) { +function Hme(s, e) { let t = 0; for (const i of s) e(i) && t++; return t; } -function Jue(s, e, t, i) { - const n = [], o = s.filter((a) => a.modified.isEmpty && a.original.length >= 3).map((a) => new sx(a.original, e, a)), r = new Set(s.filter((a) => a.original.isEmpty && a.modified.length >= 3).map((a) => new sx(a.modified, t, a))), l = /* @__PURE__ */ new Set(); - for (const a of o) { - let c = -1, d; - for (const h of r) { - const u = a.computeSimilarity(h); - u > c && (c = u, d = h); +function Eme(s, e, t, i) { + const n = [], o = s.filter((c) => c.modified.isEmpty && c.original.length >= 3).map((c) => new yL(c.original, e, c)), l = new Set(s.filter((c) => c.original.isEmpty && c.modified.length >= 3).map((c) => new yL(c.modified, t, c))), r = /* @__PURE__ */ new Set(); + for (const c of o) { + let d = -1, a; + for (const h of l) { + const u = c.computeSimilarity(h); + u > d && (d = u, a = h); } - if (c > 0.9 && d && (r.delete(d), n.push(new Qn(a.range, d.range)), l.add(a.source), l.add(d.source)), !i.isValid()) - return { moves: n, excludedChanges: l }; + if (d > 0.9 && a && (l.delete(a), n.push(new qn(c.range, a.range)), r.add(c.source), r.add(a.source)), !i.isValid()) + return { moves: n, excludedChanges: r }; } - return { moves: n, excludedChanges: l }; + return { moves: n, excludedChanges: r }; } -function Uue(s, e, t, i, n, o) { - const r = [], l = new bE(); +function Dme(s, e, t, i, n, o) { + const l = [], r = new zv(); for (const u of s) - for (let g = u.original.startLineNumber; g < u.original.endLineNumberExclusive - 2; g++) { - const m = `${e[g - 1]}:${e[g + 1 - 1]}:${e[g + 2 - 1]}`; - l.add(m, { range: new We(g, g + 3) }); + for (let m = u.original.startLineNumber; m < u.original.endLineNumberExclusive - 2; m++) { + const b = `${e[m - 1]}:${e[m + 1 - 1]}:${e[m + 2 - 1]}`; + r.add(b, { range: new Ne(m, m + 3) }); } - const a = []; - s.sort(gs((u) => u.modified.startLineNumber, zr)); + const c = []; + s.sort(ps((u) => u.modified.startLineNumber, Ul)); for (const u of s) { - let g = []; - for (let m = u.modified.startLineNumber; m < u.modified.endLineNumberExclusive - 2; m++) { - const f = `${t[m - 1]}:${t[m + 1 - 1]}:${t[m + 2 - 1]}`, b = new We(m, m + 3), y = []; - l.forEach(f, ({ range: w }) => { - for (const S of g) - if (S.originalLineRange.endLineNumberExclusive + 1 === w.endLineNumberExclusive && S.modifiedLineRange.endLineNumberExclusive + 1 === b.endLineNumberExclusive) { - S.originalLineRange = new We(S.originalLineRange.startLineNumber, w.endLineNumberExclusive), S.modifiedLineRange = new We(S.modifiedLineRange.startLineNumber, b.endLineNumberExclusive), y.push(S); + let m = []; + for (let b = u.modified.startLineNumber; b < u.modified.endLineNumberExclusive - 2; b++) { + const g = `${t[b - 1]}:${t[b + 1 - 1]}:${t[b + 2 - 1]}`, Z = new Ne(b, b + 3), f = []; + r.forEach(g, ({ range: y }) => { + for (const G of m) + if (G.originalLineRange.endLineNumberExclusive + 1 === y.endLineNumberExclusive && G.modifiedLineRange.endLineNumberExclusive + 1 === Z.endLineNumberExclusive) { + G.originalLineRange = new Ne(G.originalLineRange.startLineNumber, y.endLineNumberExclusive), G.modifiedLineRange = new Ne(G.modifiedLineRange.startLineNumber, Z.endLineNumberExclusive), f.push(G); return; } - const C = { - modifiedLineRange: b, - originalLineRange: w + const W = { + modifiedLineRange: Z, + originalLineRange: y }; - a.push(C), y.push(C); - }), g = y; + c.push(W), f.push(W); + }), m = f; } if (!o.isValid()) return []; } - a.sort(MJ(gs((u) => u.modifiedLineRange.length, zr))); - const c = new ar(), d = new ar(); - for (const u of a) { - const g = u.modifiedLineRange.startLineNumber - u.originalLineRange.startLineNumber, m = c.subtractFrom(u.modifiedLineRange), f = d.subtractFrom(u.originalLineRange).getWithDelta(g), b = m.getIntersection(f); - for (const y of b.ranges) { - if (y.length < 3) + c.sort(r_(ps((u) => u.modifiedLineRange.length, Ul))); + const d = new al(), a = new al(); + for (const u of c) { + const m = u.modifiedLineRange.startLineNumber - u.originalLineRange.startLineNumber, b = d.subtractFrom(u.modifiedLineRange), g = a.subtractFrom(u.originalLineRange).getWithDelta(m), Z = b.getIntersection(g); + for (const f of Z.ranges) { + if (f.length < 3) continue; - const w = y, C = y.delta(-g); - r.push(new Qn(C, w)), c.addRange(w), d.addRange(C); - } - } - r.sort(gs((u) => u.original.startLineNumber, zr)); - const h = new RA(s); - for (let u = 0; u < r.length; u++) { - const g = r[u], m = h.findLastMonotonous((x) => x.original.startLineNumber <= g.original.startLineNumber), f = bb(s, (x) => x.modified.startLineNumber <= g.modified.startLineNumber), b = Math.max(g.original.startLineNumber - m.original.startLineNumber, g.modified.startLineNumber - f.modified.startLineNumber), y = h.findLastMonotonous((x) => x.original.startLineNumber < g.original.endLineNumberExclusive), w = bb(s, (x) => x.modified.startLineNumber < g.modified.endLineNumberExclusive), C = Math.max(y.original.endLineNumberExclusive - g.original.endLineNumberExclusive, w.modified.endLineNumberExclusive - g.modified.endLineNumberExclusive); - let S; - for (S = 0; S < b; S++) { - const x = g.original.startLineNumber - S - 1, Z = g.modified.startLineNumber - S - 1; - if (x > i.length || Z > n.length || c.contains(Z) || d.contains(x) || !Sz(i[x - 1], n[Z - 1], o)) + const y = f, W = f.delta(-m); + l.push(new qn(W, y)), d.addRange(y), a.addRange(W); + } + } + l.sort(ps((u) => u.original.startLineNumber, Ul)); + const h = new qV(s); + for (let u = 0; u < l.length; u++) { + const m = l[u], b = h.findLastMonotonous((L) => L.original.startLineNumber <= m.original.startLineNumber), g = VZ(s, (L) => L.modified.startLineNumber <= m.modified.startLineNumber), Z = Math.max(m.original.startLineNumber - b.original.startLineNumber, m.modified.startLineNumber - g.modified.startLineNumber), f = h.findLastMonotonous((L) => L.original.startLineNumber < m.original.endLineNumberExclusive), y = VZ(s, (L) => L.modified.startLineNumber < m.modified.endLineNumberExclusive), W = Math.max(f.original.endLineNumberExclusive - m.original.endLineNumberExclusive, y.modified.endLineNumberExclusive - m.modified.endLineNumberExclusive); + let G; + for (G = 0; G < Z; G++) { + const L = m.original.startLineNumber - G - 1, S = m.modified.startLineNumber - G - 1; + if (L > i.length || S > n.length || d.contains(S) || a.contains(L) || !Pz(i[L - 1], n[S - 1], o)) break; } - S > 0 && (d.addRange(new We(g.original.startLineNumber - S, g.original.startLineNumber)), c.addRange(new We(g.modified.startLineNumber - S, g.modified.startLineNumber))); - let L; - for (L = 0; L < C; L++) { - const x = g.original.endLineNumberExclusive + L, Z = g.modified.endLineNumberExclusive + L; - if (x > i.length || Z > n.length || c.contains(Z) || d.contains(x) || !Sz(i[x - 1], n[Z - 1], o)) + G > 0 && (a.addRange(new Ne(m.original.startLineNumber - G, m.original.startLineNumber)), d.addRange(new Ne(m.modified.startLineNumber - G, m.modified.startLineNumber))); + let X; + for (X = 0; X < W; X++) { + const L = m.original.endLineNumberExclusive + X, S = m.modified.endLineNumberExclusive + X; + if (L > i.length || S > n.length || d.contains(S) || a.contains(L) || !Pz(i[L - 1], n[S - 1], o)) break; } - L > 0 && (d.addRange(new We(g.original.endLineNumberExclusive, g.original.endLineNumberExclusive + L)), c.addRange(new We(g.modified.endLineNumberExclusive, g.modified.endLineNumberExclusive + L))), (S > 0 || L > 0) && (r[u] = new Qn(new We(g.original.startLineNumber - S, g.original.endLineNumberExclusive + L), new We(g.modified.startLineNumber - S, g.modified.endLineNumberExclusive + L))); + X > 0 && (a.addRange(new Ne(m.original.endLineNumberExclusive, m.original.endLineNumberExclusive + X)), d.addRange(new Ne(m.modified.endLineNumberExclusive, m.modified.endLineNumberExclusive + X))), (G > 0 || X > 0) && (l[u] = new qn(new Ne(m.original.startLineNumber - G, m.original.endLineNumberExclusive + X), new Ne(m.modified.startLineNumber - G, m.modified.endLineNumberExclusive + X))); } - return r; + return l; } -function Sz(s, e, t) { +function Pz(s, e, t) { if (s.trim() === e.trim()) return !0; if (s.length > 300 && e.length > 300) return !1; - const n = new r4().compute(new ox([s], new M(1, 1, 1, s.length), !1), new ox([e], new M(1, 1, 1, e.length), !1), t); + const n = new zO().compute(new WL([s], new I(1, 1, 1, s.length), !1), new WL([e], new I(1, 1, 1, e.length), !1), t); let o = 0; - const r = Oi.invert(n.diffs, s.length); - for (const d of r) - d.seq1Range.forEach((h) => { - cT(s.charCodeAt(h)) || o++; + const l = Pi.invert(n.diffs, s.length); + for (const a of l) + a.seq1Range.forEach((h) => { + NT(s.charCodeAt(h)) || o++; }); - function l(d) { + function r(a) { let h = 0; for (let u = 0; u < s.length; u++) - cT(d.charCodeAt(u)) || h++; + NT(a.charCodeAt(u)) || h++; return h; } - const a = l(s.length > e.length ? s : e); - return o / a > 0.6 && a > 10; + const c = r(s.length > e.length ? s : e); + return o / c > 0.6 && c > 10; } -function Kue(s) { +function Fme(s) { if (s.length === 0) return s; - s.sort(gs((t) => t.original.startLineNumber, zr)); + s.sort(ps((t) => t.original.startLineNumber, Ul)); const e = [s[0]]; for (let t = 1; t < s.length; t++) { - const i = e[e.length - 1], n = s[t], o = n.original.startLineNumber - i.original.endLineNumberExclusive, r = n.modified.startLineNumber - i.modified.endLineNumberExclusive; - if (o >= 0 && r >= 0 && o + r <= 2) { + const i = e[e.length - 1], n = s[t], o = n.original.startLineNumber - i.original.endLineNumberExclusive, l = n.modified.startLineNumber - i.modified.endLineNumberExclusive; + if (o >= 0 && l >= 0 && o + l <= 2) { e[e.length - 1] = i.join(n); continue; } @@ -51153,84 +51153,84 @@ function Kue(s) { } return e; } -function Que(s, e) { - const t = new RA(s); +function zme(s, e) { + const t = new qV(s); return e = e.filter((i) => { - const n = t.findLastMonotonous((l) => l.original.startLineNumber < i.original.endLineNumberExclusive) || new Qn(new We(1, 1), new We(1, 1)), o = bb(s, (l) => l.modified.startLineNumber < i.modified.endLineNumberExclusive); + const n = t.findLastMonotonous((r) => r.original.startLineNumber < i.original.endLineNumberExclusive) || new qn(new Ne(1, 1), new Ne(1, 1)), o = VZ(s, (r) => r.modified.startLineNumber < i.modified.endLineNumberExclusive); return n !== o; }), e; } -function dT(s, e, t) { +function wT(s, e, t) { let i = t; - return i = Lz(s, e, i), i = Lz(s, e, i), i = jue(s, e, i), i; + return i = Bz(s, e, i), i = Bz(s, e, i), i = Ame(s, e, i), i; } -function Lz(s, e, t) { +function Bz(s, e, t) { if (t.length === 0) return t; const i = []; i.push(t[0]); for (let o = 1; o < t.length; o++) { - const r = i[i.length - 1]; - let l = t[o]; - if (l.seq1Range.isEmpty || l.seq2Range.isEmpty) { - const a = l.seq1Range.start - r.seq1Range.endExclusive; - let c; - for (c = 1; c <= a && !(s.getElement(l.seq1Range.start - c) !== s.getElement(l.seq1Range.endExclusive - c) || e.getElement(l.seq2Range.start - c) !== e.getElement(l.seq2Range.endExclusive - c)); c++) + const l = i[i.length - 1]; + let r = t[o]; + if (r.seq1Range.isEmpty || r.seq2Range.isEmpty) { + const c = r.seq1Range.start - l.seq1Range.endExclusive; + let d; + for (d = 1; d <= c && !(s.getElement(r.seq1Range.start - d) !== s.getElement(r.seq1Range.endExclusive - d) || e.getElement(r.seq2Range.start - d) !== e.getElement(r.seq2Range.endExclusive - d)); d++) ; - if (c--, c === a) { - i[i.length - 1] = new Oi(new He(r.seq1Range.start, l.seq1Range.endExclusive - a), new He(r.seq2Range.start, l.seq2Range.endExclusive - a)); + if (d--, d === c) { + i[i.length - 1] = new Pi(new Pe(l.seq1Range.start, r.seq1Range.endExclusive - c), new Pe(l.seq2Range.start, r.seq2Range.endExclusive - c)); continue; } - l = l.delta(-c); + r = r.delta(-d); } - i.push(l); + i.push(r); } const n = []; for (let o = 0; o < i.length - 1; o++) { - const r = i[o + 1]; - let l = i[o]; - if (l.seq1Range.isEmpty || l.seq2Range.isEmpty) { - const a = r.seq1Range.start - l.seq1Range.endExclusive; - let c; - for (c = 0; c < a && !(!s.isStronglyEqual(l.seq1Range.start + c, l.seq1Range.endExclusive + c) || !e.isStronglyEqual(l.seq2Range.start + c, l.seq2Range.endExclusive + c)); c++) + const l = i[o + 1]; + let r = i[o]; + if (r.seq1Range.isEmpty || r.seq2Range.isEmpty) { + const c = l.seq1Range.start - r.seq1Range.endExclusive; + let d; + for (d = 0; d < c && !(!s.isStronglyEqual(r.seq1Range.start + d, r.seq1Range.endExclusive + d) || !e.isStronglyEqual(r.seq2Range.start + d, r.seq2Range.endExclusive + d)); d++) ; - if (c === a) { - i[o + 1] = new Oi(new He(l.seq1Range.start + a, r.seq1Range.endExclusive), new He(l.seq2Range.start + a, r.seq2Range.endExclusive)); + if (d === c) { + i[o + 1] = new Pi(new Pe(r.seq1Range.start + c, l.seq1Range.endExclusive), new Pe(r.seq2Range.start + c, l.seq2Range.endExclusive)); continue; } - c > 0 && (l = l.delta(c)); + d > 0 && (r = r.delta(d)); } - n.push(l); + n.push(r); } return i.length > 0 && n.push(i[i.length - 1]), n; } -function jue(s, e, t) { +function Ame(s, e, t) { if (!s.getBoundaryScore || !e.getBoundaryScore) return t; for (let i = 0; i < t.length; i++) { - const n = i > 0 ? t[i - 1] : void 0, o = t[i], r = i + 1 < t.length ? t[i + 1] : void 0, l = new He(n ? n.seq1Range.endExclusive + 1 : 0, r ? r.seq1Range.start - 1 : s.length), a = new He(n ? n.seq2Range.endExclusive + 1 : 0, r ? r.seq2Range.start - 1 : e.length); - o.seq1Range.isEmpty ? t[i] = Az(o, s, e, l, a) : o.seq2Range.isEmpty && (t[i] = Az(o.swap(), e, s, a, l).swap()); + const n = i > 0 ? t[i - 1] : void 0, o = t[i], l = i + 1 < t.length ? t[i + 1] : void 0, r = new Pe(n ? n.seq1Range.endExclusive + 1 : 0, l ? l.seq1Range.start - 1 : s.length), c = new Pe(n ? n.seq2Range.endExclusive + 1 : 0, l ? l.seq2Range.start - 1 : e.length); + o.seq1Range.isEmpty ? t[i] = _z(o, s, e, r, c) : o.seq2Range.isEmpty && (t[i] = _z(o.swap(), e, s, c, r).swap()); } return t; } -function Az(s, e, t, i, n) { - let r = 1; - for (; s.seq1Range.start - r >= i.start && s.seq2Range.start - r >= n.start && t.isStronglyEqual(s.seq2Range.start - r, s.seq2Range.endExclusive - r) && r < 100; ) - r++; - r--; - let l = 0; - for (; s.seq1Range.start + l < i.endExclusive && s.seq2Range.endExclusive + l < n.endExclusive && t.isStronglyEqual(s.seq2Range.start + l, s.seq2Range.endExclusive + l) && l < 100; ) +function _z(s, e, t, i, n) { + let l = 1; + for (; s.seq1Range.start - l >= i.start && s.seq2Range.start - l >= n.start && t.isStronglyEqual(s.seq2Range.start - l, s.seq2Range.endExclusive - l) && l < 100; ) l++; - if (r === 0 && l === 0) + l--; + let r = 0; + for (; s.seq1Range.start + r < i.endExclusive && s.seq2Range.endExclusive + r < n.endExclusive && t.isStronglyEqual(s.seq2Range.start + r, s.seq2Range.endExclusive + r) && r < 100; ) + r++; + if (l === 0 && r === 0) return s; - let a = 0, c = -1; - for (let d = -r; d <= l; d++) { - const h = s.seq2Range.start + d, u = s.seq2Range.endExclusive + d, g = s.seq1Range.start + d, m = e.getBoundaryScore(g) + t.getBoundaryScore(h) + t.getBoundaryScore(u); - m > c && (c = m, a = d); + let c = 0, d = -1; + for (let a = -l; a <= r; a++) { + const h = s.seq2Range.start + a, u = s.seq2Range.endExclusive + a, m = s.seq1Range.start + a, b = e.getBoundaryScore(m) + t.getBoundaryScore(h) + t.getBoundaryScore(u); + b > d && (d = b, c = a); } - return s.delta(a); + return s.delta(c); } -function que(s, e, t) { +function Kme(s, e, t) { const i = []; for (const n of t) { const o = i[i.length - 1]; @@ -51238,41 +51238,41 @@ function que(s, e, t) { i.push(n); continue; } - n.seq1Range.start - o.seq1Range.endExclusive <= 2 || n.seq2Range.start - o.seq2Range.endExclusive <= 2 ? i[i.length - 1] = new Oi(o.seq1Range.join(n.seq1Range), o.seq2Range.join(n.seq2Range)) : i.push(n); + n.seq1Range.start - o.seq1Range.endExclusive <= 2 || n.seq2Range.start - o.seq2Range.endExclusive <= 2 ? i[i.length - 1] = new Pi(o.seq1Range.join(n.seq1Range), o.seq2Range.join(n.seq2Range)) : i.push(n); } return i; } -function $ue(s, e, t) { - const i = Oi.invert(t, s.length), n = []; - let o = new _c(0, 0); - function r(a, c) { - if (a.offset1 < o.offset1 || a.offset2 < o.offset2) +function Ume(s, e, t) { + const i = Pi.invert(t, s.length), n = []; + let o = new wd(0, 0); + function l(c, d) { + if (c.offset1 < o.offset1 || c.offset2 < o.offset2) return; - const d = s.findWordContaining(a.offset1), h = e.findWordContaining(a.offset2); - if (!d || !h) + const a = s.findWordContaining(c.offset1), h = e.findWordContaining(c.offset2); + if (!a || !h) return; - let u = new Oi(d, h); - const g = u.intersect(c); - let m = g.seq1Range.length, f = g.seq2Range.length; + let u = new Pi(a, h); + const m = u.intersect(d); + let b = m.seq1Range.length, g = m.seq2Range.length; for (; i.length > 0; ) { - const b = i[0]; - if (!(b.seq1Range.intersects(u.seq1Range) || b.seq2Range.intersects(u.seq2Range))) + const Z = i[0]; + if (!(Z.seq1Range.intersects(u.seq1Range) || Z.seq2Range.intersects(u.seq2Range))) break; - const w = s.findWordContaining(b.seq1Range.start), C = e.findWordContaining(b.seq2Range.start), S = new Oi(w, C), L = S.intersect(b); - if (m += L.seq1Range.length, f += L.seq2Range.length, u = u.join(S), u.seq1Range.endExclusive >= b.seq1Range.endExclusive) + const y = s.findWordContaining(Z.seq1Range.start), W = e.findWordContaining(Z.seq2Range.start), G = new Pi(y, W), X = G.intersect(Z); + if (b += X.seq1Range.length, g += X.seq2Range.length, u = u.join(G), u.seq1Range.endExclusive >= Z.seq1Range.endExclusive) i.shift(); else break; } - m + f < (u.seq1Range.length + u.seq2Range.length) * 2 / 3 && n.push(u), o = u.getEndExclusives(); + b + g < (u.seq1Range.length + u.seq2Range.length) * 2 / 3 && n.push(u), o = u.getEndExclusives(); } for (; i.length > 0; ) { - const a = i.shift(); - a.seq1Range.isEmpty || (r(a.getStarts(), a), r(a.getEndExclusives().delta(-1), a)); + const c = i.shift(); + c.seq1Range.isEmpty || (l(c.getStarts(), c), l(c.getEndExclusives().delta(-1), c)); } - return ege(t, n); + return Pme(t, n); } -function ege(s, e) { +function Pme(s, e) { const t = []; for (; s.length > 0 || e.length > 0; ) { const i = s[0], n = e[0]; @@ -51281,72 +51281,72 @@ function ege(s, e) { } return t; } -function tge(s, e, t) { +function Bme(s, e, t) { let i = t; if (i.length === 0) return i; let n = 0, o; do { o = !1; - const r = [ + const l = [ i[0] ]; - for (let l = 1; l < i.length; l++) { - let d = function(u, g) { - const m = new He(c.seq1Range.endExclusive, a.seq1Range.start); - return s.getText(m).replace(/\s/g, "").length <= 4 && (u.seq1Range.length + u.seq2Range.length > 5 || g.seq1Range.length + g.seq2Range.length > 5); + for (let r = 1; r < i.length; r++) { + let a = function(u, m) { + const b = new Pe(d.seq1Range.endExclusive, c.seq1Range.start); + return s.getText(b).replace(/\s/g, "").length <= 4 && (u.seq1Range.length + u.seq2Range.length > 5 || m.seq1Range.length + m.seq2Range.length > 5); }; - const a = i[l], c = r[r.length - 1]; - d(c, a) ? (o = !0, r[r.length - 1] = r[r.length - 1].join(a)) : r.push(a); + const c = i[r], d = l[l.length - 1]; + a(d, c) ? (o = !0, l[l.length - 1] = l[l.length - 1].join(c)) : l.push(c); } - i = r; + i = l; } while (n++ < 10 && o); return i; } -function ige(s, e, t) { +function _me(s, e, t) { let i = t; if (i.length === 0) return i; let n = 0, o; do { o = !1; - const l = [ + const r = [ i[0] ]; - for (let a = 1; a < i.length; a++) { - let h = function(g, m) { - const f = new He(d.seq1Range.endExclusive, c.seq1Range.start); - if (s.countLinesIn(f) > 5 || f.length > 500) + for (let c = 1; c < i.length; c++) { + let h = function(m, b) { + const g = new Pe(a.seq1Range.endExclusive, d.seq1Range.start); + if (s.countLinesIn(g) > 5 || g.length > 500) return !1; - const y = s.getText(f).trim(); - if (y.length > 20 || y.split(/\r\n|\r|\n/).length > 1) + const f = s.getText(g).trim(); + if (f.length > 20 || f.split(/\r\n|\r|\n/).length > 1) return !1; - const w = s.countLinesIn(g.seq1Range), C = g.seq1Range.length, S = e.countLinesIn(g.seq2Range), L = g.seq2Range.length, x = s.countLinesIn(m.seq1Range), Z = m.seq1Range.length, _ = e.countLinesIn(m.seq2Range), v = m.seq2Range.length, P = 2 * 40 + 50; - function E(Y) { - return Math.min(Y, P); + const y = s.countLinesIn(m.seq1Range), W = m.seq1Range.length, G = e.countLinesIn(m.seq2Range), X = m.seq2Range.length, L = s.countLinesIn(b.seq1Range), S = b.seq1Range.length, x = e.countLinesIn(b.seq2Range), w = b.seq2Range.length, A = 2 * 40 + 50; + function H(F) { + return Math.min(F, A); } - return Math.pow(Math.pow(E(w * 40 + C), 1.5) + Math.pow(E(S * 40 + L), 1.5), 1.5) + Math.pow(Math.pow(E(x * 40 + Z), 1.5) + Math.pow(E(_ * 40 + v), 1.5), 1.5) > (P ** 1.5) ** 1.5 * 1.3; + return Math.pow(Math.pow(H(y * 40 + W), 1.5) + Math.pow(H(G * 40 + X), 1.5), 1.5) + Math.pow(Math.pow(H(L * 40 + S), 1.5) + Math.pow(H(x * 40 + w), 1.5), 1.5) > (A ** 1.5) ** 1.5 * 1.3; }; - const c = i[a], d = l[l.length - 1]; - h(d, c) ? (o = !0, l[l.length - 1] = l[l.length - 1].join(c)) : l.push(c); + const d = i[c], a = r[r.length - 1]; + h(a, d) ? (o = !0, r[r.length - 1] = r[r.length - 1].join(d)) : r.push(d); } - i = l; + i = r; } while (n++ < 10 && o); - const r = []; - return lee(i, (l, a, c) => { - let d = a; - function h(y) { - return y.length > 0 && y.trim().length <= 3 && a.seq1Range.length + a.seq2Range.length > 100; - } - const u = s.extendToFullLines(a.seq1Range), g = s.getText(new He(u.start, a.seq1Range.start)); - h(g) && (d = d.deltaStart(-g.length)); - const m = s.getText(new He(a.seq1Range.endExclusive, u.endExclusive)); - h(m) && (d = d.deltaEnd(m.length)); - const f = Oi.fromOffsetPairs(l ? l.getEndExclusives() : _c.zero, c ? c.getStarts() : _c.max), b = d.intersect(f); - r.length > 0 && b.getStarts().equals(r[r.length - 1].getEndExclusives()) ? r[r.length - 1] = r[r.length - 1].join(b) : r.push(b); - }), r; -} -let xz = class { + const l = []; + return $ee(i, (r, c, d) => { + let a = c; + function h(f) { + return f.length > 0 && f.trim().length <= 3 && c.seq1Range.length + c.seq2Range.length > 100; + } + const u = s.extendToFullLines(c.seq1Range), m = s.getText(new Pe(u.start, c.seq1Range.start)); + h(m) && (a = a.deltaStart(-m.length)); + const b = s.getText(new Pe(c.seq1Range.endExclusive, u.endExclusive)); + h(b) && (a = a.deltaEnd(b.length)); + const g = Pi.fromOffsetPairs(r ? r.getEndExclusives() : wd.zero, d ? d.getStarts() : wd.max), Z = a.intersect(g); + l.length > 0 && Z.getStarts().equals(l[l.length - 1].getEndExclusives()) ? l[l.length - 1] = l[l.length - 1].join(Z) : l.push(Z); + }), l; +} +let Qz = class { constructor(e, t) { this.trimmedHash = e, this.lines = t; } @@ -51357,7 +51357,7 @@ let xz = class { return this.trimmedHash.length; } getBoundaryScore(e) { - const t = e === 0 ? 0 : Mz(this.lines[e - 1]), i = e === this.lines.length ? 0 : Mz(this.lines[e]); + const t = e === 0 ? 0 : Oz(this.lines[e - 1]), i = e === this.lines.length ? 0 : Oz(this.lines[e]); return 1e3 - (t + i); } getText(e) { @@ -51368,279 +51368,279 @@ let xz = class { return this.lines[e] === this.lines[t]; } }; -function Mz(s) { +function Oz(s) { let e = 0; for (; e < s.length && (s.charCodeAt(e) === 32 || s.charCodeAt(e) === 9); ) e++; return e; } -class ML { +class DX { constructor(e, t, i) { this.changes = e, this.moves = t, this.hitTimeout = i; } } -class l4 { +class AO { constructor(e, t) { this.lineRangeMapping = e, this.changes = t; } } -class a4 { +class KO { constructor() { - this.dynamicProgrammingDiffing = new Yue(), this.myersDiffingAlgorithm = new r4(); + this.dynamicProgrammingDiffing = new Mme(), this.myersDiffingAlgorithm = new zO(); } computeDiff(e, t, i) { - if (e.length <= 1 && ei(e, t, (L, x) => L === x)) - return new ML([], [], !1); + if (e.length <= 1 && ti(e, t, (X, L) => X === L)) + return new DX([], [], !1); if (e.length === 1 && e[0].length === 0 || t.length === 1 && t[0].length === 0) - return new ML([ - new zo(new We(1, e.length + 1), new We(1, t.length + 1), [ - new Wo(new M(1, 1, e.length, e[e.length - 1].length + 1), new M(1, 1, t.length, t[t.length - 1].length + 1)) + return new DX([ + new Ko(new Ne(1, e.length + 1), new Ne(1, t.length + 1), [ + new To(new I(1, 1, e.length, e[e.length - 1].length + 1), new I(1, 1, t.length, t[t.length - 1].length + 1)) ]) ], [], !1); - const n = i.maxComputationTimeMs === 0 ? C1.instance : new Fue(i.maxComputationTimeMs), o = !i.ignoreTrimWhitespace, r = /* @__PURE__ */ new Map(); - function l(L) { - let x = r.get(L); - return x === void 0 && (x = r.size, r.set(L, x)), x; - } - const a = e.map((L) => l(L.trim())), c = t.map((L) => l(L.trim())), d = new xz(a, e), h = new xz(c, t), u = d.length + h.length < 1700 ? this.dynamicProgrammingDiffing.compute(d, h, n, (L, x) => e[L] === t[x] ? t[x].length === 0 ? 0.1 : 1 + Math.log(1 + t[x].length) : 0.99) : this.myersDiffingAlgorithm.compute(d, h, n); - let g = u.diffs, m = u.hitTimeout; - g = dT(d, h, g), g = tge(d, h, g); - const f = [], b = (L) => { + const n = i.maxComputationTimeMs === 0 ? TW.instance : new Tme(i.maxComputationTimeMs), o = !i.ignoreTrimWhitespace, l = /* @__PURE__ */ new Map(); + function r(X) { + let L = l.get(X); + return L === void 0 && (L = l.size, l.set(X, L)), L; + } + const c = e.map((X) => r(X.trim())), d = t.map((X) => r(X.trim())), a = new Qz(c, e), h = new Qz(d, t), u = a.length + h.length < 1700 ? this.dynamicProgrammingDiffing.compute(a, h, n, (X, L) => e[X] === t[L] ? t[L].length === 0 ? 0.1 : 1 + Math.log(1 + t[L].length) : 0.99) : this.myersDiffingAlgorithm.compute(a, h, n); + let m = u.diffs, b = u.hitTimeout; + m = wT(a, h, m), m = Bme(a, h, m); + const g = [], Z = (X) => { if (o) - for (let x = 0; x < L; x++) { - const Z = y + x, _ = w + x; - if (e[Z] !== t[_]) { - const v = this.refineDiff(e, t, new Oi(new He(Z, Z + 1), new He(_, _ + 1)), n, o); - for (const P of v.mappings) - f.push(P); - v.hitTimeout && (m = !0); + for (let L = 0; L < X; L++) { + const S = f + L, x = y + L; + if (e[S] !== t[x]) { + const w = this.refineDiff(e, t, new Pi(new Pe(S, S + 1), new Pe(x, x + 1)), n, o); + for (const A of w.mappings) + g.push(A); + w.hitTimeout && (b = !0); } } }; - let y = 0, w = 0; - for (const L of g) { - gm(() => L.seq1Range.start - y === L.seq2Range.start - w); - const x = L.seq1Range.start - y; - b(x), y = L.seq1Range.endExclusive, w = L.seq2Range.endExclusive; - const Z = this.refineDiff(e, t, L, n, o); - Z.hitTimeout && (m = !0); - for (const _ of Z.mappings) - f.push(_); - } - b(e.length - y); - const C = Zz(f, e, t); - let S = []; - return i.computeMoves && (S = this.computeMoves(C, e, t, a, c, n, o)), gm(() => { - function L(Z, _) { - if (Z.lineNumber < 1 || Z.lineNumber > _.length) + let f = 0, y = 0; + for (const X of m) { + fb(() => X.seq1Range.start - f === X.seq2Range.start - y); + const L = X.seq1Range.start - f; + Z(L), f = X.seq1Range.endExclusive, y = X.seq2Range.endExclusive; + const S = this.refineDiff(e, t, X, n, o); + S.hitTimeout && (b = !0); + for (const x of S.mappings) + g.push(x); + } + Z(e.length - f); + const W = jz(g, e, t); + let G = []; + return i.computeMoves && (G = this.computeMoves(W, e, t, c, d, n, o)), fb(() => { + function X(S, x) { + if (S.lineNumber < 1 || S.lineNumber > x.length) return !1; - const v = _[Z.lineNumber - 1]; - return !(Z.column < 1 || Z.column > v.length + 1); + const w = x[S.lineNumber - 1]; + return !(S.column < 1 || S.column > w.length + 1); } - function x(Z, _) { - return !(Z.startLineNumber < 1 || Z.startLineNumber > _.length + 1 || Z.endLineNumberExclusive < 1 || Z.endLineNumberExclusive > _.length + 1); + function L(S, x) { + return !(S.startLineNumber < 1 || S.startLineNumber > x.length + 1 || S.endLineNumberExclusive < 1 || S.endLineNumberExclusive > x.length + 1); } - for (const Z of C) { - if (!Z.innerChanges) + for (const S of W) { + if (!S.innerChanges) return !1; - for (const _ of Z.innerChanges) - if (!(L(_.modifiedRange.getStartPosition(), t) && L(_.modifiedRange.getEndPosition(), t) && L(_.originalRange.getStartPosition(), e) && L(_.originalRange.getEndPosition(), e))) + for (const x of S.innerChanges) + if (!(X(x.modifiedRange.getStartPosition(), t) && X(x.modifiedRange.getEndPosition(), t) && X(x.originalRange.getStartPosition(), e) && X(x.originalRange.getEndPosition(), e))) return !1; - if (!x(Z.modified, t) || !x(Z.original, e)) + if (!L(S.modified, t) || !L(S.original, e)) return !1; } return !0; - }), new ML(C, S, m); + }), new DX(W, G, b); } - computeMoves(e, t, i, n, o, r, l) { - return Oue(e, t, i, n, o, r).map((d) => { - const h = this.refineDiff(t, i, new Oi(d.original.toOffsetRange(), d.modified.toOffsetRange()), r, l), u = Zz(h.mappings, t, i, !0); - return new l4(d, u); + computeMoves(e, t, i, n, o, l, r) { + return Jme(e, t, i, n, o, l).map((a) => { + const h = this.refineDiff(t, i, new Pi(a.original.toOffsetRange(), a.modified.toOffsetRange()), l, r), u = jz(h.mappings, t, i, !0); + return new AO(a, u); }); } refineDiff(e, t, i, n, o) { - const l = sge(i).toRangeMapping2(e, t), a = new ox(e, l.originalRange, o), c = new ox(t, l.modifiedRange, o), d = a.length + c.length < 500 ? this.dynamicProgrammingDiffing.compute(a, c, n) : this.myersDiffingAlgorithm.compute(a, c, n); - let h = d.diffs; - return h = dT(a, c, h), h = $ue(a, c, h), h = que(a, c, h), h = ige(a, c, h), { - mappings: h.map((g) => new Wo(a.translateRange(g.seq1Range), c.translateRange(g.seq2Range))), - hitTimeout: d.hitTimeout + const r = Ome(i).toRangeMapping2(e, t), c = new WL(e, r.originalRange, o), d = new WL(t, r.modifiedRange, o), a = c.length + d.length < 500 ? this.dynamicProgrammingDiffing.compute(c, d, n) : this.myersDiffingAlgorithm.compute(c, d, n); + let h = a.diffs; + return h = wT(c, d, h), h = Ume(c, d, h), h = Kme(c, d, h), h = _me(c, d, h), { + mappings: h.map((m) => new To(c.translateRange(m.seq1Range), d.translateRange(m.seq2Range))), + hitTimeout: a.hitTimeout }; } } -function Zz(s, e, t, i = !1) { +function jz(s, e, t, i = !1) { const n = []; - for (const o of CE(s.map((r) => nge(r, e, t)), (r, l) => r.original.overlapOrTouch(l.original) || r.modified.overlapOrTouch(l.modified))) { - const r = o[0], l = o[o.length - 1]; - n.push(new zo(r.original.join(l.original), r.modified.join(l.modified), o.map((a) => a.innerChanges[0]))); + for (const o of Uv(s.map((l) => Qme(l, e, t)), (l, r) => l.original.overlapOrTouch(r.original) || l.modified.overlapOrTouch(r.modified))) { + const l = o[0], r = o[o.length - 1]; + n.push(new Ko(l.original.join(r.original), l.modified.join(r.modified), o.map((c) => c.innerChanges[0]))); } - return gm(() => !i && n.length > 0 && (n[0].modified.startLineNumber !== n[0].original.startLineNumber || t.length - n[n.length - 1].modified.endLineNumberExclusive !== e.length - n[n.length - 1].original.endLineNumberExclusive) ? !1 : gE(n, (o, r) => r.original.startLineNumber - o.original.endLineNumberExclusive === r.modified.startLineNumber - o.modified.endLineNumberExclusive && // There has to be an unchanged line in between (otherwise both diffs should have been joined) - o.original.endLineNumberExclusive < r.original.startLineNumber && o.modified.endLineNumberExclusive < r.modified.startLineNumber)), n; + return fb(() => !i && n.length > 0 && (n[0].modified.startLineNumber !== n[0].original.startLineNumber || t.length - n[n.length - 1].modified.endLineNumberExclusive !== e.length - n[n.length - 1].original.endLineNumberExclusive) ? !1 : Hv(n, (o, l) => l.original.startLineNumber - o.original.endLineNumberExclusive === l.modified.startLineNumber - o.modified.endLineNumberExclusive && // There has to be an unchanged line in between (otherwise both diffs should have been joined) + o.original.endLineNumberExclusive < l.original.startLineNumber && o.modified.endLineNumberExclusive < l.modified.startLineNumber)), n; } -function nge(s, e, t) { +function Qme(s, e, t) { let i = 0, n = 0; s.modifiedRange.endColumn === 1 && s.originalRange.endColumn === 1 && s.originalRange.startLineNumber + i <= s.originalRange.endLineNumber && s.modifiedRange.startLineNumber + i <= s.modifiedRange.endLineNumber && (n = -1), s.modifiedRange.startColumn - 1 >= t[s.modifiedRange.startLineNumber - 1].length && s.originalRange.startColumn - 1 >= e[s.originalRange.startLineNumber - 1].length && s.originalRange.startLineNumber <= s.originalRange.endLineNumber + n && s.modifiedRange.startLineNumber <= s.modifiedRange.endLineNumber + n && (i = 1); - const o = new We(s.originalRange.startLineNumber + i, s.originalRange.endLineNumber + 1 + n), r = new We(s.modifiedRange.startLineNumber + i, s.modifiedRange.endLineNumber + 1 + n); - return new zo(o, r, [s]); + const o = new Ne(s.originalRange.startLineNumber + i, s.originalRange.endLineNumber + 1 + n), l = new Ne(s.modifiedRange.startLineNumber + i, s.modifiedRange.endLineNumber + 1 + n); + return new Ko(o, l, [s]); } -function sge(s) { - return new Qn(new We(s.seq1Range.start + 1, s.seq1Range.endExclusive + 1), new We(s.seq2Range.start + 1, s.seq2Range.endExclusive + 1)); +function Ome(s) { + return new qn(new Ne(s.seq1Range.start + 1, s.seq1Range.endExclusive + 1), new Ne(s.seq2Range.start + 1, s.seq2Range.endExclusive + 1)); } -var oge = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var jme = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, rge = function(s, e) { +}, qme = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let hT = class extends R { +let TT = class extends J { setActiveMovedText(e) { this._activeMovedText.set(e, void 0); } constructor(e, t, i) { - super(), this.model = e, this._options = t, this._diffProviderFactoryService = i, this._isDiffUpToDate = Oe(this, !1), this.isDiffUpToDate = this._isDiffUpToDate, this._diff = Oe(this, void 0), this.diff = this._diff, this._unchangedRegions = Oe(this, void 0), this.unchangedRegions = ye(this, (l) => { - var a; - return this._options.hideUnchangedRegions.read(l) ? ((a = this._unchangedRegions.read(l)) == null ? void 0 : a.regions) ?? [] : (oi((c) => { - var d; - for (const h of ((d = this._unchangedRegions.get()) == null ? void 0 : d.regions) || []) - h.collapseAll(c); + super(), this.model = e, this._options = t, this._diffProviderFactoryService = i, this._isDiffUpToDate = Ue(this, !1), this.isDiffUpToDate = this._isDiffUpToDate, this._diff = Ue(this, void 0), this.diff = this._diff, this._unchangedRegions = Ue(this, void 0), this.unchangedRegions = fe(this, (r) => { + var c; + return this._options.hideUnchangedRegions.read(r) ? ((c = this._unchangedRegions.read(r)) == null ? void 0 : c.regions) ?? [] : (li((d) => { + var a; + for (const h of ((a = this._unchangedRegions.get()) == null ? void 0 : a.regions) || []) + h.collapseAll(d); }), []); - }), this.movedTextToCompare = Oe(this, void 0), this._activeMovedText = Oe(this, void 0), this._hoveredMovedText = Oe(this, void 0), this.activeMovedText = ye(this, (l) => this.movedTextToCompare.read(l) ?? this._hoveredMovedText.read(l) ?? this._activeMovedText.read(l)), this._cancellationTokenSource = new mi(), this._diffProvider = ye(this, (l) => { - const a = this._diffProviderFactoryService.createDiffProvider({ - diffAlgorithm: this._options.diffAlgorithm.read(l) - }), c = Zn("onDidChange", a.onDidChange); + }), this.movedTextToCompare = Ue(this, void 0), this._activeMovedText = Ue(this, void 0), this._hoveredMovedText = Ue(this, void 0), this.activeMovedText = fe(this, (r) => this.movedTextToCompare.read(r) ?? this._hoveredMovedText.read(r) ?? this._activeMovedText.read(r)), this._cancellationTokenSource = new pi(), this._diffProvider = fe(this, (r) => { + const c = this._diffProviderFactoryService.createDiffProvider({ + diffAlgorithm: this._options.diffAlgorithm.read(r) + }), d = xn("onDidChange", c.onDidChange); return { - diffProvider: a, - onChangeSignal: c + diffProvider: c, + onChangeSignal: d }; - }), this._register(Ce(() => this._cancellationTokenSource.cancel())); - const n = d0("contentChangedSignal"), o = this._register(new Zt(() => n.trigger(void 0), 200)); - this._register(Te((l) => { - const a = this._unchangedRegions.read(l); - if (!a || a.regions.some((m) => m.isDragged.read(l))) + }), this._register(We(() => this._cancellationTokenSource.cancel())); + const n = g0("contentChangedSignal"), o = this._register(new St(() => n.trigger(void 0), 200)); + this._register(Te((r) => { + const c = this._unchangedRegions.read(r); + if (!c || c.regions.some((b) => b.isDragged.read(r))) return; - const c = a.originalDecorationIds.map((m) => e.original.getDecorationRange(m)).map((m) => m ? We.fromRangeInclusive(m) : void 0), d = a.modifiedDecorationIds.map((m) => e.modified.getDecorationRange(m)).map((m) => m ? We.fromRangeInclusive(m) : void 0), h = a.regions.map((m, f) => !c[f] || !d[f] ? void 0 : new Jd(c[f].startLineNumber, d[f].startLineNumber, c[f].length, m.visibleLineCountTop.read(l), m.visibleLineCountBottom.read(l))).filter(xa), u = []; - let g = !1; - for (const m of CE(h, (f, b) => f.getHiddenModifiedRange(l).endLineNumberExclusive === b.getHiddenModifiedRange(l).startLineNumber)) - if (m.length > 1) { - g = !0; - const f = m.reduce((y, w) => y + w.lineCount, 0), b = new Jd(m[0].originalLineNumber, m[0].modifiedLineNumber, f, m[0].visibleLineCountTop.get(), m[m.length - 1].visibleLineCountBottom.get()); - u.push(b); + const d = c.originalDecorationIds.map((b) => e.original.getDecorationRange(b)).map((b) => b ? Ne.fromRangeInclusive(b) : void 0), a = c.modifiedDecorationIds.map((b) => e.modified.getDecorationRange(b)).map((b) => b ? Ne.fromRangeInclusive(b) : void 0), h = c.regions.map((b, g) => !d[g] || !a[g] ? void 0 : new ja(d[g].startLineNumber, a[g].startLineNumber, d[g].length, b.visibleLineCountTop.read(r), b.visibleLineCountBottom.read(r))).filter(Cc), u = []; + let m = !1; + for (const b of Uv(h, (g, Z) => g.getHiddenModifiedRange(r).endLineNumberExclusive === Z.getHiddenModifiedRange(r).startLineNumber)) + if (b.length > 1) { + m = !0; + const g = b.reduce((f, y) => f + y.lineCount, 0), Z = new ja(b[0].originalLineNumber, b[0].modifiedLineNumber, g, b[0].visibleLineCountTop.get(), b[b.length - 1].visibleLineCountBottom.get()); + u.push(Z); } else - u.push(m[0]); - if (g) { - const m = e.original.deltaDecorations(a.originalDecorationIds, u.map((b) => ({ range: b.originalUnchangedRange.toInclusiveRange(), options: { description: "unchanged" } }))), f = e.modified.deltaDecorations(a.modifiedDecorationIds, u.map((b) => ({ range: b.modifiedUnchangedRange.toInclusiveRange(), options: { description: "unchanged" } }))); - oi((b) => { + u.push(b[0]); + if (m) { + const b = e.original.deltaDecorations(c.originalDecorationIds, u.map((Z) => ({ range: Z.originalUnchangedRange.toInclusiveRange(), options: { description: "unchanged" } }))), g = e.modified.deltaDecorations(c.modifiedDecorationIds, u.map((Z) => ({ range: Z.modifiedUnchangedRange.toInclusiveRange(), options: { description: "unchanged" } }))); + li((Z) => { this._unchangedRegions.set({ regions: u, - originalDecorationIds: m, - modifiedDecorationIds: f - }, b); + originalDecorationIds: b, + modifiedDecorationIds: g + }, Z); }); } })); - const r = (l, a, c) => { - const d = Jd.fromDiffs(l.changes, e.original.getLineCount(), e.modified.getLineCount(), this._options.hideUnchangedRegionsMinimumLineCount.read(c), this._options.hideUnchangedRegionsContextLineCount.read(c)); + const l = (r, c, d) => { + const a = ja.fromDiffs(r.changes, e.original.getLineCount(), e.modified.getLineCount(), this._options.hideUnchangedRegionsMinimumLineCount.read(d), this._options.hideUnchangedRegionsContextLineCount.read(d)); let h; const u = this._unchangedRegions.get(); if (u) { - const b = u.originalDecorationIds.map((S) => e.original.getDecorationRange(S)).map((S) => S ? We.fromRangeInclusive(S) : void 0), y = u.modifiedDecorationIds.map((S) => e.modified.getDecorationRange(S)).map((S) => S ? We.fromRangeInclusive(S) : void 0); - let C = wue(u.regions.map((S, L) => { - if (!b[L] || !y[L]) + const Z = u.originalDecorationIds.map((G) => e.original.getDecorationRange(G)).map((G) => G ? Ne.fromRangeInclusive(G) : void 0), f = u.modifiedDecorationIds.map((G) => e.modified.getDecorationRange(G)).map((G) => G ? Ne.fromRangeInclusive(G) : void 0); + let W = hme(u.regions.map((G, X) => { + if (!Z[X] || !f[X]) return; - const x = b[L].length; - return new Jd( - b[L].startLineNumber, - y[L].startLineNumber, - x, + const L = Z[X].length; + return new ja( + Z[X].startLineNumber, + f[X].startLineNumber, + L, // The visible area can shrink by edits -> we have to account for this - Math.min(S.visibleLineCountTop.get(), x), - Math.min(S.visibleLineCountBottom.get(), x - S.visibleLineCountTop.get()) + Math.min(G.visibleLineCountTop.get(), L), + Math.min(G.visibleLineCountBottom.get(), L - G.visibleLineCountTop.get()) ); - }).filter(xa), (S, L) => !L || S.modifiedLineNumber >= L.modifiedLineNumber + L.lineCount && S.originalLineNumber >= L.originalLineNumber + L.lineCount).map((S) => new Qn(S.getHiddenOriginalRange(c), S.getHiddenModifiedRange(c))); - C = Qn.clip(C, We.ofLength(1, e.original.getLineCount()), We.ofLength(1, e.modified.getLineCount())), h = Qn.inverse(C, e.original.getLineCount(), e.modified.getLineCount()); + }).filter(Cc), (G, X) => !X || G.modifiedLineNumber >= X.modifiedLineNumber + X.lineCount && G.originalLineNumber >= X.originalLineNumber + X.lineCount).map((G) => new qn(G.getHiddenOriginalRange(d), G.getHiddenModifiedRange(d))); + W = qn.clip(W, Ne.ofLength(1, e.original.getLineCount()), Ne.ofLength(1, e.modified.getLineCount())), h = qn.inverse(W, e.original.getLineCount(), e.modified.getLineCount()); } - const g = []; + const m = []; if (h) - for (const b of d) { - const y = h.filter((w) => w.original.intersectsStrict(b.originalUnchangedRange) && w.modified.intersectsStrict(b.modifiedUnchangedRange)); - g.push(...b.setVisibleRanges(y, a)); + for (const Z of a) { + const f = h.filter((y) => y.original.intersectsStrict(Z.originalUnchangedRange) && y.modified.intersectsStrict(Z.modifiedUnchangedRange)); + m.push(...Z.setVisibleRanges(f, c)); } else - g.push(...d); - const m = e.original.deltaDecorations((u == null ? void 0 : u.originalDecorationIds) || [], g.map((b) => ({ range: b.originalUnchangedRange.toInclusiveRange(), options: { description: "unchanged" } }))), f = e.modified.deltaDecorations((u == null ? void 0 : u.modifiedDecorationIds) || [], g.map((b) => ({ range: b.modifiedUnchangedRange.toInclusiveRange(), options: { description: "unchanged" } }))); + m.push(...a); + const b = e.original.deltaDecorations((u == null ? void 0 : u.originalDecorationIds) || [], m.map((Z) => ({ range: Z.originalUnchangedRange.toInclusiveRange(), options: { description: "unchanged" } }))), g = e.modified.deltaDecorations((u == null ? void 0 : u.modifiedDecorationIds) || [], m.map((Z) => ({ range: Z.modifiedUnchangedRange.toInclusiveRange(), options: { description: "unchanged" } }))); this._unchangedRegions.set({ - regions: g, - originalDecorationIds: m, - modifiedDecorationIds: f - }, a); + regions: m, + originalDecorationIds: b, + modifiedDecorationIds: g + }, c); }; - this._register(e.modified.onDidChangeContent((l) => { + this._register(e.modified.onDidChangeContent((r) => { if (this._diff.get()) { - const c = Zc.fromModelContentChanges(l.changes); + const d = Nd.fromModelContentChanges(r.changes); this._lastDiff, e.original, e.modified; } this._isDiffUpToDate.set(!1, void 0), o.schedule(); - })), this._register(e.original.onDidChangeContent((l) => { + })), this._register(e.original.onDidChangeContent((r) => { if (this._diff.get()) { - const c = Zc.fromModelContentChanges(l.changes); + const d = Nd.fromModelContentChanges(r.changes); this._lastDiff, e.original, e.modified; } this._isDiffUpToDate.set(!1, void 0), o.schedule(); - })), this._register(ks(async (l, a) => { - this._options.hideUnchangedRegionsMinimumLineCount.read(l), this._options.hideUnchangedRegionsContextLineCount.read(l), o.cancel(), n.read(l); - const c = this._diffProvider.read(l); - c.onChangeSignal.read(l), eo(a4, l), eo(dT, l), this._isDiffUpToDate.set(!1, void 0); - let d = []; - a.add(e.original.onDidChangeContent((g) => { - const m = Zc.fromModelContentChanges(g.changes); - d = PA(d, m); + })), this._register(Js(async (r, c) => { + this._options.hideUnchangedRegionsMinimumLineCount.read(r), this._options.hideUnchangedRegionsContextLineCount.read(r), o.cancel(), n.read(r); + const d = this._diffProvider.read(r); + d.onChangeSignal.read(r), io(KO, r), io(wT, r), this._isDiffUpToDate.set(!1, void 0); + let a = []; + c.add(e.original.onDidChangeContent((m) => { + const b = Nd.fromModelContentChanges(m.changes); + a = sL(a, b); })); let h = []; - a.add(e.modified.onDidChangeContent((g) => { - const m = Zc.fromModelContentChanges(g.changes); - h = PA(h, m); + c.add(e.modified.onDidChangeContent((m) => { + const b = Nd.fromModelContentChanges(m.changes); + h = sL(h, b); })); - let u = await c.diffProvider.computeDiff(e.original, e.modified, { - ignoreTrimWhitespace: this._options.ignoreTrimWhitespace.read(l), - maxComputationTimeMs: this._options.maxComputationTimeMs.read(l), - computeMoves: this._options.showMoves.read(l) + let u = await d.diffProvider.computeDiff(e.original, e.modified, { + ignoreTrimWhitespace: this._options.ignoreTrimWhitespace.read(r), + maxComputationTimeMs: this._options.maxComputationTimeMs.read(r), + computeMoves: this._options.showMoves.read(r) }, this._cancellationTokenSource.token); - this._cancellationTokenSource.token.isCancellationRequested || e.original.isDisposed() || e.modified.isDisposed() || (u = lge(u, e.original, e.modified), u = (e.original, e.modified, void 0) ?? u, u = (e.original, e.modified, void 0) ?? u, oi((g) => { - r(u, g), this._lastDiff = u; - const m = EX.fromDiffResult(u); - this._diff.set(m, g), this._isDiffUpToDate.set(!0, g); - const f = this.movedTextToCompare.get(); - this.movedTextToCompare.set(f ? this._lastDiff.moves.find((b) => b.lineRangeMapping.modified.intersect(f.lineRangeMapping.modified)) : void 0, g); + this._cancellationTokenSource.token.isCancellationRequested || e.original.isDisposed() || e.modified.isDisposed() || (u = $me(u, e.original, e.modified), u = (e.original, e.modified, void 0) ?? u, u = (e.original, e.modified, void 0) ?? u, li((m) => { + l(u, m), this._lastDiff = u; + const b = dH.fromDiffResult(u); + this._diff.set(b, m), this._isDiffUpToDate.set(!0, m); + const g = this.movedTextToCompare.get(); + this.movedTextToCompare.set(g ? this._lastDiff.moves.find((Z) => Z.lineRangeMapping.modified.intersect(g.lineRangeMapping.modified)) : void 0, m); })); })); } ensureModifiedLineIsVisible(e, t, i) { - var o, r; + var o, l; if (((o = this.diff.get()) == null ? void 0 : o.mappings.length) === 0) return; - const n = ((r = this._unchangedRegions.get()) == null ? void 0 : r.regions) || []; - for (const l of n) - if (l.getHiddenModifiedRange(void 0).contains(e)) { - l.showModifiedLine(e, t, i); + const n = ((l = this._unchangedRegions.get()) == null ? void 0 : l.regions) || []; + for (const r of n) + if (r.getHiddenModifiedRange(void 0).contains(e)) { + r.showModifiedLine(e, t, i); return; } } ensureOriginalLineIsVisible(e, t, i) { - var o, r; + var o, l; if (((o = this.diff.get()) == null ? void 0 : o.mappings.length) === 0) return; - const n = ((r = this._unchangedRegions.get()) == null ? void 0 : r.regions) || []; - for (const l of n) - if (l.getHiddenOriginalRange(void 0).contains(e)) { - l.showOriginalLine(e, t, i); + const n = ((l = this._unchangedRegions.get()) == null ? void 0 : l.regions) || []; + for (const r of n) + if (r.getHiddenOriginalRange(void 0).contains(e)) { + r.showOriginalLine(e, t, i); return; } } async waitForDiff() { - await _K(this.isDiffUpToDate, (e) => e); + await dO(this.isDiffUpToDate, (e) => e); } serializeState() { const e = this._unchangedRegions.get(); @@ -51650,82 +51650,82 @@ let hT = class extends R { } restoreSerializedState(e) { var n; - const t = (n = e.collapsedRegions) == null ? void 0 : n.map((o) => We.deserialize(o.range)), i = this._unchangedRegions.get(); - !i || !t || oi((o) => { - for (const r of i.regions) - for (const l of t) - if (r.modifiedUnchangedRange.intersect(l)) { - r.setHiddenModifiedRange(l, o); + const t = (n = e.collapsedRegions) == null ? void 0 : n.map((o) => Ne.deserialize(o.range)), i = this._unchangedRegions.get(); + !i || !t || li((o) => { + for (const l of i.regions) + for (const r of t) + if (l.modifiedUnchangedRange.intersect(r)) { + l.setHiddenModifiedRange(r, o); break; } }); } }; -hT = oge([ - rge(2, WC) -], hT); -function lge(s, e, t) { +TT = jme([ + qme(2, AG) +], TT); +function $me(s, e, t) { return { - changes: s.changes.map((i) => new zo(i.original, i.modified, i.innerChanges ? i.innerChanges.map((n) => age(n, e, t)) : void 0)), + changes: s.changes.map((i) => new Ko(i.original, i.modified, i.innerChanges ? i.innerChanges.map((n) => ebe(n, e, t)) : void 0)), moves: s.moves, identical: s.identical, quitEarly: s.quitEarly }; } -function age(s, e, t) { +function ebe(s, e, t) { let i = s.originalRange, n = s.modifiedRange; - return i.startColumn === 1 && n.startColumn === 1 && (i.endColumn !== 1 || n.endColumn !== 1) && i.endColumn === e.getLineMaxColumn(i.endLineNumber) && n.endColumn === t.getLineMaxColumn(n.endLineNumber) && i.endLineNumber < e.getLineCount() && n.endLineNumber < t.getLineCount() && (i = i.setEndPosition(i.endLineNumber + 1, 1), n = n.setEndPosition(n.endLineNumber + 1, 1)), new Wo(i, n); + return i.startColumn === 1 && n.startColumn === 1 && (i.endColumn !== 1 || n.endColumn !== 1) && i.endColumn === e.getLineMaxColumn(i.endLineNumber) && n.endColumn === t.getLineMaxColumn(n.endLineNumber) && i.endLineNumber < e.getLineCount() && n.endLineNumber < t.getLineCount() && (i = i.setEndPosition(i.endLineNumber + 1, 1), n = n.setEndPosition(n.endLineNumber + 1, 1)), new To(i, n); } -class EX { +class dH { static fromDiffResult(e) { - return new EX(e.changes.map((t) => new c4(t)), e.moves || [], e.identical, e.quitEarly); + return new dH(e.changes.map((t) => new UO(t)), e.moves || [], e.identical, e.quitEarly); } constructor(e, t, i, n) { this.mappings = e, this.movedTexts = t, this.identical = i, this.quitEarly = n; } } -class c4 { +class UO { constructor(e) { this.lineRangeMapping = e; } } -class Jd { +class ja { static fromDiffs(e, t, i, n, o) { - const r = zo.inverse(e, t, i), l = []; - for (const a of r) { - let c = a.original.startLineNumber, d = a.modified.startLineNumber, h = a.original.length; - const u = c === 1 && d === 1, g = c + h === t + 1 && d + h === i + 1; - (u || g) && h >= o + n ? (u && !g && (h -= o), g && !u && (c += o, d += o, h -= o), l.push(new Jd(c, d, h, 0, 0))) : h >= o * 2 + n && (c += o, d += o, h -= o * 2, l.push(new Jd(c, d, h, 0, 0))); + const l = Ko.inverse(e, t, i), r = []; + for (const c of l) { + let d = c.original.startLineNumber, a = c.modified.startLineNumber, h = c.original.length; + const u = d === 1 && a === 1, m = d + h === t + 1 && a + h === i + 1; + (u || m) && h >= o + n ? (u && !m && (h -= o), m && !u && (d += o, a += o, h -= o), r.push(new ja(d, a, h, 0, 0))) : h >= o * 2 + n && (d += o, a += o, h -= o * 2, r.push(new ja(d, a, h, 0, 0))); } - return l; + return r; } get originalUnchangedRange() { - return We.ofLength(this.originalLineNumber, this.lineCount); + return Ne.ofLength(this.originalLineNumber, this.lineCount); } get modifiedUnchangedRange() { - return We.ofLength(this.modifiedLineNumber, this.lineCount); + return Ne.ofLength(this.modifiedLineNumber, this.lineCount); } constructor(e, t, i, n, o) { - this.originalLineNumber = e, this.modifiedLineNumber = t, this.lineCount = i, this._visibleLineCountTop = Oe(this, 0), this.visibleLineCountTop = this._visibleLineCountTop, this._visibleLineCountBottom = Oe(this, 0), this.visibleLineCountBottom = this._visibleLineCountBottom, this._shouldHideControls = ye(this, (a) => ( + this.originalLineNumber = e, this.modifiedLineNumber = t, this.lineCount = i, this._visibleLineCountTop = Ue(this, 0), this.visibleLineCountTop = this._visibleLineCountTop, this._visibleLineCountBottom = Ue(this, 0), this.visibleLineCountBottom = this._visibleLineCountBottom, this._shouldHideControls = fe(this, (c) => ( /** @description isVisible */ - this.visibleLineCountTop.read(a) + this.visibleLineCountBottom.read(a) === this.lineCount && !this.isDragged.read(a) - )), this.isDragged = Oe(this, void 0); - const r = Math.max(Math.min(n, this.lineCount), 0), l = Math.max(Math.min(o, this.lineCount - n), 0); - lF(n === r), lF(o === l), this._visibleLineCountTop.set(r, void 0), this._visibleLineCountBottom.set(l, void 0); + this.visibleLineCountTop.read(c) + this.visibleLineCountBottom.read(c) === this.lineCount && !this.isDragged.read(c) + )), this.isDragged = Ue(this, void 0); + const l = Math.max(Math.min(n, this.lineCount), 0), r = Math.max(Math.min(o, this.lineCount - n), 0); + TD(n === l), TD(o === r), this._visibleLineCountTop.set(l, void 0), this._visibleLineCountBottom.set(r, void 0); } setVisibleRanges(e, t) { - const i = [], n = new ar(e.map((a) => a.modified)).subtractFrom(this.modifiedUnchangedRange); - let o = this.originalLineNumber, r = this.modifiedLineNumber; - const l = this.modifiedLineNumber + this.lineCount; + const i = [], n = new al(e.map((c) => c.modified)).subtractFrom(this.modifiedUnchangedRange); + let o = this.originalLineNumber, l = this.modifiedLineNumber; + const r = this.modifiedLineNumber + this.lineCount; if (n.ranges.length === 0) this.showAll(t), i.push(this); else { - let a = 0; - for (const c of n.ranges) { - const d = a === n.ranges.length - 1; - a++; - const h = (d ? l : c.endLineNumberExclusive) - r, u = new Jd(o, r, h, 0, 0); - u.setHiddenModifiedRange(c, t), i.push(u), o = u.originalUnchangedRange.endLineNumberExclusive, r = u.modifiedUnchangedRange.endLineNumberExclusive; + let c = 0; + for (const d of n.ranges) { + const a = c === n.ranges.length - 1; + c++; + const h = (a ? r : d.endLineNumberExclusive) - l, u = new ja(o, l, h, 0, 0); + u.setHiddenModifiedRange(d, t), i.push(u), o = u.originalUnchangedRange.endLineNumberExclusive, l = u.modifiedUnchangedRange.endLineNumberExclusive; } } return i; @@ -51734,10 +51734,10 @@ class Jd { return this._shouldHideControls.read(e); } getHiddenOriginalRange(e) { - return We.ofLength(this.originalLineNumber + this._visibleLineCountTop.read(e), this.lineCount - this._visibleLineCountTop.read(e) - this._visibleLineCountBottom.read(e)); + return Ne.ofLength(this.originalLineNumber + this._visibleLineCountTop.read(e), this.lineCount - this._visibleLineCountTop.read(e) - this._visibleLineCountBottom.read(e)); } getHiddenModifiedRange(e) { - return We.ofLength(this.modifiedLineNumber + this._visibleLineCountTop.read(e), this.lineCount - this._visibleLineCountTop.read(e) - this._visibleLineCountBottom.read(e)); + return Ne.ofLength(this.modifiedLineNumber + this._visibleLineCountTop.read(e), this.lineCount - this._visibleLineCountTop.read(e) - this._visibleLineCountBottom.read(e)); } setHiddenModifiedRange(e, t) { const i = e.startLineNumber - this.modifiedLineNumber, n = this.modifiedLineNumber + this.lineCount - e.endLineNumberExclusive; @@ -51775,104 +51775,104 @@ class Jd { e = Math.max(Math.min(e, this.lineCount), 0), t = Math.max(Math.min(t, this.lineCount - e), 0), this._visibleLineCountTop.set(e, i), this._visibleLineCountBottom.set(t, i); } } -class cge extends R { +class tbe extends J { get visibility() { return this._visibility; } set visibility(e) { this._visibility !== e && (this._visibility = e, this._diffActions.style.visibility = e ? "visible" : "hidden"); } - constructor(e, t, i, n, o, r, l, a, c) { - super(), this._getViewZoneId = e, this._marginDomNode = t, this._modifiedEditor = i, this._diff = n, this._editor = o, this._viewLineCounts = r, this._originalTextModel = l, this._contextMenuService = a, this._clipboardService = c, this._visibility = !1, this._marginDomNode.style.zIndex = "10", this._diffActions = document.createElement("div"), this._diffActions.className = Ze.asClassName(te.lightBulb) + " lightbulb-glyph", this._diffActions.style.position = "absolute"; - const d = this._modifiedEditor.getOption( + constructor(e, t, i, n, o, l, r, c, d) { + super(), this._getViewZoneId = e, this._marginDomNode = t, this._modifiedEditor = i, this._diff = n, this._editor = o, this._viewLineCounts = l, this._originalTextModel = r, this._contextMenuService = c, this._clipboardService = d, this._visibility = !1, this._marginDomNode.style.zIndex = "10", this._diffActions = document.createElement("div"), this._diffActions.className = Se.asClassName(te.lightBulb) + " lightbulb-glyph", this._diffActions.style.position = "absolute"; + const a = this._modifiedEditor.getOption( 67 /* EditorOption.lineHeight */ ); - this._diffActions.style.right = "0px", this._diffActions.style.visibility = "hidden", this._diffActions.style.height = `${d}px`, this._diffActions.style.lineHeight = `${d}px`, this._marginDomNode.appendChild(this._diffActions); + this._diffActions.style.right = "0px", this._diffActions.style.visibility = "hidden", this._diffActions.style.height = `${a}px`, this._diffActions.style.lineHeight = `${a}px`, this._marginDomNode.appendChild(this._diffActions); let h = 0; const u = i.getOption( 128 /* EditorOption.useShadowDOM */ - ) && !Wa, g = (m, f) => { + ) && !Yc, m = (b, g) => { this._contextMenuService.showContextMenu({ domForShadowRoot: u ? i.getDomNode() ?? void 0 : void 0, - getAnchor: () => ({ x: m, y: f }), + getAnchor: () => ({ x: b, y: g }), getActions: () => { - const b = [], y = n.modified.isEmpty; - return b.push(new lo("diff.clipboard.copyDeletedContent", y ? n.original.length > 1 ? p("diff.clipboard.copyDeletedLinesContent.label", "Copy deleted lines") : p("diff.clipboard.copyDeletedLinesContent.single.label", "Copy deleted line") : n.original.length > 1 ? p("diff.clipboard.copyChangedLinesContent.label", "Copy changed lines") : p("diff.clipboard.copyChangedLinesContent.single.label", "Copy changed line"), void 0, !0, async () => { - const C = this._originalTextModel.getValueInRange(n.original.toExclusiveRange()); - await this._clipboardService.writeText(C); - })), n.original.length > 1 && b.push(new lo("diff.clipboard.copyDeletedLineContent", y ? p("diff.clipboard.copyDeletedLineContent.label", "Copy deleted line ({0})", n.original.startLineNumber + h) : p("diff.clipboard.copyChangedLineContent.label", "Copy changed line ({0})", n.original.startLineNumber + h), void 0, !0, async () => { - let C = this._originalTextModel.getLineContent(n.original.startLineNumber + h); - C === "" && (C = this._originalTextModel.getEndOfLineSequence() === 0 ? ` + const Z = [], f = n.modified.isEmpty; + return Z.push(new ao("diff.clipboard.copyDeletedContent", f ? n.original.length > 1 ? p("diff.clipboard.copyDeletedLinesContent.label", "Copy deleted lines") : p("diff.clipboard.copyDeletedLinesContent.single.label", "Copy deleted line") : n.original.length > 1 ? p("diff.clipboard.copyChangedLinesContent.label", "Copy changed lines") : p("diff.clipboard.copyChangedLinesContent.single.label", "Copy changed line"), void 0, !0, async () => { + const W = this._originalTextModel.getValueInRange(n.original.toExclusiveRange()); + await this._clipboardService.writeText(W); + })), n.original.length > 1 && Z.push(new ao("diff.clipboard.copyDeletedLineContent", f ? p("diff.clipboard.copyDeletedLineContent.label", "Copy deleted line ({0})", n.original.startLineNumber + h) : p("diff.clipboard.copyChangedLineContent.label", "Copy changed line ({0})", n.original.startLineNumber + h), void 0, !0, async () => { + let W = this._originalTextModel.getLineContent(n.original.startLineNumber + h); + W === "" && (W = this._originalTextModel.getEndOfLineSequence() === 0 ? ` ` : `\r -`), await this._clipboardService.writeText(C); +`), await this._clipboardService.writeText(W); })), i.getOption( 92 /* EditorOption.readOnly */ - ) || b.push(new lo("diff.inline.revertChange", p("diff.inline.revertChange.label", "Revert this change"), void 0, !0, async () => { + ) || Z.push(new ao("diff.inline.revertChange", p("diff.inline.revertChange.label", "Revert this change"), void 0, !0, async () => { this._editor.revert(this._diff); - })), b; + })), Z; }, autoSelectFirstItem: !0 }); }; - this._register(ai(this._diffActions, "mousedown", (m) => { - if (!m.leftButton) + this._register(di(this._diffActions, "mousedown", (b) => { + if (!b.leftButton) return; - const { top: f, height: b } = yi(this._diffActions), y = Math.floor(d / 3); - m.preventDefault(), g(m.posx, f + b + y); - })), this._register(i.onMouseMove((m) => { - (m.target.type === 8 || m.target.type === 5) && m.target.detail.viewZoneId === this._getViewZoneId() ? (h = this._updateLightBulbPosition(this._marginDomNode, m.event.browserEvent.y, d), this.visibility = !0) : this.visibility = !1; - })), this._register(i.onMouseDown((m) => { - m.event.leftButton && (m.target.type === 8 || m.target.type === 5) && m.target.detail.viewZoneId === this._getViewZoneId() && (m.event.preventDefault(), h = this._updateLightBulbPosition(this._marginDomNode, m.event.browserEvent.y, d), g(m.event.posx, m.event.posy + d)); + const { top: g, height: Z } = yi(this._diffActions), f = Math.floor(a / 3); + b.preventDefault(), m(b.posx, g + Z + f); + })), this._register(i.onMouseMove((b) => { + (b.target.type === 8 || b.target.type === 5) && b.target.detail.viewZoneId === this._getViewZoneId() ? (h = this._updateLightBulbPosition(this._marginDomNode, b.event.browserEvent.y, a), this.visibility = !0) : this.visibility = !1; + })), this._register(i.onMouseDown((b) => { + b.event.leftButton && (b.target.type === 8 || b.target.type === 5) && b.target.detail.viewZoneId === this._getViewZoneId() && (b.event.preventDefault(), h = this._updateLightBulbPosition(this._marginDomNode, b.event.browserEvent.y, a), m(b.event.posx, b.event.posy + a)); })); } _updateLightBulbPosition(e, t, i) { - const { top: n } = yi(e), o = t - n, r = Math.floor(o / i), l = r * i; - if (this._diffActions.style.top = `${l}px`, this._viewLineCounts) { - let a = 0; - for (let c = 0; c < this._viewLineCounts.length; c++) - if (a += this._viewLineCounts[c], r < a) - return c; + const { top: n } = yi(e), o = t - n, l = Math.floor(o / i), r = l * i; + if (this._diffActions.style.top = `${r}px`, this._viewLineCounts) { + let c = 0; + for (let d = 0; d < this._viewLineCounts.length; d++) + if (c += this._viewLineCounts[d], l < c) + return d; } - return r; + return l; } } -const _z = nd("diffEditorWidget", { createHTML: (s) => s }); -function dge(s, e, t, i) { - mn(i, e.fontInfo); - const n = t.length > 0, o = new e0(1e4); - let r = 0, l = 0; - const a = []; +const qz = ra("diffEditorWidget", { createHTML: (s) => s }); +function ibe(s, e, t, i) { + pn(i, e.fontInfo); + const n = t.length > 0, o = new l0(1e4); + let l = 0, r = 0; + const c = []; for (let u = 0; u < s.lineTokens.length; u++) { - const g = u + 1, m = s.lineTokens[u], f = s.lineBreakData[u], b = ds.filter(t, g, 1, Number.MAX_SAFE_INTEGER); - if (f) { - let y = 0; - for (const w of f.breakOffsets) { - const C = m.sliceAndInflate(y, w, 0); - r = Math.max(r, Iz(l, C, ds.extractWrapped(b, y, w), n, s.mightContainNonBasicASCII, s.mightContainRTL, e, o)), l++, y = w; + const m = u + 1, b = s.lineTokens[u], g = s.lineBreakData[u], Z = us.filter(t, m, 1, Number.MAX_SAFE_INTEGER); + if (g) { + let f = 0; + for (const y of g.breakOffsets) { + const W = b.sliceAndInflate(f, y, 0); + l = Math.max(l, $z(r, W, us.extractWrapped(Z, f, y), n, s.mightContainNonBasicASCII, s.mightContainRTL, e, o)), r++, f = y; } - a.push(f.breakOffsets.length); + c.push(g.breakOffsets.length); } else - a.push(1), r = Math.max(r, Iz(l, m, b, n, s.mightContainNonBasicASCII, s.mightContainRTL, e, o)), l++; + c.push(1), l = Math.max(l, $z(r, b, Z, n, s.mightContainNonBasicASCII, s.mightContainRTL, e, o)), r++; } - r += e.scrollBeyondLastColumn; - const c = o.build(), d = _z ? _z.createHTML(c) : c; - i.innerHTML = d; - const h = r * e.typicalHalfwidthCharacterWidth; + l += e.scrollBeyondLastColumn; + const d = o.build(), a = qz ? qz.createHTML(d) : d; + i.innerHTML = a; + const h = l * e.typicalHalfwidthCharacterWidth; return { - heightInLines: l, + heightInLines: r, minWidthInPx: h, - viewLineCounts: a + viewLineCounts: c }; } -class hge { +class nbe { constructor(e, t, i, n) { this.lineTokens = e, this.lineBreakData = t, this.mightContainNonBasicASCII = i, this.mightContainRTL = n; } } -class XX { +class aH { static fromEditor(e) { var o; const t = e.getOptions(), i = t.get( @@ -51882,7 +51882,7 @@ class XX { 146 /* EditorOption.layoutInfo */ ); - return new XX(((o = e.getModel()) == null ? void 0 : o.getOptions().tabSize) || 0, i, t.get( + return new aH(((o = e.getModel()) == null ? void 0 : o.getOptions().tabSize) || 0, i, t.get( 33 /* EditorOption.disableMonospaceOptimizations */ ), i.typicalHalfwidthCharacterWidth, t.get( @@ -51905,476 +51905,476 @@ class XX { /* EditorOption.fontLigatures */ )); } - constructor(e, t, i, n, o, r, l, a, c, d, h) { - this.tabSize = e, this.fontInfo = t, this.disableMonospaceOptimizations = i, this.typicalHalfwidthCharacterWidth = n, this.scrollBeyondLastColumn = o, this.lineHeight = r, this.lineDecorationsWidth = l, this.stopRenderingLineAfter = a, this.renderWhitespace = c, this.renderControlCharacters = d, this.fontLigatures = h; + constructor(e, t, i, n, o, l, r, c, d, a, h) { + this.tabSize = e, this.fontInfo = t, this.disableMonospaceOptimizations = i, this.typicalHalfwidthCharacterWidth = n, this.scrollBeyondLastColumn = o, this.lineHeight = l, this.lineDecorationsWidth = r, this.stopRenderingLineAfter = c, this.renderWhitespace = d, this.renderControlCharacters = a, this.fontLigatures = h; } } -function Iz(s, e, t, i, n, o, r, l) { - l.appendString('
    '); - const a = e.getLineContent(), c = Oo.isBasicASCII(a, n), d = Oo.containsRTL(a, c, o), h = wC(new Jh( - r.fontInfo.isMonospace && !r.disableMonospaceOptimizations, - r.fontInfo.canUseHalfwidthRightwardsArrow, - a, - !1, +function $z(s, e, t, i, n, o, l, r) { + r.appendString('
    '); + const c = e.getLineContent(), d = Bo.isBasicASCII(c, n), a = Bo.containsRTL(c, d, o), h = TG(new jh( + l.fontInfo.isMonospace && !l.disableMonospaceOptimizations, + l.fontInfo.canUseHalfwidthRightwardsArrow, c, + !1, d, + a, 0, e, t, - r.tabSize, + l.tabSize, 0, - r.fontInfo.spaceWidth, - r.fontInfo.middotWidth, - r.fontInfo.wsmiddotWidth, - r.stopRenderingLineAfter, - r.renderWhitespace, - r.renderControlCharacters, - r.fontLigatures !== Dh.OFF, + l.fontInfo.spaceWidth, + l.fontInfo.middotWidth, + l.fontInfo.wsmiddotWidth, + l.stopRenderingLineAfter, + l.renderWhitespace, + l.renderControlCharacters, + l.fontLigatures !== Jh.OFF, null // Send no selections, original line cannot be selected - ), l); - return l.appendString("
    "), h.characterMapping.getHorizontalOffset(h.characterMapping.length); + ), r); + return r.appendString("
    "), h.characterMapping.getHorizontalOffset(h.characterMapping.length); } -const od = $e("clipboardService"), rd = $e("contextViewService"), Co = $e("contextMenuService"); -var uge = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +const da = $e("clipboardService"), aa = $e("contextViewService"), Xo = $e("contextMenuService"); +var sbe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Nz = function(s, e) { +}, eA = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let uT = class extends R { - constructor(e, t, i, n, o, r, l, a, c, d) { - super(), this._targetWindow = e, this._editors = t, this._diffModel = i, this._options = n, this._diffEditorWidget = o, this._canIgnoreViewZoneUpdateEvent = r, this._origViewZonesToIgnore = l, this._modViewZonesToIgnore = a, this._clipboardService = c, this._contextMenuService = d, this._originalTopPadding = Oe(this, 0), this._originalScrollOffset = Oe(this, 0), this._originalScrollOffsetAnimated = az(this._targetWindow, this._originalScrollOffset, this._store), this._modifiedTopPadding = Oe(this, 0), this._modifiedScrollOffset = Oe(this, 0), this._modifiedScrollOffsetAnimated = az(this._targetWindow, this._modifiedScrollOffset, this._store); - const h = Oe("invalidateAlignmentsState", 0), u = this._register(new Zt(() => { +let MT = class extends J { + constructor(e, t, i, n, o, l, r, c, d, a) { + super(), this._targetWindow = e, this._editors = t, this._diffModel = i, this._options = n, this._diffEditorWidget = o, this._canIgnoreViewZoneUpdateEvent = l, this._origViewZonesToIgnore = r, this._modViewZonesToIgnore = c, this._clipboardService = d, this._contextMenuService = a, this._originalTopPadding = Ue(this, 0), this._originalScrollOffset = Ue(this, 0), this._originalScrollOffsetAnimated = Mz(this._targetWindow, this._originalScrollOffset, this._store), this._modifiedTopPadding = Ue(this, 0), this._modifiedScrollOffset = Ue(this, 0), this._modifiedScrollOffsetAnimated = Mz(this._targetWindow, this._modifiedScrollOffset, this._store); + const h = Ue("invalidateAlignmentsState", 0), u = this._register(new St(() => { h.set(h.get() + 1, void 0); }, 0)); - this._register(this._editors.original.onDidChangeViewZones((C) => { + this._register(this._editors.original.onDidChangeViewZones((W) => { this._canIgnoreViewZoneUpdateEvent() || u.schedule(); - })), this._register(this._editors.modified.onDidChangeViewZones((C) => { + })), this._register(this._editors.modified.onDidChangeViewZones((W) => { this._canIgnoreViewZoneUpdateEvent() || u.schedule(); - })), this._register(this._editors.original.onDidChangeConfiguration((C) => { - (C.hasChanged( + })), this._register(this._editors.original.onDidChangeConfiguration((W) => { + (W.hasChanged( 147 /* EditorOption.wrappingInfo */ - ) || C.hasChanged( + ) || W.hasChanged( 67 /* EditorOption.lineHeight */ )) && u.schedule(); - })), this._register(this._editors.modified.onDidChangeConfiguration((C) => { - (C.hasChanged( + })), this._register(this._editors.modified.onDidChangeConfiguration((W) => { + (W.hasChanged( 147 /* EditorOption.wrappingInfo */ - ) || C.hasChanged( + ) || W.hasChanged( 67 /* EditorOption.lineHeight */ )) && u.schedule(); })); - const g = this._diffModel.map((C) => C ? St( + const m = this._diffModel.map((W) => W ? Gt( this, - C.model.original.onDidChangeTokens, - () => C.model.original.tokenization.backgroundTokenizationState === 2 + W.model.original.onDidChangeTokens, + () => W.model.original.tokenization.backgroundTokenizationState === 2 /* BackgroundTokenizationState.Completed */ - ) : void 0).map((C, S) => C == null ? void 0 : C.read(S)), m = ye((C) => { - const S = this._diffModel.read(C), L = S == null ? void 0 : S.diff.read(C); - if (!S || !L) + ) : void 0).map((W, G) => W == null ? void 0 : W.read(G)), b = fe((W) => { + const G = this._diffModel.read(W), X = G == null ? void 0 : G.diff.read(W); + if (!G || !X) return null; - h.read(C); - const Z = this._options.renderSideBySide.read(C); - return Wz(this._editors.original, this._editors.modified, L.mappings, this._origViewZonesToIgnore, this._modViewZonesToIgnore, Z); - }), f = ye((C) => { - var x; - const S = (x = this._diffModel.read(C)) == null ? void 0 : x.movedTextToCompare.read(C); - if (!S) + h.read(W); + const S = this._options.renderSideBySide.read(W); + return tA(this._editors.original, this._editors.modified, X.mappings, this._origViewZonesToIgnore, this._modViewZonesToIgnore, S); + }), g = fe((W) => { + var L; + const G = (L = this._diffModel.read(W)) == null ? void 0 : L.movedTextToCompare.read(W); + if (!G) return null; - h.read(C); - const L = S.changes.map((Z) => new c4(Z)); - return Wz(this._editors.original, this._editors.modified, L, this._origViewZonesToIgnore, this._modViewZonesToIgnore, !0); - }); - function b() { - const C = document.createElement("div"); - return C.className = "diagonal-fill", C; - } - const y = this._register(new U()); - this.viewZones = Uh(this, (C, S) => { - var me, Ve, ke, ci; - y.clear(); - const L = m.read(C) || [], x = [], Z = [], _ = this._modifiedTopPadding.read(C); - _ > 0 && Z.push({ + h.read(W); + const X = G.changes.map((S) => new UO(S)); + return tA(this._editors.original, this._editors.modified, X, this._origViewZonesToIgnore, this._modViewZonesToIgnore, !0); + }); + function Z() { + const W = document.createElement("div"); + return W.className = "diagonal-fill", W; + } + const f = this._register(new _()); + this.viewZones = qh(this, (W, G) => { + var be, Ye, ke, ai; + f.clear(); + const X = b.read(W) || [], L = [], S = [], x = this._modifiedTopPadding.read(W); + x > 0 && S.push({ afterLineNumber: 0, domNode: document.createElement("div"), - heightInPx: _, + heightInPx: x, showInHiddenAreas: !0, suppressMouseDown: !0 }); - const v = this._originalTopPadding.read(C); - v > 0 && x.push({ + const w = this._originalTopPadding.read(W); + w > 0 && L.push({ afterLineNumber: 0, domNode: document.createElement("div"), - heightInPx: v, + heightInPx: w, showInHiddenAreas: !0, suppressMouseDown: !0 }); - const P = this._options.renderSideBySide.read(C), E = P || (me = this._editors.modified._getViewModel()) == null ? void 0 : me.createLineBreaksComputer(); - if (E) { - const Ee = this._editors.original.getModel(); - for (const _t of L) - if (_t.diff) - for (let wt = _t.originalRange.startLineNumber; wt < _t.originalRange.endLineNumberExclusive; wt++) { - if (wt > Ee.getLineCount()) - return { orig: x, mod: Z }; - E == null || E.addRequest(Ee.getLineContent(wt), null, null); + const A = this._options.renderSideBySide.read(W), H = A || (be = this._editors.modified._getViewModel()) == null ? void 0 : be.createLineBreaksComputer(); + if (H) { + const He = this._editors.original.getModel(); + for (const xt of X) + if (xt.diff) + for (let yt = xt.originalRange.startLineNumber; yt < xt.originalRange.endLineNumberExclusive; yt++) { + if (yt > He.getLineCount()) + return { orig: L, mod: S }; + H == null || H.addRequest(He.getLineContent(yt), null, null); } } - const Y = (E == null ? void 0 : E.finalize()) ?? []; - let B = 0; - const X = this._editors.modified.getOption( + const F = (H == null ? void 0 : H.finalize()) ?? []; + let K = 0; + const E = this._editors.modified.getOption( 67 /* EditorOption.lineHeight */ - ), j = (Ve = this._diffModel.read(C)) == null ? void 0 : Ve.movedTextToCompare.read(C), le = ((ke = this._editors.original.getModel()) == null ? void 0 : ke.mightContainNonBasicASCII()) ?? !1, ue = ((ci = this._editors.original.getModel()) == null ? void 0 : ci.mightContainRTL()) ?? !1, be = XX.fromEditor(this._editors.modified); - for (const Ee of L) - if (Ee.diff && !P && (!this._options.useTrueInlineDiffRendering.read(C) || !FX(Ee.diff))) { - if (!Ee.originalRange.isEmpty) { - g.read(C); - const wt = document.createElement("div"); - wt.classList.add("view-lines", "line-delete", "monaco-mouse-cursor-text"); - const _i = this._editors.original.getModel(); - if (Ee.originalRange.endLineNumberExclusive - 1 > _i.getLineCount()) - return { orig: x, mod: Z }; - const ts = new hge(Ee.originalRange.mapToLineArray((Fi) => _i.tokenization.getLineTokens(Fi)), Ee.originalRange.mapToLineArray((Fi) => Y[B++]), le, ue), Zs = []; - for (const Fi of Ee.diff.innerChanges || []) - Zs.push(new Dy( - Fi.originalRange.delta(-(Ee.diff.original.startLineNumber - 1)), - Lb.className, + ), j = (Ye = this._diffModel.read(W)) == null ? void 0 : Ye.movedTextToCompare.read(W), re = ((ke = this._editors.original.getModel()) == null ? void 0 : ke.mightContainNonBasicASCII()) ?? !1, ue = ((ai = this._editors.original.getModel()) == null ? void 0 : ai.mightContainRTL()) ?? !1, Ze = aH.fromEditor(this._editors.modified); + for (const He of X) + if (He.diff && !A && (!this._options.useTrueInlineDiffRendering.read(W) || !hH(He.diff))) { + if (!He.originalRange.isEmpty) { + m.read(W); + const yt = document.createElement("div"); + yt.classList.add("view-lines", "line-delete", "monaco-mouse-cursor-text"); + const Ci = this._editors.original.getModel(); + if (He.originalRange.endLineNumberExclusive - 1 > Ci.getLineCount()) + return { orig: L, mod: S }; + const ns = new nbe(He.originalRange.mapToLineArray((Fi) => Ci.tokenization.getLineTokens(Fi)), He.originalRange.mapToLineArray((Fi) => F[K++]), re, ue), Cs = []; + for (const Fi of He.diff.innerChanges || []) + Cs.push(new Kf( + Fi.originalRange.delta(-(He.diff.original.startLineNumber - 1)), + CZ.className, 0 /* InlineDecorationType.Regular */ )); - const xr = dge(ts, be, Zs, wt), So = document.createElement("div"); - if (So.className = "inline-deleted-margin-view-zone", mn(So, be.fontInfo), this._options.renderIndicators.read(C)) - for (let Fi = 0; Fi < xr.heightInLines; Fi++) { - const Mr = document.createElement("div"); - Mr.className = `delete-sign ${Ze.asClassName(n4)}`, Mr.setAttribute("style", `position:absolute;top:${Fi * X}px;width:${be.lineDecorationsWidth}px;height:${X}px;right:0;`), So.appendChild(Mr); + const xl = ibe(ns, Ze, Cs, yt), Vo = document.createElement("div"); + if (Vo.className = "inline-deleted-margin-view-zone", pn(Vo, Ze.fontInfo), this._options.renderIndicators.read(W)) + for (let Fi = 0; Fi < xl.heightInLines; Fi++) { + const Cl = document.createElement("div"); + Cl.className = `delete-sign ${Se.asClassName(EO)}`, Cl.setAttribute("style", `position:absolute;top:${Fi * E}px;width:${Ze.lineDecorationsWidth}px;height:${E}px;right:0;`), Vo.appendChild(Cl); } - let su; - y.add(new cge(() => Ed(su), So, this._editors.modified, Ee.diff, this._diffEditorWidget, xr.viewLineCounts, this._editors.original.getModel(), this._contextMenuService, this._clipboardService)); - for (let Fi = 0; Fi < xr.viewLineCounts.length; Fi++) { - const Mr = xr.viewLineCounts[Fi]; - Mr > 1 && x.push({ - afterLineNumber: Ee.originalRange.startLineNumber + Fi, - domNode: b(), - heightInPx: (Mr - 1) * X, + let cu; + f.add(new tbe(() => za(cu), Vo, this._editors.modified, He.diff, this._diffEditorWidget, xl.viewLineCounts, this._editors.original.getModel(), this._contextMenuService, this._clipboardService)); + for (let Fi = 0; Fi < xl.viewLineCounts.length; Fi++) { + const Cl = xl.viewLineCounts[Fi]; + Cl > 1 && L.push({ + afterLineNumber: He.originalRange.startLineNumber + Fi, + domNode: Z(), + heightInPx: (Cl - 1) * E, showInHiddenAreas: !0, suppressMouseDown: !0 }); } - Z.push({ - afterLineNumber: Ee.modifiedRange.startLineNumber - 1, - domNode: wt, - heightInPx: xr.heightInLines * X, - minWidthInPx: xr.minWidthInPx, - marginDomNode: So, + S.push({ + afterLineNumber: He.modifiedRange.startLineNumber - 1, + domNode: yt, + heightInPx: xl.heightInLines * E, + minWidthInPx: xl.minWidthInPx, + marginDomNode: Vo, setZoneId(Fi) { - su = Fi; + cu = Fi; }, showInHiddenAreas: !0, suppressMouseDown: !0 }); } - const _t = document.createElement("div"); - _t.className = "gutter-delete", x.push({ - afterLineNumber: Ee.originalRange.endLineNumberExclusive - 1, - domNode: b(), - heightInPx: Ee.modifiedHeightInPx, - marginDomNode: _t, + const xt = document.createElement("div"); + xt.className = "gutter-delete", L.push({ + afterLineNumber: He.originalRange.endLineNumberExclusive - 1, + domNode: Z(), + heightInPx: He.modifiedHeightInPx, + marginDomNode: xt, showInHiddenAreas: !0, suppressMouseDown: !0 }); } else { - const _t = Ee.modifiedHeightInPx - Ee.originalHeightInPx; - if (_t > 0) { - if (j != null && j.lineRangeMapping.original.delta(-1).deltaLength(2).contains(Ee.originalRange.endLineNumberExclusive - 1)) + const xt = He.modifiedHeightInPx - He.originalHeightInPx; + if (xt > 0) { + if (j != null && j.lineRangeMapping.original.delta(-1).deltaLength(2).contains(He.originalRange.endLineNumberExclusive - 1)) continue; - x.push({ - afterLineNumber: Ee.originalRange.endLineNumberExclusive - 1, - domNode: b(), - heightInPx: _t, + L.push({ + afterLineNumber: He.originalRange.endLineNumberExclusive - 1, + domNode: Z(), + heightInPx: xt, showInHiddenAreas: !0, suppressMouseDown: !0 }); } else { - let wt = function() { - const ts = document.createElement("div"); - return ts.className = "arrow-revert-change " + Ze.asClassName(te.arrowRight), S.add(z(ts, "mousedown", (Zs) => Zs.stopPropagation())), S.add(z(ts, "click", (Zs) => { - Zs.stopPropagation(), o.revert(Ee.diff); - })), ce("div", {}, ts); + let yt = function() { + const ns = document.createElement("div"); + return ns.className = "arrow-revert-change " + Se.asClassName(te.arrowRight), G.add(z(ns, "mousedown", (Cs) => Cs.stopPropagation())), G.add(z(ns, "click", (Cs) => { + Cs.stopPropagation(), o.revert(He.diff); + })), de("div", {}, ns); }; - if (j != null && j.lineRangeMapping.modified.delta(-1).deltaLength(2).contains(Ee.modifiedRange.endLineNumberExclusive - 1)) + if (j != null && j.lineRangeMapping.modified.delta(-1).deltaLength(2).contains(He.modifiedRange.endLineNumberExclusive - 1)) continue; - let _i; - Ee.diff && Ee.diff.modified.isEmpty && this._options.shouldRenderOldRevertArrows.read(C) && (_i = wt()), Z.push({ - afterLineNumber: Ee.modifiedRange.endLineNumberExclusive - 1, - domNode: b(), - heightInPx: -_t, - marginDomNode: _i, + let Ci; + He.diff && He.diff.modified.isEmpty && this._options.shouldRenderOldRevertArrows.read(W) && (Ci = yt()), S.push({ + afterLineNumber: He.modifiedRange.endLineNumberExclusive - 1, + domNode: Z(), + heightInPx: -xt, + marginDomNode: Ci, showInHiddenAreas: !0, suppressMouseDown: !0 }); } } - for (const Ee of f.read(C) ?? []) { - if (!(j != null && j.lineRangeMapping.original.intersect(Ee.originalRange)) || !(j != null && j.lineRangeMapping.modified.intersect(Ee.modifiedRange))) + for (const He of g.read(W) ?? []) { + if (!(j != null && j.lineRangeMapping.original.intersect(He.originalRange)) || !(j != null && j.lineRangeMapping.modified.intersect(He.modifiedRange))) continue; - const _t = Ee.modifiedHeightInPx - Ee.originalHeightInPx; - _t > 0 ? x.push({ - afterLineNumber: Ee.originalRange.endLineNumberExclusive - 1, - domNode: b(), - heightInPx: _t, + const xt = He.modifiedHeightInPx - He.originalHeightInPx; + xt > 0 ? L.push({ + afterLineNumber: He.originalRange.endLineNumberExclusive - 1, + domNode: Z(), + heightInPx: xt, showInHiddenAreas: !0, suppressMouseDown: !0 - }) : Z.push({ - afterLineNumber: Ee.modifiedRange.endLineNumberExclusive - 1, - domNode: b(), - heightInPx: -_t, + }) : S.push({ + afterLineNumber: He.modifiedRange.endLineNumberExclusive - 1, + domNode: Z(), + heightInPx: -xt, showInHiddenAreas: !0, suppressMouseDown: !0 }); } - return { orig: x, mod: Z }; + return { orig: L, mod: S }; }); - let w = !1; - this._register(this._editors.original.onDidScrollChange((C) => { - C.scrollLeftChanged && !w && (w = !0, this._editors.modified.setScrollLeft(C.scrollLeft), w = !1); - })), this._register(this._editors.modified.onDidScrollChange((C) => { - C.scrollLeftChanged && !w && (w = !0, this._editors.original.setScrollLeft(C.scrollLeft), w = !1); - })), this._originalScrollTop = St(this._editors.original.onDidScrollChange, () => ( + let y = !1; + this._register(this._editors.original.onDidScrollChange((W) => { + W.scrollLeftChanged && !y && (y = !0, this._editors.modified.setScrollLeft(W.scrollLeft), y = !1); + })), this._register(this._editors.modified.onDidScrollChange((W) => { + W.scrollLeftChanged && !y && (y = !0, this._editors.original.setScrollLeft(W.scrollLeft), y = !1); + })), this._originalScrollTop = Gt(this._editors.original.onDidScrollChange, () => ( /** @description original.getScrollTop */ this._editors.original.getScrollTop() - )), this._modifiedScrollTop = St(this._editors.modified.onDidScrollChange, () => ( + )), this._modifiedScrollTop = Gt(this._editors.modified.onDidScrollChange, () => ( /** @description modified.getScrollTop */ this._editors.modified.getScrollTop() - )), this._register(Te((C) => { - const S = this._originalScrollTop.read(C) - (this._originalScrollOffsetAnimated.get() - this._modifiedScrollOffsetAnimated.read(C)) - (this._originalTopPadding.get() - this._modifiedTopPadding.read(C)); - S !== this._editors.modified.getScrollTop() && this._editors.modified.setScrollTop( - S, + )), this._register(Te((W) => { + const G = this._originalScrollTop.read(W) - (this._originalScrollOffsetAnimated.get() - this._modifiedScrollOffsetAnimated.read(W)) - (this._originalTopPadding.get() - this._modifiedTopPadding.read(W)); + G !== this._editors.modified.getScrollTop() && this._editors.modified.setScrollTop( + G, 1 /* ScrollType.Immediate */ ); - })), this._register(Te((C) => { - const S = this._modifiedScrollTop.read(C) - (this._modifiedScrollOffsetAnimated.get() - this._originalScrollOffsetAnimated.read(C)) - (this._modifiedTopPadding.get() - this._originalTopPadding.read(C)); - S !== this._editors.original.getScrollTop() && this._editors.original.setScrollTop( - S, + })), this._register(Te((W) => { + const G = this._modifiedScrollTop.read(W) - (this._modifiedScrollOffsetAnimated.get() - this._originalScrollOffsetAnimated.read(W)) - (this._modifiedTopPadding.get() - this._originalTopPadding.read(W)); + G !== this._editors.original.getScrollTop() && this._editors.original.setScrollTop( + G, 1 /* ScrollType.Immediate */ ); - })), this._register(Te((C) => { - var x; - const S = (x = this._diffModel.read(C)) == null ? void 0 : x.movedTextToCompare.read(C); - let L = 0; - if (S) { - const Z = this._editors.original.getTopForLineNumber(S.lineRangeMapping.original.startLineNumber, !0) - this._originalTopPadding.get(); - L = this._editors.modified.getTopForLineNumber(S.lineRangeMapping.modified.startLineNumber, !0) - this._modifiedTopPadding.get() - Z; + })), this._register(Te((W) => { + var L; + const G = (L = this._diffModel.read(W)) == null ? void 0 : L.movedTextToCompare.read(W); + let X = 0; + if (G) { + const S = this._editors.original.getTopForLineNumber(G.lineRangeMapping.original.startLineNumber, !0) - this._originalTopPadding.get(); + X = this._editors.modified.getTopForLineNumber(G.lineRangeMapping.modified.startLineNumber, !0) - this._modifiedTopPadding.get() - S; } - L > 0 ? (this._modifiedTopPadding.set(0, void 0), this._originalTopPadding.set(L, void 0)) : L < 0 ? (this._modifiedTopPadding.set(-L, void 0), this._originalTopPadding.set(0, void 0)) : setTimeout(() => { + X > 0 ? (this._modifiedTopPadding.set(0, void 0), this._originalTopPadding.set(X, void 0)) : X < 0 ? (this._modifiedTopPadding.set(-X, void 0), this._originalTopPadding.set(0, void 0)) : setTimeout(() => { this._modifiedTopPadding.set(0, void 0), this._originalTopPadding.set(0, void 0); - }, 400), this._editors.modified.hasTextFocus() ? this._originalScrollOffset.set(this._modifiedScrollOffset.get() - L, void 0, !0) : this._modifiedScrollOffset.set(this._originalScrollOffset.get() + L, void 0, !0); + }, 400), this._editors.modified.hasTextFocus() ? this._originalScrollOffset.set(this._modifiedScrollOffset.get() - X, void 0, !0) : this._modifiedScrollOffset.set(this._originalScrollOffset.get() + X, void 0, !0); })); } }; -uT = uge([ - Nz(8, od), - Nz(9, Co) -], uT); -function Wz(s, e, t, i, n, o) { - const r = new Hc(vz(s, i)), l = new Hc(vz(e, n)), a = s.getOption( +MT = sbe([ + eA(8, da), + eA(9, Xo) +], MT); +function tA(s, e, t, i, n, o) { + const l = new Od(iA(s, i)), r = new Od(iA(e, n)), c = s.getOption( 67 /* EditorOption.lineHeight */ - ), c = e.getOption( + ), d = e.getOption( 67 /* EditorOption.lineHeight */ - ), d = []; + ), a = []; let h = 0, u = 0; - function g(m, f) { + function m(b, g) { for (; ; ) { - let b = r.peek(), y = l.peek(); - if (b && b.lineNumber >= m && (b = void 0), y && y.lineNumber >= f && (y = void 0), !b && !y) + let Z = l.peek(), f = r.peek(); + if (Z && Z.lineNumber >= b && (Z = void 0), f && f.lineNumber >= g && (f = void 0), !Z && !f) break; - const w = b ? b.lineNumber - h : Number.MAX_VALUE, C = y ? y.lineNumber - u : Number.MAX_VALUE; - w < C ? (r.dequeue(), y = { - lineNumber: b.lineNumber - h + u, + const y = Z ? Z.lineNumber - h : Number.MAX_VALUE, W = f ? f.lineNumber - u : Number.MAX_VALUE; + y < W ? (l.dequeue(), f = { + lineNumber: Z.lineNumber - h + u, heightInPx: 0 - }) : w > C ? (l.dequeue(), b = { - lineNumber: y.lineNumber - u + h, + }) : y > W ? (r.dequeue(), Z = { + lineNumber: f.lineNumber - u + h, heightInPx: 0 - }) : (r.dequeue(), l.dequeue()), d.push({ - originalRange: We.ofLength(b.lineNumber, 1), - modifiedRange: We.ofLength(y.lineNumber, 1), - originalHeightInPx: a + b.heightInPx, - modifiedHeightInPx: c + y.heightInPx, + }) : (l.dequeue(), r.dequeue()), a.push({ + originalRange: Ne.ofLength(Z.lineNumber, 1), + modifiedRange: Ne.ofLength(f.lineNumber, 1), + originalHeightInPx: c + Z.heightInPx, + modifiedHeightInPx: d + f.heightInPx, diff: void 0 }); } } - for (const m of t) { - let C = function(S, L, x = !1) { - var E, Y; - if (S < w || L < y) + for (const b of t) { + let W = function(G, X, L = !1) { + var H, F; + if (G < y || X < f) return; - if (b) - b = !1; - else if (!x && (S === w || L === y)) + if (Z) + Z = !1; + else if (!L && (G === y || X === f)) return; - const Z = new We(w, S), _ = new We(y, L); - if (Z.isEmpty && _.isEmpty) + const S = new Ne(y, G), x = new Ne(f, X); + if (S.isEmpty && x.isEmpty) return; - const v = ((E = r.takeWhile((B) => B.lineNumber < S)) == null ? void 0 : E.reduce((B, X) => B + X.heightInPx, 0)) ?? 0, P = ((Y = l.takeWhile((B) => B.lineNumber < L)) == null ? void 0 : Y.reduce((B, X) => B + X.heightInPx, 0)) ?? 0; - d.push({ - originalRange: Z, - modifiedRange: _, - originalHeightInPx: Z.length * a + v, - modifiedHeightInPx: _.length * c + P, - diff: m.lineRangeMapping - }), w = S, y = L; + const w = ((H = l.takeWhile((K) => K.lineNumber < G)) == null ? void 0 : H.reduce((K, E) => K + E.heightInPx, 0)) ?? 0, A = ((F = r.takeWhile((K) => K.lineNumber < X)) == null ? void 0 : F.reduce((K, E) => K + E.heightInPx, 0)) ?? 0; + a.push({ + originalRange: S, + modifiedRange: x, + originalHeightInPx: S.length * c + w, + modifiedHeightInPx: x.length * d + A, + diff: b.lineRangeMapping + }), y = G, f = X; }; - const f = m.lineRangeMapping; - g(f.original.startLineNumber, f.modified.startLineNumber); - let b = !0, y = f.modified.startLineNumber, w = f.original.startLineNumber; + const g = b.lineRangeMapping; + m(g.original.startLineNumber, g.modified.startLineNumber); + let Z = !0, f = g.modified.startLineNumber, y = g.original.startLineNumber; if (o) - for (const S of f.innerChanges || []) { - S.originalRange.startColumn > 1 && S.modifiedRange.startColumn > 1 && C(S.originalRange.startLineNumber, S.modifiedRange.startLineNumber); - const L = s.getModel(), x = S.originalRange.endLineNumber <= L.getLineCount() ? L.getLineMaxColumn(S.originalRange.endLineNumber) : Number.MAX_SAFE_INTEGER; - S.originalRange.endColumn < x && C(S.originalRange.endLineNumber, S.modifiedRange.endLineNumber); + for (const G of g.innerChanges || []) { + G.originalRange.startColumn > 1 && G.modifiedRange.startColumn > 1 && W(G.originalRange.startLineNumber, G.modifiedRange.startLineNumber); + const X = s.getModel(), L = G.originalRange.endLineNumber <= X.getLineCount() ? X.getLineMaxColumn(G.originalRange.endLineNumber) : Number.MAX_SAFE_INTEGER; + G.originalRange.endColumn < L && W(G.originalRange.endLineNumber, G.modifiedRange.endLineNumber); } - C(f.original.endLineNumberExclusive, f.modified.endLineNumberExclusive, !0), h = f.original.endLineNumberExclusive, u = f.modified.endLineNumberExclusive; + W(g.original.endLineNumberExclusive, g.modified.endLineNumberExclusive, !0), h = g.original.endLineNumberExclusive, u = g.modified.endLineNumberExclusive; } - return g(Number.MAX_VALUE, Number.MAX_VALUE), d; + return m(Number.MAX_VALUE, Number.MAX_VALUE), a; } -function vz(s, e) { +function iA(s, e) { const t = [], i = [], n = s.getOption( 147 /* EditorOption.wrappingInfo */ - ).wrappingColumn !== -1, o = s._getViewModel().coordinatesConverter, r = s.getOption( + ).wrappingColumn !== -1, o = s._getViewModel().coordinatesConverter, l = s.getOption( 67 /* EditorOption.lineHeight */ ); if (n) - for (let a = 1; a <= s.getModel().getLineCount(); a++) { - const c = o.getModelLineViewLineCount(a); - c > 1 && i.push({ lineNumber: a, heightInPx: r * (c - 1) }); + for (let c = 1; c <= s.getModel().getLineCount(); c++) { + const d = o.getModelLineViewLineCount(c); + d > 1 && i.push({ lineNumber: c, heightInPx: l * (d - 1) }); } - for (const a of s.getWhitespaces()) { - if (e.has(a.id)) + for (const c of s.getWhitespaces()) { + if (e.has(c.id)) continue; - const c = a.afterLineNumber === 0 ? 0 : o.convertViewPositionToModelPosition(new V(a.afterLineNumber, 1)).lineNumber; - t.push({ lineNumber: c, heightInPx: a.height }); + const d = c.afterLineNumber === 0 ? 0 : o.convertViewPositionToModelPosition(new Y(c.afterLineNumber, 1)).lineNumber; + t.push({ lineNumber: d, heightInPx: c.height }); } - return mue(t, i, (a) => a.lineNumber, (a, c) => ({ lineNumber: a.lineNumber, heightInPx: a.heightInPx + c.heightInPx })); + return lme(t, i, (c) => c.lineNumber, (c, d) => ({ lineNumber: c.lineNumber, heightInPx: c.heightInPx + d.heightInPx })); } -function FX(s) { - return s.innerChanges ? s.innerChanges.every((e) => Tz(e.modifiedRange) && Tz(e.originalRange) || e.originalRange.equalsRange(new M(1, 1, 1, 1))) : !1; +function hH(s) { + return s.innerChanges ? s.innerChanges.every((e) => nA(e.modifiedRange) && nA(e.originalRange) || e.originalRange.equalsRange(new I(1, 1, 1, 1))) : !1; } -function Tz(s) { +function nA(s) { return s.startLineNumber === s.endLineNumber; } -const yw = class yw extends R { +const Ny = class Ny extends J { constructor(e, t, i, n, o) { - super(), this._rootElement = e, this._diffModel = t, this._originalEditorLayoutInfo = i, this._modifiedEditorLayoutInfo = n, this._editors = o, this._originalScrollTop = St(this, this._editors.original.onDidScrollChange, () => this._editors.original.getScrollTop()), this._modifiedScrollTop = St(this, this._editors.modified.onDidScrollChange, () => this._editors.modified.getScrollTop()), this._viewZonesChanged = Zn("onDidChangeViewZones", this._editors.modified.onDidChangeViewZones), this.width = Oe(this, 0), this._modifiedViewZonesChangedSignal = Zn("modified.onDidChangeViewZones", this._editors.modified.onDidChangeViewZones), this._originalViewZonesChangedSignal = Zn("original.onDidChangeViewZones", this._editors.original.onDidChangeViewZones), this._state = Uh(this, (d, h) => { - var Z; + super(), this._rootElement = e, this._diffModel = t, this._originalEditorLayoutInfo = i, this._modifiedEditorLayoutInfo = n, this._editors = o, this._originalScrollTop = Gt(this, this._editors.original.onDidScrollChange, () => this._editors.original.getScrollTop()), this._modifiedScrollTop = Gt(this, this._editors.modified.onDidScrollChange, () => this._editors.modified.getScrollTop()), this._viewZonesChanged = xn("onDidChangeViewZones", this._editors.modified.onDidChangeViewZones), this.width = Ue(this, 0), this._modifiedViewZonesChangedSignal = xn("modified.onDidChangeViewZones", this._editors.modified.onDidChangeViewZones), this._originalViewZonesChangedSignal = xn("original.onDidChangeViewZones", this._editors.original.onDidChangeViewZones), this._state = qh(this, (a, h) => { + var S; this._element.replaceChildren(); - const u = this._diffModel.read(d), g = (Z = u == null ? void 0 : u.diff.read(d)) == null ? void 0 : Z.movedTexts; - if (!g || g.length === 0) { + const u = this._diffModel.read(a), m = (S = u == null ? void 0 : u.diff.read(a)) == null ? void 0 : S.movedTexts; + if (!m || m.length === 0) { this.width.set(0, void 0); return; } - this._viewZonesChanged.read(d); - const m = this._originalEditorLayoutInfo.read(d), f = this._modifiedEditorLayoutInfo.read(d); - if (!m || !f) { + this._viewZonesChanged.read(a); + const b = this._originalEditorLayoutInfo.read(a), g = this._modifiedEditorLayoutInfo.read(a); + if (!b || !g) { this.width.set(0, void 0); return; } - this._modifiedViewZonesChangedSignal.read(d), this._originalViewZonesChangedSignal.read(d); - const b = g.map((_) => { - function v(be, me) { - const Ve = me.getTopForLineNumber(be.startLineNumber, !0), ke = me.getTopForLineNumber(be.endLineNumberExclusive, !0); - return (Ve + ke) / 2; + this._modifiedViewZonesChangedSignal.read(a), this._originalViewZonesChangedSignal.read(a); + const Z = m.map((x) => { + function w(Ze, be) { + const Ye = be.getTopForLineNumber(Ze.startLineNumber, !0), ke = be.getTopForLineNumber(Ze.endLineNumberExclusive, !0); + return (Ye + ke) / 2; } - const P = v(_.lineRangeMapping.original, this._editors.original), E = this._originalScrollTop.read(d), Y = v(_.lineRangeMapping.modified, this._editors.modified), B = this._modifiedScrollTop.read(d), X = P - E, j = Y - B, le = Math.min(P, Y), ue = Math.max(P, Y); - return { range: new He(le, ue), from: X, to: j, fromWithoutScroll: P, toWithoutScroll: Y, move: _ }; + const A = w(x.lineRangeMapping.original, this._editors.original), H = this._originalScrollTop.read(a), F = w(x.lineRangeMapping.modified, this._editors.modified), K = this._modifiedScrollTop.read(a), E = A - H, j = F - K, re = Math.min(A, F), ue = Math.max(A, F); + return { range: new Pe(re, ue), from: E, to: j, fromWithoutScroll: A, toWithoutScroll: F, move: x }; }); - b.sort(cee(gs((_) => _.fromWithoutScroll > _.toWithoutScroll, dee), gs((_) => _.fromWithoutScroll > _.toWithoutScroll ? _.fromWithoutScroll : -_.toWithoutScroll, zr))); - const y = YX.compute(b.map((_) => _.range)), w = 10, C = m.verticalScrollbarWidth, S = (y.getTrackCount() - 1) * 10 + w * 2, L = C + S + (f.contentLeft - yw.movedCodeBlockPadding); - let x = 0; - for (const _ of b) { - const v = y.getTrack(x), P = C + w + v * 10, E = 15, Y = 15, B = L, X = f.glyphMarginWidth + f.lineNumbersWidth, j = 18, le = document.createElementNS("http://www.w3.org/2000/svg", "rect"); - le.classList.add("arrow-rectangle"), le.setAttribute("x", `${B - X}`), le.setAttribute("y", `${_.to - j / 2}`), le.setAttribute("width", `${X}`), le.setAttribute("height", `${j}`), this._element.appendChild(le); - const ue = document.createElementNS("http://www.w3.org/2000/svg", "g"), be = document.createElementNS("http://www.w3.org/2000/svg", "path"); - be.setAttribute("d", `M 0 ${_.from} L ${P} ${_.from} L ${P} ${_.to} L ${B - Y} ${_.to}`), be.setAttribute("fill", "none"), ue.appendChild(be); - const me = document.createElementNS("http://www.w3.org/2000/svg", "polygon"); - me.classList.add("arrow"), h.add(Te((Ve) => { - be.classList.toggle("currentMove", _.move === u.activeMovedText.read(Ve)), me.classList.toggle("currentMove", _.move === u.activeMovedText.read(Ve)); - })), me.setAttribute("points", `${B - Y},${_.to - E / 2} ${B},${_.to} ${B - Y},${_.to + E / 2}`), ue.appendChild(me), this._element.appendChild(ue), x++; - } - this.width.set(S, void 0); - }), this._element = document.createElementNS("http://www.w3.org/2000/svg", "svg"), this._element.setAttribute("class", "moved-blocks-lines"), this._rootElement.appendChild(this._element), this._register(Ce(() => this._element.remove())), this._register(Te((d) => { - const h = this._originalEditorLayoutInfo.read(d), u = this._modifiedEditorLayoutInfo.read(d); - !h || !u || (this._element.style.left = `${h.width - h.verticalScrollbarWidth}px`, this._element.style.height = `${h.height}px`, this._element.style.width = `${h.verticalScrollbarWidth + h.contentLeft - yw.movedCodeBlockPadding + this.width.read(d)}px`); - })), this._register(h0(this._state)); - const r = ye((d) => { - const h = this._diffModel.read(d), u = h == null ? void 0 : h.diff.read(d); - return u ? u.movedTexts.map((g) => ({ - move: g, - original: new Pp(dr(g.lineRangeMapping.original.startLineNumber - 1), 18), - modified: new Pp(dr(g.lineRangeMapping.modified.startLineNumber - 1), 18) + Z.sort(tte(ps((x) => x.fromWithoutScroll > x.toWithoutScroll, ite), ps((x) => x.fromWithoutScroll > x.toWithoutScroll ? x.fromWithoutScroll : -x.toWithoutScroll, Ul))); + const f = uH.compute(Z.map((x) => x.range)), y = 10, W = b.verticalScrollbarWidth, G = (f.getTrackCount() - 1) * 10 + y * 2, X = W + G + (g.contentLeft - Ny.movedCodeBlockPadding); + let L = 0; + for (const x of Z) { + const w = f.getTrack(L), A = W + y + w * 10, H = 15, F = 15, K = X, E = g.glyphMarginWidth + g.lineNumbersWidth, j = 18, re = document.createElementNS("http://www.w3.org/2000/svg", "rect"); + re.classList.add("arrow-rectangle"), re.setAttribute("x", `${K - E}`), re.setAttribute("y", `${x.to - j / 2}`), re.setAttribute("width", `${E}`), re.setAttribute("height", `${j}`), this._element.appendChild(re); + const ue = document.createElementNS("http://www.w3.org/2000/svg", "g"), Ze = document.createElementNS("http://www.w3.org/2000/svg", "path"); + Ze.setAttribute("d", `M 0 ${x.from} L ${A} ${x.from} L ${A} ${x.to} L ${K - F} ${x.to}`), Ze.setAttribute("fill", "none"), ue.appendChild(Ze); + const be = document.createElementNS("http://www.w3.org/2000/svg", "polygon"); + be.classList.add("arrow"), h.add(Te((Ye) => { + Ze.classList.toggle("currentMove", x.move === u.activeMovedText.read(Ye)), be.classList.toggle("currentMove", x.move === u.activeMovedText.read(Ye)); + })), be.setAttribute("points", `${K - F},${x.to - H / 2} ${K},${x.to} ${K - F},${x.to + H / 2}`), ue.appendChild(be), this._element.appendChild(ue), L++; + } + this.width.set(G, void 0); + }), this._element = document.createElementNS("http://www.w3.org/2000/svg", "svg"), this._element.setAttribute("class", "moved-blocks-lines"), this._rootElement.appendChild(this._element), this._register(We(() => this._element.remove())), this._register(Te((a) => { + const h = this._originalEditorLayoutInfo.read(a), u = this._modifiedEditorLayoutInfo.read(a); + !h || !u || (this._element.style.left = `${h.width - h.verticalScrollbarWidth}px`, this._element.style.height = `${h.height}px`, this._element.style.width = `${h.verticalScrollbarWidth + h.contentLeft - Ny.movedCodeBlockPadding + this.width.read(a)}px`); + })), this._register(Z0(this._state)); + const l = fe((a) => { + const h = this._diffModel.read(a), u = h == null ? void 0 : h.diff.read(a); + return u ? u.movedTexts.map((m) => ({ + move: m, + original: new Qp(ul(m.lineRangeMapping.original.startLineNumber - 1), 18), + modified: new Qp(ul(m.lineRangeMapping.modified.startLineNumber - 1), 18) })) : []; }); - this._register(ex(this._editors.original, r.map((d) => ( + this._register(pL(this._editors.original, l.map((a) => ( /** @description movedBlockViewZones.original */ - d.map((h) => h.original) - )))), this._register(ex(this._editors.modified, r.map((d) => ( + a.map((h) => h.original) + )))), this._register(pL(this._editors.modified, l.map((a) => ( /** @description movedBlockViewZones.modified */ - d.map((h) => h.modified) - )))), this._register(ks((d, h) => { - const u = r.read(d); - for (const g of u) - h.add(new Dz(this._editors.original, g.original, g.move, "original", this._diffModel.get())), h.add(new Dz(this._editors.modified, g.modified, g.move, "modified", this._diffModel.get())); + a.map((h) => h.modified) + )))), this._register(Js((a, h) => { + const u = l.read(a); + for (const m of u) + h.add(new sA(this._editors.original, m.original, m.move, "original", this._diffModel.get())), h.add(new sA(this._editors.modified, m.modified, m.move, "modified", this._diffModel.get())); })); - const l = Zn("original.onDidFocusEditorWidget", (d) => this._editors.original.onDidFocusEditorWidget(() => setTimeout(() => d(void 0), 0))), a = Zn("modified.onDidFocusEditorWidget", (d) => this._editors.modified.onDidFocusEditorWidget(() => setTimeout(() => d(void 0), 0))); - let c = "modified"; - this._register(ZC({ + const r = xn("original.onDidFocusEditorWidget", (a) => this._editors.original.onDidFocusEditorWidget(() => setTimeout(() => a(void 0), 0))), c = xn("modified.onDidFocusEditorWidget", (a) => this._editors.modified.onDidFocusEditorWidget(() => setTimeout(() => a(void 0), 0))); + let d = "modified"; + this._register(EG({ createEmptyChangeSummary: () => { }, - handleChange: (d, h) => (d.didChange(l) && (c = "original"), d.didChange(a) && (c = "modified"), !0) - }, (d) => { - l.read(d), a.read(d); - const h = this._diffModel.read(d); + handleChange: (a, h) => (a.didChange(r) && (d = "original"), a.didChange(c) && (d = "modified"), !0) + }, (a) => { + r.read(a), c.read(a); + const h = this._diffModel.read(a); if (!h) return; - const u = h.diff.read(d); - let g; - if (u && c === "original") { - const m = this._editors.originalCursor.read(d); - m && (g = u.movedTexts.find((f) => f.lineRangeMapping.original.contains(m.lineNumber))); + const u = h.diff.read(a); + let m; + if (u && d === "original") { + const b = this._editors.originalCursor.read(a); + b && (m = u.movedTexts.find((g) => g.lineRangeMapping.original.contains(b.lineNumber))); } - if (u && c === "modified") { - const m = this._editors.modifiedCursor.read(d); - m && (g = u.movedTexts.find((f) => f.lineRangeMapping.modified.contains(m.lineNumber))); + if (u && d === "modified") { + const b = this._editors.modifiedCursor.read(a); + b && (m = u.movedTexts.find((g) => g.lineRangeMapping.modified.contains(b.lineNumber))); } - g !== h.movedTextToCompare.get() && h.movedTextToCompare.set(void 0, void 0), h.setActiveMovedText(g); + m !== h.movedTextToCompare.get() && h.movedTextToCompare.set(void 0, void 0), h.setActiveMovedText(m); })); } }; -yw.movedCodeBlockPadding = 4; -let Vf = yw; -class YX { +Ny.movedCodeBlockPadding = 4; +let Dg = Ny; +class uH { static compute(e) { const t = [], i = []; for (const n of e) { - let o = t.findIndex((r) => !r.intersectsStrict(n)); - o === -1 && (t.length >= 6 ? o = Tre(t, gs((l) => l.intersectWithRangeLength(n), zr)) : (o = t.length, t.push(new dX()))), t[o].addRange(n), i.push(o); + let o = t.findIndex((l) => !l.intersectsStrict(n)); + o === -1 && (t.length >= 6 ? o = Lre(t, ps((r) => r.intersectWithRangeLength(n), Ul)) : (o = t.length, t.push(new kJ()))), t[o].addRange(n), i.push(o); } - return new YX(t.length, i); + return new uH(t.length, i); } constructor(e, t) { this._trackCount = e, this.trackPerLineIdx = t; @@ -52386,54 +52386,54 @@ class YX { return this._trackCount; } } -class Dz extends WX { +class sA extends tH { constructor(e, t, i, n, o) { - const r = Qe("div.diff-hidden-lines-widget"); - super(e, t, r.root), this._editor = e, this._move = i, this._kind = n, this._diffModel = o, this._nodes = Qe("div.diff-moved-code-block", { style: { marginRight: "4px" } }, [ - Qe("div.text-content@textContent"), - Qe("div.action-bar@actionBar") - ]), r.root.appendChild(this._nodes.root); - const l = St(this._editor.onDidLayoutChange, () => this._editor.getLayoutInfo()); - this._register(Uc(this._nodes.root, { - paddingRight: l.map((u) => u.verticalScrollbarWidth) + const l = Oe("div.diff-hidden-lines-widget"); + super(e, t, l.root), this._editor = e, this._move = i, this._kind = n, this._diffModel = o, this._nodes = Oe("div.diff-moved-code-block", { style: { marginRight: "4px" } }, [ + Oe("div.text-content@textContent"), + Oe("div.action-bar@actionBar") + ]), l.root.appendChild(this._nodes.root); + const r = Gt(this._editor.onDidLayoutChange, () => this._editor.getLayoutInfo()); + this._register(qd(this._nodes.root, { + paddingRight: r.map((u) => u.verticalScrollbarWidth) })); - let a; - i.changes.length > 0 ? a = this._kind === "original" ? p("codeMovedToWithChanges", "Code moved with changes to line {0}-{1}", this._move.lineRangeMapping.modified.startLineNumber, this._move.lineRangeMapping.modified.endLineNumberExclusive - 1) : p("codeMovedFromWithChanges", "Code moved with changes from line {0}-{1}", this._move.lineRangeMapping.original.startLineNumber, this._move.lineRangeMapping.original.endLineNumberExclusive - 1) : a = this._kind === "original" ? p("codeMovedTo", "Code moved to line {0}-{1}", this._move.lineRangeMapping.modified.startLineNumber, this._move.lineRangeMapping.modified.endLineNumberExclusive - 1) : p("codeMovedFrom", "Code moved from line {0}-{1}", this._move.lineRangeMapping.original.startLineNumber, this._move.lineRangeMapping.original.endLineNumberExclusive - 1); - const c = this._register(new Yo(this._nodes.actionBar, { + let c; + i.changes.length > 0 ? c = this._kind === "original" ? p("codeMovedToWithChanges", "Code moved with changes to line {0}-{1}", this._move.lineRangeMapping.modified.startLineNumber, this._move.lineRangeMapping.modified.endLineNumberExclusive - 1) : p("codeMovedFromWithChanges", "Code moved with changes from line {0}-{1}", this._move.lineRangeMapping.original.startLineNumber, this._move.lineRangeMapping.original.endLineNumberExclusive - 1) : c = this._kind === "original" ? p("codeMovedTo", "Code moved to line {0}-{1}", this._move.lineRangeMapping.modified.startLineNumber, this._move.lineRangeMapping.modified.endLineNumberExclusive - 1) : p("codeMovedFrom", "Code moved from line {0}-{1}", this._move.lineRangeMapping.original.startLineNumber, this._move.lineRangeMapping.original.endLineNumberExclusive - 1); + const d = this._register(new Ao(this._nodes.actionBar, { highlightToggledItems: !0 - })), d = new lo("", a, "", !1); - c.push(d, { icon: !1, label: !0 }); - const h = new lo("", "Compare", Ze.asClassName(te.compareChanges), !0, () => { + })), a = new ao("", c, "", !1); + d.push(a, { icon: !1, label: !0 }); + const h = new ao("", "Compare", Se.asClassName(te.compareChanges), !0, () => { this._editor.focus(), this._diffModel.movedTextToCompare.set(this._diffModel.movedTextToCompare.get() === i ? void 0 : this._move, void 0); }); this._register(Te((u) => { - const g = this._diffModel.movedTextToCompare.read(u) === i; - h.checked = g; - })), c.push(h, { icon: !1, label: !0 }); + const m = this._diffModel.movedTextToCompare.read(u) === i; + h.checked = m; + })), d.push(h, { icon: !1, label: !0 }); } } -class gge extends R { +class obe extends J { constructor(e, t, i, n) { - super(), this._editors = e, this._diffModel = t, this._options = i, this._decorations = ye(this, (o) => { - const r = this._diffModel.read(o), l = r == null ? void 0 : r.diff.read(o); - if (!l) + super(), this._editors = e, this._diffModel = t, this._options = i, this._decorations = fe(this, (o) => { + const l = this._diffModel.read(o), r = l == null ? void 0 : l.diff.read(o); + if (!r) return null; - const a = this._diffModel.read(o).movedTextToCompare.read(o), c = this._options.renderIndicators.read(o), d = this._options.showEmptyDecorations.read(o), h = [], u = []; - if (!a) - for (const m of l.mappings) - if (m.lineRangeMapping.original.isEmpty || h.push({ range: m.lineRangeMapping.original.toInclusiveRange(), options: c ? w1 : bz }), m.lineRangeMapping.modified.isEmpty || u.push({ range: m.lineRangeMapping.modified.toInclusiveRange(), options: c ? ix : fz }), m.lineRangeMapping.modified.isEmpty || m.lineRangeMapping.original.isEmpty) - m.lineRangeMapping.original.isEmpty || h.push({ range: m.lineRangeMapping.original.toInclusiveRange(), options: GX }), m.lineRangeMapping.modified.isEmpty || u.push({ range: m.lineRangeMapping.modified.toInclusiveRange(), options: VX }); + const c = this._diffModel.read(o).movedTextToCompare.read(o), d = this._options.renderIndicators.read(o), a = this._options.showEmptyDecorations.read(o), h = [], u = []; + if (!c) + for (const b of r.mappings) + if (b.lineRangeMapping.original.isEmpty || h.push({ range: b.lineRangeMapping.original.toInclusiveRange(), options: d ? wW : zz }), b.lineRangeMapping.modified.isEmpty || u.push({ range: b.lineRangeMapping.modified.toInclusiveRange(), options: d ? ZL : Fz }), b.lineRangeMapping.modified.isEmpty || b.lineRangeMapping.original.isEmpty) + b.lineRangeMapping.original.isEmpty || h.push({ range: b.lineRangeMapping.original.toInclusiveRange(), options: rH }), b.lineRangeMapping.modified.isEmpty || u.push({ range: b.lineRangeMapping.modified.toInclusiveRange(), options: oH }); else { - const f = this._options.useTrueInlineDiffRendering.read(o) && FX(m.lineRangeMapping); - for (const b of m.lineRangeMapping.innerChanges || []) - if (m.lineRangeMapping.original.contains(b.originalRange.startLineNumber) && h.push({ range: b.originalRange, options: b.originalRange.isEmpty() && d ? RX : Lb }), m.lineRangeMapping.modified.contains(b.modifiedRange.startLineNumber) && u.push({ range: b.modifiedRange, options: b.modifiedRange.isEmpty() && d && !f ? kX : nx }), f) { - const y = r.model.original.getValueInRange(b.originalRange); + const g = this._options.useTrueInlineDiffRendering.read(o) && hH(b.lineRangeMapping); + for (const Z of b.lineRangeMapping.innerChanges || []) + if (b.lineRangeMapping.original.contains(Z.originalRange.startLineNumber) && h.push({ range: Z.originalRange, options: Z.originalRange.isEmpty() && a ? cH : CZ }), b.lineRangeMapping.modified.contains(Z.modifiedRange.startLineNumber) && u.push({ range: Z.modifiedRange, options: Z.modifiedRange.isEmpty() && a && !g ? lH : fL }), g) { + const f = l.model.original.getValueInRange(Z.originalRange); u.push({ - range: b.modifiedRange, + range: Z.modifiedRange, options: { description: "deleted-text", before: { - content: y, + content: f, inlineClassName: "inline-deleted-text" }, zIndex: 1e5, @@ -52442,92 +52442,92 @@ class gge extends R { }); } } - if (a) - for (const m of a.changes) { - const f = m.original.toInclusiveRange(); - f && h.push({ range: f, options: c ? w1 : bz }); - const b = m.modified.toInclusiveRange(); - b && u.push({ range: b, options: c ? ix : fz }); - for (const y of m.innerChanges || []) - h.push({ range: y.originalRange, options: Lb }), u.push({ range: y.modifiedRange, options: nx }); + if (c) + for (const b of c.changes) { + const g = b.original.toInclusiveRange(); + g && h.push({ range: g, options: d ? wW : zz }); + const Z = b.modified.toInclusiveRange(); + Z && u.push({ range: Z, options: d ? ZL : Fz }); + for (const f of b.innerChanges || []) + h.push({ range: f.originalRange, options: CZ }), u.push({ range: f.modifiedRange, options: fL }); } - const g = this._diffModel.read(o).activeMovedText.read(o); - for (const m of l.movedTexts) + const m = this._diffModel.read(o).activeMovedText.read(o); + for (const b of r.movedTexts) h.push({ - range: m.lineRangeMapping.original.toInclusiveRange(), + range: b.lineRangeMapping.original.toInclusiveRange(), options: { description: "moved", - blockClassName: "movedOriginal" + (m === g ? " currentMove" : ""), - blockPadding: [Vf.movedCodeBlockPadding, 0, Vf.movedCodeBlockPadding, Vf.movedCodeBlockPadding] + blockClassName: "movedOriginal" + (b === m ? " currentMove" : ""), + blockPadding: [Dg.movedCodeBlockPadding, 0, Dg.movedCodeBlockPadding, Dg.movedCodeBlockPadding] } }), u.push({ - range: m.lineRangeMapping.modified.toInclusiveRange(), + range: b.lineRangeMapping.modified.toInclusiveRange(), options: { description: "moved", - blockClassName: "movedModified" + (m === g ? " currentMove" : ""), + blockClassName: "movedModified" + (b === m ? " currentMove" : ""), blockPadding: [4, 0, 4, 4] } }); return { originalDecorations: h, modifiedDecorations: u }; - }), this._register($A(this._editors.original, this._decorations.map((o) => (o == null ? void 0 : o.originalDecorations) || []))), this._register($A(this._editors.modified, this._decorations.map((o) => (o == null ? void 0 : o.modifiedDecorations) || []))); + }), this._register(bL(this._editors.original, this._decorations.map((o) => (o == null ? void 0 : o.originalDecorations) || []))), this._register(bL(this._editors.modified, this._decorations.map((o) => (o == null ? void 0 : o.modifiedDecorations) || []))); } } -var u0 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var f0 = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; }; -const mge = !1; -var rx; +const lbe = !1; +var GL; (function(s) { s.North = "north", s.South = "south", s.East = "east", s.West = "west"; -})(rx || (rx = {})); -let pge = 4; -const fge = new k(); -let bge = 300; -const yge = new k(); -class zX { +})(GL || (GL = {})); +let rbe = 4; +const cbe = new k(); +let dbe = 300; +const abe = new k(); +class mH { constructor(e) { - this.el = e, this.disposables = new U(); + this.el = e, this.disposables = new _(); } get onPointerMove() { - return this.disposables.add(new et(xe(this.el), "mousemove")).event; + return this.disposables.add(new et(Le(this.el), "mousemove")).event; } get onPointerUp() { - return this.disposables.add(new et(xe(this.el), "mouseup")).event; + return this.disposables.add(new et(Le(this.el), "mouseup")).event; } dispose() { this.disposables.dispose(); } } -u0([ - Zi -], zX.prototype, "onPointerMove", null); -u0([ - Zi -], zX.prototype, "onPointerUp", null); -class PX { +f0([ + xi +], mH.prototype, "onPointerMove", null); +f0([ + xi +], mH.prototype, "onPointerUp", null); +class bH { get onPointerMove() { - return this.disposables.add(new et(this.el, Rt.Change)).event; + return this.disposables.add(new et(this.el, Jt.Change)).event; } get onPointerUp() { - return this.disposables.add(new et(this.el, Rt.End)).event; + return this.disposables.add(new et(this.el, Jt.End)).event; } constructor(e) { - this.el = e, this.disposables = new U(); + this.el = e, this.disposables = new _(); } dispose() { this.disposables.dispose(); } } -u0([ - Zi -], PX.prototype, "onPointerMove", null); -u0([ - Zi -], PX.prototype, "onPointerUp", null); -class lx { +f0([ + xi +], bH.prototype, "onPointerMove", null); +f0([ + xi +], bH.prototype, "onPointerUp", null); +class XL { get onPointerMove() { return this.factory.onPointerMove; } @@ -52540,14 +52540,14 @@ class lx { dispose() { } } -u0([ - Zi -], lx.prototype, "onPointerMove", null); -u0([ - Zi -], lx.prototype, "onPointerUp", null); -const Vz = "pointer-events-disabled"; -class Tn extends R { +f0([ + xi +], XL.prototype, "onPointerMove", null); +f0([ + xi +], XL.prototype, "onPointerUp", null); +const oA = "pointer-events-disabled"; +class Mn extends J { get state() { return this._state; } @@ -52588,7 +52588,7 @@ class Tn extends R { if (this._orthogonalStartSash !== e) { if (this.orthogonalStartDragHandleDisposables.clear(), this.orthogonalStartSashDisposables.clear(), e) { const t = (i) => { - this.orthogonalStartDragHandleDisposables.clear(), i !== 0 && (this._orthogonalStartDragHandle = Q(this.el, ce(".orthogonal-drag-handle.start")), this.orthogonalStartDragHandleDisposables.add(Ce(() => this._orthogonalStartDragHandle.remove())), this.orthogonalStartDragHandleDisposables.add(new et(this._orthogonalStartDragHandle, "mouseenter")).event(() => Tn.onMouseEnter(e), void 0, this.orthogonalStartDragHandleDisposables), this.orthogonalStartDragHandleDisposables.add(new et(this._orthogonalStartDragHandle, "mouseleave")).event(() => Tn.onMouseLeave(e), void 0, this.orthogonalStartDragHandleDisposables)); + this.orthogonalStartDragHandleDisposables.clear(), i !== 0 && (this._orthogonalStartDragHandle = O(this.el, de(".orthogonal-drag-handle.start")), this.orthogonalStartDragHandleDisposables.add(We(() => this._orthogonalStartDragHandle.remove())), this.orthogonalStartDragHandleDisposables.add(new et(this._orthogonalStartDragHandle, "mouseenter")).event(() => Mn.onMouseEnter(e), void 0, this.orthogonalStartDragHandleDisposables), this.orthogonalStartDragHandleDisposables.add(new et(this._orthogonalStartDragHandle, "mouseleave")).event(() => Mn.onMouseLeave(e), void 0, this.orthogonalStartDragHandleDisposables)); }; this.orthogonalStartSashDisposables.add(e.onDidEnablementChange.event(t, this)), t(e.state); } @@ -52607,7 +52607,7 @@ class Tn extends R { if (this._orthogonalEndSash !== e) { if (this.orthogonalEndDragHandleDisposables.clear(), this.orthogonalEndSashDisposables.clear(), e) { const t = (i) => { - this.orthogonalEndDragHandleDisposables.clear(), i !== 0 && (this._orthogonalEndDragHandle = Q(this.el, ce(".orthogonal-drag-handle.end")), this.orthogonalEndDragHandleDisposables.add(Ce(() => this._orthogonalEndDragHandle.remove())), this.orthogonalEndDragHandleDisposables.add(new et(this._orthogonalEndDragHandle, "mouseenter")).event(() => Tn.onMouseEnter(e), void 0, this.orthogonalEndDragHandleDisposables), this.orthogonalEndDragHandleDisposables.add(new et(this._orthogonalEndDragHandle, "mouseleave")).event(() => Tn.onMouseLeave(e), void 0, this.orthogonalEndDragHandleDisposables)); + this.orthogonalEndDragHandleDisposables.clear(), i !== 0 && (this._orthogonalEndDragHandle = O(this.el, de(".orthogonal-drag-handle.end")), this.orthogonalEndDragHandleDisposables.add(We(() => this._orthogonalEndDragHandle.remove())), this.orthogonalEndDragHandleDisposables.add(new et(this._orthogonalEndDragHandle, "mouseenter")).event(() => Mn.onMouseEnter(e), void 0, this.orthogonalEndDragHandleDisposables), this.orthogonalEndDragHandleDisposables.add(new et(this._orthogonalEndDragHandle, "mouseleave")).event(() => Mn.onMouseLeave(e), void 0, this.orthogonalEndDragHandleDisposables)); }; this.orthogonalEndSashDisposables.add(e.onDidEnablementChange.event(t, this)), t(e.state); } @@ -52615,58 +52615,58 @@ class Tn extends R { } } constructor(e, t, i) { - super(), this.hoverDelay = bge, this.hoverDelayer = this._register(new fr(this.hoverDelay)), this._state = 3, this.onDidEnablementChange = this._register(new k()), this._onDidStart = this._register(new k()), this._onDidChange = this._register(new k()), this._onDidReset = this._register(new k()), this._onDidEnd = this._register(new k()), this.orthogonalStartSashDisposables = this._register(new U()), this.orthogonalStartDragHandleDisposables = this._register(new U()), this.orthogonalEndSashDisposables = this._register(new U()), this.orthogonalEndDragHandleDisposables = this._register(new U()), this.onDidStart = this._onDidStart.event, this.onDidChange = this._onDidChange.event, this.onDidReset = this._onDidReset.event, this.onDidEnd = this._onDidEnd.event, this.linkedSash = void 0, this.el = Q(e, ce(".monaco-sash")), i.orthogonalEdge && this.el.classList.add(`orthogonal-edge-${i.orthogonalEdge}`), qe && this.el.classList.add("mac"); + super(), this.hoverDelay = dbe, this.hoverDelayer = this._register(new yl(this.hoverDelay)), this._state = 3, this.onDidEnablementChange = this._register(new k()), this._onDidStart = this._register(new k()), this._onDidChange = this._register(new k()), this._onDidReset = this._register(new k()), this._onDidEnd = this._register(new k()), this.orthogonalStartSashDisposables = this._register(new _()), this.orthogonalStartDragHandleDisposables = this._register(new _()), this.orthogonalEndSashDisposables = this._register(new _()), this.orthogonalEndDragHandleDisposables = this._register(new _()), this.onDidStart = this._onDidStart.event, this.onDidChange = this._onDidChange.event, this.onDidReset = this._onDidReset.event, this.onDidEnd = this._onDidEnd.event, this.linkedSash = void 0, this.el = O(e, de(".monaco-sash")), i.orthogonalEdge && this.el.classList.add(`orthogonal-edge-${i.orthogonalEdge}`), qe && this.el.classList.add("mac"); const n = this._register(new et(this.el, "mousedown")).event; - this._register(n((h) => this.onPointerStart(h, new zX(e)), this)); + this._register(n((h) => this.onPointerStart(h, new mH(e)), this)); const o = this._register(new et(this.el, "dblclick")).event; this._register(o(this.onPointerDoublePress, this)); - const r = this._register(new et(this.el, "mouseenter")).event; - this._register(r(() => Tn.onMouseEnter(this))); - const l = this._register(new et(this.el, "mouseleave")).event; - this._register(l(() => Tn.onMouseLeave(this))), this._register(Rn.addTarget(this.el)); - const a = this._register(new et(this.el, Rt.Start)).event; - this._register(a((h) => this.onPointerStart(h, new PX(this.el)), this)); - const c = this._register(new et(this.el, Rt.Tap)).event; - let d; - this._register(c((h) => { - if (d) { - clearTimeout(d), d = void 0, this.onPointerDoublePress(h); + const l = this._register(new et(this.el, "mouseenter")).event; + this._register(l(() => Mn.onMouseEnter(this))); + const r = this._register(new et(this.el, "mouseleave")).event; + this._register(r(() => Mn.onMouseLeave(this))), this._register(En.addTarget(this.el)); + const c = this._register(new et(this.el, Jt.Start)).event; + this._register(c((h) => this.onPointerStart(h, new bH(this.el)), this)); + const d = this._register(new et(this.el, Jt.Tap)).event; + let a; + this._register(d((h) => { + if (a) { + clearTimeout(a), a = void 0, this.onPointerDoublePress(h); return; } - clearTimeout(d), d = setTimeout(() => d = void 0, 250); - }, this)), typeof i.size == "number" ? (this.size = i.size, i.orientation === 0 ? this.el.style.width = `${this.size}px` : this.el.style.height = `${this.size}px`) : (this.size = pge, this._register(fge.event((h) => { + clearTimeout(a), a = setTimeout(() => a = void 0, 250); + }, this)), typeof i.size == "number" ? (this.size = i.size, i.orientation === 0 ? this.el.style.width = `${this.size}px` : this.el.style.height = `${this.size}px`) : (this.size = rbe, this._register(cbe.event((h) => { this.size = h, this.layout(); - }))), this._register(yge.event((h) => this.hoverDelay = h)), this.layoutProvider = t, this.orthogonalStartSash = i.orthogonalStartSash, this.orthogonalEndSash = i.orthogonalEndSash, this.orientation = i.orientation || 0, this.orientation === 1 ? (this.el.classList.add("horizontal"), this.el.classList.remove("vertical")) : (this.el.classList.remove("horizontal"), this.el.classList.add("vertical")), this.el.classList.toggle("debug", mge), this.layout(); + }))), this._register(abe.event((h) => this.hoverDelay = h)), this.layoutProvider = t, this.orthogonalStartSash = i.orthogonalStartSash, this.orthogonalEndSash = i.orthogonalEndSash, this.orientation = i.orientation || 0, this.orientation === 1 ? (this.el.classList.add("horizontal"), this.el.classList.remove("vertical")) : (this.el.classList.remove("horizontal"), this.el.classList.add("vertical")), this.el.classList.toggle("debug", lbe), this.layout(); } onPointerStart(e, t) { tt.stop(e); let i = !1; if (!e.__orthogonalSashEvent) { - const m = this.getOrthogonalSash(e); - m && (i = !0, e.__orthogonalSashEvent = !0, m.onPointerStart(e, new lx(t))); + const b = this.getOrthogonalSash(e); + b && (i = !0, e.__orthogonalSashEvent = !0, b.onPointerStart(e, new XL(t))); } - if (this.linkedSash && !e.__linkedSashEvent && (e.__linkedSashEvent = !0, this.linkedSash.onPointerStart(e, new lx(t))), !this.state) + if (this.linkedSash && !e.__linkedSashEvent && (e.__linkedSashEvent = !0, this.linkedSash.onPointerStart(e, new XL(t))), !this.state) return; const n = this.el.ownerDocument.getElementsByTagName("iframe"); - for (const m of n) - m.classList.add(Vz); - const o = e.pageX, r = e.pageY, l = e.altKey, a = { startX: o, currentX: o, startY: r, currentY: r, altKey: l }; - this.el.classList.add("active"), this._onDidStart.fire(a); - const c = Bo(this.el), d = () => { - let m = ""; - i ? m = "all-scroll" : this.orientation === 1 ? this.state === 1 ? m = "s-resize" : this.state === 2 ? m = "n-resize" : m = qe ? "row-resize" : "ns-resize" : this.state === 1 ? m = "e-resize" : this.state === 2 ? m = "w-resize" : m = qe ? "col-resize" : "ew-resize", c.textContent = `* { cursor: ${m} !important; }`; - }, h = new U(); - d(), i || this.onDidEnablementChange.event(d, null, h); - const u = (m) => { - tt.stop(m, !1); - const f = { startX: o, currentX: m.pageX, startY: r, currentY: m.pageY, altKey: l }; - this._onDidChange.fire(f); - }, g = (m) => { - tt.stop(m, !1), c.remove(), this.el.classList.remove("active"), this._onDidEnd.fire(), h.dispose(); - for (const f of n) - f.classList.remove(Vz); + for (const b of n) + b.classList.add(oA); + const o = e.pageX, l = e.pageY, r = e.altKey, c = { startX: o, currentX: o, startY: l, currentY: l, altKey: r }; + this.el.classList.add("active"), this._onDidStart.fire(c); + const d = Po(this.el), a = () => { + let b = ""; + i ? b = "all-scroll" : this.orientation === 1 ? this.state === 1 ? b = "s-resize" : this.state === 2 ? b = "n-resize" : b = qe ? "row-resize" : "ns-resize" : this.state === 1 ? b = "e-resize" : this.state === 2 ? b = "w-resize" : b = qe ? "col-resize" : "ew-resize", d.textContent = `* { cursor: ${b} !important; }`; + }, h = new _(); + a(), i || this.onDidEnablementChange.event(a, null, h); + const u = (b) => { + tt.stop(b, !1); + const g = { startX: o, currentX: b.pageX, startY: l, currentY: b.pageY, altKey: r }; + this._onDidChange.fire(g); + }, m = (b) => { + tt.stop(b, !1), d.remove(), this.el.classList.remove("active"), this._onDidEnd.fire(), h.dispose(); + for (const g of n) + g.classList.remove(oA); }; - t.onPointerMove(u, null, h), t.onPointerUp(g, null, h), h.add(t); + t.onPointerMove(u, null, h), t.onPointerUp(m, null, h), h.add(t); } onPointerDoublePress(e) { const t = this.getOrthogonalSash(e); @@ -52674,10 +52674,10 @@ class Tn extends R { } static onMouseEnter(e, t = !1) { e.el.classList.contains("active") ? (e.hoverDelayer.cancel(), e.el.classList.add("hover")) : e.hoverDelayer.trigger(() => e.el.classList.add("hover"), e.hoverDelay).then(void 0, () => { - }), !t && e.linkedSash && Tn.onMouseEnter(e.linkedSash, !0); + }), !t && e.linkedSash && Mn.onMouseEnter(e.linkedSash, !0); } static onMouseLeave(e, t = !1) { - e.hoverDelayer.cancel(), e.el.classList.remove("hover"), !t && e.linkedSash && Tn.onMouseLeave(e.linkedSash, !0); + e.hoverDelayer.cancel(), e.el.classList.remove("hover"), !t && e.linkedSash && Mn.onMouseLeave(e.linkedSash, !0); } /** * Forcefully stop any user interactions with this sash. @@ -52685,7 +52685,7 @@ class Tn extends R { * interacting with the sash. */ clearSashHoverState() { - Tn.onMouseLeave(this); + Mn.onMouseLeave(this); } /** * Layout the sash. The sash will size and position itself @@ -52702,120 +52702,120 @@ class Tn extends R { } getOrthogonalSash(e) { const t = e.initialTarget ?? e.target; - if (!(!t || !Ki(t)) && t.classList.contains("orthogonal-drag-handle")) + if (!(!t || !Oi(t)) && t.classList.contains("orthogonal-drag-handle")) return t.classList.contains("start") ? this.orthogonalStartSash : this.orthogonalEndSash; } dispose() { super.dispose(), this.el.remove(); } } -class wge { +class hbe { resetSash() { this._sashRatio.set(void 0, void 0); } constructor(e, t) { - this._options = e, this.dimensions = t, this.sashLeft = xC(this, (i) => { + this._options = e, this.dimensions = t, this.sashLeft = JG(this, (i) => { const n = this._sashRatio.read(i) ?? this._options.splitViewDefaultRatio.read(i); return this._computeSashLeft(n, i); }, (i, n) => { const o = this.dimensions.width.get(); this._sashRatio.set(i / o, n); - }), this._sashRatio = Oe(this, void 0); + }), this._sashRatio = Ue(this, void 0); } /** @pure */ _computeSashLeft(e, t) { - const i = this.dimensions.width.read(t), n = Math.floor(this._options.splitViewDefaultRatio.read(t) * i), o = this._options.enableSplitViewResizing.read(t) ? Math.floor(e * i) : n, r = 100; - return i <= r * 2 ? n : o < r ? r : o > i - r ? i - r : o; + const i = this.dimensions.width.read(t), n = Math.floor(this._options.splitViewDefaultRatio.read(t) * i), o = this._options.enableSplitViewResizing.read(t) ? Math.floor(e * i) : n, l = 100; + return i <= l * 2 ? n : o < l ? l : o > i - l ? i - l : o; } } -class d4 extends R { - constructor(e, t, i, n, o, r) { - super(), this._domNode = e, this._dimensions = t, this._enabled = i, this._boundarySashes = n, this.sashLeft = o, this._resetSash = r, this._sash = this._register(new Tn(this._domNode, { - getVerticalSashTop: (l) => 0, - getVerticalSashLeft: (l) => this.sashLeft.get(), - getVerticalSashHeight: (l) => this._dimensions.height.get() +class PO extends J { + constructor(e, t, i, n, o, l) { + super(), this._domNode = e, this._dimensions = t, this._enabled = i, this._boundarySashes = n, this.sashLeft = o, this._resetSash = l, this._sash = this._register(new Mn(this._domNode, { + getVerticalSashTop: (r) => 0, + getVerticalSashLeft: (r) => this.sashLeft.get(), + getVerticalSashHeight: (r) => this._dimensions.height.get() }, { orientation: 0 /* Orientation.VERTICAL */ })), this._startSashPosition = void 0, this._register(this._sash.onDidStart(() => { this._startSashPosition = this.sashLeft.get(); - })), this._register(this._sash.onDidChange((l) => { - this.sashLeft.set(this._startSashPosition + (l.currentX - l.startX), void 0); - })), this._register(this._sash.onDidEnd(() => this._sash.layout())), this._register(this._sash.onDidReset(() => this._resetSash())), this._register(Te((l) => { - const a = this._boundarySashes.read(l); - a && (this._sash.orthogonalEndSash = a.bottom); - })), this._register(Te((l) => { - const a = this._enabled.read(l); - this._sash.state = a ? 3 : 0, this.sashLeft.read(l), this._dimensions.height.read(l), this._sash.layout(); + })), this._register(this._sash.onDidChange((r) => { + this.sashLeft.set(this._startSashPosition + (r.currentX - r.startX), void 0); + })), this._register(this._sash.onDidEnd(() => this._sash.layout())), this._register(this._sash.onDidReset(() => this._resetSash())), this._register(Te((r) => { + const c = this._boundarySashes.read(r); + c && (this._sash.orthogonalEndSash = c.bottom); + })), this._register(Te((r) => { + const c = this._enabled.read(r); + this._sash.state = c ? 3 : 0, this.sashLeft.read(r), this._dimensions.height.read(r), this._sash.layout(); })); } } -class Cge extends R { +class ube extends J { constructor(e, t, i) { - super(), this._editor = e, this._domNode = t, this.itemProvider = i, this.scrollTop = St(this, this._editor.onDidScrollChange, (r) => ( + super(), this._editor = e, this._domNode = t, this.itemProvider = i, this.scrollTop = Gt(this, this._editor.onDidScrollChange, (l) => ( /** @description editor.onDidScrollChange */ this._editor.getScrollTop() - )), this.isScrollTopZero = this.scrollTop.map((r) => ( + )), this.isScrollTopZero = this.scrollTop.map((l) => ( /** @description isScrollTopZero */ - r === 0 - )), this.modelAttached = St(this, this._editor.onDidChangeModel, (r) => ( + l === 0 + )), this.modelAttached = Gt(this, this._editor.onDidChangeModel, (l) => ( /** @description editor.onDidChangeModel */ this._editor.hasModel() - )), this.editorOnDidChangeViewZones = Zn("onDidChangeViewZones", this._editor.onDidChangeViewZones), this.editorOnDidContentSizeChange = Zn("onDidContentSizeChange", this._editor.onDidContentSizeChange), this.domNodeSizeChanged = d0("domNodeSizeChanged"), this.views = /* @__PURE__ */ new Map(), this._domNode.className = "gutter monaco-editor"; - const n = this._domNode.appendChild(Qe("div.scroll-decoration", { role: "presentation", ariaHidden: "true", style: { width: "100%" } }).root), o = new ResizeObserver(() => { - oi((r) => { - this.domNodeSizeChanged.trigger(r); + )), this.editorOnDidChangeViewZones = xn("onDidChangeViewZones", this._editor.onDidChangeViewZones), this.editorOnDidContentSizeChange = xn("onDidContentSizeChange", this._editor.onDidContentSizeChange), this.domNodeSizeChanged = g0("domNodeSizeChanged"), this.views = /* @__PURE__ */ new Map(), this._domNode.className = "gutter monaco-editor"; + const n = this._domNode.appendChild(Oe("div.scroll-decoration", { role: "presentation", ariaHidden: "true", style: { width: "100%" } }).root), o = new ResizeObserver(() => { + li((l) => { + this.domNodeSizeChanged.trigger(l); }); }); - o.observe(this._domNode), this._register(Ce(() => o.disconnect())), this._register(Te((r) => { - n.className = this.isScrollTopZero.read(r) ? "" : "scroll-decoration"; - })), this._register(Te((r) => ( + o.observe(this._domNode), this._register(We(() => o.disconnect())), this._register(Te((l) => { + n.className = this.isScrollTopZero.read(l) ? "" : "scroll-decoration"; + })), this._register(Te((l) => ( /** @description EditorGutter.Render */ - this.render(r) + this.render(l) ))); } dispose() { - super.dispose(), In(this._domNode); + super.dispose(), Rn(this._domNode); } render(e) { if (!this.modelAttached.read(e)) return; this.domNodeSizeChanged.read(e), this.editorOnDidChangeViewZones.read(e), this.editorOnDidContentSizeChange.read(e); - const t = this.scrollTop.read(e), i = this._editor.getVisibleRanges(), n = new Set(this.views.keys()), o = He.ofStartAndLength(0, this._domNode.clientHeight); + const t = this.scrollTop.read(e), i = this._editor.getVisibleRanges(), n = new Set(this.views.keys()), o = Pe.ofStartAndLength(0, this._domNode.clientHeight); if (!o.isEmpty) - for (const r of i) { - const l = new We(r.startLineNumber, r.endLineNumber + 1), a = this.itemProvider.getIntersectingGutterItems(l, e); - oi((c) => { - for (const d of a) { - if (!d.range.intersect(l)) + for (const l of i) { + const r = new Ne(l.startLineNumber, l.endLineNumber + 1), c = this.itemProvider.getIntersectingGutterItems(r, e); + li((d) => { + for (const a of c) { + if (!a.range.intersect(r)) continue; - n.delete(d.id); - let h = this.views.get(d.id); + n.delete(a.id); + let h = this.views.get(a.id); if (h) - h.item.set(d, c); + h.item.set(a, d); else { - const f = document.createElement("div"); - this._domNode.appendChild(f); - const b = Oe("item", d), y = this.itemProvider.createView(b, f); - h = new Sge(b, y, f), this.views.set(d.id, h); + const g = document.createElement("div"); + this._domNode.appendChild(g); + const Z = Ue("item", a), f = this.itemProvider.createView(Z, g); + h = new mbe(Z, f, g), this.views.set(a.id, h); } - const u = d.range.startLineNumber <= this._editor.getModel().getLineCount() ? this._editor.getTopForLineNumber(d.range.startLineNumber, !0) - t : this._editor.getBottomForLineNumber(d.range.startLineNumber - 1, !1) - t, m = (d.range.endLineNumberExclusive === 1 ? Math.max(u, this._editor.getTopForLineNumber(d.range.startLineNumber, !1) - t) : Math.max(u, this._editor.getBottomForLineNumber(d.range.endLineNumberExclusive - 1, !0) - t)) - u; - h.domNode.style.top = `${u}px`, h.domNode.style.height = `${m}px`, h.gutterItemView.layout(He.ofStartAndLength(u, m), o); + const u = a.range.startLineNumber <= this._editor.getModel().getLineCount() ? this._editor.getTopForLineNumber(a.range.startLineNumber, !0) - t : this._editor.getBottomForLineNumber(a.range.startLineNumber - 1, !1) - t, b = (a.range.endLineNumberExclusive === 1 ? Math.max(u, this._editor.getTopForLineNumber(a.range.startLineNumber, !1) - t) : Math.max(u, this._editor.getBottomForLineNumber(a.range.endLineNumberExclusive - 1, !0) - t)) - u; + h.domNode.style.top = `${u}px`, h.domNode.style.height = `${b}px`, h.gutterItemView.layout(Pe.ofStartAndLength(u, b), o); } }); } - for (const r of n) { - const l = this.views.get(r); - l.gutterItemView.dispose(), l.domNode.remove(), this.views.delete(r); + for (const l of n) { + const r = this.views.get(l); + r.gutterItemView.dispose(), r.domNode.remove(), this.views.delete(l); } } } -class Sge { +class mbe { constructor(e, t, i) { this.item = e, this.gutterItemView = t, this.domNode = i; } } -class h4 extends um { +class BO extends Zb { constructor(e) { super(), this._getContext = e; } @@ -52824,7 +52824,7 @@ class h4 extends um { return super.runAction(e, i); } } -class kz extends qK { +class lA extends YO { constructor(e) { super(), this._textModel = e; } @@ -52833,32 +52833,32 @@ class kz extends qK { } get length() { const e = this._textModel.getLineCount(), t = this._textModel.getLineLength(e); - return new Ur(e - 1, t); + return new jl(e - 1, t); } } -class Lge extends um { +class bbe extends Zb { constructor(e, t) { - super(), this._onDidChangeVisibility = this._register(new k()), this.onDidChangeVisibility = this._onDidChangeVisibility.event, this._element = Q(e, ce(".monaco-dropdown")), this._label = Q(this._element, ce(".dropdown-label")); + super(), this._onDidChangeVisibility = this._register(new k()), this.onDidChangeVisibility = this._onDidChangeVisibility.event, this._element = O(e, de(".monaco-dropdown")), this._label = O(this._element, de(".dropdown-label")); let i = t.labelRenderer; i || (i = (o) => (o.textContent = t.label || "", null)); - for (const o of [ie.CLICK, ie.MOUSE_DOWN, Rt.Tap]) - this._register(z(this.element, o, (r) => tt.stop(r, !0))); - for (const o of [ie.MOUSE_DOWN, Rt.Tap]) - this._register(z(this._label, o, (r) => { - dE(r) && (r.detail > 1 || r.button !== 0) || (this.visible ? this.hide() : this.show()); + for (const o of [ie.CLICK, ie.MOUSE_DOWN, Jt.Tap]) + this._register(z(this.element, o, (l) => tt.stop(l, !0))); + for (const o of [ie.MOUSE_DOWN, Jt.Tap]) + this._register(z(this._label, o, (l) => { + kv(l) && (l.detail > 1 || l.button !== 0) || (this.visible ? this.hide() : this.show()); })); this._register(z(this._label, ie.KEY_UP, (o) => { - const r = new Vt(o); - (r.equals( + const l = new Yt(o); + (l.equals( 3 /* KeyCode.Enter */ - ) || r.equals( + ) || l.equals( 10 /* KeyCode.Space */ )) && (tt.stop(o, !0), this.visible ? this.hide() : this.show()); })); const n = i(this._label); - n && this._register(n), this._register(Rn.addTarget(this._label)); + n && this._register(n), this._register(En.addTarget(this._label)); } get element() { return this._element; @@ -52873,7 +52873,7 @@ class Lge extends um { super.dispose(), this.hide(), this.boxContainer && (this.boxContainer.remove(), this.boxContainer = void 0), this.contents && (this.contents.remove(), this.contents = void 0), this._label && (this._label.remove(), this._label = void 0); } } -class Age extends Lge { +class pbe extends bbe { constructor(e, t) { super(e, t), this._options = t, this._actions = [], this.actions = t.actions || []; } @@ -52911,16 +52911,16 @@ class Age extends Lge { this.hide(), this.element.classList.remove("active"); } } -class ax extends yl { +class VL extends Xr { constructor(e, t, i, n = /* @__PURE__ */ Object.create(null)) { super(null, e, n), this.actionItem = null, this._onDidChangeVisibility = this._register(new k()), this.onDidChangeVisibility = this._onDidChangeVisibility.event, this.menuActionsOrProvider = t, this.contextMenuProvider = i, this.options = n, this.options.actionRunner && (this.actionRunner = this.options.actionRunner); } render(e) { this.actionItem = e; const t = (o) => { - this.element = Q(o, ce("a.action-label")); - let r = []; - return typeof this.options.classNames == "string" ? r = this.options.classNames.split(/\s+/g).filter((l) => !!l) : this.options.classNames && (r = this.options.classNames), r.find((l) => l === "icon") || r.push("codicon"), this.element.classList.add(...r), this.element.setAttribute("role", "button"), this.element.setAttribute("aria-haspopup", "true"), this.element.setAttribute("aria-expanded", "false"), this._action.label && this._register(Fl().setupManagedHover(this.options.hoverDelegate ?? As("mouse"), this.element, this._action.label)), this.element.ariaLabel = this._action.label || "", null; + this.element = O(o, de("a.action-label")); + let l = []; + return typeof this.options.classNames == "string" ? l = this.options.classNames.split(/\s+/g).filter((r) => !!r) : this.options.classNames && (l = this.options.classNames), l.find((r) => r === "icon") || l.push("codicon"), this.element.classList.add(...l), this.element.setAttribute("role", "button"), this.element.setAttribute("aria-haspopup", "true"), this.element.setAttribute("aria-expanded", "false"), this._action.label && this._register(Kr().setupManagedHover(this.options.hoverDelegate ?? Is("mouse"), this.element, this._action.label)), this.element.ariaLabel = this._action.label || "", null; }, i = Array.isArray(this.menuActionsOrProvider), n = { contextMenuProvider: this.contextMenuProvider, labelRenderer: t, @@ -52929,9 +52929,9 @@ class ax extends yl { actionProvider: i ? void 0 : this.menuActionsOrProvider, skipTelemetry: this.options.skipTelemetry }; - if (this.dropdownMenu = this._register(new Age(e, n)), this._register(this.dropdownMenu.onDidChangeVisibility((o) => { - var r; - (r = this.element) == null || r.setAttribute("aria-expanded", `${o}`), this._onDidChangeVisibility.fire(o); + if (this.dropdownMenu = this._register(new pbe(e, n)), this._register(this.dropdownMenu.onDidChangeVisibility((o) => { + var l; + (l = this.element) == null || l.setAttribute("aria-expanded", `${o}`), this._onDidChangeVisibility.fire(o); })), this.dropdownMenu.menuOptions = { actionViewItemProvider: this.options.actionViewItemProvider, actionRunner: this.actionRunner, @@ -52965,15 +52965,15 @@ class ax extends yl { (t = this.actionItem) == null || t.classList.toggle("disabled", e), (i = this.element) == null || i.classList.toggle("disabled", e); } } -class xge extends R { +class gbe extends J { constructor(e, t, i = { orientation: 0 /* ActionsOrientation.HORIZONTAL */ }) { - super(), this.submenuActionViewItems = [], this.hasSecondaryActions = !1, this._onDidChangeDropdownVisibility = this._register(new M6()), this.onDidChangeDropdownVisibility = this._onDidChangeDropdownVisibility.event, this.disposables = this._register(new U()), i.hoverDelegate = i.hoverDelegate ?? this._register(yb()), this.options = i, this.toggleMenuAction = this._register(new S1(() => { + super(), this.submenuActionViewItems = [], this.hasSecondaryActions = !1, this._onDidChangeDropdownVisibility = this._register(new Zq()), this.onDidChangeDropdownVisibility = this._onDidChangeDropdownVisibility.event, this.disposables = this._register(new _()), i.hoverDelegate = i.hoverDelegate ?? this._register(LZ()), this.options = i, this.toggleMenuAction = this._register(new MW(() => { var n; return (n = this.toggleMenuActionViewItem) == null ? void 0 : n.show(); - }, i.toggleMenuTitle)), this.element = document.createElement("div"), this.element.className = "monaco-toolbar", e.appendChild(this.element), this.actionBar = this._register(new Yo(this.element, { + }, i.toggleMenuTitle)), this.element = document.createElement("div"), this.element.className = "monaco-toolbar", e.appendChild(this.element), this.actionBar = this._register(new Ao(this.element, { orientation: i.orientation, ariaLabel: i.ariaLabel, actionRunner: i.actionRunner, @@ -52981,12 +52981,12 @@ class xge extends R { highlightToggledItems: i.highlightToggledItems, hoverDelegate: i.hoverDelegate, actionViewItemProvider: (n, o) => { - if (n.id === S1.ID) - return this.toggleMenuActionViewItem = new ax(n, n.menuActions, t, { + if (n.id === MW.ID) + return this.toggleMenuActionViewItem = new VL(n, n.menuActions, t, { actionViewItemProvider: this.options.actionViewItemProvider, actionRunner: this.actionRunner, keybindingProvider: this.options.getKeyBinding, - classNames: Ze.asClassNameArray(i.moreIcon ?? te.toolBarMore), + classNames: Se.asClassNameArray(i.moreIcon ?? te.toolBarMore), anchorAlignmentProvider: this.options.anchorAlignmentProvider, menuAsChild: !!this.options.renderDropdownAsChildElement, skipTelemetry: this.options.skipTelemetry, @@ -52994,12 +52994,12 @@ class xge extends R { hoverDelegate: this.options.hoverDelegate }), this.toggleMenuActionViewItem.setActionContext(this.actionBar.context), this.disposables.add(this._onDidChangeDropdownVisibility.add(this.toggleMenuActionViewItem.onDidChangeVisibility)), this.toggleMenuActionViewItem; if (i.actionViewItemProvider) { - const r = i.actionViewItemProvider(n, o); - if (r) - return r; + const l = i.actionViewItemProvider(n, o); + if (l) + return l; } - if (n instanceof ab) { - const r = new ax(n, n.actions, t, { + if (n instanceof bZ) { + const l = new VL(n, n.actions, t, { actionViewItemProvider: this.options.actionViewItemProvider, actionRunner: this.actionRunner, keybindingProvider: this.options.getKeyBinding, @@ -53009,7 +53009,7 @@ class xge extends R { skipTelemetry: this.options.skipTelemetry, hoverDelegate: this.options.hoverDelegate }); - return r.setActionContext(this.actionBar.context), this.submenuActionViewItems.push(r), this.disposables.add(this._onDidChangeDropdownVisibility.add(r.onDidChangeVisibility)), r; + return l.setActionContext(this.actionBar.context), this.submenuActionViewItems.push(l), this.disposables.add(this._onDidChangeDropdownVisibility.add(l.onDidChangeVisibility)), l; } } })); @@ -53045,9 +53045,9 @@ class xge extends R { this.clear(), this.disposables.dispose(), super.dispose(); } } -const SZ = class SZ extends lo { +const v2 = class v2 extends ao { constructor(e, t) { - t = t || p("moreActions", "More Actions..."), super(SZ.ID, t, void 0, !0), this._menuActions = [], this.toggleDropdownMenu = e; + t = t || p("moreActions", "More Actions..."), super(v2.ID, t, void 0, !0), this._menuActions = [], this.toggleDropdownMenu = e; } async run() { this.toggleDropdownMenu(); @@ -53059,9 +53059,9 @@ const SZ = class SZ extends lo { this._menuActions = e; } }; -SZ.ID = "toolbar.toggle.more"; -let S1 = SZ; -function Mge(s, e) { +v2.ID = "toolbar.toggle.more"; +let MW = v2; +function Zbe(s, e) { const t = [], i = []; for (const n of s) e.has(n) || t.push(n); @@ -53069,13 +53069,13 @@ function Mge(s, e) { s.has(n) || i.push(n); return { removed: t, added: i }; } -function Zge(s, e) { +function fbe(s, e) { const t = /* @__PURE__ */ new Set(); for (const i of e) s.has(i) && t.add(i); return t; } -class _I { +class zx { constructor(e, t, i = t) { this.modifierLabels = [null], this.modifierLabels[ 2 @@ -53092,16 +53092,16 @@ class _I { if (t.length === 0) return null; const n = []; - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o], a = i(l); - if (a === null) + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o], c = i(r); + if (c === null) return null; - n[o] = Wge(l, a, this.modifierLabels[e]); + n[o] = Xbe(r, c, this.modifierLabels[e]); } return n.join(" "); } } -const BX = new _I({ +const pH = new zx({ ctrlKey: "⌃", shiftKey: "⇧", altKey: "⌥", @@ -53119,7 +53119,7 @@ const BX = new _I({ altKey: p({ key: "altKey", comment: ["This is the short form for the Alt key on the keyboard"] }, "Alt"), metaKey: p({ key: "superKey", comment: ["This is the short form for the Super key on the keyboard"] }, "Super"), separator: "+" -}), _ge = new _I({ +}), ybe = new zx({ ctrlKey: p({ key: "ctrlKey.long", comment: ["This is the long form for the Control key on the keyboard"] }, "Control"), shiftKey: p({ key: "shiftKey.long", comment: ["This is the long form for the Shift key on the keyboard"] }, "Shift"), altKey: p({ key: "optKey.long", comment: ["This is the long form for the Alt/Option key on the keyboard"] }, "Option"), @@ -53137,7 +53137,7 @@ const BX = new _I({ altKey: p({ key: "altKey.long", comment: ["This is the long form for the Alt key on the keyboard"] }, "Alt"), metaKey: p({ key: "superKey.long", comment: ["This is the long form for the Super key on the keyboard"] }, "Super"), separator: "+" -}), Ige = new _I({ +}), Wbe = new zx({ ctrlKey: "Ctrl", shiftKey: "Shift", altKey: "Alt", @@ -53149,7 +53149,7 @@ const BX = new _I({ altKey: "Alt", metaKey: "Super", separator: "+" -}), Nge = new _I({ +}), Gbe = new zx({ ctrlKey: "ctrl", shiftKey: "shift", altKey: "alt", @@ -53168,26 +53168,26 @@ const BX = new _I({ metaKey: "meta", separator: "+" }); -function Wge(s, e, t) { +function Xbe(s, e, t) { if (e === null) return ""; const i = []; return s.ctrlKey && i.push(t.ctrlKey), s.shiftKey && i.push(t.shiftKey), s.altKey && i.push(t.altKey), s.metaKey && i.push(t.metaKey), e !== "" && i.push(e), i.join(t.separator); } -function vge(s) { +function Vbe(s) { return s ? s.condition !== void 0 : !1; } -var kf; +var Fg; (function(s) { s[s.STORAGE_DOES_NOT_EXIST = 0] = "STORAGE_DOES_NOT_EXIST", s[s.STORAGE_IN_MEMORY = 1] = "STORAGE_IN_MEMORY"; -})(kf || (kf = {})); -var Bp; +})(Fg || (Fg = {})); +var Op; (function(s) { s[s.None = 0] = "None", s[s.Initialized = 1] = "Initialized", s[s.Closed = 2] = "Closed"; -})(Bp || (Bp = {})); -const LZ = class LZ extends R { +})(Op || (Op = {})); +const J2 = class J2 extends J { constructor(e, t = /* @__PURE__ */ Object.create(null)) { - super(), this.database = e, this.options = t, this._onDidChangeStorage = this._register(new cm()), this.onDidChangeStorage = this._onDidChangeStorage.event, this.state = Bp.None, this.cache = /* @__PURE__ */ new Map(), this.flushDelayer = this._register(new MH(LZ.DEFAULT_FLUSH_DELAY)), this.pendingDeletes = /* @__PURE__ */ new Set(), this.pendingInserts = /* @__PURE__ */ new Map(), this.whenFlushedCallbacks = [], this.registerListeners(); + super(), this.database = e, this.options = t, this._onDidChangeStorage = this._register(new bb()), this.onDidChangeStorage = this._onDidChangeStorage.event, this.state = Op.None, this.cache = /* @__PURE__ */ new Map(), this.flushDelayer = this._register(new rB(J2.DEFAULT_FLUSH_DELAY)), this.pendingDeletes = /* @__PURE__ */ new Set(), this.pendingInserts = /* @__PURE__ */ new Map(), this.whenFlushedCallbacks = [], this.registerListeners(); } registerListeners() { this._register(this.database.onDidChangeItemsExternal((e) => this.onDidChangeItemsExternal(e))); @@ -53202,34 +53202,34 @@ const LZ = class LZ extends R { } } acceptExternal(e, t) { - if (this.state === Bp.Closed) + if (this.state === Op.Closed) return; let i = !1; - Do(t) ? i = this.cache.delete(e) : this.cache.get(e) !== t && (this.cache.set(e, t), i = !0), i && this._onDidChangeStorage.fire({ key: e, external: !0 }); + ko(t) ? i = this.cache.delete(e) : this.cache.get(e) !== t && (this.cache.set(e, t), i = !0), i && this._onDidChangeStorage.fire({ key: e, external: !0 }); } get(e, t) { const i = this.cache.get(e); - return Do(i) ? t : i; + return ko(i) ? t : i; } getBoolean(e, t) { const i = this.get(e); - return Do(i) ? t : i === "true"; + return ko(i) ? t : i === "true"; } getNumber(e, t) { const i = this.get(e); - return Do(i) ? t : parseInt(i, 10); + return ko(i) ? t : parseInt(i, 10); } async set(e, t, i = !1) { - if (this.state === Bp.Closed) + if (this.state === Op.Closed) return; - if (Do(t)) + if (ko(t)) return this.delete(e, i); - const n = tn(t) || Array.isArray(t) ? ghe(t) : String(t); + const n = nn(t) || Array.isArray(t) ? oue(t) : String(t); if (this.cache.get(e) !== n) return this.cache.set(e, n), this.pendingInserts.set(e, n), this.pendingDeletes.delete(e), this._onDidChangeStorage.fire({ key: e, external: i }), this.doFlush(); } async delete(e, t = !1) { - if (!(this.state === Bp.Closed || !this.cache.delete(e))) + if (!(this.state === Op.Closed || !this.cache.delete(e))) return this.pendingDeletes.has(e) || this.pendingDeletes.add(e), this.pendingInserts.delete(e), this._onDidChangeStorage.fire({ key: e, external: t }), this.doFlush(); } get hasPending() { @@ -53247,12 +53247,12 @@ const LZ = class LZ extends R { }); } async doFlush(e) { - return this.options.hint === kf.STORAGE_IN_MEMORY ? this.flushPending() : this.flushDelayer.trigger(() => this.flushPending(), e); + return this.options.hint === Fg.STORAGE_IN_MEMORY ? this.flushPending() : this.flushDelayer.trigger(() => this.flushPending(), e); } }; -LZ.DEFAULT_FLUSH_DELAY = 100; -let Hy = LZ; -class fW { +J2.DEFAULT_FLUSH_DELAY = 100; +let ny = J2; +class TR { constructor() { this.onDidChangeItemsExternal = se.None, this.items = /* @__PURE__ */ new Map(); } @@ -53261,13 +53261,13 @@ class fW { (t = e.insert) == null || t.forEach((n, o) => this.items.set(o, n)), (i = e.delete) == null || i.forEach((n) => this.items.delete(n)); } } -const ZL = "__$__targetStorageMarker", za = $e("storageService"); -var cx; +const FX = "__$__targetStorageMarker", Pc = $e("storageService"); +var LL; (function(s) { s[s.NONE = 0] = "NONE", s[s.SHUTDOWN = 1] = "SHUTDOWN"; -})(cx || (cx = {})); -function Tge(s) { - const e = s.get(ZL); +})(LL || (LL = {})); +function Lbe(s) { + const e = s.get(FX); if (e) try { return JSON.parse(e); @@ -53275,17 +53275,17 @@ function Tge(s) { } return /* @__PURE__ */ Object.create(null); } -const AZ = class AZ extends R { +const H2 = class H2 extends J { // every minute - constructor(e = { flushInterval: AZ.DEFAULT_FLUSH_INTERVAL }) { - super(), this.options = e, this._onDidChangeValue = this._register(new cm()), this._onDidChangeTarget = this._register(new cm()), this._onWillSaveState = this._register(new k()), this.onWillSaveState = this._onWillSaveState.event, this._workspaceKeyTargets = void 0, this._profileKeyTargets = void 0, this._applicationKeyTargets = void 0; + constructor(e = { flushInterval: H2.DEFAULT_FLUSH_INTERVAL }) { + super(), this.options = e, this._onDidChangeValue = this._register(new bb()), this._onDidChangeTarget = this._register(new bb()), this._onWillSaveState = this._register(new k()), this.onWillSaveState = this._onWillSaveState.event, this._workspaceKeyTargets = void 0, this._profileKeyTargets = void 0, this._applicationKeyTargets = void 0; } onDidChangeValue(e, t, i) { return se.filter(this._onDidChangeValue.event, (n) => n.scope === e && (t === void 0 || n.key === t), i); } emitDidChangeValue(e, t) { const { key: i, external: n } = t; - if (i === ZL) { + if (i === FX) { switch (e) { case -1: this._applicationKeyTargets = void 0; @@ -53314,13 +53314,13 @@ const AZ = class AZ extends R { return (n = this.getStorage(t)) == null ? void 0 : n.getNumber(e, i); } store(e, t, i, n, o = !1) { - if (Do(t)) { + if (ko(t)) { this.remove(e, i, o); return; } this.withPausedEmitters(() => { - var r; - this.updateKeyTarget(e, i, n), (r = this.getStorage(i)) == null || r.set(e, t, o); + var l; + this.updateKeyTarget(e, i, n), (l = this.getStorage(i)) == null || l.set(e, t, o); }); } remove(e, t, i = !1) { @@ -53338,9 +53338,9 @@ const AZ = class AZ extends R { } } updateKeyTarget(e, t, i, n = !1) { - var r, l; + var l, r; const o = this.getKeyTargets(t); - typeof i == "number" ? o[e] !== i && (o[e] = i, (r = this.getStorage(t)) == null || r.set(ZL, JSON.stringify(o), n)) : typeof o[e] == "number" && (delete o[e], (l = this.getStorage(t)) == null || l.set(ZL, JSON.stringify(o), n)); + typeof i == "number" ? o[e] !== i && (o[e] = i, (l = this.getStorage(t)) == null || l.set(FX, JSON.stringify(o), n)) : typeof o[e] == "number" && (delete o[e], (r = this.getStorage(t)) == null || r.set(FX, JSON.stringify(o), n)); } get workspaceKeyTargets() { return this._workspaceKeyTargets || (this._workspaceKeyTargets = this.loadKeyTargets( @@ -53372,14 +53372,14 @@ const AZ = class AZ extends R { } loadKeyTargets(e) { const t = this.getStorage(e); - return t ? Tge(t) : /* @__PURE__ */ Object.create(null); + return t ? Lbe(t) : /* @__PURE__ */ Object.create(null); } }; -AZ.DEFAULT_FLUSH_INTERVAL = 60 * 1e3; -let gT = AZ; -class Dge extends gT { +H2.DEFAULT_FLUSH_INTERVAL = 60 * 1e3; +let YT = H2; +class Ibe extends YT { constructor() { - super(), this.applicationStorage = this._register(new Hy(new fW(), { hint: kf.STORAGE_IN_MEMORY })), this.profileStorage = this._register(new Hy(new fW(), { hint: kf.STORAGE_IN_MEMORY })), this.workspaceStorage = this._register(new Hy(new fW(), { hint: kf.STORAGE_IN_MEMORY })), this._register(this.workspaceStorage.onDidChangeStorage((e) => this.emitDidChangeValue(1, e))), this._register(this.profileStorage.onDidChangeStorage((e) => this.emitDidChangeValue(0, e))), this._register(this.applicationStorage.onDidChangeStorage((e) => this.emitDidChangeValue(-1, e))); + super(), this.applicationStorage = this._register(new ny(new TR(), { hint: Fg.STORAGE_IN_MEMORY })), this.profileStorage = this._register(new ny(new TR(), { hint: Fg.STORAGE_IN_MEMORY })), this.workspaceStorage = this._register(new ny(new TR(), { hint: Fg.STORAGE_IN_MEMORY })), this._register(this.workspaceStorage.onDidChangeStorage((e) => this.emitDidChangeValue(1, e))), this._register(this.profileStorage.onDidChangeStorage((e) => this.emitDidChangeValue(0, e))), this._register(this.applicationStorage.onDidChangeStorage((e) => this.emitDidChangeValue(-1, e))); } getStorage(e) { switch (e) { @@ -53392,114 +53392,114 @@ class Dge extends gT { } } } -function Vge(s, e) { +function Sbe(s, e) { const t = { ...e }; for (const i in s) { const n = s[i]; - t[i] = n !== void 0 ? de(n) : void 0; + t[i] = n !== void 0 ? ae(n) : void 0; } return t; } -const kge = { - keybindingLabelBackground: de(Gne), - keybindingLabelForeground: de(Rne), - keybindingLabelBorder: de(Ene), - keybindingLabelBottomBorder: de(Xne), - keybindingLabelShadow: de(s0) -}, Gge = { - buttonForeground: de(rU), - buttonSeparator: de(Lne), - buttonBackground: de(oy), - buttonHoverBackground: de(Ane), - buttonSecondaryForeground: de(Mne), - buttonSecondaryBackground: de(rv), - buttonSecondaryHoverBackground: de(Zne), - buttonBorder: de(xne) -}, Rge = { - progressBarBackground: de(Gie) -}, dx = { - inputActiveOptionBorder: de(oI), - inputActiveOptionForeground: de(rI), - inputActiveOptionBackground: de(bC) +const xbe = { + keybindingLabelBackground: ae(Cse), + keybindingLabelForeground: ae(Rse), + keybindingLabelBorder: ae(Nse), + keybindingLabelBottomBorder: ae(wse), + keybindingLabelShadow: ae(a0) +}, Cbe = { + buttonForeground: ae(z_), + buttonSeparator: ae(bse), + buttonBackground: ae(pf), + buttonHoverBackground: ae(pse), + buttonSecondaryForeground: ae(Zse), + buttonSecondaryBackground: ae(xw), + buttonSecondaryHoverBackground: ae(fse), + buttonBorder: ae(gse) +}, Rbe = { + progressBarBackground: ae(Cne) +}, IL = { + inputActiveOptionBorder: ae(Wx), + inputActiveOptionForeground: ae(Gx), + inputActiveOptionBackground: ae(NG) }; -de(ry), de(_ne), de(Ine), de(Nne), de(Wne), de(vne), de(Tne); -de(Dne), de(kne), de(Vne); -de(Xo), de(iI), de(s0), de(rt), de(nne), de(sne), de(one), de(Vie); -const hx = { - inputBackground: de(ov), - inputForeground: de(sU), - inputBorder: de(oU), - inputValidationInfoBorder: de(mne), - inputValidationInfoBackground: de(une), - inputValidationInfoForeground: de(gne), - inputValidationWarningBorder: de(bne), - inputValidationWarningBackground: de(pne), - inputValidationWarningForeground: de(fne), - inputValidationErrorBorder: de(Cne), - inputValidationErrorBackground: de(yne), - inputValidationErrorForeground: de(wne) -}, Ege = { - listFilterWidgetBackground: de(qne), - listFilterWidgetOutline: de($ne), - listFilterWidgetNoMatchesOutline: de(ese), - listFilterWidgetShadow: de(tse), - inputBoxStyles: hx, - toggleStyles: dx -}, u4 = { - badgeBackground: de(wL), - badgeForeground: de(kie), - badgeBorder: de(rt) +ae(gf), ae(yse), ae(Wse), ae(Gse), ae(Xse), ae(Vse), ae(Lse); +ae(Ise), ae(xse), ae(Sse); +ae(Fo), ae(Zx), ae(a0), ae(lt), ae(Qne), ae(One), ae(jne), ae(Sne); +const SL = { + inputBackground: ae(Sw), + inputForeground: ae(D_), + inputBorder: ae(F_), + inputValidationInfoBorder: ae(lse), + inputValidationInfoBackground: ae(sse), + inputValidationInfoForeground: ae(ose), + inputValidationWarningBorder: ae(dse), + inputValidationWarningBackground: ae(rse), + inputValidationWarningForeground: ae(cse), + inputValidationErrorBorder: ae(use), + inputValidationErrorBackground: ae(ase), + inputValidationErrorForeground: ae(hse) +}, Nbe = { + listFilterWidgetBackground: ae(Kse), + listFilterWidgetOutline: ae(Use), + listFilterWidgetNoMatchesOutline: ae(Pse), + listFilterWidgetShadow: ae(Bse), + inputBoxStyles: SL, + toggleStyles: IL +}, _O = { + badgeBackground: ae(YX), + badgeForeground: ae(xne), + badgeBorder: ae(lt) }; -de(tne), de(ene), de(GF), de(GF), de(ine); -const Ym = { +ae(Bne), ae(Pne), ae(rF), ae(rF), ae(_ne); +const Pb = { listBackground: void 0, listInactiveFocusForeground: void 0, - listFocusBackground: de(Fne), - listFocusForeground: de(Yne), - listFocusOutline: de(zne), - listActiveSelectionBackground: de(pm), - listActiveSelectionForeground: de(Hw), - listActiveSelectionIconForeground: de(lU), - listFocusAndSelectionOutline: de(Pne), - listFocusAndSelectionBackground: de(pm), - listFocusAndSelectionForeground: de(Hw), - listInactiveSelectionBackground: de(Bne), - listInactiveSelectionIconForeground: de(Hne), - listInactiveSelectionForeground: de(One), - listInactiveFocusBackground: de(Jne), - listInactiveFocusOutline: de(Une), - listHoverBackground: de(aU), - listHoverForeground: de(cU), - listDropOverBackground: de(Kne), - listDropBetweenBackground: de(Qne), - listSelectionOutline: de(Ut), - listHoverOutline: de(Ut), - treeIndentGuidesStroke: de(dU), - treeInactiveIndentGuidesStroke: de(ise), + listFocusBackground: ae(Tse), + listFocusForeground: ae(Mse), + listFocusOutline: ae(Yse), + listActiveSelectionBackground: ae(Wb), + listActiveSelectionForeground: ae(sW), + listActiveSelectionIconForeground: ae(A_), + listFocusAndSelectionOutline: ae(kse), + listFocusAndSelectionBackground: ae(Wb), + listFocusAndSelectionForeground: ae(sW), + listInactiveSelectionBackground: ae(vse), + listInactiveSelectionIconForeground: ae(Hse), + listInactiveSelectionForeground: ae(Jse), + listInactiveFocusBackground: ae(Ese), + listInactiveFocusOutline: ae(Dse), + listHoverBackground: ae(K_), + listHoverForeground: ae(U_), + listDropOverBackground: ae(Fse), + listDropBetweenBackground: ae(zse), + listSelectionOutline: ae(_t), + listHoverOutline: ae(_t), + treeIndentGuidesStroke: ae(P_), + treeInactiveIndentGuidesStroke: ae(_se), treeStickyScrollBackground: void 0, treeStickyScrollBorder: void 0, - treeStickyScrollShadow: de(VE), - tableColumnsBorder: de(nse), - tableOddRowsBackgroundColor: de(sse) + treeStickyScrollShadow: ae(oJ), + tableColumnsBorder: ae(Qse), + tableOddRowsBackgroundColor: ae(Ose) }; -function zm(s) { - return Vge(s, Ym); -} -const Xge = { - selectBackground: de(lI), - selectListBackground: de(Sne), - selectForeground: de(FE), - decoratorRightForeground: de(hU), - selectBorder: de(YE), - focusBorder: de(Ta), - listFocusBackground: de(Uw), - listInactiveSelectionIconForeground: de(zE), - listFocusForeground: de(Jw), - listFocusOutline: Iie(Ut, K.transparent.toString()), - listHoverBackground: de(aU), - listHoverForeground: de(cU), - listHoverOutline: de(Ut), - selectListBorder: de(kE), +function Bb(s) { + return Sbe(s, Pb); +} +const wbe = { + selectBackground: ae(Xx), + selectListBackground: ae(mse), + selectForeground: ae(hJ), + decoratorRightForeground: ae(B_), + selectBorder: ae(uJ), + focusBorder: ae(vc), + listFocusBackground: ae(lW), + listInactiveSelectionIconForeground: ae(mJ), + listFocusForeground: ae(oW), + listFocusOutline: Wne(_t, Q.transparent.toString()), + listHoverBackground: ae(K_), + listHoverForeground: ae(U_), + listHoverOutline: ae(_t), + selectListBorder: ae(lJ), listBackground: void 0, listActiveSelectionBackground: void 0, listActiveSelectionForeground: void 0, @@ -53522,72 +53522,72 @@ const Xge = { treeStickyScrollBackground: void 0, treeStickyScrollBorder: void 0, treeStickyScrollShadow: void 0 -}, Fge = { - shadowColor: de(s0), - borderColor: de(ose), - foregroundColor: de(rse), - backgroundColor: de(lse), - selectionForegroundColor: de(ase), - selectionBackgroundColor: de(cse), - selectionBorderColor: de(dse), - separatorColor: de(hse), - scrollbarShadow: de(VE), - scrollbarSliderBackground: de(QJ), - scrollbarSliderHoverBackground: de(jJ), - scrollbarSliderActiveBackground: de(qJ) +}, Tbe = { + shadowColor: ae(a0), + borderColor: ae(jse), + foregroundColor: ae(qse), + backgroundColor: ae($se), + selectionForegroundColor: ae(eoe), + selectionBackgroundColor: ae(toe), + selectionBorderColor: ae(ioe), + separatorColor: ae(noe), + scrollbarShadow: ae(oJ), + scrollbarSliderBackground: ae(T_), + scrollbarSliderHoverBackground: ae(M_), + scrollbarSliderActiveBackground: ae(Y_) }; -var II = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Ax = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Ts = function(s, e) { +}, Ys = function(s, e) { return function(t, i) { e(t, i, s); }; }; -function Yge(s, e, t, i) { - let n, o, r; +function Mbe(s, e, t, i) { + let n, o, l; if (Array.isArray(s)) - r = s, n = e, o = t; + l = s, n = e, o = t; else { - const c = e; - r = s.getActions(c), n = t, o = i; + const d = e; + l = s.getActions(d), n = t, o = i; } - const l = Ac.getInstance(), a = l.keyStatus.altKey || (kn || fs) && l.keyStatus.shiftKey; - g4(r, n, a, o ? (c) => c === o : (c) => c === "navigation"); + const r = xd.getInstance(), c = r.keyStatus.altKey || (Jn || fs) && r.keyStatus.shiftKey; + QO(l, n, c, o ? (d) => d === o : (d) => d === "navigation"); } -function NI(s, e, t, i, n, o) { - let r, l, a, c, d; +function Kx(s, e, t, i, n, o) { + let l, r, c, d, a; if (Array.isArray(s)) - d = s, r = e, l = t, a = i, c = n; + a = s, l = e, r = t, c = i, d = n; else { const u = e; - d = s.getActions(u), r = t, l = i, a = n, c = o; + a = s.getActions(u), l = t, r = i, c = n, d = o; } - g4(d, r, !1, typeof l == "string" ? (u) => u === l : l, a, c); + QO(a, l, !1, typeof r == "string" ? (u) => u === r : r, c, d); } -function g4(s, e, t, i = (r) => r === "navigation", n = () => !1, o = !1) { - let r, l; - Array.isArray(e) ? (r = e, l = e) : (r = e.primary, l = e.secondary); - const a = /* @__PURE__ */ new Set(); - for (const [c, d] of s) { +function QO(s, e, t, i = (l) => l === "navigation", n = () => !1, o = !1) { + let l, r; + Array.isArray(e) ? (l = e, r = e) : (l = e.primary, r = e.secondary); + const c = /* @__PURE__ */ new Set(); + for (const [d, a] of s) { let h; - i(c) ? (h = r, h.length > 0 && o && h.push(new Qi())) : (h = l, h.length > 0 && h.push(new Qi())); - for (let u of d) { - t && (u = u instanceof ao && u.alt ? u.alt : u); - const g = h.push(u); - u instanceof ab && a.add({ group: c, action: u, index: g - 1 }); + i(d) ? (h = l, h.length > 0 && o && h.push(new ji())) : (h = r, h.length > 0 && h.push(new ji())); + for (let u of a) { + t && (u = u instanceof ho && u.alt ? u.alt : u); + const m = h.push(u); + u instanceof bZ && c.add({ group: d, action: u, index: m - 1 }); } } - for (const { group: c, action: d, index: h } of a) { - const u = i(c) ? r : l, g = d.actions; - n(d, c, u.length) && u.splice(h, 1, ...g); + for (const { group: d, action: a, index: h } of c) { + const u = i(d) ? l : r, m = a.actions; + n(a, d, u.length) && u.splice(h, 1, ...m); } } -let Xh = class extends Sb { - constructor(e, t, i, n, o, r, l, a) { - super(void 0, e, { icon: !!(e.class || e.item.icon), label: !e.class && !e.item.icon, draggable: t == null ? void 0 : t.draggable, keybinding: t == null ? void 0 : t.keybinding, hoverDelegate: t == null ? void 0 : t.hoverDelegate }), this._options = t, this._keybindingService = i, this._notificationService = n, this._contextKeyService = o, this._themeService = r, this._contextMenuService = l, this._accessibilityService = a, this._wantsAltCommand = !1, this._itemClassDispose = this._register(new fn()), this._altKey = Ac.getInstance(); +let Ah = class extends xZ { + constructor(e, t, i, n, o, l, r, c) { + super(void 0, e, { icon: !!(e.class || e.item.icon), label: !e.class && !e.item.icon, draggable: t == null ? void 0 : t.draggable, keybinding: t == null ? void 0 : t.keybinding, hoverDelegate: t == null ? void 0 : t.hoverDelegate }), this._options = t, this._keybindingService = i, this._notificationService = n, this._contextKeyService = o, this._themeService = l, this._contextMenuService = r, this._accessibilityService = c, this._wantsAltCommand = !1, this._itemClassDispose = this._register(new Zn()), this._altKey = xd.getInstance(); } get _menuItemAction() { return this._action; @@ -53626,9 +53626,9 @@ let Xh = class extends Sb { const e = this._keybindingService.lookupKeybinding(this._commandAction.id, this._contextKeyService), t = e && e.getLabel(), i = this._commandAction.tooltip || this._commandAction.label; let n = t ? p("titleAndKb", "{0} ({1})", i, t) : i; if (!this._wantsAltCommand && ((o = this._menuItemAction.alt) != null && o.enabled)) { - const r = this._menuItemAction.alt.tooltip || this._menuItemAction.alt.label, l = this._keybindingService.lookupKeybinding(this._menuItemAction.alt.id, this._contextKeyService), a = l && l.getLabel(), c = a ? p("titleAndKb", "{0} ({1})", r, a) : r; + const l = this._menuItemAction.alt.tooltip || this._menuItemAction.alt.label, r = this._keybindingService.lookupKeybinding(this._menuItemAction.alt.id, this._contextKeyService), c = r && r.getLabel(), d = c ? p("titleAndKb", "{0} ({1})", l, c) : l; n = p("titleAndKbAndAlt", `{0} -[{1}] {2}`, n, BX.modifierLabels[ro].altKey, c); +[{1}] {2}`, n, pH.modifierLabels[co].altKey, d); } return n; } @@ -53640,30 +53640,30 @@ let Xh = class extends Sb { const { element: t, label: i } = this; if (!t || !i) return; - const n = this._commandAction.checked && vge(e.toggled) && e.toggled.icon ? e.toggled.icon : e.icon; + const n = this._commandAction.checked && Vbe(e.toggled) && e.toggled.icon ? e.toggled.icon : e.icon; if (n) - if (Ze.isThemeIcon(n)) { - const o = Ze.asClassNameArray(n); - i.classList.add(...o), this._itemClassDispose.value = Ce(() => { + if (Se.isThemeIcon(n)) { + const o = Se.asClassNameArray(n); + i.classList.add(...o), this._itemClassDispose.value = We(() => { i.classList.remove(...o); }); } else - i.style.backgroundImage = hI(this._themeService.getColorTheme().type) ? Pc(n.dark) : Pc(n.light), i.classList.add("icon"), this._itemClassDispose.value = Yr(Ce(() => { + i.style.backgroundImage = Sx(this._themeService.getColorTheme().type) ? Bd(n.dark) : Bd(n.light), i.classList.add("icon"), this._itemClassDispose.value = Kl(We(() => { i.style.backgroundImage = "", i.classList.remove("icon"); }), this._themeService.onDidColorThemeChange(() => { this.updateClass(); })); } }; -Xh = II([ - Ts(2, xt), - Ts(3, Vi), - Ts(4, _e), - Ts(5, Pi), - Ts(6, Co), - Ts(7, yo) -], Xh); -class OX extends Xh { +Ah = Ax([ + Ys(2, Lt), + Ys(3, vi), + Ys(4, xe), + Ys(5, Ki), + Ys(6, Xo), + Ys(7, Wo) +], Ah); +class gH extends Ah { render(e) { var t; this.options.label = !0, this.options.icon = !1, super.render(e), e.classList.add("text-only"), e.classList.toggle("use-comma", ((t = this._options) == null ? void 0 : t.useComma) ?? !1); @@ -53674,7 +53674,7 @@ class OX extends Xh { if (!e) return super.updateLabel(); if (this.label) { - const i = OX._symbolPrintEnter(e); + const i = gH._symbolPrintEnter(e); (t = this._options) != null && t.conversational ? this.label.textContent = p({ key: "content2", comment: ['A label with keybindg like "ESC to dismiss"'] }, "{1} to {0}", this._action.label, i) : this.label.textContent = p({ key: "content", comment: ["A label", "A keybinding"] }, "{0} ({1})", this._action.label, i); } } @@ -53683,23 +53683,23 @@ class OX extends Xh { return (t = e.getLabel()) == null ? void 0 : t.replace(/\benter\b/gi, "⏎").replace(/\bEscape\b/gi, "Esc"); } } -let mT = class extends ax { +let kT = class extends VL { constructor(e, t, i, n, o) { - const r = { + const l = { ...t, menuAsChild: (t == null ? void 0 : t.menuAsChild) ?? !1, - classNames: (t == null ? void 0 : t.classNames) ?? (Ze.isThemeIcon(e.item.icon) ? Ze.asClassName(e.item.icon) : void 0), - keybindingProvider: (t == null ? void 0 : t.keybindingProvider) ?? ((l) => i.lookupKeybinding(l.id)) + classNames: (t == null ? void 0 : t.classNames) ?? (Se.isThemeIcon(e.item.icon) ? Se.asClassName(e.item.icon) : void 0), + keybindingProvider: (t == null ? void 0 : t.keybindingProvider) ?? ((r) => i.lookupKeybinding(r.id)) }; - super(e, { getActions: () => e.actions }, n, r), this._keybindingService = i, this._contextMenuService = n, this._themeService = o; + super(e, { getActions: () => e.actions }, n, l), this._keybindingService = i, this._contextMenuService = n, this._themeService = o; } render(e) { super.render(e), ht(this.element), e.classList.add("menu-entry"); const t = this._action, { icon: i } = t.item; - if (i && !Ze.isThemeIcon(i)) { + if (i && !Se.isThemeIcon(i)) { this.element.classList.add("icon"); const n = () => { - this.element && (this.element.style.backgroundImage = hI(this._themeService.getColorTheme().type) ? Pc(i.dark) : Pc(i.light)); + this.element && (this.element.style.backgroundImage = Sx(this._themeService.getColorTheme().type) ? Bd(i.dark) : Bd(i.light)); }; n(), this._register(this._themeService.onDidColorThemeChange(() => { n(); @@ -53707,30 +53707,30 @@ let mT = class extends ax { } } }; -mT = II([ - Ts(2, xt), - Ts(3, Co), - Ts(4, Pi) -], mT); -let pT = class extends yl { - constructor(e, t, i, n, o, r, l, a) { - super(null, e), this._keybindingService = i, this._notificationService = n, this._contextMenuService = o, this._menuService = r, this._instaService = l, this._storageService = a, this._container = null, this._options = t, this._storageKey = `${e.item.submenu.id}_lastActionId`; - let c; - const d = t != null && t.persistLastActionId ? a.get( +kT = Ax([ + Ys(2, Lt), + Ys(3, Xo), + Ys(4, Ki) +], kT); +let vT = class extends Xr { + constructor(e, t, i, n, o, l, r, c) { + super(null, e), this._keybindingService = i, this._notificationService = n, this._contextMenuService = o, this._menuService = l, this._instaService = r, this._storageService = c, this._container = null, this._options = t, this._storageKey = `${e.item.submenu.id}_lastActionId`; + let d; + const a = t != null && t.persistLastActionId ? c.get( this._storageKey, 1 /* StorageScope.WORKSPACE */ ) : void 0; - d && (c = e.actions.find((u) => d === u.id)), c || (c = e.actions[0]), this._defaultAction = this._instaService.createInstance(Xh, c, { keybinding: this._getDefaultActionKeybindingLabel(c) }); + a && (d = e.actions.find((u) => a === u.id)), d || (d = e.actions[0]), this._defaultAction = this._instaService.createInstance(Ah, d, { keybinding: this._getDefaultActionKeybindingLabel(d) }); const h = { keybindingProvider: (u) => this._keybindingService.lookupKeybinding(u.id), ...t, menuAsChild: (t == null ? void 0 : t.menuAsChild) ?? !0, classNames: (t == null ? void 0 : t.classNames) ?? ["codicon", "codicon-chevron-down"], - actionRunner: (t == null ? void 0 : t.actionRunner) ?? new um() + actionRunner: (t == null ? void 0 : t.actionRunner) ?? new Zb() }; - this._dropdown = new ax(e, e.actions, this._contextMenuService, h), this._register(this._dropdown.actionRunner.onDidRun((u) => { - u.action instanceof ao && this.update(u.action); + this._dropdown = new VL(e, e.actions, this._contextMenuService, h), this._register(this._dropdown.actionRunner.onDidRun((u) => { + u.action instanceof ho && this.update(u.action); })); } update(e) { @@ -53741,11 +53741,11 @@ let pT = class extends yl { 1, 1 /* StorageTarget.MACHINE */ - ), this._defaultAction.dispose(), this._defaultAction = this._instaService.createInstance(Xh, e, { keybinding: this._getDefaultActionKeybindingLabel(e) }), this._defaultAction.actionRunner = new class extends um { + ), this._defaultAction.dispose(), this._defaultAction = this._instaService.createInstance(Ah, e, { keybinding: this._getDefaultActionKeybindingLabel(e) }), this._defaultAction.actionRunner = new class extends Zb { async runAction(i, n) { await i.run(void 0); } - }(), this._container && this._defaultAction.render(hE(this._container, ce(".action-container"))); + }(), this._container && this._defaultAction.render(vv(this._container, de(".action-container"))); } _getDefaultActionKeybindingLabel(e) { var i; @@ -53761,22 +53761,22 @@ let pT = class extends yl { } render(e) { this._container = e, super.render(this._container), this._container.classList.add("monaco-dropdown-with-default"); - const t = ce(".action-container"); - this._defaultAction.render(Q(this._container, t)), this._register(z(t, ie.KEY_DOWN, (n) => { - const o = new Vt(n); + const t = de(".action-container"); + this._defaultAction.render(O(this._container, t)), this._register(z(t, ie.KEY_DOWN, (n) => { + const o = new Yt(n); o.equals( 17 /* KeyCode.RightArrow */ ) && (this._defaultAction.element.tabIndex = -1, this._dropdown.focus(), o.stopPropagation()); })); - const i = ce(".dropdown-action-container"); - this._dropdown.render(Q(this._container, i)), this._register(z(i, ie.KEY_DOWN, (n) => { - var r; - const o = new Vt(n); + const i = de(".dropdown-action-container"); + this._dropdown.render(O(this._container, i)), this._register(z(i, ie.KEY_DOWN, (n) => { + var l; + const o = new Yt(n); o.equals( 15 /* KeyCode.LeftArrow */ - ) && (this._defaultAction.element.tabIndex = 0, this._dropdown.setFocusable(!1), (r = this._defaultAction.element) == null || r.focus(), o.stopPropagation()); + ) && (this._defaultAction.element.tabIndex = 0, this._dropdown.setFocusable(!1), (l = this._defaultAction.element) == null || l.focus(), o.stopPropagation()); })); } focus(e) { @@ -53792,79 +53792,79 @@ let pT = class extends yl { this._defaultAction.dispose(), this._dropdown.dispose(), super.dispose(); } }; -pT = II([ - Ts(2, xt), - Ts(3, Vi), - Ts(4, Co), - Ts(5, Uo), - Ts(6, Se), - Ts(7, za) -], pT); -let fT = class extends gue { +vT = Ax([ + Ys(2, Lt), + Ys(3, vi), + Ys(4, Xo), + Ys(5, Oo), + Ys(6, Ge), + Ys(7, Pc) +], vT); +let JT = class extends ome { constructor(e, t) { super(null, e, e.actions.map((i) => ({ - text: i.id === Qi.ID ? "─────────" : i.label, + text: i.id === ji.ID ? "─────────" : i.label, isDisabled: !i.enabled - })), 0, t, Xge, { ariaLabel: e.tooltip, optionsAsChildren: !0 }), this.select(Math.max(0, e.actions.findIndex((i) => i.checked))); + })), 0, t, wbe, { ariaLabel: e.tooltip, optionsAsChildren: !0 }), this.select(Math.max(0, e.actions.findIndex((i) => i.checked))); } render(e) { - super.render(e), e.style.borderColor = de(YE); + super.render(e), e.style.borderColor = ae(uJ); } runAction(e, t) { const i = this.action.actions[t]; i && this.actionRunner.run(i); } }; -fT = II([ - Ts(1, rd) -], fT); -function m4(s, e, t) { - return e instanceof ao ? s.createInstance(Xh, e, t) : e instanceof Sf ? e.item.isSelection ? s.createInstance(fT, e) : e.item.rememberDefaultAction ? s.createInstance(pT, e, { ...t, persistLastActionId: !0 }) : s.createInstance(mT, e, t) : void 0; -} -var WI = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +JT = Ax([ + Ys(1, aa) +], JT); +function OO(s, e, t) { + return e instanceof ho ? s.createInstance(Ah, e, t) : e instanceof xg ? e.item.isSelection ? s.createInstance(JT, e) : e.item.rememberDefaultAction ? s.createInstance(vT, e, { ...t, persistLastActionId: !0 }) : s.createInstance(kT, e, t) : void 0; +} +var Ux = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, _a = function(s, e) { +}, wc = function(s, e) { return function(t, i) { e(t, i, s); }; -}, xp, gy; -let bT = class { +}, Np, Vf; +let HT = class { constructor(e, t, i) { - this._commandService = e, this._keybindingService = t, this._hiddenStates = new yT(i); + this._commandService = e, this._keybindingService = t, this._hiddenStates = new ET(i); } createMenu(e, t, i) { - return new ux(e, this._hiddenStates, { emitEventsForSubmenuChanges: !1, eventDebounceDelay: 50, ...i }, this._commandService, this._keybindingService, t); + return new xL(e, this._hiddenStates, { emitEventsForSubmenuChanges: !1, eventDebounceDelay: 50, ...i }, this._commandService, this._keybindingService, t); } getMenuActions(e, t, i) { - const n = new ux(e, this._hiddenStates, { emitEventsForSubmenuChanges: !1, eventDebounceDelay: 50, ...i }, this._commandService, this._keybindingService, t), o = n.getActions(i); + const n = new xL(e, this._hiddenStates, { emitEventsForSubmenuChanges: !1, eventDebounceDelay: 50, ...i }, this._commandService, this._keybindingService, t), o = n.getActions(i); return n.dispose(), o; } resetHiddenStates(e) { this._hiddenStates.reset(e); } }; -bT = WI([ - _a(0, Qt), - _a(1, xt), - _a(2, za) -], bT); -var bg; -let yT = (bg = class { +HT = Ux([ + wc(0, Ot), + wc(1, Lt), + wc(2, Pc) +], HT); +var Xm; +let ET = (Xm = class { constructor(e) { - this._storageService = e, this._disposables = new U(), this._onDidChange = new k(), this.onDidChange = this._onDidChange.event, this._ignoreChangeEvent = !1, this._hiddenByDefaultCache = /* @__PURE__ */ new Map(); + this._storageService = e, this._disposables = new _(), this._onDidChange = new k(), this.onDidChange = this._onDidChange.event, this._ignoreChangeEvent = !1, this._hiddenByDefaultCache = /* @__PURE__ */ new Map(); try { - const t = e.get(xp._key, 0, "{}"); + const t = e.get(Np._key, 0, "{}"); this._data = JSON.parse(t); } catch { this._data = /* @__PURE__ */ Object.create(null); } - this._disposables.add(e.onDidChangeValue(0, xp._key, this._disposables)(() => { + this._disposables.add(e.onDidChangeValue(0, Np._key, this._disposables)(() => { if (!this._ignoreChangeEvent) try { - const t = e.get(xp._key, 0, "{}"); + const t = e.get(Np._key, 0, "{}"); this._data = JSON.parse(t); } catch (t) { console.log("FAILED to read storage after UPDATE", t); @@ -53892,8 +53892,8 @@ let yT = (bg = class { if (i) o ? o.indexOf(t) < 0 && o.push(t) : this._data[e.id] = [t]; else if (o) { - const r = o.indexOf(t); - r >= 0 && oee(o, r), o.length === 0 && delete this._data[e.id]; + const l = o.indexOf(t); + l >= 0 && jee(o, l), o.length === 0 && delete this._data[e.id]; } this._persist(); } @@ -53911,7 +53911,7 @@ let yT = (bg = class { this._ignoreChangeEvent = !0; const e = JSON.stringify(this._data); this._storageService.store( - xp._key, + Np._key, e, 0, 0 @@ -53921,11 +53921,11 @@ let yT = (bg = class { this._ignoreChangeEvent = !1; } } -}, xp = bg, bg._key = "menu.hiddenCommands", bg); -yT = xp = WI([ - _a(0, za) -], yT); -class Jy { +}, Np = Xm, Xm._key = "menu.hiddenCommands", Xm); +ET = Np = Ux([ + wc(0, Pc) +], ET); +class sy { constructor(e, t) { this._id = e, this._collectContextKeysForSubmenus = t, this._menuGroups = [], this._allMenuIds = /* @__PURE__ */ new Set(), this._structureContextKeys = /* @__PURE__ */ new Set(), this._preconditionContextKeys = /* @__PURE__ */ new Set(), this._toggledContextKeys = /* @__PURE__ */ new Set(), this.refresh(); } @@ -53943,7 +53943,7 @@ class Jy { } refresh() { this._menuGroups.length = 0, this._allMenuIds.clear(), this._structureContextKeys.clear(), this._preconditionContextKeys.clear(), this._toggledContextKeys.clear(); - const e = this._sort(nn.getMenuItems(this._id)); + const e = this._sort(sn.getMenuItems(this._id)); let t; for (const i of e) { const n = i.group || ""; @@ -53955,12 +53955,12 @@ class Jy { return e; } _collectContextKeysAndSubmenuIds(e) { - if (Jy._fillInKbExprKeys(e.when, this._structureContextKeys), Cf(e)) { - if (e.command.precondition && Jy._fillInKbExprKeys(e.command.precondition, this._preconditionContextKeys), e.command.toggled) { + if (sy._fillInKbExprKeys(e.when, this._structureContextKeys), Sg(e)) { + if (e.command.precondition && sy._fillInKbExprKeys(e.command.precondition, this._preconditionContextKeys), e.command.toggled) { const t = e.command.toggled.condition || e.command.toggled; - Jy._fillInKbExprKeys(t, this._toggledContextKeys); + sy._fillInKbExprKeys(t, this._toggledContextKeys); } - } else this._collectContextKeysForSubmenus && (nn.getMenuItems(e.submenu).forEach(this._collectContextKeysAndSubmenuIds, this), this._allMenuIds.add(e.submenu)); + } else this._collectContextKeysForSubmenus && (sn.getMenuItems(e.submenu).forEach(this._collectContextKeysAndSubmenuIds, this), this._allMenuIds.add(e.submenu)); } static _fillInKbExprKeys(e, t) { if (e) @@ -53968,34 +53968,34 @@ class Jy { t.add(i); } } -let wT = gy = class extends Jy { - constructor(e, t, i, n, o, r) { - super(e, i), this._hiddenStates = t, this._commandService = n, this._keybindingService = o, this._contextKeyService = r, this.refresh(); +let DT = Vf = class extends sy { + constructor(e, t, i, n, o, l) { + super(e, i), this._hiddenStates = t, this._commandService = n, this._keybindingService = o, this._contextKeyService = l, this.refresh(); } createActionGroups(e) { const t = []; for (const i of this._menuGroups) { const [n, o] = i; - let r; - for (const l of o) - if (this._contextKeyService.contextMatchesRules(l.when)) { - const a = Cf(l); - a && this._hiddenStates.setDefaultState(this._id, l.command.id, !!l.isHiddenByDefault); - const c = zge(this._id, a ? l.command : l, this._hiddenStates); - if (a) { - const d = p4(this._commandService, this._keybindingService, l.command.id, l.when); - (r ?? (r = [])).push(new ao(l.command, l.alt, e, c, d, this._contextKeyService, this._commandService)); + let l; + for (const r of o) + if (this._contextKeyService.contextMatchesRules(r.when)) { + const c = Sg(r); + c && this._hiddenStates.setDefaultState(this._id, r.command.id, !!r.isHiddenByDefault); + const d = Ybe(this._id, c ? r.command : r, this._hiddenStates); + if (c) { + const a = jO(this._commandService, this._keybindingService, r.command.id, r.when); + (l ?? (l = [])).push(new ho(r.command, r.alt, e, d, a, this._contextKeyService, this._commandService)); } else { - const d = new gy(l.submenu, this._hiddenStates, this._collectContextKeysForSubmenus, this._commandService, this._keybindingService, this._contextKeyService).createActionGroups(e), h = Qi.join(...d.map((u) => u[1])); - h.length > 0 && (r ?? (r = [])).push(new Sf(l, c, h)); + const a = new Vf(r.submenu, this._hiddenStates, this._collectContextKeysForSubmenus, this._commandService, this._keybindingService, this._contextKeyService).createActionGroups(e), h = ji.join(...a.map((u) => u[1])); + h.length > 0 && (l ?? (l = [])).push(new xg(r, d, h)); } } - r && r.length > 0 && t.push([n, r]); + l && l.length > 0 && t.push([n, l]); } return t; } _sort(e) { - return e.sort(gy._compareMenuItems); + return e.sort(Vf._compareMenuItems); } static _compareMenuItems(e, t) { const i = e.group, n = t.group; @@ -54008,56 +54008,56 @@ let wT = gy = class extends Jy { return -1; if (n === "navigation") return 1; - const l = i.localeCompare(n); - if (l !== 0) - return l; + const r = i.localeCompare(n); + if (r !== 0) + return r; } - const o = e.order || 0, r = t.order || 0; - return o < r ? -1 : o > r ? 1 : gy._compareTitles(Cf(e) ? e.command.title : e.title, Cf(t) ? t.command.title : t.title); + const o = e.order || 0, l = t.order || 0; + return o < l ? -1 : o > l ? 1 : Vf._compareTitles(Sg(e) ? e.command.title : e.title, Sg(t) ? t.command.title : t.title); } static _compareTitles(e, t) { const i = typeof e == "string" ? e : e.original, n = typeof t == "string" ? t : t.original; return i.localeCompare(n); } }; -wT = gy = WI([ - _a(3, Qt), - _a(4, xt), - _a(5, _e) -], wT); -let ux = class { - constructor(e, t, i, n, o, r) { - this._disposables = new U(), this._menuInfo = new wT(e, t, i.emitEventsForSubmenuChanges, n, o, r); - const l = new Zt(() => { +DT = Vf = Ux([ + wc(3, Ot), + wc(4, Lt), + wc(5, xe) +], DT); +let xL = class { + constructor(e, t, i, n, o, l) { + this._disposables = new _(), this._menuInfo = new DT(e, t, i.emitEventsForSubmenuChanges, n, o, l); + const r = new St(() => { this._menuInfo.refresh(), this._onDidChange.fire({ menu: this, isStructuralChange: !0, isEnablementChange: !0, isToggleChange: !0 }); }, i.eventDebounceDelay); - this._disposables.add(l), this._disposables.add(nn.onDidChangeMenu((h) => { + this._disposables.add(r), this._disposables.add(sn.onDidChangeMenu((h) => { for (const u of this._menuInfo.allMenuIds) if (h.has(u)) { - l.schedule(); + r.schedule(); break; } })); - const a = this._disposables.add(new U()), c = (h) => { - let u = !1, g = !1, m = !1; - for (const f of h) - if (u = u || f.isStructuralChange, g = g || f.isEnablementChange, m = m || f.isToggleChange, u && g && m) + const c = this._disposables.add(new _()), d = (h) => { + let u = !1, m = !1, b = !1; + for (const g of h) + if (u = u || g.isStructuralChange, m = m || g.isEnablementChange, b = b || g.isToggleChange, u && m && b) break; - return { menu: this, isStructuralChange: u, isEnablementChange: g, isToggleChange: m }; - }, d = () => { - a.add(r.onDidChangeContext((h) => { - const u = h.affectsSome(this._menuInfo.structureContextKeys), g = h.affectsSome(this._menuInfo.preconditionContextKeys), m = h.affectsSome(this._menuInfo.toggledContextKeys); - (u || g || m) && this._onDidChange.fire({ menu: this, isStructuralChange: u, isEnablementChange: g, isToggleChange: m }); - })), a.add(t.onDidChange((h) => { + return { menu: this, isStructuralChange: u, isEnablementChange: m, isToggleChange: b }; + }, a = () => { + c.add(l.onDidChangeContext((h) => { + const u = h.affectsSome(this._menuInfo.structureContextKeys), m = h.affectsSome(this._menuInfo.preconditionContextKeys), b = h.affectsSome(this._menuInfo.toggledContextKeys); + (u || m || b) && this._onDidChange.fire({ menu: this, isStructuralChange: u, isEnablementChange: m, isToggleChange: b }); + })), c.add(t.onDidChange((h) => { this._onDidChange.fire({ menu: this, isStructuralChange: !0, isEnablementChange: !1, isToggleChange: !1 }); })); }; - this._onDidChange = new LH({ + this._onDidChange = new sB({ // start/stop context key listener - onWillAddFirstListener: d, - onDidRemoveLastListener: a.clear.bind(a), + onWillAddFirstListener: a, + onDidRemoveLastListener: c.clear.bind(c), delay: i.eventDebounceDelay, - merge: c + merge: d }), this.onDidChange = this._onDidChange.event; } getActions(e) { @@ -54067,19 +54067,19 @@ let ux = class { this._disposables.dispose(), this._onDidChange.dispose(); } }; -ux = WI([ - _a(3, Qt), - _a(4, xt), - _a(5, _e) -], ux); -function zge(s, e, t) { - const i = V$(e) ? e.submenu.id : e.id, n = typeof e.title == "string" ? e.title : e.title.value, o = og({ +xL = Ux([ + wc(3, Ot), + wc(4, Lt), + wc(5, xe) +], xL); +function Ybe(s, e, t) { + const i = See(e) ? e.submenu.id : e.id, n = typeof e.title == "string" ? e.title : e.title.value, o = am({ id: `hide/${s.id}/${i}`, label: p("hide.label", "Hide '{0}'", n), run() { t.updateHidden(s, i, !0); } - }), r = og({ + }), l = am({ id: `toggle/${s.id}/${i}`, label: n, get checked() { @@ -54091,89 +54091,89 @@ function zge(s, e, t) { }); return { hide: o, - toggle: r, + toggle: l, get isHidden() { - return !r.checked; + return !l.checked; } }; } -function p4(s, e, t, i = void 0, n = !0) { - return og({ +function jO(s, e, t, i = void 0, n = !0) { + return am({ id: `configureKeybinding/${t}`, label: p("configure keybinding", "Configure Keybinding"), enabled: n, run() { - const r = !!!e.lookupKeybinding(t) && i ? i.serialize() : void 0; - s.executeCommand("workbench.action.openGlobalKeybindings", `@command:${t}` + (r ? ` +when:${r}` : "")); + const l = !!!e.lookupKeybinding(t) && i ? i.serialize() : void 0; + s.executeCommand("workbench.action.openGlobalKeybindings", `@command:${t}` + (l ? ` +when:${l}` : "")); } }); } -var f4 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var qO = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, kr = function(s, e) { +}, Hl = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let L1 = class extends xge { - constructor(e, t, i, n, o, r, l, a) { +let YW = class extends gbe { + constructor(e, t, i, n, o, l, r, c) { super(e, o, { // defaults - getKeyBinding: (d) => r.lookupKeybinding(d.id) ?? void 0, + getKeyBinding: (a) => l.lookupKeybinding(a.id) ?? void 0, // options (override defaults) ...t, // mandatory (overide options) allowContextMenu: !0, skipTelemetry: typeof (t == null ? void 0 : t.telemetrySource) == "string" - }), this._options = t, this._menuService = i, this._contextKeyService = n, this._contextMenuService = o, this._keybindingService = r, this._commandService = l, this._sessionDisposables = this._store.add(new U()); - const c = t == null ? void 0 : t.telemetrySource; - c && this._store.add(this.actionBar.onDidRun((d) => a.publicLog2("workbenchActionExecuted", { id: d.action.id, from: c }))); + }), this._options = t, this._menuService = i, this._contextKeyService = n, this._contextMenuService = o, this._keybindingService = l, this._commandService = r, this._sessionDisposables = this._store.add(new _()); + const d = t == null ? void 0 : t.telemetrySource; + d && this._store.add(this.actionBar.onDidRun((a) => c.publicLog2("workbenchActionExecuted", { id: a.action.id, from: d }))); } setActions(e, t = [], i) { - var d, h, u; + var a, h, u; this._sessionDisposables.clear(); - const n = e.slice(), o = t.slice(), r = []; - let l = 0; - const a = []; - let c = !1; - if (((d = this._options) == null ? void 0 : d.hiddenItemStrategy) !== -1) - for (let g = 0; g < n.length; g++) { - const m = n[g]; - !(m instanceof ao) && !(m instanceof Sf) || m.hideActions && (r.push(m.hideActions.toggle), m.hideActions.toggle.checked && l++, m.hideActions.isHidden && (c = !0, n[g] = void 0, ((h = this._options) == null ? void 0 : h.hiddenItemStrategy) !== 0 && (a[g] = m))); + const n = e.slice(), o = t.slice(), l = []; + let r = 0; + const c = []; + let d = !1; + if (((a = this._options) == null ? void 0 : a.hiddenItemStrategy) !== -1) + for (let m = 0; m < n.length; m++) { + const b = n[m]; + !(b instanceof ho) && !(b instanceof xg) || b.hideActions && (l.push(b.hideActions.toggle), b.hideActions.toggle.checked && r++, b.hideActions.isHidden && (d = !0, n[m] = void 0, ((h = this._options) == null ? void 0 : h.hiddenItemStrategy) !== 0 && (c[m] = b))); } if (((u = this._options) == null ? void 0 : u.overflowBehavior) !== void 0) { - const g = Zge(new Set(this._options.overflowBehavior.exempted), nt.map(n, (b) => b == null ? void 0 : b.id)), m = this._options.overflowBehavior.maxItems - g.size; - let f = 0; - for (let b = 0; b < n.length; b++) { - const y = n[b]; - y && (f++, !g.has(y.id) && f >= m && (n[b] = void 0, a[b] = y)); + const m = fbe(new Set(this._options.overflowBehavior.exempted), nt.map(n, (Z) => Z == null ? void 0 : Z.id)), b = this._options.overflowBehavior.maxItems - m.size; + let g = 0; + for (let Z = 0; Z < n.length; Z++) { + const f = n[Z]; + f && (g++, !m.has(f.id) && g >= b && (n[Z] = void 0, c[Z] = f)); } } - gF(n), gF(a), super.setActions(n, Qi.join(a, o)), (r.length > 0 || n.length > 0) && this._sessionDisposables.add(z(this.getElement(), "contextmenu", (g) => { - var w, C, S, L, x; - const m = new Er(xe(this.getElement()), g), f = this.getItemAction(m.target); - if (!f) + HD(n), HD(c), super.setActions(n, ji.join(c, o)), (l.length > 0 || n.length > 0) && this._sessionDisposables.add(z(this.getElement(), "contextmenu", (m) => { + var y, W, G, X, L; + const b = new Fl(Le(this.getElement()), m), g = this.getItemAction(b.target); + if (!g) return; - m.preventDefault(), m.stopPropagation(); - const b = []; - if (f instanceof ao && f.menuKeybinding) - b.push(f.menuKeybinding); - else if (!(f instanceof Sf || f instanceof S1)) { - const Z = !!this._keybindingService.lookupKeybinding(f.id); - b.push(p4(this._commandService, this._keybindingService, f.id, void 0, Z)); - } - if (r.length > 0) { - let Z = !1; - if (l === 1 && ((w = this._options) == null ? void 0 : w.hiddenItemStrategy) === 0) { - Z = !0; - for (let _ = 0; _ < r.length; _++) - if (r[_].checked) { - r[_] = og({ - id: f.id, - label: f.label, + b.preventDefault(), b.stopPropagation(); + const Z = []; + if (g instanceof ho && g.menuKeybinding) + Z.push(g.menuKeybinding); + else if (!(g instanceof xg || g instanceof MW)) { + const S = !!this._keybindingService.lookupKeybinding(g.id); + Z.push(jO(this._commandService, this._keybindingService, g.id, void 0, S)); + } + if (l.length > 0) { + let S = !1; + if (r === 1 && ((y = this._options) == null ? void 0 : y.hiddenItemStrategy) === 0) { + S = !0; + for (let x = 0; x < l.length; x++) + if (l[x].checked) { + l[x] = am({ + id: g.id, + label: g.label, checked: !0, enabled: !1, run() { @@ -54182,12 +54182,12 @@ let L1 = class extends xge { break; } } - if (!Z && (f instanceof ao || f instanceof Sf)) { - if (!f.hideActions) + if (!S && (g instanceof ho || g instanceof xg)) { + if (!g.hideActions) return; - b.push(f.hideActions.hide); + Z.push(g.hideActions.hide); } else - b.push(og({ + Z.push(am({ id: "label", label: p("hide", "Hide"), enabled: !1, @@ -54195,40 +54195,40 @@ let L1 = class extends xge { } })); } - const y = Qi.join(b, r); - (C = this._options) != null && C.resetMenu && !i && (i = [this._options.resetMenu]), c && i && (y.push(new Qi()), y.push(og({ + const f = ji.join(Z, l); + (W = this._options) != null && W.resetMenu && !i && (i = [this._options.resetMenu]), d && i && (f.push(new ji()), f.push(am({ id: "resetThisMenu", label: p("resetThisMenu", "Reset Menu"), run: () => this._menuService.resetHiddenStates(i) - }))), y.length !== 0 && this._contextMenuService.showContextMenu({ - getAnchor: () => m, - getActions: () => y, + }))), f.length !== 0 && this._contextMenuService.showContextMenu({ + getAnchor: () => b, + getActions: () => f, // add context menu actions (iff appicable) - menuId: (S = this._options) == null ? void 0 : S.contextMenu, - menuActionOptions: { renderShortTitle: !0, ...(L = this._options) == null ? void 0 : L.menuOptions }, - skipTelemetry: typeof ((x = this._options) == null ? void 0 : x.telemetrySource) == "string", + menuId: (G = this._options) == null ? void 0 : G.contextMenu, + menuActionOptions: { renderShortTitle: !0, ...(X = this._options) == null ? void 0 : X.menuOptions }, + skipTelemetry: typeof ((L = this._options) == null ? void 0 : L.telemetrySource) == "string", contextKeyService: this._contextKeyService }); })); } }; -L1 = f4([ - kr(2, Uo), - kr(3, _e), - kr(4, Co), - kr(5, xt), - kr(6, Qt), - kr(7, Ls) -], L1); -let gx = class extends L1 { - constructor(e, t, i, n, o, r, l, a, c) { - super(e, { resetMenu: t, ...i }, n, o, r, l, a, c), this._onDidChangeMenuItems = this._store.add(new k()), this.onDidChangeMenuItems = this._onDidChangeMenuItems.event; - const d = this._store.add(n.createMenu(t, o, { emitEventsForSubmenuChanges: !0 })), h = () => { - var m, f, b; - const u = [], g = []; - NI(d, i == null ? void 0 : i.menuOptions, { primary: u, secondary: g }, (m = i == null ? void 0 : i.toolbarOptions) == null ? void 0 : m.primaryGroup, (f = i == null ? void 0 : i.toolbarOptions) == null ? void 0 : f.shouldInlineSubmenu, (b = i == null ? void 0 : i.toolbarOptions) == null ? void 0 : b.useSeparatorsInPrimaryActions), e.classList.toggle("has-no-actions", u.length === 0 && g.length === 0), super.setActions(u, g); +YW = qO([ + Hl(2, Oo), + Hl(3, xe), + Hl(4, Xo), + Hl(5, Lt), + Hl(6, Ot), + Hl(7, Ls) +], YW); +let CL = class extends YW { + constructor(e, t, i, n, o, l, r, c, d) { + super(e, { resetMenu: t, ...i }, n, o, l, r, c, d), this._onDidChangeMenuItems = this._store.add(new k()), this.onDidChangeMenuItems = this._onDidChangeMenuItems.event; + const a = this._store.add(n.createMenu(t, o, { emitEventsForSubmenuChanges: !0 })), h = () => { + var b, g, Z; + const u = [], m = []; + Kx(a, i == null ? void 0 : i.menuOptions, { primary: u, secondary: m }, (b = i == null ? void 0 : i.toolbarOptions) == null ? void 0 : b.primaryGroup, (g = i == null ? void 0 : i.toolbarOptions) == null ? void 0 : g.shouldInlineSubmenu, (Z = i == null ? void 0 : i.toolbarOptions) == null ? void 0 : Z.useSeparatorsInPrimaryActions), e.classList.toggle("has-no-actions", u.length === 0 && m.length === 0), super.setActions(u, m); }; - this._store.add(d.onDidChange(() => { + this._store.add(a.onDidChange(() => { h(), this._onDidChangeMenuItems.fire(this); })), h(); } @@ -54236,49 +54236,49 @@ let gx = class extends L1 { * @deprecated The WorkbenchToolBar does not support this method because it works with menus. */ setActions() { - throw new mt("This toolbar is populated from a menu."); + throw new bt("This toolbar is populated from a menu."); } }; -gx = f4([ - kr(3, Uo), - kr(4, _e), - kr(5, Co), - kr(6, xt), - kr(7, Qt), - kr(8, Ls) -], gx); -var Pge = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +CL = qO([ + Hl(3, Oo), + Hl(4, xe), + Hl(5, Xo), + Hl(6, Lt), + Hl(7, Ot), + Hl(8, Ls) +], CL); +var kbe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Gz = function(s, e) { +}, rA = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const Pa = $e("hoverService"); -let Ab = class extends R { +const Bc = $e("hoverService"); +let RZ = class extends J { get delay() { return this.isInstantlyHovering() ? 0 : this._delay; } constructor(e, t, i = {}, n, o) { - super(), this.placement = e, this.instantHover = t, this.overrideOptions = i, this.configurationService = n, this.hoverService = o, this.lastHoverHideTime = 0, this.timeLimit = 200, this.hoverDisposables = this._register(new U()), this._delay = this.configurationService.getValue("workbench.hover.delay"), this._register(this.configurationService.onDidChangeConfiguration((r) => { - r.affectsConfiguration("workbench.hover.delay") && (this._delay = this.configurationService.getValue("workbench.hover.delay")); + super(), this.placement = e, this.instantHover = t, this.overrideOptions = i, this.configurationService = n, this.hoverService = o, this.lastHoverHideTime = 0, this.timeLimit = 200, this.hoverDisposables = this._register(new _()), this._delay = this.configurationService.getValue("workbench.hover.delay"), this._register(this.configurationService.onDidChangeConfiguration((l) => { + l.affectsConfiguration("workbench.hover.delay") && (this._delay = this.configurationService.getValue("workbench.hover.delay")); })); } showHover(e, t) { const i = typeof this.overrideOptions == "function" ? this.overrideOptions(e, t) : this.overrideOptions; this.hoverDisposables.clear(); - const n = Ki(e.target) ? [e.target] : e.target.targetElements; - for (const r of n) - this.hoverDisposables.add(ai(r, "keydown", (l) => { - l.equals( + const n = Oi(e.target) ? [e.target] : e.target.targetElements; + for (const l of n) + this.hoverDisposables.add(di(l, "keydown", (r) => { + r.equals( 9 /* KeyCode.Escape */ ) && this.hoverService.hideHover(); })); - const o = Ki(e.content) ? void 0 : e.content.toString(); + const o = Oi(e.content) ? void 0 : e.content.toString(); return this.hoverService.showHover({ ...e, ...i, @@ -54302,87 +54302,87 @@ let Ab = class extends R { this.hoverDisposables.clear(), this.instantHover && (this.lastHoverHideTime = Date.now()); } }; -Ab = Pge([ - Gz(3, Ke), - Gz(4, Pa) -], Ab); -var b4 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +RZ = kbe([ + rA(3, Qe), + rA(4, Bc) +], RZ); +var $O = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, _L = function(s, e) { +}, zX = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const bW = [], LS = 35; -let CT = class extends R { - constructor(e, t, i, n, o, r, l, a, c) { - super(), this._diffModel = t, this._editors = i, this._options = n, this._sashLayout = o, this._boundarySashes = r, this._instantiationService = l, this._contextKeyService = a, this._menuService = c, this._menu = this._register(this._menuService.createMenu(pe.DiffEditorHunkToolbar, this._contextKeyService)), this._actions = St(this, this._menu.onDidChange, () => this._menu.getActions()), this._hasActions = this._actions.map((d) => d.length > 0), this._showSash = ye(this, (d) => this._options.renderSideBySide.read(d) && this._hasActions.read(d)), this.width = ye(this, (d) => this._hasActions.read(d) ? LS : 0), this.elements = Qe("div.gutter@gutter", { style: { position: "absolute", height: "100%", width: LS + "px" } }, []), this._currentDiff = ye(this, (d) => { - var m; - const h = this._diffModel.read(d); +const MR = [], k1 = 35; +let FT = class extends J { + constructor(e, t, i, n, o, l, r, c, d) { + super(), this._diffModel = t, this._editors = i, this._options = n, this._sashLayout = o, this._boundarySashes = l, this._instantiationService = r, this._contextKeyService = c, this._menuService = d, this._menu = this._register(this._menuService.createMenu(pe.DiffEditorHunkToolbar, this._contextKeyService)), this._actions = Gt(this, this._menu.onDidChange, () => this._menu.getActions()), this._hasActions = this._actions.map((a) => a.length > 0), this._showSash = fe(this, (a) => this._options.renderSideBySide.read(a) && this._hasActions.read(a)), this.width = fe(this, (a) => this._hasActions.read(a) ? k1 : 0), this.elements = Oe("div.gutter@gutter", { style: { position: "absolute", height: "100%", width: k1 + "px" } }, []), this._currentDiff = fe(this, (a) => { + var b; + const h = this._diffModel.read(a); if (!h) return; - const u = (m = h.diff.read(d)) == null ? void 0 : m.mappings, g = this._editors.modifiedCursor.read(d); - if (g) - return u == null ? void 0 : u.find((f) => f.lineRangeMapping.modified.contains(g.lineNumber)); - }), this._selectedDiffs = ye(this, (d) => { - const h = this._diffModel.read(d), u = h == null ? void 0 : h.diff.read(d); + const u = (b = h.diff.read(a)) == null ? void 0 : b.mappings, m = this._editors.modifiedCursor.read(a); + if (m) + return u == null ? void 0 : u.find((g) => g.lineRangeMapping.modified.contains(m.lineNumber)); + }), this._selectedDiffs = fe(this, (a) => { + const h = this._diffModel.read(a), u = h == null ? void 0 : h.diff.read(a); if (!u) - return bW; - const g = this._editors.modifiedSelections.read(d); - if (g.every((y) => y.isEmpty())) - return bW; - const m = new ar(g.map((y) => We.fromRangeInclusive(y))), b = u.mappings.filter((y) => y.lineRangeMapping.innerChanges && m.intersects(y.lineRangeMapping.modified)).map((y) => ({ - mapping: y, - rangeMappings: y.lineRangeMapping.innerChanges.filter((w) => g.some((C) => M.areIntersecting(w.modifiedRange, C))) + return MR; + const m = this._editors.modifiedSelections.read(a); + if (m.every((f) => f.isEmpty())) + return MR; + const b = new al(m.map((f) => Ne.fromRangeInclusive(f))), Z = u.mappings.filter((f) => f.lineRangeMapping.innerChanges && b.intersects(f.lineRangeMapping.modified)).map((f) => ({ + mapping: f, + rangeMappings: f.lineRangeMapping.innerChanges.filter((y) => m.some((W) => I.areIntersecting(y.modifiedRange, W))) })); - return b.length === 0 || b.every((y) => y.rangeMappings.length === 0) ? bW : b; - }), this._register(pue(e, this.elements.root)), this._register(z(this.elements.root, "click", () => { + return Z.length === 0 || Z.every((f) => f.rangeMappings.length === 0) ? MR : Z; + }), this._register(rme(e, this.elements.root)), this._register(z(this.elements.root, "click", () => { this._editors.modified.focus(); - })), this._register(Uc(this.elements.root, { display: this._hasActions.map((d) => d ? "block" : "none") })), Un(this, (d) => this._showSash.read(d) ? new d4(e, this._sashLayout.dimensions, this._options.enableSplitViewResizing, this._boundarySashes, xC(this, (u) => this._sashLayout.sashLeft.read(u) - LS, (u, g) => this._sashLayout.sashLeft.set(u + LS, g)), () => this._sashLayout.resetSash()) : void 0).recomputeInitiallyAndOnChange(this._store), this._register(new Cge(this._editors.modified, this.elements.root, { - getIntersectingGutterItems: (d, h) => { + })), this._register(qd(this.elements.root, { display: this._hasActions.map((a) => a ? "block" : "none") })), On(this, (a) => this._showSash.read(a) ? new PO(e, this._sashLayout.dimensions, this._options.enableSplitViewResizing, this._boundarySashes, JG(this, (u) => this._sashLayout.sashLeft.read(u) - k1, (u, m) => this._sashLayout.sashLeft.set(u + k1, m)), () => this._sashLayout.resetSash()) : void 0).recomputeInitiallyAndOnChange(this._store), this._register(new ube(this._editors.modified, this.elements.root, { + getIntersectingGutterItems: (a, h) => { const u = this._diffModel.read(h); if (!u) return []; - const g = u.diff.read(h); - if (!g) + const m = u.diff.read(h); + if (!m) return []; - const m = this._selectedDiffs.read(h); - if (m.length > 0) { - const b = zo.fromRangeMappings(m.flatMap((y) => y.rangeMappings)); + const b = this._selectedDiffs.read(h); + if (b.length > 0) { + const Z = Ko.fromRangeMappings(b.flatMap((f) => f.rangeMappings)); return [ - new Rz(b, !0, pe.DiffEditorSelectionToolbar, void 0, u.model.original.uri, u.model.modified.uri) + new cA(Z, !0, pe.DiffEditorSelectionToolbar, void 0, u.model.original.uri, u.model.modified.uri) ]; } - const f = this._currentDiff.read(h); - return g.mappings.map((b) => new Rz(b.lineRangeMapping.withInnerChangesFromLineRanges(), b.lineRangeMapping === (f == null ? void 0 : f.lineRangeMapping), pe.DiffEditorHunkToolbar, void 0, u.model.original.uri, u.model.modified.uri)); + const g = this._currentDiff.read(h); + return m.mappings.map((Z) => new cA(Z.lineRangeMapping.withInnerChangesFromLineRanges(), Z.lineRangeMapping === (g == null ? void 0 : g.lineRangeMapping), pe.DiffEditorHunkToolbar, void 0, u.model.original.uri, u.model.modified.uri)); }, - createView: (d, h) => this._instantiationService.createInstance(ST, d, h, this) - })), this._register(z(this.elements.gutter, ie.MOUSE_WHEEL, (d) => { + createView: (a, h) => this._instantiationService.createInstance(zT, a, h, this) + })), this._register(z(this.elements.gutter, ie.MOUSE_WHEEL, (a) => { this._editors.modified.getOption( 104 /* EditorOption.scrollbar */ - ).handleMouseWheel && this._editors.modified.delegateScrollFromMouseWheelEvent(d); + ).handleMouseWheel && this._editors.modified.delegateScrollFromMouseWheelEvent(a); }, { passive: !1 })); } computeStagedValue(e) { - const t = e.innerChanges ?? [], i = new kz(this._editors.modifiedModel.get()), n = new kz(this._editors.original.getModel()); - return new vX(t.map((l) => l.toTextEdit(i))).apply(n); + const t = e.innerChanges ?? [], i = new lA(this._editors.modifiedModel.get()), n = new lA(this._editors.original.getModel()); + return new iH(t.map((r) => r.toTextEdit(i))).apply(n); } layout(e) { this.elements.gutter.style.left = e + "px"; } }; -CT = b4([ - _L(6, Se), - _L(7, _e), - _L(8, Uo) -], CT); -class Rz { - constructor(e, t, i, n, o, r) { - this.mapping = e, this.showAlways = t, this.menuId = i, this.rangeOverride = n, this.originalUri = o, this.modifiedUri = r; +FT = $O([ + zX(6, Ge), + zX(7, xe), + zX(8, Oo) +], FT); +class cA { + constructor(e, t, i, n, o, l) { + this.mapping = e, this.showAlways = t, this.menuId = i, this.rangeOverride = n, this.originalUri = o, this.modifiedUri = l; } get id() { return this.mapping.modified.toString(); @@ -54391,45 +54391,45 @@ class Rz { return this.rangeOverride ?? this.mapping.modified; } } -let ST = class extends R { +let zT = class extends J { constructor(e, t, i, n) { - super(), this._item = e, this._elements = Qe("div.gutterItem", { style: { height: "20px", width: "34px" } }, [ - Qe("div.background@background", {}, []), - Qe("div.buttons@buttons", {}, []) - ]), this._showAlways = this._item.map(this, (r) => r.showAlways), this._menuId = this._item.map(this, (r) => r.menuId), this._isSmall = Oe(this, !1), this._lastItemRange = void 0, this._lastViewRange = void 0; - const o = this._register(n.createInstance(Ab, "element", !0, { position: { + super(), this._item = e, this._elements = Oe("div.gutterItem", { style: { height: "20px", width: "34px" } }, [ + Oe("div.background@background", {}, []), + Oe("div.buttons@buttons", {}, []) + ]), this._showAlways = this._item.map(this, (l) => l.showAlways), this._menuId = this._item.map(this, (l) => l.menuId), this._isSmall = Ue(this, !1), this._lastItemRange = void 0, this._lastViewRange = void 0; + const o = this._register(n.createInstance(RZ, "element", !0, { position: { hoverPosition: 1 /* HoverPosition.RIGHT */ } })); - this._register(zp(t, this._elements.root)), this._register(Te((r) => { - const l = this._showAlways.read(r); - this._elements.root.classList.toggle("noTransition", !0), this._elements.root.classList.toggle("showAlways", l), setTimeout(() => { + this._register(_p(t, this._elements.root)), this._register(Te((l) => { + const r = this._showAlways.read(l); + this._elements.root.classList.toggle("noTransition", !0), this._elements.root.classList.toggle("showAlways", r), setTimeout(() => { this._elements.root.classList.toggle("noTransition", !1); }, 0); - })), this._register(ks((r, l) => { + })), this._register(Js((l, r) => { this._elements.buttons.replaceChildren(); - const a = l.add(n.createInstance(gx, this._elements.buttons, this._menuId.read(r), { + const c = r.add(n.createInstance(CL, this._elements.buttons, this._menuId.read(l), { orientation: 1, hoverDelegate: o, toolbarOptions: { - primaryGroup: (c) => c.startsWith("primary") + primaryGroup: (d) => d.startsWith("primary") }, - overflowBehavior: { maxItems: this._isSmall.read(r) ? 1 : 3 }, + overflowBehavior: { maxItems: this._isSmall.read(l) ? 1 : 3 }, hiddenItemStrategy: 0, - actionRunner: new h4(() => { - const c = this._item.get(), d = c.mapping; + actionRunner: new BO(() => { + const d = this._item.get(), a = d.mapping; return { - mapping: d, - originalWithModifiedChanges: i.computeStagedValue(d), - originalUri: c.originalUri, - modifiedUri: c.modifiedUri + mapping: a, + originalWithModifiedChanges: i.computeStagedValue(a), + originalUri: d.originalUri, + modifiedUri: d.modifiedUri }; }), menuOptions: { shouldForwardArgs: !0 } })); - l.add(a.onDidChangeMenuItems(() => { + r.add(c.onDidChangeMenuItems(() => { this._lastItemRange && this.layout(this._lastItemRange, this._lastViewRange); })); })); @@ -54439,34 +54439,34 @@ let ST = class extends R { let i = this._elements.buttons.clientHeight; this._isSmall.set(this._item.get().mapping.original.startLineNumber === 1 && e.length < 30, void 0), i = this._elements.buttons.clientHeight; const n = e.length / 2 - i / 2, o = i; - let r = e.start + n; - const l = He.tryCreate(o, t.endExclusive - o - i), a = He.tryCreate(e.start + o, e.endExclusive - i - o); - a && l && a.start < a.endExclusive && (r = l.clip(r), r = a.clip(r)), this._elements.buttons.style.top = `${r - e.start}px`; + let l = e.start + n; + const r = Pe.tryCreate(o, t.endExclusive - o - i), c = Pe.tryCreate(e.start + o, e.endExclusive - i - o); + c && r && c.start < c.endExclusive && (l = r.clip(l), l = c.clip(l)), this._elements.buttons.style.top = `${l - e.start}px`; } }; -ST = b4([ - _L(3, Se) -], ST); -function oo(s) { - return LT.get(s); +zT = $O([ + zX(3, Ge) +], zT); +function ro(s) { + return AT.get(s); } -const _d = class _d extends R { +const wa = class wa extends J { /** * Make sure that editor is not disposed yet! */ static get(e) { - let t = _d._map.get(e); + let t = wa._map.get(e); if (!t) { - t = new _d(e), _d._map.set(e, t); + t = new wa(e), wa._map.set(e, t); const i = e.onDidDispose(() => { - const n = _d._map.get(e); - n && (_d._map.delete(e), n.dispose(), i.dispose()); + const n = wa._map.get(e); + n && (wa._map.delete(e), n.dispose(), i.dispose()); }); } return t; } _beginUpdate() { - this._updateCounter++, this._updateCounter === 1 && (this._currentTransaction = new c0(() => { + this._updateCounter++, this._updateCounter === 1 && (this._currentTransaction = new p0(() => { })); } _endUpdate() { @@ -54477,29 +54477,29 @@ const _d = class _d extends R { } constructor(e) { var t; - super(), this.editor = e, this._updateCounter = 0, this._currentTransaction = void 0, this._model = Oe(this, this.editor.getModel()), this.model = this._model, this.isReadonly = St(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption( + super(), this.editor = e, this._updateCounter = 0, this._currentTransaction = void 0, this._model = Ue(this, this.editor.getModel()), this.model = this._model, this.isReadonly = Gt(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption( 92 /* EditorOption.readOnly */ - )), this._versionId = Ov({ owner: this, lazy: !0 }, ((t = this.editor.getModel()) == null ? void 0 : t.getVersionId()) ?? null), this.versionId = this._versionId, this._selections = Ov({ owner: this, equalsFn: zv(UA(fe.selectionsEqual)), lazy: !0 }, this.editor.getSelections() ?? null), this.selections = this._selections, this.isFocused = St(this, (i) => { + )), this._versionId = uT({ owner: this, lazy: !0 }, ((t = this.editor.getModel()) == null ? void 0 : t.getVersionId()) ?? null), this.versionId = this._versionId, this._selections = uT({ owner: this, equalsFn: dT(dL(ge.selectionsEqual)), lazy: !0 }, this.editor.getSelections() ?? null), this.selections = this._selections, this.isFocused = Gt(this, (i) => { const n = this.editor.onDidFocusEditorWidget(i), o = this.editor.onDidBlurEditorWidget(i); return { dispose() { n.dispose(), o.dispose(); } }; - }, () => this.editor.hasWidgetFocus()), this.value = xC(this, (i) => { + }, () => this.editor.hasWidgetFocus()), this.value = JG(this, (i) => { var n; return this.versionId.read(i), ((n = this.model.read(i)) == null ? void 0 : n.getValue()) ?? ""; }, (i, n) => { const o = this.model.get(); o !== null && i !== o.getValue() && o.setValue(i); - }), this.valueIsEmpty = ye(this, (i) => { + }), this.valueIsEmpty = fe(this, (i) => { var n; return this.versionId.read(i), ((n = this.editor.getModel()) == null ? void 0 : n.getValueLength()) === 0; - }), this.cursorSelection = Vo({ owner: this, equalsFn: zv(fe.selectionsEqual) }, (i) => { + }), this.cursorSelection = vo({ owner: this, equalsFn: dT(ge.selectionsEqual) }, (i) => { var n; return ((n = this.selections.read(i)) == null ? void 0 : n[0]) ?? null; - }), this.onDidType = d0(this), this.scrollTop = St(this.editor.onDidScrollChange, () => this.editor.getScrollTop()), this.scrollLeft = St(this.editor.onDidScrollChange, () => this.editor.getScrollLeft()), this.layoutInfo = St(this.editor.onDidLayoutChange, () => this.editor.getLayoutInfo()), this.layoutInfoContentLeft = this.layoutInfo.map((i) => i.contentLeft), this.layoutInfoDecorationsLeft = this.layoutInfo.map((i) => i.decorationsLeft), this.contentWidth = St(this.editor.onDidContentSizeChange, () => this.editor.getContentWidth()), this._overlayWidgetCounter = 0, this._register(this.editor.onBeginUpdate(() => this._beginUpdate())), this._register(this.editor.onEndUpdate(() => this._endUpdate())), this._register(this.editor.onDidChangeModel(() => { + }), this.onDidType = g0(this), this.scrollTop = Gt(this.editor.onDidScrollChange, () => this.editor.getScrollTop()), this.scrollLeft = Gt(this.editor.onDidScrollChange, () => this.editor.getScrollLeft()), this.layoutInfo = Gt(this.editor.onDidLayoutChange, () => this.editor.getLayoutInfo()), this.layoutInfoContentLeft = this.layoutInfo.map((i) => i.contentLeft), this.layoutInfoDecorationsLeft = this.layoutInfo.map((i) => i.decorationsLeft), this.contentWidth = Gt(this.editor.onDidContentSizeChange, () => this.editor.getContentWidth()), this._overlayWidgetCounter = 0, this._register(this.editor.onBeginUpdate(() => this._beginUpdate())), this._register(this.editor.onEndUpdate(() => this._endUpdate())), this._register(this.editor.onDidChangeModel(() => { this._beginUpdate(); try { this._model.set(this.editor.getModel(), this._currentTransaction), this._forceUpdate(); @@ -54548,13 +54548,13 @@ const _d = class _d extends R { } } getOption(e) { - return St(this, (t) => this.editor.onDidChangeConfiguration((i) => { + return Gt(this, (t) => this.editor.onDidChangeConfiguration((i) => { i.hasChanged(e) && t(void 0); }), () => this.editor.getOption(e)); } setDecorations(e) { - const t = new U(), i = this.editor.createDecorationsCollection(); - return t.add(MC({ owner: this, debugName: () => `Apply decorations from ${e.debugName}` }, (n) => { + const t = new _(), i = this.editor.createDecorationsCollection(); + return t.add(HG({ owner: this, debugName: () => `Apply decorations from ${e.debugName}` }, (n) => { const o = e.read(n); i.set(o); })), t.add({ @@ -54575,15 +54575,15 @@ const _d = class _d extends R { const n = Te((o) => { e.position.read(o), e.minContentWidthInPx.read(o), this.editor.layoutOverlayWidget(i); }); - return Ce(() => { + return We(() => { n.dispose(), this.editor.removeOverlayWidget(i); }); } }; -_d._map = /* @__PURE__ */ new Map(); -let LT = _d; -function AT(s, e) { - return wde({ +wa._map = /* @__PURE__ */ new Map(); +let AT = wa; +function KT(s, e) { + return hhe({ createEmptyChangeSummary: () => ({ deltas: [], didChange: !1 }), handleChange: (t, i) => { if (t.didChange(s)) { @@ -54597,8 +54597,8 @@ function AT(s, e) { i.didChange && e(n, i.deltas); }); } -function Bge(s, e) { - const t = new U(), i = AT(s, (n, o) => { +function vbe(s, e) { + const t = new _(), i = KT(s, (n, o) => { t.clear(), e(n, o, t); }); return { @@ -54607,17 +54607,17 @@ function Bge(s, e) { } }; } -var Oge = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Jbe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Hge = function(s, e) { +}, Hbe = function(s, e) { return function(t, i) { e(t, i, s); }; -}, IL, yg; -let mx = (yg = class extends R { +}, AX, Vm; +let RL = (Vm = class extends J { static setBreadcrumbsSourceFactory(e) { this._breadcrumbsSourceFactory.set(e, void 0); } @@ -54625,382 +54625,382 @@ let mx = (yg = class extends R { return this._isUpdatingHiddenAreas; } constructor(e, t, i, n) { - super(), this._editors = e, this._diffModel = t, this._options = i, this._instantiationService = n, this._modifiedOutlineSource = Un(this, (a) => { - const c = this._editors.modifiedModel.read(a), d = IL._breadcrumbsSourceFactory.read(a); - return !c || !d ? void 0 : d(c, this._instantiationService); - }), this._isUpdatingHiddenAreas = !1, this._register(this._editors.original.onDidChangeCursorPosition((a) => { - if (a.reason === 1) + super(), this._editors = e, this._diffModel = t, this._options = i, this._instantiationService = n, this._modifiedOutlineSource = On(this, (c) => { + const d = this._editors.modifiedModel.read(c), a = AX._breadcrumbsSourceFactory.read(c); + return !d || !a ? void 0 : a(d, this._instantiationService); + }), this._isUpdatingHiddenAreas = !1, this._register(this._editors.original.onDidChangeCursorPosition((c) => { + if (c.reason === 1) return; - const c = this._diffModel.get(); - oi((d) => { + const d = this._diffModel.get(); + li((a) => { for (const h of this._editors.original.getSelections() || []) - c == null || c.ensureOriginalLineIsVisible(h.getStartPosition().lineNumber, 0, d), c == null || c.ensureOriginalLineIsVisible(h.getEndPosition().lineNumber, 0, d); + d == null || d.ensureOriginalLineIsVisible(h.getStartPosition().lineNumber, 0, a), d == null || d.ensureOriginalLineIsVisible(h.getEndPosition().lineNumber, 0, a); }); - })), this._register(this._editors.modified.onDidChangeCursorPosition((a) => { - if (a.reason === 1) + })), this._register(this._editors.modified.onDidChangeCursorPosition((c) => { + if (c.reason === 1) return; - const c = this._diffModel.get(); - oi((d) => { + const d = this._diffModel.get(); + li((a) => { for (const h of this._editors.modified.getSelections() || []) - c == null || c.ensureModifiedLineIsVisible(h.getStartPosition().lineNumber, 0, d), c == null || c.ensureModifiedLineIsVisible(h.getEndPosition().lineNumber, 0, d); + d == null || d.ensureModifiedLineIsVisible(h.getStartPosition().lineNumber, 0, a), d == null || d.ensureModifiedLineIsVisible(h.getEndPosition().lineNumber, 0, a); }); })); - const o = this._diffModel.map((a, c) => { + const o = this._diffModel.map((c, d) => { var h; - const d = (a == null ? void 0 : a.unchangedRegions.read(c)) ?? []; - return d.length === 1 && d[0].modifiedLineNumber === 1 && d[0].lineCount === ((h = this._editors.modifiedModel.read(c)) == null ? void 0 : h.getLineCount()) ? [] : d; + const a = (c == null ? void 0 : c.unchangedRegions.read(d)) ?? []; + return a.length === 1 && a[0].modifiedLineNumber === 1 && a[0].lineCount === ((h = this._editors.modifiedModel.read(d)) == null ? void 0 : h.getLineCount()) ? [] : a; }); - this.viewZones = Uh(this, (a, c) => { - const d = this._modifiedOutlineSource.read(a); - if (!d) + this.viewZones = qh(this, (c, d) => { + const a = this._modifiedOutlineSource.read(c); + if (!a) return { origViewZones: [], modViewZones: [] }; - const h = [], u = [], g = this._options.renderSideBySide.read(a), m = this._options.compactMode.read(a), f = o.read(a); - for (let b = 0; b < f.length; b++) { - const y = f[b]; - if (!y.shouldHideControls(a) && !(m && (b === 0 || b === f.length - 1))) - if (m) { + const h = [], u = [], m = this._options.renderSideBySide.read(c), b = this._options.compactMode.read(c), g = o.read(c); + for (let Z = 0; Z < g.length; Z++) { + const f = g[Z]; + if (!f.shouldHideControls(c) && !(b && (Z === 0 || Z === g.length - 1))) + if (b) { { - const w = ye(this, (S) => ( + const y = fe(this, (G) => ( /** @description hiddenOriginalRangeStart */ - y.getHiddenOriginalRange(S).startLineNumber - 1 - )), C = new Pp(w, 12); - h.push(C), c.add(new Ez(this._editors.original, C, y, !g)); + f.getHiddenOriginalRange(G).startLineNumber - 1 + )), W = new Qp(y, 12); + h.push(W), d.add(new dA(this._editors.original, W, f, !m)); } { - const w = ye(this, (S) => ( + const y = fe(this, (G) => ( /** @description hiddenModifiedRangeStart */ - y.getHiddenModifiedRange(S).startLineNumber - 1 - )), C = new Pp(w, 12); - u.push(C), c.add(new Ez(this._editors.modified, C, y)); + f.getHiddenModifiedRange(G).startLineNumber - 1 + )), W = new Qp(y, 12); + u.push(W), d.add(new dA(this._editors.modified, W, f)); } } else { { - const w = ye(this, (S) => ( + const y = fe(this, (G) => ( /** @description hiddenOriginalRangeStart */ - y.getHiddenOriginalRange(S).startLineNumber - 1 - )), C = new Pp(w, 24); - h.push(C), c.add(new Xz(this._editors.original, C, y, y.originalUnchangedRange, !g, d, (S) => this._diffModel.get().ensureModifiedLineIsVisible(S, 2, void 0), this._options)); + f.getHiddenOriginalRange(G).startLineNumber - 1 + )), W = new Qp(y, 24); + h.push(W), d.add(new aA(this._editors.original, W, f, f.originalUnchangedRange, !m, a, (G) => this._diffModel.get().ensureModifiedLineIsVisible(G, 2, void 0), this._options)); } { - const w = ye(this, (S) => ( + const y = fe(this, (G) => ( /** @description hiddenModifiedRangeStart */ - y.getHiddenModifiedRange(S).startLineNumber - 1 - )), C = new Pp(w, 24); - u.push(C), c.add(new Xz(this._editors.modified, C, y, y.modifiedUnchangedRange, !1, d, (S) => this._diffModel.get().ensureModifiedLineIsVisible(S, 2, void 0), this._options)); + f.getHiddenModifiedRange(G).startLineNumber - 1 + )), W = new Qp(y, 24); + u.push(W), d.add(new aA(this._editors.modified, W, f, f.modifiedUnchangedRange, !1, a, (G) => this._diffModel.get().ensureModifiedLineIsVisible(G, 2, void 0), this._options)); } } } return { origViewZones: h, modViewZones: u }; }); - const r = { + const l = { description: "unchanged lines", className: "diff-unchanged-lines", isWholeLine: !0 - }, l = { + }, r = { description: "Fold Unchanged", - glyphMarginHoverMessage: new Vn(void 0, { isTrusted: !0, supportThemeIcons: !0 }).appendMarkdown(p("foldUnchanged", "Fold Unchanged Region")), - glyphMarginClassName: "fold-unchanged " + Ze.asClassName(te.fold), + glyphMarginHoverMessage: new kn(void 0, { isTrusted: !0, supportThemeIcons: !0 }).appendMarkdown(p("foldUnchanged", "Fold Unchanged Region")), + glyphMarginClassName: "fold-unchanged " + Se.asClassName(te.fold), zIndex: 10001 }; - this._register($A(this._editors.original, ye(this, (a) => { - const c = o.read(a), d = c.map((h) => ({ + this._register(bL(this._editors.original, fe(this, (c) => { + const d = o.read(c), a = d.map((h) => ({ range: h.originalUnchangedRange.toInclusiveRange(), - options: r + options: l })); - for (const h of c) - h.shouldHideControls(a) && d.push({ - range: M.fromPositions(new V(h.originalLineNumber, 1)), - options: l + for (const h of d) + h.shouldHideControls(c) && a.push({ + range: I.fromPositions(new Y(h.originalLineNumber, 1)), + options: r }); - return d; - }))), this._register($A(this._editors.modified, ye(this, (a) => { - const c = o.read(a), d = c.map((h) => ({ + return a; + }))), this._register(bL(this._editors.modified, fe(this, (c) => { + const d = o.read(c), a = d.map((h) => ({ range: h.modifiedUnchangedRange.toInclusiveRange(), - options: r + options: l })); - for (const h of c) - h.shouldHideControls(a) && d.push({ - range: We.ofLength(h.modifiedLineNumber, 1).toInclusiveRange(), - options: l + for (const h of d) + h.shouldHideControls(c) && a.push({ + range: Ne.ofLength(h.modifiedLineNumber, 1).toInclusiveRange(), + options: r }); - return d; - }))), this._register(Te((a) => { - const c = o.read(a); + return a; + }))), this._register(Te((c) => { + const d = o.read(c); this._isUpdatingHiddenAreas = !0; try { - this._editors.original.setHiddenAreas(c.map((d) => d.getHiddenOriginalRange(a).toInclusiveRange()).filter(xa)), this._editors.modified.setHiddenAreas(c.map((d) => d.getHiddenModifiedRange(a).toInclusiveRange()).filter(xa)); + this._editors.original.setHiddenAreas(d.map((a) => a.getHiddenOriginalRange(c).toInclusiveRange()).filter(Cc)), this._editors.modified.setHiddenAreas(d.map((a) => a.getHiddenModifiedRange(c).toInclusiveRange()).filter(Cc)); } finally { this._isUpdatingHiddenAreas = !1; } - })), this._register(this._editors.modified.onMouseUp((a) => { - var c; - if (!a.event.rightButton && a.target.position && ((c = a.target.element) != null && c.className.includes("fold-unchanged"))) { - const d = a.target.position.lineNumber, h = this._diffModel.get(); + })), this._register(this._editors.modified.onMouseUp((c) => { + var d; + if (!c.event.rightButton && c.target.position && ((d = c.target.element) != null && d.className.includes("fold-unchanged"))) { + const a = c.target.position.lineNumber, h = this._diffModel.get(); if (!h) return; - const u = h.unchangedRegions.get().find((g) => g.modifiedUnchangedRange.includes(d)); + const u = h.unchangedRegions.get().find((m) => m.modifiedUnchangedRange.includes(a)); if (!u) return; - u.collapseAll(void 0), a.event.stopPropagation(), a.event.preventDefault(); + u.collapseAll(void 0), c.event.stopPropagation(), c.event.preventDefault(); } - })), this._register(this._editors.original.onMouseUp((a) => { - var c; - if (!a.event.rightButton && a.target.position && ((c = a.target.element) != null && c.className.includes("fold-unchanged"))) { - const d = a.target.position.lineNumber, h = this._diffModel.get(); + })), this._register(this._editors.original.onMouseUp((c) => { + var d; + if (!c.event.rightButton && c.target.position && ((d = c.target.element) != null && d.className.includes("fold-unchanged"))) { + const a = c.target.position.lineNumber, h = this._diffModel.get(); if (!h) return; - const u = h.unchangedRegions.get().find((g) => g.originalUnchangedRange.includes(d)); + const u = h.unchangedRegions.get().find((m) => m.originalUnchangedRange.includes(a)); if (!u) return; - u.collapseAll(void 0), a.event.stopPropagation(), a.event.preventDefault(); + u.collapseAll(void 0), c.event.stopPropagation(), c.event.preventDefault(); } })); } -}, IL = yg, yg._breadcrumbsSourceFactory = Oe(IL, () => ({ +}, AX = Vm, Vm._breadcrumbsSourceFactory = Ue(AX, () => ({ dispose() { }, getBreadcrumbItems(e, t) { return []; } -})), yg); -mx = IL = Oge([ - Hge(3, Se) -], mx); -class Ez extends WX { +})), Vm); +RL = AX = Jbe([ + Hbe(3, Ge) +], RL); +class dA extends tH { constructor(e, t, i, n = !1) { - const o = Qe("div.diff-hidden-lines-widget"); - super(e, t, o.root), this._unchangedRegion = i, this._hide = n, this._nodes = Qe("div.diff-hidden-lines-compact", [ - Qe("div.line-left", []), - Qe("div.text@text", []), - Qe("div.line-right", []) - ]), o.root.appendChild(this._nodes.root), this._hide && this._nodes.root.replaceChildren(), this._register(Te((r) => { + const o = Oe("div.diff-hidden-lines-widget"); + super(e, t, o.root), this._unchangedRegion = i, this._hide = n, this._nodes = Oe("div.diff-hidden-lines-compact", [ + Oe("div.line-left", []), + Oe("div.text@text", []), + Oe("div.line-right", []) + ]), o.root.appendChild(this._nodes.root), this._hide && this._nodes.root.replaceChildren(), this._register(Te((l) => { if (!this._hide) { - const l = this._unchangedRegion.getHiddenModifiedRange(r).length, a = p("hiddenLines", "{0} hidden lines", l); - this._nodes.text.innerText = a; + const r = this._unchangedRegion.getHiddenModifiedRange(l).length, c = p("hiddenLines", "{0} hidden lines", r); + this._nodes.text.innerText = c; } })); } } -class Xz extends WX { - constructor(e, t, i, n, o, r, l, a) { - const c = Qe("div.diff-hidden-lines-widget"); - super(e, t, c.root), this._editor = e, this._unchangedRegion = i, this._unchangedRegionRange = n, this._hide = o, this._modifiedOutlineSource = r, this._revealModifiedHiddenLine = l, this._options = a, this._nodes = Qe("div.diff-hidden-lines", [ - Qe("div.top@top", { title: p("diff.hiddenLines.top", "Click or drag to show more above") }), - Qe("div.center@content", { style: { display: "flex" } }, [ - Qe("div@first", { style: { display: "flex", justifyContent: "center", alignItems: "center", flexShrink: "0" } }, [ce("a", { title: p("showUnchangedRegion", "Show Unchanged Region"), role: "button", onclick: () => { +class aA extends tH { + constructor(e, t, i, n, o, l, r, c) { + const d = Oe("div.diff-hidden-lines-widget"); + super(e, t, d.root), this._editor = e, this._unchangedRegion = i, this._unchangedRegionRange = n, this._hide = o, this._modifiedOutlineSource = l, this._revealModifiedHiddenLine = r, this._options = c, this._nodes = Oe("div.diff-hidden-lines", [ + Oe("div.top@top", { title: p("diff.hiddenLines.top", "Click or drag to show more above") }), + Oe("div.center@content", { style: { display: "flex" } }, [ + Oe("div@first", { style: { display: "flex", justifyContent: "center", alignItems: "center", flexShrink: "0" } }, [de("a", { title: p("showUnchangedRegion", "Show Unchanged Region"), role: "button", onclick: () => { this._unchangedRegion.showAll(void 0); - } }, ...ih("$(unfold)"))]), - Qe("div@others", { style: { display: "flex", justifyContent: "center", alignItems: "center" } }) + } }, ...lh("$(unfold)"))]), + Oe("div@others", { style: { display: "flex", justifyContent: "center", alignItems: "center" } }) ]), - Qe("div.bottom@bottom", { title: p("diff.bottom", "Click or drag to show more below"), role: "button" }) - ]), c.root.appendChild(this._nodes.root), this._hide ? In(this._nodes.first) : this._register(Uc(this._nodes.first, { width: oo(this._editor).layoutInfoContentLeft })), this._register(Te((h) => { + Oe("div.bottom@bottom", { title: p("diff.bottom", "Click or drag to show more below"), role: "button" }) + ]), d.root.appendChild(this._nodes.root), this._hide ? Rn(this._nodes.first) : this._register(qd(this._nodes.first, { width: ro(this._editor).layoutInfoContentLeft })), this._register(Te((h) => { const u = this._unchangedRegion.visibleLineCountTop.read(h) + this._unchangedRegion.visibleLineCountBottom.read(h) === this._unchangedRegion.lineCount; this._nodes.bottom.classList.toggle("canMoveTop", !u), this._nodes.bottom.classList.toggle("canMoveBottom", this._unchangedRegion.visibleLineCountBottom.read(h) > 0), this._nodes.top.classList.toggle("canMoveTop", this._unchangedRegion.visibleLineCountTop.read(h) > 0), this._nodes.top.classList.toggle("canMoveBottom", !u); - const g = this._unchangedRegion.isDragged.read(h), m = this._editor.getDomNode(); - m && (m.classList.toggle("draggingUnchangedRegion", !!g), g === "top" ? (m.classList.toggle("canMoveTop", this._unchangedRegion.visibleLineCountTop.read(h) > 0), m.classList.toggle("canMoveBottom", !u)) : g === "bottom" ? (m.classList.toggle("canMoveTop", !u), m.classList.toggle("canMoveBottom", this._unchangedRegion.visibleLineCountBottom.read(h) > 0)) : (m.classList.toggle("canMoveTop", !1), m.classList.toggle("canMoveBottom", !1))); + const m = this._unchangedRegion.isDragged.read(h), b = this._editor.getDomNode(); + b && (b.classList.toggle("draggingUnchangedRegion", !!m), m === "top" ? (b.classList.toggle("canMoveTop", this._unchangedRegion.visibleLineCountTop.read(h) > 0), b.classList.toggle("canMoveBottom", !u)) : m === "bottom" ? (b.classList.toggle("canMoveTop", !u), b.classList.toggle("canMoveBottom", this._unchangedRegion.visibleLineCountBottom.read(h) > 0)) : (b.classList.toggle("canMoveTop", !1), b.classList.toggle("canMoveBottom", !1))); })); - const d = this._editor; + const a = this._editor; this._register(z(this._nodes.top, "mousedown", (h) => { if (h.button !== 0) return; this._nodes.top.classList.toggle("dragging", !0), this._nodes.root.classList.toggle("dragging", !0), h.preventDefault(); const u = h.clientY; - let g = !1; - const m = this._unchangedRegion.visibleLineCountTop.get(); + let m = !1; + const b = this._unchangedRegion.visibleLineCountTop.get(); this._unchangedRegion.isDragged.set("top", void 0); - const f = xe(this._nodes.top), b = z(f, "mousemove", (w) => { - const S = w.clientY - u; - g = g || Math.abs(S) > 2; - const L = Math.round(S / d.getOption( + const g = Le(this._nodes.top), Z = z(g, "mousemove", (y) => { + const G = y.clientY - u; + m = m || Math.abs(G) > 2; + const X = Math.round(G / a.getOption( 67 /* EditorOption.lineHeight */ - )), x = Math.max(0, Math.min(m + L, this._unchangedRegion.getMaxVisibleLineCountTop())); - this._unchangedRegion.visibleLineCountTop.set(x, void 0); - }), y = z(f, "mouseup", (w) => { - g || this._unchangedRegion.showMoreAbove(this._options.hideUnchangedRegionsRevealLineCount.get(), void 0), this._nodes.top.classList.toggle("dragging", !1), this._nodes.root.classList.toggle("dragging", !1), this._unchangedRegion.isDragged.set(void 0, void 0), b.dispose(), y.dispose(); + )), L = Math.max(0, Math.min(b + X, this._unchangedRegion.getMaxVisibleLineCountTop())); + this._unchangedRegion.visibleLineCountTop.set(L, void 0); + }), f = z(g, "mouseup", (y) => { + m || this._unchangedRegion.showMoreAbove(this._options.hideUnchangedRegionsRevealLineCount.get(), void 0), this._nodes.top.classList.toggle("dragging", !1), this._nodes.root.classList.toggle("dragging", !1), this._unchangedRegion.isDragged.set(void 0, void 0), Z.dispose(), f.dispose(); }); })), this._register(z(this._nodes.bottom, "mousedown", (h) => { if (h.button !== 0) return; this._nodes.bottom.classList.toggle("dragging", !0), this._nodes.root.classList.toggle("dragging", !0), h.preventDefault(); const u = h.clientY; - let g = !1; - const m = this._unchangedRegion.visibleLineCountBottom.get(); + let m = !1; + const b = this._unchangedRegion.visibleLineCountBottom.get(); this._unchangedRegion.isDragged.set("bottom", void 0); - const f = xe(this._nodes.bottom), b = z(f, "mousemove", (w) => { - const S = w.clientY - u; - g = g || Math.abs(S) > 2; - const L = Math.round(S / d.getOption( + const g = Le(this._nodes.bottom), Z = z(g, "mousemove", (y) => { + const G = y.clientY - u; + m = m || Math.abs(G) > 2; + const X = Math.round(G / a.getOption( 67 /* EditorOption.lineHeight */ - )), x = Math.max(0, Math.min(m - L, this._unchangedRegion.getMaxVisibleLineCountBottom())), Z = this._unchangedRegionRange.endLineNumberExclusive > d.getModel().getLineCount() ? d.getContentHeight() : d.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive); - this._unchangedRegion.visibleLineCountBottom.set(x, void 0); - const _ = this._unchangedRegionRange.endLineNumberExclusive > d.getModel().getLineCount() ? d.getContentHeight() : d.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive); - d.setScrollTop(d.getScrollTop() + (_ - Z)); - }), y = z(f, "mouseup", (w) => { - if (this._unchangedRegion.isDragged.set(void 0, void 0), !g) { - const C = d.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive); + )), L = Math.max(0, Math.min(b - X, this._unchangedRegion.getMaxVisibleLineCountBottom())), S = this._unchangedRegionRange.endLineNumberExclusive > a.getModel().getLineCount() ? a.getContentHeight() : a.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive); + this._unchangedRegion.visibleLineCountBottom.set(L, void 0); + const x = this._unchangedRegionRange.endLineNumberExclusive > a.getModel().getLineCount() ? a.getContentHeight() : a.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive); + a.setScrollTop(a.getScrollTop() + (x - S)); + }), f = z(g, "mouseup", (y) => { + if (this._unchangedRegion.isDragged.set(void 0, void 0), !m) { + const W = a.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive); this._unchangedRegion.showMoreBelow(this._options.hideUnchangedRegionsRevealLineCount.get(), void 0); - const S = d.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive); - d.setScrollTop(d.getScrollTop() + (S - C)); + const G = a.getTopForLineNumber(this._unchangedRegionRange.endLineNumberExclusive); + a.setScrollTop(a.getScrollTop() + (G - W)); } - this._nodes.bottom.classList.toggle("dragging", !1), this._nodes.root.classList.toggle("dragging", !1), b.dispose(), y.dispose(); + this._nodes.bottom.classList.toggle("dragging", !1), this._nodes.root.classList.toggle("dragging", !1), Z.dispose(), f.dispose(); }); })), this._register(Te((h) => { const u = []; if (!this._hide) { - const g = i.getHiddenModifiedRange(h).length, m = p("hiddenLines", "{0} hidden lines", g), f = ce("span", { title: p("diff.hiddenLines.expandAll", "Double click to unfold") }, m); - f.addEventListener("dblclick", (w) => { - w.button === 0 && (w.preventDefault(), this._unchangedRegion.showAll(void 0)); - }), u.push(f); - const b = this._unchangedRegion.getHiddenModifiedRange(h), y = this._modifiedOutlineSource.getBreadcrumbItems(b, h); - if (y.length > 0) { - u.push(ce("span", void 0, "  |  ")); - for (let w = 0; w < y.length; w++) { - const C = y[w], S = mv.toIcon(C.kind), L = Qe("div.breadcrumb-item", { + const m = i.getHiddenModifiedRange(h).length, b = p("hiddenLines", "{0} hidden lines", m), g = de("span", { title: p("diff.hiddenLines.expandAll", "Double click to unfold") }, b); + g.addEventListener("dblclick", (y) => { + y.button === 0 && (y.preventDefault(), this._unchangedRegion.showAll(void 0)); + }), u.push(g); + const Z = this._unchangedRegion.getHiddenModifiedRange(h), f = this._modifiedOutlineSource.getBreadcrumbItems(Z, h); + if (f.length > 0) { + u.push(de("span", void 0, "  |  ")); + for (let y = 0; y < f.length; y++) { + const W = f[y], G = kw.toIcon(W.kind), X = Oe("div.breadcrumb-item", { style: { display: "flex", alignItems: "center" } }, [ - ym(S), + Vb(G), " ", - C.name, - ...w === y.length - 1 ? [] : [ym(te.chevronRight)] + W.name, + ...y === f.length - 1 ? [] : [Vb(te.chevronRight)] ]).root; - u.push(L), L.onclick = () => { - this._revealModifiedHiddenLine(C.startLineNumber); + u.push(X), X.onclick = () => { + this._revealModifiedHiddenLine(W.startLineNumber); }; } } } - In(this._nodes.others, ...u); + Rn(this._nodes.others, ...u); })); } } -var Jge = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Ebe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Uge = function(s, e) { +}, Dbe = function(s, e) { return function(t, i) { e(t, i, s); }; -}, ol, vc; -let A1 = (vc = class extends R { - constructor(e, t, i, n, o, r, l) { - super(), this._editors = e, this._rootElement = t, this._diffModel = i, this._rootWidth = n, this._rootHeight = o, this._modifiedEditorLayoutInfo = r, this._themeService = l, this.width = ol.ENTIRE_DIFF_OVERVIEW_WIDTH; - const a = St(this._themeService.onDidColorThemeChange, () => this._themeService.getColorTheme()), c = ye((u) => { - const g = a.read(u), m = g.getColor(qie) || (g.getColor(Qie) || $2).transparent(2), f = g.getColor($ie) || (g.getColor(jie) || ev).transparent(2); - return { insertColor: m, removeColor: f }; - }), d = yt(document.createElement("div")); - d.setClassName("diffViewport"), d.setPosition("absolute"); - const h = Qe("div.diffOverview", { - style: { position: "absolute", top: "0px", width: ol.ENTIRE_DIFF_OVERVIEW_WIDTH + "px" } +}, cr, kd; +let kW = (kd = class extends J { + constructor(e, t, i, n, o, l, r) { + super(), this._editors = e, this._rootElement = t, this._diffModel = i, this._rootWidth = n, this._rootHeight = o, this._modifiedEditorLayoutInfo = l, this._themeService = r, this.width = cr.ENTIRE_DIFF_OVERVIEW_WIDTH; + const c = Gt(this._themeService.onDidColorThemeChange, () => this._themeService.getColorTheme()), d = fe((u) => { + const m = c.read(u), b = m.getColor(Kne) || (m.getColor(zne) || Ww).transparent(2), g = m.getColor(Une) || (m.getColor(Ane) || Gw).transparent(2); + return { insertColor: b, removeColor: g }; + }), a = ft(document.createElement("div")); + a.setClassName("diffViewport"), a.setPosition("absolute"); + const h = Oe("div.diffOverview", { + style: { position: "absolute", top: "0px", width: cr.ENTIRE_DIFF_OVERVIEW_WIDTH + "px" } }).root; - this._register(zp(h, d.domNode)), this._register(ai(h, ie.POINTER_DOWN, (u) => { + this._register(_p(h, a.domNode)), this._register(di(h, ie.POINTER_DOWN, (u) => { this._editors.modified.delegateVerticalScrollbarPointerDown(u); })), this._register(z(h, ie.MOUSE_WHEEL, (u) => { this._editors.modified.delegateScrollFromMouseWheelEvent(u); - }, { passive: !1 })), this._register(zp(this._rootElement, h)), this._register(ks((u, g) => { - const m = this._diffModel.read(u), f = this._editors.original.createOverviewRuler("original diffOverviewRuler"); - f && (g.add(f), g.add(zp(h, f.getDomNode()))); - const b = this._editors.modified.createOverviewRuler("modified diffOverviewRuler"); - if (b && (g.add(b), g.add(zp(h, b.getDomNode()))), !f || !b) + }, { passive: !1 })), this._register(_p(this._rootElement, h)), this._register(Js((u, m) => { + const b = this._diffModel.read(u), g = this._editors.original.createOverviewRuler("original diffOverviewRuler"); + g && (m.add(g), m.add(_p(h, g.getDomNode()))); + const Z = this._editors.modified.createOverviewRuler("modified diffOverviewRuler"); + if (Z && (m.add(Z), m.add(_p(h, Z.getDomNode()))), !g || !Z) return; - const y = Zn("viewZoneChanged", this._editors.original.onDidChangeViewZones), w = Zn("viewZoneChanged", this._editors.modified.onDidChangeViewZones), C = Zn("hiddenRangesChanged", this._editors.original.onDidChangeHiddenAreas), S = Zn("hiddenRangesChanged", this._editors.modified.onDidChangeHiddenAreas); - g.add(Te((L) => { - var E; - y.read(L), w.read(L), C.read(L), S.read(L); - const x = c.read(L), Z = (E = m == null ? void 0 : m.diff.read(L)) == null ? void 0 : E.mappings; - function _(Y, B, X) { - const j = X._getViewModel(); - return j ? Y.filter((le) => le.length > 0).map((le) => { - const ue = j.coordinatesConverter.convertModelPositionToViewPosition(new V(le.startLineNumber, 1)), be = j.coordinatesConverter.convertModelPositionToViewPosition(new V(le.endLineNumberExclusive, 1)), me = be.lineNumber - ue.lineNumber; - return new BU(ue.lineNumber, be.lineNumber, me, B.toString()); + const f = xn("viewZoneChanged", this._editors.original.onDidChangeViewZones), y = xn("viewZoneChanged", this._editors.modified.onDidChangeViewZones), W = xn("hiddenRangesChanged", this._editors.original.onDidChangeHiddenAreas), G = xn("hiddenRangesChanged", this._editors.modified.onDidChangeHiddenAreas); + m.add(Te((X) => { + var H; + f.read(X), y.read(X), W.read(X), G.read(X); + const L = d.read(X), S = (H = b == null ? void 0 : b.diff.read(X)) == null ? void 0 : H.mappings; + function x(F, K, E) { + const j = E._getViewModel(); + return j ? F.filter((re) => re.length > 0).map((re) => { + const ue = j.coordinatesConverter.convertModelPositionToViewPosition(new Y(re.startLineNumber, 1)), Ze = j.coordinatesConverter.convertModelPositionToViewPosition(new Y(re.endLineNumberExclusive, 1)), be = Ze.lineNumber - ue.lineNumber; + return new SQ(ue.lineNumber, Ze.lineNumber, be, K.toString()); }) : []; } - const v = _((Z || []).map((Y) => Y.lineRangeMapping.original), x.removeColor, this._editors.original), P = _((Z || []).map((Y) => Y.lineRangeMapping.modified), x.insertColor, this._editors.modified); - f == null || f.setZones(v), b == null || b.setZones(P); - })), g.add(Te((L) => { - const x = this._rootHeight.read(L), Z = this._rootWidth.read(L), _ = this._modifiedEditorLayoutInfo.read(L); - if (_) { - const v = ol.ENTIRE_DIFF_OVERVIEW_WIDTH - 2 * ol.ONE_OVERVIEW_WIDTH; - f.setLayout({ + const w = x((S || []).map((F) => F.lineRangeMapping.original), L.removeColor, this._editors.original), A = x((S || []).map((F) => F.lineRangeMapping.modified), L.insertColor, this._editors.modified); + g == null || g.setZones(w), Z == null || Z.setZones(A); + })), m.add(Te((X) => { + const L = this._rootHeight.read(X), S = this._rootWidth.read(X), x = this._modifiedEditorLayoutInfo.read(X); + if (x) { + const w = cr.ENTIRE_DIFF_OVERVIEW_WIDTH - 2 * cr.ONE_OVERVIEW_WIDTH; + g.setLayout({ top: 0, - height: x, - right: v + ol.ONE_OVERVIEW_WIDTH, - width: ol.ONE_OVERVIEW_WIDTH - }), b.setLayout({ + height: L, + right: w + cr.ONE_OVERVIEW_WIDTH, + width: cr.ONE_OVERVIEW_WIDTH + }), Z.setLayout({ top: 0, - height: x, + height: L, right: 0, - width: ol.ONE_OVERVIEW_WIDTH + width: cr.ONE_OVERVIEW_WIDTH }); - const P = this._editors.modifiedScrollTop.read(L), E = this._editors.modifiedScrollHeight.read(L), Y = this._editors.modified.getOption( + const A = this._editors.modifiedScrollTop.read(X), H = this._editors.modifiedScrollHeight.read(X), F = this._editors.modified.getOption( 104 /* EditorOption.scrollbar */ - ), B = new pb(Y.verticalHasArrows ? Y.arrowSize : 0, Y.verticalScrollbarSize, 0, _.height, E, P); - d.setTop(B.getSliderPosition()), d.setHeight(B.getSliderSize()); + ), K = new GZ(F.verticalHasArrows ? F.arrowSize : 0, F.verticalScrollbarSize, 0, x.height, H, A); + a.setTop(K.getSliderPosition()), a.setHeight(K.getSliderSize()); } else - d.setTop(0), d.setHeight(0); - h.style.height = x + "px", h.style.left = Z - ol.ENTIRE_DIFF_OVERVIEW_WIDTH + "px", d.setWidth(ol.ENTIRE_DIFF_OVERVIEW_WIDTH); + a.setTop(0), a.setHeight(0); + h.style.height = L + "px", h.style.left = S - cr.ENTIRE_DIFF_OVERVIEW_WIDTH + "px", a.setWidth(cr.ENTIRE_DIFF_OVERVIEW_WIDTH); })); })); } -}, ol = vc, vc.ONE_OVERVIEW_WIDTH = 15, vc.ENTIRE_DIFF_OVERVIEW_WIDTH = vc.ONE_OVERVIEW_WIDTH * 2, vc); -A1 = ol = Jge([ - Uge(6, Pi) -], A1); -const yW = []; -class Kge extends R { +}, cr = kd, kd.ONE_OVERVIEW_WIDTH = 15, kd.ENTIRE_DIFF_OVERVIEW_WIDTH = kd.ONE_OVERVIEW_WIDTH * 2, kd); +kW = cr = Ebe([ + Dbe(6, Ki) +], kW); +const YR = []; +class Fbe extends J { constructor(e, t, i, n) { - super(), this._editors = e, this._diffModel = t, this._options = i, this._widget = n, this._selectedDiffs = ye(this, (o) => { - const r = this._diffModel.read(o), l = r == null ? void 0 : r.diff.read(o); - if (!l) - return yW; - const a = this._editors.modifiedSelections.read(o); - if (a.every((u) => u.isEmpty())) - return yW; - const c = new ar(a.map((u) => We.fromRangeInclusive(u))), h = l.mappings.filter((u) => u.lineRangeMapping.innerChanges && c.intersects(u.lineRangeMapping.modified)).map((u) => ({ + super(), this._editors = e, this._diffModel = t, this._options = i, this._widget = n, this._selectedDiffs = fe(this, (o) => { + const l = this._diffModel.read(o), r = l == null ? void 0 : l.diff.read(o); + if (!r) + return YR; + const c = this._editors.modifiedSelections.read(o); + if (c.every((u) => u.isEmpty())) + return YR; + const d = new al(c.map((u) => Ne.fromRangeInclusive(u))), h = r.mappings.filter((u) => u.lineRangeMapping.innerChanges && d.intersects(u.lineRangeMapping.modified)).map((u) => ({ mapping: u, - rangeMappings: u.lineRangeMapping.innerChanges.filter((g) => a.some((m) => M.areIntersecting(g.modifiedRange, m))) + rangeMappings: u.lineRangeMapping.innerChanges.filter((m) => c.some((b) => I.areIntersecting(m.modifiedRange, b))) })); - return h.length === 0 || h.every((u) => u.rangeMappings.length === 0) ? yW : h; - }), this._register(ks((o, r) => { + return h.length === 0 || h.every((u) => u.rangeMappings.length === 0) ? YR : h; + }), this._register(Js((o, l) => { if (!this._options.shouldRenderOldRevertArrows.read(o)) return; - const l = this._diffModel.read(o), a = l == null ? void 0 : l.diff.read(o); - if (!l || !a || l.movedTextToCompare.read(o)) + const r = this._diffModel.read(o), c = r == null ? void 0 : r.diff.read(o); + if (!r || !c || r.movedTextToCompare.read(o)) return; - const c = [], d = this._selectedDiffs.read(o), h = new Set(d.map((u) => u.mapping)); - if (d.length > 0) { - const u = this._editors.modifiedSelections.read(o), g = r.add(new px(u[u.length - 1].positionLineNumber, this._widget, d.flatMap((m) => m.rangeMappings), !0)); - this._editors.modified.addGlyphMarginWidget(g), c.push(g); + const d = [], a = this._selectedDiffs.read(o), h = new Set(a.map((u) => u.mapping)); + if (a.length > 0) { + const u = this._editors.modifiedSelections.read(o), m = l.add(new NL(u[u.length - 1].positionLineNumber, this._widget, a.flatMap((b) => b.rangeMappings), !0)); + this._editors.modified.addGlyphMarginWidget(m), d.push(m); } - for (const u of a.mappings) + for (const u of c.mappings) if (!h.has(u) && !u.lineRangeMapping.modified.isEmpty && u.lineRangeMapping.innerChanges) { - const g = r.add(new px(u.lineRangeMapping.modified.startLineNumber, this._widget, u.lineRangeMapping, !1)); - this._editors.modified.addGlyphMarginWidget(g), c.push(g); + const m = l.add(new NL(u.lineRangeMapping.modified.startLineNumber, this._widget, u.lineRangeMapping, !1)); + this._editors.modified.addGlyphMarginWidget(m), d.push(m); } - r.add(Ce(() => { - for (const u of c) + l.add(We(() => { + for (const u of d) this._editors.modified.removeGlyphMarginWidget(u); })); })); } } -const xZ = class xZ extends R { +const E2 = class E2 extends J { getId() { return this._id; } constructor(e, t, i, n) { - super(), this._lineNumber = e, this._widget = t, this._diffs = i, this._revertSelection = n, this._id = `revertButton${xZ.counter++}`, this._domNode = Qe("div.revertButton", { + super(), this._lineNumber = e, this._widget = t, this._diffs = i, this._revertSelection = n, this._id = `revertButton${E2.counter++}`, this._domNode = Oe("div.revertButton", { title: this._revertSelection ? p("revertSelectedChanges", "Revert Selected Changes") : p("revertChange", "Revert Change") - }, [ym(te.arrowRight)]).root, this._register(z(this._domNode, ie.MOUSE_DOWN, (o) => { + }, [Vb(te.arrowRight)]).root, this._register(z(this._domNode, ie.MOUSE_DOWN, (o) => { o.button !== 2 && (o.stopPropagation(), o.preventDefault()); })), this._register(z(this._domNode, ie.MOUSE_UP, (o) => { o.stopPropagation(), o.preventDefault(); })), this._register(z(this._domNode, ie.CLICK, (o) => { - this._diffs instanceof Qn ? this._widget.revert(this._diffs) : this._widget.revertRangeMappings(this._diffs), o.stopPropagation(), o.preventDefault(); + this._diffs instanceof qn ? this._widget.revert(this._diffs) : this._widget.revertRangeMappings(this._diffs), o.stopPropagation(), o.preventDefault(); })); } /** @@ -55014,7 +55014,7 @@ const xZ = class xZ extends R { */ getPosition() { return { - lane: Jr.Right, + lane: Ol.Right, range: { startColumn: 1, startLineNumber: this._lineNumber, @@ -55025,20 +55025,20 @@ const xZ = class xZ extends R { }; } }; -xZ.counter = 0; -let px = xZ; -function Qge(s, e, t) { - return Sde({ debugName: () => `Configuration Key "${s}"` }, (i) => t.onDidChangeConfiguration((n) => { +E2.counter = 0; +let NL = E2; +function zbe(s, e, t) { + return mhe({ debugName: () => `Configuration Key "${s}"` }, (i) => t.onDidChangeConfiguration((n) => { n.affectsConfiguration(s) && i(n); }), () => t.getValue(s) ?? e); } -function cl(s, e, t) { +function ur(s, e, t) { const i = s.bindTo(e); - return MC({ debugName: () => `Set Context Key "${s.key}"` }, (n) => { + return HG({ debugName: () => `Set Context Key "${s.key}"` }, (n) => { i.set(t(n)); }); } -const y4 = $e("progressService"), Z9 = class Z9 { +const ej = $e("progressService"), jE = class jE { constructor(e) { this.callback = e; } @@ -55046,39 +55046,39 @@ const y4 = $e("progressService"), Z9 = class Z9 { this._value = e, this.callback(this._value); } }; -Z9.None = Object.freeze({ report() { +jE.None = Object.freeze({ report() { } }); -let xl = Z9; -const qh = $e("editorProgressService"); -var jge = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +let Cr = jE; +const iu = $e("editorProgressService"); +var Abe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Fz = function(s, e) { +}, hA = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let xT = class extends R { +let UT = class extends J { get onDidContentSizeChange() { return this._onDidContentSizeChange.event; } - constructor(e, t, i, n, o, r, l) { - super(), this.originalEditorElement = e, this.modifiedEditorElement = t, this._options = i, this._argCodeEditorWidgetOptions = n, this._createInnerEditor = o, this._instantiationService = r, this._keybindingService = l, this.original = this._register(this._createLeftHandSideEditor(this._options.editorOptions.get(), this._argCodeEditorWidgetOptions.originalEditor || {})), this.modified = this._register(this._createRightHandSideEditor(this._options.editorOptions.get(), this._argCodeEditorWidgetOptions.modifiedEditor || {})), this._onDidContentSizeChange = this._register(new k()), this.modifiedScrollTop = St(this, this.modified.onDidScrollChange, () => ( + constructor(e, t, i, n, o, l, r) { + super(), this.originalEditorElement = e, this.modifiedEditorElement = t, this._options = i, this._argCodeEditorWidgetOptions = n, this._createInnerEditor = o, this._instantiationService = l, this._keybindingService = r, this.original = this._register(this._createLeftHandSideEditor(this._options.editorOptions.get(), this._argCodeEditorWidgetOptions.originalEditor || {})), this.modified = this._register(this._createRightHandSideEditor(this._options.editorOptions.get(), this._argCodeEditorWidgetOptions.modifiedEditor || {})), this._onDidContentSizeChange = this._register(new k()), this.modifiedScrollTop = Gt(this, this.modified.onDidScrollChange, () => ( /** @description modified.getScrollTop */ this.modified.getScrollTop() - )), this.modifiedScrollHeight = St(this, this.modified.onDidScrollChange, () => ( + )), this.modifiedScrollHeight = Gt(this, this.modified.onDidScrollChange, () => ( /** @description modified.getScrollHeight */ this.modified.getScrollHeight() - )), this.modifiedObs = oo(this.modified), this.originalObs = oo(this.original), this.modifiedModel = this.modifiedObs.model, this.modifiedSelections = St(this, this.modified.onDidChangeCursorSelection, () => this.modified.getSelections() ?? []), this.modifiedCursor = Vo({ owner: this, equalsFn: V.equals }, (a) => { - var c; - return ((c = this.modifiedSelections.read(a)[0]) == null ? void 0 : c.getPosition()) ?? new V(1, 1); - }), this.originalCursor = St(this, this.original.onDidChangeCursorPosition, () => this.original.getPosition() ?? new V(1, 1)), this._argCodeEditorWidgetOptions = null, this._register(ZC({ + )), this.modifiedObs = ro(this.modified), this.originalObs = ro(this.original), this.modifiedModel = this.modifiedObs.model, this.modifiedSelections = Gt(this, this.modified.onDidChangeCursorSelection, () => this.modified.getSelections() ?? []), this.modifiedCursor = vo({ owner: this, equalsFn: Y.equals }, (c) => { + var d; + return ((d = this.modifiedSelections.read(c)[0]) == null ? void 0 : d.getPosition()) ?? new Y(1, 1); + }), this.originalCursor = Gt(this, this.original.onDidChangeCursorPosition, () => this.original.getPosition() ?? new Y(1, 1)), this._argCodeEditorWidgetOptions = null, this._register(EG({ createEmptyChangeSummary: () => ({}), - handleChange: (a, c) => (a.didChange(i.editorOptions) && Object.assign(c, a.change.changedOptions), !0) - }, (a, c) => { - i.editorOptions.read(a), this._options.renderSideBySide.read(a), this.modified.updateOptions(this._adjustOptionsForRightHandSide(a, c)), this.original.updateOptions(this._adjustOptionsForLeftHandSide(a, c)); + handleChange: (c, d) => (c.didChange(i.editorOptions) && Object.assign(d, c.change.changedOptions), !0) + }, (c, d) => { + i.editorOptions.read(c), this._options.renderSideBySide.read(c), this.modified.updateOptions(this._adjustOptionsForRightHandSide(c, d)), this.original.updateOptions(this._adjustOptionsForLeftHandSide(c, d)); })); } _createLeftHandSideEditor(e, t) { @@ -55091,13 +55091,13 @@ let xT = class extends R { } _constructInnerEditor(e, t, i, n) { const o = this._createInnerEditor(e, t, i, n); - return this._register(o.onDidContentSizeChange((r) => { - const l = this.original.getContentWidth() + this.modified.getContentWidth() + A1.ENTIRE_DIFF_OVERVIEW_WIDTH, a = Math.max(this.modified.getContentHeight(), this.original.getContentHeight()); + return this._register(o.onDidContentSizeChange((l) => { + const r = this.original.getContentWidth() + this.modified.getContentWidth() + kW.ENTIRE_DIFF_OVERVIEW_WIDTH, c = Math.max(this.modified.getContentHeight(), this.original.getContentHeight()); this._onDidContentSizeChange.fire({ - contentHeight: a, - contentWidth: l, - contentHeightChanged: r.contentHeightChanged, - contentWidthChanged: r.contentWidthChanged + contentHeight: c, + contentWidth: r, + contentHeightChanged: l.contentHeightChanged, + contentWidthChanged: l.contentWidthChanged }); })), o; } @@ -55107,7 +55107,7 @@ let xT = class extends R { } _adjustOptionsForRightHandSide(e, t) { const i = this._adjustOptionsForSubEditor(t); - return t.modifiedAriaLabel && (i.ariaLabel = t.modifiedAriaLabel), i.ariaLabel = this._updateAriaLabel(i.ariaLabel), i.wordWrapOverride1 = this._options.diffWordWrap.get(), i.revealHorizontalRightPadding = El.revealHorizontalRightPadding.defaultValue + A1.ENTIRE_DIFF_OVERVIEW_WIDTH, i.scrollbar.verticalHasArrows = !1, i.extraEditorClassName = "modified-in-monaco-diff-editor", i; + return t.modifiedAriaLabel && (i.ariaLabel = t.modifiedAriaLabel), i.ariaLabel = this._updateAriaLabel(i.ariaLabel), i.wordWrapOverride1 = this._options.diffWordWrap.get(), i.revealHorizontalRightPadding = zr.revealHorizontalRightPadding.defaultValue + kW.ENTIRE_DIFF_OVERVIEW_WIDTH, i.scrollbar.verticalHasArrows = !1, i.extraEditorClassName = "modified-in-monaco-diff-editor", i; } _adjustOptionsForSubEditor(e) { const t = { @@ -55126,13 +55126,13 @@ let xT = class extends R { return this._options.accessibilityVerbose.get() ? e + t : e ? e.replaceAll(t, "") : ""; } }; -xT = jge([ - Fz(5, Se), - Fz(6, xt) -], xT); -const MZ = class MZ extends R { +UT = Abe([ + hA(5, Ge), + hA(6, Lt) +], UT); +const D2 = class D2 extends J { constructor() { - super(...arguments), this._id = ++MZ.idCounter, this._onDidDispose = this._register(new k()), this.onDidDispose = this._onDidDispose.event; + super(...arguments), this._id = ++D2.idCounter, this._onDidDispose = this._register(new k()), this.onDidDispose = this._onDidDispose.event; } getId() { return this.getEditorType() + ":v2:" + this._id; @@ -55229,8 +55229,8 @@ const MZ = class MZ extends R { return this._targetEditor.changeDecorations(e); } }; -MZ.idCounter = 0; -let MT = MZ; +D2.idCounter = 0; +let PT = D2; const yn = { enableSplitViewResizing: !0, renderSideBySide: !0, @@ -55263,30 +55263,30 @@ const yn = { useInlineViewWhenSpaceIsLimited: !0, compactMode: !1 }; -var qge = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Kbe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, $ge = function(s, e) { +}, Ube = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let ZT = class { +let BT = class { get editorOptions() { return this._options; } constructor(e, t) { - this._accessibilityService = t, this._diffEditorWidth = Oe(this, 0), this._screenReaderMode = St(this, this._accessibilityService.onDidChangeScreenReaderOptimized, () => this._accessibilityService.isScreenReaderOptimized()), this.couldShowInlineViewBecauseOfSize = ye(this, (n) => this._options.read(n).renderSideBySide && this._diffEditorWidth.read(n) <= this._options.read(n).renderSideBySideInlineBreakpoint), this.renderOverviewRuler = ye(this, (n) => this._options.read(n).renderOverviewRuler), this.renderSideBySide = ye(this, (n) => this.compactMode.read(n) && this.shouldRenderInlineViewInSmartMode.read(n) ? !1 : this._options.read(n).renderSideBySide && !(this._options.read(n).useInlineViewWhenSpaceIsLimited && this.couldShowInlineViewBecauseOfSize.read(n) && !this._screenReaderMode.read(n))), this.readOnly = ye(this, (n) => this._options.read(n).readOnly), this.shouldRenderOldRevertArrows = ye(this, (n) => !(!this._options.read(n).renderMarginRevertIcon || !this.renderSideBySide.read(n) || this.readOnly.read(n) || this.shouldRenderGutterMenu.read(n))), this.shouldRenderGutterMenu = ye(this, (n) => this._options.read(n).renderGutterMenu), this.renderIndicators = ye(this, (n) => this._options.read(n).renderIndicators), this.enableSplitViewResizing = ye(this, (n) => this._options.read(n).enableSplitViewResizing), this.splitViewDefaultRatio = ye(this, (n) => this._options.read(n).splitViewDefaultRatio), this.ignoreTrimWhitespace = ye(this, (n) => this._options.read(n).ignoreTrimWhitespace), this.maxComputationTimeMs = ye(this, (n) => this._options.read(n).maxComputationTime), this.showMoves = ye(this, (n) => this._options.read(n).experimental.showMoves && this.renderSideBySide.read(n)), this.isInEmbeddedEditor = ye(this, (n) => this._options.read(n).isInEmbeddedEditor), this.diffWordWrap = ye(this, (n) => this._options.read(n).diffWordWrap), this.originalEditable = ye(this, (n) => this._options.read(n).originalEditable), this.diffCodeLens = ye(this, (n) => this._options.read(n).diffCodeLens), this.accessibilityVerbose = ye(this, (n) => this._options.read(n).accessibilityVerbose), this.diffAlgorithm = ye(this, (n) => this._options.read(n).diffAlgorithm), this.showEmptyDecorations = ye(this, (n) => this._options.read(n).experimental.showEmptyDecorations), this.onlyShowAccessibleDiffViewer = ye(this, (n) => this._options.read(n).onlyShowAccessibleDiffViewer), this.compactMode = ye(this, (n) => this._options.read(n).compactMode), this.trueInlineDiffRenderingEnabled = ye(this, (n) => this._options.read(n).experimental.useTrueInlineView), this.useTrueInlineDiffRendering = ye(this, (n) => !this.renderSideBySide.read(n) && this.trueInlineDiffRenderingEnabled.read(n)), this.hideUnchangedRegions = ye(this, (n) => this._options.read(n).hideUnchangedRegions.enabled), this.hideUnchangedRegionsRevealLineCount = ye(this, (n) => this._options.read(n).hideUnchangedRegions.revealLineCount), this.hideUnchangedRegionsContextLineCount = ye(this, (n) => this._options.read(n).hideUnchangedRegions.contextLineCount), this.hideUnchangedRegionsMinimumLineCount = ye(this, (n) => this._options.read(n).hideUnchangedRegions.minimumLineCount), this._model = Oe(this, void 0), this.shouldRenderInlineViewInSmartMode = this._model.map(this, (n) => Mde(this, (o) => { - const r = n == null ? void 0 : n.diff.read(o); - return r ? eme(r, this.trueInlineDiffRenderingEnabled.read(o)) : void 0; + this._accessibilityService = t, this._diffEditorWidth = Ue(this, 0), this._screenReaderMode = Gt(this, this._accessibilityService.onDidChangeScreenReaderOptimized, () => this._accessibilityService.isScreenReaderOptimized()), this.couldShowInlineViewBecauseOfSize = fe(this, (n) => this._options.read(n).renderSideBySide && this._diffEditorWidth.read(n) <= this._options.read(n).renderSideBySideInlineBreakpoint), this.renderOverviewRuler = fe(this, (n) => this._options.read(n).renderOverviewRuler), this.renderSideBySide = fe(this, (n) => this.compactMode.read(n) && this.shouldRenderInlineViewInSmartMode.read(n) ? !1 : this._options.read(n).renderSideBySide && !(this._options.read(n).useInlineViewWhenSpaceIsLimited && this.couldShowInlineViewBecauseOfSize.read(n) && !this._screenReaderMode.read(n))), this.readOnly = fe(this, (n) => this._options.read(n).readOnly), this.shouldRenderOldRevertArrows = fe(this, (n) => !(!this._options.read(n).renderMarginRevertIcon || !this.renderSideBySide.read(n) || this.readOnly.read(n) || this.shouldRenderGutterMenu.read(n))), this.shouldRenderGutterMenu = fe(this, (n) => this._options.read(n).renderGutterMenu), this.renderIndicators = fe(this, (n) => this._options.read(n).renderIndicators), this.enableSplitViewResizing = fe(this, (n) => this._options.read(n).enableSplitViewResizing), this.splitViewDefaultRatio = fe(this, (n) => this._options.read(n).splitViewDefaultRatio), this.ignoreTrimWhitespace = fe(this, (n) => this._options.read(n).ignoreTrimWhitespace), this.maxComputationTimeMs = fe(this, (n) => this._options.read(n).maxComputationTime), this.showMoves = fe(this, (n) => this._options.read(n).experimental.showMoves && this.renderSideBySide.read(n)), this.isInEmbeddedEditor = fe(this, (n) => this._options.read(n).isInEmbeddedEditor), this.diffWordWrap = fe(this, (n) => this._options.read(n).diffWordWrap), this.originalEditable = fe(this, (n) => this._options.read(n).originalEditable), this.diffCodeLens = fe(this, (n) => this._options.read(n).diffCodeLens), this.accessibilityVerbose = fe(this, (n) => this._options.read(n).accessibilityVerbose), this.diffAlgorithm = fe(this, (n) => this._options.read(n).diffAlgorithm), this.showEmptyDecorations = fe(this, (n) => this._options.read(n).experimental.showEmptyDecorations), this.onlyShowAccessibleDiffViewer = fe(this, (n) => this._options.read(n).onlyShowAccessibleDiffViewer), this.compactMode = fe(this, (n) => this._options.read(n).compactMode), this.trueInlineDiffRenderingEnabled = fe(this, (n) => this._options.read(n).experimental.useTrueInlineView), this.useTrueInlineDiffRendering = fe(this, (n) => !this.renderSideBySide.read(n) && this.trueInlineDiffRenderingEnabled.read(n)), this.hideUnchangedRegions = fe(this, (n) => this._options.read(n).hideUnchangedRegions.enabled), this.hideUnchangedRegionsRevealLineCount = fe(this, (n) => this._options.read(n).hideUnchangedRegions.revealLineCount), this.hideUnchangedRegionsContextLineCount = fe(this, (n) => this._options.read(n).hideUnchangedRegions.contextLineCount), this.hideUnchangedRegionsMinimumLineCount = fe(this, (n) => this._options.read(n).hideUnchangedRegions.minimumLineCount), this._model = Ue(this, void 0), this.shouldRenderInlineViewInSmartMode = this._model.map(this, (n) => Zhe(this, (o) => { + const l = n == null ? void 0 : n.diff.read(o); + return l ? Pbe(l, this.trueInlineDiffRenderingEnabled.read(o)) : void 0; })).flatten().map(this, (n) => !!n), this.inlineViewHideOriginalLineNumbers = this.compactMode; - const i = { ...e, ...Yz(e, yn) }; - this._options = Oe(this, i); + const i = { ...e, ...uA(e, yn) }; + this._options = Ue(this, i); } updateOptions(e) { - const t = Yz(e, this._options.get()), i = { ...this._options.get(), ...e, ...t }; + const t = uA(e, this._options.get()), i = { ...this._options.get(), ...e, ...t }; this._options.set(i, void 0, { changedOptions: e }); } setWidth(e) { @@ -55296,232 +55296,232 @@ let ZT = class { this._model.set(e, void 0); } }; -ZT = qge([ - $ge(1, yo) -], ZT); -function eme(s, e) { - return s.mappings.every((t) => tme(t.lineRangeMapping) || ime(t.lineRangeMapping) || e && FX(t.lineRangeMapping)); +BT = Kbe([ + Ube(1, Wo) +], BT); +function Pbe(s, e) { + return s.mappings.every((t) => Bbe(t.lineRangeMapping) || _be(t.lineRangeMapping) || e && hH(t.lineRangeMapping)); } -function tme(s) { +function Bbe(s) { return s.original.length === 0; } -function ime(s) { +function _be(s) { return s.modified.length === 0; } -function Yz(s, e) { - var t, i, n, o, r, l, a, c; +function uA(s, e) { + var t, i, n, o, l, r, c, d; return { - enableSplitViewResizing: we(s.enableSplitViewResizing, e.enableSplitViewResizing), - splitViewDefaultRatio: xte(s.splitViewDefaultRatio, 0.5, 0.1, 0.9), - renderSideBySide: we(s.renderSideBySide, e.renderSideBySide), - renderMarginRevertIcon: we(s.renderMarginRevertIcon, e.renderMarginRevertIcon), - maxComputationTime: Au( + enableSplitViewResizing: ye(s.enableSplitViewResizing, e.enableSplitViewResizing), + splitViewDefaultRatio: gie(s.splitViewDefaultRatio, 0.5, 0.1, 0.9), + renderSideBySide: ye(s.renderSideBySide, e.renderSideBySide), + renderMarginRevertIcon: ye(s.renderMarginRevertIcon, e.renderMarginRevertIcon), + maxComputationTime: Cu( s.maxComputationTime, e.maxComputationTime, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */ ), - maxFileSize: Au( + maxFileSize: Cu( s.maxFileSize, e.maxFileSize, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */ ), - ignoreTrimWhitespace: we(s.ignoreTrimWhitespace, e.ignoreTrimWhitespace), - renderIndicators: we(s.renderIndicators, e.renderIndicators), - originalEditable: we(s.originalEditable, e.originalEditable), - diffCodeLens: we(s.diffCodeLens, e.diffCodeLens), - renderOverviewRuler: we(s.renderOverviewRuler, e.renderOverviewRuler), - diffWordWrap: hi(s.diffWordWrap, e.diffWordWrap, ["off", "on", "inherit"]), - diffAlgorithm: hi(s.diffAlgorithm, e.diffAlgorithm, ["legacy", "advanced"], { smart: "legacy", experimental: "advanced" }), - accessibilityVerbose: we(s.accessibilityVerbose, e.accessibilityVerbose), + ignoreTrimWhitespace: ye(s.ignoreTrimWhitespace, e.ignoreTrimWhitespace), + renderIndicators: ye(s.renderIndicators, e.renderIndicators), + originalEditable: ye(s.originalEditable, e.originalEditable), + diffCodeLens: ye(s.diffCodeLens, e.diffCodeLens), + renderOverviewRuler: ye(s.renderOverviewRuler, e.renderOverviewRuler), + diffWordWrap: ui(s.diffWordWrap, e.diffWordWrap, ["off", "on", "inherit"]), + diffAlgorithm: ui(s.diffAlgorithm, e.diffAlgorithm, ["legacy", "advanced"], { smart: "legacy", experimental: "advanced" }), + accessibilityVerbose: ye(s.accessibilityVerbose, e.accessibilityVerbose), experimental: { - showMoves: we((t = s.experimental) == null ? void 0 : t.showMoves, e.experimental.showMoves), - showEmptyDecorations: we((i = s.experimental) == null ? void 0 : i.showEmptyDecorations, e.experimental.showEmptyDecorations), - useTrueInlineView: we((n = s.experimental) == null ? void 0 : n.useTrueInlineView, e.experimental.useTrueInlineView) + showMoves: ye((t = s.experimental) == null ? void 0 : t.showMoves, e.experimental.showMoves), + showEmptyDecorations: ye((i = s.experimental) == null ? void 0 : i.showEmptyDecorations, e.experimental.showEmptyDecorations), + useTrueInlineView: ye((n = s.experimental) == null ? void 0 : n.useTrueInlineView, e.experimental.useTrueInlineView) }, hideUnchangedRegions: { - enabled: we(((o = s.hideUnchangedRegions) == null ? void 0 : o.enabled) ?? ((r = s.experimental) == null ? void 0 : r.collapseUnchangedRegions), e.hideUnchangedRegions.enabled), - contextLineCount: Au( - (l = s.hideUnchangedRegions) == null ? void 0 : l.contextLineCount, + enabled: ye(((o = s.hideUnchangedRegions) == null ? void 0 : o.enabled) ?? ((l = s.experimental) == null ? void 0 : l.collapseUnchangedRegions), e.hideUnchangedRegions.enabled), + contextLineCount: Cu( + (r = s.hideUnchangedRegions) == null ? void 0 : r.contextLineCount, e.hideUnchangedRegions.contextLineCount, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */ ), - minimumLineCount: Au( - (a = s.hideUnchangedRegions) == null ? void 0 : a.minimumLineCount, + minimumLineCount: Cu( + (c = s.hideUnchangedRegions) == null ? void 0 : c.minimumLineCount, e.hideUnchangedRegions.minimumLineCount, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */ ), - revealLineCount: Au( - (c = s.hideUnchangedRegions) == null ? void 0 : c.revealLineCount, + revealLineCount: Cu( + (d = s.hideUnchangedRegions) == null ? void 0 : d.revealLineCount, e.hideUnchangedRegions.revealLineCount, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */ ) }, - isInEmbeddedEditor: we(s.isInEmbeddedEditor, e.isInEmbeddedEditor), - onlyShowAccessibleDiffViewer: we(s.onlyShowAccessibleDiffViewer, e.onlyShowAccessibleDiffViewer), - renderSideBySideInlineBreakpoint: Au( + isInEmbeddedEditor: ye(s.isInEmbeddedEditor, e.isInEmbeddedEditor), + onlyShowAccessibleDiffViewer: ye(s.onlyShowAccessibleDiffViewer, e.onlyShowAccessibleDiffViewer), + renderSideBySideInlineBreakpoint: Cu( s.renderSideBySideInlineBreakpoint, e.renderSideBySideInlineBreakpoint, 0, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */ ), - useInlineViewWhenSpaceIsLimited: we(s.useInlineViewWhenSpaceIsLimited, e.useInlineViewWhenSpaceIsLimited), - renderGutterMenu: we(s.renderGutterMenu, e.renderGutterMenu), - compactMode: we(s.compactMode, e.compactMode) + useInlineViewWhenSpaceIsLimited: ye(s.useInlineViewWhenSpaceIsLimited, e.useInlineViewWhenSpaceIsLimited), + renderGutterMenu: ye(s.renderGutterMenu, e.renderGutterMenu), + compactMode: ye(s.compactMode, e.compactMode) }; } -var nme = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Qbe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Y0 = function(s, e) { +}, _0 = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let Kc = class extends MT { +let $d = class extends PT { get onDidContentSizeChange() { return this._editors.onDidContentSizeChange; } - constructor(e, t, i, n, o, r, l, a) { - super(), this._domElement = e, this._parentContextKeyService = n, this._parentInstantiationService = o, this._accessibilitySignalService = l, this._editorProgressService = a, this.elements = Qe("div.monaco-diff-editor.side-by-side", { style: { position: "relative", height: "100%" } }, [ - Qe("div.editor.original@original", { style: { position: "absolute", height: "100%" } }), - Qe("div.editor.modified@modified", { style: { position: "absolute", height: "100%" } }), - Qe("div.accessibleDiffViewer@accessibleDiffViewer", { style: { position: "absolute", height: "100%" } }) - ]), this._diffModelSrc = this._register(p1(this, void 0)), this._diffModel = ye(this, (S) => { - var L; - return (L = this._diffModelSrc.read(S)) == null ? void 0 : L.object; - }), this.onDidChangeModel = se.fromObservableLight(this._diffModel), this._contextKeyService = this._register(this._parentContextKeyService.createScoped(this._domElement)), this._instantiationService = this._register(this._parentInstantiationService.createChild(new l0([_e, this._contextKeyService]))), this._boundarySashes = Oe(this, void 0), this._accessibleDiffViewerShouldBeVisible = Oe(this, !1), this._accessibleDiffViewerVisible = ye(this, (S) => this._options.onlyShowAccessibleDiffViewer.read(S) ? !0 : this._accessibleDiffViewerShouldBeVisible.read(S)), this._movedBlocksLinesPart = Oe(this, void 0), this._layoutInfo = ye(this, (S) => { - var ue, be; - const L = this._rootSizeObserver.width.read(S), x = this._rootSizeObserver.height.read(S); - this._rootSizeObserver.automaticLayout ? this.elements.root.style.height = "100%" : this.elements.root.style.height = x + "px"; - const Z = this._sash.read(S), _ = this._gutter.read(S), v = (_ == null ? void 0 : _.width.read(S)) ?? 0, P = ((ue = this._overviewRulerPart.read(S)) == null ? void 0 : ue.width) ?? 0; - let E, Y, B, X, j; - if (!!Z) { - const me = Z.sashLeft.read(S), Ve = ((be = this._movedBlocksLinesPart.read(S)) == null ? void 0 : be.width.read(S)) ?? 0; - E = 0, Y = me - v - Ve, j = me - v, B = me, X = L - B - P; + constructor(e, t, i, n, o, l, r, c) { + super(), this._domElement = e, this._parentContextKeyService = n, this._parentInstantiationService = o, this._accessibilitySignalService = r, this._editorProgressService = c, this.elements = Oe("div.monaco-diff-editor.side-by-side", { style: { position: "relative", height: "100%" } }, [ + Oe("div.editor.original@original", { style: { position: "absolute", height: "100%" } }), + Oe("div.editor.modified@modified", { style: { position: "absolute", height: "100%" } }), + Oe("div.accessibleDiffViewer@accessibleDiffViewer", { style: { position: "absolute", height: "100%" } }) + ]), this._diffModelSrc = this._register(xW(this, void 0)), this._diffModel = fe(this, (G) => { + var X; + return (X = this._diffModelSrc.read(G)) == null ? void 0 : X.object; + }), this.onDidChangeModel = se.fromObservableLight(this._diffModel), this._contextKeyService = this._register(this._parentContextKeyService.createScoped(this._domElement)), this._instantiationService = this._register(this._parentInstantiationService.createChild(new m0([xe, this._contextKeyService]))), this._boundarySashes = Ue(this, void 0), this._accessibleDiffViewerShouldBeVisible = Ue(this, !1), this._accessibleDiffViewerVisible = fe(this, (G) => this._options.onlyShowAccessibleDiffViewer.read(G) ? !0 : this._accessibleDiffViewerShouldBeVisible.read(G)), this._movedBlocksLinesPart = Ue(this, void 0), this._layoutInfo = fe(this, (G) => { + var ue, Ze; + const X = this._rootSizeObserver.width.read(G), L = this._rootSizeObserver.height.read(G); + this._rootSizeObserver.automaticLayout ? this.elements.root.style.height = "100%" : this.elements.root.style.height = L + "px"; + const S = this._sash.read(G), x = this._gutter.read(G), w = (x == null ? void 0 : x.width.read(G)) ?? 0, A = ((ue = this._overviewRulerPart.read(G)) == null ? void 0 : ue.width) ?? 0; + let H, F, K, E, j; + if (!!S) { + const be = S.sashLeft.read(G), Ye = ((Ze = this._movedBlocksLinesPart.read(G)) == null ? void 0 : Ze.width.read(G)) ?? 0; + H = 0, F = be - w - Ye, j = be - w, K = be, E = X - K - A; } else { j = 0; - const me = this._options.inlineViewHideOriginalLineNumbers.read(S); - E = v, me ? Y = 0 : Y = Math.max(5, this._editors.originalObs.layoutInfoDecorationsLeft.read(S)), B = v + Y, X = L - B - P; + const be = this._options.inlineViewHideOriginalLineNumbers.read(G); + H = w, be ? F = 0 : F = Math.max(5, this._editors.originalObs.layoutInfoDecorationsLeft.read(G)), K = w + F, E = X - K - A; } - return this.elements.original.style.left = E + "px", this.elements.original.style.width = Y + "px", this._editors.original.layout({ width: Y, height: x }, !0), _ == null || _.layout(j), this.elements.modified.style.left = B + "px", this.elements.modified.style.width = X + "px", this._editors.modified.layout({ width: X, height: x }, !0), { + return this.elements.original.style.left = H + "px", this.elements.original.style.width = F + "px", this._editors.original.layout({ width: F, height: L }, !0), x == null || x.layout(j), this.elements.modified.style.left = K + "px", this.elements.modified.style.width = E + "px", this._editors.modified.layout({ width: E, height: L }, !0), { modifiedEditor: this._editors.modified.getLayoutInfo(), originalEditor: this._editors.original.getLayoutInfo() }; - }), this._diffValue = this._diffModel.map((S, L) => S == null ? void 0 : S.diff.read(L)), this.onDidUpdateDiff = se.fromObservableLight(this._diffValue), r.willCreateDiffEditor(), this._contextKeyService.createKey("isInDiffEditor", !0), this._domElement.appendChild(this.elements.root), this._register(Ce(() => this.elements.root.remove())), this._rootSizeObserver = this._register(new jK(this.elements.root, t.dimension)), this._rootSizeObserver.setAutomaticLayout(t.automaticLayout ?? !1), this._options = this._instantiationService.createInstance(ZT, t), this._register(Te((S) => { - this._options.setWidth(this._rootSizeObserver.width.read(S)); - })), this._contextKeyService.createKey(I.isEmbeddedDiffEditor.key, !1), this._register(cl(I.isEmbeddedDiffEditor, this._contextKeyService, (S) => this._options.isInEmbeddedEditor.read(S))), this._register(cl(I.comparingMovedCode, this._contextKeyService, (S) => { - var L; - return !!((L = this._diffModel.read(S)) != null && L.movedTextToCompare.read(S)); - })), this._register(cl(I.diffEditorRenderSideBySideInlineBreakpointReached, this._contextKeyService, (S) => this._options.couldShowInlineViewBecauseOfSize.read(S))), this._register(cl(I.diffEditorInlineMode, this._contextKeyService, (S) => !this._options.renderSideBySide.read(S))), this._register(cl(I.hasChanges, this._contextKeyService, (S) => { - var L, x; - return (((x = (L = this._diffModel.read(S)) == null ? void 0 : L.diff.read(S)) == null ? void 0 : x.mappings.length) ?? 0) > 0; - })), this._editors = this._register(this._instantiationService.createInstance(xT, this.elements.original, this.elements.modified, this._options, i, (S, L, x, Z) => this._createInnerEditor(S, L, x, Z))), this._register(cl(I.diffEditorOriginalWritable, this._contextKeyService, (S) => this._options.originalEditable.read(S))), this._register(cl(I.diffEditorModifiedWritable, this._contextKeyService, (S) => !this._options.readOnly.read(S))), this._register(cl(I.diffEditorOriginalUri, this._contextKeyService, (S) => { - var L; - return ((L = this._diffModel.read(S)) == null ? void 0 : L.model.original.uri.toString()) ?? ""; - })), this._register(cl(I.diffEditorModifiedUri, this._contextKeyService, (S) => { - var L; - return ((L = this._diffModel.read(S)) == null ? void 0 : L.model.modified.uri.toString()) ?? ""; - })), this._overviewRulerPart = Un(this, (S) => this._options.renderOverviewRuler.read(S) ? this._instantiationService.createInstance(eo(A1, S), this._editors, this.elements.root, this._diffModel, this._rootSizeObserver.width, this._rootSizeObserver.height, this._layoutInfo.map((L) => L.modifiedEditor)) : void 0).recomputeInitiallyAndOnChange(this._store); - const c = { + }), this._diffValue = this._diffModel.map((G, X) => G == null ? void 0 : G.diff.read(X)), this.onDidUpdateDiff = se.fromObservableLight(this._diffValue), l.willCreateDiffEditor(), this._contextKeyService.createKey("isInDiffEditor", !0), this._domElement.appendChild(this.elements.root), this._register(We(() => this.elements.root.remove())), this._rootSizeObserver = this._register(new MO(this.elements.root, t.dimension)), this._rootSizeObserver.setAutomaticLayout(t.automaticLayout ?? !1), this._options = this._instantiationService.createInstance(BT, t), this._register(Te((G) => { + this._options.setWidth(this._rootSizeObserver.width.read(G)); + })), this._contextKeyService.createKey(C.isEmbeddedDiffEditor.key, !1), this._register(ur(C.isEmbeddedDiffEditor, this._contextKeyService, (G) => this._options.isInEmbeddedEditor.read(G))), this._register(ur(C.comparingMovedCode, this._contextKeyService, (G) => { + var X; + return !!((X = this._diffModel.read(G)) != null && X.movedTextToCompare.read(G)); + })), this._register(ur(C.diffEditorRenderSideBySideInlineBreakpointReached, this._contextKeyService, (G) => this._options.couldShowInlineViewBecauseOfSize.read(G))), this._register(ur(C.diffEditorInlineMode, this._contextKeyService, (G) => !this._options.renderSideBySide.read(G))), this._register(ur(C.hasChanges, this._contextKeyService, (G) => { + var X, L; + return (((L = (X = this._diffModel.read(G)) == null ? void 0 : X.diff.read(G)) == null ? void 0 : L.mappings.length) ?? 0) > 0; + })), this._editors = this._register(this._instantiationService.createInstance(UT, this.elements.original, this.elements.modified, this._options, i, (G, X, L, S) => this._createInnerEditor(G, X, L, S))), this._register(ur(C.diffEditorOriginalWritable, this._contextKeyService, (G) => this._options.originalEditable.read(G))), this._register(ur(C.diffEditorModifiedWritable, this._contextKeyService, (G) => !this._options.readOnly.read(G))), this._register(ur(C.diffEditorOriginalUri, this._contextKeyService, (G) => { + var X; + return ((X = this._diffModel.read(G)) == null ? void 0 : X.model.original.uri.toString()) ?? ""; + })), this._register(ur(C.diffEditorModifiedUri, this._contextKeyService, (G) => { + var X; + return ((X = this._diffModel.read(G)) == null ? void 0 : X.model.modified.uri.toString()) ?? ""; + })), this._overviewRulerPart = On(this, (G) => this._options.renderOverviewRuler.read(G) ? this._instantiationService.createInstance(io(kW, G), this._editors, this.elements.root, this._diffModel, this._rootSizeObserver.width, this._rootSizeObserver.height, this._layoutInfo.map((X) => X.modifiedEditor)) : void 0).recomputeInitiallyAndOnChange(this._store); + const d = { height: this._rootSizeObserver.height, - width: this._rootSizeObserver.width.map((S, L) => { - var x; - return S - (((x = this._overviewRulerPart.read(L)) == null ? void 0 : x.width) ?? 0); + width: this._rootSizeObserver.width.map((G, X) => { + var L; + return G - (((L = this._overviewRulerPart.read(X)) == null ? void 0 : L.width) ?? 0); }) }; - this._sashLayout = new wge(this._options, c), this._sash = Un(this, (S) => { - const L = this._options.renderSideBySide.read(S); - return this.elements.root.classList.toggle("side-by-side", L), L ? new d4(this.elements.root, c, this._options.enableSplitViewResizing, this._boundarySashes, this._sashLayout.sashLeft, () => this._sashLayout.resetSash()) : void 0; + this._sashLayout = new hbe(this._options, d), this._sash = On(this, (G) => { + const X = this._options.renderSideBySide.read(G); + return this.elements.root.classList.toggle("side-by-side", X), X ? new PO(this.elements.root, d, this._options.enableSplitViewResizing, this._boundarySashes, this._sashLayout.sashLeft, () => this._sashLayout.resetSash()) : void 0; }).recomputeInitiallyAndOnChange(this._store); - const d = Un(this, (S) => ( + const a = On(this, (G) => ( /** @description UnchangedRangesFeature */ - this._instantiationService.createInstance(eo(mx, S), this._editors, this._diffModel, this._options) + this._instantiationService.createInstance(io(RL, G), this._editors, this._diffModel, this._options) )).recomputeInitiallyAndOnChange(this._store); - Un(this, (S) => ( + On(this, (G) => ( /** @description DiffEditorDecorations */ - this._instantiationService.createInstance(eo(gge, S), this._editors, this._diffModel, this._options, this) + this._instantiationService.createInstance(io(obe, G), this._editors, this._diffModel, this._options, this) )).recomputeInitiallyAndOnChange(this._store); const h = /* @__PURE__ */ new Set(), u = /* @__PURE__ */ new Set(); - let g = !1; - const m = Un(this, (S) => ( + let m = !1; + const b = On(this, (G) => ( /** @description ViewZoneManager */ - this._instantiationService.createInstance(eo(uT, S), xe(this._domElement), this._editors, this._diffModel, this._options, this, () => g || d.get().isUpdatingHiddenAreas, h, u) - )).recomputeInitiallyAndOnChange(this._store), f = ye(this, (S) => { - const L = m.read(S).viewZones.read(S).orig, x = d.read(S).viewZones.read(S).origViewZones; - return L.concat(x); - }), b = ye(this, (S) => { - const L = m.read(S).viewZones.read(S).mod, x = d.read(S).viewZones.read(S).modViewZones; - return L.concat(x); - }); - this._register(ex(this._editors.original, f, (S) => { - g = S; + this._instantiationService.createInstance(io(MT, G), Le(this._domElement), this._editors, this._diffModel, this._options, this, () => m || a.get().isUpdatingHiddenAreas, h, u) + )).recomputeInitiallyAndOnChange(this._store), g = fe(this, (G) => { + const X = b.read(G).viewZones.read(G).orig, L = a.read(G).viewZones.read(G).origViewZones; + return X.concat(L); + }), Z = fe(this, (G) => { + const X = b.read(G).viewZones.read(G).mod, L = a.read(G).viewZones.read(G).modViewZones; + return X.concat(L); + }); + this._register(pL(this._editors.original, g, (G) => { + m = G; }, h)); - let y; - this._register(ex(this._editors.modified, b, (S) => { - g = S, g ? y = Vl.capture(this._editors.modified) : (y == null || y.restore(this._editors.modified), y = void 0); - }, u)), this._accessibleDiffViewer = Un(this, (S) => this._instantiationService.createInstance(eo(tg, S), this.elements.accessibleDiffViewer, this._accessibleDiffViewerVisible, (L, x) => this._accessibleDiffViewerShouldBeVisible.set(L, x), this._options.onlyShowAccessibleDiffViewer.map((L) => !L), this._rootSizeObserver.width, this._rootSizeObserver.height, this._diffModel.map((L, x) => { - var Z; - return (Z = L == null ? void 0 : L.diff.read(x)) == null ? void 0 : Z.mappings.map((_) => _.lineRangeMapping); - }), new Gue(this._editors))).recomputeInitiallyAndOnChange(this._store); - const w = this._accessibleDiffViewerVisible.map((S) => S ? "hidden" : "visible"); - this._register(Uc(this.elements.modified, { visibility: w })), this._register(Uc(this.elements.original, { visibility: w })), this._createDiffEditorContributions(), r.addDiffEditor(this), this._gutter = Un(this, (S) => this._options.shouldRenderGutterMenu.read(S) ? this._instantiationService.createInstance(eo(CT, S), this.elements.root, this._diffModel, this._editors, this._options, this._sashLayout, this._boundarySashes) : void 0), this._register(h0(this._layoutInfo)), Un(this, (S) => ( + let f; + this._register(pL(this._editors.modified, Z, (G) => { + m = G, m ? f = Hr.capture(this._editors.modified) : (f == null || f.restore(this._editors.modified), f = void 0); + }, u)), this._accessibleDiffViewer = On(this, (G) => this._instantiationService.createInstance(io(lm, G), this.elements.accessibleDiffViewer, this._accessibleDiffViewerVisible, (X, L) => this._accessibleDiffViewerShouldBeVisible.set(X, L), this._options.onlyShowAccessibleDiffViewer.map((X) => !X), this._rootSizeObserver.width, this._rootSizeObserver.height, this._diffModel.map((X, L) => { + var S; + return (S = X == null ? void 0 : X.diff.read(L)) == null ? void 0 : S.mappings.map((x) => x.lineRangeMapping); + }), new Cme(this._editors))).recomputeInitiallyAndOnChange(this._store); + const y = this._accessibleDiffViewerVisible.map((G) => G ? "hidden" : "visible"); + this._register(qd(this.elements.modified, { visibility: y })), this._register(qd(this.elements.original, { visibility: y })), this._createDiffEditorContributions(), l.addDiffEditor(this), this._gutter = On(this, (G) => this._options.shouldRenderGutterMenu.read(G) ? this._instantiationService.createInstance(io(FT, G), this.elements.root, this._diffModel, this._editors, this._options, this._sashLayout, this._boundarySashes) : void 0), this._register(Z0(this._layoutInfo)), On(this, (G) => ( /** @description MovedBlocksLinesPart */ - new (eo(Vf, S))(this.elements.root, this._diffModel, this._layoutInfo.map((L) => L.originalEditor), this._layoutInfo.map((L) => L.modifiedEditor), this._editors) - )).recomputeInitiallyAndOnChange(this._store, (S) => { - this._movedBlocksLinesPart.set(S, void 0); - }), this._register(se.runAndSubscribe(this._editors.modified.onDidChangeCursorPosition, (S) => this._handleCursorPositionChange(S, !0))), this._register(se.runAndSubscribe(this._editors.original.onDidChangeCursorPosition, (S) => this._handleCursorPositionChange(S, !1))); - const C = this._diffModel.map(this, (S, L) => { - if (S) - return S.diff.read(L) === void 0 && !S.isDiffUpToDate.read(L); - }); - this._register(ks((S, L) => { - if (C.read(S) === !0) { - const x = this._editorProgressService.show(!0, 1e3); - L.add(Ce(() => x.done())); - } - })), this._register(ks((S, L) => { - L.add(new (eo(Kge, S))(this._editors, this._diffModel, this._options, this)); - })), this._register(ks((S, L) => { - const x = this._diffModel.read(S); - if (x) - for (const Z of [x.model.original, x.model.modified]) - L.add(Z.onWillDispose((_) => { - De(new mt("TextModel got disposed before DiffEditorWidget model got reset")), this.setModel(null); + new (io(Dg, G))(this.elements.root, this._diffModel, this._layoutInfo.map((X) => X.originalEditor), this._layoutInfo.map((X) => X.modifiedEditor), this._editors) + )).recomputeInitiallyAndOnChange(this._store, (G) => { + this._movedBlocksLinesPart.set(G, void 0); + }), this._register(se.runAndSubscribe(this._editors.modified.onDidChangeCursorPosition, (G) => this._handleCursorPositionChange(G, !0))), this._register(se.runAndSubscribe(this._editors.original.onDidChangeCursorPosition, (G) => this._handleCursorPositionChange(G, !1))); + const W = this._diffModel.map(this, (G, X) => { + if (G) + return G.diff.read(X) === void 0 && !G.isDiffUpToDate.read(X); + }); + this._register(Js((G, X) => { + if (W.read(G) === !0) { + const L = this._editorProgressService.show(!0, 1e3); + X.add(We(() => L.done())); + } + })), this._register(Js((G, X) => { + X.add(new (io(Fbe, G))(this._editors, this._diffModel, this._options, this)); + })), this._register(Js((G, X) => { + const L = this._diffModel.read(G); + if (L) + for (const S of [L.model.original, L.model.modified]) + X.add(S.onWillDispose((x) => { + Me(new bt("TextModel got disposed before DiffEditorWidget model got reset")), this.setModel(null); })); - })), this._register(Te((S) => { - this._options.setModel(this._diffModel.read(S)); + })), this._register(Te((G) => { + this._options.setModel(this._diffModel.read(G)); })); } _createInnerEditor(e, t, i, n) { - return e.createInstance(m1, t, i, n); + return e.createInstance(SW, t, i, n); } _createDiffEditorContributions() { - const e = rg.getDiffEditorContributions(); + const e = hm.getDiffEditorContributions(); for (const t of e) try { this._register(this._instantiationService.createInstance(t.ctor, this)); } catch (i) { - De(i); + Me(i); } } get _targetEditor() { return this._editors.modified; } getEditorType() { - return AC.IDiffEditor; + return vG.IDiffEditor; } layout(e) { this._rootSizeObserver.observe(e); @@ -55549,27 +55549,27 @@ let Kc = class extends MT { this._editors.original.handleInitialized(), this._editors.modified.handleInitialized(); } createViewModel(e) { - return this._instantiationService.createInstance(hT, e, this._options); + return this._instantiationService.createInstance(TT, e, this._options); } getModel() { var e; return ((e = this._diffModel.get()) == null ? void 0 : e.model) ?? null; } setModel(e) { - const t = e ? "model" in e ? tx.create(e).createNewRef(this) : tx.create(this.createViewModel(e), this) : null; + const t = e ? "model" in e ? gL.create(e).createNewRef(this) : gL.create(this.createViewModel(e), this) : null; this.setDiffModel(t); } setDiffModel(e, t) { const i = this._diffModel.get(); - !e && i && this._accessibleDiffViewer.get().close(), this._diffModel.get() !== (e == null ? void 0 : e.object) && fm(t, (n) => { - var l; + !e && i && this._accessibleDiffViewer.get().close(), this._diffModel.get() !== (e == null ? void 0 : e.object) && Gb(t, (n) => { + var r; const o = e == null ? void 0 : e.object; - St.batchEventsGlobally(n, () => { + Gt.batchEventsGlobally(n, () => { this._editors.original.setModel(o ? o.model.original : null), this._editors.modified.setModel(o ? o.model.modified : null); }); - const r = (l = this._diffModelSrc.get()) == null ? void 0 : l.createNewRef(this); + const l = (r = this._diffModelSrc.get()) == null ? void 0 : r.createNewRef(this); this._diffModelSrc.set(e == null ? void 0 : e.createNewRef(this), n), setTimeout(() => { - r == null || r.dispose(); + l == null || l.dispose(); }, 0); }); } @@ -55594,7 +55594,7 @@ let Kc = class extends MT { getLineChanges() { var t; const e = (t = this._diffModel.get()) == null ? void 0 : t.diff.get(); - return e ? sme(e) : null; + return e ? Obe(e) : null; } revert(e) { const t = this._diffModel.get(); @@ -55616,16 +55616,16 @@ let Kc = class extends MT { this._editors.modified.executeEdits("diffEditor", i); } _goTo(e) { - this._editors.modified.setPosition(new V(e.lineRangeMapping.modified.startLineNumber, 1)), this._editors.modified.revealRangeInCenter(e.lineRangeMapping.modified.toExclusiveRange()); + this._editors.modified.setPosition(new Y(e.lineRangeMapping.modified.startLineNumber, 1)), this._editors.modified.revealRangeInCenter(e.lineRangeMapping.modified.toExclusiveRange()); } goToDiff(e) { - var o, r; - const t = (r = (o = this._diffModel.get()) == null ? void 0 : o.diff.get()) == null ? void 0 : r.mappings; + var o, l; + const t = (l = (o = this._diffModel.get()) == null ? void 0 : o.diff.get()) == null ? void 0 : l.mappings; if (!t || t.length === 0) return; const i = this._editors.modified.getPosition().lineNumber; let n; - e === "next" ? n = t.find((l) => l.lineRangeMapping.modified.startLineNumber > i) ?? t[0] : n = GA(t, (l) => l.lineRangeMapping.modified.startLineNumber < i) ?? t[t.length - 1], this._goTo(n), n.lineRangeMapping.modified.isEmpty ? this._accessibilitySignalService.playSignal(vo.diffLineDeleted, { source: "diffEditor.goToDiff" }) : n.lineRangeMapping.original.isEmpty ? this._accessibilitySignalService.playSignal(vo.diffLineInserted, { source: "diffEditor.goToDiff" }) : n && this._accessibilitySignalService.playSignal(vo.diffLineModified, { source: "diffEditor.goToDiff" }); + e === "next" ? n = t.find((r) => r.lineRangeMapping.modified.startLineNumber > i) ?? t[0] : n = jV(t, (r) => r.lineRangeMapping.modified.startLineNumber < i) ?? t[t.length - 1], this._goTo(n), n.lineRangeMapping.modified.isEmpty ? this._accessibilitySignalService.playSignal(Mo.diffLineDeleted, { source: "diffEditor.goToDiff" }) : n.lineRangeMapping.original.isEmpty ? this._accessibilitySignalService.playSignal(Mo.diffLineInserted, { source: "diffEditor.goToDiff" }) : n && this._accessibilitySignalService.playSignal(Mo.diffLineModified, { source: "diffEditor.goToDiff" }); } revealFirstDiff() { const e = this._diffModel.get(); @@ -55646,15 +55646,15 @@ let Kc = class extends MT { e && await e.waitForDiff(); } mapToOtherSide() { - var r, l; + var l, r; const e = this._editors.modified.hasWidgetFocus(), t = e ? this._editors.modified : this._editors.original, i = e ? this._editors.original : this._editors.modified; let n; const o = t.getSelection(); if (o) { - const a = (l = (r = this._diffModel.get()) == null ? void 0 : r.diff.get()) == null ? void 0 : l.mappings.map((c) => e ? c.lineRangeMapping.flip() : c.lineRangeMapping); - if (a) { - const c = cz(o.getStartPosition(), a), d = cz(o.getEndPosition(), a); - n = M.plusRange(c, d); + const c = (r = (l = this._diffModel.get()) == null ? void 0 : l.diff.get()) == null ? void 0 : r.mappings.map((d) => e ? d.lineRangeMapping.flip() : d.lineRangeMapping); + if (c) { + const d = Yz(o.getStartPosition(), c), a = Yz(o.getEndPosition(), c); + n = I.plusRange(d, a); } } return { destination: i, destinationSelection: n }; @@ -55670,7 +55670,7 @@ let Kc = class extends MT { collapseAllUnchangedRegions() { var t; const e = (t = this._diffModel.get()) == null ? void 0 : t.unchangedRegions.get(); - e && oi((i) => { + e && li((i) => { for (const n of e) n.collapseAll(i); }); @@ -55678,7 +55678,7 @@ let Kc = class extends MT { showAllUnchangedRegions() { var t; const e = (t = this._diffModel.get()) == null ? void 0 : t.unchangedRegions.get(); - e && oi((i) => { + e && li((i) => { for (const n of e) n.showAll(i); }); @@ -55686,50 +55686,50 @@ let Kc = class extends MT { _handleCursorPositionChange(e, t) { var i, n; if ((e == null ? void 0 : e.reason) === 3) { - const o = (n = (i = this._diffModel.get()) == null ? void 0 : i.diff.get()) == null ? void 0 : n.mappings.find((r) => t ? r.lineRangeMapping.modified.contains(e.position.lineNumber) : r.lineRangeMapping.original.contains(e.position.lineNumber)); - o != null && o.lineRangeMapping.modified.isEmpty ? this._accessibilitySignalService.playSignal(vo.diffLineDeleted, { source: "diffEditor.cursorPositionChanged" }) : o != null && o.lineRangeMapping.original.isEmpty ? this._accessibilitySignalService.playSignal(vo.diffLineInserted, { source: "diffEditor.cursorPositionChanged" }) : o && this._accessibilitySignalService.playSignal(vo.diffLineModified, { source: "diffEditor.cursorPositionChanged" }); + const o = (n = (i = this._diffModel.get()) == null ? void 0 : i.diff.get()) == null ? void 0 : n.mappings.find((l) => t ? l.lineRangeMapping.modified.contains(e.position.lineNumber) : l.lineRangeMapping.original.contains(e.position.lineNumber)); + o != null && o.lineRangeMapping.modified.isEmpty ? this._accessibilitySignalService.playSignal(Mo.diffLineDeleted, { source: "diffEditor.cursorPositionChanged" }) : o != null && o.lineRangeMapping.original.isEmpty ? this._accessibilitySignalService.playSignal(Mo.diffLineInserted, { source: "diffEditor.cursorPositionChanged" }) : o && this._accessibilitySignalService.playSignal(Mo.diffLineModified, { source: "diffEditor.cursorPositionChanged" }); } } }; -Kc = nme([ - Y0(3, _e), - Y0(4, Se), - Y0(5, ft), - Y0(6, jh), - Y0(7, qh) -], Kc); -function sme(s) { +$d = Qbe([ + _0(3, xe), + _0(4, Ge), + _0(5, gt), + _0(6, tu), + _0(7, iu) +], $d); +function Obe(s) { return s.mappings.map((e) => { const t = e.lineRangeMapping; - let i, n, o, r, l = t.innerChanges; - return t.original.isEmpty ? (i = t.original.startLineNumber - 1, n = 0, l = void 0) : (i = t.original.startLineNumber, n = t.original.endLineNumberExclusive - 1), t.modified.isEmpty ? (o = t.modified.startLineNumber - 1, r = 0, l = void 0) : (o = t.modified.startLineNumber, r = t.modified.endLineNumberExclusive - 1), { + let i, n, o, l, r = t.innerChanges; + return t.original.isEmpty ? (i = t.original.startLineNumber - 1, n = 0, r = void 0) : (i = t.original.startLineNumber, n = t.original.endLineNumberExclusive - 1), t.modified.isEmpty ? (o = t.modified.startLineNumber - 1, l = 0, r = void 0) : (o = t.modified.startLineNumber, l = t.modified.endLineNumberExclusive - 1), { originalStartLineNumber: i, originalEndLineNumber: n, modifiedStartLineNumber: o, - modifiedEndLineNumber: r, - charChanges: l == null ? void 0 : l.map((a) => ({ - originalStartLineNumber: a.originalRange.startLineNumber, - originalStartColumn: a.originalRange.startColumn, - originalEndLineNumber: a.originalRange.endLineNumber, - originalEndColumn: a.originalRange.endColumn, - modifiedStartLineNumber: a.modifiedRange.startLineNumber, - modifiedStartColumn: a.modifiedRange.startColumn, - modifiedEndLineNumber: a.modifiedRange.endLineNumber, - modifiedEndColumn: a.modifiedRange.endColumn + modifiedEndLineNumber: l, + charChanges: r == null ? void 0 : r.map((c) => ({ + originalStartLineNumber: c.originalRange.startLineNumber, + originalStartColumn: c.originalRange.startColumn, + originalEndLineNumber: c.originalRange.endLineNumber, + originalEndColumn: c.originalRange.endColumn, + modifiedStartLineNumber: c.modifiedRange.startLineNumber, + modifiedStartColumn: c.modifiedRange.startColumn, + modifiedEndLineNumber: c.modifiedRange.endLineNumber, + modifiedEndColumn: c.modifiedRange.endColumn })) }; }); } -class ome extends Ss { +class jbe extends Vs { constructor() { super({ id: "diffEditor.toggleCollapseUnchangedRegions", - title: Ie("toggleCollapseUnchangedRegions", "Toggle Collapse Unchanged Regions"), + title: Ce("toggleCollapseUnchangedRegions", "Toggle Collapse Unchanged Regions"), icon: te.map, - toggled: H.has("config.diffEditor.hideUnchangedRegions.enabled"), - precondition: H.has("isInDiffEditor"), + toggled: P.has("config.diffEditor.hideUnchangedRegions.enabled"), + precondition: P.has("isInDiffEditor"), menu: { - when: H.has("isInDiffEditor"), + when: P.has("isInDiffEditor"), id: pe.EditorTitle, order: 22, group: "navigation" @@ -55737,66 +55737,66 @@ class ome extends Ss { }); } run(e, ...t) { - const i = e.get(Ke), n = !i.getValue("diffEditor.hideUnchangedRegions.enabled"); + const i = e.get(Qe), n = !i.getValue("diffEditor.hideUnchangedRegions.enabled"); i.updateValue("diffEditor.hideUnchangedRegions.enabled", n); } } -class w4 extends Ss { +class tj extends Vs { constructor() { super({ id: "diffEditor.toggleShowMovedCodeBlocks", - title: Ie("toggleShowMovedCodeBlocks", "Toggle Show Moved Code Blocks"), - precondition: H.has("isInDiffEditor") + title: Ce("toggleShowMovedCodeBlocks", "Toggle Show Moved Code Blocks"), + precondition: P.has("isInDiffEditor") }); } run(e, ...t) { - const i = e.get(Ke), n = !i.getValue("diffEditor.experimental.showMoves"); + const i = e.get(Qe), n = !i.getValue("diffEditor.experimental.showMoves"); i.updateValue("diffEditor.experimental.showMoves", n); } } -class C4 extends Ss { +class ij extends Vs { constructor() { super({ id: "diffEditor.toggleUseInlineViewWhenSpaceIsLimited", - title: Ie("toggleUseInlineViewWhenSpaceIsLimited", "Toggle Use Inline View When Space Is Limited"), - precondition: H.has("isInDiffEditor") + title: Ce("toggleUseInlineViewWhenSpaceIsLimited", "Toggle Use Inline View When Space Is Limited"), + precondition: P.has("isInDiffEditor") }); } run(e, ...t) { - const i = e.get(Ke), n = !i.getValue("diffEditor.useInlineViewWhenSpaceIsLimited"); + const i = e.get(Qe), n = !i.getValue("diffEditor.useInlineViewWhenSpaceIsLimited"); i.updateValue("diffEditor.useInlineViewWhenSpaceIsLimited", n); } } -const vC = Ie("diffEditor", "Diff Editor"); -class rme extends Rl { +const KG = Ce("diffEditor", "Diff Editor"); +class qbe extends Fr { constructor() { super({ id: "diffEditor.switchSide", - title: Ie("switchSide", "Switch Side"), + title: Ce("switchSide", "Switch Side"), icon: te.arrowSwap, - precondition: H.has("isInDiffEditor"), + precondition: P.has("isInDiffEditor"), f1: !0, - category: vC + category: KG }); } runEditorCommand(e, t, i) { - const n = g0(e); - if (n instanceof Kc) { + const n = y0(e); + if (n instanceof $d) { if (i && i.dryRun) return { destinationSelection: n.mapToOtherSide().destinationSelection }; n.switchSide(); } } } -class lme extends Rl { +class $be extends Fr { constructor() { super({ id: "diffEditor.exitCompareMove", - title: Ie("exitCompareMove", "Exit Compare Move"), + title: Ce("exitCompareMove", "Exit Compare Move"), icon: te.close, - precondition: I.comparingMovedCode, + precondition: C.comparingMovedCode, f1: !1, - category: vC, + category: KG, keybinding: { weight: 1e4, primary: 9 @@ -55804,63 +55804,63 @@ class lme extends Rl { }); } runEditorCommand(e, t, ...i) { - const n = g0(e); - n instanceof Kc && n.exitCompareMove(); + const n = y0(e); + n instanceof $d && n.exitCompareMove(); } } -class ame extends Rl { +class epe extends Fr { constructor() { super({ id: "diffEditor.collapseAllUnchangedRegions", - title: Ie("collapseAllUnchangedRegions", "Collapse All Unchanged Regions"), + title: Ce("collapseAllUnchangedRegions", "Collapse All Unchanged Regions"), icon: te.fold, - precondition: H.has("isInDiffEditor"), + precondition: P.has("isInDiffEditor"), f1: !0, - category: vC + category: KG }); } runEditorCommand(e, t, ...i) { - const n = g0(e); - n instanceof Kc && n.collapseAllUnchangedRegions(); + const n = y0(e); + n instanceof $d && n.collapseAllUnchangedRegions(); } } -class cme extends Rl { +class tpe extends Fr { constructor() { super({ id: "diffEditor.showAllUnchangedRegions", - title: Ie("showAllUnchangedRegions", "Show All Unchanged Regions"), + title: Ce("showAllUnchangedRegions", "Show All Unchanged Regions"), icon: te.unfold, - precondition: H.has("isInDiffEditor"), + precondition: P.has("isInDiffEditor"), f1: !0, - category: vC + category: KG }); } runEditorCommand(e, t, ...i) { - const n = g0(e); - n instanceof Kc && n.showAllUnchangedRegions(); + const n = y0(e); + n instanceof $d && n.showAllUnchangedRegions(); } } -class _T extends Ss { +class _T extends Vs { constructor() { super({ id: "diffEditor.revert", - title: Ie("revert", "Revert"), + title: Ce("revert", "Revert"), f1: !1, - category: vC + category: KG }); } run(e, t) { - const i = dme(e, t.originalUri, t.modifiedUri); - i instanceof Kc && i.revertRangeMappings(t.mapping.innerChanges ?? []); + const i = ipe(e, t.originalUri, t.modifiedUri); + i instanceof $d && i.revertRangeMappings(t.mapping.innerChanges ?? []); } } -const S4 = Ie("accessibleDiffViewer", "Accessible Diff Viewer"), ZZ = class ZZ extends Ss { +const nj = Ce("accessibleDiffViewer", "Accessible Diff Viewer"), F2 = class F2 extends Vs { constructor() { super({ - id: ZZ.id, - title: Ie("editor.action.accessibleDiffViewer.next", "Go to Next Difference"), - category: S4, - precondition: H.has("isInDiffEditor"), + id: F2.id, + title: Ce("editor.action.accessibleDiffViewer.next", "Go to Next Difference"), + category: nj, + precondition: P.has("isInDiffEditor"), keybinding: { primary: 65, weight: 100 @@ -55870,19 +55870,19 @@ const S4 = Ie("accessibleDiffViewer", "Accessible Diff Viewer"), ZZ = class ZZ e }); } run(e) { - const t = g0(e); + const t = y0(e); t == null || t.accessibleDiffViewerNext(); } }; -ZZ.id = "editor.action.accessibleDiffViewer.next"; -let x1 = ZZ; -const _Z = class _Z extends Ss { +F2.id = "editor.action.accessibleDiffViewer.next"; +let vW = F2; +const z2 = class z2 extends Vs { constructor() { super({ - id: _Z.id, - title: Ie("editor.action.accessibleDiffViewer.prev", "Go to Previous Difference"), - category: S4, - precondition: H.has("isInDiffEditor"), + id: z2.id, + title: Ce("editor.action.accessibleDiffViewer.prev", "Go to Previous Difference"), + category: nj, + precondition: P.has("isInDiffEditor"), keybinding: { primary: 1089, weight: 100 @@ -55892,30 +55892,30 @@ const _Z = class _Z extends Ss { }); } run(e) { - const t = g0(e); + const t = y0(e); t == null || t.accessibleDiffViewerPrev(); } }; -_Z.id = "editor.action.accessibleDiffViewer.prev"; -let fx = _Z; -function dme(s, e, t) { - return s.get(ft).listDiffEditors().find((o) => { - var a, c; - const r = o.getModifiedEditor(), l = o.getOriginalEditor(); - return r && ((a = r.getModel()) == null ? void 0 : a.uri.toString()) === t.toString() && l && ((c = l.getModel()) == null ? void 0 : c.uri.toString()) === e.toString(); +z2.id = "editor.action.accessibleDiffViewer.prev"; +let wL = z2; +function ipe(s, e, t) { + return s.get(gt).listDiffEditors().find((o) => { + var c, d; + const l = o.getModifiedEditor(), r = o.getOriginalEditor(); + return l && ((c = l.getModel()) == null ? void 0 : c.uri.toString()) === t.toString() && r && ((d = r.getModel()) == null ? void 0 : d.uri.toString()) === e.toString(); }) || null; } -function g0(s) { - const t = s.get(ft).listDiffEditors(), i = _n(); +function y0(s) { + const t = s.get(gt).listDiffEditors(), i = Cn(); if (i) for (const n of t) { const o = n.getContainerDomNode(); - if (hme(o, i)) + if (npe(o, i)) return n; } return null; } -function hme(s, e) { +function npe(s, e) { let t = e; for (; t; ) { if (t === s) @@ -55924,104 +55924,104 @@ function hme(s, e) { } return !1; } -kt(ome); -kt(w4); -kt(C4); -nn.appendMenuItem(pe.EditorTitle, { +kt(jbe); +kt(tj); +kt(ij); +sn.appendMenuItem(pe.EditorTitle, { command: { - id: new C4().desc.id, + id: new ij().desc.id, title: p("useInlineViewWhenSpaceIsLimited", "Use Inline View When Space Is Limited"), - toggled: H.has("config.diffEditor.useInlineViewWhenSpaceIsLimited"), - precondition: H.has("isInDiffEditor") + toggled: P.has("config.diffEditor.useInlineViewWhenSpaceIsLimited"), + precondition: P.has("isInDiffEditor") }, order: 11, group: "1_diff", - when: H.and(I.diffEditorRenderSideBySideInlineBreakpointReached, H.has("isInDiffEditor")) + when: P.and(C.diffEditorRenderSideBySideInlineBreakpointReached, P.has("isInDiffEditor")) }); -nn.appendMenuItem(pe.EditorTitle, { +sn.appendMenuItem(pe.EditorTitle, { command: { - id: new w4().desc.id, + id: new tj().desc.id, title: p("showMoves", "Show Moved Code Blocks"), icon: te.move, - toggled: jb.create("config.diffEditor.experimental.showMoves", !0), - precondition: H.has("isInDiffEditor") + toggled: n0.create("config.diffEditor.experimental.showMoves", !0), + precondition: P.has("isInDiffEditor") }, order: 10, group: "1_diff", - when: H.has("isInDiffEditor") + when: P.has("isInDiffEditor") }); kt(_T); for (const s of [ - { icon: te.arrowRight, key: I.diffEditorInlineMode.toNegated() }, - { icon: te.discard, key: I.diffEditorInlineMode } + { icon: te.arrowRight, key: C.diffEditorInlineMode.toNegated() }, + { icon: te.discard, key: C.diffEditorInlineMode } ]) - nn.appendMenuItem(pe.DiffEditorHunkToolbar, { + sn.appendMenuItem(pe.DiffEditorHunkToolbar, { command: { id: new _T().desc.id, title: p("revertHunk", "Revert Block"), icon: s.icon }, - when: H.and(I.diffEditorModifiedWritable, s.key), + when: P.and(C.diffEditorModifiedWritable, s.key), order: 5, group: "primary" - }), nn.appendMenuItem(pe.DiffEditorSelectionToolbar, { + }), sn.appendMenuItem(pe.DiffEditorSelectionToolbar, { command: { id: new _T().desc.id, title: p("revertSelection", "Revert Selection"), icon: s.icon }, - when: H.and(I.diffEditorModifiedWritable, s.key), + when: P.and(C.diffEditorModifiedWritable, s.key), order: 5, group: "primary" }); -kt(rme); -kt(lme); -kt(ame); -kt(cme); -nn.appendMenuItem(pe.EditorTitle, { +kt(qbe); +kt($be); +kt(epe); +kt(tpe); +sn.appendMenuItem(pe.EditorTitle, { command: { - id: x1.id, + id: vW.id, title: p("Open Accessible Diff Viewer", "Open Accessible Diff Viewer"), - precondition: H.has("isInDiffEditor") + precondition: P.has("isInDiffEditor") }, order: 10, group: "2_diff", - when: H.and(I.accessibleDiffViewerVisible.negate(), H.has("isInDiffEditor")) + when: P.and(C.accessibleDiffViewerVisible.negate(), P.has("isInDiffEditor")) }); -st.registerCommandAlias("editor.action.diffReview.next", x1.id); -kt(x1); -st.registerCommandAlias("editor.action.diffReview.prev", fx.id); -kt(fx); -var ume = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +st.registerCommandAlias("editor.action.diffReview.next", vW.id); +kt(vW); +st.registerCommandAlias("editor.action.diffReview.prev", wL.id); +kt(wL); +var spe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, gme = function(s, e) { +}, ope = function(s, e) { return function(t, i) { e(t, i, s); }; -}, IT; -const vI = new ae("selectionAnchorSet", !1); -var wg; -let Fh = (wg = class { +}, QT; +const Px = new ce("selectionAnchorSet", !1); +var Lm; +let Kh = (Lm = class { static get(e) { - return e.getContribution(IT.ID); + return e.getContribution(QT.ID); } constructor(e, t) { - this.editor = e, this.selectionAnchorSetContextKey = vI.bindTo(t), this.modelChangeListener = e.onDidChangeModel(() => this.selectionAnchorSetContextKey.reset()); + this.editor = e, this.selectionAnchorSetContextKey = Px.bindTo(t), this.modelChangeListener = e.onDidChangeModel(() => this.selectionAnchorSetContextKey.reset()); } setSelectionAnchor() { if (this.editor.hasModel()) { const e = this.editor.getPosition(); this.editor.changeDecorations((t) => { - this.decorationId && t.removeDecoration(this.decorationId), this.decorationId = t.addDecoration(fe.fromPositions(e, e), { + this.decorationId && t.removeDecoration(this.decorationId), this.decorationId = t.addDecoration(ge.fromPositions(e, e), { description: "selection-anchor", stickiness: 1, - hoverMessage: new Vn().appendText(p("selectionAnchor", "Selection Anchor")), + hoverMessage: new kn().appendText(p("selectionAnchor", "Selection Anchor")), className: "selection-anchor" }); - }), this.selectionAnchorSetContextKey.set(!!this.decorationId), bs(p("anchorSet", "Anchor set at {0}:{1}", e.lineNumber, e.column)); + }), this.selectionAnchorSetContextKey.set(!!this.decorationId), ys(p("anchorSet", "Anchor set at {0}:{1}", e.lineNumber, e.column)); } } goToSelectionAnchor() { @@ -56035,7 +56035,7 @@ let Fh = (wg = class { const e = this.editor.getModel().getDecorationRange(this.decorationId); if (e) { const t = this.editor.getPosition(); - this.editor.setSelection(fe.fromPositions(e.getStartPosition(), t)), this.cancelSelectionAnchor(); + this.editor.setSelection(ge.fromPositions(e.getStartPosition(), t)), this.cancelSelectionAnchor(); } } } @@ -56050,11 +56050,11 @@ let Fh = (wg = class { dispose() { this.cancelSelectionAnchor(), this.modelChangeListener.dispose(); } -}, IT = wg, wg.ID = "editor.contrib.selectionAnchorController", wg); -Fh = IT = ume([ - gme(1, _e) -], Fh); -class mme extends he { +}, QT = Lm, Lm.ID = "editor.contrib.selectionAnchorController", Lm); +Kh = QT = spe([ + ope(1, xe) +], Kh); +class lpe extends he { constructor() { super({ id: "editor.action.setSelectionAnchor", @@ -56062,8 +56062,8 @@ class mme extends he { alias: "Set Selection Anchor", precondition: void 0, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2080 /* KeyCode.KeyB */ @@ -56075,33 +56075,33 @@ class mme extends he { } async run(e, t) { var i; - (i = Fh.get(t)) == null || i.setSelectionAnchor(); + (i = Kh.get(t)) == null || i.setSelectionAnchor(); } } -class pme extends he { +class rpe extends he { constructor() { super({ id: "editor.action.goToSelectionAnchor", label: p("goToSelectionAnchor", "Go to Selection Anchor"), alias: "Go to Selection Anchor", - precondition: vI + precondition: Px }); } async run(e, t) { var i; - (i = Fh.get(t)) == null || i.goToSelectionAnchor(); + (i = Kh.get(t)) == null || i.goToSelectionAnchor(); } } -class fme extends he { +class cpe extends he { constructor() { super({ id: "editor.action.selectFromAnchorToCursor", label: p("selectFromAnchorToCursor", "Select from Anchor to Cursor"), alias: "Select from Anchor to Cursor", - precondition: vI, + precondition: Px, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2089 /* KeyCode.KeyK */ @@ -56113,18 +56113,18 @@ class fme extends he { } async run(e, t) { var i; - (i = Fh.get(t)) == null || i.selectFromAnchorToCursor(); + (i = Kh.get(t)) == null || i.selectFromAnchorToCursor(); } } -class bme extends he { +class dpe extends he { constructor() { super({ id: "editor.action.cancelSelectionAnchor", label: p("cancelSelectionAnchor", "Cancel Selection Anchor"), alias: "Cancel Selection Anchor", - precondition: vI, + precondition: Px, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 9, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -56133,21 +56133,21 @@ class bme extends he { } async run(e, t) { var i; - (i = Fh.get(t)) == null || i.cancelSelectionAnchor(); + (i = Kh.get(t)) == null || i.cancelSelectionAnchor(); } } -gt( - Fh.ID, - Fh, +mt( + Kh.ID, + Kh, 4 /* EditorContributionInstantiation.Lazy */ ); -ee(mme); -ee(pme); -ee(fme); -ee(bme); -const yme = N("editorOverviewRuler.bracketMatchForeground", "#A0A0A0", p("overviewRulerBracketMatchForeground", "Overview ruler marker color for matching brackets.")); -class wme extends he { +ee(lpe); +ee(rpe); +ee(cpe); +ee(dpe); +const ape = R("editorOverviewRuler.bracketMatchForeground", "#A0A0A0", p("overviewRulerBracketMatchForeground", "Overview ruler marker color for matching brackets.")); +class hpe extends he { constructor() { super({ id: "editor.action.jumpToBracket", @@ -56155,7 +56155,7 @@ class wme extends he { alias: "Go to Bracket", precondition: void 0, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 3165, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -56164,10 +56164,10 @@ class wme extends he { } run(e, t) { var i; - (i = wm.get(t)) == null || i.jumpToBracket(); + (i = Lb.get(t)) == null || i.jumpToBracket(); } } -class Cme extends he { +class upe extends he { constructor() { super({ id: "editor.action.selectToBracket", @@ -56175,7 +56175,7 @@ class Cme extends he { alias: "Select to Bracket", precondition: void 0, metadata: { - description: Ie("smartSelect.selectToBracketDescription", "Select the text inside and including the brackets or curly braces"), + description: Ce("smartSelect.selectToBracketDescription", "Select the text inside and including the brackets or curly braces"), args: [{ name: "args", schema: { @@ -56194,10 +56194,10 @@ class Cme extends he { run(e, t, i) { var o; let n = !0; - i && i.selectBrackets === !1 && (n = !1), (o = wm.get(t)) == null || o.selectToBracket(n); + i && i.selectBrackets === !1 && (n = !1), (o = Lb.get(t)) == null || o.selectToBracket(n); } } -class Sme extends he { +class mpe extends he { constructor() { super({ id: "editor.action.removeBrackets", @@ -56205,7 +56205,7 @@ class Sme extends he { alias: "Remove Brackets", precondition: void 0, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 2561, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -56214,20 +56214,20 @@ class Sme extends he { } run(e, t) { var i; - (i = wm.get(t)) == null || i.removeBrackets(this.id); + (i = Lb.get(t)) == null || i.removeBrackets(this.id); } } -class Lme { +class bpe { constructor(e, t, i) { this.position = e, this.brackets = t, this.options = i; } } -const Id = class Id extends R { +const Ta = class Ta extends J { static get(e) { - return e.getContribution(Id.ID); + return e.getContribution(Ta.ID); } constructor(e) { - super(), this._editor = e, this._lastBracketsData = [], this._lastVersionId = 0, this._decorations = this._editor.createDecorationsCollection(), this._updateBracketsSoon = this._register(new Zt(() => this._updateBrackets(), 50)), this._matchBrackets = this._editor.getOption( + super(), this._editor = e, this._lastBracketsData = [], this._lastVersionId = 0, this._decorations = this._editor.createDecorationsCollection(), this._updateBracketsSoon = this._register(new St(() => this._updateBrackets(), 50)), this._matchBrackets = this._editor.getOption( 72 /* EditorOption.matchBrackets */ ), this._updateBracketsSoon.schedule(), this._register(e.onDidChangeCursorPosition((t) => { @@ -56257,19 +56257,19 @@ const Id = class Id extends R { return; const e = this._editor.getModel(), t = this._editor.getSelections().map((i) => { const n = i.getStartPosition(), o = e.bracketPairs.matchBracket(n); - let r = null; + let l = null; if (o) - o[0].containsPosition(n) && !o[1].containsPosition(n) ? r = o[1].getStartPosition() : o[1].containsPosition(n) && (r = o[0].getStartPosition()); + o[0].containsPosition(n) && !o[1].containsPosition(n) ? l = o[1].getStartPosition() : o[1].containsPosition(n) && (l = o[0].getStartPosition()); else { - const l = e.bracketPairs.findEnclosingBrackets(n); - if (l) - r = l[1].getStartPosition(); + const r = e.bracketPairs.findEnclosingBrackets(n); + if (r) + l = r[1].getStartPosition(); else { - const a = e.bracketPairs.findNextBracket(n); - a && a.range && (r = a.range.getStartPosition()); + const c = e.bracketPairs.findNextBracket(n); + c && c.range && (l = c.range.getStartPosition()); } } - return r ? new fe(r.lineNumber, r.column, r.lineNumber, r.column) : new fe(n.lineNumber, n.column, n.lineNumber, n.column); + return l ? new ge(l.lineNumber, l.column, l.lineNumber, l.column) : new ge(n.lineNumber, n.column, n.lineNumber, n.column); }); this._editor.setSelections(t), this._editor.revealRange(t[0]); } @@ -56279,21 +56279,21 @@ const Id = class Id extends R { const t = this._editor.getModel(), i = []; this._editor.getSelections().forEach((n) => { const o = n.getStartPosition(); - let r = t.bracketPairs.matchBracket(o); - if (!r && (r = t.bracketPairs.findEnclosingBrackets(o), !r)) { - const c = t.bracketPairs.findNextBracket(o); - c && c.range && (r = t.bracketPairs.matchBracket(c.range.getStartPosition())); + let l = t.bracketPairs.matchBracket(o); + if (!l && (l = t.bracketPairs.findEnclosingBrackets(o), !l)) { + const d = t.bracketPairs.findNextBracket(o); + d && d.range && (l = t.bracketPairs.matchBracket(d.range.getStartPosition())); } - let l = null, a = null; - if (r) { - r.sort(M.compareRangesUsingStarts); - const [c, d] = r; - if (l = e ? c.getStartPosition() : c.getEndPosition(), a = e ? d.getEndPosition() : d.getStartPosition(), d.containsPosition(o)) { - const h = l; - l = a, a = h; + let r = null, c = null; + if (l) { + l.sort(I.compareRangesUsingStarts); + const [d, a] = l; + if (r = e ? d.getStartPosition() : d.getEndPosition(), c = e ? a.getEndPosition() : a.getStartPosition(), a.containsPosition(o)) { + const h = r; + r = c, c = h; } } - l && a && i.push(new fe(l.lineNumber, l.column, a.lineNumber, a.column)); + r && c && i.push(new ge(r.lineNumber, r.column, c.lineNumber, c.column)); }), i.length > 0 && (this._editor.setSelections(i), this._editor.revealRange(i[0])); } removeBrackets(e) { @@ -56335,61 +56335,61 @@ const Id = class Id extends R { let n = []; this._lastVersionId === i && (n = this._lastBracketsData); const o = []; - let r = 0; + let l = 0; for (let h = 0, u = e.length; h < u; h++) { - const g = e[h]; - g.isEmpty() && (o[r++] = g.getStartPosition()); + const m = e[h]; + m.isEmpty() && (o[l++] = m.getStartPosition()); } - o.length > 1 && o.sort(V.compare); - const l = []; - let a = 0, c = 0; - const d = n.length; + o.length > 1 && o.sort(Y.compare); + const r = []; + let c = 0, d = 0; + const a = n.length; for (let h = 0, u = o.length; h < u; h++) { - const g = o[h]; - for (; c < d && n[c].position.isBefore(g); ) - c++; - if (c < d && n[c].position.equals(g)) - l[a++] = n[c]; + const m = o[h]; + for (; d < a && n[d].position.isBefore(m); ) + d++; + if (d < a && n[d].position.equals(m)) + r[c++] = n[d]; else { - let m = t.bracketPairs.matchBracket( - g, + let b = t.bracketPairs.matchBracket( + m, 20 /* give at most 20ms to compute */ - ), f = Id._DECORATION_OPTIONS_WITH_OVERVIEW_RULER; - !m && this._matchBrackets === "always" && (m = t.bracketPairs.findEnclosingBrackets( - g, + ), g = Ta._DECORATION_OPTIONS_WITH_OVERVIEW_RULER; + !b && this._matchBrackets === "always" && (b = t.bracketPairs.findEnclosingBrackets( + m, 20 /* give at most 20ms to compute */ - ), f = Id._DECORATION_OPTIONS_WITHOUT_OVERVIEW_RULER), l[a++] = new Lme(g, m, f); + ), g = Ta._DECORATION_OPTIONS_WITHOUT_OVERVIEW_RULER), r[c++] = new bpe(m, b, g); } } - this._lastBracketsData = l, this._lastVersionId = i; + this._lastBracketsData = r, this._lastVersionId = i; } }; -Id.ID = "editor.contrib.bracketMatchingController", Id._DECORATION_OPTIONS_WITH_OVERVIEW_RULER = Re.register({ +Ta.ID = "editor.contrib.bracketMatchingController", Ta._DECORATION_OPTIONS_WITH_OVERVIEW_RULER = Je.register({ description: "bracket-match-overview", stickiness: 1, className: "bracket-match", overviewRuler: { - color: fi(yme), - position: ur.Center + color: Zi(ape), + position: pl.Center } -}), Id._DECORATION_OPTIONS_WITHOUT_OVERVIEW_RULER = Re.register({ +}), Ta._DECORATION_OPTIONS_WITHOUT_OVERVIEW_RULER = Je.register({ description: "bracket-match-no-overview", stickiness: 1, className: "bracket-match" }); -let wm = Id; -gt( - wm.ID, - wm, +let Lb = Ta; +mt( + Lb.ID, + Lb, 1 /* EditorContributionInstantiation.AfterFirstRender */ ); -ee(Cme); -ee(wme); -ee(Sme); -nn.appendMenuItem(pe.MenubarGoMenu, { +ee(upe); +ee(hpe); +ee(mpe); +sn.appendMenuItem(pe.MenubarGoMenu, { group: "5_infile_nav", command: { id: "editor.action.jumpToBracket", @@ -56397,7 +56397,7 @@ nn.appendMenuItem(pe.MenubarGoMenu, { }, order: 2 }); -class Ame { +class ppe { constructor(e, t) { this._selection = e, this._isMovingLeft = t; } @@ -56407,18 +56407,18 @@ class Ame { const i = this._selection.startLineNumber, n = this._selection.startColumn, o = this._selection.endColumn; if (!(this._isMovingLeft && n === 1) && !(!this._isMovingLeft && o === e.getLineMaxColumn(i))) if (this._isMovingLeft) { - const r = new M(i, n - 1, i, n), l = e.getValueInRange(r); - t.addEditOperation(r, null), t.addEditOperation(new M(i, o, i, o), l); + const l = new I(i, n - 1, i, n), r = e.getValueInRange(l); + t.addEditOperation(l, null), t.addEditOperation(new I(i, o, i, o), r); } else { - const r = new M(i, o, i, o + 1), l = e.getValueInRange(r); - t.addEditOperation(r, null), t.addEditOperation(new M(i, n, i, n), l); + const l = new I(i, o, i, o + 1), r = e.getValueInRange(l); + t.addEditOperation(l, null), t.addEditOperation(new I(i, n, i, n), r); } } computeCursorState(e, t) { - return this._isMovingLeft ? new fe(this._selection.startLineNumber, this._selection.startColumn - 1, this._selection.endLineNumber, this._selection.endColumn - 1) : new fe(this._selection.startLineNumber, this._selection.startColumn + 1, this._selection.endLineNumber, this._selection.endColumn + 1); + return this._isMovingLeft ? new ge(this._selection.startLineNumber, this._selection.startColumn - 1, this._selection.endLineNumber, this._selection.endColumn - 1) : new ge(this._selection.startLineNumber, this._selection.startColumn + 1, this._selection.endLineNumber, this._selection.endColumn + 1); } } -class L4 extends he { +class sj extends he { constructor(e, t) { super(t), this.left = e; } @@ -56427,41 +56427,41 @@ class L4 extends he { return; const i = [], n = t.getSelections(); for (const o of n) - i.push(new Ame(o, this.left)); + i.push(new ppe(o, this.left)); t.pushUndoStop(), t.executeCommands(this.id, i), t.pushUndoStop(); } } -class xme extends L4 { +class gpe extends sj { constructor() { super(!0, { id: "editor.action.moveCarretLeftAction", label: p("caret.moveLeft", "Move Selected Text Left"), alias: "Move Selected Text Left", - precondition: I.writable + precondition: C.writable }); } } -class Mme extends L4 { +class Zpe extends sj { constructor() { super(!1, { id: "editor.action.moveCarretRightAction", label: p("caret.moveRight", "Move Selected Text Right"), alias: "Move Selected Text Right", - precondition: I.writable + precondition: C.writable }); } } -ee(xme); -ee(Mme); -class Zme extends he { +ee(gpe); +ee(Zpe); +class fpe extends he { constructor() { super({ id: "editor.action.transposeLetters", label: p("transposeLetters.label", "Transpose Letters"), alias: "Transpose Letters", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 0, mac: { primary: 306 @@ -56476,20 +56476,20 @@ class Zme extends he { if (!t.hasModel()) return; const i = t.getModel(), n = [], o = t.getSelections(); - for (const r of o) { - if (!r.isEmpty()) + for (const l of o) { + if (!l.isEmpty()) continue; - const l = r.startLineNumber, a = r.startColumn, c = i.getLineMaxColumn(l); - if (l === 1 && (a === 1 || a === 2 && c === 2)) + const r = l.startLineNumber, c = l.startColumn, d = i.getLineMaxColumn(r); + if (r === 1 && (c === 1 || c === 2 && d === 2)) continue; - const d = a === c ? r.getPosition() : Ct.rightPosition(i, r.getPosition().lineNumber, r.getPosition().column), h = Ct.leftPosition(i, d), u = Ct.leftPosition(i, h), g = i.getValueInRange(M.fromPositions(u, h)), m = i.getValueInRange(M.fromPositions(h, d)), f = M.fromPositions(u, d); - n.push(new Mn(f, m + g)); + const a = c === d ? l.getPosition() : Wt.rightPosition(i, l.getPosition().lineNumber, l.getPosition().column), h = Wt.leftPosition(i, a), u = Wt.leftPosition(i, h), m = i.getValueInRange(I.fromPositions(u, h)), b = i.getValueInRange(I.fromPositions(h, a)), g = I.fromPositions(u, a); + n.push(new Sn(g, b + m)); } n.length > 0 && (t.pushUndoStop(), t.executeCommands(this.id, n), t.pushUndoStop()); } } -ee(Zme); -const TI = function() { +ee(fpe); +const Bx = function() { if (typeof crypto == "object" && typeof crypto.randomUUID == "function") return crypto.randomUUID.bind(crypto); let s; @@ -56507,7 +56507,7 @@ const TI = function() { return o += t[e[n++]], o += t[e[n++]], o += t[e[n++]], o += t[e[n++]], o += "-", o += t[e[n++]], o += t[e[n++]], o += "-", o += t[e[n++]], o += t[e[n++]], o += "-", o += t[e[n++]], o += t[e[n++]], o += "-", o += t[e[n++]], o += t[e[n++]], o += t[e[n++]], o += t[e[n++]], o += t[e[n++]], o += t[e[n++]], o; }; }(); -function HX(s) { +function ZH(s) { return { asString: async () => s, asFile: () => { @@ -56515,15 +56515,15 @@ function HX(s) { value: typeof s == "string" ? s : void 0 }; } -function _me(s, e, t) { - const i = { id: TI(), name: s, uri: e, data: t }; +function ype(s, e, t) { + const i = { id: Bx(), name: s, uri: e, data: t }; return { asString: async () => "", asFile: () => i, value: void 0 }; } -class A4 { +class oj { constructor() { this._entries = /* @__PURE__ */ new Map(); } @@ -56538,7 +56538,7 @@ class A4 { } matches(e) { const t = [...this._entries.keys()]; - return nt.some(this, ([i, n]) => n.asFile()) && t.push("files"), M4(bx(e), t); + return nt.some(this, ([i, n]) => n.asFile()) && t.push("files"), rj(TL(e), t); } get(e) { var t; @@ -56578,16 +56578,16 @@ class A4 { yield [e, i]; } toKey(e) { - return bx(e); + return TL(e); } } -function bx(s) { +function TL(s) { return s.toLowerCase(); } -function x4(s, e) { - return M4(bx(s), e.map(bx)); +function lj(s, e) { + return rj(TL(s), e.map(TL)); } -function M4(s, e) { +function rj(s, e) { if (s === "*/*") return e.length > 0; if (e.includes(s)) @@ -56596,16 +56596,16 @@ function M4(s, e) { if (!t) return !1; const [i, n, o] = t; - return o === "*" ? e.some((r) => r.startsWith(n + "/")) : !1; + return o === "*" ? e.some((l) => l.startsWith(n + "/")) : !1; } -const DI = Object.freeze({ +const _x = Object.freeze({ // http://amundsen.com/hypermedia/urilist/ - create: (s) => Oc(s.map((e) => e.toString())).join(`\r + create: (s) => Qd(s.map((e) => e.toString())).join(`\r `), split: (s) => s.split(`\r `), - parse: (s) => DI.split(s).filter((e) => !e.startsWith("#")) -}), oa = class oa { + parse: (s) => _x.split(s).filter((e) => !e.startsWith("#")) +}), dc = class dc { constructor(e) { this.value = e; } @@ -56613,32 +56613,32 @@ const DI = Object.freeze({ return this.value === e.value; } contains(e) { - return this.equals(e) || this.value === "" || e.value.startsWith(this.value + oa.sep); + return this.equals(e) || this.value === "" || e.value.startsWith(this.value + dc.sep); } intersects(e) { return this.contains(e) || e.contains(this); } append(...e) { - return new oa((this.value ? [this.value, ...e] : e).join(oa.sep)); + return new dc((this.value ? [this.value, ...e] : e).join(dc.sep)); } }; -oa.sep = ".", oa.None = new oa("@@none@@"), oa.Empty = new oa(""); -let $t = oa; -const zz = { +dc.sep = ".", dc.None = new dc("@@none@@"), dc.Empty = new dc(""); +let ei = dc; +const mA = { EDITORS: "CodeEditors", FILES: "CodeFiles" }; -class Ime { +class Wpe { } -const Nme = { +const Gpe = { DragAndDropContribution: "workbench.contributions.dragAndDrop" }; -Di.add(Nme.DragAndDropContribution, new Ime()); -const ww = class ww { +ki.add(Gpe.DragAndDropContribution, new Wpe()); +const wy = class wy { constructor() { } static getInstance() { - return ww.INSTANCE; + return wy.INSTANCE; } hasData(e) { return e && e === this.proto; @@ -56648,92 +56648,92 @@ const ww = class ww { return this.data; } }; -ww.INSTANCE = new ww(); -let NT = ww; -function Z4(s) { - const e = new A4(); +wy.INSTANCE = new wy(); +let OT = wy; +function cj(s) { + const e = new oj(); for (const t of s.items) { const i = t.type; if (t.kind === "string") { const n = new Promise((o) => t.getAsString(o)); - e.append(i, HX(n)); + e.append(i, ZH(n)); } else if (t.kind === "file") { const n = t.getAsFile(); - n && e.append(i, Wme(n)); + n && e.append(i, Xpe(n)); } } return e; } -function Wme(s) { - const e = s.path ? Le.parse(s.path) : void 0; - return _me(s.name, e, async () => new Uint8Array(await s.arrayBuffer())); +function Xpe(s) { + const e = s.path ? Xe.parse(s.path) : void 0; + return ype(s.name, e, async () => new Uint8Array(await s.arrayBuffer())); } -const vme = Object.freeze([ - zz.EDITORS, - zz.FILES, - f1.RESOURCES, - f1.INTERNAL_URI_LIST +const Vpe = Object.freeze([ + mA.EDITORS, + mA.FILES, + CW.RESOURCES, + CW.INTERNAL_URI_LIST ]); -function _4(s, e = !1) { - const t = Z4(s), i = t.get(f1.INTERNAL_URI_LIST); +function dj(s, e = !1) { + const t = cj(s), i = t.get(CW.INTERNAL_URI_LIST); if (i) - t.replace(bi.uriList, i); - else if (e || !t.has(bi.uriList)) { + t.replace(fi.uriList, i); + else if (e || !t.has(fi.uriList)) { const n = []; for (const o of s.items) { - const r = o.getAsFile(); - if (r) { - const l = r.path; + const l = o.getAsFile(); + if (l) { + const r = l.path; try { - l ? n.push(Le.file(l).toString()) : n.push(Le.parse(r.name, !0).toString()); + r ? n.push(Xe.file(r).toString()) : n.push(Xe.parse(l.name, !0).toString()); } catch { } } } - n.length && t.replace(bi.uriList, HX(DI.create(n))); + n.length && t.replace(fi.uriList, ZH(_x.create(n))); } - for (const n of vme) + for (const n of Vpe) t.delete(n); return t; } -const TC = $e("IWorkspaceEditService"); -class JX { +const UG = $e("IWorkspaceEditService"); +class fH { constructor(e) { this.metadata = e; } static convert(e) { return e.edits.map((t) => { - if (sh.is(t)) - return sh.lift(t); - if (Gf.is(t)) - return Gf.lift(t); + if (ch.is(t)) + return ch.lift(t); + if (zg.is(t)) + return zg.lift(t); throw new Error("Unsupported edit"); }); } } -class sh extends JX { +class ch extends fH { static is(e) { - return e instanceof sh ? !0 : tn(e) && Le.isUri(e.resource) && tn(e.textEdit); + return e instanceof ch ? !0 : nn(e) && Xe.isUri(e.resource) && nn(e.textEdit); } static lift(e) { - return e instanceof sh ? e : new sh(e.resource, e.textEdit, e.versionId, e.metadata); + return e instanceof ch ? e : new ch(e.resource, e.textEdit, e.versionId, e.metadata); } constructor(e, t, i = void 0, n) { super(n), this.resource = e, this.textEdit = t, this.versionId = i; } } -class Gf extends JX { +class zg extends fH { static is(e) { - return e instanceof Gf ? !0 : tn(e) && (!!e.newResource || !!e.oldResource); + return e instanceof zg ? !0 : nn(e) && (!!e.newResource || !!e.oldResource); } static lift(e) { - return e instanceof Gf ? e : new Gf(e.oldResource, e.newResource, e.options, e.metadata); + return e instanceof zg ? e : new zg(e.oldResource, e.newResource, e.options, e.metadata); } constructor(e, t, i = {}, n) { super(n), this.oldResource = e, this.newResource = t, this.options = i; } } -class Tme { +class Lpe { constructor() { this._value = "", this._pos = 0; } @@ -56754,7 +56754,7 @@ class Tme { return this._value[this._pos]; } } -class Dme { +class Ipe { constructor(e = !0) { this._caseSensitive = e; } @@ -56778,13 +56778,13 @@ class Dme { return this; } cmp(e) { - return this._caseSensitive ? eE(e, this._value, 0, e.length, this._from, this._to) : hC(e, this._value, 0, e.length, this._from, this._to); + return this._caseSensitive ? Iv(e, this._value, 0, e.length, this._from, this._to) : LG(e, this._value, 0, e.length, this._from, this._to); } value() { return this._value.substring(this._from, this._to); } } -class Vme { +class Spe { constructor(e = !0, t = !0) { this._splitOnBackslash = e, this._caseSensitive = t; } @@ -56816,13 +56816,13 @@ class Vme { return this; } cmp(e) { - return this._caseSensitive ? eE(e, this._value, 0, e.length, this._from, this._to) : hC(e, this._value, 0, e.length, this._from, this._to); + return this._caseSensitive ? Iv(e, this._value, 0, e.length, this._from, this._to) : LG(e, this._value, 0, e.length, this._from, this._to); } value() { return this._value.substring(this._from, this._to); } } -class kme { +class xpe { constructor(e, t) { this._ignorePathCasing = e, this._ignoreQueryAndFragment = t, this._states = [], this._stateIdx = 0; } @@ -56833,7 +56833,7 @@ class kme { ), this._value.authority && this._states.push( 2 /* UriIteratorState.Authority */ - ), this._value.path && (this._pathIterator = new Vme(!1, !this._ignorePathCasing(e)), this._pathIterator.reset(e.path), this._pathIterator.value() && this._states.push( + ), this._value.path && (this._pathIterator = new Spe(!1, !this._ignorePathCasing(e)), this._pathIterator.reset(e.path), this._pathIterator.value() && this._states.push( 3 /* UriIteratorState.Path */ )), this._ignoreQueryAndFragment(e) || (this._value.query && this._states.push( @@ -56852,15 +56852,15 @@ class kme { } cmp(e) { if (this._states[this._stateIdx] === 1) - return x2(e, this._value.scheme); + return UN(e, this._value.scheme); if (this._states[this._stateIdx] === 2) - return x2(e, this._value.authority); + return UN(e, this._value.authority); if (this._states[this._stateIdx] === 3) return this._pathIterator.cmp(e); if (this._states[this._stateIdx] === 4) - return vw(e, this._value.query); + return Ay(e, this._value.query); if (this._states[this._stateIdx] === 5) - return vw(e, this._value.fragment); + return Ay(e, this._value.fragment); throw new Error(); } value() { @@ -56877,7 +56877,7 @@ class kme { throw new Error(); } } -class AS { +class v1 { constructor() { this.height = 1; } @@ -56904,15 +56904,15 @@ class AS { return ((e = this.right) == null ? void 0 : e.height) ?? 0; } } -class Rf { +class Ag { static forUris(e = () => !1, t = () => !1) { - return new Rf(new kme(e, t)); + return new Ag(new xpe(e, t)); } static forStrings() { - return new Rf(new Tme()); + return new Ag(new Lpe()); } static forConfigKeys() { - return new Rf(new Dme()); + return new Ag(new Ipe()); } constructor(e) { this._iter = e; @@ -56923,54 +56923,54 @@ class Rf { set(e, t) { const i = this._iter.reset(e); let n; - this._root || (this._root = new AS(), this._root.segment = i.value()); + this._root || (this._root = new v1(), this._root.segment = i.value()); const o = []; for (n = this._root; ; ) { - const l = i.cmp(n.segment); - if (l > 0) - n.left || (n.left = new AS(), n.left.segment = i.value()), o.push([-1, n]), n = n.left; - else if (l < 0) - n.right || (n.right = new AS(), n.right.segment = i.value()), o.push([1, n]), n = n.right; + const r = i.cmp(n.segment); + if (r > 0) + n.left || (n.left = new v1(), n.left.segment = i.value()), o.push([-1, n]), n = n.left; + else if (r < 0) + n.right || (n.right = new v1(), n.right.segment = i.value()), o.push([1, n]), n = n.right; else if (i.hasNext()) - i.next(), n.mid || (n.mid = new AS(), n.mid.segment = i.value()), o.push([0, n]), n = n.mid; + i.next(), n.mid || (n.mid = new v1(), n.mid.segment = i.value()), o.push([0, n]), n = n.mid; else break; } - const r = n.value; + const l = n.value; n.value = t, n.key = e; - for (let l = o.length - 1; l >= 0; l--) { - const a = o[l][1]; - a.updateHeight(); - const c = a.balanceFactor(); - if (c < -1 || c > 1) { - const d = o[l][0], h = o[l + 1][0]; - if (d === 1 && h === 1) - o[l][1] = a.rotateLeft(); - else if (d === -1 && h === -1) - o[l][1] = a.rotateRight(); - else if (d === 1 && h === -1) - a.right = o[l + 1][1] = o[l + 1][1].rotateRight(), o[l][1] = a.rotateLeft(); - else if (d === -1 && h === 1) - a.left = o[l + 1][1] = o[l + 1][1].rotateLeft(), o[l][1] = a.rotateRight(); + for (let r = o.length - 1; r >= 0; r--) { + const c = o[r][1]; + c.updateHeight(); + const d = c.balanceFactor(); + if (d < -1 || d > 1) { + const a = o[r][0], h = o[r + 1][0]; + if (a === 1 && h === 1) + o[r][1] = c.rotateLeft(); + else if (a === -1 && h === -1) + o[r][1] = c.rotateRight(); + else if (a === 1 && h === -1) + c.right = o[r + 1][1] = o[r + 1][1].rotateRight(), o[r][1] = c.rotateLeft(); + else if (a === -1 && h === 1) + c.left = o[r + 1][1] = o[r + 1][1].rotateLeft(), o[r][1] = c.rotateRight(); else throw new Error(); - if (l > 0) - switch (o[l - 1][0]) { + if (r > 0) + switch (o[r - 1][0]) { case -1: - o[l - 1][1].left = o[l][1]; + o[r - 1][1].left = o[r][1]; break; case 1: - o[l - 1][1].right = o[l][1]; + o[r - 1][1].right = o[r][1]; break; case 0: - o[l - 1][1].mid = o[l][1]; + o[r - 1][1].mid = o[r][1]; break; } else this._root = o[0][1]; } } - return r; + return l; } get(e) { var t; @@ -57006,10 +57006,10 @@ class Rf { const i = this._iter.reset(e), n = []; let o = this._root; for (; o; ) { - const r = i.cmp(o.segment); - if (r > 0) + const l = i.cmp(o.segment); + if (l > 0) n.push([-1, o]), o = o.left; - else if (r < 0) + else if (l < 0) n.push([1, o]), o = o.right; else if (i.hasNext()) i.next(), n.push([0, o]), o = o.mid; @@ -57019,43 +57019,43 @@ class Rf { if (o) { if (t ? (o.left = void 0, o.mid = void 0, o.right = void 0, o.height = 1) : (o.key = void 0, o.value = void 0), !o.mid && !o.value) if (o.left && o.right) { - const r = this._min(o.right); - if (r.key) { - const { key: l, value: a, segment: c } = r; - this._delete(r.key, !1), o.key = l, o.value = a, o.segment = c; + const l = this._min(o.right); + if (l.key) { + const { key: r, value: c, segment: d } = l; + this._delete(l.key, !1), o.key = r, o.value = c, o.segment = d; } } else { - const r = o.left ?? o.right; + const l = o.left ?? o.right; if (n.length > 0) { - const [l, a] = n[n.length - 1]; - switch (l) { + const [r, c] = n[n.length - 1]; + switch (r) { case -1: - a.left = r; + c.left = l; break; case 0: - a.mid = r; + c.mid = l; break; case 1: - a.right = r; + c.right = l; break; } } else - this._root = r; + this._root = l; } - for (let r = n.length - 1; r >= 0; r--) { - const l = n[r][1]; - l.updateHeight(); - const a = l.balanceFactor(); - if (a > 1 ? (l.right.balanceFactor() >= 0 || (l.right = l.right.rotateRight()), n[r][1] = l.rotateLeft()) : a < -1 && (l.left.balanceFactor() <= 0 || (l.left = l.left.rotateLeft()), n[r][1] = l.rotateRight()), r > 0) - switch (n[r - 1][0]) { + for (let l = n.length - 1; l >= 0; l--) { + const r = n[l][1]; + r.updateHeight(); + const c = r.balanceFactor(); + if (c > 1 ? (r.right.balanceFactor() >= 0 || (r.right = r.right.rotateRight()), n[l][1] = r.rotateLeft()) : c < -1 && (r.left.balanceFactor() <= 0 || (r.left = r.left.rotateLeft()), n[l][1] = r.rotateRight()), l > 0) + switch (n[l - 1][0]) { case -1: - n[r - 1][1].left = n[r][1]; + n[l - 1][1].left = n[l][1]; break; case 1: - n[r - 1][1].right = n[r][1]; + n[l - 1][1].right = n[l][1]; break; case 0: - n[r - 1][1].mid = n[r][1]; + n[l - 1][1].mid = n[l][1]; break; } else @@ -57117,21 +57117,21 @@ class Rf { e && (e.left && this._dfsEntries(e.left, t), e.value && t.push([e.key, e.value]), e.mid && this._dfsEntries(e.mid, t), e.right && this._dfsEntries(e.right, t)); } } -const Cm = $e("contextService"); -function WT(s) { +const Ib = $e("contextService"); +function jT(s) { const e = s; - return typeof (e == null ? void 0 : e.id) == "string" && Le.isUri(e.uri); + return typeof (e == null ? void 0 : e.id) == "string" && Xe.isUri(e.uri); } -function Gme(s) { +function Cpe(s) { const e = s; - return typeof (e == null ? void 0 : e.id) == "string" && !WT(s) && !Xme(s); + return typeof (e == null ? void 0 : e.id) == "string" && !jT(s) && !wpe(s); } -const Rme = { id: "empty-window" }; -function Eme(s, e) { +const Rpe = { id: "empty-window" }; +function Npe(s, e) { if (typeof s == "string" || typeof s > "u") return typeof s == "string" ? { - id: $d(s) - } : Rme; + id: nh(s) + } : Rpe; const t = s; return t.configuration ? { id: t.id, @@ -57143,11 +57143,11 @@ function Eme(s, e) { id: t.id }; } -function Xme(s) { +function wpe(s) { const e = s; - return typeof (e == null ? void 0 : e.id) == "string" && Le.isUri(e.configPath); + return typeof (e == null ? void 0 : e.id) == "string" && Xe.isUri(e.configPath); } -let Fme = class { +let Tpe = class { constructor(e, t) { this.raw = t, this.uri = e.uri, this.index = e.index, this.name = e.name; } @@ -57155,28 +57155,28 @@ let Fme = class { return { uri: this.uri, name: this.name, index: this.index }; } }; -const vT = "code-workspace"; +const qT = "code-workspace"; p("codeWorkspace", "Code Workspace"); -const I4 = "4064f6ec-cb38-4ad0-af64-ee6467e63c82"; -function Yme(s) { - return s.id === I4; +const aj = "4064f6ec-cb38-4ad0-af64-ee6467e63c82"; +function Mpe(s) { + return s.id === aj; } -var UX = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var yH = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, M1 = function(s, e) { +}, JW = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class KX { +class WH { async provideDocumentPasteEdits(e, t, i, n, o) { - const r = await this.getEdit(i, o); - if (r) + const l = await this.getEdit(i, o); + if (l) return { - edits: [{ insertText: r.insertText, title: r.title, kind: r.kind, handledMimeType: r.handledMimeType, yieldTo: r.yieldTo }], + edits: [{ insertText: l.insertText, title: l.title, kind: l.kind, handledMimeType: l.handledMimeType, yieldTo: l.yieldTo }], dispose() { } }; @@ -57191,83 +57191,83 @@ class KX { }; } } -const Cw = class Cw extends KX { +const Ty = class Ty extends WH { constructor() { - super(...arguments), this.kind = Cw.kind, this.dropMimeTypes = [bi.text], this.pasteMimeTypes = [bi.text]; + super(...arguments), this.kind = Ty.kind, this.dropMimeTypes = [fi.text], this.pasteMimeTypes = [fi.text]; } async getEdit(e, t) { - const i = e.get(bi.text); - if (!i || e.has(bi.uriList)) + const i = e.get(fi.text); + if (!i || e.has(fi.uriList)) return; const n = await i.asString(); return { - handledMimeType: bi.text, + handledMimeType: fi.text, title: p("text.label", "Insert Plain Text"), insertText: n, kind: this.kind }; } }; -Cw.id = "text", Cw.kind = new $t("text.plain"); -let Sm = Cw; -class N4 extends KX { +Ty.id = "text", Ty.kind = new ei("text.plain"); +let Sb = Ty; +class hj extends WH { constructor() { - super(...arguments), this.kind = new $t("uri.absolute"), this.dropMimeTypes = [bi.uriList], this.pasteMimeTypes = [bi.uriList]; + super(...arguments), this.kind = new ei("uri.absolute"), this.dropMimeTypes = [fi.uriList], this.pasteMimeTypes = [fi.uriList]; } async getEdit(e, t) { - const i = await W4(e); + const i = await uj(e); if (!i.length || t.isCancellationRequested) return; let n = 0; - const o = i.map(({ uri: l, originalText: a }) => l.scheme === Ge.file ? l.fsPath : (n++, a)).join(" "); - let r; - return n > 0 ? r = i.length > 1 ? p("defaultDropProvider.uriList.uris", "Insert Uris") : p("defaultDropProvider.uriList.uri", "Insert Uri") : r = i.length > 1 ? p("defaultDropProvider.uriList.paths", "Insert Paths") : p("defaultDropProvider.uriList.path", "Insert Path"), { - handledMimeType: bi.uriList, + const o = i.map(({ uri: r, originalText: c }) => r.scheme === ve.file ? r.fsPath : (n++, c)).join(" "); + let l; + return n > 0 ? l = i.length > 1 ? p("defaultDropProvider.uriList.uris", "Insert Uris") : p("defaultDropProvider.uriList.uri", "Insert Uri") : l = i.length > 1 ? p("defaultDropProvider.uriList.paths", "Insert Paths") : p("defaultDropProvider.uriList.path", "Insert Path"), { + handledMimeType: fi.uriList, insertText: o, - title: r, + title: l, kind: this.kind }; } } -let yx = class extends KX { +let ML = class extends WH { constructor(e) { - super(), this._workspaceContextService = e, this.kind = new $t("uri.relative"), this.dropMimeTypes = [bi.uriList], this.pasteMimeTypes = [bi.uriList]; + super(), this._workspaceContextService = e, this.kind = new ei("uri.relative"), this.dropMimeTypes = [fi.uriList], this.pasteMimeTypes = [fi.uriList]; } async getEdit(e, t) { - const i = await W4(e); + const i = await uj(e); if (!i.length || t.isCancellationRequested) return; - const n = Or(i.map(({ uri: o }) => { - const r = this._workspaceContextService.getWorkspaceFolder(o); - return r ? $le(r.uri, o) : void 0; + const n = _l(i.map(({ uri: o }) => { + const l = this._workspaceContextService.getWorkspaceFolder(o); + return l ? Uce(l.uri, o) : void 0; })); if (n.length) return { - handledMimeType: bi.uriList, + handledMimeType: fi.uriList, insertText: n.join(" "), title: i.length > 1 ? p("defaultDropProvider.uriList.relativePaths", "Insert Relative Paths") : p("defaultDropProvider.uriList.relativePath", "Insert Relative Path"), kind: this.kind }; } }; -yx = UX([ - M1(0, Cm) -], yx); -class zme { +ML = yH([ + JW(0, Ib) +], ML); +class Ype { constructor() { - this.kind = new $t("html"), this.pasteMimeTypes = ["text/html"], this._yieldTo = [{ mimeType: bi.text }]; + this.kind = new ei("html"), this.pasteMimeTypes = ["text/html"], this._yieldTo = [{ mimeType: fi.text }]; } async provideDocumentPasteEdits(e, t, i, n, o) { - var a; - if (n.triggerKind !== $w.PasteAs && !((a = n.only) != null && a.contains(this.kind))) + var c; + if (n.triggerKind !== hW.PasteAs && !((c = n.only) != null && c.contains(this.kind))) return; - const r = i.get("text/html"), l = await (r == null ? void 0 : r.asString()); - if (!(!l || o.isCancellationRequested)) + const l = i.get("text/html"), r = await (l == null ? void 0 : l.asString()); + if (!(!r || o.isCancellationRequested)) return { dispose() { }, edits: [{ - insertText: l, + insertText: r, yieldTo: this._yieldTo, title: p("pasteHtmlLabel", "Insert HTML"), kind: this.kind @@ -57275,37 +57275,37 @@ class zme { }; } } -async function W4(s) { - const e = s.get(bi.uriList); +async function uj(s) { + const e = s.get(fi.uriList); if (!e) return []; const t = await e.asString(), i = []; - for (const n of DI.parse(t)) + for (const n of _x.parse(t)) try { - i.push({ uri: Le.parse(n), originalText: n }); + i.push({ uri: Xe.parse(n), originalText: n }); } catch { } return i; } -let TT = class extends R { +let $T = class extends J { constructor(e, t) { - super(), this._register(e.documentDropEditProvider.register("*", new Sm())), this._register(e.documentDropEditProvider.register("*", new N4())), this._register(e.documentDropEditProvider.register("*", new yx(t))); + super(), this._register(e.documentDropEditProvider.register("*", new Sb())), this._register(e.documentDropEditProvider.register("*", new hj())), this._register(e.documentDropEditProvider.register("*", new ML(t))); } }; -TT = UX([ - M1(0, ge), - M1(1, Cm) -], TT); -let DT = class extends R { +$T = yH([ + JW(0, me), + JW(1, Ib) +], $T); +let eM = class extends J { constructor(e, t) { - super(), this._register(e.documentPasteEditProvider.register("*", new Sm())), this._register(e.documentPasteEditProvider.register("*", new N4())), this._register(e.documentPasteEditProvider.register("*", new yx(t))), this._register(e.documentPasteEditProvider.register("*", new zme())); + super(), this._register(e.documentPasteEditProvider.register("*", new Sb())), this._register(e.documentPasteEditProvider.register("*", new hj())), this._register(e.documentPasteEditProvider.register("*", new ML(t))), this._register(e.documentPasteEditProvider.register("*", new Ype())); } }; -DT = UX([ - M1(0, ge), - M1(1, Cm) -], DT); -const Wr = class Wr { +eM = yH([ + JW(0, me), + JW(1, Ib) +], eM); +const Ml = class Ml { constructor() { this.value = "", this.pos = 0; } @@ -57326,30 +57326,30 @@ const Wr = class Wr { return { type: 14, pos: this.pos, len: 0 }; const e = this.pos; let t = 0, i = this.value.charCodeAt(e), n; - if (n = Wr._table[i], typeof n == "number") + if (n = Ml._table[i], typeof n == "number") return this.pos += 1, { type: n, pos: e, len: 1 }; - if (Wr.isDigitCharacter(i)) { + if (Ml.isDigitCharacter(i)) { n = 8; do t += 1, i = this.value.charCodeAt(e + t); - while (Wr.isDigitCharacter(i)); + while (Ml.isDigitCharacter(i)); return this.pos += t, { type: n, pos: e, len: t }; } - if (Wr.isVariableCharacter(i)) { + if (Ml.isVariableCharacter(i)) { n = 9; do i = this.value.charCodeAt(e + ++t); - while (Wr.isVariableCharacter(i) || Wr.isDigitCharacter(i)); + while (Ml.isVariableCharacter(i) || Ml.isDigitCharacter(i)); return this.pos += t, { type: n, pos: e, len: t }; } n = 10; do t += 1, i = this.value.charCodeAt(e + t); - while (!isNaN(i) && typeof Wr._table[i] > "u" && !Wr.isDigitCharacter(i) && !Wr.isVariableCharacter(i)); + while (!isNaN(i) && typeof Ml._table[i] > "u" && !Ml.isDigitCharacter(i) && !Ml.isVariableCharacter(i)); return this.pos += t, { type: n, pos: e, len: t }; } }; -Wr._table = { +Ml._table = { 36: 0, 58: 1, 44: 2, @@ -57362,8 +57362,8 @@ Wr._table = { 45: 12, 63: 13 }; -let VT = Wr; -class m0 { +let tM = Ml; +class W0 { constructor() { this._children = []; } @@ -57372,9 +57372,9 @@ class m0 { } replace(e, t) { const { parent: i } = e, n = i.children.indexOf(e), o = i.children.slice(0); - o.splice(n, 1, ...t), i._children = o, function r(l, a) { - for (const c of l) - c.parent = a, r(c.children, c); + o.splice(n, 1, ...t), i._children = o, function l(r, c) { + for (const d of r) + d.parent = c, l(d.children, d); }(t, i); } get children() { @@ -57388,7 +57388,7 @@ class m0 { for (; ; ) { if (!e) return; - if (e instanceof DC) + if (e instanceof PG) return e; e = e.parent; } @@ -57400,7 +57400,7 @@ class m0 { return 0; } } -class as extends m0 { +class as extends W0 { constructor(e) { super(), this.value = e; } @@ -57414,9 +57414,9 @@ class as extends m0 { return new as(this.value); } } -class v4 extends m0 { +class mj extends W0 { } -class or extends v4 { +class rl extends mj { static compareByIndex(e, t) { return e.index === t.index ? 0 : e.isFinalTabstop ? 1 : t.isFinalTabstop || e.index < t.index ? -1 : e.index > t.index ? 1 : 0; } @@ -57427,14 +57427,14 @@ class or extends v4 { return this.index === 0; } get choice() { - return this._children.length === 1 && this._children[0] instanceof p0 ? this._children[0] : void 0; + return this._children.length === 1 && this._children[0] instanceof G0 ? this._children[0] : void 0; } clone() { - const e = new or(this.index); + const e = new rl(this.index); return this.transform && (e.transform = this.transform.clone()), e._children = this.children.map((t) => t.clone()), e; } } -class p0 extends m0 { +class G0 extends W0 { constructor() { super(...arguments), this.options = []; } @@ -57448,11 +57448,11 @@ class p0 extends m0 { return this.options[0].len(); } clone() { - const e = new p0(); + const e = new G0(); return this.options.forEach(e.appendChild, e), e; } } -class QX extends m0 { +class GH extends W0 { constructor() { super(...arguments), this.regexp = new RegExp(""); } @@ -57461,12 +57461,12 @@ class QX extends m0 { let i = !1, n = e.replace(this.regexp, function() { return i = !0, t._replace(Array.prototype.slice.call(arguments, 0, -2)); }); - return !i && this._children.some((o) => o instanceof ml && !!o.elseValue) && (n = this._replace([])), n; + return !i && this._children.some((o) => o instanceof fr && !!o.elseValue) && (n = this._replace([])), n; } _replace(e) { let t = ""; for (const i of this._children) - if (i instanceof ml) { + if (i instanceof fr) { let n = e[i.index] || ""; n = i.resolve(n), t += n; } else @@ -57477,11 +57477,11 @@ class QX extends m0 { return ""; } clone() { - const e = new QX(); + const e = new GH(); return e.regexp = new RegExp(this.regexp.source, (this.regexp.ignoreCase ? "i" : "") + (this.regexp.global ? "g" : "")), e._children = this.children.map((t) => t.clone()), e; } } -class ml extends m0 { +class fr extends W0 { constructor(e, t, i, n) { super(), this.index = e, this.shorthandName = t, this.ifValue = i, this.elseValue = n; } @@ -57497,10 +57497,10 @@ class ml extends m0 { return t ? t.map((i, n) => n === 0 ? i.charAt(0).toLowerCase() + i.substr(1) : i.charAt(0).toUpperCase() + i.substr(1)).join("") : e; } clone() { - return new ml(this.index, this.shorthandName, this.ifValue, this.elseValue); + return new fr(this.index, this.shorthandName, this.ifValue, this.elseValue); } } -class Z1 extends v4 { +class HW extends mj { constructor(e) { super(), this.name = e; } @@ -57509,11 +57509,11 @@ class Z1 extends v4 { return this.transform && (t = this.transform.resolve(t || "")), t !== void 0 ? (this._children = [new as(t)], !0) : !1; } clone() { - const e = new Z1(this.name); + const e = new HW(this.name); return this.transform && (e.transform = this.transform.clone()), e._children = this.children.map((t) => t.clone()), e; } } -function Pz(s, e) { +function bA(s, e) { const t = [...s]; for (; t.length > 0; ) { const i = t.shift(); @@ -57522,13 +57522,13 @@ function Pz(s, e) { t.unshift(...i.children); } } -class DC extends m0 { +class PG extends W0 { get placeholderInfo() { if (!this._placeholders) { const e = []; let t; this.walk(function(i) { - return i instanceof or && (e.push(i), t = !t || t.index < i.index ? i : t), !0; + return i instanceof rl && (e.push(i), t = !t || t.index < i.index ? i : t), !0; }), this._placeholders = { all: e, last: t }; } return this._placeholders; @@ -57543,17 +57543,17 @@ class DC extends m0 { } fullLen(e) { let t = 0; - return Pz([e], (i) => (t += i.len(), !0)), t; + return bA([e], (i) => (t += i.len(), !0)), t; } enclosingPlaceholders(e) { const t = []; let { parent: i } = e; for (; i; ) - i instanceof or && t.push(i), i = i.parent; + i instanceof rl && t.push(i), i = i.parent; return t; } resolveVariables(e) { - return this.walk((t) => (t instanceof Z1 && t.resolve(e) && (this._placeholders = void 0), !0)), this; + return this.walk((t) => (t instanceof HW && t.resolve(e) && (this._placeholders = void 0), !0)), this; } appendChild(e) { return this._placeholders = void 0, super.appendChild(e); @@ -57562,16 +57562,16 @@ class DC extends m0 { return this._placeholders = void 0, super.replace(e, t); } clone() { - const e = new DC(); + const e = new PG(); return this._children = this.children.map((t) => t.clone()), e; } walk(e) { - Pz(this.children, e); + bA(this.children, e); } } -class Lm { +class xb { constructor() { - this._scanner = new VT(), this._token = { type: 14, pos: 0, len: 0 }; + this._scanner = new tM(), this._token = { type: 14, pos: 0, len: 0 }; } static escape(e) { return e.replace(/\$|}|\\/g, "\\$&"); @@ -57580,7 +57580,7 @@ class Lm { return /\${?CLIPBOARD/.test(e); } parse(e, t, i) { - const n = new DC(); + const n = new PG(); return this.parseFragment(e, n), this.ensureFinalTabstop(n, i ?? !1, t ?? !1), n; } parseFragment(e, t) { @@ -57588,25 +57588,25 @@ class Lm { for (this._scanner.text(e), this._token = this._scanner.next(); this._parse(t); ) ; const n = /* @__PURE__ */ new Map(), o = []; - t.walk((a) => (a instanceof or && (a.isFinalTabstop ? n.set(0, void 0) : !n.has(a.index) && a.children.length > 0 ? n.set(a.index, a.children) : o.push(a)), !0)); - const r = (a, c) => { - const d = n.get(a.index); - if (!d) + t.walk((c) => (c instanceof rl && (c.isFinalTabstop ? n.set(0, void 0) : !n.has(c.index) && c.children.length > 0 ? n.set(c.index, c.children) : o.push(c)), !0)); + const l = (c, d) => { + const a = n.get(c.index); + if (!a) return; - const h = new or(a.index); - h.transform = a.transform; - for (const u of d) { - const g = u.clone(); - h.appendChild(g), g instanceof or && n.has(g.index) && !c.has(g.index) && (c.add(g.index), r(g, c), c.delete(g.index)); - } - t.replace(a, [h]); - }, l = /* @__PURE__ */ new Set(); - for (const a of o) - r(a, l); + const h = new rl(c.index); + h.transform = c.transform; + for (const u of a) { + const m = u.clone(); + h.appendChild(m), m instanceof rl && n.has(m.index) && !d.has(m.index) && (d.add(m.index), l(m, d), d.delete(m.index)); + } + t.replace(c, [h]); + }, r = /* @__PURE__ */ new Set(); + for (const c of o) + l(c, r); return t.children.slice(i); } ensureFinalTabstop(e, t, i) { - (t || i && e.placeholders.length > 0) && (e.placeholders.find((o) => o.index === 0) || e.appendChild(new or(0))); + (t || i && e.placeholders.length > 0) && (e.placeholders.find((o) => o.index === 0) || e.appendChild(new rl(0))); } _accept(e, t) { if (e === void 0 || this._token.type === e) { @@ -57648,7 +57648,7 @@ class Lm { return this._accept( 0 /* TokenType.Dollar */ - ) && (t = this._accept(9, !0) || this._accept(8, !0)) ? (e.appendChild(/^\d+$/.test(t) ? new or(Number(t)) : new Z1(t)), !0) : this._backTo(i); + ) && (t = this._accept(9, !0) || this._accept(8, !0)) ? (e.appendChild(/^\d+$/.test(t) ? new rl(Number(t)) : new HW(t)), !0) : this._backTo(i); } // ${1:}, ${1} -> placeholder _parseComplexPlaceholder(e) { @@ -57662,7 +57662,7 @@ class Lm { /* TokenType.CurlyOpen */ ) && (t = this._accept(8, !0)))) return this._backTo(i); - const o = new or(Number(t)); + const o = new rl(Number(t)); if (this._accept( 1 /* TokenType.Colon */ @@ -57680,9 +57680,9 @@ class Lm { 7 /* TokenType.Pipe */ )) { - const r = new p0(); + const l = new G0(); for (; ; ) { - if (this._parseChoiceElement(r)) { + if (this._parseChoiceElement(l)) { if (this._accept( 2 /* TokenType.Comma */ @@ -57691,7 +57691,7 @@ class Lm { if (this._accept( 7 /* TokenType.Pipe */ - ) && (o.appendChild(r), this._accept( + ) && (o.appendChild(l), this._accept( 4 /* TokenType.CurlyClose */ ))) @@ -57729,7 +57729,7 @@ class Lm { /* TokenType.CurlyOpen */ ) && (t = this._accept(9, !0)))) return this._backTo(i); - const o = new Z1(t); + const o = new HW(t); if (this._accept( 1 /* TokenType.Colon */ @@ -57752,7 +57752,7 @@ class Lm { ) ? (e.appendChild(o), !0) : this._backTo(i); } _parseTransform(e) { - const t = new QX(); + const t = new GH(); let i = "", n = ""; for (; !this._accept( 6 @@ -57817,13 +57817,13 @@ class Lm { 4 /* TokenType.CurlyClose */ )) - return e.appendChild(new ml(Number(n))), !0; + return e.appendChild(new fr(Number(n))), !0; if (!this._accept( 1 /* TokenType.Colon */ )) return this._backTo(t), !1; - } else return e.appendChild(new ml(Number(n))), !0; + } else return e.appendChild(new fr(Number(n))), !0; else return this._backTo(t), !1; if (this._accept( 6 @@ -57833,7 +57833,7 @@ class Lm { return !o || !this._accept( 4 /* TokenType.CurlyClose */ - ) ? (this._backTo(t), !1) : (e.appendChild(new ml(Number(n), o)), !0); + ) ? (this._backTo(t), !1) : (e.appendChild(new fr(Number(n), o)), !0); } else if (this._accept( 11 /* TokenType.Plus */ @@ -57843,7 +57843,7 @@ class Lm { /* TokenType.CurlyClose */ ); if (o) - return e.appendChild(new ml(Number(n), void 0, o, void 0)), !0; + return e.appendChild(new fr(Number(n), void 0, o, void 0)), !0; } else if (this._accept( 12 /* TokenType.Dash */ @@ -57853,7 +57853,7 @@ class Lm { /* TokenType.CurlyClose */ ); if (o) - return e.appendChild(new ml(Number(n), void 0, void 0, o)), !0; + return e.appendChild(new fr(Number(n), void 0, void 0, o)), !0; } else if (this._accept( 13 /* TokenType.QuestionMark */ @@ -57863,12 +57863,12 @@ class Lm { /* TokenType.Colon */ ); if (o) { - const r = this._until( + const l = this._until( 4 /* TokenType.CurlyClose */ ); - if (r) - return e.appendChild(new ml(Number(n), void 0, o, r)), !0; + if (l) + return e.appendChild(new fr(Number(n), void 0, o, l)), !0; } } else { const o = this._until( @@ -57876,7 +57876,7 @@ class Lm { /* TokenType.CurlyClose */ ); if (o) - return e.appendChild(new ml(Number(n), void 0, void 0, o)), !0; + return e.appendChild(new fr(Number(n), void 0, void 0, o)), !0; } return this._backTo(t), !1; } @@ -57884,49 +57884,49 @@ class Lm { return this._token.type !== 14 ? (e.appendChild(new as(this._scanner.tokenText(this._token))), this._accept(void 0), !0) : !1; } } -function T4(s, e, t) { +function bj(s, e, t) { var i, n; return (typeof t.insertText == "string" ? t.insertText === "" : t.insertText.snippet === "") ? { edits: ((i = t.additionalEdit) == null ? void 0 : i.edits) ?? [] } : { edits: [ - ...e.map((o) => new sh(s, { range: o, text: typeof t.insertText == "string" ? Lm.escape(t.insertText) + "$0" : t.insertText.snippet, insertAsSnippet: !0 })), + ...e.map((o) => new ch(s, { range: o, text: typeof t.insertText == "string" ? xb.escape(t.insertText) + "$0" : t.insertText.snippet, insertAsSnippet: !0 })), ...((n = t.additionalEdit) == null ? void 0 : n.edits) ?? [] ] }; } -function D4(s) { - function e(r, l) { - return "mimeType" in r ? r.mimeType === l.handledMimeType : !!l.kind && r.kind.contains(l.kind); +function pj(s) { + function e(l, r) { + return "mimeType" in l ? l.mimeType === r.handledMimeType : !!r.kind && l.kind.contains(r.kind); } const t = /* @__PURE__ */ new Map(); - for (const r of s) - for (const l of r.yieldTo ?? []) - for (const a of s) - if (a !== r && e(l, a)) { - let c = t.get(r); - c || (c = [], t.set(r, c)), c.push(a); + for (const l of s) + for (const r of l.yieldTo ?? []) + for (const c of s) + if (c !== l && e(r, c)) { + let d = t.get(l); + d || (d = [], t.set(l, d)), d.push(c); } if (!t.size) return Array.from(s); const i = /* @__PURE__ */ new Set(), n = []; - function o(r) { - if (!r.length) + function o(l) { + if (!l.length) return []; - const l = r[0]; - if (n.includes(l)) - return console.warn("Yield to cycle detected", l), r; - if (i.has(l)) - return o(r.slice(1)); - let a = []; - const c = t.get(l); - return c && (n.push(l), a = o(c), n.pop()), i.add(l), [...a, l, ...o(r.slice(1))]; + const r = l[0]; + if (n.includes(r)) + return console.warn("Yield to cycle detected", r), l; + if (i.has(r)) + return o(l.slice(1)); + let c = []; + const d = t.get(r); + return d && (n.push(r), c = o(d), n.pop()), i.add(r), [...c, r, ...o(l.slice(1))]; } return o(Array.from(s)); } -const jX = $e("IEditorCancelService"), V4 = new ae("cancellableOperation", !1, p("cancellableOperation", "Whether the editor runs a cancellable operation, e.g. like 'Peek References'")); +const XH = $e("IEditorCancelService"), gj = new ce("cancellableOperation", !1, p("cancellableOperation", "Whether the editor runs a cancellable operation, e.g. like 'Peek References'")); it( - jX, + XH, class { constructor() { this._tokens = /* @__PURE__ */ new WeakMap(); @@ -57934,8 +57934,8 @@ it( add(s, e) { let t = this._tokens.get(s); t || (t = s.invokeWithinContext((n) => { - const o = V4.bindTo(n.get(_e)), r = new cs(); - return { key: o, tokens: r }; + const o = gj.bindTo(n.get(xe)), l = new hs(); + return { key: o, tokens: l }; }), this._tokens.set(s, t)); let i; return t.key.set(!0), i = t.tokens.push(e), () => { @@ -57953,15 +57953,15 @@ it( 1 /* InstantiationType.Delayed */ ); -class Pme extends mi { +class kpe extends pi { constructor(e, t) { - super(t), this.editor = e, this._unregister = e.invokeWithinContext((i) => i.get(jX).add(e, this)); + super(t), this.editor = e, this._unregister = e.invokeWithinContext((i) => i.get(XH).add(e, this)); } dispose() { this._unregister(), super.dispose(); } } -oe(new class extends zi { +oe(new class extends Ai { constructor() { super({ id: "editor.cancelOperation", @@ -57970,45 +57970,45 @@ oe(new class extends zi { primary: 9 /* KeyCode.Escape */ }, - precondition: V4 + precondition: gj }); } runEditorCommand(s, e) { - s.get(jX).cancel(e); + s.get(XH).cancel(e); } }()); -let k4 = class kT { +let Zj = class iM { constructor(e, t) { if (this.flags = t, this.flags & 1) { const i = e.getModel(); - this.modelVersionId = i ? rb("{0}#{1}", i.uri.toString(), i.getVersionId()) : null; + this.modelVersionId = i ? uZ("{0}#{1}", i.uri.toString(), i.getVersionId()) : null; } else this.modelVersionId = null; this.flags & 4 ? this.position = e.getPosition() : this.position = null, this.flags & 2 ? this.selection = e.getSelection() : this.selection = null, this.flags & 8 ? (this.scrollLeft = e.getScrollLeft(), this.scrollTop = e.getScrollTop()) : (this.scrollLeft = -1, this.scrollTop = -1); } _equals(e) { - if (!(e instanceof kT)) + if (!(e instanceof iM)) return !1; const t = e; return !(this.modelVersionId !== t.modelVersionId || this.scrollLeft !== t.scrollLeft || this.scrollTop !== t.scrollTop || !this.position && t.position || this.position && !t.position || this.position && t.position && !this.position.equals(t.position) || !this.selection && t.selection || this.selection && !t.selection || this.selection && t.selection && !this.selection.equalsRange(t.selection)); } validate(e) { - return this._equals(new kT(e, this.flags)); + return this._equals(new iM(e, this.flags)); } }; -class Yh extends Pme { +class Uh extends kpe { constructor(e, t, i, n) { - super(e, n), this._listener = new U(), t & 4 && this._listener.add(e.onDidChangeCursorPosition((o) => { - (!i || !M.containsPosition(i, o.position)) && this.cancel(); + super(e, n), this._listener = new _(), t & 4 && this._listener.add(e.onDidChangeCursorPosition((o) => { + (!i || !I.containsPosition(i, o.position)) && this.cancel(); })), t & 2 && this._listener.add(e.onDidChangeCursorSelection((o) => { - (!i || !M.containsRange(i, o.selection)) && this.cancel(); + (!i || !I.containsRange(i, o.selection)) && this.cancel(); })), t & 8 && this._listener.add(e.onDidScrollChange((o) => this.cancel())), t & 1 && (this._listener.add(e.onDidChangeModel((o) => this.cancel())), this._listener.add(e.onDidChangeModelContent((o) => this.cancel()))); } dispose() { this._listener.dispose(), super.dispose(); } } -class qX extends mi { +class VH extends pi { constructor(e, t) { super(t), this._listener = e.onDidChangeContent(() => this.cancel()); } @@ -58016,33 +58016,33 @@ class qX extends mi { this._listener.dispose(), super.dispose(); } } -var Bme = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var vpe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Ome = function(s, e) { +}, Jpe = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const Hme = Re.register({ +const Hpe = Je.register({ description: "inline-progress-widget", stickiness: 1, showIfCollapsed: !0, after: { - content: PH, + content: IB, inlineClassName: "inline-editor-progress-decoration", inlineClassNameAffectsLetterSpacing: !0 } -}), IZ = class IZ extends R { +}), A2 = class A2 extends J { constructor(e, t, i, n, o) { super(), this.typeId = e, this.editor = t, this.range = i, this.delegate = o, this.allowEditorOverflow = !1, this.suppressMouseDown = !0, this.create(n), this.editor.addContentWidget(this), this.editor.layoutContentWidget(this); } create(e) { - this.domNode = ce(".inline-progress-widget"), this.domNode.role = "button", this.domNode.title = e; - const t = ce("span.icon"); - this.domNode.append(t), t.classList.add(...Ze.asClassNameArray(te.loading), "codicon-modifier-spin"); + this.domNode = de(".inline-progress-widget"), this.domNode.role = "button", this.domNode.title = e; + const t = de("span.icon"); + this.domNode.append(t), t.classList.add(...Se.asClassNameArray(te.loading), "codicon-modifier-spin"); const i = () => { const n = this.editor.getOption( 67 @@ -58063,7 +58063,7 @@ const Hme = Re.register({ })); } getId() { - return IZ.baseId + "." + this.typeId; + return A2.baseId + "." + this.typeId; } getDomNode() { return this.domNode; @@ -58081,38 +58081,38 @@ const Hme = Re.register({ super.dispose(), this.editor.removeContentWidget(this); } }; -IZ.baseId = "editor.widget.inlineProgressWidget"; -let GT = IZ, wx = class extends R { +A2.baseId = "editor.widget.inlineProgressWidget"; +let nM = A2, YL = class extends J { constructor(e, t, i) { - super(), this.id = e, this._editor = t, this._instantiationService = i, this._showDelay = 500, this._showPromise = this._register(new fn()), this._currentWidget = this._register(new fn()), this._operationIdPool = 0, this._currentDecorations = t.createDecorationsCollection(); + super(), this.id = e, this._editor = t, this._instantiationService = i, this._showDelay = 500, this._showPromise = this._register(new Zn()), this._currentWidget = this._register(new Zn()), this._operationIdPool = 0, this._currentDecorations = t.createDecorationsCollection(); } dispose() { super.dispose(), this._currentDecorations.clear(); } async showWhile(e, t, i, n, o) { - const r = this._operationIdPool++; - this._currentOperation = r, this.clear(), this._showPromise.value = _h(() => { - const l = M.fromPositions(e); + const l = this._operationIdPool++; + this._currentOperation = l, this.clear(), this._showPromise.value = wh(() => { + const r = I.fromPositions(e); this._currentDecorations.set([{ - range: l, - options: Hme - }]).length > 0 && (this._currentWidget.value = this._instantiationService.createInstance(GT, this.id, this._editor, l, t, n)); + range: r, + options: Hpe + }]).length > 0 && (this._currentWidget.value = this._instantiationService.createInstance(nM, this.id, this._editor, r, t, n)); }, o ?? this._showDelay); try { return await i; } finally { - this._currentOperation === r && (this.clear(), this._currentOperation = void 0); + this._currentOperation === l && (this.clear(), this._currentOperation = void 0); } } clear() { this._showPromise.clear(), this._currentDecorations.clear(), this._currentWidget.clear(); } }; -wx = Bme([ - Ome(2, Se) -], wx); -const Bs = $e("openerService"); -function Jme(s) { +YL = vpe([ + Jpe(2, Ge) +], YL); +const Ps = $e("openerService"); +function Epe(s) { let e; const t = /^L?(\d+)(?:,(\d+))?(-L?(\d+)(?:,(\d+))?)?/.exec(s.fragment); return t && (e = { @@ -58122,17 +58122,17 @@ function Jme(s) { endColumn: t[4] ? t[5] ? parseInt(t[5]) : 1 : void 0 }, s = s.with({ fragment: "" })), { selection: e, uri: s }; } -var Ume = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Dpe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Bz = function(s, e) { +}, pA = function(s, e) { return function(t, i) { e(t, i, s); }; -}, RT, Cg; -let Qc = (Cg = class { +}, sM, Im; +let ea = (Im = class { constructor(e, t, i) { this._options = e, this._languageService = t, this._openerService = i, this._onDidRenderAsync = new k(), this.onDidRenderAsync = this._onDidRenderAsync.event; } @@ -58143,7 +58143,7 @@ let Qc = (Cg = class { if (!e) return { element: document.createElement("span"), dispose: () => { } }; - const n = new U(), o = n.add(MI(e, { ...this._getRenderOptions(e, n), ...t }, i)); + const n = new _(), o = n.add(Dx(e, { ...this._getRenderOptions(e, n), ...t }, i)); return o.element.classList.add("rendered-markdown"), { element: o.element, dispose: () => n.dispose() @@ -58152,98 +58152,98 @@ let Qc = (Cg = class { _getRenderOptions(e, t) { return { codeBlockRenderer: async (i, n) => { - var a, c; + var c, d; let o; - i ? o = this._languageService.getLanguageIdByLanguageName(i) : this._options.editor && (o = (a = this._options.editor.getModel()) == null ? void 0 : a.getLanguageId()), o || (o = ms); - const r = await Mce(this._languageService, n, o), l = document.createElement("span"); - if (l.innerHTML = ((c = RT._ttpTokenizer) == null ? void 0 : c.createHTML(r)) ?? r, this._options.editor) { - const d = this._options.editor.getOption( + i ? o = this._languageService.getLanguageIdByLanguageName(i) : this._options.editor && (o = (c = this._options.editor.getModel()) == null ? void 0 : c.getLanguageId()), o || (o = gs); + const l = await Zae(this._languageService, n, o), r = document.createElement("span"); + if (r.innerHTML = ((d = sM._ttpTokenizer) == null ? void 0 : d.createHTML(l)) ?? l, this._options.editor) { + const a = this._options.editor.getOption( 50 /* EditorOption.fontInfo */ ); - mn(l, d); - } else this._options.codeBlockFontFamily && (l.style.fontFamily = this._options.codeBlockFontFamily); - return this._options.codeBlockFontSize !== void 0 && (l.style.fontSize = this._options.codeBlockFontSize), l; + pn(r, a); + } else this._options.codeBlockFontFamily && (r.style.fontFamily = this._options.codeBlockFontFamily); + return this._options.codeBlockFontSize !== void 0 && (r.style.fontSize = this._options.codeBlockFontSize), r; }, asyncRenderCallback: () => this._onDidRenderAsync.fire(), actionHandler: { - callback: (i) => $X(this._openerService, i, e.isTrusted), + callback: (i) => LH(this._openerService, i, e.isTrusted), disposables: t } }; } -}, RT = Cg, Cg._ttpTokenizer = nd("tokenizeToString", { +}, sM = Im, Im._ttpTokenizer = ra("tokenizeToString", { createHTML(e) { return e; } -}), Cg); -Qc = RT = Ume([ - Bz(1, ri), - Bz(2, Bs) -], Qc); -async function $X(s, e, t) { +}), Im); +ea = sM = Dpe([ + pA(1, ri), + pA(2, Ps) +], ea); +async function LH(s, e, t) { try { return await s.open(e, { fromUserGesture: !0, allowContributedOpeners: !0, - allowCommands: Kme(t) + allowCommands: Fpe(t) }); } catch (i) { - return De(i), !1; + return Me(i), !1; } } -function Kme(s) { +function Fpe(s) { return s === !0 ? !0 : s && Array.isArray(s.enabledCommands) ? s.enabledCommands : !1; } -var Qme = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var zpe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Oz = function(s, e) { +}, gA = function(s, e) { return function(t, i) { e(t, i, s); }; -}, NL, ah; -let ho = (ah = class { +}, KX, uh; +let mo = (uh = class { static get(e) { - return e.getContribution(NL.ID); + return e.getContribution(KX.ID); } constructor(e, t, i) { - this._openerService = i, this._messageWidget = new fn(), this._messageListeners = new U(), this._mouseOverMessage = !1, this._editor = e, this._visible = NL.MESSAGE_VISIBLE.bindTo(t); + this._openerService = i, this._messageWidget = new Zn(), this._messageListeners = new _(), this._mouseOverMessage = !1, this._editor = e, this._visible = KX.MESSAGE_VISIBLE.bindTo(t); } dispose() { var e; (e = this._message) == null || e.dispose(), this._messageListeners.dispose(), this._messageWidget.dispose(), this._visible.reset(); } showMessage(e, t) { - bs(Nl(e) ? e.value : e), this._visible.set(!0), this._messageWidget.clear(), this._messageListeners.clear(), this._message = Nl(e) ? MI(e, { + ys(Mr(e) ? e.value : e), this._visible.set(!0), this._messageWidget.clear(), this._messageListeners.clear(), this._message = Mr(e) ? Dx(e, { actionHandler: { callback: (n) => { - this.closeMessage(), $X(this._openerService, n, Nl(e) ? e.isTrusted : void 0); + this.closeMessage(), LH(this._openerService, n, Mr(e) ? e.isTrusted : void 0); }, disposables: this._messageListeners } - }) : void 0, this._messageWidget.value = new Hz(this._editor, t, typeof e == "string" ? e : this._message.element), this._messageListeners.add(se.debounce(this._editor.onDidBlurEditorText, (n, o) => o, 0)(() => { - this._mouseOverMessage || this._messageWidget.value && Ji(_n(), this._messageWidget.value.getDomNode()) || this.closeMessage(); + }) : void 0, this._messageWidget.value = new ZA(this._editor, t, typeof e == "string" ? e : this._message.element), this._messageListeners.add(se.debounce(this._editor.onDidBlurEditorText, (n, o) => o, 0)(() => { + this._mouseOverMessage || this._messageWidget.value && _i(Cn(), this._messageWidget.value.getDomNode()) || this.closeMessage(); })), this._messageListeners.add(this._editor.onDidChangeCursorPosition(() => this.closeMessage())), this._messageListeners.add(this._editor.onDidDispose(() => this.closeMessage())), this._messageListeners.add(this._editor.onDidChangeModel(() => this.closeMessage())), this._messageListeners.add(z(this._messageWidget.value.getDomNode(), ie.MOUSE_ENTER, () => this._mouseOverMessage = !0, !0)), this._messageListeners.add(z(this._messageWidget.value.getDomNode(), ie.MOUSE_LEAVE, () => this._mouseOverMessage = !1, !0)); let i; this._messageListeners.add(this._editor.onMouseMove((n) => { - n.target.position && (i ? i.containsPosition(n.target.position) || this.closeMessage() : i = new M(t.lineNumber - 3, 1, n.target.position.lineNumber + 3, 1)); + n.target.position && (i ? i.containsPosition(n.target.position) || this.closeMessage() : i = new I(t.lineNumber - 3, 1, n.target.position.lineNumber + 3, 1)); })); } closeMessage() { - this._visible.reset(), this._messageListeners.clear(), this._messageWidget.value && this._messageListeners.add(Hz.fadeOut(this._messageWidget.value)); - } -}, NL = ah, ah.ID = "editor.contrib.messageController", ah.MESSAGE_VISIBLE = new ae("messageVisible", !1, p("messageVisible", "Whether the editor is currently showing an inline message")), ah); -ho = NL = Qme([ - Oz(1, _e), - Oz(2, Bs) -], ho); -const jme = zi.bindToContribution(ho.get); -oe(new jme({ + this._visible.reset(), this._messageListeners.clear(), this._messageWidget.value && this._messageListeners.add(ZA.fadeOut(this._messageWidget.value)); + } +}, KX = uh, uh.ID = "editor.contrib.messageController", uh.MESSAGE_VISIBLE = new ce("messageVisible", !1, p("messageVisible", "Whether the editor is currently showing an inline message")), uh); +mo = KX = zpe([ + gA(1, xe), + gA(2, Ps) +], mo); +const Ape = Ai.bindToContribution(mo.get); +oe(new Ape({ id: "leaveEditorMessage", - precondition: ho.MESSAGE_VISIBLE, + precondition: mo.MESSAGE_VISIBLE, handler: (s) => s.closeMessage(), kbOpts: { weight: 130, @@ -58251,7 +58251,7 @@ oe(new jme({ /* KeyCode.Escape */ } })); -let Hz = class { +let ZA = class { static fadeOut(e) { const t = () => { e.dispose(), clearTimeout(i), e.getDomNode().removeEventListener("animationend", t); @@ -58267,10 +58267,10 @@ let Hz = class { ), this._position = { lineNumber: t, column: i }, this._domNode = document.createElement("div"), this._domNode.classList.add("monaco-editor-overlaymessage"), this._domNode.style.marginLeft = "-6px"; const o = document.createElement("div"); o.classList.add("anchor", "top"), this._domNode.appendChild(o); - const r = document.createElement("div"); - typeof n == "string" ? (r.classList.add("message"), r.textContent = n) : (n.classList.add("message"), r.appendChild(n)), this._domNode.appendChild(r); const l = document.createElement("div"); - l.classList.add("anchor", "below"), this._domNode.appendChild(l), this._editor.addContentWidget(this), this._domNode.classList.add("fadeIn"); + typeof n == "string" ? (l.classList.add("message"), l.textContent = n) : (n.classList.add("message"), l.appendChild(n)), this._domNode.appendChild(l); + const r = document.createElement("div"); + r.classList.add("anchor", "below"), this._domNode.appendChild(r), this._editor.addContentWidget(this), this._domNode.classList.add("fadeIn"); } dispose() { this._editor.removeContentWidget(this); @@ -58299,64 +58299,64 @@ let Hz = class { ); } }; -gt( - ho.ID, - ho, +mt( + mo.ID, + mo, 4 /* EditorContributionInstantiation.Lazy */ ); -const qme = { ctrlCmd: !1, alt: !1 }; -var xb; +const Kpe = { ctrlCmd: !1, alt: !1 }; +var NZ; (function(s) { s[s.Blur = 1] = "Blur", s[s.Gesture = 2] = "Gesture", s[s.Other = 3] = "Other"; -})(xb || (xb = {})); -var da; +})(NZ || (NZ = {})); +var bc; (function(s) { s[s.NONE = 0] = "NONE", s[s.FIRST = 1] = "FIRST", s[s.SECOND = 2] = "SECOND", s[s.LAST = 3] = "LAST"; -})(da || (da = {})); -var Xt; +})(bc || (bc = {})); +var Et; (function(s) { s[s.First = 1] = "First", s[s.Second = 2] = "Second", s[s.Last = 3] = "Last", s[s.Next = 4] = "Next", s[s.Previous = 5] = "Previous", s[s.NextPage = 6] = "NextPage", s[s.PreviousPage = 7] = "PreviousPage", s[s.NextSeparator = 8] = "NextSeparator", s[s.PreviousSeparator = 9] = "PreviousSeparator"; -})(Xt || (Xt = {})); -var Cx; +})(Et || (Et = {})); +var kL; (function(s) { s[s.Title = 1] = "Title", s[s.Inline = 2] = "Inline"; -})(Cx || (Cx = {})); -const ld = $e("quickInputService"); -K.white.toString(), K.white.toString(); -class Sx extends R { +})(kL || (kL = {})); +const ha = $e("quickInputService"); +Q.white.toString(), Q.white.toString(); +class vL extends J { get onDidClick() { return this._onDidClick.event; } constructor(e, t) { super(), this._label = "", this._onDidClick = this._register(new k()), this._onDidEscape = this._register(new k()), this.options = t, this._element = document.createElement("a"), this._element.classList.add("monaco-button"), this._element.tabIndex = 0, this._element.setAttribute("role", "button"), this._element.classList.toggle("secondary", !!t.secondary); const i = t.secondary ? t.buttonSecondaryBackground : t.buttonBackground, n = t.secondary ? t.buttonSecondaryForeground : t.buttonForeground; - this._element.style.color = n || "", this._element.style.backgroundColor = i || "", t.supportShortLabel && (this._labelShortElement = document.createElement("div"), this._labelShortElement.classList.add("monaco-button-label-short"), this._element.appendChild(this._labelShortElement), this._labelElement = document.createElement("div"), this._labelElement.classList.add("monaco-button-label"), this._element.appendChild(this._labelElement), this._element.classList.add("monaco-text-button-with-short-label")), typeof t.title == "string" && this.setTitle(t.title), typeof t.ariaLabel == "string" && this._element.setAttribute("aria-label", t.ariaLabel), e.appendChild(this._element), this._register(Rn.addTarget(this._element)), [ie.CLICK, Rt.Tap].forEach((o) => { - this._register(z(this._element, o, (r) => { + this._element.style.color = n || "", this._element.style.backgroundColor = i || "", t.supportShortLabel && (this._labelShortElement = document.createElement("div"), this._labelShortElement.classList.add("monaco-button-label-short"), this._element.appendChild(this._labelShortElement), this._labelElement = document.createElement("div"), this._labelElement.classList.add("monaco-button-label"), this._element.appendChild(this._labelElement), this._element.classList.add("monaco-text-button-with-short-label")), typeof t.title == "string" && this.setTitle(t.title), typeof t.ariaLabel == "string" && this._element.setAttribute("aria-label", t.ariaLabel), e.appendChild(this._element), this._register(En.addTarget(this._element)), [ie.CLICK, Jt.Tap].forEach((o) => { + this._register(z(this._element, o, (l) => { if (!this.enabled) { - tt.stop(r); + tt.stop(l); return; } - this._onDidClick.fire(r); + this._onDidClick.fire(l); })); }), this._register(z(this._element, ie.KEY_DOWN, (o) => { - const r = new Vt(o); - let l = !1; - this.enabled && (r.equals( + const l = new Yt(o); + let r = !1; + this.enabled && (l.equals( 3 /* KeyCode.Enter */ - ) || r.equals( + ) || l.equals( 10 /* KeyCode.Space */ - )) ? (this._onDidClick.fire(o), l = !0) : r.equals( + )) ? (this._onDidClick.fire(o), r = !0) : l.equals( 9 /* KeyCode.Escape */ - ) && (this._onDidEscape.fire(o), this._element.blur(), l = !0), l && tt.stop(r, !0); + ) && (this._onDidEscape.fire(o), this._element.blur(), r = !0), r && tt.stop(l, !0); })), this._register(z(this._element, ie.MOUSE_OVER, (o) => { this._element.classList.contains("disabled") || this.updateBackground(!0); })), this._register(z(this._element, ie.MOUSE_OUT, (o) => { this.updateBackground(!1); - })), this.focusTracker = this._register(vl(this._element)), this._register(this.focusTracker.onDidFocus(() => { + })), this.focusTracker = this._register(kr(this._element)), this._register(this.focusTracker.onDidFocus(() => { this.enabled && this.updateBackground(!0); })), this._register(this.focusTracker.onDidBlur(() => { this.enabled && this.updateBackground(!1); @@ -58367,7 +58367,7 @@ class Sx extends R { } getContentElements(e) { const t = []; - for (let i of ih(e)) + for (let i of lh(e)) if (typeof i == "string") { if (i = i.trim(), i === "") continue; @@ -58386,29 +58386,29 @@ class Sx extends R { } set label(e) { var n; - if (this._label === e || Nl(this._label) && Nl(e) && lhe(this._label, e)) + if (this._label === e || Mr(this._label) && Mr(e) && $he(this._label, e)) return; this._element.classList.add("monaco-text-button"); const t = this.options.supportShortLabel ? this._labelElement : this._element; - if (Nl(e)) { - const o = MI(e, { inline: !0 }); + if (Mr(e)) { + const o = Dx(e, { inline: !0 }); o.dispose(); - const r = (n = o.element.querySelector("p")) == null ? void 0 : n.innerHTML; - if (r) { - const l = DH(r, { ADD_TAGS: ["b", "i", "u", "code", "span"], ALLOWED_ATTR: ["class"], RETURN_TRUSTED_TYPE: !0 }); - t.innerHTML = l; + const l = (n = o.element.querySelector("p")) == null ? void 0 : n.innerHTML; + if (l) { + const r = pB(l, { ADD_TAGS: ["b", "i", "u", "code", "span"], ALLOWED_ATTR: ["class"], RETURN_TRUSTED_TYPE: !0 }); + t.innerHTML = r; } else - In(t); + Rn(t); } else - this.options.supportIcons ? In(t, ...this.getContentElements(e)) : t.textContent = e; + this.options.supportIcons ? Rn(t, ...this.getContentElements(e)) : t.textContent = e; let i = ""; - typeof this.options.title == "string" ? i = this.options.title : this.options.title && (i = yhe(e)), this.setTitle(i), typeof this.options.ariaLabel == "string" ? this._element.setAttribute("aria-label", this.options.ariaLabel) : this.options.ariaLabel && this._element.setAttribute("aria-label", i), this._label = e; + typeof this.options.title == "string" ? i = this.options.title : this.options.title && (i = aue(e)), this.setTitle(i), typeof this.options.ariaLabel == "string" ? this._element.setAttribute("aria-label", this.options.ariaLabel) : this.options.ariaLabel && this._element.setAttribute("aria-label", i), this._label = e; } get label() { return this._label; } set icon(e) { - this._element.classList.add(...Ze.asClassNameArray(e)); + this._element.classList.add(...Se.asClassNameArray(e)); } set enabled(e) { e ? (this._element.classList.remove("disabled"), this._element.setAttribute("aria-disabled", String(!1)), this._element.tabIndex = 0) : (this._element.classList.add("disabled"), this._element.setAttribute("aria-disabled", String(!0))); @@ -58417,52 +58417,52 @@ class Sx extends R { return !this._element.classList.contains("disabled"); } setTitle(e) { - !this._hover && e !== "" ? this._hover = this._register(Fl().setupManagedHover(this.options.hoverDelegate ?? As("mouse"), this._element, e)) : this._hover && this._hover.update(e); + !this._hover && e !== "" ? this._hover = this._register(Kr().setupManagedHover(this.options.hoverDelegate ?? Is("mouse"), this._element, e)) : this._hover && this._hover.update(e); } } -function wW(s, e) { - return e && (s.stack || s.stacktrace) ? p("stackTrace.format", "{0}: {1}", Uz(s), Jz(s.stack) || Jz(s.stacktrace)) : Uz(s); +function kR(s, e) { + return e && (s.stack || s.stacktrace) ? p("stackTrace.format", "{0}: {1}", yA(s), fA(s.stack) || fA(s.stacktrace)) : yA(s); } -function Jz(s) { +function fA(s) { return Array.isArray(s) ? s.join(` `) : s; } -function Uz(s) { +function yA(s) { return s.code === "ERR_UNC_HOST_NOT_ALLOWED" ? `${s.message}. Please update the 'security.allowedUNCHosts' setting if you want to allow this host.` : typeof s.code == "string" && typeof s.errno == "number" && typeof s.syscall == "string" ? p("nodeExceptionMessage", "A system error occurred ({0})", s.message) : s.message || p("error.defaultMessage", "An unknown error occurred. Please consult the log for more details."); } -function ET(s = null, e = !1) { +function oM(s = null, e = !1) { if (!s) return p("error.defaultMessage", "An unknown error occurred. Please consult the log for more details."); if (Array.isArray(s)) { - const t = Or(s), i = ET(t[0], e); + const t = _l(s), i = oM(t[0], e); return t.length > 1 ? p("error.moreErrors", "{0} ({1} errors in total)", i, t.length) : i; } - if (Vs(s)) + if (vs(s)) return s; if (s.detail) { const t = s.detail; if (t.error) - return wW(t.error, e); + return kR(t.error, e); if (t.exception) - return wW(t.exception, e); + return kR(t.exception, e); } - return s.stack ? wW(s, e) : s.message ? s.message : p("error.defaultMessage", "An unknown error occurred. Please consult the log for more details."); + return s.stack ? kR(s, e) : s.message ? s.message : p("error.defaultMessage", "An unknown error occurred. Please consult the log for more details."); } -var G4 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var fj = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Ef = function(s, e) { +}, Kg = function(s, e) { return function(t, i) { e(t, i, s); }; -}, XT, Sg; -let FT = (Sg = class extends R { - constructor(e, t, i, n, o, r, l, a, c, d) { - super(), this.typeId = e, this.editor = t, this.showCommand = n, this.range = o, this.edits = r, this.onSelectNewEdit = l, this._contextMenuService = a, this._keybindingService = d, this.allowEditorOverflow = !0, this.suppressMouseDown = !0, this.create(), this.visibleContext = i.bindTo(c), this.visibleContext.set(!0), this._register(Ce(() => this.visibleContext.reset())), this.editor.addContentWidget(this), this.editor.layoutContentWidget(this), this._register(Ce(() => this.editor.removeContentWidget(this))), this._register(this.editor.onDidChangeCursorPosition((h) => { +}, lM, Sm; +let rM = (Sm = class extends J { + constructor(e, t, i, n, o, l, r, c, d, a) { + super(), this.typeId = e, this.editor = t, this.showCommand = n, this.range = o, this.edits = l, this.onSelectNewEdit = r, this._contextMenuService = c, this._keybindingService = a, this.allowEditorOverflow = !0, this.suppressMouseDown = !0, this.create(), this.visibleContext = i.bindTo(d), this.visibleContext.set(!0), this._register(We(() => this.visibleContext.reset())), this.editor.addContentWidget(this), this.editor.layoutContentWidget(this), this._register(We(() => this.editor.removeContentWidget(this))), this._register(this.editor.onDidChangeCursorPosition((h) => { o.containsPosition(h.position) || this.dispose(); - })), this._register(se.runAndSubscribe(d.onDidUpdateKeybindings, () => { + })), this._register(se.runAndSubscribe(a.onDidUpdateKeybindings, () => { this._updateButtonTitle(); })); } @@ -58472,12 +58472,12 @@ let FT = (Sg = class extends R { this.button.element.title = this.showCommand.label + (e ? ` (${e})` : ""); } create() { - this.domNode = ce(".post-edit-widget"), this.button = this._register(new Sx(this.domNode, { + this.domNode = de(".post-edit-widget"), this.button = this._register(new vL(this.domNode, { supportIcons: !0 })), this.button.label = "$(insert)", this._register(z(this.domNode, ie.CLICK, () => this.showSelector())); } getId() { - return XT.baseId + "." + this.typeId; + return lM.baseId + "." + this.typeId; } getDomNode() { return this.domNode; @@ -58497,7 +58497,7 @@ let FT = (Sg = class extends R { const e = yi(this.button.element); return { x: e.left + e.width, y: e.top + e.height }; }, - getActions: () => this.edits.allEdits.map((e, t) => og({ + getActions: () => this.edits.allEdits.map((e, t) => am({ id: "", label: e.title, checked: t === this.edits.activeEditIndex, @@ -58508,39 +58508,39 @@ let FT = (Sg = class extends R { })) }); } -}, XT = Sg, Sg.baseId = "editor.widget.postEditWidget", Sg); -FT = XT = G4([ - Ef(7, Co), - Ef(8, _e), - Ef(9, xt) -], FT); -let Lx = class extends R { - constructor(e, t, i, n, o, r, l) { - super(), this._id = e, this._editor = t, this._visibleContext = i, this._showCommand = n, this._instantiationService = o, this._bulkEditService = r, this._notificationService = l, this._currentWidget = this._register(new fn()), this._register(se.any(t.onDidChangeModel, t.onDidChangeModelContent)(() => this.clear())); +}, lM = Sm, Sm.baseId = "editor.widget.postEditWidget", Sm); +rM = lM = fj([ + Kg(7, Xo), + Kg(8, xe), + Kg(9, Lt) +], rM); +let JL = class extends J { + constructor(e, t, i, n, o, l, r) { + super(), this._id = e, this._editor = t, this._visibleContext = i, this._showCommand = n, this._instantiationService = o, this._bulkEditService = l, this._notificationService = r, this._currentWidget = this._register(new Zn()), this._register(se.any(t.onDidChangeModel, t.onDidChangeModelContent)(() => this.clear())); } async applyEditAndShowIfNeeded(e, t, i, n, o) { - const r = this._editor.getModel(); - if (!r || !e.length) + const l = this._editor.getModel(); + if (!l || !e.length) return; - const l = t.allEdits.at(t.activeEditIndex); - if (!l) + const r = t.allEdits.at(t.activeEditIndex); + if (!r) return; - const a = async (b) => { - const y = this._editor.getModel(); - y && (await y.undo(), this.applyEditAndShowIfNeeded(e, { activeEditIndex: b, allEdits: t.allEdits }, i, n, o)); - }, c = (b, y) => { - jr(b) || (this._notificationService.error(y), i && this.show(e[0], t, a)); + const c = async (Z) => { + const f = this._editor.getModel(); + f && (await f.undo(), this.applyEditAndShowIfNeeded(e, { activeEditIndex: Z, allEdits: t.allEdits }, i, n, o)); + }, d = (Z, f) => { + er(Z) || (this._notificationService.error(f), i && this.show(e[0], t, c)); }; - let d; + let a; try { - d = await n(l, o); - } catch (b) { - return c(b, p("resolveError", `Error resolving edit '{0}': -{1}`, l.title, ET(b))); + a = await n(r, o); + } catch (Z) { + return d(Z, p("resolveError", `Error resolving edit '{0}': +{1}`, r.title, oM(Z))); } if (o.isCancellationRequested) return; - const h = T4(r.uri, e, d), u = e[0], g = r.deltaDecorations([], [{ + const h = bj(l.uri, e, a), u = e[0], m = l.deltaDecorations([], [{ range: u, options: { description: "paste-line-suffix", @@ -58549,19 +58549,19 @@ let Lx = class extends R { } }]); this._editor.focus(); - let m, f; + let b, g; try { - m = await this._bulkEditService.apply(h, { editor: this._editor, token: o }), f = r.getDecorationRange(g[0]); - } catch (b) { - return c(b, p("applyError", `Error applying edit '{0}': -{1}`, l.title, ET(b))); + b = await this._bulkEditService.apply(h, { editor: this._editor, token: o }), g = l.getDecorationRange(m[0]); + } catch (Z) { + return d(Z, p("applyError", `Error applying edit '{0}': +{1}`, r.title, oM(Z))); } finally { - r.deltaDecorations(g, []); + l.deltaDecorations(m, []); } - o.isCancellationRequested || i && m.isApplied && t.allEdits.length > 1 && this.show(f ?? u, t, a); + o.isCancellationRequested || i && b.isApplied && t.allEdits.length > 1 && this.show(g ?? u, t, c); } show(e, t, i) { - this.clear(), this._editor.hasModel() && (this._currentWidget.value = this._instantiationService.createInstance(FT, this._id, this._editor, this._visibleContext, this._showCommand, e, t, i)); + this.clear(), this._editor.hasModel() && (this._currentWidget.value = this._instantiationService.createInstance(rM, this._id, this._editor, this._visibleContext, this._showCommand, e, t, i)); } clear() { this._currentWidget.clear(); @@ -58571,31 +58571,31 @@ let Lx = class extends R { (e = this._currentWidget.value) == null || e.showSelector(); } }; -Lx = G4([ - Ef(4, Se), - Ef(5, TC), - Ef(6, Vi) -], Lx); -var $me = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +JL = fj([ + Kg(4, Ge), + Kg(5, UG), + Kg(6, vi) +], JL); +var Upe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, cp = function(s, e) { +}, bp = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Iu; -const R4 = "editor.changePasteType", e5 = new ae("pasteWidgetVisible", !1, p("pasteWidgetVisible", "Whether the paste widget is showing")), CW = "application/vnd.code.copyMetadata"; -var Lg; -let jc = (Lg = class extends R { +}, Mu; +const yj = "editor.changePasteType", IH = new ce("pasteWidgetVisible", !1, p("pasteWidgetVisible", "Whether the paste widget is showing")), vR = "application/vnd.code.copyMetadata"; +var xm; +let ta = (xm = class extends J { static get(e) { - return e.getContribution(Iu.ID); + return e.getContribution(Mu.ID); } - constructor(e, t, i, n, o, r, l) { - super(), this._bulkEditService = i, this._clipboardService = n, this._languageFeaturesService = o, this._quickInputService = r, this._progressService = l, this._editor = e; - const a = e.getContainerDomNode(); - this._register(z(a, "copy", (c) => this.handleCopy(c))), this._register(z(a, "cut", (c) => this.handleCopy(c))), this._register(z(a, "paste", (c) => this.handlePaste(c), !0)), this._pasteProgressManager = this._register(new wx("pasteIntoEditor", e, t)), this._postPasteWidgetManager = this._register(t.createInstance(Lx, "pasteIntoEditor", e, e5, { id: R4, label: p("postPasteWidgetTitle", "Show paste options...") })); + constructor(e, t, i, n, o, l, r) { + super(), this._bulkEditService = i, this._clipboardService = n, this._languageFeaturesService = o, this._quickInputService = l, this._progressService = r, this._editor = e; + const c = e.getContainerDomNode(); + this._register(z(c, "copy", (d) => this.handleCopy(d))), this._register(z(c, "cut", (d) => this.handleCopy(d))), this._register(z(c, "paste", (d) => this.handlePaste(d), !0)), this._pasteProgressManager = this._register(new YL("pasteIntoEditor", e, t)), this._postPasteWidgetManager = this._register(t.createInstance(JL, "pasteIntoEditor", e, IH, { id: yj, label: p("postPasteWidgetTitle", "Show paste options...") })); } changePasteType() { this._postPasteWidgetManager.tryShowSelector(); @@ -58603,7 +58603,7 @@ let jc = (Lg = class extends R { pasteAs(e) { this._editor.focus(); try { - this._pasteAsActionContext = { preferred: e }, Qb().execCommand("paste"); + this._pasteAsActionContext = { preferred: e }, i0().execCommand("paste"); } finally { this._pasteAsActionContext = void 0; } @@ -58621,8 +58621,8 @@ let jc = (Lg = class extends R { await this._currentPasteOperation; } handleCopy(e) { - var f, b, y, w; - if (!this._editor.hasTextFocus() || ((b = (f = this._clipboardService).clearInternalState) == null || b.call(f), !e.clipboardData || !this.isPasteAsEnabled())) + var g, Z, f, y; + if (!this._editor.hasTextFocus() || ((Z = (g = this._clipboardService).clearInternalState) == null || Z.call(g), !e.clipboardData || !this.isPasteAsEnabled())) return; const t = this._editor.getModel(), i = this._editor.getSelections(); if (!t || !(i != null && i.length)) @@ -58632,209 +58632,209 @@ let jc = (Lg = class extends R { /* EditorOption.emptySelectionClipboard */ ); let o = i; - const r = i.length === 1 && i[0].isEmpty(); - if (r) { + const l = i.length === 1 && i[0].isEmpty(); + if (l) { if (!n) return; - o = [new M(o[0].startLineNumber, 1, o[0].startLineNumber, 1 + t.getLineLength(o[0].startLineNumber))]; + o = [new I(o[0].startLineNumber, 1, o[0].startLineNumber, 1 + t.getLineLength(o[0].startLineNumber))]; } - const l = (y = this._editor._getViewModel()) == null ? void 0 : y.getPlainTextToCopy(i, n, kn), c = { - multicursorText: Array.isArray(l) ? l : null, - pasteOnNewLine: r, + const r = (f = this._editor._getViewModel()) == null ? void 0 : f.getPlainTextToCopy(i, n, Jn), d = { + multicursorText: Array.isArray(r) ? r : null, + pasteOnNewLine: l, mode: null - }, d = this._languageFeaturesService.documentPasteEditProvider.ordered(t).filter((C) => !!C.prepareDocumentPaste); - if (!d.length) { - this.setCopyMetadata(e.clipboardData, { defaultPastePayload: c }); + }, a = this._languageFeaturesService.documentPasteEditProvider.ordered(t).filter((W) => !!W.prepareDocumentPaste); + if (!a.length) { + this.setCopyMetadata(e.clipboardData, { defaultPastePayload: d }); return; } - const h = Z4(e.clipboardData), u = d.flatMap((C) => C.copyMimeTypes ?? []), g = TI(); + const h = cj(e.clipboardData), u = a.flatMap((W) => W.copyMimeTypes ?? []), m = Bx(); this.setCopyMetadata(e.clipboardData, { - id: g, + id: m, providerCopyMimeTypes: u, - defaultPastePayload: c + defaultPastePayload: d }); - const m = Ui(async (C) => { - const S = Or(await Promise.all(d.map(async (L) => { + const b = Qi(async (W) => { + const G = _l(await Promise.all(a.map(async (X) => { try { - return await L.prepareDocumentPaste(t, o, h, C); - } catch (x) { - console.error(x); + return await X.prepareDocumentPaste(t, o, h, W); + } catch (L) { + console.error(L); return; } }))); - S.reverse(); - for (const L of S) - for (const [x, Z] of L) - h.replace(x, Z); + G.reverse(); + for (const X of G) + for (const [L, S] of X) + h.replace(L, S); return h; }); - (w = Iu._currentCopyOperation) == null || w.dataTransferPromise.cancel(), Iu._currentCopyOperation = { handle: g, dataTransferPromise: m }; + (y = Mu._currentCopyOperation) == null || y.dataTransferPromise.cancel(), Mu._currentCopyOperation = { handle: m, dataTransferPromise: b }; } async handlePaste(e) { - var a, c, d; + var c, d, a; if (!e.clipboardData || !this._editor.hasTextFocus()) return; - (a = ho.get(this._editor)) == null || a.closeMessage(), (c = this._currentPasteOperation) == null || c.cancel(), this._currentPasteOperation = void 0; + (c = mo.get(this._editor)) == null || c.closeMessage(), (d = this._currentPasteOperation) == null || d.cancel(), this._currentPasteOperation = void 0; const t = this._editor.getModel(), i = this._editor.getSelections(); if (!(i != null && i.length) || !t || this._editor.getOption( 92 /* EditorOption.readOnly */ ) || !this.isPasteAsEnabled() && !this._pasteAsActionContext) return; - const n = this.fetchCopyMetadata(e), o = _4(e.clipboardData); - o.delete(CW); - const r = [ + const n = this.fetchCopyMetadata(e), o = dj(e.clipboardData); + o.delete(vR); + const l = [ ...e.clipboardData.types, ...(n == null ? void 0 : n.providerCopyMimeTypes) ?? [], // TODO: always adds `uri-list` because this get set if there are resources in the system clipboard. // However we can only check the system clipboard async. For this early check, just add it in. // We filter providers again once we have the final dataTransfer we will use. - bi.uriList - ], l = this._languageFeaturesService.documentPasteEditProvider.ordered(t).filter((h) => { - var g, m; - const u = (g = this._pasteAsActionContext) == null ? void 0 : g.preferred; - return u && h.providedPasteEditKinds && !this.providerMatchesPreference(h, u) ? !1 : (m = h.pasteMimeTypes) == null ? void 0 : m.some((f) => x4(f, r)); + fi.uriList + ], r = this._languageFeaturesService.documentPasteEditProvider.ordered(t).filter((h) => { + var m, b; + const u = (m = this._pasteAsActionContext) == null ? void 0 : m.preferred; + return u && h.providedPasteEditKinds && !this.providerMatchesPreference(h, u) ? !1 : (b = h.pasteMimeTypes) == null ? void 0 : b.some((g) => lj(g, l)); }); - if (!l.length) { - (d = this._pasteAsActionContext) != null && d.preferred && this.showPasteAsNoEditMessage(i, this._pasteAsActionContext.preferred); + if (!r.length) { + (a = this._pasteAsActionContext) != null && a.preferred && this.showPasteAsNoEditMessage(i, this._pasteAsActionContext.preferred); return; } - e.preventDefault(), e.stopImmediatePropagation(), this._pasteAsActionContext ? this.showPasteAsPick(this._pasteAsActionContext.preferred, l, i, o, n) : this.doPasteInline(l, i, o, n, e); + e.preventDefault(), e.stopImmediatePropagation(), this._pasteAsActionContext ? this.showPasteAsPick(this._pasteAsActionContext.preferred, r, i, o, n) : this.doPasteInline(r, i, o, n, e); } showPasteAsNoEditMessage(e, t) { var i; - (i = ho.get(this._editor)) == null || i.showMessage(p("pasteAsError", "No paste edits for '{0}' found", t instanceof $t ? t.value : t.providerId), e[0].getStartPosition()); + (i = mo.get(this._editor)) == null || i.showMessage(p("pasteAsError", "No paste edits for '{0}' found", t instanceof ei ? t.value : t.providerId), e[0].getStartPosition()); } doPasteInline(e, t, i, n, o) { - const r = this._editor; - if (!r.hasModel()) + const l = this._editor; + if (!l.hasModel()) return; - const l = new Yh(r, 3, void 0), a = Ui(async (c) => { - const d = this._editor; - if (!d.hasModel()) + const r = new Uh(l, 3, void 0), c = Qi(async (d) => { + const a = this._editor; + if (!a.hasModel()) return; - const h = d.getModel(), u = new U(), g = u.add(new mi(c)); - u.add(l.token.onCancellationRequested(() => g.cancel())); - const m = g.token; + const h = a.getModel(), u = new _(), m = u.add(new pi(d)); + u.add(r.token.onCancellationRequested(() => m.cancel())); + const b = m.token; try { - if (await this.mergeInDataFromCopy(i, n, m), m.isCancellationRequested) + if (await this.mergeInDataFromCopy(i, n, b), b.isCancellationRequested) return; - const f = e.filter((w) => this.isSupportedPasteProvider(w, i)); - if (!f.length || f.length === 1 && f[0] instanceof Sm) - return this.applyDefaultPasteHandler(i, n, m, o); - const b = { - triggerKind: $w.Automatic - }, y = await this.getPasteEdits(f, i, h, t, b, m); - if (u.add(y), m.isCancellationRequested) + const g = e.filter((y) => this.isSupportedPasteProvider(y, i)); + if (!g.length || g.length === 1 && g[0] instanceof Sb) + return this.applyDefaultPasteHandler(i, n, b, o); + const Z = { + triggerKind: hW.Automatic + }, f = await this.getPasteEdits(g, i, h, t, Z, b); + if (u.add(f), b.isCancellationRequested) return; - if (y.edits.length === 1 && y.edits[0].provider instanceof Sm) - return this.applyDefaultPasteHandler(i, n, m, o); - if (y.edits.length) { - const w = d.getOption( + if (f.edits.length === 1 && f.edits[0].provider instanceof Sb) + return this.applyDefaultPasteHandler(i, n, b, o); + if (f.edits.length) { + const y = a.getOption( 85 /* EditorOption.pasteAs */ ).showPasteSelector === "afterPaste"; - return this._postPasteWidgetManager.applyEditAndShowIfNeeded(t, { activeEditIndex: 0, allEdits: y.edits }, w, (C, S) => new Promise((L, x) => { + return this._postPasteWidgetManager.applyEditAndShowIfNeeded(t, { activeEditIndex: 0, allEdits: f.edits }, y, (W, G) => new Promise((X, L) => { (async () => { - var Z, _; + var S, x; try { - const v = (_ = (Z = C.provider).resolveDocumentPasteEdit) == null ? void 0 : _.call(Z, C, S), P = new dC(), E = v && await this._pasteProgressManager.showWhile(t[0].getEndPosition(), p("resolveProcess", "Resolving paste edit. Click to cancel"), Promise.race([P.p, v]), { - cancel: () => (P.cancel(), x(new Pr())) + const w = (x = (S = W.provider).resolveDocumentPasteEdit) == null ? void 0 : x.call(S, W, G), A = new VG(), H = w && await this._pasteProgressManager.showWhile(t[0].getEndPosition(), p("resolveProcess", "Resolving paste edit. Click to cancel"), Promise.race([A.p, w]), { + cancel: () => (A.cancel(), L(new Pl())) }, 0); - return E && (C.additionalEdit = E.additionalEdit), L(C); - } catch (v) { - return x(v); + return H && (W.additionalEdit = H.additionalEdit), X(W); + } catch (w) { + return L(w); } })(); - }), m); + }), b); } - await this.applyDefaultPasteHandler(i, n, m, o); + await this.applyDefaultPasteHandler(i, n, b, o); } finally { - u.dispose(), this._currentPasteOperation === a && (this._currentPasteOperation = void 0); + u.dispose(), this._currentPasteOperation === c && (this._currentPasteOperation = void 0); } }); - this._pasteProgressManager.showWhile(t[0].getEndPosition(), p("pasteIntoEditorProgress", "Running paste handlers. Click to cancel and do basic paste"), a, { + this._pasteProgressManager.showWhile(t[0].getEndPosition(), p("pasteIntoEditorProgress", "Running paste handlers. Click to cancel and do basic paste"), c, { cancel: async () => { try { - if (a.cancel(), l.token.isCancellationRequested) + if (c.cancel(), r.token.isCancellationRequested) return; - await this.applyDefaultPasteHandler(i, n, l.token, o); + await this.applyDefaultPasteHandler(i, n, r.token, o); } finally { - l.dispose(); + r.dispose(); } } }).then(() => { - l.dispose(); - }), this._currentPasteOperation = a; + r.dispose(); + }), this._currentPasteOperation = c; } showPasteAsPick(e, t, i, n, o) { - const r = Ui(async (l) => { - const a = this._editor; - if (!a.hasModel()) + const l = Qi(async (r) => { + const c = this._editor; + if (!c.hasModel()) return; - const c = a.getModel(), d = new U(), h = d.add(new Yh(a, 3, void 0, l)); + const d = c.getModel(), a = new _(), h = a.add(new Uh(c, 3, void 0, r)); try { if (await this.mergeInDataFromCopy(n, o, h.token), h.token.isCancellationRequested) return; - let u = t.filter((y) => this.isSupportedPasteProvider(y, n, e)); - e && (u = u.filter((y) => this.providerMatchesPreference(y, e))); - const g = { - triggerKind: $w.PasteAs, - only: e && e instanceof $t ? e : void 0 + let u = t.filter((f) => this.isSupportedPasteProvider(f, n, e)); + e && (u = u.filter((f) => this.providerMatchesPreference(f, e))); + const m = { + triggerKind: hW.PasteAs, + only: e && e instanceof ei ? e : void 0 }; - let m = d.add(await this.getPasteEdits(u, n, c, i, g, h.token)); + let b = a.add(await this.getPasteEdits(u, n, d, i, m, h.token)); if (h.token.isCancellationRequested) return; - if (e && (m = { - edits: m.edits.filter((y) => e instanceof $t ? e.contains(y.kind) : e.providerId === y.provider.id), - dispose: m.dispose - }), !m.edits.length) { - g.only && this.showPasteAsNoEditMessage(i, g.only); + if (e && (b = { + edits: b.edits.filter((f) => e instanceof ei ? e.contains(f.kind) : e.providerId === f.provider.id), + dispose: b.dispose + }), !b.edits.length) { + m.only && this.showPasteAsNoEditMessage(i, m.only); return; } - let f; + let g; if (e) - f = m.edits.at(0); + g = b.edits.at(0); else { - const y = await this._quickInputService.pick(m.edits.map((w) => { - var C; + const f = await this._quickInputService.pick(b.edits.map((y) => { + var W; return { - label: w.title, - description: (C = w.kind) == null ? void 0 : C.value, - edit: w + label: y.title, + description: (W = y.kind) == null ? void 0 : W.value, + edit: y }; }), { placeHolder: p("pasteAsPickerPlaceholder", "Select Paste Action") }); - f = y == null ? void 0 : y.edit; + g = f == null ? void 0 : f.edit; } - if (!f) + if (!g) return; - const b = T4(c.uri, i, f); - await this._bulkEditService.apply(b, { editor: this._editor }); + const Z = bj(d.uri, i, g); + await this._bulkEditService.apply(Z, { editor: this._editor }); } finally { - d.dispose(), this._currentPasteOperation === r && (this._currentPasteOperation = void 0); + a.dispose(), this._currentPasteOperation === l && (this._currentPasteOperation = void 0); } }); this._progressService.withProgress({ location: 10, title: p("pasteAsProgress", "Running paste handlers") - }, () => r); + }, () => l); } setCopyMetadata(e, t) { - e.setData(CW, JSON.stringify(t)); + e.setData(vR, JSON.stringify(t)); } fetchCopyMetadata(e) { if (!e.clipboardData) return; - const t = e.clipboardData.getData(CW); + const t = e.clipboardData.getData(vR); if (t) try { return JSON.parse(t); } catch { return; } - const [i, n] = uv.getTextData(e.clipboardData); + const [i, n] = Mw.getTextData(e.clipboardData); if (n) return { defaultPastePayload: { @@ -58846,48 +58846,48 @@ let jc = (Lg = class extends R { } async mergeInDataFromCopy(e, t, i) { var n; - if (t != null && t.id && ((n = Iu._currentCopyOperation) == null ? void 0 : n.handle) === t.id) { - const o = await Iu._currentCopyOperation.dataTransferPromise; + if (t != null && t.id && ((n = Mu._currentCopyOperation) == null ? void 0 : n.handle) === t.id) { + const o = await Mu._currentCopyOperation.dataTransferPromise; if (i.isCancellationRequested) return; - for (const [r, l] of o) - e.replace(r, l); + for (const [l, r] of o) + e.replace(l, r); } - if (!e.has(bi.uriList)) { + if (!e.has(fi.uriList)) { const o = await this._clipboardService.readResources(); if (i.isCancellationRequested) return; - o.length && e.append(bi.uriList, HX(DI.create(o))); + o.length && e.append(fi.uriList, ZH(_x.create(o))); } } - async getPasteEdits(e, t, i, n, o, r) { - const l = new U(), a = await cC(Promise.all(e.map(async (d) => { + async getPasteEdits(e, t, i, n, o, l) { + const r = new _(), c = await XG(Promise.all(e.map(async (a) => { var h, u; try { - const g = await ((h = d.provideDocumentPasteEdits) == null ? void 0 : h.call(d, i, n, t, o, r)); - return g && l.add(g), (u = g == null ? void 0 : g.edits) == null ? void 0 : u.map((m) => ({ ...m, provider: d })); - } catch (g) { - jr(g) || console.error(g); + const m = await ((h = a.provideDocumentPasteEdits) == null ? void 0 : h.call(a, i, n, t, o, l)); + return m && r.add(m), (u = m == null ? void 0 : m.edits) == null ? void 0 : u.map((b) => ({ ...b, provider: a })); + } catch (m) { + er(m) || console.error(m); return; } - })), r), c = Or(a ?? []).flat().filter((d) => !o.only || o.only.contains(d.kind)); + })), l), d = _l(c ?? []).flat().filter((a) => !o.only || o.only.contains(a.kind)); return { - edits: D4(c), - dispose: () => l.dispose() + edits: pj(d), + dispose: () => r.dispose() }; } async applyDefaultPasteHandler(e, t, i, n) { - const o = e.get(bi.text) ?? e.get("text"), r = await (o == null ? void 0 : o.asString()) ?? ""; + const o = e.get(fi.text) ?? e.get("text"), l = await (o == null ? void 0 : o.asString()) ?? ""; if (i.isCancellationRequested) return; - const l = { + const r = { clipboardEvent: n, - text: r, + text: l, pasteOnNewLine: (t == null ? void 0 : t.defaultPastePayload.pasteOnNewLine) ?? !1, multicursorText: (t == null ? void 0 : t.defaultPastePayload.multicursorText) ?? null, mode: null }; - this._editor.trigger("keyboard", "paste", l); + this._editor.trigger("keyboard", "paste", r); } /** * Filter out providers if they: @@ -58899,28 +58899,28 @@ let jc = (Lg = class extends R { return (n = e.pasteMimeTypes) != null && n.some((o) => t.matches(o)) ? !i || this.providerMatchesPreference(e, i) : !1; } providerMatchesPreference(e, t) { - return t instanceof $t ? e.providedPasteEditKinds ? e.providedPasteEditKinds.some((i) => t.contains(i)) : !0 : e.id === t.providerId; - } -}, Iu = Lg, Lg.ID = "editor.contrib.copyPasteActionController", Lg); -jc = Iu = $me([ - cp(1, Se), - cp(2, TC), - cp(3, od), - cp(4, ge), - cp(5, ld), - cp(6, y4) -], jc); -const Am = "9_cutcopypaste", epe = Na || document.queryCommandSupported("cut"), E4 = Na || document.queryCommandSupported("copy"), tpe = typeof navigator.clipboard > "u" || pr ? document.queryCommandSupported("paste") : !0; -function t5(s) { + return t instanceof ei ? e.providedPasteEditKinds ? e.providedPasteEditKinds.some((i) => t.contains(i)) : !0 : e.id === t.providerId; + } +}, Mu = xm, xm.ID = "editor.contrib.copyPasteActionController", xm); +ta = Mu = Upe([ + bp(1, Ge), + bp(2, UG), + bp(3, da), + bp(4, me), + bp(5, ha), + bp(6, ej) +], ta); +const Cb = "9_cutcopypaste", Ppe = Mc || document.queryCommandSupported("cut"), Wj = Mc || document.queryCommandSupported("copy"), Bpe = typeof navigator.clipboard > "u" || fl ? document.queryCommandSupported("paste") : !0; +function SH(s) { return s.register(), s; } -const ipe = epe ? t5(new qb({ +const _pe = Ppe ? SH(new s0({ id: "editor.action.clipboardCutAction", precondition: void 0, kbOpts: ( // Do not bind cut keybindings in the browser, // since browsers do that for us and it avoids security prompts - Na ? { + Mc ? { primary: 2102, win: { primary: 2102, secondary: [ 1044 @@ -58937,9 +58937,9 @@ const ipe = epe ? t5(new qb({ order: 1 }, { menuId: pe.EditorContext, - group: Am, + group: Cb, title: p("actions.clipboard.cutLabel", "Cut"), - when: I.writable, + when: C.writable, order: 1 }, { menuId: pe.CommandPalette, @@ -58948,18 +58948,18 @@ const ipe = epe ? t5(new qb({ order: 1 }, { menuId: pe.SimpleEditorContext, - group: Am, + group: Cb, title: p("actions.clipboard.cutLabel", "Cut"), - when: I.writable, + when: C.writable, order: 1 }] -})) : void 0, npe = E4 ? t5(new qb({ +})) : void 0, Qpe = Wj ? SH(new s0({ id: "editor.action.clipboardCopyAction", precondition: void 0, kbOpts: ( // Do not bind copy keybindings in the browser, // since browsers do that for us and it avoids security prompts - Na ? { + Mc ? { primary: 2081, win: { primary: 2081, secondary: [ 2067 @@ -58976,7 +58976,7 @@ const ipe = epe ? t5(new qb({ order: 2 }, { menuId: pe.EditorContext, - group: Am, + group: Cb, title: p("actions.clipboard.copyLabel", "Copy"), order: 2 }, { @@ -58986,22 +58986,22 @@ const ipe = epe ? t5(new qb({ order: 1 }, { menuId: pe.SimpleEditorContext, - group: Am, + group: Cb, title: p("actions.clipboard.copyLabel", "Copy"), order: 2 }] })) : void 0; -nn.appendMenuItem(pe.MenubarEditMenu, { submenu: pe.MenubarCopy, title: Ie("copy as", "Copy As"), group: "2_ccp", order: 3 }); -nn.appendMenuItem(pe.EditorContext, { submenu: pe.EditorContextCopy, title: Ie("copy as", "Copy As"), group: Am, order: 3 }); -nn.appendMenuItem(pe.EditorContext, { submenu: pe.EditorContextShare, title: Ie("share", "Share"), group: "11_share", order: -1, when: H.and(H.notEquals("resourceScheme", "output"), I.editorTextFocus) }); -nn.appendMenuItem(pe.ExplorerContext, { submenu: pe.ExplorerContextShare, title: Ie("share", "Share"), group: "11_share", order: -1 }); -const SW = tpe ? t5(new qb({ +sn.appendMenuItem(pe.MenubarEditMenu, { submenu: pe.MenubarCopy, title: Ce("copy as", "Copy As"), group: "2_ccp", order: 3 }); +sn.appendMenuItem(pe.EditorContext, { submenu: pe.EditorContextCopy, title: Ce("copy as", "Copy As"), group: Cb, order: 3 }); +sn.appendMenuItem(pe.EditorContext, { submenu: pe.EditorContextShare, title: Ce("share", "Share"), group: "11_share", order: -1, when: P.and(P.notEquals("resourceScheme", "output"), C.editorTextFocus) }); +sn.appendMenuItem(pe.ExplorerContext, { submenu: pe.ExplorerContextShare, title: Ce("share", "Share"), group: "11_share", order: -1 }); +const JR = Bpe ? SH(new s0({ id: "editor.action.clipboardPasteAction", precondition: void 0, kbOpts: ( // Do not bind paste keybindings in the browser, // since browsers do that for us and it avoids security prompts - Na ? { + Mc ? { primary: 2100, win: { primary: 2100, secondary: [ 1043 @@ -59022,9 +59022,9 @@ const SW = tpe ? t5(new qb({ order: 4 }, { menuId: pe.EditorContext, - group: Am, + group: Cb, title: p("actions.clipboard.pasteLabel", "Paste"), - when: I.writable, + when: C.writable, order: 4 }, { menuId: pe.CommandPalette, @@ -59033,13 +59033,13 @@ const SW = tpe ? t5(new qb({ order: 1 }, { menuId: pe.SimpleEditorContext, - group: Am, + group: Cb, title: p("actions.clipboard.pasteLabel", "Paste"), - when: I.writable, + when: C.writable, order: 4 }] })) : void 0; -class spe extends he { +class Ope extends he { constructor() { super({ id: "editor.action.clipboardCopyWithSyntaxHighlightingAction", @@ -59047,7 +59047,7 @@ class spe extends he { alias: "Copy With Syntax Highlighting", precondition: void 0, kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 0, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -59058,57 +59058,57 @@ class spe extends he { !t.hasModel() || !t.getOption( 37 /* EditorOption.emptySelectionClipboard */ - ) && t.getSelection().isEmpty() || (dv.forceCopyWithSyntaxHighlighting = !0, t.focus(), t.getContainerDomNode().ownerDocument.execCommand("copy"), dv.forceCopyWithSyntaxHighlighting = !1); + ) && t.getSelection().isEmpty() || (ww.forceCopyWithSyntaxHighlighting = !0, t.focus(), t.getContainerDomNode().ownerDocument.execCommand("copy"), ww.forceCopyWithSyntaxHighlighting = !1); } } -function X4(s, e) { +function Gj(s, e) { s && (s.addImplementation(1e4, "code-editor", (t, i) => { - const n = t.get(ft).getFocusedCodeEditor(); + const n = t.get(gt).getFocusedCodeEditor(); if (n && n.hasTextFocus()) { const o = n.getOption( 37 /* EditorOption.emptySelectionClipboard */ - ), r = n.getSelection(); - return r && r.isEmpty() && !o || n.getContainerDomNode().ownerDocument.execCommand(e), !0; + ), l = n.getSelection(); + return l && l.isEmpty() && !o || n.getContainerDomNode().ownerDocument.execCommand(e), !0; } return !1; - }), s.addImplementation(0, "generic-dom", (t, i) => (Qb().execCommand(e), !0))); + }), s.addImplementation(0, "generic-dom", (t, i) => (i0().execCommand(e), !0))); } -X4(ipe, "cut"); -X4(npe, "copy"); -SW && (SW.addImplementation(1e4, "code-editor", (s, e) => { +Gj(_pe, "cut"); +Gj(Qpe, "copy"); +JR && (JR.addImplementation(1e4, "code-editor", (s, e) => { var o; - const t = s.get(ft), i = s.get(od), n = t.getFocusedCodeEditor(); - return n && n.hasTextFocus() ? n.getContainerDomNode().ownerDocument.execCommand("paste") ? ((o = jc.get(n)) == null ? void 0 : o.finishedPaste()) ?? Promise.resolve() : Dm ? (async () => { - const l = await i.readText(); - if (l !== "") { - const a = Qw.INSTANCE.get(l); - let c = !1, d = null, h = null; - a && (c = n.getOption( + const t = s.get(gt), i = s.get(da), n = t.getFocusedCodeEditor(); + return n && n.hasTextFocus() ? n.getContainerDomNode().ownerDocument.execCommand("paste") ? ((o = ta.get(n)) == null ? void 0 : o.finishedPaste()) ?? Promise.resolve() : Hb ? (async () => { + const r = await i.readText(); + if (r !== "") { + const c = cW.INSTANCE.get(r); + let d = !1, a = null, h = null; + c && (d = n.getOption( 37 /* EditorOption.emptySelectionClipboard */ - ) && !!a.isFromEmptySelection, d = typeof a.multicursorText < "u" ? a.multicursorText : null, h = a.mode), n.trigger("keyboard", "paste", { - text: l, - pasteOnNewLine: c, - multicursorText: d, + ) && !!c.isFromEmptySelection, a = typeof c.multicursorText < "u" ? c.multicursorText : null, h = c.mode), n.trigger("keyboard", "paste", { + text: r, + pasteOnNewLine: d, + multicursorText: a, mode: h }); } })() : !0 : !1; -}), SW.addImplementation(0, "generic-dom", (s, e) => (Qb().execCommand("paste"), !0))); -E4 && ee(spe); -const VC = Object.freeze({ +}), JR.addImplementation(0, "generic-dom", (s, e) => (i0().execCommand("paste"), !0))); +Wj && ee(Ope); +const BG = Object.freeze({ id: "editor", order: 5, type: "object", title: p("editorConfigurationTitle", "Editor"), scope: 5 -}), Ax = { - ...VC, +}), HL = { + ...BG, properties: { "editor.tabSize": { type: "number", - default: Dn.tabSize, + default: Yn.tabSize, minimum: 1, markdownDescription: p("tabSize", "The number of spaces a tab is equal to. This setting is overridden based on the file contents when {0} is on.", "`#editor.detectIndentation#`") }, @@ -59128,22 +59128,22 @@ const VC = Object.freeze({ }, "editor.insertSpaces": { type: "boolean", - default: Dn.insertSpaces, + default: Yn.insertSpaces, markdownDescription: p("insertSpaces", "Insert spaces when pressing `Tab`. This setting is overridden based on the file contents when {0} is on.", "`#editor.detectIndentation#`") }, "editor.detectIndentation": { type: "boolean", - default: Dn.detectIndentation, + default: Yn.detectIndentation, markdownDescription: p("detectIndentation", "Controls whether {0} and {1} will be automatically detected when a file is opened based on the file contents.", "`#editor.tabSize#`", "`#editor.insertSpaces#`") }, "editor.trimAutoWhitespace": { type: "boolean", - default: Dn.trimAutoWhitespace, + default: Yn.trimAutoWhitespace, description: p("trimAutoWhitespace", "Remove trailing auto inserted whitespace.") }, "editor.largeFileOptimizations": { type: "boolean", - default: Dn.largeFileOptimizations, + default: Yn.largeFileOptimizations, description: p("largeFileOptimizations", "Special handling for large files to disable certain memory intensive features.") }, "editor.wordBasedSuggestions": { @@ -59348,54 +59348,54 @@ const VC = Object.freeze({ } } }; -function ope(s) { +function jpe(s) { return typeof s.type < "u" || typeof s.anyOf < "u"; } -for (const s of kp) { +for (const s of Fp) { const e = s.schema; if (typeof e < "u") - if (ope(e)) - Ax.properties[`editor.${s.name}`] = e; + if (jpe(e)) + HL.properties[`editor.${s.name}`] = e; else for (const t in e) - Object.hasOwnProperty.call(e, t) && (Ax.properties[t] = e[t]); + Object.hasOwnProperty.call(e, t) && (HL.properties[t] = e[t]); } -let xS = null; -function F4() { - return xS === null && (xS = /* @__PURE__ */ Object.create(null), Object.keys(Ax.properties).forEach((s) => { - xS[s] = !0; - })), xS; +let J1 = null; +function Xj() { + return J1 === null && (J1 = /* @__PURE__ */ Object.create(null), Object.keys(HL.properties).forEach((s) => { + J1[s] = !0; + })), J1; } -function rpe(s) { - return F4()[`editor.${s}`] || !1; +function qpe(s) { + return Xj()[`editor.${s}`] || !1; } -function lpe(s) { - return F4()[`diffEditor.${s}`] || !1; +function $pe(s) { + return Xj()[`diffEditor.${s}`] || !1; } -const ape = Di.as($r.Configuration); -ape.registerConfiguration(Ax); -const Jt = new class { +const ege = ki.as(ir.Configuration); +ege.registerConfiguration(HL); +const Bt = new class { constructor() { - this.QuickFix = new $t("quickfix"), this.Refactor = new $t("refactor"), this.RefactorExtract = this.Refactor.append("extract"), this.RefactorInline = this.Refactor.append("inline"), this.RefactorMove = this.Refactor.append("move"), this.RefactorRewrite = this.Refactor.append("rewrite"), this.Notebook = new $t("notebook"), this.Source = new $t("source"), this.SourceOrganizeImports = this.Source.append("organizeImports"), this.SourceFixAll = this.Source.append("fixAll"), this.SurroundWith = this.Refactor.append("surround"); + this.QuickFix = new ei("quickfix"), this.Refactor = new ei("refactor"), this.RefactorExtract = this.Refactor.append("extract"), this.RefactorInline = this.Refactor.append("inline"), this.RefactorMove = this.Refactor.append("move"), this.RefactorRewrite = this.Refactor.append("rewrite"), this.Notebook = new ei("notebook"), this.Source = new ei("source"), this.SourceOrganizeImports = this.Source.append("organizeImports"), this.SourceFixAll = this.Source.append("fixAll"), this.SurroundWith = this.Refactor.append("surround"); } }(); var fo; (function(s) { s.Refactor = "refactor", s.RefactorPreview = "refactor preview", s.Lightbulb = "lightbulb", s.Default = "other (default)", s.SourceAction = "source action", s.QuickFix = "quick fix action", s.FixAll = "fix all", s.OrganizeImports = "organize imports", s.AutoFix = "auto fix", s.QuickFixHover = "quick fix hover window", s.OnSave = "save participants", s.ProblemsView = "problems view"; })(fo || (fo = {})); -function cpe(s, e) { - return !(s.include && !s.include.intersects(e) || s.excludes && s.excludes.some((t) => Y4(e, t, s.include)) || !s.includeSourceActions && Jt.Source.contains(e)); +function tge(s, e) { + return !(s.include && !s.include.intersects(e) || s.excludes && s.excludes.some((t) => Vj(e, t, s.include)) || !s.includeSourceActions && Bt.Source.contains(e)); } -function dpe(s, e) { - const t = e.kind ? new $t(e.kind) : void 0; - return !(s.include && (!t || !s.include.contains(t)) || s.excludes && t && s.excludes.some((i) => Y4(t, i, s.include)) || !s.includeSourceActions && t && Jt.Source.contains(t) || s.onlyIncludePreferredActions && !e.isPreferred); +function ige(s, e) { + const t = e.kind ? new ei(e.kind) : void 0; + return !(s.include && (!t || !s.include.contains(t)) || s.excludes && t && s.excludes.some((i) => Vj(t, i, s.include)) || !s.includeSourceActions && t && Bt.Source.contains(t) || s.onlyIncludePreferredActions && !e.isPreferred); } -function Y4(s, e, t) { +function Vj(s, e, t) { return !(!e.contains(s) || t && e.contains(t)); } -class ya { +class Xc { static fromUser(e, t) { - return !e || typeof e != "object" ? new ya(t.kind, t.apply, !1) : new ya(ya.getKindFromUser(e, t.kind), ya.getApplyFromUser(e, t.apply), ya.getPreferredUser(e)); + return !e || typeof e != "object" ? new Xc(t.kind, t.apply, !1) : new Xc(Xc.getKindFromUser(e, t.kind), Xc.getApplyFromUser(e, t.apply), Xc.getPreferredUser(e)); } static getApplyFromUser(e, t) { switch (typeof e.apply == "string" ? e.apply.toLowerCase() : "") { @@ -59410,7 +59410,7 @@ class ya { } } static getKindFromUser(e, t) { - return typeof e.kind == "string" ? new $t(e.kind) : t; + return typeof e.kind == "string" ? new ei(e.kind) : t; } static getPreferredUser(e) { return typeof e.preferred == "boolean" ? e.preferred : !1; @@ -59419,7 +59419,7 @@ class ya { this.kind = e, this.apply = t, this.preferred = i; } } -class hpe { +class nge { constructor(e, t, i) { this.action = e, this.provider = t, this.highlightRange = i; } @@ -59430,26 +59430,26 @@ class hpe { try { i = await this.provider.resolveCodeAction(this.action, e); } catch (n) { - wi(n); + Wi(n); } i && (this.action.edit = i.edit); } return this; } } -const z4 = "editor.action.codeAction", i5 = "editor.action.quickFix", P4 = "editor.action.autoFix", B4 = "editor.action.refactor", O4 = "editor.action.sourceAction", YT = "editor.action.organizeImports", zT = "editor.action.fixAll"; -class Uy extends R { +const Lj = "editor.action.codeAction", xH = "editor.action.quickFix", Ij = "editor.action.autoFix", Sj = "editor.action.refactor", xj = "editor.action.sourceAction", cM = "editor.action.organizeImports", dM = "editor.action.fixAll"; +class oy extends J { static codeActionsPreferredComparator(e, t) { return e.isPreferred && !t.isPreferred ? -1 : !e.isPreferred && t.isPreferred ? 1 : 0; } static codeActionsComparator({ action: e }, { action: t }) { - return e.isAI && !t.isAI ? 1 : !e.isAI && t.isAI ? -1 : $n(e.diagnostics) ? $n(t.diagnostics) ? Uy.codeActionsPreferredComparator(e, t) : -1 : $n(t.diagnostics) ? 1 : Uy.codeActionsPreferredComparator(e, t); + return e.isAI && !t.isAI ? 1 : !e.isAI && t.isAI ? -1 : ts(e.diagnostics) ? ts(t.diagnostics) ? oy.codeActionsPreferredComparator(e, t) : -1 : ts(t.diagnostics) ? 1 : oy.codeActionsPreferredComparator(e, t); } constructor(e, t, i) { - super(), this.documentation = t, this._register(i), this.allActions = [...e].sort(Uy.codeActionsComparator), this.validActions = this.allActions.filter(({ action: n }) => !n.disabled); + super(), this.documentation = t, this._register(i), this.allActions = [...e].sort(oy.codeActionsComparator), this.validActions = this.allActions.filter(({ action: n }) => !n.disabled); } get hasAutoFix() { - return this.validActions.some(({ action: e }) => !!e.kind && Jt.QuickFix.contains(new $t(e.kind)) && !!e.isPreferred); + return this.validActions.some(({ action: e }) => !!e.kind && Bt.QuickFix.contains(new ei(e.kind)) && !!e.isPreferred); } get hasAIFix() { return this.validActions.some(({ action: e }) => !!e.isAI); @@ -59458,58 +59458,58 @@ class Uy extends R { return this.validActions.every(({ action: e }) => !!e.isAI); } } -const Kz = { actions: [], documentation: void 0 }; -async function Op(s, e, t, i, n, o) { - var f; - const r = i.filter || {}, l = { - ...r, - excludes: [...r.excludes || [], Jt.Notebook] - }, a = { - only: (f = r.include) == null ? void 0 : f.value, +const WA = { actions: [], documentation: void 0 }; +async function jp(s, e, t, i, n, o) { + var g; + const l = i.filter || {}, r = { + ...l, + excludes: [...l.excludes || [], Bt.Notebook] + }, c = { + only: (g = l.include) == null ? void 0 : g.value, trigger: i.type - }, c = new qX(e, o), d = i.type === 2, h = upe(s, e, d ? l : r), u = new U(), g = h.map(async (b) => { + }, d = new VH(e, o), a = i.type === 2, h = sge(s, e, a ? r : l), u = new _(), m = h.map(async (Z) => { try { - n.report(b); - const y = await b.provideCodeActions(e, t, a, c.token); - if (y && u.add(y), c.token.isCancellationRequested) - return Kz; - const w = ((y == null ? void 0 : y.actions) || []).filter((S) => S && dpe(r, S)), C = mpe(b, w, r.include); + n.report(Z); + const f = await Z.provideCodeActions(e, t, c, d.token); + if (f && u.add(f), d.token.isCancellationRequested) + return WA; + const y = ((f == null ? void 0 : f.actions) || []).filter((G) => G && ige(l, G)), W = lge(Z, y, l.include); return { - actions: w.map((S) => new hpe(S, b)), - documentation: C + actions: y.map((G) => new nge(G, Z)), + documentation: W }; - } catch (y) { - if (jr(y)) - throw y; - return wi(y), Kz; - } - }), m = s.onDidChange(() => { - const b = s.all(e); - ei(b, h) || c.cancel(); + } catch (f) { + if (er(f)) + throw f; + return Wi(f), WA; + } + }), b = s.onDidChange(() => { + const Z = s.all(e); + ti(Z, h) || d.cancel(); }); try { - const b = await Promise.all(g), y = b.map((C) => C.actions).flat(), w = [ - ...Or(b.map((C) => C.documentation)), - ...gpe(s, e, i, y) + const Z = await Promise.all(m), f = Z.map((W) => W.actions).flat(), y = [ + ..._l(Z.map((W) => W.documentation)), + ...oge(s, e, i, f) ]; - return new Uy(y, w, u); + return new oy(f, y, u); } finally { - m.dispose(), c.dispose(); + b.dispose(), d.dispose(); } } -function upe(s, e, t) { - return s.all(e).filter((i) => i.providedCodeActionKinds ? i.providedCodeActionKinds.some((n) => cpe(t, new $t(n))) : !0); +function sge(s, e, t) { + return s.all(e).filter((i) => i.providedCodeActionKinds ? i.providedCodeActionKinds.some((n) => tge(t, new ei(n))) : !0); } -function* gpe(s, e, t, i) { - var n, o, r; +function* oge(s, e, t, i) { + var n, o, l; if (e && i.length) - for (const l of s.all(e)) - l._getAdditionalMenuItems && (yield* (r = l._getAdditionalMenuItems) == null ? void 0 : r.call(l, { trigger: t.type, only: (o = (n = t.filter) == null ? void 0 : n.include) == null ? void 0 : o.value }, i.map((a) => a.action))); + for (const r of s.all(e)) + r._getAdditionalMenuItems && (yield* (l = r._getAdditionalMenuItems) == null ? void 0 : l.call(r, { trigger: t.type, only: (o = (n = t.filter) == null ? void 0 : n.include) == null ? void 0 : o.value }, i.map((c) => c.action))); } -function mpe(s, e, t) { +function lge(s, e, t) { if (!s.documentation) return; - const i = s.documentation.map((n) => ({ kind: new $t(n.kind), command: n.command })); + const i = s.documentation.map((n) => ({ kind: new ei(n.kind), command: n.command })); if (t) { let n; for (const o of i) @@ -59520,79 +59520,79 @@ function mpe(s, e, t) { for (const n of e) if (n.kind) { for (const o of i) - if (o.kind.contains(new $t(n.kind))) + if (o.kind.contains(new ei(n.kind))) return o.command; } } -var ig; +var rm; (function(s) { s.OnSave = "onSave", s.FromProblemsView = "fromProblemsView", s.FromCodeActions = "fromCodeActions", s.FromAILightbulb = "fromAILightbulb"; -})(ig || (ig = {})); -async function ppe(s, e, t, i, n = Ye.None) { - var c; - const o = s.get(TC), r = s.get(Qt), l = s.get(Ls), a = s.get(Vi); - if (l.publicLog2("codeAction.applyCodeAction", { +})(rm || (rm = {})); +async function rge(s, e, t, i, n = Fe.None) { + var d; + const o = s.get(UG), l = s.get(Ot), r = s.get(Ls), c = s.get(vi); + if (r.publicLog2("codeAction.applyCodeAction", { codeActionTitle: e.action.title, codeActionKind: e.action.kind, codeActionIsPreferred: !!e.action.isPreferred, reason: t - }), await e.resolve(n), !n.isCancellationRequested && !((c = e.action.edit) != null && c.edits.length && !(await o.apply(e.action.edit, { + }), await e.resolve(n), !n.isCancellationRequested && !((d = e.action.edit) != null && d.edits.length && !(await o.apply(e.action.edit, { editor: i == null ? void 0 : i.editor, label: e.action.title, quotableLabel: e.action.title, code: "undoredo.codeAction", - respectAutoSaveConfig: t !== ig.OnSave, + respectAutoSaveConfig: t !== rm.OnSave, showPreview: i == null ? void 0 : i.preview })).isApplied) && e.action.command) try { - await r.executeCommand(e.action.command.id, ...e.action.command.arguments || []); - } catch (d) { - const h = fpe(d); - a.error(typeof h == "string" ? h : p("applyCodeActionFailed", "An unknown error occurred while applying the code action")); + await l.executeCommand(e.action.command.id, ...e.action.command.arguments || []); + } catch (a) { + const h = cge(a); + c.error(typeof h == "string" ? h : p("applyCodeActionFailed", "An unknown error occurred while applying the code action")); } } -function fpe(s) { +function cge(s) { return typeof s == "string" ? s : s instanceof Error && typeof s.message == "string" ? s.message : void 0; } st.registerCommand("_executeCodeActionProvider", async function(s, e, t, i, n) { - if (!(e instanceof Le)) - throw hr(); - const { codeActionProvider: o } = s.get(ge), r = s.get(Pt).getModel(e); - if (!r) - throw hr(); - const l = fe.isISelection(t) ? fe.liftSelection(t) : M.isIRange(t) ? r.validateRange(t) : void 0; + if (!(e instanceof Xe)) + throw bl(); + const { codeActionProvider: o } = s.get(me), l = s.get(At).getModel(e); if (!l) - throw hr(); - const a = typeof i == "string" ? new $t(i) : void 0, c = await Op(o, r, l, { type: 1, triggerAction: fo.Default, filter: { includeSourceActions: !0, include: a } }, xl.None, Ye.None), d = [], h = Math.min(c.validActions.length, typeof n == "number" ? n : 0); + throw bl(); + const r = ge.isISelection(t) ? ge.liftSelection(t) : I.isIRange(t) ? l.validateRange(t) : void 0; + if (!r) + throw bl(); + const c = typeof i == "string" ? new ei(i) : void 0, d = await jp(o, l, r, { type: 1, triggerAction: fo.Default, filter: { includeSourceActions: !0, include: c } }, Cr.None, Fe.None), a = [], h = Math.min(d.validActions.length, typeof n == "number" ? n : 0); for (let u = 0; u < h; u++) - d.push(c.validActions[u].resolve(Ye.None)); + a.push(d.validActions[u].resolve(Fe.None)); try { - return await Promise.all(d), c.validActions.map((u) => u.action); + return await Promise.all(a), d.validActions.map((u) => u.action); } finally { - setTimeout(() => c.dispose(), 100); + setTimeout(() => d.dispose(), 100); } }); -var bpe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var dge = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, ype = function(s, e) { +}, age = function(s, e) { return function(t, i) { e(t, i, s); }; -}, PT, Ag; -let BT = (Ag = class { +}, aM, Cm; +let hM = (Cm = class { constructor(e) { this.keybindingService = e; } getResolver() { - const e = new Wl(() => this.keybindingService.getKeybindings().filter((t) => PT.codeActionCommands.indexOf(t.command) >= 0).filter((t) => t.resolvedKeybinding).map((t) => { + const e = new Yr(() => this.keybindingService.getKeybindings().filter((t) => aM.codeActionCommands.indexOf(t.command) >= 0).filter((t) => t.resolvedKeybinding).map((t) => { let i = t.commandArgs; - return t.command === YT ? i = { kind: Jt.SourceOrganizeImports.value } : t.command === zT && (i = { kind: Jt.SourceFixAll.value }), { + return t.command === cM ? i = { kind: Bt.SourceOrganizeImports.value } : t.command === dM && (i = { kind: Bt.SourceFixAll.value }), { resolvedKeybinding: t.resolvedKeybinding, - ...ya.fromUser(i, { - kind: $t.None, + ...Xc.fromUser(i, { + kind: ei.None, apply: "never" /* CodeActionAutoApply.Never */ }) @@ -59608,131 +59608,131 @@ let BT = (Ag = class { bestKeybindingForCodeAction(e, t) { if (!e.kind) return; - const i = new $t(e.kind); + const i = new ei(e.kind); return t.filter((n) => n.kind.contains(i)).filter((n) => n.preferred ? e.isPreferred : !0).reduceRight((n, o) => n ? n.kind.contains(o.kind) ? o : n : o, void 0); } -}, PT = Ag, Ag.codeActionCommands = [ - B4, - z4, - O4, - YT, - zT -], Ag); -BT = PT = bpe([ - ype(0, xt) -], BT); -N("symbolIcon.arrayForeground", Je, p("symbolIcon.arrayForeground", "The foreground color for array symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.booleanForeground", Je, p("symbolIcon.booleanForeground", "The foreground color for boolean symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.classForeground", { +}, aM = Cm, Cm.codeActionCommands = [ + Sj, + Lj, + xj, + cM, + dM +], Cm); +hM = aM = dge([ + age(0, Lt) +], hM); +R("symbolIcon.arrayForeground", Be, p("symbolIcon.arrayForeground", "The foreground color for array symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.booleanForeground", Be, p("symbolIcon.booleanForeground", "The foreground color for boolean symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.classForeground", { dark: "#EE9D28", light: "#D67E00", hcDark: "#EE9D28", hcLight: "#D67E00" }, p("symbolIcon.classForeground", "The foreground color for class symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.colorForeground", Je, p("symbolIcon.colorForeground", "The foreground color for color symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.constantForeground", Je, p("symbolIcon.constantForeground", "The foreground color for constant symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.constructorForeground", { +R("symbolIcon.colorForeground", Be, p("symbolIcon.colorForeground", "The foreground color for color symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.constantForeground", Be, p("symbolIcon.constantForeground", "The foreground color for constant symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.constructorForeground", { dark: "#B180D7", light: "#652D90", hcDark: "#B180D7", hcLight: "#652D90" }, p("symbolIcon.constructorForeground", "The foreground color for constructor symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.enumeratorForeground", { +R("symbolIcon.enumeratorForeground", { dark: "#EE9D28", light: "#D67E00", hcDark: "#EE9D28", hcLight: "#D67E00" }, p("symbolIcon.enumeratorForeground", "The foreground color for enumerator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.enumeratorMemberForeground", { +R("symbolIcon.enumeratorMemberForeground", { dark: "#75BEFF", light: "#007ACC", hcDark: "#75BEFF", hcLight: "#007ACC" }, p("symbolIcon.enumeratorMemberForeground", "The foreground color for enumerator member symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.eventForeground", { +R("symbolIcon.eventForeground", { dark: "#EE9D28", light: "#D67E00", hcDark: "#EE9D28", hcLight: "#D67E00" }, p("symbolIcon.eventForeground", "The foreground color for event symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.fieldForeground", { +R("symbolIcon.fieldForeground", { dark: "#75BEFF", light: "#007ACC", hcDark: "#75BEFF", hcLight: "#007ACC" }, p("symbolIcon.fieldForeground", "The foreground color for field symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.fileForeground", Je, p("symbolIcon.fileForeground", "The foreground color for file symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.folderForeground", Je, p("symbolIcon.folderForeground", "The foreground color for folder symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.functionForeground", { +R("symbolIcon.fileForeground", Be, p("symbolIcon.fileForeground", "The foreground color for file symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.folderForeground", Be, p("symbolIcon.folderForeground", "The foreground color for folder symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.functionForeground", { dark: "#B180D7", light: "#652D90", hcDark: "#B180D7", hcLight: "#652D90" }, p("symbolIcon.functionForeground", "The foreground color for function symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.interfaceForeground", { +R("symbolIcon.interfaceForeground", { dark: "#75BEFF", light: "#007ACC", hcDark: "#75BEFF", hcLight: "#007ACC" }, p("symbolIcon.interfaceForeground", "The foreground color for interface symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.keyForeground", Je, p("symbolIcon.keyForeground", "The foreground color for key symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.keywordForeground", Je, p("symbolIcon.keywordForeground", "The foreground color for keyword symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.methodForeground", { +R("symbolIcon.keyForeground", Be, p("symbolIcon.keyForeground", "The foreground color for key symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.keywordForeground", Be, p("symbolIcon.keywordForeground", "The foreground color for keyword symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.methodForeground", { dark: "#B180D7", light: "#652D90", hcDark: "#B180D7", hcLight: "#652D90" }, p("symbolIcon.methodForeground", "The foreground color for method symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.moduleForeground", Je, p("symbolIcon.moduleForeground", "The foreground color for module symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.namespaceForeground", Je, p("symbolIcon.namespaceForeground", "The foreground color for namespace symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.nullForeground", Je, p("symbolIcon.nullForeground", "The foreground color for null symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.numberForeground", Je, p("symbolIcon.numberForeground", "The foreground color for number symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.objectForeground", Je, p("symbolIcon.objectForeground", "The foreground color for object symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.operatorForeground", Je, p("symbolIcon.operatorForeground", "The foreground color for operator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.packageForeground", Je, p("symbolIcon.packageForeground", "The foreground color for package symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.propertyForeground", Je, p("symbolIcon.propertyForeground", "The foreground color for property symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.referenceForeground", Je, p("symbolIcon.referenceForeground", "The foreground color for reference symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.snippetForeground", Je, p("symbolIcon.snippetForeground", "The foreground color for snippet symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.stringForeground", Je, p("symbolIcon.stringForeground", "The foreground color for string symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.structForeground", Je, p("symbolIcon.structForeground", "The foreground color for struct symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.textForeground", Je, p("symbolIcon.textForeground", "The foreground color for text symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.typeParameterForeground", Je, p("symbolIcon.typeParameterForeground", "The foreground color for type parameter symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.unitForeground", Je, p("symbolIcon.unitForeground", "The foreground color for unit symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -N("symbolIcon.variableForeground", { +R("symbolIcon.moduleForeground", Be, p("symbolIcon.moduleForeground", "The foreground color for module symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.namespaceForeground", Be, p("symbolIcon.namespaceForeground", "The foreground color for namespace symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.nullForeground", Be, p("symbolIcon.nullForeground", "The foreground color for null symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.numberForeground", Be, p("symbolIcon.numberForeground", "The foreground color for number symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.objectForeground", Be, p("symbolIcon.objectForeground", "The foreground color for object symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.operatorForeground", Be, p("symbolIcon.operatorForeground", "The foreground color for operator symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.packageForeground", Be, p("symbolIcon.packageForeground", "The foreground color for package symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.propertyForeground", Be, p("symbolIcon.propertyForeground", "The foreground color for property symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.referenceForeground", Be, p("symbolIcon.referenceForeground", "The foreground color for reference symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.snippetForeground", Be, p("symbolIcon.snippetForeground", "The foreground color for snippet symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.stringForeground", Be, p("symbolIcon.stringForeground", "The foreground color for string symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.structForeground", Be, p("symbolIcon.structForeground", "The foreground color for struct symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.textForeground", Be, p("symbolIcon.textForeground", "The foreground color for text symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.typeParameterForeground", Be, p("symbolIcon.typeParameterForeground", "The foreground color for type parameter symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.unitForeground", Be, p("symbolIcon.unitForeground", "The foreground color for unit symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); +R("symbolIcon.variableForeground", { dark: "#75BEFF", light: "#007ACC", hcDark: "#75BEFF", hcLight: "#007ACC" }, p("symbolIcon.variableForeground", "The foreground color for variable symbols. These symbols appear in the outline, breadcrumb, and suggest widget.")); -const H4 = Object.freeze({ kind: $t.Empty, title: p("codeAction.widget.id.more", "More Actions...") }), wpe = Object.freeze([ - { kind: Jt.QuickFix, title: p("codeAction.widget.id.quickfix", "Quick Fix") }, - { kind: Jt.RefactorExtract, title: p("codeAction.widget.id.extract", "Extract"), icon: te.wrench }, - { kind: Jt.RefactorInline, title: p("codeAction.widget.id.inline", "Inline"), icon: te.wrench }, - { kind: Jt.RefactorRewrite, title: p("codeAction.widget.id.convert", "Rewrite"), icon: te.wrench }, - { kind: Jt.RefactorMove, title: p("codeAction.widget.id.move", "Move"), icon: te.wrench }, - { kind: Jt.SurroundWith, title: p("codeAction.widget.id.surround", "Surround With"), icon: te.surroundWith }, - { kind: Jt.Source, title: p("codeAction.widget.id.source", "Source Action"), icon: te.symbolFile }, - H4 +const Cj = Object.freeze({ kind: ei.Empty, title: p("codeAction.widget.id.more", "More Actions...") }), hge = Object.freeze([ + { kind: Bt.QuickFix, title: p("codeAction.widget.id.quickfix", "Quick Fix") }, + { kind: Bt.RefactorExtract, title: p("codeAction.widget.id.extract", "Extract"), icon: te.wrench }, + { kind: Bt.RefactorInline, title: p("codeAction.widget.id.inline", "Inline"), icon: te.wrench }, + { kind: Bt.RefactorRewrite, title: p("codeAction.widget.id.convert", "Rewrite"), icon: te.wrench }, + { kind: Bt.RefactorMove, title: p("codeAction.widget.id.move", "Move"), icon: te.wrench }, + { kind: Bt.SurroundWith, title: p("codeAction.widget.id.surround", "Surround With"), icon: te.surroundWith }, + { kind: Bt.Source, title: p("codeAction.widget.id.source", "Source Action"), icon: te.symbolFile }, + Cj ]); -function Cpe(s, e, t) { +function uge(s, e, t) { if (!e) return s.map((o) => { - var r; + var l; return { kind: "action", item: o, - group: H4, + group: Cj, disabled: !!o.action.disabled, label: o.action.disabled || o.action.title, - canPreview: !!((r = o.action.edit) != null && r.edits.length) + canPreview: !!((l = o.action.edit) != null && l.edits.length) }; }); - const i = wpe.map((o) => ({ group: o, actions: [] })); + const i = hge.map((o) => ({ group: o, actions: [] })); for (const o of s) { - const r = o.action.kind ? new $t(o.action.kind) : $t.None; - for (const l of i) - if (l.group.kind.contains(r)) { - l.actions.push(o); + const l = o.action.kind ? new ei(o.action.kind) : ei.None; + for (const r of i) + if (r.group.kind.contains(l)) { + r.actions.push(o); break; } } @@ -59740,68 +59740,68 @@ function Cpe(s, e, t) { for (const o of i) if (o.actions.length) { n.push({ kind: "header", group: o.group }); - for (const r of o.actions) { - const l = o.group; + for (const l of o.actions) { + const r = o.group; n.push({ kind: "action", - item: r, - group: r.action.isAI ? { title: l.title, kind: l.kind, icon: te.sparkle } : l, - label: r.action.title, - disabled: !!r.action.disabled, - keybinding: t(r.action) + item: l, + group: l.action.isAI ? { title: r.title, kind: r.kind, icon: te.sparkle } : r, + label: l.action.title, + disabled: !!l.action.disabled, + keybinding: t(l.action) }); } } return n; } -var Spe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var mge = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Lpe = function(s, e) { +}, bge = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Mp; -const Qz = Bt("gutter-lightbulb", te.lightBulb, p("gutterLightbulbWidget", "Icon which spawns code actions menu from the gutter when there is no space in the editor.")), jz = Bt("gutter-lightbulb-auto-fix", te.lightbulbAutofix, p("gutterLightbulbAutoFixWidget", "Icon which spawns code actions menu from the gutter when there is no space in the editor and a quick fix is available.")), qz = Bt("gutter-lightbulb-sparkle", te.lightbulbSparkle, p("gutterLightbulbAIFixWidget", "Icon which spawns code actions menu from the gutter when there is no space in the editor and an AI fix is available.")), $z = Bt("gutter-lightbulb-aifix-auto-fix", te.lightbulbSparkleAutofix, p("gutterLightbulbAIFixAutoFixWidget", "Icon which spawns code actions menu from the gutter when there is no space in the editor and an AI fix and a quick fix is available.")), e3 = Bt("gutter-lightbulb-sparkle-filled", te.sparkleFilled, p("gutterLightbulbSparkleFilledWidget", "Icon which spawns code actions menu from the gutter when there is no space in the editor and an AI fix and a quick fix is available.")); -var dl; +}, wp; +const GA = Kt("gutter-lightbulb", te.lightBulb, p("gutterLightbulbWidget", "Icon which spawns code actions menu from the gutter when there is no space in the editor.")), XA = Kt("gutter-lightbulb-auto-fix", te.lightbulbAutofix, p("gutterLightbulbAutoFixWidget", "Icon which spawns code actions menu from the gutter when there is no space in the editor and a quick fix is available.")), VA = Kt("gutter-lightbulb-sparkle", te.lightbulbSparkle, p("gutterLightbulbAIFixWidget", "Icon which spawns code actions menu from the gutter when there is no space in the editor and an AI fix is available.")), LA = Kt("gutter-lightbulb-aifix-auto-fix", te.lightbulbSparkleAutofix, p("gutterLightbulbAIFixAutoFixWidget", "Icon which spawns code actions menu from the gutter when there is no space in the editor and an AI fix and a quick fix is available.")), IA = Kt("gutter-lightbulb-sparkle-filled", te.sparkleFilled, p("gutterLightbulbSparkleFilledWidget", "Icon which spawns code actions menu from the gutter when there is no space in the editor and an AI fix and a quick fix is available.")); +var mr; (function(s) { s.Hidden = { type: 0 /* Type.Hidden */ }; class e { - constructor(i, n, o, r) { - this.actions = i, this.trigger = n, this.editorPosition = o, this.widgetPosition = r, this.type = 1; + constructor(i, n, o, l) { + this.actions = i, this.trigger = n, this.editorPosition = o, this.widgetPosition = l, this.type = 1; } } s.Showing = e; -})(dl || (dl = {})); -var Tc; -let _1 = (Tc = class extends R { +})(mr || (mr = {})); +var vd; +let EW = (vd = class extends J { constructor(e, t) { - super(), this._editor = e, this._keybindingService = t, this._onClick = this._register(new k()), this.onClick = this._onClick.event, this._state = dl.Hidden, this._gutterState = dl.Hidden, this._iconClasses = [], this.lightbulbClasses = [ - "codicon-" + Qz.id, - "codicon-" + $z.id, - "codicon-" + jz.id, - "codicon-" + qz.id, - "codicon-" + e3.id - ], this.gutterDecoration = Mp.GUTTER_DECORATION, this._domNode = ce("div.lightBulbWidget"), this._domNode.role = "listbox", this._register(Rn.ignoreTarget(this._domNode)), this._editor.addContentWidget(this), this._register(this._editor.onDidChangeModelContent((i) => { + super(), this._editor = e, this._keybindingService = t, this._onClick = this._register(new k()), this.onClick = this._onClick.event, this._state = mr.Hidden, this._gutterState = mr.Hidden, this._iconClasses = [], this.lightbulbClasses = [ + "codicon-" + GA.id, + "codicon-" + LA.id, + "codicon-" + XA.id, + "codicon-" + VA.id, + "codicon-" + IA.id + ], this.gutterDecoration = wp.GUTTER_DECORATION, this._domNode = de("div.lightBulbWidget"), this._domNode.role = "listbox", this._register(En.ignoreTarget(this._domNode)), this._editor.addContentWidget(this), this._register(this._editor.onDidChangeModelContent((i) => { const n = this._editor.getModel(); (this.state.type !== 1 || !n || this.state.editorPosition.lineNumber >= n.getLineCount()) && this.hide(), (this.gutterState.type !== 1 || !n || this.gutterState.editorPosition.lineNumber >= n.getLineCount()) && this.gutterHide(); - })), this._register(Jq(this._domNode, (i) => { + })), this._register(E$(this._domNode, (i) => { if (this.state.type !== 1) return; this._editor.focus(), i.preventDefault(); - const { top: n, height: o } = yi(this._domNode), r = this._editor.getOption( + const { top: n, height: o } = yi(this._domNode), l = this._editor.getOption( 67 /* EditorOption.lineHeight */ ); - let l = Math.floor(r / 3); - this.state.widgetPosition.position !== null && this.state.widgetPosition.position.lineNumber < this.state.editorPosition.lineNumber && (l += r), this._onClick.fire({ + let r = Math.floor(l / 3); + this.state.widgetPosition.position !== null && this.state.widgetPosition.position.lineNumber < this.state.editorPosition.lineNumber && (r += l), this._onClick.fire({ x: i.posx, - y: n + o + l, + y: n + o + r, actions: this.state.actions, trigger: this.state.trigger }); @@ -59809,19 +59809,19 @@ let _1 = (Tc = class extends R { (i.buttons & 1) === 1 && this.hide(); })), this._register(se.runAndSubscribe(this._keybindingService.onDidUpdateKeybindings, () => { var i, n; - this._preferredKbLabel = ((i = this._keybindingService.lookupKeybinding(P4)) == null ? void 0 : i.getLabel()) ?? void 0, this._quickFixKbLabel = ((n = this._keybindingService.lookupKeybinding(i5)) == null ? void 0 : n.getLabel()) ?? void 0, this._updateLightBulbTitleAndIcon(); + this._preferredKbLabel = ((i = this._keybindingService.lookupKeybinding(Ij)) == null ? void 0 : i.getLabel()) ?? void 0, this._quickFixKbLabel = ((n = this._keybindingService.lookupKeybinding(xH)) == null ? void 0 : n.getLabel()) ?? void 0, this._updateLightBulbTitleAndIcon(); })), this._register(this._editor.onMouseDown(async (i) => { - if (!i.target.element || !this.lightbulbClasses.some((a) => i.target.element && i.target.element.classList.contains(a)) || this.gutterState.type !== 1) + if (!i.target.element || !this.lightbulbClasses.some((c) => i.target.element && i.target.element.classList.contains(c)) || this.gutterState.type !== 1) return; this._editor.focus(); - const { top: n, height: o } = yi(i.target.element), r = this._editor.getOption( + const { top: n, height: o } = yi(i.target.element), l = this._editor.getOption( 67 /* EditorOption.lineHeight */ ); - let l = Math.floor(r / 3); - this.gutterState.widgetPosition.position !== null && this.gutterState.widgetPosition.position.lineNumber < this.gutterState.editorPosition.lineNumber && (l += r), this._onClick.fire({ + let r = Math.floor(l / 3); + this.gutterState.widgetPosition.position !== null && this.gutterState.widgetPosition.position.lineNumber < this.gutterState.editorPosition.lineNumber && (r += l), this._onClick.fire({ x: i.event.posx, - y: n + o + l, + y: n + o + r, actions: this.gutterState.actions, trigger: this.gutterState.trigger }); @@ -59849,66 +59849,66 @@ let _1 = (Tc = class extends R { /* EditorOption.lightbulb */ ).enabled) return this.gutterHide(), this.hide(); - const r = this._editor.getModel(); - if (!r) + const l = this._editor.getModel(); + if (!l) return this.gutterHide(), this.hide(); - const { lineNumber: l, column: a } = r.validatePosition(i), c = r.getOptions().tabSize, d = this._editor.getOptions().get( + const { lineNumber: r, column: c } = l.validatePosition(i), d = l.getOptions().tabSize, a = this._editor.getOptions().get( 50 /* EditorOption.fontInfo */ - ), h = r.getLineContent(l), u = fI(h, c), g = d.spaceWidth * u > 22, m = (L) => L > 2 && this._editor.getTopForLineNumber(L) === this._editor.getTopForLineNumber(L - 1), f = this._editor.getLineDecorations(l); - let b = !1; - if (f) - for (const L of f) { - const x = L.options.glyphMarginClassName; - if (x && !this.lightbulbClasses.some((Z) => x.includes(Z))) { - b = !0; + ), h = l.getLineContent(r), u = wx(h, d), m = a.spaceWidth * u > 22, b = (X) => X > 2 && this._editor.getTopForLineNumber(X) === this._editor.getTopForLineNumber(X - 1), g = this._editor.getLineDecorations(r); + let Z = !1; + if (g) + for (const X of g) { + const L = X.options.glyphMarginClassName; + if (L && !this.lightbulbClasses.some((S) => L.includes(S))) { + Z = !0; break; } } - let y = l, w = 1; - if (!g) { - const L = (x) => { - const Z = r.getLineContent(x); - return /^\s*$|^\s+/.test(Z) || Z.length <= w; + let f = r, y = 1; + if (!m) { + const X = (L) => { + const S = l.getLineContent(L); + return /^\s*$|^\s+/.test(S) || S.length <= y; }; - if (l > 1 && !m(l - 1)) { - const x = r.getLineCount(), Z = l === x, _ = l > 1 && L(l - 1), v = !Z && L(l + 1), P = L(l), E = !v && !_; - if (!v && !_ && !b) - return this.gutterState = new dl.Showing(e, t, i, { - position: { lineNumber: y, column: w }, - preference: Mp._posPref + if (r > 1 && !b(r - 1)) { + const L = l.getLineCount(), S = r === L, x = r > 1 && X(r - 1), w = !S && X(r + 1), A = X(r), H = !w && !x; + if (!w && !x && !Z) + return this.gutterState = new mr.Showing(e, t, i, { + position: { lineNumber: f, column: y }, + preference: wp._posPref }), this.renderGutterLightbub(), this.hide(); - _ || Z || _ && !P ? y -= 1 : (v || E && P) && (y += 1); - } else if (l === 1 && (l === r.getLineCount() || !L(l + 1) && !L(l))) - if (this.gutterState = new dl.Showing(e, t, i, { - position: { lineNumber: y, column: w }, - preference: Mp._posPref - }), b) + x || S || x && !A ? f -= 1 : (w || H && A) && (f += 1); + } else if (r === 1 && (r === l.getLineCount() || !X(r + 1) && !X(r))) + if (this.gutterState = new mr.Showing(e, t, i, { + position: { lineNumber: f, column: y }, + preference: wp._posPref + }), Z) this.gutterHide(); else return this.renderGutterLightbub(), this.hide(); - else if (l < r.getLineCount() && !m(l + 1)) - y += 1; - else if (a * d.spaceWidth < 22) + else if (r < l.getLineCount() && !b(r + 1)) + f += 1; + else if (c * a.spaceWidth < 22) return this.hide(); - w = /^\S\s*$/.test(r.getLineContent(y)) ? 2 : 1; + y = /^\S\s*$/.test(l.getLineContent(f)) ? 2 : 1; } - this.state = new dl.Showing(e, t, i, { - position: { lineNumber: y, column: w }, - preference: Mp._posPref + this.state = new mr.Showing(e, t, i, { + position: { lineNumber: f, column: y }, + preference: wp._posPref }), this._gutterDecorationID && (this._removeGutterDecoration(this._gutterDecorationID), this.gutterHide()); - const C = e.validActions, S = e.validActions[0].action.kind; - if (C.length !== 1 || !S) { + const W = e.validActions, G = e.validActions[0].action.kind; + if (W.length !== 1 || !G) { this._editor.layoutContentWidget(this); return; } this._editor.layoutContentWidget(this); } hide() { - this.state !== dl.Hidden && (this.state = dl.Hidden, this._editor.layoutContentWidget(this)); + this.state !== mr.Hidden && (this.state = mr.Hidden, this._editor.layoutContentWidget(this)); } gutterHide() { - this.gutterState !== dl.Hidden && (this._gutterDecorationID && this._removeGutterDecoration(this._gutterDecorationID), this.gutterState = dl.Hidden); + this.gutterState !== mr.Hidden && (this._gutterDecorationID && this._removeGutterDecoration(this._gutterDecorationID), this.gutterState = mr.Hidden); } get state() { return this._state; @@ -59926,17 +59926,17 @@ let _1 = (Tc = class extends R { if (this._domNode.classList.remove(...this._iconClasses), this._iconClasses = [], this.state.type !== 1) return; let e, t = !1; - this.state.actions.allAIFixes ? (e = te.sparkleFilled, this.state.actions.validActions.length === 1 && (t = !0)) : this.state.actions.hasAutoFix ? this.state.actions.hasAIFix ? e = te.lightbulbSparkleAutofix : e = te.lightbulbAutofix : this.state.actions.hasAIFix ? e = te.lightbulbSparkle : e = te.lightBulb, this._updateLightbulbTitle(this.state.actions.hasAutoFix, t), this._iconClasses = Ze.asClassNameArray(e), this._domNode.classList.add(...this._iconClasses); + this.state.actions.allAIFixes ? (e = te.sparkleFilled, this.state.actions.validActions.length === 1 && (t = !0)) : this.state.actions.hasAutoFix ? this.state.actions.hasAIFix ? e = te.lightbulbSparkleAutofix : e = te.lightbulbAutofix : this.state.actions.hasAIFix ? e = te.lightbulbSparkle : e = te.lightBulb, this._updateLightbulbTitle(this.state.actions.hasAutoFix, t), this._iconClasses = Se.asClassNameArray(e), this._domNode.classList.add(...this._iconClasses); } _updateGutterLightBulbTitleAndIcon() { if (this.gutterState.type !== 1) return; let e, t = !1; - this.gutterState.actions.allAIFixes ? (e = e3, this.gutterState.actions.validActions.length === 1 && (t = !0)) : this.gutterState.actions.hasAutoFix ? this.gutterState.actions.hasAIFix ? e = $z : e = jz : this.gutterState.actions.hasAIFix ? e = qz : e = Qz, this._updateLightbulbTitle(this.gutterState.actions.hasAutoFix, t); - const i = Re.register({ + this.gutterState.actions.allAIFixes ? (e = IA, this.gutterState.actions.validActions.length === 1 && (t = !0)) : this.gutterState.actions.hasAutoFix ? this.gutterState.actions.hasAIFix ? e = LA : e = XA : this.gutterState.actions.hasAIFix ? e = VA : e = GA, this._updateLightbulbTitle(this.gutterState.actions.hasAutoFix, t); + const i = Je.register({ description: "codicon-gutter-lightbulb-decoration", - glyphMarginClassName: Ze.asClassName(e), - glyphMargin: { position: Jr.Left }, + glyphMarginClassName: Se.asClassName(e), + glyphMargin: { position: Ol.Left }, stickiness: 1 }); this.gutterDecoration = i; @@ -59948,7 +59948,7 @@ let _1 = (Tc = class extends R { } _addGutterDecoration(e) { this._editor.changeDecorations((t) => { - this._gutterDecorationID = t.addDecoration(new M(e, 0, e, 0), this.gutterDecoration); + this._gutterDecorationID = t.addDecoration(new I(e, 0, e, 0), this.gutterDecoration); }); } _removeGutterDecoration(e) { @@ -59958,7 +59958,7 @@ let _1 = (Tc = class extends R { } _updateGutterDecoration(e, t) { this._editor.changeDecorations((i) => { - i.changeDecoration(e, new M(t, 0, t, 0)), i.changeDecorationOptions(e, this.gutterDecoration); + i.changeDecoration(e, new I(t, 0, t, 0)), i.changeDecorationOptions(e, this.gutterDecoration); }); } _updateLightbulbTitle(e, t) { @@ -59967,83 +59967,83 @@ let _1 = (Tc = class extends R { set title(e) { this._domNode.title = e; } -}, Mp = Tc, Tc.GUTTER_DECORATION = Re.register({ +}, wp = vd, vd.GUTTER_DECORATION = Je.register({ description: "codicon-gutter-lightbulb-decoration", - glyphMarginClassName: Ze.asClassName(te.lightBulb), - glyphMargin: { position: Jr.Left }, + glyphMarginClassName: Se.asClassName(te.lightBulb), + glyphMargin: { position: Ol.Left }, stickiness: 1 -}), Tc.ID = "editor.contrib.lightbulbWidget", Tc._posPref = [ +}), vd.ID = "editor.contrib.lightbulbWidget", vd._posPref = [ 0 /* ContentWidgetPositionPreference.EXACT */ -], Tc); -_1 = Mp = Spe([ - Lpe(1, xt) -], _1); -const MS = ce, J4 = { +], vd); +EW = wp = mge([ + bge(1, Lt) +], EW); +const H1 = de, Rj = { keybindingLabelBackground: void 0, keybindingLabelForeground: void 0, keybindingLabelBorder: void 0, keybindingLabelBottomBorder: void 0, keybindingLabelShadow: void 0 }; -class f0 extends R { +class X0 extends J { constructor(e, t, i) { super(), this.os = t, this.keyElements = /* @__PURE__ */ new Set(), this.options = i || /* @__PURE__ */ Object.create(null); const n = this.options.keybindingLabelForeground; - this.domNode = Q(e, MS(".monaco-keybinding")), n && (this.domNode.style.color = n), this.hover = this._register(Fl().setupManagedHover(As("mouse"), this.domNode, "")), this.didEverRender = !1, e.appendChild(this.domNode); + this.domNode = O(e, H1(".monaco-keybinding")), n && (this.domNode.style.color = n), this.hover = this._register(Kr().setupManagedHover(Is("mouse"), this.domNode, "")), this.didEverRender = !1, e.appendChild(this.domNode); } get element() { return this.domNode; } set(e, t) { - this.didEverRender && this.keybinding === e && f0.areSame(this.matches, t) || (this.keybinding = e, this.matches = t, this.render()); + this.didEverRender && this.keybinding === e && X0.areSame(this.matches, t) || (this.keybinding = e, this.matches = t, this.render()); } render() { if (this.clear(), this.keybinding) { const e = this.keybinding.getChords(); e[0] && this.renderChord(this.domNode, e[0], this.matches ? this.matches.firstPart : null); for (let i = 1; i < e.length; i++) - Q(this.domNode, MS("span.monaco-keybinding-key-chord-separator", void 0, " ")), this.renderChord(this.domNode, e[i], this.matches ? this.matches.chordPart : null); + O(this.domNode, H1("span.monaco-keybinding-key-chord-separator", void 0, " ")), this.renderChord(this.domNode, e[i], this.matches ? this.matches.chordPart : null); const t = this.options.disableTitle ?? !1 ? void 0 : this.keybinding.getAriaLabel() || void 0; this.hover.update(t), this.domNode.setAttribute("aria-label", t || ""); } else this.options && this.options.renderUnboundKeybindings && this.renderUnbound(this.domNode); this.didEverRender = !0; } clear() { - gn(this.domNode), this.keyElements.clear(); + bn(this.domNode), this.keyElements.clear(); } renderChord(e, t, i) { - const n = BX.modifierLabels[this.os]; + const n = pH.modifierLabels[this.os]; t.ctrlKey && this.renderKey(e, n.ctrlKey, !!(i != null && i.ctrlKey), n.separator), t.shiftKey && this.renderKey(e, n.shiftKey, !!(i != null && i.shiftKey), n.separator), t.altKey && this.renderKey(e, n.altKey, !!(i != null && i.altKey), n.separator), t.metaKey && this.renderKey(e, n.metaKey, !!(i != null && i.metaKey), n.separator); const o = t.keyLabel; o && this.renderKey(e, o, !!(i != null && i.keyCode), ""); } renderKey(e, t, i, n) { - Q(e, this.createKeyElement(t, i ? ".highlight" : "")), n && Q(e, MS("span.monaco-keybinding-key-separator", void 0, n)); + O(e, this.createKeyElement(t, i ? ".highlight" : "")), n && O(e, H1("span.monaco-keybinding-key-separator", void 0, n)); } renderUnbound(e) { - Q(e, this.createKeyElement(p("unbound", "Unbound"))); + O(e, this.createKeyElement(p("unbound", "Unbound"))); } createKeyElement(e, t = "") { - const i = MS("span.monaco-keybinding-key" + t, void 0, e); + const i = H1("span.monaco-keybinding-key" + t, void 0, e); return this.keyElements.add(i), this.options.keybindingLabelBackground && (i.style.backgroundColor = this.options.keybindingLabelBackground), this.options.keybindingLabelBorder && (i.style.borderColor = this.options.keybindingLabelBorder), this.options.keybindingLabelBottomBorder && (i.style.borderBottomColor = this.options.keybindingLabelBottomBorder), this.options.keybindingLabelShadow && (i.style.boxShadow = `inset 0 -1px 0 ${this.options.keybindingLabelShadow}`), i; } static areSame(e, t) { - return e === t || !e && !t ? !0 : !!e && !!t && co(e.firstPart, t.firstPart) && co(e.chordPart, t.chordPart); + return e === t || !e && !t ? !0 : !!e && !!t && uo(e.firstPart, t.firstPart) && uo(e.chordPart, t.chordPart); } } -var U4 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Nj = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, OT = function(s, e) { +}, uM = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const K4 = "acceptSelectedCodeAction", Q4 = "previewSelectedCodeAction"; -class Ape { +const wj = "acceptSelectedCodeAction", Tj = "previewSelectedCodeAction"; +class pge { get templateId() { return "header"; } @@ -60059,7 +60059,7 @@ class Ape { disposeTemplate(e) { } } -let HT = class { +let mM = class { get templateId() { return "action"; } @@ -60072,65 +60072,65 @@ let HT = class { t.className = "icon", e.append(t); const i = document.createElement("span"); i.className = "title", e.append(i); - const n = new f0(e, ro); + const n = new X0(e, co); return { container: e, icon: t, text: i, keybinding: n }; } renderElement(e, t, i) { - var r, l, a; - if ((r = e.group) != null && r.icon ? (i.icon.className = Ze.asClassName(e.group.icon), e.group.icon.color && (i.icon.style.color = de(e.group.icon.color.id))) : (i.icon.className = Ze.asClassName(te.lightBulb), i.icon.style.color = "var(--vscode-editorLightBulb-foreground)"), !e.item || !e.label) + var l, r, c; + if ((l = e.group) != null && l.icon ? (i.icon.className = Se.asClassName(e.group.icon), e.group.icon.color && (i.icon.style.color = ae(e.group.icon.color.id))) : (i.icon.className = Se.asClassName(te.lightBulb), i.icon.style.color = "var(--vscode-editorLightBulb-foreground)"), !e.item || !e.label) return; - i.text.textContent = j4(e.label), i.keybinding.set(e.keybinding), a$(!!e.keybinding, i.keybinding.element); - const n = (l = this._keybindingService.lookupKeybinding(K4)) == null ? void 0 : l.getLabel(), o = (a = this._keybindingService.lookupKeybinding(Q4)) == null ? void 0 : a.getLabel(); + i.text.textContent = Mj(e.label), i.keybinding.set(e.keybinding), eee(!!e.keybinding, i.keybinding.element); + const n = (r = this._keybindingService.lookupKeybinding(wj)) == null ? void 0 : r.getLabel(), o = (c = this._keybindingService.lookupKeybinding(Tj)) == null ? void 0 : c.getLabel(); i.container.classList.toggle("option-disabled", e.disabled), e.disabled ? i.container.title = e.label : n && o ? this._supportsPreview && e.canPreview ? i.container.title = p({ key: "label-preview", comment: ['placeholders are keybindings, e.g "F2 to Apply, Shift+F2 to Preview"'] }, "{0} to Apply, {1} to Preview", n, o) : i.container.title = p({ key: "label", comment: ['placeholder is a keybinding, e.g "F2 to Apply"'] }, "{0} to Apply", n) : i.container.title = ""; } disposeTemplate(e) { e.keybinding.dispose(); } }; -HT = U4([ - OT(1, xt) -], HT); -class xpe extends UIEvent { +mM = Nj([ + uM(1, Lt) +], mM); +class gge extends UIEvent { constructor() { super("acceptSelectedAction"); } } -class t3 extends UIEvent { +class SA extends UIEvent { constructor() { super("previewSelectedAction"); } } -function Mpe(s) { +function Zge(s) { if (s.kind === "action") return s.label; } -let JT = class extends R { - constructor(e, t, i, n, o, r) { - super(), this._delegate = n, this._contextViewService = o, this._keybindingService = r, this._actionLineHeight = 24, this._headerLineHeight = 26, this.cts = this._register(new mi()), this.domNode = document.createElement("div"), this.domNode.classList.add("actionList"); - const l = { - getHeight: (a) => a.kind === "header" ? this._headerLineHeight : this._actionLineHeight, - getTemplateId: (a) => a.kind +let bM = class extends J { + constructor(e, t, i, n, o, l) { + super(), this._delegate = n, this._contextViewService = o, this._keybindingService = l, this._actionLineHeight = 24, this._headerLineHeight = 26, this.cts = this._register(new pi()), this.domNode = document.createElement("div"), this.domNode.classList.add("actionList"); + const r = { + getHeight: (c) => c.kind === "header" ? this._headerLineHeight : this._actionLineHeight, + getTemplateId: (c) => c.kind }; - this._list = this._register(new Qo(e, this.domNode, l, [ - new HT(t, this._keybindingService), - new Ape() + this._list = this._register(new qo(e, this.domNode, r, [ + new mM(t, this._keybindingService), + new pge() ], { keyboardSupport: !1, typeNavigationEnabled: !0, - keyboardNavigationLabelProvider: { getKeyboardNavigationLabel: Mpe }, + keyboardNavigationLabelProvider: { getKeyboardNavigationLabel: Zge }, accessibilityProvider: { - getAriaLabel: (a) => { - if (a.kind === "action") { - let c = a.label ? j4(a == null ? void 0 : a.label) : ""; - return a.disabled && (c = p({ key: "customQuickFixWidget.labels", comment: ["Action widget labels for accessibility."] }, "{0}, Disabled Reason: {1}", c, a.disabled)), c; + getAriaLabel: (c) => { + if (c.kind === "action") { + let d = c.label ? Mj(c == null ? void 0 : c.label) : ""; + return c.disabled && (d = p({ key: "customQuickFixWidget.labels", comment: ["Action widget labels for accessibility."] }, "{0}, Disabled Reason: {1}", d, c.disabled)), d; } return null; }, getWidgetAriaLabel: () => p({ key: "customQuickFixWidget", comment: ["An action widget option"] }, "Action Widget"), - getRole: (a) => a.kind === "action" ? "option" : "separator", + getRole: (c) => c.kind === "action" ? "option" : "separator", getWidgetRole: () => "listbox" } - })), this._list.style(Ym), this._register(this._list.onMouseClick((a) => this.onListClick(a))), this._register(this._list.onMouseOver((a) => this.onListHover(a))), this._register(this._list.onDidChangeFocus(() => this.onFocus())), this._register(this._list.onDidChangeSelection((a) => this.onListSelection(a))), this._allMenuItems = i, this._list.splice(0, this._list.length, this._allMenuItems), this._list.length && this.focusNext(); + })), this._list.style(Pb), this._register(this._list.onMouseClick((c) => this.onListClick(c))), this._register(this._list.onMouseOver((c) => this.onListHover(c))), this._register(this._list.onDidChangeFocus(() => this.onFocus())), this._register(this._list.onDidChangeSelection((c) => this.onListSelection(c))), this._allMenuItems = i, this._list.splice(0, this._list.length, this._allMenuItems), this._list.length && this.focusNext(); } focusCondition(e) { return !e.disabled && e.kind === "action"; @@ -60139,14 +60139,14 @@ let JT = class extends R { this._delegate.onHide(e), this.cts.cancel(), this._contextViewService.hideContextView(); } layout(e) { - const t = this._allMenuItems.filter((a) => a.kind === "header").length, n = this._allMenuItems.length * this._actionLineHeight + t * this._headerLineHeight - t * this._actionLineHeight; + const t = this._allMenuItems.filter((c) => c.kind === "header").length, n = this._allMenuItems.length * this._actionLineHeight + t * this._headerLineHeight - t * this._actionLineHeight; this._list.layout(n); let o = e; if (this._allMenuItems.length >= 50) o = 380; else { - const a = this._allMenuItems.map((c, d) => { - const h = this.domNode.ownerDocument.getElementById(this._list.getElementID(d)); + const c = this._allMenuItems.map((d, a) => { + const h = this.domNode.ownerDocument.getElementById(this._list.getElementID(a)); if (h) { h.style.width = "auto"; const u = h.getBoundingClientRect().width; @@ -60154,10 +60154,10 @@ let JT = class extends R { } return 0; }); - o = Math.max(...a, e); + o = Math.max(...c, e); } - const l = Math.min(n, this.domNode.ownerDocument.body.clientHeight * 0.7); - return this._list.layout(l, o), this.domNode.style.height = `${l}px`, this._list.domFocus(), o; + const r = Math.min(n, this.domNode.ownerDocument.body.clientHeight * 0.7); + return this._list.layout(r, o), this.domNode.style.height = `${r}px`, this._list.domFocus(), o; } focusPrevious() { this._list.focusPrevious(1, !0, void 0, this.focusCondition); @@ -60172,14 +60172,14 @@ let JT = class extends R { const i = t[0], n = this._list.element(i); if (!this.focusCondition(n)) return; - const o = e ? new t3() : new xpe(); + const o = e ? new SA() : new gge(); this._list.setSelection([i], o); } onListSelection(e) { if (!e.elements.length) return; const t = e.elements[0]; - t.item && this.focusCondition(t) ? this._delegate.onSelect(t.item, e.browserEvent instanceof t3) : this._list.setSelection([]); + t.item && this.focusCondition(t) ? this._delegate.onSelect(t.item, e.browserEvent instanceof SA) : this._list.setSelection([]); } onFocus() { var n, o; @@ -60204,43 +60204,43 @@ let JT = class extends R { e.element && this.focusCondition(e.element) && this._list.setFocus([]); } }; -JT = U4([ - OT(4, rd), - OT(5, xt) -], JT); -function j4(s) { +bM = Nj([ + uM(4, aa), + uM(5, Lt) +], bM); +function Mj(s) { return s.replace(/\r\n|\r|\n/g, " "); } -var Zpe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var fge = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, LW = function(s, e) { +}, HR = function(s, e) { return function(t, i) { e(t, i, s); }; }; -N("actionBar.toggledBackground", bC, p("actionBar.toggledBackground", "Background color for toggled action items in action bar.")); -const xm = { - Visible: new ae("codeActionMenuVisible", !1, p("codeActionMenuVisible", "Whether the action widget list is visible")) -}, Pm = $e("actionWidgetService"); -let Mm = class extends R { +R("actionBar.toggledBackground", NG, p("actionBar.toggledBackground", "Background color for toggled action items in action bar.")); +const Rb = { + Visible: new ce("codeActionMenuVisible", !1, p("codeActionMenuVisible", "Whether the action widget list is visible")) +}, _b = $e("actionWidgetService"); +let Nb = class extends J { get isVisible() { - return xm.Visible.getValue(this._contextKeyService) || !1; + return Rb.Visible.getValue(this._contextKeyService) || !1; } constructor(e, t, i) { - super(), this._contextViewService = e, this._contextKeyService = t, this._instantiationService = i, this._list = this._register(new fn()); + super(), this._contextViewService = e, this._contextKeyService = t, this._instantiationService = i, this._list = this._register(new Zn()); } - show(e, t, i, n, o, r, l) { - const a = xm.Visible.bindTo(this._contextKeyService), c = this._instantiationService.createInstance(JT, e, t, i, n); + show(e, t, i, n, o, l, r) { + const c = Rb.Visible.bindTo(this._contextKeyService), d = this._instantiationService.createInstance(bM, e, t, i, n); this._contextViewService.showContextView({ getAnchor: () => o, - render: (d) => (a.set(!0), this._renderWidget(d, c, l ?? [])), - onHide: (d) => { - a.reset(), this._onWidgetClosed(d); + render: (a) => (c.set(!0), this._renderWidget(a, d, r ?? [])), + onHide: (a) => { + c.reset(), this._onWidgetClosed(a); } - }, r, !1); + }, l, !1); } acceptSelected(e) { var t; @@ -60259,30 +60259,30 @@ let Mm = class extends R { (t = this._list.value) == null || t.hide(e), this._list.clear(); } _renderWidget(e, t, i) { - var g; + var m; const n = document.createElement("div"); if (n.classList.add("action-widget"), e.appendChild(n), this._list.value = t, this._list.value) n.appendChild(this._list.value.domNode); else throw new Error("List has no value"); - const o = new U(), r = document.createElement("div"), l = e.appendChild(r); - l.classList.add("context-view-block"), o.add(z(l, ie.MOUSE_DOWN, (m) => m.stopPropagation())); - const a = document.createElement("div"), c = e.appendChild(a); - c.classList.add("context-view-pointerBlock"), o.add(z(c, ie.POINTER_MOVE, () => c.remove())), o.add(z(c, ie.MOUSE_DOWN, () => c.remove())); - let d = 0; + const o = new _(), l = document.createElement("div"), r = e.appendChild(l); + r.classList.add("context-view-block"), o.add(z(r, ie.MOUSE_DOWN, (b) => b.stopPropagation())); + const c = document.createElement("div"), d = e.appendChild(c); + d.classList.add("context-view-pointerBlock"), o.add(z(d, ie.POINTER_MOVE, () => d.remove())), o.add(z(d, ie.MOUSE_DOWN, () => d.remove())); + let a = 0; if (i.length) { - const m = this._createActionBar(".action-widget-action-bar", i); - m && (n.appendChild(m.getContainer().parentElement), o.add(m), d = m.getContainer().offsetWidth); + const b = this._createActionBar(".action-widget-action-bar", i); + b && (n.appendChild(b.getContainer().parentElement), o.add(b), a = b.getContainer().offsetWidth); } - const h = (g = this._list.value) == null ? void 0 : g.layout(d); + const h = (m = this._list.value) == null ? void 0 : m.layout(a); n.style.width = `${h}px`; - const u = o.add(vl(e)); + const u = o.add(kr(e)); return o.add(u.onDidBlur(() => this.hide(!0))), o; } _createActionBar(e, t) { if (!t.length) return; - const i = ce(e), n = new Yo(i); + const i = de(e), n = new Ao(i); return n.push(t, { icon: !1, label: !0 }), n; } _onWidgetClosed(e) { @@ -60290,26 +60290,26 @@ let Mm = class extends R { (t = this._list.value) == null || t.hide(e); } }; -Mm = Zpe([ - LW(0, rd), - LW(1, _e), - LW(2, Se) -], Mm); +Nb = fge([ + HR(0, aa), + HR(1, xe), + HR(2, Ge) +], Nb); it( - Pm, - Mm, + _b, + Nb, 1 /* InstantiationType.Delayed */ ); -const kC = 1100; -kt(class extends Ss { +const _G = 1100; +kt(class extends Vs { constructor() { super({ id: "hideCodeActionWidget", - title: Ie("hideCodeActionWidget.title", "Hide action widget"), - precondition: xm.Visible, + title: Ce("hideCodeActionWidget.title", "Hide action widget"), + precondition: Rb.Visible, keybinding: { - weight: kC, + weight: _G, primary: 9, secondary: [ 1033 @@ -60319,17 +60319,17 @@ kt(class extends Ss { }); } run(s) { - s.get(Pm).hide(!0); + s.get(_b).hide(!0); } }); -kt(class extends Ss { +kt(class extends Vs { constructor() { super({ id: "selectPrevCodeAction", - title: Ie("selectPrevCodeAction.title", "Select previous action"), - precondition: xm.Visible, + title: Ce("selectPrevCodeAction.title", "Select previous action"), + precondition: Rb.Visible, keybinding: { - weight: kC, + weight: _G, primary: 16, secondary: [ 2064 @@ -60344,18 +60344,18 @@ kt(class extends Ss { }); } run(s) { - const e = s.get(Pm); - e instanceof Mm && e.focusPrevious(); + const e = s.get(_b); + e instanceof Nb && e.focusPrevious(); } }); -kt(class extends Ss { +kt(class extends Vs { constructor() { super({ id: "selectNextCodeAction", - title: Ie("selectNextCodeAction.title", "Select next action"), - precondition: xm.Visible, + title: Ce("selectNextCodeAction.title", "Select next action"), + precondition: Rb.Visible, keybinding: { - weight: kC, + weight: _G, primary: 18, secondary: [ 2066 @@ -60370,18 +60370,18 @@ kt(class extends Ss { }); } run(s) { - const e = s.get(Pm); - e instanceof Mm && e.focusNext(); + const e = s.get(_b); + e instanceof Nb && e.focusNext(); } }); -kt(class extends Ss { +kt(class extends Vs { constructor() { super({ - id: K4, - title: Ie("acceptSelected.title", "Accept selected action"), - precondition: xm.Visible, + id: wj, + title: Ce("acceptSelected.title", "Accept selected action"), + precondition: Rb.Visible, keybinding: { - weight: kC, + weight: _G, primary: 3, secondary: [ 2137 @@ -60391,70 +60391,70 @@ kt(class extends Ss { }); } run(s) { - const e = s.get(Pm); - e instanceof Mm && e.acceptSelected(); + const e = s.get(_b); + e instanceof Nb && e.acceptSelected(); } }); -kt(class extends Ss { +kt(class extends Vs { constructor() { super({ - id: Q4, - title: Ie("previewSelected.title", "Preview selected action"), - precondition: xm.Visible, + id: Tj, + title: Ce("previewSelected.title", "Preview selected action"), + precondition: Rb.Visible, keybinding: { - weight: kC, + weight: _G, primary: 2051 } }); } run(s) { - const e = s.get(Pm); - e instanceof Mm && e.acceptSelected(!0); + const e = s.get(_b); + e instanceof Nb && e.acceptSelected(!0); } }); -var gi; +var bi; (function(s) { s[s.Hint = 1] = "Hint", s[s.Info = 2] = "Info", s[s.Warning = 4] = "Warning", s[s.Error = 8] = "Error"; -})(gi || (gi = {})); +})(bi || (bi = {})); (function(s) { - function e(r, l) { - return l - r; + function e(l, r) { + return r - l; } s.compare = e; const t = /* @__PURE__ */ Object.create(null); t[s.Error] = p("sev.error", "Error"), t[s.Warning] = p("sev.warning", "Warning"), t[s.Info] = p("sev.info", "Info"); - function i(r) { - return t[r] || ""; + function i(l) { + return t[l] || ""; } s.toString = i; - function n(r) { - switch (r) { - case Mi.Error: + function n(l) { + switch (l) { + case Si.Error: return s.Error; - case Mi.Warning: + case Si.Warning: return s.Warning; - case Mi.Info: + case Si.Info: return s.Info; - case Mi.Ignore: + case Si.Ignore: return s.Hint; } } s.fromSeverity = n; - function o(r) { - switch (r) { + function o(l) { + switch (l) { case s.Error: - return Mi.Error; + return Si.Error; case s.Warning: - return Mi.Warning; + return Si.Warning; case s.Info: - return Mi.Info; + return Si.Info; case s.Hint: - return Mi.Ignore; + return Si.Ignore; } } s.toSeverity = o; -})(gi || (gi = {})); -var xx; +})(bi || (bi = {})); +var EL; (function(s) { const e = ""; function t(n) { @@ -60462,15 +60462,15 @@ var xx; } s.makeKey = t; function i(n, o) { - const r = [e]; - return n.source ? r.push(n.source.replace("¦", "\\¦")) : r.push(e), n.code ? typeof n.code == "string" ? r.push(n.code.replace("¦", "\\¦")) : r.push(n.code.value.replace("¦", "\\¦")) : r.push(e), n.severity !== void 0 && n.severity !== null ? r.push(gi.toString(n.severity)) : r.push(e), n.message && o ? r.push(n.message.replace("¦", "\\¦")) : r.push(e), n.startLineNumber !== void 0 && n.startLineNumber !== null ? r.push(n.startLineNumber.toString()) : r.push(e), n.startColumn !== void 0 && n.startColumn !== null ? r.push(n.startColumn.toString()) : r.push(e), n.endLineNumber !== void 0 && n.endLineNumber !== null ? r.push(n.endLineNumber.toString()) : r.push(e), n.endColumn !== void 0 && n.endColumn !== null ? r.push(n.endColumn.toString()) : r.push(e), r.push(e), r.join("¦"); + const l = [e]; + return n.source ? l.push(n.source.replace("¦", "\\¦")) : l.push(e), n.code ? typeof n.code == "string" ? l.push(n.code.replace("¦", "\\¦")) : l.push(n.code.value.replace("¦", "\\¦")) : l.push(e), n.severity !== void 0 && n.severity !== null ? l.push(bi.toString(n.severity)) : l.push(e), n.message && o ? l.push(n.message.replace("¦", "\\¦")) : l.push(e), n.startLineNumber !== void 0 && n.startLineNumber !== null ? l.push(n.startLineNumber.toString()) : l.push(e), n.startColumn !== void 0 && n.startColumn !== null ? l.push(n.startColumn.toString()) : l.push(e), n.endLineNumber !== void 0 && n.endLineNumber !== null ? l.push(n.endLineNumber.toString()) : l.push(e), n.endColumn !== void 0 && n.endColumn !== null ? l.push(n.endColumn.toString()) : l.push(e), l.push(e), l.join("¦"); } s.makeKeyOptionalMessage = i; -})(xx || (xx = {})); -const Ba = $e("markerService"), q4 = new ae("supportedCodeAction", ""), i3 = "_typescript.applyFixAllCodeAction"; -class _pe extends R { +})(EL || (EL = {})); +const _c = $e("markerService"), Yj = new ce("supportedCodeAction", ""), xA = "_typescript.applyFixAllCodeAction"; +class yge extends J { constructor(e, t, i, n = 250) { - super(), this._editor = e, this._markerService = t, this._signalChange = i, this._delay = n, this._autoTriggerTimer = this._register(new qr()), this._register(this._markerService.onMarkerChanged((o) => this._onMarkerChanges(o))), this._register(this._editor.onDidChangeCursorPosition(() => this._tryAutoTrigger())); + super(), this._editor = e, this._markerService = t, this._signalChange = i, this._delay = n, this._autoTriggerTimer = this._register(new tr()), this._register(this._markerService.onMarkerChanged((o) => this._onMarkerChanges(o))), this._register(this._editor.onDidChangeCursorPosition(() => this._tryAutoTrigger())); } trigger(e) { const t = this._getRangeOfSelectionUnlessWhitespaceEnclosed(e); @@ -60478,7 +60478,7 @@ class _pe extends R { } _onMarkerChanges(e) { const t = this._editor.getModel(); - t && e.some((i) => d1(i, t.uri)) && this._tryAutoTrigger(); + t && e.some((i) => XW(i, t.uri)) && this._tryAutoTrigger(); } _tryAutoTrigger() { this._autoTriggerTimer.cancelAndSet(() => { @@ -60495,23 +60495,23 @@ class _pe extends R { 65 /* EditorOption.lightbulb */ ).enabled; - if (i !== Dr.Off) { + if (i !== vl.Off) { { - if (i === Dr.On) + if (i === vl.On) return t; - if (i === Dr.OnCode) { + if (i === vl.OnCode) { if (!t.isEmpty()) return t; - const o = this._editor.getModel(), { lineNumber: r, column: l } = t.getPosition(), a = o.getLineContent(r); - if (a.length === 0) + const o = this._editor.getModel(), { lineNumber: l, column: r } = t.getPosition(), c = o.getLineContent(l); + if (c.length === 0) return; - if (l === 1) { - if (/\s/.test(a[0])) + if (r === 1) { + if (/\s/.test(c[0])) return; - } else if (l === o.getLineMaxColumn(r)) { - if (/\s/.test(a[a.length - 1])) + } else if (r === o.getLineMaxColumn(l)) { + if (/\s/.test(c[c.length - 1])) return; - } else if (/\s/.test(a[l - 2]) && /\s/.test(a[l - 1])) + } else if (/\s/.test(c[r - 2]) && /\s/.test(c[r - 1])) return; } } @@ -60519,7 +60519,7 @@ class _pe extends R { } } } -var Xu; +var Ku; (function(s) { s.Empty = { type: 0 @@ -60527,10 +60527,10 @@ var Xu; }; class e { constructor(i, n, o) { - this.trigger = i, this.position = n, this._cancellablePromise = o, this.type = 1, this.actions = o.catch((r) => { - if (jr(r)) - return $4; - throw r; + this.trigger = i, this.position = n, this._cancellablePromise = o, this.type = 1, this.actions = o.catch((l) => { + if (er(l)) + return kj; + throw l; }); } cancel() { @@ -60538,8 +60538,8 @@ var Xu; } } s.Triggered = e; -})(Xu || (Xu = {})); -const $4 = Object.freeze({ +})(Ku || (Ku = {})); +const kj = Object.freeze({ allActions: [], validActions: [], dispose: () => { @@ -60549,17 +60549,17 @@ const $4 = Object.freeze({ hasAIFix: !1, allAIFixes: !1 }); -class Ipe extends R { - constructor(e, t, i, n, o, r, l) { - super(), this._editor = e, this._registry = t, this._markerService = i, this._progressService = o, this._configurationService = r, this._telemetryService = l, this._codeActionOracle = this._register(new fn()), this._state = Xu.Empty, this._onDidChangeState = this._register(new k()), this.onDidChangeState = this._onDidChangeState.event, this._disposed = !1, this._supportedCodeActions = q4.bindTo(n), this._register(this._editor.onDidChangeModel(() => this._update())), this._register(this._editor.onDidChangeModelLanguage(() => this._update())), this._register(this._registry.onDidChange(() => this._update())), this._register(this._editor.onDidChangeConfiguration((a) => { - a.hasChanged( +class Wge extends J { + constructor(e, t, i, n, o, l, r) { + super(), this._editor = e, this._registry = t, this._markerService = i, this._progressService = o, this._configurationService = l, this._telemetryService = r, this._codeActionOracle = this._register(new Zn()), this._state = Ku.Empty, this._onDidChangeState = this._register(new k()), this.onDidChangeState = this._onDidChangeState.event, this._disposed = !1, this._supportedCodeActions = Yj.bindTo(n), this._register(this._editor.onDidChangeModel(() => this._update())), this._register(this._editor.onDidChangeModelLanguage(() => this._update())), this._register(this._registry.onDidChange(() => this._update())), this._register(this._editor.onDidChangeConfiguration((c) => { + c.hasChanged( 65 /* EditorOption.lightbulb */ ) && this._update(); })), this._update(); } dispose() { - this._disposed || (this._disposed = !0, super.dispose(), this.setState(Xu.Empty, !0)); + this._disposed || (this._disposed = !0, super.dispose(), this.setState(Ku.Empty, !0)); } _settingEnabledNearbyQuickfixes() { var t; @@ -60569,76 +60569,76 @@ class Ipe extends R { _update() { if (this._disposed) return; - this._codeActionOracle.value = void 0, this.setState(Xu.Empty); + this._codeActionOracle.value = void 0, this.setState(Ku.Empty); const e = this._editor.getModel(); if (e && this._registry.has(e) && !this._editor.getOption( 92 /* EditorOption.readOnly */ )) { const t = this._registry.all(e).flatMap((i) => i.providedCodeActionKinds ?? []); - this._supportedCodeActions.set(t.join(" ")), this._codeActionOracle.value = new _pe(this._editor, this._markerService, (i) => { - var a; + this._supportedCodeActions.set(t.join(" ")), this._codeActionOracle.value = new yge(this._editor, this._markerService, (i) => { + var c; if (!i) { - this.setState(Xu.Empty); + this.setState(Ku.Empty); return; } - const n = i.selection.getStartPosition(), o = Ui(async (c) => { - var d, h, u, g, m, f, b, y, w, C; - if (this._settingEnabledNearbyQuickfixes() && i.trigger.type === 1 && (i.trigger.triggerAction === fo.QuickFix || (h = (d = i.trigger.filter) == null ? void 0 : d.include) != null && h.contains(Jt.QuickFix))) { - const S = await Op(this._registry, e, i.selection, i.trigger, xl.None, c), L = [...S.allActions]; - if (c.isCancellationRequested) - return $4; - const x = (u = S.validActions) == null ? void 0 : u.some((_) => _.action.kind ? Jt.QuickFix.contains(new $t(_.action.kind)) : !1), Z = this._markerService.read({ resource: e.uri }); - if (x) { - for (const _ of S.validActions) - (m = (g = _.action.command) == null ? void 0 : g.arguments) != null && m.some((v) => typeof v == "string" && v.includes(i3)) && (_.action.diagnostics = [...Z.filter((v) => v.relatedInformation)]); - return { validActions: S.validActions, allActions: L, documentation: S.documentation, hasAutoFix: S.hasAutoFix, hasAIFix: S.hasAIFix, allAIFixes: S.allAIFixes, dispose: () => { - S.dispose(); + const n = i.selection.getStartPosition(), o = Qi(async (d) => { + var a, h, u, m, b, g, Z, f, y, W; + if (this._settingEnabledNearbyQuickfixes() && i.trigger.type === 1 && (i.trigger.triggerAction === fo.QuickFix || (h = (a = i.trigger.filter) == null ? void 0 : a.include) != null && h.contains(Bt.QuickFix))) { + const G = await jp(this._registry, e, i.selection, i.trigger, Cr.None, d), X = [...G.allActions]; + if (d.isCancellationRequested) + return kj; + const L = (u = G.validActions) == null ? void 0 : u.some((x) => x.action.kind ? Bt.QuickFix.contains(new ei(x.action.kind)) : !1), S = this._markerService.read({ resource: e.uri }); + if (L) { + for (const x of G.validActions) + (b = (m = x.action.command) == null ? void 0 : m.arguments) != null && b.some((w) => typeof w == "string" && w.includes(xA)) && (x.action.diagnostics = [...S.filter((w) => w.relatedInformation)]); + return { validActions: G.validActions, allActions: X, documentation: G.documentation, hasAutoFix: G.hasAutoFix, hasAIFix: G.hasAIFix, allAIFixes: G.allAIFixes, dispose: () => { + G.dispose(); } }; - } else if (!x && Z.length > 0) { - const _ = i.selection.getPosition(); - let v = _, P = Number.MAX_VALUE; - const E = [...S.validActions]; - for (const B of Z) { - const X = B.endColumn, j = B.endLineNumber, le = B.startLineNumber; - if (j === _.lineNumber || le === _.lineNumber) { - v = new V(j, X); + } else if (!L && S.length > 0) { + const x = i.selection.getPosition(); + let w = x, A = Number.MAX_VALUE; + const H = [...G.validActions]; + for (const K of S) { + const E = K.endColumn, j = K.endLineNumber, re = K.startLineNumber; + if (j === x.lineNumber || re === x.lineNumber) { + w = new Y(j, E); const ue = { type: i.trigger.type, triggerAction: i.trigger.triggerAction, - filter: { include: (f = i.trigger.filter) != null && f.include ? (b = i.trigger.filter) == null ? void 0 : b.include : Jt.QuickFix }, + filter: { include: (g = i.trigger.filter) != null && g.include ? (Z = i.trigger.filter) == null ? void 0 : Z.include : Bt.QuickFix }, autoApply: i.trigger.autoApply, - context: { notAvailableMessage: ((y = i.trigger.context) == null ? void 0 : y.notAvailableMessage) || "", position: v } - }, be = new fe(v.lineNumber, v.column, v.lineNumber, v.column), me = await Op(this._registry, e, be, ue, xl.None, c); - if (me.validActions.length !== 0) { - for (const Ve of me.validActions) - (C = (w = Ve.action.command) == null ? void 0 : w.arguments) != null && C.some((ke) => typeof ke == "string" && ke.includes(i3)) && (Ve.action.diagnostics = [...Z.filter((ke) => ke.relatedInformation)]); - S.allActions.length === 0 && L.push(...me.allActions), Math.abs(_.column - X) < P ? E.unshift(...me.validActions) : E.push(...me.validActions); + context: { notAvailableMessage: ((f = i.trigger.context) == null ? void 0 : f.notAvailableMessage) || "", position: w } + }, Ze = new ge(w.lineNumber, w.column, w.lineNumber, w.column), be = await jp(this._registry, e, Ze, ue, Cr.None, d); + if (be.validActions.length !== 0) { + for (const Ye of be.validActions) + (W = (y = Ye.action.command) == null ? void 0 : y.arguments) != null && W.some((ke) => typeof ke == "string" && ke.includes(xA)) && (Ye.action.diagnostics = [...S.filter((ke) => ke.relatedInformation)]); + G.allActions.length === 0 && X.push(...be.allActions), Math.abs(x.column - E) < A ? H.unshift(...be.validActions) : H.push(...be.validActions); } - P = Math.abs(_.column - X); + A = Math.abs(x.column - E); } } - const Y = E.filter((B, X, j) => j.findIndex((le) => le.action.title === B.action.title) === X); - return Y.sort((B, X) => B.action.isPreferred && !X.action.isPreferred ? -1 : !B.action.isPreferred && X.action.isPreferred || B.action.isAI && !X.action.isAI ? 1 : !B.action.isAI && X.action.isAI ? -1 : 0), { validActions: Y, allActions: L, documentation: S.documentation, hasAutoFix: S.hasAutoFix, hasAIFix: S.hasAIFix, allAIFixes: S.allAIFixes, dispose: () => { - S.dispose(); + const F = H.filter((K, E, j) => j.findIndex((re) => re.action.title === K.action.title) === E); + return F.sort((K, E) => K.action.isPreferred && !E.action.isPreferred ? -1 : !K.action.isPreferred && E.action.isPreferred || K.action.isAI && !E.action.isAI ? 1 : !K.action.isAI && E.action.isAI ? -1 : 0), { validActions: F, allActions: X, documentation: G.documentation, hasAutoFix: G.hasAutoFix, hasAIFix: G.hasAIFix, allAIFixes: G.allAIFixes, dispose: () => { + G.dispose(); } }; } } if (i.trigger.type === 1) { - const S = new on(), L = await Op(this._registry, e, i.selection, i.trigger, xl.None, c); + const G = new ln(), X = await jp(this._registry, e, i.selection, i.trigger, Cr.None, d); return this._telemetryService && this._telemetryService.publicLog2("codeAction.invokedDurations", { - codeActions: L.validActions.length, - duration: S.elapsed() - }), L; + codeActions: X.validActions.length, + duration: G.elapsed() + }), X; } - return Op(this._registry, e, i.selection, i.trigger, xl.None, c); + return jp(this._registry, e, i.selection, i.trigger, Cr.None, d); }); - i.trigger.type === 1 && ((a = this._progressService) == null || a.showWhile(o, 250)); - const r = new Xu.Triggered(i.trigger, n, o); - let l = !1; - this._state.type === 1 && (l = this._state.trigger.type === 1 && r.type === 1 && r.trigger.type === 2 && this._state.position !== r.position), l ? setTimeout(() => { - this.setState(r); - }, 500) : this.setState(r); + i.trigger.type === 1 && ((c = this._progressService) == null || c.showWhile(o, 250)); + const l = new Ku.Triggered(i.trigger, n, o); + let r = !1; + this._state.type === 1 && (r = this._state.trigger.type === 1 && l.type === 1 && l.trigger.type === 2 && this._state.position !== l.position), r ? setTimeout(() => { + this.setState(l); + }, 500) : this.setState(l); }, void 0), this._codeActionOracle.value.trigger({ type: 2, triggerAction: fo.Default }); } else this._supportedCodeActions.reset(); @@ -60651,27 +60651,27 @@ class Ipe extends R { e !== this._state && (this._state.type === 1 && this._state.cancel(), this._state = e, !t && !this._disposed && this._onDidChangeState.fire(e)); } } -var Npe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Gge = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Jl = function(s, e) { +}, jr = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Zp; -const Wpe = "quickfix-edit-highlight"; -var ch; -let Mb = (ch = class extends R { +}, Tp; +const Xge = "quickfix-edit-highlight"; +var mh; +let wZ = (mh = class extends J { static get(e) { - return e.getContribution(Zp.ID); + return e.getContribution(Tp.ID); } - constructor(e, t, i, n, o, r, l, a, c, d, h) { - super(), this._commandService = l, this._configurationService = a, this._actionWidgetService = c, this._instantiationService = d, this._telemetryService = h, this._activeCodeActions = this._register(new fn()), this._showDisabled = !1, this._disposed = !1, this._editor = e, this._model = this._register(new Ipe(this._editor, o.codeActionProvider, t, i, r, a, this._telemetryService)), this._register(this._model.onDidChangeState((u) => this.update(u))), this._lightBulbWidget = new Wl(() => { - const u = this._editor.getContribution(_1.ID); - return u && this._register(u.onClick((g) => this.showCodeActionsFromLightbulb(g.actions, g))), u; - }), this._resolver = n.createInstance(BT), this._register(this._editor.onDidLayoutChange(() => this._actionWidgetService.hide())); + constructor(e, t, i, n, o, l, r, c, d, a, h) { + super(), this._commandService = r, this._configurationService = c, this._actionWidgetService = d, this._instantiationService = a, this._telemetryService = h, this._activeCodeActions = this._register(new Zn()), this._showDisabled = !1, this._disposed = !1, this._editor = e, this._model = this._register(new Wge(this._editor, o.codeActionProvider, t, i, l, c, this._telemetryService)), this._register(this._model.onDidChangeState((u) => this.update(u))), this._lightBulbWidget = new Yr(() => { + const u = this._editor.getContribution(EW.ID); + return u && this._register(u.onClick((m) => this.showCodeActionsFromLightbulb(m.actions, m))), u; + }), this._resolver = n.createInstance(hM), this._register(this._editor.onDidLayoutChange(() => this._actionWidgetService.hide())); } dispose() { this._disposed = !0, super.dispose(); @@ -60679,7 +60679,7 @@ let Mb = (ch = class extends R { async showCodeActionsFromLightbulb(e, t) { if (e.allAIFixes && e.validActions.length === 1) { const i = e.validActions[0], n = i.action.command; - n && n.id === "inlineChat.start" && n.arguments && n.arguments.length >= 1 && (n.arguments[0] = { ...n.arguments[0], autoSend: !1 }), await this._applyCodeAction(i, !1, !1, ig.FromAILightbulb); + n && n.id === "inlineChat.start" && n.arguments && n.arguments.length >= 1 && (n.arguments[0] = { ...n.arguments[0], autoSend: !1 }), await this._applyCodeAction(i, !1, !1, rm.FromAILightbulb); return; } await this.showCodeActionList(e, t, { includeDisabledActions: !1, fromLightbulb: !0 }); @@ -60688,10 +60688,10 @@ let Mb = (ch = class extends R { return this.showCodeActionList(t, i, { includeDisabledActions: !1, fromLightbulb: !1 }); } manualTriggerAtCurrentPosition(e, t, i, n) { - var r; + var l; if (!this._editor.hasModel()) return; - (r = ho.get(this._editor)) == null || r.closeMessage(); + (l = mo.get(this._editor)) == null || l.closeMessage(); const o = this._editor.getPosition(); this._trigger({ type: 1, triggerAction: t, filter: i, autoApply: n, context: { notAvailableMessage: e, position: o } }); } @@ -60700,7 +60700,7 @@ let Mb = (ch = class extends R { } async _applyCodeAction(e, t, i, n) { try { - await this._instantiationService.invokeFunction(ppe, e, n, { preview: i, editor: this._editor }); + await this._instantiationService.invokeFunction(rge, e, n, { preview: i, editor: this._editor }); } finally { t && this._trigger({ type: 2, triggerAction: fo.QuickFix, filter: {} }); } @@ -60710,7 +60710,7 @@ let Mb = (ch = class extends R { (e = this._lightBulbWidget.rawValue) == null || e.hide(), (t = this._lightBulbWidget.rawValue) == null || t.gutterHide(); } async update(e) { - var n, o, r, l, a; + var n, o, l, r, c; if (e.type !== 1) { this.hideLightBulbWidget(); return; @@ -60718,8 +60718,8 @@ let Mb = (ch = class extends R { let t; try { t = await e.actions; - } catch (c) { - De(c); + } catch (d) { + Me(d); return; } if (this._disposed) @@ -60728,10 +60728,10 @@ let Mb = (ch = class extends R { if ((i == null ? void 0 : i.startLineNumber) === e.position.lineNumber) if ((n = this._lightBulbWidget.value) == null || n.update(t, e.trigger, e.position), e.trigger.type === 1) { if ((o = e.trigger.filter) != null && o.include) { - const d = this.tryGetValidActionToApply(e.trigger, t); - if (d) { + const a = this.tryGetValidActionToApply(e.trigger, t); + if (a) { try { - this.hideLightBulbWidget(), await this._applyCodeAction(d, !1, !1, ig.FromCodeActions); + this.hideLightBulbWidget(), await this._applyCodeAction(a, !1, !1, rm.FromCodeActions); } finally { t.dispose(); } @@ -60740,17 +60740,17 @@ let Mb = (ch = class extends R { if (e.trigger.context) { const h = this.getInvalidActionThatWouldHaveBeenApplied(e.trigger, t); if (h && h.action.disabled) { - (r = ho.get(this._editor)) == null || r.showMessage(h.action.disabled, e.trigger.context.position), t.dispose(); + (l = mo.get(this._editor)) == null || l.showMessage(h.action.disabled, e.trigger.context.position), t.dispose(); return; } } } - const c = !!((l = e.trigger.filter) != null && l.include); - if (e.trigger.context && (!t.allActions.length || !c && !t.validActions.length)) { - (a = ho.get(this._editor)) == null || a.showMessage(e.trigger.context.notAvailableMessage, e.trigger.context.position), this._activeCodeActions.value = t, t.dispose(); + const d = !!((r = e.trigger.filter) != null && r.include); + if (e.trigger.context && (!t.allActions.length || !d && !t.validActions.length)) { + (c = mo.get(this._editor)) == null || c.showMessage(e.trigger.context.notAvailableMessage, e.trigger.context.position), this._activeCodeActions.value = t, t.dispose(); return; } - this._activeCodeActions.value = t, this.showCodeActionList(t, this.toCoords(e.position), { includeDisabledActions: c, fromLightbulb: !1 }); + this._activeCodeActions.value = t, this.showCodeActionList(t, this.toCoords(e.position), { includeDisabledActions: d, fromLightbulb: !1 }); } else this._actionWidgetService.isVisible ? t.dispose() : this._activeCodeActions.value = t; } @@ -60766,62 +60766,62 @@ let Mb = (ch = class extends R { const n = this._editor.createDecorationsCollection(), o = this._editor.getDomNode(); if (!o) return; - const r = i.includeDisabledActions && (this._showDisabled || e.validActions.length === 0) ? e.allActions : e.validActions; - if (!r.length) + const l = i.includeDisabledActions && (this._showDisabled || e.validActions.length === 0) ? e.allActions : e.validActions; + if (!l.length) return; - const l = V.isIPosition(t) ? this.toCoords(t) : t, a = { - onSelect: async (c, d) => { + const r = Y.isIPosition(t) ? this.toCoords(t) : t, c = { + onSelect: async (d, a) => { this._applyCodeAction( - c, + d, /* retrigger */ !0, - !!d, - i.fromLightbulb ? ig.FromAILightbulb : ig.FromCodeActions + !!a, + i.fromLightbulb ? rm.FromAILightbulb : rm.FromCodeActions ), this._actionWidgetService.hide(!1), n.clear(); }, - onHide: (c) => { - var d; - (d = this._editor) == null || d.focus(), n.clear(); + onHide: (d) => { + var a; + (a = this._editor) == null || a.focus(), n.clear(); }, - onHover: async (c, d) => { - var g; - if (d.isCancellationRequested) + onHover: async (d, a) => { + var m; + if (a.isCancellationRequested) return; let h = !1; - const u = c.action.kind; + const u = d.action.kind; if (u) { - const m = new $t(u); + const b = new ei(u); h = [ - Jt.RefactorExtract, - Jt.RefactorInline, - Jt.RefactorRewrite, - Jt.RefactorMove, - Jt.Source - ].some((b) => b.contains(m)); + Bt.RefactorExtract, + Bt.RefactorInline, + Bt.RefactorRewrite, + Bt.RefactorMove, + Bt.Source + ].some((Z) => Z.contains(b)); } - return { canPreview: h || !!((g = c.action.edit) != null && g.edits.length) }; + return { canPreview: h || !!((m = d.action.edit) != null && m.edits.length) }; }, - onFocus: (c) => { - var d, h; - if (c && c.action) { - const u = c.action.ranges, g = c.action.diagnostics; + onFocus: (d) => { + var a, h; + if (d && d.action) { + const u = d.action.ranges, m = d.action.diagnostics; if (n.clear(), u && u.length > 0) { - const m = g && (g == null ? void 0 : g.length) > 1 ? g.map((f) => ({ range: f, options: Zp.DECORATION })) : u.map((f) => ({ range: f, options: Zp.DECORATION })); - n.set(m); - } else if (g && g.length > 0) { - const m = g.map((b) => ({ range: b, options: Zp.DECORATION })); - n.set(m); - const f = g[0]; - if (f.startLineNumber && f.startColumn) { - const b = (h = (d = this._editor.getModel()) == null ? void 0 : d.getWordAtPosition({ lineNumber: f.startLineNumber, column: f.startColumn })) == null ? void 0 : h.word; - Bc(p("editingNewSelection", "Context: {0} at line {1} and column {2}.", b, f.startLineNumber, f.startColumn)); + const b = m && (m == null ? void 0 : m.length) > 1 ? m.map((g) => ({ range: g, options: Tp.DECORATION })) : u.map((g) => ({ range: g, options: Tp.DECORATION })); + n.set(b); + } else if (m && m.length > 0) { + const b = m.map((Z) => ({ range: Z, options: Tp.DECORATION })); + n.set(b); + const g = m[0]; + if (g.startLineNumber && g.startColumn) { + const Z = (h = (a = this._editor.getModel()) == null ? void 0 : a.getWordAtPosition({ lineNumber: g.startLineNumber, column: g.startColumn })) == null ? void 0 : h.word; + _d(p("editingNewSelection", "Context: {0} at line {1} and column {2}.", Z, g.startLineNumber, g.startColumn)); } } } else n.clear(); } }; - this._actionWidgetService.show("codeActionWidget", !0, Cpe(r, this._shouldShowHeaders(), this._resolver.getResolver()), a, l, o, this._getActionBarActions(e, t, i)); + this._actionWidgetService.show("codeActionWidget", !0, uge(l, this._shouldShowHeaders(), this._resolver.getResolver()), c, r, o, this._getActionBarActions(e, t, i)); } toCoords(e) { if (!this._editor.hasModel()) @@ -60866,33 +60866,33 @@ let Mb = (ch = class extends R { run: () => (this._showDisabled = !0, this.showCodeActionList(e, t, i)) }), n; } -}, Zp = ch, ch.ID = "editor.contrib.codeActionController", ch.DECORATION = Re.register({ +}, Tp = mh, mh.ID = "editor.contrib.codeActionController", mh.DECORATION = Je.register({ description: "quickfix-highlight", - className: Wpe -}), ch); -Mb = Zp = Npe([ - Jl(1, Ba), - Jl(2, _e), - Jl(3, Se), - Jl(4, ge), - Jl(5, qh), - Jl(6, Qt), - Jl(7, Ke), - Jl(8, Pm), - Jl(9, Se), - Jl(10, Ls) -], Mb); -Lr((s, e) => { + className: Xge +}), mh); +wZ = Tp = Gge([ + jr(1, _c), + jr(2, xe), + jr(3, Ge), + jr(4, me), + jr(5, iu), + jr(6, Ot), + jr(7, Qe), + jr(8, _b), + jr(9, Ge), + jr(10, Ls) +], wZ); +Il((s, e) => { ((n, o) => { o && e.addRule(`.monaco-editor ${n} { background-color: ${o}; }`); - })(".quickfix-edit-highlight", s.getColor(xc)); - const i = s.getColor(zd); - i && e.addRule(`.monaco-editor .quickfix-edit-highlight { border: 1px ${Ma(s.type) ? "dotted" : "solid"} ${i}; box-sizing: border-box; }`); + })(".quickfix-edit-highlight", s.getColor(Cd)); + const i = s.getColor(Pa); + i && e.addRule(`.monaco-editor .quickfix-edit-highlight { border: 1px ${Rc(s.type) ? "dotted" : "solid"} ${i}; box-sizing: border-box; }`); }); -function GC(s) { - return H.regex(q4.keys()[0], new RegExp("(\\s|^)" + Po(s.value) + "\\b")); +function QG(s) { + return P.regex(Yj.keys()[0], new RegExp("(\\s|^)" + Uo(s.value) + "\\b")); } -const n5 = { +const CH = { type: "object", defaultSnippets: [{ body: { kind: "" } }], properties: { @@ -60923,21 +60923,21 @@ const n5 = { } } }; -function Bm(s, e, t, i, n = fo.Default) { +function Qb(s, e, t, i, n = fo.Default) { if (s.hasModel()) { - const o = Mb.get(s); + const o = wZ.get(s); o == null || o.manualTriggerAtCurrentPosition(e, n, t, i); } } -class vpe extends he { +class Vge extends he { constructor() { super({ - id: i5, + id: xH, label: p("quickfix.trigger.label", "Quick Fix..."), alias: "Quick Fix...", - precondition: H.and(I.writable, I.hasCodeActionsProvider), + precondition: P.and(C.writable, C.hasCodeActionsProvider), kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 2137, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -60945,41 +60945,41 @@ class vpe extends he { }); } run(e, t) { - return Bm(t, p("editor.action.quickFix.noneMessage", "No code actions available"), void 0, void 0, fo.QuickFix); + return Qb(t, p("editor.action.quickFix.noneMessage", "No code actions available"), void 0, void 0, fo.QuickFix); } } -class Tpe extends zi { +class Lge extends Ai { constructor() { super({ - id: z4, - precondition: H.and(I.writable, I.hasCodeActionsProvider), + id: Lj, + precondition: P.and(C.writable, C.hasCodeActionsProvider), metadata: { description: "Trigger a code action", - args: [{ name: "args", schema: n5 }] + args: [{ name: "args", schema: CH }] } }); } runEditorCommand(e, t, i) { - const n = ya.fromUser(i, { - kind: $t.Empty, + const n = Xc.fromUser(i, { + kind: ei.Empty, apply: "ifSingle" }); - return Bm(t, typeof (i == null ? void 0 : i.kind) == "string" ? n.preferred ? p("editor.action.codeAction.noneMessage.preferred.kind", "No preferred code actions for '{0}' available", i.kind) : p("editor.action.codeAction.noneMessage.kind", "No code actions for '{0}' available", i.kind) : n.preferred ? p("editor.action.codeAction.noneMessage.preferred", "No preferred code actions available") : p("editor.action.codeAction.noneMessage", "No code actions available"), { + return Qb(t, typeof (i == null ? void 0 : i.kind) == "string" ? n.preferred ? p("editor.action.codeAction.noneMessage.preferred.kind", "No preferred code actions for '{0}' available", i.kind) : p("editor.action.codeAction.noneMessage.kind", "No code actions for '{0}' available", i.kind) : n.preferred ? p("editor.action.codeAction.noneMessage.preferred", "No preferred code actions available") : p("editor.action.codeAction.noneMessage", "No code actions available"), { include: n.kind, includeSourceActions: !0, onlyIncludePreferredActions: n.preferred }, n.apply); } } -class Dpe extends he { +class Ige extends he { constructor() { super({ - id: B4, + id: Sj, label: p("refactor.label", "Refactor..."), alias: "Refactor...", - precondition: H.and(I.writable, I.hasCodeActionsProvider), + precondition: P.and(C.writable, C.hasCodeActionsProvider), kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 3120, mac: { primary: 1328 @@ -60991,66 +60991,66 @@ class Dpe extends he { contextMenuOpts: { group: "1_modification", order: 2, - when: H.and(I.writable, GC(Jt.Refactor)) + when: P.and(C.writable, QG(Bt.Refactor)) }, metadata: { description: "Refactor...", - args: [{ name: "args", schema: n5 }] + args: [{ name: "args", schema: CH }] } }); } run(e, t, i) { - const n = ya.fromUser(i, { - kind: Jt.Refactor, + const n = Xc.fromUser(i, { + kind: Bt.Refactor, apply: "never" /* CodeActionAutoApply.Never */ }); - return Bm(t, typeof (i == null ? void 0 : i.kind) == "string" ? n.preferred ? p("editor.action.refactor.noneMessage.preferred.kind", "No preferred refactorings for '{0}' available", i.kind) : p("editor.action.refactor.noneMessage.kind", "No refactorings for '{0}' available", i.kind) : n.preferred ? p("editor.action.refactor.noneMessage.preferred", "No preferred refactorings available") : p("editor.action.refactor.noneMessage", "No refactorings available"), { - include: Jt.Refactor.contains(n.kind) ? n.kind : $t.None, + return Qb(t, typeof (i == null ? void 0 : i.kind) == "string" ? n.preferred ? p("editor.action.refactor.noneMessage.preferred.kind", "No preferred refactorings for '{0}' available", i.kind) : p("editor.action.refactor.noneMessage.kind", "No refactorings for '{0}' available", i.kind) : n.preferred ? p("editor.action.refactor.noneMessage.preferred", "No preferred refactorings available") : p("editor.action.refactor.noneMessage", "No refactorings available"), { + include: Bt.Refactor.contains(n.kind) ? n.kind : ei.None, onlyIncludePreferredActions: n.preferred }, n.apply, fo.Refactor); } } -class Vpe extends he { +class Sge extends he { constructor() { super({ - id: O4, + id: xj, label: p("source.label", "Source Action..."), alias: "Source Action...", - precondition: H.and(I.writable, I.hasCodeActionsProvider), + precondition: P.and(C.writable, C.hasCodeActionsProvider), contextMenuOpts: { group: "1_modification", order: 2.1, - when: H.and(I.writable, GC(Jt.Source)) + when: P.and(C.writable, QG(Bt.Source)) }, metadata: { description: "Source Action...", - args: [{ name: "args", schema: n5 }] + args: [{ name: "args", schema: CH }] } }); } run(e, t, i) { - const n = ya.fromUser(i, { - kind: Jt.Source, + const n = Xc.fromUser(i, { + kind: Bt.Source, apply: "never" /* CodeActionAutoApply.Never */ }); - return Bm(t, typeof (i == null ? void 0 : i.kind) == "string" ? n.preferred ? p("editor.action.source.noneMessage.preferred.kind", "No preferred source actions for '{0}' available", i.kind) : p("editor.action.source.noneMessage.kind", "No source actions for '{0}' available", i.kind) : n.preferred ? p("editor.action.source.noneMessage.preferred", "No preferred source actions available") : p("editor.action.source.noneMessage", "No source actions available"), { - include: Jt.Source.contains(n.kind) ? n.kind : $t.None, + return Qb(t, typeof (i == null ? void 0 : i.kind) == "string" ? n.preferred ? p("editor.action.source.noneMessage.preferred.kind", "No preferred source actions for '{0}' available", i.kind) : p("editor.action.source.noneMessage.kind", "No source actions for '{0}' available", i.kind) : n.preferred ? p("editor.action.source.noneMessage.preferred", "No preferred source actions available") : p("editor.action.source.noneMessage", "No source actions available"), { + include: Bt.Source.contains(n.kind) ? n.kind : ei.None, includeSourceActions: !0, onlyIncludePreferredActions: n.preferred }, n.apply, fo.SourceAction); } } -class kpe extends he { +class xge extends he { constructor() { super({ - id: YT, + id: cM, label: p("organizeImports.label", "Organize Imports"), alias: "Organize Imports", - precondition: H.and(I.writable, GC(Jt.SourceOrganizeImports)), + precondition: P.and(C.writable, QG(Bt.SourceOrganizeImports)), kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 1581, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -61058,31 +61058,31 @@ class kpe extends he { }); } run(e, t) { - return Bm(t, p("editor.action.organize.noneMessage", "No organize imports action available"), { include: Jt.SourceOrganizeImports, includeSourceActions: !0 }, "ifSingle", fo.OrganizeImports); + return Qb(t, p("editor.action.organize.noneMessage", "No organize imports action available"), { include: Bt.SourceOrganizeImports, includeSourceActions: !0 }, "ifSingle", fo.OrganizeImports); } } -class Gpe extends he { +class Cge extends he { constructor() { super({ - id: zT, + id: dM, label: p("fixAll.label", "Fix All"), alias: "Fix All", - precondition: H.and(I.writable, GC(Jt.SourceFixAll)) + precondition: P.and(C.writable, QG(Bt.SourceFixAll)) }); } run(e, t) { - return Bm(t, p("fixAll.noneMessage", "No fix all action available"), { include: Jt.SourceFixAll, includeSourceActions: !0 }, "ifSingle", fo.FixAll); + return Qb(t, p("fixAll.noneMessage", "No fix all action available"), { include: Bt.SourceFixAll, includeSourceActions: !0 }, "ifSingle", fo.FixAll); } } -class Rpe extends he { +class Rge extends he { constructor() { super({ - id: P4, + id: Ij, label: p("autoFix.label", "Auto Fix..."), alias: "Auto Fix...", - precondition: H.and(I.writable, GC(Jt.QuickFix)), + precondition: P.and(C.writable, QG(Bt.QuickFix)), kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 1625, mac: { primary: 2649 @@ -61094,33 +61094,33 @@ class Rpe extends he { }); } run(e, t) { - return Bm(t, p("editor.action.autoFix.noneMessage", "No auto fixes available"), { - include: Jt.QuickFix, + return Qb(t, p("editor.action.autoFix.noneMessage", "No auto fixes available"), { + include: Bt.QuickFix, onlyIncludePreferredActions: !0 }, "ifSingle", fo.AutoFix); } } -gt( - Mb.ID, - Mb, +mt( + wZ.ID, + wZ, 3 /* EditorContributionInstantiation.Eventually */ ); -gt( - _1.ID, - _1, +mt( + EW.ID, + EW, 4 /* EditorContributionInstantiation.Lazy */ ); -ee(vpe); -ee(Dpe); -ee(Vpe); -ee(kpe); -ee(Rpe); -ee(Gpe); -oe(new Tpe()); -Di.as($r.Configuration).registerConfiguration({ - ...VC, +ee(Vge); +ee(Ige); +ee(Sge); +ee(xge); +ee(Rge); +ee(Cge); +oe(new Lge()); +ki.as(ir.Configuration).registerConfiguration({ + ...BG, properties: { "editor.codeActionWidget.showHeaders": { type: "boolean", @@ -61130,8 +61130,8 @@ Di.as($r.Configuration).registerConfiguration({ } } }); -Di.as($r.Configuration).registerConfiguration({ - ...VC, +ki.as(ir.Configuration).registerConfiguration({ + ...BG, properties: { "editor.codeActionWidget.includeNearbyQuickFixes": { type: "boolean", @@ -61141,8 +61141,8 @@ Di.as($r.Configuration).registerConfiguration({ } } }); -Di.as($r.Configuration).registerConfiguration({ - ...VC, +ki.as(ir.Configuration).registerConfiguration({ + ...BG, properties: { "editor.codeActions.triggerOnFocusChange": { type: "boolean", @@ -61152,9 +61152,9 @@ Di.as($r.Configuration).registerConfiguration({ } } }); -class UT { +class pM { constructor() { - this.lenses = [], this._disposables = new U(); + this.lenses = [], this._disposables = new _(); } dispose() { this._disposables.dispose(); @@ -61168,68 +61168,68 @@ class UT { this.lenses.push({ symbol: i, provider: t }); } } -async function eQ(s, e, t) { - const i = s.ordered(e), n = /* @__PURE__ */ new Map(), o = new UT(), r = i.map(async (l, a) => { - n.set(l, a); +async function vj(s, e, t) { + const i = s.ordered(e), n = /* @__PURE__ */ new Map(), o = new pM(), l = i.map(async (r, c) => { + n.set(r, c); try { - const c = await Promise.resolve(l.provideCodeLenses(e, t)); - c && o.add(c, l); - } catch (c) { - wi(c); + const d = await Promise.resolve(r.provideCodeLenses(e, t)); + d && o.add(d, r); + } catch (d) { + Wi(d); } }); - return await Promise.all(r), o.lenses = o.lenses.sort((l, a) => l.symbol.range.startLineNumber < a.symbol.range.startLineNumber ? -1 : l.symbol.range.startLineNumber > a.symbol.range.startLineNumber ? 1 : n.get(l.provider) < n.get(a.provider) ? -1 : n.get(l.provider) > n.get(a.provider) ? 1 : l.symbol.range.startColumn < a.symbol.range.startColumn ? -1 : l.symbol.range.startColumn > a.symbol.range.startColumn ? 1 : 0), o; + return await Promise.all(l), o.lenses = o.lenses.sort((r, c) => r.symbol.range.startLineNumber < c.symbol.range.startLineNumber ? -1 : r.symbol.range.startLineNumber > c.symbol.range.startLineNumber ? 1 : n.get(r.provider) < n.get(c.provider) ? -1 : n.get(r.provider) > n.get(c.provider) ? 1 : r.symbol.range.startColumn < c.symbol.range.startColumn ? -1 : r.symbol.range.startColumn > c.symbol.range.startColumn ? 1 : 0), o; } st.registerCommand("_executeCodeLensProvider", function(s, ...e) { let [t, i] = e; - ht(Le.isUri(t)), ht(typeof i == "number" || !i); - const { codeLensProvider: n } = s.get(ge), o = s.get(Pt).getModel(t); + ht(Xe.isUri(t)), ht(typeof i == "number" || !i); + const { codeLensProvider: n } = s.get(me), o = s.get(At).getModel(t); if (!o) - throw hr(); - const r = [], l = new U(); - return eQ(n, o, Ye.None).then((a) => { - l.add(a); - const c = []; - for (const d of a.lenses) - i == null || d.symbol.command ? r.push(d.symbol) : i-- > 0 && d.provider.resolveCodeLens && c.push(Promise.resolve(d.provider.resolveCodeLens(o, d.symbol, Ye.None)).then((h) => r.push(h || d.symbol))); - return Promise.all(c); - }).then(() => r).finally(() => { - setTimeout(() => l.dispose(), 100); + throw bl(); + const l = [], r = new _(); + return vj(n, o, Fe.None).then((c) => { + r.add(c); + const d = []; + for (const a of c.lenses) + i == null || a.symbol.command ? l.push(a.symbol) : i-- > 0 && a.provider.resolveCodeLens && d.push(Promise.resolve(a.provider.resolveCodeLens(o, a.symbol, Fe.None)).then((h) => l.push(h || a.symbol))); + return Promise.all(d); + }).then(() => l).finally(() => { + setTimeout(() => r.dispose(), 100); }); }); -var Epe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Nge = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Xpe = function(s, e) { +}, wge = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const tQ = $e("ICodeLensCache"); -class n3 { +const Jj = $e("ICodeLensCache"); +class CA { constructor(e, t) { this.lineCount = e, this.data = t; } } -let KT = class { +let gM = class { constructor(e) { this._fakeProvider = new class { provideCodeLenses() { throw new Error("not supported"); } - }(), this._cache = new id(20, 0.75); + }(), this._cache = new la(20, 0.75); const t = "codelens/cache"; - ny(vt, () => e.remove( + mf(wt, () => e.remove( t, 1 /* StorageScope.WORKSPACE */ )); const i = "codelens/cache2", n = e.get(i, 1, "{}"); this._deserialize(n); - const o = se.filter(e.onWillSaveState, (r) => r.reason === cx.SHUTDOWN); - se.once(o)((r) => { + const o = se.filter(e.onWillSaveState, (l) => l.reason === LL.SHUTDOWN); + se.once(o)((l) => { e.store( i, this._serialize(), @@ -61240,16 +61240,16 @@ let KT = class { }); } put(e, t) { - const i = t.lenses.map((r) => { - var l; + const i = t.lenses.map((l) => { + var r; return { - range: r.symbol.range, - command: r.symbol.command && { id: "", title: (l = r.symbol.command) == null ? void 0 : l.title } + range: l.symbol.range, + command: l.symbol.command && { id: "", title: (r = l.symbol.command) == null ? void 0 : r.title } }; - }), n = new UT(); + }), n = new pM(); n.add({ lenses: i, dispose: () => { } }, this._fakeProvider); - const o = new n3(e.getLineCount(), n); + const o = new CA(e.getLineCount(), n); this._cache.set(e.uri.toString(), o); } get(e) { @@ -61278,26 +61278,26 @@ let KT = class { const t = JSON.parse(e); for (const i in t) { const n = t[i], o = []; - for (const l of n.lines) - o.push({ range: new M(l, 1, l, 11) }); - const r = new UT(); - r.add({ lenses: o, dispose() { - } }, this._fakeProvider), this._cache.set(i, new n3(n.lineCount, r)); + for (const r of n.lines) + o.push({ range: new I(r, 1, r, 11) }); + const l = new pM(); + l.add({ lenses: o, dispose() { + } }, this._fakeProvider), this._cache.set(i, new CA(n.lineCount, l)); } } catch { } } }; -KT = Epe([ - Xpe(0, za) -], KT); +gM = Nge([ + wge(0, Pc) +], gM); it( - tQ, - KT, + Jj, + gM, 1 /* InstantiationType.Delayed */ ); -class Fpe { +class Tge { constructor(e, t, i) { this.afterColumn = 1073741824, this.afterLineNumber = e, this.heightInPx = t, this._onHeight = i, this.suppressMouseDown = !0, this.domNode = document.createElement("div"); } @@ -61308,27 +61308,27 @@ class Fpe { return this._lastHeight !== 0 && this.domNode.hasAttribute("monaco-visible-view-zone"); } } -const Sw = class Sw { +const My = class My { constructor(e, t) { - this.allowEditorOverflow = !1, this.suppressMouseDown = !0, this._commands = /* @__PURE__ */ new Map(), this._isEmpty = !0, this._editor = e, this._id = `codelens.widget-${Sw._idPool++}`, this.updatePosition(t), this._domNode = document.createElement("span"), this._domNode.className = "codelens-decoration"; + this.allowEditorOverflow = !1, this.suppressMouseDown = !0, this._commands = /* @__PURE__ */ new Map(), this._isEmpty = !0, this._editor = e, this._id = `codelens.widget-${My._idPool++}`, this.updatePosition(t), this._domNode = document.createElement("span"), this._domNode.className = "codelens-decoration"; } withCommands(e, t) { this._commands.clear(); const i = []; let n = !1; for (let o = 0; o < e.length; o++) { - const r = e[o]; - if (r && (n = !0, r.command)) { - const l = ih(r.command.title.trim()); - if (r.command.id) { - const a = `c${Sw._idPool++}`; - i.push(ce("a", { id: a, title: r.command.tooltip, role: "button" }, ...l)), this._commands.set(a, r.command); + const l = e[o]; + if (l && (n = !0, l.command)) { + const r = lh(l.command.title.trim()); + if (l.command.id) { + const c = `c${My._idPool++}`; + i.push(de("a", { id: c, title: l.command.tooltip, role: "button" }, ...r)), this._commands.set(c, l.command); } else - i.push(ce("span", { title: r.command.tooltip }, ...l)); - o + 1 < e.length && i.push(ce("span", void 0, " | ")); + i.push(de("span", { title: l.command.tooltip }, ...r)); + o + 1 < e.length && i.push(de("span", void 0, " | ")); } } - n ? (In(this._domNode, ...i), this._isEmpty && t && this._domNode.classList.add("fadein"), this._isEmpty = !1) : In(this._domNode, ce("span", void 0, "no commands")); + n ? (Rn(this._domNode, ...i), this._isEmpty && t && this._domNode.classList.add("fadein"), this._isEmpty = !1) : Rn(this._domNode, de("span", void 0, "no commands")); } getCommand(e) { return e.parentElement === this._domNode ? this._commands.get(e.id) : void 0; @@ -61353,9 +61353,9 @@ const Sw = class Sw { return this._widgetPosition || null; } }; -Sw._idPool = 0; -let QT = Sw; -class AW { +My._idPool = 0; +let ZM = My; +class ER { constructor() { this._removeDecorations = [], this._addDecorations = [], this._addDecorationsCallbacks = []; } @@ -61371,24 +61371,24 @@ class AW { this._addDecorationsCallbacks[i](t[i]); } } -const s3 = Re.register({ +const RA = Je.register({ collapseOnReplaceEdit: !0, description: "codelens" }); -class o3 { - constructor(e, t, i, n, o, r) { +class NA { + constructor(e, t, i, n, o, l) { this._isDisposed = !1, this._editor = t, this._data = e, this._decorationIds = []; - let l; - const a = []; - this._data.forEach((c, d) => { - c.symbol.command && a.push(c.symbol), i.addDecoration({ - range: c.symbol.range, - options: s3 - }, (h) => this._decorationIds[d] = h), l ? l = M.plusRange(l, c.symbol.range) : l = M.lift(c.symbol.range); - }), this._viewZone = new Fpe(l.startLineNumber - 1, o, r), this._viewZoneId = n.addZone(this._viewZone), a.length > 0 && (this._createContentWidgetIfNecessary(), this._contentWidget.withCommands(a, !1)); + let r; + const c = []; + this._data.forEach((d, a) => { + d.symbol.command && c.push(d.symbol), i.addDecoration({ + range: d.symbol.range, + options: RA + }, (h) => this._decorationIds[a] = h), r ? r = I.plusRange(r, d.symbol.range) : r = I.lift(d.symbol.range); + }), this._viewZone = new Tge(r.startLineNumber - 1, o, l), this._viewZoneId = n.addZone(this._viewZone), c.length > 0 && (this._createContentWidgetIfNecessary(), this._contentWidget.withCommands(c, !1)); } _createContentWidgetIfNecessary() { - this._contentWidget ? this._editor.layoutContentWidget(this._contentWidget) : (this._contentWidget = new QT(this._editor, this._viewZone.afterLineNumber + 1), this._editor.addContentWidget(this._contentWidget)); + this._contentWidget ? this._editor.layoutContentWidget(this._contentWidget) : (this._contentWidget = new ZM(this._editor, this._viewZone.afterLineNumber + 1), this._editor.addContentWidget(this._contentWidget)); } dispose(e, t) { this._decorationIds.forEach(e.removeDecoration, e), this._decorationIds = [], t == null || t.removeZone(this._viewZoneId), this._contentWidget && (this._editor.removeContentWidget(this._contentWidget), this._contentWidget = void 0), this._isDisposed = !0; @@ -61399,14 +61399,14 @@ class o3 { isValid() { return this._decorationIds.some((e, t) => { const i = this._editor.getModel().getDecorationRange(e), n = this._data[t].symbol; - return !!(i && M.isEmpty(n.range) === i.isEmpty()); + return !!(i && I.isEmpty(n.range) === i.isEmpty()); }); } updateCodeLensSymbols(e, t) { this._decorationIds.forEach(t.removeDecoration, t), this._decorationIds = [], this._data = e, this._data.forEach((i, n) => { t.addDecoration({ range: i.symbol.range, - options: s3 + options: RA }, (o) => this._decorationIds[n] = o); }); } @@ -61447,19 +61447,19 @@ class o3 { } } } -const s5 = $e("environmentService"); -var Ype = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +const RH = $e("environmentService"); +var Mge = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, r3 = function(s, e) { +}, wA = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const jo = $e("ILanguageFeatureDebounceService"); -var Mx; +const $o = $e("ILanguageFeatureDebounceService"); +var DL; (function(s) { const e = /* @__PURE__ */ new WeakMap(); let t = 0; @@ -61468,8 +61468,8 @@ var Mx; return o === void 0 && (o = ++t, e.set(n, o)), o; } s.of = i; -})(Mx || (Mx = {})); -class zpe { +})(DL || (DL = {})); +class Yge { constructor(e) { this._default = e; } @@ -61483,43 +61483,43 @@ class zpe { return this._default; } } -class Ppe { - constructor(e, t, i, n, o, r) { - this._logService = e, this._name = t, this._registry = i, this._default = n, this._min = o, this._max = r, this._cache = new id(50, 0.7); +class kge { + constructor(e, t, i, n, o, l) { + this._logService = e, this._name = t, this._registry = i, this._default = n, this._min = o, this._max = l, this._cache = new la(50, 0.7); } _key(e) { - return e.id + this._registry.all(e).reduce((t, i) => T_(Mx.of(i), t), 0); + return e.id + this._registry.all(e).reduce((t, i) => BS(DL.of(i), t), 0); } get(e) { const t = this._key(e), i = this._cache.get(t); - return i ? os(i.value, this._min, this._max) : this.default(); + return i ? rs(i.value, this._min, this._max) : this.default(); } update(e, t) { const i = this._key(e); let n = this._cache.get(i); - n || (n = new Fhe(6), this._cache.set(i, n)); - const o = os(n.update(t), this._min, this._max); - return N_(e.uri, "output") || this._logService.trace(`[DEBOUNCE: ${this._name}] for ${e.uri.toString()} is ${o}ms`), o; + n || (n = new Tue(6), this._cache.set(i, n)); + const o = rs(n.update(t), this._min, this._max); + return KS(e.uri, "output") || this._logService.trace(`[DEBOUNCE: ${this._name}] for ${e.uri.toString()} is ${o}ms`), o; } _overall() { - const e = new PK(); + const e = new IO(); for (const [, t] of this._cache) e.update(t.value); return e.value; } default() { const e = this._overall() | 0 || this._default; - return os(e, this._min, this._max); + return rs(e, this._min, this._max); } } -let jT = class { +let fM = class { constructor(e, t) { this._logService = e, this._data = /* @__PURE__ */ new Map(), this._isDev = t.isExtensionDevelopment || !t.isBuilt; } for(e, t, i) { - const n = (i == null ? void 0 : i.min) ?? 50, o = (i == null ? void 0 : i.max) ?? n ** 2, r = (i == null ? void 0 : i.key) ?? void 0, l = `${Mx.of(e)},${n}${r ? "," + r : ""}`; - let a = this._data.get(l); - return a || (this._isDev ? (this._logService.debug(`[DEBOUNCE: ${t}] is disabled in developed mode`), a = new zpe(n * 1.5)) : a = new Ppe( + const n = (i == null ? void 0 : i.min) ?? 50, o = (i == null ? void 0 : i.max) ?? n ** 2, l = (i == null ? void 0 : i.key) ?? void 0, r = `${DL.of(e)},${n}${l ? "," + l : ""}`; + let c = this._data.get(r); + return c || (this._isDev ? (this._logService.debug(`[DEBOUNCE: ${t}] is disabled in developed mode`), c = new Yge(n * 1.5)) : c = new kge( this._logService, t, e, @@ -61527,48 +61527,48 @@ let jT = class { // default is overall default or derived from min-value n, o - ), this._data.set(l, a)), a; + ), this._data.set(r, c)), c; } _overallAverage() { - const e = new PK(); + const e = new IO(); for (const t of this._data.values()) e.update(t.default()); return e.value; } }; -jT = Ype([ - r3(0, Xn), - r3(1, s5) -], jT); +fM = Mge([ + wA(0, Fn), + wA(1, RH) +], fM); it( - jo, - jT, + $o, + fM, 1 /* InstantiationType.Delayed */ ); -var Bpe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var vge = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, z0 = function(s, e) { +}, Q0 = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Uf; -let I1 = (Uf = class { - constructor(e, t, i, n, o, r) { - this._editor = e, this._languageFeaturesService = t, this._commandService = n, this._notificationService = o, this._codeLensCache = r, this._disposables = new U(), this._localToDispose = new U(), this._lenses = [], this._oldCodeLensModels = new U(), this._provideCodeLensDebounce = i.for(t.codeLensProvider, "CodeLensProvide", { min: 250 }), this._resolveCodeLensesDebounce = i.for(t.codeLensProvider, "CodeLensResolve", { min: 250, salt: "resolve" }), this._resolveCodeLensesScheduler = new Zt(() => this._resolveCodeLensesInViewport(), this._resolveCodeLensesDebounce.default()), this._disposables.add(this._editor.onDidChangeModel(() => this._onModelChange())), this._disposables.add(this._editor.onDidChangeModelLanguage(() => this._onModelChange())), this._disposables.add(this._editor.onDidChangeConfiguration((l) => { - (l.hasChanged( +}, eZ; +let DW = (eZ = class { + constructor(e, t, i, n, o, l) { + this._editor = e, this._languageFeaturesService = t, this._commandService = n, this._notificationService = o, this._codeLensCache = l, this._disposables = new _(), this._localToDispose = new _(), this._lenses = [], this._oldCodeLensModels = new _(), this._provideCodeLensDebounce = i.for(t.codeLensProvider, "CodeLensProvide", { min: 250 }), this._resolveCodeLensesDebounce = i.for(t.codeLensProvider, "CodeLensResolve", { min: 250, salt: "resolve" }), this._resolveCodeLensesScheduler = new St(() => this._resolveCodeLensesInViewport(), this._resolveCodeLensesDebounce.default()), this._disposables.add(this._editor.onDidChangeModel(() => this._onModelChange())), this._disposables.add(this._editor.onDidChangeModelLanguage(() => this._onModelChange())), this._disposables.add(this._editor.onDidChangeConfiguration((r) => { + (r.hasChanged( 50 /* EditorOption.fontInfo */ - ) || l.hasChanged( + ) || r.hasChanged( 19 /* EditorOption.codeLensFontSize */ - ) || l.hasChanged( + ) || r.hasChanged( 18 /* EditorOption.codeLensFontFamily */ - )) && this._updateLensStyle(), l.hasChanged( + )) && this._updateLensStyle(), r.hasChanged( 17 /* EditorOption.codeLens */ ) && this._onModelChange(); @@ -61606,9 +61606,9 @@ let I1 = (Uf = class { 50 /* EditorOption.fontInfo */ ), { style: o } = this._editor.getContainerDomNode(); - o.setProperty("--vscode-editorCodeLens-lineHeight", `${e}px`), o.setProperty("--vscode-editorCodeLens-fontSize", `${t}px`), o.setProperty("--vscode-editorCodeLens-fontFeatureSettings", n.fontFeatureSettings), i && (o.setProperty("--vscode-editorCodeLens-fontFamily", i), o.setProperty("--vscode-editorCodeLens-fontFamilyDefault", ps.fontFamily)), this._editor.changeViewZones((r) => { - for (const l of this._lenses) - l.updateHeight(e, r); + o.setProperty("--vscode-editorCodeLens-lineHeight", `${e}px`), o.setProperty("--vscode-editorCodeLens-fontSize", `${t}px`), o.setProperty("--vscode-editorCodeLens-fontFeatureSettings", n.fontFeatureSettings), i && (o.setProperty("--vscode-editorCodeLens-fontFamily", i), o.setProperty("--vscode-editorCodeLens-fontFamilyDefault", Zs.fontFamily)), this._editor.changeViewZones((l) => { + for (const r of this._lenses) + r.updateHeight(e, l); }); } _localDispose() { @@ -61625,7 +61625,7 @@ let I1 = (Uf = class { return; const t = this._codeLensCache.get(e); if (t && this._renderCodeLensSymbols(t), !this._languageFeaturesService.codeLensProvider.has(e)) { - t && _h(() => { + t && wh(() => { const n = this._codeLensCache.get(e); t === n && (this._codeLensCache.delete(e), this._onModelChange()); }, 30 * 1e3, this._localToDispose); @@ -61636,28 +61636,28 @@ let I1 = (Uf = class { const o = n.onDidChange(() => i.schedule()); this._localToDispose.add(o); } - const i = new Zt(() => { + const i = new St(() => { var o; const n = Date.now(); - (o = this._getCodeLensModelPromise) == null || o.cancel(), this._getCodeLensModelPromise = Ui((r) => eQ(this._languageFeaturesService.codeLensProvider, e, r)), this._getCodeLensModelPromise.then((r) => { - this._currentCodeLensModel && this._oldCodeLensModels.add(this._currentCodeLensModel), this._currentCodeLensModel = r, this._codeLensCache.put(e, r); - const l = this._provideCodeLensDebounce.update(e, Date.now() - n); - i.delay = l, this._renderCodeLensSymbols(r), this._resolveCodeLensesInViewportSoon(); - }, De); + (o = this._getCodeLensModelPromise) == null || o.cancel(), this._getCodeLensModelPromise = Qi((l) => vj(this._languageFeaturesService.codeLensProvider, e, l)), this._getCodeLensModelPromise.then((l) => { + this._currentCodeLensModel && this._oldCodeLensModels.add(this._currentCodeLensModel), this._currentCodeLensModel = l, this._codeLensCache.put(e, l); + const r = this._provideCodeLensDebounce.update(e, Date.now() - n); + i.delay = r, this._renderCodeLensSymbols(l), this._resolveCodeLensesInViewportSoon(); + }, Me); }, this._provideCodeLensDebounce.get(e)); - this._localToDispose.add(i), this._localToDispose.add(Ce(() => this._resolveCodeLensesScheduler.cancel())), this._localToDispose.add(this._editor.onDidChangeModelContent(() => { + this._localToDispose.add(i), this._localToDispose.add(We(() => this._resolveCodeLensesScheduler.cancel())), this._localToDispose.add(this._editor.onDidChangeModelContent(() => { var n; this._editor.changeDecorations((o) => { - this._editor.changeViewZones((r) => { - const l = []; - let a = -1; - this._lenses.forEach((d) => { - !d.isValid() || a === d.getLineNumber() ? l.push(d) : (d.update(r), a = d.getLineNumber()); + this._editor.changeViewZones((l) => { + const r = []; + let c = -1; + this._lenses.forEach((a) => { + !a.isValid() || c === a.getLineNumber() ? r.push(a) : (a.update(l), c = a.getLineNumber()); }); - const c = new AW(); - l.forEach((d) => { - d.dispose(c, r), this._lenses.splice(this._lenses.indexOf(d), 1); - }), c.commit(o); + const d = new ER(); + r.forEach((a) => { + a.dispose(d, l), this._lenses.splice(this._lenses.indexOf(a), 1); + }), d.commit(o); }); }), i.schedule(), this._resolveCodeLensesScheduler.cancel(), (n = this._resolveCodeLensesPromise) == null || n.cancel(), this._resolveCodeLensesPromise = void 0; })), this._localToDispose.add(this._editor.onDidFocusEditorText(() => { @@ -61668,12 +61668,12 @@ let I1 = (Uf = class { n.scrollTopChanged && this._lenses.length > 0 && this._resolveCodeLensesInViewportSoon(); })), this._localToDispose.add(this._editor.onDidLayoutChange(() => { this._resolveCodeLensesInViewportSoon(); - })), this._localToDispose.add(Ce(() => { + })), this._localToDispose.add(We(() => { if (this._editor.getModel()) { - const n = Vl.capture(this._editor); + const n = Hr.capture(this._editor); this._editor.changeDecorations((o) => { - this._editor.changeViewZones((r) => { - this._disposeAllLenses(o, r); + this._editor.changeViewZones((l) => { + this._disposeAllLenses(o, l); }); }), n.restore(this._editor); } else @@ -61683,17 +61683,17 @@ let I1 = (Uf = class { return; let o = n.target.element; if ((o == null ? void 0 : o.tagName) === "SPAN" && (o = o.parentElement), (o == null ? void 0 : o.tagName) === "A") - for (const r of this._lenses) { - const l = r.getCommand(o); - if (l) { - this._commandService.executeCommand(l.id, ...l.arguments || []).catch((a) => this._notificationService.error(a)); + for (const l of this._lenses) { + const r = l.getCommand(o); + if (r) { + this._commandService.executeCommand(r.id, ...r.arguments || []).catch((c) => this._notificationService.error(c)); break; } } })), i.schedule(); } _disposeAllLenses(e, t) { - const i = new AW(); + const i = new ER(); for (const n of this._lenses) n.dispose(i, t); e && i.commit(e), this._lenses.length = 0; @@ -61703,26 +61703,26 @@ let I1 = (Uf = class { return; const t = this._editor.getModel().getLineCount(), i = []; let n; - for (const l of e.lenses) { - const a = l.symbol.range.startLineNumber; - a < 1 || a > t || (n && n[n.length - 1].symbol.range.startLineNumber === a ? n.push(l) : (n = [l], i.push(n))); + for (const r of e.lenses) { + const c = r.symbol.range.startLineNumber; + c < 1 || c > t || (n && n[n.length - 1].symbol.range.startLineNumber === c ? n.push(r) : (n = [r], i.push(n))); } if (!i.length && !this._lenses.length) return; - const o = Vl.capture(this._editor), r = this._getLayoutInfo(); - this._editor.changeDecorations((l) => { - this._editor.changeViewZones((a) => { - const c = new AW(); - let d = 0, h = 0; - for (; h < i.length && d < this._lenses.length; ) { - const u = i[h][0].symbol.range.startLineNumber, g = this._lenses[d].getLineNumber(); - g < u ? (this._lenses[d].dispose(c, a), this._lenses.splice(d, 1)) : g === u ? (this._lenses[d].updateCodeLensSymbols(i[h], c), h++, d++) : (this._lenses.splice(d, 0, new o3(i[h], this._editor, c, a, r.codeLensHeight, () => this._resolveCodeLensesInViewportSoon())), d++, h++); + const o = Hr.capture(this._editor), l = this._getLayoutInfo(); + this._editor.changeDecorations((r) => { + this._editor.changeViewZones((c) => { + const d = new ER(); + let a = 0, h = 0; + for (; h < i.length && a < this._lenses.length; ) { + const u = i[h][0].symbol.range.startLineNumber, m = this._lenses[a].getLineNumber(); + m < u ? (this._lenses[a].dispose(d, c), this._lenses.splice(a, 1)) : m === u ? (this._lenses[a].updateCodeLensSymbols(i[h], d), h++, a++) : (this._lenses.splice(a, 0, new NA(i[h], this._editor, d, c, l.codeLensHeight, () => this._resolveCodeLensesInViewportSoon())), a++, h++); } - for (; d < this._lenses.length; ) - this._lenses[d].dispose(c, a), this._lenses.splice(d, 1); + for (; a < this._lenses.length; ) + this._lenses[a].dispose(d, c), this._lenses.splice(a, 1); for (; h < i.length; ) - this._lenses.push(new o3(i[h], this._editor, c, a, r.codeLensHeight, () => this._resolveCodeLensesInViewportSoon())), h++; - c.commit(l); + this._lenses.push(new NA(i[h], this._editor, d, c, l.codeLensHeight, () => this._resolveCodeLensesInViewportSoon())), h++; + d.commit(r); }); }), o.restore(this._editor); } @@ -61730,50 +61730,50 @@ let I1 = (Uf = class { this._editor.getModel() && this._resolveCodeLensesScheduler.schedule(); } _resolveCodeLensesInViewport() { - var r; - (r = this._resolveCodeLensesPromise) == null || r.cancel(), this._resolveCodeLensesPromise = void 0; + var l; + (l = this._resolveCodeLensesPromise) == null || l.cancel(), this._resolveCodeLensesPromise = void 0; const e = this._editor.getModel(); if (!e) return; const t = [], i = []; - if (this._lenses.forEach((l) => { - const a = l.computeIfNecessary(e); - a && (t.push(a), i.push(l)); + if (this._lenses.forEach((r) => { + const c = r.computeIfNecessary(e); + c && (t.push(c), i.push(r)); }), t.length === 0) return; - const n = Date.now(), o = Ui((l) => { - const a = t.map((c, d) => { - const h = new Array(c.length), u = c.map((g, m) => !g.symbol.command && typeof g.provider.resolveCodeLens == "function" ? Promise.resolve(g.provider.resolveCodeLens(e, g.symbol, l)).then((f) => { - h[m] = f; - }, wi) : (h[m] = g.symbol, Promise.resolve(void 0))); + const n = Date.now(), o = Qi((r) => { + const c = t.map((d, a) => { + const h = new Array(d.length), u = d.map((m, b) => !m.symbol.command && typeof m.provider.resolveCodeLens == "function" ? Promise.resolve(m.provider.resolveCodeLens(e, m.symbol, r)).then((g) => { + h[b] = g; + }, Wi) : (h[b] = m.symbol, Promise.resolve(void 0))); return Promise.all(u).then(() => { - !l.isCancellationRequested && !i[d].isDisposed() && i[d].updateCommands(h); + !r.isCancellationRequested && !i[a].isDisposed() && i[a].updateCommands(h); }); }); - return Promise.all(a); + return Promise.all(c); }); this._resolveCodeLensesPromise = o, this._resolveCodeLensesPromise.then(() => { - const l = this._resolveCodeLensesDebounce.update(e, Date.now() - n); - this._resolveCodeLensesScheduler.delay = l, this._currentCodeLensModel && this._codeLensCache.put(e, this._currentCodeLensModel), this._oldCodeLensModels.clear(), o === this._resolveCodeLensesPromise && (this._resolveCodeLensesPromise = void 0); - }, (l) => { - De(l), o === this._resolveCodeLensesPromise && (this._resolveCodeLensesPromise = void 0); + const r = this._resolveCodeLensesDebounce.update(e, Date.now() - n); + this._resolveCodeLensesScheduler.delay = r, this._currentCodeLensModel && this._codeLensCache.put(e, this._currentCodeLensModel), this._oldCodeLensModels.clear(), o === this._resolveCodeLensesPromise && (this._resolveCodeLensesPromise = void 0); + }, (r) => { + Me(r), o === this._resolveCodeLensesPromise && (this._resolveCodeLensesPromise = void 0); }); } async getModel() { var e; return await this._getCodeLensModelPromise, await this._resolveCodeLensesPromise, (e = this._currentCodeLensModel) != null && e.isDisposed ? void 0 : this._currentCodeLensModel; } -}, Uf.ID = "css.editor.codeLens", Uf); -I1 = Bpe([ - z0(1, ge), - z0(2, jo), - z0(3, Qt), - z0(4, Vi), - z0(5, tQ) -], I1); -gt( - I1.ID, - I1, +}, eZ.ID = "css.editor.codeLens", eZ); +DW = vge([ + Q0(1, me), + Q0(2, $o), + Q0(3, Ot), + Q0(4, vi), + Q0(5, Jj) +], DW); +mt( + DW.ID, + DW, 1 /* EditorContributionInstantiation.AfterFirstRender */ ); @@ -61781,7 +61781,7 @@ ee(class extends he { constructor() { super({ id: "codelens.showLensesInCurrentLine", - precondition: I.hasCodeLensProvider, + precondition: C.hasCodeLensProvider, label: p("showLensOnLine", "Show CodeLens Commands For Current Line"), alias: "Show CodeLens Commands For Current Line" }); @@ -61789,35 +61789,35 @@ ee(class extends he { async run(e, t) { if (!t.hasModel()) return; - const i = e.get(ld), n = e.get(Qt), o = e.get(Vi), r = t.getSelection().positionLineNumber, l = t.getContribution(I1.ID); - if (!l) + const i = e.get(ha), n = e.get(Ot), o = e.get(vi), l = t.getSelection().positionLineNumber, r = t.getContribution(DW.ID); + if (!r) return; - const a = await l.getModel(); - if (!a) + const c = await r.getModel(); + if (!c) return; - const c = []; - for (const u of a.lenses) - u.symbol.command && u.symbol.range.startLineNumber === r && c.push({ + const d = []; + for (const u of c.lenses) + u.symbol.command && u.symbol.range.startLineNumber === l && d.push({ label: u.symbol.command.title, command: u.symbol.command }); - if (c.length === 0) + if (d.length === 0) return; - const d = await i.pick(c, { + const a = await i.pick(d, { canPickMany: !1, placeHolder: p("placeHolder", "Select a command") }); - if (!d) + if (!a) return; - let h = d.command; - if (a.isDisposed) { - const u = await l.getModel(), g = u == null ? void 0 : u.lenses.find((m) => { - var f; - return m.symbol.range.startLineNumber === r && ((f = m.symbol.command) == null ? void 0 : f.title) === h.title; + let h = a.command; + if (c.isDisposed) { + const u = await r.getModel(), m = u == null ? void 0 : u.lenses.find((b) => { + var g; + return b.symbol.range.startLineNumber === l && ((g = b.symbol.command) == null ? void 0 : g.title) === h.title; }); - if (!g || !g.symbol.command) + if (!m || !m.symbol.command) return; - h = g.symbol.command; + h = m.symbol.command; } try { await n.executeCommand(h.id, ...h.arguments || []); @@ -61826,24 +61826,24 @@ ee(class extends he { } } }); -const iQ = []; -function b0(s) { - iQ.push(s); +const Hj = []; +function V0(s) { + Hj.push(s); } -function Ope() { - return iQ.slice(0); +function Jge() { + return Hj.slice(0); } -var nQ = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Ej = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, qT = function(s, e) { +}, yM = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let N1 = class { +let FW = class { constructor(e) { this._editorWorkerService = e; } @@ -61851,128 +61851,128 @@ let N1 = class { return this._editorWorkerService.computeDefaultDocumentColors(e.uri); } provideColorPresentations(e, t, i) { - const n = t.range, o = t.color, r = o.alpha, l = new K(new lt(Math.round(255 * o.red), Math.round(255 * o.green), Math.round(255 * o.blue), r)), a = r ? K.Format.CSS.formatRGB(l) : K.Format.CSS.formatRGBA(l), c = r ? K.Format.CSS.formatHSL(l) : K.Format.CSS.formatHSLA(l), d = r ? K.Format.CSS.formatHex(l) : K.Format.CSS.formatHexA(l), h = []; - return h.push({ label: a, textEdit: { range: n, text: a } }), h.push({ label: c, textEdit: { range: n, text: c } }), h.push({ label: d, textEdit: { range: n, text: d } }), h; + const n = t.range, o = t.color, l = o.alpha, r = new Q(new rt(Math.round(255 * o.red), Math.round(255 * o.green), Math.round(255 * o.blue), l)), c = l ? Q.Format.CSS.formatRGB(r) : Q.Format.CSS.formatRGBA(r), d = l ? Q.Format.CSS.formatHSL(r) : Q.Format.CSS.formatHSLA(r), a = l ? Q.Format.CSS.formatHex(r) : Q.Format.CSS.formatHexA(r), h = []; + return h.push({ label: c, textEdit: { range: n, text: c } }), h.push({ label: d, textEdit: { range: n, text: d } }), h.push({ label: a, textEdit: { range: n, text: a } }), h; } }; -N1 = nQ([ - qT(0, Ps) -], N1); -let $T = class extends R { +FW = Ej([ + yM(0, Us) +], FW); +let WM = class extends J { constructor(e, t) { - super(), this._register(e.colorProvider.register("*", new N1(t))); + super(), this._register(e.colorProvider.register("*", new FW(t))); } }; -$T = nQ([ - qT(0, ge), - qT(1, Ps) -], $T); -b0($T); -async function sQ(s, e, t, i = !0) { - return o5(new Hpe(), s, e, t, i); -} -function oQ(s, e, t, i) { +WM = Ej([ + yM(0, me), + yM(1, Us) +], WM); +V0(WM); +async function Dj(s, e, t, i = !0) { + return NH(new Hge(), s, e, t, i); +} +function Fj(s, e, t, i) { return Promise.resolve(t.provideColorPresentations(s, e, i)); } -class Hpe { +class Hge { constructor() { } async compute(e, t, i, n) { const o = await e.provideDocumentColors(t, i); if (Array.isArray(o)) - for (const r of o) - n.push({ colorInfo: r, provider: e }); + for (const l of o) + n.push({ colorInfo: l, provider: e }); return Array.isArray(o); } } -class Jpe { +class Ege { constructor() { } async compute(e, t, i, n) { const o = await e.provideDocumentColors(t, i); if (Array.isArray(o)) - for (const r of o) - n.push({ range: r.range, color: [r.color.red, r.color.green, r.color.blue, r.color.alpha] }); + for (const l of o) + n.push({ range: l.range, color: [l.color.red, l.color.green, l.color.blue, l.color.alpha] }); return Array.isArray(o); } } -class Upe { +class Dge { constructor(e) { this.colorInfo = e; } async compute(e, t, i, n) { - const o = await e.provideColorPresentations(t, this.colorInfo, Ye.None); + const o = await e.provideColorPresentations(t, this.colorInfo, Fe.None); return Array.isArray(o) && n.push(...o), Array.isArray(o); } } -async function o5(s, e, t, i, n) { - let o = !1, r; - const l = [], a = e.ordered(t); - for (let c = a.length - 1; c >= 0; c--) { - const d = a[c]; - if (d instanceof N1) - r = d; +async function NH(s, e, t, i, n) { + let o = !1, l; + const r = [], c = e.ordered(t); + for (let d = c.length - 1; d >= 0; d--) { + const a = c[d]; + if (a instanceof FW) + l = a; else try { - await s.compute(d, t, i, l) && (o = !0); + await s.compute(a, t, i, r) && (o = !0); } catch (h) { - wi(h); + Wi(h); } } - return o ? l : r && n ? (await s.compute(r, t, i, l), l) : []; + return o ? r : l && n ? (await s.compute(l, t, i, r), r) : []; } -function rQ(s, e) { - const { colorProvider: t } = s.get(ge), i = s.get(Pt).getModel(e); +function zj(s, e) { + const { colorProvider: t } = s.get(me), i = s.get(At).getModel(e); if (!i) - throw hr(); - const n = s.get(Ke).getValue("editor.defaultColorDecorators", { resource: e }); + throw bl(); + const n = s.get(Qe).getValue("editor.defaultColorDecorators", { resource: e }); return { model: i, colorProviderRegistry: t, isDefaultColorDecoratorsEnabled: n }; } st.registerCommand("_executeDocumentColorProvider", function(s, ...e) { const [t] = e; - if (!(t instanceof Le)) - throw hr(); - const { model: i, colorProviderRegistry: n, isDefaultColorDecoratorsEnabled: o } = rQ(s, t); - return o5(new Jpe(), n, i, Ye.None, o); + if (!(t instanceof Xe)) + throw bl(); + const { model: i, colorProviderRegistry: n, isDefaultColorDecoratorsEnabled: o } = zj(s, t); + return NH(new Ege(), n, i, Fe.None, o); }); st.registerCommand("_executeColorPresentationProvider", function(s, ...e) { const [t, i] = e, { uri: n, range: o } = i; - if (!(n instanceof Le) || !Array.isArray(t) || t.length !== 4 || !M.isIRange(o)) - throw hr(); - const { model: r, colorProviderRegistry: l, isDefaultColorDecoratorsEnabled: a } = rQ(s, n), [c, d, h, u] = t; - return o5(new Upe({ range: o, color: { red: c, green: d, blue: h, alpha: u } }), l, r, Ye.None, a); + if (!(n instanceof Xe) || !Array.isArray(t) || t.length !== 4 || !I.isIRange(o)) + throw bl(); + const { model: l, colorProviderRegistry: r, isDefaultColorDecoratorsEnabled: c } = zj(s, n), [d, a, h, u] = t; + return NH(new Dge({ range: o, color: { red: d, green: a, blue: h, alpha: u } }), r, l, Fe.None, c); }); -var Kpe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Fge = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, xW = function(s, e) { +}, DR = function(s, e) { return function(t, i) { e(t, i, s); }; -}, eD; -const lQ = /* @__PURE__ */ Object.create({}); -var dh; -let Zb = (dh = class extends R { +}, GM; +const Aj = /* @__PURE__ */ Object.create({}); +var bh; +let TZ = (bh = class extends J { // ms constructor(e, t, i, n) { - super(), this._editor = e, this._configurationService = t, this._languageFeaturesService = i, this._localToDispose = this._register(new U()), this._decorationsIds = [], this._colorDatas = /* @__PURE__ */ new Map(), this._colorDecoratorIds = this._editor.createDecorationsCollection(), this._ruleFactory = new _A(this._editor), this._decoratorLimitReporter = new Qpe(), this._colorDecorationClassRefs = this._register(new U()), this._debounceInformation = n.for(i.colorProvider, "Document Colors", { min: eD.RECOMPUTE_TIME }), this._register(e.onDidChangeModel(() => { + super(), this._editor = e, this._configurationService = t, this._languageFeaturesService = i, this._localToDispose = this._register(new _()), this._decorationsIds = [], this._colorDatas = /* @__PURE__ */ new Map(), this._colorDecoratorIds = this._editor.createDecorationsCollection(), this._ruleFactory = new zV(this._editor), this._decoratorLimitReporter = new zge(), this._colorDecorationClassRefs = this._register(new _()), this._debounceInformation = n.for(i.colorProvider, "Document Colors", { min: GM.RECOMPUTE_TIME }), this._register(e.onDidChangeModel(() => { this._isColorDecoratorsEnabled = this.isEnabled(), this.updateColors(); })), this._register(e.onDidChangeModelLanguage(() => this.updateColors())), this._register(i.colorProvider.onDidChange(() => this.updateColors())), this._register(e.onDidChangeConfiguration((o) => { - const r = this._isColorDecoratorsEnabled; + const l = this._isColorDecoratorsEnabled; this._isColorDecoratorsEnabled = this.isEnabled(), this._isDefaultColorDecoratorsEnabled = this._editor.getOption( 148 /* EditorOption.defaultColorDecorators */ ); - const l = r !== this._isColorDecoratorsEnabled || o.hasChanged( + const r = l !== this._isColorDecoratorsEnabled || o.hasChanged( 21 /* EditorOption.colorDecoratorsLimit */ - ), a = o.hasChanged( + ), c = o.hasChanged( 148 /* EditorOption.defaultColorDecorators */ ); - (l || a) && (this._isColorDecoratorsEnabled ? this.updateColors() : this.removeAllDecorations()); + (r || c) && (this._isColorDecoratorsEnabled ? this.updateColors() : this.removeAllDecorations()); })), this._timeoutTimer = null, this._computePromise = null, this._isColorDecoratorsEnabled = this.isEnabled(), this._isDefaultColorDecoratorsEnabled = this._editor.getOption( 148 /* EditorOption.defaultColorDecorators */ @@ -62004,24 +62004,24 @@ let Zb = (dh = class extends R { return; const e = this._editor.getModel(); !e || !this._languageFeaturesService.colorProvider.has(e) || (this._localToDispose.add(this._editor.onDidChangeModelContent(() => { - this._timeoutTimer || (this._timeoutTimer = new qr(), this._timeoutTimer.cancelAndSet(() => { + this._timeoutTimer || (this._timeoutTimer = new tr(), this._timeoutTimer.cancelAndSet(() => { this._timeoutTimer = null, this.beginCompute(); }, this._debounceInformation.get(e))); })), this.beginCompute()); } async beginCompute() { - this._computePromise = Ui(async (e) => { + this._computePromise = Qi(async (e) => { const t = this._editor.getModel(); if (!t) return []; - const i = new on(!1), n = await sQ(this._languageFeaturesService.colorProvider, t, e, this._isDefaultColorDecoratorsEnabled); + const i = new ln(!1), n = await Dj(this._languageFeaturesService.colorProvider, t, e, this._isDefaultColorDecoratorsEnabled); return this._debounceInformation.update(t, i.elapsed()), n; }); try { const e = await this._computePromise; this.updateDecorations(e), this.updateColorDecorators(e), this._computePromise = null; } catch (e) { - De(e); + Me(e); } } stop() { @@ -62035,7 +62035,7 @@ let Zb = (dh = class extends R { endLineNumber: i.colorInfo.range.endLineNumber, endColumn: i.colorInfo.range.endColumn }, - options: Re.EMPTY + options: Je.EMPTY })); this._editor.changeDecorations((i) => { this._decorationsIds = i.deltaDecorations(this._decorationsIds, t), this._colorDatas = /* @__PURE__ */ new Map(), this._decorationsIds.forEach((n, o) => this._colorDatas.set(n, e[o])); @@ -62048,7 +62048,7 @@ let Zb = (dh = class extends R { /* EditorOption.colorDecoratorsLimit */ ); for (let o = 0; o < e.length && t.length < i; o++) { - const { red: r, green: l, blue: a, alpha: c } = e[o].colorInfo.color, d = new lt(Math.round(r * 255), Math.round(l * 255), Math.round(a * 255), c), h = `rgba(${d.r}, ${d.g}, ${d.b}, ${d.a})`, u = this._colorDecorationClassRefs.add(this._ruleFactory.createClassNameRef({ + const { red: l, green: r, blue: c, alpha: d } = e[o].colorInfo.color, a = new rt(Math.round(l * 255), Math.round(r * 255), Math.round(c * 255), d), h = `rgba(${a.r}, ${a.g}, ${a.b}, ${a.a})`, u = this._colorDecorationClassRefs.add(this._ruleFactory.createClassNameRef({ backgroundColor: h })); t.push({ @@ -62061,10 +62061,10 @@ let Zb = (dh = class extends R { options: { description: "colorDetector", before: { - content: PH, + content: IB, inlineClassName: `${u.className} colorpicker-color-decoration`, inlineClassNameAffectsLetterSpacing: !0, - attachedData: lQ + attachedData: Aj } } }); @@ -62079,19 +62079,19 @@ let Zb = (dh = class extends R { const t = this._editor.getModel(); if (!t) return null; - const i = t.getDecorationsInRange(M.fromPositions(e, e)).filter((n) => this._colorDatas.has(n.id)); + const i = t.getDecorationsInRange(I.fromPositions(e, e)).filter((n) => this._colorDatas.has(n.id)); return i.length === 0 ? null : this._colorDatas.get(i[0].id); } isColorDecoration(e) { return this._colorDecoratorIds.has(e); } -}, eD = dh, dh.ID = "editor.contrib.colorDetector", dh.RECOMPUTE_TIME = 1e3, dh); -Zb = eD = Kpe([ - xW(1, Ke), - xW(2, ge), - xW(3, jo) -], Zb); -class Qpe { +}, GM = bh, bh.ID = "editor.contrib.colorDetector", bh.RECOMPUTE_TIME = 1e3, bh); +TZ = GM = Fge([ + DR(1, Qe), + DR(2, me), + DR(3, $o) +], TZ); +class zge { constructor() { this._onDidChange = new k(), this._computed = 0, this._limited = !1; } @@ -62099,13 +62099,13 @@ class Qpe { (e !== this._computed || t !== this._limited) && (this._computed = e, this._limited = t, this._onDidChange.fire()); } } -gt( - Zb.ID, - Zb, +mt( + TZ.ID, + TZ, 1 /* EditorContributionInstantiation.AfterFirstRender */ ); -class jpe { +class Age { get color() { return this._color; } @@ -62148,16 +62148,16 @@ class jpe { this._onColorFlushed.fire(this._color); } } -const ko = ce; -class qpe extends R { +const Jo = de; +class Kge extends J { constructor(e, t, i, n = !1) { - super(), this.model = t, this.showingStandaloneColorPicker = n, this._closeButton = null, this._domNode = ko(".colorpicker-header"), Q(e, this._domNode), this._pickedColorNode = Q(this._domNode, ko(".picked-color")), Q(this._pickedColorNode, ko("span.codicon.codicon-color-mode")), this._pickedColorPresentation = Q(this._pickedColorNode, document.createElement("span")), this._pickedColorPresentation.classList.add("picked-color-presentation"); + super(), this.model = t, this.showingStandaloneColorPicker = n, this._closeButton = null, this._domNode = Jo(".colorpicker-header"), O(e, this._domNode), this._pickedColorNode = O(this._domNode, Jo(".picked-color")), O(this._pickedColorNode, Jo("span.codicon.codicon-color-mode")), this._pickedColorPresentation = O(this._pickedColorNode, document.createElement("span")), this._pickedColorPresentation.classList.add("picked-color-presentation"); const o = p("clickToToggleColorOptions", "Click to toggle color options (rgb/hsl/hex)"); - this._pickedColorNode.setAttribute("title", o), this._originalColorNode = Q(this._domNode, ko(".original-color")), this._originalColorNode.style.backgroundColor = K.Format.CSS.format(this.model.originalColor) || "", this.backgroundColor = i.getColorTheme().getColor(ZA) || K.white, this._register(i.onDidColorThemeChange((r) => { - this.backgroundColor = r.getColor(ZA) || K.white; + this._pickedColorNode.setAttribute("title", o), this._originalColorNode = O(this._domNode, Jo(".original-color")), this._originalColorNode.style.backgroundColor = Q.Format.CSS.format(this.model.originalColor) || "", this.backgroundColor = i.getColorTheme().getColor(FV) || Q.white, this._register(i.onDidColorThemeChange((l) => { + this.backgroundColor = l.getColor(FV) || Q.white; })), this._register(z(this._pickedColorNode, ie.CLICK, () => this.model.selectNextColorPresentation())), this._register(z(this._originalColorNode, ie.CLICK, () => { this.model.color = this.model.originalColor, this.model.flushColor(); - })), this._register(t.onDidChangeColor(this.onDidChangeColor, this)), this._register(t.onDidChangePresentation(this.onDidChangePresentation, this)), this._pickedColorNode.style.backgroundColor = K.Format.CSS.format(t.color) || "", this._pickedColorNode.classList.toggle("light", t.color.rgba.a < 0.5 ? this.backgroundColor.isLighter() : t.color.isLighter()), this.onDidChangeColor(this.model.color), this.showingStandaloneColorPicker && (this._domNode.classList.add("standalone-colorpicker"), this._closeButton = this._register(new $pe(this._domNode))); + })), this._register(t.onDidChangeColor(this.onDidChangeColor, this)), this._register(t.onDidChangePresentation(this.onDidChangePresentation, this)), this._pickedColorNode.style.backgroundColor = Q.Format.CSS.format(t.color) || "", this._pickedColorNode.classList.toggle("light", t.color.rgba.a < 0.5 ? this.backgroundColor.isLighter() : t.color.isLighter()), this.onDidChangeColor(this.model.color), this.showingStandaloneColorPicker && (this._domNode.classList.add("standalone-colorpicker"), this._closeButton = this._register(new Uge(this._domNode))); } get closeButton() { return this._closeButton; @@ -62169,39 +62169,39 @@ class qpe extends R { return this._originalColorNode; } onDidChangeColor(e) { - this._pickedColorNode.style.backgroundColor = K.Format.CSS.format(e) || "", this._pickedColorNode.classList.toggle("light", e.rgba.a < 0.5 ? this.backgroundColor.isLighter() : e.isLighter()), this.onDidChangePresentation(); + this._pickedColorNode.style.backgroundColor = Q.Format.CSS.format(e) || "", this._pickedColorNode.classList.toggle("light", e.rgba.a < 0.5 ? this.backgroundColor.isLighter() : e.isLighter()), this.onDidChangePresentation(); } onDidChangePresentation() { this._pickedColorPresentation.textContent = this.model.presentation ? this.model.presentation.label : ""; } } -class $pe extends R { +class Uge extends J { constructor(e) { - super(), this._onClicked = this._register(new k()), this.onClicked = this._onClicked.event, this._button = document.createElement("div"), this._button.classList.add("close-button"), Q(e, this._button); + super(), this._onClicked = this._register(new k()), this.onClicked = this._onClicked.event, this._button = document.createElement("div"), this._button.classList.add("close-button"), O(e, this._button); const t = document.createElement("div"); - t.classList.add("close-button-inner-div"), Q(this._button, t), Q(t, ko(".button" + Ze.asCSSSelector(Bt("color-picker-close", te.close, p("closeIcon", "Icon to close the color picker"))))).classList.add("close-icon"), this._register(z(this._button, ie.CLICK, () => { + t.classList.add("close-button-inner-div"), O(this._button, t), O(t, Jo(".button" + Se.asCSSSelector(Kt("color-picker-close", te.close, p("closeIcon", "Icon to close the color picker"))))).classList.add("close-icon"), this._register(z(this._button, ie.CLICK, () => { this._onClicked.fire(); })); } } -class efe extends R { +class Pge extends J { constructor(e, t, i, n = !1) { - super(), this.model = t, this.pixelRatio = i, this._insertButton = null, this._domNode = ko(".colorpicker-body"), Q(e, this._domNode), this._saturationBox = new tfe(this._domNode, this.model, this.pixelRatio), this._register(this._saturationBox), this._register(this._saturationBox.onDidChange(this.onDidSaturationValueChange, this)), this._register(this._saturationBox.onColorFlushed(this.flushColor, this)), this._opacityStrip = new ife(this._domNode, this.model, n), this._register(this._opacityStrip), this._register(this._opacityStrip.onDidChange(this.onDidOpacityChange, this)), this._register(this._opacityStrip.onColorFlushed(this.flushColor, this)), this._hueStrip = new nfe(this._domNode, this.model, n), this._register(this._hueStrip), this._register(this._hueStrip.onDidChange(this.onDidHueChange, this)), this._register(this._hueStrip.onColorFlushed(this.flushColor, this)), n && (this._insertButton = this._register(new sfe(this._domNode)), this._domNode.classList.add("standalone-colorpicker")); + super(), this.model = t, this.pixelRatio = i, this._insertButton = null, this._domNode = Jo(".colorpicker-body"), O(e, this._domNode), this._saturationBox = new Bge(this._domNode, this.model, this.pixelRatio), this._register(this._saturationBox), this._register(this._saturationBox.onDidChange(this.onDidSaturationValueChange, this)), this._register(this._saturationBox.onColorFlushed(this.flushColor, this)), this._opacityStrip = new _ge(this._domNode, this.model, n), this._register(this._opacityStrip), this._register(this._opacityStrip.onDidChange(this.onDidOpacityChange, this)), this._register(this._opacityStrip.onColorFlushed(this.flushColor, this)), this._hueStrip = new Qge(this._domNode, this.model, n), this._register(this._hueStrip), this._register(this._hueStrip.onDidChange(this.onDidHueChange, this)), this._register(this._hueStrip.onColorFlushed(this.flushColor, this)), n && (this._insertButton = this._register(new Oge(this._domNode)), this._domNode.classList.add("standalone-colorpicker")); } flushColor() { this.model.flushColor(); } onDidSaturationValueChange({ s: e, v: t }) { const i = this.model.color.hsva; - this.model.color = new K(new La(i.h, e, t, i.a)); + this.model.color = new Q(new Sc(i.h, e, t, i.a)); } onDidOpacityChange(e) { const t = this.model.color.hsva; - this.model.color = new K(new La(t.h, t.s, t.v, e)); + this.model.color = new Q(new Sc(t.h, t.s, t.v, e)); } onDidHueChange(e) { const t = this.model.color.hsva, i = (1 - e) * 360; - this.model.color = new K(new La(i === 360 ? 0 : i, t.s, t.v, t.a)); + this.model.color = new Q(new Sc(i === 360 ? 0 : i, t.s, t.v, t.a)); } get domNode() { return this._domNode; @@ -62216,9 +62216,9 @@ class efe extends R { this._saturationBox.layout(), this._opacityStrip.layout(), this._hueStrip.layout(); } } -class tfe extends R { +class Bge extends J { constructor(e, t, i) { - super(), this.model = t, this.pixelRatio = i, this._onDidChange = new k(), this.onDidChange = this._onDidChange.event, this._onColorFlushed = new k(), this.onColorFlushed = this._onColorFlushed.event, this._domNode = ko(".saturation-wrap"), Q(e, this._domNode), this._canvas = document.createElement("canvas"), this._canvas.className = "saturation-box", Q(this._domNode, this._canvas), this.selection = ko(".saturation-selection"), Q(this._domNode, this.selection), this.layout(), this._register(z(this._domNode, ie.POINTER_DOWN, (n) => this.onPointerDown(n))), this._register(this.model.onDidChangeColor(this.onDidChangeColor, this)), this.monitor = null; + super(), this.model = t, this.pixelRatio = i, this._onDidChange = new k(), this.onDidChange = this._onDidChange.event, this._onColorFlushed = new k(), this.onColorFlushed = this._onColorFlushed.event, this._domNode = Jo(".saturation-wrap"), O(e, this._domNode), this._canvas = document.createElement("canvas"), this._canvas.className = "saturation-box", O(this._domNode, this._canvas), this.selection = Jo(".saturation-selection"), O(this._domNode, this.selection), this.layout(), this._register(z(this._domNode, ie.POINTER_DOWN, (n) => this.onPointerDown(n))), this._register(this.model.onDidChangeColor(this.onDidChangeColor, this)), this.monitor = null; } get domNode() { return this._domNode; @@ -62226,7 +62226,7 @@ class tfe extends R { onPointerDown(e) { if (!e.target || !(e.target instanceof Element)) return; - this.monitor = this._register(new n0()); + this.monitor = this._register(new d0()); const t = yi(this._domNode); e.target !== this.selection && this.onDidChangePosition(e.offsetX, e.offsetY), this.monitor.startMonitoring(e.target, e.pointerId, e.buttons, (n) => this.onDidChangePosition(n.pageX - t.left, n.pageY - t.top), () => null); const i = z(e.target.ownerDocument, ie.POINTER_UP, () => { @@ -62243,10 +62243,10 @@ class tfe extends R { this.paintSelection(e.s, e.v); } paint() { - const e = this.model.color.hsva, t = new K(new La(e.h, 1, 1, 1)), i = this._canvas.getContext("2d"), n = i.createLinearGradient(0, 0, this._canvas.width, 0); + const e = this.model.color.hsva, t = new Q(new Sc(e.h, 1, 1, 1)), i = this._canvas.getContext("2d"), n = i.createLinearGradient(0, 0, this._canvas.width, 0); n.addColorStop(0, "rgba(255, 255, 255, 1)"), n.addColorStop(0.5, "rgba(255, 255, 255, 0.5)"), n.addColorStop(1, "rgba(255, 255, 255, 0)"); const o = i.createLinearGradient(0, 0, 0, this._canvas.height); - o.addColorStop(0, "rgba(0, 0, 0, 0)"), o.addColorStop(1, "rgba(0, 0, 0, 1)"), i.rect(0, 0, this._canvas.width, this._canvas.height), i.fillStyle = K.Format.CSS.format(t), i.fill(), i.fillStyle = n, i.fill(), i.fillStyle = o, i.fill(); + o.addColorStop(0, "rgba(0, 0, 0, 0)"), o.addColorStop(1, "rgba(0, 0, 0, 1)"), i.rect(0, 0, this._canvas.width, this._canvas.height), i.fillStyle = Q.Format.CSS.format(t), i.fill(), i.fillStyle = n, i.fill(), i.fillStyle = o, i.fill(); } paintSelection(e, t) { this.selection.style.left = `${e * this.width}px`, this.selection.style.top = `${this.height - t * this.height}px`; @@ -62259,9 +62259,9 @@ class tfe extends R { this.paintSelection(t.s, t.v); } } -class aQ extends R { +class Kj extends J { constructor(e, t, i = !1) { - super(), this.model = t, this._onDidChange = new k(), this.onDidChange = this._onDidChange.event, this._onColorFlushed = new k(), this.onColorFlushed = this._onColorFlushed.event, i ? (this.domNode = Q(e, ko(".standalone-strip")), this.overlay = Q(this.domNode, ko(".standalone-overlay"))) : (this.domNode = Q(e, ko(".strip")), this.overlay = Q(this.domNode, ko(".overlay"))), this.slider = Q(this.domNode, ko(".slider")), this.slider.style.top = "0px", this._register(z(this.domNode, ie.POINTER_DOWN, (n) => this.onPointerDown(n))), this._register(t.onDidChangeColor(this.onDidChangeColor, this)), this.layout(); + super(), this.model = t, this._onDidChange = new k(), this.onDidChange = this._onDidChange.event, this._onColorFlushed = new k(), this.onColorFlushed = this._onColorFlushed.event, i ? (this.domNode = O(e, Jo(".standalone-strip")), this.overlay = O(this.domNode, Jo(".standalone-overlay"))) : (this.domNode = O(e, Jo(".strip")), this.overlay = O(this.domNode, Jo(".overlay"))), this.slider = O(this.domNode, Jo(".slider")), this.slider.style.top = "0px", this._register(z(this.domNode, ie.POINTER_DOWN, (n) => this.onPointerDown(n))), this._register(t.onDidChangeColor(this.onDidChangeColor, this)), this.layout(); } layout() { this.height = this.domNode.offsetHeight - this.slider.offsetHeight; @@ -62275,7 +62275,7 @@ class aQ extends R { onPointerDown(e) { if (!e.target || !(e.target instanceof Element)) return; - const t = this._register(new n0()), i = yi(this.domNode); + const t = this._register(new d0()), i = yi(this.domNode); this.domNode.classList.add("grabbing"), e.target !== this.slider && this.onDidChangeTop(e.offsetY), t.startMonitoring(e.target, e.pointerId, e.buttons, (o) => this.onDidChangeTop(o.pageY - i.top), () => null); const n = z(e.target.ownerDocument, ie.POINTER_UP, () => { this._onColorFlushed.fire(), n.dispose(), t.stopMonitoring(!0), this.domNode.classList.remove("grabbing"); @@ -62289,20 +62289,20 @@ class aQ extends R { this.slider.style.top = `${(1 - e) * this.height}px`; } } -class ife extends aQ { +class _ge extends Kj { constructor(e, t, i = !1) { super(e, t, i), this.domNode.classList.add("opacity-strip"), this.onDidChangeColor(this.model.color); } onDidChangeColor(e) { super.onDidChangeColor(e); - const { r: t, g: i, b: n } = e.rgba, o = new K(new lt(t, i, n, 1)), r = new K(new lt(t, i, n, 0)); - this.overlay.style.background = `linear-gradient(to bottom, ${o} 0%, ${r} 100%)`; + const { r: t, g: i, b: n } = e.rgba, o = new Q(new rt(t, i, n, 1)), l = new Q(new rt(t, i, n, 0)); + this.overlay.style.background = `linear-gradient(to bottom, ${o} 0%, ${l} 100%)`; } getValue(e) { return e.hsva.a; } } -class nfe extends aQ { +class Qge extends Kj { constructor(e, t, i = !1) { super(e, t, i), this.domNode.classList.add("hue-strip"); } @@ -62310,9 +62310,9 @@ class nfe extends aQ { return 1 - e.hsva.h / 360; } } -class sfe extends R { +class Oge extends J { constructor(e) { - super(), this._onClicked = this._register(new k()), this.onClicked = this._onClicked.event, this._button = Q(e, document.createElement("button")), this._button.classList.add("insert-button"), this._button.textContent = "Insert", this._register(z(this._button, ie.CLICK, () => { + super(), this._onClicked = this._register(new k()), this.onClicked = this._onClicked.event, this._button = O(e, document.createElement("button")), this._button.classList.add("insert-button"), this._button.textContent = "Insert", this._register(z(this._button, ie.CLICK, () => { this._onClicked.fire(); })); } @@ -62320,9 +62320,9 @@ class sfe extends R { return this._button; } } -class ofe extends Ko { +class jge extends jo { constructor(e, t, i, n, o = !1) { - super(), this.model = t, this.pixelRatio = i, this._register(Fw.getInstance(xe(e)).onDidChange(() => this.layout())), this._domNode = ko(".colorpicker-widget"), e.appendChild(this._domNode), this.header = this._register(new qpe(this._domNode, this.model, n, o)), this.body = this._register(new efe(this._domNode, this.model, this.pixelRatio, o)); + super(), this.model = t, this.pixelRatio = i, this._register(qy.getInstance(Le(e)).onDidChange(() => this.layout())), this._domNode = Jo(".colorpicker-widget"), e.appendChild(this._domNode), this.header = this._register(new Kge(this._domNode, this.model, n, o)), this.body = this._register(new Pge(this._domNode, this.model, this.pixelRatio, o)); } layout() { this.body.layout(); @@ -62331,7 +62331,7 @@ class ofe extends Ko { return this._domNode; } } -class MW { +class FR { constructor(e, t, i, n) { this.priority = e, this.range = t, this.initialMousePosX = i, this.initialMousePosY = n, this.type = 1; } @@ -62342,9 +62342,9 @@ class MW { return e.type === 1 && t.lineNumber === this.range.startLineNumber; } } -class WL { - constructor(e, t, i, n, o, r) { - this.priority = e, this.owner = t, this.range = i, this.initialMousePosX = n, this.initialMousePosY = o, this.supportsMarkerHover = r, this.type = 2; +class UX { + constructor(e, t, i, n, o, l) { + this.priority = e, this.owner = t, this.range = i, this.initialMousePosX = n, this.initialMousePosY = o, this.supportsMarkerHover = l, this.type = 2; } equals(e) { return e.type === 2 && this.owner === e.owner; @@ -62353,7 +62353,7 @@ class WL { return e.type === 2 && this.owner === e.owner; } } -class Zm { +class wb { constructor(e) { this.renderedHoverParts = e; } @@ -62362,7 +62362,7 @@ class Zm { e.dispose(); } } -const Om = new class { +const Ob = new class { constructor() { this._participants = []; } @@ -62373,17 +62373,17 @@ const Om = new class { return this._participants; } }(); -var cQ = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Uj = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, dQ = function(s, e) { +}, Pj = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class rfe { +class qge { constructor(e, t, i, n) { this.owner = e, this.range = t, this.model = i, this.provider = n, this.forceShowAtRange = !0; } @@ -62391,7 +62391,7 @@ class rfe { return e.type === 1 && this.range.startColumn <= e.range.startColumn && this.range.endColumn >= e.range.endColumn; } } -let W1 = class { +let zW = class { constructor(e, t) { this._editor = e, this._themeService = t, this.hoverOrdinal = 2; } @@ -62399,27 +62399,27 @@ let W1 = class { return []; } computeAsync(e, t, i) { - return Ro.fromPromise(this._computeAsync(e, t, i)); + return Eo.fromPromise(this._computeAsync(e, t, i)); } async _computeAsync(e, t, i) { if (!this._editor.hasModel()) return []; - const n = Zb.get(this._editor); + const n = TZ.get(this._editor); if (!n) return []; for (const o of t) { if (!n.isColorDecoration(o)) continue; - const r = n.getColorData(o.range.getStartPosition()); - if (r) - return [await hQ(this, this._editor.getModel(), r.colorInfo, r.provider)]; + const l = n.getColorData(o.range.getStartPosition()); + if (l) + return [await Bj(this, this._editor.getModel(), l.colorInfo, l.provider)]; } return []; } renderHoverParts(e, t) { - const i = uQ(this, this._editor, this._themeService, t, e); + const i = _j(this, this._editor, this._themeService, t, e); if (!i) - return new Zm([]); + return new wb([]); this._colorPicker = i.colorPicker; const n = { hoverPart: i.hoverPart, @@ -62428,7 +62428,7 @@ let W1 = class { i.disposables.dispose(); } }; - return new Zm([n]); + return new wb([n]); } handleResize() { var e; @@ -62438,39 +62438,39 @@ let W1 = class { return !!this._colorPicker; } }; -W1 = cQ([ - dQ(1, Pi) -], W1); -class lfe { +zW = Uj([ + Pj(1, Ki) +], zW); +class $ge { constructor(e, t, i, n) { this.owner = e, this.range = t, this.model = i, this.provider = n; } } -let v1 = class { +let AW = class { constructor(e, t) { this._editor = e, this._themeService = t, this._color = null; } async createColorHover(e, t, i) { - if (!this._editor.hasModel() || !Zb.get(this._editor)) + if (!this._editor.hasModel() || !TZ.get(this._editor)) return null; - const o = await sQ(i, this._editor.getModel(), Ye.None); - let r = null, l = null; + const o = await Dj(i, this._editor.getModel(), Fe.None); + let l = null, r = null; for (const h of o) { const u = h.colorInfo; - M.containsRange(u.range, e.range) && (r = u, l = h.provider); + I.containsRange(u.range, e.range) && (l = u, r = h.provider); } - const a = r ?? e, c = l ?? t, d = !!r; - return { colorHover: await hQ(this, this._editor.getModel(), a, c), foundInEditor: d }; + const c = l ?? e, d = r ?? t, a = !!l; + return { colorHover: await Bj(this, this._editor.getModel(), c, d), foundInEditor: a }; } async updateEditorModel(e) { if (!this._editor.hasModel()) return; const t = e.model; - let i = new M(e.range.startLineNumber, e.range.startColumn, e.range.endLineNumber, e.range.endColumn); - this._color && (await vL(this._editor.getModel(), t, this._color, i, e), i = gQ(this._editor, i, t)); + let i = new I(e.range.startLineNumber, e.range.startColumn, e.range.endLineNumber, e.range.endColumn); + this._color && (await PX(this._editor.getModel(), t, this._color, i, e), i = Qj(this._editor, i, t)); } renderHoverParts(e, t) { - return uQ(this, this._editor, this._themeService, t, e); + return _j(this, this._editor, this._themeService, t, e); } set color(e) { this._color = e; @@ -62479,14 +62479,14 @@ let v1 = class { return this._color; } }; -v1 = cQ([ - dQ(1, Pi) -], v1); -async function hQ(s, e, t, i) { - const n = e.getValueInRange(t.range), { red: o, green: r, blue: l, alpha: a } = t.color, c = new lt(Math.round(o * 255), Math.round(r * 255), Math.round(l * 255), a), d = new K(c), h = await oQ(e, t, i, Ye.None), u = new jpe(d, [], 0); - return u.colorPresentations = h || [], u.guessColorPresentation(d, n), s instanceof W1 ? new rfe(s, M.lift(t.range), u, i) : new lfe(s, M.lift(t.range), u, i); -} -function uQ(s, e, t, i, n) { +AW = Uj([ + Pj(1, Ki) +], AW); +async function Bj(s, e, t, i) { + const n = e.getValueInRange(t.range), { red: o, green: l, blue: r, alpha: c } = t.color, d = new rt(Math.round(o * 255), Math.round(l * 255), Math.round(r * 255), c), a = new Q(d), h = await Fj(e, t, i, Fe.None), u = new Age(a, [], 0); + return u.colorPresentations = h || [], u.guessColorPresentation(a, n), s instanceof zW ? new qge(s, I.lift(t.range), u, i) : new $ge(s, I.lift(t.range), u, i); +} +function _j(s, e, t, i, n) { if (i.length === 0 || !e.hasModel()) return; if (n.setMinimumDimensions) { @@ -62494,41 +62494,41 @@ function uQ(s, e, t, i, n) { 67 /* EditorOption.lineHeight */ ) + 8; - n.setMinimumDimensions(new Lt(302, u)); + n.setMinimumDimensions(new Xt(302, u)); } - const o = new U(), r = i[0], l = e.getModel(), a = r.model, c = o.add(new ofe(n.fragment, a, e.getOption( + const o = new _(), l = i[0], r = e.getModel(), c = l.model, d = o.add(new jge(n.fragment, c, e.getOption( 144 /* EditorOption.pixelRatio */ - ), t, s instanceof v1)); - let d = !1, h = new M(r.range.startLineNumber, r.range.startColumn, r.range.endLineNumber, r.range.endColumn); - if (s instanceof v1) { - const u = r.model.color; - s.color = u, vL(l, a, u, h, r), o.add(a.onColorFlushed((g) => { - s.color = g; + ), t, s instanceof AW)); + let a = !1, h = new I(l.range.startLineNumber, l.range.startColumn, l.range.endLineNumber, l.range.endColumn); + if (s instanceof AW) { + const u = l.model.color; + s.color = u, PX(r, c, u, h, l), o.add(c.onColorFlushed((m) => { + s.color = m; })); } else - o.add(a.onColorFlushed(async (u) => { - await vL(l, a, u, h, r), d = !0, h = gQ(e, h, a); + o.add(c.onColorFlushed(async (u) => { + await PX(r, c, u, h, l), a = !0, h = Qj(e, h, c); })); - return o.add(a.onDidChangeColor((u) => { - vL(l, a, u, h, r); + return o.add(c.onDidChangeColor((u) => { + PX(r, c, u, h, l); })), o.add(e.onDidChangeModelContent((u) => { - d ? d = !1 : (n.hide(), e.focus()); - })), { hoverPart: r, colorPicker: c, disposables: o }; + a ? a = !1 : (n.hide(), e.focus()); + })), { hoverPart: l, colorPicker: d, disposables: o }; } -function gQ(s, e, t) { +function Qj(s, e, t) { const i = [], n = t.presentation.textEdit ?? { range: e, text: t.presentation.label, forceMoveMarkers: !1 }; i.push(n), t.presentation.additionalTextEdits && i.push(...t.presentation.additionalTextEdits); - const o = M.lift(n.range), r = s.getModel()._setTrackedRange( + const o = I.lift(n.range), l = s.getModel()._setTrackedRange( null, o, 3 /* TrackedRangeStickiness.GrowsOnlyWhenTypingAfter */ ); - return s.executeEdits("colorpicker", i), s.pushUndoStop(), s.getModel()._getTrackedRange(r) ?? o; + return s.executeEdits("colorpicker", i), s.pushUndoStop(), s.getModel()._getTrackedRange(l) ?? o; } -async function vL(s, e, t, i, n) { - const o = await oQ(s, { +async function PX(s, e, t, i, n) { + const o = await Fj(s, { range: i, color: { red: t.rgba.r / 255, @@ -62536,80 +62536,80 @@ async function vL(s, e, t, i, n) { blue: t.rgba.b / 255, alpha: t.rgba.a } - }, n.provider, Ye.None); + }, n.provider, Fe.None); e.colorPresentations = o || []; } -const mQ = "editor.action.showHover", afe = "editor.action.showDefinitionPreviewHover", cfe = "editor.action.scrollUpHover", dfe = "editor.action.scrollDownHover", hfe = "editor.action.scrollLeftHover", ufe = "editor.action.scrollRightHover", gfe = "editor.action.pageUpHover", mfe = "editor.action.pageDownHover", pfe = "editor.action.goToTopHover", ffe = "editor.action.goToBottomHover", VI = "editor.action.increaseHoverVerbosityLevel", bfe = p({ key: "increaseHoverVerbosityLevel", comment: ["Label for action that will increase the hover verbosity level."] }, "Increase Hover Verbosity Level"), kI = "editor.action.decreaseHoverVerbosityLevel", yfe = p({ key: "decreaseHoverVerbosityLevel", comment: ["Label for action that will decrease the hover verbosity level."] }, "Decrease Hover Verbosity Level"), pQ = "editor.action.inlineSuggest.commit", fQ = "editor.action.inlineSuggest.showPrevious", bQ = "editor.action.inlineSuggest.showNext"; -var r5 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +const Oj = "editor.action.showHover", eZe = "editor.action.showDefinitionPreviewHover", tZe = "editor.action.scrollUpHover", iZe = "editor.action.scrollDownHover", nZe = "editor.action.scrollLeftHover", sZe = "editor.action.scrollRightHover", oZe = "editor.action.pageUpHover", lZe = "editor.action.pageDownHover", rZe = "editor.action.goToTopHover", cZe = "editor.action.goToBottomHover", Qx = "editor.action.increaseHoverVerbosityLevel", dZe = p({ key: "increaseHoverVerbosityLevel", comment: ["Label for action that will increase the hover verbosity level."] }, "Increase Hover Verbosity Level"), Ox = "editor.action.decreaseHoverVerbosityLevel", aZe = p({ key: "decreaseHoverVerbosityLevel", comment: ["Label for action that will decrease the hover verbosity level."] }, "Decrease Hover Verbosity Level"), jj = "editor.action.inlineSuggest.commit", qj = "editor.action.inlineSuggest.showPrevious", $j = "editor.action.inlineSuggest.showNext"; +var wH = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Gr = function(s, e) { +}, El = function(s, e) { return function(t, i) { e(t, i, s); }; -}, TL; -let tD = class extends R { +}, BX; +let XM = class extends J { constructor(e, t, i) { - super(), this.editor = e, this.model = t, this.instantiationService = i, this.alwaysShowToolbar = St(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption( + super(), this.editor = e, this.model = t, this.instantiationService = i, this.alwaysShowToolbar = Gt(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption( 62 /* EditorOption.inlineSuggest */ - ).showToolbar === "always"), this.sessionPosition = void 0, this.position = ye(this, (n) => { - var a, c; - const o = (a = this.model.read(n)) == null ? void 0 : a.primaryGhostText.read(n); + ).showToolbar === "always"), this.sessionPosition = void 0, this.position = fe(this, (n) => { + var c, d; + const o = (c = this.model.read(n)) == null ? void 0 : c.primaryGhostText.read(n); if (!this.alwaysShowToolbar.read(n) || !o || o.parts.length === 0) return this.sessionPosition = void 0, null; - const r = o.parts[0].column; + const l = o.parts[0].column; this.sessionPosition && this.sessionPosition.lineNumber !== o.lineNumber && (this.sessionPosition = void 0); - const l = new V(o.lineNumber, Math.min(r, ((c = this.sessionPosition) == null ? void 0 : c.column) ?? Number.MAX_SAFE_INTEGER)); - return this.sessionPosition = l, l; - }), this._register(ks((n, o) => { - const r = this.model.read(n); - if (!r || !this.alwaysShowToolbar.read(n)) + const r = new Y(o.lineNumber, Math.min(l, ((d = this.sessionPosition) == null ? void 0 : d.column) ?? Number.MAX_SAFE_INTEGER)); + return this.sessionPosition = r, r; + }), this._register(Js((n, o) => { + const l = this.model.read(n); + if (!l || !this.alwaysShowToolbar.read(n)) return; - const l = Uh((c, d) => { - const h = d.add(this.instantiationService.createInstance(_b, this.editor, !0, this.position, r.selectedInlineCompletionIndex, r.inlineCompletionsCount, r.activeCommands)); - return e.addContentWidget(h), d.add(Ce(() => e.removeContentWidget(h))), d.add(Te((u) => { - this.position.read(u) && r.lastTriggerKind.read(u) !== _l.Explicit && r.triggerExplicitly(); + const r = qh((d, a) => { + const h = a.add(this.instantiationService.createInstance(MZ, this.editor, !0, this.position, l.selectedInlineCompletionIndex, l.inlineCompletionsCount, l.activeCommands)); + return e.addContentWidget(h), a.add(We(() => e.removeContentWidget(h))), a.add(Te((u) => { + this.position.read(u) && l.lastTriggerKind.read(u) !== wr.Explicit && l.triggerExplicitly(); })), h; - }), a = _C(this, (c, d) => !!this.position.read(c) || !!d); - o.add(Te((c) => { - a.read(c) && l.read(c); + }), c = DG(this, (d, a) => !!this.position.read(d) || !!a); + o.add(Te((d) => { + c.read(d) && r.read(d); })); })); } }; -tD = r5([ - Gr(2, Se) -], tD); -const wfe = Bt("inline-suggestion-hints-next", te.chevronRight, p("parameterHintsNextIcon", "Icon for show next parameter hint.")), Cfe = Bt("inline-suggestion-hints-previous", te.chevronLeft, p("parameterHintsPreviousIcon", "Icon for show previous parameter hint.")); -var hh; -let _b = (hh = class extends R { +XM = wH([ + El(2, Ge) +], XM); +const hZe = Kt("inline-suggestion-hints-next", te.chevronRight, p("parameterHintsNextIcon", "Icon for show next parameter hint.")), uZe = Kt("inline-suggestion-hints-previous", te.chevronLeft, p("parameterHintsPreviousIcon", "Icon for show previous parameter hint.")); +var ph; +let MZ = (ph = class extends J { static get dropDownVisible() { return this._dropDownVisible; } createCommandAction(e, t, i) { - const n = new lo(e, t, i, !0, () => this._commandService.executeCommand(e)), o = this.keybindingService.lookupKeybinding(e, this._contextKeyService); - let r = t; - return o && (r = p({ key: "content", comment: ["A label", "A keybinding"] }, "{0} ({1})", t, o.getLabel())), n.tooltip = r, n; - } - constructor(e, t, i, n, o, r, l, a, c, d, h) { - super(), this.editor = e, this.withBorder = t, this._position = i, this._currentSuggestionIdx = n, this._suggestionCount = o, this._extraCommands = r, this._commandService = l, this.keybindingService = c, this._contextKeyService = d, this._menuService = h, this.id = `InlineSuggestionHintsContentWidget${TL.id++}`, this.allowEditorOverflow = !0, this.suppressMouseDown = !1, this.nodes = Qe("div.inlineSuggestionsHints", { className: this.withBorder ? ".withBorder" : "" }, [ - Qe("div@toolBar") - ]), this.previousAction = this.createCommandAction(fQ, p("previous", "Previous"), Ze.asClassName(Cfe)), this.availableSuggestionCountAction = new lo("inlineSuggestionHints.availableSuggestionCount", "", void 0, !1), this.nextAction = this.createCommandAction(bQ, p("next", "Next"), Ze.asClassName(wfe)), this.inlineCompletionsActionsMenus = this._register(this._menuService.createMenu(pe.InlineCompletionsActions, this._contextKeyService)), this.clearAvailableSuggestionCountLabelDebounced = this._register(new Zt(() => { + const n = new ao(e, t, i, !0, () => this._commandService.executeCommand(e)), o = this.keybindingService.lookupKeybinding(e, this._contextKeyService); + let l = t; + return o && (l = p({ key: "content", comment: ["A label", "A keybinding"] }, "{0} ({1})", t, o.getLabel())), n.tooltip = l, n; + } + constructor(e, t, i, n, o, l, r, c, d, a, h) { + super(), this.editor = e, this.withBorder = t, this._position = i, this._currentSuggestionIdx = n, this._suggestionCount = o, this._extraCommands = l, this._commandService = r, this.keybindingService = d, this._contextKeyService = a, this._menuService = h, this.id = `InlineSuggestionHintsContentWidget${BX.id++}`, this.allowEditorOverflow = !0, this.suppressMouseDown = !1, this.nodes = Oe("div.inlineSuggestionsHints", { className: this.withBorder ? ".withBorder" : "" }, [ + Oe("div@toolBar") + ]), this.previousAction = this.createCommandAction(qj, p("previous", "Previous"), Se.asClassName(uZe)), this.availableSuggestionCountAction = new ao("inlineSuggestionHints.availableSuggestionCount", "", void 0, !1), this.nextAction = this.createCommandAction($j, p("next", "Next"), Se.asClassName(hZe)), this.inlineCompletionsActionsMenus = this._register(this._menuService.createMenu(pe.InlineCompletionsActions, this._contextKeyService)), this.clearAvailableSuggestionCountLabelDebounced = this._register(new St(() => { this.availableSuggestionCountAction.label = ""; - }, 100)), this.disableButtonsDebounced = this._register(new Zt(() => { + }, 100)), this.disableButtonsDebounced = this._register(new St(() => { this.previousAction.enabled = this.nextAction.enabled = !1; - }, 100)), this.toolBar = this._register(a.createInstance(iD, this.nodes.toolBar, pe.InlineSuggestionToolbar, { + }, 100)), this.toolBar = this._register(c.createInstance(VM, this.nodes.toolBar, pe.InlineSuggestionToolbar, { menuOptions: { renderShortTitle: !0 }, toolbarOptions: { primaryGroup: (u) => u.startsWith("primary") }, - actionViewItemProvider: (u, g) => { - if (u instanceof ao) - return a.createInstance(Lfe, u, void 0); + actionViewItemProvider: (u, m) => { + if (u instanceof ho) + return c.createInstance(bZe, u, void 0); if (u === this.availableSuggestionCountAction) { - const m = new Sfe(void 0, u, { label: !0, icon: !1 }); - return m.setClass("availableSuggestionCount"), m; + const b = new mZe(void 0, u, { label: !0, icon: !1 }); + return b.setClass("availableSuggestionCount"), b; } }, telemetrySource: "InlineSuggestionToolbar" @@ -62618,25 +62618,25 @@ let _b = (hh = class extends R { this.availableSuggestionCountAction, this.nextAction ]), this._register(this.toolBar.onDidChangeDropdownVisibility((u) => { - TL._dropDownVisible = u; + BX._dropDownVisible = u; })), this._register(Te((u) => { this._position.read(u), this.editor.layoutContentWidget(this); })), this._register(Te((u) => { - const g = this._suggestionCount.read(u), m = this._currentSuggestionIdx.read(u); - g !== void 0 ? (this.clearAvailableSuggestionCountLabelDebounced.cancel(), this.availableSuggestionCountAction.label = `${m + 1}/${g}`) : this.clearAvailableSuggestionCountLabelDebounced.schedule(), g !== void 0 && g > 1 ? (this.disableButtonsDebounced.cancel(), this.previousAction.enabled = this.nextAction.enabled = !0) : this.disableButtonsDebounced.schedule(); + const m = this._suggestionCount.read(u), b = this._currentSuggestionIdx.read(u); + m !== void 0 ? (this.clearAvailableSuggestionCountLabelDebounced.cancel(), this.availableSuggestionCountAction.label = `${b + 1}/${m}`) : this.clearAvailableSuggestionCountLabelDebounced.schedule(), m !== void 0 && m > 1 ? (this.disableButtonsDebounced.cancel(), this.previousAction.enabled = this.nextAction.enabled = !0) : this.disableButtonsDebounced.schedule(); })), this._register(Te((u) => { - const m = this._extraCommands.read(u).map((f) => ({ + const b = this._extraCommands.read(u).map((g) => ({ class: void 0, - id: f.id, + id: g.id, enabled: !0, - tooltip: f.tooltip || "", - label: f.title, - run: (b) => this._commandService.executeCommand(f.id) + tooltip: g.tooltip || "", + label: g.title, + run: (Z) => this._commandService.executeCommand(g.id) })); - for (const [f, b] of this.inlineCompletionsActionsMenus.getActions()) - for (const y of b) - y instanceof ao && m.push(y); - m.length > 0 && m.unshift(new Qi()), this.toolBar.setAdditionalSecondaryActions(m); + for (const [g, Z] of this.inlineCompletionsActionsMenus.getActions()) + for (const f of Z) + f instanceof ho && b.push(f); + b.length > 0 && b.unshift(new ji()), this.toolBar.setAdditionalSecondaryActions(b); })); } getId() { @@ -62656,15 +62656,15 @@ let _b = (hh = class extends R { positionAffinity: 3 }; } -}, TL = hh, hh._dropDownVisible = !1, hh.id = 0, hh); -_b = TL = r5([ - Gr(6, Qt), - Gr(7, Se), - Gr(8, xt), - Gr(9, _e), - Gr(10, Uo) -], _b); -class Sfe extends Sb { +}, BX = ph, ph._dropDownVisible = !1, ph.id = 0, ph); +MZ = BX = wH([ + El(6, Ot), + El(7, Ge), + El(8, Lt), + El(9, xe), + El(10, Oo) +], MZ); +class mZe extends xZ { constructor() { super(...arguments), this._className = void 0; } @@ -62677,54 +62677,54 @@ class Sfe extends Sb { updateTooltip() { } } -let Lfe = class extends Xh { +let bZe = class extends Ah { updateLabel() { const e = this._keybindingService.lookupKeybinding(this._action.id, this._contextKeyService); if (!e) return super.updateLabel(); if (this.label) { - const t = Qe("div.keybinding").root; - this._register(new f0(t, ro, { disableTitle: !0, ...J4 })).set(e), this.label.textContent = this._action.label, this.label.appendChild(t), this.label.classList.add("inlineSuggestionStatusBarItemLabel"); + const t = Oe("div.keybinding").root; + this._register(new X0(t, co, { disableTitle: !0, ...Rj })).set(e), this.label.textContent = this._action.label, this.label.appendChild(t), this.label.classList.add("inlineSuggestionStatusBarItemLabel"); } } updateTooltip() { } -}, iD = class extends L1 { - constructor(e, t, i, n, o, r, l, a, c) { - super(e, { resetMenu: t, ...i }, n, o, r, l, a, c), this.menuId = t, this.options2 = i, this.menuService = n, this.contextKeyService = o, this.menu = this._store.add(this.menuService.createMenu(this.menuId, this.contextKeyService, { emitEventsForSubmenuChanges: !0 })), this.additionalActions = [], this.prependedPrimaryActions = [], this._store.add(this.menu.onDidChange(() => this.updateToolbar())), this.updateToolbar(); +}, VM = class extends YW { + constructor(e, t, i, n, o, l, r, c, d) { + super(e, { resetMenu: t, ...i }, n, o, l, r, c, d), this.menuId = t, this.options2 = i, this.menuService = n, this.contextKeyService = o, this.menu = this._store.add(this.menuService.createMenu(this.menuId, this.contextKeyService, { emitEventsForSubmenuChanges: !0 })), this.additionalActions = [], this.prependedPrimaryActions = [], this._store.add(this.menu.onDidChange(() => this.updateToolbar())), this.updateToolbar(); } updateToolbar() { - var i, n, o, r, l, a, c; + var i, n, o, l, r, c, d; const e = [], t = []; - NI(this.menu, (i = this.options2) == null ? void 0 : i.menuOptions, { primary: e, secondary: t }, (o = (n = this.options2) == null ? void 0 : n.toolbarOptions) == null ? void 0 : o.primaryGroup, (l = (r = this.options2) == null ? void 0 : r.toolbarOptions) == null ? void 0 : l.shouldInlineSubmenu, (c = (a = this.options2) == null ? void 0 : a.toolbarOptions) == null ? void 0 : c.useSeparatorsInPrimaryActions), t.push(...this.additionalActions), e.unshift(...this.prependedPrimaryActions), this.setActions(e, t); + Kx(this.menu, (i = this.options2) == null ? void 0 : i.menuOptions, { primary: e, secondary: t }, (o = (n = this.options2) == null ? void 0 : n.toolbarOptions) == null ? void 0 : o.primaryGroup, (r = (l = this.options2) == null ? void 0 : l.toolbarOptions) == null ? void 0 : r.shouldInlineSubmenu, (d = (c = this.options2) == null ? void 0 : c.toolbarOptions) == null ? void 0 : d.useSeparatorsInPrimaryActions), t.push(...this.additionalActions), e.unshift(...this.prependedPrimaryActions), this.setActions(e, t); } setPrependedPrimaryActions(e) { - ei(this.prependedPrimaryActions, e, (t, i) => t === i) || (this.prependedPrimaryActions = e, this.updateToolbar()); + ti(this.prependedPrimaryActions, e, (t, i) => t === i) || (this.prependedPrimaryActions = e, this.updateToolbar()); } setAdditionalSecondaryActions(e) { - ei(this.additionalActions, e, (t, i) => t === i) || (this.additionalActions = e, this.updateToolbar()); + ti(this.additionalActions, e, (t, i) => t === i) || (this.additionalActions = e, this.updateToolbar()); } }; -iD = r5([ - Gr(3, Uo), - Gr(4, _e), - Gr(5, Co), - Gr(6, xt), - Gr(7, Qt), - Gr(8, Ls) -], iD); -function GI(s, e, t) { +VM = wH([ + El(3, Oo), + El(4, xe), + El(5, Xo), + El(6, Lt), + El(7, Ot), + El(8, Ls) +], VM); +function jx(s, e, t) { const i = yi(s); return !(e < i.left || e > i.left + i.width || t < i.top || t > i.top + i.height); } -let Afe = class { +let pZe = class { constructor(e, t, i) { this.value = e, this.isComplete = t, this.hasLoadingMessage = i; } }; -class yQ extends R { +class e4 extends J { constructor(e, t) { - super(), this._editor = e, this._computer = t, this._onResult = this._register(new k()), this.onResult = this._onResult.event, this._firstWaitScheduler = this._register(new Zt(() => this._triggerAsyncComputation(), 0)), this._secondWaitScheduler = this._register(new Zt(() => this._triggerSyncComputation(), 0)), this._loadingMessageScheduler = this._register(new Zt(() => this._triggerLoadingMessage(), 0)), this._state = 0, this._asyncIterable = null, this._asyncIterableDone = !1, this._result = []; + super(), this._editor = e, this._computer = t, this._onResult = this._register(new k()), this.onResult = this._onResult.event, this._firstWaitScheduler = this._register(new St(() => this._triggerAsyncComputation(), 0)), this._secondWaitScheduler = this._register(new St(() => this._triggerSyncComputation(), 0)), this._loadingMessageScheduler = this._register(new St(() => this._triggerLoadingMessage(), 0)), this._state = 0, this._asyncIterable = null, this._asyncIterableDone = !1, this._result = []; } dispose() { this._asyncIterable && (this._asyncIterable.cancel(), this._asyncIterable = null), super.dispose(); @@ -62751,7 +62751,7 @@ class yQ extends R { this._setState( 2 /* HoverOperationState.SecondWait */ - ), this._secondWaitScheduler.schedule(this._secondWaitTime), this._computer.computeAsync ? (this._asyncIterableDone = !1, this._asyncIterable = v6((e) => this._computer.computeAsync(e)), (async () => { + ), this._secondWaitScheduler.schedule(this._secondWaitTime), this._computer.computeAsync ? (this._asyncIterableDone = !1, this._asyncIterable = Vq((e) => this._computer.computeAsync(e)), (async () => { try { for await (const e of this._asyncIterable) e && (this._result.push(e), this._fireResult()); @@ -62760,7 +62760,7 @@ class yQ extends R { /* HoverOperationState.Idle */ ); } catch (e) { - De(e); + Me(e); } })()) : this._asyncIterableDone = !0; } @@ -62780,7 +62780,7 @@ class yQ extends R { if (this._state === 1 || this._state === 2) return; const e = this._state === 0, t = this._state === 4; - this._onResult.fire(new Afe(this._result.slice(0), e, t)); + this._onResult.fire(new pZe(this._result.slice(0), e, t)); } start(e) { if (e === 0) @@ -62802,15 +62802,15 @@ class yQ extends R { this._firstWaitScheduler.cancel(), this._secondWaitScheduler.cancel(), this._loadingMessageScheduler.cancel(), this._asyncIterable && (this._asyncIterable.cancel(), this._asyncIterable = null), this._result = [], this._setState(0, !1); } } -class l5 { +class TH { constructor() { - this._onDidWillResize = new k(), this.onDidWillResize = this._onDidWillResize.event, this._onDidResize = new k(), this.onDidResize = this._onDidResize.event, this._sashListener = new U(), this._size = new Lt(0, 0), this._minSize = new Lt(0, 0), this._maxSize = new Lt(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER), this.domNode = document.createElement("div"), this._eastSash = new Tn(this.domNode, { getVerticalSashLeft: () => this._size.width }, { + this._onDidWillResize = new k(), this.onDidWillResize = this._onDidWillResize.event, this._onDidResize = new k(), this.onDidResize = this._onDidResize.event, this._sashListener = new _(), this._size = new Xt(0, 0), this._minSize = new Xt(0, 0), this._maxSize = new Xt(Number.MAX_SAFE_INTEGER, Number.MAX_SAFE_INTEGER), this.domNode = document.createElement("div"), this._eastSash = new Mn(this.domNode, { getVerticalSashLeft: () => this._size.width }, { orientation: 0 /* Orientation.VERTICAL */ - }), this._westSash = new Tn(this.domNode, { getVerticalSashLeft: () => 0 }, { + }), this._westSash = new Mn(this.domNode, { getVerticalSashLeft: () => 0 }, { orientation: 0 /* Orientation.VERTICAL */ - }), this._northSash = new Tn(this.domNode, { getHorizontalSashTop: () => 0 }, { orientation: 1, orthogonalEdge: rx.North }), this._southSash = new Tn(this.domNode, { getHorizontalSashTop: () => this._size.height }, { orientation: 1, orthogonalEdge: rx.South }), this._northSash.orthogonalStartSash = this._westSash, this._northSash.orthogonalEndSash = this._eastSash, this._southSash.orthogonalStartSash = this._westSash, this._southSash.orthogonalEndSash = this._eastSash; + }), this._northSash = new Mn(this.domNode, { getHorizontalSashTop: () => 0 }, { orientation: 1, orthogonalEdge: GL.North }), this._southSash = new Mn(this.domNode, { getHorizontalSashTop: () => this._size.height }, { orientation: 1, orthogonalEdge: GL.South }), this._northSash.orthogonalStartSash = this._westSash, this._northSash.orthogonalEndSash = this._eastSash, this._southSash.orthogonalStartSash = this._westSash, this._southSash.orthogonalEndSash = this._eastSash; let e, t = 0, i = 0; this._sashListener.add(se.any(this._northSash.onDidStart, this._eastSash.onDidStart, this._southSash.onDidStart, this._westSash.onDidStart)(() => { e === void 0 && (this._onDidWillResize.fire(), e = this._size, t = 0, i = 0); @@ -62837,10 +62837,10 @@ class l5 { this._northSash.state = e ? 3 : 0, this._eastSash.state = t ? 3 : 0, this._southSash.state = i ? 3 : 0, this._westSash.state = n ? 3 : 0; } layout(e = this.size.height, t = this.size.width) { - const { height: i, width: n } = this._minSize, { height: o, width: r } = this._maxSize; - e = Math.max(i, Math.min(o, e)), t = Math.max(n, Math.min(r, t)); - const l = new Lt(t, e); - Lt.equals(l, this._size) || (this.domNode.style.height = e + "px", this.domNode.style.width = t + "px", this._size = l, this._northSash.layout(), this._eastSash.layout(), this._southSash.layout(), this._westSash.layout()); + const { height: i, width: n } = this._minSize, { height: o, width: l } = this._maxSize; + e = Math.max(i, Math.min(o, e)), t = Math.max(n, Math.min(l, t)); + const r = new Xt(t, e); + Xt.equals(r, this._size) || (this.domNode.style.height = e + "px", this.domNode.style.width = t + "px", this._size = r, this._northSash.layout(), this._eastSash.layout(), this._southSash.layout(), this._westSash.layout()); } clearSashHoverState() { this._eastSash.clearSashHoverState(), this._westSash.clearSashHoverState(), this._northSash.clearSashHoverState(), this._southSash.clearSashHoverState(); @@ -62867,11 +62867,11 @@ class l5 { return this._preferredSize; } } -const xfe = 30, Mfe = 24; -class Zfe extends R { - constructor(e, t = new Lt(10, 10)) { - super(), this._editor = e, this.allowEditorOverflow = !0, this.suppressMouseDown = !1, this._resizableNode = this._register(new l5()), this._contentPosition = null, this._isResizing = !1, this._resizableNode.domNode.style.position = "absolute", this._resizableNode.minSize = Lt.lift(t), this._resizableNode.layout(t.height, t.width), this._resizableNode.enableSashes(!0, !0, !0, !0), this._register(this._resizableNode.onDidResize((i) => { - this._resize(new Lt(i.dimension.width, i.dimension.height)), i.done && (this._isResizing = !1); +const gZe = 30, ZZe = 24; +class fZe extends J { + constructor(e, t = new Xt(10, 10)) { + super(), this._editor = e, this.allowEditorOverflow = !0, this.suppressMouseDown = !1, this._resizableNode = this._register(new TH()), this._contentPosition = null, this._isResizing = !1, this._resizableNode.domNode.style.position = "absolute", this._resizableNode.minSize = Xt.lift(t), this._resizableNode.layout(t.height, t.width), this._resizableNode.enableSashes(!0, !0, !0, !0), this._register(this._resizableNode.onDidResize((i) => { + this._resize(new Xt(i.dimension.width, i.dimension.height)), i.done && (this._isResizing = !1); })), this._register(this._resizableNode.onDidWillResize(() => { this._isResizing = !0; })); @@ -62887,35 +62887,35 @@ class Zfe extends R { } get position() { var e; - return (e = this._contentPosition) != null && e.position ? V.lift(this._contentPosition.position) : void 0; + return (e = this._contentPosition) != null && e.position ? Y.lift(this._contentPosition.position) : void 0; } _availableVerticalSpaceAbove(e) { const t = this._editor.getDomNode(), i = this._editor.getScrolledVisiblePosition(e); - return !t || !i ? void 0 : yi(t).top + i.top - xfe; + return !t || !i ? void 0 : yi(t).top + i.top - gZe; } _availableVerticalSpaceBelow(e) { const t = this._editor.getDomNode(), i = this._editor.getScrolledVisiblePosition(e); if (!t || !i) return; - const n = yi(t), o = Wh(t.ownerDocument.body), r = n.top + i.top + i.height; - return o.height - r - Mfe; + const n = yi(t), o = Yh(t.ownerDocument.body), l = n.top + i.top + i.height; + return o.height - l - ZZe; } _findPositionPreference(e, t) { - const i = Math.min(this._availableVerticalSpaceBelow(t) ?? 1 / 0, e), n = Math.min(this._availableVerticalSpaceAbove(t) ?? 1 / 0, e), o = Math.min(Math.max(n, i), e), r = Math.min(e, o); - let l; + const i = Math.min(this._availableVerticalSpaceBelow(t) ?? 1 / 0, e), n = Math.min(this._availableVerticalSpaceAbove(t) ?? 1 / 0, e), o = Math.min(Math.max(n, i), e), l = Math.min(e, o); + let r; return this._editor.getOption( 60 /* EditorOption.hover */ - ).above ? l = r <= n ? 1 : 2 : l = r <= i ? 2 : 1, l === 1 ? this._resizableNode.enableSashes(!0, !0, !1, !1) : this._resizableNode.enableSashes(!1, !0, !0, !1), l; + ).above ? r = l <= n ? 1 : 2 : r = l <= i ? 2 : 1, r === 1 ? this._resizableNode.enableSashes(!0, !0, !1, !1) : this._resizableNode.enableSashes(!1, !0, !0, !1), r; } _resize(e) { this._resizableNode.layout(e.height, e.width); } } -const ZS = ce; -let a5 = class extends R { +const E1 = de; +let MH = class extends J { constructor() { - super(), this.containerDomNode = document.createElement("div"), this.containerDomNode.className = "monaco-hover", this.containerDomNode.tabIndex = 0, this.containerDomNode.setAttribute("role", "tooltip"), this.contentsDomNode = document.createElement("div"), this.contentsDomNode.className = "monaco-hover-content", this.scrollbar = this._register(new CC(this.contentsDomNode, { + super(), this.containerDomNode = document.createElement("div"), this.containerDomNode.className = "monaco-hover", this.containerDomNode.tabIndex = 0, this.containerDomNode.setAttribute("role", "tooltip"), this.contentsDomNode = document.createElement("div"), this.contentsDomNode.className = "monaco-hover-content", this.scrollbar = this._register(new MG(this.contentsDomNode, { consumeMouseWheelIfScrollbarIsNeeded: !0 })), this.containerDomNode.appendChild(this.scrollbar.getDomNode()); } @@ -62923,14 +62923,14 @@ let a5 = class extends R { this.scrollbar.scanDomNode(); } }; -class RI extends R { +class qx extends J { static render(e, t, i) { - return new RI(e, t, i); + return new qx(e, t, i); } constructor(e, t, i) { - super(), this.actionLabel = t.label, this.actionKeybindingLabel = i, this.actionContainer = Q(e, ZS("div.action-container")), this.actionContainer.setAttribute("tabindex", "0"), this.action = Q(this.actionContainer, ZS("a.action")), this.action.setAttribute("role", "button"), t.iconClass && Q(this.action, ZS(`span.icon.${t.iconClass}`)); - const n = Q(this.action, ZS("span")); - n.textContent = i ? `${t.label} (${i})` : t.label, this._store.add(new CQ(this.actionContainer, t.run)), this._store.add(new SQ(this.actionContainer, t.run, [ + super(), this.actionLabel = t.label, this.actionKeybindingLabel = i, this.actionContainer = O(e, E1("div.action-container")), this.actionContainer.setAttribute("tabindex", "0"), this.action = O(this.actionContainer, E1("a.action")), this.action.setAttribute("role", "button"), t.iconClass && O(this.action, E1(`span.icon.${t.iconClass}`)); + const n = O(this.action, E1("span")); + n.textContent = i ? `${t.label} (${i})` : t.label, this._store.add(new i4(this.actionContainer, t.run)), this._store.add(new n4(this.actionContainer, t.run, [ 3, 10 /* KeyCode.Space */ @@ -62940,37 +62940,37 @@ class RI extends R { e ? (this.actionContainer.classList.remove("disabled"), this.actionContainer.removeAttribute("aria-disabled")) : (this.actionContainer.classList.add("disabled"), this.actionContainer.setAttribute("aria-disabled", "true")); } } -function wQ(s, e) { +function t4(s, e) { return s && e ? p("acessibleViewHint", "Inspect this in the accessible view with {0}.", e) : s ? p("acessibleViewHintNoKbOpen", "Inspect this in the accessible view via the command Open Accessible View which is currently not triggerable via keybinding.") : ""; } -class CQ extends R { +class i4 extends J { constructor(e, t) { super(), this._register(z(e, ie.CLICK, (i) => { i.stopPropagation(), i.preventDefault(), t(e); })); } } -class SQ extends R { +class n4 extends J { constructor(e, t, i) { super(), this._register(z(e, ie.KEY_DOWN, (n) => { - const o = new Vt(n); - i.some((r) => o.equals(r)) && (n.stopPropagation(), n.preventDefault(), t(e)); + const o = new Yt(n); + i.some((l) => o.equals(l)) && (n.stopPropagation(), n.preventDefault(), t(e)); })); } } -var _fe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var yZe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, _S = function(s, e) { +}, D1 = function(s, e) { return function(t, i) { e(t, i, s); }; -}, ea; -const l3 = 30, Ife = 6; -var uh; -let nD = (uh = class extends Zfe { +}, sc; +const TA = 30, WZe = 6; +var gh; +let LM = (gh = class extends fZe { get isVisibleFromKeyboard() { var e; return ((e = this._renderedHover) == null ? void 0 : e.source) === 1; @@ -62982,22 +62982,22 @@ let nD = (uh = class extends Zfe { return this._hoverFocusedKey.get() ?? !1; } constructor(e, t, i, n, o) { - const r = e.getOption( + const l = e.getOption( 67 /* EditorOption.lineHeight */ - ) + 8, l = 150, a = new Lt(l, r); - super(e, a), this._configurationService = i, this._accessibilityService = n, this._keybindingService = o, this._hover = this._register(new a5()), this._onDidResize = this._register(new k()), this.onDidResize = this._onDidResize.event, this._minimumSize = a, this._hoverVisibleKey = I.hoverVisible.bindTo(t), this._hoverFocusedKey = I.hoverFocused.bindTo(t), Q(this._resizableNode.domNode, this._hover.containerDomNode), this._resizableNode.domNode.style.zIndex = "50", this._register(this._editor.onDidLayoutChange(() => { + ) + 8, r = 150, c = new Xt(r, l); + super(e, c), this._configurationService = i, this._accessibilityService = n, this._keybindingService = o, this._hover = this._register(new MH()), this._onDidResize = this._register(new k()), this.onDidResize = this._onDidResize.event, this._minimumSize = c, this._hoverVisibleKey = C.hoverVisible.bindTo(t), this._hoverFocusedKey = C.hoverFocused.bindTo(t), O(this._resizableNode.domNode, this._hover.containerDomNode), this._resizableNode.domNode.style.zIndex = "50", this._register(this._editor.onDidLayoutChange(() => { this.isVisible && this._updateMaxDimensions(); - })), this._register(this._editor.onDidChangeConfiguration((d) => { - d.hasChanged( + })), this._register(this._editor.onDidChangeConfiguration((a) => { + a.hasChanged( 50 /* EditorOption.fontInfo */ ) && this._updateFont(); })); - const c = this._register(vl(this._resizableNode.domNode)); - this._register(c.onDidFocus(() => { + const d = this._register(kr(this._resizableNode.domNode)); + this._register(d.onDidFocus(() => { this._hoverFocusedKey.set(!0); - })), this._register(c.onDidBlur(() => { + })), this._register(d.onDidBlur(() => { this._hoverFocusedKey.set(!1); })), this._setRenderedHover(void 0), this._editor.addContentWidget(this); } @@ -63006,7 +63006,7 @@ let nD = (uh = class extends Zfe { super.dispose(), (e = this._renderedHover) == null || e.dispose(), this._editor.removeContentWidget(this); } getId() { - return ea.ID; + return sc.ID; } static _applyDimensions(e, t, i) { const n = typeof t == "number" ? `${t}px` : t, o = typeof i == "number" ? `${i}px` : i; @@ -63014,11 +63014,11 @@ let nD = (uh = class extends Zfe { } _setContentsDomNodeDimensions(e, t) { const i = this._hover.contentsDomNode; - return ea._applyDimensions(i, e, t); + return sc._applyDimensions(i, e, t); } _setContainerDomNodeDimensions(e, t) { const i = this._hover.containerDomNode; - return ea._applyDimensions(i, e, t); + return sc._applyDimensions(i, e, t); } _setHoverWidgetDimensions(e, t) { this._setContentsDomNodeDimensions(e, t), this._setContainerDomNodeDimensions(e, t), this._layoutContentWidget(); @@ -63028,7 +63028,7 @@ let nD = (uh = class extends Zfe { e.style.maxWidth = n, e.style.maxHeight = o; } _setHoverWidgetMaxDimensions(e, t) { - ea._applyMaxDimensions(this._hover.contentsDomNode, e, t), ea._applyMaxDimensions(this._hover.containerDomNode, e, t), this._hover.containerDomNode.style.setProperty("--vscode-hover-maxWidth", typeof e == "number" ? `${e}px` : e), this._layoutContentWidget(); + sc._applyMaxDimensions(this._hover.contentsDomNode, e, t), sc._applyMaxDimensions(this._hover.containerDomNode, e, t), this._hover.containerDomNode.style.setProperty("--vscode-hover-maxWidth", typeof e == "number" ? `${e}px` : e), this._layoutContentWidget(); } _setAdjustedHoverWidgetDimensions(e) { this._setHoverWidgetMaxDimensions("none", "none"); @@ -63037,10 +63037,10 @@ let nD = (uh = class extends Zfe { } _updateResizableNodeMaxDimensions() { const e = this._findMaximumRenderingWidth() ?? 1 / 0, t = this._findMaximumRenderingHeight() ?? 1 / 0; - this._resizableNode.maxSize = new Lt(e, t), this._setHoverWidgetMaxDimensions(e, t); + this._resizableNode.maxSize = new Xt(e, t), this._setHoverWidgetMaxDimensions(e, t); } _resize(e) { - ea._lastDimensions = new Lt(e.width, e.height), this._setAdjustedHoverWidgetDimensions(e), this._resizableNode.layout(e.height, e.width), this._updateResizableNodeMaxDimensions(), this._hover.scrollbar.scanDomNode(), this._editor.layoutContentWidget(this), this._onDidResize.fire(); + sc._lastDimensions = new Xt(e.width, e.height), this._setAdjustedHoverWidgetDimensions(e), this._resizableNode.layout(e.height, e.width), this._updateResizableNodeMaxDimensions(), this._hover.scrollbar.scanDomNode(), this._editor.layoutContentWidget(this), this._onDidResize.fire(); } _findAvailableSpaceVertically() { var t; @@ -63052,7 +63052,7 @@ let nD = (uh = class extends Zfe { const e = this._findAvailableSpaceVertically(); if (!e) return; - let t = Ife; + let t = WZe; return Array.from(this._hover.contentsDomNode.children).forEach((i) => { t += i.clientHeight; }), Math.min(e, t); @@ -63066,7 +63066,7 @@ let nD = (uh = class extends Zfe { if (!this._editor || !this._editor.hasModel()) return; const e = this._isHoverTextOverflowing(), t = typeof this._contentWidth > "u" ? 0 : this._contentWidth - 2; - return e || this._hover.containerDomNode.clientWidth < t ? Wh(this._hover.containerDomNode.ownerDocument.body).width - 14 : this._hover.containerDomNode.clientWidth + 2; + return e || this._hover.containerDomNode.clientWidth < t ? Yh(this._hover.containerDomNode.ownerDocument.body).width - 14 : this._hover.containerDomNode.clientWidth + 2; } isMouseGettingCloser(e, t) { if (!this._renderedHover) @@ -63074,8 +63074,8 @@ let nD = (uh = class extends Zfe { if (this._renderedHover.initialMousePosX === void 0 || this._renderedHover.initialMousePosY === void 0) return this._renderedHover.initialMousePosX = e, this._renderedHover.initialMousePosY = t, !1; const i = yi(this.getDomNode()); - this._renderedHover.closestMouseDistance === void 0 && (this._renderedHover.closestMouseDistance = a3(this._renderedHover.initialMousePosX, this._renderedHover.initialMousePosY, i.left, i.top, i.width, i.height)); - const n = a3(e, t, i.left, i.top, i.width, i.height); + this._renderedHover.closestMouseDistance === void 0 && (this._renderedHover.closestMouseDistance = MA(this._renderedHover.initialMousePosX, this._renderedHover.initialMousePosY, i.left, i.top, i.width, i.height)); + const n = MA(e, t, i.left, i.top, i.width, i.height); return n > this._renderedHover.closestMouseDistance + 4 ? !1 : (this._renderedHover.closestMouseDistance = Math.min(this._renderedHover.closestMouseDistance, n), !0); } _setRenderedHover(e) { @@ -63097,7 +63097,7 @@ let nD = (uh = class extends Zfe { this._editor.layoutContentWidget(this), this._hover.onContentsChanged(); } _updateMaxDimensions() { - const e = Math.max(this._editor.getLayoutInfo().height / 4, 250, ea._lastDimensions.height), t = Math.max(this._editor.getLayoutInfo().width * 0.66, 500, ea._lastDimensions.width); + const e = Math.max(this._editor.getLayoutInfo().height / 4, 250, sc._lastDimensions.height), t = Math.max(this._editor.getLayoutInfo().width * 0.66, 500, sc._lastDimensions.width); this._setHoverWidgetMaxDimensions(t, e); } _render(e) { @@ -63115,39 +63115,39 @@ let nD = (uh = class extends Zfe { } : null; } show(e) { - var r; + var l; if (!this._editor || !this._editor.hasModel()) return; this._render(e); - const t = Lc(this._hover.containerDomNode), i = e.showAtPosition; + const t = Sd(this._hover.containerDomNode), i = e.showAtPosition; this._positionPreference = this._findPositionPreference(t, i) ?? 1, this.onContentsChanged(), e.shouldFocus && this._hover.containerDomNode.focus(), this._onDidResize.fire(); - const o = this._hover.containerDomNode.ownerDocument.activeElement === this._hover.containerDomNode && wQ(this._configurationService.getValue("accessibility.verbosity.hover") === !0 && this._accessibilityService.isScreenReaderOptimized(), ((r = this._keybindingService.lookupKeybinding("editor.action.accessibleView")) == null ? void 0 : r.getAriaLabel()) ?? ""); + const o = this._hover.containerDomNode.ownerDocument.activeElement === this._hover.containerDomNode && t4(this._configurationService.getValue("accessibility.verbosity.hover") === !0 && this._accessibilityService.isScreenReaderOptimized(), ((l = this._keybindingService.lookupKeybinding("editor.action.accessibleView")) == null ? void 0 : l.getAriaLabel()) ?? ""); o && (this._hover.contentsDomNode.ariaLabel = this._hover.contentsDomNode.textContent + ", " + o); } hide() { if (!this._renderedHover) return; const e = this._renderedHover.shouldFocus || this._hoverFocusedKey.get(); - this._setRenderedHover(void 0), this._resizableNode.maxSize = new Lt(1 / 0, 1 / 0), this._resizableNode.clearSashHoverState(), this._hoverFocusedKey.set(!1), this._editor.layoutContentWidget(this), e && this._editor.focus(); + this._setRenderedHover(void 0), this._resizableNode.maxSize = new Xt(1 / 0, 1 / 0), this._resizableNode.clearSashHoverState(), this._hoverFocusedKey.set(!1), this._editor.layoutContentWidget(this), e && this._editor.focus(); } _removeConstraintsRenderNormally() { const e = this._editor.getLayoutInfo(); this._resizableNode.layout(e.height, e.width), this._setHoverWidgetDimensions("auto", "auto"); } setMinimumDimensions(e) { - this._minimumSize = new Lt(Math.max(this._minimumSize.width, e.width), Math.max(this._minimumSize.height, e.height)), this._updateMinimumWidth(); + this._minimumSize = new Xt(Math.max(this._minimumSize.width, e.width), Math.max(this._minimumSize.height, e.height)), this._updateMinimumWidth(); } _updateMinimumWidth() { const e = typeof this._contentWidth > "u" ? this._minimumSize.width : Math.min(this._contentWidth, this._minimumSize.width); - this._resizableNode.minSize = new Lt(e, this._minimumSize.height); + this._resizableNode.minSize = new Xt(e, this._minimumSize.height); } onContentsChanged() { var n; this._removeConstraintsRenderNormally(); const e = this._hover.containerDomNode; - let t = Lc(e), i = $s(e); - if (this._resizableNode.layout(t, i), this._setHoverWidgetDimensions(i, t), t = Lc(e), i = $s(e), this._contentWidth = i, this._updateMinimumWidth(), this._resizableNode.layout(t, i), (n = this._renderedHover) != null && n.showAtPosition) { - const o = Lc(this._hover.containerDomNode); + let t = Sd(e), i = to(e); + if (this._resizableNode.layout(t, i), this._setHoverWidgetDimensions(i, t), t = Sd(e), i = to(e), this._contentWidth = i, this._updateMinimumWidth(), this._resizableNode.layout(t, i), (n = this._renderedHover) != null && n.showAtPosition) { + const o = Sd(this._hover.containerDomNode); this._positionPreference = this._findPositionPreference(o, this._renderedHover.showAtPosition); } this._layoutContentWidget(); @@ -63171,11 +63171,11 @@ let nD = (uh = class extends Zfe { } scrollLeft() { const e = this._hover.scrollbar.getScrollPosition().scrollLeft; - this._hover.scrollbar.setScrollPosition({ scrollLeft: e - l3 }); + this._hover.scrollbar.setScrollPosition({ scrollLeft: e - TA }); } scrollRight() { const e = this._hover.scrollbar.getScrollPosition().scrollLeft; - this._hover.scrollbar.setScrollPosition({ scrollLeft: e + l3 }); + this._hover.scrollbar.setScrollPosition({ scrollLeft: e + TA }); } pageUp() { const e = this._hover.scrollbar.getScrollPosition().scrollTop, t = this._hover.scrollbar.getScrollDimensions().height; @@ -63191,18 +63191,18 @@ let nD = (uh = class extends Zfe { goToBottom() { this._hover.scrollbar.setScrollPosition({ scrollTop: this._hover.scrollbar.getScrollDimensions().scrollHeight }); } -}, ea = uh, uh.ID = "editor.contrib.resizableContentHoverWidget", uh._lastDimensions = new Lt(0, 0), uh); -nD = ea = _fe([ - _S(1, _e), - _S(2, Ke), - _S(3, yo), - _S(4, xt) -], nD); -function a3(s, e, t, i, n, o) { - const r = t + n / 2, l = i + o / 2, a = Math.max(Math.abs(s - r) - n / 2, 0), c = Math.max(Math.abs(e - l) - o / 2, 0); - return Math.sqrt(a * a + c * c); -} -class Zx { +}, sc = gh, gh.ID = "editor.contrib.resizableContentHoverWidget", gh._lastDimensions = new Xt(0, 0), gh); +LM = sc = yZe([ + D1(1, xe), + D1(2, Qe), + D1(3, Wo), + D1(4, Lt) +], LM); +function MA(s, e, t, i, n, o) { + const l = t + n / 2, r = i + o / 2, c = Math.max(Math.abs(s - l) - n / 2, 0), d = Math.max(Math.abs(e - r) - o / 2, 0); + return Math.sqrt(c * c + d * d); +} +class FL { get anchor() { return this._anchor; } @@ -63237,14 +63237,14 @@ class Zx { if (n > i.getLineCount()) return []; const o = i.getLineMaxColumn(n); - return e.getLineDecorations(n).filter((r) => { - if (r.options.isWholeLine) + return e.getLineDecorations(n).filter((l) => { + if (l.options.isWholeLine) return !0; - const l = r.range.startLineNumber === n ? r.range.startColumn : 1, a = r.range.endLineNumber === n ? r.range.endColumn : o; - if (r.options.showIfCollapsed) { - if (l > t.range.startColumn + 1 || t.range.endColumn - 1 > a) + const r = l.range.startLineNumber === n ? l.range.startColumn : 1, c = l.range.endLineNumber === n ? l.range.endColumn : o; + if (l.options.showIfCollapsed) { + if (r > t.range.startColumn + 1 || t.range.endColumn - 1 > c) return !1; - } else if (l > t.range.startColumn || t.range.endColumn > a) + } else if (r > t.range.startColumn || t.range.endColumn > c) return !1; return !0; }); @@ -63252,30 +63252,30 @@ class Zx { computeAsync(e) { const t = this._anchor; if (!this._editor.hasModel() || !t) - return Ro.EMPTY; - const i = Zx._getLineDecorations(this._editor, t); - return Ro.merge(this._participants.map((n) => n.computeAsync ? n.computeAsync(t, i, e) : Ro.EMPTY)); + return Eo.EMPTY; + const i = FL._getLineDecorations(this._editor, t); + return Eo.merge(this._participants.map((n) => n.computeAsync ? n.computeAsync(t, i, e) : Eo.EMPTY)); } computeSync() { if (!this._editor.hasModel() || !this._anchor) return []; - const e = Zx._getLineDecorations(this._editor, this._anchor); + const e = FL._getLineDecorations(this._editor, this._anchor); let t = []; for (const i of this._participants) t = t.concat(i.computeSync(this._anchor, e)); - return Or(t); + return _l(t); } } -class LQ { +class s4 { constructor(e, t, i) { this.anchor = e, this.hoverParts = t, this.isComplete = i; } filter(e) { const t = this.hoverParts.filter((i) => i.isValidForHoverAnchor(e)); - return t.length === this.hoverParts.length ? this : new Nfe(this, this.anchor, t, this.isComplete); + return t.length === this.hoverParts.length ? this : new GZe(this, this.anchor, t, this.isComplete); } } -class Nfe extends LQ { +class GZe extends s4 { constructor(e, t, i, n) { super(t, i, n), this.original = e; } @@ -63283,165 +63283,165 @@ class Nfe extends LQ { return this.original.filter(e); } } -var Wfe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var XZe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, vfe = function(s, e) { +}, VZe = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const c3 = ce; -let _x = class extends R { +const YA = de; +let zL = class extends J { get hasContent() { return this._hasContent; } constructor(e) { - super(), this._keybindingService = e, this.actions = [], this._hasContent = !1, this.hoverElement = c3("div.hover-row.status-bar"), this.hoverElement.tabIndex = 0, this.actionsElement = Q(this.hoverElement, c3("div.actions")); + super(), this._keybindingService = e, this.actions = [], this._hasContent = !1, this.hoverElement = YA("div.hover-row.status-bar"), this.hoverElement.tabIndex = 0, this.actionsElement = O(this.hoverElement, YA("div.actions")); } addAction(e) { const t = this._keybindingService.lookupKeybinding(e.commandId), i = t ? t.getLabel() : null; this._hasContent = !0; - const n = this._register(RI.render(this.actionsElement, e, i)); + const n = this._register(qx.render(this.actionsElement, e, i)); return this.actions.push(n), n; } append(e) { - const t = Q(this.actionsElement, e); + const t = O(this.actionsElement, e); return this._hasContent = !0, t; } }; -_x = Wfe([ - vfe(0, xt) -], _x); -class Tfe { +zL = XZe([ + VZe(0, Lt) +], zL); +class LZe { constructor(e, t, i) { this.provider = e, this.hover = t, this.ordinal = i; } } -async function Dfe(s, e, t, i, n) { - const o = await Promise.resolve(s.provideHover(t, i, n)).catch(wi); - if (!(!o || !Vfe(o))) - return new Tfe(s, o, e); +async function IZe(s, e, t, i, n) { + const o = await Promise.resolve(s.provideHover(t, i, n)).catch(Wi); + if (!(!o || !SZe(o))) + return new LZe(s, o, e); } -function c5(s, e, t, i, n = !1) { - const r = s.ordered(e, n).map((l, a) => Dfe(l, a, e, t, i)); - return Ro.fromPromises(r).coalesce(); +function YH(s, e, t, i, n = !1) { + const l = s.ordered(e, n).map((r, c) => IZe(r, c, e, t, i)); + return Eo.fromPromises(l).coalesce(); } -function AQ(s, e, t, i, n = !1) { - return c5(s, e, t, i, n).map((o) => o.hover).toPromise(); +function o4(s, e, t, i, n = !1) { + return YH(s, e, t, i, n).map((o) => o.hover).toPromise(); } -zs("_executeHoverProvider", (s, e, t) => { - const i = s.get(ge); - return AQ(i.hoverProvider, e, t, Ye.None); +Ks("_executeHoverProvider", (s, e, t) => { + const i = s.get(me); + return o4(i.hoverProvider, e, t, Fe.None); }); -zs("_executeHoverProvider_recursive", (s, e, t) => { - const i = s.get(ge); - return AQ(i.hoverProvider, e, t, Ye.None, !0); +Ks("_executeHoverProvider_recursive", (s, e, t) => { + const i = s.get(me); + return o4(i.hoverProvider, e, t, Fe.None, !0); }); -function Vfe(s) { +function SZe(s) { const e = typeof s.range < "u", t = typeof s.contents < "u" && s.contents && s.contents.length > 0; return e && t; } -var kfe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var xZe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, pu = function(s, e) { +}, yu = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const Hp = ce, Gfe = Bt("hover-increase-verbosity", te.add, p("increaseHoverVerbosity", "Icon for increaseing hover verbosity.")), Rfe = Bt("hover-decrease-verbosity", te.remove, p("decreaseHoverVerbosity", "Icon for decreasing hover verbosity.")); -class Rr { - constructor(e, t, i, n, o, r = void 0) { - this.owner = e, this.range = t, this.contents = i, this.isBeforeContent = n, this.ordinal = o, this.source = r; +const qp = de, CZe = Kt("hover-increase-verbosity", te.add, p("increaseHoverVerbosity", "Icon for increaseing hover verbosity.")), RZe = Kt("hover-decrease-verbosity", te.remove, p("decreaseHoverVerbosity", "Icon for decreasing hover verbosity.")); +class Dl { + constructor(e, t, i, n, o, l = void 0) { + this.owner = e, this.range = t, this.contents = i, this.isBeforeContent = n, this.ordinal = o, this.source = l; } isValidForHoverAnchor(e) { return e.type === 1 && this.range.startColumn <= e.range.startColumn && this.range.endColumn >= e.range.endColumn; } } -class xQ { +class l4 { constructor(e, t, i) { this.hover = e, this.hoverProvider = t, this.hoverPosition = i; } supportsVerbosityAction(e) { switch (e) { - case io.Increase: + case so.Increase: return this.hover.canIncreaseVerbosity ?? !1; - case io.Decrease: + case so.Decrease: return this.hover.canDecreaseVerbosity ?? !1; } } } -let T1 = class { - constructor(e, t, i, n, o, r, l, a) { - this._editor = e, this._languageService = t, this._openerService = i, this._configurationService = n, this._languageFeaturesService = o, this._keybindingService = r, this._hoverService = l, this._commandService = a, this.hoverOrdinal = 3; +let KW = class { + constructor(e, t, i, n, o, l, r, c) { + this._editor = e, this._languageService = t, this._openerService = i, this._configurationService = n, this._languageFeaturesService = o, this._keybindingService = l, this._hoverService = r, this._commandService = c, this.hoverOrdinal = 3; } createLoadingMessage(e) { - return new Rr(this, e.range, [new Vn().appendText(p("modesContentHover.loading", "Loading..."))], !1, 2e3); + return new Dl(this, e.range, [new kn().appendText(p("modesContentHover.loading", "Loading..."))], !1, 2e3); } computeSync(e, t) { if (!this._editor.hasModel() || e.type !== 1) return []; - const i = this._editor.getModel(), n = e.range.startLineNumber, o = i.getLineMaxColumn(n), r = []; - let l = 1e3; - const a = i.getLineLength(n), c = i.getLanguageIdAtPosition(e.range.startLineNumber, e.range.startColumn), d = this._editor.getOption( + const i = this._editor.getModel(), n = e.range.startLineNumber, o = i.getLineMaxColumn(n), l = []; + let r = 1e3; + const c = i.getLineLength(n), d = i.getLanguageIdAtPosition(e.range.startLineNumber, e.range.startColumn), a = this._editor.getOption( 118 /* EditorOption.stopRenderingLineAfter */ ), h = this._configurationService.getValue("editor.maxTokenizationLineLength", { - overrideIdentifier: c + overrideIdentifier: d }); let u = !1; - d >= 0 && a > d && e.range.startColumn >= d && (u = !0, r.push(new Rr(this, e.range, [{ + a >= 0 && c > a && e.range.startColumn >= a && (u = !0, l.push(new Dl(this, e.range, [{ value: p("stopped rendering", "Rendering paused for long line for performance reasons. This can be configured via `editor.stopRenderingLineAfter`.") - }], !1, l++))), !u && typeof h == "number" && a >= h && r.push(new Rr(this, e.range, [{ + }], !1, r++))), !u && typeof h == "number" && c >= h && l.push(new Dl(this, e.range, [{ value: p("too many characters", "Tokenization is skipped for long lines for performance reasons. This can be configured via `editor.maxTokenizationLineLength`.") - }], !1, l++)); - let g = !1; - for (const m of t) { - const f = m.range.startLineNumber === n ? m.range.startColumn : 1, b = m.range.endLineNumber === n ? m.range.endColumn : o, y = m.options.hoverMessage; - if (!y || Cb(y)) + }], !1, r++)); + let m = !1; + for (const b of t) { + const g = b.range.startLineNumber === n ? b.range.startColumn : 1, Z = b.range.endLineNumber === n ? b.range.endColumn : o, f = b.options.hoverMessage; + if (!f || SZ(f)) continue; - m.options.beforeContentClassName && (g = !0); - const w = new M(e.range.startLineNumber, f, e.range.startLineNumber, b); - r.push(new Rr(this, w, LE(y), g, l++)); + b.options.beforeContentClassName && (m = !0); + const y = new I(e.range.startLineNumber, g, e.range.startLineNumber, Z); + l.push(new Dl(this, y, Bv(f), m, r++)); } - return r; + return l; } computeAsync(e, t, i) { if (!this._editor.hasModel() || e.type !== 1) - return Ro.EMPTY; + return Eo.EMPTY; const n = this._editor.getModel(), o = this._languageFeaturesService.hoverProvider; - return o.has(n) ? this._getMarkdownHovers(o, n, e, i) : Ro.EMPTY; + return o.has(n) ? this._getMarkdownHovers(o, n, e, i) : Eo.EMPTY; } _getMarkdownHovers(e, t, i, n) { const o = i.range.getStartPosition(); - return c5(e, t, o, n).filter((a) => !Cb(a.hover.contents)).map((a) => { - const c = a.hover.range ? M.lift(a.hover.range) : i.range, d = new xQ(a.hover, a.provider, o); - return new Rr(this, c, a.hover.contents, !1, a.ordinal, d); + return YH(e, t, o, n).filter((c) => !SZ(c.hover.contents)).map((c) => { + const d = c.hover.range ? I.lift(c.hover.range) : i.range, a = new l4(c.hover, c.provider, o); + return new Dl(this, d, c.hover.contents, !1, c.ordinal, a); }); } renderHoverParts(e, t) { - return this._renderedHoverParts = new Efe(t, e.fragment, this, this._editor, this._languageService, this._openerService, this._commandService, this._keybindingService, this._hoverService, this._configurationService, e.onContentsChanged), this._renderedHoverParts; + return this._renderedHoverParts = new NZe(t, e.fragment, this, this._editor, this._languageService, this._openerService, this._commandService, this._keybindingService, this._hoverService, this._configurationService, e.onContentsChanged), this._renderedHoverParts; } updateMarkdownHoverVerbosityLevel(e, t, i) { var n; return Promise.resolve((n = this._renderedHoverParts) == null ? void 0 : n.updateMarkdownHoverPartVerbosityLevel(e, t, i)); } }; -T1 = kfe([ - pu(1, ri), - pu(2, Bs), - pu(3, Ke), - pu(4, ge), - pu(5, xt), - pu(6, Pa), - pu(7, Qt) -], T1); -class IS { +KW = xZe([ + yu(1, ri), + yu(2, Ps), + yu(3, Qe), + yu(4, me), + yu(5, Lt), + yu(6, Bc), + yu(7, Ot) +], KW); +class F1 { constructor(e, t, i) { this.hoverPart = e, this.hoverElement = t, this.disposables = i; } @@ -63449,9 +63449,9 @@ class IS { this.disposables.dispose(); } } -class Efe { - constructor(e, t, i, n, o, r, l, a, c, d, h) { - this._hoverParticipant = i, this._editor = n, this._languageService = o, this._openerService = r, this._commandService = l, this._keybindingService = a, this._hoverService = c, this._configurationService = d, this._onFinishedRendering = h, this._ongoingHoverOperations = /* @__PURE__ */ new Map(), this._disposables = new U(), this.renderedHoverParts = this._renderHoverParts(e, t, this._onFinishedRendering), this._disposables.add(Ce(() => { +class NZe { + constructor(e, t, i, n, o, l, r, c, d, a, h) { + this._hoverParticipant = i, this._editor = n, this._languageService = o, this._openerService = l, this._commandService = r, this._keybindingService = c, this._hoverService = d, this._configurationService = a, this._onFinishedRendering = h, this._ongoingHoverOperations = /* @__PURE__ */ new Map(), this._disposables = new _(), this.renderedHoverParts = this._renderHoverParts(e, t, this._onFinishedRendering), this._disposables.add(We(() => { this.renderedHoverParts.forEach((u) => { u.dispose(); }), this._ongoingHoverOperations.forEach((u) => { @@ -63460,36 +63460,36 @@ class Efe { })); } _renderHoverParts(e, t, i) { - return e.sort(gs((n) => n.ordinal, zr)), e.map((n) => { + return e.sort(ps((n) => n.ordinal, Ul)), e.map((n) => { const o = this._renderHoverPart(n, i); return t.appendChild(o.hoverElement), o; }); } _renderHoverPart(e, t) { - const i = this._renderMarkdownHover(e, t), n = i.hoverElement, o = e.source, r = new U(); - if (r.add(i), !o) - return new IS(e, n, r); - const l = o.supportsVerbosityAction(io.Increase), a = o.supportsVerbosityAction(io.Decrease); - if (!l && !a) - return new IS(e, n, r); - const c = Hp("div.verbosity-actions"); - return n.prepend(c), r.add(this._renderHoverExpansionAction(c, io.Increase, l)), r.add(this._renderHoverExpansionAction(c, io.Decrease, a)), new IS(e, n, r); + const i = this._renderMarkdownHover(e, t), n = i.hoverElement, o = e.source, l = new _(); + if (l.add(i), !o) + return new F1(e, n, l); + const r = o.supportsVerbosityAction(so.Increase), c = o.supportsVerbosityAction(so.Decrease); + if (!r && !c) + return new F1(e, n, l); + const d = qp("div.verbosity-actions"); + return n.prepend(d), l.add(this._renderHoverExpansionAction(d, so.Increase, r)), l.add(this._renderHoverExpansionAction(d, so.Decrease, c)), new F1(e, n, l); } _renderMarkdownHover(e, t) { - return MQ(this._editor, e, this._languageService, this._openerService, t); + return r4(this._editor, e, this._languageService, this._openerService, t); } _renderHoverExpansionAction(e, t, i) { - const n = new U(), o = t === io.Increase, r = Q(e, Hp(Ze.asCSSSelector(o ? Gfe : Rfe))); - r.tabIndex = 0; - const l = new Ab("mouse", !1, { target: e, position: { + const n = new _(), o = t === so.Increase, l = O(e, qp(Se.asCSSSelector(o ? CZe : RZe))); + l.tabIndex = 0; + const r = new RZ("mouse", !1, { target: e, position: { hoverPosition: 0 /* HoverPosition.LEFT */ } }, this._configurationService, this._hoverService); - if (n.add(this._hoverService.setupManagedHover(l, r, Ffe(this._keybindingService, t))), !i) - return r.classList.add("disabled"), n; - r.classList.add("enabled"); - const a = () => this._commandService.executeCommand(t === io.Increase ? VI : kI); - return n.add(new CQ(r, a)), n.add(new SQ(r, a, [ + if (n.add(this._hoverService.setupManagedHover(r, l, TZe(this._keybindingService, t))), !i) + return l.classList.add("disabled"), n; + l.classList.add("enabled"); + const c = () => this._commandService.executeCommand(t === so.Increase ? Qx : Ox); + return n.add(new i4(l, c)), n.add(new n4(l, c, [ 3, 10 /* KeyCode.Space */ @@ -63499,40 +63499,40 @@ class Efe { const n = this._editor.getModel(); if (!n) return; - const o = this._getRenderedHoverPartAtIndex(t), r = o == null ? void 0 : o.hoverPart.source; - if (!o || !(r != null && r.supportsVerbosityAction(e))) + const o = this._getRenderedHoverPartAtIndex(t), l = o == null ? void 0 : o.hoverPart.source; + if (!o || !(l != null && l.supportsVerbosityAction(e))) return; - const l = await this._fetchHover(r, n, e); - if (!l) + const r = await this._fetchHover(l, n, e); + if (!r) return; - const a = new xQ(l, r.hoverProvider, r.hoverPosition), c = o.hoverPart, d = new Rr(this._hoverParticipant, c.range, l.contents, c.isBeforeContent, c.ordinal, a), h = this._renderHoverPart(d, this._onFinishedRendering); - return this._replaceRenderedHoverPartAtIndex(t, h, d), i && this._focusOnHoverPartWithIndex(t), { - hoverPart: d, + const c = new l4(r, l.hoverProvider, l.hoverPosition), d = o.hoverPart, a = new Dl(this._hoverParticipant, d.range, r.contents, d.isBeforeContent, d.ordinal, c), h = this._renderHoverPart(a, this._onFinishedRendering); + return this._replaceRenderedHoverPartAtIndex(t, h, a), i && this._focusOnHoverPartWithIndex(t), { + hoverPart: a, hoverElement: h.hoverElement }; } async _fetchHover(e, t, i) { - let n = i === io.Increase ? 1 : -1; - const o = e.hoverProvider, r = this._ongoingHoverOperations.get(o); - r && (r.tokenSource.cancel(), n += r.verbosityDelta); - const l = new mi(); - this._ongoingHoverOperations.set(o, { verbosityDelta: n, tokenSource: l }); - const a = { verbosityRequest: { verbosityDelta: n, previousHover: e.hover } }; - let c; + let n = i === so.Increase ? 1 : -1; + const o = e.hoverProvider, l = this._ongoingHoverOperations.get(o); + l && (l.tokenSource.cancel(), n += l.verbosityDelta); + const r = new pi(); + this._ongoingHoverOperations.set(o, { verbosityDelta: n, tokenSource: r }); + const c = { verbosityRequest: { verbosityDelta: n, previousHover: e.hover } }; + let d; try { - c = await Promise.resolve(o.provideHover(t, e.hoverPosition, l.token, a)); - } catch (d) { - wi(d); + d = await Promise.resolve(o.provideHover(t, e.hoverPosition, r.token, c)); + } catch (a) { + Wi(a); } - return l.dispose(), this._ongoingHoverOperations.delete(o), c; + return r.dispose(), this._ongoingHoverOperations.delete(o), d; } _replaceRenderedHoverPartAtIndex(e, t, i) { if (e >= this.renderedHoverParts.length || e < 0) return; - const n = this.renderedHoverParts[e], o = n.hoverElement, r = t.hoverElement, l = Array.from(r.children); - o.replaceChildren(...l); - const a = new IS(i, o, t.disposables); - o.focus(), n.dispose(), this.renderedHoverParts[e] = a; + const n = this.renderedHoverParts[e], o = n.hoverElement, l = t.hoverElement, r = Array.from(l.children); + o.replaceChildren(...r); + const c = new F1(i, o, t.disposables); + o.focus(), n.dispose(), this.renderedHoverParts[e] = c; } _focusOnHoverPartWithIndex(e) { this.renderedHoverParts[e].hoverElement.focus(); @@ -63544,51 +63544,51 @@ class Efe { this._disposables.dispose(); } } -function Xfe(s, e, t, i, n) { - e.sort(gs((r) => r.ordinal, zr)); +function wZe(s, e, t, i, n) { + e.sort(ps((l) => l.ordinal, Ul)); const o = []; - for (const r of e) - o.push(MQ(t, r, i, n, s.onContentsChanged)); - return new Zm(o); -} -function MQ(s, e, t, i, n) { - const o = new U(), r = Hp("div.hover-row"), l = Hp("div.hover-row-contents"); - r.appendChild(l); - const a = e.contents; - for (const d of a) { - if (Cb(d)) + for (const l of e) + o.push(r4(t, l, i, n, s.onContentsChanged)); + return new wb(o); +} +function r4(s, e, t, i, n) { + const o = new _(), l = qp("div.hover-row"), r = qp("div.hover-row-contents"); + l.appendChild(r); + const c = e.contents; + for (const a of c) { + if (SZ(a)) continue; - const h = Hp("div.markdown-hover"), u = Q(h, Hp("div.hover-contents")), g = o.add(new Qc({ editor: s }, t, i)); - o.add(g.onDidRenderAsync(() => { + const h = qp("div.markdown-hover"), u = O(h, qp("div.hover-contents")), m = o.add(new ea({ editor: s }, t, i)); + o.add(m.onDidRenderAsync(() => { u.className = "hover-contents code-hover-contents", n(); })); - const m = o.add(g.render(d)); - u.appendChild(m.element), l.appendChild(h); + const b = o.add(m.render(a)); + u.appendChild(b.element), r.appendChild(h); } return { hoverPart: e, - hoverElement: r, + hoverElement: l, dispose() { o.dispose(); } }; } -function Ffe(s, e) { +function TZe(s, e) { switch (e) { - case io.Increase: { - const t = s.lookupKeybinding(VI); + case so.Increase: { + const t = s.lookupKeybinding(Qx); return t ? p("increaseVerbosityWithKb", "Increase Hover Verbosity ({0})", t.getLabel()) : p("increaseVerbosity", "Increase Hover Verbosity"); } - case io.Decrease: { - const t = s.lookupKeybinding(kI); + case so.Decrease: { + const t = s.lookupKeybinding(Ox); return t ? p("decreaseVerbosityWithKb", "Decrease Hover Verbosity ({0})", t.getLabel()) : p("decreaseVerbosity", "Decrease Hover Verbosity"); } } } -class si { +class oi { static insert(e, t) { return { - range: new M(e.lineNumber, e.column, e.lineNumber, e.column), + range: new I(e.lineNumber, e.column, e.lineNumber, e.column), text: t, forceMoveMarkers: !0 }; @@ -63613,20 +63613,20 @@ class si { }; } } -function sD(s, e) { +function IM(s, e) { return !!s[e]; } -class ZW { +class zR { constructor(e, t) { - this.target = e.target, this.isLeftClick = e.event.leftButton, this.isMiddleClick = e.event.middleButton, this.isRightClick = e.event.rightButton, this.hasTriggerModifier = sD(e.event, t.triggerModifier), this.hasSideBySideModifier = sD(e.event, t.triggerSideBySideModifier), this.isNoneOrSingleMouseDown = e.event.detail <= 1; + this.target = e.target, this.isLeftClick = e.event.leftButton, this.isMiddleClick = e.event.middleButton, this.isRightClick = e.event.rightButton, this.hasTriggerModifier = IM(e.event, t.triggerModifier), this.hasSideBySideModifier = IM(e.event, t.triggerSideBySideModifier), this.isNoneOrSingleMouseDown = e.event.detail <= 1; } } -class d3 { +class kA { constructor(e, t) { - this.keyCodeIsTriggerKey = e.keyCode === t.triggerKey, this.keyCodeIsSideBySideKey = e.keyCode === t.triggerSideBySideKey, this.hasTriggerModifier = sD(e, t.triggerModifier); + this.keyCodeIsTriggerKey = e.keyCode === t.triggerKey, this.keyCodeIsSideBySideKey = e.keyCode === t.triggerSideBySideKey, this.hasTriggerModifier = IM(e, t.triggerModifier); } } -class NS { +class z1 { constructor(e, t, i, n) { this.triggerKey = e, this.triggerModifier = t, this.triggerSideBySideKey = i, this.triggerSideBySideModifier = n; } @@ -63634,12 +63634,12 @@ class NS { return this.triggerKey === e.triggerKey && this.triggerModifier === e.triggerModifier && this.triggerSideBySideKey === e.triggerSideBySideKey && this.triggerSideBySideModifier === e.triggerSideBySideModifier; } } -function h3(s) { - return s === "altKey" ? qe ? new NS(57, "metaKey", 6, "altKey") : new NS(5, "ctrlKey", 6, "altKey") : qe ? new NS(6, "altKey", 57, "metaKey") : new NS(6, "altKey", 5, "ctrlKey"); +function vA(s) { + return s === "altKey" ? qe ? new z1(57, "metaKey", 6, "altKey") : new z1(5, "ctrlKey", 6, "altKey") : qe ? new z1(6, "altKey", 57, "metaKey") : new z1(6, "altKey", 5, "ctrlKey"); } -class EI extends R { +class $x extends J { constructor(e, t) { - super(), this._onMouseMoveOrRelevantKeyDown = this._register(new k()), this.onMouseMoveOrRelevantKeyDown = this._onMouseMoveOrRelevantKeyDown.event, this._onExecute = this._register(new k()), this.onExecute = this._onExecute.event, this._onCancel = this._register(new k()), this.onCancel = this._onCancel.event, this._editor = e, this._extractLineNumberFromMouseEvent = (t == null ? void 0 : t.extractLineNumberFromMouseEvent) ?? ((i) => i.target.position ? i.target.position.lineNumber : 0), this._opts = h3(this._editor.getOption( + super(), this._onMouseMoveOrRelevantKeyDown = this._register(new k()), this.onMouseMoveOrRelevantKeyDown = this._onMouseMoveOrRelevantKeyDown.event, this._onExecute = this._register(new k()), this.onExecute = this._onExecute.event, this._onCancel = this._register(new k()), this.onCancel = this._onCancel.event, this._editor = e, this._extractLineNumberFromMouseEvent = (t == null ? void 0 : t.extractLineNumberFromMouseEvent) ?? ((i) => i.target.position ? i.target.position.lineNumber : 0), this._opts = vA(this._editor.getOption( 78 /* EditorOption.multiCursorModifier */ )), this._lastMouseMoveEvent = null, this._hasTriggerKeyOnMouseDown = !1, this._lineNumberOnMouseDown = 0, this._register(this._editor.onDidChangeConfiguration((i) => { @@ -63647,7 +63647,7 @@ class EI extends R { 78 /* EditorOption.multiCursorModifier */ )) { - const n = h3(this._editor.getOption( + const n = vA(this._editor.getOption( 78 /* EditorOption.multiCursorModifier */ )); @@ -63655,7 +63655,7 @@ class EI extends R { return; this._opts = n, this._lastMouseMoveEvent = null, this._hasTriggerKeyOnMouseDown = !1, this._lineNumberOnMouseDown = 0, this._onCancel.fire(); } - })), this._register(this._editor.onMouseMove((i) => this._onEditorMouseMove(new ZW(i, this._opts)))), this._register(this._editor.onMouseDown((i) => this._onEditorMouseDown(new ZW(i, this._opts)))), this._register(this._editor.onMouseUp((i) => this._onEditorMouseUp(new ZW(i, this._opts)))), this._register(this._editor.onKeyDown((i) => this._onEditorKeyDown(new d3(i, this._opts)))), this._register(this._editor.onKeyUp((i) => this._onEditorKeyUp(new d3(i, this._opts)))), this._register(this._editor.onMouseDrag(() => this._resetHandler())), this._register(this._editor.onDidChangeCursorSelection((i) => this._onDidChangeCursorSelection(i))), this._register(this._editor.onDidChangeModel((i) => this._resetHandler())), this._register(this._editor.onDidChangeModelContent(() => this._resetHandler())), this._register(this._editor.onDidScrollChange((i) => { + })), this._register(this._editor.onMouseMove((i) => this._onEditorMouseMove(new zR(i, this._opts)))), this._register(this._editor.onMouseDown((i) => this._onEditorMouseDown(new zR(i, this._opts)))), this._register(this._editor.onMouseUp((i) => this._onEditorMouseUp(new zR(i, this._opts)))), this._register(this._editor.onKeyDown((i) => this._onEditorKeyDown(new kA(i, this._opts)))), this._register(this._editor.onKeyUp((i) => this._onEditorKeyUp(new kA(i, this._opts)))), this._register(this._editor.onMouseDrag(() => this._resetHandler())), this._register(this._editor.onDidChangeCursorSelection((i) => this._onDidChangeCursorSelection(i))), this._register(this._editor.onDidChangeModel((i) => this._resetHandler())), this._register(this._editor.onDidChangeModelContent(() => this._resetHandler())), this._register(this._editor.onDidScrollChange((i) => { (i.scrollTopChanged || i.scrollLeftChanged) && this._resetHandler(); })); } @@ -63682,17 +63682,17 @@ class EI extends R { this._lastMouseMoveEvent = null, this._hasTriggerKeyOnMouseDown = !1, this._onCancel.fire(); } } -class ZQ { +class c4 { constructor(e, t) { this.range = e, this.direction = t; } } -class d5 { +class kH { constructor(e, t, i) { this.hint = e, this.anchor = t, this.provider = i, this._isResolved = !1; } with(e) { - const t = new d5(this.hint, e.anchor, this.provider); + const t = new kH(this.hint, e.anchor, this.provider); return t._isResolved = this._isResolved, t._currentResolve = this._currentResolve, t; } async resolve(e) { @@ -63707,38 +63707,38 @@ class d5 { const t = await Promise.resolve(this.provider.resolveInlayHint(this.hint, e)); this.hint.tooltip = (t == null ? void 0 : t.tooltip) ?? this.hint.tooltip, this.hint.label = (t == null ? void 0 : t.label) ?? this.hint.label, this.hint.textEdits = (t == null ? void 0 : t.textEdits) ?? this.hint.textEdits, this._isResolved = !0; } catch (t) { - wi(t), this._isResolved = !1; + Wi(t), this._isResolved = !1; } } } -const gf = class gf { +const yg = class yg { static async create(e, t, i, n) { - const o = [], r = e.ordered(t).reverse().map((l) => i.map(async (a) => { + const o = [], l = e.ordered(t).reverse().map((r) => i.map(async (c) => { try { - const c = await l.provideInlayHints(t, a, n); - (c != null && c.hints.length || l.onDidChangeInlayHints) && o.push([c ?? gf._emptyInlayHintList, l]); - } catch (c) { - wi(c); + const d = await r.provideInlayHints(t, c, n); + (d != null && d.hints.length || r.onDidChangeInlayHints) && o.push([d ?? yg._emptyInlayHintList, r]); + } catch (d) { + Wi(d); } })); - if (await Promise.all(r.flat()), n.isCancellationRequested || t.isDisposed()) - throw new Pr(); - return new gf(i, o, t); + if (await Promise.all(l.flat()), n.isCancellationRequested || t.isDisposed()) + throw new Pl(); + return new yg(i, o, t); } constructor(e, t, i) { - this._disposables = new U(), this.ranges = e, this.provider = /* @__PURE__ */ new Set(); + this._disposables = new _(), this.ranges = e, this.provider = /* @__PURE__ */ new Set(); const n = []; - for (const [o, r] of t) { - this._disposables.add(o), this.provider.add(r); - for (const l of o.hints) { - const a = i.validatePosition(l.position); - let c = "before"; - const d = gf._getRangeAtPosition(i, a); + for (const [o, l] of t) { + this._disposables.add(o), this.provider.add(l); + for (const r of o.hints) { + const c = i.validatePosition(r.position); + let d = "before"; + const a = yg._getRangeAtPosition(i, c); let h; - d.getStartPosition().isBefore(a) ? (h = M.fromPositions(d.getStartPosition(), a), c = "after") : (h = M.fromPositions(a, d.getEndPosition()), c = "before"), n.push(new d5(l, new ZQ(h, c), r)); + a.getStartPosition().isBefore(c) ? (h = I.fromPositions(a.getStartPosition(), c), d = "after") : (h = I.fromPositions(c, a.getEndPosition()), d = "before"), n.push(new kH(r, new c4(h, d), l)); } } - this.items = n.sort((o, r) => V.compare(o.hint.position, r.hint.position)); + this.items = n.sort((o, l) => Y.compare(o.hint.position, l.hint.position)); } dispose() { this._disposables.dispose(); @@ -63746,42 +63746,42 @@ const gf = class gf { static _getRangeAtPosition(e, t) { const i = t.lineNumber, n = e.getWordAtPosition(t); if (n) - return new M(i, n.startColumn, i, n.endColumn); + return new I(i, n.startColumn, i, n.endColumn); e.tokenization.tokenizeIfCheap(i); - const o = e.tokenization.getLineTokens(i), r = t.column - 1, l = o.findTokenIndexAtOffset(r); - let a = o.getStartOffset(l), c = o.getEndOffset(l); - return c - a === 1 && (a === r && l > 1 ? (a = o.getStartOffset(l - 1), c = o.getEndOffset(l - 1)) : c === r && l < o.getCount() - 1 && (a = o.getStartOffset(l + 1), c = o.getEndOffset(l + 1))), new M(i, a + 1, i, c + 1); + const o = e.tokenization.getLineTokens(i), l = t.column - 1, r = o.findTokenIndexAtOffset(l); + let c = o.getStartOffset(r), d = o.getEndOffset(r); + return d - c === 1 && (c === l && r > 1 ? (c = o.getStartOffset(r - 1), d = o.getEndOffset(r - 1)) : d === l && r < o.getCount() - 1 && (c = o.getStartOffset(r + 1), d = o.getEndOffset(r + 1))), new I(i, c + 1, i, d + 1); } }; -gf._emptyInlayHintList = Object.freeze({ dispose() { +yg._emptyInlayHintList = Object.freeze({ dispose() { }, hints: [] }); -let Ix = gf; -function Yfe(s) { - return Le.from({ - scheme: Ge.command, +let AL = yg; +function MZe(s) { + return Xe.from({ + scheme: ve.command, path: s.id, query: s.arguments && encodeURIComponent(JSON.stringify(s.arguments)) }).toString(); } -function zh(s) { - return s && typeof s.getEditorType == "function" ? s.getEditorType() === AC.ICodeEditor : !1; +function Ph(s) { + return s && typeof s.getEditorType == "function" ? s.getEditorType() === vG.ICodeEditor : !1; } -function zfe(s) { - return s && typeof s.getEditorType == "function" ? s.getEditorType() === AC.IDiffEditor : !1; +function YZe(s) { + return s && typeof s.getEditorType == "function" ? s.getEditorType() === vG.IDiffEditor : !1; } -var Pfe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var kZe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, $a = function(s, e) { +}, nd = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let Qr = class extends m1 { - constructor(e, t, i, n, o, r, l, a, c, d, h, u, g) { - super(e, { ...n.getRawOptions(), overflowWidgetsDomNode: n.getOverflowWidgetsDomNode() }, i, o, r, l, a, c, d, h, u, g), this._parentEditor = n, this._overwriteOptions = t, super.updateOptions(this._overwriteOptions), this._register(n.onDidChangeConfiguration((m) => this._onParentConfigurationChanged(m))); +let $l = class extends SW { + constructor(e, t, i, n, o, l, r, c, d, a, h, u, m) { + super(e, { ...n.getRawOptions(), overflowWidgetsDomNode: n.getOverflowWidgetsDomNode() }, i, o, l, r, c, d, a, h, u, m), this._parentEditor = n, this._overwriteOptions = t, super.updateOptions(this._overwriteOptions), this._register(n.onDidChangeConfiguration((b) => this._onParentConfigurationChanged(b))); } getParentEditor() { return this._parentEditor; @@ -63790,31 +63790,31 @@ let Qr = class extends m1 { super.updateOptions(this._parentEditor.getRawOptions()), super.updateOptions(this._overwriteOptions); } updateOptions(e) { - $_(this._overwriteOptions, e, !0), super.updateOptions(this._overwriteOptions); + bx(this._overwriteOptions, e, !0), super.updateOptions(this._overwriteOptions); } }; -Qr = Pfe([ - $a(4, Se), - $a(5, ft), - $a(6, Qt), - $a(7, _e), - $a(8, Pi), - $a(9, Vi), - $a(10, yo), - $a(11, li), - $a(12, ge) -], Qr); -const u3 = new K(new lt(0, 122, 204)), Bfe = { +$l = kZe([ + nd(4, Ge), + nd(5, gt), + nd(6, Ot), + nd(7, xe), + nd(8, Ki), + nd(9, vi), + nd(10, Wo), + nd(11, ci), + nd(12, me) +], $l); +const JA = new Q(new rt(0, 122, 204)), vZe = { showArrow: !0, showFrame: !0, className: "", - frameColor: u3, - arrowColor: u3, + frameColor: JA, + arrowColor: JA, keepEditorSelection: !1 -}, Ofe = "vs.editor.contrib.zoneWidget"; -class Hfe { - constructor(e, t, i, n, o, r, l, a) { - this.id = "", this.domNode = e, this.afterLineNumber = t, this.afterColumn = i, this.heightInLines = n, this.showInHiddenAreas = l, this.ordinal = a, this._onDomNodeTop = o, this._onComputedHeight = r; +}, JZe = "vs.editor.contrib.zoneWidget"; +class HZe { + constructor(e, t, i, n, o, l, r, c) { + this.id = "", this.domNode = e, this.afterLineNumber = t, this.afterColumn = i, this.heightInLines = n, this.showInHiddenAreas = r, this.ordinal = c, this._onDomNodeTop = o, this._onComputedHeight = l; } onDomNodeTop(e) { this._onDomNodeTop(e); @@ -63823,7 +63823,7 @@ class Hfe { this._onComputedHeight(e); } } -class Jfe { +class EZe { constructor(e, t) { this._id = e, this._domNode = t; } @@ -63837,12 +63837,12 @@ class Jfe { return null; } } -const NZ = class NZ { +const K2 = class K2 { constructor(e) { - this._editor = e, this._ruleName = NZ._IdGenerator.nextId(), this._decorations = this._editor.createDecorationsCollection(), this._color = null, this._height = -1; + this._editor = e, this._ruleName = K2._IdGenerator.nextId(), this._decorations = this._editor.createDecorationsCollection(), this._color = null, this._height = -1; } dispose() { - this.hide(), T2(this._ruleName); + this.hide(), $N(this._ruleName); } set color(e) { this._color !== e && (this._color = e, this._updateStyle()); @@ -63851,11 +63851,11 @@ const NZ = class NZ { this._height !== e && (this._height = e, this._updateStyle()); } _updateStyle() { - T2(this._ruleName), dA(`.monaco-editor ${this._ruleName}`, `border-style: solid; border-color: transparent; border-bottom-color: ${this._color}; border-width: ${this._height}px; bottom: -${this._height}px !important; margin-left: -${this._height}px; `); + $N(this._ruleName), IV(`.monaco-editor ${this._ruleName}`, `border-style: solid; border-color: transparent; border-bottom-color: ${this._color}; border-width: ${this._height}px; bottom: -${this._height}px !important; margin-left: -${this._height}px; `); } show(e) { e.column === 1 && (e = { lineNumber: e.lineNumber, column: 2 }), this._decorations.set([{ - range: M.fromPositions(e), + range: I.fromPositions(e), options: { description: "zone-widget-arrow", className: this._ruleName, @@ -63868,11 +63868,11 @@ const NZ = class NZ { this._decorations.clear(); } }; -NZ._IdGenerator = new NX(".arrow-decoration-"); -let oD = NZ; -class Ufe { +K2._IdGenerator = new eH(".arrow-decoration-"); +let SM = K2; +class DZe { constructor(e, t = {}) { - this._arrow = null, this._overlayWidget = null, this._resizeSash = null, this._viewZone = null, this._disposables = new U(), this.container = null, this._isShowing = !1, this.editor = e, this._positionMarkerId = this.editor.createDecorationsCollection(), this.options = gc(t), $_(this.options, Bfe, !1), this.domNode = document.createElement("div"), this.options.isAccessible || (this.domNode.setAttribute("aria-hidden", "true"), this.domNode.setAttribute("role", "presentation")), this._disposables.add(this.editor.onDidLayoutChange((i) => { + this._arrow = null, this._overlayWidget = null, this._resizeSash = null, this._viewZone = null, this._disposables = new _(), this.container = null, this._isShowing = !1, this.editor = e, this._positionMarkerId = this.editor.createDecorationsCollection(), this.options = Zd(t), bx(this.options, vZe, !1), this.domNode = document.createElement("div"), this.options.isAccessible || (this.domNode.setAttribute("aria-hidden", "true"), this.domNode.setAttribute("role", "presentation")), this._disposables.add(this.editor.onDidLayoutChange((i) => { const n = this._getWidth(i); this.domNode.style.width = n + "px", this.domNode.style.left = this._getLeft(i) + "px", this._onWidth(n); })); @@ -63883,7 +63883,7 @@ class Ufe { }), this._positionMarkerId.clear(), this._disposables.dispose(); } create() { - this.domNode.classList.add("zone-widget"), this.options.className && this.domNode.classList.add(this.options.className), this.container = document.createElement("div"), this.container.classList.add("zone-widget-container"), this.domNode.appendChild(this.container), this.options.showArrow && (this._arrow = new oD(this.editor), this._disposables.add(this._arrow)), this._fillContainer(this.container), this._initSash(), this._applyStyles(); + this.domNode.classList.add("zone-widget"), this.options.className && this.domNode.classList.add(this.options.className), this.container = document.createElement("div"), this.container.classList.add("zone-widget-container"), this.domNode.appendChild(this.container), this.options.showArrow && (this._arrow = new SM(this.editor), this._disposables.add(this._arrow)), this._fillContainer(this.container), this._initSash(), this._applyStyles(); } style(e) { e.frameColor && (this.options.frameColor = e.frameColor), e.arrowColor && (this.options.arrowColor = e.arrowColor), this._applyStyles(); @@ -63923,8 +63923,8 @@ class Ufe { return e.getStartPosition(); } show(e, t) { - const i = M.isIRange(e) ? M.lift(e) : M.fromPositions(e); - this._isShowing = !0, this._showImpl(i, t), this._isShowing = !1, this._positionMarkerId.set([{ range: i, options: Re.EMPTY }]); + const i = I.isIRange(e) ? I.lift(e) : I.fromPositions(e); + this._isShowing = !0, this._showImpl(i, t), this._isShowing = !1, this._positionMarkerId.set([{ range: i, options: Je.EMPTY }]); } hide() { var e; @@ -63951,28 +63951,28 @@ class Ufe { _showImpl(e, t) { const i = e.getStartPosition(), n = this.editor.getLayoutInfo(), o = this._getWidth(n); this.domNode.style.width = `${o}px`, this.domNode.style.left = this._getLeft(n) + "px"; - const r = document.createElement("div"); - r.style.overflow = "hidden"; - const l = this.editor.getOption( + const l = document.createElement("div"); + l.style.overflow = "hidden"; + const r = this.editor.getOption( 67 /* EditorOption.lineHeight */ ); if (!this.options.allowUnlimitedHeight) { - const u = Math.max(12, this.editor.getLayoutInfo().height / l * 0.8); + const u = Math.max(12, this.editor.getLayoutInfo().height / r * 0.8); t = Math.min(t, u); } - let a = 0, c = 0; - if (this._arrow && this.options.showArrow && (a = Math.round(l / 3), this._arrow.height = a, this._arrow.show(i)), this.options.showFrame && (c = Math.round(l / 9)), this.editor.changeViewZones((u) => { - this._viewZone && u.removeZone(this._viewZone.id), this._overlayWidget && (this.editor.removeOverlayWidget(this._overlayWidget), this._overlayWidget = null), this.domNode.style.top = "-1000px", this._viewZone = new Hfe(r, i.lineNumber, i.column, t, (g) => this._onViewZoneTop(g), (g) => this._onViewZoneHeight(g), this.options.showInHiddenAreas, this.options.ordinal), this._viewZone.id = u.addZone(this._viewZone), this._overlayWidget = new Jfe(Ofe + this._viewZone.id, this.domNode), this.editor.addOverlayWidget(this._overlayWidget); + let c = 0, d = 0; + if (this._arrow && this.options.showArrow && (c = Math.round(r / 3), this._arrow.height = c, this._arrow.show(i)), this.options.showFrame && (d = Math.round(r / 9)), this.editor.changeViewZones((u) => { + this._viewZone && u.removeZone(this._viewZone.id), this._overlayWidget && (this.editor.removeOverlayWidget(this._overlayWidget), this._overlayWidget = null), this.domNode.style.top = "-1000px", this._viewZone = new HZe(l, i.lineNumber, i.column, t, (m) => this._onViewZoneTop(m), (m) => this._onViewZoneHeight(m), this.options.showInHiddenAreas, this.options.ordinal), this._viewZone.id = u.addZone(this._viewZone), this._overlayWidget = new EZe(JZe + this._viewZone.id, this.domNode), this.editor.addOverlayWidget(this._overlayWidget); }), this.container && this.options.showFrame) { - const u = this.options.frameWidth ? this.options.frameWidth : c; + const u = this.options.frameWidth ? this.options.frameWidth : d; this.container.style.borderTopWidth = u + "px", this.container.style.borderBottomWidth = u + "px"; } - const d = t * l - this._decoratingElementsHeight(); - this.container && (this.container.style.top = a + "px", this.container.style.height = d + "px", this.container.style.overflow = "hidden"), this._doLayout(d, o), this.options.keepEditorSelection || this.editor.setSelection(e); + const a = t * r - this._decoratingElementsHeight(); + this.container && (this.container.style.top = c + "px", this.container.style.height = a + "px", this.container.style.overflow = "hidden"), this._doLayout(a, o), this.options.keepEditorSelection || this.editor.setSelection(e); const h = this.editor.getModel(); if (h) { - const u = h.validateRange(new M(e.startLineNumber, 1, e.endLineNumber + 1, 1)); + const u = h.validateRange(new I(e.startLineNumber, 1, e.endLineNumber + 1, 1)); this.revealRange(u, u.startLineNumber === h.getLineCount()); } } @@ -64003,7 +64003,7 @@ class Ufe { _initSash() { if (this._resizeSash) return; - this._resizeSash = this._disposables.add(new Tn(this.domNode, this, { + this._resizeSash = this._disposables.add(new Mn(this.domNode, this, { orientation: 1 /* Orientation.HORIZONTAL */ })), this.options.isResizeable || (this._resizeSash.state = 0); @@ -64036,19 +64036,19 @@ class Ufe { return e.width - e.minimap.minimapWidth; } } -var _Q = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var d4 = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, IQ = function(s, e) { +}, a4 = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const NQ = $e("IPeekViewService"); +const h4 = $e("IPeekViewService"); it( - NQ, + h4, class { constructor() { this._widgets = /* @__PURE__ */ new Map(); @@ -64066,39 +64066,39 @@ it( 1 /* InstantiationType.Delayed */ ); -var Xs; +var Fs; (function(s) { - s.inPeekEditor = new ae("inReferenceSearchEditor", !0, p("inReferenceSearchEditor", "Whether the current code editor is embedded inside peek")), s.notInPeekEditor = s.inPeekEditor.toNegated(); -})(Xs || (Xs = {})); -var Kf; -let Nx = (Kf = class { + s.inPeekEditor = new ce("inReferenceSearchEditor", !0, p("inReferenceSearchEditor", "Whether the current code editor is embedded inside peek")), s.notInPeekEditor = s.inPeekEditor.toNegated(); +})(Fs || (Fs = {})); +var tZ; +let KL = (tZ = class { constructor(e, t) { - e instanceof Qr && Xs.inPeekEditor.bindTo(t); + e instanceof $l && Fs.inPeekEditor.bindTo(t); } dispose() { } -}, Kf.ID = "editor.contrib.referenceController", Kf); -Nx = _Q([ - IQ(1, _e) -], Nx); -gt( - Nx.ID, - Nx, +}, tZ.ID = "editor.contrib.referenceController", tZ); +KL = d4([ + a4(1, xe) +], KL); +mt( + KL.ID, + KL, 0 /* EditorContributionInstantiation.Eager */ ); -function Kfe(s) { - const e = s.get(ft).getFocusedCodeEditor(); - return e instanceof Qr ? e.getParentEditor() : e; -} -const Qfe = { - headerBackgroundColor: K.white, - primaryHeadingColor: K.fromHex("#333333"), - secondaryHeadingColor: K.fromHex("#6c6c6cb3") +function FZe(s) { + const e = s.get(gt).getFocusedCodeEditor(); + return e instanceof $l ? e.getParentEditor() : e; +} +const zZe = { + headerBackgroundColor: Q.white, + primaryHeadingColor: Q.fromHex("#333333"), + secondaryHeadingColor: Q.fromHex("#6c6c6cb3") }; -let Wx = class extends Ufe { +let UL = class extends DZe { constructor(e, t, i) { - super(e, t), this.instantiationService = i, this._onDidClose = new k(), this.onDidClose = this._onDidClose.event, $_(this.options, Qfe, !1); + super(e, t), this.instantiationService = i, this._onDidClose = new k(), this.onDidClose = this._onDidClose.event, bx(this.options, zZe, !1); } dispose() { this.disposed || (this.disposed = !0, super.dispose(), this._onDidClose.fire(this)); @@ -64113,20 +64113,20 @@ let Wx = class extends Ufe { this._headElement && e.headerBackgroundColor && (this._headElement.style.backgroundColor = e.headerBackgroundColor.toString()), this._primaryHeading && e.primaryHeadingColor && (this._primaryHeading.style.color = e.primaryHeadingColor.toString()), this._secondaryHeading && e.secondaryHeadingColor && (this._secondaryHeading.style.color = e.secondaryHeadingColor.toString()), this._bodyElement && e.frameColor && (this._bodyElement.style.borderColor = e.frameColor.toString()); } _fillContainer(e) { - this.setCssClass("peekview-widget"), this._headElement = ce(".head"), this._bodyElement = ce(".body"), this._fillHead(this._headElement), this._fillBody(this._bodyElement), e.appendChild(this._headElement), e.appendChild(this._bodyElement); + this.setCssClass("peekview-widget"), this._headElement = de(".head"), this._bodyElement = de(".body"), this._fillHead(this._headElement), this._fillBody(this._bodyElement), e.appendChild(this._headElement), e.appendChild(this._bodyElement); } _fillHead(e, t) { - this._titleElement = ce(".peekview-title"), this.options.supportOnTitleClick && (this._titleElement.classList.add("clickable"), ai(this._titleElement, "click", (o) => this._onTitleClick(o))), Q(this._headElement, this._titleElement), this._fillTitleIcon(this._titleElement), this._primaryHeading = ce("span.filename"), this._secondaryHeading = ce("span.dirname"), this._metaHeading = ce("span.meta"), Q(this._titleElement, this._primaryHeading, this._secondaryHeading, this._metaHeading); - const i = ce(".peekview-actions"); - Q(this._headElement, i); + this._titleElement = de(".peekview-title"), this.options.supportOnTitleClick && (this._titleElement.classList.add("clickable"), di(this._titleElement, "click", (o) => this._onTitleClick(o))), O(this._headElement, this._titleElement), this._fillTitleIcon(this._titleElement), this._primaryHeading = de("span.filename"), this._secondaryHeading = de("span.dirname"), this._metaHeading = de("span.meta"), O(this._titleElement, this._primaryHeading, this._secondaryHeading, this._metaHeading); + const i = de(".peekview-actions"); + O(this._headElement, i); const n = this._getActionBarOptions(); - this._actionbarWidget = new Yo(i, n), this._disposables.add(this._actionbarWidget), t || this._actionbarWidget.push(new lo("peekview.close", p("label.close", "Close"), Ze.asClassName(te.close), !0, () => (this.dispose(), Promise.resolve())), { label: !1, icon: !0 }); + this._actionbarWidget = new Ao(i, n), this._disposables.add(this._actionbarWidget), t || this._actionbarWidget.push(new ao("peekview.close", p("label.close", "Close"), Se.asClassName(te.close), !0, () => (this.dispose(), Promise.resolve())), { label: !1, icon: !0 }); } _fillTitleIcon(e) { } _getActionBarOptions() { return { - actionViewItemProvider: m4.bind(void 0, this.instantiationService), + actionViewItemProvider: OO.bind(void 0, this.instantiationService), orientation: 0 /* ActionsOrientation.HORIZONTAL */ }; @@ -64134,10 +64134,10 @@ let Wx = class extends Ufe { _onTitleClick(e) { } setTitle(e, t) { - this._primaryHeading && this._secondaryHeading && (this._primaryHeading.innerText = e, this._primaryHeading.setAttribute("title", e), t ? this._secondaryHeading.innerText = t : gn(this._secondaryHeading)); + this._primaryHeading && this._secondaryHeading && (this._primaryHeading.innerText = e, this._primaryHeading.setAttribute("title", e), t ? this._secondaryHeading.innerText = t : bn(this._secondaryHeading)); } setMetaTitle(e) { - this._metaHeading && (e ? (this._metaHeading.innerText = e, no(this._metaHeading)) : rs(this._metaHeading)); + this._metaHeading && (e ? (this._metaHeading.innerText = e, oo(this._metaHeading)) : cs(this._metaHeading)); } _doLayout(e, t) { if (!this._isShowing && e < 0) { @@ -64157,21 +64157,21 @@ let Wx = class extends Ufe { this._bodyElement && (this._bodyElement.style.height = `${e}px`); } }; -Wx = _Q([ - IQ(2, Se) -], Wx); -const jfe = N("peekViewTitle.background", { dark: "#252526", light: "#F3F3F3", hcDark: K.black, hcLight: K.white }, p("peekViewTitleBackground", "Background color of the peek view title area.")), WQ = N("peekViewTitleLabel.foreground", { dark: K.white, light: K.black, hcDark: K.white, hcLight: Ya }, p("peekViewTitleForeground", "Color of the peek view title.")), vQ = N("peekViewTitleDescription.foreground", { dark: "#ccccccb3", light: "#616161", hcDark: "#FFFFFF99", hcLight: "#292929" }, p("peekViewTitleInfoForeground", "Color of the peek view title info.")), qfe = N("peekView.border", { dark: Da, light: Da, hcDark: rt, hcLight: rt }, p("peekViewBorder", "Color of the peek view borders and arrow.")), $fe = N("peekViewResult.background", { dark: "#252526", light: "#F3F3F3", hcDark: K.black, hcLight: K.white }, p("peekViewResultsBackground", "Background color of the peek view result list.")); -N("peekViewResult.lineForeground", { dark: "#bbbbbb", light: "#646465", hcDark: K.white, hcLight: Ya }, p("peekViewResultsMatchForeground", "Foreground color for line nodes in the peek view result list.")); -N("peekViewResult.fileForeground", { dark: K.white, light: "#1E1E1E", hcDark: K.white, hcLight: Ya }, p("peekViewResultsFileForeground", "Foreground color for file nodes in the peek view result list.")); -N("peekViewResult.selectionBackground", { dark: "#3399ff33", light: "#3399ff33", hcDark: null, hcLight: null }, p("peekViewResultsSelectionBackground", "Background color of the selected entry in the peek view result list.")); -N("peekViewResult.selectionForeground", { dark: K.white, light: "#6C6C6C", hcDark: K.white, hcLight: Ya }, p("peekViewResultsSelectionForeground", "Foreground color of the selected entry in the peek view result list.")); -const TQ = N("peekViewEditor.background", { dark: "#001F33", light: "#F2F8FC", hcDark: K.black, hcLight: K.white }, p("peekViewEditorBackground", "Background color of the peek view editor.")); -N("peekViewEditorGutter.background", TQ, p("peekViewEditorGutterBackground", "Background color of the gutter in the peek view editor.")); -N("peekViewEditorStickyScroll.background", TQ, p("peekViewEditorStickScrollBackground", "Background color of sticky scroll in the peek view editor.")); -N("peekViewResult.matchHighlightBackground", { dark: "#ea5c004d", light: "#ea5c004d", hcDark: null, hcLight: null }, p("peekViewResultsMatchHighlight", "Match highlight color in the peek view result list.")); -N("peekViewEditor.matchHighlightBackground", { dark: "#ff8f0099", light: "#f5d802de", hcDark: null, hcLight: null }, p("peekViewEditorMatchHighlight", "Match highlight color in the peek view editor.")); -N("peekViewEditor.matchHighlightBorder", { dark: null, light: null, hcDark: Ut, hcLight: Ut }, p("peekViewEditorMatchHighlightBorder", "Match highlight border in the peek view editor.")); -class ebe { +UL = d4([ + a4(2, Ge) +], UL); +const AZe = R("peekViewTitle.background", { dark: "#252526", light: "#F3F3F3", hcDark: Q.black, hcLight: Q.white }, p("peekViewTitleBackground", "Background color of the peek view title area.")), u4 = R("peekViewTitleLabel.foreground", { dark: Q.white, light: Q.black, hcDark: Q.white, hcLight: Uc }, p("peekViewTitleForeground", "Color of the peek view title.")), m4 = R("peekViewTitleDescription.foreground", { dark: "#ccccccb3", light: "#616161", hcDark: "#FFFFFF99", hcLight: "#292929" }, p("peekViewTitleInfoForeground", "Color of the peek view title info.")), KZe = R("peekView.border", { dark: Jc, light: Jc, hcDark: lt, hcLight: lt }, p("peekViewBorder", "Color of the peek view borders and arrow.")), UZe = R("peekViewResult.background", { dark: "#252526", light: "#F3F3F3", hcDark: Q.black, hcLight: Q.white }, p("peekViewResultsBackground", "Background color of the peek view result list.")); +R("peekViewResult.lineForeground", { dark: "#bbbbbb", light: "#646465", hcDark: Q.white, hcLight: Uc }, p("peekViewResultsMatchForeground", "Foreground color for line nodes in the peek view result list.")); +R("peekViewResult.fileForeground", { dark: Q.white, light: "#1E1E1E", hcDark: Q.white, hcLight: Uc }, p("peekViewResultsFileForeground", "Foreground color for file nodes in the peek view result list.")); +R("peekViewResult.selectionBackground", { dark: "#3399ff33", light: "#3399ff33", hcDark: null, hcLight: null }, p("peekViewResultsSelectionBackground", "Background color of the selected entry in the peek view result list.")); +R("peekViewResult.selectionForeground", { dark: Q.white, light: "#6C6C6C", hcDark: Q.white, hcLight: Uc }, p("peekViewResultsSelectionForeground", "Foreground color of the selected entry in the peek view result list.")); +const b4 = R("peekViewEditor.background", { dark: "#001F33", light: "#F2F8FC", hcDark: Q.black, hcLight: Q.white }, p("peekViewEditorBackground", "Background color of the peek view editor.")); +R("peekViewEditorGutter.background", b4, p("peekViewEditorGutterBackground", "Background color of the gutter in the peek view editor.")); +R("peekViewEditorStickyScroll.background", b4, p("peekViewEditorStickScrollBackground", "Background color of sticky scroll in the peek view editor.")); +R("peekViewResult.matchHighlightBackground", { dark: "#ea5c004d", light: "#ea5c004d", hcDark: null, hcLight: null }, p("peekViewResultsMatchHighlight", "Match highlight color in the peek view result list.")); +R("peekViewEditor.matchHighlightBackground", { dark: "#ff8f0099", light: "#f5d802de", hcDark: null, hcLight: null }, p("peekViewEditorMatchHighlight", "Match highlight color in the peek view editor.")); +R("peekViewEditor.matchHighlightBorder", { dark: null, light: null, hcDark: _t, hcLight: _t }, p("peekViewEditorMatchHighlightBorder", "Match highlight border in the peek view editor.")); +class PZe { get templateId() { return this.renderer.templateId; } @@ -64179,23 +64179,23 @@ class ebe { this.renderer = e, this.modelProvider = t; } renderTemplate(e) { - return { data: this.renderer.renderTemplate(e), disposable: R.None }; + return { data: this.renderer.renderTemplate(e), disposable: J.None }; } renderElement(e, t, i, n) { - var a; - if ((a = i.disposable) == null || a.dispose(), !i.data) + var c; + if ((c = i.disposable) == null || c.dispose(), !i.data) return; const o = this.modelProvider(); if (o.isResolved(e)) return this.renderer.renderElement(o.get(e), e, i.data, n); - const r = new mi(), l = o.resolve(e, r.token); - i.disposable = { dispose: () => r.cancel() }, this.renderer.renderPlaceholder(e, i.data), l.then((c) => this.renderer.renderElement(c, e, i.data, n)); + const l = new pi(), r = o.resolve(e, l.token); + i.disposable = { dispose: () => l.cancel() }, this.renderer.renderPlaceholder(e, i.data), r.then((d) => this.renderer.renderElement(d, e, i.data, n)); } disposeTemplate(e) { e.disposable && (e.disposable.dispose(), e.disposable = void 0), e.data && (this.renderer.disposeTemplate(e.data), e.data = void 0); } } -class tbe { +class BZe { constructor(e, t) { this.modelProvider = e, this.accessibilityProvider = t; } @@ -64207,16 +64207,16 @@ class tbe { return t.isResolved(e) ? this.accessibilityProvider.getAriaLabel(t.get(e)) : null; } } -function ibe(s, e) { +function _Ze(s, e) { return { ...e, - accessibilityProvider: e.accessibilityProvider && new tbe(s, e.accessibilityProvider) + accessibilityProvider: e.accessibilityProvider && new BZe(s, e.accessibilityProvider) }; } -class nbe { +class QZe { constructor(e, t, i, n, o = {}) { - const r = () => this.model, l = n.map((a) => new ebe(a, r)); - this.list = new Qo(e, t, i, l, ibe(r, o)); + const l = () => this.model, r = n.map((c) => new PZe(c, l)); + this.list = new qo(e, t, i, r, _Ze(l, o)); } updateOptions(e) { this.list.updateOptions(e); @@ -64246,7 +64246,7 @@ class nbe { return this._model; } set model(e) { - this._model = e, this.list.splice(0, this.list.length, Ns(e.length)); + this._model = e, this.list.splice(0, this.list.length, ws(e.length)); } getFocus() { return this.list.getFocus(); @@ -64264,10 +64264,10 @@ class nbe { this.list.dispose(); } } -const sbe = { - separatorBorder: K.transparent +const OZe = { + separatorBorder: Q.transparent }; -class DQ { +class p4 { set size(e) { this._size = e; } @@ -64280,7 +64280,7 @@ class DQ { setVisible(e, t) { var i, n; if (e !== this.visible) { - e ? (this.size = os(this._cachedVisibleSize, this.viewMinimumSize, this.viewMaximumSize), this._cachedVisibleSize = void 0) : (this._cachedVisibleSize = typeof t == "number" ? t : this.size, this.size = 0), this.container.classList.toggle("visible", e); + e ? (this.size = rs(this._cachedVisibleSize, this.viewMinimumSize, this.viewMaximumSize), this._cachedVisibleSize = void 0) : (this._cachedVisibleSize = typeof t == "number" ? t : this.size, this.size = 0), this.container.classList.toggle("visible", e); try { (n = (i = this.view).setVisible) == null || n.call(i, e); } catch (o) { @@ -64327,21 +64327,21 @@ class DQ { this.disposable.dispose(); } } -class obe extends DQ { +class jZe extends p4 { layoutContainer(e) { this.container.style.top = `${e}px`, this.container.style.height = `${this.size}px`; } } -class rbe extends DQ { +class qZe extends p4 { layoutContainer(e) { this.container.style.left = `${e}px`, this.container.style.width = `${this.size}px`; } } -var sc; +var cd; (function(s) { s[s.Idle = 0] = "Idle", s[s.Busy = 1] = "Busy"; -})(sc || (sc = {})); -var vx; +})(cd || (cd = {})); +var PL; (function(s) { s.Distribute = { type: "distribute" }; function e(n) { @@ -64356,8 +64356,8 @@ var vx; return { type: "invisible", cachedVisibleSize: n }; } s.Invisible = i; -})(vx || (vx = {})); -class VQ extends R { +})(PL || (PL = {})); +class g4 extends J { get orthogonalStartSash() { return this._orthogonalStartSash; } @@ -64406,24 +64406,24 @@ class VQ extends R { * Create a new {@link SplitView} instance. */ constructor(e, t = {}) { - super(), this.size = 0, this._contentSize = 0, this.proportions = void 0, this.viewItems = [], this.sashItems = [], this.state = sc.Idle, this._onDidSashChange = this._register(new k()), this._onDidSashReset = this._register(new k()), this._startSnappingEnabled = !0, this._endSnappingEnabled = !0, this.onDidSashChange = this._onDidSashChange.event, this.onDidSashReset = this._onDidSashReset.event, this.orientation = t.orientation ?? 0, this.inverseAltBehavior = t.inverseAltBehavior ?? !1, this.proportionalLayout = t.proportionalLayout ?? !0, this.getSashOrthogonalSize = t.getSashOrthogonalSize, this.el = document.createElement("div"), this.el.classList.add("monaco-split-view2"), this.el.classList.add(this.orientation === 0 ? "vertical" : "horizontal"), e.appendChild(this.el), this.sashContainer = Q(this.el, ce(".sash-container")), this.viewContainer = ce(".split-view-container"), this.scrollable = this._register(new o0({ + super(), this.size = 0, this._contentSize = 0, this.proportions = void 0, this.viewItems = [], this.sashItems = [], this.state = cd.Idle, this._onDidSashChange = this._register(new k()), this._onDidSashReset = this._register(new k()), this._startSnappingEnabled = !0, this._endSnappingEnabled = !0, this.onDidSashChange = this._onDidSashChange.event, this.onDidSashReset = this._onDidSashReset.event, this.orientation = t.orientation ?? 0, this.inverseAltBehavior = t.inverseAltBehavior ?? !1, this.proportionalLayout = t.proportionalLayout ?? !0, this.getSashOrthogonalSize = t.getSashOrthogonalSize, this.el = document.createElement("div"), this.el.classList.add("monaco-split-view2"), this.el.classList.add(this.orientation === 0 ? "vertical" : "horizontal"), e.appendChild(this.el), this.sashContainer = O(this.el, de(".sash-container")), this.viewContainer = de(".split-view-container"), this.scrollable = this._register(new h0({ forceIntegerValues: !0, smoothScrollDuration: 125, - scheduleAtNextAnimationFrame: (n) => po(xe(this.el), n) - })), this.scrollableElement = this._register(new uI(this.viewContainer, { + scheduleAtNextAnimationFrame: (n) => Zo(Le(this.el), n) + })), this.scrollableElement = this._register(new xx(this.viewContainer, { vertical: this.orientation === 0 ? t.scrollbarVisibility ?? 1 : 2, horizontal: this.orientation === 1 ? t.scrollbarVisibility ?? 1 : 2 /* ScrollbarVisibility.Hidden */ }, this.scrollable)); const i = this._register(new et(this.viewContainer, "scroll")).event; this._register(i((n) => { - const o = this.scrollableElement.getScrollPosition(), r = Math.abs(this.viewContainer.scrollLeft - o.scrollLeft) <= 1 ? void 0 : this.viewContainer.scrollLeft, l = Math.abs(this.viewContainer.scrollTop - o.scrollTop) <= 1 ? void 0 : this.viewContainer.scrollTop; - (r !== void 0 || l !== void 0) && this.scrollableElement.setScrollPosition({ scrollLeft: r, scrollTop: l }); + const o = this.scrollableElement.getScrollPosition(), l = Math.abs(this.viewContainer.scrollLeft - o.scrollLeft) <= 1 ? void 0 : this.viewContainer.scrollLeft, r = Math.abs(this.viewContainer.scrollTop - o.scrollTop) <= 1 ? void 0 : this.viewContainer.scrollTop; + (l !== void 0 || r !== void 0) && this.scrollableElement.setScrollPosition({ scrollLeft: l, scrollTop: r }); })), this.onDidScroll = this.scrollableElement.onScroll, this._register(this.onDidScroll((n) => { n.scrollTopChanged && (this.viewContainer.scrollTop = n.scrollTop), n.scrollLeftChanged && (this.viewContainer.scrollLeft = n.scrollLeft); - })), Q(this.el, this.scrollableElement.getDomNode()), this.style(t.styles || sbe), t.descriptor && (this.size = t.descriptor.size, t.descriptor.views.forEach((n, o) => { - const r = jn(n.visible) || n.visible ? n.size : { type: "invisible", cachedVisibleSize: n.size }, l = n.view; - this.doAddView(l, r, o, !0); + })), O(this.el, this.scrollableElement.getDomNode()), this.style(t.styles || OZe), t.descriptor && (this.size = t.descriptor.size, t.descriptor.views.forEach((n, o) => { + const l = $n(n.visible) || n.visible ? n.size : { type: "invisible", cachedVisibleSize: n.size }, r = n.view; + this.doAddView(r, l, o, !0); }), this._contentSize = this.viewItems.reduce((n, o) => n + o.size, 0), this.saveProportions()); } style(e) { @@ -64451,22 +64451,22 @@ class VQ extends R { if (this.size = e, this.layoutContext = t, this.proportions) { let n = 0; for (let o = 0; o < this.viewItems.length; o++) { - const r = this.viewItems[o], l = this.proportions[o]; - typeof l == "number" ? n += l : e -= r.size; + const l = this.viewItems[o], r = this.proportions[o]; + typeof r == "number" ? n += r : e -= l.size; } for (let o = 0; o < this.viewItems.length; o++) { - const r = this.viewItems[o], l = this.proportions[o]; - typeof l == "number" && n > 0 && (r.size = os(Math.round(l * e / n), r.minimumSize, r.maximumSize)); + const l = this.viewItems[o], r = this.proportions[o]; + typeof r == "number" && n > 0 && (l.size = rs(Math.round(r * e / n), l.minimumSize, l.maximumSize)); } } else { - const n = Ns(this.viewItems.length), o = n.filter( - (l) => this.viewItems[l].priority === 1 + const n = ws(this.viewItems.length), o = n.filter( + (r) => this.viewItems[r].priority === 1 /* LayoutPriority.Low */ - ), r = n.filter( - (l) => this.viewItems[l].priority === 2 + ), l = n.filter( + (r) => this.viewItems[r].priority === 2 /* LayoutPriority.High */ ); - this.resize(this.viewItems.length - 1, e - i, void 0, o, r); + this.resize(this.viewItems.length - 1, e - i, void 0, o, l); } this.distributeEmptySpace(), this.layoutViews(); } @@ -64474,50 +64474,50 @@ class VQ extends R { this.proportionalLayout && this._contentSize > 0 && (this.proportions = this.viewItems.map((e) => e.proportionalLayout && e.visible ? e.size / this._contentSize : void 0)); } onSashStart({ sash: e, start: t, alt: i }) { - for (const l of this.viewItems) - l.enabled = !1; - const n = this.sashItems.findIndex((l) => l.sash === e), o = Yr(z(this.el.ownerDocument.body, "keydown", (l) => r(this.sashDragState.current, l.altKey)), z(this.el.ownerDocument.body, "keyup", () => r(this.sashDragState.current, !1))), r = (l, a) => { - const c = this.viewItems.map((m) => m.size); - let d = Number.NEGATIVE_INFINITY, h = Number.POSITIVE_INFINITY; - if (this.inverseAltBehavior && (a = !a), a) + for (const r of this.viewItems) + r.enabled = !1; + const n = this.sashItems.findIndex((r) => r.sash === e), o = Kl(z(this.el.ownerDocument.body, "keydown", (r) => l(this.sashDragState.current, r.altKey)), z(this.el.ownerDocument.body, "keyup", () => l(this.sashDragState.current, !1))), l = (r, c) => { + const d = this.viewItems.map((b) => b.size); + let a = Number.NEGATIVE_INFINITY, h = Number.POSITIVE_INFINITY; + if (this.inverseAltBehavior && (c = !c), c) if (n === this.sashItems.length - 1) { - const f = this.viewItems[n]; - d = (f.minimumSize - f.size) / 2, h = (f.maximumSize - f.size) / 2; + const g = this.viewItems[n]; + a = (g.minimumSize - g.size) / 2, h = (g.maximumSize - g.size) / 2; } else { - const f = this.viewItems[n + 1]; - d = (f.size - f.maximumSize) / 2, h = (f.size - f.minimumSize) / 2; + const g = this.viewItems[n + 1]; + a = (g.size - g.maximumSize) / 2, h = (g.size - g.minimumSize) / 2; } - let u, g; - if (!a) { - const m = Ns(n, -1), f = Ns(n + 1, this.viewItems.length), b = m.reduce((_, v) => _ + (this.viewItems[v].minimumSize - c[v]), 0), y = m.reduce((_, v) => _ + (this.viewItems[v].viewMaximumSize - c[v]), 0), w = f.length === 0 ? Number.POSITIVE_INFINITY : f.reduce((_, v) => _ + (c[v] - this.viewItems[v].minimumSize), 0), C = f.length === 0 ? Number.NEGATIVE_INFINITY : f.reduce((_, v) => _ + (c[v] - this.viewItems[v].viewMaximumSize), 0), S = Math.max(b, C), L = Math.min(w, y), x = this.findFirstSnapIndex(m), Z = this.findFirstSnapIndex(f); - if (typeof x == "number") { - const _ = this.viewItems[x], v = Math.floor(_.viewMinimumSize / 2); + let u, m; + if (!c) { + const b = ws(n, -1), g = ws(n + 1, this.viewItems.length), Z = b.reduce((x, w) => x + (this.viewItems[w].minimumSize - d[w]), 0), f = b.reduce((x, w) => x + (this.viewItems[w].viewMaximumSize - d[w]), 0), y = g.length === 0 ? Number.POSITIVE_INFINITY : g.reduce((x, w) => x + (d[w] - this.viewItems[w].minimumSize), 0), W = g.length === 0 ? Number.NEGATIVE_INFINITY : g.reduce((x, w) => x + (d[w] - this.viewItems[w].viewMaximumSize), 0), G = Math.max(Z, W), X = Math.min(y, f), L = this.findFirstSnapIndex(b), S = this.findFirstSnapIndex(g); + if (typeof L == "number") { + const x = this.viewItems[L], w = Math.floor(x.viewMinimumSize / 2); u = { - index: x, - limitDelta: _.visible ? S - v : S + v, - size: _.size + index: L, + limitDelta: x.visible ? G - w : G + w, + size: x.size }; } - if (typeof Z == "number") { - const _ = this.viewItems[Z], v = Math.floor(_.viewMinimumSize / 2); - g = { - index: Z, - limitDelta: _.visible ? L + v : L - v, - size: _.size + if (typeof S == "number") { + const x = this.viewItems[S], w = Math.floor(x.viewMinimumSize / 2); + m = { + index: S, + limitDelta: x.visible ? X + w : X - w, + size: x.size }; } } - this.sashDragState = { start: l, current: l, index: n, sizes: c, minDelta: d, maxDelta: h, alt: a, snapBefore: u, snapAfter: g, disposable: o }; + this.sashDragState = { start: r, current: r, index: n, sizes: d, minDelta: a, maxDelta: h, alt: c, snapBefore: u, snapAfter: m, disposable: o }; }; - r(t, i); + l(t, i); } onSashChange({ current: e }) { - const { index: t, start: i, sizes: n, alt: o, minDelta: r, maxDelta: l, snapBefore: a, snapAfter: c } = this.sashDragState; + const { index: t, start: i, sizes: n, alt: o, minDelta: l, maxDelta: r, snapBefore: c, snapAfter: d } = this.sashDragState; this.sashDragState.current = e; - const d = e - i, h = this.resize(t, d, n, void 0, void 0, r, l, a, c); + const a = e - i, h = this.resize(t, a, n, void 0, void 0, l, r, c, d); if (o) { - const u = t === this.sashItems.length - 1, g = this.viewItems.map((C) => C.size), m = u ? t : t + 1, f = this.viewItems[m], b = f.size - f.maximumSize, y = f.size - f.minimumSize, w = u ? t - 1 : t + 1; - this.resize(w, -h, g, void 0, void 0, b, y); + const u = t === this.sashItems.length - 1, m = this.viewItems.map((W) => W.size), b = u ? t : t + 1, g = this.viewItems[b], Z = g.size - g.maximumSize, f = g.size - g.minimumSize, y = u ? t - 1 : t + 1; + this.resize(y, -h, m, void 0, void 0, Z, f); } this.distributeEmptySpace(), this.layoutViews(); } @@ -64528,7 +64528,7 @@ class VQ extends R { } onViewChange(e, t) { const i = this.viewItems.indexOf(e); - i < 0 || i >= this.viewItems.length || (t = typeof t == "number" ? t : e.size, t = os(t, e.minimumSize, e.maximumSize), this.inverseAltBehavior && i > 0 ? (this.resize(i - 1, Math.floor((e.size - t) / 2)), this.distributeEmptySpace(), this.layoutViews()) : (e.size = t, this.relayout([i], void 0))); + i < 0 || i >= this.viewItems.length || (t = typeof t == "number" ? t : e.size, t = rs(t, e.minimumSize, e.maximumSize), this.inverseAltBehavior && i > 0 ? (this.resize(i - 1, Math.floor((e.size - t) / 2)), this.distributeEmptySpace(), this.layoutViews()) : (e.size = t, this.relayout([i], void 0))); } /** * Resize a {@link IView view} within the {@link SplitView}. @@ -64538,20 +64538,20 @@ class VQ extends R { */ resizeView(e, t) { if (!(e < 0 || e >= this.viewItems.length)) { - if (this.state !== sc.Idle) + if (this.state !== cd.Idle) throw new Error("Cant modify splitview"); - this.state = sc.Busy; + this.state = cd.Busy; try { - const i = Ns(this.viewItems.length).filter((l) => l !== e), n = [...i.filter( - (l) => this.viewItems[l].priority === 1 + const i = ws(this.viewItems.length).filter((r) => r !== e), n = [...i.filter( + (r) => this.viewItems[r].priority === 1 /* LayoutPriority.Low */ ), e], o = i.filter( - (l) => this.viewItems[l].priority === 2 + (r) => this.viewItems[r].priority === 2 /* LayoutPriority.High */ - ), r = this.viewItems[e]; - t = Math.round(t), t = os(t, r.minimumSize, Math.min(r.maximumSize, this.size)), r.size = t, this.relayout(n, o); + ), l = this.viewItems[e]; + t = Math.round(t), t = rs(t, l.minimumSize, Math.min(l.maximumSize, this.size)), l.size = t, this.relayout(n, o); } finally { - this.state = sc.Idle; + this.state = cd.Idle; } } } @@ -64561,19 +64561,19 @@ class VQ extends R { distributeViewSizes() { const e = []; let t = 0; - for (const l of this.viewItems) - l.maximumSize - l.minimumSize > 0 && (e.push(l), t += l.size); + for (const r of this.viewItems) + r.maximumSize - r.minimumSize > 0 && (e.push(r), t += r.size); const i = Math.floor(t / e.length); - for (const l of e) - l.size = os(i, l.minimumSize, l.maximumSize); - const n = Ns(this.viewItems.length), o = n.filter( - (l) => this.viewItems[l].priority === 1 + for (const r of e) + r.size = rs(i, r.minimumSize, r.maximumSize); + const n = ws(this.viewItems.length), o = n.filter( + (r) => this.viewItems[r].priority === 1 /* LayoutPriority.Low */ - ), r = n.filter( - (l) => this.viewItems[l].priority === 2 + ), l = n.filter( + (r) => this.viewItems[r].priority === 2 /* LayoutPriority.High */ ); - this.relayout(o, r); + this.relayout(o, l); } /** * Returns the size of a {@link IView view}. @@ -64582,93 +64582,93 @@ class VQ extends R { return e < 0 || e >= this.viewItems.length ? -1 : this.viewItems[e].size; } doAddView(e, t, i = this.viewItems.length, n) { - if (this.state !== sc.Idle) + if (this.state !== cd.Idle) throw new Error("Cant modify splitview"); - this.state = sc.Busy; + this.state = cd.Busy; try { - const o = ce(".split-view-view"); + const o = de(".split-view-view"); i === this.viewItems.length ? this.viewContainer.appendChild(o) : this.viewContainer.insertBefore(o, this.viewContainer.children.item(i)); - const r = e.onDidChange((u) => this.onViewChange(d, u)), l = Ce(() => o.remove()), a = Yr(r, l); - let c; - typeof t == "number" ? c = t : (t.type === "auto" && (this.areViewsDistributed() ? t = { type: "distribute" } : t = { type: "split", index: t.index }), t.type === "split" ? c = this.getViewSize(t.index) / 2 : t.type === "invisible" ? c = { cachedVisibleSize: t.cachedVisibleSize } : c = e.minimumSize); - const d = this.orientation === 0 ? new obe(o, e, c, a) : new rbe(o, e, c, a); - if (this.viewItems.splice(i, 0, d), this.viewItems.length > 1) { - const u = { orthogonalStartSash: this.orthogonalStartSash, orthogonalEndSash: this.orthogonalEndSash }, g = this.orientation === 0 ? new Tn(this.sashContainer, { getHorizontalSashTop: (_) => this.getSashPosition(_), getHorizontalSashWidth: this.getSashOrthogonalSize }, { + const l = e.onDidChange((u) => this.onViewChange(a, u)), r = We(() => o.remove()), c = Kl(l, r); + let d; + typeof t == "number" ? d = t : (t.type === "auto" && (this.areViewsDistributed() ? t = { type: "distribute" } : t = { type: "split", index: t.index }), t.type === "split" ? d = this.getViewSize(t.index) / 2 : t.type === "invisible" ? d = { cachedVisibleSize: t.cachedVisibleSize } : d = e.minimumSize); + const a = this.orientation === 0 ? new jZe(o, e, d, c) : new qZe(o, e, d, c); + if (this.viewItems.splice(i, 0, a), this.viewItems.length > 1) { + const u = { orthogonalStartSash: this.orthogonalStartSash, orthogonalEndSash: this.orthogonalEndSash }, m = this.orientation === 0 ? new Mn(this.sashContainer, { getHorizontalSashTop: (x) => this.getSashPosition(x), getHorizontalSashWidth: this.getSashOrthogonalSize }, { ...u, orientation: 1 /* Orientation.HORIZONTAL */ - }) : new Tn(this.sashContainer, { getVerticalSashLeft: (_) => this.getSashPosition(_), getVerticalSashHeight: this.getSashOrthogonalSize }, { + }) : new Mn(this.sashContainer, { getVerticalSashLeft: (x) => this.getSashPosition(x), getVerticalSashHeight: this.getSashOrthogonalSize }, { ...u, orientation: 0 /* Orientation.VERTICAL */ - }), m = this.orientation === 0 ? (_) => ({ sash: g, start: _.startY, current: _.currentY, alt: _.altKey }) : (_) => ({ sash: g, start: _.startX, current: _.currentX, alt: _.altKey }), b = se.map(g.onDidStart, m)(this.onSashStart, this), w = se.map(g.onDidChange, m)(this.onSashChange, this), S = se.map(g.onDidEnd, () => this.sashItems.findIndex((_) => _.sash === g))(this.onSashEnd, this), L = g.onDidReset(() => { - const _ = this.sashItems.findIndex((B) => B.sash === g), v = Ns(_, -1), P = Ns(_ + 1, this.viewItems.length), E = this.findFirstSnapIndex(v), Y = this.findFirstSnapIndex(P); - typeof E == "number" && !this.viewItems[E].visible || typeof Y == "number" && !this.viewItems[Y].visible || this._onDidSashReset.fire(_); - }), x = Yr(b, w, S, L, g), Z = { sash: g, disposable: x }; - this.sashItems.splice(i - 1, 0, Z); + }), b = this.orientation === 0 ? (x) => ({ sash: m, start: x.startY, current: x.currentY, alt: x.altKey }) : (x) => ({ sash: m, start: x.startX, current: x.currentX, alt: x.altKey }), Z = se.map(m.onDidStart, b)(this.onSashStart, this), y = se.map(m.onDidChange, b)(this.onSashChange, this), G = se.map(m.onDidEnd, () => this.sashItems.findIndex((x) => x.sash === m))(this.onSashEnd, this), X = m.onDidReset(() => { + const x = this.sashItems.findIndex((K) => K.sash === m), w = ws(x, -1), A = ws(x + 1, this.viewItems.length), H = this.findFirstSnapIndex(w), F = this.findFirstSnapIndex(A); + typeof H == "number" && !this.viewItems[H].visible || typeof F == "number" && !this.viewItems[F].visible || this._onDidSashReset.fire(x); + }), L = Kl(Z, y, G, X, m), S = { sash: m, disposable: L }; + this.sashItems.splice(i - 1, 0, S); } o.appendChild(e.element); let h; typeof t != "number" && t.type === "split" && (h = [t.index]), n || this.relayout([i], h), !n && typeof t != "number" && t.type === "distribute" && this.distributeViewSizes(); } finally { - this.state = sc.Idle; + this.state = cd.Idle; } } relayout(e, t) { const i = this.viewItems.reduce((n, o) => n + o.size, 0); this.resize(this.viewItems.length - 1, this.size - i, void 0, e, t), this.distributeEmptySpace(), this.layoutViews(), this.saveProportions(); } - resize(e, t, i = this.viewItems.map((d) => d.size), n, o, r = Number.NEGATIVE_INFINITY, l = Number.POSITIVE_INFINITY, a, c) { + resize(e, t, i = this.viewItems.map((a) => a.size), n, o, l = Number.NEGATIVE_INFINITY, r = Number.POSITIVE_INFINITY, c, d) { if (e < 0 || e >= this.viewItems.length) return 0; - const d = Ns(e, -1), h = Ns(e + 1, this.viewItems.length); + const a = ws(e, -1), h = ws(e + 1, this.viewItems.length); if (o) - for (const Z of o) - DN(d, Z), DN(h, Z); + for (const S of o) + QC(a, S), QC(h, S); if (n) - for (const Z of n) - tS(d, Z), tS(h, Z); - const u = d.map((Z) => this.viewItems[Z]), g = d.map((Z) => i[Z]), m = h.map((Z) => this.viewItems[Z]), f = h.map((Z) => i[Z]), b = d.reduce((Z, _) => Z + (this.viewItems[_].minimumSize - i[_]), 0), y = d.reduce((Z, _) => Z + (this.viewItems[_].maximumSize - i[_]), 0), w = h.length === 0 ? Number.POSITIVE_INFINITY : h.reduce((Z, _) => Z + (i[_] - this.viewItems[_].minimumSize), 0), C = h.length === 0 ? Number.NEGATIVE_INFINITY : h.reduce((Z, _) => Z + (i[_] - this.viewItems[_].maximumSize), 0), S = Math.max(b, C, r), L = Math.min(w, y, l); - let x = !1; - if (a) { - const Z = this.viewItems[a.index], _ = t >= a.limitDelta; - x = _ !== Z.visible, Z.setVisible(_, a.size); - } - if (!x && c) { - const Z = this.viewItems[c.index], _ = t < c.limitDelta; - x = _ !== Z.visible, Z.setVisible(_, c.size); - } - if (x) - return this.resize(e, t, i, n, o, r, l); - t = os(t, S, L); - for (let Z = 0, _ = t; Z < u.length; Z++) { - const v = u[Z], P = os(g[Z] + _, v.minimumSize, v.maximumSize), E = P - g[Z]; - _ -= E, v.size = P; - } - for (let Z = 0, _ = t; Z < m.length; Z++) { - const v = m[Z], P = os(f[Z] - _, v.minimumSize, v.maximumSize), E = P - f[Z]; - _ += E, v.size = P; + for (const S of n) + b1(a, S), b1(h, S); + const u = a.map((S) => this.viewItems[S]), m = a.map((S) => i[S]), b = h.map((S) => this.viewItems[S]), g = h.map((S) => i[S]), Z = a.reduce((S, x) => S + (this.viewItems[x].minimumSize - i[x]), 0), f = a.reduce((S, x) => S + (this.viewItems[x].maximumSize - i[x]), 0), y = h.length === 0 ? Number.POSITIVE_INFINITY : h.reduce((S, x) => S + (i[x] - this.viewItems[x].minimumSize), 0), W = h.length === 0 ? Number.NEGATIVE_INFINITY : h.reduce((S, x) => S + (i[x] - this.viewItems[x].maximumSize), 0), G = Math.max(Z, W, l), X = Math.min(y, f, r); + let L = !1; + if (c) { + const S = this.viewItems[c.index], x = t >= c.limitDelta; + L = x !== S.visible, S.setVisible(x, c.size); + } + if (!L && d) { + const S = this.viewItems[d.index], x = t < d.limitDelta; + L = x !== S.visible, S.setVisible(x, d.size); + } + if (L) + return this.resize(e, t, i, n, o, l, r); + t = rs(t, G, X); + for (let S = 0, x = t; S < u.length; S++) { + const w = u[S], A = rs(m[S] + x, w.minimumSize, w.maximumSize), H = A - m[S]; + x -= H, w.size = A; + } + for (let S = 0, x = t; S < b.length; S++) { + const w = b[S], A = rs(g[S] - x, w.minimumSize, w.maximumSize), H = A - g[S]; + x += H, w.size = A; } return t; } distributeEmptySpace(e) { - const t = this.viewItems.reduce((l, a) => l + a.size, 0); + const t = this.viewItems.reduce((r, c) => r + c.size, 0); let i = this.size - t; - const n = Ns(this.viewItems.length - 1, -1), o = n.filter( - (l) => this.viewItems[l].priority === 1 + const n = ws(this.viewItems.length - 1, -1), o = n.filter( + (r) => this.viewItems[r].priority === 1 /* LayoutPriority.Low */ - ), r = n.filter( - (l) => this.viewItems[l].priority === 2 + ), l = n.filter( + (r) => this.viewItems[r].priority === 2 /* LayoutPriority.High */ ); - for (const l of r) - DN(n, l); - for (const l of o) - tS(n, l); - typeof e == "number" && tS(n, e); - for (let l = 0; i !== 0 && l < n.length; l++) { - const a = this.viewItems[n[l]], c = os(a.size + i, a.minimumSize, a.maximumSize), d = c - a.size; - i -= d, a.size = c; + for (const r of l) + QC(n, r); + for (const r of o) + b1(n, r); + typeof e == "number" && b1(n, e); + for (let r = 0; i !== 0 && r < n.length; r++) { + const c = this.viewItems[n[r]], d = rs(c.size + i, c.minimumSize, c.maximumSize), a = d - c.size; + i -= a, c.size = d; } } layoutViews() { @@ -64689,22 +64689,22 @@ class VQ extends R { } updateSashEnablement() { let e = !1; - const t = this.viewItems.map((a) => e = a.size - a.minimumSize > 0 || e); + const t = this.viewItems.map((c) => e = c.size - c.minimumSize > 0 || e); e = !1; - const i = this.viewItems.map((a) => e = a.maximumSize - a.size > 0 || e), n = [...this.viewItems].reverse(); + const i = this.viewItems.map((c) => e = c.maximumSize - c.size > 0 || e), n = [...this.viewItems].reverse(); e = !1; - const o = n.map((a) => e = a.size - a.minimumSize > 0 || e).reverse(); + const o = n.map((c) => e = c.size - c.minimumSize > 0 || e).reverse(); e = !1; - const r = n.map((a) => e = a.maximumSize - a.size > 0 || e).reverse(); - let l = 0; - for (let a = 0; a < this.sashItems.length; a++) { - const { sash: c } = this.sashItems[a], d = this.viewItems[a]; - l += d.size; - const h = !(t[a] && r[a + 1]), u = !(i[a] && o[a + 1]); + const l = n.map((c) => e = c.maximumSize - c.size > 0 || e).reverse(); + let r = 0; + for (let c = 0; c < this.sashItems.length; c++) { + const { sash: d } = this.sashItems[c], a = this.viewItems[c]; + r += a.size; + const h = !(t[c] && l[c + 1]), u = !(i[c] && o[c + 1]); if (h && u) { - const g = Ns(a, -1), m = Ns(a + 1, this.viewItems.length), f = this.findFirstSnapIndex(g), b = this.findFirstSnapIndex(m), y = typeof f == "number" && !this.viewItems[f].visible, w = typeof b == "number" && !this.viewItems[b].visible; - y && o[a] && (l > 0 || this.startSnappingEnabled) ? c.state = 1 : w && t[a] && (l < this._contentSize || this.endSnappingEnabled) ? c.state = 2 : c.state = 0; - } else h && !u ? c.state = 1 : !h && u ? c.state = 2 : c.state = 3; + const m = ws(c, -1), b = ws(c + 1, this.viewItems.length), g = this.findFirstSnapIndex(m), Z = this.findFirstSnapIndex(b), f = typeof g == "number" && !this.viewItems[g].visible, y = typeof Z == "number" && !this.viewItems[Z].visible; + f && o[c] && (r > 0 || this.startSnappingEnabled) ? d.state = 1 : y && t[c] && (r < this._contentSize || this.endSnappingEnabled) ? d.state = 2 : d.state = 0; + } else h && !u ? d.state = 1 : !h && u ? d.state = 2 : d.state = 3; } } getSashPosition(e) { @@ -64737,68 +64737,68 @@ class VQ extends R { } dispose() { var e; - (e = this.sashDragState) == null || e.disposable.dispose(), Wt(this.viewItems), this.viewItems = [], this.sashItems.forEach((t) => t.disposable.dispose()), this.sashItems = [], super.dispose(); + (e = this.sashDragState) == null || e.disposable.dispose(), Nt(this.viewItems), this.viewItems = [], this.sashItems.forEach((t) => t.disposable.dispose()), this.sashItems = [], super.dispose(); } } -const WZ = class WZ { +const U2 = class U2 { constructor(e, t, i) { - this.columns = e, this.getColumnSize = i, this.templateId = WZ.TemplateId, this.renderedTemplates = /* @__PURE__ */ new Set(); + this.columns = e, this.getColumnSize = i, this.templateId = U2.TemplateId, this.renderedTemplates = /* @__PURE__ */ new Set(); const n = new Map(t.map((o) => [o.templateId, o])); this.renderers = []; for (const o of e) { - const r = n.get(o.templateId); - if (!r) + const l = n.get(o.templateId); + if (!l) throw new Error(`Table cell renderer for template id ${o.templateId} not found.`); - this.renderers.push(r); + this.renderers.push(l); } } renderTemplate(e) { - const t = Q(e, ce(".monaco-table-tr")), i = [], n = []; - for (let r = 0; r < this.columns.length; r++) { - const l = this.renderers[r], a = Q(t, ce(".monaco-table-td", { "data-col-index": r })); - a.style.width = `${this.getColumnSize(r)}px`, i.push(a), n.push(l.renderTemplate(a)); + const t = O(e, de(".monaco-table-tr")), i = [], n = []; + for (let l = 0; l < this.columns.length; l++) { + const r = this.renderers[l], c = O(t, de(".monaco-table-td", { "data-col-index": l })); + c.style.width = `${this.getColumnSize(l)}px`, i.push(c), n.push(r.renderTemplate(c)); } const o = { container: e, cellContainers: i, cellTemplateData: n }; return this.renderedTemplates.add(o), o; } renderElement(e, t, i, n) { for (let o = 0; o < this.columns.length; o++) { - const l = this.columns[o].project(e); - this.renderers[o].renderElement(l, t, i.cellTemplateData[o], n); + const r = this.columns[o].project(e); + this.renderers[o].renderElement(r, t, i.cellTemplateData[o], n); } } disposeElement(e, t, i, n) { for (let o = 0; o < this.columns.length; o++) { - const r = this.renderers[o]; - if (r.disposeElement) { - const a = this.columns[o].project(e); - r.disposeElement(a, t, i.cellTemplateData[o], n); + const l = this.renderers[o]; + if (l.disposeElement) { + const c = this.columns[o].project(e); + l.disposeElement(c, t, i.cellTemplateData[o], n); } } } disposeTemplate(e) { for (let t = 0; t < this.columns.length; t++) this.renderers[t].disposeTemplate(e.cellTemplateData[t]); - gn(e.container), this.renderedTemplates.delete(e); + bn(e.container), this.renderedTemplates.delete(e); } layoutColumn(e, t) { for (const { cellContainers: i } of this.renderedTemplates) i[e].style.width = `${t}px`; } }; -WZ.TemplateId = "row"; -let Tx = WZ; -function lbe(s) { +U2.TemplateId = "row"; +let BL = U2; +function $Ze(s) { return { getHeight(e) { return s.getHeight(e); }, getTemplateId() { - return Tx.TemplateId; + return BL.TemplateId; } }; } -class abe extends R { +class e0e extends J { get minimumSize() { return this.column.minimumWidth ?? 120; } @@ -64809,13 +64809,13 @@ class abe extends R { return this.column.onDidChangeWidthConstraints ?? se.None; } constructor(e, t) { - super(), this.column = e, this.index = t, this._onDidLayout = new k(), this.onDidLayout = this._onDidLayout.event, this.element = ce(".monaco-table-th", { "data-col-index": t }, e.label), e.tooltip && this._register(Fl().setupManagedHover(As("mouse"), this.element, e.tooltip)); + super(), this.column = e, this.index = t, this._onDidLayout = new k(), this.onDidLayout = this._onDidLayout.event, this.element = de(".monaco-table-th", { "data-col-index": t }, e.label), e.tooltip && this._register(Kr().setupManagedHover(Is("mouse"), this.element, e.tooltip)); } layout(e) { this._onDidLayout.fire([this.index, e]); } } -const vZ = class vZ { +const P2 = class P2 { get onDidChangeFocus() { return this.list.onDidChangeFocus; } @@ -64849,23 +64849,23 @@ const vZ = class vZ { get onDidDispose() { return this.list.onDidDispose; } - constructor(e, t, i, n, o, r) { - this.virtualDelegate = i, this.columns = n, this.domId = `table_id_${++vZ.InstanceCount}`, this.disposables = new U(), this.cachedWidth = 0, this.cachedHeight = 0, this.domNode = Q(t, ce(`.monaco-table.${this.domId}`)); - const l = n.map((d, h) => this.disposables.add(new abe(d, h))), a = { - size: l.reduce((d, h) => d + h.column.weight, 0), - views: l.map((d) => ({ size: d.column.weight, view: d })) + constructor(e, t, i, n, o, l) { + this.virtualDelegate = i, this.columns = n, this.domId = `table_id_${++P2.InstanceCount}`, this.disposables = new _(), this.cachedWidth = 0, this.cachedHeight = 0, this.domNode = O(t, de(`.monaco-table.${this.domId}`)); + const r = n.map((a, h) => this.disposables.add(new e0e(a, h))), c = { + size: r.reduce((a, h) => a + h.column.weight, 0), + views: r.map((a) => ({ size: a.column.weight, view: a })) }; - this.splitview = this.disposables.add(new VQ(this.domNode, { + this.splitview = this.disposables.add(new g4(this.domNode, { orientation: 1, scrollbarVisibility: 2, getSashOrthogonalSize: () => this.cachedHeight, - descriptor: a + descriptor: c })), this.splitview.el.style.height = `${i.headerRowHeight}px`, this.splitview.el.style.lineHeight = `${i.headerRowHeight}px`; - const c = new Tx(n, o, (d) => this.splitview.getViewSize(d)); - this.list = this.disposables.add(new Qo(e, this.domNode, lbe(i), [c], r)), se.any(...l.map((d) => d.onDidLayout))(([d, h]) => c.layoutColumn(d, h), null, this.disposables), this.splitview.onDidSashReset((d) => { - const h = n.reduce((g, m) => g + m.weight, 0), u = n[d].weight / h * this.cachedWidth; - this.splitview.resizeView(d, u); - }, null, this.disposables), this.styleElement = Bo(this.domNode), this.style(nue); + const d = new BL(n, o, (a) => this.splitview.getViewSize(a)); + this.list = this.disposables.add(new qo(e, this.domNode, $Ze(i), [d], l)), se.any(...r.map((a) => a.onDidLayout))(([a, h]) => d.layoutColumn(a, h), null, this.disposables), this.splitview.onDidSashReset((a) => { + const h = n.reduce((m, b) => m + b.weight, 0), u = n[a].weight / h * this.cachedWidth; + this.splitview.resizeView(a, u); + }, null, this.disposables), this.styleElement = Po(this.domNode), this.style(Que); } updateOptions(e) { this.list.updateOptions(e); @@ -64897,13 +64897,13 @@ const vZ = class vZ { this.disposables.dispose(); } }; -vZ.InstanceCount = 0; -let rD = vZ; -class y0 extends Ko { +P2.InstanceCount = 0; +let xM = P2; +class L0 extends jo { constructor(e) { super(), this._onChange = this._register(new k()), this.onChange = this._onChange.event, this._onKeyDown = this._register(new k()), this.onKeyDown = this._onKeyDown.event, this._opts = e, this._checked = this._opts.isChecked; const t = ["monaco-custom-toggle"]; - this._opts.icon && (this._icon = this._opts.icon, t.push(...Ze.asClassNameArray(this._icon))), this._opts.actionClassName && t.push(...this._opts.actionClassName.split(" ")), this._checked && t.push("checked"), this.domNode = document.createElement("div"), this._hover = this._register(Fl().setupManagedHover(e.hoverDelegate ?? As("mouse"), this.domNode, this._opts.title)), this.domNode.classList.add(...t), this._opts.notFocusable || (this.domNode.tabIndex = 0), this.domNode.setAttribute("role", "checkbox"), this.domNode.setAttribute("aria-checked", String(this._checked)), this.domNode.setAttribute("aria-label", this._opts.title), this.applyStyles(), this.onclick(this.domNode, (i) => { + this._opts.icon && (this._icon = this._opts.icon, t.push(...Se.asClassNameArray(this._icon))), this._opts.actionClassName && t.push(...this._opts.actionClassName.split(" ")), this._checked && t.push("checked"), this.domNode = document.createElement("div"), this._hover = this._register(Kr().setupManagedHover(e.hoverDelegate ?? Is("mouse"), this.domNode, this._opts.title)), this.domNode.classList.add(...t), this._opts.notFocusable || (this.domNode.tabIndex = 0), this.domNode.setAttribute("role", "checkbox"), this.domNode.setAttribute("aria-checked", String(this._checked)), this.domNode.setAttribute("aria-label", this._opts.title), this.applyStyles(), this.onclick(this.domNode, (i) => { this.enabled && (this.checked = !this._checked, this._onChange.fire(!1), i.preventDefault()); }), this._register(this.ignoreGesture(this.domNode)), this.onkeydown(this.domNode, (i) => { if (i.keyCode === 10 || i.keyCode === 3) { @@ -64938,47 +64938,47 @@ class y0 extends Ko { this.domNode.setAttribute("aria-disabled", String(!0)); } } -const cbe = p("caseDescription", "Match Case"), dbe = p("wordsDescription", "Match Whole Word"), hbe = p("regexDescription", "Use Regular Expression"); -class kQ extends y0 { +const t0e = p("caseDescription", "Match Case"), i0e = p("wordsDescription", "Match Whole Word"), n0e = p("regexDescription", "Use Regular Expression"); +class Z4 extends L0 { constructor(e) { super({ icon: te.caseSensitive, - title: cbe + e.appendTitle, + title: t0e + e.appendTitle, isChecked: e.isChecked, - hoverDelegate: e.hoverDelegate ?? As("element"), + hoverDelegate: e.hoverDelegate ?? Is("element"), inputActiveOptionBorder: e.inputActiveOptionBorder, inputActiveOptionForeground: e.inputActiveOptionForeground, inputActiveOptionBackground: e.inputActiveOptionBackground }); } } -class GQ extends y0 { +class f4 extends L0 { constructor(e) { super({ icon: te.wholeWord, - title: dbe + e.appendTitle, + title: i0e + e.appendTitle, isChecked: e.isChecked, - hoverDelegate: e.hoverDelegate ?? As("element"), + hoverDelegate: e.hoverDelegate ?? Is("element"), inputActiveOptionBorder: e.inputActiveOptionBorder, inputActiveOptionForeground: e.inputActiveOptionForeground, inputActiveOptionBackground: e.inputActiveOptionBackground }); } } -class RQ extends y0 { +class y4 extends L0 { constructor(e) { super({ icon: te.regex, - title: hbe + e.appendTitle, + title: n0e + e.appendTitle, isChecked: e.isChecked, - hoverDelegate: e.hoverDelegate ?? As("element"), + hoverDelegate: e.hoverDelegate ?? Is("element"), inputActiveOptionBorder: e.inputActiveOptionBorder, inputActiveOptionForeground: e.inputActiveOptionForeground, inputActiveOptionBackground: e.inputActiveOptionBackground }); } } -class ube { +class s0e { constructor(e, t = 0, i = e.length, n = t - 1) { this.items = e, this.start = t, this.end = i, this.index = n; } @@ -64998,7 +64998,7 @@ class ube { return this.index = this.end - 1, this.current(); } } -class gbe { +class o0e { constructor(e = [], t = 10) { this._initialize(e), this._limit = t, this._onChange(); } @@ -65035,7 +65035,7 @@ class gbe { _onChange() { this._reduceToLimit(); const e = this._elements; - this._navigator = new ube(e, 0, e.length, e.length); + this._navigator = new s0e(e, 0, e.length, e.length); } _reduceToLimit() { const e = this._elements; @@ -65055,24 +65055,24 @@ class gbe { return this._history.forEach((t) => e.push(t)), e; } } -const P0 = ce; -let mbe = class extends Ko { +const O0 = de; +let l0e = class extends jo { constructor(e, t, i) { - super(), this.state = "idle", this.maxHeight = Number.POSITIVE_INFINITY, this._onDidChange = this._register(new k()), this.onDidChange = this._onDidChange.event, this._onDidHeightChange = this._register(new k()), this.onDidHeightChange = this._onDidHeightChange.event, this.contextViewProvider = t, this.options = i, this.message = null, this.placeholder = this.options.placeholder || "", this.tooltip = this.options.tooltip ?? (this.placeholder || ""), this.ariaLabel = this.options.ariaLabel || "", this.options.validationOptions && (this.validation = this.options.validationOptions.validation), this.element = Q(e, P0(".monaco-inputbox.idle")); - const n = this.options.flexibleHeight ? "textarea" : "input", o = Q(this.element, P0(".ibwrapper")); - if (this.input = Q(o, P0(n + ".input.empty")), this.input.setAttribute("autocorrect", "off"), this.input.setAttribute("autocapitalize", "off"), this.input.setAttribute("spellcheck", "false"), this.onfocus(this.input, () => this.element.classList.add("synthetic-focus")), this.onblur(this.input, () => this.element.classList.remove("synthetic-focus")), this.options.flexibleHeight) { - this.maxHeight = typeof this.options.flexibleMaxHeight == "number" ? this.options.flexibleMaxHeight : Number.POSITIVE_INFINITY, this.mirror = Q(o, P0("div.mirror")), this.mirror.innerText = " ", this.scrollableElement = new CU(this.element, { + super(), this.state = "idle", this.maxHeight = Number.POSITIVE_INFINITY, this._onDidChange = this._register(new k()), this.onDidChange = this._onDidChange.event, this._onDidHeightChange = this._register(new k()), this.onDidHeightChange = this._onDidHeightChange.event, this.contextViewProvider = t, this.options = i, this.message = null, this.placeholder = this.options.placeholder || "", this.tooltip = this.options.tooltip ?? (this.placeholder || ""), this.ariaLabel = this.options.ariaLabel || "", this.options.validationOptions && (this.validation = this.options.validationOptions.validation), this.element = O(e, O0(".monaco-inputbox.idle")); + const n = this.options.flexibleHeight ? "textarea" : "input", o = O(this.element, O0(".ibwrapper")); + if (this.input = O(o, O0(n + ".input.empty")), this.input.setAttribute("autocorrect", "off"), this.input.setAttribute("autocapitalize", "off"), this.input.setAttribute("spellcheck", "false"), this.onfocus(this.input, () => this.element.classList.add("synthetic-focus")), this.onblur(this.input, () => this.element.classList.remove("synthetic-focus")), this.options.flexibleHeight) { + this.maxHeight = typeof this.options.flexibleMaxHeight == "number" ? this.options.flexibleMaxHeight : Number.POSITIVE_INFINITY, this.mirror = O(o, O0("div.mirror")), this.mirror.innerText = " ", this.scrollableElement = new iQ(this.element, { vertical: 1 /* ScrollbarVisibility.Auto */ - }), this.options.flexibleWidth && (this.input.setAttribute("wrap", "off"), this.mirror.style.whiteSpace = "pre", this.mirror.style.wordWrap = "initial"), Q(e, this.scrollableElement.getDomNode()), this._register(this.scrollableElement), this._register(this.scrollableElement.onScroll((a) => this.input.scrollTop = a.scrollTop)); - const r = this._register(new et(e.ownerDocument, "selectionchange")), l = se.filter(r.event, () => { - const a = e.ownerDocument.getSelection(); - return (a == null ? void 0 : a.anchorNode) === o; + }), this.options.flexibleWidth && (this.input.setAttribute("wrap", "off"), this.mirror.style.whiteSpace = "pre", this.mirror.style.wordWrap = "initial"), O(e, this.scrollableElement.getDomNode()), this._register(this.scrollableElement), this._register(this.scrollableElement.onScroll((c) => this.input.scrollTop = c.scrollTop)); + const l = this._register(new et(e.ownerDocument, "selectionchange")), r = se.filter(l.event, () => { + const c = e.ownerDocument.getSelection(); + return (c == null ? void 0 : c.anchorNode) === o; }); - this._register(l(this.updateScrollDimensions, this)), this._register(this.onDidHeightChange(this.updateScrollDimensions, this)); + this._register(r(this.updateScrollDimensions, this)), this._register(this.onDidHeightChange(this.updateScrollDimensions, this)); } else this.input.type = this.options.type || "text", this.input.setAttribute("wrap", "off"); - this.ariaLabel && this.input.setAttribute("aria-label", this.ariaLabel), this.placeholder && !this.options.showPlaceholderOnFocus && this.setPlaceHolder(this.placeholder), this.tooltip && this.setTooltip(this.tooltip), this.oninput(this.input, () => this.onValueChange()), this.onblur(this.input, () => this.onBlur()), this.onfocus(this.input, () => this.onFocus()), this._register(this.ignoreGesture(this.input)), setTimeout(() => this.updateMirror(), 0), this.options.actions && (this.actionbar = this._register(new Yo(this.element)), this.actionbar.push(this.options.actions, { icon: !0, label: !1 })), this.applyStyles(); + this.ariaLabel && this.input.setAttribute("aria-label", this.ariaLabel), this.placeholder && !this.options.showPlaceholderOnFocus && this.setPlaceHolder(this.placeholder), this.tooltip && this.setTooltip(this.tooltip), this.oninput(this.input, () => this.onValueChange()), this.onblur(this.input, () => this.onBlur()), this.onfocus(this.input, () => this.onFocus()), this._register(this.ignoreGesture(this.input)), setTimeout(() => this.updateMirror(), 0), this.options.actions && (this.actionbar = this._register(new Ao(this.element)), this.actionbar.push(this.options.actions, { icon: !0, label: !1 })), this.applyStyles(); } onBlur() { this._hideMessage(), this.options.showPlaceholderOnFocus && this.input.setAttribute("placeholder", ""); @@ -65084,7 +65084,7 @@ let mbe = class extends Ko { this.placeholder = e, this.input.setAttribute("placeholder", e); } setTooltip(e) { - this.tooltip = e, this.hover ? this.hover.update(e) : this.hover = this._register(Fl().setupManagedHover(As("mouse"), this.input, e)); + this.tooltip = e, this.hover ? this.hover.update(e) : this.hover = this._register(Kr().setupManagedHover(Is("mouse"), this.input, e)); } get inputElement() { return this.input; @@ -65096,7 +65096,7 @@ let mbe = class extends Ko { this.input.value !== e && (this.input.value = e, this.onValueChange()); } get height() { - return typeof this.cachedHeight == "number" ? this.cachedHeight : Lc(this.element); + return typeof this.cachedHeight == "number" ? this.cachedHeight : Sd(this.element); } focus() { this.input.focus(); @@ -65105,7 +65105,7 @@ let mbe = class extends Ko { this.input.blur(); } hasFocus() { - return k_(this.input); + return OS(this.input); } select(e = null) { this.input.select(), e && (this.input.setSelectionRange(e.start, e.end), e.end === this.input.value.length && (this.input.scrollLeft = this.input.scrollWidth)); @@ -65139,11 +65139,11 @@ let mbe = class extends Ko { this.scrollableElement.setScrollDimensions({ scrollHeight: e, height: t }), this.scrollableElement.setScrollPosition({ scrollTop: i }); } showMessage(e, t) { - if (this.state === "open" && co(this.message, e)) + if (this.state === "open" && uo(this.message, e)) return; this.message = e, this.element.classList.remove("idle"), this.element.classList.remove("info"), this.element.classList.remove("warning"), this.element.classList.remove("error"), this.element.classList.add(this.classForType(e.type)); const i = this.stylesForType(this.message.type); - this.element.style.border = `1px solid ${Gc(i.border, "transparent")}`, this.message.content && (this.hasFocus() || t) && this._showMessage(); + this.element.style.border = `1px solid ${Dd(i.border, "transparent")}`, this.message.content && (this.hasFocus() || t) && this._showMessage(); } hideMessage() { this.message = null, this.element.classList.remove("info"), this.element.classList.remove("warning"), this.element.classList.remove("error"), this.element.classList.add("idle"), this._hideMessage(), this.applyStyles(); @@ -65177,21 +65177,21 @@ let mbe = class extends Ko { if (!this.contextViewProvider || !this.message) return; let e; - const t = () => e.style.width = $s(this.element) + "px"; + const t = () => e.style.width = to(this.element) + "px"; this.contextViewProvider.showContextView({ getAnchor: () => this.element, anchorAlignment: 1, render: (n) => { if (!this.message) return null; - e = Q(n, P0(".monaco-inputbox-container")), t(); + e = O(n, O0(".monaco-inputbox-container")), t(); const o = { inline: !0, className: "monaco-inputbox-message" - }, r = this.message.formatContent ? Tde(this.message.content, o) : vde(this.message.content, o); - r.classList.add(this.classForType(this.message.type)); - const l = this.stylesForType(this.message.type); - return r.style.backgroundColor = l.background ?? "", r.style.color = l.foreground ?? "", r.style.border = l.border ? `1px solid ${l.border}` : "", Q(e, r), null; + }, l = this.message.formatContent ? Lhe(this.message.content, o) : Vhe(this.message.content, o); + l.classList.add(this.classForType(this.message.type)); + const r = this.stylesForType(this.message.type); + return l.style.backgroundColor = r.background ?? "", l.style.color = r.foreground ?? "", l.style.border = r.border ? `1px solid ${r.border}` : "", O(e, l), null; }, onHide: () => { this.state = "closed"; @@ -65199,7 +65199,7 @@ let mbe = class extends Ko { layout: t }); let i; - this.message.type === 3 ? i = p("alertErrorMessage", "Error: {0}", this.message.content) : this.message.type === 2 ? i = p("alertWarningMessage", "Warning: {0}", this.message.content) : i = p("alertInfoMessage", "Info: {0}", this.message.content), bs(i), this.state = "open"; + this.message.type === 3 ? i = p("alertErrorMessage", "Error: {0}", this.message.content) : this.message.type === 2 ? i = p("alertWarningMessage", "Warning: {0}", this.message.content) : i = p("alertInfoMessage", "Info: {0}", this.message.content), ys(i), this.state = "open"; } _hideMessage() { this.contextViewProvider && (this.state === "open" && this.contextViewProvider.hideContextView(), this.state = "idle"); @@ -65215,13 +65215,13 @@ let mbe = class extends Ko { } applyStyles() { const e = this.options.inputBoxStyles, t = e.inputBackground ?? "", i = e.inputForeground ?? "", n = e.inputBorder ?? ""; - this.element.style.backgroundColor = t, this.element.style.color = i, this.input.style.backgroundColor = "inherit", this.input.style.color = i, this.element.style.border = `1px solid ${Gc(n, "transparent")}`; + this.element.style.backgroundColor = t, this.element.style.color = i, this.input.style.backgroundColor = "inherit", this.input.style.color = i, this.element.style.border = `1px solid ${Dd(n, "transparent")}`; } layout() { if (!this.mirror) return; const e = this.cachedContentHeight; - this.cachedContentHeight = Lc(this.mirror), e !== this.cachedContentHeight && (this.cachedHeight = Math.min(this.cachedContentHeight, this.maxHeight), this.input.style.height = this.cachedHeight + "px", this._onDidHeightChange.fire(this.cachedContentHeight)); + this.cachedContentHeight = Sd(this.mirror), e !== this.cachedContentHeight && (this.cachedHeight = Math.min(this.cachedContentHeight, this.maxHeight), this.input.style.height = this.cachedHeight + "px", this._onDidHeightChange.fire(this.cachedContentHeight)); } insertAtCursor(e) { const t = this.inputElement, i = t.selectionStart, n = t.selectionEnd, o = t.value; @@ -65232,7 +65232,7 @@ let mbe = class extends Ko { this._hideMessage(), this.message = null, (e = this.actionbar) == null || e.dispose(), super.dispose(); } }; -class EQ extends mbe { +class W4 extends l0e { constructor(e, t, i) { const n = p({ key: "history.inputbox.hint.suffix.noparens", @@ -65241,26 +65241,26 @@ class EQ extends mbe { key: "history.inputbox.hint.suffix.inparens", comment: ['Text is the suffix of an input field placeholder coming after the action the input field performs, this will be used when the input field does NOT end in a closing parenthesis (eg. "Find"). The character inserted into the final string is ⇅ to represent the up and down arrow keys.'] }, " ({0} for history)", "⇅"); - super(e, t, i), this._onDidFocus = this._register(new k()), this.onDidFocus = this._onDidFocus.event, this._onDidBlur = this._register(new k()), this.onDidBlur = this._onDidBlur.event, this.history = new gbe(i.history, 100); - const r = () => { + super(e, t, i), this._onDidFocus = this._register(new k()), this.onDidFocus = this._onDidFocus.event, this._onDidBlur = this._register(new k()), this.onDidBlur = this._onDidBlur.event, this.history = new o0e(i.history, 100); + const l = () => { if (i.showHistoryHint && i.showHistoryHint() && !this.placeholder.endsWith(n) && !this.placeholder.endsWith(o) && this.history.getHistory().length) { - const l = this.placeholder.endsWith(")") ? n : o, a = this.placeholder + l; - i.showPlaceholderOnFocus && !k_(this.input) ? this.placeholder = a : this.setPlaceHolder(a); + const r = this.placeholder.endsWith(")") ? n : o, c = this.placeholder + r; + i.showPlaceholderOnFocus && !OS(this.input) ? this.placeholder = c : this.setPlaceHolder(c); } }; - this.observer = new MutationObserver((l, a) => { - l.forEach((c) => { - c.target.textContent || r(); + this.observer = new MutationObserver((r, c) => { + r.forEach((d) => { + d.target.textContent || l(); }); - }), this.observer.observe(this.input, { attributeFilter: ["class"] }), this.onfocus(this.input, () => r()), this.onblur(this.input, () => { - const l = (a) => { - if (this.placeholder.endsWith(a)) { - const c = this.placeholder.slice(0, this.placeholder.length - a.length); - return i.showPlaceholderOnFocus ? this.placeholder = c : this.setPlaceHolder(c), !0; + }), this.observer.observe(this.input, { attributeFilter: ["class"] }), this.onfocus(this.input, () => l()), this.onblur(this.input, () => { + const r = (c) => { + if (this.placeholder.endsWith(c)) { + const d = this.placeholder.slice(0, this.placeholder.length - c.length); + return i.showPlaceholderOnFocus ? this.placeholder = d : this.setPlaceHolder(d), !0; } else return !1; }; - l(o) || l(n); + r(o) || r(n); }); } dispose() { @@ -65278,12 +65278,12 @@ class EQ extends mbe { showNextValue() { this.history.has(this.value) || this.addToHistory(); let e = this.getNextValue(); - e && (e = e === this.value ? this.getNextValue() : e), this.value = e ?? "", Bc(this.value ? this.value : p("clearedInput", "Cleared Input")); + e && (e = e === this.value ? this.getNextValue() : e), this.value = e ?? "", _d(this.value ? this.value : p("clearedInput", "Cleared Input")); } showPreviousValue() { this.history.has(this.value) || this.addToHistory(); let e = this.getPreviousValue(); - e && (e = e === this.value ? this.getPreviousValue() : e), e && (this.value = e, Bc(this.value)); + e && (e = e === this.value ? this.getPreviousValue() : e), e && (this.value = e, _d(this.value)); } setPlaceHolder(e) { super.setPlaceHolder(e), this.setTooltip(e); @@ -65305,77 +65305,77 @@ class EQ extends mbe { return this.history.next(); } } -const pbe = p("defaultLabel", "input"); -class XQ extends Ko { +const r0e = p("defaultLabel", "input"); +class G4 extends jo { constructor(e, t, i) { - super(), this.fixFocusOnOptionClickEnabled = !0, this.imeSessionInProgress = !1, this.additionalTogglesDisposables = this._register(new fn()), this.additionalToggles = [], this._onDidOptionChange = this._register(new k()), this.onDidOptionChange = this._onDidOptionChange.event, this._onKeyDown = this._register(new k()), this.onKeyDown = this._onKeyDown.event, this._onMouseDown = this._register(new k()), this.onMouseDown = this._onMouseDown.event, this._onInput = this._register(new k()), this._onKeyUp = this._register(new k()), this._onCaseSensitiveKeyDown = this._register(new k()), this.onCaseSensitiveKeyDown = this._onCaseSensitiveKeyDown.event, this._onRegexKeyDown = this._register(new k()), this.onRegexKeyDown = this._onRegexKeyDown.event, this._lastHighlightFindOptions = 0, this.placeholder = i.placeholder || "", this.validation = i.validation, this.label = i.label || pbe, this.showCommonFindToggles = !!i.showCommonFindToggles; - const n = i.appendCaseSensitiveLabel || "", o = i.appendWholeWordsLabel || "", r = i.appendRegexLabel || "", l = i.history || [], a = !!i.flexibleHeight, c = !!i.flexibleWidth, d = i.flexibleMaxHeight; - this.domNode = document.createElement("div"), this.domNode.classList.add("monaco-findInput"), this.inputBox = this._register(new EQ(this.domNode, t, { + super(), this.fixFocusOnOptionClickEnabled = !0, this.imeSessionInProgress = !1, this.additionalTogglesDisposables = this._register(new Zn()), this.additionalToggles = [], this._onDidOptionChange = this._register(new k()), this.onDidOptionChange = this._onDidOptionChange.event, this._onKeyDown = this._register(new k()), this.onKeyDown = this._onKeyDown.event, this._onMouseDown = this._register(new k()), this.onMouseDown = this._onMouseDown.event, this._onInput = this._register(new k()), this._onKeyUp = this._register(new k()), this._onCaseSensitiveKeyDown = this._register(new k()), this.onCaseSensitiveKeyDown = this._onCaseSensitiveKeyDown.event, this._onRegexKeyDown = this._register(new k()), this.onRegexKeyDown = this._onRegexKeyDown.event, this._lastHighlightFindOptions = 0, this.placeholder = i.placeholder || "", this.validation = i.validation, this.label = i.label || r0e, this.showCommonFindToggles = !!i.showCommonFindToggles; + const n = i.appendCaseSensitiveLabel || "", o = i.appendWholeWordsLabel || "", l = i.appendRegexLabel || "", r = i.history || [], c = !!i.flexibleHeight, d = !!i.flexibleWidth, a = i.flexibleMaxHeight; + this.domNode = document.createElement("div"), this.domNode.classList.add("monaco-findInput"), this.inputBox = this._register(new W4(this.domNode, t, { placeholder: this.placeholder || "", ariaLabel: this.label || "", validationOptions: { validation: this.validation }, - history: l, + history: r, showHistoryHint: i.showHistoryHint, - flexibleHeight: a, - flexibleWidth: c, - flexibleMaxHeight: d, + flexibleHeight: c, + flexibleWidth: d, + flexibleMaxHeight: a, inputBoxStyles: i.inputBoxStyles })); - const h = this._register(yb()); + const h = this._register(LZ()); if (this.showCommonFindToggles) { - this.regex = this._register(new RQ({ - appendTitle: r, + this.regex = this._register(new y4({ + appendTitle: l, isChecked: !1, hoverDelegate: h, ...i.toggleStyles - })), this._register(this.regex.onChange((g) => { - this._onDidOptionChange.fire(g), !g && this.fixFocusOnOptionClickEnabled && this.inputBox.focus(), this.validate(); - })), this._register(this.regex.onKeyDown((g) => { - this._onRegexKeyDown.fire(g); - })), this.wholeWords = this._register(new GQ({ + })), this._register(this.regex.onChange((m) => { + this._onDidOptionChange.fire(m), !m && this.fixFocusOnOptionClickEnabled && this.inputBox.focus(), this.validate(); + })), this._register(this.regex.onKeyDown((m) => { + this._onRegexKeyDown.fire(m); + })), this.wholeWords = this._register(new f4({ appendTitle: o, isChecked: !1, hoverDelegate: h, ...i.toggleStyles - })), this._register(this.wholeWords.onChange((g) => { - this._onDidOptionChange.fire(g), !g && this.fixFocusOnOptionClickEnabled && this.inputBox.focus(), this.validate(); - })), this.caseSensitive = this._register(new kQ({ + })), this._register(this.wholeWords.onChange((m) => { + this._onDidOptionChange.fire(m), !m && this.fixFocusOnOptionClickEnabled && this.inputBox.focus(), this.validate(); + })), this.caseSensitive = this._register(new Z4({ appendTitle: n, isChecked: !1, hoverDelegate: h, ...i.toggleStyles - })), this._register(this.caseSensitive.onChange((g) => { - this._onDidOptionChange.fire(g), !g && this.fixFocusOnOptionClickEnabled && this.inputBox.focus(), this.validate(); - })), this._register(this.caseSensitive.onKeyDown((g) => { - this._onCaseSensitiveKeyDown.fire(g); + })), this._register(this.caseSensitive.onChange((m) => { + this._onDidOptionChange.fire(m), !m && this.fixFocusOnOptionClickEnabled && this.inputBox.focus(), this.validate(); + })), this._register(this.caseSensitive.onKeyDown((m) => { + this._onCaseSensitiveKeyDown.fire(m); })); const u = [this.caseSensitive.domNode, this.wholeWords.domNode, this.regex.domNode]; - this.onkeydown(this.domNode, (g) => { - if (g.equals( + this.onkeydown(this.domNode, (m) => { + if (m.equals( 15 /* KeyCode.LeftArrow */ - ) || g.equals( + ) || m.equals( 17 /* KeyCode.RightArrow */ - ) || g.equals( + ) || m.equals( 9 /* KeyCode.Escape */ )) { - const m = u.indexOf(this.domNode.ownerDocument.activeElement); - if (m >= 0) { - let f = -1; - g.equals( + const b = u.indexOf(this.domNode.ownerDocument.activeElement); + if (b >= 0) { + let g = -1; + m.equals( 17 /* KeyCode.RightArrow */ - ) ? f = (m + 1) % u.length : g.equals( + ) ? g = (b + 1) % u.length : m.equals( 15 /* KeyCode.LeftArrow */ - ) && (m === 0 ? f = u.length - 1 : f = m - 1), g.equals( + ) && (b === 0 ? g = u.length - 1 : g = b - 1), m.equals( 9 /* KeyCode.Escape */ - ) ? (u[m].blur(), this.inputBox.focus()) : f >= 0 && u[f].focus(), tt.stop(g, !0); + ) ? (u[b].blur(), this.inputBox.focus()) : g >= 0 && u[g].focus(), tt.stop(m, !0); } } }); @@ -65413,7 +65413,7 @@ class XQ extends Ko { setAdditionalToggles(e) { for (const t of this.additionalToggles) t.domNode.remove(); - this.additionalToggles = [], this.additionalTogglesDisposables.value = new U(); + this.additionalToggles = [], this.additionalTogglesDisposables.value = new _(); for (const t of e ?? []) this.additionalTogglesDisposables.value.add(t), this.controls.appendChild(t.domNode), this.additionalTogglesDisposables.value.add(t.onChange((i) => { this._onDidOptionChange.fire(i), !i && this.fixFocusOnOptionClickEnabled && this.inputBox.focus(); @@ -65422,7 +65422,7 @@ class XQ extends Ko { } updateInputBoxPadding(e = !1) { var t, i, n; - e ? this.inputBox.paddingRight = 0 : this.inputBox.paddingRight = (((t = this.caseSensitive) == null ? void 0 : t.width()) ?? 0) + (((i = this.wholeWords) == null ? void 0 : i.width()) ?? 0) + (((n = this.regex) == null ? void 0 : n.width()) ?? 0) + this.additionalToggles.reduce((o, r) => o + r.width(), 0); + e ? this.inputBox.paddingRight = 0 : this.inputBox.paddingRight = (((t = this.caseSensitive) == null ? void 0 : t.width()) ?? 0) + (((i = this.wholeWords) == null ? void 0 : i.width()) ?? 0) + (((n = this.regex) == null ? void 0 : n.width()) ?? 0) + this.additionalToggles.reduce((o, l) => o + l.width(), 0); } getValue() { return this.inputBox.value; @@ -65474,20 +65474,20 @@ class XQ extends Ko { this.inputBox.hideMessage(); } } -var Io; +var No; (function(s) { s[s.Expanded = 0] = "Expanded", s[s.Collapsed = 1] = "Collapsed", s[s.PreserveOrExpanded = 2] = "PreserveOrExpanded", s[s.PreserveOrCollapsed = 3] = "PreserveOrCollapsed"; -})(Io || (Io = {})); -var ng; +})(No || (No = {})); +var cm; (function(s) { s[s.Unknown = 0] = "Unknown", s[s.Twistie = 1] = "Twistie", s[s.Element = 2] = "Element", s[s.Filter = 3] = "Filter"; -})(ng || (ng = {})); -class Go extends Error { +})(cm || (cm = {})); +class Ho extends Error { constructor(e, t) { super(`TreeError [${e}] ${t}`); } } -class h5 { +class vH { constructor(e) { this.fn = e, this._map = /* @__PURE__ */ new WeakMap(); } @@ -65496,7 +65496,7 @@ class h5 { return t || (t = this.fn(e), this._map.set(e, t)), t; } } -class Sd { +class Ia { /** * Constructs a new DiffChange with the given sequence information * and content. @@ -65517,7 +65517,7 @@ class Sd { return this.modifiedStart + this.modifiedLength; } } -class g3 { +class HA { constructor(e) { this.source = e; } @@ -65528,16 +65528,16 @@ class g3 { return t; } } -function fbe(s, e, t) { - return new wa(new g3(s), new g3(e)).ComputeDiff(t).changes; +function c0e(s, e, t) { + return new Vc(new HA(s), new HA(e)).ComputeDiff(t).changes; } -class dp { +class pp { static Assert(e, t) { if (!e) throw new Error(t); } } -class hp { +class gp { /** * Copies a range of elements from an Array starting at the specified source index and pastes * them to another Array starting at the specified destination index. The length and the indexes @@ -65554,15 +65554,15 @@ class hp { * A 64-bit integer that represents the number of elements to copy. */ static Copy(e, t, i, n, o) { - for (let r = 0; r < o; r++) - i[n + r] = e[t + r]; + for (let l = 0; l < o; l++) + i[n + l] = e[t + l]; } static Copy2(e, t, i, n, o) { - for (let r = 0; r < o; r++) - i[n + r] = e[t + r]; + for (let l = 0; l < o; l++) + i[n + l] = e[t + l]; } } -class m3 { +class EA { /** * Constructs a new DiffChangeHelper for the given DiffSequences. */ @@ -65573,7 +65573,7 @@ class m3 { * Marks the beginning of the next change in the set of differences. */ MarkNextChange() { - (this.m_originalCount > 0 || this.m_modifiedCount > 0) && this.m_changes.push(new Sd(this.m_originalStart, this.m_originalCount, this.m_modifiedStart, this.m_modifiedCount)), this.m_originalCount = 0, this.m_modifiedCount = 0, this.m_originalStart = 1073741824, this.m_modifiedStart = 1073741824; + (this.m_originalCount > 0 || this.m_modifiedCount > 0) && this.m_changes.push(new Ia(this.m_originalStart, this.m_originalCount, this.m_modifiedStart, this.m_modifiedCount)), this.m_originalCount = 0, this.m_modifiedCount = 0, this.m_originalStart = 1073741824, this.m_modifiedStart = 1073741824; } /** * Adds the original element at the given position to the elements @@ -65608,24 +65608,24 @@ class m3 { return (this.m_originalCount > 0 || this.m_modifiedCount > 0) && this.MarkNextChange(), this.m_changes.reverse(), this.m_changes; } } -class wa { +class Vc { /** * Constructs the DiffFinder */ constructor(e, t, i = null) { this.ContinueProcessingPredicate = i, this._originalSequence = e, this._modifiedSequence = t; - const [n, o, r] = wa._getElements(e), [l, a, c] = wa._getElements(t); - this._hasStrings = r && c, this._originalStringElements = n, this._originalElementsOrHash = o, this._modifiedStringElements = l, this._modifiedElementsOrHash = a, this.m_forwardHistory = [], this.m_reverseHistory = []; + const [n, o, l] = Vc._getElements(e), [r, c, d] = Vc._getElements(t); + this._hasStrings = l && d, this._originalStringElements = n, this._originalElementsOrHash = o, this._modifiedStringElements = r, this._modifiedElementsOrHash = c, this.m_forwardHistory = [], this.m_reverseHistory = []; } static _isStringArray(e) { return e.length > 0 && typeof e[0] == "string"; } static _getElements(e) { const t = e.getElements(); - if (wa._isStringArray(t)) { + if (Vc._isStringArray(t)) { const i = new Int32Array(t.length); for (let n = 0, o = t.length; n < o; n++) - i[n] = lE(t[n], 0); + i[n] = Tv(t[n], 0); return [t, i, !0]; } return t instanceof Int32Array ? [[], t, !1] : [[], new Int32Array(t), !1]; @@ -65636,7 +65636,7 @@ class wa { ElementsAreStrictEqual(e, t) { if (!this.ElementsAreEqual(e, t)) return !1; - const i = wa._getStrictElement(this._originalSequence, e), n = wa._getStrictElement(this._modifiedSequence, t); + const i = Vc._getStrictElement(this._originalSequence, e), n = Vc._getStrictElement(this._modifiedSequence, t); return i === n; } static _getStrictElement(e, t) { @@ -65657,11 +65657,11 @@ class wa { * @returns An array of the differences between the two input sequences. */ _ComputeDiff(e, t, i, n, o) { - const r = [!1]; - let l = this.ComputeDiffRecursive(e, t, i, n, r); - return o && (l = this.PrettifyChanges(l)), { - quitEarly: r[0], - changes: l + const l = [!1]; + let r = this.ComputeDiffRecursive(e, t, i, n, l); + return o && (r = this.PrettifyChanges(r)), { + quitEarly: l[0], + changes: r }; } /** @@ -65676,50 +65676,50 @@ class wa { t--, n--; if (e > t || i > n) { let h; - return i <= n ? (dp.Assert(e === t + 1, "originalStart should only be one more than originalEnd"), h = [ - new Sd(e, 0, i, n - i + 1) - ]) : e <= t ? (dp.Assert(i === n + 1, "modifiedStart should only be one more than modifiedEnd"), h = [ - new Sd(e, t - e + 1, i, 0) - ]) : (dp.Assert(e === t + 1, "originalStart should only be one more than originalEnd"), dp.Assert(i === n + 1, "modifiedStart should only be one more than modifiedEnd"), h = []), h; - } - const r = [0], l = [0], a = this.ComputeRecursionPoint(e, t, i, n, r, l, o), c = r[0], d = l[0]; - if (a !== null) - return a; + return i <= n ? (pp.Assert(e === t + 1, "originalStart should only be one more than originalEnd"), h = [ + new Ia(e, 0, i, n - i + 1) + ]) : e <= t ? (pp.Assert(i === n + 1, "modifiedStart should only be one more than modifiedEnd"), h = [ + new Ia(e, t - e + 1, i, 0) + ]) : (pp.Assert(e === t + 1, "originalStart should only be one more than originalEnd"), pp.Assert(i === n + 1, "modifiedStart should only be one more than modifiedEnd"), h = []), h; + } + const l = [0], r = [0], c = this.ComputeRecursionPoint(e, t, i, n, l, r, o), d = l[0], a = r[0]; + if (c !== null) + return c; if (!o[0]) { - const h = this.ComputeDiffRecursive(e, c, i, d, o); + const h = this.ComputeDiffRecursive(e, d, i, a, o); let u = []; return o[0] ? u = [ - new Sd(c + 1, t - (c + 1) + 1, d + 1, n - (d + 1) + 1) - ] : u = this.ComputeDiffRecursive(c + 1, t, d + 1, n, o), this.ConcatenateChanges(h, u); + new Ia(d + 1, t - (d + 1) + 1, a + 1, n - (a + 1) + 1) + ] : u = this.ComputeDiffRecursive(d + 1, t, a + 1, n, o), this.ConcatenateChanges(h, u); } return [ - new Sd(e, t - e + 1, i, n - i + 1) + new Ia(e, t - e + 1, i, n - i + 1) ]; } - WALKTRACE(e, t, i, n, o, r, l, a, c, d, h, u, g, m, f, b, y, w) { - let C = null, S = null, L = new m3(), x = t, Z = i, _ = g[0] - b[0] - n, v = -1073741824, P = this.m_forwardHistory.length - 1; + WALKTRACE(e, t, i, n, o, l, r, c, d, a, h, u, m, b, g, Z, f, y) { + let W = null, G = null, X = new EA(), L = t, S = i, x = m[0] - Z[0] - n, w = -1073741824, A = this.m_forwardHistory.length - 1; do { - const E = _ + e; - E === x || E < Z && c[E - 1] < c[E + 1] ? (h = c[E + 1], m = h - _ - n, h < v && L.MarkNextChange(), v = h, L.AddModifiedElement(h + 1, m), _ = E + 1 - e) : (h = c[E - 1] + 1, m = h - _ - n, h < v && L.MarkNextChange(), v = h - 1, L.AddOriginalElement(h, m + 1), _ = E - 1 - e), P >= 0 && (c = this.m_forwardHistory[P], e = c[0], x = 1, Z = c.length - 1); - } while (--P >= -1); - if (C = L.getReverseChanges(), w[0]) { - let E = g[0] + 1, Y = b[0] + 1; - if (C !== null && C.length > 0) { - const B = C[C.length - 1]; - E = Math.max(E, B.getOriginalEnd()), Y = Math.max(Y, B.getModifiedEnd()); - } - S = [ - new Sd(E, u - E + 1, Y, f - Y + 1) + const H = x + e; + H === L || H < S && d[H - 1] < d[H + 1] ? (h = d[H + 1], b = h - x - n, h < w && X.MarkNextChange(), w = h, X.AddModifiedElement(h + 1, b), x = H + 1 - e) : (h = d[H - 1] + 1, b = h - x - n, h < w && X.MarkNextChange(), w = h - 1, X.AddOriginalElement(h, b + 1), x = H - 1 - e), A >= 0 && (d = this.m_forwardHistory[A], e = d[0], L = 1, S = d.length - 1); + } while (--A >= -1); + if (W = X.getReverseChanges(), y[0]) { + let H = m[0] + 1, F = Z[0] + 1; + if (W !== null && W.length > 0) { + const K = W[W.length - 1]; + H = Math.max(H, K.getOriginalEnd()), F = Math.max(F, K.getModifiedEnd()); + } + G = [ + new Ia(H, u - H + 1, F, g - F + 1) ]; } else { - L = new m3(), x = r, Z = l, _ = g[0] - b[0] - a, v = 1073741824, P = y ? this.m_reverseHistory.length - 1 : this.m_reverseHistory.length - 2; + X = new EA(), L = l, S = r, x = m[0] - Z[0] - c, w = 1073741824, A = f ? this.m_reverseHistory.length - 1 : this.m_reverseHistory.length - 2; do { - const E = _ + o; - E === x || E < Z && d[E - 1] >= d[E + 1] ? (h = d[E + 1] - 1, m = h - _ - a, h > v && L.MarkNextChange(), v = h + 1, L.AddOriginalElement(h + 1, m + 1), _ = E + 1 - o) : (h = d[E - 1], m = h - _ - a, h > v && L.MarkNextChange(), v = h, L.AddModifiedElement(h + 1, m + 1), _ = E - 1 - o), P >= 0 && (d = this.m_reverseHistory[P], o = d[0], x = 1, Z = d.length - 1); - } while (--P >= -1); - S = L.getChanges(); + const H = x + o; + H === L || H < S && a[H - 1] >= a[H + 1] ? (h = a[H + 1] - 1, b = h - x - c, h > w && X.MarkNextChange(), w = h + 1, X.AddOriginalElement(h + 1, b + 1), x = H + 1 - o) : (h = a[H - 1], b = h - x - c, h > w && X.MarkNextChange(), w = h, X.AddModifiedElement(h + 1, b + 1), x = H - 1 - o), A >= 0 && (a = this.m_reverseHistory[A], o = a[0], L = 1, S = a.length - 1); + } while (--A >= -1); + G = X.getChanges(); } - return this.ConcatenateChanges(C, S); + return this.ConcatenateChanges(W, G); } /** * Given the range to compute the diff on, this method finds the point: @@ -65737,42 +65737,42 @@ class wa { * @param midModified The middle point of the modified sequence range * @returns The diff changes, if available, otherwise null */ - ComputeRecursionPoint(e, t, i, n, o, r, l) { - let a = 0, c = 0, d = 0, h = 0, u = 0, g = 0; - e--, i--, o[0] = 0, r[0] = 0, this.m_forwardHistory = [], this.m_reverseHistory = []; - const m = t - e + (n - i), f = m + 1, b = new Int32Array(f), y = new Int32Array(f), w = n - i, C = t - e, S = e - i, L = t - n, Z = (C - w) % 2 === 0; - b[w] = e, y[C] = t, l[0] = !1; - for (let _ = 1; _ <= m / 2 + 1; _++) { - let v = 0, P = 0; - d = this.ClipDiagonalBound(w - _, _, w, f), h = this.ClipDiagonalBound(w + _, _, w, f); - for (let Y = d; Y <= h; Y += 2) { - Y === d || Y < h && b[Y - 1] < b[Y + 1] ? a = b[Y + 1] : a = b[Y - 1] + 1, c = a - (Y - w) - S; - const B = a; - for (; a < t && c < n && this.ElementsAreEqual(a + 1, c + 1); ) - a++, c++; - if (b[Y] = a, a + c > v + P && (v = a, P = c), !Z && Math.abs(Y - C) <= _ - 1 && a >= y[Y]) - return o[0] = a, r[0] = c, B <= y[Y] && _ <= 1448 ? this.WALKTRACE(w, d, h, S, C, u, g, L, b, y, a, t, o, c, n, r, Z, l) : null; - } - const E = (v - e + (P - i) - _) / 2; - if (this.ContinueProcessingPredicate !== null && !this.ContinueProcessingPredicate(v, E)) - return l[0] = !0, o[0] = v, r[0] = P, E > 0 && _ <= 1448 ? this.WALKTRACE(w, d, h, S, C, u, g, L, b, y, a, t, o, c, n, r, Z, l) : (e++, i++, [ - new Sd(e, t - e + 1, i, n - i + 1) + ComputeRecursionPoint(e, t, i, n, o, l, r) { + let c = 0, d = 0, a = 0, h = 0, u = 0, m = 0; + e--, i--, o[0] = 0, l[0] = 0, this.m_forwardHistory = [], this.m_reverseHistory = []; + const b = t - e + (n - i), g = b + 1, Z = new Int32Array(g), f = new Int32Array(g), y = n - i, W = t - e, G = e - i, X = t - n, S = (W - y) % 2 === 0; + Z[y] = e, f[W] = t, r[0] = !1; + for (let x = 1; x <= b / 2 + 1; x++) { + let w = 0, A = 0; + a = this.ClipDiagonalBound(y - x, x, y, g), h = this.ClipDiagonalBound(y + x, x, y, g); + for (let F = a; F <= h; F += 2) { + F === a || F < h && Z[F - 1] < Z[F + 1] ? c = Z[F + 1] : c = Z[F - 1] + 1, d = c - (F - y) - G; + const K = c; + for (; c < t && d < n && this.ElementsAreEqual(c + 1, d + 1); ) + c++, d++; + if (Z[F] = c, c + d > w + A && (w = c, A = d), !S && Math.abs(F - W) <= x - 1 && c >= f[F]) + return o[0] = c, l[0] = d, K <= f[F] && x <= 1448 ? this.WALKTRACE(y, a, h, G, W, u, m, X, Z, f, c, t, o, d, n, l, S, r) : null; + } + const H = (w - e + (A - i) - x) / 2; + if (this.ContinueProcessingPredicate !== null && !this.ContinueProcessingPredicate(w, H)) + return r[0] = !0, o[0] = w, l[0] = A, H > 0 && x <= 1448 ? this.WALKTRACE(y, a, h, G, W, u, m, X, Z, f, c, t, o, d, n, l, S, r) : (e++, i++, [ + new Ia(e, t - e + 1, i, n - i + 1) ]); - u = this.ClipDiagonalBound(C - _, _, C, f), g = this.ClipDiagonalBound(C + _, _, C, f); - for (let Y = u; Y <= g; Y += 2) { - Y === u || Y < g && y[Y - 1] >= y[Y + 1] ? a = y[Y + 1] - 1 : a = y[Y - 1], c = a - (Y - C) - L; - const B = a; - for (; a > e && c > i && this.ElementsAreEqual(a, c); ) - a--, c--; - if (y[Y] = a, Z && Math.abs(Y - w) <= _ && a <= b[Y]) - return o[0] = a, r[0] = c, B >= b[Y] && _ <= 1448 ? this.WALKTRACE(w, d, h, S, C, u, g, L, b, y, a, t, o, c, n, r, Z, l) : null; + u = this.ClipDiagonalBound(W - x, x, W, g), m = this.ClipDiagonalBound(W + x, x, W, g); + for (let F = u; F <= m; F += 2) { + F === u || F < m && f[F - 1] >= f[F + 1] ? c = f[F + 1] - 1 : c = f[F - 1], d = c - (F - W) - X; + const K = c; + for (; c > e && d > i && this.ElementsAreEqual(c, d); ) + c--, d--; + if (f[F] = c, S && Math.abs(F - y) <= x && c <= Z[F]) + return o[0] = c, l[0] = d, K >= Z[F] && x <= 1448 ? this.WALKTRACE(y, a, h, G, W, u, m, X, Z, f, c, t, o, d, n, l, S, r) : null; } - if (_ <= 1447) { - let Y = new Int32Array(h - d + 2); - Y[0] = w - d + 1, hp.Copy2(b, d, Y, 1, h - d + 1), this.m_forwardHistory.push(Y), Y = new Int32Array(g - u + 2), Y[0] = C - u + 1, hp.Copy2(y, u, Y, 1, g - u + 1), this.m_reverseHistory.push(Y); + if (x <= 1447) { + let F = new Int32Array(h - a + 2); + F[0] = y - a + 1, gp.Copy2(Z, a, F, 1, h - a + 1), this.m_forwardHistory.push(F), F = new Int32Array(m - u + 2), F[0] = W - u + 1, gp.Copy2(f, u, F, 1, m - u + 1), this.m_reverseHistory.push(F); } } - return this.WALKTRACE(w, d, h, S, C, u, g, L, b, y, a, t, o, c, n, r, Z, l); + return this.WALKTRACE(y, a, h, G, W, u, m, X, Z, f, c, t, o, d, n, l, S, r); } /** * Shifts the given changes to provide a more intuitive diff. @@ -65784,16 +65784,16 @@ class wa { */ PrettifyChanges(e) { for (let t = 0; t < e.length; t++) { - const i = e[t], n = t < e.length - 1 ? e[t + 1].originalStart : this._originalElementsOrHash.length, o = t < e.length - 1 ? e[t + 1].modifiedStart : this._modifiedElementsOrHash.length, r = i.originalLength > 0, l = i.modifiedLength > 0; - for (; i.originalStart + i.originalLength < n && i.modifiedStart + i.modifiedLength < o && (!r || this.OriginalElementsAreEqual(i.originalStart, i.originalStart + i.originalLength)) && (!l || this.ModifiedElementsAreEqual(i.modifiedStart, i.modifiedStart + i.modifiedLength)); ) { - const c = this.ElementsAreStrictEqual(i.originalStart, i.modifiedStart); - if (this.ElementsAreStrictEqual(i.originalStart + i.originalLength, i.modifiedStart + i.modifiedLength) && !c) + const i = e[t], n = t < e.length - 1 ? e[t + 1].originalStart : this._originalElementsOrHash.length, o = t < e.length - 1 ? e[t + 1].modifiedStart : this._modifiedElementsOrHash.length, l = i.originalLength > 0, r = i.modifiedLength > 0; + for (; i.originalStart + i.originalLength < n && i.modifiedStart + i.modifiedLength < o && (!l || this.OriginalElementsAreEqual(i.originalStart, i.originalStart + i.originalLength)) && (!r || this.ModifiedElementsAreEqual(i.modifiedStart, i.modifiedStart + i.modifiedLength)); ) { + const d = this.ElementsAreStrictEqual(i.originalStart, i.modifiedStart); + if (this.ElementsAreStrictEqual(i.originalStart + i.originalLength, i.modifiedStart + i.modifiedLength) && !d) break; i.originalStart++, i.modifiedStart++; } - const a = [null]; - if (t < e.length - 1 && this.ChangesOverlap(e[t], e[t + 1], a)) { - e[t] = a[0], e.splice(t + 1, 1), t--; + const c = [null]; + if (t < e.length - 1 && this.ChangesOverlap(e[t], e[t + 1], c)) { + e[t] = c[0], e.splice(t + 1, 1), t--; continue; } } @@ -65804,30 +65804,30 @@ class wa { const h = e[t - 1]; n = h.originalStart + h.originalLength, o = h.modifiedStart + h.modifiedLength; } - const r = i.originalLength > 0, l = i.modifiedLength > 0; - let a = 0, c = this._boundaryScore(i.originalStart, i.originalLength, i.modifiedStart, i.modifiedLength); + const l = i.originalLength > 0, r = i.modifiedLength > 0; + let c = 0, d = this._boundaryScore(i.originalStart, i.originalLength, i.modifiedStart, i.modifiedLength); for (let h = 1; ; h++) { - const u = i.originalStart - h, g = i.modifiedStart - h; - if (u < n || g < o || r && !this.OriginalElementsAreEqual(u, u + i.originalLength) || l && !this.ModifiedElementsAreEqual(g, g + i.modifiedLength)) + const u = i.originalStart - h, m = i.modifiedStart - h; + if (u < n || m < o || l && !this.OriginalElementsAreEqual(u, u + i.originalLength) || r && !this.ModifiedElementsAreEqual(m, m + i.modifiedLength)) break; - const f = (u === n && g === o ? 5 : 0) + this._boundaryScore(u, i.originalLength, g, i.modifiedLength); - f > c && (c = f, a = h); + const g = (u === n && m === o ? 5 : 0) + this._boundaryScore(u, i.originalLength, m, i.modifiedLength); + g > d && (d = g, c = h); } - i.originalStart -= a, i.modifiedStart -= a; - const d = [null]; - if (t > 0 && this.ChangesOverlap(e[t - 1], e[t], d)) { - e[t - 1] = d[0], e.splice(t, 1), t++; + i.originalStart -= c, i.modifiedStart -= c; + const a = [null]; + if (t > 0 && this.ChangesOverlap(e[t - 1], e[t], a)) { + e[t - 1] = a[0], e.splice(t, 1), t++; continue; } } if (this._hasStrings) for (let t = 1, i = e.length; t < i; t++) { - const n = e[t - 1], o = e[t], r = o.originalStart - n.originalStart - n.originalLength, l = n.originalStart, a = o.originalStart + o.originalLength, c = a - l, d = n.modifiedStart, h = o.modifiedStart + o.modifiedLength, u = h - d; - if (r < 5 && c < 20 && u < 20) { - const g = this._findBetterContiguousSequence(l, c, d, u, r); - if (g) { - const [m, f] = g; - (m !== n.originalStart + n.originalLength || f !== n.modifiedStart + n.modifiedLength) && (n.originalLength = m - n.originalStart, n.modifiedLength = f - n.modifiedStart, o.originalStart = m + r, o.modifiedStart = f + r, o.originalLength = a - o.originalStart, o.modifiedLength = h - o.modifiedStart); + const n = e[t - 1], o = e[t], l = o.originalStart - n.originalStart - n.originalLength, r = n.originalStart, c = o.originalStart + o.originalLength, d = c - r, a = n.modifiedStart, h = o.modifiedStart + o.modifiedLength, u = h - a; + if (l < 5 && d < 20 && u < 20) { + const m = this._findBetterContiguousSequence(r, d, a, u, l); + if (m) { + const [b, g] = m; + (b !== n.originalStart + n.originalLength || g !== n.modifiedStart + n.modifiedLength) && (n.originalLength = b - n.originalStart, n.modifiedLength = g - n.modifiedStart, o.originalStart = b + l, o.modifiedStart = g + l, o.originalLength = c - o.originalStart, o.modifiedLength = h - o.modifiedStart); } } } @@ -65836,14 +65836,14 @@ class wa { _findBetterContiguousSequence(e, t, i, n, o) { if (t < o || n < o) return null; - const r = e + t - o + 1, l = i + n - o + 1; - let a = 0, c = 0, d = 0; - for (let h = e; h < r; h++) - for (let u = i; u < l; u++) { - const g = this._contiguousSequenceScore(h, u, o); - g > 0 && g > a && (a = g, c = h, d = u); + const l = e + t - o + 1, r = i + n - o + 1; + let c = 0, d = 0, a = 0; + for (let h = e; h < l; h++) + for (let u = i; u < r; u++) { + const m = this._contiguousSequenceScore(h, u, o); + m > 0 && m > c && (c = m, d = h, a = u); } - return a > 0 ? [c, d] : null; + return c > 0 ? [d, a] : null; } _contiguousSequenceScore(e, t, i) { let n = 0; @@ -65881,8 +65881,8 @@ class wa { return !1; } _boundaryScore(e, t, i, n) { - const o = this._OriginalRegionIsBoundary(e, t) ? 1 : 0, r = this._ModifiedRegionIsBoundary(i, n) ? 1 : 0; - return o + r; + const o = this._OriginalRegionIsBoundary(e, t) ? 1 : 0, l = this._ModifiedRegionIsBoundary(i, n) ? 1 : 0; + return o + l; } /** * Concatenates the two input DiffChange lists and returns the resulting @@ -65897,10 +65897,10 @@ class wa { return t.length > 0 ? t : e; if (this.ChangesOverlap(e[e.length - 1], t[0], i)) { const n = new Array(e.length + t.length - 1); - return hp.Copy(e, 0, n, 0, e.length - 1), n[e.length - 1] = i[0], hp.Copy(t, 1, n, e.length, t.length - 1), n; + return gp.Copy(e, 0, n, 0, e.length - 1), n[e.length - 1] = i[0], gp.Copy(t, 1, n, e.length, t.length - 1), n; } else { const n = new Array(e.length + t.length); - return hp.Copy(e, 0, n, 0, e.length), hp.Copy(t, 0, n, e.length, t.length), n; + return gp.Copy(e, 0, n, 0, e.length), gp.Copy(t, 0, n, e.length, t.length), n; } } /** @@ -65912,12 +65912,12 @@ class wa { * @returns True if the two changes overlap */ ChangesOverlap(e, t, i) { - if (dp.Assert(e.originalStart <= t.originalStart, "Left change is not less than or equal to right change"), dp.Assert(e.modifiedStart <= t.modifiedStart, "Left change is not less than or equal to right change"), e.originalStart + e.originalLength >= t.originalStart || e.modifiedStart + e.modifiedLength >= t.modifiedStart) { + if (pp.Assert(e.originalStart <= t.originalStart, "Left change is not less than or equal to right change"), pp.Assert(e.modifiedStart <= t.modifiedStart, "Left change is not less than or equal to right change"), e.originalStart + e.originalLength >= t.originalStart || e.modifiedStart + e.modifiedLength >= t.modifiedStart) { const n = e.originalStart; let o = e.originalLength; - const r = e.modifiedStart; - let l = e.modifiedLength; - return e.originalStart + e.originalLength >= t.originalStart && (o = t.originalStart + t.originalLength - e.originalStart), e.modifiedStart + e.modifiedLength >= t.modifiedStart && (l = t.modifiedStart + t.modifiedLength - e.modifiedStart), i[0] = new Sd(n, o, r, l), !0; + const l = e.modifiedStart; + let r = e.modifiedLength; + return e.originalStart + e.originalLength >= t.originalStart && (o = t.originalStart + t.originalLength - e.originalStart), e.modifiedStart + e.modifiedLength >= t.modifiedStart && (r = t.modifiedStart + t.modifiedLength - e.modifiedStart), i[0] = new Ia(n, o, l, r), !0; } else return i[0] = null, !1; } @@ -65936,20 +65936,20 @@ class wa { ClipDiagonalBound(e, t, i, n) { if (e >= 0 && e < n) return e; - const o = i, r = n - i - 1, l = t % 2 === 0; + const o = i, l = n - i - 1, r = t % 2 === 0; if (e < 0) { - const a = o % 2 === 0; - return l === a ? 0 : 1; + const c = o % 2 === 0; + return r === c ? 0 : 1; } else { - const a = r % 2 === 0; - return l === a ? n - 1 : n - 2; + const c = l % 2 === 0; + return r === c ? n - 1 : n - 2; } } } -function u5(s) { +function JH(s) { return typeof s == "object" && "visibility" in s && "data" in s; } -function D1(s) { +function UW(s) { switch (s) { case !0: return 1; @@ -65959,12 +65959,12 @@ function D1(s) { return s; } } -function _W(s) { +function AR(s) { return typeof s.collapsible == "boolean"; } -class bbe { +class d0e { constructor(e, t, i, n = {}) { - this.user = e, this.list = t, this.rootRef = [], this.eventBufferer = new aC(), this._onDidChangeCollapseState = new k(), this.onDidChangeCollapseState = this.eventBufferer.wrapEvent(this._onDidChangeCollapseState.event), this._onDidChangeRenderNodeCount = new k(), this.onDidChangeRenderNodeCount = this.eventBufferer.wrapEvent(this._onDidChangeRenderNodeCount.event), this._onDidSplice = new k(), this.onDidSplice = this._onDidSplice.event, this.refilterDelayer = new fr(xH), this.collapseByDefault = typeof n.collapseByDefault > "u" ? !1 : n.collapseByDefault, this.allowNonCollapsibleParents = n.allowNonCollapsibleParents ?? !1, this.filter = n.filter, this.autoExpandSingleChildren = typeof n.autoExpandSingleChildren > "u" ? !1 : n.autoExpandSingleChildren, this.root = { + this.user = e, this.list = t, this.rootRef = [], this.eventBufferer = new GG(), this._onDidChangeCollapseState = new k(), this.onDidChangeCollapseState = this.eventBufferer.wrapEvent(this._onDidChangeCollapseState.event), this._onDidChangeRenderNodeCount = new k(), this.onDidChangeRenderNodeCount = this.eventBufferer.wrapEvent(this._onDidChangeRenderNodeCount.event), this._onDidSplice = new k(), this.onDidSplice = this._onDidSplice.event, this.refilterDelayer = new yl(lB), this.collapseByDefault = typeof n.collapseByDefault > "u" ? !1 : n.collapseByDefault, this.allowNonCollapsibleParents = n.allowNonCollapsibleParents ?? !1, this.filter = n.filter, this.autoExpandSingleChildren = typeof n.autoExpandSingleChildren > "u" ? !1 : n.autoExpandSingleChildren, this.root = { parent: void 0, element: i, children: [], @@ -65981,79 +65981,79 @@ class bbe { } splice(e, t, i = nt.empty(), n = {}) { if (e.length === 0) - throw new Go(this.user, "Invalid tree location"); + throw new Ho(this.user, "Invalid tree location"); n.diffIdentityProvider ? this.spliceSmart(n.diffIdentityProvider, e, t, i, n) : this.spliceSimple(e, t, i, n); } - spliceSmart(e, t, i, n = nt.empty(), o, r = o.diffDepth ?? 0) { - const { parentNode: l } = this.getParentNodeWithListIndex(t); - if (!l.lastDiffIds) + spliceSmart(e, t, i, n = nt.empty(), o, l = o.diffDepth ?? 0) { + const { parentNode: r } = this.getParentNodeWithListIndex(t); + if (!r.lastDiffIds) return this.spliceSimple(t, i, n, o); - const a = [...n], c = t[t.length - 1], d = new wa({ getElements: () => l.lastDiffIds }, { + const c = [...n], d = t[t.length - 1], a = new Vc({ getElements: () => r.lastDiffIds }, { getElements: () => [ - ...l.children.slice(0, c), - ...a, - ...l.children.slice(c + i) - ].map((f) => e.getId(f.element).toString()) + ...r.children.slice(0, d), + ...c, + ...r.children.slice(d + i) + ].map((g) => e.getId(g.element).toString()) }).ComputeDiff(!1); - if (d.quitEarly) - return l.lastDiffIds = void 0, this.spliceSimple(t, i, a, o); - const h = t.slice(0, -1), u = (f, b, y) => { - if (r > 0) - for (let w = 0; w < y; w++) - f--, b--, this.spliceSmart(e, [...h, f, 0], Number.MAX_SAFE_INTEGER, a[b].children, o, r - 1); + if (a.quitEarly) + return r.lastDiffIds = void 0, this.spliceSimple(t, i, c, o); + const h = t.slice(0, -1), u = (g, Z, f) => { + if (l > 0) + for (let y = 0; y < f; y++) + g--, Z--, this.spliceSmart(e, [...h, g, 0], Number.MAX_SAFE_INTEGER, c[Z].children, o, l - 1); }; - let g = Math.min(l.children.length, c + i), m = a.length; - for (const f of d.changes.sort((b, y) => y.originalStart - b.originalStart)) - u(g, m, g - (f.originalStart + f.originalLength)), g = f.originalStart, m = f.modifiedStart - c, this.spliceSimple([...h, g], f.originalLength, nt.slice(a, m, m + f.modifiedLength), o); - u(g, m, g); - } - spliceSimple(e, t, i = nt.empty(), { onDidCreateNode: n, onDidDeleteNode: o, diffIdentityProvider: r }) { - const { parentNode: l, listIndex: a, revealed: c, visible: d } = this.getParentNodeWithListIndex(e), h = [], u = nt.map(i, (L) => this.createTreeNode(L, l, l.visible ? 1 : 0, c, h, n)), g = e[e.length - 1]; - let m = 0; - for (let L = g; L >= 0 && L < l.children.length; L--) { - const x = l.children[L]; - if (x.visible) { - m = x.visibleChildIndex; + let m = Math.min(r.children.length, d + i), b = c.length; + for (const g of a.changes.sort((Z, f) => f.originalStart - Z.originalStart)) + u(m, b, m - (g.originalStart + g.originalLength)), m = g.originalStart, b = g.modifiedStart - d, this.spliceSimple([...h, m], g.originalLength, nt.slice(c, b, b + g.modifiedLength), o); + u(m, b, m); + } + spliceSimple(e, t, i = nt.empty(), { onDidCreateNode: n, onDidDeleteNode: o, diffIdentityProvider: l }) { + const { parentNode: r, listIndex: c, revealed: d, visible: a } = this.getParentNodeWithListIndex(e), h = [], u = nt.map(i, (X) => this.createTreeNode(X, r, r.visible ? 1 : 0, d, h, n)), m = e[e.length - 1]; + let b = 0; + for (let X = m; X >= 0 && X < r.children.length; X--) { + const L = r.children[X]; + if (L.visible) { + b = L.visibleChildIndex; break; } } - const f = []; - let b = 0, y = 0; - for (const L of u) - f.push(L), y += L.renderNodeCount, L.visible && (L.visibleChildIndex = m + b++); - const w = mF(l.children, g, t, f); - r ? l.lastDiffIds ? mF(l.lastDiffIds, g, t, f.map((L) => r.getId(L.element).toString())) : l.lastDiffIds = l.children.map((L) => r.getId(L.element).toString()) : l.lastDiffIds = void 0; - let C = 0; - for (const L of w) - L.visible && C++; - if (C !== 0) - for (let L = g + f.length; L < l.children.length; L++) { - const x = l.children[L]; - x.visible && (x.visibleChildIndex -= C); - } - if (l.visibleChildrenCount += b - C, c && d) { - const L = w.reduce((x, Z) => x + (Z.visible ? Z.renderNodeCount : 0), 0); - this._updateAncestorsRenderNodeCount(l, y - L), this.list.splice(a, L, h); - } - if (w.length > 0 && o) { - const L = (x) => { - o(x), x.children.forEach(L); + const g = []; + let Z = 0, f = 0; + for (const X of u) + g.push(X), f += X.renderNodeCount, X.visible && (X.visibleChildIndex = b + Z++); + const y = ED(r.children, m, t, g); + l ? r.lastDiffIds ? ED(r.lastDiffIds, m, t, g.map((X) => l.getId(X.element).toString())) : r.lastDiffIds = r.children.map((X) => l.getId(X.element).toString()) : r.lastDiffIds = void 0; + let W = 0; + for (const X of y) + X.visible && W++; + if (W !== 0) + for (let X = m + g.length; X < r.children.length; X++) { + const L = r.children[X]; + L.visible && (L.visibleChildIndex -= W); + } + if (r.visibleChildrenCount += Z - W, d && a) { + const X = y.reduce((L, S) => L + (S.visible ? S.renderNodeCount : 0), 0); + this._updateAncestorsRenderNodeCount(r, f - X), this.list.splice(c, X, h); + } + if (y.length > 0 && o) { + const X = (L) => { + o(L), L.children.forEach(X); }; - w.forEach(L); + y.forEach(X); } - this._onDidSplice.fire({ insertedNodes: f, deletedNodes: w }); - let S = l; - for (; S; ) { - if (S.visibility === 2) { + this._onDidSplice.fire({ insertedNodes: g, deletedNodes: y }); + let G = r; + for (; G; ) { + if (G.visibility === 2) { this.refilterDelayer.trigger(() => this.refilter()); break; } - S = S.parent; + G = G.parent; } } rerender(e) { if (e.length === 0) - throw new Go(this.user, "Invalid tree location"); + throw new Ho(this.user, "Invalid tree location"); const { node: t, listIndex: i, revealed: n } = this.getTreeNodeWithListIndex(e); t.visible && n && this.list.splice(i, 1, [t]); } @@ -66086,30 +66086,30 @@ class bbe { return this.eventBufferer.bufferEvents(() => this._setCollapseState(e, o)); } _setCollapseState(e, t) { - const { node: i, listIndex: n, revealed: o } = this.getTreeNodeWithListIndex(e), r = this._setListNodeCollapseState(i, n, o, t); - if (i !== this.root && this.autoExpandSingleChildren && r && !_W(t) && i.collapsible && !i.collapsed && !t.recursive) { - let l = -1; - for (let a = 0; a < i.children.length; a++) - if (i.children[a].visible) - if (l > -1) { - l = -1; + const { node: i, listIndex: n, revealed: o } = this.getTreeNodeWithListIndex(e), l = this._setListNodeCollapseState(i, n, o, t); + if (i !== this.root && this.autoExpandSingleChildren && l && !AR(t) && i.collapsible && !i.collapsed && !t.recursive) { + let r = -1; + for (let c = 0; c < i.children.length; c++) + if (i.children[c].visible) + if (r > -1) { + r = -1; break; } else - l = a; - l > -1 && this._setCollapseState([...e, l], t); + r = c; + r > -1 && this._setCollapseState([...e, r], t); } - return r; + return l; } _setListNodeCollapseState(e, t, i, n) { const o = this._setNodeCollapseState(e, n, !1); if (!i || !e.visible || !o) return o; - const r = e.renderNodeCount, l = this.updateNodeAfterCollapseChange(e), a = r - (t === -1 ? 0 : 1); - return this.list.splice(t + 1, a, l.slice(1)), o; + const l = e.renderNodeCount, r = this.updateNodeAfterCollapseChange(e), c = l - (t === -1 ? 0 : 1); + return this.list.splice(t + 1, c, r.slice(1)), o; } _setNodeCollapseState(e, t, i) { let n; - if (e === this.root ? n = !1 : (_W(t) ? (n = e.collapsible !== t.collapsible, e.collapsible = t.collapsible) : e.collapsible ? (n = e.collapsed !== t.collapsed, e.collapsed = t.collapsed) : n = !1, n && this._onDidChangeCollapseState.fire({ node: e, deep: i })), !_W(t) && t.recursive) + if (e === this.root ? n = !1 : (AR(t) ? (n = e.collapsible !== t.collapsible, e.collapsible = t.collapsible) : e.collapsible ? (n = e.collapsed !== t.collapsed, e.collapsed = t.collapsed) : n = !1, n && this._onDidChangeCollapseState.fire({ node: e, deep: i })), !AR(t) && t.recursive) for (const o of e.children) n = this._setNodeCollapseState(o, t, !0) || n; return n; @@ -66125,8 +66125,8 @@ class bbe { const e = this.root.renderNodeCount, t = this.updateNodeAfterFilterChange(this.root); this.list.splice(0, e, t), this.refilterDelayer.cancel(); } - createTreeNode(e, t, i, n, o, r) { - const l = { + createTreeNode(e, t, i, n, o, l) { + const r = { parent: t, element: e.element, children: [], @@ -66139,15 +66139,15 @@ class bbe { visibility: 1, visible: !0, filterData: void 0 - }, a = this._filterNode(l, i); - l.visibility = a, n && o.push(l); - const c = e.children || nt.empty(), d = n && a !== 0 && !l.collapsed; + }, c = this._filterNode(r, i); + r.visibility = c, n && o.push(r); + const d = e.children || nt.empty(), a = n && c !== 0 && !r.collapsed; let h = 0, u = 1; - for (const g of c) { - const m = this.createTreeNode(g, l, a, d, o, r); - l.children.push(m), u += m.renderNodeCount, m.visible && (m.visibleChildIndex = h++); + for (const m of d) { + const b = this.createTreeNode(m, r, c, a, o, l); + r.children.push(b), u += b.renderNodeCount, b.visible && (b.visibleChildIndex = h++); } - return this.allowNonCollapsibleParents || (l.collapsible = l.collapsible || l.children.length > 0), l.visibleChildrenCount = h, l.visible = a === 2 ? h > 0 : a === 1, l.visible ? l.collapsed || (l.renderNodeCount = u) : (l.renderNodeCount = 0, n && o.pop()), r == null || r(l), l; + return this.allowNonCollapsibleParents || (r.collapsible = r.collapsible || r.children.length > 0), r.visibleChildrenCount = h, r.visible = c === 2 ? h > 0 : c === 1, r.visible ? r.collapsed || (r.renderNodeCount = u) : (r.renderNodeCount = 0, n && o.pop()), l == null || l(r), r; } updateNodeAfterCollapseChange(e) { const t = e.renderNodeCount, i = []; @@ -66172,17 +66172,17 @@ class bbe { return e.visible = !1, e.renderNodeCount = 0, !1; n && i.push(e); } - const r = i.length; + const l = i.length; e.renderNodeCount = e === this.root ? 0 : 1; - let l = !1; + let r = !1; if (!e.collapsed || o !== 0) { - let a = 0; - for (const c of e.children) - l = this._updateNodeAfterFilterChange(c, o, i, n && !e.collapsed) || l, c.visible && (c.visibleChildIndex = a++); - e.visibleChildrenCount = a; + let c = 0; + for (const d of e.children) + r = this._updateNodeAfterFilterChange(d, o, i, n && !e.collapsed) || r, d.visible && (d.visibleChildIndex = c++); + e.visibleChildrenCount = c; } else e.visibleChildrenCount = 0; - return e !== this.root && (e.visible = o === 2 ? l : o === 1, e.visibility = o), e.visible ? e.collapsed || (e.renderNodeCount += i.length - r) : (e.renderNodeCount = 0, n && i.pop()), this._onDidChangeRenderNodeCount.fire(e), e.visible; + return e !== this.root && (e.visible = o === 2 ? r : o === 1, e.visibility = o), e.visible ? e.collapsed || (e.renderNodeCount += i.length - l) : (e.renderNodeCount = 0, n && i.pop()), this._onDidChangeRenderNodeCount.fire(e), e.visible; } _updateAncestorsRenderNodeCount(e, t) { if (t !== 0) @@ -66191,7 +66191,7 @@ class bbe { } _filterNode(e, t) { const i = this.filter ? this.filter.filter(e.element, t) : 1; - return typeof i == "boolean" ? (e.filterData = void 0, i ? 1 : 0) : u5(i) ? (e.filterData = i.data, D1(i.visibility)) : (e.filterData = void 0, D1(i)); + return typeof i == "boolean" ? (e.filterData = void 0, i ? 1 : 0) : JH(i) ? (e.filterData = i.data, UW(i.visibility)) : (e.filterData = void 0, UW(i)); } // cheap hasTreeNode(e, t = this.root) { @@ -66206,26 +66206,26 @@ class bbe { return t; const [i, ...n] = e; if (i < 0 || i > t.children.length) - throw new Go(this.user, "Invalid tree location"); + throw new Ho(this.user, "Invalid tree location"); return this.getTreeNode(n, t.children[i]); } // expensive getTreeNodeWithListIndex(e) { if (e.length === 0) return { node: this.root, listIndex: -1, revealed: !0, visible: !1 }; - const { parentNode: t, listIndex: i, revealed: n, visible: o } = this.getParentNodeWithListIndex(e), r = e[e.length - 1]; - if (r < 0 || r > t.children.length) - throw new Go(this.user, "Invalid tree location"); - const l = t.children[r]; - return { node: l, listIndex: i, revealed: n, visible: o && l.visible }; + const { parentNode: t, listIndex: i, revealed: n, visible: o } = this.getParentNodeWithListIndex(e), l = e[e.length - 1]; + if (l < 0 || l > t.children.length) + throw new Ho(this.user, "Invalid tree location"); + const r = t.children[l]; + return { node: r, listIndex: i, revealed: n, visible: o && r.visible }; } getParentNodeWithListIndex(e, t = this.root, i = 0, n = !0, o = !0) { - const [r, ...l] = e; - if (r < 0 || r > t.children.length) - throw new Go(this.user, "Invalid tree location"); - for (let a = 0; a < r; a++) - i += t.children[a].renderNodeCount; - return n = n && !t.collapsed, o = o && t.visible, l.length === 0 ? { parentNode: t, listIndex: i, revealed: n, visible: o } : this.getParentNodeWithListIndex(l, t.children[r], i + 1, n, o); + const [l, ...r] = e; + if (l < 0 || l > t.children.length) + throw new Ho(this.user, "Invalid tree location"); + for (let c = 0; c < l; c++) + i += t.children[c].renderNodeCount; + return n = n && !t.collapsed, o = o && t.visible, r.length === 0 ? { parentNode: t, listIndex: i, revealed: n, visible: o } : this.getParentNodeWithListIndex(r, t.children[l], i + 1, n, o); } getNode(e = []) { return this.getTreeNode(e); @@ -66240,7 +66240,7 @@ class bbe { } getParentNodeLocation(e) { if (e.length !== 0) - return e.length === 1 ? [] : see(e)[0]; + return e.length === 1 ? [] : Oee(e)[0]; } getFirstElementChild(e) { const t = this.getTreeNode(e); @@ -66248,17 +66248,17 @@ class bbe { return t.children[0].element; } } -class ybe extends IC { +class a0e extends FG { constructor(e) { super(e.elements.map((t) => t.element)), this.data = e; } } -function IW(s) { - return s instanceof IC ? new ybe(s) : s; +function KR(s) { + return s instanceof FG ? new a0e(s) : s; } -class wbe { +class h0e { constructor(e, t) { - this.modelProvider = e, this.dnd = t, this.autoExpandDisposable = R.None, this.disposables = new U(); + this.modelProvider = e, this.dnd = t, this.autoExpandDisposable = J.None, this.disposables = new _(); } getDragURI(e) { return this.dnd.getDragURI(e.element); @@ -66269,31 +66269,31 @@ class wbe { } onDragStart(e, t) { var i, n; - (n = (i = this.dnd).onDragStart) == null || n.call(i, IW(e), t); + (n = (i = this.dnd).onDragStart) == null || n.call(i, KR(e), t); } - onDragOver(e, t, i, n, o, r = !0) { - const l = this.dnd.onDragOver(IW(e), t && t.element, i, n, o), a = this.autoExpandNode !== t; - if (a && (this.autoExpandDisposable.dispose(), this.autoExpandNode = t), typeof t > "u") - return l; - if (a && typeof l != "boolean" && l.autoExpand && (this.autoExpandDisposable = _h(() => { - const g = this.modelProvider(), m = g.getNodeLocation(t); - g.isCollapsed(m) && g.setCollapsed(m, !1), this.autoExpandNode = void 0; - }, 500, this.disposables)), typeof l == "boolean" || !l.accept || typeof l.bubble > "u" || l.feedback) { - if (!r) { - const g = typeof l == "boolean" ? l : l.accept, m = typeof l == "boolean" ? void 0 : l.effect; - return { accept: g, effect: m, feedback: [i] }; + onDragOver(e, t, i, n, o, l = !0) { + const r = this.dnd.onDragOver(KR(e), t && t.element, i, n, o), c = this.autoExpandNode !== t; + if (c && (this.autoExpandDisposable.dispose(), this.autoExpandNode = t), typeof t > "u") + return r; + if (c && typeof r != "boolean" && r.autoExpand && (this.autoExpandDisposable = wh(() => { + const m = this.modelProvider(), b = m.getNodeLocation(t); + m.isCollapsed(b) && m.setCollapsed(b, !1), this.autoExpandNode = void 0; + }, 500, this.disposables)), typeof r == "boolean" || !r.accept || typeof r.bubble > "u" || r.feedback) { + if (!l) { + const m = typeof r == "boolean" ? r : r.accept, b = typeof r == "boolean" ? void 0 : r.effect; + return { accept: m, effect: b, feedback: [i] }; } - return l; + return r; } - if (l.bubble === 1) { - const g = this.modelProvider(), m = g.getNodeLocation(t), f = g.getParentNodeLocation(m), b = g.getNode(f), y = f && g.getListIndex(f); - return this.onDragOver(e, b, y, n, o, !1); + if (r.bubble === 1) { + const m = this.modelProvider(), b = m.getNodeLocation(t), g = m.getParentNodeLocation(b), Z = m.getNode(g), f = g && m.getListIndex(g); + return this.onDragOver(e, Z, f, n, o, !1); } - const c = this.modelProvider(), d = c.getNodeLocation(t), h = c.getListIndex(d), u = c.getListRenderCount(d); - return { ...l, feedback: Ns(h, h + u) }; + const d = this.modelProvider(), a = d.getNodeLocation(t), h = d.getListIndex(a), u = d.getListRenderCount(a); + return { ...r, feedback: ws(h, h + u) }; } drop(e, t, i, n, o) { - this.autoExpandDisposable.dispose(), this.autoExpandNode = void 0, this.dnd.drop(IW(e), t && t.element, i, n, o); + this.autoExpandDisposable.dispose(), this.autoExpandNode = void 0, this.dnd.drop(KR(e), t && t.element, i, n, o); } onDragEnd(e) { var t, i; @@ -66303,7 +66303,7 @@ class wbe { this.disposables.dispose(), this.dnd.dispose(); } } -function Cbe(s, e) { +function u0e(s, e) { return e && { ...e, identityProvider: e.identityProvider && { @@ -66311,7 +66311,7 @@ function Cbe(s, e) { return e.identityProvider.getId(t.element); } }, - dnd: e.dnd && new wbe(s, e.dnd), + dnd: e.dnd && new h0e(s, e.dnd), multipleSelectionController: e.multipleSelectionController && { isSelectionSingleChangeEvent(t) { return e.multipleSelectionController.isSelectionSingleChangeEvent({ ...t, element: t.element }); @@ -66349,7 +66349,7 @@ function Cbe(s, e) { } }; } -class g5 { +class HH { constructor(e) { this.delegate = e; } @@ -66367,29 +66367,29 @@ class g5 { (n = (i = this.delegate).setDynamicHeight) == null || n.call(i, e.element, t); } } -var Ib; +var YZ; (function(s) { s.None = "none", s.OnHover = "onHover", s.Always = "always"; -})(Ib || (Ib = {})); -class Sbe { +})(YZ || (YZ = {})); +class m0e { get elements() { return this._elements; } constructor(e, t = []) { - this._elements = t, this.disposables = new U(), this.onDidChange = se.forEach(e, (i) => this._elements = i, this.disposables); + this._elements = t, this.disposables = new _(), this.onDidChange = se.forEach(e, (i) => this._elements = i, this.disposables); } dispose() { this.disposables.dispose(); } } -const Lw = class Lw { - constructor(e, t, i, n, o, r = {}) { - var l; - this.renderer = e, this.modelProvider = t, this.activeNodes = n, this.renderedIndentGuides = o, this.renderedElements = /* @__PURE__ */ new Map(), this.renderedNodes = /* @__PURE__ */ new Map(), this.indent = Lw.DefaultIndent, this.hideTwistiesOfChildlessElements = !1, this.shouldRenderIndentGuides = !1, this.activeIndentNodes = /* @__PURE__ */ new Set(), this.indentGuidesDisposable = R.None, this.disposables = new U(), this.templateId = e.templateId, this.updateOptions(r), se.map(i, (a) => a.node)(this.onDidChangeNodeTwistieState, this, this.disposables), (l = e.onDidChangeTwistieState) == null || l.call(e, this.onDidChangeTwistieState, this, this.disposables); +const Yy = class Yy { + constructor(e, t, i, n, o, l = {}) { + var r; + this.renderer = e, this.modelProvider = t, this.activeNodes = n, this.renderedIndentGuides = o, this.renderedElements = /* @__PURE__ */ new Map(), this.renderedNodes = /* @__PURE__ */ new Map(), this.indent = Yy.DefaultIndent, this.hideTwistiesOfChildlessElements = !1, this.shouldRenderIndentGuides = !1, this.activeIndentNodes = /* @__PURE__ */ new Set(), this.indentGuidesDisposable = J.None, this.disposables = new _(), this.templateId = e.templateId, this.updateOptions(l), se.map(i, (c) => c.node)(this.onDidChangeNodeTwistieState, this, this.disposables), (r = e.onDidChangeTwistieState) == null || r.call(e, this.onDidChangeTwistieState, this, this.disposables); } updateOptions(e = {}) { if (typeof e.indent < "u") { - const t = os(e.indent, 0, 40); + const t = rs(e.indent, 0, 40); if (t !== this.indent) { this.indent = t; for (const [i, n] of this.renderedNodes) @@ -66397,13 +66397,13 @@ const Lw = class Lw { } } if (typeof e.renderIndentGuides < "u") { - const t = e.renderIndentGuides !== Ib.None; + const t = e.renderIndentGuides !== YZ.None; if (t !== this.shouldRenderIndentGuides) { this.shouldRenderIndentGuides = t; for (const [i, n] of this.renderedNodes) this._renderIndentGuides(i, n); if (this.indentGuidesDisposable.dispose(), t) { - const i = new U(); + const i = new _(); this.activeNodes.onDidChange(this._onDidChangeActiveNodes, this, i), this.indentGuidesDisposable = i, this._onDidChangeActiveNodes(this.activeNodes.elements); } } @@ -66411,15 +66411,15 @@ const Lw = class Lw { typeof e.hideTwistiesOfChildlessElements < "u" && (this.hideTwistiesOfChildlessElements = e.hideTwistiesOfChildlessElements); } renderTemplate(e) { - const t = Q(e, ce(".monaco-tl-row")), i = Q(t, ce(".monaco-tl-indent")), n = Q(t, ce(".monaco-tl-twistie")), o = Q(t, ce(".monaco-tl-contents")), r = this.renderer.renderTemplate(o); - return { container: e, indent: i, twistie: n, indentGuidesDisposable: R.None, templateData: r }; + const t = O(e, de(".monaco-tl-row")), i = O(t, de(".monaco-tl-indent")), n = O(t, de(".monaco-tl-twistie")), o = O(t, de(".monaco-tl-contents")), l = this.renderer.renderTemplate(o); + return { container: e, indent: i, twistie: n, indentGuidesDisposable: J.None, templateData: l }; } renderElement(e, t, i, n) { this.renderedNodes.set(e, i), this.renderedElements.set(e.element, e), this.renderTreeElement(e, i), this.renderer.renderElement(e, t, i.templateData, n); } disposeElement(e, t, i, n) { - var o, r; - i.indentGuidesDisposable.dispose(), (r = (o = this.renderer).disposeElement) == null || r.call(o, e, t, i.templateData, n), typeof n == "number" && (this.renderedNodes.delete(e), this.renderedElements.delete(e.element)); + var o, l; + i.indentGuidesDisposable.dispose(), (l = (o = this.renderer).disposeElement) == null || l.call(o, e, t, i.templateData, n), typeof n == "number" && (this.renderedNodes.delete(e), this.renderedElements.delete(e.element)); } disposeTemplate(e) { this.renderer.disposeTemplate(e.templateData); @@ -66433,21 +66433,21 @@ const Lw = class Lw { t && (this._onDidChangeActiveNodes(this.activeNodes.elements), this.renderTreeElement(e, t)); } renderTreeElement(e, t) { - const i = Lw.DefaultIndent + (e.depth - 1) * this.indent; - t.twistie.style.paddingLeft = `${i}px`, t.indent.style.width = `${i + this.indent - 16}px`, e.collapsible ? t.container.setAttribute("aria-expanded", String(!e.collapsed)) : t.container.removeAttribute("aria-expanded"), t.twistie.classList.remove(...Ze.asClassNameArray(te.treeItemExpanded)); + const i = Yy.DefaultIndent + (e.depth - 1) * this.indent; + t.twistie.style.paddingLeft = `${i}px`, t.indent.style.width = `${i + this.indent - 16}px`, e.collapsible ? t.container.setAttribute("aria-expanded", String(!e.collapsed)) : t.container.removeAttribute("aria-expanded"), t.twistie.classList.remove(...Se.asClassNameArray(te.treeItemExpanded)); let n = !1; - this.renderer.renderTwistie && (n = this.renderer.renderTwistie(e.element, t.twistie)), e.collapsible && (!this.hideTwistiesOfChildlessElements || e.visibleChildrenCount > 0) ? (n || t.twistie.classList.add(...Ze.asClassNameArray(te.treeItemExpanded)), t.twistie.classList.add("collapsible"), t.twistie.classList.toggle("collapsed", e.collapsed)) : t.twistie.classList.remove("collapsible", "collapsed"), this._renderIndentGuides(e, t); + this.renderer.renderTwistie && (n = this.renderer.renderTwistie(e.element, t.twistie)), e.collapsible && (!this.hideTwistiesOfChildlessElements || e.visibleChildrenCount > 0) ? (n || t.twistie.classList.add(...Se.asClassNameArray(te.treeItemExpanded)), t.twistie.classList.add("collapsible"), t.twistie.classList.toggle("collapsed", e.collapsed)) : t.twistie.classList.remove("collapsible", "collapsed"), this._renderIndentGuides(e, t); } _renderIndentGuides(e, t) { - if (gn(t.indent), t.indentGuidesDisposable.dispose(), !this.shouldRenderIndentGuides) + if (bn(t.indent), t.indentGuidesDisposable.dispose(), !this.shouldRenderIndentGuides) return; - const i = new U(), n = this.modelProvider(); + const i = new _(), n = this.modelProvider(); for (; ; ) { - const o = n.getNodeLocation(e), r = n.getParentNodeLocation(o); - if (!r) + const o = n.getNodeLocation(e), l = n.getParentNodeLocation(o); + if (!l) break; - const l = n.getNode(r), a = ce(".indent-guide", { style: `width: ${this.indent}px` }); - this.activeIndentNodes.has(l) && a.classList.add("active"), t.indent.childElementCount === 0 ? t.indent.appendChild(a) : t.indent.insertBefore(a, t.indent.firstElementChild), this.renderedIndentGuides.add(l, a), i.add(Ce(() => this.renderedIndentGuides.delete(l, a))), e = l; + const r = n.getNode(l), c = de(".indent-guide", { style: `width: ${this.indent}px` }); + this.activeIndentNodes.has(r) && c.classList.add("active"), t.indent.childElementCount === 0 ? t.indent.appendChild(c) : t.indent.insertBefore(c, t.indent.firstElementChild), this.renderedIndentGuides.add(r, c), i.add(We(() => this.renderedIndentGuides.delete(r, c))), e = r; } t.indentGuidesDisposable = i; } @@ -66458,8 +66458,8 @@ const Lw = class Lw { e.forEach((n) => { const o = i.getNodeLocation(n); try { - const r = i.getParentNodeLocation(o); - n.collapsible && n.children.length > 0 && !n.collapsed ? t.add(n) : r && t.add(i.getNode(r)); + const l = i.getParentNodeLocation(o); + n.collapsible && n.children.length > 0 && !n.collapsed ? t.add(n) : l && t.add(i.getNode(l)); } catch { } }), this.activeIndentNodes.forEach((n) => { @@ -66469,12 +66469,12 @@ const Lw = class Lw { }), this.activeIndentNodes = t; } dispose() { - this.renderedNodes.clear(), this.renderedElements.clear(), this.indentGuidesDisposable.dispose(), Wt(this.disposables); + this.renderedNodes.clear(), this.renderedElements.clear(), this.indentGuidesDisposable.dispose(), Nt(this.disposables); } }; -Lw.DefaultIndent = 8; -let lD = Lw; -class Lbe { +Yy.DefaultIndent = 8; +let CM = Yy; +class b0e { get totalCount() { return this._totalCount; } @@ -66482,53 +66482,53 @@ class Lbe { return this._matchCount; } constructor(e, t, i) { - this.tree = e, this.keyboardNavigationLabelProvider = t, this._filter = i, this._totalCount = 0, this._matchCount = 0, this._pattern = "", this._lowercasePattern = "", this.disposables = new U(), e.onWillRefilter(this.reset, this, this.disposables); + this.tree = e, this.keyboardNavigationLabelProvider = t, this._filter = i, this._totalCount = 0, this._matchCount = 0, this._pattern = "", this._lowercasePattern = "", this.disposables = new _(), e.onWillRefilter(this.reset, this, this.disposables); } filter(e, t) { let i = 1; if (this._filter) { - const r = this._filter.filter(e, t); - if (typeof r == "boolean" ? i = r ? 1 : 0 : u5(r) ? i = D1(r.visibility) : i = r, i === 0) + const l = this._filter.filter(e, t); + if (typeof l == "boolean" ? i = l ? 1 : 0 : JH(l) ? i = UW(l.visibility) : i = l, i === 0) return !1; } if (this._totalCount++, !this._pattern) - return this._matchCount++, { data: Il.Default, visibility: i }; + return this._matchCount++, { data: Tr.Default, visibility: i }; const n = this.keyboardNavigationLabelProvider.getKeyboardNavigationLabel(e), o = Array.isArray(n) ? n : [n]; - for (const r of o) { - const l = r && r.toString(); - if (typeof l > "u") - return { data: Il.Default, visibility: i }; - let a; - if (this.tree.findMatchType === _m.Contiguous) { - const c = l.toLowerCase().indexOf(this._lowercasePattern); - if (c > -1) { - a = [Number.MAX_SAFE_INTEGER, 0]; - for (let d = this._lowercasePattern.length; d > 0; d--) - a.push(c + d - 1); + for (const l of o) { + const r = l && l.toString(); + if (typeof r > "u") + return { data: Tr.Default, visibility: i }; + let c; + if (this.tree.findMatchType === Tb.Contiguous) { + const d = r.toLowerCase().indexOf(this._lowercasePattern); + if (d > -1) { + c = [Number.MAX_SAFE_INTEGER, 0]; + for (let a = this._lowercasePattern.length; a > 0; a--) + c.push(d + a - 1); } } else - a = wb(this._pattern, this._lowercasePattern, 0, l, l.toLowerCase(), 0, { firstMatchCanBeWeak: !0, boostFullMatch: !0 }); - if (a) - return this._matchCount++, o.length === 1 ? { data: a, visibility: i } : { data: { label: l, score: a }, visibility: i }; + c = IZ(this._pattern, this._lowercasePattern, 0, r, r.toLowerCase(), 0, { firstMatchCanBeWeak: !0, boostFullMatch: !0 }); + if (c) + return this._matchCount++, o.length === 1 ? { data: c, visibility: i } : { data: { label: r, score: c }, visibility: i }; } - return this.tree.findMode === Ic.Filter ? typeof this.tree.options.defaultFindVisibility == "number" ? this.tree.options.defaultFindVisibility : this.tree.options.defaultFindVisibility ? this.tree.options.defaultFindVisibility(e) : 2 : { data: Il.Default, visibility: i }; + return this.tree.findMode === Td.Filter ? typeof this.tree.options.defaultFindVisibility == "number" ? this.tree.options.defaultFindVisibility : this.tree.options.defaultFindVisibility ? this.tree.options.defaultFindVisibility(e) : 2 : { data: Tr.Default, visibility: i }; } reset() { this._totalCount = 0, this._matchCount = 0; } dispose() { - Wt(this.disposables); + Nt(this.disposables); } } -var Ic; +var Td; (function(s) { s[s.Highlight = 0] = "Highlight", s[s.Filter = 1] = "Filter"; -})(Ic || (Ic = {})); -var _m; +})(Td || (Td = {})); +var Tb; (function(s) { s[s.Fuzzy = 0] = "Fuzzy", s[s.Contiguous = 1] = "Contiguous"; -})(_m || (_m = {})); -let Abe = class { +})(Tb || (Tb = {})); +let p0e = class { get pattern() { return this._pattern; } @@ -66544,8 +66544,8 @@ let Abe = class { set matchType(e) { e !== this._matchType && (this._matchType = e, this.widget && (this.widget.matchType = this._matchType), this.tree.refilter(), this.render(), this._onDidChangeMatchType.fire(e)); } - constructor(e, t, i, n, o, r = {}) { - this.tree = e, this.view = i, this.filter = n, this.contextViewProvider = o, this.options = r, this._pattern = "", this.width = 0, this._onDidChangeMode = new k(), this.onDidChangeMode = this._onDidChangeMode.event, this._onDidChangeMatchType = new k(), this.onDidChangeMatchType = this._onDidChangeMatchType.event, this._onDidChangePattern = new k(), this._onDidChangeOpenState = new k(), this.onDidChangeOpenState = this._onDidChangeOpenState.event, this.enabledDisposables = new U(), this.disposables = new U(), this._mode = e.options.defaultFindMode ?? Ic.Highlight, this._matchType = e.options.defaultFindMatchType ?? _m.Fuzzy, t.onDidSplice(this.onDidSpliceModel, this, this.disposables); + constructor(e, t, i, n, o, l = {}) { + this.tree = e, this.view = i, this.filter = n, this.contextViewProvider = o, this.options = l, this._pattern = "", this.width = 0, this._onDidChangeMode = new k(), this.onDidChangeMode = this._onDidChangeMode.event, this._onDidChangeMatchType = new k(), this.onDidChangeMatchType = this._onDidChangeMatchType.event, this._onDidChangePattern = new k(), this._onDidChangeOpenState = new k(), this.onDidChangeOpenState = this._onDidChangeOpenState.event, this.enabledDisposables = new _(), this.disposables = new _(), this._mode = e.options.defaultFindMode ?? Td.Highlight, this._matchType = e.options.defaultFindMatchType ?? Tb.Fuzzy, t.onDidSplice(this.onDidSpliceModel, this, this.disposables); } updateOptions(e = {}) { e.defaultFindMode !== void 0 && (this.mode = e.defaultFindMode), e.defaultFindMatchType !== void 0 && (this.matchType = e.defaultFindMatchType); @@ -66556,13 +66556,13 @@ let Abe = class { render() { var t, i, n; const e = this.filter.totalCount > 0 && this.filter.matchCount === 0; - this.pattern && e ? (bs(p("replFindNoResults", "No results")), this.tree.options.showNotFoundMessage ?? !0 ? (t = this.widget) == null || t.showMessage({ type: 2, content: p("not found", "No elements found.") }) : (i = this.widget) == null || i.showMessage({ + this.pattern && e ? (ys(p("replFindNoResults", "No results")), this.tree.options.showNotFoundMessage ?? !0 ? (t = this.widget) == null || t.showMessage({ type: 2, content: p("not found", "No elements found.") }) : (i = this.widget) == null || i.showMessage({ type: 2 /* MessageType.WARNING */ - })) : ((n = this.widget) == null || n.clearMessage(), this.pattern && bs(p("replFindResults", "{0} results", this.filter.matchCount))); + })) : ((n = this.widget) == null || n.clearMessage(), this.pattern && ys(p("replFindResults", "{0} results", this.filter.matchCount))); } shouldAllowFocus(e) { - return !this.widget || !this.pattern || this.filter.totalCount > 0 && this.filter.matchCount <= 1 ? !0 : !Il.isDefault(e.filterData); + return !this.widget || !this.pattern || this.filter.totalCount > 0 && this.filter.matchCount <= 1 ? !0 : !Tr.isDefault(e.filterData); } layout(e) { var t; @@ -66572,13 +66572,13 @@ let Abe = class { this._history = void 0, this._onDidChangePattern.dispose(), this.enabledDisposables.dispose(), this.disposables.dispose(); } }; -function xbe(s, e) { - return s.position === e.position && FQ(s, e); +function g0e(s, e) { + return s.position === e.position && X4(s, e); } -function FQ(s, e) { +function X4(s, e) { return s.node.element === e.node.element && s.startIndex === e.startIndex && s.height === e.height && s.endIndex === e.endIndex; } -class Mbe { +class Z0e { constructor(e = []) { this.stickyNodes = e; } @@ -66586,7 +66586,7 @@ class Mbe { return this.stickyNodes.length; } equal(e) { - return ei(this.stickyNodes, e.stickyNodes, xbe); + return ti(this.stickyNodes, e.stickyNodes, g0e); } lastNodePartiallyVisible() { if (this.count === 0) @@ -66598,13 +66598,13 @@ class Mbe { return t.position + t.height !== e.position; } animationStateChanged(e) { - if (!ei(this.stickyNodes, e.stickyNodes, FQ) || this.count === 0) + if (!ti(this.stickyNodes, e.stickyNodes, X4) || this.count === 0) return !1; const t = this.stickyNodes[this.count - 1], i = e.stickyNodes[e.count - 1]; return t.position !== i.position; } } -class Zbe { +class f0e { constrainStickyScrollNodes(e, t, i) { for (let n = 0; n < e.length; n++) { const o = e[n]; @@ -66614,11 +66614,11 @@ class Zbe { return e; } } -let p3 = class extends R { - constructor(e, t, i, n, o, r = {}) { +let DA = class extends J { + constructor(e, t, i, n, o, l = {}) { super(), this.tree = e, this.model = t, this.view = i, this.treeDelegate = o, this.maxWidgetViewRatio = 0.4; - const l = this.validateStickySettings(r); - this.stickyScrollMaxItemCount = l.stickyScrollMaxItemCount, this.stickyScrollDelegate = r.stickyScrollDelegate ?? new Zbe(), this._widget = this._register(new _be(i.getScrollableElement(), i, e, n, o, r.accessibilityProvider)), this.onDidChangeHasFocus = this._widget.onDidChangeHasFocus, this.onContextMenu = this._widget.onContextMenu, this._register(i.onDidScroll(() => this.update())), this._register(i.onDidChangeContentHeight(() => this.update())), this._register(e.onDidChangeCollapseState(() => this.update())), this.update(); + const r = this.validateStickySettings(l); + this.stickyScrollMaxItemCount = r.stickyScrollMaxItemCount, this.stickyScrollDelegate = l.stickyScrollDelegate ?? new f0e(), this._widget = this._register(new y0e(i.getScrollableElement(), i, e, n, o, l.accessibilityProvider)), this.onDidChangeHasFocus = this._widget.onDidChangeHasFocus, this.onContextMenu = this._widget.onContextMenu, this._register(i.onDidScroll(() => this.update())), this._register(i.onDidChangeContentHeight(() => this.update())), this._register(e.onDidChangeCollapseState(() => this.update())), this.update(); } get height() { return this._widget.height; @@ -66642,8 +66642,8 @@ let p3 = class extends R { let i = e, n = 0, o = this.getNextStickyNode(i, void 0, n); for (; o && (t.push(o), n += o.height, !(t.length <= this.stickyScrollMaxItemCount && (i = this.getNextVisibleNode(o), !i))); ) o = this.getNextStickyNode(i, o.node, n); - const r = this.constrainStickyNodes(t); - return r.length ? new Mbe(r) : void 0; + const l = this.constrainStickyNodes(t); + return l.length ? new Z0e(l) : void 0; } getNextVisibleNode(e) { return this.getNodeAtHeight(e.position + e.height); @@ -66658,8 +66658,8 @@ let p3 = class extends R { return this.view.scrollTop === n - o; } createStickyScrollNode(e, t) { - const i = this.treeDelegate.getHeight(e), { startIndex: n, endIndex: o } = this.getNodeRange(e), r = this.calculateStickyNodePosition(o, t, i); - return { node: e, position: r, height: i, startIndex: n, endIndex: o }; + const i = this.treeDelegate.getHeight(e), { startIndex: n, endIndex: o } = this.getNodeRange(e), l = this.calculateStickyNodePosition(o, t, i); + return { node: e, position: l, height: i, startIndex: n, endIndex: o }; } getAncestorUnderPrevious(e, t = void 0) { let i = e, n = this.getParentNode(i); @@ -66674,13 +66674,13 @@ let p3 = class extends R { calculateStickyNodePosition(e, t, i) { let n = this.view.getRelativeTop(e); if (n === null && this.view.firstVisibleIndex === e && e + 1 < this.view.length) { - const c = this.treeDelegate.getHeight(this.view.element(e)), d = this.view.getRelativeTop(e + 1); - n = d ? d - c / this.view.renderHeight : null; + const d = this.treeDelegate.getHeight(this.view.element(e)), a = this.view.getRelativeTop(e + 1); + n = a ? a - d / this.view.renderHeight : null; } if (n === null) return t; - const o = this.view.element(e), r = this.treeDelegate.getHeight(o), a = n * this.view.renderHeight + r; - return t + i > a && t <= a ? a - i : t; + const o = this.view.element(e), l = this.treeDelegate.getHeight(o), c = n * this.view.renderHeight + l; + return t + i > c && t <= c ? c - i : t; } constrainStickyNodes(e) { if (e.length === 0) @@ -66742,11 +66742,11 @@ let p3 = class extends R { let t = 7; return typeof e.stickyScrollMaxItemCount == "number" && (t = Math.max(e.stickyScrollMaxItemCount, 1)), { stickyScrollMaxItemCount: t }; } -}, _be = class { - constructor(e, t, i, n, o, r) { - this.view = t, this.tree = i, this.treeRenderers = n, this.treeDelegate = o, this.accessibilityProvider = r, this._previousElements = [], this._previousStateDisposables = new U(), this._rootDomNode = ce(".monaco-tree-sticky-container.empty"), e.appendChild(this._rootDomNode); - const l = ce(".monaco-tree-sticky-container-shadow"); - this._rootDomNode.appendChild(l), this.stickyScrollFocus = new Ibe(this._rootDomNode, t), this.onDidChangeHasFocus = this.stickyScrollFocus.onDidChangeHasFocus, this.onContextMenu = this.stickyScrollFocus.onContextMenu; +}, y0e = class { + constructor(e, t, i, n, o, l) { + this.view = t, this.tree = i, this.treeRenderers = n, this.treeDelegate = o, this.accessibilityProvider = l, this._previousElements = [], this._previousStateDisposables = new _(), this._rootDomNode = de(".monaco-tree-sticky-container.empty"), e.appendChild(this._rootDomNode); + const r = de(".monaco-tree-sticky-container-shadow"); + this._rootDomNode.appendChild(r), this.stickyScrollFocus = new W0e(this._rootDomNode, t), this.onDidChangeHasFocus = this.stickyScrollFocus.onDidChangeHasFocus, this.onContextMenu = this.stickyScrollFocus.onContextMenu; } get height() { if (!this._previousState) @@ -66768,9 +66768,9 @@ let p3 = class extends R { else { this._previousStateDisposables.clear(); const o = Array(e.count); - for (let r = e.count - 1; r >= 0; r--) { - const l = e.stickyNodes[r], { element: a, disposable: c } = this.createElement(l, r, e.count); - o[r] = a, this._rootDomNode.appendChild(a), this._previousStateDisposables.add(c); + for (let l = e.count - 1; l >= 0; l--) { + const r = e.stickyNodes[l], { element: c, disposable: d } = this.createElement(r, l, e.count); + o[l] = c, this._rootDomNode.appendChild(c), this._previousStateDisposables.add(d); } this.stickyScrollFocus.updateElements(o, e), this._previousElements = o; } @@ -66779,29 +66779,29 @@ let p3 = class extends R { createElement(e, t, i) { const n = e.startIndex, o = document.createElement("div"); o.style.top = `${e.position}px`, this.tree.options.setRowHeight !== !1 && (o.style.height = `${e.height}px`), this.tree.options.setRowLineHeight !== !1 && (o.style.lineHeight = `${e.height}px`), o.classList.add("monaco-tree-sticky-row"), o.classList.add("monaco-list-row"), o.setAttribute("data-index", `${n}`), o.setAttribute("data-parity", n % 2 === 0 ? "even" : "odd"), o.setAttribute("id", this.view.getElementID(n)); - const r = this.setAccessibilityAttributes(o, e.node.element, t, i), l = this.treeDelegate.getTemplateId(e.node), a = this.treeRenderers.find((u) => u.templateId === l); - if (!a) - throw new Error(`No renderer found for template id ${l}`); - let c = e.node; - c === this.tree.getNode(this.tree.getNodeLocation(e.node)) && (c = new Proxy(e.node, {})); - const d = a.renderTemplate(o); - a.renderElement(c, e.startIndex, d, e.height); - const h = Ce(() => { - r.dispose(), a.disposeElement(c, e.startIndex, d, e.height), a.disposeTemplate(d), o.remove(); + const l = this.setAccessibilityAttributes(o, e.node.element, t, i), r = this.treeDelegate.getTemplateId(e.node), c = this.treeRenderers.find((u) => u.templateId === r); + if (!c) + throw new Error(`No renderer found for template id ${r}`); + let d = e.node; + d === this.tree.getNode(this.tree.getNodeLocation(e.node)) && (d = new Proxy(e.node, {})); + const a = c.renderTemplate(o); + c.renderElement(d, e.startIndex, a, e.height); + const h = We(() => { + l.dispose(), c.disposeElement(d, e.startIndex, a, e.height), c.disposeTemplate(a), o.remove(); }); return { element: o, disposable: h }; } setAccessibilityAttributes(e, t, i, n) { if (!this.accessibilityProvider) - return R.None; + return J.None; this.accessibilityProvider.getSetSize && e.setAttribute("aria-setsize", String(this.accessibilityProvider.getSetSize(t, i, n))), this.accessibilityProvider.getPosInSet && e.setAttribute("aria-posinset", String(this.accessibilityProvider.getPosInSet(t, i))), this.accessibilityProvider.getRole && e.setAttribute("role", this.accessibilityProvider.getRole(t) ?? "treeitem"); - const o = this.accessibilityProvider.getAriaLabel(t), r = o && typeof o != "string" ? o : dr(o), l = Te((c) => { - const d = c.readObservable(r); - d ? e.setAttribute("aria-label", d) : e.removeAttribute("aria-label"); + const o = this.accessibilityProvider.getAriaLabel(t), l = o && typeof o != "string" ? o : ul(o), r = Te((d) => { + const a = d.readObservable(l); + a ? e.setAttribute("aria-label", a) : e.removeAttribute("aria-label"); }); typeof o == "string" || o && e.setAttribute("aria-label", o.get()); - const a = this.accessibilityProvider.getAriaLevel && this.accessibilityProvider.getAriaLevel(t); - return typeof a == "number" && e.setAttribute("aria-level", `${a}`), e.setAttribute("aria-selected", String(!1)), l; + const c = this.accessibilityProvider.getAriaLevel && this.accessibilityProvider.getAriaLevel(t); + return typeof c == "number" && e.setAttribute("aria-level", `${c}`), e.setAttribute("aria-selected", String(!1)), r; } setVisible(e) { this._rootDomNode.classList.toggle("empty", !e), e || this.stickyScrollFocus.updateElements([], void 0); @@ -66816,7 +66816,7 @@ let p3 = class extends R { this.stickyScrollFocus.dispose(), this._previousStateDisposables.dispose(), this._rootDomNode.remove(); } }; -class Ibe extends R { +class W0e extends J { get domHasFocus() { return this._domHasFocus; } @@ -66828,20 +66828,20 @@ class Ibe extends R { } handleContextMenu(e) { const t = e.browserEvent.target; - if (!y1(t) && !Oy(t)) { + if (!NW(t) && !iy(t)) { this.focusedLast() && this.view.domFocus(); return; } - if (!uc(e.browserEvent)) { + if (!gd(e.browserEvent)) { if (!this.state) throw new Error("Context menu should not be triggered when state is undefined"); - const r = this.state.stickyNodes.findIndex((l) => { - var a; - return l.node.element === ((a = e.element) == null ? void 0 : a.element); + const l = this.state.stickyNodes.findIndex((r) => { + var c; + return r.node.element === ((c = e.element) == null ? void 0 : c.element); }); - if (r === -1) + if (l === -1) throw new Error("Context menu should not be triggered when element is not in sticky scroll widget"); - this.container.focus(), this.setFocus(r); + this.container.focus(), this.setFocus(l); return; } if (!this.state || this.focusedIndex < 0) @@ -66865,7 +66865,7 @@ class Ibe extends R { } onMouseDown(e) { const t = e.browserEvent.target; - !y1(t) && !Oy(t) || (e.browserEvent.preventDefault(), e.browserEvent.stopPropagation()); + !NW(t) && !iy(t) || (e.browserEvent.preventDefault(), e.browserEvent.stopPropagation()); } updateElements(e, t) { if (t && t.count === 0) @@ -66874,7 +66874,7 @@ class Ibe extends R { throw new Error("Sticky scroll focus received illigel state"); const i = this.focusedIndex; if (this.removeFocus(), this.elements = e, this.state = t, t) { - const n = os(i, 0, t.count - 1); + const n = rs(i, 0, t.count - 1); this.setFocus(n); } else this.domHasFocus && this.view.domFocus(); @@ -66890,8 +66890,8 @@ class Ibe extends R { } } scrollNodeUnderWidget(e, t) { - const i = t.stickyNodes[t.count - 1], n = t.count > 1 ? t.stickyNodes[t.count - 2] : void 0, o = this.view.getElementTop(e), r = n ? n.position + n.height + i.height : i.height; - this.view.scrollTop = o - r; + const i = t.stickyNodes[t.count - 1], n = t.count > 1 ? t.stickyNodes[t.count - 2] : void 0, o = this.view.getElementTop(e), l = n ? n.position + n.height + i.height : i.height; + this.view.scrollTop = o - l; } domFocus() { if (!this.state) @@ -66941,16 +66941,16 @@ class Ibe extends R { this.toggleStickyScrollFocused(!1), this._onDidChangeHasFocus.fire(!1), super.dispose(); } } -function WS(s) { - let e = ng.Unknown; - return ZN(s.browserEvent.target, "monaco-tl-twistie", "monaco-tl-row") ? e = ng.Twistie : ZN(s.browserEvent.target, "monaco-tl-contents", "monaco-tl-row") ? e = ng.Element : ZN(s.browserEvent.target, "monaco-tree-type-filter", "monaco-list") && (e = ng.Filter), { +function A1(s) { + let e = cm.Unknown; + return zC(s.browserEvent.target, "monaco-tl-twistie", "monaco-tl-row") ? e = cm.Twistie : zC(s.browserEvent.target, "monaco-tl-contents", "monaco-tl-row") ? e = cm.Element : zC(s.browserEvent.target, "monaco-tree-type-filter", "monaco-list") && (e = cm.Filter), { browserEvent: s.browserEvent, element: s.element ? s.element.element : null, target: e }; } -function Nbe(s) { - const e = y1(s.browserEvent.target); +function G0e(s) { + const e = NW(s.browserEvent.target); return { element: s.element ? s.element.element : null, browserEvent: s.browserEvent, @@ -66958,10 +66958,10 @@ function Nbe(s) { isStickyScroll: e }; } -function DL(s, e) { - e(s), s.children.forEach((t) => DL(t, e)); +function _X(s, e) { + e(s), s.children.forEach((t) => _X(t, e)); } -class NW { +class UR { get nodeSet() { return this._nodeSet || (this._nodeSet = this.createNodeSet()), this._nodeSet; } @@ -66969,7 +66969,7 @@ class NW { this.getFirstViewElementWithTrait = e, this.identityProvider = t, this.nodes = [], this._onDidChange = new k(), this.onDidChange = this._onDidChange.event; } set(e, t) { - !(t != null && t.__forceEvent) && ei(this.nodes, e) || this._set(e, !1, t); + !(t != null && t.__forceEvent) && ti(this.nodes, e) || this._set(e, !1, t); } _set(e, t, i) { if (this.nodes = [...e], this.elements = void 0, this._nodeSet = void 0, !t) { @@ -66990,29 +66990,29 @@ class NW { } onDidModelSplice({ insertedNodes: e, deletedNodes: t }) { if (!this.identityProvider) { - const a = this.createNodeSet(), c = (d) => a.delete(d); - t.forEach((d) => DL(d, c)), this.set([...a.values()]); + const c = this.createNodeSet(), d = (a) => c.delete(a); + t.forEach((a) => _X(a, d)), this.set([...c.values()]); return; } - const i = /* @__PURE__ */ new Set(), n = (a) => i.add(this.identityProvider.getId(a.element).toString()); - t.forEach((a) => DL(a, n)); - const o = /* @__PURE__ */ new Map(), r = (a) => o.set(this.identityProvider.getId(a.element).toString(), a); - e.forEach((a) => DL(a, r)); - const l = []; - for (const a of this.nodes) { - const c = this.identityProvider.getId(a.element).toString(); - if (!i.has(c)) - l.push(a); + const i = /* @__PURE__ */ new Set(), n = (c) => i.add(this.identityProvider.getId(c.element).toString()); + t.forEach((c) => _X(c, n)); + const o = /* @__PURE__ */ new Map(), l = (c) => o.set(this.identityProvider.getId(c.element).toString(), c); + e.forEach((c) => _X(c, l)); + const r = []; + for (const c of this.nodes) { + const d = this.identityProvider.getId(c.element).toString(); + if (!i.has(d)) + r.push(c); else { - const h = o.get(c); - h && h.visible && l.push(h); + const h = o.get(d); + h && h.visible && r.push(h); } } - if (this.nodes.length > 0 && l.length === 0) { - const a = this.getFirstViewElementWithTrait(); - a && l.push(a); + if (this.nodes.length > 0 && r.length === 0) { + const c = this.getFirstViewElementWithTrait(); + c && r.push(c); } - this._set(l, !0); + this._set(r, !0); } createNodeSet() { const e = /* @__PURE__ */ new Set(); @@ -67021,31 +67021,31 @@ class NW { return e; } } -class Wbe extends UK { +class X0e extends NO { constructor(e, t, i) { super(e), this.tree = t, this.stickyScrollProvider = i; } onViewPointer(e) { - if (BK(e.browserEvent.target) || nh(e.browserEvent.target) || uy(e.browserEvent.target) || e.browserEvent.isHandledByList) + if (SO(e.browserEvent.target) || rh(e.browserEvent.target) || Xf(e.browserEvent.target) || e.browserEvent.isHandledByList) return; const t = e.element; if (!t) return super.onViewPointer(e); if (this.isSelectionRangeChangeEvent(e) || this.isSelectionSingleChangeEvent(e)) return super.onViewPointer(e); - const i = e.browserEvent.target, n = i.classList.contains("monaco-tl-twistie") || i.classList.contains("monaco-icon-label") && i.classList.contains("folder-icon") && e.browserEvent.offsetX < 16, o = Oy(e.browserEvent.target); - let r = !1; - if (o ? r = !0 : typeof this.tree.expandOnlyOnTwistieClick == "function" ? r = this.tree.expandOnlyOnTwistieClick(t.element) : r = !!this.tree.expandOnlyOnTwistieClick, o) + const i = e.browserEvent.target, n = i.classList.contains("monaco-tl-twistie") || i.classList.contains("monaco-icon-label") && i.classList.contains("folder-icon") && e.browserEvent.offsetX < 16, o = iy(e.browserEvent.target); + let l = !1; + if (o ? l = !0 : typeof this.tree.expandOnlyOnTwistieClick == "function" ? l = this.tree.expandOnlyOnTwistieClick(t.element) : l = !!this.tree.expandOnlyOnTwistieClick, o) this.handleStickyScrollMouseEvent(e, t); else { - if (r && !n && e.browserEvent.detail !== 2) + if (l && !n && e.browserEvent.detail !== 2) return super.onViewPointer(e); if (!this.tree.expandOnDoubleClick && e.browserEvent.detail === 2) return super.onViewPointer(e); } if (t.collapsible && (!o || n)) { - const l = this.tree.getNodeLocation(t), a = e.browserEvent.altKey; - if (this.tree.setFocus([l]), this.tree.toggleCollapsed(l, a), n) { + const r = this.tree.getNodeLocation(t), c = e.browserEvent.altKey; + if (this.tree.setFocus([r]), this.tree.toggleCollapsed(r, c), n) { e.browserEvent.isHandledByList = !0; return; } @@ -67053,13 +67053,13 @@ class Wbe extends UK { o || super.onViewPointer(e); } handleStickyScrollMouseEvent(e, t) { - if (jhe(e.browserEvent.target) || qhe(e.browserEvent.target)) + if (Aue(e.browserEvent.target) || Kue(e.browserEvent.target)) return; const i = this.stickyScrollProvider(); if (!i) throw new Error("Sticky scroll controller not found"); - const n = this.list.indexOf(t), o = this.list.getElementTop(n), r = i.nodePositionTopBelowWidget(t); - this.tree.scrollTop = o - r, this.list.domFocus(), this.list.setFocus([n]), this.list.setSelection([n]); + const n = this.list.indexOf(t), o = this.list.getElementTop(n), l = i.nodePositionTopBelowWidget(t); + this.tree.scrollTop = o - l, this.list.domFocus(), this.list.setFocus([n]), this.list.setSelection([n]); } onDoubleClick(e) { e.browserEvent.target.classList.contains("monaco-tl-twistie") || !this.tree.expandOnDoubleClick || e.browserEvent.isHandledByList || super.onDoubleClick(e); @@ -67067,34 +67067,34 @@ class Wbe extends UK { // to make sure dom focus is not stolen (for example with context menu) onMouseDown(e) { const t = e.browserEvent.target; - if (!y1(t) && !Oy(t)) { + if (!NW(t) && !iy(t)) { super.onMouseDown(e); return; } } onContextMenu(e) { const t = e.browserEvent.target; - if (!y1(t) && !Oy(t)) { + if (!NW(t) && !iy(t)) { super.onContextMenu(e); return; } } } -class vbe extends Qo { - constructor(e, t, i, n, o, r, l, a) { - super(e, t, i, n, a), this.focusTrait = o, this.selectionTrait = r, this.anchorTrait = l; +class V0e extends qo { + constructor(e, t, i, n, o, l, r, c) { + super(e, t, i, n, c), this.focusTrait = o, this.selectionTrait = l, this.anchorTrait = r; } createMouseController(e) { - return new Wbe(this, e.tree, e.stickyScrollProvider); + return new X0e(this, e.tree, e.stickyScrollProvider); } splice(e, t, i = []) { if (super.splice(e, t, i), i.length === 0) return; const n = [], o = []; - let r; - i.forEach((l, a) => { - this.focusTrait.has(l) && n.push(e + a), this.selectionTrait.has(l) && o.push(e + a), this.anchorTrait.has(l) && (r = e + a); - }), n.length > 0 && super.setFocus(Oc([...super.getFocus(), ...n])), o.length > 0 && super.setSelection(Oc([...super.getSelection(), ...o])), typeof r == "number" && super.setAnchor(r); + let l; + i.forEach((r, c) => { + this.focusTrait.has(r) && n.push(e + c), this.selectionTrait.has(r) && o.push(e + c), this.anchorTrait.has(r) && (l = e + c); + }), n.length > 0 && super.setFocus(Qd([...super.getFocus(), ...n])), o.length > 0 && super.setSelection(Qd([...super.getSelection(), ...o])), typeof l == "number" && super.setAnchor(l); } setFocus(e, t, i = !1) { super.setFocus(e, t), i || this.focusTrait.set(e.map((n) => this.element(n)), t); @@ -67106,7 +67106,7 @@ class vbe extends Qo { super.setAnchor(e), t || (typeof e > "u" ? this.anchorTrait.set([]) : this.anchorTrait.set([this.element(e)])); } } -class YQ { +class V4 { get onDidScroll() { return this.view.onDidScroll; } @@ -67117,20 +67117,20 @@ class YQ { return this.eventBufferer.wrapEvent(this.selection.onDidChange); } get onMouseDblClick() { - return se.filter(se.map(this.view.onMouseDblClick, WS), (e) => e.target !== ng.Filter); + return se.filter(se.map(this.view.onMouseDblClick, A1), (e) => e.target !== cm.Filter); } get onMouseOver() { - return se.map(this.view.onMouseOver, WS); + return se.map(this.view.onMouseOver, A1); } get onMouseOut() { - return se.map(this.view.onMouseOut, WS); + return se.map(this.view.onMouseOut, A1); } get onContextMenu() { var e; - return se.any(se.filter(se.map(this.view.onContextMenu, Nbe), (t) => !t.isStickyScroll), ((e = this.stickyScrollController) == null ? void 0 : e.onContextMenu) ?? se.None); + return se.any(se.filter(se.map(this.view.onContextMenu, G0e), (t) => !t.isStickyScroll), ((e = this.stickyScrollController) == null ? void 0 : e.onContextMenu) ?? se.None); } get onPointer() { - return se.map(this.view.onPointer, WS); + return se.map(this.view.onPointer, A1); } get onKeyDown() { return this.view.onKeyDown; @@ -67146,14 +67146,14 @@ class YQ { } get findMode() { var e; - return ((e = this.findController) == null ? void 0 : e.mode) ?? Ic.Highlight; + return ((e = this.findController) == null ? void 0 : e.mode) ?? Td.Highlight; } set findMode(e) { this.findController && (this.findController.mode = e); } get findMatchType() { var e; - return ((e = this.findController) == null ? void 0 : e.matchType) ?? _m.Fuzzy; + return ((e = this.findController) == null ? void 0 : e.matchType) ?? Tb.Fuzzy; } set findMatchType(e) { this.findController && (this.findController.matchType = e); @@ -67168,62 +67168,62 @@ class YQ { return this.view.onDidDispose; } constructor(e, t, i, n, o = {}) { - this._user = e, this._options = o, this.eventBufferer = new aC(), this.onDidChangeFindOpenState = se.None, this.onDidChangeStickyScrollFocused = se.None, this.disposables = new U(), this._onWillRefilter = new k(), this.onWillRefilter = this._onWillRefilter.event, this._onDidUpdateOptions = new k(), this.treeDelegate = new g5(i); - const r = new F9(), l = new F9(), a = this.disposables.add(new Sbe(l.event)), c = new bE(); - this.renderers = n.map((m) => new lD(m, () => this.model, r.event, a, c, o)); - for (const m of this.renderers) - this.disposables.add(m); - let d; - o.keyboardNavigationLabelProvider && (d = new Lbe(this, o.keyboardNavigationLabelProvider, o.filter), o = { ...o, filter: d }, this.disposables.add(d)), this.focus = new NW(() => this.view.getFocusedElements()[0], o.identityProvider), this.selection = new NW(() => this.view.getSelectedElements()[0], o.identityProvider), this.anchor = new NW(() => this.view.getAnchorElement(), o.identityProvider), this.view = new vbe(e, t, this.treeDelegate, this.renderers, this.focus, this.selection, this.anchor, { ...Cbe(() => this.model, o), tree: this, stickyScrollProvider: () => this.stickyScrollController }), this.model = this.createModel(e, this.view, o), r.input = this.model.onDidChangeCollapseState; - const h = se.forEach(this.model.onDidSplice, (m) => { + this._user = e, this._options = o, this.eventBufferer = new GG(), this.onDidChangeFindOpenState = se.None, this.onDidChangeStickyScrollFocused = se.None, this.disposables = new _(), this._onWillRefilter = new k(), this.onWillRefilter = this._onWillRefilter.event, this._onDidUpdateOptions = new k(), this.treeDelegate = new HH(i); + const l = new hD(), r = new hD(), c = this.disposables.add(new m0e(r.event)), d = new zv(); + this.renderers = n.map((b) => new CM(b, () => this.model, l.event, c, d, o)); + for (const b of this.renderers) + this.disposables.add(b); + let a; + o.keyboardNavigationLabelProvider && (a = new b0e(this, o.keyboardNavigationLabelProvider, o.filter), o = { ...o, filter: a }, this.disposables.add(a)), this.focus = new UR(() => this.view.getFocusedElements()[0], o.identityProvider), this.selection = new UR(() => this.view.getSelectedElements()[0], o.identityProvider), this.anchor = new UR(() => this.view.getAnchorElement(), o.identityProvider), this.view = new V0e(e, t, this.treeDelegate, this.renderers, this.focus, this.selection, this.anchor, { ...u0e(() => this.model, o), tree: this, stickyScrollProvider: () => this.stickyScrollController }), this.model = this.createModel(e, this.view, o), l.input = this.model.onDidChangeCollapseState; + const h = se.forEach(this.model.onDidSplice, (b) => { this.eventBufferer.bufferEvents(() => { - this.focus.onDidModelSplice(m), this.selection.onDidModelSplice(m); + this.focus.onDidModelSplice(b), this.selection.onDidModelSplice(b); }); }, this.disposables); h(() => null, null, this.disposables); - const u = this.disposables.add(new k()), g = this.disposables.add(new fr(0)); + const u = this.disposables.add(new k()), m = this.disposables.add(new yl(0)); if (this.disposables.add(se.any(h, this.focus.onDidChange, this.selection.onDidChange)(() => { - g.trigger(() => { - const m = /* @__PURE__ */ new Set(); - for (const f of this.focus.getNodes()) - m.add(f); - for (const f of this.selection.getNodes()) - m.add(f); - u.fire([...m.values()]); + m.trigger(() => { + const b = /* @__PURE__ */ new Set(); + for (const g of this.focus.getNodes()) + b.add(g); + for (const g of this.selection.getNodes()) + b.add(g); + u.fire([...b.values()]); }); - })), l.input = u.event, o.keyboardSupport !== !1) { - const m = se.chain(this.view.onKeyDown, (f) => f.filter((b) => !nh(b.target)).map((b) => new Vt(b))); - se.chain(m, (f) => f.filter( - (b) => b.keyCode === 15 + })), r.input = u.event, o.keyboardSupport !== !1) { + const b = se.chain(this.view.onKeyDown, (g) => g.filter((Z) => !rh(Z.target)).map((Z) => new Yt(Z))); + se.chain(b, (g) => g.filter( + (Z) => Z.keyCode === 15 /* KeyCode.LeftArrow */ - ))(this.onLeftArrow, this, this.disposables), se.chain(m, (f) => f.filter( - (b) => b.keyCode === 17 + ))(this.onLeftArrow, this, this.disposables), se.chain(b, (g) => g.filter( + (Z) => Z.keyCode === 17 /* KeyCode.RightArrow */ - ))(this.onRightArrow, this, this.disposables), se.chain(m, (f) => f.filter( - (b) => b.keyCode === 10 + ))(this.onRightArrow, this, this.disposables), se.chain(b, (g) => g.filter( + (Z) => Z.keyCode === 10 /* KeyCode.Space */ ))(this.onSpace, this, this.disposables); } if ((o.findWidgetEnabled ?? !0) && o.keyboardNavigationLabelProvider && o.contextViewProvider) { - const m = this.options.findWidgetStyles ? { styles: this.options.findWidgetStyles } : void 0; - this.findController = new Abe(this, this.model, this.view, d, o.contextViewProvider, m), this.focusNavigationFilter = (f) => this.findController.shouldAllowFocus(f), this.onDidChangeFindOpenState = this.findController.onDidChangeOpenState, this.disposables.add(this.findController), this.onDidChangeFindMode = this.findController.onDidChangeMode, this.onDidChangeFindMatchType = this.findController.onDidChangeMatchType; + const b = this.options.findWidgetStyles ? { styles: this.options.findWidgetStyles } : void 0; + this.findController = new p0e(this, this.model, this.view, a, o.contextViewProvider, b), this.focusNavigationFilter = (g) => this.findController.shouldAllowFocus(g), this.onDidChangeFindOpenState = this.findController.onDidChangeOpenState, this.disposables.add(this.findController), this.onDidChangeFindMode = this.findController.onDidChangeMode, this.onDidChangeFindMatchType = this.findController.onDidChangeMatchType; } else this.onDidChangeFindMode = se.None, this.onDidChangeFindMatchType = se.None; - o.enableStickyScroll && (this.stickyScrollController = new p3(this, this.model, this.view, this.renderers, this.treeDelegate, o), this.onDidChangeStickyScrollFocused = this.stickyScrollController.onDidChangeHasFocus), this.styleElement = Bo(this.view.getHTMLElement()), this.getHTMLElement().classList.toggle("always", this._options.renderIndentGuides === Ib.Always); + o.enableStickyScroll && (this.stickyScrollController = new DA(this, this.model, this.view, this.renderers, this.treeDelegate, o), this.onDidChangeStickyScrollFocused = this.stickyScrollController.onDidChangeHasFocus), this.styleElement = Po(this.view.getHTMLElement()), this.getHTMLElement().classList.toggle("always", this._options.renderIndentGuides === YZ.Always); } updateOptions(e = {}) { var t; this._options = { ...this._options, ...e }; for (const i of this.renderers) i.updateOptions(e); - this.view.updateOptions(this._options), (t = this.findController) == null || t.updateOptions(e), this.updateStickyScroll(e), this._onDidUpdateOptions.fire(this._options), this.getHTMLElement().classList.toggle("always", this._options.renderIndentGuides === Ib.Always); + this.view.updateOptions(this._options), (t = this.findController) == null || t.updateOptions(e), this.updateStickyScroll(e), this._onDidUpdateOptions.fire(this._options), this.getHTMLElement().classList.toggle("always", this._options.renderIndentGuides === YZ.Always); } get options() { return this._options; } updateStickyScroll(e) { var t; - !this.stickyScrollController && this._options.enableStickyScroll ? (this.stickyScrollController = new p3(this, this.model, this.view, this.renderers, this.treeDelegate, this._options), this.onDidChangeStickyScrollFocused = this.stickyScrollController.onDidChangeHasFocus) : this.stickyScrollController && !this._options.enableStickyScroll && (this.onDidChangeStickyScrollFocused = se.None, this.stickyScrollController.dispose(), this.stickyScrollController = void 0), (t = this.stickyScrollController) == null || t.updateOptions(e); + !this.stickyScrollController && this._options.enableStickyScroll ? (this.stickyScrollController = new DA(this, this.model, this.view, this.renderers, this.treeDelegate, this._options), this.onDidChangeStickyScrollFocused = this.stickyScrollController.onDidChangeHasFocus) : this.stickyScrollController && !this._options.enableStickyScroll && (this.onDidChangeStickyScrollFocused = se.None, this.stickyScrollController.dispose(), this.stickyScrollController = void 0), (t = this.stickyScrollController) == null || t.updateOptions(e); } // Widget getHTMLElement() { @@ -67253,14 +67253,14 @@ class YQ { } layout(e, t) { var i; - this.view.layout(e, t), Mh(t) && ((i = this.findController) == null || i.layout(t)); + this.view.layout(e, t), Rh(t) && ((i = this.findController) == null || i.layout(t)); } style(e) { const t = `.${this.view.domId}`, i = []; e.treeIndentGuidesStroke && (i.push(`.monaco-list${t}:hover .monaco-tl-indent > .indent-guide, .monaco-list${t}.always .monaco-tl-indent > .indent-guide { border-color: ${e.treeInactiveIndentGuidesStroke}; }`), i.push(`.monaco-list${t} .monaco-tl-indent > .indent-guide.active { border-color: ${e.treeIndentGuidesStroke}; }`)); const n = e.treeStickyScrollBackground ?? e.listBackground; n && (i.push(`.monaco-list${t} .monaco-scrollable-element .monaco-tree-sticky-container { background-color: ${n}; }`), i.push(`.monaco-list${t} .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-row { background-color: ${n}; }`)), e.treeStickyScrollBorder && i.push(`.monaco-list${t} .monaco-scrollable-element .monaco-tree-sticky-container { border-bottom: 1px solid ${e.treeStickyScrollBorder}; }`), e.treeStickyScrollShadow && i.push(`.monaco-list${t} .monaco-scrollable-element .monaco-tree-sticky-container .monaco-tree-sticky-container-shadow { box-shadow: ${e.treeStickyScrollShadow} 0 6px 6px -6px inset; height: 3px; }`), e.listFocusForeground && (i.push(`.monaco-list${t}.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container:focus .monaco-list-row.focused { color: ${e.listFocusForeground}; }`), i.push(`.monaco-list${t}:not(.sticky-scroll-focused) .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.focused { color: inherit; }`)); - const o = Gc(e.listFocusAndSelectionOutline, Gc(e.listSelectionOutline, e.listFocusOutline ?? "")); + const o = Dd(e.listFocusAndSelectionOutline, Dd(e.listSelectionOutline, e.listFocusOutline ?? "")); o && (i.push(`.monaco-list${t}.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container:focus .monaco-list-row.focused.selected { outline: 1px solid ${o}; outline-offset: -1px;}`), i.push(`.monaco-list${t}:not(.sticky-scroll-focused) .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.focused.selected { outline: inherit;}`)), e.listFocusOutline && (i.push(`.monaco-list${t}.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container:focus .monaco-list-row.focused { outline: 1px solid ${e.listFocusOutline}; outline-offset: -1px; }`), i.push(`.monaco-list${t}:not(.sticky-scroll-focused) .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.focused { outline: inherit; }`), i.push(`.monaco-workbench.context-menu-visible .monaco-list${t}.last-focused.sticky-scroll-focused .monaco-scrollable-element .monaco-tree-sticky-container .monaco-list-row.passive-focused { outline: 1px solid ${e.listFocusOutline}; outline-offset: -1px; }`), i.push(`.monaco-workbench.context-menu-visible .monaco-list${t}.last-focused.sticky-scroll-focused .monaco-list-rows .monaco-list-row.focused { outline: inherit; }`), i.push(`.monaco-workbench.context-menu-visible .monaco-list${t}.last-focused:not(.sticky-scroll-focused) .monaco-tree-sticky-container .monaco-list-rows .monaco-list-row.focused { outline: inherit; }`)), this.styleElement.textContent = i.join(` `), this.view.style(e); } @@ -67319,25 +67319,25 @@ class YQ { this.view.setFocus(n, t, !0); }); } - focusNext(e = 1, t = !1, i, n = uc(i) && i.altKey ? void 0 : this.focusNavigationFilter) { + focusNext(e = 1, t = !1, i, n = gd(i) && i.altKey ? void 0 : this.focusNavigationFilter) { this.view.focusNext(e, t, i, n); } - focusPrevious(e = 1, t = !1, i, n = uc(i) && i.altKey ? void 0 : this.focusNavigationFilter) { + focusPrevious(e = 1, t = !1, i, n = gd(i) && i.altKey ? void 0 : this.focusNavigationFilter) { this.view.focusPrevious(e, t, i, n); } - focusNextPage(e, t = uc(e) && e.altKey ? void 0 : this.focusNavigationFilter) { + focusNextPage(e, t = gd(e) && e.altKey ? void 0 : this.focusNavigationFilter) { return this.view.focusNextPage(e, t); } - focusPreviousPage(e, t = uc(e) && e.altKey ? void 0 : this.focusNavigationFilter) { + focusPreviousPage(e, t = gd(e) && e.altKey ? void 0 : this.focusNavigationFilter) { return this.view.focusPreviousPage(e, t, () => { var i; return ((i = this.stickyScrollController) == null ? void 0 : i.height) ?? 0; }); } - focusLast(e, t = uc(e) && e.altKey ? void 0 : this.focusNavigationFilter) { + focusLast(e, t = gd(e) && e.altKey ? void 0 : this.focusNavigationFilter) { this.view.focusLast(e, t); } - focusFirst(e, t = uc(e) && e.altKey ? void 0 : this.focusNavigationFilter) { + focusFirst(e, t = gd(e) && e.altKey ? void 0 : this.focusNavigationFilter) { this.view.focusFirst(e, t); } getFocus() { @@ -67362,11 +67362,11 @@ class YQ { return; const i = t[0], n = this.model.getNodeLocation(i); if (!this.model.setCollapsed(n, !0)) { - const r = this.model.getParentNodeLocation(n); - if (!r) + const l = this.model.getParentNodeLocation(n); + if (!l) return; - const l = this.model.getListIndex(r); - this.view.reveal(l), this.view.setFocus([l]); + const r = this.model.getListIndex(l); + this.view.reveal(r), this.view.setFocus([r]); } } onRightArrow(e) { @@ -67376,10 +67376,10 @@ class YQ { return; const i = t[0], n = this.model.getNodeLocation(i); if (!this.model.setCollapsed(n, !1)) { - if (!i.children.some((a) => a.visible)) + if (!i.children.some((c) => c.visible)) return; - const [r] = this.view.getFocus(), l = r + 1; - this.view.reveal(l), this.view.setFocus([l]); + const [l] = this.view.getFocus(), r = l + 1; + this.view.reveal(r), this.view.setFocus([r]); } } onSpace(e) { @@ -67392,12 +67392,12 @@ class YQ { } dispose() { var e; - Wt(this.disposables), (e = this.stickyScrollController) == null || e.dispose(), this.view.dispose(); + Nt(this.disposables), (e = this.stickyScrollController) == null || e.dispose(), this.view.dispose(); } } -class m5 { +class EH { constructor(e, t, i = {}) { - this.user = e, this.rootRef = null, this.nodes = /* @__PURE__ */ new Map(), this.nodesByIdentity = /* @__PURE__ */ new Map(), this.model = new bbe(e, t, null, i), this.onDidSplice = this.model.onDidSplice, this.onDidChangeCollapseState = this.model.onDidChangeCollapseState, this.onDidChangeRenderNodeCount = this.model.onDidChangeRenderNodeCount, i.sorter && (this.sorter = { + this.user = e, this.rootRef = null, this.nodes = /* @__PURE__ */ new Map(), this.nodesByIdentity = /* @__PURE__ */ new Map(), this.model = new d0e(e, t, null, i), this.onDidSplice = this.model.onDidSplice, this.onDidChangeCollapseState = this.model.onDidChangeCollapseState, this.onDidChangeRenderNodeCount = this.model.onDidChangeRenderNodeCount, i.sorter && (this.sorter = { compare(n, o) { return i.sorter.compare(n.element, o.element); } @@ -67408,47 +67408,47 @@ class m5 { this._setChildren(n, this.preserveCollapseState(t), i); } _setChildren(e, t = nt.empty(), i) { - const n = /* @__PURE__ */ new Set(), o = /* @__PURE__ */ new Set(), r = (a) => { - var d; - if (a.element === null) + const n = /* @__PURE__ */ new Set(), o = /* @__PURE__ */ new Set(), l = (c) => { + var a; + if (c.element === null) return; - const c = a; - if (n.add(c.element), this.nodes.set(c.element, c), this.identityProvider) { - const h = this.identityProvider.getId(c.element).toString(); - o.add(h), this.nodesByIdentity.set(h, c); + const d = c; + if (n.add(d.element), this.nodes.set(d.element, d), this.identityProvider) { + const h = this.identityProvider.getId(d.element).toString(); + o.add(h), this.nodesByIdentity.set(h, d); } - (d = i.onDidCreateNode) == null || d.call(i, c); - }, l = (a) => { - var d; - if (a.element === null) + (a = i.onDidCreateNode) == null || a.call(i, d); + }, r = (c) => { + var a; + if (c.element === null) return; - const c = a; - if (n.has(c.element) || this.nodes.delete(c.element), this.identityProvider) { - const h = this.identityProvider.getId(c.element).toString(); + const d = c; + if (n.has(d.element) || this.nodes.delete(d.element), this.identityProvider) { + const h = this.identityProvider.getId(d.element).toString(); o.has(h) || this.nodesByIdentity.delete(h); } - (d = i.onDidDeleteNode) == null || d.call(i, c); + (a = i.onDidDeleteNode) == null || a.call(i, d); }; - this.model.splice([...e, 0], Number.MAX_VALUE, t, { ...i, onDidCreateNode: r, onDidDeleteNode: l }); + this.model.splice([...e, 0], Number.MAX_VALUE, t, { ...i, onDidCreateNode: l, onDidDeleteNode: r }); } preserveCollapseState(e = nt.empty()) { return this.sorter && (e = [...e].sort(this.sorter.compare.bind(this.sorter))), nt.map(e, (t) => { let i = this.nodes.get(t.element); if (!i && this.identityProvider) { - const r = this.identityProvider.getId(t.element).toString(); - i = this.nodesByIdentity.get(r); + const l = this.identityProvider.getId(t.element).toString(); + i = this.nodesByIdentity.get(l); } if (!i) { - let r; - return typeof t.collapsed > "u" ? r = void 0 : t.collapsed === Io.Collapsed || t.collapsed === Io.PreserveOrCollapsed ? r = !0 : t.collapsed === Io.Expanded || t.collapsed === Io.PreserveOrExpanded ? r = !1 : r = !!t.collapsed, { + let l; + return typeof t.collapsed > "u" ? l = void 0 : t.collapsed === No.Collapsed || t.collapsed === No.PreserveOrCollapsed ? l = !0 : t.collapsed === No.Expanded || t.collapsed === No.PreserveOrExpanded ? l = !1 : l = !!t.collapsed, { ...t, children: this.preserveCollapseState(t.children), - collapsed: r + collapsed: l }; } const n = typeof t.collapsible == "boolean" ? t.collapsible : i.collapsible; let o; - return typeof t.collapsed > "u" || t.collapsed === Io.PreserveOrCollapsed || t.collapsed === Io.PreserveOrExpanded ? o = i.collapsed : t.collapsed === Io.Collapsed ? o = !0 : t.collapsed === Io.Expanded ? o = !1 : o = !!t.collapsed, { + return typeof t.collapsed > "u" || t.collapsed === No.PreserveOrCollapsed || t.collapsed === No.PreserveOrExpanded ? o = i.collapsed : t.collapsed === No.Collapsed ? o = !0 : t.collapsed === No.Expanded ? o = !1 : o = !!t.collapsed, { ...t, collapsible: n, collapsed: o, @@ -67503,7 +67503,7 @@ class m5 { return this.model.getNode(this.model.rootRef); const t = this.nodes.get(e); if (!t) - throw new Go(this.user, `Tree element not found: ${e}`); + throw new Ho(this.user, `Tree element not found: ${e}`); return t; } getNodeLocation(e) { @@ -67511,10 +67511,10 @@ class m5 { } getParentNodeLocation(e) { if (e === null) - throw new Go(this.user, "Invalid getParentNodeLocation call"); + throw new Ho(this.user, "Invalid getParentNodeLocation call"); const t = this.nodes.get(e); if (!t) - throw new Go(this.user, `Tree element not found: ${e}`); + throw new Ho(this.user, `Tree element not found: ${e}`); const i = this.model.getNodeLocation(t), n = this.model.getParentNodeLocation(i); return this.model.getNode(n).element; } @@ -67523,34 +67523,34 @@ class m5 { return []; const t = this.nodes.get(e); if (!t) - throw new Go(this.user, `Tree element not found: ${e}`); + throw new Ho(this.user, `Tree element not found: ${e}`); return this.model.getNodeLocation(t); } } -function VL(s) { +function QX(s) { const e = [s.element], t = s.incompressible || !1; return { element: { elements: e, incompressible: t }, - children: nt.map(nt.from(s.children), VL), + children: nt.map(nt.from(s.children), QX), collapsible: s.collapsible, collapsed: s.collapsed }; } -function kL(s) { +function OX(s) { const e = [s.element], t = s.incompressible || !1; let i, n; for (; [n, i] = nt.consume(nt.from(s.children), 2), !(n.length !== 1 || n[0].incompressible); ) s = n[0], e.push(s.element); return { element: { elements: e, incompressible: t }, - children: nt.map(nt.concat(n, i), kL), + children: nt.map(nt.concat(n, i), OX), collapsible: s.collapsible, collapsed: s.collapsed }; } -function aD(s, e = 0) { +function RM(s, e = 0) { let t; - return e < s.element.elements.length - 1 ? t = [aD(s, e + 1)] : t = nt.map(nt.from(s.children), (i) => aD(i, 0)), e === 0 && s.element.incompressible ? { + return e < s.element.elements.length - 1 ? t = [RM(s, e + 1)] : t = nt.map(nt.from(s.children), (i) => RM(i, 0)), e === 0 && s.element.incompressible ? { element: s.element.elements[e], children: t, incompressible: !0, @@ -67563,18 +67563,18 @@ function aD(s, e = 0) { collapsed: s.collapsed }; } -function f3(s) { - return aD(s, 0); +function FA(s) { + return RM(s, 0); } -function zQ(s, e, t) { - return s.element === e ? { ...s, children: t } : { ...s, children: nt.map(nt.from(s.children), (i) => zQ(i, e, t)) }; +function L4(s, e, t) { + return s.element === e ? { ...s, children: t } : { ...s, children: nt.map(nt.from(s.children), (i) => L4(i, e, t)) }; } -const Tbe = (s) => ({ +const L0e = (s) => ({ getId(e) { return e.elements.map((t) => s.getId(t).toString()).join("\0"); } }); -class Dbe { +class I0e { get onDidSplice() { return this.model.onDidSplice; } @@ -67585,27 +67585,27 @@ class Dbe { return this.model.onDidChangeRenderNodeCount; } constructor(e, t, i = {}) { - this.user = e, this.rootRef = null, this.nodes = /* @__PURE__ */ new Map(), this.model = new m5(e, t, i), this.enabled = typeof i.compressionEnabled > "u" ? !0 : i.compressionEnabled, this.identityProvider = i.identityProvider; + this.user = e, this.rootRef = null, this.nodes = /* @__PURE__ */ new Map(), this.model = new EH(e, t, i), this.enabled = typeof i.compressionEnabled > "u" ? !0 : i.compressionEnabled, this.identityProvider = i.identityProvider; } setChildren(e, t = nt.empty(), i) { - const n = i.diffIdentityProvider && Tbe(i.diffIdentityProvider); + const n = i.diffIdentityProvider && L0e(i.diffIdentityProvider); if (e === null) { - const m = nt.map(t, this.enabled ? kL : VL); - this._setChildren(null, m, { diffIdentityProvider: n, diffDepth: 1 / 0 }); + const b = nt.map(t, this.enabled ? OX : QX); + this._setChildren(null, b, { diffIdentityProvider: n, diffDepth: 1 / 0 }); return; } const o = this.nodes.get(e); if (!o) - throw new Go(this.user, "Unknown compressed tree node"); - const r = this.model.getNode(o), l = this.model.getParentNodeLocation(o), a = this.model.getNode(l), c = f3(r), d = zQ(c, e, t), h = (this.enabled ? kL : VL)(d), u = i.diffIdentityProvider ? (m, f) => i.diffIdentityProvider.getId(m) === i.diffIdentityProvider.getId(f) : void 0; - if (ei(h.element.elements, r.element.elements, u)) { + throw new Ho(this.user, "Unknown compressed tree node"); + const l = this.model.getNode(o), r = this.model.getParentNodeLocation(o), c = this.model.getNode(r), d = FA(l), a = L4(d, e, t), h = (this.enabled ? OX : QX)(a), u = i.diffIdentityProvider ? (b, g) => i.diffIdentityProvider.getId(b) === i.diffIdentityProvider.getId(g) : void 0; + if (ti(h.element.elements, l.element.elements, u)) { this._setChildren(o, h.children || nt.empty(), { diffIdentityProvider: n, diffDepth: 1 }); return; } - const g = a.children.map((m) => m === r ? h : m); - this._setChildren(a.element, g, { + const m = c.children.map((b) => b === l ? h : b); + this._setChildren(c.element, m, { diffIdentityProvider: n, - diffDepth: r.depth - a.depth + diffDepth: l.depth - c.depth }); } isCompressionEnabled() { @@ -67615,21 +67615,21 @@ class Dbe { if (e === this.enabled) return; this.enabled = e; - const i = this.model.getNode().children, n = nt.map(i, f3), o = nt.map(n, e ? kL : VL); + const i = this.model.getNode().children, n = nt.map(i, FA), o = nt.map(n, e ? OX : QX); this._setChildren(null, o, { diffIdentityProvider: this.identityProvider, diffDepth: 1 / 0 }); } _setChildren(e, t, i) { - const n = /* @__PURE__ */ new Set(), o = (l) => { - for (const a of l.element.elements) - n.add(a), this.nodes.set(a, l.element); - }, r = (l) => { - for (const a of l.element.elements) - n.has(a) || this.nodes.delete(a); + const n = /* @__PURE__ */ new Set(), o = (r) => { + for (const c of r.element.elements) + n.add(c), this.nodes.set(c, r.element); + }, l = (r) => { + for (const c of r.element.elements) + n.has(c) || this.nodes.delete(c); }; - this.model.setChildren(e, t, { ...i, onDidCreateNode: o, onDidDeleteNode: r }); + this.model.setChildren(e, t, { ...i, onDidCreateNode: o, onDidDeleteNode: l }); } has(e) { return this.nodes.has(e); @@ -67694,17 +67694,17 @@ class Dbe { return null; const t = this.nodes.get(e); if (!t) - throw new Go(this.user, `Tree element not found: ${e}`); + throw new Ho(this.user, `Tree element not found: ${e}`); return t; } } -const Vbe = (s) => s[s.length - 1]; -class p5 { +const S0e = (s) => s[s.length - 1]; +class DH { get element() { return this.node.element === null ? null : this.unwrapper(this.node.element); } get children() { - return this.node.children.map((e) => new p5(this.unwrapper, e)); + return this.node.children.map((e) => new DH(this.unwrapper, e)); } get depth() { return this.node.depth; @@ -67731,7 +67731,7 @@ class p5 { this.unwrapper = e, this.node = t; } } -function kbe(s, e) { +function x0e(s, e) { return { splice(t, i, n) { e.splice(t, i, n.map((o) => s.map(o))); @@ -67741,7 +67741,7 @@ function kbe(s, e) { } }; } -function Gbe(s, e) { +function C0e(s, e) { return { ...e, identityProvider: e.identityProvider && { @@ -67761,7 +67761,7 @@ function Gbe(s, e) { } }; } -class Rbe { +class R0e { get onDidSplice() { return se.map(this.model.onDidSplice, ({ insertedNodes: e, deletedNodes: t }) => ({ insertedNodes: e.map((i) => this.nodeMapper.map(i)), @@ -67778,9 +67778,9 @@ class Rbe { return se.map(this.model.onDidChangeRenderNodeCount, (e) => this.nodeMapper.map(e)); } constructor(e, t, i = {}) { - this.rootRef = null, this.elementMapper = i.elementMapper || Vbe; + this.rootRef = null, this.elementMapper = i.elementMapper || S0e; const n = (o) => this.elementMapper(o.elements); - this.nodeMapper = new h5((o) => new p5(n, o)), this.model = new Dbe(e, kbe(this.nodeMapper, t), Gbe(n, i)); + this.nodeMapper = new vH((o) => new DH(n, o)), this.model = new I0e(e, x0e(this.nodeMapper, t), C0e(n, i)); } setChildren(e, t = nt.empty(), i = {}) { this.model.setChildren(e, t, i); @@ -67838,13 +67838,13 @@ class Rbe { return this.model.getNode(e); } } -var Ebe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var N0e = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; }; -class f5 extends YQ { +class FH extends V4 { get onDidChangeCollapseState() { return this.model.onDidChangeCollapseState; } @@ -67865,10 +67865,10 @@ class f5 extends YQ { return this.model.has(e); } createModel(e, t, i) { - return new m5(e, t, i); + return new EH(e, t, i); } } -class PQ { +class I4 { get compressedTreeNodeProvider() { return this._compressedTreeNodeProvider(); } @@ -67883,8 +67883,8 @@ class PQ { o || (o = this.compressedTreeNodeProvider.getCompressedTreeNode(e.element)), o.element.elements.length === 1 ? (i.compressedTreeNode = void 0, this.renderer.renderElement(e, t, i.data, n)) : (i.compressedTreeNode = o, this.renderer.renderCompressedElements(o, t, i.data, n)); } disposeElement(e, t, i, n) { - var o, r, l, a; - i.compressedTreeNode ? (r = (o = this.renderer).disposeCompressedElements) == null || r.call(o, i.compressedTreeNode, t, i.data, n) : (a = (l = this.renderer).disposeElement) == null || a.call(l, e, t, i.data, n); + var o, l, r, c; + i.compressedTreeNode ? (l = (o = this.renderer).disposeCompressedElements) == null || l.call(o, i.compressedTreeNode, t, i.data, n) : (c = (r = this.renderer).disposeElement) == null || c.call(r, e, t, i.data, n); } disposeTemplate(e) { this.renderer.disposeTemplate(e.data); @@ -67893,10 +67893,10 @@ class PQ { return this.renderer.renderTwistie ? this.renderer.renderTwistie(e, t) : !1; } } -Ebe([ - Zi -], PQ.prototype, "compressedTreeNodeProvider", null); -class Xbe { +N0e([ + xi +], I4.prototype, "compressedTreeNodeProvider", null); +class w0e { constructor(e) { this.modelProvider = e, this.compressedStickyNodes = /* @__PURE__ */ new Map(); } @@ -67907,10 +67907,10 @@ class Xbe { if (this.compressedStickyNodes.clear(), e.length === 0) return []; for (let n = 0; n < e.length; n++) { - const o = e[n], r = o.position + o.height; - if (n + 1 < e.length && r + e[n + 1].height > i || n >= t - 1 && t < e.length) { - const a = e.slice(0, n), c = e.slice(n), d = this.compressStickyNodes(c); - return [...a, d]; + const o = e[n], l = o.position + o.height; + if (n + 1 < e.length && l + e[n + 1].height > i || n >= t - 1 && t < e.length) { + const c = e.slice(0, n), d = e.slice(n), a = this.compressStickyNodes(d); + return [...c, a]; } } return e; @@ -67922,27 +67922,27 @@ class Xbe { if (!t.isCompressionEnabled()) return e[0]; const i = []; - for (let c = 0; c < e.length; c++) { - const d = e[c], h = t.getCompressedTreeNode(d.node.element); + for (let d = 0; d < e.length; d++) { + const a = e[d], h = t.getCompressedTreeNode(a.node.element); if (h.element) { - if (c !== 0 && h.element.incompressible) + if (d !== 0 && h.element.incompressible) break; i.push(...h.element.elements); } } if (i.length < 2) return e[0]; - const n = e[e.length - 1], o = { elements: i, incompressible: !1 }, r = { ...n.node, children: [], element: o }, l = new Proxy(e[0].node, {}), a = { - node: l, + const n = e[e.length - 1], o = { elements: i, incompressible: !1 }, l = { ...n.node, children: [], element: o }, r = new Proxy(e[0].node, {}), c = { + node: r, startIndex: e[0].startIndex, endIndex: n.endIndex, position: e[0].position, height: e[0].height }; - return this.compressedStickyNodes.set(l, r), a; + return this.compressedStickyNodes.set(r, l), c; } } -function Fbe(s, e) { +function T0e(s, e) { return e && { ...e, keyboardNavigationLabelProvider: e.keyboardNavigationLabelProvider && { @@ -67958,16 +67958,16 @@ function Fbe(s, e) { } }; } -class BQ extends f5 { +class S4 extends FH { constructor(e, t, i, n, o = {}) { - const r = () => this, l = new Xbe(() => this.model), a = n.map((c) => new PQ(r, l, c)); - super(e, t, i, a, { ...Fbe(r, o), stickyScrollDelegate: l }); + const l = () => this, r = new w0e(() => this.model), c = n.map((d) => new I4(l, r, d)); + super(e, t, i, c, { ...T0e(l, o), stickyScrollDelegate: r }); } setChildren(e, t = nt.empty(), i) { this.model.setChildren(e, t, i); } createModel(e, t, i) { - return new Rbe(e, t, i); + return new R0e(e, t, i); } updateOptions(e = {}) { super.updateOptions(e), typeof e.compressionEnabled < "u" && this.model.setCompressionEnabled(e.compressionEnabled); @@ -67976,7 +67976,7 @@ class BQ extends f5 { return this.model.getCompressedTreeNode(e); } } -function WW(s) { +function PR(s) { return { ...s, children: [], @@ -67986,18 +67986,18 @@ function WW(s) { forceExpanded: !1 }; } -function cD(s, e) { - return e.parent ? e.parent === s ? !0 : cD(s, e.parent) : !1; +function NM(s, e) { + return e.parent ? e.parent === s ? !0 : NM(s, e.parent) : !1; } -function Ybe(s, e) { - return s === e || cD(s, e) || cD(e, s); +function M0e(s, e) { + return s === e || NM(s, e) || NM(e, s); } -class b5 { +class zH { get element() { return this.node.element.element; } get children() { - return this.node.children.map((e) => new b5(e)); + return this.node.children.map((e) => new zH(e)); } get depth() { return this.node.depth; @@ -68024,7 +68024,7 @@ class b5 { this.node = e; } } -class zbe { +class Y0e { constructor(e, t, i) { this.renderer = e, this.nodeMapper = t, this.onDidChangeTwistieState = i, this.renderedNodes = /* @__PURE__ */ new Map(), this.templateId = e.templateId; } @@ -68035,11 +68035,11 @@ class zbe { this.renderer.renderElement(this.nodeMapper.map(e), t, i.templateData, n); } renderTwistie(e, t) { - return e.slow ? (t.classList.add(...Ze.asClassNameArray(te.treeItemLoading)), !0) : (t.classList.remove(...Ze.asClassNameArray(te.treeItemLoading)), !1); + return e.slow ? (t.classList.add(...Se.asClassNameArray(te.treeItemLoading)), !0) : (t.classList.remove(...Se.asClassNameArray(te.treeItemLoading)), !1); } disposeElement(e, t, i, n) { - var o, r; - (r = (o = this.renderer).disposeElement) == null || r.call(o, this.nodeMapper.map(e), t, i.templateData, n); + var o, l; + (l = (o = this.renderer).disposeElement) == null || l.call(o, this.nodeMapper.map(e), t, i.templateData, n); } disposeTemplate(e) { this.renderer.disposeTemplate(e.templateData); @@ -68048,28 +68048,28 @@ class zbe { this.renderedNodes.clear(); } } -function b3(s) { +function zA(s) { return { browserEvent: s.browserEvent, elements: s.elements.map((e) => e.element) }; } -function y3(s) { +function AA(s) { return { browserEvent: s.browserEvent, element: s.element && s.element.element, target: s.target }; } -class Pbe extends IC { +class k0e extends FG { constructor(e) { super(e.elements.map((t) => t.element)), this.data = e; } } -function vW(s) { - return s instanceof IC ? new Pbe(s) : s; +function BR(s) { + return s instanceof FG ? new k0e(s) : s; } -class Bbe { +class v0e { constructor(e) { this.dnd = e; } @@ -68082,13 +68082,13 @@ class Bbe { } onDragStart(e, t) { var i, n; - (n = (i = this.dnd).onDragStart) == null || n.call(i, vW(e), t); + (n = (i = this.dnd).onDragStart) == null || n.call(i, BR(e), t); } - onDragOver(e, t, i, n, o, r = !0) { - return this.dnd.onDragOver(vW(e), t && t.element, i, n, o); + onDragOver(e, t, i, n, o, l = !0) { + return this.dnd.onDragOver(BR(e), t && t.element, i, n, o); } drop(e, t, i, n, o) { - this.dnd.drop(vW(e), t && t.element, i, n, o); + this.dnd.drop(BR(e), t && t.element, i, n, o); } onDragEnd(e) { var t, i; @@ -68098,7 +68098,7 @@ class Bbe { this.dnd.dispose(); } } -function OQ(s) { +function x4(s) { return s && { ...s, collapseByDefault: !0, @@ -68107,7 +68107,7 @@ function OQ(s) { return s.identityProvider.getId(e.element); } }, - dnd: s.dnd && new Bbe(s.dnd), + dnd: s.dnd && new v0e(s.dnd), multipleSelectionController: s.multipleSelectionController && { isSelectionSingleChangeEvent(e) { return s.multipleSelectionController.isSelectionSingleChangeEvent({ ...e, element: e.element }); @@ -68151,24 +68151,24 @@ function OQ(s) { defaultFindVisibility: (e) => e.hasChildren && e.stale ? 1 : typeof s.defaultFindVisibility == "number" ? s.defaultFindVisibility : typeof s.defaultFindVisibility > "u" ? 2 : s.defaultFindVisibility(e.element) }; } -function dD(s, e) { - e(s), s.children.forEach((t) => dD(t, e)); +function wM(s, e) { + e(s), s.children.forEach((t) => wM(t, e)); } -class HQ { +class C4 { get onDidScroll() { return this.tree.onDidScroll; } get onDidChangeFocus() { - return se.map(this.tree.onDidChangeFocus, b3); + return se.map(this.tree.onDidChangeFocus, zA); } get onDidChangeSelection() { - return se.map(this.tree.onDidChangeSelection, b3); + return se.map(this.tree.onDidChangeSelection, zA); } get onMouseDblClick() { - return se.map(this.tree.onMouseDblClick, y3); + return se.map(this.tree.onMouseDblClick, AA); } get onPointer() { - return se.map(this.tree.onPointer, y3); + return se.map(this.tree.onPointer, AA); } get onDidFocus() { return this.tree.onDidFocus; @@ -68192,8 +68192,8 @@ class HQ { get onDidDispose() { return this.tree.onDidDispose; } - constructor(e, t, i, n, o, r = {}) { - this.user = e, this.dataSource = o, this.nodes = /* @__PURE__ */ new Map(), this.subTreeRefreshPromises = /* @__PURE__ */ new Map(), this.refreshPromises = /* @__PURE__ */ new Map(), this._onDidRender = new k(), this._onDidChangeNodeSlowState = new k(), this.nodeMapper = new h5((l) => new b5(l)), this.disposables = new U(), this.identityProvider = r.identityProvider, this.autoExpandSingleChildren = typeof r.autoExpandSingleChildren > "u" ? !1 : r.autoExpandSingleChildren, this.sorter = r.sorter, this.getDefaultCollapseState = (l) => r.collapseByDefault ? r.collapseByDefault(l) ? Io.PreserveOrCollapsed : Io.PreserveOrExpanded : void 0, this.tree = this.createTree(e, t, i, n, r), this.onDidChangeFindMode = this.tree.onDidChangeFindMode, this.onDidChangeFindMatchType = this.tree.onDidChangeFindMatchType, this.root = WW({ + constructor(e, t, i, n, o, l = {}) { + this.user = e, this.dataSource = o, this.nodes = /* @__PURE__ */ new Map(), this.subTreeRefreshPromises = /* @__PURE__ */ new Map(), this.refreshPromises = /* @__PURE__ */ new Map(), this._onDidRender = new k(), this._onDidChangeNodeSlowState = new k(), this.nodeMapper = new vH((r) => new zH(r)), this.disposables = new _(), this.identityProvider = l.identityProvider, this.autoExpandSingleChildren = typeof l.autoExpandSingleChildren > "u" ? !1 : l.autoExpandSingleChildren, this.sorter = l.sorter, this.getDefaultCollapseState = (r) => l.collapseByDefault ? l.collapseByDefault(r) ? No.PreserveOrCollapsed : No.PreserveOrExpanded : void 0, this.tree = this.createTree(e, t, i, n, l), this.onDidChangeFindMode = this.tree.onDidChangeFindMode, this.onDidChangeFindMatchType = this.tree.onDidChangeFindMatchType, this.root = PR({ element: void 0, parent: null, hasChildren: !0, @@ -68204,8 +68204,8 @@ class HQ { }), this.nodes.set(null, this.root), this.tree.onDidChangeCollapseState(this._onDidChangeCollapseState, this, this.disposables); } createTree(e, t, i, n, o) { - const r = new g5(i), l = n.map((c) => new zbe(c, this.nodeMapper, this._onDidChangeNodeSlowState.event)), a = OQ(o) || {}; - return new f5(e, t, r, l, a); + const l = new HH(i), r = n.map((d) => new Y0e(d, this.nodeMapper, this._onDidChangeNodeSlowState.event)), c = x4(o) || {}; + return new FH(e, t, l, r, c); } updateOptions(e = {}) { this.tree.updateOptions(e); @@ -68246,12 +68246,12 @@ class HQ { } async _updateChildren(e = this.root.element, t = !0, i = !1, n, o) { if (typeof this.root.element > "u") - throw new Go(this.user, "Tree input not set"); + throw new Ho(this.user, "Tree input not set"); this.root.refreshPromise && (await this.root.refreshPromise, await se.toPromise(this._onDidRender.event)); - const r = this.getDataNode(e); - if (await this.refreshAndRenderNode(r, t, n, o), i) + const l = this.getDataNode(e); + if (await this.refreshAndRenderNode(l, t, n, o), i) try { - this.tree.rerender(r); + this.tree.rerender(l); } catch { } } @@ -68275,7 +68275,7 @@ class HQ { } async expand(e, t = !1) { if (typeof this.root.element > "u") - throw new Go(this.user, "Tree input not set"); + throw new Ho(this.user, "Tree input not set"); this.root.refreshPromise && (await this.root.refreshPromise, await se.toPromise(this._onDidRender.event)); const i = this.getDataNode(e); if (this.tree.hasElement(i) && !this.tree.isCollapsible(i) || (i.refreshPromise && (await this.root.refreshPromise, await se.toPromise(this._onDidRender.event)), i !== this.root && !i.refreshPromise && !this.tree.isCollapsed(i))) @@ -68313,7 +68313,7 @@ class HQ { getDataNode(e) { const t = this.nodes.get(e === this.root.element ? null : e); if (!t) - throw new Go(this.user, `Data tree node not found: ${e}`); + throw new Ho(this.user, `Data tree node not found: ${e}`); return t; } async refreshAndRenderNode(e, t, i, n) { @@ -68321,8 +68321,8 @@ class HQ { } async refreshNode(e, t, i) { let n; - if (this.subTreeRefreshPromises.forEach((o, r) => { - !n && Ybe(r, e) && (n = o.then(() => this.refreshNode(e, t, i))); + if (this.subTreeRefreshPromises.forEach((o, l) => { + !n && M0e(l, e) && (n = o.then(() => this.refreshNode(e, t, i))); }), n) return n; if (e !== this.root && this.tree.getNode(e).collapsed) { @@ -68338,7 +68338,7 @@ class HQ { }); try { const o = await this.doRefreshNode(e, t, i); - e.stale = !1, await S2.settled(o.map((r) => this.doRefreshSubTree(r, t, i))); + e.stale = !1, await zN.settled(o.map((l) => this.doRefreshSubTree(l, t, i))); } finally { n(); } @@ -68350,20 +68350,20 @@ class HQ { n = Promise.resolve(nt.empty()); else { const o = this.doGetChildren(e); - if (V9(o)) + if (oD(o)) n = Promise.resolve(o); else { - const r = Zh(800); - r.then(() => { + const l = Nh(800); + l.then(() => { e.slow = !0, this._onDidChangeNodeSlowState.fire(e); - }, (l) => null), n = o.finally(() => r.cancel()); + }, (r) => null), n = o.finally(() => l.cancel()); } } try { const o = await n; return this.setChildren(e, o, t, i); } catch (o) { - if (e !== this.root && this.tree.hasElement(e) && this.tree.collapse(e), jr(o)) + if (e !== this.root && this.tree.hasElement(e) && this.tree.collapse(e), er(o)) return []; throw o; } finally { @@ -68375,46 +68375,46 @@ class HQ { if (t) return t; const i = this.dataSource.getChildren(e.element); - return V9(i) ? this.processChildren(i) : (t = Ui(async () => this.processChildren(await i)), this.refreshPromises.set(e, t), t.finally(() => { + return oD(i) ? this.processChildren(i) : (t = Qi(async () => this.processChildren(await i)), this.refreshPromises.set(e, t), t.finally(() => { this.refreshPromises.delete(e); })); } _onDidChangeCollapseState({ node: e, deep: t }) { - e.element !== null && !e.collapsed && e.element.stale && (t ? this.collapse(e.element.element) : this.refreshAndRenderNode(e.element, !1).catch(De)); + e.element !== null && !e.collapsed && e.element.stale && (t ? this.collapse(e.element.element) : this.refreshAndRenderNode(e.element, !1).catch(Me)); } setChildren(e, t, i, n) { const o = [...t]; if (e.children.length === 0 && o.length === 0) return []; - const r = /* @__PURE__ */ new Map(), l = /* @__PURE__ */ new Map(); - for (const d of e.children) - r.set(d.element, d), this.identityProvider && l.set(d.id, { node: d, collapsed: this.tree.hasElement(d) && this.tree.isCollapsed(d) }); - const a = [], c = o.map((d) => { - const h = !!this.dataSource.hasChildren(d); + const l = /* @__PURE__ */ new Map(), r = /* @__PURE__ */ new Map(); + for (const a of e.children) + l.set(a.element, a), this.identityProvider && r.set(a.id, { node: a, collapsed: this.tree.hasElement(a) && this.tree.isCollapsed(a) }); + const c = [], d = o.map((a) => { + const h = !!this.dataSource.hasChildren(a); if (!this.identityProvider) { - const f = WW({ element: d, parent: e, hasChildren: h, defaultCollapseState: this.getDefaultCollapseState(d) }); - return h && f.defaultCollapseState === Io.PreserveOrExpanded && a.push(f), f; + const g = PR({ element: a, parent: e, hasChildren: h, defaultCollapseState: this.getDefaultCollapseState(a) }); + return h && g.defaultCollapseState === No.PreserveOrExpanded && c.push(g), g; } - const u = this.identityProvider.getId(d).toString(), g = l.get(u); - if (g) { - const f = g.node; - return r.delete(f.element), this.nodes.delete(f.element), this.nodes.set(d, f), f.element = d, f.hasChildren = h, i ? g.collapsed ? (f.children.forEach((b) => dD(b, (y) => this.nodes.delete(y.element))), f.children.splice(0, f.children.length), f.stale = !0) : a.push(f) : h && !g.collapsed && a.push(f), f; + const u = this.identityProvider.getId(a).toString(), m = r.get(u); + if (m) { + const g = m.node; + return l.delete(g.element), this.nodes.delete(g.element), this.nodes.set(a, g), g.element = a, g.hasChildren = h, i ? m.collapsed ? (g.children.forEach((Z) => wM(Z, (f) => this.nodes.delete(f.element))), g.children.splice(0, g.children.length), g.stale = !0) : c.push(g) : h && !m.collapsed && c.push(g), g; } - const m = WW({ element: d, parent: e, id: u, hasChildren: h, defaultCollapseState: this.getDefaultCollapseState(d) }); - return n && n.viewState.focus && n.viewState.focus.indexOf(u) > -1 && n.focus.push(m), n && n.viewState.selection && n.viewState.selection.indexOf(u) > -1 && n.selection.push(m), (n && n.viewState.expanded && n.viewState.expanded.indexOf(u) > -1 || h && m.defaultCollapseState === Io.PreserveOrExpanded) && a.push(m), m; + const b = PR({ element: a, parent: e, id: u, hasChildren: h, defaultCollapseState: this.getDefaultCollapseState(a) }); + return n && n.viewState.focus && n.viewState.focus.indexOf(u) > -1 && n.focus.push(b), n && n.viewState.selection && n.viewState.selection.indexOf(u) > -1 && n.selection.push(b), (n && n.viewState.expanded && n.viewState.expanded.indexOf(u) > -1 || h && b.defaultCollapseState === No.PreserveOrExpanded) && c.push(b), b; }); - for (const d of r.values()) - dD(d, (h) => this.nodes.delete(h.element)); - for (const d of c) - this.nodes.set(d.element, d); - return e.children.splice(0, e.children.length, ...c), e !== this.root && this.autoExpandSingleChildren && c.length === 1 && a.length === 0 && (c[0].forceExpanded = !0, a.push(c[0])), a; + for (const a of l.values()) + wM(a, (h) => this.nodes.delete(h.element)); + for (const a of d) + this.nodes.set(a.element, a); + return e.children.splice(0, e.children.length, ...d), e !== this.root && this.autoExpandSingleChildren && d.length === 1 && c.length === 0 && (d[0].forceExpanded = !0, c.push(d[0])), c; } render(e, t, i) { - const n = e.children.map((r) => this.asTreeElement(r, t)), o = i && { + const n = e.children.map((l) => this.asTreeElement(l, t)), o = i && { ...i, diffIdentityProvider: i.diffIdentityProvider && { - getId(r) { - return i.diffIdentityProvider.getId(r.element); + getId(l) { + return i.diffIdentityProvider.getId(l.element); } } }; @@ -68442,7 +68442,7 @@ class HQ { this.disposables.dispose(), this.tree.dispose(); } } -class y5 { +class AH { get element() { return { elements: this.node.element.elements.map((e) => e.element), @@ -68450,7 +68450,7 @@ class y5 { }; } get children() { - return this.node.children.map((e) => new y5(e)); + return this.node.children.map((e) => new AH(e)); } get depth() { return this.node.depth; @@ -68477,7 +68477,7 @@ class y5 { this.node = e; } } -class Obe { +class J0e { constructor(e, t, i, n) { this.renderer = e, this.nodeMapper = t, this.compressibleNodeMapperProvider = i, this.onDidChangeTwistieState = n, this.renderedNodes = /* @__PURE__ */ new Map(), this.disposables = [], this.templateId = e.templateId; } @@ -68491,25 +68491,25 @@ class Obe { this.renderer.renderCompressedElements(this.compressibleNodeMapperProvider().map(e), t, i.templateData, n); } renderTwistie(e, t) { - return e.slow ? (t.classList.add(...Ze.asClassNameArray(te.treeItemLoading)), !0) : (t.classList.remove(...Ze.asClassNameArray(te.treeItemLoading)), !1); + return e.slow ? (t.classList.add(...Se.asClassNameArray(te.treeItemLoading)), !0) : (t.classList.remove(...Se.asClassNameArray(te.treeItemLoading)), !1); } disposeElement(e, t, i, n) { - var o, r; - (r = (o = this.renderer).disposeElement) == null || r.call(o, this.nodeMapper.map(e), t, i.templateData, n); + var o, l; + (l = (o = this.renderer).disposeElement) == null || l.call(o, this.nodeMapper.map(e), t, i.templateData, n); } disposeCompressedElements(e, t, i, n) { - var o, r; - (r = (o = this.renderer).disposeCompressedElements) == null || r.call(o, this.compressibleNodeMapperProvider().map(e), t, i.templateData, n); + var o, l; + (l = (o = this.renderer).disposeCompressedElements) == null || l.call(o, this.compressibleNodeMapperProvider().map(e), t, i.templateData, n); } disposeTemplate(e) { this.renderer.disposeTemplate(e.templateData); } dispose() { - this.renderedNodes.clear(), this.disposables = Wt(this.disposables); + this.renderedNodes.clear(), this.disposables = Nt(this.disposables); } } -function Hbe(s) { - const e = s && OQ(s); +function H0e(s) { + const e = s && x4(s); return e && { ...e, keyboardNavigationLabelProvider: e.keyboardNavigationLabelProvider && { @@ -68520,13 +68520,13 @@ function Hbe(s) { } }; } -class Jbe extends HQ { - constructor(e, t, i, n, o, r, l = {}) { - super(e, t, i, o, r, l), this.compressionDelegate = n, this.compressibleNodeMapper = new h5((a) => new y5(a)), this.filter = l.filter; +class E0e extends C4 { + constructor(e, t, i, n, o, l, r = {}) { + super(e, t, i, o, l, r), this.compressionDelegate = n, this.compressibleNodeMapper = new vH((c) => new AH(c)), this.filter = r.filter; } createTree(e, t, i, n, o) { - const r = new g5(i), l = n.map((c) => new Obe(c, this.nodeMapper, () => this.compressibleNodeMapper, this._onDidChangeNodeSlowState.event)), a = Hbe(o) || {}; - return new BQ(e, t, r, l, a); + const l = new HH(i), r = n.map((d) => new J0e(d, this.nodeMapper, () => this.compressibleNodeMapper, this._onDidChangeNodeSlowState.event)), c = H0e(o) || {}; + return new S4(e, t, l, r, c); } asTreeElement(e, t) { return { @@ -68540,31 +68540,31 @@ class Jbe extends HQ { render(e, t, i) { if (!this.identityProvider) return super.render(e, t); - const n = (g) => this.identityProvider.getId(g).toString(), o = (g) => { - const m = /* @__PURE__ */ new Set(); - for (const f of g) { - const b = this.tree.getCompressedTreeNode(f === this.root ? null : f); - if (b.element) - for (const y of b.element.elements) - m.add(n(y.element)); - } - return m; - }, r = o(this.tree.getSelection()), l = o(this.tree.getFocus()); + const n = (m) => this.identityProvider.getId(m).toString(), o = (m) => { + const b = /* @__PURE__ */ new Set(); + for (const g of m) { + const Z = this.tree.getCompressedTreeNode(g === this.root ? null : g); + if (Z.element) + for (const f of Z.element.elements) + b.add(n(f.element)); + } + return b; + }, l = o(this.tree.getSelection()), r = o(this.tree.getFocus()); super.render(e, t, i); - const a = this.getSelection(); - let c = !1; - const d = this.getFocus(); + const c = this.getSelection(); + let d = !1; + const a = this.getFocus(); let h = !1; - const u = (g) => { - const m = g.element; - if (m) - for (let f = 0; f < m.elements.length; f++) { - const b = n(m.elements[f].element), y = m.elements[m.elements.length - 1].element; - r.has(b) && a.indexOf(y) === -1 && (a.push(y), c = !0), l.has(b) && d.indexOf(y) === -1 && (d.push(y), h = !0); + const u = (m) => { + const b = m.element; + if (b) + for (let g = 0; g < b.elements.length; g++) { + const Z = n(b.elements[g].element), f = b.elements[b.elements.length - 1].element; + l.has(Z) && c.indexOf(f) === -1 && (c.push(f), d = !0), r.has(Z) && a.indexOf(f) === -1 && (a.push(f), h = !0); } - g.children.forEach(u); + m.children.forEach(u); }; - u(this.tree.getCompressedTreeNode(e === this.root ? null : e)), c && this.setSelection(a), h && this.setFocus(d); + u(this.tree.getCompressedTreeNode(e === this.root ? null : e)), d && this.setSelection(c), h && this.setFocus(a); } // For compressed async data trees, `TreeVisibility.Recurse` doesn't currently work // and we have to filter everything beforehand @@ -68575,60 +68575,60 @@ class Jbe extends HQ { t, 1 /* TreeVisibility.Visible */ - ), n = Ube(i); + ), n = D0e(i); if (n === 2) throw new Error("Recursive tree visibility not supported in async data compressed trees"); return n === 1; })), super.processChildren(e); } } -function Ube(s) { - return typeof s == "boolean" ? s ? 1 : 0 : u5(s) ? D1(s.visibility) : D1(s); +function D0e(s) { + return typeof s == "boolean" ? s ? 1 : 0 : JH(s) ? UW(s.visibility) : UW(s); } -class Kbe extends YQ { - constructor(e, t, i, n, o, r = {}) { - super(e, t, i, n, r), this.user = e, this.dataSource = o, this.identityProvider = r.identityProvider; +class F0e extends V4 { + constructor(e, t, i, n, o, l = {}) { + super(e, t, i, n, l), this.user = e, this.dataSource = o, this.identityProvider = l.identityProvider; } createModel(e, t, i) { - return new m5(e, t, i); - } -} -new ae("isMac", qe, p("isMac", "Whether the operating system is macOS")); -new ae("isLinux", fs, p("isLinux", "Whether the operating system is Linux")); -const XI = new ae("isWindows", kn, p("isWindows", "Whether the operating system is Windows")), JQ = new ae("isWeb", Dm, p("isWeb", "Whether the platform is a web browser")); -new ae("isMacNative", qe && !Dm, p("isMacNative", "Whether the operating system is macOS on a non-browser platform")); -new ae("isIOS", Wa, p("isIOS", "Whether the operating system is iOS")); -new ae("isMobile", pH, p("isMobile", "Whether the platform is a mobile web browser")); -new ae("isDevelopment", !1, !0); -new ae("productQualityType", "", p("productQualityType", "Quality type of VS Code")); -const UQ = "inputFocus", KQ = new ae(UQ, !1, p("inputFocus", "Whether keyboard focus is inside an input box")); -var ad = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; + return new EH(e, t, i); + } +} +new ce("isMac", qe, p("isMac", "Whether the operating system is macOS")); +new ce("isLinux", fs, p("isLinux", "Whether the operating system is Linux")); +const eC = new ce("isWindows", Jn, p("isWindows", "Whether the operating system is Windows")), R4 = new ce("isWeb", Hb, p("isWeb", "Whether the platform is a web browser")); +new ce("isMacNative", qe && !Hb, p("isMacNative", "Whether the operating system is macOS on a non-browser platform")); +new ce("isIOS", Yc, p("isIOS", "Whether the operating system is iOS")); +new ce("isMobile", jP, p("isMobile", "Whether the platform is a mobile web browser")); +new ce("isDevelopment", !1, !0); +new ce("productQualityType", "", p("productQualityType", "Quality type of VS Code")); +const N4 = "inputFocus", w4 = new ce(N4, !1, p("inputFocus", "Whether keyboard focus is inside an input box")); +var ua = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; }, zt = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const Ar = $e("listService"); -class Qbe { +const Sl = $e("listService"); +class z0e { get lastFocusedList() { return this._lastFocusedWidget; } constructor() { - this.disposables = new U(), this.lists = [], this._lastFocusedWidget = void 0, this._hasCreatedStyleController = !1; + this.disposables = new _(), this.lists = [], this._lastFocusedWidget = void 0, this._hasCreatedStyleController = !1; } setLastFocusedList(e) { var t, i; e !== this._lastFocusedWidget && ((t = this._lastFocusedWidget) == null || t.getHTMLElement().classList.remove("last-focused"), this._lastFocusedWidget = e, (i = this._lastFocusedWidget) == null || i.getHTMLElement().classList.add("last-focused")); } register(e, t) { - if (this._hasCreatedStyleController || (this._hasCreatedStyleController = !0, new KK(Bo(), "").style(Ym)), this.lists.some((n) => n.widget === e)) + if (this._hasCreatedStyleController || (this._hasCreatedStyleController = !0, new wO(Po(), "").style(Pb)), this.lists.some((n) => n.widget === e)) throw new Error("Cannot register the same widget multiple times"); const i = { widget: e, extraContextKeys: t }; - return this.lists.push(i), k_(e.getHTMLElement()) && this.setLastFocusedList(e), Yr(e.onDidFocus(() => this.setLastFocusedList(e)), Ce(() => this.lists.splice(this.lists.indexOf(i), 1)), e.onDidDispose(() => { + return this.lists.push(i), OS(e.getHTMLElement()) && this.setLastFocusedList(e), Kl(e.onDidFocus(() => this.setLastFocusedList(e)), We(() => this.lists.splice(this.lists.indexOf(i), 1)), e.onDidDispose(() => { this.lists = this.lists.filter((n) => n !== i), this._lastFocusedWidget === e && this.setLastFocusedList(void 0); })); } @@ -68636,220 +68636,220 @@ class Qbe { this.disposables.dispose(); } } -const V1 = new ae("listScrollAtBoundary", "none"); -H.or(V1.isEqualTo("top"), V1.isEqualTo("both")); -H.or(V1.isEqualTo("bottom"), V1.isEqualTo("both")); -const QQ = new ae("listFocus", !0), jQ = new ae("treestickyScrollFocused", !1), FI = new ae("listSupportsMultiselect", !0), qQ = H.and(QQ, H.not(UQ), jQ.negate()), w5 = new ae("listHasSelectionOrFocus", !1), C5 = new ae("listDoubleSelection", !1), S5 = new ae("listMultiSelection", !1), YI = new ae("listSelectionNavigation", !1), jbe = new ae("listSupportsFind", !0), L5 = new ae("treeElementCanCollapse", !1), qbe = new ae("treeElementHasParent", !1), A5 = new ae("treeElementCanExpand", !1), $be = new ae("treeElementHasChild", !1), e0e = new ae("treeFindOpen", !1), $Q = "listTypeNavigationMode", ej = "listAutomaticKeyboardNavigation"; -function zI(s, e) { +const PW = new ce("listScrollAtBoundary", "none"); +P.or(PW.isEqualTo("top"), PW.isEqualTo("both")); +P.or(PW.isEqualTo("bottom"), PW.isEqualTo("both")); +const T4 = new ce("listFocus", !0), M4 = new ce("treestickyScrollFocused", !1), tC = new ce("listSupportsMultiselect", !0), Y4 = P.and(T4, P.not(N4), M4.negate()), KH = new ce("listHasSelectionOrFocus", !1), UH = new ce("listDoubleSelection", !1), PH = new ce("listMultiSelection", !1), iC = new ce("listSelectionNavigation", !1), A0e = new ce("listSupportsFind", !0), BH = new ce("treeElementCanCollapse", !1), K0e = new ce("treeElementHasParent", !1), _H = new ce("treeElementCanExpand", !1), U0e = new ce("treeElementHasChild", !1), P0e = new ce("treeFindOpen", !1), k4 = "listTypeNavigationMode", v4 = "listAutomaticKeyboardNavigation"; +function nC(s, e) { const t = s.createScoped(e.getHTMLElement()); - return QQ.bindTo(t), t; + return T4.bindTo(t), t; } -function PI(s, e) { - const t = V1.bindTo(s), i = () => { +function sC(s, e) { + const t = PW.bindTo(s), i = () => { const n = e.scrollTop === 0, o = e.scrollHeight - e.renderHeight - e.scrollTop < 1; n && o ? t.set("both") : n ? t.set("top") : o ? t.set("bottom") : t.set("none"); }; return i(), e.onDidScroll(i); } -const Hm = "workbench.list.multiSelectModifier", GL = "workbench.list.openMode", mr = "workbench.list.horizontalScrolling", x5 = "workbench.list.defaultFindMode", M5 = "workbench.list.typeNavigationMode", Dx = "workbench.list.keyboardNavigation", kl = "workbench.list.scrollByPage", Z5 = "workbench.list.defaultFindMatchType", k1 = "workbench.tree.indent", Vx = "workbench.tree.renderIndentGuides", Gl = "workbench.list.smoothScrolling", Ga = "workbench.list.mouseWheelScrollSensitivity", Ra = "workbench.list.fastScrollSensitivity", kx = "workbench.tree.expandMode", Gx = "workbench.tree.enableStickyScroll", Rx = "workbench.tree.stickyScrollMaxItemCount"; -function Ea(s) { - return s.getValue(Hm) === "alt"; +const jb = "workbench.list.multiSelectModifier", jX = "workbench.list.openMode", Zl = "workbench.list.horizontalScrolling", QH = "workbench.list.defaultFindMode", OH = "workbench.list.typeNavigationMode", _L = "workbench.list.keyboardNavigation", Er = "workbench.list.scrollByPage", jH = "workbench.list.defaultFindMatchType", BW = "workbench.tree.indent", QL = "workbench.tree.renderIndentGuides", Dr = "workbench.list.smoothScrolling", Dc = "workbench.list.mouseWheelScrollSensitivity", Fc = "workbench.list.fastScrollSensitivity", OL = "workbench.tree.expandMode", jL = "workbench.tree.enableStickyScroll", qL = "workbench.tree.stickyScrollMaxItemCount"; +function zc(s) { + return s.getValue(jb) === "alt"; } -class t0e extends R { +class B0e extends J { constructor(e) { - super(), this.configurationService = e, this.useAltAsMultipleSelectionModifier = Ea(e), this.registerListeners(); + super(), this.configurationService = e, this.useAltAsMultipleSelectionModifier = zc(e), this.registerListeners(); } registerListeners() { this._register(this.configurationService.onDidChangeConfiguration((e) => { - e.affectsConfiguration(Hm) && (this.useAltAsMultipleSelectionModifier = Ea(this.configurationService)); + e.affectsConfiguration(jb) && (this.useAltAsMultipleSelectionModifier = zc(this.configurationService)); })); } isSelectionSingleChangeEvent(e) { - return this.useAltAsMultipleSelectionModifier ? e.browserEvent.altKey : HK(e); + return this.useAltAsMultipleSelectionModifier ? e.browserEvent.altKey : CO(e); } isSelectionRangeChangeEvent(e) { - return JK(e); + return RO(e); } } -function BI(s, e) { - const t = s.get(Ke), i = s.get(xt), n = new U(); +function oC(s, e) { + const t = s.get(Qe), i = s.get(Lt), n = new _(); return [{ ...e, - keyboardNavigationDelegate: { mightProducePrintableCharacter(r) { - return i.mightProducePrintableCharacter(r); + keyboardNavigationDelegate: { mightProducePrintableCharacter(l) { + return i.mightProducePrintableCharacter(l); } }, - smoothScrolling: !!t.getValue(Gl), - mouseWheelScrollSensitivity: t.getValue(Ga), - fastScrollSensitivity: t.getValue(Ra), - multipleSelectionController: e.multipleSelectionController ?? n.add(new t0e(t)), - keyboardNavigationEventFilter: s0e(i), - scrollByPage: !!t.getValue(kl) + smoothScrolling: !!t.getValue(Dr), + mouseWheelScrollSensitivity: t.getValue(Dc), + fastScrollSensitivity: t.getValue(Fc), + multipleSelectionController: e.multipleSelectionController ?? n.add(new B0e(t)), + keyboardNavigationEventFilter: O0e(i), + scrollByPage: !!t.getValue(Er) }, n]; } -let w3 = class extends Qo { - constructor(e, t, i, n, o, r, l, a, c) { - const d = typeof o.horizontalScrolling < "u" ? o.horizontalScrolling : !!a.getValue(mr), [h, u] = c.invokeFunction(BI, o); +let KA = class extends qo { + constructor(e, t, i, n, o, l, r, c, d) { + const a = typeof o.horizontalScrolling < "u" ? o.horizontalScrolling : !!c.getValue(Zl), [h, u] = d.invokeFunction(oC, o); super(e, t, i, n, { keyboardSupport: !1, ...h, - horizontalScrolling: d - }), this.disposables.add(u), this.contextKeyService = zI(r, this), this.disposables.add(PI(this.contextKeyService, this)), this.listSupportsMultiSelect = FI.bindTo(this.contextKeyService), this.listSupportsMultiSelect.set(o.multipleSelectionSupport !== !1), YI.bindTo(this.contextKeyService).set(!!o.selectionNavigation), this.listHasSelectionOrFocus = w5.bindTo(this.contextKeyService), this.listDoubleSelection = C5.bindTo(this.contextKeyService), this.listMultiSelection = S5.bindTo(this.contextKeyService), this.horizontalScrolling = o.horizontalScrolling, this._useAltAsMultipleSelectionModifier = Ea(a), this.disposables.add(this.contextKeyService), this.disposables.add(l.register(this)), this.updateStyles(o.overrideStyles), this.disposables.add(this.onDidChangeSelection(() => { - const m = this.getSelection(), f = this.getFocus(); + horizontalScrolling: a + }), this.disposables.add(u), this.contextKeyService = nC(l, this), this.disposables.add(sC(this.contextKeyService, this)), this.listSupportsMultiSelect = tC.bindTo(this.contextKeyService), this.listSupportsMultiSelect.set(o.multipleSelectionSupport !== !1), iC.bindTo(this.contextKeyService).set(!!o.selectionNavigation), this.listHasSelectionOrFocus = KH.bindTo(this.contextKeyService), this.listDoubleSelection = UH.bindTo(this.contextKeyService), this.listMultiSelection = PH.bindTo(this.contextKeyService), this.horizontalScrolling = o.horizontalScrolling, this._useAltAsMultipleSelectionModifier = zc(c), this.disposables.add(this.contextKeyService), this.disposables.add(r.register(this)), this.updateStyles(o.overrideStyles), this.disposables.add(this.onDidChangeSelection(() => { + const b = this.getSelection(), g = this.getFocus(); this.contextKeyService.bufferChangeEvents(() => { - this.listHasSelectionOrFocus.set(m.length > 0 || f.length > 0), this.listMultiSelection.set(m.length > 1), this.listDoubleSelection.set(m.length === 2); + this.listHasSelectionOrFocus.set(b.length > 0 || g.length > 0), this.listMultiSelection.set(b.length > 1), this.listDoubleSelection.set(b.length === 2); }); })), this.disposables.add(this.onDidChangeFocus(() => { - const m = this.getSelection(), f = this.getFocus(); - this.listHasSelectionOrFocus.set(m.length > 0 || f.length > 0); - })), this.disposables.add(a.onDidChangeConfiguration((m) => { - m.affectsConfiguration(Hm) && (this._useAltAsMultipleSelectionModifier = Ea(a)); - let f = {}; - if (m.affectsConfiguration(mr) && this.horizontalScrolling === void 0) { - const b = !!a.getValue(mr); - f = { ...f, horizontalScrolling: b }; - } - if (m.affectsConfiguration(kl)) { - const b = !!a.getValue(kl); - f = { ...f, scrollByPage: b }; - } - if (m.affectsConfiguration(Gl)) { - const b = !!a.getValue(Gl); - f = { ...f, smoothScrolling: b }; - } - if (m.affectsConfiguration(Ga)) { - const b = a.getValue(Ga); - f = { ...f, mouseWheelScrollSensitivity: b }; - } - if (m.affectsConfiguration(Ra)) { - const b = a.getValue(Ra); - f = { ...f, fastScrollSensitivity: b }; - } - Object.keys(f).length > 0 && this.updateOptions(f); - })), this.navigator = new tj(this, { configurationService: a, ...o }), this.disposables.add(this.navigator); + const b = this.getSelection(), g = this.getFocus(); + this.listHasSelectionOrFocus.set(b.length > 0 || g.length > 0); + })), this.disposables.add(c.onDidChangeConfiguration((b) => { + b.affectsConfiguration(jb) && (this._useAltAsMultipleSelectionModifier = zc(c)); + let g = {}; + if (b.affectsConfiguration(Zl) && this.horizontalScrolling === void 0) { + const Z = !!c.getValue(Zl); + g = { ...g, horizontalScrolling: Z }; + } + if (b.affectsConfiguration(Er)) { + const Z = !!c.getValue(Er); + g = { ...g, scrollByPage: Z }; + } + if (b.affectsConfiguration(Dr)) { + const Z = !!c.getValue(Dr); + g = { ...g, smoothScrolling: Z }; + } + if (b.affectsConfiguration(Dc)) { + const Z = c.getValue(Dc); + g = { ...g, mouseWheelScrollSensitivity: Z }; + } + if (b.affectsConfiguration(Fc)) { + const Z = c.getValue(Fc); + g = { ...g, fastScrollSensitivity: Z }; + } + Object.keys(g).length > 0 && this.updateOptions(g); + })), this.navigator = new J4(this, { configurationService: c, ...o }), this.disposables.add(this.navigator); } updateOptions(e) { super.updateOptions(e), e.overrideStyles !== void 0 && this.updateStyles(e.overrideStyles), e.multipleSelectionSupport !== void 0 && this.listSupportsMultiSelect.set(!!e.multipleSelectionSupport); } updateStyles(e) { - this.style(e ? zm(e) : Ym); + this.style(e ? Bb(e) : Pb); } }; -w3 = ad([ - zt(5, _e), - zt(6, Ar), - zt(7, Ke), - zt(8, Se) -], w3); -let C3 = class extends nbe { - constructor(e, t, i, n, o, r, l, a, c) { - const d = typeof o.horizontalScrolling < "u" ? o.horizontalScrolling : !!a.getValue(mr), [h, u] = c.invokeFunction(BI, o); +KA = ua([ + zt(5, xe), + zt(6, Sl), + zt(7, Qe), + zt(8, Ge) +], KA); +let UA = class extends QZe { + constructor(e, t, i, n, o, l, r, c, d) { + const a = typeof o.horizontalScrolling < "u" ? o.horizontalScrolling : !!c.getValue(Zl), [h, u] = d.invokeFunction(oC, o); super(e, t, i, n, { keyboardSupport: !1, ...h, - horizontalScrolling: d - }), this.disposables = new U(), this.disposables.add(u), this.contextKeyService = zI(r, this), this.disposables.add(PI(this.contextKeyService, this.widget)), this.horizontalScrolling = o.horizontalScrolling, this.listSupportsMultiSelect = FI.bindTo(this.contextKeyService), this.listSupportsMultiSelect.set(o.multipleSelectionSupport !== !1), YI.bindTo(this.contextKeyService).set(!!o.selectionNavigation), this._useAltAsMultipleSelectionModifier = Ea(a), this.disposables.add(this.contextKeyService), this.disposables.add(l.register(this)), this.updateStyles(o.overrideStyles), this.disposables.add(a.onDidChangeConfiguration((m) => { - m.affectsConfiguration(Hm) && (this._useAltAsMultipleSelectionModifier = Ea(a)); - let f = {}; - if (m.affectsConfiguration(mr) && this.horizontalScrolling === void 0) { - const b = !!a.getValue(mr); - f = { ...f, horizontalScrolling: b }; + horizontalScrolling: a + }), this.disposables = new _(), this.disposables.add(u), this.contextKeyService = nC(l, this), this.disposables.add(sC(this.contextKeyService, this.widget)), this.horizontalScrolling = o.horizontalScrolling, this.listSupportsMultiSelect = tC.bindTo(this.contextKeyService), this.listSupportsMultiSelect.set(o.multipleSelectionSupport !== !1), iC.bindTo(this.contextKeyService).set(!!o.selectionNavigation), this._useAltAsMultipleSelectionModifier = zc(c), this.disposables.add(this.contextKeyService), this.disposables.add(r.register(this)), this.updateStyles(o.overrideStyles), this.disposables.add(c.onDidChangeConfiguration((b) => { + b.affectsConfiguration(jb) && (this._useAltAsMultipleSelectionModifier = zc(c)); + let g = {}; + if (b.affectsConfiguration(Zl) && this.horizontalScrolling === void 0) { + const Z = !!c.getValue(Zl); + g = { ...g, horizontalScrolling: Z }; } - if (m.affectsConfiguration(kl)) { - const b = !!a.getValue(kl); - f = { ...f, scrollByPage: b }; + if (b.affectsConfiguration(Er)) { + const Z = !!c.getValue(Er); + g = { ...g, scrollByPage: Z }; } - if (m.affectsConfiguration(Gl)) { - const b = !!a.getValue(Gl); - f = { ...f, smoothScrolling: b }; + if (b.affectsConfiguration(Dr)) { + const Z = !!c.getValue(Dr); + g = { ...g, smoothScrolling: Z }; } - if (m.affectsConfiguration(Ga)) { - const b = a.getValue(Ga); - f = { ...f, mouseWheelScrollSensitivity: b }; + if (b.affectsConfiguration(Dc)) { + const Z = c.getValue(Dc); + g = { ...g, mouseWheelScrollSensitivity: Z }; } - if (m.affectsConfiguration(Ra)) { - const b = a.getValue(Ra); - f = { ...f, fastScrollSensitivity: b }; + if (b.affectsConfiguration(Fc)) { + const Z = c.getValue(Fc); + g = { ...g, fastScrollSensitivity: Z }; } - Object.keys(f).length > 0 && this.updateOptions(f); - })), this.navigator = new tj(this, { configurationService: a, ...o }), this.disposables.add(this.navigator); + Object.keys(g).length > 0 && this.updateOptions(g); + })), this.navigator = new J4(this, { configurationService: c, ...o }), this.disposables.add(this.navigator); } updateOptions(e) { super.updateOptions(e), e.overrideStyles !== void 0 && this.updateStyles(e.overrideStyles), e.multipleSelectionSupport !== void 0 && this.listSupportsMultiSelect.set(!!e.multipleSelectionSupport); } updateStyles(e) { - this.style(e ? zm(e) : Ym); + this.style(e ? Bb(e) : Pb); } dispose() { this.disposables.dispose(), super.dispose(); } }; -C3 = ad([ - zt(5, _e), - zt(6, Ar), - zt(7, Ke), - zt(8, Se) -], C3); -let S3 = class extends rD { - constructor(e, t, i, n, o, r, l, a, c, d) { - const h = typeof r.horizontalScrolling < "u" ? r.horizontalScrolling : !!c.getValue(mr), [u, g] = d.invokeFunction(BI, r); +UA = ua([ + zt(5, xe), + zt(6, Sl), + zt(7, Qe), + zt(8, Ge) +], UA); +let PA = class extends xM { + constructor(e, t, i, n, o, l, r, c, d, a) { + const h = typeof l.horizontalScrolling < "u" ? l.horizontalScrolling : !!d.getValue(Zl), [u, m] = a.invokeFunction(oC, l); super(e, t, i, n, o, { keyboardSupport: !1, ...u, horizontalScrolling: h - }), this.disposables.add(g), this.contextKeyService = zI(l, this), this.disposables.add(PI(this.contextKeyService, this)), this.listSupportsMultiSelect = FI.bindTo(this.contextKeyService), this.listSupportsMultiSelect.set(r.multipleSelectionSupport !== !1), YI.bindTo(this.contextKeyService).set(!!r.selectionNavigation), this.listHasSelectionOrFocus = w5.bindTo(this.contextKeyService), this.listDoubleSelection = C5.bindTo(this.contextKeyService), this.listMultiSelection = S5.bindTo(this.contextKeyService), this.horizontalScrolling = r.horizontalScrolling, this._useAltAsMultipleSelectionModifier = Ea(c), this.disposables.add(this.contextKeyService), this.disposables.add(a.register(this)), this.updateStyles(r.overrideStyles), this.disposables.add(this.onDidChangeSelection(() => { - const f = this.getSelection(), b = this.getFocus(); + }), this.disposables.add(m), this.contextKeyService = nC(r, this), this.disposables.add(sC(this.contextKeyService, this)), this.listSupportsMultiSelect = tC.bindTo(this.contextKeyService), this.listSupportsMultiSelect.set(l.multipleSelectionSupport !== !1), iC.bindTo(this.contextKeyService).set(!!l.selectionNavigation), this.listHasSelectionOrFocus = KH.bindTo(this.contextKeyService), this.listDoubleSelection = UH.bindTo(this.contextKeyService), this.listMultiSelection = PH.bindTo(this.contextKeyService), this.horizontalScrolling = l.horizontalScrolling, this._useAltAsMultipleSelectionModifier = zc(d), this.disposables.add(this.contextKeyService), this.disposables.add(c.register(this)), this.updateStyles(l.overrideStyles), this.disposables.add(this.onDidChangeSelection(() => { + const g = this.getSelection(), Z = this.getFocus(); this.contextKeyService.bufferChangeEvents(() => { - this.listHasSelectionOrFocus.set(f.length > 0 || b.length > 0), this.listMultiSelection.set(f.length > 1), this.listDoubleSelection.set(f.length === 2); + this.listHasSelectionOrFocus.set(g.length > 0 || Z.length > 0), this.listMultiSelection.set(g.length > 1), this.listDoubleSelection.set(g.length === 2); }); })), this.disposables.add(this.onDidChangeFocus(() => { - const f = this.getSelection(), b = this.getFocus(); - this.listHasSelectionOrFocus.set(f.length > 0 || b.length > 0); - })), this.disposables.add(c.onDidChangeConfiguration((f) => { - f.affectsConfiguration(Hm) && (this._useAltAsMultipleSelectionModifier = Ea(c)); - let b = {}; - if (f.affectsConfiguration(mr) && this.horizontalScrolling === void 0) { - const y = !!c.getValue(mr); - b = { ...b, horizontalScrolling: y }; - } - if (f.affectsConfiguration(kl)) { - const y = !!c.getValue(kl); - b = { ...b, scrollByPage: y }; - } - if (f.affectsConfiguration(Gl)) { - const y = !!c.getValue(Gl); - b = { ...b, smoothScrolling: y }; - } - if (f.affectsConfiguration(Ga)) { - const y = c.getValue(Ga); - b = { ...b, mouseWheelScrollSensitivity: y }; - } - if (f.affectsConfiguration(Ra)) { - const y = c.getValue(Ra); - b = { ...b, fastScrollSensitivity: y }; - } - Object.keys(b).length > 0 && this.updateOptions(b); - })), this.navigator = new i0e(this, { configurationService: c, ...r }), this.disposables.add(this.navigator); + const g = this.getSelection(), Z = this.getFocus(); + this.listHasSelectionOrFocus.set(g.length > 0 || Z.length > 0); + })), this.disposables.add(d.onDidChangeConfiguration((g) => { + g.affectsConfiguration(jb) && (this._useAltAsMultipleSelectionModifier = zc(d)); + let Z = {}; + if (g.affectsConfiguration(Zl) && this.horizontalScrolling === void 0) { + const f = !!d.getValue(Zl); + Z = { ...Z, horizontalScrolling: f }; + } + if (g.affectsConfiguration(Er)) { + const f = !!d.getValue(Er); + Z = { ...Z, scrollByPage: f }; + } + if (g.affectsConfiguration(Dr)) { + const f = !!d.getValue(Dr); + Z = { ...Z, smoothScrolling: f }; + } + if (g.affectsConfiguration(Dc)) { + const f = d.getValue(Dc); + Z = { ...Z, mouseWheelScrollSensitivity: f }; + } + if (g.affectsConfiguration(Fc)) { + const f = d.getValue(Fc); + Z = { ...Z, fastScrollSensitivity: f }; + } + Object.keys(Z).length > 0 && this.updateOptions(Z); + })), this.navigator = new _0e(this, { configurationService: d, ...l }), this.disposables.add(this.navigator); } updateOptions(e) { super.updateOptions(e), e.overrideStyles !== void 0 && this.updateStyles(e.overrideStyles), e.multipleSelectionSupport !== void 0 && this.listSupportsMultiSelect.set(!!e.multipleSelectionSupport); } updateStyles(e) { - this.style(e ? zm(e) : Ym); + this.style(e ? Bb(e) : Pb); } dispose() { this.disposables.dispose(), super.dispose(); } }; -S3 = ad([ - zt(6, _e), - zt(7, Ar), - zt(8, Ke), - zt(9, Se) -], S3); -class _5 extends R { +PA = ua([ + zt(6, xe), + zt(7, Sl), + zt(8, Qe), + zt(9, Ge) +], PA); +class qH extends J { constructor(e, t) { - super(), this.widget = e, this._onDidOpen = this._register(new k()), this.onDidOpen = this._onDidOpen.event, this._register(se.filter(this.widget.onDidChangeSelection, (i) => uc(i.browserEvent))((i) => this.onSelectionFromKeyboard(i))), this._register(this.widget.onPointer((i) => this.onPointer(i.element, i.browserEvent))), this._register(this.widget.onMouseDblClick((i) => this.onMouseDblClick(i.element, i.browserEvent))), typeof (t == null ? void 0 : t.openOnSingleClick) != "boolean" && (t != null && t.configurationService) ? (this.openOnSingleClick = (t == null ? void 0 : t.configurationService.getValue(GL)) !== "doubleClick", this._register(t == null ? void 0 : t.configurationService.onDidChangeConfiguration((i) => { - i.affectsConfiguration(GL) && (this.openOnSingleClick = (t == null ? void 0 : t.configurationService.getValue(GL)) !== "doubleClick"); + super(), this.widget = e, this._onDidOpen = this._register(new k()), this.onDidOpen = this._onDidOpen.event, this._register(se.filter(this.widget.onDidChangeSelection, (i) => gd(i.browserEvent))((i) => this.onSelectionFromKeyboard(i))), this._register(this.widget.onPointer((i) => this.onPointer(i.element, i.browserEvent))), this._register(this.widget.onMouseDblClick((i) => this.onMouseDblClick(i.element, i.browserEvent))), typeof (t == null ? void 0 : t.openOnSingleClick) != "boolean" && (t != null && t.configurationService) ? (this.openOnSingleClick = (t == null ? void 0 : t.configurationService.getValue(jX)) !== "doubleClick", this._register(t == null ? void 0 : t.configurationService.onDidChangeConfiguration((i) => { + i.affectsConfiguration(jX) && (this.openOnSingleClick = (t == null ? void 0 : t.configurationService.getValue(jX)) !== "doubleClick"); }))) : this.openOnSingleClick = (t == null ? void 0 : t.openOnSingleClick) ?? !0; } onSelectionFromKeyboard(e) { @@ -68861,8 +68861,8 @@ class _5 extends R { onPointer(e, t) { if (!this.openOnSingleClick || t.detail === 2) return; - const n = t.button === 1, o = !0, r = n, l = t.ctrlKey || t.metaKey || t.altKey; - this._open(e, o, r, l, t); + const n = t.button === 1, o = !0, l = n, r = t.ctrlKey || t.metaKey || t.altKey; + this._open(e, o, l, r, t); } onMouseDblClick(e, t) { if (!t) @@ -68870,8 +68870,8 @@ class _5 extends R { const i = t.target; if (i.classList.contains("monaco-tl-twistie") || i.classList.contains("monaco-icon-label") && i.classList.contains("folder-icon") && t.offsetX < 16) return; - const o = !1, r = !0, l = t.ctrlKey || t.metaKey || t.altKey; - this._open(e, o, r, l, t); + const o = !1, l = !0, r = t.ctrlKey || t.metaKey || t.altKey; + this._open(e, o, l, r, t); } _open(e, t, i, n, o) { e && this._onDidOpen.fire({ @@ -68886,7 +68886,7 @@ class _5 extends R { }); } } -class tj extends _5 { +class J4 extends qH { constructor(e, t) { super(e, t), this.widget = e; } @@ -68894,7 +68894,7 @@ class tj extends _5 { return this.widget.getSelectedElements()[0]; } } -class i0e extends _5 { +class _0e extends qH { constructor(e, t) { super(e, t); } @@ -68902,7 +68902,7 @@ class i0e extends _5 { return this.widget.getSelectedElements()[0]; } } -class n0e extends _5 { +class Q0e extends qH { constructor(e, t) { super(e, t); } @@ -68910,7 +68910,7 @@ class n0e extends _5 { return this.widget.getSelection()[0] ?? void 0; } } -function s0e(s) { +function O0e(s) { let e = !1; return (t) => { if (t.toKeyCodeChord().isModifierKey()) @@ -68921,239 +68921,239 @@ function s0e(s) { return i.kind === 1 ? (e = !0, !1) : (e = !1, i.kind === 0); }; } -let hD = class extends f5 { - constructor(e, t, i, n, o, r, l, a, c) { - const { options: d, getTypeNavigationMode: h, disposable: u } = r.invokeFunction(RC, o); - super(e, t, i, n, d), this.disposables.add(u), this.internals = new Im(this, o, h, o.overrideStyles, l, a, c), this.disposables.add(this.internals); +let TM = class extends FH { + constructor(e, t, i, n, o, l, r, c, d) { + const { options: a, getTypeNavigationMode: h, disposable: u } = l.invokeFunction(OG, o); + super(e, t, i, n, a), this.disposables.add(u), this.internals = new Mb(this, o, h, o.overrideStyles, r, c, d), this.disposables.add(this.internals); } updateOptions(e) { super.updateOptions(e), this.internals.updateOptions(e); } }; -hD = ad([ - zt(5, Se), - zt(6, _e), - zt(7, Ar), - zt(8, Ke) -], hD); -let L3 = class extends BQ { - constructor(e, t, i, n, o, r, l, a, c) { - const { options: d, getTypeNavigationMode: h, disposable: u } = r.invokeFunction(RC, o); - super(e, t, i, n, d), this.disposables.add(u), this.internals = new Im(this, o, h, o.overrideStyles, l, a, c), this.disposables.add(this.internals); +TM = ua([ + zt(5, Ge), + zt(6, xe), + zt(7, Sl), + zt(8, Qe) +], TM); +let BA = class extends S4 { + constructor(e, t, i, n, o, l, r, c, d) { + const { options: a, getTypeNavigationMode: h, disposable: u } = l.invokeFunction(OG, o); + super(e, t, i, n, a), this.disposables.add(u), this.internals = new Mb(this, o, h, o.overrideStyles, r, c, d), this.disposables.add(this.internals); } updateOptions(e = {}) { super.updateOptions(e), e.overrideStyles && this.internals.updateStyleOverrides(e.overrideStyles), this.internals.updateOptions(e); } }; -L3 = ad([ - zt(5, Se), - zt(6, _e), - zt(7, Ar), - zt(8, Ke) -], L3); -let A3 = class extends Kbe { - constructor(e, t, i, n, o, r, l, a, c, d) { - const { options: h, getTypeNavigationMode: u, disposable: g } = l.invokeFunction(RC, r); - super(e, t, i, n, o, h), this.disposables.add(g), this.internals = new Im(this, r, u, r.overrideStyles, a, c, d), this.disposables.add(this.internals); +BA = ua([ + zt(5, Ge), + zt(6, xe), + zt(7, Sl), + zt(8, Qe) +], BA); +let _A = class extends F0e { + constructor(e, t, i, n, o, l, r, c, d, a) { + const { options: h, getTypeNavigationMode: u, disposable: m } = r.invokeFunction(OG, l); + super(e, t, i, n, o, h), this.disposables.add(m), this.internals = new Mb(this, l, u, l.overrideStyles, c, d, a), this.disposables.add(this.internals); } updateOptions(e = {}) { super.updateOptions(e), e.overrideStyles !== void 0 && this.internals.updateStyleOverrides(e.overrideStyles), this.internals.updateOptions(e); } }; -A3 = ad([ - zt(6, Se), - zt(7, _e), - zt(8, Ar), - zt(9, Ke) -], A3); -let uD = class extends HQ { +_A = ua([ + zt(6, Ge), + zt(7, xe), + zt(8, Sl), + zt(9, Qe) +], _A); +let MM = class extends C4 { get onDidOpen() { return this.internals.onDidOpen; } - constructor(e, t, i, n, o, r, l, a, c, d) { - const { options: h, getTypeNavigationMode: u, disposable: g } = l.invokeFunction(RC, r); - super(e, t, i, n, o, h), this.disposables.add(g), this.internals = new Im(this, r, u, r.overrideStyles, a, c, d), this.disposables.add(this.internals); + constructor(e, t, i, n, o, l, r, c, d, a) { + const { options: h, getTypeNavigationMode: u, disposable: m } = r.invokeFunction(OG, l); + super(e, t, i, n, o, h), this.disposables.add(m), this.internals = new Mb(this, l, u, l.overrideStyles, c, d, a), this.disposables.add(this.internals); } updateOptions(e = {}) { super.updateOptions(e), e.overrideStyles && this.internals.updateStyleOverrides(e.overrideStyles), this.internals.updateOptions(e); } }; -uD = ad([ - zt(6, Se), - zt(7, _e), - zt(8, Ar), - zt(9, Ke) -], uD); -let x3 = class extends Jbe { - constructor(e, t, i, n, o, r, l, a, c, d, h) { - const { options: u, getTypeNavigationMode: g, disposable: m } = a.invokeFunction(RC, l); - super(e, t, i, n, o, r, u), this.disposables.add(m), this.internals = new Im(this, l, g, l.overrideStyles, c, d, h), this.disposables.add(this.internals); +MM = ua([ + zt(6, Ge), + zt(7, xe), + zt(8, Sl), + zt(9, Qe) +], MM); +let QA = class extends E0e { + constructor(e, t, i, n, o, l, r, c, d, a, h) { + const { options: u, getTypeNavigationMode: m, disposable: b } = c.invokeFunction(OG, r); + super(e, t, i, n, o, l, u), this.disposables.add(b), this.internals = new Mb(this, r, m, r.overrideStyles, d, a, h), this.disposables.add(this.internals); } updateOptions(e) { super.updateOptions(e), this.internals.updateOptions(e); } }; -x3 = ad([ - zt(7, Se), - zt(8, _e), - zt(9, Ar), - zt(10, Ke) -], x3); -function ij(s) { - const e = s.getValue(x5); +QA = ua([ + zt(7, Ge), + zt(8, xe), + zt(9, Sl), + zt(10, Qe) +], QA); +function H4(s) { + const e = s.getValue(QH); if (e === "highlight") - return Ic.Highlight; + return Td.Highlight; if (e === "filter") - return Ic.Filter; - const t = s.getValue(Dx); + return Td.Filter; + const t = s.getValue(_L); if (t === "simple" || t === "highlight") - return Ic.Highlight; + return Td.Highlight; if (t === "filter") - return Ic.Filter; + return Td.Filter; } -function nj(s) { - const e = s.getValue(Z5); +function E4(s) { + const e = s.getValue(jH); if (e === "fuzzy") - return _m.Fuzzy; + return Tb.Fuzzy; if (e === "contiguous") - return _m.Contiguous; + return Tb.Contiguous; } -function RC(s, e) { - const t = s.get(Ke), i = s.get(rd), n = s.get(_e), o = s.get(Se), r = () => { - const u = n.getContextKeyValue($Q); +function OG(s, e) { + const t = s.get(Qe), i = s.get(aa), n = s.get(xe), o = s.get(Ge), l = () => { + const u = n.getContextKeyValue(k4); if (u === "automatic") - return ba.Automatic; - if (u === "trigger" || n.getContextKeyValue(ej) === !1) - return ba.Trigger; - const m = t.getValue(M5); - if (m === "automatic") - return ba.Automatic; - if (m === "trigger") - return ba.Trigger; - }, l = e.horizontalScrolling !== void 0 ? e.horizontalScrolling : !!t.getValue(mr), [a, c] = o.invokeFunction(BI, e), d = e.paddingBottom, h = e.renderIndentGuides !== void 0 ? e.renderIndentGuides : t.getValue(Vx); + return Gc.Automatic; + if (u === "trigger" || n.getContextKeyValue(v4) === !1) + return Gc.Trigger; + const b = t.getValue(OH); + if (b === "automatic") + return Gc.Automatic; + if (b === "trigger") + return Gc.Trigger; + }, r = e.horizontalScrolling !== void 0 ? e.horizontalScrolling : !!t.getValue(Zl), [c, d] = o.invokeFunction(oC, e), a = e.paddingBottom, h = e.renderIndentGuides !== void 0 ? e.renderIndentGuides : t.getValue(QL); return { - getTypeNavigationMode: r, - disposable: c, + getTypeNavigationMode: l, + disposable: d, options: { // ...options, // TODO@Joao why is this not splatted here? keyboardSupport: !1, - ...a, - indent: typeof t.getValue(k1) == "number" ? t.getValue(k1) : void 0, + ...c, + indent: typeof t.getValue(BW) == "number" ? t.getValue(BW) : void 0, renderIndentGuides: h, - smoothScrolling: !!t.getValue(Gl), - defaultFindMode: ij(t), - defaultFindMatchType: nj(t), - horizontalScrolling: l, - scrollByPage: !!t.getValue(kl), - paddingBottom: d, + smoothScrolling: !!t.getValue(Dr), + defaultFindMode: H4(t), + defaultFindMatchType: E4(t), + horizontalScrolling: r, + scrollByPage: !!t.getValue(Er), + paddingBottom: a, hideTwistiesOfChildlessElements: e.hideTwistiesOfChildlessElements, - expandOnlyOnTwistieClick: e.expandOnlyOnTwistieClick ?? t.getValue(kx) === "doubleClick", + expandOnlyOnTwistieClick: e.expandOnlyOnTwistieClick ?? t.getValue(OL) === "doubleClick", contextViewProvider: i, - findWidgetStyles: Ege, - enableStickyScroll: !!t.getValue(Gx), - stickyScrollMaxItemCount: Number(t.getValue(Rx)) + findWidgetStyles: Nbe, + enableStickyScroll: !!t.getValue(jL), + stickyScrollMaxItemCount: Number(t.getValue(qL)) } }; } -let Im = class { +let Mb = class { get onDidOpen() { return this.navigator.onDidOpen; } - constructor(e, t, i, n, o, r, l) { - this.tree = e, this.disposables = [], this.contextKeyService = zI(o, e), this.disposables.push(PI(this.contextKeyService, e)), this.listSupportsMultiSelect = FI.bindTo(this.contextKeyService), this.listSupportsMultiSelect.set(t.multipleSelectionSupport !== !1), YI.bindTo(this.contextKeyService).set(!!t.selectionNavigation), this.listSupportFindWidget = jbe.bindTo(this.contextKeyService), this.listSupportFindWidget.set(t.findWidgetEnabled ?? !0), this.hasSelectionOrFocus = w5.bindTo(this.contextKeyService), this.hasDoubleSelection = C5.bindTo(this.contextKeyService), this.hasMultiSelection = S5.bindTo(this.contextKeyService), this.treeElementCanCollapse = L5.bindTo(this.contextKeyService), this.treeElementHasParent = qbe.bindTo(this.contextKeyService), this.treeElementCanExpand = A5.bindTo(this.contextKeyService), this.treeElementHasChild = $be.bindTo(this.contextKeyService), this.treeFindOpen = e0e.bindTo(this.contextKeyService), this.treeStickyScrollFocused = jQ.bindTo(this.contextKeyService), this._useAltAsMultipleSelectionModifier = Ea(l), this.updateStyleOverrides(n); - const c = () => { + constructor(e, t, i, n, o, l, r) { + this.tree = e, this.disposables = [], this.contextKeyService = nC(o, e), this.disposables.push(sC(this.contextKeyService, e)), this.listSupportsMultiSelect = tC.bindTo(this.contextKeyService), this.listSupportsMultiSelect.set(t.multipleSelectionSupport !== !1), iC.bindTo(this.contextKeyService).set(!!t.selectionNavigation), this.listSupportFindWidget = A0e.bindTo(this.contextKeyService), this.listSupportFindWidget.set(t.findWidgetEnabled ?? !0), this.hasSelectionOrFocus = KH.bindTo(this.contextKeyService), this.hasDoubleSelection = UH.bindTo(this.contextKeyService), this.hasMultiSelection = PH.bindTo(this.contextKeyService), this.treeElementCanCollapse = BH.bindTo(this.contextKeyService), this.treeElementHasParent = K0e.bindTo(this.contextKeyService), this.treeElementCanExpand = _H.bindTo(this.contextKeyService), this.treeElementHasChild = U0e.bindTo(this.contextKeyService), this.treeFindOpen = P0e.bindTo(this.contextKeyService), this.treeStickyScrollFocused = M4.bindTo(this.contextKeyService), this._useAltAsMultipleSelectionModifier = zc(r), this.updateStyleOverrides(n); + const d = () => { const h = e.getFocus()[0]; if (!h) return; const u = e.getNode(h); this.treeElementCanCollapse.set(u.collapsible && !u.collapsed), this.treeElementHasParent.set(!!e.getParentElement(h)), this.treeElementCanExpand.set(u.collapsible && u.collapsed), this.treeElementHasChild.set(!!e.getFirstElementChild(h)); - }, d = /* @__PURE__ */ new Set(); - d.add($Q), d.add(ej), this.disposables.push(this.contextKeyService, r.register(e), e.onDidChangeSelection(() => { + }, a = /* @__PURE__ */ new Set(); + a.add(k4), a.add(v4), this.disposables.push(this.contextKeyService, l.register(e), e.onDidChangeSelection(() => { const h = e.getSelection(), u = e.getFocus(); this.contextKeyService.bufferChangeEvents(() => { this.hasSelectionOrFocus.set(h.length > 0 || u.length > 0), this.hasMultiSelection.set(h.length > 1), this.hasDoubleSelection.set(h.length === 2); }); }), e.onDidChangeFocus(() => { const h = e.getSelection(), u = e.getFocus(); - this.hasSelectionOrFocus.set(h.length > 0 || u.length > 0), c(); - }), e.onDidChangeCollapseState(c), e.onDidChangeModel(c), e.onDidChangeFindOpenState((h) => this.treeFindOpen.set(h)), e.onDidChangeStickyScrollFocused((h) => this.treeStickyScrollFocused.set(h)), l.onDidChangeConfiguration((h) => { + this.hasSelectionOrFocus.set(h.length > 0 || u.length > 0), d(); + }), e.onDidChangeCollapseState(d), e.onDidChangeModel(d), e.onDidChangeFindOpenState((h) => this.treeFindOpen.set(h)), e.onDidChangeStickyScrollFocused((h) => this.treeStickyScrollFocused.set(h)), r.onDidChangeConfiguration((h) => { let u = {}; - if (h.affectsConfiguration(Hm) && (this._useAltAsMultipleSelectionModifier = Ea(l)), h.affectsConfiguration(k1)) { - const g = l.getValue(k1); - u = { ...u, indent: g }; + if (h.affectsConfiguration(jb) && (this._useAltAsMultipleSelectionModifier = zc(r)), h.affectsConfiguration(BW)) { + const m = r.getValue(BW); + u = { ...u, indent: m }; } - if (h.affectsConfiguration(Vx) && t.renderIndentGuides === void 0) { - const g = l.getValue(Vx); - u = { ...u, renderIndentGuides: g }; + if (h.affectsConfiguration(QL) && t.renderIndentGuides === void 0) { + const m = r.getValue(QL); + u = { ...u, renderIndentGuides: m }; } - if (h.affectsConfiguration(Gl)) { - const g = !!l.getValue(Gl); - u = { ...u, smoothScrolling: g }; + if (h.affectsConfiguration(Dr)) { + const m = !!r.getValue(Dr); + u = { ...u, smoothScrolling: m }; } - if (h.affectsConfiguration(x5) || h.affectsConfiguration(Dx)) { - const g = ij(l); - u = { ...u, defaultFindMode: g }; + if (h.affectsConfiguration(QH) || h.affectsConfiguration(_L)) { + const m = H4(r); + u = { ...u, defaultFindMode: m }; } - if (h.affectsConfiguration(M5) || h.affectsConfiguration(Dx)) { - const g = i(); - u = { ...u, typeNavigationMode: g }; + if (h.affectsConfiguration(OH) || h.affectsConfiguration(_L)) { + const m = i(); + u = { ...u, typeNavigationMode: m }; } - if (h.affectsConfiguration(Z5)) { - const g = nj(l); - u = { ...u, defaultFindMatchType: g }; + if (h.affectsConfiguration(jH)) { + const m = E4(r); + u = { ...u, defaultFindMatchType: m }; } - if (h.affectsConfiguration(mr) && t.horizontalScrolling === void 0) { - const g = !!l.getValue(mr); - u = { ...u, horizontalScrolling: g }; + if (h.affectsConfiguration(Zl) && t.horizontalScrolling === void 0) { + const m = !!r.getValue(Zl); + u = { ...u, horizontalScrolling: m }; } - if (h.affectsConfiguration(kl)) { - const g = !!l.getValue(kl); - u = { ...u, scrollByPage: g }; + if (h.affectsConfiguration(Er)) { + const m = !!r.getValue(Er); + u = { ...u, scrollByPage: m }; } - if (h.affectsConfiguration(kx) && t.expandOnlyOnTwistieClick === void 0 && (u = { ...u, expandOnlyOnTwistieClick: l.getValue(kx) === "doubleClick" }), h.affectsConfiguration(Gx)) { - const g = l.getValue(Gx); - u = { ...u, enableStickyScroll: g }; + if (h.affectsConfiguration(OL) && t.expandOnlyOnTwistieClick === void 0 && (u = { ...u, expandOnlyOnTwistieClick: r.getValue(OL) === "doubleClick" }), h.affectsConfiguration(jL)) { + const m = r.getValue(jL); + u = { ...u, enableStickyScroll: m }; } - if (h.affectsConfiguration(Rx)) { - const g = Math.max(1, l.getValue(Rx)); - u = { ...u, stickyScrollMaxItemCount: g }; + if (h.affectsConfiguration(qL)) { + const m = Math.max(1, r.getValue(qL)); + u = { ...u, stickyScrollMaxItemCount: m }; } - if (h.affectsConfiguration(Ga)) { - const g = l.getValue(Ga); - u = { ...u, mouseWheelScrollSensitivity: g }; + if (h.affectsConfiguration(Dc)) { + const m = r.getValue(Dc); + u = { ...u, mouseWheelScrollSensitivity: m }; } - if (h.affectsConfiguration(Ra)) { - const g = l.getValue(Ra); - u = { ...u, fastScrollSensitivity: g }; + if (h.affectsConfiguration(Fc)) { + const m = r.getValue(Fc); + u = { ...u, fastScrollSensitivity: m }; } Object.keys(u).length > 0 && e.updateOptions(u); }), this.contextKeyService.onDidChangeContext((h) => { - h.affectsSome(d) && e.updateOptions({ typeNavigationMode: i() }); - })), this.navigator = new n0e(e, { configurationService: l, ...t }), this.disposables.push(this.navigator); + h.affectsSome(a) && e.updateOptions({ typeNavigationMode: i() }); + })), this.navigator = new Q0e(e, { configurationService: r, ...t }), this.disposables.push(this.navigator); } updateOptions(e) { e.multipleSelectionSupport !== void 0 && this.listSupportsMultiSelect.set(!!e.multipleSelectionSupport); } updateStyleOverrides(e) { - this.tree.style(e ? zm(e) : Ym); + this.tree.style(e ? Bb(e) : Pb); } dispose() { - this.disposables = Wt(this.disposables); + this.disposables = Nt(this.disposables); } }; -Im = ad([ - zt(4, _e), - zt(5, Ar), - zt(6, Ke) -], Im); -const o0e = Di.as($r.Configuration); -o0e.registerConfiguration({ +Mb = ua([ + zt(4, xe), + zt(5, Sl), + zt(6, Qe) +], Mb); +const j0e = ki.as(ir.Configuration); +j0e.registerConfiguration({ id: "workbench", order: 7, title: p("workbenchConfigurationTitle", "Workbench"), type: "object", properties: { - [Hm]: { + [jb]: { type: "string", enum: ["ctrlCmd", "alt"], markdownEnumDescriptions: [ @@ -69169,7 +69169,7 @@ o0e.registerConfiguration({ ] }, "The modifier to be used to add an item in trees and lists to a multi-selection with the mouse (for example in the explorer, open editors and scm view). The 'Open to Side' mouse gestures - if supported - will adapt such that they do not conflict with the multiselect modifier.") }, - [GL]: { + [jX]: { type: "string", enum: ["singleClick", "doubleClick"], default: "singleClick", @@ -69178,45 +69178,45 @@ o0e.registerConfiguration({ comment: ["`singleClick` and `doubleClick` refers to a value the setting can take and should not be localized."] }, "Controls how to open items in trees and lists using the mouse (if supported). Note that some trees and lists might choose to ignore this setting if it is not applicable.") }, - [mr]: { + [Zl]: { type: "boolean", default: !1, description: p("horizontalScrolling setting", "Controls whether lists and trees support horizontal scrolling in the workbench. Warning: turning on this setting has a performance implication.") }, - [kl]: { + [Er]: { type: "boolean", default: !1, description: p("list.scrollByPage", "Controls whether clicks in the scrollbar scroll page by page.") }, - [k1]: { + [BW]: { type: "number", default: 8, minimum: 4, maximum: 40, description: p("tree indent setting", "Controls tree indentation in pixels.") }, - [Vx]: { + [QL]: { type: "string", enum: ["none", "onHover", "always"], default: "onHover", description: p("render tree indent guides", "Controls whether the tree should render indent guides.") }, - [Gl]: { + [Dr]: { type: "boolean", default: !1, description: p("list smoothScrolling setting", "Controls whether lists and trees have smooth scrolling.") }, - [Ga]: { + [Dc]: { type: "number", default: 1, markdownDescription: p("Mouse Wheel Scroll Sensitivity", "A multiplier to be used on the `deltaX` and `deltaY` of mouse wheel scroll events.") }, - [Ra]: { + [Fc]: { type: "number", default: 5, markdownDescription: p("Fast Scroll Sensitivity", "Scrolling speed multiplier when pressing `Alt`.") }, - [x5]: { + [QH]: { type: "string", enum: ["highlight", "filter"], enumDescriptions: [ @@ -69226,7 +69226,7 @@ o0e.registerConfiguration({ default: "highlight", description: p("defaultFindModeSettingKey", "Controls the default find mode for lists and trees in the workbench.") }, - [Dx]: { + [_L]: { type: "string", enum: ["simple", "highlight", "filter"], enumDescriptions: [ @@ -69239,7 +69239,7 @@ o0e.registerConfiguration({ deprecated: !0, deprecationMessage: p("keyboardNavigationSettingKeyDeprecated", "Please use 'workbench.list.defaultFindMode' and 'workbench.list.typeNavigationMode' instead.") }, - [Z5]: { + [jH]: { type: "string", enum: ["fuzzy", "contiguous"], enumDescriptions: [ @@ -69249,24 +69249,24 @@ o0e.registerConfiguration({ default: "fuzzy", description: p("defaultFindMatchTypeSettingKey", "Controls the type of matching used when searching lists and trees in the workbench.") }, - [kx]: { + [OL]: { type: "string", enum: ["singleClick", "doubleClick"], default: "singleClick", description: p("expand mode", "Controls how tree folders are expanded when clicking the folder names. Note that some trees and lists might choose to ignore this setting if it is not applicable.") }, - [Gx]: { + [jL]: { type: "boolean", default: !0, description: p("sticky scroll", "Controls whether sticky scrolling is enabled in trees.") }, - [Rx]: { + [qL]: { type: "number", minimum: 1, default: 7, markdownDescription: p("sticky scroll maximum items", "Controls the number of sticky elements displayed in the tree when {0} is enabled.", "`#workbench.tree.enableStickyScroll#`") }, - [M5]: { + [OH]: { type: "string", enum: ["automatic", "trigger"], default: "automatic", @@ -69274,9 +69274,9 @@ o0e.registerConfiguration({ } } }); -class Ph { +class Bh { constructor(e, t, i, n) { - this.isProviderFirst = e, this.parent = t, this.link = i, this._rangeCallback = n, this.id = Qv.nextId(); + this.isProviderFirst = e, this.parent = t, this.link = i, this._rangeCallback = n, this.id = ZT.nextId(); } get uri() { return this.link.uri; @@ -69290,10 +69290,10 @@ class Ph { get ariaMessage() { var t; const e = (t = this.parent.getPreview(this)) == null ? void 0 : t.preview(this.range); - return e ? p({ key: "aria.oneReference.preview", comment: ["Placeholders are: 0: filename, 1:line number, 2: column number, 3: preview snippet of source code"] }, "{0} in {1} on line {2} at column {3}", e.value, Cr(this.uri), this.range.startLineNumber, this.range.startColumn) : p("aria.oneReference", "in {0} on line {1} at column {2}", Cr(this.uri), this.range.startLineNumber, this.range.startColumn); + return e ? p({ key: "aria.oneReference.preview", comment: ["Placeholders are: 0: filename, 1:line number, 2: column number, 3: preview snippet of source code"] }, "{0} in {1} on line {2} at column {3}", e.value, Vl(this.uri), this.range.startLineNumber, this.range.startColumn) : p("aria.oneReference", "in {0} on line {1} at column {2}", Vl(this.uri), this.range.startLineNumber, this.range.startColumn); } } -class r0e { +class q0e { constructor(e) { this._modelReference = e; } @@ -69304,32 +69304,32 @@ class r0e { const i = this._modelReference.object.textEditorModel; if (!i) return; - const { startLineNumber: n, startColumn: o, endLineNumber: r, endColumn: l } = e, a = i.getWordUntilPosition({ lineNumber: n, column: o - t }), c = new M(n, a.startColumn, n, o), d = new M( - r, + const { startLineNumber: n, startColumn: o, endLineNumber: l, endColumn: r } = e, c = i.getWordUntilPosition({ lineNumber: n, column: o - t }), d = new I(n, c.startColumn, n, o), a = new I( l, r, + l, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */ - ), h = i.getValueInRange(c).replace(/^\s+/, ""), u = i.getValueInRange(e), g = i.getValueInRange(d).replace(/\s+$/, ""); + ), h = i.getValueInRange(d).replace(/^\s+/, ""), u = i.getValueInRange(e), m = i.getValueInRange(a).replace(/\s+$/, ""); return { - value: h + u + g, + value: h + u + m, highlight: { start: h.length, end: h.length + u.length } }; } } -class G1 { +class _W { constructor(e, t) { - this.parent = e, this.uri = t, this.children = [], this._previews = new sn(); + this.parent = e, this.uri = t, this.children = [], this._previews = new on(); } dispose() { - Wt(this._previews.values()), this._previews.clear(); + Nt(this._previews.values()), this._previews.clear(); } getPreview(e) { return this._previews.get(e.uri); } get ariaMessage() { const e = this.children.length; - return e === 1 ? p("aria.fileReferences.1", "1 symbol in {0}, full path {1}", Cr(this.uri), this.uri.fsPath) : p("aria.fileReferences.N", "{0} symbols in {1}, full path {2}", e, Cr(this.uri), this.uri.fsPath); + return e === 1 ? p("aria.fileReferences.1", "1 symbol in {0}, full path {1}", Vl(this.uri), this.uri.fsPath) : p("aria.fileReferences.N", "{0} symbols in {1}, full path {2}", e, Vl(this.uri), this.uri.fsPath); } async resolve(e) { if (this._previews.size !== 0) @@ -69338,30 +69338,30 @@ class G1 { if (!this._previews.has(t.uri)) try { const i = await e.createModelReference(t.uri); - this._previews.set(t.uri, new r0e(i)); + this._previews.set(t.uri, new q0e(i)); } catch (i) { - De(i); + Me(i); } return this; } } -class uo { +class bo { constructor(e, t) { this.groups = [], this.references = [], this._onDidChangeReferenceRange = new k(), this.onDidChangeReferenceRange = this._onDidChangeReferenceRange.event, this._links = e, this._title = t; const [i] = e; - e.sort(uo._compareReferences); + e.sort(bo._compareReferences); let n; for (const o of e) - if ((!n || !Kt.isEqual(n.uri, o.uri, !0)) && (n = new G1(this, o.uri), this.groups.push(n)), n.children.length === 0 || uo._compareReferences(o, n.children[n.children.length - 1]) !== 0) { - const r = new Ph(i === o, n, o, (l) => this._onDidChangeReferenceRange.fire(l)); - this.references.push(r), n.children.push(r); + if ((!n || !Qt.isEqual(n.uri, o.uri, !0)) && (n = new _W(this, o.uri), this.groups.push(n)), n.children.length === 0 || bo._compareReferences(o, n.children[n.children.length - 1]) !== 0) { + const l = new Bh(i === o, n, o, (r) => this._onDidChangeReferenceRange.fire(r)); + this.references.push(l), n.children.push(l); } } dispose() { - Wt(this.groups), this._onDidChangeReferenceRange.dispose(), this.groups.length = 0; + Nt(this.groups), this._onDidChangeReferenceRange.dispose(), this.groups.length = 0; } clone() { - return new uo(this._links, this._title); + return new bo(this._links, this._title); } get title() { return this._title; @@ -69375,13 +69375,13 @@ class uo { nextOrPreviousReference(e, t) { const { parent: i } = e; let n = i.children.indexOf(e); - const o = i.children.length, r = i.parent.groups.length; - return r === 1 || t && n + 1 < o || !t && n > 0 ? (t ? n = (n + 1) % o : n = (n + o - 1) % o, i.children[n]) : (n = i.parent.groups.indexOf(i), t ? (n = (n + 1) % r, i.parent.groups[n].children[0]) : (n = (n + r - 1) % r, i.parent.groups[n].children[i.parent.groups[n].children.length - 1])); + const o = i.children.length, l = i.parent.groups.length; + return l === 1 || t && n + 1 < o || !t && n > 0 ? (t ? n = (n + 1) % o : n = (n + o - 1) % o, i.children[n]) : (n = i.parent.groups.indexOf(i), t ? (n = (n + 1) % l, i.parent.groups[n].children[0]) : (n = (n + l - 1) % l, i.parent.groups[n].children[i.parent.groups[n].children.length - 1])); } nearestReference(e, t) { const i = this.references.map((n, o) => ({ idx: o, - prefixLen: Ih(n.uri.toString(), e.toString()), + prefixLen: Th(n.uri.toString(), e.toString()), offsetDist: Math.abs(n.range.startLineNumber - t.lineNumber) * 100 + Math.abs(n.range.startColumn - t.column) })).sort((n, o) => n.prefixLen > o.prefixLen ? -1 : n.prefixLen < o.prefixLen ? 1 : n.offsetDist < o.offsetDist ? -1 : n.offsetDist > o.offsetDist ? 1 : 0)[0]; if (i) @@ -69389,7 +69389,7 @@ class uo { } referenceAt(e, t) { for (const i of this.references) - if (i.uri.toString() === e.toString() && M.containsPosition(i.range, t)) + if (i.uri.toString() === e.toString() && I.containsPosition(i.range, t)) return i; } firstReference() { @@ -69399,12 +69399,12 @@ class uo { return this.references[0]; } static _compareReferences(e, t) { - return Kt.compare(e.uri, t.uri) || M.compareRangesUsingStarts(e.range, t.range); + return Qt.compare(e.uri, t.uri) || I.compareRangesUsingStarts(e.range, t.range); } } -class gD { +class YM { constructor(e, t, i) { - this.options = t, this.styles = i, this.count = 0, this.element = Q(e, ce(".monaco-count-badge")), this.countFormat = this.options.countFormat || "{0}", this.titleFormat = this.options.titleFormat || "", this.setCount(this.options.count || 0); + this.options = t, this.styles = i, this.count = 0, this.element = O(e, de(".monaco-count-badge")), this.countFormat = this.options.countFormat || "{0}", this.titleFormat = this.options.titleFormat || "", this.setCount(this.options.count || 0); } setCount(e) { this.count = e, this.render(); @@ -69413,17 +69413,17 @@ class gD { this.titleFormat = e, this.render(); } render() { - this.element.textContent = rb(this.countFormat, this.count), this.element.title = rb(this.titleFormat, this.count), this.element.style.backgroundColor = this.styles.badgeBackground ?? "", this.element.style.color = this.styles.badgeForeground ?? "", this.styles.badgeBorder && (this.element.style.border = `1px solid ${this.styles.badgeBorder}`); + this.element.textContent = uZ(this.countFormat, this.count), this.element.title = uZ(this.titleFormat, this.count), this.element.style.backgroundColor = this.styles.badgeBackground ?? "", this.element.style.color = this.styles.badgeForeground ?? "", this.styles.badgeBorder && (this.element.style.border = `1px solid ${this.styles.badgeBorder}`); } } -class oh extends R { +class dh extends J { /** * Create a new {@link HighlightedLabel}. * * @param container The parent container to append to. */ constructor(e, t) { - super(), this.options = t, this.text = "", this.title = "", this.highlights = [], this.didEverRender = !1, this.supportIcons = (t == null ? void 0 : t.supportIcons) ?? !1, this.domNode = Q(e, ce("span.monaco-highlighted-label")); + super(), this.options = t, this.text = "", this.title = "", this.highlights = [], this.didEverRender = !1, this.supportIcons = (t == null ? void 0 : t.supportIcons) ?? !1, this.domNode = O(e, de("span.monaco-highlighted-label")); } /** * The label's DOM node. @@ -69441,46 +69441,46 @@ class oh extends R { * @returns */ set(e, t = [], i = "", n) { - e || (e = ""), n && (e = oh.escapeNewLines(e, t)), !(this.didEverRender && this.text === e && this.title === i && co(this.highlights, t)) && (this.text = e, this.title = i, this.highlights = t, this.render()); + e || (e = ""), n && (e = dh.escapeNewLines(e, t)), !(this.didEverRender && this.text === e && this.title === i && uo(this.highlights, t)) && (this.text = e, this.title = i, this.highlights = t, this.render()); } render() { var i, n, o; const e = []; let t = 0; - for (const r of this.highlights) { - if (r.end === r.start) + for (const l of this.highlights) { + if (l.end === l.start) continue; - if (t < r.start) { - const c = this.text.substring(t, r.start); - this.supportIcons ? e.push(...ih(c)) : e.push(c), t = r.start; + if (t < l.start) { + const d = this.text.substring(t, l.start); + this.supportIcons ? e.push(...lh(d)) : e.push(d), t = l.start; } - const l = this.text.substring(t, r.end), a = ce("span.highlight", void 0, ...this.supportIcons ? ih(l) : [l]); - r.extraClasses && a.classList.add(...r.extraClasses), e.push(a), t = r.end; + const r = this.text.substring(t, l.end), c = de("span.highlight", void 0, ...this.supportIcons ? lh(r) : [r]); + l.extraClasses && c.classList.add(...l.extraClasses), e.push(c), t = l.end; } if (t < this.text.length) { - const r = this.text.substring(t); - this.supportIcons ? e.push(...ih(r)) : e.push(r); + const l = this.text.substring(t); + this.supportIcons ? e.push(...lh(l)) : e.push(l); } - if (In(this.domNode, ...e), (n = (i = this.options) == null ? void 0 : i.hoverDelegate) != null && n.showNativeHover) + if (Rn(this.domNode, ...e), (n = (i = this.options) == null ? void 0 : i.hoverDelegate) != null && n.showNativeHover) this.domNode.title = this.title; else if (!this.customHover && this.title !== "") { - const r = ((o = this.options) == null ? void 0 : o.hoverDelegate) ?? As("mouse"); - this.customHover = this._register(Fl().setupManagedHover(r, this.domNode, this.title)); + const l = ((o = this.options) == null ? void 0 : o.hoverDelegate) ?? Is("mouse"); + this.customHover = this._register(Kr().setupManagedHover(l, this.domNode, this.title)); } else this.customHover && this.customHover.update(this.title); this.didEverRender = !0; } static escapeNewLines(e, t) { let i = 0, n = 0; - return e.replace(/\r\n|\r|\n/g, (o, r) => { + return e.replace(/\r\n|\r|\n/g, (o, l) => { n = o === `\r -` ? -1 : 0, r += i; - for (const l of t) - l.end <= r || (l.start >= r && (l.start += n), l.end >= r && (l.end += n)); +` ? -1 : 0, l += i; + for (const r of t) + r.end <= l || (r.start >= l && (r.start += n), r.end >= l && (r.end += n)); return i += n, "⏎"; }); } } -class B0 { +class j0 { constructor(e) { this._element = e; } @@ -69491,7 +69491,7 @@ class B0 { this.disposed || e === this._textContent || (this._textContent = e, this._element.textContent = e); } set classNames(e) { - this.disposed || co(e, this._classNames) || (this._classNames = e, this._element.classList.value = "", this._element.classList.add(...e)); + this.disposed || uo(e, this._classNames) || (this._classNames = e, this._element.classList.value = "", this._element.classList.add(...e)); } set empty(e) { this.disposed || e === this._empty || (this._empty = e, this._element.style.marginLeft = e ? "0" : ""); @@ -69500,29 +69500,29 @@ class B0 { this.disposed = !0; } } -class Ex extends R { +class $L extends J { constructor(e, t) { - super(), this.customHovers = /* @__PURE__ */ new Map(), this.creationOptions = t, this.domNode = this._register(new B0(Q(e, ce(".monaco-icon-label")))), this.labelContainer = Q(this.domNode.element, ce(".monaco-icon-label-container")), this.nameContainer = Q(this.labelContainer, ce("span.monaco-icon-name-container")), t != null && t.supportHighlights || t != null && t.supportIcons ? this.nameNode = this._register(new c0e(this.nameContainer, !!t.supportIcons)) : this.nameNode = new l0e(this.nameContainer), this.hoverDelegate = (t == null ? void 0 : t.hoverDelegate) ?? As("mouse"); + super(), this.customHovers = /* @__PURE__ */ new Map(), this.creationOptions = t, this.domNode = this._register(new j0(O(e, de(".monaco-icon-label")))), this.labelContainer = O(this.domNode.element, de(".monaco-icon-label-container")), this.nameContainer = O(this.labelContainer, de("span.monaco-icon-name-container")), t != null && t.supportHighlights || t != null && t.supportIcons ? this.nameNode = this._register(new tfe(this.nameContainer, !!t.supportIcons)) : this.nameNode = new $0e(this.nameContainer), this.hoverDelegate = (t == null ? void 0 : t.hoverDelegate) ?? Is("mouse"); } get element() { return this.domNode.element; } setLabel(e, t, i) { const n = ["monaco-icon-label"], o = ["monaco-icon-label-container"]; - let r = ""; - i && (i.extraClasses && n.push(...i.extraClasses), i.italic && n.push("italic"), i.strikethrough && n.push("strikethrough"), i.disabledCommand && o.push("disabled"), i.title && (typeof i.title == "string" ? r += i.title : r += e)); - const l = this.domNode.element.querySelector(".monaco-icon-label-iconpath"); + let l = ""; + i && (i.extraClasses && n.push(...i.extraClasses), i.italic && n.push("italic"), i.strikethrough && n.push("strikethrough"), i.disabledCommand && o.push("disabled"), i.title && (typeof i.title == "string" ? l += i.title : l += e)); + const r = this.domNode.element.querySelector(".monaco-icon-label-iconpath"); if (i != null && i.iconPath) { - let a; - !l || !Ki(l) ? (a = ce(".monaco-icon-label-iconpath"), this.domNode.element.prepend(a)) : a = l, a.style.backgroundImage = Pc(i == null ? void 0 : i.iconPath); - } else l && l.remove(); - if (this.domNode.classNames = n, this.domNode.element.setAttribute("aria-label", r), this.labelContainer.classList.value = "", this.labelContainer.classList.add(...o), this.setupHover(i != null && i.descriptionTitle ? this.labelContainer : this.element, i == null ? void 0 : i.title), this.nameNode.setLabel(e, i), t || this.descriptionNode) { - const a = this.getOrCreateDescriptionNode(); - a instanceof oh ? (a.set(t || "", i ? i.descriptionMatches : void 0, void 0, i == null ? void 0 : i.labelEscapeNewLines), this.setupHover(a.element, i == null ? void 0 : i.descriptionTitle)) : (a.textContent = t && (i != null && i.labelEscapeNewLines) ? oh.escapeNewLines(t, []) : t || "", this.setupHover(a.element, (i == null ? void 0 : i.descriptionTitle) || ""), a.empty = !t); + let c; + !r || !Oi(r) ? (c = de(".monaco-icon-label-iconpath"), this.domNode.element.prepend(c)) : c = r, c.style.backgroundImage = Bd(i == null ? void 0 : i.iconPath); + } else r && r.remove(); + if (this.domNode.classNames = n, this.domNode.element.setAttribute("aria-label", l), this.labelContainer.classList.value = "", this.labelContainer.classList.add(...o), this.setupHover(i != null && i.descriptionTitle ? this.labelContainer : this.element, i == null ? void 0 : i.title), this.nameNode.setLabel(e, i), t || this.descriptionNode) { + const c = this.getOrCreateDescriptionNode(); + c instanceof dh ? (c.set(t || "", i ? i.descriptionMatches : void 0, void 0, i == null ? void 0 : i.labelEscapeNewLines), this.setupHover(c.element, i == null ? void 0 : i.descriptionTitle)) : (c.textContent = t && (i != null && i.labelEscapeNewLines) ? dh.escapeNewLines(t, []) : t || "", this.setupHover(c.element, (i == null ? void 0 : i.descriptionTitle) || ""), c.empty = !t); } if (i != null && i.suffix || this.suffixNode) { - const a = this.getOrCreateSuffixNode(); - a.textContent = (i == null ? void 0 : i.suffix) ?? ""; + const c = this.getOrCreateSuffixNode(); + c.textContent = (i == null ? void 0 : i.suffix) ?? ""; } } setupHover(e, t) { @@ -69532,11 +69532,11 @@ class Ex extends R { return; } if (this.hoverDelegate.showNativeHover) - (function(o, r) { - Vs(r) ? o.title = EK(r) : r != null && r.markdownNotSupportedFallback ? o.title = r.markdownNotSupportedFallback : o.removeAttribute("title"); + (function(o, l) { + vs(l) ? o.title = WO(l) : l != null && l.markdownNotSupportedFallback ? o.title = l.markdownNotSupportedFallback : o.removeAttribute("title"); })(e, t); else { - const n = Fl().setupManagedHover(this.hoverDelegate, e, t); + const n = Kr().setupManagedHover(this.hoverDelegate, e, t); n && this.customHovers.set(e, n); } } @@ -69548,178 +69548,178 @@ class Ex extends R { } getOrCreateSuffixNode() { if (!this.suffixNode) { - const e = this._register(new B0(r$(this.nameContainer, ce("span.monaco-icon-suffix-container")))); - this.suffixNode = this._register(new B0(Q(e.element, ce("span.label-suffix")))); + const e = this._register(new j0(q$(this.nameContainer, de("span.monaco-icon-suffix-container")))); + this.suffixNode = this._register(new j0(O(e.element, de("span.label-suffix")))); } return this.suffixNode; } getOrCreateDescriptionNode() { var e; if (!this.descriptionNode) { - const t = this._register(new B0(Q(this.labelContainer, ce("span.monaco-icon-description-container")))); - (e = this.creationOptions) != null && e.supportDescriptionHighlights ? this.descriptionNode = this._register(new oh(Q(t.element, ce("span.label-description")), { supportIcons: !!this.creationOptions.supportIcons })) : this.descriptionNode = this._register(new B0(Q(t.element, ce("span.label-description")))); + const t = this._register(new j0(O(this.labelContainer, de("span.monaco-icon-description-container")))); + (e = this.creationOptions) != null && e.supportDescriptionHighlights ? this.descriptionNode = this._register(new dh(O(t.element, de("span.label-description")), { supportIcons: !!this.creationOptions.supportIcons })) : this.descriptionNode = this._register(new j0(O(t.element, de("span.label-description")))); } return this.descriptionNode; } } -class l0e { +class $0e { constructor(e) { this.container = e, this.label = void 0, this.singleLabel = void 0; } setLabel(e, t) { - if (!(this.label === e && co(this.options, t))) + if (!(this.label === e && uo(this.options, t))) if (this.label = e, this.options = t, typeof e == "string") - this.singleLabel || (this.container.innerText = "", this.container.classList.remove("multiple"), this.singleLabel = Q(this.container, ce("a.label-name", { id: t == null ? void 0 : t.domId }))), this.singleLabel.textContent = e; + this.singleLabel || (this.container.innerText = "", this.container.classList.remove("multiple"), this.singleLabel = O(this.container, de("a.label-name", { id: t == null ? void 0 : t.domId }))), this.singleLabel.textContent = e; else { this.container.innerText = "", this.container.classList.add("multiple"), this.singleLabel = void 0; for (let i = 0; i < e.length; i++) { const n = e[i], o = (t == null ? void 0 : t.domId) && `${t == null ? void 0 : t.domId}_${i}`; - Q(this.container, ce("a.label-name", { id: o, "data-icon-label-count": e.length, "data-icon-label-index": i, role: "treeitem" }, n)), i < e.length - 1 && Q(this.container, ce("span.label-separator", void 0, (t == null ? void 0 : t.separator) || "/")); + O(this.container, de("a.label-name", { id: o, "data-icon-label-count": e.length, "data-icon-label-index": i, role: "treeitem" }, n)), i < e.length - 1 && O(this.container, de("span.label-separator", void 0, (t == null ? void 0 : t.separator) || "/")); } } } } -function a0e(s, e, t) { +function efe(s, e, t) { if (!t) return; let i = 0; return s.map((n) => { - const o = { start: i, end: i + n.length }, r = t.map((l) => vn.intersect(o, l)).filter((l) => !vn.isEmpty(l)).map(({ start: l, end: a }) => ({ start: l - i, end: a - i })); - return i = o.end + e.length, r; + const o = { start: i, end: i + n.length }, l = t.map((r) => Tn.intersect(o, r)).filter((r) => !Tn.isEmpty(r)).map(({ start: r, end: c }) => ({ start: r - i, end: c - i })); + return i = o.end + e.length, l; }); } -class c0e extends R { +class tfe extends J { constructor(e, t) { super(), this.container = e, this.supportIcons = t, this.label = void 0, this.singleLabel = void 0; } setLabel(e, t) { - if (!(this.label === e && co(this.options, t))) + if (!(this.label === e && uo(this.options, t))) if (this.label = e, this.options = t, typeof e == "string") - this.singleLabel || (this.container.innerText = "", this.container.classList.remove("multiple"), this.singleLabel = this._register(new oh(Q(this.container, ce("a.label-name", { id: t == null ? void 0 : t.domId })), { supportIcons: this.supportIcons }))), this.singleLabel.set(e, t == null ? void 0 : t.matches, void 0, t == null ? void 0 : t.labelEscapeNewLines); + this.singleLabel || (this.container.innerText = "", this.container.classList.remove("multiple"), this.singleLabel = this._register(new dh(O(this.container, de("a.label-name", { id: t == null ? void 0 : t.domId })), { supportIcons: this.supportIcons }))), this.singleLabel.set(e, t == null ? void 0 : t.matches, void 0, t == null ? void 0 : t.labelEscapeNewLines); else { this.container.innerText = "", this.container.classList.add("multiple"), this.singleLabel = void 0; - const i = (t == null ? void 0 : t.separator) || "/", n = a0e(e, i, t == null ? void 0 : t.matches); + const i = (t == null ? void 0 : t.separator) || "/", n = efe(e, i, t == null ? void 0 : t.matches); for (let o = 0; o < e.length; o++) { - const r = e[o], l = n ? n[o] : void 0, a = (t == null ? void 0 : t.domId) && `${t == null ? void 0 : t.domId}_${o}`, c = ce("a.label-name", { id: a, "data-icon-label-count": e.length, "data-icon-label-index": o, role: "treeitem" }); - this._register(new oh(Q(this.container, c), { supportIcons: this.supportIcons })).set(r, l, void 0, t == null ? void 0 : t.labelEscapeNewLines), o < e.length - 1 && Q(c, ce("span.label-separator", void 0, i)); + const l = e[o], r = n ? n[o] : void 0, c = (t == null ? void 0 : t.domId) && `${t == null ? void 0 : t.domId}_${o}`, d = de("a.label-name", { id: c, "data-icon-label-count": e.length, "data-icon-label-index": o, role: "treeitem" }); + this._register(new dh(O(this.container, d), { supportIcons: this.supportIcons })).set(l, r, void 0, t == null ? void 0 : t.labelEscapeNewLines), o < e.length - 1 && O(d, de("span.label-separator", void 0, i)); } } } } -const Nb = $e("labelService"); -var OI = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +const kZ = $e("labelService"); +var lC = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, HI = function(s, e) { +}, rC = function(s, e) { return function(t, i) { e(t, i, s); }; -}, mD; -let pD = class { +}, kM; +let vM = class { constructor(e) { this._resolverService = e; } hasChildren(e) { - return e instanceof uo || e instanceof G1; + return e instanceof bo || e instanceof _W; } getChildren(e) { - if (e instanceof uo) + if (e instanceof bo) return e.groups; - if (e instanceof G1) + if (e instanceof _W) return e.resolve(this._resolverService).then((t) => t.children); throw new Error("bad tree"); } }; -pD = OI([ - HI(0, Ys) -], pD); -class d0e { +vM = lC([ + rC(0, As) +], vM); +class ife { getHeight() { return 23; } getTemplateId(e) { - return e instanceof G1 ? Xx.id : Fx.id; + return e instanceof _W ? eI.id : tI.id; } } -let fD = class { +let JM = class { constructor(e) { this._keybindingService = e; } getKeyboardNavigationLabel(e) { var t; - if (e instanceof Ph) { + if (e instanceof Bh) { const i = (t = e.parent.getPreview(e)) == null ? void 0 : t.preview(e.range); if (i) return i.value; } - return Cr(e.uri); + return Vl(e.uri); } }; -fD = OI([ - HI(0, xt) -], fD); -class h0e { +JM = lC([ + rC(0, Lt) +], JM); +class nfe { getId(e) { - return e instanceof Ph ? e.id : e.uri; + return e instanceof Bh ? e.id : e.uri; } } -let bD = class extends R { +let HM = class extends J { constructor(e, t) { super(), this._labelService = t; const i = document.createElement("div"); - i.classList.add("reference-file"), this.file = this._register(new Ex(i, { supportHighlights: !0 })), this.badge = new gD(Q(i, ce(".count")), {}, u4), e.appendChild(i); + i.classList.add("reference-file"), this.file = this._register(new $L(i, { supportHighlights: !0 })), this.badge = new YM(O(i, de(".count")), {}, _O), e.appendChild(i); } set(e, t) { - const i = bI(e.uri); + const i = Tx(e.uri); this.file.setLabel(this._labelService.getUriBasenameLabel(e.uri), this._labelService.getUriLabel(i, { relative: !0 }), { title: this._labelService.getUriLabel(e.uri), matches: t }); const n = e.children.length; this.badge.setCount(n), n > 1 ? this.badge.setTitleFormat(p("referencesCount", "{0} references", n)) : this.badge.setTitleFormat(p("referenceCount", "{0} reference", n)); } }; -bD = OI([ - HI(1, Nb) -], bD); -var xg; -let Xx = (xg = class { +HM = lC([ + rC(1, kZ) +], HM); +var Rm; +let eI = (Rm = class { constructor(e) { - this._instantiationService = e, this.templateId = mD.id; + this._instantiationService = e, this.templateId = kM.id; } renderTemplate(e) { - return this._instantiationService.createInstance(bD, e); + return this._instantiationService.createInstance(HM, e); } renderElement(e, t, i) { - i.set(e.element, AI(e.filterData)); + i.set(e.element, Hx(e.filterData)); } disposeTemplate(e) { e.dispose(); } -}, mD = xg, xg.id = "FileReferencesRenderer", xg); -Xx = mD = OI([ - HI(0, Se) -], Xx); -class u0e extends R { +}, kM = Rm, Rm.id = "FileReferencesRenderer", Rm); +eI = kM = lC([ + rC(0, Ge) +], eI); +class sfe extends J { constructor(e) { - super(), this.label = this._register(new oh(e)); + super(), this.label = this._register(new dh(e)); } set(e, t) { var n; const i = (n = e.parent.getPreview(e)) == null ? void 0 : n.preview(e.range); if (!i || !i.value) - this.label.set(`${Cr(e.uri)}:${e.range.startLineNumber + 1}:${e.range.startColumn + 1}`); + this.label.set(`${Vl(e.uri)}:${e.range.startLineNumber + 1}:${e.range.startColumn + 1}`); else { - const { value: o, highlight: r } = i; - t && !Il.isDefault(t) ? (this.label.element.classList.toggle("referenceMatch", !1), this.label.set(o, AI(t))) : (this.label.element.classList.toggle("referenceMatch", !0), this.label.set(o, [r])); + const { value: o, highlight: l } = i; + t && !Tr.isDefault(t) ? (this.label.element.classList.toggle("referenceMatch", !1), this.label.set(o, Hx(t))) : (this.label.element.classList.toggle("referenceMatch", !0), this.label.set(o, [l])); } } } -const TZ = class TZ { +const B2 = class B2 { constructor() { - this.templateId = TZ.id; + this.templateId = B2.id; } renderTemplate(e) { - return new u0e(e); + return new sfe(e); } renderElement(e, t, i) { i.set(e.element, e.filterData); @@ -69728,9 +69728,9 @@ const TZ = class TZ { e.dispose(); } }; -TZ.id = "OneReferenceRenderer"; -let Fx = TZ; -class g0e { +B2.id = "OneReferenceRenderer"; +let tI = B2; +class ofe { getWidgetAriaLabel() { return p("treeAriaLabel", "References"); } @@ -69738,19 +69738,19 @@ class g0e { return e.ariaMessage; } } -var m0e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var lfe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, up = function(s, e) { +}, Zp = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const DZ = class DZ { +const _2 = class _2 { constructor(e, t) { - this._editor = e, this._model = t, this._decorations = /* @__PURE__ */ new Map(), this._decorationIgnoreSet = /* @__PURE__ */ new Set(), this._callOnDispose = new U(), this._callOnModelChange = new U(), this._callOnDispose.add(this._editor.onDidChangeModel(() => this._onModelChanged())), this._onModelChanged(); + this._editor = e, this._model = t, this._decorations = /* @__PURE__ */ new Map(), this._decorationIgnoreSet = /* @__PURE__ */ new Set(), this._callOnDispose = new _(), this._callOnModelChange = new _(), this._callOnDispose.add(this._editor.onDidChangeModel(() => this._onModelChanged())), this._onModelChanged(); } dispose() { this._callOnModelChange.dispose(), this._callOnDispose.dispose(), this.removeDecorations(); @@ -69772,16 +69772,16 @@ const DZ = class DZ { this._callOnModelChange.add(this._editor.getModel().onDidChangeDecorations(() => this._onDecorationChanged())); const t = [], i = []; for (let n = 0, o = e.children.length; n < o; n++) { - const r = e.children[n]; - this._decorationIgnoreSet.has(r.id) || r.uri.toString() === this._editor.getModel().uri.toString() && (t.push({ - range: r.range, - options: DZ.DecorationOptions + const l = e.children[n]; + this._decorationIgnoreSet.has(l.id) || l.uri.toString() === this._editor.getModel().uri.toString() && (t.push({ + range: l.range, + options: _2.DecorationOptions }), i.push(n)); } this._editor.changeDecorations((n) => { const o = n.deltaDecorations([], t); - for (let r = 0; r < o.length; r++) - this._decorations.set(o[r], e.children[i[r]]); + for (let l = 0; l < o.length; l++) + this._decorations.set(o[l], e.children[i[l]]); }); } _onDecorationChanged() { @@ -69791,15 +69791,15 @@ const DZ = class DZ { const o = t.getDecorationRange(i); if (!o) continue; - let r = !1; - if (!M.equalsRange(o, n.range)) { - if (M.spansMultipleLines(o)) - r = !0; + let l = !1; + if (!I.equalsRange(o, n.range)) { + if (I.spansMultipleLines(o)) + l = !0; else { - const l = n.range.endColumn - n.range.startColumn, a = o.endColumn - o.startColumn; - l !== a && (r = !0); + const r = n.range.endColumn - n.range.startColumn, c = o.endColumn - o.startColumn; + r !== c && (l = !0); } - r ? (this._decorationIgnoreSet.add(n.id), e.push(i)) : n.range = o; + l ? (this._decorationIgnoreSet.add(n.id), e.push(i)) : n.range = o; } } for (let i = 0, n = e.length; i < n; i++) @@ -69811,13 +69811,13 @@ const DZ = class DZ { this._editor.removeDecorations([...this._decorations.keys()]), this._decorations.clear(); } }; -DZ.DecorationOptions = Re.register({ +_2.DecorationOptions = Je.register({ description: "reference-decoration", stickiness: 1, className: "reference-decoration" }); -let yD = DZ; -class p0e { +let EM = _2; +class rfe { constructor() { this.ratio = 0.7, this.heightInLines = 18; } @@ -69834,26 +69834,26 @@ class p0e { }; } } -class f0e extends uD { +class cfe extends MM { } -let wD = class extends Wx { - constructor(e, t, i, n, o, r, l, a, c) { - super(e, { showFrame: !1, showArrow: !0, isResizeable: !0, isAccessible: !0, supportOnTitleClick: !0 }, r), this._defaultTreeKeyboardSupport = t, this.layoutData = i, this._textModelResolverService = o, this._instantiationService = r, this._peekViewService = l, this._uriLabel = a, this._keybindingService = c, this._disposeOnNewModel = new U(), this._callOnDispose = new U(), this._onDidSelectReference = new k(), this.onDidSelectReference = this._onDidSelectReference.event, this._dim = new Lt(0, 0), this._isClosing = !1, this._applyTheme(n.getColorTheme()), this._callOnDispose.add(n.onDidColorThemeChange(this._applyTheme.bind(this))), this._peekViewService.addExclusiveWidget(e, this), this.create(); +let DM = class extends UL { + constructor(e, t, i, n, o, l, r, c, d) { + super(e, { showFrame: !1, showArrow: !0, isResizeable: !0, isAccessible: !0, supportOnTitleClick: !0 }, l), this._defaultTreeKeyboardSupport = t, this.layoutData = i, this._textModelResolverService = o, this._instantiationService = l, this._peekViewService = r, this._uriLabel = c, this._keybindingService = d, this._disposeOnNewModel = new _(), this._callOnDispose = new _(), this._onDidSelectReference = new k(), this.onDidSelectReference = this._onDidSelectReference.event, this._dim = new Xt(0, 0), this._isClosing = !1, this._applyTheme(n.getColorTheme()), this._callOnDispose.add(n.onDidColorThemeChange(this._applyTheme.bind(this))), this._peekViewService.addExclusiveWidget(e, this), this.create(); } get isClosing() { return this._isClosing; } dispose() { - this._isClosing = !0, this.setModel(void 0), this._callOnDispose.dispose(), this._disposeOnNewModel.dispose(), Wt(this._preview), Wt(this._previewNotAvailableMessage), Wt(this._tree), Wt(this._previewModelReference), this._splitView.dispose(), super.dispose(); + this._isClosing = !0, this.setModel(void 0), this._callOnDispose.dispose(), this._disposeOnNewModel.dispose(), Nt(this._preview), Nt(this._previewNotAvailableMessage), Nt(this._tree), Nt(this._previewModelReference), this._splitView.dispose(), super.dispose(); } _applyTheme(e) { - const t = e.getColor(qfe) || K.transparent; + const t = e.getColor(KZe) || Q.transparent; this.style({ arrowColor: t, frameColor: t, - headerBackgroundColor: e.getColor(jfe) || K.transparent, - primaryHeadingColor: e.getColor(WQ), - secondaryHeadingColor: e.getColor(vQ) + headerBackgroundColor: e.getColor(AZe) || Q.transparent, + primaryHeadingColor: e.getColor(u4), + secondaryHeadingColor: e.getColor(m4) }); } show(e) { @@ -69876,10 +69876,10 @@ let wD = class extends Wx { }); } _fillBody(e) { - this.setCssClass("reference-zone-widget"), this._messageContainer = Q(e, ce("div.messages")), rs(this._messageContainer), this._splitView = new VQ(e, { + this.setCssClass("reference-zone-widget"), this._messageContainer = O(e, de("div.messages")), cs(this._messageContainer), this._splitView = new g4(e, { orientation: 1 /* Orientation.HORIZONTAL */ - }), this._previewContainer = Q(e, ce("div.preview.inline")); + }), this._previewContainer = O(e, de("div.preview.inline")); const t = { scrollBeyondLastLine: !1, scrollbar: { @@ -69896,27 +69896,27 @@ let wD = class extends Wx { enabled: !1 } }; - this._preview = this._instantiationService.createInstance(Qr, this._previewContainer, t, {}, this.editor), rs(this._previewContainer), this._previewNotAvailableMessage = this._instantiationService.createInstance(Al, p("missingPreviewMessage", "no preview available"), ms, Al.DEFAULT_CREATION_OPTIONS, null), this._treeContainer = Q(e, ce("div.ref-tree.inline")); + this._preview = this._instantiationService.createInstance($l, this._previewContainer, t, {}, this.editor), cs(this._previewContainer), this._previewNotAvailableMessage = this._instantiationService.createInstance(xr, p("missingPreviewMessage", "no preview available"), gs, xr.DEFAULT_CREATION_OPTIONS, null), this._treeContainer = O(e, de("div.ref-tree.inline")); const i = { keyboardSupport: this._defaultTreeKeyboardSupport, - accessibilityProvider: new g0e(), - keyboardNavigationLabelProvider: this._instantiationService.createInstance(fD), - identityProvider: new h0e(), + accessibilityProvider: new ofe(), + keyboardNavigationLabelProvider: this._instantiationService.createInstance(JM), + identityProvider: new nfe(), openOnSingleClick: !0, selectionNavigation: !0, overrideStyles: { - listBackground: $fe + listBackground: UZe } }; - this._defaultTreeKeyboardSupport && this._callOnDispose.add(ai(this._treeContainer, "keydown", (o) => { + this._defaultTreeKeyboardSupport && this._callOnDispose.add(di(this._treeContainer, "keydown", (o) => { o.equals( 9 /* KeyCode.Escape */ ) && (this._keybindingService.dispatchEvent(o, o.target), o.stopPropagation()); - }, !0)), this._tree = this._instantiationService.createInstance(f0e, "ReferencesWidget", this._treeContainer, new d0e(), [ - this._instantiationService.createInstance(Xx), - this._instantiationService.createInstance(Fx) - ], this._instantiationService.createInstance(pD), i), this._splitView.addView({ + }, !0)), this._tree = this._instantiationService.createInstance(cfe, "ReferencesWidget", this._treeContainer, new ife(), [ + this._instantiationService.createInstance(eI), + this._instantiationService.createInstance(tI) + ], this._instantiationService.createInstance(vM), i), this._splitView.addView({ onDidChange: se.None, element: this._previewContainer, minimumSize: 200, @@ -69924,7 +69924,7 @@ let wD = class extends Wx { layout: (o) => { this._preview.layout({ height: this._dim.height, width: o }); } - }, vx.Distribute), this._splitView.addView({ + }, PL.Distribute), this._splitView.addView({ onDidChange: se.None, element: this._treeContainer, minimumSize: 100, @@ -69932,21 +69932,21 @@ let wD = class extends Wx { layout: (o) => { this._treeContainer.style.height = `${this._dim.height}px`, this._treeContainer.style.width = `${o}px`, this._tree.layout(this._dim.height, o); } - }, vx.Distribute), this._disposables.add(this._splitView.onDidSashChange(() => { + }, PL.Distribute), this._disposables.add(this._splitView.onDidSashChange(() => { this._dim.width && (this.layoutData.ratio = this._splitView.getViewSize(0) / this._dim.width); }, void 0)); - const n = (o, r) => { - o instanceof Ph && (r === "show" && this._revealReference(o, !1), this._onDidSelectReference.fire({ element: o, kind: r, source: "tree" })); + const n = (o, l) => { + o instanceof Bh && (l === "show" && this._revealReference(o, !1), this._onDidSelectReference.fire({ element: o, kind: l, source: "tree" })); }; this._disposables.add(this._tree.onDidOpen((o) => { o.sideBySide ? n(o.element, "side") : o.editorOptions.pinned ? n(o.element, "goto") : n(o.element, "show"); - })), rs(this._treeContainer); + })), cs(this._treeContainer); } _onWidth(e) { this._dim && this._doLayoutBody(this._dim.height, e); } _doLayoutBody(e, t) { - super._doLayoutBody(e, t), this._dim = new Lt(t, e), this.layoutData.heightInLines = this._viewZone ? this._viewZone.heightInLines : this.layoutData.heightInLines, this._splitView.layout(t), this._splitView.resizeView(0, t * this.layoutData.ratio); + super._doLayoutBody(e, t), this._dim = new Xt(t, e), this.layoutData.heightInLines = this._viewZone ? this._viewZone.heightInLines : this.layoutData.heightInLines, this._splitView.layout(t), this._splitView.resizeView(0, t * this.layoutData.ratio); } setSelection(e) { return this._revealReference(e, !0).then(() => { @@ -69957,7 +69957,7 @@ let wD = class extends Wx { return this._disposeOnNewModel.clear(), this._model = e, this._model ? this._onNewModel() : Promise.resolve(); } _onNewModel() { - return this._model ? this._model.isEmpty ? (this.setTitle(""), this._messageContainer.innerText = p("noResults", "No results"), no(this._messageContainer), Promise.resolve(void 0)) : (rs(this._messageContainer), this._decorationsManager = new yD(this._preview, this._model), this._disposeOnNewModel.add(this._decorationsManager), this._disposeOnNewModel.add(this._model.onDidChangeReferenceRange((e) => this._tree.rerender(e))), this._disposeOnNewModel.add(this._preview.onMouseDown((e) => { + return this._model ? this._model.isEmpty ? (this.setTitle(""), this._messageContainer.innerText = p("noResults", "No results"), oo(this._messageContainer), Promise.resolve(void 0)) : (cs(this._messageContainer), this._decorationsManager = new EM(this._preview, this._model), this._disposeOnNewModel.add(this._decorationsManager), this._disposeOnNewModel.add(this._model.onDidChangeReferenceRange((e) => this._tree.rerender(e))), this._disposeOnNewModel.add(this._preview.onMouseDown((e) => { const { event: t, target: i } = e; if (t.detail !== 2) return; @@ -69967,13 +69967,13 @@ let wD = class extends Wx { kind: t.ctrlKey || t.metaKey || t.altKey ? "side" : "open", source: "editor" }); - })), this.container.classList.add("results-loaded"), no(this._treeContainer), no(this._previewContainer), this._splitView.layout(this._dim.width), this.focusOnReferenceTree(), this._tree.setInput(this._model.groups.length === 1 ? this._model.groups[0] : this._model)) : Promise.resolve(void 0); + })), this.container.classList.add("results-loaded"), oo(this._treeContainer), oo(this._previewContainer), this._splitView.layout(this._dim.width), this.focusOnReferenceTree(), this._tree.setInput(this._model.groups.length === 1 ? this._model.groups[0] : this._model)) : Promise.resolve(void 0); } _getFocusedReference() { const [e] = this._tree.getFocus(); - if (e instanceof Ph) + if (e instanceof Bh) return e; - if (e instanceof G1 && e.children.length > 0) + if (e instanceof _W && e.children.length > 0) return e.children[0]; } async revealReference(e) { @@ -69982,7 +69982,7 @@ let wD = class extends Wx { async _revealReference(e, t) { if (this._revealedReference === e) return; - this._revealedReference = e, e.uri.scheme !== Ge.inMemory ? this.setTitle(Kle(e.uri), this._uriLabel.getUriLabel(bI(e.uri))) : this.setTitle(p("peekView.alternateTitle", "References")); + this._revealedReference = e, e.uri.scheme !== ve.inMemory ? this.setTitle(Fce(e.uri), this._uriLabel.getUriLabel(Tx(e.uri))) : this.setTitle(p("peekView.alternateTitle", "References")); const i = this._textModelResolverService.createModelReference(e.uri); this._tree.getInput() === e.parent ? this._tree.reveal(e) : (t && this._tree.reveal(e.parent), await this._tree.expand(e.parent), this._tree.reveal(e)); const n = await i; @@ -69990,41 +69990,41 @@ let wD = class extends Wx { n.dispose(); return; } - Wt(this._previewModelReference); + Nt(this._previewModelReference); const o = n.object; if (o) { - const r = this._preview.getModel() === o.textEditorModel ? 0 : 1, l = M.lift(e.range).collapseToStart(); - this._previewModelReference = n, this._preview.setModel(o.textEditorModel), this._preview.setSelection(l), this._preview.revealRangeInCenter(l, r); + const l = this._preview.getModel() === o.textEditorModel ? 0 : 1, r = I.lift(e.range).collapseToStart(); + this._previewModelReference = n, this._preview.setModel(o.textEditorModel), this._preview.setSelection(r), this._preview.revealRangeInCenter(r, l); } else this._preview.setModel(this._previewNotAvailableMessage), n.dispose(); } }; -wD = m0e([ - up(3, Pi), - up(4, Ys), - up(5, Se), - up(6, NQ), - up(7, Nb), - up(8, xt) -], wD); -var b0e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +DM = lfe([ + Zp(3, Ki), + Zp(4, As), + Zp(5, Ge), + Zp(6, h4), + Zp(7, kZ), + Zp(8, Lt) +], DM); +var dfe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, gp = function(s, e) { +}, fp = function(s, e) { return function(t, i) { e(t, i, s); }; -}, RL; -const Jm = new ae("referenceSearchVisible", !1, p("referenceSearchVisible", "Whether reference peek is visible, like 'Peek References' or 'Peek Definition'")); -var Mg; -let R1 = (Mg = class { +}, qX; +const qb = new ce("referenceSearchVisible", !1, p("referenceSearchVisible", "Whether reference peek is visible, like 'Peek References' or 'Peek Definition'")); +var Nm; +let QW = (Nm = class { static get(e) { - return e.getContribution(RL.ID); + return e.getContribution(qX.ID); } - constructor(e, t, i, n, o, r, l, a) { - this._defaultTreeKeyboardSupport = e, this._editor = t, this._editorService = n, this._notificationService = o, this._instantiationService = r, this._storageService = l, this._configurationService = a, this._disposables = new U(), this._requestIdPool = 0, this._ignoreModelChangeEvent = !1, this._referenceSearchVisible = Jm.bindTo(i); + constructor(e, t, i, n, o, l, r, c) { + this._defaultTreeKeyboardSupport = e, this._editor = t, this._editorService = n, this._notificationService = o, this._instantiationService = l, this._storageService = r, this._configurationService = c, this._disposables = new _(), this._requestIdPool = 0, this._ignoreModelChangeEvent = !1, this._referenceSearchVisible = qb.bindTo(i); } dispose() { var e, t; @@ -70039,8 +70039,8 @@ let R1 = (Mg = class { })), this._disposables.add(this._editor.onDidChangeModel(() => { this._ignoreModelChangeEvent || this.closeWidget(); })); - const o = "peekViewLayout", r = p0e.fromJSON(this._storageService.get(o, 0, "{}")); - this._widget = this._instantiationService.createInstance(wD, this._editor, this._defaultTreeKeyboardSupport, r), this._widget.setTitle(p("labelLoading", "Loading...")), this._widget.show(e), this._disposables.add(this._widget.onDidClose(() => { + const o = "peekViewLayout", l = rfe.fromJSON(this._storageService.get(o, 0, "{}")); + this._widget = this._instantiationService.createInstance(DM, this._editor, this._defaultTreeKeyboardSupport, l), this._widget.setTitle(p("labelLoading", "Loading...")), this._widget.show(e), this._disposables.add(this._widget.onDidClose(() => { t.cancel(), this._widget ? (this._storageService.store( o, JSON.stringify(this._widget.layoutData), @@ -70048,32 +70048,32 @@ let R1 = (Mg = class { 1 /* StorageTarget.MACHINE */ ), this._widget.isClosing || this.closeWidget(), this._widget = void 0) : this.closeWidget(); - })), this._disposables.add(this._widget.onDidSelectReference((a) => { - const { element: c, kind: d } = a; - if (c) - switch (d) { + })), this._disposables.add(this._widget.onDidSelectReference((c) => { + const { element: d, kind: a } = c; + if (d) + switch (a) { case "open": - (a.source !== "editor" || !this._configurationService.getValue("editor.stablePeek")) && this.openReference(c, !1, !1); + (c.source !== "editor" || !this._configurationService.getValue("editor.stablePeek")) && this.openReference(d, !1, !1); break; case "side": - this.openReference(c, !0, !1); + this.openReference(d, !0, !1); break; case "goto": - i ? this._gotoReference(c, !0) : this.openReference(c, !1, !0); + i ? this._gotoReference(d, !0) : this.openReference(d, !1, !0); break; } })); - const l = ++this._requestIdPool; - t.then((a) => { - var c; - if (l !== this._requestIdPool || !this._widget) { - a.dispose(); + const r = ++this._requestIdPool; + t.then((c) => { + var d; + if (r !== this._requestIdPool || !this._widget) { + c.dispose(); return; } - return (c = this._model) == null || c.dispose(), this._model = a, this._widget.setModel(this._model).then(() => { + return (d = this._model) == null || d.dispose(), this._model = c, this._widget.setModel(this._model).then(() => { if (this._widget && this._model && this._editor.hasModel()) { this._model.isEmpty ? this._widget.setMetaTitle("") : this._widget.setMetaTitle(p("metaTitle.N", "{0} ({1})", this._model.title, this._model.references.length)); - const d = this._editor.getModel().uri, h = new V(e.startLineNumber, e.startColumn), u = this._model.nearestReference(d, h); + const a = this._editor.getModel().uri, h = new Y(e.startLineNumber, e.startColumn), u = this._model.nearestReference(a, h); if (u) return this._widget.setSelection(u).then(() => { this._widget && this._editor.getOption( @@ -70083,8 +70083,8 @@ let R1 = (Mg = class { }); } }); - }, (a) => { - this._notificationService.error(a); + }, (c) => { + this._notificationService.error(c); }); } changeFocusBetweenPreviewAndReferences() { @@ -70099,8 +70099,8 @@ let R1 = (Mg = class { const i = this._model.nearestReference(this._editor.getModel().uri, t); if (!i) return; - const n = this._model.nextOrPreviousReference(i, e), o = this._editor.hasTextFocus(), r = this._widget.isPreviewEditorFocused(); - await this._widget.setSelection(n), await this._gotoReference(n, !1), o ? this._editor.focus() : this._widget && r && this._widget.focusOnPreviewEditor(); + const n = this._model.nextOrPreviousReference(i, e), o = this._editor.hasTextFocus(), l = this._widget.isPreviewEditorFocused(); + await this._widget.setSelection(n), await this._gotoReference(n, !1), o ? this._editor.focus() : this._widget && l && this._widget.focusOnPreviewEditor(); } async revealReference(e) { !this._editor.hasModel() || !this._model || !this._widget || await this._widget.revealReference(e); @@ -70112,7 +70112,7 @@ let R1 = (Mg = class { _gotoReference(e, t) { var n; (n = this._widget) == null || n.hide(), this._ignoreModelChangeEvent = !0; - const i = M.lift(e.range).collapseToStart(); + const i = I.lift(e.range).collapseToStart(); return this._editorService.openCodeEditor({ resource: e.uri, options: { selection: i, selectionSource: "code.jump", pinned: t } @@ -70124,11 +70124,11 @@ let R1 = (Mg = class { if (this._editor === o) this._widget.show(i), this._widget.focusOnReferenceTree(); else { - const r = RL.get(o), l = this._model.clone(); - this.closeWidget(), o.focus(), r == null || r.toggleWidget(i, Ui((a) => Promise.resolve(l)), this._peekMode ?? !1); + const l = qX.get(o), r = this._model.clone(); + this.closeWidget(), o.focus(), l == null || l.toggleWidget(i, Qi((c) => Promise.resolve(r)), this._peekMode ?? !1); } }, (o) => { - this._ignoreModelChangeEvent = !1, De(o); + this._ignoreModelChangeEvent = !1, Me(o); }); } openReference(e, t, i) { @@ -70139,38 +70139,38 @@ let R1 = (Mg = class { options: { selection: o, selectionSource: "code.jump", pinned: i } }, this._editor, t); } -}, RL = Mg, Mg.ID = "editor.contrib.referencesController", Mg); -R1 = RL = b0e([ - gp(2, _e), - gp(3, ft), - gp(4, Vi), - gp(5, Se), - gp(6, za), - gp(7, Ke) -], R1); -function Um(s, e) { - const t = Kfe(s); +}, qX = Nm, Nm.ID = "editor.contrib.referencesController", Nm); +QW = qX = dfe([ + fp(2, xe), + fp(3, gt), + fp(4, vi), + fp(5, Ge), + fp(6, Pc), + fp(7, Qe) +], QW); +function $b(s, e) { + const t = FZe(s); if (!t) return; - const i = R1.get(t); + const i = QW.get(t); i && e(i); } -ws.registerCommandAndKeybindingRule({ +Gs.registerCommandAndKeybindingRule({ id: "togglePeekWidgetFocus", weight: 100, - primary: Xi( + primary: Di( 2089, 60 /* KeyCode.F2 */ ), - when: H.or(Jm, Xs.inPeekEditor), + when: P.or(qb, Fs.inPeekEditor), handler(s) { - Um(s, (e) => { + $b(s, (e) => { e.changeFocusBetweenPreviewAndReferences(); }); } }); -ws.registerCommandAndKeybindingRule({ +Gs.registerCommandAndKeybindingRule({ id: "goToNextReference", weight: 90, primary: 62, @@ -70178,14 +70178,14 @@ ws.registerCommandAndKeybindingRule({ 70 /* KeyCode.F12 */ ], - when: H.or(Jm, Xs.inPeekEditor), + when: P.or(qb, Fs.inPeekEditor), handler(s) { - Um(s, (e) => { + $b(s, (e) => { e.goToNextOrPreviousReference(!0); }); } }); -ws.registerCommandAndKeybindingRule({ +Gs.registerCommandAndKeybindingRule({ id: "goToPreviousReference", weight: 90, primary: 1086, @@ -70193,9 +70193,9 @@ ws.registerCommandAndKeybindingRule({ 1094 /* KeyCode.F12 */ ], - when: H.or(Jm, Xs.inPeekEditor), + when: P.or(qb, Fs.inPeekEditor), handler(s) { - Um(s, (e) => { + $b(s, (e) => { e.goToNextOrPreviousReference(!1); }); } @@ -70203,8 +70203,8 @@ ws.registerCommandAndKeybindingRule({ st.registerCommandAlias("goToNextReferenceFromEmbeddedEditor", "goToNextReference"); st.registerCommandAlias("goToPreviousReferenceFromEmbeddedEditor", "goToPreviousReference"); st.registerCommandAlias("closeReferenceSearchEditor", "closeReferenceSearch"); -st.registerCommand("closeReferenceSearch", (s) => Um(s, (e) => e.closeWidget())); -ws.registerKeybindingRule({ +st.registerCommand("closeReferenceSearch", (s) => $b(s, (e) => e.closeWidget())); +Gs.registerKeybindingRule({ id: "closeReferenceSearch", weight: -1, primary: 9, @@ -70212,9 +70212,9 @@ ws.registerKeybindingRule({ 1033 /* KeyCode.Escape */ ], - when: H.and(Xs.inPeekEditor, H.not("config.editor.stablePeek")) + when: P.and(Fs.inPeekEditor, P.not("config.editor.stablePeek")) }); -ws.registerKeybindingRule({ +Gs.registerKeybindingRule({ id: "closeReferenceSearch", weight: 250, primary: 9, @@ -70222,9 +70222,9 @@ ws.registerKeybindingRule({ 1033 /* KeyCode.Escape */ ], - when: H.and(Jm, H.not("config.editor.stablePeek"), H.or(I.editorTextFocus, KQ.negate())) + when: P.and(qb, P.not("config.editor.stablePeek"), P.or(C.editorTextFocus, w4.negate())) }); -ws.registerCommandAndKeybindingRule({ +Gs.registerCommandAndKeybindingRule({ id: "revealReference", weight: 200, primary: 3, @@ -70235,14 +70235,14 @@ ws.registerCommandAndKeybindingRule({ /* KeyCode.DownArrow */ ] }, - when: H.and(Jm, qQ, L5.negate(), A5.negate()), + when: P.and(qb, Y4, BH.negate(), _H.negate()), handler(s) { var i; - const t = (i = s.get(Ar).lastFocusedList) == null ? void 0 : i.getFocus(); - Array.isArray(t) && t[0] instanceof Ph && Um(s, (n) => n.revealReference(t[0])); + const t = (i = s.get(Sl).lastFocusedList) == null ? void 0 : i.getFocus(); + Array.isArray(t) && t[0] instanceof Bh && $b(s, (n) => n.revealReference(t[0])); } }); -ws.registerCommandAndKeybindingRule({ +Gs.registerCommandAndKeybindingRule({ id: "openReferenceToSide", weight: 100, primary: 2051, @@ -70250,32 +70250,32 @@ ws.registerCommandAndKeybindingRule({ primary: 259 /* KeyCode.Enter */ }, - when: H.and(Jm, qQ, L5.negate(), A5.negate()), + when: P.and(qb, Y4, BH.negate(), _H.negate()), handler(s) { var i; - const t = (i = s.get(Ar).lastFocusedList) == null ? void 0 : i.getFocus(); - Array.isArray(t) && t[0] instanceof Ph && Um(s, (n) => n.openReference(t[0], !0, !0)); + const t = (i = s.get(Sl).lastFocusedList) == null ? void 0 : i.getFocus(); + Array.isArray(t) && t[0] instanceof Bh && $b(s, (n) => n.openReference(t[0], !0, !0)); } }); st.registerCommand("openReference", (s) => { var i; - const t = (i = s.get(Ar).lastFocusedList) == null ? void 0 : i.getFocus(); - Array.isArray(t) && t[0] instanceof Ph && Um(s, (n) => n.openReference(t[0], !1, !0)); + const t = (i = s.get(Sl).lastFocusedList) == null ? void 0 : i.getFocus(); + Array.isArray(t) && t[0] instanceof Bh && $b(s, (n) => n.openReference(t[0], !1, !0)); }); -var sj = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var D4 = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, my = function(s, e) { +}, Lf = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const I5 = new ae("hasSymbols", !1, p("hasSymbols", "Whether there are symbol locations that can be navigated via keyboard-only.")), JI = $e("ISymbolNavigationService"); -let CD = class { +const $H = new ce("hasSymbols", !1, p("hasSymbols", "Whether there are symbol locations that can be navigated via keyboard-only.")), cC = $e("ISymbolNavigationService"); +let FM = class { constructor(e, t, i, n) { - this._editorService = t, this._notificationService = i, this._keybindingService = n, this._currentModel = void 0, this._currentIdx = -1, this._ignoreEditorChange = !1, this._ctxHasSymbols = I5.bindTo(e); + this._editorService = t, this._notificationService = i, this._keybindingService = n, this._currentModel = void 0, this._currentIdx = -1, this._ignoreEditorChange = !1, this._ctxHasSymbols = $H.bindTo(e); } reset() { var e, t; @@ -70288,24 +70288,24 @@ let CD = class { return; } this._currentModel = t, this._currentIdx = t.references.indexOf(e), this._ctxHasSymbols.set(!0), this._showMessage(); - const i = new SD(this._editorService), n = i.onDidChange((o) => { + const i = new zM(this._editorService), n = i.onDidChange((o) => { if (this._ignoreEditorChange) return; - const r = this._editorService.getActiveCodeEditor(); - if (!r) + const l = this._editorService.getActiveCodeEditor(); + if (!l) return; - const l = r.getModel(), a = r.getPosition(); - if (!l || !a) + const r = l.getModel(), c = l.getPosition(); + if (!r || !c) return; - let c = !1, d = !1; + let d = !1, a = !1; for (const h of t.references) - if (d1(h.uri, l.uri)) - c = !0, d = d || M.containsPosition(h.range, a); - else if (c) + if (XW(h.uri, r.uri)) + d = !0, a = a || I.containsPosition(h.range, c); + else if (d) break; - (!c || !d) && this.reset(); + (!d || !a) && this.reset(); }); - this._currentState = Yr(i, n); + this._currentState = Kl(i, n); } revealNext(e) { if (!this._currentModel) @@ -70315,7 +70315,7 @@ let CD = class { return this._showMessage(), this._ignoreEditorChange = !0, this._editorService.openCodeEditor({ resource: t.uri, options: { - selection: M.collapseToStart(t.range), + selection: I.collapseToStart(t.range), selectionRevealType: 3 /* TextEditorSelectionRevealType.NearTopIfOutsideViewport */ } @@ -70330,23 +70330,23 @@ let CD = class { this._currentMessage = this._notificationService.status(t); } }; -CD = sj([ - my(0, _e), - my(1, ft), - my(2, Vi), - my(3, xt) -], CD); +FM = D4([ + Lf(0, xe), + Lf(1, gt), + Lf(2, vi), + Lf(3, Lt) +], FM); it( - JI, - CD, + cC, + FM, 1 /* InstantiationType.Delayed */ ); -oe(new class extends zi { +oe(new class extends Ai { constructor() { super({ id: "editor.gotoNextSymbolFromResult", - precondition: I5, + precondition: $H, kbOpts: { weight: 100, primary: 70 @@ -70355,217 +70355,217 @@ oe(new class extends zi { }); } runEditorCommand(s, e) { - return s.get(JI).revealNext(e); + return s.get(cC).revealNext(e); } }()); -ws.registerCommandAndKeybindingRule({ +Gs.registerCommandAndKeybindingRule({ id: "editor.gotoNextSymbolFromResult.cancel", weight: 100, - when: I5, + when: $H, primary: 9, handler(s) { - s.get(JI).reset(); + s.get(cC).reset(); } }); -let SD = class { +let zM = class { constructor(e) { - this._listener = /* @__PURE__ */ new Map(), this._disposables = new U(), this._onDidChange = new k(), this.onDidChange = this._onDidChange.event, this._disposables.add(e.onCodeEditorRemove(this._onDidRemoveEditor, this)), this._disposables.add(e.onCodeEditorAdd(this._onDidAddEditor, this)), e.listCodeEditors().forEach(this._onDidAddEditor, this); + this._listener = /* @__PURE__ */ new Map(), this._disposables = new _(), this._onDidChange = new k(), this.onDidChange = this._onDidChange.event, this._disposables.add(e.onCodeEditorRemove(this._onDidRemoveEditor, this)), this._disposables.add(e.onCodeEditorAdd(this._onDidAddEditor, this)), e.listCodeEditors().forEach(this._onDidAddEditor, this); } dispose() { - this._disposables.dispose(), this._onDidChange.dispose(), Wt(this._listener.values()); + this._disposables.dispose(), this._onDidChange.dispose(), Nt(this._listener.values()); } _onDidAddEditor(e) { - this._listener.set(e, Yr(e.onDidChangeCursorPosition((t) => this._onDidChange.fire({ editor: e })), e.onDidChangeModelContent((t) => this._onDidChange.fire({ editor: e })))); + this._listener.set(e, Kl(e.onDidChangeCursorPosition((t) => this._onDidChange.fire({ editor: e })), e.onDidChangeModelContent((t) => this._onDidChange.fire({ editor: e })))); } _onDidRemoveEditor(e) { var t; (t = this._listener.get(e)) == null || t.dispose(), this._listener.delete(e); } }; -SD = sj([ - my(0, ft) -], SD); -function LD(s, e) { - return e.uri.scheme === s.uri.scheme ? !0 : !I2(e.uri, Ge.walkThroughSnippet, Ge.vscodeChatCodeBlock, Ge.vscodeChatCodeCompareBlock); +zM = D4([ + Lf(0, gt) +], zM); +function AM(s, e) { + return e.uri.scheme === s.uri.scheme ? !0 : !QN(e.uri, ve.walkThroughSnippet, ve.vscodeChatCodeBlock, ve.vscodeChatCodeCompareBlock); } -async function EC(s, e, t, i, n) { - const r = t.ordered(s, i).map((a) => Promise.resolve(n(a, s, e)).then(void 0, (c) => { - wi(c); - })), l = await Promise.all(r); - return Or(l.flat()).filter((a) => LD(s, a)); +async function jG(s, e, t, i, n) { + const l = t.ordered(s, i).map((c) => Promise.resolve(n(c, s, e)).then(void 0, (d) => { + Wi(d); + })), r = await Promise.all(l); + return _l(r.flat()).filter((c) => AM(s, c)); } -function XC(s, e, t, i, n) { - return EC(e, t, s, i, (o, r, l) => o.provideDefinition(r, l, n)); +function qG(s, e, t, i, n) { + return jG(e, t, s, i, (o, l, r) => o.provideDefinition(l, r, n)); } -function N5(s, e, t, i, n) { - return EC(e, t, s, i, (o, r, l) => o.provideDeclaration(r, l, n)); +function eE(s, e, t, i, n) { + return jG(e, t, s, i, (o, l, r) => o.provideDeclaration(l, r, n)); } -function W5(s, e, t, i, n) { - return EC(e, t, s, i, (o, r, l) => o.provideImplementation(r, l, n)); +function tE(s, e, t, i, n) { + return jG(e, t, s, i, (o, l, r) => o.provideImplementation(l, r, n)); } -function v5(s, e, t, i, n) { - return EC(e, t, s, i, (o, r, l) => o.provideTypeDefinition(r, l, n)); +function iE(s, e, t, i, n) { + return jG(e, t, s, i, (o, l, r) => o.provideTypeDefinition(l, r, n)); } -function FC(s, e, t, i, n, o) { - return EC(e, t, s, n, async (r, l, a) => { +function $G(s, e, t, i, n, o) { + return jG(e, t, s, n, async (l, r, c) => { var h, u; - const c = (h = await r.provideReferences(l, a, { includeDeclaration: !0 }, o)) == null ? void 0 : h.filter((g) => LD(l, g)); - if (!i || !c || c.length !== 2) - return c; - const d = (u = await r.provideReferences(l, a, { includeDeclaration: !1 }, o)) == null ? void 0 : u.filter((g) => LD(l, g)); - return d && d.length === 1 ? d : c; + const d = (h = await l.provideReferences(r, c, { includeDeclaration: !0 }, o)) == null ? void 0 : h.filter((m) => AM(r, m)); + if (!i || !d || d.length !== 2) + return d; + const a = (u = await l.provideReferences(r, c, { includeDeclaration: !1 }, o)) == null ? void 0 : u.filter((m) => AM(r, m)); + return a && a.length === 1 ? a : d; }); } -async function Oa(s) { - const e = await s(), t = new uo(e, ""), i = t.references.map((n) => n.link); +async function Qc(s) { + const e = await s(), t = new bo(e, ""), i = t.references.map((n) => n.link); return t.dispose(), i; } -zs("_executeDefinitionProvider", (s, e, t) => { - const i = s.get(ge), n = XC(i.definitionProvider, e, t, !1, Ye.None); - return Oa(() => n); +Ks("_executeDefinitionProvider", (s, e, t) => { + const i = s.get(me), n = qG(i.definitionProvider, e, t, !1, Fe.None); + return Qc(() => n); }); -zs("_executeDefinitionProvider_recursive", (s, e, t) => { - const i = s.get(ge), n = XC(i.definitionProvider, e, t, !0, Ye.None); - return Oa(() => n); +Ks("_executeDefinitionProvider_recursive", (s, e, t) => { + const i = s.get(me), n = qG(i.definitionProvider, e, t, !0, Fe.None); + return Qc(() => n); }); -zs("_executeTypeDefinitionProvider", (s, e, t) => { - const i = s.get(ge), n = v5(i.typeDefinitionProvider, e, t, !1, Ye.None); - return Oa(() => n); +Ks("_executeTypeDefinitionProvider", (s, e, t) => { + const i = s.get(me), n = iE(i.typeDefinitionProvider, e, t, !1, Fe.None); + return Qc(() => n); }); -zs("_executeTypeDefinitionProvider_recursive", (s, e, t) => { - const i = s.get(ge), n = v5(i.typeDefinitionProvider, e, t, !0, Ye.None); - return Oa(() => n); +Ks("_executeTypeDefinitionProvider_recursive", (s, e, t) => { + const i = s.get(me), n = iE(i.typeDefinitionProvider, e, t, !0, Fe.None); + return Qc(() => n); }); -zs("_executeDeclarationProvider", (s, e, t) => { - const i = s.get(ge), n = N5(i.declarationProvider, e, t, !1, Ye.None); - return Oa(() => n); +Ks("_executeDeclarationProvider", (s, e, t) => { + const i = s.get(me), n = eE(i.declarationProvider, e, t, !1, Fe.None); + return Qc(() => n); }); -zs("_executeDeclarationProvider_recursive", (s, e, t) => { - const i = s.get(ge), n = N5(i.declarationProvider, e, t, !0, Ye.None); - return Oa(() => n); +Ks("_executeDeclarationProvider_recursive", (s, e, t) => { + const i = s.get(me), n = eE(i.declarationProvider, e, t, !0, Fe.None); + return Qc(() => n); }); -zs("_executeReferenceProvider", (s, e, t) => { - const i = s.get(ge), n = FC(i.referenceProvider, e, t, !1, !1, Ye.None); - return Oa(() => n); +Ks("_executeReferenceProvider", (s, e, t) => { + const i = s.get(me), n = $G(i.referenceProvider, e, t, !1, !1, Fe.None); + return Qc(() => n); }); -zs("_executeReferenceProvider_recursive", (s, e, t) => { - const i = s.get(ge), n = FC(i.referenceProvider, e, t, !1, !0, Ye.None); - return Oa(() => n); +Ks("_executeReferenceProvider_recursive", (s, e, t) => { + const i = s.get(me), n = $G(i.referenceProvider, e, t, !1, !0, Fe.None); + return Qc(() => n); }); -zs("_executeImplementationProvider", (s, e, t) => { - const i = s.get(ge), n = W5(i.implementationProvider, e, t, !1, Ye.None); - return Oa(() => n); +Ks("_executeImplementationProvider", (s, e, t) => { + const i = s.get(me), n = tE(i.implementationProvider, e, t, !1, Fe.None); + return Qc(() => n); }); -zs("_executeImplementationProvider_recursive", (s, e, t) => { - const i = s.get(ge), n = W5(i.implementationProvider, e, t, !0, Ye.None); - return Oa(() => n); +Ks("_executeImplementationProvider_recursive", (s, e, t) => { + const i = s.get(me), n = tE(i.implementationProvider, e, t, !0, Fe.None); + return Qc(() => n); }); -nn.appendMenuItem(pe.EditorContext, { +sn.appendMenuItem(pe.EditorContext, { submenu: pe.EditorContextPeek, title: p("peek.submenu", "Peek"), group: "navigation", order: 100 }); -class Wb { +class vZ { static is(e) { - return !e || typeof e != "object" ? !1 : !!(e instanceof Wb || V.isIPosition(e.position) && e.model); + return !e || typeof e != "object" ? !1 : !!(e instanceof vZ || Y.isIPosition(e.position) && e.model); } constructor(e, t) { this.model = e, this.position = t; } } -const vr = class vr extends Rl { +const Yl = class Yl extends Fr { static all() { - return vr._allSymbolNavigationCommands.values(); + return Yl._allSymbolNavigationCommands.values(); } static _patchConfig(e) { const t = { ...e, f1: !0 }; if (t.menu) for (const i of nt.wrap(t.menu)) - (i.id === pe.EditorContext || i.id === pe.EditorContextPeek) && (i.when = H.and(e.precondition, i.when)); + (i.id === pe.EditorContext || i.id === pe.EditorContextPeek) && (i.when = P.and(e.precondition, i.when)); return t; } constructor(e, t) { - super(vr._patchConfig(t)), this.configuration = e, vr._allSymbolNavigationCommands.set(t.id, this); + super(Yl._patchConfig(t)), this.configuration = e, Yl._allSymbolNavigationCommands.set(t.id, this); } runEditorCommand(e, t, i, n) { if (!t.hasModel()) return Promise.resolve(void 0); - const o = e.get(Vi), r = e.get(ft), l = e.get(qh), a = e.get(JI), c = e.get(ge), d = e.get(Se), h = t.getModel(), u = t.getPosition(), g = Wb.is(i) ? i : new Wb(h, u), m = new Yh( + const o = e.get(vi), l = e.get(gt), r = e.get(iu), c = e.get(cC), d = e.get(me), a = e.get(Ge), h = t.getModel(), u = t.getPosition(), m = vZ.is(i) ? i : new vZ(h, u), b = new Uh( t, 5 /* CodeEditorStateFlag.Position */ - ), f = cC(this._getLocationModel(c, g.model, g.position, m.token), m.token).then(async (b) => { - var C; - if (!b || m.token.isCancellationRequested) + ), g = XG(this._getLocationModel(d, m.model, m.position, b.token), b.token).then(async (Z) => { + var W; + if (!Z || b.token.isCancellationRequested) return; - bs(b.ariaMessage); - let y; - if (b.referenceAt(h.uri, u)) { - const S = this._getAlternativeCommand(t); - !vr._activeAlternativeCommands.has(S) && vr._allSymbolNavigationCommands.has(S) && (y = vr._allSymbolNavigationCommands.get(S)); - } - const w = b.references.length; - if (w === 0) { + ys(Z.ariaMessage); + let f; + if (Z.referenceAt(h.uri, u)) { + const G = this._getAlternativeCommand(t); + !Yl._activeAlternativeCommands.has(G) && Yl._allSymbolNavigationCommands.has(G) && (f = Yl._allSymbolNavigationCommands.get(G)); + } + const y = Z.references.length; + if (y === 0) { if (!this.configuration.muteMessage) { - const S = h.getWordAtPosition(u); - (C = ho.get(t)) == null || C.showMessage(this._getNoResultFoundMessage(S), u); + const G = h.getWordAtPosition(u); + (W = mo.get(t)) == null || W.showMessage(this._getNoResultFoundMessage(G), u); } - } else if (w === 1 && y) - vr._activeAlternativeCommands.add(this.desc.id), d.invokeFunction((S) => y.runEditorCommand(S, t, i, n).finally(() => { - vr._activeAlternativeCommands.delete(this.desc.id); + } else if (y === 1 && f) + Yl._activeAlternativeCommands.add(this.desc.id), a.invokeFunction((G) => f.runEditorCommand(G, t, i, n).finally(() => { + Yl._activeAlternativeCommands.delete(this.desc.id); })); else - return this._onResult(r, a, t, b, n); - }, (b) => { - o.error(b); + return this._onResult(l, c, t, Z, n); + }, (Z) => { + o.error(Z); }).finally(() => { - m.dispose(); + b.dispose(); }); - return l.showWhile(f, 250), f; + return r.showWhile(g, 250), g; } async _onResult(e, t, i, n, o) { - const r = this._getGoToPreference(i); - if (!(i instanceof Qr) && (this.configuration.openInPeek || r === "peek" && n.references.length > 1)) + const l = this._getGoToPreference(i); + if (!(i instanceof $l) && (this.configuration.openInPeek || l === "peek" && n.references.length > 1)) this._openInPeek(i, n, o); else { - const l = n.firstReference(), a = n.references.length > 1 && r === "gotoAndPeek", c = await this._openReference(i, e, l, this.configuration.openToSide, !a); - a && c ? this._openInPeek(c, n, o) : n.dispose(), r === "goto" && t.put(l); + const r = n.firstReference(), c = n.references.length > 1 && l === "gotoAndPeek", d = await this._openReference(i, e, r, this.configuration.openToSide, !c); + c && d ? this._openInPeek(d, n, o) : n.dispose(), l === "goto" && t.put(r); } } async _openReference(e, t, i, n, o) { - let r; - if (ire(i) && (r = i.targetSelectionRange), r || (r = i.range), !r) + let l; + if (_le(i) && (l = i.targetSelectionRange), l || (l = i.range), !l) return; - const l = await t.openCodeEditor({ + const r = await t.openCodeEditor({ resource: i.uri, options: { - selection: M.collapseToStart(r), + selection: I.collapseToStart(l), selectionRevealType: 3, selectionSource: "code.jump" /* TextEditorSelectionSource.JUMP */ } }, e, n); - if (l) { + if (r) { if (o) { - const a = l.getModel(), c = l.createDecorationsCollection([{ range: r, options: { description: "symbol-navigate-action-highlight", className: "symbolHighlight" } }]); + const c = r.getModel(), d = r.createDecorationsCollection([{ range: l, options: { description: "symbol-navigate-action-highlight", className: "symbolHighlight" } }]); setTimeout(() => { - l.getModel() === a && c.clear(); + r.getModel() === c && d.clear(); }, 350); } - return l; + return r; } } _openInPeek(e, t, i) { - const n = R1.get(e); - n && e.hasModel() ? n.toggleWidget(i ?? e.getSelection(), Ui((o) => Promise.resolve(t)), this.configuration.openInPeek) : t.dispose(); + const n = QW.get(e); + n && e.hasModel() ? n.toggleWidget(i ?? e.getSelection(), Qi((o) => Promise.resolve(t)), this.configuration.openInPeek) : t.dispose(); } }; -vr._allSymbolNavigationCommands = /* @__PURE__ */ new Map(), vr._activeAlternativeCommands = /* @__PURE__ */ new Set(); -let qc = vr; -class YC extends qc { +Yl._allSymbolNavigationCommands = /* @__PURE__ */ new Map(), Yl._activeAlternativeCommands = /* @__PURE__ */ new Set(); +let ia = Yl; +class e1 extends ia { async _getLocationModel(e, t, i, n) { - return new uo(await XC(e.definitionProvider, t, i, !1, n), p("def.title", "Definitions")); + return new bo(await qG(e.definitionProvider, t, i, !1, n), p("def.title", "Definitions")); } _getNoResultFoundMessage(e) { return e && e.word ? p("noResultWord", "No definition found for '{0}'", e.word) : p("generic.noResults", "No definition found"); @@ -70583,27 +70583,27 @@ class YC extends qc { ).multipleDefinitions; } } -var gh; -kt((gh = class extends YC { +var Zh; +kt((Zh = class extends e1 { constructor() { super({ openToSide: !1, openInPeek: !1, muteMessage: !1 }, { - id: gh.id, + id: Zh.id, title: { - ...Ie("actions.goToDecl.label", "Go to Definition"), + ...Ce("actions.goToDecl.label", "Go to Definition"), mnemonicTitle: p({ key: "miGotoDefinition", comment: ["&& denotes a mnemonic"] }, "Go to &&Definition") }, - precondition: I.hasDefinitionProvider, + precondition: C.hasDefinitionProvider, keybinding: [{ - when: I.editorTextFocus, + when: C.editorTextFocus, primary: 70, weight: 100 /* KeybindingWeight.EditorContrib */ }, { - when: H.and(I.editorTextFocus, JQ), + when: P.and(C.editorTextFocus, R4), primary: 2118, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -70618,23 +70618,23 @@ kt((gh = class extends YC { group: "4_symbol_nav", order: 2 }] - }), st.registerCommandAlias("editor.action.goToDeclaration", gh.id); + }), st.registerCommandAlias("editor.action.goToDeclaration", Zh.id); } -}, gh.id = "editor.action.revealDefinition", gh)); -var mh; -kt((mh = class extends YC { +}, Zh.id = "editor.action.revealDefinition", Zh)); +var fh; +kt((fh = class extends e1 { constructor() { super({ openToSide: !0, openInPeek: !1, muteMessage: !1 }, { - id: mh.id, - title: Ie("actions.goToDeclToSide.label", "Open Definition to the Side"), - precondition: H.and(I.hasDefinitionProvider, I.isInEmbeddedEditor.toNegated()), + id: fh.id, + title: Ce("actions.goToDeclToSide.label", "Open Definition to the Side"), + precondition: P.and(C.hasDefinitionProvider, C.isInEmbeddedEditor.toNegated()), keybinding: [{ - when: I.editorTextFocus, - primary: Xi( + when: C.editorTextFocus, + primary: Di( 2089, 70 /* KeyCode.F12 */ @@ -70642,8 +70642,8 @@ kt((mh = class extends YC { weight: 100 /* KeybindingWeight.EditorContrib */ }, { - when: H.and(I.editorTextFocus, JQ), - primary: Xi( + when: P.and(C.editorTextFocus, R4), + primary: Di( 2089, 2118 /* KeyCode.F12 */ @@ -70651,22 +70651,22 @@ kt((mh = class extends YC { weight: 100 /* KeybindingWeight.EditorContrib */ }] - }), st.registerCommandAlias("editor.action.openDeclarationToTheSide", mh.id); + }), st.registerCommandAlias("editor.action.openDeclarationToTheSide", fh.id); } -}, mh.id = "editor.action.revealDefinitionAside", mh)); -var ph; -kt((ph = class extends YC { +}, fh.id = "editor.action.revealDefinitionAside", fh)); +var yh; +kt((yh = class extends e1 { constructor() { super({ openToSide: !1, openInPeek: !0, muteMessage: !1 }, { - id: ph.id, - title: Ie("actions.previewDecl.label", "Peek Definition"), - precondition: H.and(I.hasDefinitionProvider, Xs.notInPeekEditor, I.isInEmbeddedEditor.toNegated()), + id: yh.id, + title: Ce("actions.previewDecl.label", "Peek Definition"), + precondition: P.and(C.hasDefinitionProvider, Fs.notInPeekEditor, C.isInEmbeddedEditor.toNegated()), keybinding: { - when: I.editorTextFocus, + when: C.editorTextFocus, primary: 582, linux: { primary: 3140 @@ -70680,12 +70680,12 @@ kt((ph = class extends YC { group: "peek", order: 2 } - }), st.registerCommandAlias("editor.action.previewDeclaration", ph.id); + }), st.registerCommandAlias("editor.action.previewDeclaration", yh.id); } -}, ph.id = "editor.action.peekDefinition", ph)); -class oj extends qc { +}, yh.id = "editor.action.peekDefinition", yh)); +class F4 extends ia { async _getLocationModel(e, t, i, n) { - return new uo(await N5(e.declarationProvider, t, i, !1, n), p("decl.title", "Declarations")); + return new bo(await eE(e.declarationProvider, t, i, !1, n), p("decl.title", "Declarations")); } _getNoResultFoundMessage(e) { return e && e.word ? p("decl.noResultWord", "No declaration found for '{0}'", e.word) : p("decl.generic.noResults", "No declaration found"); @@ -70703,20 +70703,20 @@ class oj extends qc { ).multipleDeclarations; } } -var Zg; -kt((Zg = class extends oj { +var wm; +kt((wm = class extends F4 { constructor() { super({ openToSide: !1, openInPeek: !1, muteMessage: !1 }, { - id: Zg.id, + id: wm.id, title: { - ...Ie("actions.goToDeclaration.label", "Go to Declaration"), + ...Ce("actions.goToDeclaration.label", "Go to Declaration"), mnemonicTitle: p({ key: "miGotoDeclaration", comment: ["&& denotes a mnemonic"] }, "Go to &&Declaration") }, - precondition: H.and(I.hasDeclarationProvider, I.isInEmbeddedEditor.toNegated()), + precondition: P.and(C.hasDeclarationProvider, C.isInEmbeddedEditor.toNegated()), menu: [{ id: pe.EditorContext, group: "navigation", @@ -70732,8 +70732,8 @@ kt((Zg = class extends oj { _getNoResultFoundMessage(e) { return e && e.word ? p("decl.noResultWord", "No declaration found for '{0}'", e.word) : p("decl.generic.noResults", "No declaration found"); } -}, Zg.id = "editor.action.revealDeclaration", Zg)); -kt(class extends oj { +}, wm.id = "editor.action.revealDeclaration", wm)); +kt(class extends F4 { constructor() { super({ openToSide: !1, @@ -70741,8 +70741,8 @@ kt(class extends oj { muteMessage: !1 }, { id: "editor.action.peekDeclaration", - title: Ie("actions.peekDecl.label", "Peek Declaration"), - precondition: H.and(I.hasDeclarationProvider, Xs.notInPeekEditor, I.isInEmbeddedEditor.toNegated()), + title: Ce("actions.peekDecl.label", "Peek Declaration"), + precondition: P.and(C.hasDeclarationProvider, Fs.notInPeekEditor, C.isInEmbeddedEditor.toNegated()), menu: { id: pe.EditorContextPeek, group: "peek", @@ -70751,9 +70751,9 @@ kt(class extends oj { }); } }); -class rj extends qc { +class z4 extends ia { async _getLocationModel(e, t, i, n) { - return new uo(await v5(e.typeDefinitionProvider, t, i, !1, n), p("typedef.title", "Type Definitions")); + return new bo(await iE(e.typeDefinitionProvider, t, i, !1, n), p("typedef.title", "Type Definitions")); } _getNoResultFoundMessage(e) { return e && e.word ? p("goToTypeDefinition.noResultWord", "No type definition found for '{0}'", e.word) : p("goToTypeDefinition.generic.noResults", "No type definition found"); @@ -70771,22 +70771,22 @@ class rj extends qc { ).multipleTypeDefinitions; } } -var _g; -kt((_g = class extends rj { +var Tm; +kt((Tm = class extends z4 { constructor() { super({ openToSide: !1, openInPeek: !1, muteMessage: !1 }, { - id: _g.ID, + id: Tm.ID, title: { - ...Ie("actions.goToTypeDefinition.label", "Go to Type Definition"), + ...Ce("actions.goToTypeDefinition.label", "Go to Type Definition"), mnemonicTitle: p({ key: "miGotoTypeDefinition", comment: ["&& denotes a mnemonic"] }, "Go to &&Type Definition") }, - precondition: I.hasTypeDefinitionProvider, + precondition: C.hasTypeDefinitionProvider, keybinding: { - when: I.editorTextFocus, + when: C.editorTextFocus, primary: 0, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -70803,18 +70803,18 @@ kt((_g = class extends rj { }] }); } -}, _g.ID = "editor.action.goToTypeDefinition", _g)); -var Ig; -kt((Ig = class extends rj { +}, Tm.ID = "editor.action.goToTypeDefinition", Tm)); +var Mm; +kt((Mm = class extends z4 { constructor() { super({ openToSide: !1, openInPeek: !0, muteMessage: !1 }, { - id: Ig.ID, - title: Ie("actions.peekTypeDefinition.label", "Peek Type Definition"), - precondition: H.and(I.hasTypeDefinitionProvider, Xs.notInPeekEditor, I.isInEmbeddedEditor.toNegated()), + id: Mm.ID, + title: Ce("actions.peekTypeDefinition.label", "Peek Type Definition"), + precondition: P.and(C.hasTypeDefinitionProvider, Fs.notInPeekEditor, C.isInEmbeddedEditor.toNegated()), menu: { id: pe.EditorContextPeek, group: "peek", @@ -70822,10 +70822,10 @@ kt((Ig = class extends rj { } }); } -}, Ig.ID = "editor.action.peekTypeDefinition", Ig)); -class lj extends qc { +}, Mm.ID = "editor.action.peekTypeDefinition", Mm)); +class A4 extends ia { async _getLocationModel(e, t, i, n) { - return new uo(await W5(e.implementationProvider, t, i, !1, n), p("impl.title", "Implementations")); + return new bo(await tE(e.implementationProvider, t, i, !1, n), p("impl.title", "Implementations")); } _getNoResultFoundMessage(e) { return e && e.word ? p("goToImplementation.noResultWord", "No implementation found for '{0}'", e.word) : p("goToImplementation.generic.noResults", "No implementation found"); @@ -70843,22 +70843,22 @@ class lj extends qc { ).multipleImplementations; } } -var Ng; -kt((Ng = class extends lj { +var Ym; +kt((Ym = class extends A4 { constructor() { super({ openToSide: !1, openInPeek: !1, muteMessage: !1 }, { - id: Ng.ID, + id: Ym.ID, title: { - ...Ie("actions.goToImplementation.label", "Go to Implementations"), + ...Ce("actions.goToImplementation.label", "Go to Implementations"), mnemonicTitle: p({ key: "miGotoImplementation", comment: ["&& denotes a mnemonic"] }, "Go to &&Implementations") }, - precondition: I.hasImplementationProvider, + precondition: C.hasImplementationProvider, keybinding: { - when: I.editorTextFocus, + when: C.editorTextFocus, primary: 2118, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -70875,20 +70875,20 @@ kt((Ng = class extends lj { }] }); } -}, Ng.ID = "editor.action.goToImplementation", Ng)); -var Wg; -kt((Wg = class extends lj { +}, Ym.ID = "editor.action.goToImplementation", Ym)); +var km; +kt((km = class extends A4 { constructor() { super({ openToSide: !1, openInPeek: !0, muteMessage: !1 }, { - id: Wg.ID, - title: Ie("actions.peekImplementation.label", "Peek Implementations"), - precondition: H.and(I.hasImplementationProvider, Xs.notInPeekEditor, I.isInEmbeddedEditor.toNegated()), + id: km.ID, + title: Ce("actions.peekImplementation.label", "Peek Implementations"), + precondition: P.and(C.hasImplementationProvider, Fs.notInPeekEditor, C.isInEmbeddedEditor.toNegated()), keybinding: { - when: I.editorTextFocus, + when: C.editorTextFocus, primary: 3142, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -70900,8 +70900,8 @@ kt((Wg = class extends lj { } }); } -}, Wg.ID = "editor.action.peekImplementation", Wg)); -class aj extends qc { +}, km.ID = "editor.action.peekImplementation", km)); +class K4 extends ia { _getNoResultFoundMessage(e) { return e ? p("references.no", "No references found for '{0}'", e.word) : p("references.noGeneric", "No references found"); } @@ -70918,7 +70918,7 @@ class aj extends qc { ).multipleReferences; } } -kt(class extends aj { +kt(class extends K4 { constructor() { super({ openToSide: !1, @@ -70927,12 +70927,12 @@ kt(class extends aj { }, { id: "editor.action.goToReferences", title: { - ...Ie("goToReferences.label", "Go to References"), + ...Ce("goToReferences.label", "Go to References"), mnemonicTitle: p({ key: "miGotoReference", comment: ["&& denotes a mnemonic"] }, "Go to &&References") }, - precondition: H.and(I.hasReferenceProvider, Xs.notInPeekEditor, I.isInEmbeddedEditor.toNegated()), + precondition: P.and(C.hasReferenceProvider, Fs.notInPeekEditor, C.isInEmbeddedEditor.toNegated()), keybinding: { - when: I.editorTextFocus, + when: C.editorTextFocus, primary: 1094, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -70950,10 +70950,10 @@ kt(class extends aj { }); } async _getLocationModel(e, t, i, n) { - return new uo(await FC(e.referenceProvider, t, i, !0, !1, n), p("ref.title", "References")); + return new bo(await $G(e.referenceProvider, t, i, !0, !1, n), p("ref.title", "References")); } }); -kt(class extends aj { +kt(class extends K4 { constructor() { super({ openToSide: !1, @@ -70961,8 +70961,8 @@ kt(class extends aj { muteMessage: !1 }, { id: "editor.action.referenceSearch.trigger", - title: Ie("references.action.label", "Peek References"), - precondition: H.and(I.hasReferenceProvider, Xs.notInPeekEditor, I.isInEmbeddedEditor.toNegated()), + title: Ce("references.action.label", "Peek References"), + precondition: P.and(C.hasReferenceProvider, Fs.notInPeekEditor, C.isInEmbeddedEditor.toNegated()), menu: { id: pe.EditorContextPeek, group: "peek", @@ -70971,19 +70971,19 @@ kt(class extends aj { }); } async _getLocationModel(e, t, i, n) { - return new uo(await FC(e.referenceProvider, t, i, !1, !1, n), p("ref.title", "References")); + return new bo(await $G(e.referenceProvider, t, i, !1, !1, n), p("ref.title", "References")); } }); -class y0e extends qc { +class afe extends ia { constructor(e, t, i) { super(e, { id: "editor.action.goToLocation", - title: Ie("label.generic", "Go to Any Symbol"), - precondition: H.and(Xs.notInPeekEditor, I.isInEmbeddedEditor.toNegated()) + title: Ce("label.generic", "Go to Any Symbol"), + precondition: P.and(Fs.notInPeekEditor, C.isInEmbeddedEditor.toNegated()) }), this._references = t, this._gotoMultipleBehaviour = i; } async _getLocationModel(e, t, i, n) { - return new uo(this._references, p("generic.title", "Locations")); + return new bo(this._references, p("generic.title", "Locations")); } _getNoResultFoundMessage(e) { return e && p("generic.noResult", "No results for '{0}'", e.word) || ""; @@ -71003,32 +71003,32 @@ st.registerCommand({ metadata: { description: "Go to locations from a position in a file", args: [ - { name: "uri", description: "The text document in which to start", constraint: Le }, - { name: "position", description: "The position at which to start", constraint: V.isIPosition }, + { name: "uri", description: "The text document in which to start", constraint: Xe }, + { name: "position", description: "The position at which to start", constraint: Y.isIPosition }, { name: "locations", description: "An array of locations.", constraint: Array }, { name: "multiple", description: "Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto`" }, { name: "noResultsMessage", description: "Human readable message that shows when locations is empty." } ] }, - handler: async (s, e, t, i, n, o, r) => { - ht(Le.isUri(e)), ht(V.isIPosition(t)), ht(Array.isArray(i)), ht(typeof n > "u" || typeof n == "string"), ht(typeof r > "u" || typeof r == "boolean"); - const l = s.get(ft), a = await l.openCodeEditor({ resource: e }, l.getFocusedCodeEditor()); - if (zh(a)) - return a.setPosition(t), a.revealPositionInCenterIfOutsideViewport( + handler: async (s, e, t, i, n, o, l) => { + ht(Xe.isUri(e)), ht(Y.isIPosition(t)), ht(Array.isArray(i)), ht(typeof n > "u" || typeof n == "string"), ht(typeof l > "u" || typeof l == "boolean"); + const r = s.get(gt), c = await r.openCodeEditor({ resource: e }, r.getFocusedCodeEditor()); + if (Ph(c)) + return c.setPosition(t), c.revealPositionInCenterIfOutsideViewport( t, 0 /* ScrollType.Smooth */ - ), a.invokeWithinContext((c) => { - const d = new class extends y0e { + ), c.invokeWithinContext((d) => { + const a = new class extends afe { _getNoResultFoundMessage(h) { return o || super._getNoResultFoundMessage(h); } }({ muteMessage: !o, - openInPeek: !!r, + openInPeek: !!l, openToSide: !1 }, i, n); - c.get(Se).invokeFunction(d.run.bind(d), a); + d.get(Ge).invokeFunction(a.run.bind(a), c); }); } }); @@ -71037,58 +71037,58 @@ st.registerCommand({ metadata: { description: "Peek locations from a position in a file", args: [ - { name: "uri", description: "The text document in which to start", constraint: Le }, - { name: "position", description: "The position at which to start", constraint: V.isIPosition }, + { name: "uri", description: "The text document in which to start", constraint: Xe }, + { name: "position", description: "The position at which to start", constraint: Y.isIPosition }, { name: "locations", description: "An array of locations.", constraint: Array }, { name: "multiple", description: "Define what to do when having multiple results, either `peek`, `gotoAndPeek`, or `goto`" } ] }, handler: async (s, e, t, i, n) => { - s.get(Qt).executeCommand("editor.action.goToLocations", e, t, i, n, void 0, !0); + s.get(Ot).executeCommand("editor.action.goToLocations", e, t, i, n, void 0, !0); } }); st.registerCommand({ id: "editor.action.findReferences", handler: (s, e, t) => { - ht(Le.isUri(e)), ht(V.isIPosition(t)); - const i = s.get(ge), n = s.get(ft); + ht(Xe.isUri(e)), ht(Y.isIPosition(t)); + const i = s.get(me), n = s.get(gt); return n.openCodeEditor({ resource: e }, n.getFocusedCodeEditor()).then((o) => { - if (!zh(o) || !o.hasModel()) + if (!Ph(o) || !o.hasModel()) return; - const r = R1.get(o); - if (!r) + const l = QW.get(o); + if (!l) return; - const l = Ui((c) => FC(i.referenceProvider, o.getModel(), V.lift(t), !1, !1, c).then((d) => new uo(d, p("ref.title", "References")))), a = new M(t.lineNumber, t.column, t.lineNumber, t.column); - return Promise.resolve(r.toggleWidget(a, l, !1)); + const r = Qi((d) => $G(i.referenceProvider, o.getModel(), Y.lift(t), !1, !1, d).then((a) => new bo(a, p("ref.title", "References")))), c = new I(t.lineNumber, t.column, t.lineNumber, t.column); + return Promise.resolve(l.toggleWidget(c, r, !1)); }); } }); st.registerCommandAlias("editor.action.showReferences", "editor.action.peekLocations"); -async function w0e(s, e, t, i) { - const n = s.get(Ys), o = s.get(Co), r = s.get(Qt), l = s.get(Se), a = s.get(Vi); - if (await i.item.resolve(Ye.None), !i.part.location) +async function hfe(s, e, t, i) { + const n = s.get(As), o = s.get(Xo), l = s.get(Ot), r = s.get(Ge), c = s.get(vi); + if (await i.item.resolve(Fe.None), !i.part.location) return; - const c = i.part.location, d = [], h = new Set(nn.getMenuItems(pe.EditorContext).map((g) => Cf(g) ? g.command.id : TI())); - for (const g of qc.all()) - h.has(g.desc.id) && d.push(new lo(g.desc.id, ao.label(g.desc, { renderShortTitle: !0 }), void 0, !0, async () => { - const m = await n.createModelReference(c.uri); + const d = i.part.location, a = [], h = new Set(sn.getMenuItems(pe.EditorContext).map((m) => Sg(m) ? m.command.id : Bx())); + for (const m of ia.all()) + h.has(m.desc.id) && a.push(new ao(m.desc.id, ho.label(m.desc, { renderShortTitle: !0 }), void 0, !0, async () => { + const b = await n.createModelReference(d.uri); try { - const f = new Wb(m.object.textEditorModel, M.getStartPosition(c.range)), b = i.item.anchor.range; - await l.invokeFunction(g.runEditorCommand.bind(g), e, f, b); + const g = new vZ(b.object.textEditorModel, I.getStartPosition(d.range)), Z = i.item.anchor.range; + await r.invokeFunction(m.runEditorCommand.bind(m), e, g, Z); } finally { - m.dispose(); + b.dispose(); } })); if (i.part.command) { - const { command: g } = i.part; - d.push(new Qi()), d.push(new lo(g.id, g.title, void 0, !0, async () => { + const { command: m } = i.part; + a.push(new ji()), a.push(new ao(m.id, m.title, void 0, !0, async () => { try { - await r.executeCommand(g.id, ...g.arguments ?? []); - } catch (m) { - a.notify({ - severity: yI.Error, + await l.executeCommand(m.id, ...m.arguments ?? []); + } catch (b) { + c.notify({ + severity: Mx.Error, source: i.item.provider.displayName, - message: m + message: b }); } })); @@ -71100,60 +71100,60 @@ async function w0e(s, e, t, i) { o.showContextMenu({ domForShadowRoot: u ? e.getDomNode() ?? void 0 : void 0, getAnchor: () => { - const g = yi(t); - return { x: g.left, y: g.top + g.height + 8 }; + const m = yi(t); + return { x: m.left, y: m.top + m.height + 8 }; }, - getActions: () => d, + getActions: () => a, onHide: () => { e.focus(); }, autoSelectFirstItem: !0 }); } -async function cj(s, e, t, i) { - const o = await s.get(Ys).createModelReference(i.uri); - await t.invokeWithinContext(async (r) => { - const l = e.hasSideBySideModifier, a = r.get(_e), c = Xs.inPeekEditor.getValue(a), d = !l && t.getOption( +async function U4(s, e, t, i) { + const o = await s.get(As).createModelReference(i.uri); + await t.invokeWithinContext(async (l) => { + const r = e.hasSideBySideModifier, c = l.get(xe), d = Fs.inPeekEditor.getValue(c), a = !r && t.getOption( 89 /* EditorOption.definitionLinkOpensInPeek */ - ) && !c; - return new YC({ openToSide: l, openInPeek: d, muteMessage: !0 }, { title: { value: "", original: "" }, id: "", precondition: void 0 }).run(r, new Wb(o.object.textEditorModel, M.getStartPosition(i.range)), M.lift(i.range)); + ) && !d; + return new e1({ openToSide: r, openInPeek: a, muteMessage: !0 }, { title: { value: "", original: "" }, id: "", precondition: void 0 }).run(l, new vZ(o.object.textEditorModel, I.getStartPosition(i.range)), I.lift(i.range)); }), o.dispose(); } -var C0e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var ufe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, mp = function(s, e) { +}, yp = function(s, e) { return function(t, i) { e(t, i, s); }; -}, _p; -class Yx { +}, Mp; +class iI { constructor() { - this._entries = new id(50); + this._entries = new la(50); } get(e) { - const t = Yx._key(e); + const t = iI._key(e); return this._entries.get(t); } set(e, t) { - const i = Yx._key(e); + const i = iI._key(e); this._entries.set(i, t); } static _key(e) { return `${e.uri.toString()}/${e.getVersionId()}`; } } -const dj = $e("IInlayHintsCache"); +const P4 = $e("IInlayHintsCache"); it( - dj, - Yx, + P4, + iI, 1 /* InstantiationType.Delayed */ ); -class AD { +class KM { constructor(e, t) { this.item = e, this.index = t; } @@ -71162,19 +71162,19 @@ class AD { return typeof e == "string" ? { label: e } : e[this.index]; } } -class S0e { +class mfe { constructor(e, t) { this.part = e, this.hasTriggerModifier = t; } } -var Dc; -let E1 = (Dc = class { +var Jd; +let OW = (Jd = class { static get(e) { - return e.getContribution(_p.ID) ?? void 0; + return e.getContribution(Mp.ID) ?? void 0; } - constructor(e, t, i, n, o, r, l) { - this._editor = e, this._languageFeaturesService = t, this._inlayHintsCache = n, this._commandService = o, this._notificationService = r, this._instaService = l, this._disposables = new U(), this._sessionDisposables = new U(), this._decorationsMetadata = /* @__PURE__ */ new Map(), this._ruleFactory = new _A(this._editor), this._activeRenderMode = 0, this._debounceInfo = i.for(t.inlayHintsProvider, "InlayHint", { min: 25 }), this._disposables.add(t.inlayHintsProvider.onDidChange(() => this._update())), this._disposables.add(e.onDidChangeModel(() => this._update())), this._disposables.add(e.onDidChangeModelLanguage(() => this._update())), this._disposables.add(e.onDidChangeConfiguration((a) => { - a.hasChanged( + constructor(e, t, i, n, o, l, r) { + this._editor = e, this._languageFeaturesService = t, this._inlayHintsCache = n, this._commandService = o, this._notificationService = l, this._instaService = r, this._disposables = new _(), this._sessionDisposables = new _(), this._decorationsMetadata = /* @__PURE__ */ new Map(), this._ruleFactory = new zV(this._editor), this._activeRenderMode = 0, this._debounceInfo = i.for(t.inlayHintsProvider, "InlayHint", { min: 25 }), this._disposables.add(t.inlayHintsProvider.onDidChange(() => this._update())), this._disposables.add(e.onDidChangeModel(() => this._update())), this._disposables.add(e.onDidChangeModelLanguage(() => this._update())), this._disposables.add(e.onDidChangeConfiguration((c) => { + c.hasChanged( 142 /* EditorOption.inlayHints */ ) && this._update(); @@ -71197,71 +71197,71 @@ let E1 = (Dc = class { if (e.enabled === "on") this._activeRenderMode = 0; else { - let l, a; - e.enabled === "onUnlessPressed" ? (l = 0, a = 1) : (l = 1, a = 0), this._activeRenderMode = l, this._sessionDisposables.add(Ac.getInstance().event((c) => { + let r, c; + e.enabled === "onUnlessPressed" ? (r = 0, c = 1) : (r = 1, c = 0), this._activeRenderMode = r, this._sessionDisposables.add(xd.getInstance().event((d) => { if (!this._editor.hasModel()) return; - const d = c.altKey && c.ctrlKey && !(c.shiftKey || c.metaKey) ? a : l; - if (d !== this._activeRenderMode) { - this._activeRenderMode = d; + const a = d.altKey && d.ctrlKey && !(d.shiftKey || d.metaKey) ? c : r; + if (a !== this._activeRenderMode) { + this._activeRenderMode = a; const h = this._editor.getModel(), u = this._copyInlayHintsWithCurrentAnchor(h); - this._updateHintsDecorators([h.getFullModelRange()], u), r.schedule(0); + this._updateHintsDecorators([h.getFullModelRange()], u), l.schedule(0); } })); } const i = this._inlayHintsCache.get(t); - i && this._updateHintsDecorators([t.getFullModelRange()], i), this._sessionDisposables.add(Ce(() => { + i && this._updateHintsDecorators([t.getFullModelRange()], i), this._sessionDisposables.add(We(() => { t.isDisposed() || this._cacheHintsForFastRestore(t); })); let n; - const o = /* @__PURE__ */ new Set(), r = new Zt(async () => { - const l = Date.now(); - n == null || n.dispose(!0), n = new mi(); - const a = t.onWillDispose(() => n == null ? void 0 : n.cancel()); + const o = /* @__PURE__ */ new Set(), l = new St(async () => { + const r = Date.now(); + n == null || n.dispose(!0), n = new pi(); + const c = t.onWillDispose(() => n == null ? void 0 : n.cancel()); try { - const c = n.token, d = await Ix.create(this._languageFeaturesService.inlayHintsProvider, t, this._getHintsRanges(), c); - if (r.delay = this._debounceInfo.update(t, Date.now() - l), c.isCancellationRequested) { - d.dispose(); + const d = n.token, a = await AL.create(this._languageFeaturesService.inlayHintsProvider, t, this._getHintsRanges(), d); + if (l.delay = this._debounceInfo.update(t, Date.now() - r), d.isCancellationRequested) { + a.dispose(); return; } - for (const h of d.provider) + for (const h of a.provider) typeof h.onDidChangeInlayHints == "function" && !o.has(h) && (o.add(h), this._sessionDisposables.add(h.onDidChangeInlayHints(() => { - r.isScheduled() || r.schedule(); + l.isScheduled() || l.schedule(); }))); - this._sessionDisposables.add(d), this._updateHintsDecorators(d.ranges, d.items), this._cacheHintsForFastRestore(t); - } catch (c) { - De(c); + this._sessionDisposables.add(a), this._updateHintsDecorators(a.ranges, a.items), this._cacheHintsForFastRestore(t); + } catch (d) { + Me(d); } finally { - n.dispose(), a.dispose(); + n.dispose(), c.dispose(); } }, this._debounceInfo.get(t)); - this._sessionDisposables.add(r), this._sessionDisposables.add(Ce(() => n == null ? void 0 : n.dispose(!0))), r.schedule(0), this._sessionDisposables.add(this._editor.onDidScrollChange((l) => { - (l.scrollTopChanged || !r.isScheduled()) && r.schedule(); - })), this._sessionDisposables.add(this._editor.onDidChangeModelContent((l) => { + this._sessionDisposables.add(l), this._sessionDisposables.add(We(() => n == null ? void 0 : n.dispose(!0))), l.schedule(0), this._sessionDisposables.add(this._editor.onDidScrollChange((r) => { + (r.scrollTopChanged || !l.isScheduled()) && l.schedule(); + })), this._sessionDisposables.add(this._editor.onDidChangeModelContent((r) => { n == null || n.cancel(); - const a = Math.max(r.delay, 1250); - r.schedule(a); - })), this._sessionDisposables.add(this._installDblClickGesture(() => r.schedule(0))), this._sessionDisposables.add(this._installLinkGesture()), this._sessionDisposables.add(this._installContextMenu()); + const c = Math.max(l.delay, 1250); + l.schedule(c); + })), this._sessionDisposables.add(this._installDblClickGesture(() => l.schedule(0))), this._sessionDisposables.add(this._installLinkGesture()), this._sessionDisposables.add(this._installContextMenu()); } _installLinkGesture() { - const e = new U(), t = e.add(new EI(this._editor)), i = new U(); + const e = new _(), t = e.add(new $x(this._editor)), i = new _(); return e.add(i), e.add(t.onMouseMoveOrRelevantKeyDown((n) => { - const [o] = n, r = this._getInlayHintLabelPart(o), l = this._editor.getModel(); - if (!r || !l) { + const [o] = n, l = this._getInlayHintLabelPart(o), r = this._editor.getModel(); + if (!l || !r) { i.clear(); return; } - const a = new mi(); - i.add(Ce(() => a.dispose(!0))), r.item.resolve(a.token), this._activeInlayHintPart = r.part.command || r.part.location ? new S0e(r, o.hasTriggerModifier) : void 0; - const c = l.validatePosition(r.item.hint.position).lineNumber, d = new M(c, 1, c, l.getLineMaxColumn(c)), h = this._getInlineHintsForRange(d); - this._updateHintsDecorators([d], h), i.add(Ce(() => { - this._activeInlayHintPart = void 0, this._updateHintsDecorators([d], h); + const c = new pi(); + i.add(We(() => c.dispose(!0))), l.item.resolve(c.token), this._activeInlayHintPart = l.part.command || l.part.location ? new mfe(l, o.hasTriggerModifier) : void 0; + const d = r.validatePosition(l.item.hint.position).lineNumber, a = new I(d, 1, d, r.getLineMaxColumn(d)), h = this._getInlineHintsForRange(a); + this._updateHintsDecorators([a], h), i.add(We(() => { + this._activeInlayHintPart = void 0, this._updateHintsDecorators([a], h); })); })), e.add(t.onCancel(() => i.clear())), e.add(t.onExecute(async (n) => { const o = this._getInlayHintLabelPart(n); if (o) { - const r = o.part; - r.location ? this._instaService.invokeFunction(cj, n, this._editor, r.location) : fv.is(r.command) && await this._invokeCommand(r.command, o.item); + const l = o.part; + l.location ? this._instaService.invokeFunction(U4, n, this._editor, l.location) : Jw.is(l.command) && await this._invokeCommand(l.command, o.item); } })), e; } @@ -71276,18 +71276,18 @@ let E1 = (Dc = class { if (t.event.detail !== 2) return; const i = this._getInlayHintLabelPart(t); - if (i && (t.event.preventDefault(), await i.item.resolve(Ye.None), $n(i.item.hint.textEdits))) { - const n = i.item.hint.textEdits.map((o) => si.replace(M.lift(o.range), o.text)); + if (i && (t.event.preventDefault(), await i.item.resolve(Fe.None), ts(i.item.hint.textEdits))) { + const n = i.item.hint.textEdits.map((o) => oi.replace(I.lift(o.range), o.text)); this._editor.executeEdits("inlayHint.default", n), e(); } }); } _installContextMenu() { return this._editor.onContextMenu(async (e) => { - if (!Ki(e.event.target)) + if (!Oi(e.event.target)) return; const t = this._getInlayHintLabelPart(e); - t && await this._instaService.invokeFunction(w0e, this._editor, e.event.target, t); + t && await this._instaService.invokeFunction(hfe, this._editor, e.event.target, t); }); } _getInlayHintLabelPart(e) { @@ -71295,7 +71295,7 @@ let E1 = (Dc = class { if (e.target.type !== 6) return; const t = (i = e.target.detail.injectedText) == null ? void 0 : i.options; - if (t instanceof Eh && (t == null ? void 0 : t.attachedData) instanceof AD) + if (t instanceof zh && (t == null ? void 0 : t.attachedData) instanceof KM) return t.attachedData; } async _invokeCommand(e, t) { @@ -71303,7 +71303,7 @@ let E1 = (Dc = class { await this._commandService.executeCommand(e.id, ...e.arguments ?? []); } catch (i) { this._notificationService.notify({ - severity: yI.Error, + severity: Mx.Error, source: t.provider.displayName, message: i }); @@ -71322,94 +71322,94 @@ let E1 = (Dc = class { continue; const o = e.getDecorationRange(i); if (o) { - const r = new ZQ(o, n.item.anchor.direction), l = n.item.with({ anchor: r }); - t.set(n.item, l); + const l = new c4(o, n.item.anchor.direction), r = n.item.with({ anchor: l }); + t.set(n.item, r); } } return Array.from(t.values()); } _getHintsRanges() { const t = this._editor.getModel(), i = this._editor.getVisibleRangesPlusViewportAboveBelow(), n = []; - for (const o of i.sort(M.compareRangesUsingStarts)) { - const r = t.validateRange(new M(o.startLineNumber - 30, o.startColumn, o.endLineNumber + 30, o.endColumn)); - n.length === 0 || !M.areIntersectingOrTouching(n[n.length - 1], r) ? n.push(r) : n[n.length - 1] = M.plusRange(n[n.length - 1], r); + for (const o of i.sort(I.compareRangesUsingStarts)) { + const l = t.validateRange(new I(o.startLineNumber - 30, o.startColumn, o.endLineNumber + 30, o.endColumn)); + n.length === 0 || !I.areIntersectingOrTouching(n[n.length - 1], l) ? n.push(l) : n[n.length - 1] = I.plusRange(n[n.length - 1], l); } return n; } _updateHintsDecorators(e, t) { - var m, f; - const i = [], n = (b, y, w, C, S) => { - const L = { - content: w, + var b, g; + const i = [], n = (Z, f, y, W, G) => { + const X = { + content: y, inlineClassNameAffectsLetterSpacing: !0, - inlineClassName: y.className, - cursorStops: C, - attachedData: S + inlineClassName: f.className, + cursorStops: W, + attachedData: G }; i.push({ - item: b, - classNameRef: y, + item: Z, + classNameRef: f, decoration: { - range: b.anchor.range, + range: Z.anchor.range, options: { // className: "rangeHighlight", // DEBUG highlight to see to what range a hint is attached description: "InlayHint", - showIfCollapsed: b.anchor.range.isEmpty(), + showIfCollapsed: Z.anchor.range.isEmpty(), // "original" range is empty - collapseOnReplaceEdit: !b.anchor.range.isEmpty(), + collapseOnReplaceEdit: !Z.anchor.range.isEmpty(), stickiness: 0, - [b.anchor.direction]: this._activeRenderMode === 0 ? L : void 0 + [Z.anchor.direction]: this._activeRenderMode === 0 ? X : void 0 } } }); - }, o = (b, y) => { - const w = this._ruleFactory.createClassNameRef({ - width: `${r / 3 | 0}px`, + }, o = (Z, f) => { + const y = this._ruleFactory.createClassNameRef({ + width: `${l / 3 | 0}px`, display: "inline-block" }); - n(b, w, " ", y ? Xr.Right : Xr.None); - }, { fontSize: r, fontFamily: l, padding: a, isUniform: c } = this._getLayoutInfo(), d = "--code-editorInlayHintsFontFamily"; - this._editor.getContainerDomNode().style.setProperty(d, l); + n(Z, y, " ", f ? zl.Right : zl.None); + }, { fontSize: l, fontFamily: r, padding: c, isUniform: d } = this._getLayoutInfo(), a = "--code-editorInlayHintsFontFamily"; + this._editor.getContainerDomNode().style.setProperty(a, r); let h = { line: 0, totalLen: 0 }; - for (const b of t) { - if (h.line !== b.anchor.range.startLineNumber && (h = { line: b.anchor.range.startLineNumber, totalLen: 0 }), h.totalLen > _p._MAX_LABEL_LEN) + for (const Z of t) { + if (h.line !== Z.anchor.range.startLineNumber && (h = { line: Z.anchor.range.startLineNumber, totalLen: 0 }), h.totalLen > Mp._MAX_LABEL_LEN) continue; - b.hint.paddingLeft && o(b, !1); - const y = typeof b.hint.label == "string" ? [{ label: b.hint.label }] : b.hint.label; - for (let w = 0; w < y.length; w++) { - const C = y[w], S = w === 0, L = w === y.length - 1, x = { - fontSize: `${r}px`, - fontFamily: `var(${d}), ${ps.fontFamily}`, - verticalAlign: c ? "baseline" : "middle", + Z.hint.paddingLeft && o(Z, !1); + const f = typeof Z.hint.label == "string" ? [{ label: Z.hint.label }] : Z.hint.label; + for (let y = 0; y < f.length; y++) { + const W = f[y], G = y === 0, X = y === f.length - 1, L = { + fontSize: `${l}px`, + fontFamily: `var(${a}), ${Zs.fontFamily}`, + verticalAlign: d ? "baseline" : "middle", unicodeBidi: "isolate" }; - $n(b.hint.textEdits) && (x.cursor = "default"), this._fillInColors(x, b.hint), (C.command || C.location) && ((m = this._activeInlayHintPart) == null ? void 0 : m.part.item) === b && this._activeInlayHintPart.part.index === w && (x.textDecoration = "underline", this._activeInlayHintPart.hasTriggerModifier && (x.color = fi(Fie), x.cursor = "pointer")), a && (S && L ? (x.padding = `1px ${Math.max(1, r / 4) | 0}px`, x.borderRadius = `${r / 4 | 0}px`) : S ? (x.padding = `1px 0 1px ${Math.max(1, r / 4) | 0}px`, x.borderRadius = `${r / 4 | 0}px 0 0 ${r / 4 | 0}px`) : L ? (x.padding = `1px ${Math.max(1, r / 4) | 0}px 1px 0`, x.borderRadius = `0 ${r / 4 | 0}px ${r / 4 | 0}px 0`) : x.padding = "1px 0 1px 0"); - let Z = C.label; - h.totalLen += Z.length; - let _ = !1; - const v = h.totalLen - _p._MAX_LABEL_LEN; - if (v > 0 && (Z = Z.slice(0, -v) + "…", _ = !0), n(b, this._ruleFactory.createClassNameRef(x), L0e(Z), L && !b.hint.paddingRight ? Xr.Right : Xr.None, new AD(b, w)), _) + ts(Z.hint.textEdits) && (L.cursor = "default"), this._fillInColors(L, Z.hint), (W.command || W.location) && ((b = this._activeInlayHintPart) == null ? void 0 : b.part.item) === Z && this._activeInlayHintPart.part.index === y && (L.textDecoration = "underline", this._activeInlayHintPart.hasTriggerModifier && (L.color = Zi(Tne), L.cursor = "pointer")), c && (G && X ? (L.padding = `1px ${Math.max(1, l / 4) | 0}px`, L.borderRadius = `${l / 4 | 0}px`) : G ? (L.padding = `1px 0 1px ${Math.max(1, l / 4) | 0}px`, L.borderRadius = `${l / 4 | 0}px 0 0 ${l / 4 | 0}px`) : X ? (L.padding = `1px ${Math.max(1, l / 4) | 0}px 1px 0`, L.borderRadius = `0 ${l / 4 | 0}px ${l / 4 | 0}px 0`) : L.padding = "1px 0 1px 0"); + let S = W.label; + h.totalLen += S.length; + let x = !1; + const w = h.totalLen - Mp._MAX_LABEL_LEN; + if (w > 0 && (S = S.slice(0, -w) + "…", x = !0), n(Z, this._ruleFactory.createClassNameRef(L), bfe(S), X && !Z.hint.paddingRight ? zl.Right : zl.None, new KM(Z, y)), x) break; } - if (b.hint.paddingRight && o(b, !0), i.length > _p._MAX_DECORATORS) + if (Z.hint.paddingRight && o(Z, !0), i.length > Mp._MAX_DECORATORS) break; } const u = []; - for (const [b, y] of this._decorationsMetadata) { - const w = (f = this._editor.getModel()) == null ? void 0 : f.getDecorationRange(b); - w && e.some((C) => C.containsRange(w)) && (u.push(b), y.classNameRef.dispose(), this._decorationsMetadata.delete(b)); + for (const [Z, f] of this._decorationsMetadata) { + const y = (g = this._editor.getModel()) == null ? void 0 : g.getDecorationRange(Z); + y && e.some((W) => W.containsRange(y)) && (u.push(Z), f.classNameRef.dispose(), this._decorationsMetadata.delete(Z)); } - const g = Vl.capture(this._editor); - this._editor.changeDecorations((b) => { - const y = b.deltaDecorations(u, i.map((w) => w.decoration)); - for (let w = 0; w < y.length; w++) { - const C = i[w]; - this._decorationsMetadata.set(y[w], C); + const m = Hr.capture(this._editor); + this._editor.changeDecorations((Z) => { + const f = Z.deltaDecorations(u, i.map((y) => y.decoration)); + for (let y = 0; y < f.length; y++) { + const W = i[y]; + this._decorationsMetadata.set(f[y], W); } - }), g.restore(this._editor); + }), m.restore(this._editor); } _fillInColors(e, t) { - t.kind === VA.Parameter ? (e.backgroundColor = fi(Uie), e.color = fi(Jie)) : t.kind === VA.Type ? (e.backgroundColor = fi(Hie), e.color = fi(Oie)) : (e.backgroundColor = fi(EE), e.color = fi(RE)); + t.kind === QV.Parameter ? (e.backgroundColor = Zi(Dne), e.color = Zi(Ene)) : t.kind === QV.Type ? (e.backgroundColor = Zi(Hne), e.color = Zi(Jne)) : (e.backgroundColor = Zi(dJ), e.color = Zi(cJ)); } _getLayoutInfo() { const e = this._editor.getOption( @@ -71424,8 +71424,8 @@ let E1 = (Dc = class { ); let o = e.fontSize; (!o || o < 5 || o > i) && (o = i); - const r = e.fontFamily || n; - return { fontSize: o, fontFamily: r, padding: t, isUniform: !t && r === n && o === i }; + const l = e.fontFamily || n; + return { fontSize: o, fontFamily: l, padding: t, isUniform: !t && l === n && o === i }; } _removeAllDecorations() { this._editor.removeDecorations(Array.from(this._decorationsMetadata.keys())); @@ -71433,108 +71433,108 @@ let E1 = (Dc = class { e.classNameRef.dispose(); this._decorationsMetadata.clear(); } -}, _p = Dc, Dc.ID = "editor.contrib.InlayHints", Dc._MAX_DECORATORS = 1500, Dc._MAX_LABEL_LEN = 43, Dc); -E1 = _p = C0e([ - mp(1, ge), - mp(2, jo), - mp(3, dj), - mp(4, Qt), - mp(5, Vi), - mp(6, Se) -], E1); -function L0e(s) { +}, Mp = Jd, Jd.ID = "editor.contrib.InlayHints", Jd._MAX_DECORATORS = 1500, Jd._MAX_LABEL_LEN = 43, Jd); +OW = Mp = ufe([ + yp(1, me), + yp(2, $o), + yp(3, P4), + yp(4, Ot), + yp(5, vi), + yp(6, Ge) +], OW); +function bfe(s) { return s.replace(/[ \t]/g, " "); } st.registerCommand("_executeInlayHintProvider", async (s, ...e) => { const [t, i] = e; - ht(Le.isUri(t)), ht(M.isIRange(i)); - const { inlayHintsProvider: n } = s.get(ge), o = await s.get(Ys).createModelReference(t); + ht(Xe.isUri(t)), ht(I.isIRange(i)); + const { inlayHintsProvider: n } = s.get(me), o = await s.get(As).createModelReference(t); try { - const r = await Ix.create(n, o.object.textEditorModel, [M.lift(i)], Ye.None), l = r.items.map((a) => a.hint); - return setTimeout(() => r.dispose(), 0), l; + const l = await AL.create(n, o.object.textEditorModel, [I.lift(i)], Fe.None), r = l.items.map((c) => c.hint); + return setTimeout(() => l.dispose(), 0), r; } finally { o.dispose(); } }); -var A0e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var pfe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, fd = function(s, e) { +}, Wa = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class M3 extends WL { +class OA extends UX { constructor(e, t, i, n) { super(10, t, e.item.anchor.range, i, n, !0), this.part = e; } } -let zx = class extends T1 { - constructor(e, t, i, n, o, r, l, a, c) { - super(e, t, i, r, a, n, o, c), this._resolverService = l, this.hoverOrdinal = 6; +let nI = class extends KW { + constructor(e, t, i, n, o, l, r, c, d) { + super(e, t, i, l, c, n, o, d), this._resolverService = r, this.hoverOrdinal = 6; } suggestHoverAnchor(e) { var n; - if (!E1.get(this._editor) || e.target.type !== 6) + if (!OW.get(this._editor) || e.target.type !== 6) return null; const i = (n = e.target.detail.injectedText) == null ? void 0 : n.options; - return i instanceof Eh && i.attachedData instanceof AD ? new M3(i.attachedData, this, e.event.posx, e.event.posy) : null; + return i instanceof zh && i.attachedData instanceof KM ? new OA(i.attachedData, this, e.event.posx, e.event.posy) : null; } computeSync() { return []; } computeAsync(e, t, i) { - return e instanceof M3 ? new Ro(async (n) => { + return e instanceof OA ? new Eo(async (n) => { const { part: o } = e; if (await o.item.resolve(i), i.isCancellationRequested) return; - let r; - typeof o.item.hint.tooltip == "string" ? r = new Vn().appendText(o.item.hint.tooltip) : o.item.hint.tooltip && (r = o.item.hint.tooltip), r && n.emitOne(new Rr(this, e.range, [r], !1, 0)), $n(o.item.hint.textEdits) && n.emitOne(new Rr(this, e.range, [new Vn().appendText(p("hint.dbl", "Double-click to insert"))], !1, 10001)); let l; - if (typeof o.part.tooltip == "string" ? l = new Vn().appendText(o.part.tooltip) : o.part.tooltip && (l = o.part.tooltip), l && n.emitOne(new Rr(this, e.range, [l], !1, 1)), o.part.location || o.part.command) { - let c; + typeof o.item.hint.tooltip == "string" ? l = new kn().appendText(o.item.hint.tooltip) : o.item.hint.tooltip && (l = o.item.hint.tooltip), l && n.emitOne(new Dl(this, e.range, [l], !1, 0)), ts(o.item.hint.textEdits) && n.emitOne(new Dl(this, e.range, [new kn().appendText(p("hint.dbl", "Double-click to insert"))], !1, 10001)); + let r; + if (typeof o.part.tooltip == "string" ? r = new kn().appendText(o.part.tooltip) : o.part.tooltip && (r = o.part.tooltip), r && n.emitOne(new Dl(this, e.range, [r], !1, 1)), o.part.location || o.part.command) { + let d; const h = this._editor.getOption( 78 /* EditorOption.multiCursorModifier */ ) === "altKey" ? qe ? p("links.navigate.kb.meta.mac", "cmd + click") : p("links.navigate.kb.meta", "ctrl + click") : qe ? p("links.navigate.kb.alt.mac", "option + click") : p("links.navigate.kb.alt", "alt + click"); - o.part.location && o.part.command ? c = new Vn().appendText(p("hint.defAndCommand", "Go to Definition ({0}), right click for more", h)) : o.part.location ? c = new Vn().appendText(p("hint.def", "Go to Definition ({0})", h)) : o.part.command && (c = new Vn(`[${p("hint.cmd", "Execute Command")}](${Yfe(o.part.command)} "${o.part.command.title}") (${h})`, { isTrusted: !0 })), c && n.emitOne(new Rr(this, e.range, [c], !1, 1e4)); + o.part.location && o.part.command ? d = new kn().appendText(p("hint.defAndCommand", "Go to Definition ({0}), right click for more", h)) : o.part.location ? d = new kn().appendText(p("hint.def", "Go to Definition ({0})", h)) : o.part.command && (d = new kn(`[${p("hint.cmd", "Execute Command")}](${MZe(o.part.command)} "${o.part.command.title}") (${h})`, { isTrusted: !0 })), d && n.emitOne(new Dl(this, e.range, [d], !1, 1e4)); } - const a = await this._resolveInlayHintLabelPartHover(o, i); - for await (const c of a) - n.emitOne(c); - }) : Ro.EMPTY; + const c = await this._resolveInlayHintLabelPartHover(o, i); + for await (const d of c) + n.emitOne(d); + }) : Eo.EMPTY; } async _resolveInlayHintLabelPartHover(e, t) { if (!e.part.location) - return Ro.EMPTY; + return Eo.EMPTY; const { uri: i, range: n } = e.part.location, o = await this._resolverService.createModelReference(i); try { - const r = o.object.textEditorModel; - return this._languageFeaturesService.hoverProvider.has(r) ? c5(this._languageFeaturesService.hoverProvider, r, new V(n.startLineNumber, n.startColumn), t).filter((l) => !Cb(l.hover.contents)).map((l) => new Rr(this, e.item.anchor.range, l.hover.contents, !1, 2 + l.ordinal)) : Ro.EMPTY; + const l = o.object.textEditorModel; + return this._languageFeaturesService.hoverProvider.has(l) ? YH(this._languageFeaturesService.hoverProvider, l, new Y(n.startLineNumber, n.startColumn), t).filter((r) => !SZ(r.hover.contents)).map((r) => new Dl(this, e.item.anchor.range, r.hover.contents, !1, 2 + r.ordinal)) : Eo.EMPTY; } finally { o.dispose(); } } }; -zx = A0e([ - fd(1, ri), - fd(2, Bs), - fd(3, xt), - fd(4, Pa), - fd(5, Ke), - fd(6, Ys), - fd(7, ge), - fd(8, Qt) -], zx); -class T5 extends R { - constructor(e, t, i, n, o, r) { +nI = pfe([ + Wa(1, ri), + Wa(2, Ps), + Wa(3, Lt), + Wa(4, Bc), + Wa(5, Qe), + Wa(6, As), + Wa(7, me), + Wa(8, Ot) +], nI); +class nE extends J { + constructor(e, t, i, n, o, l) { super(); - const l = t.anchor, a = t.hoverParts; - this._renderedHoverParts = this._register(new xD(e, i, a, r, o)); - const { showAtPosition: c, showAtSecondaryPosition: d } = T5.computeHoverPositions(e, l.range, a); - this.shouldAppearBeforeContent = a.some((h) => h.isBeforeContent), this.showAtPosition = c, this.showAtSecondaryPosition = d, this.initialMousePosX = l.initialMousePosX, this.initialMousePosY = l.initialMousePosY, this.shouldFocus = n.shouldFocus, this.source = n.source; + const r = t.anchor, c = t.hoverParts; + this._renderedHoverParts = this._register(new UM(e, i, c, l, o)); + const { showAtPosition: d, showAtSecondaryPosition: a } = nE.computeHoverPositions(e, r.range, c); + this.shouldAppearBeforeContent = c.some((h) => h.isBeforeContent), this.showAtPosition = d, this.showAtSecondaryPosition = a, this.initialMousePosX = r.initialMousePosX, this.initialMousePosY = r.initialMousePosY, this.shouldFocus = n.shouldFocus, this.source = n.source; } get domNode() { return this._renderedHoverParts.domNode; @@ -71554,32 +71554,32 @@ class T5 extends R { static computeHoverPositions(e, t, i) { let n = 1; if (e.hasModel()) { - const d = e._getViewModel(), h = d.coordinatesConverter, u = h.convertModelRangeToViewRange(t), g = d.getLineMinColumn(u.startLineNumber), m = new V(u.startLineNumber, g); - n = h.convertViewPositionToModelPosition(m).column; + const a = e._getViewModel(), h = a.coordinatesConverter, u = h.convertModelRangeToViewRange(t), m = a.getLineMinColumn(u.startLineNumber), b = new Y(u.startLineNumber, m); + n = h.convertViewPositionToModelPosition(b).column; } const o = t.startLineNumber; - let r = t.startColumn, l; - for (const d of i) { - const h = d.range, u = h.startLineNumber === o, g = h.endLineNumber === o; - if (u && g) { - const f = h.startColumn, b = Math.min(r, f); - r = Math.max(b, n); + let l = t.startColumn, r; + for (const a of i) { + const h = a.range, u = h.startLineNumber === o, m = h.endLineNumber === o; + if (u && m) { + const g = h.startColumn, Z = Math.min(l, g); + l = Math.max(Z, n); } - d.forceShowAtRange && (l = h); + a.forceShowAtRange && (r = h); } - let a, c; - if (l) { - const d = l.getStartPosition(); - a = d, c = d; + let c, d; + if (r) { + const a = r.getStartPosition(); + c = a, d = a; } else - a = t.getStartPosition(), c = new V(o, r); + c = t.getStartPosition(), d = new Y(o, l); return { - showAtPosition: a, - showAtSecondaryPosition: c + showAtPosition: c, + showAtSecondaryPosition: d }; } } -class x0e { +class gfe { constructor(e, t) { this._statusBar = t, e.appendChild(this._statusBar.hoverElement); } @@ -71593,62 +71593,62 @@ class x0e { this._statusBar.dispose(); } } -const VZ = class VZ extends R { +const Q2 = class Q2 extends J { constructor(e, t, i, n, o) { super(), this._renderedParts = [], this._focusedHoverPartIndex = -1, this._context = o, this._fragment = document.createDocumentFragment(), this._register(this._renderParts(t, i, o, n)), this._register(this._registerListenersOnRenderedParts()), this._register(this._createEditorDecorations(e, i)), this._updateMarkdownAndColorParticipantInfo(t); } _createEditorDecorations(e, t) { if (t.length === 0) - return R.None; + return J.None; let i = t[0].range; for (const o of t) { - const r = o.range; - i = M.plusRange(i, r); + const l = o.range; + i = I.plusRange(i, l); } const n = e.createDecorationsCollection(); return n.set([{ range: i, - options: VZ._DECORATION_OPTIONS - }]), Ce(() => { + options: Q2._DECORATION_OPTIONS + }]), We(() => { n.clear(); }); } _renderParts(e, t, i, n) { - const o = new _x(n), r = { + const o = new zL(n), l = { fragment: this._fragment, statusBar: o, ...i - }, l = new U(); - for (const c of e) { - const d = this._renderHoverPartsForParticipant(t, c, r); - l.add(d); - for (const h of d.renderedHoverParts) + }, r = new _(); + for (const d of e) { + const a = this._renderHoverPartsForParticipant(t, d, l); + r.add(a); + for (const h of a.renderedHoverParts) this._renderedParts.push({ type: "hoverPart", - participant: c, + participant: d, hoverPart: h.hoverPart, hoverElement: h.hoverElement }); } - const a = this._renderStatusBar(this._fragment, o); - return a && (l.add(a), this._renderedParts.push({ + const c = this._renderStatusBar(this._fragment, o); + return c && (r.add(c), this._renderedParts.push({ type: "statusBar", - hoverElement: a.hoverElement, - actions: a.actions - })), Ce(() => { - l.dispose(); + hoverElement: c.hoverElement, + actions: c.actions + })), We(() => { + r.dispose(); }); } _renderHoverPartsForParticipant(e, t, i) { - const n = e.filter((r) => r.owner === t); - return n.length > 0 ? t.renderHoverParts(i, n) : new Zm([]); + const n = e.filter((l) => l.owner === t); + return n.length > 0 ? t.renderHoverParts(i, n) : new wb([]); } _renderStatusBar(e, t) { if (t.hasContent) - return new x0e(e, t); + return new gfe(e, t); } _registerListenersOnRenderedParts() { - const e = new U(); + const e = new _(); return this._renderedParts.forEach((t, i) => { const n = t.hoverElement; n.tabIndex = 0, e.add(z(n, ie.FOCUS_IN, (o) => { @@ -71659,8 +71659,8 @@ const VZ = class VZ extends R { }), e; } _updateMarkdownAndColorParticipantInfo(e) { - const t = e.find((i) => i instanceof T1 && !(i instanceof zx)); - t && (this._markdownHoverParticipant = t), this._colorHoverParticipant = e.find((i) => i instanceof W1); + const t = e.find((i) => i instanceof KW && !(i instanceof nI)); + t && (this._markdownHoverParticipant = t), this._colorHoverParticipant = e.find((i) => i instanceof zW); } async updateHoverVerbosityLevel(e, t, i) { if (!this._markdownHoverParticipant) @@ -71684,9 +71684,9 @@ const VZ = class VZ extends R { const i = this._renderedParts[t]; if (!i || i.type !== "hoverPart" || !(i.participant === e)) return; - const o = this._renderedParts.findIndex((r) => r.type === "hoverPart" && r.participant === e); + const o = this._renderedParts.findIndex((l) => l.type === "hoverPart" && l.participant === e); if (o === -1) - throw new mt(); + throw new bt(); return t - o; } get domNode() { @@ -71699,28 +71699,28 @@ const VZ = class VZ extends R { return this._focusedHoverPartIndex; } }; -VZ._DECORATION_OPTIONS = Re.register({ +Q2._DECORATION_OPTIONS = Je.register({ description: "content-hover-highlight", className: "hoverHighlight" }); -let xD = VZ; -var M0e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +let UM = Q2; +var Zfe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Z3 = function(s, e) { +}, jA = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let MD = class extends R { +let PM = class extends J { constructor(e, t, i) { - super(), this._editor = e, this._instantiationService = t, this._keybindingService = i, this._currentResult = null, this._onContentsChanged = this._register(new k()), this.onContentsChanged = this._onContentsChanged.event, this._contentHoverWidget = this._register(this._instantiationService.createInstance(nD, this._editor)), this._participants = this._initializeHoverParticipants(), this._computer = new Zx(this._editor, this._participants), this._hoverOperation = this._register(new yQ(this._editor, this._computer)), this._registerListeners(); + super(), this._editor = e, this._instantiationService = t, this._keybindingService = i, this._currentResult = null, this._onContentsChanged = this._register(new k()), this.onContentsChanged = this._onContentsChanged.event, this._contentHoverWidget = this._register(this._instantiationService.createInstance(LM, this._editor)), this._participants = this._initializeHoverParticipants(), this._computer = new FL(this._editor, this._participants), this._hoverOperation = this._register(new e4(this._editor, this._computer)), this._registerListeners(); } _initializeHoverParticipants() { const e = []; - for (const t of Om.getAll()) { + for (const t of Ob.getAll()) { const i = this._instantiationService.createInstance(t, this._editor); e.push(i); } @@ -71736,17 +71736,17 @@ let MD = class extends R { if (!this._computer.anchor) return; const i = t.hasLoadingMessage ? this._addLoadingMessage(t.value) : t.value; - this._withResult(new LQ(this._computer.anchor, i, t.isComplete)); + this._withResult(new s4(this._computer.anchor, i, t.isComplete)); })); const e = this._contentHoverWidget.getDomNode(); - this._register(ai(e, "keydown", (t) => { + this._register(di(e, "keydown", (t) => { t.equals( 9 /* KeyCode.Escape */ ) && this.hide(); - })), this._register(ai(e, "mouseleave", (t) => { + })), this._register(di(e, "mouseleave", (t) => { this._onMouseLeave(t); - })), this._register(Wi.onDidChange(() => { + })), this._register(Ti.onDidChange(() => { this._contentHoverWidget.position && this._currentResult && this._setCurrentResult(this._currentResult); })); } @@ -71756,11 +71756,11 @@ let MD = class extends R { _startShowingOrUpdateHover(e, t, i, n, o) { if (!(this._contentHoverWidget.position && this._currentResult)) return e ? (this._startHoverOperationIfNecessary(e, t, i, n, !1), !0) : !1; - const l = this._editor.getOption( + const r = this._editor.getOption( 60 /* EditorOption.hover */ - ).sticky, a = o && this._contentHoverWidget.isMouseGettingCloser(o.event.posx, o.event.posy); - return l && a ? (e && this._startHoverOperationIfNecessary(e, t, i, n, !0), !0) : e ? this._currentResult.anchor.equals(e) ? !0 : e.canAdoptVisibleHover(this._currentResult.anchor, this._contentHoverWidget.position) ? (this._setCurrentResult(this._currentResult.filter(e)), this._startHoverOperationIfNecessary(e, t, i, n, !1), !0) : (this._setCurrentResult(null), this._startHoverOperationIfNecessary(e, t, i, n, !1), !0) : (this._setCurrentResult(null), !1); + ).sticky, c = o && this._contentHoverWidget.isMouseGettingCloser(o.event.posx, o.event.posy); + return r && c ? (e && this._startHoverOperationIfNecessary(e, t, i, n, !0), !0) : e ? this._currentResult.anchor.equals(e) ? !0 : e.canAdoptVisibleHover(this._currentResult.anchor, this._contentHoverWidget.position) ? (this._setCurrentResult(this._currentResult.filter(e)), this._startHoverOperationIfNecessary(e, t, i, n, !1), !0) : (this._setCurrentResult(null), this._startHoverOperationIfNecessary(e, t, i, n, !1), !0) : (this._setCurrentResult(null), !1); } _startHoverOperationIfNecessary(e, t, i, n, o) { this._computer.anchor && this._computer.anchor.equals(e) || (this._hoverOperation.cancel(), this._computer.anchor = e, this._computer.shouldFocus = n, this._computer.source = i, this._computer.insistOnKeepingHoverVisible = o, this._hoverOperation.start(t)); @@ -71791,7 +71791,7 @@ let MD = class extends R { } _showHover(e) { const t = this._getHoverContext(); - this._renderedContentHover = new T5(this._editor, e, this._participants, this._computer, t, this._keybindingService), this._renderedContentHover.domNodeHasChildren ? this._contentHoverWidget.show(this._renderedContentHover) : this._renderedContentHover.dispose(); + this._renderedContentHover = new nE(this._editor, e, this._participants, this._computer, t, this._keybindingService), this._renderedContentHover.domNodeHasChildren ? this._contentHoverWidget.show(this._renderedContentHover) : this._renderedContentHover.dispose(); } _hideHover() { this._contentHoverWidget.hide(); @@ -71825,7 +71825,7 @@ let MD = class extends R { const i = e.target; switch (i.type) { case 6: { - t.push(new MW(0, i.range, e.event.posx, e.event.posy)); + t.push(new FR(0, i.range, e.event.posx, e.event.posy)); break; } case 7: { @@ -71835,7 +71835,7 @@ let MD = class extends R { ).typicalHalfwidthCharacterWidth / 2; if (!(!i.detail.isAfterLines && typeof i.detail.horizontalDistanceToText == "number" && i.detail.horizontalDistanceToText < n)) break; - t.push(new MW(0, i.range, e.event.posx, e.event.posy)); + t.push(new FR(0, i.range, e.event.posx, e.event.posy)); break; } } @@ -71843,10 +71843,10 @@ let MD = class extends R { } _onMouseLeave(e) { const t = this._editor.getDomNode(); - (!t || !GI(t, e.x, e.y)) && this.hide(); + (!t || !jx(t, e.x, e.y)) && this.hide(); } startShowingAtRange(e, t, i, n) { - this._startShowingOrUpdateHover(new MW(0, e, void 0, void 0), t, i, n, null); + this._startShowingOrUpdateHover(new FR(0, e, void 0, void 0), t, i, n, null); } async updateHoverVerbosityLevel(e, t, i) { var n; @@ -71912,26 +71912,26 @@ let MD = class extends R { return this._contentHoverWidget; } }; -MD = M0e([ - Z3(1, Se), - Z3(2, xt) -], MD); -var Z0e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +PM = Zfe([ + jA(1, Ge), + jA(2, Lt) +], PM); +var ffe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, _3 = function(s, e) { +}, qA = function(s, e) { return function(t, i) { e(t, i, s); }; -}, ZD, vg; -let es = (vg = class extends R { +}, BM, vm; +let is = (vm = class extends J { constructor(e, t, i) { - super(), this._editor = e, this._instantiationService = t, this._keybindingService = i, this._onHoverContentsChanged = this._register(new k()), this.shouldKeepOpenOnEditorMouseMoveOrLeave = !1, this._listenersStore = new U(), this._hoverState = { + super(), this._editor = e, this._instantiationService = t, this._keybindingService = i, this._onHoverContentsChanged = this._register(new k()), this.shouldKeepOpenOnEditorMouseMoveOrLeave = !1, this._listenersStore = new _(), this._hoverState = { mouseDown: !1, activatedByDecoratorClick: !1 - }, this._reactToEditorMouseMoveRunner = this._register(new Zt(() => this._reactToEditorMouseMove(this._mouseMoveEvent), 0)), this._hookListeners(), this._register(this._editor.onDidChangeConfiguration((n) => { + }, this._reactToEditorMouseMoveRunner = this._register(new St(() => this._reactToEditorMouseMove(this._mouseMoveEvent), 0)), this._hookListeners(), this._register(this._editor.onDidChangeConfiguration((n) => { n.hasChanged( 60 /* EditorOption.hover */ @@ -71939,7 +71939,7 @@ let es = (vg = class extends R { })); } static get(e) { - return e.getContribution(ZD.ID); + return e.getContribution(BM.ID); } _hookListeners() { const e = this._editor.getOption( @@ -71972,7 +71972,7 @@ let es = (vg = class extends R { _isMouseOnContentHoverWidget(e) { var i; const t = (i = this._contentWidget) == null ? void 0 : i.getDomNode(); - return t ? GI(t, e.event.posx, e.event.posy) : !1; + return t ? jx(t, e.event.posx, e.event.posy) : !1; } _onEditorMouseUp() { this._hoverState.mouseDown = !1; @@ -71981,46 +71981,46 @@ let es = (vg = class extends R { this.shouldKeepOpenOnEditorMouseMoveOrLeave || (this._cancelScheduler(), this._shouldNotHideCurrentHoverWidget(e)) || this._hideWidgets(); } _shouldNotRecomputeCurrentHoverWidget(e) { - const t = this._hoverSettings.sticky, i = (r, l) => { - const a = this._isMouseOnContentHoverWidget(r); - return l && a; - }, n = (r) => { - var c; - const l = this._isMouseOnContentHoverWidget(r), a = ((c = this._contentWidget) == null ? void 0 : c.isColorPickerVisible) ?? !1; - return l && a; - }, o = (r, l) => { - var a, c, d, h; - return (l && ((c = this._contentWidget) == null ? void 0 : c.containsNode((a = r.event.browserEvent.view) == null ? void 0 : a.document.activeElement)) && !((h = (d = r.event.browserEvent.view) == null ? void 0 : d.getSelection()) != null && h.isCollapsed)) ?? !1; + const t = this._hoverSettings.sticky, i = (l, r) => { + const c = this._isMouseOnContentHoverWidget(l); + return r && c; + }, n = (l) => { + var d; + const r = this._isMouseOnContentHoverWidget(l), c = ((d = this._contentWidget) == null ? void 0 : d.isColorPickerVisible) ?? !1; + return r && c; + }, o = (l, r) => { + var c, d, a, h; + return (r && ((d = this._contentWidget) == null ? void 0 : d.containsNode((c = l.event.browserEvent.view) == null ? void 0 : c.document.activeElement)) && !((h = (a = l.event.browserEvent.view) == null ? void 0 : a.getSelection()) != null && h.isCollapsed)) ?? !1; }; return i(e, t) || n(e) || o(e, t); } _onEditorMouseMove(e) { - var l, a, c, d; - if (this.shouldKeepOpenOnEditorMouseMoveOrLeave || (this._mouseMoveEvent = e, (l = this._contentWidget) != null && l.isFocused || (a = this._contentWidget) != null && a.isResizing)) + var r, c, d, a; + if (this.shouldKeepOpenOnEditorMouseMoveOrLeave || (this._mouseMoveEvent = e, (r = this._contentWidget) != null && r.isFocused || (c = this._contentWidget) != null && c.isResizing)) return; const t = this._hoverSettings.sticky; - if (t && ((c = this._contentWidget) != null && c.isVisibleFromKeyboard)) + if (t && ((d = this._contentWidget) != null && d.isVisibleFromKeyboard)) return; if (this._shouldNotRecomputeCurrentHoverWidget(e)) { this._reactToEditorMouseMoveRunner.cancel(); return; } const n = this._hoverSettings.hidingDelay; - if (((d = this._contentWidget) == null ? void 0 : d.isVisible) && t && n > 0) { + if (((a = this._contentWidget) == null ? void 0 : a.isVisible) && t && n > 0) { this._reactToEditorMouseMoveRunner.isScheduled() || this._reactToEditorMouseMoveRunner.schedule(n); return; } this._reactToEditorMouseMove(e); } _reactToEditorMouseMove(e) { - var a; + var c; if (!e) return; - const i = (a = e.target.element) == null ? void 0 : a.classList.contains("colorpicker-color-decoration"), n = this._editor.getOption( + const i = (c = e.target.element) == null ? void 0 : c.classList.contains("colorpicker-color-decoration"), n = this._editor.getOption( 149 /* EditorOption.colorDecoratorsActivatedOn */ - ), o = this._hoverSettings.enabled, r = this._hoverState.activatedByDecoratorClick; - if (i && (n === "click" && !r || n === "hover" && !o || n === "clickAndHover" && !o && !r) || !i && !o && !r) { + ), o = this._hoverSettings.enabled, l = this._hoverState.activatedByDecoratorClick; + if (i && (n === "click" && !l || n === "hover" && !o || n === "clickAndHover" && !o && !l) || !i && !o && !l) { this._hideWidgets(); return; } @@ -72033,15 +72033,15 @@ let es = (vg = class extends R { var n; if (!this._editor.hasModel()) return; - const t = this._keybindingService.softDispatch(e, this._editor.getDomNode()), i = t.kind === 1 || t.kind === 2 && (t.commandId === mQ || t.commandId === VI || t.commandId === kI) && ((n = this._contentWidget) == null ? void 0 : n.isVisible); + const t = this._keybindingService.softDispatch(e, this._editor.getDomNode()), i = t.kind === 1 || t.kind === 2 && (t.commandId === Oj || t.commandId === Qx || t.commandId === Ox) && ((n = this._contentWidget) == null ? void 0 : n.isVisible); e.keyCode === 5 || e.keyCode === 6 || e.keyCode === 57 || e.keyCode === 4 || i || this._hideWidgets(); } _hideWidgets() { var e, t; - this._hoverState.mouseDown && ((e = this._contentWidget) != null && e.isColorPickerVisible) || _b.dropDownVisible || (this._hoverState.activatedByDecoratorClick = !1, (t = this._contentWidget) == null || t.hide()); + this._hoverState.mouseDown && ((e = this._contentWidget) != null && e.isColorPickerVisible) || MZ.dropDownVisible || (this._hoverState.activatedByDecoratorClick = !1, (t = this._contentWidget) == null || t.hide()); } _getOrCreateContentWidget() { - return this._contentWidget || (this._contentWidget = this._instantiationService.createInstance(MD, this._editor), this._listenersStore.add(this._contentWidget.onContentsChanged(() => this._onHoverContentsChanged.fire()))), this._contentWidget; + return this._contentWidget || (this._contentWidget = this._instantiationService.createInstance(PM, this._editor), this._listenersStore.add(this._contentWidget.onContentsChanged(() => this._onHoverContentsChanged.fire()))), this._contentWidget; } showContentHover(e, t, i, n, o = !1) { this._hoverState.activatedByDecoratorClick = o, this._getOrCreateContentWidget().startShowingAtRange(e, t, i, n); @@ -72104,12 +72104,12 @@ let es = (vg = class extends R { var e; super.dispose(), this._unhookListeners(), this._listenersStore.dispose(), (e = this._contentWidget) == null || e.dispose(); } -}, ZD = vg, vg.ID = "editor.contrib.contentHover", vg); -es = ZD = Z0e([ - _3(1, Se), - _3(2, xt) -], es); -const _9 = class _9 extends R { +}, BM = vm, vm.ID = "editor.contrib.contentHover", vm); +is = BM = ffe([ + qA(1, Ge), + qA(2, Lt) +], is); +const qE = class qE extends J { // ms constructor(e) { super(), this._editor = e, this._register(e.onMouseDown((t) => this.onMouseDown(t))); @@ -72125,41 +72125,41 @@ const _9 = class _9 extends R { if (t !== "click" && t !== "clickAndHover") return; const i = e.target; - if (i.type !== 6 || !i.detail.injectedText || i.detail.injectedText.options.attachedData !== lQ || !i.range) + if (i.type !== 6 || !i.detail.injectedText || i.detail.injectedText.options.attachedData !== Aj || !i.range) return; - const n = this._editor.getContribution(es.ID); + const n = this._editor.getContribution(is.ID); if (n && !n.isColorPickerVisible) { - const o = new M(i.range.startLineNumber, i.range.startColumn + 1, i.range.endLineNumber, i.range.endColumn + 1); + const o = new I(i.range.startLineNumber, i.range.startColumn + 1, i.range.endLineNumber, i.range.endColumn + 1); n.showContentHover(o, 1, 0, !1, !0); } } }; -_9.ID = "editor.contrib.colorContribution"; -let Px = _9; -gt( - Px.ID, - Px, +qE.ID = "editor.contrib.colorContribution"; +let sI = qE; +mt( + sI.ID, + sI, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */ ); -Om.register(W1); -var hj = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +Ob.register(zW); +var B4 = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Jp = function(s, e) { +}, $p = function(s, e) { return function(t, i) { e(t, i, s); }; -}, _D, ID, Tg; -let Nm = (Tg = class extends R { +}, _M, QM, Jm; +let Yb = (Jm = class extends J { constructor(e, t, i) { - super(), this._editor = e, this._instantiationService = i, this._standaloneColorPickerWidget = null, this._standaloneColorPickerVisible = I.standaloneColorPickerVisible.bindTo(t), this._standaloneColorPickerFocused = I.standaloneColorPickerFocused.bindTo(t); + super(), this._editor = e, this._instantiationService = i, this._standaloneColorPickerWidget = null, this._standaloneColorPickerVisible = C.standaloneColorPickerVisible.bindTo(t), this._standaloneColorPickerFocused = C.standaloneColorPickerFocused.bindTo(t); } showOrFocus() { var e; - this._editor.hasModel() && (this._standaloneColorPickerVisible.get() ? this._standaloneColorPickerFocused.get() || (e = this._standaloneColorPickerWidget) == null || e.focus() : this._standaloneColorPickerWidget = this._instantiationService.createInstance(ND, this._editor, this._standaloneColorPickerVisible, this._standaloneColorPickerFocused)); + this._editor.hasModel() && (this._standaloneColorPickerVisible.get() ? this._standaloneColorPickerFocused.get() || (e = this._standaloneColorPickerWidget) == null || e.focus() : this._standaloneColorPickerWidget = this._instantiationService.createInstance(OM, this._editor, this._standaloneColorPickerVisible, this._standaloneColorPickerFocused)); } hide() { var e; @@ -72170,50 +72170,50 @@ let Nm = (Tg = class extends R { (e = this._standaloneColorPickerWidget) == null || e.updateEditor(), this.hide(); } static get(e) { - return e.getContribution(_D.ID); - } -}, _D = Tg, Tg.ID = "editor.contrib.standaloneColorPickerController", Tg); -Nm = _D = hj([ - Jp(1, _e), - Jp(2, Se) -], Nm); -gt( - Nm.ID, - Nm, + return e.getContribution(_M.ID); + } +}, _M = Jm, Jm.ID = "editor.contrib.standaloneColorPickerController", Jm); +Yb = _M = B4([ + $p(1, xe), + $p(2, Ge) +], Yb); +mt( + Yb.ID, + Yb, 1 /* EditorContributionInstantiation.AfterFirstRender */ ); -const I3 = 8, _0e = 22; -var Dg; -let ND = (Dg = class extends R { - constructor(e, t, i, n, o, r, l) { +const $A = 8, yfe = 22; +var Hm; +let OM = (Hm = class extends J { + constructor(e, t, i, n, o, l, r) { var h; - super(), this._editor = e, this._standaloneColorPickerVisible = t, this._standaloneColorPickerFocused = i, this._keybindingService = o, this._languageFeaturesService = r, this._editorWorkerService = l, this.allowEditorOverflow = !0, this._position = void 0, this._body = document.createElement("div"), this._colorHover = null, this._selectionSetInEditor = !1, this._onResult = this._register(new k()), this.onResult = this._onResult.event, this._standaloneColorPickerVisible.set(!0), this._standaloneColorPickerParticipant = n.createInstance(v1, this._editor), this._position = (h = this._editor._getViewModel()) == null ? void 0 : h.getPrimaryCursorState().modelState.position; - const a = this._editor.getSelection(), c = a ? { - startLineNumber: a.startLineNumber, - startColumn: a.startColumn, - endLineNumber: a.endLineNumber, - endColumn: a.endColumn - } : { startLineNumber: 0, endLineNumber: 0, endColumn: 0, startColumn: 0 }, d = this._register(vl(this._body)); - this._register(d.onDidBlur((u) => { + super(), this._editor = e, this._standaloneColorPickerVisible = t, this._standaloneColorPickerFocused = i, this._keybindingService = o, this._languageFeaturesService = l, this._editorWorkerService = r, this.allowEditorOverflow = !0, this._position = void 0, this._body = document.createElement("div"), this._colorHover = null, this._selectionSetInEditor = !1, this._onResult = this._register(new k()), this.onResult = this._onResult.event, this._standaloneColorPickerVisible.set(!0), this._standaloneColorPickerParticipant = n.createInstance(AW, this._editor), this._position = (h = this._editor._getViewModel()) == null ? void 0 : h.getPrimaryCursorState().modelState.position; + const c = this._editor.getSelection(), d = c ? { + startLineNumber: c.startLineNumber, + startColumn: c.startColumn, + endLineNumber: c.endLineNumber, + endColumn: c.endColumn + } : { startLineNumber: 0, endLineNumber: 0, endColumn: 0, startColumn: 0 }, a = this._register(kr(this._body)); + this._register(a.onDidBlur((u) => { this.hide(); - })), this._register(d.onDidFocus((u) => { + })), this._register(a.onDidFocus((u) => { this.focus(); })), this._register(this._editor.onDidChangeCursorPosition(() => { this._selectionSetInEditor ? this._selectionSetInEditor = !1 : this.hide(); })), this._register(this._editor.onMouseMove((u) => { - var m; - const g = (m = u.target.element) == null ? void 0 : m.classList; - g && g.contains("colorpicker-color-decoration") && this.hide(); + var b; + const m = (b = u.target.element) == null ? void 0 : b.classList; + m && m.contains("colorpicker-color-decoration") && this.hide(); })), this._register(this.onResult((u) => { this._render(u.value, u.foundInEditor); - })), this._start(c), this._body.style.zIndex = "50", this._editor.addContentWidget(this); + })), this._start(d), this._body.style.zIndex = "50", this._editor.addContentWidget(this); } updateEditor() { this._colorHover && this._standaloneColorPickerParticipant.updateEditorModel(this._colorHover); } getId() { - return ID.ID; + return QM.ID; } getDomNode() { return this._body; @@ -72249,7 +72249,7 @@ let ND = (Dg = class extends R { } async _start(e) { const t = await this._computeAsync(e); - t && this._onResult.fire(new I0e(t.result, t.foundInEditor)); + t && this._onResult.fire(new Wfe(t.result, t.foundInEditor)); } async _computeAsync(e) { if (!this._editor.hasModel()) @@ -72257,11 +72257,11 @@ let ND = (Dg = class extends R { const t = { range: e, color: { red: 0, green: 0, blue: 0, alpha: 1 } - }, i = await this._standaloneColorPickerParticipant.createColorHover(t, new N1(this._editorWorkerService), this._languageFeaturesService.colorProvider); + }, i = await this._standaloneColorPickerParticipant.createColorHover(t, new FW(this._editorWorkerService), this._languageFeaturesService.colorProvider); return i ? { result: i.colorHover, foundInEditor: i.foundInEditor } : null; } _render(e, t) { - const i = document.createDocumentFragment(), n = this._register(new _x(this._keybindingService)), o = { + const i = document.createDocumentFragment(), n = this._register(new zL(this._keybindingService)), o = { fragment: i, statusBar: n, onContentsChanged: () => { @@ -72269,44 +72269,44 @@ let ND = (Dg = class extends R { hide: () => this.hide() }; this._colorHover = e; - const r = this._standaloneColorPickerParticipant.renderHoverParts(o, [e]); - if (!r) + const l = this._standaloneColorPickerParticipant.renderHoverParts(o, [e]); + if (!l) return; - this._register(r.disposables); - const l = r.colorPicker; - this._body.classList.add("standalone-colorpicker-body"), this._body.style.maxHeight = Math.max(this._editor.getLayoutInfo().height / 4, 250) + "px", this._body.style.maxWidth = Math.max(this._editor.getLayoutInfo().width * 0.66, 500) + "px", this._body.tabIndex = 0, this._body.appendChild(i), l.layout(); - const a = l.body, c = a.saturationBox.domNode.clientWidth, d = a.domNode.clientWidth - c - _0e - I3, h = l.body.enterButton; + this._register(l.disposables); + const r = l.colorPicker; + this._body.classList.add("standalone-colorpicker-body"), this._body.style.maxHeight = Math.max(this._editor.getLayoutInfo().height / 4, 250) + "px", this._body.style.maxWidth = Math.max(this._editor.getLayoutInfo().width * 0.66, 500) + "px", this._body.tabIndex = 0, this._body.appendChild(i), r.layout(); + const c = r.body, d = c.saturationBox.domNode.clientWidth, a = c.domNode.clientWidth - d - yfe - $A, h = r.body.enterButton; h == null || h.onClicked(() => { this.updateEditor(), this.hide(); }); - const u = l.header, g = u.pickedColorNode; - g.style.width = c + I3 + "px"; - const m = u.originalColorNode; - m.style.width = d + "px"; - const f = l.header.closeButton; - f == null || f.onClicked(() => { + const u = r.header, m = u.pickedColorNode; + m.style.width = d + $A + "px"; + const b = u.originalColorNode; + b.style.width = a + "px"; + const g = r.header.closeButton; + g == null || g.onClicked(() => { this.hide(); }), t && (h && (h.button.textContent = "Replace"), this._selectionSetInEditor = !0, this._editor.setSelection(e.range)), this._editor.layoutContentWidget(this); } -}, ID = Dg, Dg.ID = "editor.contrib.standaloneColorPickerWidget", Dg); -ND = ID = hj([ - Jp(3, Se), - Jp(4, xt), - Jp(5, ge), - Jp(6, Ps) -], ND); -class I0e { +}, QM = Hm, Hm.ID = "editor.contrib.standaloneColorPickerWidget", Hm); +OM = QM = B4([ + $p(3, Ge), + $p(4, Lt), + $p(5, me), + $p(6, Us) +], OM); +class Wfe { // The color picker result consists of: an array of color results and a boolean indicating if the color was found in the editor constructor(e, t) { this.value = e, this.foundInEditor = t; } } -class N0e extends Rl { +class Gfe extends Fr { constructor() { super({ id: "editor.action.showOrFocusStandaloneColorPicker", title: { - ...Ie("showOrFocusStandaloneColorPicker", "Show or Focus Standalone Color Picker"), + ...Ce("showOrFocusStandaloneColorPicker", "Show or Focus Standalone Color Picker"), mnemonicTitle: p({ key: "mishowOrFocusStandaloneColorPicker", comment: ["&& denotes a mnemonic"] }, "&&Show or Focus Standalone Color Picker") }, precondition: void 0, @@ -72314,16 +72314,16 @@ class N0e extends Rl { { id: pe.CommandPalette } ], metadata: { - description: Ie("showOrFocusStandaloneColorPickerDescription", "Show or focus a standalone color picker which uses the default color provider. It displays hex/rgb/hsl colors.") + description: Ce("showOrFocusStandaloneColorPickerDescription", "Show or focus a standalone color picker which uses the default color provider. It displays hex/rgb/hsl colors.") } }); } runEditorCommand(e, t) { var i; - (i = Nm.get(t)) == null || i.showOrFocus(); + (i = Yb.get(t)) == null || i.showOrFocus(); } } -class W0e extends he { +class Xfe extends he { constructor() { super({ id: "editor.action.hideColorPicker", @@ -72334,23 +72334,23 @@ class W0e extends he { ] }, "Hide the Color Picker"), alias: "Hide the Color Picker", - precondition: I.standaloneColorPickerVisible.isEqualTo(!0), + precondition: C.standaloneColorPickerVisible.isEqualTo(!0), kbOpts: { primary: 9, weight: 100 /* KeybindingWeight.EditorContrib */ }, metadata: { - description: Ie("hideColorPickerDescription", "Hide the standalone color picker.") + description: Ce("hideColorPickerDescription", "Hide the standalone color picker.") } }); } run(e, t) { var i; - (i = Nm.get(t)) == null || i.hide(); + (i = Yb.get(t)) == null || i.hide(); } } -class v0e extends he { +class Vfe extends he { constructor() { super({ id: "editor.action.insertColorWithStandaloneColorPicker", @@ -72361,26 +72361,26 @@ class v0e extends he { ] }, "Insert Color with Standalone Color Picker"), alias: "Insert Color with Standalone Color Picker", - precondition: I.standaloneColorPickerFocused.isEqualTo(!0), + precondition: C.standaloneColorPickerFocused.isEqualTo(!0), kbOpts: { primary: 3, weight: 100 /* KeybindingWeight.EditorContrib */ }, metadata: { - description: Ie("insertColorWithStandaloneColorPickerDescription", "Insert hex/rgb/hsl colors with the focused standalone color picker.") + description: Ce("insertColorWithStandaloneColorPickerDescription", "Insert hex/rgb/hsl colors with the focused standalone color picker.") } }); } run(e, t) { var i; - (i = Nm.get(t)) == null || i.insertColor(); + (i = Yb.get(t)) == null || i.insertColor(); } } -ee(W0e); -ee(v0e); -kt(N0e); -class Ud { +ee(Xfe); +ee(Vfe); +kt(Gfe); +class qa { constructor(e, t, i) { this.languageConfigurationService = i, this._selection = e, this._insertSpace = t, this._usedEndToken = null; } @@ -72390,56 +72390,56 @@ class Ud { const n = t.length, o = e.length; if (i + n > o) return !1; - for (let r = 0; r < n; r++) { - const l = e.charCodeAt(i + r), a = t.charCodeAt(r); - if (l !== a && !(l >= 65 && l <= 90 && l + 32 === a) && !(a >= 65 && a <= 90 && a + 32 === l)) + for (let l = 0; l < n; l++) { + const r = e.charCodeAt(i + l), c = t.charCodeAt(l); + if (r !== c && !(r >= 65 && r <= 90 && r + 32 === c) && !(c >= 65 && c <= 90 && c + 32 === r)) return !1; } return !0; } - _createOperationsForBlockComment(e, t, i, n, o, r) { - const l = e.startLineNumber, a = e.startColumn, c = e.endLineNumber, d = e.endColumn, h = o.getLineContent(l), u = o.getLineContent(c); - let g = h.lastIndexOf(t, a - 1 + t.length), m = u.indexOf(i, d - 1 - i.length); - if (g !== -1 && m !== -1) - if (l === c) - h.substring(g + t.length, m).indexOf(i) >= 0 && (g = -1, m = -1); + _createOperationsForBlockComment(e, t, i, n, o, l) { + const r = e.startLineNumber, c = e.startColumn, d = e.endLineNumber, a = e.endColumn, h = o.getLineContent(r), u = o.getLineContent(d); + let m = h.lastIndexOf(t, c - 1 + t.length), b = u.indexOf(i, a - 1 - i.length); + if (m !== -1 && b !== -1) + if (r === d) + h.substring(m + t.length, b).indexOf(i) >= 0 && (m = -1, b = -1); else { - const b = h.substring(g + t.length), y = u.substring(0, m); - (b.indexOf(i) >= 0 || y.indexOf(i) >= 0) && (g = -1, m = -1); + const Z = h.substring(m + t.length), f = u.substring(0, b); + (Z.indexOf(i) >= 0 || f.indexOf(i) >= 0) && (m = -1, b = -1); } - let f; - g !== -1 && m !== -1 ? (n && g + t.length < h.length && h.charCodeAt(g + t.length) === 32 && (t = t + " "), n && m > 0 && u.charCodeAt(m - 1) === 32 && (i = " " + i, m -= 1), f = Ud._createRemoveBlockCommentOperations(new M(l, g + t.length + 1, c, m + 1), t, i)) : (f = Ud._createAddBlockCommentOperations(e, t, i, this._insertSpace), this._usedEndToken = f.length === 1 ? i : null); - for (const b of f) - r.addTrackedEditOperation(b.range, b.text); + let g; + m !== -1 && b !== -1 ? (n && m + t.length < h.length && h.charCodeAt(m + t.length) === 32 && (t = t + " "), n && b > 0 && u.charCodeAt(b - 1) === 32 && (i = " " + i, b -= 1), g = qa._createRemoveBlockCommentOperations(new I(r, m + t.length + 1, d, b + 1), t, i)) : (g = qa._createAddBlockCommentOperations(e, t, i, this._insertSpace), this._usedEndToken = g.length === 1 ? i : null); + for (const Z of g) + l.addTrackedEditOperation(Z.range, Z.text); } static _createRemoveBlockCommentOperations(e, t, i) { const n = []; - return M.isEmpty(e) ? n.push(si.delete(new M(e.startLineNumber, e.startColumn - t.length, e.endLineNumber, e.endColumn + i.length))) : (n.push(si.delete(new M(e.startLineNumber, e.startColumn - t.length, e.startLineNumber, e.startColumn))), n.push(si.delete(new M(e.endLineNumber, e.endColumn, e.endLineNumber, e.endColumn + i.length)))), n; + return I.isEmpty(e) ? n.push(oi.delete(new I(e.startLineNumber, e.startColumn - t.length, e.endLineNumber, e.endColumn + i.length))) : (n.push(oi.delete(new I(e.startLineNumber, e.startColumn - t.length, e.startLineNumber, e.startColumn))), n.push(oi.delete(new I(e.endLineNumber, e.endColumn, e.endLineNumber, e.endColumn + i.length)))), n; } static _createAddBlockCommentOperations(e, t, i, n) { const o = []; - return M.isEmpty(e) ? o.push(si.replace(new M(e.startLineNumber, e.startColumn, e.endLineNumber, e.endColumn), t + " " + i)) : (o.push(si.insert(new V(e.startLineNumber, e.startColumn), t + (n ? " " : ""))), o.push(si.insert(new V(e.endLineNumber, e.endColumn), (n ? " " : "") + i))), o; + return I.isEmpty(e) ? o.push(oi.replace(new I(e.startLineNumber, e.startColumn, e.endLineNumber, e.endColumn), t + " " + i)) : (o.push(oi.insert(new Y(e.startLineNumber, e.startColumn), t + (n ? " " : ""))), o.push(oi.insert(new Y(e.endLineNumber, e.endColumn), (n ? " " : "") + i))), o; } getEditOperations(e, t) { const i = this._selection.startLineNumber, n = this._selection.startColumn; e.tokenization.tokenizeIfCheap(i); - const o = e.getLanguageIdAtPosition(i, n), r = this.languageConfigurationService.getLanguageConfiguration(o).comments; - !r || !r.blockCommentStartToken || !r.blockCommentEndToken || this._createOperationsForBlockComment(this._selection, r.blockCommentStartToken, r.blockCommentEndToken, this._insertSpace, e, t); + const o = e.getLanguageIdAtPosition(i, n), l = this.languageConfigurationService.getLanguageConfiguration(o).comments; + !l || !l.blockCommentStartToken || !l.blockCommentEndToken || this._createOperationsForBlockComment(this._selection, l.blockCommentStartToken, l.blockCommentEndToken, this._insertSpace, e, t); } computeCursorState(e, t) { const i = t.getInverseEditOperations(); if (i.length === 2) { const n = i[0], o = i[1]; - return new fe(n.range.endLineNumber, n.range.endColumn, o.range.startLineNumber, o.range.startColumn); + return new ge(n.range.endLineNumber, n.range.endColumn, o.range.startLineNumber, o.range.startColumn); } else { const n = i[0].range, o = this._usedEndToken ? -this._usedEndToken.length - 1 : 0; - return new fe(n.endLineNumber, n.endColumn + o, n.endLineNumber, n.endColumn + o); + return new ge(n.endLineNumber, n.endColumn + o, n.endLineNumber, n.endColumn + o); } } } -class oc { - constructor(e, t, i, n, o, r, l) { - this.languageConfigurationService = e, this._selection = t, this._indentSize = i, this._type = n, this._insertSpace = o, this._selectionId = null, this._deltaColumn = 0, this._moveEndPositionDown = !1, this._ignoreEmptyLines = r, this._ignoreFirstLine = l || !1; +class dd { + constructor(e, t, i, n, o, l, r) { + this.languageConfigurationService = e, this._selection = t, this._indentSize = i, this._type = n, this._insertSpace = o, this._selectionId = null, this._deltaColumn = 0, this._moveEndPositionDown = !1, this._ignoreEmptyLines = l, this._ignoreFirstLine = r || !1; } /** * Do an initial pass over the lines and gather info about the line comment string. @@ -72447,78 +72447,78 @@ class oc { */ static _gatherPreflightCommentStrings(e, t, i, n) { e.tokenization.tokenizeIfCheap(t); - const o = e.getLanguageIdAtPosition(t, 1), r = n.getLanguageConfiguration(o).comments, l = r ? r.lineCommentToken : null; - if (!l) + const o = e.getLanguageIdAtPosition(t, 1), l = n.getLanguageConfiguration(o).comments, r = l ? l.lineCommentToken : null; + if (!r) return null; - const a = []; - for (let c = 0, d = i - t + 1; c < d; c++) - a[c] = { + const c = []; + for (let d = 0, a = i - t + 1; d < a; d++) + c[d] = { ignore: !1, - commentStr: l, + commentStr: r, commentStrOffset: 0, - commentStrLength: l.length + commentStrLength: r.length }; - return a; + return c; } /** * Analyze lines and decide which lines are relevant and what the toggle should do. * Also, build up several offsets and lengths useful in the generation of editor operations. */ - static _analyzeLines(e, t, i, n, o, r, l, a) { - let c = !0, d; - e === 0 ? d = !0 : e === 1 ? d = !1 : d = !0; + static _analyzeLines(e, t, i, n, o, l, r, c) { + let d = !0, a; + e === 0 ? a = !0 : e === 1 ? a = !1 : a = !0; for (let h = 0, u = n.length; h < u; h++) { - const g = n[h], m = o + h; - if (m === o && l) { - g.ignore = !0; + const m = n[h], b = o + h; + if (b === o && r) { + m.ignore = !0; continue; } - const f = i.getLineContent(m), b = qn(f); - if (b === -1) { - g.ignore = r, g.commentStrOffset = f.length; + const g = i.getLineContent(b), Z = es(g); + if (Z === -1) { + m.ignore = l, m.commentStrOffset = g.length; continue; } - if (c = !1, g.ignore = !1, g.commentStrOffset = b, d && !Ud._haystackHasNeedleAtOffset(f, g.commentStr, b) && (e === 0 ? d = !1 : e === 1 || (g.ignore = !0)), d && t) { - const y = b + g.commentStrLength; - y < f.length && f.charCodeAt(y) === 32 && (g.commentStrLength += 1); + if (d = !1, m.ignore = !1, m.commentStrOffset = Z, a && !qa._haystackHasNeedleAtOffset(g, m.commentStr, Z) && (e === 0 ? a = !1 : e === 1 || (m.ignore = !0)), a && t) { + const f = Z + m.commentStrLength; + f < g.length && g.charCodeAt(f) === 32 && (m.commentStrLength += 1); } } - if (e === 0 && c) { - d = !1; + if (e === 0 && d) { + a = !1; for (let h = 0, u = n.length; h < u; h++) n[h].ignore = !1; } return { supported: !0, - shouldRemoveComments: d, + shouldRemoveComments: a, lines: n }; } /** * Analyze all lines and decide exactly what to do => not supported | insert line comments | remove line comments */ - static _gatherPreflightData(e, t, i, n, o, r, l, a) { - const c = oc._gatherPreflightCommentStrings(i, n, o, a); - return c === null ? { + static _gatherPreflightData(e, t, i, n, o, l, r, c) { + const d = dd._gatherPreflightCommentStrings(i, n, o, c); + return d === null ? { supported: !1 - } : oc._analyzeLines(e, t, i, c, n, r, l, a); + } : dd._analyzeLines(e, t, i, d, n, l, r, c); } /** * Given a successful analysis, execute either insert line comments, either remove line comments */ _executeLineComments(e, t, i, n) { let o; - i.shouldRemoveComments ? o = oc._createRemoveLineCommentsOperations(i.lines, n.startLineNumber) : (oc._normalizeInsertionPoint(e, i.lines, n.startLineNumber, this._indentSize), o = this._createAddLineCommentsOperations(i.lines, n.startLineNumber)); - const r = new V(n.positionLineNumber, n.positionColumn); - for (let l = 0, a = o.length; l < a; l++) - t.addEditOperation(o[l].range, o[l].text), M.isEmpty(o[l].range) && M.getStartPosition(o[l].range).equals(r) && e.getLineContent(r.lineNumber).length + 1 === r.column && (this._deltaColumn = (o[l].text || "").length); + i.shouldRemoveComments ? o = dd._createRemoveLineCommentsOperations(i.lines, n.startLineNumber) : (dd._normalizeInsertionPoint(e, i.lines, n.startLineNumber, this._indentSize), o = this._createAddLineCommentsOperations(i.lines, n.startLineNumber)); + const l = new Y(n.positionLineNumber, n.positionColumn); + for (let r = 0, c = o.length; r < c; r++) + t.addEditOperation(o[r].range, o[r].text), I.isEmpty(o[r].range) && I.getStartPosition(o[r].range).equals(l) && e.getLineContent(l.lineNumber).length + 1 === l.column && (this._deltaColumn = (o[r].text || "").length); this._selectionId = t.trackSelection(n); } _attemptRemoveBlockComment(e, t, i, n) { - let o = t.startLineNumber, r = t.endLineNumber; - const l = n.length + Math.max(e.getLineFirstNonWhitespaceColumn(t.startLineNumber), t.startColumn); - let a = e.getLineContent(o).lastIndexOf(i, l - 1), c = e.getLineContent(r).indexOf(n, t.endColumn - 1 - i.length); - return a !== -1 && c === -1 && (c = e.getLineContent(o).indexOf(n, a + i.length), r = o), a === -1 && c !== -1 && (a = e.getLineContent(r).lastIndexOf(i, c), o = r), t.isEmpty() && (a === -1 || c === -1) && (a = e.getLineContent(o).indexOf(i), a !== -1 && (c = e.getLineContent(o).indexOf(n, a + i.length))), a !== -1 && e.getLineContent(o).charCodeAt(a + i.length) === 32 && (i += " "), c !== -1 && e.getLineContent(r).charCodeAt(c - 1) === 32 && (n = " " + n, c -= 1), a !== -1 && c !== -1 ? Ud._createRemoveBlockCommentOperations(new M(o, a + i.length + 1, r, c + 1), i, n) : null; + let o = t.startLineNumber, l = t.endLineNumber; + const r = n.length + Math.max(e.getLineFirstNonWhitespaceColumn(t.startLineNumber), t.startColumn); + let c = e.getLineContent(o).lastIndexOf(i, r - 1), d = e.getLineContent(l).indexOf(n, t.endColumn - 1 - i.length); + return c !== -1 && d === -1 && (d = e.getLineContent(o).indexOf(n, c + i.length), l = o), c === -1 && d !== -1 && (c = e.getLineContent(l).lastIndexOf(i, d), o = l), t.isEmpty() && (c === -1 || d === -1) && (c = e.getLineContent(o).indexOf(i), c !== -1 && (d = e.getLineContent(o).indexOf(n, c + i.length))), c !== -1 && e.getLineContent(o).charCodeAt(c + i.length) === 32 && (i += " "), d !== -1 && e.getLineContent(l).charCodeAt(d - 1) === 32 && (n = " " + n, d -= 1), c !== -1 && d !== -1 ? qa._createRemoveBlockCommentOperations(new I(o, c + i.length + 1, l, d + 1), i, n) : null; } /** * Given an unsuccessful analysis, delegate to the block comment command @@ -72528,35 +72528,35 @@ class oc { const n = e.getLanguageIdAtPosition(i.startLineNumber, 1), o = this.languageConfigurationService.getLanguageConfiguration(n).comments; if (!o || !o.blockCommentStartToken || !o.blockCommentEndToken) return; - const r = o.blockCommentStartToken, l = o.blockCommentEndToken; - let a = this._attemptRemoveBlockComment(e, i, r, l); - if (!a) { + const l = o.blockCommentStartToken, r = o.blockCommentEndToken; + let c = this._attemptRemoveBlockComment(e, i, l, r); + if (!c) { if (i.isEmpty()) { - const c = e.getLineContent(i.startLineNumber); - let d = qn(c); - d === -1 && (d = c.length), a = Ud._createAddBlockCommentOperations(new M(i.startLineNumber, d + 1, i.startLineNumber, c.length + 1), r, l, this._insertSpace); + const d = e.getLineContent(i.startLineNumber); + let a = es(d); + a === -1 && (a = d.length), c = qa._createAddBlockCommentOperations(new I(i.startLineNumber, a + 1, i.startLineNumber, d.length + 1), l, r, this._insertSpace); } else - a = Ud._createAddBlockCommentOperations(new M(i.startLineNumber, e.getLineFirstNonWhitespaceColumn(i.startLineNumber), i.endLineNumber, e.getLineMaxColumn(i.endLineNumber)), r, l, this._insertSpace); - a.length === 1 && (this._deltaColumn = r.length + 1); + c = qa._createAddBlockCommentOperations(new I(i.startLineNumber, e.getLineFirstNonWhitespaceColumn(i.startLineNumber), i.endLineNumber, e.getLineMaxColumn(i.endLineNumber)), l, r, this._insertSpace); + c.length === 1 && (this._deltaColumn = l.length + 1); } this._selectionId = t.trackSelection(i); - for (const c of a) - t.addEditOperation(c.range, c.text); + for (const d of c) + t.addEditOperation(d.range, d.text); } getEditOperations(e, t) { let i = this._selection; if (this._moveEndPositionDown = !1, i.startLineNumber === i.endLineNumber && this._ignoreFirstLine) { - t.addEditOperation(new M(i.startLineNumber, e.getLineMaxColumn(i.startLineNumber), i.startLineNumber + 1, 1), i.startLineNumber === e.getLineCount() ? "" : ` + t.addEditOperation(new I(i.startLineNumber, e.getLineMaxColumn(i.startLineNumber), i.startLineNumber + 1, 1), i.startLineNumber === e.getLineCount() ? "" : ` `), this._selectionId = t.trackSelection(i); return; } i.startLineNumber < i.endLineNumber && i.endColumn === 1 && (this._moveEndPositionDown = !0, i = i.setEndPosition(i.endLineNumber - 1, e.getLineMaxColumn(i.endLineNumber - 1))); - const n = oc._gatherPreflightData(this._type, this._insertSpace, e, i.startLineNumber, i.endLineNumber, this._ignoreEmptyLines, this._ignoreFirstLine, this.languageConfigurationService); + const n = dd._gatherPreflightData(this._type, this._insertSpace, e, i.startLineNumber, i.endLineNumber, this._ignoreEmptyLines, this._ignoreFirstLine, this.languageConfigurationService); return n.supported ? this._executeLineComments(e, t, n, i) : this._executeBlockComment(e, t, i); } computeCursorState(e, t) { let i = t.getTrackedSelection(this._selectionId); - return this._moveEndPositionDown && (i = i.setEndPosition(i.endLineNumber + 1, 1)), new fe(i.selectionStartLineNumber, i.selectionStartColumn + this._deltaColumn, i.positionLineNumber, i.positionColumn + this._deltaColumn); + return this._moveEndPositionDown && (i = i.setEndPosition(i.endLineNumber + 1, 1)), new ge(i.selectionStartLineNumber, i.selectionStartColumn + this._deltaColumn, i.positionLineNumber, i.positionColumn + this._deltaColumn); } /** * Generate edit operations in the remove line comment case @@ -72564,8 +72564,8 @@ class oc { static _createRemoveLineCommentsOperations(e, t) { const i = []; for (let n = 0, o = e.length; n < o; n++) { - const r = e[n]; - r.ignore || i.push(si.delete(new M(t + n, r.commentStrOffset + 1, t + n, r.commentStrOffset + r.commentStrLength + 1))); + const l = e[n]; + l.ignore || i.push(oi.delete(new I(t + n, l.commentStrOffset + 1, t + n, l.commentStrOffset + l.commentStrLength + 1))); } return i; } @@ -72574,9 +72574,9 @@ class oc { */ _createAddLineCommentsOperations(e, t) { const i = [], n = this._insertSpace ? " " : ""; - for (let o = 0, r = e.length; o < r; o++) { - const l = e[o]; - l.ignore || i.push(si.insert(new V(t + o, l.commentStrOffset + 1), l.commentStr + n)); + for (let o = 0, l = e.length; o < l; o++) { + const r = e[o]; + r.ignore || i.push(oi.insert(new Y(t + o, r.commentStrOffset + 1), r.commentStr + n)); } return i; } @@ -72587,60 +72587,60 @@ class oc { * Adjust insertion points to have them vertically aligned in the add line comment case */ static _normalizeInsertionPoint(e, t, i, n) { - let o = 1073741824, r, l; - for (let a = 0, c = t.length; a < c; a++) { - if (t[a].ignore) + let o = 1073741824, l, r; + for (let c = 0, d = t.length; c < d; c++) { + if (t[c].ignore) continue; - const d = e.getLineContent(i + a); + const a = e.getLineContent(i + c); let h = 0; - for (let u = 0, g = t[a].commentStrOffset; h < o && u < g; u++) - h = oc.nextVisibleColumn(h, n, d.charCodeAt(u) === 9, 1); + for (let u = 0, m = t[c].commentStrOffset; h < o && u < m; u++) + h = dd.nextVisibleColumn(h, n, a.charCodeAt(u) === 9, 1); h < o && (o = h); } o = Math.floor(o / n) * n; - for (let a = 0, c = t.length; a < c; a++) { - if (t[a].ignore) + for (let c = 0, d = t.length; c < d; c++) { + if (t[c].ignore) continue; - const d = e.getLineContent(i + a); + const a = e.getLineContent(i + c); let h = 0; - for (r = 0, l = t[a].commentStrOffset; h < o && r < l; r++) - h = oc.nextVisibleColumn(h, n, d.charCodeAt(r) === 9, 1); - h > o ? t[a].commentStrOffset = r - 1 : t[a].commentStrOffset = r; + for (l = 0, r = t[c].commentStrOffset; h < o && l < r; l++) + h = dd.nextVisibleColumn(h, n, a.charCodeAt(l) === 9, 1); + h > o ? t[c].commentStrOffset = l - 1 : t[c].commentStrOffset = l; } } } -class D5 extends he { +class sE extends he { constructor(e, t) { super(t), this._type = e; } run(e, t) { - const i = e.get(li); + const i = e.get(ci); if (!t.hasModel()) return; - const n = t.getModel(), o = [], r = n.getOptions(), l = t.getOption( + const n = t.getModel(), o = [], l = n.getOptions(), r = t.getOption( 23 /* EditorOption.comments */ - ), a = t.getSelections().map((d, h) => ({ selection: d, index: h, ignoreFirstLine: !1 })); - a.sort((d, h) => M.compareRangesUsingStarts(d.selection, h.selection)); - let c = a[0]; - for (let d = 1; d < a.length; d++) { - const h = a[d]; - c.selection.endLineNumber === h.selection.startLineNumber && (c.index < h.index ? h.ignoreFirstLine = !0 : (c.ignoreFirstLine = !0, c = h)); - } - for (const d of a) - o.push(new oc(i, d.selection, r.indentSize, this._type, l.insertSpace, l.ignoreEmptyLines, d.ignoreFirstLine)); + ), c = t.getSelections().map((a, h) => ({ selection: a, index: h, ignoreFirstLine: !1 })); + c.sort((a, h) => I.compareRangesUsingStarts(a.selection, h.selection)); + let d = c[0]; + for (let a = 1; a < c.length; a++) { + const h = c[a]; + d.selection.endLineNumber === h.selection.startLineNumber && (d.index < h.index ? h.ignoreFirstLine = !0 : (d.ignoreFirstLine = !0, d = h)); + } + for (const a of c) + o.push(new dd(i, a.selection, l.indentSize, this._type, r.insertSpace, r.ignoreEmptyLines, a.ignoreFirstLine)); t.pushUndoStop(), t.executeCommands(this.id, o), t.pushUndoStop(); } } -class T0e extends D5 { +class Lfe extends sE { constructor() { super(0, { id: "editor.action.commentLine", label: p("comment.line", "Toggle Line Comment"), alias: "Toggle Line Comment", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 2138, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -72654,16 +72654,16 @@ class T0e extends D5 { }); } } -class D0e extends D5 { +class Ife extends sE { constructor() { super(1, { id: "editor.action.addCommentLine", label: p("comment.line.add", "Add Line Comment"), alias: "Add Line Comment", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2081 /* KeyCode.KeyC */ @@ -72674,16 +72674,16 @@ class D0e extends D5 { }); } } -class V0e extends D5 { +class Sfe extends sE { constructor() { super(2, { id: "editor.action.removeCommentLine", label: p("comment.line.remove", "Remove Line Comment"), alias: "Remove Line Comment", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2099 /* KeyCode.KeyU */ @@ -72694,15 +72694,15 @@ class V0e extends D5 { }); } } -class k0e extends he { +class xfe extends he { constructor() { super({ id: "editor.action.blockComment", label: p("comment.block", "Toggle Block Comment"), alias: "Toggle Block Comment", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 1567, linux: { primary: 3103 @@ -72720,47 +72720,47 @@ class k0e extends he { }); } run(e, t) { - const i = e.get(li); + const i = e.get(ci); if (!t.hasModel()) return; const n = t.getOption( 23 /* EditorOption.comments */ - ), o = [], r = t.getSelections(); - for (const l of r) - o.push(new Ud(l, n.insertSpace, i)); + ), o = [], l = t.getSelections(); + for (const r of l) + o.push(new qa(r, n.insertSpace, i)); t.pushUndoStop(), t.executeCommands(this.id, o), t.pushUndoStop(); } } -ee(T0e); -ee(D0e); -ee(V0e); -ee(k0e); -var G0e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +ee(Lfe); +ee(Ife); +ee(Sfe); +ee(xfe); +var Cfe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, fu = function(s, e) { +}, Wu = function(s, e) { return function(t, i) { e(t, i, s); }; -}, WD, Vg; -let vb = (Vg = class { +}, jM, Em; +let JZ = (Em = class { static get(e) { - return e.getContribution(WD.ID); + return e.getContribution(jM.ID); } - constructor(e, t, i, n, o, r, l, a) { - this._contextMenuService = t, this._contextViewService = i, this._contextKeyService = n, this._keybindingService = o, this._menuService = r, this._configurationService = l, this._workspaceContextService = a, this._toDispose = new U(), this._contextMenuIsBeingShownCount = 0, this._editor = e, this._toDispose.add(this._editor.onContextMenu((c) => this._onContextMenu(c))), this._toDispose.add(this._editor.onMouseWheel((c) => { + constructor(e, t, i, n, o, l, r, c) { + this._contextMenuService = t, this._contextViewService = i, this._contextKeyService = n, this._keybindingService = o, this._menuService = l, this._configurationService = r, this._workspaceContextService = c, this._toDispose = new _(), this._contextMenuIsBeingShownCount = 0, this._editor = e, this._toDispose.add(this._editor.onContextMenu((d) => this._onContextMenu(d))), this._toDispose.add(this._editor.onMouseWheel((d) => { if (this._contextMenuIsBeingShownCount > 0) { - const d = this._contextViewService.getContextViewElement(), h = c.srcElement; - h.shadowRoot && hm(d) === h.shadowRoot || this._contextViewService.hideContextView(); + const a = this._contextViewService.getContextViewElement(), h = d.srcElement; + h.shadowRoot && gb(a) === h.shadowRoot || this._contextViewService.hideContextView(); } - })), this._toDispose.add(this._editor.onKeyDown((c) => { + })), this._toDispose.add(this._editor.onKeyDown((d) => { this._editor.getOption( 24 /* EditorOption.contextmenu */ - ) && c.keyCode === 58 && (c.preventDefault(), c.stopPropagation(), this.showContextMenu()); + ) && d.keyCode === 58 && (d.preventDefault(), d.stopPropagation(), this.showContextMenu()); })); } _onContextMenu(e) { @@ -72803,15 +72803,15 @@ let vb = (Vg = class { _getMenuActions(e, t) { const i = [], n = this._menuService.getMenuActions(t, this._contextKeyService, { arg: e.uri }); for (const o of n) { - const [, r] = o; - let l = 0; - for (const a of r) - if (a instanceof Sf) { - const c = this._getMenuActions(e, a.item.submenu); - c.length > 0 && (i.push(new ab(a.id, a.label, c)), l++); + const [, l] = o; + let r = 0; + for (const c of l) + if (c instanceof xg) { + const d = this._getMenuActions(e, c.item.submenu); + d.length > 0 && (i.push(new bZ(c.id, c.label, d)), r++); } else - i.push(a), l++; - l && i.push(new Qi()); + i.push(c), r++; + r && i.push(new ji()); } return i.length && i.pop(), i; } @@ -72834,26 +72834,26 @@ let vb = (Vg = class { 1 /* ScrollType.Immediate */ ), this._editor.render(); - const r = this._editor.getScrolledVisiblePosition(this._editor.getPosition()), l = yi(this._editor.getDomNode()), a = l.left + r.left, c = l.top + r.top + r.height; - n = { x: a, y: c }; + const l = this._editor.getScrolledVisiblePosition(this._editor.getPosition()), r = yi(this._editor.getDomNode()), c = r.left + l.left, d = r.top + l.top + l.height; + n = { x: c, y: d }; } const o = this._editor.getOption( 128 /* EditorOption.useShadowDOM */ - ) && !Wa; + ) && !Yc; this._contextMenuIsBeingShownCount++, this._contextMenuService.showContextMenu({ domForShadowRoot: o ? this._editor.getOverflowWidgetsDomNode() ?? this._editor.getDomNode() : void 0, getAnchor: () => n, getActions: () => e, - getActionViewItem: (r) => { - const l = this._keybindingFor(r); - if (l) - return new Sb(r, r, { label: !0, keybinding: l.getLabel(), isMenu: !0 }); - const a = r; - return typeof a.getActionViewItem == "function" ? a.getActionViewItem() : new Sb(r, r, { icon: !0, label: !0, isMenu: !0 }); + getActionViewItem: (l) => { + const r = this._keybindingFor(l); + if (r) + return new xZ(l, l, { label: !0, keybinding: r.getLabel(), isMenu: !0 }); + const c = l; + return typeof c.getActionViewItem == "function" ? c.getActionViewItem() : new xZ(l, l, { icon: !0, label: !0, isMenu: !0 }); }, - getKeyBinding: (r) => this._keybindingFor(r), - onHide: (r) => { + getKeyBinding: (l) => this._keybindingFor(l), + onHide: (l) => { this._contextMenuIsBeingShownCount--, this._editor.updateOptions({ hover: i }); @@ -72861,50 +72861,50 @@ let vb = (Vg = class { }); } _showScrollbarContextMenu(e) { - if (!this._editor.hasModel() || Yme(this._workspaceContextService.getWorkspace())) + if (!this._editor.hasModel() || Mpe(this._workspaceContextService.getWorkspace())) return; const t = this._editor.getOption( 73 /* EditorOption.minimap */ ); let i = 0; - const n = (c) => ({ + const n = (d) => ({ id: `menu-action-${++i}`, - label: c.label, + label: d.label, tooltip: "", class: void 0, - enabled: typeof c.enabled > "u" ? !0 : c.enabled, - checked: c.checked, - run: c.run - }), o = (c, d) => new ab(`menu-action-${++i}`, c, d, void 0), r = (c, d, h, u, g) => { - if (!d) - return n({ label: c, enabled: d, run: () => { + enabled: typeof d.enabled > "u" ? !0 : d.enabled, + checked: d.checked, + run: d.run + }), o = (d, a) => new bZ(`menu-action-${++i}`, d, a, void 0), l = (d, a, h, u, m) => { + if (!a) + return n({ label: d, enabled: a, run: () => { } }); - const m = (b) => () => { - this._configurationService.updateValue(h, b); - }, f = []; - for (const b of g) - f.push(n({ - label: b.label, - checked: u === b.value, - run: m(b.value) + const b = (Z) => () => { + this._configurationService.updateValue(h, Z); + }, g = []; + for (const Z of m) + g.push(n({ + label: Z.label, + checked: u === Z.value, + run: b(Z.value) })); - return o(c, f); - }, l = []; - l.push(n({ + return o(d, g); + }, r = []; + r.push(n({ label: p("context.minimap.minimap", "Minimap"), checked: t.enabled, run: () => { this._configurationService.updateValue("editor.minimap.enabled", !t.enabled); } - })), l.push(new Qi()), l.push(n({ + })), r.push(new ji()), r.push(n({ label: p("context.minimap.renderCharacters", "Render Characters"), enabled: t.enabled, checked: t.renderCharacters, run: () => { this._configurationService.updateValue("editor.minimap.renderCharacters", !t.renderCharacters); } - })), l.push(r(p("context.minimap.size", "Vertical size"), t.enabled, "editor.minimap.size", t.size, [{ + })), r.push(l(p("context.minimap.size", "Vertical size"), t.enabled, "editor.minimap.size", t.size, [{ label: p("context.minimap.size.proportional", "Proportional"), value: "proportional" }, { @@ -72913,22 +72913,22 @@ let vb = (Vg = class { }, { label: p("context.minimap.size.fit", "Fit"), value: "fit" - }])), l.push(r(p("context.minimap.slider", "Slider"), t.enabled, "editor.minimap.showSlider", t.showSlider, [{ + }])), r.push(l(p("context.minimap.slider", "Slider"), t.enabled, "editor.minimap.showSlider", t.showSlider, [{ label: p("context.minimap.slider.mouseover", "Mouse Over"), value: "mouseover" }, { label: p("context.minimap.slider.always", "Always"), value: "always" }])); - const a = this._editor.getOption( + const c = this._editor.getOption( 128 /* EditorOption.useShadowDOM */ - ) && !Wa; + ) && !Yc; this._contextMenuIsBeingShownCount++, this._contextMenuService.showContextMenu({ - domForShadowRoot: a ? this._editor.getDomNode() : void 0, + domForShadowRoot: c ? this._editor.getDomNode() : void 0, getAnchor: () => e, - getActions: () => l, - onHide: (c) => { + getActions: () => r, + onHide: (d) => { this._contextMenuIsBeingShownCount--, this._editor.focus(); } }); @@ -72939,17 +72939,17 @@ let vb = (Vg = class { dispose() { this._contextMenuIsBeingShownCount > 0 && this._contextViewService.hideContextView(), this._toDispose.dispose(); } -}, WD = Vg, Vg.ID = "editor.contrib.contextmenu", Vg); -vb = WD = G0e([ - fu(1, Co), - fu(2, rd), - fu(3, _e), - fu(4, xt), - fu(5, Uo), - fu(6, Ke), - fu(7, Cm) -], vb); -class R0e extends he { +}, jM = Em, Em.ID = "editor.contrib.contextmenu", Em); +JZ = jM = Cfe([ + Wu(1, Xo), + Wu(2, aa), + Wu(3, xe), + Wu(4, Lt), + Wu(5, Oo), + Wu(6, Qe), + Wu(7, Ib) +], JZ); +class Rfe extends he { constructor() { super({ id: "editor.action.showContextMenu", @@ -72957,7 +72957,7 @@ class R0e extends he { alias: "Show Editor Context Menu", precondition: void 0, kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 1092, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -72966,17 +72966,17 @@ class R0e extends he { } run(e, t) { var i; - (i = vb.get(t)) == null || i.showContextMenu(); + (i = JZ.get(t)) == null || i.showContextMenu(); } } -gt( - vb.ID, - vb, +mt( + JZ.ID, + JZ, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */ ); -ee(R0e); -class TW { +ee(Rfe); +class _R { constructor(e) { this.selections = e; } @@ -72990,14 +72990,14 @@ class TW { return !0; } } -class DW { +class QR { constructor(e, t, i) { this.cursorState = e, this.scrollTop = t, this.scrollLeft = i; } } -const kZ = class kZ extends R { +const O2 = class O2 extends J { static get(e) { - return e.getContribution(kZ.ID); + return e.getContribution(O2.ID); } constructor(e) { super(), this._editor = e, this._isCursorUndoRedo = !1, this._undoStack = [], this._redoStack = [], this._register(e.onDidChangeModel((t) => { @@ -73007,15 +73007,15 @@ const kZ = class kZ extends R { })), this._register(e.onDidChangeCursorSelection((t) => { if (this._isCursorUndoRedo || !t.oldSelections || t.oldModelVersionId !== t.modelVersionId) return; - const i = new TW(t.oldSelections); - this._undoStack.length > 0 && this._undoStack[this._undoStack.length - 1].cursorState.equals(i) || (this._undoStack.push(new DW(i, e.getScrollTop(), e.getScrollLeft())), this._redoStack = [], this._undoStack.length > 50 && this._undoStack.shift()); + const i = new _R(t.oldSelections); + this._undoStack.length > 0 && this._undoStack[this._undoStack.length - 1].cursorState.equals(i) || (this._undoStack.push(new QR(i, e.getScrollTop(), e.getScrollLeft())), this._redoStack = [], this._undoStack.length > 50 && this._undoStack.shift()); })); } cursorUndo() { - !this._editor.hasModel() || this._undoStack.length === 0 || (this._redoStack.push(new DW(new TW(this._editor.getSelections()), this._editor.getScrollTop(), this._editor.getScrollLeft())), this._applyState(this._undoStack.pop())); + !this._editor.hasModel() || this._undoStack.length === 0 || (this._redoStack.push(new QR(new _R(this._editor.getSelections()), this._editor.getScrollTop(), this._editor.getScrollLeft())), this._applyState(this._undoStack.pop())); } cursorRedo() { - !this._editor.hasModel() || this._redoStack.length === 0 || (this._undoStack.push(new DW(new TW(this._editor.getSelections()), this._editor.getScrollTop(), this._editor.getScrollLeft())), this._applyState(this._redoStack.pop())); + !this._editor.hasModel() || this._redoStack.length === 0 || (this._undoStack.push(new QR(new _R(this._editor.getSelections()), this._editor.getScrollTop(), this._editor.getScrollLeft())), this._applyState(this._redoStack.pop())); } _applyState(e) { this._isCursorUndoRedo = !0, this._editor.setSelections(e.cursorState.selections), this._editor.setScrollPosition({ @@ -73024,9 +73024,9 @@ const kZ = class kZ extends R { }), this._isCursorUndoRedo = !1; } }; -kZ.ID = "editor.contrib.cursorUndoRedoController"; -let Tb = kZ; -class E0e extends he { +O2.ID = "editor.contrib.cursorUndoRedoController"; +let HZ = O2; +class Nfe extends he { constructor() { super({ id: "cursorUndo", @@ -73034,7 +73034,7 @@ class E0e extends he { alias: "Cursor Undo", precondition: void 0, kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 2099, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -73043,10 +73043,10 @@ class E0e extends he { } run(e, t, i) { var n; - (n = Tb.get(t)) == null || n.cursorUndo(); + (n = HZ.get(t)) == null || n.cursorUndo(); } } -class X0e extends he { +class wfe extends he { constructor() { super({ id: "cursorRedo", @@ -73057,49 +73057,49 @@ class X0e extends he { } run(e, t, i) { var n; - (n = Tb.get(t)) == null || n.cursorRedo(); + (n = HZ.get(t)) == null || n.cursorRedo(); } } -gt( - Tb.ID, - Tb, +mt( + HZ.ID, + HZ, 0 /* EditorContributionInstantiation.Eager */ ); -ee(E0e); -ee(X0e); -class F0e { +ee(Nfe); +ee(wfe); +class Tfe { constructor(e, t, i) { this.selection = e, this.targetPosition = t, this.copy = i, this.targetSelection = null; } getEditOperations(e, t) { const i = e.getValueInRange(this.selection); - if (this.copy || t.addEditOperation(this.selection, null), t.addEditOperation(new M(this.targetPosition.lineNumber, this.targetPosition.column, this.targetPosition.lineNumber, this.targetPosition.column), i), this.selection.containsPosition(this.targetPosition) && !(this.copy && (this.selection.getEndPosition().equals(this.targetPosition) || this.selection.getStartPosition().equals(this.targetPosition)))) { + if (this.copy || t.addEditOperation(this.selection, null), t.addEditOperation(new I(this.targetPosition.lineNumber, this.targetPosition.column, this.targetPosition.lineNumber, this.targetPosition.column), i), this.selection.containsPosition(this.targetPosition) && !(this.copy && (this.selection.getEndPosition().equals(this.targetPosition) || this.selection.getStartPosition().equals(this.targetPosition)))) { this.targetSelection = this.selection; return; } if (this.copy) { - this.targetSelection = new fe(this.targetPosition.lineNumber, this.targetPosition.column, this.selection.endLineNumber - this.selection.startLineNumber + this.targetPosition.lineNumber, this.selection.startLineNumber === this.selection.endLineNumber ? this.targetPosition.column + this.selection.endColumn - this.selection.startColumn : this.selection.endColumn); + this.targetSelection = new ge(this.targetPosition.lineNumber, this.targetPosition.column, this.selection.endLineNumber - this.selection.startLineNumber + this.targetPosition.lineNumber, this.selection.startLineNumber === this.selection.endLineNumber ? this.targetPosition.column + this.selection.endColumn - this.selection.startColumn : this.selection.endColumn); return; } if (this.targetPosition.lineNumber > this.selection.endLineNumber) { - this.targetSelection = new fe(this.targetPosition.lineNumber - this.selection.endLineNumber + this.selection.startLineNumber, this.targetPosition.column, this.targetPosition.lineNumber, this.selection.startLineNumber === this.selection.endLineNumber ? this.targetPosition.column + this.selection.endColumn - this.selection.startColumn : this.selection.endColumn); + this.targetSelection = new ge(this.targetPosition.lineNumber - this.selection.endLineNumber + this.selection.startLineNumber, this.targetPosition.column, this.targetPosition.lineNumber, this.selection.startLineNumber === this.selection.endLineNumber ? this.targetPosition.column + this.selection.endColumn - this.selection.startColumn : this.selection.endColumn); return; } if (this.targetPosition.lineNumber < this.selection.endLineNumber) { - this.targetSelection = new fe(this.targetPosition.lineNumber, this.targetPosition.column, this.targetPosition.lineNumber + this.selection.endLineNumber - this.selection.startLineNumber, this.selection.startLineNumber === this.selection.endLineNumber ? this.targetPosition.column + this.selection.endColumn - this.selection.startColumn : this.selection.endColumn); + this.targetSelection = new ge(this.targetPosition.lineNumber, this.targetPosition.column, this.targetPosition.lineNumber + this.selection.endLineNumber - this.selection.startLineNumber, this.selection.startLineNumber === this.selection.endLineNumber ? this.targetPosition.column + this.selection.endColumn - this.selection.startColumn : this.selection.endColumn); return; } - this.selection.endColumn <= this.targetPosition.column ? this.targetSelection = new fe(this.targetPosition.lineNumber - this.selection.endLineNumber + this.selection.startLineNumber, this.selection.startLineNumber === this.selection.endLineNumber ? this.targetPosition.column - this.selection.endColumn + this.selection.startColumn : this.targetPosition.column - this.selection.endColumn + this.selection.startColumn, this.targetPosition.lineNumber, this.selection.startLineNumber === this.selection.endLineNumber ? this.targetPosition.column : this.selection.endColumn) : this.targetSelection = new fe(this.targetPosition.lineNumber - this.selection.endLineNumber + this.selection.startLineNumber, this.targetPosition.column, this.targetPosition.lineNumber, this.targetPosition.column + this.selection.endColumn - this.selection.startColumn); + this.selection.endColumn <= this.targetPosition.column ? this.targetSelection = new ge(this.targetPosition.lineNumber - this.selection.endLineNumber + this.selection.startLineNumber, this.selection.startLineNumber === this.selection.endLineNumber ? this.targetPosition.column - this.selection.endColumn + this.selection.startColumn : this.targetPosition.column - this.selection.endColumn + this.selection.startColumn, this.targetPosition.lineNumber, this.selection.startLineNumber === this.selection.endLineNumber ? this.targetPosition.column : this.selection.endColumn) : this.targetSelection = new ge(this.targetPosition.lineNumber - this.selection.endLineNumber + this.selection.startLineNumber, this.targetPosition.column, this.targetPosition.lineNumber, this.targetPosition.column + this.selection.endColumn - this.selection.startColumn); } computeCursorState(e, t) { return this.targetSelection; } } -function pp(s) { +function Wp(s) { return qe ? s.altKey : s.ctrlKey; } -const Nd = class Nd extends R { +const Ma = class Ma extends J { constructor(e) { super(), this._editor = e, this._dndDecorationIds = this._editor.createDecorationsCollection(), this._register(this._editor.onMouseDown((t) => this._onEditorMouseDown(t))), this._register(this._editor.onMouseUp((t) => this._onEditorMouseUp(t))), this._register(this._editor.onMouseDrag((t) => this._onEditorMouseDrag(t))), this._register(this._editor.onMouseDrop((t) => this._onEditorMouseDrop(t))), this._register(this._editor.onMouseDropCanceled(() => this._onEditorMouseDropCanceled())), this._register(this._editor.onKeyDown((t) => this.onEditorKeyDown(t))), this._register(this._editor.onKeyUp((t) => this.onEditorKeyUp(t))), this._register(this._editor.onDidBlurEditorWidget(() => this.onEditorBlur())), this._register(this._editor.onDidBlurEditorText(() => this.onEditorBlur())), this._mouseDown = !1, this._modifierPressed = !1, this._dragSelection = null; } @@ -73113,7 +73113,7 @@ const Nd = class Nd extends R { ) || this._editor.getOption( 22 /* EditorOption.columnSelection */ - ) || (pp(e) && (this._modifierPressed = !0), this._mouseDown && pp(e) && this._editor.updateOptions({ + ) || (Wp(e) && (this._modifierPressed = !0), this._mouseDown && Wp(e) && this._editor.updateOptions({ mouseStyle: "copy" })); } @@ -73124,7 +73124,7 @@ const Nd = class Nd extends R { ) || this._editor.getOption( 22 /* EditorOption.columnSelection */ - ) || (pp(e) && (this._modifierPressed = !1), this._mouseDown && e.keyCode === Nd.TRIGGER_KEY_VALUE && this._editor.updateOptions({ + ) || (Wp(e) && (this._modifierPressed = !1), this._mouseDown && e.keyCode === Ma.TRIGGER_KEY_VALUE && this._editor.updateOptions({ mouseStyle: "default" })); } @@ -73145,7 +73145,7 @@ const Nd = class Nd extends R { else return; } - pp(e.event) ? this._editor.updateOptions({ + Wp(e.event) ? this._editor.updateOptions({ mouseStyle: "copy" }) : this._editor.updateOptions({ mouseStyle: "default" @@ -73158,24 +73158,24 @@ const Nd = class Nd extends R { } _onEditorMouseDrop(e) { if (e.target && (this._hitContent(e.target) || this._hitMargin(e.target)) && e.target.position) { - const t = new V(e.target.position.lineNumber, e.target.position.column); + const t = new Y(e.target.position.lineNumber, e.target.position.column); if (this._dragSelection === null) { let i = null; if (e.event.shiftKey) { const n = this._editor.getSelection(); if (n) { - const { selectionStartLineNumber: o, selectionStartColumn: r } = n; - i = [new fe(o, r, t.lineNumber, t.column)]; + const { selectionStartLineNumber: o, selectionStartColumn: l } = n; + i = [new ge(o, l, t.lineNumber, t.column)]; } } else - i = (this._editor.getSelections() || []).map((n) => n.containsPosition(t) ? new fe(t.lineNumber, t.column, t.lineNumber, t.column) : n); + i = (this._editor.getSelections() || []).map((n) => n.containsPosition(t) ? new ge(t.lineNumber, t.column, t.lineNumber, t.column) : n); this._editor.setSelections( i || [], "mouse", 3 /* CursorChangeReason.Explicit */ ); - } else (!this._dragSelection.containsPosition(t) || (pp(e.event) || this._modifierPressed) && (this._dragSelection.getEndPosition().equals(t) || this._dragSelection.getStartPosition().equals(t))) && (this._editor.pushUndoStop(), this._editor.executeCommand(Nd.ID, new F0e(this._dragSelection, t, pp(e.event) || this._modifierPressed)), this._editor.pushUndoStop()); + } else (!this._dragSelection.containsPosition(t) || (Wp(e.event) || this._modifierPressed) && (this._dragSelection.getEndPosition().equals(t) || this._dragSelection.getStartPosition().equals(t))) && (this._editor.pushUndoStop(), this._editor.executeCommand(Ma.ID, new Tfe(this._dragSelection, t, Wp(e.event) || this._modifierPressed)), this._editor.pushUndoStop()); } this._editor.updateOptions({ mouseStyle: "text" @@ -73183,8 +73183,8 @@ const Nd = class Nd extends R { } showAt(e) { this._dndDecorationIds.set([{ - range: new M(e.lineNumber, e.column, e.lineNumber, e.column), - options: Nd._DECORATION_OPTIONS + range: new I(e.lineNumber, e.column, e.lineNumber, e.column), + options: Ma._DECORATION_OPTIONS }]), this._editor.revealPosition( e, 1 @@ -73204,29 +73204,29 @@ const Nd = class Nd extends R { this._removeDecoration(), this._dragSelection = null, this._mouseDown = !1, this._modifierPressed = !1, super.dispose(); } }; -Nd.ID = "editor.contrib.dragAndDrop", Nd.TRIGGER_KEY_VALUE = qe ? 6 : 5, Nd._DECORATION_OPTIONS = Re.register({ +Ma.ID = "editor.contrib.dragAndDrop", Ma.TRIGGER_KEY_VALUE = qe ? 6 : 5, Ma._DECORATION_OPTIONS = Je.register({ description: "dnd-target", className: "dnd-target" }); -let Bx = Nd; -gt( - Bx.ID, - Bx, +let oI = Ma; +mt( + oI.ID, + oI, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */ ); -gt( - jc.ID, - jc, +mt( + ta.ID, + ta, 0 /* EditorContributionInstantiation.Eager */ ); -b0(DT); -oe(new class extends zi { +V0(eM); +oe(new class extends Ai { constructor() { super({ - id: R4, - precondition: e5, + id: yj, + precondition: IH, kbOpts: { weight: 100, primary: 2137 @@ -73235,14 +73235,14 @@ oe(new class extends zi { } runEditorCommand(s, e) { var t; - return (t = jc.get(e)) == null ? void 0 : t.changePasteType(); + return (t = ta.get(e)) == null ? void 0 : t.changePasteType(); } }()); -oe(new class extends zi { +oe(new class extends Ai { constructor() { super({ id: "editor.hidePasteWidget", - precondition: e5, + precondition: IH, kbOpts: { weight: 100, primary: 9 @@ -73251,22 +73251,22 @@ oe(new class extends zi { } runEditorCommand(s, e) { var t; - (t = jc.get(e)) == null || t.clearWidgets(); + (t = ta.get(e)) == null || t.clearWidgets(); } }()); -var kg; -ee((kg = class extends he { +var Dm; +ee((Dm = class extends he { constructor() { super({ id: "editor.action.pasteAs", label: p("pasteAs", "Paste As..."), alias: "Paste As...", - precondition: I.writable, + precondition: C.writable, metadata: { description: "Paste as", args: [{ name: "args", - schema: kg.argsSchema + schema: Dm.argsSchema }] } }); @@ -73274,9 +73274,9 @@ ee((kg = class extends he { run(e, t, i) { var o; let n = typeof (i == null ? void 0 : i.kind) == "string" ? i.kind : void 0; - return !n && i && (n = typeof i.id == "string" ? i.id : void 0), (o = jc.get(t)) == null ? void 0 : o.pasteAs(n ? new $t(n) : void 0); + return !n && i && (n = typeof i.id == "string" ? i.id : void 0), (o = ta.get(t)) == null ? void 0 : o.pasteAs(n ? new ei(n) : void 0); } -}, kg.argsSchema = { +}, Dm.argsSchema = { type: "object", properties: { kind: { @@ -73284,22 +73284,22 @@ ee((kg = class extends he { description: p("pasteAs.kind", "The kind of the paste edit to try applying. If not provided or there are multiple edits for this kind, the editor will show a picker.") } } -}, kg)); +}, Dm)); ee(class extends he { constructor() { super({ id: "editor.action.pasteAsText", label: p("pasteAsText", "Paste as Text"), alias: "Paste as Text", - precondition: I.writable + precondition: C.writable }); } run(s, e) { var t; - return (t = jc.get(e)) == null ? void 0 : t.pasteAs({ providerId: Sm.id }); + return (t = ta.get(e)) == null ? void 0 : t.pasteAs({ providerId: Sb.id }); } }); -class Y0e { +class Mfe { constructor() { this._dragOperations = /* @__PURE__ */ new Map(); } @@ -73310,36 +73310,36 @@ class Y0e { } } } -class N3 { +class eK { constructor(e) { this.identifier = e; } } -const uj = $e("treeViewsDndService"); +const _4 = $e("treeViewsDndService"); it( - uj, - Y0e, + _4, + Mfe, 1 /* InstantiationType.Delayed */ ); -var z0e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Yfe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, vS = function(s, e) { +}, K1 = function(s, e) { return function(t, i) { e(t, i, s); }; -}, vD; -const gj = "editor.experimental.dropIntoEditor.defaultProvider", mj = "editor.changeDropType", V5 = new ae("dropWidgetVisible", !1, p("dropWidgetVisible", "Whether the drop widget is showing")); -var Gg; -let Db = (Gg = class extends R { +}, qM; +const Q4 = "editor.experimental.dropIntoEditor.defaultProvider", O4 = "editor.changeDropType", oE = new ce("dropWidgetVisible", !1, p("dropWidgetVisible", "Whether the drop widget is showing")); +var Fm; +let EZ = (Fm = class extends J { static get(e) { - return e.getContribution(vD.ID); + return e.getContribution(qM.ID); } constructor(e, t, i, n, o) { - super(), this._configService = i, this._languageFeaturesService = n, this._treeViewsDragAndDropService = o, this.treeItemsTransfer = NT.getInstance(), this._dropProgressManager = this._register(t.createInstance(wx, "dropIntoEditor", e)), this._postDropWidgetManager = this._register(t.createInstance(Lx, "dropIntoEditor", e, V5, { id: mj, label: p("postDropWidgetTitle", "Show drop options...") })), this._register(e.onDropIntoEditor((r) => this.onDropIntoEditor(e, r.position, r.event))); + super(), this._configService = i, this._languageFeaturesService = n, this._treeViewsDragAndDropService = o, this.treeItemsTransfer = OT.getInstance(), this._dropProgressManager = this._register(t.createInstance(YL, "dropIntoEditor", e)), this._postDropWidgetManager = this._register(t.createInstance(JL, "dropIntoEditor", e, oE, { id: O4, label: p("postDropWidgetTitle", "Show drop options...") })), this._register(e.onDropIntoEditor((l) => this.onDropIntoEditor(e, l.position, l.event))); } clearWidgets() { this._postDropWidgetManager.clear(); @@ -73352,89 +73352,89 @@ let Db = (Gg = class extends R { if (!i.dataTransfer || !e.hasModel()) return; (o = this._currentOperation) == null || o.cancel(), e.focus(), e.setPosition(t); - const n = Ui(async (r) => { - const l = new U(), a = l.add(new Yh(e, 1, void 0, r)); + const n = Qi(async (l) => { + const r = new _(), c = r.add(new Uh(e, 1, void 0, l)); try { - const c = await this.extractDataTransferData(i); - if (c.size === 0 || a.token.isCancellationRequested) + const d = await this.extractDataTransferData(i); + if (d.size === 0 || c.token.isCancellationRequested) return; - const d = e.getModel(); - if (!d) + const a = e.getModel(); + if (!a) return; - const h = this._languageFeaturesService.documentDropEditProvider.ordered(d).filter((g) => g.dropMimeTypes ? g.dropMimeTypes.some((m) => c.matches(m)) : !0), u = l.add(await this.getDropEdits(h, d, t, c, a)); - if (a.token.isCancellationRequested) + const h = this._languageFeaturesService.documentDropEditProvider.ordered(a).filter((m) => m.dropMimeTypes ? m.dropMimeTypes.some((b) => d.matches(b)) : !0), u = r.add(await this.getDropEdits(h, a, t, d, c)); + if (c.token.isCancellationRequested) return; if (u.edits.length) { - const g = this.getInitialActiveEditIndex(d, u.edits), m = e.getOption( + const m = this.getInitialActiveEditIndex(a, u.edits), b = e.getOption( 36 /* EditorOption.dropIntoEditor */ ).showDropSelector === "afterDrop"; - await this._postDropWidgetManager.applyEditAndShowIfNeeded([M.fromPositions(t)], { activeEditIndex: g, allEdits: u.edits }, m, async (f) => f, r); + await this._postDropWidgetManager.applyEditAndShowIfNeeded([I.fromPositions(t)], { activeEditIndex: m, allEdits: u.edits }, b, async (g) => g, l); } } finally { - l.dispose(), this._currentOperation === n && (this._currentOperation = void 0); + r.dispose(), this._currentOperation === n && (this._currentOperation = void 0); } }); this._dropProgressManager.showWhile(t, p("dropIntoEditorProgress", "Running drop handlers. Click to cancel"), n, { cancel: () => n.cancel() }), this._currentOperation = n; } async getDropEdits(e, t, i, n, o) { - const r = new U(), l = await cC(Promise.all(e.map(async (c) => { + const l = new _(), r = await XG(Promise.all(e.map(async (d) => { try { - const d = await c.provideDocumentDropEdits(t, i, n, o.token); - return d && r.add(d), d == null ? void 0 : d.edits.map((h) => ({ ...h, providerId: c.id })); - } catch (d) { - console.error(d); + const a = await d.provideDocumentDropEdits(t, i, n, o.token); + return a && l.add(a), a == null ? void 0 : a.edits.map((h) => ({ ...h, providerId: d.id })); + } catch (a) { + console.error(a); } - })), o.token), a = Or(l ?? []).flat(); + })), o.token), c = _l(r ?? []).flat(); return { - edits: D4(a), - dispose: () => r.dispose() + edits: pj(c), + dispose: () => l.dispose() }; } getInitialActiveEditIndex(e, t) { - const i = this._configService.getValue(gj, { resource: e.uri }); + const i = this._configService.getValue(Q4, { resource: e.uri }); for (const [n, o] of Object.entries(i)) { - const r = new $t(o), l = t.findIndex((a) => r.value === a.providerId && a.handledMimeType && x4(n, [a.handledMimeType])); - if (l >= 0) - return l; + const l = new ei(o), r = t.findIndex((c) => l.value === c.providerId && c.handledMimeType && lj(n, [c.handledMimeType])); + if (r >= 0) + return r; } return 0; } async extractDataTransferData(e) { if (!e.dataTransfer) - return new A4(); - const t = _4(e.dataTransfer); - if (this.treeItemsTransfer.hasData(N3.prototype)) { - const i = this.treeItemsTransfer.getData(N3.prototype); + return new oj(); + const t = dj(e.dataTransfer); + if (this.treeItemsTransfer.hasData(eK.prototype)) { + const i = this.treeItemsTransfer.getData(eK.prototype); if (Array.isArray(i)) for (const n of i) { const o = await this._treeViewsDragAndDropService.removeDragOperationTransfer(n.identifier); if (o) - for (const [r, l] of o) - t.replace(r, l); + for (const [l, r] of o) + t.replace(l, r); } } return t; } -}, vD = Gg, Gg.ID = "editor.contrib.dropIntoEditorController", Gg); -Db = vD = z0e([ - vS(1, Se), - vS(2, Ke), - vS(3, ge), - vS(4, uj) -], Db); -gt( - Db.ID, - Db, +}, qM = Fm, Fm.ID = "editor.contrib.dropIntoEditorController", Fm); +EZ = qM = Yfe([ + K1(1, Ge), + K1(2, Qe), + K1(3, me), + K1(4, _4) +], EZ); +mt( + EZ.ID, + EZ, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */ ); -b0(TT); -oe(new class extends zi { +V0($T); +oe(new class extends Ai { constructor() { super({ - id: mj, - precondition: V5, + id: O4, + precondition: oE, kbOpts: { weight: 100, primary: 2137 @@ -73443,14 +73443,14 @@ oe(new class extends zi { } runEditorCommand(s, e, t) { var i; - (i = Db.get(e)) == null || i.changeDropType(); + (i = EZ.get(e)) == null || i.changeDropType(); } }()); -oe(new class extends zi { +oe(new class extends Ai { constructor() { super({ id: "editor.hideDropWidget", - precondition: V5, + precondition: oE, kbOpts: { weight: 100, primary: 9 @@ -73459,13 +73459,13 @@ oe(new class extends zi { } runEditorCommand(s, e, t) { var i; - (i = Db.get(e)) == null || i.clearWidgets(); + (i = EZ.get(e)) == null || i.clearWidgets(); } }()); -Di.as($r.Configuration).registerConfiguration({ - ...VC, +ki.as(ir.Configuration).registerConfiguration({ + ...BG, properties: { - [gj]: { + [Q4]: { type: "object", scope: 5, description: p("defaultProviderDescription", "Configures the default drop provider to use for content of a given mime type."), @@ -73476,7 +73476,7 @@ Di.as($r.Configuration).registerConfiguration({ } } }); -const Pn = class Pn { +const Un = class Un { constructor(e) { this._editor = e, this._decorations = [], this._overviewRulerApproximateDecorations = [], this._findScopeDecorationIds = [], this._rangeHighlightDecorationId = null, this._highlightedDecorationId = null, this._startPosition = this._editor.getPosition(); } @@ -73519,7 +73519,7 @@ const Pn = class Pn { const t = this._editor.getModel().getDecorationsInRange(e); for (const i of t) { const n = i.options; - if (n === Pn._FIND_MATCH_DECORATION || n === Pn._CURRENT_FIND_MATCH_DECORATION) + if (n === Un._FIND_MATCH_DECORATION || n === Un._CURRENT_FIND_MATCH_DECORATION) return this._getDecorationIndex(i.id); } return 0; @@ -73528,50 +73528,50 @@ const Pn = class Pn { let t = null, i = 0; if (e) for (let n = 0, o = this._decorations.length; n < o; n++) { - const r = this._editor.getModel().getDecorationRange(this._decorations[n]); - if (e.equalsRange(r)) { + const l = this._editor.getModel().getDecorationRange(this._decorations[n]); + if (e.equalsRange(l)) { t = this._decorations[n], i = n + 1; break; } } return (this._highlightedDecorationId !== null || t !== null) && this._editor.changeDecorations((n) => { - if (this._highlightedDecorationId !== null && (n.changeDecorationOptions(this._highlightedDecorationId, Pn._FIND_MATCH_DECORATION), this._highlightedDecorationId = null), t !== null && (this._highlightedDecorationId = t, n.changeDecorationOptions(this._highlightedDecorationId, Pn._CURRENT_FIND_MATCH_DECORATION)), this._rangeHighlightDecorationId !== null && (n.removeDecoration(this._rangeHighlightDecorationId), this._rangeHighlightDecorationId = null), t !== null) { + if (this._highlightedDecorationId !== null && (n.changeDecorationOptions(this._highlightedDecorationId, Un._FIND_MATCH_DECORATION), this._highlightedDecorationId = null), t !== null && (this._highlightedDecorationId = t, n.changeDecorationOptions(this._highlightedDecorationId, Un._CURRENT_FIND_MATCH_DECORATION)), this._rangeHighlightDecorationId !== null && (n.removeDecoration(this._rangeHighlightDecorationId), this._rangeHighlightDecorationId = null), t !== null) { let o = this._editor.getModel().getDecorationRange(t); if (o.startLineNumber !== o.endLineNumber && o.endColumn === 1) { - const r = o.endLineNumber - 1, l = this._editor.getModel().getLineMaxColumn(r); - o = new M(o.startLineNumber, o.startColumn, r, l); + const l = o.endLineNumber - 1, r = this._editor.getModel().getLineMaxColumn(l); + o = new I(o.startLineNumber, o.startColumn, l, r); } - this._rangeHighlightDecorationId = n.addDecoration(o, Pn._RANGE_HIGHLIGHT_DECORATION); + this._rangeHighlightDecorationId = n.addDecoration(o, Un._RANGE_HIGHLIGHT_DECORATION); } }), i; } set(e, t) { this._editor.changeDecorations((i) => { - let n = Pn._FIND_MATCH_DECORATION; + let n = Un._FIND_MATCH_DECORATION; const o = []; if (e.length > 1e3) { - n = Pn._FIND_MATCH_NO_OVERVIEW_DECORATION; - const l = this._editor.getModel().getLineCount(), c = this._editor.getLayoutInfo().height / l, d = Math.max(2, Math.ceil(3 / c)); + n = Un._FIND_MATCH_NO_OVERVIEW_DECORATION; + const r = this._editor.getModel().getLineCount(), d = this._editor.getLayoutInfo().height / r, a = Math.max(2, Math.ceil(3 / d)); let h = e[0].range.startLineNumber, u = e[0].range.endLineNumber; - for (let g = 1, m = e.length; g < m; g++) { - const f = e[g].range; - u + d >= f.startLineNumber ? f.endLineNumber > u && (u = f.endLineNumber) : (o.push({ - range: new M(h, 1, u, 1), - options: Pn._FIND_MATCH_ONLY_OVERVIEW_DECORATION - }), h = f.startLineNumber, u = f.endLineNumber); + for (let m = 1, b = e.length; m < b; m++) { + const g = e[m].range; + u + a >= g.startLineNumber ? g.endLineNumber > u && (u = g.endLineNumber) : (o.push({ + range: new I(h, 1, u, 1), + options: Un._FIND_MATCH_ONLY_OVERVIEW_DECORATION + }), h = g.startLineNumber, u = g.endLineNumber); } o.push({ - range: new M(h, 1, u, 1), - options: Pn._FIND_MATCH_ONLY_OVERVIEW_DECORATION + range: new I(h, 1, u, 1), + options: Un._FIND_MATCH_ONLY_OVERVIEW_DECORATION }); } - const r = new Array(e.length); - for (let l = 0, a = e.length; l < a; l++) - r[l] = { - range: e[l].range, + const l = new Array(e.length); + for (let r = 0, c = e.length; r < c; r++) + l[r] = { + range: e[r].range, options: n }; - this._decorations = i.deltaDecorations(this._decorations, r), this._overviewRulerApproximateDecorations = i.deltaDecorations(this._overviewRulerApproximateDecorations, o), this._rangeHighlightDecorationId && (i.removeDecoration(this._rangeHighlightDecorationId), this._rangeHighlightDecorationId = null), this._findScopeDecorationIds.length && (this._findScopeDecorationIds.forEach((l) => i.removeDecoration(l)), this._findScopeDecorationIds = []), t != null && t.length && (this._findScopeDecorationIds = t.map((l) => i.addDecoration(l, Pn._FIND_SCOPE_DECORATION))); + this._decorations = i.deltaDecorations(this._decorations, l), this._overviewRulerApproximateDecorations = i.deltaDecorations(this._overviewRulerApproximateDecorations, o), this._rangeHighlightDecorationId && (i.removeDecoration(this._rangeHighlightDecorationId), this._rangeHighlightDecorationId = null), this._findScopeDecorationIds.length && (this._findScopeDecorationIds.forEach((r) => i.removeDecoration(r)), this._findScopeDecorationIds = []), t != null && t.length && (this._findScopeDecorationIds = t.map((r) => i.addDecoration(r, Un._FIND_SCOPE_DECORATION))); }); } matchBeforePosition(e) { @@ -73607,7 +73607,7 @@ const Pn = class Pn { return e = e.concat(this._decorations), e = e.concat(this._overviewRulerApproximateDecorations), this._findScopeDecorationIds.length && e.push(...this._findScopeDecorationIds), this._rangeHighlightDecorationId && e.push(this._rangeHighlightDecorationId), e; } }; -Pn._CURRENT_FIND_MATCH_DECORATION = Re.register({ +Un._CURRENT_FIND_MATCH_DECORATION = Je.register({ description: "current-find-match", stickiness: 1, zIndex: 13, @@ -73615,15 +73615,15 @@ Pn._CURRENT_FIND_MATCH_DECORATION = Re.register({ inlineClassName: "currentFindMatchInline", showIfCollapsed: !0, overviewRuler: { - color: fi(YN), - position: ur.Center + color: Zi(nR), + position: pl.Center }, minimap: { - color: fi(sv), + color: Zi(Iw), position: 1 /* MinimapPosition.Inline */ } -}), Pn._FIND_MATCH_DECORATION = Re.register({ +}), Un._FIND_MATCH_DECORATION = Je.register({ description: "find-match", stickiness: 1, zIndex: 10, @@ -73631,57 +73631,57 @@ Pn._CURRENT_FIND_MATCH_DECORATION = Re.register({ inlineClassName: "findMatchInline", showIfCollapsed: !0, overviewRuler: { - color: fi(YN), - position: ur.Center + color: Zi(nR), + position: pl.Center }, minimap: { - color: fi(sv), + color: Zi(Iw), position: 1 /* MinimapPosition.Inline */ } -}), Pn._FIND_MATCH_NO_OVERVIEW_DECORATION = Re.register({ +}), Un._FIND_MATCH_NO_OVERVIEW_DECORATION = Je.register({ description: "find-match-no-overview", stickiness: 1, className: "findMatch", showIfCollapsed: !0 -}), Pn._FIND_MATCH_ONLY_OVERVIEW_DECORATION = Re.register({ +}), Un._FIND_MATCH_ONLY_OVERVIEW_DECORATION = Je.register({ description: "find-match-only-overview", stickiness: 1, overviewRuler: { - color: fi(YN), - position: ur.Center + color: Zi(nR), + position: pl.Center } -}), Pn._RANGE_HIGHLIGHT_DECORATION = Re.register({ +}), Un._RANGE_HIGHLIGHT_DECORATION = Je.register({ description: "find-range-highlight", stickiness: 1, className: "rangeHighlight", isWholeLine: !0 -}), Pn._FIND_SCOPE_DECORATION = Re.register({ +}), Un._FIND_SCOPE_DECORATION = Je.register({ description: "find-scope", className: "findScope", isWholeLine: !0 }); -let TD = Pn; -class P0e { +let $M = Un; +class kfe { constructor(e, t, i) { this._editorSelection = e, this._ranges = t, this._replaceStrings = i, this._trackedEditorSelectionId = null; } getEditOperations(e, t) { if (this._ranges.length > 0) { const i = []; - for (let r = 0; r < this._ranges.length; r++) + for (let l = 0; l < this._ranges.length; l++) i.push({ - range: this._ranges[r], - text: this._replaceStrings[r] + range: this._ranges[l], + text: this._replaceStrings[l] }); - i.sort((r, l) => M.compareRangesUsingStarts(r.range, l.range)); + i.sort((l, r) => I.compareRangesUsingStarts(l.range, r.range)); const n = []; let o = i[0]; - for (let r = 1; r < i.length; r++) - o.range.endLineNumber === i[r].range.startLineNumber && o.range.endColumn === i[r].range.startColumn ? (o.range = o.range.plusRange(i[r].range), o.text = o.text + i[r].text) : (n.push(o), o = i[r]); + for (let l = 1; l < i.length; l++) + o.range.endLineNumber === i[l].range.startLineNumber && o.range.endColumn === i[l].range.startColumn ? (o.range = o.range.plusRange(i[l].range), o.text = o.text + i[l].text) : (n.push(o), o = i[l]); n.push(o); - for (const r of n) - t.addEditOperation(r.range, r.text); + for (const l of n) + t.addEditOperation(l.range, l.text); } this._trackedEditorSelectionId = t.trackSelection(this._editorSelection); } @@ -73689,82 +73689,82 @@ class P0e { return t.getTrackedSelection(this._trackedEditorSelectionId); } } -function pj(s, e) { +function j4(s, e) { if (s && s[0] !== "") { - const t = W3(s, e, "-"), i = W3(s, e, "_"); - return t && !i ? v3(s, e, "-") : !t && i ? v3(s, e, "_") : s[0].toUpperCase() === s[0] ? e.toUpperCase() : s[0].toLowerCase() === s[0] ? e.toLowerCase() : cq(s[0][0]) && e.length > 0 ? e[0].toUpperCase() + e.substr(1) : s[0][0].toUpperCase() !== s[0][0] && e.length > 0 ? e[0].toLowerCase() + e.substr(1) : e; + const t = tK(s, e, "-"), i = tK(s, e, "_"); + return t && !i ? iK(s, e, "-") : !t && i ? iK(s, e, "_") : s[0].toUpperCase() === s[0] ? e.toUpperCase() : s[0].toLowerCase() === s[0] ? e.toLowerCase() : t$(s[0][0]) && e.length > 0 ? e[0].toUpperCase() + e.substr(1) : s[0][0].toUpperCase() !== s[0][0] && e.length > 0 ? e[0].toLowerCase() + e.substr(1) : e; } else return e; } -function W3(s, e, t) { +function tK(s, e, t) { return s[0].indexOf(t) !== -1 && e.indexOf(t) !== -1 && s[0].split(t).length === e.split(t).length; } -function v3(s, e, t) { +function iK(s, e, t) { const i = e.split(t), n = s[0].split(t); let o = ""; - return i.forEach((r, l) => { - o += pj([n[l]], r) + t; + return i.forEach((l, r) => { + o += j4([n[r]], l) + t; }), o.slice(0, -1); } -class T3 { +class nK { constructor(e) { this.staticValue = e, this.kind = 0; } } -class B0e { +class vfe { constructor(e) { this.pieces = e, this.kind = 1; } } -class Vb { +class DZ { static fromStaticValue(e) { - return new Vb([gg.staticValue(e)]); + return new DZ([fm.staticValue(e)]); } get hasReplacementPatterns() { return this._state.kind === 1; } constructor(e) { - !e || e.length === 0 ? this._state = new T3("") : e.length === 1 && e[0].staticValue !== null ? this._state = new T3(e[0].staticValue) : this._state = new B0e(e); + !e || e.length === 0 ? this._state = new nK("") : e.length === 1 && e[0].staticValue !== null ? this._state = new nK(e[0].staticValue) : this._state = new vfe(e); } buildReplaceString(e, t) { if (this._state.kind === 0) - return t ? pj(e, this._state.staticValue) : this._state.staticValue; + return t ? j4(e, this._state.staticValue) : this._state.staticValue; let i = ""; for (let n = 0, o = this._state.pieces.length; n < o; n++) { - const r = this._state.pieces[n]; - if (r.staticValue !== null) { - i += r.staticValue; + const l = this._state.pieces[n]; + if (l.staticValue !== null) { + i += l.staticValue; continue; } - let l = Vb._substitute(r.matchIndex, e); - if (r.caseOps !== null && r.caseOps.length > 0) { - const a = [], c = r.caseOps.length; - let d = 0; - for (let h = 0, u = l.length; h < u; h++) { - if (d >= c) { - a.push(l.slice(h)); + let r = DZ._substitute(l.matchIndex, e); + if (l.caseOps !== null && l.caseOps.length > 0) { + const c = [], d = l.caseOps.length; + let a = 0; + for (let h = 0, u = r.length; h < u; h++) { + if (a >= d) { + c.push(r.slice(h)); break; } - switch (r.caseOps[d]) { + switch (l.caseOps[a]) { case "U": - a.push(l[h].toUpperCase()); + c.push(r[h].toUpperCase()); break; case "u": - a.push(l[h].toUpperCase()), d++; + c.push(r[h].toUpperCase()), a++; break; case "L": - a.push(l[h].toLowerCase()); + c.push(r[h].toLowerCase()); break; case "l": - a.push(l[h].toLowerCase()), d++; + c.push(r[h].toLowerCase()), a++; break; default: - a.push(l[h]); + c.push(r[h]); } } - l = a.join(""); + r = c.join(""); } - i += l; + i += r; } return i; } @@ -73782,18 +73782,18 @@ class Vb { return "$" + i; } } -class gg { +class fm { static staticValue(e) { - return new gg(e, -1, null); + return new fm(e, -1, null); } static caseOps(e, t) { - return new gg(null, e, t); + return new fm(null, e, t); } constructor(e, t, i) { this.staticValue = e, this.matchIndex = t, !i || i.length === 0 ? this.caseOps = null : this.caseOps = i.slice(0); } } -class O0e { +class Jfe { constructor(e) { this._source = e, this._lastCharIndex = 0, this._result = [], this._resultLen = 0, this._currentStaticPiece = ""; } @@ -73807,23 +73807,23 @@ class O0e { e.length !== 0 && (this._currentStaticPiece += e); } emitMatchIndex(e, t, i) { - this._currentStaticPiece.length !== 0 && (this._result[this._resultLen++] = gg.staticValue(this._currentStaticPiece), this._currentStaticPiece = ""), this._result[this._resultLen++] = gg.caseOps(e, i), this._lastCharIndex = t; + this._currentStaticPiece.length !== 0 && (this._result[this._resultLen++] = fm.staticValue(this._currentStaticPiece), this._currentStaticPiece = ""), this._result[this._resultLen++] = fm.caseOps(e, i), this._lastCharIndex = t; } finalize() { - return this.emitUnchanged(this._source.length), this._currentStaticPiece.length !== 0 && (this._result[this._resultLen++] = gg.staticValue(this._currentStaticPiece), this._currentStaticPiece = ""), new Vb(this._result); + return this.emitUnchanged(this._source.length), this._currentStaticPiece.length !== 0 && (this._result[this._resultLen++] = fm.staticValue(this._currentStaticPiece), this._currentStaticPiece = ""), new DZ(this._result); } } -function H0e(s) { +function Hfe(s) { if (!s || s.length === 0) - return new Vb(null); - const e = [], t = new O0e(s); + return new DZ(null); + const e = [], t = new Jfe(s); for (let i = 0, n = s.length; i < n; i++) { const o = s.charCodeAt(i); if (o === 92) { if (i++, i >= n) break; - const r = s.charCodeAt(i); - switch (r) { + const l = s.charCodeAt(i); + switch (l) { case 92: t.emitUnchanged(i - 1), t.emitStatic("\\", i + 1); break; @@ -73838,7 +73838,7 @@ function H0e(s) { case 85: case 108: case 76: - t.emitUnchanged(i - 1), t.emitStatic("", i + 1), e.push(String.fromCharCode(r)); + t.emitUnchanged(i - 1), t.emitStatic("", i + 1), e.push(String.fromCharCode(l)); break; } continue; @@ -73846,64 +73846,64 @@ function H0e(s) { if (o === 36) { if (i++, i >= n) break; - const r = s.charCodeAt(i); - if (r === 36) { + const l = s.charCodeAt(i); + if (l === 36) { t.emitUnchanged(i - 1), t.emitStatic("$", i + 1); continue; } - if (r === 48 || r === 38) { + if (l === 48 || l === 38) { t.emitUnchanged(i - 1), t.emitMatchIndex(0, i + 1, e), e.length = 0; continue; } - if (49 <= r && r <= 57) { - let l = r - 48; + if (49 <= l && l <= 57) { + let r = l - 48; if (i + 1 < n) { - const a = s.charCodeAt(i + 1); - if (48 <= a && a <= 57) { - i++, l = l * 10 + (a - 48), t.emitUnchanged(i - 2), t.emitMatchIndex(l, i + 1, e), e.length = 0; + const c = s.charCodeAt(i + 1); + if (48 <= c && c <= 57) { + i++, r = r * 10 + (c - 48), t.emitUnchanged(i - 2), t.emitMatchIndex(r, i + 1, e), e.length = 0; continue; } } - t.emitUnchanged(i - 1), t.emitMatchIndex(l, i + 1, e), e.length = 0; + t.emitUnchanged(i - 1), t.emitMatchIndex(r, i + 1, e), e.length = 0; continue; } } } return t.finalize(); } -const cd = new ae("findWidgetVisible", !1); -cd.toNegated(); -const UI = new ae("findInputFocussed", !1), k5 = new ae("replaceInputFocussed", !1), TS = { +const ma = new ce("findWidgetVisible", !1); +ma.toNegated(); +const dC = new ce("findInputFocussed", !1), lE = new ce("replaceInputFocussed", !1), U1 = { primary: 545, mac: { primary: 2593 /* KeyCode.KeyC */ } -}, DS = { +}, P1 = { primary: 565, mac: { primary: 2613 /* KeyCode.KeyW */ } -}, VS = { +}, B1 = { primary: 560, mac: { primary: 2608 /* KeyCode.KeyR */ } -}, kS = { +}, _1 = { primary: 554, mac: { primary: 2602 /* KeyCode.KeyL */ } -}, GS = { +}, Q1 = { primary: 558, mac: { primary: 2606 /* KeyCode.KeyP */ } -}, Ft = { +}, Dt = { StartFindAction: "actions.find", StartFindWithSelection: "actions.findWithSelection", StartFindWithArgs: "editor.actions.findWithArgs", @@ -73922,10 +73922,10 @@ const UI = new ae("findInputFocussed", !1), k5 = new ae("replaceInputFocussed", ReplaceOneAction: "editor.action.replaceOne", ReplaceAllAction: "editor.action.replaceAll", SelectAllMatchesAction: "editor.action.selectAllMatches" -}, Kd = 19999, J0e = 240; -class Ky { +}, $a = 19999, Efe = 240; +class ly { constructor(e, t) { - this._toDispose = new U(), this._editor = e, this._state = t, this._isDisposed = !1, this._startSearchingTimer = new qr(), this._decorations = new TD(e), this._toDispose.add(this._decorations), this._updateDecorationsScheduler = new Zt(() => { + this._toDispose = new _(), this._editor = e, this._state = t, this._isDisposed = !1, this._startSearchingTimer = new tr(), this._decorations = new $M(e), this._toDispose.add(this._decorations), this._updateDecorationsScheduler = new St(() => { if (this._editor.hasModel()) return this.research(!1); }, 100), this._toDispose.add(this._updateDecorationsScheduler), this._toDispose.add(this._editor.onDidChangeCursorPosition((i) => { @@ -73935,34 +73935,34 @@ class Ky { })), this._toDispose.add(this._state.onFindReplaceStateChange((i) => this._onStateChanged(i))), this.research(!1, this._state.searchScope); } dispose() { - this._isDisposed = !0, Wt(this._startSearchingTimer), this._toDispose.dispose(); + this._isDisposed = !0, Nt(this._startSearchingTimer), this._toDispose.dispose(); } _onStateChanged(e) { this._isDisposed || this._editor.hasModel() && (e.searchString || e.isReplaceRevealed || e.isRegex || e.wholeWord || e.matchCase || e.searchScope) && (this._editor.getModel().isTooLargeForSyncing() ? (this._startSearchingTimer.cancel(), this._startSearchingTimer.setIfNotSet(() => { e.searchScope ? this.research(e.moveCursor, this._state.searchScope) : this.research(e.moveCursor); - }, J0e)) : e.searchScope ? this.research(e.moveCursor, this._state.searchScope) : this.research(e.moveCursor)); + }, Efe)) : e.searchScope ? this.research(e.moveCursor, this._state.searchScope) : this.research(e.moveCursor)); } static _getSearchRange(e, t) { return t || e.getFullModelRange(); } research(e, t) { let i = null; - typeof t < "u" ? t !== null && (Array.isArray(t) ? i = t : i = [t]) : i = this._decorations.getFindScopes(), i !== null && (i = i.map((l) => { - if (l.startLineNumber !== l.endLineNumber) { - let a = l.endLineNumber; - return l.endColumn === 1 && (a = a - 1), new M(l.startLineNumber, 1, a, this._editor.getModel().getLineMaxColumn(a)); + typeof t < "u" ? t !== null && (Array.isArray(t) ? i = t : i = [t]) : i = this._decorations.getFindScopes(), i !== null && (i = i.map((r) => { + if (r.startLineNumber !== r.endLineNumber) { + let c = r.endLineNumber; + return r.endColumn === 1 && (c = c - 1), new I(r.startLineNumber, 1, c, this._editor.getModel().getLineMaxColumn(c)); } - return l; + return r; })); - const n = this._findMatches(i, !1, Kd); + const n = this._findMatches(i, !1, $a); this._decorations.set(n, i); const o = this._editor.getSelection(); - let r = this._decorations.getCurrentMatchesPosition(o); - if (r === 0 && n.length > 0) { - const l = n1(n.map((a) => a.range), (a) => M.compareRangesUsingStarts(a, o) >= 0); - r = l > 0 ? l - 1 + 1 : r; + let l = this._decorations.getCurrentMatchesPosition(o); + if (l === 0 && n.length > 0) { + const r = pW(n.map((c) => c.range), (c) => I.compareRangesUsingStarts(c, o) >= 0); + l = r > 0 ? r - 1 + 1 : l; } - this._state.changeMatchInfo(r, this._decorations.getCount(), void 0), e && this._editor.getOption( + this._state.changeMatchInfo(l, this._decorations.getCount(), void 0), e && this._editor.getOption( 41 /* EditorOption.find */ ).cursorMoveOnType && this._moveToNextMatch(this._decorations.getStartPosition()); @@ -73993,35 +73993,35 @@ class Ky { const t = this._state.isRegex && (this._state.searchString.indexOf("^") >= 0 || this._state.searchString.indexOf("$") >= 0); let { lineNumber: i, column: n } = e; const o = this._editor.getModel(); - return t || n === 1 ? (i === 1 ? i = o.getLineCount() : i--, n = o.getLineMaxColumn(i)) : n--, new V(i, n); + return t || n === 1 ? (i === 1 ? i = o.getLineCount() : i--, n = o.getLineMaxColumn(i)) : n--, new Y(i, n); } _moveToPrevMatch(e, t = !1) { if (!this._state.canNavigateBack()) { - const d = this._decorations.matchAfterPosition(e); - d && this._setCurrentFindMatch(d); + const a = this._decorations.matchAfterPosition(e); + a && this._setCurrentFindMatch(a); return; } - if (this._decorations.getCount() < Kd) { - let d = this._decorations.matchBeforePosition(e); - d && d.isEmpty() && d.getStartPosition().equals(e) && (e = this._prevSearchPosition(e), d = this._decorations.matchBeforePosition(e)), d && this._setCurrentFindMatch(d); + if (this._decorations.getCount() < $a) { + let a = this._decorations.matchBeforePosition(e); + a && a.isEmpty() && a.getStartPosition().equals(e) && (e = this._prevSearchPosition(e), a = this._decorations.matchBeforePosition(e)), a && this._setCurrentFindMatch(a); return; } if (this._cannotFind()) return; - const i = this._decorations.getFindScope(), n = Ky._getSearchRange(this._editor.getModel(), i); + const i = this._decorations.getFindScope(), n = ly._getSearchRange(this._editor.getModel(), i); n.getEndPosition().isBefore(e) && (e = n.getEndPosition()), e.isBefore(n.getStartPosition()) && (e = n.getEndPosition()); - const { lineNumber: o, column: r } = e, l = this._editor.getModel(); - let a = new V(o, r), c = l.findPreviousMatch(this._state.searchString, a, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption( + const { lineNumber: o, column: l } = e, r = this._editor.getModel(); + let c = new Y(o, l), d = r.findPreviousMatch(this._state.searchString, c, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption( 132 /* EditorOption.wordSeparators */ ) : null, !1); - if (c && c.range.isEmpty() && c.range.getStartPosition().equals(a) && (a = this._prevSearchPosition(a), c = l.findPreviousMatch(this._state.searchString, a, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption( + if (d && d.range.isEmpty() && d.range.getStartPosition().equals(c) && (c = this._prevSearchPosition(c), d = r.findPreviousMatch(this._state.searchString, c, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption( 132 /* EditorOption.wordSeparators */ - ) : null, !1)), !!c) { - if (!t && !n.containsRange(c.range)) - return this._moveToPrevMatch(c.range.getStartPosition(), !0); - this._setCurrentFindMatch(c.range); + ) : null, !1)), !!d) { + if (!t && !n.containsRange(d.range)) + return this._moveToPrevMatch(d.range.getStartPosition(), !0); + this._setCurrentFindMatch(d.range); } } moveToPrevMatch() { @@ -74031,7 +74031,7 @@ class Ky { const t = this._state.isRegex && (this._state.searchString.indexOf("^") >= 0 || this._state.searchString.indexOf("$") >= 0); let { lineNumber: i, column: n } = e; const o = this._editor.getModel(); - return t || n === o.getLineMaxColumn(i) ? (i === o.getLineCount() ? i = 1 : i++, n = 1) : n++, new V(i, n); + return t || n === o.getLineMaxColumn(i) ? (i === o.getLineCount() ? i = 1 : i++, n = 1) : n++, new Y(i, n); } _moveToNextMatch(e) { if (!this._state.canNavigateForward()) { @@ -74039,7 +74039,7 @@ class Ky { i && this._setCurrentFindMatch(i); return; } - if (this._decorations.getCount() < Kd) { + if (this._decorations.getCount() < $a) { let i = this._decorations.matchAfterPosition(e); i && i.isEmpty() && i.getStartPosition().equals(e) && (e = this._nextSearchPosition(e), i = this._decorations.matchAfterPosition(e)), i && this._setCurrentFindMatch(i); return; @@ -74050,17 +74050,17 @@ class Ky { _getNextMatch(e, t, i, n = !1) { if (this._cannotFind()) return null; - const o = this._decorations.getFindScope(), r = Ky._getSearchRange(this._editor.getModel(), o); - r.getEndPosition().isBefore(e) && (e = r.getStartPosition()), e.isBefore(r.getStartPosition()) && (e = r.getStartPosition()); - const { lineNumber: l, column: a } = e, c = this._editor.getModel(); - let d = new V(l, a), h = c.findNextMatch(this._state.searchString, d, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption( + const o = this._decorations.getFindScope(), l = ly._getSearchRange(this._editor.getModel(), o); + l.getEndPosition().isBefore(e) && (e = l.getStartPosition()), e.isBefore(l.getStartPosition()) && (e = l.getStartPosition()); + const { lineNumber: r, column: c } = e, d = this._editor.getModel(); + let a = new Y(r, c), h = d.findNextMatch(this._state.searchString, a, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption( 132 /* EditorOption.wordSeparators */ ) : null, t); - return i && h && h.range.isEmpty() && h.range.getStartPosition().equals(d) && (d = this._nextSearchPosition(d), h = c.findNextMatch(this._state.searchString, d, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption( + return i && h && h.range.isEmpty() && h.range.getStartPosition().equals(a) && (a = this._nextSearchPosition(a), h = d.findNextMatch(this._state.searchString, a, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption( 132 /* EditorOption.wordSeparators */ - ) : null, t)), h ? !n && !r.containsRange(h.range) ? this._getNextMatch(h.range.getEndPosition(), t, i, !0) : h : null; + ) : null, t)), h ? !n && !l.containsRange(h.range) ? this._getNextMatch(h.range.getEndPosition(), t, i, !0) : h : null; } moveToNextMatch() { this._moveToNextMatch(this._editor.getSelection().getEndPosition()); @@ -74073,7 +74073,7 @@ class Ky { this._moveToMatch(e); } _getReplacePattern() { - return this._state.isRegex ? H0e(this._state.replaceString) : Vb.fromStaticValue(this._state.replaceString); + return this._state.isRegex ? Hfe(this._state.replaceString) : DZ.fromStaticValue(this._state.replaceString); } replace() { if (!this._hasMatches()) @@ -74081,13 +74081,13 @@ class Ky { const e = this._getReplacePattern(), t = this._editor.getSelection(), i = this._getNextMatch(t.getStartPosition(), !0, !1); if (i) if (t.equalsRange(i.range)) { - const n = e.buildReplaceString(i.matches, this._state.preserveCase), o = new Mn(t, n); - this._executeEditorCommand("replace", o), this._decorations.setStartPosition(new V(t.startLineNumber, t.startColumn + n.length)), this.research(!0); + const n = e.buildReplaceString(i.matches, this._state.preserveCase), o = new Sn(t, n); + this._executeEditorCommand("replace", o), this._decorations.setStartPosition(new Y(t.startLineNumber, t.startColumn + n.length)), this.research(!0); } else this._decorations.setStartPosition(this._editor.getPosition()), this._setCurrentFindMatch(i.range); } _findMatches(e, t, i) { - const n = (e || [null]).map((o) => Ky._getSearchRange(this._editor.getModel(), o)); + const n = (e || [null]).map((o) => ly._getSearchRange(this._editor.getModel(), o)); return this._editor.getModel().findMatches(this._state.searchString, n, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption( 132 /* EditorOption.wordSeparators */ @@ -74097,10 +74097,10 @@ class Ky { if (!this._hasMatches()) return; const e = this._decorations.getFindScopes(); - e === null && this._state.matchesCount >= Kd ? this._largeReplaceAll() : this._regularReplaceAll(e), this.research(!1); + e === null && this._state.matchesCount >= $a ? this._largeReplaceAll() : this._regularReplaceAll(e), this.research(!1); } _largeReplaceAll() { - const t = new xu(this._state.searchString, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption( + const t = new Ru(this._state.searchString, this._state.isRegex, this._state.matchCase, this._state.wholeWord ? this._editor.getOption( 132 /* EditorOption.wordSeparators */ ) : null).parseSearchRequest(); @@ -74114,14 +74114,14 @@ class Ky { const n = this._editor.getModel(), o = n.getValue( 1 /* EndOfLinePreference.LF */ - ), r = n.getFullModelRange(), l = this._getReplacePattern(); - let a; - const c = this._state.preserveCase; - l.hasReplacementPatterns || c ? a = o.replace(i, function() { - return l.buildReplaceString(arguments, c); - }) : a = o.replace(i, l.buildReplaceString(null, c)); - const d = new fE(r, a, this._editor.getSelection()); - this._executeEditorCommand("replaceAll", d); + ), l = n.getFullModelRange(), r = this._getReplacePattern(); + let c; + const d = this._state.preserveCase; + r.hasReplacementPatterns || d ? c = o.replace(i, function() { + return r.buildReplaceString(arguments, d); + }) : c = o.replace(i, r.buildReplaceString(null, d)); + const a = new Fv(l, c, this._editor.getSelection()); + this._executeEditorCommand("replaceAll", a); } _regularReplaceAll(e) { const t = this._getReplacePattern(), i = this._findMatches( @@ -74130,9 +74130,9 @@ class Ky { 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */ ), n = []; - for (let r = 0, l = i.length; r < l; r++) - n[r] = t.buildReplaceString(i[r].matches, this._state.preserveCase); - const o = new P0e(this._editor.getSelection(), i.map((r) => r.range), n); + for (let l = 0, r = i.length; l < r; l++) + n[l] = t.buildReplaceString(i[l].matches, this._state.preserveCase); + const o = new kfe(this._editor.getSelection(), i.map((l) => l.range), n); this._executeEditorCommand("replaceAll", o); } selectAllMatches() { @@ -74144,9 +74144,9 @@ class Ky { !1, 1073741824 /* Constants.MAX_SAFE_SMALL_INTEGER */ - ).map((o) => new fe(o.range.startLineNumber, o.range.startColumn, o.range.endLineNumber, o.range.endColumn)); + ).map((o) => new ge(o.range.startLineNumber, o.range.startColumn, o.range.endLineNumber, o.range.endColumn)); const n = this._editor.getSelection(); - for (let o = 0, r = i.length; o < r; o++) + for (let o = 0, l = i.length; o < l; o++) if (i[o].equalsRange(n)) { i = [n].concat(i.slice(0, o)).concat(i.slice(o + 1)); break; @@ -74161,16 +74161,16 @@ class Ky { } } } -const GZ = class GZ extends Ko { +const j2 = class j2 extends jo { constructor(e, t, i) { - super(), this._hideSoon = this._register(new Zt(() => this._hide(), 2e3)), this._isVisible = !1, this._editor = e, this._state = t, this._keybindingService = i, this._domNode = document.createElement("div"), this._domNode.className = "findOptionsWidget", this._domNode.style.display = "none", this._domNode.style.top = "10px", this._domNode.style.zIndex = "12", this._domNode.setAttribute("role", "presentation"), this._domNode.setAttribute("aria-hidden", "true"); + super(), this._hideSoon = this._register(new St(() => this._hide(), 2e3)), this._isVisible = !1, this._editor = e, this._state = t, this._keybindingService = i, this._domNode = document.createElement("div"), this._domNode.className = "findOptionsWidget", this._domNode.style.display = "none", this._domNode.style.top = "10px", this._domNode.style.zIndex = "12", this._domNode.setAttribute("role", "presentation"), this._domNode.setAttribute("aria-hidden", "true"); const n = { - inputActiveOptionBorder: de(oI), - inputActiveOptionForeground: de(rI), - inputActiveOptionBackground: de(bC) - }, o = this._register(yb()); - this.caseSensitive = this._register(new kQ({ - appendTitle: this._keybindingLabelFor(Ft.ToggleCaseSensitiveCommand), + inputActiveOptionBorder: ae(Wx), + inputActiveOptionForeground: ae(Gx), + inputActiveOptionBackground: ae(NG) + }, o = this._register(LZ()); + this.caseSensitive = this._register(new Z4({ + appendTitle: this._keybindingLabelFor(Dt.ToggleCaseSensitiveCommand), isChecked: this._state.matchCase, hoverDelegate: o, ...n @@ -74178,8 +74178,8 @@ const GZ = class GZ extends Ko { this._state.change({ matchCase: this.caseSensitive.checked }, !1); - })), this.wholeWords = this._register(new GQ({ - appendTitle: this._keybindingLabelFor(Ft.ToggleWholeWordCommand), + })), this.wholeWords = this._register(new f4({ + appendTitle: this._keybindingLabelFor(Dt.ToggleWholeWordCommand), isChecked: this._state.wholeWord, hoverDelegate: o, ...n @@ -74187,8 +74187,8 @@ const GZ = class GZ extends Ko { this._state.change({ wholeWord: this.wholeWords.checked }, !1); - })), this.regex = this._register(new RQ({ - appendTitle: this._keybindingLabelFor(Ft.ToggleRegexCommand), + })), this.regex = this._register(new y4({ + appendTitle: this._keybindingLabelFor(Dt.ToggleRegexCommand), isChecked: this._state.isRegex, hoverDelegate: o, ...n @@ -74196,10 +74196,10 @@ const GZ = class GZ extends Ko { this._state.change({ isRegex: this.regex.checked }, !1); - })), this._editor.addOverlayWidget(this), this._register(this._state.onFindReplaceStateChange((r) => { - let l = !1; - r.isRegex && (this.regex.checked = this._state.isRegex, l = !0), r.wholeWord && (this.wholeWords.checked = this._state.wholeWord, l = !0), r.matchCase && (this.caseSensitive.checked = this._state.matchCase, l = !0), !this._state.isRevealed && l && this._revealTemporarily(); - })), this._register(z(this._domNode, ie.MOUSE_LEAVE, (r) => this._onMouseLeave())), this._register(z(this._domNode, "mouseover", (r) => this._onMouseOver())); + })), this._editor.addOverlayWidget(this), this._register(this._state.onFindReplaceStateChange((l) => { + let r = !1; + l.isRegex && (this.regex.checked = this._state.isRegex, r = !0), l.wholeWord && (this.wholeWords.checked = this._state.wholeWord, r = !0), l.matchCase && (this.caseSensitive.checked = this._state.matchCase, r = !0), !this._state.isRevealed && r && this._revealTemporarily(); + })), this._register(z(this._domNode, ie.MOUSE_LEAVE, (l) => this._onMouseLeave())), this._register(z(this._domNode, "mouseover", (l) => this._onMouseOver())); } _keybindingLabelFor(e) { const t = this._keybindingService.lookupKeybinding(e); @@ -74210,7 +74210,7 @@ const GZ = class GZ extends Ko { } // ----- IOverlayWidget API getId() { - return GZ.ID; + return j2.ID; } getDomNode() { return this._domNode; @@ -74240,12 +74240,12 @@ const GZ = class GZ extends Ko { this._isVisible && (this._isVisible = !1, this._domNode.style.display = "none"); } }; -GZ.ID = "editor.contrib.findOptionsWidget"; -let DD = GZ; -function RS(s, e) { +j2.ID = "editor.contrib.findOptionsWidget"; +let e9 = j2; +function O1(s, e) { return s === 1 ? !0 : s === 2 ? !1 : e; } -class U0e extends R { +class Dfe extends J { get searchString() { return this._searchString; } @@ -74259,16 +74259,16 @@ class U0e extends R { return this._isReplaceRevealed; } get isRegex() { - return RS(this._isRegexOverride, this._isRegex); + return O1(this._isRegexOverride, this._isRegex); } get wholeWord() { - return RS(this._wholeWordOverride, this._wholeWord); + return O1(this._wholeWordOverride, this._wholeWord); } get matchCase() { - return RS(this._matchCaseOverride, this._matchCase); + return O1(this._matchCaseOverride, this._matchCase); } get preserveCase() { - return RS(this._preserveCaseOverride, this._preserveCase); + return O1(this._preserveCaseOverride, this._preserveCase); } get actualIsRegex() { return this._isRegex; @@ -74318,10 +74318,10 @@ class U0e extends R { filters: !1 }; let o = !1; - t === 0 && (e = 0), e > t && (e = t), this._matchesPosition !== e && (this._matchesPosition = e, n.matchesPosition = !0, o = !0), this._matchesCount !== t && (this._matchesCount = t, n.matchesCount = !0, o = !0), typeof i < "u" && (M.equalsRange(this._currentMatch, i) || (this._currentMatch = i, n.currentMatch = !0, o = !0)), o && this._onFindReplaceStateChange.fire(n); + t === 0 && (e = 0), e > t && (e = t), this._matchesPosition !== e && (this._matchesPosition = e, n.matchesPosition = !0, o = !0), this._matchesCount !== t && (this._matchesCount = t, n.matchesCount = !0, o = !0), typeof i < "u" && (I.equalsRange(this._currentMatch, i) || (this._currentMatch = i, n.currentMatch = !0, o = !0)), o && this._onFindReplaceStateChange.fire(n); } change(e, t, i = !0) { - var d; + var a; const n = { moveCursor: t, updateHistory: i, @@ -74342,11 +74342,11 @@ class U0e extends R { filters: !1 }; let o = !1; - const r = this.isRegex, l = this.wholeWord, a = this.matchCase, c = this.preserveCase; - typeof e.searchString < "u" && this._searchString !== e.searchString && (this._searchString = e.searchString, n.searchString = !0, o = !0), typeof e.replaceString < "u" && this._replaceString !== e.replaceString && (this._replaceString = e.replaceString, n.replaceString = !0, o = !0), typeof e.isRevealed < "u" && this._isRevealed !== e.isRevealed && (this._isRevealed = e.isRevealed, n.isRevealed = !0, o = !0), typeof e.isReplaceRevealed < "u" && this._isReplaceRevealed !== e.isReplaceRevealed && (this._isReplaceRevealed = e.isReplaceRevealed, n.isReplaceRevealed = !0, o = !0), typeof e.isRegex < "u" && (this._isRegex = e.isRegex), typeof e.wholeWord < "u" && (this._wholeWord = e.wholeWord), typeof e.matchCase < "u" && (this._matchCase = e.matchCase), typeof e.preserveCase < "u" && (this._preserveCase = e.preserveCase), typeof e.searchScope < "u" && ((d = e.searchScope) != null && d.every((h) => { + const l = this.isRegex, r = this.wholeWord, c = this.matchCase, d = this.preserveCase; + typeof e.searchString < "u" && this._searchString !== e.searchString && (this._searchString = e.searchString, n.searchString = !0, o = !0), typeof e.replaceString < "u" && this._replaceString !== e.replaceString && (this._replaceString = e.replaceString, n.replaceString = !0, o = !0), typeof e.isRevealed < "u" && this._isRevealed !== e.isRevealed && (this._isRevealed = e.isRevealed, n.isRevealed = !0, o = !0), typeof e.isReplaceRevealed < "u" && this._isReplaceRevealed !== e.isReplaceRevealed && (this._isReplaceRevealed = e.isReplaceRevealed, n.isReplaceRevealed = !0, o = !0), typeof e.isRegex < "u" && (this._isRegex = e.isRegex), typeof e.wholeWord < "u" && (this._wholeWord = e.wholeWord), typeof e.matchCase < "u" && (this._matchCase = e.matchCase), typeof e.preserveCase < "u" && (this._preserveCase = e.preserveCase), typeof e.searchScope < "u" && ((a = e.searchScope) != null && a.every((h) => { var u; - return (u = this._searchScope) == null ? void 0 : u.some((g) => !M.equalsRange(g, h)); - }) || (this._searchScope = e.searchScope, n.searchScope = !0, o = !0)), typeof e.loop < "u" && this._loop !== e.loop && (this._loop = e.loop, n.loop = !0, o = !0), typeof e.isSearching < "u" && this._isSearching !== e.isSearching && (this._isSearching = e.isSearching, n.isSearching = !0, o = !0), typeof e.filters < "u" && (this._filters ? this._filters.update(e.filters) : this._filters = e.filters, n.filters = !0, o = !0), this._isRegexOverride = typeof e.isRegexOverride < "u" ? e.isRegexOverride : 0, this._wholeWordOverride = typeof e.wholeWordOverride < "u" ? e.wholeWordOverride : 0, this._matchCaseOverride = typeof e.matchCaseOverride < "u" ? e.matchCaseOverride : 0, this._preserveCaseOverride = typeof e.preserveCaseOverride < "u" ? e.preserveCaseOverride : 0, r !== this.isRegex && (o = !0, n.isRegex = !0), l !== this.wholeWord && (o = !0, n.wholeWord = !0), a !== this.matchCase && (o = !0, n.matchCase = !0), c !== this.preserveCase && (o = !0, n.preserveCase = !0), o && this._onFindReplaceStateChange.fire(n); + return (u = this._searchScope) == null ? void 0 : u.some((m) => !I.equalsRange(m, h)); + }) || (this._searchScope = e.searchScope, n.searchScope = !0, o = !0)), typeof e.loop < "u" && this._loop !== e.loop && (this._loop = e.loop, n.loop = !0, o = !0), typeof e.isSearching < "u" && this._isSearching !== e.isSearching && (this._isSearching = e.isSearching, n.isSearching = !0, o = !0), typeof e.filters < "u" && (this._filters ? this._filters.update(e.filters) : this._filters = e.filters, n.filters = !0, o = !0), this._isRegexOverride = typeof e.isRegexOverride < "u" ? e.isRegexOverride : 0, this._wholeWordOverride = typeof e.wholeWordOverride < "u" ? e.wholeWordOverride : 0, this._matchCaseOverride = typeof e.matchCaseOverride < "u" ? e.matchCaseOverride : 0, this._preserveCaseOverride = typeof e.preserveCaseOverride < "u" ? e.preserveCaseOverride : 0, l !== this.isRegex && (o = !0, n.isRegex = !0), r !== this.wholeWord && (o = !0, n.wholeWord = !0), c !== this.matchCase && (o = !0, n.matchCase = !0), d !== this.preserveCase && (o = !0, n.preserveCase = !0), o && this._onFindReplaceStateChange.fire(n); } canNavigateBack() { return this.canNavigateInLoop() || this.matchesPosition !== 1; @@ -74355,41 +74355,41 @@ class U0e extends R { return this.canNavigateInLoop() || this.matchesPosition < this.matchesCount; } canNavigateInLoop() { - return this._loop || this.matchesCount >= Kd; + return this._loop || this.matchesCount >= $a; } } -const K0e = p("defaultLabel", "input"), Q0e = p("label.preserveCaseToggle", "Preserve Case"); -class j0e extends y0 { +const Ffe = p("defaultLabel", "input"), zfe = p("label.preserveCaseToggle", "Preserve Case"); +class Afe extends L0 { constructor(e) { super({ // TODO: does this need its own icon? icon: te.preserveCase, - title: Q0e + e.appendTitle, + title: zfe + e.appendTitle, isChecked: e.isChecked, - hoverDelegate: e.hoverDelegate ?? As("element"), + hoverDelegate: e.hoverDelegate ?? Is("element"), inputActiveOptionBorder: e.inputActiveOptionBorder, inputActiveOptionForeground: e.inputActiveOptionForeground, inputActiveOptionBackground: e.inputActiveOptionBackground }); } } -class q0e extends Ko { +class Kfe extends jo { constructor(e, t, i, n) { - super(), this._showOptionButtons = i, this.fixFocusOnOptionClickEnabled = !0, this.cachedOptionsWidth = 0, this._onDidOptionChange = this._register(new k()), this.onDidOptionChange = this._onDidOptionChange.event, this._onKeyDown = this._register(new k()), this.onKeyDown = this._onKeyDown.event, this._onMouseDown = this._register(new k()), this._onInput = this._register(new k()), this._onKeyUp = this._register(new k()), this._onPreserveCaseKeyDown = this._register(new k()), this.onPreserveCaseKeyDown = this._onPreserveCaseKeyDown.event, this.contextViewProvider = t, this.placeholder = n.placeholder || "", this.validation = n.validation, this.label = n.label || K0e; - const o = n.appendPreserveCaseLabel || "", r = n.history || [], l = !!n.flexibleHeight, a = !!n.flexibleWidth, c = n.flexibleMaxHeight; - this.domNode = document.createElement("div"), this.domNode.classList.add("monaco-findInput"), this.inputBox = this._register(new EQ(this.domNode, this.contextViewProvider, { + super(), this._showOptionButtons = i, this.fixFocusOnOptionClickEnabled = !0, this.cachedOptionsWidth = 0, this._onDidOptionChange = this._register(new k()), this.onDidOptionChange = this._onDidOptionChange.event, this._onKeyDown = this._register(new k()), this.onKeyDown = this._onKeyDown.event, this._onMouseDown = this._register(new k()), this._onInput = this._register(new k()), this._onKeyUp = this._register(new k()), this._onPreserveCaseKeyDown = this._register(new k()), this.onPreserveCaseKeyDown = this._onPreserveCaseKeyDown.event, this.contextViewProvider = t, this.placeholder = n.placeholder || "", this.validation = n.validation, this.label = n.label || Ffe; + const o = n.appendPreserveCaseLabel || "", l = n.history || [], r = !!n.flexibleHeight, c = !!n.flexibleWidth, d = n.flexibleMaxHeight; + this.domNode = document.createElement("div"), this.domNode.classList.add("monaco-findInput"), this.inputBox = this._register(new W4(this.domNode, this.contextViewProvider, { ariaLabel: this.label || "", placeholder: this.placeholder || "", validationOptions: { validation: this.validation }, - history: r, + history: l, showHistoryHint: n.showHistoryHint, - flexibleHeight: l, - flexibleWidth: a, - flexibleMaxHeight: c, + flexibleHeight: r, + flexibleWidth: c, + flexibleMaxHeight: d, inputBoxStyles: n.inputBoxStyles - })), this.preserveCase = this._register(new j0e({ + })), this.preserveCase = this._register(new Afe({ appendTitle: o, isChecked: !1, ...n.toggleStyles @@ -74398,7 +74398,7 @@ class q0e extends Ko { })), this._register(this.preserveCase.onKeyDown((u) => { this._onPreserveCaseKeyDown.fire(u); })), this._showOptionButtons ? this.cachedOptionsWidth = this.preserveCase.width() : this.cachedOptionsWidth = 0; - const d = [this.preserveCase.domNode]; + const a = [this.preserveCase.domNode]; this.onkeydown(this.domNode, (u) => { if (u.equals( 15 @@ -74410,19 +74410,19 @@ class q0e extends Ko { 9 /* KeyCode.Escape */ )) { - const g = d.indexOf(this.domNode.ownerDocument.activeElement); - if (g >= 0) { - let m = -1; + const m = a.indexOf(this.domNode.ownerDocument.activeElement); + if (m >= 0) { + let b = -1; u.equals( 17 /* KeyCode.RightArrow */ - ) ? m = (g + 1) % d.length : u.equals( + ) ? b = (m + 1) % a.length : u.equals( 15 /* KeyCode.LeftArrow */ - ) && (g === 0 ? m = d.length - 1 : m = g - 1), u.equals( + ) && (m === 0 ? b = a.length - 1 : b = m - 1), u.equals( 9 /* KeyCode.Escape */ - ) ? (d[g].blur(), this.inputBox.focus()) : m >= 0 && d[m].focus(), tt.stop(u, !0); + ) ? (a[m].blur(), this.inputBox.focus()) : b >= 0 && a[b].focus(), tt.stop(u, !0); } } }); @@ -74464,30 +74464,30 @@ class q0e extends Ko { super.dispose(); } } -var fj = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var q4 = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, bj = function(s, e) { +}, $4 = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const G5 = new ae("suggestWidgetVisible", !1, p("suggestWidgetVisible", "Whether suggestion are visible")), R5 = "historyNavigationWidgetFocus", yj = "historyNavigationForwardsEnabled", wj = "historyNavigationBackwardsEnabled"; -let Xc; -const ES = []; -function Cj(s, e) { - if (ES.includes(e)) +const rE = new ce("suggestWidgetVisible", !1, p("suggestWidgetVisible", "Whether suggestion are visible")), cE = "historyNavigationWidgetFocus", e7 = "historyNavigationForwardsEnabled", t7 = "historyNavigationBackwardsEnabled"; +let Ad; +const j1 = []; +function i7(s, e) { + if (j1.includes(e)) throw new Error("Cannot register the same widget multiple times"); - ES.push(e); - const t = new U(), i = new ae(R5, !1).bindTo(s), n = new ae(yj, !0).bindTo(s), o = new ae(wj, !0).bindTo(s), r = () => { - i.set(!0), Xc = e; - }, l = () => { - i.set(!1), Xc === e && (Xc = void 0); + j1.push(e); + const t = new _(), i = new ce(cE, !1).bindTo(s), n = new ce(e7, !0).bindTo(s), o = new ce(t7, !0).bindTo(s), l = () => { + i.set(!0), Ad = e; + }, r = () => { + i.set(!1), Ad === e && (Ad = void 0); }; - return k_(e.element) && r(), t.add(e.onDidFocus(() => r())), t.add(e.onDidBlur(() => l())), t.add(Ce(() => { - ES.splice(ES.indexOf(e), 1), l(); + return OS(e.element) && l(), t.add(e.onDidFocus(() => l())), t.add(e.onDidBlur(() => r())), t.add(We(() => { + j1.splice(j1.indexOf(e), 1), r(); })), { historyNavigationForwardsEnablement: n, historyNavigationBackwardsEnablement: o, @@ -74496,85 +74496,85 @@ function Cj(s, e) { } }; } -let VD = class extends XQ { +let t9 = class extends G4 { constructor(e, t, i, n) { super(e, t, i); const o = this._register(n.createScoped(this.inputBox.element)); - this._register(Cj(o, this.inputBox)); + this._register(i7(o, this.inputBox)); } }; -VD = fj([ - bj(3, _e) -], VD); -let kD = class extends q0e { +t9 = q4([ + $4(3, xe) +], t9); +let i9 = class extends Kfe { constructor(e, t, i, n, o = !1) { super(e, t, o, i); - const r = this._register(n.createScoped(this.inputBox.element)); - this._register(Cj(r, this.inputBox)); + const l = this._register(n.createScoped(this.inputBox.element)); + this._register(i7(l, this.inputBox)); } }; -kD = fj([ - bj(3, _e) -], kD); -ws.registerCommandAndKeybindingRule({ +i9 = q4([ + $4(3, xe) +], i9); +Gs.registerCommandAndKeybindingRule({ id: "history.showPrevious", weight: 200, - when: H.and(H.has(R5), H.equals(wj, !0), H.not("isComposing"), G5.isEqualTo(!1)), + when: P.and(P.has(cE), P.equals(t7, !0), P.not("isComposing"), rE.isEqualTo(!1)), primary: 16, secondary: [ 528 /* KeyCode.UpArrow */ ], handler: (s) => { - Xc == null || Xc.showPreviousValue(); + Ad == null || Ad.showPreviousValue(); } }); -ws.registerCommandAndKeybindingRule({ +Gs.registerCommandAndKeybindingRule({ id: "history.showNext", weight: 200, - when: H.and(H.has(R5), H.equals(yj, !0), H.not("isComposing"), G5.isEqualTo(!1)), + when: P.and(P.has(cE), P.equals(e7, !0), P.not("isComposing"), rE.isEqualTo(!1)), primary: 18, secondary: [ 530 /* KeyCode.DownArrow */ ], handler: (s) => { - Xc == null || Xc.showNextValue(); + Ad == null || Ad.showNextValue(); } }); -function D3(s) { +function sK(s) { var e, t; return ((e = s.lookupKeybinding("history.showPrevious")) == null ? void 0 : e.getElectronAccelerator()) === "Up" && ((t = s.lookupKeybinding("history.showNext")) == null ? void 0 : t.getElectronAccelerator()) === "Down"; } -const V3 = Bt("find-collapsed", te.chevronRight, p("findCollapsedIcon", "Icon to indicate that the editor find widget is collapsed.")), k3 = Bt("find-expanded", te.chevronDown, p("findExpandedIcon", "Icon to indicate that the editor find widget is expanded.")), $0e = Bt("find-selection", te.selection, p("findSelectionIcon", "Icon for 'Find in Selection' in the editor find widget.")), eye = Bt("find-replace", te.replace, p("findReplaceIcon", "Icon for 'Replace' in the editor find widget.")), tye = Bt("find-replace-all", te.replaceAll, p("findReplaceAllIcon", "Icon for 'Replace All' in the editor find widget.")), iye = Bt("find-previous-match", te.arrowUp, p("findPreviousMatchIcon", "Icon for 'Find Previous' in the editor find widget.")), nye = Bt("find-next-match", te.arrowDown, p("findNextMatchIcon", "Icon for 'Find Next' in the editor find widget.")), sye = p("label.findDialog", "Find / Replace"), oye = p("label.find", "Find"), rye = p("placeholder.find", "Find"), lye = p("label.previousMatchButton", "Previous Match"), aye = p("label.nextMatchButton", "Next Match"), cye = p("label.toggleSelectionFind", "Find in Selection"), dye = p("label.closeButton", "Close"), hye = p("label.replace", "Replace"), uye = p("placeholder.replace", "Replace"), gye = p("label.replaceButton", "Replace"), mye = p("label.replaceAllButton", "Replace All"), pye = p("label.toggleReplaceButton", "Toggle Replace"), fye = p("title.matchesCountLimit", "Only the first {0} results are highlighted, but all find operations work on the entire text.", Kd), bye = p("label.matchesLocation", "{0} of {1}"), G3 = p("label.noResults", "No results"), Ul = 419, yye = 275, wye = yye - 54; -let O0 = 69; -const Cye = 33, R3 = "ctrlEnterReplaceAll.windows.donotask", E3 = qe ? 256 : 2048; -class VW { +const oK = Kt("find-collapsed", te.chevronRight, p("findCollapsedIcon", "Icon to indicate that the editor find widget is collapsed.")), lK = Kt("find-expanded", te.chevronDown, p("findExpandedIcon", "Icon to indicate that the editor find widget is expanded.")), Ufe = Kt("find-selection", te.selection, p("findSelectionIcon", "Icon for 'Find in Selection' in the editor find widget.")), Pfe = Kt("find-replace", te.replace, p("findReplaceIcon", "Icon for 'Replace' in the editor find widget.")), Bfe = Kt("find-replace-all", te.replaceAll, p("findReplaceAllIcon", "Icon for 'Replace All' in the editor find widget.")), _fe = Kt("find-previous-match", te.arrowUp, p("findPreviousMatchIcon", "Icon for 'Find Previous' in the editor find widget.")), Qfe = Kt("find-next-match", te.arrowDown, p("findNextMatchIcon", "Icon for 'Find Next' in the editor find widget.")), Ofe = p("label.findDialog", "Find / Replace"), jfe = p("label.find", "Find"), qfe = p("placeholder.find", "Find"), $fe = p("label.previousMatchButton", "Previous Match"), eye = p("label.nextMatchButton", "Next Match"), tye = p("label.toggleSelectionFind", "Find in Selection"), iye = p("label.closeButton", "Close"), nye = p("label.replace", "Replace"), sye = p("placeholder.replace", "Replace"), oye = p("label.replaceButton", "Replace"), lye = p("label.replaceAllButton", "Replace All"), rye = p("label.toggleReplaceButton", "Toggle Replace"), cye = p("title.matchesCountLimit", "Only the first {0} results are highlighted, but all find operations work on the entire text.", $a), dye = p("label.matchesLocation", "{0} of {1}"), rK = p("label.noResults", "No results"), qr = 419, aye = 275, hye = aye - 54; +let q0 = 69; +const uye = 33, cK = "ctrlEnterReplaceAll.windows.donotask", dK = qe ? 256 : 2048; +class OR { constructor(e) { - this.afterLineNumber = e, this.heightInPx = Cye, this.suppressMouseDown = !1, this.domNode = document.createElement("div"), this.domNode.className = "dock-find-viewzone"; + this.afterLineNumber = e, this.heightInPx = uye, this.suppressMouseDown = !1, this.domNode = document.createElement("div"), this.domNode.className = "dock-find-viewzone"; } } -function X3(s, e, t) { +function aK(s, e, t) { const i = !!e.match(/\n/); if (t && i && t.selectionStart > 0) { s.stopPropagation(); return; } } -function F3(s, e, t) { +function hK(s, e, t) { const i = !!e.match(/\n/); if (t && i && t.selectionEnd < t.value.length) { s.stopPropagation(); return; } } -const RZ = class RZ extends Ko { - constructor(e, t, i, n, o, r, l, a, c, d) { - super(), this._hoverService = d, this._cachedHeight = null, this._revealTimeouts = [], this._codeEditor = e, this._controller = t, this._state = i, this._contextViewProvider = n, this._keybindingService = o, this._contextKeyService = r, this._storageService = a, this._notificationService = c, this._ctrlEnterReplaceAllWarningPrompted = !!a.getBoolean( - R3, +const q2 = class q2 extends jo { + constructor(e, t, i, n, o, l, r, c, d, a) { + super(), this._hoverService = a, this._cachedHeight = null, this._revealTimeouts = [], this._codeEditor = e, this._controller = t, this._state = i, this._contextViewProvider = n, this._keybindingService = o, this._contextKeyService = l, this._storageService = c, this._notificationService = d, this._ctrlEnterReplaceAllWarningPrompted = !!c.getBoolean( + cK, 0 /* StorageScope.PROFILE */ - ), this._isVisible = !1, this._isReplaceVisible = !1, this._ignoreChangeEvent = !1, this._updateHistoryDelayer = new fr(500), this._register(Ce(() => this._updateHistoryDelayer.cancel())), this._register(this._state.onFindReplaceStateChange((h) => this._onStateChanged(h))), this._buildDomNode(), this._updateButtons(), this._tryUpdateWidgetWidth(), this._findInput.inputBox.layout(), this._register(this._codeEditor.onDidChangeConfiguration((h) => { + ), this._isVisible = !1, this._isReplaceVisible = !1, this._ignoreChangeEvent = !1, this._updateHistoryDelayer = new yl(500), this._register(We(() => this._updateHistoryDelayer.cancel())), this._register(this._state.onFindReplaceStateChange((h) => this._onStateChanged(h))), this._buildDomNode(), this._updateButtons(), this._tryUpdateWidgetWidth(), this._findInput.inputBox.layout(), this._register(this._codeEditor.onDidChangeConfiguration((h) => { if (h.hasChanged( 92 /* EditorOption.readOnly */ @@ -74596,11 +74596,11 @@ const RZ = class RZ extends Ko { /* EditorOption.find */ ).loop; this._state.change({ loop: u }, !1); - const g = this._codeEditor.getOption( + const m = this._codeEditor.getOption( 41 /* EditorOption.find */ ).addExtraSpaceOnTop; - g && !this._viewZone && (this._viewZone = new VW(0), this._showViewZone()), !g && this._viewZone && this._removeViewZone(); + m && !this._viewZone && (this._viewZone = new OR(0), this._showViewZone()), !m && this._viewZone && this._removeViewZone(); } })), this.updateAccessibilitySupport(), this._register(this._codeEditor.onDidChangeCursorSelection(() => { this._isVisible && this._updateToggleSelectionFindButton(); @@ -74609,18 +74609,18 @@ const RZ = class RZ extends Ko { const h = await this._controller.getGlobalBufferTerm(); h && h !== this._state.searchString && (this._state.change({ searchString: h }, !1), this._findInput.select()); } - })), this._findInputFocused = UI.bindTo(r), this._findFocusTracker = this._register(vl(this._findInput.inputBox.inputElement)), this._register(this._findFocusTracker.onDidFocus(() => { + })), this._findInputFocused = dC.bindTo(l), this._findFocusTracker = this._register(kr(this._findInput.inputBox.inputElement)), this._register(this._findFocusTracker.onDidFocus(() => { this._findInputFocused.set(!0), this._updateSearchScope(); })), this._register(this._findFocusTracker.onDidBlur(() => { this._findInputFocused.set(!1); - })), this._replaceInputFocused = k5.bindTo(r), this._replaceFocusTracker = this._register(vl(this._replaceInput.inputBox.inputElement)), this._register(this._replaceFocusTracker.onDidFocus(() => { + })), this._replaceInputFocused = lE.bindTo(l), this._replaceFocusTracker = this._register(kr(this._replaceInput.inputBox.inputElement)), this._register(this._replaceFocusTracker.onDidFocus(() => { this._replaceInputFocused.set(!0), this._updateSearchScope(); })), this._register(this._replaceFocusTracker.onDidBlur(() => { this._replaceInputFocused.set(!1); })), this._codeEditor.addOverlayWidget(this), this._codeEditor.getOption( 41 /* EditorOption.find */ - ).addExtraSpaceOnTop && (this._viewZone = new VW(0)), this._register(this._codeEditor.onDidChangeModel(() => { + ).addExtraSpaceOnTop && (this._viewZone = new OR(0)), this._register(this._codeEditor.onDidChangeModel(() => { this._isVisible && (this._viewZoneId = void 0); })), this._register(this._codeEditor.onDidScrollChange((h) => { if (h.scrollTopChanged) { @@ -74634,7 +74634,7 @@ const RZ = class RZ extends Ko { } // ----- IOverlayWidget API getId() { - return RZ.ID; + return q2.ID; } getDomNode() { return this._domNode; @@ -74658,34 +74658,34 @@ const RZ = class RZ extends Ko { if (e.replaceString && (this._replaceInput.inputBox.value = this._state.replaceString), e.isRevealed && (this._state.isRevealed ? this._reveal() : this._hide(!0)), e.isReplaceRevealed && (this._state.isReplaceRevealed ? !this._codeEditor.getOption( 92 /* EditorOption.readOnly */ - ) && !this._isReplaceVisible && (this._isReplaceVisible = !0, this._replaceInput.width = $s(this._findInput.domNode), this._updateButtons(), this._replaceInput.inputBox.layout()) : this._isReplaceVisible && (this._isReplaceVisible = !1, this._updateButtons())), (e.isRevealed || e.isReplaceRevealed) && (this._state.isRevealed || this._state.isReplaceRevealed) && this._tryUpdateHeight() && this._showViewZone(), e.isRegex && this._findInput.setRegex(this._state.isRegex), e.wholeWord && this._findInput.setWholeWords(this._state.wholeWord), e.matchCase && this._findInput.setCaseSensitive(this._state.matchCase), e.preserveCase && this._replaceInput.setPreserveCase(this._state.preserveCase), e.searchScope && (this._state.searchScope ? this._toggleSelectionFind.checked = !0 : this._toggleSelectionFind.checked = !1, this._updateToggleSelectionFindButton()), e.searchString || e.matchesCount || e.matchesPosition) { + ) && !this._isReplaceVisible && (this._isReplaceVisible = !0, this._replaceInput.width = to(this._findInput.domNode), this._updateButtons(), this._replaceInput.inputBox.layout()) : this._isReplaceVisible && (this._isReplaceVisible = !1, this._updateButtons())), (e.isRevealed || e.isReplaceRevealed) && (this._state.isRevealed || this._state.isReplaceRevealed) && this._tryUpdateHeight() && this._showViewZone(), e.isRegex && this._findInput.setRegex(this._state.isRegex), e.wholeWord && this._findInput.setWholeWords(this._state.wholeWord), e.matchCase && this._findInput.setCaseSensitive(this._state.matchCase), e.preserveCase && this._replaceInput.setPreserveCase(this._state.preserveCase), e.searchScope && (this._state.searchScope ? this._toggleSelectionFind.checked = !0 : this._toggleSelectionFind.checked = !1, this._updateToggleSelectionFindButton()), e.searchString || e.matchesCount || e.matchesPosition) { const t = this._state.searchString.length > 0 && this._state.matchesCount === 0; this._domNode.classList.toggle("no-results", t), this._updateMatchesCount(), this._updateButtons(); } (e.searchString || e.currentMatch) && this._layoutViewZone(), e.updateHistory && this._delayedUpdateHistory(), e.loop && this._updateButtons(); } _delayedUpdateHistory() { - this._updateHistoryDelayer.trigger(this._updateHistory.bind(this)).then(void 0, De); + this._updateHistoryDelayer.trigger(this._updateHistory.bind(this)).then(void 0, Me); } _updateHistory() { this._state.searchString && this._findInput.inputBox.addToHistory(), this._state.replaceString && this._replaceInput.inputBox.addToHistory(); } _updateMatchesCount() { var t; - this._matchesCount.style.minWidth = O0 + "px", this._state.matchesCount >= Kd ? this._matchesCount.title = fye : this._matchesCount.title = "", (t = this._matchesCount.firstChild) == null || t.remove(); + this._matchesCount.style.minWidth = q0 + "px", this._state.matchesCount >= $a ? this._matchesCount.title = cye : this._matchesCount.title = "", (t = this._matchesCount.firstChild) == null || t.remove(); let e; if (this._state.matchesCount > 0) { let i = String(this._state.matchesCount); - this._state.matchesCount >= Kd && (i += "+"); + this._state.matchesCount >= $a && (i += "+"); let n = String(this._state.matchesPosition); - n === "0" && (n = "?"), e = rb(bye, n, i); + n === "0" && (n = "?"), e = uZ(dye, n, i); } else - e = G3; - this._matchesCount.appendChild(document.createTextNode(e)), bs(this._getAriaLabel(e, this._state.currentMatch, this._state.searchString)), O0 = Math.max(O0, this._matchesCount.clientWidth); + e = rK; + this._matchesCount.appendChild(document.createTextNode(e)), ys(this._getAriaLabel(e, this._state.currentMatch, this._state.searchString)), q0 = Math.max(q0, this._matchesCount.clientWidth); } // ----- actions _getAriaLabel(e, t, i) { - if (e === G3) + if (e === rK) return i === "" ? p("ariaSearchNoResultEmpty", "{0} found", e) : p("ariaSearchNoResult", "{0} found for '{1}'", e, i); if (t) { const n = p("ariaSearchNoResultWithLineNum", "{0} found for '{1}', at {2}", e, i, t.startLineNumber + ":" + t.startColumn), o = this._codeEditor.getModel(); @@ -74745,13 +74745,13 @@ const RZ = class RZ extends Ko { ).seedSearchStringFromSelection && e) { const i = this._codeEditor.getDomNode(); if (i) { - const n = yi(i), o = this._codeEditor.getScrolledVisiblePosition(e.getStartPosition()), r = n.left + (o ? o.left : 0), l = o ? o.top : 0; - if (this._viewZone && l < this._viewZone.heightInPx) { + const n = yi(i), o = this._codeEditor.getScrolledVisiblePosition(e.getStartPosition()), l = n.left + (o ? o.left : 0), r = o ? o.top : 0; + if (this._viewZone && r < this._viewZone.heightInPx) { e.endLineNumber > e.startLineNumber && (t = !1); - const a = eJ(this._domNode).left; - r > a && (t = !1); - const c = this._codeEditor.getScrolledVisiblePosition(e.getEndPosition()); - n.left + (c ? c.left : 0) > a && (t = !1); + const c = vB(this._domNode).left; + l > c && (t = !1); + const d = this._codeEditor.getScrolledVisiblePosition(e.getEndPosition()); + n.left + (d ? d.left : 0) > c && (t = !1); } } } @@ -74784,15 +74784,15 @@ const RZ = class RZ extends Ko { /* EditorOption.find */ ).addExtraSpaceOnTop) return; - this._viewZone === void 0 && (this._viewZone = new VW(0)); + this._viewZone === void 0 && (this._viewZone = new OR(0)); const i = this._viewZone; this._codeEditor.changeViewZones((n) => { if (this._viewZoneId !== void 0) { const o = this._getHeight(); if (o === i.heightInPx) return; - const r = o - i.heightInPx; - i.heightInPx = o, n.layoutZone(this._viewZoneId), e && this._codeEditor.setScrollTop(this._codeEditor.getScrollTop() + r); + const l = o - i.heightInPx; + i.heightInPx = o, n.layoutZone(this._viewZoneId), e && this._codeEditor.setScrollTop(this._codeEditor.getScrollTop() + l); return; } else { let o = this._getHeight(); @@ -74819,15 +74819,15 @@ const RZ = class RZ extends Ko { return; } else this._domNode.classList.contains("hiddenEditor") && this._domNode.classList.remove("hiddenEditor"); const i = e.width, n = e.minimap.minimapWidth; - let o = !1, r = !1, l = !1; - if (this._resized && $s(this._domNode) > Ul) { - this._domNode.style.maxWidth = `${i - 28 - n - 15}px`, this._replaceInput.width = $s(this._findInput.domNode); + let o = !1, l = !1, r = !1; + if (this._resized && to(this._domNode) > qr) { + this._domNode.style.maxWidth = `${i - 28 - n - 15}px`, this._replaceInput.width = to(this._findInput.domNode); return; } - if (Ul + 28 + n >= i && (r = !0), Ul + 28 + n - O0 >= i && (l = !0), Ul + 28 + n - O0 >= i + 50 && (o = !0), this._domNode.classList.toggle("collapsed-find-widget", o), this._domNode.classList.toggle("narrow-find-widget", l), this._domNode.classList.toggle("reduced-find-widget", r), !l && !o && (this._domNode.style.maxWidth = `${i - 28 - n - 15}px`), this._findInput.layout({ collapsedFindWidget: o, narrowFindWidget: l, reducedFindWidget: r }), this._resized) { - const a = this._findInput.inputBox.element.clientWidth; - a > 0 && (this._replaceInput.width = a); - } else this._isReplaceVisible && (this._replaceInput.width = $s(this._findInput.domNode)); + if (qr + 28 + n >= i && (l = !0), qr + 28 + n - q0 >= i && (r = !0), qr + 28 + n - q0 >= i + 50 && (o = !0), this._domNode.classList.toggle("collapsed-find-widget", o), this._domNode.classList.toggle("narrow-find-widget", r), this._domNode.classList.toggle("reduced-find-widget", l), !r && !o && (this._domNode.style.maxWidth = `${i - 28 - n - 15}px`), this._findInput.layout({ collapsedFindWidget: o, narrowFindWidget: r, reducedFindWidget: l }), this._resized) { + const c = this._findInput.inputBox.element.clientWidth; + c > 0 && (this._replaceInput.width = c); + } else this._isReplaceVisible && (this._replaceInput.width = to(this._findInput.domNode)); } _getHeight() { let e = 0; @@ -74853,7 +74853,7 @@ const RZ = class RZ extends Ko { e.map((t) => { t.endColumn === 1 && t.endLineNumber > t.startLineNumber && (t = t.setEndPosition(t.endLineNumber - 1, this._codeEditor.getModel().getLineMaxColumn(t.endLineNumber - 1))); const i = this._state.currentMatch; - return t.startLineNumber !== t.endLineNumber && !M.equalsRange(t, i) ? t : null; + return t.startLineNumber !== t.endLineNumber && !I.equalsRange(t, i) ? t : null; }).filter((t) => !!t), e.length && this._state.change({ searchScope: e }, !0); } } @@ -74862,7 +74862,7 @@ const RZ = class RZ extends Ko { } _onFindInputKeyDown(e) { if (e.equals( - E3 | 3 + dK | 3 /* KeyCode.Enter */ )) if (this._keybindingService.dispatchEvent(e, e.target)) { @@ -74891,24 +74891,24 @@ const RZ = class RZ extends Ko { 16 /* KeyCode.UpArrow */ )) - return X3(e, this._findInput.getValue(), this._findInput.domNode.querySelector("textarea")); + return aK(e, this._findInput.getValue(), this._findInput.domNode.querySelector("textarea")); if (e.equals( 18 /* KeyCode.DownArrow */ )) - return F3(e, this._findInput.getValue(), this._findInput.domNode.querySelector("textarea")); + return hK(e, this._findInput.getValue(), this._findInput.domNode.querySelector("textarea")); } _onReplaceInputKeyDown(e) { if (e.equals( - E3 | 3 + dK | 3 /* KeyCode.Enter */ )) if (this._keybindingService.dispatchEvent(e, e.target)) { e.preventDefault(); return; } else { - kn && Na && !this._ctrlEnterReplaceAllWarningPrompted && (this._notificationService.info(p("ctrlEnter.keybindingChanged", "Ctrl+Enter now inserts line break instead of replacing all. You can modify the keybinding for editor.action.replaceAll to override this behavior.")), this._ctrlEnterReplaceAllWarningPrompted = !0, this._storageService.store( - R3, + Jn && Mc && !this._ctrlEnterReplaceAllWarningPrompted && (this._notificationService.info(p("ctrlEnter.keybindingChanged", "Ctrl+Enter now inserts line break instead of replacing all. You can modify the keybinding for editor.action.replaceAll to override this behavior.")), this._ctrlEnterReplaceAllWarningPrompted = !0, this._storageService.store( + cK, !0, 0, 0 @@ -74942,12 +74942,12 @@ const RZ = class RZ extends Ko { 16 /* KeyCode.UpArrow */ )) - return X3(e, this._replaceInput.inputBox.value, this._replaceInput.inputBox.element.querySelector("textarea")); + return aK(e, this._replaceInput.inputBox.value, this._replaceInput.inputBox.element.querySelector("textarea")); if (e.equals( 18 /* KeyCode.DownArrow */ )) - return F3(e, this._replaceInput.inputBox.value, this._replaceInput.inputBox.element.querySelector("textarea")); + return hK(e, this._replaceInput.inputBox.value, this._replaceInput.inputBox.element.querySelector("textarea")); } // ----- sash getVerticalSashLeft(e) { @@ -74959,18 +74959,18 @@ const RZ = class RZ extends Ko { return t ? ` (${t.getLabel()})` : ""; } _buildDomNode() { - this._findInput = this._register(new VD(null, this._contextViewProvider, { - width: wye, - label: oye, - placeholder: rye, - appendCaseSensitiveLabel: this._keybindingLabelFor(Ft.ToggleCaseSensitiveCommand), - appendWholeWordsLabel: this._keybindingLabelFor(Ft.ToggleWholeWordCommand), - appendRegexLabel: this._keybindingLabelFor(Ft.ToggleRegexCommand), - validation: (d) => { - if (d.length === 0 || !this._findInput.getRegex()) + this._findInput = this._register(new t9(null, this._contextViewProvider, { + width: hye, + label: jfe, + placeholder: qfe, + appendCaseSensitiveLabel: this._keybindingLabelFor(Dt.ToggleCaseSensitiveCommand), + appendWholeWordsLabel: this._keybindingLabelFor(Dt.ToggleWholeWordCommand), + appendRegexLabel: this._keybindingLabelFor(Dt.ToggleRegexCommand), + validation: (a) => { + if (a.length === 0 || !this._findInput.getRegex()) return null; try { - return new RegExp(d, "gu"), null; + return new RegExp(a, "gu"), null; } catch (h) { return { content: h.message }; } @@ -74979,10 +74979,10 @@ const RZ = class RZ extends Ko { flexibleWidth: !0, flexibleMaxHeight: 118, showCommonFindToggles: !0, - showHistoryHint: () => D3(this._keybindingService), - inputBoxStyles: hx, - toggleStyles: dx - }, this._contextKeyService)), this._findInput.setRegex(!!this._state.isRegex), this._findInput.setCaseSensitive(!!this._state.matchCase), this._findInput.setWholeWords(!!this._state.wholeWord), this._register(this._findInput.onKeyDown((d) => this._onFindInputKeyDown(d))), this._register(this._findInput.inputBox.onDidChange(() => { + showHistoryHint: () => sK(this._keybindingService), + inputBoxStyles: SL, + toggleStyles: IL + }, this._contextKeyService)), this._findInput.setRegex(!!this._state.isRegex), this._findInput.setCaseSensitive(!!this._state.matchCase), this._findInput.setWholeWords(!!this._state.wholeWord), this._register(this._findInput.onKeyDown((a) => this._onFindInputKeyDown(a))), this._register(this._findInput.inputBox.onDidChange(() => { this._ignoreChangeEvent || this._state.change({ searchString: this._findInput.getValue() }, !0); })), this._register(this._findInput.onDidOptionChange(() => { this._state.change({ @@ -74990,144 +74990,144 @@ const RZ = class RZ extends Ko { wholeWord: this._findInput.getWholeWords(), matchCase: this._findInput.getCaseSensitive() }, !0); - })), this._register(this._findInput.onCaseSensitiveKeyDown((d) => { - d.equals( + })), this._register(this._findInput.onCaseSensitiveKeyDown((a) => { + a.equals( 1026 /* KeyCode.Tab */ - ) && this._isReplaceVisible && (this._replaceInput.focus(), d.preventDefault()); - })), this._register(this._findInput.onRegexKeyDown((d) => { - d.equals( + ) && this._isReplaceVisible && (this._replaceInput.focus(), a.preventDefault()); + })), this._register(this._findInput.onRegexKeyDown((a) => { + a.equals( 2 /* KeyCode.Tab */ - ) && this._isReplaceVisible && (this._replaceInput.focusOnPreserve(), d.preventDefault()); - })), this._register(this._findInput.inputBox.onDidHeightChange((d) => { + ) && this._isReplaceVisible && (this._replaceInput.focusOnPreserve(), a.preventDefault()); + })), this._register(this._findInput.inputBox.onDidHeightChange((a) => { this._tryUpdateHeight() && this._showViewZone(); - })), fs && this._register(this._findInput.onMouseDown((d) => this._onFindInputMouseDown(d))), this._matchesCount = document.createElement("div"), this._matchesCount.className = "matchesCount", this._updateMatchesCount(); - const i = this._register(yb()); - this._prevBtn = this._register(new fp({ - label: lye + this._keybindingLabelFor(Ft.PreviousMatchFindAction), - icon: iye, + })), fs && this._register(this._findInput.onMouseDown((a) => this._onFindInputMouseDown(a))), this._matchesCount = document.createElement("div"), this._matchesCount.className = "matchesCount", this._updateMatchesCount(); + const i = this._register(LZ()); + this._prevBtn = this._register(new Gp({ + label: $fe + this._keybindingLabelFor(Dt.PreviousMatchFindAction), + icon: _fe, hoverDelegate: i, onTrigger: () => { - Ed(this._codeEditor.getAction(Ft.PreviousMatchFindAction)).run().then(void 0, De); + za(this._codeEditor.getAction(Dt.PreviousMatchFindAction)).run().then(void 0, Me); } - }, this._hoverService)), this._nextBtn = this._register(new fp({ - label: aye + this._keybindingLabelFor(Ft.NextMatchFindAction), - icon: nye, + }, this._hoverService)), this._nextBtn = this._register(new Gp({ + label: eye + this._keybindingLabelFor(Dt.NextMatchFindAction), + icon: Qfe, hoverDelegate: i, onTrigger: () => { - Ed(this._codeEditor.getAction(Ft.NextMatchFindAction)).run().then(void 0, De); + za(this._codeEditor.getAction(Dt.NextMatchFindAction)).run().then(void 0, Me); } }, this._hoverService)); const n = document.createElement("div"); n.className = "find-part", n.appendChild(this._findInput.domNode); const o = document.createElement("div"); - o.className = "find-actions", n.appendChild(o), o.appendChild(this._matchesCount), o.appendChild(this._prevBtn.domNode), o.appendChild(this._nextBtn.domNode), this._toggleSelectionFind = this._register(new y0({ - icon: $0e, - title: cye + this._keybindingLabelFor(Ft.ToggleSearchScopeCommand), + o.className = "find-actions", n.appendChild(o), o.appendChild(this._matchesCount), o.appendChild(this._prevBtn.domNode), o.appendChild(this._nextBtn.domNode), this._toggleSelectionFind = this._register(new L0({ + icon: Ufe, + title: tye + this._keybindingLabelFor(Dt.ToggleSearchScopeCommand), isChecked: !1, hoverDelegate: i, - inputActiveOptionBackground: de(bC), - inputActiveOptionBorder: de(oI), - inputActiveOptionForeground: de(rI) + inputActiveOptionBackground: ae(NG), + inputActiveOptionBorder: ae(Wx), + inputActiveOptionForeground: ae(Gx) })), this._register(this._toggleSelectionFind.onChange(() => { if (this._toggleSelectionFind.checked) { if (this._codeEditor.hasModel()) { - let d = this._codeEditor.getSelections(); - d = d.map((h) => (h.endColumn === 1 && h.endLineNumber > h.startLineNumber && (h = h.setEndPosition(h.endLineNumber - 1, this._codeEditor.getModel().getLineMaxColumn(h.endLineNumber - 1))), h.isEmpty() ? null : h)).filter((h) => !!h), d.length && this._state.change({ searchScope: d }, !0); + let a = this._codeEditor.getSelections(); + a = a.map((h) => (h.endColumn === 1 && h.endLineNumber > h.startLineNumber && (h = h.setEndPosition(h.endLineNumber - 1, this._codeEditor.getModel().getLineMaxColumn(h.endLineNumber - 1))), h.isEmpty() ? null : h)).filter((h) => !!h), a.length && this._state.change({ searchScope: a }, !0); } } else this._state.change({ searchScope: null }, !0); - })), o.appendChild(this._toggleSelectionFind.domNode), this._closeBtn = this._register(new fp({ - label: dye + this._keybindingLabelFor(Ft.CloseFindWidgetCommand), - icon: i4, + })), o.appendChild(this._toggleSelectionFind.domNode), this._closeBtn = this._register(new Gp({ + label: iye + this._keybindingLabelFor(Dt.CloseFindWidgetCommand), + icon: HO, hoverDelegate: i, onTrigger: () => { this._state.change({ isRevealed: !1, searchScope: null }, !1); }, - onKeyDown: (d) => { - d.equals( + onKeyDown: (a) => { + a.equals( 2 /* KeyCode.Tab */ - ) && this._isReplaceVisible && (this._replaceBtn.isEnabled() ? this._replaceBtn.focus() : this._codeEditor.focus(), d.preventDefault()); + ) && this._isReplaceVisible && (this._replaceBtn.isEnabled() ? this._replaceBtn.focus() : this._codeEditor.focus(), a.preventDefault()); } - }, this._hoverService)), this._replaceInput = this._register(new kD(null, void 0, { - label: hye, - placeholder: uye, - appendPreserveCaseLabel: this._keybindingLabelFor(Ft.TogglePreserveCaseCommand), + }, this._hoverService)), this._replaceInput = this._register(new i9(null, void 0, { + label: nye, + placeholder: sye, + appendPreserveCaseLabel: this._keybindingLabelFor(Dt.TogglePreserveCaseCommand), history: [], flexibleHeight: !0, flexibleWidth: !0, flexibleMaxHeight: 118, - showHistoryHint: () => D3(this._keybindingService), - inputBoxStyles: hx, - toggleStyles: dx - }, this._contextKeyService, !0)), this._replaceInput.setPreserveCase(!!this._state.preserveCase), this._register(this._replaceInput.onKeyDown((d) => this._onReplaceInputKeyDown(d))), this._register(this._replaceInput.inputBox.onDidChange(() => { + showHistoryHint: () => sK(this._keybindingService), + inputBoxStyles: SL, + toggleStyles: IL + }, this._contextKeyService, !0)), this._replaceInput.setPreserveCase(!!this._state.preserveCase), this._register(this._replaceInput.onKeyDown((a) => this._onReplaceInputKeyDown(a))), this._register(this._replaceInput.inputBox.onDidChange(() => { this._state.change({ replaceString: this._replaceInput.inputBox.value }, !1); - })), this._register(this._replaceInput.inputBox.onDidHeightChange((d) => { + })), this._register(this._replaceInput.inputBox.onDidHeightChange((a) => { this._isReplaceVisible && this._tryUpdateHeight() && this._showViewZone(); })), this._register(this._replaceInput.onDidOptionChange(() => { this._state.change({ preserveCase: this._replaceInput.getPreserveCase() }, !0); - })), this._register(this._replaceInput.onPreserveCaseKeyDown((d) => { - d.equals( + })), this._register(this._replaceInput.onPreserveCaseKeyDown((a) => { + a.equals( 2 /* KeyCode.Tab */ - ) && (this._prevBtn.isEnabled() ? this._prevBtn.focus() : this._nextBtn.isEnabled() ? this._nextBtn.focus() : this._toggleSelectionFind.enabled ? this._toggleSelectionFind.focus() : this._closeBtn.isEnabled() && this._closeBtn.focus(), d.preventDefault()); + ) && (this._prevBtn.isEnabled() ? this._prevBtn.focus() : this._nextBtn.isEnabled() ? this._nextBtn.focus() : this._toggleSelectionFind.enabled ? this._toggleSelectionFind.focus() : this._closeBtn.isEnabled() && this._closeBtn.focus(), a.preventDefault()); })); - const r = this._register(yb()); - this._replaceBtn = this._register(new fp({ - label: gye + this._keybindingLabelFor(Ft.ReplaceOneAction), - icon: eye, - hoverDelegate: r, + const l = this._register(LZ()); + this._replaceBtn = this._register(new Gp({ + label: oye + this._keybindingLabelFor(Dt.ReplaceOneAction), + icon: Pfe, + hoverDelegate: l, onTrigger: () => { this._controller.replace(); }, - onKeyDown: (d) => { - d.equals( + onKeyDown: (a) => { + a.equals( 1026 /* KeyCode.Tab */ - ) && (this._closeBtn.focus(), d.preventDefault()); + ) && (this._closeBtn.focus(), a.preventDefault()); } - }, this._hoverService)), this._replaceAllBtn = this._register(new fp({ - label: mye + this._keybindingLabelFor(Ft.ReplaceAllAction), - icon: tye, - hoverDelegate: r, + }, this._hoverService)), this._replaceAllBtn = this._register(new Gp({ + label: lye + this._keybindingLabelFor(Dt.ReplaceAllAction), + icon: Bfe, + hoverDelegate: l, onTrigger: () => { this._controller.replaceAll(); } }, this._hoverService)); - const l = document.createElement("div"); - l.className = "replace-part", l.appendChild(this._replaceInput.domNode); - const a = document.createElement("div"); - a.className = "replace-actions", l.appendChild(a), a.appendChild(this._replaceBtn.domNode), a.appendChild(this._replaceAllBtn.domNode), this._toggleReplaceBtn = this._register(new fp({ - label: pye, + const r = document.createElement("div"); + r.className = "replace-part", r.appendChild(this._replaceInput.domNode); + const c = document.createElement("div"); + c.className = "replace-actions", r.appendChild(c), c.appendChild(this._replaceBtn.domNode), c.appendChild(this._replaceAllBtn.domNode), this._toggleReplaceBtn = this._register(new Gp({ + label: rye, className: "codicon toggle left", onTrigger: () => { - this._state.change({ isReplaceRevealed: !this._isReplaceVisible }, !1), this._isReplaceVisible && (this._replaceInput.width = $s(this._findInput.domNode), this._replaceInput.inputBox.layout()), this._showViewZone(); + this._state.change({ isReplaceRevealed: !this._isReplaceVisible }, !1), this._isReplaceVisible && (this._replaceInput.width = to(this._findInput.domNode), this._replaceInput.inputBox.layout()), this._showViewZone(); } - }, this._hoverService)), this._toggleReplaceBtn.setExpanded(this._isReplaceVisible), this._domNode = document.createElement("div"), this._domNode.className = "editor-widget find-widget", this._domNode.setAttribute("aria-hidden", "true"), this._domNode.ariaLabel = sye, this._domNode.role = "dialog", this._domNode.style.width = `${Ul}px`, this._domNode.appendChild(this._toggleReplaceBtn.domNode), this._domNode.appendChild(n), this._domNode.appendChild(this._closeBtn.domNode), this._domNode.appendChild(l), this._resizeSash = this._register(new Tn(this._domNode, this, { orientation: 0, size: 2 })), this._resized = !1; - let c = Ul; + }, this._hoverService)), this._toggleReplaceBtn.setExpanded(this._isReplaceVisible), this._domNode = document.createElement("div"), this._domNode.className = "editor-widget find-widget", this._domNode.setAttribute("aria-hidden", "true"), this._domNode.ariaLabel = Ofe, this._domNode.role = "dialog", this._domNode.style.width = `${qr}px`, this._domNode.appendChild(this._toggleReplaceBtn.domNode), this._domNode.appendChild(n), this._domNode.appendChild(this._closeBtn.domNode), this._domNode.appendChild(r), this._resizeSash = this._register(new Mn(this._domNode, this, { orientation: 0, size: 2 })), this._resized = !1; + let d = qr; this._register(this._resizeSash.onDidStart(() => { - c = $s(this._domNode); - })), this._register(this._resizeSash.onDidChange((d) => { + d = to(this._domNode); + })), this._register(this._resizeSash.onDidChange((a) => { this._resized = !0; - const h = c + d.startX - d.currentX; - if (h < Ul) + const h = d + a.startX - a.currentX; + if (h < qr) return; - const u = parseFloat(V_(this._domNode).maxWidth) || 0; - h > u || (this._domNode.style.width = `${h}px`, this._isReplaceVisible && (this._replaceInput.width = $s(this._findInput.domNode)), this._findInput.inputBox.layout(), this._tryUpdateHeight()); + const u = parseFloat(QS(this._domNode).maxWidth) || 0; + h > u || (this._domNode.style.width = `${h}px`, this._isReplaceVisible && (this._replaceInput.width = to(this._findInput.domNode)), this._findInput.inputBox.layout(), this._tryUpdateHeight()); })), this._register(this._resizeSash.onDidReset(() => { - const d = $s(this._domNode); - if (d < Ul) + const a = to(this._domNode); + if (a < qr) return; - let h = Ul; - if (!this._resized || d === Ul) { + let h = qr; + if (!this._resized || a === qr) { const u = this._codeEditor.getLayoutInfo(); h = u.width - 28 - u.minimap.minimapWidth - 15, this._resized = !0; } - this._domNode.style.width = `${h}px`, this._isReplaceVisible && (this._replaceInput.width = $s(this._findInput.domNode)), this._findInput.inputBox.layout(); + this._domNode.style.width = `${h}px`, this._isReplaceVisible && (this._replaceInput.width = to(this._findInput.domNode)), this._findInput.inputBox.layout(); })); } updateAccessibilitySupport() { @@ -75141,16 +75141,16 @@ const RZ = class RZ extends Ko { ); } }; -RZ.ID = "editor.contrib.findWidget"; -let GD = RZ; -class fp extends Ko { +q2.ID = "editor.contrib.findWidget"; +let n9 = q2; +class Gp extends jo { constructor(e, t) { super(), this._opts = e; let i = "button"; - this._opts.className && (i = i + " " + this._opts.className), this._opts.icon && (i = i + " " + Ze.asClassName(this._opts.icon)), this._domNode = document.createElement("div"), this._domNode.tabIndex = 0, this._domNode.className = i, this._domNode.setAttribute("role", "button"), this._domNode.setAttribute("aria-label", this._opts.label), this._register(t.setupManagedHover(e.hoverDelegate ?? As("element"), this._domNode, this._opts.label)), this.onclick(this._domNode, (n) => { + this._opts.className && (i = i + " " + this._opts.className), this._opts.icon && (i = i + " " + Se.asClassName(this._opts.icon)), this._domNode = document.createElement("div"), this._domNode.tabIndex = 0, this._domNode.className = i, this._domNode.setAttribute("role", "button"), this._domNode.setAttribute("aria-label", this._opts.label), this._register(t.setupManagedHover(e.hoverDelegate ?? Is("element"), this._domNode, this._opts.label)), this.onclick(this._domNode, (n) => { this._opts.onTrigger(), n.preventDefault(); }), this.onkeydown(this._domNode, (n) => { - var o, r; + var o, l; if (n.equals( 10 /* KeyCode.Space */ @@ -75161,7 +75161,7 @@ class fp extends Ko { this._opts.onTrigger(), n.preventDefault(); return; } - (r = (o = this._opts).onKeyDown) == null || r.call(o, n); + (l = (o = this._opts).onKeyDown) == null || l.call(o, n); }); } get domNode() { @@ -75177,33 +75177,33 @@ class fp extends Ko { this._domNode.classList.toggle("disabled", !e), this._domNode.setAttribute("aria-disabled", String(!e)), this._domNode.tabIndex = e ? 0 : -1; } setExpanded(e) { - this._domNode.setAttribute("aria-expanded", String(!!e)), e ? (this._domNode.classList.remove(...Ze.asClassNameArray(V3)), this._domNode.classList.add(...Ze.asClassNameArray(k3))) : (this._domNode.classList.remove(...Ze.asClassNameArray(k3)), this._domNode.classList.add(...Ze.asClassNameArray(V3))); + this._domNode.setAttribute("aria-expanded", String(!!e)), e ? (this._domNode.classList.remove(...Se.asClassNameArray(oK)), this._domNode.classList.add(...Se.asClassNameArray(lK))) : (this._domNode.classList.remove(...Se.asClassNameArray(lK)), this._domNode.classList.add(...Se.asClassNameArray(oK))); } } -Lr((s, e) => { - const t = s.getColor(zd); - t && e.addRule(`.monaco-editor .findMatch { border: 1px ${Ma(s.type) ? "dotted" : "solid"} ${t}; box-sizing: border-box; }`); - const i = s.getColor(Bie); - i && e.addRule(`.monaco-editor .findScope { border: 1px ${Ma(s.type) ? "dashed" : "solid"} ${i}; }`); - const n = s.getColor(rt); +Il((s, e) => { + const t = s.getColor(Pa); + t && e.addRule(`.monaco-editor .findMatch { border: 1px ${Rc(s.type) ? "dotted" : "solid"} ${t}; box-sizing: border-box; }`); + const i = s.getColor(vne); + i && e.addRule(`.monaco-editor .findScope { border: 1px ${Rc(s.type) ? "dashed" : "solid"} ${i}; }`); + const n = s.getColor(lt); n && e.addRule(`.monaco-editor .find-widget { border: 1px solid ${n}; }`); - const o = s.getColor(zie); + const o = s.getColor(Yne); o && e.addRule(`.monaco-editor .findMatchInline { color: ${o}; }`); - const r = s.getColor(Pie); - r && e.addRule(`.monaco-editor .currentFindMatchInline { color: ${r}; }`); + const l = s.getColor(kne); + l && e.addRule(`.monaco-editor .currentFindMatchInline { color: ${l}; }`); }); -var Sj = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var n7 = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, nr = function(s, e) { +}, ol = function(s, e) { return function(t, i) { e(t, i, s); }; -}, RD; -const Sye = 524288; -function ED(s, e = "single", t = !1) { +}, s9; +const mye = 524288; +function o9(s, e = "single", t = !1) { if (!s.hasModel()) return null; const i = s.getSelection(); @@ -75212,29 +75212,29 @@ function ED(s, e = "single", t = !1) { const n = s.getConfiguredWordAtPosition(i.getStartPosition()); if (n && t === !1) return n.word; - } else if (s.getModel().getValueLengthInRange(i) < Sye) + } else if (s.getModel().getValueLengthInRange(i) < mye) return s.getModel().getValueInRange(i); } return null; } -var Rg; -let Fs = (Rg = class extends R { +var zm; +let zs = (zm = class extends J { get editor() { return this._editor; } static get(e) { - return e.getContribution(RD.ID); + return e.getContribution(s9.ID); } - constructor(e, t, i, n, o, r) { - super(), this._editor = e, this._findWidgetVisible = cd.bindTo(t), this._contextKeyService = t, this._storageService = i, this._clipboardService = n, this._notificationService = o, this._hoverService = r, this._updateHistoryDelayer = new fr(500), this._state = this._register(new U0e()), this.loadQueryState(), this._register(this._state.onFindReplaceStateChange((l) => this._onStateChanged(l))), this._model = null, this._register(this._editor.onDidChangeModel(() => { - const l = this._editor.getModel() && this._state.isRevealed; + constructor(e, t, i, n, o, l) { + super(), this._editor = e, this._findWidgetVisible = ma.bindTo(t), this._contextKeyService = t, this._storageService = i, this._clipboardService = n, this._notificationService = o, this._hoverService = l, this._updateHistoryDelayer = new yl(500), this._state = this._register(new Dfe()), this.loadQueryState(), this._register(this._state.onFindReplaceStateChange((r) => this._onStateChanged(r))), this._model = null, this._register(this._editor.onDidChangeModel(() => { + const r = this._editor.getModel() && this._state.isRevealed; this.disposeModel(), this._state.change({ searchScope: null, matchCase: this._storageService.getBoolean("editor.matchCase", 1, !1), wholeWord: this._storageService.getBoolean("editor.wholeWord", 1, !1), isRegex: this._storageService.getBoolean("editor.isRegex", 1, !1), preserveCase: this._storageService.getBoolean("editor.preserveCase", 1, !1) - }, !1), l && this._start({ + }, !1), r && this._start({ forceRevealReplace: !1, seedSearchStringFromSelection: "none", seedSearchStringFromNonEmptySelection: !1, @@ -75294,7 +75294,7 @@ let Fs = (Rg = class extends R { }, !1); } isFindInputFocused() { - return !!UI.getValue(this._contextKeyService); + return !!dC.getValue(this._contextKeyService); } getState() { return this._state; @@ -75326,7 +75326,7 @@ let Fs = (Rg = class extends R { } } setSearchString(e) { - this._state.isRegex && (e = Po(e)), this._state.change({ searchString: e }, !1); + this._state.isRegex && (e = Uo(e)), this._state.change({ searchString: e }, !1); } highlightFindOptions(e = !1) { } @@ -75338,10 +75338,10 @@ let Fs = (Rg = class extends R { isRevealed: !0 }; if (e.seedSearchStringFromSelection === "single") { - const n = ED(this._editor, e.seedSearchStringFromSelection, e.seedSearchStringFromNonEmptySelection); - n && (this._state.isRegex ? i.searchString = Po(n) : i.searchString = n); + const n = o9(this._editor, e.seedSearchStringFromSelection, e.seedSearchStringFromNonEmptySelection); + n && (this._state.isRegex ? i.searchString = Uo(n) : i.searchString = n); } else if (e.seedSearchStringFromSelection === "multiple" && !e.updateSearchScope) { - const n = ED(this._editor, e.seedSearchStringFromSelection); + const n = o9(this._editor, e.seedSearchStringFromSelection); n && (i.searchString = n); } if (!i.searchString && e.seedSearchStringFromGlobalClipboard) { @@ -75354,7 +75354,7 @@ let Fs = (Rg = class extends R { const n = this._editor.getSelections(); n.some((o) => !o.isEmpty()) && (i.searchScope = n); } - i.loop = e.loop, this._state.change(i, !1), this._model || (this._model = new Ky(this._editor, this._state)); + i.loop = e.loop, this._state.change(i, !1), this._model || (this._model = new ly(this._editor, this._state)); } start(e, t) { return this._start(e, t); @@ -75390,17 +75390,17 @@ let Fs = (Rg = class extends R { /* EditorOption.find */ ).globalFindClipboard && this._editor.hasModel() && !this._editor.getModel().isTooLargeForSyncing() && this._clipboardService.writeFindText(e); } -}, RD = Rg, Rg.ID = "editor.contrib.findController", Rg); -Fs = RD = Sj([ - nr(1, _e), - nr(2, za), - nr(3, od), - nr(4, Vi), - nr(5, Pa) -], Fs); -let XD = class extends Fs { - constructor(e, t, i, n, o, r, l, a, c) { - super(e, i, l, a, r, c), this._contextViewService = t, this._keybindingService = n, this._themeService = o, this._widget = null, this._findOptionsWidget = null; +}, s9 = zm, zm.ID = "editor.contrib.findController", zm); +zs = s9 = n7([ + ol(1, xe), + ol(2, Pc), + ol(3, da), + ol(4, vi), + ol(5, Bc) +], zs); +let l9 = class extends zs { + constructor(e, t, i, n, o, l, r, c, d) { + super(e, i, r, c, l, d), this._contextViewService = t, this._keybindingService = n, this._themeService = o, this._widget = null, this._findOptionsWidget = null; } async _start(e, t) { this._widget || this._createFindWidget(); @@ -75427,24 +75427,24 @@ let XD = class extends Fs { this._widget || this._createFindWidget(), this._state.isRevealed && !e ? this._widget.highlightFindOptions() : this._findOptionsWidget.highlightFindOptions(); } _createFindWidget() { - this._widget = this._register(new GD(this._editor, this, this._state, this._contextViewService, this._keybindingService, this._contextKeyService, this._themeService, this._storageService, this._notificationService, this._hoverService)), this._findOptionsWidget = this._register(new DD(this._editor, this._state, this._keybindingService)); + this._widget = this._register(new n9(this._editor, this, this._state, this._contextViewService, this._keybindingService, this._contextKeyService, this._themeService, this._storageService, this._notificationService, this._hoverService)), this._findOptionsWidget = this._register(new e9(this._editor, this._state, this._keybindingService)); } }; -XD = Sj([ - nr(1, rd), - nr(2, _e), - nr(3, xt), - nr(4, Pi), - nr(5, Vi), - nr(6, za), - nr(7, od), - nr(8, Pa) -], XD); -const Lye = bJ(new fJ({ - id: Ft.StartFindAction, +l9 = n7([ + ol(1, aa), + ol(2, xe), + ol(3, Lt), + ol(4, Ki), + ol(5, vi), + ol(6, Pc), + ol(7, da), + ol(8, Bc) +], l9); +const bye = $B(new qB({ + id: Dt.StartFindAction, label: p("startFindAction", "Find"), alias: "Find", - precondition: H.or(I.focus, H.has("editorIsOpen")), + precondition: P.or(C.focus, P.has("editorIsOpen")), kbOpts: { kbExpr: null, primary: 2084, @@ -75458,8 +75458,8 @@ const Lye = bJ(new fJ({ order: 1 } })); -Lye.addImplementation(0, (s, e, t) => { - const i = Fs.get(e); +bye.addImplementation(0, (s, e, t) => { + const i = zs.get(e); return i ? i.start({ forceRevealReplace: !1, seedSearchStringFromSelection: e.getOption( @@ -75483,7 +75483,7 @@ Lye.addImplementation(0, (s, e, t) => { ).loop }) : !1; }); -const Aye = { +const pye = { description: "Open a new In-Editor Find Widget.", args: [{ name: "Open a new In-Editor Find Widget args", @@ -75500,10 +75500,10 @@ const Aye = { } }] }; -class xye extends he { +class gye extends he { constructor() { super({ - id: Ft.StartFindWithArgs, + id: Dt.StartFindWithArgs, label: p("startFindWithArgsAction", "Find With Arguments"), alias: "Find With Arguments", precondition: void 0, @@ -75513,11 +75513,11 @@ class xye extends he { weight: 100 /* KeybindingWeight.EditorContrib */ }, - metadata: Aye + metadata: pye }); } async run(e, t, i) { - const n = Fs.get(t); + const n = zs.get(t); if (n) { const o = i ? { searchString: i.searchString, @@ -75554,10 +75554,10 @@ class xye extends he { } } } -class Mye extends he { +class Zye extends he { constructor() { super({ - id: Ft.StartFindWithSelection, + id: Dt.StartFindWithSelection, label: p("startFindWithSelectionAction", "Find With Selection"), alias: "Find With Selection", precondition: void 0, @@ -75573,7 +75573,7 @@ class Mye extends he { }); } async run(e, t) { - const i = Fs.get(t); + const i = zs.get(t); i && (await i.start({ forceRevealReplace: !1, seedSearchStringFromSelection: "multiple", @@ -75589,9 +75589,9 @@ class Mye extends he { }), i.setGlobalBufferTerm(i.getState().searchString)); } } -class Lj extends he { +class s7 extends he { async run(e, t) { - const i = Fs.get(t); + const i = zs.get(t); i && !this._run(i) && (await i.start({ forceRevealReplace: !1, seedSearchStringFromSelection: i.getState().searchString.length === 0 && t.getOption( @@ -75613,15 +75613,15 @@ class Lj extends he { }), this._run(i)); } } -class Zye extends Lj { +class fye extends s7 { constructor() { super({ - id: Ft.NextMatchFindAction, + id: Dt.NextMatchFindAction, label: p("findNextMatchAction", "Find Next"), alias: "Find Next", precondition: void 0, kbOpts: [{ - kbExpr: I.focus, + kbExpr: C.focus, primary: 61, mac: { primary: 2085, secondary: [ 61 @@ -75630,7 +75630,7 @@ class Zye extends Lj { weight: 100 /* KeybindingWeight.EditorContrib */ }, { - kbExpr: H.and(I.focus, UI), + kbExpr: P.and(C.focus, dC), primary: 3, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -75641,16 +75641,16 @@ class Zye extends Lj { return e.moveToNextMatch() ? (e.editor.pushUndoStop(), !0) : !1; } } -class _ye extends Lj { +class yye extends s7 { constructor() { super({ - id: Ft.PreviousMatchFindAction, + id: Dt.PreviousMatchFindAction, label: p("findPreviousMatchAction", "Find Previous"), alias: "Find Previous", precondition: void 0, kbOpts: [ { - kbExpr: I.focus, + kbExpr: C.focus, primary: 1085, mac: { primary: 3109, secondary: [ 1085 @@ -75660,7 +75660,7 @@ class _ye extends Lj { /* KeybindingWeight.EditorContrib */ }, { - kbExpr: H.and(I.focus, UI), + kbExpr: P.and(C.focus, dC), primary: 1027, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -75672,55 +75672,55 @@ class _ye extends Lj { return e.moveToPrevMatch(); } } -class Iye extends he { +class Wye extends he { constructor() { super({ - id: Ft.GoToMatchFindAction, + id: Dt.GoToMatchFindAction, label: p("findMatchAction.goToMatch", "Go to Match..."), alias: "Go to Match...", - precondition: cd + precondition: ma }), this._highlightDecorations = []; } run(e, t, i) { - const n = Fs.get(t); + const n = zs.get(t); if (!n) return; const o = n.getState().matchesCount; if (o < 1) { - e.get(Vi).notify({ - severity: yI.Warning, + e.get(vi).notify({ + severity: Mx.Warning, message: p("findMatchAction.noResults", "No matches. Try searching for something else.") }); return; } - const r = e.get(ld), l = new U(), a = l.add(r.createInputBox()); - a.placeholder = p("findMatchAction.inputPlaceHolder", "Type a number to go to a specific match (between 1 and {0})", o); - const c = (h) => { + const l = e.get(ha), r = new _(), c = r.add(l.createInputBox()); + c.placeholder = p("findMatchAction.inputPlaceHolder", "Type a number to go to a specific match (between 1 and {0})", o); + const d = (h) => { const u = parseInt(h); if (isNaN(u)) return; - const g = n.getState().matchesCount; - if (u > 0 && u <= g) + const m = n.getState().matchesCount; + if (u > 0 && u <= m) return u - 1; - if (u < 0 && u >= -g) - return g + u; - }, d = (h) => { - const u = c(h); + if (u < 0 && u >= -m) + return m + u; + }, a = (h) => { + const u = d(h); if (typeof u == "number") { - a.validationMessage = void 0, n.goToMatch(u); - const g = n.getState().currentMatch; - g && this.addDecorations(t, g); + c.validationMessage = void 0, n.goToMatch(u); + const m = n.getState().currentMatch; + m && this.addDecorations(t, m); } else - a.validationMessage = p("findMatchAction.inputValidationMessage", "Please type a number between 1 and {0}", n.getState().matchesCount), this.clearDecorations(t); + c.validationMessage = p("findMatchAction.inputValidationMessage", "Please type a number between 1 and {0}", n.getState().matchesCount), this.clearDecorations(t); }; - l.add(a.onDidChangeValue((h) => { - d(h); - })), l.add(a.onDidAccept(() => { - const h = c(a.value); - typeof h == "number" ? (n.goToMatch(h), a.hide()) : a.validationMessage = p("findMatchAction.inputValidationMessage", "Please type a number between 1 and {0}", n.getState().matchesCount); - })), l.add(a.onDidHide(() => { - this.clearDecorations(t), l.dispose(); - })), a.show(); + r.add(c.onDidChangeValue((h) => { + a(h); + })), r.add(c.onDidAccept(() => { + const h = d(c.value); + typeof h == "number" ? (n.goToMatch(h), c.hide()) : c.validationMessage = p("findMatchAction.inputValidationMessage", "Please type a number between 1 and {0}", n.getState().matchesCount); + })), r.add(c.onDidHide(() => { + this.clearDecorations(t), r.dispose(); + })), c.show(); } clearDecorations(e) { e.changeDecorations((t) => { @@ -75743,8 +75743,8 @@ class Iye extends he { options: { description: "find-match-quick-access-range-highlight-overview", overviewRuler: { - color: fi(Eoe), - position: ur.Full + color: Zi(Nle), + position: pl.Full } } } @@ -75752,12 +75752,12 @@ class Iye extends he { }); } } -class Aj extends he { +class o7 extends he { async run(e, t) { - const i = Fs.get(t); + const i = zs.get(t); if (!i) return; - const n = ED(t, "single", !1); + const n = o9(t, "single", !1); n && i.setSearchString(n), this._run(i) || (await i.start({ forceRevealReplace: !1, seedSearchStringFromSelection: "none", @@ -75773,15 +75773,15 @@ class Aj extends he { }), this._run(i)); } } -class Nye extends Aj { +class Gye extends o7 { constructor() { super({ - id: Ft.NextSelectionMatchFindAction, + id: Dt.NextSelectionMatchFindAction, label: p("nextSelectionMatchFindAction", "Find Next Selection"), alias: "Find Next Selection", precondition: void 0, kbOpts: { - kbExpr: I.focus, + kbExpr: C.focus, primary: 2109, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -75792,15 +75792,15 @@ class Nye extends Aj { return e.moveToNextMatch(); } } -class Wye extends Aj { +class Xye extends o7 { constructor() { super({ - id: Ft.PreviousSelectionMatchFindAction, + id: Dt.PreviousSelectionMatchFindAction, label: p("previousSelectionMatchFindAction", "Find Previous Selection"), alias: "Find Previous Selection", precondition: void 0, kbOpts: { - kbExpr: I.focus, + kbExpr: C.focus, primary: 3133, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -75811,11 +75811,11 @@ class Wye extends Aj { return e.moveToPrevMatch(); } } -const vye = bJ(new fJ({ - id: Ft.StartFindReplaceAction, +const Vye = $B(new qB({ + id: Dt.StartFindReplaceAction, label: p("startReplace", "Replace"), alias: "Replace", - precondition: H.or(I.focus, H.has("editorIsOpen")), + precondition: P.or(C.focus, P.has("editorIsOpen")), kbOpts: { kbExpr: null, primary: 2086, @@ -75833,22 +75833,22 @@ const vye = bJ(new fJ({ order: 2 } })); -vye.addImplementation(0, (s, e, t) => { +Vye.addImplementation(0, (s, e, t) => { if (!e.hasModel() || e.getOption( 92 /* EditorOption.readOnly */ )) return !1; - const i = Fs.get(e); + const i = zs.get(e); if (!i) return !1; - const n = e.getSelection(), o = i.isFindInputFocused(), r = !n.isEmpty() && n.startLineNumber === n.endLineNumber && e.getOption( + const n = e.getSelection(), o = i.isFindInputFocused(), l = !n.isEmpty() && n.startLineNumber === n.endLineNumber && e.getOption( 41 /* EditorOption.find */ - ).seedSearchStringFromSelection !== "never" && !o, l = o || r ? 2 : 1; + ).seedSearchStringFromSelection !== "never" && !o, r = o || l ? 2 : 1; return i.start({ forceRevealReplace: !0, - seedSearchStringFromSelection: r ? "single" : "none", + seedSearchStringFromSelection: l ? "single" : "none", seedSearchStringFromNonEmptySelection: e.getOption( 41 /* EditorOption.find */ @@ -75857,7 +75857,7 @@ vye.addImplementation(0, (s, e, t) => { 41 /* EditorOption.find */ ).seedSearchStringFromSelection !== "never", - shouldFocus: l, + shouldFocus: r, shouldAnimate: !0, updateSearchScope: !1, loop: e.getOption( @@ -75866,27 +75866,27 @@ vye.addImplementation(0, (s, e, t) => { ).loop }); }); -gt( - Fs.ID, - XD, +mt( + zs.ID, + l9, 0 /* EditorContributionInstantiation.Eager */ ); -ee(xye); -ee(Mye); +ee(gye); ee(Zye); -ee(_ye); -ee(Iye); -ee(Nye); +ee(fye); +ee(yye); ee(Wye); -const Yl = zi.bindToContribution(Fs.get); -oe(new Yl({ - id: Ft.CloseFindWidgetCommand, - precondition: cd, +ee(Gye); +ee(Xye); +const Ur = Ai.bindToContribution(zs.get); +oe(new Ur({ + id: Dt.CloseFindWidgetCommand, + precondition: ma, handler: (s) => s.closeFindWidget(), kbOpts: { weight: 105, - kbExpr: H.and(I.focus, H.not("isComposing")), + kbExpr: P.and(C.focus, P.not("isComposing")), primary: 9, secondary: [ 1033 @@ -75894,134 +75894,134 @@ oe(new Yl({ ] } })); -oe(new Yl({ - id: Ft.ToggleCaseSensitiveCommand, +oe(new Ur({ + id: Dt.ToggleCaseSensitiveCommand, precondition: void 0, handler: (s) => s.toggleCaseSensitive(), kbOpts: { weight: 105, - kbExpr: I.focus, - primary: TS.primary, - mac: TS.mac, - win: TS.win, - linux: TS.linux + kbExpr: C.focus, + primary: U1.primary, + mac: U1.mac, + win: U1.win, + linux: U1.linux } })); -oe(new Yl({ - id: Ft.ToggleWholeWordCommand, +oe(new Ur({ + id: Dt.ToggleWholeWordCommand, precondition: void 0, handler: (s) => s.toggleWholeWords(), kbOpts: { weight: 105, - kbExpr: I.focus, - primary: DS.primary, - mac: DS.mac, - win: DS.win, - linux: DS.linux + kbExpr: C.focus, + primary: P1.primary, + mac: P1.mac, + win: P1.win, + linux: P1.linux } })); -oe(new Yl({ - id: Ft.ToggleRegexCommand, +oe(new Ur({ + id: Dt.ToggleRegexCommand, precondition: void 0, handler: (s) => s.toggleRegex(), kbOpts: { weight: 105, - kbExpr: I.focus, - primary: VS.primary, - mac: VS.mac, - win: VS.win, - linux: VS.linux + kbExpr: C.focus, + primary: B1.primary, + mac: B1.mac, + win: B1.win, + linux: B1.linux } })); -oe(new Yl({ - id: Ft.ToggleSearchScopeCommand, +oe(new Ur({ + id: Dt.ToggleSearchScopeCommand, precondition: void 0, handler: (s) => s.toggleSearchScope(), kbOpts: { weight: 105, - kbExpr: I.focus, - primary: kS.primary, - mac: kS.mac, - win: kS.win, - linux: kS.linux + kbExpr: C.focus, + primary: _1.primary, + mac: _1.mac, + win: _1.win, + linux: _1.linux } })); -oe(new Yl({ - id: Ft.TogglePreserveCaseCommand, +oe(new Ur({ + id: Dt.TogglePreserveCaseCommand, precondition: void 0, handler: (s) => s.togglePreserveCase(), kbOpts: { weight: 105, - kbExpr: I.focus, - primary: GS.primary, - mac: GS.mac, - win: GS.win, - linux: GS.linux + kbExpr: C.focus, + primary: Q1.primary, + mac: Q1.mac, + win: Q1.win, + linux: Q1.linux } })); -oe(new Yl({ - id: Ft.ReplaceOneAction, - precondition: cd, +oe(new Ur({ + id: Dt.ReplaceOneAction, + precondition: ma, handler: (s) => s.replace(), kbOpts: { weight: 105, - kbExpr: I.focus, + kbExpr: C.focus, primary: 3094 /* KeyCode.Digit1 */ } })); -oe(new Yl({ - id: Ft.ReplaceOneAction, - precondition: cd, +oe(new Ur({ + id: Dt.ReplaceOneAction, + precondition: ma, handler: (s) => s.replace(), kbOpts: { weight: 105, - kbExpr: H.and(I.focus, k5), + kbExpr: P.and(C.focus, lE), primary: 3 /* KeyCode.Enter */ } })); -oe(new Yl({ - id: Ft.ReplaceAllAction, - precondition: cd, +oe(new Ur({ + id: Dt.ReplaceAllAction, + precondition: ma, handler: (s) => s.replaceAll(), kbOpts: { weight: 105, - kbExpr: I.focus, + kbExpr: C.focus, primary: 2563 /* KeyCode.Enter */ } })); -oe(new Yl({ - id: Ft.ReplaceAllAction, - precondition: cd, +oe(new Ur({ + id: Dt.ReplaceAllAction, + precondition: ma, handler: (s) => s.replaceAll(), kbOpts: { weight: 105, - kbExpr: H.and(I.focus, k5), + kbExpr: P.and(C.focus, lE), primary: void 0, mac: { primary: 2051 } } })); -oe(new Yl({ - id: Ft.SelectAllMatchesAction, - precondition: cd, +oe(new Ur({ + id: Dt.SelectAllMatchesAction, + precondition: ma, handler: (s) => s.selectAllMatches(), kbOpts: { weight: 105, - kbExpr: I.focus, + kbExpr: C.focus, primary: 515 /* KeyCode.Enter */ } })); -const Tye = { +const Lye = { 0: " ", 1: "u", 2: "r" -}, Y3 = 65535, pl = 16777215, z3 = 4278190080; -class kW { +}, uK = 65535, yr = 16777215, mK = 4278190080; +class jR { constructor(e) { const t = Math.ceil(e / 32); this._states = new Uint32Array(t); @@ -76035,11 +76035,11 @@ class kW { t ? this._states[i] = o | 1 << n : this._states[i] = o & ~(1 << n); } } -class To { +class Yo { constructor(e, t, i) { - if (e.length !== t.length || e.length > Y3) + if (e.length !== t.length || e.length > uK) throw new Error("invalid startIndexes or endIndexes size"); - this._startIndexes = e, this._endIndexes = t, this._collapseStates = new kW(e.length), this._userDefinedStates = new kW(e.length), this._recoveredStates = new kW(e.length), this._types = i, this._parentsComputed = !1; + this._startIndexes = e, this._endIndexes = t, this._collapseStates = new jR(e.length), this._userDefinedStates = new jR(e.length), this._recoveredStates = new jR(e.length), this._types = i, this._parentsComputed = !1; } ensureParentIndices() { if (!this._parentsComputed) { @@ -76049,13 +76049,13 @@ class To { return this.getStartLineNumber(o) <= i && this.getEndLineNumber(o) >= n; }; for (let i = 0, n = this._startIndexes.length; i < n; i++) { - const o = this._startIndexes[i], r = this._endIndexes[i]; - if (o > pl || r > pl) - throw new Error("startLineNumber or endLineNumber must not exceed " + pl); - for (; e.length > 0 && !t(o, r); ) + const o = this._startIndexes[i], l = this._endIndexes[i]; + if (o > yr || l > yr) + throw new Error("startLineNumber or endLineNumber must not exceed " + yr); + for (; e.length > 0 && !t(o, l); ) e.pop(); - const l = e.length > 0 ? e[e.length - 1] : -1; - e.push(i), this._startIndexes[i] = o + ((l & 255) << 24), this._endIndexes[i] = r + ((l & 65280) << 16); + const r = e.length > 0 ? e[e.length - 1] : -1; + e.push(i), this._startIndexes[i] = o + ((r & 255) << 24), this._endIndexes[i] = l + ((r & 65280) << 16); } } } @@ -76063,10 +76063,10 @@ class To { return this._startIndexes.length; } getStartLineNumber(e) { - return this._startIndexes[e] & pl; + return this._startIndexes[e] & yr; } getEndLineNumber(e) { - return this._endIndexes[e] & pl; + return this._endIndexes[e] & yr; } getType(e) { return this._types ? this._types[e] : void 0; @@ -76106,12 +76106,12 @@ class To { return i; } toRegion(e) { - return new Dye(this, e); + return new Iye(this, e); } getParentIndex(e) { this.ensureParentIndices(); - const t = ((this._startIndexes[e] & z3) >>> 24) + ((this._endIndexes[e] & z3) >>> 16); - return t === Y3 ? -1 : t; + const t = ((this._startIndexes[e] & mK) >>> 24) + ((this._endIndexes[e] & mK) >>> 16); + return t === uK ? -1 : t; } contains(e, t) { return this.getStartLineNumber(e) <= t && this.getEndLineNumber(e) >= t; @@ -76142,13 +76142,13 @@ class To { toString() { const e = []; for (let t = 0; t < this.length; t++) - e[t] = `[${Tye[this.getSource(t)]}${this.isCollapsed(t) ? "+" : "-"}] ${this.getStartLineNumber(t)}/${this.getEndLineNumber(t)}`; + e[t] = `[${Lye[this.getSource(t)]}${this.isCollapsed(t) ? "+" : "-"}] ${this.getStartLineNumber(t)}/${this.getEndLineNumber(t)}`; return e.join(", "); } toFoldRange(e) { return { - startLineNumber: this._startIndexes[e] & pl, - endLineNumber: this._endIndexes[e] & pl, + startLineNumber: this._startIndexes[e] & yr, + endLineNumber: this._endIndexes[e] & yr, type: this._types ? this._types[e] : void 0, isCollapsed: this.isCollapsed(e), source: this.getSource(e) @@ -76156,16 +76156,16 @@ class To { } static fromFoldRanges(e) { const t = e.length, i = new Uint32Array(t), n = new Uint32Array(t); - let o = [], r = !1; - for (let a = 0; a < t; a++) { - const c = e[a]; - i[a] = c.startLineNumber, n[a] = c.endLineNumber, o.push(c.type), c.type && (r = !0); - } - r || (o = void 0); - const l = new To(i, n, o); - for (let a = 0; a < t; a++) - e[a].isCollapsed && l.setCollapsed(a, !0), l.setSource(a, e[a].source); - return l; + let o = [], l = !1; + for (let c = 0; c < t; c++) { + const d = e[c]; + i[c] = d.startLineNumber, n[c] = d.endLineNumber, o.push(d.type), d.type && (l = !0); + } + l || (o = void 0); + const r = new Yo(i, n, o); + for (let c = 0; c < t; c++) + e[c].isCollapsed && r.setCollapsed(c, !0), r.setSource(c, e[c].source); + return r; } /** * Two inputs, each a FoldingRegions or a FoldRange[], are merged. @@ -76182,38 +76182,38 @@ class To { */ static sanitizeAndMerge(e, t, i, n) { i = i ?? Number.MAX_VALUE; - const o = (b, y) => Array.isArray(b) ? (w) => w < y ? b[w] : void 0 : (w) => w < y ? b.toFoldRange(w) : void 0, r = o(e, e.length), l = o(t, t.length); - let a = 0, c = 0, d = r(0), h = l(0); + const o = (Z, f) => Array.isArray(Z) ? (y) => y < f ? Z[y] : void 0 : (y) => y < f ? Z.toFoldRange(y) : void 0, l = o(e, e.length), r = o(t, t.length); + let c = 0, d = 0, a = l(0), h = r(0); const u = []; - let g, m = 0; - const f = []; - for (; d || h; ) { - let b; - if (h && (!d || d.startLineNumber >= h.startLineNumber)) - d && d.startLineNumber === h.startLineNumber ? (h.source === 1 ? b = h : (b = d, b.isCollapsed = h.isCollapsed && (d.endLineNumber === h.endLineNumber || !(n != null && n.startsInside(d.startLineNumber + 1, d.endLineNumber + 1))), b.source = 0), d = r(++a)) : (b = h, h.isCollapsed && h.source === 0 && (b.source = 2)), h = l(++c); + let m, b = 0; + const g = []; + for (; a || h; ) { + let Z; + if (h && (!a || a.startLineNumber >= h.startLineNumber)) + a && a.startLineNumber === h.startLineNumber ? (h.source === 1 ? Z = h : (Z = a, Z.isCollapsed = h.isCollapsed && (a.endLineNumber === h.endLineNumber || !(n != null && n.startsInside(a.startLineNumber + 1, a.endLineNumber + 1))), Z.source = 0), a = l(++c)) : (Z = h, h.isCollapsed && h.source === 0 && (Z.source = 2)), h = r(++d); else { - let y = c, w = h; + let f = d, y = h; for (; ; ) { - if (!w || w.startLineNumber > d.endLineNumber) { - b = d; + if (!y || y.startLineNumber > a.endLineNumber) { + Z = a; break; } - if (w.source === 1 && w.endLineNumber > d.endLineNumber) + if (y.source === 1 && y.endLineNumber > a.endLineNumber) break; - w = l(++y); + y = r(++f); } - d = r(++a); + a = l(++c); } - if (b) { - for (; g && g.endLineNumber < b.startLineNumber; ) - g = u.pop(); - b.endLineNumber > b.startLineNumber && b.startLineNumber > m && b.endLineNumber <= i && (!g || g.endLineNumber >= b.endLineNumber) && (f.push(b), m = b.startLineNumber, g && u.push(g), g = b); + if (Z) { + for (; m && m.endLineNumber < Z.startLineNumber; ) + m = u.pop(); + Z.endLineNumber > Z.startLineNumber && Z.startLineNumber > b && Z.endLineNumber <= i && (!m || m.endLineNumber >= Z.endLineNumber) && (g.push(Z), b = Z.startLineNumber, m && u.push(m), m = Z); } } - return f; + return g; } } -class Dye { +class Iye { constructor(e, t) { this.ranges = e, this.index = t; } @@ -76239,7 +76239,7 @@ class Dye { return this.startLineNumber <= e && e <= this.endLineNumber; } } -class Vye { +class Sye { get regions() { return this._regions; } @@ -76247,7 +76247,7 @@ class Vye { return this._textModel; } constructor(e, t) { - this._updateEventEmitter = new k(), this.onDidChange = this._updateEventEmitter.event, this._textModel = e, this._decorationProvider = t, this._regions = new To(new Uint32Array(0), new Uint32Array(0)), this._editorDecorationIds = []; + this._updateEventEmitter = new k(), this.onDidChange = this._updateEventEmitter.event, this._textModel = e, this._decorationProvider = t, this._regions = new Yo(new Uint32Array(0), new Uint32Array(0)), this._editorDecorationIds = []; } toggleCollapseState(e) { if (!e.length) @@ -76255,26 +76255,26 @@ class Vye { e = e.sort((i, n) => i.regionIndex - n.regionIndex); const t = {}; this._decorationProvider.changeDecorations((i) => { - let n = 0, o = -1, r = -1; - const l = (a) => { - for (; n < a; ) { - const c = this._regions.getEndLineNumber(n), d = this._regions.isCollapsed(n); - if (c <= o) { + let n = 0, o = -1, l = -1; + const r = (c) => { + for (; n < c; ) { + const d = this._regions.getEndLineNumber(n), a = this._regions.isCollapsed(n); + if (d <= o) { const h = this.regions.getSource(n) !== 0; - i.changeDecorationOptions(this._editorDecorationIds[n], this._decorationProvider.getDecorationOption(d, c <= r, h)); + i.changeDecorationOptions(this._editorDecorationIds[n], this._decorationProvider.getDecorationOption(a, d <= l, h)); } - d && c > r && (r = c), n++; + a && d > l && (l = d), n++; } }; - for (const a of e) { - const c = a.regionIndex, d = this._editorDecorationIds[c]; - if (d && !t[d]) { - t[d] = !0, l(c); - const h = !this._regions.isCollapsed(c); - this._regions.setCollapsed(c, h), o = Math.max(o, this._regions.getEndLineNumber(c)); + for (const c of e) { + const d = c.regionIndex, a = this._editorDecorationIds[d]; + if (a && !t[a]) { + t[a] = !0, r(d); + const h = !this._regions.isCollapsed(d); + this._regions.setCollapsed(d, h), o = Math.max(o, this._regions.getEndLineNumber(d)); } } - l(this._regions.length); + r(this._regions.length); }), this._updateEventEmitter.fire({ model: this, collapseStateChanged: e }); } removeManualRanges(e) { @@ -76288,23 +76288,23 @@ class Vye { const o = this._regions.toFoldRange(n); (o.source === 0 || !i(o)) && t.push(o); } - this.updatePost(To.fromFoldRanges(t)); + this.updatePost(Yo.fromFoldRanges(t)); } update(e, t) { - const i = this._currentFoldedOrManualRanges(t), n = To.sanitizeAndMerge(e, i, this._textModel.getLineCount(), t); - this.updatePost(To.fromFoldRanges(n)); + const i = this._currentFoldedOrManualRanges(t), n = Yo.sanitizeAndMerge(e, i, this._textModel.getLineCount(), t); + this.updatePost(Yo.fromFoldRanges(n)); } updatePost(e) { const t = []; let i = -1; for (let n = 0, o = e.length; n < o; n++) { - const r = e.getStartLineNumber(n), l = e.getEndLineNumber(n), a = e.isCollapsed(n), c = e.getSource(n) !== 0, d = { - startLineNumber: r, - startColumn: this._textModel.getLineMaxColumn(r), - endLineNumber: l, - endColumn: this._textModel.getLineMaxColumn(l) + 1 + const l = e.getStartLineNumber(n), r = e.getEndLineNumber(n), c = e.isCollapsed(n), d = e.getSource(n) !== 0, a = { + startLineNumber: l, + startColumn: this._textModel.getLineMaxColumn(l), + endLineNumber: r, + endColumn: this._textModel.getLineMaxColumn(r) + 1 }; - t.push({ range: d, options: this._decorationProvider.getDecorationOption(a, l <= i, c) }), a && l > i && (i = l); + t.push({ range: a, options: this._decorationProvider.getDecorationOption(c, r <= i, d) }), c && r > i && (i = r); } this._decorationProvider.changeDecorations((n) => this._editorDecorationIds = n.deltaDecorations(this._editorDecorationIds, t)), this._regions = e, this._updateEventEmitter.fire({ model: this }); } @@ -76312,15 +76312,15 @@ class Vye { const t = []; for (let i = 0, n = this._regions.length; i < n; i++) { let o = this.regions.isCollapsed(i); - const r = this.regions.getSource(i); - if (o || r !== 0) { - const l = this._regions.toFoldRange(i), a = this._textModel.getDecorationRange(this._editorDecorationIds[i]); - a && (o && (e != null && e.startsInside(a.startLineNumber + 1, a.endLineNumber)) && (o = !1), t.push({ - startLineNumber: a.startLineNumber, - endLineNumber: a.endLineNumber, - type: l.type, + const l = this.regions.getSource(i); + if (o || l !== 0) { + const r = this._regions.toFoldRange(i), c = this._textModel.getDecorationRange(this._editorDecorationIds[i]); + c && (o && (e != null && e.startsInside(c.startLineNumber + 1, c.endLineNumber)) && (o = !1), t.push({ + startLineNumber: c.startLineNumber, + endLineNumber: c.endLineNumber, + type: r.type, isCollapsed: o, - source: r + source: l })); } } @@ -76332,16 +76332,16 @@ class Vye { getMemento() { const e = this._currentFoldedOrManualRanges(), t = [], i = this._textModel.getLineCount(); for (let n = 0, o = e.length; n < o; n++) { - const r = e[n]; - if (r.startLineNumber >= r.endLineNumber || r.startLineNumber < 1 || r.endLineNumber > i) + const l = e[n]; + if (l.startLineNumber >= l.endLineNumber || l.startLineNumber < 1 || l.endLineNumber > i) continue; - const l = this._getLinesChecksum(r.startLineNumber + 1, r.endLineNumber); + const r = this._getLinesChecksum(l.startLineNumber + 1, l.endLineNumber); t.push({ - startLineNumber: r.startLineNumber, - endLineNumber: r.endLineNumber, - isCollapsed: r.isCollapsed, - source: r.source, - checksum: l + startLineNumber: l.startLineNumber, + endLineNumber: l.endLineNumber, + isCollapsed: l.isCollapsed, + source: l.source, + checksum: r }); } return t.length > 0 ? t : void 0; @@ -76356,8 +76356,8 @@ class Vye { for (const o of e) { if (o.startLineNumber >= o.endLineNumber || o.startLineNumber < 1 || o.endLineNumber > i) continue; - const r = this._getLinesChecksum(o.startLineNumber + 1, o.endLineNumber); - (!o.checksum || r === o.checksum) && t.push({ + const l = this._getLinesChecksum(o.startLineNumber + 1, o.endLineNumber); + (!o.checksum || l === o.checksum) && t.push({ startLineNumber: o.startLineNumber, endLineNumber: o.endLineNumber, type: void 0, @@ -76366,11 +76366,11 @@ class Vye { /* FoldSource.provider */ }); } - const n = To.sanitizeAndMerge(this._regions, t, i); - this.updatePost(To.fromFoldRanges(n)); + const n = Yo.sanitizeAndMerge(this._regions, t, i); + this.updatePost(Yo.fromFoldRanges(n)); } _getLinesChecksum(e, t) { - return v_(this._textModel.getLineContent(e) + this._textModel.getLineContent(t)) % 1e6; + return PS(this._textModel.getLineContent(e) + this._textModel.getLineContent(t)) % 1e6; } dispose() { this._decorationProvider.removeDecorations(this._editorDecorationIds); @@ -76380,8 +76380,8 @@ class Vye { if (this._regions) { let n = this._regions.findRange(e), o = 1; for (; n >= 0; ) { - const r = this._regions.toRegion(n); - (!t || t(r, o)) && i.push(r), o++, n = r.parentIndex; + const l = this._regions.toRegion(n); + (!t || t(l, o)) && i.push(l), o++, n = l.parentIndex; } } return i; @@ -76397,96 +76397,96 @@ class Vye { getRegionsInside(e, t) { const i = [], n = e ? e.regionIndex + 1 : 0, o = e ? e.endLineNumber : Number.MAX_VALUE; if (t && t.length === 2) { - const r = []; - for (let l = n, a = this._regions.length; l < a; l++) { - const c = this._regions.toRegion(l); - if (this._regions.getStartLineNumber(l) < o) { - for (; r.length > 0 && !c.containedBy(r[r.length - 1]); ) - r.pop(); - r.push(c), t(c, r.length) && i.push(c); + const l = []; + for (let r = n, c = this._regions.length; r < c; r++) { + const d = this._regions.toRegion(r); + if (this._regions.getStartLineNumber(r) < o) { + for (; l.length > 0 && !d.containedBy(l[l.length - 1]); ) + l.pop(); + l.push(d), t(d, l.length) && i.push(d); } else break; } } else - for (let r = n, l = this._regions.length; r < l; r++) { - const a = this._regions.toRegion(r); - if (this._regions.getStartLineNumber(r) < o) - (!t || t(a)) && i.push(a); + for (let l = n, r = this._regions.length; l < r; l++) { + const c = this._regions.toRegion(l); + if (this._regions.getStartLineNumber(l) < o) + (!t || t(c)) && i.push(c); else break; } return i; } } -function E5(s, e, t) { +function dE(s, e, t) { const i = []; for (const n of t) { const o = s.getRegionAtLine(n); if (o) { - const r = !o.isCollapsed; + const l = !o.isCollapsed; if (i.push(o), e > 1) { - const l = s.getRegionsInside(o, (a, c) => a.isCollapsed !== r && c < e); - i.push(...l); + const r = s.getRegionsInside(o, (c, d) => c.isCollapsed !== l && d < e); + i.push(...r); } } } s.toggleCollapseState(i); } -function w0(s, e, t = Number.MAX_VALUE, i) { +function I0(s, e, t = Number.MAX_VALUE, i) { const n = []; if (i && i.length > 0) for (const o of i) { - const r = s.getRegionAtLine(o); - if (r && (r.isCollapsed !== e && n.push(r), t > 1)) { - const l = s.getRegionsInside(r, (a, c) => a.isCollapsed !== e && c < t); - n.push(...l); + const l = s.getRegionAtLine(o); + if (l && (l.isCollapsed !== e && n.push(l), t > 1)) { + const r = s.getRegionsInside(l, (c, d) => c.isCollapsed !== e && d < t); + n.push(...r); } } else { - const o = s.getRegionsInside(null, (r, l) => r.isCollapsed !== e && l < t); + const o = s.getRegionsInside(null, (l, r) => l.isCollapsed !== e && r < t); n.push(...o); } s.toggleCollapseState(n); } -function xj(s, e, t, i) { +function l7(s, e, t, i) { const n = []; for (const o of i) { - const r = s.getAllRegionsAtLine(o, (l, a) => l.isCollapsed !== e && a <= t); - n.push(...r); + const l = s.getAllRegionsAtLine(o, (r, c) => r.isCollapsed !== e && c <= t); + n.push(...l); } s.toggleCollapseState(n); } -function kye(s, e, t) { +function xye(s, e, t) { const i = []; for (const n of t) { - const o = s.getAllRegionsAtLine(n, (r) => r.isCollapsed !== e); + const o = s.getAllRegionsAtLine(n, (l) => l.isCollapsed !== e); o.length > 0 && i.push(o[0]); } s.toggleCollapseState(i); } -function Gye(s, e, t, i) { - const n = (r, l) => l === e && r.isCollapsed !== t && !i.some((a) => r.containsLine(a)), o = s.getRegionsInside(null, n); +function Cye(s, e, t, i) { + const n = (l, r) => r === e && l.isCollapsed !== t && !i.some((c) => l.containsLine(c)), o = s.getRegionsInside(null, n); s.toggleCollapseState(o); } -function Mj(s, e, t) { +function r7(s, e, t) { const i = []; - for (const r of t) { - const l = s.getAllRegionsAtLine(r, void 0); - l.length > 0 && i.push(l[0]); + for (const l of t) { + const r = s.getAllRegionsAtLine(l, void 0); + r.length > 0 && i.push(r[0]); } - const n = (r) => i.every((l) => !l.containedBy(r) && !r.containedBy(l)) && r.isCollapsed !== e, o = s.getRegionsInside(null, n); + const n = (l) => i.every((r) => !r.containedBy(l) && !l.containedBy(r)) && l.isCollapsed !== e, o = s.getRegionsInside(null, n); s.toggleCollapseState(o); } -function X5(s, e, t) { +function aE(s, e, t) { const i = s.textModel, n = s.regions, o = []; - for (let r = n.length - 1; r >= 0; r--) - if (t !== n.isCollapsed(r)) { - const l = n.getStartLineNumber(r); - e.test(i.getLineContent(l)) && o.push(n.toRegion(r)); + for (let l = n.length - 1; l >= 0; l--) + if (t !== n.isCollapsed(l)) { + const r = n.getStartLineNumber(l); + e.test(i.getLineContent(r)) && o.push(n.toRegion(l)); } s.toggleCollapseState(o); } -function F5(s, e, t) { +function hE(s, e, t) { const i = s.regions, n = []; for (let o = i.length - 1; o >= 0; o--) t !== i.isCollapsed(o) && e === i.getType(o) && n.push(i.toRegion(o)); @@ -76501,7 +76501,7 @@ function Rye(s, e) { } return t; } -function Eye(s, e) { +function Nye(s, e) { let t = e.getRegionAtLine(s); if (t !== null && t.startLineNumber === s) { if (s !== t.startLineNumber) @@ -76526,7 +76526,7 @@ function Eye(s, e) { } return null; } -function Xye(s, e) { +function wye(s, e) { let t = e.getRegionAtLine(s); if (t !== null && t.startLineNumber === s) { const i = t.parentIndex; @@ -76554,7 +76554,7 @@ function Xye(s, e) { } return null; } -class Fye { +class Tye { get onDidChange() { return this._updateEventEmitter.event; } @@ -76565,18 +76565,18 @@ class Fye { this._updateEventEmitter = new k(), this._hasLineChanges = !1, this._foldingModel = e, this._foldingModelListener = e.onDidChange((t) => this.updateHiddenRanges()), this._hiddenRanges = [], e.regions.length && this.updateHiddenRanges(); } notifyChangeModelContent(e) { - this._hiddenRanges.length && !this._hasLineChanges && (this._hasLineChanges = e.changes.some((t) => t.range.endLineNumber !== t.range.startLineNumber || kh(t.text)[0] !== 0)); + this._hiddenRanges.length && !this._hasLineChanges && (this._hasLineChanges = e.changes.some((t) => t.range.endLineNumber !== t.range.startLineNumber || Eh(t.text)[0] !== 0)); } updateHiddenRanges() { let e = !1; const t = []; - let i = 0, n = 0, o = Number.MAX_VALUE, r = -1; - const l = this._foldingModel.regions; - for (; i < l.length; i++) { - if (!l.isCollapsed(i)) + let i = 0, n = 0, o = Number.MAX_VALUE, l = -1; + const r = this._foldingModel.regions; + for (; i < r.length; i++) { + if (!r.isCollapsed(i)) continue; - const a = l.getStartLineNumber(i) + 1, c = l.getEndLineNumber(i); - o <= a && c <= r || (!e && n < this._hiddenRanges.length && this._hiddenRanges[n].startLineNumber === a && this._hiddenRanges[n].endLineNumber === c ? (t.push(this._hiddenRanges[n]), n++) : (e = !0, t.push(new M(a, 1, c, 1))), o = a, r = c); + const c = r.getStartLineNumber(i) + 1, d = r.getEndLineNumber(i); + o <= c && d <= l || (!e && n < this._hiddenRanges.length && this._hiddenRanges[n].startLineNumber === c && this._hiddenRanges[n].endLineNumber === d ? (t.push(this._hiddenRanges[n]), n++) : (e = !0, t.push(new I(c, 1, d, 1))), o = c, l = d); } (this._hasLineChanges || e || n < this._hiddenRanges.length) && this.applyHiddenRanges(t); } @@ -76587,19 +76587,19 @@ class Fye { return this._hiddenRanges.length > 0; } isHidden(e) { - return P3(this._hiddenRanges, e) !== null; + return bK(this._hiddenRanges, e) !== null; } adjustSelections(e) { let t = !1; const i = this._foldingModel.textModel; let n = null; - const o = (r) => ((!n || !Yye(r, n)) && (n = P3(this._hiddenRanges, r)), n ? n.startLineNumber - 1 : null); - for (let r = 0, l = e.length; r < l; r++) { - let a = e[r]; - const c = o(a.startLineNumber); - c && (a = a.setStartPosition(c, i.getLineMaxColumn(c)), t = !0); - const d = o(a.endLineNumber); - d && (a = a.setEndPosition(d, i.getLineMaxColumn(d)), t = !0), e[r] = a; + const o = (l) => ((!n || !Mye(l, n)) && (n = bK(this._hiddenRanges, l)), n ? n.startLineNumber - 1 : null); + for (let l = 0, r = e.length; l < r; l++) { + let c = e[l]; + const d = o(c.startLineNumber); + d && (c = c.setStartPosition(d, i.getLineMaxColumn(d)), t = !0); + const a = o(c.endLineNumber); + a && (c = c.setEndPosition(a, i.getLineMaxColumn(a)), t = !0), e[l] = c; } return t; } @@ -76607,17 +76607,17 @@ class Fye { this.hiddenRanges.length > 0 && (this._hiddenRanges = [], this._updateEventEmitter.fire(this._hiddenRanges)), this._foldingModelListener && (this._foldingModelListener.dispose(), this._foldingModelListener = null); } } -function Yye(s, e) { +function Mye(s, e) { return s >= e.startLineNumber && s <= e.endLineNumber; } -function P3(s, e) { - const t = n1(s, (i) => e < i.startLineNumber) - 1; +function bK(s, e) { + const t = pW(s, (i) => e < i.startLineNumber) - 1; return t >= 0 && s[t].endLineNumber >= e ? s[t] : null; } -const zye = 5e3, Pye = "indent"; -class Y5 { +const Yye = 5e3, kye = "indent"; +class uE { constructor(e, t, i) { - this.editorModel = e, this.languageConfigurationService = t, this.foldingRangesLimit = i, this.id = Pye; + this.editorModel = e, this.languageConfigurationService = t, this.foldingRangesLimit = i, this.id = kye; } dispose() { } @@ -76626,12 +76626,12 @@ class Y5 { return Promise.resolve(Hye(this.editorModel, i, n, this.foldingRangesLimit)); } } -let Bye = class { +let vye = class { constructor(e) { this._startIndexes = [], this._endIndexes = [], this._indentOccurrences = [], this._length = 0, this._foldingRangesLimit = e; } insertFirst(e, t, i) { - if (e > pl || t > pl) + if (e > yr || t > yr) return; const n = this._length; this._startIndexes[n] = e, this._endIndexes[n] = t, this._length++, i < 1e3 && (this._indentOccurrences[i] = (this._indentOccurrences[i] || 0) + 1); @@ -76641,87 +76641,87 @@ let Bye = class { if (this._length <= t) { this._foldingRangesLimit.update(this._length, !1); const i = new Uint32Array(this._length), n = new Uint32Array(this._length); - for (let o = this._length - 1, r = 0; o >= 0; o--, r++) - i[r] = this._startIndexes[o], n[r] = this._endIndexes[o]; - return new To(i, n); + for (let o = this._length - 1, l = 0; o >= 0; o--, l++) + i[l] = this._startIndexes[o], n[l] = this._endIndexes[o]; + return new Yo(i, n); } else { this._foldingRangesLimit.update(this._length, t); let i = 0, n = this._indentOccurrences.length; - for (let a = 0; a < this._indentOccurrences.length; a++) { - const c = this._indentOccurrences[a]; - if (c) { - if (c + i > t) { - n = a; + for (let c = 0; c < this._indentOccurrences.length; c++) { + const d = this._indentOccurrences[c]; + if (d) { + if (d + i > t) { + n = c; break; } - i += c; + i += d; } } - const o = e.getOptions().tabSize, r = new Uint32Array(t), l = new Uint32Array(t); - for (let a = this._length - 1, c = 0; a >= 0; a--) { - const d = this._startIndexes[a], h = e.getLineContent(d), u = fI(h, o); - (u < n || u === n && i++ < t) && (r[c] = d, l[c] = this._endIndexes[a], c++); + const o = e.getOptions().tabSize, l = new Uint32Array(t), r = new Uint32Array(t); + for (let c = this._length - 1, d = 0; c >= 0; c--) { + const a = this._startIndexes[c], h = e.getLineContent(a), u = wx(h, o); + (u < n || u === n && i++ < t) && (l[d] = a, r[d] = this._endIndexes[c], d++); } - return new To(r, l); + return new Yo(l, r); } } }; -const Oye = { - limit: zye, +const Jye = { + limit: Yye, update: () => { } }; -function Hye(s, e, t, i = Oye) { - const n = s.getOptions().tabSize, o = new Bye(i); - let r; - t && (r = new RegExp(`(${t.start.source})|(?:${t.end.source})`)); - const l = [], a = s.getLineCount() + 1; - l.push({ indent: -1, endAbove: a, line: a }); - for (let c = s.getLineCount(); c > 0; c--) { - const d = s.getLineContent(c), h = fI(d, n); - let u = l[l.length - 1]; +function Hye(s, e, t, i = Jye) { + const n = s.getOptions().tabSize, o = new vye(i); + let l; + t && (l = new RegExp(`(${t.start.source})|(?:${t.end.source})`)); + const r = [], c = s.getLineCount() + 1; + r.push({ indent: -1, endAbove: c, line: c }); + for (let d = s.getLineCount(); d > 0; d--) { + const a = s.getLineContent(d), h = wx(a, n); + let u = r[r.length - 1]; if (h === -1) { - e && (u.endAbove = c); + e && (u.endAbove = d); continue; } - let g; - if (r && (g = d.match(r))) - if (g[1]) { - let m = l.length - 1; - for (; m > 0 && l[m].indent !== -2; ) - m--; - if (m > 0) { - l.length = m + 1, u = l[m], o.insertFirst(c, u.line, h), u.line = c, u.indent = h, u.endAbove = c; + let m; + if (l && (m = a.match(l))) + if (m[1]) { + let b = r.length - 1; + for (; b > 0 && r[b].indent !== -2; ) + b--; + if (b > 0) { + r.length = b + 1, u = r[b], o.insertFirst(d, u.line, h), u.line = d, u.indent = h, u.endAbove = d; continue; } } else { - l.push({ indent: -2, endAbove: c, line: c }); + r.push({ indent: -2, endAbove: d, line: d }); continue; } if (u.indent > h) { do - l.pop(), u = l[l.length - 1]; + r.pop(), u = r[r.length - 1]; while (u.indent > h); - const m = u.endAbove - 1; - m - c >= 1 && o.insertFirst(c, m, h); + const b = u.endAbove - 1; + b - d >= 1 && o.insertFirst(d, b, h); } - u.indent === h ? u.endAbove = c : l.push({ indent: h, endAbove: c, line: c }); + u.indent === h ? u.endAbove = d : r.push({ indent: h, endAbove: d, line: d }); } return o.toIndentRanges(s); } -const Jye = N("editor.foldBackground", { light: Pe(Yd, 0.3), dark: Pe(Yd, 0.3), hcDark: null, hcLight: null }, p("foldBackgroundBackground", "Background color behind folded ranges. The color must not be opaque so as not to hide underlying decorations."), !0); -N("editor.foldPlaceholderForeground", { light: "#808080", dark: "#808080", hcDark: null, hcLight: null }, p("collapsedTextColor", "Color of the collapsed text after the first line of a folded range.")); -N("editorGutter.foldingControlForeground", MA, p("editorGutter.foldingControlForeground", "Color of the folding control in the editor gutter.")); -const Ox = Bt("folding-expanded", te.chevronDown, p("foldingExpandedIcon", "Icon for expanded ranges in the editor glyph margin.")), Hx = Bt("folding-collapsed", te.chevronRight, p("foldingCollapsedIcon", "Icon for collapsed ranges in the editor glyph margin.")), B3 = Bt("folding-manual-collapsed", Hx, p("foldingManualCollapedIcon", "Icon for manually collapsed ranges in the editor glyph margin.")), O3 = Bt("folding-manual-expanded", Ox, p("foldingManualExpandedIcon", "Icon for manually expanded ranges in the editor glyph margin.")), GW = { - color: fi(Jye), +const Eye = R("editor.foldBackground", { light: Ae(Ua, 0.3), dark: Ae(Ua, 0.3), hcDark: null, hcLight: null }, p("foldBackgroundBackground", "Background color behind folded ranges. The color must not be opaque so as not to hide underlying decorations."), !0); +R("editor.foldPlaceholderForeground", { light: "#808080", dark: "#808080", hcDark: null, hcLight: null }, p("collapsedTextColor", "Color of the collapsed text after the first line of a folded range.")); +R("editorGutter.foldingControlForeground", DV, p("editorGutter.foldingControlForeground", "Color of the folding control in the editor gutter.")); +const lI = Kt("folding-expanded", te.chevronDown, p("foldingExpandedIcon", "Icon for expanded ranges in the editor glyph margin.")), rI = Kt("folding-collapsed", te.chevronRight, p("foldingCollapsedIcon", "Icon for collapsed ranges in the editor glyph margin.")), pK = Kt("folding-manual-collapsed", rI, p("foldingManualCollapedIcon", "Icon for manually collapsed ranges in the editor glyph margin.")), gK = Kt("folding-manual-expanded", lI, p("foldingManualExpandedIcon", "Icon for manually expanded ranges in the editor glyph margin.")), qR = { + color: Zi(Eye), position: 1 /* MinimapPosition.Inline */ -}, bp = p("linesCollapsed", "Click to expand the range."), XS = p("linesExpanded", "Click to collapse the range."), Ri = class Ri { +}, Xp = p("linesCollapsed", "Click to expand the range."), q1 = p("linesExpanded", "Click to collapse the range."), Hi = class Hi { constructor(e) { this.editor = e, this.showFoldingControls = "mouseover", this.showFoldingHighlights = !0; } getDecorationOption(e, t, i) { - return t ? Ri.HIDDEN_RANGE_DECORATION : this.showFoldingControls === "never" ? e ? this.showFoldingHighlights ? Ri.NO_CONTROLS_COLLAPSED_HIGHLIGHTED_RANGE_DECORATION : Ri.NO_CONTROLS_COLLAPSED_RANGE_DECORATION : Ri.NO_CONTROLS_EXPANDED_RANGE_DECORATION : e ? i ? this.showFoldingHighlights ? Ri.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION : Ri.MANUALLY_COLLAPSED_VISUAL_DECORATION : this.showFoldingHighlights ? Ri.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION : Ri.COLLAPSED_VISUAL_DECORATION : this.showFoldingControls === "mouseover" ? i ? Ri.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION : Ri.EXPANDED_AUTO_HIDE_VISUAL_DECORATION : i ? Ri.MANUALLY_EXPANDED_VISUAL_DECORATION : Ri.EXPANDED_VISUAL_DECORATION; + return t ? Hi.HIDDEN_RANGE_DECORATION : this.showFoldingControls === "never" ? e ? this.showFoldingHighlights ? Hi.NO_CONTROLS_COLLAPSED_HIGHLIGHTED_RANGE_DECORATION : Hi.NO_CONTROLS_COLLAPSED_RANGE_DECORATION : Hi.NO_CONTROLS_EXPANDED_RANGE_DECORATION : e ? i ? this.showFoldingHighlights ? Hi.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION : Hi.MANUALLY_COLLAPSED_VISUAL_DECORATION : this.showFoldingHighlights ? Hi.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION : Hi.COLLAPSED_VISUAL_DECORATION : this.showFoldingControls === "mouseover" ? i ? Hi.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION : Hi.EXPANDED_AUTO_HIDE_VISUAL_DECORATION : i ? Hi.MANUALLY_EXPANDED_VISUAL_DECORATION : Hi.EXPANDED_VISUAL_DECORATION; } changeDecorations(e) { return this.editor.changeDecorations(e); @@ -76730,121 +76730,121 @@ const Ox = Bt("folding-expanded", te.chevronDown, p("foldingExpandedIcon", "Icon this.editor.removeDecorations(e); } }; -Ri.COLLAPSED_VISUAL_DECORATION = Re.register({ +Hi.COLLAPSED_VISUAL_DECORATION = Je.register({ description: "folding-collapsed-visual-decoration", stickiness: 0, afterContentClassName: "inline-folded", isWholeLine: !0, - linesDecorationsTooltip: bp, - firstLineDecorationClassName: Ze.asClassName(Hx) -}), Ri.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION = Re.register({ + linesDecorationsTooltip: Xp, + firstLineDecorationClassName: Se.asClassName(rI) +}), Hi.COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION = Je.register({ description: "folding-collapsed-highlighted-visual-decoration", stickiness: 0, afterContentClassName: "inline-folded", className: "folded-background", - minimap: GW, + minimap: qR, isWholeLine: !0, - linesDecorationsTooltip: bp, - firstLineDecorationClassName: Ze.asClassName(Hx) -}), Ri.MANUALLY_COLLAPSED_VISUAL_DECORATION = Re.register({ + linesDecorationsTooltip: Xp, + firstLineDecorationClassName: Se.asClassName(rI) +}), Hi.MANUALLY_COLLAPSED_VISUAL_DECORATION = Je.register({ description: "folding-manually-collapsed-visual-decoration", stickiness: 0, afterContentClassName: "inline-folded", isWholeLine: !0, - linesDecorationsTooltip: bp, - firstLineDecorationClassName: Ze.asClassName(B3) -}), Ri.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION = Re.register({ + linesDecorationsTooltip: Xp, + firstLineDecorationClassName: Se.asClassName(pK) +}), Hi.MANUALLY_COLLAPSED_HIGHLIGHTED_VISUAL_DECORATION = Je.register({ description: "folding-manually-collapsed-highlighted-visual-decoration", stickiness: 0, afterContentClassName: "inline-folded", className: "folded-background", - minimap: GW, + minimap: qR, isWholeLine: !0, - linesDecorationsTooltip: bp, - firstLineDecorationClassName: Ze.asClassName(B3) -}), Ri.NO_CONTROLS_COLLAPSED_RANGE_DECORATION = Re.register({ + linesDecorationsTooltip: Xp, + firstLineDecorationClassName: Se.asClassName(pK) +}), Hi.NO_CONTROLS_COLLAPSED_RANGE_DECORATION = Je.register({ description: "folding-no-controls-range-decoration", stickiness: 0, afterContentClassName: "inline-folded", isWholeLine: !0, - linesDecorationsTooltip: bp -}), Ri.NO_CONTROLS_COLLAPSED_HIGHLIGHTED_RANGE_DECORATION = Re.register({ + linesDecorationsTooltip: Xp +}), Hi.NO_CONTROLS_COLLAPSED_HIGHLIGHTED_RANGE_DECORATION = Je.register({ description: "folding-no-controls-range-decoration", stickiness: 0, afterContentClassName: "inline-folded", className: "folded-background", - minimap: GW, + minimap: qR, isWholeLine: !0, - linesDecorationsTooltip: bp -}), Ri.EXPANDED_VISUAL_DECORATION = Re.register({ + linesDecorationsTooltip: Xp +}), Hi.EXPANDED_VISUAL_DECORATION = Je.register({ description: "folding-expanded-visual-decoration", stickiness: 1, isWholeLine: !0, - firstLineDecorationClassName: "alwaysShowFoldIcons " + Ze.asClassName(Ox), - linesDecorationsTooltip: XS -}), Ri.EXPANDED_AUTO_HIDE_VISUAL_DECORATION = Re.register({ + firstLineDecorationClassName: "alwaysShowFoldIcons " + Se.asClassName(lI), + linesDecorationsTooltip: q1 +}), Hi.EXPANDED_AUTO_HIDE_VISUAL_DECORATION = Je.register({ description: "folding-expanded-auto-hide-visual-decoration", stickiness: 1, isWholeLine: !0, - firstLineDecorationClassName: Ze.asClassName(Ox), - linesDecorationsTooltip: XS -}), Ri.MANUALLY_EXPANDED_VISUAL_DECORATION = Re.register({ + firstLineDecorationClassName: Se.asClassName(lI), + linesDecorationsTooltip: q1 +}), Hi.MANUALLY_EXPANDED_VISUAL_DECORATION = Je.register({ description: "folding-manually-expanded-visual-decoration", stickiness: 0, isWholeLine: !0, - firstLineDecorationClassName: "alwaysShowFoldIcons " + Ze.asClassName(O3), - linesDecorationsTooltip: XS -}), Ri.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION = Re.register({ + firstLineDecorationClassName: "alwaysShowFoldIcons " + Se.asClassName(gK), + linesDecorationsTooltip: q1 +}), Hi.MANUALLY_EXPANDED_AUTO_HIDE_VISUAL_DECORATION = Je.register({ description: "folding-manually-expanded-auto-hide-visual-decoration", stickiness: 0, isWholeLine: !0, - firstLineDecorationClassName: Ze.asClassName(O3), - linesDecorationsTooltip: XS -}), Ri.NO_CONTROLS_EXPANDED_RANGE_DECORATION = Re.register({ + firstLineDecorationClassName: Se.asClassName(gK), + linesDecorationsTooltip: q1 +}), Hi.NO_CONTROLS_EXPANDED_RANGE_DECORATION = Je.register({ description: "folding-no-controls-range-decoration", stickiness: 0, isWholeLine: !0 -}), Ri.HIDDEN_RANGE_DECORATION = Re.register({ +}), Hi.HIDDEN_RANGE_DECORATION = Je.register({ description: "folding-hidden-range-decoration", stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ }); -let FD = Ri; -const Uye = {}, Kye = "syntax"; -class z5 { +let r9 = Hi; +const Dye = {}, Fye = "syntax"; +class mE { constructor(e, t, i, n, o) { - this.editorModel = e, this.providers = t, this.handleFoldingRangesChange = i, this.foldingRangesLimit = n, this.fallbackRangeProvider = o, this.id = Kye, this.disposables = new U(), o && this.disposables.add(o); - for (const r of t) - typeof r.onDidChange == "function" && this.disposables.add(r.onDidChange(i)); + this.editorModel = e, this.providers = t, this.handleFoldingRangesChange = i, this.foldingRangesLimit = n, this.fallbackRangeProvider = o, this.id = Fye, this.disposables = new _(), o && this.disposables.add(o); + for (const l of t) + typeof l.onDidChange == "function" && this.disposables.add(l.onDidChange(i)); } compute(e) { - return Qye(this.providers, this.editorModel, e).then((t) => { + return zye(this.providers, this.editorModel, e).then((t) => { var i; - return t ? qye(t, this.foldingRangesLimit) : ((i = this.fallbackRangeProvider) == null ? void 0 : i.compute(e)) ?? null; + return t ? Kye(t, this.foldingRangesLimit) : ((i = this.fallbackRangeProvider) == null ? void 0 : i.compute(e)) ?? null; }); } dispose() { this.disposables.dispose(); } } -function Qye(s, e, t) { +function zye(s, e, t) { let i = null; - const n = s.map((o, r) => Promise.resolve(o.provideFoldingRanges(e, Uye, t)).then((l) => { - if (!t.isCancellationRequested && Array.isArray(l)) { + const n = s.map((o, l) => Promise.resolve(o.provideFoldingRanges(e, Dye, t)).then((r) => { + if (!t.isCancellationRequested && Array.isArray(r)) { Array.isArray(i) || (i = []); - const a = e.getLineCount(); - for (const c of l) - c.start > 0 && c.end > c.start && c.end <= a && i.push({ start: c.start, end: c.end, rank: r, kind: c.kind }); + const c = e.getLineCount(); + for (const d of r) + d.start > 0 && d.end > d.start && d.end <= c && i.push({ start: d.start, end: d.end, rank: l, kind: d.kind }); } - }, wi)); + }, Wi)); return Promise.all(n).then((o) => i); } -class jye { +class Aye { constructor(e) { this._startIndexes = [], this._endIndexes = [], this._nestingLevels = [], this._nestingLevelCounts = [], this._types = [], this._length = 0, this._foldingRangesLimit = e; } add(e, t, i, n) { - if (e > pl || t > pl) + if (e > yr || t > yr) return; const o = this._length; this._startIndexes[o] = e, this._endIndexes[o] = t, this._nestingLevels[o] = n, this._types[o] = i, this._length++, n < 30 && (this._nestingLevelCounts[n] = (this._nestingLevelCounts[n] || 0) + 1); @@ -76856,134 +76856,134 @@ class jye { const t = new Uint32Array(this._length), i = new Uint32Array(this._length); for (let n = 0; n < this._length; n++) t[n] = this._startIndexes[n], i[n] = this._endIndexes[n]; - return new To(t, i, this._types); + return new Yo(t, i, this._types); } else { this._foldingRangesLimit.update(this._length, e); let t = 0, i = this._nestingLevelCounts.length; - for (let l = 0; l < this._nestingLevelCounts.length; l++) { - const a = this._nestingLevelCounts[l]; - if (a) { - if (a + t > e) { - i = l; + for (let r = 0; r < this._nestingLevelCounts.length; r++) { + const c = this._nestingLevelCounts[r]; + if (c) { + if (c + t > e) { + i = r; break; } - t += a; + t += c; } } - const n = new Uint32Array(e), o = new Uint32Array(e), r = []; - for (let l = 0, a = 0; l < this._length; l++) { - const c = this._nestingLevels[l]; - (c < i || c === i && t++ < e) && (n[a] = this._startIndexes[l], o[a] = this._endIndexes[l], r[a] = this._types[l], a++); + const n = new Uint32Array(e), o = new Uint32Array(e), l = []; + for (let r = 0, c = 0; r < this._length; r++) { + const d = this._nestingLevels[r]; + (d < i || d === i && t++ < e) && (n[c] = this._startIndexes[r], o[c] = this._endIndexes[r], l[c] = this._types[r], c++); } - return new To(n, o, r); + return new Yo(n, o, l); } } } -function qye(s, e) { - const t = s.sort((r, l) => { - let a = r.start - l.start; - return a === 0 && (a = r.rank - l.rank), a; - }), i = new jye(e); +function Kye(s, e) { + const t = s.sort((l, r) => { + let c = l.start - r.start; + return c === 0 && (c = l.rank - r.rank), c; + }), i = new Aye(e); let n; const o = []; - for (const r of t) + for (const l of t) if (!n) - n = r, i.add(r.start, r.end, r.kind && r.kind.value, o.length); - else if (r.start > n.start) - if (r.end <= n.end) - o.push(n), n = r, i.add(r.start, r.end, r.kind && r.kind.value, o.length); + n = l, i.add(l.start, l.end, l.kind && l.kind.value, o.length); + else if (l.start > n.start) + if (l.end <= n.end) + o.push(n), n = l, i.add(l.start, l.end, l.kind && l.kind.value, o.length); else { - if (r.start > n.end) { + if (l.start > n.end) { do n = o.pop(); - while (n && r.start > n.end); - n && o.push(n), n = r; + while (n && l.start > n.end); + n && o.push(n), n = l; } - i.add(r.start, r.end, r.kind && r.kind.value, o.length); + i.add(l.start, l.end, l.kind && l.kind.value, o.length); } return i.toIndentRanges(); } -var $ye = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Uye = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, H0 = function(s, e) { +}, $0 = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Nu; -const Wn = new ae("foldingEnabled", !1); -var Eg; -let Bh = (Eg = class extends R { +}, Yu; +const wn = new ce("foldingEnabled", !1); +var Am; +let _h = (Am = class extends J { static get(e) { - return e.getContribution(Nu.ID); + return e.getContribution(Yu.ID); } static getFoldingRangeProviders(e, t) { var n; const i = e.foldingRangeProvider.ordered(t); - return ((n = Nu._foldingRangeSelector) == null ? void 0 : n.call(Nu, i, t)) ?? i; + return ((n = Yu._foldingRangeSelector) == null ? void 0 : n.call(Yu, i, t)) ?? i; } - constructor(e, t, i, n, o, r) { - super(), this.contextKeyService = t, this.languageConfigurationService = i, this.languageFeaturesService = r, this.localToDispose = this._register(new U()), this.editor = e, this._foldingLimitReporter = new Zj(e); - const l = this.editor.getOptions(); - this._isEnabled = l.get( + constructor(e, t, i, n, o, l) { + super(), this.contextKeyService = t, this.languageConfigurationService = i, this.languageFeaturesService = l, this.localToDispose = this._register(new _()), this.editor = e, this._foldingLimitReporter = new c7(e); + const r = this.editor.getOptions(); + this._isEnabled = r.get( 43 /* EditorOption.folding */ - ), this._useFoldingProviders = l.get( + ), this._useFoldingProviders = r.get( 44 /* EditorOption.foldingStrategy */ - ) !== "indentation", this._unfoldOnClickAfterEndOfLine = l.get( + ) !== "indentation", this._unfoldOnClickAfterEndOfLine = r.get( 48 /* EditorOption.unfoldOnClickAfterEndOfLine */ - ), this._restoringViewState = !1, this._currentModelHasFoldedImports = !1, this._foldingImportsByDefault = l.get( + ), this._restoringViewState = !1, this._currentModelHasFoldedImports = !1, this._foldingImportsByDefault = r.get( 46 /* EditorOption.foldingImportsByDefault */ - ), this.updateDebounceInfo = o.for(r.foldingRangeProvider, "Folding", { min: 200 }), this.foldingModel = null, this.hiddenRangeModel = null, this.rangeProvider = null, this.foldingRegionPromise = null, this.foldingModelPromise = null, this.updateScheduler = null, this.cursorChangedScheduler = null, this.mouseDownInfo = null, this.foldingDecorationProvider = new FD(e), this.foldingDecorationProvider.showFoldingControls = l.get( + ), this.updateDebounceInfo = o.for(l.foldingRangeProvider, "Folding", { min: 200 }), this.foldingModel = null, this.hiddenRangeModel = null, this.rangeProvider = null, this.foldingRegionPromise = null, this.foldingModelPromise = null, this.updateScheduler = null, this.cursorChangedScheduler = null, this.mouseDownInfo = null, this.foldingDecorationProvider = new r9(e), this.foldingDecorationProvider.showFoldingControls = r.get( 111 /* EditorOption.showFoldingControls */ - ), this.foldingDecorationProvider.showFoldingHighlights = l.get( + ), this.foldingDecorationProvider.showFoldingHighlights = r.get( 45 /* EditorOption.foldingHighlight */ - ), this.foldingEnabled = Wn.bindTo(this.contextKeyService), this.foldingEnabled.set(this._isEnabled), this._register(this.editor.onDidChangeModel(() => this.onModelChanged())), this._register(this.editor.onDidChangeConfiguration((a) => { - if (a.hasChanged( + ), this.foldingEnabled = wn.bindTo(this.contextKeyService), this.foldingEnabled.set(this._isEnabled), this._register(this.editor.onDidChangeModel(() => this.onModelChanged())), this._register(this.editor.onDidChangeConfiguration((c) => { + if (c.hasChanged( 43 /* EditorOption.folding */ ) && (this._isEnabled = this.editor.getOptions().get( 43 /* EditorOption.folding */ - ), this.foldingEnabled.set(this._isEnabled), this.onModelChanged()), a.hasChanged( + ), this.foldingEnabled.set(this._isEnabled), this.onModelChanged()), c.hasChanged( 47 /* EditorOption.foldingMaximumRegions */ - ) && this.onModelChanged(), a.hasChanged( + ) && this.onModelChanged(), c.hasChanged( 111 /* EditorOption.showFoldingControls */ - ) || a.hasChanged( + ) || c.hasChanged( 45 /* EditorOption.foldingHighlight */ )) { - const c = this.editor.getOptions(); - this.foldingDecorationProvider.showFoldingControls = c.get( + const d = this.editor.getOptions(); + this.foldingDecorationProvider.showFoldingControls = d.get( 111 /* EditorOption.showFoldingControls */ - ), this.foldingDecorationProvider.showFoldingHighlights = c.get( + ), this.foldingDecorationProvider.showFoldingHighlights = d.get( 45 /* EditorOption.foldingHighlight */ ), this.triggerFoldingModelChanged(); } - a.hasChanged( + c.hasChanged( 44 /* EditorOption.foldingStrategy */ ) && (this._useFoldingProviders = this.editor.getOptions().get( 44 /* EditorOption.foldingStrategy */ - ) !== "indentation", this.onFoldingStrategyChanged()), a.hasChanged( + ) !== "indentation", this.onFoldingStrategyChanged()), c.hasChanged( 48 /* EditorOption.unfoldOnClickAfterEndOfLine */ ) && (this._unfoldOnClickAfterEndOfLine = this.editor.getOptions().get( 48 /* EditorOption.unfoldOnClickAfterEndOfLine */ - )), a.hasChanged( + )), c.hasChanged( 46 /* EditorOption.foldingImportsByDefault */ ) && (this._foldingImportsByDefault = this.editor.getOptions().get( @@ -77021,7 +77021,7 @@ let Bh = (Eg = class extends R { onModelChanged() { this.localToDispose.clear(); const e = this.editor.getModel(); - !this._isEnabled || !e || e.isTooLargeForTokenization() || (this._currentModelHasFoldedImports = !1, this.foldingModel = new Vye(e, this.foldingDecorationProvider), this.localToDispose.add(this.foldingModel), this.hiddenRangeModel = new Fye(this.foldingModel), this.localToDispose.add(this.hiddenRangeModel), this.localToDispose.add(this.hiddenRangeModel.onDidChange((t) => this.onHiddenRangesChanges(t))), this.updateScheduler = new fr(this.updateDebounceInfo.get(e)), this.cursorChangedScheduler = new Zt(() => this.revealCursor(), 200), this.localToDispose.add(this.cursorChangedScheduler), this.localToDispose.add(this.languageFeaturesService.foldingRangeProvider.onDidChange(() => this.onFoldingStrategyChanged())), this.localToDispose.add(this.editor.onDidChangeModelLanguageConfiguration(() => this.onFoldingStrategyChanged())), this.localToDispose.add(this.editor.onDidChangeModelContent((t) => this.onDidChangeModelContent(t))), this.localToDispose.add(this.editor.onDidChangeCursorPosition(() => this.onCursorPositionChanged())), this.localToDispose.add(this.editor.onMouseDown((t) => this.onEditorMouseDown(t))), this.localToDispose.add(this.editor.onMouseUp((t) => this.onEditorMouseUp(t))), this.localToDispose.add({ + !this._isEnabled || !e || e.isTooLargeForTokenization() || (this._currentModelHasFoldedImports = !1, this.foldingModel = new Sye(e, this.foldingDecorationProvider), this.localToDispose.add(this.foldingModel), this.hiddenRangeModel = new Tye(this.foldingModel), this.localToDispose.add(this.hiddenRangeModel), this.localToDispose.add(this.hiddenRangeModel.onDidChange((t) => this.onHiddenRangesChanges(t))), this.updateScheduler = new yl(this.updateDebounceInfo.get(e)), this.cursorChangedScheduler = new St(() => this.revealCursor(), 200), this.localToDispose.add(this.cursorChangedScheduler), this.localToDispose.add(this.languageFeaturesService.foldingRangeProvider.onDidChange(() => this.onFoldingStrategyChanged())), this.localToDispose.add(this.editor.onDidChangeModelLanguageConfiguration(() => this.onFoldingStrategyChanged())), this.localToDispose.add(this.editor.onDidChangeModelContent((t) => this.onDidChangeModelContent(t))), this.localToDispose.add(this.editor.onDidChangeCursorPosition(() => this.onCursorPositionChanged())), this.localToDispose.add(this.editor.onMouseDown((t) => this.onEditorMouseDown(t))), this.localToDispose.add(this.editor.onMouseUp((t) => this.onEditorMouseUp(t))), this.localToDispose.add({ dispose: () => { var t, i; this.foldingRegionPromise && (this.foldingRegionPromise.cancel(), this.foldingRegionPromise = null), (t = this.updateScheduler) == null || t.cancel(), this.updateScheduler = null, this.foldingModel = null, this.foldingModelPromise = null, this.hiddenRangeModel = null, this.cursorChangedScheduler = null, (i = this.rangeProvider) == null || i.dispose(), this.rangeProvider = null; @@ -77035,10 +77035,10 @@ let Bh = (Eg = class extends R { getRangeProvider(e) { if (this.rangeProvider) return this.rangeProvider; - const t = new Y5(e, this.languageConfigurationService, this._foldingLimitReporter); + const t = new uE(e, this.languageConfigurationService, this._foldingLimitReporter); if (this.rangeProvider = t, this._useFoldingProviders && this.foldingModel) { - const i = Nu.getFoldingRangeProviders(this.languageFeaturesService, e); - i.length > 0 && (this.rangeProvider = new z5(e, i, () => this.triggerFoldingModelChanged(), this._foldingLimitReporter, t)); + const i = Yu.getFoldingRangeProviders(this.languageFeaturesService, e); + i.length > 0 && (this.rangeProvider = new mE(e, i, () => this.triggerFoldingModelChanged(), this._foldingLimitReporter, t)); } return this.rangeProvider; } @@ -77054,22 +77054,22 @@ let Bh = (Eg = class extends R { const e = this.foldingModel; if (!e) return null; - const t = new on(), i = this.getRangeProvider(e.textModel), n = this.foldingRegionPromise = Ui((o) => i.compute(o)); + const t = new ln(), i = this.getRangeProvider(e.textModel), n = this.foldingRegionPromise = Qi((o) => i.compute(o)); return n.then((o) => { if (o && n === this.foldingRegionPromise) { - let r; + let l; if (this._foldingImportsByDefault && !this._currentModelHasFoldedImports) { - const c = o.setCollapsedAllOfType(r0.Imports.value, !0); - c && (r = Vl.capture(this.editor), this._currentModelHasFoldedImports = c); + const d = o.setCollapsedAllOfType(u0.Imports.value, !0); + d && (l = Hr.capture(this.editor), this._currentModelHasFoldedImports = d); } - const l = this.editor.getSelections(); - e.update(o, ewe(l)), r == null || r.restore(this.editor); - const a = this.updateDebounceInfo.update(e.textModel, t.elapsed()); - this.updateScheduler && (this.updateScheduler.defaultDelay = a); + const r = this.editor.getSelections(); + e.update(o, Pye(r)), l == null || l.restore(this.editor); + const c = this.updateDebounceInfo.update(e.textModel, t.elapsed()); + this.updateScheduler && (this.updateScheduler.defaultDelay = c); } return e; }); - }).then(void 0, (e) => (De(e), null))); + }).then(void 0, (e) => (Me(e), null))); } onHiddenRangesChanges(e) { if (this.hiddenRangeModel && e.length && !this._restoringViewState) { @@ -77089,13 +77089,13 @@ let Bh = (Eg = class extends R { if (i && i.length > 0) { const n = []; for (const o of i) { - const r = o.selectionStartLineNumber; - this.hiddenRangeModel && this.hiddenRangeModel.isHidden(r) && n.push(...t.getAllRegionsAtLine(r, (l) => l.isCollapsed && r > l.startLineNumber)); + const l = o.selectionStartLineNumber; + this.hiddenRangeModel && this.hiddenRangeModel.isHidden(l) && n.push(...t.getAllRegionsAtLine(l, (r) => r.isCollapsed && l > r.startLineNumber)); } n.length && (t.toggleCollapseState(n), this.reveal(i[0].getPosition())); } } - }).then(void 0, De); + }).then(void 0, Me); } onEditorMouseDown(e) { if (this.mouseDownInfo = null, !this.hiddenRangeModel || !e.target || !e.target.range || !e.event.leftButton && !e.event.middleButton) @@ -77139,29 +77139,29 @@ let Bh = (Eg = class extends R { if (e.target.type !== 4) return; } else { - const l = this.editor.getModel(); - if (!l || o.startColumn !== l.getLineMaxColumn(i)) + const r = this.editor.getModel(); + if (!r || o.startColumn !== r.getLineMaxColumn(i)) return; } - const r = t.getRegionAtLine(i); - if (r && r.startLineNumber === i) { - const l = r.isCollapsed; - if (n || l) { - const a = e.event.altKey; - let c = []; - if (a) { - const d = (u) => !u.containedBy(r) && !r.containedBy(u), h = t.getRegionsInside(null, d); + const l = t.getRegionAtLine(i); + if (l && l.startLineNumber === i) { + const r = l.isCollapsed; + if (n || r) { + const c = e.event.altKey; + let d = []; + if (c) { + const a = (u) => !u.containedBy(l) && !l.containedBy(u), h = t.getRegionsInside(null, a); for (const u of h) - u.isCollapsed && c.push(u); - c.length === 0 && (c = h); + u.isCollapsed && d.push(u); + d.length === 0 && (d = h); } else { - const d = e.event.middleButton || e.event.shiftKey; - if (d) - for (const h of t.getRegionsInside(r)) - h.isCollapsed === l && c.push(h); - (l || !d || c.length === 0) && c.push(r); + const a = e.event.middleButton || e.event.shiftKey; + if (a) + for (const h of t.getRegionsInside(l)) + h.isCollapsed === r && d.push(h); + (r || !a || d.length === 0) && d.push(l); } - t.toggleCollapseState(c), this.reveal({ lineNumber: i, column: 1 }); + t.toggleCollapseState(d), this.reveal({ lineNumber: i, column: 1 }); } } } @@ -77172,15 +77172,15 @@ let Bh = (Eg = class extends R { /* ScrollType.Smooth */ ); } -}, Nu = Eg, Eg.ID = "editor.contrib.folding", Eg); -Bh = Nu = $ye([ - H0(1, _e), - H0(2, li), - H0(3, Vi), - H0(4, jo), - H0(5, ge) -], Bh); -class Zj { +}, Yu = Am, Am.ID = "editor.contrib.folding", Am); +_h = Yu = Uye([ + $0(1, xe), + $0(2, ci), + $0(3, vi), + $0(4, $o), + $0(5, me) +], _h); +class c7 { constructor(e) { this.editor = e, this._onDidChange = new k(), this._computed = 0, this._limited = !1; } @@ -77194,18 +77194,18 @@ class Zj { (e !== this._computed || t !== this._limited) && (this._computed = e, this._limited = t, this._onDidChange.fire()); } } -class Yn extends he { +class An extends he { runEditorCommand(e, t, i) { - const n = e.get(li), o = Bh.get(t); + const n = e.get(ci), o = _h.get(t); if (!o) return; - const r = o.getFoldingModel(); - if (r) - return this.reportTelemetry(e, t), r.then((l) => { - if (l) { - this.invoke(o, l, t, i, n); - const a = t.getSelection(); - a && o.reveal(a.getStartPosition()); + const l = o.getFoldingModel(); + if (l) + return this.reportTelemetry(e, t), l.then((r) => { + if (r) { + this.invoke(o, r, t, i, n); + const c = t.getSelection(); + c && o.reveal(c.getStartPosition()); } }); } @@ -77219,7 +77219,7 @@ class Yn extends he { run(e, t) { } } -function ewe(s) { +function Pye(s) { return !s || s.length === 0 ? { startsInside: () => !1 } : { @@ -77233,25 +77233,25 @@ function ewe(s) { } }; } -function _j(s) { - if (!jn(s)) { - if (!tn(s)) +function d7(s) { + if (!$n(s)) { + if (!nn(s)) return !1; const e = s; - if (!jn(e.levels) && !Mh(e.levels) || !jn(e.direction) && !Vs(e.direction) || !jn(e.selectionLines) && (!Array.isArray(e.selectionLines) || !e.selectionLines.every(Mh))) + if (!$n(e.levels) && !Rh(e.levels) || !$n(e.direction) && !vs(e.direction) || !$n(e.selectionLines) && (!Array.isArray(e.selectionLines) || !e.selectionLines.every(Rh))) return !1; } return !0; } -class twe extends Yn { +class Bye extends An { constructor() { super({ id: "editor.unfold", label: p("unfoldAction.label", "Unfold"), alias: "Unfold", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 3166, mac: { primary: 2654 @@ -77270,7 +77270,7 @@ class twe extends Yn { * 'direction': If 'up', unfold given number of levels up otherwise unfolds down. * 'selectionLines': Array of the start lines (0-based) of the editor selections to apply the unfold action to. If not set, the active selection(s) will be used. `, - constraint: _j, + constraint: d7, schema: { type: "object", properties: { @@ -77297,20 +77297,20 @@ class twe extends Yn { }); } invoke(e, t, i, n) { - const o = n && n.levels || 1, r = this.getLineNumbers(n, i); - n && n.direction === "up" ? xj(t, !1, o, r) : w0(t, !1, o, r); + const o = n && n.levels || 1, l = this.getLineNumbers(n, i); + n && n.direction === "up" ? l7(t, !1, o, l) : I0(t, !1, o, l); } } -class iwe extends Yn { +class _ye extends An { constructor() { super({ id: "editor.unfoldRecursively", label: p("unFoldRecursivelyAction.label", "Unfold Recursively"), alias: "Unfold Recursively", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2142 /* KeyCode.BracketRight */ @@ -77321,18 +77321,18 @@ class iwe extends Yn { }); } invoke(e, t, i, n) { - w0(t, !1, Number.MAX_VALUE, this.getSelectedLines(i)); + I0(t, !1, Number.MAX_VALUE, this.getSelectedLines(i)); } } -class nwe extends Yn { +class Qye extends An { constructor() { super({ id: "editor.fold", label: p("foldAction.label", "Fold"), alias: "Fold", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 3164, mac: { primary: 2652 @@ -77352,7 +77352,7 @@ class nwe extends Yn { * 'selectionLines': Array of the start lines (0-based) of the editor selections to apply the fold action to. If not set, the active selection(s) will be used. If no levels or direction is set, folds the region at the locations or if already collapsed, the first uncollapsed parent instead. `, - constraint: _j, + constraint: d7, schema: { type: "object", properties: { @@ -77377,20 +77377,20 @@ class nwe extends Yn { }); } invoke(e, t, i, n) { - const o = this.getLineNumbers(n, i), r = n && n.levels, l = n && n.direction; - typeof r != "number" && typeof l != "string" ? kye(t, !0, o) : l === "up" ? xj(t, !0, r || 1, o) : w0(t, !0, r || 1, o); + const o = this.getLineNumbers(n, i), l = n && n.levels, r = n && n.direction; + typeof l != "number" && typeof r != "string" ? xye(t, !0, o) : r === "up" ? l7(t, !0, l || 1, o) : I0(t, !0, l || 1, o); } } -class swe extends Yn { +class Oye extends An { constructor() { super({ id: "editor.toggleFold", label: p("toggleFoldAction.label", "Toggle Fold"), alias: "Toggle Fold", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2090 /* KeyCode.KeyL */ @@ -77402,19 +77402,19 @@ class swe extends Yn { } invoke(e, t, i) { const n = this.getSelectedLines(i); - E5(t, 1, n); + dE(t, 1, n); } } -class owe extends Yn { +class jye extends An { constructor() { super({ id: "editor.foldRecursively", label: p("foldRecursivelyAction.label", "Fold Recursively"), alias: "Fold Recursively", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2140 /* KeyCode.BracketLeft */ @@ -77426,19 +77426,19 @@ class owe extends Yn { } invoke(e, t, i) { const n = this.getSelectedLines(i); - w0(t, !0, Number.MAX_VALUE, n); + I0(t, !0, Number.MAX_VALUE, n); } } -class rwe extends Yn { +class qye extends An { constructor() { super({ id: "editor.toggleFoldRecursively", label: p("toggleFoldRecursivelyAction.label", "Toggle Fold Recursively"), alias: "Toggle Fold Recursively", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 3114 /* KeyCode.KeyL */ @@ -77450,19 +77450,19 @@ class rwe extends Yn { } invoke(e, t, i) { const n = this.getSelectedLines(i); - E5(t, Number.MAX_VALUE, n); + dE(t, Number.MAX_VALUE, n); } } -class lwe extends Yn { +class $ye extends An { constructor() { super({ id: "editor.foldAllBlockComments", label: p("foldAllBlockComments.label", "Fold All Block Comments"), alias: "Fold All Block Comments", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2138 /* KeyCode.Slash */ @@ -77474,29 +77474,29 @@ class lwe extends Yn { } invoke(e, t, i, n, o) { if (t.regions.hasTypes()) - F5(t, r0.Comment.value, !0); + hE(t, u0.Comment.value, !0); else { - const r = i.getModel(); - if (!r) + const l = i.getModel(); + if (!l) return; - const l = o.getLanguageConfiguration(r.getLanguageId()).comments; - if (l && l.blockCommentStartToken) { - const a = new RegExp("^\\s*" + Po(l.blockCommentStartToken)); - X5(t, a, !0); + const r = o.getLanguageConfiguration(l.getLanguageId()).comments; + if (r && r.blockCommentStartToken) { + const c = new RegExp("^\\s*" + Uo(r.blockCommentStartToken)); + aE(t, c, !0); } } } } -class awe extends Yn { +class eWe extends An { constructor() { super({ id: "editor.foldAllMarkerRegions", label: p("foldAllMarkerRegions.label", "Fold All Regions"), alias: "Fold All Regions", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2077 /* KeyCode.Digit8 */ @@ -77508,29 +77508,29 @@ class awe extends Yn { } invoke(e, t, i, n, o) { if (t.regions.hasTypes()) - F5(t, r0.Region.value, !0); + hE(t, u0.Region.value, !0); else { - const r = i.getModel(); - if (!r) + const l = i.getModel(); + if (!l) return; - const l = o.getLanguageConfiguration(r.getLanguageId()).foldingRules; - if (l && l.markers && l.markers.start) { - const a = new RegExp(l.markers.start); - X5(t, a, !0); + const r = o.getLanguageConfiguration(l.getLanguageId()).foldingRules; + if (r && r.markers && r.markers.start) { + const c = new RegExp(r.markers.start); + aE(t, c, !0); } } } } -class cwe extends Yn { +class tWe extends An { constructor() { super({ id: "editor.unfoldAllMarkerRegions", label: p("unfoldAllMarkerRegions.label", "Unfold All Regions"), alias: "Unfold All Regions", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2078 /* KeyCode.Digit9 */ @@ -77542,29 +77542,29 @@ class cwe extends Yn { } invoke(e, t, i, n, o) { if (t.regions.hasTypes()) - F5(t, r0.Region.value, !1); + hE(t, u0.Region.value, !1); else { - const r = i.getModel(); - if (!r) + const l = i.getModel(); + if (!l) return; - const l = o.getLanguageConfiguration(r.getLanguageId()).foldingRules; - if (l && l.markers && l.markers.start) { - const a = new RegExp(l.markers.start); - X5(t, a, !1); + const r = o.getLanguageConfiguration(l.getLanguageId()).foldingRules; + if (r && r.markers && r.markers.start) { + const c = new RegExp(r.markers.start); + aE(t, c, !1); } } } } -class dwe extends Yn { +class iWe extends An { constructor() { super({ id: "editor.foldAllExcept", label: p("foldAllExcept.label", "Fold All Except Selected"), alias: "Fold All Except Selected", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2136 /* KeyCode.Minus */ @@ -77576,19 +77576,19 @@ class dwe extends Yn { } invoke(e, t, i) { const n = this.getSelectedLines(i); - Mj(t, !0, n); + r7(t, !0, n); } } -class hwe extends Yn { +class nWe extends An { constructor() { super({ id: "editor.unfoldAllExcept", label: p("unfoldAllExcept.label", "Unfold All Except Selected"), alias: "Unfold All Except Selected", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2134 /* KeyCode.Equal */ @@ -77600,19 +77600,19 @@ class hwe extends Yn { } invoke(e, t, i) { const n = this.getSelectedLines(i); - Mj(t, !1, n); + r7(t, !1, n); } } -class uwe extends Yn { +class sWe extends An { constructor() { super({ id: "editor.foldAll", label: p("foldAllAction.label", "Fold All"), alias: "Fold All", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2069 /* KeyCode.Digit0 */ @@ -77623,19 +77623,19 @@ class uwe extends Yn { }); } invoke(e, t, i) { - w0(t, !0); + I0(t, !0); } } -class gwe extends Yn { +class oWe extends An { constructor() { super({ id: "editor.unfoldAll", label: p("unfoldAllAction.label", "Unfold All"), alias: "Unfold All", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2088 /* KeyCode.KeyJ */ @@ -77646,28 +77646,28 @@ class gwe extends Yn { }); } invoke(e, t, i) { - w0(t, !1); + I0(t, !1); } } -const mf = class mf extends Yn { +const Wg = class Wg extends An { getFoldingLevel() { - return parseInt(this.id.substr(mf.ID_PREFIX.length)); + return parseInt(this.id.substr(Wg.ID_PREFIX.length)); } invoke(e, t, i) { - Gye(t, this.getFoldingLevel(), !0, this.getSelectedLines(i)); + Cye(t, this.getFoldingLevel(), !0, this.getSelectedLines(i)); } }; -mf.ID_PREFIX = "editor.foldLevel", mf.ID = (e) => mf.ID_PREFIX + e; -let Jx = mf; -class mwe extends Yn { +Wg.ID_PREFIX = "editor.foldLevel", Wg.ID = (e) => Wg.ID_PREFIX + e; +let cI = Wg; +class lWe extends An { constructor() { super({ id: "editor.gotoParentFold", label: p("gotoParentFold.label", "Go to Parent Fold"), alias: "Go to Parent Fold", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, weight: 100 /* KeybindingWeight.EditorContrib */ } @@ -77686,15 +77686,15 @@ class mwe extends Yn { } } } -class pwe extends Yn { +class rWe extends An { constructor() { super({ id: "editor.gotoPreviousFold", label: p("gotoPreviousFold.label", "Go to Previous Folding Range"), alias: "Go to Previous Folding Range", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, weight: 100 /* KeybindingWeight.EditorContrib */ } @@ -77703,7 +77703,7 @@ class pwe extends Yn { invoke(e, t, i) { const n = this.getSelectedLines(i); if (n.length > 0) { - const o = Eye(n[0], t); + const o = Nye(n[0], t); o !== null && i.setSelection({ startLineNumber: o, startColumn: 1, @@ -77713,15 +77713,15 @@ class pwe extends Yn { } } } -class fwe extends Yn { +class cWe extends An { constructor() { super({ id: "editor.gotoNextFold", label: p("gotoNextFold.label", "Go to Next Folding Range"), alias: "Go to Next Folding Range", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, weight: 100 /* KeybindingWeight.EditorContrib */ } @@ -77730,7 +77730,7 @@ class fwe extends Yn { invoke(e, t, i) { const n = this.getSelectedLines(i); if (n.length > 0) { - const o = Xye(n[0], t); + const o = wye(n[0], t); o !== null && i.setSelection({ startLineNumber: o, startColumn: 1, @@ -77740,16 +77740,16 @@ class fwe extends Yn { } } } -class bwe extends Yn { +class dWe extends An { constructor() { super({ id: "editor.createFoldingRangeFromSelection", label: p("createManualFoldRange.label", "Create Folding Range from Selection"), alias: "Create Folding Range from Selection", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2135 /* KeyCode.Comma */ @@ -77760,43 +77760,43 @@ class bwe extends Yn { }); } invoke(e, t, i) { - var r; + var l; const n = [], o = i.getSelections(); if (o) { - for (const l of o) { - let a = l.endLineNumber; - l.endColumn === 1 && --a, a > l.startLineNumber && (n.push({ - startLineNumber: l.startLineNumber, - endLineNumber: a, + for (const r of o) { + let c = r.endLineNumber; + r.endColumn === 1 && --c, c > r.startLineNumber && (n.push({ + startLineNumber: r.startLineNumber, + endLineNumber: c, type: void 0, isCollapsed: !0, source: 1 /* FoldSource.userDefined */ }), i.setSelection({ - startLineNumber: l.startLineNumber, + startLineNumber: r.startLineNumber, startColumn: 1, - endLineNumber: l.startLineNumber, + endLineNumber: r.startLineNumber, endColumn: 1 })); } if (n.length > 0) { - n.sort((a, c) => a.startLineNumber - c.startLineNumber); - const l = To.sanitizeAndMerge(t.regions, n, (r = i.getModel()) == null ? void 0 : r.getLineCount()); - t.updatePost(To.fromFoldRanges(l)); + n.sort((c, d) => c.startLineNumber - d.startLineNumber); + const r = Yo.sanitizeAndMerge(t.regions, n, (l = i.getModel()) == null ? void 0 : l.getLineCount()); + t.updatePost(Yo.fromFoldRanges(r)); } } } } -class ywe extends Yn { +class aWe extends An { constructor() { super({ id: "editor.removeManualFoldingRanges", label: p("removeManualFoldingRanges.label", "Remove Manual Folding Ranges"), alias: "Remove Manual Folding Ranges", - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2137 /* KeyCode.Period */ @@ -77810,87 +77810,87 @@ class ywe extends Yn { const n = i.getSelections(); if (n) { const o = []; - for (const r of n) { - const { startLineNumber: l, endLineNumber: a } = r; - o.push(a >= l ? { startLineNumber: l, endLineNumber: a } : { endLineNumber: a, startLineNumber: l }); + for (const l of n) { + const { startLineNumber: r, endLineNumber: c } = l; + o.push(c >= r ? { startLineNumber: r, endLineNumber: c } : { endLineNumber: c, startLineNumber: r }); } t.removeManualRanges(o), e.triggerFoldingModelChanged(); } } } -gt( - Bh.ID, - Bh, +mt( + _h.ID, + _h, 0 /* EditorContributionInstantiation.Eager */ ); -ee(twe); -ee(iwe); -ee(nwe); -ee(owe); -ee(rwe); -ee(uwe); -ee(gwe); -ee(lwe); -ee(awe); -ee(cwe); -ee(dwe); -ee(hwe); -ee(swe); -ee(mwe); -ee(pwe); -ee(fwe); -ee(bwe); -ee(ywe); +ee(Bye); +ee(_ye); +ee(Qye); +ee(jye); +ee(qye); +ee(sWe); +ee(oWe); +ee($ye); +ee(eWe); +ee(tWe); +ee(iWe); +ee(nWe); +ee(Oye); +ee(lWe); +ee(rWe); +ee(cWe); +ee(dWe); +ee(aWe); for (let s = 1; s <= 7; s++) - E$(new Jx({ - id: Jx.ID(s), + Nee(new cI({ + id: cI.ID(s), label: p("foldLevelAction.label", "Fold Level {0}", s), alias: `Fold Level ${s}`, - precondition: Wn, + precondition: wn, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi(2089, 2048 | 21 + s), + kbExpr: C.editorTextFocus, + primary: Di(2089, 2048 | 21 + s), weight: 100 /* KeybindingWeight.EditorContrib */ } })); st.registerCommand("_executeFoldingRangeProvider", async function(s, ...e) { const [t] = e; - if (!(t instanceof Le)) - throw hr(); - const i = s.get(ge), n = s.get(Pt).getModel(t); + if (!(t instanceof Xe)) + throw bl(); + const i = s.get(me), n = s.get(At).getModel(t); if (!n) - throw hr(); - const o = s.get(Ke); + throw bl(); + const o = s.get(Qe); if (!o.getValue("editor.folding", { resource: t })) return []; - const r = s.get(li), l = o.getValue("editor.foldingStrategy", { resource: t }), a = { + const l = s.get(ci), r = o.getValue("editor.foldingStrategy", { resource: t }), c = { get limit() { return o.getValue("editor.foldingMaximumRegions", { resource: t }); }, - update: (g, m) => { + update: (m, b) => { } - }, c = new Y5(n, r, a); - let d = c; - if (l !== "indentation") { - const g = Bh.getFoldingRangeProviders(i, n); - g.length && (d = new z5(n, g, () => { - }, a, c)); + }, d = new uE(n, l, c); + let a = d; + if (r !== "indentation") { + const m = _h.getFoldingRangeProviders(i, n); + m.length && (a = new mE(n, m, () => { + }, c, d)); } - const h = await d.compute(Ye.None), u = []; + const h = await a.compute(Fe.None), u = []; try { if (h) - for (let g = 0; g < h.length; g++) { - const m = h.getType(g); - u.push({ start: h.getStartLineNumber(g), end: h.getEndLineNumber(g), kind: m ? r0.fromValue(m) : void 0 }); + for (let m = 0; m < h.length; m++) { + const b = h.getType(m); + u.push({ start: h.getStartLineNumber(m), end: h.getEndLineNumber(m), kind: b ? u0.fromValue(b) : void 0 }); } return u; } finally { - d.dispose(); + a.dispose(); } }); -class wwe extends he { +class hWe extends he { constructor() { super({ id: "editor.action.fontZoomIn", @@ -77900,10 +77900,10 @@ class wwe extends he { }); } run(e, t) { - lr.setZoomLevel(lr.getZoomLevel() + 1); + dl.setZoomLevel(dl.getZoomLevel() + 1); } } -class Cwe extends he { +class uWe extends he { constructor() { super({ id: "editor.action.fontZoomOut", @@ -77913,10 +77913,10 @@ class Cwe extends he { }); } run(e, t) { - lr.setZoomLevel(lr.getZoomLevel() - 1); + dl.setZoomLevel(dl.getZoomLevel() - 1); } } -class Swe extends he { +class mWe extends he { constructor() { super({ id: "editor.action.fontZoomReset", @@ -77926,13 +77926,13 @@ class Swe extends he { }); } run(e, t) { - lr.setZoomLevel(0); + dl.setZoomLevel(0); } } -ee(wwe); -ee(Cwe); -ee(Swe); -class kb { +ee(hWe); +ee(uWe); +ee(mWe); +class FZ { static _handleEolEdits(e, t) { let i; const n = []; @@ -77948,11 +77948,11 @@ class kb { } static execute(e, t, i) { i && e.pushUndoStop(); - const n = Vl.capture(e), o = kb._handleEolEdits(e, t); - o.length === 1 && kb._isFullModelReplaceEdit(e, o[0]) ? e.executeEdits("formatEditsCommand", o.map((r) => si.replace(M.lift(r.range), r.text))) : e.executeEdits("formatEditsCommand", o.map((r) => si.replaceMove(M.lift(r.range), r.text))), i && e.pushUndoStop(), n.restoreRelativeVerticalPositionOfCursor(e); + const n = Hr.capture(e), o = FZ._handleEolEdits(e, t); + o.length === 1 && FZ._isFullModelReplaceEdit(e, o[0]) ? e.executeEdits("formatEditsCommand", o.map((l) => oi.replace(I.lift(l.range), l.text))) : e.executeEdits("formatEditsCommand", o.map((l) => oi.replaceMove(I.lift(l.range), l.text))), i && e.pushUndoStop(), n.restoreRelativeVerticalPositionOfCursor(e); } } -class H3 { +class ZK { constructor(e) { this.value = e, this._lower = e.toLowerCase(); } @@ -77963,171 +77963,171 @@ class H3 { return typeof e == "string" ? e.toLowerCase() : e._lower; } } -class Lwe { +class bWe { constructor(e) { if (this._set = /* @__PURE__ */ new Set(), e) for (const t of e) this.add(t); } add(e) { - this._set.add(H3.toKey(e)); + this._set.add(ZK.toKey(e)); } has(e) { - return this._set.has(H3.toKey(e)); + return this._set.has(ZK.toKey(e)); } } -function Ij(s, e, t) { - const i = [], n = new Lwe(), o = s.ordered(t); - for (const l of o) - i.push(l), l.extensionId && n.add(l.extensionId); - const r = e.ordered(t); - for (const l of r) { - if (l.extensionId) { - if (n.has(l.extensionId)) +function a7(s, e, t) { + const i = [], n = new bWe(), o = s.ordered(t); + for (const r of o) + i.push(r), r.extensionId && n.add(r.extensionId); + const l = e.ordered(t); + for (const r of l) { + if (r.extensionId) { + if (n.has(r.extensionId)) continue; - n.add(l.extensionId); + n.add(r.extensionId); } i.push({ - displayName: l.displayName, - extensionId: l.extensionId, - provideDocumentFormattingEdits(a, c, d) { - return l.provideDocumentRangeFormattingEdits(a, a.getFullModelRange(), c, d); + displayName: r.displayName, + extensionId: r.extensionId, + provideDocumentFormattingEdits(c, d, a) { + return r.provideDocumentRangeFormattingEdits(c, c.getFullModelRange(), d, a); } }); } return i; } -const Aw = class Aw { +const ky = class ky { static setFormatterSelector(e) { - return { dispose: Aw._selectors.unshift(e) }; + return { dispose: ky._selectors.unshift(e) }; } static async select(e, t, i, n) { if (e.length === 0) return; - const o = nt.first(Aw._selectors); + const o = nt.first(ky._selectors); if (o) return await o(e, t, i, n); } }; -Aw._selectors = new cs(); -let X1 = Aw; -async function Nj(s, e, t, i, n, o, r) { - const l = s.get(Se), { documentRangeFormattingEditProvider: a } = s.get(ge), c = zh(e) ? e.getModel() : e, d = a.ordered(c), h = await X1.select( +ky._selectors = new hs(); +let jW = ky; +async function h7(s, e, t, i, n, o, l) { + const r = s.get(Ge), { documentRangeFormattingEditProvider: c } = s.get(me), d = Ph(e) ? e.getModel() : e, a = c.ordered(d), h = await jW.select( + a, d, - c, i, 2 /* FormattingKind.Selection */ ); - h && (n.report(h), await l.invokeFunction(Awe, h, e, t, o, r)); + h && (n.report(h), await r.invokeFunction(pWe, h, e, t, o, l)); } -async function Awe(s, e, t, i, n, o) { - var y, w; - const r = s.get(Ps), l = s.get(Xn), a = s.get(jh); - let c, d; - zh(t) ? (c = t.getModel(), d = new Yh(t, 5, void 0, n)) : (c = t, d = new qX(t, n)); +async function pWe(s, e, t, i, n, o) { + var f, y; + const l = s.get(Us), r = s.get(Fn), c = s.get(tu); + let d, a; + Ph(t) ? (d = t.getModel(), a = new Uh(t, 5, void 0, n)) : (d = t, a = new VH(t, n)); const h = []; let u = 0; - for (const C of LE(i).sort(M.compareRangesUsingStarts)) - u > 0 && M.areIntersectingOrTouching(h[u - 1], C) ? h[u - 1] = M.fromPositions(h[u - 1].getStartPosition(), C.getEndPosition()) : u = h.push(C); - const g = async (C) => { - var L, x; - l.trace("[format][provideDocumentRangeFormattingEdits] (request)", (L = e.extensionId) == null ? void 0 : L.value, C); - const S = await e.provideDocumentRangeFormattingEdits(c, C, c.getFormattingOptions(), d.token) || []; - return l.trace("[format][provideDocumentRangeFormattingEdits] (response)", (x = e.extensionId) == null ? void 0 : x.value, S), S; - }, m = (C, S) => { - if (!C.length || !S.length) + for (const W of Bv(i).sort(I.compareRangesUsingStarts)) + u > 0 && I.areIntersectingOrTouching(h[u - 1], W) ? h[u - 1] = I.fromPositions(h[u - 1].getStartPosition(), W.getEndPosition()) : u = h.push(W); + const m = async (W) => { + var X, L; + r.trace("[format][provideDocumentRangeFormattingEdits] (request)", (X = e.extensionId) == null ? void 0 : X.value, W); + const G = await e.provideDocumentRangeFormattingEdits(d, W, d.getFormattingOptions(), a.token) || []; + return r.trace("[format][provideDocumentRangeFormattingEdits] (response)", (L = e.extensionId) == null ? void 0 : L.value, G), G; + }, b = (W, G) => { + if (!W.length || !G.length) return !1; - const L = C.reduce((x, Z) => M.plusRange(x, Z.range), C[0].range); - if (!S.some((x) => M.intersectRanges(L, x.range))) + const X = W.reduce((L, S) => I.plusRange(L, S.range), W[0].range); + if (!G.some((L) => I.intersectRanges(X, L.range))) return !1; - for (const x of C) - for (const Z of S) - if (M.intersectRanges(x.range, Z.range)) + for (const L of W) + for (const S of G) + if (I.intersectRanges(L.range, S.range)) return !0; return !1; - }, f = [], b = []; + }, g = [], Z = []; try { if (typeof e.provideDocumentRangesFormattingEdits == "function") { - l.trace("[format][provideDocumentRangeFormattingEdits] (request)", (y = e.extensionId) == null ? void 0 : y.value, h); - const C = await e.provideDocumentRangesFormattingEdits(c, h, c.getFormattingOptions(), d.token) || []; - l.trace("[format][provideDocumentRangeFormattingEdits] (response)", (w = e.extensionId) == null ? void 0 : w.value, C), b.push(C); + r.trace("[format][provideDocumentRangeFormattingEdits] (request)", (f = e.extensionId) == null ? void 0 : f.value, h); + const W = await e.provideDocumentRangesFormattingEdits(d, h, d.getFormattingOptions(), a.token) || []; + r.trace("[format][provideDocumentRangeFormattingEdits] (response)", (y = e.extensionId) == null ? void 0 : y.value, W), Z.push(W); } else { - for (const C of h) { - if (d.token.isCancellationRequested) + for (const W of h) { + if (a.token.isCancellationRequested) return !0; - b.push(await g(C)); + Z.push(await m(W)); } - for (let C = 0; C < h.length; ++C) - for (let S = C + 1; S < h.length; ++S) { - if (d.token.isCancellationRequested) + for (let W = 0; W < h.length; ++W) + for (let G = W + 1; G < h.length; ++G) { + if (a.token.isCancellationRequested) return !0; - if (m(b[C], b[S])) { - const L = M.plusRange(h[C], h[S]), x = await g(L); - h.splice(S, 1), h.splice(C, 1), h.push(L), b.splice(S, 1), b.splice(C, 1), b.push(x), C = 0, S = 0; + if (b(Z[W], Z[G])) { + const X = I.plusRange(h[W], h[G]), L = await m(X); + h.splice(G, 1), h.splice(W, 1), h.push(X), Z.splice(G, 1), Z.splice(W, 1), Z.push(L), W = 0, G = 0; } } } - for (const C of b) { - if (d.token.isCancellationRequested) + for (const W of Z) { + if (a.token.isCancellationRequested) return !0; - const S = await r.computeMoreMinimalEdits(c.uri, C); - S && f.push(...S); + const G = await l.computeMoreMinimalEdits(d.uri, W); + G && g.push(...G); } } finally { - d.dispose(); + a.dispose(); } - if (f.length === 0) + if (g.length === 0) return !1; - if (zh(t)) - kb.execute(t, f, !0), t.revealPositionInCenterIfOutsideViewport( + if (Ph(t)) + FZ.execute(t, g, !0), t.revealPositionInCenterIfOutsideViewport( t.getPosition(), 1 /* ScrollType.Immediate */ ); else { - const [{ range: C }] = f, S = new fe(C.startLineNumber, C.startColumn, C.endLineNumber, C.endColumn); - c.pushEditOperations([S], f.map((L) => ({ - text: L.text, - range: M.lift(L.range), + const [{ range: W }] = g, G = new ge(W.startLineNumber, W.startColumn, W.endLineNumber, W.endColumn); + d.pushEditOperations([G], g.map((X) => ({ + text: X.text, + range: I.lift(X.range), forceMoveMarkers: !0 - })), (L) => { - for (const { range: x } of L) - if (M.areIntersectingOrTouching(x, S)) - return [new fe(x.startLineNumber, x.startColumn, x.endLineNumber, x.endColumn)]; + })), (X) => { + for (const { range: L } of X) + if (I.areIntersectingOrTouching(L, G)) + return [new ge(L.startLineNumber, L.startColumn, L.endLineNumber, L.endColumn)]; return null; }); } - return a.playSignal(vo.format, { userGesture: o }), !0; + return c.playSignal(Mo.format, { userGesture: o }), !0; } -async function xwe(s, e, t, i, n, o) { - const r = s.get(Se), l = s.get(ge), a = zh(e) ? e.getModel() : e, c = Ij(l.documentFormattingEditProvider, l.documentRangeFormattingEditProvider, a), d = await X1.select( +async function gWe(s, e, t, i, n, o) { + const l = s.get(Ge), r = s.get(me), c = Ph(e) ? e.getModel() : e, d = a7(r.documentFormattingEditProvider, r.documentRangeFormattingEditProvider, c), a = await jW.select( + d, c, - a, t, 1 /* FormattingKind.File */ ); - d && (i.report(d), await r.invokeFunction(Mwe, d, e, t, n, o)); + a && (i.report(a), await l.invokeFunction(ZWe, a, e, t, n, o)); } -async function Mwe(s, e, t, i, n, o) { - const r = s.get(Ps), l = s.get(jh); - let a, c; - zh(t) ? (a = t.getModel(), c = new Yh(t, 5, void 0, n)) : (a = t, c = new qX(t, n)); - let d; +async function ZWe(s, e, t, i, n, o) { + const l = s.get(Us), r = s.get(tu); + let c, d; + Ph(t) ? (c = t.getModel(), d = new Uh(t, 5, void 0, n)) : (c = t, d = new VH(t, n)); + let a; try { - const h = await e.provideDocumentFormattingEdits(a, a.getFormattingOptions(), c.token); - if (d = await r.computeMoreMinimalEdits(a.uri, h), c.token.isCancellationRequested) + const h = await e.provideDocumentFormattingEdits(c, c.getFormattingOptions(), d.token); + if (a = await l.computeMoreMinimalEdits(c.uri, h), d.token.isCancellationRequested) return !0; } finally { - c.dispose(); + d.dispose(); } - if (!d || d.length === 0) + if (!a || a.length === 0) return !1; - if (zh(t)) - kb.execute( + if (Ph(t)) + FZ.execute( t, - d, + a, i !== 2 /* FormattingMode.Silent */ ), i !== 2 && t.revealPositionInCenterIfOutsideViewport( @@ -78136,83 +78136,83 @@ async function Mwe(s, e, t, i, n, o) { /* ScrollType.Immediate */ ); else { - const [{ range: h }] = d, u = new fe(h.startLineNumber, h.startColumn, h.endLineNumber, h.endColumn); - a.pushEditOperations([u], d.map((g) => ({ - text: g.text, - range: M.lift(g.range), + const [{ range: h }] = a, u = new ge(h.startLineNumber, h.startColumn, h.endLineNumber, h.endColumn); + c.pushEditOperations([u], a.map((m) => ({ + text: m.text, + range: I.lift(m.range), forceMoveMarkers: !0 - })), (g) => { - for (const { range: m } of g) - if (M.areIntersectingOrTouching(m, u)) - return [new fe(m.startLineNumber, m.startColumn, m.endLineNumber, m.endColumn)]; + })), (m) => { + for (const { range: b } of m) + if (I.areIntersectingOrTouching(b, u)) + return [new ge(b.startLineNumber, b.startColumn, b.endLineNumber, b.endColumn)]; return null; }); } - return l.playSignal(vo.format, { userGesture: o }), !0; + return r.playSignal(Mo.format, { userGesture: o }), !0; } -async function Zwe(s, e, t, i, n, o) { - const r = e.documentRangeFormattingEditProvider.ordered(t); - for (const l of r) { - const a = await Promise.resolve(l.provideDocumentRangeFormattingEdits(t, i, n, o)).catch(wi); - if ($n(a)) - return await s.computeMoreMinimalEdits(t.uri, a); +async function fWe(s, e, t, i, n, o) { + const l = e.documentRangeFormattingEditProvider.ordered(t); + for (const r of l) { + const c = await Promise.resolve(r.provideDocumentRangeFormattingEdits(t, i, n, o)).catch(Wi); + if (ts(c)) + return await s.computeMoreMinimalEdits(t.uri, c); } } -async function _we(s, e, t, i, n) { - const o = Ij(e.documentFormattingEditProvider, e.documentRangeFormattingEditProvider, t); - for (const r of o) { - const l = await Promise.resolve(r.provideDocumentFormattingEdits(t, i, n)).catch(wi); - if ($n(l)) - return await s.computeMoreMinimalEdits(t.uri, l); +async function yWe(s, e, t, i, n) { + const o = a7(e.documentFormattingEditProvider, e.documentRangeFormattingEditProvider, t); + for (const l of o) { + const r = await Promise.resolve(l.provideDocumentFormattingEdits(t, i, n)).catch(Wi); + if (ts(r)) + return await s.computeMoreMinimalEdits(t.uri, r); } } -function Wj(s, e, t, i, n, o, r) { - const l = e.onTypeFormattingEditProvider.ordered(t); - return l.length === 0 || l[0].autoFormatTriggerCharacters.indexOf(n) < 0 ? Promise.resolve(void 0) : Promise.resolve(l[0].provideOnTypeFormattingEdits(t, i, n, o, r)).catch(wi).then((a) => s.computeMoreMinimalEdits(t.uri, a)); +function u7(s, e, t, i, n, o, l) { + const r = e.onTypeFormattingEditProvider.ordered(t); + return r.length === 0 || r[0].autoFormatTriggerCharacters.indexOf(n) < 0 ? Promise.resolve(void 0) : Promise.resolve(r[0].provideOnTypeFormattingEdits(t, i, n, o, l)).catch(Wi).then((c) => s.computeMoreMinimalEdits(t.uri, c)); } st.registerCommand("_executeFormatRangeProvider", async function(s, ...e) { const [t, i, n] = e; - ht(Le.isUri(t)), ht(M.isIRange(i)); - const o = s.get(Ys), r = s.get(Ps), l = s.get(ge), a = await o.createModelReference(t); + ht(Xe.isUri(t)), ht(I.isIRange(i)); + const o = s.get(As), l = s.get(Us), r = s.get(me), c = await o.createModelReference(t); try { - return Zwe(r, l, a.object.textEditorModel, M.lift(i), n, Ye.None); + return fWe(l, r, c.object.textEditorModel, I.lift(i), n, Fe.None); } finally { - a.dispose(); + c.dispose(); } }); st.registerCommand("_executeFormatDocumentProvider", async function(s, ...e) { const [t, i] = e; - ht(Le.isUri(t)); - const n = s.get(Ys), o = s.get(Ps), r = s.get(ge), l = await n.createModelReference(t); + ht(Xe.isUri(t)); + const n = s.get(As), o = s.get(Us), l = s.get(me), r = await n.createModelReference(t); try { - return _we(o, r, l.object.textEditorModel, i, Ye.None); + return yWe(o, l, r.object.textEditorModel, i, Fe.None); } finally { - l.dispose(); + r.dispose(); } }); st.registerCommand("_executeFormatOnTypeProvider", async function(s, ...e) { const [t, i, n, o] = e; - ht(Le.isUri(t)), ht(V.isIPosition(i)), ht(typeof n == "string"); - const r = s.get(Ys), l = s.get(Ps), a = s.get(ge), c = await r.createModelReference(t); + ht(Xe.isUri(t)), ht(Y.isIPosition(i)), ht(typeof n == "string"); + const l = s.get(As), r = s.get(Us), c = s.get(me), d = await l.createModelReference(t); try { - return Wj(l, a, c.object.textEditorModel, V.lift(i), n, o, Ye.None); + return u7(r, c, d.object.textEditorModel, Y.lift(i), n, o, Fe.None); } finally { - c.dispose(); + d.dispose(); } }); -var vj = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var m7 = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Qy = function(s, e) { +}, ry = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Qf; -let Ux = (Qf = class { +}, iZ; +let dI = (iZ = class { constructor(e, t, i, n) { - this._editor = e, this._languageFeaturesService = t, this._workerService = i, this._accessibilitySignalService = n, this._disposables = new U(), this._sessionDisposables = new U(), this._disposables.add(t.onTypeFormattingEditProvider.onDidChange(this._update, this)), this._disposables.add(e.onDidChangeModel(() => this._update())), this._disposables.add(e.onDidChangeModelLanguage(() => this._update())), this._disposables.add(e.onDidChangeConfiguration((o) => { + this._editor = e, this._languageFeaturesService = t, this._workerService = i, this._accessibilitySignalService = n, this._disposables = new _(), this._sessionDisposables = new _(), this._disposables.add(t.onTypeFormattingEditProvider.onDidChange(this._update, this)), this._disposables.add(e.onDidChangeModel(() => this._update())), this._disposables.add(e.onDidChangeModelLanguage(() => this._update())), this._disposables.add(e.onDidChangeConfiguration((o) => { o.hasChanged( 56 /* EditorOption.formatOnType */ @@ -78231,7 +78231,7 @@ let Ux = (Qf = class { const e = this._editor.getModel(), [t] = this._languageFeaturesService.onTypeFormattingEditProvider.ordered(e); if (!t || !t.autoFormatTriggerCharacters) return; - const i = new fA(); + const i = new wV(); for (const n of t.autoFormatTriggerCharacters) i.add(n.charCodeAt(0)); this._sessionDisposables.add(this._editor.onDidType((n) => { @@ -78242,33 +78242,33 @@ let Ux = (Qf = class { _trigger(e) { if (!this._editor.hasModel() || this._editor.getSelections().length > 1 || !this._editor.getSelection().isEmpty()) return; - const t = this._editor.getModel(), i = this._editor.getPosition(), n = new mi(), o = this._editor.onDidChangeModelContent((r) => { - if (r.isFlush) { + const t = this._editor.getModel(), i = this._editor.getPosition(), n = new pi(), o = this._editor.onDidChangeModelContent((l) => { + if (l.isFlush) { n.cancel(), o.dispose(); return; } - for (let l = 0, a = r.changes.length; l < a; l++) - if (r.changes[l].range.endLineNumber <= i.lineNumber) { + for (let r = 0, c = l.changes.length; r < c; r++) + if (l.changes[r].range.endLineNumber <= i.lineNumber) { n.cancel(), o.dispose(); return; } }); - Wj(this._workerService, this._languageFeaturesService, t, i, e, t.getFormattingOptions(), n.token).then((r) => { - n.token.isCancellationRequested || $n(r) && (this._accessibilitySignalService.playSignal(vo.format, { userGesture: !1 }), kb.execute(this._editor, r, !0)); + u7(this._workerService, this._languageFeaturesService, t, i, e, t.getFormattingOptions(), n.token).then((l) => { + n.token.isCancellationRequested || ts(l) && (this._accessibilitySignalService.playSignal(Mo.format, { userGesture: !1 }), FZ.execute(this._editor, l, !0)); }).finally(() => { o.dispose(); }); } -}, Qf.ID = "editor.contrib.autoFormat", Qf); -Ux = vj([ - Qy(1, ge), - Qy(2, Ps), - Qy(3, jh) -], Ux); -var jf; -let Kx = (jf = class { +}, iZ.ID = "editor.contrib.autoFormat", iZ); +dI = m7([ + ry(1, me), + ry(2, Us), + ry(3, tu) +], dI); +var nZ; +let aI = (nZ = class { constructor(e, t, i) { - this.editor = e, this._languageFeaturesService = t, this._instantiationService = i, this._callOnDispose = new U(), this._callOnModel = new U(), this._callOnDispose.add(e.onDidChangeConfiguration(() => this._update())), this._callOnDispose.add(e.onDidChangeModel(() => this._update())), this._callOnDispose.add(e.onDidChangeModelLanguage(() => this._update())), this._callOnDispose.add(t.documentRangeFormattingEditProvider.onDidChange(this._update, this)); + this.editor = e, this._languageFeaturesService = t, this._instantiationService = i, this._callOnDispose = new _(), this._callOnModel = new _(), this._callOnDispose.add(e.onDidChangeConfiguration(() => this._update())), this._callOnDispose.add(e.onDidChangeModel(() => this._update())), this._callOnDispose.add(e.onDidChangeModelLanguage(() => this._update())), this._callOnDispose.add(t.documentRangeFormattingEditProvider.onDidChange(this._update, this)); } dispose() { this._callOnDispose.dispose(), this._callOnModel.dispose(); @@ -78280,22 +78280,22 @@ let Kx = (jf = class { ) && this.editor.hasModel() && this._languageFeaturesService.documentRangeFormattingEditProvider.has(this.editor.getModel()) && this._callOnModel.add(this.editor.onDidPaste(({ range: e }) => this._trigger(e))); } _trigger(e) { - this.editor.hasModel() && (this.editor.getSelections().length > 1 || this._instantiationService.invokeFunction(Nj, this.editor, e, 2, xl.None, Ye.None, !1).catch(De)); - } -}, jf.ID = "editor.contrib.formatOnPaste", jf); -Kx = vj([ - Qy(1, ge), - Qy(2, Se) -], Kx); -class Iwe extends he { + this.editor.hasModel() && (this.editor.getSelections().length > 1 || this._instantiationService.invokeFunction(h7, this.editor, e, 2, Cr.None, Fe.None, !1).catch(Me)); + } +}, nZ.ID = "editor.contrib.formatOnPaste", nZ); +aI = m7([ + ry(1, me), + ry(2, Ge) +], aI); +class WWe extends he { constructor() { super({ id: "editor.action.formatDocument", label: p("formatDocument.label", "Format Document"), alias: "Format Document", - precondition: H.and(I.notInCompositeEditor, I.writable, I.hasDocumentFormattingProvider), + precondition: P.and(C.notInCompositeEditor, C.writable, C.hasDocumentFormattingProvider), kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 1572, linux: { primary: 3111 @@ -78312,21 +78312,21 @@ class Iwe extends he { } async run(e, t) { if (t.hasModel()) { - const i = e.get(Se); - await e.get(qh).showWhile(i.invokeFunction(xwe, t, 1, xl.None, Ye.None, !0), 250); + const i = e.get(Ge); + await e.get(iu).showWhile(i.invokeFunction(gWe, t, 1, Cr.None, Fe.None, !0), 250); } } } -class Nwe extends he { +class GWe extends he { constructor() { super({ id: "editor.action.formatSelection", label: p("formatSelection.label", "Format Selection"), alias: "Format Selection", - precondition: H.and(I.writable, I.hasDocumentSelectionFormattingProvider), + precondition: P.and(C.writable, C.hasDocumentSelectionFormattingProvider), kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2084 /* KeyCode.KeyF */ @@ -78335,7 +78335,7 @@ class Nwe extends he { /* KeybindingWeight.EditorContrib */ }, contextMenuOpts: { - when: I.hasNonEmptySelection, + when: C.hasNonEmptySelection, group: "1_modification", order: 1.31 } @@ -78344,42 +78344,42 @@ class Nwe extends he { async run(e, t) { if (!t.hasModel()) return; - const i = e.get(Se), n = t.getModel(), o = t.getSelections().map((l) => l.isEmpty() ? new M(l.startLineNumber, 1, l.startLineNumber, n.getLineMaxColumn(l.startLineNumber)) : l); - await e.get(qh).showWhile(i.invokeFunction(Nj, t, o, 1, xl.None, Ye.None, !0), 250); + const i = e.get(Ge), n = t.getModel(), o = t.getSelections().map((r) => r.isEmpty() ? new I(r.startLineNumber, 1, r.startLineNumber, n.getLineMaxColumn(r.startLineNumber)) : r); + await e.get(iu).showWhile(i.invokeFunction(h7, t, o, 1, Cr.None, Fe.None, !0), 250); } } -gt( - Ux.ID, - Ux, +mt( + dI.ID, + dI, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */ ); -gt( - Kx.ID, - Kx, +mt( + aI.ID, + aI, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */ ); -ee(Iwe); -ee(Nwe); +ee(WWe); +ee(GWe); st.registerCommand("editor.action.format", async (s) => { - const e = s.get(ft).getFocusedCodeEditor(); + const e = s.get(gt).getFocusedCodeEditor(); if (!e || !e.hasModel()) return; - const t = s.get(Qt); + const t = s.get(Ot); e.getSelection().isEmpty() ? await t.executeCommand("editor.action.formatDocument") : await t.executeCommand("editor.action.formatSelection"); }); -var Wwe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var XWe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, RW = function(s, e) { +}, $R = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class Up { +class eg { remove() { var e; (e = this.parent) == null || e.children.delete(this.id); @@ -78396,40 +78396,40 @@ class Up { return e.children.size === 0; } } -class YD extends Up { +class c9 extends eg { constructor(e, t, i) { super(), this.id = e, this.parent = t, this.symbol = i, this.children = /* @__PURE__ */ new Map(); } } -class Tj extends Up { +class b7 extends eg { constructor(e, t, i, n) { super(), this.id = e, this.parent = t, this.label = i, this.order = n, this.children = /* @__PURE__ */ new Map(); } } -class fc extends Up { +class Wd extends eg { static create(e, t, i) { - const n = new mi(i), o = new fc(t.uri), r = e.ordered(t), l = r.map((c, d) => { - const h = Up.findId(`provider_${d}`, o), u = new Tj(h, o, c.displayName ?? "Unknown Outline Provider", d); - return Promise.resolve(c.provideDocumentSymbols(t, n.token)).then((g) => { - for (const m of g || []) - fc._makeOutlineElement(m, u); + const n = new pi(i), o = new Wd(t.uri), l = e.ordered(t), r = l.map((d, a) => { + const h = eg.findId(`provider_${a}`, o), u = new b7(h, o, d.displayName ?? "Unknown Outline Provider", a); + return Promise.resolve(d.provideDocumentSymbols(t, n.token)).then((m) => { + for (const b of m || []) + Wd._makeOutlineElement(b, u); return u; - }, (g) => (wi(g), u)).then((g) => { - Up.empty(g) ? g.remove() : o._groups.set(h, g); + }, (m) => (Wi(m), u)).then((m) => { + eg.empty(m) ? m.remove() : o._groups.set(h, m); }); - }), a = e.onDidChange(() => { - const c = e.ordered(t); - ei(c, r) || n.cancel(); + }), c = e.onDidChange(() => { + const d = e.ordered(t); + ti(d, l) || n.cancel(); }); - return Promise.all(l).then(() => n.token.isCancellationRequested && !i.isCancellationRequested ? fc.create(e, t, i) : o._compact()).finally(() => { - n.dispose(), a.dispose(), n.dispose(); + return Promise.all(r).then(() => n.token.isCancellationRequested && !i.isCancellationRequested ? Wd.create(e, t, i) : o._compact()).finally(() => { + n.dispose(), c.dispose(), n.dispose(); }); } static _makeOutlineElement(e, t) { - const i = Up.findId(e, t), n = new YD(i, t, e); + const i = eg.findId(e, t), n = new c9(i, t, e); if (e.children) for (const o of e.children) - fc._makeOutlineElement(o, n); + Wd._makeOutlineElement(o, n); t.children.set(n.id, n); } constructor(e) { @@ -78451,12 +78451,12 @@ class fc extends Up { getTopLevelSymbols() { const e = []; for (const t of this.children.values()) - t instanceof YD ? e.push(t.symbol) : e.push(...nt.map(t.children.values(), (i) => i.symbol)); - return e.sort((t, i) => M.compareRangesUsingStarts(t.range, i.range)); + t instanceof c9 ? e.push(t.symbol) : e.push(...nt.map(t.children.values(), (i) => i.symbol)); + return e.sort((t, i) => I.compareRangesUsingStarts(t.range, i.range)); } asListOfDocumentSymbols() { const e = this.getTopLevelSymbols(), t = []; - return fc._flattenDocumentSymbols(t, e, ""), t.sort((i, n) => V.compare(M.getStartPosition(i.range), M.getStartPosition(n.range)) || V.compare(M.getEndPosition(n.range), M.getEndPosition(i.range))); + return Wd._flattenDocumentSymbols(t, e, ""), t.sort((i, n) => Y.compare(I.getStartPosition(i.range), I.getStartPosition(n.range)) || Y.compare(I.getEndPosition(n.range), I.getEndPosition(i.range))); } static _flattenDocumentSymbols(e, t, i) { for (const n of t) @@ -78470,13 +78470,13 @@ class fc extends Up { selectionRange: n.selectionRange, children: void 0 // we flatten it... - }), n.children && fc._flattenDocumentSymbols(e, n.children, n.name); + }), n.children && Wd._flattenDocumentSymbols(e, n.children, n.name); } } -const P5 = $e("IOutlineModelService"); -let zD = class { +const bE = $e("IOutlineModelService"); +let d9 = class { constructor(e, t, i) { - this._languageFeaturesService = e, this._disposables = new U(), this._cache = new id(10, 0.7), this._debounceInformation = t.for(e.documentSymbolProvider, "DocumentSymbols", { min: 350 }), this._disposables.add(i.onModelRemoved((n) => { + this._languageFeaturesService = e, this._disposables = new _(), this._cache = new la(10, 0.7), this._debounceInformation = t.for(e.documentSymbolProvider, "DocumentSymbols", { min: 350 }), this._disposables.add(i.onModelRemoved((n) => { this._cache.delete(n.id); })); } @@ -78486,88 +78486,88 @@ let zD = class { async getOrCreate(e, t) { const i = this._languageFeaturesService.documentSymbolProvider, n = i.ordered(e); let o = this._cache.get(e.id); - if (!o || o.versionId !== e.getVersionId() || !ei(o.provider, n)) { - const l = new mi(); + if (!o || o.versionId !== e.getVersionId() || !ti(o.provider, n)) { + const r = new pi(); o = { versionId: e.getVersionId(), provider: n, promiseCnt: 0, - source: l, - promise: fc.create(i, e, l.token), + source: r, + promise: Wd.create(i, e, r.token), model: void 0 }, this._cache.set(e.id, o); - const a = Date.now(); - o.promise.then((c) => { - o.model = c, this._debounceInformation.update(e, Date.now() - a); - }).catch((c) => { + const c = Date.now(); + o.promise.then((d) => { + o.model = d, this._debounceInformation.update(e, Date.now() - c); + }).catch((d) => { this._cache.delete(e.id); }); } if (o.model) return o.model; o.promiseCnt += 1; - const r = t.onCancellationRequested(() => { + const l = t.onCancellationRequested(() => { --o.promiseCnt === 0 && (o.source.cancel(), this._cache.delete(e.id)); }); try { return await o.promise; } finally { - r.dispose(); + l.dispose(); } } }; -zD = Wwe([ - RW(0, ge), - RW(1, jo), - RW(2, Pt) -], zD); +d9 = XWe([ + $R(0, me), + $R(1, $o), + $R(2, At) +], d9); it( - P5, - zD, + bE, + d9, 1 /* InstantiationType.Delayed */ ); st.registerCommand("_executeDocumentSymbolProvider", async function(s, ...e) { const [t] = e; - ht(Le.isUri(t)); - const i = s.get(P5), o = await s.get(Ys).createModelReference(t); + ht(Xe.isUri(t)); + const i = s.get(bE), o = await s.get(As).createModelReference(t); try { - return (await i.getOrCreate(o.object.textEditorModel, Ye.None)).getTopLevelSymbols(); + return (await i.getOrCreate(o.object.textEditorModel, Fe.None)).getTopLevelSymbols(); } finally { o.dispose(); } }); -const ra = class ra extends R { +const ac = class ac extends J { constructor(e, t) { - super(), this.contextKeyService = e, this.model = t, this.inlineCompletionVisible = ra.inlineSuggestionVisible.bindTo(this.contextKeyService), this.inlineCompletionSuggestsIndentation = ra.inlineSuggestionHasIndentation.bindTo(this.contextKeyService), this.inlineCompletionSuggestsIndentationLessThanTabSize = ra.inlineSuggestionHasIndentationLessThanTabSize.bindTo(this.contextKeyService), this.suppressSuggestions = ra.suppressSuggestions.bindTo(this.contextKeyService), this._register(Te((i) => { - const n = this.model.read(i), o = n == null ? void 0 : n.state.read(i), r = !!(o != null && o.inlineCompletion) && (o == null ? void 0 : o.primaryGhostText) !== void 0 && !(o != null && o.primaryGhostText.isEmpty()); - this.inlineCompletionVisible.set(r), o != null && o.primaryGhostText && (o != null && o.inlineCompletion) && this.suppressSuggestions.set(o.inlineCompletion.inlineCompletion.source.inlineCompletions.suppressSuggestions); + super(), this.contextKeyService = e, this.model = t, this.inlineCompletionVisible = ac.inlineSuggestionVisible.bindTo(this.contextKeyService), this.inlineCompletionSuggestsIndentation = ac.inlineSuggestionHasIndentation.bindTo(this.contextKeyService), this.inlineCompletionSuggestsIndentationLessThanTabSize = ac.inlineSuggestionHasIndentationLessThanTabSize.bindTo(this.contextKeyService), this.suppressSuggestions = ac.suppressSuggestions.bindTo(this.contextKeyService), this._register(Te((i) => { + const n = this.model.read(i), o = n == null ? void 0 : n.state.read(i), l = !!(o != null && o.inlineCompletion) && (o == null ? void 0 : o.primaryGhostText) !== void 0 && !(o != null && o.primaryGhostText.isEmpty()); + this.inlineCompletionVisible.set(l), o != null && o.primaryGhostText && (o != null && o.inlineCompletion) && this.suppressSuggestions.set(o.inlineCompletion.inlineCompletion.source.inlineCompletions.suppressSuggestions); })), this._register(Te((i) => { const n = this.model.read(i); - let o = !1, r = !0; - const l = n == null ? void 0 : n.primaryGhostText.read(i); - if (n != null && n.selectedSuggestItem && l && l.parts.length > 0) { - const { column: a, lines: c } = l.parts[0], d = c[0], h = n.textModel.getLineIndentColumn(l.lineNumber); - if (a <= h) { - let g = qn(d); - g === -1 && (g = d.length - 1), o = g > 0; - const m = n.textModel.getOptions().tabSize; - r = Yi.visibleColumnFromColumn(d, g + 1, m) < m; + let o = !1, l = !0; + const r = n == null ? void 0 : n.primaryGhostText.read(i); + if (n != null && n.selectedSuggestItem && r && r.parts.length > 0) { + const { column: c, lines: d } = r.parts[0], a = d[0], h = n.textModel.getLineIndentColumn(r.lineNumber); + if (c <= h) { + let m = es(a); + m === -1 && (m = a.length - 1), o = m > 0; + const b = n.textModel.getOptions().tabSize; + l = zi.visibleColumnFromColumn(a, m + 1, b) < b; } } - this.inlineCompletionSuggestsIndentation.set(o), this.inlineCompletionSuggestsIndentationLessThanTabSize.set(r); + this.inlineCompletionSuggestsIndentation.set(o), this.inlineCompletionSuggestsIndentationLessThanTabSize.set(l); })); } }; -ra.inlineSuggestionVisible = new ae("inlineSuggestionVisible", !1, p("inlineSuggestionVisible", "Whether an inline suggestion is visible")), ra.inlineSuggestionHasIndentation = new ae("inlineSuggestionHasIndentation", !1, p("inlineSuggestionHasIndentation", "Whether the inline suggestion starts with whitespace")), ra.inlineSuggestionHasIndentationLessThanTabSize = new ae("inlineSuggestionHasIndentationLessThanTabSize", !0, p("inlineSuggestionHasIndentationLessThanTabSize", "Whether the inline suggestion starts with whitespace that is less than what would be inserted by tab")), ra.suppressSuggestions = new ae("inlineSuggestionSuppressSuggestions", void 0, p("suppressSuggestions", "Whether suggestions should be suppressed for the current suggestion")); -let go = ra; -function vwe(s) { - const e = new U(), t = e.add(sJ()); +ac.inlineSuggestionVisible = new ce("inlineSuggestionVisible", !1, p("inlineSuggestionVisible", "Whether an inline suggestion is visible")), ac.inlineSuggestionHasIndentation = new ce("inlineSuggestionHasIndentation", !1, p("inlineSuggestionHasIndentation", "Whether the inline suggestion starts with whitespace")), ac.inlineSuggestionHasIndentationLessThanTabSize = new ce("inlineSuggestionHasIndentationLessThanTabSize", !0, p("inlineSuggestionHasIndentationLessThanTabSize", "Whether the inline suggestion starts with whitespace that is less than what would be inserted by tab")), ac.suppressSuggestions = new ce("inlineSuggestionSuppressSuggestions", void 0, p("suppressSuggestions", "Whether suggestions should be suppressed for the current suggestion")); +let po = ac; +function VWe(s) { + const e = new _(), t = e.add(DB()); return e.add(Te((i) => { t.setStyle(s.read(i)); })), e; } -class F1 { +class qW { constructor(e, t) { this.lineNumber = e, this.parts = t; } @@ -78578,8 +78578,8 @@ class F1 { if (this.parts.length === 0) return ""; const t = this.parts[this.parts.length - 1], i = e.substr(0, t.column - 1); - return new vX([ - ...this.parts.map((o) => new ka(M.fromPositions(new V(1, o.column)), o.lines.join(` + return new iH([ + ...this.parts.map((o) => new Ec(I.fromPositions(new Y(1, o.column)), o.lines.join(` `))) ]).applyToString(i).substring(this.parts[0].column - 1); } @@ -78590,19 +78590,19 @@ class F1 { return 1 + this.parts.reduce((e, t) => e + t.lines.length - 1, 0); } } -class Qx { +class hI { constructor(e, t, i) { - this.column = e, this.text = t, this.preview = i, this.lines = Fa(this.text); + this.column = e, this.text = t, this.preview = i, this.lines = Kc(this.text); } equals(e) { return this.column === e.column && this.lines.length === e.lines.length && this.lines.every((t, i) => t === e.lines[i]); } } -class PD { +class a9 { constructor(e, t, i, n = 0) { this.lineNumber = e, this.columnRange = t, this.text = i, this.additionalReservedLineCount = n, this.parts = [ - new Qx(this.columnRange.endColumnExclusive, this.text, !1) - ], this.newLines = Fa(this.text); + new hI(this.columnRange.endColumnExclusive, this.text, !1) + ], this.newLines = Kc(this.text); } renderForScreenReader(e) { return this.newLines.join(` @@ -78618,31 +78618,31 @@ class PD { return this.lineNumber === e.lineNumber && this.columnRange.equals(e.columnRange) && this.newLines.length === e.newLines.length && this.newLines.every((t, i) => t === e.newLines[i]) && this.additionalReservedLineCount === e.additionalReservedLineCount; } } -function J3(s, e) { - return ei(s, e, Dj); +function fK(s, e) { + return ti(s, e, p7); } -function Dj(s, e) { - return s === e ? !0 : !s || !e ? !1 : s instanceof F1 && e instanceof F1 || s instanceof PD && e instanceof PD ? s.equals(e) : !1; +function p7(s, e) { + return s === e ? !0 : !s || !e ? !1 : s instanceof qW && e instanceof qW || s instanceof a9 && e instanceof a9 ? s.equals(e) : !1; } -const Twe = []; -function Dwe() { - return Twe; +const LWe = []; +function IWe() { + return LWe; } -class Vj { +class g7 { constructor(e, t) { if (this.startColumn = e, this.endColumnExclusive = t, e > t) - throw new mt(`startColumn ${e} cannot be after endColumnExclusive ${t}`); + throw new bt(`startColumn ${e} cannot be after endColumnExclusive ${t}`); } toRange(e) { - return new M(e, this.startColumn, e, this.endColumnExclusive); + return new I(e, this.startColumn, e, this.endColumnExclusive); } equals(e) { return this.startColumn === e.startColumn && this.endColumnExclusive === e.endColumnExclusive; } } -function kj(s, e) { - const t = new U(), i = s.createDecorationsCollection(); - return t.add(MC({ debugName: () => `Apply decorations from ${e.debugName}` }, (n) => { +function Z7(s, e) { + const t = new _(), i = s.createDecorationsCollection(); + return t.add(HG({ debugName: () => `Apply decorations from ${e.debugName}` }, (n) => { const o = e.read(n); i.set(o); })), t.add({ @@ -78651,105 +78651,105 @@ function kj(s, e) { } }), t; } -function Vwe(s, e) { - return new V(s.lineNumber + e.lineNumber - 1, e.lineNumber === 1 ? s.column + e.column - 1 : e.column); +function SWe(s, e) { + return new Y(s.lineNumber + e.lineNumber - 1, e.lineNumber === 1 ? s.column + e.column - 1 : e.column); } -function U3(s, e) { - return new V(s.lineNumber - e.lineNumber + 1, s.lineNumber - e.lineNumber === 0 ? s.column - e.column + 1 : s.column); +function yK(s, e) { + return new Y(s.lineNumber - e.lineNumber + 1, s.lineNumber - e.lineNumber === 0 ? s.column - e.column + 1 : s.column); } -var kwe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var xWe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Gwe = function(s, e) { +}, CWe = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const K3 = "ghost-text"; -let BD = class extends R { +const WK = "ghost-text"; +let h9 = class extends J { constructor(e, t, i) { - super(), this.editor = e, this.model = t, this.languageService = i, this.isDisposed = Oe(this, !1), this.currentTextModel = St(this, this.editor.onDidChangeModel, () => ( + super(), this.editor = e, this.model = t, this.languageService = i, this.isDisposed = Ue(this, !1), this.currentTextModel = Gt(this, this.editor.onDidChangeModel, () => ( /** @description editor.model */ this.editor.getModel() - )), this.uiState = ye(this, (n) => { + )), this.uiState = fe(this, (n) => { if (this.isDisposed.read(n)) return; const o = this.currentTextModel.read(n); if (o !== this.model.targetTextModel.read(n)) return; - const r = this.model.ghostText.read(n); - if (!r) + const l = this.model.ghostText.read(n); + if (!l) return; - const l = r instanceof PD ? r.columnRange : void 0, a = [], c = []; - function d(f, b) { - if (c.length > 0) { - const y = c[c.length - 1]; - b && y.decorations.push(new ds( - y.content.length + 1, - y.content.length + 1 + f[0].length, - b, + const r = l instanceof a9 ? l.columnRange : void 0, c = [], d = []; + function a(g, Z) { + if (d.length > 0) { + const f = d[d.length - 1]; + Z && f.decorations.push(new us( + f.content.length + 1, + f.content.length + 1 + g[0].length, + Z, 0 /* InlineDecorationType.Regular */ - )), y.content += f[0], f = f.slice(1); + )), f.content += g[0], g = g.slice(1); } - for (const y of f) - c.push({ - content: y, - decorations: b ? [new ds( + for (const f of g) + d.push({ + content: f, + decorations: Z ? [new us( 1, - y.length + 1, - b, + f.length + 1, + Z, 0 /* InlineDecorationType.Regular */ )] : [] }); } - const h = o.getLineContent(r.lineNumber); - let u, g = 0; - for (const f of r.parts) { - let b = f.lines; - u === void 0 ? (a.push({ - column: f.column, - text: b[0], - preview: f.preview - }), b = b.slice(1)) : d([h.substring(g, f.column - 1)], void 0), b.length > 0 && (d(b, K3), u === void 0 && f.column <= h.length && (u = f.column)), g = f.column - 1; - } - u !== void 0 && d([h.substring(g)], void 0); - const m = u !== void 0 ? new Vj(u, h.length + 1) : void 0; + const h = o.getLineContent(l.lineNumber); + let u, m = 0; + for (const g of l.parts) { + let Z = g.lines; + u === void 0 ? (c.push({ + column: g.column, + text: Z[0], + preview: g.preview + }), Z = Z.slice(1)) : a([h.substring(m, g.column - 1)], void 0), Z.length > 0 && (a(Z, WK), u === void 0 && g.column <= h.length && (u = g.column)), m = g.column - 1; + } + u !== void 0 && a([h.substring(m)], void 0); + const b = u !== void 0 ? new g7(u, h.length + 1) : void 0; return { - replacedRange: l, - inlineTexts: a, - additionalLines: c, - hiddenRange: m, - lineNumber: r.lineNumber, + replacedRange: r, + inlineTexts: c, + additionalLines: d, + hiddenRange: b, + lineNumber: l.lineNumber, additionalReservedLineCount: this.model.minReservedLineCount.read(n), targetTextModel: o }; - }), this.decorations = ye(this, (n) => { + }), this.decorations = fe(this, (n) => { const o = this.uiState.read(n); if (!o) return []; - const r = []; - o.replacedRange && r.push({ + const l = []; + o.replacedRange && l.push({ range: o.replacedRange.toRange(o.lineNumber), options: { inlineClassName: "inline-completion-text-to-replace", description: "GhostTextReplacement" } - }), o.hiddenRange && r.push({ + }), o.hiddenRange && l.push({ range: o.hiddenRange.toRange(o.lineNumber), options: { inlineClassName: "ghost-text-hidden", description: "ghost-text-hidden" } }); - for (const l of o.inlineTexts) - r.push({ - range: M.fromPositions(new V(o.lineNumber, l.column)), + for (const r of o.inlineTexts) + l.push({ + range: I.fromPositions(new Y(o.lineNumber, r.column)), options: { - description: K3, - after: { content: l.text, inlineClassName: l.preview ? "ghost-text-decoration-preview" : "ghost-text-decoration", cursorStops: Xr.Left }, + description: WK, + after: { content: r.text, inlineClassName: r.preview ? "ghost-text-decoration-preview" : "ghost-text-decoration", cursorStops: zl.Left }, showIfCollapsed: !0 } }); - return r; - }), this.additionalLinesWidget = this._register(new Rwe(this.editor, this.languageService.languageIdCodec, ye((n) => { + return l; + }), this.additionalLinesWidget = this._register(new RWe(this.editor, this.languageService.languageIdCodec, fe((n) => { const o = this.uiState.read(n); return o ? { lineNumber: o.lineNumber, @@ -78757,23 +78757,23 @@ let BD = class extends R { minReservedLineCount: o.additionalReservedLineCount, targetTextModel: o.targetTextModel } : void 0; - }))), this._register(Ce(() => { + }))), this._register(We(() => { this.isDisposed.set(!0, void 0); - })), this._register(kj(this.editor, this.decorations)); + })), this._register(Z7(this.editor, this.decorations)); } ownsViewZone(e) { return this.additionalLinesWidget.viewZoneId === e; } }; -BD = kwe([ - Gwe(2, ri) -], BD); -class Rwe extends R { +h9 = xWe([ + CWe(2, ri) +], h9); +class RWe extends J { get viewZoneId() { return this._viewZoneId; } constructor(e, t, i) { - super(), this.editor = e, this.languageIdCodec = t, this.lines = i, this._viewZoneId = void 0, this.editorOptionsChanged = Zn("editorOptionChanged", se.filter(this.editor.onDidChangeConfiguration, (n) => n.hasChanged( + super(), this.editor = e, this.languageIdCodec = t, this.lines = i, this._viewZoneId = void 0, this.editorOptionsChanged = xn("editorOptionChanged", se.filter(this.editor.onDidChangeConfiguration, (n) => n.hasChanged( 33 /* EditorOption.disableMonospaceOptimizations */ ) || n.hasChanged( @@ -78812,15 +78812,15 @@ class Rwe extends R { if (!n) return; const { tabSize: o } = n.getOptions(); - this.editor.changeViewZones((r) => { - this._viewZoneId && (r.removeZone(this._viewZoneId), this._viewZoneId = void 0); - const l = Math.max(t.length, i); - if (l > 0) { - const a = document.createElement("div"); - Ewe(a, o, t, this.editor.getOptions(), this.languageIdCodec), this._viewZoneId = r.addZone({ + this.editor.changeViewZones((l) => { + this._viewZoneId && (l.removeZone(this._viewZoneId), this._viewZoneId = void 0); + const r = Math.max(t.length, i); + if (r > 0) { + const c = document.createElement("div"); + NWe(c, o, t, this.editor.getOptions(), this.languageIdCodec), this._viewZoneId = l.addZone({ afterLineNumber: e, - heightInLines: l, - domNode: a, + heightInLines: r, + domNode: c, afterColumnAffinity: 1 /* PositionAffinity.Right */ }); @@ -78828,61 +78828,61 @@ class Rwe extends R { }); } } -function Ewe(s, e, t, i, n) { +function NWe(s, e, t, i, n) { const o = i.get( 33 /* EditorOption.disableMonospaceOptimizations */ - ), r = i.get( + ), l = i.get( 118 /* EditorOption.stopRenderingLineAfter */ - ), l = "none", a = i.get( + ), r = "none", c = i.get( 95 /* EditorOption.renderControlCharacters */ - ), c = i.get( + ), d = i.get( 51 /* EditorOption.fontLigatures */ - ), d = i.get( + ), a = i.get( 50 /* EditorOption.fontInfo */ ), h = i.get( 67 /* EditorOption.lineHeight */ - ), u = new e0(1e4); + ), u = new l0(1e4); u.appendString('
    '); - for (let f = 0, b = t.length; f < b; f++) { - const y = t[f], w = y.content; - u.appendString('
    '); - const C = uC(w), S = lb(w), L = rn.createEmpty(w, n); - wC(new Jh(d.isMonospace && !o, d.canUseHalfwidthRightwardsArrow, w, !1, C, S, 0, L, y.decorations, e, 0, d.spaceWidth, d.middotWidth, d.wsmiddotWidth, r, l, a, c !== Dh.OFF, null), u), u.appendString("
    "); - } - u.appendString("
    "), mn(s, d); - const g = u.build(), m = Q3 ? Q3.createHTML(g) : g; - s.innerHTML = m; -} -const Q3 = nd("editorGhostText", { createHTML: (s) => s }); -function Xwe(s, e) { - const t = new UU(), i = new QU(t, (c) => e.getLanguageConfiguration(c)), n = new KU(new Fwe([s]), i), o = _v(n, [], void 0, !0); - let r = ""; - const l = s.getLineContent(); - function a(c, d) { - if (c.kind === 2) - if (a(c.openingBracket, d), d = ui(d, c.openingBracket.length), c.child && (a(c.child, d), d = ui(d, c.child.length)), c.closingBracket) - a(c.closingBracket, d), d = ui(d, c.closingBracket.length); + for (let g = 0, Z = t.length; g < Z; g++) { + const f = t[g], y = f.content; + u.appendString('
    '); + const W = IG(y), G = mZ(y), X = rn.createEmpty(y, n); + TG(new jh(a.isMonospace && !o, a.canUseHalfwidthRightwardsArrow, y, !1, W, G, 0, X, f.decorations, e, 0, a.spaceWidth, a.middotWidth, a.wsmiddotWidth, l, r, c, d !== Jh.OFF, null), u), u.appendString("
    "); + } + u.appendString(""), pn(s, a); + const m = u.build(), b = GK ? GK.createHTML(m) : m; + s.innerHTML = b; +} +const GK = ra("editorGhostText", { createHTML: (s) => s }); +function wWe(s, e) { + const t = new NQ(), i = new TQ(t, (d) => e.getLanguageConfiguration(d)), n = new wQ(new TWe([s]), i), o = _w(n, [], void 0, !0); + let l = ""; + const r = s.getLineContent(); + function c(d, a) { + if (d.kind === 2) + if (c(d.openingBracket, a), a = mi(a, d.openingBracket.length), d.child && (c(d.child, a), a = mi(a, d.child.length)), d.closingBracket) + c(d.closingBracket, a), a = mi(a, d.closingBracket.length); else { - const u = i.getSingleLanguageBracketTokens(c.openingBracket.languageId).findClosingTokenText(c.openingBracket.bracketIds); - r += u; + const u = i.getSingleLanguageBracketTokens(d.openingBracket.languageId).findClosingTokenText(d.openingBracket.bracketIds); + l += u; } - else if (c.kind !== 3) { - if (c.kind === 0 || c.kind === 1) - r += l.substring(d, ui(d, c.length)); - else if (c.kind === 4) - for (const h of c.children) - a(h, d), d = ui(d, h.length); + else if (d.kind !== 3) { + if (d.kind === 0 || d.kind === 1) + l += r.substring(a, mi(a, d.length)); + else if (d.kind === 4) + for (const h of d.children) + c(h, a), a = mi(a, h.length); } } - return a(o, hs), r; + return c(o, ms), l; } -class Fwe { +class TWe { constructor(e) { this.lines = e, this.tokenization = { getLineTokens: (t) => this.lines[t - 1] @@ -78895,77 +78895,77 @@ class Fwe { return this.lines[e - 1].getLineContent().length; } } -async function Gj(s, e, t, i, n = Ye.None, o) { - const r = e instanceof V ? Bwe(e, t) : e, l = s.all(t), a = new bE(); - for (const y of l) - y.groupId && a.add(y.groupId, y); - function c(y) { - if (!y.yieldsToGroupIds) +async function f7(s, e, t, i, n = Fe.None, o) { + const l = e instanceof Y ? vWe(e, t) : e, r = s.all(t), c = new zv(); + for (const f of r) + f.groupId && c.add(f.groupId, f); + function d(f) { + if (!f.yieldsToGroupIds) return []; - const w = []; - for (const C of y.yieldsToGroupIds || []) { - const S = a.get(C); - for (const L of S) - w.push(L); - } - return w; - } - const d = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Set(); - function u(y, w) { - if (w = [...w, y], h.has(y)) - return w; - h.add(y); + const y = []; + for (const W of f.yieldsToGroupIds || []) { + const G = c.get(W); + for (const X of G) + y.push(X); + } + return y; + } + const a = /* @__PURE__ */ new Map(), h = /* @__PURE__ */ new Set(); + function u(f, y) { + if (y = [...y, f], h.has(f)) + return y; + h.add(f); try { - const C = c(y); - for (const S of C) { - const L = u(S, w); - if (L) - return L; + const W = d(f); + for (const G of W) { + const X = u(G, y); + if (X) + return X; } } finally { - h.delete(y); - } - } - function g(y) { - const w = d.get(y); - if (w) - return w; - const C = u(y, []); - C && wi(new Error(`Inline completions: cyclic yield-to dependency detected. Path: ${C.map((L) => L.toString ? L.toString() : "" + L).join(" -> ")}`)); - const S = new dC(); - return d.set(y, S.p), (async () => { - var L; - if (!C) { - const x = c(y); - for (const Z of x) { - const _ = await g(Z); - if (_ && _.items.length > 0) + h.delete(f); + } + } + function m(f) { + const y = a.get(f); + if (y) + return y; + const W = u(f, []); + W && Wi(new Error(`Inline completions: cyclic yield-to dependency detected. Path: ${W.map((X) => X.toString ? X.toString() : "" + X).join(" -> ")}`)); + const G = new VG(); + return a.set(f, G.p), (async () => { + var X; + if (!W) { + const L = d(f); + for (const S of L) { + const x = await m(S); + if (x && x.items.length > 0) return; } } try { - return e instanceof V ? await y.provideInlineCompletions(t, e, i, n) : await ((L = y.provideInlineEdits) == null ? void 0 : L.call(y, t, e, i, n)); - } catch (x) { - wi(x); + return e instanceof Y ? await f.provideInlineCompletions(t, e, i, n) : await ((X = f.provideInlineEdits) == null ? void 0 : X.call(f, t, e, i, n)); + } catch (L) { + Wi(L); return; } - })().then((L) => S.complete(L), (L) => S.error(L)), S.p; + })().then((X) => G.complete(X), (X) => G.error(X)), G.p; } - const m = await Promise.all(l.map(async (y) => ({ provider: y, completions: await g(y) }))), f = /* @__PURE__ */ new Map(), b = []; - for (const y of m) { - const w = y.completions; - if (!w) + const b = await Promise.all(r.map(async (f) => ({ provider: f, completions: await m(f) }))), g = /* @__PURE__ */ new Map(), Z = []; + for (const f of b) { + const y = f.completions; + if (!y) continue; - const C = new zwe(w, y.provider); - b.push(C); - for (const S of w.items) { - const L = Pwe.from(S, C, r, t, o); - f.set(L.hash(), L); + const W = new YWe(y, f.provider); + Z.push(W); + for (const G of y.items) { + const X = kWe.from(G, W, l, t, o); + g.set(X.hash(), X); } } - return new Ywe(Array.from(f.values()), new Set(f.keys()), b); + return new MWe(Array.from(g.values()), new Set(g.keys()), Z); } -class Ywe { +class MWe { constructor(e, t, i) { this.completions = e, this.hashs = t, this.providerResults = i; } @@ -78977,7 +78977,7 @@ class Ywe { e.removeRef(); } } -let zwe = class { +let YWe = class { constructor(e, t) { this.inlineCompletions = e, this.provider = t, this.refCount = 1; } @@ -78987,56 +78987,56 @@ let zwe = class { removeRef() { this.refCount--, this.refCount === 0 && this.provider.freeInlineCompletions(this.inlineCompletions); } -}, Pwe = class OD { +}, kWe = class u9 { static from(e, t, i, n, o) { - let r, l, a = e.range ? M.lift(e.range) : i; + let l, r, c = e.range ? I.lift(e.range) : i; if (typeof e.insertText == "string") { - if (r = e.insertText, o && e.completeBracketPairs) { - r = j3(r, a.getStartPosition(), n, o); - const c = r.length - e.insertText.length; - c !== 0 && (a = new M(a.startLineNumber, a.startColumn, a.endLineNumber, a.endColumn + c)); + if (l = e.insertText, o && e.completeBracketPairs) { + l = XK(l, c.getStartPosition(), n, o); + const d = l.length - e.insertText.length; + d !== 0 && (c = new I(c.startLineNumber, c.startColumn, c.endLineNumber, c.endColumn + d)); } - l = void 0; + r = void 0; } else if ("snippet" in e.insertText) { - const c = e.insertText.snippet.length; + const d = e.insertText.snippet.length; if (o && e.completeBracketPairs) { - e.insertText.snippet = j3(e.insertText.snippet, a.getStartPosition(), n, o); - const h = e.insertText.snippet.length - c; - h !== 0 && (a = new M(a.startLineNumber, a.startColumn, a.endLineNumber, a.endColumn + h)); + e.insertText.snippet = XK(e.insertText.snippet, c.getStartPosition(), n, o); + const h = e.insertText.snippet.length - d; + h !== 0 && (c = new I(c.startLineNumber, c.startColumn, c.endLineNumber, c.endColumn + h)); } - const d = new Lm().parse(e.insertText.snippet); - d.children.length === 1 && d.children[0] instanceof as ? (r = d.children[0].value, l = void 0) : (r = d.toString(), l = { + const a = new xb().parse(e.insertText.snippet); + a.children.length === 1 && a.children[0] instanceof as ? (l = a.children[0].value, r = void 0) : (l = a.toString(), r = { snippet: e.insertText.snippet, - range: a + range: c }); } else - B_(e.insertText); - return new OD(r, e.command, a, r, l, e.additionalTextEdits || Dwe(), e, t); + ox(e.insertText); + return new u9(l, e.command, c, l, r, e.additionalTextEdits || IWe(), e, t); } - constructor(e, t, i, n, o, r, l, a) { - this.filterText = e, this.command = t, this.range = i, this.insertText = n, this.snippetInfo = o, this.additionalTextEdits = r, this.sourceInlineCompletion = l, this.source = a, e = e.replace(/\r\n|\r/g, ` + constructor(e, t, i, n, o, l, r, c) { + this.filterText = e, this.command = t, this.range = i, this.insertText = n, this.snippetInfo = o, this.additionalTextEdits = l, this.sourceInlineCompletion = r, this.source = c, e = e.replace(/\r\n|\r/g, ` `), n = e.replace(/\r\n|\r/g, ` `); } withRange(e) { - return new OD(this.filterText, this.command, e, this.insertText, this.snippetInfo, this.additionalTextEdits, this.sourceInlineCompletion, this.source); + return new u9(this.filterText, this.command, e, this.insertText, this.snippetInfo, this.additionalTextEdits, this.sourceInlineCompletion, this.source); } hash() { return JSON.stringify({ insertText: this.insertText, range: this.range.toString() }); } toSingleTextEdit() { - return new ka(this.range, this.insertText); + return new Ec(this.range, this.insertText); } }; -function Bwe(s, e) { +function vWe(s, e) { const t = e.getWordAtPosition(s), i = e.getLineMaxColumn(s.lineNumber); - return t ? new M(s.lineNumber, t.startColumn, s.lineNumber, i) : M.fromPositions(s, s.with(void 0, i)); + return t ? new I(s.lineNumber, t.startColumn, s.lineNumber, i) : I.fromPositions(s, s.with(void 0, i)); } -function j3(s, e, t, i) { - const o = t.getLineContent(e.lineNumber).substring(0, e.column - 1) + s, r = t.tokenization.tokenizeLineWithEdit(e, o.length - (e.column - 1), s), l = r == null ? void 0 : r.sliceAndInflate(e.column - 1, o.length, 0); - return l ? Xwe(l, i) : s; +function XK(s, e, t, i) { + const o = t.getLineContent(e.lineNumber).substring(0, e.column - 1) + s, l = t.tokenization.tokenizeLineWithEdit(e, o.length - (e.column - 1), s), r = l == null ? void 0 : l.sliceAndInflate(e.column - 1, o.length, 0); + return r ? wWe(r, i) : s; } -function mg(s, e, t) { +function ym(s, e, t) { const i = t ? s.range.intersectRanges(t) : s.range; if (!i) return s; @@ -79044,149 +79044,149 @@ function mg(s, e, t) { i, 1 /* EndOfLinePreference.LF */ - ), o = Ih(n, s.text), r = Ur.ofText(n.substring(0, o)).addToPosition(s.range.getStartPosition()), l = s.text.substring(o), a = M.fromPositions(r, s.range.getEndPosition()); - return new ka(a, l); + ), o = Th(n, s.text), l = jl.ofText(n.substring(0, o)).addToPosition(s.range.getStartPosition()), r = s.text.substring(o), c = I.fromPositions(l, s.range.getEndPosition()); + return new Ec(c, r); } -function Rj(s, e) { - return s.text.startsWith(e.text) && Owe(s.range, e.range); +function y7(s, e) { + return s.text.startsWith(e.text) && JWe(s.range, e.range); } -function q3(s, e, t, i, n = 0) { - let o = mg(s, e); +function VK(s, e, t, i, n = 0) { + let o = ym(s, e); if (o.range.endLineNumber !== o.range.startLineNumber) return; - const r = e.getLineContent(o.range.startLineNumber), l = Nt(r).length; - if (o.range.startColumn - 1 <= l) { - const m = Nt(o.text).length, f = r.substring(o.range.startColumn - 1, l), [b, y] = [o.range.getStartPosition(), o.range.getEndPosition()], w = b.column + f.length <= y.column ? b.delta(0, f.length) : y, C = M.fromPositions(w, y), S = o.text.startsWith(f) ? o.text.substring(f.length) : o.text.substring(m); - o = new ka(C, S); + const l = e.getLineContent(o.range.startLineNumber), r = Rt(l).length; + if (o.range.startColumn - 1 <= r) { + const b = Rt(o.text).length, g = l.substring(o.range.startColumn - 1, r), [Z, f] = [o.range.getStartPosition(), o.range.getEndPosition()], y = Z.column + g.length <= f.column ? Z.delta(0, g.length) : f, W = I.fromPositions(y, f), G = o.text.startsWith(g) ? o.text.substring(g.length) : o.text.substring(b); + o = new Ec(W, G); } - const c = e.getValueInRange(o.range), d = Hwe(c, o.text); - if (!d) + const d = e.getValueInRange(o.range), a = HWe(d, o.text); + if (!a) return; const h = o.range.startLineNumber, u = new Array(); if (t === "prefix") { - const m = d.filter((f) => f.originalLength === 0); - if (m.length > 1 || m.length === 1 && m[0].originalStart !== c.length) + const b = a.filter((g) => g.originalLength === 0); + if (b.length > 1 || b.length === 1 && b[0].originalStart !== d.length) return; } - const g = o.text.length - n; - for (const m of d) { - const f = o.range.startColumn + m.originalStart + m.originalLength; - if (t === "subwordSmart" && i && i.lineNumber === o.range.startLineNumber && f < i.column || m.originalLength > 0) + const m = o.text.length - n; + for (const b of a) { + const g = o.range.startColumn + b.originalStart + b.originalLength; + if (t === "subwordSmart" && i && i.lineNumber === o.range.startLineNumber && g < i.column || b.originalLength > 0) return; - if (m.modifiedLength === 0) + if (b.modifiedLength === 0) continue; - const b = m.modifiedStart + m.modifiedLength, y = Math.max(m.modifiedStart, Math.min(b, g)), w = o.text.substring(m.modifiedStart, y), C = o.text.substring(y, Math.max(m.modifiedStart, b)); - w.length > 0 && u.push(new Qx(f, w, !1)), C.length > 0 && u.push(new Qx(f, C, !0)); + const Z = b.modifiedStart + b.modifiedLength, f = Math.max(b.modifiedStart, Math.min(Z, m)), y = o.text.substring(b.modifiedStart, f), W = o.text.substring(f, Math.max(b.modifiedStart, Z)); + y.length > 0 && u.push(new hI(g, y, !1)), W.length > 0 && u.push(new hI(g, W, !0)); } - return new F1(h, u); + return new qW(h, u); } -function Owe(s, e) { +function JWe(s, e) { return e.getStartPosition().equals(s.getStartPosition()) && e.getEndPosition().isBeforeOrEqual(s.getEndPosition()); } -let Kl; -function Hwe(s, e) { - if ((Kl == null ? void 0 : Kl.originalValue) === s && (Kl == null ? void 0 : Kl.newValue) === e) - return Kl == null ? void 0 : Kl.changes; +let $r; +function HWe(s, e) { + if (($r == null ? void 0 : $r.originalValue) === s && ($r == null ? void 0 : $r.newValue) === e) + return $r == null ? void 0 : $r.changes; { - let t = eP(s, e, !0); + let t = IK(s, e, !0); if (t) { - const i = $3(t); + const i = LK(t); if (i > 0) { - const n = eP(s, e, !1); - n && $3(n) < i && (t = n); + const n = IK(s, e, !1); + n && LK(n) < i && (t = n); } } - return Kl = { + return $r = { originalValue: s, newValue: e, changes: t }, t; } } -function $3(s) { +function LK(s) { let e = 0; for (const t of s) e += t.originalLength; return e; } -function eP(s, e, t) { +function IK(s, e, t) { if (s.length > 5e3 || e.length > 5e3) return; - function i(c) { - let d = 0; - for (let h = 0, u = c.length; h < u; h++) { - const g = c.charCodeAt(h); - g > d && (d = g); + function i(d) { + let a = 0; + for (let h = 0, u = d.length; h < u; h++) { + const m = d.charCodeAt(h); + m > a && (a = m); } - return d; + return a; } const n = Math.max(i(s), i(e)); - function o(c) { - if (c < 0) + function o(d) { + if (d < 0) throw new Error("unexpected"); - return n + c + 1; + return n + d + 1; } - function r(c) { - let d = 0, h = 0; - const u = new Int32Array(c.length); - for (let g = 0, m = c.length; g < m; g++) - if (t && c[g] === "(") { - const f = h * 100 + d; - u[g] = o(2 * f), d++; - } else if (t && c[g] === ")") { - d = Math.max(d - 1, 0); - const f = h * 100 + d; - u[g] = o(2 * f + 1), d === 0 && h++; + function l(d) { + let a = 0, h = 0; + const u = new Int32Array(d.length); + for (let m = 0, b = d.length; m < b; m++) + if (t && d[m] === "(") { + const g = h * 100 + a; + u[m] = o(2 * g), a++; + } else if (t && d[m] === ")") { + a = Math.max(a - 1, 0); + const g = h * 100 + a; + u[m] = o(2 * g + 1), a === 0 && h++; } else - u[g] = c.charCodeAt(g); + u[m] = d.charCodeAt(m); return u; } - const l = r(s), a = r(e); - return new wa({ getElements: () => l }, { getElements: () => a }).ComputeDiff(!1).changes; + const r = l(s), c = l(e); + return new Vc({ getElements: () => r }, { getElements: () => c }).ComputeDiff(!1).changes; } -var Jwe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var EWe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, tP = function(s, e) { +}, SK = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let HD = class extends R { +let m9 = class extends J { constructor(e, t, i, n, o) { - super(), this.textModel = e, this.versionId = t, this._debounceValue = i, this.languageFeaturesService = n, this.languageConfigurationService = o, this._updateOperation = this._register(new fn()), this.inlineCompletions = p1("inlineCompletions", void 0), this.suggestWidgetInlineCompletions = p1("suggestWidgetInlineCompletions", void 0), this._register(this.textModel.onDidChangeContent(() => { + super(), this.textModel = e, this.versionId = t, this._debounceValue = i, this.languageFeaturesService = n, this.languageConfigurationService = o, this._updateOperation = this._register(new Zn()), this.inlineCompletions = xW("inlineCompletions", void 0), this.suggestWidgetInlineCompletions = xW("suggestWidgetInlineCompletions", void 0), this._register(this.textModel.onDidChangeContent(() => { this._updateOperation.clear(); })); } fetch(e, t, i) { - var d, h; - const n = new Kwe(e, t, this.textModel.getVersionId()), o = t.selectedSuggestionInfo ? this.suggestWidgetInlineCompletions : this.inlineCompletions; - if ((d = this._updateOperation.value) != null && d.request.satisfies(n)) + var a, h; + const n = new FWe(e, t, this.textModel.getVersionId()), o = t.selectedSuggestionInfo ? this.suggestWidgetInlineCompletions : this.inlineCompletions; + if ((a = this._updateOperation.value) != null && a.request.satisfies(n)) return this._updateOperation.value.promise; if ((h = o.get()) != null && h.request.satisfies(n)) return Promise.resolve(!0); - const r = !!this._updateOperation.value; + const l = !!this._updateOperation.value; this._updateOperation.clear(); - const l = new mi(), a = (async () => { - if ((r || t.triggerKind === _l.Automatic) && await Uwe(this._debounceValue.get(this.textModel), l.token), l.token.isCancellationRequested || this._store.isDisposed || this.textModel.getVersionId() !== n.versionId) + const r = new pi(), c = (async () => { + if ((l || t.triggerKind === wr.Automatic) && await DWe(this._debounceValue.get(this.textModel), r.token), r.token.isCancellationRequested || this._store.isDisposed || this.textModel.getVersionId() !== n.versionId) return !1; - const g = /* @__PURE__ */ new Date(), m = await Gj(this.languageFeaturesService.inlineCompletionsProvider, e, this.textModel, t, l.token, this.languageConfigurationService); - if (l.token.isCancellationRequested || this._store.isDisposed || this.textModel.getVersionId() !== n.versionId) + const m = /* @__PURE__ */ new Date(), b = await f7(this.languageFeaturesService.inlineCompletionsProvider, e, this.textModel, t, r.token, this.languageConfigurationService); + if (r.token.isCancellationRequested || this._store.isDisposed || this.textModel.getVersionId() !== n.versionId) return !1; - const f = /* @__PURE__ */ new Date(); - this._debounceValue.update(this.textModel, f.getTime() - g.getTime()); - const b = new jwe(m, n, this.textModel, this.versionId); + const g = /* @__PURE__ */ new Date(); + this._debounceValue.update(this.textModel, g.getTime() - m.getTime()); + const Z = new AWe(b, n, this.textModel, this.versionId); if (i) { - const y = i.toInlineCompletion(void 0); - i.canBeReused(this.textModel, e) && !m.has(y) && b.prepend(i.inlineCompletion, y.range, !0); + const f = i.toInlineCompletion(void 0); + i.canBeReused(this.textModel, e) && !b.has(f) && Z.prepend(i.inlineCompletion, f.range, !0); } - return this._updateOperation.clear(), oi((y) => { - o.set(b, y); + return this._updateOperation.clear(), li((f) => { + o.set(Z, f); }), !0; - })(), c = new Qwe(n, l, a); - return this._updateOperation.value = c, a; + })(), d = new zWe(n, r, c); + return this._updateOperation.value = d, c; } clear(e) { this._updateOperation.clear(), this.inlineCompletions.set(void 0, e), this.suggestWidgetInlineCompletions.set(void 0, e); @@ -79199,11 +79199,11 @@ let HD = class extends R { this._updateOperation.clear(); } }; -HD = Jwe([ - tP(3, ge), - tP(4, li) -], HD); -function Uwe(s, e) { +m9 = EWe([ + SK(3, me), + SK(4, ci) +], m9); +function DWe(s, e) { return new Promise((t) => { let i; const n = setTimeout(() => { @@ -79214,15 +79214,15 @@ function Uwe(s, e) { })); }); } -class Kwe { +class FWe { constructor(e, t, i) { this.position = e, this.context = t, this.versionId = i; } satisfies(e) { - return this.position.equals(e.position) && zv(this.context.selectedSuggestionInfo, e.context.selectedSuggestionInfo, lde()) && (e.context.triggerKind === _l.Automatic || this.context.triggerKind === _l.Explicit) && this.versionId === e.versionId; + return this.position.equals(e.position) && dT(this.context.selectedSuggestionInfo, e.context.selectedSuggestionInfo, $ae()) && (e.context.triggerKind === wr.Automatic || this.context.triggerKind === wr.Explicit) && this.versionId === e.versionId; } } -class Qwe { +class zWe { constructor(e, t, i) { this.request = e, this.cancellationTokenSource = t, this.promise = i; } @@ -79230,19 +79230,19 @@ class Qwe { this.cancellationTokenSource.cancel(); } } -class jwe { +class AWe { get inlineCompletions() { return this._inlineCompletions; } constructor(e, t, i, n) { this.inlineCompletionProviderResult = e, this.request = t, this._textModel = i, this._versionId = n, this._refCount = 1, this._prependedInlineCompletionItems = []; - const o = i.deltaDecorations([], e.completions.map((r) => ({ - range: r.range, + const o = i.deltaDecorations([], e.completions.map((l) => ({ + range: l.range, options: { description: "inline-completion-tracking-range" } }))); - this._inlineCompletions = e.completions.map((r, l) => new iP(r, o[l], this._textModel, this._versionId)); + this._inlineCompletions = e.completions.map((l, r) => new xK(l, o[r], this._textModel, this._versionId)); } clone() { return this._refCount++, this; @@ -79264,10 +79264,10 @@ class jwe { description: "inline-completion-tracking-range" } }])[0]; - this._inlineCompletions.unshift(new iP(e, n, this._textModel, this._versionId)), this._prependedInlineCompletionItems.push(e); + this._inlineCompletions.unshift(new xK(e, n, this._textModel, this._versionId)), this._prependedInlineCompletionItems.push(e); } } -class iP { +class xK { get forwardStable() { return this.inlineCompletion.source.inlineCompletions.enableForwardStability ?? !1; } @@ -79276,50 +79276,50 @@ class iP { this.inlineCompletion.filterText, this.inlineCompletion.insertText, this.inlineCompletion.range.getStartPosition().toString() - ]), this._updatedRange = Vo({ owner: this, equalsFn: M.equalsRange }, (o) => (this._modelVersion.read(o), this._textModel.getDecorationRange(this.decorationId))); + ]), this._updatedRange = vo({ owner: this, equalsFn: I.equalsRange }, (o) => (this._modelVersion.read(o), this._textModel.getDecorationRange(this.decorationId))); } toInlineCompletion(e) { - return this.inlineCompletion.withRange(this._updatedRange.read(e) ?? EW); + return this.inlineCompletion.withRange(this._updatedRange.read(e) ?? eN); } toSingleTextEdit(e) { - return new ka(this._updatedRange.read(e) ?? EW, this.inlineCompletion.insertText); + return new Ec(this._updatedRange.read(e) ?? eN, this.inlineCompletion.insertText); } isVisible(e, t, i) { - const n = mg(this._toFilterTextReplacement(i), e), o = this._updatedRange.read(i); + const n = ym(this._toFilterTextReplacement(i), e), o = this._updatedRange.read(i); if (!o || !this.inlineCompletion.range.getStartPosition().equals(o.getStartPosition()) || t.lineNumber !== n.range.startLineNumber) return !1; - const r = e.getValueInRange( + const l = e.getValueInRange( n.range, 1 /* EndOfLinePreference.LF */ - ), l = n.text, a = Math.max(0, t.column - n.range.startColumn); - let c = l.substring(0, a), d = l.substring(a), h = r.substring(0, a), u = r.substring(a); - const g = e.getLineIndentColumn(n.range.startLineNumber); - return n.range.startColumn <= g && (h = h.trimStart(), h.length === 0 && (u = u.trimStart()), c = c.trimStart(), c.length === 0 && (d = d.trimStart())), c.startsWith(h) && !!vK(u, d); + ), r = n.text, c = Math.max(0, t.column - n.range.startColumn); + let d = r.substring(0, c), a = r.substring(c), h = l.substring(0, c), u = l.substring(c); + const m = e.getLineIndentColumn(n.range.startLineNumber); + return n.range.startColumn <= m && (h = h.trimStart(), h.length === 0 && (u = u.trimStart()), d = d.trimStart(), d.length === 0 && (a = a.trimStart())), d.startsWith(h) && !!mO(u, a); } canBeReused(e, t) { const i = this._updatedRange.read(void 0); - return !!i && i.containsPosition(t) && this.isVisible(e, t, void 0) && Ur.ofRange(i).isGreaterThanOrEqualTo(Ur.ofRange(this.inlineCompletion.range)); + return !!i && i.containsPosition(t) && this.isVisible(e, t, void 0) && jl.ofRange(i).isGreaterThanOrEqualTo(jl.ofRange(this.inlineCompletion.range)); } _toFilterTextReplacement(e) { - return new ka(this._updatedRange.read(e) ?? EW, this.inlineCompletion.filterText); - } -} -const EW = new M(1, 1, 1, 1), ze = { - Visible: G5, - HasFocusedSuggestion: new ae("suggestWidgetHasFocusedSuggestion", !1, p("suggestWidgetHasSelection", "Whether any suggestion is focused")), - DetailsVisible: new ae("suggestWidgetDetailsVisible", !1, p("suggestWidgetDetailsVisible", "Whether suggestion details are visible")), - MultipleSuggestions: new ae("suggestWidgetMultipleSuggestions", !1, p("suggestWidgetMultipleSuggestions", "Whether there are multiple suggestions to pick from")), - MakesTextEdit: new ae("suggestionMakesTextEdit", !0, p("suggestionMakesTextEdit", "Whether inserting the current suggestion yields in a change or has everything already been typed")), - AcceptSuggestionsOnEnter: new ae("acceptSuggestionOnEnter", !0, p("acceptSuggestionOnEnter", "Whether suggestions are inserted when pressing Enter")), - HasInsertAndReplaceRange: new ae("suggestionHasInsertAndReplaceRange", !1, p("suggestionHasInsertAndReplaceRange", "Whether the current suggestion has insert and replace behaviour")), - InsertMode: new ae("suggestionInsertMode", void 0, { type: "string", description: p("suggestionInsertMode", "Whether the default behaviour is to insert or replace") }), - CanResolve: new ae("suggestionCanResolve", !1, p("suggestionCanResolve", "Whether the current suggestion supports to resolve further details")) -}, rh = new pe("suggestWidgetStatusBar"); -let qwe = class { + return new Ec(this._updatedRange.read(e) ?? eN, this.inlineCompletion.filterText); + } +} +const eN = new I(1, 1, 1, 1), ze = { + Visible: rE, + HasFocusedSuggestion: new ce("suggestWidgetHasFocusedSuggestion", !1, p("suggestWidgetHasSelection", "Whether any suggestion is focused")), + DetailsVisible: new ce("suggestWidgetDetailsVisible", !1, p("suggestWidgetDetailsVisible", "Whether suggestion details are visible")), + MultipleSuggestions: new ce("suggestWidgetMultipleSuggestions", !1, p("suggestWidgetMultipleSuggestions", "Whether there are multiple suggestions to pick from")), + MakesTextEdit: new ce("suggestionMakesTextEdit", !0, p("suggestionMakesTextEdit", "Whether inserting the current suggestion yields in a change or has everything already been typed")), + AcceptSuggestionsOnEnter: new ce("acceptSuggestionOnEnter", !0, p("acceptSuggestionOnEnter", "Whether suggestions are inserted when pressing Enter")), + HasInsertAndReplaceRange: new ce("suggestionHasInsertAndReplaceRange", !1, p("suggestionHasInsertAndReplaceRange", "Whether the current suggestion has insert and replace behaviour")), + InsertMode: new ce("suggestionInsertMode", void 0, { type: "string", description: p("suggestionInsertMode", "Whether the default behaviour is to insert or replace") }), + CanResolve: new ce("suggestionCanResolve", !1, p("suggestionCanResolve", "Whether the current suggestion supports to resolve further details")) +}, ah = new pe("suggestWidgetStatusBar"); +let KWe = class { constructor(e, t, i, n) { var o; - this.position = e, this.completion = t, this.container = i, this.provider = n, this.isInvalid = !1, this.score = Il.Default, this.distance = 0, this.textLabel = typeof t.label == "string" ? t.label : (o = t.label) == null ? void 0 : o.label, this.labelLow = this.textLabel.toLowerCase(), this.isInvalid = !this.textLabel, this.sortTextLow = t.sortText && t.sortText.toLowerCase(), this.filterTextLow = t.filterText && t.filterText.toLowerCase(), this.extensionId = t.extensionId, M.isIRange(t.range) ? (this.editStart = new V(t.range.startLineNumber, t.range.startColumn), this.editInsertEnd = new V(t.range.endLineNumber, t.range.endColumn), this.editReplaceEnd = new V(t.range.endLineNumber, t.range.endColumn), this.isInvalid = this.isInvalid || M.spansMultipleLines(t.range) || t.range.startLineNumber !== e.lineNumber) : (this.editStart = new V(t.range.insert.startLineNumber, t.range.insert.startColumn), this.editInsertEnd = new V(t.range.insert.endLineNumber, t.range.insert.endColumn), this.editReplaceEnd = new V(t.range.replace.endLineNumber, t.range.replace.endColumn), this.isInvalid = this.isInvalid || M.spansMultipleLines(t.range.insert) || M.spansMultipleLines(t.range.replace) || t.range.insert.startLineNumber !== e.lineNumber || t.range.replace.startLineNumber !== e.lineNumber || t.range.insert.startColumn !== t.range.replace.startColumn), typeof n.resolveCompletionItem != "function" && (this._resolveCache = Promise.resolve(), this._resolveDuration = 0); + this.position = e, this.completion = t, this.container = i, this.provider = n, this.isInvalid = !1, this.score = Tr.Default, this.distance = 0, this.textLabel = typeof t.label == "string" ? t.label : (o = t.label) == null ? void 0 : o.label, this.labelLow = this.textLabel.toLowerCase(), this.isInvalid = !this.textLabel, this.sortTextLow = t.sortText && t.sortText.toLowerCase(), this.filterTextLow = t.filterText && t.filterText.toLowerCase(), this.extensionId = t.extensionId, I.isIRange(t.range) ? (this.editStart = new Y(t.range.startLineNumber, t.range.startColumn), this.editInsertEnd = new Y(t.range.endLineNumber, t.range.endColumn), this.editReplaceEnd = new Y(t.range.endLineNumber, t.range.endColumn), this.isInvalid = this.isInvalid || I.spansMultipleLines(t.range) || t.range.startLineNumber !== e.lineNumber) : (this.editStart = new Y(t.range.insert.startLineNumber, t.range.insert.startColumn), this.editInsertEnd = new Y(t.range.insert.endLineNumber, t.range.insert.endColumn), this.editReplaceEnd = new Y(t.range.replace.endLineNumber, t.range.replace.endColumn), this.isInvalid = this.isInvalid || I.spansMultipleLines(t.range.insert) || I.spansMultipleLines(t.range.replace) || t.range.insert.startLineNumber !== e.lineNumber || t.range.replace.startLineNumber !== e.lineNumber || t.range.insert.startColumn !== t.range.replace.startColumn), typeof n.resolveCompletionItem != "function" && (this._resolveCache = Promise.resolve(), this._resolveDuration = 0); } // ---- resolving get isResolved() { @@ -79332,11 +79332,11 @@ let qwe = class { if (!this._resolveCache) { const t = e.onCancellationRequested(() => { this._resolveCache = void 0, this._resolveDuration = void 0; - }), i = new on(!0); + }), i = new ln(!0); this._resolveCache = Promise.resolve(this.provider.resolveCompletionItem(this.completion, e)).then((n) => { Object.assign(this.completion, n), this._resolveDuration = i.elapsed(); }, (n) => { - jr(n) && (this._resolveCache = void 0, this._resolveDuration = void 0); + er(n) && (this._resolveCache = void 0, this._resolveDuration = void 0); }).finally(() => { t.dispose(); }); @@ -79344,65 +79344,65 @@ let qwe = class { return this._resolveCache; } }; -const EZ = class EZ { +const $2 = class $2 { constructor(e = 2, t = /* @__PURE__ */ new Set(), i = /* @__PURE__ */ new Set(), n = /* @__PURE__ */ new Map(), o = !0) { this.snippetSortOrder = e, this.kindFilter = t, this.providerFilter = i, this.providerItemsToReuse = n, this.showDeprecated = o; } }; -EZ.default = new EZ(); -let Y1 = EZ; -class $we { +$2.default = new $2(); +let $W = $2; +class UWe { constructor(e, t, i, n) { this.items = e, this.needsClipboard = t, this.durations = i, this.disposable = n; } } -async function B5(s, e, t, i = Y1.default, n = { +async function pE(s, e, t, i = $W.default, n = { triggerKind: 0 /* languages.CompletionTriggerKind.Invoke */ -}, o = Ye.None) { - const r = new on(); +}, o = Fe.None) { + const l = new ln(); t = t.clone(); - const l = e.getWordAtPosition(t), a = l ? new M(t.lineNumber, l.startColumn, t.lineNumber, l.endColumn) : M.fromPositions(t), c = { replace: a, insert: a.setEndPosition(t.lineNumber, t.column) }, d = [], h = new U(), u = []; - let g = !1; - const m = (b, y, w) => { - var S; - let C = !1; - if (!y) - return C; - for (const L of y.suggestions) - if (!i.kindFilter.has(L.kind)) { - if (!i.showDeprecated && ((S = L == null ? void 0 : L.tags) != null && S.includes(1))) + const r = e.getWordAtPosition(t), c = r ? new I(t.lineNumber, r.startColumn, t.lineNumber, r.endColumn) : I.fromPositions(t), d = { replace: c, insert: c.setEndPosition(t.lineNumber, t.column) }, a = [], h = new _(), u = []; + let m = !1; + const b = (Z, f, y) => { + var G; + let W = !1; + if (!f) + return W; + for (const X of f.suggestions) + if (!i.kindFilter.has(X.kind)) { + if (!i.showDeprecated && ((G = X == null ? void 0 : X.tags) != null && G.includes(1))) continue; - L.range || (L.range = c), L.sortText || (L.sortText = typeof L.label == "string" ? L.label : L.label.label), !g && L.insertTextRules && L.insertTextRules & 4 && (g = Lm.guessNeedsClipboard(L.insertText)), d.push(new qwe(t, L, y, b)), C = !0; - } - return __(y) && h.add(y), u.push({ - providerName: b._debugDisplayName ?? "unknown_provider", - elapsedProvider: y.duration ?? -1, - elapsedOverall: w.elapsed() - }), C; - }, f = (async () => { + X.range || (X.range = d), X.sortText || (X.sortText = typeof X.label == "string" ? X.label : X.label.label), !m && X.insertTextRules && X.insertTextRules & 4 && (m = xb.guessNeedsClipboard(X.insertText)), a.push(new KWe(t, X, f, Z)), W = !0; + } + return zS(f) && h.add(f), u.push({ + providerName: Z._debugDisplayName ?? "unknown_provider", + elapsedProvider: f.duration ?? -1, + elapsedOverall: y.elapsed() + }), W; + }, g = (async () => { })(); - for (const b of s.orderedGroups(e)) { - let y = !1; - if (await Promise.all(b.map(async (w) => { - if (i.providerItemsToReuse.has(w)) { - const C = i.providerItemsToReuse.get(w); - C.forEach((S) => d.push(S)), y = y || C.length > 0; + for (const Z of s.orderedGroups(e)) { + let f = !1; + if (await Promise.all(Z.map(async (y) => { + if (i.providerItemsToReuse.has(y)) { + const W = i.providerItemsToReuse.get(y); + W.forEach((G) => a.push(G)), f = f || W.length > 0; return; } - if (!(i.providerFilter.size > 0 && !i.providerFilter.has(w))) + if (!(i.providerFilter.size > 0 && !i.providerFilter.has(y))) try { - const C = new on(), S = await w.provideCompletionItems(e, t, n, o); - y = m(w, S, C) || y; - } catch (C) { - wi(C); + const W = new ln(), G = await y.provideCompletionItems(e, t, n, o); + f = b(y, G, W) || f; + } catch (W) { + Wi(W); } - })), y || o.isCancellationRequested) + })), f || o.isCancellationRequested) break; } - return await f, o.isCancellationRequested ? (h.dispose(), Promise.reject(new Pr())) : new $we(d.sort(i1e(i.snippetSortOrder)), g, { entries: u, elapsed: r.elapsed() }, h); + return await g, o.isCancellationRequested ? (h.dispose(), Promise.reject(new Pl())) : new UWe(a.sort(_We(i.snippetSortOrder)), m, { entries: u, elapsed: l.elapsed() }, h); } -function O5(s, e) { +function gE(s, e) { if (s.sortTextLow && e.sortTextLow) { if (s.sortTextLow < e.sortTextLow) return -1; @@ -79411,60 +79411,60 @@ function O5(s, e) { } return s.textLabel < e.textLabel ? -1 : s.textLabel > e.textLabel ? 1 : s.completion.kind - e.completion.kind; } -function e1e(s, e) { +function PWe(s, e) { if (s.completion.kind !== e.completion.kind) { if (s.completion.kind === 27) return -1; if (e.completion.kind === 27) return 1; } - return O5(s, e); + return gE(s, e); } -function t1e(s, e) { +function BWe(s, e) { if (s.completion.kind !== e.completion.kind) { if (s.completion.kind === 27) return 1; if (e.completion.kind === 27) return -1; } - return O5(s, e); + return gE(s, e); } -const KI = /* @__PURE__ */ new Map(); -KI.set(0, e1e); -KI.set(2, t1e); -KI.set(1, O5); -function i1e(s) { - return KI.get(s); +const aC = /* @__PURE__ */ new Map(); +aC.set(0, PWe); +aC.set(2, BWe); +aC.set(1, gE); +function _We(s) { + return aC.get(s); } st.registerCommand("_executeCompletionItemProvider", async (s, ...e) => { const [t, i, n, o] = e; - ht(Le.isUri(t)), ht(V.isIPosition(i)), ht(typeof n == "string" || !n), ht(typeof o == "number" || !o); - const { completionProvider: r } = s.get(ge), l = await s.get(Ys).createModelReference(t); + ht(Xe.isUri(t)), ht(Y.isIPosition(i)), ht(typeof n == "string" || !n), ht(typeof o == "number" || !o); + const { completionProvider: l } = s.get(me), r = await s.get(As).createModelReference(t); try { - const a = { + const c = { incomplete: !1, suggestions: [] - }, c = [], d = l.object.textEditorModel.validatePosition(i), h = await B5(r, l.object.textEditorModel, d, void 0, { + }, d = [], a = r.object.textEditorModel.validatePosition(i), h = await pE(l, r.object.textEditorModel, a, void 0, { triggerCharacter: n ?? void 0, triggerKind: n ? 1 : 0 /* languages.CompletionTriggerKind.Invoke */ }); for (const u of h.items) - c.length < (o ?? 0) && c.push(u.resolve(Ye.None)), a.incomplete = a.incomplete || u.container.incomplete, a.suggestions.push(u.completion); + d.length < (o ?? 0) && d.push(u.resolve(Fe.None)), c.incomplete = c.incomplete || u.container.incomplete, c.suggestions.push(u.completion); try { - return await Promise.all(c), a; + return await Promise.all(d), c; } finally { setTimeout(() => h.disposable.dispose(), 100); } } finally { - l.dispose(); + r.dispose(); } }); -function n1e(s, e) { +function QWe(s, e) { var t; (t = s.getContribution("editor.contrib.suggestController")) == null || t.triggerSuggest((/* @__PURE__ */ new Set()).add(e), void 0, !0); } -class Kp { +class tg { static isAllOff(e) { return e.other === "off" && e.comments === "off" && e.strings === "off"; } @@ -79482,20 +79482,20 @@ class Kp { } } } -function nP(s, e = kn) { - return Jle(s, e) ? s.charAt(0).toUpperCase() + s.slice(1) : s; +function CK(s, e = Jn) { + return Ece(s, e) ? s.charAt(0).toUpperCase() + s.slice(1) : s; } -var s1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var OWe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, o1e = function(s, e) { +}, jWe = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class sP { +class RK { constructor(e) { this._delegates = e; } @@ -79507,7 +79507,7 @@ class sP { } } } -class oP { +class NK { constructor(e, t, i, n) { this._model = e, this._selection = t, this._selectionIdx = i, this._overtypingCapturer = n; } @@ -79520,11 +79520,11 @@ class oP { o && (i = o.value, n = o.multiline); } if (i && n && e.snippet) { - const o = this._model.getLineContent(this._selection.startLineNumber), r = Nt(o, 0, this._selection.startColumn - 1); - let l = r; - e.snippet.walk((c) => c === e ? !1 : (c instanceof as && (l = Nt(Fa(c.value).pop())), !0)); - const a = Ih(l, r); - i = i.replace(/(\r\n|\r|\n)(.*)/g, (c, d, h) => `${d}${l.substr(a)}${h}`); + const o = this._model.getLineContent(this._selection.startLineNumber), l = Rt(o, 0, this._selection.startColumn - 1); + let r = l; + e.snippet.walk((d) => d === e ? !1 : (d instanceof as && (r = Rt(Kc(d.value).pop())), !0)); + const c = Th(r, l); + i = i.replace(/(\r\n|\r|\n)(.*)/g, (d, a, h) => `${a}${r.substr(c)}${h}`); } return i; } else { @@ -79549,20 +79549,20 @@ class oP { } } } -class rP { +class wK { constructor(e, t) { this._labelService = e, this._model = t; } resolve(e) { const { name: t } = e; if (t === "TM_FILENAME") - return $d(this._model.uri.fsPath); + return nh(this._model.uri.fsPath); if (t === "TM_FILENAME_BASE") { - const i = $d(this._model.uri.fsPath), n = i.lastIndexOf("."); + const i = nh(this._model.uri.fsPath), n = i.lastIndexOf("."); return n <= 0 ? i : i.slice(0, n); } else { if (t === "TM_DIRECTORY") - return JH(this._model.uri.fsPath) === "." ? "" : this._labelService.getUriLabel(bI(this._model.uri)); + return RB(this._model.uri.fsPath) === "." ? "" : this._labelService.getUriLabel(Tx(this._model.uri)); if (t === "TM_FILEPATH") return this._labelService.getUriLabel(this._model.uri); if (t === "RELATIVE_FILEPATH") @@ -79570,7 +79570,7 @@ class rP { } } } -class lP { +class TK { constructor(e, t, i, n) { this._readClipboardText = e, this._selectionIdx = t, this._selectionCount = i, this._spread = n; } @@ -79580,7 +79580,7 @@ class lP { const t = this._readClipboardText(); if (t) { if (this._spread) { - const i = t.split(/\r\n|\n|\r/).filter((n) => !RH(n)); + const i = t.split(/\r\n|\n|\r/).filter((n) => !yB(n)); if (i.length === this._selectionCount) return i[this._selectionIdx]; } @@ -79588,7 +79588,7 @@ class lP { } } } -let jx = class { +let uI = class { constructor(e, t, i) { this._model = e, this._selection = t, this._languageConfigurationService = i; } @@ -79604,10 +79604,10 @@ let jx = class { } } }; -jx = s1e([ - o1e(2, li) -], jx); -const la = class la { +uI = OWe([ + jWe(2, ci) +], uI); +const hc = class hc { constructor() { this._date = /* @__PURE__ */ new Date(); } @@ -79628,32 +79628,32 @@ const la = class la { if (t === "CURRENT_SECOND") return String(this._date.getSeconds().valueOf()).padStart(2, "0"); if (t === "CURRENT_DAY_NAME") - return la.dayNames[this._date.getDay()]; + return hc.dayNames[this._date.getDay()]; if (t === "CURRENT_DAY_NAME_SHORT") - return la.dayNamesShort[this._date.getDay()]; + return hc.dayNamesShort[this._date.getDay()]; if (t === "CURRENT_MONTH_NAME") - return la.monthNames[this._date.getMonth()]; + return hc.monthNames[this._date.getMonth()]; if (t === "CURRENT_MONTH_NAME_SHORT") - return la.monthNamesShort[this._date.getMonth()]; + return hc.monthNamesShort[this._date.getMonth()]; if (t === "CURRENT_SECONDS_UNIX") return String(Math.floor(this._date.getTime() / 1e3)); if (t === "CURRENT_TIMEZONE_OFFSET") { - const i = this._date.getTimezoneOffset(), n = i > 0 ? "-" : "+", o = Math.trunc(Math.abs(i / 60)), r = o < 10 ? "0" + o : o, l = Math.abs(i) - o * 60, a = l < 10 ? "0" + l : l; - return n + r + ":" + a; + const i = this._date.getTimezoneOffset(), n = i > 0 ? "-" : "+", o = Math.trunc(Math.abs(i / 60)), l = o < 10 ? "0" + o : o, r = Math.abs(i) - o * 60, c = r < 10 ? "0" + r : r; + return n + l + ":" + c; } } }; -la.dayNames = [p("Sunday", "Sunday"), p("Monday", "Monday"), p("Tuesday", "Tuesday"), p("Wednesday", "Wednesday"), p("Thursday", "Thursday"), p("Friday", "Friday"), p("Saturday", "Saturday")], la.dayNamesShort = [p("SundayShort", "Sun"), p("MondayShort", "Mon"), p("TuesdayShort", "Tue"), p("WednesdayShort", "Wed"), p("ThursdayShort", "Thu"), p("FridayShort", "Fri"), p("SaturdayShort", "Sat")], la.monthNames = [p("January", "January"), p("February", "February"), p("March", "March"), p("April", "April"), p("May", "May"), p("June", "June"), p("July", "July"), p("August", "August"), p("September", "September"), p("October", "October"), p("November", "November"), p("December", "December")], la.monthNamesShort = [p("JanuaryShort", "Jan"), p("FebruaryShort", "Feb"), p("MarchShort", "Mar"), p("AprilShort", "Apr"), p("MayShort", "May"), p("JuneShort", "Jun"), p("JulyShort", "Jul"), p("AugustShort", "Aug"), p("SeptemberShort", "Sep"), p("OctoberShort", "Oct"), p("NovemberShort", "Nov"), p("DecemberShort", "Dec")]; -let qx = la; -class aP { +hc.dayNames = [p("Sunday", "Sunday"), p("Monday", "Monday"), p("Tuesday", "Tuesday"), p("Wednesday", "Wednesday"), p("Thursday", "Thursday"), p("Friday", "Friday"), p("Saturday", "Saturday")], hc.dayNamesShort = [p("SundayShort", "Sun"), p("MondayShort", "Mon"), p("TuesdayShort", "Tue"), p("WednesdayShort", "Wed"), p("ThursdayShort", "Thu"), p("FridayShort", "Fri"), p("SaturdayShort", "Sat")], hc.monthNames = [p("January", "January"), p("February", "February"), p("March", "March"), p("April", "April"), p("May", "May"), p("June", "June"), p("July", "July"), p("August", "August"), p("September", "September"), p("October", "October"), p("November", "November"), p("December", "December")], hc.monthNamesShort = [p("JanuaryShort", "Jan"), p("FebruaryShort", "Feb"), p("MarchShort", "Mar"), p("AprilShort", "Apr"), p("MayShort", "May"), p("JuneShort", "Jun"), p("JulyShort", "Jul"), p("AugustShort", "Aug"), p("SeptemberShort", "Sep"), p("OctoberShort", "Oct"), p("NovemberShort", "Nov"), p("DecemberShort", "Dec")]; +let mI = hc; +class MK { constructor(e) { this._workspaceService = e; } resolve(e) { if (!this._workspaceService) return; - const t = Eme(this._workspaceService.getWorkspace()); - if (!Gme(t)) { + const t = Npe(this._workspaceService.getWorkspace()); + if (!Cpe(t)) { if (e.name === "WORKSPACE_NAME") return this._resolveWorkspaceName(t); if (e.name === "WORKSPACE_FOLDER") @@ -79661,20 +79661,20 @@ class aP { } } _resolveWorkspaceName(e) { - if (WT(e)) - return $d(e.uri.path); - let t = $d(e.configPath.path); - return t.endsWith(vT) && (t = t.substr(0, t.length - vT.length - 1)), t; + if (jT(e)) + return nh(e.uri.path); + let t = nh(e.configPath.path); + return t.endsWith(qT) && (t = t.substr(0, t.length - qT.length - 1)), t; } _resoveWorkspacePath(e) { - if (WT(e)) - return nP(e.uri.fsPath); - const t = $d(e.configPath.path); + if (jT(e)) + return CK(e.uri.fsPath); + const t = nh(e.configPath.path); let i = e.configPath.fsPath; - return i.endsWith(t) && (i = i.substr(0, i.length - t.length - 1)), i ? nP(i) : "/"; + return i.endsWith(t) && (i = i.substr(0, i.length - t.length - 1)), i ? CK(i) : "/"; } } -class cP { +class YK { resolve(e) { const { name: t } = e; if (t === "RANDOM") @@ -79682,22 +79682,22 @@ class cP { if (t === "RANDOM_HEX") return Math.random().toString(16).slice(-6); if (t === "UUID") - return TI(); + return Bx(); } } -var r1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var qWe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, l1e = function(s, e) { +}, $We = function(s, e) { return function(t, i) { e(t, i, s); }; -}, rl; -const Tr = class Tr { +}, dr; +const kl = class kl { constructor(e, t, i) { - this._editor = e, this._snippet = t, this._snippetLineLeadingWhitespace = i, this._offset = -1, this._nestingLevel = 1, this._placeholderGroups = uF(t.placeholders, or.compareByIndex), this._placeholderGroupsIdx = -1; + this._editor = e, this._snippet = t, this._snippetLineLeadingWhitespace = i, this._offset = -1, this._nestingLevel = 1, this._placeholderGroups = JD(t.placeholders, rl.compareByIndex), this._placeholderGroupsIdx = -1; } initialize(e) { this._offset = e.newPosition; @@ -79714,8 +79714,8 @@ const Tr = class Tr { const e = this._editor.getModel(); this._editor.changeDecorations((t) => { for (const i of this._snippet.placeholders) { - const n = this._snippet.offset(i), o = this._snippet.fullLen(i), r = M.fromPositions(e.getPositionAt(this._offset + n), e.getPositionAt(this._offset + n + o)), l = i.isFinalTabstop ? Tr._decor.inactiveFinal : Tr._decor.inactive, a = t.addDecoration(r, l); - this._placeholderDecorations.set(i, a); + const n = this._snippet.offset(i), o = this._snippet.fullLen(i), l = I.fromPositions(e.getPositionAt(this._offset + n), e.getPositionAt(this._offset + n + o)), r = i.isFinalTabstop ? kl._decor.inactiveFinal : kl._decor.inactive, c = t.addDecoration(l, r); + this._placeholderDecorations.set(i, c); } }); } @@ -79726,35 +79726,35 @@ const Tr = class Tr { const n = []; for (const o of this._placeholderGroups[this._placeholderGroupsIdx]) if (o.transform) { - const r = this._placeholderDecorations.get(o), l = this._editor.getModel().getDecorationRange(r), a = this._editor.getModel().getValueInRange(l), c = o.transform.resolve(a).split(/\r\n|\r|\n/); - for (let d = 1; d < c.length; d++) - c[d] = this._editor.getModel().normalizeIndentation(this._snippetLineLeadingWhitespace + c[d]); - n.push(si.replace(l, c.join(this._editor.getModel().getEOL()))); + const l = this._placeholderDecorations.get(o), r = this._editor.getModel().getDecorationRange(l), c = this._editor.getModel().getValueInRange(r), d = o.transform.resolve(c).split(/\r\n|\r|\n/); + for (let a = 1; a < d.length; a++) + d[a] = this._editor.getModel().normalizeIndentation(this._snippetLineLeadingWhitespace + d[a]); + n.push(oi.replace(r, d.join(this._editor.getModel().getEOL()))); } n.length > 0 && this._editor.executeEdits("snippet.placeholderTransform", n); } let t = !1; e === !0 && this._placeholderGroupsIdx < this._placeholderGroups.length - 1 ? (this._placeholderGroupsIdx += 1, t = !0) : e === !1 && this._placeholderGroupsIdx > 0 && (this._placeholderGroupsIdx -= 1, t = !0); const i = this._editor.getModel().changeDecorations((n) => { - const o = /* @__PURE__ */ new Set(), r = []; - for (const l of this._placeholderGroups[this._placeholderGroupsIdx]) { - const a = this._placeholderDecorations.get(l), c = this._editor.getModel().getDecorationRange(a); - r.push(new fe(c.startLineNumber, c.startColumn, c.endLineNumber, c.endColumn)), t = t && this._hasPlaceholderBeenCollapsed(l), n.changeDecorationOptions(a, l.isFinalTabstop ? Tr._decor.activeFinal : Tr._decor.active), o.add(l); - for (const d of this._snippet.enclosingPlaceholders(l)) { - const h = this._placeholderDecorations.get(d); - n.changeDecorationOptions(h, d.isFinalTabstop ? Tr._decor.activeFinal : Tr._decor.active), o.add(d); + const o = /* @__PURE__ */ new Set(), l = []; + for (const r of this._placeholderGroups[this._placeholderGroupsIdx]) { + const c = this._placeholderDecorations.get(r), d = this._editor.getModel().getDecorationRange(c); + l.push(new ge(d.startLineNumber, d.startColumn, d.endLineNumber, d.endColumn)), t = t && this._hasPlaceholderBeenCollapsed(r), n.changeDecorationOptions(c, r.isFinalTabstop ? kl._decor.activeFinal : kl._decor.active), o.add(r); + for (const a of this._snippet.enclosingPlaceholders(r)) { + const h = this._placeholderDecorations.get(a); + n.changeDecorationOptions(h, a.isFinalTabstop ? kl._decor.activeFinal : kl._decor.active), o.add(a); } } - for (const [l, a] of this._placeholderDecorations) - o.has(l) || n.changeDecorationOptions(a, l.isFinalTabstop ? Tr._decor.inactiveFinal : Tr._decor.inactive); - return r; + for (const [r, c] of this._placeholderDecorations) + o.has(r) || n.changeDecorationOptions(c, r.isFinalTabstop ? kl._decor.inactiveFinal : kl._decor.inactive); + return l; }); return t ? this.move(e) : i ?? []; } _hasPlaceholderBeenCollapsed(e) { let t = e; for (; t; ) { - if (t instanceof or) { + if (t instanceof rl) { const i = this._placeholderDecorations.get(t); if (this._editor.getModel().getDecorationRange(i).isEmpty() && t.toString().length > 0) return !0; @@ -79794,12 +79794,12 @@ const Tr = class Tr { if (n.isFinalTabstop) break; i || (i = [], e.set(n.index, i)); - const o = this._placeholderDecorations.get(n), r = this._editor.getModel().getDecorationRange(o); - if (!r) { + const o = this._placeholderDecorations.get(n), l = this._editor.getModel().getDecorationRange(o); + if (!l) { e.delete(n.index); break; } - i.push(r); + i.push(l); } } return e; @@ -79819,7 +79819,7 @@ const Tr = class Tr { } get hasChoice() { let e = !1; - return this._snippet.walk((t) => (e = t instanceof p0, !e)), e; + return this._snippet.walk((t) => (e = t instanceof G0, !e)), e; } merge(e) { const t = this._editor.getModel(); @@ -79827,135 +79827,135 @@ const Tr = class Tr { for (const n of this._placeholderGroups[this._placeholderGroupsIdx]) { const o = e.shift(); console.assert(o._offset !== -1), console.assert(!o._placeholderDecorations); - const r = o._snippet.placeholderInfo.last.index; - for (const a of o._snippet.placeholderInfo.all) - a.isFinalTabstop ? a.index = n.index + (r + 1) / this._nestingLevel : a.index = n.index + a.index / this._nestingLevel; + const l = o._snippet.placeholderInfo.last.index; + for (const c of o._snippet.placeholderInfo.all) + c.isFinalTabstop ? c.index = n.index + (l + 1) / this._nestingLevel : c.index = n.index + c.index / this._nestingLevel; this._snippet.replace(n, o._snippet.children); - const l = this._placeholderDecorations.get(n); - i.removeDecoration(l), this._placeholderDecorations.delete(n); - for (const a of o._snippet.placeholders) { - const c = o._snippet.offset(a), d = o._snippet.fullLen(a), h = M.fromPositions(t.getPositionAt(o._offset + c), t.getPositionAt(o._offset + c + d)), u = i.addDecoration(h, Tr._decor.inactive); - this._placeholderDecorations.set(a, u); + const r = this._placeholderDecorations.get(n); + i.removeDecoration(r), this._placeholderDecorations.delete(n); + for (const c of o._snippet.placeholders) { + const d = o._snippet.offset(c), a = o._snippet.fullLen(c), h = I.fromPositions(t.getPositionAt(o._offset + d), t.getPositionAt(o._offset + d + a)), u = i.addDecoration(h, kl._decor.inactive); + this._placeholderDecorations.set(c, u); } } - this._placeholderGroups = uF(this._snippet.placeholders, or.compareByIndex); + this._placeholderGroups = JD(this._snippet.placeholders, rl.compareByIndex); }); } }; -Tr._decor = { - active: Re.register({ description: "snippet-placeholder-1", stickiness: 0, className: "snippet-placeholder" }), - inactive: Re.register({ description: "snippet-placeholder-2", stickiness: 1, className: "snippet-placeholder" }), - activeFinal: Re.register({ description: "snippet-placeholder-3", stickiness: 1, className: "finish-snippet-placeholder" }), - inactiveFinal: Re.register({ description: "snippet-placeholder-4", stickiness: 1, className: "finish-snippet-placeholder" }) +kl._decor = { + active: Je.register({ description: "snippet-placeholder-1", stickiness: 0, className: "snippet-placeholder" }), + inactive: Je.register({ description: "snippet-placeholder-2", stickiness: 1, className: "snippet-placeholder" }), + activeFinal: Je.register({ description: "snippet-placeholder-3", stickiness: 1, className: "finish-snippet-placeholder" }), + inactiveFinal: Je.register({ description: "snippet-placeholder-4", stickiness: 1, className: "finish-snippet-placeholder" }) }; -let $x = Tr; -const dP = { +let bI = kl; +const kK = { overwriteBefore: 0, overwriteAfter: 0, adjustWhitespace: !0, clipboardText: void 0, overtypingCapturer: void 0 }; -let eM = rl = class { +let pI = dr = class { static adjustWhitespace(e, t, i, n, o) { - const r = e.getLineContent(t.lineNumber), l = Nt(r, 0, t.column - 1); - let a; - return n.walk((c) => { - if (!(c instanceof as) || c.parent instanceof p0 || o && !o.has(c)) + const l = e.getLineContent(t.lineNumber), r = Rt(l, 0, t.column - 1); + let c; + return n.walk((d) => { + if (!(d instanceof as) || d.parent instanceof G0 || o && !o.has(d)) return !0; - const d = c.value.split(/\r\n|\r|\n/); + const a = d.value.split(/\r\n|\r|\n/); if (i) { - const u = n.offset(c); + const u = n.offset(d); if (u === 0) - d[0] = e.normalizeIndentation(d[0]); + a[0] = e.normalizeIndentation(a[0]); else { - a = a ?? n.toString(); - const g = a.charCodeAt(u - 1); - (g === 10 || g === 13) && (d[0] = e.normalizeIndentation(l + d[0])); + c = c ?? n.toString(); + const m = c.charCodeAt(u - 1); + (m === 10 || m === 13) && (a[0] = e.normalizeIndentation(r + a[0])); } - for (let g = 1; g < d.length; g++) - d[g] = e.normalizeIndentation(l + d[g]); + for (let m = 1; m < a.length; m++) + a[m] = e.normalizeIndentation(r + a[m]); } - const h = d.join(e.getEOL()); - return h !== c.value && (c.parent.replace(c, [new as(h)]), a = void 0), !0; - }), l; + const h = a.join(e.getEOL()); + return h !== d.value && (d.parent.replace(d, [new as(h)]), c = void 0), !0; + }), r; } static adjustSelection(e, t, i, n) { if (i !== 0 || n !== 0) { - const { positionLineNumber: o, positionColumn: r } = t, l = r - i, a = r + n, c = e.validateRange({ + const { positionLineNumber: o, positionColumn: l } = t, r = l - i, c = l + n, d = e.validateRange({ startLineNumber: o, - startColumn: l, + startColumn: r, endLineNumber: o, - endColumn: a + endColumn: c }); - t = fe.createWithDirection(c.startLineNumber, c.startColumn, c.endLineNumber, c.endColumn, t.getDirection()); + t = ge.createWithDirection(d.startLineNumber, d.startColumn, d.endLineNumber, d.endColumn, t.getDirection()); } return t; } - static createEditsAndSnippetsFromSelections(e, t, i, n, o, r, l, a, c) { - const d = [], h = []; + static createEditsAndSnippetsFromSelections(e, t, i, n, o, l, r, c, d) { + const a = [], h = []; if (!e.hasModel()) - return { edits: d, snippets: h }; - const u = e.getModel(), g = e.invokeWithinContext((S) => S.get(Cm)), m = e.invokeWithinContext((S) => new rP(S.get(Nb), u)), f = () => l, b = u.getValueInRange(rl.adjustSelection(u, e.getSelection(), i, 0)), y = u.getValueInRange(rl.adjustSelection(u, e.getSelection(), 0, n)), w = u.getLineFirstNonWhitespaceColumn(e.getSelection().positionLineNumber), C = e.getSelections().map((S, L) => ({ selection: S, idx: L })).sort((S, L) => M.compareRangesUsingStarts(S.selection, L.selection)); - for (const { selection: S, idx: L } of C) { - let x = rl.adjustSelection(u, S, i, 0), Z = rl.adjustSelection(u, S, 0, n); - b !== u.getValueInRange(x) && (x = S), y !== u.getValueInRange(Z) && (Z = S); - const _ = S.setStartPosition(x.startLineNumber, x.startColumn).setEndPosition(Z.endLineNumber, Z.endColumn), v = new Lm().parse(t, !0, o), P = _.getStartPosition(), E = rl.adjustWhitespace(u, P, r || L > 0 && w !== u.getLineFirstNonWhitespaceColumn(S.positionLineNumber), v); - v.resolveVariables(new sP([ - m, - new lP(f, L, C.length, e.getOption( + return { edits: a, snippets: h }; + const u = e.getModel(), m = e.invokeWithinContext((G) => G.get(Ib)), b = e.invokeWithinContext((G) => new wK(G.get(kZ), u)), g = () => r, Z = u.getValueInRange(dr.adjustSelection(u, e.getSelection(), i, 0)), f = u.getValueInRange(dr.adjustSelection(u, e.getSelection(), 0, n)), y = u.getLineFirstNonWhitespaceColumn(e.getSelection().positionLineNumber), W = e.getSelections().map((G, X) => ({ selection: G, idx: X })).sort((G, X) => I.compareRangesUsingStarts(G.selection, X.selection)); + for (const { selection: G, idx: X } of W) { + let L = dr.adjustSelection(u, G, i, 0), S = dr.adjustSelection(u, G, 0, n); + Z !== u.getValueInRange(L) && (L = G), f !== u.getValueInRange(S) && (S = G); + const x = G.setStartPosition(L.startLineNumber, L.startColumn).setEndPosition(S.endLineNumber, S.endColumn), w = new xb().parse(t, !0, o), A = x.getStartPosition(), H = dr.adjustWhitespace(u, A, l || X > 0 && y !== u.getLineFirstNonWhitespaceColumn(G.positionLineNumber), w); + w.resolveVariables(new RK([ + b, + new TK(g, X, W.length, e.getOption( 79 /* EditorOption.multiCursorPaste */ ) === "spread"), - new oP(u, S, L, a), - new jx(u, S, c), - new qx(), - new aP(g), - new cP() - ])), d[L] = si.replace(_, v.toString()), d[L].identifier = { major: L, minor: 0 }, d[L]._isTracked = !0, h[L] = new $x(e, v, E); + new NK(u, G, X, c), + new uI(u, G, d), + new mI(), + new MK(m), + new YK() + ])), a[X] = oi.replace(x, w.toString()), a[X].identifier = { major: X, minor: 0 }, a[X]._isTracked = !0, h[X] = new bI(e, w, H); } - return { edits: d, snippets: h }; + return { edits: a, snippets: h }; } - static createEditsAndSnippetsFromEdits(e, t, i, n, o, r, l) { + static createEditsAndSnippetsFromEdits(e, t, i, n, o, l, r) { if (!e.hasModel() || t.length === 0) return { edits: [], snippets: [] }; - const a = [], c = e.getModel(), d = new Lm(), h = new DC(), u = new sP([ - e.invokeWithinContext((m) => new rP(m.get(Nb), c)), - new lP(() => o, 0, e.getSelections().length, e.getOption( + const c = [], d = e.getModel(), a = new xb(), h = new PG(), u = new RK([ + e.invokeWithinContext((b) => new wK(b.get(kZ), d)), + new TK(() => o, 0, e.getSelections().length, e.getOption( 79 /* EditorOption.multiCursorPaste */ ) === "spread"), - new oP(c, e.getSelection(), 0, r), - new jx(c, e.getSelection(), l), - new qx(), - new aP(e.invokeWithinContext((m) => m.get(Cm))), - new cP() + new NK(d, e.getSelection(), 0, l), + new uI(d, e.getSelection(), r), + new mI(), + new MK(e.invokeWithinContext((b) => b.get(Ib))), + new YK() ]); - t = t.sort((m, f) => M.compareRangesUsingStarts(m.range, f.range)); - let g = 0; - for (let m = 0; m < t.length; m++) { - const { range: f, template: b } = t[m]; - if (m > 0) { - const L = t[m - 1].range, x = M.fromPositions(L.getEndPosition(), f.getStartPosition()), Z = new as(c.getValueInRange(x)); - h.appendChild(Z), g += Z.value.length; - } - const y = d.parseFragment(b, h); - rl.adjustWhitespace(c, f.getStartPosition(), !0, h, new Set(y)), h.resolveVariables(u); - const w = h.toString(), C = w.slice(g); - g = w.length; - const S = si.replace(f, C); - S.identifier = { major: m, minor: 0 }, S._isTracked = !0, a.push(S); - } - return d.ensureFinalTabstop(h, i, !0), { - edits: a, - snippets: [new $x(e, h, "")] + t = t.sort((b, g) => I.compareRangesUsingStarts(b.range, g.range)); + let m = 0; + for (let b = 0; b < t.length; b++) { + const { range: g, template: Z } = t[b]; + if (b > 0) { + const X = t[b - 1].range, L = I.fromPositions(X.getEndPosition(), g.getStartPosition()), S = new as(d.getValueInRange(L)); + h.appendChild(S), m += S.value.length; + } + const f = a.parseFragment(Z, h); + dr.adjustWhitespace(d, g.getStartPosition(), !0, h, new Set(f)), h.resolveVariables(u); + const y = h.toString(), W = y.slice(m); + m = y.length; + const G = oi.replace(g, W); + G.identifier = { major: b, minor: 0 }, G._isTracked = !0, c.push(G); + } + return a.ensureFinalTabstop(h, i, !0), { + edits: c, + snippets: [new bI(e, h, "")] }; } - constructor(e, t, i = dP, n) { + constructor(e, t, i = kK, n) { this._editor = e, this._template = t, this._options = i, this._languageConfigurationService = n, this._templateMerges = [], this._snippets = []; } dispose() { - Wt(this._snippets); + Nt(this._snippets); } _logInfo() { return `template="${this._template}", merged_templates="${this._templateMerges.join(" -> ")}"`; @@ -79963,30 +79963,30 @@ let eM = rl = class { insert() { if (!this._editor.hasModel()) return; - const { edits: e, snippets: t } = typeof this._template == "string" ? rl.createEditsAndSnippetsFromSelections(this._editor, this._template, this._options.overwriteBefore, this._options.overwriteAfter, !1, this._options.adjustWhitespace, this._options.clipboardText, this._options.overtypingCapturer, this._languageConfigurationService) : rl.createEditsAndSnippetsFromEdits(this._editor, this._template, !1, this._options.adjustWhitespace, this._options.clipboardText, this._options.overtypingCapturer, this._languageConfigurationService); + const { edits: e, snippets: t } = typeof this._template == "string" ? dr.createEditsAndSnippetsFromSelections(this._editor, this._template, this._options.overwriteBefore, this._options.overwriteAfter, !1, this._options.adjustWhitespace, this._options.clipboardText, this._options.overtypingCapturer, this._languageConfigurationService) : dr.createEditsAndSnippetsFromEdits(this._editor, this._template, !1, this._options.adjustWhitespace, this._options.clipboardText, this._options.overtypingCapturer, this._languageConfigurationService); this._snippets = t, this._editor.executeEdits("snippet", e, (i) => { const n = i.filter((o) => !!o.identifier); for (let o = 0; o < t.length; o++) t[o].initialize(n[o].textChange); - return this._snippets[0].hasPlaceholder ? this._move(!0) : n.map((o) => fe.fromPositions(o.range.getEndPosition())); + return this._snippets[0].hasPlaceholder ? this._move(!0) : n.map((o) => ge.fromPositions(o.range.getEndPosition())); }), this._editor.revealRange(this._editor.getSelections()[0]); } - merge(e, t = dP) { + merge(e, t = kK) { if (!this._editor.hasModel()) return; this._templateMerges.push([this._snippets[0]._nestingLevel, this._snippets[0]._placeholderGroupsIdx, e]); - const { edits: i, snippets: n } = rl.createEditsAndSnippetsFromSelections(this._editor, e, t.overwriteBefore, t.overwriteAfter, !0, t.adjustWhitespace, t.clipboardText, t.overtypingCapturer, this._languageConfigurationService); + const { edits: i, snippets: n } = dr.createEditsAndSnippetsFromSelections(this._editor, e, t.overwriteBefore, t.overwriteAfter, !0, t.adjustWhitespace, t.clipboardText, t.overtypingCapturer, this._languageConfigurationService); this._editor.executeEdits("snippet", i, (o) => { - const r = o.filter((a) => !!a.identifier); - for (let a = 0; a < n.length; a++) - n[a].initialize(r[a].textChange); - const l = n[0].isTrivialSnippet; - if (!l) { - for (const a of this._snippets) - a.merge(n); + const l = o.filter((c) => !!c.identifier); + for (let c = 0; c < n.length; c++) + n[c].initialize(l[c].textChange); + const r = n[0].isTrivialSnippet; + if (!r) { + for (const c of this._snippets) + c.merge(n); console.assert(n.length === 0); } - return this._snippets[0].hasPlaceholder && !l ? this._move(void 0) : r.map((a) => fe.fromPositions(a.range.getEndPosition())); + return this._snippets[0].hasPlaceholder && !r ? this._move(void 0) : l.map((c) => ge.fromPositions(c.range.getEndPosition())); }); } next() { @@ -80030,27 +80030,27 @@ let eM = rl = class { for (const i of this._snippets) { const n = i.computePossibleSelections(); if (t.size === 0) - for (const [o, r] of n) { - r.sort(M.compareRangesUsingStarts); - for (const l of e) - if (r[0].containsRange(l)) { + for (const [o, l] of n) { + l.sort(I.compareRangesUsingStarts); + for (const r of e) + if (l[0].containsRange(r)) { t.set(o, []); break; } } if (t.size === 0) return !1; - t.forEach((o, r) => { - o.push(...n.get(r)); + t.forEach((o, l) => { + o.push(...n.get(l)); }); } - e.sort(M.compareRangesUsingStarts); + e.sort(I.compareRangesUsingStarts); for (const [i, n] of t) { if (n.length !== e.length) { t.delete(i); continue; } - n.sort(M.compareRangesUsingStarts); + n.sort(I.compareRangesUsingStarts); for (let o = 0; o < n.length; o++) if (!n[o].containsRange(e[o])) { t.delete(i); @@ -80060,20 +80060,20 @@ let eM = rl = class { return t.size > 0; } }; -eM = rl = r1e([ - l1e(3, li) -], eM); -var a1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +pI = dr = qWe([ + $We(3, ci) +], pI); +var eGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, FS = function(s, e) { +}, $1 = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Ip; -const hP = { +}, Yp; +const vK = { overwriteBefore: 0, overwriteAfter: 0, undoStopBefore: !0, @@ -80082,13 +80082,13 @@ const hP = { clipboardText: void 0, overtypingCapturer: void 0 }; -var Sa; -let Cs = (Sa = class { +var Ic; +let Xs = (Ic = class { static get(e) { - return e.getContribution(Ip.ID); + return e.getContribution(Yp.ID); } constructor(e, t, i, n, o) { - this._editor = e, this._logService = t, this._languageFeaturesService = i, this._languageConfigurationService = o, this._snippetListener = new U(), this._modelVersionId = -1, this._inSnippet = Ip.InSnippetMode.bindTo(n), this._hasNextTabstop = Ip.HasNextTabstop.bindTo(n), this._hasPrevTabstop = Ip.HasPrevTabstop.bindTo(n); + this._editor = e, this._logService = t, this._languageFeaturesService = i, this._languageConfigurationService = o, this._snippetListener = new _(), this._modelVersionId = -1, this._inSnippet = Yp.InSnippetMode.bindTo(n), this._hasNextTabstop = Yp.HasNextTabstop.bindTo(n), this._hasPrevTabstop = Yp.HasPrevTabstop.bindTo(n); } dispose() { var e; @@ -80096,7 +80096,7 @@ let Cs = (Sa = class { } insert(e, t) { try { - this._doInsert(e, typeof t > "u" ? hP : { ...hP, ...t }); + this._doInsert(e, typeof t > "u" ? vK : { ...vK, ...t }); } catch (i) { this.cancel(), this._logService.error(i), this._logService.error("snippet_error"), this._logService.error("insert_template=", e), this._logService.error("existing_template=", this._session ? this._session._logInfo() : ""); } @@ -80104,43 +80104,43 @@ let Cs = (Sa = class { _doInsert(e, t) { var i; if (this._editor.hasModel()) { - if (this._snippetListener.clear(), t.undoStopBefore && this._editor.getModel().pushStackElement(), this._session && typeof e != "string" && this.cancel(), this._session ? (ht(typeof e == "string"), this._session.merge(e, t)) : (this._modelVersionId = this._editor.getModel().getAlternativeVersionId(), this._session = new eM(this._editor, e, t, this._languageConfigurationService), this._session.insert()), t.undoStopAfter && this._editor.getModel().pushStackElement(), (i = this._session) != null && i.hasChoice) { + if (this._snippetListener.clear(), t.undoStopBefore && this._editor.getModel().pushStackElement(), this._session && typeof e != "string" && this.cancel(), this._session ? (ht(typeof e == "string"), this._session.merge(e, t)) : (this._modelVersionId = this._editor.getModel().getAlternativeVersionId(), this._session = new pI(this._editor, e, t, this._languageConfigurationService), this._session.insert()), t.undoStopAfter && this._editor.getModel().pushStackElement(), (i = this._session) != null && i.hasChoice) { const n = { _debugDisplayName: "snippetChoiceCompletions", - provideCompletionItems: (d, h) => { - if (!this._session || d !== this._editor.getModel() || !V.equals(this._editor.getPosition(), h)) + provideCompletionItems: (a, h) => { + if (!this._session || a !== this._editor.getModel() || !Y.equals(this._editor.getPosition(), h)) return; const { activeChoice: u } = this._session; if (!u || u.choice.options.length === 0) return; - const g = d.getValueInRange(u.range), m = !!u.choice.options.find((b) => b.value === g), f = []; - for (let b = 0; b < u.choice.options.length; b++) { - const y = u.choice.options[b]; - f.push({ + const m = a.getValueInRange(u.range), b = !!u.choice.options.find((Z) => Z.value === m), g = []; + for (let Z = 0; Z < u.choice.options.length; Z++) { + const f = u.choice.options[Z]; + g.push({ kind: 13, - label: y.value, - insertText: y.value, - sortText: "a".repeat(b + 1), + label: f.value, + insertText: f.value, + sortText: "a".repeat(Z + 1), range: u.range, - filterText: m ? `${g}_${y.value}` : void 0, + filterText: b ? `${m}_${f.value}` : void 0, command: { id: "jumpToNextSnippetPlaceholder", title: p("next", "Go to next placeholder...") } }); } - return { suggestions: f }; + return { suggestions: g }; } }, o = this._editor.getModel(); - let r, l = !1; - const a = () => { - r == null || r.dispose(), l = !1; - }, c = () => { - l || (r = this._languageFeaturesService.completionProvider.register({ + let l, r = !1; + const c = () => { + l == null || l.dispose(), r = !1; + }, d = () => { + r || (l = this._languageFeaturesService.completionProvider.register({ language: o.getLanguageId(), pattern: o.uri.fsPath, scheme: o.uri.scheme, exclusive: !0 - }, n), this._snippetListener.add(r), l = !0); + }, n), this._snippetListener.add(l), r = !0); }; - this._choiceCompletions = { provider: n, enable: c, disable: a }; + this._choiceCompletions = { provider: n, enable: d, disable: c }; } this._updateState(), this._snippetListener.add(this._editor.onDidChangeModelContent((n) => n.isFlush && this.cancel())), this._snippetListener.add(this._editor.onDidChangeModel(() => this.cancel())), this._snippetListener.add(this._editor.onDidChangeCursorSelection(() => this._updateState())); } @@ -80168,7 +80168,7 @@ let Cs = (Sa = class { return; } this._currentChoice !== e.choice && (this._currentChoice = e.choice, this._choiceCompletions.enable(), queueMicrotask(() => { - n1e(this._editor, this._choiceCompletions.provider); + QWe(this._editor, this._choiceCompletions.provider); })); } finish() { @@ -80190,49 +80190,49 @@ let Cs = (Sa = class { isInSnippet() { return !!this._inSnippet.get(); } -}, Ip = Sa, Sa.ID = "snippetController2", Sa.InSnippetMode = new ae("inSnippetMode", !1, p("inSnippetMode", "Whether the editor in current in snippet mode")), Sa.HasNextTabstop = new ae("hasNextTabstop", !1, p("hasNextTabstop", "Whether there is a next tab stop when in snippet mode")), Sa.HasPrevTabstop = new ae("hasPrevTabstop", !1, p("hasPrevTabstop", "Whether there is a previous tab stop when in snippet mode")), Sa); -Cs = Ip = a1e([ - FS(1, Xn), - FS(2, ge), - FS(3, _e), - FS(4, li) -], Cs); -gt( - Cs.ID, - Cs, +}, Yp = Ic, Ic.ID = "snippetController2", Ic.InSnippetMode = new ce("inSnippetMode", !1, p("inSnippetMode", "Whether the editor in current in snippet mode")), Ic.HasNextTabstop = new ce("hasNextTabstop", !1, p("hasNextTabstop", "Whether there is a next tab stop when in snippet mode")), Ic.HasPrevTabstop = new ce("hasPrevTabstop", !1, p("hasPrevTabstop", "Whether there is a previous tab stop when in snippet mode")), Ic); +Xs = Yp = eGe([ + $1(1, Fn), + $1(2, me), + $1(3, xe), + $1(4, ci) +], Xs); +mt( + Xs.ID, + Xs, 4 /* EditorContributionInstantiation.Lazy */ ); -const QI = zi.bindToContribution(Cs.get); -oe(new QI({ +const hC = Ai.bindToContribution(Xs.get); +oe(new hC({ id: "jumpToNextSnippetPlaceholder", - precondition: H.and(Cs.InSnippetMode, Cs.HasNextTabstop), + precondition: P.and(Xs.InSnippetMode, Xs.HasNextTabstop), handler: (s) => s.next(), kbOpts: { weight: 130, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 2 /* KeyCode.Tab */ } })); -oe(new QI({ +oe(new hC({ id: "jumpToPrevSnippetPlaceholder", - precondition: H.and(Cs.InSnippetMode, Cs.HasPrevTabstop), + precondition: P.and(Xs.InSnippetMode, Xs.HasPrevTabstop), handler: (s) => s.prev(), kbOpts: { weight: 130, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 1026 /* KeyCode.Tab */ } })); -oe(new QI({ +oe(new hC({ id: "leaveSnippet", - precondition: Cs.InSnippetMode, + precondition: Xs.InSnippetMode, handler: (s) => s.cancel(!0), kbOpts: { weight: 130, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 9, secondary: [ 1033 @@ -80240,9 +80240,9 @@ oe(new QI({ ] } })); -oe(new QI({ +oe(new hC({ id: "acceptSnippet", - precondition: Cs.InSnippetMode, + precondition: Xs.InSnippetMode, handler: (s) => s.finish() // kbOpts: { // weight: KeybindingWeight.EditorContrib + 30, @@ -80250,128 +80250,128 @@ oe(new QI({ // primary: KeyCode.Enter, // } })); -var c1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var tGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, XW = function(s, e) { +}, tN = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let JD = class extends R { +let b9 = class extends J { get isAcceptingPartially() { return this._isAcceptingPartially; } - constructor(e, t, i, n, o, r, l, a, c, d, h, u) { - super(), this.textModel = e, this.selectedSuggestItem = t, this._textModelVersionId = i, this._positions = n, this._debounceValue = o, this._suggestPreviewEnabled = r, this._suggestPreviewMode = l, this._inlineSuggestMode = a, this._enabled = c, this._instantiationService = d, this._commandService = h, this._languageConfigurationService = u, this._source = this._register(this._instantiationService.createInstance(HD, this.textModel, this._textModelVersionId, this._debounceValue)), this._isActive = Oe(this, !1), this._forceUpdateExplicitlySignal = d0(this), this._selectedInlineCompletionId = Oe(this, void 0), this._primaryPosition = ye(this, (m) => this._positions.read(m)[0] ?? new V(1, 1)), this._isAcceptingPartially = !1, this._preserveCurrentCompletionReasons = /* @__PURE__ */ new Set([ - rc.Redo, - rc.Undo, - rc.AcceptWord - ]), this._fetchInlineCompletionsPromise = MK({ + constructor(e, t, i, n, o, l, r, c, d, a, h, u) { + super(), this.textModel = e, this.selectedSuggestItem = t, this._textModelVersionId = i, this._positions = n, this._debounceValue = o, this._suggestPreviewEnabled = l, this._suggestPreviewMode = r, this._inlineSuggestMode = c, this._enabled = d, this._instantiationService = a, this._commandService = h, this._languageConfigurationService = u, this._source = this._register(this._instantiationService.createInstance(m9, this.textModel, this._textModelVersionId, this._debounceValue)), this._isActive = Ue(this, !1), this._forceUpdateExplicitlySignal = g0(this), this._selectedInlineCompletionId = Ue(this, void 0), this._primaryPosition = fe(this, (b) => this._positions.read(b)[0] ?? new Y(1, 1)), this._isAcceptingPartially = !1, this._preserveCurrentCompletionReasons = /* @__PURE__ */ new Set([ + ad.Redo, + ad.Undo, + ad.AcceptWord + ]), this._fetchInlineCompletionsPromise = rO({ owner: this, createEmptyChangeSummary: () => ({ preserveCurrentCompletion: !1, - inlineCompletionTriggerKind: _l.Automatic + inlineCompletionTriggerKind: wr.Automatic }), - handleChange: (m, f) => (m.didChange(this._textModelVersionId) && this._preserveCurrentCompletionReasons.has(this._getReason(m.change)) ? f.preserveCurrentCompletion = !0 : m.didChange(this._forceUpdateExplicitlySignal) && (f.inlineCompletionTriggerKind = _l.Explicit), !0) - }, (m, f) => { - if (this._forceUpdateExplicitlySignal.read(m), !(this._enabled.read(m) && this.selectedSuggestItem.read(m) || this._isActive.read(m))) { + handleChange: (b, g) => (b.didChange(this._textModelVersionId) && this._preserveCurrentCompletionReasons.has(this._getReason(b.change)) ? g.preserveCurrentCompletion = !0 : b.didChange(this._forceUpdateExplicitlySignal) && (g.inlineCompletionTriggerKind = wr.Explicit), !0) + }, (b, g) => { + if (this._forceUpdateExplicitlySignal.read(b), !(this._enabled.read(b) && this.selectedSuggestItem.read(b) || this._isActive.read(b))) { this._source.cancelUpdate(); return; } - this._textModelVersionId.read(m); - const y = this._source.suggestWidgetInlineCompletions.get(), w = this.selectedSuggestItem.read(m); - if (y && !w) { - const Z = this._source.inlineCompletions.get(); - oi((_) => { - (!Z || y.request.versionId > Z.request.versionId) && this._source.inlineCompletions.set(y.clone(), _), this._source.clearSuggestWidgetInlineCompletions(_); + this._textModelVersionId.read(b); + const f = this._source.suggestWidgetInlineCompletions.get(), y = this.selectedSuggestItem.read(b); + if (f && !y) { + const S = this._source.inlineCompletions.get(); + li((x) => { + (!S || f.request.versionId > S.request.versionId) && this._source.inlineCompletions.set(f.clone(), x), this._source.clearSuggestWidgetInlineCompletions(x); }); } - const C = this._primaryPosition.read(m), S = { - triggerKind: f.inlineCompletionTriggerKind, - selectedSuggestionInfo: w == null ? void 0 : w.toSelectedSuggestionInfo() - }, L = this.selectedInlineCompletion.get(), x = f.preserveCurrentCompletion || L != null && L.forwardStable ? L : void 0; - return this._source.fetch(C, S, x); - }), this._filteredInlineCompletionItems = Vo({ owner: this, equalsFn: UA() }, (m) => { - const f = this._source.inlineCompletions.read(m); - if (!f) + const W = this._primaryPosition.read(b), G = { + triggerKind: g.inlineCompletionTriggerKind, + selectedSuggestionInfo: y == null ? void 0 : y.toSelectedSuggestionInfo() + }, X = this.selectedInlineCompletion.get(), L = g.preserveCurrentCompletion || X != null && X.forwardStable ? X : void 0; + return this._source.fetch(W, G, L); + }), this._filteredInlineCompletionItems = vo({ owner: this, equalsFn: dL() }, (b) => { + const g = this._source.inlineCompletions.read(b); + if (!g) return []; - const b = this._primaryPosition.read(m); - return f.inlineCompletions.filter((w) => w.isVisible(this.textModel, b, m)); - }), this.selectedInlineCompletionIndex = ye(this, (m) => { - const f = this._selectedInlineCompletionId.read(m), b = this._filteredInlineCompletionItems.read(m), y = this._selectedInlineCompletionId === void 0 ? -1 : b.findIndex((w) => w.semanticId === f); - return y === -1 ? (this._selectedInlineCompletionId.set(void 0, void 0), 0) : y; - }), this.selectedInlineCompletion = ye(this, (m) => { - const f = this._filteredInlineCompletionItems.read(m), b = this.selectedInlineCompletionIndex.read(m); - return f[b]; - }), this.activeCommands = Vo({ owner: this, equalsFn: UA() }, (m) => { - var f; - return ((f = this.selectedInlineCompletion.read(m)) == null ? void 0 : f.inlineCompletion.source.inlineCompletions.commands) ?? []; - }), this.lastTriggerKind = this._source.inlineCompletions.map(this, (m) => m == null ? void 0 : m.request.context.triggerKind), this.inlineCompletionsCount = ye(this, (m) => { - if (this.lastTriggerKind.read(m) === _l.Explicit) - return this._filteredInlineCompletionItems.read(m).length; - }), this.state = Vo({ + const Z = this._primaryPosition.read(b); + return g.inlineCompletions.filter((y) => y.isVisible(this.textModel, Z, b)); + }), this.selectedInlineCompletionIndex = fe(this, (b) => { + const g = this._selectedInlineCompletionId.read(b), Z = this._filteredInlineCompletionItems.read(b), f = this._selectedInlineCompletionId === void 0 ? -1 : Z.findIndex((y) => y.semanticId === g); + return f === -1 ? (this._selectedInlineCompletionId.set(void 0, void 0), 0) : f; + }), this.selectedInlineCompletion = fe(this, (b) => { + const g = this._filteredInlineCompletionItems.read(b), Z = this.selectedInlineCompletionIndex.read(b); + return g[Z]; + }), this.activeCommands = vo({ owner: this, equalsFn: dL() }, (b) => { + var g; + return ((g = this.selectedInlineCompletion.read(b)) == null ? void 0 : g.inlineCompletion.source.inlineCompletions.commands) ?? []; + }), this.lastTriggerKind = this._source.inlineCompletions.map(this, (b) => b == null ? void 0 : b.request.context.triggerKind), this.inlineCompletionsCount = fe(this, (b) => { + if (this.lastTriggerKind.read(b) === wr.Explicit) + return this._filteredInlineCompletionItems.read(b).length; + }), this.state = vo({ owner: this, - equalsFn: (m, f) => !m || !f ? m === f : J3(m.ghostTexts, f.ghostTexts) && m.inlineCompletion === f.inlineCompletion && m.suggestItem === f.suggestItem - }, (m) => { - const f = this.textModel, b = this.selectedSuggestItem.read(m); - if (b) { - const y = mg(b.toSingleTextEdit(), f), w = this._computeAugmentation(y, m); - if (!this._suggestPreviewEnabled.read(m) && !w) + equalsFn: (b, g) => !b || !g ? b === g : fK(b.ghostTexts, g.ghostTexts) && b.inlineCompletion === g.inlineCompletion && b.suggestItem === g.suggestItem + }, (b) => { + const g = this.textModel, Z = this.selectedSuggestItem.read(b); + if (Z) { + const f = ym(Z.toSingleTextEdit(), g), y = this._computeAugmentation(f, b); + if (!this._suggestPreviewEnabled.read(b) && !y) return; - const S = (w == null ? void 0 : w.edit) ?? y, L = w ? w.edit.text.length - y.text.length : 0, x = this._suggestPreviewMode.read(m), Z = this._positions.read(m), _ = [S, ...FW(this.textModel, Z, S)], v = _.map((E, Y) => q3(E, f, x, Z[Y], L)).filter(xa), P = v[0] ?? new F1(S.range.endLineNumber, []); - return { edits: _, primaryGhostText: P, ghostTexts: v, inlineCompletion: w == null ? void 0 : w.completion, suggestItem: b }; + const G = (y == null ? void 0 : y.edit) ?? f, X = y ? y.edit.text.length - f.text.length : 0, L = this._suggestPreviewMode.read(b), S = this._positions.read(b), x = [G, ...iN(this.textModel, S, G)], w = x.map((H, F) => VK(H, g, L, S[F], X)).filter(Cc), A = w[0] ?? new qW(G.range.endLineNumber, []); + return { edits: x, primaryGhostText: A, ghostTexts: w, inlineCompletion: y == null ? void 0 : y.completion, suggestItem: Z }; } else { - if (!this._isActive.read(m)) + if (!this._isActive.read(b)) return; - const y = this.selectedInlineCompletion.read(m); - if (!y) + const f = this.selectedInlineCompletion.read(b); + if (!f) return; - const w = y.toSingleTextEdit(m), C = this._inlineSuggestMode.read(m), S = this._positions.read(m), L = [w, ...FW(this.textModel, S, w)], x = L.map((Z, _) => q3(Z, f, C, S[_], 0)).filter(xa); - return x[0] ? { edits: L, primaryGhostText: x[0], ghostTexts: x, inlineCompletion: y, suggestItem: void 0 } : void 0; - } - }), this.ghostTexts = Vo({ owner: this, equalsFn: J3 }, (m) => { - const f = this.state.read(m); - if (f) - return f.ghostTexts; - }), this.primaryGhostText = Vo({ owner: this, equalsFn: Dj }, (m) => { - const f = this.state.read(m); - if (f) - return f == null ? void 0 : f.primaryGhostText; - }), this._register(h0(this._fetchInlineCompletionsPromise)); - let g; - this._register(Te((m) => { - var y, w; - const f = this.state.read(m), b = f == null ? void 0 : f.inlineCompletion; - if ((b == null ? void 0 : b.semanticId) !== (g == null ? void 0 : g.semanticId) && (g = b, b)) { - const C = b.inlineCompletion, S = C.source; - (w = (y = S.provider).handleItemDidShow) == null || w.call(y, S.inlineCompletions, C.sourceInlineCompletion, C.insertText); + const y = f.toSingleTextEdit(b), W = this._inlineSuggestMode.read(b), G = this._positions.read(b), X = [y, ...iN(this.textModel, G, y)], L = X.map((S, x) => VK(S, g, W, G[x], 0)).filter(Cc); + return L[0] ? { edits: X, primaryGhostText: L[0], ghostTexts: L, inlineCompletion: f, suggestItem: void 0 } : void 0; + } + }), this.ghostTexts = vo({ owner: this, equalsFn: fK }, (b) => { + const g = this.state.read(b); + if (g) + return g.ghostTexts; + }), this.primaryGhostText = vo({ owner: this, equalsFn: p7 }, (b) => { + const g = this.state.read(b); + if (g) + return g == null ? void 0 : g.primaryGhostText; + }), this._register(Z0(this._fetchInlineCompletionsPromise)); + let m; + this._register(Te((b) => { + var f, y; + const g = this.state.read(b), Z = g == null ? void 0 : g.inlineCompletion; + if ((Z == null ? void 0 : Z.semanticId) !== (m == null ? void 0 : m.semanticId) && (m = Z, Z)) { + const W = Z.inlineCompletion, G = W.source; + (y = (f = G.provider).handleItemDidShow) == null || y.call(f, G.inlineCompletions, W.sourceInlineCompletion, W.insertText); } })); } _getReason(e) { - return e != null && e.isUndoing ? rc.Undo : e != null && e.isRedoing ? rc.Redo : this.isAcceptingPartially ? rc.AcceptWord : rc.Other; + return e != null && e.isUndoing ? ad.Undo : e != null && e.isRedoing ? ad.Redo : this.isAcceptingPartially ? ad.AcceptWord : ad.Other; } async trigger(e) { this._isActive.set(!0, e), await this._fetchInlineCompletionsPromise.get(); } async triggerExplicitly(e) { - fm(e, (t) => { + Gb(e, (t) => { this._isActive.set(!0, t), this._forceUpdateExplicitlySignal.trigger(t); }), await this._fetchInlineCompletionsPromise.get(); } stop(e) { - fm(e, (t) => { + Gb(e, (t) => { this._isActive.set(!1, t), this._source.clear(t); }); } _computeAugmentation(e, t) { - const i = this.textModel, n = this._source.suggestWidgetInlineCompletions.read(t), o = n ? n.inlineCompletions : [this.selectedInlineCompletion.read(t)].filter(xa); - return Dre(o, (l) => { - let a = l.toSingleTextEdit(t); - return a = mg(a, i, M.fromPositions(a.range.getStartPosition(), e.range.getEndPosition())), Rj(a, e) ? { completion: l, edit: a } : void 0; + const i = this.textModel, n = this._source.suggestWidgetInlineCompletions.read(t), o = n ? n.inlineCompletions : [this.selectedInlineCompletion.read(t)].filter(Cc); + return Ire(o, (r) => { + let c = r.toSingleTextEdit(t); + return c = ym(c, i, I.fromPositions(c.range.getStartPosition(), e.range.getEndPosition())), y7(c, e) ? { completion: r, edit: c } : void 0; }); } async _deltaSelectedInlineCompletionIndex(e) { @@ -80392,34 +80392,34 @@ let JD = class extends R { async accept(e) { var n; if (e.getModel() !== this.textModel) - throw new mt(); + throw new bt(); const t = this.state.get(); if (!t || t.primaryGhostText.isEmpty() || !t.inlineCompletion) return; const i = t.inlineCompletion.toInlineCompletion(void 0); if (i.command && i.source.addRef(), e.pushUndoStop(), i.snippetInfo) e.executeEdits("inlineSuggestion.accept", [ - si.replace(i.range, ""), + oi.replace(i.range, ""), ...i.additionalTextEdits - ]), e.setPosition(i.snippetInfo.range.getStartPosition(), "inlineCompletionAccept"), (n = Cs.get(e)) == null || n.insert(i.snippetInfo.snippet, { undoStopBefore: !1 }); + ]), e.setPosition(i.snippetInfo.range.getStartPosition(), "inlineCompletionAccept"), (n = Xs.get(e)) == null || n.insert(i.snippetInfo.snippet, { undoStopBefore: !1 }); else { - const o = t.edits, r = uP(o).map((l) => fe.fromPositions(l)); + const o = t.edits, l = JK(o).map((r) => ge.fromPositions(r)); e.executeEdits("inlineSuggestion.accept", [ - ...o.map((l) => si.replace(l.range, l.text)), + ...o.map((r) => oi.replace(r.range, r.text)), ...i.additionalTextEdits - ]), e.setSelections(r, "inlineCompletionAccept"); + ]), e.setSelections(l, "inlineCompletionAccept"); } - this.stop(), i.command && (await this._commandService.executeCommand(i.command.id, ...i.command.arguments || []).then(void 0, wi), i.source.removeRef()); + this.stop(), i.command && (await this._commandService.executeCommand(i.command.id, ...i.command.arguments || []).then(void 0, Wi), i.source.removeRef()); } async acceptNextWord(e) { await this._acceptNext( e, (t, i) => { - const n = this.textModel.getLanguageIdAtPosition(t.lineNumber, t.column), o = this._languageConfigurationService.getLanguageConfiguration(n), r = new RegExp(o.wordDefinition.source, o.wordDefinition.flags.replace("g", "")), l = i.match(r); - let a = 0; - l && l.index !== void 0 ? l.index === 0 ? a = l[0].length : a = l.index : a = i.length; - const d = /\s+/g.exec(i); - return d && d.index !== void 0 && d.index + d[0].length < a && (a = d.index + d[0].length), a; + const n = this.textModel.getLanguageIdAtPosition(t.lineNumber, t.column), o = this._languageConfigurationService.getLanguageConfiguration(n), l = new RegExp(o.wordDefinition.source, o.wordDefinition.flags.replace("g", "")), r = i.match(l); + let c = 0; + r && r.index !== void 0 ? r.index === 0 ? c = r[0].length : c = r.index : c = i.length; + const a = /\s+/g.exec(i); + return a && a.index !== void 0 && a.index + a[0].length < c && (c = a.index + a[0].length), c; }, 0 /* PartialAcceptTriggerKind.Word */ @@ -80438,28 +80438,28 @@ let JD = class extends R { } async _acceptNext(e, t, i) { if (e.getModel() !== this.textModel) - throw new mt(); + throw new bt(); const n = this.state.get(); if (!n || n.primaryGhostText.isEmpty() || !n.inlineCompletion) return; - const o = n.primaryGhostText, r = n.inlineCompletion.toInlineCompletion(void 0); - if (r.snippetInfo || r.filterText !== r.insertText) { + const o = n.primaryGhostText, l = n.inlineCompletion.toInlineCompletion(void 0); + if (l.snippetInfo || l.filterText !== l.insertText) { await this.accept(e); return; } - const l = o.parts[0], a = new V(o.lineNumber, l.column), c = l.text, d = t(a, c); - if (d === c.length && o.parts.length === 1) { + const r = o.parts[0], c = new Y(o.lineNumber, r.column), d = r.text, a = t(c, d); + if (a === d.length && o.parts.length === 1) { this.accept(e); return; } - const h = c.substring(0, d), u = this._positions.get(), g = u[0]; - r.source.addRef(); + const h = d.substring(0, a), u = this._positions.get(), m = u[0]; + l.source.addRef(); try { this._isAcceptingPartially = !0; try { e.pushUndoStop(); - const m = M.fromPositions(g, a), f = e.getModel().getValueInRange(m) + h, b = new ka(m, f), y = [b, ...FW(this.textModel, u, b)], w = uP(y).map((C) => fe.fromPositions(C)); - e.executeEdits("inlineSuggestion.accept", y.map((C) => si.replace(C.range, C.text))), e.setSelections(w, "inlineCompletionPartialAccept"), e.revealPositionInCenterIfOutsideViewport( + const b = I.fromPositions(m, c), g = e.getModel().getValueInRange(b) + h, Z = new Ec(b, g), f = [Z, ...iN(this.textModel, u, Z)], y = JK(f).map((W) => ge.fromPositions(W)); + e.executeEdits("inlineSuggestion.accept", f.map((W) => oi.replace(W.range, W.text))), e.setSelections(y, "inlineCompletionPartialAccept"), e.revealPositionInCenterIfOutsideViewport( e.getPosition(), 1 /* ScrollType.Immediate */ @@ -80467,73 +80467,73 @@ let JD = class extends R { } finally { this._isAcceptingPartially = !1; } - if (r.source.provider.handlePartialAccept) { - const m = M.fromPositions(r.range.getStartPosition(), Ur.ofText(h).addToPosition(a)), f = e.getModel().getValueInRange( - m, + if (l.source.provider.handlePartialAccept) { + const b = I.fromPositions(l.range.getStartPosition(), jl.ofText(h).addToPosition(c)), g = e.getModel().getValueInRange( + b, 1 /* EndOfLinePreference.LF */ ); - r.source.provider.handlePartialAccept(r.source.inlineCompletions, r.sourceInlineCompletion, f.length, { kind: i }); + l.source.provider.handlePartialAccept(l.source.inlineCompletions, l.sourceInlineCompletion, g.length, { kind: i }); } } finally { - r.source.removeRef(); + l.source.removeRef(); } } handleSuggestAccepted(e) { - var o, r; - const t = mg(e.toSingleTextEdit(), this.textModel), i = this._computeAugmentation(t, void 0); + var o, l; + const t = ym(e.toSingleTextEdit(), this.textModel), i = this._computeAugmentation(t, void 0); if (!i) return; const n = i.completion.inlineCompletion; - (r = (o = n.source.provider).handlePartialAccept) == null || r.call(o, n.source.inlineCompletions, n.sourceInlineCompletion, t.text.length, { + (l = (o = n.source.provider).handlePartialAccept) == null || l.call(o, n.source.inlineCompletions, n.sourceInlineCompletion, t.text.length, { kind: 2 }); } }; -JD = c1e([ - XW(9, Se), - XW(10, Qt), - XW(11, li) -], JD); -var rc; +b9 = tGe([ + tN(9, Ge), + tN(10, Ot), + tN(11, ci) +], b9); +var ad; (function(s) { s[s.Undo = 0] = "Undo", s[s.Redo = 1] = "Redo", s[s.AcceptWord = 2] = "AcceptWord", s[s.Other = 3] = "Other"; -})(rc || (rc = {})); -function FW(s, e, t) { +})(ad || (ad = {})); +function iN(s, e, t) { if (e.length === 1) return []; - const i = e[0], n = e.slice(1), o = t.range.getStartPosition(), r = t.range.getEndPosition(), l = s.getValueInRange(M.fromPositions(i, r)), a = U3(i, o); - if (a.lineNumber < 1) - return De(new mt(`positionWithinTextEdit line number should be bigger than 0. + const i = e[0], n = e.slice(1), o = t.range.getStartPosition(), l = t.range.getEndPosition(), r = s.getValueInRange(I.fromPositions(i, l)), c = yK(i, o); + if (c.lineNumber < 1) + return Me(new bt(`positionWithinTextEdit line number should be bigger than 0. Invalid subtraction between ${i.toString()} and ${o.toString()}`)), []; - const c = d1e(t.text, a); - return n.map((d) => { - const h = Vwe(U3(d, o), r), u = s.getValueInRange(M.fromPositions(d, h)), g = Ih(l, u), m = M.fromPositions(d, d.delta(0, g)); - return new ka(m, c); + const d = iGe(t.text, c); + return n.map((a) => { + const h = SWe(yK(a, o), l), u = s.getValueInRange(I.fromPositions(a, h)), m = Th(r, u), b = I.fromPositions(a, a.delta(0, m)); + return new Ec(b, d); }); } -function d1e(s, e) { +function iGe(s, e) { let t = ""; - const i = nq(s); + const i = Qq(s); for (let n = e.lineNumber - 1; n < i.length; n++) t += i[n].substring(n === e.lineNumber - 1 ? e.column - 1 : 0); return t; } -function uP(s) { - const e = wA.createSortPermutation(s, gs((o) => o.range, M.compareRangesUsingStarts)), i = new vX(e.apply(s)).getNewRanges(); +function JK(s) { + const e = YV.createSortPermutation(s, ps((o) => o.range, I.compareRangesUsingStarts)), i = new iH(e.apply(s)).getNewRanges(); return e.inverse().apply(i).map((o) => o.getEndPosition()); } -var h1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var nGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, gP = function(s, e) { +}, HK = function(s, e) { return function(t, i) { e(t, i, s); }; -}, py; -class H5 { +}, If; +class ZE { constructor(e) { this.name = e; } @@ -80542,16 +80542,16 @@ class H5 { return 0; const n = i[0].score[0]; for (let o = 0; o < i.length; o++) { - const { score: r, completion: l } = i[o]; - if (r[0] !== n) + const { score: l, completion: r } = i[o]; + if (l[0] !== n) break; - if (l.preselect) + if (r.preselect) return o; } return 0; } } -class mP extends H5 { +class EK extends ZE { constructor() { super("first"); } @@ -80562,9 +80562,9 @@ class mP extends H5 { fromJSON() { } } -class u1e extends H5 { +class sGe extends ZE { constructor() { - super("recentlyUsed"), this._cache = new id(300, 0.66), this._seq = 0; + super("recentlyUsed"), this._cache = new la(300, 0.66), this._seq = 0; } memorize(e, t, i) { const n = `${e.getLanguageId()}/${i.textLabel}`; @@ -80581,13 +80581,13 @@ class u1e extends H5 { if (/\s$/.test(n)) return super.select(e, t, i); const o = i[0].score[0]; - let r = -1, l = -1, a = -1; - for (let c = 0; c < i.length && i[c].score[0] === o; c++) { - const d = `${e.getLanguageId()}/${i[c].textLabel}`, h = this._cache.peek(d); - if (h && h.touch > a && h.type === i[c].completion.kind && h.insertText === i[c].completion.insertText && (a = h.touch, l = c), i[c].completion.preselect && r === -1) - return r = c; + let l = -1, r = -1, c = -1; + for (let d = 0; d < i.length && i[d].score[0] === o; d++) { + const a = `${e.getLanguageId()}/${i[d].textLabel}`, h = this._cache.peek(a); + if (h && h.touch > c && h.type === i[d].completion.kind && h.insertText === i[d].completion.insertText && (c = h.touch, r = d), i[d].completion.preselect && l === -1) + return l = d; } - return l !== -1 ? l : r !== -1 ? r : 0; + return r !== -1 ? r : l !== -1 ? l : 0; } toJSON() { return this._cache.toJSON(); @@ -80596,13 +80596,13 @@ class u1e extends H5 { this._cache.clear(); const t = 0; for (const [i, n] of e) - n.touch = t, n.type = typeof n.type == "number" ? n.type : qw.fromString(n.type), this._cache.set(i, n); + n.touch = t, n.type = typeof n.type == "number" ? n.type : aW.fromString(n.type), this._cache.set(i, n); this._seq = this._cache.size; } } -class g1e extends H5 { +class oGe extends ZE { constructor() { - super("recentlyUsedByPrefix"), this._trie = Rf.forStrings(), this._seq = 0; + super("recentlyUsedByPrefix"), this._trie = Ag.forStrings(), this._seq = 0; } memorize(e, t, i) { const { word: n } = e.getWordUntilPosition(t), o = `${e.getLanguageId()}/${n}`; @@ -80617,12 +80617,12 @@ class g1e extends H5 { if (!n) return super.select(e, t, i); const o = `${e.getLanguageId()}/${n}`; - let r = this._trie.get(o); - if (r || (r = this._trie.findSubstr(o)), r) - for (let l = 0; l < i.length; l++) { - const { kind: a, insertText: c } = i[l].completion; - if (a === r.type && c === r.insertText) - return l; + let l = this._trie.get(o); + if (l || (l = this._trie.findSubstr(o)), l) + for (let r = 0; r < i.length; r++) { + const { kind: c, insertText: d } = i[r].completion; + if (c === l.type && d === l.insertText) + return r; } return super.select(e, t, i); } @@ -80634,15 +80634,15 @@ class g1e extends H5 { if (this._trie.clear(), e.length > 0) { this._seq = e[0][1].touch + 1; for (const [t, i] of e) - i.type = typeof i.type == "number" ? i.type : qw.fromString(i.type), this._trie.set(t, i); + i.type = typeof i.type == "number" ? i.type : aW.fromString(i.type), this._trie.set(t, i); } } } -var fh; -let UD = (fh = class { +var Wh; +let p9 = (Wh = class { constructor(e, t) { - this._storageService = e, this._configService = t, this._disposables = new U(), this._persistSoon = new Zt(() => this._saveState(), 500), this._disposables.add(e.onWillSaveState((i) => { - i.reason === cx.SHUTDOWN && this._saveState(); + this._storageService = e, this._configService = t, this._disposables = new _(), this._persistSoon = new St(() => this._saveState(), 500), this._disposables.add(e.onWillSaveState((i) => { + i.reason === LL.SHUTDOWN && this._saveState(); })); } dispose() { @@ -80662,11 +80662,11 @@ let UD = (fh = class { }); if (((n = this._strategy) == null ? void 0 : n.name) !== i) { this._saveState(); - const o = py._strategyCtors.get(i) || mP; + const o = If._strategyCtors.get(i) || EK; this._strategy = new o(); try { - const l = this._configService.getValue("editor.suggest.shareSuggestSelections") ? 0 : 1, a = this._storageService.get(`${py._storagePrefix}/${i}`, l); - a && this._strategy.fromJSON(JSON.parse(a)); + const r = this._configService.getValue("editor.suggest.shareSuggestSelections") ? 0 : 1, c = this._storageService.get(`${If._storagePrefix}/${i}`, r); + c && this._strategy.fromJSON(JSON.parse(c)); } catch { } } @@ -80676,7 +80676,7 @@ let UD = (fh = class { if (this._strategy) { const t = this._configService.getValue("editor.suggest.shareSuggestSelections") ? 0 : 1, i = JSON.stringify(this._strategy); this._storageService.store( - `${py._storagePrefix}/${this._strategy.name}`, + `${If._storagePrefix}/${this._strategy.name}`, i, t, 1 @@ -80684,35 +80684,35 @@ let UD = (fh = class { ); } } -}, py = fh, fh._strategyCtors = /* @__PURE__ */ new Map([ - ["recentlyUsedByPrefix", g1e], - ["recentlyUsed", u1e], - ["first", mP] -]), fh._storagePrefix = "suggest/memories", fh); -UD = py = h1e([ - gP(0, za), - gP(1, Ke) -], UD); -const jI = $e("ISuggestMemories"); +}, If = Wh, Wh._strategyCtors = /* @__PURE__ */ new Map([ + ["recentlyUsedByPrefix", oGe], + ["recentlyUsed", sGe], + ["first", EK] +]), Wh._storagePrefix = "suggest/memories", Wh); +p9 = If = nGe([ + HK(0, Pc), + HK(1, Qe) +], p9); +const uC = $e("ISuggestMemories"); it( - jI, - UD, + uC, + p9, 1 /* InstantiationType.Delayed */ ); -var m1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var lGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, p1e = function(s, e) { +}, rGe = function(s, e) { return function(t, i) { e(t, i, s); }; -}, KD, Xg; -let tM = (Xg = class { +}, g9, Km; +let gI = (Km = class { constructor(e, t) { - this._editor = e, this._enabled = !1, this._ckAtEnd = KD.AtEnd.bindTo(t), this._configListener = this._editor.onDidChangeConfiguration((i) => i.hasChanged( + this._editor = e, this._enabled = !1, this._ckAtEnd = g9.AtEnd.bindTo(t), this._configListener = this._editor.onDidChangeConfiguration((i) => i.hasChanged( 124 /* EditorOption.tabCompletion */ ) && this._update()), this._update(); @@ -80743,23 +80743,23 @@ let tM = (Xg = class { this._selectionListener = this._editor.onDidChangeCursorSelection(t), t(); } else this._selectionListener && (this._ckAtEnd.reset(), this._selectionListener.dispose(), this._selectionListener = void 0); } -}, KD = Xg, Xg.AtEnd = new ae("atEndOfWord", !1), Xg); -tM = KD = m1e([ - p1e(1, _e) -], tM); -var f1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +}, g9 = Km, Km.AtEnd = new ce("atEndOfWord", !1), Km); +gI = g9 = lGe([ + rGe(1, xe) +], gI); +var cGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, b1e = function(s, e) { +}, dGe = function(s, e) { return function(t, i) { e(t, i, s); }; -}, fy, Fg; -let Gb = (Fg = class { +}, Sf, Um; +let zZ = (Um = class { constructor(e, t) { - this._editor = e, this._index = 0, this._ckOtherSuggestions = fy.OtherSuggestions.bindTo(t); + this._editor = e, this._index = 0, this._ckOtherSuggestions = Sf.OtherSuggestions.bindTo(t); } dispose() { this.reset(); @@ -80773,7 +80773,7 @@ let Gb = (Fg = class { this.reset(); return; } - if (fy._moveIndex(!0, e, t) === t) { + if (Sf._moveIndex(!0, e, t) === t) { this.reset(); return; } @@ -80796,25 +80796,25 @@ let Gb = (Fg = class { _move(e) { if (this._model) try { - this._ignore = !0, this._index = fy._moveIndex(e, this._model, this._index), this._acceptNext({ index: this._index, item: this._model.items[this._index], model: this._model }); + this._ignore = !0, this._index = Sf._moveIndex(e, this._model, this._index), this._acceptNext({ index: this._index, item: this._model.items[this._index], model: this._model }); } finally { this._ignore = !1; } } -}, fy = Fg, Fg.OtherSuggestions = new ae("hasOtherSuggestions", !1), Fg); -Gb = fy = f1e([ - b1e(1, _e) -], Gb); -class y1e { +}, Sf = Um, Um.OtherSuggestions = new ce("hasOtherSuggestions", !1), Um); +zZ = Sf = cGe([ + dGe(1, xe) +], zZ); +class aGe { constructor(e, t, i, n) { - this._disposables = new U(), this._disposables.add(i.onDidSuggest((o) => { + this._disposables = new _(), this._disposables.add(i.onDidSuggest((o) => { o.completionModel.items.length === 0 && this.reset(); })), this._disposables.add(i.onDidCancel((o) => { this.reset(); })), this._disposables.add(t.onDidShow(() => this._onItem(t.getFocusedItem()))), this._disposables.add(t.onDidFocus(this._onItem, this)), this._disposables.add(t.onDidHide(this.reset, this)), this._disposables.add(e.onWillType((o) => { if (this._active && !t.isFrozen() && i.state !== 0) { - const r = o.charCodeAt(o.length - 1); - this._active.acceptCharacters.has(r) && e.getOption( + const l = o.charCodeAt(o.length - 1); + this._active.acceptCharacters.has(l) && e.getOption( 0 /* EditorOption.acceptSuggestionOnCommitCharacter */ ) && n(this._active.item); @@ -80822,13 +80822,13 @@ class y1e { })); } _onItem(e) { - if (!e || !$n(e.item.completion.commitCharacters)) { + if (!e || !ts(e.item.completion.commitCharacters)) { this.reset(); return; } if (this._active && this._active.item.item === e.item) return; - const t = new fA(); + const t = new wV(); for (const i of e.item.completion.commitCharacters) i.length > 0 && t.add(i.charCodeAt(0)); this._active = { acceptCharacters: t, item: e }; @@ -80840,21 +80840,21 @@ class y1e { this._disposables.dispose(); } } -const ir = class ir { +const sl = class sl { async provideSelectionRanges(e, t) { const i = []; for (const n of t) { const o = []; i.push(o); - const r = /* @__PURE__ */ new Map(); - await new Promise((l) => ir._bracketsRightYield(l, 0, e, n, r)), await new Promise((l) => ir._bracketsLeftYield(l, 0, e, n, r, o)); + const l = /* @__PURE__ */ new Map(); + await new Promise((r) => sl._bracketsRightYield(r, 0, e, n, l)), await new Promise((r) => sl._bracketsLeftYield(r, 0, e, n, l, o)); } return i; } static _bracketsRightYield(e, t, i, n, o) { - const r = /* @__PURE__ */ new Map(), l = Date.now(); + const l = /* @__PURE__ */ new Map(), r = Date.now(); for (; ; ) { - if (t >= ir._maxRounds) { + if (t >= sl._maxRounds) { e(); break; } @@ -80862,33 +80862,33 @@ const ir = class ir { e(); break; } - const a = i.bracketPairs.findNextBracket(n); - if (!a) { + const c = i.bracketPairs.findNextBracket(n); + if (!c) { e(); break; } - if (Date.now() - l > ir._maxDuration) { - setTimeout(() => ir._bracketsRightYield(e, t + 1, i, n, o)); + if (Date.now() - r > sl._maxDuration) { + setTimeout(() => sl._bracketsRightYield(e, t + 1, i, n, o)); break; } - if (a.bracketInfo.isOpeningBracket) { - const d = a.bracketInfo.bracketText, h = r.has(d) ? r.get(d) : 0; - r.set(d, h + 1); + if (c.bracketInfo.isOpeningBracket) { + const a = c.bracketInfo.bracketText, h = l.has(a) ? l.get(a) : 0; + l.set(a, h + 1); } else { - const d = a.bracketInfo.getOpeningBrackets()[0].bracketText; - let h = r.has(d) ? r.get(d) : 0; - if (h -= 1, r.set(d, Math.max(0, h)), h < 0) { - let u = o.get(d); - u || (u = new cs(), o.set(d, u)), u.push(a.range); + const a = c.bracketInfo.getOpeningBrackets()[0].bracketText; + let h = l.has(a) ? l.get(a) : 0; + if (h -= 1, l.set(a, Math.max(0, h)), h < 0) { + let u = o.get(a); + u || (u = new hs(), o.set(a, u)), u.push(c.range); } } - n = a.range.getEndPosition(); + n = c.range.getEndPosition(); } } - static _bracketsLeftYield(e, t, i, n, o, r) { - const l = /* @__PURE__ */ new Map(), a = Date.now(); + static _bracketsLeftYield(e, t, i, n, o, l) { + const r = /* @__PURE__ */ new Map(), c = Date.now(); for (; ; ) { - if (t >= ir._maxRounds && o.size === 0) { + if (t >= sl._maxRounds && o.size === 0) { e(); break; } @@ -80896,99 +80896,99 @@ const ir = class ir { e(); break; } - const c = i.bracketPairs.findPrevBracket(n); - if (!c) { + const d = i.bracketPairs.findPrevBracket(n); + if (!d) { e(); break; } - if (Date.now() - a > ir._maxDuration) { - setTimeout(() => ir._bracketsLeftYield(e, t + 1, i, n, o, r)); + if (Date.now() - c > sl._maxDuration) { + setTimeout(() => sl._bracketsLeftYield(e, t + 1, i, n, o, l)); break; } - if (c.bracketInfo.isOpeningBracket) { - const h = c.bracketInfo.bracketText; - let u = l.has(h) ? l.get(h) : 0; - if (u -= 1, l.set(h, Math.max(0, u)), u < 0) { - const g = o.get(h); - if (g) { - const m = g.shift(); - g.size === 0 && o.delete(h); - const f = M.fromPositions(c.range.getEndPosition(), m.getStartPosition()), b = M.fromPositions(c.range.getStartPosition(), m.getEndPosition()); - r.push({ range: f }), r.push({ range: b }), ir._addBracketLeading(i, b, r); + if (d.bracketInfo.isOpeningBracket) { + const h = d.bracketInfo.bracketText; + let u = r.has(h) ? r.get(h) : 0; + if (u -= 1, r.set(h, Math.max(0, u)), u < 0) { + const m = o.get(h); + if (m) { + const b = m.shift(); + m.size === 0 && o.delete(h); + const g = I.fromPositions(d.range.getEndPosition(), b.getStartPosition()), Z = I.fromPositions(d.range.getStartPosition(), b.getEndPosition()); + l.push({ range: g }), l.push({ range: Z }), sl._addBracketLeading(i, Z, l); } } } else { - const h = c.bracketInfo.getOpeningBrackets()[0].bracketText, u = l.has(h) ? l.get(h) : 0; - l.set(h, u + 1); + const h = d.bracketInfo.getOpeningBrackets()[0].bracketText, u = r.has(h) ? r.get(h) : 0; + r.set(h, u + 1); } - n = c.range.getStartPosition(); + n = d.range.getStartPosition(); } } static _addBracketLeading(e, t, i) { if (t.startLineNumber === t.endLineNumber) return; const n = t.startLineNumber, o = e.getLineFirstNonWhitespaceColumn(n); - o !== 0 && o !== t.startColumn && (i.push({ range: M.fromPositions(new V(n, o), t.getEndPosition()) }), i.push({ range: M.fromPositions(new V(n, 1), t.getEndPosition()) })); - const r = n - 1; - if (r > 0) { - const l = e.getLineFirstNonWhitespaceColumn(r); - l === t.startColumn && l !== e.getLineLastNonWhitespaceColumn(r) && (i.push({ range: M.fromPositions(new V(r, l), t.getEndPosition()) }), i.push({ range: M.fromPositions(new V(r, 1), t.getEndPosition()) })); + o !== 0 && o !== t.startColumn && (i.push({ range: I.fromPositions(new Y(n, o), t.getEndPosition()) }), i.push({ range: I.fromPositions(new Y(n, 1), t.getEndPosition()) })); + const l = n - 1; + if (l > 0) { + const r = e.getLineFirstNonWhitespaceColumn(l); + r === t.startColumn && r !== e.getLineLastNonWhitespaceColumn(l) && (i.push({ range: I.fromPositions(new Y(l, r), t.getEndPosition()) }), i.push({ range: I.fromPositions(new Y(l, 1), t.getEndPosition()) })); } } }; -ir._maxDuration = 30, ir._maxRounds = 2; -let iM = ir; -const aa = class aa { +sl._maxDuration = 30, sl._maxRounds = 2; +let ZI = sl; +const uc = class uc { static async create(e, t) { if (!t.getOption( 119 /* EditorOption.suggest */ ).localityBonus || !t.hasModel()) - return aa.None; + return uc.None; const i = t.getModel(), n = t.getPosition(); if (!e.canComputeWordRanges(i.uri)) - return aa.None; - const [o] = await new iM().provideSelectionRanges(i, [n]); + return uc.None; + const [o] = await new ZI().provideSelectionRanges(i, [n]); if (o.length === 0) - return aa.None; - const r = await e.computeWordRanges(i.uri, o[0].range); - if (!r) - return aa.None; - const l = i.getWordUntilPosition(n); - return delete r[l.word], new class extends aa { - distance(a, c) { + return uc.None; + const l = await e.computeWordRanges(i.uri, o[0].range); + if (!l) + return uc.None; + const r = i.getWordUntilPosition(n); + return delete l[r.word], new class extends uc { + distance(c, d) { if (!n.equals(t.getPosition())) return 0; - if (c.kind === 17) + if (d.kind === 17) return 2 << 20; - const d = typeof c.label == "string" ? c.label : c.label.label, h = r[d]; - if (AJ(h)) + const a = typeof d.label == "string" ? d.label : d.label.label, h = l[a]; + if (o_(h)) return 2 << 20; - const u = Rw(h, M.fromPositions(a), M.compareRangesUsingStarts), g = u >= 0 ? h[u] : h[Math.max(0, ~u - 1)]; - let m = o.length; - for (const f of o) { - if (!M.containsRange(f.range, g)) + const u = Qy(h, I.fromPositions(c), I.compareRangesUsingStarts), m = u >= 0 ? h[u] : h[Math.max(0, ~u - 1)]; + let b = o.length; + for (const g of o) { + if (!I.containsRange(g.range, m)) break; - m -= 1; + b -= 1; } - return m; + return b; } }(); } }; -aa.None = new class extends aa { +uc.None = new class extends uc { distance() { return 0; } }(); -let nM = aa, pP = class { +let fI = uc, DK = class { constructor(e, t) { this.leadingLineContent = e, this.characterCountDelta = t; } }; -class Vd { - constructor(e, t, i, n, o, r, l = b1.default, a = void 0) { - this.clipboardText = a, this._snippetCompareFn = Vd._compareCompletionItems, this._items = e, this._column = t, this._wordDistance = n, this._options = o, this._refilterKind = 1, this._lineContext = i, this._fuzzyScoreOptions = l, r === "top" ? this._snippetCompareFn = Vd._compareCompletionItemsSnippetsUp : r === "bottom" && (this._snippetCompareFn = Vd._compareCompletionItemsSnippetsDown); +class Ha { + constructor(e, t, i, n, o, l, r = RW.default, c = void 0) { + this.clipboardText = c, this._snippetCompareFn = Ha._compareCompletionItems, this._items = e, this._column = t, this._wordDistance = n, this._options = o, this._refilterKind = 1, this._lineContext = i, this._fuzzyScoreOptions = r, l === "top" ? this._snippetCompareFn = Ha._compareCompletionItemsSnippetsUp : l === "bottom" && (this._snippetCompareFn = Ha._compareCompletionItemsSnippetsDown); } get lineContext() { return this._lineContext; @@ -81019,43 +81019,43 @@ class Vd { this._itemsByProvider = /* @__PURE__ */ new Map(); const e = [], { leadingLineContent: t, characterCountDelta: i } = this._lineContext; let n = "", o = ""; - const r = this._refilterKind === 1 ? this._items : this._filteredItems, l = [], a = !this._options.filterGraceful || r.length > 2e3 ? wb : jde; - for (let c = 0; c < r.length; c++) { - const d = r[c]; - if (d.isInvalid) + const l = this._refilterKind === 1 ? this._items : this._filteredItems, r = [], c = !this._options.filterGraceful || l.length > 2e3 ? IZ : Ahe; + for (let d = 0; d < l.length; d++) { + const a = l[d]; + if (a.isInvalid) continue; - const h = this._itemsByProvider.get(d.provider); - h ? h.push(d) : this._itemsByProvider.set(d.provider, [d]); - const u = d.position.column - d.editStart.column, g = u + i - (d.position.column - this._column); - if (n.length !== g && (n = g === 0 ? "" : t.slice(-g), o = n.toLowerCase()), d.word = n, g === 0) - d.score = Il.Default; + const h = this._itemsByProvider.get(a.provider); + h ? h.push(a) : this._itemsByProvider.set(a.provider, [a]); + const u = a.position.column - a.editStart.column, m = u + i - (a.position.column - this._column); + if (n.length !== m && (n = m === 0 ? "" : t.slice(-m), o = n.toLowerCase()), a.word = n, m === 0) + a.score = Tr.Default; else { - let m = 0; - for (; m < u; ) { - const f = n.charCodeAt(m); - if (f === 32 || f === 9) - m += 1; + let b = 0; + for (; b < u; ) { + const g = n.charCodeAt(b); + if (g === 32 || g === 9) + b += 1; else break; } - if (m >= g) - d.score = Il.Default; - else if (typeof d.completion.filterText == "string") { - const f = a(n, o, m, d.completion.filterText, d.filterTextLow, 0, this._fuzzyScoreOptions); - if (!f) + if (b >= m) + a.score = Tr.Default; + else if (typeof a.completion.filterText == "string") { + const g = c(n, o, b, a.completion.filterText, a.filterTextLow, 0, this._fuzzyScoreOptions); + if (!g) continue; - x2(d.completion.filterText, d.textLabel) === 0 ? d.score = f : (d.score = Jde(n, o, m, d.textLabel, d.labelLow, 0), d.score[0] = f[0]); + UN(a.completion.filterText, a.textLabel) === 0 ? a.score = g : (a.score = Ehe(n, o, b, a.textLabel, a.labelLow, 0), a.score[0] = g[0]); } else { - const f = a(n, o, m, d.textLabel, d.labelLow, 0, this._fuzzyScoreOptions); - if (!f) + const g = c(n, o, b, a.textLabel, a.labelLow, 0, this._fuzzyScoreOptions); + if (!g) continue; - d.score = f; + a.score = g; } } - d.idx = c, d.distance = this._wordDistance.distance(d.position, d.completion), l.push(d), e.push(d.textLabel.length); + a.idx = d, a.distance = this._wordDistance.distance(a.position, a.completion), r.push(a), e.push(a.textLabel.length); } - this._filteredItems = l.sort(this._snippetCompareFn), this._refilterKind = 0, this._stats = { - pLabelLen: e.length ? F2(e.length - 0.85, e, (c, d) => c - d) : 0 + this._filteredItems = r.sort(this._snippetCompareFn), this._refilterKind = 0, this._stats = { + pLabelLen: e.length ? rw(e.length - 0.85, e, (d, a) => d - a) : 0 }; } static _compareCompletionItems(e, t) { @@ -81068,7 +81068,7 @@ class Vd { if (t.completion.kind === 27) return -1; } - return Vd._compareCompletionItems(e, t); + return Ha._compareCompletionItems(e, t); } static _compareCompletionItemsSnippetsUp(e, t) { if (e.completion.kind !== t.completion.kind) { @@ -81077,20 +81077,20 @@ class Vd { if (t.completion.kind === 27) return 1; } - return Vd._compareCompletionItems(e, t); + return Ha._compareCompletionItems(e, t); } } -var w1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var hGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, bd = function(s, e) { +}, Ga = function(s, e) { return function(t, i) { e(t, i, s); }; -}, QD; -class bu { +}, Z9; +class Gu { static shouldAutoTrigger(e) { if (!e.hasModel()) return !1; @@ -81103,27 +81103,27 @@ class bu { this.leadingLineContent = e.getLineContent(t.lineNumber).substr(0, t.column - 1), this.leadingWord = e.getWordUntilPosition(t), this.lineNumber = t.lineNumber, this.column = t.column, this.triggerOptions = i; } } -function C1e(s, e, t) { - if (!e.getContextKeyValue(go.inlineSuggestionVisible.key)) +function uGe(s, e, t) { + if (!e.getContextKeyValue(po.inlineSuggestionVisible.key)) return !0; - const i = e.getContextKeyValue(go.suppressSuggestions.key); + const i = e.getContextKeyValue(po.suppressSuggestions.key); return i !== void 0 ? !i : !s.getOption( 62 /* EditorOption.inlineSuggest */ ).suppressSuggestions; } -function S1e(s, e, t) { +function mGe(s, e, t) { if (!e.getContextKeyValue("inlineSuggestionVisible")) return !0; - const i = e.getContextKeyValue(go.suppressSuggestions.key); + const i = e.getContextKeyValue(po.suppressSuggestions.key); return i !== void 0 ? !i : !s.getOption( 62 /* EditorOption.inlineSuggest */ ).suppressSuggestions; } -let sM = QD = class { - constructor(e, t, i, n, o, r, l, a, c) { - this._editor = e, this._editorWorkerService = t, this._clipboardService = i, this._telemetryService = n, this._logService = o, this._contextKeyService = r, this._configurationService = l, this._languageFeaturesService = a, this._envService = c, this._toDispose = new U(), this._triggerCharacterListener = new U(), this._triggerQuickSuggest = new qr(), this._triggerState = void 0, this._completionDisposables = new U(), this._onDidCancel = new k(), this._onDidTrigger = new k(), this._onDidSuggest = new k(), this.onDidCancel = this._onDidCancel.event, this.onDidTrigger = this._onDidTrigger.event, this.onDidSuggest = this._onDidSuggest.event, this._telemetryGate = 0, this._currentSelection = this._editor.getSelection() || new fe(1, 1, 1, 1), this._toDispose.add(this._editor.onDidChangeModel(() => { +let yI = Z9 = class { + constructor(e, t, i, n, o, l, r, c, d) { + this._editor = e, this._editorWorkerService = t, this._clipboardService = i, this._telemetryService = n, this._logService = o, this._contextKeyService = l, this._configurationService = r, this._languageFeaturesService = c, this._envService = d, this._toDispose = new _(), this._triggerCharacterListener = new _(), this._triggerQuickSuggest = new tr(), this._triggerState = void 0, this._completionDisposables = new _(), this._onDidCancel = new k(), this._onDidTrigger = new k(), this._onDidSuggest = new k(), this.onDidCancel = this._onDidCancel.event, this.onDidTrigger = this._onDidTrigger.event, this.onDidSuggest = this._onDidSuggest.event, this._telemetryGate = 0, this._currentSelection = this._editor.getSelection() || new ge(1, 1, 1, 1), this._toDispose.add(this._editor.onDidChangeModel(() => { this._updateTriggerCharacters(), this.cancel(); })), this._toDispose.add(this._editor.onDidChangeModelLanguage(() => { this._updateTriggerCharacters(), this.cancel(); @@ -81132,19 +81132,19 @@ let sM = QD = class { })), this._toDispose.add(this._languageFeaturesService.completionProvider.onDidChange(() => { this._updateTriggerCharacters(), this._updateActiveSuggestSession(); })); - let d = !1; + let a = !1; this._toDispose.add(this._editor.onDidCompositionStart(() => { - d = !0; + a = !0; })), this._toDispose.add(this._editor.onDidCompositionEnd(() => { - d = !1, this._onCompositionEnd(); + a = !1, this._onCompositionEnd(); })), this._toDispose.add(this._editor.onDidChangeCursorSelection((h) => { - d || this._onCursorChange(h); + a || this._onCursorChange(h); })), this._toDispose.add(this._editor.onDidChangeModelContent(() => { - !d && this._triggerState !== void 0 && this._refilterCompletionItems(); + !a && this._triggerState !== void 0 && this._refilterCompletionItems(); })), this._updateTriggerCharacters(); } dispose() { - Wt(this._triggerCharacterListener), Wt([this._onDidCancel, this._onDidSuggest, this._onDidTrigger, this._triggerQuickSuggest]), this._toDispose.dispose(), this._completionDisposables.dispose(), this.cancel(); + Nt(this._triggerCharacterListener), Nt([this._onDidCancel, this._onDidSuggest, this._onDidTrigger, this._triggerQuickSuggest]), this._toDispose.dispose(), this._completionDisposables.dispose(), this.cancel(); } _updateTriggerCharacters() { if (this._triggerCharacterListener.clear(), this._editor.getOption( @@ -81162,28 +81162,28 @@ let sM = QD = class { o || (o = /* @__PURE__ */ new Set(), e.set(n, o)), o.add(i); } const t = (i) => { - var r; - if (!S1e(this._editor, this._contextKeyService, this._configurationService) || bu.shouldAutoTrigger(this._editor)) + var l; + if (!mGe(this._editor, this._contextKeyService, this._configurationService) || Gu.shouldAutoTrigger(this._editor)) return; if (!i) { - const l = this._editor.getPosition(); - i = this._editor.getModel().getLineContent(l.lineNumber).substr(0, l.column - 1); + const r = this._editor.getPosition(); + i = this._editor.getModel().getLineContent(r.lineNumber).substr(0, r.column - 1); } let n = ""; - dm(i.charCodeAt(i.length - 1)) ? Hi(i.charCodeAt(i.length - 2)) && (n = i.substr(i.length - 2)) : n = i.charAt(i.length - 1); + pb(i.charCodeAt(i.length - 1)) ? Bi(i.charCodeAt(i.length - 2)) && (n = i.substr(i.length - 2)) : n = i.charAt(i.length - 1); const o = e.get(n); if (o) { - const l = /* @__PURE__ */ new Map(); + const r = /* @__PURE__ */ new Map(); if (this._completionModel) - for (const [a, c] of this._completionModel.getItemsByProvider()) - o.has(a) || l.set(a, c); + for (const [c, d] of this._completionModel.getItemsByProvider()) + o.has(c) || r.set(c, d); this.trigger({ auto: !0, triggerKind: 1, triggerCharacter: n, retrigger: !!this._completionModel, - clipboardText: (r = this._completionModel) == null ? void 0 : r.clipboardText, - completionOptions: { providerFilter: o, providerItemsToReuse: l } + clipboardText: (l = this._completionModel) == null ? void 0 : l.clipboardText, + completionOptions: { providerFilter: o, providerItemsToReuse: r } }); } }; @@ -81218,27 +81218,27 @@ let sM = QD = class { } _doTriggerQuickSuggest() { var e; - Kp.isAllOff(this._editor.getOption( + tg.isAllOff(this._editor.getOption( 90 /* EditorOption.quickSuggestions */ )) || this._editor.getOption( 119 /* EditorOption.suggest */ - ).snippetsPreventQuickSuggestions && ((e = Cs.get(this._editor)) != null && e.isInSnippet()) || (this.cancel(), this._triggerQuickSuggest.cancelAndSet(() => { - if (this._triggerState !== void 0 || !bu.shouldAutoTrigger(this._editor) || !this._editor.hasModel() || !this._editor.hasWidgetFocus()) + ).snippetsPreventQuickSuggestions && ((e = Xs.get(this._editor)) != null && e.isInSnippet()) || (this.cancel(), this._triggerQuickSuggest.cancelAndSet(() => { + if (this._triggerState !== void 0 || !Gu.shouldAutoTrigger(this._editor) || !this._editor.hasModel() || !this._editor.hasWidgetFocus()) return; const t = this._editor.getModel(), i = this._editor.getPosition(), n = this._editor.getOption( 90 /* EditorOption.quickSuggestions */ ); - if (!Kp.isAllOff(n)) { - if (!Kp.isAllOn(n)) { + if (!tg.isAllOff(n)) { + if (!tg.isAllOn(n)) { t.tokenization.tokenizeIfCheap(i.lineNumber); - const o = t.tokenization.getLineTokens(i.lineNumber), r = o.getStandardTokenType(o.findTokenIndexAtOffset(Math.max(i.column - 1 - 1, 0))); - if (Kp.valueFor(n, r) !== "on") + const o = t.tokenization.getLineTokens(i.lineNumber), l = o.getStandardTokenType(o.findTokenIndexAtOffset(Math.max(i.column - 1 - 1, 0))); + if (tg.valueFor(n, l) !== "on") return; } - C1e(this._editor, this._contextKeyService, this._configurationService) && this._languageFeaturesService.completionProvider.has(t) && this.trigger({ auto: !0 }); + uGe(this._editor, this._contextKeyService, this._configurationService) && this._languageFeaturesService.completionProvider.has(t) && this.trigger({ auto: !0 }); } }, this._editor.getOption( 91 @@ -81247,14 +81247,14 @@ let sM = QD = class { } _refilterCompletionItems() { ht(this._editor.hasModel()), ht(this._triggerState !== void 0); - const e = this._editor.getModel(), t = this._editor.getPosition(), i = new bu(e, t, { ...this._triggerState, refilter: !0 }); + const e = this._editor.getModel(), t = this._editor.getPosition(), i = new Gu(e, t, { ...this._triggerState, refilter: !0 }); this._onNewContext(i); } trigger(e) { - var u, g, m; + var u, m, b; if (!this._editor.hasModel()) return; - const t = this._editor.getModel(), i = new bu(t, this._editor.getPosition(), e); + const t = this._editor.getModel(), i = new Gu(t, this._editor.getPosition(), e); this.cancel(e.retrigger), this._triggerState = e, this._onDidTrigger.fire({ auto: e.auto, shy: e.shy ?? !1, position: this._editor.getPosition() }), this._context = i; let n = { triggerKind: e.triggerKind ?? 0 @@ -81263,48 +81263,48 @@ let sM = QD = class { e.triggerCharacter && (n = { triggerKind: 1, triggerCharacter: e.triggerCharacter - }), this._requestToken = new mi(); + }), this._requestToken = new pi(); const o = this._editor.getOption( 113 /* EditorOption.snippetSuggestions */ ); - let r = 1; + let l = 1; switch (o) { case "top": - r = 0; + l = 0; break; case "bottom": - r = 2; + l = 2; break; } - const { itemKind: l, showDeprecated: a } = QD.createSuggestFilter(this._editor), c = new Y1(r, ((u = e.completionOptions) == null ? void 0 : u.kindFilter) ?? l, (g = e.completionOptions) == null ? void 0 : g.providerFilter, (m = e.completionOptions) == null ? void 0 : m.providerItemsToReuse, a), d = nM.create(this._editorWorkerService, this._editor), h = B5(this._languageFeaturesService.completionProvider, t, this._editor.getPosition(), c, n, this._requestToken.token); - Promise.all([h, d]).then(async ([f, b]) => { - var L; - if ((L = this._requestToken) == null || L.dispose(), !this._editor.hasModel()) + const { itemKind: r, showDeprecated: c } = Z9.createSuggestFilter(this._editor), d = new $W(l, ((u = e.completionOptions) == null ? void 0 : u.kindFilter) ?? r, (m = e.completionOptions) == null ? void 0 : m.providerFilter, (b = e.completionOptions) == null ? void 0 : b.providerItemsToReuse, c), a = fI.create(this._editorWorkerService, this._editor), h = pE(this._languageFeaturesService.completionProvider, t, this._editor.getPosition(), d, n, this._requestToken.token); + Promise.all([h, a]).then(async ([g, Z]) => { + var X; + if ((X = this._requestToken) == null || X.dispose(), !this._editor.hasModel()) return; - let y = e == null ? void 0 : e.clipboardText; - if (!y && f.needsClipboard && (y = await this._clipboardService.readText()), this._triggerState === void 0) + let f = e == null ? void 0 : e.clipboardText; + if (!f && g.needsClipboard && (f = await this._clipboardService.readText()), this._triggerState === void 0) return; - const w = this._editor.getModel(), C = new bu(w, this._editor.getPosition(), e), S = { - ...b1.default, + const y = this._editor.getModel(), W = new Gu(y, this._editor.getPosition(), e), G = { + ...RW.default, firstMatchCanBeWeak: !this._editor.getOption( 119 /* EditorOption.suggest */ ).matchOnWordStartOnly }; - if (this._completionModel = new Vd(f.items, this._context.column, { - leadingLineContent: C.leadingLineContent, - characterCountDelta: C.column - this._context.column - }, b, this._editor.getOption( + if (this._completionModel = new Ha(g.items, this._context.column, { + leadingLineContent: W.leadingLineContent, + characterCountDelta: W.column - this._context.column + }, Z, this._editor.getOption( 119 /* EditorOption.suggest */ ), this._editor.getOption( 113 /* EditorOption.snippetSuggestions */ - ), S, y), this._completionDisposables.add(f.disposable), this._onNewContext(C), this._reportDurationsTelemetry(f.durations), !this._envService.isBuilt || this._envService.isExtensionDevelopment) - for (const x of f.items) - x.isInvalid && this._logService.warn(`[suggest] did IGNORE invalid completion item from ${x.provider._debugDisplayName}`, x.completion); - }).catch(De); + ), G, f), this._completionDisposables.add(g.disposable), this._onNewContext(W), this._reportDurationsTelemetry(g.durations), !this._envService.isBuilt || this._envService.isExtensionDevelopment) + for (const L of g.items) + L.isInvalid && this._logService.warn(`[suggest] did IGNORE invalid completion item from ${L.provider._debugDisplayName}`, L.completion); + }).catch(Me); } _reportDurationsTelemetry(e) { this._telemetryGate++ % 230 === 0 && setTimeout(() => { @@ -81416,7 +81416,7 @@ let sM = QD = class { this.cancel(); return; } - if (Nt(e.leadingLineContent) !== Nt(this._context.leadingLineContent)) { + if (Rt(e.leadingLineContent) !== Rt(this._context.leadingLineContent)) { this.cancel(); return; } @@ -81426,7 +81426,7 @@ let sM = QD = class { } if (this._completionModel) { if (e.leadingWord.word.length !== 0 && e.leadingWord.startColumn > this._context.leadingWord.startColumn) { - if (bu.shouldAutoTrigger(this._editor) && this._context) { + if (Gu.shouldAutoTrigger(this._editor) && this._context) { const i = this._completionModel.getItemsByProvider(); this.trigger({ auto: this._context.triggerOptions.auto, @@ -81455,7 +81455,7 @@ let sM = QD = class { leadingLineContent: e.leadingLineContent, characterCountDelta: e.column - this._context.column }, this._completionModel.items.length === 0) { - const n = bu.shouldAutoTrigger(this._editor); + const n = Gu.shouldAutoTrigger(this._editor); if (!this._context) { this.cancel(); return; @@ -81482,25 +81482,25 @@ let sM = QD = class { } } }; -sM = QD = w1e([ - bd(1, Ps), - bd(2, od), - bd(3, Ls), - bd(4, Xn), - bd(5, _e), - bd(6, Ke), - bd(7, ge), - bd(8, s5) -], sM); -const XZ = class XZ { +yI = Z9 = hGe([ + Ga(1, Us), + Ga(2, da), + Ga(3, Ls), + Ga(4, Fn), + Ga(5, xe), + Ga(6, Qe), + Ga(7, me), + Ga(8, RH) +], yI); +const eS = class eS { constructor(e, t) { - this._disposables = new U(), this._lastOvertyped = [], this._locked = !1, this._disposables.add(e.onWillType(() => { + this._disposables = new _(), this._lastOvertyped = [], this._locked = !1, this._disposables.add(e.onWillType(() => { if (this._locked || !e.hasModel()) return; const i = e.getSelections(), n = i.length; let o = !1; - for (let l = 0; l < n; l++) - if (!i[l].isEmpty()) { + for (let r = 0; r < n; r++) + if (!i[r].isEmpty()) { o = !0; break; } @@ -81509,12 +81509,12 @@ const XZ = class XZ { return; } this._lastOvertyped = []; - const r = e.getModel(); - for (let l = 0; l < n; l++) { - const a = i[l]; - if (r.getValueLengthInRange(a) > XZ._maxSelectionLength) + const l = e.getModel(); + for (let r = 0; r < n; r++) { + const c = i[r]; + if (l.getValueLengthInRange(c) > eS._maxSelectionLength) return; - this._lastOvertyped[l] = { value: r.getValueInRange(a), multiline: a.startLineNumber !== a.endLineNumber }; + this._lastOvertyped[r] = { value: l.getValueInRange(c), multiline: c.startLineNumber !== c.endLineNumber }; } })), this._disposables.add(t.onDidTrigger((i) => { this._locked = !0; @@ -81530,23 +81530,23 @@ const XZ = class XZ { this._disposables.dispose(); } }; -XZ._maxSelectionLength = 51200; -let jD = XZ; -var L1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +eS._maxSelectionLength = 51200; +let f9 = eS; +var bGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, YW = function(s, e) { +}, nN = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let qD = class { +let y9 = class { constructor(e, t, i, n, o) { - this._menuId = t, this._menuService = n, this._contextKeyService = o, this._menuDisposables = new U(), this.element = Q(e, ce(".suggest-status-bar")); - const r = (l) => l instanceof ao ? i.createInstance(OX, l, { useComma: !0 }) : void 0; - this._leftActions = new Yo(this.element, { actionViewItemProvider: r }), this._rightActions = new Yo(this.element, { actionViewItemProvider: r }), this._leftActions.domNode.classList.add("left"), this._rightActions.domNode.classList.add("right"); + this._menuId = t, this._menuService = n, this._contextKeyService = o, this._menuDisposables = new _(), this.element = O(e, de(".suggest-status-bar")); + const l = (r) => r instanceof ho ? i.createInstance(gH, r, { useComma: !0 }) : void 0; + this._leftActions = new Ao(this.element, { actionViewItemProvider: l }), this._rightActions = new Ao(this.element, { actionViewItemProvider: l }), this._leftActions.domNode.classList.add("left"), this._rightActions.domNode.classList.add("right"); } dispose() { this._menuDisposables.dispose(), this._leftActions.dispose(), this._rightActions.dispose(), this.element.remove(); @@ -81554,8 +81554,8 @@ let qD = class { show() { const e = this._menuService.createMenu(this._menuId, this._contextKeyService), t = () => { const i = [], n = []; - for (const [o, r] of e.getActions()) - o === "left" ? i.push(...r) : n.push(...r); + for (const [o, l] of e.getActions()) + o === "left" ? i.push(...l) : n.push(...l); this._leftActions.clear(), this._leftActions.push(i), this._rightActions.clear(), this._rightActions.push(n); }; this._menuDisposables.add(e.onDidChange(() => t())), this._menuDisposables.add(e); @@ -81564,29 +81564,29 @@ let qD = class { this._menuDisposables.clear(); } }; -qD = L1e([ - YW(2, Se), - YW(3, Uo), - YW(4, _e) -], qD); -var A1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +y9 = bGe([ + nN(2, Ge), + nN(3, Oo), + nN(4, xe) +], y9); +var pGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, x1e = function(s, e) { +}, gGe = function(s, e) { return function(t, i) { e(t, i, s); }; }; -function J5(s) { +function fE(s) { return !!s && !!(s.completion.documentation || s.completion.detail && s.completion.detail !== s.completion.label); } -let $D = class { +let W9 = class { constructor(e, t) { - this._editor = e, this._onDidClose = new k(), this.onDidClose = this._onDidClose.event, this._onDidChangeContents = new k(), this.onDidChangeContents = this._onDidChangeContents.event, this._disposables = new U(), this._renderDisposeable = new U(), this._borderWidth = 1, this._size = new Lt(330, 0), this.domNode = ce(".suggest-details"), this.domNode.classList.add("no-docs"), this._markdownRenderer = t.createInstance(Qc, { editor: e }), this._body = ce(".body"), this._scrollbar = new CC(this._body, { + this._editor = e, this._onDidClose = new k(), this.onDidClose = this._onDidClose.event, this._onDidChangeContents = new k(), this.onDidChangeContents = this._onDidChangeContents.event, this._disposables = new _(), this._renderDisposeable = new _(), this._borderWidth = 1, this._size = new Xt(330, 0), this.domNode = de(".suggest-details"), this.domNode.classList.add("no-docs"), this._markdownRenderer = t.createInstance(ea, { editor: e }), this._body = de(".body"), this._scrollbar = new MG(this._body, { alwaysConsumeMouseWheel: !0 - }), Q(this.domNode, this._scrollbar.getDomNode()), this._disposables.add(this._scrollbar), this._header = Q(this._body, ce(".header")), this._close = Q(this._header, ce("span" + Ze.asCSSSelector(te.close))), this._close.title = p("details.close", "Close"), this._type = Q(this._header, ce("p.type")), this._docs = Q(this._body, ce("p.docs")), this._configureFont(), this._disposables.add(this._editor.onDidChangeConfiguration((i) => { + }), O(this.domNode, this._scrollbar.getDomNode()), this._disposables.add(this._scrollbar), this._header = O(this._body, de(".header")), this._close = O(this._header, de("span" + Se.asCSSSelector(te.close))), this._close.title = p("details.close", "Close"), this._type = O(this._header, de("p.type")), this._docs = O(this._body, de("p.docs")), this._configureFont(), this._disposables.add(this._editor.onDidChangeConfiguration((i) => { i.hasChanged( 50 /* EditorOption.fontInfo */ @@ -81606,8 +81606,8 @@ let $D = class { ) || t.fontSize, o = e.get( 121 /* EditorOption.suggestLineHeight */ - ) || t.lineHeight, r = t.fontWeight, l = `${n}px`, a = `${o}px`; - this.domNode.style.fontSize = l, this.domNode.style.lineHeight = `${o / n}`, this.domNode.style.fontWeight = r, this.domNode.style.fontFeatureSettings = t.fontFeatureSettings, this._type.style.fontFamily = i, this._close.style.height = a, this._close.style.width = a; + ) || t.lineHeight, l = t.fontWeight, r = `${n}px`, c = `${o}px`; + this.domNode.style.fontSize = r, this.domNode.style.lineHeight = `${o / n}`, this.domNode.style.fontWeight = l, this.domNode.style.fontFeatureSettings = t.fontFeatureSettings, this._type.style.fontFamily = i, this._close.style.height = c, this._close.style.width = c; } getLayoutInfo() { const e = this._editor.getOption( @@ -81633,37 +81633,37 @@ let $D = class { this._renderDisposeable.clear(); let { detail: i, documentation: n } = e.completion; if (t) { - let r = ""; - r += `score: ${e.score[0]} -`, r += `prefix: ${e.word ?? "(no prefix)"} -`, r += `word: ${e.completion.filterText ? e.completion.filterText + " (filterText)" : e.textLabel} -`, r += `distance: ${e.distance} (localityBonus-setting) -`, r += `index: ${e.idx}, based on ${e.completion.sortText && `sortText: "${e.completion.sortText}"` || "label"} -`, r += `commit_chars: ${(o = e.completion.commitCharacters) == null ? void 0 : o.join("")} -`, n = new Vn().appendCodeblock("empty", r), i = `Provider: ${e.provider._debugDisplayName}`; - } - if (!t && !J5(e)) { + let l = ""; + l += `score: ${e.score[0]} +`, l += `prefix: ${e.word ?? "(no prefix)"} +`, l += `word: ${e.completion.filterText ? e.completion.filterText + " (filterText)" : e.textLabel} +`, l += `distance: ${e.distance} (localityBonus-setting) +`, l += `index: ${e.idx}, based on ${e.completion.sortText && `sortText: "${e.completion.sortText}"` || "label"} +`, l += `commit_chars: ${(o = e.completion.commitCharacters) == null ? void 0 : o.join("")} +`, n = new kn().appendCodeblock("empty", l), i = `Provider: ${e.provider._debugDisplayName}`; + } + if (!t && !fE(e)) { this.clearContents(); return; } if (this.domNode.classList.remove("no-docs", "no-type"), i) { - const r = i.length > 1e5 ? `${i.substr(0, 1e5)}…` : i; - this._type.textContent = r, this._type.title = r, no(this._type), this._type.classList.toggle("auto-wrap", !/\r?\n^\s+/gmi.test(r)); + const l = i.length > 1e5 ? `${i.substr(0, 1e5)}…` : i; + this._type.textContent = l, this._type.title = l, oo(this._type), this._type.classList.toggle("auto-wrap", !/\r?\n^\s+/gmi.test(l)); } else - gn(this._type), this._type.title = "", rs(this._type), this.domNode.classList.add("no-type"); - if (gn(this._docs), typeof n == "string") + bn(this._type), this._type.title = "", cs(this._type), this.domNode.classList.add("no-type"); + if (bn(this._docs), typeof n == "string") this._docs.classList.remove("markdown-docs"), this._docs.textContent = n; else if (n) { - this._docs.classList.add("markdown-docs"), gn(this._docs); - const r = this._markdownRenderer.render(n); - this._docs.appendChild(r.element), this._renderDisposeable.add(r), this._renderDisposeable.add(this._markdownRenderer.onDidRenderAsync(() => { + this._docs.classList.add("markdown-docs"), bn(this._docs); + const l = this._markdownRenderer.render(n); + this._docs.appendChild(l.element), this._renderDisposeable.add(l), this._renderDisposeable.add(this._markdownRenderer.onDidRenderAsync(() => { this.layout(this._size.width, this._type.clientHeight + this._docs.clientHeight), this._onDidChangeContents.fire(this); })); } - this.domNode.style.userSelect = "text", this.domNode.tabIndex = -1, this._close.onmousedown = (r) => { - r.preventDefault(), r.stopPropagation(); - }, this._close.onclick = (r) => { - r.preventDefault(), r.stopPropagation(), this._onDidClose.fire(); + this.domNode.style.userSelect = "text", this.domNode.tabIndex = -1, this._close.onmousedown = (l) => { + l.preventDefault(), l.stopPropagation(); + }, this._close.onclick = (l) => { + l.preventDefault(), l.stopPropagation(), this._onDidClose.fire(); }, this._body.scrollTop = 0, this.layout(this._size.width, this._type.clientHeight + this._docs.clientHeight), this._onDidChangeContents.fire(this); } clearContents() { @@ -81676,8 +81676,8 @@ let $D = class { return this._size; } layout(e, t) { - const i = new Lt(e, t); - Lt.equals(i, this._size) || (this._size = i, Kq(this.domNode, e, t)), this._scrollbar.scanDomNode(); + const i = new Xt(e, t); + Xt.equals(i, this._size) || (this._size = i, F$(this.domNode, e, t)), this._scrollbar.scanDomNode(); } scrollDown(e = 8) { this._body.scrollTop += e; @@ -81704,25 +81704,25 @@ let $D = class { return this._borderWidth; } }; -$D = A1e([ - x1e(1, Se) -], $D); -class M1e { +W9 = pGe([ + gGe(1, Ge) +], W9); +class ZGe { constructor(e, t) { - this.widget = e, this._editor = t, this.allowEditorOverflow = !0, this._disposables = new U(), this._added = !1, this._preferAlignAtTop = !0, this._resizable = new l5(), this._resizable.domNode.classList.add("suggest-details-container"), this._resizable.domNode.appendChild(e.domNode), this._resizable.enableSashes(!1, !0, !0, !1); - let i, n, o = 0, r = 0; + this.widget = e, this._editor = t, this.allowEditorOverflow = !0, this._disposables = new _(), this._added = !1, this._preferAlignAtTop = !0, this._resizable = new TH(), this._resizable.domNode.classList.add("suggest-details-container"), this._resizable.domNode.appendChild(e.domNode), this._resizable.enableSashes(!1, !0, !0, !1); + let i, n, o = 0, l = 0; this._disposables.add(this._resizable.onDidWillResize(() => { i = this._topLeft, n = this._resizable.size; - })), this._disposables.add(this._resizable.onDidResize((l) => { + })), this._disposables.add(this._resizable.onDidResize((r) => { if (i && n) { - this.widget.layout(l.dimension.width, l.dimension.height); - let a = !1; - l.west && (r = n.width - l.dimension.width, a = !0), l.north && (o = n.height - l.dimension.height, a = !0), a && this._applyTopLeft({ + this.widget.layout(r.dimension.width, r.dimension.height); + let c = !1; + r.west && (l = n.width - r.dimension.width, c = !0), r.north && (o = n.height - r.dimension.height, c = !0), c && this._applyTopLeft({ top: i.top + o, - left: i.left + r + left: i.left + l }); } - l.done && (i = void 0, n = void 0, o = 0, r = 0, this._userSize = l.dimension); + r.done && (i = void 0, n = void 0, o = 0, l = 0, this._userSize = r.dimension); })), this._disposables.add(this.widget.onDidChangeContents(() => { this._anchorBox && this._placeAtAnchor(this._anchorBox, this._userSize ?? this.widget.size, this._preferAlignAtTop); })); @@ -81750,118 +81750,118 @@ class M1e { this._anchorBox = i, this._preferAlignAtTop = t, this._placeAtAnchor(this._anchorBox, this._userSize ?? this.widget.size, t); } _placeAtAnchor(e, t, i) { - const n = Wh(this.getDomNode().ownerDocument.body), o = this.widget.getLayoutInfo(), r = new Lt(220, 2 * o.lineHeight), l = e.top, a = function() { - const L = n.width - (e.left + e.width + o.borderWidth + o.horizontalPadding), x = -o.borderWidth + e.left + e.width, Z = new Lt(L, n.height - e.top - o.borderHeight - o.verticalPadding), _ = Z.with(void 0, e.top + e.height - o.borderHeight - o.verticalPadding); - return { top: l, left: x, fit: L - t.width, maxSizeTop: Z, maxSizeBottom: _, minSize: r.with(Math.min(L, r.width)) }; - }(), c = function() { - const L = e.left - o.borderWidth - o.horizontalPadding, x = Math.max(o.horizontalPadding, e.left - t.width - o.borderWidth), Z = new Lt(L, n.height - e.top - o.borderHeight - o.verticalPadding), _ = Z.with(void 0, e.top + e.height - o.borderHeight - o.verticalPadding); - return { top: l, left: x, fit: L - t.width, maxSizeTop: Z, maxSizeBottom: _, minSize: r.with(Math.min(L, r.width)) }; + const n = Yh(this.getDomNode().ownerDocument.body), o = this.widget.getLayoutInfo(), l = new Xt(220, 2 * o.lineHeight), r = e.top, c = function() { + const X = n.width - (e.left + e.width + o.borderWidth + o.horizontalPadding), L = -o.borderWidth + e.left + e.width, S = new Xt(X, n.height - e.top - o.borderHeight - o.verticalPadding), x = S.with(void 0, e.top + e.height - o.borderHeight - o.verticalPadding); + return { top: r, left: L, fit: X - t.width, maxSizeTop: S, maxSizeBottom: x, minSize: l.with(Math.min(X, l.width)) }; }(), d = function() { - const L = e.left, x = -o.borderWidth + e.top + e.height, Z = new Lt(e.width - o.borderHeight, n.height - e.top - e.height - o.verticalPadding); - return { top: x, left: L, fit: Z.height - t.height, maxSizeBottom: Z, maxSizeTop: Z, minSize: r.with(Z.width) }; - }(), h = [a, c, d], u = h.find((L) => L.fit >= 0) ?? h.sort((L, x) => x.fit - L.fit)[0], g = e.top + e.height - o.borderHeight; - let m, f = t.height; - const b = Math.max(u.maxSizeTop.height, u.maxSizeBottom.height); - f > b && (f = b); - let y; - i ? f <= u.maxSizeTop.height ? (m = !0, y = u.maxSizeTop) : (m = !1, y = u.maxSizeBottom) : f <= u.maxSizeBottom.height ? (m = !1, y = u.maxSizeBottom) : (m = !0, y = u.maxSizeTop); - let { top: w, left: C } = u; - !m && f > e.height && (w = g - f); - const S = this._editor.getDomNode(); - if (S) { - const L = S.getBoundingClientRect(); - w -= L.top, C -= L.left; - } - this._applyTopLeft({ left: C, top: w }), this._resizable.enableSashes(!m, u === a, m, u !== a), this._resizable.minSize = u.minSize, this._resizable.maxSize = y, this._resizable.layout(f, Math.min(y.width, t.width)), this.widget.layout(this._resizable.size.width, this._resizable.size.height); + const X = e.left - o.borderWidth - o.horizontalPadding, L = Math.max(o.horizontalPadding, e.left - t.width - o.borderWidth), S = new Xt(X, n.height - e.top - o.borderHeight - o.verticalPadding), x = S.with(void 0, e.top + e.height - o.borderHeight - o.verticalPadding); + return { top: r, left: L, fit: X - t.width, maxSizeTop: S, maxSizeBottom: x, minSize: l.with(Math.min(X, l.width)) }; + }(), a = function() { + const X = e.left, L = -o.borderWidth + e.top + e.height, S = new Xt(e.width - o.borderHeight, n.height - e.top - e.height - o.verticalPadding); + return { top: L, left: X, fit: S.height - t.height, maxSizeBottom: S, maxSizeTop: S, minSize: l.with(S.width) }; + }(), h = [c, d, a], u = h.find((X) => X.fit >= 0) ?? h.sort((X, L) => L.fit - X.fit)[0], m = e.top + e.height - o.borderHeight; + let b, g = t.height; + const Z = Math.max(u.maxSizeTop.height, u.maxSizeBottom.height); + g > Z && (g = Z); + let f; + i ? g <= u.maxSizeTop.height ? (b = !0, f = u.maxSizeTop) : (b = !1, f = u.maxSizeBottom) : g <= u.maxSizeBottom.height ? (b = !1, f = u.maxSizeBottom) : (b = !0, f = u.maxSizeTop); + let { top: y, left: W } = u; + !b && g > e.height && (y = m - g); + const G = this._editor.getDomNode(); + if (G) { + const X = G.getBoundingClientRect(); + y -= X.top, W -= X.left; + } + this._applyTopLeft({ left: W, top: y }), this._resizable.enableSashes(!b, u === c, b, u !== c), this._resizable.minSize = u.minSize, this._resizable.maxSize = f, this._resizable.layout(g, Math.min(f.width, t.width)), this.widget.layout(this._resizable.size.width, this._resizable.size.height); } _applyTopLeft(e) { this._topLeft = e, this._editor.layoutOverlayWidget(this); } } -var Aa; +var xc; (function(s) { s[s.FILE = 0] = "FILE", s[s.FOLDER = 1] = "FOLDER", s[s.ROOT_FOLDER = 2] = "ROOT_FOLDER"; -})(Aa || (Aa = {})); -const Z1e = /(?:\/|^)(?:([^\/]+)\/)?([^\/]+)$/; -function YS(s, e, t, i, n) { - if (Ze.isThemeIcon(n)) +})(xc || (xc = {})); +const fGe = /(?:\/|^)(?:([^\/]+)\/)?([^\/]+)$/; +function eX(s, e, t, i, n) { + if (Se.isThemeIcon(n)) return [`codicon-${n.id}`, "predefined-file-icon"]; - if (Le.isUri(n)) + if (Xe.isUri(n)) return []; - const o = i === Aa.ROOT_FOLDER ? ["rootfolder-icon"] : i === Aa.FOLDER ? ["folder-icon"] : ["file-icon"]; + const o = i === xc.ROOT_FOLDER ? ["rootfolder-icon"] : i === xc.FOLDER ? ["folder-icon"] : ["file-icon"]; if (t) { - let r; - if (t.scheme === Ge.data) - r = Gh.parseMetaData(t).get(Gh.META_DATA_LABEL); + let l; + if (t.scheme === ve.data) + l = Dh.parseMetaData(t).get(Dh.META_DATA_LABEL); else { - const l = t.path.match(Z1e); - l ? (r = zS(l[2].toLowerCase()), l[1] && o.push(`${zS(l[1].toLowerCase())}-name-dir-icon`)) : r = zS(t.authority.toLowerCase()); + const r = t.path.match(fGe); + r ? (l = tX(r[2].toLowerCase()), r[1] && o.push(`${tX(r[1].toLowerCase())}-name-dir-icon`)) : l = tX(t.authority.toLowerCase()); } - if (i === Aa.ROOT_FOLDER) - o.push(`${r}-root-name-folder-icon`); - else if (i === Aa.FOLDER) - o.push(`${r}-name-folder-icon`); + if (i === xc.ROOT_FOLDER) + o.push(`${l}-root-name-folder-icon`); + else if (i === xc.FOLDER) + o.push(`${l}-name-folder-icon`); else { - if (r) { - if (o.push(`${r}-name-file-icon`), o.push("name-file-icon"), r.length <= 255) { - const a = r.split("."); - for (let c = 1; c < a.length; c++) - o.push(`${a.slice(c).join(".")}-ext-file-icon`); + if (l) { + if (o.push(`${l}-name-file-icon`), o.push("name-file-icon"), l.length <= 255) { + const c = l.split("."); + for (let d = 1; d < c.length; d++) + o.push(`${c.slice(d).join(".")}-ext-file-icon`); } o.push("ext-file-icon"); } - const l = _1e(s, e, t); - l && o.push(`${zS(l)}-lang-file-icon`); + const r = yGe(s, e, t); + r && o.push(`${tX(r)}-lang-file-icon`); } } return o; } -function _1e(s, e, t) { +function yGe(s, e, t) { if (!t) return null; let i = null; - if (t.scheme === Ge.data) { - const o = Gh.parseMetaData(t).get(Gh.META_DATA_MIME); + if (t.scheme === ve.data) { + const o = Dh.parseMetaData(t).get(Dh.META_DATA_MIME); o && (i = e.getLanguageIdByMimeType(o)); } else { const n = s.getModel(t); n && (i = n.getLanguageId()); } - return i && i !== ms ? i : e.guessLanguageIdByFilepathOrFirstLine(t); + return i && i !== gs ? i : e.guessLanguageIdByFilepathOrFirstLine(t); } -function zS(s) { +function tX(s) { return s.replace(/[\s]/g, "/"); } -var I1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var WGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, zW = function(s, e) { +}, sN = function(s, e) { return function(t, i) { e(t, i, s); }; }; -function Ej(s) { +function W7(s) { return `suggest-aria-id:${s}`; } -const N1e = Bt("suggest-more-info", te.chevronRight, p("suggestMoreInfoIcon", "Icon for more information in the suggest widget.")); -var Sl; -const W1e = new (Sl = class { +const GGe = Kt("suggest-more-info", te.chevronRight, p("suggestMoreInfoIcon", "Icon for more information in the suggest widget.")); +var Ir; +const XGe = new (Ir = class { extract(e, t) { - if (e.textLabel.match(Sl._regexStrict)) + if (e.textLabel.match(Ir._regexStrict)) return t[0] = e.textLabel, !0; - if (e.completion.detail && e.completion.detail.match(Sl._regexStrict)) + if (e.completion.detail && e.completion.detail.match(Ir._regexStrict)) return t[0] = e.completion.detail, !0; if (e.completion.documentation) { - const i = typeof e.completion.documentation == "string" ? e.completion.documentation : e.completion.documentation.value, n = Sl._regexRelaxed.exec(i); + const i = typeof e.completion.documentation == "string" ? e.completion.documentation : e.completion.documentation.value, n = Ir._regexRelaxed.exec(i); if (n && (n.index === 0 || n.index + n[0].length === i.length)) return t[0] = n[0], !0; } return !1; } -}, Sl._regexRelaxed = /(#([\da-fA-F]{3}){1,2}|(rgb|hsl)a\(\s*(\d{1,3}%?\s*,\s*){3}(1|0?\.\d+)\)|(rgb|hsl)\(\s*\d{1,3}%?(\s*,\s*\d{1,3}%?){2}\s*\))/, Sl._regexStrict = new RegExp(`^${Sl._regexRelaxed.source}$`, "i"), Sl)(); -let eV = class { +}, Ir._regexRelaxed = /(#([\da-fA-F]{3}){1,2}|(rgb|hsl)a\(\s*(\d{1,3}%?\s*,\s*){3}(1|0?\.\d+)\)|(rgb|hsl)\(\s*\d{1,3}%?(\s*,\s*\d{1,3}%?){2}\s*\))/, Ir._regexStrict = new RegExp(`^${Ir._regexRelaxed.source}$`, "i"), Ir)(); +let G9 = class { constructor(e, t, i, n) { this._editor = e, this._modelService = t, this._languageService = i, this._themeService = n, this._onDidToggleDetails = new k(), this.onDidToggleDetails = this._onDidToggleDetails.event, this.templateId = "suggestion"; } @@ -81869,89 +81869,89 @@ let eV = class { this._onDidToggleDetails.dispose(); } renderTemplate(e) { - const t = new U(), i = e; + const t = new _(), i = e; i.classList.add("show-file-icons"); - const n = Q(e, ce(".icon")), o = Q(n, ce("span.colorspan")), r = Q(e, ce(".contents")), l = Q(r, ce(".main")), a = Q(l, ce(".icon-label.codicon")), c = Q(l, ce("span.left")), d = Q(l, ce("span.right")), h = new Ex(c, { supportHighlights: !0, supportIcons: !0 }); + const n = O(e, de(".icon")), o = O(n, de("span.colorspan")), l = O(e, de(".contents")), r = O(l, de(".main")), c = O(r, de(".icon-label.codicon")), d = O(r, de("span.left")), a = O(r, de("span.right")), h = new $L(d, { supportHighlights: !0, supportIcons: !0 }); t.add(h); - const u = Q(c, ce("span.signature-label")), g = Q(c, ce("span.qualifier-label")), m = Q(d, ce("span.details-label")), f = Q(d, ce("span.readMore" + Ze.asCSSSelector(N1e))); - return f.title = p("readMore", "Read More"), { root: i, left: c, right: d, icon: n, colorspan: o, iconLabel: h, iconContainer: a, parametersLabel: u, qualifierLabel: g, detailsLabel: m, readMore: f, disposables: t, configureFont: () => { - const y = this._editor.getOptions(), w = y.get( + const u = O(d, de("span.signature-label")), m = O(d, de("span.qualifier-label")), b = O(a, de("span.details-label")), g = O(a, de("span.readMore" + Se.asCSSSelector(GGe))); + return g.title = p("readMore", "Read More"), { root: i, left: d, right: a, icon: n, colorspan: o, iconLabel: h, iconContainer: c, parametersLabel: u, qualifierLabel: m, detailsLabel: b, readMore: g, disposables: t, configureFont: () => { + const f = this._editor.getOptions(), y = f.get( 50 /* EditorOption.fontInfo */ - ), C = w.getMassagedFontFamily(), S = w.fontFeatureSettings, L = y.get( + ), W = y.getMassagedFontFamily(), G = y.fontFeatureSettings, X = f.get( 120 /* EditorOption.suggestFontSize */ - ) || w.fontSize, x = y.get( + ) || y.fontSize, L = f.get( 121 /* EditorOption.suggestLineHeight */ - ) || w.lineHeight, Z = w.fontWeight, _ = w.letterSpacing, v = `${L}px`, P = `${x}px`, E = `${_}px`; - i.style.fontSize = v, i.style.fontWeight = Z, i.style.letterSpacing = E, l.style.fontFamily = C, l.style.fontFeatureSettings = S, l.style.lineHeight = P, n.style.height = P, n.style.width = P, f.style.height = P, f.style.width = P; + ) || y.lineHeight, S = y.fontWeight, x = y.letterSpacing, w = `${X}px`, A = `${L}px`, H = `${x}px`; + i.style.fontSize = w, i.style.fontWeight = S, i.style.letterSpacing = H, r.style.fontFamily = W, r.style.fontFeatureSettings = G, r.style.lineHeight = A, n.style.height = A, n.style.width = A, g.style.height = A, g.style.width = A; } }; } renderElement(e, t, i) { i.configureFont(); const { completion: n } = e; - i.root.id = Ej(t), i.colorspan.style.backgroundColor = ""; + i.root.id = W7(t), i.colorspan.style.backgroundColor = ""; const o = { labelEscapeNewLines: !0, - matches: AI(e.score) - }, r = []; - if (n.kind === 19 && W1e.extract(e, r)) - i.icon.className = "icon customcolor", i.iconContainer.className = "icon hide", i.colorspan.style.backgroundColor = r[0]; + matches: Hx(e.score) + }, l = []; + if (n.kind === 19 && XGe.extract(e, l)) + i.icon.className = "icon customcolor", i.iconContainer.className = "icon hide", i.colorspan.style.backgroundColor = l[0]; else if (n.kind === 20 && this._themeService.getFileIconTheme().hasFileIcons) { i.icon.className = "icon hide", i.iconContainer.className = "icon hide"; - const l = YS(this._modelService, this._languageService, Le.from({ scheme: "fake", path: e.textLabel }), Aa.FILE), a = YS(this._modelService, this._languageService, Le.from({ scheme: "fake", path: n.detail }), Aa.FILE); - o.extraClasses = l.length > a.length ? l : a; + const r = eX(this._modelService, this._languageService, Xe.from({ scheme: "fake", path: e.textLabel }), xc.FILE), c = eX(this._modelService, this._languageService, Xe.from({ scheme: "fake", path: n.detail }), xc.FILE); + o.extraClasses = r.length > c.length ? r : c; } else n.kind === 23 && this._themeService.getFileIconTheme().hasFolderIcons ? (i.icon.className = "icon hide", i.iconContainer.className = "icon hide", o.extraClasses = [ - YS(this._modelService, this._languageService, Le.from({ scheme: "fake", path: e.textLabel }), Aa.FOLDER), - YS(this._modelService, this._languageService, Le.from({ scheme: "fake", path: n.detail }), Aa.FOLDER) - ].flat()) : (i.icon.className = "icon hide", i.iconContainer.className = "", i.iconContainer.classList.add("suggest-icon", ...Ze.asClassNameArray(qw.toIcon(n.kind)))); + eX(this._modelService, this._languageService, Xe.from({ scheme: "fake", path: e.textLabel }), xc.FOLDER), + eX(this._modelService, this._languageService, Xe.from({ scheme: "fake", path: n.detail }), xc.FOLDER) + ].flat()) : (i.icon.className = "icon hide", i.iconContainer.className = "", i.iconContainer.classList.add("suggest-icon", ...Se.asClassNameArray(aW.toIcon(n.kind)))); n.tags && n.tags.indexOf( 1 /* CompletionItemTag.Deprecated */ - ) >= 0 && (o.extraClasses = (o.extraClasses || []).concat(["deprecated"]), o.matches = []), i.iconLabel.setLabel(e.textLabel, void 0, o), typeof n.label == "string" ? (i.parametersLabel.textContent = "", i.detailsLabel.textContent = PW(n.detail || ""), i.root.classList.add("string-label")) : (i.parametersLabel.textContent = PW(n.label.detail || ""), i.detailsLabel.textContent = PW(n.label.description || ""), i.root.classList.remove("string-label")), this._editor.getOption( + ) >= 0 && (o.extraClasses = (o.extraClasses || []).concat(["deprecated"]), o.matches = []), i.iconLabel.setLabel(e.textLabel, void 0, o), typeof n.label == "string" ? (i.parametersLabel.textContent = "", i.detailsLabel.textContent = oN(n.detail || ""), i.root.classList.add("string-label")) : (i.parametersLabel.textContent = oN(n.label.detail || ""), i.detailsLabel.textContent = oN(n.label.description || ""), i.root.classList.remove("string-label")), this._editor.getOption( 119 /* EditorOption.suggest */ - ).showInlineDetails ? no(i.detailsLabel) : rs(i.detailsLabel), J5(e) ? (i.right.classList.add("can-expand-details"), no(i.readMore), i.readMore.onmousedown = (l) => { - l.stopPropagation(), l.preventDefault(); - }, i.readMore.onclick = (l) => { - l.stopPropagation(), l.preventDefault(), this._onDidToggleDetails.fire(); - }) : (i.right.classList.remove("can-expand-details"), rs(i.readMore), i.readMore.onmousedown = null, i.readMore.onclick = null); + ).showInlineDetails ? oo(i.detailsLabel) : cs(i.detailsLabel), fE(e) ? (i.right.classList.add("can-expand-details"), oo(i.readMore), i.readMore.onmousedown = (r) => { + r.stopPropagation(), r.preventDefault(); + }, i.readMore.onclick = (r) => { + r.stopPropagation(), r.preventDefault(), this._onDidToggleDetails.fire(); + }) : (i.right.classList.remove("can-expand-details"), cs(i.readMore), i.readMore.onmousedown = null, i.readMore.onclick = null); } disposeTemplate(e) { e.disposables.dispose(); } }; -eV = I1e([ - zW(1, Pt), - zW(2, ri), - zW(3, Pi) -], eV); -function PW(s) { +G9 = WGe([ + sN(1, At), + sN(2, ri), + sN(3, Ki) +], G9); +function oN(s) { return s.replace(/\r\n|\r|\n/g, ""); } -var v1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var VGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, PS = function(s, e) { +}, iX = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Np; -N("editorSuggestWidget.background", Xo, p("editorSuggestWidgetBackground", "Background color of the suggest widget.")); -N("editorSuggestWidget.border", kE, p("editorSuggestWidgetBorder", "Border color of the suggest widget.")); -const T1e = N("editorSuggestWidget.foreground", Ya, p("editorSuggestWidgetForeground", "Foreground color of the suggest widget.")); -N("editorSuggestWidget.selectedForeground", Jw, p("editorSuggestWidgetSelectedForeground", "Foreground color of the selected entry in the suggest widget.")); -N("editorSuggestWidget.selectedIconForeground", zE, p("editorSuggestWidgetSelectedIconForeground", "Icon foreground color of the selected entry in the suggest widget.")); -const D1e = N("editorSuggestWidget.selectedBackground", Uw, p("editorSuggestWidgetSelectedBackground", "Background color of the selected entry in the suggest widget.")); -N("editorSuggestWidget.highlightForeground", Gp, p("editorSuggestWidgetHighlightForeground", "Color of the match highlights in the suggest widget.")); -N("editorSuggestWidget.focusHighlightForeground", jne, p("editorSuggestWidgetFocusHighlightForeground", "Color of the match highlights in the suggest widget when an item is focused.")); -N("editorSuggestWidgetStatus.foreground", Pe(T1e, 0.5), p("editorSuggestWidgetStatusForeground", "Foreground color of the suggest widget status.")); -class V1e { +}, kp; +R("editorSuggestWidget.background", Fo, p("editorSuggestWidgetBackground", "Background color of the suggest widget.")); +R("editorSuggestWidget.border", lJ, p("editorSuggestWidgetBorder", "Border color of the suggest widget.")); +const LGe = R("editorSuggestWidget.foreground", Uc, p("editorSuggestWidgetForeground", "Foreground color of the suggest widget.")); +R("editorSuggestWidget.selectedForeground", oW, p("editorSuggestWidgetSelectedForeground", "Foreground color of the selected entry in the suggest widget.")); +R("editorSuggestWidget.selectedIconForeground", mJ, p("editorSuggestWidgetSelectedIconForeground", "Icon foreground color of the selected entry in the suggest widget.")); +const IGe = R("editorSuggestWidget.selectedBackground", lW, p("editorSuggestWidgetSelectedBackground", "Background color of the selected entry in the suggest widget.")); +R("editorSuggestWidget.highlightForeground", zp, p("editorSuggestWidgetHighlightForeground", "Color of the match highlights in the suggest widget.")); +R("editorSuggestWidget.focusHighlightForeground", Ase, p("editorSuggestWidgetFocusHighlightForeground", "Color of the match highlights in the suggest widget when an item is focused.")); +R("editorSuggestWidgetStatus.foreground", Ae(LGe, 0.5), p("editorSuggestWidgetStatusForeground", "Foreground color of the suggest widget status.")); +class SGe { constructor(e, t) { - this._service = e, this._key = `suggestWidget.size/${t.getEditorType()}/${t instanceof Qr}`; + this._service = e, this._key = `suggestWidget.size/${t.getEditorType()}/${t instanceof $l}`; } restore() { const e = this._service.get( @@ -81961,8 +81961,8 @@ class V1e { ) ?? ""; try { const t = JSON.parse(e); - if (Lt.is(t)) - return Lt.lift(t); + if (Xt.is(t)) + return Xt.lift(t); } catch { } } @@ -81983,41 +81983,41 @@ class V1e { ); } } -var bh; -let tV = (bh = class { +var Gh; +let X9 = (Gh = class { constructor(e, t, i, n, o) { - this.editor = e, this._storageService = t, this._state = 0, this._isAuto = !1, this._pendingLayout = new fn(), this._pendingShowDetails = new fn(), this._ignoreFocusEvents = !1, this._forceRenderingAbove = !1, this._explainMode = !1, this._showTimeout = new qr(), this._disposables = new U(), this._onDidSelect = new cm(), this._onDidFocus = new cm(), this._onDidHide = new k(), this._onDidShow = new k(), this.onDidSelect = this._onDidSelect.event, this.onDidFocus = this._onDidFocus.event, this.onDidHide = this._onDidHide.event, this.onDidShow = this._onDidShow.event, this._onDetailsKeydown = new k(), this.onDetailsKeyDown = this._onDetailsKeydown.event, this.element = new l5(), this.element.domNode.classList.add("editor-widget", "suggest-widget"), this._contentWidget = new k1e(this, e), this._persistedSize = new V1e(t, e); - class r { - constructor(g, m, f = !1, b = !1) { - this.persistedSize = g, this.currentSize = m, this.persistHeight = f, this.persistWidth = b; + this.editor = e, this._storageService = t, this._state = 0, this._isAuto = !1, this._pendingLayout = new Zn(), this._pendingShowDetails = new Zn(), this._ignoreFocusEvents = !1, this._forceRenderingAbove = !1, this._explainMode = !1, this._showTimeout = new tr(), this._disposables = new _(), this._onDidSelect = new bb(), this._onDidFocus = new bb(), this._onDidHide = new k(), this._onDidShow = new k(), this.onDidSelect = this._onDidSelect.event, this.onDidFocus = this._onDidFocus.event, this.onDidHide = this._onDidHide.event, this.onDidShow = this._onDidShow.event, this._onDetailsKeydown = new k(), this.onDetailsKeyDown = this._onDetailsKeydown.event, this.element = new TH(), this.element.domNode.classList.add("editor-widget", "suggest-widget"), this._contentWidget = new xGe(this, e), this._persistedSize = new SGe(t, e); + class l { + constructor(m, b, g = !1, Z = !1) { + this.persistedSize = m, this.currentSize = b, this.persistHeight = g, this.persistWidth = Z; } } - let l; + let r; this._disposables.add(this.element.onDidWillResize(() => { - this._contentWidget.lockPreference(), l = new r(this._persistedSize.restore(), this.element.size); + this._contentWidget.lockPreference(), r = new l(this._persistedSize.restore(), this.element.size); })), this._disposables.add(this.element.onDidResize((u) => { - var g, m; - if (this._resize(u.dimension.width, u.dimension.height), l && (l.persistHeight = l.persistHeight || !!u.north || !!u.south, l.persistWidth = l.persistWidth || !!u.east || !!u.west), !!u.done) { - if (l) { - const { itemHeight: f, defaultSize: b } = this.getLayoutInfo(), y = Math.round(f / 2); - let { width: w, height: C } = this.element.size; - (!l.persistHeight || Math.abs(l.currentSize.height - C) <= y) && (C = ((g = l.persistedSize) == null ? void 0 : g.height) ?? b.height), (!l.persistWidth || Math.abs(l.currentSize.width - w) <= y) && (w = ((m = l.persistedSize) == null ? void 0 : m.width) ?? b.width), this._persistedSize.store(new Lt(w, C)); + var m, b; + if (this._resize(u.dimension.width, u.dimension.height), r && (r.persistHeight = r.persistHeight || !!u.north || !!u.south, r.persistWidth = r.persistWidth || !!u.east || !!u.west), !!u.done) { + if (r) { + const { itemHeight: g, defaultSize: Z } = this.getLayoutInfo(), f = Math.round(g / 2); + let { width: y, height: W } = this.element.size; + (!r.persistHeight || Math.abs(r.currentSize.height - W) <= f) && (W = ((m = r.persistedSize) == null ? void 0 : m.height) ?? Z.height), (!r.persistWidth || Math.abs(r.currentSize.width - y) <= f) && (y = ((b = r.persistedSize) == null ? void 0 : b.width) ?? Z.width), this._persistedSize.store(new Xt(y, W)); } - this._contentWidget.unlockPreference(), l = void 0; + this._contentWidget.unlockPreference(), r = void 0; } - })), this._messageElement = Q(this.element.domNode, ce(".message")), this._listElement = Q(this.element.domNode, ce(".tree")); - const a = this._disposables.add(o.createInstance($D, this.editor)); - a.onDidClose(this.toggleDetails, this, this._disposables), this._details = new M1e(a, this.editor); - const c = () => this.element.domNode.classList.toggle("no-icons", !this.editor.getOption( + })), this._messageElement = O(this.element.domNode, de(".message")), this._listElement = O(this.element.domNode, de(".tree")); + const c = this._disposables.add(o.createInstance(W9, this.editor)); + c.onDidClose(this.toggleDetails, this, this._disposables), this._details = new ZGe(c, this.editor); + const d = () => this.element.domNode.classList.toggle("no-icons", !this.editor.getOption( 119 /* EditorOption.suggest */ ).showIcons); - c(); - const d = o.createInstance(eV, this.editor); - this._disposables.add(d), this._disposables.add(d.onDidToggleDetails(() => this.toggleDetails())), this._list = new Qo("SuggestWidget", this._listElement, { + d(); + const a = o.createInstance(G9, this.editor); + this._disposables.add(a), this._disposables.add(a.onDidToggleDetails(() => this.toggleDetails())), this._list = new qo("SuggestWidget", this._listElement, { getHeight: (u) => this.getLayoutInfo().itemHeight, getTemplateId: (u) => "suggestion" - }, [d], { + }, [a], { alwaysConsumeMouseWheel: !0, useShadows: !1, mouseSupport: !1, @@ -82027,21 +82027,21 @@ let tV = (bh = class { getWidgetAriaLabel: () => p("suggest", "Suggest"), getWidgetRole: () => "listbox", getAriaLabel: (u) => { - let g = u.textLabel; + let m = u.textLabel; if (typeof u.completion.label != "string") { - const { detail: y, description: w } = u.completion.label; - y && w ? g = p("label.full", "{0} {1}, {2}", g, y, w) : y ? g = p("label.detail", "{0} {1}", g, y) : w && (g = p("label.desc", "{0}, {1}", g, w)); + const { detail: f, description: y } = u.completion.label; + f && y ? m = p("label.full", "{0} {1}, {2}", m, f, y) : f ? m = p("label.detail", "{0} {1}", m, f) : y && (m = p("label.desc", "{0}, {1}", m, y)); } if (!u.isResolved || !this._isDetailsVisible()) - return g; - const { documentation: m, detail: f } = u.completion, b = rb("{0}{1}", f || "", m ? typeof m == "string" ? m : m.value : ""); - return p("ariaCurrenttSuggestionReadDetails", "{0}, docs: {1}", g, b); + return m; + const { documentation: b, detail: g } = u.completion, Z = uZ("{0}{1}", g || "", b ? typeof b == "string" ? b : b.value : ""); + return p("ariaCurrenttSuggestionReadDetails", "{0}, docs: {1}", m, Z); } } - }), this._list.style(zm({ - listInactiveFocusBackground: D1e, - listInactiveFocusOutline: Ut - })), this._status = o.createInstance(qD, this.element.domNode, rh); + }), this._list.style(Bb({ + listInactiveFocusBackground: IGe, + listInactiveFocusOutline: _t + })), this._status = o.createInstance(y9, this.element.domNode, ah); const h = () => this.element.domNode.classList.toggle("with-status-bar", this.editor.getOption( 119 /* EditorOption.suggest */ @@ -82050,7 +82050,7 @@ let tV = (bh = class { u.hasChanged( 119 /* EditorOption.suggest */ - ) && (h(), c()), this._completionModel && (u.hasChanged( + ) && (h(), d()), this._completionModel && (u.hasChanged( 50 /* EditorOption.fontInfo */ ) || u.hasChanged( @@ -82060,7 +82060,7 @@ let tV = (bh = class { 121 /* EditorOption.suggestLineHeight */ )) && this._list.splice(0, this._list.length, this._completionModel.items); - })), this._ctxSuggestWidgetVisible = ze.Visible.bindTo(i), this._ctxSuggestWidgetDetailsVisible = ze.DetailsVisible.bindTo(i), this._ctxSuggestWidgetMultipleSuggestions = ze.MultipleSuggestions.bindTo(i), this._ctxSuggestWidgetHasFocusedSuggestion = ze.HasFocusedSuggestion.bindTo(i), this._disposables.add(ai(this._details.widget.domNode, "keydown", (u) => { + })), this._ctxSuggestWidgetVisible = ze.Visible.bindTo(i), this._ctxSuggestWidgetDetailsVisible = ze.DetailsVisible.bindTo(i), this._ctxSuggestWidgetMultipleSuggestions = ze.MultipleSuggestions.bindTo(i), this._ctxSuggestWidgetHasFocusedSuggestion = ze.HasFocusedSuggestion.bindTo(i), this._disposables.add(di(this._details.widget.domNode, "keydown", (u) => { this._onDetailsKeydown.fire(u); })), this._disposables.add(this.editor.onMouseDown((u) => this._onEditorMouseDown(u))); } @@ -82085,7 +82085,7 @@ let tV = (bh = class { i && (this._onDidSelect.fire({ item: e, index: t, model: i }), this.editor.focus()); } _onThemeChange(e) { - this._details.widget.borderWidth = Ma(e.type) ? 2 : 1; + this._details.widget.borderWidth = Rc(e.type) ? 2 : 1; } _onListFocus(e) { var n; @@ -82099,18 +82099,18 @@ let tV = (bh = class { return; this._ctxSuggestWidgetHasFocusedSuggestion.set(!0); const t = e.elements[0], i = e.indexes[0]; - t !== this._focusedItem && ((n = this._currentSuggestionDetails) == null || n.cancel(), this._currentSuggestionDetails = void 0, this._focusedItem = t, this._list.reveal(i), this._currentSuggestionDetails = Ui(async (o) => { - const r = _h(() => { + t !== this._focusedItem && ((n = this._currentSuggestionDetails) == null || n.cancel(), this._currentSuggestionDetails = void 0, this._focusedItem = t, this._list.reveal(i), this._currentSuggestionDetails = Qi(async (o) => { + const l = wh(() => { this._isDetailsVisible() && this.showDetails(!0); - }, 250), l = o.onCancellationRequested(() => r.dispose()); + }, 250), r = o.onCancellationRequested(() => l.dispose()); try { return await t.resolve(o); } finally { - r.dispose(), l.dispose(); + l.dispose(), r.dispose(); } }), this._currentSuggestionDetails.then(() => { - i >= this._list.length || t !== this._list.element(i) || (this._ignoreFocusEvents = !0, this._list.splice(i, 1, [t]), this._list.setFocus([i]), this._ignoreFocusEvents = !1, this._isDetailsVisible() ? this.showDetails(!1) : this.element.domNode.classList.remove("docs-side"), this.editor.setAriaOptions({ activeDescendant: Ej(i) })); - }).catch(De)), this._onDidFocus.fire({ item: t, index: i, model: this._completionModel }); + i >= this._list.length || t !== this._list.element(i) || (this._ignoreFocusEvents = !0, this._list.splice(i, 1, [t]), this._list.setFocus([i]), this._ignoreFocusEvents = !1, this._isDetailsVisible() ? this.showDetails(!1) : this.element.domNode.classList.remove("docs-side"), this.editor.setAriaOptions({ activeDescendant: W7(i) })); + }).catch(Me)), this._onDidFocus.fire({ item: t, index: i, model: this._completionModel }); } _setState(e) { if (this._state !== e) @@ -82120,22 +82120,22 @@ let tV = (bh = class { /* State.Frozen */ ), this.element.domNode.classList.remove("message"), e) { case 0: - rs(this._messageElement, this._listElement, this._status.element), this._details.hide(!0), this._status.hide(), this._contentWidget.hide(), this._ctxSuggestWidgetVisible.reset(), this._ctxSuggestWidgetMultipleSuggestions.reset(), this._ctxSuggestWidgetHasFocusedSuggestion.reset(), this._showTimeout.cancel(), this.element.domNode.classList.remove("visible"), this._list.splice(0, this._list.length), this._focusedItem = void 0, this._cappedHeight = void 0, this._explainMode = !1; + cs(this._messageElement, this._listElement, this._status.element), this._details.hide(!0), this._status.hide(), this._contentWidget.hide(), this._ctxSuggestWidgetVisible.reset(), this._ctxSuggestWidgetMultipleSuggestions.reset(), this._ctxSuggestWidgetHasFocusedSuggestion.reset(), this._showTimeout.cancel(), this.element.domNode.classList.remove("visible"), this._list.splice(0, this._list.length), this._focusedItem = void 0, this._cappedHeight = void 0, this._explainMode = !1; break; case 1: - this.element.domNode.classList.add("message"), this._messageElement.textContent = Np.LOADING_MESSAGE, rs(this._listElement, this._status.element), no(this._messageElement), this._details.hide(), this._show(), this._focusedItem = void 0, Bc(Np.LOADING_MESSAGE); + this.element.domNode.classList.add("message"), this._messageElement.textContent = kp.LOADING_MESSAGE, cs(this._listElement, this._status.element), oo(this._messageElement), this._details.hide(), this._show(), this._focusedItem = void 0, _d(kp.LOADING_MESSAGE); break; case 2: - this.element.domNode.classList.add("message"), this._messageElement.textContent = Np.NO_SUGGESTIONS_MESSAGE, rs(this._listElement, this._status.element), no(this._messageElement), this._details.hide(), this._show(), this._focusedItem = void 0, Bc(Np.NO_SUGGESTIONS_MESSAGE); + this.element.domNode.classList.add("message"), this._messageElement.textContent = kp.NO_SUGGESTIONS_MESSAGE, cs(this._listElement, this._status.element), oo(this._messageElement), this._details.hide(), this._show(), this._focusedItem = void 0, _d(kp.NO_SUGGESTIONS_MESSAGE); break; case 3: - rs(this._messageElement), no(this._listElement, this._status.element), this._show(); + cs(this._messageElement), oo(this._listElement, this._status.element), this._show(); break; case 4: - rs(this._messageElement), no(this._listElement, this._status.element), this._show(); + cs(this._messageElement), oo(this._listElement, this._status.element), this._show(); break; case 5: - rs(this._messageElement), no(this._listElement, this._status.element), this._details.show(), this._show(); + cs(this._messageElement), oo(this._listElement, this._status.element), this._details.show(), this._show(); break; } } @@ -82145,22 +82145,22 @@ let tV = (bh = class { }, 100); } showTriggered(e, t) { - this._state === 0 && (this._contentWidget.setPosition(this.editor.getPosition()), this._isAuto = !!e, this._isAuto || (this._loadingTimeout = _h(() => this._setState( + this._state === 0 && (this._contentWidget.setPosition(this.editor.getPosition()), this._isAuto = !!e, this._isAuto || (this._loadingTimeout = wh(() => this._setState( 1 /* State.Loading */ ), t))); } showSuggestions(e, t, i, n, o) { - var a, c; - if (this._contentWidget.setPosition(this.editor.getPosition()), (a = this._loadingTimeout) == null || a.dispose(), (c = this._currentSuggestionDetails) == null || c.cancel(), this._currentSuggestionDetails = void 0, this._completionModel !== e && (this._completionModel = e), i && this._state !== 2 && this._state !== 0) { + var c, d; + if (this._contentWidget.setPosition(this.editor.getPosition()), (c = this._loadingTimeout) == null || c.dispose(), (d = this._currentSuggestionDetails) == null || d.cancel(), this._currentSuggestionDetails = void 0, this._completionModel !== e && (this._completionModel = e), i && this._state !== 2 && this._state !== 0) { this._setState( 4 /* State.Frozen */ ); return; } - const r = this._completionModel.items.length, l = r === 0; - if (this._ctxSuggestWidgetMultipleSuggestions.set(r > 1), l) { + const l = this._completionModel.items.length, r = l === 0; + if (this._ctxSuggestWidgetMultipleSuggestions.set(l > 1), r) { this._setState( n ? 0 : 2 /* State.Empty */ @@ -82176,7 +82176,7 @@ let tV = (bh = class { } finally { this._onDidFocus.resume(), this._onDidSelect.resume(); } - this._pendingLayout.value = aA(xe(this.element.domNode), () => { + this._pendingLayout.value = VV(Le(this.element.domNode), () => { this._pendingLayout.clear(), this._layout(this.element.size), this._details.widget.domNode.classList.remove("focused"); }); } @@ -82269,10 +82269,10 @@ let tV = (bh = class { ), this._details.widget.domNode.classList.add("focused")); } toggleDetails() { - this._isDetailsVisible() ? (this._pendingShowDetails.clear(), this._ctxSuggestWidgetDetailsVisible.set(!1), this._setDetailsVisible(!1), this._details.hide(), this.element.domNode.classList.remove("shows-details")) : (J5(this._list.getFocusedElements()[0]) || this._explainMode) && (this._state === 3 || this._state === 5 || this._state === 4) && (this._ctxSuggestWidgetDetailsVisible.set(!0), this._setDetailsVisible(!0), this.showDetails(!1)); + this._isDetailsVisible() ? (this._pendingShowDetails.clear(), this._ctxSuggestWidgetDetailsVisible.set(!1), this._setDetailsVisible(!1), this._details.hide(), this.element.domNode.classList.remove("shows-details")) : (fE(this._list.getFocusedElements()[0]) || this._explainMode) && (this._state === 3 || this._state === 5 || this._state === 4) && (this._ctxSuggestWidgetDetailsVisible.set(!0), this._setDetailsVisible(!0), this.showDetails(!1)); } showDetails(e) { - this._pendingShowDetails.value = aA(xe(this.element.domNode), () => { + this._pendingShowDetails.value = VV(Le(this.element.domNode), () => { this._pendingShowDetails.clear(), this._details.show(), e ? this._details.widget.renderLoading() : this._details.widget.renderItem(this._list.getFocusedElements()[0], this._explainMode), this._details.widget.isEmpty ? this._details.hide() : (this._positionDetails(), this.element.domNode.classList.add("shows-details")), this.editor.focus(); }); } @@ -82302,29 +82302,29 @@ let tV = (bh = class { this._state === 2 || this._state === 1 || (this._isDetailsVisible() && !this._details.widget.isEmpty && this._details.show(), this._positionDetails()); } _layout(e) { - var r, l; + var l, r; if (!this.editor.hasModel() || !this.editor.getDomNode()) return; - const t = Wh(this.element.domNode.ownerDocument.body), i = this.getLayoutInfo(); + const t = Yh(this.element.domNode.ownerDocument.body), i = this.getLayoutInfo(); e || (e = i.defaultSize); let n = e.height, o = e.width; if (this._status.element.style.height = `${i.itemHeight}px`, this._state === 2 || this._state === 1) - n = i.itemHeight + i.borderHeight, o = i.defaultSize.width / 2, this.element.enableSashes(!1, !1, !1, !1), this.element.minSize = this.element.maxSize = new Lt(o, n), this._contentWidget.setPreference( + n = i.itemHeight + i.borderHeight, o = i.defaultSize.width / 2, this.element.enableSashes(!1, !1, !1, !1), this.element.minSize = this.element.maxSize = new Xt(o, n), this._contentWidget.setPreference( 2 /* ContentWidgetPositionPreference.BELOW */ ); else { - const a = t.width - i.borderHeight - 2 * i.horizontalPadding; - o > a && (o = a); - const c = this._completionModel ? this._completionModel.stats.pLabelLen * i.typicalHalfwidthCharacterWidth : o, d = i.statusBarHeight + this._list.contentHeight + i.borderHeight, h = i.itemHeight + i.statusBarHeight, u = yi(this.editor.getDomNode()), g = this.editor.getScrolledVisiblePosition(this.editor.getPosition()), m = u.top + g.top + g.height, f = Math.min(t.height - m - i.verticalPadding, d), b = u.top + g.top - i.verticalPadding, y = Math.min(b, d); - let w = Math.min(Math.max(y, f) + i.borderHeight, d); - n === ((r = this._cappedHeight) == null ? void 0 : r.capped) && (n = this._cappedHeight.wanted), n < h && (n = h), n > w && (n = w), n > f || this._forceRenderingAbove && b > 150 ? (this._contentWidget.setPreference( + const c = t.width - i.borderHeight - 2 * i.horizontalPadding; + o > c && (o = c); + const d = this._completionModel ? this._completionModel.stats.pLabelLen * i.typicalHalfwidthCharacterWidth : o, a = i.statusBarHeight + this._list.contentHeight + i.borderHeight, h = i.itemHeight + i.statusBarHeight, u = yi(this.editor.getDomNode()), m = this.editor.getScrolledVisiblePosition(this.editor.getPosition()), b = u.top + m.top + m.height, g = Math.min(t.height - b - i.verticalPadding, a), Z = u.top + m.top - i.verticalPadding, f = Math.min(Z, a); + let y = Math.min(Math.max(f, g) + i.borderHeight, a); + n === ((l = this._cappedHeight) == null ? void 0 : l.capped) && (n = this._cappedHeight.wanted), n < h && (n = h), n > y && (n = y), n > g || this._forceRenderingAbove && Z > 150 ? (this._contentWidget.setPreference( 1 /* ContentWidgetPositionPreference.ABOVE */ - ), this.element.enableSashes(!0, !0, !1, !1), w = y) : (this._contentWidget.setPreference( + ), this.element.enableSashes(!0, !0, !1, !1), y = f) : (this._contentWidget.setPreference( 2 /* ContentWidgetPositionPreference.BELOW */ - ), this.element.enableSashes(!1, !0, !0, !1), w = f), this.element.preferredSize = new Lt(c, i.defaultSize.height), this.element.maxSize = new Lt(a, w), this.element.minSize = new Lt(220, h), this._cappedHeight = n === d ? { wanted: ((l = this._cappedHeight) == null ? void 0 : l.wanted) ?? e.height, capped: n } : void 0; + ), this.element.enableSashes(!1, !0, !0, !1), y = g), this.element.preferredSize = new Xt(d, i.defaultSize.height), this.element.maxSize = new Xt(c, y), this.element.minSize = new Xt(220, h), this._cappedHeight = n === a ? { wanted: ((r = this._cappedHeight) == null ? void 0 : r.wanted) ?? e.height, capped: n } : void 0; } this._resize(o, n); } @@ -82346,7 +82346,7 @@ let tV = (bh = class { const e = this.editor.getOption( 50 /* EditorOption.fontInfo */ - ), t = os(this.editor.getOption( + ), t = rs(this.editor.getOption( 121 /* EditorOption.suggestLineHeight */ ) || e.lineHeight, 8, 1e3), i = !this.editor.getOption( @@ -82361,7 +82361,7 @@ let tV = (bh = class { typicalHalfwidthCharacterWidth: e.typicalHalfwidthCharacterWidth, verticalPadding: 22, horizontalPadding: 14, - defaultSize: new Lt(430, i + 12 * t + o) + defaultSize: new Xt(430, i + 12 * t + o) }; } _isDetailsVisible() { @@ -82382,14 +82382,14 @@ let tV = (bh = class { stopForceRenderingAbove() { this._forceRenderingAbove = !1; } -}, Np = bh, bh.LOADING_MESSAGE = p("suggestWidget.loading", "Loading..."), bh.NO_SUGGESTIONS_MESSAGE = p("suggestWidget.noSuggestions", "No suggestions."), bh); -tV = Np = v1e([ - PS(1, za), - PS(2, _e), - PS(3, Pi), - PS(4, Se) -], tV); -class k1e { +}, kp = Gh, Gh.LOADING_MESSAGE = p("suggestWidget.loading", "Loading..."), Gh.NO_SUGGESTIONS_MESSAGE = p("suggestWidget.noSuggestions", "No suggestions."), Gh); +X9 = kp = VGe([ + iX(1, Pc), + iX(2, xe), + iX(3, Ki), + iX(4, Ge) +], X9); +class xGe { constructor(e, t) { this._widget = e, this._editor = t, this.allowEditorOverflow = !0, this.suppressMouseDown = !1, this._preferenceLocked = !1, this._added = !1, this._hidden = !1; } @@ -82419,7 +82419,7 @@ class k1e { } beforeRender() { const { height: e, width: t } = this._widget.element.size, { borderWidth: i, horizontalPadding: n } = this._widget.getLayoutInfo(); - return new Lt(t + 2 * i + n, e + 2 * i); + return new Xt(t + 2 * i + n, e + 2 * i); } afterRender(e) { this._widget._afterRender(e); @@ -82437,26 +82437,26 @@ class k1e { this._position = e; } } -var G1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var CGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, yp = function(s, e) { +}, Vp = function(s, e) { return function(t, i) { e(t, i, s); }; -}, iV; -class R1e { +}, V9; +class RGe { constructor(e, t) { - if (this._model = e, this._position = t, this._decorationOptions = Re.register({ + if (this._model = e, this._position = t, this._decorationOptions = Je.register({ description: "suggest-line-suffix", stickiness: 1 /* TrackedRangeStickiness.NeverGrowsWhenTypingAtEdges */ }), e.getLineMaxColumn(t.lineNumber) !== t.column) { const n = e.getOffsetAt(t), o = e.getPositionAt(n + 1); - e.changeDecorations((r) => { - this._marker && r.removeDecoration(this._marker), this._marker = r.addDecoration(M.fromPositions(t, o), this._decorationOptions); + e.changeDecorations((l) => { + this._marker && l.removeDecoration(this._marker), this._marker = l.addDecoration(I.fromPositions(t, o), this._decorationOptions); }); } } @@ -82475,60 +82475,60 @@ class R1e { return this._model.getLineMaxColumn(e.lineNumber) - e.column; } } -var Yg; -let Fr = (Yg = class { +var Pm; +let Al = (Pm = class { static get(e) { - return e.getContribution(iV.ID); + return e.getContribution(V9.ID); } - constructor(e, t, i, n, o, r, l) { - this._memoryService = t, this._commandService = i, this._contextKeyService = n, this._instantiationService = o, this._logService = r, this._telemetryService = l, this._lineSuffix = new fn(), this._toDispose = new U(), this._selectors = new E1e((h) => h.priority), this._onWillInsertSuggestItem = new k(), this.onWillInsertSuggestItem = this._onWillInsertSuggestItem.event, this.editor = e, this.model = o.createInstance(sM, this.editor), this._selectors.register({ + constructor(e, t, i, n, o, l, r) { + this._memoryService = t, this._commandService = i, this._contextKeyService = n, this._instantiationService = o, this._logService = l, this._telemetryService = r, this._lineSuffix = new Zn(), this._toDispose = new _(), this._selectors = new NGe((h) => h.priority), this._onWillInsertSuggestItem = new k(), this.onWillInsertSuggestItem = this._onWillInsertSuggestItem.event, this.editor = e, this.model = o.createInstance(yI, this.editor), this._selectors.register({ priority: 0, - select: (h, u, g) => this._memoryService.select(h, u, g) + select: (h, u, m) => this._memoryService.select(h, u, m) }); - const a = ze.InsertMode.bindTo(n); - a.set(e.getOption( + const c = ze.InsertMode.bindTo(n); + c.set(e.getOption( 119 /* EditorOption.suggest */ - ).insertMode), this._toDispose.add(this.model.onDidTrigger(() => a.set(e.getOption( + ).insertMode), this._toDispose.add(this.model.onDidTrigger(() => c.set(e.getOption( 119 /* EditorOption.suggest */ - ).insertMode))), this.widget = this._toDispose.add(new AN(xe(e.getDomNode()), () => { - const h = this._instantiationService.createInstance(tV, this.editor); - this._toDispose.add(h), this._toDispose.add(h.onDidSelect((b) => this._insertSuggestion( - b, + ).insertMode))), this.widget = this._toDispose.add(new EC(Le(e.getDomNode()), () => { + const h = this._instantiationService.createInstance(X9, this.editor); + this._toDispose.add(h), this._toDispose.add(h.onDidSelect((Z) => this._insertSuggestion( + Z, 0 /* InsertFlags.None */ ), this)); - const u = new y1e(this.editor, h, this.model, (b) => this._insertSuggestion( - b, + const u = new aGe(this.editor, h, this.model, (Z) => this._insertSuggestion( + Z, 2 /* InsertFlags.NoAfterUndoStop */ )); this._toDispose.add(u); - const g = ze.MakesTextEdit.bindTo(this._contextKeyService), m = ze.HasInsertAndReplaceRange.bindTo(this._contextKeyService), f = ze.CanResolve.bindTo(this._contextKeyService); - return this._toDispose.add(Ce(() => { - g.reset(), m.reset(), f.reset(); - })), this._toDispose.add(h.onDidFocus(({ item: b }) => { - const y = this.editor.getPosition(), w = b.editStart.column, C = y.column; - let S = !0; + const m = ze.MakesTextEdit.bindTo(this._contextKeyService), b = ze.HasInsertAndReplaceRange.bindTo(this._contextKeyService), g = ze.CanResolve.bindTo(this._contextKeyService); + return this._toDispose.add(We(() => { + m.reset(), b.reset(), g.reset(); + })), this._toDispose.add(h.onDidFocus(({ item: Z }) => { + const f = this.editor.getPosition(), y = Z.editStart.column, W = f.column; + let G = !0; this.editor.getOption( 1 /* EditorOption.acceptSuggestionOnEnter */ - ) === "smart" && this.model.state === 2 && !b.completion.additionalTextEdits && !(b.completion.insertTextRules & 4) && C - w === b.completion.insertText.length && (S = this.editor.getModel().getValueInRange({ - startLineNumber: y.lineNumber, - startColumn: w, - endLineNumber: y.lineNumber, - endColumn: C - }) !== b.completion.insertText), g.set(S), m.set(!V.equals(b.editInsertEnd, b.editReplaceEnd)), f.set(!!b.provider.resolveCompletionItem || !!b.completion.documentation || b.completion.detail !== b.completion.label); - })), this._toDispose.add(h.onDetailsKeyDown((b) => { - if (b.toKeyCodeChord().equals(new zc( + ) === "smart" && this.model.state === 2 && !Z.completion.additionalTextEdits && !(Z.completion.insertTextRules & 4) && W - y === Z.completion.insertText.length && (G = this.editor.getModel().getValueInRange({ + startLineNumber: f.lineNumber, + startColumn: y, + endLineNumber: f.lineNumber, + endColumn: W + }) !== Z.completion.insertText), m.set(G), b.set(!Y.equals(Z.editInsertEnd, Z.editReplaceEnd)), g.set(!!Z.provider.resolveCompletionItem || !!Z.completion.documentation || Z.completion.detail !== Z.completion.label); + })), this._toDispose.add(h.onDetailsKeyDown((Z) => { + if (Z.toKeyCodeChord().equals(new Pd( !0, !1, !1, !1, 33 /* KeyCode.KeyC */ - )) || qe && b.toKeyCodeChord().equals(new zc( + )) || qe && Z.toKeyCodeChord().equals(new Pd( !1, !1, !1, @@ -82536,44 +82536,44 @@ let Fr = (Yg = class { 33 /* KeyCode.KeyC */ ))) { - b.stopPropagation(); + Z.stopPropagation(); return; } - b.toKeyCodeChord().isModifierKey() || this.editor.focus(); + Z.toKeyCodeChord().isModifierKey() || this.editor.focus(); })), h; - })), this._overtypingCapturer = this._toDispose.add(new AN(xe(e.getDomNode()), () => this._toDispose.add(new jD(this.editor, this.model)))), this._alternatives = this._toDispose.add(new AN(xe(e.getDomNode()), () => this._toDispose.add(new Gb(this.editor, this._contextKeyService)))), this._toDispose.add(o.createInstance(tM, e)), this._toDispose.add(this.model.onDidTrigger((h) => { - this.widget.value.showTriggered(h.auto, h.shy ? 250 : 50), this._lineSuffix.value = new R1e(this.editor.getModel(), h.position); + })), this._overtypingCapturer = this._toDispose.add(new EC(Le(e.getDomNode()), () => this._toDispose.add(new f9(this.editor, this.model)))), this._alternatives = this._toDispose.add(new EC(Le(e.getDomNode()), () => this._toDispose.add(new zZ(this.editor, this._contextKeyService)))), this._toDispose.add(o.createInstance(gI, e)), this._toDispose.add(this.model.onDidTrigger((h) => { + this.widget.value.showTriggered(h.auto, h.shy ? 250 : 50), this._lineSuffix.value = new RGe(this.editor.getModel(), h.position); })), this._toDispose.add(this.model.onDidSuggest((h) => { if (h.triggerOptions.shy) return; let u = -1; - for (const m of this._selectors.itemsOrderedByPriorityDesc) - if (u = m.select(this.editor.getModel(), this.editor.getPosition(), h.completionModel.items), u !== -1) + for (const b of this._selectors.itemsOrderedByPriorityDesc) + if (u = b.select(this.editor.getModel(), this.editor.getPosition(), h.completionModel.items), u !== -1) break; if (u === -1 && (u = 0), this.model.state === 0) return; - let g = !1; + let m = !1; if (h.triggerOptions.auto) { - const m = this.editor.getOption( + const b = this.editor.getOption( 119 /* EditorOption.suggest */ ); - m.selectionMode === "never" || m.selectionMode === "always" ? g = m.selectionMode === "never" : m.selectionMode === "whenTriggerCharacter" ? g = h.triggerOptions.triggerKind !== 1 : m.selectionMode === "whenQuickSuggestion" && (g = h.triggerOptions.triggerKind === 1 && !h.triggerOptions.refilter); + b.selectionMode === "never" || b.selectionMode === "always" ? m = b.selectionMode === "never" : b.selectionMode === "whenTriggerCharacter" ? m = h.triggerOptions.triggerKind !== 1 : b.selectionMode === "whenQuickSuggestion" && (m = h.triggerOptions.triggerKind === 1 && !h.triggerOptions.refilter); } - this.widget.value.showSuggestions(h.completionModel, u, h.isFrozen, h.triggerOptions.auto, g); + this.widget.value.showSuggestions(h.completionModel, u, h.isFrozen, h.triggerOptions.auto, m); })), this._toDispose.add(this.model.onDidCancel((h) => { h.retrigger || this.widget.value.hideWidget(); })), this._toDispose.add(this.editor.onDidBlurEditorWidget(() => { this.model.cancel(), this.model.clear(); })); - const c = ze.AcceptSuggestionsOnEnter.bindTo(n), d = () => { + const d = ze.AcceptSuggestionsOnEnter.bindTo(n), a = () => { const h = this.editor.getOption( 1 /* EditorOption.acceptSuggestionOnEnter */ ); - c.set(h === "on" || h === "smart"); + d.set(h === "on" || h === "smart"); }; - this._toDispose.add(this.editor.onDidChangeConfiguration(() => d())), d(); + this._toDispose.add(this.editor.onDidChangeConfiguration(() => a())), a(); } dispose() { this._alternatives.dispose(), this._toDispose.dispose(), this.widget.dispose(), this.model.dispose(), this._lineSuffix.dispose(), this._onWillInsertSuggestItem.dispose(); @@ -82585,110 +82585,110 @@ let Fr = (Yg = class { } if (!this.editor.hasModel()) return; - const i = Cs.get(this.editor); + const i = Xs.get(this.editor); if (!i) return; this._onWillInsertSuggestItem.fire({ item: e.item }); - const n = this.editor.getModel(), o = n.getAlternativeVersionId(), { item: r } = e, l = [], a = new mi(); + const n = this.editor.getModel(), o = n.getAlternativeVersionId(), { item: l } = e, r = [], c = new pi(); t & 1 || this.editor.pushUndoStop(); - const c = this.getOverwriteInfo(r, !!(t & 8)); - this._memoryService.memorize(n, this.editor.getPosition(), r); - const d = r.isResolved; + const d = this.getOverwriteInfo(l, !!(t & 8)); + this._memoryService.memorize(n, this.editor.getPosition(), l); + const a = l.isResolved; let h = -1, u = -1; - if (Array.isArray(r.completion.additionalTextEdits)) { + if (Array.isArray(l.completion.additionalTextEdits)) { this.model.cancel(); - const m = Vl.capture(this.editor); - this.editor.executeEdits("suggestController.additionalTextEdits.sync", r.completion.additionalTextEdits.map((f) => { - let b = M.lift(f.range); - if (b.startLineNumber === r.position.lineNumber && b.startColumn > r.position.column) { - const y = this.editor.getPosition().column - r.position.column, w = y, C = M.spansMultipleLines(b) ? 0 : y; - b = new M(b.startLineNumber, b.startColumn + w, b.endLineNumber, b.endColumn + C); + const b = Hr.capture(this.editor); + this.editor.executeEdits("suggestController.additionalTextEdits.sync", l.completion.additionalTextEdits.map((g) => { + let Z = I.lift(g.range); + if (Z.startLineNumber === l.position.lineNumber && Z.startColumn > l.position.column) { + const f = this.editor.getPosition().column - l.position.column, y = f, W = I.spansMultipleLines(Z) ? 0 : f; + Z = new I(Z.startLineNumber, Z.startColumn + y, Z.endLineNumber, Z.endColumn + W); } - return si.replaceMove(b, f.text); - })), m.restoreRelativeVerticalPositionOfCursor(this.editor); - } else if (!d) { - const m = new on(); - let f; - const b = n.onDidChangeContent((S) => { - if (S.isFlush) { - a.cancel(), b.dispose(); + return oi.replaceMove(Z, g.text); + })), b.restoreRelativeVerticalPositionOfCursor(this.editor); + } else if (!a) { + const b = new ln(); + let g; + const Z = n.onDidChangeContent((G) => { + if (G.isFlush) { + c.cancel(), Z.dispose(); return; } - for (const L of S.changes) { - const x = M.getEndPosition(L.range); - (!f || V.isBefore(x, f)) && (f = x); + for (const X of G.changes) { + const L = I.getEndPosition(X.range); + (!g || Y.isBefore(L, g)) && (g = L); } - }), y = t; + }), f = t; t |= 2; - let w = !1; - const C = this.editor.onWillType(() => { - C.dispose(), w = !0, y & 2 || this.editor.pushUndoStop(); + let y = !1; + const W = this.editor.onWillType(() => { + W.dispose(), y = !0, f & 2 || this.editor.pushUndoStop(); }); - l.push(r.resolve(a.token).then(() => { - if (!r.completion.additionalTextEdits || a.token.isCancellationRequested) + r.push(l.resolve(c.token).then(() => { + if (!l.completion.additionalTextEdits || c.token.isCancellationRequested) return; - if (f && r.completion.additionalTextEdits.some((L) => V.isBefore(f, M.getStartPosition(L.range)))) + if (g && l.completion.additionalTextEdits.some((X) => Y.isBefore(g, I.getStartPosition(X.range)))) return !1; - w && this.editor.pushUndoStop(); - const S = Vl.capture(this.editor); - return this.editor.executeEdits("suggestController.additionalTextEdits.async", r.completion.additionalTextEdits.map((L) => si.replaceMove(M.lift(L.range), L.text))), S.restoreRelativeVerticalPositionOfCursor(this.editor), (w || !(y & 2)) && this.editor.pushUndoStop(), !0; - }).then((S) => { - this._logService.trace("[suggest] async resolving of edits DONE (ms, applied?)", m.elapsed(), S), u = S === !0 ? 1 : S === !1 ? 0 : -2; + y && this.editor.pushUndoStop(); + const G = Hr.capture(this.editor); + return this.editor.executeEdits("suggestController.additionalTextEdits.async", l.completion.additionalTextEdits.map((X) => oi.replaceMove(I.lift(X.range), X.text))), G.restoreRelativeVerticalPositionOfCursor(this.editor), (y || !(f & 2)) && this.editor.pushUndoStop(), !0; + }).then((G) => { + this._logService.trace("[suggest] async resolving of edits DONE (ms, applied?)", b.elapsed(), G), u = G === !0 ? 1 : G === !1 ? 0 : -2; }).finally(() => { - b.dispose(), C.dispose(); + Z.dispose(), W.dispose(); })); } - let { insertText: g } = r.completion; - if (r.completion.insertTextRules & 4 || (g = Lm.escape(g)), this.model.cancel(), i.insert(g, { - overwriteBefore: c.overwriteBefore, - overwriteAfter: c.overwriteAfter, + let { insertText: m } = l.completion; + if (l.completion.insertTextRules & 4 || (m = xb.escape(m)), this.model.cancel(), i.insert(m, { + overwriteBefore: d.overwriteBefore, + overwriteAfter: d.overwriteAfter, undoStopBefore: !1, undoStopAfter: !1, - adjustWhitespace: !(r.completion.insertTextRules & 1), + adjustWhitespace: !(l.completion.insertTextRules & 1), clipboardText: e.model.clipboardText, overtypingCapturer: this._overtypingCapturer.value - }), t & 2 || this.editor.pushUndoStop(), r.completion.command) - if (r.completion.command.id === oM.id) + }), t & 2 || this.editor.pushUndoStop(), l.completion.command) + if (l.completion.command.id === WI.id) this.model.trigger({ auto: !0, retrigger: !0 }); else { - const m = new on(); - l.push(this._commandService.executeCommand(r.completion.command.id, ...r.completion.command.arguments ? [...r.completion.command.arguments] : []).catch((f) => { - r.completion.extensionId ? wi(f) : De(f); + const b = new ln(); + r.push(this._commandService.executeCommand(l.completion.command.id, ...l.completion.command.arguments ? [...l.completion.command.arguments] : []).catch((g) => { + l.completion.extensionId ? Wi(g) : Me(g); }).finally(() => { - h = m.elapsed(); + h = b.elapsed(); })); } - t & 4 && this._alternatives.value.set(e, (m) => { - for (a.cancel(); n.canUndo(); ) { - o !== n.getAlternativeVersionId() && n.undo(), this._insertSuggestion(m, 3 | (t & 8 ? 8 : 0)); + t & 4 && this._alternatives.value.set(e, (b) => { + for (c.cancel(); n.canUndo(); ) { + o !== n.getAlternativeVersionId() && n.undo(), this._insertSuggestion(b, 3 | (t & 8 ? 8 : 0)); break; } - }), this._alertCompletionItem(r), Promise.all(l).finally(() => { - this._reportSuggestionAcceptedTelemetry(r, n, d, h, u, e.index, e.model.items), this.model.clear(), a.dispose(); + }), this._alertCompletionItem(l), Promise.all(r).finally(() => { + this._reportSuggestionAcceptedTelemetry(l, n, a, h, u, e.index, e.model.items), this.model.clear(), c.dispose(); }); } - _reportSuggestionAcceptedTelemetry(e, t, i, n, o, r, l) { + _reportSuggestionAcceptedTelemetry(e, t, i, n, o, l, r) { var u; if (Math.floor(Math.random() * 100) === 0) return; - const a = /* @__PURE__ */ new Map(); - for (let g = 0; g < Math.min(30, l.length); g++) { - const m = l[g].textLabel; - a.has(m) ? a.get(m).push(g) : a.set(m, [g]); + const c = /* @__PURE__ */ new Map(); + for (let m = 0; m < Math.min(30, r.length); m++) { + const b = r[m].textLabel; + c.has(b) ? c.get(b).push(m) : c.set(b, [m]); } - const c = a.get(e.textLabel), h = c && c.length > 1 ? c[0] : -1; + const d = c.get(e.textLabel), h = d && d.length > 1 ? d[0] : -1; this._telemetryService.publicLog2("suggest.acceptedSuggestion", { extensionId: ((u = e.extensionId) == null ? void 0 : u.value) ?? "unknown", providerId: e.provider._debugDisplayName ?? "unknown", kind: e.completion.kind, - basenameHash: v_(Cr(t.uri)).toString(16), + basenameHash: PS(Vl(t.uri)).toString(16), languageId: t.getLanguageId(), - fileExtension: Qle(t.uri), + fileExtension: zce(t.uri), resolveInfo: e.provider.resolveCompletionItem ? i ? 1 : 0 : -1, resolveDuration: e.resolveDuration, commandDuration: n, additionalEditsAsync: o, - index: r, + index: l, firstIndex: h }); } @@ -82699,16 +82699,16 @@ let Fr = (Yg = class { /* EditorOption.suggest */ ).insertMode === "replace"; t && (i = !i); - const n = e.position.column - e.editStart.column, o = (i ? e.editReplaceEnd.column : e.editInsertEnd.column) - e.position.column, r = this.editor.getPosition().column - e.position.column, l = this._lineSuffix.value ? this._lineSuffix.value.delta(this.editor.getPosition()) : 0; + const n = e.position.column - e.editStart.column, o = (i ? e.editReplaceEnd.column : e.editInsertEnd.column) - e.position.column, l = this.editor.getPosition().column - e.position.column, r = this._lineSuffix.value ? this._lineSuffix.value.delta(this.editor.getPosition()) : 0; return { - overwriteBefore: n + r, - overwriteAfter: o + l + overwriteBefore: n + l, + overwriteAfter: o + r }; } _alertCompletionItem(e) { - if ($n(e.completion.additionalTextEdits)) { + if (ts(e.completion.additionalTextEdits)) { const t = p("aria.alert.snippet", "Accepting '{0}' made {1} additional edits", e.textLabel, e.completion.additionalTextEdits.length); - bs(t); + ys(t); } } triggerSuggest(e, t, i) { @@ -82729,34 +82729,34 @@ let Fr = (Yg = class { }, n = (o) => { if (o.completion.insertTextRules & 4 || o.completion.additionalTextEdits) return !0; - const r = this.editor.getPosition(), l = o.editStart.column, a = r.column; - return a - l !== o.completion.insertText.length ? !0 : this.editor.getModel().getValueInRange({ - startLineNumber: r.lineNumber, - startColumn: l, - endLineNumber: r.lineNumber, - endColumn: a + const l = this.editor.getPosition(), r = o.editStart.column, c = l.column; + return c - r !== o.completion.insertText.length ? !0 : this.editor.getModel().getValueInRange({ + startLineNumber: l.lineNumber, + startColumn: r, + endLineNumber: l.lineNumber, + endColumn: c }) !== o.completion.insertText; }; se.once(this.model.onDidTrigger)((o) => { - const r = []; + const l = []; se.any(this.model.onDidTrigger, this.model.onDidCancel)(() => { - Wt(r), i(); - }, void 0, r), this.model.onDidSuggest(({ completionModel: l }) => { - if (Wt(r), l.items.length === 0) { + Nt(l), i(); + }, void 0, l), this.model.onDidSuggest(({ completionModel: r }) => { + if (Nt(l), r.items.length === 0) { i(); return; } - const a = this._memoryService.select(this.editor.getModel(), this.editor.getPosition(), l.items), c = l.items[a]; - if (!n(c)) { + const c = this._memoryService.select(this.editor.getModel(), this.editor.getPosition(), r.items), d = r.items[c]; + if (!n(d)) { i(); return; } this.editor.pushUndoStop(), this._insertSuggestion( - { index: a, item: c, model: l }, + { index: c, item: d, model: r }, 7 /* InsertFlags.NoAfterUndoStop */ ); - }, void 0, r); + }, void 0, l); }), this.model.trigger({ auto: !1, shy: !0 }), this.editor.revealPosition( t, 0 @@ -82819,16 +82819,16 @@ let Fr = (Yg = class { registerSelector(e) { return this._selectors.register(e); } -}, iV = Yg, Yg.ID = "editor.contrib.suggestController", Yg); -Fr = iV = G1e([ - yp(1, jI), - yp(2, Qt), - yp(3, _e), - yp(4, Se), - yp(5, Xn), - yp(6, Ls) -], Fr); -class E1e { +}, V9 = Pm, Pm.ID = "editor.contrib.suggestController", Pm); +Al = V9 = CGe([ + Vp(1, uC), + Vp(2, Ot), + Vp(3, xe), + Vp(4, Ge), + Vp(5, Fn), + Vp(6, Ls) +], Al); +class NGe { constructor(e) { this.prioritySelector = e, this._items = new Array(); } @@ -82846,15 +82846,15 @@ class E1e { return this._items; } } -const FZ = class FZ extends he { +const tS = class tS extends he { constructor() { super({ - id: FZ.id, + id: tS.id, label: p("suggest.trigger.label", "Trigger Suggest"), alias: "Trigger Suggest", - precondition: H.and(I.writable, I.hasCompletionItemProvider, ze.Visible.toNegated()), + precondition: P.and(C.writable, C.hasCompletionItemProvider, ze.Visible.toNegated()), kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 2058, secondary: [ 2087 @@ -82871,66 +82871,66 @@ const FZ = class FZ extends he { }); } run(e, t, i) { - const n = Fr.get(t); + const n = Al.get(t); if (!n) return; let o; i && typeof i == "object" && i.auto === !0 && (o = !0), n.triggerSuggest(void 0, o, void 0); } }; -FZ.id = "editor.action.triggerSuggest"; -let oM = FZ; -gt( - Fr.ID, - Fr, +tS.id = "editor.action.triggerSuggest"; +let WI = tS; +mt( + Al.ID, + Al, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */ ); -ee(oM); -const Jo = 190, xs = zi.bindToContribution(Fr.get); -oe(new xs({ +ee(WI); +const Qo = 190, Ss = Ai.bindToContribution(Al.get); +oe(new Ss({ id: "acceptSelectedSuggestion", - precondition: H.and(ze.Visible, ze.HasFocusedSuggestion), + precondition: P.and(ze.Visible, ze.HasFocusedSuggestion), handler(s) { s.acceptSelectedSuggestion(!0, !1); }, kbOpts: [{ // normal tab primary: 2, - kbExpr: H.and(ze.Visible, I.textInputFocus), - weight: Jo + kbExpr: P.and(ze.Visible, C.textInputFocus), + weight: Qo }, { // accept on enter has special rules primary: 3, - kbExpr: H.and(ze.Visible, I.textInputFocus, ze.AcceptSuggestionsOnEnter, ze.MakesTextEdit), - weight: Jo + kbExpr: P.and(ze.Visible, C.textInputFocus, ze.AcceptSuggestionsOnEnter, ze.MakesTextEdit), + weight: Qo }], menuOpts: [{ - menuId: rh, + menuId: ah, title: p("accept.insert", "Insert"), group: "left", order: 1, when: ze.HasInsertAndReplaceRange.toNegated() }, { - menuId: rh, + menuId: ah, title: p("accept.insert", "Insert"), group: "left", order: 1, - when: H.and(ze.HasInsertAndReplaceRange, ze.InsertMode.isEqualTo("insert")) + when: P.and(ze.HasInsertAndReplaceRange, ze.InsertMode.isEqualTo("insert")) }, { - menuId: rh, + menuId: ah, title: p("accept.replace", "Replace"), group: "left", order: 1, - when: H.and(ze.HasInsertAndReplaceRange, ze.InsertMode.isEqualTo("replace")) + when: P.and(ze.HasInsertAndReplaceRange, ze.InsertMode.isEqualTo("replace")) }] })); -oe(new xs({ +oe(new Ss({ id: "acceptAlternativeSelectedSuggestion", - precondition: H.and(ze.Visible, I.textInputFocus, ze.HasFocusedSuggestion), + precondition: P.and(ze.Visible, C.textInputFocus, ze.HasFocusedSuggestion), kbOpts: { - weight: Jo, - kbExpr: I.textInputFocus, + weight: Qo, + kbExpr: C.textInputFocus, primary: 1027, secondary: [ 1026 @@ -82941,27 +82941,27 @@ oe(new xs({ s.acceptSelectedSuggestion(!1, !0); }, menuOpts: [{ - menuId: rh, + menuId: ah, group: "left", order: 2, - when: H.and(ze.HasInsertAndReplaceRange, ze.InsertMode.isEqualTo("insert")), + when: P.and(ze.HasInsertAndReplaceRange, ze.InsertMode.isEqualTo("insert")), title: p("accept.replace", "Replace") }, { - menuId: rh, + menuId: ah, group: "left", order: 2, - when: H.and(ze.HasInsertAndReplaceRange, ze.InsertMode.isEqualTo("replace")), + when: P.and(ze.HasInsertAndReplaceRange, ze.InsertMode.isEqualTo("replace")), title: p("accept.insert", "Insert") }] })); st.registerCommandAlias("acceptSelectedSuggestionOnEnter", "acceptSelectedSuggestion"); -oe(new xs({ +oe(new Ss({ id: "hideSuggestWidget", precondition: ze.Visible, handler: (s) => s.cancelSuggestWidget(), kbOpts: { - weight: Jo, - kbExpr: I.textInputFocus, + weight: Qo, + kbExpr: C.textInputFocus, primary: 9, secondary: [ 1033 @@ -82969,13 +82969,13 @@ oe(new xs({ ] } })); -oe(new xs({ +oe(new Ss({ id: "selectNextSuggestion", - precondition: H.and(ze.Visible, H.or(ze.MultipleSuggestions, ze.HasFocusedSuggestion.negate())), + precondition: P.and(ze.Visible, P.or(ze.MultipleSuggestions, ze.HasFocusedSuggestion.negate())), handler: (s) => s.selectNextSuggestion(), kbOpts: { - weight: Jo, - kbExpr: I.textInputFocus, + weight: Qo, + kbExpr: C.textInputFocus, primary: 18, secondary: [ 2066 @@ -82988,13 +82988,13 @@ oe(new xs({ ] } } })); -oe(new xs({ +oe(new Ss({ id: "selectNextPageSuggestion", - precondition: H.and(ze.Visible, H.or(ze.MultipleSuggestions, ze.HasFocusedSuggestion.negate())), + precondition: P.and(ze.Visible, P.or(ze.MultipleSuggestions, ze.HasFocusedSuggestion.negate())), handler: (s) => s.selectNextPageSuggestion(), kbOpts: { - weight: Jo, - kbExpr: I.textInputFocus, + weight: Qo, + kbExpr: C.textInputFocus, primary: 12, secondary: [ 2060 @@ -83002,18 +83002,18 @@ oe(new xs({ ] } })); -oe(new xs({ +oe(new Ss({ id: "selectLastSuggestion", - precondition: H.and(ze.Visible, H.or(ze.MultipleSuggestions, ze.HasFocusedSuggestion.negate())), + precondition: P.and(ze.Visible, P.or(ze.MultipleSuggestions, ze.HasFocusedSuggestion.negate())), handler: (s) => s.selectLastSuggestion() })); -oe(new xs({ +oe(new Ss({ id: "selectPrevSuggestion", - precondition: H.and(ze.Visible, H.or(ze.MultipleSuggestions, ze.HasFocusedSuggestion.negate())), + precondition: P.and(ze.Visible, P.or(ze.MultipleSuggestions, ze.HasFocusedSuggestion.negate())), handler: (s) => s.selectPrevSuggestion(), kbOpts: { - weight: Jo, - kbExpr: I.textInputFocus, + weight: Qo, + kbExpr: C.textInputFocus, primary: 16, secondary: [ 2064 @@ -83026,13 +83026,13 @@ oe(new xs({ ] } } })); -oe(new xs({ +oe(new Ss({ id: "selectPrevPageSuggestion", - precondition: H.and(ze.Visible, H.or(ze.MultipleSuggestions, ze.HasFocusedSuggestion.negate())), + precondition: P.and(ze.Visible, P.or(ze.MultipleSuggestions, ze.HasFocusedSuggestion.negate())), handler: (s) => s.selectPrevPageSuggestion(), kbOpts: { - weight: Jo, - kbExpr: I.textInputFocus, + weight: Qo, + kbExpr: C.textInputFocus, primary: 11, secondary: [ 2059 @@ -83040,18 +83040,18 @@ oe(new xs({ ] } })); -oe(new xs({ +oe(new Ss({ id: "selectFirstSuggestion", - precondition: H.and(ze.Visible, H.or(ze.MultipleSuggestions, ze.HasFocusedSuggestion.negate())), + precondition: P.and(ze.Visible, P.or(ze.MultipleSuggestions, ze.HasFocusedSuggestion.negate())), handler: (s) => s.selectFirstSuggestion() })); -oe(new xs({ +oe(new Ss({ id: "focusSuggestion", - precondition: H.and(ze.Visible, ze.HasFocusedSuggestion.negate()), + precondition: P.and(ze.Visible, ze.HasFocusedSuggestion.negate()), handler: (s) => s.focusSuggestion(), kbOpts: { - weight: Jo, - kbExpr: I.textInputFocus, + weight: Qo, + kbExpr: C.textInputFocus, primary: 2058, secondary: [ 2087 @@ -83063,20 +83063,20 @@ oe(new xs({ ] } } })); -oe(new xs({ +oe(new Ss({ id: "focusAndAcceptSuggestion", - precondition: H.and(ze.Visible, ze.HasFocusedSuggestion.negate()), + precondition: P.and(ze.Visible, ze.HasFocusedSuggestion.negate()), handler: (s) => { s.focusSuggestion(), s.acceptSelectedSuggestion(!0, !1); } })); -oe(new xs({ +oe(new Ss({ id: "toggleSuggestionDetails", - precondition: H.and(ze.Visible, ze.HasFocusedSuggestion), + precondition: P.and(ze.Visible, ze.HasFocusedSuggestion), handler: (s) => s.toggleSuggestionDetails(), kbOpts: { - weight: Jo, - kbExpr: I.textInputFocus, + weight: Qo, + kbExpr: C.textInputFocus, primary: 2058, secondary: [ 2087 @@ -83088,20 +83088,20 @@ oe(new xs({ ] } }, menuOpts: [{ - menuId: rh, + menuId: ah, group: "right", order: 1, - when: H.and(ze.DetailsVisible, ze.CanResolve), + when: P.and(ze.DetailsVisible, ze.CanResolve), title: p("detail.more", "Show Less") }, { - menuId: rh, + menuId: ah, group: "right", order: 1, - when: H.and(ze.DetailsVisible.toNegated(), ze.CanResolve), + when: P.and(ze.DetailsVisible.toNegated(), ze.CanResolve), title: p("detail.less", "Show More") }] })); -oe(new xs({ +oe(new Ss({ id: "toggleExplainMode", precondition: ze.Visible, handler: (s) => s.toggleExplainMode(), @@ -83110,13 +83110,13 @@ oe(new xs({ primary: 2138 } })); -oe(new xs({ +oe(new Ss({ id: "toggleSuggestionFocus", precondition: ze.Visible, handler: (s) => s.toggleSuggestionFocus(), kbOpts: { - weight: Jo, - kbExpr: I.textInputFocus, + weight: Qo, + kbExpr: C.textInputFocus, primary: 2570, mac: { primary: 778 @@ -83124,36 +83124,36 @@ oe(new xs({ } } })); -oe(new xs({ +oe(new Ss({ id: "insertBestCompletion", - precondition: H.and(I.textInputFocus, H.equals("config.editor.tabCompletion", "on"), tM.AtEnd, ze.Visible.toNegated(), Gb.OtherSuggestions.toNegated(), Cs.InSnippetMode.toNegated()), + precondition: P.and(C.textInputFocus, P.equals("config.editor.tabCompletion", "on"), gI.AtEnd, ze.Visible.toNegated(), zZ.OtherSuggestions.toNegated(), Xs.InSnippetMode.toNegated()), handler: (s, e) => { - s.triggerSuggestAndAcceptBest(tn(e) ? { fallback: "tab", ...e } : { fallback: "tab" }); + s.triggerSuggestAndAcceptBest(nn(e) ? { fallback: "tab", ...e } : { fallback: "tab" }); }, kbOpts: { - weight: Jo, + weight: Qo, primary: 2 /* KeyCode.Tab */ } })); -oe(new xs({ +oe(new Ss({ id: "insertNextSuggestion", - precondition: H.and(I.textInputFocus, H.equals("config.editor.tabCompletion", "on"), Gb.OtherSuggestions, ze.Visible.toNegated(), Cs.InSnippetMode.toNegated()), + precondition: P.and(C.textInputFocus, P.equals("config.editor.tabCompletion", "on"), zZ.OtherSuggestions, ze.Visible.toNegated(), Xs.InSnippetMode.toNegated()), handler: (s) => s.acceptNextSuggestion(), kbOpts: { - weight: Jo, - kbExpr: I.textInputFocus, + weight: Qo, + kbExpr: C.textInputFocus, primary: 2 /* KeyCode.Tab */ } })); -oe(new xs({ +oe(new Ss({ id: "insertPrevSuggestion", - precondition: H.and(I.textInputFocus, H.equals("config.editor.tabCompletion", "on"), Gb.OtherSuggestions, ze.Visible.toNegated(), Cs.InSnippetMode.toNegated()), + precondition: P.and(C.textInputFocus, P.equals("config.editor.tabCompletion", "on"), zZ.OtherSuggestions, ze.Visible.toNegated(), Xs.InSnippetMode.toNegated()), handler: (s) => s.acceptPrevSuggestion(), kbOpts: { - weight: Jo, - kbExpr: I.textInputFocus, + weight: Qo, + kbExpr: C.textInputFocus, primary: 1026 /* KeyCode.Tab */ } @@ -83169,10 +83169,10 @@ ee(class extends he { } run(s, e) { var t; - (t = Fr.get(e)) == null || t.resetWidgetSize(); + (t = Al.get(e)) == null || t.resetWidgetSize(); } }); -class X1e extends R { +class wGe extends J { get selectedItem() { return this._currentSuggestItemInfo; } @@ -83182,26 +83182,26 @@ class X1e extends R { })), this._register(e.onKeyUp((o) => { o.shiftKey && this.isShiftKeyPressed && (this.isShiftKeyPressed = !1, this.update(this._isActive)); })); - const n = Fr.get(this.editor); + const n = Al.get(this.editor); if (n) { this._register(n.registerSelector({ priority: 100, - select: (l, a, c) => { - const d = this.editor.getModel(); - if (!d) + select: (r, c, d) => { + const a = this.editor.getModel(); + if (!a) return -1; - const h = this.suggestControllerPreselector(), u = h ? mg(h, d) : void 0; + const h = this.suggestControllerPreselector(), u = h ? ym(h, a) : void 0; if (!u) return -1; - const g = V.lift(a), m = c.map((b, y) => { - const w = jy.fromSuggestion(n, d, g, b, this.isShiftKeyPressed), C = mg(w.toSingleTextEdit(), d), S = Rj(u, C); - return { index: y, valid: S, prefixLength: C.text.length, suggestItem: b }; - }).filter((b) => b && b.valid && b.prefixLength > 0), f = jE(m, gs((b) => b.prefixLength, zr)); - return f ? f.index : -1; + const m = Y.lift(c), b = d.map((Z, f) => { + const y = cy.fromSuggestion(n, a, m, Z, this.isShiftKeyPressed), W = ym(y.toSingleTextEdit(), a), G = y7(u, W); + return { index: f, valid: G, prefixLength: W.text.length, suggestItem: Z }; + }).filter((Z) => Z && Z.valid && Z.prefixLength > 0), g = XJ(b, ps((Z) => Z.prefixLength, Ul)); + return g ? g.index : -1; } })); let o = !1; - const r = () => { + const l = () => { o || (o = !0, this._register(n.widget.value.onDidShow(() => { this.isSuggestWidgetVisible = !0, this.update(!0); })), this._register(n.widget.value.onDidHide(() => { @@ -83210,48 +83210,48 @@ class X1e extends R { this.isSuggestWidgetVisible = !0, this.update(!0); }))); }; - this._register(se.once(n.model.onDidTrigger)((l) => { - r(); - })), this._register(n.onWillInsertSuggestItem((l) => { - const a = this.editor.getPosition(), c = this.editor.getModel(); - if (!a || !c) + this._register(se.once(n.model.onDidTrigger)((r) => { + l(); + })), this._register(n.onWillInsertSuggestItem((r) => { + const c = this.editor.getPosition(), d = this.editor.getModel(); + if (!c || !d) return; - const d = jy.fromSuggestion(n, c, a, l.item, this.isShiftKeyPressed); - this.onWillAccept(d); + const a = cy.fromSuggestion(n, d, c, r.item, this.isShiftKeyPressed); + this.onWillAccept(a); })); } this.update(this._isActive); } update(e) { const t = this.getSuggestItemInfo(); - (this._isActive !== e || !F1e(this._currentSuggestItemInfo, t)) && (this._isActive = e, this._currentSuggestItemInfo = t, this._onDidSelectedItemChange.fire()); + (this._isActive !== e || !TGe(this._currentSuggestItemInfo, t)) && (this._isActive = e, this._currentSuggestItemInfo = t, this._onDidSelectedItemChange.fire()); } getSuggestItemInfo() { - const e = Fr.get(this.editor); + const e = Al.get(this.editor); if (!e || !this.isSuggestWidgetVisible) return; const t = e.widget.value.getFocusedItem(), i = this.editor.getPosition(), n = this.editor.getModel(); if (!(!t || !i || !n)) - return jy.fromSuggestion(e, n, i, t.item, this.isShiftKeyPressed); + return cy.fromSuggestion(e, n, i, t.item, this.isShiftKeyPressed); } stopForceRenderingAbove() { - const e = Fr.get(this.editor); + const e = Al.get(this.editor); e == null || e.stopForceRenderingAbove(); } forceRenderingAbove() { - const e = Fr.get(this.editor); + const e = Al.get(this.editor); e == null || e.forceRenderingAbove(); } } -class jy { +class cy { static fromSuggestion(e, t, i, n, o) { - let { insertText: r } = n.completion, l = !1; + let { insertText: l } = n.completion, r = !1; if (n.completion.insertTextRules & 4) { - const c = new Lm().parse(r); - c.children.length < 100 && eM.adjustWhitespace(t, i, !0, c), r = c.toString(), l = !0; + const d = new xb().parse(l); + d.children.length < 100 && pI.adjustWhitespace(t, i, !0, d), l = d.toString(), r = !0; } - const a = e.getOverwriteInfo(n, o); - return new jy(M.fromPositions(i.delta(0, -a.overwriteBefore), i.delta(0, Math.max(a.overwriteAfter, 0))), r, n.completion.kind, l); + const c = e.getOverwriteInfo(n, o); + return new cy(I.fromPositions(i.delta(0, -c.overwriteBefore), i.delta(0, Math.max(c.overwriteAfter, 0))), l, n.completion.kind, r); } constructor(e, t, i, n) { this.range = e, this.insertText = t, this.completionItemKind = i, this.isSnippetText = n; @@ -83260,121 +83260,121 @@ class jy { return this.range.equalsRange(e.range) && this.insertText === e.insertText && this.completionItemKind === e.completionItemKind && this.isSnippetText === e.isSnippetText; } toSelectedSuggestionInfo() { - return new DU(this.range, this.insertText, this.completionItemKind, this.isSnippetText); + return new pQ(this.range, this.insertText, this.completionItemKind, this.isSnippetText); } toSingleTextEdit() { - return new ka(this.range, this.insertText); + return new Ec(this.range, this.insertText); } } -function F1e(s, e) { +function TGe(s, e) { return s === e ? !0 : !s || !e ? !1 : s.equals(e); } -var Y1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var MGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, ec = function(s, e) { +}, sd = function(s, e) { return function(t, i) { e(t, i, s); }; -}, nV, zg; -let Sr = (zg = class extends R { +}, L9, Bm; +let Ll = (Bm = class extends J { static get(e) { - return e.getContribution(nV.ID); + return e.getContribution(L9.ID); } - constructor(e, t, i, n, o, r, l, a, c, d) { - super(), this.editor = e, this._instantiationService = t, this._contextKeyService = i, this._configurationService = n, this._commandService = o, this._debounceService = r, this._languageFeaturesService = l, this._accessibilitySignalService = a, this._keybindingService = c, this._accessibilityService = d, this._editorObs = oo(this.editor), this._positions = ye(this, (u) => { - var g; - return ((g = this._editorObs.selections.read(u)) == null ? void 0 : g.map((m) => m.getEndPosition())) ?? [new V(1, 1)]; - }), this._suggestWidgetAdaptor = this._register(new X1e(this.editor, () => { - var u, g; - return this._editorObs.forceUpdate(), (g = (u = this.model.get()) == null ? void 0 : u.selectedInlineCompletion.get()) == null ? void 0 : g.toSingleTextEdit(void 0); - }, (u) => this._editorObs.forceUpdate((g) => { + constructor(e, t, i, n, o, l, r, c, d, a) { + super(), this.editor = e, this._instantiationService = t, this._contextKeyService = i, this._configurationService = n, this._commandService = o, this._debounceService = l, this._languageFeaturesService = r, this._accessibilitySignalService = c, this._keybindingService = d, this._accessibilityService = a, this._editorObs = ro(this.editor), this._positions = fe(this, (u) => { var m; - (m = this.model.get()) == null || m.handleSuggestAccepted(u); - }))), this._suggestWidgetSelectedItem = St(this, (u) => this._suggestWidgetAdaptor.onDidSelectedItemChange(() => { - this._editorObs.forceUpdate((g) => u(void 0)); - }), () => this._suggestWidgetAdaptor.selectedItem), this._enabledInConfig = St(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption( + return ((m = this._editorObs.selections.read(u)) == null ? void 0 : m.map((b) => b.getEndPosition())) ?? [new Y(1, 1)]; + }), this._suggestWidgetAdaptor = this._register(new wGe(this.editor, () => { + var u, m; + return this._editorObs.forceUpdate(), (m = (u = this.model.get()) == null ? void 0 : u.selectedInlineCompletion.get()) == null ? void 0 : m.toSingleTextEdit(void 0); + }, (u) => this._editorObs.forceUpdate((m) => { + var b; + (b = this.model.get()) == null || b.handleSuggestAccepted(u); + }))), this._suggestWidgetSelectedItem = Gt(this, (u) => this._suggestWidgetAdaptor.onDidSelectedItemChange(() => { + this._editorObs.forceUpdate((m) => u(void 0)); + }), () => this._suggestWidgetAdaptor.selectedItem), this._enabledInConfig = Gt(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption( 62 /* EditorOption.inlineSuggest */ - ).enabled), this._isScreenReaderEnabled = St(this, this._accessibilityService.onDidChangeScreenReaderOptimized, () => this._accessibilityService.isScreenReaderOptimized()), this._editorDictationInProgress = St(this, this._contextKeyService.onDidChangeContext, () => this._contextKeyService.getContext(this.editor.getDomNode()).getValue("editorDictation.inProgress") === !0), this._enabled = ye(this, (u) => this._enabledInConfig.read(u) && (!this._isScreenReaderEnabled.read(u) || !this._editorDictationInProgress.read(u))), this._debounceValue = this._debounceService.for(this._languageFeaturesService.inlineCompletionsProvider, "InlineCompletionsDebounce", { min: 50, max: 50 }), this.model = Un(this, (u) => { + ).enabled), this._isScreenReaderEnabled = Gt(this, this._accessibilityService.onDidChangeScreenReaderOptimized, () => this._accessibilityService.isScreenReaderOptimized()), this._editorDictationInProgress = Gt(this, this._contextKeyService.onDidChangeContext, () => this._contextKeyService.getContext(this.editor.getDomNode()).getValue("editorDictation.inProgress") === !0), this._enabled = fe(this, (u) => this._enabledInConfig.read(u) && (!this._isScreenReaderEnabled.read(u) || !this._editorDictationInProgress.read(u))), this._debounceValue = this._debounceService.for(this._languageFeaturesService.inlineCompletionsProvider, "InlineCompletionsDebounce", { min: 50, max: 50 }), this.model = On(this, (u) => { if (this._editorObs.isReadonly.read(u)) return; - const g = this._editorObs.model.read(u); - return g ? this._instantiationService.createInstance(JD, g, this._suggestWidgetSelectedItem, this._editorObs.versionId, this._positions, this._debounceValue, St(this.editor.onDidChangeConfiguration, () => this.editor.getOption( + const m = this._editorObs.model.read(u); + return m ? this._instantiationService.createInstance(b9, m, this._suggestWidgetSelectedItem, this._editorObs.versionId, this._positions, this._debounceValue, Gt(this.editor.onDidChangeConfiguration, () => this.editor.getOption( 119 /* EditorOption.suggest */ - ).preview), St(this.editor.onDidChangeConfiguration, () => this.editor.getOption( + ).preview), Gt(this.editor.onDidChangeConfiguration, () => this.editor.getOption( 119 /* EditorOption.suggest */ - ).previewMode), St(this.editor.onDidChangeConfiguration, () => this.editor.getOption( + ).previewMode), Gt(this.editor.onDidChangeConfiguration, () => this.editor.getOption( 62 /* EditorOption.inlineSuggest */ ).mode), this._enabled) : void 0; - }).recomputeInitiallyAndOnChange(this._store), this._ghostTexts = ye(this, (u) => { - const g = this.model.read(u); - return (g == null ? void 0 : g.ghostTexts.read(u)) ?? []; - }), this._stablizedGhostTexts = z1e(this._ghostTexts, this._store), this._ghostTextWidgets = xde(this, this._stablizedGhostTexts, (u, g) => g.add(this._instantiationService.createInstance(BD, this.editor, { + }).recomputeInitiallyAndOnChange(this._store), this._ghostTexts = fe(this, (u) => { + const m = this.model.read(u); + return (m == null ? void 0 : m.ghostTexts.read(u)) ?? []; + }), this._stablizedGhostTexts = YGe(this._ghostTexts, this._store), this._ghostTextWidgets = ghe(this, this._stablizedGhostTexts, (u, m) => m.add(this._instantiationService.createInstance(h9, this.editor, { ghostText: u, - minReservedLineCount: dr(0), - targetTextModel: this.model.map((m) => m == null ? void 0 : m.textModel) - }))).recomputeInitiallyAndOnChange(this._store), this._playAccessibilitySignal = d0(this), this._fontFamily = St(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption( + minReservedLineCount: ul(0), + targetTextModel: this.model.map((b) => b == null ? void 0 : b.textModel) + }))).recomputeInitiallyAndOnChange(this._store), this._playAccessibilitySignal = g0(this), this._fontFamily = Gt(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption( 62 /* EditorOption.inlineSuggest */ - ).fontFamily), this._register(new go(this._contextKeyService, this.model)), this._register(AT(this._editorObs.onDidType, (u, g) => { - var m; - this._enabled.get() && ((m = this.model.get()) == null || m.trigger()); + ).fontFamily), this._register(new po(this._contextKeyService, this.model)), this._register(KT(this._editorObs.onDidType, (u, m) => { + var b; + this._enabled.get() && ((b = this.model.get()) == null || b.trigger()); })), this._register(this._commandService.onDidExecuteCommand((u) => { (/* @__PURE__ */ new Set([ - xf.Tab.id, - xf.DeleteLeft.id, - xf.DeleteRight.id, - pQ, + Ng.Tab.id, + Ng.DeleteLeft.id, + Ng.DeleteRight.id, + jj, "acceptSelectedSuggestion" - ])).has(u.commandId) && e.hasTextFocus() && this._enabled.get() && this._editorObs.forceUpdate((m) => { - var f; - (f = this.model.get()) == null || f.trigger(m); + ])).has(u.commandId) && e.hasTextFocus() && this._enabled.get() && this._editorObs.forceUpdate((b) => { + var g; + (g = this.model.get()) == null || g.trigger(b); }); - })), this._register(AT(this._editorObs.selections, (u, g) => { - var m; - g.some((f) => f.reason === 3 || f.source === "api") && ((m = this.model.get()) == null || m.stop()); + })), this._register(KT(this._editorObs.selections, (u, m) => { + var b; + m.some((g) => g.reason === 3 || g.source === "api") && ((b = this.model.get()) == null || b.stop()); })), this._register(this.editor.onDidBlurEditorWidget(() => { this._contextKeyService.getContextKeyValue("accessibleViewIsShown") || this._configurationService.getValue("editor.inlineSuggest.keepOnBlur") || e.getOption( 62 /* EditorOption.inlineSuggest */ - ).keepOnBlur || _b.dropDownVisible || oi((u) => { - var g; - (g = this.model.get()) == null || g.stop(u); + ).keepOnBlur || MZ.dropDownVisible || li((u) => { + var m; + (m = this.model.get()) == null || m.stop(u); }); })), this._register(Te((u) => { - var m; - const g = (m = this.model.read(u)) == null ? void 0 : m.state.read(u); - g != null && g.suggestItem ? g.primaryGhostText.lineCount >= 2 && this._suggestWidgetAdaptor.forceRenderingAbove() : this._suggestWidgetAdaptor.stopForceRenderingAbove(); - })), this._register(Ce(() => { + var b; + const m = (b = this.model.read(u)) == null ? void 0 : b.state.read(u); + m != null && m.suggestItem ? m.primaryGhostText.lineCount >= 2 && this._suggestWidgetAdaptor.forceRenderingAbove() : this._suggestWidgetAdaptor.stopForceRenderingAbove(); + })), this._register(We(() => { this._suggestWidgetAdaptor.stopForceRenderingAbove(); })); - const h = _C(this, (u, g) => { - var b; - const m = this.model.read(u), f = m == null ? void 0 : m.state.read(u); - return this._suggestWidgetSelectedItem.get() ? g : (b = f == null ? void 0 : f.inlineCompletion) == null ? void 0 : b.semanticId; + const h = DG(this, (u, m) => { + var Z; + const b = this.model.read(u), g = b == null ? void 0 : b.state.read(u); + return this._suggestWidgetSelectedItem.get() ? m : (Z = g == null ? void 0 : g.inlineCompletion) == null ? void 0 : Z.semanticId; }); - this._register(Bge(ye((u) => (this._playAccessibilitySignal.read(u), h.read(u), {})), async (u, g, m) => { - const f = this.model.get(), b = f == null ? void 0 : f.state.get(); - if (!b || !f) + this._register(vbe(fe((u) => (this._playAccessibilitySignal.read(u), h.read(u), {})), async (u, m, b) => { + const g = this.model.get(), Z = g == null ? void 0 : g.state.get(); + if (!Z || !g) return; - const y = f.textModel.getLineContent(b.primaryGhostText.lineNumber); - await Zh(50, w2(m)), await _K(this._suggestWidgetSelectedItem, jn, () => !1, w2(m)), await this._accessibilitySignalService.playSignal(vo.inlineSuggestion), this.editor.getOption( + const f = g.textModel.getLineContent(Z.primaryGhostText.lineNumber); + await Nh(50, DN(b)), await dO(this._suggestWidgetSelectedItem, $n, () => !1, DN(b)), await this._accessibilitySignalService.playSignal(Mo.inlineSuggestion), this.editor.getOption( 8 /* EditorOption.screenReaderAnnounceInlineSuggestion */ - ) && this._provideScreenReaderUpdate(b.primaryGhostText.renderForScreenReader(y)); - })), this._register(new tD(this.editor, this.model, this._instantiationService)), this._register(vwe(ye((u) => { - const g = this._fontFamily.read(u); - return g === "" || g === "default" ? "" : ` + ) && this._provideScreenReaderUpdate(Z.primaryGhostText.renderForScreenReader(f)); + })), this._register(new XM(this.editor, this.model, this._instantiationService)), this._register(VWe(fe((u) => { + const m = this._fontFamily.read(u); + return m === "" || m === "default" ? "" : ` .monaco-editor .ghost-text-decoration, .monaco-editor .ghost-text-decoration-preview, .monaco-editor .ghost-text { - font-family: ${g}; + font-family: ${m}; }`; }))), this._register(this._configurationService.onDidChangeConfiguration((u) => { u.affectsConfiguration("accessibility.verbosity.inlineCompletions") && this.editor.updateOptions({ inlineCompletionsAccessibilityVerbose: this._configurationService.getValue("accessibility.verbosity.inlineCompletions") }); @@ -83389,51 +83389,51 @@ let Sr = (zg = class extends R { !t && i && this.editor.getOption( 150 /* EditorOption.inlineCompletionsAccessibilityVerbose */ - ) && (n = p("showAccessibleViewHint", "Inspect this in the accessible view ({0})", i.getAriaLabel())), bs(n ? e + ", " + n : e); + ) && (n = p("showAccessibleViewHint", "Inspect this in the accessible view ({0})", i.getAriaLabel())), ys(n ? e + ", " + n : e); } shouldShowHoverAt(e) { var i; const t = (i = this.model.get()) == null ? void 0 : i.primaryGhostText.get(); - return t ? t.parts.some((n) => e.containsPosition(new V(t.lineNumber, n.column))) : !1; + return t ? t.parts.some((n) => e.containsPosition(new Y(t.lineNumber, n.column))) : !1; } shouldShowHoverAtViewZone(e) { var t; return ((t = this._ghostTextWidgets.get()[0]) == null ? void 0 : t.ownsViewZone(e)) ?? !1; } -}, nV = zg, zg.ID = "editor.contrib.inlineCompletionsController", zg); -Sr = nV = Y1e([ - ec(1, Se), - ec(2, _e), - ec(3, Ke), - ec(4, Qt), - ec(5, jo), - ec(6, ge), - ec(7, jh), - ec(8, xt), - ec(9, yo) -], Sr); -function z1e(s, e) { - const t = Oe("result", []), i = []; +}, L9 = Bm, Bm.ID = "editor.contrib.inlineCompletionsController", Bm); +Ll = L9 = MGe([ + sd(1, Ge), + sd(2, xe), + sd(3, Qe), + sd(4, Ot), + sd(5, $o), + sd(6, me), + sd(7, tu), + sd(8, Lt), + sd(9, Wo) +], Ll); +function YGe(s, e) { + const t = Ue("result", []), i = []; return e.add(Te((n) => { const o = s.read(n); - oi((r) => { + li((l) => { if (o.length !== i.length) { i.length = o.length; - for (let l = 0; l < i.length; l++) - i[l] || (i[l] = Oe("item", o[l])); - t.set([...i], r); + for (let r = 0; r < i.length; r++) + i[r] || (i[r] = Ue("item", o[r])); + t.set([...i], l); } - i.forEach((l, a) => l.set(o[a], r)); + i.forEach((r, c) => r.set(o[c], l)); }); })), t; } -const YZ = class YZ extends he { +const iS = class iS extends he { constructor() { super({ - id: YZ.ID, + id: iS.ID, label: p("action.inlineSuggest.showNext", "Show Next Inline Suggestion"), alias: "Show Next Inline Suggestion", - precondition: H.and(I.writable, go.inlineSuggestionVisible), + precondition: P.and(C.writable, po.inlineSuggestionVisible), kbOpts: { weight: 100, primary: 606 @@ -83442,19 +83442,19 @@ const YZ = class YZ extends he { } async run(e, t) { var n; - const i = Sr.get(t); + const i = Ll.get(t); (n = i == null ? void 0 : i.model.get()) == null || n.next(); } }; -YZ.ID = bQ; -let sV = YZ; -const zZ = class zZ extends he { +iS.ID = $j; +let I9 = iS; +const nS = class nS extends he { constructor() { super({ - id: zZ.ID, + id: nS.ID, label: p("action.inlineSuggest.showPrevious", "Show Previous Inline Suggestion"), alias: "Show Previous Inline Suggestion", - precondition: H.and(I.writable, go.inlineSuggestionVisible), + precondition: P.and(C.writable, po.inlineSuggestionVisible), kbOpts: { weight: 100, primary: 604 @@ -83463,40 +83463,40 @@ const zZ = class zZ extends he { } async run(e, t) { var n; - const i = Sr.get(t); + const i = Ll.get(t); (n = i == null ? void 0 : i.model.get()) == null || n.previous(); } }; -zZ.ID = fQ; -let oV = zZ; -class P1e extends he { +nS.ID = qj; +let S9 = nS; +class kGe extends he { constructor() { super({ id: "editor.action.inlineSuggest.trigger", label: p("action.inlineSuggest.trigger", "Trigger Inline Suggestion"), alias: "Trigger Inline Suggestion", - precondition: I.writable + precondition: C.writable }); } async run(e, t) { - const i = Sr.get(t); - await xK(async (n) => { + const i = Ll.get(t); + await lO(async (n) => { var o; await ((o = i == null ? void 0 : i.model.get()) == null ? void 0 : o.triggerExplicitly(n)), i == null || i.playAccessibilitySignal(n); }); } } -class B1e extends he { +class vGe extends he { constructor() { super({ id: "editor.action.inlineSuggest.acceptNextWord", label: p("action.inlineSuggest.acceptNextWord", "Accept Next Word Of Inline Suggestion"), alias: "Accept Next Word Of Inline Suggestion", - precondition: H.and(I.writable, go.inlineSuggestionVisible), + precondition: P.and(C.writable, po.inlineSuggestionVisible), kbOpts: { weight: 101, primary: 2065, - kbExpr: H.and(I.writable, go.inlineSuggestionVisible) + kbExpr: P.and(C.writable, po.inlineSuggestionVisible) }, menuOpts: [{ menuId: pe.InlineSuggestionToolbar, @@ -83508,17 +83508,17 @@ class B1e extends he { } async run(e, t) { var n; - const i = Sr.get(t); + const i = Ll.get(t); await ((n = i == null ? void 0 : i.model.get()) == null ? void 0 : n.acceptNextWord(i.editor)); } } -class O1e extends he { +class JGe extends he { constructor() { super({ id: "editor.action.inlineSuggest.acceptNextLine", label: p("action.inlineSuggest.acceptNextLine", "Accept Next Line Of Inline Suggestion"), alias: "Accept Next Line Of Inline Suggestion", - precondition: H.and(I.writable, go.inlineSuggestionVisible), + precondition: P.and(C.writable, po.inlineSuggestionVisible), kbOpts: { weight: 101 }, @@ -83532,17 +83532,17 @@ class O1e extends he { } async run(e, t) { var n; - const i = Sr.get(t); + const i = Ll.get(t); await ((n = i == null ? void 0 : i.model.get()) == null ? void 0 : n.acceptNextLine(i.editor)); } } -class H1e extends he { +class HGe extends he { constructor() { super({ - id: pQ, + id: jj, label: p("action.inlineSuggest.accept", "Accept Inline Suggestion"), alias: "Accept Inline Suggestion", - precondition: go.inlineSuggestionVisible, + precondition: po.inlineSuggestionVisible, menuOpts: [{ menuId: pe.InlineSuggestionToolbar, title: p("accept", "Accept"), @@ -83552,23 +83552,23 @@ class H1e extends he { kbOpts: { primary: 2, weight: 200, - kbExpr: H.and(go.inlineSuggestionVisible, I.tabMovesFocus.toNegated(), go.inlineSuggestionHasIndentationLessThanTabSize, ze.Visible.toNegated(), I.hoverFocused.toNegated()) + kbExpr: P.and(po.inlineSuggestionVisible, C.tabMovesFocus.toNegated(), po.inlineSuggestionHasIndentationLessThanTabSize, ze.Visible.toNegated(), C.hoverFocused.toNegated()) } }); } async run(e, t) { var n; - const i = Sr.get(t); + const i = Ll.get(t); i && ((n = i.model.get()) == null || n.accept(i.editor), i.editor.focus()); } } -const PZ = class PZ extends he { +const sS = class sS extends he { constructor() { super({ - id: PZ.ID, + id: sS.ID, label: p("action.inlineSuggest.hide", "Hide Inline Suggestion"), alias: "Hide Inline Suggestion", - precondition: go.inlineSuggestionVisible, + precondition: po.inlineSuggestionVisible, kbOpts: { weight: 100, primary: 9 @@ -83576,19 +83576,19 @@ const PZ = class PZ extends he { }); } async run(e, t) { - const i = Sr.get(t); - oi((n) => { + const i = Ll.get(t); + li((n) => { var o; (o = i == null ? void 0 : i.model.get()) == null || o.stop(n); }); } }; -PZ.ID = "editor.action.inlineSuggest.hide"; -let rV = PZ; -const BZ = class BZ extends Ss { +sS.ID = "editor.action.inlineSuggest.hide"; +let x9 = sS; +const oS = class oS extends Vs { constructor() { super({ - id: BZ.ID, + id: oS.ID, title: p("action.inlineSuggest.alwaysShowToolbar", "Always Show Toolbar"), f1: !1, precondition: void 0, @@ -83597,27 +83597,27 @@ const BZ = class BZ extends Ss { group: "secondary", order: 10 }], - toggled: H.equals("config.editor.inlineSuggest.showToolbar", "always") + toggled: P.equals("config.editor.inlineSuggest.showToolbar", "always") }); } async run(e, t) { - const i = e.get(Ke), o = i.getValue("editor.inlineSuggest.showToolbar") === "always" ? "onHover" : "always"; + const i = e.get(Qe), o = i.getValue("editor.inlineSuggest.showToolbar") === "always" ? "onHover" : "always"; i.updateValue("editor.inlineSuggest.showToolbar", o); } }; -BZ.ID = "editor.action.inlineSuggest.toggleAlwaysShowToolbar"; -let lV = BZ; -var J1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +oS.ID = "editor.action.inlineSuggest.toggleAlwaysShowToolbar"; +let C9 = oS; +var EGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, J0 = function(s, e) { +}, ef = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class U1e { +class DGe { constructor(e, t, i) { this.owner = e, this.range = t, this.controller = i; } @@ -83625,21 +83625,21 @@ class U1e { return e.type === 1 && this.range.startColumn <= e.range.startColumn && this.range.endColumn >= e.range.endColumn; } } -let aV = class { - constructor(e, t, i, n, o, r) { - this._editor = e, this._languageService = t, this._openerService = i, this.accessibilityService = n, this._instantiationService = o, this._telemetryService = r, this.hoverOrdinal = 4; +let R9 = class { + constructor(e, t, i, n, o, l) { + this._editor = e, this._languageService = t, this._openerService = i, this.accessibilityService = n, this._instantiationService = o, this._telemetryService = l, this.hoverOrdinal = 4; } suggestHoverAnchor(e) { - const t = Sr.get(this._editor); + const t = Ll.get(this._editor); if (!t) return null; const i = e.target; if (i.type === 8) { const n = i.detail; if (t.shouldShowHoverAtViewZone(n.viewZoneId)) - return new WL(1e3, this, M.fromPositions(this._editor.getModel().validatePosition(n.positionBefore || n.position)), e.event.posx, e.event.posy, !1); + return new UX(1e3, this, I.fromPositions(this._editor.getModel().validatePosition(n.positionBefore || n.position)), e.event.posx, e.event.posy, !1); } - return i.type === 7 && t.shouldShowHoverAt(i.range) ? new WL(1e3, this, i.range, e.event.posx, e.event.posy, !1) : i.type === 6 && i.detail.mightBeForeignElement && t.shouldShowHoverAt(i.range) ? new WL(1e3, this, i.range, e.event.posx, e.event.posy, !1) : null; + return i.type === 7 && t.shouldShowHoverAt(i.range) ? new UX(1e3, this, i.range, e.event.posx, e.event.posy, !1) : i.type === 6 && i.detail.mightBeForeignElement && t.shouldShowHoverAt(i.range) ? new UX(1e3, this, i.range, e.event.posx, e.event.posy, !1) : null; } computeSync(e, t) { if (this._editor.getOption( @@ -83647,55 +83647,55 @@ let aV = class { /* EditorOption.inlineSuggest */ ).showToolbar !== "onHover") return []; - const i = Sr.get(this._editor); - return i && i.shouldShowHoverAt(e.range) ? [new U1e(this, e.range, i)] : []; + const i = Ll.get(this._editor); + return i && i.shouldShowHoverAt(e.range) ? [new DGe(this, e.range, i)] : []; } renderHoverParts(e, t) { - const i = new U(), n = t[0]; + const i = new _(), n = t[0]; this._telemetryService.publicLog2("inlineCompletionHover.shown"), this.accessibilityService.isScreenReaderOptimized() && !this._editor.getOption( 8 /* EditorOption.screenReaderAnnounceInlineSuggestion */ ) && i.add(this.renderScreenReaderText(e, n)); - const o = n.controller.model.get(), r = this._instantiationService.createInstance(_b, this._editor, !1, dr(null), o.selectedInlineCompletionIndex, o.inlineCompletionsCount, o.activeCommands), l = r.getDomNode(); - e.fragment.appendChild(l), o.triggerExplicitly(), i.add(r); - const a = { + const o = n.controller.model.get(), l = this._instantiationService.createInstance(MZ, this._editor, !1, ul(null), o.selectedInlineCompletionIndex, o.inlineCompletionsCount, o.activeCommands), r = l.getDomNode(); + e.fragment.appendChild(r), o.triggerExplicitly(), i.add(l); + const c = { hoverPart: n, - hoverElement: l, + hoverElement: r, dispose() { i.dispose(); } }; - return new Zm([a]); + return new wb([c]); } renderScreenReaderText(e, t) { - const i = new U(), n = ce, o = n("div.hover-row.markdown-hover"), r = Q(o, n("div.hover-contents", { "aria-live": "assertive" })), l = i.add(new Qc({ editor: this._editor }, this._languageService, this._openerService)), a = (c) => { - i.add(l.onDidRenderAsync(() => { - r.className = "hover-contents code-hover-contents", e.onContentsChanged(); + const i = new _(), n = de, o = n("div.hover-row.markdown-hover"), l = O(o, n("div.hover-contents", { "aria-live": "assertive" })), r = i.add(new ea({ editor: this._editor }, this._languageService, this._openerService)), c = (d) => { + i.add(r.onDidRenderAsync(() => { + l.className = "hover-contents code-hover-contents", e.onContentsChanged(); })); - const d = p("inlineSuggestionFollows", "Suggestion:"), h = i.add(l.render(new Vn().appendText(d).appendCodeblock("text", c))); - r.replaceChildren(h.element); + const a = p("inlineSuggestionFollows", "Suggestion:"), h = i.add(r.render(new kn().appendText(a).appendCodeblock("text", d))); + l.replaceChildren(h.element); }; - return i.add(Te((c) => { + return i.add(Te((d) => { var h; - const d = (h = t.controller.model.read(c)) == null ? void 0 : h.primaryGhostText.read(c); - if (d) { - const u = this._editor.getModel().getLineContent(d.lineNumber); - a(d.renderForScreenReader(u)); + const a = (h = t.controller.model.read(d)) == null ? void 0 : h.primaryGhostText.read(d); + if (a) { + const u = this._editor.getModel().getLineContent(a.lineNumber); + c(a.renderForScreenReader(u)); } else - In(r); + Rn(l); })), e.fragment.appendChild(o), i; } }; -aV = J1e([ - J0(1, ri), - J0(2, Bs), - J0(3, yo), - J0(4, Se), - J0(5, Ls) -], aV); -class K1e { -} -const qI = new class { +R9 = EGe([ + ef(1, ri), + ef(2, Ps), + ef(3, Wo), + ef(4, Ge), + ef(5, Ls) +], R9); +class FGe { +} +const mC = new class { constructor() { this._implementations = []; } @@ -83711,41 +83711,41 @@ const qI = new class { return this._implementations; } }(); -gt( - Sr.ID, - Sr, +mt( + Ll.ID, + Ll, 3 /* EditorContributionInstantiation.Eventually */ ); -ee(P1e); -ee(sV); -ee(oV); -ee(B1e); -ee(O1e); -ee(H1e); -ee(rV); -kt(lV); -Om.register(aV); -qI.register(new K1e()); -var Q1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +ee(kGe); +ee(I9); +ee(S9); +ee(vGe); +ee(JGe); +ee(HGe); +ee(x9); +kt(C9); +Ob.register(R9); +mC.register(new FGe()); +var zGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, BW = function(s, e) { +}, lN = function(s, e) { return function(t, i) { e(t, i, s); }; -}, by, yh; -let z1 = (yh = class { +}, xf, Xh; +let eG = (Xh = class { constructor(e, t, i, n) { - this.textModelResolverService = t, this.languageService = i, this.languageFeaturesService = n, this.toUnhook = new U(), this.toUnhookForKeyboard = new U(), this.currentWordAtPosition = null, this.previousPromise = null, this.editor = e, this.linkDecorations = this.editor.createDecorationsCollection(); - const o = new EI(e); - this.toUnhook.add(o), this.toUnhook.add(o.onMouseMoveOrRelevantKeyDown(([r, l]) => { - this.startFindDefinitionFromMouse(r, l ?? void 0); - })), this.toUnhook.add(o.onExecute((r) => { - this.isEnabled(r) && this.gotoDefinition(r.target.position, r.hasSideBySideModifier).catch((l) => { - De(l); + this.textModelResolverService = t, this.languageService = i, this.languageFeaturesService = n, this.toUnhook = new _(), this.toUnhookForKeyboard = new _(), this.currentWordAtPosition = null, this.previousPromise = null, this.editor = e, this.linkDecorations = this.editor.createDecorationsCollection(); + const o = new $x(e); + this.toUnhook.add(o), this.toUnhook.add(o.onMouseMoveOrRelevantKeyDown(([l, r]) => { + this.startFindDefinitionFromMouse(l, r ?? void 0); + })), this.toUnhook.add(o.onExecute((l) => { + this.isEnabled(l) && this.gotoDefinition(l.target.position, l.hasSideBySideModifier).catch((r) => { + Me(r); }).finally(() => { this.removeLinkDecorations(); }); @@ -83754,7 +83754,7 @@ let z1 = (yh = class { })); } static get(e) { - return e.getContribution(by.ID); + return e.getContribution(xf.ID); } async startFindDefinitionFromCursor(e) { await this.startFindDefinition(e), this.toUnhookForKeyboard.add(this.editor.onDidChangeCursorPosition(() => { @@ -83774,9 +83774,9 @@ let z1 = (yh = class { this.startFindDefinition(i); } async startFindDefinition(e) { - var r; + var l; this.toUnhookForKeyboard.clear(); - const t = e ? (r = this.editor.getModel()) == null ? void 0 : r.getWordAtPosition(e) : null; + const t = e ? (l = this.editor.getModel()) == null ? void 0 : l.getWordAtPosition(e) : null; if (!t) { this.currentWordAtPosition = null, this.removeLinkDecorations(); return; @@ -83784,69 +83784,69 @@ let z1 = (yh = class { if (this.currentWordAtPosition && this.currentWordAtPosition.startColumn === t.startColumn && this.currentWordAtPosition.endColumn === t.endColumn && this.currentWordAtPosition.word === t.word) return; this.currentWordAtPosition = t; - const i = new k4( + const i = new Zj( this.editor, 15 /* CodeEditorStateFlag.Scroll */ ); - this.previousPromise && (this.previousPromise.cancel(), this.previousPromise = null), this.previousPromise = Ui((l) => this.findDefinition(e, l)); + this.previousPromise && (this.previousPromise.cancel(), this.previousPromise = null), this.previousPromise = Qi((r) => this.findDefinition(e, r)); let n; try { n = await this.previousPromise; - } catch (l) { - De(l); + } catch (r) { + Me(r); return; } if (!n || !n.length || !i.validate(this.editor)) { this.removeLinkDecorations(); return; } - const o = n[0].originSelectionRange ? M.lift(n[0].originSelectionRange) : new M(e.lineNumber, t.startColumn, e.lineNumber, t.endColumn); + const o = n[0].originSelectionRange ? I.lift(n[0].originSelectionRange) : new I(e.lineNumber, t.startColumn, e.lineNumber, t.endColumn); if (n.length > 1) { - let l = o; - for (const { originSelectionRange: a } of n) - a && (l = M.plusRange(l, a)); - this.addDecoration(l, new Vn().appendText(p("multipleResults", "Click to show {0} definitions.", n.length))); + let r = o; + for (const { originSelectionRange: c } of n) + c && (r = I.plusRange(r, c)); + this.addDecoration(r, new kn().appendText(p("multipleResults", "Click to show {0} definitions.", n.length))); } else { - const l = n[0]; - if (!l.uri) + const r = n[0]; + if (!r.uri) return; - this.textModelResolverService.createModelReference(l.uri).then((a) => { - if (!a.object || !a.object.textEditorModel) { - a.dispose(); + this.textModelResolverService.createModelReference(r.uri).then((c) => { + if (!c.object || !c.object.textEditorModel) { + c.dispose(); return; } - const { object: { textEditorModel: c } } = a, { startLineNumber: d } = l.range; - if (d < 1 || d > c.getLineCount()) { - a.dispose(); + const { object: { textEditorModel: d } } = c, { startLineNumber: a } = r.range; + if (a < 1 || a > d.getLineCount()) { + c.dispose(); return; } - const h = this.getPreviewValue(c, d, l), u = this.languageService.guessLanguageIdByFilepathOrFirstLine(c.uri); - this.addDecoration(o, h ? new Vn().appendCodeblock(u || "", h) : void 0), a.dispose(); + const h = this.getPreviewValue(d, a, r), u = this.languageService.guessLanguageIdByFilepathOrFirstLine(d.uri); + this.addDecoration(o, h ? new kn().appendCodeblock(u || "", h) : void 0), c.dispose(); }); } } getPreviewValue(e, t, i) { let n = i.range; - return n.endLineNumber - n.startLineNumber >= by.MAX_SOURCE_PREVIEW_LINES && (n = this.getPreviewRangeBasedOnIndentation(e, t)), this.stripIndentationFromPreviewRange(e, t, n); + return n.endLineNumber - n.startLineNumber >= xf.MAX_SOURCE_PREVIEW_LINES && (n = this.getPreviewRangeBasedOnIndentation(e, t)), this.stripIndentationFromPreviewRange(e, t, n); } stripIndentationFromPreviewRange(e, t, i) { let o = e.getLineFirstNonWhitespaceColumn(t); - for (let l = t + 1; l < i.endLineNumber; l++) { - const a = e.getLineFirstNonWhitespaceColumn(l); - o = Math.min(o, a); + for (let r = t + 1; r < i.endLineNumber; r++) { + const c = e.getLineFirstNonWhitespaceColumn(r); + o = Math.min(o, c); } return e.getValueInRange(i).replace(new RegExp(`^\\s{${o - 1}}`, "gm"), "").trim(); } getPreviewRangeBasedOnIndentation(e, t) { - const i = e.getLineFirstNonWhitespaceColumn(t), n = Math.min(e.getLineCount(), t + by.MAX_SOURCE_PREVIEW_LINES); + const i = e.getLineFirstNonWhitespaceColumn(t), n = Math.min(e.getLineCount(), t + xf.MAX_SOURCE_PREVIEW_LINES); let o = t + 1; for (; o < n; o++) { - const r = e.getLineFirstNonWhitespaceColumn(o); - if (i === r) + const l = e.getLineFirstNonWhitespaceColumn(o); + if (i === l) break; } - return new M(t, 1, o + 1, 1); + return new I(t, 1, o + 1, 1); } addDecoration(e, t) { const i = { @@ -83864,11 +83864,11 @@ let z1 = (yh = class { } isEnabled(e, t) { var i; - return this.editor.hasModel() && e.isLeftClick && e.isNoneOrSingleMouseDown && e.target.type === 6 && !(((i = e.target.detail.injectedText) == null ? void 0 : i.options) instanceof Eh) && (e.hasTriggerModifier || (t ? t.keyCodeIsTriggerKey : !1)) && this.languageFeaturesService.definitionProvider.has(this.editor.getModel()); + return this.editor.hasModel() && e.isLeftClick && e.isNoneOrSingleMouseDown && e.target.type === 6 && !(((i = e.target.detail.injectedText) == null ? void 0 : i.options) instanceof zh) && (e.hasTriggerModifier || (t ? t.keyCodeIsTriggerKey : !1)) && this.languageFeaturesService.definitionProvider.has(this.editor.getModel()); } findDefinition(e, t) { const i = this.editor.getModel(); - return i ? XC(this.languageFeaturesService.definitionProvider, i, e, !1, t) : Promise.resolve(null); + return i ? qG(this.languageFeaturesService.definitionProvider, i, e, !1, t) : Promise.resolve(null); } gotoDefinition(e, t) { return this.editor.setPosition(e), this.editor.invokeWithinContext((i) => { @@ -83876,57 +83876,57 @@ let z1 = (yh = class { 89 /* EditorOption.definitionLinkOpensInPeek */ ) && !this.isInPeekEditor(i); - return new YC({ openToSide: t, openInPeek: n, muteMessage: !0 }, { title: { value: "", original: "" }, id: "", precondition: void 0 }).run(i); + return new e1({ openToSide: t, openInPeek: n, muteMessage: !0 }, { title: { value: "", original: "" }, id: "", precondition: void 0 }).run(i); }); } isInPeekEditor(e) { - const t = e.get(_e); - return Xs.inPeekEditor.getValue(t); + const t = e.get(xe); + return Fs.inPeekEditor.getValue(t); } dispose() { this.toUnhook.dispose(), this.toUnhookForKeyboard.dispose(); } -}, by = yh, yh.ID = "editor.contrib.gotodefinitionatposition", yh.MAX_SOURCE_PREVIEW_LINES = 8, yh); -z1 = by = Q1e([ - BW(1, Ys), - BW(2, ri), - BW(3, ge) -], z1); -gt( - z1.ID, - z1, +}, xf = Xh, Xh.ID = "editor.contrib.gotodefinitionatposition", Xh.MAX_SOURCE_PREVIEW_LINES = 8, Xh); +eG = xf = zGe([ + lN(1, As), + lN(2, ri), + lN(3, me) +], eG); +mt( + eG.ID, + eG, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */ ); -var Xj = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var G7 = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, rM = function(s, e) { +}, GI = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class fP { +class FK { constructor(e, t, i) { this.marker = e, this.index = t, this.total = i; } } -let cV = class { +let N9 = class { constructor(e, t, i) { - this._markerService = t, this._configService = i, this._onDidChange = new k(), this.onDidChange = this._onDidChange.event, this._dispoables = new U(), this._markers = [], this._nextIdx = -1, Le.isUri(e) ? this._resourceFilter = (l) => l.toString() === e.toString() : e && (this._resourceFilter = e); - const n = this._configService.getValue("problems.sortOrder"), o = (l, a) => { - let c = vw(l.resource.toString(), a.resource.toString()); - return c === 0 && (n === "position" ? c = M.compareRangesUsingStarts(l, a) || gi.compare(l.severity, a.severity) : c = gi.compare(l.severity, a.severity) || M.compareRangesUsingStarts(l, a)), c; - }, r = () => { + this._markerService = t, this._configService = i, this._onDidChange = new k(), this.onDidChange = this._onDidChange.event, this._dispoables = new _(), this._markers = [], this._nextIdx = -1, Xe.isUri(e) ? this._resourceFilter = (r) => r.toString() === e.toString() : e && (this._resourceFilter = e); + const n = this._configService.getValue("problems.sortOrder"), o = (r, c) => { + let d = Ay(r.resource.toString(), c.resource.toString()); + return d === 0 && (n === "position" ? d = I.compareRangesUsingStarts(r, c) || bi.compare(r.severity, c.severity) : d = bi.compare(r.severity, c.severity) || I.compareRangesUsingStarts(r, c)), d; + }, l = () => { this._markers = this._markerService.read({ - resource: Le.isUri(e) ? e : void 0, - severities: gi.Error | gi.Warning | gi.Info - }), typeof e == "function" && (this._markers = this._markers.filter((l) => this._resourceFilter(l.resource))), this._markers.sort(o); + resource: Xe.isUri(e) ? e : void 0, + severities: bi.Error | bi.Warning | bi.Info + }), typeof e == "function" && (this._markers = this._markers.filter((r) => this._resourceFilter(r.resource))), this._markers.sort(o); }; - r(), this._dispoables.add(t.onMarkerChanged((l) => { - (!this._resourceFilter || l.some((a) => this._resourceFilter(a))) && (r(), this._nextIdx = -1, this._onDidChange.fire()); + l(), this._dispoables.add(t.onMarkerChanged((r) => { + (!this._resourceFilter || r.some((c) => this._resourceFilter(c))) && (l(), this._nextIdx = -1, this._onDidChange.fire()); })); } dispose() { @@ -83937,22 +83937,22 @@ let cV = class { } get selected() { const e = this._markers[this._nextIdx]; - return e && new fP(e, this._nextIdx + 1, this._markers.length); + return e && new FK(e, this._nextIdx + 1, this._markers.length); } _initIdx(e, t, i) { - let n = !1, o = this._markers.findIndex((r) => r.resource.toString() === e.uri.toString()); - o < 0 && (o = Rw(this._markers, { resource: e.uri }, (r, l) => vw(r.resource.toString(), l.resource.toString())), o < 0 && (o = ~o)); - for (let r = o; r < this._markers.length; r++) { - let l = M.lift(this._markers[r]); - if (l.isEmpty()) { - const a = e.getWordAtPosition(l.getStartPosition()); - a && (l = new M(l.startLineNumber, a.startColumn, l.startLineNumber, a.endColumn)); - } - if (t && (l.containsPosition(t) || t.isBeforeOrEqual(l.getStartPosition()))) { - this._nextIdx = r, n = !0; + let n = !1, o = this._markers.findIndex((l) => l.resource.toString() === e.uri.toString()); + o < 0 && (o = Qy(this._markers, { resource: e.uri }, (l, r) => Ay(l.resource.toString(), r.resource.toString())), o < 0 && (o = ~o)); + for (let l = o; l < this._markers.length; l++) { + let r = I.lift(this._markers[l]); + if (r.isEmpty()) { + const c = e.getWordAtPosition(r.getStartPosition()); + c && (r = new I(r.startLineNumber, c.startColumn, r.startLineNumber, c.endColumn)); + } + if (t && (r.containsPosition(t) || t.isBeforeOrEqual(r.getStartPosition()))) { + this._nextIdx = l, n = !0; break; } - if (this._markers[r].resource.toString() !== e.uri.toString()) + if (this._markers[l].resource.toString() !== e.uri.toString()) break; } n || (this._nextIdx = i ? 0 : this._markers.length - 1), this._nextIdx < 0 && (this._nextIdx = this._markers.length - 1); @@ -83970,19 +83970,19 @@ let cV = class { let i = this._markers.findIndex((n) => n.resource.toString() === e.toString()); if (!(i < 0)) { for (; i < this._markers.length; i++) - if (M.containsPosition(this._markers[i], t)) - return new fP(this._markers[i], i + 1, this._markers.length); + if (I.containsPosition(this._markers[i], t)) + return new FK(this._markers[i], i + 1, this._markers.length); } } }; -cV = Xj([ - rM(1, Ba), - rM(2, Ke) -], cV); -const Fj = $e("IMarkerNavigationService"); -let dV = class { +N9 = G7([ + GI(1, _c), + GI(2, Qe) +], N9); +const X7 = $e("IMarkerNavigationService"); +let w9 = class { constructor(e, t) { - this._markerService = e, this._configService = t, this._provider = new cs(); + this._markerService = e, this._configService = t, this._provider = new hs(); } getMarkerList(e) { for (const t of this._provider) { @@ -83990,116 +83990,116 @@ let dV = class { if (i) return i; } - return new cV(e, this._markerService, this._configService); + return new N9(e, this._markerService, this._configService); } }; -dV = Xj([ - rM(0, Ba), - rM(1, Ke) -], dV); +w9 = G7([ + GI(0, _c), + GI(1, Qe) +], w9); it( - Fj, - dV, + X7, + w9, 1 /* InstantiationType.Delayed */ ); -var hV; +var T9; (function(s) { function e(t) { switch (t) { - case Mi.Ignore: - return "severity-ignore " + Ze.asClassName(te.info); - case Mi.Info: - return Ze.asClassName(te.info); - case Mi.Warning: - return Ze.asClassName(te.warning); - case Mi.Error: - return Ze.asClassName(te.error); + case Si.Ignore: + return "severity-ignore " + Se.asClassName(te.info); + case Si.Info: + return Se.asClassName(te.info); + case Si.Warning: + return Se.asClassName(te.warning); + case Si.Error: + return Se.asClassName(te.error); default: return ""; } } s.className = e; -})(hV || (hV = {})); -var j1e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +})(T9 || (T9 = {})); +var AGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, wp = function(s, e) { +}, Lp = function(s, e) { return function(t, i) { e(t, i, s); }; -}, uV; -class q1e { +}, M9; +class KGe { constructor(e, t, i, n, o) { - this._openerService = n, this._labelService = o, this._lines = 0, this._longestLineLength = 0, this._relatedDiagnostics = /* @__PURE__ */ new WeakMap(), this._disposables = new U(), this._editor = t; - const r = document.createElement("div"); - r.className = "descriptioncontainer", this._messageBlock = document.createElement("div"), this._messageBlock.classList.add("message"), this._messageBlock.setAttribute("aria-live", "assertive"), this._messageBlock.setAttribute("role", "alert"), r.appendChild(this._messageBlock), this._relatedBlock = document.createElement("div"), r.appendChild(this._relatedBlock), this._disposables.add(ai(this._relatedBlock, "click", (l) => { - l.preventDefault(); - const a = this._relatedDiagnostics.get(l.target); - a && i(a); - })), this._scrollable = new CU(r, { + this._openerService = n, this._labelService = o, this._lines = 0, this._longestLineLength = 0, this._relatedDiagnostics = /* @__PURE__ */ new WeakMap(), this._disposables = new _(), this._editor = t; + const l = document.createElement("div"); + l.className = "descriptioncontainer", this._messageBlock = document.createElement("div"), this._messageBlock.classList.add("message"), this._messageBlock.setAttribute("aria-live", "assertive"), this._messageBlock.setAttribute("role", "alert"), l.appendChild(this._messageBlock), this._relatedBlock = document.createElement("div"), l.appendChild(this._relatedBlock), this._disposables.add(di(this._relatedBlock, "click", (r) => { + r.preventDefault(); + const c = this._relatedDiagnostics.get(r.target); + c && i(c); + })), this._scrollable = new iQ(l, { horizontal: 1, vertical: 1, useShadows: !1, horizontalScrollbarSize: 6, verticalScrollbarSize: 6 - }), e.appendChild(this._scrollable.getDomNode()), this._disposables.add(this._scrollable.onScroll((l) => { - r.style.left = `-${l.scrollLeft}px`, r.style.top = `-${l.scrollTop}px`; + }), e.appendChild(this._scrollable.getDomNode()), this._disposables.add(this._scrollable.onScroll((r) => { + l.style.left = `-${r.scrollLeft}px`, l.style.top = `-${r.scrollTop}px`; })), this._disposables.add(this._scrollable); } dispose() { - Wt(this._disposables); + Nt(this._disposables); } update(e) { const { source: t, message: i, relatedInformation: n, code: o } = e; - let r = ((t == null ? void 0 : t.length) || 0) + 2; - o && (typeof o == "string" ? r += o.length : r += o.value.length); - const l = Fa(i); - this._lines = l.length, this._longestLineLength = 0; - for (const u of l) - this._longestLineLength = Math.max(u.length + r, this._longestLineLength); - gn(this._messageBlock), this._messageBlock.setAttribute("aria-label", this.getAriaLabel(e)), this._editor.applyFontInfo(this._messageBlock); - let a = this._messageBlock; - for (const u of l) - a = document.createElement("div"), a.innerText = u, u === "" && (a.style.height = this._messageBlock.style.lineHeight), this._messageBlock.appendChild(a); + let l = ((t == null ? void 0 : t.length) || 0) + 2; + o && (typeof o == "string" ? l += o.length : l += o.value.length); + const r = Kc(i); + this._lines = r.length, this._longestLineLength = 0; + for (const u of r) + this._longestLineLength = Math.max(u.length + l, this._longestLineLength); + bn(this._messageBlock), this._messageBlock.setAttribute("aria-label", this.getAriaLabel(e)), this._editor.applyFontInfo(this._messageBlock); + let c = this._messageBlock; + for (const u of r) + c = document.createElement("div"), c.innerText = u, u === "" && (c.style.height = this._messageBlock.style.lineHeight), this._messageBlock.appendChild(c); if (t || o) { const u = document.createElement("span"); - if (u.classList.add("details"), a.appendChild(u), t) { - const g = document.createElement("span"); - g.innerText = t, g.classList.add("source"), u.appendChild(g); + if (u.classList.add("details"), c.appendChild(u), t) { + const m = document.createElement("span"); + m.innerText = t, m.classList.add("source"), u.appendChild(m); } if (o) if (typeof o == "string") { - const g = document.createElement("span"); - g.innerText = `(${o})`, g.classList.add("code"), u.appendChild(g); + const m = document.createElement("span"); + m.innerText = `(${o})`, m.classList.add("code"), u.appendChild(m); } else { - this._codeLink = ce("a.code-link"), this._codeLink.setAttribute("href", `${o.target.toString()}`), this._codeLink.onclick = (m) => { - this._openerService.open(o.target, { allowCommands: !0 }), m.preventDefault(), m.stopPropagation(); + this._codeLink = de("a.code-link"), this._codeLink.setAttribute("href", `${o.target.toString()}`), this._codeLink.onclick = (b) => { + this._openerService.open(o.target, { allowCommands: !0 }), b.preventDefault(), b.stopPropagation(); }; - const g = Q(this._codeLink, ce("span")); - g.innerText = o.value, u.appendChild(this._codeLink); + const m = O(this._codeLink, de("span")); + m.innerText = o.value, u.appendChild(this._codeLink); } } - if (gn(this._relatedBlock), this._editor.applyFontInfo(this._relatedBlock), $n(n)) { + if (bn(this._relatedBlock), this._editor.applyFontInfo(this._relatedBlock), ts(n)) { const u = this._relatedBlock.appendChild(document.createElement("div")); u.style.paddingTop = `${Math.floor(this._editor.getOption( 67 /* EditorOption.lineHeight */ ) * 0.66)}px`, this._lines += 1; - for (const g of n) { - const m = document.createElement("div"), f = document.createElement("a"); - f.classList.add("filename"), f.innerText = `${this._labelService.getUriBasenameLabel(g.resource)}(${g.startLineNumber}, ${g.startColumn}): `, f.title = this._labelService.getUriLabel(g.resource), this._relatedDiagnostics.set(f, g); - const b = document.createElement("span"); - b.innerText = g.message, m.appendChild(f), m.appendChild(b), this._lines += 1, u.appendChild(m); + for (const m of n) { + const b = document.createElement("div"), g = document.createElement("a"); + g.classList.add("filename"), g.innerText = `${this._labelService.getUriBasenameLabel(m.resource)}(${m.startLineNumber}, ${m.startColumn}): `, g.title = this._labelService.getUriLabel(m.resource), this._relatedDiagnostics.set(g, m); + const Z = document.createElement("span"); + Z.innerText = m.message, b.appendChild(g), b.appendChild(Z), this._lines += 1, u.appendChild(b); } } - const c = this._editor.getOption( + const d = this._editor.getOption( 50 /* EditorOption.fontInfo */ - ), d = Math.ceil(c.typicalFullwidthCharacterWidth * this._longestLineLength * 0.75), h = c.lineHeight * this._lines; - this._scrollable.setScrollDimensions({ scrollWidth: d, scrollHeight: h }); + ), a = Math.ceil(d.typicalFullwidthCharacterWidth * this._longestLineLength * 0.75), h = d.lineHeight * this._lines; + this._scrollable.setScrollDimensions({ scrollWidth: a, scrollHeight: h }); } layout(e, t) { this._scrollable.getDomNode().style.height = `${e}px`, this._scrollable.getDomNode().style.width = `${t}px`, this._scrollable.setScrollDimensions({ width: t, height: e }); @@ -84110,16 +84110,16 @@ class q1e { getAriaLabel(e) { let t = ""; switch (e.severity) { - case gi.Error: + case bi.Error: t = p("Error", "Error"); break; - case gi.Warning: + case bi.Warning: t = p("Warning", "Warning"); break; - case gi.Info: + case bi.Info: t = p("Info", "Info"); break; - case gi.Hint: + case bi.Hint: t = p("Hint", "Hint"); break; } @@ -84128,22 +84128,22 @@ class q1e { return n && e.startLineNumber <= n.getLineCount() && e.startLineNumber >= 1 && (i = `${n.getLineContent(e.startLineNumber)}, ${i}`), i; } } -var Pg; -let P1 = (Pg = class extends Wx { - constructor(e, t, i, n, o, r, l) { - super(e, { showArrow: !0, showFrame: !0, isAccessible: !0, frameWidth: 1 }, o), this._themeService = t, this._openerService = i, this._menuService = n, this._contextKeyService = r, this._labelService = l, this._callOnDispose = new U(), this._onDidSelectRelatedInformation = new k(), this.onDidSelectRelatedInformation = this._onDidSelectRelatedInformation.event, this._severity = gi.Warning, this._backgroundColor = K.white, this._applyTheme(t.getColorTheme()), this._callOnDispose.add(t.onDidColorThemeChange(this._applyTheme.bind(this))), this.create(); +var _m; +let tG = (_m = class extends UL { + constructor(e, t, i, n, o, l, r) { + super(e, { showArrow: !0, showFrame: !0, isAccessible: !0, frameWidth: 1 }, o), this._themeService = t, this._openerService = i, this._menuService = n, this._contextKeyService = l, this._labelService = r, this._callOnDispose = new _(), this._onDidSelectRelatedInformation = new k(), this.onDidSelectRelatedInformation = this._onDidSelectRelatedInformation.event, this._severity = bi.Warning, this._backgroundColor = Q.white, this._applyTheme(t.getColorTheme()), this._callOnDispose.add(t.onDidColorThemeChange(this._applyTheme.bind(this))), this.create(); } _applyTheme(e) { - this._backgroundColor = e.getColor(iCe); - let t = gV, i = $1e; - this._severity === gi.Warning ? (t = EL, i = eCe) : this._severity === gi.Info && (t = mV, i = tCe); + this._backgroundColor = e.getColor(_Ge); + let t = Y9, i = UGe; + this._severity === bi.Warning ? (t = $X, i = PGe) : this._severity === bi.Info && (t = k9, i = BGe); const n = e.getColor(t), o = e.getColor(i); this.style({ arrowColor: n, frameColor: n, headerBackgroundColor: o, - primaryHeadingColor: e.getColor(WQ), - secondaryHeadingColor: e.getColor(vQ) + primaryHeadingColor: e.getColor(u4), + secondaryHeadingColor: e.getColor(m4) }); } _applyStyles() { @@ -84154,29 +84154,29 @@ let P1 = (Pg = class extends Wx { } _fillHead(e) { super._fillHead(e), this._disposables.add(this._actionbarWidget.actionRunner.onWillRun((n) => this.editor.focus())); - const t = [], i = this._menuService.getMenuActions(uV.TitleMenu, this._contextKeyService); - NI(i, t), this._actionbarWidget.push(t, { label: !1, icon: !0, index: 0 }); + const t = [], i = this._menuService.getMenuActions(M9.TitleMenu, this._contextKeyService); + Kx(i, t), this._actionbarWidget.push(t, { label: !1, icon: !0, index: 0 }); } _fillTitleIcon(e) { - this._icon = Q(e, ce("")); + this._icon = O(e, de("")); } _fillBody(e) { - this._parentContainer = e, e.classList.add("marker-widget"), this._parentContainer.tabIndex = 0, this._parentContainer.setAttribute("role", "tooltip"), this._container = document.createElement("div"), e.appendChild(this._container), this._message = new q1e(this._container, this.editor, (t) => this._onDidSelectRelatedInformation.fire(t), this._openerService, this._labelService), this._disposables.add(this._message); + this._parentContainer = e, e.classList.add("marker-widget"), this._parentContainer.tabIndex = 0, this._parentContainer.setAttribute("role", "tooltip"), this._container = document.createElement("div"), e.appendChild(this._container), this._message = new KGe(this._container, this.editor, (t) => this._onDidSelectRelatedInformation.fire(t), this._openerService, this._labelService), this._disposables.add(this._message); } show() { throw new Error("call showAtMarker"); } showAtMarker(e, t, i) { this._container.classList.remove("stale"), this._message.update(e), this._severity = e.severity, this._applyTheme(this._themeService.getColorTheme()); - const n = M.lift(e), o = this.editor.getPosition(), r = o && n.containsPosition(o) ? o : n.getStartPosition(); - super.show(r, this.computeRequiredHeight()); - const l = this.editor.getModel(); - if (l) { - const a = i > 1 ? p("problems", "{0} of {1} problems", t, i) : p("change", "{0} of {1} problem", t, i); - this.setTitle(Cr(l.uri), a); + const n = I.lift(e), o = this.editor.getPosition(), l = o && n.containsPosition(o) ? o : n.getStartPosition(); + super.show(l, this.computeRequiredHeight()); + const r = this.editor.getModel(); + if (r) { + const c = i > 1 ? p("problems", "{0} of {1} problems", t, i) : p("change", "{0} of {1} problem", t, i); + this.setTitle(Vl(r.uri), c); } - this._icon.className = `codicon ${hV.className(gi.toSeverity(this._severity))}`, this.editor.revealPositionNearTop( - r, + this._icon.className = `codicon ${T9.className(bi.toSeverity(this._severity))}`, this.editor.revealPositionNearTop( + l, 0 /* ScrollType.Smooth */ ), this.editor.focus(); @@ -84199,32 +84199,32 @@ let P1 = (Pg = class extends Wx { computeRequiredHeight() { return 3 + this._message.getHeightInLines(); } -}, uV = Pg, Pg.TitleMenu = new pe("gotoErrorTitleMenu"), Pg); -P1 = uV = j1e([ - wp(1, Pi), - wp(2, Bs), - wp(3, Uo), - wp(4, Se), - wp(5, _e), - wp(6, Nb) -], P1); -const bP = Pw(nI, Rie), yP = Pw(Jc, Bw), wP = Pw(Da, Ow), gV = N("editorMarkerNavigationError.background", { dark: bP, light: bP, hcDark: rt, hcLight: rt }, p("editorMarkerNavigationError", "Editor marker navigation widget error color.")), $1e = N("editorMarkerNavigationError.headerBackground", { dark: Pe(gV, 0.1), light: Pe(gV, 0.1), hcDark: null, hcLight: null }, p("editorMarkerNavigationErrorHeaderBackground", "Editor marker navigation widget error heading background.")), EL = N("editorMarkerNavigationWarning.background", { dark: yP, light: yP, hcDark: rt, hcLight: rt }, p("editorMarkerNavigationWarning", "Editor marker navigation widget warning color.")), eCe = N("editorMarkerNavigationWarning.headerBackground", { dark: Pe(EL, 0.1), light: Pe(EL, 0.1), hcDark: "#0C141F", hcLight: Pe(EL, 0.2) }, p("editorMarkerNavigationWarningBackground", "Editor marker navigation widget warning heading background.")), mV = N("editorMarkerNavigationInfo.background", { dark: wP, light: wP, hcDark: rt, hcLight: rt }, p("editorMarkerNavigationInfo", "Editor marker navigation widget info color.")), tCe = N("editorMarkerNavigationInfo.headerBackground", { dark: Pe(mV, 0.1), light: Pe(mV, 0.1), hcDark: null, hcLight: null }, p("editorMarkerNavigationInfoHeaderBackground", "Editor marker navigation widget info heading background.")), iCe = N("editorMarkerNavigation.background", Hr, p("editorMarkerNavigationBackground", "Editor marker navigation widget background.")); -var nCe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +}, M9 = _m, _m.TitleMenu = new pe("gotoErrorTitleMenu"), _m); +tG = M9 = AGe([ + Lp(1, Ki), + Lp(2, Ps), + Lp(3, Oo), + Lp(4, Ge), + Lp(5, xe), + Lp(6, kZ) +], tG); +const zK = tW(fx, Rne), AK = tW(jd, iW), KK = tW(Jc, nW), Y9 = R("editorMarkerNavigationError.background", { dark: zK, light: zK, hcDark: lt, hcLight: lt }, p("editorMarkerNavigationError", "Editor marker navigation widget error color.")), UGe = R("editorMarkerNavigationError.headerBackground", { dark: Ae(Y9, 0.1), light: Ae(Y9, 0.1), hcDark: null, hcLight: null }, p("editorMarkerNavigationErrorHeaderBackground", "Editor marker navigation widget error heading background.")), $X = R("editorMarkerNavigationWarning.background", { dark: AK, light: AK, hcDark: lt, hcLight: lt }, p("editorMarkerNavigationWarning", "Editor marker navigation widget warning color.")), PGe = R("editorMarkerNavigationWarning.headerBackground", { dark: Ae($X, 0.1), light: Ae($X, 0.1), hcDark: "#0C141F", hcLight: Ae($X, 0.2) }, p("editorMarkerNavigationWarningBackground", "Editor marker navigation widget warning heading background.")), k9 = R("editorMarkerNavigationInfo.background", { dark: KK, light: KK, hcDark: lt, hcLight: lt }, p("editorMarkerNavigationInfo", "Editor marker navigation widget info color.")), BGe = R("editorMarkerNavigationInfo.headerBackground", { dark: Ae(k9, 0.1), light: Ae(k9, 0.1), hcDark: null, hcLight: null }, p("editorMarkerNavigationInfoHeaderBackground", "Editor marker navigation widget info heading background.")), _Ge = R("editorMarkerNavigation.background", Ql, p("editorMarkerNavigationBackground", "Editor marker navigation widget background.")); +var QGe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, BS = function(s, e) { +}, nX = function(s, e) { return function(t, i) { e(t, i, s); }; -}, yy, Bg; -let Wm = (Bg = class { +}, Cf, Qm; +let kb = (Qm = class { static get(e) { - return e.getContribution(yy.ID); + return e.getContribution(Cf.ID); } constructor(e, t, i, n, o) { - this._markerNavigationService = t, this._contextKeyService = i, this._editorService = n, this._instantiationService = o, this._sessionDispoables = new U(), this._editor = e, this._widgetVisible = Yj.bindTo(this._contextKeyService); + this._markerNavigationService = t, this._contextKeyService = i, this._editorService = n, this._instantiationService = o, this._sessionDispoables = new _(), this._editor = e, this._widgetVisible = V7.bindTo(this._contextKeyService); } dispose() { this._cleanUp(), this._sessionDispoables.dispose(); @@ -84236,9 +84236,9 @@ let Wm = (Bg = class { if (this._model && this._model.matches(e)) return this._model; let t = !1; - return this._model && (t = !0, this._cleanUp()), this._model = this._markerNavigationService.getMarkerList(e), t && this._model.move(!0, this._editor.getModel(), this._editor.getPosition()), this._widget = this._instantiationService.createInstance(P1, this._editor), this._widget.onDidClose(() => this.close(), this, this._sessionDispoables), this._widgetVisible.set(!0), this._sessionDispoables.add(this._model), this._sessionDispoables.add(this._widget), this._sessionDispoables.add(this._editor.onDidChangeCursorPosition((i) => { - var n, o, r; - (!((n = this._model) != null && n.selected) || !M.containsPosition((o = this._model) == null ? void 0 : o.selected.marker, i.position)) && ((r = this._model) == null || r.resetIndex()); + return this._model && (t = !0, this._cleanUp()), this._model = this._markerNavigationService.getMarkerList(e), t && this._model.move(!0, this._editor.getModel(), this._editor.getPosition()), this._widget = this._instantiationService.createInstance(tG, this._editor), this._widget.onDidClose(() => this.close(), this, this._sessionDispoables), this._widgetVisible.set(!0), this._sessionDispoables.add(this._model), this._sessionDispoables.add(this._widget), this._sessionDispoables.add(this._editor.onDidChangeCursorPosition((i) => { + var n, o, l; + (!((n = this._model) != null && n.selected) || !I.containsPosition((o = this._model) == null ? void 0 : o.selected.marker, i.position)) && ((l = this._model) == null || l.resetIndex()); })), this._sessionDispoables.add(this._model.onDidChange(() => { if (!this._widget || !this._widget.position || !this._model) return; @@ -84247,7 +84247,7 @@ let Wm = (Bg = class { })), this._sessionDispoables.add(this._widget.onDidSelectRelatedInformation((i) => { this._editorService.openCodeEditor({ resource: i.resource, - options: { pinned: !0, revealIfOpened: !0, selection: M.lift(i).collapseToStart() } + options: { pinned: !0, revealIfOpened: !0, selection: I.lift(i).collapseToStart() } }, this._editor), this.close(!1); })), this._sessionDispoables.add(this._editor.onDidChangeModel(() => this._cleanUp())), this._model; } @@ -84257,7 +84257,7 @@ let Wm = (Bg = class { showAtMarker(e) { if (this._editor.hasModel()) { const t = this._getOrCreateModel(this._editor.getModel().uri); - t.resetIndex(), t.move(!0, this._editor.getModel(), new V(e.startLineNumber, e.startColumn)), t.selected && this._widget.showAtMarker(t.selected.marker, t.selected.index, t.selected.total); + t.resetIndex(), t.move(!0, this._editor.getModel(), new Y(e.startLineNumber, e.startColumn)), t.selected && this._widget.showAtMarker(t.selected.marker, t.selected.index, t.selected.total); } } async nagivate(e, t) { @@ -84268,82 +84268,82 @@ let Wm = (Bg = class { return; if (o.selected.marker.resource.toString() !== this._editor.getModel().uri.toString()) { this._cleanUp(); - const r = await this._editorService.openCodeEditor({ + const l = await this._editorService.openCodeEditor({ resource: o.selected.marker.resource, options: { pinned: !1, revealIfOpened: !0, selectionRevealType: 2, selection: o.selected.marker } }, this._editor); - r && ((i = yy.get(r)) == null || i.close(), (n = yy.get(r)) == null || n.nagivate(e, t)); + l && ((i = Cf.get(l)) == null || i.close(), (n = Cf.get(l)) == null || n.nagivate(e, t)); } else this._widget.showAtMarker(o.selected.marker, o.selected.index, o.selected.total); } } -}, yy = Bg, Bg.ID = "editor.contrib.markerController", Bg); -Wm = yy = nCe([ - BS(1, Fj), - BS(2, _e), - BS(3, ft), - BS(4, Se) -], Wm); -class $I extends he { +}, Cf = Qm, Qm.ID = "editor.contrib.markerController", Qm); +kb = Cf = QGe([ + nX(1, X7), + nX(2, xe), + nX(3, gt), + nX(4, Ge) +], kb); +class bC extends he { constructor(e, t, i) { super(i), this._next = e, this._multiFile = t; } async run(e, t) { var i; - t.hasModel() && ((i = Wm.get(t)) == null || i.nagivate(this._next, this._multiFile)); + t.hasModel() && ((i = kb.get(t)) == null || i.nagivate(this._next, this._multiFile)); } } -const Ku = class Ku extends $I { +const em = class em extends bC { constructor() { super(!0, !1, { - id: Ku.ID, - label: Ku.LABEL, + id: em.ID, + label: em.LABEL, alias: "Go to Next Problem (Error, Warning, Info)", precondition: void 0, kbOpts: { - kbExpr: I.focus, + kbExpr: C.focus, primary: 578, weight: 100 /* KeybindingWeight.EditorContrib */ }, menuOpts: { - menuId: P1.TitleMenu, - title: Ku.LABEL, - icon: Bt("marker-navigation-next", te.arrowDown, p("nextMarkerIcon", "Icon for goto next marker.")), + menuId: tG.TitleMenu, + title: em.LABEL, + icon: Kt("marker-navigation-next", te.arrowDown, p("nextMarkerIcon", "Icon for goto next marker.")), group: "navigation", order: 1 } }); } }; -Ku.ID = "editor.action.marker.next", Ku.LABEL = p("markerAction.next.label", "Go to Next Problem (Error, Warning, Info)"); -let lM = Ku; -const Qu = class Qu extends $I { +em.ID = "editor.action.marker.next", em.LABEL = p("markerAction.next.label", "Go to Next Problem (Error, Warning, Info)"); +let XI = em; +const tm = class tm extends bC { constructor() { super(!1, !1, { - id: Qu.ID, - label: Qu.LABEL, + id: tm.ID, + label: tm.LABEL, alias: "Go to Previous Problem (Error, Warning, Info)", precondition: void 0, kbOpts: { - kbExpr: I.focus, + kbExpr: C.focus, primary: 1602, weight: 100 /* KeybindingWeight.EditorContrib */ }, menuOpts: { - menuId: P1.TitleMenu, - title: Qu.LABEL, - icon: Bt("marker-navigation-previous", te.arrowUp, p("previousMarkerIcon", "Icon for goto previous marker.")), + menuId: tG.TitleMenu, + title: tm.LABEL, + icon: Kt("marker-navigation-previous", te.arrowUp, p("previousMarkerIcon", "Icon for goto previous marker.")), group: "navigation", order: 2 } }); } }; -Qu.ID = "editor.action.marker.prev", Qu.LABEL = p("markerAction.previous.label", "Go to Previous Problem (Error, Warning, Info)"); -let pV = Qu; -class sCe extends $I { +tm.ID = "editor.action.marker.prev", tm.LABEL = p("markerAction.previous.label", "Go to Previous Problem (Error, Warning, Info)"); +let v9 = tm; +class OGe extends bC { constructor() { super(!0, !0, { id: "editor.action.marker.nextInFiles", @@ -84351,7 +84351,7 @@ class sCe extends $I { alias: "Go to Next Problem in Files (Error, Warning, Info)", precondition: void 0, kbOpts: { - kbExpr: I.focus, + kbExpr: C.focus, primary: 66, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -84365,7 +84365,7 @@ class sCe extends $I { }); } } -class oCe extends $I { +class jGe extends bC { constructor() { super(!1, !0, { id: "editor.action.marker.prevInFiles", @@ -84373,7 +84373,7 @@ class oCe extends $I { alias: "Go to Previous Problem in Files (Error, Warning, Info)", precondition: void 0, kbOpts: { - kbExpr: I.focus, + kbExpr: C.focus, primary: 1090, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -84387,24 +84387,24 @@ class oCe extends $I { }); } } -gt( - Wm.ID, - Wm, +mt( + kb.ID, + kb, 4 /* EditorContributionInstantiation.Lazy */ ); -ee(lM); -ee(pV); -ee(sCe); -ee(oCe); -const Yj = new ae("markersNavigationVisible", !1), rCe = zi.bindToContribution(Wm.get); -oe(new rCe({ +ee(XI); +ee(v9); +ee(OGe); +ee(jGe); +const V7 = new ce("markersNavigationVisible", !1), qGe = Ai.bindToContribution(kb.get); +oe(new qGe({ id: "closeMarkersNavigation", - precondition: Yj, + precondition: V7, handler: (s) => s.close(), kbOpts: { weight: 150, - kbExpr: I.focus, + kbExpr: C.focus, primary: 9, secondary: [ 1033 @@ -84412,14 +84412,14 @@ oe(new rCe({ ] } })); -var hl; +var br; (function(s) { s.NoAutoFocus = "noAutoFocus", s.FocusIfVisible = "focusIfVisible", s.AutoFocusImmediately = "autoFocusImmediately"; -})(hl || (hl = {})); -class lCe extends he { +})(br || (br = {})); +class $Ge extends he { constructor() { super({ - id: mQ, + id: Oj, label: p({ key: "showOrFocusHover", comment: [ @@ -84429,7 +84429,7 @@ class lCe extends he { ] }, "Show or Focus Hover"), metadata: { - description: Ie("showOrFocusHoverDescription", "Show or focus the editor hover which shows documentation, references, and other content for a symbol at the current cursor position."), + description: Ce("showOrFocusHoverDescription", "Show or focus the editor hover which shows documentation, references, and other content for a symbol at the current cursor position."), args: [{ name: "args", schema: { @@ -84437,13 +84437,13 @@ class lCe extends he { properties: { focus: { description: "Controls if and when the hover should take focus upon being triggered by this action.", - enum: [hl.NoAutoFocus, hl.FocusIfVisible, hl.AutoFocusImmediately], + enum: [br.NoAutoFocus, br.FocusIfVisible, br.AutoFocusImmediately], enumDescriptions: [ p("showOrFocusHover.focus.noAutoFocus", "The hover will not automatically take focus."), p("showOrFocusHover.focus.focusIfVisible", "The hover will take focus only if it is already visible."), p("showOrFocusHover.focus.autoFocusImmediately", "The hover will automatically take focus when it appears.") ], - default: hl.FocusIfVisible + default: br.FocusIfVisible } } } @@ -84452,8 +84452,8 @@ class lCe extends he { alias: "Show or Focus Hover", precondition: void 0, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2087 /* KeyCode.KeyI */ @@ -84466,26 +84466,26 @@ class lCe extends he { run(e, t, i) { if (!t.hasModel()) return; - const n = es.get(t); + const n = is.get(t); if (!n) return; const o = i == null ? void 0 : i.focus; - let r = hl.FocusIfVisible; - Object.values(hl).includes(o) ? r = o : typeof o == "boolean" && o && (r = hl.AutoFocusImmediately); - const l = (c) => { - const d = t.getPosition(), h = new M(d.lineNumber, d.column, d.lineNumber, d.column); - n.showContentHover(h, 1, 1, c); - }, a = t.getOption( + let l = br.FocusIfVisible; + Object.values(br).includes(o) ? l = o : typeof o == "boolean" && o && (l = br.AutoFocusImmediately); + const r = (d) => { + const a = t.getPosition(), h = new I(a.lineNumber, a.column, a.lineNumber, a.column); + n.showContentHover(h, 1, 1, d); + }, c = t.getOption( 2 /* EditorOption.accessibilitySupport */ ) === 2; - n.isHoverVisible ? r !== hl.NoAutoFocus ? n.focus() : l(a) : l(a || r === hl.AutoFocusImmediately); + n.isHoverVisible ? l !== br.NoAutoFocus ? n.focus() : r(c) : r(c || l === br.AutoFocusImmediately); } } -class aCe extends he { +class e1e extends he { constructor() { super({ - id: afe, + id: eZe, label: p({ key: "showDefinitionPreviewHover", comment: [ @@ -84496,29 +84496,29 @@ class aCe extends he { alias: "Show Definition Preview Hover", precondition: void 0, metadata: { - description: Ie("showDefinitionPreviewHoverDescription", "Show the definition preview hover in the editor.") + description: Ce("showDefinitionPreviewHoverDescription", "Show the definition preview hover in the editor.") } }); } run(e, t) { - const i = es.get(t); + const i = is.get(t); if (!i) return; const n = t.getPosition(); if (!n) return; - const o = new M(n.lineNumber, n.column, n.lineNumber, n.column), r = z1.get(t); - if (!r) + const o = new I(n.lineNumber, n.column, n.lineNumber, n.column), l = eG.get(t); + if (!l) return; - r.startFindDefinitionFromCursor(n).then(() => { + l.startFindDefinitionFromCursor(n).then(() => { i.showContentHover(o, 1, 1, !0); }); } } -class cCe extends he { +class t1e extends he { constructor() { super({ - id: cfe, + id: tZe, label: p({ key: "scrollUpHover", comment: [ @@ -84526,27 +84526,27 @@ class cCe extends he { ] }, "Scroll Up Hover"), alias: "Scroll Up Hover", - precondition: I.hoverFocused, + precondition: C.hoverFocused, kbOpts: { - kbExpr: I.hoverFocused, + kbExpr: C.hoverFocused, primary: 16, weight: 100 /* KeybindingWeight.EditorContrib */ }, metadata: { - description: Ie("scrollUpHoverDescription", "Scroll up the editor hover.") + description: Ce("scrollUpHoverDescription", "Scroll up the editor hover.") } }); } run(e, t) { - const i = es.get(t); + const i = is.get(t); i && i.scrollUp(); } } -class dCe extends he { +class i1e extends he { constructor() { super({ - id: dfe, + id: iZe, label: p({ key: "scrollDownHover", comment: [ @@ -84554,27 +84554,27 @@ class dCe extends he { ] }, "Scroll Down Hover"), alias: "Scroll Down Hover", - precondition: I.hoverFocused, + precondition: C.hoverFocused, kbOpts: { - kbExpr: I.hoverFocused, + kbExpr: C.hoverFocused, primary: 18, weight: 100 /* KeybindingWeight.EditorContrib */ }, metadata: { - description: Ie("scrollDownHoverDescription", "Scroll down the editor hover.") + description: Ce("scrollDownHoverDescription", "Scroll down the editor hover.") } }); } run(e, t) { - const i = es.get(t); + const i = is.get(t); i && i.scrollDown(); } } -class hCe extends he { +class n1e extends he { constructor() { super({ - id: hfe, + id: nZe, label: p({ key: "scrollLeftHover", comment: [ @@ -84582,27 +84582,27 @@ class hCe extends he { ] }, "Scroll Left Hover"), alias: "Scroll Left Hover", - precondition: I.hoverFocused, + precondition: C.hoverFocused, kbOpts: { - kbExpr: I.hoverFocused, + kbExpr: C.hoverFocused, primary: 15, weight: 100 /* KeybindingWeight.EditorContrib */ }, metadata: { - description: Ie("scrollLeftHoverDescription", "Scroll left the editor hover.") + description: Ce("scrollLeftHoverDescription", "Scroll left the editor hover.") } }); } run(e, t) { - const i = es.get(t); + const i = is.get(t); i && i.scrollLeft(); } } -class uCe extends he { +class s1e extends he { constructor() { super({ - id: ufe, + id: sZe, label: p({ key: "scrollRightHover", comment: [ @@ -84610,27 +84610,27 @@ class uCe extends he { ] }, "Scroll Right Hover"), alias: "Scroll Right Hover", - precondition: I.hoverFocused, + precondition: C.hoverFocused, kbOpts: { - kbExpr: I.hoverFocused, + kbExpr: C.hoverFocused, primary: 17, weight: 100 /* KeybindingWeight.EditorContrib */ }, metadata: { - description: Ie("scrollRightHoverDescription", "Scroll right the editor hover.") + description: Ce("scrollRightHoverDescription", "Scroll right the editor hover.") } }); } run(e, t) { - const i = es.get(t); + const i = is.get(t); i && i.scrollRight(); } } -class gCe extends he { +class o1e extends he { constructor() { super({ - id: gfe, + id: oZe, label: p({ key: "pageUpHover", comment: [ @@ -84638,9 +84638,9 @@ class gCe extends he { ] }, "Page Up Hover"), alias: "Page Up Hover", - precondition: I.hoverFocused, + precondition: C.hoverFocused, kbOpts: { - kbExpr: I.hoverFocused, + kbExpr: C.hoverFocused, primary: 11, secondary: [ 528 @@ -84650,19 +84650,19 @@ class gCe extends he { /* KeybindingWeight.EditorContrib */ }, metadata: { - description: Ie("pageUpHoverDescription", "Page up the editor hover.") + description: Ce("pageUpHoverDescription", "Page up the editor hover.") } }); } run(e, t) { - const i = es.get(t); + const i = is.get(t); i && i.pageUp(); } } -class mCe extends he { +class l1e extends he { constructor() { super({ - id: mfe, + id: lZe, label: p({ key: "pageDownHover", comment: [ @@ -84670,9 +84670,9 @@ class mCe extends he { ] }, "Page Down Hover"), alias: "Page Down Hover", - precondition: I.hoverFocused, + precondition: C.hoverFocused, kbOpts: { - kbExpr: I.hoverFocused, + kbExpr: C.hoverFocused, primary: 12, secondary: [ 530 @@ -84682,19 +84682,19 @@ class mCe extends he { /* KeybindingWeight.EditorContrib */ }, metadata: { - description: Ie("pageDownHoverDescription", "Page down the editor hover.") + description: Ce("pageDownHoverDescription", "Page down the editor hover.") } }); } run(e, t) { - const i = es.get(t); + const i = is.get(t); i && i.pageDown(); } } -class pCe extends he { +class r1e extends he { constructor() { super({ - id: pfe, + id: rZe, label: p({ key: "goToTopHover", comment: [ @@ -84702,9 +84702,9 @@ class pCe extends he { ] }, "Go To Top Hover"), alias: "Go To Bottom Hover", - precondition: I.hoverFocused, + precondition: C.hoverFocused, kbOpts: { - kbExpr: I.hoverFocused, + kbExpr: C.hoverFocused, primary: 14, secondary: [ 2064 @@ -84714,19 +84714,19 @@ class pCe extends he { /* KeybindingWeight.EditorContrib */ }, metadata: { - description: Ie("goToTopHoverDescription", "Go to the top of the editor hover.") + description: Ce("goToTopHoverDescription", "Go to the top of the editor hover.") } }); } run(e, t) { - const i = es.get(t); + const i = is.get(t); i && i.goToTop(); } } -class fCe extends he { +class c1e extends he { constructor() { super({ - id: ffe, + id: cZe, label: p({ key: "goToBottomHover", comment: [ @@ -84734,9 +84734,9 @@ class fCe extends he { ] }, "Go To Bottom Hover"), alias: "Go To Bottom Hover", - precondition: I.hoverFocused, + precondition: C.hoverFocused, kbOpts: { - kbExpr: I.hoverFocused, + kbExpr: C.hoverFocused, primary: 13, secondary: [ 2066 @@ -84746,62 +84746,62 @@ class fCe extends he { /* KeybindingWeight.EditorContrib */ }, metadata: { - description: Ie("goToBottomHoverDescription", "Go to the bottom of the editor hover.") + description: Ce("goToBottomHoverDescription", "Go to the bottom of the editor hover.") } }); } run(e, t) { - const i = es.get(t); + const i = is.get(t); i && i.goToBottom(); } } -class bCe extends he { +class d1e extends he { constructor() { super({ - id: VI, - label: bfe, + id: Qx, + label: dZe, alias: "Increase Hover Verbosity Level", - precondition: I.hoverVisible + precondition: C.hoverVisible }); } run(e, t, i) { - const n = es.get(t); + const n = is.get(t); if (!n) return; const o = (i == null ? void 0 : i.index) !== void 0 ? i.index : n.focusedHoverPartIndex(); - n.updateHoverVerbosityLevel(io.Increase, o, i == null ? void 0 : i.focus); + n.updateHoverVerbosityLevel(so.Increase, o, i == null ? void 0 : i.focus); } } -class yCe extends he { +class a1e extends he { constructor() { super({ - id: kI, - label: yfe, + id: Ox, + label: aZe, alias: "Decrease Hover Verbosity Level", - precondition: I.hoverVisible + precondition: C.hoverVisible }); } run(e, t, i) { - var r; - const n = es.get(t); + var l; + const n = is.get(t); if (!n) return; const o = (i == null ? void 0 : i.index) !== void 0 ? i.index : n.focusedHoverPartIndex(); - (r = es.get(t)) == null || r.updateHoverVerbosityLevel(io.Decrease, o, i == null ? void 0 : i.focus); + (l = is.get(t)) == null || l.updateHoverVerbosityLevel(so.Decrease, o, i == null ? void 0 : i.focus); } } -var wCe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var h1e = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, OW = function(s, e) { +}, rN = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const Zr = ce; -class CCe { +const Rl = de; +class u1e { constructor(e, t, i) { this.owner = e, this.range = t, this.marker = i; } @@ -84809,78 +84809,78 @@ class CCe { return e.type === 1 && this.range.startColumn <= e.range.startColumn && this.range.endColumn >= e.range.endColumn; } } -const CP = { +const UK = { type: 1, - filter: { include: Jt.QuickFix }, + filter: { include: Bt.QuickFix }, triggerAction: fo.QuickFixHover }; -let fV = class { +let J9 = class { constructor(e, t, i, n) { this._editor = e, this._markerDecorationsService = t, this._openerService = i, this._languageFeaturesService = n, this.hoverOrdinal = 1, this.recentMarkerCodeActionsInfo = void 0; } computeSync(e, t) { if (!this._editor.hasModel() || e.type !== 1 && !e.supportsMarkerHover) return []; - const i = this._editor.getModel(), n = e.range.startLineNumber, o = i.getLineMaxColumn(n), r = []; - for (const l of t) { - const a = l.range.startLineNumber === n ? l.range.startColumn : 1, c = l.range.endLineNumber === n ? l.range.endColumn : o, d = this._markerDecorationsService.getMarker(i.uri, l); - if (!d) + const i = this._editor.getModel(), n = e.range.startLineNumber, o = i.getLineMaxColumn(n), l = []; + for (const r of t) { + const c = r.range.startLineNumber === n ? r.range.startColumn : 1, d = r.range.endLineNumber === n ? r.range.endColumn : o, a = this._markerDecorationsService.getMarker(i.uri, r); + if (!a) continue; - const h = new M(e.range.startLineNumber, a, e.range.startLineNumber, c); - r.push(new CCe(this, h, d)); + const h = new I(e.range.startLineNumber, c, e.range.startLineNumber, d); + l.push(new u1e(this, h, a)); } - return r; + return l; } renderHoverParts(e, t) { if (!t.length) - return new Zm([]); - const i = new U(), n = []; - t.forEach((r) => { - const l = this._renderMarkerHover(r); - e.fragment.appendChild(l.hoverElement), n.push(l); + return new wb([]); + const i = new _(), n = []; + t.forEach((l) => { + const r = this._renderMarkerHover(l); + e.fragment.appendChild(r.hoverElement), n.push(r); }); - const o = t.length === 1 ? t[0] : t.sort((r, l) => gi.compare(r.marker.severity, l.marker.severity))[0]; - return this.renderMarkerStatusbar(e, o, i), new Zm(n); + const o = t.length === 1 ? t[0] : t.sort((l, r) => bi.compare(l.marker.severity, r.marker.severity))[0]; + return this.renderMarkerStatusbar(e, o, i), new wb(n); } _renderMarkerHover(e) { - const t = new U(), i = Zr("div.hover-row"), n = Q(i, Zr("div.marker.hover-contents")), { source: o, message: r, code: l, relatedInformation: a } = e.marker; + const t = new _(), i = Rl("div.hover-row"), n = O(i, Rl("div.marker.hover-contents")), { source: o, message: l, code: r, relatedInformation: c } = e.marker; this._editor.applyFontInfo(n); - const c = Q(n, Zr("span")); - if (c.style.whiteSpace = "pre-wrap", c.innerText = r, o || l) - if (l && typeof l != "string") { - const h = Zr("span"); + const d = O(n, Rl("span")); + if (d.style.whiteSpace = "pre-wrap", d.innerText = l, o || r) + if (r && typeof r != "string") { + const h = Rl("span"); if (o) { - const f = Q(h, Zr("span")); - f.innerText = o; + const g = O(h, Rl("span")); + g.innerText = o; } - const u = Q(h, Zr("a.code-link")); - u.setAttribute("href", l.target.toString()), t.add(z(u, "click", (f) => { - this._openerService.open(l.target, { allowCommands: !0 }), f.preventDefault(), f.stopPropagation(); + const u = O(h, Rl("a.code-link")); + u.setAttribute("href", r.target.toString()), t.add(z(u, "click", (g) => { + this._openerService.open(r.target, { allowCommands: !0 }), g.preventDefault(), g.stopPropagation(); })); - const g = Q(u, Zr("span")); - g.innerText = l.value; - const m = Q(n, h); - m.style.opacity = "0.6", m.style.paddingLeft = "6px"; + const m = O(u, Rl("span")); + m.innerText = r.value; + const b = O(n, h); + b.style.opacity = "0.6", b.style.paddingLeft = "6px"; } else { - const h = Q(n, Zr("span")); - h.style.opacity = "0.6", h.style.paddingLeft = "6px", h.innerText = o && l ? `${o}(${l})` : o || `(${l})`; - } - if ($n(a)) - for (const { message: h, resource: u, startLineNumber: g, startColumn: m } of a) { - const f = Q(n, Zr("div")); - f.style.marginTop = "8px"; - const b = Q(f, Zr("a")); - b.innerText = `${Cr(u)}(${g}, ${m}): `, b.style.cursor = "pointer", t.add(z(b, "click", (w) => { - if (w.stopPropagation(), w.preventDefault(), this._openerService) { - const C = { selection: { startLineNumber: g, startColumn: m } }; + const h = O(n, Rl("span")); + h.style.opacity = "0.6", h.style.paddingLeft = "6px", h.innerText = o && r ? `${o}(${r})` : o || `(${r})`; + } + if (ts(c)) + for (const { message: h, resource: u, startLineNumber: m, startColumn: b } of c) { + const g = O(n, Rl("div")); + g.style.marginTop = "8px"; + const Z = O(g, Rl("a")); + Z.innerText = `${Vl(u)}(${m}, ${b}): `, Z.style.cursor = "pointer", t.add(z(Z, "click", (y) => { + if (y.stopPropagation(), y.preventDefault(), this._openerService) { + const W = { selection: { startLineNumber: m, startColumn: b } }; this._openerService.open(u, { fromUserGesture: !0, - editorOptions: C - }).catch(De); + editorOptions: W + }).catch(Me); } })); - const y = Q(f, Zr("span")); - y.innerText = h, this._editor.applyFontInfo(y); + const f = O(g, Rl("span")); + f.innerText = h, this._editor.applyFontInfo(f); } return { hoverPart: e, @@ -84889,11 +84889,11 @@ let fV = class { }; } renderMarkerStatusbar(e, t, i) { - if (t.marker.severity === gi.Error || t.marker.severity === gi.Warning || t.marker.severity === gi.Info) { - const n = Wm.get(this._editor); + if (t.marker.severity === bi.Error || t.marker.severity === bi.Warning || t.marker.severity === bi.Info) { + const n = kb.get(this._editor); n && e.statusBar.addAction({ label: p("view problem", "View Problem"), - commandId: lM.ID, + commandId: XI.ID, run: () => { e.hide(), n.showAtMarker(t.marker), this._editor.focus(); } @@ -84903,27 +84903,27 @@ let fV = class { 92 /* EditorOption.readOnly */ )) { - const n = e.statusBar.append(Zr("div")); - this.recentMarkerCodeActionsInfo && (xx.makeKey(this.recentMarkerCodeActionsInfo.marker) === xx.makeKey(t.marker) ? this.recentMarkerCodeActionsInfo.hasCodeActions || (n.textContent = p("noQuickFixes", "No quick fixes available")) : this.recentMarkerCodeActionsInfo = void 0); - const o = this.recentMarkerCodeActionsInfo && !this.recentMarkerCodeActionsInfo.hasCodeActions ? R.None : _h(() => n.textContent = p("checkingForQuickFixes", "Checking for quick fixes..."), 200, i); + const n = e.statusBar.append(Rl("div")); + this.recentMarkerCodeActionsInfo && (EL.makeKey(this.recentMarkerCodeActionsInfo.marker) === EL.makeKey(t.marker) ? this.recentMarkerCodeActionsInfo.hasCodeActions || (n.textContent = p("noQuickFixes", "No quick fixes available")) : this.recentMarkerCodeActionsInfo = void 0); + const o = this.recentMarkerCodeActionsInfo && !this.recentMarkerCodeActionsInfo.hasCodeActions ? J.None : wh(() => n.textContent = p("checkingForQuickFixes", "Checking for quick fixes..."), 200, i); n.textContent || (n.textContent = " "); - const r = this.getCodeActions(t.marker); - i.add(Ce(() => r.cancel())), r.then((l) => { - if (o.dispose(), this.recentMarkerCodeActionsInfo = { marker: t.marker, hasCodeActions: l.validActions.length > 0 }, !this.recentMarkerCodeActionsInfo.hasCodeActions) { - l.dispose(), n.textContent = p("noQuickFixes", "No quick fixes available"); + const l = this.getCodeActions(t.marker); + i.add(We(() => l.cancel())), l.then((r) => { + if (o.dispose(), this.recentMarkerCodeActionsInfo = { marker: t.marker, hasCodeActions: r.validActions.length > 0 }, !this.recentMarkerCodeActionsInfo.hasCodeActions) { + r.dispose(), n.textContent = p("noQuickFixes", "No quick fixes available"); return; } n.style.display = "none"; - let a = !1; - i.add(Ce(() => { - a || l.dispose(); + let c = !1; + i.add(We(() => { + c || r.dispose(); })), e.statusBar.addAction({ label: p("quick fixes", "Quick Fix..."), - commandId: i5, - run: (c) => { - a = !0; - const d = Mb.get(this._editor), h = yi(c); - e.hide(), d == null || d.showCodeActions(CP, l, { + commandId: xH, + run: (d) => { + c = !0; + const a = wZ.get(this._editor), h = yi(d); + e.hide(), a == null || a.showCodeActions(UK, r, { x: h.left, y: h.top, width: h.width, @@ -84931,19 +84931,19 @@ let fV = class { }); } }); - }, De); + }, Me); } } getCodeActions(e) { - return Ui((t) => Op(this._languageFeaturesService.codeActionProvider, this._editor.getModel(), new M(e.startLineNumber, e.startColumn, e.endLineNumber, e.endColumn), CP, xl.None, t)); + return Qi((t) => jp(this._languageFeaturesService.codeActionProvider, this._editor.getModel(), new I(e.startLineNumber, e.startColumn, e.endLineNumber, e.endColumn), UK, Cr.None, t)); } }; -fV = wCe([ - OW(1, vE), - OW(2, Bs), - OW(3, ge) -], fV); -class SCe { +J9 = h1e([ + rN(1, iJ), + rN(2, Ps), + rN(3, me) +], J9); +class m1e { get lineNumber() { return this._lineNumber; } @@ -84957,47 +84957,47 @@ class SCe { this._laneOrLine = e; } constructor(e) { - this._editor = e, this._lineNumber = -1, this._laneOrLine = Jr.Center; + this._editor = e, this._lineNumber = -1, this._laneOrLine = Ol.Center; } computeSync() { var o; - const e = (r) => ({ - value: r + const e = (l) => ({ + value: l }), t = this._editor.getLineDecorations(this._lineNumber), i = [], n = this._laneOrLine === "lineNo"; if (!t) return i; - for (const r of t) { - const l = ((o = r.options.glyphMargin) == null ? void 0 : o.position) ?? Jr.Center; - if (!n && l !== this._laneOrLine) + for (const l of t) { + const r = ((o = l.options.glyphMargin) == null ? void 0 : o.position) ?? Ol.Center; + if (!n && r !== this._laneOrLine) continue; - const a = n ? r.options.lineNumberHoverMessage : r.options.glyphMarginHoverMessage; - !a || Cb(a) || i.push(...LE(a).map(e)); + const c = n ? l.options.lineNumberHoverMessage : l.options.glyphMarginHoverMessage; + !c || SZ(c) || i.push(...Bv(c).map(e)); } return i; } } -var LCe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var b1e = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, SP = function(s, e) { +}, PK = function(s, e) { return function(t, i) { e(t, i, s); }; -}, bV; -const LP = ce; -var Og; -let yV = (Og = class extends R { +}, H9; +const BK = de; +var Om; +let E9 = (Om = class extends J { constructor(e, t, i) { - super(), this._renderDisposeables = this._register(new U()), this._editor = e, this._isVisible = !1, this._messages = [], this._hover = this._register(new a5()), this._hover.containerDomNode.classList.toggle("hidden", !this._isVisible), this._markdownRenderer = this._register(new Qc({ editor: this._editor }, t, i)), this._computer = new SCe(this._editor), this._hoverOperation = this._register(new yQ(this._editor, this._computer)), this._register(this._hoverOperation.onResult((n) => { + super(), this._renderDisposeables = this._register(new _()), this._editor = e, this._isVisible = !1, this._messages = [], this._hover = this._register(new MH()), this._hover.containerDomNode.classList.toggle("hidden", !this._isVisible), this._markdownRenderer = this._register(new ea({ editor: this._editor }, t, i)), this._computer = new m1e(this._editor), this._hoverOperation = this._register(new e4(this._editor, this._computer)), this._register(this._hoverOperation.onResult((n) => { this._withResult(n.value); })), this._register(this._editor.onDidChangeModelDecorations(() => this._onModelDecorationsChanged())), this._register(this._editor.onDidChangeConfiguration((n) => { n.hasChanged( 50 /* EditorOption.fontInfo */ ) && this._updateFont(); - })), this._register(ai(this._hover.containerDomNode, "mouseleave", (n) => { + })), this._register(di(this._hover.containerDomNode, "mouseleave", (n) => { this._onMouseLeave(n); })), this._editor.addOverlayWidget(this); } @@ -85005,7 +85005,7 @@ let yV = (Og = class extends R { this._editor.removeOverlayWidget(this), super.dispose(); } getId() { - return bV.ID; + return H9.ID; } getDomNode() { return this._hover.containerDomNode; @@ -85042,8 +85042,8 @@ let yV = (Og = class extends R { this._renderDisposeables.clear(); const i = document.createDocumentFragment(); for (const n of t) { - const o = LP("div.hover-row.markdown-hover"), r = Q(o, LP("div.hover-contents")), l = this._renderDisposeables.add(this._markdownRenderer.render(n.value)); - r.appendChild(l.element), i.appendChild(o); + const o = BK("div.hover-row.markdown-hover"), l = O(o, BK("div.hover-contents")), r = this._renderDisposeables.add(this._markdownRenderer.render(n.value)); + l.appendChild(r.element), i.appendChild(o); } this._updateContents(i), this._showAt(e); } @@ -85055,33 +85055,33 @@ let yV = (Og = class extends R { const t = this._editor.getLayoutInfo(), i = this._editor.getTopForLineNumber(e), n = this._editor.getScrollTop(), o = this._editor.getOption( 67 /* EditorOption.lineHeight */ - ), r = this._hover.containerDomNode.clientHeight, l = i - n - (r - o) / 2, a = t.glyphMarginLeft + t.glyphMarginWidth + (this._computer.lane === "lineNo" ? t.lineNumbersWidth : 0); - this._hover.containerDomNode.style.left = `${a}px`, this._hover.containerDomNode.style.top = `${Math.max(Math.round(l), 0)}px`; + ), l = this._hover.containerDomNode.clientHeight, r = i - n - (l - o) / 2, c = t.glyphMarginLeft + t.glyphMarginWidth + (this._computer.lane === "lineNo" ? t.lineNumbersWidth : 0); + this._hover.containerDomNode.style.left = `${c}px`, this._hover.containerDomNode.style.top = `${Math.max(Math.round(r), 0)}px`; } _onMouseLeave(e) { const t = this._editor.getDomNode(); - (!t || !GI(t, e.x, e.y)) && this.hide(); - } -}, bV = Og, Og.ID = "editor.contrib.modesGlyphHoverWidget", Og); -yV = bV = LCe([ - SP(1, ri), - SP(2, Bs) -], yV); -var ACe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; + (!t || !jx(t, e.x, e.y)) && this.hide(); + } +}, H9 = Om, Om.ID = "editor.contrib.modesGlyphHoverWidget", Om); +E9 = H9 = b1e([ + PK(1, ri), + PK(2, Ps) +], E9); +var p1e = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, xCe = function(s, e) { +}, g1e = function(s, e) { return function(t, i) { e(t, i, s); }; -}, qf; -let aM = (qf = class extends R { +}, sZ; +let VI = (sZ = class extends J { constructor(e, t) { - super(), this._editor = e, this._instantiationService = t, this.shouldKeepOpenOnEditorMouseMoveOrLeave = !1, this._listenersStore = new U(), this._hoverState = { + super(), this._editor = e, this._instantiationService = t, this.shouldKeepOpenOnEditorMouseMoveOrLeave = !1, this._listenersStore = new _(), this._hoverState = { mouseDown: !1 - }, this._reactToEditorMouseMoveRunner = this._register(new Zt(() => this._reactToEditorMouseMove(this._mouseMoveEvent), 0)), this._hookListeners(), this._register(this._editor.onDidChangeConfiguration((i) => { + }, this._reactToEditorMouseMoveRunner = this._register(new St(() => this._reactToEditorMouseMove(this._mouseMoveEvent), 0)), this._hookListeners(), this._register(this._editor.onDidChangeConfiguration((i) => { i.hasChanged( 60 /* EditorOption.hover */ @@ -85116,7 +85116,7 @@ let aM = (qf = class extends R { _isMouseOnMarginHoverWidget(e) { var i; const t = (i = this._glyphWidget) == null ? void 0 : i.getDomNode(); - return t ? GI(t, e.event.posx, e.event.posy) : !1; + return t ? jx(t, e.event.posx, e.event.posy) : !1; } _onEditorMouseUp() { this._hoverState.mouseDown = !1; @@ -85151,62 +85151,62 @@ let aM = (qf = class extends R { (e = this._glyphWidget) == null || e.hide(); } _getOrCreateGlyphWidget() { - return this._glyphWidget || (this._glyphWidget = this._instantiationService.createInstance(yV, this._editor)), this._glyphWidget; + return this._glyphWidget || (this._glyphWidget = this._instantiationService.createInstance(E9, this._editor)), this._glyphWidget; } dispose() { var e; super.dispose(), this._unhookListeners(), this._listenersStore.dispose(), (e = this._glyphWidget) == null || e.dispose(); } -}, qf.ID = "editor.contrib.marginHover", qf); -aM = ACe([ - xCe(1, Se) -], aM); -class MCe { +}, sZ.ID = "editor.contrib.marginHover", sZ); +VI = p1e([ + g1e(1, Ge) +], VI); +class Z1e { } -class ZCe { +class f1e { } -class _Ce { +class y1e { } -gt( - es.ID, - es, +mt( + is.ID, + is, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */ ); -gt( - aM.ID, - aM, +mt( + VI.ID, + VI, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */ ); -ee(lCe); -ee(aCe); -ee(cCe); -ee(dCe); -ee(hCe); -ee(uCe); -ee(gCe); -ee(mCe); -ee(pCe); -ee(fCe); -ee(bCe); -ee(yCe); -Om.register(T1); -Om.register(fV); -Lr((s, e) => { - const t = s.getColor(eU); +ee($Ge); +ee(e1e); +ee(t1e); +ee(i1e); +ee(n1e); +ee(s1e); +ee(o1e); +ee(l1e); +ee(r1e); +ee(c1e); +ee(d1e); +ee(a1e); +Ob.register(KW); +Ob.register(J9); +Il((s, e) => { + const t = s.getColor(v_); t && (e.addRule(`.monaco-editor .monaco-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${t.transparent(0.5)}; }`), e.addRule(`.monaco-editor .monaco-hover hr { border-top: 1px solid ${t.transparent(0.5)}; }`), e.addRule(`.monaco-editor .monaco-hover hr { border-bottom: 0px solid ${t.transparent(0.5)}; }`)); }); -qI.register(new MCe()); -qI.register(new ZCe()); -qI.register(new _Ce()); -function js(s, e) { +mC.register(new Z1e()); +mC.register(new f1e()); +mC.register(new y1e()); +function $s(s, e) { let t = 0; for (let i = 0; i < s.length; i++) s.charAt(i) === " " ? t += e : t++; return t; } -function qy(s, e, t) { +function dy(s, e, t) { s = s < 0 ? 0 : s; let i = ""; if (!t) { @@ -85219,50 +85219,50 @@ function qy(s, e, t) { i += " "; return i; } -function zj(s, e, t, i) { +function L7(s, e, t, i) { if (s.getLineCount() === 1 && s.getLineMaxColumn(1) === 1) return []; const n = e.getLanguageConfiguration(s.getLanguageId()).indentRulesSupport; if (!n) return []; - const o = new ME(s, n, e); + const o = new Ov(s, n, e); for (i = Math.min(i, s.getLineCount()); t <= i && o.shouldIgnore(t); ) t++; if (t > i - 1) return []; - const { tabSize: r, indentSize: l, insertSpaces: a } = s.getOptions(), c = (f, b) => (b = b || 1, wr.shiftIndent(f, f.length + b, r, l, a)), d = (f, b) => (b = b || 1, wr.unshiftIndent(f, f.length + b, r, l, a)), h = [], u = s.getLineContent(t); - let g = Nt(u), m = g; - o.shouldIncrease(t) ? (m = c(m), g = c(g)) : o.shouldIndentNextLine(t) && (m = c(m)), t++; - for (let f = t; f <= i; f++) { - if (ICe(s, f)) + const { tabSize: l, indentSize: r, insertSpaces: c } = s.getOptions(), d = (g, Z) => (Z = Z || 1, Xl.shiftIndent(g, g.length + Z, l, r, c)), a = (g, Z) => (Z = Z || 1, Xl.unshiftIndent(g, g.length + Z, l, r, c)), h = [], u = s.getLineContent(t); + let m = Rt(u), b = m; + o.shouldIncrease(t) ? (b = d(b), m = d(m)) : o.shouldIndentNextLine(t) && (b = d(b)), t++; + for (let g = t; g <= i; g++) { + if (W1e(s, g)) continue; - const b = s.getLineContent(f), y = Nt(b), w = m; - o.shouldDecrease(f, w) && (m = d(m), g = d(g)), y !== m && h.push(si.replaceMove(new fe(f, 1, f, y.length + 1), pE(m, l, a))), !o.shouldIgnore(f) && (o.shouldIncrease(f, w) ? (g = c(g), m = g) : o.shouldIndentNextLine(f, w) ? m = c(m) : m = g); + const Z = s.getLineContent(g), f = Rt(Z), y = b; + o.shouldDecrease(g, y) && (b = a(b), m = a(m)), f !== b && h.push(oi.replaceMove(new ge(g, 1, g, f.length + 1), Dv(b, r, c))), !o.shouldIgnore(g) && (o.shouldIncrease(g, y) ? (m = d(m), b = m) : o.shouldIndentNextLine(g, y) ? b = d(b) : b = m); } return h; } -function ICe(s, e) { +function W1e(s, e) { return s.tokenization.isCheapToTokenize(e) ? s.tokenization.getLineTokens(e).getStandardTokenType(0) === 2 : !1; } -var NCe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var G1e = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, WCe = function(s, e) { +}, X1e = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const OZ = class OZ extends he { +const lS = class lS extends he { constructor() { super({ - id: OZ.ID, + id: lS.ID, label: p("indentationToSpaces", "Convert Indentation to Spaces"), alias: "Convert Indentation to Spaces", - precondition: I.writable, + precondition: C.writable, metadata: { - description: Ie("indentationToSpacesDescription", "Convert the tab indentation to spaces.") + description: Ce("indentationToSpacesDescription", "Convert the tab indentation to spaces.") } }); } @@ -85273,23 +85273,23 @@ const OZ = class OZ extends he { const n = i.getOptions(), o = t.getSelection(); if (!o) return; - const r = new kCe(o, n.tabSize); - t.pushUndoStop(), t.executeCommands(this.id, [r]), t.pushUndoStop(), i.updateOptions({ + const l = new x1e(o, n.tabSize); + t.pushUndoStop(), t.executeCommands(this.id, [l]), t.pushUndoStop(), i.updateOptions({ insertSpaces: !0 }); } }; -OZ.ID = "editor.action.indentationToSpaces"; -let wV = OZ; -const HZ = class HZ extends he { +lS.ID = "editor.action.indentationToSpaces"; +let D9 = lS; +const rS = class rS extends he { constructor() { super({ - id: HZ.ID, + id: rS.ID, label: p("indentationToTabs", "Convert Indentation to Tabs"), alias: "Convert Indentation to Tabs", - precondition: I.writable, + precondition: C.writable, metadata: { - description: Ie("indentationToTabsDescription", "Convert the spaces indentation to tabs.") + description: Ce("indentationToTabsDescription", "Convert the spaces indentation to tabs.") } }); } @@ -85300,33 +85300,33 @@ const HZ = class HZ extends he { const n = i.getOptions(), o = t.getSelection(); if (!o) return; - const r = new GCe(o, n.tabSize); - t.pushUndoStop(), t.executeCommands(this.id, [r]), t.pushUndoStop(), i.updateOptions({ + const l = new C1e(o, n.tabSize); + t.pushUndoStop(), t.executeCommands(this.id, [l]), t.pushUndoStop(), i.updateOptions({ insertSpaces: !1 }); } }; -HZ.ID = "editor.action.indentationToTabs"; -let CV = HZ; -class U5 extends he { +rS.ID = "editor.action.indentationToTabs"; +let F9 = rS; +class yE extends he { constructor(e, t, i) { super(i), this.insertSpaces = e, this.displaySizeOnly = t; } run(e, t) { - const i = e.get(ld), n = e.get(Pt), o = t.getModel(); + const i = e.get(ha), n = e.get(At), o = t.getModel(); if (!o) return; - const r = n.getCreationOptions(o.getLanguageId(), o.uri, o.isForSimpleWidget), l = o.getOptions(), a = [1, 2, 3, 4, 5, 6, 7, 8].map((d) => ({ - id: d.toString(), - label: d.toString(), + const l = n.getCreationOptions(o.getLanguageId(), o.uri, o.isForSimpleWidget), r = o.getOptions(), c = [1, 2, 3, 4, 5, 6, 7, 8].map((a) => ({ + id: a.toString(), + label: a.toString(), // add description for tabSize value set in the configuration - description: d === r.tabSize && d === l.tabSize ? p("configuredTabSize", "Configured Tab Size") : d === r.tabSize ? p("defaultTabSize", "Default Tab Size") : d === l.tabSize ? p("currentTabSize", "Current Tab Size") : void 0 - })), c = Math.min(o.getOptions().tabSize - 1, 7); + description: a === l.tabSize && a === r.tabSize ? p("configuredTabSize", "Configured Tab Size") : a === l.tabSize ? p("defaultTabSize", "Default Tab Size") : a === r.tabSize ? p("currentTabSize", "Current Tab Size") : void 0 + })), d = Math.min(o.getOptions().tabSize - 1, 7); setTimeout( () => { - i.pick(a, { placeHolder: p({ key: "selectTabWidth", comment: ["Tab corresponds to the tab key"] }, "Select Tab Size for Current File"), activeItem: a[c] }).then((d) => { - if (d && o && !o.isDisposed()) { - const h = parseInt(d.label, 10); + i.pick(c, { placeHolder: p({ key: "selectTabWidth", comment: ["Tab corresponds to the tab key"] }, "Select Tab Size for Current File"), activeItem: c[d] }).then((a) => { + if (a && o && !o.isDisposed()) { + const h = parseInt(a.label, 10); this.displaySizeOnly ? o.updateOptions({ tabSize: h }) : o.updateOptions({ @@ -85342,127 +85342,127 @@ class U5 extends he { ); } } -const JZ = class JZ extends U5 { +const cS = class cS extends yE { constructor() { super(!1, !1, { - id: JZ.ID, + id: cS.ID, label: p("indentUsingTabs", "Indent Using Tabs"), alias: "Indent Using Tabs", precondition: void 0, metadata: { - description: Ie("indentUsingTabsDescription", "Use indentation with tabs.") + description: Ce("indentUsingTabsDescription", "Use indentation with tabs.") } }); } }; -JZ.ID = "editor.action.indentUsingTabs"; -let SV = JZ; -const UZ = class UZ extends U5 { +cS.ID = "editor.action.indentUsingTabs"; +let z9 = cS; +const dS = class dS extends yE { constructor() { super(!0, !1, { - id: UZ.ID, + id: dS.ID, label: p("indentUsingSpaces", "Indent Using Spaces"), alias: "Indent Using Spaces", precondition: void 0, metadata: { - description: Ie("indentUsingSpacesDescription", "Use indentation with spaces.") + description: Ce("indentUsingSpacesDescription", "Use indentation with spaces.") } }); } }; -UZ.ID = "editor.action.indentUsingSpaces"; -let LV = UZ; -const KZ = class KZ extends U5 { +dS.ID = "editor.action.indentUsingSpaces"; +let A9 = dS; +const aS = class aS extends yE { constructor() { super(!0, !0, { - id: KZ.ID, + id: aS.ID, label: p("changeTabDisplaySize", "Change Tab Display Size"), alias: "Change Tab Display Size", precondition: void 0, metadata: { - description: Ie("changeTabDisplaySizeDescription", "Change the space size equivalent of the tab.") + description: Ce("changeTabDisplaySizeDescription", "Change the space size equivalent of the tab.") } }); } }; -KZ.ID = "editor.action.changeTabDisplaySize"; -let AV = KZ; -const QZ = class QZ extends he { +aS.ID = "editor.action.changeTabDisplaySize"; +let K9 = aS; +const hS = class hS extends he { constructor() { super({ - id: QZ.ID, + id: hS.ID, label: p("detectIndentation", "Detect Indentation from Content"), alias: "Detect Indentation from Content", precondition: void 0, metadata: { - description: Ie("detectIndentationDescription", "Detect the indentation from content.") + description: Ce("detectIndentationDescription", "Detect the indentation from content.") } }); } run(e, t) { - const i = e.get(Pt), n = t.getModel(); + const i = e.get(At), n = t.getModel(); if (!n) return; const o = i.getCreationOptions(n.getLanguageId(), n.uri, n.isForSimpleWidget); n.detectIndentation(o.insertSpaces, o.tabSize); } }; -QZ.ID = "editor.action.detectIndentation"; -let xV = QZ; -class vCe extends he { +hS.ID = "editor.action.detectIndentation"; +let U9 = hS; +class V1e extends he { constructor() { super({ id: "editor.action.reindentlines", label: p("editor.reindentlines", "Reindent Lines"), alias: "Reindent Lines", - precondition: I.writable, + precondition: C.writable, metadata: { - description: Ie("editor.reindentlinesDescription", "Reindent the lines of the editor.") + description: Ce("editor.reindentlinesDescription", "Reindent the lines of the editor.") } }); } run(e, t) { - const i = e.get(li), n = t.getModel(); + const i = e.get(ci), n = t.getModel(); if (!n) return; - const o = zj(n, i, 1, n.getLineCount()); + const o = L7(n, i, 1, n.getLineCount()); o.length > 0 && (t.pushUndoStop(), t.executeEdits(this.id, o), t.pushUndoStop()); } } -class TCe extends he { +class L1e extends he { constructor() { super({ id: "editor.action.reindentselectedlines", label: p("editor.reindentselectedlines", "Reindent Selected Lines"), alias: "Reindent Selected Lines", - precondition: I.writable, + precondition: C.writable, metadata: { - description: Ie("editor.reindentselectedlinesDescription", "Reindent the selected lines of the editor.") + description: Ce("editor.reindentselectedlinesDescription", "Reindent the selected lines of the editor.") } }); } run(e, t) { - const i = e.get(li), n = t.getModel(); + const i = e.get(ci), n = t.getModel(); if (!n) return; const o = t.getSelections(); if (o === null) return; - const r = []; - for (const l of o) { - let a = l.startLineNumber, c = l.endLineNumber; - if (a !== c && l.endColumn === 1 && c--, a === 1) { - if (a === c) + const l = []; + for (const r of o) { + let c = r.startLineNumber, d = r.endLineNumber; + if (c !== d && r.endColumn === 1 && d--, c === 1) { + if (c === d) continue; } else - a--; - const d = zj(n, i, a, c); - r.push(...d); + c--; + const a = L7(n, i, c, d); + l.push(...a); } - r.length > 0 && (t.pushUndoStop(), t.executeEdits(this.id, r), t.pushUndoStop()); + l.length > 0 && (t.pushUndoStop(), t.executeEdits(this.id, l), t.pushUndoStop()); } } -class DCe { +class I1e { constructor(e, t) { this._initialSelection = t, this._edits = [], this._selectionId = null; for (const i of e) @@ -85470,7 +85470,7 @@ class DCe { } getEditOperations(e, t) { for (const n of this._edits) - t.addEditOperation(M.lift(n.range), n.text); + t.addEditOperation(I.lift(n.range), n.text); let i = !1; Array.isArray(this._edits) && this._edits.length === 1 && this._initialSelection.isEmpty() && (this._edits[0].range.startColumn === this._initialSelection.endColumn && this._edits[0].range.startLineNumber === this._initialSelection.endLineNumber ? (i = !0, this._selectionId = t.trackSelection(this._initialSelection, !0)) : this._edits[0].range.endColumn === this._initialSelection.startColumn && this._edits[0].range.endLineNumber === this._initialSelection.startLineNumber && (i = !0, this._selectionId = t.trackSelection(this._initialSelection, !1))), i || (this._selectionId = t.trackSelection(this._initialSelection)); } @@ -85478,10 +85478,10 @@ class DCe { return t.getTrackedSelection(this._selectionId); } } -var $f; -let cM = ($f = class { +var oZ; +let LI = (oZ = class { constructor(e, t) { - this.editor = e, this._languageConfigurationService = t, this.callOnDispose = new U(), this.callOnModel = new U(), this.callOnDispose.add(e.onDidChangeConfiguration(() => this.update())), this.callOnDispose.add(e.onDidChangeModel(() => this.update())), this.callOnDispose.add(e.onDidChangeModelLanguage(() => this.update())); + this.editor = e, this._languageConfigurationService = t, this.callOnDispose = new _(), this.callOnModel = new _(), this.callOnDispose.add(e.onDidChangeConfiguration(() => this.update())), this.callOnDispose.add(e.onDidChangeModel(() => this.update())), this.callOnDispose.add(e.onDidChangeModelLanguage(() => this.update())); } update() { this.callOnModel.clear(), !(this.editor.getOption( @@ -85499,14 +85499,14 @@ let cM = ($f = class { if (t === null || t.length > 1) return; const i = this.editor.getModel(); - if (!i || this.rangeContainsOnlyWhitespaceCharacters(i, e) || VCe(i, e) || !i.tokenization.isCheapToTokenize(e.getStartPosition().lineNumber)) + if (!i || this.rangeContainsOnlyWhitespaceCharacters(i, e) || S1e(i, e) || !i.tokenization.isCheapToTokenize(e.getStartPosition().lineNumber)) return; const o = this.editor.getOption( 12 /* EditorOption.autoIndent */ - ), { tabSize: r, indentSize: l, insertSpaces: a } = i.getOptions(), c = [], d = { - shiftIndent: (m) => wr.shiftIndent(m, m.length + 1, r, l, a), - unshiftIndent: (m) => wr.unshiftIndent(m, m.length + 1, r, l, a) + ), { tabSize: l, indentSize: r, insertSpaces: c } = i.getOptions(), d = [], a = { + shiftIndent: (b) => Xl.shiftIndent(b, b.length + 1, l, r, c), + unshiftIndent: (b) => Xl.unshiftIndent(b, b.length + 1, l, r, c) }; let h = e.startLineNumber; for (; h <= e.endLineNumber; ) { @@ -85520,23 +85520,23 @@ let cM = ($f = class { return; let u = i.getLineContent(h); if (!/\S/.test(u.substring(0, e.startColumn - 1))) { - const m = Ny(o, i, i.getLanguageId(), h, d, this._languageConfigurationService); - if (m !== null) { - const f = Nt(u), b = js(m, r), y = js(f, r); - if (b !== y) { - const w = qy(b, r, a); - c.push({ - range: new M(h, 1, h, f.length + 1), - text: w - }), u = w + u.substring(f.length); + const b = Df(o, i, i.getLanguageId(), h, a, this._languageConfigurationService); + if (b !== null) { + const g = Rt(u), Z = $s(b, l), f = $s(g, l); + if (Z !== f) { + const y = dy(Z, l, c); + d.push({ + range: new I(h, 1, h, g.length + 1), + text: y + }), u = y + u.substring(g.length); } else { - const w = EJ(i, h, this._languageConfigurationService); - if (w === 0 || w === 8) + const y = W_(i, h, this._languageConfigurationService); + if (y === 0 || y === 8) return; } } } - const g = h; + const m = h; for (; h < e.endLineNumber; ) { if (!/\S/.test(i.getLineContent(h + 1))) { h++; @@ -85545,49 +85545,49 @@ let cM = ($f = class { break; } if (h !== e.endLineNumber) { - const f = Ny(o, { + const g = Df(o, { tokenization: { - getLineTokens: (b) => i.tokenization.getLineTokens(b), + getLineTokens: (Z) => i.tokenization.getLineTokens(Z), getLanguageId: () => i.getLanguageId(), - getLanguageIdAtPosition: (b, y) => i.getLanguageIdAtPosition(b, y) + getLanguageIdAtPosition: (Z, f) => i.getLanguageIdAtPosition(Z, f) }, - getLineContent: (b) => b === g ? u : i.getLineContent(b) - }, i.getLanguageId(), h + 1, d, this._languageConfigurationService); - if (f !== null) { - const b = js(f, r), y = js(Nt(i.getLineContent(h + 1)), r); - if (b !== y) { - const w = b - y; - for (let C = h + 1; C <= e.endLineNumber; C++) { - const S = i.getLineContent(C), L = Nt(S), Z = js(L, r) + w, _ = qy(Z, r, a); - _ !== L && c.push({ - range: new M(C, 1, C, L.length + 1), - text: _ + getLineContent: (Z) => Z === m ? u : i.getLineContent(Z) + }, i.getLanguageId(), h + 1, a, this._languageConfigurationService); + if (g !== null) { + const Z = $s(g, l), f = $s(Rt(i.getLineContent(h + 1)), l); + if (Z !== f) { + const y = Z - f; + for (let W = h + 1; W <= e.endLineNumber; W++) { + const G = i.getLineContent(W), X = Rt(G), S = $s(X, l) + y, x = dy(S, l, c); + x !== X && d.push({ + range: new I(W, 1, W, X.length + 1), + text: x }); } } } } - if (c.length > 0) { + if (d.length > 0) { this.editor.pushUndoStop(); - const m = new DCe(c, this.editor.getSelection()); - this.editor.executeCommand("autoIndentOnPaste", m), this.editor.pushUndoStop(); + const b = new I1e(d, this.editor.getSelection()); + this.editor.executeCommand("autoIndentOnPaste", b), this.editor.pushUndoStop(); } } rangeContainsOnlyWhitespaceCharacters(e, t) { const i = (o) => o.trim().length === 0; let n = !0; if (t.startLineNumber === t.endLineNumber) { - const r = e.getLineContent(t.startLineNumber).substring(t.startColumn - 1, t.endColumn - 1); - n = i(r); + const l = e.getLineContent(t.startLineNumber).substring(t.startColumn - 1, t.endColumn - 1); + n = i(l); } else for (let o = t.startLineNumber; o <= t.endLineNumber; o++) { - const r = e.getLineContent(o); + const l = e.getLineContent(o); if (o === t.startLineNumber) { - const l = r.substring(t.startColumn - 1); - n = i(l); + const r = l.substring(t.startColumn - 1); + n = i(r); } else if (o === t.endLineNumber) { - const l = r.substring(0, t.endColumn - 1); - n = i(l); + const r = l.substring(0, t.endColumn - 1); + n = i(r); } else n = e.getLineFirstNonWhitespaceColumn(o) === 0; if (!n) @@ -85611,73 +85611,73 @@ let cM = ($f = class { dispose() { this.callOnDispose.dispose(), this.callOnModel.dispose(); } -}, $f.ID = "editor.contrib.autoIndentOnPaste", $f); -cM = NCe([ - WCe(1, li) -], cM); -function VCe(s, e) { - const t = (i) => Oee(s, i) === 2; +}, oZ.ID = "editor.contrib.autoIndentOnPaste", oZ); +LI = G1e([ + X1e(1, ci) +], LI); +function S1e(s, e) { + const t = (i) => Jte(s, i) === 2; return t(e.getStartPosition()) || t(e.getEndPosition()); } -function Pj(s, e, t, i) { +function I7(s, e, t, i) { if (s.getLineCount() === 1 && s.getLineMaxColumn(1) === 1) return; let n = ""; - for (let r = 0; r < t; r++) + for (let l = 0; l < t; l++) n += " "; const o = new RegExp(n, "gi"); - for (let r = 1, l = s.getLineCount(); r <= l; r++) { - let a = s.getLineFirstNonWhitespaceColumn(r); - if (a === 0 && (a = s.getLineMaxColumn(r)), a === 1) + for (let l = 1, r = s.getLineCount(); l <= r; l++) { + let c = s.getLineFirstNonWhitespaceColumn(l); + if (c === 0 && (c = s.getLineMaxColumn(l)), c === 1) continue; - const c = new M(r, 1, r, a), d = s.getValueInRange(c), h = i ? d.replace(/\t/ig, n) : d.replace(o, " "); - e.addEditOperation(c, h); + const d = new I(l, 1, l, c), a = s.getValueInRange(d), h = i ? a.replace(/\t/ig, n) : a.replace(o, " "); + e.addEditOperation(d, h); } } -class kCe { +class x1e { constructor(e, t) { this.selection = e, this.tabSize = t, this.selectionId = null; } getEditOperations(e, t) { - this.selectionId = t.trackSelection(this.selection), Pj(e, t, this.tabSize, !0); + this.selectionId = t.trackSelection(this.selection), I7(e, t, this.tabSize, !0); } computeCursorState(e, t) { return t.getTrackedSelection(this.selectionId); } } -class GCe { +class C1e { constructor(e, t) { this.selection = e, this.tabSize = t, this.selectionId = null; } getEditOperations(e, t) { - this.selectionId = t.trackSelection(this.selection), Pj(e, t, this.tabSize, !1); + this.selectionId = t.trackSelection(this.selection), I7(e, t, this.tabSize, !1); } computeCursorState(e, t) { return t.getTrackedSelection(this.selectionId); } } -gt( - cM.ID, - cM, +mt( + LI.ID, + LI, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */ ); -ee(wV); -ee(CV); -ee(SV); -ee(LV); -ee(AV); -ee(xV); -ee(vCe); -ee(TCe); -gt( - E1.ID, - E1, +ee(D9); +ee(F9); +ee(z9); +ee(A9); +ee(K9); +ee(U9); +ee(V1e); +ee(L1e); +mt( + OW.ID, + OW, 1 /* EditorContributionInstantiation.AfterFirstRender */ ); -Om.register(zx); -class RCe { +Ob.register(nI); +class R1e { constructor(e, t, i) { this._editRange = e, this._originalSelection = t, this._text = i; } @@ -85686,22 +85686,22 @@ class RCe { } computeCursorState(e, t) { const n = t.getInverseEditOperations()[0].range; - return this._originalSelection.isEmpty() ? new fe(n.endLineNumber, Math.min(this._originalSelection.positionColumn, n.endColumn), n.endLineNumber, Math.min(this._originalSelection.positionColumn, n.endColumn)) : new fe(n.endLineNumber, n.endColumn - this._text.length, n.endLineNumber, n.endColumn); + return this._originalSelection.isEmpty() ? new ge(n.endLineNumber, Math.min(this._originalSelection.positionColumn, n.endColumn), n.endLineNumber, Math.min(this._originalSelection.positionColumn, n.endColumn)) : new ge(n.endLineNumber, n.endColumn - this._text.length, n.endLineNumber, n.endColumn); } } -var ECe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var N1e = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, XCe = function(s, e) { +}, w1e = function(s, e) { return function(t, i) { e(t, i, s); }; -}, XL, wh; -let Rb = (wh = class { +}, eV, Vh; +let AZ = (Vh = class { static get(e) { - return e.getContribution(XL.ID); + return e.getContribution(eV.ID); } constructor(e, t) { this.editor = e, this.editorWorkerService = t, this.decorations = this.editor.createDecorationsCollection(); @@ -85709,55 +85709,55 @@ let Rb = (wh = class { dispose() { } run(e, t) { - var a; - (a = this.currentRequest) == null || a.cancel(); + var c; + (c = this.currentRequest) == null || c.cancel(); const i = this.editor.getSelection(), n = this.editor.getModel(); if (!n || !i) return; let o = i; if (o.startLineNumber !== o.endLineNumber) return; - const r = new k4( + const l = new Zj( this.editor, 5 /* CodeEditorStateFlag.Position */ - ), l = n.uri; - return this.editorWorkerService.canNavigateValueSet(l) ? (this.currentRequest = Ui((c) => this.editorWorkerService.navigateValueSet(l, o, t)), this.currentRequest.then((c) => { - var m; - if (!c || !c.range || !c.value || !r.validate(this.editor)) + ), r = n.uri; + return this.editorWorkerService.canNavigateValueSet(r) ? (this.currentRequest = Qi((d) => this.editorWorkerService.navigateValueSet(r, o, t)), this.currentRequest.then((d) => { + var b; + if (!d || !d.range || !d.value || !l.validate(this.editor)) return; - const d = M.lift(c.range); - let h = c.range; - const u = c.value.length - (o.endColumn - o.startColumn); + const a = I.lift(d.range); + let h = d.range; + const u = d.value.length - (o.endColumn - o.startColumn); h = { startLineNumber: h.startLineNumber, startColumn: h.startColumn, endLineNumber: h.endLineNumber, - endColumn: h.startColumn + c.value.length - }, u > 1 && (o = new fe(o.startLineNumber, o.startColumn, o.endLineNumber, o.endColumn + u - 1)); - const g = new RCe(d, o, c.value); - this.editor.pushUndoStop(), this.editor.executeCommand(e, g), this.editor.pushUndoStop(), this.decorations.set([{ + endColumn: h.startColumn + d.value.length + }, u > 1 && (o = new ge(o.startLineNumber, o.startColumn, o.endLineNumber, o.endColumn + u - 1)); + const m = new R1e(a, o, d.value); + this.editor.pushUndoStop(), this.editor.executeCommand(e, m), this.editor.pushUndoStop(), this.decorations.set([{ range: h, - options: XL.DECORATION - }]), (m = this.decorationRemover) == null || m.cancel(), this.decorationRemover = Zh(350), this.decorationRemover.then(() => this.decorations.clear()).catch(De); - }).catch(De)) : Promise.resolve(void 0); + options: eV.DECORATION + }]), (b = this.decorationRemover) == null || b.cancel(), this.decorationRemover = Nh(350), this.decorationRemover.then(() => this.decorations.clear()).catch(Me); + }).catch(Me)) : Promise.resolve(void 0); } -}, XL = wh, wh.ID = "editor.contrib.inPlaceReplaceController", wh.DECORATION = Re.register({ +}, eV = Vh, Vh.ID = "editor.contrib.inPlaceReplaceController", Vh.DECORATION = Je.register({ description: "in-place-replace", className: "valueSetReplacement" -}), wh); -Rb = XL = ECe([ - XCe(1, Ps) -], Rb); -class FCe extends he { +}), Vh); +AZ = eV = N1e([ + w1e(1, Us) +], AZ); +class T1e extends he { constructor() { super({ id: "editor.action.inPlaceReplace.up", label: p("InPlaceReplaceAction.previous.label", "Replace with Previous Value"), alias: "Replace with Previous Value", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 3159, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -85765,19 +85765,19 @@ class FCe extends he { }); } run(e, t) { - const i = Rb.get(t); + const i = AZ.get(t); return i ? i.run(this.id, !1) : Promise.resolve(void 0); } } -class YCe extends he { +class M1e extends he { constructor() { super({ id: "editor.action.inPlaceReplace.down", label: p("InPlaceReplaceAction.next.label", "Replace with Next Value"), alias: "Replace with Next Value", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 3161, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -85785,19 +85785,19 @@ class YCe extends he { }); } run(e, t) { - const i = Rb.get(t); + const i = AZ.get(t); return i ? i.run(this.id, !0) : Promise.resolve(void 0); } } -gt( - Rb.ID, - Rb, +mt( + AZ.ID, + AZ, 4 /* EditorContributionInstantiation.Lazy */ ); -ee(FCe); -ee(YCe); -class zCe extends he { +ee(T1e); +ee(M1e); +class Y1e extends he { constructor() { super({ id: "expandLineSelection", @@ -85806,7 +85806,7 @@ class zCe extends he { precondition: void 0, kbOpts: { weight: 0, - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 2090 /* KeyCode.KeyL */ } @@ -85816,19 +85816,19 @@ class zCe extends he { if (i = i || {}, !t.hasModel()) return; const n = t._getViewModel(); - n.model.pushStackElement(), n.setCursorStates(i.source, 3, cn.expandLineSelection(n, n.getCursorStates())), n.revealAllCursors(i.source, !0); + n.model.pushStackElement(), n.setCursorStates(i.source, 3, an.expandLineSelection(n, n.getCursorStates())), n.revealAllCursors(i.source, !0); } } -ee(zCe); -class PCe { +ee(Y1e); +class k1e { constructor(e, t, i) { this._selection = e, this._cursors = t, this._selectionId = null, this._trimInRegexesAndStrings = i; } getEditOperations(e, t) { - const i = BCe(e, this._cursors, this._trimInRegexesAndStrings); + const i = v1e(e, this._cursors, this._trimInRegexesAndStrings); for (let n = 0, o = i.length; n < o; n++) { - const r = i[n]; - t.addEditOperation(r.range, r.text); + const l = i[n]; + t.addEditOperation(l.range, l.text); } this._selectionId = t.trackSelection(this._selection); } @@ -85836,38 +85836,38 @@ class PCe { return t.getTrackedSelection(this._selectionId); } } -function BCe(s, e, t) { - e.sort((l, a) => l.lineNumber === a.lineNumber ? l.column - a.column : l.lineNumber - a.lineNumber); - for (let l = e.length - 2; l >= 0; l--) - e[l].lineNumber === e[l + 1].lineNumber && e.splice(l, 1); +function v1e(s, e, t) { + e.sort((r, c) => r.lineNumber === c.lineNumber ? r.column - c.column : r.lineNumber - c.lineNumber); + for (let r = e.length - 2; r >= 0; r--) + e[r].lineNumber === e[r + 1].lineNumber && e.splice(r, 1); const i = []; let n = 0, o = 0; - const r = e.length; - for (let l = 1, a = s.getLineCount(); l <= a; l++) { - const c = s.getLineContent(l), d = c.length + 1; + const l = e.length; + for (let r = 1, c = s.getLineCount(); r <= c; r++) { + const d = s.getLineContent(r), a = d.length + 1; let h = 0; - if (o < r && e[o].lineNumber === l && (h = e[o].column, o++, h === d) || c.length === 0) + if (o < l && e[o].lineNumber === r && (h = e[o].column, o++, h === a) || d.length === 0) continue; - const u = Ml(c); - let g = 0; + const u = Rr(d); + let m = 0; if (u === -1) - g = 1; - else if (u !== c.length - 1) - g = u + 2; + m = 1; + else if (u !== d.length - 1) + m = u + 2; else continue; if (!t) { - if (!s.tokenization.hasAccurateTokensForLine(l)) + if (!s.tokenization.hasAccurateTokensForLine(r)) continue; - const m = s.tokenization.getLineTokens(l), f = m.getStandardTokenType(m.findTokenIndexAtOffset(g)); - if (f === 2 || f === 3) + const b = s.tokenization.getLineTokens(r), g = b.getStandardTokenType(b.findTokenIndexAtOffset(m)); + if (g === 2 || g === 3) continue; } - g = Math.max(h, g), i[n++] = si.delete(new M(l, g, l, d)); + m = Math.max(h, m), i[n++] = oi.delete(new I(r, m, r, a)); } return i; } -class Bj { +class S7 { constructor(e, t, i) { this._selection = e, this._isCopyingDown = t, this._noop = i || !1, this._selectionDirection = 0, this._selectionId = null, this._startLineNumberDelta = 0, this._endLineNumberDelta = 0; } @@ -85875,35 +85875,35 @@ class Bj { let i = this._selection; this._startLineNumberDelta = 0, this._endLineNumberDelta = 0, i.startLineNumber < i.endLineNumber && i.endColumn === 1 && (this._endLineNumberDelta = 1, i = i.setEndPosition(i.endLineNumber - 1, e.getLineMaxColumn(i.endLineNumber - 1))); const n = []; - for (let r = i.startLineNumber; r <= i.endLineNumber; r++) - n.push(e.getLineContent(r)); + for (let l = i.startLineNumber; l <= i.endLineNumber; l++) + n.push(e.getLineContent(l)); const o = n.join(` `); - o === "" && this._isCopyingDown && (this._startLineNumberDelta++, this._endLineNumberDelta++), this._noop ? t.addEditOperation(new M(i.endLineNumber, e.getLineMaxColumn(i.endLineNumber), i.endLineNumber + 1, 1), i.endLineNumber === e.getLineCount() ? "" : ` -`) : this._isCopyingDown ? t.addEditOperation(new M(i.startLineNumber, 1, i.startLineNumber, 1), o + ` -`) : t.addEditOperation(new M(i.endLineNumber, e.getLineMaxColumn(i.endLineNumber), i.endLineNumber, e.getLineMaxColumn(i.endLineNumber)), ` + o === "" && this._isCopyingDown && (this._startLineNumberDelta++, this._endLineNumberDelta++), this._noop ? t.addEditOperation(new I(i.endLineNumber, e.getLineMaxColumn(i.endLineNumber), i.endLineNumber + 1, 1), i.endLineNumber === e.getLineCount() ? "" : ` +`) : this._isCopyingDown ? t.addEditOperation(new I(i.startLineNumber, 1, i.startLineNumber, 1), o + ` +`) : t.addEditOperation(new I(i.endLineNumber, e.getLineMaxColumn(i.endLineNumber), i.endLineNumber, e.getLineMaxColumn(i.endLineNumber)), ` ` + o), this._selectionId = t.trackSelection(i), this._selectionDirection = this._selection.getDirection(); } computeCursorState(e, t) { let i = t.getTrackedSelection(this._selectionId); if (this._startLineNumberDelta !== 0 || this._endLineNumberDelta !== 0) { - let n = i.startLineNumber, o = i.startColumn, r = i.endLineNumber, l = i.endColumn; - this._startLineNumberDelta !== 0 && (n = n + this._startLineNumberDelta, o = 1), this._endLineNumberDelta !== 0 && (r = r + this._endLineNumberDelta, l = 1), i = fe.createWithDirection(n, o, r, l, this._selectionDirection); + let n = i.startLineNumber, o = i.startColumn, l = i.endLineNumber, r = i.endColumn; + this._startLineNumberDelta !== 0 && (n = n + this._startLineNumberDelta, o = 1), this._endLineNumberDelta !== 0 && (l = l + this._endLineNumberDelta, r = 1), i = ge.createWithDirection(n, o, l, r, this._selectionDirection); } return i; } } -var OCe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var J1e = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, HCe = function(s, e) { +}, H1e = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let MV = class { +let P9 = class { constructor(e, t, i, n) { this._languageConfigurationService = n, this._selection = e, this._isMovingDown = t, this._autoIndent = i, this._selectionId = null, this._moveEndLineSelectionShrink = !1; } @@ -85918,104 +85918,104 @@ let MV = class { return; } this._moveEndPositionDown = !1; - let r = this._selection; - r.startLineNumber < r.endLineNumber && r.endColumn === 1 && (this._moveEndPositionDown = !0, r = r.setEndPosition(r.endLineNumber - 1, e.getLineMaxColumn(r.endLineNumber - 1))); - const { tabSize: l, indentSize: a, insertSpaces: c } = e.getOptions(), d = this.buildIndentConverter(l, a, c); - if (r.startLineNumber === r.endLineNumber && e.getLineMaxColumn(r.startLineNumber) === 1) { - const h = r.startLineNumber, u = this._isMovingDown ? h + 1 : h - 1; - e.getLineMaxColumn(u) === 1 ? t.addEditOperation(new M(1, 1, 1, 1), null) : (t.addEditOperation(new M(h, 1, h, 1), e.getLineContent(u)), t.addEditOperation(new M(u, 1, u, e.getLineMaxColumn(u)), null)), r = new fe(u, 1, u, 1); + let l = this._selection; + l.startLineNumber < l.endLineNumber && l.endColumn === 1 && (this._moveEndPositionDown = !0, l = l.setEndPosition(l.endLineNumber - 1, e.getLineMaxColumn(l.endLineNumber - 1))); + const { tabSize: r, indentSize: c, insertSpaces: d } = e.getOptions(), a = this.buildIndentConverter(r, c, d); + if (l.startLineNumber === l.endLineNumber && e.getLineMaxColumn(l.startLineNumber) === 1) { + const h = l.startLineNumber, u = this._isMovingDown ? h + 1 : h - 1; + e.getLineMaxColumn(u) === 1 ? t.addEditOperation(new I(1, 1, 1, 1), null) : (t.addEditOperation(new I(h, 1, h, 1), e.getLineContent(u)), t.addEditOperation(new I(u, 1, u, e.getLineMaxColumn(u)), null)), l = new ge(u, 1, u, 1); } else { let h, u; if (this._isMovingDown) { - h = r.endLineNumber + 1, u = e.getLineContent(h), t.addEditOperation(new M(h - 1, e.getLineMaxColumn(h - 1), h, e.getLineMaxColumn(h)), null); - let g = u; - if (this.shouldAutoIndent(e, r)) { - const m = this.matchEnterRule(e, d, l, h, r.startLineNumber - 1); - if (m !== null) { - const b = Nt(e.getLineContent(h)), y = m + js(b, l); - g = qy(y, l, c) + this.trimStart(u); + h = l.endLineNumber + 1, u = e.getLineContent(h), t.addEditOperation(new I(h - 1, e.getLineMaxColumn(h - 1), h, e.getLineMaxColumn(h)), null); + let m = u; + if (this.shouldAutoIndent(e, l)) { + const b = this.matchEnterRule(e, a, r, h, l.startLineNumber - 1); + if (b !== null) { + const Z = Rt(e.getLineContent(h)), f = b + $s(Z, r); + m = dy(f, r, d) + this.trimStart(u); } else { - const b = { + const Z = { tokenization: { - getLineTokens: (w) => w === r.startLineNumber ? e.tokenization.getLineTokens(h) : e.tokenization.getLineTokens(w), + getLineTokens: (y) => y === l.startLineNumber ? e.tokenization.getLineTokens(h) : e.tokenization.getLineTokens(y), getLanguageId: i, getLanguageIdAtPosition: n }, - getLineContent: (w) => w === r.startLineNumber ? e.getLineContent(h) : e.getLineContent(w) - }, y = Ny(this._autoIndent, b, e.getLanguageIdAtPosition(h, 1), r.startLineNumber, d, this._languageConfigurationService); - if (y !== null) { - const w = Nt(e.getLineContent(h)), C = js(y, l), S = js(w, l); - C !== S && (g = qy(C, l, c) + this.trimStart(u)); + getLineContent: (y) => y === l.startLineNumber ? e.getLineContent(h) : e.getLineContent(y) + }, f = Df(this._autoIndent, Z, e.getLanguageIdAtPosition(h, 1), l.startLineNumber, a, this._languageConfigurationService); + if (f !== null) { + const y = Rt(e.getLineContent(h)), W = $s(f, r), G = $s(y, r); + W !== G && (m = dy(W, r, d) + this.trimStart(u)); } } - t.addEditOperation(new M(r.startLineNumber, 1, r.startLineNumber, 1), g + ` + t.addEditOperation(new I(l.startLineNumber, 1, l.startLineNumber, 1), m + ` `); - const f = this.matchEnterRuleMovingDown(e, d, l, r.startLineNumber, h, g); - if (f !== null) - f !== 0 && this.getIndentEditsOfMovingBlock(e, t, r, l, c, f); + const g = this.matchEnterRuleMovingDown(e, a, r, l.startLineNumber, h, m); + if (g !== null) + g !== 0 && this.getIndentEditsOfMovingBlock(e, t, l, r, d, g); else { - const b = { + const Z = { tokenization: { - getLineTokens: (w) => w === r.startLineNumber ? e.tokenization.getLineTokens(h) : w >= r.startLineNumber + 1 && w <= r.endLineNumber + 1 ? e.tokenization.getLineTokens(w - 1) : e.tokenization.getLineTokens(w), + getLineTokens: (y) => y === l.startLineNumber ? e.tokenization.getLineTokens(h) : y >= l.startLineNumber + 1 && y <= l.endLineNumber + 1 ? e.tokenization.getLineTokens(y - 1) : e.tokenization.getLineTokens(y), getLanguageId: i, getLanguageIdAtPosition: n }, - getLineContent: (w) => w === r.startLineNumber ? g : w >= r.startLineNumber + 1 && w <= r.endLineNumber + 1 ? e.getLineContent(w - 1) : e.getLineContent(w) - }, y = Ny(this._autoIndent, b, e.getLanguageIdAtPosition(h, 1), r.startLineNumber + 1, d, this._languageConfigurationService); - if (y !== null) { - const w = Nt(e.getLineContent(r.startLineNumber)), C = js(y, l), S = js(w, l); - if (C !== S) { - const L = C - S; - this.getIndentEditsOfMovingBlock(e, t, r, l, c, L); + getLineContent: (y) => y === l.startLineNumber ? m : y >= l.startLineNumber + 1 && y <= l.endLineNumber + 1 ? e.getLineContent(y - 1) : e.getLineContent(y) + }, f = Df(this._autoIndent, Z, e.getLanguageIdAtPosition(h, 1), l.startLineNumber + 1, a, this._languageConfigurationService); + if (f !== null) { + const y = Rt(e.getLineContent(l.startLineNumber)), W = $s(f, r), G = $s(y, r); + if (W !== G) { + const X = W - G; + this.getIndentEditsOfMovingBlock(e, t, l, r, d, X); } } } } else - t.addEditOperation(new M(r.startLineNumber, 1, r.startLineNumber, 1), g + ` + t.addEditOperation(new I(l.startLineNumber, 1, l.startLineNumber, 1), m + ` `); - } else if (h = r.startLineNumber - 1, u = e.getLineContent(h), t.addEditOperation(new M(h, 1, h + 1, 1), null), t.addEditOperation(new M(r.endLineNumber, e.getLineMaxColumn(r.endLineNumber), r.endLineNumber, e.getLineMaxColumn(r.endLineNumber)), ` -` + u), this.shouldAutoIndent(e, r)) { - const g = { + } else if (h = l.startLineNumber - 1, u = e.getLineContent(h), t.addEditOperation(new I(h, 1, h + 1, 1), null), t.addEditOperation(new I(l.endLineNumber, e.getLineMaxColumn(l.endLineNumber), l.endLineNumber, e.getLineMaxColumn(l.endLineNumber)), ` +` + u), this.shouldAutoIndent(e, l)) { + const m = { tokenization: { - getLineTokens: (f) => f === h ? e.tokenization.getLineTokens(r.startLineNumber) : e.tokenization.getLineTokens(f), + getLineTokens: (g) => g === h ? e.tokenization.getLineTokens(l.startLineNumber) : e.tokenization.getLineTokens(g), getLanguageId: i, getLanguageIdAtPosition: n }, - getLineContent: (f) => f === h ? e.getLineContent(r.startLineNumber) : e.getLineContent(f) - }, m = this.matchEnterRule(e, d, l, r.startLineNumber, r.startLineNumber - 2); - if (m !== null) - m !== 0 && this.getIndentEditsOfMovingBlock(e, t, r, l, c, m); + getLineContent: (g) => g === h ? e.getLineContent(l.startLineNumber) : e.getLineContent(g) + }, b = this.matchEnterRule(e, a, r, l.startLineNumber, l.startLineNumber - 2); + if (b !== null) + b !== 0 && this.getIndentEditsOfMovingBlock(e, t, l, r, d, b); else { - const f = Ny(this._autoIndent, g, e.getLanguageIdAtPosition(r.startLineNumber, 1), h, d, this._languageConfigurationService); - if (f !== null) { - const b = Nt(e.getLineContent(r.startLineNumber)), y = js(f, l), w = js(b, l); - if (y !== w) { - const C = y - w; - this.getIndentEditsOfMovingBlock(e, t, r, l, c, C); + const g = Df(this._autoIndent, m, e.getLanguageIdAtPosition(l.startLineNumber, 1), h, a, this._languageConfigurationService); + if (g !== null) { + const Z = Rt(e.getLineContent(l.startLineNumber)), f = $s(g, r), y = $s(Z, r); + if (f !== y) { + const W = f - y; + this.getIndentEditsOfMovingBlock(e, t, l, r, d, W); } } } } } - this._selectionId = t.trackSelection(r); + this._selectionId = t.trackSelection(l); } buildIndentConverter(e, t, i) { return { - shiftIndent: (n) => wr.shiftIndent(n, n.length + 1, e, t, i), - unshiftIndent: (n) => wr.unshiftIndent(n, n.length + 1, e, t, i) + shiftIndent: (n) => Xl.shiftIndent(n, n.length + 1, e, t, i), + unshiftIndent: (n) => Xl.unshiftIndent(n, n.length + 1, e, t, i) }; } parseEnterResult(e, t, i, n, o) { if (o) { - let r = o.indentation; - o.indentAction === Ei.None || o.indentAction === Ei.Indent ? r = o.indentation + o.appendText : o.indentAction === Ei.IndentOutdent ? r = o.indentation : o.indentAction === Ei.Outdent && (r = t.unshiftIndent(o.indentation) + o.appendText); - const l = e.getLineContent(n); - if (this.trimStart(l).indexOf(this.trimStart(r)) >= 0) { - const a = Nt(e.getLineContent(n)); - let c = Nt(r); - const d = EJ(e, n, this._languageConfigurationService); - d !== null && d & 2 && (c = t.unshiftIndent(c)); - const h = js(c, i), u = js(a, i); + let l = o.indentation; + o.indentAction === Ei.None || o.indentAction === Ei.Indent ? l = o.indentation + o.appendText : o.indentAction === Ei.IndentOutdent ? l = o.indentation : o.indentAction === Ei.Outdent && (l = t.unshiftIndent(o.indentation) + o.appendText); + const r = e.getLineContent(n); + if (this.trimStart(r).indexOf(this.trimStart(l)) >= 0) { + const c = Rt(e.getLineContent(n)); + let d = Rt(l); + const a = W_(e, n, this._languageConfigurationService); + a !== null && a & 2 && (d = t.unshiftIndent(d)); + const h = $s(d, i), u = $s(c, i); return h - u; } } @@ -86030,36 +86030,36 @@ let MV = class { * @param futureAboveLineNumber the line which will be at the `line` position * @param futureAboveLineText */ - matchEnterRuleMovingDown(e, t, i, n, o, r) { - if (Ml(r) >= 0) { - const l = e.getLineMaxColumn(o), a = Af(this._autoIndent, e, new M(o, l, o, l), this._languageConfigurationService); - return this.parseEnterResult(e, t, i, n, a); + matchEnterRuleMovingDown(e, t, i, n, o, l) { + if (Rr(l) >= 0) { + const r = e.getLineMaxColumn(o), c = Rg(this._autoIndent, e, new I(o, r, o, r), this._languageConfigurationService); + return this.parseEnterResult(e, t, i, n, c); } else { - let l = n - 1; - for (; l >= 1; ) { - const d = e.getLineContent(l); - if (Ml(d) >= 0) + let r = n - 1; + for (; r >= 1; ) { + const a = e.getLineContent(r); + if (Rr(a) >= 0) break; - l--; + r--; } - if (l < 1 || n > e.getLineCount()) + if (r < 1 || n > e.getLineCount()) return null; - const a = e.getLineMaxColumn(l), c = Af(this._autoIndent, e, new M(l, a, l, a), this._languageConfigurationService); - return this.parseEnterResult(e, t, i, n, c); + const c = e.getLineMaxColumn(r), d = Rg(this._autoIndent, e, new I(r, c, r, c), this._languageConfigurationService); + return this.parseEnterResult(e, t, i, n, d); } } - matchEnterRule(e, t, i, n, o, r) { - let l = o; - for (; l >= 1; ) { - let d; - if (l === o && r !== void 0 ? d = r : d = e.getLineContent(l), Ml(d) >= 0) + matchEnterRule(e, t, i, n, o, l) { + let r = o; + for (; r >= 1; ) { + let a; + if (r === o && l !== void 0 ? a = l : a = e.getLineContent(r), Rr(a) >= 0) break; - l--; + r--; } - if (l < 1 || n > e.getLineCount()) + if (r < 1 || n > e.getLineCount()) return null; - const a = e.getLineMaxColumn(l), c = Af(this._autoIndent, e, new M(l, a, l, a), this._languageConfigurationService); - return this.parseEnterResult(e, t, i, n, c); + const c = e.getLineMaxColumn(r), d = Rg(this._autoIndent, e, new I(r, c, r, c), this._languageConfigurationService); + return this.parseEnterResult(e, t, i, n, d); } trimStart(e) { return e.replace(/^\s+/, ""); @@ -86070,10 +86070,10 @@ let MV = class { const i = e.getLanguageIdAtPosition(t.startLineNumber, 1), n = e.getLanguageIdAtPosition(t.endLineNumber, 1); return !(i !== n || this._languageConfigurationService.getLanguageConfiguration(i).indentRulesSupport === null); } - getIndentEditsOfMovingBlock(e, t, i, n, o, r) { - for (let l = i.startLineNumber; l <= i.endLineNumber; l++) { - const a = e.getLineContent(l), c = Nt(a), h = js(c, n) + r, u = qy(h, n, o); - u !== c && (t.addEditOperation(new M(l, 1, l, c.length + 1), u), l === i.endLineNumber && i.endColumn <= c.length + 1 && u === "" && (this._moveEndLineSelectionShrink = !0)); + getIndentEditsOfMovingBlock(e, t, i, n, o, l) { + for (let r = i.startLineNumber; r <= i.endLineNumber; r++) { + const c = e.getLineContent(r), d = Rt(c), h = $s(d, n) + l, u = dy(h, n, o); + u !== d && (t.addEditOperation(new I(r, 1, r, d.length + 1), u), r === i.endLineNumber && i.endColumn <= d.length + 1 && u === "" && (this._moveEndLineSelectionShrink = !0)); } } computeCursorState(e, t) { @@ -86081,18 +86081,18 @@ let MV = class { return this._moveEndPositionDown && (i = i.setEndPosition(i.endLineNumber + 1, 1)), this._moveEndLineSelectionShrink && i.startLineNumber < i.endLineNumber && (i = i.setEndPosition(i.endLineNumber, 2)), i; } }; -MV = OCe([ - HCe(3, li) -], MV); -const pf = class pf { +P9 = J1e([ + H1e(3, ci) +], P9); +const Gg = class Gg { static getCollator() { - return pf._COLLATOR || (pf._COLLATOR = new Intl.Collator()), pf._COLLATOR; + return Gg._COLLATOR || (Gg._COLLATOR = new Intl.Collator()), Gg._COLLATOR; } constructor(e, t) { this.selection = e, this.descending = t, this.selectionId = null; } getEditOperations(e, t) { - const i = JCe(e, this.selection, this.descending); + const i = E1e(e, this.selection, this.descending); i && t.addEditOperation(i.range, i.text), this.selectionId = t.trackSelection(this.selection); } computeCursorState(e, t) { @@ -86101,67 +86101,67 @@ const pf = class pf { static canRun(e, t, i) { if (e === null) return !1; - const n = Oj(e, t, i); + const n = x7(e, t, i); if (!n) return !1; - for (let o = 0, r = n.before.length; o < r; o++) + for (let o = 0, l = n.before.length; o < l; o++) if (n.before[o] !== n.after[o]) return !0; return !1; } }; -pf._COLLATOR = null; -let B1 = pf; -function Oj(s, e, t) { +Gg._COLLATOR = null; +let iG = Gg; +function x7(s, e, t) { const i = e.startLineNumber; let n = e.endLineNumber; if (e.endColumn === 1 && n--, i >= n) return null; const o = []; - for (let l = i; l <= n; l++) - o.push(s.getLineContent(l)); - let r = o.slice(0); - return r.sort(B1.getCollator().compare), t === !0 && (r = r.reverse()), { + for (let r = i; r <= n; r++) + o.push(s.getLineContent(r)); + let l = o.slice(0); + return l.sort(iG.getCollator().compare), t === !0 && (l = l.reverse()), { startLineNumber: i, endLineNumber: n, before: o, - after: r + after: l }; } -function JCe(s, e, t) { - const i = Oj(s, e, t); - return i ? si.replace(new M(i.startLineNumber, 1, i.endLineNumber, s.getLineMaxColumn(i.endLineNumber)), i.after.join(` +function E1e(s, e, t) { + const i = x7(s, e, t); + return i ? oi.replace(new I(i.startLineNumber, 1, i.endLineNumber, s.getLineMaxColumn(i.endLineNumber)), i.after.join(` `)) : null; } -class Hj extends he { +class C7 extends he { constructor(e, t) { super(t), this.down = e; } run(e, t) { if (!t.hasModel()) return; - const i = t.getSelections().map((r, l) => ({ selection: r, index: l, ignore: !1 })); - i.sort((r, l) => M.compareRangesUsingStarts(r.selection, l.selection)); + const i = t.getSelections().map((l, r) => ({ selection: l, index: r, ignore: !1 })); + i.sort((l, r) => I.compareRangesUsingStarts(l.selection, r.selection)); let n = i[0]; - for (let r = 1; r < i.length; r++) { - const l = i[r]; - n.selection.endLineNumber === l.selection.startLineNumber && (n.index < l.index ? l.ignore = !0 : (n.ignore = !0, n = l)); + for (let l = 1; l < i.length; l++) { + const r = i[l]; + n.selection.endLineNumber === r.selection.startLineNumber && (n.index < r.index ? r.ignore = !0 : (n.ignore = !0, n = r)); } const o = []; - for (const r of i) - o.push(new Bj(r.selection, this.down, r.ignore)); + for (const l of i) + o.push(new S7(l.selection, this.down, l.ignore)); t.pushUndoStop(), t.executeCommands(this.id, o), t.pushUndoStop(); } } -class UCe extends Hj { +class D1e extends C7 { constructor() { super(!1, { id: "editor.action.copyLinesUpAction", label: p("lines.copyUp", "Copy Line Up"), alias: "Copy Line Up", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 1552, linux: { primary: 3600 @@ -86179,15 +86179,15 @@ class UCe extends Hj { }); } } -class KCe extends Hj { +class F1e extends C7 { constructor() { super(!0, { id: "editor.action.copyLinesDownAction", label: p("lines.copyDown", "Copy Line Down"), alias: "Copy Line Down", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 1554, linux: { primary: 3602 @@ -86205,13 +86205,13 @@ class KCe extends Hj { }); } } -class QCe extends he { +class z1e extends he { constructor() { super({ id: "editor.action.duplicateSelection", label: p("duplicateSelection", "Duplicate Selection"), alias: "Duplicate Selection", - precondition: I.writable, + precondition: C.writable, menuOpts: { menuId: pe.MenubarSelectionMenu, group: "2_line", @@ -86223,40 +86223,40 @@ class QCe extends he { run(e, t, i) { if (!t.hasModel()) return; - const n = [], o = t.getSelections(), r = t.getModel(); - for (const l of o) - if (l.isEmpty()) - n.push(new Bj(l, !0)); + const n = [], o = t.getSelections(), l = t.getModel(); + for (const r of o) + if (r.isEmpty()) + n.push(new S7(r, !0)); else { - const a = new fe(l.endLineNumber, l.endColumn, l.endLineNumber, l.endColumn); - n.push(new U$(a, r.getValueInRange(l))); + const c = new ge(r.endLineNumber, r.endColumn, r.endLineNumber, r.endColumn); + n.push(new Dee(c, l.getValueInRange(r))); } t.pushUndoStop(), t.executeCommands(this.id, n), t.pushUndoStop(); } } -class Jj extends he { +class R7 extends he { constructor(e, t) { super(t), this.down = e; } run(e, t) { - const i = e.get(li), n = [], o = t.getSelections() || [], r = t.getOption( + const i = e.get(ci), n = [], o = t.getSelections() || [], l = t.getOption( 12 /* EditorOption.autoIndent */ ); - for (const l of o) - n.push(new MV(l, this.down, r, i)); + for (const r of o) + n.push(new P9(r, this.down, l, i)); t.pushUndoStop(), t.executeCommands(this.id, n), t.pushUndoStop(); } } -class jCe extends Jj { +class A1e extends R7 { constructor() { super(!1, { id: "editor.action.moveLinesUpAction", label: p("lines.moveUp", "Move Line Up"), alias: "Move Line Up", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 528, linux: { primary: 528 @@ -86274,15 +86274,15 @@ class jCe extends Jj { }); } } -class qCe extends Jj { +class K1e extends R7 { constructor() { super(!0, { id: "editor.action.moveLinesDownAction", label: p("lines.moveDown", "Move Line Down"), alias: "Move Line Down", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 530, linux: { primary: 530 @@ -86300,7 +86300,7 @@ class qCe extends Jj { }); } } -class Uj extends he { +class N7 extends he { constructor(e, t) { super(t), this.descending = e; } @@ -86309,43 +86309,43 @@ class Uj extends he { return; const i = t.getModel(); let n = t.getSelections(); - n.length === 1 && n[0].isEmpty() && (n = [new fe(1, 1, i.getLineCount(), i.getLineMaxColumn(i.getLineCount()))]); - for (const r of n) - if (!B1.canRun(t.getModel(), r, this.descending)) + n.length === 1 && n[0].isEmpty() && (n = [new ge(1, 1, i.getLineCount(), i.getLineMaxColumn(i.getLineCount()))]); + for (const l of n) + if (!iG.canRun(t.getModel(), l, this.descending)) return; const o = []; - for (let r = 0, l = n.length; r < l; r++) - o[r] = new B1(n[r], this.descending); + for (let l = 0, r = n.length; l < r; l++) + o[l] = new iG(n[l], this.descending); t.pushUndoStop(), t.executeCommands(this.id, o), t.pushUndoStop(); } } -class $Ce extends Uj { +class U1e extends N7 { constructor() { super(!1, { id: "editor.action.sortLinesAscending", label: p("lines.sortAscending", "Sort Lines Ascending"), alias: "Sort Lines Ascending", - precondition: I.writable + precondition: C.writable }); } } -class eSe extends Uj { +class P1e extends N7 { constructor() { super(!0, { id: "editor.action.sortLinesDescending", label: p("lines.sortDescending", "Sort Lines Descending"), alias: "Sort Lines Descending", - precondition: I.writable + precondition: C.writable }); } } -class tSe extends he { +class B1e extends he { constructor() { super({ id: "editor.action.removeDuplicateLines", label: p("lines.deleteDuplicates", "Delete Duplicate Lines"), alias: "Delete Duplicate Lines", - precondition: I.writable + precondition: C.writable }); } run(e, t) { @@ -86355,31 +86355,31 @@ class tSe extends he { if (i.getLineCount() === 1 && i.getLineMaxColumn(1) === 1) return; const n = [], o = []; - let r = 0, l = !0, a = t.getSelections(); - a.length === 1 && a[0].isEmpty() && (a = [new fe(1, 1, i.getLineCount(), i.getLineMaxColumn(i.getLineCount()))], l = !1); - for (const c of a) { - const d = /* @__PURE__ */ new Set(), h = []; - for (let f = c.startLineNumber; f <= c.endLineNumber; f++) { - const b = i.getLineContent(f); - d.has(b) || (h.push(b), d.add(b)); + let l = 0, r = !0, c = t.getSelections(); + c.length === 1 && c[0].isEmpty() && (c = [new ge(1, 1, i.getLineCount(), i.getLineMaxColumn(i.getLineCount()))], r = !1); + for (const d of c) { + const a = /* @__PURE__ */ new Set(), h = []; + for (let g = d.startLineNumber; g <= d.endLineNumber; g++) { + const Z = i.getLineContent(g); + a.has(Z) || (h.push(Z), a.add(Z)); } - const u = new fe(c.startLineNumber, 1, c.endLineNumber, i.getLineMaxColumn(c.endLineNumber)), g = c.startLineNumber - r, m = new fe(g, 1, g + h.length - 1, h[h.length - 1].length); - n.push(si.replace(u, h.join(` -`))), o.push(m), r += c.endLineNumber - c.startLineNumber + 1 - h.length; + const u = new ge(d.startLineNumber, 1, d.endLineNumber, i.getLineMaxColumn(d.endLineNumber)), m = d.startLineNumber - l, b = new ge(m, 1, m + h.length - 1, h[h.length - 1].length); + n.push(oi.replace(u, h.join(` +`))), o.push(b), l += d.endLineNumber - d.startLineNumber + 1 - h.length; } - t.pushUndoStop(), t.executeEdits(this.id, n, l ? o : void 0), t.pushUndoStop(); + t.pushUndoStop(), t.executeEdits(this.id, n, r ? o : void 0), t.pushUndoStop(); } } -const jZ = class jZ extends he { +const uS = class uS extends he { constructor() { super({ - id: jZ.ID, + id: uS.ID, label: p("lines.trimTrailingWhitespace", "Trim Trailing Whitespace"), alias: "Trim Trailing Whitespace", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, - primary: Xi( + kbExpr: C.editorTextFocus, + primary: Di( 2089, 2102 /* KeyCode.KeyX */ @@ -86391,25 +86391,25 @@ const jZ = class jZ extends he { } run(e, t, i) { let n = []; - i.reason === "auto-save" && (n = (t.getSelections() || []).map((d) => new V(d.positionLineNumber, d.positionColumn))); + i.reason === "auto-save" && (n = (t.getSelections() || []).map((a) => new Y(a.positionLineNumber, a.positionColumn))); const o = t.getSelection(); if (o === null) return; - const r = e.get(Ke), l = t.getModel(), a = r.getValue("files.trimTrailingWhitespaceInRegexAndStrings", { overrideIdentifier: l == null ? void 0 : l.getLanguageId(), resource: l == null ? void 0 : l.uri }), c = new PCe(o, n, a); - t.pushUndoStop(), t.executeCommands(this.id, [c]), t.pushUndoStop(); + const l = e.get(Qe), r = t.getModel(), c = l.getValue("files.trimTrailingWhitespaceInRegexAndStrings", { overrideIdentifier: r == null ? void 0 : r.getLanguageId(), resource: r == null ? void 0 : r.uri }), d = new k1e(o, n, c); + t.pushUndoStop(), t.executeCommands(this.id, [d]), t.pushUndoStop(); } }; -jZ.ID = "editor.action.trimTrailingWhitespace"; -let ZV = jZ; -class iSe extends he { +uS.ID = "editor.action.trimTrailingWhitespace"; +let B9 = uS; +class _1e extends he { constructor() { super({ id: "editor.action.deleteLines", label: p("lines.delete", "Delete Line"), alias: "Delete Line", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 3113, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -86423,25 +86423,25 @@ class iSe extends he { if (n.getLineCount() === 1 && n.getLineMaxColumn(1) === 1) return; let o = 0; - const r = [], l = []; - for (let a = 0, c = i.length; a < c; a++) { - const d = i[a]; - let h = d.startLineNumber, u = d.endLineNumber, g = 1, m = n.getLineMaxColumn(u); - u < n.getLineCount() ? (u += 1, m = 1) : h > 1 && (h -= 1, g = n.getLineMaxColumn(h)), r.push(si.replace(new fe(h, g, u, m), "")), l.push(new fe(h - o, d.positionColumn, h - o, d.positionColumn)), o += d.endLineNumber - d.startLineNumber + 1; + const l = [], r = []; + for (let c = 0, d = i.length; c < d; c++) { + const a = i[c]; + let h = a.startLineNumber, u = a.endLineNumber, m = 1, b = n.getLineMaxColumn(u); + u < n.getLineCount() ? (u += 1, b = 1) : h > 1 && (h -= 1, m = n.getLineMaxColumn(h)), l.push(oi.replace(new ge(h, m, u, b), "")), r.push(new ge(h - o, a.positionColumn, h - o, a.positionColumn)), o += a.endLineNumber - a.startLineNumber + 1; } - t.pushUndoStop(), t.executeEdits(this.id, r, l), t.pushUndoStop(); + t.pushUndoStop(), t.executeEdits(this.id, l, r), t.pushUndoStop(); } _getLinesToRemove(e) { const t = e.getSelections().map((o) => { - let r = o.endLineNumber; - return o.startLineNumber < o.endLineNumber && o.endColumn === 1 && (r -= 1), { + let l = o.endLineNumber; + return o.startLineNumber < o.endLineNumber && o.endColumn === 1 && (l -= 1), { startLineNumber: o.startLineNumber, selectionStartColumn: o.selectionStartColumn, - endLineNumber: r, + endLineNumber: l, positionColumn: o.positionColumn }; }); - t.sort((o, r) => o.startLineNumber === r.startLineNumber ? o.endLineNumber - r.endLineNumber : o.startLineNumber - r.startLineNumber); + t.sort((o, l) => o.startLineNumber === l.startLineNumber ? o.endLineNumber - l.endLineNumber : o.startLineNumber - l.startLineNumber); const i = []; let n = t[0]; for (let o = 1; o < t.length; o++) @@ -86449,15 +86449,15 @@ class iSe extends he { return i.push(n), i; } } -class nSe extends he { +class Q1e extends he { constructor() { super({ id: "editor.action.indentLines", label: p("lines.indent", "Indent Line"), alias: "Indent Line", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 2142, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -86466,18 +86466,18 @@ class nSe extends he { } run(e, t) { const i = t._getViewModel(); - i && (t.pushUndoStop(), t.executeCommands(this.id, vd.indent(i.cursorConfig, t.getModel(), t.getSelections())), t.pushUndoStop()); + i && (t.pushUndoStop(), t.executeCommands(this.id, ka.indent(i.cursorConfig, t.getModel(), t.getSelections())), t.pushUndoStop()); } } -class sSe extends he { +class O1e extends he { constructor() { super({ id: "editor.action.outdentLines", label: p("lines.outdent", "Outdent Line"), alias: "Outdent Line", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 2140, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -86485,18 +86485,18 @@ class sSe extends he { }); } run(e, t) { - xf.Outdent.runEditorCommand(e, t, null); + Ng.Outdent.runEditorCommand(e, t, null); } } -class oSe extends he { +class j1e extends he { constructor() { super({ id: "editor.action.insertLineBefore", label: p("lines.insertBefore", "Insert Line Above"), alias: "Insert Line Above", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 3075, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -86505,18 +86505,18 @@ class oSe extends he { } run(e, t) { const i = t._getViewModel(); - i && (t.pushUndoStop(), t.executeCommands(this.id, j_.lineInsertBefore(i.cursorConfig, t.getModel(), t.getSelections()))); + i && (t.pushUndoStop(), t.executeCommands(this.id, ux.lineInsertBefore(i.cursorConfig, t.getModel(), t.getSelections()))); } } -class rSe extends he { +class q1e extends he { constructor() { super({ id: "editor.action.insertLineAfter", label: p("lines.insertAfter", "Insert Line Below"), alias: "Insert Line Below", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 2051, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -86525,32 +86525,32 @@ class rSe extends he { } run(e, t) { const i = t._getViewModel(); - i && (t.pushUndoStop(), t.executeCommands(this.id, j_.lineInsertAfter(i.cursorConfig, t.getModel(), t.getSelections()))); + i && (t.pushUndoStop(), t.executeCommands(this.id, ux.lineInsertAfter(i.cursorConfig, t.getModel(), t.getSelections()))); } } -class Kj extends he { +class w7 extends he { run(e, t) { if (!t.hasModel()) return; const i = t.getSelection(), n = this._getRangesToDelete(t), o = []; - for (let a = 0, c = n.length - 1; a < c; a++) { - const d = n[a], h = n[a + 1]; - M.intersectRanges(d, h) === null ? o.push(d) : n[a + 1] = M.plusRange(d, h); + for (let c = 0, d = n.length - 1; c < d; c++) { + const a = n[c], h = n[c + 1]; + I.intersectRanges(a, h) === null ? o.push(a) : n[c + 1] = I.plusRange(a, h); } o.push(n[n.length - 1]); - const r = this._getEndCursorState(i, o), l = o.map((a) => si.replace(a, "")); - t.pushUndoStop(), t.executeEdits(this.id, l, r), t.pushUndoStop(); + const l = this._getEndCursorState(i, o), r = o.map((c) => oi.replace(c, "")); + t.pushUndoStop(), t.executeEdits(this.id, r, l), t.pushUndoStop(); } } -class lSe extends Kj { +class $1e extends w7 { constructor() { super({ id: "deleteAllLeft", label: p("lines.deleteAllLeft", "Delete All Left"), alias: "Delete All Left", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 0, mac: { primary: 2049 @@ -86565,14 +86565,14 @@ class lSe extends Kj { let i = null; const n = []; let o = 0; - return t.forEach((r) => { - let l; - if (r.endColumn === 1 && o > 0) { - const a = r.startLineNumber - o; - l = new fe(a, r.startColumn, a, r.startColumn); + return t.forEach((l) => { + let r; + if (l.endColumn === 1 && o > 0) { + const c = l.startLineNumber - o; + r = new ge(c, l.startColumn, c, l.startColumn); } else - l = new fe(r.startLineNumber, r.startColumn, r.startLineNumber, r.startColumn); - o += r.endLineNumber - r.startLineNumber, r.intersectRanges(e) ? i = l : n.push(l); + r = new ge(l.startLineNumber, l.startColumn, l.startLineNumber, l.startColumn); + o += l.endLineNumber - l.startLineNumber, l.intersectRanges(e) ? i = r : n.push(r); }), i && n.unshift(i), n; } _getRangesToDelete(e) { @@ -86581,27 +86581,27 @@ class lSe extends Kj { return []; let i = t; const n = e.getModel(); - return n === null ? [] : (i.sort(M.compareRangesUsingStarts), i = i.map((o) => { + return n === null ? [] : (i.sort(I.compareRangesUsingStarts), i = i.map((o) => { if (o.isEmpty()) if (o.startColumn === 1) { - const r = Math.max(1, o.startLineNumber - 1), l = o.startLineNumber === 1 ? 1 : n.getLineLength(r) + 1; - return new M(r, l, o.startLineNumber, 1); + const l = Math.max(1, o.startLineNumber - 1), r = o.startLineNumber === 1 ? 1 : n.getLineLength(l) + 1; + return new I(l, r, o.startLineNumber, 1); } else - return new M(o.startLineNumber, 1, o.startLineNumber, o.startColumn); + return new I(o.startLineNumber, 1, o.startLineNumber, o.startColumn); else - return new M(o.startLineNumber, 1, o.endLineNumber, o.endColumn); + return new I(o.startLineNumber, 1, o.endLineNumber, o.endColumn); }), i); } } -class aSe extends Kj { +class eXe extends w7 { constructor() { super({ id: "deleteAllRight", label: p("lines.deleteAllRight", "Delete All Right"), alias: "Delete All Right", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 0, mac: { primary: 297, secondary: [ 2068 @@ -86615,9 +86615,9 @@ class aSe extends Kj { _getEndCursorState(e, t) { let i = null; const n = []; - for (let o = 0, r = t.length, l = 0; o < r; o++) { - const a = t[o], c = new fe(a.startLineNumber - l, a.startColumn, a.startLineNumber - l, a.startColumn); - a.intersectRanges(e) ? i = c : n.push(c); + for (let o = 0, l = t.length, r = 0; o < l; o++) { + const c = t[o], d = new ge(c.startLineNumber - r, c.startColumn, c.startLineNumber - r, c.startColumn); + c.intersectRanges(e) ? i = d : n.push(d); } return i && n.unshift(i), n; } @@ -86630,23 +86630,23 @@ class aSe extends Kj { return []; const n = i.map((o) => { if (o.isEmpty()) { - const r = t.getLineMaxColumn(o.startLineNumber); - return o.startColumn === r ? new M(o.startLineNumber, o.startColumn, o.startLineNumber + 1, 1) : new M(o.startLineNumber, o.startColumn, o.startLineNumber, r); + const l = t.getLineMaxColumn(o.startLineNumber); + return o.startColumn === l ? new I(o.startLineNumber, o.startColumn, o.startLineNumber + 1, 1) : new I(o.startLineNumber, o.startColumn, o.startLineNumber, l); } return o; }); - return n.sort(M.compareRangesUsingStarts), n; + return n.sort(I.compareRangesUsingStarts), n; } } -class cSe extends he { +class tXe extends he { constructor() { super({ id: "editor.action.joinLines", label: p("lines.joinLines", "Join Lines"), alias: "Join Lines", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 0, mac: { primary: 296 @@ -86664,51 +86664,51 @@ class cSe extends he { let n = t.getSelection(); if (n === null) return; - i.sort(M.compareRangesUsingStarts); - const o = [], r = i.reduce((u, g) => u.isEmpty() ? u.endLineNumber === g.startLineNumber ? (n.equalsSelection(u) && (n = g), g) : g.startLineNumber > u.endLineNumber + 1 ? (o.push(u), g) : new fe(u.startLineNumber, u.startColumn, g.endLineNumber, g.endColumn) : g.startLineNumber > u.endLineNumber ? (o.push(u), g) : new fe(u.startLineNumber, u.startColumn, g.endLineNumber, g.endColumn)); - o.push(r); - const l = t.getModel(); - if (l === null) - return; - const a = [], c = []; - let d = n, h = 0; - for (let u = 0, g = o.length; u < g; u++) { - const m = o[u], f = m.startLineNumber, b = 1; - let y = 0, w, C; - const S = l.getLineLength(m.endLineNumber) - m.endColumn; - if (m.isEmpty() || m.startLineNumber === m.endLineNumber) { - const Z = m.getStartPosition(); - Z.lineNumber < l.getLineCount() ? (w = f + 1, C = l.getLineMaxColumn(w)) : (w = Z.lineNumber, C = l.getLineMaxColumn(Z.lineNumber)); + i.sort(I.compareRangesUsingStarts); + const o = [], l = i.reduce((u, m) => u.isEmpty() ? u.endLineNumber === m.startLineNumber ? (n.equalsSelection(u) && (n = m), m) : m.startLineNumber > u.endLineNumber + 1 ? (o.push(u), m) : new ge(u.startLineNumber, u.startColumn, m.endLineNumber, m.endColumn) : m.startLineNumber > u.endLineNumber ? (o.push(u), m) : new ge(u.startLineNumber, u.startColumn, m.endLineNumber, m.endColumn)); + o.push(l); + const r = t.getModel(); + if (r === null) + return; + const c = [], d = []; + let a = n, h = 0; + for (let u = 0, m = o.length; u < m; u++) { + const b = o[u], g = b.startLineNumber, Z = 1; + let f = 0, y, W; + const G = r.getLineLength(b.endLineNumber) - b.endColumn; + if (b.isEmpty() || b.startLineNumber === b.endLineNumber) { + const S = b.getStartPosition(); + S.lineNumber < r.getLineCount() ? (y = g + 1, W = r.getLineMaxColumn(y)) : (y = S.lineNumber, W = r.getLineMaxColumn(S.lineNumber)); } else - w = m.endLineNumber, C = l.getLineMaxColumn(w); - let L = l.getLineContent(f); - for (let Z = f + 1; Z <= w; Z++) { - const _ = l.getLineContent(Z), v = l.getLineFirstNonWhitespaceColumn(Z); - if (v >= 1) { - let P = !0; - L === "" && (P = !1), P && (L.charAt(L.length - 1) === " " || L.charAt(L.length - 1) === " ") && (P = !1, L = L.replace(/[\s\uFEFF\xA0]+$/g, " ")); - const E = _.substr(v - 1); - L += (P ? " " : "") + E, P ? y = E.length + 1 : y = E.length; + y = b.endLineNumber, W = r.getLineMaxColumn(y); + let X = r.getLineContent(g); + for (let S = g + 1; S <= y; S++) { + const x = r.getLineContent(S), w = r.getLineFirstNonWhitespaceColumn(S); + if (w >= 1) { + let A = !0; + X === "" && (A = !1), A && (X.charAt(X.length - 1) === " " || X.charAt(X.length - 1) === " ") && (A = !1, X = X.replace(/[\s\uFEFF\xA0]+$/g, " ")); + const H = x.substr(w - 1); + X += (A ? " " : "") + H, A ? f = H.length + 1 : f = H.length; } else - y = 0; + f = 0; } - const x = new M(f, b, w, C); - if (!x.isEmpty()) { - let Z; - m.isEmpty() ? (a.push(si.replace(x, L)), Z = new fe(x.startLineNumber - h, L.length - y + 1, f - h, L.length - y + 1)) : m.startLineNumber === m.endLineNumber ? (a.push(si.replace(x, L)), Z = new fe(m.startLineNumber - h, m.startColumn, m.endLineNumber - h, m.endColumn)) : (a.push(si.replace(x, L)), Z = new fe(m.startLineNumber - h, m.startColumn, m.startLineNumber - h, L.length - S)), M.intersectRanges(x, n) !== null ? d = Z : c.push(Z); + const L = new I(g, Z, y, W); + if (!L.isEmpty()) { + let S; + b.isEmpty() ? (c.push(oi.replace(L, X)), S = new ge(L.startLineNumber - h, X.length - f + 1, g - h, X.length - f + 1)) : b.startLineNumber === b.endLineNumber ? (c.push(oi.replace(L, X)), S = new ge(b.startLineNumber - h, b.startColumn, b.endLineNumber - h, b.endColumn)) : (c.push(oi.replace(L, X)), S = new ge(b.startLineNumber - h, b.startColumn, b.startLineNumber - h, X.length - G)), I.intersectRanges(L, n) !== null ? a = S : d.push(S); } - h += x.endLineNumber - x.startLineNumber; + h += L.endLineNumber - L.startLineNumber; } - c.unshift(d), t.pushUndoStop(), t.executeEdits(this.id, a, c), t.pushUndoStop(); + d.unshift(a), t.pushUndoStop(), t.executeEdits(this.id, c, d), t.pushUndoStop(); } } -class dSe extends he { +class iXe extends he { constructor() { super({ id: "editor.action.transpose", label: p("editor.transpose", "Transpose Characters around the Cursor"), alias: "Transpose Characters around the Cursor", - precondition: I.writable + precondition: C.writable }); } run(e, t) { @@ -86719,25 +86719,25 @@ class dSe extends he { if (n === null) return; const o = []; - for (let r = 0, l = i.length; r < l; r++) { - const a = i[r]; - if (!a.isEmpty()) + for (let l = 0, r = i.length; l < r; l++) { + const c = i[l]; + if (!c.isEmpty()) continue; - const c = a.getStartPosition(), d = n.getLineMaxColumn(c.lineNumber); - if (c.column >= d) { - if (c.lineNumber === n.getLineCount()) + const d = c.getStartPosition(), a = n.getLineMaxColumn(d.lineNumber); + if (d.column >= a) { + if (d.lineNumber === n.getLineCount()) continue; - const h = new M(c.lineNumber, Math.max(1, c.column - 1), c.lineNumber + 1, 1), u = n.getValueInRange(h).split("").reverse().join(""); - o.push(new Mn(new fe(c.lineNumber, Math.max(1, c.column - 1), c.lineNumber + 1, 1), u)); + const h = new I(d.lineNumber, Math.max(1, d.column - 1), d.lineNumber + 1, 1), u = n.getValueInRange(h).split("").reverse().join(""); + o.push(new Sn(new ge(d.lineNumber, Math.max(1, d.column - 1), d.lineNumber + 1, 1), u)); } else { - const h = new M(c.lineNumber, Math.max(1, c.column - 1), c.lineNumber, c.column + 1), u = n.getValueInRange(h).split("").reverse().join(""); - o.push(new fE(h, u, new fe(c.lineNumber, c.column + 1, c.lineNumber, c.column + 1))); + const h = new I(d.lineNumber, Math.max(1, d.column - 1), d.lineNumber, d.column + 1), u = n.getValueInRange(h).split("").reverse().join(""); + o.push(new Fv(h, u, new ge(d.lineNumber, d.column + 1, d.lineNumber, d.column + 1))); } } t.pushUndoStop(), t.executeCommands(this.id, o), t.pushUndoStop(); } } -class Km extends he { +class ep extends he { run(e, t) { const i = t.getSelections(); if (i === null) @@ -86748,48 +86748,48 @@ class Km extends he { const o = t.getOption( 132 /* EditorOption.wordSeparators */ - ), r = []; - for (const l of i) - if (l.isEmpty()) { - const a = l.getStartPosition(), c = t.getConfiguredWordAtPosition(a); - if (!c) + ), l = []; + for (const r of i) + if (r.isEmpty()) { + const c = r.getStartPosition(), d = t.getConfiguredWordAtPosition(c); + if (!d) continue; - const d = new M(a.lineNumber, c.startColumn, a.lineNumber, c.endColumn), h = n.getValueInRange(d); - r.push(si.replace(d, this._modifyText(h, o))); + const a = new I(c.lineNumber, d.startColumn, c.lineNumber, d.endColumn), h = n.getValueInRange(a); + l.push(oi.replace(a, this._modifyText(h, o))); } else { - const a = n.getValueInRange(l); - r.push(si.replace(l, this._modifyText(a, o))); + const c = n.getValueInRange(r); + l.push(oi.replace(r, this._modifyText(c, o))); } - t.pushUndoStop(), t.executeEdits(this.id, r), t.pushUndoStop(); + t.pushUndoStop(), t.executeEdits(this.id, l), t.pushUndoStop(); } } -class hSe extends Km { +class nXe extends ep { constructor() { super({ id: "editor.action.transformToUppercase", label: p("editor.transformToUppercase", "Transform to Uppercase"), alias: "Transform to Uppercase", - precondition: I.writable + precondition: C.writable }); } _modifyText(e, t) { return e.toLocaleUpperCase(); } } -class uSe extends Km { +class sXe extends ep { constructor() { super({ id: "editor.action.transformToLowercase", label: p("editor.transformToLowercase", "Transform to Lowercase"), alias: "Transform to Lowercase", - precondition: I.writable + precondition: C.writable }); } _modifyText(e, t) { return e.toLocaleLowerCase(); } } -class Fc { +class Kd { constructor(e, t) { this._pattern = e, this._flags = t, this._actual = null, this._evaluated = !1; } @@ -86807,74 +86807,74 @@ class Fc { return this.get() !== null; } } -const qZ = class qZ extends Km { +const mS = class mS extends ep { constructor() { super({ id: "editor.action.transformToTitlecase", label: p("editor.transformToTitlecase", "Transform to Title Case"), alias: "Transform to Title Case", - precondition: I.writable + precondition: C.writable }); } _modifyText(e, t) { - const i = qZ.titleBoundary.get(); + const i = mS.titleBoundary.get(); return i ? e.toLocaleLowerCase().replace(i, (n) => n.toLocaleUpperCase()) : e; } }; -qZ.titleBoundary = new Fc("(^|[^\\p{L}\\p{N}']|((^|\\P{L})'))\\p{L}", "gmu"); -let dM = qZ; -const ff = class ff extends Km { +mS.titleBoundary = new Kd("(^|[^\\p{L}\\p{N}']|((^|\\P{L})'))\\p{L}", "gmu"); +let II = mS; +const Xg = class Xg extends ep { constructor() { super({ id: "editor.action.transformToSnakecase", label: p("editor.transformToSnakecase", "Transform to Snake Case"), alias: "Transform to Snake Case", - precondition: I.writable + precondition: C.writable }); } _modifyText(e, t) { - const i = ff.caseBoundary.get(), n = ff.singleLetters.get(); + const i = Xg.caseBoundary.get(), n = Xg.singleLetters.get(); return !i || !n ? e : e.replace(i, "$1_$2").replace(n, "$1_$2$3").toLocaleLowerCase(); } }; -ff.caseBoundary = new Fc("(\\p{Ll})(\\p{Lu})", "gmu"), ff.singleLetters = new Fc("(\\p{Lu}|\\p{N})(\\p{Lu})(\\p{Ll})", "gmu"); -let $y = ff; -const $Z = class $Z extends Km { +Xg.caseBoundary = new Kd("(\\p{Ll})(\\p{Lu})", "gmu"), Xg.singleLetters = new Kd("(\\p{Lu}|\\p{N})(\\p{Lu})(\\p{Ll})", "gmu"); +let ay = Xg; +const bS = class bS extends ep { constructor() { super({ id: "editor.action.transformToCamelcase", label: p("editor.transformToCamelcase", "Transform to Camel Case"), alias: "Transform to Camel Case", - precondition: I.writable + precondition: C.writable }); } _modifyText(e, t) { - const i = $Z.wordBoundary.get(); + const i = bS.wordBoundary.get(); if (!i) return e; const n = e.split(i); - return n.shift() + n.map((r) => r.substring(0, 1).toLocaleUpperCase() + r.substring(1)).join(""); + return n.shift() + n.map((l) => l.substring(0, 1).toLocaleUpperCase() + l.substring(1)).join(""); } }; -$Z.wordBoundary = new Fc("[_\\s-]", "gm"); -let hM = $Z; -const bf = class bf extends Km { +bS.wordBoundary = new Kd("[_\\s-]", "gm"); +let SI = bS; +const Vg = class Vg extends ep { constructor() { super({ id: "editor.action.transformToPascalcase", label: p("editor.transformToPascalcase", "Transform to Pascal Case"), alias: "Transform to Pascal Case", - precondition: I.writable + precondition: C.writable }); } _modifyText(e, t) { - const i = bf.wordBoundary.get(), n = bf.wordBoundaryToMaintain.get(); - return !i || !n ? e : e.split(n).map((l) => l.split(i)).flat().map((l) => l.substring(0, 1).toLocaleUpperCase() + l.substring(1)).join(""); + const i = Vg.wordBoundary.get(), n = Vg.wordBoundaryToMaintain.get(); + return !i || !n ? e : e.split(n).map((r) => r.split(i)).flat().map((r) => r.substring(0, 1).toLocaleUpperCase() + r.substring(1)).join(""); } }; -bf.wordBoundary = new Fc("[_\\s-]", "gm"), bf.wordBoundaryToMaintain = new Fc("(?<=\\.)", "gm"); -let uM = bf; -const Wd = class Wd extends Km { +Vg.wordBoundary = new Kd("[_\\s-]", "gm"), Vg.wordBoundaryToMaintain = new Kd("(?<=\\.)", "gm"); +let xI = Vg; +const Ya = class Ya extends ep { static isSupported() { return [ this.caseBoundary, @@ -86887,63 +86887,63 @@ const Wd = class Wd extends Km { id: "editor.action.transformToKebabcase", label: p("editor.transformToKebabcase", "Transform to Kebab Case"), alias: "Transform to Kebab Case", - precondition: I.writable + precondition: C.writable }); } _modifyText(e, t) { - const i = Wd.caseBoundary.get(), n = Wd.singleLetters.get(), o = Wd.underscoreBoundary.get(); + const i = Ya.caseBoundary.get(), n = Ya.singleLetters.get(), o = Ya.underscoreBoundary.get(); return !i || !n || !o ? e : e.replace(o, "$1-$3").replace(i, "$1-$2").replace(n, "$1-$2").toLocaleLowerCase(); } }; -Wd.caseBoundary = new Fc("(\\p{Ll})(\\p{Lu})", "gmu"), Wd.singleLetters = new Fc("(\\p{Lu}|\\p{N})(\\p{Lu}\\p{Ll})", "gmu"), Wd.underscoreBoundary = new Fc("(\\S)(_)(\\S)", "gm"); -let gM = Wd; -ee(UCe); -ee(KCe); -ee(QCe); -ee(jCe); -ee(qCe); -ee($Ce); -ee(eSe); -ee(tSe); -ee(ZV); -ee(iSe); -ee(nSe); -ee(sSe); -ee(oSe); -ee(rSe); -ee(lSe); -ee(aSe); -ee(cSe); -ee(dSe); -ee(hSe); -ee(uSe); -$y.caseBoundary.isSupported() && $y.singleLetters.isSupported() && ee($y); -hM.wordBoundary.isSupported() && ee(hM); -uM.wordBoundary.isSupported() && ee(uM); -dM.titleBoundary.isSupported() && ee(dM); -gM.isSupported() && ee(gM); -var gSe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +Ya.caseBoundary = new Kd("(\\p{Ll})(\\p{Lu})", "gmu"), Ya.singleLetters = new Kd("(\\p{Lu}|\\p{N})(\\p{Lu}\\p{Ll})", "gmu"), Ya.underscoreBoundary = new Kd("(\\S)(_)(\\S)", "gm"); +let CI = Ya; +ee(D1e); +ee(F1e); +ee(z1e); +ee(A1e); +ee(K1e); +ee(U1e); +ee(P1e); +ee(B1e); +ee(B9); +ee(_1e); +ee(Q1e); +ee(O1e); +ee(j1e); +ee(q1e); +ee($1e); +ee(eXe); +ee(tXe); +ee(iXe); +ee(nXe); +ee(sXe); +ay.caseBoundary.isSupported() && ay.singleLetters.isSupported() && ee(ay); +SI.wordBoundary.isSupported() && ee(SI); +xI.wordBoundary.isSupported() && ee(xI); +II.titleBoundary.isSupported() && ee(II); +CI.isSupported() && ee(CI); +var oXe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, OS = function(s, e) { +}, sX = function(s, e) { return function(t, i) { e(t, i, s); }; -}, FL; -const Qj = new ae("LinkedEditingInputVisible", !1), mSe = "linked-editing-decoration"; -var Ch; -let Eb = (Ch = class extends R { +}, tV; +const T7 = new ce("LinkedEditingInputVisible", !1), lXe = "linked-editing-decoration"; +var Lh; +let KZ = (Lh = class extends J { static get(e) { - return e.getContribution(FL.ID); + return e.getContribution(tV.ID); } constructor(e, t, i, n, o) { - super(), this.languageConfigurationService = n, this._syncRangesToken = 0, this._localToDispose = this._register(new U()), this._editor = e, this._providers = i.linkedEditingRangeProvider, this._enabled = !1, this._visibleContextKey = Qj.bindTo(t), this._debounceInformation = o.for(this._providers, "Linked Editing", { max: 200 }), this._currentDecorations = this._editor.createDecorationsCollection(), this._languageWordPattern = null, this._currentWordPattern = null, this._ignoreChangeEvent = !1, this._localToDispose = this._register(new U()), this._rangeUpdateTriggerPromise = null, this._rangeSyncTriggerPromise = null, this._currentRequestCts = null, this._currentRequestPosition = null, this._currentRequestModelVersion = null, this._register(this._editor.onDidChangeModel(() => this.reinitialize(!0))), this._register(this._editor.onDidChangeConfiguration((r) => { - (r.hasChanged( + super(), this.languageConfigurationService = n, this._syncRangesToken = 0, this._localToDispose = this._register(new _()), this._editor = e, this._providers = i.linkedEditingRangeProvider, this._enabled = !1, this._visibleContextKey = T7.bindTo(t), this._debounceInformation = o.for(this._providers, "Linked Editing", { max: 200 }), this._currentDecorations = this._editor.createDecorationsCollection(), this._languageWordPattern = null, this._currentWordPattern = null, this._ignoreChangeEvent = !1, this._localToDispose = this._register(new _()), this._rangeUpdateTriggerPromise = null, this._rangeSyncTriggerPromise = null, this._currentRequestCts = null, this._currentRequestPosition = null, this._currentRequestModelVersion = null, this._register(this._editor.onDidChangeModel(() => this.reinitialize(!0))), this._register(this._editor.onDidChangeConfiguration((l) => { + (l.hasChanged( 70 /* EditorOption.linkedEditing */ - ) || r.hasChanged( + ) || l.hasChanged( 94 /* EditorOption.renameOnType */ )) && this.reinitialize(!1); @@ -86962,25 +86962,25 @@ let Eb = (Ch = class extends R { this._localToDispose.add(se.runAndSubscribe(t.onDidChangeLanguageConfiguration, () => { this._languageWordPattern = this.languageConfigurationService.getLanguageConfiguration(t.getLanguageId()).getWordDefinition(); })); - const n = new fr(this._debounceInformation.get(t)), o = () => { + const n = new yl(this._debounceInformation.get(t)), o = () => { this._rangeUpdateTriggerPromise = n.trigger(() => this.updateRanges(), this._debounceDuration ?? this._debounceInformation.get(t)); - }, r = new fr(0), l = (a) => { - this._rangeSyncTriggerPromise = r.trigger(() => this._syncRanges(a)); + }, l = new yl(0), r = (c) => { + this._rangeSyncTriggerPromise = l.trigger(() => this._syncRanges(c)); }; this._localToDispose.add(this._editor.onDidChangeCursorPosition(() => { o(); - })), this._localToDispose.add(this._editor.onDidChangeModelContent((a) => { + })), this._localToDispose.add(this._editor.onDidChangeModelContent((c) => { if (!this._ignoreChangeEvent && this._currentDecorations.length > 0) { - const c = this._currentDecorations.getRange(0); - if (c && a.changes.every((d) => c.intersectRanges(d.range))) { - l(this._syncRangesToken); + const d = this._currentDecorations.getRange(0); + if (d && c.changes.every((a) => d.intersectRanges(a.range))) { + r(this._syncRangesToken); return; } } o(); })), this._localToDispose.add({ dispose: () => { - n.dispose(), r.dispose(); + n.dispose(), l.dispose(); } }), this.updateRanges(); } @@ -86992,35 +86992,35 @@ let Eb = (Ch = class extends R { return this.clearRanges(); const n = t.getValueInRange(i); if (this._currentWordPattern) { - const r = n.match(this._currentWordPattern); - if ((r ? r[0].length : 0) !== n.length) + const l = n.match(this._currentWordPattern); + if ((l ? l[0].length : 0) !== n.length) return this.clearRanges(); } const o = []; - for (let r = 1, l = this._currentDecorations.length; r < l; r++) { - const a = this._currentDecorations.getRange(r); - if (a) - if (a.startLineNumber !== a.endLineNumber) + for (let l = 1, r = this._currentDecorations.length; l < r; l++) { + const c = this._currentDecorations.getRange(l); + if (c) + if (c.startLineNumber !== c.endLineNumber) o.push({ - range: a, + range: c, text: n }); else { - let c = t.getValueInRange(a), d = n, h = a.startColumn, u = a.endColumn; - const g = Ih(c, d); - h += g, c = c.substr(g), d = d.substr(g); - const m = eA(c, d); - u -= m, c = c.substr(0, c.length - m), d = d.substr(0, d.length - m), (h !== u || d.length !== 0) && o.push({ - range: new M(a.startLineNumber, h, a.endLineNumber, u), - text: d + let d = t.getValueInRange(c), a = n, h = c.startColumn, u = c.endColumn; + const m = Th(d, a); + h += m, d = d.substr(m), a = a.substr(m); + const b = pV(d, a); + u -= b, d = d.substr(0, d.length - b), a = a.substr(0, a.length - b), (h !== u || a.length !== 0) && o.push({ + range: new I(c.startLineNumber, h, c.endLineNumber, u), + text: a }); } } if (o.length !== 0) try { this._editor.popUndoStop(), this._ignoreChangeEvent = !0; - const r = this._editor._getViewModel().getPrevEditOperationType(); - this._editor.executeEdits("linkedEditing", o), this._editor._getViewModel().setPrevEditOperationType(r); + const l = this._editor._getViewModel().getPrevEditOperationType(); + this._editor.executeEdits("linkedEditing", o), this._editor._getViewModel().setPrevEditOperationType(l); } finally { this._ignoreChangeEvent = !1; } @@ -87046,58 +87046,58 @@ let Eb = (Ch = class extends R { if (t.equals(this._currentRequestPosition)) return; if (this._currentDecorations.length > 0) { - const r = this._currentDecorations.getRange(0); - if (r && r.containsPosition(t)) + const l = this._currentDecorations.getRange(0); + if (l && l.containsPosition(t)) return; } } this.clearRanges(), this._currentRequestPosition = t, this._currentRequestModelVersion = n; - const o = this._currentRequestCts = new mi(); + const o = this._currentRequestCts = new pi(); try { - const r = new on(!1), l = await jj(this._providers, i, t, o.token); - if (this._debounceInformation.update(i, r.elapsed()), o !== this._currentRequestCts || (this._currentRequestCts = null, n !== i.getVersionId())) + const l = new ln(!1), r = await M7(this._providers, i, t, o.token); + if (this._debounceInformation.update(i, l.elapsed()), o !== this._currentRequestCts || (this._currentRequestCts = null, n !== i.getVersionId())) return; - let a = []; - l != null && l.ranges && (a = l.ranges), this._currentWordPattern = (l == null ? void 0 : l.wordPattern) || this._languageWordPattern; - let c = !1; - for (let h = 0, u = a.length; h < u; h++) - if (M.containsPosition(a[h], t)) { - if (c = !0, h !== 0) { - const g = a[h]; - a.splice(h, 1), a.unshift(g); + let c = []; + r != null && r.ranges && (c = r.ranges), this._currentWordPattern = (r == null ? void 0 : r.wordPattern) || this._languageWordPattern; + let d = !1; + for (let h = 0, u = c.length; h < u; h++) + if (I.containsPosition(c[h], t)) { + if (d = !0, h !== 0) { + const m = c[h]; + c.splice(h, 1), c.unshift(m); } break; } - if (!c) { + if (!d) { this.clearRanges(); return; } - const d = a.map((h) => ({ range: h, options: FL.DECORATION })); - this._visibleContextKey.set(!0), this._currentDecorations.set(d), this._syncRangesToken++; - } catch (r) { - jr(r) || De(r), (this._currentRequestCts === o || !this._currentRequestCts) && this.clearRanges(); + const a = c.map((h) => ({ range: h, options: tV.DECORATION })); + this._visibleContextKey.set(!0), this._currentDecorations.set(a), this._syncRangesToken++; + } catch (l) { + er(l) || Me(l), (this._currentRequestCts === o || !this._currentRequestCts) && this.clearRanges(); } } -}, FL = Ch, Ch.ID = "editor.contrib.linkedEditing", Ch.DECORATION = Re.register({ +}, tV = Lh, Lh.ID = "editor.contrib.linkedEditing", Lh.DECORATION = Je.register({ description: "linked-editing", stickiness: 0, - className: mSe -}), Ch); -Eb = FL = gSe([ - OS(1, _e), - OS(2, ge), - OS(3, li), - OS(4, jo) -], Eb); -class pSe extends he { + className: lXe +}), Lh); +KZ = tV = oXe([ + sX(1, xe), + sX(2, me), + sX(3, ci), + sX(4, $o) +], KZ); +class rXe extends he { constructor() { super({ id: "editor.action.linkedEditing", label: p("linkedEditing.label", "Start Linked Editing"), alias: "Start Linked Editing", - precondition: H.and(I.writable, I.hasRenameProvider), + precondition: P.and(C.writable, C.hasRenameProvider), kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 3132, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -87105,23 +87105,23 @@ class pSe extends he { }); } runCommand(e, t) { - const i = e.get(ft), [n, o] = Array.isArray(t) && t || [void 0, void 0]; - return Le.isUri(n) && V.isIPosition(o) ? i.openCodeEditor({ resource: n }, i.getActiveCodeEditor()).then((r) => { - r && (r.setPosition(o), r.invokeWithinContext((l) => (this.reportTelemetry(l, r), this.run(l, r)))); - }, De) : super.runCommand(e, t); + const i = e.get(gt), [n, o] = Array.isArray(t) && t || [void 0, void 0]; + return Xe.isUri(n) && Y.isIPosition(o) ? i.openCodeEditor({ resource: n }, i.getActiveCodeEditor()).then((l) => { + l && (l.setPosition(o), l.invokeWithinContext((r) => (this.reportTelemetry(r, l), this.run(r, l)))); + }, Me) : super.runCommand(e, t); } run(e, t) { - const i = Eb.get(t); + const i = KZ.get(t); return i ? Promise.resolve(i.updateRanges(!0)) : Promise.resolve(); } } -const fSe = zi.bindToContribution(Eb.get); -oe(new fSe({ +const cXe = Ai.bindToContribution(KZ.get); +oe(new cXe({ id: "cancelLinkedEditingInput", - precondition: Qj, + precondition: T7, handler: (s) => s.clearRanges(), kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, weight: 199, primary: 9, secondary: [ @@ -87130,30 +87130,30 @@ oe(new fSe({ ] } })); -function jj(s, e, t, i) { +function M7(s, e, t, i) { const n = s.ordered(e); - return qR(n.map((o) => async () => { + return Vv(n.map((o) => async () => { try { return await o.provideLinkedEditingRanges(e, t, i); - } catch (r) { - wi(r); + } catch (l) { + Wi(l); return; } - }), (o) => !!o && $n(o == null ? void 0 : o.ranges)); + }), (o) => !!o && ts(o == null ? void 0 : o.ranges)); } -N("editor.linkedEditingBackground", { dark: K.fromHex("#f00").transparent(0.3), light: K.fromHex("#f00").transparent(0.3), hcDark: K.fromHex("#f00").transparent(0.3), hcLight: K.white }, p("editorLinkedEditingBackground", "Background color when the editor auto renames on type.")); -zs("_executeLinkedEditingProvider", (s, e, t) => { - const { linkedEditingRangeProvider: i } = s.get(ge); - return jj(i, e, t, Ye.None); +R("editor.linkedEditingBackground", { dark: Q.fromHex("#f00").transparent(0.3), light: Q.fromHex("#f00").transparent(0.3), hcDark: Q.fromHex("#f00").transparent(0.3), hcLight: Q.white }, p("editorLinkedEditingBackground", "Background color when the editor auto renames on type.")); +Ks("_executeLinkedEditingProvider", (s, e, t) => { + const { linkedEditingRangeProvider: i } = s.get(me); + return M7(i, e, t, Fe.None); }); -gt( - Eb.ID, - Eb, +mt( + KZ.ID, + KZ, 1 /* EditorContributionInstantiation.AfterFirstRender */ ); -ee(pSe); -let bSe = class { +ee(rXe); +let dXe = class { constructor(e, t) { this._link = e, this._provider = t; } @@ -87177,13 +87177,13 @@ let bSe = class { return this._link.url ? this._link.url : typeof this._provider.resolveLink == "function" ? Promise.resolve(this._provider.resolveLink(this._link, e)).then((t) => (this._link = t || this._link, this._link.url ? this.resolve(e) : Promise.reject(new Error("missing")))) : Promise.reject(new Error("missing")); } }; -class mM { +class RI { constructor(e) { - this._disposables = new U(); + this._disposables = new _(); let t = []; for (const [i, n] of e) { - const o = i.links.map((r) => new bSe(r, n)); - t = mM._union(t, o), __(i) && this._disposables.add(i); + const o = i.links.map((l) => new dXe(l, n)); + t = RI._union(t, o), zS(i) && this._disposables.add(i); } this.links = t; } @@ -87192,80 +87192,80 @@ class mM { } static _union(e, t) { const i = []; - let n, o, r, l; - for (n = 0, r = 0, o = e.length, l = t.length; n < o && r < l; ) { - const a = e[n], c = t[r]; - if (M.areIntersectingOrTouching(a.range, c.range)) { + let n, o, l, r; + for (n = 0, l = 0, o = e.length, r = t.length; n < o && l < r; ) { + const c = e[n], d = t[l]; + if (I.areIntersectingOrTouching(c.range, d.range)) { n++; continue; } - M.compareRangesUsingStarts(a.range, c.range) < 0 ? (i.push(a), n++) : (i.push(c), r++); + I.compareRangesUsingStarts(c.range, d.range) < 0 ? (i.push(c), n++) : (i.push(d), l++); } for (; n < o; n++) i.push(e[n]); - for (; r < l; r++) - i.push(t[r]); + for (; l < r; l++) + i.push(t[l]); return i; } } -function qj(s, e, t) { - const i = [], n = s.ordered(e).reverse().map((o, r) => Promise.resolve(o.provideLinks(e, t)).then((l) => { - l && (i[r] = [l, o]); - }, wi)); +function Y7(s, e, t) { + const i = [], n = s.ordered(e).reverse().map((o, l) => Promise.resolve(o.provideLinks(e, t)).then((r) => { + r && (i[l] = [r, o]); + }, Wi)); return Promise.all(n).then(() => { - const o = new mM(Or(i)); - return t.isCancellationRequested ? (o.dispose(), new mM([])) : o; + const o = new RI(_l(i)); + return t.isCancellationRequested ? (o.dispose(), new RI([])) : o; }); } st.registerCommand("_executeLinkProvider", async (s, ...e) => { let [t, i] = e; - ht(t instanceof Le), typeof i != "number" && (i = 0); - const { linkProvider: n } = s.get(ge), o = s.get(Pt).getModel(t); + ht(t instanceof Xe), typeof i != "number" && (i = 0); + const { linkProvider: n } = s.get(me), o = s.get(At).getModel(t); if (!o) return []; - const r = await qj(n, o, Ye.None); - if (!r) + const l = await Y7(n, o, Fe.None); + if (!l) return []; - for (let a = 0; a < Math.min(i, r.links.length); a++) - await r.links[a].resolve(Ye.None); - const l = r.links.slice(0); - return r.dispose(), l; + for (let c = 0; c < Math.min(i, l.links.length); c++) + await l.links[c].resolve(Fe.None); + const r = l.links.slice(0); + return l.dispose(), r; }); -var ySe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var aXe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, HS = function(s, e) { +}, oX = function(s, e) { return function(t, i) { e(t, i, s); }; -}, _V, Hg; -let O1 = (Hg = class extends R { +}, _9, jm; +let nG = (jm = class extends J { static get(e) { - return e.getContribution(_V.ID); + return e.getContribution(_9.ID); } constructor(e, t, i, n, o) { - super(), this.editor = e, this.openerService = t, this.notificationService = i, this.languageFeaturesService = n, this.providers = this.languageFeaturesService.linkProvider, this.debounceInformation = o.for(this.providers, "Links", { min: 1e3, max: 4e3 }), this.computeLinks = this._register(new Zt(() => this.computeLinksNow(), 1e3)), this.computePromise = null, this.activeLinksList = null, this.currentOccurrences = {}, this.activeLinkDecorationId = null; - const r = this._register(new EI(e)); - this._register(r.onMouseMoveOrRelevantKeyDown(([l, a]) => { - this._onEditorMouseMove(l, a); - })), this._register(r.onExecute((l) => { - this.onEditorMouseUp(l); - })), this._register(r.onCancel((l) => { + super(), this.editor = e, this.openerService = t, this.notificationService = i, this.languageFeaturesService = n, this.providers = this.languageFeaturesService.linkProvider, this.debounceInformation = o.for(this.providers, "Links", { min: 1e3, max: 4e3 }), this.computeLinks = this._register(new St(() => this.computeLinksNow(), 1e3)), this.computePromise = null, this.activeLinksList = null, this.currentOccurrences = {}, this.activeLinkDecorationId = null; + const l = this._register(new $x(e)); + this._register(l.onMouseMoveOrRelevantKeyDown(([r, c]) => { + this._onEditorMouseMove(r, c); + })), this._register(l.onExecute((r) => { + this.onEditorMouseUp(r); + })), this._register(l.onCancel((r) => { this.cleanUpActiveLinkDecoration(); - })), this._register(e.onDidChangeConfiguration((l) => { - l.hasChanged( + })), this._register(e.onDidChangeConfiguration((r) => { + r.hasChanged( 71 /* EditorOption.links */ ) && (this.updateDecorations([]), this.stop(), this.computeLinks.schedule(0)); - })), this._register(e.onDidChangeModelContent((l) => { + })), this._register(e.onDidChangeModelContent((r) => { this.editor.hasModel() && this.computeLinks.schedule(this.debounceInformation.get(this.editor.getModel())); - })), this._register(e.onDidChangeModel((l) => { + })), this._register(e.onDidChangeModel((r) => { this.currentOccurrences = {}, this.activeLinkDecorationId = null, this.stop(), this.computeLinks.schedule(0); - })), this._register(e.onDidChangeModelLanguage((l) => { + })), this._register(e.onDidChangeModelLanguage((r) => { this.stop(), this.computeLinks.schedule(0); - })), this._register(this.providers.onDidChange((l) => { + })), this._register(this.providers.onDidChange((r) => { this.stop(), this.computeLinks.schedule(0); })), this.computeLinks.schedule(0); } @@ -87277,14 +87277,14 @@ let O1 = (Hg = class extends R { return; const e = this.editor.getModel(); if (!e.isTooLargeForSyncing() && this.providers.has(e)) { - this.activeLinksList && (this.activeLinksList.dispose(), this.activeLinksList = null), this.computePromise = Ui((t) => qj(this.providers, e, t)); + this.activeLinksList && (this.activeLinksList.dispose(), this.activeLinksList = null), this.computePromise = Qi((t) => Y7(this.providers, e, t)); try { - const t = new on(!1); + const t = new ln(!1); if (this.activeLinksList = await this.computePromise, this.debounceInformation.update(e, t.elapsed()), e.isDisposed()) return; this.updateDecorations(this.activeLinksList.links); } catch (t) { - De(t); + Me(t); } finally { this.computePromise = null; } @@ -87295,20 +87295,20 @@ let O1 = (Hg = class extends R { 78 /* EditorOption.multiCursorModifier */ ) === "altKey", i = [], n = Object.keys(this.currentOccurrences); - for (const r of n) { - const l = this.currentOccurrences[r]; - i.push(l.decorationId); + for (const l of n) { + const r = this.currentOccurrences[l]; + i.push(r.decorationId); } const o = []; if (e) - for (const r of e) - o.push(Xf.decoration(r, t)); - this.editor.changeDecorations((r) => { - const l = r.deltaDecorations(i, o); + for (const l of e) + o.push(Ug.decoration(l, t)); + this.editor.changeDecorations((l) => { + const r = l.deltaDecorations(i, o); this.currentOccurrences = {}, this.activeLinkDecorationId = null; - for (let a = 0, c = l.length; a < c; a++) { - const d = new Xf(e[a], l[a]); - this.currentOccurrences[d.decorationId] = d; + for (let c = 0, d = r.length; c < d; c++) { + const a = new Ug(e[c], r[c]); + this.currentOccurrences[a.decorationId] = a; } }); } @@ -87353,22 +87353,22 @@ let O1 = (Hg = class extends R { if (!this.openerService) return; const { link: n } = e; - n.resolve(Ye.None).then((o) => { + n.resolve(Fe.None).then((o) => { if (typeof o == "string" && this.editor.hasModel()) { - const r = this.editor.getModel().uri; - if (r.scheme === Ge.file && o.startsWith(`${Ge.file}:`)) { - const l = Le.parse(o); - if (l.scheme === Ge.file) { - const a = $l(l); - let c = null; - a.startsWith("/./") || a.startsWith("\\.\\") ? c = `.${a.substr(1)}` : (a.startsWith("//./") || a.startsWith("\\\\.\\")) && (c = `.${a.substr(2)}`), c && (o = jle(r, c)); + const l = this.editor.getModel().uri; + if (l.scheme === ve.file && o.startsWith(`${ve.file}:`)) { + const r = Xe.parse(o); + if (r.scheme === ve.file) { + const c = nc(r); + let d = null; + c.startsWith("/./") || c.startsWith("\\.\\") ? d = `.${c.substr(1)}` : (c.startsWith("//./") || c.startsWith("\\\\.\\")) && (d = `.${c.substr(2)}`), d && (o = Ace(l, d)); } } } return this.openerService.open(o, { openToSide: t, fromUserGesture: i, allowContributedOpeners: !0, allowCommands: !0, fromWorkspace: !0 }); }, (o) => { - const r = o instanceof Error ? o.message : o; - r === "invalid" ? this.notificationService.warn(p("invalid.url", "Failed to open this link because it is not well-formed: {0}", n.url.toString())) : r === "missing" ? this.notificationService.warn(p("missing.url", "Failed to open this link because its target is missing.")) : De(o); + const l = o instanceof Error ? o.message : o; + l === "invalid" ? this.notificationService.warn(p("invalid.url", "Failed to open this link because it is not well-formed: {0}", n.url.toString())) : l === "missing" ? this.notificationService.warn(p("missing.url", "Failed to open this link because its target is missing.")) : Me(o); }); } getLinkOccurrence(e) { @@ -87397,64 +87397,64 @@ let O1 = (Hg = class extends R { dispose() { super.dispose(), this.stop(); } -}, _V = Hg, Hg.ID = "editor.linkDetector", Hg); -O1 = _V = ySe([ - HS(1, Bs), - HS(2, Vi), - HS(3, ge), - HS(4, jo) -], O1); -const AP = { - general: Re.register({ +}, _9 = jm, jm.ID = "editor.linkDetector", jm); +nG = _9 = aXe([ + oX(1, Ps), + oX(2, vi), + oX(3, me), + oX(4, $o) +], nG); +const _K = { + general: Je.register({ description: "detected-link", stickiness: 1, collapseOnReplaceEdit: !0, inlineClassName: "detected-link" }), - active: Re.register({ + active: Je.register({ description: "detected-link-active", stickiness: 1, collapseOnReplaceEdit: !0, inlineClassName: "detected-link-active" }) }; -class Xf { +class Ug { static decoration(e, t) { return { range: e.range, - options: Xf._getOptions(e, t, !1) + options: Ug._getOptions(e, t, !1) }; } static _getOptions(e, t, i) { - const n = { ...i ? AP.active : AP.general }; - return n.hoverMessage = wSe(e, t), n; + const n = { ...i ? _K.active : _K.general }; + return n.hoverMessage = hXe(e, t), n; } constructor(e, t) { this.link = e, this.decorationId = t; } activate(e, t) { - e.changeDecorationOptions(this.decorationId, Xf._getOptions(this.link, t, !0)); + e.changeDecorationOptions(this.decorationId, Ug._getOptions(this.link, t, !0)); } deactivate(e, t) { - e.changeDecorationOptions(this.decorationId, Xf._getOptions(this.link, t, !1)); + e.changeDecorationOptions(this.decorationId, Ug._getOptions(this.link, t, !1)); } } -function wSe(s, e) { +function hXe(s, e) { const t = s.url && /^command:/i.test(s.url.toString()), i = s.tooltip ? s.tooltip : t ? p("links.navigate.executeCmd", "Execute command") : p("links.navigate.follow", "Follow link"), n = e ? qe ? p("links.navigate.kb.meta.mac", "cmd + click") : p("links.navigate.kb.meta", "ctrl + click") : qe ? p("links.navigate.kb.alt.mac", "option + click") : p("links.navigate.kb.alt", "alt + click"); if (s.url) { let o = ""; if (/^command:/i.test(s.url.toString())) { - const l = s.url.toString().match(/^command:([^?#]+)/); - if (l) { - const a = l[1]; - o = p("tooltip.explanation", "Execute command {0}", a); + const r = s.url.toString().match(/^command:([^?#]+)/); + if (r) { + const c = r[1]; + o = p("tooltip.explanation", "Execute command {0}", c); } } - return new Vn("", !0).appendLink(s.url.toString(!0).replace(/ /g, "%20"), i, o).appendMarkdown(` (${n})`); + return new kn("", !0).appendLink(s.url.toString(!0).replace(/ /g, "%20"), i, o).appendMarkdown(` (${n})`); } else - return new Vn().appendText(`${i} (${n})`); + return new kn().appendText(`${i} (${n})`); } -class CSe extends he { +class uXe extends he { constructor() { super({ id: "editor.action.openLink", @@ -87464,24 +87464,24 @@ class CSe extends he { }); } run(e, t) { - const i = O1.get(t); + const i = nG.get(t); if (!i || !t.hasModel()) return; const n = t.getSelections(); for (const o of n) { - const r = i.getLinkOccurrence(o.getEndPosition()); - r && i.openLinkOccurrence(r, !1); + const l = i.getLinkOccurrence(o.getEndPosition()); + l && i.openLinkOccurrence(l, !1); } } } -gt( - O1.ID, - O1, +mt( + nG.ID, + nG, 1 /* EditorContributionInstantiation.AfterFirstRender */ ); -ee(CSe); -const I9 = class I9 extends R { +ee(uXe); +const $E = class $E extends J { constructor(e) { super(), this._editor = e, this._register(this._editor.onMouseDown((t) => { const i = this._editor.getOption( @@ -87494,105 +87494,105 @@ const I9 = class I9 extends R { })); } }; -I9.ID = "editor.contrib.longLinesHelper"; -let pM = I9; -gt( - pM.ID, - pM, +$E.ID = "editor.contrib.longLinesHelper"; +let NI = $E; +mt( + NI.ID, + NI, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */ ); -const SSe = N("editor.wordHighlightBackground", { dark: "#575757B8", light: "#57575740", hcDark: null, hcLight: null }, p("wordHighlight", "Background color of a symbol during read-access, like reading a variable. The color must not be opaque so as not to hide underlying decorations."), !0); -N("editor.wordHighlightStrongBackground", { dark: "#004972B8", light: "#0e639c40", hcDark: null, hcLight: null }, p("wordHighlightStrong", "Background color of a symbol during write-access, like writing to a variable. The color must not be opaque so as not to hide underlying decorations."), !0); -N("editor.wordHighlightTextBackground", SSe, p("wordHighlightText", "Background color of a textual occurrence for a symbol. The color must not be opaque so as not to hide underlying decorations."), !0); -const LSe = N("editor.wordHighlightBorder", { light: null, dark: null, hcDark: Ut, hcLight: Ut }, p("wordHighlightBorder", "Border color of a symbol during read-access, like reading a variable.")); -N("editor.wordHighlightStrongBorder", { light: null, dark: null, hcDark: Ut, hcLight: Ut }, p("wordHighlightStrongBorder", "Border color of a symbol during write-access, like writing to a variable.")); -N("editor.wordHighlightTextBorder", LSe, p("wordHighlightTextBorder", "Border color of a textual occurrence for a symbol.")); -const ASe = N("editorOverviewRuler.wordHighlightForeground", "#A0A0A0CC", p("overviewRulerWordHighlightForeground", "Overview ruler marker color for symbol highlights. The color must not be opaque so as not to hide underlying decorations."), !0), xSe = N("editorOverviewRuler.wordHighlightStrongForeground", "#C0A0C0CC", p("overviewRulerWordHighlightStrongForeground", "Overview ruler marker color for write-access symbol highlights. The color must not be opaque so as not to hide underlying decorations."), !0), MSe = N("editorOverviewRuler.wordHighlightTextForeground", nU, p("overviewRulerWordHighlightTextForeground", "Overview ruler marker color of a textual occurrence for a symbol. The color must not be opaque so as not to hide underlying decorations."), !0), ZSe = Re.register({ +const mXe = R("editor.wordHighlightBackground", { dark: "#575757B8", light: "#57575740", hcDark: null, hcLight: null }, p("wordHighlight", "Background color of a symbol during read-access, like reading a variable. The color must not be opaque so as not to hide underlying decorations."), !0); +R("editor.wordHighlightStrongBackground", { dark: "#004972B8", light: "#0e639c40", hcDark: null, hcLight: null }, p("wordHighlightStrong", "Background color of a symbol during write-access, like writing to a variable. The color must not be opaque so as not to hide underlying decorations."), !0); +R("editor.wordHighlightTextBackground", mXe, p("wordHighlightText", "Background color of a textual occurrence for a symbol. The color must not be opaque so as not to hide underlying decorations."), !0); +const bXe = R("editor.wordHighlightBorder", { light: null, dark: null, hcDark: _t, hcLight: _t }, p("wordHighlightBorder", "Border color of a symbol during read-access, like reading a variable.")); +R("editor.wordHighlightStrongBorder", { light: null, dark: null, hcDark: _t, hcLight: _t }, p("wordHighlightStrongBorder", "Border color of a symbol during write-access, like writing to a variable.")); +R("editor.wordHighlightTextBorder", bXe, p("wordHighlightTextBorder", "Border color of a textual occurrence for a symbol.")); +const pXe = R("editorOverviewRuler.wordHighlightForeground", "#A0A0A0CC", p("overviewRulerWordHighlightForeground", "Overview ruler marker color for symbol highlights. The color must not be opaque so as not to hide underlying decorations."), !0), gXe = R("editorOverviewRuler.wordHighlightStrongForeground", "#C0A0C0CC", p("overviewRulerWordHighlightStrongForeground", "Overview ruler marker color for write-access symbol highlights. The color must not be opaque so as not to hide underlying decorations."), !0), ZXe = R("editorOverviewRuler.wordHighlightTextForeground", E_, p("overviewRulerWordHighlightTextForeground", "Overview ruler marker color of a textual occurrence for a symbol. The color must not be opaque so as not to hide underlying decorations."), !0), fXe = Je.register({ description: "word-highlight-strong", stickiness: 1, className: "wordHighlightStrong", overviewRuler: { - color: fi(xSe), - position: ur.Center + color: Zi(gXe), + position: pl.Center }, minimap: { - color: fi(sI), + color: Zi(yx), position: 1 /* MinimapPosition.Inline */ } -}), _Se = Re.register({ +}), yXe = Je.register({ description: "word-highlight-text", stickiness: 1, className: "wordHighlightText", overviewRuler: { - color: fi(MSe), - position: ur.Center + color: Zi(ZXe), + position: pl.Center }, minimap: { - color: fi(sI), + color: Zi(yx), position: 1 /* MinimapPosition.Inline */ } -}), ISe = Re.register({ +}), WXe = Je.register({ description: "selection-highlight-overview", stickiness: 1, className: "selectionHighlight", overviewRuler: { - color: fi(nU), - position: ur.Center + color: Zi(E_), + position: pl.Center }, minimap: { - color: fi(sI), + color: Zi(yx), position: 1 /* MinimapPosition.Inline */ } -}), NSe = Re.register({ +}), GXe = Je.register({ description: "selection-highlight", stickiness: 1, className: "selectionHighlight" -}), WSe = Re.register({ +}), XXe = Je.register({ description: "word-highlight", stickiness: 1, className: "wordHighlight", overviewRuler: { - color: fi(ASe), - position: ur.Center + color: Zi(pXe), + position: pl.Center }, minimap: { - color: fi(sI), + color: Zi(yx), position: 1 /* MinimapPosition.Inline */ } }); -function vSe(s) { - return s === fb.Write ? ZSe : s === fb.Text ? _Se : WSe; +function VXe(s) { + return s === XZ.Write ? fXe : s === XZ.Text ? yXe : XXe; } -function TSe(s) { - return s ? NSe : ISe; +function LXe(s) { + return s ? GXe : WXe; } -Lr((s, e) => { - const t = s.getColor(GE); +Il((s, e) => { + const t = s.getColor(rJ); t && e.addRule(`.monaco-editor .selectionHighlight { background-color: ${t.transparent(0.5)}; }`); }); -var DSe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var IXe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, VSe = function(s, e) { +}, SXe = function(s, e) { return function(t, i) { e(t, i, s); }; -}, IV; -function $h(s, e) { +}, Q9; +function nu(s, e) { const t = e.filter((i) => !s.find((n) => n.equals(i))); if (t.length >= 1) { const i = t.map((o) => `line ${o.viewState.position.lineNumber} column ${o.viewState.position.column}`).join(", "), n = t.length === 1 ? p("cursorAdded", "Cursor added: {0}", i) : p("cursorsAdded", "Cursors added: {0}", i); - Bc(n); + _d(n); } } -class kSe extends he { +class xXe extends he { constructor() { super({ id: "editor.action.insertCursorAbove", @@ -87600,7 +87600,7 @@ class kSe extends he { alias: "Add Cursor Above", precondition: void 0, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 2576, linux: { primary: 1552, @@ -87629,11 +87629,11 @@ class kSe extends he { if (o.cursorConfig.readOnly) return; o.model.pushStackElement(); - const r = o.getCursorStates(); - o.setCursorStates(i.source, 3, cn.addCursorUp(o, r, n)), o.revealTopMostCursor(i.source), $h(r, o.getCursorStates()); + const l = o.getCursorStates(); + o.setCursorStates(i.source, 3, an.addCursorUp(o, l, n)), o.revealTopMostCursor(i.source), nu(l, o.getCursorStates()); } } -class GSe extends he { +class CXe extends he { constructor() { super({ id: "editor.action.insertCursorBelow", @@ -87641,7 +87641,7 @@ class GSe extends he { alias: "Add Cursor Below", precondition: void 0, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 2578, linux: { primary: 1554, @@ -87670,11 +87670,11 @@ class GSe extends he { if (o.cursorConfig.readOnly) return; o.model.pushStackElement(); - const r = o.getCursorStates(); - o.setCursorStates(i.source, 3, cn.addCursorDown(o, r, n)), o.revealBottomMostCursor(i.source), $h(r, o.getCursorStates()); + const l = o.getCursorStates(); + o.setCursorStates(i.source, 3, an.addCursorDown(o, l, n)), o.revealBottomMostCursor(i.source), nu(l, o.getCursorStates()); } } -class RSe extends he { +class RXe extends he { constructor() { super({ id: "editor.action.insertCursorAtEndOfEachLineSelected", @@ -87682,7 +87682,7 @@ class RSe extends he { alias: "Add Cursors to Line Ends", precondition: void 0, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 1575, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -87699,19 +87699,19 @@ class RSe extends he { if (!e.isEmpty()) { for (let n = e.startLineNumber; n < e.endLineNumber; n++) { const o = t.getLineMaxColumn(n); - i.push(new fe(n, o, n, o)); + i.push(new ge(n, o, n, o)); } - e.endColumn > 1 && i.push(new fe(e.endLineNumber, e.endColumn, e.endLineNumber, e.endColumn)); + e.endColumn > 1 && i.push(new ge(e.endLineNumber, e.endColumn, e.endLineNumber, e.endColumn)); } } run(e, t) { if (!t.hasModel()) return; - const i = t.getModel(), n = t.getSelections(), o = t._getViewModel(), r = o.getCursorStates(), l = []; - n.forEach((a) => this.getCursorsForSelection(a, i, l)), l.length > 0 && t.setSelections(l), $h(r, o.getCursorStates()); + const i = t.getModel(), n = t.getSelections(), o = t._getViewModel(), l = o.getCursorStates(), r = []; + n.forEach((c) => this.getCursorsForSelection(c, i, r)), r.length > 0 && t.setSelections(r), nu(l, o.getCursorStates()); } } -class ESe extends he { +class NXe extends he { constructor() { super({ id: "editor.action.addCursorsToBottom", @@ -87724,13 +87724,13 @@ class ESe extends he { if (!t.hasModel()) return; const i = t.getSelections(), n = t.getModel().getLineCount(), o = []; - for (let a = i[0].startLineNumber; a <= n; a++) - o.push(new fe(a, i[0].startColumn, a, i[0].endColumn)); - const r = t._getViewModel(), l = r.getCursorStates(); - o.length > 0 && t.setSelections(o), $h(l, r.getCursorStates()); + for (let c = i[0].startLineNumber; c <= n; c++) + o.push(new ge(c, i[0].startColumn, c, i[0].endColumn)); + const l = t._getViewModel(), r = l.getCursorStates(); + o.length > 0 && t.setSelections(o), nu(r, l.getCursorStates()); } } -class XSe extends he { +class wXe extends he { constructor() { super({ id: "editor.action.addCursorsToTop", @@ -87743,41 +87743,41 @@ class XSe extends he { if (!t.hasModel()) return; const i = t.getSelections(), n = []; - for (let l = i[0].startLineNumber; l >= 1; l--) - n.push(new fe(l, i[0].startColumn, l, i[0].endColumn)); - const o = t._getViewModel(), r = o.getCursorStates(); - n.length > 0 && t.setSelections(n), $h(r, o.getCursorStates()); + for (let r = i[0].startLineNumber; r >= 1; r--) + n.push(new ge(r, i[0].startColumn, r, i[0].endColumn)); + const o = t._getViewModel(), l = o.getCursorStates(); + n.length > 0 && t.setSelections(n), nu(l, o.getCursorStates()); } } -class JS { +class lX { constructor(e, t, i) { this.selections = e, this.revealRange = t, this.revealScrollType = i; } } -class H1 { +class sG { static create(e, t) { if (!e.hasModel()) return null; const i = t.getState(); if (!e.hasTextFocus() && i.isRevealed && i.searchString.length > 0) - return new H1(e, t, !1, i.searchString, i.wholeWord, i.matchCase, null); - let n = !1, o, r; - const l = e.getSelections(); - l.length === 1 && l[0].isEmpty() ? (n = !0, o = !0, r = !0) : (o = i.wholeWord, r = i.matchCase); - const a = e.getSelection(); - let c, d = null; - if (a.isEmpty()) { - const h = e.getConfiguredWordAtPosition(a.getStartPosition()); + return new sG(e, t, !1, i.searchString, i.wholeWord, i.matchCase, null); + let n = !1, o, l; + const r = e.getSelections(); + r.length === 1 && r[0].isEmpty() ? (n = !0, o = !0, l = !0) : (o = i.wholeWord, l = i.matchCase); + const c = e.getSelection(); + let d, a = null; + if (c.isEmpty()) { + const h = e.getConfiguredWordAtPosition(c.getStartPosition()); if (!h) return null; - c = h.word, d = new fe(a.startLineNumber, h.startColumn, a.startLineNumber, h.endColumn); + d = h.word, a = new ge(c.startLineNumber, h.startColumn, c.startLineNumber, h.endColumn); } else - c = e.getModel().getValueInRange(a).replace(/\r\n/g, ` + d = e.getModel().getValueInRange(c).replace(/\r\n/g, ` `); - return new H1(e, t, n, c, o, r, d); + return new sG(e, t, n, d, o, l, a); } - constructor(e, t, i, n, o, r, l) { - this._editor = e, this.findController = t, this.isDisconnectedFromFindController = i, this.searchText = n, this.wholeWord = o, this.matchCase = r, this.currentMatch = l; + constructor(e, t, i, n, o, l, r) { + this._editor = e, this.findController = t, this.isDisconnectedFromFindController = i, this.searchText = n, this.wholeWord = o, this.matchCase = l, this.currentMatch = r; } addSelectionToNextFindMatch() { if (!this._editor.hasModel()) @@ -87786,7 +87786,7 @@ class H1 { if (!e) return null; const t = this._editor.getSelections(); - return new JS( + return new lX( t.concat(e), e, 0 @@ -87800,7 +87800,7 @@ class H1 { if (!e) return null; const t = this._editor.getSelections(); - return new JS( + return new lX( t.slice(0, t.length - 1).concat(e), e, 0 @@ -87819,7 +87819,7 @@ class H1 { 132 /* EditorOption.wordSeparators */ ) : null, !1); - return i ? new fe(i.range.startLineNumber, i.range.startColumn, i.range.endLineNumber, i.range.endColumn) : null; + return i ? new ge(i.range.startLineNumber, i.range.startColumn, i.range.endLineNumber, i.range.endColumn) : null; } addSelectionToPreviousFindMatch() { if (!this._editor.hasModel()) @@ -87828,7 +87828,7 @@ class H1 { if (!e) return null; const t = this._editor.getSelections(); - return new JS( + return new lX( t.concat(e), e, 0 @@ -87842,7 +87842,7 @@ class H1 { if (!e) return null; const t = this._editor.getSelections(); - return new JS( + return new lX( t.slice(0, t.length - 1).concat(e), e, 0 @@ -87861,7 +87861,7 @@ class H1 { 132 /* EditorOption.wordSeparators */ ) : null, !1); - return i ? new fe(i.range.startLineNumber, i.range.startColumn, i.range.endLineNumber, i.range.endColumn) : null; + return i ? new ge(i.range.startLineNumber, i.range.startColumn, i.range.endLineNumber, i.range.endColumn) : null; } selectAll(e) { if (!this._editor.hasModel()) @@ -87895,19 +87895,19 @@ class H1 { ); } } -const e_ = class e_ extends R { +const pS = class pS extends J { static get(e) { - return e.getContribution(e_.ID); + return e.getContribution(pS.ID); } constructor(e) { - super(), this._sessionDispose = this._register(new U()), this._editor = e, this._ignoreSelectionChange = !1, this._session = null; + super(), this._sessionDispose = this._register(new _()), this._editor = e, this._ignoreSelectionChange = !1, this._session = null; } dispose() { this._endSession(), super.dispose(); } _beginSessionIfNeeded(e) { if (!this._session) { - const t = H1.create(this._editor, e); + const t = sG.create(this._editor, e); if (!t) return; this._session = t; @@ -87939,7 +87939,7 @@ const e_ = class e_ extends R { if (!t.isEmpty()) return t; const i = this._editor.getConfiguredWordAtPosition(t.getStartPosition()); - return i ? new fe(t.startLineNumber, i.startColumn, t.startLineNumber, i.endColumn) : t; + return i ? new ge(t.startLineNumber, i.startColumn, t.startLineNumber, i.endColumn) : t; } _applySessionResult(e) { e && (this._setSelections(e.selections), e.revealRange && this._editor.revealRangeInCenterIfOutsideViewport(e.revealRange, e.revealScrollType)); @@ -87953,11 +87953,11 @@ const e_ = class e_ extends R { const t = this._editor.getSelections(); if (t.length > 1) { const n = e.getState().matchCase; - if (!$j(this._editor.getModel(), t, n)) { - const r = this._editor.getModel(), l = []; - for (let a = 0, c = t.length; a < c; a++) - l[a] = this._expandEmptyToWord(r, t[a]); - this._editor.setSelections(l); + if (!k7(this._editor.getModel(), t, n)) { + const l = this._editor.getModel(), r = []; + for (let c = 0, d = t.length; c < d; c++) + r[c] = this._expandEmptyToWord(l, t[c]); + this._editor.setSelections(r); return; } } @@ -88013,38 +88013,38 @@ const e_ = class e_ extends R { } if (t.length > 0) { const n = this._editor.getSelection(); - for (let o = 0, r = t.length; o < r; o++) { - const l = t[o]; - if (l.range.intersectRanges(n)) { - t[o] = t[0], t[0] = l; + for (let o = 0, l = t.length; o < l; o++) { + const r = t[o]; + if (r.range.intersectRanges(n)) { + t[o] = t[0], t[0] = r; break; } } - this._setSelections(t.map((o) => new fe(o.range.startLineNumber, o.range.startColumn, o.range.endLineNumber, o.range.endColumn))); + this._setSelections(t.map((o) => new ge(o.range.startLineNumber, o.range.startColumn, o.range.endLineNumber, o.range.endColumn))); } } }; -e_.ID = "editor.contrib.multiCursorController"; -let Xb = e_; -class C0 extends he { +pS.ID = "editor.contrib.multiCursorController"; +let UZ = pS; +class S0 extends he { run(e, t) { - const i = Xb.get(t); + const i = UZ.get(t); if (!i) return; const n = t._getViewModel(); if (n) { - const o = n.getCursorStates(), r = Fs.get(t); - if (r) - this._run(i, r); + const o = n.getCursorStates(), l = zs.get(t); + if (l) + this._run(i, l); else { - const l = e.get(Se).createInstance(Fs, t); - this._run(i, l), l.dispose(); + const r = e.get(Ge).createInstance(zs, t); + this._run(i, r), r.dispose(); } - $h(o, n.getCursorStates()); + nu(o, n.getCursorStates()); } } } -class FSe extends C0 { +class TXe extends S0 { constructor() { super({ id: "editor.action.addSelectionToNextFindMatch", @@ -88052,7 +88052,7 @@ class FSe extends C0 { alias: "Add Selection To Next Find Match", precondition: void 0, kbOpts: { - kbExpr: I.focus, + kbExpr: C.focus, primary: 2082, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -88069,7 +88069,7 @@ class FSe extends C0 { e.addSelectionToNextFindMatch(t); } } -class YSe extends C0 { +class MXe extends S0 { constructor() { super({ id: "editor.action.addSelectionToPreviousFindMatch", @@ -88088,7 +88088,7 @@ class YSe extends C0 { e.addSelectionToPreviousFindMatch(t); } } -class zSe extends C0 { +class YXe extends S0 { constructor() { super({ id: "editor.action.moveSelectionToNextFindMatch", @@ -88096,8 +88096,8 @@ class zSe extends C0 { alias: "Move Last Selection To Next Find Match", precondition: void 0, kbOpts: { - kbExpr: I.focus, - primary: Xi( + kbExpr: C.focus, + primary: Di( 2089, 2082 /* KeyCode.KeyD */ @@ -88111,7 +88111,7 @@ class zSe extends C0 { e.moveSelectionToNextFindMatch(t); } } -class PSe extends C0 { +class kXe extends S0 { constructor() { super({ id: "editor.action.moveSelectionToPreviousFindMatch", @@ -88124,7 +88124,7 @@ class PSe extends C0 { e.moveSelectionToPreviousFindMatch(t); } } -class BSe extends C0 { +class vXe extends S0 { constructor() { super({ id: "editor.action.selectHighlights", @@ -88132,7 +88132,7 @@ class BSe extends C0 { alias: "Select All Occurrences of Find Match", precondition: void 0, kbOpts: { - kbExpr: I.focus, + kbExpr: C.focus, primary: 3114, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -88149,15 +88149,15 @@ class BSe extends C0 { e.selectAll(t); } } -class OSe extends C0 { +class JXe extends S0 { constructor() { super({ id: "editor.action.changeAll", label: p("changeAll.label", "Change All Occurrences"), alias: "Change All Occurrences", - precondition: H.and(I.writable, I.editorTextFocus), + precondition: P.and(C.writable, C.editorTextFocus), kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 2108, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -88172,21 +88172,21 @@ class OSe extends C0 { e.selectAll(t); } } -class HSe { +class HXe { constructor(e, t, i, n, o) { this._model = e, this._searchText = t, this._matchCase = i, this._wordSeparators = n, this._modelVersionId = this._model.getVersionId(), this._cachedFindMatches = null, o && this._model === o._model && this._searchText === o._searchText && this._matchCase === o._matchCase && this._wordSeparators === o._wordSeparators && this._modelVersionId === o._modelVersionId && (this._cachedFindMatches = o._cachedFindMatches); } findMatches() { - return this._cachedFindMatches === null && (this._cachedFindMatches = this._model.findMatches(this._searchText, !0, !1, this._matchCase, this._wordSeparators, !1).map((e) => e.range), this._cachedFindMatches.sort(M.compareRangesUsingStarts)), this._cachedFindMatches; + return this._cachedFindMatches === null && (this._cachedFindMatches = this._model.findMatches(this._searchText, !0, !1, this._matchCase, this._wordSeparators, !1).map((e) => e.range), this._cachedFindMatches.sort(I.compareRangesUsingStarts)), this._cachedFindMatches; } } -var Jg; -let fM = (Jg = class extends R { +var qm; +let wI = (qm = class extends J { constructor(e, t) { super(), this._languageFeaturesService = t, this.editor = e, this._isEnabled = e.getOption( 109 /* EditorOption.selectionHighlight */ - ), this._decorations = e.createDecorationsCollection(), this.updateSoon = this._register(new Zt(() => this._update(), 300)), this.state = null, this._register(e.onDidChangeConfiguration((n) => { + ), this._decorations = e.createDecorationsCollection(), this.updateSoon = this._register(new St(() => this._update(), 300)), this.state = null, this._register(e.onDidChangeConfiguration((n) => { this._isEnabled = e.getOption( 109 /* EditorOption.selectionHighlight */ @@ -88198,13 +88198,13 @@ let fM = (Jg = class extends R { })), this._register(e.onDidChangeModelContent((n) => { this._isEnabled && this.updateSoon.schedule(); })); - const i = Fs.get(e); + const i = zs.get(e); i && this._register(i.getState().onFindReplaceStateChange((n) => { this._update(); })), this.updateSoon.schedule(); } _update() { - this._setState(IV._createState(this.state, this._isEnabled, this.editor)); + this._setState(Q9._createState(this.state, this._isEnabled, this.editor)); } static _createState(e, t, i) { if (!t || !i.hasModel()) @@ -88212,33 +88212,33 @@ let fM = (Jg = class extends R { const n = i.getSelection(); if (n.startLineNumber !== n.endLineNumber) return null; - const o = Xb.get(i); + const o = UZ.get(i); if (!o) return null; - const r = Fs.get(i); - if (!r) + const l = zs.get(i); + if (!l) return null; - let l = o.getSession(r); - if (!l) { - const d = i.getSelections(); - if (d.length > 1) { - const u = r.getState().matchCase; - if (!$j(i.getModel(), d, u)) + let r = o.getSession(l); + if (!r) { + const a = i.getSelections(); + if (a.length > 1) { + const u = l.getState().matchCase; + if (!k7(i.getModel(), a, u)) return null; } - l = H1.create(i, r); + r = sG.create(i, l); } - if (!l || l.currentMatch || /^[ \t]+$/.test(l.searchText) || l.searchText.length > 200) + if (!r || r.currentMatch || /^[ \t]+$/.test(r.searchText) || r.searchText.length > 200) return null; - const a = r.getState(), c = a.matchCase; - if (a.isRevealed) { - let d = a.searchString; - c || (d = d.toLowerCase()); - let h = l.searchText; - if (c || (h = h.toLowerCase()), d === h && l.matchCase === a.matchCase && l.wholeWord === a.wholeWord && !a.isRegex) + const c = l.getState(), d = c.matchCase; + if (c.isRevealed) { + let a = c.searchString; + d || (a = a.toLowerCase()); + let h = r.searchText; + if (d || (h = h.toLowerCase()), a === h && r.matchCase === c.matchCase && r.wholeWord === c.wholeWord && !c.isRegex) return null; } - return new HSe(i.getModel(), l.searchText, l.matchCase, l.wholeWord ? i.getOption( + return new HXe(i.getModel(), r.searchText, r.matchCase, r.wholeWord ? i.getOption( 132 /* EditorOption.wordSeparators */ ) : null, e); @@ -88254,50 +88254,50 @@ let fM = (Jg = class extends R { if (t.isTooLargeForTokenization()) return; const i = this.state.findMatches(), n = this.editor.getSelections(); - n.sort(M.compareRangesUsingStarts); + n.sort(I.compareRangesUsingStarts); const o = []; - for (let c = 0, d = 0, h = i.length, u = n.length; c < h; ) { - const g = i[c]; - if (d >= u) - o.push(g), c++; + for (let d = 0, a = 0, h = i.length, u = n.length; d < h; ) { + const m = i[d]; + if (a >= u) + o.push(m), d++; else { - const m = M.compareRangesUsingStarts(g, n[d]); - m < 0 ? ((n[d].isEmpty() || !M.areIntersecting(g, n[d])) && o.push(g), c++) : (m > 0 || c++, d++); + const b = I.compareRangesUsingStarts(m, n[a]); + b < 0 ? ((n[a].isEmpty() || !I.areIntersecting(m, n[a])) && o.push(m), d++) : (b > 0 || d++, a++); } } - const r = this.editor.getOption( + const l = this.editor.getOption( 81 /* EditorOption.occurrencesHighlight */ - ) !== "off", l = this._languageFeaturesService.documentHighlightProvider.has(t) && r, a = o.map((c) => ({ - range: c, - options: TSe(l) + ) !== "off", r = this._languageFeaturesService.documentHighlightProvider.has(t) && l, c = o.map((d) => ({ + range: d, + options: LXe(r) })); - this._decorations.set(a); + this._decorations.set(c); } dispose() { this._setState(null), super.dispose(); } -}, IV = Jg, Jg.ID = "editor.contrib.selectionHighlighter", Jg); -fM = IV = DSe([ - VSe(1, ge) -], fM); -function $j(s, e, t) { - const i = xP(s, e[0], !t); +}, Q9 = qm, qm.ID = "editor.contrib.selectionHighlighter", qm); +wI = Q9 = IXe([ + SXe(1, me) +], wI); +function k7(s, e, t) { + const i = QK(s, e[0], !t); for (let n = 1, o = e.length; n < o; n++) { - const r = e[n]; - if (r.isEmpty()) + const l = e[n]; + if (l.isEmpty()) return !1; - const l = xP(s, r, !t); - if (i !== l) + const r = QK(s, l, !t); + if (i !== r) return !1; } return !0; } -function xP(s, e, t) { +function QK(s, e, t) { const i = s.getValueInRange(e); return t ? i.toLowerCase() : i; } -class JSe extends he { +class EXe extends he { constructor() { super({ id: "editor.action.focusNextCursor", @@ -88317,11 +88317,11 @@ class JSe extends he { if (n.cursorConfig.readOnly) return; n.model.pushStackElement(); - const o = Array.from(n.getCursorStates()), r = o.shift(); - r && (o.push(r), n.setCursorStates(i.source, 3, o), n.revealPrimaryCursor(i.source, !0), $h(o, n.getCursorStates())); + const o = Array.from(n.getCursorStates()), l = o.shift(); + l && (o.push(l), n.setCursorStates(i.source, 3, o), n.revealPrimaryCursor(i.source, !0), nu(o, n.getCursorStates())); } } -class USe extends he { +class DXe extends he { constructor() { super({ id: "editor.action.focusPreviousCursor", @@ -88341,221 +88341,221 @@ class USe extends he { if (n.cursorConfig.readOnly) return; n.model.pushStackElement(); - const o = Array.from(n.getCursorStates()), r = o.pop(); - r && (o.unshift(r), n.setCursorStates(i.source, 3, o), n.revealPrimaryCursor(i.source, !0), $h(o, n.getCursorStates())); + const o = Array.from(n.getCursorStates()), l = o.pop(); + l && (o.unshift(l), n.setCursorStates(i.source, 3, o), n.revealPrimaryCursor(i.source, !0), nu(o, n.getCursorStates())); } } -gt( - Xb.ID, - Xb, +mt( + UZ.ID, + UZ, 4 /* EditorContributionInstantiation.Lazy */ ); -gt( - fM.ID, - fM, +mt( + wI.ID, + wI, 1 /* EditorContributionInstantiation.AfterFirstRender */ ); -ee(kSe); -ee(GSe); -ee(RSe); -ee(FSe); -ee(YSe); -ee(zSe); -ee(PSe); -ee(BSe); -ee(OSe); -ee(ESe); -ee(XSe); -ee(JSe); -ee(USe); -const KSe = "editor.action.inlineEdit.accept", QSe = "editor.action.inlineEdit.reject", jSe = "editor.action.inlineEdit.jumpTo", qSe = "editor.action.inlineEdit.jumpBack"; -var $Se = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +ee(xXe); +ee(CXe); +ee(RXe); +ee(TXe); +ee(MXe); +ee(YXe); +ee(kXe); +ee(vXe); +ee(JXe); +ee(NXe); +ee(wXe); +ee(EXe); +ee(DXe); +const FXe = "editor.action.inlineEdit.accept", zXe = "editor.action.inlineEdit.reject", AXe = "editor.action.inlineEdit.jumpTo", KXe = "editor.action.inlineEdit.jumpBack"; +var UXe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, eLe = function(s, e) { +}, PXe = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const HW = "inline-edit"; -let NV = class extends R { +const cN = "inline-edit"; +let O9 = class extends J { constructor(e, t, i) { - super(), this.editor = e, this.model = t, this.languageService = i, this.isDisposed = Oe(this, !1), this.currentTextModel = St(this, this.editor.onDidChangeModel, () => ( + super(), this.editor = e, this.model = t, this.languageService = i, this.isDisposed = Ue(this, !1), this.currentTextModel = Gt(this, this.editor.onDidChangeModel, () => ( /** @description editor.model */ this.editor.getModel() - )), this.uiState = ye(this, (n) => { - var w; + )), this.uiState = fe(this, (n) => { + var y; if (this.isDisposed.read(n)) return; const o = this.currentTextModel.read(n); if (o !== this.model.targetTextModel.read(n)) return; - const r = this.model.ghostText.read(n); - if (!r) + const l = this.model.ghostText.read(n); + if (!l) return; - let l = (w = this.model.range) == null ? void 0 : w.read(n); - l && l.startLineNumber === l.endLineNumber && l.startColumn === l.endColumn && (l = void 0); - const a = (l ? l.startLineNumber === l.endLineNumber : !0) && r.parts.length === 1 && r.parts[0].lines.length === 1, c = r.parts.length === 1 && r.parts[0].lines.every((C) => C.length === 0), d = [], h = []; - function u(C, S) { + let r = (y = this.model.range) == null ? void 0 : y.read(n); + r && r.startLineNumber === r.endLineNumber && r.startColumn === r.endColumn && (r = void 0); + const c = (r ? r.startLineNumber === r.endLineNumber : !0) && l.parts.length === 1 && l.parts[0].lines.length === 1, d = l.parts.length === 1 && l.parts[0].lines.every((W) => W.length === 0), a = [], h = []; + function u(W, G) { if (h.length > 0) { - const L = h[h.length - 1]; - S && L.decorations.push(new ds( - L.content.length + 1, - L.content.length + 1 + C[0].length, - S, + const X = h[h.length - 1]; + G && X.decorations.push(new us( + X.content.length + 1, + X.content.length + 1 + W[0].length, + G, 0 /* InlineDecorationType.Regular */ - )), L.content += C[0], C = C.slice(1); + )), X.content += W[0], W = W.slice(1); } - for (const L of C) + for (const X of W) h.push({ - content: L, - decorations: S ? [new ds( + content: X, + decorations: G ? [new us( 1, - L.length + 1, - S, + X.length + 1, + G, 0 /* InlineDecorationType.Regular */ )] : [] }); } - const g = o.getLineContent(r.lineNumber); - let m, f = 0; - if (!c && (a || !l)) { - for (const C of r.parts) { - let S = C.lines; - l && !a && (u(S, HW), S = []), m === void 0 ? (d.push({ - column: C.column, - text: S[0], - preview: C.preview - }), S = S.slice(1)) : u([g.substring(f, C.column - 1)], void 0), S.length > 0 && (u(S, HW), m === void 0 && C.column <= g.length && (m = C.column)), f = C.column - 1; + const m = o.getLineContent(l.lineNumber); + let b, g = 0; + if (!d && (c || !r)) { + for (const W of l.parts) { + let G = W.lines; + r && !c && (u(G, cN), G = []), b === void 0 ? (a.push({ + column: W.column, + text: G[0], + preview: W.preview + }), G = G.slice(1)) : u([m.substring(g, W.column - 1)], void 0), G.length > 0 && (u(G, cN), b === void 0 && W.column <= m.length && (b = W.column)), g = W.column - 1; } - m !== void 0 && u([g.substring(f)], void 0); + b !== void 0 && u([m.substring(g)], void 0); } - const b = m !== void 0 ? new Vj(m, g.length + 1) : void 0, y = a || !l ? r.lineNumber : l.endLineNumber - 1; + const Z = b !== void 0 ? new g7(b, m.length + 1) : void 0, f = c || !r ? l.lineNumber : r.endLineNumber - 1; return { - inlineTexts: d, + inlineTexts: a, additionalLines: h, - hiddenRange: b, - lineNumber: y, + hiddenRange: Z, + lineNumber: f, additionalReservedLineCount: this.model.minReservedLineCount.read(n), targetTextModel: o, - range: l, - isSingleLine: a, - isPureRemove: c + range: r, + isSingleLine: c, + isPureRemove: d }; - }), this.decorations = ye(this, (n) => { + }), this.decorations = fe(this, (n) => { const o = this.uiState.read(n); if (!o) return []; - const r = []; - if (o.hiddenRange && r.push({ + const l = []; + if (o.hiddenRange && l.push({ range: o.hiddenRange.toRange(o.lineNumber), options: { inlineClassName: "inline-edit-hidden", description: "inline-edit-hidden" } }), o.range) { - const l = []; + const r = []; if (o.isSingleLine) - l.push(o.range); + r.push(o.range); else if (!o.isPureRemove) { - const a = o.range.endLineNumber - o.range.startLineNumber; - for (let c = 0; c < a; c++) { - const d = o.range.startLineNumber + c, h = o.targetTextModel.getLineFirstNonWhitespaceColumn(d), u = o.targetTextModel.getLineLastNonWhitespaceColumn(d), g = new M(d, h, d, u); - l.push(g); + const c = o.range.endLineNumber - o.range.startLineNumber; + for (let d = 0; d < c; d++) { + const a = o.range.startLineNumber + d, h = o.targetTextModel.getLineFirstNonWhitespaceColumn(a), u = o.targetTextModel.getLineLastNonWhitespaceColumn(a), m = new I(a, h, a, u); + r.push(m); } } - for (const a of l) - r.push({ - range: a, - options: Lb + for (const c of r) + l.push({ + range: c, + options: CZ }); } if (o.range && !o.isSingleLine && o.isPureRemove) { - const l = new M(o.range.startLineNumber, 1, o.range.endLineNumber - 1, 1); - r.push({ - range: l, - options: w1 + const r = new I(o.range.startLineNumber, 1, o.range.endLineNumber - 1, 1); + l.push({ + range: r, + options: wW }); } - for (const l of o.inlineTexts) - r.push({ - range: M.fromPositions(new V(o.lineNumber, l.column)), + for (const r of o.inlineTexts) + l.push({ + range: I.fromPositions(new Y(o.lineNumber, r.column)), options: { - description: HW, - after: { content: l.text, inlineClassName: l.preview ? "inline-edit-decoration-preview" : "inline-edit-decoration", cursorStops: Xr.Left }, + description: cN, + after: { content: r.text, inlineClassName: r.preview ? "inline-edit-decoration-preview" : "inline-edit-decoration", cursorStops: zl.Left }, showIfCollapsed: !0 } }); - return r; - }), this._register(Ce(() => { + return l; + }), this._register(We(() => { this.isDisposed.set(!0, void 0); - })), this._register(kj(this.editor, this.decorations)); + })), this._register(Z7(this.editor, this.decorations)); } }; -NV = $Se([ - eLe(2, ri) -], NV); -var K5 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +O9 = UXe([ + PXe(2, ri) +], O9); +var WE = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, pa = function(s, e) { +}, yc = function(s, e) { return function(t, i) { e(t, i, s); }; -}, YL; -let WV = class extends R { +}, iV; +let j9 = class extends J { constructor(e, t, i) { - super(), this.editor = e, this.model = t, this.instantiationService = i, this.alwaysShowToolbar = St(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption( + super(), this.editor = e, this.model = t, this.instantiationService = i, this.alwaysShowToolbar = Gt(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption( 63 /* EditorOption.inlineEdit */ - ).showToolbar === "always"), this.sessionPosition = void 0, this.position = ye(this, (n) => { - var a, c; - const o = (a = this.model.read(n)) == null ? void 0 : a.model.ghostText.read(n); + ).showToolbar === "always"), this.sessionPosition = void 0, this.position = fe(this, (n) => { + var c, d; + const o = (c = this.model.read(n)) == null ? void 0 : c.model.ghostText.read(n); if (!this.alwaysShowToolbar.read(n) || !o || o.parts.length === 0) return this.sessionPosition = void 0, null; - const r = o.parts[0].column; + const l = o.parts[0].column; this.sessionPosition && this.sessionPosition.lineNumber !== o.lineNumber && (this.sessionPosition = void 0); - const l = new V(o.lineNumber, Math.min(r, ((c = this.sessionPosition) == null ? void 0 : c.column) ?? Number.MAX_SAFE_INTEGER)); - return this.sessionPosition = l, l; - }), this._register(ks((n, o) => { + const r = new Y(o.lineNumber, Math.min(l, ((d = this.sessionPosition) == null ? void 0 : d.column) ?? Number.MAX_SAFE_INTEGER)); + return this.sessionPosition = r, r; + }), this._register(Js((n, o) => { if (!this.model.read(n) || !this.alwaysShowToolbar.read(n)) return; - const l = o.add(this.instantiationService.createInstance(vV, this.editor, !0, this.position)); - e.addContentWidget(l), o.add(Ce(() => e.removeContentWidget(l))); + const r = o.add(this.instantiationService.createInstance(q9, this.editor, !0, this.position)); + e.addContentWidget(r), o.add(We(() => e.removeContentWidget(r))); })); } }; -WV = K5([ - pa(2, Se) -], WV); -var Sh; -let vV = (Sh = class extends R { - constructor(e, t, i, n, o, r) { - super(), this.editor = e, this.withBorder = t, this._position = i, this._contextKeyService = o, this._menuService = r, this.id = `InlineEditHintsContentWidget${YL.id++}`, this.allowEditorOverflow = !0, this.suppressMouseDown = !1, this.nodes = Qe("div.inlineEditHints", { className: this.withBorder ? ".withBorder" : "" }, [ - Qe("div@toolBar") - ]), this.inlineCompletionsActionsMenus = this._register(this._menuService.createMenu(pe.InlineEditActions, this._contextKeyService)), this.toolBar = this._register(n.createInstance(TV, this.nodes.toolBar, this.editor, pe.InlineEditToolbar, { +j9 = WE([ + yc(2, Ge) +], j9); +var Ih; +let q9 = (Ih = class extends J { + constructor(e, t, i, n, o, l) { + super(), this.editor = e, this.withBorder = t, this._position = i, this._contextKeyService = o, this._menuService = l, this.id = `InlineEditHintsContentWidget${iV.id++}`, this.allowEditorOverflow = !0, this.suppressMouseDown = !1, this.nodes = Oe("div.inlineEditHints", { className: this.withBorder ? ".withBorder" : "" }, [ + Oe("div@toolBar") + ]), this.inlineCompletionsActionsMenus = this._register(this._menuService.createMenu(pe.InlineEditActions, this._contextKeyService)), this.toolBar = this._register(n.createInstance($9, this.nodes.toolBar, this.editor, pe.InlineEditToolbar, { menuOptions: { renderShortTitle: !0 }, - toolbarOptions: { primaryGroup: (l) => l.startsWith("primary") }, - actionViewItemProvider: (l, a) => { - if (l instanceof ao) - return n.createInstance(tLe, l, void 0); + toolbarOptions: { primaryGroup: (r) => r.startsWith("primary") }, + actionViewItemProvider: (r, c) => { + if (r instanceof ho) + return n.createInstance(BXe, r, void 0); }, telemetrySource: "InlineEditToolbar" - })), this._register(this.toolBar.onDidChangeDropdownVisibility((l) => { - YL._dropDownVisible = l; - })), this._register(Te((l) => { - this._position.read(l), this.editor.layoutContentWidget(this); - })), this._register(Te((l) => { - const a = []; - for (const [c, d] of this.inlineCompletionsActionsMenus.getActions()) - for (const h of d) - h instanceof ao && a.push(h); - a.length > 0 && a.unshift(new Qi()), this.toolBar.setAdditionalSecondaryActions(a); + })), this._register(this.toolBar.onDidChangeDropdownVisibility((r) => { + iV._dropDownVisible = r; + })), this._register(Te((r) => { + this._position.read(r), this.editor.layoutContentWidget(this); + })), this._register(Te((r) => { + const c = []; + for (const [d, a] of this.inlineCompletionsActionsMenus.getActions()) + for (const h of a) + h instanceof ho && c.push(h); + c.length > 0 && c.unshift(new ji()), this.toolBar.setAdditionalSecondaryActions(c); })); } getId() { @@ -88575,62 +88575,62 @@ let vV = (Sh = class extends R { positionAffinity: 3 }; } -}, YL = Sh, Sh._dropDownVisible = !1, Sh.id = 0, Sh); -vV = YL = K5([ - pa(3, Se), - pa(4, _e), - pa(5, Uo) -], vV); -class tLe extends Xh { +}, iV = Ih, Ih._dropDownVisible = !1, Ih.id = 0, Ih); +q9 = iV = WE([ + yc(3, Ge), + yc(4, xe), + yc(5, Oo) +], q9); +class BXe extends Ah { updateLabel() { const e = this._keybindingService.lookupKeybinding(this._action.id, this._contextKeyService); if (!e) return super.updateLabel(); if (this.label) { - const t = Qe("div.keybinding").root; - this._register(new f0(t, ro, { disableTitle: !0, ...J4 })).set(e), this.label.textContent = this._action.label, this.label.appendChild(t), this.label.classList.add("inlineEditStatusBarItemLabel"); + const t = Oe("div.keybinding").root; + this._register(new X0(t, co, { disableTitle: !0, ...Rj })).set(e), this.label.textContent = this._action.label, this.label.appendChild(t), this.label.classList.add("inlineEditStatusBarItemLabel"); } } updateTooltip() { } } -let TV = class extends L1 { - constructor(e, t, i, n, o, r, l, a, c, d) { - super(e, { resetMenu: i, ...n }, o, r, l, a, c, d), this.editor = t, this.menuId = i, this.options2 = n, this.menuService = o, this.contextKeyService = r, this.menu = this._store.add(this.menuService.createMenu(this.menuId, this.contextKeyService, { emitEventsForSubmenuChanges: !0 })), this.additionalActions = [], this.prependedPrimaryActions = [], this._store.add(this.menu.onDidChange(() => this.updateToolbar())), this._store.add(this.editor.onDidChangeCursorPosition(() => this.updateToolbar())), this.updateToolbar(); +let $9 = class extends YW { + constructor(e, t, i, n, o, l, r, c, d, a) { + super(e, { resetMenu: i, ...n }, o, l, r, c, d, a), this.editor = t, this.menuId = i, this.options2 = n, this.menuService = o, this.contextKeyService = l, this.menu = this._store.add(this.menuService.createMenu(this.menuId, this.contextKeyService, { emitEventsForSubmenuChanges: !0 })), this.additionalActions = [], this.prependedPrimaryActions = [], this._store.add(this.menu.onDidChange(() => this.updateToolbar())), this._store.add(this.editor.onDidChangeCursorPosition(() => this.updateToolbar())), this.updateToolbar(); } updateToolbar() { - var i, n, o, r, l, a, c; + var i, n, o, l, r, c, d; const e = [], t = []; - NI(this.menu, (i = this.options2) == null ? void 0 : i.menuOptions, { primary: e, secondary: t }, (o = (n = this.options2) == null ? void 0 : n.toolbarOptions) == null ? void 0 : o.primaryGroup, (l = (r = this.options2) == null ? void 0 : r.toolbarOptions) == null ? void 0 : l.shouldInlineSubmenu, (c = (a = this.options2) == null ? void 0 : a.toolbarOptions) == null ? void 0 : c.useSeparatorsInPrimaryActions), t.push(...this.additionalActions), e.unshift(...this.prependedPrimaryActions), this.setActions(e, t); + Kx(this.menu, (i = this.options2) == null ? void 0 : i.menuOptions, { primary: e, secondary: t }, (o = (n = this.options2) == null ? void 0 : n.toolbarOptions) == null ? void 0 : o.primaryGroup, (r = (l = this.options2) == null ? void 0 : l.toolbarOptions) == null ? void 0 : r.shouldInlineSubmenu, (d = (c = this.options2) == null ? void 0 : c.toolbarOptions) == null ? void 0 : d.useSeparatorsInPrimaryActions), t.push(...this.additionalActions), e.unshift(...this.prependedPrimaryActions), this.setActions(e, t); } setAdditionalSecondaryActions(e) { - ei(this.additionalActions, e, (t, i) => t === i) || (this.additionalActions = e, this.updateToolbar()); + ti(this.additionalActions, e, (t, i) => t === i) || (this.additionalActions = e, this.updateToolbar()); } }; -TV = K5([ - pa(4, Uo), - pa(5, _e), - pa(6, Co), - pa(7, xt), - pa(8, Qt), - pa(9, Ls) -], TV); -var e7 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +$9 = WE([ + yc(4, Oo), + yc(5, xe), + yc(6, Xo), + yc(7, Lt), + yc(8, Ot), + yc(9, Ls) +], $9); +var v7 = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, zL = function(s, e) { +}, nV = function(s, e) { return function(t, i) { e(t, i, s); }; -}, wy, DV; -function* iLe(s, e, t = 1) { +}, Rf, e5; +function* _Xe(s, e, t = 1) { e === void 0 && ([e, s] = [s, 0]); for (let i = s; i < e; i += t) yield i; } -function JW(s) { +function dN(s) { var i; const e = ((i = s[0].match(/^\s*/)) == null ? void 0 : i[0]) ?? "", t = e.length; return { @@ -88638,79 +88638,79 @@ function JW(s) { shift: t }; } -var Ug; -let VV = (Ug = class extends R { +var $m; +let t5 = ($m = class extends J { static _createUniqueUri() { - return Le.from({ scheme: "inline-edit-widget", path: (/* @__PURE__ */ new Date()).toString() + String(wy._modelId++) }); + return Xe.from({ scheme: "inline-edit-widget", path: (/* @__PURE__ */ new Date()).toString() + String(Rf._modelId++) }); } constructor(e, t, i, n, o) { - super(), this._editor = e, this._model = t, this._instantiationService = i, this._diffProviderFactoryService = n, this._modelService = o, this._position = ye(this, (r) => { - const l = this._model.read(r); - if (!l || l.text.length === 0 || l.range.startLineNumber === l.range.endLineNumber && !(l.range.startColumn === l.range.endColumn && l.range.startColumn === 1)) + super(), this._editor = e, this._model = t, this._instantiationService = i, this._diffProviderFactoryService = n, this._modelService = o, this._position = fe(this, (l) => { + const r = this._model.read(l); + if (!r || r.text.length === 0 || r.range.startLineNumber === r.range.endLineNumber && !(r.range.startColumn === r.range.endColumn && r.range.startColumn === 1)) return null; - const a = this._editor.getModel(); - if (!a) + const c = this._editor.getModel(); + if (!c) return null; - const c = Array.from(iLe(l.range.startLineNumber, l.range.endLineNumber + 1)), d = c.map((f) => a.getLineLastNonWhitespaceColumn(f)), h = Math.max(...d), u = c[d.indexOf(h)], g = new V(u, h); + const d = Array.from(_Xe(r.range.startLineNumber, r.range.endLineNumber + 1)), a = d.map((g) => c.getLineLastNonWhitespaceColumn(g)), h = Math.max(...a), u = d[a.indexOf(h)], m = new Y(u, h); return { - top: l.range.startLineNumber, - left: g + top: r.range.startLineNumber, + left: m }; - }), this._text = ye(this, (r) => { - const l = this._model.read(r); - if (!l) + }), this._text = fe(this, (l) => { + const r = this._model.read(l); + if (!r) return { text: "", shift: 0 }; - const a = JW(l.text.split(` + const c = dN(r.text.split(` `)); return { - text: a.text.join(` + text: c.text.join(` `), - shift: a.shift + shift: c.shift }; - }), this._originalModel = Un(() => this._modelService.createModel("", null, wy._createUniqueUri())).keepObserved(this._store), this._modifiedModel = Un(() => this._modelService.createModel("", null, wy._createUniqueUri())).keepObserved(this._store), this._diff = ye(this, (r) => { - var l, a; - return (a = (l = this._diffPromise.read(r)) == null ? void 0 : l.promiseResult.read(r)) == null ? void 0 : a.data; - }), this._diffPromise = ye(this, (r) => { - const l = this._model.read(r); - if (!l) + }), this._originalModel = On(() => this._modelService.createModel("", null, Rf._createUniqueUri())).keepObserved(this._store), this._modifiedModel = On(() => this._modelService.createModel("", null, Rf._createUniqueUri())).keepObserved(this._store), this._diff = fe(this, (l) => { + var r, c; + return (c = (r = this._diffPromise.read(l)) == null ? void 0 : r.promiseResult.read(l)) == null ? void 0 : c.data; + }), this._diffPromise = fe(this, (l) => { + const r = this._model.read(l); + if (!r) return; - const a = this._editor.getModel(); - if (!a) + const c = this._editor.getModel(); + if (!c) return; - const c = JW(a.getValueInRange(l.range).split(` + const d = dN(c.getValueInRange(r.range).split(` `)).text.join(` -`), d = JW(l.text.split(` +`), a = dN(r.text.split(` `)).text.join(` `); - this._originalModel.get().setValue(c), this._modifiedModel.get().setValue(d); + this._originalModel.get().setValue(d), this._modifiedModel.get().setValue(a); const h = this._diffProviderFactoryService.createDiffProvider({ diffAlgorithm: "advanced" }); - return CI.fromFn(async () => { + return kx.fromFn(async () => { const u = await h.computeDiff(this._originalModel.get(), this._modifiedModel.get(), { computeMoves: !1, ignoreTrimWhitespace: !1, maxComputationTimeMs: 1e3 - }, Ye.None); + }, Fe.None); if (!u.identical) return u.changes; }); - }), this._register(ks((r, l) => { - if (!this._model.read(r) || this._position.get() === null) + }), this._register(Js((l, r) => { + if (!this._model.read(l) || this._position.get() === null) return; - const c = l.add(this._instantiationService.createInstance(kV, this._editor, this._position, this._text.map((d) => d.text), this._text.map((d) => d.shift), this._diff)); - e.addOverlayWidget(c), l.add(Ce(() => e.removeOverlayWidget(c))); + const d = r.add(this._instantiationService.createInstance(i5, this._editor, this._position, this._text.map((a) => a.text), this._text.map((a) => a.shift), this._diff)); + e.addOverlayWidget(d), r.add(We(() => e.removeOverlayWidget(d))); })); } -}, wy = Ug, Ug._modelId = 0, Ug); -VV = wy = e7([ - zL(2, Se), - zL(3, WC), - zL(4, Pt) -], VV); -var Kg; -let kV = (Kg = class extends R { - constructor(e, t, i, n, o, r) { - var l; - super(), this._editor = e, this._position = t, this._text = i, this._shift = n, this._diff = o, this._instantiationService = r, this.id = `InlineEditSideBySideContentWidget${DV.id++}`, this.allowEditorOverflow = !1, this._nodes = ce("div.inlineEditSideBySide", void 0), this._scrollChanged = Zn("editor.onDidScrollChange", this._editor.onDidScrollChange), this._previewEditor = this._register(this._instantiationService.createInstance(Qr, this._nodes, { +}, Rf = $m, $m._modelId = 0, $m); +t5 = Rf = v7([ + nV(2, Ge), + nV(3, AG), + nV(4, At) +], t5); +var eb; +let i5 = (eb = class extends J { + constructor(e, t, i, n, o, l) { + var r; + super(), this._editor = e, this._position = t, this._text = i, this._shift = n, this._diff = o, this._instantiationService = l, this.id = `InlineEditSideBySideContentWidget${e5.id++}`, this.allowEditorOverflow = !1, this._nodes = de("div.inlineEditSideBySide", void 0), this._scrollChanged = xn("editor.onDidScrollChange", this._editor.onDidScrollChange), this._previewEditor = this._register(this._instantiationService.createInstance($l, this._nodes, { glyphMargin: !1, lineNumbers: "off", minimap: { enabled: !1 }, @@ -88735,39 +88735,39 @@ let kV = (Kg = class extends R { wordWrapOverride2: "off", wrappingIndent: "none", wrappingStrategy: void 0 - }, { contributions: [], isSimpleWidget: !0 }, this._editor)), this._previewEditorObs = oo(this._previewEditor), this._editorObs = oo(this._editor), this._previewTextModel = this._register(this._instantiationService.createInstance(Al, "", ((l = this._editor.getModel()) == null ? void 0 : l.getLanguageId()) ?? ms, Al.DEFAULT_CREATION_OPTIONS, null)), this._setText = ye((a) => { - const c = this._text.read(a); - c && this._previewTextModel.setValue(c); - }).recomputeInitiallyAndOnChange(this._store), this._decorations = ye(this, (a) => { - this._setText.read(a); - const c = this._position.read(a); - if (!c) - return { org: [], mod: [] }; - const d = this._diff.read(a); + }, { contributions: [], isSimpleWidget: !0 }, this._editor)), this._previewEditorObs = ro(this._previewEditor), this._editorObs = ro(this._editor), this._previewTextModel = this._register(this._instantiationService.createInstance(xr, "", ((r = this._editor.getModel()) == null ? void 0 : r.getLanguageId()) ?? gs, xr.DEFAULT_CREATION_OPTIONS, null)), this._setText = fe((c) => { + const d = this._text.read(c); + d && this._previewTextModel.setValue(d); + }).recomputeInitiallyAndOnChange(this._store), this._decorations = fe(this, (c) => { + this._setText.read(c); + const d = this._position.read(c); if (!d) return { org: [], mod: [] }; + const a = this._diff.read(c); + if (!a) + return { org: [], mod: [] }; const h = [], u = []; - if (d.length === 1 && d[0].innerChanges[0].modifiedRange.equalsRange(this._previewTextModel.getFullModelRange())) + if (a.length === 1 && a[0].innerChanges[0].modifiedRange.equalsRange(this._previewTextModel.getFullModelRange())) return { org: [], mod: [] }; - const g = this._shift.get(), m = (f) => new M(f.startLineNumber + c.top - 1, f.startColumn + g, f.endLineNumber + c.top - 1, f.endColumn + g); - for (const f of d) - if (f.original.isEmpty || h.push({ range: m(f.original.toInclusiveRange()), options: w1 }), f.modified.isEmpty || u.push({ range: f.modified.toInclusiveRange(), options: ix }), f.modified.isEmpty || f.original.isEmpty) - f.original.isEmpty || h.push({ range: m(f.original.toInclusiveRange()), options: GX }), f.modified.isEmpty || u.push({ range: f.modified.toInclusiveRange(), options: VX }); + const m = this._shift.get(), b = (g) => new I(g.startLineNumber + d.top - 1, g.startColumn + m, g.endLineNumber + d.top - 1, g.endColumn + m); + for (const g of a) + if (g.original.isEmpty || h.push({ range: b(g.original.toInclusiveRange()), options: wW }), g.modified.isEmpty || u.push({ range: g.modified.toInclusiveRange(), options: ZL }), g.modified.isEmpty || g.original.isEmpty) + g.original.isEmpty || h.push({ range: b(g.original.toInclusiveRange()), options: rH }), g.modified.isEmpty || u.push({ range: g.modified.toInclusiveRange(), options: oH }); else - for (const b of f.innerChanges || []) - f.original.contains(b.originalRange.startLineNumber) && h.push({ range: m(b.originalRange), options: b.originalRange.isEmpty() ? RX : Lb }), f.modified.contains(b.modifiedRange.startLineNumber) && u.push({ range: b.modifiedRange, options: b.modifiedRange.isEmpty() ? kX : nx }); + for (const Z of g.innerChanges || []) + g.original.contains(Z.originalRange.startLineNumber) && h.push({ range: b(Z.originalRange), options: Z.originalRange.isEmpty() ? cH : CZ }), g.modified.contains(Z.modifiedRange.startLineNumber) && u.push({ range: Z.modifiedRange, options: Z.modifiedRange.isEmpty() ? lH : fL }); return { org: h, mod: u }; - }), this._originalDecorations = ye(this, (a) => this._decorations.read(a).org), this._modifiedDecorations = ye(this, (a) => this._decorations.read(a).mod), this._previewEditor.setModel(this._previewTextModel), this._register(this._editorObs.setDecorations(this._originalDecorations)), this._register(this._previewEditorObs.setDecorations(this._modifiedDecorations)), this._register(Te((a) => { - const c = this._previewEditorObs.contentWidth.read(a), d = this._text.read(a).split(` + }), this._originalDecorations = fe(this, (c) => this._decorations.read(c).org), this._modifiedDecorations = fe(this, (c) => this._decorations.read(c).mod), this._previewEditor.setModel(this._previewTextModel), this._register(this._editorObs.setDecorations(this._originalDecorations)), this._register(this._previewEditorObs.setDecorations(this._modifiedDecorations)), this._register(Te((c) => { + const d = this._previewEditorObs.contentWidth.read(c), a = this._text.read(c).split(` `).length - 1, h = this._editor.getOption( 67 /* EditorOption.lineHeight */ - ) * d; - c <= 0 || this._previewEditor.layout({ height: h, width: c }); - })), this._register(Te((a) => { - this._position.read(a), this._editor.layoutOverlayWidget(this); - })), this._register(Te((a) => { - this._scrollChanged.read(a), this._position.read(a) && this._editor.layoutOverlayWidget(this); + ) * a; + d <= 0 || this._previewEditor.layout({ height: h, width: d }); + })), this._register(Te((c) => { + this._position.read(c), this._editor.layoutOverlayWidget(this); + })), this._register(Te((c) => { + this._scrollChanged.read(c), this._position.read(c) && this._editor.layoutOverlayWidget(this); })); } getId() { @@ -88780,7 +88780,7 @@ let kV = (Kg = class extends R { const e = this._position.get(); if (!e) return null; - const t = this._editor.getLayoutInfo(), i = this._editor.getScrolledVisiblePosition(new V(e.top, 1)); + const t = this._editor.getLayoutInfo(), i = this._editor.getScrolledVisiblePosition(new Y(e.top, 1)); if (!i) return null; const n = i.top - 1, o = this._editor.getOffsetForColumn(e.left.lineNumber, e.left.column); @@ -88791,86 +88791,86 @@ let kV = (Kg = class extends R { } }; } -}, DV = Kg, Kg.id = 0, Kg); -kV = DV = e7([ - zL(5, Se) -], kV); -var nLe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +}, e5 = eb, eb.id = 0, eb); +i5 = e5 = v7([ + nV(5, Ge) +], i5); +var QXe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, yu = function(s, e) { +}, Xu = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Cy, sr; -let us = (sr = class extends R { +}, Nf, ll; +let bs = (ll = class extends J { static get(e) { - return e.getContribution(Cy.ID); + return e.getContribution(Nf.ID); } - constructor(e, t, i, n, o, r, l, a) { - super(), this.editor = e, this.instantiationService = t, this.contextKeyService = i, this.languageFeaturesService = n, this._commandService = o, this._configurationService = r, this._diffProviderFactoryService = l, this._modelService = a, this._isVisibleContext = Cy.inlineEditVisibleContext.bindTo(this.contextKeyService), this._isCursorAtInlineEditContext = Cy.cursorAtInlineEditContext.bindTo(this.contextKeyService), this._currentEdit = Oe(this, void 0), this._currentWidget = Un(this._currentEdit, (m) => { - const f = this._currentEdit.read(m); - if (!f) + constructor(e, t, i, n, o, l, r, c) { + super(), this.editor = e, this.instantiationService = t, this.contextKeyService = i, this.languageFeaturesService = n, this._commandService = o, this._configurationService = l, this._diffProviderFactoryService = r, this._modelService = c, this._isVisibleContext = Nf.inlineEditVisibleContext.bindTo(this.contextKeyService), this._isCursorAtInlineEditContext = Nf.cursorAtInlineEditContext.bindTo(this.contextKeyService), this._currentEdit = Ue(this, void 0), this._currentWidget = On(this._currentEdit, (b) => { + const g = this._currentEdit.read(b); + if (!g) return; - const b = f.range.endLineNumber, y = f.range.endColumn, w = f.text.endsWith(` -`) && !(f.range.startLineNumber === f.range.endLineNumber && f.range.startColumn === f.range.endColumn) ? f.text.slice(0, -1) : f.text, C = new F1(b, [new Qx(y, w, !1)]), S = f.range.startLineNumber === f.range.endLineNumber && C.parts.length === 1 && C.parts[0].lines.length === 1, L = f.text === ""; - return !S && !L ? void 0 : this.instantiationService.createInstance(NV, this.editor, { - ghostText: dr(C), - minReservedLineCount: dr(0), - targetTextModel: dr(this.editor.getModel() ?? void 0), - range: dr(f.range) + const Z = g.range.endLineNumber, f = g.range.endColumn, y = g.text.endsWith(` +`) && !(g.range.startLineNumber === g.range.endLineNumber && g.range.startColumn === g.range.endColumn) ? g.text.slice(0, -1) : g.text, W = new qW(Z, [new hI(f, y, !1)]), G = g.range.startLineNumber === g.range.endLineNumber && W.parts.length === 1 && W.parts[0].lines.length === 1, X = g.text === ""; + return !G && !X ? void 0 : this.instantiationService.createInstance(O9, this.editor, { + ghostText: ul(W), + minReservedLineCount: ul(0), + targetTextModel: ul(this.editor.getModel() ?? void 0), + range: ul(g.range) }); - }), this._isAccepting = Oe(this, !1), this._enabled = St(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption( + }), this._isAccepting = Ue(this, !1), this._enabled = Gt(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption( 63 /* EditorOption.inlineEdit */ - ).enabled), this._fontFamily = St(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption( + ).enabled), this._fontFamily = Gt(this, this.editor.onDidChangeConfiguration, () => this.editor.getOption( 63 /* EditorOption.inlineEdit */ ).fontFamily); - const c = Zn("InlineEditController.modelContentChangedSignal", e.onDidChangeModelContent); - this._register(Te((m) => { - this._enabled.read(m) && (c.read(m), !this._isAccepting.read(m) && this.getInlineEdit(e, !0)); + const d = xn("InlineEditController.modelContentChangedSignal", e.onDidChangeModelContent); + this._register(Te((b) => { + this._enabled.read(b) && (d.read(b), !this._isAccepting.read(b) && this.getInlineEdit(e, !0)); })); - const d = St(this, e.onDidChangeCursorPosition, () => e.getPosition()); - this._register(Te((m) => { - if (!this._enabled.read(m)) + const a = Gt(this, e.onDidChangeCursorPosition, () => e.getPosition()); + this._register(Te((b) => { + if (!this._enabled.read(b)) return; - const f = d.read(m); - f && this.checkCursorPosition(f); - })), this._register(Te((m) => { - const f = this._currentEdit.read(m); - if (this._isCursorAtInlineEditContext.set(!1), !f) { + const g = a.read(b); + g && this.checkCursorPosition(g); + })), this._register(Te((b) => { + const g = this._currentEdit.read(b); + if (this._isCursorAtInlineEditContext.set(!1), !g) { this._isVisibleContext.set(!1); return; } this._isVisibleContext.set(!0); - const b = e.getPosition(); - b && this.checkCursorPosition(b); + const Z = e.getPosition(); + Z && this.checkCursorPosition(Z); })); - const h = Zn("InlineEditController.editorBlurSignal", e.onDidBlurEditorWidget); - this._register(Te(async (m) => { - var f; - this._enabled.read(m) && (h.read(m), !(this._configurationService.getValue("editor.experimentalInlineEdit.keepOnBlur") || e.getOption( + const h = xn("InlineEditController.editorBlurSignal", e.onDidBlurEditorWidget); + this._register(Te(async (b) => { + var g; + this._enabled.read(b) && (h.read(b), !(this._configurationService.getValue("editor.experimentalInlineEdit.keepOnBlur") || e.getOption( 63 /* EditorOption.inlineEdit */ - ).keepOnBlur) && ((f = this._currentRequestCts) == null || f.dispose(!0), this._currentRequestCts = void 0, await this.clear(!1))); + ).keepOnBlur) && ((g = this._currentRequestCts) == null || g.dispose(!0), this._currentRequestCts = void 0, await this.clear(!1))); })); - const u = Zn("InlineEditController.editorFocusSignal", e.onDidFocusEditorText); - this._register(Te((m) => { - this._enabled.read(m) && (u.read(m), this.getInlineEdit(e, !0)); + const u = xn("InlineEditController.editorFocusSignal", e.onDidFocusEditorText); + this._register(Te((b) => { + this._enabled.read(b) && (u.read(b), this.getInlineEdit(e, !0)); })); - const g = this._register(sJ()); - this._register(Te((m) => { - const f = this._fontFamily.read(m); - g.setStyle(f === "" || f === "default" ? "" : ` + const m = this._register(DB()); + this._register(Te((b) => { + const g = this._fontFamily.read(b); + m.setStyle(g === "" || g === "default" ? "" : ` .monaco-editor .inline-edit-decoration, .monaco-editor .inline-edit-decoration-preview, .monaco-editor .inline-edit { - font-family: ${f}; + font-family: ${g}; }`); - })), this._register(new WV(this.editor, this._currentWidget, this.instantiationService)), this._register(new VV(this.editor, this._currentEdit, this.instantiationService, this._diffProviderFactoryService, this._modelService)); + })), this._register(new j9(this.editor, this._currentWidget, this.instantiationService)), this._register(new t5(this.editor, this._currentEdit, this.instantiationService, this._diffProviderFactoryService, this._modelService)); } checkCursorPosition(e) { if (!this._currentEdit) { @@ -88882,7 +88882,7 @@ let us = (sr = class extends R { this._isCursorAtInlineEditContext.set(!1); return; } - this._isCursorAtInlineEditContext.set(M.containsPosition(t.range, e)); + this._isCursorAtInlineEditContext.set(I.containsPosition(t.range, e)); } validateInlineEdit(e, t) { var i; @@ -88890,8 +88890,8 @@ let us = (sr = class extends R { `) && t.range.startLineNumber !== t.range.endLineNumber && t.range.startColumn !== t.range.endColumn) { if (t.range.startColumn !== 1) return !1; - const o = t.range.endLineNumber, r = t.range.endColumn, l = ((i = e.getModel()) == null ? void 0 : i.getLineLength(o)) ?? 0; - if (r !== l + 1) + const o = t.range.endLineNumber, l = t.range.endColumn, r = ((i = e.getModel()) == null ? void 0 : i.getLineLength(o)) ?? 0; + if (l !== r + 1) return !1; } return !0; @@ -88904,14 +88904,14 @@ let us = (sr = class extends R { const n = i.getVersionId(), o = this.languageFeaturesService.inlineEditProvider.all(i); if (o.length === 0) return; - const r = o[0]; - this._currentRequestCts = new mi(); - const l = this._currentRequestCts.token, a = t ? kA.Automatic : kA.Invoke; - if (t && await sLe(50, l), l.isCancellationRequested || i.isDisposed() || i.getVersionId() !== n) + const l = o[0]; + this._currentRequestCts = new pi(); + const r = this._currentRequestCts.token, c = t ? OV.Automatic : OV.Invoke; + if (t && await OXe(50, r), r.isCancellationRequested || i.isDisposed() || i.getVersionId() !== n) return; - const d = await r.provideInlineEdit(i, { triggerKind: a }, l); - if (d && !(l.isCancellationRequested || i.isDisposed() || i.getVersionId() !== n) && this.validateInlineEdit(e, d)) - return d; + const a = await l.provideInlineEdit(i, { triggerKind: c }, r); + if (a && !(r.isCancellationRequested || i.isDisposed() || i.getVersionId() !== n) && this.validateInlineEdit(e, a)) + return a; } async getInlineEdit(e, t) { this._isCursorAtInlineEditContext.set(!1), await this.clear(); @@ -88931,7 +88931,7 @@ let us = (sr = class extends R { return; let t = e.text; e.text.startsWith(` -`) && (t = e.text.substring(1)), this.editor.pushUndoStop(), this.editor.executeEdits("acceptCurrent", [si.replace(M.lift(e.range), t)]), e.accepted && await this._commandService.executeCommand(e.accepted.id, ...e.accepted.arguments || []).then(void 0, wi), this.freeEdit(e), oi((i) => { +`) && (t = e.text.substring(1)), this.editor.pushUndoStop(), this.editor.executeEdits("acceptCurrent", [oi.replace(I.lift(e.range), t)]), e.accepted && await this._commandService.executeCommand(e.accepted.id, ...e.accepted.arguments || []).then(void 0, Wi), this.freeEdit(e), li((i) => { this._currentEdit.set(void 0, i), this._isAccepting.set(!1, i); }); } @@ -88941,12 +88941,12 @@ let us = (sr = class extends R { const e = this._currentEdit.get(); if (!e) return; - const t = V.lift({ lineNumber: e.range.startLineNumber, column: e.range.startColumn }); + const t = Y.lift({ lineNumber: e.range.startLineNumber, column: e.range.startColumn }); this.editor.setPosition(t), this.editor.revealPositionInCenterIfOutsideViewport(t); } async clear(e = !0) { const t = this._currentEdit.get(); - t && (t != null && t.rejected) && e && await this._commandService.executeCommand(t.rejected.id, ...t.rejected.arguments || []).then(void 0, wi), t && this.freeEdit(t), this._currentEdit.set(void 0, void 0); + t && (t != null && t.rejected) && e && await this._commandService.executeCommand(t.rejected.id, ...t.rejected.arguments || []).then(void 0, Wi), t && this.freeEdit(t), this._currentEdit.set(void 0, void 0); } freeEdit(e) { const t = this.editor.getModel(); @@ -88955,17 +88955,17 @@ let us = (sr = class extends R { const i = this.languageFeaturesService.inlineEditProvider.all(t); i.length !== 0 && i[0].freeInlineEdit(e); } -}, Cy = sr, sr.ID = "editor.contrib.inlineEditController", sr.inlineEditVisibleKey = "inlineEditVisible", sr.inlineEditVisibleContext = new ae(sr.inlineEditVisibleKey, !1), sr.cursorAtInlineEditKey = "cursorAtInlineEdit", sr.cursorAtInlineEditContext = new ae(sr.cursorAtInlineEditKey, !1), sr); -us = Cy = nLe([ - yu(1, Se), - yu(2, _e), - yu(3, ge), - yu(4, Qt), - yu(5, Ke), - yu(6, WC), - yu(7, Pt) -], us); -function sLe(s, e) { +}, Nf = ll, ll.ID = "editor.contrib.inlineEditController", ll.inlineEditVisibleKey = "inlineEditVisible", ll.inlineEditVisibleContext = new ce(ll.inlineEditVisibleKey, !1), ll.cursorAtInlineEditKey = "cursorAtInlineEdit", ll.cursorAtInlineEditContext = new ce(ll.cursorAtInlineEditKey, !1), ll); +bs = Nf = QXe([ + Xu(1, Ge), + Xu(2, xe), + Xu(3, me), + Xu(4, Ot), + Xu(5, Qe), + Xu(6, AG), + Xu(7, At) +], bs); +function OXe(s, e) { return new Promise((t) => { let i; const n = setTimeout(() => { @@ -88976,18 +88976,18 @@ function sLe(s, e) { })); }); } -let oLe = class extends he { +let jXe = class extends he { constructor() { super({ - id: KSe, + id: FXe, label: "Accept Inline Edit", alias: "Accept Inline Edit", - precondition: H.and(I.writable, us.inlineEditVisibleContext), + precondition: P.and(C.writable, bs.inlineEditVisibleContext), kbOpts: [ { weight: 101, primary: 2, - kbExpr: H.and(I.writable, us.inlineEditVisibleContext, us.cursorAtInlineEditContext) + kbExpr: P.and(C.writable, bs.inlineEditVisibleContext, bs.cursorAtInlineEditContext) } ], menuOpts: [{ @@ -88999,13 +88999,13 @@ let oLe = class extends he { }); } async run(e, t) { - const i = us.get(t); + const i = bs.get(t); await (i == null ? void 0 : i.accept()); } }; -class rLe extends he { +class qXe extends he { constructor() { - const e = H.and(I.writable, H.not(us.inlineEditVisibleKey)); + const e = P.and(C.writable, P.not(bs.inlineEditVisibleKey)); super({ id: "editor.action.inlineEdit.trigger", label: "Trigger Inline Edit", @@ -89019,15 +89019,15 @@ class rLe extends he { }); } async run(e, t) { - const i = us.get(t); + const i = bs.get(t); i == null || i.trigger(); } } -class lLe extends he { +class $Xe extends he { constructor() { - const e = H.and(I.writable, us.inlineEditVisibleContext, H.not(us.cursorAtInlineEditKey)); + const e = P.and(C.writable, bs.inlineEditVisibleContext, P.not(bs.cursorAtInlineEditKey)); super({ - id: jSe, + id: AXe, label: "Jump to Inline Edit", alias: "Jump to Inline Edit", precondition: e, @@ -89046,15 +89046,15 @@ class lLe extends he { }); } async run(e, t) { - const i = us.get(t); + const i = bs.get(t); i == null || i.jumpToCurrent(); } } -class aLe extends he { +class eVe extends he { constructor() { - const e = H.and(I.writable, us.cursorAtInlineEditContext); + const e = P.and(C.writable, bs.cursorAtInlineEditContext); super({ - id: qSe, + id: KXe, label: "Jump Back from Inline Edit", alias: "Jump Back from Inline Edit", precondition: e, @@ -89073,15 +89073,15 @@ class aLe extends he { }); } async run(e, t) { - const i = us.get(t); + const i = bs.get(t); i == null || i.jumpBack(); } } -class cLe extends he { +class tVe extends he { constructor() { - const e = H.and(I.writable, us.inlineEditVisibleContext); + const e = P.and(C.writable, bs.inlineEditVisibleContext); super({ - id: QSe, + id: zXe, label: "Reject Inline Edit", alias: "Reject Inline Edit", precondition: e, @@ -89099,43 +89099,43 @@ class cLe extends he { }); } async run(e, t) { - const i = us.get(t); + const i = bs.get(t); await (i == null ? void 0 : i.clear()); } } -ee(oLe); -ee(cLe); -ee(lLe); -ee(aLe); -ee(rLe); -gt( - us.ID, - us, +ee(jXe); +ee(tVe); +ee($Xe); +ee(eVe); +ee(qXe); +mt( + bs.ID, + bs, 3 /* EditorContributionInstantiation.Eventually */ ); -const dLe = "editor.action.inlineEdits.accept", hLe = "editor.action.inlineEdits.showPrevious", uLe = "editor.action.inlineEdits.showNext", Fb = new ae("inlineEditsVisible", !1, p("inlineEditsVisible", "Whether an inline edit is visible")), gLe = new ae("inlineEditsIsPinned", !1, p("isPinned", "Whether an inline edit is visible")), N9 = class N9 extends R { +const iVe = "editor.action.inlineEdits.accept", nVe = "editor.action.inlineEdits.showPrevious", sVe = "editor.action.inlineEdits.showNext", PZ = new ce("inlineEditsVisible", !1, p("inlineEditsVisible", "Whether an inline edit is visible")), oVe = new ce("inlineEditsIsPinned", !1, p("isPinned", "Whether an inline edit is visible")), eD = class eD extends J { constructor(e) { - super(), this._editor = e, this._editorObs = oo(this._editor), this._placeholderText = this._editorObs.getOption( + super(), this._editor = e, this._editorObs = ro(this._editor), this._placeholderText = this._editorObs.getOption( 88 /* EditorOption.placeholder */ - ), this._state = Vo({ owner: this, equalsFn: KA }, (t) => { + ), this._state = vo({ owner: this, equalsFn: aL }, (t) => { const i = this._placeholderText.read(t); if (i && this._editorObs.valueIsEmpty.read(t)) return { placeholder: i }; - }), this._shouldViewBeAlive = mLe(this, (t) => { + }), this._shouldViewBeAlive = lVe(this, (t) => { var i; return ((i = this._state.read(t)) == null ? void 0 : i.placeholder) !== void 0; - }), this._view = Uh((t, i) => { + }), this._view = qh((t, i) => { if (!this._shouldViewBeAlive.read(t)) return; - const n = Qe("div.editorPlaceholder"); + const n = Oe("div.editorPlaceholder"); i.add(Te((o) => { - const r = this._state.read(o), l = (r == null ? void 0 : r.placeholder) !== void 0; - n.root.style.display = l ? "block" : "none", n.root.innerText = (r == null ? void 0 : r.placeholder) ?? ""; + const l = this._state.read(o), r = (l == null ? void 0 : l.placeholder) !== void 0; + n.root.style.display = r ? "block" : "none", n.root.innerText = (l == null ? void 0 : l.placeholder) ?? ""; })), i.add(Te((o) => { - const r = this._editorObs.layoutInfo.read(o); - n.root.style.left = `${r.contentLeft}px`, n.root.style.width = r.contentWidth - r.verticalScrollbarWidth + "px", n.root.style.top = `${this._editor.getTopForLineNumber(0)}px`; + const l = this._editorObs.layoutInfo.read(o); + n.root.style.left = `${l.contentLeft}px`, n.root.style.width = l.contentWidth - l.verticalScrollbarWidth + "px", n.root.style.top = `${this._editor.getTopForLineNumber(0)}px`; })), i.add(Te((o) => { n.root.style.fontFamily = this._editorObs.getOption( 49 @@ -89149,36 +89149,36 @@ const dLe = "editor.action.inlineEdits.accept", hLe = "editor.action.inlineEdits ).read(o) + "px"; })), i.add(this._editorObs.createOverlayWidget({ allowEditorOverflow: !1, - minContentWidthInPx: dr(0), - position: dr(null), + minContentWidthInPx: ul(0), + position: ul(null), domNode: n.root })); }), this._view.recomputeInitiallyAndOnChange(this._store); } }; -N9.ID = "editor.contrib.placeholderText"; -let J1 = N9; -function mLe(s, e) { - return _C(s, (t, i) => i === !0 ? !0 : e(t)); +eD.ID = "editor.contrib.placeholderText"; +let oG = eD; +function lVe(s, e) { + return DG(s, (t, i) => i === !0 ? !0 : e(t)); } -var pLe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var rVe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, fLe = function(s, e) { +}, cVe = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class bLe { +class dVe { constructor(e, t, i) { this.range = e, this.newLines = t, this.changes = i; } } -let GV = class extends R { +let n5 = class extends J { constructor(e, t, i, n) { - super(), this._editor = e, this._edit = t, this._userPrompt = i, this._instantiationService = n, this._editorObs = oo(this._editor), this._elements = Qe("div.inline-edits-widget", { + super(), this._editor = e, this._edit = t, this._userPrompt = i, this._instantiationService = n, this._editorObs = ro(this._editor), this._elements = Oe("div.inline-edits-widget", { style: { position: "absolute", overflow: "visible", @@ -89186,14 +89186,14 @@ let GV = class extends R { left: "0px" } }, [ - Qe("div@editorContainer", { style: { position: "absolute", top: "0px", left: "0px", width: "500px", height: "500px" } }, [ - Qe("div.toolbar@toolbar", { style: { position: "absolute", top: "-25px", left: "0px" } }), - Qe("div.promptEditor@promptEditor", { style: { position: "absolute", top: "-25px", left: "80px", width: "300px", height: "22px" } }), - Qe("div.preview@editor", { style: { position: "absolute", top: "0px", left: "0px" } }) + Oe("div@editorContainer", { style: { position: "absolute", top: "0px", left: "0px", width: "500px", height: "500px" } }, [ + Oe("div.toolbar@toolbar", { style: { position: "absolute", top: "-25px", left: "0px" } }), + Oe("div.promptEditor@promptEditor", { style: { position: "absolute", top: "-25px", left: "80px", width: "300px", height: "22px" } }), + Oe("div.preview@editor", { style: { position: "absolute", top: "0px", left: "0px" } }) ]), - ip("svg", { style: { overflow: "visible", pointerEvents: "none" } }, [ - ip("defs", [ - ip("linearGradient", { + rp("svg", { style: { overflow: "visible", pointerEvents: "none" } }, [ + rp("defs", [ + rp("linearGradient", { id: "Gradient2", x1: "0", y1: "0", @@ -89203,20 +89203,20 @@ let GV = class extends R { /*svgElem('stop', { offset: '0%', class: 'gradient-start', }), svgElem('stop', { offset: '0%', class: 'gradient-start', }), svgElem('stop', { offset: '20%', class: 'gradient-stop', }),*/ - ip("stop", { offset: "0%", class: "gradient-stop" }), - ip("stop", { offset: "100%", class: "gradient-stop" }) + rp("stop", { offset: "0%", class: "gradient-stop" }), + rp("stop", { offset: "100%", class: "gradient-stop" }) ]) ]), - ip("path@path", { + rp("path@path", { d: "", fill: "url(#Gradient2)" }) ]) - ]), this._previewTextModel = this._register(this._instantiationService.createInstance(Al, "", ms, Al.DEFAULT_CREATION_OPTIONS, null)), this._setText = ye((r) => { - const l = this._edit.read(r); - l && this._previewTextModel.setValue(l.newLines.join(` + ]), this._previewTextModel = this._register(this._instantiationService.createInstance(xr, "", gs, xr.DEFAULT_CREATION_OPTIONS, null)), this._setText = fe((l) => { + const r = this._edit.read(l); + r && this._previewTextModel.setValue(r.newLines.join(` `)); - }).recomputeInitiallyAndOnChange(this._store), this._promptTextModel = this._register(this._instantiationService.createInstance(Al, "", ms, Al.DEFAULT_CREATION_OPTIONS, null)), this._promptEditor = this._register(this._instantiationService.createInstance(Qr, this._elements.promptEditor, { + }).recomputeInitiallyAndOnChange(this._store), this._promptTextModel = this._register(this._instantiationService.createInstance(xr, "", gs, xr.DEFAULT_CREATION_OPTIONS, null)), this._promptEditor = this._register(this._instantiationService.createInstance($l, this._elements.promptEditor, { glyphMargin: !1, lineNumbers: "off", minimap: { enabled: !1 }, @@ -89235,15 +89235,15 @@ let GV = class extends R { lineDecorationsWidth: 0, lineNumbersMinChars: 0, placeholder: "Describe the change you want...", - fontFamily: PU + fontFamily: IQ }, { - contributions: rg.getSomeEditorContributions([ - Fr.ID, - J1.ID, - vb.ID + contributions: hm.getSomeEditorContributions([ + Al.ID, + oG.ID, + JZ.ID ]), isSimpleWidget: !0 - }, this._editor)), this._previewEditor = this._register(this._instantiationService.createInstance(Qr, this._elements.editor, { + }, this._editor)), this._previewEditor = this._register(this._instantiationService.createInstance($l, this._elements.editor, { glyphMargin: !1, lineNumbers: "off", minimap: { enabled: !1 }, @@ -89261,94 +89261,94 @@ let GV = class extends R { overviewRulerLanes: 0, lineDecorationsWidth: 0, lineNumbersMinChars: 0 - }, { contributions: [] }, this._editor)), this._previewEditorObs = oo(this._previewEditor), this._decorations = ye(this, (r) => { - var d; - this._setText.read(r); - const l = (d = this._edit.read(r)) == null ? void 0 : d.changes; - if (!l) + }, { contributions: [] }, this._editor)), this._previewEditorObs = ro(this._previewEditor), this._decorations = fe(this, (l) => { + var a; + this._setText.read(l); + const r = (a = this._edit.read(l)) == null ? void 0 : a.changes; + if (!r) return []; - const a = [], c = []; - if (l.length === 1 && l[0].innerChanges[0].modifiedRange.equalsRange(this._previewTextModel.getFullModelRange())) + const c = [], d = []; + if (r.length === 1 && r[0].innerChanges[0].modifiedRange.equalsRange(this._previewTextModel.getFullModelRange())) return []; - for (const h of l) - if (h.original.isEmpty || a.push({ range: h.original.toInclusiveRange(), options: w1 }), h.modified.isEmpty || c.push({ range: h.modified.toInclusiveRange(), options: ix }), h.modified.isEmpty || h.original.isEmpty) - h.original.isEmpty || a.push({ range: h.original.toInclusiveRange(), options: GX }), h.modified.isEmpty || c.push({ range: h.modified.toInclusiveRange(), options: VX }); + for (const h of r) + if (h.original.isEmpty || c.push({ range: h.original.toInclusiveRange(), options: wW }), h.modified.isEmpty || d.push({ range: h.modified.toInclusiveRange(), options: ZL }), h.modified.isEmpty || h.original.isEmpty) + h.original.isEmpty || c.push({ range: h.original.toInclusiveRange(), options: rH }), h.modified.isEmpty || d.push({ range: h.modified.toInclusiveRange(), options: oH }); else for (const u of h.innerChanges || []) - h.original.contains(u.originalRange.startLineNumber) && a.push({ range: u.originalRange, options: u.originalRange.isEmpty() ? RX : Lb }), h.modified.contains(u.modifiedRange.startLineNumber) && c.push({ range: u.modifiedRange, options: u.modifiedRange.isEmpty() ? kX : nx }); - return c; - }), this._layout1 = ye(this, (r) => { - const l = this._editor.getModel(), a = this._edit.read(r); - if (!a) + h.original.contains(u.originalRange.startLineNumber) && c.push({ range: u.originalRange, options: u.originalRange.isEmpty() ? cH : CZ }), h.modified.contains(u.modifiedRange.startLineNumber) && d.push({ range: u.modifiedRange, options: u.modifiedRange.isEmpty() ? lH : fL }); + return d; + }), this._layout1 = fe(this, (l) => { + const r = this._editor.getModel(), c = this._edit.read(l); + if (!c) return null; - const c = a.range; - let d = 0; - for (let g = c.startLineNumber; g < c.endLineNumberExclusive; g++) { - const m = l.getLineMaxColumn(g), f = this._editor.getOffsetForColumn(g, m); - d = Math.max(d, f); + const d = c.range; + let a = 0; + for (let m = d.startLineNumber; m < d.endLineNumberExclusive; m++) { + const b = r.getLineMaxColumn(m), g = this._editor.getOffsetForColumn(m, b); + a = Math.max(a, g); } - return { left: this._editor.getLayoutInfo().contentLeft + d }; - }), this._layout = ye(this, (r) => { - const l = this._edit.read(r); - if (!l) + return { left: this._editor.getLayoutInfo().contentLeft + a }; + }), this._layout = fe(this, (l) => { + const r = this._edit.read(l); + if (!r) return null; - const a = l.range, c = this._editorObs.scrollLeft.read(r), d = this._layout1.read(r).left + 20 - c, h = this._editor.getTopForLineNumber(a.startLineNumber) - this._editorObs.scrollTop.read(r), u = this._editor.getTopForLineNumber(a.endLineNumberExclusive) - this._editorObs.scrollTop.read(r), g = new Qp(d, h), m = new Qp(d, u), f = u - h, b = 50, y = this._editor.getOption( + const c = r.range, d = this._editorObs.scrollLeft.read(l), a = this._layout1.read(l).left + 20 - d, h = this._editor.getTopForLineNumber(c.startLineNumber) - this._editorObs.scrollTop.read(l), u = this._editor.getTopForLineNumber(c.endLineNumberExclusive) - this._editorObs.scrollTop.read(l), m = new ig(a, h), b = new ig(a, u), g = u - h, Z = 50, f = this._editor.getOption( 67 /* EditorOption.lineHeight */ - ) * l.newLines.length, w = f - y, C = new Qp(d + b, h + w / 2), S = new Qp(d + b, u - w / 2); + ) * r.newLines.length, y = g - f, W = new ig(a + Z, h + y / 2), G = new ig(a + Z, u - y / 2); return { - topCode: g, - bottomCode: m, - codeHeight: f, - topEdit: C, - bottomEdit: S, - editHeight: y + topCode: m, + bottomCode: b, + codeHeight: g, + topEdit: W, + bottomEdit: G, + editHeight: f }; }); - const o = ye(this, (r) => this._edit.read(r) !== void 0 || this._userPrompt.read(r) !== void 0); - this._register(Uc(this._elements.root, { - display: ye(this, (r) => o.read(r) ? "block" : "none") - })), this._register(zp(this._editor.getDomNode(), this._elements.root)), this._register(oo(e).createOverlayWidget({ + const o = fe(this, (l) => this._edit.read(l) !== void 0 || this._userPrompt.read(l) !== void 0); + this._register(qd(this._elements.root, { + display: fe(this, (l) => o.read(l) ? "block" : "none") + })), this._register(_p(this._editor.getDomNode(), this._elements.root)), this._register(ro(e).createOverlayWidget({ domNode: this._elements.root, - position: dr(null), + position: ul(null), allowEditorOverflow: !1, - minContentWidthInPx: ye((r) => { - var c; - const l = (c = this._layout1.read(r)) == null ? void 0 : c.left; - if (l === void 0) + minContentWidthInPx: fe((l) => { + var d; + const r = (d = this._layout1.read(l)) == null ? void 0 : d.left; + if (r === void 0) return 0; - const a = this._previewEditorObs.contentWidth.read(r); - return l + a; + const c = this._previewEditorObs.contentWidth.read(l); + return r + c; }) - })), this._previewEditor.setModel(this._previewTextModel), this._register(this._previewEditorObs.setDecorations(this._decorations)), this._register(Te((r) => { - const l = this._layout.read(r); - if (!l) + })), this._previewEditor.setModel(this._previewTextModel), this._register(this._previewEditorObs.setDecorations(this._decorations)), this._register(Te((l) => { + const r = this._layout.read(l); + if (!r) return; - const { topCode: a, bottomCode: c, topEdit: d, bottomEdit: h, editHeight: u } = l, g = 10, m = 0, f = 40, b = new wLe().moveTo(a).lineTo(a.deltaX(g)).curveTo(a.deltaX(g + f), d.deltaX(-f - m), d.deltaX(-m)).lineTo(d).lineTo(h).lineTo(h.deltaX(-m)).curveTo(h.deltaX(-f - m), c.deltaX(g + f), c.deltaX(g)).lineTo(c).build(); - this._elements.path.setAttribute("d", b), this._elements.editorContainer.style.top = `${d.y}px`, this._elements.editorContainer.style.left = `${d.x}px`, this._elements.editorContainer.style.height = `${u}px`; - const y = this._previewEditorObs.contentWidth.read(r); - this._previewEditor.layout({ height: u, width: y }); - })), this._promptEditor.setModel(this._promptTextModel), this._promptEditor.layout(), this._register(CLe(yLe(this._userPrompt, (r) => r ?? "", (r) => r), oo(this._promptEditor).value)), this._register(Te((r) => { - const l = oo(this._promptEditor).isFocused.read(r); - this._elements.root.classList.toggle("focused", l); + const { topCode: c, bottomCode: d, topEdit: a, bottomEdit: h, editHeight: u } = r, m = 10, b = 0, g = 40, Z = new hVe().moveTo(c).lineTo(c.deltaX(m)).curveTo(c.deltaX(m + g), a.deltaX(-g - b), a.deltaX(-b)).lineTo(a).lineTo(h).lineTo(h.deltaX(-b)).curveTo(h.deltaX(-g - b), d.deltaX(m + g), d.deltaX(m)).lineTo(d).build(); + this._elements.path.setAttribute("d", Z), this._elements.editorContainer.style.top = `${a.y}px`, this._elements.editorContainer.style.left = `${a.x}px`, this._elements.editorContainer.style.height = `${u}px`; + const f = this._previewEditorObs.contentWidth.read(l); + this._previewEditor.layout({ height: u, width: f }); + })), this._promptEditor.setModel(this._promptTextModel), this._promptEditor.layout(), this._register(uVe(aVe(this._userPrompt, (l) => l ?? "", (l) => l), ro(this._promptEditor).value)), this._register(Te((l) => { + const r = ro(this._promptEditor).isFocused.read(l); + this._elements.root.classList.toggle("focused", r); })); } }; -GV = pLe([ - fLe(3, Se) -], GV); -function yLe(s, e, t) { - return xC(void 0, (i) => e(s.read(i)), (i, n) => s.set(t(i), n)); +n5 = rVe([ + cVe(3, Ge) +], n5); +function aVe(s, e, t) { + return JG(void 0, (i) => e(s.read(i)), (i, n) => s.set(t(i), n)); } -class Qp { +class ig { constructor(e, t) { this.x = e, this.y = t; } deltaX(e) { - return new Qp(this.x + e, this.y); + return new ig(this.x + e, this.y); } } -class wLe { +class hVe { constructor() { this._data = ""; } @@ -89365,8 +89365,8 @@ class wLe { return this._data; } } -function CLe(s, e) { - const t = new U(); +function uVe(s, e) { + const t = new _(); return t.add(Te((i) => { const n = s.read(i); e.set(n, void 0); @@ -89375,94 +89375,94 @@ function CLe(s, e) { s.set(n, void 0); })), t; } -var SLe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var mVe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, UW = function(s, e) { +}, aN = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Sy, Qg; -let RV = (Qg = class extends R { +}, wf, tb; +let s5 = (tb = class extends J { static _createUniqueUri() { - return Le.from({ scheme: "inline-edits", path: (/* @__PURE__ */ new Date()).toString() + String(Sy._modelId++) }); - } - constructor(e, t, i, n, o, r, l) { - super(), this.textModel = e, this._textModelVersionId = t, this._selection = i, this._debounceValue = n, this.languageFeaturesService = o, this._diffProviderFactoryService = r, this._modelService = l, this._forceUpdateExplicitlySignal = d0(this), this._selectedInlineCompletionId = Oe(this, void 0), this._isActive = Oe(this, !1), this._originalModel = Un(() => this._modelService.createModel("", null, Sy._createUniqueUri())).keepObserved(this._store), this._modifiedModel = Un(() => this._modelService.createModel("", null, Sy._createUniqueUri())).keepObserved(this._store), this._pinnedRange = new ALe(this.textModel, this._textModelVersionId), this.isPinned = this._pinnedRange.range.map((a) => !!a), this.userPrompt = Oe(this, void 0), this.inlineEdit = ye(this, (a) => { - var c, d; - return (d = (c = this._inlineEdit.read(a)) == null ? void 0 : c.promiseResult.read(a)) == null ? void 0 : d.data; - }), this._inlineEdit = ye(this, (a) => { - const c = this.selectedInlineEdit.read(a); - if (!c) + return Xe.from({ scheme: "inline-edits", path: (/* @__PURE__ */ new Date()).toString() + String(wf._modelId++) }); + } + constructor(e, t, i, n, o, l, r) { + super(), this.textModel = e, this._textModelVersionId = t, this._selection = i, this._debounceValue = n, this.languageFeaturesService = o, this._diffProviderFactoryService = l, this._modelService = r, this._forceUpdateExplicitlySignal = g0(this), this._selectedInlineCompletionId = Ue(this, void 0), this._isActive = Ue(this, !1), this._originalModel = On(() => this._modelService.createModel("", null, wf._createUniqueUri())).keepObserved(this._store), this._modifiedModel = On(() => this._modelService.createModel("", null, wf._createUniqueUri())).keepObserved(this._store), this._pinnedRange = new pVe(this.textModel, this._textModelVersionId), this.isPinned = this._pinnedRange.range.map((c) => !!c), this.userPrompt = Ue(this, void 0), this.inlineEdit = fe(this, (c) => { + var d, a; + return (a = (d = this._inlineEdit.read(c)) == null ? void 0 : d.promiseResult.read(c)) == null ? void 0 : a.data; + }), this._inlineEdit = fe(this, (c) => { + const d = this.selectedInlineEdit.read(c); + if (!d) return; - const d = c.inlineCompletion.range; - if (c.inlineCompletion.insertText.trim() === "") + const a = d.inlineCompletion.range; + if (d.inlineCompletion.insertText.trim() === "") return; - let h = c.inlineCompletion.insertText.split(/\r\n|\r|\n/); - function u(b) { - var w; - const y = ((w = b[0].match(/^\s*/)) == null ? void 0 : w[0]) ?? ""; - return b.map((C) => C.replace(new RegExp("^" + y), "")); + let h = d.inlineCompletion.insertText.split(/\r\n|\r|\n/); + function u(Z) { + var y; + const f = ((y = Z[0].match(/^\s*/)) == null ? void 0 : y[0]) ?? ""; + return Z.map((W) => W.replace(new RegExp("^" + f), "")); } h = u(h); - let m = this.textModel.getValueInRange(d).split(/\r\n|\r|\n/); - m = u(m), this._originalModel.get().setValue(m.join(` + let b = this.textModel.getValueInRange(a).split(/\r\n|\r|\n/); + b = u(b), this._originalModel.get().setValue(b.join(` `)), this._modifiedModel.get().setValue(h.join(` `)); - const f = this._diffProviderFactoryService.createDiffProvider({ diffAlgorithm: "advanced" }); - return CI.fromFn(async () => { - const b = await f.computeDiff(this._originalModel.get(), this._modifiedModel.get(), { + const g = this._diffProviderFactoryService.createDiffProvider({ diffAlgorithm: "advanced" }); + return kx.fromFn(async () => { + const Z = await g.computeDiff(this._originalModel.get(), this._modifiedModel.get(), { computeMoves: !1, ignoreTrimWhitespace: !1, maxComputationTimeMs: 1e3 - }, Ye.None); - if (!b.identical) - return new bLe(We.fromRangeInclusive(d), u(h), b.changes); + }, Fe.None); + if (!Z.identical) + return new dVe(Ne.fromRangeInclusive(a), u(h), Z.changes); }); - }), this._fetchStore = this._register(new U()), this._inlineEditsFetchResult = p1(this, void 0), this._inlineEdits = Vo({ owner: this, equalsFn: KA }, (a) => { - var c; - return ((c = this._inlineEditsFetchResult.read(a)) == null ? void 0 : c.completions.map((d) => new LLe(d))) ?? []; - }), this._fetchInlineEditsPromise = MK({ + }), this._fetchStore = this._register(new _()), this._inlineEditsFetchResult = xW(this, void 0), this._inlineEdits = vo({ owner: this, equalsFn: aL }, (c) => { + var d; + return ((d = this._inlineEditsFetchResult.read(c)) == null ? void 0 : d.completions.map((a) => new bVe(a))) ?? []; + }), this._fetchInlineEditsPromise = rO({ owner: this, createEmptyChangeSummary: () => ({ - inlineCompletionTriggerKind: _l.Automatic + inlineCompletionTriggerKind: wr.Automatic }), - handleChange: (a, c) => (a.didChange(this._forceUpdateExplicitlySignal) && (c.inlineCompletionTriggerKind = _l.Explicit), !0) - }, async (a, c) => { - this._fetchStore.clear(), this._forceUpdateExplicitlySignal.read(a), this._textModelVersionId.read(a); - function d(f, b) { - return b(f); + handleChange: (c, d) => (c.didChange(this._forceUpdateExplicitlySignal) && (d.inlineCompletionTriggerKind = wr.Explicit), !0) + }, async (c, d) => { + this._fetchStore.clear(), this._forceUpdateExplicitlySignal.read(c), this._textModelVersionId.read(c); + function a(g, Z) { + return Z(g); } - const h = this._pinnedRange.range.read(a) ?? d(this._selection.read(a), (f) => f.isEmpty() ? void 0 : f); + const h = this._pinnedRange.range.read(c) ?? a(this._selection.read(c), (g) => g.isEmpty() ? void 0 : g); if (!h) { this._inlineEditsFetchResult.set(void 0, void 0), this.userPrompt.set(void 0, void 0); return; } const u = { - triggerKind: c.inlineCompletionTriggerKind, + triggerKind: d.inlineCompletionTriggerKind, selectedSuggestionInfo: void 0, - userPrompt: this.userPrompt.read(a) - }, g = w2(this._fetchStore); - await Zh(200, g); - const m = await Gj(this.languageFeaturesService.inlineCompletionsProvider, h, this.textModel, u, g); - g.isCancellationRequested || this._inlineEditsFetchResult.set(m, void 0); - }), this._filteredInlineEditItems = Vo({ owner: this, equalsFn: UA() }, (a) => this._inlineEdits.read(a)), this.selectedInlineCompletionIndex = ye(this, (a) => { - const c = this._selectedInlineCompletionId.read(a), d = this._filteredInlineEditItems.read(a), h = this._selectedInlineCompletionId === void 0 ? -1 : d.findIndex((u) => u.semanticId === c); + userPrompt: this.userPrompt.read(c) + }, m = DN(this._fetchStore); + await Nh(200, m); + const b = await f7(this.languageFeaturesService.inlineCompletionsProvider, h, this.textModel, u, m); + m.isCancellationRequested || this._inlineEditsFetchResult.set(b, void 0); + }), this._filteredInlineEditItems = vo({ owner: this, equalsFn: dL() }, (c) => this._inlineEdits.read(c)), this.selectedInlineCompletionIndex = fe(this, (c) => { + const d = this._selectedInlineCompletionId.read(c), a = this._filteredInlineEditItems.read(c), h = this._selectedInlineCompletionId === void 0 ? -1 : a.findIndex((u) => u.semanticId === d); return h === -1 ? (this._selectedInlineCompletionId.set(void 0, void 0), 0) : h; - }), this.selectedInlineEdit = ye(this, (a) => { - const c = this._filteredInlineEditItems.read(a), d = this.selectedInlineCompletionIndex.read(a); - return c[d]; - }), this._register(h0(this._fetchInlineEditsPromise)); + }), this.selectedInlineEdit = fe(this, (c) => { + const d = this._filteredInlineEditItems.read(c), a = this.selectedInlineCompletionIndex.read(c); + return d[a]; + }), this._register(Z0(this._fetchInlineEditsPromise)); } async triggerExplicitly(e) { - fm(e, (t) => { + Gb(e, (t) => { this._isActive.set(!0, t), this._forceUpdateExplicitlySignal.trigger(t); }), await this._fetchInlineEditsPromise.get(); } stop(e) { - fm(e, (t) => { + Gb(e, (t) => { this.userPrompt.set(void 0, t), this._isActive.set(!1, t), this._inlineEditsFetchResult.set(void 0, t), this._pinnedRange.setRange(void 0, t); }); } @@ -89483,30 +89483,30 @@ let RV = (Qg = class extends R { } async accept(e) { if (e.getModel() !== this.textModel) - throw new mt(); + throw new bt(); const t = this.selectedInlineEdit.get(); t && (e.pushUndoStop(), e.executeEdits("inlineSuggestion.accept", [ t.inlineCompletion.toSingleTextEdit().toSingleEditOperation() ]), this.stop()); } -}, Sy = Qg, Qg._modelId = 0, Qg); -RV = Sy = SLe([ - UW(4, ge), - UW(5, WC), - UW(6, Pt) -], RV); -class LLe { +}, wf = tb, tb._modelId = 0, tb); +s5 = wf = mVe([ + aN(4, me), + aN(5, AG), + aN(6, At) +], s5); +class bVe { constructor(e) { this.inlineCompletion = e, this.semanticId = this.inlineCompletion.hash(); } } -class ALe extends R { +class pVe extends J { constructor(e, t) { - super(), this._textModel = e, this._versionId = t, this._decorations = Oe(this, []), this.range = ye(this, (i) => { + super(), this._textModel = e, this._versionId = t, this._decorations = Ue(this, []), this.range = fe(this, (i) => { this._versionId.read(i); const n = this._decorations.read(i)[0]; return n ? this._textModel.getDecorationRange(n) ?? null : null; - }), this._register(Ce(() => { + }), this._register(We(() => { this._textModel.deltaDecorations(this._decorations.get(), []); })); } @@ -89514,68 +89514,68 @@ class ALe extends R { this._decorations.set(this._textModel.deltaDecorations(this._decorations.get(), e ? [{ range: e, options: { description: "trackedRange" } }] : []), t); } } -var xLe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var gVe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, U0 = function(s, e) { +}, tf = function(s, e) { return function(t, i) { e(t, i, s); }; -}, EV, jg; -let $c = (jg = class extends R { +}, o5, ib; +let na = (ib = class extends J { static get(e) { - return e.getContribution(EV.ID); + return e.getContribution(o5.ID); } - constructor(e, t, i, n, o, r) { - super(), this.editor = e, this._instantiationService = t, this._contextKeyService = i, this._debounceService = n, this._languageFeaturesService = o, this._configurationService = r, this._enabled = Qge("editor.inlineEdits.enabled", !1, this._configurationService), this._editorObs = oo(this.editor), this._selection = ye(this, (l) => this._editorObs.cursorSelection.read(l) ?? new fe(1, 1, 1, 1)), this._debounceValue = this._debounceService.for(this._languageFeaturesService.inlineCompletionsProvider, "InlineEditsDebounce", { min: 50, max: 50 }), this.model = Un(this, (l) => { - if (!this._enabled.read(l) || this._editorObs.isReadonly.read(l)) + constructor(e, t, i, n, o, l) { + super(), this.editor = e, this._instantiationService = t, this._contextKeyService = i, this._debounceService = n, this._languageFeaturesService = o, this._configurationService = l, this._enabled = zbe("editor.inlineEdits.enabled", !1, this._configurationService), this._editorObs = ro(this.editor), this._selection = fe(this, (r) => this._editorObs.cursorSelection.read(r) ?? new ge(1, 1, 1, 1)), this._debounceValue = this._debounceService.for(this._languageFeaturesService.inlineCompletionsProvider, "InlineEditsDebounce", { min: 50, max: 50 }), this.model = On(this, (r) => { + if (!this._enabled.read(r) || this._editorObs.isReadonly.read(r)) return; - const a = this._editorObs.model.read(l); - return a ? this._instantiationService.createInstance(eo(RV, l), a, this._editorObs.versionId, this._selection, this._debounceValue) : void 0; - }), this._hadInlineEdit = _C(this, (l, a) => { - var c; - return a || ((c = this.model.read(l)) == null ? void 0 : c.inlineEdit.read(l)) !== void 0; - }), this._widget = Un(this, (l) => { - if (this._hadInlineEdit.read(l)) - return this._instantiationService.createInstance(eo(GV, l), this.editor, this.model.map((a, c) => a == null ? void 0 : a.inlineEdit.read(c)), MLe((a) => { - var c; - return ((c = this.model.read(a)) == null ? void 0 : c.userPrompt) ?? Oe("empty", ""); + const c = this._editorObs.model.read(r); + return c ? this._instantiationService.createInstance(io(s5, r), c, this._editorObs.versionId, this._selection, this._debounceValue) : void 0; + }), this._hadInlineEdit = DG(this, (r, c) => { + var d; + return c || ((d = this.model.read(r)) == null ? void 0 : d.inlineEdit.read(r)) !== void 0; + }), this._widget = On(this, (r) => { + if (this._hadInlineEdit.read(r)) + return this._instantiationService.createInstance(io(n5, r), this.editor, this.model.map((c, d) => c == null ? void 0 : c.inlineEdit.read(d)), ZVe((c) => { + var d; + return ((d = this.model.read(c)) == null ? void 0 : d.userPrompt) ?? Ue("empty", ""); })); - }), this._register(cl(Fb, this._contextKeyService, (l) => { - var a; - return !!((a = this.model.read(l)) != null && a.inlineEdit.read(l)); - })), this._register(cl(gLe, this._contextKeyService, (l) => { - var a; - return !!((a = this.model.read(l)) != null && a.isPinned.read(l)); + }), this._register(ur(PZ, this._contextKeyService, (r) => { + var c; + return !!((c = this.model.read(r)) != null && c.inlineEdit.read(r)); + })), this._register(ur(oVe, this._contextKeyService, (r) => { + var c; + return !!((c = this.model.read(r)) != null && c.isPinned.read(r)); })), this.model.recomputeInitiallyAndOnChange(this._store), this._widget.recomputeInitiallyAndOnChange(this._store); } -}, EV = jg, jg.ID = "editor.contrib.inlineEditsController", jg); -$c = EV = xLe([ - U0(1, Se), - U0(2, _e), - U0(3, jo), - U0(4, ge), - U0(5, Ke) -], $c); -function MLe(s) { - return xC(void 0, (e) => s(e).read(e), (e, t) => { +}, o5 = ib, ib.ID = "editor.contrib.inlineEditsController", ib); +na = o5 = gVe([ + tf(1, Ge), + tf(2, xe), + tf(3, $o), + tf(4, me), + tf(5, Qe) +], na); +function ZVe(s) { + return JG(void 0, (e) => s(e).read(e), (e, t) => { s(void 0).set(e, t); }); } -function zC(s) { +function t1(s) { return { label: s.value, alias: s.original }; } -const t_ = class t_ extends he { +const gS = class gS extends he { constructor() { super({ - id: t_.ID, - ...zC(Ie("action.inlineEdits.showNext", "Show Next Inline Edit")), - precondition: H.and(I.writable, Fb), + id: gS.ID, + ...t1(Ce("action.inlineEdits.showNext", "Show Next Inline Edit")), + precondition: P.and(C.writable, PZ), kbOpts: { weight: 100, primary: 606 @@ -89584,18 +89584,18 @@ const t_ = class t_ extends he { } async run(e, t) { var n; - const i = $c.get(t); + const i = na.get(t); (n = i == null ? void 0 : i.model.get()) == null || n.next(); } }; -t_.ID = uLe; -let XV = t_; -const i_ = class i_ extends he { +gS.ID = sVe; +let l5 = gS; +const ZS = class ZS extends he { constructor() { super({ - id: i_.ID, - ...zC(Ie("action.inlineEdits.showPrevious", "Show Previous Inline Edit")), - precondition: H.and(I.writable, Fb), + id: ZS.ID, + ...t1(Ce("action.inlineEdits.showPrevious", "Show Previous Inline Edit")), + precondition: P.and(C.writable, PZ), kbOpts: { weight: 100, primary: 604 @@ -89604,34 +89604,34 @@ const i_ = class i_ extends he { } async run(e, t) { var n; - const i = $c.get(t); + const i = na.get(t); (n = i == null ? void 0 : i.model.get()) == null || n.previous(); } }; -i_.ID = hLe; -let FV = i_; -class ZLe extends he { +ZS.ID = nVe; +let r5 = ZS; +class fVe extends he { constructor() { super({ id: "editor.action.inlineEdits.trigger", - ...zC(Ie("action.inlineEdits.trigger", "Trigger Inline Edit")), - precondition: I.writable + ...t1(Ce("action.inlineEdits.trigger", "Trigger Inline Edit")), + precondition: C.writable }); } async run(e, t) { - const i = $c.get(t); - await xK(async (n) => { + const i = na.get(t); + await lO(async (n) => { var o; await ((o = i == null ? void 0 : i.model.get()) == null ? void 0 : o.triggerExplicitly(n)); }); } } -class _Le extends he { +class yVe extends he { constructor() { super({ - id: dLe, - ...zC(Ie("action.inlineEdits.accept", "Accept Inline Edit")), - precondition: Fb, + id: iVe, + ...t1(Ce("action.inlineEdits.accept", "Accept Inline Edit")), + precondition: PZ, menuOpts: { menuId: pe.InlineEditsActions, title: p("inlineEditsActions", "Accept Inline Edit"), @@ -89642,23 +89642,23 @@ class _Le extends he { kbOpts: { primary: 2058, weight: 2e4, - kbExpr: Fb + kbExpr: PZ } }); } async run(e, t) { var n; - t instanceof Qr && (t = t.getParentEditor()); - const i = $c.get(t); + t instanceof $l && (t = t.getParentEditor()); + const i = na.get(t); i && ((n = i.model.get()) == null || n.accept(i.editor), i.editor.focus()); } } -const n_ = class n_ extends he { +const fS = class fS extends he { constructor() { super({ - id: n_.ID, - ...zC(Ie("action.inlineEdits.hide", "Hide Inline Edit")), - precondition: Fb, + id: fS.ID, + ...t1(Ce("action.inlineEdits.hide", "Hide Inline Edit")), + precondition: PZ, kbOpts: { weight: 100, primary: 9 @@ -89666,57 +89666,57 @@ const n_ = class n_ extends he { }); } async run(e, t) { - const i = $c.get(t); - oi((n) => { + const i = na.get(t); + li((n) => { var o; (o = i == null ? void 0 : i.model.get()) == null || o.stop(n); }); } }; -n_.ID = "editor.action.inlineEdits.hide"; -let YV = n_; -gt( - $c.ID, - $c, +fS.ID = "editor.action.inlineEdits.hide"; +let c5 = fS; +mt( + na.ID, + na, 3 /* EditorContributionInstantiation.Eventually */ ); -ee(ZLe); -ee(XV); -ee(FV); -ee(_Le); -ee(YV); -const vm = { - Visible: new ae("parameterHintsVisible", !1), - MultipleSignatures: new ae("parameterHintsMultipleSignatures", !1) +ee(fVe); +ee(l5); +ee(r5); +ee(yVe); +ee(c5); +const vb = { + Visible: new ce("parameterHintsVisible", !1), + MultipleSignatures: new ce("parameterHintsMultipleSignatures", !1) }; -async function t7(s, e, t, i, n) { +async function J7(s, e, t, i, n) { const o = s.ordered(e); - for (const r of o) + for (const l of o) try { - const l = await r.provideSignatureHelp(e, t, n, i); - if (l) - return l; - } catch (l) { - wi(l); + const r = await l.provideSignatureHelp(e, t, n, i); + if (r) + return r; + } catch (r) { + Wi(r); } } st.registerCommand("_executeSignatureHelpProvider", async (s, ...e) => { const [t, i, n] = e; - ht(Le.isUri(t)), ht(V.isIPosition(i)), ht(typeof n == "string" || !n); - const o = s.get(ge), r = await s.get(Ys).createModelReference(t); + ht(Xe.isUri(t)), ht(Y.isIPosition(i)), ht(typeof n == "string" || !n); + const o = s.get(me), l = await s.get(As).createModelReference(t); try { - const l = await t7(o.signatureHelpProvider, r.object.textEditorModel, V.lift(i), { - triggerKind: Za.Invoke, + const r = await J7(o.signatureHelpProvider, l.object.textEditorModel, Y.lift(i), { + triggerKind: Nc.Invoke, isRetrigger: !1, triggerCharacter: n - }, Ye.None); - return l ? (setTimeout(() => l.dispose(), 0), l.value) : void 0; + }, Fe.None); + return r ? (setTimeout(() => r.dispose(), 0), r.value) : void 0; } finally { - r.dispose(); + l.dispose(); } }); -var Ad; +var xa; (function(s) { s.Default = { type: 0 @@ -89734,11 +89734,11 @@ var Ad; } } s.Active = t; -})(Ad || (Ad = {})); -const s_ = class s_ extends R { +})(xa || (xa = {})); +const yS = class yS extends J { // ms - constructor(e, t, i = s_.DEFAULT_DELAY) { - super(), this._onChangedHints = this._register(new k()), this.onChangedHints = this._onChangedHints.event, this.triggerOnType = !1, this._state = Ad.Default, this._pendingTriggers = [], this._lastSignatureHelpResult = this._register(new fn()), this.triggerChars = new fA(), this.retriggerChars = new fA(), this.triggerId = 0, this.editor = e, this.providers = t, this.throttledDelayer = new fr(i), this._register(this.editor.onDidBlurEditorWidget(() => this.cancel())), this._register(this.editor.onDidChangeConfiguration(() => this.onEditorConfigurationChange())), this._register(this.editor.onDidChangeModel((n) => this.onModelChanged())), this._register(this.editor.onDidChangeModelLanguage((n) => this.onModelChanged())), this._register(this.editor.onDidChangeCursorSelection((n) => this.onCursorChange(n))), this._register(this.editor.onDidChangeModelContent((n) => this.onModelContentChange())), this._register(this.providers.onDidChange(this.onModelChanged, this)), this._register(this.editor.onDidType((n) => this.onDidType(n))), this.onEditorConfigurationChange(), this.onModelChanged(); + constructor(e, t, i = yS.DEFAULT_DELAY) { + super(), this._onChangedHints = this._register(new k()), this.onChangedHints = this._onChangedHints.event, this.triggerOnType = !1, this._state = xa.Default, this._pendingTriggers = [], this._lastSignatureHelpResult = this._register(new Zn()), this.triggerChars = new wV(), this.retriggerChars = new wV(), this.triggerId = 0, this.editor = e, this.providers = t, this.throttledDelayer = new yl(i), this._register(this.editor.onDidBlurEditorWidget(() => this.cancel())), this._register(this.editor.onDidChangeConfiguration(() => this.onEditorConfigurationChange())), this._register(this.editor.onDidChangeModel((n) => this.onModelChanged())), this._register(this.editor.onDidChangeModelLanguage((n) => this.onModelChanged())), this._register(this.editor.onDidChangeCursorSelection((n) => this.onCursorChange(n))), this._register(this.editor.onDidChangeModelContent((n) => this.onModelContentChange())), this._register(this.providers.onDidChange(this.onModelChanged, this)), this._register(this.editor.onDidType((n) => this.onDidType(n))), this.onEditorConfigurationChange(), this.onModelChanged(); } get state() { return this._state; @@ -89747,14 +89747,14 @@ const s_ = class s_ extends R { this._state.type === 2 && this._state.request.cancel(), this._state = e; } cancel(e = !1) { - this.state = Ad.Default, this.throttledDelayer.cancel(), e || this._onChangedHints.fire(void 0); + this.state = xa.Default, this.throttledDelayer.cancel(), e || this._onChangedHints.fire(void 0); } trigger(e, t) { const i = this.editor.getModel(); if (!i || !this.providers.has(i)) return; const n = ++this.triggerId; - this._pendingTriggers.push(e), this.throttledDelayer.trigger(() => this.doTrigger(n), t).catch(De); + this._pendingTriggers.push(e), this.throttledDelayer.trigger(() => this.doTrigger(n), t).catch(Me); } next() { if (this.state.type !== 1) @@ -89783,13 +89783,13 @@ const s_ = class s_ extends R { this.updateActiveSignature(i && n ? e - 1 : t - 1); } updateActiveSignature(e) { - this.state.type === 1 && (this.state = new Ad.Active({ ...this.state.hints, activeSignature: e }), this._onChangedHints.fire(this.state.hints)); + this.state.type === 1 && (this.state = new xa.Active({ ...this.state.hints, activeSignature: e }), this._onChangedHints.fire(this.state.hints)); } async doTrigger(e) { const t = this.state.type === 1 || this.state.type === 2, i = this.getLastActiveHints(); if (this.cancel(!0), this._pendingTriggers.length === 0) return !1; - const n = this._pendingTriggers.reduce(ILe); + const n = this._pendingTriggers.reduce(WVe); this._pendingTriggers = []; const o = { triggerKind: n.triggerKind, @@ -89799,13 +89799,13 @@ const s_ = class s_ extends R { }; if (!this.editor.hasModel()) return !1; - const r = this.editor.getModel(), l = this.editor.getPosition(); - this.state = new Ad.Pending(Ui((a) => t7(this.providers, r, l, o, a)), i); + const l = this.editor.getModel(), r = this.editor.getPosition(); + this.state = new xa.Pending(Qi((c) => J7(this.providers, l, r, o, c)), i); try { - const a = await this.state.request; - return e !== this.triggerId ? (a == null || a.dispose(), !1) : !a || !a.value.signatures || a.value.signatures.length === 0 ? (a == null || a.dispose(), this._lastSignatureHelpResult.clear(), this.cancel(), !1) : (this.state = new Ad.Active(a.value), this._lastSignatureHelpResult.value = a, this._onChangedHints.fire(this.state.hints), !0); - } catch (a) { - return e === this.triggerId && (this.state = Ad.Default), De(a), !1; + const c = await this.state.request; + return e !== this.triggerId ? (c == null || c.dispose(), !1) : !c || !c.value.signatures || c.value.signatures.length === 0 ? (c == null || c.dispose(), this._lastSignatureHelpResult.clear(), this.cancel(), !1) : (this.state = new xa.Active(c.value), this._lastSignatureHelpResult.value = c, this._onChangedHints.fire(this.state.hints), !0); + } catch (c) { + return e === this.triggerId && (this.state = xa.Default), Me(c), !1; } } getLastActiveHints() { @@ -89840,15 +89840,15 @@ const s_ = class s_ extends R { return; const t = e.length - 1, i = e.charCodeAt(t); (this.triggerChars.has(i) || this.isTriggered && this.retriggerChars.has(i)) && this.trigger({ - triggerKind: Za.TriggerCharacter, + triggerKind: Nc.TriggerCharacter, triggerCharacter: e.charAt(t) }); } onCursorChange(e) { - e.source === "mouse" ? this.cancel() : this.isTriggered && this.trigger({ triggerKind: Za.ContentChange }); + e.source === "mouse" ? this.cancel() : this.isTriggered && this.trigger({ triggerKind: Nc.ContentChange }); } onModelContentChange() { - this.isTriggered && this.trigger({ triggerKind: Za.ContentChange }); + this.isTriggered && this.trigger({ triggerKind: Nc.ContentChange }); } onEditorConfigurationChange() { this.triggerOnType = this.editor.getOption( @@ -89860,55 +89860,55 @@ const s_ = class s_ extends R { this.cancel(!0), super.dispose(); } }; -s_.DEFAULT_DELAY = 120; -let zV = s_; -function ILe(s, e) { +yS.DEFAULT_DELAY = 120; +let d5 = yS; +function WVe(s, e) { switch (e.triggerKind) { - case Za.Invoke: + case Nc.Invoke: return e; - case Za.ContentChange: + case Nc.ContentChange: return s; - case Za.TriggerCharacter: + case Nc.TriggerCharacter: default: return e; } } -var NLe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var GVe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, US = function(s, e) { +}, rX = function(s, e) { return function(t, i) { e(t, i, s); }; -}, PV; -const xo = ce, WLe = Bt("parameter-hints-next", te.chevronDown, p("parameterHintsNextIcon", "Icon for show next parameter hint.")), vLe = Bt("parameter-hints-previous", te.chevronUp, p("parameterHintsPreviousIcon", "Icon for show previous parameter hint.")); -var qg; -let BV = (qg = class extends R { - constructor(e, t, i, n, o, r) { - super(), this.editor = e, this.model = t, this.telemetryService = r, this.renderDisposeables = this._register(new U()), this.visible = !1, this.announcedLabel = null, this.allowEditorOverflow = !0, this.markdownRenderer = this._register(new Qc({ editor: e }, o, n)), this.keyVisible = vm.Visible.bindTo(i), this.keyMultipleSignatures = vm.MultipleSignatures.bindTo(i); +}, a5; +const So = de, XVe = Kt("parameter-hints-next", te.chevronDown, p("parameterHintsNextIcon", "Icon for show next parameter hint.")), VVe = Kt("parameter-hints-previous", te.chevronUp, p("parameterHintsPreviousIcon", "Icon for show previous parameter hint.")); +var nb; +let h5 = (nb = class extends J { + constructor(e, t, i, n, o, l) { + super(), this.editor = e, this.model = t, this.telemetryService = l, this.renderDisposeables = this._register(new _()), this.visible = !1, this.announcedLabel = null, this.allowEditorOverflow = !0, this.markdownRenderer = this._register(new ea({ editor: e }, o, n)), this.keyVisible = vb.Visible.bindTo(i), this.keyMultipleSignatures = vb.MultipleSignatures.bindTo(i); } createParameterHintDOMNodes() { - const e = xo(".editor-widget.parameter-hints-widget"), t = Q(e, xo(".phwrapper")); + const e = So(".editor-widget.parameter-hints-widget"), t = O(e, So(".phwrapper")); t.tabIndex = -1; - const i = Q(t, xo(".controls")), n = Q(i, xo(".button" + Ze.asCSSSelector(vLe))), o = Q(i, xo(".overloads")), r = Q(i, xo(".button" + Ze.asCSSSelector(WLe))); + const i = O(t, So(".controls")), n = O(i, So(".button" + Se.asCSSSelector(VVe))), o = O(i, So(".overloads")), l = O(i, So(".button" + Se.asCSSSelector(XVe))); this._register(z(n, "click", (u) => { tt.stop(u), this.previous(); - })), this._register(z(r, "click", (u) => { + })), this._register(z(l, "click", (u) => { tt.stop(u), this.next(); })); - const l = xo(".body"), a = new CC(l, { + const r = So(".body"), c = new MG(r, { alwaysConsumeMouseWheel: !0 }); - this._register(a), t.appendChild(a.getDomNode()); - const c = Q(l, xo(".signature")), d = Q(l, xo(".docs")); + this._register(c), t.appendChild(c.getDomNode()); + const d = O(r, So(".signature")), a = O(r, So(".docs")); e.style.userSelect = "text", this.domNodes = { element: e, - signature: c, + signature: d, overloads: o, - docs: d, - scrollbar: a + docs: a, + scrollbar: c }, this.editor.addContentWidget(this), this.hide(), this._register(this.editor.onDidChangeCursorSelection((u) => { this.visible && this.editor.layoutContentWidget(this); })); @@ -89918,10 +89918,10 @@ let BV = (qg = class extends R { const u = this.editor.getOption( 50 /* EditorOption.fontInfo */ - ), g = this.domNodes.element; - g.style.fontSize = `${u.fontSize}px`, g.style.lineHeight = `${u.lineHeight / u.fontSize}`, g.style.setProperty("--vscode-parameterHintsWidget-editorFontFamily", u.fontFamily), g.style.setProperty("--vscode-parameterHintsWidget-editorFontFamilyDefault", ps.fontFamily); + ), m = this.domNodes.element; + m.style.fontSize = `${u.fontSize}px`, m.style.lineHeight = `${u.lineHeight / u.fontSize}`, m.style.setProperty("--vscode-parameterHintsWidget-editorFontFamily", u.fontFamily), m.style.setProperty("--vscode-parameterHintsWidget-editorFontFamilyDefault", Zs.fontFamily); }; - h(), this._register(se.chain(this.editor.onDidChangeConfiguration.bind(this.editor), (u) => u.filter((g) => g.hasChanged( + h(), this._register(se.chain(this.editor.onDidChangeConfiguration.bind(this.editor), (u) => u.filter((m) => m.hasChanged( 50 /* EditorOption.fontInfo */ )))(h)), this._register(this.editor.onDidLayoutChange((u) => this.updateMaxHeight())), this.updateMaxHeight(); @@ -89954,40 +89954,40 @@ let BV = (qg = class extends R { const i = e.signatures[e.activeSignature]; if (!i) return; - const n = Q(this.domNodes.signature, xo(".code")), o = i.parameters.length > 0, r = i.activeParameter ?? e.activeParameter; + const n = O(this.domNodes.signature, So(".code")), o = i.parameters.length > 0, l = i.activeParameter ?? e.activeParameter; if (o) - this.renderParameters(n, i, r); + this.renderParameters(n, i, l); else { - const c = Q(n, xo("span")); - c.textContent = i.label; - } - const l = i.parameters[r]; - if (l != null && l.documentation) { - const c = xo("span.documentation"); - if (typeof l.documentation == "string") - c.textContent = l.documentation; + const d = O(n, So("span")); + d.textContent = i.label; + } + const r = i.parameters[l]; + if (r != null && r.documentation) { + const d = So("span.documentation"); + if (typeof r.documentation == "string") + d.textContent = r.documentation; else { - const d = this.renderMarkdownDocs(l.documentation); - c.appendChild(d.element); + const a = this.renderMarkdownDocs(r.documentation); + d.appendChild(a.element); } - Q(this.domNodes.docs, xo("p", {}, c)); + O(this.domNodes.docs, So("p", {}, d)); } if (i.documentation !== void 0) if (typeof i.documentation == "string") - Q(this.domNodes.docs, xo("p", {}, i.documentation)); + O(this.domNodes.docs, So("p", {}, i.documentation)); else { - const c = this.renderMarkdownDocs(i.documentation); - Q(this.domNodes.docs, c.element); + const d = this.renderMarkdownDocs(i.documentation); + O(this.domNodes.docs, d.element); } - const a = this.hasDocs(i, l); - if (this.domNodes.signature.classList.toggle("has-docs", a), this.domNodes.docs.classList.toggle("empty", !a), this.domNodes.overloads.textContent = String(e.activeSignature + 1).padStart(e.signatures.length.toString().length, "0") + "/" + e.signatures.length, l) { - let c = ""; - const d = i.parameters[r]; - Array.isArray(d.label) ? c = i.label.substring(d.label[0], d.label[1]) : c = d.label, d.documentation && (c += typeof d.documentation == "string" ? `, ${d.documentation}` : `, ${d.documentation.value}`), i.documentation && (c += typeof i.documentation == "string" ? `, ${i.documentation}` : `, ${i.documentation.value}`), this.announcedLabel !== c && (bs(p("hint", "{0}, hint", c)), this.announcedLabel = c); + const c = this.hasDocs(i, r); + if (this.domNodes.signature.classList.toggle("has-docs", c), this.domNodes.docs.classList.toggle("empty", !c), this.domNodes.overloads.textContent = String(e.activeSignature + 1).padStart(e.signatures.length.toString().length, "0") + "/" + e.signatures.length, r) { + let d = ""; + const a = i.parameters[l]; + Array.isArray(a.label) ? d = i.label.substring(a.label[0], a.label[1]) : d = a.label, a.documentation && (d += typeof a.documentation == "string" ? `, ${a.documentation}` : `, ${a.documentation.value}`), i.documentation && (d += typeof i.documentation == "string" ? `, ${i.documentation}` : `, ${i.documentation.value}`), this.announcedLabel !== d && (ys(p("hint", "{0}, hint", d)), this.announcedLabel = d); } this.editor.layoutContentWidget(this), this.domNodes.scrollbar.scanDomNode(); } renderMarkdownDocs(e) { - const t = new on(), i = this.renderDisposeables.add(this.markdownRenderer.render(e, { + const t = new ln(), i = this.renderDisposeables.add(this.markdownRenderer.render(e, { asyncRenderCallback: () => { var o; (o = this.domNodes) == null || o.scrollbar.scanDomNode(); @@ -90000,15 +90000,15 @@ let BV = (qg = class extends R { }), i; } hasDocs(e, t) { - return !!(t && typeof t.documentation == "string" && Ed(t.documentation).length > 0 || t && typeof t.documentation == "object" && Ed(t.documentation).value.length > 0 || e.documentation && typeof e.documentation == "string" && Ed(e.documentation).length > 0 || e.documentation && typeof e.documentation == "object" && Ed(e.documentation.value).length > 0); + return !!(t && typeof t.documentation == "string" && za(t.documentation).length > 0 || t && typeof t.documentation == "object" && za(t.documentation).value.length > 0 || e.documentation && typeof e.documentation == "string" && za(e.documentation).length > 0 || e.documentation && typeof e.documentation == "object" && za(e.documentation.value).length > 0); } renderParameters(e, t, i) { - const [n, o] = this.getParameterLabelOffsets(t, i), r = document.createElement("span"); - r.textContent = t.label.substring(0, n); - const l = document.createElement("span"); - l.textContent = t.label.substring(n, o), l.className = "parameter active"; - const a = document.createElement("span"); - a.textContent = t.label.substring(o), Q(e, r, l, a); + const [n, o] = this.getParameterLabelOffsets(t, i), l = document.createElement("span"); + l.textContent = t.label.substring(0, n); + const r = document.createElement("span"); + r.textContent = t.label.substring(n, o), r.className = "parameter active"; + const c = document.createElement("span"); + c.textContent = t.label.substring(o), O(e, l, r, c); } getParameterLabelOffsets(e, t) { const i = e.parameters[t]; @@ -90016,7 +90016,7 @@ let BV = (qg = class extends R { if (Array.isArray(i.label)) return i.label; if (i.label.length) { - const n = new RegExp(`(\\W|^)${Po(i.label)}(?=\\W|$)`, "g"); + const n = new RegExp(`(\\W|^)${Uo(i.label)}(?=\\W|$)`, "g"); n.test(e.label); const o = n.lastIndex - i.label.length; return o >= 0 ? [o, n.lastIndex] : [0, 0]; @@ -90034,7 +90034,7 @@ let BV = (qg = class extends R { return this.domNodes || this.createParameterHintDOMNodes(), this.domNodes.element; } getId() { - return PV.ID; + return a5.ID; } updateMaxHeight() { if (!this.domNodes) @@ -90044,33 +90044,33 @@ let BV = (qg = class extends R { const i = this.domNodes.element.getElementsByClassName("phwrapper"); i.length && (i[0].style.maxHeight = t); } -}, PV = qg, qg.ID = "editor.widget.parameterHintsWidget", qg); -BV = PV = NLe([ - US(2, _e), - US(3, Bs), - US(4, ri), - US(5, Ls) -], BV); -N("editorHoverWidget.highlightForeground", Gp, p("editorHoverWidgetHighlightForeground", "Foreground color of the active item in the parameter hint.")); -var TLe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +}, a5 = nb, nb.ID = "editor.widget.parameterHintsWidget", nb); +h5 = a5 = GVe([ + rX(2, xe), + rX(3, Ps), + rX(4, ri), + rX(5, Ls) +], h5); +R("editorHoverWidget.highlightForeground", zp, p("editorHoverWidgetHighlightForeground", "Foreground color of the active item in the parameter hint.")); +var LVe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, MP = function(s, e) { +}, OK = function(s, e) { return function(t, i) { e(t, i, s); }; -}, OV, $g; -let Yb = ($g = class extends R { +}, u5, sb; +let BZ = (sb = class extends J { static get(e) { - return e.getContribution(OV.ID); + return e.getContribution(u5.ID); } constructor(e, t, i) { - super(), this.editor = e, this.model = this._register(new zV(e, i.signatureHelpProvider)), this._register(this.model.onChangedHints((n) => { + super(), this.editor = e, this.model = this._register(new d5(e, i.signatureHelpProvider)), this._register(this.model.onChangedHints((n) => { var o; n ? (this.widget.value.show(), this.widget.value.render(n)) : (o = this.widget.rawValue) == null || o.hide(); - })), this.widget = new Wl(() => this._register(t.createInstance(BV, this.editor, this.model))); + })), this.widget = new Yr(() => this._register(t.createInstance(h5, this.editor, this.model))); } cancel() { this.model.cancel(); @@ -90086,20 +90086,20 @@ let Yb = ($g = class extends R { trigger(e) { this.model.trigger(e, 0); } -}, OV = $g, $g.ID = "editor.controller.parameterHints", $g); -Yb = OV = TLe([ - MP(1, Se), - MP(2, ge) -], Yb); -class DLe extends he { +}, u5 = sb, sb.ID = "editor.controller.parameterHints", sb); +BZ = u5 = LVe([ + OK(1, Ge), + OK(2, me) +], BZ); +class IVe extends he { constructor() { super({ id: "editor.action.triggerParameterHints", label: p("parameterHints.trigger.label", "Trigger Parameter Hints"), alias: "Trigger Parameter Hints", - precondition: I.hasSignatureHelpProvider, + precondition: C.hasSignatureHelpProvider, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 3082, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -90107,27 +90107,27 @@ class DLe extends he { }); } run(e, t) { - const i = Yb.get(t); + const i = BZ.get(t); i == null || i.trigger({ - triggerKind: Za.Invoke + triggerKind: Nc.Invoke }); } } -gt( - Yb.ID, - Yb, +mt( + BZ.ID, + BZ, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */ ); -ee(DLe); -const Q5 = 175, j5 = zi.bindToContribution(Yb.get); -oe(new j5({ +ee(IVe); +const GE = 175, XE = Ai.bindToContribution(BZ.get); +oe(new XE({ id: "closeParameterHints", - precondition: vm.Visible, + precondition: vb.Visible, handler: (s) => s.cancel(), kbOpts: { - weight: Q5, - kbExpr: I.focus, + weight: GE, + kbExpr: C.focus, primary: 9, secondary: [ 1033 @@ -90135,13 +90135,13 @@ oe(new j5({ ] } })); -oe(new j5({ +oe(new XE({ id: "showPrevParameterHint", - precondition: H.and(vm.Visible, vm.MultipleSignatures), + precondition: P.and(vb.Visible, vb.MultipleSignatures), handler: (s) => s.previous(), kbOpts: { - weight: Q5, - kbExpr: I.focus, + weight: GE, + kbExpr: C.focus, primary: 16, secondary: [ 528 @@ -90154,13 +90154,13 @@ oe(new j5({ ] } } })); -oe(new j5({ +oe(new XE({ id: "showNextParameterHint", - precondition: H.and(vm.Visible, vm.MultipleSignatures), + precondition: P.and(vb.Visible, vb.MultipleSignatures), handler: (s) => s.next(), kbOpts: { - weight: Q5, - kbExpr: I.focus, + weight: GE, + kbExpr: C.focus, primary: 18, secondary: [ 530 @@ -90173,32 +90173,32 @@ oe(new j5({ ] } } })); -var VLe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var SVe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, kLe = function(s, e) { +}, xVe = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class GLe { +class CVe { constructor(e) { this.instantiationService = e; } init(...e) { } } -function RLe(s, e) { +function RVe(s, e) { return class extends e { constructor() { super(...arguments), this._autorun = void 0; } init(...i) { - this._autorun = ks((n, o) => { - const r = eo(s(), n); - o.add(this.instantiationService.createInstance(r, ...i)); + this._autorun = Js((n, o) => { + const l = io(s(), n); + o.add(this.instantiationService.createInstance(l, ...i)); }); } dispose() { @@ -90207,41 +90207,41 @@ function RLe(s, e) { } }; } -function ELe(s) { - return ZI() ? RLe(s, HV) : s(); +function NVe(s) { + return Fx() ? RVe(s, m5) : s(); } -let HV = class extends GLe { +let m5 = class extends CVe { constructor(e, t) { super(t), this.init(e); } }; -HV = VLe([ - kLe(1, Se) -], HV); -gt( - J1.ID, - ELe(() => J1), +m5 = SVe([ + xVe(1, Ge) +], m5); +mt( + oG.ID, + NVe(() => oG), 0 /* EditorContributionInstantiation.Eager */ ); -N("editor.placeholder.foreground", Goe, p("placeholderForeground", "Foreground color of the placeholder text in the editor.")); -const eN = $e("textResourceConfigurationService"), i7 = $e("textResourcePropertiesService"); -var XLe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +R("editor.placeholder.foreground", Cle, p("placeholderForeground", "Foreground color of the placeholder text in the editor.")); +const pC = $e("textResourceConfigurationService"), H7 = $e("textResourcePropertiesService"); +var wVe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, KS = function(s, e) { +}, cX = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const S0 = new ae("renameInputVisible", !1, p("renameInputVisible", "Whether the rename input widget is visible")); -new ae("renameInputFocused", !1, p("renameInputFocused", "Whether the rename input widget is focused")); -let JV = class { - constructor(e, t, i, n, o, r) { - this._editor = e, this._acceptKeybindings = t, this._themeService = i, this._keybindingService = n, this._logService = r, this.allowEditorOverflow = !0, this._disposables = new U(), this._visibleContextKey = S0.bindTo(o), this._isEditingRenameCandidate = !1, this._nRenameSuggestionsInvocations = 0, this._hadAutomaticRenameSuggestionsInvocation = !1, this._candidates = /* @__PURE__ */ new Set(), this._beforeFirstInputFieldEditSW = new on(), this._inputWithButton = new FLe(), this._disposables.add(this._inputWithButton), this._editor.addContentWidget(this), this._disposables.add(this._editor.onDidChangeConfiguration((l) => { - l.hasChanged( +const x0 = new ce("renameInputVisible", !1, p("renameInputVisible", "Whether the rename input widget is visible")); +new ce("renameInputFocused", !1, p("renameInputFocused", "Whether the rename input widget is focused")); +let b5 = class { + constructor(e, t, i, n, o, l) { + this._editor = e, this._acceptKeybindings = t, this._themeService = i, this._keybindingService = n, this._logService = l, this.allowEditorOverflow = !0, this._disposables = new _(), this._visibleContextKey = x0.bindTo(o), this._isEditingRenameCandidate = !1, this._nRenameSuggestionsInvocations = 0, this._hadAutomaticRenameSuggestionsInvocation = !1, this._candidates = /* @__PURE__ */ new Set(), this._beforeFirstInputFieldEditSW = new ln(), this._inputWithButton = new TVe(), this._disposables.add(this._inputWithButton), this._editor.addContentWidget(this), this._disposables.add(this._editor.onDidChangeConfiguration((r) => { + r.hasChanged( 50 /* EditorOption.fontInfo */ ) && this._updateFont(); @@ -90254,7 +90254,7 @@ let JV = class { return "__renameInputWidget"; } getDomNode() { - return this._domNode || (this._domNode = document.createElement("div"), this._domNode.className = "monaco-editor rename-box", this._domNode.appendChild(this._inputWithButton.domNode), this._renameCandidateListView = this._disposables.add(new q5(this._domNode, { + return this._domNode || (this._domNode = document.createElement("div"), this._domNode.className = "monaco-editor rename-box", this._domNode.appendChild(this._inputWithButton.domNode), this._renameCandidateListView = this._disposables.add(new VE(this._domNode, { fontInfo: this._editor.getOption( 50 /* EditorOption.fontInfo */ @@ -90273,10 +90273,10 @@ let JV = class { _updateStyles(e) { if (!this._domNode) return; - const t = e.getColor(s0), i = e.getColor(tU); - this._domNode.style.backgroundColor = String(e.getColor(Xo) ?? ""), this._domNode.style.boxShadow = t ? ` 0 0 8px 2px ${t}` : "", this._domNode.style.border = i ? `1px solid ${i}` : "", this._domNode.style.color = String(e.getColor(sU) ?? ""); - const n = e.getColor(oU); - this._inputWithButton.domNode.style.backgroundColor = String(e.getColor(ov) ?? ""), this._inputWithButton.input.style.backgroundColor = String(e.getColor(ov) ?? ""), this._inputWithButton.domNode.style.borderWidth = n ? "1px" : "0px", this._inputWithButton.domNode.style.borderStyle = n ? "solid" : "none", this._inputWithButton.domNode.style.borderColor = (n == null ? void 0 : n.toString()) ?? "none"; + const t = e.getColor(a0), i = e.getColor(J_); + this._domNode.style.backgroundColor = String(e.getColor(Fo) ?? ""), this._domNode.style.boxShadow = t ? ` 0 0 8px 2px ${t}` : "", this._domNode.style.border = i ? `1px solid ${i}` : "", this._domNode.style.color = String(e.getColor(D_) ?? ""); + const n = e.getColor(F_); + this._inputWithButton.domNode.style.backgroundColor = String(e.getColor(Sw) ?? ""), this._inputWithButton.input.style.backgroundColor = String(e.getColor(Sw) ?? ""), this._inputWithButton.domNode.style.borderWidth = n ? "1px" : "0px", this._inputWithButton.domNode.style.borderStyle = n ? "solid" : "none", this._inputWithButton.domNode.style.borderColor = (n == null ? void 0 : n.toString()) ?? "none"; } _updateFont() { if (this._domNode === void 0) @@ -90295,12 +90295,12 @@ let JV = class { if (!this._visible || !this._editor.hasModel() || // @ulugbekna: shouldn't happen !this._editor.getDomNode()) return null; - const e = Wh(this.getDomNode().ownerDocument.body), t = yi(this._editor.getDomNode()), i = this._getTopForPosition(); + const e = Yh(this.getDomNode().ownerDocument.body), t = yi(this._editor.getDomNode()), i = this._getTopForPosition(); this._nPxAvailableAbove = i + t.top, this._nPxAvailableBelow = e.height - this._nPxAvailableAbove; const n = this._editor.getOption( 67 /* EditorOption.lineHeight */ - ), { totalHeight: o } = U1.getLayoutInfo({ lineHeight: n }), r = this._nPxAvailableBelow > o * 6 ? [ + ), { totalHeight: o } = lG.getLayoutInfo({ lineHeight: n }), l = this._nPxAvailableBelow > o * 6 ? [ 2, 1 /* ContentWidgetPositionPreference.ABOVE */ @@ -90311,7 +90311,7 @@ let JV = class { ]; return { position: this._position, - preference: r + preference: l }; } beforeRender() { @@ -90328,11 +90328,11 @@ let JV = class { !this._editor.getDomNode()) return; ht(this._renameCandidateListView), ht(this._nPxAvailableAbove !== void 0), ht(this._nPxAvailableBelow !== void 0); - const t = Lc(this._inputWithButton.domNode), i = Lc(this._label); + const t = Sd(this._inputWithButton.domNode), i = Sd(this._label); let n; e === 2 ? n = this._nPxAvailableBelow : n = this._nPxAvailableAbove, this._renameCandidateListView.layout({ height: n - i - t, - width: $s(this._inputWithButton.domNode) + width: to(this._inputWithButton.domNode) }); } acceptInput(e) { @@ -90355,11 +90355,11 @@ let JV = class { * @param requestRenameCandidates is `undefined` when there are no rename suggestion providers */ getInput(e, t, i, n, o) { - const { start: r, end: l } = this._getSelection(e, t); + const { start: l, end: r } = this._getSelection(e, t); this._renameCts = o; - const a = new U(); - this._nRenameSuggestionsInvocations = 0, this._hadAutomaticRenameSuggestionsInvocation = !1, n === void 0 ? this._inputWithButton.button.style.display = "none" : (this._inputWithButton.button.style.display = "flex", this._requestRenameCandidatesOnce = n, this._requestRenameCandidates(t, !1), a.add(z(this._inputWithButton.button, "click", () => this._requestRenameCandidates(t, !0))), a.add(z(this._inputWithButton.button, ie.KEY_DOWN, (d) => { - const h = new Vt(d); + const c = new _(); + this._nRenameSuggestionsInvocations = 0, this._hadAutomaticRenameSuggestionsInvocation = !1, n === void 0 ? this._inputWithButton.button.style.display = "none" : (this._inputWithButton.button.style.display = "flex", this._requestRenameCandidatesOnce = n, this._requestRenameCandidates(t, !1), c.add(z(this._inputWithButton.button, "click", () => this._requestRenameCandidates(t, !0))), c.add(z(this._inputWithButton.button, ie.KEY_DOWN, (a) => { + const h = new Yt(a); (h.equals( 3 /* KeyCode.Enter */ @@ -90367,46 +90367,46 @@ let JV = class { 10 /* KeyCode.Space */ )) && (h.stopPropagation(), h.preventDefault(), this._requestRenameCandidates(t, !0)); - }))), this._isEditingRenameCandidate = !1, this._domNode.classList.toggle("preview", i), this._position = new V(e.startLineNumber, e.startColumn), this._currentName = t, this._inputWithButton.input.value = t, this._inputWithButton.input.setAttribute("selectionStart", r.toString()), this._inputWithButton.input.setAttribute("selectionEnd", l.toString()), this._inputWithButton.input.size = Math.max((e.endColumn - e.startColumn) * 1.1, 20), this._beforeFirstInputFieldEditSW.reset(), a.add(Ce(() => { + }))), this._isEditingRenameCandidate = !1, this._domNode.classList.toggle("preview", i), this._position = new Y(e.startLineNumber, e.startColumn), this._currentName = t, this._inputWithButton.input.value = t, this._inputWithButton.input.setAttribute("selectionStart", l.toString()), this._inputWithButton.input.setAttribute("selectionEnd", r.toString()), this._inputWithButton.input.size = Math.max((e.endColumn - e.startColumn) * 1.1, 20), this._beforeFirstInputFieldEditSW.reset(), c.add(We(() => { this._renameCts = void 0, o.dispose(!0); - })), a.add(Ce(() => { + })), c.add(We(() => { this._renameCandidateProvidersCts !== void 0 && (this._renameCandidateProvidersCts.dispose(!0), this._renameCandidateProvidersCts = void 0); - })), a.add(Ce(() => this._candidates.clear())); - const c = new dC(); - return c.p.finally(() => { - a.dispose(), this._hide(); - }), this._currentCancelInput = (d) => { + })), c.add(We(() => this._candidates.clear())); + const d = new VG(); + return d.p.finally(() => { + c.dispose(), this._hide(); + }), this._currentCancelInput = (a) => { var h; - return this._trace("invoking _currentCancelInput"), this._currentAcceptInput = void 0, this._currentCancelInput = void 0, (h = this._renameCandidateListView) == null || h.clearCandidates(), c.complete(d), !0; - }, this._currentAcceptInput = (d) => { + return this._trace("invoking _currentCancelInput"), this._currentAcceptInput = void 0, this._currentCancelInput = void 0, (h = this._renameCandidateListView) == null || h.clearCandidates(), d.complete(a), !0; + }, this._currentAcceptInput = (a) => { this._trace("invoking _currentAcceptInput"), ht(this._renameCandidateListView !== void 0); const h = this._renameCandidateListView.nCandidates; - let u, g; - const m = this._renameCandidateListView.focusedCandidate; - if (m !== void 0 ? (this._trace("using new name from renameSuggestion"), u = m, g = { k: "renameSuggestion" }) : (this._trace("using new name from inputField"), u = this._inputWithButton.input.value, g = this._isEditingRenameCandidate ? { k: "userEditedRenameSuggestion" } : { k: "inputField" }), u === t || u.trim().length === 0) { + let u, m; + const b = this._renameCandidateListView.focusedCandidate; + if (b !== void 0 ? (this._trace("using new name from renameSuggestion"), u = b, m = { k: "renameSuggestion" }) : (this._trace("using new name from inputField"), u = this._inputWithButton.input.value, m = this._isEditingRenameCandidate ? { k: "userEditedRenameSuggestion" } : { k: "inputField" }), u === t || u.trim().length === 0) { this.cancelInput(!0, "_currentAcceptInput (because newName === value || newName.trim().length === 0)"); return; } - this._currentAcceptInput = void 0, this._currentCancelInput = void 0, this._renameCandidateListView.clearCandidates(), c.complete({ + this._currentAcceptInput = void 0, this._currentCancelInput = void 0, this._renameCandidateListView.clearCandidates(), d.complete({ newName: u, - wantsPreview: i && d, + wantsPreview: i && a, stats: { - source: g, + source: m, nRenameSuggestions: h, timeBeforeFirstInputFieldEdit: this._timeBeforeFirstInputFieldEdit, nRenameSuggestionsInvocations: this._nRenameSuggestionsInvocations, hadAutomaticRenameSuggestionsInvocation: this._hadAutomaticRenameSuggestionsInvocation } }); - }, a.add(o.token.onCancellationRequested(() => this.cancelInput(!0, "cts.token.onCancellationRequested"))), a.add(this._editor.onDidBlurEditorWidget(() => { - var d; - return this.cancelInput(!((d = this._domNode) != null && d.ownerDocument.hasFocus()), "editor.onDidBlurEditorWidget"); - })), this._show(), c.p; + }, c.add(o.token.onCancellationRequested(() => this.cancelInput(!0, "cts.token.onCancellationRequested"))), c.add(this._editor.onDidBlurEditorWidget(() => { + var a; + return this.cancelInput(!((a = this._domNode) != null && a.ownerDocument.hasFocus()), "editor.onDidBlurEditorWidget"); + })), this._show(), d.p; } _requestRenameCandidates(e, t) { if (this._requestRenameCandidatesOnce !== void 0 && (this._renameCandidateProvidersCts !== void 0 && this._renameCandidateProvidersCts.dispose(!0), ht(this._renameCts), this._inputWithButton.buttonState !== "stop")) { - this._renameCandidateProvidersCts = new mi(); - const i = t ? e1.Invoke : e1.Automatic, n = this._requestRenameCandidatesOnce(i, this._renameCandidateProvidersCts.token); + this._renameCandidateProvidersCts = new pi(); + const i = t ? uW.Invoke : uW.Automatic, n = this._requestRenameCandidatesOnce(i, this._renameCandidateProvidersCts.token); if (n.length === 0) { this._inputWithButton.setSparkleButton(); return; @@ -90421,7 +90421,7 @@ let JV = class { ht(this._editor.hasModel()); const i = this._editor.getSelection(); let n = 0, o = t.length; - return !M.isEmpty(i) && !M.spansMultipleLines(i) && M.containsRange(e, i) && (n = Math.max(0, i.startColumn - e.startColumn), o = Math.min(e.endColumn, i.endColumn) - e.startColumn), { start: n, end: o }; + return !I.isEmpty(i) && !I.spansMultipleLines(i) && I.containsRange(e, i) && (n = Math.max(0, i.startColumn - e.startColumn), o = Math.min(e.endColumn, i.endColumn) - e.startColumn), { start: n, end: o }; } _show() { this._trace("invoking _show"), this._editor.revealLineInCenterIfOutsideViewport( @@ -90433,23 +90433,23 @@ let JV = class { }, 100); } async _updateRenameCandidates(e, t, i) { - const n = (...c) => this._trace("_updateRenameCandidates", ...c); + const n = (...d) => this._trace("_updateRenameCandidates", ...d); n("start"); - const o = await cC(Promise.allSettled(e), i); + const o = await XG(Promise.allSettled(e), i); if (this._inputWithButton.setSparkleButton(), o === void 0) { n("returning early - received updateRenameCandidates results - undefined"); return; } - const r = o.flatMap((c) => c.status === "fulfilled" && xa(c.value) ? c.value : []); - n(`received updateRenameCandidates results - total (unfiltered) ${r.length} candidates.`); - const l = Oc(r, (c) => c.newSymbolName); - n(`distinct candidates - ${l.length} candidates.`); - const a = l.filter(({ newSymbolName: c }) => c.trim().length > 0 && c !== this._inputWithButton.input.value && c !== t && !this._candidates.has(c)); - if (n(`valid distinct candidates - ${r.length} candidates.`), a.forEach((c) => this._candidates.add(c.newSymbolName)), a.length < 1) { + const l = o.flatMap((d) => d.status === "fulfilled" && Cc(d.value) ? d.value : []); + n(`received updateRenameCandidates results - total (unfiltered) ${l.length} candidates.`); + const r = Qd(l, (d) => d.newSymbolName); + n(`distinct candidates - ${r.length} candidates.`); + const c = r.filter(({ newSymbolName: d }) => d.trim().length > 0 && d !== this._inputWithButton.input.value && d !== t && !this._candidates.has(d)); + if (n(`valid distinct candidates - ${l.length} candidates.`), c.forEach((d) => this._candidates.add(d.newSymbolName)), c.length < 1) { n("returning early - no valid distinct candidates"); return; } - n("setting candidates"), this._renameCandidateListView.setCandidates(a), n("asking editor to re-layout"), this._editor.layoutContentWidget(this); + n("setting candidates"), this._renameCandidateListView.setCandidates(c), n("asking editor to re-layout"), this._editor.layoutContentWidget(this); } _hide() { this._trace("invoked _hide"), this._visible = !1, this._visibleContextKey.reset(), this._editor.layoutContentWidget(this); @@ -90463,24 +90463,24 @@ let JV = class { this._logService.trace("RenameWidget", ...e); } }; -JV = XLe([ - KS(2, Pi), - KS(3, xt), - KS(4, _e), - KS(5, Xn) -], JV); -class q5 { +b5 = wVe([ + cX(2, Ki), + cX(3, Lt), + cX(4, xe), + cX(5, Fn) +], b5); +class VE { // FIXME@ulugbekna: rewrite using event emitters constructor(e, t) { - this._disposables = new U(), this._availableHeight = 0, this._minimumWidth = 0, this._lineHeight = t.fontInfo.lineHeight, this._typicalHalfwidthCharacterWidth = t.fontInfo.typicalHalfwidthCharacterWidth, this._listContainer = document.createElement("div"), this._listContainer.className = "rename-box rename-candidate-list-container", e.appendChild(this._listContainer), this._listWidget = q5._createListWidget(this._listContainer, this._candidateViewHeight, t.fontInfo), this._listWidget.onDidChangeFocus((i) => { + this._disposables = new _(), this._availableHeight = 0, this._minimumWidth = 0, this._lineHeight = t.fontInfo.lineHeight, this._typicalHalfwidthCharacterWidth = t.fontInfo.typicalHalfwidthCharacterWidth, this._listContainer = document.createElement("div"), this._listContainer.className = "rename-box rename-candidate-list-container", e.appendChild(this._listContainer), this._listWidget = VE._createListWidget(this._listContainer, this._candidateViewHeight, t.fontInfo), this._listWidget.onDidChangeFocus((i) => { i.elements.length === 1 && t.onFocusChange(i.elements[0].newSymbolName); }, this._disposables), this._listWidget.onDidChangeSelection((i) => { i.elements.length === 1 && t.onSelectionChange(); }, this._disposables), this._disposables.add(this._listWidget.onDidBlur((i) => { this._listWidget.setFocus([]); - })), this._listWidget.style(zm({ - listInactiveFocusForeground: Jw, - listInactiveFocusBackground: Uw + })), this._listWidget.style(Bb({ + listInactiveFocusForeground: oW, + listInactiveFocusBackground: lW })); } dispose() { @@ -90493,7 +90493,7 @@ class q5 { setCandidates(e) { this._listWidget.splice(0, 0, e); const t = this._pickListHeight(this._listWidget.length), i = this._pickListWidth(e); - this._listWidget.layout(t, i), this._listContainer.style.height = `${t}px`, this._listContainer.style.width = `${i}px`, Bc(p("renameSuggestionsReceivedAria", "Received {0} rename suggestions", e.length)); + this._listWidget.layout(t, i), this._listContainer.style.height = `${t}px`, this._listContainer.style.width = `${i}px`, _d(p("renameSuggestionsReceivedAria", "Received {0} rename suggestions", e.length)); } clearCandidates() { this._listContainer.style.height = "0px", this._listContainer.style.width = "0px", this._listWidget.splice(0, this._listWidget.length, []); @@ -90550,7 +90550,7 @@ class q5 { this._listWidget.setFocus([]); } get _candidateViewHeight() { - const { totalHeight: e } = U1.getLayoutInfo({ lineHeight: this._lineHeight }); + const { totalHeight: e } = lG.getLayoutInfo({ lineHeight: this._lineHeight }); return e; } _pickListHeight(e) { @@ -90568,27 +90568,27 @@ class q5 { } static _createListWidget(e, t, i) { const n = new class { - getTemplateId(r) { + getTemplateId(l) { return "candidate"; } - getHeight(r) { + getHeight(l) { return t; } }(), o = new class { constructor() { this.templateId = "candidate"; } - renderTemplate(r) { - return new U1(r, i); + renderTemplate(l) { + return new lG(l, i); } - renderElement(r, l, a) { - a.populate(r); + renderElement(l, r, c) { + c.populate(l); } - disposeTemplate(r) { - r.dispose(); + disposeTemplate(l) { + l.dispose(); } }(); - return new Qo("NewSymbolNameCandidates", e, n, [o], { + return new qo("NewSymbolNameCandidates", e, n, [o], { keyboardSupport: !1, // @ulugbekna: because we handle keyboard events through proper commands & keybinding service, see `rename.ts` mouseSupport: !0, @@ -90596,13 +90596,13 @@ class q5 { }); } } -class FLe { +class TVe { constructor() { - this._onDidInputChange = new k(), this.onDidInputChange = this._onDidInputChange.event, this._disposables = new U(); + this._onDidInputChange = new k(), this.onDidInputChange = this._onDidInputChange.event, this._disposables = new _(); } get domNode() { - return this._domNode || (this._domNode = document.createElement("div"), this._domNode.className = "rename-input-with-button", this._domNode.style.display = "flex", this._domNode.style.flexDirection = "row", this._domNode.style.alignItems = "center", this._inputNode = document.createElement("input"), this._inputNode.className = "rename-input", this._inputNode.type = "text", this._inputNode.style.border = "none", this._inputNode.setAttribute("aria-label", p("renameAriaLabel", "Rename input. Type new name and press Enter to commit.")), this._domNode.appendChild(this._inputNode), this._buttonNode = document.createElement("div"), this._buttonNode.className = "rename-suggestions-button", this._buttonNode.setAttribute("tabindex", "0"), this._buttonGenHoverText = p("generateRenameSuggestionsButton", "Generate new name suggestions"), this._buttonCancelHoverText = p("cancelRenameSuggestionsButton", "Cancel"), this._buttonHover = Fl().setupManagedHover(As("element"), this._buttonNode, this._buttonGenHoverText), this._disposables.add(this._buttonHover), this._domNode.appendChild(this._buttonNode), this._disposables.add(z(this.input, ie.INPUT, () => this._onDidInputChange.fire())), this._disposables.add(z(this.input, ie.KEY_DOWN, (e) => { - const t = new Vt(e); + return this._domNode || (this._domNode = document.createElement("div"), this._domNode.className = "rename-input-with-button", this._domNode.style.display = "flex", this._domNode.style.flexDirection = "row", this._domNode.style.alignItems = "center", this._inputNode = document.createElement("input"), this._inputNode.className = "rename-input", this._inputNode.type = "text", this._inputNode.style.border = "none", this._inputNode.setAttribute("aria-label", p("renameAriaLabel", "Rename input. Type new name and press Enter to commit.")), this._domNode.appendChild(this._inputNode), this._buttonNode = document.createElement("div"), this._buttonNode.className = "rename-suggestions-button", this._buttonNode.setAttribute("tabindex", "0"), this._buttonGenHoverText = p("generateRenameSuggestionsButton", "Generate new name suggestions"), this._buttonCancelHoverText = p("cancelRenameSuggestionsButton", "Cancel"), this._buttonHover = Kr().setupManagedHover(Is("element"), this._buttonNode, this._buttonGenHoverText), this._disposables.add(this._buttonHover), this._domNode.appendChild(this._buttonNode), this._disposables.add(z(this.input, ie.INPUT, () => this._onDidInputChange.fire())), this._disposables.add(z(this.input, ie.KEY_DOWN, (e) => { + const t = new Yt(e); (t.keyCode === 15 || t.keyCode === 17) && this._onDidInputChange.fire(); })), this._disposables.add(z(this.input, ie.CLICK, () => this._onDidInputChange.fire())), this._disposables.add(z(this.input, ie.FOCUS, () => { this.domNode.style.outlineWidth = "1px", this.domNode.style.outlineStyle = "solid", this.domNode.style.outlineOffset = "-1px", this.domNode.style.outlineColor = "var(--vscode-focusBorder)"; @@ -90621,52 +90621,52 @@ class FLe { } setSparkleButton() { var e; - this._buttonState = "sparkle", this._sparkleIcon ?? (this._sparkleIcon = ym(te.sparkle)), gn(this.button), this.button.appendChild(this._sparkleIcon), this.button.setAttribute("aria-label", "Generating new name suggestions"), (e = this._buttonHover) == null || e.update(this._buttonGenHoverText), this.input.focus(); + this._buttonState = "sparkle", this._sparkleIcon ?? (this._sparkleIcon = Vb(te.sparkle)), bn(this.button), this.button.appendChild(this._sparkleIcon), this.button.setAttribute("aria-label", "Generating new name suggestions"), (e = this._buttonHover) == null || e.update(this._buttonGenHoverText), this.input.focus(); } setStopButton() { var e; - this._buttonState = "stop", this._stopIcon ?? (this._stopIcon = ym(te.primitiveSquare)), gn(this.button), this.button.appendChild(this._stopIcon), this.button.setAttribute("aria-label", "Cancel generating new name suggestions"), (e = this._buttonHover) == null || e.update(this._buttonCancelHoverText), this.input.focus(); + this._buttonState = "stop", this._stopIcon ?? (this._stopIcon = Vb(te.primitiveSquare)), bn(this.button), this.button.appendChild(this._stopIcon), this.button.setAttribute("aria-label", "Cancel generating new name suggestions"), (e = this._buttonHover) == null || e.update(this._buttonCancelHoverText), this.input.focus(); } dispose() { this._disposables.dispose(); } } -const xw = class xw { +const vy = class vy { constructor(e, t) { - this._domNode = document.createElement("div"), this._domNode.className = "rename-box rename-candidate", this._domNode.style.display = "flex", this._domNode.style.columnGap = "5px", this._domNode.style.alignItems = "center", this._domNode.style.height = `${t.lineHeight}px`, this._domNode.style.padding = `${xw._PADDING}px`; + this._domNode = document.createElement("div"), this._domNode.className = "rename-box rename-candidate", this._domNode.style.display = "flex", this._domNode.style.columnGap = "5px", this._domNode.style.alignItems = "center", this._domNode.style.height = `${t.lineHeight}px`, this._domNode.style.padding = `${vy._PADDING}px`; const i = document.createElement("div"); - i.style.display = "flex", i.style.alignItems = "center", i.style.width = i.style.height = `${t.lineHeight * 0.8}px`, this._domNode.appendChild(i), this._icon = ym(te.sparkle), this._icon.style.display = "none", i.appendChild(this._icon), this._label = document.createElement("div"), mn(this._label, t), this._domNode.appendChild(this._label), e.appendChild(this._domNode); + i.style.display = "flex", i.style.alignItems = "center", i.style.width = i.style.height = `${t.lineHeight * 0.8}px`, this._domNode.appendChild(i), this._icon = Vb(te.sparkle), this._icon.style.display = "none", i.appendChild(this._icon), this._label = document.createElement("div"), pn(this._label, t), this._domNode.appendChild(this._label), e.appendChild(this._domNode); } populate(e) { this._updateIcon(e), this._updateLabel(e); } _updateIcon(e) { var i; - const t = !!((i = e.tags) != null && i.includes(pv.AIGenerated)); + const t = !!((i = e.tags) != null && i.includes(vw.AIGenerated)); this._icon.style.display = t ? "inherit" : "none"; } _updateLabel(e) { this._label.innerText = e.newSymbolName; } static getLayoutInfo({ lineHeight: e }) { - return { totalHeight: e + xw._PADDING * 2 }; + return { totalHeight: e + vy._PADDING * 2 }; } dispose() { } }; -xw._PADDING = 2; -let U1 = xw; -var YLe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +vy._PADDING = 2; +let lG = vy; +var MVe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, yd = function(s, e) { +}, Xa = function(s, e) { return function(t, i) { e(t, i, s); }; -}, UV; -class $5 { +}, p5; +class LE { constructor(e, t, i) { this.model = e, this.position = t, this._providerRenameIdx = 0, this._providers = i.ordered(e); } @@ -90691,12 +90691,12 @@ class $5 { this._providerRenameIdx = 0; const i = this.model.getWordAtPosition(this.position); return i ? { - range: new M(this.position.lineNumber, i.startColumn, this.position.lineNumber, i.endColumn), + range: new I(this.position.lineNumber, i.startColumn, this.position.lineNumber, i.endColumn), text: i.word, rejectReason: t.length > 0 ? t.join(` `) : void 0 } : { - range: M.fromPositions(this.position), + range: I.fromPositions(this.position), text: "", rejectReason: t.length > 0 ? t.join(` `) : void 0 @@ -90713,49 +90713,49 @@ class $5 { rejectReason: i.join(` `) }; - const r = await o.provideRenameEdits(this.model, this.position, e, n); - if (r) { - if (r.rejectReason) - return this._provideRenameEdits(e, t + 1, i.concat(r.rejectReason), n); + const l = await o.provideRenameEdits(this.model, this.position, e, n); + if (l) { + if (l.rejectReason) + return this._provideRenameEdits(e, t + 1, i.concat(l.rejectReason), n); } else return this._provideRenameEdits(e, t + 1, i.concat(p("no result", "No result.")), n); - return r; + return l; } } -async function zLe(s, e, t, i) { - const n = new $5(e, t, s), o = await n.resolveRenameLocation(Ye.None); - return o != null && o.rejectReason ? { edits: [], rejectReason: o.rejectReason } : n.provideRenameEdits(i, Ye.None); +async function YVe(s, e, t, i) { + const n = new LE(e, t, s), o = await n.resolveRenameLocation(Fe.None); + return o != null && o.rejectReason ? { edits: [], rejectReason: o.rejectReason } : n.provideRenameEdits(i, Fe.None); } -var em; -let Oh = (em = class { +var ob; +let Qh = (ob = class { static get(e) { - return e.getContribution(UV.ID); + return e.getContribution(p5.ID); } - constructor(e, t, i, n, o, r, l, a, c) { - this.editor = e, this._instaService = t, this._notificationService = i, this._bulkEditService = n, this._progressService = o, this._logService = r, this._configService = l, this._languageFeaturesService = a, this._telemetryService = c, this._disposableStore = new U(), this._cts = new mi(), this._renameWidget = this._disposableStore.add(this._instaService.createInstance(JV, this.editor, ["acceptRenameInput", "acceptRenameInputWithPreview"])); + constructor(e, t, i, n, o, l, r, c, d) { + this.editor = e, this._instaService = t, this._notificationService = i, this._bulkEditService = n, this._progressService = o, this._logService = l, this._configService = r, this._languageFeaturesService = c, this._telemetryService = d, this._disposableStore = new _(), this._cts = new pi(), this._renameWidget = this._disposableStore.add(this._instaService.createInstance(b5, this.editor, ["acceptRenameInput", "acceptRenameInputWithPreview"])); } dispose() { this._disposableStore.dispose(), this._cts.dispose(!0); } async run() { - var m, f; + var b, g; const e = this._logService.trace.bind(this._logService, "[rename]"); - if (this._cts.dispose(!0), this._cts = new mi(), !this.editor.hasModel()) { + if (this._cts.dispose(!0), this._cts = new pi(), !this.editor.hasModel()) { e("editor has no model"); return; } - const t = this.editor.getPosition(), i = new $5(this.editor.getModel(), t, this._languageFeaturesService.renameProvider); + const t = this.editor.getPosition(), i = new LE(this.editor.getModel(), t, this._languageFeaturesService.renameProvider); if (!i.hasProvider()) { e("skeleton has no provider"); return; } - const n = new Yh(this.editor, 5, void 0, this._cts.token); + const n = new Uh(this.editor, 5, void 0, this._cts.token); let o; try { e("resolving rename location"); - const b = i.resolveRenameLocation(n.token); - this._progressService.showWhile(b, 250), o = await b, e("resolved rename location"); - } catch (b) { - b instanceof Pr ? e("resolve rename location cancelled", JSON.stringify(b, null, " ")) : (e("resolve rename location failed", b instanceof Error ? b : JSON.stringify(b, null, " ")), (typeof b == "string" || Nl(b)) && ((m = ho.get(this.editor)) == null || m.showMessage(b || p("resolveRenameLocationFailed", "An unknown error occurred while resolving rename location"), t))); + const Z = i.resolveRenameLocation(n.token); + this._progressService.showWhile(Z, 250), o = await Z, e("resolved rename location"); + } catch (Z) { + Z instanceof Pl ? e("resolve rename location cancelled", JSON.stringify(Z, null, " ")) : (e("resolve rename location failed", Z instanceof Error ? Z : JSON.stringify(Z, null, " ")), (typeof Z == "string" || Mr(Z)) && ((b = mo.get(this.editor)) == null || b.showMessage(Z || p("resolveRenameLocationFailed", "An unknown error occurred while resolving rename location"), t))); return; } finally { n.dispose(); @@ -90765,26 +90765,26 @@ let Oh = (em = class { return; } if (o.rejectReason) { - e(`returning early - rejected with reason: ${o.rejectReason}`, o.rejectReason), (f = ho.get(this.editor)) == null || f.showMessage(o.rejectReason, t); + e(`returning early - rejected with reason: ${o.rejectReason}`, o.rejectReason), (g = mo.get(this.editor)) == null || g.showMessage(o.rejectReason, t); return; } if (n.token.isCancellationRequested) { e("returning early - cts1 cancelled"); return; } - const r = new Yh(this.editor, 5, o.range, this._cts.token), l = this.editor.getModel(), a = this._languageFeaturesService.newSymbolNamesProvider.all(l), c = await Promise.all(a.map(async (b) => [b, await b.supportsAutomaticNewSymbolNamesTriggerKind ?? !1])), d = (b, y) => { - let w = c.slice(); - return b === e1.Automatic && (w = w.filter(([C, S]) => S)), w.map(([C]) => C.provideNewSymbolNames(l, o.range, b, y)); + const l = new Uh(this.editor, 5, o.range, this._cts.token), r = this.editor.getModel(), c = this._languageFeaturesService.newSymbolNamesProvider.all(r), d = await Promise.all(c.map(async (Z) => [Z, await Z.supportsAutomaticNewSymbolNamesTriggerKind ?? !1])), a = (Z, f) => { + let y = d.slice(); + return Z === uW.Automatic && (y = y.filter(([W, G]) => G)), y.map(([W]) => W.provideNewSymbolNames(r, o.range, Z, f)); }; e("creating rename input field and awaiting its result"); - const h = this._bulkEditService.hasPreviewHandler() && this._configService.getValue(this.editor.getModel().uri, "editor.rename.enablePreview"), u = await this._renameWidget.getInput(o.range, o.text, h, a.length > 0 ? d : void 0, r); - if (e("received response from rename input field"), a.length > 0 && this._reportTelemetry(a.length, l.getLanguageId(), u), typeof u == "boolean") { - e(`returning early - rename input field response - ${u}`), u && this.editor.focus(), r.dispose(); + const h = this._bulkEditService.hasPreviewHandler() && this._configService.getValue(this.editor.getModel().uri, "editor.rename.enablePreview"), u = await this._renameWidget.getInput(o.range, o.text, h, c.length > 0 ? a : void 0, l); + if (e("received response from rename input field"), c.length > 0 && this._reportTelemetry(c.length, r.getLanguageId(), u), typeof u == "boolean") { + e(`returning early - rename input field response - ${u}`), u && this.editor.focus(), l.dispose(); return; } this.editor.focus(), e("requesting rename edits"); - const g = cC(i.provideRenameEdits(u.newName, r.token), r.token).then(async (b) => { - if (!b) { + const m = XG(i.provideRenameEdits(u.newName, l.token), l.token).then(async (Z) => { + if (!Z) { e("returning early - no rename edits result"); return; } @@ -90792,28 +90792,28 @@ let Oh = (em = class { e("returning early - no model after rename edits are provided"); return; } - if (b.rejectReason) { - e(`returning early - rejected with reason: ${b.rejectReason}`), this._notificationService.info(b.rejectReason); + if (Z.rejectReason) { + e(`returning early - rejected with reason: ${Z.rejectReason}`), this._notificationService.info(Z.rejectReason); return; } - this.editor.setSelection(M.fromPositions(this.editor.getSelection().getPosition())), e("applying edits"), this._bulkEditService.apply(b, { + this.editor.setSelection(I.fromPositions(this.editor.getSelection().getPosition())), e("applying edits"), this._bulkEditService.apply(Z, { editor: this.editor, showPreview: u.wantsPreview, label: p("label", "Renaming '{0}' to '{1}'", o == null ? void 0 : o.text, u.newName), code: "undoredo.rename", quotableLabel: p("quotableLabel", "Renaming {0} to {1}", o == null ? void 0 : o.text, u.newName), respectAutoSaveConfig: !0 - }).then((y) => { - e("edits applied"), y.ariaSummary && bs(p("aria", "Successfully renamed '{0}' to '{1}'. Summary: {2}", o.text, u.newName, y.ariaSummary)); - }).catch((y) => { - e(`error when applying edits ${JSON.stringify(y, null, " ")}`), this._notificationService.error(p("rename.failedApply", "Rename failed to apply edits")), this._logService.error(y); + }).then((f) => { + e("edits applied"), f.ariaSummary && ys(p("aria", "Successfully renamed '{0}' to '{1}'. Summary: {2}", o.text, u.newName, f.ariaSummary)); + }).catch((f) => { + e(`error when applying edits ${JSON.stringify(f, null, " ")}`), this._notificationService.error(p("rename.failedApply", "Rename failed to apply edits")), this._logService.error(f); }); - }, (b) => { - e("error when providing rename edits", JSON.stringify(b, null, " ")), this._notificationService.error(p("rename.failed", "Rename failed to compute edits")), this._logService.error(b); + }, (Z) => { + e("error when providing rename edits", JSON.stringify(Z, null, " ")), this._notificationService.error(p("rename.failed", "Rename failed to compute edits")), this._logService.error(Z); }).finally(() => { - r.dispose(); + l.dispose(); }); - return e("returning rename operation"), this._progressService.showWhile(g, 250), g; + return e("returning rename operation"), this._progressService.showWhile(m, 250), m; } acceptRenameInput(e) { this._renameWidget.acceptInput(e); @@ -90845,26 +90845,26 @@ let Oh = (em = class { }; this._telemetryService.publicLog2("renameInvokedEvent", n); } -}, UV = em, em.ID = "editor.contrib.renameController", em); -Oh = UV = YLe([ - yd(1, Se), - yd(2, Vi), - yd(3, TC), - yd(4, qh), - yd(5, Xn), - yd(6, eN), - yd(7, ge), - yd(8, Ls) -], Oh); -class PLe extends he { +}, p5 = ob, ob.ID = "editor.contrib.renameController", ob); +Qh = p5 = MVe([ + Xa(1, Ge), + Xa(2, vi), + Xa(3, UG), + Xa(4, iu), + Xa(5, Fn), + Xa(6, pC), + Xa(7, me), + Xa(8, Ls) +], Qh); +class kVe extends he { constructor() { super({ id: "editor.action.rename", label: p("rename.label", "Rename Symbol"), alias: "Rename Symbol", - precondition: H.and(I.writable, I.hasRenameProvider), + precondition: P.and(C.writable, C.hasRenameProvider), kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 60, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -90876,53 +90876,53 @@ class PLe extends he { }); } runCommand(e, t) { - const i = e.get(ft), [n, o] = Array.isArray(t) && t || [void 0, void 0]; - return Le.isUri(n) && V.isIPosition(o) ? i.openCodeEditor({ resource: n }, i.getActiveCodeEditor()).then((r) => { - r && (r.setPosition(o), r.invokeWithinContext((l) => (this.reportTelemetry(l, r), this.run(l, r)))); - }, De) : super.runCommand(e, t); + const i = e.get(gt), [n, o] = Array.isArray(t) && t || [void 0, void 0]; + return Xe.isUri(n) && Y.isIPosition(o) ? i.openCodeEditor({ resource: n }, i.getActiveCodeEditor()).then((l) => { + l && (l.setPosition(o), l.invokeWithinContext((r) => (this.reportTelemetry(r, l), this.run(r, l)))); + }, Me) : super.runCommand(e, t); } run(e, t) { - const i = e.get(Xn), n = Oh.get(t); + const i = e.get(Fn), n = Qh.get(t); return n ? (i.trace("[RenameAction] got controller, running..."), n.run()) : (i.trace("[RenameAction] returning early - controller missing"), Promise.resolve()); } } -gt( - Oh.ID, - Oh, +mt( + Qh.ID, + Qh, 4 /* EditorContributionInstantiation.Lazy */ ); -ee(PLe); -const e9 = zi.bindToContribution(Oh.get); -oe(new e9({ +ee(kVe); +const IE = Ai.bindToContribution(Qh.get); +oe(new IE({ id: "acceptRenameInput", - precondition: S0, + precondition: x0, handler: (s) => s.acceptRenameInput(!1), kbOpts: { weight: 199, - kbExpr: H.and(I.focus, H.not("isComposing")), + kbExpr: P.and(C.focus, P.not("isComposing")), primary: 3 /* KeyCode.Enter */ } })); -oe(new e9({ +oe(new IE({ id: "acceptRenameInputWithPreview", - precondition: H.and(S0, H.has("config.editor.rename.enablePreview")), + precondition: P.and(x0, P.has("config.editor.rename.enablePreview")), handler: (s) => s.acceptRenameInput(!0), kbOpts: { weight: 199, - kbExpr: H.and(I.focus, H.not("isComposing")), + kbExpr: P.and(C.focus, P.not("isComposing")), primary: 2051 /* KeyCode.Enter */ } })); -oe(new e9({ +oe(new IE({ id: "cancelRenameInput", - precondition: S0, + precondition: x0, handler: (s) => s.cancelRenameInput(), kbOpts: { weight: 199, - kbExpr: I.focus, + kbExpr: C.focus, primary: 9, secondary: [ 1033 @@ -90930,14 +90930,14 @@ oe(new e9({ ] } })); -kt(class extends Ss { +kt(class extends Vs { constructor() { super({ id: "focusNextRenameSuggestion", title: { - ...Ie("focusNextRenameSuggestion", "Focus Next Rename Suggestion") + ...Ce("focusNextRenameSuggestion", "Focus Next Rename Suggestion") }, - precondition: S0, + precondition: x0, keybinding: [ { primary: 18, @@ -90947,21 +90947,21 @@ kt(class extends Ss { }); } run(e) { - const t = e.get(ft).getFocusedCodeEditor(); + const t = e.get(gt).getFocusedCodeEditor(); if (!t) return; - const i = Oh.get(t); + const i = Qh.get(t); i && i.focusNextRenameSuggestion(); } }); -kt(class extends Ss { +kt(class extends Vs { constructor() { super({ id: "focusPreviousRenameSuggestion", title: { - ...Ie("focusPreviousRenameSuggestion", "Focus Previous Rename Suggestion") + ...Ce("focusPreviousRenameSuggestion", "Focus Previous Rename Suggestion") }, - precondition: S0, + precondition: x0, keybinding: [ { primary: 16, @@ -90971,26 +90971,26 @@ kt(class extends Ss { }); } run(e) { - const t = e.get(ft).getFocusedCodeEditor(); + const t = e.get(gt).getFocusedCodeEditor(); if (!t) return; - const i = Oh.get(t); + const i = Qh.get(t); i && i.focusPreviousRenameSuggestion(); } }); -zs("_executeDocumentRenameProvider", function(s, e, t, ...i) { +Ks("_executeDocumentRenameProvider", function(s, e, t, ...i) { const [n] = i; ht(typeof n == "string"); - const { renameProvider: o } = s.get(ge); - return zLe(o, e, t, n); + const { renameProvider: o } = s.get(me); + return YVe(o, e, t, n); }); -zs("_executePrepareRename", async function(s, e, t) { - const { renameProvider: i } = s.get(ge), o = await new $5(e, t, i).resolveRenameLocation(Ye.None); +Ks("_executePrepareRename", async function(s, e, t) { + const { renameProvider: i } = s.get(me), o = await new LE(e, t, i).resolveRenameLocation(Fe.None); if (o != null && o.rejectReason) throw new Error(o.rejectReason); return o; }); -Di.as($r.Configuration).registerConfiguration({ +ki.as(ir.Configuration).registerConfiguration({ id: "editor", properties: { "editor.rename.enablePreview": { @@ -91001,17 +91001,17 @@ Di.as($r.Configuration).registerConfiguration({ } } }); -var BLe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var vVe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, ZP = function(s, e) { +}, jK = function(s, e) { return function(t, i) { e(t, i, s); }; -}, eb; -let bM = (eb = class extends R { +}, lZ; +let TI = (lZ = class extends J { constructor(e, t, i) { super(), this.editor = e, this.languageConfigurationService = t, this.editorWorkerService = i, this.decorations = this.editor.createDecorationsCollection(), this.options = this.createOptions(e.getOption( 73 @@ -91027,8 +91027,8 @@ let bM = (eb = class extends R { /* EditorOption.minimap */ )), this.stop(), this.computeSectionHeaders.schedule(0); })), this._register(t.onDidChange((n) => { - var r; - const o = (r = this.editor.getModel()) == null ? void 0 : r.getLanguageId(); + var l; + const o = (l = this.editor.getModel()) == null ? void 0 : l.getLanguageId(); o && n.affects(o) && (this.currentOccurrences = {}, this.options = this.createOptions(e.getOption( 73 /* EditorOption.minimap */ @@ -91045,7 +91045,7 @@ let bM = (eb = class extends R { this.computeSectionHeaders.schedule(); })), this._register(e.onDidChangeModelTokens((n) => { this.computeSectionHeaders.isScheduled() || this.computeSectionHeaders.schedule(1e3); - })), this.computeSectionHeaders = this._register(new Zt(() => { + })), this.computeSectionHeaders = this._register(new St(() => { this.findSectionHeaders(); }, 250)), this.computeSectionHeaders.schedule(0); } @@ -91080,16 +91080,16 @@ let bM = (eb = class extends R { t && (e = e.filter((o) => { if (!o.shouldBeInComments) return !0; - const r = t.validateRange(o.range), l = t.tokenization.getLineTokens(r.startLineNumber), a = l.findTokenIndexAtOffset(r.startColumn - 1), c = l.getStandardTokenType(a); - return l.getLanguageId(a) === t.getLanguageId() && c === 1; + const l = t.validateRange(o.range), r = t.tokenization.getLineTokens(l.startLineNumber), c = r.findTokenIndexAtOffset(l.startColumn - 1), d = r.getStandardTokenType(c); + return r.getLanguageId(c) === t.getLanguageId() && d === 1; })); - const i = Object.values(this.currentOccurrences).map((o) => o.decorationId), n = e.map((o) => OLe(o)); + const i = Object.values(this.currentOccurrences).map((o) => o.decorationId), n = e.map((o) => JVe(o)); this.editor.changeDecorations((o) => { - const r = o.deltaDecorations(i, n); + const l = o.deltaDecorations(i, n); this.currentOccurrences = {}; - for (let l = 0, a = r.length; l < a; l++) { - const c = { sectionHeader: e[l], decorationId: r[l] }; - this.currentOccurrences[c.decorationId] = c; + for (let r = 0, c = l.length; r < c; r++) { + const d = { sectionHeader: e[r], decorationId: l[r] }; + this.currentOccurrences[d.decorationId] = d; } }); } @@ -91099,15 +91099,15 @@ let bM = (eb = class extends R { dispose() { super.dispose(), this.stop(), this.decorations.clear(); } -}, eb.ID = "editor.sectionHeaderDetector", eb); -bM = BLe([ - ZP(1, li), - ZP(2, Ps) -], bM); -function OLe(s) { +}, lZ.ID = "editor.sectionHeaderDetector", lZ); +TI = vVe([ + jK(1, ci), + jK(2, Us) +], TI); +function JVe(s) { return { range: s.range, - options: Re.createDynamic({ + options: Je.createDynamic({ description: "section-header", stickiness: 3, collapseOnReplaceEdit: !0, @@ -91120,15 +91120,15 @@ function OLe(s) { }) }; } -gt( - bM.ID, - bM, +mt( + TI.ID, + TI, 1 /* EditorContributionInstantiation.AfterFirstRender */ ); -class ew { +class hy { static create(e, t) { - return new ew(e, new yM(t)); + return new hy(e, new MI(t)); } /** * (Inclusive) start line number for these tokens. @@ -91159,18 +91159,18 @@ class ew { } getRange() { const e = this._tokens.getRange(); - return e && new M(this._startLineNumber + e.startLineNumber, e.startColumn, this._startLineNumber + e.endLineNumber, e.endColumn); + return e && new I(this._startLineNumber + e.startLineNumber, e.startColumn, this._startLineNumber + e.endLineNumber, e.endColumn); } removeTokens(e) { const t = e.startLineNumber - this._startLineNumber, i = e.endLineNumber - this._startLineNumber; this._startLineNumber += this._tokens.removeTokens(t, e.startColumn - 1, i, e.endColumn - 1), this._updateEndLineNumber(); } split(e) { - const t = e.startLineNumber - this._startLineNumber, i = e.endLineNumber - this._startLineNumber, [n, o, r] = this._tokens.split(t, e.startColumn - 1, i, e.endColumn - 1); - return [new ew(this._startLineNumber, n), new ew(this._startLineNumber + r, o)]; + const t = e.startLineNumber - this._startLineNumber, i = e.endLineNumber - this._startLineNumber, [n, o, l] = this._tokens.split(t, e.startColumn - 1, i, e.endColumn - 1); + return [new hy(this._startLineNumber, n), new hy(this._startLineNumber + l, o)]; } applyEdit(e, t) { - const [i, n, o] = kh(t); + const [i, n, o] = Eh(t); this.acceptEdit( e, i, @@ -91181,7 +91181,7 @@ class ew { ); } acceptEdit(e, t, i, n, o) { - this._acceptDeleteRange(e), this._acceptInsertText(new V(e.startLineNumber, e.startColumn), t, i, n, o), this._updateEndLineNumber(); + this._acceptDeleteRange(e), this._acceptInsertText(new Y(e.startLineNumber, e.startColumn), t, i, n, o), this._updateEndLineNumber(); } _acceptDeleteRange(e) { if (e.startLineNumber === e.endLineNumber && e.startColumn === e.endColumn) @@ -91208,16 +91208,16 @@ class ew { _acceptInsertText(e, t, i, n, o) { if (t === 0 && i === 0) return; - const r = e.lineNumber - this._startLineNumber; - if (r < 0) { + const l = e.lineNumber - this._startLineNumber; + if (l < 0) { this._startLineNumber += t; return; } - const l = this._tokens.getMaxDeltaLine(); - r >= l + 1 || this._tokens.acceptInsertText(r, e.column - 1, t, i, n, o); + const r = this._tokens.getMaxDeltaLine(); + l >= r + 1 || this._tokens.acceptInsertText(l, e.column - 1, t, i, n, o); } } -class yM { +class MI { constructor(e) { this._tokens = e, this._tokenCount = e.length / 4; } @@ -91236,7 +91236,7 @@ class yM { if (e === 0) return null; const t = this._getStartCharacter(0), i = this._getDeltaLine(e - 1), n = this._getEndCharacter(e - 1); - return new M(0, t + 1, i, n + 1); + return new I(0, t + 1, i, n + 1); } _getTokenCount() { return this._tokenCount; @@ -91262,124 +91262,124 @@ class yM { else if (o > e) i = n - 1; else { - let r = n; - for (; r > t && this._getDeltaLine(r - 1) === e; ) - r--; let l = n; - for (; l < i && this._getDeltaLine(l + 1) === e; ) - l++; - return new _P(this._tokens.subarray(4 * r, 4 * l + 4)); + for (; l > t && this._getDeltaLine(l - 1) === e; ) + l--; + let r = n; + for (; r < i && this._getDeltaLine(r + 1) === e; ) + r++; + return new qK(this._tokens.subarray(4 * l, 4 * r + 4)); } } - return this._getDeltaLine(t) === e ? new _P(this._tokens.subarray(4 * t, 4 * t + 4)) : null; + return this._getDeltaLine(t) === e ? new qK(this._tokens.subarray(4 * t, 4 * t + 4)) : null; } clear() { this._tokenCount = 0; } removeTokens(e, t, i, n) { - const o = this._tokens, r = this._tokenCount; - let l = 0, a = !1, c = 0; - for (let d = 0; d < r; d++) { - const h = 4 * d, u = o[h], g = o[h + 1], m = o[h + 2], f = o[h + 3]; - if ((u > e || u === e && m >= t) && (u < i || u === i && g <= n)) - a = !0; + const o = this._tokens, l = this._tokenCount; + let r = 0, c = !1, d = 0; + for (let a = 0; a < l; a++) { + const h = 4 * a, u = o[h], m = o[h + 1], b = o[h + 2], g = o[h + 3]; + if ((u > e || u === e && b >= t) && (u < i || u === i && m <= n)) + c = !0; else { - if (l === 0 && (c = u), a) { - const b = 4 * l; - o[b] = u - c, o[b + 1] = g, o[b + 2] = m, o[b + 3] = f; + if (r === 0 && (d = u), c) { + const Z = 4 * r; + o[Z] = u - d, o[Z + 1] = m, o[Z + 2] = b, o[Z + 3] = g; } - l++; + r++; } } - return this._tokenCount = l, c; + return this._tokenCount = r, d; } split(e, t, i, n) { - const o = this._tokens, r = this._tokenCount, l = [], a = []; - let c = l, d = 0, h = 0; - for (let u = 0; u < r; u++) { - const g = 4 * u, m = o[g], f = o[g + 1], b = o[g + 2], y = o[g + 3]; - if (m > e || m === e && b >= t) { - if (m < i || m === i && f <= n) + const o = this._tokens, l = this._tokenCount, r = [], c = []; + let d = r, a = 0, h = 0; + for (let u = 0; u < l; u++) { + const m = 4 * u, b = o[m], g = o[m + 1], Z = o[m + 2], f = o[m + 3]; + if (b > e || b === e && Z >= t) { + if (b < i || b === i && g <= n) continue; - c !== a && (c = a, d = 0, h = m); + d !== c && (d = c, a = 0, h = b); } - c[d++] = m - h, c[d++] = f, c[d++] = b, c[d++] = y; + d[a++] = b - h, d[a++] = g, d[a++] = Z, d[a++] = f; } - return [new yM(new Uint32Array(l)), new yM(new Uint32Array(a)), h]; + return [new MI(new Uint32Array(r)), new MI(new Uint32Array(c)), h]; } acceptDeleteRange(e, t, i, n, o) { - const r = this._tokens, l = this._tokenCount, a = n - t; - let c = 0, d = !1; - for (let h = 0; h < l; h++) { + const l = this._tokens, r = this._tokenCount, c = n - t; + let d = 0, a = !1; + for (let h = 0; h < r; h++) { const u = 4 * h; - let g = r[u], m = r[u + 1], f = r[u + 2]; - const b = r[u + 3]; - if (g < t || g === t && f <= i) { - c++; + let m = l[u], b = l[u + 1], g = l[u + 2]; + const Z = l[u + 3]; + if (m < t || m === t && g <= i) { + d++; continue; - } else if (g === t && m < i) - g === n && f > o ? f -= o - i : f = i; - else if (g === t && m === i) - if (g === n && f > o) - f -= o - i; + } else if (m === t && b < i) + m === n && g > o ? g -= o - i : g = i; + else if (m === t && b === i) + if (m === n && g > o) + g -= o - i; else { - d = !0; + a = !0; continue; } - else if (g < n || g === n && m < o) - if (g === n && f > o) - g = t, m = i, f = m + (f - o); + else if (m < n || m === n && b < o) + if (m === n && g > o) + m = t, b = i, g = b + (g - o); else { - d = !0; + a = !0; continue; } - else if (g > n) { - if (a === 0 && !d) { - c = l; + else if (m > n) { + if (c === 0 && !a) { + d = r; break; } - g -= a; - } else if (g === n && m >= o) - e && g === 0 && (m += e, f += e), g -= a, m -= o - i, f -= o - i; + m -= c; + } else if (m === n && b >= o) + e && m === 0 && (b += e, g += e), m -= c, b -= o - i, g -= o - i; else throw new Error("Not possible!"); - const y = 4 * c; - r[y] = g, r[y + 1] = m, r[y + 2] = f, r[y + 3] = b, c++; - } - this._tokenCount = c; - } - acceptInsertText(e, t, i, n, o, r) { - const l = i === 0 && n === 1 && (r >= 48 && r <= 57 || r >= 65 && r <= 90 || r >= 97 && r <= 122), a = this._tokens, c = this._tokenCount; - for (let d = 0; d < c; d++) { - const h = 4 * d; - let u = a[h], g = a[h + 1], m = a[h + 2]; - if (!(u < e || u === e && m < t)) { - if (u === e && m === t) - if (l) - m += 1; + const f = 4 * d; + l[f] = m, l[f + 1] = b, l[f + 2] = g, l[f + 3] = Z, d++; + } + this._tokenCount = d; + } + acceptInsertText(e, t, i, n, o, l) { + const r = i === 0 && n === 1 && (l >= 48 && l <= 57 || l >= 65 && l <= 90 || l >= 97 && l <= 122), c = this._tokens, d = this._tokenCount; + for (let a = 0; a < d; a++) { + const h = 4 * a; + let u = c[h], m = c[h + 1], b = c[h + 2]; + if (!(u < e || u === e && b < t)) { + if (u === e && b === t) + if (r) + b += 1; else continue; - else if (u === e && g < t && t < m) - i === 0 ? m += n : m = t; + else if (u === e && m < t && t < b) + i === 0 ? b += n : b = t; else { - if (u === e && g === t && l) + if (u === e && m === t && r) continue; if (u === e) if (u += i, i === 0) - g += n, m += n; + m += n, b += n; else { - const f = m - g; - g = o + (g - t), m = g + f; + const g = b - m; + m = o + (m - t), b = m + g; } else u += i; } - a[h] = u, a[h + 1] = g, a[h + 2] = m; + c[h] = u, c[h + 1] = m, c[h + 2] = b; } } } } -class _P { +class qK { constructor(e) { this._tokens = e; } @@ -91396,63 +91396,63 @@ class _P { return this._tokens[4 * e + 3]; } } -var HLe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var HVe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, KW = function(s, e) { +}, hN = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let KV = class { +let g5 = class { constructor(e, t, i, n) { - this._legend = e, this._themeService = t, this._languageService = i, this._logService = n, this._hasWarnedOverlappingTokens = !1, this._hasWarnedInvalidLengthTokens = !1, this._hasWarnedInvalidEditStart = !1, this._hashTable = new QV(); + this._legend = e, this._themeService = t, this._languageService = i, this._logService = n, this._hasWarnedOverlappingTokens = !1, this._hasWarnedInvalidLengthTokens = !1, this._hasWarnedInvalidEditStart = !1, this._hashTable = new Z5(); } getMetadata(e, t, i) { const n = this._languageService.languageIdCodec.encodeLanguageId(i), o = this._hashTable.get(e, t, n); - let r; + let l; if (o) - r = o.metadata; + l = o.metadata; else { - let l = this._legend.tokenTypes[e]; - const a = []; - if (l) { - let c = t; - for (let h = 0; c > 0 && h < this._legend.tokenModifiers.length; h++) - c & 1 && a.push(this._legend.tokenModifiers[h]), c = c >> 1; - const d = this._themeService.getColorTheme().getTokenStyleMetadata(l, a, i); - if (typeof d > "u") - r = 2147483647; + let r = this._legend.tokenTypes[e]; + const c = []; + if (r) { + let d = t; + for (let h = 0; d > 0 && h < this._legend.tokenModifiers.length; h++) + d & 1 && c.push(this._legend.tokenModifiers[h]), d = d >> 1; + const a = this._themeService.getColorTheme().getTokenStyleMetadata(r, c, i); + if (typeof a > "u") + l = 2147483647; else { - if (r = 0, typeof d.italic < "u") { - const h = (d.italic ? 1 : 0) << 11; - r |= h | 1; + if (l = 0, typeof a.italic < "u") { + const h = (a.italic ? 1 : 0) << 11; + l |= h | 1; } - if (typeof d.bold < "u") { - const h = (d.bold ? 2 : 0) << 11; - r |= h | 2; + if (typeof a.bold < "u") { + const h = (a.bold ? 2 : 0) << 11; + l |= h | 2; } - if (typeof d.underline < "u") { - const h = (d.underline ? 4 : 0) << 11; - r |= h | 4; + if (typeof a.underline < "u") { + const h = (a.underline ? 4 : 0) << 11; + l |= h | 4; } - if (typeof d.strikethrough < "u") { - const h = (d.strikethrough ? 8 : 0) << 11; - r |= h | 8; + if (typeof a.strikethrough < "u") { + const h = (a.strikethrough ? 8 : 0) << 11; + l |= h | 8; } - if (d.foreground) { - const h = d.foreground << 15; - r |= h | 16; + if (a.foreground) { + const h = a.foreground << 15; + l |= h | 16; } - r === 0 && (r = 2147483647); + l === 0 && (l = 2147483647); } } else - r = 2147483647, l = "not-in-legend"; - this._hashTable.add(e, t, n, r); + l = 2147483647, r = "not-in-legend"; + this._hashTable.add(e, t, n, l); } - return r; + return l; } warnOverlappingSemanticTokens(e, t) { this._hasWarnedOverlappingTokens || (this._hasWarnedOverlappingTokens = !0, this._logService.warn(`Overlapping semantic tokens detected at lineNumber ${e}, column ${t}`)); @@ -91464,12 +91464,12 @@ let KV = class { this._hasWarnedInvalidEditStart || (this._hasWarnedInvalidEditStart = !0, this._logService.warn(`Invalid semantic tokens edit detected (previousResultId: ${e}, resultId: ${t}) at edit #${i}: The provided start offset ${n} is outside the previous data (length ${o}).`)); } }; -KV = HLe([ - KW(1, Pi), - KW(2, ri), - KW(3, Xn) -], KV); -function n7(s, e, t) { +g5 = HVe([ + hN(1, Ki), + hN(2, ri), + hN(3, Fn) +], g5); +function E7(s, e, t) { const i = s.data, n = s.data.length / 5 | 0, o = Math.max( Math.ceil( n / 1024 @@ -91477,50 +91477,50 @@ function n7(s, e, t) { ), 400 /* SemanticColoringConstants.DesiredTokensPerArea */ - ), r = []; - let l = 0, a = 1, c = 0; - for (; l < n; ) { - const d = l; - let h = Math.min(d + o, n); + ), l = []; + let r = 0, c = 1, d = 0; + for (; r < n; ) { + const a = r; + let h = Math.min(a + o, n); if (h < n) { - let w = h; - for (; w - 1 > d && i[5 * w] === 0; ) - w--; - if (w - 1 === d) { - let C = h; - for (; C + 1 < n && i[5 * C] === 0; ) - C++; - h = C; + let y = h; + for (; y - 1 > a && i[5 * y] === 0; ) + y--; + if (y - 1 === a) { + let W = h; + for (; W + 1 < n && i[5 * W] === 0; ) + W++; + h = W; } else - h = w; - } - let u = new Uint32Array((h - d) * 4), g = 0, m = 0, f = 0, b = 0; - for (; l < h; ) { - const w = 5 * l, C = i[w], S = i[w + 1], L = a + C | 0, x = C === 0 ? c + S | 0 : S, Z = i[w + 2], _ = x + Z | 0, v = i[w + 3], P = i[w + 4]; - if (_ <= x) - e.warnInvalidLengthSemanticTokens(L, x + 1); - else if (f === L && b > x) - e.warnOverlappingSemanticTokens(L, x + 1); + h = y; + } + let u = new Uint32Array((h - a) * 4), m = 0, b = 0, g = 0, Z = 0; + for (; r < h; ) { + const y = 5 * r, W = i[y], G = i[y + 1], X = c + W | 0, L = W === 0 ? d + G | 0 : G, S = i[y + 2], x = L + S | 0, w = i[y + 3], A = i[y + 4]; + if (x <= L) + e.warnInvalidLengthSemanticTokens(X, L + 1); + else if (g === X && Z > L) + e.warnOverlappingSemanticTokens(X, L + 1); else { - const E = e.getMetadata(v, P, t); - E !== 2147483647 && (m === 0 && (m = L), u[g] = L - m, u[g + 1] = x, u[g + 2] = _, u[g + 3] = E, g += 4, f = L, b = _); + const H = e.getMetadata(w, A, t); + H !== 2147483647 && (b === 0 && (b = X), u[m] = X - b, u[m + 1] = L, u[m + 2] = x, u[m + 3] = H, m += 4, g = X, Z = x); } - a = L, c = x, l++; + c = X, d = L, r++; } - g !== u.length && (u = u.subarray(0, g)); - const y = ew.create(m, u); - r.push(y); + m !== u.length && (u = u.subarray(0, m)); + const f = hy.create(b, u); + l.push(f); } - return r; + return l; } -class JLe { +class EVe { constructor(e, t, i, n) { this.tokenTypeIndex = e, this.tokenModifierSet = t, this.languageId = i, this.metadata = n, this.next = null; } } -const hc = class hc { +const pd = class pd { constructor() { - this._elementsCount = 0, this._currentLengthIndex = 0, this._currentLength = hc._SIZES[this._currentLengthIndex], this._growCount = Math.round(this._currentLengthIndex + 1 < hc._SIZES.length ? 2 / 3 * this._currentLength : 0), this._elements = [], hc._nullOutEntries(this._elements, this._currentLength); + this._elementsCount = 0, this._currentLengthIndex = 0, this._currentLength = pd._SIZES[this._currentLengthIndex], this._growCount = Math.round(this._currentLengthIndex + 1 < pd._SIZES.length ? 2 / 3 * this._currentLength : 0), this._elements = [], pd._nullOutEntries(this._elements, this._currentLength); } static _nullOutEntries(e, t) { for (let i = 0; i < t; i++) @@ -91545,36 +91545,36 @@ const hc = class hc { add(e, t, i, n) { if (this._elementsCount++, this._growCount !== 0 && this._elementsCount >= this._growCount) { const o = this._elements; - this._currentLengthIndex++, this._currentLength = hc._SIZES[this._currentLengthIndex], this._growCount = Math.round(this._currentLengthIndex + 1 < hc._SIZES.length ? 2 / 3 * this._currentLength : 0), this._elements = [], hc._nullOutEntries(this._elements, this._currentLength); - for (const r of o) { - let l = r; - for (; l; ) { - const a = l.next; - l.next = null, this._add(l), l = a; + this._currentLengthIndex++, this._currentLength = pd._SIZES[this._currentLengthIndex], this._growCount = Math.round(this._currentLengthIndex + 1 < pd._SIZES.length ? 2 / 3 * this._currentLength : 0), this._elements = [], pd._nullOutEntries(this._elements, this._currentLength); + for (const l of o) { + let r = l; + for (; r; ) { + const c = r.next; + r.next = null, this._add(r), r = c; } } } - this._add(new JLe(e, t, i, n)); + this._add(new EVe(e, t, i, n)); } _add(e) { const t = this._hashFunc(e.tokenTypeIndex, e.tokenModifierSet, e.languageId); e.next = this._elements[t], this._elements[t] = e; } }; -hc._SIZES = [3, 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071, 262139, 524287, 1048573, 2097143]; -let QV = hc; -function ULe(s) { +pd._SIZES = [3, 7, 13, 31, 61, 127, 251, 509, 1021, 2039, 4093, 8191, 16381, 32749, 65521, 131071, 262139, 524287, 1048573, 2097143]; +let Z5 = pd; +function DVe(s) { for (let e = 0, t = s.length; e < t; e += 4) { - const i = s[e + 0], n = s[e + 1], o = s[e + 2], r = s[e + 3]; - s[e + 0] = r, s[e + 1] = o, s[e + 2] = n, s[e + 3] = i; + const i = s[e + 0], n = s[e + 1], o = s[e + 2], l = s[e + 3]; + s[e + 0] = l, s[e + 1] = o, s[e + 2] = n, s[e + 3] = i; } } -function KLe(s) { +function FVe(s) { const e = new Uint8Array(s.buffer, s.byteOffset, s.length * 4); - return bH() || ULe(e), U_.wrap(e); + return $P() || DVe(e), dx.wrap(e); } -function s7(s) { - const e = new Uint32Array(QLe(s)); +function D7(s) { + const e = new Uint32Array(zVe(s)); let t = 0; if (e[t++] = s.id, s.type === "full") e[t++] = 1, e[t++] = s.data.length, e.set(s.data, t), t += s.data.length; @@ -91583,9 +91583,9 @@ function s7(s) { for (const i of s.deltas) e[t++] = i.start, e[t++] = i.deleteCount, i.data ? (e[t++] = i.data.length, e.set(i.data, t), t += i.data.length) : e[t++] = 0; } - return KLe(e); + return FVe(e); } -function QLe(s) { +function zVe(s) { let e = 0; if (e += 2, s.type === "full") e += 1 + s.data.length; @@ -91596,174 +91596,174 @@ function QLe(s) { } return e; } -function tN(s) { +function gC(s) { return s && !!s.data; } -function o7(s) { +function F7(s) { return s && Array.isArray(s.edits); } -class jLe { +class AVe { constructor(e, t, i) { this.provider = e, this.tokens = t, this.error = i; } } -function r7(s, e) { +function z7(s, e) { return s.has(e); } -function qLe(s, e) { +function KVe(s, e) { const t = s.orderedGroups(e); return t.length > 0 ? t[0] : []; } -async function l7(s, e, t, i, n) { - const o = qLe(s, e), r = await Promise.all(o.map(async (l) => { - let a, c = null; +async function A7(s, e, t, i, n) { + const o = KVe(s, e), l = await Promise.all(o.map(async (r) => { + let c, d = null; try { - a = await l.provideDocumentSemanticTokens(e, l === t ? i : null, n); - } catch (d) { - c = d, a = null; + c = await r.provideDocumentSemanticTokens(e, r === t ? i : null, n); + } catch (a) { + d = a, c = null; } - return (!a || !tN(a) && !o7(a)) && (a = null), new jLe(l, a, c); + return (!c || !gC(c) && !F7(c)) && (c = null), new AVe(r, c, d); })); - for (const l of r) { - if (l.error) - throw l.error; - if (l.tokens) - return l; + for (const r of l) { + if (r.error) + throw r.error; + if (r.tokens) + return r; } - return r.length > 0 ? r[0] : null; + return l.length > 0 ? l[0] : null; } -function $Le(s, e) { +function UVe(s, e) { const t = s.orderedGroups(e); return t.length > 0 ? t[0] : null; } -class eAe { +class PVe { constructor(e, t) { this.provider = e, this.tokens = t; } } -function tAe(s, e) { +function BVe(s, e) { return s.has(e); } -function a7(s, e) { +function K7(s, e) { const t = s.orderedGroups(e); return t.length > 0 ? t[0] : []; } -async function t9(s, e, t, i) { - const n = a7(s, e), o = await Promise.all(n.map(async (r) => { - let l; +async function SE(s, e, t, i) { + const n = K7(s, e), o = await Promise.all(n.map(async (l) => { + let r; try { - l = await r.provideDocumentRangeSemanticTokens(e, t, i); - } catch (a) { - wi(a), l = null; + r = await l.provideDocumentRangeSemanticTokens(e, t, i); + } catch (c) { + Wi(c), r = null; } - return (!l || !tN(l)) && (l = null), new eAe(r, l); + return (!r || !gC(r)) && (r = null), new PVe(l, r); })); - for (const r of o) - if (r.tokens) - return r; + for (const l of o) + if (l.tokens) + return l; return o.length > 0 ? o[0] : null; } st.registerCommand("_provideDocumentSemanticTokensLegend", async (s, ...e) => { const [t] = e; - ht(t instanceof Le); - const i = s.get(Pt).getModel(t); + ht(t instanceof Xe); + const i = s.get(At).getModel(t); if (!i) return; - const { documentSemanticTokensProvider: n } = s.get(ge), o = $Le(n, i); - return o ? o[0].getLegend() : s.get(Qt).executeCommand("_provideDocumentRangeSemanticTokensLegend", t); + const { documentSemanticTokensProvider: n } = s.get(me), o = UVe(n, i); + return o ? o[0].getLegend() : s.get(Ot).executeCommand("_provideDocumentRangeSemanticTokensLegend", t); }); st.registerCommand("_provideDocumentSemanticTokens", async (s, ...e) => { const [t] = e; - ht(t instanceof Le); - const i = s.get(Pt).getModel(t); + ht(t instanceof Xe); + const i = s.get(At).getModel(t); if (!i) return; - const { documentSemanticTokensProvider: n } = s.get(ge); - if (!r7(n, i)) - return s.get(Qt).executeCommand("_provideDocumentRangeSemanticTokens", t, i.getFullModelRange()); - const o = await l7(n, i, null, null, Ye.None); + const { documentSemanticTokensProvider: n } = s.get(me); + if (!z7(n, i)) + return s.get(Ot).executeCommand("_provideDocumentRangeSemanticTokens", t, i.getFullModelRange()); + const o = await A7(n, i, null, null, Fe.None); if (!o) return; - const { provider: r, tokens: l } = o; - if (!l || !tN(l)) + const { provider: l, tokens: r } = o; + if (!r || !gC(r)) return; - const a = s7({ + const c = D7({ id: 0, type: "full", - data: l.data + data: r.data }); - return l.resultId && r.releaseDocumentSemanticTokens(l.resultId), a; + return r.resultId && l.releaseDocumentSemanticTokens(r.resultId), c; }); st.registerCommand("_provideDocumentRangeSemanticTokensLegend", async (s, ...e) => { const [t, i] = e; - ht(t instanceof Le); - const n = s.get(Pt).getModel(t); + ht(t instanceof Xe); + const n = s.get(At).getModel(t); if (!n) return; - const { documentRangeSemanticTokensProvider: o } = s.get(ge), r = a7(o, n); - if (r.length === 0) + const { documentRangeSemanticTokensProvider: o } = s.get(me), l = K7(o, n); + if (l.length === 0) return; - if (r.length === 1) - return r[0].getLegend(); - if (!i || !M.isIRange(i)) - return console.warn("provideDocumentRangeSemanticTokensLegend might be out-of-sync with provideDocumentRangeSemanticTokens unless a range argument is passed in"), r[0].getLegend(); - const l = await t9(o, n, M.lift(i), Ye.None); - if (l) - return l.provider.getLegend(); + if (l.length === 1) + return l[0].getLegend(); + if (!i || !I.isIRange(i)) + return console.warn("provideDocumentRangeSemanticTokensLegend might be out-of-sync with provideDocumentRangeSemanticTokens unless a range argument is passed in"), l[0].getLegend(); + const r = await SE(o, n, I.lift(i), Fe.None); + if (r) + return r.provider.getLegend(); }); st.registerCommand("_provideDocumentRangeSemanticTokens", async (s, ...e) => { const [t, i] = e; - ht(t instanceof Le), ht(M.isIRange(i)); - const n = s.get(Pt).getModel(t); + ht(t instanceof Xe), ht(I.isIRange(i)); + const n = s.get(At).getModel(t); if (!n) return; - const { documentRangeSemanticTokensProvider: o } = s.get(ge), r = await t9(o, n, M.lift(i), Ye.None); - if (!(!r || !r.tokens)) - return s7({ + const { documentRangeSemanticTokensProvider: o } = s.get(me), l = await SE(o, n, I.lift(i), Fe.None); + if (!(!l || !l.tokens)) + return D7({ id: 0, type: "full", - data: r.tokens.data + data: l.tokens.data }); }); -const iN = $e("semanticTokensStylingService"), i9 = "editor.semanticHighlighting"; -function PL(s, e, t) { +const ZC = $e("semanticTokensStylingService"), xE = "editor.semanticHighlighting"; +function sV(s, e, t) { var n; - const i = (n = t.getValue(i9, { overrideIdentifier: s.getLanguageId(), resource: s.uri })) == null ? void 0 : n.enabled; + const i = (n = t.getValue(xE, { overrideIdentifier: s.getLanguageId(), resource: s.uri })) == null ? void 0 : n.enabled; return typeof i == "boolean" ? i : e.getColorTheme().semanticHighlighting; } -var c7 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var U7 = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, fa = function(s, e) { +}, Wc = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Ld; -let jV = class extends R { - constructor(e, t, i, n, o, r) { +}, Sa; +let f5 = class extends J { + constructor(e, t, i, n, o, l) { super(), this._watchers = /* @__PURE__ */ Object.create(null); - const l = (d) => { - this._watchers[d.uri.toString()] = new qV(d, e, i, o, r); - }, a = (d, h) => { - h.dispose(), delete this._watchers[d.uri.toString()]; - }, c = () => { - for (const d of t.getModels()) { - const h = this._watchers[d.uri.toString()]; - PL(d, i, n) ? h || l(d) : h && a(d, h); + const r = (a) => { + this._watchers[a.uri.toString()] = new y5(a, e, i, o, l); + }, c = (a, h) => { + h.dispose(), delete this._watchers[a.uri.toString()]; + }, d = () => { + for (const a of t.getModels()) { + const h = this._watchers[a.uri.toString()]; + sV(a, i, n) ? h || r(a) : h && c(a, h); } }; - t.getModels().forEach((d) => { - PL(d, i, n) && l(d); - }), this._register(t.onModelAdded((d) => { - PL(d, i, n) && l(d); - })), this._register(t.onModelRemoved((d) => { - const h = this._watchers[d.uri.toString()]; - h && a(d, h); - })), this._register(n.onDidChangeConfiguration((d) => { - d.affectsConfiguration(i9) && c(); - })), this._register(i.onDidColorThemeChange(c)); + t.getModels().forEach((a) => { + sV(a, i, n) && r(a); + }), this._register(t.onModelAdded((a) => { + sV(a, i, n) && r(a); + })), this._register(t.onModelRemoved((a) => { + const h = this._watchers[a.uri.toString()]; + h && c(a, h); + })), this._register(n.onDidChangeConfiguration((a) => { + a.affectsConfiguration(xE) && d(); + })), this._register(i.onDidColorThemeChange(d)); } dispose() { for (const e of Object.values(this._watchers)) @@ -91771,28 +91771,28 @@ let jV = class extends R { super.dispose(); } }; -jV = c7([ - fa(0, iN), - fa(1, Pt), - fa(2, Pi), - fa(3, Ke), - fa(4, jo), - fa(5, ge) -], jV); -var Lh; -let qV = (Lh = class extends R { +f5 = U7([ + Wc(0, ZC), + Wc(1, At), + Wc(2, Ki), + Wc(3, Qe), + Wc(4, $o), + Wc(5, me) +], f5); +var Sh; +let y5 = (Sh = class extends J { constructor(e, t, i, n, o) { - super(), this._semanticTokensStylingService = t, this._isDisposed = !1, this._model = e, this._provider = o.documentSemanticTokensProvider, this._debounceInformation = n.for(this._provider, "DocumentSemanticTokens", { min: Ld.REQUEST_MIN_DELAY, max: Ld.REQUEST_MAX_DELAY }), this._fetchDocumentSemanticTokens = this._register(new Zt(() => this._fetchDocumentSemanticTokensNow(), Ld.REQUEST_MIN_DELAY)), this._currentDocumentResponse = null, this._currentDocumentRequestCancellationTokenSource = null, this._documentProvidersChangeListeners = [], this._providersChangedDuringRequest = !1, this._register(this._model.onDidChangeContent(() => { + super(), this._semanticTokensStylingService = t, this._isDisposed = !1, this._model = e, this._provider = o.documentSemanticTokensProvider, this._debounceInformation = n.for(this._provider, "DocumentSemanticTokens", { min: Sa.REQUEST_MIN_DELAY, max: Sa.REQUEST_MAX_DELAY }), this._fetchDocumentSemanticTokens = this._register(new St(() => this._fetchDocumentSemanticTokensNow(), Sa.REQUEST_MIN_DELAY)), this._currentDocumentResponse = null, this._currentDocumentRequestCancellationTokenSource = null, this._documentProvidersChangeListeners = [], this._providersChangedDuringRequest = !1, this._register(this._model.onDidChangeContent(() => { this._fetchDocumentSemanticTokens.isScheduled() || this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model)); })), this._register(this._model.onDidChangeAttached(() => { this._fetchDocumentSemanticTokens.isScheduled() || this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model)); })), this._register(this._model.onDidChangeLanguage(() => { this._currentDocumentResponse && (this._currentDocumentResponse.dispose(), this._currentDocumentResponse = null), this._currentDocumentRequestCancellationTokenSource && (this._currentDocumentRequestCancellationTokenSource.cancel(), this._currentDocumentRequestCancellationTokenSource = null), this._setDocumentSemanticTokens(null, null, null, []), this._fetchDocumentSemanticTokens.schedule(0); })); - const r = () => { - Wt(this._documentProvidersChangeListeners), this._documentProvidersChangeListeners = []; - for (const l of this._provider.all(e)) - typeof l.onDidChange == "function" && this._documentProvidersChangeListeners.push(l.onDidChange(() => { + const l = () => { + Nt(this._documentProvidersChangeListeners), this._documentProvidersChangeListeners = []; + for (const r of this._provider.all(e)) + typeof r.onDidChange == "function" && this._documentProvidersChangeListeners.push(r.onDidChange(() => { if (this._currentDocumentRequestCancellationTokenSource) { this._providersChangedDuringRequest = !0; return; @@ -91800,47 +91800,47 @@ let qV = (Lh = class extends R { this._fetchDocumentSemanticTokens.schedule(0); })); }; - r(), this._register(this._provider.onDidChange(() => { - r(), this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model)); - })), this._register(i.onDidColorThemeChange((l) => { + l(), this._register(this._provider.onDidChange(() => { + l(), this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model)); + })), this._register(i.onDidColorThemeChange((r) => { this._setDocumentSemanticTokens(null, null, null, []), this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model)); })), this._fetchDocumentSemanticTokens.schedule(0); } dispose() { - this._currentDocumentResponse && (this._currentDocumentResponse.dispose(), this._currentDocumentResponse = null), this._currentDocumentRequestCancellationTokenSource && (this._currentDocumentRequestCancellationTokenSource.cancel(), this._currentDocumentRequestCancellationTokenSource = null), Wt(this._documentProvidersChangeListeners), this._documentProvidersChangeListeners = [], this._setDocumentSemanticTokens(null, null, null, []), this._isDisposed = !0, super.dispose(); + this._currentDocumentResponse && (this._currentDocumentResponse.dispose(), this._currentDocumentResponse = null), this._currentDocumentRequestCancellationTokenSource && (this._currentDocumentRequestCancellationTokenSource.cancel(), this._currentDocumentRequestCancellationTokenSource = null), Nt(this._documentProvidersChangeListeners), this._documentProvidersChangeListeners = [], this._setDocumentSemanticTokens(null, null, null, []), this._isDisposed = !0, super.dispose(); } _fetchDocumentSemanticTokensNow() { if (this._currentDocumentRequestCancellationTokenSource) return; - if (!r7(this._provider, this._model)) { + if (!z7(this._provider, this._model)) { this._currentDocumentResponse && this._model.tokenization.setSemanticTokens(null, !1); return; } if (!this._model.isAttachedToEditor()) return; - const e = new mi(), t = this._currentDocumentResponse ? this._currentDocumentResponse.provider : null, i = this._currentDocumentResponse && this._currentDocumentResponse.resultId || null, n = l7(this._provider, this._model, t, i, e.token); + const e = new pi(), t = this._currentDocumentResponse ? this._currentDocumentResponse.provider : null, i = this._currentDocumentResponse && this._currentDocumentResponse.resultId || null, n = A7(this._provider, this._model, t, i, e.token); this._currentDocumentRequestCancellationTokenSource = e, this._providersChangedDuringRequest = !1; - const o = [], r = this._model.onDidChangeContent((a) => { - o.push(a); - }), l = new on(!1); - n.then((a) => { - if (this._debounceInformation.update(this._model, l.elapsed()), this._currentDocumentRequestCancellationTokenSource = null, r.dispose(), !a) + const o = [], l = this._model.onDidChangeContent((c) => { + o.push(c); + }), r = new ln(!1); + n.then((c) => { + if (this._debounceInformation.update(this._model, r.elapsed()), this._currentDocumentRequestCancellationTokenSource = null, l.dispose(), !c) this._setDocumentSemanticTokens(null, null, null, o); else { - const { provider: c, tokens: d } = a, h = this._semanticTokensStylingService.getStyling(c); - this._setDocumentSemanticTokens(c, d || null, h, o); + const { provider: d, tokens: a } = c, h = this._semanticTokensStylingService.getStyling(d); + this._setDocumentSemanticTokens(d, a || null, h, o); } - }, (a) => { - a && (jr(a) || typeof a.message == "string" && a.message.indexOf("busy") !== -1) || De(a), this._currentDocumentRequestCancellationTokenSource = null, r.dispose(), (o.length > 0 || this._providersChangedDuringRequest) && (this._fetchDocumentSemanticTokens.isScheduled() || this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))); + }, (c) => { + c && (er(c) || typeof c.message == "string" && c.message.indexOf("busy") !== -1) || Me(c), this._currentDocumentRequestCancellationTokenSource = null, l.dispose(), (o.length > 0 || this._providersChangedDuringRequest) && (this._fetchDocumentSemanticTokens.isScheduled() || this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model))); }); } static _copy(e, t, i, n, o) { o = Math.min(o, i.length - n, e.length - t); - for (let r = 0; r < o; r++) - i[n + r] = e[t + r]; + for (let l = 0; l < o; l++) + i[n + l] = e[t + l]; } _setDocumentSemanticTokens(e, t, i, n) { - const o = this._currentDocumentResponse, r = () => { + const o = this._currentDocumentResponse, l = () => { (n.length > 0 || this._providersChangedDuringRequest) && !this._fetchDocumentSemanticTokens.isScheduled() && this._fetchDocumentSemanticTokens.schedule(this._debounceInformation.get(this._model)); }; if (this._currentDocumentResponse && (this._currentDocumentResponse.dispose(), this._currentDocumentResponse = null), this._isDisposed) { @@ -91852,10 +91852,10 @@ let qV = (Lh = class extends R { return; } if (!t) { - this._model.tokenization.setSemanticTokens(null, !0), r(); + this._model.tokenization.setSemanticTokens(null, !0), l(); return; } - if (o7(t)) { + if (F7(t)) { if (!o) { this._model.tokenization.setSemanticTokens(null, !0); return; @@ -91866,47 +91866,47 @@ let qV = (Lh = class extends R { data: o.data }; else { - let l = 0; + let r = 0; for (const u of t.edits) - l += (u.data ? u.data.length : 0) - u.deleteCount; - const a = o.data, c = new Uint32Array(a.length + l); - let d = a.length, h = c.length; + r += (u.data ? u.data.length : 0) - u.deleteCount; + const c = o.data, d = new Uint32Array(c.length + r); + let a = c.length, h = d.length; for (let u = t.edits.length - 1; u >= 0; u--) { - const g = t.edits[u]; - if (g.start > a.length) { - i.warnInvalidEditStart(o.resultId, t.resultId, u, g.start, a.length), this._model.tokenization.setSemanticTokens(null, !0); + const m = t.edits[u]; + if (m.start > c.length) { + i.warnInvalidEditStart(o.resultId, t.resultId, u, m.start, c.length), this._model.tokenization.setSemanticTokens(null, !0); return; } - const m = d - (g.start + g.deleteCount); - m > 0 && (Ld._copy(a, d - m, c, h - m, m), h -= m), g.data && (Ld._copy(g.data, 0, c, h - g.data.length, g.data.length), h -= g.data.length), d = g.start; + const b = a - (m.start + m.deleteCount); + b > 0 && (Sa._copy(c, a - b, d, h - b, b), h -= b), m.data && (Sa._copy(m.data, 0, d, h - m.data.length, m.data.length), h -= m.data.length), a = m.start; } - d > 0 && Ld._copy(a, 0, c, 0, d), t = { + a > 0 && Sa._copy(c, 0, d, 0, a), t = { resultId: t.resultId, - data: c + data: d }; } } - if (tN(t)) { - this._currentDocumentResponse = new iAe(e, t.resultId, t.data); - const l = n7(t, i, this._model.getLanguageId()); + if (gC(t)) { + this._currentDocumentResponse = new _Ve(e, t.resultId, t.data); + const r = E7(t, i, this._model.getLanguageId()); if (n.length > 0) - for (const a of n) - for (const c of l) - for (const d of a.changes) - c.applyEdit(d.range, d.text); - this._model.tokenization.setSemanticTokens(l, !0); + for (const c of n) + for (const d of r) + for (const a of c.changes) + d.applyEdit(a.range, a.text); + this._model.tokenization.setSemanticTokens(r, !0); } else this._model.tokenization.setSemanticTokens(null, !0); - r(); - } -}, Ld = Lh, Lh.REQUEST_MIN_DELAY = 300, Lh.REQUEST_MAX_DELAY = 2e3, Lh); -qV = Ld = c7([ - fa(1, iN), - fa(2, Pi), - fa(3, jo), - fa(4, ge) -], qV); -class iAe { + l(); + } +}, Sa = Sh, Sh.REQUEST_MIN_DELAY = 300, Sh.REQUEST_MAX_DELAY = 2e3, Sh); +y5 = Sa = U7([ + Wc(1, ZC), + Wc(2, Ki), + Wc(3, $o), + Wc(4, me) +], y5); +class _Ve { constructor(e, t, i) { this.provider = e, this.resultId = t, this.data = i; } @@ -91914,36 +91914,36 @@ class iAe { this.provider.releaseDocumentSemanticTokens(this.resultId); } } -b0(jV); -var nAe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +V0(f5); +var QVe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, K0 = function(s, e) { +}, nf = function(s, e) { return function(t, i) { e(t, i, s); }; -}, tb; -let wM = (tb = class extends R { - constructor(e, t, i, n, o, r) { - super(), this._semanticTokensStylingService = t, this._themeService = i, this._configurationService = n, this._editor = e, this._provider = r.documentRangeSemanticTokensProvider, this._debounceInformation = o.for(this._provider, "DocumentRangeSemanticTokens", { min: 100, max: 500 }), this._tokenizeViewport = this._register(new Zt(() => this._tokenizeViewportNow(), 100)), this._outstandingRequests = []; - const l = () => { +}, rZ; +let YI = (rZ = class extends J { + constructor(e, t, i, n, o, l) { + super(), this._semanticTokensStylingService = t, this._themeService = i, this._configurationService = n, this._editor = e, this._provider = l.documentRangeSemanticTokensProvider, this._debounceInformation = o.for(this._provider, "DocumentRangeSemanticTokens", { min: 100, max: 500 }), this._tokenizeViewport = this._register(new St(() => this._tokenizeViewportNow(), 100)), this._outstandingRequests = []; + const r = () => { this._editor.hasModel() && this._tokenizeViewport.schedule(this._debounceInformation.get(this._editor.getModel())); }; this._register(this._editor.onDidScrollChange(() => { - l(); + r(); })), this._register(this._editor.onDidChangeModel(() => { - this._cancelAll(), l(); - })), this._register(this._editor.onDidChangeModelContent((a) => { - this._cancelAll(), l(); + this._cancelAll(), r(); + })), this._register(this._editor.onDidChangeModelContent((c) => { + this._cancelAll(), r(); })), this._register(this._provider.onDidChange(() => { - this._cancelAll(), l(); - })), this._register(this._configurationService.onDidChangeConfiguration((a) => { - a.affectsConfiguration(i9) && (this._cancelAll(), l()); + this._cancelAll(), r(); + })), this._register(this._configurationService.onDidChangeConfiguration((c) => { + c.affectsConfiguration(xE) && (this._cancelAll(), r()); })), this._register(this._themeService.onDidColorThemeChange(() => { - this._cancelAll(), l(); - })), l(); + this._cancelAll(), r(); + })), r(); } _cancelAll() { for (const e of this._outstandingRequests) @@ -91963,11 +91963,11 @@ let wM = (tb = class extends R { const e = this._editor.getModel(); if (e.tokenization.hasCompleteSemanticTokens()) return; - if (!PL(e, this._themeService, this._configurationService)) { + if (!sV(e, this._themeService, this._configurationService)) { e.tokenization.hasSomeSemanticTokens() && e.tokenization.setSemanticTokens(null, !1); return; } - if (!tAe(this._provider, e)) { + if (!BVe(this._provider, e)) { e.tokenization.hasSomeSemanticTokens() && e.tokenization.setSemanticTokens(null, !1); return; } @@ -91975,29 +91975,29 @@ let wM = (tb = class extends R { this._outstandingRequests = this._outstandingRequests.concat(t.map((i) => this._requestRange(e, i))); } _requestRange(e, t) { - const i = e.getVersionId(), n = Ui((r) => Promise.resolve(t9(this._provider, e, t, r))), o = new on(!1); - return n.then((r) => { - if (this._debounceInformation.update(e, o.elapsed()), !r || !r.tokens || e.isDisposed() || e.getVersionId() !== i) + const i = e.getVersionId(), n = Qi((l) => Promise.resolve(SE(this._provider, e, t, l))), o = new ln(!1); + return n.then((l) => { + if (this._debounceInformation.update(e, o.elapsed()), !l || !l.tokens || e.isDisposed() || e.getVersionId() !== i) return; - const { provider: l, tokens: a } = r, c = this._semanticTokensStylingService.getStyling(l); - e.tokenization.setPartialSemanticTokens(t, n7(a, c, e.getLanguageId())); + const { provider: r, tokens: c } = l, d = this._semanticTokensStylingService.getStyling(r); + e.tokenization.setPartialSemanticTokens(t, E7(c, d, e.getLanguageId())); }).then(() => this._removeOutstandingRequest(n), () => this._removeOutstandingRequest(n)), n; } -}, tb.ID = "editor.contrib.viewportSemanticTokens", tb); -wM = nAe([ - K0(1, iN), - K0(2, Pi), - K0(3, Ke), - K0(4, jo), - K0(5, ge) -], wM); -gt( - wM.ID, - wM, +}, rZ.ID = "editor.contrib.viewportSemanticTokens", rZ); +YI = QVe([ + nf(1, ZC), + nf(2, Ki), + nf(3, Qe), + nf(4, $o), + nf(5, me) +], YI); +mt( + YI.ID, + YI, 1 /* EditorContributionInstantiation.AfterFirstRender */ ); -class sAe { +class OVe { constructor(e = !0) { this.selectSubwords = e; } @@ -92013,45 +92013,45 @@ class sAe { const n = t.getWordAtPosition(i); if (!n) return; - const { word: o, startColumn: r } = n, l = i.column - r; - let a = l, c = l, d = 0; - for (; a >= 0; a--) { - const h = o.charCodeAt(a); - if (a !== l && (h === 95 || h === 45)) + const { word: o, startColumn: l } = n, r = i.column - l; + let c = r, d = r, a = 0; + for (; c >= 0; c--) { + const h = o.charCodeAt(c); + if (c !== r && (h === 95 || h === 45)) break; - if (Xd(h) && ua(d)) + if (Aa(h) && gc(a)) break; - d = h; + a = h; } - for (a += 1; c < o.length; c++) { - const h = o.charCodeAt(c); - if (ua(h) && Xd(d)) + for (c += 1; d < o.length; d++) { + const h = o.charCodeAt(d); + if (gc(h) && Aa(a)) break; if (h === 95 || h === 45) break; - d = h; + a = h; } - a < c && e.push({ range: new M(i.lineNumber, r + a, i.lineNumber, r + c) }); + c < d && e.push({ range: new I(i.lineNumber, l + c, i.lineNumber, l + d) }); } _addWordRanges(e, t, i) { const n = t.getWordAtPosition(i); - n && e.push({ range: new M(i.lineNumber, n.startColumn, i.lineNumber, n.endColumn) }); + n && e.push({ range: new I(i.lineNumber, n.startColumn, i.lineNumber, n.endColumn) }); } _addWhitespaceLine(e, t, i) { - t.getLineLength(i.lineNumber) > 0 && t.getLineFirstNonWhitespaceColumn(i.lineNumber) === 0 && t.getLineLastNonWhitespaceColumn(i.lineNumber) === 0 && e.push({ range: new M(i.lineNumber, 1, i.lineNumber, t.getLineMaxColumn(i.lineNumber)) }); + t.getLineLength(i.lineNumber) > 0 && t.getLineFirstNonWhitespaceColumn(i.lineNumber) === 0 && t.getLineLastNonWhitespaceColumn(i.lineNumber) === 0 && e.push({ range: new I(i.lineNumber, 1, i.lineNumber, t.getLineMaxColumn(i.lineNumber)) }); } } -var oAe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var jVe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, rAe = function(s, e) { +}, qVe = function(s, e) { return function(t, i) { e(t, i, s); }; -}, $V; -class n9 { +}, W5; +class CE { constructor(e, t) { this.index = e, this.ranges = t; } @@ -92059,14 +92059,14 @@ class n9 { const t = this.index + (e ? 1 : -1); if (t < 0 || t >= this.ranges.length) return this; - const i = new n9(t, this.ranges); + const i = new CE(t, this.ranges); return i.ranges[t].equalsRange(this.ranges[this.index]) ? i.mov(e) : i; } } -var tm; -let K1 = (tm = class { +var lb; +let rG = (lb = class { static get(e) { - return e.getContribution($V.ID); + return e.getContribution(W5.ID); } constructor(e, t) { this._editor = e, this._languageFeaturesService = t, this._ignoreSelection = !1; @@ -92079,23 +92079,23 @@ let K1 = (tm = class { if (!this._editor.hasModel()) return; const t = this._editor.getSelections(), i = this._editor.getModel(); - if (this._state || await h7(this._languageFeaturesService.selectionRangeProvider, i, t.map((o) => o.getPosition()), this._editor.getOption( + if (this._state || await B7(this._languageFeaturesService.selectionRangeProvider, i, t.map((o) => o.getPosition()), this._editor.getOption( 114 /* EditorOption.smartSelect */ - ), Ye.None).then((o) => { - var r; - if (!(!$n(o) || o.length !== t.length) && !(!this._editor.hasModel() || !ei(this._editor.getSelections(), t, (l, a) => l.equalsSelection(a)))) { - for (let l = 0; l < o.length; l++) - o[l] = o[l].filter((a) => a.containsPosition(t[l].getStartPosition()) && a.containsPosition(t[l].getEndPosition())), o[l].unshift(t[l]); - this._state = o.map((l) => new n9(0, l)), (r = this._selectionListener) == null || r.dispose(), this._selectionListener = this._editor.onDidChangeCursorPosition(() => { - var l; - this._ignoreSelection || ((l = this._selectionListener) == null || l.dispose(), this._state = void 0); + ), Fe.None).then((o) => { + var l; + if (!(!ts(o) || o.length !== t.length) && !(!this._editor.hasModel() || !ti(this._editor.getSelections(), t, (r, c) => r.equalsSelection(c)))) { + for (let r = 0; r < o.length; r++) + o[r] = o[r].filter((c) => c.containsPosition(t[r].getStartPosition()) && c.containsPosition(t[r].getEndPosition())), o[r].unshift(t[r]); + this._state = o.map((r) => new CE(0, r)), (l = this._selectionListener) == null || l.dispose(), this._selectionListener = this._editor.onDidChangeCursorPosition(() => { + var r; + this._ignoreSelection || ((r = this._selectionListener) == null || r.dispose(), this._state = void 0); }); } }), !this._state) return; this._state = this._state.map((o) => o.mov(e)); - const n = this._state.map((o) => fe.fromPositions(o.ranges[o.index].getStartPosition(), o.ranges[o.index].getEndPosition())); + const n = this._state.map((o) => ge.fromPositions(o.ranges[o.index].getStartPosition(), o.ranges[o.index].getEndPosition())); this._ignoreSelection = !0; try { this._editor.setSelections(n); @@ -92103,20 +92103,20 @@ let K1 = (tm = class { this._ignoreSelection = !1; } } -}, $V = tm, tm.ID = "editor.contrib.smartSelectController", tm); -K1 = $V = oAe([ - rAe(1, ge) -], K1); -class d7 extends he { +}, W5 = lb, lb.ID = "editor.contrib.smartSelectController", lb); +rG = W5 = jVe([ + qVe(1, me) +], rG); +class P7 extends he { constructor(e, t) { super(t), this._forward = e; } async run(e, t) { - const i = K1.get(t); + const i = rG.get(t); i && await i.run(this._forward); } } -class lAe extends d7 { +class $Ve extends P7 { constructor() { super(!0, { id: "editor.action.smartSelect.expand", @@ -92124,7 +92124,7 @@ class lAe extends d7 { alias: "Expand Selection", precondition: void 0, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 1553, mac: { primary: 3345, @@ -92146,7 +92146,7 @@ class lAe extends d7 { } } st.registerCommandAlias("editor.action.smartSelect.grow", "editor.action.smartSelect.expand"); -class aAe extends d7 { +class eLe extends P7 { constructor() { super(!1, { id: "editor.action.smartSelect.shrink", @@ -92154,7 +92154,7 @@ class aAe extends d7 { alias: "Shrink Selection", precondition: void 0, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 1551, mac: { primary: 3343, @@ -92175,87 +92175,87 @@ class aAe extends d7 { }); } } -gt( - K1.ID, - K1, +mt( + rG.ID, + rG, 4 /* EditorContributionInstantiation.Lazy */ ); -ee(lAe); -ee(aAe); -async function h7(s, e, t, i, n) { - const o = s.all(e).concat(new sAe(i.selectSubwords)); - o.length === 1 && o.unshift(new iM()); - const r = [], l = []; - for (const a of o) - r.push(Promise.resolve(a.provideSelectionRanges(e, t, n)).then((c) => { - if ($n(c) && c.length === t.length) - for (let d = 0; d < t.length; d++) { - l[d] || (l[d] = []); - for (const h of c[d]) - M.isIRange(h.range) && M.containsPosition(h.range, t[d]) && l[d].push(M.lift(h.range)); +ee($Ve); +ee(eLe); +async function B7(s, e, t, i, n) { + const o = s.all(e).concat(new OVe(i.selectSubwords)); + o.length === 1 && o.unshift(new ZI()); + const l = [], r = []; + for (const c of o) + l.push(Promise.resolve(c.provideSelectionRanges(e, t, n)).then((d) => { + if (ts(d) && d.length === t.length) + for (let a = 0; a < t.length; a++) { + r[a] || (r[a] = []); + for (const h of d[a]) + I.isIRange(h.range) && I.containsPosition(h.range, t[a]) && r[a].push(I.lift(h.range)); } - }, wi)); - return await Promise.all(r), l.map((a) => { - if (a.length === 0) + }, Wi)); + return await Promise.all(l), r.map((c) => { + if (c.length === 0) return []; - a.sort((u, g) => V.isBefore(u.getStartPosition(), g.getStartPosition()) ? 1 : V.isBefore(g.getStartPosition(), u.getStartPosition()) || V.isBefore(u.getEndPosition(), g.getEndPosition()) ? -1 : V.isBefore(g.getEndPosition(), u.getEndPosition()) ? 1 : 0); - const c = []; - let d; - for (const u of a) - (!d || M.containsRange(u, d) && !M.equalsRange(u, d)) && (c.push(u), d = u); + c.sort((u, m) => Y.isBefore(u.getStartPosition(), m.getStartPosition()) ? 1 : Y.isBefore(m.getStartPosition(), u.getStartPosition()) || Y.isBefore(u.getEndPosition(), m.getEndPosition()) ? -1 : Y.isBefore(m.getEndPosition(), u.getEndPosition()) ? 1 : 0); + const d = []; + let a; + for (const u of c) + (!a || I.containsRange(u, a) && !I.equalsRange(u, a)) && (d.push(u), a = u); if (!i.selectLeadingAndTrailingWhitespace) - return c; - const h = [c[0]]; - for (let u = 1; u < c.length; u++) { - const g = c[u - 1], m = c[u]; - if (m.startLineNumber !== g.startLineNumber || m.endLineNumber !== g.endLineNumber) { - const f = new M(g.startLineNumber, e.getLineFirstNonWhitespaceColumn(g.startLineNumber), g.endLineNumber, e.getLineLastNonWhitespaceColumn(g.endLineNumber)); - f.containsRange(g) && !f.equalsRange(g) && m.containsRange(f) && !m.equalsRange(f) && h.push(f); - const b = new M(g.startLineNumber, 1, g.endLineNumber, e.getLineMaxColumn(g.endLineNumber)); - b.containsRange(g) && !b.equalsRange(f) && m.containsRange(b) && !m.equalsRange(b) && h.push(b); + return d; + const h = [d[0]]; + for (let u = 1; u < d.length; u++) { + const m = d[u - 1], b = d[u]; + if (b.startLineNumber !== m.startLineNumber || b.endLineNumber !== m.endLineNumber) { + const g = new I(m.startLineNumber, e.getLineFirstNonWhitespaceColumn(m.startLineNumber), m.endLineNumber, e.getLineLastNonWhitespaceColumn(m.endLineNumber)); + g.containsRange(m) && !g.equalsRange(m) && b.containsRange(g) && !b.equalsRange(g) && h.push(g); + const Z = new I(m.startLineNumber, 1, m.endLineNumber, e.getLineMaxColumn(m.endLineNumber)); + Z.containsRange(m) && !Z.equalsRange(g) && b.containsRange(Z) && !b.equalsRange(Z) && h.push(Z); } - h.push(m); + h.push(b); } return h; }); } st.registerCommand("_executeSelectionRangeProvider", async function(s, ...e) { const [t, i] = e; - ht(Le.isUri(t)); - const n = s.get(ge).selectionRangeProvider, o = await s.get(Ys).createModelReference(t); + ht(Xe.isUri(t)); + const n = s.get(me).selectionRangeProvider, o = await s.get(As).createModelReference(t); try { - return h7(n, o.object.textEditorModel, i, { selectLeadingAndTrailingWhitespace: !0, selectSubwords: !0 }, Ye.None); + return B7(n, o.object.textEditorModel, i, { selectLeadingAndTrailingWhitespace: !0, selectSubwords: !0 }, Fe.None); } finally { o.dispose(); } }); -const cAe = Object.freeze({ - View: Ie("view", "View"), - Help: Ie("help", "Help"), - Test: Ie("test", "Test"), - File: Ie("file", "File"), - Preferences: Ie("preferences", "Preferences"), - Developer: Ie({ key: "developer", comment: ["A developer on Code itself or someone diagnosing issues in Code"] }, "Developer") +const tLe = Object.freeze({ + View: Ce("view", "View"), + Help: Ce("help", "Help"), + Test: Ce("test", "Test"), + File: Ce("file", "File"), + Preferences: Ce("preferences", "Preferences"), + Developer: Ce({ key: "developer", comment: ["A developer on Code itself or someone diagnosing issues in Code"] }, "Developer") }); -class tw { +class uy { constructor(e, t, i, n = null) { this.startLineNumbers = e, this.endLineNumbers = t, this.lastLineRelativePosition = i, this.showEndForLine = n; } equals(e) { - return !!e && this.lastLineRelativePosition === e.lastLineRelativePosition && this.showEndForLine === e.showEndForLine && ei(this.startLineNumbers, e.startLineNumbers) && ei(this.endLineNumbers, e.endLineNumbers); + return !!e && this.lastLineRelativePosition === e.lastLineRelativePosition && this.showEndForLine === e.showEndForLine && ti(this.startLineNumbers, e.startLineNumbers) && ti(this.endLineNumbers, e.endLineNumbers); } static get Empty() { - return new tw([], [], 0); + return new uy([], [], 0); } } -const IP = nd("stickyScrollViewLayer", { createHTML: (s) => s }), QW = "data-sticky-line-index", NP = "data-sticky-is-line", dAe = "data-sticky-is-line-number", WP = "data-sticky-is-folding-icon"; -class hAe extends R { +const $K = ra("stickyScrollViewLayer", { createHTML: (s) => s }), uN = "data-sticky-line-index", e3 = "data-sticky-is-line", iLe = "data-sticky-is-line-number", t3 = "data-sticky-is-folding-icon"; +class nLe extends J { constructor(e) { - super(), this._editor = e, this._foldingIconStore = new U(), this._rootDomNode = document.createElement("div"), this._lineNumbersDomNode = document.createElement("div"), this._linesDomNodeScrollable = document.createElement("div"), this._linesDomNode = document.createElement("div"), this._lineHeight = this._editor.getOption( + super(), this._editor = e, this._foldingIconStore = new _(), this._rootDomNode = document.createElement("div"), this._lineNumbersDomNode = document.createElement("div"), this._linesDomNodeScrollable = document.createElement("div"), this._linesDomNode = document.createElement("div"), this._lineHeight = this._editor.getOption( 67 /* EditorOption.lineHeight */ - ), this._renderedStickyLines = [], this._lineNumbers = [], this._lastLineRelativePosition = 0, this._minContentWidthInPx = 0, this._isOnGlyphMargin = !1, this._lineNumbersDomNode.className = "sticky-widget-line-numbers", this._lineNumbersDomNode.setAttribute("role", "none"), this._linesDomNode.className = "sticky-widget-lines", this._linesDomNode.setAttribute("role", "list"), this._linesDomNodeScrollable.className = "sticky-widget-lines-scrollable", this._linesDomNodeScrollable.appendChild(this._linesDomNode), this._rootDomNode.className = "sticky-widget", this._rootDomNode.classList.toggle("peek", e instanceof Qr), this._rootDomNode.appendChild(this._lineNumbersDomNode), this._rootDomNode.appendChild(this._linesDomNodeScrollable); + ), this._renderedStickyLines = [], this._lineNumbers = [], this._lastLineRelativePosition = 0, this._minContentWidthInPx = 0, this._isOnGlyphMargin = !1, this._lineNumbersDomNode.className = "sticky-widget-line-numbers", this._lineNumbersDomNode.setAttribute("role", "none"), this._linesDomNode.className = "sticky-widget-lines", this._linesDomNode.setAttribute("role", "list"), this._linesDomNodeScrollable.className = "sticky-widget-lines-scrollable", this._linesDomNodeScrollable.appendChild(this._linesDomNode), this._rootDomNode.className = "sticky-widget", this._rootDomNode.classList.toggle("peek", e instanceof $l), this._rootDomNode.appendChild(this._lineNumbersDomNode), this._rootDomNode.appendChild(this._linesDomNodeScrollable); const t = () => { this._linesDomNode.style.left = this._editor.getOption( 116 @@ -92296,8 +92296,8 @@ class hAe extends R { setState(e, t, i) { if (i === void 0 && (!this._previousState && !e || this._previousState && this._previousState.equals(e))) return; - const n = this._isWidgetHeightZero(e), o = n ? void 0 : e, r = n ? 0 : this._findLineToRebuildWidgetFrom(e, i); - this._renderRootNode(o, t, r), this._previousState = e; + const n = this._isWidgetHeightZero(e), o = n ? void 0 : e, l = n ? 0 : this._findLineToRebuildWidgetFrom(e, i); + this._renderRootNode(o, t, l), this._previousState = e; } _isWidgetHeightZero(e) { if (!e) @@ -92343,16 +92343,16 @@ class hAe extends R { async _renderRootNode(e, t, i) { if (this._clearStickyLinesFromLine(i), !e) return; - for (const l of this._renderedStickyLines) - this._updateTopAndZIndexOfStickyLine(l); + for (const r of this._renderedStickyLines) + this._updateTopAndZIndexOfStickyLine(r); const n = this._editor.getLayoutInfo(), o = this._lineNumbers.slice(i); - for (const [l, a] of o.entries()) { - const c = this._renderChildNode(l + i, a, t, n); - c && (this._linesDomNode.appendChild(c.lineDomNode), this._lineNumbersDomNode.appendChild(c.lineNumberDomNode), this._renderedStickyLines.push(c)); + for (const [r, c] of o.entries()) { + const d = this._renderChildNode(r + i, c, t, n); + d && (this._linesDomNode.appendChild(d.lineDomNode), this._lineNumbersDomNode.appendChild(d.lineNumberDomNode), this._renderedStickyLines.push(d)); } t && (this._setFoldingHoverListeners(), this._useFoldingOpacityTransition(!this._isOnGlyphMargin)); - const r = this._lineNumbers.length * this._lineHeight + this._lastLineRelativePosition; - this._rootDomNode.style.display = "block", this._lineNumbersDomNode.style.height = `${r}px`, this._linesDomNodeScrollable.style.height = `${r}px`, this._rootDomNode.style.height = `${r}px`, this._rootDomNode.style.marginLeft = "0px", this._minContentWidthInPx = Math.max(...this._renderedStickyLines.map((l) => l.scrollWidth)) + n.verticalScrollbarWidth, this._editor.layoutOverlayWidget(this); + const l = this._lineNumbers.length * this._lineHeight + this._lastLineRelativePosition; + this._rootDomNode.style.display = "block", this._lineNumbersDomNode.style.height = `${l}px`, this._linesDomNodeScrollable.style.height = `${l}px`, this._rootDomNode.style.height = `${l}px`, this._rootDomNode.style.marginLeft = "0px", this._minContentWidthInPx = Math.max(...this._renderedStickyLines.map((r) => r.scrollWidth)) + n.verticalScrollbarWidth, this._editor.layoutOverlayWidget(this); } _setFoldingHoverListeners() { this._editor.getOption( @@ -92368,38 +92368,38 @@ class hAe extends R { const o = this._editor._getViewModel(); if (!o) return; - const r = o.coordinatesConverter.convertModelPositionToViewPosition(new V(t, 1)).lineNumber, l = o.getViewLineRenderingData(r), a = this._editor.getOption( + const l = o.coordinatesConverter.convertModelPositionToViewPosition(new Y(t, 1)).lineNumber, r = o.getViewLineRenderingData(l), c = this._editor.getOption( 68 /* EditorOption.lineNumbers */ ); - let c; + let d; try { - c = ds.filter(l.inlineDecorations, r, l.minColumn, l.maxColumn); + d = us.filter(r.inlineDecorations, l, r.minColumn, r.maxColumn); } catch { - c = []; + d = []; } - const d = new Jh(!0, !0, l.content, l.continuesWithWrappedLine, l.isBasicASCII, l.containsRTL, 0, l.tokens, c, l.tabSize, l.startVisibleColumn, 1, 1, 1, 500, "none", !0, !0, null), h = new e0(2e3), u = wC(d, h); - let g; - IP ? g = IP.createHTML(h.build()) : g = h.build(); - const m = document.createElement("span"); - m.setAttribute(QW, String(e)), m.setAttribute(NP, ""), m.setAttribute("role", "listitem"), m.tabIndex = 0, m.className = "sticky-line-content", m.classList.add(`stickyLine${t}`), m.style.lineHeight = `${this._lineHeight}px`, m.innerHTML = g; + const a = new jh(!0, !0, r.content, r.continuesWithWrappedLine, r.isBasicASCII, r.containsRTL, 0, r.tokens, d, r.tabSize, r.startVisibleColumn, 1, 1, 1, 500, "none", !0, !0, null), h = new l0(2e3), u = TG(a, h); + let m; + $K ? m = $K.createHTML(h.build()) : m = h.build(); + const b = document.createElement("span"); + b.setAttribute(uN, String(e)), b.setAttribute(e3, ""), b.setAttribute("role", "listitem"), b.tabIndex = 0, b.className = "sticky-line-content", b.classList.add(`stickyLine${t}`), b.style.lineHeight = `${this._lineHeight}px`, b.innerHTML = m; + const g = document.createElement("span"); + g.setAttribute(uN, String(e)), g.setAttribute(iLe, ""), g.className = "sticky-line-number", g.style.lineHeight = `${this._lineHeight}px`; + const Z = n.contentLeft; + g.style.width = `${Z}px`; const f = document.createElement("span"); - f.setAttribute(QW, String(e)), f.setAttribute(dAe, ""), f.className = "sticky-line-number", f.style.lineHeight = `${this._lineHeight}px`; - const b = n.contentLeft; - f.style.width = `${b}px`; - const y = document.createElement("span"); - a.renderType === 1 || a.renderType === 3 && t % 10 === 0 ? y.innerText = t.toString() : a.renderType === 2 && (y.innerText = Math.abs(t - this._editor.getPosition().lineNumber).toString()), y.className = "sticky-line-number-inner", y.style.lineHeight = `${this._lineHeight}px`, y.style.width = `${n.lineNumbersWidth}px`, y.style.paddingLeft = `${n.lineNumbersLeft}px`, f.appendChild(y); - const w = this._renderFoldingIconForLine(i, t); - w && f.appendChild(w.domNode), this._editor.applyFontInfo(m), this._editor.applyFontInfo(y), f.style.lineHeight = `${this._lineHeight}px`, m.style.lineHeight = `${this._lineHeight}px`, f.style.height = `${this._lineHeight}px`, m.style.height = `${this._lineHeight}px`; - const C = new uAe(e, t, m, f, w, u.characterMapping, m.scrollWidth); - return this._updateTopAndZIndexOfStickyLine(C); + c.renderType === 1 || c.renderType === 3 && t % 10 === 0 ? f.innerText = t.toString() : c.renderType === 2 && (f.innerText = Math.abs(t - this._editor.getPosition().lineNumber).toString()), f.className = "sticky-line-number-inner", f.style.lineHeight = `${this._lineHeight}px`, f.style.width = `${n.lineNumbersWidth}px`, f.style.paddingLeft = `${n.lineNumbersLeft}px`, g.appendChild(f); + const y = this._renderFoldingIconForLine(i, t); + y && g.appendChild(y.domNode), this._editor.applyFontInfo(b), this._editor.applyFontInfo(f), g.style.lineHeight = `${this._lineHeight}px`, b.style.lineHeight = `${this._lineHeight}px`, g.style.height = `${this._lineHeight}px`, b.style.height = `${this._lineHeight}px`; + const W = new sLe(e, t, b, g, y, u.characterMapping, b.scrollWidth); + return this._updateTopAndZIndexOfStickyLine(W); } _updateTopAndZIndexOfStickyLine(e) { - var d; - const t = e.index, i = e.lineDomNode, n = e.lineNumberDomNode, o = t === this._lineNumbers.length - 1, r = "0", l = "1"; - i.style.zIndex = o ? r : l, n.style.zIndex = o ? r : l; - const a = `${t * this._lineHeight + this._lastLineRelativePosition + ((d = e.foldingIcon) != null && d.isCollapsed ? 1 : 0)}px`, c = `${t * this._lineHeight}px`; - return i.style.top = o ? a : c, n.style.top = o ? a : c, e; + var a; + const t = e.index, i = e.lineDomNode, n = e.lineNumberDomNode, o = t === this._lineNumbers.length - 1, l = "0", r = "1"; + i.style.zIndex = o ? l : r, n.style.zIndex = o ? l : r; + const c = `${t * this._lineHeight + this._lastLineRelativePosition + ((a = e.foldingIcon) != null && a.isCollapsed ? 1 : 0)}px`, d = `${t * this._lineHeight}px`; + return i.style.top = o ? c : d, n.style.top = o ? c : d, e; } _renderFoldingIconForLine(e, t) { const i = this._editor.getOption( @@ -92408,11 +92408,11 @@ class hAe extends R { ); if (!e || i === "never") return; - const n = e.regions, o = n.findRange(t), r = n.getStartLineNumber(o); - if (!(t === r)) + const n = e.regions, o = n.findRange(t), l = n.getStartLineNumber(o); + if (!(t === l)) return; - const a = n.isCollapsed(o), c = new gAe(a, r, n.getEndLineNumber(o), this._lineHeight); - return c.setVisible(this._isOnGlyphMargin ? !0 : a || i === "always"), c.domNode.setAttribute(WP, ""), c; + const c = n.isCollapsed(o), d = new oLe(c, l, n.getEndLineNumber(o), this._lineHeight); + return d.setVisible(this._isOnGlyphMargin ? !0 : c || i === "always"), d.domNode.setAttribute(t3, ""), d; } getId() { return "editor.contrib.stickyScrollWidget"; @@ -92441,8 +92441,8 @@ class hAe extends R { const t = this._getRenderedStickyLineFromChildDomNode(e); if (!t) return null; - const i = OE(t.characterMapping, e, 0); - return new V(t.lineNumber, i); + const i = gJ(t.characterMapping, e, 0); + return new Y(t.lineNumber, i); } getLineNumberFromChildDomNode(e) { var t; @@ -92457,7 +92457,7 @@ class hAe extends R { * @returns the attribute value or null if none is found. */ getLineIndexFromChildDomNode(e) { - const t = this._getAttributeValue(e, QW); + const t = this._getAttributeValue(e, uN); return t ? parseInt(t, 10) : null; } /** @@ -92465,14 +92465,14 @@ class hAe extends R { * @returns a boolean. */ isInStickyLine(e) { - return this._getAttributeValue(e, NP) !== void 0; + return this._getAttributeValue(e, e3) !== void 0; } /** * Given a child dom node, tries to find if this dom node is (contained in) a sticky folding icon. * @returns a boolean. */ isInFoldingIconDomNode(e) { - return this._getAttributeValue(e, WP) !== void 0; + return this._getAttributeValue(e, t3) !== void 0; } /** * Given the dom node, finds if it or its parent sequence contains the given attribute. @@ -92487,63 +92487,63 @@ class hAe extends R { } } } -class uAe { - constructor(e, t, i, n, o, r, l) { - this.index = e, this.lineNumber = t, this.lineDomNode = i, this.lineNumberDomNode = n, this.foldingIcon = o, this.characterMapping = r, this.scrollWidth = l; +class sLe { + constructor(e, t, i, n, o, l, r) { + this.index = e, this.lineNumber = t, this.lineDomNode = i, this.lineNumberDomNode = n, this.foldingIcon = o, this.characterMapping = l, this.scrollWidth = r; } } -class gAe { +class oLe { constructor(e, t, i, n) { - this.isCollapsed = e, this.foldingStartLine = t, this.foldingEndLine = i, this.dimension = n, this.domNode = document.createElement("div"), this.domNode.style.width = `${n}px`, this.domNode.style.height = `${n}px`, this.domNode.className = Ze.asClassName(e ? Hx : Ox); + this.isCollapsed = e, this.foldingStartLine = t, this.foldingEndLine = i, this.dimension = n, this.domNode = document.createElement("div"), this.domNode.style.width = `${n}px`, this.domNode.style.height = `${n}px`, this.domNode.className = Se.asClassName(e ? rI : lI); } setVisible(e) { this.domNode.style.cursor = e ? "pointer" : "default", this.domNode.style.opacity = e ? "1" : "0"; } } -class iw { +class my { constructor(e, t) { this.startLineNumber = e, this.endLineNumber = t; } } -class CM { +class kI { constructor(e, t, i) { this.range = e, this.children = t, this.parent = i; } } -class u7 { +class _7 { constructor(e, t, i, n) { this.uri = e, this.version = t, this.element = i, this.outlineProviderId = n; } } -var nN = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var fC = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Q1 = function(s, e) { +}, cG = function(s, e) { return function(t, i) { e(t, i, s); }; -}, nw; +}, by; (function(s) { s.OUTLINE_MODEL = "outlineModel", s.FOLDING_PROVIDER_MODEL = "foldingProviderModel", s.INDENTATION_MODEL = "indentationModel"; -})(nw || (nw = {})); -var Qd; +})(by || (by = {})); +var eh; (function(s) { s[s.VALID = 0] = "VALID", s[s.INVALID = 1] = "INVALID", s[s.CANCELED = 2] = "CANCELED"; -})(Qd || (Qd = {})); -let ek = class extends R { +})(eh || (eh = {})); +let G5 = class extends J { constructor(e, t, i, n) { - switch (super(), this._editor = e, this._modelProviders = [], this._modelPromise = null, this._updateScheduler = this._register(new fr(300)), this._updateOperation = this._register(new U()), this._editor.getOption( + switch (super(), this._editor = e, this._modelProviders = [], this._modelPromise = null, this._updateScheduler = this._register(new yl(300)), this._updateOperation = this._register(new _()), this._editor.getOption( 116 /* EditorOption.stickyScroll */ ).defaultModel) { - case nw.OUTLINE_MODEL: - this._modelProviders.push(new tk(this._editor, n)); - case nw.FOLDING_PROVIDER_MODEL: - this._modelProviders.push(new nk(this._editor, t, n)); - case nw.INDENTATION_MODEL: - this._modelProviders.push(new ik(this._editor, i)); + case by.OUTLINE_MODEL: + this._modelProviders.push(new X5(this._editor, n)); + case by.FOLDING_PROVIDER_MODEL: + this._modelProviders.push(new L5(this._editor, t, n)); + case by.INDENTATION_MODEL: + this._modelProviders.push(new V5(this._editor, i)); break; } } @@ -92566,21 +92566,21 @@ let ek = class extends R { if (this._modelPromise !== n) return null; switch (o) { - case Qd.CANCELED: + case eh.CANCELED: return this._updateOperation.clear(), null; - case Qd.VALID: + case eh.VALID: return t.stickyModel; } } return null; - }).catch((t) => (De(t), null)); + }).catch((t) => (Me(t), null)); } }; -ek = nN([ - Q1(2, Se), - Q1(3, ge) -], ek); -class g7 extends R { +G5 = fC([ + cG(2, Ge), + cG(3, me) +], G5); +class Q7 extends J { constructor(e) { super(), this._editor = e, this._stickyModel = null; } @@ -92588,14 +92588,14 @@ class g7 extends R { return this._stickyModel; } _invalid() { - return this._stickyModel = null, Qd.INVALID; + return this._stickyModel = null, eh.INVALID; } computeStickyModel(e) { if (e.isCancellationRequested || !this.isProviderValid()) return { statusPromise: this._invalid(), modelPromise: null }; - const t = Ui((i) => this.createModelFromProvider(i)); + const t = Qi((i) => this.createModelFromProvider(i)); return { - statusPromise: t.then((i) => this.isModelValid(i) ? e.isCancellationRequested ? Qd.CANCELED : (this._stickyModel = this.createStickyModel(e, i), Qd.VALID) : this._invalid()).then(void 0, (i) => (De(i), Qd.CANCELED)), + statusPromise: t.then((i) => this.isModelValid(i) ? e.isCancellationRequested ? eh.CANCELED : (this._stickyModel = this.createStickyModel(e, i), eh.VALID) : this._invalid()).then(void 0, (i) => (Me(i), eh.CANCELED)), modelPromise: t }; } @@ -92617,45 +92617,45 @@ class g7 extends R { return !0; } } -let tk = class extends g7 { +let X5 = class extends Q7 { constructor(e, t) { super(e), this._languageFeaturesService = t; } createModelFromProvider(e) { - return fc.create(this._languageFeaturesService.documentSymbolProvider, this._editor.getModel(), e); + return Wd.create(this._languageFeaturesService.documentSymbolProvider, this._editor.getModel(), e); } createStickyModel(e, t) { - var r; - const { stickyOutlineElement: i, providerID: n } = this._stickyModelFromOutlineModel(t, (r = this._stickyModel) == null ? void 0 : r.outlineProviderId), o = this._editor.getModel(); - return new u7(o.uri, o.getVersionId(), i, n); + var l; + const { stickyOutlineElement: i, providerID: n } = this._stickyModelFromOutlineModel(t, (l = this._stickyModel) == null ? void 0 : l.outlineProviderId), o = this._editor.getModel(); + return new _7(o.uri, o.getVersionId(), i, n); } isModelValid(e) { return e && e.children.size > 0; } _stickyModelFromOutlineModel(e, t) { let i; - if (nt.first(e.children.values()) instanceof Tj) { - const l = nt.find(e.children.values(), (a) => a.id === t); - if (l) - i = l.children; + if (nt.first(e.children.values()) instanceof b7) { + const r = nt.find(e.children.values(), (c) => c.id === t); + if (r) + i = r.children; else { - let a = "", c = -1, d; + let c = "", d = -1, a; for (const [h, u] of e.children.entries()) { - const g = this._findSumOfRangesOfGroup(u); - g > c && (d = u, c = g, a = u.id); + const m = this._findSumOfRangesOfGroup(u); + m > d && (a = u, d = m, c = u.id); } - t = a, i = d.children; + t = c, i = a.children; } } else i = e.children; - const n = [], o = Array.from(i.values()).sort((l, a) => { - const c = new iw(l.symbol.range.startLineNumber, l.symbol.range.endLineNumber), d = new iw(a.symbol.range.startLineNumber, a.symbol.range.endLineNumber); - return this._comparator(c, d); + const n = [], o = Array.from(i.values()).sort((r, c) => { + const d = new my(r.symbol.range.startLineNumber, r.symbol.range.endLineNumber), a = new my(c.symbol.range.startLineNumber, c.symbol.range.endLineNumber); + return this._comparator(d, a); }); - for (const l of o) - n.push(this._stickyModelFromOutlineElement(l, l.symbol.selectionRange.startLineNumber)); + for (const r of o) + n.push(this._stickyModelFromOutlineElement(r, r.symbol.selectionRange.startLineNumber)); return { - stickyOutlineElement: new CM(void 0, n, void 0), + stickyOutlineElement: new kI(void 0, n, void 0), providerID: t }; } @@ -92666,11 +92666,11 @@ let tk = class extends g7 { if (o.symbol.selectionRange.startLineNumber !== t) i.push(this._stickyModelFromOutlineElement(o, o.symbol.selectionRange.startLineNumber)); else - for (const r of o.children.values()) - i.push(this._stickyModelFromOutlineElement(r, o.symbol.selectionRange.startLineNumber)); - i.sort((o, r) => this._comparator(o.range, r.range)); - const n = new iw(e.symbol.selectionRange.startLineNumber, e.symbol.range.endLineNumber); - return new CM(n, i, void 0); + for (const l of o.children.values()) + i.push(this._stickyModelFromOutlineElement(l, o.symbol.selectionRange.startLineNumber)); + i.sort((o, l) => this._comparator(o.range, l.range)); + const n = new my(e.symbol.selectionRange.startLineNumber, e.symbol.range.endLineNumber); + return new kI(n, i, void 0); } _comparator(e, t) { return e.startLineNumber !== t.startLineNumber ? e.startLineNumber - t.startLineNumber : t.endLineNumber - e.endLineNumber; @@ -92679,51 +92679,51 @@ let tk = class extends g7 { let t = 0; for (const i of e.children.values()) t += this._findSumOfRangesOfGroup(i); - return e instanceof YD ? t + e.symbol.range.endLineNumber - e.symbol.selectionRange.startLineNumber : t; + return e instanceof c9 ? t + e.symbol.range.endLineNumber - e.symbol.selectionRange.startLineNumber : t; } }; -tk = nN([ - Q1(1, ge) -], tk); -class m7 extends g7 { +X5 = fC([ + cG(1, me) +], X5); +class O7 extends Q7 { constructor(e) { - super(e), this._foldingLimitReporter = new Zj(e); + super(e), this._foldingLimitReporter = new c7(e); } createStickyModel(e, t) { const i = this._fromFoldingRegions(t), n = this._editor.getModel(); - return new u7(n.uri, n.getVersionId(), i, void 0); + return new _7(n.uri, n.getVersionId(), i, void 0); } isModelValid(e) { return e !== null; } _fromFoldingRegions(e) { - const t = e.length, i = [], n = new CM(void 0, [], void 0); + const t = e.length, i = [], n = new kI(void 0, [], void 0); for (let o = 0; o < t; o++) { - const r = e.getParentIndex(o); - let l; - r !== -1 ? l = i[r] : l = n; - const a = new CM(new iw(e.getStartLineNumber(o), e.getEndLineNumber(o) + 1), [], l); - l.children.push(a), i.push(a); + const l = e.getParentIndex(o); + let r; + l !== -1 ? r = i[l] : r = n; + const c = new kI(new my(e.getStartLineNumber(o), e.getEndLineNumber(o) + 1), [], r); + r.children.push(c), i.push(c); } return n; } } -let ik = class extends m7 { +let V5 = class extends O7 { constructor(e, t) { - super(e), this._languageConfigurationService = t, this.provider = this._register(new Y5(e.getModel(), this._languageConfigurationService, this._foldingLimitReporter)); + super(e), this._languageConfigurationService = t, this.provider = this._register(new uE(e.getModel(), this._languageConfigurationService, this._foldingLimitReporter)); } async createModelFromProvider(e) { return this.provider.compute(e); } }; -ik = nN([ - Q1(1, li) -], ik); -let nk = class extends m7 { +V5 = fC([ + cG(1, ci) +], V5); +let L5 = class extends O7 { constructor(e, t, i) { super(e), this._languageFeaturesService = i; - const n = Bh.getFoldingRangeProviders(this._languageFeaturesService, e.getModel()); - n.length > 0 && (this.provider = this._register(new z5(e.getModel(), n, t, this._foldingLimitReporter, void 0))); + const n = _h.getFoldingRangeProviders(this._languageFeaturesService, e.getModel()); + n.length > 0 && (this.provider = this._register(new mE(e.getModel(), n, t, this._foldingLimitReporter, void 0))); } isProviderValid() { return this.provider !== void 0; @@ -92733,27 +92733,27 @@ let nk = class extends m7 { return ((t = this.provider) == null ? void 0 : t.compute(e)) ?? null; } }; -nk = nN([ - Q1(2, ge) -], nk); -var mAe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +L5 = fC([ + cG(2, me) +], L5); +var lLe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, vP = function(s, e) { +}, i3 = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class pAe { +class rLe { constructor(e, t, i) { this.startLineNumber = e, this.endLineNumber = t, this.nestingDepth = i; } } -let sk = class extends R { +let I5 = class extends J { constructor(e, t, i) { - super(), this._languageFeaturesService = t, this._languageConfigurationService = i, this._onDidChangeStickyScroll = this._register(new k()), this.onDidChangeStickyScroll = this._onDidChangeStickyScroll.event, this._model = null, this._cts = null, this._stickyModelProvider = null, this._editor = e, this._sessionStore = this._register(new U()), this._updateSoon = this._register(new Zt(() => this.update(), 50)), this._register(this._editor.onDidChangeConfiguration((n) => { + super(), this._languageFeaturesService = t, this._languageConfigurationService = i, this._onDidChangeStickyScroll = this._register(new k()), this.onDidChangeStickyScroll = this._onDidChangeStickyScroll.event, this._model = null, this._cts = null, this._stickyModelProvider = null, this._editor = e, this._sessionStore = this._register(new _()), this._updateSoon = this._register(new St(() => this.update(), 50)), this._register(this._editor.onDidChangeConfiguration((n) => { n.hasChanged( 116 /* EditorOption.stickyScroll */ @@ -92766,7 +92766,7 @@ let sk = class extends R { /* EditorOption.stickyScroll */ ).enabled && (this._sessionStore.add(this._editor.onDidChangeModel(() => { this._model = null, this.updateStickyModelProvider(), this._onDidChangeStickyScroll.fire(), this.update(); - })), this._sessionStore.add(this._editor.onDidChangeHiddenAreas(() => this.update())), this._sessionStore.add(this._editor.onDidChangeModelContent(() => this._updateSoon.schedule())), this._sessionStore.add(this._languageFeaturesService.documentSymbolProvider.onDidChange(() => this.update())), this._sessionStore.add(Ce(() => { + })), this._sessionStore.add(this._editor.onDidChangeHiddenAreas(() => this.update())), this._sessionStore.add(this._editor.onDidChangeModelContent(() => this._updateSoon.schedule())), this._sessionStore.add(this._languageFeaturesService.documentSymbolProvider.onDidChange(() => this.update())), this._sessionStore.add(We(() => { var t; (t = this._stickyModelProvider) == null || t.dispose(), this._stickyModelProvider = null; })), this.updateStickyModelProvider(), this.update()); @@ -92779,11 +92779,11 @@ let sk = class extends R { var t; (t = this._stickyModelProvider) == null || t.dispose(), this._stickyModelProvider = null; const e = this._editor; - e.hasModel() && (this._stickyModelProvider = new ek(e, () => this._updateSoon.schedule(), this._languageConfigurationService, this._languageFeaturesService)); + e.hasModel() && (this._stickyModelProvider = new G5(e, () => this._updateSoon.schedule(), this._languageConfigurationService, this._languageFeaturesService)); } async update() { var e; - (e = this._cts) == null || e.dispose(!0), this._cts = new mi(), await this.updateStickyModel(this._cts.token), this._onDidChangeStickyScroll.fire(); + (e = this._cts) == null || e.dispose(!0), this._cts = new pi(), await this.updateStickyModel(this._cts.token), this._onDidChangeStickyScroll.fire(); } async updateStickyModel(e) { if (!this._editor.hasModel() || !this._stickyModelProvider || this._editor.getModel().isTooLargeForTokenization()) { @@ -92799,20 +92799,20 @@ let sk = class extends R { getCandidateStickyLinesIntersectingFromStickyModel(e, t, i, n, o) { if (t.children.length === 0) return; - let r = o; - const l = []; - for (let d = 0; d < t.children.length; d++) { - const h = t.children[d]; - h.range && l.push(h.range.startLineNumber); + let l = o; + const r = []; + for (let a = 0; a < t.children.length; a++) { + const h = t.children[a]; + h.range && r.push(h.range.startLineNumber); } - const a = this.updateIndex(Rw(l, e.startLineNumber, (d, h) => d - h)), c = this.updateIndex(Rw(l, e.startLineNumber + n, (d, h) => d - h)); - for (let d = a; d <= c; d++) { - const h = t.children[d]; + const c = this.updateIndex(Qy(r, e.startLineNumber, (a, h) => a - h)), d = this.updateIndex(Qy(r, e.startLineNumber + n, (a, h) => a - h)); + for (let a = c; a <= d; a++) { + const h = t.children[a]; if (!h) return; if (h.range) { - const u = h.range.startLineNumber, g = h.range.endLineNumber; - e.startLineNumber <= g + 1 && u - 1 <= e.endLineNumber && u !== r && (r = u, i.push(new pAe(u, g - 1, n + 1)), this.getCandidateStickyLinesIntersectingFromStickyModel(e, h, i, n + 1, u)); + const u = h.range.startLineNumber, m = h.range.endLineNumber; + e.startLineNumber <= m + 1 && u - 1 <= e.endLineNumber && u !== l && (l = u, i.push(new rLe(u, m - 1, n + 1)), this.getCandidateStickyLinesIntersectingFromStickyModel(e, h, i, n + 1, u)); } else this.getCandidateStickyLinesIntersectingFromStickyModel(e, h, i, n, o); } @@ -92825,45 +92825,45 @@ let sk = class extends R { this.getCandidateStickyLinesIntersectingFromStickyModel(e, this._model.element, t, 0, -1); const i = (o = this._editor._getViewModel()) == null ? void 0 : o.getHiddenAreas(); if (i) - for (const r of i) - t = t.filter((l) => !(l.startLineNumber >= r.startLineNumber && l.endLineNumber <= r.endLineNumber + 1)); + for (const l of i) + t = t.filter((r) => !(r.startLineNumber >= l.startLineNumber && r.endLineNumber <= l.endLineNumber + 1)); return t; } }; -sk = mAe([ - vP(1, ge), - vP(2, li) -], sk); -var fAe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +I5 = lLe([ + i3(1, me), + i3(2, ci) +], I5); +var cLe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Cp = function(s, e) { +}, Ip = function(s, e) { return function(t, i) { e(t, i, s); }; -}, ok, im; -let ed = (im = class extends R { - constructor(e, t, i, n, o, r, l) { - super(), this._editor = e, this._contextMenuService = t, this._languageFeaturesService = i, this._instaService = n, this._contextKeyService = l, this._sessionStore = new U(), this._maxStickyLines = Number.MAX_SAFE_INTEGER, this._candidateDefinitionsLength = -1, this._focusedStickyElementIndex = -1, this._enabled = !1, this._focused = !1, this._positionRevealed = !1, this._onMouseDown = !1, this._endLineNumbers = [], this._stickyScrollWidget = new hAe(this._editor), this._stickyLineCandidateProvider = new sk(this._editor, i, o), this._register(this._stickyScrollWidget), this._register(this._stickyLineCandidateProvider), this._widgetState = tw.Empty, this._onDidResize(), this._readConfiguration(); - const a = this._stickyScrollWidget.getDomNode(); - this._register(this._editor.onDidChangeConfiguration((d) => { - this._readConfigurationChange(d); - })), this._register(z(a, ie.CONTEXT_MENU, async (d) => { - this._onContextMenu(xe(a), d); - })), this._stickyScrollFocusedContextKey = I.stickyScrollFocused.bindTo(this._contextKeyService), this._stickyScrollVisibleContextKey = I.stickyScrollVisible.bindTo(this._contextKeyService); - const c = this._register(vl(a)); - this._register(c.onDidBlur((d) => { - this._positionRevealed === !1 && a.clientHeight === 0 ? (this._focusedStickyElementIndex = -1, this.focus()) : this._disposeFocusStickyScrollStore(); - })), this._register(c.onDidFocus((d) => { +}, S5, rb; +let sa = (rb = class extends J { + constructor(e, t, i, n, o, l, r) { + super(), this._editor = e, this._contextMenuService = t, this._languageFeaturesService = i, this._instaService = n, this._contextKeyService = r, this._sessionStore = new _(), this._maxStickyLines = Number.MAX_SAFE_INTEGER, this._candidateDefinitionsLength = -1, this._focusedStickyElementIndex = -1, this._enabled = !1, this._focused = !1, this._positionRevealed = !1, this._onMouseDown = !1, this._endLineNumbers = [], this._stickyScrollWidget = new nLe(this._editor), this._stickyLineCandidateProvider = new I5(this._editor, i, o), this._register(this._stickyScrollWidget), this._register(this._stickyLineCandidateProvider), this._widgetState = uy.Empty, this._onDidResize(), this._readConfiguration(); + const c = this._stickyScrollWidget.getDomNode(); + this._register(this._editor.onDidChangeConfiguration((a) => { + this._readConfigurationChange(a); + })), this._register(z(c, ie.CONTEXT_MENU, async (a) => { + this._onContextMenu(Le(c), a); + })), this._stickyScrollFocusedContextKey = C.stickyScrollFocused.bindTo(this._contextKeyService), this._stickyScrollVisibleContextKey = C.stickyScrollVisible.bindTo(this._contextKeyService); + const d = this._register(kr(c)); + this._register(d.onDidBlur((a) => { + this._positionRevealed === !1 && c.clientHeight === 0 ? (this._focusedStickyElementIndex = -1, this.focus()) : this._disposeFocusStickyScrollStore(); + })), this._register(d.onDidFocus((a) => { this.focus(); - })), this._registerMouseListeners(), this._register(z(a, ie.MOUSE_DOWN, (d) => { + })), this._registerMouseListeners(), this._register(z(c, ie.MOUSE_DOWN, (a) => { this._onMouseDown = !0; })); } static get(e) { - return e.getContribution(ok.ID); + return e.getContribution(S5.ID); } _disposeFocusStickyScrollStore() { var e; @@ -92874,7 +92874,7 @@ let ed = (im = class extends R { this._onMouseDown = !1, this._editor.focus(); return; } - this._stickyScrollFocusedContextKey.get() !== !0 && (this._focused = !0, this._focusDisposableStore = new U(), this._stickyScrollFocusedContextKey.set(!0), this._focusedStickyElementIndex = this._stickyScrollWidget.lineNumbers.length - 1, this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex)); + this._stickyScrollFocusedContextKey.get() !== !0 && (this._focused = !0, this._focusDisposableStore = new _(), this._stickyScrollFocusedContextKey.set(!0), this._focusedStickyElementIndex = this._stickyScrollWidget.lineNumbers.length - 1, this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex)); } focusNext() { this._focusedStickyElementIndex < this._stickyScrollWidget.lineNumberCount - 1 && this._focusNav(!0); @@ -92904,85 +92904,85 @@ let ed = (im = class extends R { )); } _reveaInEditor(e, t) { - this._focused && this._disposeFocusStickyScrollStore(), this._positionRevealed = !0, t(), this._editor.setSelection(M.fromPositions(e)), this._editor.focus(); + this._focused && this._disposeFocusStickyScrollStore(), this._positionRevealed = !0, t(), this._editor.setSelection(I.fromPositions(e)), this._editor.focus(); } _registerMouseListeners() { - const e = this._register(new U()), t = this._register(new EI(this._editor, { + const e = this._register(new _()), t = this._register(new $x(this._editor, { extractLineNumberFromMouseEvent: (o) => { - const r = this._stickyScrollWidget.getEditorPositionFromNode(o.target.element); - return r ? r.lineNumber : 0; + const l = this._stickyScrollWidget.getEditorPositionFromNode(o.target.element); + return l ? l.lineNumber : 0; } })), i = (o) => { if (!this._editor.hasModel() || o.target.type !== 12 || o.target.detail !== this._stickyScrollWidget.getId()) return null; - const r = o.target.element; - if (!r || r.innerText !== r.innerHTML) + const l = o.target.element; + if (!l || l.innerText !== l.innerHTML) return null; - const l = this._stickyScrollWidget.getEditorPositionFromNode(r); - return l ? { - range: new M(l.lineNumber, l.column, l.lineNumber, l.column + r.innerText.length), - textElement: r + const r = this._stickyScrollWidget.getEditorPositionFromNode(l); + return r ? { + range: new I(r.lineNumber, r.column, r.lineNumber, r.column + l.innerText.length), + textElement: l } : null; }, n = this._stickyScrollWidget.getDomNode(); - this._register(ai(n, ie.CLICK, (o) => { + this._register(di(n, ie.CLICK, (o) => { if (o.ctrlKey || o.altKey || o.metaKey || !o.leftButton) return; if (o.shiftKey) { - const c = this._stickyScrollWidget.getLineIndexFromChildDomNode(o.target); - if (c === null) + const d = this._stickyScrollWidget.getLineIndexFromChildDomNode(o.target); + if (d === null) return; - const d = new V(this._endLineNumbers[c], 1); - this._revealLineInCenterIfOutsideViewport(d); + const a = new Y(this._endLineNumbers[d], 1); + this._revealLineInCenterIfOutsideViewport(a); return; } if (this._stickyScrollWidget.isInFoldingIconDomNode(o.target)) { - const c = this._stickyScrollWidget.getLineNumberFromChildDomNode(o.target); - this._toggleFoldingRegionForLine(c); + const d = this._stickyScrollWidget.getLineNumberFromChildDomNode(o.target); + this._toggleFoldingRegionForLine(d); return; } if (!this._stickyScrollWidget.isInStickyLine(o.target)) return; - let a = this._stickyScrollWidget.getEditorPositionFromNode(o.target); - if (!a) { - const c = this._stickyScrollWidget.getLineNumberFromChildDomNode(o.target); - if (c === null) + let c = this._stickyScrollWidget.getEditorPositionFromNode(o.target); + if (!c) { + const d = this._stickyScrollWidget.getLineNumberFromChildDomNode(o.target); + if (d === null) return; - a = new V(c, 1); + c = new Y(d, 1); } - this._revealPosition(a); - })), this._register(ai(n, ie.MOUSE_MOVE, (o) => { + this._revealPosition(c); + })), this._register(di(n, ie.MOUSE_MOVE, (o) => { if (o.shiftKey) { - const r = this._stickyScrollWidget.getLineIndexFromChildDomNode(o.target); - if (r === null || this._showEndForLine !== null && this._showEndForLine === r) + const l = this._stickyScrollWidget.getLineIndexFromChildDomNode(o.target); + if (l === null || this._showEndForLine !== null && this._showEndForLine === l) return; - this._showEndForLine = r, this._renderStickyScroll(); + this._showEndForLine = l, this._renderStickyScroll(); return; } this._showEndForLine !== void 0 && (this._showEndForLine = void 0, this._renderStickyScroll()); })), this._register(z(n, ie.MOUSE_LEAVE, (o) => { this._showEndForLine !== void 0 && (this._showEndForLine = void 0, this._renderStickyScroll()); - })), this._register(t.onMouseMoveOrRelevantKeyDown(([o, r]) => { - const l = i(o); - if (!l || !o.hasTriggerModifier || !this._editor.hasModel()) { + })), this._register(t.onMouseMoveOrRelevantKeyDown(([o, l]) => { + const r = i(o); + if (!r || !o.hasTriggerModifier || !this._editor.hasModel()) { e.clear(); return; } - const { range: a, textElement: c } = l; - if (!a.equalsRange(this._stickyRangeProjectedOnEditor)) - this._stickyRangeProjectedOnEditor = a, e.clear(); - else if (c.style.textDecoration === "underline") + const { range: c, textElement: d } = r; + if (!c.equalsRange(this._stickyRangeProjectedOnEditor)) + this._stickyRangeProjectedOnEditor = c, e.clear(); + else if (d.style.textDecoration === "underline") return; - const d = new mi(); - e.add(Ce(() => d.dispose(!0))); + const a = new pi(); + e.add(We(() => a.dispose(!0))); let h; - XC(this._languageFeaturesService.definitionProvider, this._editor.getModel(), new V(a.startLineNumber, a.startColumn + 1), !1, d.token).then((u) => { - if (!d.token.isCancellationRequested) + qG(this._languageFeaturesService.definitionProvider, this._editor.getModel(), new Y(c.startLineNumber, c.startColumn + 1), !1, a.token).then((u) => { + if (!a.token.isCancellationRequested) if (u.length !== 0) { this._candidateDefinitionsLength = u.length; - const g = c; - h !== g ? (e.clear(), h = g, h.style.textDecoration = "underline", e.add(Ce(() => { + const m = d; + h !== m ? (e.clear(), h = m, h.style.textDecoration = "underline", e.add(We(() => { h.style.textDecoration = "none"; - }))) : h || (h = g, h.style.textDecoration = "underline", e.add(Ce(() => { + }))) : h || (h = m, h.style.textDecoration = "underline", e.add(We(() => { h.style.textDecoration = "none"; }))); } else @@ -92993,12 +92993,12 @@ let ed = (im = class extends R { })), this._register(t.onExecute(async (o) => { if (o.target.type !== 12 || o.target.detail !== this._stickyScrollWidget.getId()) return; - const r = this._stickyScrollWidget.getEditorPositionFromNode(o.target.element); - r && (!this._editor.hasModel() || !this._stickyRangeProjectedOnEditor || (this._candidateDefinitionsLength > 1 && (this._focused && this._disposeFocusStickyScrollStore(), this._revealPosition({ lineNumber: r.lineNumber, column: 1 })), this._instaService.invokeFunction(cj, o, this._editor, { uri: this._editor.getModel().uri, range: this._stickyRangeProjectedOnEditor }))); + const l = this._stickyScrollWidget.getEditorPositionFromNode(o.target.element); + l && (!this._editor.hasModel() || !this._stickyRangeProjectedOnEditor || (this._candidateDefinitionsLength > 1 && (this._focused && this._disposeFocusStickyScrollStore(), this._revealPosition({ lineNumber: l.lineNumber, column: 1 })), this._instaService.invokeFunction(U4, o, this._editor, { uri: this._editor.getModel().uri, range: this._stickyRangeProjectedOnEditor }))); })); } _onContextMenu(e, t) { - const i = new Er(e, t); + const i = new Fl(e, t); this._contextMenuService.showContextMenu({ menuId: pe.StickyScrollContext, getAnchor: () => i @@ -93010,7 +93010,7 @@ let ed = (im = class extends R { const t = this._stickyScrollWidget.getRenderedStickyLine(e), i = t == null ? void 0 : t.foldingIcon; if (!i) return; - E5(this._foldingModel, Number.MAX_VALUE, [e]), i.isCollapsed = !i.isCollapsed; + dE(this._foldingModel, Number.MAX_VALUE, [e]), i.isCollapsed = !i.isCollapsed; const n = (i.isCollapsed ? this._editor.getTopForLineNumber(i.foldingEndLine) : this._editor.getTopForLineNumber(i.foldingStartLine)) - this._editor.getOption( 67 /* EditorOption.lineHeight */ @@ -93089,8 +93089,8 @@ let ed = (im = class extends R { else if (this._focusedStickyElementIndex === -1) await this._updateState(i), this._focusedStickyElementIndex = this._stickyScrollWidget.lineNumberCount - 1, this._focusedStickyElementIndex !== -1 && this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex); else { - const r = this._stickyScrollWidget.lineNumbers[this._focusedStickyElementIndex]; - await this._updateState(i), this._stickyScrollWidget.lineNumberCount === 0 ? this._focusedStickyElementIndex = -1 : (this._stickyScrollWidget.lineNumbers.includes(r) || (this._focusedStickyElementIndex = this._stickyScrollWidget.lineNumberCount - 1), this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex)); + const l = this._stickyScrollWidget.lineNumbers[this._focusedStickyElementIndex]; + await this._updateState(i), this._stickyScrollWidget.lineNumberCount === 0 ? this._focusedStickyElementIndex = -1 : (this._stickyScrollWidget.lineNumbers.includes(l) || (this._focusedStickyElementIndex = this._stickyScrollWidget.lineNumberCount - 1), this._stickyScrollWidget.focusLineWithIndex(this._focusedStickyElementIndex)); } } _updateAndGetMinRebuildFromLine(e) { @@ -93102,12 +93102,12 @@ let ed = (im = class extends R { } async _updateState(e) { var i; - this._minRebuildFromLine = void 0, this._foldingModel = await ((i = Bh.get(this._editor)) == null ? void 0 : i.getFoldingModel()) ?? void 0, this._widgetState = this.findScrollWidgetState(); + this._minRebuildFromLine = void 0, this._foldingModel = await ((i = _h.get(this._editor)) == null ? void 0 : i.getFoldingModel()) ?? void 0, this._widgetState = this.findScrollWidgetState(); const t = this._widgetState.startLineNumbers.length > 0; this._stickyScrollVisibleContextKey.set(t), this._stickyScrollWidget.setState(this._widgetState, this._foldingModel, e); } async _resetState() { - this._minRebuildFromLine = void 0, this._foldingModel = void 0, this._widgetState = tw.Empty, this._stickyScrollVisibleContextKey.set(!1), this._stickyScrollWidget.setState(void 0, void 0); + this._minRebuildFromLine = void 0, this._foldingModel = void 0, this._widgetState = uy.Empty, this._stickyScrollVisibleContextKey.set(!1), this._stickyScrollWidget.setState(void 0, void 0); } findScrollWidgetState() { const e = this._editor.getOption( @@ -93118,50 +93118,50 @@ let ed = (im = class extends R { /* EditorOption.stickyScroll */ ).maxLineCount), i = this._editor.getScrollTop(); let n = 0; - const o = [], r = [], l = this._editor.getVisibleRanges(); - if (l.length !== 0) { - const a = new iw(l[0].startLineNumber, l[l.length - 1].endLineNumber), c = this._stickyLineCandidateProvider.getCandidateStickyLinesIntersecting(a); - for (const d of c) { - const h = d.startLineNumber, u = d.endLineNumber, g = d.nestingDepth; + const o = [], l = [], r = this._editor.getVisibleRanges(); + if (r.length !== 0) { + const c = new my(r[0].startLineNumber, r[r.length - 1].endLineNumber), d = this._stickyLineCandidateProvider.getCandidateStickyLinesIntersecting(c); + for (const a of d) { + const h = a.startLineNumber, u = a.endLineNumber, m = a.nestingDepth; if (u - h > 0) { - const m = (g - 1) * e, f = g * e, b = this._editor.getBottomForLineNumber(h) - i, y = this._editor.getTopForLineNumber(u) - i, w = this._editor.getBottomForLineNumber(u) - i; - if (m > y && m <= w) { - o.push(h), r.push(u + 1), n = w - f; + const b = (m - 1) * e, g = m * e, Z = this._editor.getBottomForLineNumber(h) - i, f = this._editor.getTopForLineNumber(u) - i, y = this._editor.getBottomForLineNumber(u) - i; + if (b > f && b <= y) { + o.push(h), l.push(u + 1), n = y - g; break; - } else f > b && f <= w && (o.push(h), r.push(u + 1)); + } else g > Z && g <= y && (o.push(h), l.push(u + 1)); if (o.length === t) break; } } } - return this._endLineNumbers = r, new tw(o, r, n, this._showEndForLine); + return this._endLineNumbers = l, new uy(o, l, n, this._showEndForLine); } dispose() { super.dispose(), this._sessionStore.dispose(); } -}, ok = im, im.ID = "store.contrib.stickyScrollController", im); -ed = ok = fAe([ - Cp(1, Co), - Cp(2, ge), - Cp(3, Se), - Cp(4, li), - Cp(5, jo), - Cp(6, _e) -], ed); -class bAe extends Ss { +}, S5 = rb, rb.ID = "store.contrib.stickyScrollController", rb); +sa = S5 = cLe([ + Ip(1, Xo), + Ip(2, me), + Ip(3, Ge), + Ip(4, ci), + Ip(5, $o), + Ip(6, xe) +], sa); +class dLe extends Vs { constructor() { super({ id: "editor.action.toggleStickyScroll", title: { - ...Ie("toggleEditorStickyScroll", "Toggle Editor Sticky Scroll"), + ...Ce("toggleEditorStickyScroll", "Toggle Editor Sticky Scroll"), mnemonicTitle: p({ key: "mitoggleStickyScroll", comment: ["&& denotes a mnemonic"] }, "&&Toggle Editor Sticky Scroll") }, metadata: { - description: Ie("toggleEditorStickyScroll.description", "Toggle/enable the editor sticky scroll which shows the nested scopes at the top of the viewport") + description: Ce("toggleEditorStickyScroll.description", "Toggle/enable the editor sticky scroll which shows the nested scopes at the top of the viewport") }, - category: cAe.View, + category: tLe.View, toggled: { - condition: H.equals("config.editor.stickyScroll.enabled", !0), + condition: P.equals("config.editor.stickyScroll.enabled", !0), title: p("stickyScroll", "Sticky Scroll"), mnemonicTitle: p({ key: "miStickyScroll", comment: ["&& denotes a mnemonic"] }, "&&Sticky Scroll") }, @@ -93173,20 +93173,20 @@ class bAe extends Ss { }); } async run(e) { - const t = e.get(Ke), i = !t.getValue("editor.stickyScroll.enabled"); + const t = e.get(Qe), i = !t.getValue("editor.stickyScroll.enabled"); return t.updateValue("editor.stickyScroll.enabled", i); } } -const sN = 100; -class yAe extends Rl { +const yC = 100; +class aLe extends Fr { constructor() { super({ id: "editor.action.focusStickyScroll", title: { - ...Ie("focusStickyScroll", "Focus on the editor sticky scroll"), + ...Ce("focusStickyScroll", "Focus on the editor sticky scroll"), mnemonicTitle: p({ key: "mifocusStickyScroll", comment: ["&& denotes a mnemonic"] }, "&&Focus Sticky Scroll") }, - precondition: H.and(H.has("config.editor.stickyScroll.enabled"), I.stickyScrollVisible), + precondition: P.and(P.has("config.editor.stickyScroll.enabled"), C.stickyScrollVisible), menu: [ { id: pe.CommandPalette } ] @@ -93194,17 +93194,17 @@ class yAe extends Rl { } runEditorCommand(e, t) { var i; - (i = ed.get(t)) == null || i.focus(); + (i = sa.get(t)) == null || i.focus(); } } -class wAe extends Rl { +class hLe extends Fr { constructor() { super({ id: "editor.action.selectNextStickyScrollLine", - title: Ie("selectNextStickyScrollLine.title", "Select the next editor sticky scroll line"), - precondition: I.stickyScrollFocused.isEqualTo(!0), + title: Ce("selectNextStickyScrollLine.title", "Select the next editor sticky scroll line"), + precondition: C.stickyScrollFocused.isEqualTo(!0), keybinding: { - weight: sN, + weight: yC, primary: 18 /* KeyCode.DownArrow */ } @@ -93212,17 +93212,17 @@ class wAe extends Rl { } runEditorCommand(e, t) { var i; - (i = ed.get(t)) == null || i.focusNext(); + (i = sa.get(t)) == null || i.focusNext(); } } -class CAe extends Rl { +class uLe extends Fr { constructor() { super({ id: "editor.action.selectPreviousStickyScrollLine", - title: Ie("selectPreviousStickyScrollLine.title", "Select the previous sticky scroll line"), - precondition: I.stickyScrollFocused.isEqualTo(!0), + title: Ce("selectPreviousStickyScrollLine.title", "Select the previous sticky scroll line"), + precondition: C.stickyScrollFocused.isEqualTo(!0), keybinding: { - weight: sN, + weight: yC, primary: 16 /* KeyCode.UpArrow */ } @@ -93230,17 +93230,17 @@ class CAe extends Rl { } runEditorCommand(e, t) { var i; - (i = ed.get(t)) == null || i.focusPrevious(); + (i = sa.get(t)) == null || i.focusPrevious(); } } -class SAe extends Rl { +class mLe extends Fr { constructor() { super({ id: "editor.action.goToFocusedStickyScrollLine", - title: Ie("goToFocusedStickyScrollLine.title", "Go to the focused sticky scroll line"), - precondition: I.stickyScrollFocused.isEqualTo(!0), + title: Ce("goToFocusedStickyScrollLine.title", "Go to the focused sticky scroll line"), + precondition: C.stickyScrollFocused.isEqualTo(!0), keybinding: { - weight: sN, + weight: yC, primary: 3 /* KeyCode.Enter */ } @@ -93248,17 +93248,17 @@ class SAe extends Rl { } runEditorCommand(e, t) { var i; - (i = ed.get(t)) == null || i.goToFocused(); + (i = sa.get(t)) == null || i.goToFocused(); } } -class LAe extends Rl { +class bLe extends Fr { constructor() { super({ id: "editor.action.selectEditor", - title: Ie("selectEditor.title", "Select Editor"), - precondition: I.stickyScrollFocused.isEqualTo(!0), + title: Ce("selectEditor.title", "Select Editor"), + precondition: C.stickyScrollFocused.isEqualTo(!0), keybinding: { - weight: sN, + weight: yC, primary: 9 /* KeyCode.Escape */ } @@ -93266,136 +93266,136 @@ class LAe extends Rl { } runEditorCommand(e, t) { var i; - (i = ed.get(t)) == null || i.selectEditor(); + (i = sa.get(t)) == null || i.selectEditor(); } } -gt( - ed.ID, - ed, +mt( + sa.ID, + sa, 1 /* EditorContributionInstantiation.AfterFirstRender */ ); -kt(bAe); -kt(yAe); -kt(CAe); -kt(wAe); -kt(SAe); -kt(LAe); -var p7 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +kt(dLe); +kt(aLe); +kt(uLe); +kt(hLe); +kt(mLe); +kt(bLe); +var j7 = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Ly = function(s, e) { +}, Tf = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class AAe { - constructor(e, t, i, n, o, r) { - this.range = e, this.insertText = t, this.filterText = i, this.additionalTextEdits = n, this.command = o, this.completion = r; +class pLe { + constructor(e, t, i, n, o, l) { + this.range = e, this.insertText = t, this.filterText = i, this.additionalTextEdits = n, this.command = o, this.completion = l; } } -let rk = class extends f6 { - constructor(e, t, i, n, o, r) { - super(o.disposable), this.model = e, this.line = t, this.word = i, this.completionModel = n, this._suggestMemoryService = r; +let x5 = class extends cq { + constructor(e, t, i, n, o, l) { + super(o.disposable), this.model = e, this.line = t, this.word = i, this.completionModel = n, this._suggestMemoryService = l; } canBeReused(e, t, i) { return this.model === e && this.line === t && this.word.word.length > 0 && this.word.startColumn === i.startColumn && this.word.endColumn < i.endColumn && this.completionModel.getIncompleteProvider().size === 0; } get items() { const e = [], { items: t } = this.completionModel, i = this._suggestMemoryService.select(this.model, { lineNumber: this.line, column: this.word.endColumn + this.completionModel.lineContext.characterCountDelta }, t), n = nt.slice(t, i), o = nt.slice(t, 0, i); - let r = 5; - for (const l of nt.concat(n, o)) { - if (l.score === Il.Default) + let l = 5; + for (const r of nt.concat(n, o)) { + if (r.score === Tr.Default) continue; - const a = new M( - l.editStart.lineNumber, - l.editStart.column, - l.editInsertEnd.lineNumber, - l.editInsertEnd.column + this.completionModel.lineContext.characterCountDelta + const c = new I( + r.editStart.lineNumber, + r.editStart.column, + r.editInsertEnd.lineNumber, + r.editInsertEnd.column + this.completionModel.lineContext.characterCountDelta // end PLUS character delta - ), c = l.completion.insertTextRules && l.completion.insertTextRules & 4 ? { snippet: l.completion.insertText } : l.completion.insertText; - e.push(new AAe(a, c, l.filterTextLow ?? l.labelLow, l.completion.additionalTextEdits, l.completion.command, l)), r-- >= 0 && l.resolve(Ye.None); + ), d = r.completion.insertTextRules && r.completion.insertTextRules & 4 ? { snippet: r.completion.insertText } : r.completion.insertText; + e.push(new pLe(c, d, r.filterTextLow ?? r.labelLow, r.completion.additionalTextEdits, r.completion.command, r)), l-- >= 0 && r.resolve(Fe.None); } return e; } }; -rk = p7([ - Ly(5, jI) -], rk); -let lk = class extends R { +x5 = j7([ + Tf(5, uC) +], x5); +let C5 = class extends J { constructor(e, t, i, n) { super(), this._languageFeatureService = e, this._clipboardService = t, this._suggestMemoryService = i, this._editorService = n, this._store.add(e.inlineCompletionsProvider.register("*", this)); } async provideInlineCompletions(e, t, i, n) { - var g; + var m; if (i.selectedSuggestionInfo) return; let o; - for (const m of this._editorService.listCodeEditors()) - if (m.getModel() === e) { - o = m; + for (const b of this._editorService.listCodeEditors()) + if (b.getModel() === e) { + o = b; break; } if (!o) return; - const r = o.getOption( + const l = o.getOption( 90 /* EditorOption.quickSuggestions */ ); - if (Kp.isAllOff(r)) + if (tg.isAllOff(l)) return; e.tokenization.tokenizeIfCheap(t.lineNumber); - const l = e.tokenization.getLineTokens(t.lineNumber), a = l.getStandardTokenType(l.findTokenIndexAtOffset(Math.max(t.column - 1 - 1, 0))); - if (Kp.valueFor(r, a) !== "inline") + const r = e.tokenization.getLineTokens(t.lineNumber), c = r.getStandardTokenType(r.findTokenIndexAtOffset(Math.max(t.column - 1 - 1, 0))); + if (tg.valueFor(l, c) !== "inline") return; - let c = e.getWordAtPosition(t), d; - if (c != null && c.word || (d = this._getTriggerCharacterInfo(e, t)), !(c != null && c.word) && !d || (c || (c = e.getWordUntilPosition(t)), c.endColumn !== t.column)) + let d = e.getWordAtPosition(t), a; + if (d != null && d.word || (a = this._getTriggerCharacterInfo(e, t)), !(d != null && d.word) && !a || (d || (d = e.getWordUntilPosition(t)), d.endColumn !== t.column)) return; let h; - const u = e.getValueInRange(new M(t.lineNumber, 1, t.lineNumber, t.column)); - if (!d && ((g = this._lastResult) != null && g.canBeReused(e, t.lineNumber, c))) { - const m = new pP(u, t.column - this._lastResult.word.endColumn); - this._lastResult.completionModel.lineContext = m, this._lastResult.acquire(), h = this._lastResult; + const u = e.getValueInRange(new I(t.lineNumber, 1, t.lineNumber, t.column)); + if (!a && ((m = this._lastResult) != null && m.canBeReused(e, t.lineNumber, d))) { + const b = new DK(u, t.column - this._lastResult.word.endColumn); + this._lastResult.completionModel.lineContext = b, this._lastResult.acquire(), h = this._lastResult; } else { - const m = await B5(this._languageFeatureService.completionProvider, e, t, new Y1(void 0, sM.createSuggestFilter(o).itemKind, d == null ? void 0 : d.providers), d && { triggerKind: 1, triggerCharacter: d.ch }, n); - let f; - m.needsClipboard && (f = await this._clipboardService.readText()); - const b = new Vd(m.items, t.column, new pP(u, 0), nM.None, o.getOption( + const b = await pE(this._languageFeatureService.completionProvider, e, t, new $W(void 0, yI.createSuggestFilter(o).itemKind, a == null ? void 0 : a.providers), a && { triggerKind: 1, triggerCharacter: a.ch }, n); + let g; + b.needsClipboard && (g = await this._clipboardService.readText()); + const Z = new Ha(b.items, t.column, new DK(u, 0), fI.None, o.getOption( 119 /* EditorOption.suggest */ ), o.getOption( 113 /* EditorOption.snippetSuggestions */ - ), { boostFullMatch: !1, firstMatchCanBeWeak: !1 }, f); - h = new rk(e, t.lineNumber, c, b, m, this._suggestMemoryService); + ), { boostFullMatch: !1, firstMatchCanBeWeak: !1 }, g); + h = new x5(e, t.lineNumber, d, Z, b, this._suggestMemoryService); } return this._lastResult = h, h; } handleItemDidShow(e, t) { - t.completion.resolve(Ye.None); + t.completion.resolve(Fe.None); } freeInlineCompletions(e) { e.release(); } _getTriggerCharacterInfo(e, t) { var o; - const i = e.getValueInRange(M.fromPositions({ lineNumber: t.lineNumber, column: t.column - 1 }, t)), n = /* @__PURE__ */ new Set(); - for (const r of this._languageFeatureService.completionProvider.all(e)) - (o = r.triggerCharacters) != null && o.includes(i) && n.add(r); + const i = e.getValueInRange(I.fromPositions({ lineNumber: t.lineNumber, column: t.column - 1 }, t)), n = /* @__PURE__ */ new Set(); + for (const l of this._languageFeatureService.completionProvider.all(e)) + (o = l.triggerCharacters) != null && o.includes(i) && n.add(l); if (n.size !== 0) return { providers: n, ch: i }; } }; -lk = p7([ - Ly(0, ge), - Ly(1, od), - Ly(2, jI), - Ly(3, ft) -], lk); -b0(lk); -class xAe extends he { +C5 = j7([ + Tf(0, me), + Tf(1, da), + Tf(2, uC), + Tf(3, gt) +], C5); +V0(C5); +class gLe extends he { constructor() { super({ id: "editor.action.forceRetokenize", @@ -93409,16 +93409,16 @@ class xAe extends he { return; const i = t.getModel(); i.tokenization.resetTokenization(); - const n = new on(); + const n = new ln(); i.tokenization.forceTokenization(i.getLineCount()), n.stop(), console.log(`tokenization took ${n.elapsed()}`); } } -ee(xAe); -const o_ = class o_ extends Ss { +ee(gLe); +const WS = class WS extends Vs { constructor() { super({ - id: o_.ID, - title: Ie({ key: "toggle.tabMovesFocus", comment: ["Turn on/off use of tab key for moving focus around VS Code"] }, "Toggle Tab Key Moves Focus"), + id: WS.ID, + title: Ce({ key: "toggle.tabMovesFocus", comment: ["Turn on/off use of tab key for moving focus around VS Code"] }, "Toggle Tab Key Moves Focus"), precondition: void 0, keybinding: { primary: 2091, @@ -93430,64 +93430,64 @@ const o_ = class o_ extends Ss { /* KeybindingWeight.EditorContrib */ }, metadata: { - description: Ie("tabMovesFocusDescriptions", "Determines whether the tab key moves focus around the workbench or inserts the tab character in the current editor. This is also called tab trapping, tab navigation, or tab focus mode.") + description: Ce("tabMovesFocusDescriptions", "Determines whether the tab key moves focus around the workbench or inserts the tab character in the current editor. This is also called tab trapping, tab navigation, or tab focus mode.") }, f1: !0 }); } run() { - const t = !db.getTabFocusMode(); - db.setTabFocusMode(t), bs(t ? p("toggle.tabMovesFocus.on", "Pressing Tab will now move focus to the next focusable element") : p("toggle.tabMovesFocus.off", "Pressing Tab will now insert the tab character")); + const t = !gZ.getTabFocusMode(); + gZ.setTabFocusMode(t), ys(t ? p("toggle.tabMovesFocus.on", "Pressing Tab will now move focus to the next focusable element") : p("toggle.tabMovesFocus.off", "Pressing Tab will now insert the tab character")); } }; -o_.ID = "editor.action.toggleTabFocusMode"; -let ak = o_; -kt(ak); -class s9 { +WS.ID = "editor.action.toggleTabFocusMode"; +let R5 = WS; +kt(R5); +class RE { static computeUnicodeHighlights(e, t, i) { - const n = i ? i.startLineNumber : 1, o = i ? i.endLineNumber : e.getLineCount(), r = new TP(t), l = r.getCandidateCodePoints(); - let a; - l === "allNonBasicAscii" ? a = new RegExp("[^\\t\\n\\r\\x20-\\x7E]", "g") : a = new RegExp(`${MAe(Array.from(l))}`, "g"); - const c = new Fp(null, a), d = []; - let h = !1, u, g = 0, m = 0, f = 0; - e: for (let b = n, y = o; b <= y; b++) { - const w = e.getLineContent(b), C = w.length; - c.reset(0); + const n = i ? i.startLineNumber : 1, o = i ? i.endLineNumber : e.getLineCount(), l = new n3(t), r = l.getCandidateCodePoints(); + let c; + r === "allNonBasicAscii" ? c = new RegExp("[^\\t\\n\\r\\x20-\\x7E]", "g") : c = new RegExp(`${ZLe(Array.from(r))}`, "g"); + const d = new Pp(null, c), a = []; + let h = !1, u, m = 0, b = 0, g = 0; + e: for (let Z = n, f = o; Z <= f; Z++) { + const y = e.getLineContent(Z), W = y.length; + d.reset(0); do - if (u = c.next(w), u) { - let S = u.index, L = u.index + u[0].length; - if (S > 0) { - const v = w.charCodeAt(S - 1); - Hi(v) && S--; + if (u = d.next(y), u) { + let G = u.index, X = u.index + u[0].length; + if (G > 0) { + const w = y.charCodeAt(G - 1); + Bi(w) && G--; } - if (L + 1 < C) { - const v = w.charCodeAt(L - 1); - Hi(v) && L++; + if (X + 1 < W) { + const w = y.charCodeAt(X - 1); + Bi(w) && X++; } - const x = w.substring(S, L); - let Z = Gw(S + 1, yE, w, 0); - Z && Z.endColumn <= S + 1 && (Z = null); - const _ = r.shouldHighlightNonBasicASCII(x, Z ? Z.word : null); - if (_ !== 0) { - if (_ === 3 ? g++ : _ === 2 ? m++ : _ === 1 ? f++ : B_(), d.length >= 1e3) { + const L = y.substring(G, X); + let S = _y(G + 1, Av, y, 0); + S && S.endColumn <= G + 1 && (S = null); + const x = l.shouldHighlightNonBasicASCII(L, S ? S.word : null); + if (x !== 0) { + if (x === 3 ? m++ : x === 2 ? b++ : x === 1 ? g++ : ox(), a.length >= 1e3) { h = !0; break e; } - d.push(new M(b, S + 1, b, L + 1)); + a.push(new I(Z, G + 1, Z, X + 1)); } } while (u); } return { - ranges: d, + ranges: a, hasMore: h, - ambiguousCharacterCount: g, - invisibleCharacterCount: m, - nonBasicAsciiCharacterCount: f + ambiguousCharacterCount: m, + invisibleCharacterCount: b, + nonBasicAsciiCharacterCount: g }; } static computeUnicodeHighlightReason(e, t) { - const i = new TP(t); + const i = new n3(t); switch (i.shouldHighlightNonBasicASCII(e, null)) { case 0: return null; @@ -93497,8 +93497,8 @@ class s9 { /* UnicodeHighlighterReasonKind.Invisible */ }; case 3: { - const o = e.codePointAt(0), r = i.ambiguousCharacters.getPrimaryConfusable(o), l = Tw.getLocales().filter((a) => !Tw.getInstance(/* @__PURE__ */ new Set([...t.allowedLocales, a])).isAmbiguous(o)); - return { kind: 0, confusableWith: String.fromCodePoint(r), notAmbiguousInLocales: l }; + const o = e.codePointAt(0), l = i.ambiguousCharacters.getPrimaryConfusable(o), r = Ky.getLocales().filter((c) => !Ky.getInstance(/* @__PURE__ */ new Set([...t.allowedLocales, c])).isAmbiguous(o)); + return { kind: 0, confusableWith: String.fromCodePoint(l), notAmbiguousInLocales: r }; } case 1: return { @@ -93508,20 +93508,20 @@ class s9 { } } } -function MAe(s, e) { - return `[${Po(s.map((i) => String.fromCodePoint(i)).join(""))}]`; +function ZLe(s, e) { + return `[${Uo(s.map((i) => String.fromCodePoint(i)).join(""))}]`; } -class TP { +class n3 { constructor(e) { - this.options = e, this.allowedCodePoints = new Set(e.allowedCodePoints), this.ambiguousCharacters = Tw.getInstance(new Set(e.allowedLocales)); + this.options = e, this.allowedCodePoints = new Set(e.allowedCodePoints), this.ambiguousCharacters = Ky.getInstance(new Set(e.allowedLocales)); } getCandidateCodePoints() { if (this.options.nonBasicASCII) return "allNonBasicAscii"; const e = /* @__PURE__ */ new Set(); if (this.options.invisibleCharacters) - for (const t of sg.codePoints) - DP(String.fromCodePoint(t)) || e.add(t); + for (const t of dm.codePoints) + s3(String.fromCodePoint(t)) || e.add(t); if (this.options.ambiguousCharacters) for (const t of this.ambiguousCharacters.getConfusableCodePoints()) e.add(t); @@ -93537,32 +93537,32 @@ class TP { return 1; let n = !1, o = !1; if (t) - for (const r of t) { - const l = r.codePointAt(0), a = uC(r); - n = n || a, !a && !this.ambiguousCharacters.isAmbiguous(l) && !sg.isInvisibleCharacter(l) && (o = !0); + for (const l of t) { + const r = l.codePointAt(0), c = IG(l); + n = n || c, !c && !this.ambiguousCharacters.isAmbiguous(r) && !dm.isInvisibleCharacter(r) && (o = !0); } return ( /* Don't allow mixing weird looking characters with ASCII */ !n && /* Is there an obviously weird looking character? */ - o ? 0 : this.options.invisibleCharacters && !DP(e) && sg.isInvisibleCharacter(i) ? 2 : this.options.ambiguousCharacters && this.ambiguousCharacters.isAmbiguous(i) ? 3 : 0 + o ? 0 : this.options.invisibleCharacters && !s3(e) && dm.isInvisibleCharacter(i) ? 2 : this.options.ambiguousCharacters && this.ambiguousCharacters.isAmbiguous(i) ? 3 : 0 ); } } -function DP(s) { +function s3(s) { return s === " " || s === ` ` || s === " "; } -var ZAe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var fLe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, VP = function(s, e) { +}, o3 = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let ck = class extends R { +let N5 = class extends J { get enabled() { return this._enabled; } @@ -93570,17 +93570,17 @@ let ck = class extends R { e ? (this.el.setAttribute("aria-disabled", "false"), this.el.tabIndex = 0, this.el.style.pointerEvents = "auto", this.el.style.opacity = "1", this.el.style.cursor = "pointer", this._enabled = !1) : (this.el.setAttribute("aria-disabled", "true"), this.el.tabIndex = -1, this.el.style.pointerEvents = "none", this.el.style.opacity = "0.4", this.el.style.cursor = "default", this._enabled = !0), this._enabled = e; } constructor(e, t, i = {}, n, o) { - super(), this._link = t, this._hoverService = n, this._enabled = !0, this.el = Q(e, ce("a.monaco-link", { + super(), this._link = t, this._hoverService = n, this._enabled = !0, this.el = O(e, de("a.monaco-link", { tabIndex: t.tabIndex ?? 0, href: t.href - }, t.label)), this.hoverDelegate = i.hoverDelegate ?? As("mouse"), this.setTooltip(t.title), this.el.setAttribute("role", "button"); - const r = this._register(new et(this.el, "click")), l = this._register(new et(this.el, "keypress")), a = se.chain(l.event, (h) => h.map((u) => new Vt(u)).filter( + }, t.label)), this.hoverDelegate = i.hoverDelegate ?? Is("mouse"), this.setTooltip(t.title), this.el.setAttribute("role", "button"); + const l = this._register(new et(this.el, "click")), r = this._register(new et(this.el, "keypress")), c = se.chain(r.event, (h) => h.map((u) => new Yt(u)).filter( (u) => u.keyCode === 3 /* KeyCode.Enter */ - )), c = this._register(new et(this.el, Rt.Tap)).event; - this._register(Rn.addTarget(this.el)); - const d = se.any(r.event, a, c); - this._register(d((h) => { + )), d = this._register(new et(this.el, Jt.Tap)).event; + this._register(En.addTarget(this.el)); + const a = se.any(l.event, c, d); + this._register(a((h) => { this.enabled && (tt.stop(h, !0), i != null && i.opener ? i.opener(this._link.href) : o.open(this._link.href, { allowCommands: !0 })); })), this.enabled = !0; } @@ -93588,24 +93588,24 @@ let ck = class extends R { this.hoverDelegate.showNativeHover ? this.el.title = e ?? "" : !this.hover && e ? this.hover = this._register(this._hoverService.setupManagedHover(this.hoverDelegate, this.el, e)) : this.hover && this.hover.update(e); } }; -ck = ZAe([ - VP(3, Pa), - VP(4, Bs) -], ck); -var f7 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +N5 = fLe([ + o3(3, Bc), + o3(4, Ps) +], N5); +var q7 = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, b7 = function(s, e) { +}, $7 = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const _Ae = 26; -let dk = class extends R { +const yLe = 26; +let w5 = class extends J { constructor(e, t) { - super(), this._editor = e, this.instantiationService = t, this.banner = this._register(this.instantiationService.createInstance(hk)); + super(), this._editor = e, this.instantiationService = t, this.banner = this._register(this.instantiationService.createInstance(T5)); } hide() { this._editor.setBanner(null, 0), this.banner.clear(); @@ -93617,15 +93617,15 @@ let dk = class extends R { var t; this.hide(), (t = e.onClose) == null || t.call(e); } - }), this._editor.setBanner(this.banner.element, _Ae); + }), this._editor.setBanner(this.banner.element, yLe); } }; -dk = f7([ - b7(1, Se) -], dk); -let hk = class extends R { +w5 = q7([ + $7(1, Ge) +], w5); +let T5 = class extends J { constructor(e) { - super(), this.instantiationService = e, this.markdownRenderer = this.instantiationService.createInstance(Qc, {}), this.element = ce("div.editor-banner"), this.element.tabIndex = 0; + super(), this.instantiationService = e, this.markdownRenderer = this.instantiationService.createInstance(ea, {}), this.element = de("div.editor-banner"), this.element.tabIndex = 0; } getAriaLabel(e) { if (e.ariaLabel) @@ -93635,79 +93635,79 @@ let hk = class extends R { } getBannerMessage(e) { if (typeof e == "string") { - const t = ce("span"); + const t = de("span"); return t.innerText = e, t; } return this.markdownRenderer.render(e).element; } clear() { - gn(this.element); + bn(this.element); } show(e) { - gn(this.element); + bn(this.element); const t = this.getAriaLabel(e); t && this.element.setAttribute("aria-label", t); - const i = Q(this.element, ce("div.icon-container")); - i.setAttribute("aria-hidden", "true"), e.icon && i.appendChild(ce(`div${Ze.asCSSSelector(e.icon)}`)); - const n = Q(this.element, ce("div.message-container")); - if (n.setAttribute("aria-hidden", "true"), n.appendChild(this.getBannerMessage(e.message)), this.messageActionsContainer = Q(this.element, ce("div.message-actions-container")), e.actions) - for (const r of e.actions) - this._register(this.instantiationService.createInstance(ck, this.messageActionsContainer, { ...r, tabIndex: -1 }, {})); - const o = Q(this.element, ce("div.action-container")); - this.actionBar = this._register(new Yo(o)), this.actionBar.push(this._register(new lo("banner.close", "Close Banner", Ze.asClassName(i4), !0, () => { + const i = O(this.element, de("div.icon-container")); + i.setAttribute("aria-hidden", "true"), e.icon && i.appendChild(de(`div${Se.asCSSSelector(e.icon)}`)); + const n = O(this.element, de("div.message-container")); + if (n.setAttribute("aria-hidden", "true"), n.appendChild(this.getBannerMessage(e.message)), this.messageActionsContainer = O(this.element, de("div.message-actions-container")), e.actions) + for (const l of e.actions) + this._register(this.instantiationService.createInstance(N5, this.messageActionsContainer, { ...l, tabIndex: -1 }, {})); + const o = O(this.element, de("div.action-container")); + this.actionBar = this._register(new Ao(o)), this.actionBar.push(this._register(new ao("banner.close", "Close Banner", Se.asClassName(HO), !0, () => { typeof e.onClose == "function" && e.onClose(); })), { icon: !0, label: !1 }), this.actionBar.setFocusable(!1); } }; -hk = f7([ - b7(0, Se) -], hk); -const y7 = $e("workspaceTrustManagementService"); -var o9 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +T5 = q7([ + $7(0, Ge) +], T5); +const e8 = $e("workspaceTrustManagementService"); +var NE = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Ff = function(s, e) { +}, Pg = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const IAe = Bt("extensions-warning-message", te.warning, p("warningIcon", "Icon shown with a warning message in the extensions editor.")); -var ib; -let j1 = (ib = class extends R { +const WLe = Kt("extensions-warning-message", te.warning, p("warningIcon", "Icon shown with a warning message in the extensions editor.")); +var cZ; +let dG = (cZ = class extends J { constructor(e, t, i, n) { super(), this._editor = e, this._editorWorkerService = t, this._workspaceTrustService = i, this._highlighter = null, this._bannerClosed = !1, this._updateState = (o) => { if (o && o.hasMore) { if (this._bannerClosed) return; - const r = Math.max(o.ambiguousCharacterCount, o.nonBasicAsciiCharacterCount, o.invisibleCharacterCount); - let l; - if (o.nonBasicAsciiCharacterCount >= r) - l = { + const l = Math.max(o.ambiguousCharacterCount, o.nonBasicAsciiCharacterCount, o.invisibleCharacterCount); + let r; + if (o.nonBasicAsciiCharacterCount >= l) + r = { message: p("unicodeHighlighting.thisDocumentHasManyNonBasicAsciiUnicodeCharacters", "This document contains many non-basic ASCII unicode characters"), - command: new $1() + command: new hG() }; - else if (o.ambiguousCharacterCount >= r) - l = { + else if (o.ambiguousCharacterCount >= l) + r = { message: p("unicodeHighlighting.thisDocumentHasManyAmbiguousUnicodeCharacters", "This document contains many ambiguous unicode characters"), - command: new Tm() + command: new Jb() }; - else if (o.invisibleCharacterCount >= r) - l = { + else if (o.invisibleCharacterCount >= l) + r = { message: p("unicodeHighlighting.thisDocumentHasManyInvisibleUnicodeCharacters", "This document contains many invisible unicode characters"), - command: new q1() + command: new aG() }; else throw new Error("Unreachable"); this._bannerController.show({ id: "unicodeHighlightBanner", - message: l.message, - icon: IAe, + message: r.message, + icon: WLe, actions: [ { - label: l.command.shortLabel, - href: `command:${l.command.id}` + label: r.command.shortLabel, + href: `command:${r.command.id}` } ], onClose: () => { @@ -93716,7 +93716,7 @@ let j1 = (ib = class extends R { }); } else this._bannerController.hide(); - }, this._bannerController = this._register(n.createInstance(dk, e)), this._register(this._editor.onDidChangeModel(() => { + }, this._bannerController = this._register(n.createInstance(w5, e)), this._register(this._editor.onDidChangeModel(() => { this._bannerClosed = !1, this._updateHighlighter(); })), this._options = e.getOption( 126 @@ -93739,7 +93739,7 @@ let j1 = (ib = class extends R { _updateHighlighter() { if (this._updateState(null), this._highlighter && (this._highlighter.dispose(), this._highlighter = null), !this._editor.hasModel()) return; - const e = NAe(this._workspaceTrustService.isWorkspaceTrusted(), this._options); + const e = GLe(this._workspaceTrustService.isWorkspaceTrusted(), this._options); if ([ e.nonBasicASCII, e.ambiguousCharacters, @@ -93753,33 +93753,33 @@ let j1 = (ib = class extends R { includeComments: e.includeComments, includeStrings: e.includeStrings, allowedCodePoints: Object.keys(e.allowedCharacters).map((i) => i.codePointAt(0)), - allowedLocales: Object.keys(e.allowedLocales).map((i) => i === "_os" ? new Intl.NumberFormat().resolvedOptions().locale : i === "_vscode" ? Q8 : i) + allowedLocales: Object.keys(e.allowedLocales).map((i) => i === "_os" ? new Intl.NumberFormat().resolvedOptions().locale : i === "_vscode" ? z6 : i) }; - this._editorWorkerService.canComputeUnicodeHighlights(this._editor.getModel().uri) ? this._highlighter = new uk(this._editor, t, this._updateState, this._editorWorkerService) : this._highlighter = new WAe(this._editor, t, this._updateState); + this._editorWorkerService.canComputeUnicodeHighlights(this._editor.getModel().uri) ? this._highlighter = new M5(this._editor, t, this._updateState, this._editorWorkerService) : this._highlighter = new XLe(this._editor, t, this._updateState); } getDecorationInfo(e) { return this._highlighter ? this._highlighter.getDecorationInfo(e) : null; } -}, ib.ID = "editor.contrib.unicodeHighlighter", ib); -j1 = o9([ - Ff(1, Ps), - Ff(2, y7), - Ff(3, Se) -], j1); -function NAe(s, e) { +}, cZ.ID = "editor.contrib.unicodeHighlighter", cZ); +dG = NE([ + Pg(1, Us), + Pg(2, e8), + Pg(3, Ge) +], dG); +function GLe(s, e) { return { - nonBasicASCII: e.nonBasicASCII === _o ? !s : e.nonBasicASCII, + nonBasicASCII: e.nonBasicASCII === Ro ? !s : e.nonBasicASCII, ambiguousCharacters: e.ambiguousCharacters, invisibleCharacters: e.invisibleCharacters, - includeComments: e.includeComments === _o ? !s : e.includeComments, - includeStrings: e.includeStrings === _o ? !s : e.includeStrings, + includeComments: e.includeComments === Ro ? !s : e.includeComments, + includeStrings: e.includeStrings === Ro ? !s : e.includeStrings, allowedCharacters: e.allowedCharacters, allowedLocales: e.allowedLocales }; } -let uk = class extends R { +let M5 = class extends J { constructor(e, t, i, n) { - super(), this._editor = e, this._options = t, this._updateState = i, this._editorWorkerService = n, this._model = this._editor.getModel(), this._decorations = this._editor.createDecorationsCollection(), this._updateSoon = this._register(new Zt(() => this._update(), 250)), this._register(this._editor.onDidChangeModelContent(() => { + super(), this._editor = e, this._options = t, this._updateState = i, this._editorWorkerService = n, this._model = this._editor.getModel(), this._decorations = this._editor.createDecorationsCollection(), this._updateSoon = this._register(new St(() => this._update(), 250)), this._register(this._editor.onDidChangeModelContent(() => { this._updateSoon.schedule(); })), this._updateSoon.schedule(); } @@ -93803,7 +93803,7 @@ let uk = class extends R { for (const n of t.ranges) i.push({ range: n, - options: SM.instance.getDecorationFromOptions(this._options) + options: vI.instance.getDecorationFromOptions(this._options) }); this._decorations.set(i); }); @@ -93812,22 +93812,22 @@ let uk = class extends R { if (!this._decorations.has(e)) return null; const t = this._editor.getModel(); - if (!yX(t, e)) + if (!AJ(t, e)) return null; const i = t.getValueInRange(e.range); return { - reason: C7(i, this._options), - inComment: wX(t, e), - inString: CX(t, e) + reason: i8(i, this._options), + inComment: KJ(t, e), + inString: UJ(t, e) }; } }; -uk = o9([ - Ff(3, Ps) -], uk); -class WAe extends R { +M5 = NE([ + Pg(3, Us) +], M5); +class XLe extends J { constructor(e, t, i) { - super(), this._editor = e, this._options = t, this._updateState = i, this._model = this._editor.getModel(), this._decorations = this._editor.createDecorationsCollection(), this._updateSoon = this._register(new Zt(() => this._update(), 250)), this._register(this._editor.onDidLayoutChange(() => { + super(), this._editor = e, this._options = t, this._updateState = i, this._model = this._editor.getModel(), this._decorations = this._editor.createDecorationsCollection(), this._updateSoon = this._register(new St(() => this._update(), 250)), this._register(this._editor.onDidLayoutChange(() => { this._updateSoon.schedule(); })), this._register(this._editor.onDidScrollChange(() => { this._updateSoon.schedule(); @@ -93855,93 +93855,93 @@ class WAe extends R { hasMore: !1 }; for (const n of e) { - const o = s9.computeUnicodeHighlights(this._model, this._options, n); - for (const r of o.ranges) - i.ranges.push(r); + const o = RE.computeUnicodeHighlights(this._model, this._options, n); + for (const l of o.ranges) + i.ranges.push(l); i.ambiguousCharacterCount += i.ambiguousCharacterCount, i.invisibleCharacterCount += i.invisibleCharacterCount, i.nonBasicAsciiCharacterCount += i.nonBasicAsciiCharacterCount, i.hasMore = i.hasMore || o.hasMore; } if (!i.hasMore) for (const n of i.ranges) - t.push({ range: n, options: SM.instance.getDecorationFromOptions(this._options) }); + t.push({ range: n, options: vI.instance.getDecorationFromOptions(this._options) }); this._updateState(i), this._decorations.set(t); } getDecorationInfo(e) { if (!this._decorations.has(e)) return null; const t = this._editor.getModel(), i = t.getValueInRange(e.range); - return yX(t, e) ? { - reason: C7(i, this._options), - inComment: wX(t, e), - inString: CX(t, e) + return AJ(t, e) ? { + reason: i8(i, this._options), + inComment: KJ(t, e), + inString: UJ(t, e) } : null; } } -const w7 = p("unicodeHighlight.configureUnicodeHighlightOptions", "Configure Unicode Highlight Options"); -let gk = class { +const t8 = p("unicodeHighlight.configureUnicodeHighlightOptions", "Configure Unicode Highlight Options"); +let Y5 = class { constructor(e, t, i) { this._editor = e, this._languageService = t, this._openerService = i, this.hoverOrdinal = 5; } computeSync(e, t) { if (!this._editor.hasModel() || e.type !== 1) return []; - const i = this._editor.getModel(), n = this._editor.getContribution(j1.ID); + const i = this._editor.getModel(), n = this._editor.getContribution(dG.ID); if (!n) return []; - const o = [], r = /* @__PURE__ */ new Set(); - let l = 300; - for (const a of t) { - const c = n.getDecorationInfo(a); - if (!c) + const o = [], l = /* @__PURE__ */ new Set(); + let r = 300; + for (const c of t) { + const d = n.getDecorationInfo(c); + if (!d) continue; - const h = i.getValueInRange(a.range).codePointAt(0), u = jW(h); - let g; - switch (c.reason.kind) { + const h = i.getValueInRange(c.range).codePointAt(0), u = mN(h); + let m; + switch (d.reason.kind) { case 0: { - uC(c.reason.confusableWith) ? g = p("unicodeHighlight.characterIsAmbiguousASCII", "The character {0} could be confused with the ASCII character {1}, which is more common in source code.", u, jW(c.reason.confusableWith.codePointAt(0))) : g = p("unicodeHighlight.characterIsAmbiguous", "The character {0} could be confused with the character {1}, which is more common in source code.", u, jW(c.reason.confusableWith.codePointAt(0))); + IG(d.reason.confusableWith) ? m = p("unicodeHighlight.characterIsAmbiguousASCII", "The character {0} could be confused with the ASCII character {1}, which is more common in source code.", u, mN(d.reason.confusableWith.codePointAt(0))) : m = p("unicodeHighlight.characterIsAmbiguous", "The character {0} could be confused with the character {1}, which is more common in source code.", u, mN(d.reason.confusableWith.codePointAt(0))); break; } case 1: - g = p("unicodeHighlight.characterIsInvisible", "The character {0} is invisible.", u); + m = p("unicodeHighlight.characterIsInvisible", "The character {0} is invisible.", u); break; case 2: - g = p("unicodeHighlight.characterIsNonBasicAscii", "The character {0} is not a basic ASCII character.", u); + m = p("unicodeHighlight.characterIsNonBasicAscii", "The character {0} is not a basic ASCII character.", u); break; } - if (r.has(g)) + if (l.has(m)) continue; - r.add(g); - const m = { + l.add(m); + const b = { codePoint: h, - reason: c.reason, - inComment: c.inComment, - inString: c.inString - }, f = p("unicodeHighlight.adjustSettings", "Adjust settings"), b = `command:${LM.ID}?${encodeURIComponent(JSON.stringify(m))}`, y = new Vn("", !0).appendMarkdown(g).appendText(" ").appendLink(b, f, w7); - o.push(new Rr(this, a.range, [y], !1, l++)); + reason: d.reason, + inComment: d.inComment, + inString: d.inString + }, g = p("unicodeHighlight.adjustSettings", "Adjust settings"), Z = `command:${JI.ID}?${encodeURIComponent(JSON.stringify(b))}`, f = new kn("", !0).appendMarkdown(m).appendText(" ").appendLink(Z, g, t8); + o.push(new Dl(this, c.range, [f], !1, r++)); } return o; } renderHoverParts(e, t) { - return Xfe(e, t, this._editor, this._languageService, this._openerService); + return wZe(e, t, this._editor, this._languageService, this._openerService); } }; -gk = o9([ - Ff(1, ri), - Ff(2, Bs) -], gk); -function mk(s) { +Y5 = NE([ + Pg(1, ri), + Pg(2, Ps) +], Y5); +function k5(s) { return `U+${s.toString(16).padStart(4, "0")}`; } -function jW(s) { - let e = `\`${mk(s)}\``; - return sg.isInvisibleCharacter(s) || (e += ` "${`${vAe(s)}`}"`), e; +function mN(s) { + let e = `\`${k5(s)}\``; + return dm.isInvisibleCharacter(s) || (e += ` "${`${VLe(s)}`}"`), e; } -function vAe(s) { +function VLe(s) { return s === 96 ? "`` ` ``" : "`" + String.fromCodePoint(s) + "`"; } -function C7(s, e) { - return s9.computeUnicodeHighlightReason(s, e); +function i8(s, e) { + return RE.computeUnicodeHighlightReason(s, e); } -const r_ = class r_ { +const GS = class GS { constructor() { this.map = /* @__PURE__ */ new Map(); } @@ -93951,7 +93951,7 @@ const r_ = class r_ { getDecoration(e, t) { const i = `${e}${t}`; let n = this.map.get(i); - return n || (n = Re.createDynamic({ + return n || (n = Je.createDynamic({ description: "unicode-highlight", stickiness: 1, className: "unicode-highlight", @@ -93963,235 +93963,235 @@ const r_ = class r_ { }), this.map.set(i, n)), n; } }; -r_.instance = new r_(); -let SM = r_; -class TAe extends he { +GS.instance = new GS(); +let vI = GS; +class LLe extends he { constructor() { super({ - id: Tm.ID, + id: Jb.ID, label: p("action.unicodeHighlight.disableHighlightingInComments", "Disable highlighting of characters in comments"), alias: "Disable highlighting of characters in comments", precondition: void 0 }), this.shortLabel = p("unicodeHighlight.disableHighlightingInComments.shortLabel", "Disable Highlight In Comments"); } async run(e, t, i) { - const n = e == null ? void 0 : e.get(Ke); + const n = e == null ? void 0 : e.get(Qe); n && this.runAction(n); } async runAction(e) { await e.updateValue( - Ws.includeComments, + Ts.includeComments, !1, 2 /* ConfigurationTarget.USER */ ); } } -class DAe extends he { +class ILe extends he { constructor() { super({ - id: Tm.ID, + id: Jb.ID, label: p("action.unicodeHighlight.disableHighlightingInStrings", "Disable highlighting of characters in strings"), alias: "Disable highlighting of characters in strings", precondition: void 0 }), this.shortLabel = p("unicodeHighlight.disableHighlightingInStrings.shortLabel", "Disable Highlight In Strings"); } async run(e, t, i) { - const n = e == null ? void 0 : e.get(Ke); + const n = e == null ? void 0 : e.get(Qe); n && this.runAction(n); } async runAction(e) { await e.updateValue( - Ws.includeStrings, + Ts.includeStrings, !1, 2 /* ConfigurationTarget.USER */ ); } } -const l_ = class l_ extends he { +const XS = class XS extends he { constructor() { super({ - id: l_.ID, + id: XS.ID, label: p("action.unicodeHighlight.disableHighlightingOfAmbiguousCharacters", "Disable highlighting of ambiguous characters"), alias: "Disable highlighting of ambiguous characters", precondition: void 0 }), this.shortLabel = p("unicodeHighlight.disableHighlightingOfAmbiguousCharacters.shortLabel", "Disable Ambiguous Highlight"); } async run(e, t, i) { - const n = e == null ? void 0 : e.get(Ke); + const n = e == null ? void 0 : e.get(Qe); n && this.runAction(n); } async runAction(e) { await e.updateValue( - Ws.ambiguousCharacters, + Ts.ambiguousCharacters, !1, 2 /* ConfigurationTarget.USER */ ); } }; -l_.ID = "editor.action.unicodeHighlight.disableHighlightingOfAmbiguousCharacters"; -let Tm = l_; -const a_ = class a_ extends he { +XS.ID = "editor.action.unicodeHighlight.disableHighlightingOfAmbiguousCharacters"; +let Jb = XS; +const VS = class VS extends he { constructor() { super({ - id: a_.ID, + id: VS.ID, label: p("action.unicodeHighlight.disableHighlightingOfInvisibleCharacters", "Disable highlighting of invisible characters"), alias: "Disable highlighting of invisible characters", precondition: void 0 }), this.shortLabel = p("unicodeHighlight.disableHighlightingOfInvisibleCharacters.shortLabel", "Disable Invisible Highlight"); } async run(e, t, i) { - const n = e == null ? void 0 : e.get(Ke); + const n = e == null ? void 0 : e.get(Qe); n && this.runAction(n); } async runAction(e) { await e.updateValue( - Ws.invisibleCharacters, + Ts.invisibleCharacters, !1, 2 /* ConfigurationTarget.USER */ ); } }; -a_.ID = "editor.action.unicodeHighlight.disableHighlightingOfInvisibleCharacters"; -let q1 = a_; -const c_ = class c_ extends he { +VS.ID = "editor.action.unicodeHighlight.disableHighlightingOfInvisibleCharacters"; +let aG = VS; +const LS = class LS extends he { constructor() { super({ - id: c_.ID, + id: LS.ID, label: p("action.unicodeHighlight.disableHighlightingOfNonBasicAsciiCharacters", "Disable highlighting of non basic ASCII characters"), alias: "Disable highlighting of non basic ASCII characters", precondition: void 0 }), this.shortLabel = p("unicodeHighlight.disableHighlightingOfNonBasicAsciiCharacters.shortLabel", "Disable Non ASCII Highlight"); } async run(e, t, i) { - const n = e == null ? void 0 : e.get(Ke); + const n = e == null ? void 0 : e.get(Qe); n && this.runAction(n); } async runAction(e) { await e.updateValue( - Ws.nonBasicASCII, + Ts.nonBasicASCII, !1, 2 /* ConfigurationTarget.USER */ ); } }; -c_.ID = "editor.action.unicodeHighlight.disableHighlightingOfNonBasicAsciiCharacters"; -let $1 = c_; -const d_ = class d_ extends he { +LS.ID = "editor.action.unicodeHighlight.disableHighlightingOfNonBasicAsciiCharacters"; +let hG = LS; +const IS = class IS extends he { constructor() { super({ - id: d_.ID, + id: IS.ID, label: p("action.unicodeHighlight.showExcludeOptions", "Show Exclude Options"), alias: "Show Exclude Options", precondition: void 0 }); } async run(e, t, i) { - const { codePoint: n, reason: o, inString: r, inComment: l } = i, a = String.fromCodePoint(n), c = e.get(ld), d = e.get(Ke); - function h(m) { - return sg.isInvisibleCharacter(m) ? p("unicodeHighlight.excludeInvisibleCharFromBeingHighlighted", "Exclude {0} (invisible character) from being highlighted", mk(m)) : p("unicodeHighlight.excludeCharFromBeingHighlighted", "Exclude {0} from being highlighted", `${mk(m)} "${a}"`); + const { codePoint: n, reason: o, inString: l, inComment: r } = i, c = String.fromCodePoint(n), d = e.get(ha), a = e.get(Qe); + function h(b) { + return dm.isInvisibleCharacter(b) ? p("unicodeHighlight.excludeInvisibleCharFromBeingHighlighted", "Exclude {0} (invisible character) from being highlighted", k5(b)) : p("unicodeHighlight.excludeCharFromBeingHighlighted", "Exclude {0} from being highlighted", `${k5(b)} "${c}"`); } const u = []; if (o.kind === 0) - for (const m of o.notAmbiguousInLocales) + for (const b of o.notAmbiguousInLocales) u.push({ - label: p("unicodeHighlight.allowCommonCharactersInLanguage", 'Allow unicode characters that are more common in the language "{0}".', m), + label: p("unicodeHighlight.allowCommonCharactersInLanguage", 'Allow unicode characters that are more common in the language "{0}".', b), run: async () => { - kAe(d, [m]); + xLe(a, [b]); } }); if (u.push({ label: h(n), - run: () => VAe(d, [n]) - }), l) { - const m = new TAe(); - u.push({ label: m.label, run: async () => m.runAction(d) }); - } else if (r) { - const m = new DAe(); - u.push({ label: m.label, run: async () => m.runAction(d) }); + run: () => SLe(a, [n]) + }), r) { + const b = new LLe(); + u.push({ label: b.label, run: async () => b.runAction(a) }); + } else if (l) { + const b = new ILe(); + u.push({ label: b.label, run: async () => b.runAction(a) }); } if (o.kind === 0) { - const m = new Tm(); - u.push({ label: m.label, run: async () => m.runAction(d) }); + const b = new Jb(); + u.push({ label: b.label, run: async () => b.runAction(a) }); } else if (o.kind === 1) { - const m = new q1(); - u.push({ label: m.label, run: async () => m.runAction(d) }); + const b = new aG(); + u.push({ label: b.label, run: async () => b.runAction(a) }); } else if (o.kind === 2) { - const m = new $1(); - u.push({ label: m.label, run: async () => m.runAction(d) }); + const b = new hG(); + u.push({ label: b.label, run: async () => b.runAction(a) }); } else - GAe(o); - const g = await c.pick(u, { title: w7 }); - g && await g.run(); + CLe(o); + const m = await d.pick(u, { title: t8 }); + m && await m.run(); } }; -d_.ID = "editor.action.unicodeHighlight.showExcludeOptions"; -let LM = d_; -async function VAe(s, e) { - const t = s.getValue(Ws.allowedCharacters); +IS.ID = "editor.action.unicodeHighlight.showExcludeOptions"; +let JI = IS; +async function SLe(s, e) { + const t = s.getValue(Ts.allowedCharacters); let i; typeof t == "object" && t ? i = t : i = {}; for (const n of e) i[String.fromCodePoint(n)] = !0; await s.updateValue( - Ws.allowedCharacters, + Ts.allowedCharacters, i, 2 /* ConfigurationTarget.USER */ ); } -async function kAe(s, e) { +async function xLe(s, e) { var n; - const t = (n = s.inspect(Ws.allowedLocales).user) == null ? void 0 : n.value; + const t = (n = s.inspect(Ts.allowedLocales).user) == null ? void 0 : n.value; let i; typeof t == "object" && t ? i = Object.assign({}, t) : i = {}; for (const o of e) i[o] = !0; await s.updateValue( - Ws.allowedLocales, + Ts.allowedLocales, i, 2 /* ConfigurationTarget.USER */ ); } -function GAe(s) { +function CLe(s) { throw new Error(`Unexpected value: ${s}`); } -ee(Tm); -ee(q1); -ee($1); -ee(LM); -gt( - j1.ID, - j1, +ee(Jb); +ee(aG); +ee(hG); +ee(JI); +mt( + dG.ID, + dG, 1 /* EditorContributionInstantiation.AfterFirstRender */ ); -Om.register(gk); -const r9 = $e("dialogService"); -var RAe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +Ob.register(Y5); +const wE = $e("dialogService"); +var RLe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, kP = function(s, e) { +}, l3 = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const S7 = "ignoreUnusualLineTerminators"; -function EAe(s, e, t) { - s.setModelProperty(e.uri, S7, t); +const n8 = "ignoreUnusualLineTerminators"; +function NLe(s, e, t) { + s.setModelProperty(e.uri, n8, t); } -function XAe(s, e) { - return s.getModelProperty(e.uri, S7); +function wLe(s, e) { + return s.getModelProperty(e.uri, n8); } -var nb; -let AM = (nb = class extends R { +var dZ; +let HI = (dZ = class extends J { constructor(e, t, i) { super(), this._editor = e, this._dialogService = t, this._codeEditorService = i, this._isPresentingDialog = !1, this._config = this._editor.getOption( 127 @@ -94214,7 +94214,7 @@ let AM = (nb = class extends R { if (this._config === "off" || !this._editor.hasModel()) return; const e = this._editor.getModel(); - if (!e.mightContainUnusualLineTerminators() || XAe(this._codeEditorService, e) === !0 || this._editor.getOption( + if (!e.mightContainUnusualLineTerminators() || wLe(this._codeEditorService, e) === !0 || this._editor.getOption( 92 /* EditorOption.readOnly */ )) @@ -94230,7 +94230,7 @@ let AM = (nb = class extends R { this._isPresentingDialog = !0, i = await this._dialogService.confirm({ title: p("unusualLineTerminators.title", "Unusual Line Terminators"), message: p("unusualLineTerminators.message", "Detected unusual line terminators"), - detail: p("unusualLineTerminators.detail", "The file '{0}' contains one or more unusual line terminator characters, like Line Separator (LS) or Paragraph Separator (PS).\n\nIt is recommended to remove them from the file. This can be configured via `editor.unusualLineTerminators`.", Cr(e.uri)), + detail: p("unusualLineTerminators.detail", "The file '{0}' contains one or more unusual line terminator characters, like Line Separator (LS) or Paragraph Separator (PS).\n\nIt is recommended to remove them from the file. This can be configured via `editor.unusualLineTerminators`.", Vl(e.uri)), primaryButton: p({ key: "unusualLineTerminators.fix", comment: ["&& denotes a mnemonic"] }, "&&Remove Unusual Line Terminators"), cancelButton: p("unusualLineTerminators.ignore", "Ignore") }); @@ -94238,40 +94238,40 @@ let AM = (nb = class extends R { this._isPresentingDialog = !1; } if (!i.confirmed) { - EAe(this._codeEditorService, e, !0); + NLe(this._codeEditorService, e, !0); return; } e.removeUnusualLineTerminators(this._editor.getSelections()); } -}, nb.ID = "editor.contrib.unusualLineTerminatorsDetector", nb); -AM = RAe([ - kP(1, r9), - kP(2, ft) -], AM); -gt( - AM.ID, - AM, +}, dZ.ID = "editor.contrib.unusualLineTerminatorsDetector", dZ); +HI = RLe([ + l3(1, wE), + l3(2, gt) +], HI); +mt( + HI.ID, + HI, 1 /* EditorContributionInstantiation.AfterFirstRender */ ); -const QS = "**", GP = "/", BL = "[/\\\\]", OL = "[^/\\\\]", FAe = /\//g; -function RP(s, e) { +const dX = "**", r3 = "/", oV = "[/\\\\]", lV = "[^/\\\\]", TLe = /\//g; +function c3(s, e) { switch (s) { case 0: return ""; case 1: - return `${OL}*?`; + return `${lV}*?`; default: - return `(?:${BL}|${OL}+${BL}${e ? `|${BL}${OL}+` : ""})*?`; + return `(?:${oV}|${lV}+${oV}${e ? `|${oV}${lV}+` : ""})*?`; } } -function EP(s, e) { +function d3(s, e) { if (!s) return []; const t = []; let i = !1, n = !1, o = ""; - for (const r of s) { - switch (r) { + for (const l of s) { + switch (l) { case e: if (!i && !n) { t.push(o), o = ""; @@ -94291,319 +94291,319 @@ function EP(s, e) { n = !1; break; } - o += r; + o += l; } return o && t.push(o), t; } -function L7(s) { +function s8(s) { if (!s) return ""; let e = ""; - const t = EP(s, GP); - if (t.every((i) => i === QS)) + const t = d3(s, r3); + if (t.every((i) => i === dX)) e = ".*"; else { let i = !1; t.forEach((n, o) => { - if (n === QS) { + if (n === dX) { if (i) return; - e += RP(2, o === t.length - 1); + e += c3(2, o === t.length - 1); } else { - let r = !1, l = "", a = !1, c = ""; - for (const d of n) { - if (d !== "}" && r) { - l += d; + let l = !1, r = "", c = !1, d = ""; + for (const a of n) { + if (a !== "}" && l) { + r += a; continue; } - if (a && (d !== "]" || !c)) { + if (c && (a !== "]" || !d)) { let h; - d === "-" ? h = d : (d === "^" || d === "!") && !c ? h = "^" : d === GP ? h = "" : h = Po(d), c += h; + a === "-" ? h = a : (a === "^" || a === "!") && !d ? h = "^" : a === r3 ? h = "" : h = Uo(a), d += h; continue; } - switch (d) { + switch (a) { case "{": - r = !0; + l = !0; continue; case "[": - a = !0; + c = !0; continue; case "}": { - const u = `(?:${EP(l, ",").map((g) => L7(g)).join("|")})`; - e += u, r = !1, l = ""; + const u = `(?:${d3(r, ",").map((m) => s8(m)).join("|")})`; + e += u, l = !1, r = ""; break; } case "]": { - e += "[" + c + "]", a = !1, c = ""; + e += "[" + d + "]", c = !1, d = ""; break; } case "?": - e += OL; + e += lV; continue; case "*": - e += RP(1); + e += c3(1); continue; default: - e += Po(d); + e += Uo(a); } } o < t.length - 1 && // more segments to come after this - (t[o + 1] !== QS || // next segment is not **, or... - o + 2 < t.length) && (e += BL); + (t[o + 1] !== dX || // next segment is not **, or... + o + 2 < t.length) && (e += oV); } - i = n === QS; + i = n === dX; }); } return e; } -const YAe = /^\*\*\/\*\.[\w\.-]+$/, zAe = /^\*\*\/([\w\.-]+)\/?$/, PAe = /^{\*\*\/\*?[\w\.-]+\/?(,\*\*\/\*?[\w\.-]+\/?)*}$/, BAe = /^{\*\*\/\*?[\w\.-]+(\/(\*\*)?)?(,\*\*\/\*?[\w\.-]+(\/(\*\*)?)?)*}$/, OAe = /^\*\*((\/[\w\.-]+)+)\/?$/, HAe = /^([\w\.-]+(\/[\w\.-]+)*)\/?$/, XP = new id(1e4), FP = function() { +const MLe = /^\*\*\/\*\.[\w\.-]+$/, YLe = /^\*\*\/([\w\.-]+)\/?$/, kLe = /^{\*\*\/\*?[\w\.-]+\/?(,\*\*\/\*?[\w\.-]+\/?)*}$/, vLe = /^{\*\*\/\*?[\w\.-]+(\/(\*\*)?)?(,\*\*\/\*?[\w\.-]+(\/(\*\*)?)?)*}$/, JLe = /^\*\*((\/[\w\.-]+)+)\/?$/, HLe = /^([\w\.-]+(\/[\w\.-]+)*)\/?$/, a3 = new la(1e4), h3 = function() { return !1; -}, Ia = function() { +}, Tc = function() { return null; }; -function l9(s, e) { +function TE(s, e) { if (!s) - return Ia; + return Tc; let t; typeof s != "string" ? t = s.pattern : t = s, t = t.trim(); const i = `${t}_${!!e.trimForExclusions}`; - let n = XP.get(i); + let n = a3.get(i); if (n) - return YP(n, s); + return u3(n, s); let o; - return YAe.test(t) ? n = JAe(t.substr(4), t) : (o = zAe.exec(qW(t, e))) ? n = UAe(o[1], t) : (e.trimForExclusions ? BAe : PAe).test(t) ? n = KAe(t, e) : (o = OAe.exec(qW(t, e))) ? n = zP(o[1].substr(1), t, !0) : (o = HAe.exec(qW(t, e))) ? n = zP(o[1], t, !1) : n = QAe(t), XP.set(i, n), YP(n, s); + return MLe.test(t) ? n = ELe(t.substr(4), t) : (o = YLe.exec(bN(t, e))) ? n = DLe(o[1], t) : (e.trimForExclusions ? vLe : kLe).test(t) ? n = FLe(t, e) : (o = JLe.exec(bN(t, e))) ? n = m3(o[1].substr(1), t, !0) : (o = HLe.exec(bN(t, e))) ? n = m3(o[1], t, !1) : n = zLe(t), a3.set(i, n), u3(n, s); } -function YP(s, e) { +function u3(s, e) { if (typeof e == "string") return s; const t = function(i, n) { - return Wv(i, e.base, !fs) ? s(I_(i.substr(e.base.length), eh), n) : null; + return jw(i, e.base, !fs) ? s(AS(i.substr(e.base.length), sh), n) : null; }; return t.allBasenames = s.allBasenames, t.allPaths = s.allPaths, t.basenames = s.basenames, t.patterns = s.patterns, t; } -function qW(s, e) { +function bN(s, e) { return e.trimForExclusions && s.endsWith("/**") ? s.substr(0, s.length - 2) : s; } -function JAe(s, e) { +function ELe(s, e) { return function(t, i) { return typeof t == "string" && t.endsWith(s) ? e : null; }; } -function UAe(s, e) { - const t = `/${s}`, i = `\\${s}`, n = function(r, l) { - return typeof r != "string" ? null : l ? l === s ? e : null : r === s || r.endsWith(t) || r.endsWith(i) ? e : null; +function DLe(s, e) { + const t = `/${s}`, i = `\\${s}`, n = function(l, r) { + return typeof l != "string" ? null : r ? r === s ? e : null : l === s || l.endsWith(t) || l.endsWith(i) ? e : null; }, o = [s]; return n.basenames = o, n.patterns = [e], n.allBasenames = o, n; } -function KAe(s, e) { - const t = x7(s.slice(1, -1).split(",").map((l) => l9(l, e)).filter((l) => l !== Ia), s), i = t.length; +function FLe(s, e) { + const t = l8(s.slice(1, -1).split(",").map((r) => TE(r, e)).filter((r) => r !== Tc), s), i = t.length; if (!i) - return Ia; + return Tc; if (i === 1) return t[0]; - const n = function(l, a) { - for (let c = 0, d = t.length; c < d; c++) - if (t[c](l, a)) + const n = function(r, c) { + for (let d = 0, a = t.length; d < a; d++) + if (t[d](r, c)) return s; return null; - }, o = t.find((l) => !!l.allBasenames); + }, o = t.find((r) => !!r.allBasenames); o && (n.allBasenames = o.allBasenames); - const r = t.reduce((l, a) => a.allPaths ? l.concat(a.allPaths) : l, []); - return r.length && (n.allPaths = r), n; + const l = t.reduce((r, c) => c.allPaths ? r.concat(c.allPaths) : r, []); + return l.length && (n.allPaths = l), n; } -function zP(s, e, t) { - const i = eh === vi.sep, n = i ? s : s.replace(FAe, eh), o = eh + n, r = vi.sep + s; - let l; - return t ? l = function(a, c) { - return typeof a == "string" && (a === n || a.endsWith(o) || !i && (a === s || a.endsWith(r))) ? e : null; - } : l = function(a, c) { - return typeof a == "string" && (a === n || !i && a === s) ? e : null; - }, l.allPaths = [(t ? "*/" : "./") + s], l; +function m3(s, e, t) { + const i = sh === Mi.sep, n = i ? s : s.replace(TLe, sh), o = sh + n, l = Mi.sep + s; + let r; + return t ? r = function(c, d) { + return typeof c == "string" && (c === n || c.endsWith(o) || !i && (c === s || c.endsWith(l))) ? e : null; + } : r = function(c, d) { + return typeof c == "string" && (c === n || !i && c === s) ? e : null; + }, r.allPaths = [(t ? "*/" : "./") + s], r; } -function QAe(s) { +function zLe(s) { try { - const e = new RegExp(`^${L7(s)}$`); + const e = new RegExp(`^${s8(s)}$`); return function(t) { return e.lastIndex = 0, typeof t == "string" && e.test(t) ? s : null; }; } catch { - return Ia; + return Tc; } } -function jAe(s, e, t) { - return !s || typeof e != "string" ? !1 : A7(s)(e, void 0, t); +function ALe(s, e, t) { + return !s || typeof e != "string" ? !1 : o8(s)(e, void 0, t); } -function A7(s, e = {}) { +function o8(s, e = {}) { if (!s) - return FP; - if (typeof s == "string" || qAe(s)) { - const t = l9(s, e); - if (t === Ia) - return FP; + return h3; + if (typeof s == "string" || KLe(s)) { + const t = TE(s, e); + if (t === Tc) + return h3; const i = function(n, o) { return !!t(n, o); }; return t.allBasenames && (i.allBasenames = t.allBasenames), t.allPaths && (i.allPaths = t.allPaths), i; } - return $Ae(s, e); + return ULe(s, e); } -function qAe(s) { +function KLe(s) { const e = s; return e ? typeof e.base == "string" && typeof e.pattern == "string" : !1; } -function $Ae(s, e) { - const t = x7(Object.getOwnPropertyNames(s).map((l) => exe(l, s[l], e)).filter((l) => l !== Ia)), i = t.length; +function ULe(s, e) { + const t = l8(Object.getOwnPropertyNames(s).map((r) => PLe(r, s[r], e)).filter((r) => r !== Tc)), i = t.length; if (!i) - return Ia; - if (!t.some((l) => !!l.requiresSiblings)) { + return Tc; + if (!t.some((r) => !!r.requiresSiblings)) { if (i === 1) return t[0]; - const l = function(d, h) { + const r = function(a, h) { let u; - for (let g = 0, m = t.length; g < m; g++) { - const f = t[g](d, h); - if (typeof f == "string") - return f; - C2(f) && (u || (u = []), u.push(f)); + for (let m = 0, b = t.length; m < b; m++) { + const g = t[m](a, h); + if (typeof g == "string") + return g; + FN(g) && (u || (u = []), u.push(g)); } return u ? (async () => { - for (const g of u) { - const m = await g; - if (typeof m == "string") - return m; + for (const m of u) { + const b = await m; + if (typeof b == "string") + return b; } return null; })() : null; - }, a = t.find((d) => !!d.allBasenames); - a && (l.allBasenames = a.allBasenames); - const c = t.reduce((d, h) => h.allPaths ? d.concat(h.allPaths) : d, []); - return c.length && (l.allPaths = c), l; - } - const n = function(l, a, c) { - let d, h; - for (let u = 0, g = t.length; u < g; u++) { - const m = t[u]; - m.requiresSiblings && c && (a || (a = $d(l)), d || (d = a.substr(0, a.length - Zq(l).length))); - const f = m(l, a, d, c); - if (typeof f == "string") - return f; - C2(f) && (h || (h = []), h.push(f)); + }, c = t.find((a) => !!a.allBasenames); + c && (r.allBasenames = c.allBasenames); + const d = t.reduce((a, h) => h.allPaths ? a.concat(h.allPaths) : a, []); + return d.length && (r.allPaths = d), r; + } + const n = function(r, c, d) { + let a, h; + for (let u = 0, m = t.length; u < m; u++) { + const b = t[u]; + b.requiresSiblings && d && (c || (c = nh(r)), a || (a = c.substr(0, c.length - f$(r).length))); + const g = b(r, c, a, d); + if (typeof g == "string") + return g; + FN(g) && (h || (h = []), h.push(g)); } return h ? (async () => { for (const u of h) { - const g = await u; - if (typeof g == "string") - return g; + const m = await u; + if (typeof m == "string") + return m; } return null; })() : null; - }, o = t.find((l) => !!l.allBasenames); + }, o = t.find((r) => !!r.allBasenames); o && (n.allBasenames = o.allBasenames); - const r = t.reduce((l, a) => a.allPaths ? l.concat(a.allPaths) : l, []); - return r.length && (n.allPaths = r), n; + const l = t.reduce((r, c) => c.allPaths ? r.concat(c.allPaths) : r, []); + return l.length && (n.allPaths = l), n; } -function exe(s, e, t) { +function PLe(s, e, t) { if (e === !1) - return Ia; - const i = l9(s, t); - if (i === Ia) - return Ia; + return Tc; + const i = TE(s, t); + if (i === Tc) + return Tc; if (typeof e == "boolean") return i; if (e) { const n = e.when; if (typeof n == "string") { - const o = (r, l, a, c) => { - if (!c || !i(r, l)) + const o = (l, r, c, d) => { + if (!d || !i(l, r)) return null; - const d = n.replace("$(basename)", () => a), h = c(d); - return C2(h) ? h.then((u) => u ? s : null) : h ? s : null; + const a = n.replace("$(basename)", () => c), h = d(a); + return FN(h) ? h.then((u) => u ? s : null) : h ? s : null; }; return o.requiresSiblings = !0, o; } } return i; } -function x7(s, e) { - const t = s.filter((l) => !!l.basenames); +function l8(s, e) { + const t = s.filter((r) => !!r.basenames); if (t.length < 2) return s; - const i = t.reduce((l, a) => { - const c = a.basenames; - return c ? l.concat(c) : l; + const i = t.reduce((r, c) => { + const d = c.basenames; + return d ? r.concat(d) : r; }, []); let n; if (e) { n = []; - for (let l = 0, a = i.length; l < a; l++) + for (let r = 0, c = i.length; r < c; r++) n.push(e); } else - n = t.reduce((l, a) => { - const c = a.patterns; - return c ? l.concat(c) : l; + n = t.reduce((r, c) => { + const d = c.patterns; + return d ? r.concat(d) : r; }, []); - const o = function(l, a) { - if (typeof l != "string") + const o = function(r, c) { + if (typeof r != "string") return null; - if (!a) { - let d; - for (d = l.length; d > 0; d--) { - const h = l.charCodeAt(d - 1); + if (!c) { + let a; + for (a = r.length; a > 0; a--) { + const h = r.charCodeAt(a - 1); if (h === 47 || h === 92) break; } - a = l.substr(d); + c = r.substr(a); } - const c = i.indexOf(a); - return c !== -1 ? n[c] : null; + const d = i.indexOf(c); + return d !== -1 ? n[d] : null; }; o.basenames = i, o.patterns = n, o.allBasenames = i; - const r = s.filter((l) => !l.basenames); - return r.push(o), r; + const l = s.filter((r) => !r.basenames); + return l.push(o), l; } -function a9(s, e, t, i, n, o) { +function ME(s, e, t, i, n, o) { if (Array.isArray(s)) { - let r = 0; - for (const l of s) { - const a = a9(l, e, t, i, n, o); - if (a === 10) - return a; - a > r && (r = a); + let l = 0; + for (const r of s) { + const c = ME(r, e, t, i, n, o); + if (c === 10) + return c; + c > l && (l = c); } - return r; + return l; } else { if (typeof s == "string") return i ? s === "*" ? 5 : s === t ? 10 : 0 : 0; if (s) { - const { language: r, pattern: l, scheme: a, hasAccessToAllModels: c, notebookType: d } = s; - if (!i && !c) + const { language: l, pattern: r, scheme: c, hasAccessToAllModels: d, notebookType: a } = s; + if (!i && !d) return 0; - d && n && (e = n); + a && n && (e = n); let h = 0; - if (a) - if (a === e.scheme) + if (c) + if (c === e.scheme) h = 10; - else if (a === "*") + else if (c === "*") h = 5; else return 0; - if (r) - if (r === t) + if (l) + if (l === t) h = 10; - else if (r === "*") + else if (l === "*") h = Math.max(h, 5); else return 0; - if (d) - if (d === o) + if (a) + if (a === o) h = 10; - else if (d === "*" && o !== void 0) + else if (a === "*" && o !== void 0) h = Math.max(h, 5); else return 0; - if (l) { + if (r) { let u; - if (typeof l == "string" ? u = l : u = { ...l, base: HH(l.base) }, u === e.fsPath || jAe(u, e.fsPath)) + if (typeof r == "string" ? u = r : u = { ...r, base: CB(r.base) }, u === e.fsPath || ALe(u, e.fsPath)) h = 10; else return 0; @@ -94613,17 +94613,17 @@ function a9(s, e, t, i, n, o) { return 0; } } -var txe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var BLe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, ixe = function(s, e) { +}, _Le = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class PP { +class b3 { constructor() { this.selector = { language: "*" }; } @@ -94632,156 +94632,156 @@ class PP { lineNumber: t.lineNumber, column: t.column }); - return o ? e.isDisposed() ? void 0 : e.findMatches(o.word, !0, !1, !0, yA, !1).map((l) => ({ - range: l.range, - kind: fb.Text + return o ? e.isDisposed() ? void 0 : e.findMatches(o.word, !0, !1, !0, MV, !1).map((r) => ({ + range: r.range, + kind: XZ.Text })) : Promise.resolve(n); } provideMultiDocumentHighlights(e, t, i, n) { - const o = new sn(), r = e.getWordAtPosition({ + const o = new on(), l = e.getWordAtPosition({ lineNumber: t.lineNumber, column: t.column }); - if (!r) + if (!l) return Promise.resolve(o); - for (const l of [e, ...i]) { - if (l.isDisposed()) + for (const r of [e, ...i]) { + if (r.isDisposed()) continue; - const c = l.findMatches(r.word, !0, !1, !0, yA, !1).map((d) => ({ - range: d.range, - kind: fb.Text + const d = r.findMatches(l.word, !0, !1, !0, MV, !1).map((a) => ({ + range: a.range, + kind: XZ.Text })); - c && o.set(l.uri, c); + d && o.set(r.uri, d); } return o; } } -let pk = class extends R { +let v5 = class extends J { constructor(e) { - super(), this._register(e.documentHighlightProvider.register("*", new PP())), this._register(e.multiDocumentHighlightProvider.register("*", new PP())); + super(), this._register(e.documentHighlightProvider.register("*", new b3())), this._register(e.multiDocumentHighlightProvider.register("*", new b3())); } }; -pk = txe([ - ixe(0, ge) -], pk); -var M7 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +v5 = BLe([ + _Le(0, me) +], v5); +var r8 = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, HL = function(s, e) { +}, rV = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Li, fk; -const c9 = new ae("hasWordHighlights", !1); -function Z7(s, e, t, i) { +}, Vi, J5; +const YE = new ce("hasWordHighlights", !1); +function c8(s, e, t, i) { const n = s.ordered(e); - return qR(n.map((o) => () => Promise.resolve(o.provideDocumentHighlights(e, t, i)).then(void 0, wi)), (o) => o != null).then((o) => { + return Vv(n.map((o) => () => Promise.resolve(o.provideDocumentHighlights(e, t, i)).then(void 0, Wi)), (o) => o != null).then((o) => { if (o) { - const r = new sn(); - return r.set(e.uri, o), r; + const l = new on(); + return l.set(e.uri, o), l; } - return new sn(); + return new on(); }); } -function nxe(s, e, t, i, n, o) { - const r = s.ordered(e); - return qR(r.map((l) => () => { - const a = o.filter((c) => EU(c)).filter((c) => a9(l.selector, c.uri, c.getLanguageId(), !0, void 0, void 0) > 0); - return Promise.resolve(l.provideMultiDocumentHighlights(e, t, a, n)).then(void 0, wi); - }), (l) => l != null); +function QLe(s, e, t, i, n, o) { + const l = s.ordered(e); + return Vv(l.map((r) => () => { + const c = o.filter((d) => WQ(d)).filter((d) => ME(r.selector, d.uri, d.getLanguageId(), !0, void 0, void 0) > 0); + return Promise.resolve(r.provideMultiDocumentHighlights(e, t, c, n)).then(void 0, Wi); + }), (r) => r != null); } -class _7 { +class d8 { constructor(e, t, i) { this._model = e, this._selection = t, this._wordSeparators = i, this._wordRange = this._getCurrentWordRange(e, t), this._result = null; } get result() { - return this._result || (this._result = Ui((e) => this._compute(this._model, this._selection, this._wordSeparators, e))), this._result; + return this._result || (this._result = Qi((e) => this._compute(this._model, this._selection, this._wordSeparators, e))), this._result; } _getCurrentWordRange(e, t) { const i = e.getWordAtPosition(t.getPosition()); - return i ? new M(t.startLineNumber, i.startColumn, t.startLineNumber, i.endColumn) : null; + return i ? new I(t.startLineNumber, i.startColumn, t.startLineNumber, i.endColumn) : null; } isValid(e, t, i) { - const n = t.startLineNumber, o = t.startColumn, r = t.endColumn, l = this._getCurrentWordRange(e, t); - let a = !!(this._wordRange && this._wordRange.equalsRange(l)); - for (let c = 0, d = i.length; !a && c < d; c++) { - const h = i.getRange(c); - h && h.startLineNumber === n && h.startColumn <= o && h.endColumn >= r && (a = !0); + const n = t.startLineNumber, o = t.startColumn, l = t.endColumn, r = this._getCurrentWordRange(e, t); + let c = !!(this._wordRange && this._wordRange.equalsRange(r)); + for (let d = 0, a = i.length; !c && d < a; d++) { + const h = i.getRange(d); + h && h.startLineNumber === n && h.startColumn <= o && h.endColumn >= l && (c = !0); } - return a; + return c; } cancel() { this.result.cancel(); } } -class sxe extends _7 { +class OLe extends d8 { constructor(e, t, i, n) { super(e, t, i), this._providers = n; } _compute(e, t, i, n) { - return Z7(this._providers, e, t.getPosition(), n).then((o) => o || new sn()); + return c8(this._providers, e, t.getPosition(), n).then((o) => o || new on()); } } -class oxe extends _7 { +class jLe extends d8 { constructor(e, t, i, n, o) { super(e, t, i), this._providers = n, this._otherModels = o; } _compute(e, t, i, n) { - return nxe(this._providers, e, t.getPosition(), i, n, this._otherModels).then((o) => o || new sn()); + return QLe(this._providers, e, t.getPosition(), i, n, this._otherModels).then((o) => o || new on()); } } -function rxe(s, e, t, i, n) { - return new sxe(e, t, n, s); +function qLe(s, e, t, i, n) { + return new OLe(e, t, n, s); } -function lxe(s, e, t, i, n, o) { - return new oxe(e, t, n, s, o); +function $Le(s, e, t, i, n, o) { + return new jLe(e, t, n, s, o); } -zs("_executeDocumentHighlights", async (s, e, t) => { - const i = s.get(ge), n = await Z7(i.documentHighlightProvider, e, t, Ye.None); +Ks("_executeDocumentHighlights", async (s, e, t) => { + const i = s.get(me), n = await c8(i.documentHighlightProvider, e, t, Fe.None); return n == null ? void 0 : n.get(e.uri); }); -var Ah; -let bk = (Ah = class { +var xh; +let H5 = (xh = class { constructor(e, t, i, n, o) { - this.toUnhook = new U(), this.workerRequestTokenId = 0, this.workerRequestCompleted = !1, this.workerRequestValue = new sn(), this.lastCursorPositionChangeTime = 0, this.renderDecorationsTimer = -1, this.runDelayer = this.toUnhook.add(new fr(50)), this.editor = e, this.providers = t, this.multiDocumentProviders = i, this.codeEditorService = o, this._hasWordHighlights = c9.bindTo(n), this._ignorePositionChangeEvent = !1, this.occurrencesHighlight = this.editor.getOption( + this.toUnhook = new _(), this.workerRequestTokenId = 0, this.workerRequestCompleted = !1, this.workerRequestValue = new on(), this.lastCursorPositionChangeTime = 0, this.renderDecorationsTimer = -1, this.runDelayer = this.toUnhook.add(new yl(50)), this.editor = e, this.providers = t, this.multiDocumentProviders = i, this.codeEditorService = o, this._hasWordHighlights = YE.bindTo(n), this._ignorePositionChangeEvent = !1, this.occurrencesHighlight = this.editor.getOption( 81 /* EditorOption.occurrencesHighlight */ - ), this.model = this.editor.getModel(), this.toUnhook.add(e.onDidChangeCursorPosition((r) => { + ), this.model = this.editor.getModel(), this.toUnhook.add(e.onDidChangeCursorPosition((l) => { this._ignorePositionChangeEvent || this.occurrencesHighlight !== "off" && this.runDelayer.trigger(() => { - this._onPositionChanged(r); + this._onPositionChanged(l); }); - })), this.toUnhook.add(e.onDidFocusEditorText((r) => { + })), this.toUnhook.add(e.onDidFocusEditorText((l) => { this.occurrencesHighlight !== "off" && (this.workerRequest || this.runDelayer.trigger(() => { this._run(); })); - })), this.toUnhook.add(e.onDidChangeModelContent((r) => { - N_(this.model.uri, "output") || this._stopAll(); - })), this.toUnhook.add(e.onDidChangeModel((r) => { - !r.newModelUrl && r.oldModelUrl ? this._stopSingular() : Li.query && this._run(); - })), this.toUnhook.add(e.onDidChangeConfiguration((r) => { - var a, c; - const l = this.editor.getOption( + })), this.toUnhook.add(e.onDidChangeModelContent((l) => { + KS(this.model.uri, "output") || this._stopAll(); + })), this.toUnhook.add(e.onDidChangeModel((l) => { + !l.newModelUrl && l.oldModelUrl ? this._stopSingular() : Vi.query && this._run(); + })), this.toUnhook.add(e.onDidChangeConfiguration((l) => { + var c, d; + const r = this.editor.getOption( 81 /* EditorOption.occurrencesHighlight */ ); - if (this.occurrencesHighlight !== l) - switch (this.occurrencesHighlight = l, l) { + if (this.occurrencesHighlight !== r) + switch (this.occurrencesHighlight = r, r) { case "off": this._stopAll(); break; case "singleFile": - this._stopAll((c = (a = Li.query) == null ? void 0 : a.modelInfo) == null ? void 0 : c.model); + this._stopAll((d = (c = Vi.query) == null ? void 0 : c.modelInfo) == null ? void 0 : d.model); break; case "multiFile": - Li.query && this._run(!0); + Vi.query && this._run(!0); break; default: - console.warn("Unknown occurrencesHighlight setting value:", l); + console.warn("Unknown occurrencesHighlight setting value:", r); break; } - })), this.decorations = this.editor.createDecorationsCollection(), this.workerRequestTokenId = 0, this.workerRequest = null, this.workerRequestCompleted = !1, this.lastCursorPositionChangeTime = 0, this.renderDecorationsTimer = -1, Li.query && this._run(); + })), this.decorations = this.editor.createDecorationsCollection(), this.workerRequestTokenId = 0, this.workerRequest = null, this.workerRequestCompleted = !1, this.lastCursorPositionChangeTime = 0, this.renderDecorationsTimer = -1, Vi.query && this._run(); } hasDecorations() { return this.decorations.length > 0; @@ -94790,7 +94790,7 @@ let bk = (Ah = class { this.occurrencesHighlight !== "off" && (this.runDelayer.cancel(), this._run()); } _getSortedHighlights() { - return this.decorations.getRanges().sort(M.compareRangesUsingStarts); + return this.decorations.getRanges().sort(I.compareRangesUsingStarts); } moveNext() { const e = this._getSortedHighlights(), i = (e.findIndex((o) => o.containsPosition(this.editor.getPosition())) + 1) % e.length, n = e[i]; @@ -94798,8 +94798,8 @@ let bk = (Ah = class { this._ignorePositionChangeEvent = !0, this.editor.setPosition(n.getStartPosition()), this.editor.revealRangeInCenterIfOutsideViewport(n); const o = this._getWord(); if (o) { - const r = this.editor.getModel().getLineContent(n.startLineNumber); - bs(`${r}, ${i + 1} of ${e.length} for '${o.word}'`); + const l = this.editor.getModel().getLineContent(n.startLineNumber); + ys(`${l}, ${i + 1} of ${e.length} for '${o.word}'`); } } finally { this._ignorePositionChangeEvent = !1; @@ -94811,8 +94811,8 @@ let bk = (Ah = class { this._ignorePositionChangeEvent = !0, this.editor.setPosition(n.getStartPosition()), this.editor.revealRangeInCenterIfOutsideViewport(n); const o = this._getWord(); if (o) { - const r = this.editor.getModel().getLineContent(n.startLineNumber); - bs(`${r}, ${i + 1} of ${e.length} for '${o.word}'`); + const l = this.editor.getModel().getLineContent(n.startLineNumber); + ys(`${l}, ${i + 1} of ${e.length} for '${o.word}'`); } } finally { this._ignorePositionChangeEvent = !1; @@ -94821,27 +94821,27 @@ let bk = (Ah = class { _removeSingleDecorations() { if (!this.editor.hasModel()) return; - const e = Li.storedDecorationIDs.get(this.editor.getModel().uri); - e && (this.editor.removeDecorations(e), Li.storedDecorationIDs.delete(this.editor.getModel().uri), this.decorations.length > 0 && (this.decorations.clear(), this._hasWordHighlights.set(!1))); + const e = Vi.storedDecorationIDs.get(this.editor.getModel().uri); + e && (this.editor.removeDecorations(e), Vi.storedDecorationIDs.delete(this.editor.getModel().uri), this.decorations.length > 0 && (this.decorations.clear(), this._hasWordHighlights.set(!1))); } _removeAllDecorations(e) { const t = this.codeEditorService.listCodeEditors(), i = []; for (const n of t) { - if (!n.hasModel() || d1(n.getModel().uri, e == null ? void 0 : e.uri)) + if (!n.hasModel() || XW(n.getModel().uri, e == null ? void 0 : e.uri)) continue; - const o = Li.storedDecorationIDs.get(n.getModel().uri); + const o = Vi.storedDecorationIDs.get(n.getModel().uri); if (!o) continue; n.removeDecorations(o), i.push(n.getModel().uri); - const r = Hh.get(n); - r != null && r.wordHighlighter && r.wordHighlighter.decorations.length > 0 && (r.wordHighlighter.decorations.clear(), r.wordHighlighter.workerRequest = null, r.wordHighlighter._hasWordHighlights.set(!1)); + const l = Oh.get(n); + l != null && l.wordHighlighter && l.wordHighlighter.decorations.length > 0 && (l.wordHighlighter.decorations.clear(), l.wordHighlighter.workerRequest = null, l.wordHighlighter._hasWordHighlights.set(!1)); } for (const n of i) - Li.storedDecorationIDs.delete(n); + Vi.storedDecorationIDs.delete(n); } _stopSingular() { var e, t, i, n; - this._removeSingleDecorations(), this.editor.hasTextFocus() && (((e = this.editor.getModel()) == null ? void 0 : e.uri.scheme) !== Ge.vscodeNotebookCell && ((i = (t = Li.query) == null ? void 0 : t.modelInfo) == null ? void 0 : i.model.uri.scheme) !== Ge.vscodeNotebookCell ? (Li.query = null, this._run()) : (n = Li.query) != null && n.modelInfo && (Li.query.modelInfo = null)), this.renderDecorationsTimer !== -1 && (clearTimeout(this.renderDecorationsTimer), this.renderDecorationsTimer = -1), this.workerRequest !== null && (this.workerRequest.cancel(), this.workerRequest = null), this.workerRequestCompleted || (this.workerRequestTokenId++, this.workerRequestCompleted = !0); + this._removeSingleDecorations(), this.editor.hasTextFocus() && (((e = this.editor.getModel()) == null ? void 0 : e.uri.scheme) !== ve.vscodeNotebookCell && ((i = (t = Vi.query) == null ? void 0 : t.modelInfo) == null ? void 0 : i.model.uri.scheme) !== ve.vscodeNotebookCell ? (Vi.query = null, this._run()) : (n = Vi.query) != null && n.modelInfo && (Vi.query.modelInfo = null)), this.renderDecorationsTimer !== -1 && (clearTimeout(this.renderDecorationsTimer), this.renderDecorationsTimer = -1), this.workerRequest !== null && (this.workerRequest.cancel(), this.workerRequest = null), this.workerRequestCompleted || (this.workerRequestTokenId++, this.workerRequestCompleted = !0); } _stopAll(e) { this._removeAllDecorations(e), this.renderDecorationsTimer !== -1 && (clearTimeout(this.renderDecorationsTimer), this.renderDecorationsTimer = -1), this.workerRequest !== null && (this.workerRequest.cancel(), this.workerRequest = null), this.workerRequestCompleted || (this.workerRequestTokenId++, this.workerRequestCompleted = !0); @@ -94852,7 +94852,7 @@ let bk = (Ah = class { this._stopAll(); return; } - if (e.reason !== 3 && ((t = this.editor.getModel()) == null ? void 0 : t.uri.scheme) !== Ge.vscodeNotebookCell) { + if (e.reason !== 3 && ((t = this.editor.getModel()) == null ? void 0 : t.uri.scheme) !== ve.vscodeNotebookCell) { this._stopAll(); return; } @@ -94868,28 +94868,28 @@ let bk = (Ah = class { getOtherModelsToHighlight(e) { if (!e) return []; - if (e.uri.scheme === Ge.vscodeNotebookCell) { - const o = [], r = this.codeEditorService.listCodeEditors(); - for (const l of r) { - const a = l.getModel(); - a && a !== e && a.uri.scheme === Ge.vscodeNotebookCell && o.push(a); + if (e.uri.scheme === ve.vscodeNotebookCell) { + const o = [], l = this.codeEditorService.listCodeEditors(); + for (const r of l) { + const c = r.getModel(); + c && c !== e && c.uri.scheme === ve.vscodeNotebookCell && o.push(c); } return o; } const i = [], n = this.codeEditorService.listCodeEditors(); for (const o of n) { - if (!zfe(o)) + if (!YZe(o)) continue; - const r = o.getModel(); - r && e === r.modified && i.push(r.modified); + const l = o.getModel(); + l && e === l.modified && i.push(l.modified); } if (i.length) return i; if (this.occurrencesHighlight === "singleFile") return []; for (const o of n) { - const r = o.getModel(); - r && r !== e && i.push(r); + const l = o.getModel(); + l && l !== e && i.push(l); } return i; } @@ -94897,52 +94897,52 @@ let bk = (Ah = class { var n, o; let t; if (this.editor.hasTextFocus()) { - const r = this.editor.getSelection(); - if (!r || r.startLineNumber !== r.endLineNumber) { - Li.query = null, this._stopAll(); + const l = this.editor.getSelection(); + if (!l || l.startLineNumber !== l.endLineNumber) { + Vi.query = null, this._stopAll(); return; } - const l = r.startColumn, a = r.endColumn, c = this._getWord(); - if (!c || c.startColumn > l || c.endColumn < a) { - Li.query = null, this._stopAll(); + const r = l.startColumn, c = l.endColumn, d = this._getWord(); + if (!d || d.startColumn > r || d.endColumn < c) { + Vi.query = null, this._stopAll(); return; } - t = this.workerRequest && this.workerRequest.isValid(this.model, r, this.decorations), Li.query = { + t = this.workerRequest && this.workerRequest.isValid(this.model, l, this.decorations), Vi.query = { modelInfo: { model: this.model, - selection: r + selection: l }, - word: c + word: d }; - } else if (!Li.query) { + } else if (!Vi.query) { this._stopAll(); return; } if (this.lastCursorPositionChangeTime = (/* @__PURE__ */ new Date()).getTime(), t) this.workerRequestCompleted && this.renderDecorationsTimer !== -1 && (clearTimeout(this.renderDecorationsTimer), this.renderDecorationsTimer = -1, this._beginRenderDecorations()); - else if (d1(this.editor.getModel().uri, (n = Li.query.modelInfo) == null ? void 0 : n.model.uri)) { + else if (XW(this.editor.getModel().uri, (n = Vi.query.modelInfo) == null ? void 0 : n.model.uri)) { if (!e) { - const a = this.decorations.getRanges(); - for (const c of a) - if (c.containsPosition(this.editor.getPosition())) + const c = this.decorations.getRanges(); + for (const d of c) + if (d.containsPosition(this.editor.getPosition())) return; } this._stopAll(e ? this.model : void 0); - const r = ++this.workerRequestTokenId; + const l = ++this.workerRequestTokenId; this.workerRequestCompleted = !1; - const l = this.getOtherModelsToHighlight(this.editor.getModel()); - if (!Li.query || !Li.query.modelInfo || Li.query.modelInfo.model.isDisposed()) + const r = this.getOtherModelsToHighlight(this.editor.getModel()); + if (!Vi.query || !Vi.query.modelInfo || Vi.query.modelInfo.model.isDisposed()) return; - this.workerRequest = this.computeWithModel(Li.query.modelInfo.model, Li.query.modelInfo.selection, Li.query.word, l), (o = this.workerRequest) == null || o.result.then((a) => { - r === this.workerRequestTokenId && (this.workerRequestCompleted = !0, this.workerRequestValue = a || [], this._beginRenderDecorations()); - }, De); + this.workerRequest = this.computeWithModel(Vi.query.modelInfo.model, Vi.query.modelInfo.selection, Vi.query.word, r), (o = this.workerRequest) == null || o.result.then((c) => { + l === this.workerRequestTokenId && (this.workerRequestCompleted = !0, this.workerRequestValue = c || [], this._beginRenderDecorations()); + }, Me); } } computeWithModel(e, t, i, n) { - return n.length ? lxe(this.multiDocumentProviders, e, t, i, this.editor.getOption( + return n.length ? $Le(this.multiDocumentProviders, e, t, i, this.editor.getOption( 132 /* EditorOption.wordSeparators */ - ), n) : rxe(this.providers, e, t, i, this.editor.getOption( + ), n) : qLe(this.providers, e, t, i, this.editor.getOption( 132 /* EditorOption.wordSeparators */ )); @@ -94958,43 +94958,43 @@ let bk = (Ah = class { this.renderDecorationsTimer = -1; const e = this.codeEditorService.listCodeEditors(); for (const o of e) { - const r = Hh.get(o); - if (!r) + const l = Oh.get(o); + if (!l) continue; - const l = [], a = (t = o.getModel()) == null ? void 0 : t.uri; - if (a && this.workerRequestValue.has(a)) { - const c = Li.storedDecorationIDs.get(a), d = this.workerRequestValue.get(a); - if (d) - for (const u of d) - u.range && l.push({ + const r = [], c = (t = o.getModel()) == null ? void 0 : t.uri; + if (c && this.workerRequestValue.has(c)) { + const d = Vi.storedDecorationIDs.get(c), a = this.workerRequestValue.get(c); + if (a) + for (const u of a) + u.range && r.push({ range: u.range, - options: vSe(u.kind) + options: VXe(u.kind) }); let h = []; o.changeDecorations((u) => { - h = u.deltaDecorations(c ?? [], l); - }), Li.storedDecorationIDs = Li.storedDecorationIDs.set(a, h), l.length > 0 && ((i = r.wordHighlighter) == null || i.decorations.set(l), (n = r.wordHighlighter) == null || n._hasWordHighlights.set(!0)); + h = u.deltaDecorations(d ?? [], r); + }), Vi.storedDecorationIDs = Vi.storedDecorationIDs.set(c, h), r.length > 0 && ((i = l.wordHighlighter) == null || i.decorations.set(r), (n = l.wordHighlighter) == null || n._hasWordHighlights.set(!0)); } } } dispose() { this._stopSingular(), this.toUnhook.dispose(); } -}, Li = Ah, Ah.storedDecorationIDs = new sn(), Ah.query = null, Ah); -bk = Li = M7([ - HL(4, ft) -], bk); -var nm; -let Hh = (nm = class extends R { +}, Vi = xh, xh.storedDecorationIDs = new on(), xh.query = null, xh); +H5 = Vi = r8([ + rV(4, gt) +], H5); +var cb; +let Oh = (cb = class extends J { static get(e) { - return e.getContribution(fk.ID); + return e.getContribution(J5.ID); } constructor(e, t, i, n) { super(), this._wordHighlighter = null; const o = () => { - e.hasModel() && !e.getModel().isTooLargeForTokenization() && (this._wordHighlighter = new bk(e, i.documentHighlightProvider, i.multiDocumentHighlightProvider, t, n)); + e.hasModel() && !e.getModel().isTooLargeForTokenization() && (this._wordHighlighter = new H5(e, i.documentHighlightProvider, i.multiDocumentHighlightProvider, t, n)); }; - this._register(e.onDidChangeModel((r) => { + this._register(e.onDidChangeModel((l) => { this._wordHighlighter && (this._wordHighlighter.dispose(), this._wordHighlighter = null), o(); })), o(); } @@ -95018,30 +95018,30 @@ let Hh = (nm = class extends R { dispose() { this._wordHighlighter && (this._wordHighlighter.dispose(), this._wordHighlighter = null), super.dispose(); } -}, fk = nm, nm.ID = "editor.contrib.wordHighlighter", nm); -Hh = fk = M7([ - HL(1, _e), - HL(2, ge), - HL(3, ft) -], Hh); -class I7 extends he { +}, J5 = cb, cb.ID = "editor.contrib.wordHighlighter", cb); +Oh = J5 = r8([ + rV(1, xe), + rV(2, me), + rV(3, gt) +], Oh); +class a8 extends he { constructor(e, t) { super(t), this._isNext = e; } run(e, t) { - const i = Hh.get(t); + const i = Oh.get(t); i && (this._isNext ? i.moveNext() : i.moveBack()); } } -class axe extends I7 { +class eIe extends a8 { constructor() { super(!0, { id: "editor.action.wordHighlight.next", label: p("wordHighlight.next.label", "Go to Next Symbol Highlight"), alias: "Go to Next Symbol Highlight", - precondition: c9, + precondition: YE, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 65, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -95049,15 +95049,15 @@ class axe extends I7 { }); } } -class cxe extends I7 { +class tIe extends a8 { constructor() { super(!1, { id: "editor.action.wordHighlight.prev", label: p("wordHighlight.previous.label", "Go to Previous Symbol Highlight"), alias: "Go to Previous Symbol Highlight", - precondition: c9, + precondition: YE, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 1089, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -95065,7 +95065,7 @@ class cxe extends I7 { }); } } -class dxe extends he { +class iIe extends he { constructor() { super({ id: "editor.action.wordHighlight.trigger", @@ -95073,7 +95073,7 @@ class dxe extends he { alias: "Trigger Symbol Highlight", precondition: void 0, kbOpts: { - kbExpr: I.editorTextFocus, + kbExpr: C.editorTextFocus, primary: 0, weight: 100 /* KeybindingWeight.EditorContrib */ @@ -95081,61 +95081,61 @@ class dxe extends he { }); } run(e, t, i) { - const n = Hh.get(t); + const n = Oh.get(t); n && n.restoreViewState(!0); } } -gt( - Hh.ID, - Hh, +mt( + Oh.ID, + Oh, 0 /* EditorContributionInstantiation.Eager */ ); -ee(axe); -ee(cxe); -ee(dxe); -b0(pk); -class oN extends zi { +ee(eIe); +ee(tIe); +ee(iIe); +V0(v5); +class WC extends Ai { constructor(e) { super(e), this._inSelectionMode = e.inSelectionMode, this._wordNavigationType = e.wordNavigationType; } runEditorCommand(e, t, i) { if (!t.hasModel()) return; - const n = yr(t.getOption( + const n = Gl(t.getOption( 132 /* EditorOption.wordSeparators */ ), t.getOption( 131 /* EditorOption.wordSegmenterLocales */ - )), o = t.getModel(), r = t.getSelections(), l = r.length > 1, a = r.map((c) => { - const d = new V(c.positionLineNumber, c.positionColumn), h = this._move(n, o, d, this._wordNavigationType, l); - return this._moveTo(c, h, this._inSelectionMode); + )), o = t.getModel(), l = t.getSelections(), r = l.length > 1, c = l.map((d) => { + const a = new Y(d.positionLineNumber, d.positionColumn), h = this._move(n, o, a, this._wordNavigationType, r); + return this._moveTo(d, h, this._inSelectionMode); }); - if (o.pushStackElement(), t._getViewModel().setCursorStates("moveWordCommand", 3, a.map((c) => dt.fromModelSelection(c))), a.length === 1) { - const c = new V(a[0].positionLineNumber, a[0].positionColumn); + if (o.pushStackElement(), t._getViewModel().setCursorStates("moveWordCommand", 3, c.map((d) => at.fromModelSelection(d))), c.length === 1) { + const d = new Y(c[0].positionLineNumber, c[0].positionColumn); t.revealPosition( - c, + d, 0 /* ScrollType.Smooth */ ); } } _moveTo(e, t, i) { - return i ? new fe(e.selectionStartLineNumber, e.selectionStartColumn, t.lineNumber, t.column) : new fe(t.lineNumber, t.column, t.lineNumber, t.column); + return i ? new ge(e.selectionStartLineNumber, e.selectionStartColumn, t.lineNumber, t.column) : new ge(t.lineNumber, t.column, t.lineNumber, t.column); } } -class eu extends oN { +class su extends WC { _move(e, t, i, n, o) { - return bt.moveWordLeft(e, t, i, n, o); + return Zt.moveWordLeft(e, t, i, n, o); } } -class tu extends oN { +class ou extends WC { _move(e, t, i, n, o) { - return bt.moveWordRight(e, t, i, n); + return Zt.moveWordRight(e, t, i, n); } } -class hxe extends eu { +class nIe extends su { constructor() { super({ inSelectionMode: !1, @@ -95145,7 +95145,7 @@ class hxe extends eu { }); } } -class uxe extends eu { +class sIe extends su { constructor() { super({ inSelectionMode: !1, @@ -95155,7 +95155,7 @@ class uxe extends eu { }); } } -class gxe extends eu { +class oIe extends su { constructor() { var e; super({ @@ -95164,7 +95164,7 @@ class gxe extends eu { id: "cursorWordLeft", precondition: void 0, kbOpts: { - kbExpr: H.and(I.textInputFocus, (e = H.and(fC, XI)) == null ? void 0 : e.negate()), + kbExpr: P.and(C.textInputFocus, (e = P.and(RG, eC)) == null ? void 0 : e.negate()), primary: 2063, mac: { primary: 527 @@ -95176,7 +95176,7 @@ class gxe extends eu { }); } } -class mxe extends eu { +class lIe extends su { constructor() { super({ inSelectionMode: !0, @@ -95186,7 +95186,7 @@ class mxe extends eu { }); } } -class pxe extends eu { +class rIe extends su { constructor() { super({ inSelectionMode: !0, @@ -95196,7 +95196,7 @@ class pxe extends eu { }); } } -class fxe extends eu { +class cIe extends su { constructor() { var e; super({ @@ -95205,7 +95205,7 @@ class fxe extends eu { id: "cursorWordLeftSelect", precondition: void 0, kbOpts: { - kbExpr: H.and(I.textInputFocus, (e = H.and(fC, XI)) == null ? void 0 : e.negate()), + kbExpr: P.and(C.textInputFocus, (e = P.and(RG, eC)) == null ? void 0 : e.negate()), primary: 3087, mac: { primary: 1551 @@ -95217,7 +95217,7 @@ class fxe extends eu { }); } } -class bxe extends eu { +class dIe extends su { constructor() { super({ inSelectionMode: !1, @@ -95227,10 +95227,10 @@ class bxe extends eu { }); } _move(e, t, i, n, o) { - return super._move(yr(El.wordSeparators.defaultValue, e.intlSegmenterLocales), t, i, n, o); + return super._move(Gl(zr.wordSeparators.defaultValue, e.intlSegmenterLocales), t, i, n, o); } } -class yxe extends eu { +class aIe extends su { constructor() { super({ inSelectionMode: !0, @@ -95240,10 +95240,10 @@ class yxe extends eu { }); } _move(e, t, i, n, o) { - return super._move(yr(El.wordSeparators.defaultValue, e.intlSegmenterLocales), t, i, n, o); + return super._move(Gl(zr.wordSeparators.defaultValue, e.intlSegmenterLocales), t, i, n, o); } } -class wxe extends tu { +class hIe extends ou { constructor() { super({ inSelectionMode: !1, @@ -95253,7 +95253,7 @@ class wxe extends tu { }); } } -class Cxe extends tu { +class uIe extends ou { constructor() { var e; super({ @@ -95262,7 +95262,7 @@ class Cxe extends tu { id: "cursorWordEndRight", precondition: void 0, kbOpts: { - kbExpr: H.and(I.textInputFocus, (e = H.and(fC, XI)) == null ? void 0 : e.negate()), + kbExpr: P.and(C.textInputFocus, (e = P.and(RG, eC)) == null ? void 0 : e.negate()), primary: 2065, mac: { primary: 529 @@ -95274,7 +95274,7 @@ class Cxe extends tu { }); } } -class Sxe extends tu { +class mIe extends ou { constructor() { super({ inSelectionMode: !1, @@ -95284,7 +95284,7 @@ class Sxe extends tu { }); } } -class Lxe extends tu { +class bIe extends ou { constructor() { super({ inSelectionMode: !0, @@ -95294,7 +95294,7 @@ class Lxe extends tu { }); } } -class Axe extends tu { +class pIe extends ou { constructor() { var e; super({ @@ -95303,7 +95303,7 @@ class Axe extends tu { id: "cursorWordEndRightSelect", precondition: void 0, kbOpts: { - kbExpr: H.and(I.textInputFocus, (e = H.and(fC, XI)) == null ? void 0 : e.negate()), + kbExpr: P.and(C.textInputFocus, (e = P.and(RG, eC)) == null ? void 0 : e.negate()), primary: 3089, mac: { primary: 1553 @@ -95315,7 +95315,7 @@ class Axe extends tu { }); } } -class xxe extends tu { +class gIe extends ou { constructor() { super({ inSelectionMode: !0, @@ -95325,7 +95325,7 @@ class xxe extends tu { }); } } -class Mxe extends tu { +class ZIe extends ou { constructor() { super({ inSelectionMode: !1, @@ -95335,10 +95335,10 @@ class Mxe extends tu { }); } _move(e, t, i, n, o) { - return super._move(yr(El.wordSeparators.defaultValue, e.intlSegmenterLocales), t, i, n, o); + return super._move(Gl(zr.wordSeparators.defaultValue, e.intlSegmenterLocales), t, i, n, o); } } -class Zxe extends tu { +class fIe extends ou { constructor() { super({ inSelectionMode: !0, @@ -95348,93 +95348,93 @@ class Zxe extends tu { }); } _move(e, t, i, n, o) { - return super._move(yr(El.wordSeparators.defaultValue, e.intlSegmenterLocales), t, i, n, o); + return super._move(Gl(zr.wordSeparators.defaultValue, e.intlSegmenterLocales), t, i, n, o); } } -class rN extends zi { +class GC extends Ai { constructor(e) { super(e), this._whitespaceHeuristics = e.whitespaceHeuristics, this._wordNavigationType = e.wordNavigationType; } runEditorCommand(e, t, i) { - const n = e.get(li); + const n = e.get(ci); if (!t.hasModel()) return; - const o = yr(t.getOption( + const o = Gl(t.getOption( 132 /* EditorOption.wordSeparators */ ), t.getOption( 131 /* EditorOption.wordSegmenterLocales */ - )), r = t.getModel(), l = t.getSelections(), a = t.getOption( + )), l = t.getModel(), r = t.getSelections(), c = t.getOption( 6 /* EditorOption.autoClosingBrackets */ - ), c = t.getOption( + ), d = t.getOption( 11 /* EditorOption.autoClosingQuotes */ - ), d = n.getLanguageConfiguration(r.getLanguageId()).getAutoClosingPairs(), h = t._getViewModel(), u = l.map((g) => { - const m = this._delete({ + ), a = n.getLanguageConfiguration(l.getLanguageId()).getAutoClosingPairs(), h = t._getViewModel(), u = r.map((m) => { + const b = this._delete({ wordSeparators: o, - model: r, - selection: g, + model: l, + selection: m, whitespaceHeuristics: this._whitespaceHeuristics, autoClosingDelete: t.getOption( 9 /* EditorOption.autoClosingDelete */ ), - autoClosingBrackets: a, - autoClosingQuotes: c, - autoClosingPairs: d, + autoClosingBrackets: c, + autoClosingQuotes: d, + autoClosingPairs: a, autoClosedCharacters: h.getCursorAutoClosedCharacters() }, this._wordNavigationType); - return new Mn(m, ""); + return new Sn(b, ""); }); t.pushUndoStop(), t.executeCommands(this.id, u), t.pushUndoStop(); } } -class d9 extends rN { +class kE extends GC { _delete(e, t) { - const i = bt.deleteWordLeft(e, t); - return i || new M(1, 1, 1, 1); + const i = Zt.deleteWordLeft(e, t); + return i || new I(1, 1, 1, 1); } } -class h9 extends rN { +class vE extends GC { _delete(e, t) { - const i = bt.deleteWordRight(e, t); + const i = Zt.deleteWordRight(e, t); if (i) return i; const n = e.model.getLineCount(), o = e.model.getLineMaxColumn(n); - return new M(n, o, n, o); + return new I(n, o, n, o); } } -class _xe extends d9 { +class yIe extends kE { constructor() { super({ whitespaceHeuristics: !1, wordNavigationType: 0, id: "deleteWordStartLeft", - precondition: I.writable + precondition: C.writable }); } } -class Ixe extends d9 { +class WIe extends kE { constructor() { super({ whitespaceHeuristics: !1, wordNavigationType: 2, id: "deleteWordEndLeft", - precondition: I.writable + precondition: C.writable }); } } -class Nxe extends d9 { +class GIe extends kE { constructor() { super({ whitespaceHeuristics: !0, wordNavigationType: 0, id: "deleteWordLeft", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 2049, mac: { primary: 513 @@ -95446,35 +95446,35 @@ class Nxe extends d9 { }); } } -class Wxe extends h9 { +class XIe extends vE { constructor() { super({ whitespaceHeuristics: !1, wordNavigationType: 0, id: "deleteWordStartRight", - precondition: I.writable + precondition: C.writable }); } } -class vxe extends h9 { +class VIe extends vE { constructor() { super({ whitespaceHeuristics: !1, wordNavigationType: 2, id: "deleteWordEndRight", - precondition: I.writable + precondition: C.writable }); } } -class Txe extends h9 { +class LIe extends vE { constructor() { super({ whitespaceHeuristics: !0, wordNavigationType: 2, id: "deleteWordRight", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 2068, mac: { primary: 532 @@ -95486,11 +95486,11 @@ class Txe extends h9 { }); } } -class Dxe extends he { +class IIe extends he { constructor() { super({ id: "deleteInsideWord", - precondition: I.writable, + precondition: C.writable, label: p("deleteInsideWord", "Delete Word"), alias: "Delete Word" }); @@ -95498,51 +95498,51 @@ class Dxe extends he { run(e, t, i) { if (!t.hasModel()) return; - const n = yr(t.getOption( + const n = Gl(t.getOption( 132 /* EditorOption.wordSeparators */ ), t.getOption( 131 /* EditorOption.wordSegmenterLocales */ - )), o = t.getModel(), l = t.getSelections().map((a) => { - const c = bt.deleteInsideWord(n, o, a); - return new Mn(c, ""); - }); - t.pushUndoStop(), t.executeCommands(this.id, l), t.pushUndoStop(); - } -} -oe(new hxe()); -oe(new uxe()); -oe(new gxe()); -oe(new mxe()); -oe(new pxe()); -oe(new fxe()); -oe(new wxe()); -oe(new Cxe()); -oe(new Sxe()); -oe(new Lxe()); -oe(new Axe()); -oe(new xxe()); -oe(new bxe()); -oe(new yxe()); -oe(new Mxe()); -oe(new Zxe()); -oe(new _xe()); -oe(new Ixe()); -oe(new Nxe()); -oe(new Wxe()); -oe(new vxe()); -oe(new Txe()); -ee(Dxe); -class Vxe extends rN { + )), o = t.getModel(), r = t.getSelections().map((c) => { + const d = Zt.deleteInsideWord(n, o, c); + return new Sn(d, ""); + }); + t.pushUndoStop(), t.executeCommands(this.id, r), t.pushUndoStop(); + } +} +oe(new nIe()); +oe(new sIe()); +oe(new oIe()); +oe(new lIe()); +oe(new rIe()); +oe(new cIe()); +oe(new hIe()); +oe(new uIe()); +oe(new mIe()); +oe(new bIe()); +oe(new pIe()); +oe(new gIe()); +oe(new dIe()); +oe(new aIe()); +oe(new ZIe()); +oe(new fIe()); +oe(new yIe()); +oe(new WIe()); +oe(new GIe()); +oe(new XIe()); +oe(new VIe()); +oe(new LIe()); +ee(IIe); +class SIe extends GC { constructor() { super({ whitespaceHeuristics: !0, wordNavigationType: 0, id: "deleteWordPartLeft", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 0, mac: { primary: 769 @@ -95554,19 +95554,19 @@ class Vxe extends rN { }); } _delete(e, t) { - const i = H_.deleteWordPartLeft(e); - return i || new M(1, 1, 1, 1); + const i = rx.deleteWordPartLeft(e); + return i || new I(1, 1, 1, 1); } } -class kxe extends rN { +class xIe extends GC { constructor() { super({ whitespaceHeuristics: !0, wordNavigationType: 2, id: "deleteWordPartRight", - precondition: I.writable, + precondition: C.writable, kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 0, mac: { primary: 788 @@ -95578,19 +95578,19 @@ class kxe extends rN { }); } _delete(e, t) { - const i = H_.deleteWordPartRight(e); + const i = rx.deleteWordPartRight(e); if (i) return i; const n = e.model.getLineCount(), o = e.model.getLineMaxColumn(n); - return new M(n, o, n, o); + return new I(n, o, n, o); } } -class N7 extends oN { +class h8 extends WC { _move(e, t, i, n, o) { - return H_.moveWordPartLeft(e, t, i, o); + return rx.moveWordPartLeft(e, t, i, o); } } -class Gxe extends N7 { +class CIe extends h8 { constructor() { super({ inSelectionMode: !1, @@ -95598,7 +95598,7 @@ class Gxe extends N7 { id: "cursorWordPartLeft", precondition: void 0, kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 0, mac: { primary: 783 @@ -95611,7 +95611,7 @@ class Gxe extends N7 { } } st.registerCommandAlias("cursorWordPartStartLeft", "cursorWordPartLeft"); -class Rxe extends N7 { +class RIe extends h8 { constructor() { super({ inSelectionMode: !0, @@ -95619,7 +95619,7 @@ class Rxe extends N7 { id: "cursorWordPartLeftSelect", precondition: void 0, kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 0, mac: { primary: 1807 @@ -95632,12 +95632,12 @@ class Rxe extends N7 { } } st.registerCommandAlias("cursorWordPartStartLeftSelect", "cursorWordPartLeftSelect"); -class W7 extends oN { +class u8 extends WC { _move(e, t, i, n, o) { - return H_.moveWordPartRight(e, t, i); + return rx.moveWordPartRight(e, t, i); } } -class Exe extends W7 { +class NIe extends u8 { constructor() { super({ inSelectionMode: !1, @@ -95645,7 +95645,7 @@ class Exe extends W7 { id: "cursorWordPartRight", precondition: void 0, kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 0, mac: { primary: 785 @@ -95657,7 +95657,7 @@ class Exe extends W7 { }); } } -class Xxe extends W7 { +class wIe extends u8 { constructor() { super({ inSelectionMode: !0, @@ -95665,7 +95665,7 @@ class Xxe extends W7 { id: "cursorWordPartRightSelect", precondition: void 0, kbOpts: { - kbExpr: I.textInputFocus, + kbExpr: C.textInputFocus, primary: 0, mac: { primary: 1809 @@ -95677,54 +95677,54 @@ class Xxe extends W7 { }); } } -oe(new Vxe()); -oe(new kxe()); -oe(new Gxe()); -oe(new Rxe()); -oe(new Exe()); -oe(new Xxe()); -const W9 = class W9 extends R { +oe(new SIe()); +oe(new xIe()); +oe(new CIe()); +oe(new RIe()); +oe(new NIe()); +oe(new wIe()); +const tD = class tD extends J { constructor(e) { super(), this.editor = e, this._register(this.editor.onDidAttemptReadOnlyEdit(() => this._onDidAttemptReadOnlyEdit())); } _onDidAttemptReadOnlyEdit() { - const e = ho.get(this.editor); + const e = mo.get(this.editor); if (e && this.editor.hasModel()) { let t = this.editor.getOptions().get( 93 /* EditorOption.readOnlyMessage */ ); - t || (this.editor.isSimpleWidget ? t = new Vn(p("editor.simple.readonly", "Cannot edit in read-only input")) : t = new Vn(p("editor.readonly", "Cannot edit in read-only editor"))), e.showMessage(t, this.editor.getPosition()); + t || (this.editor.isSimpleWidget ? t = new kn(p("editor.simple.readonly", "Cannot edit in read-only input")) : t = new kn(p("editor.readonly", "Cannot edit in read-only editor"))), e.showMessage(t, this.editor.getPosition()); } } }; -W9.ID = "editor.contrib.readOnlyMessageController"; -let xM = W9; -gt( - xM.ID, - xM, +tD.ID = "editor.contrib.readOnlyMessageController"; +let EI = tD; +mt( + EI.ID, + EI, 2 /* EditorContributionInstantiation.BeforeFirstInteraction */ ); -var Fxe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var TIe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, BP = function(s, e) { +}, p3 = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let yk = class extends R { +let E5 = class extends J { constructor(e, t, i) { - super(), this._textModel = e, this._languageFeaturesService = t, this._outlineModelService = i, this._currentModel = Oe(this, void 0); - const n = Zn("documentSymbolProvider.onDidChange", this._languageFeaturesService.documentSymbolProvider.onDidChange), o = Zn("_textModel.onDidChangeContent", se.debounce((r) => this._textModel.onDidChangeContent(r), () => { + super(), this._textModel = e, this._languageFeaturesService = t, this._outlineModelService = i, this._currentModel = Ue(this, void 0); + const n = xn("documentSymbolProvider.onDidChange", this._languageFeaturesService.documentSymbolProvider.onDidChange), o = xn("_textModel.onDidChangeContent", se.debounce((l) => this._textModel.onDidChangeContent(l), () => { }, 100)); - this._register(ks(async (r, l) => { - n.read(r), o.read(r); - const a = l.add(new bue()), c = await this._outlineModelService.getOrCreate(this._textModel, a.token); - l.isDisposed || this._currentModel.set(c, void 0); + this._register(Js(async (l, r) => { + n.read(l), o.read(l); + const c = r.add(new dme()), d = await this._outlineModelService.getOrCreate(this._textModel, c.token); + r.isDisposed || this._currentModel.set(d, void 0); })); } getBreadcrumbItems(e, t) { @@ -95732,287 +95732,287 @@ let yk = class extends R { if (!i) return []; const n = i.asListOfDocumentSymbols().filter((o) => e.contains(o.range.startLineNumber) && !e.contains(o.range.endLineNumber)); - return n.sort(MJ(gs((o) => o.range.endLineNumber - o.range.startLineNumber, zr))), n.map((o) => ({ name: o.name, kind: o.kind, startLineNumber: o.range.startLineNumber })); + return n.sort(r_(ps((o) => o.range.endLineNumber - o.range.startLineNumber, Ul))), n.map((o) => ({ name: o.name, kind: o.kind, startLineNumber: o.range.startLineNumber })); } }; -yk = Fxe([ - BP(1, ge), - BP(2, P5) -], yk); -mx.setBreadcrumbsSourceFactory((s, e) => e.createInstance(yk, s)); -var OP; +E5 = TIe([ + p3(1, me), + p3(2, bE) +], E5); +RL.setBreadcrumbsSourceFactory((s, e) => e.createInstance(E5, s)); +var g3; (function(s) { s.inspectTokensAction = p("inspectTokens", "Developer: Inspect Tokens"); -})(OP || (OP = {})); -var HP; +})(g3 || (g3 = {})); +var Z3; (function(s) { s.gotoLineActionLabel = p("gotoLineActionLabel", "Go to Line/Column..."); -})(HP || (HP = {})); -var JP; +})(Z3 || (Z3 = {})); +var f3; (function(s) { s.helpQuickAccessActionLabel = p("helpQuickAccess", "Show all Quick Access Providers"); -})(JP || (JP = {})); -var UP; +})(f3 || (f3 = {})); +var y3; (function(s) { s.quickCommandActionLabel = p("quickCommandActionLabel", "Command Palette"), s.quickCommandHelp = p("quickCommandActionHelp", "Show And Run Commands"); -})(UP || (UP = {})); -var KP; +})(y3 || (y3 = {})); +var W3; (function(s) { s.quickOutlineActionLabel = p("quickOutlineActionLabel", "Go to Symbol..."), s.quickOutlineByCategoryActionLabel = p("quickOutlineByCategoryActionLabel", "Go to Symbol by Category..."); -})(KP || (KP = {})); -var wk; +})(W3 || (W3 = {})); +var D5; (function(s) { s.editorViewAccessibleLabel = p("editorViewAccessibleLabel", "Editor content"); -})(wk || (wk = {})); -var QP; +})(D5 || (D5 = {})); +var G3; (function(s) { s.toggleHighContrast = p("toggleHighContrast", "Toggle High Contrast Theme"); -})(QP || (QP = {})); -var Ck; +})(G3 || (G3 = {})); +var F5; (function(s) { s.bulkEditServiceSummary = p("bulkEditServiceSummary", "Made {0} edits in {1} files"); -})(Ck || (Ck = {})); -var Sk; +})(F5 || (F5 = {})); +var z5; (function(s) { s[s.Unknown = 0] = "Unknown", s[s.Disabled = 1] = "Disabled", s[s.Enabled = 2] = "Enabled"; -})(Sk || (Sk = {})); -var Lk; +})(z5 || (z5 = {})); +var A5; (function(s) { s[s.Invoke = 1] = "Invoke", s[s.Auto = 2] = "Auto"; -})(Lk || (Lk = {})); -var Ak; +})(A5 || (A5 = {})); +var K5; (function(s) { s[s.None = 0] = "None", s[s.KeepWhitespace = 1] = "KeepWhitespace", s[s.InsertAsSnippet = 4] = "InsertAsSnippet"; -})(Ak || (Ak = {})); -var xk; +})(K5 || (K5 = {})); +var U5; (function(s) { s[s.Method = 0] = "Method", s[s.Function = 1] = "Function", s[s.Constructor = 2] = "Constructor", s[s.Field = 3] = "Field", s[s.Variable = 4] = "Variable", s[s.Class = 5] = "Class", s[s.Struct = 6] = "Struct", s[s.Interface = 7] = "Interface", s[s.Module = 8] = "Module", s[s.Property = 9] = "Property", s[s.Event = 10] = "Event", s[s.Operator = 11] = "Operator", s[s.Unit = 12] = "Unit", s[s.Value = 13] = "Value", s[s.Constant = 14] = "Constant", s[s.Enum = 15] = "Enum", s[s.EnumMember = 16] = "EnumMember", s[s.Keyword = 17] = "Keyword", s[s.Text = 18] = "Text", s[s.Color = 19] = "Color", s[s.File = 20] = "File", s[s.Reference = 21] = "Reference", s[s.Customcolor = 22] = "Customcolor", s[s.Folder = 23] = "Folder", s[s.TypeParameter = 24] = "TypeParameter", s[s.User = 25] = "User", s[s.Issue = 26] = "Issue", s[s.Snippet = 27] = "Snippet"; -})(xk || (xk = {})); -var Mk; +})(U5 || (U5 = {})); +var P5; (function(s) { s[s.Deprecated = 1] = "Deprecated"; -})(Mk || (Mk = {})); -var Zk; +})(P5 || (P5 = {})); +var B5; (function(s) { s[s.Invoke = 0] = "Invoke", s[s.TriggerCharacter = 1] = "TriggerCharacter", s[s.TriggerForIncompleteCompletions = 2] = "TriggerForIncompleteCompletions"; -})(Zk || (Zk = {})); -var _k; +})(B5 || (B5 = {})); +var _5; (function(s) { s[s.EXACT = 0] = "EXACT", s[s.ABOVE = 1] = "ABOVE", s[s.BELOW = 2] = "BELOW"; -})(_k || (_k = {})); -var Ik; +})(_5 || (_5 = {})); +var Q5; (function(s) { s[s.NotSet = 0] = "NotSet", s[s.ContentFlush = 1] = "ContentFlush", s[s.RecoverFromMarkers = 2] = "RecoverFromMarkers", s[s.Explicit = 3] = "Explicit", s[s.Paste = 4] = "Paste", s[s.Undo = 5] = "Undo", s[s.Redo = 6] = "Redo"; -})(Ik || (Ik = {})); -var Nk; +})(Q5 || (Q5 = {})); +var O5; (function(s) { s[s.LF = 1] = "LF", s[s.CRLF = 2] = "CRLF"; -})(Nk || (Nk = {})); -var Wk; +})(O5 || (O5 = {})); +var j5; (function(s) { s[s.Text = 0] = "Text", s[s.Read = 1] = "Read", s[s.Write = 2] = "Write"; -})(Wk || (Wk = {})); -var vk; +})(j5 || (j5 = {})); +var q5; (function(s) { s[s.None = 0] = "None", s[s.Keep = 1] = "Keep", s[s.Brackets = 2] = "Brackets", s[s.Advanced = 3] = "Advanced", s[s.Full = 4] = "Full"; -})(vk || (vk = {})); -var Tk; +})(q5 || (q5 = {})); +var $5; (function(s) { s[s.acceptSuggestionOnCommitCharacter = 0] = "acceptSuggestionOnCommitCharacter", s[s.acceptSuggestionOnEnter = 1] = "acceptSuggestionOnEnter", s[s.accessibilitySupport = 2] = "accessibilitySupport", s[s.accessibilityPageSize = 3] = "accessibilityPageSize", s[s.ariaLabel = 4] = "ariaLabel", s[s.ariaRequired = 5] = "ariaRequired", s[s.autoClosingBrackets = 6] = "autoClosingBrackets", s[s.autoClosingComments = 7] = "autoClosingComments", s[s.screenReaderAnnounceInlineSuggestion = 8] = "screenReaderAnnounceInlineSuggestion", s[s.autoClosingDelete = 9] = "autoClosingDelete", s[s.autoClosingOvertype = 10] = "autoClosingOvertype", s[s.autoClosingQuotes = 11] = "autoClosingQuotes", s[s.autoIndent = 12] = "autoIndent", s[s.automaticLayout = 13] = "automaticLayout", s[s.autoSurround = 14] = "autoSurround", s[s.bracketPairColorization = 15] = "bracketPairColorization", s[s.guides = 16] = "guides", s[s.codeLens = 17] = "codeLens", s[s.codeLensFontFamily = 18] = "codeLensFontFamily", s[s.codeLensFontSize = 19] = "codeLensFontSize", s[s.colorDecorators = 20] = "colorDecorators", s[s.colorDecoratorsLimit = 21] = "colorDecoratorsLimit", s[s.columnSelection = 22] = "columnSelection", s[s.comments = 23] = "comments", s[s.contextmenu = 24] = "contextmenu", s[s.copyWithSyntaxHighlighting = 25] = "copyWithSyntaxHighlighting", s[s.cursorBlinking = 26] = "cursorBlinking", s[s.cursorSmoothCaretAnimation = 27] = "cursorSmoothCaretAnimation", s[s.cursorStyle = 28] = "cursorStyle", s[s.cursorSurroundingLines = 29] = "cursorSurroundingLines", s[s.cursorSurroundingLinesStyle = 30] = "cursorSurroundingLinesStyle", s[s.cursorWidth = 31] = "cursorWidth", s[s.disableLayerHinting = 32] = "disableLayerHinting", s[s.disableMonospaceOptimizations = 33] = "disableMonospaceOptimizations", s[s.domReadOnly = 34] = "domReadOnly", s[s.dragAndDrop = 35] = "dragAndDrop", s[s.dropIntoEditor = 36] = "dropIntoEditor", s[s.emptySelectionClipboard = 37] = "emptySelectionClipboard", s[s.experimentalWhitespaceRendering = 38] = "experimentalWhitespaceRendering", s[s.extraEditorClassName = 39] = "extraEditorClassName", s[s.fastScrollSensitivity = 40] = "fastScrollSensitivity", s[s.find = 41] = "find", s[s.fixedOverflowWidgets = 42] = "fixedOverflowWidgets", s[s.folding = 43] = "folding", s[s.foldingStrategy = 44] = "foldingStrategy", s[s.foldingHighlight = 45] = "foldingHighlight", s[s.foldingImportsByDefault = 46] = "foldingImportsByDefault", s[s.foldingMaximumRegions = 47] = "foldingMaximumRegions", s[s.unfoldOnClickAfterEndOfLine = 48] = "unfoldOnClickAfterEndOfLine", s[s.fontFamily = 49] = "fontFamily", s[s.fontInfo = 50] = "fontInfo", s[s.fontLigatures = 51] = "fontLigatures", s[s.fontSize = 52] = "fontSize", s[s.fontWeight = 53] = "fontWeight", s[s.fontVariations = 54] = "fontVariations", s[s.formatOnPaste = 55] = "formatOnPaste", s[s.formatOnType = 56] = "formatOnType", s[s.glyphMargin = 57] = "glyphMargin", s[s.gotoLocation = 58] = "gotoLocation", s[s.hideCursorInOverviewRuler = 59] = "hideCursorInOverviewRuler", s[s.hover = 60] = "hover", s[s.inDiffEditor = 61] = "inDiffEditor", s[s.inlineSuggest = 62] = "inlineSuggest", s[s.inlineEdit = 63] = "inlineEdit", s[s.letterSpacing = 64] = "letterSpacing", s[s.lightbulb = 65] = "lightbulb", s[s.lineDecorationsWidth = 66] = "lineDecorationsWidth", s[s.lineHeight = 67] = "lineHeight", s[s.lineNumbers = 68] = "lineNumbers", s[s.lineNumbersMinChars = 69] = "lineNumbersMinChars", s[s.linkedEditing = 70] = "linkedEditing", s[s.links = 71] = "links", s[s.matchBrackets = 72] = "matchBrackets", s[s.minimap = 73] = "minimap", s[s.mouseStyle = 74] = "mouseStyle", s[s.mouseWheelScrollSensitivity = 75] = "mouseWheelScrollSensitivity", s[s.mouseWheelZoom = 76] = "mouseWheelZoom", s[s.multiCursorMergeOverlapping = 77] = "multiCursorMergeOverlapping", s[s.multiCursorModifier = 78] = "multiCursorModifier", s[s.multiCursorPaste = 79] = "multiCursorPaste", s[s.multiCursorLimit = 80] = "multiCursorLimit", s[s.occurrencesHighlight = 81] = "occurrencesHighlight", s[s.overviewRulerBorder = 82] = "overviewRulerBorder", s[s.overviewRulerLanes = 83] = "overviewRulerLanes", s[s.padding = 84] = "padding", s[s.pasteAs = 85] = "pasteAs", s[s.parameterHints = 86] = "parameterHints", s[s.peekWidgetDefaultFocus = 87] = "peekWidgetDefaultFocus", s[s.placeholder = 88] = "placeholder", s[s.definitionLinkOpensInPeek = 89] = "definitionLinkOpensInPeek", s[s.quickSuggestions = 90] = "quickSuggestions", s[s.quickSuggestionsDelay = 91] = "quickSuggestionsDelay", s[s.readOnly = 92] = "readOnly", s[s.readOnlyMessage = 93] = "readOnlyMessage", s[s.renameOnType = 94] = "renameOnType", s[s.renderControlCharacters = 95] = "renderControlCharacters", s[s.renderFinalNewline = 96] = "renderFinalNewline", s[s.renderLineHighlight = 97] = "renderLineHighlight", s[s.renderLineHighlightOnlyWhenFocus = 98] = "renderLineHighlightOnlyWhenFocus", s[s.renderValidationDecorations = 99] = "renderValidationDecorations", s[s.renderWhitespace = 100] = "renderWhitespace", s[s.revealHorizontalRightPadding = 101] = "revealHorizontalRightPadding", s[s.roundedSelection = 102] = "roundedSelection", s[s.rulers = 103] = "rulers", s[s.scrollbar = 104] = "scrollbar", s[s.scrollBeyondLastColumn = 105] = "scrollBeyondLastColumn", s[s.scrollBeyondLastLine = 106] = "scrollBeyondLastLine", s[s.scrollPredominantAxis = 107] = "scrollPredominantAxis", s[s.selectionClipboard = 108] = "selectionClipboard", s[s.selectionHighlight = 109] = "selectionHighlight", s[s.selectOnLineNumbers = 110] = "selectOnLineNumbers", s[s.showFoldingControls = 111] = "showFoldingControls", s[s.showUnused = 112] = "showUnused", s[s.snippetSuggestions = 113] = "snippetSuggestions", s[s.smartSelect = 114] = "smartSelect", s[s.smoothScrolling = 115] = "smoothScrolling", s[s.stickyScroll = 116] = "stickyScroll", s[s.stickyTabStops = 117] = "stickyTabStops", s[s.stopRenderingLineAfter = 118] = "stopRenderingLineAfter", s[s.suggest = 119] = "suggest", s[s.suggestFontSize = 120] = "suggestFontSize", s[s.suggestLineHeight = 121] = "suggestLineHeight", s[s.suggestOnTriggerCharacters = 122] = "suggestOnTriggerCharacters", s[s.suggestSelection = 123] = "suggestSelection", s[s.tabCompletion = 124] = "tabCompletion", s[s.tabIndex = 125] = "tabIndex", s[s.unicodeHighlighting = 126] = "unicodeHighlighting", s[s.unusualLineTerminators = 127] = "unusualLineTerminators", s[s.useShadowDOM = 128] = "useShadowDOM", s[s.useTabStops = 129] = "useTabStops", s[s.wordBreak = 130] = "wordBreak", s[s.wordSegmenterLocales = 131] = "wordSegmenterLocales", s[s.wordSeparators = 132] = "wordSeparators", s[s.wordWrap = 133] = "wordWrap", s[s.wordWrapBreakAfterCharacters = 134] = "wordWrapBreakAfterCharacters", s[s.wordWrapBreakBeforeCharacters = 135] = "wordWrapBreakBeforeCharacters", s[s.wordWrapColumn = 136] = "wordWrapColumn", s[s.wordWrapOverride1 = 137] = "wordWrapOverride1", s[s.wordWrapOverride2 = 138] = "wordWrapOverride2", s[s.wrappingIndent = 139] = "wrappingIndent", s[s.wrappingStrategy = 140] = "wrappingStrategy", s[s.showDeprecated = 141] = "showDeprecated", s[s.inlayHints = 142] = "inlayHints", s[s.editorClassName = 143] = "editorClassName", s[s.pixelRatio = 144] = "pixelRatio", s[s.tabFocusMode = 145] = "tabFocusMode", s[s.layoutInfo = 146] = "layoutInfo", s[s.wrappingInfo = 147] = "wrappingInfo", s[s.defaultColorDecorators = 148] = "defaultColorDecorators", s[s.colorDecoratorsActivatedOn = 149] = "colorDecoratorsActivatedOn", s[s.inlineCompletionsAccessibilityVerbose = 150] = "inlineCompletionsAccessibilityVerbose"; -})(Tk || (Tk = {})); -var Dk; +})($5 || ($5 = {})); +var eY; (function(s) { s[s.TextDefined = 0] = "TextDefined", s[s.LF = 1] = "LF", s[s.CRLF = 2] = "CRLF"; -})(Dk || (Dk = {})); -var Vk; +})(eY || (eY = {})); +var tY; (function(s) { s[s.LF = 0] = "LF", s[s.CRLF = 1] = "CRLF"; -})(Vk || (Vk = {})); -var kk; +})(tY || (tY = {})); +var iY; (function(s) { s[s.Left = 1] = "Left", s[s.Center = 2] = "Center", s[s.Right = 3] = "Right"; -})(kk || (kk = {})); -var Gk; +})(iY || (iY = {})); +var nY; (function(s) { s[s.Increase = 0] = "Increase", s[s.Decrease = 1] = "Decrease"; -})(Gk || (Gk = {})); -var Rk; +})(nY || (nY = {})); +var sY; (function(s) { s[s.None = 0] = "None", s[s.Indent = 1] = "Indent", s[s.IndentOutdent = 2] = "IndentOutdent", s[s.Outdent = 3] = "Outdent"; -})(Rk || (Rk = {})); -var Ek; +})(sY || (sY = {})); +var oY; (function(s) { s[s.Both = 0] = "Both", s[s.Right = 1] = "Right", s[s.Left = 2] = "Left", s[s.None = 3] = "None"; -})(Ek || (Ek = {})); -var Xk; +})(oY || (oY = {})); +var lY; (function(s) { s[s.Type = 1] = "Type", s[s.Parameter = 2] = "Parameter"; -})(Xk || (Xk = {})); -var Fk; +})(lY || (lY = {})); +var rY; (function(s) { s[s.Automatic = 0] = "Automatic", s[s.Explicit = 1] = "Explicit"; -})(Fk || (Fk = {})); -var Yk; +})(rY || (rY = {})); +var cY; (function(s) { s[s.Invoke = 0] = "Invoke", s[s.Automatic = 1] = "Automatic"; -})(Yk || (Yk = {})); -var zk; +})(cY || (cY = {})); +var dY; (function(s) { s[s.DependsOnKbLayout = -1] = "DependsOnKbLayout", s[s.Unknown = 0] = "Unknown", s[s.Backspace = 1] = "Backspace", s[s.Tab = 2] = "Tab", s[s.Enter = 3] = "Enter", s[s.Shift = 4] = "Shift", s[s.Ctrl = 5] = "Ctrl", s[s.Alt = 6] = "Alt", s[s.PauseBreak = 7] = "PauseBreak", s[s.CapsLock = 8] = "CapsLock", s[s.Escape = 9] = "Escape", s[s.Space = 10] = "Space", s[s.PageUp = 11] = "PageUp", s[s.PageDown = 12] = "PageDown", s[s.End = 13] = "End", s[s.Home = 14] = "Home", s[s.LeftArrow = 15] = "LeftArrow", s[s.UpArrow = 16] = "UpArrow", s[s.RightArrow = 17] = "RightArrow", s[s.DownArrow = 18] = "DownArrow", s[s.Insert = 19] = "Insert", s[s.Delete = 20] = "Delete", s[s.Digit0 = 21] = "Digit0", s[s.Digit1 = 22] = "Digit1", s[s.Digit2 = 23] = "Digit2", s[s.Digit3 = 24] = "Digit3", s[s.Digit4 = 25] = "Digit4", s[s.Digit5 = 26] = "Digit5", s[s.Digit6 = 27] = "Digit6", s[s.Digit7 = 28] = "Digit7", s[s.Digit8 = 29] = "Digit8", s[s.Digit9 = 30] = "Digit9", s[s.KeyA = 31] = "KeyA", s[s.KeyB = 32] = "KeyB", s[s.KeyC = 33] = "KeyC", s[s.KeyD = 34] = "KeyD", s[s.KeyE = 35] = "KeyE", s[s.KeyF = 36] = "KeyF", s[s.KeyG = 37] = "KeyG", s[s.KeyH = 38] = "KeyH", s[s.KeyI = 39] = "KeyI", s[s.KeyJ = 40] = "KeyJ", s[s.KeyK = 41] = "KeyK", s[s.KeyL = 42] = "KeyL", s[s.KeyM = 43] = "KeyM", s[s.KeyN = 44] = "KeyN", s[s.KeyO = 45] = "KeyO", s[s.KeyP = 46] = "KeyP", s[s.KeyQ = 47] = "KeyQ", s[s.KeyR = 48] = "KeyR", s[s.KeyS = 49] = "KeyS", s[s.KeyT = 50] = "KeyT", s[s.KeyU = 51] = "KeyU", s[s.KeyV = 52] = "KeyV", s[s.KeyW = 53] = "KeyW", s[s.KeyX = 54] = "KeyX", s[s.KeyY = 55] = "KeyY", s[s.KeyZ = 56] = "KeyZ", s[s.Meta = 57] = "Meta", s[s.ContextMenu = 58] = "ContextMenu", s[s.F1 = 59] = "F1", s[s.F2 = 60] = "F2", s[s.F3 = 61] = "F3", s[s.F4 = 62] = "F4", s[s.F5 = 63] = "F5", s[s.F6 = 64] = "F6", s[s.F7 = 65] = "F7", s[s.F8 = 66] = "F8", s[s.F9 = 67] = "F9", s[s.F10 = 68] = "F10", s[s.F11 = 69] = "F11", s[s.F12 = 70] = "F12", s[s.F13 = 71] = "F13", s[s.F14 = 72] = "F14", s[s.F15 = 73] = "F15", s[s.F16 = 74] = "F16", s[s.F17 = 75] = "F17", s[s.F18 = 76] = "F18", s[s.F19 = 77] = "F19", s[s.F20 = 78] = "F20", s[s.F21 = 79] = "F21", s[s.F22 = 80] = "F22", s[s.F23 = 81] = "F23", s[s.F24 = 82] = "F24", s[s.NumLock = 83] = "NumLock", s[s.ScrollLock = 84] = "ScrollLock", s[s.Semicolon = 85] = "Semicolon", s[s.Equal = 86] = "Equal", s[s.Comma = 87] = "Comma", s[s.Minus = 88] = "Minus", s[s.Period = 89] = "Period", s[s.Slash = 90] = "Slash", s[s.Backquote = 91] = "Backquote", s[s.BracketLeft = 92] = "BracketLeft", s[s.Backslash = 93] = "Backslash", s[s.BracketRight = 94] = "BracketRight", s[s.Quote = 95] = "Quote", s[s.OEM_8 = 96] = "OEM_8", s[s.IntlBackslash = 97] = "IntlBackslash", s[s.Numpad0 = 98] = "Numpad0", s[s.Numpad1 = 99] = "Numpad1", s[s.Numpad2 = 100] = "Numpad2", s[s.Numpad3 = 101] = "Numpad3", s[s.Numpad4 = 102] = "Numpad4", s[s.Numpad5 = 103] = "Numpad5", s[s.Numpad6 = 104] = "Numpad6", s[s.Numpad7 = 105] = "Numpad7", s[s.Numpad8 = 106] = "Numpad8", s[s.Numpad9 = 107] = "Numpad9", s[s.NumpadMultiply = 108] = "NumpadMultiply", s[s.NumpadAdd = 109] = "NumpadAdd", s[s.NUMPAD_SEPARATOR = 110] = "NUMPAD_SEPARATOR", s[s.NumpadSubtract = 111] = "NumpadSubtract", s[s.NumpadDecimal = 112] = "NumpadDecimal", s[s.NumpadDivide = 113] = "NumpadDivide", s[s.KEY_IN_COMPOSITION = 114] = "KEY_IN_COMPOSITION", s[s.ABNT_C1 = 115] = "ABNT_C1", s[s.ABNT_C2 = 116] = "ABNT_C2", s[s.AudioVolumeMute = 117] = "AudioVolumeMute", s[s.AudioVolumeUp = 118] = "AudioVolumeUp", s[s.AudioVolumeDown = 119] = "AudioVolumeDown", s[s.BrowserSearch = 120] = "BrowserSearch", s[s.BrowserHome = 121] = "BrowserHome", s[s.BrowserBack = 122] = "BrowserBack", s[s.BrowserForward = 123] = "BrowserForward", s[s.MediaTrackNext = 124] = "MediaTrackNext", s[s.MediaTrackPrevious = 125] = "MediaTrackPrevious", s[s.MediaStop = 126] = "MediaStop", s[s.MediaPlayPause = 127] = "MediaPlayPause", s[s.LaunchMediaPlayer = 128] = "LaunchMediaPlayer", s[s.LaunchMail = 129] = "LaunchMail", s[s.LaunchApp2 = 130] = "LaunchApp2", s[s.Clear = 131] = "Clear", s[s.MAX_VALUE = 132] = "MAX_VALUE"; -})(zk || (zk = {})); -var Pk; +})(dY || (dY = {})); +var aY; (function(s) { s[s.Hint = 1] = "Hint", s[s.Info = 2] = "Info", s[s.Warning = 4] = "Warning", s[s.Error = 8] = "Error"; -})(Pk || (Pk = {})); -var Bk; +})(aY || (aY = {})); +var hY; (function(s) { s[s.Unnecessary = 1] = "Unnecessary", s[s.Deprecated = 2] = "Deprecated"; -})(Bk || (Bk = {})); -var Ok; +})(hY || (hY = {})); +var uY; (function(s) { s[s.Inline = 1] = "Inline", s[s.Gutter = 2] = "Gutter"; -})(Ok || (Ok = {})); -var Hk; +})(uY || (uY = {})); +var mY; (function(s) { s[s.Normal = 1] = "Normal", s[s.Underlined = 2] = "Underlined"; -})(Hk || (Hk = {})); -var Jk; +})(mY || (mY = {})); +var bY; (function(s) { s[s.UNKNOWN = 0] = "UNKNOWN", s[s.TEXTAREA = 1] = "TEXTAREA", s[s.GUTTER_GLYPH_MARGIN = 2] = "GUTTER_GLYPH_MARGIN", s[s.GUTTER_LINE_NUMBERS = 3] = "GUTTER_LINE_NUMBERS", s[s.GUTTER_LINE_DECORATIONS = 4] = "GUTTER_LINE_DECORATIONS", s[s.GUTTER_VIEW_ZONE = 5] = "GUTTER_VIEW_ZONE", s[s.CONTENT_TEXT = 6] = "CONTENT_TEXT", s[s.CONTENT_EMPTY = 7] = "CONTENT_EMPTY", s[s.CONTENT_VIEW_ZONE = 8] = "CONTENT_VIEW_ZONE", s[s.CONTENT_WIDGET = 9] = "CONTENT_WIDGET", s[s.OVERVIEW_RULER = 10] = "OVERVIEW_RULER", s[s.SCROLLBAR = 11] = "SCROLLBAR", s[s.OVERLAY_WIDGET = 12] = "OVERLAY_WIDGET", s[s.OUTSIDE_EDITOR = 13] = "OUTSIDE_EDITOR"; -})(Jk || (Jk = {})); -var Uk; +})(bY || (bY = {})); +var pY; (function(s) { s[s.AIGenerated = 1] = "AIGenerated"; -})(Uk || (Uk = {})); -var Kk; +})(pY || (pY = {})); +var gY; (function(s) { s[s.Invoke = 0] = "Invoke", s[s.Automatic = 1] = "Automatic"; -})(Kk || (Kk = {})); -var Qk; +})(gY || (gY = {})); +var ZY; (function(s) { s[s.TOP_RIGHT_CORNER = 0] = "TOP_RIGHT_CORNER", s[s.BOTTOM_RIGHT_CORNER = 1] = "BOTTOM_RIGHT_CORNER", s[s.TOP_CENTER = 2] = "TOP_CENTER"; -})(Qk || (Qk = {})); -var jk; +})(ZY || (ZY = {})); +var fY; (function(s) { s[s.Left = 1] = "Left", s[s.Center = 2] = "Center", s[s.Right = 4] = "Right", s[s.Full = 7] = "Full"; -})(jk || (jk = {})); -var qk; +})(fY || (fY = {})); +var yY; (function(s) { s[s.Word = 0] = "Word", s[s.Line = 1] = "Line", s[s.Suggest = 2] = "Suggest"; -})(qk || (qk = {})); -var $k; +})(yY || (yY = {})); +var WY; (function(s) { s[s.Left = 0] = "Left", s[s.Right = 1] = "Right", s[s.None = 2] = "None", s[s.LeftOfInjectedText = 3] = "LeftOfInjectedText", s[s.RightOfInjectedText = 4] = "RightOfInjectedText"; -})($k || ($k = {})); -var eG; +})(WY || (WY = {})); +var GY; (function(s) { s[s.Off = 0] = "Off", s[s.On = 1] = "On", s[s.Relative = 2] = "Relative", s[s.Interval = 3] = "Interval", s[s.Custom = 4] = "Custom"; -})(eG || (eG = {})); -var tG; +})(GY || (GY = {})); +var XY; (function(s) { s[s.None = 0] = "None", s[s.Text = 1] = "Text", s[s.Blocks = 2] = "Blocks"; -})(tG || (tG = {})); -var iG; +})(XY || (XY = {})); +var VY; (function(s) { s[s.Smooth = 0] = "Smooth", s[s.Immediate = 1] = "Immediate"; -})(iG || (iG = {})); -var nG; +})(VY || (VY = {})); +var LY; (function(s) { s[s.Auto = 1] = "Auto", s[s.Hidden = 2] = "Hidden", s[s.Visible = 3] = "Visible"; -})(nG || (nG = {})); -var sG; +})(LY || (LY = {})); +var IY; (function(s) { s[s.LTR = 0] = "LTR", s[s.RTL = 1] = "RTL"; -})(sG || (sG = {})); -var oG; +})(IY || (IY = {})); +var SY; (function(s) { s.Off = "off", s.OnCode = "onCode", s.On = "on"; -})(oG || (oG = {})); -var rG; +})(SY || (SY = {})); +var xY; (function(s) { s[s.Invoke = 1] = "Invoke", s[s.TriggerCharacter = 2] = "TriggerCharacter", s[s.ContentChange = 3] = "ContentChange"; -})(rG || (rG = {})); -var lG; +})(xY || (xY = {})); +var CY; (function(s) { s[s.File = 0] = "File", s[s.Module = 1] = "Module", s[s.Namespace = 2] = "Namespace", s[s.Package = 3] = "Package", s[s.Class = 4] = "Class", s[s.Method = 5] = "Method", s[s.Property = 6] = "Property", s[s.Field = 7] = "Field", s[s.Constructor = 8] = "Constructor", s[s.Enum = 9] = "Enum", s[s.Interface = 10] = "Interface", s[s.Function = 11] = "Function", s[s.Variable = 12] = "Variable", s[s.Constant = 13] = "Constant", s[s.String = 14] = "String", s[s.Number = 15] = "Number", s[s.Boolean = 16] = "Boolean", s[s.Array = 17] = "Array", s[s.Object = 18] = "Object", s[s.Key = 19] = "Key", s[s.Null = 20] = "Null", s[s.EnumMember = 21] = "EnumMember", s[s.Struct = 22] = "Struct", s[s.Event = 23] = "Event", s[s.Operator = 24] = "Operator", s[s.TypeParameter = 25] = "TypeParameter"; -})(lG || (lG = {})); -var aG; +})(CY || (CY = {})); +var RY; (function(s) { s[s.Deprecated = 1] = "Deprecated"; -})(aG || (aG = {})); -var cG; +})(RY || (RY = {})); +var NY; (function(s) { s[s.Hidden = 0] = "Hidden", s[s.Blink = 1] = "Blink", s[s.Smooth = 2] = "Smooth", s[s.Phase = 3] = "Phase", s[s.Expand = 4] = "Expand", s[s.Solid = 5] = "Solid"; -})(cG || (cG = {})); -var dG; +})(NY || (NY = {})); +var wY; (function(s) { s[s.Line = 1] = "Line", s[s.Block = 2] = "Block", s[s.Underline = 3] = "Underline", s[s.LineThin = 4] = "LineThin", s[s.BlockOutline = 5] = "BlockOutline", s[s.UnderlineThin = 6] = "UnderlineThin"; -})(dG || (dG = {})); -var hG; +})(wY || (wY = {})); +var TY; (function(s) { s[s.AlwaysGrowsWhenTypingAtEdges = 0] = "AlwaysGrowsWhenTypingAtEdges", s[s.NeverGrowsWhenTypingAtEdges = 1] = "NeverGrowsWhenTypingAtEdges", s[s.GrowsOnlyWhenTypingBefore = 2] = "GrowsOnlyWhenTypingBefore", s[s.GrowsOnlyWhenTypingAfter = 3] = "GrowsOnlyWhenTypingAfter"; -})(hG || (hG = {})); -var uG; +})(TY || (TY = {})); +var MY; (function(s) { s[s.None = 0] = "None", s[s.Same = 1] = "Same", s[s.Indent = 2] = "Indent", s[s.DeepIndent = 3] = "DeepIndent"; -})(uG || (uG = {})); -var Vc; -let Yxe = (Vc = class { +})(MY || (MY = {})); +var Hd; +let MIe = (Hd = class { static chord(e, t) { - return Xi(e, t); + return Di(e, t); } -}, Vc.CtrlCmd = 2048, Vc.Shift = 1024, Vc.Alt = 512, Vc.WinCtrl = 256, Vc); -function v7() { +}, Hd.CtrlCmd = 2048, Hd.Shift = 1024, Hd.Alt = 512, Hd.WinCtrl = 256, Hd); +function m8() { return { editor: void 0, // undefined override expected here languages: void 0, // undefined override expected here - CancellationTokenSource: mi, + CancellationTokenSource: pi, Emitter: k, - KeyCode: zk, - KeyMod: Yxe, - Position: V, - Range: M, - Selection: fe, - SelectionDirection: sG, - MarkerSeverity: Pk, - MarkerTag: Bk, - Uri: Le, - Token: jw + KeyCode: dY, + KeyMod: MIe, + Position: Y, + Range: I, + Selection: ge, + SelectionDirection: IY, + MarkerSeverity: aY, + MarkerTag: hY, + Uri: Xe, + Token: dW }; } -const jP = "default", zxe = "$initialize"; -let qP = !1; -function gG(s) { - Dm && (qP || (qP = !0, console.warn("Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/microsoft/monaco-editor#faq")), console.warn(s.message)); +const X3 = "default", YIe = "$initialize"; +let V3 = !1; +function YY(s) { + Hb && (V3 || (V3 = !0, console.warn("Could not create web worker(s). Falling back to loading web worker code in main thread, which might cause UI freezes. Please see https://github.com/microsoft/monaco-editor#faq")), console.warn(s.message)); } -class Pxe { +class kIe { constructor(e, t, i, n, o) { this.vsWorker = e, this.req = t, this.channel = i, this.method = n, this.args = o, this.type = 0; } } -class $P { +class L3 { constructor(e, t, i, n) { this.vsWorker = e, this.seq = t, this.res = i, this.err = n, this.type = 1; } } -class Bxe { +class vIe { constructor(e, t, i, n, o) { this.vsWorker = e, this.req = t, this.channel = i, this.eventName = n, this.arg = o, this.type = 2; } } -class Oxe { +class JIe { constructor(e, t, i) { this.vsWorker = e, this.req = t, this.event = i, this.type = 3; } } -class Hxe { +class HIe { constructor(e, t) { this.vsWorker = e, this.req = t, this.type = 4; } } -class Jxe { +class EIe { constructor(e) { this._workerId = -1, this._handler = e, this._lastSentReq = 0, this._pendingReplies = /* @__PURE__ */ Object.create(null), this._pendingEmitters = /* @__PURE__ */ new Map(), this._pendingEvents = /* @__PURE__ */ new Map(); } @@ -96021,21 +96021,21 @@ class Jxe { } sendMessage(e, t, i) { const n = String(++this._lastSentReq); - return new Promise((o, r) => { + return new Promise((o, l) => { this._pendingReplies[n] = { resolve: o, - reject: r - }, this._send(new Pxe(this._workerId, n, e, t, i)); + reject: l + }, this._send(new kIe(this._workerId, n, e, t, i)); }); } listen(e, t, i) { let n = null; const o = new k({ onWillAddFirstListener: () => { - n = String(++this._lastSentReq), this._pendingEmitters.set(n, o), this._send(new Bxe(this._workerId, n, e, t, i)); + n = String(++this._lastSentReq), this._pendingEmitters.set(n, o), this._send(new vIe(this._workerId, n, e, t, i)); }, onDidRemoveLastListener: () => { - this._pendingEmitters.delete(n), this._send(new Hxe(this._workerId, n)), n = null; + this._pendingEmitters.delete(n), this._send(new HIe(this._workerId, n)), n = null; } }); return o.event; @@ -96045,7 +96045,7 @@ class Jxe { } createProxyToRemoteChannel(e, t) { const i = { - get: (n, o) => (typeof o == "string" && !n[o] && (D7(o) ? n[o] = (r) => this.listen(e, o, r) : T7(o) ? n[o] = this.listen(e, o, void 0) : o.charCodeAt(0) === 36 && (n[o] = async (...r) => (await (t == null ? void 0 : t()), this.sendMessage(e, o, r)))), n[o]) + get: (n, o) => (typeof o == "string" && !n[o] && (p8(o) ? n[o] = (l) => this.listen(e, o, l) : b8(o) ? n[o] = this.listen(e, o, void 0) : o.charCodeAt(0) === 36 && (n[o] = async (...l) => (await (t == null ? void 0 : t()), this.sendMessage(e, o, l)))), n[o]) }; return new Proxy(/* @__PURE__ */ Object.create(null), i); } @@ -96079,14 +96079,14 @@ class Jxe { _handleRequestMessage(e) { const t = e.req; this._handler.handleMessage(e.channel, e.method, e.args).then((n) => { - this._send(new $P(this._workerId, t, n, void 0)); + this._send(new L3(this._workerId, t, n, void 0)); }, (n) => { - n.detail instanceof Error && (n.detail = E9(n.detail)), this._send(new $P(this._workerId, t, void 0, E9(n))); + n.detail instanceof Error && (n.detail = dD(n.detail)), this._send(new L3(this._workerId, t, void 0, dD(n))); }); } _handleSubscribeEventMessage(e) { const t = e.req, i = this._handler.handleEvent(e.channel, e.eventName, e.arg)((n) => { - this._send(new Oxe(this._workerId, t, n)); + this._send(new JIe(this._workerId, t, n)); }); this._pendingEvents.set(t, i); } @@ -96113,7 +96113,7 @@ class Jxe { this._handler.sendMessage(e, t); } } -class Uxe extends R { +class DIe extends J { constructor(e, t) { super(), this._localChannels = /* @__PURE__ */ new Map(), this._worker = this._register(e.create({ amdModuleId: "vs/base/common/worker/simpleWorker", @@ -96122,21 +96122,21 @@ class Uxe extends R { }, (o) => { this._protocol.handleMessage(o); }, (o) => { - De(o); - })), this._protocol = new Jxe({ - sendMessage: (o, r) => { - this._worker.postMessage(o, r); + Me(o); + })), this._protocol = new EIe({ + sendMessage: (o, l) => { + this._worker.postMessage(o, l); }, - handleMessage: (o, r, l) => this._handleMessage(o, r, l), - handleEvent: (o, r, l) => this._handleEvent(o, r, l) + handleMessage: (o, l, r) => this._handleMessage(o, l, r), + handleEvent: (o, l, r) => this._handleEvent(o, l, r) }), this._protocol.setWorkerId(this._worker.getId()); let i = null; const n = globalThis.require; - typeof n < "u" && typeof n.getConfig == "function" ? i = n.getConfig() : typeof globalThis.requirejs < "u" && (i = globalThis.requirejs.s.contexts._.config), this._onModuleLoaded = this._protocol.sendMessage(jP, zxe, [ + typeof n < "u" && typeof n.getConfig == "function" ? i = n.getConfig() : typeof globalThis.requirejs < "u" && (i = globalThis.requirejs.s.contexts._.config), this._onModuleLoaded = this._protocol.sendMessage(X3, YIe, [ this._worker.getId(), JSON.parse(JSON.stringify(i)), t.amdModuleId - ]), this.proxy = this._protocol.createProxyToRemoteChannel(jP, async () => { + ]), this.proxy = this._protocol.createProxyToRemoteChannel(X3, async () => { await this._onModuleLoaded; }), this._onModuleLoaded.catch((o) => { this._onError("Worker failed to load " + t.amdModuleId, o); @@ -96158,13 +96158,13 @@ class Uxe extends R { const n = this._localChannels.get(e); if (!n) throw new Error(`Missing channel ${e} on main thread`); - if (D7(t)) { + if (p8(t)) { const o = n[t].call(n, i); if (typeof o != "function") throw new Error(`Missing dynamic event ${t} on main thread channel ${e}.`); return o; } - if (T7(t)) { + if (b8(t)) { const o = n[t]; if (typeof o != "function") throw new Error(`Missing event ${t} on main thread channel ${e}.`); @@ -96179,40 +96179,40 @@ class Uxe extends R { console.error(e), console.info(t); } } -function T7(s) { - return s[0] === "o" && s[1] === "n" && ua(s.charCodeAt(2)); +function b8(s) { + return s[0] === "o" && s[1] === "n" && gc(s.charCodeAt(2)); } -function D7(s) { - return /^onDynamic/.test(s) && ua(s.charCodeAt(9)); +function p8(s) { + return /^onDynamic/.test(s) && gc(s.charCodeAt(9)); } -let jp; -typeof self == "object" && self.constructor && self.constructor.name === "DedicatedWorkerGlobalScope" && globalThis.workerttPolicy !== void 0 ? jp = globalThis.workerttPolicy : jp = nd("defaultWorkerFactory", { createScriptURL: (s) => s }); -function Kxe(s, e) { +let ng; +typeof self == "object" && self.constructor && self.constructor.name === "DedicatedWorkerGlobalScope" && globalThis.workerttPolicy !== void 0 ? ng = globalThis.workerttPolicy : ng = ra("defaultWorkerFactory", { createScriptURL: (s) => s }); +function FIe(s, e) { const t = globalThis.MonacoEnvironment; if (t) { if (typeof t.getWorker == "function") return t.getWorker("workerMain.js", e); if (typeof t.getWorkerUrl == "function") { const i = t.getWorkerUrl("workerMain.js", e); - return new Worker(jp ? jp.createScriptURL(i) : i, { name: e, type: "module" }); + return new Worker(ng ? ng.createScriptURL(i) : i, { name: e, type: "module" }); } } if (s) { - const i = Qxe(e, s.toString(!0)), n = new Worker(jp ? jp.createScriptURL(i) : i, { name: e, type: "module" }); - return jxe(n); + const i = zIe(e, s.toString(!0)), n = new Worker(ng ? ng.createScriptURL(i) : i, { name: e, type: "module" }); + return AIe(n); } throw new Error("You must define a function MonacoEnvironment.getWorkerUrl or MonacoEnvironment.getWorker"); } -function Qxe(s, e, t) { +function zIe(s, e, t) { if (!(/^((http:)|(https:)|(file:)|(vscode-file:))/.test(e) && e.substring(0, globalThis.origin.length) !== globalThis.origin)) { - const o = e.lastIndexOf("?"), r = e.lastIndexOf("#", o), l = o > 0 ? new URLSearchParams(e.substring(o + 1, ~r ? r : void 0)) : new URLSearchParams(); - W2.addSearchParam(l, !0, !0), l.toString() ? e = `${e}?${l.toString()}#${s}` : e = `${e}#${s}`; + const o = e.lastIndexOf("?"), l = e.lastIndexOf("#", o), r = o > 0 ? new URLSearchParams(e.substring(o + 1, ~l ? l : void 0)) : new URLSearchParams(); + jN.addSearchParam(r, !0, !0), r.toString() ? e = `${e}?${r.toString()}#${s}` : e = `${e}#${s}`; } - const n = new Blob([Or([ + const n = new Blob([_l([ `/*${s}*/`, void 0, - `globalThis._VSCODE_NLS_MESSAGES = ${JSON.stringify(aH())};`, - `globalThis._VSCODE_NLS_LANGUAGE = ${JSON.stringify(PR())};`, + `globalThis._VSCODE_NLS_MESSAGES = ${JSON.stringify(KP())};`, + `globalThis._VSCODE_NLS_LANGUAGE = ${JSON.stringify(bv())};`, `globalThis._VSCODE_FILE_ROOT = '${globalThis._VSCODE_FILE_ROOT}';`, "const ttPolicy = globalThis.trustedTypes?.createPolicy('defaultWorkerFactory', { createScriptURL: value => value });", "globalThis.workerttPolicy = ttPolicy;", @@ -96223,28 +96223,28 @@ function Qxe(s, e, t) { ]).join("")], { type: "application/javascript" }); return URL.createObjectURL(n); } -function jxe(s) { +function AIe(s) { return new Promise((e, t) => { s.onmessage = function(i) { i.data.type === "vscode-worker-ready" && (s.onmessage = null, e(s)); }, s.onerror = t; }); } -function qxe(s) { +function KIe(s) { return typeof s.then == "function"; } -class $xe extends R { - constructor(e, t, i, n, o, r) { +class UIe extends J { + constructor(e, t, i, n, o, l) { super(), this.id = i, this.label = n; - const l = Kxe(e, n); - qxe(l) ? this.worker = l : this.worker = Promise.resolve(l), this.postMessage(t, []), this.worker.then((a) => { - a.onmessage = function(c) { - o(c.data); - }, a.onmessageerror = r, typeof a.addEventListener == "function" && a.addEventListener("error", r); - }), this._register(Ce(() => { - var a; - (a = this.worker) == null || a.then((c) => { - c.onmessage = null, c.onmessageerror = null, c.removeEventListener("error", r), c.terminate(); + const r = FIe(e, n); + KIe(r) ? this.worker = r : this.worker = Promise.resolve(r), this.postMessage(t, []), this.worker.then((c) => { + c.onmessage = function(d) { + o(d.data); + }, c.onmessageerror = l, typeof c.addEventListener == "function" && c.addEventListener("error", l); + }), this._register(We(() => { + var c; + (c = this.worker) == null || c.then((d) => { + d.onmessage = null, d.onmessageerror = null, d.removeEventListener("error", l), d.terminate(); }), this.worker = null; })); } @@ -96257,39 +96257,39 @@ class $xe extends R { try { n.postMessage(e, t); } catch (o) { - De(o), De(new Error(`FAILED to post message to '${this.label}'-worker`, { cause: o })); + Me(o), Me(new Error(`FAILED to post message to '${this.label}'-worker`, { cause: o })); } }); } } -class eMe { +class PIe { constructor(e, t) { - this.amdModuleId = e, this.label = t, this.esmModuleLocation = W_.asBrowserUri(`${e}.esm.js`); + this.amdModuleId = e, this.label = t, this.esmModuleLocation = US.asBrowserUri(`${e}.esm.js`); } } -const h_ = class h_ { +const SS = class SS { constructor() { this._webWorkerFailedBeforeError = !1; } create(e, t, i) { - const n = ++h_.LAST_WORKER_ID; + const n = ++SS.LAST_WORKER_ID; if (this._webWorkerFailedBeforeError) throw this._webWorkerFailedBeforeError; - return new $xe(e.esmModuleLocation, e.amdModuleId, n, e.label || "anonymous" + n, t, (o) => { - gG(o), this._webWorkerFailedBeforeError = o, i(o); + return new UIe(e.esmModuleLocation, e.amdModuleId, n, e.label || "anonymous" + n, t, (o) => { + YY(o), this._webWorkerFailedBeforeError = o, i(o); }); } }; -h_.LAST_WORKER_ID = 0; -let mG = h_; -function tMe(s, e) { - const t = typeof s == "string" ? new eMe(s, e) : s; - return new Uxe(new mG(), t); +SS.LAST_WORKER_ID = 0; +let kY = SS; +function BIe(s, e) { + const t = typeof s == "string" ? new PIe(s, e) : s; + return new DIe(new kY(), t); } -class iMe { +class _Ie { constructor(e, t, i) { const n = new Uint8Array(e * t); - for (let o = 0, r = e * t; o < r; o++) + for (let o = 0, l = e * t; o < l; o++) n[o] = i; this._data = n, this.rows = e, this.cols = t; } @@ -96300,23 +96300,23 @@ class iMe { this._data[e * this.cols + t] = i; } } -class nMe { +class QIe { constructor(e) { let t = 0, i = 0; - for (let o = 0, r = e.length; o < r; o++) { - const [l, a, c] = e[o]; - a > t && (t = a), l > i && (i = l), c > i && (i = c); + for (let o = 0, l = e.length; o < l; o++) { + const [r, c, d] = e[o]; + c > t && (t = c), r > i && (i = r), d > i && (i = d); } t++, i++; - const n = new iMe( + const n = new _Ie( i, t, 0 /* State.Invalid */ ); - for (let o = 0, r = e.length; o < r; o++) { - const [l, a, c] = e[o]; - n.set(l, a, c); + for (let o = 0, l = e.length; o < l; o++) { + const [r, c, d] = e[o]; + n.set(r, c, d); } this._states = n, this._maxCharCode = t; } @@ -96324,9 +96324,9 @@ class nMe { return t < 0 || t >= this._maxCharCode ? 0 : this._states.get(e, t); } } -let $W = null; -function sMe() { - return $W === null && ($W = new nMe([ +let pN = null; +function OIe() { + return pN === null && (pN = new QIe([ [ 1, 104, @@ -96459,118 +96459,118 @@ function sMe() { 12 /* State.End */ ] - ])), $W; + ])), pN; } -let Q0 = null; -function oMe() { - if (Q0 === null) { - Q0 = new $b( +let sf = null; +function jIe() { + if (sf === null) { + sf = new o0( 0 /* CharacterClass.None */ ); const s = ` <>'"、。。、,.:;‘〈「『〔([{「」}])〕』」〉’`~…`; for (let t = 0; t < s.length; t++) - Q0.set( + sf.set( s.charCodeAt(t), 1 /* CharacterClass.ForceTermination */ ); const e = ".,;:"; for (let t = 0; t < e.length; t++) - Q0.set( + sf.set( e.charCodeAt(t), 2 /* CharacterClass.CannotEndIn */ ); } - return Q0; + return sf; } -class MM { +class DI { static _createLink(e, t, i, n, o) { - let r = o - 1; + let l = o - 1; do { - const l = t.charCodeAt(r); - if (e.get(l) !== 2) + const r = t.charCodeAt(l); + if (e.get(r) !== 2) break; - r--; - } while (r > n); + l--; + } while (l > n); if (n > 0) { - const l = t.charCodeAt(n - 1), a = t.charCodeAt(r); - (l === 40 && a === 41 || l === 91 && a === 93 || l === 123 && a === 125) && r--; + const r = t.charCodeAt(n - 1), c = t.charCodeAt(l); + (r === 40 && c === 41 || r === 91 && c === 93 || r === 123 && c === 125) && l--; } return { range: { startLineNumber: i, startColumn: n + 1, endLineNumber: i, - endColumn: r + 2 + endColumn: l + 2 }, - url: t.substring(n, r + 1) + url: t.substring(n, l + 1) }; } - static computeLinks(e, t = sMe()) { - const i = oMe(), n = []; - for (let o = 1, r = e.getLineCount(); o <= r; o++) { - const l = e.getLineContent(o), a = l.length; - let c = 0, d = 0, h = 0, u = 1, g = !1, m = !1, f = !1, b = !1; - for (; c < a; ) { - let y = !1; - const w = l.charCodeAt(c); + static computeLinks(e, t = OIe()) { + const i = jIe(), n = []; + for (let o = 1, l = e.getLineCount(); o <= l; o++) { + const r = e.getLineContent(o), c = r.length; + let d = 0, a = 0, h = 0, u = 1, m = !1, b = !1, g = !1, Z = !1; + for (; d < c; ) { + let f = !1; + const y = r.charCodeAt(d); if (u === 13) { - let C; - switch (w) { + let W; + switch (y) { case 40: - g = !0, C = 0; + m = !0, W = 0; break; case 41: - C = g ? 0 : 1; + W = m ? 0 : 1; break; case 91: - f = !0, m = !0, C = 0; + g = !0, b = !0, W = 0; break; case 93: - f = !1, C = m ? 0 : 1; + g = !1, W = b ? 0 : 1; break; case 123: - b = !0, C = 0; + Z = !0, W = 0; break; case 125: - C = b ? 0 : 1; + W = Z ? 0 : 1; break; case 39: case 34: case 96: - h === w ? C = 1 : h === 39 || h === 34 || h === 96 ? C = 0 : C = 1; + h === y ? W = 1 : h === 39 || h === 34 || h === 96 ? W = 0 : W = 1; break; case 42: - C = h === 42 ? 1 : 0; + W = h === 42 ? 1 : 0; break; case 124: - C = h === 124 ? 1 : 0; + W = h === 124 ? 1 : 0; break; case 32: - C = f ? 0 : 1; + W = g ? 0 : 1; break; default: - C = i.get(w); + W = i.get(y); } - C === 1 && (n.push(MM._createLink(i, l, o, d, c)), y = !0); + W === 1 && (n.push(DI._createLink(i, r, o, a, d)), f = !0); } else if (u === 12) { - let C; - w === 91 ? (m = !0, C = 0) : C = i.get(w), C === 1 ? y = !0 : u = 13; + let W; + y === 91 ? (b = !0, W = 0) : W = i.get(y), W === 1 ? f = !0 : u = 13; } else - u = t.nextState(u, w), u === 0 && (y = !0); - y && (u = 1, g = !1, m = !1, b = !1, d = c + 1, h = w), c++; + u = t.nextState(u, y), u === 0 && (f = !0); + f && (u = 1, m = !1, b = !1, Z = !1, a = d + 1, h = y), d++; } - u === 13 && n.push(MM._createLink(i, l, o, d, a)); + u === 13 && n.push(DI._createLink(i, r, o, a, c)); } return n; } } -function rMe(s) { - return !s || typeof s.getLineCount != "function" || typeof s.getLineContent != "function" ? [] : MM.computeLinks(s); +function qIe(s) { + return !s || typeof s.getLineCount != "function" || typeof s.getLineContent != "function" ? [] : DI.computeLinks(s); } -const u_ = class u_ { +const xS = class xS { constructor() { this._defaultValueSet = [ ["true", "false"], @@ -96581,19 +96581,19 @@ const u_ = class u_ { } navigateValueSet(e, t, i, n, o) { if (e && t) { - const r = this.doNavigateValueSet(t, o); - if (r) + const l = this.doNavigateValueSet(t, o); + if (l) return { range: e, - value: r + value: l }; } if (i && n) { - const r = this.doNavigateValueSet(n, o); - if (r) + const l = this.doNavigateValueSet(n, o); + if (l) return { range: i, - value: r + value: l }; } return null; @@ -96613,7 +96613,7 @@ const u_ = class u_ { } valueSetsReplace(e, t, i) { let n = null; - for (let o = 0, r = e.length; n === null && o < r; o++) + for (let o = 0, l = e.length; n === null && o < l; o++) n = this.valueSetReplace(e[o], t, i); return n; } @@ -96622,50 +96622,50 @@ const u_ = class u_ { return n >= 0 ? (n += i ? 1 : -1, n < 0 ? n = e.length - 1 : n %= e.length, e[n]) : null; } }; -u_.INSTANCE = new u_(); -let pG = u_; -const Mw = class Mw { +xS.INSTANCE = new xS(); +let vY = xS; +const Jy = class Jy { static getChannel(e) { - return e.getChannel(Mw.CHANNEL_NAME); + return e.getChannel(Jy.CHANNEL_NAME); } static setChannel(e, t) { - e.setChannel(Mw.CHANNEL_NAME, t); + e.setChannel(Jy.CHANNEL_NAME, t); } }; -Mw.CHANNEL_NAME = "editorWorkerHost"; -let fG = Mw; -const lMe = 3; -class aMe { +Jy.CHANNEL_NAME = "editorWorkerHost"; +let JY = Jy; +const $Ie = 3; +class e2e { computeDiff(e, t, i) { - var a; - const o = new hMe(e, t, { + var c; + const o = new n2e(e, t, { maxComputationTime: i.maxComputationTimeMs, shouldIgnoreTrimWhitespace: i.ignoreTrimWhitespace, shouldComputeCharChanges: !0, shouldMakePrettyDiff: !0, shouldPostProcessCharChanges: !0 - }).computeDiff(), r = []; - let l = null; - for (const c of o.changes) { - let d; - c.originalEndLineNumber === 0 ? d = new We(c.originalStartLineNumber + 1, c.originalStartLineNumber + 1) : d = new We(c.originalStartLineNumber, c.originalEndLineNumber + 1); + }).computeDiff(), l = []; + let r = null; + for (const d of o.changes) { + let a; + d.originalEndLineNumber === 0 ? a = new Ne(d.originalStartLineNumber + 1, d.originalStartLineNumber + 1) : a = new Ne(d.originalStartLineNumber, d.originalEndLineNumber + 1); let h; - c.modifiedEndLineNumber === 0 ? h = new We(c.modifiedStartLineNumber + 1, c.modifiedStartLineNumber + 1) : h = new We(c.modifiedStartLineNumber, c.modifiedEndLineNumber + 1); - let u = new zo(d, h, (a = c.charChanges) == null ? void 0 : a.map((g) => new Wo(new M(g.originalStartLineNumber, g.originalStartColumn, g.originalEndLineNumber, g.originalEndColumn), new M(g.modifiedStartLineNumber, g.modifiedStartColumn, g.modifiedEndLineNumber, g.modifiedEndColumn)))); - l && (l.modified.endLineNumberExclusive === u.modified.startLineNumber || l.original.endLineNumberExclusive === u.original.startLineNumber) && (u = new zo(l.original.join(u.original), l.modified.join(u.modified), l.innerChanges && u.innerChanges ? l.innerChanges.concat(u.innerChanges) : void 0), r.pop()), r.push(u), l = u; + d.modifiedEndLineNumber === 0 ? h = new Ne(d.modifiedStartLineNumber + 1, d.modifiedStartLineNumber + 1) : h = new Ne(d.modifiedStartLineNumber, d.modifiedEndLineNumber + 1); + let u = new Ko(a, h, (c = d.charChanges) == null ? void 0 : c.map((m) => new To(new I(m.originalStartLineNumber, m.originalStartColumn, m.originalEndLineNumber, m.originalEndColumn), new I(m.modifiedStartLineNumber, m.modifiedStartColumn, m.modifiedEndLineNumber, m.modifiedEndColumn)))); + r && (r.modified.endLineNumberExclusive === u.modified.startLineNumber || r.original.endLineNumberExclusive === u.original.startLineNumber) && (u = new Ko(r.original.join(u.original), r.modified.join(u.modified), r.innerChanges && u.innerChanges ? r.innerChanges.concat(u.innerChanges) : void 0), l.pop()), l.push(u), r = u; } - return gm(() => gE(r, (c, d) => d.original.startLineNumber - c.original.endLineNumberExclusive === d.modified.startLineNumber - c.modified.endLineNumberExclusive && // There has to be an unchanged line in between (otherwise both diffs should have been joined) - c.original.endLineNumberExclusive < d.original.startLineNumber && c.modified.endLineNumberExclusive < d.modified.startLineNumber)), new ML(r, [], o.quitEarly); + return fb(() => Hv(l, (d, a) => a.original.startLineNumber - d.original.endLineNumberExclusive === a.modified.startLineNumber - d.modified.endLineNumberExclusive && // There has to be an unchanged line in between (otherwise both diffs should have been joined) + d.original.endLineNumberExclusive < a.original.startLineNumber && d.modified.endLineNumberExclusive < a.modified.startLineNumber)), new DX(l, [], o.quitEarly); } } -function V7(s, e, t, i) { - return new wa(s, e, t).ComputeDiff(i); +function g8(s, e, t, i) { + return new Vc(s, e, t).ComputeDiff(i); } -class eB { +class I3 { constructor(e) { const t = [], i = []; for (let n = 0, o = e.length; n < o; n++) - t[n] = bG(e[n], 1), i[n] = yG(e[n], 1); + t[n] = HY(e[n], 1), i[n] = EY(e[n], 1); this.lines = e, this._startColumns = t, this._endColumns = i; } getElements() { @@ -96684,18 +96684,18 @@ class eB { return e + 1; } createCharSequence(e, t, i) { - const n = [], o = [], r = []; - let l = 0; - for (let a = t; a <= i; a++) { - const c = this.lines[a], d = e ? this._startColumns[a] : 1, h = e ? this._endColumns[a] : c.length + 1; - for (let u = d; u < h; u++) - n[l] = c.charCodeAt(u - 1), o[l] = a + 1, r[l] = u, l++; - !e && a < i && (n[l] = 10, o[l] = a + 1, r[l] = c.length + 1, l++); + const n = [], o = [], l = []; + let r = 0; + for (let c = t; c <= i; c++) { + const d = this.lines[c], a = e ? this._startColumns[c] : 1, h = e ? this._endColumns[c] : d.length + 1; + for (let u = a; u < h; u++) + n[r] = d.charCodeAt(u - 1), o[r] = c + 1, l[r] = u, r++; + !e && c < i && (n[r] = 10, o[r] = c + 1, l[r] = d.length + 1, r++); } - return new cMe(n, o, r); + return new t2e(n, o, l); } } -class cMe { +class t2e { constructor(e, t, i) { this._charCodes = e, this._lineNumbers = t, this._columns = i; } @@ -96722,47 +96722,47 @@ class cMe { return e === -1 ? this.getStartColumn(e + 1) : (this._assertIndex(e, this._columns), this._charCodes[e] === 10 ? 1 : this._columns[e] + 1); } } -class Yf { - constructor(e, t, i, n, o, r, l, a) { - this.originalStartLineNumber = e, this.originalStartColumn = t, this.originalEndLineNumber = i, this.originalEndColumn = n, this.modifiedStartLineNumber = o, this.modifiedStartColumn = r, this.modifiedEndLineNumber = l, this.modifiedEndColumn = a; +class Bg { + constructor(e, t, i, n, o, l, r, c) { + this.originalStartLineNumber = e, this.originalStartColumn = t, this.originalEndLineNumber = i, this.originalEndColumn = n, this.modifiedStartLineNumber = o, this.modifiedStartColumn = l, this.modifiedEndLineNumber = r, this.modifiedEndColumn = c; } static createFromDiffChange(e, t, i) { - const n = t.getStartLineNumber(e.originalStart), o = t.getStartColumn(e.originalStart), r = t.getEndLineNumber(e.originalStart + e.originalLength - 1), l = t.getEndColumn(e.originalStart + e.originalLength - 1), a = i.getStartLineNumber(e.modifiedStart), c = i.getStartColumn(e.modifiedStart), d = i.getEndLineNumber(e.modifiedStart + e.modifiedLength - 1), h = i.getEndColumn(e.modifiedStart + e.modifiedLength - 1); - return new Yf(n, o, r, l, a, c, d, h); + const n = t.getStartLineNumber(e.originalStart), o = t.getStartColumn(e.originalStart), l = t.getEndLineNumber(e.originalStart + e.originalLength - 1), r = t.getEndColumn(e.originalStart + e.originalLength - 1), c = i.getStartLineNumber(e.modifiedStart), d = i.getStartColumn(e.modifiedStart), a = i.getEndLineNumber(e.modifiedStart + e.modifiedLength - 1), h = i.getEndColumn(e.modifiedStart + e.modifiedLength - 1); + return new Bg(n, o, l, r, c, d, a, h); } } -function dMe(s) { +function i2e(s) { if (s.length <= 1) return s; const e = [s[0]]; let t = e[0]; for (let i = 1, n = s.length; i < n; i++) { - const o = s[i], r = o.originalStart - (t.originalStart + t.originalLength), l = o.modifiedStart - (t.modifiedStart + t.modifiedLength); - Math.min(r, l) < lMe ? (t.originalLength = o.originalStart + o.originalLength - t.originalStart, t.modifiedLength = o.modifiedStart + o.modifiedLength - t.modifiedStart) : (e.push(o), t = o); + const o = s[i], l = o.originalStart - (t.originalStart + t.originalLength), r = o.modifiedStart - (t.modifiedStart + t.modifiedLength); + Math.min(l, r) < $Ie ? (t.originalLength = o.originalStart + o.originalLength - t.originalStart, t.modifiedLength = o.modifiedStart + o.modifiedLength - t.modifiedStart) : (e.push(o), t = o); } return e; } -class sw { +class py { constructor(e, t, i, n, o) { this.originalStartLineNumber = e, this.originalEndLineNumber = t, this.modifiedStartLineNumber = i, this.modifiedEndLineNumber = n, this.charChanges = o; } - static createFromDiffResult(e, t, i, n, o, r, l) { - let a, c, d, h, u; - if (t.originalLength === 0 ? (a = i.getStartLineNumber(t.originalStart) - 1, c = 0) : (a = i.getStartLineNumber(t.originalStart), c = i.getEndLineNumber(t.originalStart + t.originalLength - 1)), t.modifiedLength === 0 ? (d = n.getStartLineNumber(t.modifiedStart) - 1, h = 0) : (d = n.getStartLineNumber(t.modifiedStart), h = n.getEndLineNumber(t.modifiedStart + t.modifiedLength - 1)), r && t.originalLength > 0 && t.originalLength < 20 && t.modifiedLength > 0 && t.modifiedLength < 20 && o()) { - const g = i.createCharSequence(e, t.originalStart, t.originalStart + t.originalLength - 1), m = n.createCharSequence(e, t.modifiedStart, t.modifiedStart + t.modifiedLength - 1); - if (g.getElements().length > 0 && m.getElements().length > 0) { - let f = V7(g, m, o, !0).changes; - l && (f = dMe(f)), u = []; - for (let b = 0, y = f.length; b < y; b++) - u.push(Yf.createFromDiffChange(f[b], g, m)); + static createFromDiffResult(e, t, i, n, o, l, r) { + let c, d, a, h, u; + if (t.originalLength === 0 ? (c = i.getStartLineNumber(t.originalStart) - 1, d = 0) : (c = i.getStartLineNumber(t.originalStart), d = i.getEndLineNumber(t.originalStart + t.originalLength - 1)), t.modifiedLength === 0 ? (a = n.getStartLineNumber(t.modifiedStart) - 1, h = 0) : (a = n.getStartLineNumber(t.modifiedStart), h = n.getEndLineNumber(t.modifiedStart + t.modifiedLength - 1)), l && t.originalLength > 0 && t.originalLength < 20 && t.modifiedLength > 0 && t.modifiedLength < 20 && o()) { + const m = i.createCharSequence(e, t.originalStart, t.originalStart + t.originalLength - 1), b = n.createCharSequence(e, t.modifiedStart, t.modifiedStart + t.modifiedLength - 1); + if (m.getElements().length > 0 && b.getElements().length > 0) { + let g = g8(m, b, o, !0).changes; + r && (g = i2e(g)), u = []; + for (let Z = 0, f = g.length; Z < f; Z++) + u.push(Bg.createFromDiffChange(g[Z], m, b)); } } - return new sw(a, c, d, h, u); + return new py(c, d, a, h, u); } } -class hMe { +class n2e { constructor(e, t, i) { - this.shouldComputeCharChanges = i.shouldComputeCharChanges, this.shouldPostProcessCharChanges = i.shouldPostProcessCharChanges, this.shouldIgnoreTrimWhitespace = i.shouldIgnoreTrimWhitespace, this.shouldMakePrettyDiff = i.shouldMakePrettyDiff, this.originalLines = e, this.modifiedLines = t, this.original = new eB(e), this.modified = new eB(t), this.continueLineDiff = tB(i.maxComputationTime), this.continueCharDiff = tB(i.maxComputationTime === 0 ? 0 : Math.min(i.maxComputationTime, 5e3)); + this.shouldComputeCharChanges = i.shouldComputeCharChanges, this.shouldPostProcessCharChanges = i.shouldPostProcessCharChanges, this.shouldIgnoreTrimWhitespace = i.shouldIgnoreTrimWhitespace, this.shouldMakePrettyDiff = i.shouldMakePrettyDiff, this.originalLines = e, this.modifiedLines = t, this.original = new I3(e), this.modified = new I3(t), this.continueLineDiff = S3(i.maxComputationTime), this.continueCharDiff = S3(i.maxComputationTime === 0 ? 0 : Math.min(i.maxComputationTime, 5e3)); } computeDiff() { if (this.original.lines.length === 1 && this.original.lines[0].length === 0) @@ -96790,87 +96790,87 @@ class hMe { charChanges: void 0 }] }; - const e = V7(this.original, this.modified, this.continueLineDiff, this.shouldMakePrettyDiff), t = e.changes, i = e.quitEarly; + const e = g8(this.original, this.modified, this.continueLineDiff, this.shouldMakePrettyDiff), t = e.changes, i = e.quitEarly; if (this.shouldIgnoreTrimWhitespace) { - const l = []; - for (let a = 0, c = t.length; a < c; a++) - l.push(sw.createFromDiffResult(this.shouldIgnoreTrimWhitespace, t[a], this.original, this.modified, this.continueCharDiff, this.shouldComputeCharChanges, this.shouldPostProcessCharChanges)); + const r = []; + for (let c = 0, d = t.length; c < d; c++) + r.push(py.createFromDiffResult(this.shouldIgnoreTrimWhitespace, t[c], this.original, this.modified, this.continueCharDiff, this.shouldComputeCharChanges, this.shouldPostProcessCharChanges)); return { quitEarly: i, - changes: l + changes: r }; } const n = []; - let o = 0, r = 0; - for (let l = -1, a = t.length; l < a; l++) { - const c = l + 1 < a ? t[l + 1] : null, d = c ? c.originalStart : this.originalLines.length, h = c ? c.modifiedStart : this.modifiedLines.length; - for (; o < d && r < h; ) { - const u = this.originalLines[o], g = this.modifiedLines[r]; - if (u !== g) { + let o = 0, l = 0; + for (let r = -1, c = t.length; r < c; r++) { + const d = r + 1 < c ? t[r + 1] : null, a = d ? d.originalStart : this.originalLines.length, h = d ? d.modifiedStart : this.modifiedLines.length; + for (; o < a && l < h; ) { + const u = this.originalLines[o], m = this.modifiedLines[l]; + if (u !== m) { { - let m = bG(u, 1), f = bG(g, 1); - for (; m > 1 && f > 1; ) { - const b = u.charCodeAt(m - 2), y = g.charCodeAt(f - 2); - if (b !== y) + let b = HY(u, 1), g = HY(m, 1); + for (; b > 1 && g > 1; ) { + const Z = u.charCodeAt(b - 2), f = m.charCodeAt(g - 2); + if (Z !== f) break; - m--, f--; + b--, g--; } - (m > 1 || f > 1) && this._pushTrimWhitespaceCharChange(n, o + 1, 1, m, r + 1, 1, f); + (b > 1 || g > 1) && this._pushTrimWhitespaceCharChange(n, o + 1, 1, b, l + 1, 1, g); } { - let m = yG(u, 1), f = yG(g, 1); - const b = u.length + 1, y = g.length + 1; - for (; m < b && f < y; ) { - const w = u.charCodeAt(m - 1), C = u.charCodeAt(f - 1); - if (w !== C) + let b = EY(u, 1), g = EY(m, 1); + const Z = u.length + 1, f = m.length + 1; + for (; b < Z && g < f; ) { + const y = u.charCodeAt(b - 1), W = u.charCodeAt(g - 1); + if (y !== W) break; - m++, f++; + b++, g++; } - (m < b || f < y) && this._pushTrimWhitespaceCharChange(n, o + 1, m, b, r + 1, f, y); + (b < Z || g < f) && this._pushTrimWhitespaceCharChange(n, o + 1, b, Z, l + 1, g, f); } } - o++, r++; + o++, l++; } - c && (n.push(sw.createFromDiffResult(this.shouldIgnoreTrimWhitespace, c, this.original, this.modified, this.continueCharDiff, this.shouldComputeCharChanges, this.shouldPostProcessCharChanges)), o += c.originalLength, r += c.modifiedLength); + d && (n.push(py.createFromDiffResult(this.shouldIgnoreTrimWhitespace, d, this.original, this.modified, this.continueCharDiff, this.shouldComputeCharChanges, this.shouldPostProcessCharChanges)), o += d.originalLength, l += d.modifiedLength); } return { quitEarly: i, changes: n }; } - _pushTrimWhitespaceCharChange(e, t, i, n, o, r, l) { - if (this._mergeTrimWhitespaceCharChange(e, t, i, n, o, r, l)) + _pushTrimWhitespaceCharChange(e, t, i, n, o, l, r) { + if (this._mergeTrimWhitespaceCharChange(e, t, i, n, o, l, r)) return; - let a; - this.shouldComputeCharChanges && (a = [new Yf(t, i, t, n, o, r, o, l)]), e.push(new sw(t, t, o, o, a)); + let c; + this.shouldComputeCharChanges && (c = [new Bg(t, i, t, n, o, l, o, r)]), e.push(new py(t, t, o, o, c)); } - _mergeTrimWhitespaceCharChange(e, t, i, n, o, r, l) { - const a = e.length; - if (a === 0) + _mergeTrimWhitespaceCharChange(e, t, i, n, o, l, r) { + const c = e.length; + if (c === 0) return !1; - const c = e[a - 1]; - return c.originalEndLineNumber === 0 || c.modifiedEndLineNumber === 0 ? !1 : c.originalEndLineNumber === t && c.modifiedEndLineNumber === o ? (this.shouldComputeCharChanges && c.charChanges && c.charChanges.push(new Yf(t, i, t, n, o, r, o, l)), !0) : c.originalEndLineNumber + 1 === t && c.modifiedEndLineNumber + 1 === o ? (c.originalEndLineNumber = t, c.modifiedEndLineNumber = o, this.shouldComputeCharChanges && c.charChanges && c.charChanges.push(new Yf(t, i, t, n, o, r, o, l)), !0) : !1; + const d = e[c - 1]; + return d.originalEndLineNumber === 0 || d.modifiedEndLineNumber === 0 ? !1 : d.originalEndLineNumber === t && d.modifiedEndLineNumber === o ? (this.shouldComputeCharChanges && d.charChanges && d.charChanges.push(new Bg(t, i, t, n, o, l, o, r)), !0) : d.originalEndLineNumber + 1 === t && d.modifiedEndLineNumber + 1 === o ? (d.originalEndLineNumber = t, d.modifiedEndLineNumber = o, this.shouldComputeCharChanges && d.charChanges && d.charChanges.push(new Bg(t, i, t, n, o, l, o, r)), !0) : !1; } } -function bG(s, e) { - const t = qn(s); +function HY(s, e) { + const t = es(s); return t === -1 ? e : t + 1; } -function yG(s, e) { - const t = Ml(s); +function EY(s, e) { + const t = Rr(s); return t === -1 ? e : t + 2; } -function tB(s) { +function S3(s) { if (s === 0) return () => !0; const e = Date.now(); return () => Date.now() - e < s; } -const iB = { - getLegacy: () => new aMe(), - getDefault: () => new a4() +const x3 = { + getLegacy: () => new e2e(), + getDefault: () => new KO() }; -function k7(s) { +function Z8(s) { const e = []; for (const t of s) { const i = Number(t); @@ -96878,7 +96878,7 @@ function k7(s) { } return e; } -function u9(s, e, t, i) { +function JE(s, e, t, i) { return { red: s / 255, blue: t / 255, @@ -96886,7 +96886,7 @@ function u9(s, e, t, i) { alpha: i }; } -function j0(s, e) { +function of(s, e) { const t = e.index, i = e[0].length; if (!t) return; @@ -96898,126 +96898,126 @@ function j0(s, e) { endColumn: n.column + i }; } -function uMe(s, e) { +function s2e(s, e) { if (!s) return; - const t = K.Format.CSS.parseHex(e); + const t = Q.Format.CSS.parseHex(e); if (t) return { range: s, - color: u9(t.rgba.r, t.rgba.g, t.rgba.b, t.rgba.a) + color: JE(t.rgba.r, t.rgba.g, t.rgba.b, t.rgba.a) }; } -function nB(s, e, t) { +function C3(s, e, t) { if (!s || e.length !== 1) return; - const n = e[0].values(), o = k7(n); + const n = e[0].values(), o = Z8(n); return { range: s, - color: u9(o[0], o[1], o[2], t ? o[3] : 1) + color: JE(o[0], o[1], o[2], t ? o[3] : 1) }; } -function sB(s, e, t) { +function R3(s, e, t) { if (!s || e.length !== 1) return; - const n = e[0].values(), o = k7(n), r = new K(new Vr(o[0], o[1] / 100, o[2] / 100, t ? o[3] : 1)); + const n = e[0].values(), o = Z8(n), l = new Q(new Jl(o[0], o[1] / 100, o[2] / 100, t ? o[3] : 1)); return { range: s, - color: u9(r.rgba.r, r.rgba.g, r.rgba.b, r.rgba.a) + color: JE(l.rgba.r, l.rgba.g, l.rgba.b, l.rgba.a) }; } -function q0(s, e) { +function lf(s, e) { return typeof s == "string" ? [...s.matchAll(e)] : s.findMatches(e); } -function gMe(s) { - const e = [], i = q0(s, /\b(rgb|rgba|hsl|hsla)(\([0-9\s,.\%]*\))|(#)([A-Fa-f0-9]{3})\b|(#)([A-Fa-f0-9]{4})\b|(#)([A-Fa-f0-9]{6})\b|(#)([A-Fa-f0-9]{8})\b/gm); +function o2e(s) { + const e = [], i = lf(s, /\b(rgb|rgba|hsl|hsla)(\([0-9\s,.\%]*\))|(#)([A-Fa-f0-9]{3})\b|(#)([A-Fa-f0-9]{4})\b|(#)([A-Fa-f0-9]{6})\b|(#)([A-Fa-f0-9]{8})\b/gm); if (i.length > 0) for (const n of i) { - const o = n.filter((c) => c !== void 0), r = o[1], l = o[2]; - if (!l) + const o = n.filter((d) => d !== void 0), l = o[1], r = o[2]; + if (!r) continue; - let a; - if (r === "rgb") { - const c = /^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*\)$/gm; - a = nB(j0(s, n), q0(l, c), !1); - } else if (r === "rgba") { - const c = /^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm; - a = nB(j0(s, n), q0(l, c), !0); - } else if (r === "hsl") { - const c = /^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*\)$/gm; - a = sB(j0(s, n), q0(l, c), !1); - } else if (r === "hsla") { - const c = /^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm; - a = sB(j0(s, n), q0(l, c), !0); - } else r === "#" && (a = uMe(j0(s, n), r + l)); - a && e.push(a); + let c; + if (l === "rgb") { + const d = /^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*\)$/gm; + c = C3(of(s, n), lf(r, d), !1); + } else if (l === "rgba") { + const d = /^\(\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(25[0-5]|2[0-4][0-9]|1[0-9]{2}|[1-9][0-9]|[0-9])\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm; + c = C3(of(s, n), lf(r, d), !0); + } else if (l === "hsl") { + const d = /^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*\)$/gm; + c = R3(of(s, n), lf(r, d), !1); + } else if (l === "hsla") { + const d = /^\(\s*(36[0]|3[0-5][0-9]|[12][0-9][0-9]|[1-9]?[0-9])\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(100|\d{1,2}[.]\d*|\d{1,2})%\s*,\s*(0[.][0-9]+|[.][0-9]+|[01][.]|[01])\s*\)$/gm; + c = R3(of(s, n), lf(r, d), !0); + } else l === "#" && (c = s2e(of(s, n), l + r)); + c && e.push(c); } return e; } -function mMe(s) { - return !s || typeof s.getValue != "function" || typeof s.positionAt != "function" ? [] : gMe(s); +function l2e(s) { + return !s || typeof s.getValue != "function" || typeof s.positionAt != "function" ? [] : o2e(s); } -const oB = new RegExp("\\bMARK:\\s*(.*)$", "d"), pMe = /^-+|-+$/g; -function fMe(s, e) { +const N3 = new RegExp("\\bMARK:\\s*(.*)$", "d"), r2e = /^-+|-+$/g; +function c2e(s, e) { var i; let t = []; if (e.findRegionSectionHeaders && ((i = e.foldingRules) != null && i.markers)) { - const n = bMe(s, e); + const n = d2e(s, e); t = t.concat(n); } if (e.findMarkSectionHeaders) { - const n = yMe(s); + const n = a2e(s); t = t.concat(n); } return t; } -function bMe(s, e) { +function d2e(s, e) { const t = [], i = s.getLineCount(); for (let n = 1; n <= i; n++) { - const o = s.getLineContent(n), r = o.match(e.foldingRules.markers.start); - if (r) { - const l = { startLineNumber: n, startColumn: r[0].length + 1, endLineNumber: n, endColumn: o.length + 1 }; - if (l.endColumn > l.startColumn) { - const a = { - range: l, - ...G7(o.substring(r[0].length)), + const o = s.getLineContent(n), l = o.match(e.foldingRules.markers.start); + if (l) { + const r = { startLineNumber: n, startColumn: l[0].length + 1, endLineNumber: n, endColumn: o.length + 1 }; + if (r.endColumn > r.startColumn) { + const c = { + range: r, + ...f8(o.substring(l[0].length)), shouldBeInComments: !1 }; - (a.text || a.hasSeparatorLine) && t.push(a); + (c.text || c.hasSeparatorLine) && t.push(c); } } } return t; } -function yMe(s) { +function a2e(s) { const e = [], t = s.getLineCount(); for (let i = 1; i <= t; i++) { const n = s.getLineContent(i); - wMe(n, i, e); + h2e(n, i, e); } return e; } -function wMe(s, e, t) { - oB.lastIndex = 0; - const i = oB.exec(s); +function h2e(s, e, t) { + N3.lastIndex = 0; + const i = N3.exec(s); if (i) { - const n = i.indices[1][0] + 1, o = i.indices[1][1] + 1, r = { startLineNumber: e, startColumn: n, endLineNumber: e, endColumn: o }; - if (r.endColumn > r.startColumn) { - const l = { - range: r, - ...G7(i[1]), + const n = i.indices[1][0] + 1, o = i.indices[1][1] + 1, l = { startLineNumber: e, startColumn: n, endLineNumber: e, endColumn: o }; + if (l.endColumn > l.startColumn) { + const r = { + range: l, + ...f8(i[1]), shouldBeInComments: !0 }; - (l.text || l.hasSeparatorLine) && t.push(l); + (r.text || r.hasSeparatorLine) && t.push(r); } } } -function G7(s) { +function f8(s) { s = s.trim(); const e = s.startsWith("-"); - return s = s.replace(pMe, ""), { text: s, hasSeparatorLine: e }; + return s = s.replace(r2e, ""), { text: s, hasSeparatorLine: e }; } -class CMe { +class u2e { constructor(e, t, i, n) { this._uri = e, this._lines = t, this._eol = i, this._versionId = n, this._lineStarts = null, this._cachedTextValue = null; } @@ -97034,7 +97034,7 @@ class CMe { e.eol && e.eol !== this._eol && (this._eol = e.eol, this._lineStarts = null); const t = e.changes; for (const i of t) - this._acceptDeleteRange(i.range), this._acceptInsertText(new V(i.range.startLineNumber, i.range.startColumn), i.text); + this._acceptDeleteRange(i.range), this._acceptInsertText(new Y(i.range.startLineNumber, i.range.startColumn), i.text); this._versionId = e.versionId, this._cachedTextValue = null; } _ensureLineStarts() { @@ -97042,7 +97042,7 @@ class CMe { const e = this._eol.length, t = this._lines.length, i = new Uint32Array(t); for (let n = 0; n < t; n++) i[n] = this._lines[n].length + e; - this._lineStarts = new Gce(i); + this._lineStarts = new Cae(i); } } /** @@ -97063,7 +97063,7 @@ class CMe { _acceptInsertText(e, t) { if (t.length === 0) return; - const i = Fa(t); + const i = Kc(t); if (i.length === 1) { this._setLineText(e.lineNumber - 1, this._lines[e.lineNumber - 1].substring(0, e.column - 1) + i[0] + this._lines[e.lineNumber - 1].substring(e.column - 1)); return; @@ -97075,17 +97075,17 @@ class CMe { this._lineStarts && this._lineStarts.insertValues(e.lineNumber, n); } } -const rB = 60 * 1e3; -class SMe extends R { +const w3 = 60 * 1e3; +class m2e extends J { constructor(e, t, i = !1) { if (super(), this._syncedModels = /* @__PURE__ */ Object.create(null), this._syncedModelsLastUsedTime = /* @__PURE__ */ Object.create(null), this._proxy = e, this._modelService = t, !i) { - const n = new $R(); - n.cancelAndSet(() => this._checkStopModelSync(), Math.round(rB / 2)), this._register(n); + const n = new Lv(); + n.cancelAndSet(() => this._checkStopModelSync(), Math.round(w3 / 2)), this._register(n); } } dispose() { for (const e in this._syncedModels) - Wt(this._syncedModels[e]); + Nt(this._syncedModels[e]); this._syncedModels = /* @__PURE__ */ Object.create(null), this._syncedModelsLastUsedTime = /* @__PURE__ */ Object.create(null), super.dispose(); } ensureSyncedResources(e, t = !1) { @@ -97097,7 +97097,7 @@ class SMe extends R { _checkStopModelSync() { const e = (/* @__PURE__ */ new Date()).getTime(), t = []; for (const i in this._syncedModelsLastUsedTime) - e - this._syncedModelsLastUsedTime[i] > rB && t.push(i); + e - this._syncedModelsLastUsedTime[i] > w3 && t.push(i); for (const i of t) this._stopModelSync(i); } @@ -97112,21 +97112,21 @@ class SMe extends R { EOL: i.getEOL(), versionId: i.getVersionId() }); - const o = new U(); - o.add(i.onDidChangeContent((r) => { - this._proxy.$acceptModelChanged(n.toString(), r); + const o = new _(); + o.add(i.onDidChangeContent((l) => { + this._proxy.$acceptModelChanged(n.toString(), l); })), o.add(i.onWillDispose(() => { this._stopModelSync(n); - })), o.add(Ce(() => { + })), o.add(We(() => { this._proxy.$acceptRemovedModel(n); })), this._syncedModels[n] = o; } _stopModelSync(e) { const t = this._syncedModels[e]; - delete this._syncedModels[e], delete this._syncedModelsLastUsedTime[e], Wt(t); + delete this._syncedModels[e], delete this._syncedModelsLastUsedTime[e], Nt(t); } } -class LMe { +class b2e { constructor() { this._models = /* @__PURE__ */ Object.create(null); } @@ -97138,7 +97138,7 @@ class LMe { return Object.keys(this._models).forEach((t) => e.push(this._models[t])), e; } $acceptNewModel(e) { - this._models[e.url] = new AMe(Le.parse(e.url), e.lines, e.EOL, e.versionId); + this._models[e.url] = new p2e(Xe.parse(e.url), e.lines, e.EOL, e.versionId); } $acceptModelChanged(e, t) { if (!this._models[e]) @@ -97149,7 +97149,7 @@ class LMe { this._models[e] && delete this._models[e]; } } -class AMe extends CMe { +class p2e extends u2e { get uri() { return this._uri; } @@ -97162,9 +97162,9 @@ class AMe extends CMe { findMatches(e) { const t = []; for (let i = 0; i < this._lines.length; i++) { - const n = this._lines[i], o = this.offsetAt(new V(i + 1, 1)), r = n.matchAll(e); - for (const l of r) - (l.index || l.index === 0) && (l.index = l.index + o), t.push(l); + const n = this._lines[i], o = this.offsetAt(new Y(i + 1, 1)), l = n.matchAll(e); + for (const r of l) + (r.index || r.index === 0) && (r.index = r.index + o), t.push(r); } return t; } @@ -97178,20 +97178,20 @@ class AMe extends CMe { return this._lines[e - 1]; } getWordAtPosition(e, t) { - const i = Gw(e.column, wE(t), this._lines[e.lineNumber - 1], 0); - return i ? new M(e.lineNumber, i.startColumn, e.lineNumber, i.endColumn) : null; + const i = _y(e.column, Kv(t), this._lines[e.lineNumber - 1], 0); + return i ? new I(e.lineNumber, i.startColumn, e.lineNumber, i.endColumn) : null; } words(e) { const t = this._lines, i = this._wordenize.bind(this); - let n = 0, o = "", r = 0, l = []; + let n = 0, o = "", l = 0, r = []; return { *[Symbol.iterator]() { for (; ; ) - if (r < l.length) { - const a = o.substring(l[r].start, l[r].end); - r += 1, yield a; + if (l < r.length) { + const c = o.substring(r[l].start, r[l].end); + l += 1, yield c; } else if (n < t.length) - o = t[n], l = i(o, e), r = 0, n += 1; + o = t[n], r = i(o, e), l = 0, n += 1; else break; } @@ -97199,11 +97199,11 @@ class AMe extends CMe { } getLineWords(e, t) { const i = this._lines[e - 1], n = this._wordenize(i, t), o = []; - for (const r of n) + for (const l of n) o.push({ - word: i.substring(r.start, r.end), - startColumn: r.start + 1, - endColumn: r.end + 1 + word: i.substring(l.start, l.end), + startColumn: l.start + 1, + endColumn: l.end + 1 }); return o; } @@ -97219,8 +97219,8 @@ class AMe extends CMe { return this._lines[e.startLineNumber - 1].substring(e.startColumn - 1, e.endColumn - 1); const t = this._eol, i = e.startLineNumber - 1, n = e.endLineNumber - 1, o = []; o.push(this._lines[i].substring(e.startColumn - 1)); - for (let r = i + 1; r < n; r++) - o.push(this._lines[r]); + for (let l = i + 1; l < n; l++) + o.push(this._lines[l]); return o.push(this._lines[n].substring(0, e.endColumn - 1)), o.join(t); } offsetAt(e) { @@ -97244,7 +97244,7 @@ class AMe extends CMe { } : e; } _validatePosition(e) { - if (!V.isIPosition(e)) + if (!Y.isIPosition(e)) throw new Error("bad position"); let { lineNumber: t, column: i } = e, n = !1; if (t < 1) @@ -97258,9 +97258,9 @@ class AMe extends CMe { return n ? { lineNumber: t, column: i } : e; } } -const g_ = class g_ { +const CS = class CS { constructor() { - this._workerTextModelSyncServer = new LMe(); + this._workerTextModelSyncServer = new b2e(); } dispose() { } @@ -97281,44 +97281,44 @@ const g_ = class g_ { } async $computeUnicodeHighlights(e, t, i) { const n = this._getModel(e); - return n ? s9.computeUnicodeHighlights(n, t, i) : { ranges: [], hasMore: !1, ambiguousCharacterCount: 0, invisibleCharacterCount: 0, nonBasicAsciiCharacterCount: 0 }; + return n ? RE.computeUnicodeHighlights(n, t, i) : { ranges: [], hasMore: !1, ambiguousCharacterCount: 0, invisibleCharacterCount: 0, nonBasicAsciiCharacterCount: 0 }; } async $findSectionHeaders(e, t) { const i = this._getModel(e); - return i ? fMe(i, t) : []; + return i ? c2e(i, t) : []; } // ---- BEGIN diff -------------------------------------------------------------------------- async $computeDiff(e, t, i, n) { - const o = this._getModel(e), r = this._getModel(t); - return !o || !r ? null : JL.computeDiff(o, r, i, n); + const o = this._getModel(e), l = this._getModel(t); + return !o || !l ? null : cV.computeDiff(o, l, i, n); } static computeDiff(e, t, i, n) { - const o = n === "advanced" ? iB.getDefault() : iB.getLegacy(), r = e.getLinesContent(), l = t.getLinesContent(), a = o.computeDiff(r, l, i), c = a.changes.length > 0 ? !1 : this._modelsAreIdentical(e, t); - function d(h) { + const o = n === "advanced" ? x3.getDefault() : x3.getLegacy(), l = e.getLinesContent(), r = t.getLinesContent(), c = o.computeDiff(l, r, i), d = c.changes.length > 0 ? !1 : this._modelsAreIdentical(e, t); + function a(h) { return h.map((u) => { - var g; - return [u.original.startLineNumber, u.original.endLineNumberExclusive, u.modified.startLineNumber, u.modified.endLineNumberExclusive, (g = u.innerChanges) == null ? void 0 : g.map((m) => [ - m.originalRange.startLineNumber, - m.originalRange.startColumn, - m.originalRange.endLineNumber, - m.originalRange.endColumn, - m.modifiedRange.startLineNumber, - m.modifiedRange.startColumn, - m.modifiedRange.endLineNumber, - m.modifiedRange.endColumn + var m; + return [u.original.startLineNumber, u.original.endLineNumberExclusive, u.modified.startLineNumber, u.modified.endLineNumberExclusive, (m = u.innerChanges) == null ? void 0 : m.map((b) => [ + b.originalRange.startLineNumber, + b.originalRange.startColumn, + b.originalRange.endLineNumber, + b.originalRange.endColumn, + b.modifiedRange.startLineNumber, + b.modifiedRange.startColumn, + b.modifiedRange.endLineNumber, + b.modifiedRange.endColumn ])]; }); } return { - identical: c, - quitEarly: a.hitTimeout, - changes: d(a.changes), - moves: a.moves.map((h) => [ + identical: d, + quitEarly: c.hitTimeout, + changes: a(c.changes), + moves: c.moves.map((h) => [ h.lineRangeMapping.original.startLineNumber, h.lineRangeMapping.original.endLineNumberExclusive, h.lineRangeMapping.modified.startLineNumber, h.lineRangeMapping.modified.endLineNumberExclusive, - d(h.changes) + a(h.changes) ]) }; } @@ -97327,8 +97327,8 @@ const g_ = class g_ { if (i !== n) return !1; for (let o = 1; o <= i; o++) { - const r = e.getLineContent(o), l = t.getLineContent(o); - if (r !== l) + const l = e.getLineContent(o), r = t.getLineContent(o); + if (l !== r) return !1; } return !0; @@ -97338,59 +97338,59 @@ const g_ = class g_ { if (!n) return t; const o = []; - let r; - t = t.slice(0).sort((a, c) => { - if (a.range && c.range) - return M.compareRangesUsingStarts(a.range, c.range); - const d = a.range ? 0 : 1, h = c.range ? 0 : 1; - return d - h; + let l; + t = t.slice(0).sort((c, d) => { + if (c.range && d.range) + return I.compareRangesUsingStarts(c.range, d.range); + const a = c.range ? 0 : 1, h = d.range ? 0 : 1; + return a - h; }); - let l = 0; - for (let a = 1; a < t.length; a++) - M.getEndPosition(t[l].range).equals(M.getStartPosition(t[a].range)) ? (t[l].range = M.fromPositions(M.getStartPosition(t[l].range), M.getEndPosition(t[a].range)), t[l].text += t[a].text) : (l++, t[l] = t[a]); - t.length = l + 1; - for (let { range: a, text: c, eol: d } of t) { - if (typeof d == "number" && (r = d), M.isEmpty(a) && !c) + let r = 0; + for (let c = 1; c < t.length; c++) + I.getEndPosition(t[r].range).equals(I.getStartPosition(t[c].range)) ? (t[r].range = I.fromPositions(I.getStartPosition(t[r].range), I.getEndPosition(t[c].range)), t[r].text += t[c].text) : (r++, t[r] = t[c]); + t.length = r + 1; + for (let { range: c, text: d, eol: a } of t) { + if (typeof a == "number" && (l = a), I.isEmpty(c) && !d) continue; - const h = n.getValueInRange(a); - if (c = c.replace(/\r\n|\n|\r/g, n.eol), h === c) + const h = n.getValueInRange(c); + if (d = d.replace(/\r\n|\n|\r/g, n.eol), h === d) continue; - if (Math.max(c.length, h.length) > JL._diffLimit) { - o.push({ range: a, text: c }); + if (Math.max(d.length, h.length) > cV._diffLimit) { + o.push({ range: c, text: d }); continue; } - const u = fbe(h, c, i), g = n.offsetAt(M.lift(a).getStartPosition()); - for (const m of u) { - const f = n.positionAt(g + m.originalStart), b = n.positionAt(g + m.originalStart + m.originalLength), y = { - text: c.substr(m.modifiedStart, m.modifiedLength), - range: { startLineNumber: f.lineNumber, startColumn: f.column, endLineNumber: b.lineNumber, endColumn: b.column } + const u = c0e(h, d, i), m = n.offsetAt(I.lift(c).getStartPosition()); + for (const b of u) { + const g = n.positionAt(m + b.originalStart), Z = n.positionAt(m + b.originalStart + b.originalLength), f = { + text: d.substr(b.modifiedStart, b.modifiedLength), + range: { startLineNumber: g.lineNumber, startColumn: g.column, endLineNumber: Z.lineNumber, endColumn: Z.column } }; - n.getValueInRange(y.range) !== y.text && o.push(y); + n.getValueInRange(f.range) !== f.text && o.push(f); } } - return typeof r == "number" && o.push({ eol: r, text: "", range: { startLineNumber: 0, startColumn: 0, endLineNumber: 0, endColumn: 0 } }), o; + return typeof l == "number" && o.push({ eol: l, text: "", range: { startLineNumber: 0, startColumn: 0, endLineNumber: 0, endColumn: 0 } }), o; } // ---- END minimal edits --------------------------------------------------------------- async $computeLinks(e) { const t = this._getModel(e); - return t ? rMe(t) : null; + return t ? qIe(t) : null; } // --- BEGIN default document colors ----------------------------------------------------------- async $computeDefaultDocumentColors(e) { const t = this._getModel(e); - return t ? mMe(t) : null; + return t ? l2e(t) : null; } async $textualSuggest(e, t, i, n) { - const o = new on(), r = new RegExp(i, n), l = /* @__PURE__ */ new Set(); - e: for (const a of e) { - const c = this._getModel(a); - if (c) { - for (const d of c.words(r)) - if (!(d === t || !isNaN(Number(d))) && (l.add(d), l.size > JL._suggestionsLimit)) + const o = new ln(), l = new RegExp(i, n), r = /* @__PURE__ */ new Set(); + e: for (const c of e) { + const d = this._getModel(c); + if (d) { + for (const a of d.words(l)) + if (!(a === t || !isNaN(Number(a))) && (r.add(a), r.size > cV._suggestionsLimit)) break e; } } - return { words: Array.from(l), duration: o.elapsed() }; + return { words: Array.from(r), duration: o.elapsed() }; } // ---- END suggest -------------------------------------------------------------------------- //#region -- word ranges -- @@ -97398,45 +97398,45 @@ const g_ = class g_ { const o = this._getModel(e); if (!o) return /* @__PURE__ */ Object.create(null); - const r = new RegExp(i, n), l = /* @__PURE__ */ Object.create(null); - for (let a = t.startLineNumber; a < t.endLineNumber; a++) { - const c = o.getLineWords(a, r); - for (const d of c) { - if (!isNaN(Number(d.word))) + const l = new RegExp(i, n), r = /* @__PURE__ */ Object.create(null); + for (let c = t.startLineNumber; c < t.endLineNumber; c++) { + const d = o.getLineWords(c, l); + for (const a of d) { + if (!isNaN(Number(a.word))) continue; - let h = l[d.word]; - h || (h = [], l[d.word] = h), h.push({ - startLineNumber: a, - startColumn: d.startColumn, - endLineNumber: a, - endColumn: d.endColumn + let h = r[a.word]; + h || (h = [], r[a.word] = h), h.push({ + startLineNumber: c, + startColumn: a.startColumn, + endLineNumber: c, + endColumn: a.endColumn }); } } - return l; + return r; } //#endregion async $navigateValueSet(e, t, i, n, o) { - const r = this._getModel(e); - if (!r) + const l = this._getModel(e); + if (!l) return null; - const l = new RegExp(n, o); + const r = new RegExp(n, o); t.startColumn === t.endColumn && (t = { startLineNumber: t.startLineNumber, startColumn: t.startColumn, endLineNumber: t.endLineNumber, endColumn: t.endColumn + 1 }); - const a = r.getValueInRange(t), c = r.getWordAtPosition({ lineNumber: t.startLineNumber, column: t.startColumn }, l); - if (!c) + const c = l.getValueInRange(t), d = l.getWordAtPosition({ lineNumber: t.startLineNumber, column: t.startColumn }, r); + if (!d) return null; - const d = r.getValueInRange(c); - return pG.INSTANCE.navigateValueSet(t, a, c, d, i); + const a = l.getValueInRange(d); + return vY.INSTANCE.navigateValueSet(t, c, d, a, i); } }; -g_._diffLimit = 1e5, g_._suggestionsLimit = 1e4; -let wG = g_; -class JL extends wG { +CS._diffLimit = 1e5, CS._suggestionsLimit = 1e4; +let DY = CS; +class cV extends DY { constructor(e, t) { super(), this._host = e, this._foreignModuleFactory = t, this._foreignModule = null; } @@ -97445,15 +97445,15 @@ class JL extends wG { } // ---- BEGIN foreign module support -------------------------------------------------------------------------- $loadForeignModule(e, t, i) { - const r = { - host: yte(i, (l, a) => this._host.$fhr(l, a)), + const l = { + host: aie(i, (r, c) => this._host.$fhr(r, c)), getMirrorModels: () => this._getModels() }; - return this._foreignModuleFactory ? (this._foreignModule = this._foreignModuleFactory(r, t), Promise.resolve(U2(this._foreignModule))) : new Promise((l, a) => { - const c = (d) => { - this._foreignModule = d.create(r, t), l(U2(this._foreignModule)); + return this._foreignModuleFactory ? (this._foreignModule = this._foreignModuleFactory(l, t), Promise.resolve(pw(this._foreignModule))) : new Promise((r, c) => { + const d = (a) => { + this._foreignModule = a.create(l, t), r(pw(this._foreignModule)); }; - import(`${W_.asBrowserUri(`${e}.js`).toString(!0)}`).then(c).catch(a); + import(`${US.asBrowserUri(`${e}.js`).toString(!0)}`).then(d).catch(c); }); } // foreign method request @@ -97467,91 +97467,91 @@ class JL extends wG { } } } -typeof importScripts == "function" && (globalThis.monaco = v7()); -var g9 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +typeof importScripts == "function" && (globalThis.monaco = m8()); +var HE = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Fu = function(s, e) { +}, Uu = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const lB = 5 * 60 * 1e3; -function Yu(s, e) { +const T3 = 5 * 60 * 1e3; +function Pu(s, e) { const t = s.getModel(e); return !(!t || t.isTooLargeForSyncing()); } -let CG = class extends R { - constructor(e, t, i, n, o, r) { - super(), this._languageConfigurationService = o, this._modelService = t, this._workerManager = this._register(new SG(e, this._modelService)), this._logService = n, this._register(r.linkProvider.register({ language: "*", hasAccessToAllModels: !0 }, { - provideLinks: async (l, a) => { - if (!Yu(this._modelService, l.uri)) +let FY = class extends J { + constructor(e, t, i, n, o, l) { + super(), this._languageConfigurationService = o, this._modelService = t, this._workerManager = this._register(new zY(e, this._modelService)), this._logService = n, this._register(l.linkProvider.register({ language: "*", hasAccessToAllModels: !0 }, { + provideLinks: async (r, c) => { + if (!Pu(this._modelService, r.uri)) return Promise.resolve({ links: [] }); - const d = await (await this._workerWithResources([l.uri])).$computeLinks(l.uri.toString()); - return d && { links: d }; + const a = await (await this._workerWithResources([r.uri])).$computeLinks(r.uri.toString()); + return a && { links: a }; } - })), this._register(r.completionProvider.register("*", new xMe(this._workerManager, i, this._modelService, this._languageConfigurationService))); + })), this._register(l.completionProvider.register("*", new g2e(this._workerManager, i, this._modelService, this._languageConfigurationService))); } dispose() { super.dispose(); } canComputeUnicodeHighlights(e) { - return Yu(this._modelService, e); + return Pu(this._modelService, e); } async computedUnicodeHighlights(e, t, i) { return (await this._workerWithResources([e])).$computeUnicodeHighlights(e.toString(), t, i); } async computeDiff(e, t, i, n) { - const r = await (await this._workerWithResources( + const l = await (await this._workerWithResources( [e, t], /* forceLargeModels */ !0 )).$computeDiff(e.toString(), t.toString(), i, n); - if (!r) + if (!l) return null; return { - identical: r.identical, - quitEarly: r.quitEarly, - changes: a(r.changes), - moves: r.moves.map((c) => new l4(new Qn(new We(c[0], c[1]), new We(c[2], c[3])), a(c[4]))) + identical: l.identical, + quitEarly: l.quitEarly, + changes: c(l.changes), + moves: l.moves.map((d) => new AO(new qn(new Ne(d[0], d[1]), new Ne(d[2], d[3])), c(d[4]))) }; - function a(c) { - return c.map((d) => { + function c(d) { + return d.map((a) => { var h; - return new zo(new We(d[0], d[1]), new We(d[2], d[3]), (h = d[4]) == null ? void 0 : h.map((u) => new Wo(new M(u[0], u[1], u[2], u[3]), new M(u[4], u[5], u[6], u[7])))); + return new Ko(new Ne(a[0], a[1]), new Ne(a[2], a[3]), (h = a[4]) == null ? void 0 : h.map((u) => new To(new I(u[0], u[1], u[2], u[3]), new I(u[4], u[5], u[6], u[7])))); }); } } async computeMoreMinimalEdits(e, t, i = !1) { - if ($n(t)) { - if (!Yu(this._modelService, e)) + if (ts(t)) { + if (!Pu(this._modelService, e)) return Promise.resolve(t); - const n = on.create(), o = this._workerWithResources([e]).then((r) => r.$computeMoreMinimalEdits(e.toString(), t, i)); - return o.finally(() => this._logService.trace("FORMAT#computeMoreMinimalEdits", e.toString(!0), n.elapsed())), Promise.race([o, Zh(1e3).then(() => t)]); + const n = ln.create(), o = this._workerWithResources([e]).then((l) => l.$computeMoreMinimalEdits(e.toString(), t, i)); + return o.finally(() => this._logService.trace("FORMAT#computeMoreMinimalEdits", e.toString(!0), n.elapsed())), Promise.race([o, Nh(1e3).then(() => t)]); } else return Promise.resolve(void 0); } canNavigateValueSet(e) { - return Yu(this._modelService, e); + return Pu(this._modelService, e); } async navigateValueSet(e, t, i) { const n = this._modelService.getModel(e); if (!n) return null; - const o = this._languageConfigurationService.getLanguageConfiguration(n.getLanguageId()).getWordDefinition(), r = o.source, l = o.flags; - return (await this._workerWithResources([e])).$navigateValueSet(e.toString(), t, i, r, l); + const o = this._languageConfigurationService.getLanguageConfiguration(n.getLanguageId()).getWordDefinition(), l = o.source, r = o.flags; + return (await this._workerWithResources([e])).$navigateValueSet(e.toString(), t, i, l, r); } canComputeWordRanges(e) { - return Yu(this._modelService, e); + return Pu(this._modelService, e); } async computeWordRanges(e, t) { const i = this._modelService.getModel(e); if (!i) return Promise.resolve(null); - const n = this._languageConfigurationService.getLanguageConfiguration(i.getLanguageId()).getWordDefinition(), o = n.source, r = n.flags; - return (await this._workerWithResources([e])).$computeWordRanges(e.toString(), t, o, r); + const n = this._languageConfigurationService.getLanguageConfiguration(i.getLanguageId()).getWordDefinition(), o = n.source, l = n.flags; + return (await this._workerWithResources([e])).$computeWordRanges(e.toString(), t, o, l); } async findSectionHeaders(e, t) { return (await this._workerWithResources([e])).$findSectionHeaders(e.toString(), t); @@ -97563,14 +97563,14 @@ let CG = class extends R { return await (await this._workerManager.withWorker()).workerWithSyncedResources(e, t); } }; -CG = g9([ - Fu(1, Pt), - Fu(2, eN), - Fu(3, Xn), - Fu(4, li), - Fu(5, ge) -], CG); -class xMe { +FY = HE([ + Uu(1, At), + Uu(2, pC), + Uu(3, Fn), + Uu(4, ci), + Uu(5, me) +], FY); +class g2e { constructor(e, t, i, n) { this.languageConfigurationService = n, this._debugDisplayName = "wordbasedCompletions", this._workerManager = e, this._configurationService = t, this._modelService = i; } @@ -97580,28 +97580,28 @@ class xMe { return; const n = []; if (i.wordBasedSuggestions === "currentDocument") - Yu(this._modelService, e.uri) && n.push(e.uri); + Pu(this._modelService, e.uri) && n.push(e.uri); else for (const h of this._modelService.getModels()) - Yu(this._modelService, h.uri) && (h === e ? n.unshift(h.uri) : (i.wordBasedSuggestions === "allDocuments" || h.getLanguageId() === e.getLanguageId()) && n.push(h.uri)); + Pu(this._modelService, h.uri) && (h === e ? n.unshift(h.uri) : (i.wordBasedSuggestions === "allDocuments" || h.getLanguageId() === e.getLanguageId()) && n.push(h.uri)); if (n.length === 0) return; - const o = this.languageConfigurationService.getLanguageConfiguration(e.getLanguageId()).getWordDefinition(), r = e.getWordAtPosition(t), l = r ? new M(t.lineNumber, r.startColumn, t.lineNumber, r.endColumn) : M.fromPositions(t), a = l.setEndPosition(t.lineNumber, t.column), d = await (await this._workerManager.withWorker()).textualSuggest(n, r == null ? void 0 : r.word, o); - if (d) + const o = this.languageConfigurationService.getLanguageConfiguration(e.getLanguageId()).getWordDefinition(), l = e.getWordAtPosition(t), r = l ? new I(t.lineNumber, l.startColumn, t.lineNumber, l.endColumn) : I.fromPositions(t), c = r.setEndPosition(t.lineNumber, t.column), a = await (await this._workerManager.withWorker()).textualSuggest(n, l == null ? void 0 : l.word, o); + if (a) return { - duration: d.duration, - suggestions: d.words.map((h) => ({ + duration: a.duration, + suggestions: a.words.map((h) => ({ kind: 18, label: h, insertText: h, - range: { insert: a, replace: l } + range: { insert: c, replace: r } })) }; } } -let SG = class extends R { +let zY = class extends J { constructor(e, t) { - super(), this._workerDescriptor = e, this._modelService = t, this._editorWorkerClient = null, this._lastWorkerUsedTime = (/* @__PURE__ */ new Date()).getTime(), this._register(new aE()).cancelAndSet(() => this._checkStopIdleWorker(), Math.round(lB / 2), vt), this._register(this._modelService.onModelRemoved((n) => this._checkStopEmptyWorker())); + super(), this._workerDescriptor = e, this._modelService = t, this._editorWorkerClient = null, this._lastWorkerUsedTime = (/* @__PURE__ */ new Date()).getTime(), this._register(new Mv()).cancelAndSet(() => this._checkStopIdleWorker(), Math.round(T3 / 2), wt), this._register(this._modelService.onModelRemoved((n) => this._checkStopEmptyWorker())); } dispose() { this._editorWorkerClient && (this._editorWorkerClient.dispose(), this._editorWorkerClient = null), super.dispose(); @@ -97620,16 +97620,16 @@ let SG = class extends R { _checkStopIdleWorker() { if (!this._editorWorkerClient) return; - (/* @__PURE__ */ new Date()).getTime() - this._lastWorkerUsedTime > lB && (this._editorWorkerClient.dispose(), this._editorWorkerClient = null); + (/* @__PURE__ */ new Date()).getTime() - this._lastWorkerUsedTime > T3 && (this._editorWorkerClient.dispose(), this._editorWorkerClient = null); } withWorker() { - return this._lastWorkerUsedTime = (/* @__PURE__ */ new Date()).getTime(), this._editorWorkerClient || (this._editorWorkerClient = new ZM(this._workerDescriptor, !1, this._modelService)), Promise.resolve(this._editorWorkerClient); + return this._lastWorkerUsedTime = (/* @__PURE__ */ new Date()).getTime(), this._editorWorkerClient || (this._editorWorkerClient = new FI(this._workerDescriptor, !1, this._modelService)), Promise.resolve(this._editorWorkerClient); } }; -SG = g9([ - Fu(1, Pt) -], SG); -class MMe { +zY = HE([ + Uu(1, At) +], zY); +class Z2e { constructor(e) { this._instance = e, this.proxy = this._instance; } @@ -97640,7 +97640,7 @@ class MMe { throw new Error("Not supported"); } } -let ZM = class extends R { +let FI = class extends J { constructor(e, t, i) { super(), this._workerDescriptor = e, this._disposed = !1, this._modelService = i, this._keepIdleModels = t, this._worker = null, this._modelManager = null; } @@ -97651,9 +97651,9 @@ let ZM = class extends R { _getOrCreateWorker() { if (!this._worker) try { - this._worker = this._register(tMe(this._workerDescriptor)), fG.setChannel(this._worker, this._createEditorWorkerHost()); + this._worker = this._register(BIe(this._workerDescriptor)), JY.setChannel(this._worker, this._createEditorWorkerHost()); } catch (e) { - gG(e), this._worker = this._createFallbackLocalWorker(); + YY(e), this._worker = this._createFallbackLocalWorker(); } return this._worker; } @@ -97662,11 +97662,11 @@ let ZM = class extends R { const e = this._getOrCreateWorker().proxy; return await e.$ping(), e; } catch (e) { - return gG(e), this._worker = this._createFallbackLocalWorker(), this._worker.proxy; + return YY(e), this._worker = this._createFallbackLocalWorker(), this._worker.proxy; } } _createFallbackLocalWorker() { - return new MMe(new JL(this._createEditorWorkerHost(), null)); + return new Z2e(new cV(this._createEditorWorkerHost(), null)); } _createEditorWorkerHost() { return { @@ -97674,38 +97674,38 @@ let ZM = class extends R { }; } _getOrCreateModelManager(e) { - return this._modelManager || (this._modelManager = this._register(new SMe(e, this._modelService, this._keepIdleModels))), this._modelManager; + return this._modelManager || (this._modelManager = this._register(new m2e(e, this._modelService, this._keepIdleModels))), this._modelManager; } async workerWithSyncedResources(e, t = !1) { if (this._disposed) - return Promise.reject(o6()); + return Promise.reject(j6()); const i = await this._getProxy(); return this._getOrCreateModelManager(i).ensureSyncedResources(e, t), i; } async textualSuggest(e, t, i) { - const n = await this.workerWithSyncedResources(e), o = i.source, r = i.flags; - return n.$textualSuggest(e.map((l) => l.toString()), t, o, r); + const n = await this.workerWithSyncedResources(e), o = i.source, l = i.flags; + return n.$textualSuggest(e.map((r) => r.toString()), t, o, l); } dispose() { super.dispose(), this._disposed = !0; } }; -ZM = g9([ - Fu(2, Pt) -], ZM); -var ZMe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +FI = HE([ + Uu(2, At) +], FI); +var f2e = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, _Me = function(s, e) { +}, y2e = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let LG = class extends R { +let AY = class extends J { constructor(e) { - super(), this._themeService = e, this._onWillCreateCodeEditor = this._register(new k()), this._onCodeEditorAdd = this._register(new k()), this.onCodeEditorAdd = this._onCodeEditorAdd.event, this._onCodeEditorRemove = this._register(new k()), this.onCodeEditorRemove = this._onCodeEditorRemove.event, this._onWillCreateDiffEditor = this._register(new k()), this._onDiffEditorAdd = this._register(new k()), this.onDiffEditorAdd = this._onDiffEditorAdd.event, this._onDiffEditorRemove = this._register(new k()), this.onDiffEditorRemove = this._onDiffEditorRemove.event, this._decorationOptionProviders = /* @__PURE__ */ new Map(), this._codeEditorOpenHandlers = new cs(), this._modelProperties = /* @__PURE__ */ new Map(), this._codeEditors = /* @__PURE__ */ Object.create(null), this._diffEditors = /* @__PURE__ */ Object.create(null), this._globalStyleSheet = null; + super(), this._themeService = e, this._onWillCreateCodeEditor = this._register(new k()), this._onCodeEditorAdd = this._register(new k()), this.onCodeEditorAdd = this._onCodeEditorAdd.event, this._onCodeEditorRemove = this._register(new k()), this.onCodeEditorRemove = this._onCodeEditorRemove.event, this._onWillCreateDiffEditor = this._register(new k()), this._onDiffEditorAdd = this._register(new k()), this.onDiffEditorAdd = this._onDiffEditorAdd.event, this._onDiffEditorRemove = this._register(new k()), this.onDiffEditorRemove = this._onDiffEditorRemove.event, this._decorationOptionProviders = /* @__PURE__ */ new Map(), this._codeEditorOpenHandlers = new hs(), this._modelProperties = /* @__PURE__ */ new Map(), this._codeEditors = /* @__PURE__ */ Object.create(null), this._diffEditors = /* @__PURE__ */ Object.create(null), this._globalStyleSheet = null; } willCreateCodeEditor() { this._onWillCreateCodeEditor.fire(); @@ -97762,23 +97762,23 @@ let LG = class extends R { } registerCodeEditorOpenHandler(e) { const t = this._codeEditorOpenHandlers.unshift(e); - return Ce(t); + return We(t); } }; -LG = ZMe([ - _Me(0, Pi) -], LG); -var IMe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +AY = f2e([ + y2e(0, Ki) +], AY); +var W2e = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, aB = function(s, e) { +}, M3 = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let _M = class extends LG { +let zI = class extends AY { constructor(e, t) { super(t), this._register(this.onCodeEditorAdd(() => this._checkContextKey())), this._register(this.onCodeEditorRemove(() => this._checkContextKey())), this._editorIsOpen = e.createKey("editorIsOpen", !1), this._activeCodeEditor = null, this._register(this.registerCodeEditorOpenHandler(async (i, n, o) => n ? this.doOpenEditor(n, i) : null)); } @@ -97801,8 +97801,8 @@ let _M = class extends LG { if (!this.findModel(e, t.resource)) { if (t.resource) { const o = t.resource.scheme; - if (o === Ge.http || o === Ge.https) - return aJ(t.resource.toString()), e; + if (o === ve.http || o === ve.https) + return KB(t.resource.toString()), e; } return null; } @@ -97832,44 +97832,44 @@ let _M = class extends LG { return i && i.uri.toString() !== t.toString() ? null : i; } }; -_M = IMe([ - aB(0, _e), - aB(1, Pi) -], _M); +zI = W2e([ + M3(0, xe), + M3(1, Ki) +], zI); it( - ft, - _M, + gt, + zI, 0 /* InstantiationType.Eager */ ); -const iu = $e("layoutService"); -var R7 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +const lu = $e("layoutService"); +var y8 = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, E7 = function(s, e) { +}, W8 = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let IM = class { +let AI = class { get mainContainer() { var e; - return ((e = SE(this._codeEditorService.listCodeEditors())) == null ? void 0 : e.getContainerDomNode()) ?? vt.document.body; + return ((e = Pv(this._codeEditorService.listCodeEditors())) == null ? void 0 : e.getContainerDomNode()) ?? wt.document.body; } get activeContainer() { const e = this._codeEditorService.getFocusedCodeEditor() ?? this._codeEditorService.getActiveCodeEditor(); return (e == null ? void 0 : e.getContainerDomNode()) ?? this.mainContainer; } get mainContainerDimension() { - return Wh(this.mainContainer); + return Yh(this.mainContainer); } get activeContainerDimension() { - return Wh(this.activeContainer); + return Yh(this.activeContainer); } get containers() { - return Or(this._codeEditorService.listCodeEditors().map((e) => e.getContainerDomNode())); + return _l(this._codeEditorService.listCodeEditors().map((e) => e.getContainerDomNode())); } getContainer() { return this.activeContainer; @@ -97884,10 +97884,10 @@ let IM = class { this._codeEditorService = e, this.onDidLayoutMainContainer = se.None, this.onDidLayoutActiveContainer = se.None, this.onDidLayoutContainer = se.None, this.onDidChangeActiveContainer = se.None, this.onDidAddContainer = se.None, this.mainContainerOffset = { top: 0, quickPickTop: 0 }, this.activeContainerOffset = { top: 0, quickPickTop: 0 }; } }; -IM = R7([ - E7(0, ft) -], IM); -let AG = class extends IM { +AI = y8([ + W8(0, gt) +], AI); +let KY = class extends AI { get mainContainer() { return this._container; } @@ -97895,32 +97895,32 @@ let AG = class extends IM { super(t), this._container = e; } }; -AG = R7([ - E7(1, ft) -], AG); +KY = y8([ + W8(1, gt) +], KY); it( - iu, - IM, + lu, + AI, 1 /* InstantiationType.Delayed */ ); -var NMe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var G2e = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, cB = function(s, e) { +}, Y3 = function(s, e) { return function(t, i) { e(t, i, s); }; }; -function jS(s) { - return s.scheme === Ge.file ? s.fsPath : s.path; +function aX(s) { + return s.scheme === ve.file ? s.fsPath : s.path; } -let X7 = 0; -class qS { - constructor(e, t, i, n, o, r, l) { - this.id = ++X7, this.type = 0, this.actual = e, this.label = e.label, this.confirmBeforeUndo = e.confirmBeforeUndo || !1, this.resourceLabel = t, this.strResource = i, this.resourceLabels = [this.resourceLabel], this.strResources = [this.strResource], this.groupId = n, this.groupOrder = o, this.sourceId = r, this.sourceOrder = l, this.isValid = !0; +let G8 = 0; +class hX { + constructor(e, t, i, n, o, l, r) { + this.id = ++G8, this.type = 0, this.actual = e, this.label = e.label, this.confirmBeforeUndo = e.confirmBeforeUndo || !1, this.resourceLabel = t, this.strResource = i, this.resourceLabels = [this.resourceLabel], this.strResources = [this.strResource], this.groupId = n, this.groupOrder = o, this.sourceId = l, this.sourceOrder = r, this.isValid = !0; } setValid(e) { this.isValid = e; @@ -97929,12 +97929,12 @@ class qS { return `[id:${this.id}] [group:${this.groupId}] [${this.isValid ? " VALID" : "INVALID"}] ${this.actual.constructor.name} - ${this.actual}`; } } -class dB { +class k3 { constructor(e, t) { this.resourceLabel = e, this.reason = t; } } -class hB { +class v3 { constructor() { this.elements = /* @__PURE__ */ new Map(); } @@ -97959,18 +97959,18 @@ class hB { return this.elements.delete(e); } } -class WMe { - constructor(e, t, i, n, o, r, l) { - this.id = ++X7, this.type = 1, this.actual = e, this.label = e.label, this.confirmBeforeUndo = e.confirmBeforeUndo || !1, this.resourceLabels = t, this.strResources = i, this.groupId = n, this.groupOrder = o, this.sourceId = r, this.sourceOrder = l, this.removedResources = null, this.invalidatedResources = null; +class X2e { + constructor(e, t, i, n, o, l, r) { + this.id = ++G8, this.type = 1, this.actual = e, this.label = e.label, this.confirmBeforeUndo = e.confirmBeforeUndo || !1, this.resourceLabels = t, this.strResources = i, this.groupId = n, this.groupOrder = o, this.sourceId = l, this.sourceOrder = r, this.removedResources = null, this.invalidatedResources = null; } canSplit() { return typeof this.actual.split == "function"; } removeResource(e, t, i) { - this.removedResources || (this.removedResources = new hB()), this.removedResources.has(t) || this.removedResources.set(t, new dB(e, i)); + this.removedResources || (this.removedResources = new v3()), this.removedResources.has(t) || this.removedResources.set(t, new k3(e, i)); } setValid(e, t, i) { - i ? this.invalidatedResources && (this.invalidatedResources.delete(t), this.invalidatedResources.size === 0 && (this.invalidatedResources = null)) : (this.invalidatedResources || (this.invalidatedResources = new hB()), this.invalidatedResources.has(t) || this.invalidatedResources.set(t, new dB( + i ? this.invalidatedResources && (this.invalidatedResources.delete(t), this.invalidatedResources.size === 0 && (this.invalidatedResources = null)) : (this.invalidatedResources || (this.invalidatedResources = new v3()), this.invalidatedResources.has(t) || this.invalidatedResources.set(t, new k3( e, 0 /* RemovedResourceReason.ExternalRemoval */ @@ -97980,7 +97980,7 @@ class WMe { return `[id:${this.id}] [group:${this.groupId}] [${this.invalidatedResources ? "INVALID" : " VALID"}] ${this.actual.constructor.name} - ${this.actual}`; } } -class F7 { +class X8 { constructor(e, t) { this.resourceLabel = e, this.strResource = t, this._past = [], this._future = [], this.locked = !1, this.versionId = 1; } @@ -98039,31 +98039,31 @@ class F7 { t.push(this._past[i].id); for (let i = this._future.length - 1; i >= 0; i--) t.push(this._future[i].id); - return new mK(e, t); + return new OQ(e, t); } restoreSnapshot(e) { const t = e.elements.length; let i = !0, n = 0, o = -1; - for (let l = 0, a = this._past.length; l < a; l++, n++) { - const c = this._past[l]; - i && (n >= t || c.id !== e.elements[n]) && (i = !1, o = 0), !i && c.type === 1 && c.removeResource( + for (let r = 0, c = this._past.length; r < c; r++, n++) { + const d = this._past[r]; + i && (n >= t || d.id !== e.elements[n]) && (i = !1, o = 0), !i && d.type === 1 && d.removeResource( this.resourceLabel, this.strResource, 0 /* RemovedResourceReason.ExternalRemoval */ ); } - let r = -1; - for (let l = this._future.length - 1; l >= 0; l--, n++) { - const a = this._future[l]; - i && (n >= t || a.id !== e.elements[n]) && (i = !1, r = l), !i && a.type === 1 && a.removeResource( + let l = -1; + for (let r = this._future.length - 1; r >= 0; r--, n++) { + const c = this._future[r]; + i && (n >= t || c.id !== e.elements[n]) && (i = !1, l = r), !i && c.type === 1 && c.removeResource( this.resourceLabel, this.strResource, 0 /* RemovedResourceReason.ExternalRemoval */ ); } - o !== -1 && (this._past = this._past.slice(0, o)), r !== -1 && (this._future = this._future.slice(r + 1)), this.versionId++; + o !== -1 && (this._past = this._past.slice(0, o)), l !== -1 && (this._future = this._future.slice(l + 1)), this.versionId++; } getElements() { const e = [], t = []; @@ -98111,7 +98111,7 @@ class F7 { this._future.pop(), this._past.push(e), this.versionId++; } } -class e2 { +class gN { constructor(e) { this.editStacks = e, this._versionIds = []; for (let t = 0, i = this.editStacks.length; t < i; t++) @@ -98124,9 +98124,9 @@ class e2 { return !0; } } -const Y7 = new F7("", ""); -Y7.locked = !0; -let xG = class { +const V8 = new X8("", ""); +V8.locked = !0; +let UY = class { constructor(e, t) { this._dialogService = e, this._notificationService = t, this._editStacks = /* @__PURE__ */ new Map(), this._uriComparisonKeyComputers = []; } @@ -98144,24 +98144,24 @@ let xG = class { console.log(t.join(` `)); } - pushElement(e, t = Gv.None, i = Eu.None) { + pushElement(e, t = nT.None, i = Au.None) { if (e.type === 0) { - const n = jS(e.resource), o = this.getUriComparisonKey(e.resource); - this._pushElement(new qS(e, n, o, t.id, t.nextOrder(), i.id, i.nextOrder())); + const n = aX(e.resource), o = this.getUriComparisonKey(e.resource); + this._pushElement(new hX(e, n, o, t.id, t.nextOrder(), i.id, i.nextOrder())); } else { - const n = /* @__PURE__ */ new Set(), o = [], r = []; - for (const l of e.resources) { - const a = jS(l), c = this.getUriComparisonKey(l); - n.has(c) || (n.add(c), o.push(a), r.push(c)); + const n = /* @__PURE__ */ new Set(), o = [], l = []; + for (const r of e.resources) { + const c = aX(r), d = this.getUriComparisonKey(r); + n.has(d) || (n.add(d), o.push(c), l.push(d)); } - o.length === 1 ? this._pushElement(new qS(e, o[0], r[0], t.id, t.nextOrder(), i.id, i.nextOrder())) : this._pushElement(new WMe(e, o, r, t.id, t.nextOrder(), i.id, i.nextOrder())); + o.length === 1 ? this._pushElement(new hX(e, o[0], l[0], t.id, t.nextOrder(), i.id, i.nextOrder())) : this._pushElement(new X2e(e, o, l, t.id, t.nextOrder(), i.id, i.nextOrder())); } } _pushElement(e) { for (let t = 0, i = e.strResources.length; t < i; t++) { const n = e.resourceLabels[t], o = e.strResources[t]; - let r; - this._editStacks.has(o) ? r = this._editStacks.get(o) : (r = new F7(n, o), this._editStacks.set(o, r)), r.pushElement(e); + let l; + this._editStacks.has(o) ? l = this._editStacks.get(o) : (l = new X8(n, o), this._editStacks.set(o, l)), l.pushElement(e); } } getLastElement(e) { @@ -98178,8 +98178,8 @@ let xG = class { _splitPastWorkspaceElement(e, t) { const i = e.actual.split(), n = /* @__PURE__ */ new Map(); for (const o of i) { - const r = jS(o.resource), l = this.getUriComparisonKey(o.resource), a = new qS(o, r, l, 0, 0, 0, 0); - n.set(a.strResource, a); + const l = aX(o.resource), r = this.getUriComparisonKey(o.resource), c = new hX(o, l, r, 0, 0, 0, 0); + n.set(c.strResource, c); } for (const o of e.strResources) { if (t && t.has(o)) @@ -98190,8 +98190,8 @@ let xG = class { _splitFutureWorkspaceElement(e, t) { const i = e.actual.split(), n = /* @__PURE__ */ new Map(); for (const o of i) { - const r = jS(o.resource), l = this.getUriComparisonKey(o.resource), a = new qS(o, r, l, 0, 0, 0, 0); - n.set(a.strResource, a); + const l = aX(o.resource), r = this.getUriComparisonKey(o.resource), c = new hX(o, l, r, 0, 0, 0, 0); + n.set(c.strResource, c); } for (const o of e.strResources) { if (t && t.has(o)) @@ -98209,7 +98209,7 @@ let xG = class { } createSnapshot(e) { const t = this.getUriComparisonKey(e); - return this._editStacks.has(t) ? this._editStacks.get(t).createSnapshot(e) : new mK(e, []); + return this._editStacks.has(t) ? this._editStacks.get(t).createSnapshot(e) : new OQ(e, []); } restoreSnapshot(e) { const t = this.getUriComparisonKey(e.resource); @@ -98227,13 +98227,13 @@ let xG = class { return [null, null]; let t = null, i = null; for (const [n, o] of this._editStacks) { - const r = o.getClosestPastElement(); - r && r.sourceId === e && (!t || r.sourceOrder > t.sourceOrder) && (t = r, i = n); + const l = o.getClosestPastElement(); + l && l.sourceId === e && (!t || l.sourceOrder > t.sourceOrder) && (t = l, i = n); } return [t, i]; } canUndo(e) { - if (e instanceof Eu) { + if (e instanceof Au) { const [, i] = this._findClosestUndoElementWithSource(e.id); return !!i; } @@ -98241,7 +98241,7 @@ let xG = class { return this._editStacks.has(t) ? this._editStacks.get(t).hasPastElements() : !1; } _onError(e, t) { - De(e); + Me(e); for (const i of t.strResources) this.removeElements(i); this._notificationService.error(e); @@ -98258,39 +98258,39 @@ let xG = class { }; } _safeInvokeWithLocks(e, t, i, n, o) { - const r = this._acquireLocks(i); - let l; + const l = this._acquireLocks(i); + let r; try { - l = t(); - } catch (a) { - return r(), n.dispose(), this._onError(a, e); + r = t(); + } catch (c) { + return l(), n.dispose(), this._onError(c, e); } - return l ? l.then(() => (r(), n.dispose(), o()), (a) => (r(), n.dispose(), this._onError(a, e))) : (r(), n.dispose(), o()); + return r ? r.then(() => (l(), n.dispose(), o()), (c) => (l(), n.dispose(), this._onError(c, e))) : (l(), n.dispose(), o()); } async _invokeWorkspacePrepare(e) { if (typeof e.actual.prepareUndoRedo > "u") - return R.None; + return J.None; const t = e.actual.prepareUndoRedo(); - return typeof t > "u" ? R.None : t; + return typeof t > "u" ? J.None : t; } _invokeResourcePrepare(e, t) { if (e.actual.type !== 1 || typeof e.actual.prepareUndoRedo > "u") - return t(R.None); + return t(J.None); const i = e.actual.prepareUndoRedo(); - return i ? __(i) ? t(i) : i.then((n) => t(n)) : t(R.None); + return i ? zS(i) ? t(i) : i.then((n) => t(n)) : t(J.None); } _getAffectedEditStacks(e) { const t = []; for (const i of e.strResources) - t.push(this._editStacks.get(i) || Y7); - return new e2(t); + t.push(this._editStacks.get(i) || V8); + return new gN(t); } _tryToSplitAndUndo(e, t, i, n) { if (t.canSplit()) - return this._splitPastWorkspaceElement(t, i), this._notificationService.warn(n), new $S(this._undo(e, 0, !0)); + return this._splitPastWorkspaceElement(t, i), this._notificationService.warn(n), new uX(this._undo(e, 0, !0)); for (const o of t.strResources) this.removeElements(o); - return this._notificationService.warn(n), new $S(); + return this._notificationService.warn(n), new uX(); } _checkWorkspaceUndo(e, t, i, n) { if (t.removedResources) @@ -98298,14 +98298,14 @@ let xG = class { if (n && t.invalidatedResources) return this._tryToSplitAndUndo(e, t, t.invalidatedResources, p({ key: "cannotWorkspaceUndo", comment: ["{0} is a label for an operation. {1} is another message."] }, "Could not undo '{0}' across all files. {1}", t.label, t.invalidatedResources.createMessage())); const o = []; - for (const l of i.editStacks) - l.getClosestPastElement() !== t && o.push(l.resourceLabel); + for (const r of i.editStacks) + r.getClosestPastElement() !== t && o.push(r.resourceLabel); if (o.length > 0) return this._tryToSplitAndUndo(e, t, null, p({ key: "cannotWorkspaceUndoDueToChanges", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not undo '{0}' across all files because changes were made to {1}", t.label, o.join(", "))); - const r = []; - for (const l of i.editStacks) - l.locked && r.push(l.resourceLabel); - return r.length > 0 ? this._tryToSplitAndUndo(e, t, null, p({ key: "cannotWorkspaceUndoDueToInProgressUndoRedo", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not undo '{0}' across all files because there is already an undo or redo operation running on {1}", t.label, r.join(", "))) : i.isValid() ? null : this._tryToSplitAndUndo(e, t, null, p({ key: "cannotWorkspaceUndoDueToInMeantimeUndoRedo", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not undo '{0}' across all files because an undo or redo operation occurred in the meantime", t.label)); + const l = []; + for (const r of i.editStacks) + r.locked && l.push(r.resourceLabel); + return l.length > 0 ? this._tryToSplitAndUndo(e, t, null, p({ key: "cannotWorkspaceUndoDueToInProgressUndoRedo", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not undo '{0}' across all files because there is already an undo or redo operation running on {1}", t.label, l.join(", "))) : i.isValid() ? null : this._tryToSplitAndUndo(e, t, null, p({ key: "cannotWorkspaceUndoDueToInMeantimeUndoRedo", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not undo '{0}' across all files because an undo or redo operation occurred in the meantime", t.label)); } _workspaceUndo(e, t, i) { const n = this._getAffectedEditStacks(t), o = this._checkWorkspaceUndo( @@ -98336,59 +98336,59 @@ let xG = class { } async _confirmAndExecuteWorkspaceUndo(e, t, i, n) { if (t.canSplit() && !this._isPartOfUndoGroup(t)) { - let l; - (function(d) { - d[d.All = 0] = "All", d[d.This = 1] = "This", d[d.Cancel = 2] = "Cancel"; - })(l || (l = {})); - const { result: a } = await this._dialogService.prompt({ - type: Mi.Info, + let r; + (function(a) { + a[a.All = 0] = "All", a[a.This = 1] = "This", a[a.Cancel = 2] = "Cancel"; + })(r || (r = {})); + const { result: c } = await this._dialogService.prompt({ + type: Si.Info, message: p("confirmWorkspace", "Would you like to undo '{0}' across all files?", t.label), buttons: [ { label: p({ key: "ok", comment: ["{0} denotes a number that is > 1, && denotes a mnemonic"] }, "&&Undo in {0} Files", i.editStacks.length), - run: () => l.All + run: () => r.All }, { label: p({ key: "nok", comment: ["&& denotes a mnemonic"] }, "Undo this &&File"), - run: () => l.This + run: () => r.This } ], cancelButton: { - run: () => l.Cancel + run: () => r.Cancel } }); - if (a === l.Cancel) + if (c === r.Cancel) return; - if (a === l.This) + if (c === r.This) return this._splitPastWorkspaceElement(t, null), this._undo(e, 0, !0); - const c = this._checkWorkspaceUndo( + const d = this._checkWorkspaceUndo( e, t, i, /*invalidated resources will be checked after the prepare call*/ !1 ); - if (c) - return c.returnValue; + if (d) + return d.returnValue; n = !0; } let o; try { o = await this._invokeWorkspacePrepare(t); - } catch (l) { - return this._onError(l, t); + } catch (r) { + return this._onError(r, t); } - const r = this._checkWorkspaceUndo( + const l = this._checkWorkspaceUndo( e, t, i, /*now also check that there are no more invalidated resources*/ !0 ); - if (r) - return o.dispose(), r.returnValue; - for (const l of i.editStacks) - l.moveBackward(t); + if (l) + return o.dispose(), l.returnValue; + for (const r of i.editStacks) + r.moveBackward(t); return this._safeInvokeWithLocks(t, () => t.actual.undo(), i, o, () => this._continueUndoInGroup(t.groupId, n)); } _resourceUndo(e, t, i) { @@ -98401,15 +98401,15 @@ let xG = class { this._notificationService.warn(n); return; } - return this._invokeResourcePrepare(t, (n) => (e.moveBackward(t), this._safeInvokeWithLocks(t, () => t.actual.undo(), new e2([e]), n, () => this._continueUndoInGroup(t.groupId, i)))); + return this._invokeResourcePrepare(t, (n) => (e.moveBackward(t), this._safeInvokeWithLocks(t, () => t.actual.undo(), new gN([e]), n, () => this._continueUndoInGroup(t.groupId, i)))); } _findClosestUndoElementInGroup(e) { if (!e) return [null, null]; let t = null, i = null; for (const [n, o] of this._editStacks) { - const r = o.getClosestPastElement(); - r && r.groupId === e && (!t || r.groupOrder > t.groupOrder) && (t = r, i = n); + const l = o.getClosestPastElement(); + l && l.groupId === e && (!t || l.groupOrder > t.groupOrder) && (t = l, i = n); } return [t, i]; } @@ -98421,7 +98421,7 @@ let xG = class { return this._undo(i, 0, t); } undo(e) { - if (e instanceof Eu) { + if (e instanceof Au) { const [, t] = this._findClosestUndoElementWithSource(e.id); return t ? this._undo(t, e.id, !1) : void 0; } @@ -98434,9 +98434,9 @@ let xG = class { if (!o) return; if (o.groupId) { - const [l, a] = this._findClosestUndoElementInGroup(o.groupId); - if (o !== l && a) - return this._undo(a, t, i); + const [r, c] = this._findClosestUndoElementInGroup(o.groupId); + if (o !== r && c) + return this._undo(c, t, i); } if ((o.sourceId !== t || o.confirmBeforeUndo) && !i) return this._confirmAndContinueUndo(e, t, o); @@ -98458,13 +98458,13 @@ let xG = class { return [null, null]; let t = null, i = null; for (const [n, o] of this._editStacks) { - const r = o.getClosestFutureElement(); - r && r.sourceId === e && (!t || r.sourceOrder < t.sourceOrder) && (t = r, i = n); + const l = o.getClosestFutureElement(); + l && l.sourceId === e && (!t || l.sourceOrder < t.sourceOrder) && (t = l, i = n); } return [t, i]; } canRedo(e) { - if (e instanceof Eu) { + if (e instanceof Au) { const [, i] = this._findClosestRedoElementWithSource(e.id); return !!i; } @@ -98473,10 +98473,10 @@ let xG = class { } _tryToSplitAndRedo(e, t, i, n) { if (t.canSplit()) - return this._splitFutureWorkspaceElement(t, i), this._notificationService.warn(n), new $S(this._redo(e)); + return this._splitFutureWorkspaceElement(t, i), this._notificationService.warn(n), new uX(this._redo(e)); for (const o of t.strResources) this.removeElements(o); - return this._notificationService.warn(n), new $S(); + return this._notificationService.warn(n), new uX(); } _checkWorkspaceRedo(e, t, i, n) { if (t.removedResources) @@ -98484,14 +98484,14 @@ let xG = class { if (n && t.invalidatedResources) return this._tryToSplitAndRedo(e, t, t.invalidatedResources, p({ key: "cannotWorkspaceRedo", comment: ["{0} is a label for an operation. {1} is another message."] }, "Could not redo '{0}' across all files. {1}", t.label, t.invalidatedResources.createMessage())); const o = []; - for (const l of i.editStacks) - l.getClosestFutureElement() !== t && o.push(l.resourceLabel); + for (const r of i.editStacks) + r.getClosestFutureElement() !== t && o.push(r.resourceLabel); if (o.length > 0) return this._tryToSplitAndRedo(e, t, null, p({ key: "cannotWorkspaceRedoDueToChanges", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not redo '{0}' across all files because changes were made to {1}", t.label, o.join(", "))); - const r = []; - for (const l of i.editStacks) - l.locked && r.push(l.resourceLabel); - return r.length > 0 ? this._tryToSplitAndRedo(e, t, null, p({ key: "cannotWorkspaceRedoDueToInProgressUndoRedo", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not redo '{0}' across all files because there is already an undo or redo operation running on {1}", t.label, r.join(", "))) : i.isValid() ? null : this._tryToSplitAndRedo(e, t, null, p({ key: "cannotWorkspaceRedoDueToInMeantimeUndoRedo", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not redo '{0}' across all files because an undo or redo operation occurred in the meantime", t.label)); + const l = []; + for (const r of i.editStacks) + r.locked && l.push(r.resourceLabel); + return l.length > 0 ? this._tryToSplitAndRedo(e, t, null, p({ key: "cannotWorkspaceRedoDueToInProgressUndoRedo", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not redo '{0}' across all files because there is already an undo or redo operation running on {1}", t.label, l.join(", "))) : i.isValid() ? null : this._tryToSplitAndRedo(e, t, null, p({ key: "cannotWorkspaceRedoDueToInMeantimeUndoRedo", comment: ["{0} is a label for an operation. {1} is a list of filenames."] }, "Could not redo '{0}' across all files because an undo or redo operation occurred in the meantime", t.label)); } _workspaceRedo(e, t) { const i = this._getAffectedEditStacks(t), n = this._checkWorkspaceRedo( @@ -98507,8 +98507,8 @@ let xG = class { let n; try { n = await this._invokeWorkspacePrepare(t); - } catch (r) { - return this._onError(r, t); + } catch (l) { + return this._onError(l, t); } const o = this._checkWorkspaceRedo( e, @@ -98519,8 +98519,8 @@ let xG = class { ); if (o) return n.dispose(), o.returnValue; - for (const r of i.editStacks) - r.moveForward(t); + for (const l of i.editStacks) + l.moveForward(t); return this._safeInvokeWithLocks(t, () => t.actual.redo(), i, n, () => this._continueRedoInGroup(t.groupId)); } _resourceRedo(e, t) { @@ -98533,15 +98533,15 @@ let xG = class { this._notificationService.warn(i); return; } - return this._invokeResourcePrepare(t, (i) => (e.moveForward(t), this._safeInvokeWithLocks(t, () => t.actual.redo(), new e2([e]), i, () => this._continueRedoInGroup(t.groupId)))); + return this._invokeResourcePrepare(t, (i) => (e.moveForward(t), this._safeInvokeWithLocks(t, () => t.actual.redo(), new gN([e]), i, () => this._continueRedoInGroup(t.groupId)))); } _findClosestRedoElementInGroup(e) { if (!e) return [null, null]; let t = null, i = null; for (const [n, o] of this._editStacks) { - const r = o.getClosestFutureElement(); - r && r.groupId === e && (!t || r.groupOrder < t.groupOrder) && (t = r, i = n); + const l = o.getClosestFutureElement(); + l && l.groupId === e && (!t || l.groupOrder < t.groupOrder) && (t = l, i = n); } return [t, i]; } @@ -98553,7 +98553,7 @@ let xG = class { return this._redo(t); } redo(e) { - if (e instanceof Eu) { + if (e instanceof Au) { const [, t] = this._findClosestRedoElementWithSource(e.id); return t ? this._redo(t) : void 0; } @@ -98576,56 +98576,56 @@ let xG = class { } } }; -xG = NMe([ - cB(0, r9), - cB(1, Vi) -], xG); -class $S { +UY = G2e([ + Y3(0, wE), + Y3(1, vi) +], UY); +class uX { constructor(e) { this.returnValue = e; } } it( - gX, - xG, + HJ, + UY, 1 /* InstantiationType.Delayed */ ); -var vMe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var V2e = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, t2 = function(s, e) { +}, ZN = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let MG = class extends R { +let PY = class extends J { constructor(e, t, i) { super(), this._themeService = e, this._logService = t, this._languageService = i, this._caches = /* @__PURE__ */ new WeakMap(), this._register(this._themeService.onDidColorThemeChange(() => { this._caches = /* @__PURE__ */ new WeakMap(); })); } getStyling(e) { - return this._caches.has(e) || this._caches.set(e, new KV(e.getLegend(), this._themeService, this._languageService, this._logService)), this._caches.get(e); + return this._caches.has(e) || this._caches.set(e, new g5(e.getLegend(), this._themeService, this._languageService, this._logService)), this._caches.get(e); } }; -MG = vMe([ - t2(0, Pi), - t2(1, Xn), - t2(2, ri) -], MG); +PY = V2e([ + ZN(0, Ki), + ZN(1, Fn), + ZN(2, ri) +], PY); it( - iN, - MG, + ZC, + PY, 1 /* InstantiationType.Delayed */ ); -function z7(s) { - return typeof s == "string" ? !1 : Array.isArray(s) ? s.every(z7) : !!s.exclusive; +function L8(s) { + return typeof s == "string" ? !1 : Array.isArray(s) ? s.every(L8) : !!s.exclusive; } -class uB { +class J3 { constructor(e, t, i, n, o) { this.uri = e, this.languageId = t, this.notebookUri = i, this.notebookType = n, this.recursive = o; } @@ -98634,7 +98634,7 @@ class uB { return this.notebookType === e.notebookType && this.languageId === e.languageId && this.uri.toString() === e.uri.toString() && ((t = this.notebookUri) == null ? void 0 : t.toString()) === ((i = e.notebookUri) == null ? void 0 : i.toString()) && this.recursive === e.recursive; } } -class ii { +class ni { constructor(e) { this._notebookInfoResolver = e, this._clock = 0, this._entries = [], this._onDidChange = new k(), this.onDidChange = this._onDidChange.event; } @@ -98645,7 +98645,7 @@ class ii { _score: -1, _time: this._clock++ }; - return this._entries.push(i), this._lastCandidate = void 0, this._onDidChange.fire(this._entries.length), Ce(() => { + return this._entries.push(i), this._lastCandidate = void 0, this._onDidChange.fire(this._entries.length), We(() => { if (i) { const n = this._entries.indexOf(i); n >= 0 && (this._entries.splice(n, 1), this._lastCandidate = void 0, this._onDidChange.fire(this._entries.length), i = void 0); @@ -98681,33 +98681,33 @@ class ii { n._score > 0 && i(n); } _updateScores(e, t) { - var o, r; - const i = (o = this._notebookInfoResolver) == null ? void 0 : o.call(this, e.uri), n = i ? new uB(e.uri, e.getLanguageId(), i.uri, i.type, t) : new uB(e.uri, e.getLanguageId(), void 0, void 0, t); - if (!((r = this._lastCandidate) != null && r.equals(n))) { + var o, l; + const i = (o = this._notebookInfoResolver) == null ? void 0 : o.call(this, e.uri), n = i ? new J3(e.uri, e.getLanguageId(), i.uri, i.type, t) : new J3(e.uri, e.getLanguageId(), void 0, void 0, t); + if (!((l = this._lastCandidate) != null && l.equals(n))) { this._lastCandidate = n; - for (const l of this._entries) - if (l._score = a9(l.selector, n.uri, n.languageId, EU(e), n.notebookUri, n.notebookType), z7(l.selector) && l._score > 0) + for (const r of this._entries) + if (r._score = ME(r.selector, n.uri, n.languageId, WQ(e), n.notebookUri, n.notebookType), L8(r.selector) && r._score > 0) if (t) - l._score = 0; + r._score = 0; else { - for (const a of this._entries) - a._score = 0; - l._score = 1e3; + for (const c of this._entries) + c._score = 0; + r._score = 1e3; break; } - this._entries.sort(ii._compareByScoreAndTime); + this._entries.sort(ni._compareByScoreAndTime); } } static _compareByScoreAndTime(e, t) { - return e._score < t._score ? 1 : e._score > t._score ? -1 : Ay(e.selector) && !Ay(t.selector) ? 1 : !Ay(e.selector) && Ay(t.selector) ? -1 : e._time < t._time ? 1 : e._time > t._time ? -1 : 0; + return e._score < t._score ? 1 : e._score > t._score ? -1 : Mf(e.selector) && !Mf(t.selector) ? 1 : !Mf(e.selector) && Mf(t.selector) ? -1 : e._time < t._time ? 1 : e._time > t._time ? -1 : 0; } } -function Ay(s) { - return typeof s == "string" ? !1 : Array.isArray(s) ? s.some(Ay) : !!s.isBuiltin; +function Mf(s) { + return typeof s == "string" ? !1 : Array.isArray(s) ? s.some(Mf) : !!s.isBuiltin; } -class TMe { +class L2e { constructor() { - this.referenceProvider = new ii(this._score.bind(this)), this.renameProvider = new ii(this._score.bind(this)), this.newSymbolNamesProvider = new ii(this._score.bind(this)), this.codeActionProvider = new ii(this._score.bind(this)), this.definitionProvider = new ii(this._score.bind(this)), this.typeDefinitionProvider = new ii(this._score.bind(this)), this.declarationProvider = new ii(this._score.bind(this)), this.implementationProvider = new ii(this._score.bind(this)), this.documentSymbolProvider = new ii(this._score.bind(this)), this.inlayHintsProvider = new ii(this._score.bind(this)), this.colorProvider = new ii(this._score.bind(this)), this.codeLensProvider = new ii(this._score.bind(this)), this.documentFormattingEditProvider = new ii(this._score.bind(this)), this.documentRangeFormattingEditProvider = new ii(this._score.bind(this)), this.onTypeFormattingEditProvider = new ii(this._score.bind(this)), this.signatureHelpProvider = new ii(this._score.bind(this)), this.hoverProvider = new ii(this._score.bind(this)), this.documentHighlightProvider = new ii(this._score.bind(this)), this.multiDocumentHighlightProvider = new ii(this._score.bind(this)), this.selectionRangeProvider = new ii(this._score.bind(this)), this.foldingRangeProvider = new ii(this._score.bind(this)), this.linkProvider = new ii(this._score.bind(this)), this.inlineCompletionsProvider = new ii(this._score.bind(this)), this.inlineEditProvider = new ii(this._score.bind(this)), this.completionProvider = new ii(this._score.bind(this)), this.linkedEditingRangeProvider = new ii(this._score.bind(this)), this.documentRangeSemanticTokensProvider = new ii(this._score.bind(this)), this.documentSemanticTokensProvider = new ii(this._score.bind(this)), this.documentDropEditProvider = new ii(this._score.bind(this)), this.documentPasteEditProvider = new ii(this._score.bind(this)); + this.referenceProvider = new ni(this._score.bind(this)), this.renameProvider = new ni(this._score.bind(this)), this.newSymbolNamesProvider = new ni(this._score.bind(this)), this.codeActionProvider = new ni(this._score.bind(this)), this.definitionProvider = new ni(this._score.bind(this)), this.typeDefinitionProvider = new ni(this._score.bind(this)), this.declarationProvider = new ni(this._score.bind(this)), this.implementationProvider = new ni(this._score.bind(this)), this.documentSymbolProvider = new ni(this._score.bind(this)), this.inlayHintsProvider = new ni(this._score.bind(this)), this.colorProvider = new ni(this._score.bind(this)), this.codeLensProvider = new ni(this._score.bind(this)), this.documentFormattingEditProvider = new ni(this._score.bind(this)), this.documentRangeFormattingEditProvider = new ni(this._score.bind(this)), this.onTypeFormattingEditProvider = new ni(this._score.bind(this)), this.signatureHelpProvider = new ni(this._score.bind(this)), this.hoverProvider = new ni(this._score.bind(this)), this.documentHighlightProvider = new ni(this._score.bind(this)), this.multiDocumentHighlightProvider = new ni(this._score.bind(this)), this.selectionRangeProvider = new ni(this._score.bind(this)), this.foldingRangeProvider = new ni(this._score.bind(this)), this.linkProvider = new ni(this._score.bind(this)), this.inlineCompletionsProvider = new ni(this._score.bind(this)), this.inlineEditProvider = new ni(this._score.bind(this)), this.completionProvider = new ni(this._score.bind(this)), this.linkedEditingRangeProvider = new ni(this._score.bind(this)), this.documentRangeSemanticTokensProvider = new ni(this._score.bind(this)), this.documentSemanticTokensProvider = new ni(this._score.bind(this)), this.documentDropEditProvider = new ni(this._score.bind(this)), this.documentPasteEditProvider = new ni(this._score.bind(this)); } _score(e) { var t; @@ -98715,28 +98715,28 @@ class TMe { } } it( - ge, - TMe, + me, + L2e, 1 /* InstantiationType.Delayed */ ); -var DMe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var I2e = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, $0 = function(s, e) { +}, rf = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const Ql = ce; -let ZG = class extends Ko { +const ec = de; +let BY = class extends jo { get _targetWindow() { - return xe(this._target.targetElements[0]); + return Le(this._target.targetElements[0]); } get _targetDocumentElement() { - return xe(this._target.targetElements[0]).document.documentElement; + return Le(this._target.targetElements[0]).document.documentElement; } get isDisposed() { return this._isDisposed; @@ -98772,59 +98772,59 @@ let ZG = class extends Ko { set isLocked(e) { this._isLocked !== e && (this._isLocked = e, this._hoverContainer.classList.toggle("locked", this._isLocked)); } - constructor(e, t, i, n, o, r) { - var u, g, m, f, b, y, w; - super(), this._keybindingService = t, this._configurationService = i, this._openerService = n, this._instantiationService = o, this._accessibilityService = r, this._messageListeners = new U(), this._isDisposed = !1, this._forcePosition = !1, this._x = 0, this._y = 0, this._isLocked = !1, this._enableFocusTraps = !1, this._addedFocusTrap = !1, this._onDispose = this._register(new k()), this._onRequestLayout = this._register(new k()), this._linkHandler = e.linkHandler || ((C) => $X(this._openerService, C, Nl(e.content) ? e.content.isTrusted : void 0)), this._target = "targetElements" in e.target ? e.target : new VMe(e.target), this._hoverPointer = (u = e.appearance) != null && u.showPointer ? Ql("div.workbench-hover-pointer") : void 0, this._hover = this._register(new a5()), this._hover.containerDomNode.classList.add("workbench-hover", "fadeIn"), (g = e.appearance) != null && g.compact && this._hover.containerDomNode.classList.add("workbench-hover", "compact"), (m = e.appearance) != null && m.skipFadeInAnimation && this._hover.containerDomNode.classList.add("skip-fade-in"), e.additionalClasses && this._hover.containerDomNode.classList.add(...e.additionalClasses), (f = e.position) != null && f.forcePosition && (this._forcePosition = !0), e.trapFocus && (this._enableFocusTraps = !0), this._hoverPosition = ((b = e.position) == null ? void 0 : b.hoverPosition) ?? 3, this.onmousedown(this._hover.containerDomNode, (C) => C.stopPropagation()), this.onkeydown(this._hover.containerDomNode, (C) => { - C.equals( + constructor(e, t, i, n, o, l) { + var u, m, b, g, Z, f, y; + super(), this._keybindingService = t, this._configurationService = i, this._openerService = n, this._instantiationService = o, this._accessibilityService = l, this._messageListeners = new _(), this._isDisposed = !1, this._forcePosition = !1, this._x = 0, this._y = 0, this._isLocked = !1, this._enableFocusTraps = !1, this._addedFocusTrap = !1, this._onDispose = this._register(new k()), this._onRequestLayout = this._register(new k()), this._linkHandler = e.linkHandler || ((W) => LH(this._openerService, W, Mr(e.content) ? e.content.isTrusted : void 0)), this._target = "targetElements" in e.target ? e.target : new S2e(e.target), this._hoverPointer = (u = e.appearance) != null && u.showPointer ? ec("div.workbench-hover-pointer") : void 0, this._hover = this._register(new MH()), this._hover.containerDomNode.classList.add("workbench-hover", "fadeIn"), (m = e.appearance) != null && m.compact && this._hover.containerDomNode.classList.add("workbench-hover", "compact"), (b = e.appearance) != null && b.skipFadeInAnimation && this._hover.containerDomNode.classList.add("skip-fade-in"), e.additionalClasses && this._hover.containerDomNode.classList.add(...e.additionalClasses), (g = e.position) != null && g.forcePosition && (this._forcePosition = !0), e.trapFocus && (this._enableFocusTraps = !0), this._hoverPosition = ((Z = e.position) == null ? void 0 : Z.hoverPosition) ?? 3, this.onmousedown(this._hover.containerDomNode, (W) => W.stopPropagation()), this.onkeydown(this._hover.containerDomNode, (W) => { + W.equals( 9 /* KeyCode.Escape */ ) && this.dispose(); }), this._register(z(this._targetWindow, "blur", () => this.dispose())); - const l = Ql("div.hover-row.markdown-hover"), a = Ql("div.hover-contents"); + const r = ec("div.hover-row.markdown-hover"), c = ec("div.hover-contents"); if (typeof e.content == "string") - a.textContent = e.content, a.style.whiteSpace = "pre-wrap"; - else if (Ki(e.content)) - a.appendChild(e.content), a.classList.add("html-hover-contents"); + c.textContent = e.content, c.style.whiteSpace = "pre-wrap"; + else if (Oi(e.content)) + c.appendChild(e.content), c.classList.add("html-hover-contents"); else { - const C = e.content, S = this._instantiationService.createInstance(Qc, { codeBlockFontFamily: this._configurationService.getValue("editor").fontFamily || ps.fontFamily }), { element: L } = S.render(C, { + const W = e.content, G = this._instantiationService.createInstance(ea, { codeBlockFontFamily: this._configurationService.getValue("editor").fontFamily || Zs.fontFamily }), { element: X } = G.render(W, { actionHandler: { - callback: (x) => this._linkHandler(x), + callback: (L) => this._linkHandler(L), disposables: this._messageListeners }, asyncRenderCallback: () => { - a.classList.add("code-hover-contents"), this.layout(), this._onRequestLayout.fire(); + c.classList.add("code-hover-contents"), this.layout(), this._onRequestLayout.fire(); } }); - a.appendChild(L); - } - if (l.appendChild(a), this._hover.contentsDomNode.appendChild(l), e.actions && e.actions.length > 0) { - const C = Ql("div.hover-row.status-bar"), S = Ql("div.actions"); - e.actions.forEach((L) => { - const x = this._keybindingService.lookupKeybinding(L.commandId), Z = x ? x.getLabel() : null; - RI.render(S, { - label: L.label, - commandId: L.commandId, - run: (_) => { - L.run(_), this.dispose(); + c.appendChild(X); + } + if (r.appendChild(c), this._hover.contentsDomNode.appendChild(r), e.actions && e.actions.length > 0) { + const W = ec("div.hover-row.status-bar"), G = ec("div.actions"); + e.actions.forEach((X) => { + const L = this._keybindingService.lookupKeybinding(X.commandId), S = L ? L.getLabel() : null; + qx.render(G, { + label: X.label, + commandId: X.commandId, + run: (x) => { + X.run(x), this.dispose(); }, - iconClass: L.iconClass - }, Z); - }), C.appendChild(S), this._hover.containerDomNode.appendChild(C); + iconClass: X.iconClass + }, S); + }), W.appendChild(G), this._hover.containerDomNode.appendChild(W); } - this._hoverContainer = Ql("div.workbench-hover-container"), this._hoverPointer && this._hoverContainer.appendChild(this._hoverPointer), this._hoverContainer.appendChild(this._hover.containerDomNode); - let c; - if (e.actions && e.actions.length > 0 ? c = !1 : ((y = e.persistence) == null ? void 0 : y.hideOnHover) === void 0 ? c = typeof e.content == "string" || Nl(e.content) && !e.content.value.includes("](") && !e.content.value.includes("") : c = e.persistence.hideOnHover, (w = e.appearance) != null && w.showHoverHint) { - const C = Ql("div.hover-row.status-bar"), S = Ql("div.info"); - S.textContent = p("hoverhint", "Hold {0} key to mouse over", qe ? "Option" : "Alt"), C.appendChild(S), this._hover.containerDomNode.appendChild(C); + this._hoverContainer = ec("div.workbench-hover-container"), this._hoverPointer && this._hoverContainer.appendChild(this._hoverPointer), this._hoverContainer.appendChild(this._hover.containerDomNode); + let d; + if (e.actions && e.actions.length > 0 ? d = !1 : ((f = e.persistence) == null ? void 0 : f.hideOnHover) === void 0 ? d = typeof e.content == "string" || Mr(e.content) && !e.content.value.includes("](") && !e.content.value.includes("") : d = e.persistence.hideOnHover, (y = e.appearance) != null && y.showHoverHint) { + const W = ec("div.hover-row.status-bar"), G = ec("div.info"); + G.textContent = p("hoverhint", "Hold {0} key to mouse over", qe ? "Option" : "Alt"), W.appendChild(G), this._hover.containerDomNode.appendChild(W); } - const d = [...this._target.targetElements]; - c || d.push(this._hoverContainer); - const h = this._register(new gB(d)); + const a = [...this._target.targetElements]; + d || a.push(this._hoverContainer); + const h = this._register(new H3(a)); if (this._register(h.onMouseOut(() => { this._isLocked || this.dispose(); - })), c) { - const C = [...this._target.targetElements, this._hoverContainer]; - this._lockMouseTracker = this._register(new gB(C)), this._register(this._lockMouseTracker.onMouseOut(() => { + })), d) { + const W = [...this._target.targetElements, this._hoverContainer]; + this._lockMouseTracker = this._register(new H3(W)), this._register(this._lockMouseTracker.onMouseOut(() => { this._isLocked || this.dispose(); })); } else @@ -98836,7 +98836,7 @@ let ZG = class extends Ko { this._addedFocusTrap = !0; const e = this._hover.containerDomNode, t = this.findLastFocusableChild(this._hover.containerDomNode); if (t) { - const i = hE(this._hoverContainer, Ql("div")), n = Q(this._hoverContainer, Ql("div")); + const i = vv(this._hoverContainer, ec("div")), n = O(this._hoverContainer, ec("div")); i.tabIndex = 0, n.tabIndex = 0, this._register(z(n, "focus", (o) => { e.focus(), o.preventDefault(); })), this._register(z(i, "focus", (o) => { @@ -98861,49 +98861,49 @@ let ZG = class extends Ko { render(e) { var n; e.appendChild(this._hoverContainer); - const i = this._hoverContainer.contains(this._hoverContainer.ownerDocument.activeElement) && wQ(this._configurationService.getValue("accessibility.verbosity.hover") === !0 && this._accessibilityService.isScreenReaderOptimized(), (n = this._keybindingService.lookupKeybinding("editor.action.accessibleView")) == null ? void 0 : n.getAriaLabel()); - i && Bc(i), this.layout(), this.addFocusTrap(); + const i = this._hoverContainer.contains(this._hoverContainer.ownerDocument.activeElement) && t4(this._configurationService.getValue("accessibility.verbosity.hover") === !0 && this._accessibilityService.isScreenReaderOptimized(), (n = this._keybindingService.lookupKeybinding("editor.action.accessibleView")) == null ? void 0 : n.getAriaLabel()); + i && _d(i), this.layout(), this.addFocusTrap(); } layout() { this._hover.containerDomNode.classList.remove("right-aligned"), this._hover.contentsDomNode.style.maxHeight = ""; - const e = (d) => { - const h = tJ(d), u = d.getBoundingClientRect(); + const e = (a) => { + const h = JB(a), u = a.getBoundingClientRect(); return { top: u.top * h, bottom: u.bottom * h, right: u.right * h, left: u.left * h }; - }, t = this._target.targetElements.map((d) => e(d)), { top: i, right: n, bottom: o, left: r } = t[0], l = n - r, a = o - i, c = { + }, t = this._target.targetElements.map((a) => e(a)), { top: i, right: n, bottom: o, left: l } = t[0], r = n - l, c = o - i, d = { top: i, right: n, bottom: o, - left: r, - width: l, - height: a, + left: l, + width: r, + height: c, center: { - x: r + l / 2, - y: i + a / 2 + x: l + r / 2, + y: i + c / 2 } }; - if (this.adjustHorizontalHoverPosition(c), this.adjustVerticalHoverPosition(c), this.adjustHoverMaxHeight(c), this._hoverContainer.style.padding = "", this._hoverContainer.style.margin = "", this._hoverPointer) { + if (this.adjustHorizontalHoverPosition(d), this.adjustVerticalHoverPosition(d), this.adjustHoverMaxHeight(d), this._hoverContainer.style.padding = "", this._hoverContainer.style.margin = "", this._hoverPointer) { switch (this._hoverPosition) { case 1: - c.left += 3, c.right += 3, this._hoverContainer.style.paddingLeft = "3px", this._hoverContainer.style.marginLeft = "-3px"; + d.left += 3, d.right += 3, this._hoverContainer.style.paddingLeft = "3px", this._hoverContainer.style.marginLeft = "-3px"; break; case 0: - c.left -= 3, c.right -= 3, this._hoverContainer.style.paddingRight = "3px", this._hoverContainer.style.marginRight = "-3px"; + d.left -= 3, d.right -= 3, this._hoverContainer.style.paddingRight = "3px", this._hoverContainer.style.marginRight = "-3px"; break; case 2: - c.top += 3, c.bottom += 3, this._hoverContainer.style.paddingTop = "3px", this._hoverContainer.style.marginTop = "-3px"; + d.top += 3, d.bottom += 3, this._hoverContainer.style.paddingTop = "3px", this._hoverContainer.style.marginTop = "-3px"; break; case 3: - c.top -= 3, c.bottom -= 3, this._hoverContainer.style.paddingBottom = "3px", this._hoverContainer.style.marginBottom = "-3px"; + d.top -= 3, d.bottom -= 3, this._hoverContainer.style.paddingBottom = "3px", this._hoverContainer.style.marginBottom = "-3px"; break; } - c.center.x = c.left + l / 2, c.center.y = c.top + a / 2; + d.center.x = d.left + r / 2, d.center.y = d.top + c / 2; } - this.computeXCordinate(c), this.computeYCordinate(c), this._hoverPointer && (this._hoverPointer.classList.remove("top"), this._hoverPointer.classList.remove("left"), this._hoverPointer.classList.remove("right"), this._hoverPointer.classList.remove("bottom"), this.setHoverPointerPosition(c)), this._hover.onContentsChanged(); + this.computeXCordinate(d), this.computeYCordinate(d), this._hoverPointer && (this._hoverPointer.classList.remove("top"), this._hoverPointer.classList.remove("left"), this._hoverPointer.classList.remove("right"), this._hoverPointer.classList.remove("bottom"), this.setHoverPointerPosition(d)), this._hover.onContentsChanged(); } computeXCordinate(e) { const t = this._hover.containerDomNode.clientWidth + 2; @@ -98968,14 +98968,14 @@ let ZG = class extends Ko { this._isDisposed || (this._onDispose.fire(), this._hoverContainer.remove(), this._messageListeners.dispose(), this._target.dispose(), super.dispose()), this._isDisposed = !0; } }; -ZG = DMe([ - $0(1, xt), - $0(2, Ke), - $0(3, Bs), - $0(4, Se), - $0(5, yo) -], ZG); -class gB extends Ko { +BY = I2e([ + rf(1, Lt), + rf(2, Qe), + rf(3, Ps), + rf(4, Ge), + rf(5, Wo) +], BY); +class H3 extends jo { get onMouseOut() { return this._onMouseOut.event; } @@ -98992,37 +98992,37 @@ class gB extends Ko { this._isMouseIn = !1, this._evaluateMouseState(e); } _evaluateMouseState(e) { - this._clearEvaluateMouseStateTimeout(e), this._mouseTimeout = xe(e).setTimeout(() => this._fireIfMouseOutside(), 0); + this._clearEvaluateMouseStateTimeout(e), this._mouseTimeout = Le(e).setTimeout(() => this._fireIfMouseOutside(), 0); } _clearEvaluateMouseStateTimeout(e) { - this._mouseTimeout && (xe(e).clearTimeout(this._mouseTimeout), this._mouseTimeout = void 0); + this._mouseTimeout && (Le(e).clearTimeout(this._mouseTimeout), this._mouseTimeout = void 0); } _fireIfMouseOutside() { this._isMouseIn || this._onMouseOut.fire(); } } -class VMe { +class S2e { constructor(e) { this._element = e, this.targetElements = [this._element]; } dispose() { } } -function kMe(s) { +function x2e(s) { const e = s; return !!e && typeof e.x == "number" && typeof e.y == "number"; } -var jd; +var th; (function(s) { s[s.AVOID = 0] = "AVOID", s[s.ALIGN = 1] = "ALIGN"; -})(jd || (jd = {})); -function qp(s, e, t) { - const i = t.mode === jd.ALIGN ? t.offset : t.offset + t.size, n = t.mode === jd.ALIGN ? t.offset + t.size : t.offset; +})(th || (th = {})); +function sg(s, e, t) { + const i = t.mode === th.ALIGN ? t.offset : t.offset + t.size, n = t.mode === th.ALIGN ? t.offset + t.size : t.offset; return t.position === 0 ? e <= s - i ? i : e <= n ? n - e : Math.max(s - e, 0) : e <= n ? n - e : e <= s - i ? i : 0; } -const yf = class yf extends R { +const Lg = class Lg extends J { constructor(e, t) { - super(), this.container = null, this.useFixedPosition = !1, this.useShadowDOM = !1, this.delegate = null, this.toDisposeOnClean = R.None, this.toDisposeOnSetContainer = R.None, this.shadowRoot = null, this.shadowRootHostElement = null, this.view = ce(".context-view"), rs(this.view), this.setContainer(e, t), this._register(Ce(() => this.setContainer( + super(), this.container = null, this.useFixedPosition = !1, this.useShadowDOM = !1, this.delegate = null, this.toDisposeOnClean = J.None, this.toDisposeOnSetContainer = J.None, this.shadowRoot = null, this.shadowRootHostElement = null, this.view = de(".context-view"), cs(this.view), this.setContainer(e, t), this._register(We(() => this.setContainer( null, 1 /* ContextViewDOMPosition.ABSOLUTE */ @@ -99034,26 +99034,26 @@ const yf = class yf extends R { const i = this.useShadowDOM; if (this.useShadowDOM = t === 3, !(e === this.container && i === this.useShadowDOM) && (this.container && (this.toDisposeOnSetContainer.dispose(), this.view.remove(), this.shadowRoot && (this.shadowRoot = null, (n = this.shadowRootHostElement) == null || n.remove(), this.shadowRootHostElement = null), this.container = null), e)) { if (this.container = e, this.useShadowDOM) { - this.shadowRootHostElement = ce(".shadow-root-host"), this.container.appendChild(this.shadowRootHostElement), this.shadowRoot = this.shadowRootHostElement.attachShadow({ mode: "open" }); - const r = document.createElement("style"); - r.textContent = GMe, this.shadowRoot.appendChild(r), this.shadowRoot.appendChild(this.view), this.shadowRoot.appendChild(ce("slot")); + this.shadowRootHostElement = de(".shadow-root-host"), this.container.appendChild(this.shadowRootHostElement), this.shadowRoot = this.shadowRootHostElement.attachShadow({ mode: "open" }); + const l = document.createElement("style"); + l.textContent = C2e, this.shadowRoot.appendChild(l), this.shadowRoot.appendChild(this.view), this.shadowRoot.appendChild(de("slot")); } else this.container.appendChild(this.view); - const o = new U(); - yf.BUBBLE_UP_EVENTS.forEach((r) => { - o.add(ai(this.container, r, (l) => { - this.onDOMEvent(l, !1); + const o = new _(); + Lg.BUBBLE_UP_EVENTS.forEach((l) => { + o.add(di(this.container, l, (r) => { + this.onDOMEvent(r, !1); })); - }), yf.BUBBLE_DOWN_EVENTS.forEach((r) => { - o.add(ai(this.container, r, (l) => { - this.onDOMEvent(l, !0); + }), Lg.BUBBLE_DOWN_EVENTS.forEach((l) => { + o.add(di(this.container, l, (r) => { + this.onDOMEvent(r, !0); }, !0)); }), this.toDisposeOnSetContainer = o; } } show(e) { var t, i; - this.isVisible() && this.hide(), gn(this.view), this.view.className = "context-view monaco-component", this.view.style.top = "0px", this.view.style.left = "0px", this.view.style.zIndex = `${2575 + (e.layer ?? 0)}`, this.view.style.position = this.useFixedPosition ? "fixed" : "absolute", no(this.view), this.toDisposeOnClean = e.render(this.view) || R.None, this.delegate = e, this.doLayout(), (i = (t = this.delegate).focus) == null || i.call(t); + this.isVisible() && this.hide(), bn(this.view), this.view.className = "context-view monaco-component", this.view.style.top = "0px", this.view.style.left = "0px", this.view.style.zIndex = `${2575 + (e.layer ?? 0)}`, this.view.style.position = this.useFixedPosition ? "fixed" : "absolute", oo(this.view), this.toDisposeOnClean = e.render(this.view) || J.None, this.delegate = e, this.doLayout(), (i = (t = this.delegate).focus) == null || i.call(t); } getViewElement() { return this.view; @@ -99061,7 +99061,7 @@ const yf = class yf extends R { layout() { var e, t; if (this.isVisible()) { - if (this.delegate.canRelayout === !1 && !(Wa && HR.pointerEvents)) { + if (this.delegate.canRelayout === !1 && !(Yc && Zv.pointerEvents)) { this.hide(); return; } @@ -99073,15 +99073,15 @@ const yf = class yf extends R { return; const e = this.delegate.getAnchor(); let t; - if (Ki(e)) { - const u = yi(e), g = tJ(e); + if (Oi(e)) { + const u = yi(e), m = JB(e); t = { - top: u.top * g, - left: u.left * g, - width: u.width * g, - height: u.height * g + top: u.top * m, + left: u.left * m, + width: u.width * m, + height: u.height * m }; - } else kMe(e) ? t = { + } else x2e(e) ? t = { top: e.y, left: e.x, width: e.width || 1, @@ -99096,47 +99096,47 @@ const yf = class yf extends R { width: 2, height: 2 }; - const i = $s(this.view), n = Lc(this.view), o = this.delegate.anchorPosition || 0, r = this.delegate.anchorAlignment || 0, l = this.delegate.anchorAxisAlignment || 0; - let a, c; - const d = sy(); - if (l === 0) { + const i = to(this.view), n = Sd(this.view), o = this.delegate.anchorPosition || 0, l = this.delegate.anchorAlignment || 0, r = this.delegate.anchorAxisAlignment || 0; + let c, d; + const a = bf(); + if (r === 0) { const u = { - offset: t.top - d.pageYOffset, + offset: t.top - a.pageYOffset, size: t.height, position: o === 0 ? 0 : 1 /* LayoutAnchorPosition.After */ - }, g = { offset: t.left, size: t.width, position: r === 0 ? 0 : 1, mode: jd.ALIGN }; - a = qp(d.innerHeight, n, u) + d.pageYOffset, vn.intersects({ start: a, end: a + n }, { start: u.offset, end: u.offset + u.size }) && (g.mode = jd.AVOID), c = qp(d.innerWidth, i, g); + }, m = { offset: t.left, size: t.width, position: l === 0 ? 0 : 1, mode: th.ALIGN }; + c = sg(a.innerHeight, n, u) + a.pageYOffset, Tn.intersects({ start: c, end: c + n }, { start: u.offset, end: u.offset + u.size }) && (m.mode = th.AVOID), d = sg(a.innerWidth, i, m); } else { const u = { offset: t.left, size: t.width, - position: r === 0 ? 0 : 1 + position: l === 0 ? 0 : 1 /* LayoutAnchorPosition.After */ - }, g = { offset: t.top, size: t.height, position: o === 0 ? 0 : 1, mode: jd.ALIGN }; - c = qp(d.innerWidth, i, u), vn.intersects({ start: c, end: c + i }, { start: u.offset, end: u.offset + u.size }) && (g.mode = jd.AVOID), a = qp(d.innerHeight, n, g) + d.pageYOffset; + }, m = { offset: t.top, size: t.height, position: o === 0 ? 0 : 1, mode: th.ALIGN }; + d = sg(a.innerWidth, i, u), Tn.intersects({ start: d, end: d + i }, { start: u.offset, end: u.offset + u.size }) && (m.mode = th.AVOID), c = sg(a.innerHeight, n, m) + a.pageYOffset; } - this.view.classList.remove("top", "bottom", "left", "right"), this.view.classList.add(o === 0 ? "bottom" : "top"), this.view.classList.add(r === 0 ? "left" : "right"), this.view.classList.toggle("fixed", this.useFixedPosition); + this.view.classList.remove("top", "bottom", "left", "right"), this.view.classList.add(o === 0 ? "bottom" : "top"), this.view.classList.add(l === 0 ? "left" : "right"), this.view.classList.toggle("fixed", this.useFixedPosition); const h = yi(this.container); - this.view.style.top = `${a - (this.useFixedPosition ? yi(this.view).top : h.top)}px`, this.view.style.left = `${c - (this.useFixedPosition ? yi(this.view).left : h.left)}px`, this.view.style.width = "initial"; + this.view.style.top = `${c - (this.useFixedPosition ? yi(this.view).top : h.top)}px`, this.view.style.left = `${d - (this.useFixedPosition ? yi(this.view).left : h.left)}px`, this.view.style.width = "initial"; } hide(e) { const t = this.delegate; - this.delegate = null, t != null && t.onHide && t.onHide(e), this.toDisposeOnClean.dispose(), rs(this.view); + this.delegate = null, t != null && t.onHide && t.onHide(e), this.toDisposeOnClean.dispose(), cs(this.view); } isVisible() { return !!this.delegate; } onDOMEvent(e, t) { - this.delegate && (this.delegate.onDOMEvent ? this.delegate.onDOMEvent(e, xe(e).document.activeElement) : t && !Ji(e.target, this.container) && this.hide()); + this.delegate && (this.delegate.onDOMEvent ? this.delegate.onDOMEvent(e, Le(e).document.activeElement) : t && !_i(e.target, this.container) && this.hide()); } dispose() { this.hide(), super.dispose(); } }; -yf.BUBBLE_UP_EVENTS = ["click", "keydown", "focus", "blur"], yf.BUBBLE_DOWN_EVENTS = ["click"]; -let _G = yf; -const GMe = ( +Lg.BUBBLE_UP_EVENTS = ["click", "keydown", "focus", "blur"], Lg.BUBBLE_DOWN_EVENTS = ["click"]; +let _Y = Lg; +const C2e = ( /* css */ ` :host { @@ -99179,19 +99179,19 @@ const GMe = ( :host-context(.linux:lang(ko)) { font-family: system-ui, "Ubuntu", "Droid Sans", "Source Han Sans K", "Source Han Sans JR", "Source Han Sans", "UnDotum", "FBaekmuk Gulim", sans-serif; } ` ); -var RMe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var R2e = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, EMe = function(s, e) { +}, N2e = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let NM = class extends R { +let KI = class extends J { constructor(e) { - super(), this.layoutService = e, this.contextView = this._register(new _G( + super(), this.layoutService = e, this.contextView = this._register(new _Y( this.layoutService.mainContainer, 1 /* ContextViewDOMPosition.ABSOLUTE */ @@ -99200,7 +99200,7 @@ let NM = class extends R { // ContextView showContextView(e, t, i) { let n; - t ? t === this.layoutService.getContainer(xe(t)) ? n = 1 : i ? n = 3 : n = 2 : n = 1, this.contextView.setContainer(t ?? this.layoutService.activeContainer, n), this.contextView.show(e); + t ? t === this.layoutService.getContainer(Le(t)) ? n = 1 : i ? n = 3 : n = 2 : n = 1, this.contextView.setContainer(t ?? this.layoutService.activeContainer, n), this.contextView.show(e); const o = { close: () => { this.openContextView === o && this.hideContextView(); @@ -99215,15 +99215,15 @@ let NM = class extends R { this.contextView.hide(e), this.openContextView = void 0; } }; -NM = RMe([ - EMe(0, iu) -], NM); -class XMe extends NM { +KI = R2e([ + N2e(0, lu) +], KI); +class w2e extends KI { getContextViewElement() { return this.contextView.getViewElement(); } } -class FMe { +class T2e { constructor(e, t, i) { this.hoverDelegate = e, this.target = t, this.fadeInAnimation = i; } @@ -99231,12 +99231,12 @@ class FMe { if (this._cancellationTokenSource && (this._cancellationTokenSource.dispose(!0), this._cancellationTokenSource = void 0), this.isDisposed) return; let n; - if (e === void 0 || Vs(e) || Ki(e)) + if (e === void 0 || vs(e) || Oi(e)) n = e; - else if (!QL(e.markdown)) + else if (!hV(e.markdown)) n = e.markdown ?? e.markdownNotSupportedFallback; else { - this._hoverWidget || this.show(p("iconLabel.loading", "Loading..."), t, i), this._cancellationTokenSource = new mi(); + this._hoverWidget || this.show(p("iconLabel.loading", "Loading..."), t, i), this._cancellationTokenSource = new pi(); const o = this._cancellationTokenSource.token; if (n = await e.markdown(o), n === void 0 && (n = e.markdownNotSupportedFallback), this.isDisposed || o.isCancellationRequested) return; @@ -99247,7 +99247,7 @@ class FMe { var o; const n = this._hoverWidget; if (this.hasContent(e)) { - const r = { + const l = { content: e, target: this.target, actions: i == null ? void 0 : i.actions, @@ -99263,12 +99263,12 @@ class FMe { hoverPosition: 2 } }; - this._hoverWidget = this.hoverDelegate.showHover(r, t); + this._hoverWidget = this.hoverDelegate.showHover(l, t); } n == null || n.dispose(); } hasContent(e) { - return e ? Nl(e) ? !!e.value : !0 : !1; + return e ? Mr(e) ? !!e.value : !0 : !1; } get isDisposed() { var e; @@ -99279,62 +99279,62 @@ class FMe { (e = this._hoverWidget) == null || e.dispose(), (t = this._cancellationTokenSource) == null || t.dispose(!0), this._cancellationTokenSource = void 0; } } -var YMe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var M2e = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, ey = function(s, e) { +}, cf = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let IG = class extends R { +let QY = class extends J { constructor(e, t, i, n, o) { - super(), this._instantiationService = e, this._keybindingService = i, this._layoutService = n, this._accessibilityService = o, this._managedHovers = /* @__PURE__ */ new Map(), t.onDidShowContextMenu(() => this.hideHover()), this._contextViewHandler = this._register(new NM(this._layoutService)); + super(), this._instantiationService = e, this._keybindingService = i, this._layoutService = n, this._accessibilityService = o, this._managedHovers = /* @__PURE__ */ new Map(), t.onDidShowContextMenu(() => this.hideHover()), this._contextViewHandler = this._register(new KI(this._layoutService)); } showHover(e, t, i) { - var a, c, d, h; - if (mB(this._currentHoverOptions) === mB(e) || this._currentHover && ((c = (a = this._currentHoverOptions) == null ? void 0 : a.persistence) != null && c.sticky)) + var c, d, a, h; + if (E3(this._currentHoverOptions) === E3(e) || this._currentHover && ((d = (c = this._currentHoverOptions) == null ? void 0 : c.persistence) != null && d.sticky)) return; this._currentHoverOptions = e, this._lastHoverOptions = e; - const n = e.trapFocus || this._accessibilityService.isScreenReaderOptimized(), o = _n(); + const n = e.trapFocus || this._accessibilityService.isScreenReaderOptimized(), o = Cn(); i || (n && o ? o.classList.contains("monaco-hover") || (this._lastFocusedElementBeforeOpen = o) : this._lastFocusedElementBeforeOpen = void 0); - const r = new U(), l = this._instantiationService.createInstance(ZG, e); - if ((d = e.persistence) != null && d.sticky && (l.isLocked = !0), l.onDispose(() => { - var g, m; - ((g = this._currentHover) == null ? void 0 : g.domNode) && nJ(this._currentHover.domNode) && ((m = this._lastFocusedElementBeforeOpen) == null || m.focus()), this._currentHoverOptions === e && (this._currentHoverOptions = void 0), r.dispose(); - }, void 0, r), !e.container) { - const u = Ki(e.target) ? e.target : e.target.targetElements[0]; - e.container = this._layoutService.getContainer(xe(u)); - } - if (this._contextViewHandler.showContextView(new zMe(l, t), e.container), l.onRequestLayout(() => this._contextViewHandler.layout(), void 0, r), (h = e.persistence) != null && h.sticky) - r.add(z(xe(e.container).document, ie.MOUSE_DOWN, (u) => { - Ji(u.target, l.domNode) || this.doHideHover(); + const l = new _(), r = this._instantiationService.createInstance(BY, e); + if ((a = e.persistence) != null && a.sticky && (r.isLocked = !0), r.onDispose(() => { + var m, b; + ((m = this._currentHover) == null ? void 0 : m.domNode) && EB(this._currentHover.domNode) && ((b = this._lastFocusedElementBeforeOpen) == null || b.focus()), this._currentHoverOptions === e && (this._currentHoverOptions = void 0), l.dispose(); + }, void 0, l), !e.container) { + const u = Oi(e.target) ? e.target : e.target.targetElements[0]; + e.container = this._layoutService.getContainer(Le(u)); + } + if (this._contextViewHandler.showContextView(new Y2e(r, t), e.container), r.onRequestLayout(() => this._contextViewHandler.layout(), void 0, l), (h = e.persistence) != null && h.sticky) + l.add(z(Le(e.container).document, ie.MOUSE_DOWN, (u) => { + _i(u.target, r.domNode) || this.doHideHover(); })); else { if ("targetElements" in e.target) - for (const g of e.target.targetElements) - r.add(z(g, ie.CLICK, () => this.hideHover())); + for (const m of e.target.targetElements) + l.add(z(m, ie.CLICK, () => this.hideHover())); else - r.add(z(e.target, ie.CLICK, () => this.hideHover())); - const u = _n(); + l.add(z(e.target, ie.CLICK, () => this.hideHover())); + const u = Cn(); if (u) { - const g = xe(u).document; - r.add(z(u, ie.KEY_DOWN, (m) => { - var f; - return this._keyDown(m, l, !!((f = e.persistence) != null && f.hideOnKeyDown)); - })), r.add(z(g, ie.KEY_DOWN, (m) => { - var f; - return this._keyDown(m, l, !!((f = e.persistence) != null && f.hideOnKeyDown)); - })), r.add(z(u, ie.KEY_UP, (m) => this._keyUp(m, l))), r.add(z(g, ie.KEY_UP, (m) => this._keyUp(m, l))); + const m = Le(u).document; + l.add(z(u, ie.KEY_DOWN, (b) => { + var g; + return this._keyDown(b, r, !!((g = e.persistence) != null && g.hideOnKeyDown)); + })), l.add(z(m, ie.KEY_DOWN, (b) => { + var g; + return this._keyDown(b, r, !!((g = e.persistence) != null && g.hideOnKeyDown)); + })), l.add(z(u, ie.KEY_UP, (b) => this._keyUp(b, r))), l.add(z(m, ie.KEY_UP, (b) => this._keyUp(b, r))); } } - if ("IntersectionObserver" in vt) { - const u = new IntersectionObserver((m) => this._intersectionChange(m, l), { threshold: 0 }), g = "targetElements" in e.target ? e.target.targetElements[0] : e.target; - u.observe(g), r.add(Ce(() => u.disconnect())); + if ("IntersectionObserver" in wt) { + const u = new IntersectionObserver((b) => this._intersectionChange(b, r), { threshold: 0 }), m = "targetElements" in e.target ? e.target.targetElements[0] : e.target; + u.observe(m), l.add(We(() => u.disconnect())); } - return this._currentHover = l, l; + return this._currentHover = r, r; } hideHover() { var e; @@ -99350,13 +99350,13 @@ let IG = class extends R { this._lastHoverOptions && this.showHover(this._lastHoverOptions, !0, !0); } _keyDown(e, t, i) { - var r, l; + var l, r; if (e.key === "Alt") { t.isLocked = !0; return; } - const n = new Vt(e); - this._keybindingService.resolveKeyboardEvent(n).getSingleModifierDispatchChords().some((a) => !!a) || this._keybindingService.softDispatch(n, n.target).kind !== 0 || i && (!((r = this._currentHoverOptions) != null && r.trapFocus) || e.key !== "Tab") && (this.hideHover(), (l = this._lastFocusedElementBeforeOpen) == null || l.focus()); + const n = new Yt(e); + this._keybindingService.resolveKeyboardEvent(n).getSingleModifierDispatchChords().some((c) => !!c) || this._keybindingService.softDispatch(n, n.target).kind !== 0 || i && (!((l = this._currentHoverOptions) != null && l.trapFocus) || e.key !== "Tab") && (this.hideHover(), (r = this._lastFocusedElementBeforeOpen) == null || r.focus()); } _keyUp(e, t) { var i; @@ -99366,64 +99366,64 @@ let IG = class extends R { // and thrown away on start up setupManagedHover(e, t, i, n) { t.setAttribute("custom-hover", "true"), t.title !== "" && (console.warn("HTML element already has a title attribute, which will conflict with the custom hover. Please remove the title attribute."), console.trace("Stack trace:", t.title), t.title = ""); - let o, r; - const l = (C, S) => { - var x; - const L = r !== void 0; - C && (r == null || r.dispose(), r = void 0), S && (o == null || o.dispose(), o = void 0), L && ((x = e.onDidHideHover) == null || x.call(e), r = void 0); - }, a = (C, S, L, x) => new qr(async () => { - (!r || r.isDisposed) && (r = new FMe(e, L || t, C > 0), await r.update(typeof i == "function" ? i() : i, S, { ...n, trapFocus: x })); - }, C); - let c = !1; - const d = z(t, ie.MOUSE_DOWN, () => { - c = !0, l(!0, !0); + let o, l; + const r = (W, G) => { + var L; + const X = l !== void 0; + W && (l == null || l.dispose(), l = void 0), G && (o == null || o.dispose(), o = void 0), X && ((L = e.onDidHideHover) == null || L.call(e), l = void 0); + }, c = (W, G, X, L) => new tr(async () => { + (!l || l.isDisposed) && (l = new T2e(e, X || t, W > 0), await l.update(typeof i == "function" ? i() : i, G, { ...n, trapFocus: L })); + }, W); + let d = !1; + const a = z(t, ie.MOUSE_DOWN, () => { + d = !0, r(!0, !0); }, !0), h = z(t, ie.MOUSE_UP, () => { - c = !1; - }, !0), u = z(t, ie.MOUSE_LEAVE, (C) => { - c = !1, l(!1, C.fromElement === t); - }, !0), g = (C) => { + d = !1; + }, !0), u = z(t, ie.MOUSE_LEAVE, (W) => { + d = !1, r(!1, W.fromElement === t); + }, !0), m = (W) => { if (o) return; - const S = new U(), L = { + const G = new _(), X = { targetElements: [t], dispose: () => { } }; if (e.placement === void 0 || e.placement === "mouse") { - const x = (Z) => { - L.x = Z.x + 10, Ki(Z.target) && pB(Z.target, t) !== t && l(!0, !0); + const L = (S) => { + X.x = S.x + 10, Oi(S.target) && D3(S.target, t) !== t && r(!0, !0); }; - S.add(z(t, ie.MOUSE_MOVE, x, !0)); + G.add(z(t, ie.MOUSE_MOVE, L, !0)); } - o = S, !(Ki(C.target) && pB(C.target, t) !== t) && S.add(a(e.delay, !1, L)); - }, m = z(t, ie.MOUSE_OVER, g, !0), f = () => { - if (c || o) + o = G, !(Oi(W.target) && D3(W.target, t) !== t) && G.add(c(e.delay, !1, X)); + }, b = z(t, ie.MOUSE_OVER, m, !0), g = () => { + if (d || o) return; - const C = { + const W = { targetElements: [t], dispose: () => { } - }, S = new U(), L = () => l(!0, !0); - S.add(z(t, ie.BLUR, L, !0)), S.add(a(e.delay, !1, C)), o = S; + }, G = new _(), X = () => r(!0, !0); + G.add(z(t, ie.BLUR, X, !0)), G.add(c(e.delay, !1, W)), o = G; }; - let b; - const y = t.tagName.toLowerCase(); - y !== "input" && y !== "textarea" && (b = z(t, ie.FOCUS, f, !0)); - const w = { - show: (C) => { - l(!1, !0), a(0, C, void 0, C); + let Z; + const f = t.tagName.toLowerCase(); + f !== "input" && f !== "textarea" && (Z = z(t, ie.FOCUS, g, !0)); + const y = { + show: (W) => { + r(!1, !0), c(0, W, void 0, W); }, hide: () => { - l(!0, !0); + r(!0, !0); }, - update: async (C, S) => { - i = C, await (r == null ? void 0 : r.update(i, void 0, S)); + update: async (W, G) => { + i = W, await (l == null ? void 0 : l.update(i, void 0, G)); }, dispose: () => { - this._managedHovers.delete(t), m.dispose(), u.dispose(), d.dispose(), h.dispose(), b == null || b.dispose(), l(!0, !0); + this._managedHovers.delete(t), b.dispose(), u.dispose(), a.dispose(), h.dispose(), Z == null || Z.dispose(), r(!0, !0); } }; - return this._managedHovers.set(t, w), w; + return this._managedHovers.set(t, y), y; } showManagedHover(e) { const t = this._managedHovers.get(e); @@ -99433,18 +99433,18 @@ let IG = class extends R { this._managedHovers.forEach((e) => e.dispose()), super.dispose(); } }; -IG = YMe([ - ey(0, Se), - ey(1, Co), - ey(2, xt), - ey(3, iu), - ey(4, yo) -], IG); -function mB(s) { +QY = M2e([ + cf(0, Ge), + cf(1, Xo), + cf(2, Lt), + cf(3, lu), + cf(4, Wo) +], QY); +function E3(s) { if (s !== void 0) return (s == null ? void 0 : s.id) ?? s; } -class zMe { +class Y2e { get anchorPosition() { return this._hover.anchor; } @@ -99464,27 +99464,27 @@ class zMe { this._hover.layout(); } } -function pB(s, e) { - for (e = e ?? xe(s).document.body; !s.hasAttribute("custom-hover") && s !== e; ) +function D3(s, e) { + for (e = e ?? Le(s).document.body; !s.hasAttribute("custom-hover") && s !== e; ) s = s.parentElement; return s; } it( - Pa, - IG, + Bc, + QY, 1 /* InstantiationType.Delayed */ ); -Lr((s, e) => { - const t = s.getColor(eU); +Il((s, e) => { + const t = s.getColor(v_); t && (e.addRule(`.monaco-workbench .workbench-hover .hover-row:not(:first-child):not(:empty) { border-top: 1px solid ${t.transparent(0.5)}; }`), e.addRule(`.monaco-workbench .workbench-hover hr { border-top: 1px solid ${t.transparent(0.5)}; }`)); }); -function eL(s) { - return Object.isFrozen(s) ? s : fte(s); +function mX(s) { + return Object.isFrozen(s) ? s : cie(s); } -class un { +class mn { static createEmptyModel(e) { - return new un({}, [], [], void 0, e); + return new mn({}, [], [], void 0, e); } constructor(e, t, i, n, o) { this._contents = e, this._keys = t, this._overrides = i, this.raw = n, this.logService = o, this.overrideConfigurations = /* @__PURE__ */ new Map(); @@ -99494,9 +99494,9 @@ class un { if (!this._rawConfiguration) if ((e = this.raw) != null && e.length) { const t = this.raw.map((i) => { - if (i instanceof un) + if (i instanceof mn) return i; - const n = new PMe("", this.logService); + const n = new k2e("", this.logService); return n.parseRaw(i), n.configurationModel; }); this._rawConfiguration = t.reduce((i, n) => n === i ? n : i.merge(n), t[0]); @@ -99517,78 +99517,78 @@ class un { return this._keys.length === 0 && Object.keys(this._contents).length === 0 && this._overrides.length === 0; } getValue(e) { - return e ? yF(this.contents, e) : this.contents; + return e ? AD(this.contents, e) : this.contents; } inspect(e, t) { const i = this; return { get value() { - return eL(i.rawConfiguration.getValue(e)); + return mX(i.rawConfiguration.getValue(e)); }, get override() { - return t ? eL(i.rawConfiguration.getOverrideValue(e, t)) : void 0; + return t ? mX(i.rawConfiguration.getOverrideValue(e, t)) : void 0; }, get merged() { - return eL(t ? i.rawConfiguration.override(t).getValue(e) : i.rawConfiguration.getValue(e)); + return mX(t ? i.rawConfiguration.override(t).getValue(e) : i.rawConfiguration.getValue(e)); }, get overrides() { const n = []; - for (const { contents: o, identifiers: r, keys: l } of i.rawConfiguration.overrides) { - const a = new un(o, l, [], void 0, i.logService).getValue(e); - a !== void 0 && n.push({ identifiers: r, value: a }); + for (const { contents: o, identifiers: l, keys: r } of i.rawConfiguration.overrides) { + const c = new mn(o, r, [], void 0, i.logService).getValue(e); + c !== void 0 && n.push({ identifiers: l, value: c }); } - return n.length ? eL(n) : void 0; + return n.length ? mX(n) : void 0; } }; } getOverrideValue(e, t) { const i = this.getContentsForOverrideIdentifer(t); - return i ? e ? yF(i, e) : i : void 0; + return i ? e ? AD(i, e) : i : void 0; } override(e) { let t = this.overrideConfigurations.get(e); return t || (t = this.createOverrideConfigurationModel(e), this.overrideConfigurations.set(e, t)), t; } merge(...e) { - var r, l; - const t = gc(this.contents), i = gc(this.overrides), n = [...this.keys], o = (r = this.raw) != null && r.length ? [...this.raw] : [this]; - for (const a of e) - if (o.push(...(l = a.raw) != null && l.length ? a.raw : [a]), !a.isEmpty()) { - this.mergeContents(t, a.contents); - for (const c of a.overrides) { - const [d] = i.filter((h) => ei(h.identifiers, c.identifiers)); - d ? (this.mergeContents(d.contents, c.contents), d.keys.push(...c.keys), d.keys = Oc(d.keys)) : i.push(gc(c)); + var l, r; + const t = Zd(this.contents), i = Zd(this.overrides), n = [...this.keys], o = (l = this.raw) != null && l.length ? [...this.raw] : [this]; + for (const c of e) + if (o.push(...(r = c.raw) != null && r.length ? c.raw : [c]), !c.isEmpty()) { + this.mergeContents(t, c.contents); + for (const d of c.overrides) { + const [a] = i.filter((h) => ti(h.identifiers, d.identifiers)); + a ? (this.mergeContents(a.contents, d.contents), a.keys.push(...d.keys), a.keys = Qd(a.keys)) : i.push(Zd(d)); } - for (const c of a.keys) - n.indexOf(c) === -1 && n.push(c); + for (const d of c.keys) + n.indexOf(d) === -1 && n.push(d); } - return new un(t, n, i, o.every((a) => a instanceof un) ? void 0 : o, this.logService); + return new mn(t, n, i, o.every((c) => c instanceof mn) ? void 0 : o, this.logService); } createOverrideConfigurationModel(e) { const t = this.getContentsForOverrideIdentifer(e); if (!t || typeof t != "object" || !Object.keys(t).length) return this; const i = {}; - for (const n of Oc([...Object.keys(this.contents), ...Object.keys(t)])) { + for (const n of Qd([...Object.keys(this.contents), ...Object.keys(t)])) { let o = this.contents[n]; - const r = t[n]; - r && (typeof o == "object" && typeof r == "object" ? (o = gc(o), this.mergeContents(o, r)) : o = r), i[n] = o; + const l = t[n]; + l && (typeof o == "object" && typeof l == "object" ? (o = Zd(o), this.mergeContents(o, l)) : o = l), i[n] = o; } - return new un(i, this.keys, this.overrides, void 0, this.logService); + return new mn(i, this.keys, this.overrides, void 0, this.logService); } mergeContents(e, t) { for (const i of Object.keys(t)) { - if (i in e && tn(e[i]) && tn(t[i])) { + if (i in e && nn(e[i]) && nn(t[i])) { this.mergeContents(e[i], t[i]); continue; } - e[i] = gc(t[i]); + e[i] = Zd(t[i]); } } getContentsForOverrideIdentifer(e) { let t = null, i = null; const n = (o) => { - o && (i ? this.mergeContents(i, o) : i = gc(o)); + o && (i ? this.mergeContents(i, o) : i = Zd(o)); }; for (const o of this.overrides) o.identifiers.length === 1 && o.identifiers[0] === e ? t = o.contents : o.identifiers.includes(e) && n(o.contents); @@ -99606,72 +99606,72 @@ class un { } removeValue(e) { const t = this.keys.indexOf(e); - t !== -1 && (this.keys.splice(t, 1), Mee(this.contents, e), Th.test(e) && this.overrides.splice(this.overrides.findIndex((i) => ei(i.identifiers, SA(e))), 1)); + t !== -1 && (this.keys.splice(t, 1), Zte(this.contents, e), vh.test(e) && this.overrides.splice(this.overrides.findIndex((i) => ti(i.identifiers, vV(e))), 1)); } updateValue(e, t, i) { - if (WJ(this.contents, e, t, (n) => this.logService.error(n)), i = i || this.keys.indexOf(e) === -1, i && this.keys.push(e), Th.test(e)) { - const n = SA(e), o = { + if (u_(this.contents, e, t, (n) => this.logService.error(n)), i = i || this.keys.indexOf(e) === -1, i && this.keys.push(e), vh.test(e)) { + const n = vV(e), o = { identifiers: n, keys: Object.keys(this.contents[e]), - contents: z2(this.contents[e], (l) => this.logService.error(l)) - }, r = this.overrides.findIndex((l) => ei(l.identifiers, n)); - r !== -1 ? this.overrides[r] = o : this.overrides.push(o); + contents: dw(this.contents[e], (r) => this.logService.error(r)) + }, l = this.overrides.findIndex((r) => ti(r.identifiers, n)); + l !== -1 ? this.overrides[l] = o : this.overrides.push(o); } } } -class PMe { +class k2e { constructor(e, t) { this._name = e, this.logService = t, this._raw = null, this._configurationModel = null, this._restrictedConfigurations = []; } get configurationModel() { - return this._configurationModel || un.createEmptyModel(this.logService); + return this._configurationModel || mn.createEmptyModel(this.logService); } parseRaw(e, t) { this._raw = e; - const { contents: i, keys: n, overrides: o, restricted: r, hasExcludedProperties: l } = this.doParseRaw(e, t); - this._configurationModel = new un(i, n, o, l ? [e] : void 0, this.logService), this._restrictedConfigurations = r || []; + const { contents: i, keys: n, overrides: o, restricted: l, hasExcludedProperties: r } = this.doParseRaw(e, t); + this._configurationModel = new mn(i, n, o, r ? [e] : void 0, this.logService), this._restrictedConfigurations = l || []; } doParseRaw(e, t) { - const i = Di.as($r.Configuration).getConfigurationProperties(), n = this.filter(e, i, !0, t); + const i = ki.as(ir.Configuration).getConfigurationProperties(), n = this.filter(e, i, !0, t); e = n.raw; - const o = z2(e, (a) => this.logService.error(`Conflict in settings file ${this._name}: ${a}`)), r = Object.keys(e), l = this.toOverrides(e, (a) => this.logService.error(`Conflict in settings file ${this._name}: ${a}`)); - return { contents: o, keys: r, overrides: l, restricted: n.restricted, hasExcludedProperties: n.hasExcludedProperties }; + const o = dw(e, (c) => this.logService.error(`Conflict in settings file ${this._name}: ${c}`)), l = Object.keys(e), r = this.toOverrides(e, (c) => this.logService.error(`Conflict in settings file ${this._name}: ${c}`)); + return { contents: o, keys: l, overrides: r, restricted: n.restricted, hasExcludedProperties: n.hasExcludedProperties }; } filter(e, t, i, n) { - var a, c, d; + var c, d, a; let o = !1; - if (!(n != null && n.scopes) && !(n != null && n.skipRestricted) && !((a = n == null ? void 0 : n.exclude) != null && a.length)) + if (!(n != null && n.scopes) && !(n != null && n.skipRestricted) && !((c = n == null ? void 0 : n.exclude) != null && c.length)) return { raw: e, restricted: [], hasExcludedProperties: o }; - const r = {}, l = []; + const l = {}, r = []; for (const h in e) - if (Th.test(h) && i) { + if (vh.test(h) && i) { const u = this.filter(e[h], t, !1, n); - r[h] = u.raw, o = o || u.hasExcludedProperties, l.push(...u.restricted); + l[h] = u.raw, o = o || u.hasExcludedProperties, r.push(...u.restricted); } else { - const u = t[h], g = u ? typeof u.scope < "u" ? u.scope : 3 : void 0; - u != null && u.restricted && l.push(h), !((c = n.exclude) != null && c.includes(h)) && ((d = n.include) != null && d.includes(h) || (g === void 0 || n.scopes === void 0 || n.scopes.includes(g)) && !(n.skipRestricted && (u != null && u.restricted))) ? r[h] = e[h] : o = !0; + const u = t[h], m = u ? typeof u.scope < "u" ? u.scope : 3 : void 0; + u != null && u.restricted && r.push(h), !((d = n.exclude) != null && d.includes(h)) && ((a = n.include) != null && a.includes(h) || (m === void 0 || n.scopes === void 0 || n.scopes.includes(m)) && !(n.skipRestricted && (u != null && u.restricted))) ? l[h] = e[h] : o = !0; } - return { raw: r, restricted: l, hasExcludedProperties: o }; + return { raw: l, restricted: r, hasExcludedProperties: o }; } toOverrides(e, t) { const i = []; for (const n of Object.keys(e)) - if (Th.test(n)) { + if (vh.test(n)) { const o = {}; - for (const r in e[n]) - o[r] = e[n][r]; + for (const l in e[n]) + o[l] = e[n][l]; i.push({ - identifiers: SA(n), + identifiers: vV(n), keys: Object.keys(o), - contents: z2(o, t) + contents: dw(o, t) }); } return i; } } -class BMe { - constructor(e, t, i, n, o, r, l, a, c, d, h, u, g) { - this.key = e, this.overrides = t, this._value = i, this.overrideIdentifiers = n, this.defaultConfiguration = o, this.policyConfiguration = r, this.applicationConfiguration = l, this.userConfiguration = a, this.localUserConfiguration = c, this.remoteUserConfiguration = d, this.workspaceConfiguration = h, this.folderConfigurationModel = u, this.memoryConfigurationModel = g; +class v2e { + constructor(e, t, i, n, o, l, r, c, d, a, h, u, m) { + this.key = e, this.overrides = t, this._value = i, this.overrideIdentifiers = n, this.defaultConfiguration = o, this.policyConfiguration = l, this.applicationConfiguration = r, this.userConfiguration = c, this.localUserConfiguration = d, this.remoteUserConfiguration = a, this.workspaceConfiguration = h, this.folderConfigurationModel = u, this.memoryConfigurationModel = m; } toInspectValue(e) { return (e == null ? void 0 : e.value) !== void 0 || (e == null ? void 0 : e.override) !== void 0 || (e == null ? void 0 : e.overrides) !== void 0 ? e : void 0; @@ -99683,23 +99683,23 @@ class BMe { return this.toInspectValue(this.userInspectValue); } } -class lN { - constructor(e, t, i, n, o, r, l, a, c, d) { - this._defaultConfiguration = e, this._policyConfiguration = t, this._applicationConfiguration = i, this._localUserConfiguration = n, this._remoteUserConfiguration = o, this._workspaceConfiguration = r, this._folderConfigurations = l, this._memoryConfiguration = a, this._memoryConfigurationByResource = c, this.logService = d, this._workspaceConsolidatedConfiguration = null, this._foldersConsolidatedConfigurations = new sn(), this._userConfiguration = null; +class XC { + constructor(e, t, i, n, o, l, r, c, d, a) { + this._defaultConfiguration = e, this._policyConfiguration = t, this._applicationConfiguration = i, this._localUserConfiguration = n, this._remoteUserConfiguration = o, this._workspaceConfiguration = l, this._folderConfigurations = r, this._memoryConfiguration = c, this._memoryConfigurationByResource = d, this.logService = a, this._workspaceConsolidatedConfiguration = null, this._foldersConsolidatedConfigurations = new on(), this._userConfiguration = null; } getValue(e, t, i) { return this.getConsolidatedConfigurationModel(e, t, i).getValue(e); } updateValue(e, t, i = {}) { let n; - i.resource ? (n = this._memoryConfigurationByResource.get(i.resource), n || (n = un.createEmptyModel(this.logService), this._memoryConfigurationByResource.set(i.resource, n))) : n = this._memoryConfiguration, t === void 0 ? n.removeValue(e) : n.setValue(e, t), i.resource || (this._workspaceConsolidatedConfiguration = null); + i.resource ? (n = this._memoryConfigurationByResource.get(i.resource), n || (n = mn.createEmptyModel(this.logService), this._memoryConfigurationByResource.set(i.resource, n))) : n = this._memoryConfiguration, t === void 0 ? n.removeValue(e) : n.setValue(e, t), i.resource || (this._workspaceConsolidatedConfiguration = null); } inspect(e, t, i) { - const n = this.getConsolidatedConfigurationModel(e, t, i), o = this.getFolderConfigurationModelForResource(t.resource, i), r = t.resource ? this._memoryConfigurationByResource.get(t.resource) || this._memoryConfiguration : this._memoryConfiguration, l = /* @__PURE__ */ new Set(); - for (const a of n.overrides) - for (const c of a.identifiers) - n.getOverrideValue(e, c) !== void 0 && l.add(c); - return new BMe(e, t, n.getValue(e), l.size ? [...l] : void 0, this._defaultConfiguration, this._policyConfiguration.isEmpty() ? void 0 : this._policyConfiguration, this.applicationConfiguration.isEmpty() ? void 0 : this.applicationConfiguration, this.userConfiguration, this.localUserConfiguration, this.remoteUserConfiguration, i ? this._workspaceConfiguration : void 0, o || void 0, r); + const n = this.getConsolidatedConfigurationModel(e, t, i), o = this.getFolderConfigurationModelForResource(t.resource, i), l = t.resource ? this._memoryConfigurationByResource.get(t.resource) || this._memoryConfiguration : this._memoryConfiguration, r = /* @__PURE__ */ new Set(); + for (const c of n.overrides) + for (const d of c.identifiers) + n.getOverrideValue(e, d) !== void 0 && r.add(d); + return new v2e(e, t, n.getValue(e), r.size ? [...r] : void 0, this._defaultConfiguration, this._policyConfiguration.isEmpty() ? void 0 : this._policyConfiguration, this.applicationConfiguration.isEmpty() ? void 0 : this.applicationConfiguration, this.userConfiguration, this.localUserConfiguration, this.remoteUserConfiguration, i ? this._workspaceConfiguration : void 0, o || void 0, l); } get applicationConfiguration() { return this._applicationConfiguration; @@ -99779,72 +99779,72 @@ class lN { }; } static parse(e, t) { - const i = this.parseConfigurationModel(e.defaults, t), n = this.parseConfigurationModel(e.policy, t), o = this.parseConfigurationModel(e.application, t), r = this.parseConfigurationModel(e.user, t), l = this.parseConfigurationModel(e.workspace, t), a = e.folders.reduce((c, d) => (c.set(Le.revive(d[0]), this.parseConfigurationModel(d[1], t)), c), new sn()); - return new lN(i, n, o, r, un.createEmptyModel(t), l, a, un.createEmptyModel(t), new sn(), t); + const i = this.parseConfigurationModel(e.defaults, t), n = this.parseConfigurationModel(e.policy, t), o = this.parseConfigurationModel(e.application, t), l = this.parseConfigurationModel(e.user, t), r = this.parseConfigurationModel(e.workspace, t), c = e.folders.reduce((d, a) => (d.set(Xe.revive(a[0]), this.parseConfigurationModel(a[1], t)), d), new on()); + return new XC(i, n, o, l, mn.createEmptyModel(t), r, c, mn.createEmptyModel(t), new on(), t); } static parseConfigurationModel(e, t) { - return new un(e.contents, e.keys, e.overrides, void 0, t); + return new mn(e.contents, e.keys, e.overrides, void 0, t); } } -class OMe { +class J2e { constructor(e, t, i, n, o) { this.change = e, this.previous = t, this.currentConfiguraiton = i, this.currentWorkspace = n, this.logService = o, this._marker = ` `, this._markerCode1 = this._marker.charCodeAt(0), this._markerCode2 = 46, this.affectedKeys = /* @__PURE__ */ new Set(), this._previousConfiguration = void 0; - for (const r of e.keys) - this.affectedKeys.add(r); - for (const [, r] of e.overrides) - for (const l of r) - this.affectedKeys.add(l); + for (const l of e.keys) + this.affectedKeys.add(l); + for (const [, l] of e.overrides) + for (const r of l) + this.affectedKeys.add(r); this._affectsConfigStr = this._marker; - for (const r of this.affectedKeys) - this._affectsConfigStr += r + this._marker; + for (const l of this.affectedKeys) + this._affectsConfigStr += l + this._marker; } get previousConfiguration() { - return !this._previousConfiguration && this.previous && (this._previousConfiguration = lN.parse(this.previous.data, this.logService)), this._previousConfiguration; + return !this._previousConfiguration && this.previous && (this._previousConfiguration = XC.parse(this.previous.data, this.logService)), this._previousConfiguration; } affectsConfiguration(e, t) { - var l; + var r; const i = this._marker + e, n = this._affectsConfigStr.indexOf(i); if (n < 0) return !1; const o = n + i.length; if (o >= this._affectsConfigStr.length) return !1; - const r = this._affectsConfigStr.charCodeAt(o); - if (r !== this._markerCode1 && r !== this._markerCode2) + const l = this._affectsConfigStr.charCodeAt(o); + if (l !== this._markerCode1 && l !== this._markerCode2) return !1; if (t) { - const a = this.previousConfiguration ? this.previousConfiguration.getValue(e, t, (l = this.previous) == null ? void 0 : l.workspace) : void 0, c = this.currentConfiguraiton.getValue(e, t, this.currentWorkspace); - return !co(a, c); + const c = this.previousConfiguration ? this.previousConfiguration.getValue(e, t, (r = this.previous) == null ? void 0 : r.workspace) : void 0, d = this.currentConfiguraiton.getValue(e, t, this.currentWorkspace); + return !uo(c, d); } return !0; } } -const WM = { +const UI = { kind: 0 /* ResultKind.NoMatchingKb */ -}, HMe = { +}, H2e = { kind: 1 /* ResultKind.MoreChordsNeeded */ }; -function JMe(s, e, t) { +function E2e(s, e, t) { return { kind: 2, commandId: s, commandArgs: e, isBubble: t }; } -class ow { +class gy { constructor(e, t, i) { var n; this._log = i, this._defaultKeybindings = e, this._defaultBoundCommands = /* @__PURE__ */ new Map(); for (const o of e) { - const r = o.command; - r && r.charAt(0) !== "-" && this._defaultBoundCommands.set(r, !0); + const l = o.command; + l && l.charAt(0) !== "-" && this._defaultBoundCommands.set(l, !0); } - this._map = /* @__PURE__ */ new Map(), this._lookupMap = /* @__PURE__ */ new Map(), this._keybindings = ow.handleRemovals([].concat(e).concat(t)); - for (let o = 0, r = this._keybindings.length; o < r; o++) { - const l = this._keybindings[o]; - if (l.chords.length === 0) + this._map = /* @__PURE__ */ new Map(), this._lookupMap = /* @__PURE__ */ new Map(), this._keybindings = gy.handleRemovals([].concat(e).concat(t)); + for (let o = 0, l = this._keybindings.length; o < l; o++) { + const r = this._keybindings[o]; + if (r.chords.length === 0) continue; - const a = (n = l.when) == null ? void 0 : n.substituteConstants(); - a && a.type === 0 || this._addKeyPress(l.chords[0], l); + const c = (n = r.when) == null ? void 0 : n.substituteConstants(); + c && c.type === 0 || this._addKeyPress(r.chords[0], r); } } static _isTargetedForRemoval(e, t, i) { @@ -99853,7 +99853,7 @@ class ow { if (t[n] !== e.chords[n]) return !1; } - return !(i && i.type !== 1 && (!e.when || !N$(i, e.when))); + return !(i && i.type !== 1 && (!e.when || !Gee(i, e.when))); } /** * Looks for rules containing "-commandId" and removes them. @@ -99861,38 +99861,38 @@ class ow { static handleRemovals(e) { const t = /* @__PURE__ */ new Map(); for (let n = 0, o = e.length; n < o; n++) { - const r = e[n]; - if (r.command && r.command.charAt(0) === "-") { - const l = r.command.substring(1); - t.has(l) ? t.get(l).push(r) : t.set(l, [r]); + const l = e[n]; + if (l.command && l.command.charAt(0) === "-") { + const r = l.command.substring(1); + t.has(r) ? t.get(r).push(l) : t.set(r, [l]); } } if (t.size === 0) return e; const i = []; for (let n = 0, o = e.length; n < o; n++) { - const r = e[n]; - if (!r.command || r.command.length === 0) { - i.push(r); + const l = e[n]; + if (!l.command || l.command.length === 0) { + i.push(l); continue; } - if (r.command.charAt(0) === "-") + if (l.command.charAt(0) === "-") continue; - const l = t.get(r.command); - if (!l || !r.isDefault) { - i.push(r); + const r = t.get(l.command); + if (!r || !l.isDefault) { + i.push(l); continue; } - let a = !1; - for (const c of l) { - const d = c.when; - if (this._isTargetedForRemoval(r, c.chords, d)) { - a = !0; + let c = !1; + for (const d of r) { + const a = d.when; + if (this._isTargetedForRemoval(l, d.chords, a)) { + c = !0; break; } } - if (!a) { - i.push(r); + if (!c) { + i.push(l); continue; } } @@ -99908,13 +99908,13 @@ class ow { const o = i[n]; if (o.command === t.command) continue; - let r = !0; - for (let l = 1; l < o.chords.length && l < t.chords.length; l++) - if (o.chords[l] !== t.chords[l]) { - r = !1; + let l = !0; + for (let r = 1; r < o.chords.length && r < t.chords.length; r++) + if (o.chords[r] !== t.chords[r]) { + l = !1; break; } - r && ow.whenIsEntirelyIncluded(o.when, t.when) && this._removeFromLookupMap(o); + l && gy.whenIsEntirelyIncluded(o.when, t.when) && this._removeFromLookupMap(o); } i.push(t), this._addToLookupMap(t); } @@ -99940,7 +99940,7 @@ class ow { * Returns true if it is provable `a` implies `b`. */ static whenIsEntirelyIncluded(e, t) { - return !t || t.type === 1 ? !0 : !e || e.type === 1 ? !1 : E2(e, t); + return !t || t.type === 1 ? !0 : !e || e.type === 1 ? !1 : ow(e, t); } getKeybindings() { return this._keybindings; @@ -99969,32 +99969,32 @@ class ow { this._log(`| Resolving ${n}`); const o = this._map.get(n[0]); if (o === void 0) - return this._log("\\ No keybinding entries."), WM; - let r = null; + return this._log("\\ No keybinding entries."), UI; + let l = null; if (n.length < 2) - r = o; + l = o; else { - r = []; - for (let a = 0, c = o.length; a < c; a++) { - const d = o[a]; - if (n.length > d.chords.length) + l = []; + for (let c = 0, d = o.length; c < d; c++) { + const a = o[c]; + if (n.length > a.chords.length) continue; let h = !0; for (let u = 1; u < n.length; u++) - if (d.chords[u] !== n[u]) { + if (a.chords[u] !== n[u]) { h = !1; break; } - h && r.push(d); + h && l.push(a); } } - const l = this._findCommand(e, r); - return l ? n.length < l.chords.length ? (this._log(`\\ From ${r.length} keybinding entries, awaiting ${l.chords.length - n.length} more chord(s), when: ${fB(l.when)}, source: ${bB(l)}.`), HMe) : (this._log(`\\ From ${r.length} keybinding entries, matched ${l.command}, when: ${fB(l.when)}, source: ${bB(l)}.`), JMe(l.command, l.commandArgs, l.bubble)) : (this._log(`\\ From ${r.length} keybinding entries, no when clauses matched the context.`), WM); + const r = this._findCommand(e, l); + return r ? n.length < r.chords.length ? (this._log(`\\ From ${l.length} keybinding entries, awaiting ${r.chords.length - n.length} more chord(s), when: ${F3(r.when)}, source: ${z3(r)}.`), H2e) : (this._log(`\\ From ${l.length} keybinding entries, matched ${r.command}, when: ${F3(r.when)}, source: ${z3(r)}.`), E2e(r.command, r.commandArgs, r.bubble)) : (this._log(`\\ From ${l.length} keybinding entries, no when clauses matched the context.`), UI); } _findCommand(e, t) { for (let i = t.length - 1; i >= 0; i--) { const n = t[i]; - if (ow._contextMatchesRules(e, n.when)) + if (gy._contextMatchesRules(e, n.when)) return n; } return null; @@ -100003,14 +100003,14 @@ class ow { return t ? t.evaluate(e) : !0; } } -function fB(s) { +function F3(s) { return s ? `${s.serialize()}` : "no when condition"; } -function bB(s) { +function z3(s) { return s.extensionId ? s.isBuiltinExtension ? `built-in extension ${s.extensionId}` : `user extension ${s.extensionId}` : s.isDefault ? "built-in" : "user"; } -const UMe = /^(cursor|delete|undo|redo|tab|editor\.action\.clipboard)/; -class KMe extends R { +const D2e = /^(cursor|delete|undo|redo|tab|editor\.action\.clipboard)/; +class F2e extends J { get onDidUpdateKeybindings() { return this._onDidUpdateKeybindings ? this._onDidUpdateKeybindings.event : se.None; } @@ -100018,7 +100018,7 @@ class KMe extends R { return this._currentChords.length > 0; } constructor(e, t, i, n, o) { - super(), this._contextKeyService = e, this._commandService = t, this._telemetryService = i, this._notificationService = n, this._logService = o, this._onDidUpdateKeybindings = this._register(new k()), this._currentChords = [], this._currentChordChecker = new $R(), this._currentChordStatusMessage = null, this._ignoreSingleModifiers = $p.EMPTY, this._currentSingleModifier = null, this._currentSingleModifierClearTimeout = new qr(), this._currentlyDispatchingCommandId = null, this._logging = !1; + super(), this._contextKeyService = e, this._commandService = t, this._telemetryService = i, this._notificationService = n, this._logService = o, this._onDidUpdateKeybindings = this._register(new k()), this._currentChords = [], this._currentChordChecker = new Lv(), this._currentChordStatusMessage = null, this._ignoreSingleModifiers = og.EMPTY, this._currentSingleModifier = null, this._currentSingleModifierClearTimeout = new tr(), this._currentlyDispatchingCommandId = null, this._logging = !1; } dispose() { super.dispose(); @@ -100043,12 +100043,12 @@ class KMe extends R { this._log("/ Soft dispatching keyboard event"); const i = this.resolveKeyboardEvent(e); if (i.hasMultipleChords()) - return console.warn("keyboard event should not be mapped to multiple chords"), WM; + return console.warn("keyboard event should not be mapped to multiple chords"), UI; const [n] = i.getDispatchChords(); if (n === null) - return this._log("\\ Keyboard event cannot be dispatched"), WM; - const o = this._contextKeyService.getContext(t), r = this._currentChords.map(({ keypress: l }) => l); - return this._getResolver().resolve(o, r, n); + return this._log("\\ Keyboard event cannot be dispatched"), UI; + const o = this._contextKeyService.getContext(t), l = this._currentChords.map(({ keypress: r }) => r); + return this._getResolver().resolve(o, l, n); } _scheduleLeaveChordMode() { const e = Date.now(); @@ -100063,7 +100063,7 @@ class KMe extends R { _expectAnotherChord(e, t) { switch (this._currentChords.push({ keypress: e, label: t }), this._currentChords.length) { case 0: - throw KR("impossible"); + throw Wv("impossible"); case 1: this._currentChordStatusMessage = this._notificationService.status(p("first.chord", "({0}) was pressed. Waiting for second key of chord...", t)); break; @@ -100072,10 +100072,10 @@ class KMe extends R { this._currentChordStatusMessage = this._notificationService.status(p("next.chord", "({0}) was pressed. Waiting for next key of chord...", i)); } } - this._scheduleLeaveChordMode(), vy.enabled && vy.disable(); + this._scheduleLeaveChordMode(), zf.enabled && zf.disable(); } _leaveChordMode() { - this._currentChordStatusMessage && (this._currentChordStatusMessage.dispose(), this._currentChordStatusMessage = null), this._currentChordChecker.cancel(), this._currentChords = [], vy.enable(); + this._currentChordStatusMessage && (this._currentChordStatusMessage.dispose(), this._currentChordStatusMessage = null), this._currentChordChecker.cancel(), this._currentChords = [], zf.enable(); } _dispatch(e, t) { return this._doDispatch( @@ -100088,7 +100088,7 @@ class KMe extends R { _singleModifierDispatch(e, t) { const i = this.resolveKeyboardEvent(e), [n] = i.getSingleModifierDispatchChords(); if (n) - return this._ignoreSingleModifiers.has(n) ? (this._log(`+ Ignoring single modifier ${n} due to it being pressed together with other keys.`), this._ignoreSingleModifiers = $p.EMPTY, this._currentSingleModifierClearTimeout.cancel(), this._currentSingleModifier = null, !1) : (this._ignoreSingleModifiers = $p.EMPTY, this._currentSingleModifier === null ? (this._log(`+ Storing single modifier for possible chord ${n}.`), this._currentSingleModifier = n, this._currentSingleModifierClearTimeout.cancelAndSet(() => { + return this._ignoreSingleModifiers.has(n) ? (this._log(`+ Ignoring single modifier ${n} due to it being pressed together with other keys.`), this._ignoreSingleModifiers = og.EMPTY, this._currentSingleModifierClearTimeout.cancel(), this._currentSingleModifier = null, !1) : (this._ignoreSingleModifiers = og.EMPTY, this._currentSingleModifier === null ? (this._log(`+ Storing single modifier for possible chord ${n}.`), this._currentSingleModifier = n, this._currentSingleModifierClearTimeout.cancelAndSet(() => { this._log("+ Clearing single modifier due to 300ms elapsed."), this._currentSingleModifier = null; }, 300), !1) : n === this._currentSingleModifier ? (this._log(`/ Dispatching single modifier chord ${n} ${n}`), this._currentSingleModifierClearTimeout.cancel(), this._currentSingleModifier = null, this._doDispatch( i, @@ -100097,26 +100097,26 @@ class KMe extends R { !0 )) : (this._log(`+ Clearing single modifier due to modifier mismatch: ${this._currentSingleModifier} ${n}`), this._currentSingleModifierClearTimeout.cancel(), this._currentSingleModifier = null, !1)); const [o] = i.getChords(); - return this._ignoreSingleModifiers = new $p(o), this._currentSingleModifier !== null && this._log("+ Clearing single modifier due to other key up."), this._currentSingleModifierClearTimeout.cancel(), this._currentSingleModifier = null, !1; + return this._ignoreSingleModifiers = new og(o), this._currentSingleModifier !== null && this._log("+ Clearing single modifier due to other key up."), this._currentSingleModifierClearTimeout.cancel(), this._currentSingleModifier = null, !1; } _doDispatch(e, t, i = !1) { let n = !1; if (e.hasMultipleChords()) return console.warn("Unexpected keyboard event mapped to multiple chords"), !1; - let o = null, r = null; + let o = null, l = null; if (i) { - const [d] = e.getSingleModifierDispatchChords(); - o = d, r = d ? [d] : []; + const [a] = e.getSingleModifierDispatchChords(); + o = a, l = a ? [a] : []; } else - [o] = e.getDispatchChords(), r = this._currentChords.map(({ keypress: d }) => d); + [o] = e.getDispatchChords(), l = this._currentChords.map(({ keypress: a }) => a); if (o === null) return this._log("\\ Keyboard event cannot be dispatched in keydown phase."), n; - const l = this._contextKeyService.getContext(t), a = e.getLabel(), c = this._getResolver().resolve(l, r, o); - switch (c.kind) { + const r = this._contextKeyService.getContext(t), c = e.getLabel(), d = this._getResolver().resolve(r, l, o); + switch (d.kind) { case 0: { - if (this._logService.trace("KeybindingService#dispatch", a, "[ No matching keybinding ]"), this.inChordMode) { - const d = this._currentChords.map(({ label: h }) => h).join(", "); - this._log(`+ Leaving multi-chord mode: Nothing bound to "${d}, ${a}".`), this._notificationService.status(p("missing.chord", "The key combination ({0}, {1}) is not a command.", d, a), { + if (this._logService.trace("KeybindingService#dispatch", c, "[ No matching keybinding ]"), this.inChordMode) { + const a = this._currentChords.map(({ label: h }) => h).join(", "); + this._log(`+ Leaving multi-chord mode: Nothing bound to "${a}, ${c}".`), this._notificationService.status(p("missing.chord", "The key combination ({0}, {1}) is not a command.", a, c), { hideAfter: 10 * 1e3 /* 10s */ }), this._leaveChordMode(), n = !0; @@ -100124,24 +100124,24 @@ class KMe extends R { return n; } case 1: - return this._logService.trace("KeybindingService#dispatch", a, "[ Several keybindings match - more chords needed ]"), n = !0, this._expectAnotherChord(o, a), this._log(this._currentChords.length === 1 ? "+ Entering multi-chord mode..." : "+ Continuing multi-chord mode..."), n; + return this._logService.trace("KeybindingService#dispatch", c, "[ Several keybindings match - more chords needed ]"), n = !0, this._expectAnotherChord(o, c), this._log(this._currentChords.length === 1 ? "+ Entering multi-chord mode..." : "+ Continuing multi-chord mode..."), n; case 2: { - if (this._logService.trace("KeybindingService#dispatch", a, `[ Will dispatch command ${c.commandId} ]`), c.commandId === null || c.commandId === "") { + if (this._logService.trace("KeybindingService#dispatch", c, `[ Will dispatch command ${d.commandId} ]`), d.commandId === null || d.commandId === "") { if (this.inChordMode) { - const d = this._currentChords.map(({ label: h }) => h).join(", "); - this._log(`+ Leaving chord mode: Nothing bound to "${d}, ${a}".`), this._notificationService.status(p("missing.chord", "The key combination ({0}, {1}) is not a command.", d, a), { + const a = this._currentChords.map(({ label: h }) => h).join(", "); + this._log(`+ Leaving chord mode: Nothing bound to "${a}, ${c}".`), this._notificationService.status(p("missing.chord", "The key combination ({0}, {1}) is not a command.", a, c), { hideAfter: 10 * 1e3 /* 10s */ }), this._leaveChordMode(), n = !0; } } else { - this.inChordMode && this._leaveChordMode(), c.isBubble || (n = !0), this._log(`+ Invoking command ${c.commandId}.`), this._currentlyDispatchingCommandId = c.commandId; + this.inChordMode && this._leaveChordMode(), d.isBubble || (n = !0), this._log(`+ Invoking command ${d.commandId}.`), this._currentlyDispatchingCommandId = d.commandId; try { - typeof c.commandArgs > "u" ? this._commandService.executeCommand(c.commandId).then(void 0, (d) => this._notificationService.warn(d)) : this._commandService.executeCommand(c.commandId, c.commandArgs).then(void 0, (d) => this._notificationService.warn(d)); + typeof d.commandArgs > "u" ? this._commandService.executeCommand(d.commandId).then(void 0, (a) => this._notificationService.warn(a)) : this._commandService.executeCommand(d.commandId, d.commandArgs).then(void 0, (a) => this._notificationService.warn(a)); } finally { this._currentlyDispatchingCommandId = null; } - UMe.test(c.commandId) || this._telemetryService.publicLog2("workbenchActionExecuted", { id: c.commandId, from: "keybinding", detail: e.getUserSettingsLabel() ?? void 0 }); + D2e.test(d.commandId) || this._telemetryService.publicLog2("workbenchActionExecuted", { id: d.commandId, from: "keybinding", detail: e.getUserSettingsLabel() ?? void 0 }); } return n; } @@ -100151,7 +100151,7 @@ class KMe extends R { return e.ctrlKey || e.metaKey ? !1 : e.keyCode >= 31 && e.keyCode <= 56 || e.keyCode >= 21 && e.keyCode <= 30; } } -const m_ = class m_ { +const RS = class RS { constructor(e) { this._ctrlKey = e ? e.ctrlKey : !1, this._shiftKey = e ? e.shiftKey : !1, this._altKey = e ? e.altKey : !1, this._metaKey = e ? e.metaKey : !1; } @@ -100168,14 +100168,14 @@ const m_ = class m_ { } } }; -m_.EMPTY = new m_(null); -let $p = m_; -class yB { - constructor(e, t, i, n, o, r, l) { - this._resolvedKeybindingItemBrand = void 0, this.resolvedKeybinding = e, this.chords = e ? NG(e.getDispatchChords()) : [], e && this.chords.length === 0 && (this.chords = NG(e.getSingleModifierDispatchChords())), this.bubble = t ? t.charCodeAt(0) === 94 : !1, this.command = this.bubble ? t.substr(1) : t, this.commandArgs = i, this.when = n, this.isDefault = o, this.extensionId = r, this.isBuiltinExtension = l; +RS.EMPTY = new RS(null); +let og = RS; +class A3 { + constructor(e, t, i, n, o, l, r) { + this._resolvedKeybindingItemBrand = void 0, this.resolvedKeybinding = e, this.chords = e ? OY(e.getDispatchChords()) : [], e && this.chords.length === 0 && (this.chords = OY(e.getSingleModifierDispatchChords())), this.bubble = t ? t.charCodeAt(0) === 94 : !1, this.command = this.bubble ? t.substr(1) : t, this.commandArgs = i, this.when = n, this.isDefault = o, this.extensionId = l, this.isBuiltinExtension = r; } } -function NG(s) { +function OY(s) { const e = []; for (let t = 0, i = s.length; t < i; t++) { const n = s[t]; @@ -100185,23 +100185,23 @@ function NG(s) { } return e; } -class QMe extends a6 { +class z2e extends eq { constructor(e, t) { if (super(), t.length === 0) - throw hr("chords"); + throw bl("chords"); this._os = e, this._chords = t; } getLabel() { - return BX.toLabel(this._os, this._chords, (e) => this._getLabel(e)); + return pH.toLabel(this._os, this._chords, (e) => this._getLabel(e)); } getAriaLabel() { - return _ge.toLabel(this._os, this._chords, (e) => this._getAriaLabel(e)); + return ybe.toLabel(this._os, this._chords, (e) => this._getAriaLabel(e)); } getElectronAccelerator() { - return this._chords.length > 1 || this._chords[0].isDuplicateModifierCase() ? null : Ige.toLabel(this._os, this._chords, (e) => this._getElectronAccelerator(e)); + return this._chords.length > 1 || this._chords[0].isDuplicateModifierCase() ? null : Wbe.toLabel(this._os, this._chords, (e) => this._getElectronAccelerator(e)); } getUserSettingsLabel() { - return Nge.toLabel(this._os, this._chords, (e) => this._getUserSettingsLabel(e)); + return Gbe.toLabel(this._os, this._chords, (e) => this._getUserSettingsLabel(e)); } hasMultipleChords() { return this._chords.length > 1; @@ -100210,7 +100210,7 @@ class QMe extends a6 { return this._chords.map((e) => this._getChord(e)); } _getChord(e) { - return new l6(e.ctrlKey, e.shiftKey, e.altKey, e.metaKey, this._getLabel(e), this._getAriaLabel(e)); + return new $6(e.ctrlKey, e.shiftKey, e.altKey, e.metaKey, this._getLabel(e), this._getAriaLabel(e)); } getDispatchChords() { return this._chords.map((e) => this._getChordDispatch(e)); @@ -100219,7 +100219,7 @@ class QMe extends a6 { return this._chords.map((e) => this._getSingleModifierChordDispatch(e)); } } -class eC extends QMe { +class uG extends z2e { constructor(e, t) { super(t, e); } @@ -100235,31 +100235,31 @@ class eC extends QMe { case 18: return "↓"; } - return bc.toString(e); + return Gd.toString(e); } _getLabel(e) { return e.isDuplicateModifierCase() ? "" : this._keyCodeToUILabel(e.keyCode); } _getAriaLabel(e) { - return e.isDuplicateModifierCase() ? "" : bc.toString(e.keyCode); + return e.isDuplicateModifierCase() ? "" : Gd.toString(e.keyCode); } _getElectronAccelerator(e) { - return bc.toElectronAccelerator(e.keyCode); + return Gd.toElectronAccelerator(e.keyCode); } _getUserSettingsLabel(e) { if (e.isDuplicateModifierCase()) return ""; - const t = bc.toUserSettingsUS(e.keyCode); + const t = Gd.toUserSettingsUS(e.keyCode); return t && t.toLowerCase(); } _getChordDispatch(e) { - return eC.getDispatchStr(e); + return uG.getDispatchStr(e); } static getDispatchStr(e) { if (e.isModifierKey()) return null; let t = ""; - return e.ctrlKey && (t += "ctrl+"), e.shiftKey && (t += "shift+"), e.altKey && (t += "alt+"), e.metaKey && (t += "meta+"), t += bc.toString(e.keyCode), t; + return e.ctrlKey && (t += "ctrl+"), e.shiftKey && (t += "shift+"), e.altKey && (t += "alt+"), e.metaKey && (t += "meta+"), t += Gd.toString(e.keyCode), t; } _getSingleModifierChordDispatch(e) { return e.keyCode === 5 && !e.shiftKey && !e.altKey && !e.metaKey ? "ctrl" : e.keyCode === 4 && !e.ctrlKey && !e.altKey && !e.metaKey ? "shift" : e.keyCode === 6 && !e.ctrlKey && !e.shiftKey && !e.metaKey ? "alt" : e.keyCode === 57 && !e.ctrlKey && !e.shiftKey && !e.altKey ? "meta" : null; @@ -100268,7 +100268,7 @@ class eC extends QMe { * *NOTE*: Check return value for `KeyCode.Unknown`. */ static _scanCodeToKeyCode(e) { - const t = UR[e]; + const t = yv[e]; if (t !== -1) return t; switch (e) { @@ -100376,27 +100376,27 @@ class eC extends QMe { static _toKeyCodeChord(e) { if (!e) return null; - if (e instanceof zc) + if (e instanceof Pd) return e; const t = this._scanCodeToKeyCode(e.scanCode); - return t === 0 ? null : new zc(e.ctrlKey, e.shiftKey, e.altKey, e.metaKey, t); + return t === 0 ? null : new Pd(e.ctrlKey, e.shiftKey, e.altKey, e.metaKey, t); } static resolveKeybinding(e, t) { - const i = NG(e.chords.map((n) => this._toKeyCodeChord(n))); - return i.length > 0 ? [new eC(i, t)] : []; + const i = OY(e.chords.map((n) => this._toKeyCodeChord(n))); + return i.length > 0 ? [new uG(i, t)] : []; } } -let zb = [], m9 = [], P7 = []; -function tL(s, e = !1) { - jMe(s, !1, e); +let _Z = [], EE = [], I8 = []; +function bX(s, e = !1) { + A2e(s, !1, e); } -function jMe(s, e, t) { - const i = qMe(s, e); - zb.push(i), i.userConfigured ? P7.push(i) : m9.push(i), t && !i.userConfigured && zb.forEach((n) => { +function A2e(s, e, t) { + const i = K2e(s, e); + _Z.push(i), i.userConfigured ? I8.push(i) : EE.push(i), t && !i.userConfigured && _Z.forEach((n) => { n.mime === i.mime || n.userConfigured || (i.extension && n.extension === i.extension && console.warn(`Overwriting extension <<${i.extension}>> to now point to mime <<${i.mime}>>`), i.filename && n.filename === i.filename && console.warn(`Overwriting filename <<${i.filename}>> to now point to mime <<${i.mime}>>`), i.filepattern && n.filepattern === i.filepattern && console.warn(`Overwriting filepattern <<${i.filepattern}>> to now point to mime <<${i.mime}>>`), i.firstline && n.firstline === i.firstline && console.warn(`Overwriting firstline <<${i.firstline}>> to now point to mime <<${i.mime}>>`)); }); } -function qMe(s, e) { +function K2e(s, e) { return { id: s.id, mime: s.mime, @@ -100407,63 +100407,63 @@ function qMe(s, e) { userConfigured: e, filenameLowercase: s.filename ? s.filename.toLowerCase() : void 0, extensionLowercase: s.extension ? s.extension.toLowerCase() : void 0, - filepatternLowercase: s.filepattern ? A7(s.filepattern.toLowerCase()) : void 0, - filepatternOnPath: s.filepattern ? s.filepattern.indexOf(vi.sep) >= 0 : !1 + filepatternLowercase: s.filepattern ? o8(s.filepattern.toLowerCase()) : void 0, + filepatternOnPath: s.filepattern ? s.filepattern.indexOf(Mi.sep) >= 0 : !1 }; } -function $Me() { - zb = zb.filter((s) => s.userConfigured), m9 = []; +function U2e() { + _Z = _Z.filter((s) => s.userConfigured), EE = []; } -function eZe(s, e) { - return tZe(s, e).map((t) => t.id); +function P2e(s, e) { + return B2e(s, e).map((t) => t.id); } -function tZe(s, e) { +function B2e(s, e) { let t; if (s) switch (s.scheme) { - case Ge.file: + case ve.file: t = s.fsPath; break; - case Ge.data: { - t = Gh.parseMetaData(s).get(Gh.META_DATA_LABEL); + case ve.data: { + t = Dh.parseMetaData(s).get(Dh.META_DATA_LABEL); break; } - case Ge.vscodeNotebookCell: + case ve.vscodeNotebookCell: t = void 0; break; default: t = s.path; } if (!t) - return [{ id: "unknown", mime: bi.unknown }]; + return [{ id: "unknown", mime: fi.unknown }]; t = t.toLowerCase(); - const i = $d(t), n = wB(t, i, P7); + const i = nh(t), n = K3(t, i, I8); if (n) - return [n, { id: ms, mime: bi.text }]; - const o = wB(t, i, m9); + return [n, { id: gs, mime: fi.text }]; + const o = K3(t, i, EE); if (o) - return [o, { id: ms, mime: bi.text }]; + return [o, { id: gs, mime: fi.text }]; if (e) { - const r = iZe(e); - if (r) - return [r, { id: ms, mime: bi.text }]; + const l = _2e(e); + if (l) + return [l, { id: gs, mime: fi.text }]; } - return [{ id: "unknown", mime: bi.unknown }]; + return [{ id: "unknown", mime: fi.unknown }]; } -function wB(s, e, t) { - var r; +function K3(s, e, t) { + var l; let i, n, o; - for (let l = t.length - 1; l >= 0; l--) { - const a = t[l]; - if (e === a.filenameLowercase) { - i = a; + for (let r = t.length - 1; r >= 0; r--) { + const c = t[r]; + if (e === c.filenameLowercase) { + i = c; break; } - if (a.filepattern && (!n || a.filepattern.length > n.filepattern.length)) { - const c = a.filepatternOnPath ? s : e; - (r = a.filepatternLowercase) != null && r.call(a, c) && (n = a); + if (c.filepattern && (!n || c.filepattern.length > n.filepattern.length)) { + const d = c.filepatternOnPath ? s : e; + (l = c.filepatternLowercase) != null && l.call(c, d) && (n = c); } - a.extension && (!o || a.extension.length > o.extension.length) && e.endsWith(a.extensionLowercase) && (o = a); + c.extension && (!o || c.extension.length > o.extension.length) && e.endsWith(c.extensionLowercase) && (o = c); } if (i) return i; @@ -100472,10 +100472,10 @@ function wB(s, e, t) { if (o) return o; } -function iZe(s) { - if (rE(s) && (s = s.substr(1)), s.length > 0) - for (let e = zb.length - 1; e >= 0; e--) { - const t = zb[e]; +function _2e(s) { + if (wv(s) && (s = s.substr(1)), s.length > 0) + for (let e = _Z.length - 1; e >= 0; e--) { + const t = _Z[e]; if (!t.firstline) continue; const i = s.match(t.firstline); @@ -100483,15 +100483,15 @@ function iZe(s) { return t; } } -const iL = Object.prototype.hasOwnProperty, CB = "vs.editor.nullLanguage"; -class nZe { +const pX = Object.prototype.hasOwnProperty, U3 = "vs.editor.nullLanguage"; +class Q2e { constructor() { this._languageIdToLanguage = [], this._languageToLanguageId = /* @__PURE__ */ new Map(), this._register( - CB, + U3, 0 /* LanguageId.Null */ ), this._register( - ms, + gs, 1 /* LanguageId.PlainText */ ), this._nextLanguageId = 2; @@ -100509,21 +100509,21 @@ class nZe { return this._languageToLanguageId.get(e) || 0; } decodeLanguageId(e) { - return this._languageIdToLanguage[e] || CB; + return this._languageIdToLanguage[e] || U3; } } -const Zw = class Zw extends R { +const Hy = class Hy extends J { constructor(e = !0, t = !1) { - super(), this._onDidChange = this._register(new k()), this.onDidChange = this._onDidChange.event, Zw.instanceCount++, this._warnOnOverwrite = t, this.languageIdCodec = new nZe(), this._dynamicLanguages = [], this._languages = {}, this._mimeTypesMap = {}, this._nameMap = {}, this._lowercaseNameMap = {}, e && (this._initializeFromRegistry(), this._register(cb.onDidChangeLanguages((i) => { + super(), this._onDidChange = this._register(new k()), this.onDidChange = this._onDidChange.event, Hy.instanceCount++, this._warnOnOverwrite = t, this.languageIdCodec = new Q2e(), this._dynamicLanguages = [], this._languages = {}, this._mimeTypesMap = {}, this._nameMap = {}, this._lowercaseNameMap = {}, e && (this._initializeFromRegistry(), this._register(pZ.onDidChangeLanguages((i) => { this._initializeFromRegistry(); }))); } dispose() { - Zw.instanceCount--, super.dispose(); + Hy.instanceCount--, super.dispose(); } _initializeFromRegistry() { - this._languages = {}, this._mimeTypesMap = {}, this._nameMap = {}, this._lowercaseNameMap = {}, $Me(); - const e = [].concat(cb.getLanguages()).concat(this._dynamicLanguages); + this._languages = {}, this._mimeTypesMap = {}, this._nameMap = {}, this._lowercaseNameMap = {}, U2e(); + const e = [].concat(pZ.getLanguages()).concat(this._dynamicLanguages); this._registerLanguages(e); } _registerLanguages(e) { @@ -100536,12 +100536,12 @@ const Zw = class Zw extends R { }), i.mimetypes.forEach((n) => { this._mimeTypesMap[n] = i.identifier; }); - }), Di.as($r.Configuration).registerOverrideIdentifiers(this.getRegisteredLanguageIds()), this._onDidChange.fire(); + }), ki.as(ir.Configuration).registerOverrideIdentifiers(this.getRegisteredLanguageIds()), this._onDidChange.fire(); } _registerLanguage(e) { const t = e.id; let i; - iL.call(this._languages, t) ? i = this._languages[t] : (this.languageIdCodec.register(t), i = { + pX.call(this._languages, t) ? i = this._languages[t] : (this.languageIdCodec.register(t), i = { identifier: t, name: null, mimetypes: [], @@ -100557,65 +100557,65 @@ const Zw = class Zw extends R { let n = null; if (Array.isArray(t.mimetypes) && t.mimetypes.length > 0 && (e.mimetypes.push(...t.mimetypes), n = t.mimetypes[0]), n || (n = `text/x-${i}`, e.mimetypes.push(n)), Array.isArray(t.extensions)) { t.configuration ? e.extensions = t.extensions.concat(e.extensions) : e.extensions = e.extensions.concat(t.extensions); - for (const l of t.extensions) - tL({ id: i, mime: n, extension: l }, this._warnOnOverwrite); + for (const r of t.extensions) + bX({ id: i, mime: n, extension: r }, this._warnOnOverwrite); } if (Array.isArray(t.filenames)) - for (const l of t.filenames) - tL({ id: i, mime: n, filename: l }, this._warnOnOverwrite), e.filenames.push(l); + for (const r of t.filenames) + bX({ id: i, mime: n, filename: r }, this._warnOnOverwrite), e.filenames.push(r); if (Array.isArray(t.filenamePatterns)) - for (const l of t.filenamePatterns) - tL({ id: i, mime: n, filepattern: l }, this._warnOnOverwrite); + for (const r of t.filenamePatterns) + bX({ id: i, mime: n, filepattern: r }, this._warnOnOverwrite); if (typeof t.firstLine == "string" && t.firstLine.length > 0) { - let l = t.firstLine; - l.charAt(0) !== "^" && (l = "^" + l); + let r = t.firstLine; + r.charAt(0) !== "^" && (r = "^" + r); try { - const a = new RegExp(l); - iq(a) || tL({ id: i, mime: n, firstline: a }, this._warnOnOverwrite); - } catch (a) { - console.warn(`[${t.id}]: Invalid regular expression \`${l}\`: `, a); + const c = new RegExp(r); + _q(c) || bX({ id: i, mime: n, firstline: c }, this._warnOnOverwrite); + } catch (c) { + console.warn(`[${t.id}]: Invalid regular expression \`${r}\`: `, c); } } e.aliases.push(i); let o = null; if (typeof t.aliases < "u" && Array.isArray(t.aliases) && (t.aliases.length === 0 ? o = [null] : o = t.aliases), o !== null) - for (const l of o) - !l || l.length === 0 || e.aliases.push(l); - const r = o !== null && o.length > 0; - if (!(r && o[0] === null)) { - const l = (r ? o[0] : null) || i; - (r || !e.name) && (e.name = l); + for (const r of o) + !r || r.length === 0 || e.aliases.push(r); + const l = o !== null && o.length > 0; + if (!(l && o[0] === null)) { + const r = (l ? o[0] : null) || i; + (l || !e.name) && (e.name = r); } t.configuration && e.configurationFiles.push(t.configuration), t.icon && e.icons.push(t.icon); } isRegisteredLanguageId(e) { - return e ? iL.call(this._languages, e) : !1; + return e ? pX.call(this._languages, e) : !1; } getRegisteredLanguageIds() { return Object.keys(this._languages); } getLanguageIdByLanguageName(e) { const t = e.toLowerCase(); - return iL.call(this._lowercaseNameMap, t) ? this._lowercaseNameMap[t] : null; + return pX.call(this._lowercaseNameMap, t) ? this._lowercaseNameMap[t] : null; } getLanguageIdByMimeType(e) { - return e && iL.call(this._mimeTypesMap, e) ? this._mimeTypesMap[e] : null; + return e && pX.call(this._mimeTypesMap, e) ? this._mimeTypesMap[e] : null; } guessLanguageIdByFilepathOrFirstLine(e, t) { - return !e && !t ? [] : eZe(e, t); + return !e && !t ? [] : P2e(e, t); } }; -Zw.instanceCount = 0; -let WG = Zw; -const _w = class _w extends R { +Hy.instanceCount = 0; +let jY = Hy; +const Ey = class Ey extends J { constructor(e = !1) { super(), this._onDidRequestBasicLanguageFeatures = this._register(new k()), this.onDidRequestBasicLanguageFeatures = this._onDidRequestBasicLanguageFeatures.event, this._onDidRequestRichLanguageFeatures = this._register(new k()), this.onDidRequestRichLanguageFeatures = this._onDidRequestRichLanguageFeatures.event, this._onDidChange = this._register(new k({ leakWarningThreshold: 200 /* https://github.com/microsoft/vscode/issues/119968 */ - })), this.onDidChange = this._onDidChange.event, this._requestedBasicLanguages = /* @__PURE__ */ new Set(), this._requestedRichLanguages = /* @__PURE__ */ new Set(), _w.instanceCount++, this._registry = this._register(new WG(!0, e)), this.languageIdCodec = this._registry.languageIdCodec, this._register(this._registry.onDidChange(() => this._onDidChange.fire())); + })), this.onDidChange = this._onDidChange.event, this._requestedBasicLanguages = /* @__PURE__ */ new Set(), this._requestedRichLanguages = /* @__PURE__ */ new Set(), Ey.instanceCount++, this._registry = this._register(new jY(!0, e)), this.languageIdCodec = this._registry.languageIdCodec, this._register(this._registry.onDidChange(() => this._onDidChange.fire())); } dispose() { - _w.instanceCount--, super.dispose(); + Ey.instanceCount--, super.dispose(); } isRegisteredLanguageId(e) { return this._registry.isRegisteredLanguageId(e); @@ -100628,53 +100628,53 @@ const _w = class _w extends R { } guessLanguageIdByFilepathOrFirstLine(e, t) { const i = this._registry.guessLanguageIdByFilepathOrFirstLine(e, t); - return SE(i, null); + return Pv(i, null); } createById(e) { - return new SB(this.onDidChange, () => this._createAndGetLanguageIdentifier(e)); + return new P3(this.onDidChange, () => this._createAndGetLanguageIdentifier(e)); } createByFilepathOrFirstLine(e, t) { - return new SB(this.onDidChange, () => { + return new P3(this.onDidChange, () => { const i = this.guessLanguageIdByFilepathOrFirstLine(e, t); return this._createAndGetLanguageIdentifier(i); }); } _createAndGetLanguageIdentifier(e) { - return (!e || !this.isRegisteredLanguageId(e)) && (e = ms), e; + return (!e || !this.isRegisteredLanguageId(e)) && (e = gs), e; } requestBasicLanguageFeatures(e) { this._requestedBasicLanguages.has(e) || (this._requestedBasicLanguages.add(e), this._onDidRequestBasicLanguageFeatures.fire(e)); } requestRichLanguageFeatures(e) { - this._requestedRichLanguages.has(e) || (this._requestedRichLanguages.add(e), this.requestBasicLanguageFeatures(e), Wi.getOrCreate(e), this._onDidRequestRichLanguageFeatures.fire(e)); + this._requestedRichLanguages.has(e) || (this._requestedRichLanguages.add(e), this.requestBasicLanguageFeatures(e), Ti.getOrCreate(e), this._onDidRequestRichLanguageFeatures.fire(e)); } }; -_w.instanceCount = 0; -let vG = _w; -class SB { +Ey.instanceCount = 0; +let qY = Ey; +class P3 { constructor(e, t) { - this._value = St(this, e, () => t()), this.onDidChange = se.fromObservable(this._value); + this._value = Gt(this, e, () => t()), this.onDidChange = se.fromObservable(this._value); } get languageId() { return this._value.get(); } } -const TG = /\(&([^\s&])\)|(^|[^&])&([^\s&])/, i2 = /(&)?(&)([^\s&])/g; -var vM; +const $Y = /\(&([^\s&])\)|(^|[^&])&([^\s&])/, fN = /(&)?(&)([^\s&])/g; +var PI; (function(s) { s[s.Right = 0] = "Right", s[s.Left = 1] = "Left"; -})(vM || (vM = {})); -var DG; +})(PI || (PI = {})); +var ek; (function(s) { s[s.Above = 0] = "Above", s[s.Below = 1] = "Below"; -})(DG || (DG = {})); -class zf extends Yo { +})(ek || (ek = {})); +class _g extends Ao { constructor(e, t, i, n) { e.classList.add("monaco-menu-container"), e.setAttribute("role", "presentation"); const o = document.createElement("div"); o.classList.add("monaco-menu"), o.setAttribute("role", "presentation"), super(o, { orientation: 1, - actionViewItemProvider: (c) => this.doGetActionViewItem(c, i, r), + actionViewItemProvider: (d) => this.doGetActionViewItem(d, i, l), context: i.context, actionRunner: i.actionRunner, ariaLabel: i.ariaLabel, @@ -100684,64 +100684,64 @@ class zf extends Yo { 10 /* KeyCode.Space */ ] : []], keyDown: !0 } - }), this.menuStyles = n, this.menuElement = o, this.actionsList.tabIndex = 0, this.initializeOrUpdateStyleSheet(e, n), this._register(Rn.addTarget(o)), this._register(z(o, ie.KEY_DOWN, (c) => { - new Vt(c).equals( + }), this.menuStyles = n, this.menuElement = o, this.actionsList.tabIndex = 0, this.initializeOrUpdateStyleSheet(e, n), this._register(En.addTarget(o)), this._register(z(o, ie.KEY_DOWN, (d) => { + new Yt(d).equals( 2 /* KeyCode.Tab */ - ) && c.preventDefault(); - })), i.enableMnemonics && this._register(z(o, ie.KEY_DOWN, (c) => { - const d = c.key.toLocaleLowerCase(); - if (this.mnemonics.has(d)) { - tt.stop(c, !0); - const h = this.mnemonics.get(d); - if (h.length === 1 && (h[0] instanceof LB && h[0].container && this.focusItemByElement(h[0].container), h[0].onClick(c)), h.length > 1) { + ) && d.preventDefault(); + })), i.enableMnemonics && this._register(z(o, ie.KEY_DOWN, (d) => { + const a = d.key.toLocaleLowerCase(); + if (this.mnemonics.has(a)) { + tt.stop(d, !0); + const h = this.mnemonics.get(a); + if (h.length === 1 && (h[0] instanceof B3 && h[0].container && this.focusItemByElement(h[0].container), h[0].onClick(d)), h.length > 1) { const u = h.shift(); - u && u.container && (this.focusItemByElement(u.container), h.push(u)), this.mnemonics.set(d, h); + u && u.container && (this.focusItemByElement(u.container), h.push(u)), this.mnemonics.set(a, h); } } - })), fs && this._register(z(o, ie.KEY_DOWN, (c) => { - const d = new Vt(c); - d.equals( + })), fs && this._register(z(o, ie.KEY_DOWN, (d) => { + const a = new Yt(d); + a.equals( 14 /* KeyCode.Home */ - ) || d.equals( + ) || a.equals( 11 /* KeyCode.PageUp */ - ) ? (this.focusedItem = this.viewItems.length - 1, this.focusNext(), tt.stop(c, !0)) : (d.equals( + ) ? (this.focusedItem = this.viewItems.length - 1, this.focusNext(), tt.stop(d, !0)) : (a.equals( 13 /* KeyCode.End */ - ) || d.equals( + ) || a.equals( 12 /* KeyCode.PageDown */ - )) && (this.focusedItem = 0, this.focusPrevious(), tt.stop(c, !0)); - })), this._register(z(this.domNode, ie.MOUSE_OUT, (c) => { - const d = c.relatedTarget; - Ji(d, this.domNode) || (this.focusedItem = void 0, this.updateFocus(), c.stopPropagation()); - })), this._register(z(this.actionsList, ie.MOUSE_OVER, (c) => { - let d = c.target; - if (!(!d || !Ji(d, this.actionsList) || d === this.actionsList)) { - for (; d.parentElement !== this.actionsList && d.parentElement !== null; ) - d = d.parentElement; - if (d.classList.contains("action-item")) { + )) && (this.focusedItem = 0, this.focusPrevious(), tt.stop(d, !0)); + })), this._register(z(this.domNode, ie.MOUSE_OUT, (d) => { + const a = d.relatedTarget; + _i(a, this.domNode) || (this.focusedItem = void 0, this.updateFocus(), d.stopPropagation()); + })), this._register(z(this.actionsList, ie.MOUSE_OVER, (d) => { + let a = d.target; + if (!(!a || !_i(a, this.actionsList) || a === this.actionsList)) { + for (; a.parentElement !== this.actionsList && a.parentElement !== null; ) + a = a.parentElement; + if (a.classList.contains("action-item")) { const h = this.focusedItem; - this.setFocusedItem(d), h !== this.focusedItem && this.updateFocus(); + this.setFocusedItem(a), h !== this.focusedItem && this.updateFocus(); } } - })), this._register(Rn.addTarget(this.actionsList)), this._register(z(this.actionsList, Rt.Tap, (c) => { - let d = c.initialTarget; - if (!(!d || !Ji(d, this.actionsList) || d === this.actionsList)) { - for (; d.parentElement !== this.actionsList && d.parentElement !== null; ) - d = d.parentElement; - if (d.classList.contains("action-item")) { + })), this._register(En.addTarget(this.actionsList)), this._register(z(this.actionsList, Jt.Tap, (d) => { + let a = d.initialTarget; + if (!(!a || !_i(a, this.actionsList) || a === this.actionsList)) { + for (; a.parentElement !== this.actionsList && a.parentElement !== null; ) + a = a.parentElement; + if (a.classList.contains("action-item")) { const h = this.focusedItem; - this.setFocusedItem(d), h !== this.focusedItem && this.updateFocus(); + this.setFocusedItem(a), h !== this.focusedItem && this.updateFocus(); } } })); - const r = { + const l = { parent: this }; - this.mnemonics = /* @__PURE__ */ new Map(), this.scrollableElement = this._register(new CC(o, { + this.mnemonics = /* @__PURE__ */ new Map(), this.scrollableElement = this._register(new MG(o, { alwaysConsumeMouseWheel: !0, horizontal: 2, vertical: 3, @@ -100749,28 +100749,28 @@ class zf extends Yo { handleMouseWheel: !0, useShadows: !0 })); - const l = this.scrollableElement.getDomNode(); - l.style.position = "", this.styleScrollElement(l, n), this._register(z(o, Rt.Change, (c) => { - tt.stop(c, !0); - const d = this.scrollableElement.getScrollPosition().scrollTop; - this.scrollableElement.setScrollPosition({ scrollTop: d - c.translationY }); - })), this._register(z(l, ie.MOUSE_UP, (c) => { - c.preventDefault(); + const r = this.scrollableElement.getDomNode(); + r.style.position = "", this.styleScrollElement(r, n), this._register(z(o, Jt.Change, (d) => { + tt.stop(d, !0); + const a = this.scrollableElement.getScrollPosition().scrollTop; + this.scrollableElement.setScrollPosition({ scrollTop: a - d.translationY }); + })), this._register(z(r, ie.MOUSE_UP, (d) => { + d.preventDefault(); })); - const a = xe(e); - o.style.maxHeight = `${Math.max(10, a.innerHeight - e.getBoundingClientRect().top - 35)}px`, t = t.filter((c, d) => { + const c = Le(e); + o.style.maxHeight = `${Math.max(10, c.innerHeight - e.getBoundingClientRect().top - 35)}px`, t = t.filter((d, a) => { var h; - return (h = i.submenuIds) != null && h.has(c.id) ? (console.warn(`Found submenu cycle: ${c.id}`), !1) : !(c instanceof Qi && (d === t.length - 1 || d === 0 || t[d - 1] instanceof Qi)); - }), this.push(t, { icon: !0, label: !0, isMenu: !0 }), e.appendChild(this.scrollableElement.getDomNode()), this.scrollableElement.scanDomNode(), this.viewItems.filter((c) => !(c instanceof AB)).forEach((c, d, h) => { - c.updatePositionInSet(d + 1, h.length); + return (h = i.submenuIds) != null && h.has(d.id) ? (console.warn(`Found submenu cycle: ${d.id}`), !1) : !(d instanceof ji && (a === t.length - 1 || a === 0 || t[a - 1] instanceof ji)); + }), this.push(t, { icon: !0, label: !0, isMenu: !0 }), e.appendChild(this.scrollableElement.getDomNode()), this.scrollableElement.scanDomNode(), this.viewItems.filter((d) => !(d instanceof _3)).forEach((d, a, h) => { + d.updatePositionInSet(a + 1, h.length); }); } initializeOrUpdateStyleSheet(e, t) { - this.styleSheet || (cA(e) ? this.styleSheet = Bo(e) : (zf.globalStyleSheet || (zf.globalStyleSheet = Bo()), this.styleSheet = zf.globalStyleSheet)), this.styleSheet.textContent = oZe(t, cA(e)); + this.styleSheet || (LV(e) ? this.styleSheet = Po(e) : (_g.globalStyleSheet || (_g.globalStyleSheet = Po()), this.styleSheet = _g.globalStyleSheet)), this.styleSheet.textContent = j2e(t, LV(e)); } styleScrollElement(e, t) { - const i = t.foregroundColor ?? "", n = t.backgroundColor ?? "", o = t.borderColor ? `1px solid ${t.borderColor}` : "", r = "5px", l = t.shadowColor ? `0 2px 8px ${t.shadowColor}` : ""; - e.style.outline = o, e.style.borderRadius = r, e.style.color = i, e.style.backgroundColor = n, e.style.boxShadow = l; + const i = t.foregroundColor ?? "", n = t.backgroundColor ?? "", o = t.borderColor ? `1px solid ${t.borderColor}` : "", l = "5px", r = t.shadowColor ? `0 2px 8px ${t.shadowColor}` : ""; + e.style.outline = o, e.style.borderRadius = l, e.style.color = i, e.style.backgroundColor = n, e.style.boxShadow = r; } getContainer() { return this.scrollableElement.getDomNode(); @@ -100797,52 +100797,52 @@ class zf extends Yo { }); } doGetActionViewItem(e, t, i) { - if (e instanceof Qi) - return new AB(t.context, e, { icon: !0 }, this.menuStyles); - if (e instanceof ab) { - const n = new LB(e, e.actions, i, { ...t, submenuIds: /* @__PURE__ */ new Set([...t.submenuIds || [], e.id]) }, this.menuStyles); + if (e instanceof ji) + return new _3(t.context, e, { icon: !0 }, this.menuStyles); + if (e instanceof bZ) { + const n = new B3(e, e.actions, i, { ...t, submenuIds: /* @__PURE__ */ new Set([...t.submenuIds || [], e.id]) }, this.menuStyles); if (t.enableMnemonics) { const o = n.getMnemonic(); if (o && n.isEnabled()) { - let r = []; - this.mnemonics.has(o) && (r = this.mnemonics.get(o)), r.push(n), this.mnemonics.set(o, r); + let l = []; + this.mnemonics.has(o) && (l = this.mnemonics.get(o)), l.push(n), this.mnemonics.set(o, l); } } return n; } else { const n = { enableMnemonics: t.enableMnemonics, useEventAsContext: t.useEventAsContext }; if (t.getKeyBinding) { - const r = t.getKeyBinding(e); - if (r) { - const l = r.getLabel(); - l && (n.keybinding = l); + const l = t.getKeyBinding(e); + if (l) { + const r = l.getLabel(); + r && (n.keybinding = r); } } - const o = new B7(t.context, e, n, this.menuStyles); + const o = new S8(t.context, e, n, this.menuStyles); if (t.enableMnemonics) { - const r = o.getMnemonic(); - if (r && o.isEnabled()) { - let l = []; - this.mnemonics.has(r) && (l = this.mnemonics.get(r)), l.push(o), this.mnemonics.set(r, l); + const l = o.getMnemonic(); + if (l && o.isEnabled()) { + let r = []; + this.mnemonics.has(l) && (r = this.mnemonics.get(l)), r.push(o), this.mnemonics.set(l, r); } } return o; } } } -class B7 extends yl { +class S8 extends Xr { constructor(e, t, i, n) { if (i.isMenu = !0, super(t, t, i), this.menuStyle = n, this.options = i, this.options.icon = i.icon !== void 0 ? i.icon : !1, this.options.label = i.label !== void 0 ? i.label : !0, this.cssClass = "", this.options.label && i.enableMnemonics) { const o = this.action.label; if (o) { - const r = TG.exec(o); - r && (this.mnemonic = (r[1] ? r[1] : r[3]).toLocaleLowerCase()); + const l = $Y.exec(o); + l && (this.mnemonic = (l[1] ? l[1] : l[3]).toLocaleLowerCase()); } } - this.runOnceToEnableMouseUp = new Zt(() => { + this.runOnceToEnableMouseUp = new St(() => { this.element && (this._register(z(this.element, ie.MOUSE_UP, (o) => { - if (tt.stop(o, !0), pr) { - if (new Er(xe(this.element), o).rightButton) + if (tt.stop(o, !0), fl) { + if (new Fl(Le(this.element), o).rightButton) return; this.onClick(o); } else @@ -100855,7 +100855,7 @@ class B7 extends yl { }, 100), this._register(this.runOnceToEnableMouseUp); } render(e) { - super.render(e), this.element && (this.container = e, this.item = Q(this.element, ce("a.action-menu-item")), this._action.id === Qi.ID ? this.item.setAttribute("role", "presentation") : (this.item.setAttribute("role", "menuitem"), this.mnemonic && this.item.setAttribute("aria-keyshortcuts", `${this.mnemonic}`)), this.check = Q(this.item, ce("span.menu-item-check" + Ze.asCSSSelector(te.menuSelection))), this.check.setAttribute("role", "none"), this.label = Q(this.item, ce("span.action-label")), this.options.label && this.options.keybinding && (Q(this.item, ce("span.keybinding")).textContent = this.options.keybinding), this.runOnceToEnableMouseUp.schedule(), this.updateClass(), this.updateLabel(), this.updateTooltip(), this.updateEnabled(), this.updateChecked(), this.applyStyle()); + super.render(e), this.element && (this.container = e, this.item = O(this.element, de("a.action-menu-item")), this._action.id === ji.ID ? this.item.setAttribute("role", "presentation") : (this.item.setAttribute("role", "menuitem"), this.mnemonic && this.item.setAttribute("aria-keyshortcuts", `${this.mnemonic}`)), this.check = O(this.item, de("span.menu-item-check" + Se.asCSSSelector(te.menuSelection))), this.check.setAttribute("role", "none"), this.label = O(this.item, de("span.action-label")), this.options.label && this.options.keybinding && (O(this.item, de("span.keybinding")).textContent = this.options.keybinding), this.runOnceToEnableMouseUp.schedule(), this.updateClass(), this.updateLabel(), this.updateTooltip(), this.updateEnabled(), this.updateChecked(), this.applyStyle()); } blur() { super.blur(), this.applyStyle(); @@ -100870,19 +100870,19 @@ class B7 extends yl { updateLabel() { var e; if (this.label && this.options.label) { - gn(this.label); - let t = EK(this.action.label); + bn(this.label); + let t = WO(this.action.label); if (t) { - const i = sZe(t); + const i = O2e(t); this.options.enableMnemonics || (t = i), this.label.setAttribute("aria-label", i.replace(/&&/g, "&")); - const n = TG.exec(t); + const n = $Y.exec(t); if (n) { - t = _y(t), i2.lastIndex = 0; - let o = i2.exec(t); + t = Hf(t), fN.lastIndex = 0; + let o = fN.exec(t); for (; o && o[1]; ) - o = i2.exec(t); - const r = (l) => l.replace(/&&/g, "&"); - o ? this.label.append(I_(r(t.substr(0, o.index)), " "), ce("u", { "aria-hidden": "true" }, o[3]), eq(r(t.substr(o.index + o[0].length)), " ")) : this.label.innerText = r(t).trim(), (e = this.item) == null || e.setAttribute("aria-keyshortcuts", (n[1] ? n[1] : n[3]).toLocaleLowerCase()); + o = fN.exec(t); + const l = (r) => r.replace(/&&/g, "&"); + o ? this.label.append(AS(l(t.substr(0, o.index)), " "), de("u", { "aria-hidden": "true" }, o[3]), Pq(l(t.substr(o.index + o[0].length)), " ")) : this.label.innerText = l(t).trim(), (e = this.item) == null || e.setAttribute("aria-keyshortcuts", (n[1] ? n[1] : n[3]).toLocaleLowerCase()); } else this.label.innerText = t.replace(/&&/g, "&").trim(); } @@ -100910,17 +100910,17 @@ class B7 extends yl { this.item && (this.item.style.color = t ?? "", this.item.style.backgroundColor = i ?? "", this.item.style.outline = n, this.item.style.outlineOffset = o), this.check && (this.check.style.color = t ?? ""); } } -class LB extends B7 { +class B3 extends S8 { constructor(e, t, i, n, o) { - super(e, e, n, o), this.submenuActions = t, this.parentData = i, this.submenuOptions = n, this.mysubmenu = null, this.submenuDisposables = this._register(new U()), this.mouseOver = !1, this.expandDirection = n && n.expandDirection !== void 0 ? n.expandDirection : { horizontal: vM.Right, vertical: DG.Below }, this.showScheduler = new Zt(() => { + super(e, e, n, o), this.submenuActions = t, this.parentData = i, this.submenuOptions = n, this.mysubmenu = null, this.submenuDisposables = this._register(new _()), this.mouseOver = !1, this.expandDirection = n && n.expandDirection !== void 0 ? n.expandDirection : { horizontal: PI.Right, vertical: ek.Below }, this.showScheduler = new St(() => { this.mouseOver && (this.cleanupExistingSubmenu(!1), this.createSubmenu(!1)); - }, 250), this.hideScheduler = new Zt(() => { - this.element && !Ji(_n(), this.element) && this.parentData.submenu === this.mysubmenu && (this.parentData.parent.focus(!1), this.cleanupExistingSubmenu(!0)); + }, 250), this.hideScheduler = new St(() => { + this.element && !_i(Cn(), this.element) && this.parentData.submenu === this.mysubmenu && (this.parentData.parent.focus(!1), this.cleanupExistingSubmenu(!0)); }, 750); } render(e) { - super.render(e), this.element && (this.item && (this.item.classList.add("monaco-submenu-item"), this.item.tabIndex = 0, this.item.setAttribute("aria-haspopup", "true"), this.updateAriaExpanded("false"), this.submenuIndicator = Q(this.item, ce("span.submenu-indicator" + Ze.asCSSSelector(te.menuSubmenu))), this.submenuIndicator.setAttribute("aria-hidden", "true")), this._register(z(this.element, ie.KEY_UP, (t) => { - const i = new Vt(t); + super.render(e), this.element && (this.item && (this.item.classList.add("monaco-submenu-item"), this.item.tabIndex = 0, this.item.setAttribute("aria-haspopup", "true"), this.updateAriaExpanded("false"), this.submenuIndicator = O(this.item, de("span.submenu-indicator" + Se.asCSSSelector(te.menuSubmenu))), this.submenuIndicator.setAttribute("aria-hidden", "true")), this._register(z(this.element, ie.KEY_UP, (t) => { + const i = new Yt(t); (i.equals( 17 /* KeyCode.RightArrow */ @@ -100929,8 +100929,8 @@ class LB extends B7 { /* KeyCode.Enter */ )) && (tt.stop(t, !0), this.createSubmenu(!0)); })), this._register(z(this.element, ie.KEY_DOWN, (t) => { - const i = new Vt(t); - _n() === this.item && (i.equals( + const i = new Yt(t); + Cn() === this.item && (i.equals( 17 /* KeyCode.RightArrow */ ) || i.equals( @@ -100942,7 +100942,7 @@ class LB extends B7 { })), this._register(z(this.element, ie.MOUSE_LEAVE, (t) => { this.mouseOver = !1; })), this._register(z(this.element, ie.FOCUS_OUT, (t) => { - this.element && !Ji(_n(), this.element) && this.hideScheduler.schedule(); + this.element && !_i(Cn(), this.element) && this.hideScheduler.schedule(); })), this._register(this.parentData.parent.onScroll(() => { this.parentData.submenu === this.mysubmenu && (this.parentData.parent.focus(!1), this.cleanupExistingSubmenu(!0)); }))); @@ -100963,32 +100963,32 @@ class LB extends B7 { } calculateSubmenuMenuLayout(e, t, i, n) { const o = { top: 0, left: 0 }; - return o.left = qp(e.width, t.width, { position: n.horizontal === vM.Right ? 0 : 1, offset: i.left, size: i.width }), o.left >= i.left && o.left < i.left + i.width && (i.left + 10 + t.width <= e.width && (o.left = i.left + 10), i.top += 10, i.height = 0), o.top = qp(e.height, t.height, { position: 0, offset: i.top, size: 0 }), o.top + t.height === i.top && o.top + i.height + t.height <= e.height && (o.top += i.height), o; + return o.left = sg(e.width, t.width, { position: n.horizontal === PI.Right ? 0 : 1, offset: i.left, size: i.width }), o.left >= i.left && o.left < i.left + i.width && (i.left + 10 + t.width <= e.width && (o.left = i.left + 10), i.top += 10, i.height = 0), o.top = sg(e.height, t.height, { position: 0, offset: i.top, size: 0 }), o.top + t.height === i.top && o.top + i.height + t.height <= e.height && (o.top += i.height), o; } createSubmenu(e = !0) { if (this.element) if (this.parentData.submenu) this.parentData.submenu.focus(!1); else { - this.updateAriaExpanded("true"), this.submenuContainer = Q(this.element, ce("div.monaco-submenu")), this.submenuContainer.classList.add("menubar-menu-items-holder", "context-view"); - const t = xe(this.parentData.parent.domNode).getComputedStyle(this.parentData.parent.domNode), i = parseFloat(t.paddingTop || "0") || 0; - this.submenuContainer.style.zIndex = "1", this.submenuContainer.style.position = "fixed", this.submenuContainer.style.top = "0", this.submenuContainer.style.left = "0", this.parentData.submenu = new zf(this.submenuContainer, this.submenuActions.length ? this.submenuActions : [new k2()], this.submenuOptions, this.menuStyle); + this.updateAriaExpanded("true"), this.submenuContainer = O(this.element, de("div.monaco-submenu")), this.submenuContainer.classList.add("menubar-menu-items-holder", "context-view"); + const t = Le(this.parentData.parent.domNode).getComputedStyle(this.parentData.parent.domNode), i = parseFloat(t.paddingTop || "0") || 0; + this.submenuContainer.style.zIndex = "1", this.submenuContainer.style.position = "fixed", this.submenuContainer.style.top = "0", this.submenuContainer.style.left = "0", this.parentData.submenu = new _g(this.submenuContainer, this.submenuActions.length ? this.submenuActions : [new iw()], this.submenuOptions, this.menuStyle); const n = this.element.getBoundingClientRect(), o = { top: n.top - i, left: n.left, height: n.height + 2 * i, width: n.width - }, r = this.submenuContainer.getBoundingClientRect(), l = xe(this.element), { top: a, left: c } = this.calculateSubmenuMenuLayout(new Lt(l.innerWidth, l.innerHeight), Lt.lift(r), o, this.expandDirection); - this.submenuContainer.style.left = `${c - r.left}px`, this.submenuContainer.style.top = `${a - r.top}px`, this.submenuDisposables.add(z(this.submenuContainer, ie.KEY_UP, (d) => { - new Vt(d).equals( + }, l = this.submenuContainer.getBoundingClientRect(), r = Le(this.element), { top: c, left: d } = this.calculateSubmenuMenuLayout(new Xt(r.innerWidth, r.innerHeight), Xt.lift(l), o, this.expandDirection); + this.submenuContainer.style.left = `${d - l.left}px`, this.submenuContainer.style.top = `${c - l.top}px`, this.submenuDisposables.add(z(this.submenuContainer, ie.KEY_UP, (a) => { + new Yt(a).equals( 15 /* KeyCode.LeftArrow */ - ) && (tt.stop(d, !0), this.parentData.parent.focus(), this.cleanupExistingSubmenu(!0)); - })), this.submenuDisposables.add(z(this.submenuContainer, ie.KEY_DOWN, (d) => { - new Vt(d).equals( + ) && (tt.stop(a, !0), this.parentData.parent.focus(), this.cleanupExistingSubmenu(!0)); + })), this.submenuDisposables.add(z(this.submenuContainer, ie.KEY_DOWN, (a) => { + new Yt(a).equals( 15 /* KeyCode.LeftArrow */ - ) && tt.stop(d, !0); + ) && tt.stop(a, !0); })), this.submenuDisposables.add(this.parentData.submenu.onDidCancel(() => { this.parentData.parent.focus(), this.cleanupExistingSubmenu(!0); })), this.parentData.submenu.focus(e), this.mysubmenu = this.parentData.submenu; @@ -101007,7 +101007,7 @@ class LB extends B7 { super.dispose(), this.hideScheduler.dispose(), this.mysubmenu && (this.mysubmenu.dispose(), this.mysubmenu = null), this.submenuContainer && (this.submenuContainer = void 0); } } -class AB extends Sb { +class _3 extends xZ { constructor(e, t, i, n) { super(e, t, i), this.menuStyles = n; } @@ -101015,18 +101015,18 @@ class AB extends Sb { super.render(e), this.label && (this.label.style.borderBottomColor = this.menuStyles.separatorColor ? `${this.menuStyles.separatorColor}` : ""); } } -function sZe(s) { - const e = TG, t = e.exec(s); +function O2e(s) { + const e = $Y, t = e.exec(s); if (!t) return s; const i = !t[1]; return s.replace(e, i ? "$2$3" : "").trim(); } -function xB(s) { - const e = dJ()[s.id]; +function Q3(s) { + const e = PB()[s.id]; return `.codicon-${s.id}:before { content: '\\${e.toString(16)}'; }`; } -function oZe(s, e) { +function j2e(s, e) { let t = ( /* css */ ` @@ -101036,8 +101036,8 @@ function oZe(s, e) { min-width: 160px; } -${xB(te.menuSelection)} -${xB(te.menuSubmenu)} +${Q3(te.menuSelection)} +${Q3(te.menuSubmenu)} .monaco-menu .monaco-action-bar { text-align: right; @@ -101400,16 +101400,16 @@ ${xB(te.menuSubmenu)} background: ${o}; } `); - const r = s.scrollbarSliderActiveBackground; - r && (t += ` + const l = s.scrollbarSliderActiveBackground; + l && (t += ` .monaco-scrollable-element > .scrollbar > .slider.active { - background: ${r}; + background: ${l}; } `); } return t; } -class rZe { +class q2e { constructor(e, t, i, n) { this.contextViewService = e, this.telemetryService = t, this.notificationService = i, this.keybindingService = n, this.focusToReturn = null, this.lastContainer = null, this.block = null, this.blockDisposable = null, this.options = { blockMouse: !0 }; } @@ -101420,48 +101420,48 @@ class rZe { const t = e.getActions(); if (!t.length) return; - this.focusToReturn = _n(); + this.focusToReturn = Cn(); let i; - const n = Ki(e.domForShadowRoot) ? e.domForShadowRoot : void 0; + const n = Oi(e.domForShadowRoot) ? e.domForShadowRoot : void 0; this.contextViewService.showContextView({ getAnchor: () => e.getAnchor(), canRelayout: !1, anchorAlignment: e.anchorAlignment, anchorAxisAlignment: e.anchorAxisAlignment, render: (o) => { - var d; + var a; this.lastContainer = o; - const r = e.getMenuClassName ? e.getMenuClassName() : ""; - r && (o.className += " " + r), this.options.blockMouse && (this.block = o.appendChild(ce(".context-view-block")), this.block.style.position = "fixed", this.block.style.cursor = "initial", this.block.style.left = "0", this.block.style.top = "0", this.block.style.width = "100%", this.block.style.height = "100%", this.block.style.zIndex = "-1", (d = this.blockDisposable) == null || d.dispose(), this.blockDisposable = z(this.block, ie.MOUSE_DOWN, (h) => h.stopPropagation())); - const l = new U(), a = e.actionRunner || new um(); - a.onWillRun((h) => this.onActionRun(h, !e.skipTelemetry), this, l), a.onDidRun(this.onDidActionRun, this, l), i = new zf(o, t, { + const l = e.getMenuClassName ? e.getMenuClassName() : ""; + l && (o.className += " " + l), this.options.blockMouse && (this.block = o.appendChild(de(".context-view-block")), this.block.style.position = "fixed", this.block.style.cursor = "initial", this.block.style.left = "0", this.block.style.top = "0", this.block.style.width = "100%", this.block.style.height = "100%", this.block.style.zIndex = "-1", (a = this.blockDisposable) == null || a.dispose(), this.blockDisposable = z(this.block, ie.MOUSE_DOWN, (h) => h.stopPropagation())); + const r = new _(), c = e.actionRunner || new Zb(); + c.onWillRun((h) => this.onActionRun(h, !e.skipTelemetry), this, r), c.onDidRun(this.onDidActionRun, this, r), i = new _g(o, t, { actionViewItemProvider: e.getActionViewItem, context: e.getActionsContext ? e.getActionsContext() : null, - actionRunner: a, + actionRunner: c, getKeyBinding: e.getKeyBinding ? e.getKeyBinding : (h) => this.keybindingService.lookupKeybinding(h.id) - }, Fge), i.onDidCancel(() => this.contextViewService.hideContextView(!0), null, l), i.onDidBlur(() => this.contextViewService.hideContextView(!0), null, l); - const c = xe(o); - return l.add(z(c, ie.BLUR, () => this.contextViewService.hideContextView(!0))), l.add(z(c, ie.MOUSE_DOWN, (h) => { + }, Tbe), i.onDidCancel(() => this.contextViewService.hideContextView(!0), null, r), i.onDidBlur(() => this.contextViewService.hideContextView(!0), null, r); + const d = Le(o); + return r.add(z(d, ie.BLUR, () => this.contextViewService.hideContextView(!0))), r.add(z(d, ie.MOUSE_DOWN, (h) => { if (h.defaultPrevented) return; - const u = new Er(c, h); - let g = u.target; + const u = new Fl(d, h); + let m = u.target; if (!u.rightButton) { - for (; g; ) { - if (g === o) + for (; m; ) { + if (m === o) return; - g = g.parentElement; + m = m.parentElement; } this.contextViewService.hideContextView(!0); } - })), Yr(l, i); + })), Kl(r, i); }, focus: () => { i == null || i.focus(!!e.autoSelectFirstItem); }, onHide: (o) => { - var r, l, a; - (r = e.onHide) == null || r.call(e, !!o), this.block && (this.block.remove(), this.block = null), (l = this.blockDisposable) == null || l.dispose(), this.blockDisposable = null, this.lastContainer && (_n() === this.lastContainer || Ji(_n(), this.lastContainer)) && ((a = this.focusToReturn) == null || a.focus()), this.lastContainer = null; + var l, r, c; + (l = e.onHide) == null || l.call(e, !!o), this.block && (this.block.remove(), this.block = null), (r = this.blockDisposable) == null || r.dispose(), this.blockDisposable = null, this.lastContainer && (Cn() === this.lastContainer || _i(Cn(), this.lastContainer)) && ((c = this.focusToReturn) == null || c.focus()), this.lastContainer = null; } }, n, !!n); } @@ -101469,49 +101469,49 @@ class rZe { t && this.telemetryService.publicLog2("workbenchActionExecuted", { id: e.action.id, from: "contextMenu" }), this.contextViewService.hideContextView(!1); } onDidActionRun(e) { - e.error && !jr(e.error) && this.notificationService.error(e.error); + e.error && !er(e.error) && this.notificationService.error(e.error); } } -var lZe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var $2e = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; }, Sp = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let VG = class extends R { +let tk = class extends J { get contextMenuHandler() { - return this._contextMenuHandler || (this._contextMenuHandler = new rZe(this.contextViewService, this.telemetryService, this.notificationService, this.keybindingService)), this._contextMenuHandler; + return this._contextMenuHandler || (this._contextMenuHandler = new q2e(this.contextViewService, this.telemetryService, this.notificationService, this.keybindingService)), this._contextMenuHandler; } - constructor(e, t, i, n, o, r) { - super(), this.telemetryService = e, this.notificationService = t, this.contextViewService = i, this.keybindingService = n, this.menuService = o, this.contextKeyService = r, this._contextMenuHandler = void 0, this._onDidShowContextMenu = this._store.add(new k()), this.onDidShowContextMenu = this._onDidShowContextMenu.event, this._onDidHideContextMenu = this._store.add(new k()); + constructor(e, t, i, n, o, l) { + super(), this.telemetryService = e, this.notificationService = t, this.contextViewService = i, this.keybindingService = n, this.menuService = o, this.contextKeyService = l, this._contextMenuHandler = void 0, this._onDidShowContextMenu = this._store.add(new k()), this.onDidShowContextMenu = this._onDidShowContextMenu.event, this._onDidHideContextMenu = this._store.add(new k()); } configure(e) { this.contextMenuHandler.configure(e); } // ContextMenu showContextMenu(e) { - e = kG.transform(e, this.menuService, this.contextKeyService), this.contextMenuHandler.showContextMenu({ + e = ik.transform(e, this.menuService, this.contextKeyService), this.contextMenuHandler.showContextMenu({ ...e, onHide: (t) => { var i; (i = e.onHide) == null || i.call(e, t), this._onDidHideContextMenu.fire(); } - }), Ac.getInstance().resetKeyStatus(), this._onDidShowContextMenu.fire(); + }), xd.getInstance().resetKeyStatus(), this._onDidShowContextMenu.fire(); } }; -VG = lZe([ +tk = $2e([ Sp(0, Ls), - Sp(1, Vi), - Sp(2, rd), - Sp(3, xt), - Sp(4, Uo), - Sp(5, _e) -], VG); -var kG; + Sp(1, vi), + Sp(2, aa), + Sp(3, Lt), + Sp(4, Oo), + Sp(5, xe) +], tk); +var ik; (function(s) { function e(i) { return i && i.menuId instanceof pe; @@ -101519,92 +101519,92 @@ var kG; function t(i, n, o) { if (!e(i)) return i; - const { menuId: r, menuActionOptions: l, contextKeyService: a } = i; + const { menuId: l, menuActionOptions: r, contextKeyService: c } = i; return { ...i, getActions: () => { - const c = []; - if (r) { - const d = n.getMenuActions(r, a ?? o, l); - Yge(d, c); + const d = []; + if (l) { + const a = n.getMenuActions(l, c ?? o, r); + Mbe(a, d); } - return i.getActions ? Qi.join(i.getActions(), c) : c; + return i.getActions ? ji.join(i.getActions(), d) : d; } }; } s.transform = t; -})(kG || (kG = {})); -var TM; +})(ik || (ik = {})); +var BI; (function(s) { s[s.API = 0] = "API", s[s.USER = 1] = "USER"; -})(TM || (TM = {})); -var p9 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +})(BI || (BI = {})); +var DE = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, DM = function(s, e) { +}, _I = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let GG = class { +let nk = class { constructor(e) { this._commandService = e; } async open(e, t) { - if (!N_(e, Ge.command)) + if (!KS(e, ve.command)) return !1; - if (!(t != null && t.allowCommands) || (typeof e == "string" && (e = Le.parse(e)), Array.isArray(t.allowCommands) && !t.allowCommands.includes(e.path))) + if (!(t != null && t.allowCommands) || (typeof e == "string" && (e = Xe.parse(e)), Array.isArray(t.allowCommands) && !t.allowCommands.includes(e.path))) return !0; let i = []; try { - i = jv(decodeURIComponent(e.query)); + i = fT(decodeURIComponent(e.query)); } catch { try { - i = jv(e.query); + i = fT(e.query); } catch { } } return Array.isArray(i) || (i = [i]), await this._commandService.executeCommand(e.path, ...i), !0; } }; -GG = p9([ - DM(0, Qt) -], GG); -let RG = class { +nk = DE([ + _I(0, Ot) +], nk); +let sk = class { constructor(e) { this._editorService = e; } async open(e, t) { - typeof e == "string" && (e = Le.parse(e)); - const { selection: i, uri: n } = Jme(e); - return e = n, e.scheme === Ge.file && (e = qle(e)), await this._editorService.openCodeEditor({ + typeof e == "string" && (e = Xe.parse(e)); + const { selection: i, uri: n } = Epe(e); + return e = n, e.scheme === ve.file && (e = Kce(e)), await this._editorService.openCodeEditor({ resource: e, options: { selection: i, - source: t != null && t.fromUserGesture ? TM.USER : TM.API, + source: t != null && t.fromUserGesture ? BI.USER : BI.API, ...t == null ? void 0 : t.editorOptions } }, this._editorService.getFocusedCodeEditor(), t == null ? void 0 : t.openToSide), !0; } }; -RG = p9([ - DM(0, ft) -], RG); -let EG = class { +sk = DE([ + _I(0, gt) +], sk); +let ok = class { constructor(e, t) { - this._openers = new cs(), this._validators = new cs(), this._resolvers = new cs(), this._resolvedUriTargets = new sn((i) => i.with({ path: null, fragment: null, query: null }).toString()), this._externalOpeners = new cs(), this._defaultExternalOpener = { - openExternal: async (i) => (I2(i, Ge.http, Ge.https) ? aJ(i) : vt.location.href = i, !0) + this._openers = new hs(), this._validators = new hs(), this._resolvers = new hs(), this._resolvedUriTargets = new on((i) => i.with({ path: null, fragment: null, query: null }).toString()), this._externalOpeners = new hs(), this._defaultExternalOpener = { + openExternal: async (i) => (QN(i, ve.http, ve.https) ? KB(i) : wt.location.href = i, !0) }, this._openers.push({ - open: async (i, n) => n != null && n.openExternal || I2(i, Ge.mailto, Ge.http, Ge.https, Ge.vsls) ? (await this._doOpenExternal(i, n), !0) : !1 - }), this._openers.push(new GG(t)), this._openers.push(new RG(e)); + open: async (i, n) => n != null && n.openExternal || QN(i, ve.mailto, ve.http, ve.https, ve.vsls) ? (await this._doOpenExternal(i, n), !0) : !1 + }), this._openers.push(new nk(t)), this._openers.push(new sk(e)); } registerOpener(e) { return { dispose: this._openers.unshift(e) }; } async open(e, t) { - const i = typeof e == "string" ? Le.parse(e) : e, n = this._resolvedUriTargets.get(i) ?? e; + const i = typeof e == "string" ? Xe.parse(e) : e, n = this._resolvedUriTargets.get(i) ?? e; for (const o of this._validators) if (!await o.shouldOpen(n, t)) return !1; @@ -101624,7 +101624,7 @@ let EG = class { throw new Error("Could not resolve external URI: " + e.toString()); } async _doOpenExternal(e, t) { - const i = typeof e == "string" ? Le.parse(e) : e; + const i = typeof e == "string" ? Xe.parse(e) : e; let n; try { n = (await this.resolveExternalUri(i, t)).resolved; @@ -101633,37 +101633,37 @@ let EG = class { } let o; if (typeof e == "string" && i.toString() === n.toString() ? o = e : o = encodeURI(n.toString(!0)), t != null && t.allowContributedOpeners) { - const r = typeof (t == null ? void 0 : t.allowContributedOpeners) == "string" ? t == null ? void 0 : t.allowContributedOpeners : void 0; - for (const l of this._externalOpeners) - if (await l.openExternal(o, { + const l = typeof (t == null ? void 0 : t.allowContributedOpeners) == "string" ? t == null ? void 0 : t.allowContributedOpeners : void 0; + for (const r of this._externalOpeners) + if (await r.openExternal(o, { sourceUri: i, - preferredOpenerId: r - }, Ye.None)) + preferredOpenerId: l + }, Fe.None)) return !0; } - return this._defaultExternalOpener.openExternal(o, { sourceUri: i }, Ye.None); + return this._defaultExternalOpener.openExternal(o, { sourceUri: i }, Fe.None); } dispose() { this._validators.clear(); } }; -EG = p9([ - DM(0, ft), - DM(1, Qt) -], EG); -var aZe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +ok = DE([ + _I(0, gt), + _I(1, Ot) +], ok); +var eSe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, MB = function(s, e) { +}, O3 = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let XG = class extends R { +let lk = class extends J { constructor(e, t) { - super(), this._markerService = t, this._onDidChangeMarker = this._register(new k()), this._markerDecorations = new sn(), e.getModels().forEach((i) => this._onModelAdded(i)), this._register(e.onModelAdded(this._onModelAdded, this)), this._register(e.onModelRemoved(this._onModelRemoved, this)), this._register(this._markerService.onMarkerChanged(this._handleMarkerChange, this)); + super(), this._markerService = t, this._onDidChangeMarker = this._register(new k()), this._markerDecorations = new on(), e.getModels().forEach((i) => this._onModelAdded(i)), this._register(e.onModelAdded(this._onModelAdded, this)), this._register(e.onModelRemoved(this._onModelRemoved, this)), this._register(this._markerService.onMarkerChanged(this._handleMarkerChange, this)); } dispose() { super.dispose(), this._markerDecorations.forEach((e) => e.dispose()), this._markerDecorations.clear(); @@ -101679,49 +101679,49 @@ let XG = class extends R { }); } _onModelAdded(e) { - const t = new cZe(e); + const t = new tSe(e); this._markerDecorations.set(e.uri, t), this._updateDecorations(t); } _onModelRemoved(e) { var i; const t = this._markerDecorations.get(e.uri); - t && (t.dispose(), this._markerDecorations.delete(e.uri)), (e.uri.scheme === Ge.inMemory || e.uri.scheme === Ge.internal || e.uri.scheme === Ge.vscode) && ((i = this._markerService) == null || i.read({ resource: e.uri }).map((n) => n.owner).forEach((n) => this._markerService.remove(n, [e.uri]))); + t && (t.dispose(), this._markerDecorations.delete(e.uri)), (e.uri.scheme === ve.inMemory || e.uri.scheme === ve.internal || e.uri.scheme === ve.vscode) && ((i = this._markerService) == null || i.read({ resource: e.uri }).map((n) => n.owner).forEach((n) => this._markerService.remove(n, [e.uri]))); } _updateDecorations(e) { const t = this._markerService.read({ resource: e.model.uri, take: 500 }); e.update(t) && this._onDidChangeMarker.fire(e.model); } }; -XG = aZe([ - MB(0, Pt), - MB(1, Ba) -], XG); -class cZe extends R { +lk = eSe([ + O3(0, At), + O3(1, _c) +], lk); +class tSe extends J { constructor(e) { - super(), this.model = e, this._map = new $$(), this._register(Ce(() => { + super(), this.model = e, this._map = new Uee(), this._register(We(() => { this.model.deltaDecorations([...this._map.values()], []), this._map.clear(); })); } update(e) { - const { added: t, removed: i } = Mge(new Set(this._map.keys()), new Set(e)); + const { added: t, removed: i } = Zbe(new Set(this._map.keys()), new Set(e)); if (t.length === 0 && i.length === 0) return !1; - const n = i.map((l) => this._map.get(l)), o = t.map((l) => ({ - range: this._createDecorationRange(this.model, l), - options: this._createDecorationOption(l) - })), r = this.model.deltaDecorations(n, o); - for (const l of i) - this._map.delete(l); - for (let l = 0; l < r.length; l++) - this._map.set(t[l], r[l]); + const n = i.map((r) => this._map.get(r)), o = t.map((r) => ({ + range: this._createDecorationRange(this.model, r), + options: this._createDecorationOption(r) + })), l = this.model.deltaDecorations(n, o); + for (const r of i) + this._map.delete(r); + for (let r = 0; r < l.length; r++) + this._map.set(t[r], l[r]); return !0; } getMarker(e) { return this._map.getKey(e.id); } _createDecorationRange(e, t) { - let i = M.lift(t); - if (t.severity === gi.Hint && !this._hasMarkerTag( + let i = I.lift(t); + if (t.severity === bi.Hint && !this._hasMarkerTag( t, 1 /* MarkerTag.Unnecessary */ @@ -101734,17 +101734,17 @@ class cZe extends R { if (n === 1 || i.endColumn >= n) return i; const o = e.getWordAtPosition(i.getStartPosition()); - o && (i = new M(i.startLineNumber, o.startColumn, i.endLineNumber, o.endColumn)); + o && (i = new I(i.startLineNumber, o.startColumn, i.endLineNumber, o.endColumn)); } else if (t.endColumn === Number.MAX_VALUE && t.startColumn === 1 && i.startLineNumber === i.endLineNumber) { const n = e.getLineFirstNonWhitespaceColumn(t.startLineNumber); - n < i.endColumn && (i = new M(i.startLineNumber, n, i.endLineNumber, i.endColumn), t.startColumn = n); + n < i.endColumn && (i = new I(i.startLineNumber, n, i.endLineNumber, i.endColumn), t.startColumn = n); } return i; } _createDecorationOption(e) { - let t, i, n, o, r; + let t, i, n, o, l; switch (e.severity) { - case gi.Hint: + case bi.Hint: this._hasMarkerTag( e, 2 @@ -101755,24 +101755,24 @@ class cZe extends R { /* MarkerTag.Unnecessary */ ) ? t = "squiggly-unnecessary" : t = "squiggly-hint", n = 0; break; - case gi.Info: - t = "squiggly-info", i = fi(Yoe), n = 10, r = { - color: fi(rne), + case bi.Info: + t = "squiggly-info", i = Zi(Mle), n = 10, l = { + color: Zi(qne), position: 1 /* MinimapPosition.Inline */ }; break; - case gi.Warning: - t = "squiggly-warning", i = fi(Foe), n = 20, r = { - color: fi(lne), + case bi.Warning: + t = "squiggly-warning", i = Zi(Tle), n = 20, l = { + color: Zi($ne), position: 1 /* MinimapPosition.Inline */ }; break; - case gi.Error: + case bi.Error: default: - t = "squiggly-error", i = fi(Xoe), n = 30, r = { - color: fi(ane), + t = "squiggly-error", i = Zi(wle), n = 30, l = { + color: Zi(ese), position: 1 /* MinimapPosition.Inline */ }; @@ -101791,9 +101791,9 @@ class cZe extends R { showIfCollapsed: !0, overviewRuler: { color: i, - position: ur.Right + position: pl.Right }, - minimap: r, + minimap: l, zIndex: n, inlineClassName: o }; @@ -101802,64 +101802,64 @@ class cZe extends R { return e.tags ? e.tags.indexOf(t) >= 0 : !1; } } -var dZe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var iSe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, nL = function(s, e) { +}, gX = function(s, e) { return function(t, i) { e(t, i, s); }; -}, Wp; -function wu(s) { +}, vp; +function Vu(s) { return s.toString(); } -class hZe { +class nSe { constructor(e, t, i) { - this.model = e, this._modelEventListeners = new U(), this.model = e, this._modelEventListeners.add(e.onWillDispose(() => t(e))), this._modelEventListeners.add(e.onDidChangeLanguage((n) => i(e, n))); + this.model = e, this._modelEventListeners = new _(), this.model = e, this._modelEventListeners.add(e.onWillDispose(() => t(e))), this._modelEventListeners.add(e.onDidChangeLanguage((n) => i(e, n))); } dispose() { this._modelEventListeners.dispose(); } } -const uZe = fs || qe ? 1 : 2; -class gZe { - constructor(e, t, i, n, o, r, l, a) { - this.uri = e, this.initialUndoRedoSnapshot = t, this.time = i, this.sharesUndoRedoStack = n, this.heapSize = o, this.sha1 = r, this.versionId = l, this.alternativeVersionId = a; +const sSe = fs || qe ? 1 : 2; +class oSe { + constructor(e, t, i, n, o, l, r, c) { + this.uri = e, this.initialUndoRedoSnapshot = t, this.time = i, this.sharesUndoRedoStack = n, this.heapSize = o, this.sha1 = l, this.versionId = r, this.alternativeVersionId = c; } } -var sm; -let FG = (sm = class extends R { +var db; +let rk = (db = class extends J { constructor(e, t, i, n) { super(), this._configurationService = e, this._resourcePropertiesService = t, this._undoRedoService = i, this._instantiationService = n, this._onModelAdded = this._register(new k()), this.onModelAdded = this._onModelAdded.event, this._onModelRemoved = this._register(new k()), this.onModelRemoved = this._onModelRemoved.event, this._onModelModeChanged = this._register(new k()), this.onModelLanguageChanged = this._onModelModeChanged.event, this._modelCreationOptionsByLanguageAndResource = /* @__PURE__ */ Object.create(null), this._models = {}, this._disposedModels = /* @__PURE__ */ new Map(), this._disposedModelsHeapSize = 0, this._register(this._configurationService.onDidChangeConfiguration((o) => this._updateModelOptions(o))), this._updateModelOptions(void 0); } static _readModelOptions(e, t) { var u; - let i = Dn.tabSize; + let i = Yn.tabSize; if (e.editor && typeof e.editor.tabSize < "u") { - const g = parseInt(e.editor.tabSize, 10); - isNaN(g) || (i = g), i < 1 && (i = 1); + const m = parseInt(e.editor.tabSize, 10); + isNaN(m) || (i = m), i < 1 && (i = 1); } let n = "tabSize"; if (e.editor && typeof e.editor.indentSize < "u" && e.editor.indentSize !== "tabSize") { - const g = parseInt(e.editor.indentSize, 10); - isNaN(g) || (n = Math.max(g, 1)); + const m = parseInt(e.editor.indentSize, 10); + isNaN(m) || (n = Math.max(m, 1)); } - let o = Dn.insertSpaces; + let o = Yn.insertSpaces; e.editor && typeof e.editor.insertSpaces < "u" && (o = e.editor.insertSpaces === "false" ? !1 : !!e.editor.insertSpaces); - let r = uZe; - const l = e.eol; - l === `\r -` ? r = 2 : l === ` -` && (r = 1); - let a = Dn.trimAutoWhitespace; - e.editor && typeof e.editor.trimAutoWhitespace < "u" && (a = e.editor.trimAutoWhitespace === "false" ? !1 : !!e.editor.trimAutoWhitespace); - let c = Dn.detectIndentation; - e.editor && typeof e.editor.detectIndentation < "u" && (c = e.editor.detectIndentation === "false" ? !1 : !!e.editor.detectIndentation); - let d = Dn.largeFileOptimizations; - e.editor && typeof e.editor.largeFileOptimizations < "u" && (d = e.editor.largeFileOptimizations === "false" ? !1 : !!e.editor.largeFileOptimizations); - let h = Dn.bracketPairColorizationOptions; + let l = sSe; + const r = e.eol; + r === `\r +` ? l = 2 : r === ` +` && (l = 1); + let c = Yn.trimAutoWhitespace; + e.editor && typeof e.editor.trimAutoWhitespace < "u" && (c = e.editor.trimAutoWhitespace === "false" ? !1 : !!e.editor.trimAutoWhitespace); + let d = Yn.detectIndentation; + e.editor && typeof e.editor.detectIndentation < "u" && (d = e.editor.detectIndentation === "false" ? !1 : !!e.editor.detectIndentation); + let a = Yn.largeFileOptimizations; + e.editor && typeof e.editor.largeFileOptimizations < "u" && (a = e.editor.largeFileOptimizations === "false" ? !1 : !!e.editor.largeFileOptimizations); + let h = Yn.bracketPairColorizationOptions; return (u = e.editor) != null && u.bracketPairColorization && typeof e.editor.bracketPairColorization == "object" && (h = { enabled: !!e.editor.bracketPairColorization.enabled, independentColorPoolPerBracketType: !!e.editor.bracketPairColorization.independentColorPoolPerBracketType @@ -101868,10 +101868,10 @@ let FG = (sm = class extends R { tabSize: i, indentSize: n, insertSpaces: o, - detectIndentation: c, - defaultEOL: r, - trimAutoWhitespace: a, - largeFileOptimizations: d, + detectIndentation: d, + defaultEOL: l, + trimAutoWhitespace: c, + largeFileOptimizations: a, bracketPairColorizationOptions: h }; } @@ -101879,7 +101879,7 @@ let FG = (sm = class extends R { if (e) return this._resourcePropertiesService.getEOL(e, t); const i = this._configurationService.getValue("files.eol", { overrideIdentifier: t }); - return i && typeof i == "string" && i !== "auto" ? i : ro === 3 || ro === 2 ? ` + return i && typeof i == "string" && i !== "auto" ? i : co === 3 || co === 2 ? ` ` : `\r `; } @@ -101891,8 +101891,8 @@ let FG = (sm = class extends R { const n = typeof e == "string" ? e : e.languageId; let o = this._modelCreationOptionsByLanguageAndResource[n + t]; if (!o) { - const r = this._configurationService.getValue("editor", { overrideIdentifier: n, resource: t }), l = this._getEOL(t, n); - o = Wp._readModelOptions({ editor: r, eol: l }, i), this._modelCreationOptionsByLanguageAndResource[n + t] = o; + const l = this._configurationService.getValue("editor", { overrideIdentifier: n, resource: t }), r = this._getEOL(t, n); + o = vp._readModelOptions({ editor: l, eol: r }, i), this._modelCreationOptionsByLanguageAndResource[n + t] = o; } return o; } @@ -101901,18 +101901,18 @@ let FG = (sm = class extends R { this._modelCreationOptionsByLanguageAndResource = /* @__PURE__ */ Object.create(null); const i = Object.keys(this._models); for (let n = 0, o = i.length; n < o; n++) { - const r = i[n], l = this._models[r], a = l.model.getLanguageId(), c = l.model.uri; - if (e && !e.affectsConfiguration("editor", { overrideIdentifier: a, resource: c }) && !e.affectsConfiguration("files.eol", { overrideIdentifier: a, resource: c })) + const l = i[n], r = this._models[l], c = r.model.getLanguageId(), d = r.model.uri; + if (e && !e.affectsConfiguration("editor", { overrideIdentifier: c, resource: d }) && !e.affectsConfiguration("files.eol", { overrideIdentifier: c, resource: d })) continue; - const d = t[a + c], h = this.getCreationOptions(a, c, l.model.isForSimpleWidget); - Wp._setModelOptionsForModel(l.model, h, d); + const a = t[c + d], h = this.getCreationOptions(c, d, r.model.isForSimpleWidget); + vp._setModelOptionsForModel(r.model, h, a); } } static _setModelOptionsForModel(e, t, i) { i && i.defaultEOL !== t.defaultEOL && e.getLineCount() === 1 && e.setEOL( t.defaultEOL === 1 ? 0 : 1 /* EndOfLineSequence.CRLF */ - ), !(i && i.detectIndentation === t.detectIndentation && i.insertSpaces === t.insertSpaces && i.tabSize === t.tabSize && i.indentSize === t.indentSize && i.trimAutoWhitespace === t.trimAutoWhitespace && co(i.bracketPairColorizationOptions, t.bracketPairColorizationOptions)) && (t.detectIndentation ? (e.detectIndentation(t.insertSpaces, t.tabSize), e.updateOptions({ + ), !(i && i.detectIndentation === t.detectIndentation && i.insertSpaces === t.insertSpaces && i.tabSize === t.tabSize && i.indentSize === t.indentSize && i.trimAutoWhitespace === t.trimAutoWhitespace && uo(i.bracketPairColorizationOptions, t.bracketPairColorizationOptions)) && (t.detectIndentation ? (e.detectIndentation(t.insertSpaces, t.tabSize), e.updateOptions({ trimAutoWhitespace: t.trimAutoWhitespace, bracketColorizationOptions: t.bracketPairColorizationOptions })) : e.updateOptions({ @@ -101925,11 +101925,11 @@ let FG = (sm = class extends R { } // --- begin IModelService _insertDisposedModel(e) { - this._disposedModels.set(wu(e.uri), e), this._disposedModelsHeapSize += e.heapSize; + this._disposedModels.set(Vu(e.uri), e), this._disposedModelsHeapSize += e.heapSize; } _removeDisposedModel(e) { - const t = this._disposedModels.get(wu(e)); - return t && (this._disposedModelsHeapSize -= t.heapSize), this._disposedModels.delete(wu(e)), t; + const t = this._disposedModels.get(Vu(e)); + return t && (this._disposedModelsHeapSize -= t.heapSize), this._disposedModels.delete(Vu(e)), t; } _ensureDisposedModelsHeapSize(e) { if (this._disposedModelsHeapSize > e) { @@ -101943,27 +101943,27 @@ let FG = (sm = class extends R { } } _createModelData(e, t, i, n) { - const o = this.getCreationOptions(t, i, n), r = this._instantiationService.createInstance(Al, e, t, o, i); - if (i && this._disposedModels.has(wu(i))) { - const c = this._removeDisposedModel(i), d = this._undoRedoService.getElements(i), h = this._getSHA1Computer(), u = h.canComputeSHA1(r) ? h.computeSHA1(r) === c.sha1 : !1; - if (u || c.sharesUndoRedoStack) { - for (const g of d.past) - pc(g) && g.matchesResource(i) && g.setModel(r); - for (const g of d.future) - pc(g) && g.matchesResource(i) && g.setModel(r); - this._undoRedoService.setElementsValidFlag(i, !0, (g) => pc(g) && g.matchesResource(i)), u && (r._overwriteVersionId(c.versionId), r._overwriteAlternativeVersionId(c.alternativeVersionId), r._overwriteInitialUndoRedoSnapshot(c.initialUndoRedoSnapshot)); + const o = this.getCreationOptions(t, i, n), l = this._instantiationService.createInstance(xr, e, t, o, i); + if (i && this._disposedModels.has(Vu(i))) { + const d = this._removeDisposedModel(i), a = this._undoRedoService.getElements(i), h = this._getSHA1Computer(), u = h.canComputeSHA1(l) ? h.computeSHA1(l) === d.sha1 : !1; + if (u || d.sharesUndoRedoStack) { + for (const m of a.past) + yd(m) && m.matchesResource(i) && m.setModel(l); + for (const m of a.future) + yd(m) && m.matchesResource(i) && m.setModel(l); + this._undoRedoService.setElementsValidFlag(i, !0, (m) => yd(m) && m.matchesResource(i)), u && (l._overwriteVersionId(d.versionId), l._overwriteAlternativeVersionId(d.alternativeVersionId), l._overwriteInitialUndoRedoSnapshot(d.initialUndoRedoSnapshot)); } else - c.initialUndoRedoSnapshot !== null && this._undoRedoService.restoreSnapshot(c.initialUndoRedoSnapshot); + d.initialUndoRedoSnapshot !== null && this._undoRedoService.restoreSnapshot(d.initialUndoRedoSnapshot); } - const l = wu(r.uri); - if (this._models[l]) + const r = Vu(l.uri); + if (this._models[r]) throw new Error("ModelService: Cannot add model because it already exists!"); - const a = new hZe(r, (c) => this._onWillDispose(c), (c, d) => this._onDidChangeLanguage(c, d)); - return this._models[l] = a, a; + const c = new nSe(l, (d) => this._onWillDispose(d), (d, a) => this._onDidChangeLanguage(d, a)); + return this._models[r] = c, c; } createModel(e, t, i, n = !1) { let o; - return t ? o = this._createModelData(e, t, i, n) : o = this._createModelData(e, ms, i, n), this._onModelAdded.fire(o.model), o.model; + return t ? o = this._createModelData(e, t, i, n) : o = this._createModelData(e, gs, i, n), this._onModelAdded.fire(o.model), o.model; } getModels() { const e = [], t = Object.keys(this._models); @@ -101974,137 +101974,137 @@ let FG = (sm = class extends R { return e; } getModel(e) { - const t = wu(e), i = this._models[t]; + const t = Vu(e), i = this._models[t]; return i ? i.model : null; } // --- end IModelService _schemaShouldMaintainUndoRedoElements(e) { - return e.scheme === Ge.file || e.scheme === Ge.vscodeRemote || e.scheme === Ge.vscodeUserData || e.scheme === Ge.vscodeNotebookCell || e.scheme === "fake-fs"; + return e.scheme === ve.file || e.scheme === ve.vscodeRemote || e.scheme === ve.vscodeUserData || e.scheme === ve.vscodeNotebookCell || e.scheme === "fake-fs"; } _onWillDispose(e) { - const t = wu(e.uri), i = this._models[t], n = this._undoRedoService.getUriComparisonKey(e.uri) !== e.uri.toString(); - let o = !1, r = 0; + const t = Vu(e.uri), i = this._models[t], n = this._undoRedoService.getUriComparisonKey(e.uri) !== e.uri.toString(); + let o = !1, l = 0; if (n || this._shouldRestoreUndoStack() && this._schemaShouldMaintainUndoRedoElements(e.uri)) { - const c = this._undoRedoService.getElements(e.uri); - if (c.past.length > 0 || c.future.length > 0) { - for (const d of c.past) - pc(d) && d.matchesResource(e.uri) && (o = !0, r += d.heapSize(e.uri), d.setModel(e.uri)); - for (const d of c.future) - pc(d) && d.matchesResource(e.uri) && (o = !0, r += d.heapSize(e.uri), d.setModel(e.uri)); + const d = this._undoRedoService.getElements(e.uri); + if (d.past.length > 0 || d.future.length > 0) { + for (const a of d.past) + yd(a) && a.matchesResource(e.uri) && (o = !0, l += a.heapSize(e.uri), a.setModel(e.uri)); + for (const a of d.future) + yd(a) && a.matchesResource(e.uri) && (o = !0, l += a.heapSize(e.uri), a.setModel(e.uri)); } } - const l = Wp.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK, a = this._getSHA1Computer(); + const r = vp.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK, c = this._getSHA1Computer(); if (o) - if (!n && (r > l || !a.canComputeSHA1(e))) { - const c = i.model.getInitialUndoRedoSnapshot(); - c !== null && this._undoRedoService.restoreSnapshot(c); + if (!n && (l > r || !c.canComputeSHA1(e))) { + const d = i.model.getInitialUndoRedoSnapshot(); + d !== null && this._undoRedoService.restoreSnapshot(d); } else - this._ensureDisposedModelsHeapSize(l - r), this._undoRedoService.setElementsValidFlag(e.uri, !1, (c) => pc(c) && c.matchesResource(e.uri)), this._insertDisposedModel(new gZe(e.uri, i.model.getInitialUndoRedoSnapshot(), Date.now(), n, r, a.computeSHA1(e), e.getVersionId(), e.getAlternativeVersionId())); + this._ensureDisposedModelsHeapSize(r - l), this._undoRedoService.setElementsValidFlag(e.uri, !1, (d) => yd(d) && d.matchesResource(e.uri)), this._insertDisposedModel(new oSe(e.uri, i.model.getInitialUndoRedoSnapshot(), Date.now(), n, l, c.computeSHA1(e), e.getVersionId(), e.getAlternativeVersionId())); else if (!n) { - const c = i.model.getInitialUndoRedoSnapshot(); - c !== null && this._undoRedoService.restoreSnapshot(c); + const d = i.model.getInitialUndoRedoSnapshot(); + d !== null && this._undoRedoService.restoreSnapshot(d); } delete this._models[t], i.dispose(), delete this._modelCreationOptionsByLanguageAndResource[e.getLanguageId() + e.uri], this._onModelRemoved.fire(e); } _onDidChangeLanguage(e, t) { - const i = t.oldLanguage, n = e.getLanguageId(), o = this.getCreationOptions(i, e.uri, e.isForSimpleWidget), r = this.getCreationOptions(n, e.uri, e.isForSimpleWidget); - Wp._setModelOptionsForModel(e, r, o), this._onModelModeChanged.fire({ model: e, oldLanguageId: i }); + const i = t.oldLanguage, n = e.getLanguageId(), o = this.getCreationOptions(i, e.uri, e.isForSimpleWidget), l = this.getCreationOptions(n, e.uri, e.isForSimpleWidget); + vp._setModelOptionsForModel(e, l, o), this._onModelModeChanged.fire({ model: e, oldLanguageId: i }); } _getSHA1Computer() { - return new YG(); - } -}, Wp = sm, sm.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK = 20 * 1024 * 1024, sm); -FG = Wp = dZe([ - nL(0, Ke), - nL(1, i7), - nL(2, gX), - nL(3, Se) -], FG); -const p_ = class p_ { + return new ck(); + } +}, vp = db, db.MAX_MEMORY_FOR_CLOSED_FILES_UNDO_STACK = 20 * 1024 * 1024, db); +rk = vp = iSe([ + gX(0, Qe), + gX(1, H7), + gX(2, HJ), + gX(3, Ge) +], rk); +const NS = class NS { // takes 200ms to compute a sha1 on a 10MB model on a new machine canComputeSHA1(e) { - return e.getValueLength() <= p_.MAX_MODEL_SIZE; + return e.getValueLength() <= NS.MAX_MODEL_SIZE; } computeSHA1(e) { - const t = new v2(), i = e.createSnapshot(); + const t = new qN(), i = e.createSnapshot(); let n; for (; n = i.read(); ) t.update(n); return t.digest(); } }; -p_.MAX_MODEL_SIZE = 10 * 1024 * 1024; -let YG = p_; -var zG; +NS.MAX_MODEL_SIZE = 10 * 1024 * 1024; +let ck = NS; +var dk; (function(s) { s[s.PRESERVE = 0] = "PRESERVE", s[s.LAST = 1] = "LAST"; -})(zG || (zG = {})); -const O7 = { +})(dk || (dk = {})); +const x8 = { Quickaccess: "workbench.contributions.quickaccess" }; -class mZe { +class lSe { constructor() { this.providers = [], this.defaultProvider = void 0; } registerQuickAccessProvider(e) { - return e.prefix.length === 0 ? this.defaultProvider = e : this.providers.push(e), this.providers.sort((t, i) => i.prefix.length - t.prefix.length), Ce(() => { + return e.prefix.length === 0 ? this.defaultProvider = e : this.providers.push(e), this.providers.sort((t, i) => i.prefix.length - t.prefix.length), We(() => { this.providers.splice(this.providers.indexOf(e), 1), this.defaultProvider === e && (this.defaultProvider = void 0); }); } getQuickAccessProviders() { - return Or([this.defaultProvider, ...this.providers]); + return _l([this.defaultProvider, ...this.providers]); } getQuickAccessProvider(e) { return e && this.providers.find((i) => e.startsWith(i.prefix)) || void 0 || this.defaultProvider; } } -Di.add(O7.Quickaccess, new mZe()); -var pZe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +ki.add(x8.Quickaccess, new lSe()); +var rSe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, ZB = function(s, e) { +}, j3 = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let PG = class extends R { +let ak = class extends J { constructor(e, t) { - super(), this.quickInputService = e, this.instantiationService = t, this.registry = Di.as(O7.Quickaccess), this.mapProviderToDescriptor = /* @__PURE__ */ new Map(), this.lastAcceptedPickerValues = /* @__PURE__ */ new Map(), this.visibleQuickAccess = void 0; + super(), this.quickInputService = e, this.instantiationService = t, this.registry = ki.as(x8.Quickaccess), this.mapProviderToDescriptor = /* @__PURE__ */ new Map(), this.lastAcceptedPickerValues = /* @__PURE__ */ new Map(), this.visibleQuickAccess = void 0; } show(e = "", t) { this.doShowOrPick(e, !1, t); } doShowOrPick(e, t, i) { - var m, f; - const [n, o] = this.getOrInstantiateProvider(e, i == null ? void 0 : i.enabledProviderPrefixes), r = this.visibleQuickAccess, l = r == null ? void 0 : r.descriptor; - if (r && o && l === o) { - e !== o.prefix && !(i != null && i.preserveValue) && (r.picker.value = e), this.adjustValueSelection(r.picker, o, i); + var b, g; + const [n, o] = this.getOrInstantiateProvider(e, i == null ? void 0 : i.enabledProviderPrefixes), l = this.visibleQuickAccess, r = l == null ? void 0 : l.descriptor; + if (l && o && r === o) { + e !== o.prefix && !(i != null && i.preserveValue) && (l.picker.value = e), this.adjustValueSelection(l.picker, o, i); return; } if (o && !(i != null && i.preserveValue)) { - let b; - if (r && l && l !== o) { - const y = r.value.substr(l.prefix.length); - y && (b = `${o.prefix}${y}`); + let Z; + if (l && r && r !== o) { + const f = l.value.substr(r.prefix.length); + f && (Z = `${o.prefix}${f}`); } - if (!b) { - const y = n == null ? void 0 : n.defaultFilterValue; - y === zG.LAST ? b = this.lastAcceptedPickerValues.get(o) : typeof y == "string" && (b = `${o.prefix}${y}`); + if (!Z) { + const f = n == null ? void 0 : n.defaultFilterValue; + f === dk.LAST ? Z = this.lastAcceptedPickerValues.get(o) : typeof f == "string" && (Z = `${o.prefix}${f}`); } - typeof b == "string" && (e = b); + typeof Z == "string" && (e = Z); } - const a = (m = r == null ? void 0 : r.picker) == null ? void 0 : m.valueSelection, c = (f = r == null ? void 0 : r.picker) == null ? void 0 : f.value, d = new U(), h = d.add(this.quickInputService.createQuickPick({ useSeparators: !0 })); - h.value = e, this.adjustValueSelection(h, o, i), h.placeholder = (i == null ? void 0 : i.placeholder) ?? (o == null ? void 0 : o.placeholder), h.quickNavigate = i == null ? void 0 : i.quickNavigateConfiguration, h.hideInput = !!h.quickNavigate && !r, (typeof (i == null ? void 0 : i.itemActivation) == "number" || i != null && i.quickNavigateConfiguration) && (h.itemActivation = (i == null ? void 0 : i.itemActivation) ?? da.SECOND), h.contextKey = o == null ? void 0 : o.contextKey, h.filterValue = (b) => b.substring(o ? o.prefix.length : 0); + const c = (b = l == null ? void 0 : l.picker) == null ? void 0 : b.valueSelection, d = (g = l == null ? void 0 : l.picker) == null ? void 0 : g.value, a = new _(), h = a.add(this.quickInputService.createQuickPick({ useSeparators: !0 })); + h.value = e, this.adjustValueSelection(h, o, i), h.placeholder = (i == null ? void 0 : i.placeholder) ?? (o == null ? void 0 : o.placeholder), h.quickNavigate = i == null ? void 0 : i.quickNavigateConfiguration, h.hideInput = !!h.quickNavigate && !l, (typeof (i == null ? void 0 : i.itemActivation) == "number" || i != null && i.quickNavigateConfiguration) && (h.itemActivation = (i == null ? void 0 : i.itemActivation) ?? bc.SECOND), h.contextKey = o == null ? void 0 : o.contextKey, h.filterValue = (Z) => Z.substring(o ? o.prefix.length : 0); let u; - t && (u = new dC(), d.add(se.once(h.onWillAccept)((b) => { - b.veto(), h.hide(); - }))), d.add(this.registerPickerListeners(h, n, o, e, i)); - const g = d.add(new mi()); - if (n && d.add(n.provide(h, g.token, i == null ? void 0 : i.providerOptions)), se.once(h.onDidHide)(() => { - h.selectedItems.length === 0 && g.cancel(), d.dispose(), u == null || u.complete(h.selectedItems.slice(0)); - }), h.show(), a && c === e && (h.valueSelection = a), t) + t && (u = new VG(), a.add(se.once(h.onWillAccept)((Z) => { + Z.veto(), h.hide(); + }))), a.add(this.registerPickerListeners(h, n, o, e, i)); + const m = a.add(new pi()); + if (n && a.add(n.provide(h, m.token, i == null ? void 0 : i.providerOptions)), se.once(h.onDidHide)(() => { + h.selectedItems.length === 0 && m.cancel(), a.dispose(), u == null || u.complete(h.selectedItems.slice(0)); + }), h.show(), c && d === e && (h.valueSelection = c), t) return u == null ? void 0 : u.p; } adjustValueSelection(e, t, i) { @@ -102112,21 +102112,21 @@ let PG = class extends R { i != null && i.preserveValue ? n = [e.value.length, e.value.length] : n = [(t == null ? void 0 : t.prefix.length) ?? 0, e.value.length], e.valueSelection = n; } registerPickerListeners(e, t, i, n, o) { - const r = new U(), l = this.visibleQuickAccess = { picker: e, descriptor: i, value: n }; - return r.add(Ce(() => { - l === this.visibleQuickAccess && (this.visibleQuickAccess = void 0); - })), r.add(e.onDidChangeValue((a) => { - const [c] = this.getOrInstantiateProvider(a, o == null ? void 0 : o.enabledProviderPrefixes); - c !== t ? this.show(a, { + const l = new _(), r = this.visibleQuickAccess = { picker: e, descriptor: i, value: n }; + return l.add(We(() => { + r === this.visibleQuickAccess && (this.visibleQuickAccess = void 0); + })), l.add(e.onDidChangeValue((c) => { + const [d] = this.getOrInstantiateProvider(c, o == null ? void 0 : o.enabledProviderPrefixes); + d !== t ? this.show(c, { enabledProviderPrefixes: o == null ? void 0 : o.enabledProviderPrefixes, // do not rewrite value from user typing! preserveValue: !0, // persist the value of the providerOptions from the original showing providerOptions: o == null ? void 0 : o.providerOptions - }) : l.value = a; - })), i && r.add(e.onDidAccept(() => { + }) : r.value = c; + })), i && l.add(e.onDidAccept(() => { this.lastAcceptedPickerValues.set(i, e.value); - })), r; + })), l; } getOrInstantiateProvider(e, t) { const i = this.registry.getQuickAccessProvider(e); @@ -102136,17 +102136,17 @@ let PG = class extends R { return n || (n = this.instantiationService.createInstance(i.ctor), this.mapProviderToDescriptor.set(i, n)), [n, i]; } }; -PG = pZe([ - ZB(0, ld), - ZB(1, Se) -], PG); -var fZe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +ak = rSe([ + j3(0, ha), + j3(1, Ge) +], ak); +var cSe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; }; -class H7 { +class C8 { constructor(e) { this.nodes = e; } @@ -102154,30 +102154,30 @@ class H7 { return this.nodes.map((e) => typeof e == "string" ? e : e.label).join(""); } } -fZe([ - Zi -], H7.prototype, "toString", null); -const bZe = /\[([^\]]+)\]\(((?:https?:\/\/|command:|file:)[^\)\s]+)(?: (["'])(.+?)(\3))?\)/gi; -function yZe(s) { +cSe([ + xi +], C8.prototype, "toString", null); +const dSe = /\[([^\]]+)\]\(((?:https?:\/\/|command:|file:)[^\)\s]+)(?: (["'])(.+?)(\3))?\)/gi; +function aSe(s) { const e = []; let t = 0, i; - for (; i = bZe.exec(s); ) { + for (; i = dSe.exec(s); ) { i.index - t > 0 && e.push(s.substring(t, i.index)); - const [, n, o, , r] = i; - r ? e.push({ label: n, href: o, title: r }) : e.push({ label: n, href: o }), t = i.index + i[0].length; + const [, n, o, , l] = i; + l ? e.push({ label: n, href: o, title: l }) : e.push({ label: n, href: o }), t = i.index + i[0].length; } - return t < s.length && e.push(s.substring(t)), new H7(e); + return t < s.length && e.push(s.substring(t)), new C8(e); } -const n2 = {}, wZe = new NX("quick-input-button-icon-"); -function CZe(s) { +const yN = {}, hSe = new eH("quick-input-button-icon-"); +function uSe(s) { if (!s) return; let e; const t = s.dark.toString(); - return n2[t] ? e = n2[t] : (e = wZe.nextId(), dA(`.${e}, .hc-light .${e}`, `background-image: ${Pc(s.light || s.dark)}`), dA(`.vs-dark .${e}, .hc-black .${e}`, `background-image: ${Pc(s.dark)}`), n2[t] = e), e; + return yN[t] ? e = yN[t] : (e = hSe.nextId(), IV(`.${e}, .hc-light .${e}`, `background-image: ${Bd(s.light || s.dark)}`), IV(`.vs-dark .${e}, .hc-black .${e}`, `background-image: ${Bd(s.dark)}`), yN[t] = e), e; } -function rw(s, e, t) { - let i = s.iconClass || CZe(s.iconPath); +function Zy(s, e, t) { + let i = s.iconClass || uSe(s.iconPath); return s.alwaysVisible && (i = i ? `${i} always-visible` : "always-visible"), { id: e, label: "", @@ -102187,51 +102187,51 @@ function rw(s, e, t) { run: t }; } -function SZe(s, e, t) { - In(e); - const i = yZe(s); +function mSe(s, e, t) { + Rn(e); + const i = aSe(s); let n = 0; for (const o of i.nodes) if (typeof o == "string") - e.append(...ih(o)); + e.append(...lh(o)); else { - let r = o.title; - !r && o.href.startsWith("command:") ? r = p("executeCommand", "Click to execute command '{0}'", o.href.substring(8)) : r || (r = o.href); - const l = ce("a", { href: o.href, title: r, tabIndex: n++ }, o.label); - l.style.textDecoration = "underline"; - const a = (g) => { - n$(g) && tt.stop(g, !0), t.callback(o.href); - }, c = t.disposables.add(new et(l, ie.CLICK)).event, d = t.disposables.add(new et(l, ie.KEY_DOWN)).event, h = se.chain(d, (g) => g.filter((m) => { - const f = new Vt(m); - return f.equals( + let l = o.title; + !l && o.href.startsWith("command:") ? l = p("executeCommand", "Click to execute command '{0}'", o.href.substring(8)) : l || (l = o.href); + const r = de("a", { href: o.href, title: l, tabIndex: n++ }, o.label); + r.style.textDecoration = "underline"; + const c = (m) => { + Q$(m) && tt.stop(m, !0), t.callback(o.href); + }, d = t.disposables.add(new et(r, ie.CLICK)).event, a = t.disposables.add(new et(r, ie.KEY_DOWN)).event, h = se.chain(a, (m) => m.filter((b) => { + const g = new Yt(b); + return g.equals( 10 /* KeyCode.Space */ - ) || f.equals( + ) || g.equals( 3 /* KeyCode.Enter */ ); })); - t.disposables.add(Rn.addTarget(l)); - const u = t.disposables.add(new et(l, Rt.Tap)).event; - se.any(c, u, h)(a, null, t.disposables), e.appendChild(l); + t.disposables.add(En.addTarget(r)); + const u = t.disposables.add(new et(r, Jt.Tap)).event; + se.any(d, u, h)(c, null, t.disposables), e.appendChild(r); } } -var LZe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var bSe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, _B = function(s, e) { +}, q3 = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const J7 = "inQuickInput", AZe = new ae(J7, !1, p("inQuickInput", "Whether keyboard focus is inside the quick input control")), xZe = H.has(J7), U7 = "quickInputType", MZe = new ae(U7, void 0, p("quickInputType", "The type of the currently visible quick input")), K7 = "cursorAtEndOfQuickInputBox", ZZe = new ae(K7, !1, p("cursorAtEndOfQuickInputBox", "Whether the cursor in the quick input is at the end of the input box")), _Ze = H.has(K7), BG = { - iconClass: Ze.asClassName(te.quickInputBack), +const R8 = "inQuickInput", pSe = new ce(R8, !1, p("inQuickInput", "Whether keyboard focus is inside the quick input control")), gSe = P.has(R8), N8 = "quickInputType", ZSe = new ce(N8, void 0, p("quickInputType", "The type of the currently visible quick input")), w8 = "cursorAtEndOfQuickInputBox", fSe = new ce(w8, !1, p("cursorAtEndOfQuickInputBox", "Whether the cursor in the quick input is at the end of the input box")), ySe = P.has(w8), hk = { + iconClass: Se.asClassName(te.quickInputBack), tooltip: p("quickInput.back", "Back") -}, f_ = class f_ extends R { +}, wS = class wS extends J { constructor(e) { - super(), this.ui = e, this._widgetUpdated = !1, this.visible = !1, this._enabled = !0, this._busy = !1, this._ignoreFocusOut = !1, this._leftButtons = [], this._rightButtons = [], this._inlineButtons = [], this.buttonsUpdated = !1, this._toggles = [], this.togglesUpdated = !1, this.noValidationMessage = f_.noPromptMessage, this._severity = Mi.Ignore, this.onDidTriggerButtonEmitter = this._register(new k()), this.onDidHideEmitter = this._register(new k()), this.onWillHideEmitter = this._register(new k()), this.onDisposeEmitter = this._register(new k()), this.visibleDisposables = this._register(new U()), this.onDidHide = this.onDidHideEmitter.event; + super(), this.ui = e, this._widgetUpdated = !1, this.visible = !1, this._enabled = !0, this._busy = !1, this._ignoreFocusOut = !1, this._leftButtons = [], this._rightButtons = [], this._inlineButtons = [], this.buttonsUpdated = !1, this._toggles = [], this.togglesUpdated = !1, this.noValidationMessage = wS.noPromptMessage, this._severity = Si.Ignore, this.onDidTriggerButtonEmitter = this._register(new k()), this.onDidHideEmitter = this._register(new k()), this.onWillHideEmitter = this._register(new k()), this.onDisposeEmitter = this._register(new k()), this.visibleDisposables = this._register(new _()), this.onDidHide = this.onDidHideEmitter.event; } get title() { return this._title; @@ -102279,8 +102279,8 @@ const J7 = "inQuickInput", AZe = new ae(J7, !1, p("inQuickInput", "Whether keybo return this._ignoreFocusOut; } set ignoreFocusOut(e) { - const t = this._ignoreFocusOut !== e && !Wa; - this._ignoreFocusOut = e && !Wa, t && this.update(); + const t = this._ignoreFocusOut !== e && !Yc; + this._ignoreFocusOut = e && !Yc, t && this.update(); } get titleButtons() { return this._leftButtons.length ? [...this._leftButtons, this._rightButtons] : this._rightButtons; @@ -102293,7 +102293,7 @@ const J7 = "inQuickInput", AZe = new ae(J7, !1, p("inQuickInput", "Whether keybo ]; } set buttons(e) { - this._leftButtons = e.filter((t) => t === BG), this._rightButtons = e.filter((t) => t !== BG && t.location !== Cx.Inline), this._inlineButtons = e.filter((t) => t.location === Cx.Inline), this.buttonsUpdated = !0, this.update(); + this._leftButtons = e.filter((t) => t === hk), this._rightButtons = e.filter((t) => t !== hk && t.location !== kL.Inline), this._inlineButtons = e.filter((t) => t.location === kL.Inline), this.buttonsUpdated = !0, this.update(); } get toggles() { return this._toggles; @@ -102321,10 +102321,10 @@ const J7 = "inQuickInput", AZe = new ae(J7, !1, p("inQuickInput", "Whether keybo hide() { this.visible && this.ui.hide(); } - didHide(e = xb.Other) { + didHide(e = NZ.Other) { this.visible = !1, this.visibleDisposables.clear(), this.onDidHideEmitter.fire({ reason: e }); } - willHide(e = xb.Other) { + willHide(e = NZ.Other) { this.onWillHideEmitter.fire({ reason: e }); } update() { @@ -102334,25 +102334,25 @@ const J7 = "inQuickInput", AZe = new ae(J7, !1, p("inQuickInput", "Whether keybo const e = this.getTitle(); e && this.ui.title.textContent !== e ? this.ui.title.textContent = e : !e && this.ui.title.innerHTML !== " " && (this.ui.title.innerText = " "); const t = this.getDescription(); - if (this.ui.description1.textContent !== t && (this.ui.description1.textContent = t), this.ui.description2.textContent !== t && (this.ui.description2.textContent = t), this._widgetUpdated && (this._widgetUpdated = !1, this._widget ? In(this.ui.widget, this._widget) : In(this.ui.widget)), this.busy && !this.busyDelay && (this.busyDelay = new qr(), this.busyDelay.setIfNotSet(() => { + if (this.ui.description1.textContent !== t && (this.ui.description1.textContent = t), this.ui.description2.textContent !== t && (this.ui.description2.textContent = t), this._widgetUpdated && (this._widgetUpdated = !1, this._widget ? Rn(this.ui.widget, this._widget) : Rn(this.ui.widget)), this.busy && !this.busyDelay && (this.busyDelay = new tr(), this.busyDelay.setIfNotSet(() => { this.visible && this.ui.progressBar.infinite(); }, 800)), !this.busy && this.busyDelay && (this.ui.progressBar.stop(), this.busyDelay.cancel(), this.busyDelay = void 0), this.buttonsUpdated) { this.buttonsUpdated = !1, this.ui.leftActionBar.clear(); - const o = this._leftButtons.map((a, c) => rw(a, `id-${c}`, async () => this.onDidTriggerButtonEmitter.fire(a))); + const o = this._leftButtons.map((c, d) => Zy(c, `id-${d}`, async () => this.onDidTriggerButtonEmitter.fire(c))); this.ui.leftActionBar.push(o, { icon: !0, label: !1 }), this.ui.rightActionBar.clear(); - const r = this._rightButtons.map((a, c) => rw(a, `id-${c}`, async () => this.onDidTriggerButtonEmitter.fire(a))); - this.ui.rightActionBar.push(r, { icon: !0, label: !1 }), this.ui.inlineActionBar.clear(); - const l = this._inlineButtons.map((a, c) => rw(a, `id-${c}`, async () => this.onDidTriggerButtonEmitter.fire(a))); - this.ui.inlineActionBar.push(l, { icon: !0, label: !1 }); + const l = this._rightButtons.map((c, d) => Zy(c, `id-${d}`, async () => this.onDidTriggerButtonEmitter.fire(c))); + this.ui.rightActionBar.push(l, { icon: !0, label: !1 }), this.ui.inlineActionBar.clear(); + const r = this._inlineButtons.map((c, d) => Zy(c, `id-${d}`, async () => this.onDidTriggerButtonEmitter.fire(c))); + this.ui.inlineActionBar.push(r, { icon: !0, label: !1 }); } if (this.togglesUpdated) { this.togglesUpdated = !1; - const o = ((n = this.toggles) == null ? void 0 : n.filter((r) => r instanceof y0)) ?? []; + const o = ((n = this.toggles) == null ? void 0 : n.filter((l) => l instanceof L0)) ?? []; this.ui.inputBox.toggles = o; } this.ui.ignoreFocusOut = this.ignoreFocusOut, this.ui.setEnabled(this.enabled), this.ui.setContextKey(this.contextKey); const i = this.validationMessage || this.noValidationMessage; - this._lastValidationMessage !== i && (this._lastValidationMessage = i, In(this.ui.message), SZe(i, this.ui.message, { + this._lastValidationMessage !== i && (this._lastValidationMessage = i, Rn(this.ui.message), mSe(i, this.ui.message, { callback: (o) => { this.ui.linkOpenerDelegate(o); }, @@ -102369,7 +102369,7 @@ const J7 = "inQuickInput", AZe = new ae(J7, !1, p("inQuickInput", "Whether keybo return this.step && this.totalSteps ? p("quickInput.steps", "{0}/{1}", this.step, this.totalSteps) : this.step ? String(this.step) : ""; } showMessageDecoration(e) { - if (this.ui.inputBox.showDecoration(e), e !== Mi.Ignore) { + if (this.ui.inputBox.showDecoration(e), e !== Si.Ignore) { const t = this.ui.inputBox.stylesForType(e); this.ui.message.style.color = t.foreground ? `${t.foreground}` : "", this.ui.message.style.backgroundColor = t.background ? `${t.background}` : "", this.ui.message.style.border = t.border ? `1px solid ${t.border}` : "", this.ui.message.style.marginBottom = "-2px"; } else @@ -102379,11 +102379,11 @@ const J7 = "inQuickInput", AZe = new ae(J7, !1, p("inQuickInput", "Whether keybo this.hide(), this.onDisposeEmitter.fire(), super.dispose(); } }; -f_.noPromptMessage = p("inputModeEntry", "Press 'Enter' to confirm your input or 'Escape' to cancel"); -let VM = f_; -const b_ = class b_ extends VM { +wS.noPromptMessage = p("inputModeEntry", "Press 'Enter' to confirm your input or 'Escape' to cancel"); +let QI = wS; +const TS = class TS extends QI { constructor() { - super(...arguments), this._value = "", this.onDidChangeValueEmitter = this._register(new k()), this.onWillAcceptEmitter = this._register(new k()), this.onDidAcceptEmitter = this._register(new k()), this.onDidCustomEmitter = this._register(new k()), this._items = [], this.itemsUpdated = !1, this._canSelectMany = !1, this._canAcceptInBackground = !1, this._matchOnDescription = !1, this._matchOnDetail = !1, this._matchOnLabel = !0, this._matchOnLabelMode = "fuzzy", this._sortByLabel = !0, this._keepScrollPosition = !1, this._itemActivation = da.FIRST, this._activeItems = [], this.activeItemsUpdated = !1, this.activeItemsToConfirm = [], this.onDidChangeActiveEmitter = this._register(new k()), this._selectedItems = [], this.selectedItemsUpdated = !1, this.selectedItemsToConfirm = [], this.onDidChangeSelectionEmitter = this._register(new k()), this.onDidTriggerItemButtonEmitter = this._register(new k()), this.onDidTriggerSeparatorButtonEmitter = this._register(new k()), this.valueSelectionUpdated = !0, this._ok = "default", this._customButton = !1, this._focusEventBufferer = new aC(), this.type = "quickPick", this.filterValue = (e) => e, this.onDidChangeValue = this.onDidChangeValueEmitter.event, this.onWillAccept = this.onWillAcceptEmitter.event, this.onDidAccept = this.onDidAcceptEmitter.event, this.onDidChangeActive = this.onDidChangeActiveEmitter.event, this.onDidChangeSelection = this.onDidChangeSelectionEmitter.event, this.onDidTriggerItemButton = this.onDidTriggerItemButtonEmitter.event, this.onDidTriggerSeparatorButton = this.onDidTriggerSeparatorButtonEmitter.event; + super(...arguments), this._value = "", this.onDidChangeValueEmitter = this._register(new k()), this.onWillAcceptEmitter = this._register(new k()), this.onDidAcceptEmitter = this._register(new k()), this.onDidCustomEmitter = this._register(new k()), this._items = [], this.itemsUpdated = !1, this._canSelectMany = !1, this._canAcceptInBackground = !1, this._matchOnDescription = !1, this._matchOnDetail = !1, this._matchOnLabel = !0, this._matchOnLabelMode = "fuzzy", this._sortByLabel = !0, this._keepScrollPosition = !1, this._itemActivation = bc.FIRST, this._activeItems = [], this.activeItemsUpdated = !1, this.activeItemsToConfirm = [], this.onDidChangeActiveEmitter = this._register(new k()), this._selectedItems = [], this.selectedItemsUpdated = !1, this.selectedItemsToConfirm = [], this.onDidChangeSelectionEmitter = this._register(new k()), this.onDidTriggerItemButtonEmitter = this._register(new k()), this.onDidTriggerSeparatorButtonEmitter = this._register(new k()), this.valueSelectionUpdated = !0, this._ok = "default", this._customButton = !1, this._focusEventBufferer = new GG(), this.type = "quickPick", this.filterValue = (e) => e, this.onDidChangeValue = this.onDidChangeValueEmitter.event, this.onWillAccept = this.onWillAcceptEmitter.event, this.onDidAccept = this.onDidAcceptEmitter.event, this.onDidChangeActive = this.onDidChangeActiveEmitter.event, this.onDidChangeSelection = this.onDidChangeSelectionEmitter.event, this.onDidTriggerItemButton = this.onDidTriggerItemButtonEmitter.event, this.onDidTriggerSeparatorButton = this.onDidTriggerSeparatorButtonEmitter.event; } get quickNavigate() { return this._quickNavigate; @@ -102491,7 +102491,7 @@ const b_ = class b_ extends VM { this._selectedItems = e, this.selectedItemsUpdated = !0, this.update(); } get keyMods() { - return this._quickNavigate ? qme : this.ui.keyMods; + return this._quickNavigate ? Kpe : this.ui.keyMods; } get valueSelection() { const e = this.ui.inputBox.getSelection(); @@ -102532,7 +102532,7 @@ const b_ = class b_ extends VM { this._hideInput = e, this.update(); } trySelectFirst() { - this.canSelectMany || this.ui.list.focus(Xt.First); + this.canSelectMany || this.ui.list.focus(Et.First); } show() { this.visible || (this.visibleDisposables.add(this.ui.inputBox.onDidChange((e) => { @@ -102550,18 +102550,18 @@ const b_ = class b_ extends VM { // Only fire the last event (e, t) => t )((e) => { - this.activeItemsUpdated || this.activeItemsToConfirm !== this._activeItems && ei(e, this._activeItems, (t, i) => t === i) || (this._activeItems = e, this.onDidChangeActiveEmitter.fire(e)); + this.activeItemsUpdated || this.activeItemsToConfirm !== this._activeItems && ti(e, this._activeItems, (t, i) => t === i) || (this._activeItems = e, this.onDidChangeActiveEmitter.fire(e)); })), this.visibleDisposables.add(this.ui.list.onDidChangeSelection(({ items: e, event: t }) => { if (this.canSelectMany) { e.length && this.ui.list.setSelectedElements([]); return; } - this.selectedItemsToConfirm !== this._selectedItems && ei(e, this._selectedItems, (i, n) => i === n) || (this._selectedItems = e, this.onDidChangeSelectionEmitter.fire(e), e.length && this.handleAccept( - dE(t) && t.button === 1 + this.selectedItemsToConfirm !== this._selectedItems && ti(e, this._selectedItems, (i, n) => i === n) || (this._selectedItems = e, this.onDidChangeSelectionEmitter.fire(e), e.length && this.handleAccept( + kv(t) && t.button === 1 /* mouse middle click */ )); })), this.visibleDisposables.add(this.ui.list.onChangedCheckedElements((e) => { - !this.canSelectMany || !this.visible || this.selectedItemsToConfirm !== this._selectedItems && ei(e, this._selectedItems, (t, i) => t === i) || (this._selectedItems = e, this.onDidChangeSelectionEmitter.fire(e)); + !this.canSelectMany || !this.visible || this.selectedItemsToConfirm !== this._selectedItems && ti(e, this._selectedItems, (t, i) => t === i) || (this._selectedItems = e, this.onDidChangeSelectionEmitter.fire(e)); })), this.visibleDisposables.add(this.ui.list.onButtonTriggered((e) => this.onDidTriggerItemButtonEmitter.fire(e))), this.visibleDisposables.add(this.ui.list.onSeparatorButtonTriggered((e) => this.onDidTriggerSeparatorButtonEmitter.fire(e))), this.visibleDisposables.add(this.registerQuickNavigation()), this.valueSelectionUpdated = !0), super.show(); } handleAccept(e) { @@ -102572,10 +102572,10 @@ const b_ = class b_ extends VM { return z(this.ui.container, ie.KEY_UP, (e) => { if (this.canSelectMany || !this._quickNavigate) return; - const t = new Vt(e), i = t.keyCode; - this._quickNavigate.keybindings.some((r) => { - const l = r.getChords(); - return l.length > 1 ? !1 : l[0].shiftKey && i === 4 ? !(t.ctrlKey || t.altKey || t.metaKey) : !!(l[0].altKey && i === 6 || l[0].ctrlKey && i === 5 || l[0].metaKey && i === 57); + const t = new Yt(e), i = t.keyCode; + this._quickNavigate.keybindings.some((l) => { + const r = l.getChords(); + return r.length > 1 ? !1 : r[0].shiftKey && i === 4 ? !(t.ctrlKey || t.altKey || t.metaKey) : !!(r[0].altKey && i === 6 || r[0].ctrlKey && i === 5 || r[0].metaKey && i === 57); }) && (this.activeItems[0] && (this._selectedItems = [this.activeItems[0]], this.onDidChangeSelectionEmitter.fire(this.selectedItems), this.handleAccept(!1)), this._quickNavigate = void 0); }); } @@ -102598,22 +102598,22 @@ const b_ = class b_ extends VM { }; this.ui.setVisibilities(i), super.update(), this.ui.inputBox.value !== this.value && (this.ui.inputBox.value = this.value), this.valueSelectionUpdated && (this.valueSelectionUpdated = !1, this.ui.inputBox.select(this._valueSelection && { start: this._valueSelection[0], end: this._valueSelection[1] })), this.ui.inputBox.placeholder !== (this.placeholder || "") && (this.ui.inputBox.placeholder = this.placeholder || ""); let n = this.ariaLabel; - !n && i.inputBox && (n = this.placeholder || b_.DEFAULT_ARIA_LABEL, this.title && (n += ` - ${this.title}`)), this.ui.list.ariaLabel !== n && (this.ui.list.ariaLabel = n ?? null), this.ui.list.matchOnDescription = this.matchOnDescription, this.ui.list.matchOnDetail = this.matchOnDetail, this.ui.list.matchOnLabel = this.matchOnLabel, this.ui.list.matchOnLabelMode = this.matchOnLabelMode, this.ui.list.sortByLabel = this.sortByLabel, this.itemsUpdated && (this.itemsUpdated = !1, this._focusEventBufferer.bufferEvents(() => { + !n && i.inputBox && (n = this.placeholder || TS.DEFAULT_ARIA_LABEL, this.title && (n += ` - ${this.title}`)), this.ui.list.ariaLabel !== n && (this.ui.list.ariaLabel = n ?? null), this.ui.list.matchOnDescription = this.matchOnDescription, this.ui.list.matchOnDetail = this.matchOnDetail, this.ui.list.matchOnLabel = this.matchOnLabel, this.ui.list.matchOnLabelMode = this.matchOnLabelMode, this.ui.list.sortByLabel = this.sortByLabel, this.itemsUpdated && (this.itemsUpdated = !1, this._focusEventBufferer.bufferEvents(() => { switch (this.ui.list.setElements(this.items), this.ui.list.shouldLoop = !this.canSelectMany, this.ui.list.filter(this.filterValue(this.ui.inputBox.value)), this._itemActivation) { - case da.NONE: - this._itemActivation = da.FIRST; + case bc.NONE: + this._itemActivation = bc.FIRST; break; - case da.SECOND: - this.ui.list.focus(Xt.Second), this._itemActivation = da.FIRST; + case bc.SECOND: + this.ui.list.focus(Et.Second), this._itemActivation = bc.FIRST; break; - case da.LAST: - this.ui.list.focus(Xt.Last), this._itemActivation = da.FIRST; + case bc.LAST: + this.ui.list.focus(Et.Last), this._itemActivation = bc.FIRST; break; default: this.trySelectFirst(); break; } - })), this.ui.container.classList.contains("show-checkboxes") !== !!this.canSelectMany && (this.canSelectMany ? this.ui.list.clearFocus() : this.trySelectFirst()), this.activeItemsUpdated && (this.activeItemsUpdated = !1, this.activeItemsToConfirm = this._activeItems, this.ui.list.setFocusedElements(this.activeItems), this.activeItemsToConfirm === this._activeItems && (this.activeItemsToConfirm = null)), this.selectedItemsUpdated && (this.selectedItemsUpdated = !1, this.selectedItemsToConfirm = this._selectedItems, this.canSelectMany ? this.ui.list.setCheckedElements(this.selectedItems) : this.ui.list.setSelectedElements(this.selectedItems), this.selectedItemsToConfirm === this._selectedItems && (this.selectedItemsToConfirm = null)), this.ui.customButton.label = this.customLabel || "", this.ui.customButton.element.title = this.customHover || "", i.inputBox || (this.ui.list.domFocus(), this.canSelectMany && this.ui.list.focus(Xt.First)), this.keepScrollPosition && (this.scrollTop = e); + })), this.ui.container.classList.contains("show-checkboxes") !== !!this.canSelectMany && (this.canSelectMany ? this.ui.list.clearFocus() : this.trySelectFirst()), this.activeItemsUpdated && (this.activeItemsUpdated = !1, this.activeItemsToConfirm = this._activeItems, this.ui.list.setFocusedElements(this.activeItems), this.activeItemsToConfirm === this._activeItems && (this.activeItemsToConfirm = null)), this.selectedItemsUpdated && (this.selectedItemsUpdated = !1, this.selectedItemsToConfirm = this._selectedItems, this.canSelectMany ? this.ui.list.setCheckedElements(this.selectedItems) : this.ui.list.setSelectedElements(this.selectedItems), this.selectedItemsToConfirm === this._selectedItems && (this.selectedItemsToConfirm = null)), this.ui.customButton.label = this.customLabel || "", this.ui.customButton.element.title = this.customHover || "", i.inputBox || (this.ui.list.domFocus(), this.canSelectMany && this.ui.list.focus(Et.First)), this.keepScrollPosition && (this.scrollTop = e); } focus(e) { this.ui.list.focus(e), this.canSelectMany && this.ui.list.domFocus(); @@ -102622,9 +102622,9 @@ const b_ = class b_ extends VM { e && !this._canAcceptInBackground || this.activeItems[0] && (this._selectedItems = [this.activeItems[0]], this.onDidChangeSelectionEmitter.fire(this.selectedItems), this.handleAccept(e ?? !1)); } }; -b_.DEFAULT_ARIA_LABEL = p("quickInputBox.ariaLabel", "Type to narrow down results."); -let kM = b_; -class IZe extends VM { +TS.DEFAULT_ARIA_LABEL = p("quickInputBox.ariaLabel", "Type to narrow down results."); +let OI = TS; +class WSe extends QI { constructor() { super(...arguments), this._value = "", this.valueSelectionUpdated = !0, this._password = !1, this.onDidValueChangeEmitter = this._register(new k()), this.onDidAcceptEmitter = this._register(new k()), this.type = "inputBox", this.onDidChangeValue = this.onDidValueChangeEmitter.event, this.onDidAccept = this.onDidAcceptEmitter.event; } @@ -102665,12 +102665,12 @@ class IZe extends VM { this.ui.setVisibilities(e), super.update(), this.ui.inputBox.value !== this.value && (this.ui.inputBox.value = this.value), this.valueSelectionUpdated && (this.valueSelectionUpdated = !1, this.ui.inputBox.select(this._valueSelection && { start: this._valueSelection[0], end: this._valueSelection[1] })), this.ui.inputBox.placeholder !== (this.placeholder || "") && (this.ui.inputBox.placeholder = this.placeholder || ""), this.ui.inputBox.password !== this.password && (this.ui.inputBox.password = this.password); } } -let OG = class extends Ab { +let uk = class extends RZ { constructor(e, t) { super("element", !1, (i) => this.getOverrideOptions(i), e, t); } getOverrideOptions(e) { - const t = (Ki(e.content) ? e.content.textContent ?? "" : typeof e.content == "string" ? e.content : e.content.value).includes(` + const t = (Oi(e.content) ? e.content.textContent ?? "" : typeof e.content == "string" ? e.content : e.content.value).includes(` `); return { persistence: { @@ -102683,19 +102683,19 @@ let OG = class extends Ab { }; } }; -OG = LZe([ - _B(0, Ke), - _B(1, Pa) -], OG); -const IB = "done", NB = "active", s2 = "infinite", o2 = "infinite-long-running", WB = "discrete", y_ = class y_ extends R { +uk = bSe([ + q3(0, Qe), + q3(1, Bc) +], uk); +const $3 = "done", eU = "active", WN = "infinite", GN = "infinite-long-running", tU = "discrete", MS = class MS extends J { constructor(e, t) { - super(), this.progressSignal = this._register(new fn()), this.workedVal = 0, this.showDelayedScheduler = this._register(new Zt(() => no(this.element), 0)), this.longRunningScheduler = this._register(new Zt(() => this.infiniteLongRunning(), y_.LONG_RUNNING_INFINITE_THRESHOLD)), this.create(e, t); + super(), this.progressSignal = this._register(new Zn()), this.workedVal = 0, this.showDelayedScheduler = this._register(new St(() => oo(this.element), 0)), this.longRunningScheduler = this._register(new St(() => this.infiniteLongRunning(), MS.LONG_RUNNING_INFINITE_THRESHOLD)), this.create(e, t); } create(e, t) { this.element = document.createElement("div"), this.element.classList.add("monaco-progress-container"), this.element.setAttribute("role", "progressbar"), this.element.setAttribute("aria-valuemin", "0"), e.appendChild(this.element), this.bit = document.createElement("div"), this.bit.classList.add("progress-bit"), this.bit.style.backgroundColor = (t == null ? void 0 : t.progressBarBackground) || "#0E70C0", this.element.appendChild(this.bit); } off() { - this.bit.style.width = "inherit", this.bit.style.opacity = "1", this.element.classList.remove(NB, s2, o2, WB), this.workedVal = 0, this.totalWork = void 0, this.longRunningScheduler.cancel(), this.progressSignal.clear(); + this.bit.style.width = "inherit", this.bit.style.opacity = "1", this.element.classList.remove(eU, WN, GN, tU), this.workedVal = 0, this.totalWork = void 0, this.longRunningScheduler.cancel(), this.progressSignal.clear(); } /** * Stops the progressbar from showing any progress instantly without fading out. @@ -102704,27 +102704,27 @@ const IB = "done", NB = "active", s2 = "infinite", o2 = "infinite-long-running", return this.doDone(!1); } doDone(e) { - return this.element.classList.add(IB), this.element.classList.contains(s2) ? (this.bit.style.opacity = "0", e ? setTimeout(() => this.off(), 200) : this.off()) : (this.bit.style.width = "inherit", e ? setTimeout(() => this.off(), 200) : this.off()), this; + return this.element.classList.add($3), this.element.classList.contains(WN) ? (this.bit.style.opacity = "0", e ? setTimeout(() => this.off(), 200) : this.off()) : (this.bit.style.width = "inherit", e ? setTimeout(() => this.off(), 200) : this.off()), this; } /** * Use this mode to indicate progress that has no total number of work units. */ infinite() { - return this.bit.style.width = "2%", this.bit.style.opacity = "1", this.element.classList.remove(WB, IB, o2), this.element.classList.add(NB, s2), this.longRunningScheduler.schedule(), this; + return this.bit.style.width = "2%", this.bit.style.opacity = "1", this.element.classList.remove(tU, $3, GN), this.element.classList.add(eU, WN), this.longRunningScheduler.schedule(), this; } infiniteLongRunning() { - this.element.classList.add(o2); + this.element.classList.add(GN); } getContainer() { return this.element; } }; -y_.LONG_RUNNING_INFINITE_THRESHOLD = 1e4; -let HG = y_; -const NZe = ce; -class WZe extends R { +MS.LONG_RUNNING_INFINITE_THRESHOLD = 1e4; +let mk = MS; +const GSe = de; +class XSe extends J { constructor(e, t, i) { - super(), this.parent = e, this.onKeyDown = (o) => ai(this.findInput.inputBox.inputElement, ie.KEY_DOWN, o), this.onDidChange = (o) => this.findInput.onDidChange(o), this.container = Q(this.parent, NZe(".quick-input-box")), this.findInput = this._register(new XQ(this.container, void 0, { label: "", inputBoxStyles: t, toggleStyles: i })); + super(), this.parent = e, this.onKeyDown = (o) => di(this.findInput.inputBox.inputElement, ie.KEY_DOWN, o), this.onDidChange = (o) => this.findInput.onDidChange(o), this.container = O(this.parent, GSe(".quick-input-box")), this.findInput = this._register(new G4(this.container, void 0, { label: "", inputBoxStyles: t, toggleStyles: i })); const n = this.findInput.inputBox.inputElement; n.role = "combobox", n.ariaHasPopup = "menu", n.ariaAutoComplete = "list", n.ariaExpanded = "true"; } @@ -102765,11 +102765,11 @@ class WZe extends R { this.findInput.inputBox.inputElement.setAttribute(e, t); } showDecoration(e) { - e === Mi.Ignore ? this.findInput.clearMessage() : this.findInput.showMessage({ type: e === Mi.Info ? 1 : e === Mi.Warning ? 2 : 3, content: "" }); + e === Si.Ignore ? this.findInput.clearMessage() : this.findInput.showMessage({ type: e === Si.Info ? 1 : e === Si.Warning ? 2 : 3, content: "" }); } stylesForType(e) { return this.findInput.inputBox.stylesForType( - e === Mi.Info ? 1 : e === Mi.Warning ? 2 : 3 + e === Si.Info ? 1 : e === Si.Warning ? 2 : 3 /* MessageType.ERROR */ ); } @@ -102780,32 +102780,32 @@ class WZe extends R { this.findInput.inputBox.layout(); } } -const vB = new Wl(() => { +const iU = new Yr(() => { const s = new Intl.Collator(void 0, { numeric: !0, sensitivity: "base" }); return { collator: s, collatorIsNumeric: s.resolvedOptions().numeric }; }); -function vZe(s, e, t = !1) { - const i = s || "", n = e || "", o = vB.value.collator.compare(i, n); - return vB.value.collatorIsNumeric && o === 0 && i !== n ? i < n ? -1 : 1 : o; +function VSe(s, e, t = !1) { + const i = s || "", n = e || "", o = iU.value.collator.compare(i, n); + return iU.value.collatorIsNumeric && o === 0 && i !== n ? i < n ? -1 : 1 : o; } -function TZe(s, e, t) { - const i = s.toLowerCase(), n = e.toLowerCase(), o = DZe(s, e, t); +function LSe(s, e, t) { + const i = s.toLowerCase(), n = e.toLowerCase(), o = ISe(s, e, t); if (o) return o; - const r = i.endsWith(t), l = n.endsWith(t); - if (r !== l) - return r ? -1 : 1; - const a = vZe(i, n); - return a !== 0 ? a : i.localeCompare(n); -} -function DZe(s, e, t) { - const i = s.toLowerCase(), n = e.toLowerCase(), o = i.startsWith(t), r = n.startsWith(t); - if (o !== r) + const l = i.endsWith(t), r = n.endsWith(t); + if (l !== r) + return l ? -1 : 1; + const c = VSe(i, n); + return c !== 0 ? c : i.localeCompare(n); +} +function ISe(s, e, t) { + const i = s.toLowerCase(), n = e.toLowerCase(), o = i.startsWith(t), l = n.startsWith(t); + if (o !== l) return o ? -1 : 1; - if (o && r) { + if (o && l) { if (i.length < n.length) return -1; if (i.length > n.length) @@ -102813,25 +102813,25 @@ function DZe(s, e, t) { } return 0; } -var aN = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var VC = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, JG = function(s, e) { +}, bk = function(s, e) { return function(t, i) { e(t, i, s); }; -}, UG; -const ll = ce; -class Q7 { +}, pk; +const ar = de; +class T8 { constructor(e, t, i) { - this.index = e, this.hasCheckbox = t, this._hidden = !1, this._init = new Wl(() => { - const n = i.label ?? "", o = hy(n).text.trim(), r = i.ariaLabel || [n, this.saneDescription, this.saneDetail].map((l) => rhe(l)).filter((l) => !!l).join(", "); + this.index = e, this.hasCheckbox = t, this._hidden = !1, this._init = new Yr(() => { + const n = i.label ?? "", o = Gf(n).text.trim(), l = i.ariaLabel || [n, this.saneDescription, this.saneDetail].map((r) => qhe(r)).filter((r) => !!r).join(", "); return { saneLabel: n, saneSortLabel: o, - saneAriaLabel: r + saneAriaLabel: l }; }), this._saneDescription = i.description, this._saneTooltip = i.tooltip; } @@ -102894,10 +102894,10 @@ class Q7 { this._detailHighlights = e; } } -class Cn extends Q7 { - constructor(e, t, i, n, o, r) { - var l, a, c; - super(e, t, o), this.fireButtonTriggered = i, this._onChecked = n, this.item = o, this._separator = r, this._checked = !1, this.onChecked = t ? se.map(se.filter(this._onChecked.event, (d) => d.element === this), (d) => d.checked) : se.None, this._saneDetail = o.detail, this._labelHighlights = (l = o.highlights) == null ? void 0 : l.label, this._descriptionHighlights = (a = o.highlights) == null ? void 0 : a.description, this._detailHighlights = (c = o.highlights) == null ? void 0 : c.detail; +class Gn extends T8 { + constructor(e, t, i, n, o, l) { + var r, c, d; + super(e, t, o), this.fireButtonTriggered = i, this._onChecked = n, this.item = o, this._separator = l, this._checked = !1, this.onChecked = t ? se.map(se.filter(this._onChecked.event, (a) => a.element === this), (a) => a.checked) : se.None, this._saneDetail = o.detail, this._labelHighlights = (r = o.highlights) == null ? void 0 : r.label, this._descriptionHighlights = (c = o.highlights) == null ? void 0 : c.description, this._detailHighlights = (d = o.highlights) == null ? void 0 : d.detail; } get separator() { return this._separator; @@ -102915,24 +102915,24 @@ class Cn extends Q7 { return !!this.item.disabled; } } -var ha; +var pc; (function(s) { s[s.NONE = 0] = "NONE", s[s.MOUSE_HOVER = 1] = "MOUSE_HOVER", s[s.ACTIVE_ITEM = 2] = "ACTIVE_ITEM"; -})(ha || (ha = {})); -class Wu extends Q7 { +})(pc || (pc = {})); +class ku extends T8 { constructor(e, t, i) { - super(e, !1, i), this.fireSeparatorButtonTriggered = t, this.separator = i, this.children = new Array(), this.focusInsideSeparator = ha.NONE; + super(e, !1, i), this.fireSeparatorButtonTriggered = t, this.separator = i, this.children = new Array(), this.focusInsideSeparator = pc.NONE; } } -class VZe { +class SSe { getHeight(e) { - return e instanceof Wu ? 30 : e.saneDetail ? 44 : 22; + return e instanceof ku ? 30 : e.saneDetail ? 44 : 22; } getTemplateId(e) { - return e instanceof Cn ? GM.ID : RM.ID; + return e instanceof Gn ? jI.ID : qI.ID; } } -class kZe { +class xSe { getWidgetAriaLabel() { return p("quickInput", "Quick Input"); } @@ -102947,7 +102947,7 @@ class kZe { return e.hasCheckbox ? "checkbox" : "option"; } isChecked(e) { - if (!(!e.hasCheckbox || !(e instanceof Cn))) + if (!(!e.hasCheckbox || !(e instanceof Gn))) return { get value() { return e.checked; @@ -102956,24 +102956,24 @@ class kZe { }; } } -class j7 { +class M8 { constructor(e) { this.hoverDelegate = e; } // TODO: only do the common stuff here and have a subclass handle their specific stuff renderTemplate(e) { const t = /* @__PURE__ */ Object.create(null); - t.toDisposeElement = new U(), t.toDisposeTemplate = new U(), t.entry = Q(e, ll(".quick-input-list-entry")); - const i = Q(t.entry, ll("label.quick-input-list-label")); - t.toDisposeTemplate.add(ai(i, ie.CLICK, (c) => { - t.checkbox.offsetParent || c.preventDefault(); - })), t.checkbox = Q(i, ll("input.quick-input-list-checkbox")), t.checkbox.type = "checkbox"; - const n = Q(i, ll(".quick-input-list-rows")), o = Q(n, ll(".quick-input-list-row")), r = Q(n, ll(".quick-input-list-row")); - t.label = new Ex(o, { supportHighlights: !0, supportDescriptionHighlights: !0, supportIcons: !0, hoverDelegate: this.hoverDelegate }), t.toDisposeTemplate.add(t.label), t.icon = hE(t.label.element, ll(".quick-input-list-icon")); - const l = Q(o, ll(".quick-input-list-entry-keybinding")); - t.keybinding = new f0(l, ro), t.toDisposeTemplate.add(t.keybinding); - const a = Q(r, ll(".quick-input-list-label-meta")); - return t.detail = new Ex(a, { supportHighlights: !0, supportIcons: !0, hoverDelegate: this.hoverDelegate }), t.toDisposeTemplate.add(t.detail), t.separator = Q(t.entry, ll(".quick-input-list-separator")), t.actionBar = new Yo(t.entry, this.hoverDelegate ? { hoverDelegate: this.hoverDelegate } : void 0), t.actionBar.domNode.classList.add("quick-input-list-entry-action-bar"), t.toDisposeTemplate.add(t.actionBar), t; + t.toDisposeElement = new _(), t.toDisposeTemplate = new _(), t.entry = O(e, ar(".quick-input-list-entry")); + const i = O(t.entry, ar("label.quick-input-list-label")); + t.toDisposeTemplate.add(di(i, ie.CLICK, (d) => { + t.checkbox.offsetParent || d.preventDefault(); + })), t.checkbox = O(i, ar("input.quick-input-list-checkbox")), t.checkbox.type = "checkbox"; + const n = O(i, ar(".quick-input-list-rows")), o = O(n, ar(".quick-input-list-row")), l = O(n, ar(".quick-input-list-row")); + t.label = new $L(o, { supportHighlights: !0, supportDescriptionHighlights: !0, supportIcons: !0, hoverDelegate: this.hoverDelegate }), t.toDisposeTemplate.add(t.label), t.icon = vv(t.label.element, ar(".quick-input-list-icon")); + const r = O(o, ar(".quick-input-list-entry-keybinding")); + t.keybinding = new X0(r, co), t.toDisposeTemplate.add(t.keybinding); + const c = O(l, ar(".quick-input-list-label-meta")); + return t.detail = new $L(c, { supportHighlights: !0, supportIcons: !0, hoverDelegate: this.hoverDelegate }), t.toDisposeTemplate.add(t.detail), t.separator = O(t.entry, ar(".quick-input-list-separator")), t.actionBar = new Ao(t.entry, this.hoverDelegate ? { hoverDelegate: this.hoverDelegate } : void 0), t.actionBar.domNode.classList.add("quick-input-list-entry-action-bar"), t.toDisposeTemplate.add(t.actionBar), t; } disposeTemplate(e) { e.toDisposeElement.dispose(), e.toDisposeTemplate.dispose(); @@ -102982,17 +102982,17 @@ class j7 { i.toDisposeElement.clear(), i.actionBar.clear(); } } -var om; -let GM = (om = class extends j7 { +var ab; +let jI = (ab = class extends M8 { constructor(e, t) { super(e), this.themeService = t, this._itemsWithSeparatorsFrequency = /* @__PURE__ */ new Map(); } get templateId() { - return UG.ID; + return pk.ID; } renderTemplate(e) { const t = super.renderTemplate(e); - return t.toDisposeTemplate.add(ai(t.checkbox, ie.CHANGE, (i) => { + return t.toDisposeTemplate.add(di(t.checkbox, ie.CHANGE, (i) => { t.element.checked = t.checkbox.checked; })), t; } @@ -103001,46 +103001,46 @@ let GM = (om = class extends j7 { const n = e.element; i.element = n, n.element = i.entry ?? void 0; const o = n.item; - i.checkbox.checked = n.checked, i.toDisposeElement.add(n.onChecked((g) => i.checkbox.checked = g)), i.checkbox.disabled = n.checkboxDisabled; - const { labelHighlights: r, descriptionHighlights: l, detailHighlights: a } = n; + i.checkbox.checked = n.checked, i.toDisposeElement.add(n.onChecked((m) => i.checkbox.checked = m)), i.checkbox.disabled = n.checkboxDisabled; + const { labelHighlights: l, descriptionHighlights: r, detailHighlights: c } = n; if (o.iconPath) { - const g = hI(this.themeService.getColorTheme().type) ? o.iconPath.dark : o.iconPath.light ?? o.iconPath.dark, m = Le.revive(g); - i.icon.className = "quick-input-list-icon", i.icon.style.backgroundImage = Pc(m); + const m = Sx(this.themeService.getColorTheme().type) ? o.iconPath.dark : o.iconPath.light ?? o.iconPath.dark, b = Xe.revive(m); + i.icon.className = "quick-input-list-icon", i.icon.style.backgroundImage = Bd(b); } else i.icon.style.backgroundImage = "", i.icon.className = o.iconClass ? `quick-input-list-icon ${o.iconClass}` : ""; - let c; - !n.saneTooltip && n.saneDescription && (c = { + let d; + !n.saneTooltip && n.saneDescription && (d = { markdown: { value: n.saneDescription, supportThemeIcons: !0 }, markdownNotSupportedFallback: n.saneDescription }); - const d = { - matches: r || [], + const a = { + matches: l || [], // If we have a tooltip, we want that to be shown and not any other hover - descriptionTitle: c, - descriptionMatches: l || [], + descriptionTitle: d, + descriptionMatches: r || [], labelEscapeNewLines: !0 }; - if (d.extraClasses = o.iconClasses, d.italic = o.italic, d.strikethrough = o.strikethrough, i.entry.classList.remove("quick-input-list-separator-as-item"), i.label.setLabel(n.saneLabel, n.saneDescription, d), i.keybinding.set(o.keybinding), n.saneDetail) { - let g; - n.saneTooltip || (g = { + if (a.extraClasses = o.iconClasses, a.italic = o.italic, a.strikethrough = o.strikethrough, i.entry.classList.remove("quick-input-list-separator-as-item"), i.label.setLabel(n.saneLabel, n.saneDescription, a), i.keybinding.set(o.keybinding), n.saneDetail) { + let m; + n.saneTooltip || (m = { markdown: { value: n.saneDetail, supportThemeIcons: !0 }, markdownNotSupportedFallback: n.saneDetail }), i.detail.element.style.display = "", i.detail.setLabel(n.saneDetail, void 0, { - matches: a, - title: g, + matches: c, + title: m, labelEscapeNewLines: !0 }); } else i.detail.element.style.display = "none"; (u = n.separator) != null && u.label ? (i.separator.textContent = n.separator.label, i.separator.style.display = "", this.addItemWithSeparator(n)) : i.separator.style.display = "none", i.entry.classList.toggle("quick-input-list-separator-border", !!n.separator); const h = o.buttons; - h && h.length ? (i.actionBar.push(h.map((g, m) => rw(g, `id-${m}`, () => n.fireButtonTriggered({ button: g, item: n.item }))), { icon: !0, label: !1 }), i.entry.classList.add("has-actions")) : i.entry.classList.remove("has-actions"); + h && h.length ? (i.actionBar.push(h.map((m, b) => Zy(m, `id-${b}`, () => n.fireButtonTriggered({ button: m, item: n.item }))), { icon: !0, label: !1 }), i.entry.classList.add("has-actions")) : i.entry.classList.remove("has-actions"); } disposeElement(e, t, i) { this.removeItemWithSeparator(e.element), super.disposeElement(e, t, i); @@ -103055,16 +103055,16 @@ let GM = (om = class extends j7 { const t = this._itemsWithSeparatorsFrequency.get(e) || 0; t > 1 ? this._itemsWithSeparatorsFrequency.set(e, t - 1) : this._itemsWithSeparatorsFrequency.delete(e); } -}, UG = om, om.ID = "quickpickitem", om); -GM = UG = aN([ - JG(1, Pi) -], GM); -const w_ = class w_ extends j7 { +}, pk = ab, ab.ID = "quickpickitem", ab); +jI = pk = VC([ + bk(1, Ki) +], jI); +const YS = class YS extends M8 { constructor() { super(...arguments), this._visibleSeparatorsFrequency = /* @__PURE__ */ new Map(); } get templateId() { - return w_.ID; + return YS.ID; } get visibleSeparators() { return [...this._visibleSeparatorsFrequency.keys()]; @@ -103079,24 +103079,24 @@ const w_ = class w_ extends j7 { renderElement(e, t, i) { const n = e.element; i.element = n, n.element = i.entry ?? void 0, n.element.classList.toggle("focus-inside", !!n.focusInsideSeparator); - const o = n.separator, { labelHighlights: r, descriptionHighlights: l, detailHighlights: a } = n; + const o = n.separator, { labelHighlights: l, descriptionHighlights: r, detailHighlights: c } = n; i.icon.style.backgroundImage = "", i.icon.className = ""; - let c; - !n.saneTooltip && n.saneDescription && (c = { + let d; + !n.saneTooltip && n.saneDescription && (d = { markdown: { value: n.saneDescription, supportThemeIcons: !0 }, markdownNotSupportedFallback: n.saneDescription }); - const d = { - matches: r || [], + const a = { + matches: l || [], // If we have a tooltip, we want that to be shown and not any other hover - descriptionTitle: c, - descriptionMatches: l || [], + descriptionTitle: d, + descriptionMatches: r || [], labelEscapeNewLines: !0 }; - if (i.entry.classList.add("quick-input-list-separator-as-item"), i.label.setLabel(n.saneLabel, n.saneDescription, d), n.saneDetail) { + if (i.entry.classList.add("quick-input-list-separator-as-item"), i.label.setLabel(n.saneLabel, n.saneDescription, a), n.saneDetail) { let u; n.saneTooltip || (u = { markdown: { @@ -103105,7 +103105,7 @@ const w_ = class w_ extends j7 { }, markdownNotSupportedFallback: n.saneDetail }), i.detail.element.style.display = "", i.detail.setLabel(n.saneDetail, void 0, { - matches: a, + matches: c, title: u, labelEscapeNewLines: !0 }); @@ -103113,7 +103113,7 @@ const w_ = class w_ extends j7 { i.detail.element.style.display = "none"; i.separator.style.display = "none", i.entry.classList.add("quick-input-list-separator-border"); const h = o.buttons; - h && h.length ? (i.actionBar.push(h.map((u, g) => rw(u, `id-${g}`, () => n.fireSeparatorButtonTriggered({ button: u, separator: n.separator }))), { icon: !0, label: !1 }), i.entry.classList.add("has-actions")) : i.entry.classList.remove("has-actions"), this.addSeparator(n); + h && h.length ? (i.actionBar.push(h.map((u, m) => Zy(u, `id-${m}`, () => n.fireSeparatorButtonTriggered({ button: u, separator: n.separator }))), { icon: !0, label: !1 }), i.entry.classList.add("has-actions")) : i.entry.classList.remove("has-actions"), this.addSeparator(n); } disposeElement(e, t, i) { var n; @@ -103127,28 +103127,28 @@ const w_ = class w_ extends j7 { t > 1 ? this._visibleSeparatorsFrequency.set(e, t - 1) : this._visibleSeparatorsFrequency.delete(e); } }; -w_.ID = "quickpickseparator"; -let RM = w_, tC = class extends R { - constructor(e, t, i, n, o, r) { - super(), this.parent = e, this.hoverDelegate = t, this.linkOpenerDelegate = i, this.accessibilityService = r, this._onKeyDown = new k(), this._onLeave = new k(), this.onLeave = this._onLeave.event, this._visibleCountObservable = Oe("VisibleCount", 0), this.onChangedVisibleCount = se.fromObservable(this._visibleCountObservable, this._store), this._allVisibleCheckedObservable = Oe("AllVisibleChecked", !1), this.onChangedAllVisibleChecked = se.fromObservable(this._allVisibleCheckedObservable, this._store), this._checkedCountObservable = Oe("CheckedCount", 0), this.onChangedCheckedCount = se.fromObservable(this._checkedCountObservable, this._store), this._checkedElementsObservable = Ov({ equalsFn: ei }, new Array()), this.onChangedCheckedElements = se.fromObservable(this._checkedElementsObservable, this._store), this._onButtonTriggered = new k(), this.onButtonTriggered = this._onButtonTriggered.event, this._onSeparatorButtonTriggered = new k(), this.onSeparatorButtonTriggered = this._onSeparatorButtonTriggered.event, this._elementChecked = new k(), this._elementCheckedEventBufferer = new aC(), this._hasCheckboxes = !1, this._inputElements = new Array(), this._elementTree = new Array(), this._itemElements = new Array(), this._elementDisposable = this._register(new U()), this._matchOnDescription = !1, this._matchOnDetail = !1, this._matchOnLabel = !0, this._matchOnLabelMode = "fuzzy", this._sortByLabel = !0, this._shouldLoop = !0, this._container = Q(this.parent, ll(".quick-input-list")), this._separatorRenderer = new RM(t), this._itemRenderer = o.createInstance(GM, t), this._tree = this._register(o.createInstance(hD, "QuickInput", this._container, new VZe(), [this._itemRenderer, this._separatorRenderer], { +YS.ID = "quickpickseparator"; +let qI = YS, mG = class extends J { + constructor(e, t, i, n, o, l) { + super(), this.parent = e, this.hoverDelegate = t, this.linkOpenerDelegate = i, this.accessibilityService = l, this._onKeyDown = new k(), this._onLeave = new k(), this.onLeave = this._onLeave.event, this._visibleCountObservable = Ue("VisibleCount", 0), this.onChangedVisibleCount = se.fromObservable(this._visibleCountObservable, this._store), this._allVisibleCheckedObservable = Ue("AllVisibleChecked", !1), this.onChangedAllVisibleChecked = se.fromObservable(this._allVisibleCheckedObservable, this._store), this._checkedCountObservable = Ue("CheckedCount", 0), this.onChangedCheckedCount = se.fromObservable(this._checkedCountObservable, this._store), this._checkedElementsObservable = uT({ equalsFn: ti }, new Array()), this.onChangedCheckedElements = se.fromObservable(this._checkedElementsObservable, this._store), this._onButtonTriggered = new k(), this.onButtonTriggered = this._onButtonTriggered.event, this._onSeparatorButtonTriggered = new k(), this.onSeparatorButtonTriggered = this._onSeparatorButtonTriggered.event, this._elementChecked = new k(), this._elementCheckedEventBufferer = new GG(), this._hasCheckboxes = !1, this._inputElements = new Array(), this._elementTree = new Array(), this._itemElements = new Array(), this._elementDisposable = this._register(new _()), this._matchOnDescription = !1, this._matchOnDetail = !1, this._matchOnLabel = !0, this._matchOnLabelMode = "fuzzy", this._sortByLabel = !0, this._shouldLoop = !0, this._container = O(this.parent, ar(".quick-input-list")), this._separatorRenderer = new qI(t), this._itemRenderer = o.createInstance(jI, t), this._tree = this._register(o.createInstance(TM, "QuickInput", this._container, new SSe(), [this._itemRenderer, this._separatorRenderer], { filter: { - filter(l) { - return l.hidden ? 0 : l instanceof Wu ? 2 : 1; + filter(r) { + return r.hidden ? 0 : r instanceof ku ? 2 : 1; } }, sorter: { - compare: (l, a) => { + compare: (r, c) => { if (!this.sortByLabel || !this._lastQueryString) return 0; - const c = this._lastQueryString.toLowerCase(); - return RZe(l, a, c); + const d = this._lastQueryString.toLowerCase(); + return RSe(r, c, d); } }, - accessibilityProvider: new kZe(), + accessibilityProvider: new xSe(), setRowLineHeight: !1, multipleSelectionSupport: !1, hideTwistiesOfChildlessElements: !0, - renderIndentGuides: Ib.None, + renderIndentGuides: YZ.None, findWidgetEnabled: !1, indent: 0, horizontalScrolling: !1, @@ -103158,11 +103158,11 @@ let RM = w_, tC = class extends R { } //#region public getters/setters get onDidChangeFocus() { - return se.map(this._tree.onDidChangeFocus, (e) => e.elements.filter((t) => t instanceof Cn).map((t) => t.item), this._store); + return se.map(this._tree.onDidChangeFocus, (e) => e.elements.filter((t) => t instanceof Gn).map((t) => t.item), this._store); } get onDidChangeSelection() { return se.map(this._tree.onDidChangeSelection, (e) => ({ - items: e.elements.filter((t) => t instanceof Cn).map((t) => t.item), + items: e.elements.filter((t) => t instanceof Gn).map((t) => t.item), event: e.browserEvent }), this._store); } @@ -103230,7 +103230,7 @@ let RM = w_, tC = class extends R { } _registerOnKeyDown() { this._register(this._tree.onKeyDown((e) => { - const t = new Vt(e); + const t = new Yt(e); switch (t.keyCode) { case 10: this.toggleCheckbox(); @@ -103264,29 +103264,29 @@ let RM = w_, tC = class extends R { })); } _registerHoverListeners() { - const e = this._register(new MH(this.hoverDelegate.delay)); + const e = this._register(new rB(this.hoverDelegate.delay)); this._register(this._tree.onMouseOver(async (t) => { var i; - if (tF(t.browserEvent.target)) { + if (SD(t.browserEvent.target)) { e.cancel(); return; } if ( // anchors are an exception as called out above so we skip them here - !(!tF(t.browserEvent.relatedTarget) && // check if the mouse is still over the same element - Ji(t.browserEvent.relatedTarget, (i = t.element) == null ? void 0 : i.element)) + !(!SD(t.browserEvent.relatedTarget) && // check if the mouse is still over the same element + _i(t.browserEvent.relatedTarget, (i = t.element) == null ? void 0 : i.element)) ) try { await e.trigger(async () => { - t.element instanceof Cn && this.showHover(t.element); + t.element instanceof Gn && this.showHover(t.element); }); } catch (n) { - if (!jr(n)) + if (!er(n)) throw n; } })), this._register(this._tree.onMouseOut((t) => { var i; - Ji(t.browserEvent.relatedTarget, (i = t.element) == null ? void 0 : i.element) || e.cancel(); + _i(t.browserEvent.relatedTarget, (i = t.element) == null ? void 0 : i.element) || e.cancel(); })); } /** @@ -103298,28 +103298,28 @@ let RM = w_, tC = class extends R { const t = e.elements[0] ? this._tree.getParentElement(e.elements[0]) : null; for (const i of this._separatorRenderer.visibleSeparators) { const n = i === t; - !!(i.focusInsideSeparator & ha.ACTIVE_ITEM) !== n && (n ? i.focusInsideSeparator |= ha.ACTIVE_ITEM : i.focusInsideSeparator &= ~ha.ACTIVE_ITEM, this._tree.rerender(i)); + !!(i.focusInsideSeparator & pc.ACTIVE_ITEM) !== n && (n ? i.focusInsideSeparator |= pc.ACTIVE_ITEM : i.focusInsideSeparator &= ~pc.ACTIVE_ITEM, this._tree.rerender(i)); } })), this._register(this._tree.onMouseOver((e) => { const t = e.element ? this._tree.getParentElement(e.element) : null; for (const i of this._separatorRenderer.visibleSeparators) { if (i !== t) continue; - !!(i.focusInsideSeparator & ha.MOUSE_HOVER) || (i.focusInsideSeparator |= ha.MOUSE_HOVER, this._tree.rerender(i)); + !!(i.focusInsideSeparator & pc.MOUSE_HOVER) || (i.focusInsideSeparator |= pc.MOUSE_HOVER, this._tree.rerender(i)); } })), this._register(this._tree.onMouseOut((e) => { const t = e.element ? this._tree.getParentElement(e.element) : null; for (const i of this._separatorRenderer.visibleSeparators) { if (i !== t) continue; - !!(i.focusInsideSeparator & ha.MOUSE_HOVER) && (i.focusInsideSeparator &= ~ha.MOUSE_HOVER, this._tree.rerender(i)); + !!(i.focusInsideSeparator & pc.MOUSE_HOVER) && (i.focusInsideSeparator &= ~pc.MOUSE_HOVER, this._tree.rerender(i)); } })); } _registerSelectionChangeListener() { this._register(this._tree.onDidChangeSelection((e) => { - const t = e.elements.filter((i) => i instanceof Cn); - t.length !== e.elements.length && (e.elements.length === 1 && e.elements[0] instanceof Wu && (this._tree.setFocus([e.elements[0].children[0]]), this._tree.reveal(e.elements[0], 0)), this._tree.setSelection(t)); + const t = e.elements.filter((i) => i instanceof Gn); + t.length !== e.elements.length && (e.elements.length === 1 && e.elements[0] instanceof ku && (this._tree.setFocus([e.elements[0].children[0]]), this._tree.reveal(e.elements[0], 0)), this._tree.setSelection(t)); })); } //#endregion @@ -103335,21 +103335,21 @@ let RM = w_, tC = class extends R { this._elementDisposable.clear(), this._lastQueryString = void 0, this._inputElements = e, this._hasCheckboxes = this.parent.classList.contains("show-checkboxes"); let t; this._itemElements = new Array(), this._elementTree = e.reduce((i, n, o) => { - let r; + let l; if (n.type === "separator") { if (!n.buttons) return i; - t = new Wu(o, (l) => this._onSeparatorButtonTriggered.fire(l), n), r = t; + t = new ku(o, (r) => this._onSeparatorButtonTriggered.fire(r), n), l = t; } else { - const l = o > 0 ? e[o - 1] : void 0; - let a; - l && l.type === "separator" && !l.buttons && (t = void 0, a = l); - const c = new Cn(o, this._hasCheckboxes, (d) => this._onButtonTriggered.fire(d), this._elementChecked, n, a); - if (this._itemElements.push(c), t) - return t.children.push(c), i; - r = c; - } - return i.push(r), i; + const r = o > 0 ? e[o - 1] : void 0; + let c; + r && r.type === "separator" && !r.buttons && (t = void 0, c = r); + const d = new Gn(o, this._hasCheckboxes, (a) => this._onButtonTriggered.fire(a), this._elementChecked, n, c); + if (this._itemElements.push(d), t) + return t.children.push(d), i; + l = d; + } + return i.push(l), i; }, new Array()), this._setElementsToTree(this._elementTree), this.accessibilityService.isScreenReaderOptimized() && setTimeout(() => { const i = this._tree.getHTMLElement().querySelector(".monaco-list-row.focused"), n = i == null ? void 0 : i.parentNode; if (i && n) { @@ -103387,75 +103387,75 @@ let RM = w_, tC = class extends R { focus(e) { var t; if (this._itemElements.length) - switch (e === Xt.Second && this._itemElements.length < 2 && (e = Xt.First), e) { - case Xt.First: - this._tree.scrollTop = 0, this._tree.focusFirst(void 0, (i) => i.element instanceof Cn); + switch (e === Et.Second && this._itemElements.length < 2 && (e = Et.First), e) { + case Et.First: + this._tree.scrollTop = 0, this._tree.focusFirst(void 0, (i) => i.element instanceof Gn); break; - case Xt.Second: { + case Et.Second: { this._tree.scrollTop = 0; let i = !1; - this._tree.focusFirst(void 0, (n) => n.element instanceof Cn ? i ? !0 : (i = !i, !1) : !1); + this._tree.focusFirst(void 0, (n) => n.element instanceof Gn ? i ? !0 : (i = !i, !1) : !1); break; } - case Xt.Last: - this._tree.scrollTop = this._tree.scrollHeight, this._tree.focusLast(void 0, (i) => i.element instanceof Cn); + case Et.Last: + this._tree.scrollTop = this._tree.scrollHeight, this._tree.focusLast(void 0, (i) => i.element instanceof Gn); break; - case Xt.Next: { + case Et.Next: { const i = this._tree.getFocus(); - this._tree.focusNext(void 0, this._shouldLoop, void 0, (o) => o.element instanceof Cn ? (this._tree.reveal(o.element), !0) : !1); + this._tree.focusNext(void 0, this._shouldLoop, void 0, (o) => o.element instanceof Gn ? (this._tree.reveal(o.element), !0) : !1); const n = this._tree.getFocus(); i.length && i[0] === n[0] && i[0] === this._itemElements[this._itemElements.length - 1] && this._onLeave.fire(); break; } - case Xt.Previous: { + case Et.Previous: { const i = this._tree.getFocus(); this._tree.focusPrevious(void 0, this._shouldLoop, void 0, (o) => { - if (!(o.element instanceof Cn)) + if (!(o.element instanceof Gn)) return !1; - const r = this._tree.getParentElement(o.element); - return r === null || r.children[0] !== o.element ? this._tree.reveal(o.element) : this._tree.reveal(r), !0; + const l = this._tree.getParentElement(o.element); + return l === null || l.children[0] !== o.element ? this._tree.reveal(o.element) : this._tree.reveal(l), !0; }); const n = this._tree.getFocus(); i.length && i[0] === n[0] && i[0] === this._itemElements[0] && this._onLeave.fire(); break; } - case Xt.NextPage: - this._tree.focusNextPage(void 0, (i) => i.element instanceof Cn ? (this._tree.reveal(i.element), !0) : !1); + case Et.NextPage: + this._tree.focusNextPage(void 0, (i) => i.element instanceof Gn ? (this._tree.reveal(i.element), !0) : !1); break; - case Xt.PreviousPage: + case Et.PreviousPage: this._tree.focusPreviousPage(void 0, (i) => { - if (!(i.element instanceof Cn)) + if (!(i.element instanceof Gn)) return !1; const n = this._tree.getParentElement(i.element); return n === null || n.children[0] !== i.element ? this._tree.reveal(i.element) : this._tree.reveal(n), !0; }); break; - case Xt.NextSeparator: { + case Et.NextSeparator: { let i = !1; const n = this._tree.getFocus()[0]; - this._tree.focusNext(void 0, !0, void 0, (r) => { + this._tree.focusNext(void 0, !0, void 0, (l) => { if (i) return !0; - if (r.element instanceof Wu) - i = !0, this._separatorRenderer.isSeparatorVisible(r.element) ? this._tree.reveal(r.element.children[0]) : this._tree.reveal(r.element, 0); - else if (r.element instanceof Cn) { - if (r.element.separator) - return this._itemRenderer.isItemWithSeparatorVisible(r.element) ? this._tree.reveal(r.element) : this._tree.reveal(r.element, 0), !0; - if (r.element === this._elementTree[0]) - return this._tree.reveal(r.element, 0), !0; + if (l.element instanceof ku) + i = !0, this._separatorRenderer.isSeparatorVisible(l.element) ? this._tree.reveal(l.element.children[0]) : this._tree.reveal(l.element, 0); + else if (l.element instanceof Gn) { + if (l.element.separator) + return this._itemRenderer.isItemWithSeparatorVisible(l.element) ? this._tree.reveal(l.element) : this._tree.reveal(l.element, 0), !0; + if (l.element === this._elementTree[0]) + return this._tree.reveal(l.element, 0), !0; } return !1; }); const o = this._tree.getFocus()[0]; - n === o && (this._tree.scrollTop = this._tree.scrollHeight, this._tree.focusLast(void 0, (r) => r.element instanceof Cn)); + n === o && (this._tree.scrollTop = this._tree.scrollHeight, this._tree.focusLast(void 0, (l) => l.element instanceof Gn)); break; } - case Xt.PreviousSeparator: { + case Et.PreviousSeparator: { let i, n = !!((t = this._tree.getFocus()[0]) != null && t.separator); this._tree.focusPrevious(void 0, !0, void 0, (o) => { - if (o.element instanceof Wu) + if (o.element instanceof ku) n ? i || (this._separatorRenderer.isSeparatorVisible(o.element) ? this._tree.reveal(o.element) : this._tree.reveal(o.element, 0), i = o.element.children[0]) : n = !0; - else if (o.element instanceof Cn && !i) { + else if (o.element instanceof Gn && !i) { if (o.element.separator) this._itemRenderer.isItemWithSeparatorVisible(o.element) ? this._tree.reveal(o.element) : this._tree.reveal(o.element, 0), i = o.element; else if (o.element === this._elementTree[0]) @@ -103491,11 +103491,11 @@ let RM = w_, tC = class extends R { let i; this._itemElements.forEach((n) => { let o; - this.matchOnLabelMode === "fuzzy" ? o = this.matchOnLabel ? cW(e, hy(n.saneLabel)) ?? void 0 : void 0 : o = this.matchOnLabel ? GZe(t, hy(n.saneLabel)) ?? void 0 : void 0; - const r = this.matchOnDescription ? cW(e, hy(n.saneDescription || "")) ?? void 0 : void 0, l = this.matchOnDetail ? cW(e, hy(n.saneDetail || "")) ?? void 0 : void 0; - if (o || r || l ? (n.labelHighlights = o, n.descriptionHighlights = r, n.detailHighlights = l, n.hidden = !1) : (n.labelHighlights = void 0, n.descriptionHighlights = void 0, n.detailHighlights = void 0, n.hidden = n.item ? !n.item.alwaysShow : !0), n.item ? n.separator = void 0 : n.separator && (n.hidden = !0), !this.sortByLabel) { - const a = n.index && this._inputElements[n.index - 1] || void 0; - (a == null ? void 0 : a.type) === "separator" && !a.buttons && (i = a), i && !n.hidden && (n.separator = i, i = void 0); + this.matchOnLabelMode === "fuzzy" ? o = this.matchOnLabel ? IR(e, Gf(n.saneLabel)) ?? void 0 : void 0 : o = this.matchOnLabel ? CSe(t, Gf(n.saneLabel)) ?? void 0 : void 0; + const l = this.matchOnDescription ? IR(e, Gf(n.saneDescription || "")) ?? void 0 : void 0, r = this.matchOnDetail ? IR(e, Gf(n.saneDetail || "")) ?? void 0 : void 0; + if (o || l || r ? (n.labelHighlights = o, n.descriptionHighlights = l, n.detailHighlights = r, n.hidden = !1) : (n.labelHighlights = void 0, n.descriptionHighlights = void 0, n.detailHighlights = void 0, n.hidden = n.item ? !n.item.alwaysShow : !0), n.item ? n.separator = void 0 : n.separator && (n.hidden = !0), !this.sortByLabel) { + const c = n.index && this._inputElements[n.index - 1] || void 0; + (c == null ? void 0 : c.type) === "separator" && !c.buttons && (i = c), i && !n.hidden && (n.separator = i, i = void 0); } }); } @@ -103503,7 +103503,7 @@ let RM = w_, tC = class extends R { } toggleCheckbox() { this._elementCheckedEventBufferer.bufferEvents(() => { - const e = this._tree.getFocus().filter((i) => i instanceof Cn), t = this._allVisibleChecked(e); + const e = this._tree.getFocus().filter((i) => i instanceof Gn), t = this._allVisibleChecked(e); for (const i of e) i.checkboxDisabled || (i.checked = !t); }); @@ -103513,16 +103513,16 @@ let RM = w_, tC = class extends R { } toggleHover() { const e = this._tree.getFocus()[0]; - if (!(e != null && e.saneTooltip) || !(e instanceof Cn)) + if (!(e != null && e.saneTooltip) || !(e instanceof Gn)) return; if (this._lastHover && !this._lastHover.isDisposed) { this._lastHover.dispose(); return; } this.showHover(e); - const t = new U(); + const t = new _(); t.add(this._tree.onDidChangeFocus((i) => { - i.elements[0] instanceof Cn && this.showHover(i.elements[0]); + i.elements[0] instanceof Gn && this.showHover(i.elements[0]); })), this._lastHover && t.add(this._lastHover), this._elementDisposable.add(t); } //#endregion @@ -103530,7 +103530,7 @@ let RM = w_, tC = class extends R { _setElementsToTree(e) { const t = new Array(); for (const i of e) - i instanceof Wu ? t.push({ + i instanceof ku ? t.push({ element: i, collapsible: !1, collapsed: !1, @@ -103558,7 +103558,7 @@ let RM = w_, tC = class extends R { return t; } _updateCheckedObservables() { - oi((e) => { + li((e) => { this._allVisibleCheckedObservable.set(this._allVisibleChecked(this._itemElements, !1), e); const t = this._itemElements.filter((i) => i.checked).length; this._checkedCountObservable.set(t, e), this._checkedElementsObservable.set(this.getCheckedElements(), e); @@ -103587,76 +103587,76 @@ let RM = w_, tC = class extends R { }, !1)); } }; -aN([ - Zi -], tC.prototype, "onDidChangeFocus", null); -aN([ - Zi -], tC.prototype, "onDidChangeSelection", null); -tC = aN([ - JG(4, Se), - JG(5, yo) -], tC); -function GZe(s, e) { +VC([ + xi +], mG.prototype, "onDidChangeFocus", null); +VC([ + xi +], mG.prototype, "onDidChangeSelection", null); +mG = VC([ + bk(4, Ge), + bk(5, Wo) +], mG); +function CSe(s, e) { const { text: t, iconOffsets: i } = e; if (!i || i.length === 0) - return TB(s, t); - const n = I_(t, " "), o = t.length - n.length, r = TB(s, n); - if (r) - for (const l of r) { - const a = i[l.start + o] + o; - l.start += a, l.end += a; + return nU(s, t); + const n = AS(t, " "), o = t.length - n.length, l = nU(s, n); + if (l) + for (const r of l) { + const c = i[r.start + o] + o; + r.start += c, r.end += c; } - return r; + return l; } -function TB(s, e) { +function nU(s, e) { const t = e.toLowerCase().indexOf(s.toLowerCase()); return t !== -1 ? [{ start: t, end: t + s.length }] : null; } -function RZe(s, e, t) { +function RSe(s, e, t) { const i = s.labelHighlights || [], n = e.labelHighlights || []; - return i.length && !n.length ? -1 : !i.length && n.length ? 1 : i.length === 0 && n.length === 0 ? 0 : TZe(s.saneSortLabel, e.saneSortLabel, t); + return i.length && !n.length ? -1 : !i.length && n.length ? 1 : i.length === 0 && n.length === 0 ? 0 : LSe(s.saneSortLabel, e.saneSortLabel, t); } -const q7 = { +const Y8 = { weight: 200, - when: H.and(H.equals( - U7, + when: P.and(P.equals( + N8, "quickPick" /* QuickInputType.QuickPick */ - ), xZe), + ), gSe), metadata: { description: p("quickPick", "Used while in the context of the quick pick. If you change one keybinding for this command, you should change all of the other keybindings (modifier variants) of this command as well.") } }; -function to(s, e = {}) { - ws.registerCommandAndKeybindingRule({ - ...q7, +function no(s, e = {}) { + Gs.registerCommandAndKeybindingRule({ + ...Y8, ...s, - secondary: EZe(s.primary, s.secondary ?? [], e) + secondary: NSe(s.primary, s.secondary ?? [], e) }); } -const EM = qe ? 256 : 2048; -function EZe(s, e, t = {}) { - return t.withAltMod && e.push(512 + s), t.withCtrlMod && (e.push(EM + s), t.withAltMod && e.push(512 + EM + s)), t.withCmdMod && qe && (e.push(2048 + s), t.withCtrlMod && e.push(2304 + s), t.withAltMod && (e.push(2560 + s), t.withCtrlMod && e.push(2816 + s))), e; +const $I = qe ? 256 : 2048; +function NSe(s, e, t = {}) { + return t.withAltMod && e.push(512 + s), t.withCtrlMod && (e.push($I + s), t.withAltMod && e.push(512 + $I + s)), t.withCmdMod && qe && (e.push(2048 + s), t.withCtrlMod && e.push(2304 + s), t.withAltMod && (e.push(2560 + s), t.withCtrlMod && e.push(2816 + s))), e; } -function No(s, e) { +function wo(s, e) { return (t) => { - const i = t.get(ld).currentQuickInput; + const i = t.get(ha).currentQuickInput; if (i) return e && i.quickNavigate ? i.focus(e) : i.focus(s); }; } -to({ id: "quickInput.pageNext", primary: 12, handler: No(Xt.NextPage) }, { withAltMod: !0, withCtrlMod: !0, withCmdMod: !0 }); -to({ id: "quickInput.pagePrevious", primary: 11, handler: No(Xt.PreviousPage) }, { withAltMod: !0, withCtrlMod: !0, withCmdMod: !0 }); -to({ id: "quickInput.first", primary: EM + 14, handler: No(Xt.First) }, { withAltMod: !0, withCmdMod: !0 }); -to({ id: "quickInput.last", primary: EM + 13, handler: No(Xt.Last) }, { withAltMod: !0, withCmdMod: !0 }); -to({ id: "quickInput.next", primary: 18, handler: No(Xt.Next) }, { withCtrlMod: !0 }); -to({ id: "quickInput.previous", primary: 16, handler: No(Xt.Previous) }, { withCtrlMod: !0 }); -const DB = p("quickInput.nextSeparatorWithQuickAccessFallback", "If we're in quick access mode, this will navigate to the next item. If we are not in quick access mode, this will navigate to the next separator."), VB = p("quickInput.previousSeparatorWithQuickAccessFallback", "If we're in quick access mode, this will navigate to the previous item. If we are not in quick access mode, this will navigate to the previous separator."); -qe ? (to({ +no({ id: "quickInput.pageNext", primary: 12, handler: wo(Et.NextPage) }, { withAltMod: !0, withCtrlMod: !0, withCmdMod: !0 }); +no({ id: "quickInput.pagePrevious", primary: 11, handler: wo(Et.PreviousPage) }, { withAltMod: !0, withCtrlMod: !0, withCmdMod: !0 }); +no({ id: "quickInput.first", primary: $I + 14, handler: wo(Et.First) }, { withAltMod: !0, withCmdMod: !0 }); +no({ id: "quickInput.last", primary: $I + 13, handler: wo(Et.Last) }, { withAltMod: !0, withCmdMod: !0 }); +no({ id: "quickInput.next", primary: 18, handler: wo(Et.Next) }, { withCtrlMod: !0 }); +no({ id: "quickInput.previous", primary: 16, handler: wo(Et.Previous) }, { withCtrlMod: !0 }); +const sU = p("quickInput.nextSeparatorWithQuickAccessFallback", "If we're in quick access mode, this will navigate to the next item. If we are not in quick access mode, this will navigate to the next separator."), oU = p("quickInput.previousSeparatorWithQuickAccessFallback", "If we're in quick access mode, this will navigate to the previous item. If we are not in quick access mode, this will navigate to the previous separator."); +qe ? (no({ id: "quickInput.nextSeparatorWithQuickAccessFallback", primary: 2066, - handler: No(Xt.NextSeparator, Xt.Next), - metadata: { description: DB } -}), to({ + handler: wo(Et.NextSeparator, Et.Next), + metadata: { description: sU } +}), no({ id: "quickInput.nextSeparator", primary: 2578, // Since macOS has the cmd key as the primary modifier, we need to add this additional @@ -103665,13 +103665,13 @@ qe ? (to({ 2322 /* KeyCode.DownArrow */ ], - handler: No(Xt.NextSeparator) -}, { withCtrlMod: !0 }), to({ + handler: wo(Et.NextSeparator) +}, { withCtrlMod: !0 }), no({ id: "quickInput.previousSeparatorWithQuickAccessFallback", primary: 2064, - handler: No(Xt.PreviousSeparator, Xt.Previous), - metadata: { description: VB } -}), to({ + handler: wo(Et.PreviousSeparator, Et.Previous), + metadata: { description: oU } +}), no({ id: "quickInput.previousSeparator", primary: 2576, // Since macOS has the cmd key as the primary modifier, we need to add this additional @@ -103680,52 +103680,52 @@ qe ? (to({ 2320 /* KeyCode.UpArrow */ ], - handler: No(Xt.PreviousSeparator) -}, { withCtrlMod: !0 })) : (to({ + handler: wo(Et.PreviousSeparator) +}, { withCtrlMod: !0 })) : (no({ id: "quickInput.nextSeparatorWithQuickAccessFallback", primary: 530, - handler: No(Xt.NextSeparator, Xt.Next), - metadata: { description: DB } -}), to({ + handler: wo(Et.NextSeparator, Et.Next), + metadata: { description: sU } +}), no({ id: "quickInput.nextSeparator", primary: 2578, - handler: No(Xt.NextSeparator) -}), to({ + handler: wo(Et.NextSeparator) +}), no({ id: "quickInput.previousSeparatorWithQuickAccessFallback", primary: 528, - handler: No(Xt.PreviousSeparator, Xt.Previous), - metadata: { description: VB } -}), to({ + handler: wo(Et.PreviousSeparator, Et.Previous), + metadata: { description: oU } +}), no({ id: "quickInput.previousSeparator", primary: 2576, - handler: No(Xt.PreviousSeparator) + handler: wo(Et.PreviousSeparator) })); -to({ +no({ id: "quickInput.acceptInBackground", // If we are in the quick pick but the input box is not focused or our cursor is at the end of the input box - when: H.and(q7.when, H.or(KQ.negate(), _Ze)), + when: P.and(Y8.when, P.or(w4.negate(), ySe)), primary: 17, // Need a little extra weight to ensure this keybinding is preferred over the default cmd+alt+right arrow keybinding // https://github.com/microsoft/vscode/blob/1451e4fbbbf074a4355cc537c35b547b80ce1c52/src/vs/workbench/browser/parts/editor/editorActions.ts#L1178-L1195 weight: 250, handler: (s) => { - const e = s.get(ld).currentQuickInput; + const e = s.get(ha).currentQuickInput; e == null || e.accept(!0); } }, { withAltMod: !0, withCtrlMod: !0, withCmdMod: !0 }); -var XZe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var wSe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, r2 = function(s, e) { +}, XN = function(s, e) { return function(t, i) { e(t, i, s); }; -}, KG; -const Ks = ce; -var rm; -let QG = (rm = class extends R { +}, gk; +const js = de; +var hb; +let Zk = (hb = class extends J { // Max total width of quick input widget get currentQuickInput() { return this.controller ?? void 0; @@ -103734,8 +103734,8 @@ let QG = (rm = class extends R { return this._container; } constructor(e, t, i, n) { - super(), this.options = e, this.layoutService = t, this.instantiationService = i, this.contextKeyService = n, this.enabled = !0, this.onDidAcceptEmitter = this._register(new k()), this.onDidCustomEmitter = this._register(new k()), this.onDidTriggerButtonEmitter = this._register(new k()), this.keyMods = { ctrlCmd: !1, alt: !1 }, this.controller = null, this.onShowEmitter = this._register(new k()), this.onShow = this.onShowEmitter.event, this.onHideEmitter = this._register(new k()), this.onHide = this.onHideEmitter.event, this.inQuickInputContext = AZe.bindTo(this.contextKeyService), this.quickInputTypeContext = MZe.bindTo(this.contextKeyService), this.endOfQuickInputBoxContext = ZZe.bindTo(this.contextKeyService), this.idPrefix = e.idPrefix, this._container = e.container, this.styles = e.styles, this._register(se.runAndSubscribe(D_, ({ window: o, disposables: r }) => this.registerKeyModsListeners(o, r), { window: vt, disposables: this._store })), this._register(Pq((o) => { - this.ui && xe(this.ui.container) === o && (this.reparentUI(this.layoutService.mainContainer), this.layout(this.layoutService.mainContainerDimension, this.layoutService.mainContainerOffset.quickPickTop)); + super(), this.options = e, this.layoutService = t, this.instantiationService = i, this.contextKeyService = n, this.enabled = !0, this.onDidAcceptEmitter = this._register(new k()), this.onDidCustomEmitter = this._register(new k()), this.onDidTriggerButtonEmitter = this._register(new k()), this.keyMods = { ctrlCmd: !1, alt: !1 }, this.controller = null, this.onShowEmitter = this._register(new k()), this.onShow = this.onShowEmitter.event, this.onHideEmitter = this._register(new k()), this.onHide = this.onHideEmitter.event, this.inQuickInputContext = pSe.bindTo(this.contextKeyService), this.quickInputTypeContext = ZSe.bindTo(this.contextKeyService), this.endOfQuickInputBoxContext = fSe.bindTo(this.contextKeyService), this.idPrefix = e.idPrefix, this._container = e.container, this.styles = e.styles, this._register(se.runAndSubscribe(_S, ({ window: o, disposables: l }) => this.registerKeyModsListeners(o, l), { window: wt, disposables: this._store })), this._register(k$((o) => { + this.ui && Le(this.ui.container) === o && (this.reparentUI(this.layoutService.mainContainer), this.layout(this.layoutService.mainContainerDimension, this.layoutService.mainContainerOffset.quickPickTop)); })); } registerKeyModsListeners(e, t) { @@ -103747,96 +103747,96 @@ let QG = (rm = class extends R { } getUI(e) { if (this.ui) - return e && xe(this._container) !== xe(this.layoutService.activeContainer) && (this.reparentUI(this.layoutService.activeContainer), this.layout(this.layoutService.activeContainerDimension, this.layoutService.activeContainerOffset.quickPickTop)), this.ui; - const t = Q(this._container, Ks(".quick-input-widget.show-file-icons")); + return e && Le(this._container) !== Le(this.layoutService.activeContainer) && (this.reparentUI(this.layoutService.activeContainer), this.layout(this.layoutService.activeContainerDimension, this.layoutService.activeContainerOffset.quickPickTop)), this.ui; + const t = O(this._container, js(".quick-input-widget.show-file-icons")); t.tabIndex = -1, t.style.display = "none"; - const i = Bo(t), n = Q(t, Ks(".quick-input-titlebar")), o = this._register(new Yo(n, { hoverDelegate: this.options.hoverDelegate })); + const i = Po(t), n = O(t, js(".quick-input-titlebar")), o = this._register(new Ao(n, { hoverDelegate: this.options.hoverDelegate })); o.domNode.classList.add("quick-input-left-action-bar"); - const r = Q(n, Ks(".quick-input-title")), l = this._register(new Yo(n, { hoverDelegate: this.options.hoverDelegate })); - l.domNode.classList.add("quick-input-right-action-bar"); - const a = Q(t, Ks(".quick-input-header")), c = Q(a, Ks("input.quick-input-check-all")); - c.type = "checkbox", c.setAttribute("aria-label", p("quickInput.checkAll", "Toggle all checkboxes")), this._register(ai(c, ie.CHANGE, (X) => { - const j = c.checked; - Y.setAllVisibleChecked(j); - })), this._register(z(c, ie.CLICK, (X) => { - (X.x || X.y) && g.setFocus(); + const l = O(n, js(".quick-input-title")), r = this._register(new Ao(n, { hoverDelegate: this.options.hoverDelegate })); + r.domNode.classList.add("quick-input-right-action-bar"); + const c = O(t, js(".quick-input-header")), d = O(c, js("input.quick-input-check-all")); + d.type = "checkbox", d.setAttribute("aria-label", p("quickInput.checkAll", "Toggle all checkboxes")), this._register(di(d, ie.CHANGE, (E) => { + const j = d.checked; + F.setAllVisibleChecked(j); + })), this._register(z(d, ie.CLICK, (E) => { + (E.x || E.y) && m.setFocus(); })); - const d = Q(a, Ks(".quick-input-description")), h = Q(a, Ks(".quick-input-and-message")), u = Q(h, Ks(".quick-input-filter")), g = this._register(new WZe(u, this.styles.inputBox, this.styles.toggle)); - g.setAttribute("aria-describedby", `${this.idPrefix}message`); - const m = Q(u, Ks(".quick-input-visible-count")); - m.setAttribute("aria-live", "polite"), m.setAttribute("aria-atomic", "true"); - const f = new gD(m, { countFormat: p({ key: "quickInput.visibleCount", comment: ["This tells the user how many items are shown in a list of items to select from. The items can be anything. Currently not visible, but read by screen readers."] }, "{0} Results") }, this.styles.countBadge), b = Q(u, Ks(".quick-input-count")); - b.setAttribute("aria-live", "polite"); - const y = new gD(b, { countFormat: p({ key: "quickInput.countSelected", comment: ["This tells the user how many items are selected in a list of items to select from. The items can be anything."] }, "{0} Selected") }, this.styles.countBadge), w = this._register(new Yo(a, { hoverDelegate: this.options.hoverDelegate })); - w.domNode.classList.add("quick-input-inline-action-bar"); - const C = Q(a, Ks(".quick-input-action")), S = this._register(new Sx(C, this.styles.button)); - S.label = p("ok", "OK"), this._register(S.onDidClick((X) => { + const a = O(c, js(".quick-input-description")), h = O(c, js(".quick-input-and-message")), u = O(h, js(".quick-input-filter")), m = this._register(new XSe(u, this.styles.inputBox, this.styles.toggle)); + m.setAttribute("aria-describedby", `${this.idPrefix}message`); + const b = O(u, js(".quick-input-visible-count")); + b.setAttribute("aria-live", "polite"), b.setAttribute("aria-atomic", "true"); + const g = new YM(b, { countFormat: p({ key: "quickInput.visibleCount", comment: ["This tells the user how many items are shown in a list of items to select from. The items can be anything. Currently not visible, but read by screen readers."] }, "{0} Results") }, this.styles.countBadge), Z = O(u, js(".quick-input-count")); + Z.setAttribute("aria-live", "polite"); + const f = new YM(Z, { countFormat: p({ key: "quickInput.countSelected", comment: ["This tells the user how many items are selected in a list of items to select from. The items can be anything."] }, "{0} Selected") }, this.styles.countBadge), y = this._register(new Ao(c, { hoverDelegate: this.options.hoverDelegate })); + y.domNode.classList.add("quick-input-inline-action-bar"); + const W = O(c, js(".quick-input-action")), G = this._register(new vL(W, this.styles.button)); + G.label = p("ok", "OK"), this._register(G.onDidClick((E) => { this.onDidAcceptEmitter.fire(); })); - const L = Q(a, Ks(".quick-input-action")), x = this._register(new Sx(L, { ...this.styles.button, supportIcons: !0 })); - x.label = p("custom", "Custom"), this._register(x.onDidClick((X) => { + const X = O(c, js(".quick-input-action")), L = this._register(new vL(X, { ...this.styles.button, supportIcons: !0 })); + L.label = p("custom", "Custom"), this._register(L.onDidClick((E) => { this.onDidCustomEmitter.fire(); })); - const Z = Q(h, Ks(`#${this.idPrefix}message.quick-input-message`)), _ = this._register(new HG(t, this.styles.progressBar)); - _.getContainer().classList.add("quick-input-progress"); - const v = Q(t, Ks(".quick-input-html-widget")); - v.tabIndex = -1; - const P = Q(t, Ks(".quick-input-description")), E = this.idPrefix + "list", Y = this._register(this.instantiationService.createInstance(tC, t, this.options.hoverDelegate, this.options.linkOpenerDelegate, E)); - g.setAttribute("aria-controls", E), this._register(Y.onDidChangeFocus(() => { - g.setAttribute("aria-activedescendant", Y.getActiveDescendant() ?? ""); - })), this._register(Y.onChangedAllVisibleChecked((X) => { - c.checked = X; - })), this._register(Y.onChangedVisibleCount((X) => { - f.setCount(X); - })), this._register(Y.onChangedCheckedCount((X) => { - y.setCount(X); - })), this._register(Y.onLeave(() => { + const S = O(h, js(`#${this.idPrefix}message.quick-input-message`)), x = this._register(new mk(t, this.styles.progressBar)); + x.getContainer().classList.add("quick-input-progress"); + const w = O(t, js(".quick-input-html-widget")); + w.tabIndex = -1; + const A = O(t, js(".quick-input-description")), H = this.idPrefix + "list", F = this._register(this.instantiationService.createInstance(mG, t, this.options.hoverDelegate, this.options.linkOpenerDelegate, H)); + m.setAttribute("aria-controls", H), this._register(F.onDidChangeFocus(() => { + m.setAttribute("aria-activedescendant", F.getActiveDescendant() ?? ""); + })), this._register(F.onChangedAllVisibleChecked((E) => { + d.checked = E; + })), this._register(F.onChangedVisibleCount((E) => { + g.setCount(E); + })), this._register(F.onChangedCheckedCount((E) => { + f.setCount(E); + })), this._register(F.onLeave(() => { setTimeout(() => { - this.controller && (g.setFocus(), this.controller instanceof kM && this.controller.canSelectMany && Y.clearFocus()); + this.controller && (m.setFocus(), this.controller instanceof OI && this.controller.canSelectMany && F.clearFocus()); }, 0); })); - const B = vl(t); - return this._register(B), this._register(z(t, ie.FOCUS, (X) => { + const K = kr(t); + return this._register(K), this._register(z(t, ie.FOCUS, (E) => { const j = this.getUI(); - if (Ji(X.relatedTarget, j.inputContainer)) { - const le = j.inputBox.isSelectionAtEnd(); - this.endOfQuickInputBoxContext.get() !== le && this.endOfQuickInputBoxContext.set(le); - } - Ji(X.relatedTarget, j.container) || (this.inQuickInputContext.set(!0), this.previousFocusElement = Ki(X.relatedTarget) ? X.relatedTarget : void 0); - }, !0)), this._register(B.onDidBlur(() => { - !this.getUI().ignoreFocusOut && !this.options.ignoreFocusOut() && this.hide(xb.Blur), this.inQuickInputContext.set(!1), this.endOfQuickInputBoxContext.set(!1), this.previousFocusElement = void 0; - })), this._register(g.onKeyDown((X) => { + if (_i(E.relatedTarget, j.inputContainer)) { + const re = j.inputBox.isSelectionAtEnd(); + this.endOfQuickInputBoxContext.get() !== re && this.endOfQuickInputBoxContext.set(re); + } + _i(E.relatedTarget, j.container) || (this.inQuickInputContext.set(!0), this.previousFocusElement = Oi(E.relatedTarget) ? E.relatedTarget : void 0); + }, !0)), this._register(K.onDidBlur(() => { + !this.getUI().ignoreFocusOut && !this.options.ignoreFocusOut() && this.hide(NZ.Blur), this.inQuickInputContext.set(!1), this.endOfQuickInputBoxContext.set(!1), this.previousFocusElement = void 0; + })), this._register(m.onKeyDown((E) => { const j = this.getUI().inputBox.isSelectionAtEnd(); this.endOfQuickInputBoxContext.get() !== j && this.endOfQuickInputBoxContext.set(j); - })), this._register(z(t, ie.FOCUS, (X) => { - g.setFocus(); - })), this._register(ai(t, ie.KEY_DOWN, (X) => { - if (!Ji(X.target, v)) - switch (X.keyCode) { + })), this._register(z(t, ie.FOCUS, (E) => { + m.setFocus(); + })), this._register(di(t, ie.KEY_DOWN, (E) => { + if (!_i(E.target, w)) + switch (E.keyCode) { case 3: - tt.stop(X, !0), this.enabled && this.onDidAcceptEmitter.fire(); + tt.stop(E, !0), this.enabled && this.onDidAcceptEmitter.fire(); break; case 9: - tt.stop(X, !0), this.hide(xb.Gesture); + tt.stop(E, !0), this.hide(NZ.Gesture); break; case 2: - if (!X.altKey && !X.ctrlKey && !X.metaKey) { + if (!E.altKey && !E.ctrlKey && !E.metaKey) { const j = [ ".quick-input-list .monaco-action-bar .always-visible", ".quick-input-list-entry:hover .monaco-action-bar", ".monaco-list-row.focused .monaco-action-bar" ]; if (t.classList.contains("show-checkboxes") ? j.push("input") : j.push("input[type=text]"), this.getUI().list.displayed && j.push(".monaco-list"), this.getUI().message && j.push(".quick-input-message a"), this.getUI().widget) { - if (Ji(X.target, this.getUI().widget)) + if (_i(E.target, this.getUI().widget)) break; j.push(".quick-input-html-widget"); } - const le = t.querySelectorAll(j.join(", ")); - X.shiftKey && X.target === le[0] ? (tt.stop(X, !0), Y.clearFocus()) : !X.shiftKey && Ji(X.target, le[le.length - 1]) && (tt.stop(X, !0), le[0].focus()); + const re = t.querySelectorAll(j.join(", ")); + E.shiftKey && E.target === re[0] ? (tt.stop(E, !0), F.clearFocus()) : !E.shiftKey && _i(E.target, re[re.length - 1]) && (tt.stop(E, !0), re[0].focus()); } break; case 10: - X.ctrlKey && (tt.stop(X, !0), this.getUI().list.toggleHover()); + E.ctrlKey && (tt.stop(E, !0), this.getUI().list.toggleHover()); break; } })), this.ui = { @@ -103844,121 +103844,121 @@ let QG = (rm = class extends R { styleSheet: i, leftActionBar: o, titleBar: n, - title: r, - description1: P, - description2: d, - widget: v, - rightActionBar: l, - inlineActionBar: w, - checkAll: c, + title: l, + description1: A, + description2: a, + widget: w, + rightActionBar: r, + inlineActionBar: y, + checkAll: d, inputContainer: h, filterContainer: u, - inputBox: g, - visibleCountContainer: m, - visibleCount: f, - countContainer: b, - count: y, - okContainer: C, - ok: S, - message: Z, - customButtonContainer: L, - customButton: x, - list: Y, - progressBar: _, + inputBox: m, + visibleCountContainer: b, + visibleCount: g, + countContainer: Z, + count: f, + okContainer: W, + ok: G, + message: S, + customButtonContainer: X, + customButton: L, + list: F, + progressBar: x, onDidAccept: this.onDidAcceptEmitter.event, onDidCustom: this.onDidCustomEmitter.event, onDidTriggerButton: this.onDidTriggerButtonEmitter.event, ignoreFocusOut: !1, keyMods: this.keyMods, - show: (X) => this.show(X), + show: (E) => this.show(E), hide: () => this.hide(), - setVisibilities: (X) => this.setVisibilities(X), - setEnabled: (X) => this.setEnabled(X), - setContextKey: (X) => this.options.setContextKey(X), - linkOpenerDelegate: (X) => this.options.linkOpenerDelegate(X) + setVisibilities: (E) => this.setVisibilities(E), + setEnabled: (E) => this.setEnabled(E), + setContextKey: (E) => this.options.setContextKey(E), + linkOpenerDelegate: (E) => this.options.linkOpenerDelegate(E) }, this.updateStyles(), this.ui; } reparentUI(e) { - this.ui && (this._container = e, Q(this._container, this.ui.container)); + this.ui && (this._container = e, O(this._container, this.ui.container)); } - pick(e, t = {}, i = Ye.None) { + pick(e, t = {}, i = Fe.None) { return new Promise((n, o) => { - let r = (d) => { + let l = (a) => { var h; - r = n, (h = t.onKeyMods) == null || h.call(t, l.keyMods), n(d); + l = n, (h = t.onKeyMods) == null || h.call(t, r.keyMods), n(a); }; if (i.isCancellationRequested) { - r(void 0); + l(void 0); return; } - const l = this.createQuickPick({ useSeparators: !0 }); - let a; - const c = [ - l, - l.onDidAccept(() => { - if (l.canSelectMany) - r(l.selectedItems.slice()), l.hide(); + const r = this.createQuickPick({ useSeparators: !0 }); + let c; + const d = [ + r, + r.onDidAccept(() => { + if (r.canSelectMany) + l(r.selectedItems.slice()), r.hide(); else { - const d = l.activeItems[0]; - d && (r(d), l.hide()); + const a = r.activeItems[0]; + a && (l(a), r.hide()); } }), - l.onDidChangeActive((d) => { - const h = d[0]; + r.onDidChangeActive((a) => { + const h = a[0]; h && t.onDidFocus && t.onDidFocus(h); }), - l.onDidChangeSelection((d) => { - if (!l.canSelectMany) { - const h = d[0]; - h && (r(h), l.hide()); + r.onDidChangeSelection((a) => { + if (!r.canSelectMany) { + const h = a[0]; + h && (l(h), r.hide()); } }), - l.onDidTriggerItemButton((d) => t.onDidTriggerItemButton && t.onDidTriggerItemButton({ - ...d, + r.onDidTriggerItemButton((a) => t.onDidTriggerItemButton && t.onDidTriggerItemButton({ + ...a, removeItem: () => { - const h = l.items.indexOf(d.item); + const h = r.items.indexOf(a.item); if (h !== -1) { - const u = l.items.slice(), g = u.splice(h, 1), m = l.activeItems.filter((b) => b !== g[0]), f = l.keepScrollPosition; - l.keepScrollPosition = !0, l.items = u, m && (l.activeItems = m), l.keepScrollPosition = f; + const u = r.items.slice(), m = u.splice(h, 1), b = r.activeItems.filter((Z) => Z !== m[0]), g = r.keepScrollPosition; + r.keepScrollPosition = !0, r.items = u, b && (r.activeItems = b), r.keepScrollPosition = g; } } })), - l.onDidTriggerSeparatorButton((d) => { + r.onDidTriggerSeparatorButton((a) => { var h; - return (h = t.onDidTriggerSeparatorButton) == null ? void 0 : h.call(t, d); + return (h = t.onDidTriggerSeparatorButton) == null ? void 0 : h.call(t, a); }), - l.onDidChangeValue((d) => { - a && !d && (l.activeItems.length !== 1 || l.activeItems[0] !== a) && (l.activeItems = [a]); + r.onDidChangeValue((a) => { + c && !a && (r.activeItems.length !== 1 || r.activeItems[0] !== c) && (r.activeItems = [c]); }), i.onCancellationRequested(() => { - l.hide(); + r.hide(); }), - l.onDidHide(() => { - Wt(c), r(void 0); + r.onDidHide(() => { + Nt(d), l(void 0); }) ]; - l.title = t.title, t.value && (l.value = t.value), l.canSelectMany = !!t.canPickMany, l.placeholder = t.placeHolder, l.ignoreFocusOut = !!t.ignoreFocusLost, l.matchOnDescription = !!t.matchOnDescription, l.matchOnDetail = !!t.matchOnDetail, l.matchOnLabel = t.matchOnLabel === void 0 || t.matchOnLabel, l.quickNavigate = t.quickNavigate, l.hideInput = !!t.hideInput, l.contextKey = t.contextKey, l.busy = !0, Promise.all([e, t.activeItem]).then(([d, h]) => { - a = h, l.busy = !1, l.items = d, l.canSelectMany && (l.selectedItems = d.filter((u) => u.type !== "separator" && u.picked)), a && (l.activeItems = [a]); - }), l.show(), Promise.resolve(e).then(void 0, (d) => { - o(d), l.hide(); + r.title = t.title, t.value && (r.value = t.value), r.canSelectMany = !!t.canPickMany, r.placeholder = t.placeHolder, r.ignoreFocusOut = !!t.ignoreFocusLost, r.matchOnDescription = !!t.matchOnDescription, r.matchOnDetail = !!t.matchOnDetail, r.matchOnLabel = t.matchOnLabel === void 0 || t.matchOnLabel, r.quickNavigate = t.quickNavigate, r.hideInput = !!t.hideInput, r.contextKey = t.contextKey, r.busy = !0, Promise.all([e, t.activeItem]).then(([a, h]) => { + c = h, r.busy = !1, r.items = a, r.canSelectMany && (r.selectedItems = a.filter((u) => u.type !== "separator" && u.picked)), c && (r.activeItems = [c]); + }), r.show(), Promise.resolve(e).then(void 0, (a) => { + o(a), r.hide(); }); }); } createQuickPick(e = { useSeparators: !1 }) { const t = this.getUI(!0); - return new kM(t); + return new OI(t); } createInputBox() { const e = this.getUI(!0); - return new IZe(e); + return new WSe(e); } show(e) { const t = this.getUI(!0); this.onShowEmitter.fire(); const i = this.controller; - this.controller = e, i == null || i.didHide(), this.setEnabled(!0), t.leftActionBar.clear(), t.title.textContent = "", t.description1.textContent = "", t.description2.textContent = "", In(t.widget), t.rightActionBar.clear(), t.inlineActionBar.clear(), t.checkAll.checked = !1, t.inputBox.placeholder = "", t.inputBox.password = !1, t.inputBox.showDecoration(Mi.Ignore), t.visibleCount.setCount(0), t.count.setCount(0), In(t.message), t.progressBar.stop(), t.list.setElements([]), t.list.matchOnDescription = !1, t.list.matchOnDetail = !1, t.list.matchOnLabel = !0, t.list.sortByLabel = !0, t.ignoreFocusOut = !1, t.inputBox.toggles = void 0; + this.controller = e, i == null || i.didHide(), this.setEnabled(!0), t.leftActionBar.clear(), t.title.textContent = "", t.description1.textContent = "", t.description2.textContent = "", Rn(t.widget), t.rightActionBar.clear(), t.inlineActionBar.clear(), t.checkAll.checked = !1, t.inputBox.placeholder = "", t.inputBox.password = !1, t.inputBox.showDecoration(Si.Ignore), t.visibleCount.setCount(0), t.count.setCount(0), Rn(t.message), t.progressBar.stop(), t.list.setElements([]), t.list.matchOnDescription = !1, t.list.matchOnDetail = !1, t.list.matchOnLabel = !0, t.list.sortByLabel = !0, t.ignoreFocusOut = !1, t.inputBox.toggles = void 0; const n = this.options.backKeybindingLabel(); - BG.tooltip = n ? p("quickInput.backWithKeybinding", "Back ({0})", n) : p("quickInput.back", "Back"), t.container.style.display = "", this.updateLayout(), t.inputBox.setFocus(), this.quickInputTypeContext.set(e.type); + hk.tooltip = n ? p("quickInput.backWithKeybinding", "Back ({0})", n) : p("quickInput.back", "Back"), t.container.style.display = "", this.updateLayout(), t.inputBox.setFocus(), this.quickInputTypeContext.set(e.type); } isVisible() { return !!this.ui && this.ui.container.style.display !== "none"; @@ -103983,12 +103983,12 @@ let QG = (rm = class extends R { if (!t) return; t.willHide(e); - const i = (o = this.ui) == null ? void 0 : o.container, n = i && !nJ(i); + const i = (o = this.ui) == null ? void 0 : o.container, n = i && !EB(i); if (this.controller = null, this.onHideEmitter.fire(), i && (i.style.display = "none"), !n) { - let r = this.previousFocusElement; - for (; r && !r.offsetParent; ) - r = r.parentElement ?? void 0; - r != null && r.offsetParent ? (r.focus(), this.previousFocusElement = void 0) : this.options.returnFocus(); + let l = this.previousFocusElement; + for (; l && !l.offsetParent; ) + l = l.parentElement ?? void 0; + l != null && l.offsetParent ? (l.focus(), this.previousFocusElement = void 0) : this.options.returnFocus(); } t.didHide(e); } @@ -103998,7 +103998,7 @@ let QG = (rm = class extends R { updateLayout() { if (this.ui && this.isVisible()) { this.ui.container.style.top = `${this.titleBarOffset}px`; - const e = this.ui.container.style, t = Math.min(this.dimension.width * 0.62, KG.MAX_WIDTH); + const e = this.ui.container.style, t = Math.min(this.dimension.width * 0.62, gk.MAX_WIDTH); e.width = t + "px", e.marginLeft = "-" + t / 2 + "px", this.ui.inputBox.layout(), this.ui.list.layout(this.dimension && this.dimension.height * 0.4); } } @@ -104009,30 +104009,30 @@ let QG = (rm = class extends R { if (this.ui) { const { quickInputTitleBackground: e, quickInputBackground: t, quickInputForeground: i, widgetBorder: n, widgetShadow: o } = this.styles.widget; this.ui.titleBar.style.backgroundColor = e ?? "", this.ui.container.style.backgroundColor = t ?? "", this.ui.container.style.color = i ?? "", this.ui.container.style.border = n ? `1px solid ${n}` : "", this.ui.container.style.boxShadow = o ? `0 0 8px 2px ${o}` : "", this.ui.list.style(this.styles.list); - const r = []; - this.styles.pickerGroup.pickerGroupBorder && r.push(`.quick-input-list .quick-input-list-entry { border-top-color: ${this.styles.pickerGroup.pickerGroupBorder}; }`), this.styles.pickerGroup.pickerGroupForeground && r.push(`.quick-input-list .quick-input-list-separator { color: ${this.styles.pickerGroup.pickerGroupForeground}; }`), this.styles.pickerGroup.pickerGroupForeground && r.push(".quick-input-list .quick-input-list-separator-as-item { color: var(--vscode-descriptionForeground); }"), (this.styles.keybindingLabel.keybindingLabelBackground || this.styles.keybindingLabel.keybindingLabelBorder || this.styles.keybindingLabel.keybindingLabelBottomBorder || this.styles.keybindingLabel.keybindingLabelShadow || this.styles.keybindingLabel.keybindingLabelForeground) && (r.push(".quick-input-list .monaco-keybinding > .monaco-keybinding-key {"), this.styles.keybindingLabel.keybindingLabelBackground && r.push(`background-color: ${this.styles.keybindingLabel.keybindingLabelBackground};`), this.styles.keybindingLabel.keybindingLabelBorder && r.push(`border-color: ${this.styles.keybindingLabel.keybindingLabelBorder};`), this.styles.keybindingLabel.keybindingLabelBottomBorder && r.push(`border-bottom-color: ${this.styles.keybindingLabel.keybindingLabelBottomBorder};`), this.styles.keybindingLabel.keybindingLabelShadow && r.push(`box-shadow: inset 0 -1px 0 ${this.styles.keybindingLabel.keybindingLabelShadow};`), this.styles.keybindingLabel.keybindingLabelForeground && r.push(`color: ${this.styles.keybindingLabel.keybindingLabelForeground};`), r.push("}")); - const l = r.join(` + const l = []; + this.styles.pickerGroup.pickerGroupBorder && l.push(`.quick-input-list .quick-input-list-entry { border-top-color: ${this.styles.pickerGroup.pickerGroupBorder}; }`), this.styles.pickerGroup.pickerGroupForeground && l.push(`.quick-input-list .quick-input-list-separator { color: ${this.styles.pickerGroup.pickerGroupForeground}; }`), this.styles.pickerGroup.pickerGroupForeground && l.push(".quick-input-list .quick-input-list-separator-as-item { color: var(--vscode-descriptionForeground); }"), (this.styles.keybindingLabel.keybindingLabelBackground || this.styles.keybindingLabel.keybindingLabelBorder || this.styles.keybindingLabel.keybindingLabelBottomBorder || this.styles.keybindingLabel.keybindingLabelShadow || this.styles.keybindingLabel.keybindingLabelForeground) && (l.push(".quick-input-list .monaco-keybinding > .monaco-keybinding-key {"), this.styles.keybindingLabel.keybindingLabelBackground && l.push(`background-color: ${this.styles.keybindingLabel.keybindingLabelBackground};`), this.styles.keybindingLabel.keybindingLabelBorder && l.push(`border-color: ${this.styles.keybindingLabel.keybindingLabelBorder};`), this.styles.keybindingLabel.keybindingLabelBottomBorder && l.push(`border-bottom-color: ${this.styles.keybindingLabel.keybindingLabelBottomBorder};`), this.styles.keybindingLabel.keybindingLabelShadow && l.push(`box-shadow: inset 0 -1px 0 ${this.styles.keybindingLabel.keybindingLabelShadow};`), this.styles.keybindingLabel.keybindingLabelForeground && l.push(`color: ${this.styles.keybindingLabel.keybindingLabelForeground};`), l.push("}")); + const r = l.join(` `); - l !== this.ui.styleSheet.textContent && (this.ui.styleSheet.textContent = l); + r !== this.ui.styleSheet.textContent && (this.ui.styleSheet.textContent = r); } } -}, KG = rm, rm.MAX_WIDTH = 600, rm); -QG = KG = XZe([ - r2(1, iu), - r2(2, Se), - r2(3, _e) -], QG); -var FZe = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +}, gk = hb, hb.MAX_WIDTH = 600, hb); +Zk = gk = wSe([ + XN(1, lu), + XN(2, Ge), + XN(3, xe) +], Zk); +var TSe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, ty = function(s, e) { +}, df = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let jG = class extends poe { +let fk = class extends rle { get controller() { return this._controller || (this._controller = this._register(this.createController())), this._controller; } @@ -104043,7 +104043,7 @@ let jG = class extends poe { return this.controller.currentQuickInput; } get quickAccess() { - return this._quickAccess || (this._quickAccess = this._register(this.instantiationService.createInstance(PG))), this._quickAccess; + return this._quickAccess || (this._quickAccess = this._register(this.instantiationService.createInstance(ak))), this._quickAccess; } constructor(e, t, i, n, o) { super(i), this.instantiationService = e, this.contextKeyService = t, this.layoutService = n, this.configurationService = o, this._onShow = this._register(new k()), this._onHide = this._register(new k()), this.contexts = /* @__PURE__ */ new Map(); @@ -104057,19 +104057,19 @@ let jG = class extends poe { }, setContextKey: (o) => this.setContextKey(o), linkOpenerDelegate: (o) => { - this.instantiationService.invokeFunction((r) => { - r.get(Bs).open(o, { allowCommands: !0, fromUserGesture: !0 }); + this.instantiationService.invokeFunction((l) => { + l.get(Ps).open(o, { allowCommands: !0, fromUserGesture: !0 }); }); }, returnFocus: () => e.focus(), styles: this.computeStyles(), - hoverDelegate: this._register(this.instantiationService.createInstance(OG)) - }, n = this._register(this.instantiationService.createInstance(QG, { + hoverDelegate: this._register(this.instantiationService.createInstance(uk)) + }, n = this._register(this.instantiationService.createInstance(Zk, { ...i, ...t })); return n.layout(e.activeContainerDimension, e.activeContainerOffset.quickPickTop), this._register(e.onDidLayoutActiveContainer((o) => { - xe(e.activeContainer) === xe(n.container) && n.layout(o, e.activeContainerOffset.quickPickTop); + Le(e.activeContainer) === Le(n.container) && n.layout(o, e.activeContainerOffset.quickPickTop); })), this._register(e.onDidChangeActiveContainer(() => { n.isVisible() || n.layout(e.activeContainerDimension, e.activeContainerOffset.quickPickTop); })), this._register(n.onShow(() => { @@ -104080,14 +104080,14 @@ let jG = class extends poe { } setContextKey(e) { let t; - e && (t = this.contexts.get(e), t || (t = new ae(e, !1).bindTo(this.contextKeyService), this.contexts.set(e, t))), !(t && t.get()) && (this.resetContextKeys(), t == null || t.set(!0)); + e && (t = this.contexts.get(e), t || (t = new ce(e, !1).bindTo(this.contextKeyService), this.contexts.set(e, t))), !(t && t.get()) && (this.resetContextKeys(), t == null || t.set(!0)); } resetContextKeys() { this.contexts.forEach((e) => { e.get() && e.reset(); }); } - pick(e, t, i = Ye.None) { + pick(e, t, i = Fe.None) { return this.controller.pick(e, t, i); } createQuickPick(e = { useSeparators: !1 }) { @@ -104102,74 +104102,74 @@ let jG = class extends poe { computeStyles() { return { widget: { - quickInputBackground: de(YF), - quickInputForeground: de(use), - quickInputTitleBackground: de(gse), - widgetBorder: de(tU), - widgetShadow: de(s0) + quickInputBackground: ae(uF), + quickInputForeground: ae(soe), + quickInputTitleBackground: ae(ooe), + widgetBorder: ae(J_), + widgetShadow: ae(a0) }, - inputBox: hx, - toggle: dx, - countBadge: u4, - button: Gge, - progressBar: Rge, - keybindingLabel: kge, - list: zm({ - listBackground: YF, - listFocusBackground: Uw, - listFocusForeground: Jw, + inputBox: SL, + toggle: IL, + countBadge: _O, + button: Cbe, + progressBar: Rbe, + keybindingLabel: xbe, + list: Bb({ + listBackground: uF, + listFocusBackground: lW, + listFocusForeground: oW, // Look like focused when inactive. - listInactiveFocusForeground: Jw, - listInactiveSelectionIconForeground: zE, - listInactiveFocusBackground: Uw, - listFocusOutline: Ut, - listInactiveFocusOutline: Ut + listInactiveFocusForeground: oW, + listInactiveSelectionIconForeground: mJ, + listInactiveFocusBackground: lW, + listFocusOutline: _t, + listInactiveFocusOutline: _t }), pickerGroup: { - pickerGroupBorder: de(mse), - pickerGroupForeground: de(hU) + pickerGroupBorder: ae(loe), + pickerGroupForeground: ae(B_) } }; } }; -jG = FZe([ - ty(0, Se), - ty(1, _e), - ty(2, Pi), - ty(3, iu), - ty(4, Ke) -], jG); -var $7 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +fk = TSe([ + df(0, Ge), + df(1, xe), + df(2, Ki), + df(3, lu), + df(4, Qe) +], fk); +var k8 = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, zu = function(s, e) { +}, Bu = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let qG = class extends jG { - constructor(e, t, i, n, o, r) { - super(t, i, n, new AG(e.getContainerDomNode(), o), r), this.host = void 0; - const l = iC.get(e); - if (l) { - const a = l.widget; +let yk = class extends fk { + constructor(e, t, i, n, o, l) { + super(t, i, n, new KY(e.getContainerDomNode(), o), l), this.host = void 0; + const r = bG.get(e); + if (r) { + const c = r.widget; this.host = { _serviceBrand: void 0, get mainContainer() { - return a.getDomNode(); + return c.getDomNode(); }, getContainer() { - return a.getDomNode(); + return c.getDomNode(); }, whenContainerStylesLoaded() { }, get containers() { - return [a.getDomNode()]; + return [c.getDomNode()]; }, get activeContainer() { - return a.getDomNode(); + return c.getDomNode(); }, get mainContainerDimension() { return e.getLayoutInfo(); @@ -104184,7 +104184,7 @@ let qG = class extends jG { return e.onDidLayoutChange; }, get onDidLayoutContainer() { - return se.map(e.onDidLayoutChange, (c) => ({ container: a.getDomNode(), dimension: c })); + return se.map(e.onDidLayoutChange, (d) => ({ container: c.getDomNode(), dimension: d })); }, get onDidChangeActiveContainer() { return se.None; @@ -104207,22 +104207,22 @@ let qG = class extends jG { return super.createController(this.host); } }; -qG = $7([ - zu(1, Se), - zu(2, _e), - zu(3, Pi), - zu(4, ft), - zu(5, Ke) -], qG); -let $G = class { +yk = k8([ + Bu(1, Ge), + Bu(2, xe), + Bu(3, Ki), + Bu(4, gt), + Bu(5, Qe) +], yk); +let Wk = class { get activeService() { const e = this.codeEditorService.getFocusedCodeEditor(); if (!e) throw new Error("Quick input service needs a focused editor to work."); let t = this.mapEditorToService.get(e); if (!t) { - const i = t = this.instantiationService.createInstance(qG, e); - this.mapEditorToService.set(e, t), ob(e.onDidDispose)(() => { + const i = t = this.instantiationService.createInstance(yk, e); + this.mapEditorToService.set(e, t), hZ(e.onDidDispose)(() => { i.dispose(), this.mapEditorToService.delete(e); }); } @@ -104237,7 +104237,7 @@ let $G = class { constructor(e, t) { this.instantiationService = e, this.codeEditorService = t, this.mapEditorToService = /* @__PURE__ */ new Map(); } - pick(e, t, i = Ye.None) { + pick(e, t, i = Fe.None) { return this.activeService.pick(e, t, i); } createQuickPick(e = { useSeparators: !1 }) { @@ -104247,29 +104247,29 @@ let $G = class { return this.activeService.createInputBox(); } }; -$G = $7([ - zu(0, Se), - zu(1, ft) -], $G); -const C_ = class C_ { +Wk = k8([ + Bu(0, Ge), + Bu(1, gt) +], Wk); +const kS = class kS { static get(e) { - return e.getContribution(C_.ID); + return e.getContribution(kS.ID); } constructor(e) { - this.editor = e, this.widget = new eR(this.editor); + this.editor = e, this.widget = new Gk(this.editor); } dispose() { this.widget.dispose(); } }; -C_.ID = "editor.controller.quickInput"; -let iC = C_; -const S_ = class S_ { +kS.ID = "editor.controller.quickInput"; +let bG = kS; +const vS = class vS { constructor(e) { this.codeEditor = e, this.domNode = document.createElement("div"), this.codeEditor.addOverlayWidget(this); } getId() { - return S_.ID; + return vS.ID; } getDomNode() { return this.domNode; @@ -104284,98 +104284,98 @@ const S_ = class S_ { this.codeEditor.removeOverlayWidget(this); } }; -S_.ID = "editor.contrib.quickInputWidget"; -let eR = S_; -gt( - iC.ID, - iC, +vS.ID = "editor.contrib.quickInputWidget"; +let Gk = vS; +mt( + bG.ID, + bG, 4 /* EditorContributionInstantiation.Lazy */ ); -class YZe { +class MSe { constructor(e, t, i, n, o) { this._parsedThemeRuleBrand = void 0, this.token = e, this.index = t, this.fontStyle = i, this.foreground = n, this.background = o; } } -function zZe(s) { +function YSe(s) { if (!s || !Array.isArray(s)) return []; const e = []; let t = 0; for (let i = 0, n = s.length; i < n; i++) { const o = s[i]; - let r = -1; + let l = -1; if (typeof o.fontStyle == "string") { - r = 0; - const c = o.fontStyle.split(" "); - for (let d = 0, h = c.length; d < h; d++) - switch (c[d]) { + l = 0; + const d = o.fontStyle.split(" "); + for (let a = 0, h = d.length; a < h; a++) + switch (d[a]) { case "italic": - r = r | 1; + l = l | 1; break; case "bold": - r = r | 2; + l = l | 2; break; case "underline": - r = r | 4; + l = l | 4; break; case "strikethrough": - r = r | 8; + l = l | 8; break; } } - let l = null; - typeof o.foreground == "string" && (l = o.foreground); - let a = null; - typeof o.background == "string" && (a = o.background), e[t++] = new YZe(o.token || "", i, r, l, a); + let r = null; + typeof o.foreground == "string" && (r = o.foreground); + let c = null; + typeof o.background == "string" && (c = o.background), e[t++] = new MSe(o.token || "", i, l, r, c); } return e; } -function PZe(s, e) { - s.sort((d, h) => { - const u = UZe(d.token, h.token); - return u !== 0 ? u : d.index - h.index; +function kSe(s, e) { + s.sort((a, h) => { + const u = DSe(a.token, h.token); + return u !== 0 ? u : a.index - h.index; }); let t = 0, i = "000000", n = "ffffff"; for (; s.length >= 1 && s[0].token === ""; ) { - const d = s.shift(); - d.fontStyle !== -1 && (t = d.fontStyle), d.foreground !== null && (i = d.foreground), d.background !== null && (n = d.background); + const a = s.shift(); + a.fontStyle !== -1 && (t = a.fontStyle), a.foreground !== null && (i = a.foreground), a.background !== null && (n = a.background); } - const o = new OZe(); - for (const d of e) - o.getId(d); - const r = o.getId(i), l = o.getId(n), a = new f9(t, r, l), c = new b9(a); - for (let d = 0, h = s.length; d < h; d++) { - const u = s[d]; - c.insert(u.token, u.fontStyle, o.getId(u.foreground), o.getId(u.background)); + const o = new JSe(); + for (const a of e) + o.getId(a); + const l = o.getId(i), r = o.getId(n), c = new FE(t, l, r), d = new zE(c); + for (let a = 0, h = s.length; a < h; a++) { + const u = s[a]; + d.insert(u.token, u.fontStyle, o.getId(u.foreground), o.getId(u.background)); } - return new e8(o, c); + return new v8(o, d); } -const BZe = /^#?([0-9A-Fa-f]{6})([0-9A-Fa-f]{2})?$/; -class OZe { +const vSe = /^#?([0-9A-Fa-f]{6})([0-9A-Fa-f]{2})?$/; +class JSe { constructor() { this._lastColorId = 0, this._id2color = [], this._color2id = /* @__PURE__ */ new Map(); } getId(e) { if (e === null) return 0; - const t = e.match(BZe); + const t = e.match(vSe); if (!t) throw new Error("Illegal value for token color: " + e); e = t[1].toUpperCase(); let i = this._color2id.get(e); - return i || (i = ++this._lastColorId, this._color2id.set(e, i), this._id2color[i] = K.fromHex("#" + e), i); + return i || (i = ++this._lastColorId, this._color2id.set(e, i), this._id2color[i] = Q.fromHex("#" + e), i); } getColorMap() { return this._id2color.slice(0); } } -class e8 { +class v8 { static createFromRawTokenTheme(e, t) { - return this.createFromParsedTokenTheme(zZe(e), t); + return this.createFromParsedTokenTheme(YSe(e), t); } static createFromParsedTokenTheme(e, t) { - return PZe(e, t); + return kSe(e, t); } constructor(e, t) { this._colorMap = e, this._root = t, this._cache = /* @__PURE__ */ new Map(); @@ -104389,15 +104389,15 @@ class e8 { match(e, t) { let i = this._cache.get(t); if (typeof i > "u") { - const n = this._match(t), o = JZe(t); + const n = this._match(t), o = ESe(t); i = (n.metadata | o << 8) >>> 0, this._cache.set(t, i); } return (i | e << 0) >>> 0; } } -const HZe = /\b(comment|string|regex|regexp)\b/; -function JZe(s) { - const e = s.match(HZe); +const HSe = /\b(comment|string|regex|regexp)\b/; +function ESe(s) { + const e = s.match(HSe); if (!e) return 0; switch (e[1]) { @@ -104412,21 +104412,21 @@ function JZe(s) { } throw new Error("Unexpected match for standard token type!"); } -function UZe(s, e) { +function DSe(s, e) { return s < e ? -1 : s > e ? 1 : 0; } -class f9 { +class FE { constructor(e, t, i) { this._themeTrieElementRuleBrand = void 0, this._fontStyle = e, this._foreground = t, this._background = i, this.metadata = (this._fontStyle << 11 | this._foreground << 15 | this._background << 24) >>> 0; } clone() { - return new f9(this._fontStyle, this._foreground, this._background); + return new FE(this._fontStyle, this._foreground, this._background); } acceptOverwrite(e, t, i) { e !== -1 && (this._fontStyle = e), t !== 0 && (this._foreground = t), i !== 0 && (this._background = i), this.metadata = (this._fontStyle << 11 | this._foreground << 15 | this._background << 24) >>> 0; } } -class b9 { +class zE { constructor(e) { this._themeTrieElementBrand = void 0, this._mainRule = e, this._children = /* @__PURE__ */ new Map(); } @@ -104445,13 +104445,13 @@ class b9 { return; } const o = e.indexOf("."); - let r, l; - o === -1 ? (r = e, l = "") : (r = e.substring(0, o), l = e.substring(o + 1)); - let a = this._children.get(r); - typeof a > "u" && (a = new b9(this._mainRule.clone()), this._children.set(r, a)), a.insert(l, t, i, n); + let l, r; + o === -1 ? (l = e, r = "") : (l = e.substring(0, o), r = e.substring(o + 1)); + let c = this._children.get(l); + typeof c > "u" && (c = new zE(this._mainRule.clone()), this._children.set(l, c)), c.insert(r, t, i, n); } } -function KZe(s) { +function FSe(s) { const e = []; for (let t = 1, i = s.length; t < i; t++) { const n = s[t]; @@ -104460,7 +104460,7 @@ function KZe(s) { return e.push(".mtki { font-style: italic; }"), e.push(".mtkb { font-weight: bold; }"), e.push(".mtku { text-decoration: underline; text-underline-position: under; }"), e.push(".mtks { text-decoration: line-through; }"), e.push(".mtks.mtku { text-decoration: underline line-through; text-underline-position: under; }"), e.join(` `); } -const QZe = { +const zSe = { base: "vs", inherit: !1, rules: [ @@ -104512,14 +104512,14 @@ const QZe = { { token: "predefined.sql", foreground: "C700C7" } ], colors: { - [Hr]: "#FFFFFE", - [Ya]: "#000000", - [$J]: "#E5EBF1", - [SC]: "#D3D3D3", - [LC]: "#939393", - [GE]: "#ADD6FF4D" - } -}, jZe = { + [Ql]: "#FFFFFE", + [Uc]: "#000000", + [k_]: "#E5EBF1", + [YG]: "#D3D3D3", + [kG]: "#939393", + [rJ]: "#ADD6FF4D" + } +}, ASe = { base: "vs-dark", inherit: !1, rules: [ @@ -104570,14 +104570,14 @@ const QZe = { { token: "predefined.sql", foreground: "FF00FF" } ], colors: { - [Hr]: "#1E1E1E", - [Ya]: "#D4D4D4", - [$J]: "#3A3D41", - [SC]: "#404040", - [LC]: "#707070", - [GE]: "#ADD6FF26" - } -}, qZe = { + [Ql]: "#1E1E1E", + [Uc]: "#D4D4D4", + [k_]: "#3A3D41", + [YG]: "#404040", + [kG]: "#707070", + [rJ]: "#ADD6FF26" + } +}, KSe = { base: "hc-black", inherit: !1, rules: [ @@ -104619,12 +104619,12 @@ const QZe = { { token: "predefined.sql", foreground: "FF00FF" } ], colors: { - [Hr]: "#000000", - [Ya]: "#FFFFFF", - [SC]: "#FFFFFF", - [LC]: "#FFFFFF" + [Ql]: "#000000", + [Uc]: "#FFFFFF", + [YG]: "#FFFFFF", + [kG]: "#FFFFFF" } -}, $Ze = { +}, USe = { base: "hc-light", inherit: !1, rules: [ @@ -104666,40 +104666,40 @@ const QZe = { { token: "predefined.sql", foreground: "C700C7" } ], colors: { - [Hr]: "#FFFFFF", - [Ya]: "#292929", - [SC]: "#292929", - [LC]: "#292929" + [Ql]: "#FFFFFF", + [Uc]: "#292929", + [YG]: "#292929", + [kG]: "#292929" } }; -function e_e(s) { - const e = new U(), t = e.add(new k()), i = $K(); +function PSe(s) { + const e = new _(), t = e.add(new k()), i = kO(); return e.add(i.onDidChange(() => t.fire())), s && e.add(s.onDidProductIconThemeChange(() => t.fire())), { dispose: () => e.dispose(), onDidChange: t.event, getCSS() { - const n = s ? s.getProductIconTheme() : new t8(), o = {}, r = [], l = []; - for (const a of i.getIcons()) { - const c = n.getIcon(a); - if (!c) + const n = s ? s.getProductIconTheme() : new J8(), o = {}, l = [], r = []; + for (const c of i.getIcons()) { + const d = n.getIcon(c); + if (!d) continue; - const d = c.font, h = `--vscode-icon-${a.id}-font-family`, u = `--vscode-icon-${a.id}-content`; - d ? (o[d.id] = d.definition, l.push(`${h}: ${IN(d.id)};`, `${u}: '${c.fontCharacter}';`), r.push(`.codicon-${a.id}:before { content: '${c.fontCharacter}'; font-family: ${IN(d.id)}; }`)) : (l.push(`${u}: '${c.fontCharacter}'; ${h}: 'codicon';`), r.push(`.codicon-${a.id}:before { content: '${c.fontCharacter}'; }`)); + const a = d.font, h = `--vscode-icon-${c.id}-font-family`, u = `--vscode-icon-${c.id}-content`; + a ? (o[a.id] = a.definition, r.push(`${h}: ${KC(a.id)};`, `${u}: '${d.fontCharacter}';`), l.push(`.codicon-${c.id}:before { content: '${d.fontCharacter}'; font-family: ${KC(a.id)}; }`)) : (r.push(`${u}: '${d.fontCharacter}'; ${h}: 'codicon';`), l.push(`.codicon-${c.id}:before { content: '${d.fontCharacter}'; }`)); } - for (const a in o) { - const c = o[a], d = c.weight ? `font-weight: ${c.weight};` : "", h = c.style ? `font-style: ${c.style};` : "", u = c.src.map((g) => `${Pc(g.location)} format('${g.format}')`).join(", "); - r.push(`@font-face { src: ${u}; font-family: ${IN(a)};${d}${h} font-display: block; }`); + for (const c in o) { + const d = o[c], a = d.weight ? `font-weight: ${d.weight};` : "", h = d.style ? `font-style: ${d.style};` : "", u = d.src.map((m) => `${Bd(m.location)} format('${m.format}')`).join(", "); + l.push(`@font-face { src: ${u}; font-family: ${KC(c)};${a}${h} font-display: block; }`); } - return r.push(`:root { ${l.join(" ")} }`), r.join(` + return l.push(`:root { ${r.join(" ")} }`), l.join(` `); } }; } -class t8 { +class J8 { getIcon(e) { - const t = $K(); + const t = kO(); let i = e.defaults; - for (; Ze.isThemeIcon(i); ) { + for (; Se.isThemeIcon(i); ) { const n = t.getIcon(i.id); if (!n) return; @@ -104708,12 +104708,12 @@ class t8 { return i; } } -const kd = "vs", lw = "vs-dark", Pf = "hc-black", Bf = "hc-light", i8 = Di.as(JJ.ColorContribution), t_e = Di.as(SU.ThemingContribution); -class n8 { +const Ea = "vs", fy = "vs-dark", Qg = "hc-black", Og = "hc-light", H8 = ki.as(R_.ColorContribution), BSe = ki.as(nQ.ThemingContribution); +class E8 { constructor(e, t) { this.semanticHighlighting = !1, this.themeData = t; const i = t.base; - e.length > 0 ? (UL(e) ? this.id = e : this.id = i + " " + e, this.themeName = e) : (this.id = i, this.themeName = i), this.colors = null, this.defaultColors = /* @__PURE__ */ Object.create(null), this._tokenTheme = null; + e.length > 0 ? (dV(e) ? this.id = e : this.id = i + " " + e, this.themeName = e) : (this.id = i, this.themeName = i), this.colors = null, this.defaultColors = /* @__PURE__ */ Object.create(null), this._tokenTheme = null; } get base() { return this.themeData.base; @@ -104725,11 +104725,11 @@ class n8 { if (!this.colors) { const e = /* @__PURE__ */ new Map(); for (const t in this.themeData.colors) - e.set(t, K.fromHex(this.themeData.colors[t])); + e.set(t, Q.fromHex(this.themeData.colors[t])); if (this.themeData.inherit) { - const t = tR(this.themeData.base); + const t = Xk(this.themeData.base); for (const i in t.colors) - e.has(i) || e.set(i, K.fromHex(t.colors[i])); + e.has(i) || e.set(i, Q.fromHex(t.colors[i])); } this.colors = e; } @@ -104744,28 +104744,28 @@ class n8 { } getDefault(e) { let t = this.defaultColors[e]; - return t || (t = i8.resolveDefaultColor(e, this), this.defaultColors[e] = t, t); + return t || (t = H8.resolveDefaultColor(e, this), this.defaultColors[e] = t, t); } defines(e) { return this.getColors().has(e); } get type() { switch (this.base) { - case kd: - return cr.LIGHT; - case Pf: - return cr.HIGH_CONTRAST_DARK; - case Bf: - return cr.HIGH_CONTRAST_LIGHT; + case Ea: + return hl.LIGHT; + case Qg: + return hl.HIGH_CONTRAST_DARK; + case Og: + return hl.HIGH_CONTRAST_LIGHT; default: - return cr.DARK; + return hl.DARK; } } get tokenTheme() { if (!this._tokenTheme) { let e = [], t = []; if (this.themeData.inherit) { - const o = tR(this.themeData.base); + const o = Xk(this.themeData.base); e = o.rules, o.encodedTokensColors && (t = o.encodedTokensColors); } const i = this.themeData.colors["editor.foreground"], n = this.themeData.colors["editor.background"]; @@ -104773,61 +104773,61 @@ class n8 { const o = { token: "" }; i && (o.foreground = i), n && (o.background = n), e.push(o); } - e = e.concat(this.themeData.rules), this.themeData.encodedTokensColors && (t = this.themeData.encodedTokensColors), this._tokenTheme = e8.createFromRawTokenTheme(e, t); + e = e.concat(this.themeData.rules), this.themeData.encodedTokensColors && (t = this.themeData.encodedTokensColors), this._tokenTheme = v8.createFromRawTokenTheme(e, t); } return this._tokenTheme; } getTokenStyleMetadata(e, t, i) { - const o = this.tokenTheme._match([e].concat(t).join(".")).metadata, r = bl.getForeground(o), l = bl.getFontStyle(o); + const o = this.tokenTheme._match([e].concat(t).join(".")).metadata, l = Gr.getForeground(o), r = Gr.getFontStyle(o); return { - foreground: r, - italic: !!(l & 1), - bold: !!(l & 2), - underline: !!(l & 4), - strikethrough: !!(l & 8) + foreground: l, + italic: !!(r & 1), + bold: !!(r & 2), + underline: !!(r & 4), + strikethrough: !!(r & 8) }; } } -function UL(s) { - return s === kd || s === lw || s === Pf || s === Bf; +function dV(s) { + return s === Ea || s === fy || s === Qg || s === Og; } -function tR(s) { +function Xk(s) { switch (s) { - case kd: - return QZe; - case lw: - return jZe; - case Pf: - return qZe; - case Bf: - return $Ze; + case Ea: + return zSe; + case fy: + return ASe; + case Qg: + return KSe; + case Og: + return USe; } } -function sL(s) { - const e = tR(s); - return new n8(s, e); +function ZX(s) { + const e = Xk(s); + return new E8(s, e); } -class i_e extends R { +class _Se extends J { constructor() { - super(), this._onColorThemeChange = this._register(new k()), this.onDidColorThemeChange = this._onColorThemeChange.event, this._onProductIconThemeChange = this._register(new k()), this.onDidProductIconThemeChange = this._onProductIconThemeChange.event, this._environment = /* @__PURE__ */ Object.create(null), this._builtInProductIconTheme = new t8(), this._autoDetectHighContrast = !0, this._knownThemes = /* @__PURE__ */ new Map(), this._knownThemes.set(kd, sL(kd)), this._knownThemes.set(lw, sL(lw)), this._knownThemes.set(Pf, sL(Pf)), this._knownThemes.set(Bf, sL(Bf)); - const e = this._register(e_e(this)); + super(), this._onColorThemeChange = this._register(new k()), this.onDidColorThemeChange = this._onColorThemeChange.event, this._onProductIconThemeChange = this._register(new k()), this.onDidProductIconThemeChange = this._onProductIconThemeChange.event, this._environment = /* @__PURE__ */ Object.create(null), this._builtInProductIconTheme = new J8(), this._autoDetectHighContrast = !0, this._knownThemes = /* @__PURE__ */ new Map(), this._knownThemes.set(Ea, ZX(Ea)), this._knownThemes.set(fy, ZX(fy)), this._knownThemes.set(Qg, ZX(Qg)), this._knownThemes.set(Og, ZX(Og)); + const e = this._register(PSe(this)); this._codiconCSS = e.getCSS(), this._themeCSS = "", this._allCSS = `${this._codiconCSS} -${this._themeCSS}`, this._globalStyleElement = null, this._styleElements = [], this._colorMapOverride = null, this.setTheme(kd), this._onOSSchemeChanged(), this._register(e.onDidChange(() => { +${this._themeCSS}`, this._globalStyleElement = null, this._styleElements = [], this._colorMapOverride = null, this.setTheme(Ea), this._onOSSchemeChanged(), this._register(e.onDidChange(() => { this._codiconCSS = e.getCSS(), this._updateCSS(); - })), dH(vt, "(forced-colors: active)", () => { + })), PP(wt, "(forced-colors: active)", () => { this._onOSSchemeChanged(); }); } registerEditorContainer(e) { - return cA(e) ? this._registerShadowDomContainer(e) : this._registerRegularEditorContainer(); + return LV(e) ? this._registerShadowDomContainer(e) : this._registerRegularEditorContainer(); } _registerRegularEditorContainer() { - return this._globalStyleElement || (this._globalStyleElement = Bo(void 0, (e) => { + return this._globalStyleElement || (this._globalStyleElement = Po(void 0, (e) => { e.className = "monaco-colors", e.textContent = this._allCSS; - }), this._styleElements.push(this._globalStyleElement)), R.None; + }), this._styleElements.push(this._globalStyleElement)), J.None; } _registerShadowDomContainer(e) { - const t = Bo(e, (i) => { + const t = Po(e, (i) => { i.className = "monaco-colors", i.textContent = this._allCSS; }); return this._styleElements.push(t), { @@ -104843,9 +104843,9 @@ ${this._themeCSS}`, this._globalStyleElement = null, this._styleElements = [], t defineTheme(e, t) { if (!/^[a-z0-9\-]+$/i.test(e)) throw new Error("Illegal theme name!"); - if (!UL(t.base) && !UL(e)) + if (!dV(t.base) && !dV(e)) throw new Error("Illegal theme base!"); - this._knownThemes.set(e, new n8(e, t)), UL(e) && this._knownThemes.forEach((i) => { + this._knownThemes.set(e, new E8(e, t)), dV(e) && this._knownThemes.forEach((i) => { i.base === e && i.notifyBaseUpdated(); }), this._theme.themeName === e && this.setTheme(e); } @@ -104857,17 +104857,17 @@ ${this._themeCSS}`, this._globalStyleElement = null, this._styleElements = [], t } setTheme(e) { let t; - this._knownThemes.has(e) ? t = this._knownThemes.get(e) : t = this._knownThemes.get(kd), this._updateActualTheme(t); + this._knownThemes.has(e) ? t = this._knownThemes.get(e) : t = this._knownThemes.get(Ea), this._updateActualTheme(t); } _updateActualTheme(e) { !e || this._theme === e || (this._theme = e, this._updateThemeOrColorMap()); } _onOSSchemeChanged() { if (this._autoDetectHighContrast) { - const e = vt.matchMedia("(forced-colors: active)").matches; - if (e !== Ma(this._theme.type)) { + const e = wt.matchMedia("(forced-colors: active)").matches; + if (e !== Rc(this._theme.type)) { let t; - hI(this._theme.type) ? t = e ? Pf : lw : t = e ? Bf : kd, this._updateActualTheme(this._knownThemes.get(t)); + Sx(this._theme.type) ? t = e ? Qg : fy : t = e ? Og : Ea, this._updateActualTheme(this._knownThemes.get(t)); } } } @@ -104876,21 +104876,21 @@ ${this._themeCSS}`, this._globalStyleElement = null, this._styleElements = [], t } _updateThemeOrColorMap() { const e = [], t = {}, i = { - addRule: (r) => { - t[r] || (e.push(r), t[r] = !0); + addRule: (l) => { + t[l] || (e.push(l), t[l] = !0); } }; - t_e.getThemingParticipants().forEach((r) => r(this._theme, i, this._environment)); + BSe.getThemingParticipants().forEach((l) => l(this._theme, i, this._environment)); const n = []; - for (const r of i8.getColors()) { - const l = this._theme.getColor(r.id, !0); - l && n.push(`${DE(r.id)}: ${l.toString()};`); + for (const l of H8.getColors()) { + const r = this._theme.getColor(l.id, !0); + r && n.push(`${sJ(l.id)}: ${r.toString()};`); } i.addRule(`.monaco-editor, .monaco-diff-editor, .monaco-component { ${n.join(` `)} }`); const o = this._colorMapOverride || this._theme.tokenTheme.getColorMap(); - i.addRule(KZe(o)), this._themeCSS = e.join(` -`), this._updateCSS(), Wi.setColorMap(o), this._onColorThemeChange.fire(this._theme); + i.addRule(FSe(o)), this._themeCSS = e.join(` +`), this._updateCSS(), Ti.setColorMap(o), this._onColorThemeChange.fire(this._theme); } _updateCSS() { this._allCSS = `${this._codiconCSS} @@ -104907,25 +104907,25 @@ ${this._themeCSS}`, this._styleElements.forEach((e) => e.textContent = this._all return this._builtInProductIconTheme; } } -const el = $e("themeService"); -var n_e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +const nr = $e("themeService"); +var QSe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, l2 = function(s, e) { +}, VN = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let iR = class extends R { +let Vk = class extends J { constructor(e, t, i) { - super(), this._contextKeyService = e, this._layoutService = t, this._configurationService = i, this._accessibilitySupport = 0, this._onDidChangeScreenReaderOptimized = new k(), this._onDidChangeReducedMotion = new k(), this._onDidChangeLinkUnderline = new k(), this._accessibilityModeEnabledContext = fC.bindTo(this._contextKeyService); + super(), this._contextKeyService = e, this._layoutService = t, this._configurationService = i, this._accessibilitySupport = 0, this._onDidChangeScreenReaderOptimized = new k(), this._onDidChangeReducedMotion = new k(), this._onDidChangeLinkUnderline = new k(), this._accessibilityModeEnabledContext = RG.bindTo(this._contextKeyService); const n = () => this._accessibilityModeEnabledContext.set(this.isScreenReaderOptimized()); - this._register(this._configurationService.onDidChangeConfiguration((r) => { - r.affectsConfiguration("editor.accessibilitySupport") && (n(), this._onDidChangeScreenReaderOptimized.fire()), r.affectsConfiguration("workbench.reduceMotion") && (this._configMotionReduced = this._configurationService.getValue("workbench.reduceMotion"), this._onDidChangeReducedMotion.fire()); + this._register(this._configurationService.onDidChangeConfiguration((l) => { + l.affectsConfiguration("editor.accessibilitySupport") && (n(), this._onDidChangeScreenReaderOptimized.fire()), l.affectsConfiguration("workbench.reduceMotion") && (this._configMotionReduced = this._configurationService.getValue("workbench.reduceMotion"), this._onDidChangeReducedMotion.fire()); })), n(), this._register(this.onDidChangeScreenReaderOptimized(() => n())); - const o = vt.matchMedia("(prefers-reduced-motion: reduce)"); + const o = wt.matchMedia("(prefers-reduced-motion: reduce)"); this._systemMotionReduced = o.matches, this._configMotionReduced = this._configurationService.getValue("workbench.reduceMotion"), this._linkUnderlinesEnabled = this._configurationService.getValue("accessibility.underlineLinks"), this.initReducedMotionListeners(o), this.initLinkUnderlineListeners(); } initReducedMotionListeners(e) { @@ -104972,28 +104972,28 @@ let iR = class extends R { return this._accessibilitySupport; } }; -iR = n_e([ - l2(0, _e), - l2(1, iu), - l2(2, Ke) -], iR); -var s_e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +Vk = QSe([ + VN(0, xe), + VN(1, lu), + VN(2, Qe) +], Vk); +var OSe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, kB = function(s, e) { +}, lU = function(s, e) { return function(t, i) { e(t, i, s); }; -}, nR; -const GB = "application/vnd.code.resources"; -var lm; -let sR = (lm = class extends R { +}, Lk; +const rU = "application/vnd.code.resources"; +var ub; +let Ik = (ub = class extends J { constructor(e, t) { - super(), this.layoutService = e, this.logService = t, this.mapTextToType = /* @__PURE__ */ new Map(), this.findText = "", this.resources = [], this.resourcesStateHash = void 0, (xh || hH) && this.installWebKitWriteTextWorkaround(), this._register(se.runAndSubscribe(D_, ({ window: i, disposables: n }) => { + super(), this.layoutService = e, this.logService = t, this.mapTextToType = /* @__PURE__ */ new Map(), this.findText = "", this.resources = [], this.resourcesStateHash = void 0, (Ch || BP) && this.installWebKitWriteTextWorkaround(), this._register(se.runAndSubscribe(_S, ({ window: i, disposables: n }) => { n.add(z(i.document, "copy", () => this.clearResourcesState())); - }, { window: vt, disposables: this._store })); + }, { window: wt, disposables: this._store })); } // In Safari, it has the following note: // @@ -105009,8 +105009,8 @@ let sR = (lm = class extends R { // This function sets up some handlers to work around that behavior. installWebKitWriteTextWorkaround() { const e = () => { - const t = new dC(); - this.webKitPendingClipboardWritePromise && !this.webKitPendingClipboardWritePromise.isSettled && this.webKitPendingClipboardWritePromise.cancel(), this.webKitPendingClipboardWritePromise = t, sy().navigator.clipboard.write([new ClipboardItem({ + const t = new VG(); + this.webKitPendingClipboardWritePromise && !this.webKitPendingClipboardWritePromise.isSettled && this.webKitPendingClipboardWritePromise.cancel(), this.webKitPendingClipboardWritePromise = t, bf().navigator.clipboard.write([new ClipboardItem({ "text/plain": t.p })]).catch(async (i) => { (!(i instanceof Error) || i.name !== "NotAllowedError" || !t.isRejected) && this.logService.error(i); @@ -105028,21 +105028,21 @@ let sR = (lm = class extends R { if (this.webKitPendingClipboardWritePromise) return this.webKitPendingClipboardWritePromise.complete(e); try { - return await sy().navigator.clipboard.writeText(e); + return await bf().navigator.clipboard.writeText(e); } catch (i) { console.error(i); } this.fallbackWriteText(e); } fallbackWriteText(e) { - const t = Qb(), i = t.activeElement, n = t.body.appendChild(ce("textarea", { "aria-hidden": !0 })); - n.style.height = "1px", n.style.width = "1px", n.style.position = "absolute", n.value = e, n.focus(), n.select(), t.execCommand("copy"), Ki(i) && i.focus(), n.remove(); + const t = i0(), i = t.activeElement, n = t.body.appendChild(de("textarea", { "aria-hidden": !0 })); + n.style.height = "1px", n.style.width = "1px", n.style.position = "absolute", n.value = e, n.focus(), n.select(), t.execCommand("copy"), Oi(i) && i.focus(), n.remove(); } async readText(e) { if (e) return this.mapTextToType.get(e) || ""; try { - return await sy().navigator.clipboard.readText(); + return await bf().navigator.clipboard.readText(); } catch (t) { console.error(t); } @@ -105056,11 +105056,11 @@ let sR = (lm = class extends R { } async readResources() { try { - const t = await sy().navigator.clipboard.read(); + const t = await bf().navigator.clipboard.read(); for (const i of t) - if (i.types.includes(`web ${GB}`)) { - const n = await i.getType(`web ${GB}`); - return JSON.parse(await n.text()).map((r) => Le.from(r)); + if (i.types.includes(`web ${rU}`)) { + const n = await i.getType(`web ${rU}`); + return JSON.parse(await n.text()).map((l) => Xe.from(l)); } } catch { } @@ -105071,7 +105071,7 @@ let sR = (lm = class extends R { if (this.resources.length === 0) return; const e = await this.readText(); - return v_(e.substring(0, nR.MAX_RESOURCE_STATE_SOURCE_LENGTH)); + return PS(e.substring(0, Lk.MAX_RESOURCE_STATE_SOURCE_LENGTH)); } clearInternalState() { this.clearResourcesState(); @@ -105079,23 +105079,23 @@ let sR = (lm = class extends R { clearResourcesState() { this.resources = [], this.resourcesStateHash = void 0; } -}, nR = lm, lm.MAX_RESOURCE_STATE_SOURCE_LENGTH = 1e3, lm); -sR = nR = s_e([ - kB(0, iu), - kB(1, Xn) -], sR); -var o_e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +}, Lk = ub, ub.MAX_RESOURCE_STATE_SOURCE_LENGTH = 1e3, ub); +Ik = Lk = OSe([ + lU(0, lu), + lU(1, Fn) +], Ik); +var jSe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, r_e = function(s, e) { +}, qSe = function(s, e) { return function(t, i) { e(t, i, s); }; }; -const aw = "data-keybinding-context"; -class y9 { +const yy = "data-keybinding-context"; +class AE { constructor(e, t) { this._id = e, this._parent = t, this._value = /* @__PURE__ */ Object.create(null), this._value._contextId = e; } @@ -105113,7 +105113,7 @@ class y9 { return typeof t > "u" && this._parent ? this._parent.getValue(e) : t; } } -const L_ = class L_ extends y9 { +const JS = class JS extends AE { constructor() { super(-1, null); } @@ -105126,21 +105126,21 @@ const L_ = class L_ extends y9 { getValue(e) { } }; -L_.INSTANCE = new L_(); -let Pb = L_; -const Iw = class Iw extends y9 { +JS.INSTANCE = new JS(); +let QZ = JS; +const Dy = class Dy extends AE { constructor(e, t, i) { - super(e, null), this._configurationService = t, this._values = Rf.forConfigKeys(), this._listener = this._configurationService.onDidChangeConfiguration((n) => { + super(e, null), this._configurationService = t, this._values = Ag.forConfigKeys(), this._listener = this._configurationService.onDidChangeConfiguration((n) => { if (n.source === 7) { - const o = Array.from(this._values, ([r]) => r); - this._values.clear(), i.fire(new EB(o)); + const o = Array.from(this._values, ([l]) => l); + this._values.clear(), i.fire(new dU(o)); } else { const o = []; - for (const r of n.affectedKeys) { - const l = `config.${r}`, a = this._values.findSuperstr(l); - a !== void 0 && (o.push(...nt.map(a, ([c]) => c)), this._values.deleteSuperstr(l)), this._values.has(l) && (o.push(l), this._values.delete(l)); + for (const l of n.affectedKeys) { + const r = `config.${l}`, c = this._values.findSuperstr(r); + c !== void 0 && (o.push(...nt.map(c, ([d]) => d)), this._values.deleteSuperstr(r)), this._values.has(r) && (o.push(r), this._values.delete(r)); } - i.fire(new EB(o)); + i.fire(new dU(o)); } }); } @@ -105148,11 +105148,11 @@ const Iw = class Iw extends y9 { this._listener.dispose(); } getValue(e) { - if (e.indexOf(Iw._keyPrefix) !== 0) + if (e.indexOf(Dy._keyPrefix) !== 0) return super.getValue(e); if (this._values.has(e)) return this._values.get(e); - const t = e.substr(Iw._keyPrefix.length), i = this._configurationService.getValue(t); + const t = e.substr(Dy._keyPrefix.length), i = this._configurationService.getValue(t); let n; switch (typeof i) { case "number": @@ -105172,9 +105172,9 @@ const Iw = class Iw extends y9 { return super.removeValue(e); } }; -Iw._keyPrefix = "config."; -let oR = Iw; -class l_e { +Dy._keyPrefix = "config."; +let Sk = Dy; +class $Se { constructor(e, t, i) { this._service = e, this._key = t, this._defaultValue = i, this.reset(); } @@ -105188,7 +105188,7 @@ class l_e { return this._service.getContextKeyValue(this._key); } } -class RB { +class cU { constructor(e) { this.key = e; } @@ -105199,7 +105199,7 @@ class RB { return this.affectsSome(e); } } -class EB { +class dU { constructor(e) { this.keys = e; } @@ -105213,7 +105213,7 @@ class EB { return this.keys.every((t) => e.has(t)); } } -class a_e { +class exe { constructor(e) { this.events = e; } @@ -105227,17 +105227,17 @@ class a_e { return this.events.every((t) => t.allKeysContainedIn(e)); } } -function c_e(s, e) { +function txe(s, e) { return s.allKeysContainedIn(new Set(Object.keys(e))); } -class s8 extends R { +class D8 extends J { constructor(e) { - super(), this._onDidChangeContext = this._register(new cm({ merge: (t) => new a_e(t) })), this.onDidChangeContext = this._onDidChangeContext.event, this._isDisposed = !1, this._myContextId = e; + super(), this._onDidChangeContext = this._register(new bb({ merge: (t) => new exe(t) })), this.onDidChangeContext = this._onDidChangeContext.event, this._isDisposed = !1, this._myContextId = e; } createKey(e, t) { if (this._isDisposed) throw new Error("AbstractContextKeyService has been disposed"); - return new l_e(this, e, t); + return new $Se(this, e, t); } bufferChangeEvents(e) { this._onDidChangeContext.pause(); @@ -105250,7 +105250,7 @@ class s8 extends R { createScoped(e) { if (this._isDisposed) throw new Error("AbstractContextKeyService has been disposed"); - return new d_e(this, e); + return new ixe(this, e); } contextMatchesRules(e) { if (this._isDisposed) @@ -105266,59 +105266,59 @@ class s8 extends R { if (this._isDisposed) return; const i = this.getContextValuesContainer(this._myContextId); - i && i.setValue(e, t) && this._onDidChangeContext.fire(new RB(e)); + i && i.setValue(e, t) && this._onDidChangeContext.fire(new cU(e)); } removeContext(e) { - this._isDisposed || this.getContextValuesContainer(this._myContextId).removeValue(e) && this._onDidChangeContext.fire(new RB(e)); + this._isDisposed || this.getContextValuesContainer(this._myContextId).removeValue(e) && this._onDidChangeContext.fire(new cU(e)); } getContext(e) { - return this._isDisposed ? Pb.INSTANCE : this.getContextValuesContainer(h_e(e)); + return this._isDisposed ? QZ.INSTANCE : this.getContextValuesContainer(nxe(e)); } dispose() { super.dispose(), this._isDisposed = !0; } } -let rR = class extends s8 { +let xk = class extends D8 { constructor(e) { super(0), this._contexts = /* @__PURE__ */ new Map(), this._lastContextId = 0; - const t = this._register(new oR(this._myContextId, e, this._onDidChangeContext)); + const t = this._register(new Sk(this._myContextId, e, this._onDidChangeContext)); this._contexts.set(this._myContextId, t); } getContextValuesContainer(e) { - return this._isDisposed ? Pb.INSTANCE : this._contexts.get(e) || Pb.INSTANCE; + return this._isDisposed ? QZ.INSTANCE : this._contexts.get(e) || QZ.INSTANCE; } createChildContext(e = this._myContextId) { if (this._isDisposed) throw new Error("ContextKeyService has been disposed"); const t = ++this._lastContextId; - return this._contexts.set(t, new y9(t, this.getContextValuesContainer(e))), t; + return this._contexts.set(t, new AE(t, this.getContextValuesContainer(e))), t; } disposeContext(e) { this._isDisposed || this._contexts.delete(e); } }; -rR = o_e([ - r_e(0, Ke) -], rR); -class d_e extends s8 { +xk = jSe([ + qSe(0, Qe) +], xk); +class ixe extends D8 { constructor(e, t) { - if (super(e.createChildContext()), this._parentChangeListener = this._register(new fn()), this._parent = e, this._updateParentChangeListener(), this._domNode = t, this._domNode.hasAttribute(aw)) { + if (super(e.createChildContext()), this._parentChangeListener = this._register(new Zn()), this._parent = e, this._updateParentChangeListener(), this._domNode = t, this._domNode.hasAttribute(yy)) { let i = ""; this._domNode.classList && (i = Array.from(this._domNode.classList.values()).join(", ")), console.error(`Element already has context attribute${i ? ": " + i : ""}`); } - this._domNode.setAttribute(aw, String(this._myContextId)); + this._domNode.setAttribute(yy, String(this._myContextId)); } _updateParentChangeListener() { this._parentChangeListener.value = this._parent.onDidChangeContext((e) => { const i = this._parent.getContextValuesContainer(this._myContextId).value; - c_e(e, i) || this._onDidChangeContext.fire(e); + txe(e, i) || this._onDidChangeContext.fire(e); }); } dispose() { - this._isDisposed || (this._parent.disposeContext(this._myContextId), this._domNode.removeAttribute(aw), super.dispose()); + this._isDisposed || (this._parent.disposeContext(this._myContextId), this._domNode.removeAttribute(yy), super.dispose()); } getContextValuesContainer(e) { - return this._isDisposed ? Pb.INSTANCE : this._parent.getContextValuesContainer(e); + return this._isDisposed ? QZ.INSTANCE : this._parent.getContextValuesContainer(e); } createChildContext(e = this._myContextId) { if (this._isDisposed) @@ -105329,32 +105329,32 @@ class d_e extends s8 { this._isDisposed || this._parent.disposeContext(e); } } -function h_e(s) { +function nxe(s) { for (; s; ) { - if (s.hasAttribute(aw)) { - const e = s.getAttribute(aw); + if (s.hasAttribute(yy)) { + const e = s.getAttribute(yy); return e ? parseInt(e, 10) : NaN; } s = s.parentElement; } return 0; } -function u_e(s, e, t) { - s.get(_e).createKey(String(e), g_e(t)); +function sxe(s, e, t) { + s.get(xe).createKey(String(e), oxe(t)); } -function g_e(s) { - return PJ(s, (e) => { +function oxe(s) { + return I_(s, (e) => { if (typeof e == "object" && e.$mid === 1) - return Le.revive(e).toString(); - if (e instanceof Le) + return Xe.revive(e).toString(); + if (e instanceof Xe) return e.toString(); }); } -st.registerCommand("_setContext", u_e); +st.registerCommand("_setContext", sxe); st.registerCommand({ id: "getContextKeyInfo", handler() { - return [...ae.all()].sort((s, e) => s.key.localeCompare(e.key)); + return [...ce.all()].sort((s, e) => s.key.localeCompare(e.key)); }, metadata: { description: p("getContextKeyInfo", "A command that returns information about context keys"), @@ -105363,16 +105363,16 @@ st.registerCommand({ }); st.registerCommand("_generateContextKeyInfo", function() { const s = [], e = /* @__PURE__ */ new Set(); - for (const t of ae.all()) + for (const t of ce.all()) e.has(t.key) || (e.add(t.key), s.push(t)); s.sort((t, i) => t.key.localeCompare(i.key)), console.log(JSON.stringify(s, void 0, 2)); }); -let m_e = class { +let lxe = class { constructor(e, t) { this.key = e, this.data = t, this.incoming = /* @__PURE__ */ new Map(), this.outgoing = /* @__PURE__ */ new Map(); } }; -class XB { +class aU { constructor(e) { this._hashFn = e, this._nodes = /* @__PURE__ */ new Map(); } @@ -105395,7 +105395,7 @@ class XB { lookupOrInsertNode(e) { const t = this._hashFn(e); let i = this._nodes.get(t); - return i || (i = new m_e(t, e), this._nodes.set(t, i)), i; + return i || (i = new lxe(t, e), this._nodes.set(t, i)), i; } isEmpty() { return this._nodes.size === 0; @@ -105433,22 +105433,22 @@ class XB { } } } -const p_e = !1; -class FB extends Error { +const rxe = !1; +class hU extends Error { constructor(e) { - super("cyclic dependency between services"), this.message = e.findCycleSlow() ?? `UNABLE to detect cycle, dumping graph: + super("cyclic dependency between services"), this.message = e.findCycleSlow() ?? `UNABLE to detect cycle, dumping graph: ${e.toString()}`; } } -class XM { - constructor(e = new l0(), t = !1, i, n = p_e) { - this._services = e, this._strict = t, this._parent = i, this._enableTracing = n, this._isDisposed = !1, this._servicesToMaybeDispose = /* @__PURE__ */ new Set(), this._children = /* @__PURE__ */ new Set(), this._activeInstantiations = /* @__PURE__ */ new Set(), this._services.set(Se, this), this._globalGraph = n ? (i == null ? void 0 : i._globalGraph) ?? new XB((o) => o) : void 0; +class e2 { + constructor(e = new m0(), t = !1, i, n = rxe) { + this._services = e, this._strict = t, this._parent = i, this._enableTracing = n, this._isDisposed = !1, this._servicesToMaybeDispose = /* @__PURE__ */ new Set(), this._children = /* @__PURE__ */ new Set(), this._activeInstantiations = /* @__PURE__ */ new Set(), this._services.set(Ge, this), this._globalGraph = n ? (i == null ? void 0 : i._globalGraph) ?? new aU((o) => o) : void 0; } dispose() { if (!this._isDisposed) { - this._isDisposed = !0, Wt(this._children), this._children.clear(); + this._isDisposed = !0, Nt(this._children), this._children.clear(); for (const e of this._servicesToMaybeDispose) - __(e) && e.dispose(); + zS(e) && e.dispose(); this._servicesToMaybeDispose.clear(); } } @@ -105458,7 +105458,7 @@ class XM { } createChild(e, t) { this._throwIfDisposed(); - const i = this, n = new class extends XM { + const i = this, n = new class extends e2 { dispose() { i._children.delete(n), super.dispose(); } @@ -105467,17 +105467,17 @@ class XM { } invokeFunction(e, ...t) { this._throwIfDisposed(); - const i = cw.traceInvocation(this._enableTracing, e); + const i = Wy.traceInvocation(this._enableTracing, e); let n = !1; try { return e({ - get: (r) => { + get: (l) => { if (n) - throw KR("service accessor is only valid during the invocation of its target method"); - const l = this._getOrCreateServiceInstance(r, i); - if (!l) - throw new Error(`[invokeFunction] unknown service '${r}'`); - return l; + throw Wv("service accessor is only valid during the invocation of its target method"); + const r = this._getOrCreateServiceInstance(l, i); + if (!r) + throw new Error(`[invokeFunction] unknown service '${l}'`); + return r; } }, ...t); } finally { @@ -105487,24 +105487,24 @@ class XM { createInstance(e, ...t) { this._throwIfDisposed(); let i, n; - return e instanceof ga ? (i = cw.traceCreation(this._enableTracing, e.ctor), n = this._createInstance(e.ctor, e.staticArguments.concat(t), i)) : (i = cw.traceCreation(this._enableTracing, e), n = this._createInstance(e, t, i)), i.stop(), n; + return e instanceof Zc ? (i = Wy.traceCreation(this._enableTracing, e.ctor), n = this._createInstance(e.ctor, e.staticArguments.concat(t), i)) : (i = Wy.traceCreation(this._enableTracing, e), n = this._createInstance(e, t, i)), i.stop(), n; } _createInstance(e, t = [], i) { - const n = Ll.getServiceDependencies(e).sort((l, a) => l.index - a.index), o = []; - for (const l of n) { - const a = this._getOrCreateServiceInstance(l.id, i); - a || this._throwIfStrict(`[createInstance] ${e.name} depends on UNKNOWN service ${l.id}.`, !1), o.push(a); + const n = Sr.getServiceDependencies(e).sort((r, c) => r.index - c.index), o = []; + for (const r of n) { + const c = this._getOrCreateServiceInstance(r.id, i); + c || this._throwIfStrict(`[createInstance] ${e.name} depends on UNKNOWN service ${r.id}.`, !1), o.push(c); } - const r = n.length > 0 ? n[0].index : t.length; - if (t.length !== r) { - console.trace(`[createInstance] First service dependency of ${e.name} at position ${r + 1} conflicts with ${t.length} static arguments`); - const l = r - t.length; - l > 0 ? t = t.concat(new Array(l)) : t = t.slice(0, r); + const l = n.length > 0 ? n[0].index : t.length; + if (t.length !== l) { + console.trace(`[createInstance] First service dependency of ${e.name} at position ${l + 1} conflicts with ${t.length} static arguments`); + const r = l - t.length; + r > 0 ? t = t.concat(new Array(r)) : t = t.slice(0, l); } return Reflect.construct(e, t.concat(o)); } _setCreatedServiceInstance(e, t) { - if (this._services.get(e) instanceof ga) + if (this._services.get(e) instanceof Zc) this._services.set(e, t); else if (this._parent) this._parent._setCreatedServiceInstance(e, t); @@ -105518,7 +105518,7 @@ class XM { _getOrCreateServiceInstance(e, t) { this._globalGraph && this._globalGraphImplicitDependency && this._globalGraph.insertEdge(this._globalGraphImplicitDependency, String(e)); const i = this._getServiceInstanceOrDescriptor(e); - return i instanceof ga ? this._safeCreateAndCacheServiceInstance(e, i, t.branch(e, !0)) : (t.branch(e, !1), i); + return i instanceof Zc ? this._safeCreateAndCacheServiceInstance(e, i, t.branch(e, !0)) : (t.branch(e, !1), i); } _safeCreateAndCacheServiceInstance(e, t, i) { if (this._activeInstantiations.has(e)) @@ -105531,94 +105531,94 @@ class XM { } } _createAndCacheServiceInstance(e, t, i) { - var a; - const n = new XB((c) => c.id.toString()); + var c; + const n = new aU((d) => d.id.toString()); let o = 0; - const r = [{ id: e, desc: t, _trace: i }], l = /* @__PURE__ */ new Set(); - for (; r.length; ) { - const c = r.pop(); - if (!l.has(String(c.id))) { - if (l.add(String(c.id)), n.lookupOrInsertNode(c), o++ > 1e3) - throw new FB(n); - for (const d of Ll.getServiceDependencies(c.desc.ctor)) { - const h = this._getServiceInstanceOrDescriptor(d.id); - if (h || this._throwIfStrict(`[createInstance] ${e} depends on ${d.id} which is NOT registered.`, !0), (a = this._globalGraph) == null || a.insertEdge(String(c.id), String(d.id)), h instanceof ga) { - const u = { id: d.id, desc: h, _trace: c._trace.branch(d.id, !0) }; - n.insertEdge(c, u), r.push(u); + const l = [{ id: e, desc: t, _trace: i }], r = /* @__PURE__ */ new Set(); + for (; l.length; ) { + const d = l.pop(); + if (!r.has(String(d.id))) { + if (r.add(String(d.id)), n.lookupOrInsertNode(d), o++ > 1e3) + throw new hU(n); + for (const a of Sr.getServiceDependencies(d.desc.ctor)) { + const h = this._getServiceInstanceOrDescriptor(a.id); + if (h || this._throwIfStrict(`[createInstance] ${e} depends on ${a.id} which is NOT registered.`, !0), (c = this._globalGraph) == null || c.insertEdge(String(d.id), String(a.id)), h instanceof Zc) { + const u = { id: a.id, desc: h, _trace: d._trace.branch(a.id, !0) }; + n.insertEdge(d, u), l.push(u); } } } } for (; ; ) { - const c = n.roots(); - if (c.length === 0) { + const d = n.roots(); + if (d.length === 0) { if (!n.isEmpty()) - throw new FB(n); + throw new hU(n); break; } - for (const { data: d } of c) { - if (this._getServiceInstanceOrDescriptor(d.id) instanceof ga) { - const u = this._createServiceInstanceWithOwner(d.id, d.desc.ctor, d.desc.staticArguments, d.desc.supportsDelayedInstantiation, d._trace); - this._setCreatedServiceInstance(d.id, u); + for (const { data: a } of d) { + if (this._getServiceInstanceOrDescriptor(a.id) instanceof Zc) { + const u = this._createServiceInstanceWithOwner(a.id, a.desc.ctor, a.desc.staticArguments, a.desc.supportsDelayedInstantiation, a._trace); + this._setCreatedServiceInstance(a.id, u); } - n.removeNode(d); + n.removeNode(a); } } return this._getServiceInstanceOrDescriptor(e); } _createServiceInstanceWithOwner(e, t, i = [], n, o) { - if (this._services.get(e) instanceof ga) + if (this._services.get(e) instanceof Zc) return this._createServiceInstance(e, t, i, n, o, this._servicesToMaybeDispose); if (this._parent) return this._parent._createServiceInstanceWithOwner(e, t, i, n, o); throw new Error(`illegalState - creating UNKNOWN service instance ${t.name}`); } - _createServiceInstance(e, t, i = [], n, o, r) { + _createServiceInstance(e, t, i = [], n, o, l) { if (n) { - const l = new XM(void 0, this._strict, this, this._enableTracing); - l._globalGraphImplicitDependency = String(e); - const a = /* @__PURE__ */ new Map(), c = new N6(() => { - const d = l._createInstance(t, i, o); - for (const [h, u] of a) { - const g = d[h]; - if (typeof g == "function") - for (const m of u) - m.disposable = g.apply(d, m.listener); + const r = new e2(void 0, this._strict, this, this._enableTracing); + r._globalGraphImplicitDependency = String(e); + const c = /* @__PURE__ */ new Map(), d = new Gq(() => { + const a = r._createInstance(t, i, o); + for (const [h, u] of c) { + const m = a[h]; + if (typeof m == "function") + for (const b of u) + b.disposable = m.apply(a, b.listener); } - return a.clear(), r.add(d), d; + return c.clear(), l.add(a), a; }); return new Proxy(/* @__PURE__ */ Object.create(null), { - get(d, h) { - if (!c.isInitialized && typeof h == "string" && (h.startsWith("onDid") || h.startsWith("onWill"))) { - let m = a.get(h); - return m || (m = new cs(), a.set(h, m)), (b, y, w) => { - if (c.isInitialized) - return c.value[h](b, y, w); + get(a, h) { + if (!d.isInitialized && typeof h == "string" && (h.startsWith("onDid") || h.startsWith("onWill"))) { + let b = c.get(h); + return b || (b = new hs(), c.set(h, b)), (Z, f, y) => { + if (d.isInitialized) + return d.value[h](Z, f, y); { - const C = { listener: [b, y, w], disposable: void 0 }, S = m.push(C); - return Ce(() => { - var x; - S(), (x = C.disposable) == null || x.dispose(); + const W = { listener: [Z, f, y], disposable: void 0 }, G = b.push(W); + return We(() => { + var L; + G(), (L = W.disposable) == null || L.dispose(); }); } }; } - if (h in d) - return d[h]; - const u = c.value; - let g = u[h]; - return typeof g != "function" || (g = g.bind(u), d[h] = g), g; + if (h in a) + return a[h]; + const u = d.value; + let m = u[h]; + return typeof m != "function" || (m = m.bind(u), a[h] = m), m; }, - set(d, h, u) { - return c.value[h] = u, !0; + set(a, h, u) { + return d.value[h] = u, !0; }, - getPrototypeOf(d) { + getPrototypeOf(a) { return t.prototype; } }); } else { - const l = this._createInstance(t, i, o); - return r.add(l), l; + const r = this._createInstance(t, i, o); + return l.add(r), r; } } _throwIfStrict(e, t) { @@ -105626,48 +105626,48 @@ class XM { throw new Error(e); } } -const Zo = class Zo { +const Co = class Co { static traceInvocation(e, t) { - return e ? new Zo(2, t.name || new Error().stack.split(` + return e ? new Co(2, t.name || new Error().stack.split(` `).slice(3, 4).join(` -`)) : Zo._None; +`)) : Co._None; } static traceCreation(e, t) { - return e ? new Zo(1, t.name) : Zo._None; + return e ? new Co(1, t.name) : Co._None; } constructor(e, t) { this.type = e, this.name = t, this._start = Date.now(), this._dep = []; } branch(e, t) { - const i = new Zo(3, e.toString()); + const i = new Co(3, e.toString()); return this._dep.push([e, t, i]), i; } stop() { const e = Date.now() - this._start; - Zo._totals += e; + Co._totals += e; let t = !1; - function i(o, r) { - const l = [], a = new Array(o + 1).join(" "); - for (const [c, d, h] of r._dep) - if (d && h) { - t = !0, l.push(`${a}CREATES -> ${c}`); + function i(o, l) { + const r = [], c = new Array(o + 1).join(" "); + for (const [d, a, h] of l._dep) + if (a && h) { + t = !0, r.push(`${c}CREATES -> ${d}`); const u = i(o + 1, h); - u && l.push(u); + u && r.push(u); } else - l.push(`${a}uses -> ${c}`); - return l.join(` + r.push(`${c}uses -> ${d}`); + return r.join(` `); } const n = [ `${this.type === 1 ? "CREATE" : "CALL"} ${this.name}`, `${i(1, this)}`, - `DONE, took ${e.toFixed(2)}ms (grand total ${Zo._totals.toFixed(2)}ms)` + `DONE, took ${e.toFixed(2)}ms (grand total ${Co._totals.toFixed(2)}ms)` ]; - (e > 2 || t) && Zo.all.add(n.join(` + (e > 2 || t) && Co.all.add(n.join(` `)); } }; -Zo.all = /* @__PURE__ */ new Set(), Zo._None = new class extends Zo { +Co.all = /* @__PURE__ */ new Set(), Co._None = new class extends Co { constructor() { super(0, null); } @@ -105676,24 +105676,24 @@ Zo.all = /* @__PURE__ */ new Set(), Zo._None = new class extends Zo { branch() { return this; } -}(), Zo._totals = 0; -let cw = Zo; -const f_e = /* @__PURE__ */ new Set([ - Ge.inMemory, - Ge.vscodeSourceControl, - Ge.walkThrough, - Ge.walkThroughSnippet, - Ge.vscodeChatCodeBlock +}(), Co._totals = 0; +let Wy = Co; +const cxe = /* @__PURE__ */ new Set([ + ve.inMemory, + ve.vscodeSourceControl, + ve.walkThrough, + ve.walkThroughSnippet, + ve.vscodeChatCodeBlock ]); -class b_e { +class dxe { constructor() { - this._byResource = new sn(), this._byOwner = /* @__PURE__ */ new Map(); + this._byResource = new on(), this._byOwner = /* @__PURE__ */ new Map(); } set(e, t, i) { let n = this._byResource.get(e); n || (n = /* @__PURE__ */ new Map(), this._byResource.set(e, n)), n.set(t, i); let o = this._byOwner.get(t); - o || (o = new sn(), this._byOwner.set(t, o)), o.set(e, i); + o || (o = new on(), this._byOwner.set(t, o)), o.set(e, i); } get(e, t) { const i = this._byResource.get(e); @@ -105703,19 +105703,19 @@ class b_e { let i = !1, n = !1; const o = this._byResource.get(e); o && (i = o.delete(t)); - const r = this._byOwner.get(t); - if (r && (n = r.delete(e)), i !== n) + const l = this._byOwner.get(t); + if (l && (n = l.delete(e)), i !== n) throw new Error("illegal state"); return i && n; } values(e) { var t, i; - return typeof e == "string" ? ((t = this._byOwner.get(e)) == null ? void 0 : t.values()) ?? nt.empty() : Le.isUri(e) ? ((i = this._byResource.get(e)) == null ? void 0 : i.values()) ?? nt.empty() : nt.map(nt.concat(...this._byOwner.values()), (n) => n[1]); + return typeof e == "string" ? ((t = this._byOwner.get(e)) == null ? void 0 : t.values()) ?? nt.empty() : Xe.isUri(e) ? ((i = this._byResource.get(e)) == null ? void 0 : i.values()) ?? nt.empty() : nt.map(nt.concat(...this._byOwner.values()), (n) => n[1]); } } -class y_e { +class axe { constructor(e) { - this.errors = 0, this.infos = 0, this.warnings = 0, this.unknowns = 0, this._data = new sn(), this._service = e, this._subscription = e.onMarkerChanged(this._update, this); + this.errors = 0, this.infos = 0, this.warnings = 0, this.unknowns = 0, this._data = new on(), this._service = e, this._subscription = e.onMarkerChanged(this._update, this); } dispose() { this._subscription.dispose(); @@ -105730,10 +105730,10 @@ class y_e { } _resourceStats(e) { const t = { errors: 0, warnings: 0, infos: 0, unknowns: 0 }; - if (f_e.has(e.scheme)) + if (cxe.has(e.scheme)) return t; for (const { severity: i } of this._service.read({ resource: e })) - i === gi.Error ? t.errors += 1 : i === gi.Warning ? t.warnings += 1 : i === gi.Info ? t.infos += 1 : t.unknowns += 1; + i === bi.Error ? t.errors += 1 : i === bi.Warning ? t.warnings += 1 : i === bi.Info ? t.infos += 1 : t.unknowns += 1; return t; } _substract(e) { @@ -105743,12 +105743,12 @@ class y_e { this.errors += e.errors, this.warnings += e.warnings, this.infos += e.infos, this.unknowns += e.unknowns; } } -class xd { +class Ca { constructor() { - this._onMarkerChanged = new LH({ + this._onMarkerChanged = new sB({ delay: 0, - merge: xd._merge - }), this.onMarkerChanged = this._onMarkerChanged.event, this._data = new b_e(), this._stats = new y_e(this); + merge: Ca._merge + }), this.onMarkerChanged = this._onMarkerChanged.event, this._data = new dxe(), this._stats = new axe(this); } dispose() { this._stats.dispose(), this._onMarkerChanged.dispose(); @@ -105758,91 +105758,91 @@ class xd { this.changeOne(e, i, []); } changeOne(e, t, i) { - if (AJ(i)) + if (o_(i)) this._data.delete(t, e) && this._onMarkerChanged.fire([t]); else { const n = []; for (const o of i) { - const r = xd._toMarker(e, t, o); - r && n.push(r); + const l = Ca._toMarker(e, t, o); + l && n.push(l); } this._data.set(t, e, n), this._onMarkerChanged.fire([t]); } } static _toMarker(e, t, i) { - let { code: n, severity: o, message: r, source: l, startLineNumber: a, startColumn: c, endLineNumber: d, endColumn: h, relatedInformation: u, tags: g } = i; - if (r) - return a = a > 0 ? a : 1, c = c > 0 ? c : 1, d = d >= a ? d : a, h = h > 0 ? h : c, { + let { code: n, severity: o, message: l, source: r, startLineNumber: c, startColumn: d, endLineNumber: a, endColumn: h, relatedInformation: u, tags: m } = i; + if (l) + return c = c > 0 ? c : 1, d = d > 0 ? d : 1, a = a >= c ? a : c, h = h > 0 ? h : d, { resource: t, owner: e, code: n, severity: o, - message: r, - source: l, - startLineNumber: a, - startColumn: c, - endLineNumber: d, + message: l, + source: r, + startLineNumber: c, + startColumn: d, + endLineNumber: a, endColumn: h, relatedInformation: u, - tags: g + tags: m }; } changeAll(e, t) { const i = [], n = this._data.values(e); if (n) for (const o of n) { - const r = nt.first(o); - r && (i.push(r.resource), this._data.delete(r.resource, e)); + const l = nt.first(o); + l && (i.push(l.resource), this._data.delete(l.resource, e)); } - if ($n(t)) { - const o = new sn(); - for (const { resource: r, marker: l } of t) { - const a = xd._toMarker(e, r, l); - if (!a) + if (ts(t)) { + const o = new on(); + for (const { resource: l, marker: r } of t) { + const c = Ca._toMarker(e, l, r); + if (!c) continue; - const c = o.get(r); - c ? c.push(a) : (o.set(r, [a]), i.push(r)); + const d = o.get(l); + d ? d.push(c) : (o.set(l, [c]), i.push(l)); } - for (const [r, l] of o) - this._data.set(r, e, l); + for (const [l, r] of o) + this._data.set(l, e, r); } i.length > 0 && this._onMarkerChanged.fire(i); } read(e = /* @__PURE__ */ Object.create(null)) { let { owner: t, resource: i, severities: n, take: o } = e; if ((!o || o < 0) && (o = -1), t && i) { - const r = this._data.get(i, t); - if (r) { - const l = []; - for (const a of r) - if (xd._accept(a, n)) { - const c = l.push(a); - if (o > 0 && c === o) + const l = this._data.get(i, t); + if (l) { + const r = []; + for (const c of l) + if (Ca._accept(c, n)) { + const d = r.push(c); + if (o > 0 && d === o) break; } - return l; + return r; } else return []; } else if (!t && !i) { - const r = []; - for (const l of this._data.values()) - for (const a of l) - if (xd._accept(a, n)) { - const c = r.push(a); - if (o > 0 && c === o) - return r; - } - return r; - } else { - const r = this._data.values(i ?? t), l = []; - for (const a of r) - for (const c of a) - if (xd._accept(c, n)) { + const l = []; + for (const r of this._data.values()) + for (const c of r) + if (Ca._accept(c, n)) { const d = l.push(c); if (o > 0 && d === o) return l; } return l; + } else { + const l = this._data.values(i ?? t), r = []; + for (const c of l) + for (const d of c) + if (Ca._accept(d, n)) { + const a = r.push(d); + if (o > 0 && a === o) + return r; + } + return r; } } static _accept(e, t) { @@ -105850,19 +105850,19 @@ class xd { } // --- event debounce logic static _merge(e) { - const t = new sn(); + const t = new on(); for (const i of e) for (const n of i) t.set(n, !0); return Array.from(t.keys()); } } -class w_e extends R { +class hxe extends J { get configurationModel() { return this._configurationModel; } constructor(e) { - super(), this.logService = e, this._configurationModel = un.createEmptyModel(this.logService); + super(), this.logService = e, this._configurationModel = mn.createEmptyModel(this.logService); } reload() { return this.resetConfigurationModel(), this.configurationModel; @@ -105871,21 +105871,21 @@ class w_e extends R { return {}; } resetConfigurationModel() { - this._configurationModel = un.createEmptyModel(this.logService); - const e = Di.as($r.Configuration).getConfigurationProperties(); + this._configurationModel = mn.createEmptyModel(this.logService); + const e = ki.as(ir.Configuration).getConfigurationProperties(); this.updateConfigurationModel(Object.keys(e), e); } updateConfigurationModel(e, t) { const i = this.getConfigurationDefaultOverrides(); for (const n of e) { - const o = i[n], r = t[n]; - o !== void 0 ? this._configurationModel.setValue(n, o) : r ? this._configurationModel.setValue(n, r.default) : this._configurationModel.removeValue(n); + const o = i[n], l = t[n]; + o !== void 0 ? this._configurationModel.setValue(n, o) : l ? this._configurationModel.setValue(n, l.default) : this._configurationModel.removeValue(n); } } } -class C_e extends R { +class uxe extends J { constructor(e, t = []) { - super(), this.logger = new G$([e, ...t]), this._register(e.onDidChangeLogLevel((i) => this.setLevel(i))); + super(), this.logger = new Cee([e, ...t]), this._register(e.onDidChangeLogLevel((i) => this.setLevel(i))); } get onDidChangeLogLevel() { return this.logger.onDidChangeLogLevel; @@ -105912,21 +105912,21 @@ class C_e extends R { this.logger.error(e, ...t); } } -class S_e { +class mxe { getParseResult(e) { } } -var Ha = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Oc = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Ti = function(s, e) { +}, Yi = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class L_e { +class bxe { constructor(e) { this.disposed = !1, this.model = e, this._onWillDispose = new k(); } @@ -105937,27 +105937,27 @@ class L_e { this.disposed = !0, this._onWillDispose.fire(); } } -let lR = class { +let Ck = class { constructor(e) { this.modelService = e; } createModelReference(e) { const t = this.modelService.getModel(e); - return t ? Promise.resolve(new b6(new L_e(t))) : Promise.reject(new Error("Model not found")); + return t ? Promise.resolve(new dq(new bxe(t))) : Promise.reject(new Error("Model not found")); } }; -lR = Ha([ - Ti(0, Pt) -], lR); -const A_ = class A_ { +Ck = Oc([ + Yi(0, At) +], Ck); +const HS = class HS { show() { - return A_.NULL_PROGRESS_RUNNER; + return HS.NULL_PROGRESS_RUNNER; } async showWhile(e, t) { await e; } }; -A_.NULL_PROGRESS_RUNNER = { +HS.NULL_PROGRESS_RUNNER = { done: () => { }, total: () => { @@ -105965,8 +105965,8 @@ A_.NULL_PROGRESS_RUNNER = { worked: () => { } }; -let aR = A_; -class A_e { +let Rk = HS; +class pxe { withProgress(e, t, i) { return t({ report: () => { @@ -105974,12 +105974,12 @@ class A_e { }); } } -class x_e { +class gxe { constructor() { this.isExtensionDevelopment = !1, this.isBuilt = !1; } } -class M_e { +class Zxe { async confirm(e) { return { confirmed: this.doConfirm(e.message, e.detail), @@ -105991,7 +105991,7 @@ class M_e { let i = e; return t && (i = i + ` -` + t), vt.confirm(i); +` + t), wt.confirm(i); } async prompt(e) { var n; @@ -106003,42 +106003,42 @@ class M_e { return { result: t }; } async error(e, t) { - await this.prompt({ type: Mi.Error, message: e, detail: t }); + await this.prompt({ type: Si.Error, message: e, detail: t }); } } -const Nw = class Nw { +const Fy = class Fy { info(e) { - return this.notify({ severity: Mi.Info, message: e }); + return this.notify({ severity: Si.Info, message: e }); } warn(e) { - return this.notify({ severity: Mi.Warning, message: e }); + return this.notify({ severity: Si.Warning, message: e }); } error(e) { - return this.notify({ severity: Mi.Error, message: e }); + return this.notify({ severity: Si.Error, message: e }); } notify(e) { switch (e.severity) { - case Mi.Error: + case Si.Error: console.error(e.message); break; - case Mi.Warning: + case Si.Warning: console.warn(e.message); break; default: console.log(e.message); break; } - return Nw.NO_OP; + return Fy.NO_OP; } prompt(e, t, i, n) { - return Nw.NO_OP; + return Fy.NO_OP; } status(e, t) { - return R.None; + return J.None; } }; -Nw.NO_OP = new Uce(); -let cR = Nw, dR = class { +Fy.NO_OP = new Dae(); +let Nk = Fy, wk = class { constructor(e) { this._onWillExecuteCommand = new k(), this._onDidExecuteCommand = new k(), this.onDidExecuteCommand = this._onDidExecuteCommand.event, this._instantiationService = e; } @@ -106055,47 +106055,47 @@ let cR = Nw, dR = class { } } }; -dR = Ha([ - Ti(0, Se) -], dR); -let Bb = class extends KMe { - constructor(e, t, i, n, o, r) { +wk = Oc([ + Yi(0, Ge) +], wk); +let OZ = class extends F2e { + constructor(e, t, i, n, o, l) { super(e, t, i, n, o), this._cachedResolver = null, this._dynamicKeybindings = [], this._domNodeListeners = []; - const l = (g) => { - const m = new U(); - m.add(z(g, ie.KEY_DOWN, (f) => { - const b = new Vt(f); - this._dispatch(b, b.target) && (b.preventDefault(), b.stopPropagation()); - })), m.add(z(g, ie.KEY_UP, (f) => { - const b = new Vt(f); - this._singleModifierDispatch(b, b.target) && b.preventDefault(); - })), this._domNodeListeners.push(new Z_e(g, m)); - }, a = (g) => { - for (let m = 0; m < this._domNodeListeners.length; m++) { - const f = this._domNodeListeners[m]; - f.domNode === g && (this._domNodeListeners.splice(m, 1), f.dispose()); - } - }, c = (g) => { - g.getOption( + const r = (m) => { + const b = new _(); + b.add(z(m, ie.KEY_DOWN, (g) => { + const Z = new Yt(g); + this._dispatch(Z, Z.target) && (Z.preventDefault(), Z.stopPropagation()); + })), b.add(z(m, ie.KEY_UP, (g) => { + const Z = new Yt(g); + this._singleModifierDispatch(Z, Z.target) && Z.preventDefault(); + })), this._domNodeListeners.push(new fxe(m, b)); + }, c = (m) => { + for (let b = 0; b < this._domNodeListeners.length; b++) { + const g = this._domNodeListeners[b]; + g.domNode === m && (this._domNodeListeners.splice(b, 1), g.dispose()); + } + }, d = (m) => { + m.getOption( 61 /* EditorOption.inDiffEditor */ - ) || l(g.getContainerDomNode()); - }, d = (g) => { - g.getOption( + ) || r(m.getContainerDomNode()); + }, a = (m) => { + m.getOption( 61 /* EditorOption.inDiffEditor */ - ) || a(g.getContainerDomNode()); + ) || c(m.getContainerDomNode()); }; - this._register(r.onCodeEditorAdd(c)), this._register(r.onCodeEditorRemove(d)), r.listCodeEditors().forEach(c); - const h = (g) => { - l(g.getContainerDomNode()); - }, u = (g) => { - a(g.getContainerDomNode()); + this._register(l.onCodeEditorAdd(d)), this._register(l.onCodeEditorRemove(a)), l.listCodeEditors().forEach(d); + const h = (m) => { + r(m.getContainerDomNode()); + }, u = (m) => { + c(m.getContainerDomNode()); }; - this._register(r.onDiffEditorAdd(h)), this._register(r.onDiffEditorRemove(u)), r.listDiffEditors().forEach(h); + this._register(l.onDiffEditorAdd(h)), this._register(l.onDiffEditorRemove(u)), l.listDiffEditors().forEach(h); } addDynamicKeybinding(e, t, i, n) { - return Yr(st.registerCommand(e, i), this.addDynamicKeybindings([{ + return Kl(st.registerCommand(e, i), this.addDynamicKeybindings([{ keybinding: t, command: e, when: n @@ -106103,7 +106103,7 @@ let Bb = class extends KMe { } addDynamicKeybindings(e) { const t = e.map((i) => ({ - keybinding: f2(i.keybinding, ro), + keybinding: JN(i.keybinding, co), command: i.command ?? null, commandArgs: i.commandArgs, when: i.when, @@ -106112,7 +106112,7 @@ let Bb = class extends KMe { extensionId: null, isBuiltinExtension: !1 })); - return this._dynamicKeybindings = this._dynamicKeybindings.concat(t), this.updateResolver(), Ce(() => { + return this._dynamicKeybindings = this._dynamicKeybindings.concat(t), this.updateResolver(), We(() => { for (let i = 0; i < this._dynamicKeybindings.length; i++) if (this._dynamicKeybindings[i] === t[0]) { this._dynamicKeybindings.splice(i, t.length), this.updateResolver(); @@ -106125,68 +106125,68 @@ let Bb = class extends KMe { } _getResolver() { if (!this._cachedResolver) { - const e = this._toNormalizedKeybindingItems(ws.getDefaultKeybindings(), !0), t = this._toNormalizedKeybindingItems(this._dynamicKeybindings, !1); - this._cachedResolver = new ow(e, t, (i) => this._log(i)); + const e = this._toNormalizedKeybindingItems(Gs.getDefaultKeybindings(), !0), t = this._toNormalizedKeybindingItems(this._dynamicKeybindings, !1); + this._cachedResolver = new gy(e, t, (i) => this._log(i)); } return this._cachedResolver; } _documentHasFocus() { - return vt.document.hasFocus(); + return wt.document.hasFocus(); } _toNormalizedKeybindingItems(e, t) { const i = []; let n = 0; for (const o of e) { - const r = o.when || void 0, l = o.keybinding; - if (!l) - i[n++] = new yB(void 0, o.command, o.commandArgs, r, t, null, !1); + const l = o.when || void 0, r = o.keybinding; + if (!r) + i[n++] = new A3(void 0, o.command, o.commandArgs, l, t, null, !1); else { - const a = eC.resolveKeybinding(l, ro); - for (const c of a) - i[n++] = new yB(c, o.command, o.commandArgs, r, t, null, !1); + const c = uG.resolveKeybinding(r, co); + for (const d of c) + i[n++] = new A3(d, o.command, o.commandArgs, l, t, null, !1); } } return i; } resolveKeyboardEvent(e) { - const t = new zc(e.ctrlKey, e.shiftKey, e.altKey, e.metaKey, e.keyCode); - return new eC([t], ro); + const t = new Pd(e.ctrlKey, e.shiftKey, e.altKey, e.metaKey, e.keyCode); + return new uG([t], co); } }; -Bb = Ha([ - Ti(0, _e), - Ti(1, Qt), - Ti(2, Ls), - Ti(3, Vi), - Ti(4, Xn), - Ti(5, ft) -], Bb); -class Z_e extends R { +OZ = Oc([ + Yi(0, xe), + Yi(1, Ot), + Yi(2, Ls), + Yi(3, vi), + Yi(4, Fn), + Yi(5, gt) +], OZ); +class fxe extends J { constructor(e, t) { super(), this.domNode = e, this._register(t); } } -function YB(s) { - return s && typeof s == "object" && (!s.overrideIdentifier || typeof s.overrideIdentifier == "string") && (!s.resource || s.resource instanceof Le); +function uU(s) { + return s && typeof s == "object" && (!s.overrideIdentifier || typeof s.overrideIdentifier == "string") && (!s.resource || s.resource instanceof Xe); } -let FM = class { +let t2 = class { constructor(e) { this.logService = e, this._onDidChangeConfiguration = new k(), this.onDidChangeConfiguration = this._onDidChangeConfiguration.event; - const t = new w_e(e); - this._configuration = new lN(t.reload(), un.createEmptyModel(e), un.createEmptyModel(e), un.createEmptyModel(e), un.createEmptyModel(e), un.createEmptyModel(e), new sn(), un.createEmptyModel(e), new sn(), e), t.dispose(); + const t = new hxe(e); + this._configuration = new XC(t.reload(), mn.createEmptyModel(e), mn.createEmptyModel(e), mn.createEmptyModel(e), mn.createEmptyModel(e), mn.createEmptyModel(e), new on(), mn.createEmptyModel(e), new on(), e), t.dispose(); } getValue(e, t) { - const i = typeof e == "string" ? e : void 0, n = YB(e) ? e : YB(t) ? t : {}; + const i = typeof e == "string" ? e : void 0, n = uU(e) ? e : uU(t) ? t : {}; return this._configuration.getValue(i, n, void 0); } updateValues(e) { const t = { data: this._configuration.toData() }, i = []; for (const n of e) { - const [o, r] = n; - this.getValue(o) !== r && (this._configuration.updateValue(o, r), i.push(o)); + const [o, l] = n; + this.getValue(o) !== l && (this._configuration.updateValue(o, l), i.push(o)); } if (i.length > 0) { - const n = new OMe({ keys: i, overrides: [] }, t, this._configuration, void 0, this.logService); + const n = new J2e({ keys: i, overrides: [] }, t, this._configuration, void 0, this.logService); n.source = 8, this._onDidChangeConfiguration.fire(n); } return Promise.resolve(); @@ -106198,23 +106198,23 @@ let FM = class { return this._configuration.inspect(e, t, void 0); } }; -FM = Ha([ - Ti(0, Xn) -], FM); -let hR = class { +t2 = Oc([ + Yi(0, Fn) +], t2); +let Tk = class { constructor(e, t, i) { this.configurationService = e, this.modelService = t, this.languageService = i, this._onDidChangeConfiguration = new k(), this.configurationService.onDidChangeConfiguration((n) => { - this._onDidChangeConfiguration.fire({ affectedKeys: n.affectedKeys, affectsConfiguration: (o, r) => n.affectsConfiguration(r) }); + this._onDidChangeConfiguration.fire({ affectedKeys: n.affectedKeys, affectsConfiguration: (o, l) => n.affectsConfiguration(l) }); }); } getValue(e, t, i) { - const n = V.isIPosition(t) ? t : null, o = n ? typeof i == "string" ? i : void 0 : typeof t == "string" ? t : void 0, r = e ? this.getLanguage(e, n) : void 0; + const n = Y.isIPosition(t) ? t : null, o = n ? typeof i == "string" ? i : void 0 : typeof t == "string" ? t : void 0, l = e ? this.getLanguage(e, n) : void 0; return typeof o > "u" ? this.configurationService.getValue({ resource: e, - overrideIdentifier: r + overrideIdentifier: l }) : this.configurationService.getValue(o, { resource: e, - overrideIdentifier: r + overrideIdentifier: l }); } getLanguage(e, t) { @@ -106222,12 +106222,12 @@ let hR = class { return i ? t ? i.getLanguageIdAtPosition(t.lineNumber, t.column) : i.getLanguageId() : this.languageService.guessLanguageIdByFilepathOrFirstLine(e); } }; -hR = Ha([ - Ti(0, Ke), - Ti(1, Pt), - Ti(2, ri) -], hR); -let uR = class { +Tk = Oc([ + Yi(0, Qe), + Yi(1, At), + Yi(2, ri) +], Tk); +let Mk = class { constructor(e) { this.configurationService = e; } @@ -106238,36 +106238,36 @@ let uR = class { `; } }; -uR = Ha([ - Ti(0, Ke) -], uR); -class __e { +Mk = Oc([ + Yi(0, Qe) +], Mk); +class yxe { publicLog2() { } } -const Ww = class Ww { +const zy = class zy { constructor() { - const e = Le.from({ scheme: Ww.SCHEME, authority: "model", path: "/" }); - this.workspace = { id: I4, folders: [new Fme({ uri: e, name: "", index: 0 })] }; + const e = Xe.from({ scheme: zy.SCHEME, authority: "model", path: "/" }); + this.workspace = { id: aj, folders: [new Tpe({ uri: e, name: "", index: 0 })] }; } getWorkspace() { return this.workspace; } getWorkspaceFolder(e) { - return e && e.scheme === Ww.SCHEME ? this.workspace.folders[0] : null; + return e && e.scheme === zy.SCHEME ? this.workspace.folders[0] : null; } }; -Ww.SCHEME = "inmemory"; -let gR = Ww; -function YM(s, e, t) { - if (!e || !(s instanceof FM)) +zy.SCHEME = "inmemory"; +let Yk = zy; +function i2(s, e, t) { + if (!e || !(s instanceof t2)) return; const i = []; Object.keys(e).forEach((n) => { - rpe(n) && i.push([`editor.${n}`, e[n]]), t && lpe(n) && i.push([`diffEditor.${n}`, e[n]]); + qpe(n) && i.push([`editor.${n}`, e[n]]), t && $pe(n) && i.push([`diffEditor.${n}`, e[n]]); }), i.length > 0 && s.updateValues(i); } -let mR = class { +let kk = class { constructor(e) { this._modelService = e; } @@ -106275,39 +106275,39 @@ let mR = class { return !1; } async apply(e, t) { - const i = Array.isArray(e) ? e : JX.convert(e), n = /* @__PURE__ */ new Map(); - for (const l of i) { - if (!(l instanceof sh)) + const i = Array.isArray(e) ? e : fH.convert(e), n = /* @__PURE__ */ new Map(); + for (const r of i) { + if (!(r instanceof ch)) throw new Error("bad edit - only text edits are supported"); - const a = this._modelService.getModel(l.resource); - if (!a) + const c = this._modelService.getModel(r.resource); + if (!c) throw new Error("bad edit - model not found"); - if (typeof l.versionId == "number" && a.getVersionId() !== l.versionId) + if (typeof r.versionId == "number" && c.getVersionId() !== r.versionId) throw new Error("bad state - model changed in the meantime"); - let c = n.get(a); - c || (c = [], n.set(a, c)), c.push(si.replaceMove(M.lift(l.textEdit.range), l.textEdit.text)); + let d = n.get(c); + d || (d = [], n.set(c, d)), d.push(oi.replaceMove(I.lift(r.textEdit.range), r.textEdit.text)); } - let o = 0, r = 0; - for (const [l, a] of n) - l.pushStackElement(), l.pushEditOperations([], a, () => []), l.pushStackElement(), r += 1, o += a.length; + let o = 0, l = 0; + for (const [r, c] of n) + r.pushStackElement(), r.pushEditOperations([], c, () => []), r.pushStackElement(), l += 1, o += c.length; return { - ariaSummary: rb(Ck.bulkEditServiceSummary, o, r), + ariaSummary: uZ(F5.bulkEditServiceSummary, o, l), isApplied: o > 0 }; } }; -mR = Ha([ - Ti(0, Pt) -], mR); -class I_e { +kk = Oc([ + Yi(0, At) +], kk); +class Wxe { getUriLabel(e, t) { return e.scheme === "file" ? e.fsPath : e.path; } getUriBasenameLabel(e) { - return Cr(e); + return Vl(e); } } -let pR = class extends XMe { +let vk = class extends w2e { constructor(e, t) { super(e), this._codeEditorService = t; } @@ -106319,11 +106319,11 @@ let pR = class extends XMe { return super.showContextView(e, t, i); } }; -pR = Ha([ - Ti(0, iu), - Ti(1, ft) -], pR); -class N_e { +vk = Oc([ + Yi(0, lu), + Yi(1, gt) +], vk); +class Gxe { constructor() { this._neverEmitter = new k(), this.onDidChangeTrust = this._neverEmitter.event; } @@ -106331,316 +106331,316 @@ class N_e { return !0; } } -class W_e extends vG { +class Xxe extends qY { constructor() { super(); } } -class v_e extends C_e { +class Vxe extends uxe { constructor() { - super(new k$()); + super(new xee()); } } -let fR = class extends VG { - constructor(e, t, i, n, o, r) { - super(e, t, i, n, o, r), this.configure({ blockMouse: !1 }); +let Jk = class extends tk { + constructor(e, t, i, n, o, l) { + super(e, t, i, n, o, l), this.configure({ blockMouse: !1 }); } }; -fR = Ha([ - Ti(0, Ls), - Ti(1, Vi), - Ti(2, rd), - Ti(3, xt), - Ti(4, Uo), - Ti(5, _e) -], fR); -const bR = { +Jk = Oc([ + Yi(0, Ls), + Yi(1, vi), + Yi(2, aa), + Yi(3, Lt), + Yi(4, Oo), + Yi(5, xe) +], Jk); +const Hk = { amdModuleId: "vs/editor/common/services/editorSimpleWorker", esmModuleLocation: void 0, label: "editorWorkerService" }; -let yR = class extends CG { +let Ek = class extends FY { constructor(e, t, i, n, o) { - super(bR, e, t, i, n, o); + super(Hk, e, t, i, n, o); } }; -yR = Ha([ - Ti(0, Pt), - Ti(1, eN), - Ti(2, Xn), - Ti(3, li), - Ti(4, ge) -], yR); -class T_e { +Ek = Oc([ + Yi(0, At), + Yi(1, pC), + Yi(2, Fn), + Yi(3, ci), + Yi(4, me) +], Ek); +class Lxe { async playSignal(e, t) { } } it( - Xn, - v_e, + Fn, + Vxe, 0 /* InstantiationType.Eager */ ); it( - Ke, - FM, + Qe, + t2, 0 /* InstantiationType.Eager */ ); it( - eN, - hR, + pC, + Tk, 0 /* InstantiationType.Eager */ ); it( - i7, - uR, + H7, + Mk, 0 /* InstantiationType.Eager */ ); it( - Cm, - gR, + Ib, + Yk, 0 /* InstantiationType.Eager */ ); it( - Nb, - I_e, + kZ, + Wxe, 0 /* InstantiationType.Eager */ ); it( Ls, - __e, + yxe, 0 /* InstantiationType.Eager */ ); it( - r9, - M_e, + wE, + Zxe, 0 /* InstantiationType.Eager */ ); it( - s5, - x_e, + RH, + gxe, 0 /* InstantiationType.Eager */ ); it( - Vi, - cR, + vi, + Nk, 0 /* InstantiationType.Eager */ ); it( - Ba, - xd, + _c, + Ca, 0 /* InstantiationType.Eager */ ); it( ri, - W_e, + Xxe, 0 /* InstantiationType.Eager */ ); it( - el, - i_e, + nr, + _Se, 0 /* InstantiationType.Eager */ ); it( - Pt, - FG, + At, + rk, 0 /* InstantiationType.Eager */ ); it( - vE, - XG, + iJ, + lk, 0 /* InstantiationType.Eager */ ); it( - _e, - rR, + xe, + xk, 0 /* InstantiationType.Eager */ ); it( - y4, - A_e, + ej, + pxe, 0 /* InstantiationType.Eager */ ); it( - qh, - aR, + iu, + Rk, 0 /* InstantiationType.Eager */ ); it( - za, - Dge, + Pc, + Ibe, 0 /* InstantiationType.Eager */ ); it( - Ps, - yR, + Us, + Ek, 0 /* InstantiationType.Eager */ ); it( - TC, - mR, + UG, + kk, 0 /* InstantiationType.Eager */ ); it( - y7, - N_e, + e8, + Gxe, 0 /* InstantiationType.Eager */ ); it( - Ys, - lR, + As, + Ck, 0 /* InstantiationType.Eager */ ); it( - yo, - iR, + Wo, + Vk, 0 /* InstantiationType.Eager */ ); it( - Ar, - Qbe, + Sl, + z0e, 0 /* InstantiationType.Eager */ ); it( - Qt, - dR, + Ot, + wk, 0 /* InstantiationType.Eager */ ); it( - xt, - Bb, + Lt, + OZ, 0 /* InstantiationType.Eager */ ); it( - ld, - $G, + ha, + Wk, 0 /* InstantiationType.Eager */ ); it( - rd, - pR, + aa, + vk, 0 /* InstantiationType.Eager */ ); it( - Bs, - EG, + Ps, + ok, 0 /* InstantiationType.Eager */ ); it( - od, - sR, + da, + Ik, 0 /* InstantiationType.Eager */ ); it( - Co, - fR, + Xo, + Jk, 0 /* InstantiationType.Eager */ ); it( - Uo, - bT, + Oo, + HT, 0 /* InstantiationType.Eager */ ); it( - jh, - T_e, + tu, + Lxe, 0 /* InstantiationType.Eager */ ); it( - gK, - S_e, + QQ, + mxe, 0 /* InstantiationType.Eager */ ); -var Ne; +var Re; (function(s) { - const e = new l0(); - for (const [a, c] of wF()) - e.set(a, c); - const t = new XM(e, !0); - e.set(Se, t); - function i(a) { - n || r({}); - const c = e.get(a); - if (!c) - throw new Error("Missing service " + a); - return c instanceof ga ? t.invokeFunction((d) => d.get(a)) : c; + const e = new m0(); + for (const [c, d] of KD()) + e.set(c, d); + const t = new e2(e, !0); + e.set(Ge, t); + function i(c) { + n || l({}); + const d = e.get(c); + if (!d) + throw new Error("Missing service " + c); + return d instanceof Zc ? t.invokeFunction((a) => a.get(c)) : d; } s.get = i; let n = !1; const o = new k(); - function r(a) { + function l(c) { if (n) return t; n = !0; - for (const [d, h] of wF()) - e.get(d) || e.set(d, h); - for (const d in a) - if (a.hasOwnProperty(d)) { - const h = $e(d); - e.get(h) instanceof ga && e.set(h, a[d]); - } - const c = Ope(); - for (const d of c) + for (const [a, h] of KD()) + e.get(a) || e.set(a, h); + for (const a in c) + if (c.hasOwnProperty(a)) { + const h = $e(a); + e.get(h) instanceof Zc && e.set(h, c[a]); + } + const d = Jge(); + for (const a of d) try { - t.createInstance(d); + t.createInstance(a); } catch (h) { - De(h); + Me(h); } return o.fire(), t; } - s.initialize = r; - function l(a) { + s.initialize = l; + function r(c) { if (n) - return a(); - const c = new U(), d = c.add(o.event(() => { - d.dispose(), c.add(a()); + return c(); + const d = new _(), a = d.add(o.event(() => { + a.dispose(), d.add(c()); })); - return c; + return d; } - s.withServices = l; -})(Ne || (Ne = {})); -function D_e(s, e) { - return new V_e(s, e); + s.withServices = r; +})(Re || (Re = {})); +function Ixe(s, e) { + return new Sxe(s, e); } -class V_e extends ZM { +class Sxe extends FI { constructor(e, t) { const i = { - amdModuleId: bR.amdModuleId, - esmModuleLocation: bR.esmModuleLocation, + amdModuleId: Hk.amdModuleId, + esmModuleLocation: Hk.esmModuleLocation, label: t.label }; super(i, t.keepIdleModels || !1, e), this._foreignModuleId = t.moduleId, this._foreignModuleCreateData = t.createData || null, this._foreignModuleHost = t.host || null, this._foreignProxy = null; @@ -106657,16 +106657,16 @@ class V_e extends ZM { } _getForeignProxy() { return this._foreignProxy || (this._foreignProxy = this._getProxy().then((e) => { - const t = this._foreignModuleHost ? U2(this._foreignModuleHost) : []; + const t = this._foreignModuleHost ? pw(this._foreignModuleHost) : []; return e.$loadForeignModule(this._foreignModuleId, this._foreignModuleCreateData, t).then((i) => { this._foreignModuleCreateData = null; - const n = (l, a) => e.$fmr(l, a), o = (l, a) => function() { - const c = Array.prototype.slice.call(arguments, 0); - return a(l, c); - }, r = {}; - for (const l of i) - r[l] = o(l, n); - return r; + const n = (r, c) => e.$fmr(r, c), o = (r, c) => function() { + const d = Array.prototype.slice.call(arguments, 0); + return c(r, d); + }, l = {}; + for (const r of i) + l[r] = o(r, n); + return l; }); })), this._foreignProxy; } @@ -106677,48 +106677,48 @@ class V_e extends ZM { return this.workerWithSyncedResources(e).then((t) => this.getProxy()); } } -function k_e(s) { +function xxe(s) { return Array.isArray(s); } -function G_e(s) { - return !k_e(s); +function Cxe(s) { + return !xxe(s); } -function o8(s) { +function F8(s) { return typeof s == "string"; } -function zB(s) { - return !o8(s); +function mU(s) { + return !F8(s); } -function Pu(s) { +function _u(s) { return !s; } -function Yc(s, e) { +function Ud(s, e) { return s.ignoreCase && e ? e.toLowerCase() : e; } -function PB(s) { +function bU(s) { return s.replace(/[&<>'"_]/g, "-"); } -function R_e(s, e) { +function Rxe(s, e) { console.log(`${s.languageId}: ${e}`); } -function Ht(s, e) { +function Pt(s, e) { return new Error(`${s.languageId}: ${e}`); } -function Gd(s, e, t, i, n) { +function Da(s, e, t, i, n) { const o = /\$((\$)|(#)|(\d\d?)|[sS](\d\d?)|@(\w+))/g; - let r = null; - return e.replace(o, function(l, a, c, d, h, u, g, m, f) { - return Pu(c) ? Pu(d) ? !Pu(h) && h < i.length ? Yc(s, i[h]) : !Pu(g) && s && typeof s[g] == "string" ? s[g] : (r === null && (r = n.split("."), r.unshift(n)), !Pu(u) && u < r.length ? Yc(s, r[u]) : "") : Yc(s, t) : "$"; + let l = null; + return e.replace(o, function(r, c, d, a, h, u, m, b, g) { + return _u(d) ? _u(a) ? !_u(h) && h < i.length ? Ud(s, i[h]) : !_u(m) && s && typeof s[m] == "string" ? s[m] : (l === null && (l = n.split("."), l.unshift(n)), !_u(u) && u < l.length ? Ud(s, l[u]) : "") : Ud(s, t) : "$"; }); } -function E_e(s, e, t) { +function Nxe(s, e, t) { const i = /\$[sS](\d\d?)/g; let n = null; - return e.replace(i, function(o, r) { - return n === null && (n = t.split("."), n.unshift(t)), !Pu(r) && r < n.length ? Yc(s, n[r]) : ""; + return e.replace(i, function(o, l) { + return n === null && (n = t.split("."), n.unshift(t)), !_u(l) && l < n.length ? Ud(s, n[l]) : ""; }); } -function oL(s, e) { +function fX(s, e) { let t = e; for (; t && t.length > 0; ) { const i = s.tokenizer[t]; @@ -106729,7 +106729,7 @@ function oL(s, e) { } return null; } -function X_e(s, e) { +function wxe(s, e) { let t = e; for (; t && t.length > 0; ) { if (s.stateNames[t]) @@ -106739,17 +106739,17 @@ function X_e(s, e) { } return !1; } -var F_e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Txe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Y_e = function(s, e) { +}, Mxe = function(s, e) { return function(t, i) { e(t, i, s); }; -}, wR; -const r8 = 5, x_ = class x_ { +}, Dk; +const z8 = 5, ES = class ES { static create(e, t) { return this._INSTANCE.create(e, t); } @@ -106758,16 +106758,16 @@ const r8 = 5, x_ = class x_ { } create(e, t) { if (e !== null && e.depth >= this._maxCacheDepth) - return new Of(e, t); - let i = Of.getStackElementId(e); + return new jg(e, t); + let i = jg.getStackElementId(e); i.length > 0 && (i += "|"), i += t; let n = this._entries[i]; - return n || (n = new Of(e, t), this._entries[i] = n, n); + return n || (n = new jg(e, t), this._entries[i] = n, n); } }; -x_._INSTANCE = new x_(r8); -let nC = x_; -class Of { +ES._INSTANCE = new ES(z8); +let pG = ES; +class jg { constructor(e, t) { this.parent = e, this.state = t, this.depth = (this.parent ? this.parent.depth : 0) + 1; } @@ -106788,10 +106788,10 @@ class Of { return e === null && t === null; } equals(e) { - return Of._equals(this, e); + return jg._equals(this, e); } push(e) { - return nC.create(this, e); + return pG.create(this, e); } pop() { return this.parent; @@ -106803,10 +106803,10 @@ class Of { return e; } switchTo(e) { - return nC.create(this.parent, e); + return pG.create(this.parent, e); } } -class ef { +class lg { constructor(e, t) { this.languageId = e, this.state = t; } @@ -106814,10 +106814,10 @@ class ef { return this.languageId === e.languageId && this.state.equals(e.state); } clone() { - return this.state.clone() === this.state ? this : new ef(this.languageId, this.state); + return this.state.clone() === this.state ? this : new lg(this.languageId, this.state); } } -const M_ = class M_ { +const DS = class DS { static create(e, t) { return this._INSTANCE.create(e, t); } @@ -106826,28 +106826,28 @@ const M_ = class M_ { } create(e, t) { if (t !== null) - return new dw(e, t); + return new Gy(e, t); if (e !== null && e.depth >= this._maxCacheDepth) - return new dw(e, t); - const i = Of.getStackElementId(e); + return new Gy(e, t); + const i = jg.getStackElementId(e); let n = this._entries[i]; - return n || (n = new dw(e, null), this._entries[i] = n, n); + return n || (n = new Gy(e, null), this._entries[i] = n, n); } }; -M_._INSTANCE = new M_(r8); -let Rd = M_; -class dw { +DS._INSTANCE = new DS(z8); +let Fa = DS; +class Gy { constructor(e, t) { this.stack = e, this.embeddedLanguageData = t; } clone() { - return (this.embeddedLanguageData ? this.embeddedLanguageData.clone() : null) === this.embeddedLanguageData ? this : Rd.create(this.stack, this.embeddedLanguageData); + return (this.embeddedLanguageData ? this.embeddedLanguageData.clone() : null) === this.embeddedLanguageData ? this : Fa.create(this.stack, this.embeddedLanguageData); } equals(e) { - return !(e instanceof dw) || !this.stack.equals(e.stack) ? !1 : this.embeddedLanguageData === null && e.embeddedLanguageData === null ? !0 : this.embeddedLanguageData === null || e.embeddedLanguageData === null ? !1 : this.embeddedLanguageData.equals(e.embeddedLanguageData); + return !(e instanceof Gy) || !this.stack.equals(e.stack) ? !1 : this.embeddedLanguageData === null && e.embeddedLanguageData === null ? !0 : this.embeddedLanguageData === null || e.embeddedLanguageData === null ? !1 : this.embeddedLanguageData.equals(e.embeddedLanguageData); } } -class z_e { +class Yxe { constructor() { this._tokens = [], this._languageId = null, this._lastTokenType = null, this._lastTokenLanguage = null; } @@ -106855,25 +106855,25 @@ class z_e { this._languageId = e; } emit(e, t) { - this._lastTokenType === t && this._lastTokenLanguage === this._languageId || (this._lastTokenType = t, this._lastTokenLanguage = this._languageId, this._tokens.push(new jw(e, t, this._languageId))); + this._lastTokenType === t && this._lastTokenLanguage === this._languageId || (this._lastTokenType = t, this._lastTokenLanguage = this._languageId, this._tokens.push(new dW(e, t, this._languageId))); } nestedLanguageTokenize(e, t, i, n) { - const o = i.languageId, r = i.state, l = Wi.get(o); - if (!l) - return this.enterLanguage(o), this.emit(n, ""), r; - const a = l.tokenize(e, t, r); + const o = i.languageId, l = i.state, r = Ti.get(o); + if (!r) + return this.enterLanguage(o), this.emit(n, ""), l; + const c = r.tokenize(e, t, l); if (n !== 0) - for (const c of a.tokens) - this._tokens.push(new jw(c.offset + n, c.type, c.language)); + for (const d of c.tokens) + this._tokens.push(new dW(d.offset + n, d.type, d.language)); else - this._tokens = this._tokens.concat(a.tokens); - return this._lastTokenType = null, this._lastTokenLanguage = null, this._languageId = null, a.endState; + this._tokens = this._tokens.concat(c.tokens); + return this._lastTokenType = null, this._lastTokenLanguage = null, this._languageId = null, c.endState; } finalize(e) { - return new QE(this._tokens, e); + return new GJ(this._tokens, e); } } -class zM { +class n2 { constructor(e, t) { this._languageService = e, this._theme = t, this._prependTokens = null, this._tokens = [], this._currentLanguageId = 0, this._lastTokenMetadata = 0; } @@ -106885,53 +106885,53 @@ class zM { this._lastTokenMetadata !== i && (this._lastTokenMetadata = i, this._tokens.push(e), this._tokens.push(i)); } static _merge(e, t, i) { - const n = e !== null ? e.length : 0, o = t.length, r = i !== null ? i.length : 0; - if (n === 0 && o === 0 && r === 0) + const n = e !== null ? e.length : 0, o = t.length, l = i !== null ? i.length : 0; + if (n === 0 && o === 0 && l === 0) return new Uint32Array(0); if (n === 0 && o === 0) return i; - if (o === 0 && r === 0) + if (o === 0 && l === 0) return e; - const l = new Uint32Array(n + o + r); - e !== null && l.set(e); - for (let a = 0; a < o; a++) - l[n + a] = t[a]; - return i !== null && l.set(i, n + o), l; + const r = new Uint32Array(n + o + l); + e !== null && r.set(e); + for (let c = 0; c < o; c++) + r[n + c] = t[c]; + return i !== null && r.set(i, n + o), r; } nestedLanguageTokenize(e, t, i, n) { - const o = i.languageId, r = i.state, l = Wi.get(o); - if (!l) - return this.enterLanguage(o), this.emit(n, ""), r; - const a = l.tokenizeEncoded(e, t, r); + const o = i.languageId, l = i.state, r = Ti.get(o); + if (!r) + return this.enterLanguage(o), this.emit(n, ""), l; + const c = r.tokenizeEncoded(e, t, l); if (n !== 0) - for (let c = 0, d = a.tokens.length; c < d; c += 2) - a.tokens[c] += n; - return this._prependTokens = zM._merge(this._prependTokens, this._tokens, a.tokens), this._tokens = [], this._currentLanguageId = 0, this._lastTokenMetadata = 0, a.endState; + for (let d = 0, a = c.tokens.length; d < a; d += 2) + c.tokens[d] += n; + return this._prependTokens = n2._merge(this._prependTokens, this._tokens, c.tokens), this._tokens = [], this._currentLanguageId = 0, this._lastTokenMetadata = 0, c.endState; } finalize(e) { - return new mI(zM._merge(this._prependTokens, this._tokens, null), e); + return new Rx(n2._merge(this._prependTokens, this._tokens, null), e); } } -let sC = wR = class extends R { +let gG = Dk = class extends J { constructor(e, t, i, n, o) { super(), this._configurationService = o, this._languageService = e, this._standaloneThemeService = t, this._languageId = i, this._lexer = n, this._embeddedLanguages = /* @__PURE__ */ Object.create(null), this.embeddedLoaded = Promise.resolve(void 0); - let r = !1; - this._register(Wi.onDidChange((l) => { - if (r) + let l = !1; + this._register(Ti.onDidChange((r) => { + if (l) return; - let a = !1; - for (let c = 0, d = l.changedLanguages.length; c < d; c++) { - const h = l.changedLanguages[c]; + let c = !1; + for (let d = 0, a = r.changedLanguages.length; d < a; d++) { + const h = r.changedLanguages[d]; if (this._embeddedLanguages[h]) { - a = !0; + c = !0; break; } } - a && (r = !0, Wi.handleChange([this._languageId]), r = !1); + c && (l = !0, Ti.handleChange([this._languageId]), l = !1); })), this._maxTokenizationLineLength = this._configurationService.getValue("editor.maxTokenizationLineLength", { overrideIdentifier: this._languageId - }), this._register(this._configurationService.onDidChangeConfiguration((l) => { - l.affectsConfiguration("editor.maxTokenizationLineLength") && (this._maxTokenizationLineLength = this._configurationService.getValue("editor.maxTokenizationLineLength", { + }), this._register(this._configurationService.onDidChangeConfiguration((r) => { + r.affectsConfiguration("editor.maxTokenizationLineLength") && (this._maxTokenizationLineLength = this._configurationService.getValue("editor.maxTokenizationLineLength", { overrideIdentifier: this._languageId })); })); @@ -106939,15 +106939,15 @@ let sC = wR = class extends R { getLoadStatus() { const e = []; for (const t in this._embeddedLanguages) { - const i = Wi.get(t); + const i = Ti.get(t); if (i) { - if (i instanceof wR) { + if (i instanceof Dk) { const n = i.getLoadStatus(); n.loaded === !1 && e.push(n.promise); } continue; } - Wi.isResolved(t) || e.push(Wi.getOrCreate(t)); + Ti.isResolved(t) || e.push(Ti.getOrCreate(t)); } return e.length === 0 ? { loaded: !0 @@ -106958,19 +106958,19 @@ let sC = wR = class extends R { }; } getInitialState() { - const e = nC.create(null, this._lexer.start); - return Rd.create(e, null); + const e = pG.create(null, this._lexer.start); + return Fa.create(e, null); } tokenize(e, t, i) { if (e.length >= this._maxTokenizationLineLength) - return hK(this._languageId, i); - const n = new z_e(), o = this._tokenize(e, t, i, n); + return BQ(this._languageId, i); + const n = new Yxe(), o = this._tokenize(e, t, i, n); return n.finalize(o); } tokenizeEncoded(e, t, i) { if (e.length >= this._maxTokenizationLineLength) - return hX(this._languageService.languageIdCodec.encodeLanguageId(this._languageId), i); - const n = new zM(this._languageService, this._standaloneThemeService.getColorTheme().tokenTheme), o = this._tokenize(e, t, i, n); + return vJ(this._languageService.languageIdCodec.encodeLanguageId(this._languageId), i); + const n = new n2(this._languageService, this._standaloneThemeService.getColorTheme().tokenTheme), o = this._tokenize(e, t, i, n); return n.finalize(o); } _tokenize(e, t, i, n) { @@ -106978,188 +106978,188 @@ let sC = wR = class extends R { } _findLeavingNestedLanguageOffset(e, t) { let i = this._lexer.tokenizer[t.stack.state]; - if (!i && (i = oL(this._lexer, t.stack.state), !i)) - throw Ht(this._lexer, "tokenizer state is not defined: " + t.stack.state); + if (!i && (i = fX(this._lexer, t.stack.state), !i)) + throw Pt(this._lexer, "tokenizer state is not defined: " + t.stack.state); let n = -1, o = !1; - for (const r of i) { - if (!zB(r.action) || r.action.nextEmbedded !== "@pop") + for (const l of i) { + if (!mU(l.action) || l.action.nextEmbedded !== "@pop") continue; o = !0; - let l = r.resolveRegex(t.stack.state); - const a = l.source; - if (a.substr(0, 4) === "^(?:" && a.substr(a.length - 1, 1) === ")") { - const d = (l.ignoreCase ? "i" : "") + (l.unicode ? "u" : ""); - l = new RegExp(a.substr(4, a.length - 5), d); + let r = l.resolveRegex(t.stack.state); + const c = r.source; + if (c.substr(0, 4) === "^(?:" && c.substr(c.length - 1, 1) === ")") { + const a = (r.ignoreCase ? "i" : "") + (r.unicode ? "u" : ""); + r = new RegExp(c.substr(4, c.length - 5), a); } - const c = e.search(l); - c === -1 || c !== 0 && r.matchOnlyAtLineStart || (n === -1 || c < n) && (n = c); + const d = e.search(r); + d === -1 || d !== 0 && l.matchOnlyAtLineStart || (n === -1 || d < n) && (n = d); } if (!o) - throw Ht(this._lexer, 'no rule containing nextEmbedded: "@pop" in tokenizer embedded state: ' + t.stack.state); + throw Pt(this._lexer, 'no rule containing nextEmbedded: "@pop" in tokenizer embedded state: ' + t.stack.state); return n; } _nestedTokenize(e, t, i, n, o) { - const r = this._findLeavingNestedLanguageOffset(e, i); - if (r === -1) { - const c = o.nestedLanguageTokenize(e, t, i.embeddedLanguageData, n); - return Rd.create(i.stack, new ef(i.embeddedLanguageData.languageId, c)); + const l = this._findLeavingNestedLanguageOffset(e, i); + if (l === -1) { + const d = o.nestedLanguageTokenize(e, t, i.embeddedLanguageData, n); + return Fa.create(i.stack, new lg(i.embeddedLanguageData.languageId, d)); } - const l = e.substring(0, r); - l.length > 0 && o.nestedLanguageTokenize(l, !1, i.embeddedLanguageData, n); - const a = e.substring(r); - return this._myTokenize(a, t, i, n + r, o); + const r = e.substring(0, l); + r.length > 0 && o.nestedLanguageTokenize(r, !1, i.embeddedLanguageData, n); + const c = e.substring(l); + return this._myTokenize(c, t, i, n + l, o); } _safeRuleName(e) { return e ? e.name : "(unknown)"; } _myTokenize(e, t, i, n, o) { o.enterLanguage(this._languageId); - const r = e.length, l = t && this._lexer.includeLF ? e + ` -` : e, a = l.length; - let c = i.embeddedLanguageData, d = i.stack, h = 0, u = null, g = !0; - for (; g || h < a; ) { - const m = h, f = d.depth, b = u ? u.groups.length : 0, y = d.state; - let w = null, C = null, S = null, L = null, x = null; + const l = e.length, r = t && this._lexer.includeLF ? e + ` +` : e, c = r.length; + let d = i.embeddedLanguageData, a = i.stack, h = 0, u = null, m = !0; + for (; m || h < c; ) { + const b = h, g = a.depth, Z = u ? u.groups.length : 0, f = a.state; + let y = null, W = null, G = null, X = null, L = null; if (u) { - w = u.matches; - const v = u.groups.shift(); - C = v.matched, S = v.action, L = u.rule, u.groups.length === 0 && (u = null); + y = u.matches; + const w = u.groups.shift(); + W = w.matched, G = w.action, X = u.rule, u.groups.length === 0 && (u = null); } else { - if (!g && h >= a) + if (!m && h >= c) break; - g = !1; - let v = this._lexer.tokenizer[y]; - if (!v && (v = oL(this._lexer, y), !v)) - throw Ht(this._lexer, "tokenizer state is not defined: " + y); - const P = l.substr(h); - for (const E of v) - if ((h === 0 || !E.matchOnlyAtLineStart) && (w = P.match(E.resolveRegex(y)), w)) { - C = w[0], S = E.action; + m = !1; + let w = this._lexer.tokenizer[f]; + if (!w && (w = fX(this._lexer, f), !w)) + throw Pt(this._lexer, "tokenizer state is not defined: " + f); + const A = r.substr(h); + for (const H of w) + if ((h === 0 || !H.matchOnlyAtLineStart) && (y = A.match(H.resolveRegex(f)), y)) { + W = y[0], G = H.action; break; } } - if (w || (w = [""], C = ""), S || (h < a && (w = [l.charAt(h)], C = w[0]), S = this._lexer.defaultToken), C === null) + if (y || (y = [""], W = ""), G || (h < c && (y = [r.charAt(h)], W = y[0]), G = this._lexer.defaultToken), W === null) break; - for (h += C.length; G_e(S) && zB(S) && S.test; ) - S = S.test(C, w, y, h === a); - let Z = null; - if (typeof S == "string" || Array.isArray(S)) - Z = S; - else if (S.group) - Z = S.group; - else if (S.token !== null && S.token !== void 0) { - if (S.tokenSubst ? Z = Gd(this._lexer, S.token, C, w, y) : Z = S.token, S.nextEmbedded) - if (S.nextEmbedded === "@pop") { - if (!c) - throw Ht(this._lexer, "cannot pop embedded language if not inside one"); - c = null; + for (h += W.length; Cxe(G) && mU(G) && G.test; ) + G = G.test(W, y, f, h === c); + let S = null; + if (typeof G == "string" || Array.isArray(G)) + S = G; + else if (G.group) + S = G.group; + else if (G.token !== null && G.token !== void 0) { + if (G.tokenSubst ? S = Da(this._lexer, G.token, W, y, f) : S = G.token, G.nextEmbedded) + if (G.nextEmbedded === "@pop") { + if (!d) + throw Pt(this._lexer, "cannot pop embedded language if not inside one"); + d = null; } else { - if (c) - throw Ht(this._lexer, "cannot enter embedded language from within an embedded language"); - x = Gd(this._lexer, S.nextEmbedded, C, w, y); + if (d) + throw Pt(this._lexer, "cannot enter embedded language from within an embedded language"); + L = Da(this._lexer, G.nextEmbedded, W, y, f); } - if (S.goBack && (h = Math.max(0, h - S.goBack)), S.switchTo && typeof S.switchTo == "string") { - let v = Gd(this._lexer, S.switchTo, C, w, y); - if (v[0] === "@" && (v = v.substr(1)), oL(this._lexer, v)) - d = d.switchTo(v); + if (G.goBack && (h = Math.max(0, h - G.goBack)), G.switchTo && typeof G.switchTo == "string") { + let w = Da(this._lexer, G.switchTo, W, y, f); + if (w[0] === "@" && (w = w.substr(1)), fX(this._lexer, w)) + a = a.switchTo(w); else - throw Ht(this._lexer, "trying to switch to a state '" + v + "' that is undefined in rule: " + this._safeRuleName(L)); + throw Pt(this._lexer, "trying to switch to a state '" + w + "' that is undefined in rule: " + this._safeRuleName(X)); } else { - if (S.transform && typeof S.transform == "function") - throw Ht(this._lexer, "action.transform not supported"); - if (S.next) - if (S.next === "@push") { - if (d.depth >= this._lexer.maxStack) - throw Ht(this._lexer, "maximum tokenizer stack size reached: [" + d.state + "," + d.parent.state + ",...]"); - d = d.push(y); - } else if (S.next === "@pop") { - if (d.depth <= 1) - throw Ht(this._lexer, "trying to pop an empty stack in rule: " + this._safeRuleName(L)); - d = d.pop(); - } else if (S.next === "@popall") - d = d.popall(); + if (G.transform && typeof G.transform == "function") + throw Pt(this._lexer, "action.transform not supported"); + if (G.next) + if (G.next === "@push") { + if (a.depth >= this._lexer.maxStack) + throw Pt(this._lexer, "maximum tokenizer stack size reached: [" + a.state + "," + a.parent.state + ",...]"); + a = a.push(f); + } else if (G.next === "@pop") { + if (a.depth <= 1) + throw Pt(this._lexer, "trying to pop an empty stack in rule: " + this._safeRuleName(X)); + a = a.pop(); + } else if (G.next === "@popall") + a = a.popall(); else { - let v = Gd(this._lexer, S.next, C, w, y); - if (v[0] === "@" && (v = v.substr(1)), oL(this._lexer, v)) - d = d.push(v); + let w = Da(this._lexer, G.next, W, y, f); + if (w[0] === "@" && (w = w.substr(1)), fX(this._lexer, w)) + a = a.push(w); else - throw Ht(this._lexer, "trying to set a next state '" + v + "' that is undefined in rule: " + this._safeRuleName(L)); + throw Pt(this._lexer, "trying to set a next state '" + w + "' that is undefined in rule: " + this._safeRuleName(X)); } } - S.log && typeof S.log == "string" && R_e(this._lexer, this._lexer.languageId + ": " + Gd(this._lexer, S.log, C, w, y)); - } - if (Z === null) - throw Ht(this._lexer, "lexer rule has no well-defined action in rule: " + this._safeRuleName(L)); - const _ = (v) => { - const P = this._languageService.getLanguageIdByLanguageName(v) || this._languageService.getLanguageIdByMimeType(v) || v, E = this._getNestedEmbeddedLanguageData(P); - if (h < a) { - const Y = e.substr(h); - return this._nestedTokenize(Y, t, Rd.create(d, E), n + h, o); + G.log && typeof G.log == "string" && Rxe(this._lexer, this._lexer.languageId + ": " + Da(this._lexer, G.log, W, y, f)); + } + if (S === null) + throw Pt(this._lexer, "lexer rule has no well-defined action in rule: " + this._safeRuleName(X)); + const x = (w) => { + const A = this._languageService.getLanguageIdByLanguageName(w) || this._languageService.getLanguageIdByMimeType(w) || w, H = this._getNestedEmbeddedLanguageData(A); + if (h < c) { + const F = e.substr(h); + return this._nestedTokenize(F, t, Fa.create(a, H), n + h, o); } else - return Rd.create(d, E); + return Fa.create(a, H); }; - if (Array.isArray(Z)) { + if (Array.isArray(S)) { if (u && u.groups.length > 0) - throw Ht(this._lexer, "groups cannot be nested: " + this._safeRuleName(L)); - if (w.length !== Z.length + 1) - throw Ht(this._lexer, "matched number of groups does not match the number of actions in rule: " + this._safeRuleName(L)); - let v = 0; - for (let P = 1; P < w.length; P++) - v += w[P].length; - if (v !== C.length) - throw Ht(this._lexer, "with groups, all characters should be matched in consecutive groups in rule: " + this._safeRuleName(L)); + throw Pt(this._lexer, "groups cannot be nested: " + this._safeRuleName(X)); + if (y.length !== S.length + 1) + throw Pt(this._lexer, "matched number of groups does not match the number of actions in rule: " + this._safeRuleName(X)); + let w = 0; + for (let A = 1; A < y.length; A++) + w += y[A].length; + if (w !== W.length) + throw Pt(this._lexer, "with groups, all characters should be matched in consecutive groups in rule: " + this._safeRuleName(X)); u = { - rule: L, - matches: w, + rule: X, + matches: y, groups: [] }; - for (let P = 0; P < Z.length; P++) - u.groups[P] = { - action: Z[P], - matched: w[P + 1] + for (let A = 0; A < S.length; A++) + u.groups[A] = { + action: S[A], + matched: y[A + 1] }; - h -= C.length; + h -= W.length; continue; } else { - if (Z === "@rematch" && (h -= C.length, C = "", w = null, Z = "", x !== null)) - return _(x); - if (C.length === 0) { - if (a === 0 || f !== d.depth || y !== d.state || (u ? u.groups.length : 0) !== b) + if (S === "@rematch" && (h -= W.length, W = "", y = null, S = "", L !== null)) + return x(L); + if (W.length === 0) { + if (c === 0 || g !== a.depth || f !== a.state || (u ? u.groups.length : 0) !== Z) continue; - throw Ht(this._lexer, "no progress in tokenizer in rule: " + this._safeRuleName(L)); + throw Pt(this._lexer, "no progress in tokenizer in rule: " + this._safeRuleName(X)); } - let v = null; - if (o8(Z) && Z.indexOf("@brackets") === 0) { - const P = Z.substr(9), E = P_e(this._lexer, C); - if (!E) - throw Ht(this._lexer, "@brackets token returned but no bracket defined as: " + C); - v = PB(E.token + P); + let w = null; + if (F8(S) && S.indexOf("@brackets") === 0) { + const A = S.substr(9), H = kxe(this._lexer, W); + if (!H) + throw Pt(this._lexer, "@brackets token returned but no bracket defined as: " + W); + w = bU(H.token + A); } else { - const P = Z === "" ? "" : Z + this._lexer.tokenPostfix; - v = PB(P); + const A = S === "" ? "" : S + this._lexer.tokenPostfix; + w = bU(A); } - m < r && o.emit(m + n, v); + b < l && o.emit(b + n, w); } - if (x !== null) - return _(x); + if (L !== null) + return x(L); } - return Rd.create(d, c); + return Fa.create(a, d); } _getNestedEmbeddedLanguageData(e) { if (!this._languageService.isRegisteredLanguageId(e)) - return new ef(e, h1); - e !== this._languageId && (this._languageService.requestBasicLanguageFeatures(e), Wi.getOrCreate(e), this._embeddedLanguages[e] = !0); - const t = Wi.get(e); - return t ? new ef(e, t.getInitialState()) : new ef(e, h1); + return new lg(e, VW); + e !== this._languageId && (this._languageService.requestBasicLanguageFeatures(e), Ti.getOrCreate(e), this._embeddedLanguages[e] = !0); + const t = Ti.get(e); + return t ? new lg(e, t.getInitialState()) : new lg(e, VW); } }; -sC = wR = F_e([ - Y_e(4, Ke) -], sC); -function P_e(s, e) { +gG = Dk = Txe([ + Mxe(4, Qe) +], gG); +function kxe(s, e) { if (!e) return null; - e = Yc(s, e); + e = Ud(s, e); const t = s.brackets; for (const i of t) { if (i.open === e) @@ -107177,128 +107177,128 @@ function P_e(s, e) { } return null; } -const a2 = nd("standaloneColorizer", { createHTML: (s) => s }); -class w9 { +const LN = ra("standaloneColorizer", { createHTML: (s) => s }); +class KE { static colorizeElement(e, t, i, n) { n = n || {}; - const o = n.theme || "vs", r = n.mimeType || i.getAttribute("lang") || i.getAttribute("data-lang"); - if (!r) + const o = n.theme || "vs", l = n.mimeType || i.getAttribute("lang") || i.getAttribute("data-lang"); + if (!l) return console.error("Mode not detected"), Promise.resolve(); - const l = t.getLanguageIdByMimeType(r) || r; + const r = t.getLanguageIdByMimeType(l) || l; e.setTheme(o); - const a = i.firstChild ? i.firstChild.nodeValue : ""; + const c = i.firstChild ? i.firstChild.nodeValue : ""; i.className += " " + o; - const c = (d) => { - const h = (a2 == null ? void 0 : a2.createHTML(d)) ?? d; + const d = (a) => { + const h = (LN == null ? void 0 : LN.createHTML(a)) ?? a; i.innerHTML = h; }; - return this.colorize(t, a || "", l, n).then(c, (d) => console.error(d)); + return this.colorize(t, c || "", r, n).then(d, (a) => console.error(a)); } static async colorize(e, t, i, n) { const o = e.languageIdCodec; - let r = 4; - n && typeof n.tabSize == "number" && (r = n.tabSize), rE(t) && (t = t.substr(1)); - const l = Fa(t); + let l = 4; + n && typeof n.tabSize == "number" && (l = n.tabSize), wv(t) && (t = t.substr(1)); + const r = Kc(t); if (!e.isRegisteredLanguageId(i)) - return BB(l, r, o); - const a = await Wi.getOrCreate(i); - return a ? B_e(l, r, a, o) : BB(l, r, o); + return pU(r, l, o); + const c = await Ti.getOrCreate(i); + return c ? vxe(r, l, c, o) : pU(r, l, o); } static colorizeLine(e, t, i, n, o = 4) { - const r = Oo.isBasicASCII(e, t), l = Oo.containsRTL(e, r, i); - return dI(new Jh(!1, !0, e, !1, r, l, 0, n, [], o, 0, 0, 0, 0, -1, "none", !1, !1, null)).html; + const l = Bo.isBasicASCII(e, t), r = Bo.containsRTL(e, l, i); + return Ix(new jh(!1, !0, e, !1, l, r, 0, n, [], o, 0, 0, 0, 0, -1, "none", !1, !1, null)).html; } static colorizeModelLine(e, t, i = 4) { const n = e.getLineContent(t); e.tokenization.forceTokenization(t); - const r = e.tokenization.getLineTokens(t).inflate(); - return this.colorizeLine(n, e.mightContainNonBasicASCII(), e.mightContainRTL(), r, i); + const l = e.tokenization.getLineTokens(t).inflate(); + return this.colorizeLine(n, e.mightContainNonBasicASCII(), e.mightContainRTL(), l, i); } } -function B_e(s, e, t, i) { +function vxe(s, e, t, i) { return new Promise((n, o) => { - const r = () => { - const l = O_e(s, e, t, i); - if (t instanceof sC) { - const a = t.getLoadStatus(); - if (a.loaded === !1) { - a.promise.then(r, o); + const l = () => { + const r = Jxe(s, e, t, i); + if (t instanceof gG) { + const c = t.getLoadStatus(); + if (c.loaded === !1) { + c.promise.then(l, o); return; } } - n(l); + n(r); }; - r(); + l(); }); } -function BB(s, e, t) { +function pU(s, e, t) { let i = []; const o = new Uint32Array(2); o[0] = 0, o[1] = 33587200; - for (let r = 0, l = s.length; r < l; r++) { - const a = s[r]; - o[0] = a.length; - const c = new rn(o, a, t), d = Oo.isBasicASCII( - a, + for (let l = 0, r = s.length; l < r; l++) { + const c = s[l]; + o[0] = c.length; + const d = new rn(o, c, t), a = Bo.isBasicASCII( + c, /* check for basic ASCII */ !0 - ), h = Oo.containsRTL( + ), h = Bo.containsRTL( + c, a, - d, /* check for RTL */ !0 - ), u = dI(new Jh(!1, !0, a, !1, d, h, 0, c, [], e, 0, 0, 0, 0, -1, "none", !1, !1, null)); + ), u = Ix(new jh(!1, !0, c, !1, a, h, 0, d, [], e, 0, 0, 0, 0, -1, "none", !1, !1, null)); i = i.concat(u.html), i.push("
    "); } return i.join(""); } -function O_e(s, e, t, i) { +function Jxe(s, e, t, i) { let n = [], o = t.getInitialState(); - for (let r = 0, l = s.length; r < l; r++) { - const a = s[r], c = t.tokenizeEncoded(a, !0, o); - rn.convertToEndOffset(c.tokens, a.length); - const d = new rn(c.tokens, a, i), h = Oo.isBasicASCII( - a, + for (let l = 0, r = s.length; l < r; l++) { + const c = s[l], d = t.tokenizeEncoded(c, !0, o); + rn.convertToEndOffset(d.tokens, c.length); + const a = new rn(d.tokens, c, i), h = Bo.isBasicASCII( + c, /* check for basic ASCII */ !0 - ), u = Oo.containsRTL( - a, + ), u = Bo.containsRTL( + c, h, /* check for RTL */ !0 - ), g = dI(new Jh(!1, !0, a, !1, h, u, 0, d.inflate(), [], e, 0, 0, 0, 0, -1, "none", !1, !1, null)); - n = n.concat(g.html), n.push("
    "), o = c.endState; + ), m = Ix(new jh(!1, !0, c, !1, h, u, 0, a.inflate(), [], e, 0, 0, 0, 0, -1, "none", !1, !1, null)); + n = n.concat(m.html), n.push("
    "), o = d.endState; } return n.join(""); } -var C9 = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var UE = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, Et = function(s, e) { +}, Ht = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let H_e = 0, OB = !1; -function J_e(s) { +let Hxe = 0, gU = !1; +function Exe(s) { if (!s) { - if (OB) + if (gU) return; - OB = !0; + gU = !0; } - g$(s || vt.document.body); + oee(s || wt.document.body); } -let PM = class extends m1 { - constructor(e, t, i, n, o, r, l, a, c, d, h, u, g) { - const m = { ...t }; - m.ariaLabel = m.ariaLabel || wk.editorViewAccessibleLabel, super(e, m, {}, i, n, o, r, c, d, h, u, g), a instanceof Bb ? this._standaloneKeybindingService = a : this._standaloneKeybindingService = null, J_e(m.ariaContainerElement), Wde((f, b) => i.createInstance(Ab, f, b, {})), Ehe(l); +let s2 = class extends SW { + constructor(e, t, i, n, o, l, r, c, d, a, h, u, m) { + const b = { ...t }; + b.ariaLabel = b.ariaLabel || D5.editorViewAccessibleLabel, super(e, b, {}, i, n, o, l, d, a, h, u, m), c instanceof OZ ? this._standaloneKeybindingService = c : this._standaloneKeybindingService = null, Exe(b.ariaContainerElement), Xhe((g, Z) => i.createInstance(RZ, g, Z, {})), Nue(r); } addCommand(e, t, i) { if (!this._standaloneKeybindingService) return console.warn("Cannot add command because the editor is configured with an unrecognized KeybindingService"), null; - const n = "DYNAMIC_" + ++H_e, o = H.deserialize(i); + const n = "DYNAMIC_" + ++Hxe, o = P.deserialize(i); return this._standaloneKeybindingService.addDynamicKeybinding(n, e, t, o), n; } createContextKey(e, t) { @@ -107308,30 +107308,30 @@ let PM = class extends m1 { if (typeof e.id != "string" || typeof e.label != "string" || typeof e.run != "function") throw new Error("Invalid action descriptor, `id`, `label` and `run` are required properties!"); if (!this._standaloneKeybindingService) - return console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"), R.None; - const t = e.id, i = e.label, n = H.and(H.equals("editorId", this.getId()), H.deserialize(e.precondition)), o = e.keybindings, r = H.and(n, H.deserialize(e.keybindingContext)), l = e.contextMenuGroupId || null, a = e.contextMenuOrder || 0, c = (g, ...m) => Promise.resolve(e.run(this, ...m)), d = new U(), h = this.getId() + ":" + t; - if (d.add(st.registerCommand(h, c)), l) { - const g = { + return console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"), J.None; + const t = e.id, i = e.label, n = P.and(P.equals("editorId", this.getId()), P.deserialize(e.precondition)), o = e.keybindings, l = P.and(n, P.deserialize(e.keybindingContext)), r = e.contextMenuGroupId || null, c = e.contextMenuOrder || 0, d = (m, ...b) => Promise.resolve(e.run(this, ...b)), a = new _(), h = this.getId() + ":" + t; + if (a.add(st.registerCommand(h, d)), r) { + const m = { command: { id: h, title: i }, when: n, - group: l, - order: a + group: r, + order: c }; - d.add(nn.appendMenuItem(pe.EditorContext, g)); + a.add(sn.appendMenuItem(pe.EditorContext, m)); } if (Array.isArray(o)) - for (const g of o) - d.add(this._standaloneKeybindingService.addDynamicKeybinding(h, g, c, r)); - const u = new HU(h, i, i, void 0, n, (...g) => Promise.resolve(e.run(this, ...g)), this._contextKeyService); - return this._actions.set(t, u), d.add(Ce(() => { + for (const m of o) + a.add(this._standaloneKeybindingService.addDynamicKeybinding(h, m, d, l)); + const u = new CQ(h, i, i, void 0, n, (...m) => Promise.resolve(e.run(this, ...m)), this._contextKeyService); + return this._actions.set(t, u), a.add(We(() => { this._actions.delete(t); - })), d; + })), a; } _triggerCommand(e, t) { - if (this._codeEditorService instanceof _M) + if (this._codeEditorService instanceof zI) try { this._codeEditorService.setActiveCodeEditor(this), super._triggerCommand(e, t); } finally { @@ -107341,82 +107341,82 @@ let PM = class extends m1 { super._triggerCommand(e, t); } }; -PM = C9([ - Et(2, Se), - Et(3, ft), - Et(4, Qt), - Et(5, _e), - Et(6, Pa), - Et(7, xt), - Et(8, Pi), - Et(9, Vi), - Et(10, yo), - Et(11, li), - Et(12, ge) -], PM); -let CR = class extends PM { - constructor(e, t, i, n, o, r, l, a, c, d, h, u, g, m, f, b) { - const y = { ...t }; - YM(h, y, !1); - const w = c.registerEditorContainer(e); - typeof y.theme == "string" && c.setTheme(y.theme), typeof y.autoDetectHighContrast < "u" && c.setAutoDetectHighContrast(!!y.autoDetectHighContrast); - const C = y.model; - delete y.model, super(e, y, i, n, o, r, l, a, c, d, u, f, b), this._configurationService = h, this._standaloneThemeService = c, this._register(w); - let S; - if (typeof C > "u") { - const L = m.getLanguageIdByMimeType(y.language) || y.language || ms; - S = l8(g, m, y.value || "", L, void 0), this._ownsModel = !0; +s2 = UE([ + Ht(2, Ge), + Ht(3, gt), + Ht(4, Ot), + Ht(5, xe), + Ht(6, Bc), + Ht(7, Lt), + Ht(8, Ki), + Ht(9, vi), + Ht(10, Wo), + Ht(11, ci), + Ht(12, me) +], s2); +let Fk = class extends s2 { + constructor(e, t, i, n, o, l, r, c, d, a, h, u, m, b, g, Z) { + const f = { ...t }; + i2(h, f, !1); + const y = d.registerEditorContainer(e); + typeof f.theme == "string" && d.setTheme(f.theme), typeof f.autoDetectHighContrast < "u" && d.setAutoDetectHighContrast(!!f.autoDetectHighContrast); + const W = f.model; + delete f.model, super(e, f, i, n, o, l, r, c, d, a, u, g, Z), this._configurationService = h, this._standaloneThemeService = d, this._register(y); + let G; + if (typeof W > "u") { + const X = b.getLanguageIdByMimeType(f.language) || f.language || gs; + G = A8(m, b, f.value || "", X, void 0), this._ownsModel = !0; } else - S = C, this._ownsModel = !1; - if (this._attachModel(S), S) { - const L = { + G = W, this._ownsModel = !1; + if (this._attachModel(G), G) { + const X = { oldModelUrl: null, - newModelUrl: S.uri + newModelUrl: G.uri }; - this._onDidChangeModel.fire(L); + this._onDidChangeModel.fire(X); } } dispose() { super.dispose(); } updateOptions(e) { - YM(this._configurationService, e, !1), typeof e.theme == "string" && this._standaloneThemeService.setTheme(e.theme), typeof e.autoDetectHighContrast < "u" && this._standaloneThemeService.setAutoDetectHighContrast(!!e.autoDetectHighContrast), super.updateOptions(e); + i2(this._configurationService, e, !1), typeof e.theme == "string" && this._standaloneThemeService.setTheme(e.theme), typeof e.autoDetectHighContrast < "u" && this._standaloneThemeService.setAutoDetectHighContrast(!!e.autoDetectHighContrast), super.updateOptions(e); } _postDetachModelCleanup(e) { super._postDetachModelCleanup(e), e && this._ownsModel && (e.dispose(), this._ownsModel = !1); } }; -CR = C9([ - Et(2, Se), - Et(3, ft), - Et(4, Qt), - Et(5, _e), - Et(6, Pa), - Et(7, xt), - Et(8, el), - Et(9, Vi), - Et(10, Ke), - Et(11, yo), - Et(12, Pt), - Et(13, ri), - Et(14, li), - Et(15, ge) -], CR); -let SR = class extends Kc { - constructor(e, t, i, n, o, r, l, a, c, d, h, u) { - const g = { ...t }; - YM(a, g, !0); - const m = r.registerEditorContainer(e); - typeof g.theme == "string" && r.setTheme(g.theme), typeof g.autoDetectHighContrast < "u" && r.setAutoDetectHighContrast(!!g.autoDetectHighContrast), super(e, g, {}, n, i, o, u, d), this._configurationService = a, this._standaloneThemeService = r, this._register(m); +Fk = UE([ + Ht(2, Ge), + Ht(3, gt), + Ht(4, Ot), + Ht(5, xe), + Ht(6, Bc), + Ht(7, Lt), + Ht(8, nr), + Ht(9, vi), + Ht(10, Qe), + Ht(11, Wo), + Ht(12, At), + Ht(13, ri), + Ht(14, ci), + Ht(15, me) +], Fk); +let zk = class extends $d { + constructor(e, t, i, n, o, l, r, c, d, a, h, u) { + const m = { ...t }; + i2(c, m, !0); + const b = l.registerEditorContainer(e); + typeof m.theme == "string" && l.setTheme(m.theme), typeof m.autoDetectHighContrast < "u" && l.setAutoDetectHighContrast(!!m.autoDetectHighContrast), super(e, m, {}, n, i, o, u, a), this._configurationService = c, this._standaloneThemeService = l, this._register(b); } dispose() { super.dispose(); } updateOptions(e) { - YM(this._configurationService, e, !0), typeof e.theme == "string" && this._standaloneThemeService.setTheme(e.theme), typeof e.autoDetectHighContrast < "u" && this._standaloneThemeService.setAutoDetectHighContrast(!!e.autoDetectHighContrast), super.updateOptions(e); + i2(this._configurationService, e, !0), typeof e.theme == "string" && this._standaloneThemeService.setTheme(e.theme), typeof e.autoDetectHighContrast < "u" && this._standaloneThemeService.setAutoDetectHighContrast(!!e.autoDetectHighContrast), super.updateOptions(e); } _createInnerEditor(e, t, i) { - return e.createInstance(PM, t, i); + return e.createInstance(s2, t, i); } getOriginalEditor() { return super.getOriginalEditor(); @@ -107434,41 +107434,41 @@ let SR = class extends Kc { return this.getModifiedEditor().addAction(e); } }; -SR = C9([ - Et(2, Se), - Et(3, _e), - Et(4, ft), - Et(5, el), - Et(6, Vi), - Et(7, Ke), - Et(8, Co), - Et(9, qh), - Et(10, od), - Et(11, jh) -], SR); -function l8(s, e, t, i, n) { +zk = UE([ + Ht(2, Ge), + Ht(3, xe), + Ht(4, gt), + Ht(5, nr), + Ht(6, vi), + Ht(7, Qe), + Ht(8, Xo), + Ht(9, iu), + Ht(10, da), + Ht(11, tu) +], zk); +function A8(s, e, t, i, n) { if (t = t || "", !i) { const o = t.indexOf(` `); - let r = t; - return o !== -1 && (r = t.substring(0, o)), HB(s, t, e.createByFilepathOrFirstLine(n || null, r), n); + let l = t; + return o !== -1 && (l = t.substring(0, o)), ZU(s, t, e.createByFilepathOrFirstLine(n || null, l), n); } - return HB(s, t, e.createById(i), n); + return ZU(s, t, e.createById(i), n); } -function HB(s, e, t, i) { +function ZU(s, e, t, i) { return s.createModel(e, t, i); } -var U_e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Dxe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, JB = function(s, e) { +}, fU = function(s, e) { return function(t, i) { e(t, i, s); }; }; -class K_e { +class Fxe { constructor(e, t) { this.viewModel = e, this.deltaScrollVertical = t; } @@ -107476,71 +107476,71 @@ class K_e { return this.viewModel; } } -let BM = class extends R { +let o2 = class extends J { constructor(e, t, i, n, o) { - super(), this._container = e, this._overflowWidgetsDomNode = t, this._workbenchUIElementFactory = i, this._instantiationService = n, this._viewModel = Oe(this, void 0), this._collapsed = ye(this, (a) => { - var c; - return (c = this._viewModel.read(a)) == null ? void 0 : c.collapsed.read(a); - }), this._editorContentHeight = Oe(this, 500), this.contentHeight = ye(this, (a) => (this._collapsed.read(a) ? 0 : this._editorContentHeight.read(a)) + this._outerEditorHeight), this._modifiedContentWidth = Oe(this, 0), this._modifiedWidth = Oe(this, 0), this._originalContentWidth = Oe(this, 0), this._originalWidth = Oe(this, 0), this.maxScroll = ye(this, (a) => { - const c = this._modifiedContentWidth.read(a) - this._modifiedWidth.read(a), d = this._originalContentWidth.read(a) - this._originalWidth.read(a); - return c > d ? { maxScroll: c, width: this._modifiedWidth.read(a) } : { maxScroll: d, width: this._originalWidth.read(a) }; - }), this._elements = Qe("div.multiDiffEntry", [ - Qe("div.header@header", [ - Qe("div.header-content", [ - Qe("div.collapse-button@collapseButton"), - Qe("div.file-path", [ - Qe("div.title.modified.show-file-icons@primaryPath", []), - Qe("div.status.deleted@status", ["R"]), - Qe("div.title.original.show-file-icons@secondaryPath", []) + super(), this._container = e, this._overflowWidgetsDomNode = t, this._workbenchUIElementFactory = i, this._instantiationService = n, this._viewModel = Ue(this, void 0), this._collapsed = fe(this, (c) => { + var d; + return (d = this._viewModel.read(c)) == null ? void 0 : d.collapsed.read(c); + }), this._editorContentHeight = Ue(this, 500), this.contentHeight = fe(this, (c) => (this._collapsed.read(c) ? 0 : this._editorContentHeight.read(c)) + this._outerEditorHeight), this._modifiedContentWidth = Ue(this, 0), this._modifiedWidth = Ue(this, 0), this._originalContentWidth = Ue(this, 0), this._originalWidth = Ue(this, 0), this.maxScroll = fe(this, (c) => { + const d = this._modifiedContentWidth.read(c) - this._modifiedWidth.read(c), a = this._originalContentWidth.read(c) - this._originalWidth.read(c); + return d > a ? { maxScroll: d, width: this._modifiedWidth.read(c) } : { maxScroll: a, width: this._originalWidth.read(c) }; + }), this._elements = Oe("div.multiDiffEntry", [ + Oe("div.header@header", [ + Oe("div.header-content", [ + Oe("div.collapse-button@collapseButton"), + Oe("div.file-path", [ + Oe("div.title.modified.show-file-icons@primaryPath", []), + Oe("div.status.deleted@status", ["R"]), + Oe("div.title.original.show-file-icons@secondaryPath", []) ]), - Qe("div.actions@actions") + Oe("div.actions@actions") ]) ]), - Qe("div.editorParent", [ - Qe("div.editorContainer@editor") + Oe("div.editorParent", [ + Oe("div.editorContainer@editor") ]) - ]), this.editor = this._register(this._instantiationService.createInstance(Kc, this._elements.editor, { + ]), this.editor = this._register(this._instantiationService.createInstance($d, this._elements.editor, { overflowWidgetsDomNode: this._overflowWidgetsDomNode - }, {})), this.isModifedFocused = oo(this.editor.getModifiedEditor()).isFocused, this.isOriginalFocused = oo(this.editor.getOriginalEditor()).isFocused, this.isFocused = ye(this, (a) => this.isModifedFocused.read(a) || this.isOriginalFocused.read(a)), this._resourceLabel = this._workbenchUIElementFactory.createResourceLabel ? this._register(this._workbenchUIElementFactory.createResourceLabel(this._elements.primaryPath)) : void 0, this._resourceLabel2 = this._workbenchUIElementFactory.createResourceLabel ? this._register(this._workbenchUIElementFactory.createResourceLabel(this._elements.secondaryPath)) : void 0, this._dataStore = this._register(new U()), this._headerHeight = 40, this._lastScrollTop = -1, this._isSettingScrollTop = !1; - const r = new Sx(this._elements.collapseButton, {}); - this._register(Te((a) => { - r.element.className = "", r.icon = this._collapsed.read(a) ? te.chevronRight : te.chevronDown; - })), this._register(r.onDidClick(() => { - var a; - (a = this._viewModel.get()) == null || a.collapsed.set(!this._collapsed.get(), void 0); - })), this._register(Te((a) => { - this._elements.editor.style.display = this._collapsed.read(a) ? "none" : "block"; - })), this._register(this.editor.getModifiedEditor().onDidLayoutChange((a) => { - const c = this.editor.getModifiedEditor().getLayoutInfo().contentWidth; - this._modifiedWidth.set(c, void 0); - })), this._register(this.editor.getOriginalEditor().onDidLayoutChange((a) => { - const c = this.editor.getOriginalEditor().getLayoutInfo().contentWidth; - this._originalWidth.set(c, void 0); - })), this._register(this.editor.onDidContentSizeChange((a) => { - dy((c) => { - this._editorContentHeight.set(a.contentHeight, c), this._modifiedContentWidth.set(this.editor.getModifiedEditor().getContentWidth(), c), this._originalContentWidth.set(this.editor.getOriginalEditor().getContentWidth(), c); + }, {})), this.isModifedFocused = ro(this.editor.getModifiedEditor()).isFocused, this.isOriginalFocused = ro(this.editor.getOriginalEditor()).isFocused, this.isFocused = fe(this, (c) => this.isModifedFocused.read(c) || this.isOriginalFocused.read(c)), this._resourceLabel = this._workbenchUIElementFactory.createResourceLabel ? this._register(this._workbenchUIElementFactory.createResourceLabel(this._elements.primaryPath)) : void 0, this._resourceLabel2 = this._workbenchUIElementFactory.createResourceLabel ? this._register(this._workbenchUIElementFactory.createResourceLabel(this._elements.secondaryPath)) : void 0, this._dataStore = this._register(new _()), this._headerHeight = 40, this._lastScrollTop = -1, this._isSettingScrollTop = !1; + const l = new vL(this._elements.collapseButton, {}); + this._register(Te((c) => { + l.element.className = "", l.icon = this._collapsed.read(c) ? te.chevronRight : te.chevronDown; + })), this._register(l.onDidClick(() => { + var c; + (c = this._viewModel.get()) == null || c.collapsed.set(!this._collapsed.get(), void 0); + })), this._register(Te((c) => { + this._elements.editor.style.display = this._collapsed.read(c) ? "none" : "block"; + })), this._register(this.editor.getModifiedEditor().onDidLayoutChange((c) => { + const d = this.editor.getModifiedEditor().getLayoutInfo().contentWidth; + this._modifiedWidth.set(d, void 0); + })), this._register(this.editor.getOriginalEditor().onDidLayoutChange((c) => { + const d = this.editor.getOriginalEditor().getLayoutInfo().contentWidth; + this._originalWidth.set(d, void 0); + })), this._register(this.editor.onDidContentSizeChange((c) => { + Wf((d) => { + this._editorContentHeight.set(c.contentHeight, d), this._modifiedContentWidth.set(this.editor.getModifiedEditor().getContentWidth(), d), this._originalContentWidth.set(this.editor.getOriginalEditor().getContentWidth(), d); }); - })), this._register(this.editor.getOriginalEditor().onDidScrollChange((a) => { - if (this._isSettingScrollTop || !a.scrollTopChanged || !this._data) + })), this._register(this.editor.getOriginalEditor().onDidScrollChange((c) => { + if (this._isSettingScrollTop || !c.scrollTopChanged || !this._data) return; - const c = a.scrollTop - this._lastScrollTop; - this._data.deltaScrollVertical(c); - })), this._register(Te((a) => { - var d; - const c = (d = this._viewModel.read(a)) == null ? void 0 : d.isActive.read(a); - this._elements.root.classList.toggle("active", c); + const d = c.scrollTop - this._lastScrollTop; + this._data.deltaScrollVertical(d); + })), this._register(Te((c) => { + var a; + const d = (a = this._viewModel.read(c)) == null ? void 0 : a.isActive.read(c); + this._elements.root.classList.toggle("active", d); })), this._container.appendChild(this._elements.root), this._outerEditorHeight = this._headerHeight, this._contextKeyService = this._register(o.createScoped(this._elements.actions)); - const l = this._register(this._instantiationService.createChild(new l0([_e, this._contextKeyService]))); - this._register(l.createInstance(gx, this._elements.actions, pe.MultiDiffEditorFileToolbar, { - actionRunner: this._register(new h4(() => { - var a; - return (a = this._viewModel.get()) == null ? void 0 : a.modifiedUri; + const r = this._register(this._instantiationService.createChild(new m0([xe, this._contextKeyService]))); + this._register(r.createInstance(CL, this._elements.actions, pe.MultiDiffEditorFileToolbar, { + actionRunner: this._register(new BO(() => { + var c; + return (c = this._viewModel.get()) == null ? void 0 : c.modifiedUri; })), menuOptions: { shouldForwardArgs: !0 }, - toolbarOptions: { primaryGroup: (a) => a.startsWith("navigation") }, - actionViewItemProvider: (a, c) => m4(l, a, c) + toolbarOptions: { primaryGroup: (c) => c.startsWith("navigation") }, + actionViewItemProvider: (c, d) => OO(r, c, d) })); } setScrollLeft(e) { @@ -107567,17 +107567,17 @@ let BM = class extends R { }; } if (!e) { - dy((n) => { + Wf((n) => { this._viewModel.set(void 0, n), this.editor.setDiffModel(null, n), this._dataStore.clear(); }); return; } const i = e.viewModel.documentDiffItem; - if (dy((n) => { - var c, d; - (c = this._resourceLabel) == null || c.setUri(e.viewModel.modifiedUri ?? e.viewModel.originalUri, { strikethrough: e.viewModel.modifiedUri === void 0 }); - let o = !1, r = !1, l = !1, a = ""; - e.viewModel.modifiedUri && e.viewModel.originalUri && e.viewModel.modifiedUri.path !== e.viewModel.originalUri.path ? (a = "R", o = !0) : e.viewModel.modifiedUri ? e.viewModel.originalUri || (a = "A", l = !0) : (a = "D", r = !0), this._elements.status.classList.toggle("renamed", o), this._elements.status.classList.toggle("deleted", r), this._elements.status.classList.toggle("added", l), this._elements.status.innerText = a, (d = this._resourceLabel2) == null || d.setUri(o ? e.viewModel.originalUri : void 0, { strikethrough: !0 }), this._dataStore.clear(), this._viewModel.set(e.viewModel, n), this.editor.setDiffModel(e.viewModel.diffEditorViewModelRef, n), this.editor.updateOptions(t(i.options ?? {})); + if (Wf((n) => { + var d, a; + (d = this._resourceLabel) == null || d.setUri(e.viewModel.modifiedUri ?? e.viewModel.originalUri, { strikethrough: e.viewModel.modifiedUri === void 0 }); + let o = !1, l = !1, r = !1, c = ""; + e.viewModel.modifiedUri && e.viewModel.originalUri && e.viewModel.modifiedUri.path !== e.viewModel.originalUri.path ? (c = "R", o = !0) : e.viewModel.modifiedUri ? e.viewModel.originalUri || (c = "A", r = !0) : (c = "D", l = !0), this._elements.status.classList.toggle("renamed", o), this._elements.status.classList.toggle("deleted", l), this._elements.status.classList.toggle("added", r), this._elements.status.innerText = c, (a = this._resourceLabel2) == null || a.setUri(o ? e.viewModel.originalUri : void 0, { strikethrough: !0 }), this._dataStore.clear(), this._viewModel.set(e.viewModel, n), this.editor.setDiffModel(e.viewModel.diffEditorViewModelRef, n), this.editor.updateOptions(t(i.options ?? {})); }), i.onOptionsDidChange && this._dataStore.add(i.onOptionsDidChange(() => { this.editor.updateOptions(t(i.options ?? {})); })), e.viewModel.isAlive.recomputeInitiallyAndOnChange(this._dataStore, (n) => { @@ -107588,8 +107588,8 @@ let BM = class extends R { } render(e, t, i, n) { this._elements.root.style.visibility = "visible", this._elements.root.style.top = `${e.start}px`, this._elements.root.style.height = `${e.length}px`, this._elements.root.style.width = `${t}px`, this._elements.root.style.position = "absolute"; - const o = e.length - this._headerHeight, r = Math.max(0, Math.min(n.start - e.start, o)); - this._elements.header.style.transform = `translateY(${r}px)`, dy((l) => { + const o = e.length - this._headerHeight, l = Math.max(0, Math.min(n.start - e.start, o)); + this._elements.header.style.transform = `translateY(${l}px)`, Wf((r) => { this.editor.layout({ width: t - 2 * 8 - 2 * 1, height: e.length - this._outerEditorHeight @@ -107600,17 +107600,17 @@ let BM = class extends R { } finally { this._isSettingScrollTop = !1; } - this._elements.header.classList.toggle("shadow", r > 0 || i > 0), this._elements.header.classList.toggle("collapsed", r === o); + this._elements.header.classList.toggle("shadow", l > 0 || i > 0), this._elements.header.classList.toggle("collapsed", l === o); } hide() { this._elements.root.style.top = "-100000px", this._elements.root.style.visibility = "hidden"; } }; -BM = U_e([ - JB(3, Se), - JB(4, _e) -], BM); -class Q_e { +o2 = Dxe([ + fU(3, Ge), + fU(4, xe) +], o2); +class zxe { constructor(e) { this._create = e, this._unused = /* @__PURE__ */ new Set(), this._used = /* @__PURE__ */ new Set(), this._itemData = /* @__PURE__ */ new Map(); } @@ -107637,154 +107637,154 @@ class Q_e { this._used.clear(), this._unused.clear(); } } -var j_e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +var Axe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, UB = function(s, e) { +}, yU = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let LR = class extends R { - constructor(e, t, i, n, o, r) { - super(), this._element = e, this._dimension = t, this._viewModel = i, this._workbenchUIElementFactory = n, this._parentContextKeyService = o, this._parentInstantiationService = r, this._scrollableElements = Qe("div.scrollContent", [ - Qe("div@content", { +let Ak = class extends J { + constructor(e, t, i, n, o, l) { + super(), this._element = e, this._dimension = t, this._viewModel = i, this._workbenchUIElementFactory = n, this._parentContextKeyService = o, this._parentInstantiationService = l, this._scrollableElements = Oe("div.scrollContent", [ + Oe("div@content", { style: { overflow: "hidden" } }), - Qe("div.monaco-editor@overflowWidgetsDomNode", {}) - ]), this._scrollable = this._register(new o0({ + Oe("div.monaco-editor@overflowWidgetsDomNode", {}) + ]), this._scrollable = this._register(new h0({ forceIntegerValues: !1, - scheduleAtNextAnimationFrame: (a) => po(xe(this._element), a), + scheduleAtNextAnimationFrame: (c) => Zo(Le(this._element), c), smoothScrollDuration: 100 - })), this._scrollableElement = this._register(new uI(this._scrollableElements.root, { + })), this._scrollableElement = this._register(new xx(this._scrollableElements.root, { vertical: 1, horizontal: 1, useShadows: !1 - }, this._scrollable)), this._elements = Qe("div.monaco-component.multiDiffEditor", {}, [ - Qe("div", {}, [this._scrollableElement.getDomNode()]), - Qe("div.placeholder@placeholder", {}, [Qe("div", [p("noChangedFiles", "No Changed Files")])]) - ]), this._sizeObserver = this._register(new jK(this._element, void 0)), this._objectPool = this._register(new Q_e((a) => { - const c = this._instantiationService.createInstance(BM, this._scrollableElements.content, this._scrollableElements.overflowWidgetsDomNode, this._workbenchUIElementFactory); - return c.setData(a), c; - })), this.scrollTop = St(this, this._scrollableElement.onScroll, () => ( + }, this._scrollable)), this._elements = Oe("div.monaco-component.multiDiffEditor", {}, [ + Oe("div", {}, [this._scrollableElement.getDomNode()]), + Oe("div.placeholder@placeholder", {}, [Oe("div", [p("noChangedFiles", "No Changed Files")])]) + ]), this._sizeObserver = this._register(new MO(this._element, void 0)), this._objectPool = this._register(new zxe((c) => { + const d = this._instantiationService.createInstance(o2, this._scrollableElements.content, this._scrollableElements.overflowWidgetsDomNode, this._workbenchUIElementFactory); + return d.setData(c), d; + })), this.scrollTop = Gt(this, this._scrollableElement.onScroll, () => ( /** @description scrollTop */ this._scrollableElement.getScrollPosition().scrollTop - )), this.scrollLeft = St(this, this._scrollableElement.onScroll, () => ( + )), this.scrollLeft = Gt(this, this._scrollableElement.onScroll, () => ( /** @description scrollLeft */ this._scrollableElement.getScrollPosition().scrollLeft - )), this._viewItemsInfo = Uh(this, (a, c) => { - const d = this._viewModel.read(a); - if (!d) - return { items: [], getItem: (m) => { - throw new mt(); + )), this._viewItemsInfo = qh(this, (c, d) => { + const a = this._viewModel.read(c); + if (!a) + return { items: [], getItem: (b) => { + throw new bt(); } }; - const h = d.items.read(a), u = /* @__PURE__ */ new Map(); - return { items: h.map((m) => { - var y; - const f = c.add(new q_e(m, this._objectPool, this.scrollLeft, (w) => { - this._scrollableElement.setScrollPosition({ scrollTop: this._scrollableElement.getScrollPosition().scrollTop + w }); - })), b = (y = this._lastDocStates) == null ? void 0 : y[f.getKey()]; - return b && oi((w) => { - f.setViewState(b, w); - }), u.set(m, f), f; - }), getItem: (m) => u.get(m) }; - }), this._viewItems = this._viewItemsInfo.map(this, (a) => a.items), this._spaceBetweenPx = 0, this._totalHeight = this._viewItems.map(this, (a, c) => a.reduce((d, h) => d + h.contentHeight.read(c) + this._spaceBetweenPx, 0)), this._contextKeyService = this._register(this._parentContextKeyService.createScoped(this._element)), this._instantiationService = this._register(this._parentInstantiationService.createChild(new l0([_e, this._contextKeyService]))), this._lastDocStates = {}, this._contextKeyService.createKey(I.inMultiDiffEditor.key, !0), this._register(ks((a, c) => { - const d = this._viewModel.read(a); - if (d && d.contextKeys) - for (const [h, u] of Object.entries(d.contextKeys)) { - const g = this._contextKeyService.createKey(h, void 0); - g.set(u), c.add(Ce(() => g.reset())); + const h = a.items.read(c), u = /* @__PURE__ */ new Map(); + return { items: h.map((b) => { + var f; + const g = d.add(new Kxe(b, this._objectPool, this.scrollLeft, (y) => { + this._scrollableElement.setScrollPosition({ scrollTop: this._scrollableElement.getScrollPosition().scrollTop + y }); + })), Z = (f = this._lastDocStates) == null ? void 0 : f[g.getKey()]; + return Z && li((y) => { + g.setViewState(Z, y); + }), u.set(b, g), g; + }), getItem: (b) => u.get(b) }; + }), this._viewItems = this._viewItemsInfo.map(this, (c) => c.items), this._spaceBetweenPx = 0, this._totalHeight = this._viewItems.map(this, (c, d) => c.reduce((a, h) => a + h.contentHeight.read(d) + this._spaceBetweenPx, 0)), this._contextKeyService = this._register(this._parentContextKeyService.createScoped(this._element)), this._instantiationService = this._register(this._parentInstantiationService.createChild(new m0([xe, this._contextKeyService]))), this._lastDocStates = {}, this._contextKeyService.createKey(C.inMultiDiffEditor.key, !0), this._register(Js((c, d) => { + const a = this._viewModel.read(c); + if (a && a.contextKeys) + for (const [h, u] of Object.entries(a.contextKeys)) { + const m = this._contextKeyService.createKey(h, void 0); + m.set(u), d.add(We(() => m.reset())); } })); - const l = this._parentContextKeyService.createKey(I.multiDiffEditorAllCollapsed.key, !1); - this._register(Te((a) => { - const c = this._viewModel.read(a); - if (c) { - const d = c.items.read(a).every((h) => h.collapsed.read(a)); - l.set(d); - } - })), this._register(Te((a) => { - const c = this._dimension.read(a); - this._sizeObserver.observe(c); - })), this._register(Te((a) => { - const c = this._viewItems.read(a); - this._elements.placeholder.classList.toggle("visible", c.length === 0); - })), this._scrollableElements.content.style.position = "relative", this._register(Te((a) => { - const c = this._sizeObserver.height.read(a); - this._scrollableElements.root.style.height = `${c}px`; - const d = this._totalHeight.read(a); - this._scrollableElements.content.style.height = `${d}px`; - const h = this._sizeObserver.width.read(a); + const r = this._parentContextKeyService.createKey(C.multiDiffEditorAllCollapsed.key, !1); + this._register(Te((c) => { + const d = this._viewModel.read(c); + if (d) { + const a = d.items.read(c).every((h) => h.collapsed.read(c)); + r.set(a); + } + })), this._register(Te((c) => { + const d = this._dimension.read(c); + this._sizeObserver.observe(d); + })), this._register(Te((c) => { + const d = this._viewItems.read(c); + this._elements.placeholder.classList.toggle("visible", d.length === 0); + })), this._scrollableElements.content.style.position = "relative", this._register(Te((c) => { + const d = this._sizeObserver.height.read(c); + this._scrollableElements.root.style.height = `${d}px`; + const a = this._totalHeight.read(c); + this._scrollableElements.content.style.height = `${a}px`; + const h = this._sizeObserver.width.read(c); let u = h; - const g = this._viewItems.read(a), m = jE(g, gs((f) => f.maxScroll.read(a).maxScroll, zr)); - if (m) { - const f = m.maxScroll.read(a); - u = h + f.maxScroll; + const m = this._viewItems.read(c), b = XJ(m, ps((g) => g.maxScroll.read(c).maxScroll, Ul)); + if (b) { + const g = b.maxScroll.read(c); + u = h + g.maxScroll; } this._scrollableElement.setScrollDimensions({ width: h, - height: c, - scrollHeight: d, + height: d, + scrollHeight: a, scrollWidth: u }); - })), e.replaceChildren(this._elements.root), this._register(Ce(() => { + })), e.replaceChildren(this._elements.root), this._register(We(() => { e.replaceChildren(); - })), this._register(this._register(Te((a) => { - dy((c) => { - this.render(a); + })), this._register(this._register(Te((c) => { + Wf((d) => { + this.render(c); }); }))); } render(e) { const t = this.scrollTop.read(e); let i = 0, n = 0, o = 0; - const r = this._sizeObserver.height.read(e), l = He.ofStartAndLength(t, r), a = this._sizeObserver.width.read(e); - for (const c of this._viewItems.read(e)) { - const d = c.contentHeight.read(e), h = Math.min(d, r), u = He.ofStartAndLength(n, h), g = He.ofStartAndLength(o, d); - if (g.isBefore(l)) - i -= d - h, c.hide(); - else if (g.isAfter(l)) - c.hide(); + const l = this._sizeObserver.height.read(e), r = Pe.ofStartAndLength(t, l), c = this._sizeObserver.width.read(e); + for (const d of this._viewItems.read(e)) { + const a = d.contentHeight.read(e), h = Math.min(a, l), u = Pe.ofStartAndLength(n, h), m = Pe.ofStartAndLength(o, a); + if (m.isBefore(r)) + i -= a - h, d.hide(); + else if (m.isAfter(r)) + d.hide(); else { - const m = Math.max(0, Math.min(l.start - g.start, d - h)); - i -= m; - const f = He.ofStartAndLength(t + i, r); - c.render(u, m, a, f); + const b = Math.max(0, Math.min(r.start - m.start, a - h)); + i -= b; + const g = Pe.ofStartAndLength(t + i, l); + d.render(u, b, c, g); } - n += h + this._spaceBetweenPx, o += d + this._spaceBetweenPx; + n += h + this._spaceBetweenPx, o += a + this._spaceBetweenPx; } this._scrollableElements.content.style.transform = `translateY(${-(t + i)}px)`; } }; -LR = j_e([ - UB(4, _e), - UB(5, Se) -], LR); -class q_e extends R { +Ak = Axe([ + yU(4, xe), + yU(5, Ge) +], Ak); +class Kxe extends J { constructor(e, t, i, n) { - super(), this.viewModel = e, this._objectPool = t, this._scrollLeft = i, this._deltaScrollVertical = n, this._templateRef = this._register(p1(this, void 0)), this.contentHeight = ye(this, (o) => { - var r, l; - return ((l = (r = this._templateRef.read(o)) == null ? void 0 : r.object.contentHeight) == null ? void 0 : l.read(o)) ?? this.viewModel.lastTemplateData.read(o).contentHeight; - }), this.maxScroll = ye(this, (o) => { - var r; - return ((r = this._templateRef.read(o)) == null ? void 0 : r.object.maxScroll.read(o)) ?? { maxScroll: 0, scrollWidth: 0 }; - }), this.template = ye(this, (o) => { - var r; - return (r = this._templateRef.read(o)) == null ? void 0 : r.object; - }), this._isHidden = Oe(this, !1), this._isFocused = ye(this, (o) => { - var r; - return ((r = this.template.read(o)) == null ? void 0 : r.isFocused.read(o)) ?? !1; - }), this.viewModel.setIsFocused(this._isFocused, void 0), this._register(Te((o) => { + super(), this.viewModel = e, this._objectPool = t, this._scrollLeft = i, this._deltaScrollVertical = n, this._templateRef = this._register(xW(this, void 0)), this.contentHeight = fe(this, (o) => { + var l, r; + return ((r = (l = this._templateRef.read(o)) == null ? void 0 : l.object.contentHeight) == null ? void 0 : r.read(o)) ?? this.viewModel.lastTemplateData.read(o).contentHeight; + }), this.maxScroll = fe(this, (o) => { var l; - const r = this._scrollLeft.read(o); - (l = this._templateRef.read(o)) == null || l.object.setScrollLeft(r); + return ((l = this._templateRef.read(o)) == null ? void 0 : l.object.maxScroll.read(o)) ?? { maxScroll: 0, scrollWidth: 0 }; + }), this.template = fe(this, (o) => { + var l; + return (l = this._templateRef.read(o)) == null ? void 0 : l.object; + }), this._isHidden = Ue(this, !1), this._isFocused = fe(this, (o) => { + var l; + return ((l = this.template.read(o)) == null ? void 0 : l.isFocused.read(o)) ?? !1; + }), this.viewModel.setIsFocused(this._isFocused, void 0), this._register(Te((o) => { + var r; + const l = this._scrollLeft.read(o); + (r = this._templateRef.read(o)) == null || r.object.setScrollLeft(l); })), this._register(Te((o) => { - const r = this._templateRef.read(o); - !r || !this._isHidden.read(o) || r.object.isFocused.read(o) || this._clear(); + const l = this._templateRef.read(o); + !l || !this._isHidden.read(o) || l.object.isFocused.read(o) || this._clear(); })); } dispose() { @@ -107798,9 +107798,9 @@ class q_e extends R { return this.viewModel.getKey(); } setViewState(e, t) { - var r; + var l; this.viewModel.collapsed.set(e.collapsed, t), this._updateTemplateData(t); - const i = this.viewModel.lastTemplateData.get(), n = (r = e.selections) == null ? void 0 : r.map(fe.liftSelection); + const i = this.viewModel.lastTemplateData.get(), n = (l = e.selections) == null ? void 0 : l.map(ge.liftSelection); this.viewModel.lastTemplateData.set({ ...i, selections: n @@ -107817,7 +107817,7 @@ class q_e extends R { } _clear() { const e = this._templateRef.get(); - e && oi((t) => { + e && li((t) => { this._updateTemplateData(t), e.object.hide(), this._templateRef.set(void 0, t); }); } @@ -107828,69 +107828,69 @@ class q_e extends R { this._isHidden.set(!1, void 0); let o = this._templateRef.get(); if (!o) { - o = this._objectPool.getUnusedObj(new K_e(this.viewModel, this._deltaScrollVertical)), this._templateRef.set(o, void 0); - const r = this.viewModel.lastTemplateData.get().selections; - r && o.object.editor.setSelections(r); + o = this._objectPool.getUnusedObj(new Fxe(this.viewModel, this._deltaScrollVertical)), this._templateRef.set(o, void 0); + const l = this.viewModel.lastTemplateData.get().selections; + l && o.object.editor.setSelections(l); } o.object.render(e, i, t, n); } } -N("multiDiffEditor.headerBackground", { dark: "#262626", light: "tab.inactiveBackground", hcDark: "tab.inactiveBackground", hcLight: "tab.inactiveBackground" }, p("multiDiffEditor.headerBackground", "The background color of the diff editor's header")); -N("multiDiffEditor.background", Hr, p("multiDiffEditor.background", "The background color of the multi file diff editor")); -N("multiDiffEditor.border", { dark: "sideBarSectionHeader.border", light: "#cccccc", hcDark: "sideBarSectionHeader.border", hcLight: "#cccccc" }, p("multiDiffEditor.border", "The border color of the multi file diff editor")); -var $_e = function(s, e, t, i) { - var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, r; +R("multiDiffEditor.headerBackground", { dark: "#262626", light: "tab.inactiveBackground", hcDark: "tab.inactiveBackground", hcLight: "tab.inactiveBackground" }, p("multiDiffEditor.headerBackground", "The background color of the diff editor's header")); +R("multiDiffEditor.background", Ql, p("multiDiffEditor.background", "The background color of the multi file diff editor")); +R("multiDiffEditor.border", { dark: "sideBarSectionHeader.border", light: "#cccccc", hcDark: "sideBarSectionHeader.border", hcLight: "#cccccc" }, p("multiDiffEditor.border", "The border color of the multi file diff editor")); +var Uxe = function(s, e, t, i) { + var n = arguments.length, o = n < 3 ? e : i === null ? i = Object.getOwnPropertyDescriptor(e, t) : i, l; if (typeof Reflect == "object" && typeof Reflect.decorate == "function") o = Reflect.decorate(s, e, t, i); - else for (var l = s.length - 1; l >= 0; l--) (r = s[l]) && (o = (n < 3 ? r(o) : n > 3 ? r(e, t, o) : r(e, t)) || o); + else for (var r = s.length - 1; r >= 0; r--) (l = s[r]) && (o = (n < 3 ? l(o) : n > 3 ? l(e, t, o) : l(e, t)) || o); return n > 3 && o && Object.defineProperty(e, t, o), o; -}, eIe = function(s, e) { +}, Pxe = function(s, e) { return function(t, i) { e(t, i, s); }; }; -let AR = class extends R { +let Kk = class extends J { constructor(e, t, i) { - super(), this._element = e, this._workbenchUIElementFactory = t, this._instantiationService = i, this._dimension = Oe(this, void 0), this._viewModel = Oe(this, void 0), this._widgetImpl = Uh(this, (n, o) => (eo(BM, n), o.add(this._instantiationService.createInstance(eo(LR, n), this._element, this._dimension, this._viewModel, this._workbenchUIElementFactory)))), this._register(h0(this._widgetImpl)); + super(), this._element = e, this._workbenchUIElementFactory = t, this._instantiationService = i, this._dimension = Ue(this, void 0), this._viewModel = Ue(this, void 0), this._widgetImpl = qh(this, (n, o) => (io(o2, n), o.add(this._instantiationService.createInstance(io(Ak, n), this._element, this._dimension, this._viewModel, this._workbenchUIElementFactory)))), this._register(Z0(this._widgetImpl)); } }; -AR = $_e([ - eIe(2, Se) -], AR); -function tIe(s, e, t) { - return Ne.initialize(t || {}).createInstance(CR, s, e); -} -function iIe(s) { - return Ne.get(ft).onCodeEditorAdd((t) => { +Kk = Uxe([ + Pxe(2, Ge) +], Kk); +function Bxe(s, e, t) { + return Re.initialize(t || {}).createInstance(Fk, s, e); +} +function _xe(s) { + return Re.get(gt).onCodeEditorAdd((t) => { s(t); }); } -function nIe(s) { - return Ne.get(ft).onDiffEditorAdd((t) => { +function Qxe(s) { + return Re.get(gt).onDiffEditorAdd((t) => { s(t); }); } -function sIe() { - return Ne.get(ft).listCodeEditors(); +function Oxe() { + return Re.get(gt).listCodeEditors(); } -function oIe() { - return Ne.get(ft).listDiffEditors(); +function jxe() { + return Re.get(gt).listDiffEditors(); } -function rIe(s, e, t) { - return Ne.initialize(t || {}).createInstance(SR, s, e); +function qxe(s, e, t) { + return Re.initialize(t || {}).createInstance(zk, s, e); } -function lIe(s, e) { - const t = Ne.initialize(e || {}); - return new AR(s, {}, t); +function $xe(s, e) { + const t = Re.initialize(e || {}); + return new Kk(s, {}, t); } -function aIe(s) { +function eCe(s) { if (typeof s.id != "string" || typeof s.run != "function") throw new Error("Invalid command descriptor, `id` and `run` are required properties!"); return st.registerCommand(s.id, s.run); } -function cIe(s) { +function tCe(s) { if (typeof s.id != "string" || typeof s.label != "string" || typeof s.run != "function") throw new Error("Invalid action descriptor, `id`, `label` and `run` are required properties!"); - const e = H.deserialize(s.precondition), t = (n, ...o) => zi.runEditorCommand(n, o, e, (r, l, a) => Promise.resolve(s.run(l, ...a))), i = new U(); + const e = P.deserialize(s.precondition), t = (n, ...o) => Ai.runEditorCommand(n, o, e, (l, r, c) => Promise.resolve(s.run(r, ...c))), i = new _(); if (i.add(st.registerCommand(s.id, t)), s.contextMenuGroupId) { const n = { command: { @@ -107901,16 +107901,16 @@ function cIe(s) { group: s.contextMenuGroupId, order: s.contextMenuOrder || 0 }; - i.add(nn.appendMenuItem(pe.EditorContext, n)); + i.add(sn.appendMenuItem(pe.EditorContext, n)); } if (Array.isArray(s.keybindings)) { - const n = Ne.get(xt); - if (!(n instanceof Bb)) + const n = Re.get(Lt); + if (!(n instanceof OZ)) console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"); else { - const o = H.and(e, H.deserialize(s.keybindingContext)); - i.add(n.addDynamicKeybindings(s.keybindings.map((r) => ({ - keybinding: r, + const o = P.and(e, P.deserialize(s.keybindingContext)); + i.add(n.addDynamicKeybindings(s.keybindings.map((l) => ({ + keybinding: l, command: s.id, when: o })))); @@ -107918,196 +107918,196 @@ function cIe(s) { } return i; } -function dIe(s) { - return a8([s]); +function iCe(s) { + return K8([s]); } -function a8(s) { - const e = Ne.get(xt); - return e instanceof Bb ? e.addDynamicKeybindings(s.map((t) => ({ +function K8(s) { + const e = Re.get(Lt); + return e instanceof OZ ? e.addDynamicKeybindings(s.map((t) => ({ keybinding: t.keybinding, command: t.command, commandArgs: t.commandArgs, - when: H.deserialize(t.when) - }))) : (console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"), R.None); + when: P.deserialize(t.when) + }))) : (console.warn("Cannot add keybinding because the editor is configured with an unrecognized KeybindingService"), J.None); } -function hIe(s, e, t) { - const i = Ne.get(ri), n = i.getLanguageIdByMimeType(e) || e; - return l8(Ne.get(Pt), i, s, n, t); +function nCe(s, e, t) { + const i = Re.get(ri), n = i.getLanguageIdByMimeType(e) || e; + return A8(Re.get(At), i, s, n, t); } -function uIe(s, e) { - const t = Ne.get(ri), i = t.getLanguageIdByMimeType(e) || e || ms; +function sCe(s, e) { + const t = Re.get(ri), i = t.getLanguageIdByMimeType(e) || e || gs; s.setLanguage(t.createById(i)); } -function gIe(s, e, t) { - s && Ne.get(Ba).changeOne(e, s.uri, t); +function oCe(s, e, t) { + s && Re.get(_c).changeOne(e, s.uri, t); } -function mIe(s) { - Ne.get(Ba).changeAll(s, []); +function lCe(s) { + Re.get(_c).changeAll(s, []); } -function pIe(s) { - return Ne.get(Ba).read(s); +function rCe(s) { + return Re.get(_c).read(s); } -function fIe(s) { - return Ne.get(Ba).onMarkerChanged(s); +function cCe(s) { + return Re.get(_c).onMarkerChanged(s); } -function bIe(s) { - return Ne.get(Pt).getModel(s); +function dCe(s) { + return Re.get(At).getModel(s); } -function yIe() { - return Ne.get(Pt).getModels(); +function aCe() { + return Re.get(At).getModels(); } -function wIe(s) { - return Ne.get(Pt).onModelAdded(s); +function hCe(s) { + return Re.get(At).onModelAdded(s); } -function CIe(s) { - return Ne.get(Pt).onModelRemoved(s); +function uCe(s) { + return Re.get(At).onModelRemoved(s); } -function SIe(s) { - return Ne.get(Pt).onModelLanguageChanged((t) => { +function mCe(s) { + return Re.get(At).onModelLanguageChanged((t) => { s({ model: t.model, oldLanguage: t.oldLanguageId }); }); } -function LIe(s) { - return D_e(Ne.get(Pt), s); +function bCe(s) { + return Ixe(Re.get(At), s); } -function AIe(s, e) { - const t = Ne.get(ri), i = Ne.get(el); - return w9.colorizeElement(i, t, s, e).then(() => { +function pCe(s, e) { + const t = Re.get(ri), i = Re.get(nr); + return KE.colorizeElement(i, t, s, e).then(() => { i.registerEditorContainer(s); }); } -function xIe(s, e, t) { - const i = Ne.get(ri); - return Ne.get(el).registerEditorContainer(vt.document.body), w9.colorize(i, s, e, t); +function gCe(s, e, t) { + const i = Re.get(ri); + return Re.get(nr).registerEditorContainer(wt.document.body), KE.colorize(i, s, e, t); } -function MIe(s, e, t = 4) { - return Ne.get(el).registerEditorContainer(vt.document.body), w9.colorizeModelLine(s, e, t); +function ZCe(s, e, t = 4) { + return Re.get(nr).registerEditorContainer(wt.document.body), KE.colorizeModelLine(s, e, t); } -function ZIe(s) { - const e = Wi.get(s); +function fCe(s) { + const e = Ti.get(s); return e || { - getInitialState: () => h1, - tokenize: (t, i, n) => hK(s, n) + getInitialState: () => VW, + tokenize: (t, i, n) => BQ(s, n) }; } -function _Ie(s, e) { - Wi.getOrCreate(e); - const t = ZIe(e), i = Fa(s), n = []; +function yCe(s, e) { + Ti.getOrCreate(e); + const t = fCe(e), i = Kc(s), n = []; let o = t.getInitialState(); - for (let r = 0, l = i.length; r < l; r++) { - const a = i[r], c = t.tokenize(a, !0, o); - n[r] = c.tokens, o = c.endState; + for (let l = 0, r = i.length; l < r; l++) { + const c = i[l], d = t.tokenize(c, !0, o); + n[l] = d.tokens, o = d.endState; } return n; } -function IIe(s, e) { - Ne.get(el).defineTheme(s, e); +function WCe(s, e) { + Re.get(nr).defineTheme(s, e); } -function NIe(s) { - Ne.get(el).setTheme(s); +function GCe(s) { + Re.get(nr).setTheme(s); } -function WIe() { - j2.clearAllFontInfos(); +function XCe() { + fw.clearAllFontInfos(); } -function vIe(s, e) { +function VCe(s, e) { return st.registerCommand({ id: s, handler: e }); } -function TIe(s) { - return Ne.get(Bs).registerOpener({ +function LCe(s) { + return Re.get(Ps).registerOpener({ async open(t) { - return typeof t == "string" && (t = Le.parse(t)), s.open(t); + return typeof t == "string" && (t = Xe.parse(t)), s.open(t); } }); } -function DIe(s) { - return Ne.get(ft).registerCodeEditorOpenHandler(async (t, i, n) => { - var l; +function ICe(s) { + return Re.get(gt).registerCodeEditorOpenHandler(async (t, i, n) => { + var r; if (!i) return null; - const o = (l = t.options) == null ? void 0 : l.selection; - let r; - return o && typeof o.endLineNumber == "number" && typeof o.endColumn == "number" ? r = o : o && (r = { lineNumber: o.startLineNumber, column: o.startColumn }), await s.openCodeEditor(i, t.resource, r) ? i : null; + const o = (r = t.options) == null ? void 0 : r.selection; + let l; + return o && typeof o.endLineNumber == "number" && typeof o.endColumn == "number" ? l = o : o && (l = { lineNumber: o.startLineNumber, column: o.startColumn }), await s.openCodeEditor(i, t.resource, l) ? i : null; }); } -function VIe() { +function SCe() { return { // methods - create: tIe, - getEditors: sIe, - getDiffEditors: oIe, - onDidCreateEditor: iIe, - onDidCreateDiffEditor: nIe, - createDiffEditor: rIe, - addCommand: aIe, - addEditorAction: cIe, - addKeybindingRule: dIe, - addKeybindingRules: a8, - createModel: hIe, - setModelLanguage: uIe, - setModelMarkers: gIe, - getModelMarkers: pIe, - removeAllMarkers: mIe, - onDidChangeMarkers: fIe, - getModels: yIe, - getModel: bIe, - onDidCreateModel: wIe, - onWillDisposeModel: CIe, - onDidChangeModelLanguage: SIe, - createWebWorker: LIe, - colorizeElement: AIe, - colorize: xIe, - colorizeModelLine: MIe, - tokenize: _Ie, - defineTheme: IIe, - setTheme: NIe, - remeasureFonts: WIe, - registerCommand: vIe, - registerLinkOpener: TIe, - registerEditorOpener: DIe, + create: Bxe, + getEditors: Oxe, + getDiffEditors: jxe, + onDidCreateEditor: _xe, + onDidCreateDiffEditor: Qxe, + createDiffEditor: qxe, + addCommand: eCe, + addEditorAction: tCe, + addKeybindingRule: iCe, + addKeybindingRules: K8, + createModel: nCe, + setModelLanguage: sCe, + setModelMarkers: oCe, + getModelMarkers: rCe, + removeAllMarkers: lCe, + onDidChangeMarkers: cCe, + getModels: aCe, + getModel: dCe, + onDidCreateModel: hCe, + onWillDisposeModel: uCe, + onDidChangeModelLanguage: mCe, + createWebWorker: bCe, + colorizeElement: pCe, + colorize: gCe, + colorizeModelLine: ZCe, + tokenize: yCe, + defineTheme: WCe, + setTheme: GCe, + remeasureFonts: XCe, + registerCommand: VCe, + registerLinkOpener: LCe, + registerEditorOpener: ICe, // enums - AccessibilitySupport: Sk, - ContentWidgetPositionPreference: _k, - CursorChangeReason: Ik, - DefaultEndOfLine: Nk, - EditorAutoIndentStrategy: vk, - EditorOption: Tk, - EndOfLinePreference: Dk, - EndOfLineSequence: Vk, - MinimapPosition: Ok, - MinimapSectionHeaderStyle: Hk, - MouseTargetType: Jk, - OverlayWidgetPositionPreference: Qk, - OverviewRulerLane: jk, - GlyphMarginLane: kk, - RenderLineNumbersType: eG, - RenderMinimap: tG, - ScrollbarVisibility: nG, - ScrollType: iG, - TextEditorCursorBlinkingStyle: cG, - TextEditorCursorStyle: dG, - TrackedRangeStickiness: hG, - WrappingIndent: uG, - InjectedTextCursorStops: Ek, - PositionAffinity: $k, - ShowLightbulbIconMode: oG, + AccessibilitySupport: z5, + ContentWidgetPositionPreference: _5, + CursorChangeReason: Q5, + DefaultEndOfLine: O5, + EditorAutoIndentStrategy: q5, + EditorOption: $5, + EndOfLinePreference: eY, + EndOfLineSequence: tY, + MinimapPosition: uY, + MinimapSectionHeaderStyle: mY, + MouseTargetType: bY, + OverlayWidgetPositionPreference: ZY, + OverviewRulerLane: fY, + GlyphMarginLane: iY, + RenderLineNumbersType: GY, + RenderMinimap: XY, + ScrollbarVisibility: LY, + ScrollType: VY, + TextEditorCursorBlinkingStyle: NY, + TextEditorCursorStyle: wY, + TrackedRangeStickiness: TY, + WrappingIndent: MY, + InjectedTextCursorStops: oY, + PositionAffinity: WY, + ShowLightbulbIconMode: SY, // classes - ConfigurationChangedEvent: OJ, - BareFontInfo: ag, - FontInfo: Q2, - TextModelResolvedOptions: SL, - FindMatch: t1, - ApplyUpdateResult: Wy, - EditorZoom: lr, - createMultiFileDiffEditor: lIe, + ConfigurationChangedEvent: x_, + BareFontInfo: mm, + FontInfo: Zw, + TextModelResolvedOptions: vX, + FindMatch: mW, + ApplyUpdateResult: Ff, + EditorZoom: dl, + createMultiFileDiffEditor: $xe, // vars - EditorType: AC, - EditorOptions: El + EditorType: vG, + EditorOptions: zr }; } -function kIe(s, e) { +function xCe(s, e) { if (!e || !Array.isArray(e)) return !1; for (const t of e) @@ -108115,54 +108115,54 @@ function kIe(s, e) { return !1; return !0; } -function rL(s, e) { +function yX(s, e) { return typeof s == "boolean" ? s : e; } -function KB(s, e) { +function WU(s, e) { return typeof s == "string" ? s : e; } -function GIe(s) { +function CCe(s) { const e = {}; for (const t of s) e[t] = !0; return e; } -function QB(s, e = !1) { +function GU(s, e = !1) { e && (s = s.map(function(i) { return i.toLowerCase(); })); - const t = GIe(s); + const t = CCe(s); return e ? function(i) { return t[i.toLowerCase()] !== void 0 && t.hasOwnProperty(i.toLowerCase()); } : function(i) { return t[i] !== void 0 && t.hasOwnProperty(i); }; } -function xR(s, e, t) { +function Uk(s, e, t) { e = e.replace(/@@/g, ""); let i = 0, n; do - n = !1, e = e.replace(/@(\w+)/g, function(r, l) { + n = !1, e = e.replace(/@(\w+)/g, function(l, r) { n = !0; - let a = ""; - if (typeof s[l] == "string") - a = s[l]; - else if (s[l] && s[l] instanceof RegExp) - a = s[l].source; + let c = ""; + if (typeof s[r] == "string") + c = s[r]; + else if (s[r] && s[r] instanceof RegExp) + c = s[r].source; else - throw s[l] === void 0 ? Ht(s, "language definition does not contain attribute '" + l + "', used at: " + e) : Ht(s, "attribute reference '" + l + "' must be a string, used at: " + e); - return Pu(a) ? "" : "(?:" + a + ")"; + throw s[r] === void 0 ? Pt(s, "language definition does not contain attribute '" + r + "', used at: " + e) : Pt(s, "attribute reference '" + r + "' must be a string, used at: " + e); + return _u(c) ? "" : "(?:" + c + ")"; }), i++; while (n && i < 5); e = e.replace(/\x01/g, "@"); const o = (s.ignoreCase ? "i" : "") + (s.unicode ? "u" : ""); if (t && e.match(/\$[sS](\d\d?)/g)) { - let l = null, a = null; - return (c) => (a && l === c || (l = c, a = new RegExp(E_e(s, e, c), o)), a); + let r = null, c = null; + return (d) => (c && r === d || (r = d, c = new RegExp(Nxe(s, e, d), o)), c); } return new RegExp(e, o); } -function RIe(s, e, t, i) { +function RCe(s, e, t, i) { if (i < 0) return s; if (i < e.length) @@ -108175,73 +108175,73 @@ function RIe(s, e, t, i) { } return null; } -function EIe(s, e, t, i) { - let n = -1, o = t, r = t.match(/^\$(([sS]?)(\d\d?)|#)(.*)$/); - r && (r[3] && (n = parseInt(r[3]), r[2] && (n = n + 100)), o = r[4]); - let l = "~", a = o; - !o || o.length === 0 ? (l = "!=", a = "") : /^\w*$/.test(a) ? l = "==" : (r = o.match(/^(@|!@|~|!~|==|!=)(.*)$/), r && (l = r[1], a = r[2])); - let c; - if ((l === "~" || l === "!~") && /^(\w|\|)*$/.test(a)) { - const d = QB(a.split("|"), s.ignoreCase); - c = function(h) { - return l === "~" ? d(h) : !d(h); +function NCe(s, e, t, i) { + let n = -1, o = t, l = t.match(/^\$(([sS]?)(\d\d?)|#)(.*)$/); + l && (l[3] && (n = parseInt(l[3]), l[2] && (n = n + 100)), o = l[4]); + let r = "~", c = o; + !o || o.length === 0 ? (r = "!=", c = "") : /^\w*$/.test(c) ? r = "==" : (l = o.match(/^(@|!@|~|!~|==|!=)(.*)$/), l && (r = l[1], c = l[2])); + let d; + if ((r === "~" || r === "!~") && /^(\w|\|)*$/.test(c)) { + const a = GU(c.split("|"), s.ignoreCase); + d = function(h) { + return r === "~" ? a(h) : !a(h); }; - } else if (l === "@" || l === "!@") { - const d = s[a]; - if (!d) - throw Ht(s, "the @ match target '" + a + "' is not defined, in rule: " + e); - if (!kIe(function(u) { + } else if (r === "@" || r === "!@") { + const a = s[c]; + if (!a) + throw Pt(s, "the @ match target '" + c + "' is not defined, in rule: " + e); + if (!xCe(function(u) { return typeof u == "string"; - }, d)) - throw Ht(s, "the @ match target '" + a + "' must be an array of strings, in rule: " + e); - const h = QB(d, s.ignoreCase); - c = function(u) { - return l === "@" ? h(u) : !h(u); + }, a)) + throw Pt(s, "the @ match target '" + c + "' must be an array of strings, in rule: " + e); + const h = GU(a, s.ignoreCase); + d = function(u) { + return r === "@" ? h(u) : !h(u); }; - } else if (l === "~" || l === "!~") - if (a.indexOf("$") < 0) { - const d = xR(s, "^" + a + "$", !1); - c = function(h) { - return l === "~" ? d.test(h) : !d.test(h); + } else if (r === "~" || r === "!~") + if (c.indexOf("$") < 0) { + const a = Uk(s, "^" + c + "$", !1); + d = function(h) { + return r === "~" ? a.test(h) : !a.test(h); }; } else - c = function(d, h, u, g) { - return xR(s, "^" + Gd(s, a, h, u, g) + "$", !1).test(d); + d = function(a, h, u, m) { + return Uk(s, "^" + Da(s, c, h, u, m) + "$", !1).test(a); }; - else if (a.indexOf("$") < 0) { - const d = Yc(s, a); - c = function(h) { - return l === "==" ? h === d : h !== d; + else if (c.indexOf("$") < 0) { + const a = Ud(s, c); + d = function(h) { + return r === "==" ? h === a : h !== a; }; } else { - const d = Yc(s, a); - c = function(h, u, g, m, f) { - const b = Gd(s, d, u, g, m); - return l === "==" ? h === b : h !== b; + const a = Ud(s, c); + d = function(h, u, m, b, g) { + const Z = Da(s, a, u, m, b); + return r === "==" ? h === Z : h !== Z; }; } return n === -1 ? { name: t, value: i, - test: function(d, h, u, g) { - return c(d, d, h, u, g); + test: function(a, h, u, m) { + return d(a, a, h, u, m); } } : { name: t, value: i, - test: function(d, h, u, g) { - const m = RIe(d, h, u, n); - return c(m || "", d, h, u, g); + test: function(a, h, u, m) { + const b = RCe(a, h, u, n); + return d(b || "", a, h, u, m); } }; } -function MR(s, e, t) { +function Pk(s, e, t) { if (t) { if (typeof t == "string") return t; if (t.token || t.token === "") { if (typeof t.token != "string") - throw Ht(s, "a 'token' attribute must be of type string, in rule: " + e); + throw Pt(s, "a 'token' attribute must be of type string, in rule: " + e); { const i = { token: t.token }; if (t.token.indexOf("$") >= 0 && (i.tokenSubst = !0), typeof t.bracket == "string") @@ -108250,14 +108250,14 @@ function MR(s, e, t) { else if (t.bracket === "@close") i.bracket = -1; else - throw Ht(s, "a 'bracket' attribute must be either '@open' or '@close', in rule: " + e); + throw Pt(s, "a 'bracket' attribute must be either '@open' or '@close', in rule: " + e); if (t.next) { if (typeof t.next != "string") - throw Ht(s, "the next state must be a string value in rule: " + e); + throw Pt(s, "the next state must be a string value in rule: " + e); { let n = t.next; - if (!/^(@pop|@push|@popall)$/.test(n) && (n[0] === "@" && (n = n.substr(1)), n.indexOf("$") < 0 && !X_e(s, Gd(s, n, "", [], "")))) - throw Ht(s, "the next state '" + t.next + "' is not defined in rule: " + e); + if (!/^(@pop|@push|@popall)$/.test(n) && (n[0] === "@" && (n = n.substr(1)), n.indexOf("$") < 0 && !wxe(s, Da(s, n, "", [], "")))) + throw Pt(s, "the next state '" + t.next + "' is not defined in rule: " + e); i.next = n; } } @@ -108266,31 +108266,31 @@ function MR(s, e, t) { } else if (Array.isArray(t)) { const i = []; for (let n = 0, o = t.length; n < o; n++) - i[n] = MR(s, e, t[n]); + i[n] = Pk(s, e, t[n]); return { group: i }; } else if (t.cases) { const i = []; for (const o in t.cases) if (t.cases.hasOwnProperty(o)) { - const r = MR(s, e, t.cases[o]); - o === "@default" || o === "@" || o === "" ? i.push({ test: void 0, value: r, name: o }) : o === "@eos" ? i.push({ test: function(l, a, c, d) { - return d; - }, value: r, name: o }) : i.push(EIe(s, e, o, r)); + const l = Pk(s, e, t.cases[o]); + o === "@default" || o === "@" || o === "" ? i.push({ test: void 0, value: l, name: o }) : o === "@eos" ? i.push({ test: function(r, c, d, a) { + return a; + }, value: l, name: o }) : i.push(NCe(s, e, o, l)); } const n = s.defaultToken; return { - test: function(o, r, l, a) { - for (const c of i) - if (!c.test || c.test(o, r, l, a)) - return c.value; + test: function(o, l, r, c) { + for (const d of i) + if (!d.test || d.test(o, l, r, c)) + return d.value; return n; } }; } else - throw Ht(s, "an action must be a string, an object with a 'token' or 'cases' attribute, or an array of actions; in rule: " + e); + throw Pt(s, "an action must be a string, an object with a 'token' or 'cases' attribute, or an array of actions; in rule: " + e); } else return { token: "" }; } -class XIe { +class wCe { constructor(e) { this.regex = new RegExp(""), this.action = { token: "" }, this.matchOnlyAtLineStart = !1, this.name = "", this.name = e; } @@ -108301,30 +108301,30 @@ class XIe { else if (t instanceof RegExp) i = t.source; else - throw Ht(e, "rules must start with a match string or regular expression: " + this.name); - this.matchOnlyAtLineStart = i.length > 0 && i[0] === "^", this.name = this.name + ": " + i, this.regex = xR(e, "^(?:" + (this.matchOnlyAtLineStart ? i.substr(1) : i) + ")", !0); + throw Pt(e, "rules must start with a match string or regular expression: " + this.name); + this.matchOnlyAtLineStart = i.length > 0 && i[0] === "^", this.name = this.name + ": " + i, this.regex = Uk(e, "^(?:" + (this.matchOnlyAtLineStart ? i.substr(1) : i) + ")", !0); } setAction(e, t) { - this.action = MR(e, this.name, t); + this.action = Pk(e, this.name, t); } resolveRegex(e) { return this.regex instanceof RegExp ? this.regex : this.regex(e); } } -function c8(s, e) { +function U8(s, e) { if (!e || typeof e != "object") throw new Error("Monarch: expecting a language definition object"); const t = { languageId: s, - includeLF: rL(e.includeLF, !1), + includeLF: yX(e.includeLF, !1), noThrow: !1, // raise exceptions during compilation maxStack: 100, start: typeof e.start == "string" ? e.start : null, - ignoreCase: rL(e.ignoreCase, !1), - unicode: rL(e.unicode, !1), - tokenPostfix: KB(e.tokenPostfix, "." + s), - defaultToken: KB(e.defaultToken, "source"), + ignoreCase: yX(e.ignoreCase, !1), + unicode: yX(e.unicode, !1), + tokenPostfix: WU(e.tokenPostfix, "." + s), + defaultToken: WU(e.defaultToken, "source"), usesEmbedded: !1, // becomes true if we find a nextEmbedded action stateNames: {}, @@ -108332,49 +108332,49 @@ function c8(s, e) { brackets: [] }, i = e; i.languageId = s, i.includeLF = t.includeLF, i.ignoreCase = t.ignoreCase, i.unicode = t.unicode, i.noThrow = t.noThrow, i.usesEmbedded = t.usesEmbedded, i.stateNames = e.tokenizer, i.defaultToken = t.defaultToken; - function n(r, l, a) { - for (const c of a) { - let d = c.include; - if (d) { - if (typeof d != "string") - throw Ht(t, "an 'include' attribute must be a string at: " + r); - if (d[0] === "@" && (d = d.substr(1)), !e.tokenizer[d]) - throw Ht(t, "include target '" + d + "' is not defined at: " + r); - n(r + "." + d, l, e.tokenizer[d]); + function n(l, r, c) { + for (const d of c) { + let a = d.include; + if (a) { + if (typeof a != "string") + throw Pt(t, "an 'include' attribute must be a string at: " + l); + if (a[0] === "@" && (a = a.substr(1)), !e.tokenizer[a]) + throw Pt(t, "include target '" + a + "' is not defined at: " + l); + n(l + "." + a, r, e.tokenizer[a]); } else { - const h = new XIe(r); - if (Array.isArray(c) && c.length >= 1 && c.length <= 3) - if (h.setRegex(i, c[0]), c.length >= 3) - if (typeof c[1] == "string") - h.setAction(i, { token: c[1], next: c[2] }); - else if (typeof c[1] == "object") { - const u = c[1]; - u.next = c[2], h.setAction(i, u); + const h = new wCe(l); + if (Array.isArray(d) && d.length >= 1 && d.length <= 3) + if (h.setRegex(i, d[0]), d.length >= 3) + if (typeof d[1] == "string") + h.setAction(i, { token: d[1], next: d[2] }); + else if (typeof d[1] == "object") { + const u = d[1]; + u.next = d[2], h.setAction(i, u); } else - throw Ht(t, "a next state as the last element of a rule can only be given if the action is either an object or a string, at: " + r); + throw Pt(t, "a next state as the last element of a rule can only be given if the action is either an object or a string, at: " + l); else - h.setAction(i, c[1]); + h.setAction(i, d[1]); else { - if (!c.regex) - throw Ht(t, "a rule must either be an array, or an object with a 'regex' or 'include' field at: " + r); - c.name && typeof c.name == "string" && (h.name = c.name), c.matchOnlyAtStart && (h.matchOnlyAtLineStart = rL(c.matchOnlyAtLineStart, !1)), h.setRegex(i, c.regex), h.setAction(i, c.action); + if (!d.regex) + throw Pt(t, "a rule must either be an array, or an object with a 'regex' or 'include' field at: " + l); + d.name && typeof d.name == "string" && (h.name = d.name), d.matchOnlyAtStart && (h.matchOnlyAtLineStart = yX(d.matchOnlyAtLineStart, !1)), h.setRegex(i, d.regex), h.setAction(i, d.action); } - l.push(h); + r.push(h); } } } if (!e.tokenizer || typeof e.tokenizer != "object") - throw Ht(t, "a language definition must define the 'tokenizer' attribute as an object"); + throw Pt(t, "a language definition must define the 'tokenizer' attribute as an object"); t.tokenizer = []; - for (const r in e.tokenizer) - if (e.tokenizer.hasOwnProperty(r)) { - t.start || (t.start = r); - const l = e.tokenizer[r]; - t.tokenizer[r] = new Array(), n("tokenizer." + r, t.tokenizer[r], l); + for (const l in e.tokenizer) + if (e.tokenizer.hasOwnProperty(l)) { + t.start || (t.start = l); + const r = e.tokenizer[l]; + t.tokenizer[l] = new Array(), n("tokenizer." + l, t.tokenizer[l], r); } if (t.usesEmbedded = i.usesEmbedded, e.brackets) { if (!Array.isArray(e.brackets)) - throw Ht(t, "the 'brackets' attribute must be defined as an array"); + throw Pt(t, "the 'brackets' attribute must be defined as an array"); } else e.brackets = [ { open: "{", close: "}", token: "delimiter.curly" }, @@ -108383,54 +108383,54 @@ function c8(s, e) { { open: "<", close: ">", token: "delimiter.angle" } ]; const o = []; - for (const r of e.brackets) { - let l = r; - if (l && Array.isArray(l) && l.length === 3 && (l = { token: l[2], open: l[0], close: l[1] }), l.open === l.close) - throw Ht(t, "open and close brackets in a 'brackets' attribute must be different: " + l.open + ` + for (const l of e.brackets) { + let r = l; + if (r && Array.isArray(r) && r.length === 3 && (r = { token: r[2], open: r[0], close: r[1] }), r.open === r.close) + throw Pt(t, "open and close brackets in a 'brackets' attribute must be different: " + r.open + ` hint: use the 'bracket' attribute if matching on equal brackets is required.`); - if (typeof l.open == "string" && typeof l.token == "string" && typeof l.close == "string") + if (typeof r.open == "string" && typeof r.token == "string" && typeof r.close == "string") o.push({ - token: l.token + t.tokenPostfix, - open: Yc(t, l.open), - close: Yc(t, l.close) + token: r.token + t.tokenPostfix, + open: Ud(t, r.open), + close: Ud(t, r.close) }); else - throw Ht(t, "every element in the 'brackets' array must be a '{open,close,token}' object or array"); + throw Pt(t, "every element in the 'brackets' array must be a '{open,close,token}' object or array"); } return t.brackets = o, t.noThrow = !0, t; } -function FIe(s) { - cb.registerLanguage(s); +function TCe(s) { + pZ.registerLanguage(s); } -function YIe() { +function MCe() { let s = []; - return s = s.concat(cb.getLanguages()), s; + return s = s.concat(pZ.getLanguages()), s; } -function zIe(s) { - return Ne.get(ri).languageIdCodec.encodeLanguageId(s); +function YCe(s) { + return Re.get(ri).languageIdCodec.encodeLanguageId(s); } -function PIe(s, e) { - return Ne.withServices(() => { - const i = Ne.get(ri).onDidRequestRichLanguageFeatures((n) => { +function kCe(s, e) { + return Re.withServices(() => { + const i = Re.get(ri).onDidRequestRichLanguageFeatures((n) => { n === s && (i.dispose(), e()); }); return i; }); } -function BIe(s, e) { - return Ne.withServices(() => { - const i = Ne.get(ri).onDidRequestBasicLanguageFeatures((n) => { +function vCe(s, e) { + return Re.withServices(() => { + const i = Re.get(ri).onDidRequestBasicLanguageFeatures((n) => { n === s && (i.dispose(), e()); }); return i; }); } -function OIe(s, e) { - if (!Ne.get(ri).isRegisteredLanguageId(s)) +function JCe(s, e) { + if (!Re.get(ri).isRegisteredLanguageId(s)) throw new Error(`Cannot set configuration for unknown language ${s}`); - return Ne.get(li).register(s, e, 100); + return Re.get(ci).register(s, e, 100); } -class HIe { +class HCe { constructor(e, t) { this._languageId = e, this._actual = t; } @@ -108441,15 +108441,15 @@ class HIe { } tokenize(e, t, i) { if (typeof this._actual.tokenize == "function") - return oC.adaptTokenize(this._languageId, this._actual, e, i); + return ZG.adaptTokenize(this._languageId, this._actual, e, i); throw new Error("Not supported!"); } tokenizeEncoded(e, t, i) { const n = this._actual.tokenizeEncoded(e, i); - return new mI(n.tokens, n.endState); + return new Rx(n.tokens, n.endState); } } -class oC { +class ZG { constructor(e, t, i, n) { this._languageId = e, this._actual = t, this._languageService = i, this._standaloneThemeService = n; } @@ -108461,250 +108461,250 @@ class oC { static _toClassicTokens(e, t) { const i = []; let n = 0; - for (let o = 0, r = e.length; o < r; o++) { - const l = e[o]; - let a = l.startIndex; - o === 0 ? a = 0 : a < n && (a = n), i[o] = new jw(a, l.scopes, t), n = a; + for (let o = 0, l = e.length; o < l; o++) { + const r = e[o]; + let c = r.startIndex; + o === 0 ? c = 0 : c < n && (c = n), i[o] = new dW(c, r.scopes, t), n = c; } return i; } static adaptTokenize(e, t, i, n) { - const o = t.tokenize(i, n), r = oC._toClassicTokens(o.tokens, e); - let l; - return o.endState.equals(n) ? l = n : l = o.endState, new QE(r, l); + const o = t.tokenize(i, n), l = ZG._toClassicTokens(o.tokens, e); + let r; + return o.endState.equals(n) ? r = n : r = o.endState, new GJ(l, r); } tokenize(e, t, i) { - return oC.adaptTokenize(this._languageId, this._actual, e, i); + return ZG.adaptTokenize(this._languageId, this._actual, e, i); } _toBinaryTokens(e, t) { const i = e.encodeLanguageId(this._languageId), n = this._standaloneThemeService.getColorTheme().tokenTheme, o = []; - let r = 0, l = 0; - for (let c = 0, d = t.length; c < d; c++) { - const h = t[c], u = n.match(i, h.scopes) | 1024; - if (r > 0 && o[r - 1] === u) + let l = 0, r = 0; + for (let d = 0, a = t.length; d < a; d++) { + const h = t[d], u = n.match(i, h.scopes) | 1024; + if (l > 0 && o[l - 1] === u) continue; - let g = h.startIndex; - c === 0 ? g = 0 : g < l && (g = l), o[r++] = g, o[r++] = u, l = g; + let m = h.startIndex; + d === 0 ? m = 0 : m < r && (m = r), o[l++] = m, o[l++] = u, r = m; } - const a = new Uint32Array(r); - for (let c = 0; c < r; c++) - a[c] = o[c]; - return a; + const c = new Uint32Array(l); + for (let d = 0; d < l; d++) + c[d] = o[d]; + return c; } tokenizeEncoded(e, t, i) { const n = this._actual.tokenize(e, i), o = this._toBinaryTokens(this._languageService.languageIdCodec, n.tokens); - let r; - return n.endState.equals(i) ? r = i : r = n.endState, new mI(o, r); + let l; + return n.endState.equals(i) ? l = i : l = n.endState, new Rx(o, l); } } -function JIe(s) { +function ECe(s) { return typeof s.getInitialState == "function"; } -function UIe(s) { +function DCe(s) { return "tokenizeEncoded" in s; } -function d8(s) { +function P8(s) { return s && typeof s.then == "function"; } -function KIe(s) { - const e = Ne.get(el); +function FCe(s) { + const e = Re.get(nr); if (s) { const t = [null]; for (let i = 1, n = s.length; i < n; i++) - t[i] = K.fromHex(s[i]); + t[i] = Q.fromHex(s[i]); e.setColorMapOverride(t); } else e.setColorMapOverride(null); } -function h8(s, e) { - return UIe(e) ? new HIe(s, e) : new oC(s, e, Ne.get(ri), Ne.get(el)); +function B8(s, e) { + return DCe(e) ? new HCe(s, e) : new ZG(s, e, Re.get(ri), Re.get(nr)); } -function S9(s, e) { - const t = new nre(async () => { +function PE(s, e) { + const t = new Qle(async () => { const i = await Promise.resolve(e.create()); - return i ? JIe(i) ? h8(s, i) : new sC(Ne.get(ri), Ne.get(el), s, c8(s, i), Ne.get(Ke)) : null; + return i ? ECe(i) ? B8(s, i) : new gG(Re.get(ri), Re.get(nr), s, U8(s, i), Re.get(Qe)) : null; }); - return Wi.registerFactory(s, t); + return Ti.registerFactory(s, t); } -function QIe(s, e) { - if (!Ne.get(ri).isRegisteredLanguageId(s)) +function zCe(s, e) { + if (!Re.get(ri).isRegisteredLanguageId(s)) throw new Error(`Cannot set tokens provider for unknown language ${s}`); - return d8(e) ? S9(s, { create: () => e }) : Wi.register(s, h8(s, e)); + return P8(e) ? PE(s, { create: () => e }) : Ti.register(s, B8(s, e)); } -function jIe(s, e) { - const t = (i) => new sC(Ne.get(ri), Ne.get(el), s, c8(s, i), Ne.get(Ke)); - return d8(e) ? S9(s, { create: () => e }) : Wi.register(s, t(e)); +function ACe(s, e) { + const t = (i) => new gG(Re.get(ri), Re.get(nr), s, U8(s, i), Re.get(Qe)); + return P8(e) ? PE(s, { create: () => e }) : Ti.register(s, t(e)); } -function qIe(s, e) { - return Ne.get(ge).referenceProvider.register(s, e); +function KCe(s, e) { + return Re.get(me).referenceProvider.register(s, e); } -function $Ie(s, e) { - return Ne.get(ge).renameProvider.register(s, e); +function UCe(s, e) { + return Re.get(me).renameProvider.register(s, e); } -function eNe(s, e) { - return Ne.get(ge).newSymbolNamesProvider.register(s, e); +function PCe(s, e) { + return Re.get(me).newSymbolNamesProvider.register(s, e); } -function tNe(s, e) { - return Ne.get(ge).signatureHelpProvider.register(s, e); +function BCe(s, e) { + return Re.get(me).signatureHelpProvider.register(s, e); } -function iNe(s, e) { - return Ne.get(ge).hoverProvider.register(s, { - provideHover: async (i, n, o, r) => { - const l = i.getWordAtPosition(n); - return Promise.resolve(e.provideHover(i, n, o, r)).then((a) => { - if (a) - return !a.range && l && (a.range = new M(n.lineNumber, l.startColumn, n.lineNumber, l.endColumn)), a.range || (a.range = new M(n.lineNumber, n.column, n.lineNumber, n.column)), a; +function _Ce(s, e) { + return Re.get(me).hoverProvider.register(s, { + provideHover: async (i, n, o, l) => { + const r = i.getWordAtPosition(n); + return Promise.resolve(e.provideHover(i, n, o, l)).then((c) => { + if (c) + return !c.range && r && (c.range = new I(n.lineNumber, r.startColumn, n.lineNumber, r.endColumn)), c.range || (c.range = new I(n.lineNumber, n.column, n.lineNumber, n.column)), c; }); } }); } -function nNe(s, e) { - return Ne.get(ge).documentSymbolProvider.register(s, e); +function QCe(s, e) { + return Re.get(me).documentSymbolProvider.register(s, e); } -function sNe(s, e) { - return Ne.get(ge).documentHighlightProvider.register(s, e); +function OCe(s, e) { + return Re.get(me).documentHighlightProvider.register(s, e); } -function oNe(s, e) { - return Ne.get(ge).linkedEditingRangeProvider.register(s, e); +function jCe(s, e) { + return Re.get(me).linkedEditingRangeProvider.register(s, e); } -function rNe(s, e) { - return Ne.get(ge).definitionProvider.register(s, e); +function qCe(s, e) { + return Re.get(me).definitionProvider.register(s, e); } -function lNe(s, e) { - return Ne.get(ge).implementationProvider.register(s, e); +function $Ce(s, e) { + return Re.get(me).implementationProvider.register(s, e); } -function aNe(s, e) { - return Ne.get(ge).typeDefinitionProvider.register(s, e); +function eRe(s, e) { + return Re.get(me).typeDefinitionProvider.register(s, e); } -function cNe(s, e) { - return Ne.get(ge).codeLensProvider.register(s, e); +function tRe(s, e) { + return Re.get(me).codeLensProvider.register(s, e); } -function dNe(s, e, t) { - return Ne.get(ge).codeActionProvider.register(s, { +function iRe(s, e, t) { + return Re.get(me).codeActionProvider.register(s, { providedCodeActionKinds: t == null ? void 0 : t.providedCodeActionKinds, documentation: t == null ? void 0 : t.documentation, - provideCodeActions: (n, o, r, l) => { - const c = Ne.get(Ba).read({ resource: n.uri }).filter((d) => M.areIntersectingOrTouching(d, o)); - return e.provideCodeActions(n, o, { markers: c, only: r.only, trigger: r.trigger }, l); + provideCodeActions: (n, o, l, r) => { + const d = Re.get(_c).read({ resource: n.uri }).filter((a) => I.areIntersectingOrTouching(a, o)); + return e.provideCodeActions(n, o, { markers: d, only: l.only, trigger: l.trigger }, r); }, resolveCodeAction: e.resolveCodeAction }); } -function hNe(s, e) { - return Ne.get(ge).documentFormattingEditProvider.register(s, e); +function nRe(s, e) { + return Re.get(me).documentFormattingEditProvider.register(s, e); } -function uNe(s, e) { - return Ne.get(ge).documentRangeFormattingEditProvider.register(s, e); +function sRe(s, e) { + return Re.get(me).documentRangeFormattingEditProvider.register(s, e); } -function gNe(s, e) { - return Ne.get(ge).onTypeFormattingEditProvider.register(s, e); +function oRe(s, e) { + return Re.get(me).onTypeFormattingEditProvider.register(s, e); } -function mNe(s, e) { - return Ne.get(ge).linkProvider.register(s, e); +function lRe(s, e) { + return Re.get(me).linkProvider.register(s, e); } -function pNe(s, e) { - return Ne.get(ge).completionProvider.register(s, e); +function rRe(s, e) { + return Re.get(me).completionProvider.register(s, e); } -function fNe(s, e) { - return Ne.get(ge).colorProvider.register(s, e); +function cRe(s, e) { + return Re.get(me).colorProvider.register(s, e); } -function bNe(s, e) { - return Ne.get(ge).foldingRangeProvider.register(s, e); +function dRe(s, e) { + return Re.get(me).foldingRangeProvider.register(s, e); } -function yNe(s, e) { - return Ne.get(ge).declarationProvider.register(s, e); +function aRe(s, e) { + return Re.get(me).declarationProvider.register(s, e); } -function wNe(s, e) { - return Ne.get(ge).selectionRangeProvider.register(s, e); +function hRe(s, e) { + return Re.get(me).selectionRangeProvider.register(s, e); } -function CNe(s, e) { - return Ne.get(ge).documentSemanticTokensProvider.register(s, e); +function uRe(s, e) { + return Re.get(me).documentSemanticTokensProvider.register(s, e); } -function SNe(s, e) { - return Ne.get(ge).documentRangeSemanticTokensProvider.register(s, e); +function mRe(s, e) { + return Re.get(me).documentRangeSemanticTokensProvider.register(s, e); } -function LNe(s, e) { - return Ne.get(ge).inlineCompletionsProvider.register(s, e); +function bRe(s, e) { + return Re.get(me).inlineCompletionsProvider.register(s, e); } -function ANe(s, e) { - return Ne.get(ge).inlineEditProvider.register(s, e); +function pRe(s, e) { + return Re.get(me).inlineEditProvider.register(s, e); } -function xNe(s, e) { - return Ne.get(ge).inlayHintsProvider.register(s, e); +function gRe(s, e) { + return Re.get(me).inlayHintsProvider.register(s, e); } -function MNe() { +function ZRe() { return { - register: FIe, - getLanguages: YIe, - onLanguage: PIe, - onLanguageEncountered: BIe, - getEncodedLanguageId: zIe, + register: TCe, + getLanguages: MCe, + onLanguage: kCe, + onLanguageEncountered: vCe, + getEncodedLanguageId: YCe, // provider methods - setLanguageConfiguration: OIe, - setColorMap: KIe, - registerTokensProviderFactory: S9, - setTokensProvider: QIe, - setMonarchTokensProvider: jIe, - registerReferenceProvider: qIe, - registerRenameProvider: $Ie, - registerNewSymbolNameProvider: eNe, - registerCompletionItemProvider: pNe, - registerSignatureHelpProvider: tNe, - registerHoverProvider: iNe, - registerDocumentSymbolProvider: nNe, - registerDocumentHighlightProvider: sNe, - registerLinkedEditingRangeProvider: oNe, - registerDefinitionProvider: rNe, - registerImplementationProvider: lNe, - registerTypeDefinitionProvider: aNe, - registerCodeLensProvider: cNe, - registerCodeActionProvider: dNe, - registerDocumentFormattingEditProvider: hNe, - registerDocumentRangeFormattingEditProvider: uNe, - registerOnTypeFormattingEditProvider: gNe, - registerLinkProvider: mNe, - registerColorProvider: fNe, - registerFoldingRangeProvider: bNe, - registerDeclarationProvider: yNe, - registerSelectionRangeProvider: wNe, - registerDocumentSemanticTokensProvider: CNe, - registerDocumentRangeSemanticTokensProvider: SNe, - registerInlineCompletionsProvider: LNe, - registerInlineEditProvider: ANe, - registerInlayHintsProvider: xNe, + setLanguageConfiguration: JCe, + setColorMap: FCe, + registerTokensProviderFactory: PE, + setTokensProvider: zCe, + setMonarchTokensProvider: ACe, + registerReferenceProvider: KCe, + registerRenameProvider: UCe, + registerNewSymbolNameProvider: PCe, + registerCompletionItemProvider: rRe, + registerSignatureHelpProvider: BCe, + registerHoverProvider: _Ce, + registerDocumentSymbolProvider: QCe, + registerDocumentHighlightProvider: OCe, + registerLinkedEditingRangeProvider: jCe, + registerDefinitionProvider: qCe, + registerImplementationProvider: $Ce, + registerTypeDefinitionProvider: eRe, + registerCodeLensProvider: tRe, + registerCodeActionProvider: iRe, + registerDocumentFormattingEditProvider: nRe, + registerDocumentRangeFormattingEditProvider: sRe, + registerOnTypeFormattingEditProvider: oRe, + registerLinkProvider: lRe, + registerColorProvider: cRe, + registerFoldingRangeProvider: dRe, + registerDeclarationProvider: aRe, + registerSelectionRangeProvider: hRe, + registerDocumentSemanticTokensProvider: uRe, + registerDocumentRangeSemanticTokensProvider: mRe, + registerInlineCompletionsProvider: bRe, + registerInlineEditProvider: pRe, + registerInlayHintsProvider: gRe, // enums - DocumentHighlightKind: Wk, - CompletionItemKind: xk, - CompletionItemTag: Mk, - CompletionItemInsertTextRule: Ak, - SymbolKind: lG, - SymbolTag: aG, - IndentAction: Rk, - CompletionTriggerKind: Zk, - SignatureHelpTriggerKind: rG, - InlayHintKind: Xk, - InlineCompletionTriggerKind: Fk, - InlineEditTriggerKind: Yk, - CodeActionTriggerType: Lk, - NewSymbolNameTag: Uk, - NewSymbolNameTriggerKind: Kk, - PartialAcceptTriggerKind: qk, - HoverVerbosityAction: Gk, + DocumentHighlightKind: j5, + CompletionItemKind: U5, + CompletionItemTag: P5, + CompletionItemInsertTextRule: K5, + SymbolKind: CY, + SymbolTag: RY, + IndentAction: sY, + CompletionTriggerKind: B5, + SignatureHelpTriggerKind: xY, + InlayHintKind: lY, + InlineCompletionTriggerKind: rY, + InlineEditTriggerKind: cY, + CodeActionTriggerType: A5, + NewSymbolNameTag: pY, + NewSymbolNameTriggerKind: gY, + PartialAcceptTriggerKind: yY, + HoverVerbosityAction: nY, // classes - FoldingRangeKind: r0, - SelectedSuggestionInfo: DU + FoldingRangeKind: u0, + SelectedSuggestionInfo: pQ }; } -El.wrappingIndent.defaultValue = 0; -El.glyphMargin.defaultValue = !1; -El.autoIndent.defaultValue = 3; -El.overviewRulerLanes.defaultValue = 2; -X1.setFormatterSelector((s, e, t) => Promise.resolve(s[0])); -const Ms = v7(); -Ms.editor = VIe(); -Ms.languages = MNe(); -const ZNe = Ms.CancellationTokenSource, _Ne = Ms.Emitter, INe = Ms.KeyCode, NNe = Ms.KeyMod, WNe = Ms.Position, vNe = Ms.Range, TNe = Ms.Selection, DNe = Ms.SelectionDirection, VNe = Ms.MarkerSeverity, kNe = Ms.MarkerTag, u8 = Ms.Uri, GNe = Ms.Token, xy = Ms.editor, g8 = Ms.languages, c2 = globalThis.MonacoEnvironment; -(c2 != null && c2.globalAPI || typeof define == "function" && define.amd) && (globalThis.monaco = Ms); +zr.wrappingIndent.defaultValue = 0; +zr.glyphMargin.defaultValue = !1; +zr.autoIndent.defaultValue = 3; +zr.overviewRulerLanes.defaultValue = 2; +jW.setFormatterSelector((s, e, t) => Promise.resolve(s[0])); +const xs = m8(); +xs.editor = SCe(); +xs.languages = ZRe(); +const fRe = xs.CancellationTokenSource, yRe = xs.Emitter, WRe = xs.KeyCode, GRe = xs.KeyMod, XRe = xs.Position, VRe = xs.Range, LRe = xs.Selection, IRe = xs.SelectionDirection, SRe = xs.MarkerSeverity, xRe = xs.MarkerTag, _8 = xs.Uri, CRe = xs.Token, Yf = xs.editor, Xy = xs.languages, IN = globalThis.MonacoEnvironment; +(IN != null && IN.globalAPI || typeof define == "function" && define.amd) && (globalThis.monaco = xs); typeof globalThis.require < "u" && typeof globalThis.require.config == "function" && globalThis.require.config({ ignoreDuplicateModules: [ "vscode-languageserver-types", @@ -108720,22 +108720,22 @@ typeof globalThis.require < "u" && typeof globalThis.require.config == "function "vs/basic-languages/typescript/typescript" ] }); -const m8 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +const C0 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - CancellationTokenSource: ZNe, - Emitter: _Ne, - KeyCode: INe, - KeyMod: NNe, - MarkerSeverity: VNe, - MarkerTag: kNe, - Position: WNe, - Range: vNe, - Selection: TNe, - SelectionDirection: DNe, - Token: GNe, - Uri: u8, - editor: xy, - languages: g8 + CancellationTokenSource: fRe, + Emitter: yRe, + KeyCode: WRe, + KeyMod: GRe, + MarkerSeverity: SRe, + MarkerTag: xRe, + Position: XRe, + Range: VRe, + Selection: LRe, + SelectionDirection: IRe, + Token: CRe, + Uri: _8, + editor: Yf, + languages: Xy }, Symbol.toStringTag, { value: "Module" })); /*!----------------------------------------------------------------------------- * Copyright (c) Microsoft Corporation. All rights reserved. @@ -108743,16 +108743,16 @@ const m8 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ * Released under the MIT license * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt *-----------------------------------------------------------------------------*/ -var RNe = Object.defineProperty, ENe = Object.getOwnPropertyDescriptor, XNe = Object.getOwnPropertyNames, FNe = Object.prototype.hasOwnProperty, YNe = (s, e, t, i) => { +var RRe = Object.defineProperty, NRe = Object.getOwnPropertyDescriptor, wRe = Object.getOwnPropertyNames, TRe = Object.prototype.hasOwnProperty, MRe = (s, e, t, i) => { if (e && typeof e == "object" || typeof e == "function") - for (let n of XNe(e)) - !FNe.call(s, n) && n !== t && RNe(s, n, { get: () => e[n], enumerable: !(i = ENe(e, n)) || i.enumerable }); + for (let n of wRe(e)) + !TRe.call(s, n) && n !== t && RRe(s, n, { get: () => e[n], enumerable: !(i = NRe(e, n)) || i.enumerable }); return s; -}, zNe = (s, e, t) => (YNe(s, e, "default"), t), PC = {}; -zNe(PC, m8); -var PNe = class { +}, YRe = (s, e, t) => (MRe(s, e, "default"), t), i1 = {}; +YRe(i1, C0); +var kRe = class { constructor(s, e, t) { - this._onDidChange = new PC.Emitter(), this._languageId = s, this.setDiagnosticsOptions(e), this.setModeConfiguration(t); + this._onDidChange = new i1.Emitter(), this._languageId = s, this.setDiagnosticsOptions(e), this.setModeConfiguration(t); } get onDidChange() { return this._onDidChange.event; @@ -108772,7 +108772,7 @@ var PNe = class { setModeConfiguration(s) { this._modeConfiguration = s || /* @__PURE__ */ Object.create(null), this._onDidChange.fire(this); } -}, BNe = { +}, vRe = { validate: !0, allowComments: !0, schemas: [], @@ -108781,7 +108781,7 @@ var PNe = class { schemaValidation: "warning", comments: "error", trailingCommas: "error" -}, ONe = { +}, JRe = { documentFormattingEdits: !0, documentRangeFormattingEdits: !0, completionItems: !0, @@ -108792,29 +108792,104 @@ var PNe = class { foldingRanges: !0, diagnostics: !0, selectionRanges: !0 -}, p8 = new PNe( +}, Q8 = new kRe( "json", - BNe, - ONe -), HNe = () => f8().then((s) => s.getWorker()); -PC.languages.json = { jsonDefaults: p8, getWorker: HNe }; -function f8() { - return Promise.resolve().then(() => PWe); -} -PC.languages.register({ + vRe, + JRe +), HRe = () => O8().then((s) => s.getWorker()); +i1.languages.json = { jsonDefaults: Q8, getWorker: HRe }; +function O8() { + return Promise.resolve().then(() => Nwe); +} +i1.languages.register({ id: "json", extensions: [".json", ".bowerrc", ".jshintrc", ".jscsrc", ".eslintrc", ".babelrc", ".har"], aliases: ["JSON", "json"], mimetypes: ["application/json"] }); -PC.languages.onLanguage("json", () => { - f8().then((s) => s.setupMode(p8)); +i1.languages.onLanguage("json", () => { + O8().then((s) => s.setupMode(Q8)); }); -const b8 = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBCcyxxcyxVcywkcztjbGFzcyBIc3tjb25zdHJ1Y3Rvcigpe3RoaXMubGlzdGVuZXJzPVtdLHRoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcj1mdW5jdGlvbih0KXtzZXRUaW1lb3V0KCgpPT57dGhyb3cgdC5zdGFjaz9QZS5pc0Vycm9yTm9UZWxlbWV0cnkodCk/bmV3IFBlKHQubWVzc2FnZStgCgpgK3Quc3RhY2spOm5ldyBFcnJvcih0Lm1lc3NhZ2UrYAoKYCt0LnN0YWNrKTp0fSwwKX19ZW1pdCh0KXt0aGlzLmxpc3RlbmVycy5mb3JFYWNoKG49PntuKHQpfSl9b25VbmV4cGVjdGVkRXJyb3IodCl7dGhpcy51bmV4cGVjdGVkRXJyb3JIYW5kbGVyKHQpLHRoaXMuZW1pdCh0KX1vblVuZXhwZWN0ZWRFeHRlcm5hbEVycm9yKHQpe3RoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcih0KX19Y29uc3QgV3M9bmV3IEhzO2Z1bmN0aW9uIEplKGUpe3pzKGUpfHxXcy5vblVuZXhwZWN0ZWRFcnJvcihlKX1mdW5jdGlvbiBSbihlKXtpZihlIGluc3RhbmNlb2YgRXJyb3Ipe2NvbnN0e25hbWU6dCxtZXNzYWdlOm59PWUscj1lLnN0YWNrdHJhY2V8fGUuc3RhY2s7cmV0dXJueyRpc0Vycm9yOiEwLG5hbWU6dCxtZXNzYWdlOm4sc3RhY2s6cixub1RlbGVtZXRyeTpQZS5pc0Vycm9yTm9UZWxlbWV0cnkoZSl9fXJldHVybiBlfWNvbnN0IHF0PSJDYW5jZWxlZCI7ZnVuY3Rpb24genMoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBPcz8hMDplIGluc3RhbmNlb2YgRXJyb3ImJmUubmFtZT09PXF0JiZlLm1lc3NhZ2U9PT1xdH1jbGFzcyBPcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKCl7c3VwZXIocXQpLHRoaXMubmFtZT10aGlzLm1lc3NhZ2V9fWNsYXNzIFBlIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5uYW1lPSJDb2RlRXhwZWN0ZWRFcnJvciJ9c3RhdGljIGZyb21FcnJvcih0KXtpZih0IGluc3RhbmNlb2YgUGUpcmV0dXJuIHQ7Y29uc3Qgbj1uZXcgUGU7cmV0dXJuIG4ubWVzc2FnZT10Lm1lc3NhZ2Usbi5zdGFjaz10LnN0YWNrLG59c3RhdGljIGlzRXJyb3JOb1RlbGVtZXRyeSh0KXtyZXR1cm4gdC5uYW1lPT09IkNvZGVFeHBlY3RlZEVycm9yIn19Y2xhc3MgaWUgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0fHwiQW4gdW5leHBlY3RlZCBidWcgb2NjdXJyZWQuIiksT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsaWUucHJvdG90eXBlKX19ZnVuY3Rpb24gR3MoZSx0KXtjb25zdCBuPXRoaXM7bGV0IHI9ITEscztyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcnx8KHI9ITAscz1lLmFwcGx5KG4sYXJndW1lbnRzKSksc319dmFyIGh0OyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHApe3JldHVybiBwJiZ0eXBlb2YgcD09Im9iamVjdCImJnR5cGVvZiBwW1N5bWJvbC5pdGVyYXRvcl09PSJmdW5jdGlvbiJ9ZS5pcz10O2NvbnN0IG49T2JqZWN0LmZyZWV6ZShbXSk7ZnVuY3Rpb24gcigpe3JldHVybiBufWUuZW1wdHk9cjtmdW5jdGlvbipzKHApe3lpZWxkIHB9ZS5zaW5nbGU9cztmdW5jdGlvbiBpKHApe3JldHVybiB0KHApP3A6cyhwKX1lLndyYXA9aTtmdW5jdGlvbiBvKHApe3JldHVybiBwfHxufWUuZnJvbT1vO2Z1bmN0aW9uKmwocCl7Zm9yKGxldCB4PXAubGVuZ3RoLTE7eD49MDt4LS0peWllbGQgcFt4XX1lLnJldmVyc2U9bDtmdW5jdGlvbiB1KHApe3JldHVybiFwfHxwW1N5bWJvbC5pdGVyYXRvcl0oKS5uZXh0KCkuZG9uZT09PSEwfWUuaXNFbXB0eT11O2Z1bmN0aW9uIGMocCl7cmV0dXJuIHBbU3ltYm9sLml0ZXJhdG9yXSgpLm5leHQoKS52YWx1ZX1lLmZpcnN0PWM7ZnVuY3Rpb24gaChwLHgpe2xldCBMPTA7Zm9yKGNvbnN0IEEgb2YgcClpZih4KEEsTCsrKSlyZXR1cm4hMDtyZXR1cm4hMX1lLnNvbWU9aDtmdW5jdGlvbiBmKHAseCl7Zm9yKGNvbnN0IEwgb2YgcClpZih4KEwpKXJldHVybiBMfWUuZmluZD1mO2Z1bmN0aW9uKmQocCx4KXtmb3IoY29uc3QgTCBvZiBwKXgoTCkmJih5aWVsZCBMKX1lLmZpbHRlcj1kO2Z1bmN0aW9uKm0ocCx4KXtsZXQgTD0wO2Zvcihjb25zdCBBIG9mIHApeWllbGQgeChBLEwrKyl9ZS5tYXA9bTtmdW5jdGlvbipnKHAseCl7bGV0IEw9MDtmb3IoY29uc3QgQSBvZiBwKXlpZWxkKngoQSxMKyspfWUuZmxhdE1hcD1nO2Z1bmN0aW9uKmIoLi4ucCl7Zm9yKGNvbnN0IHggb2YgcCl5aWVsZCp4fWUuY29uY2F0PWI7ZnVuY3Rpb24gXyhwLHgsTCl7bGV0IEE9TDtmb3IoY29uc3QgRSBvZiBwKUE9eChBLEUpO3JldHVybiBBfWUucmVkdWNlPV87ZnVuY3Rpb24qdihwLHgsTD1wLmxlbmd0aCl7Zm9yKHg8MCYmKHgrPXAubGVuZ3RoKSxMPDA/TCs9cC5sZW5ndGg6TD5wLmxlbmd0aCYmKEw9cC5sZW5ndGgpO3g8TDt4KyspeWllbGQgcFt4XX1lLnNsaWNlPXY7ZnVuY3Rpb24gUyhwLHg9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKXtjb25zdCBMPVtdO2lmKHg9PT0wKXJldHVybltMLHBdO2NvbnN0IEE9cFtTeW1ib2wuaXRlcmF0b3JdKCk7Zm9yKGxldCBFPTA7RTx4O0UrKyl7Y29uc3QgQj1BLm5leHQoKTtpZihCLmRvbmUpcmV0dXJuW0wsZS5lbXB0eSgpXTtMLnB1c2goQi52YWx1ZSl9cmV0dXJuW0wse1tTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIEF9fV19ZS5jb25zdW1lPVM7YXN5bmMgZnVuY3Rpb24gTihwKXtjb25zdCB4PVtdO2ZvciBhd2FpdChjb25zdCBMIG9mIHApeC5wdXNoKEwpO3JldHVybiBQcm9taXNlLnJlc29sdmUoeCl9ZS5hc3luY1RvQXJyYXk9Tn0pKGh0fHwoaHQ9e30pKTtmdW5jdGlvbiBNMShlKXtyZXR1cm4gZX1mdW5jdGlvbiBrMShlLHQpe31mdW5jdGlvbiB5bihlKXtpZihodC5pcyhlKSl7Y29uc3QgdD1bXTtmb3IoY29uc3QgbiBvZiBlKWlmKG4pdHJ5e24uZGlzcG9zZSgpfWNhdGNoKHIpe3QucHVzaChyKX1pZih0Lmxlbmd0aD09PTEpdGhyb3cgdFswXTtpZih0Lmxlbmd0aD4xKXRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcih0LCJFbmNvdW50ZXJlZCBlcnJvcnMgd2hpbGUgZGlzcG9zaW5nIG9mIHN0b3JlIik7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/W106ZX1lbHNlIGlmKGUpcmV0dXJuIGUuZGlzcG9zZSgpLGV9ZnVuY3Rpb24ganMoLi4uZSl7cmV0dXJuIGZ0KCgpPT55bihlKSl9ZnVuY3Rpb24gZnQoZSl7cmV0dXJue2Rpc3Bvc2U6R3MoKCk9PntlKCl9KX19Y29uc3Qga3Q9Y2xhc3Mga3R7Y29uc3RydWN0b3IoKXt0aGlzLl90b0Rpc3Bvc2U9bmV3IFNldCx0aGlzLl9pc0Rpc3Bvc2VkPSExfWRpc3Bvc2UoKXt0aGlzLl9pc0Rpc3Bvc2VkfHwodGhpcy5faXNEaXNwb3NlZD0hMCx0aGlzLmNsZWFyKCkpfWdldCBpc0Rpc3Bvc2VkKCl7cmV0dXJuIHRoaXMuX2lzRGlzcG9zZWR9Y2xlYXIoKXtpZih0aGlzLl90b0Rpc3Bvc2Uuc2l6ZSE9PTApdHJ5e3luKHRoaXMuX3RvRGlzcG9zZSl9ZmluYWxseXt0aGlzLl90b0Rpc3Bvc2UuY2xlYXIoKX19YWRkKHQpe2lmKCF0KXJldHVybiB0O2lmKHQ9PT10aGlzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIGEgZGlzcG9zYWJsZSBvbiBpdHNlbGYhIik7cmV0dXJuIHRoaXMuX2lzRGlzcG9zZWQ/a3QuRElTQUJMRV9ESVNQT1NFRF9XQVJOSU5HfHxjb25zb2xlLndhcm4obmV3IEVycm9yKCJUcnlpbmcgdG8gYWRkIGEgZGlzcG9zYWJsZSB0byBhIERpc3Bvc2FibGVTdG9yZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQgb2YuIFRoZSBhZGRlZCBvYmplY3Qgd2lsbCBiZSBsZWFrZWQhIikuc3RhY2spOnRoaXMuX3RvRGlzcG9zZS5hZGQodCksdH1kZWxldGVBbmRMZWFrKHQpe3QmJnRoaXMuX3RvRGlzcG9zZS5oYXModCkmJnRoaXMuX3RvRGlzcG9zZS5kZWxldGUodCl9fTtrdC5ESVNBQkxFX0RJU1BPU0VEX1dBUk5JTkc9ITE7bGV0IFplPWt0O2NvbnN0IEFuPWNsYXNzIEFue2NvbnN0cnVjdG9yKCl7dGhpcy5fc3RvcmU9bmV3IFplLHRoaXMuX3N0b3JlfWRpc3Bvc2UoKXt0aGlzLl9zdG9yZS5kaXNwb3NlKCl9X3JlZ2lzdGVyKHQpe2lmKHQ9PT10aGlzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIGEgZGlzcG9zYWJsZSBvbiBpdHNlbGYhIik7cmV0dXJuIHRoaXMuX3N0b3JlLmFkZCh0KX19O0FuLk5vbmU9T2JqZWN0LmZyZWV6ZSh7ZGlzcG9zZSgpe319KTtsZXQgRmU9QW47Y29uc3QgT2U9Y2xhc3MgT2V7Y29uc3RydWN0b3IodCl7dGhpcy5lbGVtZW50PXQsdGhpcy5uZXh0PU9lLlVuZGVmaW5lZCx0aGlzLnByZXY9T2UuVW5kZWZpbmVkfX07T2UuVW5kZWZpbmVkPW5ldyBPZSh2b2lkIDApO2xldCBPPU9lO2NsYXNzIFhze2NvbnN0cnVjdG9yKCl7dGhpcy5fZmlyc3Q9Ty5VbmRlZmluZWQsdGhpcy5fbGFzdD1PLlVuZGVmaW5lZCx0aGlzLl9zaXplPTB9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5fc2l6ZX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMuX2ZpcnN0PT09Ty5VbmRlZmluZWR9Y2xlYXIoKXtsZXQgdD10aGlzLl9maXJzdDtmb3IoO3QhPT1PLlVuZGVmaW5lZDspe2NvbnN0IG49dC5uZXh0O3QucHJldj1PLlVuZGVmaW5lZCx0Lm5leHQ9Ty5VbmRlZmluZWQsdD1ufXRoaXMuX2ZpcnN0PU8uVW5kZWZpbmVkLHRoaXMuX2xhc3Q9Ty5VbmRlZmluZWQsdGhpcy5fc2l6ZT0wfXVuc2hpZnQodCl7cmV0dXJuIHRoaXMuX2luc2VydCh0LCExKX1wdXNoKHQpe3JldHVybiB0aGlzLl9pbnNlcnQodCwhMCl9X2luc2VydCh0LG4pe2NvbnN0IHI9bmV3IE8odCk7aWYodGhpcy5fZmlyc3Q9PT1PLlVuZGVmaW5lZCl0aGlzLl9maXJzdD1yLHRoaXMuX2xhc3Q9cjtlbHNlIGlmKG4pe2NvbnN0IGk9dGhpcy5fbGFzdDt0aGlzLl9sYXN0PXIsci5wcmV2PWksaS5uZXh0PXJ9ZWxzZXtjb25zdCBpPXRoaXMuX2ZpcnN0O3RoaXMuX2ZpcnN0PXIsci5uZXh0PWksaS5wcmV2PXJ9dGhpcy5fc2l6ZSs9MTtsZXQgcz0hMTtyZXR1cm4oKT0+e3N8fChzPSEwLHRoaXMuX3JlbW92ZShyKSl9fXNoaWZ0KCl7aWYodGhpcy5fZmlyc3QhPT1PLlVuZGVmaW5lZCl7Y29uc3QgdD10aGlzLl9maXJzdC5lbGVtZW50O3JldHVybiB0aGlzLl9yZW1vdmUodGhpcy5fZmlyc3QpLHR9fXBvcCgpe2lmKHRoaXMuX2xhc3QhPT1PLlVuZGVmaW5lZCl7Y29uc3QgdD10aGlzLl9sYXN0LmVsZW1lbnQ7cmV0dXJuIHRoaXMuX3JlbW92ZSh0aGlzLl9sYXN0KSx0fX1fcmVtb3ZlKHQpe2lmKHQucHJldiE9PU8uVW5kZWZpbmVkJiZ0Lm5leHQhPT1PLlVuZGVmaW5lZCl7Y29uc3Qgbj10LnByZXY7bi5uZXh0PXQubmV4dCx0Lm5leHQucHJldj1ufWVsc2UgdC5wcmV2PT09Ty5VbmRlZmluZWQmJnQubmV4dD09PU8uVW5kZWZpbmVkPyh0aGlzLl9maXJzdD1PLlVuZGVmaW5lZCx0aGlzLl9sYXN0PU8uVW5kZWZpbmVkKTp0Lm5leHQ9PT1PLlVuZGVmaW5lZD8odGhpcy5fbGFzdD10aGlzLl9sYXN0LnByZXYsdGhpcy5fbGFzdC5uZXh0PU8uVW5kZWZpbmVkKTp0LnByZXY9PT1PLlVuZGVmaW5lZCYmKHRoaXMuX2ZpcnN0PXRoaXMuX2ZpcnN0Lm5leHQsdGhpcy5fZmlyc3QucHJldj1PLlVuZGVmaW5lZCk7dGhpcy5fc2l6ZS09MX0qW1N5bWJvbC5pdGVyYXRvcl0oKXtsZXQgdD10aGlzLl9maXJzdDtmb3IoO3QhPT1PLlVuZGVmaW5lZDspeWllbGQgdC5lbGVtZW50LHQ9dC5uZXh0fX1jb25zdCBRcz1nbG9iYWxUaGlzLnBlcmZvcm1hbmNlJiZ0eXBlb2YgZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZS5ub3c9PSJmdW5jdGlvbiI7Y2xhc3MgZHR7c3RhdGljIGNyZWF0ZSh0KXtyZXR1cm4gbmV3IGR0KHQpfWNvbnN0cnVjdG9yKHQpe3RoaXMuX25vdz1RcyYmdD09PSExP0RhdGUubm93Omdsb2JhbFRoaXMucGVyZm9ybWFuY2Uubm93LmJpbmQoZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZSksdGhpcy5fc3RhcnRUaW1lPXRoaXMuX25vdygpLHRoaXMuX3N0b3BUaW1lPS0xfXN0b3AoKXt0aGlzLl9zdG9wVGltZT10aGlzLl9ub3coKX1yZXNldCgpe3RoaXMuX3N0YXJ0VGltZT10aGlzLl9ub3coKSx0aGlzLl9zdG9wVGltZT0tMX1lbGFwc2VkKCl7cmV0dXJuIHRoaXMuX3N0b3BUaW1lIT09LTE/dGhpcy5fc3RvcFRpbWUtdGhpcy5fc3RhcnRUaW1lOnRoaXMuX25vdygpLXRoaXMuX3N0YXJ0VGltZX19dmFyIG10OyhmdW5jdGlvbihlKXtlLk5vbmU9KCk9PkZlLk5vbmU7ZnVuY3Rpb24gdChDLHcpe3JldHVybiBkKEMsKCk9Pnt9LDAsdm9pZCAwLCEwLHZvaWQgMCx3KX1lLmRlZmVyPXQ7ZnVuY3Rpb24gbihDKXtyZXR1cm4odyx5PW51bGwsUik9PntsZXQgUD0hMSxJO3JldHVybiBJPUMoVT0+e2lmKCFQKXJldHVybiBJP0kuZGlzcG9zZSgpOlA9ITAsdy5jYWxsKHksVSl9LG51bGwsUiksUCYmSS5kaXNwb3NlKCksSX19ZS5vbmNlPW47ZnVuY3Rpb24gcihDLHcpe3JldHVybiBlLm9uY2UoZS5maWx0ZXIoQyx3KSl9ZS5vbmNlSWY9cjtmdW5jdGlvbiBzKEMsdyx5KXtyZXR1cm4gaCgoUixQPW51bGwsSSk9PkMoVT0+Ui5jYWxsKFAsdyhVKSksbnVsbCxJKSx5KX1lLm1hcD1zO2Z1bmN0aW9uIGkoQyx3LHkpe3JldHVybiBoKChSLFA9bnVsbCxJKT0+QyhVPT57dyhVKSxSLmNhbGwoUCxVKX0sbnVsbCxJKSx5KX1lLmZvckVhY2g9aTtmdW5jdGlvbiBvKEMsdyx5KXtyZXR1cm4gaCgoUixQPW51bGwsSSk9PkMoVT0+dyhVKSYmUi5jYWxsKFAsVSksbnVsbCxJKSx5KX1lLmZpbHRlcj1vO2Z1bmN0aW9uIGwoQyl7cmV0dXJuIEN9ZS5zaWduYWw9bDtmdW5jdGlvbiB1KC4uLkMpe3JldHVybih3LHk9bnVsbCxSKT0+e2NvbnN0IFA9anMoLi4uQy5tYXAoST0+SShVPT53LmNhbGwoeSxVKSkpKTtyZXR1cm4gZihQLFIpfX1lLmFueT11O2Z1bmN0aW9uIGMoQyx3LHksUil7bGV0IFA9eTtyZXR1cm4gcyhDLEk9PihQPXcoUCxJKSxQKSxSKX1lLnJlZHVjZT1jO2Z1bmN0aW9uIGgoQyx3KXtsZXQgeTtjb25zdCBSPXtvbldpbGxBZGRGaXJzdExpc3RlbmVyKCl7eT1DKFAuZmlyZSxQKX0sb25EaWRSZW1vdmVMYXN0TGlzdGVuZXIoKXt5PT1udWxsfHx5LmRpc3Bvc2UoKX19LFA9bmV3IG9lKFIpO3JldHVybiB3PT1udWxsfHx3LmFkZChQKSxQLmV2ZW50fWZ1bmN0aW9uIGYoQyx3KXtyZXR1cm4gdyBpbnN0YW5jZW9mIEFycmF5P3cucHVzaChDKTp3JiZ3LmFkZChDKSxDfWZ1bmN0aW9uIGQoQyx3LHk9MTAwLFI9ITEsUD0hMSxJLFUpe2xldCBKLHRlLFllLFZ0PTAsa2U7Y29uc3QgUjE9e2xlYWtXYXJuaW5nVGhyZXNob2xkOkksb25XaWxsQWRkRmlyc3RMaXN0ZW5lcigpe0o9Qyh5MT0+e1Z0KyssdGU9dyh0ZSx5MSksUiYmIVllJiYoQnQuZmlyZSh0ZSksdGU9dm9pZCAwKSxrZT0oKT0+e2NvbnN0IEUxPXRlO3RlPXZvaWQgMCxZZT12b2lkIDAsKCFSfHxWdD4xKSYmQnQuZmlyZShFMSksVnQ9MH0sdHlwZW9mIHk9PSJudW1iZXIiPyhjbGVhclRpbWVvdXQoWWUpLFllPXNldFRpbWVvdXQoa2UseSkpOlllPT09dm9pZCAwJiYoWWU9MCxxdWV1ZU1pY3JvdGFzayhrZSkpfSl9LG9uV2lsbFJlbW92ZUxpc3RlbmVyKCl7UCYmVnQ+MCYmKGtlPT1udWxsfHxrZSgpKX0sb25EaWRSZW1vdmVMYXN0TGlzdGVuZXIoKXtrZT12b2lkIDAsSi5kaXNwb3NlKCl9fSxCdD1uZXcgb2UoUjEpO3JldHVybiBVPT1udWxsfHxVLmFkZChCdCksQnQuZXZlbnR9ZS5kZWJvdW5jZT1kO2Z1bmN0aW9uIG0oQyx3PTAseSl7cmV0dXJuIGUuZGVib3VuY2UoQywoUixQKT0+Uj8oUi5wdXNoKFApLFIpOltQXSx3LHZvaWQgMCwhMCx2b2lkIDAseSl9ZS5hY2N1bXVsYXRlPW07ZnVuY3Rpb24gZyhDLHc9KFIsUCk9PlI9PT1QLHkpe2xldCBSPSEwLFA7cmV0dXJuIG8oQyxJPT57Y29uc3QgVT1SfHwhdyhJLFApO3JldHVybiBSPSExLFA9SSxVfSx5KX1lLmxhdGNoPWc7ZnVuY3Rpb24gYihDLHcseSl7cmV0dXJuW2UuZmlsdGVyKEMsdyx5KSxlLmZpbHRlcihDLFI9PiF3KFIpLHkpXX1lLnNwbGl0PWI7ZnVuY3Rpb24gXyhDLHc9ITEseT1bXSxSKXtsZXQgUD15LnNsaWNlKCksST1DKHRlPT57UD9QLnB1c2godGUpOkouZmlyZSh0ZSl9KTtSJiZSLmFkZChJKTtjb25zdCBVPSgpPT57UD09bnVsbHx8UC5mb3JFYWNoKHRlPT5KLmZpcmUodGUpKSxQPW51bGx9LEo9bmV3IG9lKHtvbldpbGxBZGRGaXJzdExpc3RlbmVyKCl7SXx8KEk9Qyh0ZT0+Si5maXJlKHRlKSksUiYmUi5hZGQoSSkpfSxvbkRpZEFkZEZpcnN0TGlzdGVuZXIoKXtQJiYodz9zZXRUaW1lb3V0KFUpOlUoKSl9LG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyKCl7SSYmSS5kaXNwb3NlKCksST1udWxsfX0pO3JldHVybiBSJiZSLmFkZChKKSxKLmV2ZW50fWUuYnVmZmVyPV87ZnVuY3Rpb24gdihDLHcpe3JldHVybihSLFAsSSk9Pntjb25zdCBVPXcobmV3IE4pO3JldHVybiBDKGZ1bmN0aW9uKEope2NvbnN0IHRlPVUuZXZhbHVhdGUoSik7dGUhPT1TJiZSLmNhbGwoUCx0ZSl9LHZvaWQgMCxJKX19ZS5jaGFpbj12O2NvbnN0IFM9U3ltYm9sKCJIYWx0Q2hhaW5hYmxlIik7Y2xhc3MgTntjb25zdHJ1Y3Rvcigpe3RoaXMuc3RlcHM9W119bWFwKHcpe3JldHVybiB0aGlzLnN0ZXBzLnB1c2godyksdGhpc31mb3JFYWNoKHcpe3JldHVybiB0aGlzLnN0ZXBzLnB1c2goeT0+KHcoeSkseSkpLHRoaXN9ZmlsdGVyKHcpe3JldHVybiB0aGlzLnN0ZXBzLnB1c2goeT0+dyh5KT95OlMpLHRoaXN9cmVkdWNlKHcseSl7bGV0IFI9eTtyZXR1cm4gdGhpcy5zdGVwcy5wdXNoKFA9PihSPXcoUixQKSxSKSksdGhpc31sYXRjaCh3PSh5LFIpPT55PT09Uil7bGV0IHk9ITAsUjtyZXR1cm4gdGhpcy5zdGVwcy5wdXNoKFA9Pntjb25zdCBJPXl8fCF3KFAsUik7cmV0dXJuIHk9ITEsUj1QLEk/UDpTfSksdGhpc31ldmFsdWF0ZSh3KXtmb3IoY29uc3QgeSBvZiB0aGlzLnN0ZXBzKWlmKHc9eSh3KSx3PT09UylicmVhaztyZXR1cm4gd319ZnVuY3Rpb24gcChDLHcseT1SPT5SKXtjb25zdCBSPSguLi5KKT0+VS5maXJlKHkoLi4uSikpLFA9KCk9PkMub24odyxSKSxJPSgpPT5DLnJlbW92ZUxpc3RlbmVyKHcsUiksVT1uZXcgb2Uoe29uV2lsbEFkZEZpcnN0TGlzdGVuZXI6UCxvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcjpJfSk7cmV0dXJuIFUuZXZlbnR9ZS5mcm9tTm9kZUV2ZW50RW1pdHRlcj1wO2Z1bmN0aW9uIHgoQyx3LHk9Uj0+Uil7Y29uc3QgUj0oLi4uSik9PlUuZmlyZSh5KC4uLkopKSxQPSgpPT5DLmFkZEV2ZW50TGlzdGVuZXIodyxSKSxJPSgpPT5DLnJlbW92ZUV2ZW50TGlzdGVuZXIodyxSKSxVPW5ldyBvZSh7b25XaWxsQWRkRmlyc3RMaXN0ZW5lcjpQLG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyOkl9KTtyZXR1cm4gVS5ldmVudH1lLmZyb21ET01FdmVudEVtaXR0ZXI9eDtmdW5jdGlvbiBMKEMpe3JldHVybiBuZXcgUHJvbWlzZSh3PT5uKEMpKHcpKX1lLnRvUHJvbWlzZT1MO2Z1bmN0aW9uIEEoQyl7Y29uc3Qgdz1uZXcgb2U7cmV0dXJuIEMudGhlbih5PT57dy5maXJlKHkpfSwoKT0+e3cuZmlyZSh2b2lkIDApfSkuZmluYWxseSgoKT0+e3cuZGlzcG9zZSgpfSksdy5ldmVudH1lLmZyb21Qcm9taXNlPUE7ZnVuY3Rpb24gRShDLHcpe3JldHVybiBDKHk9PncuZmlyZSh5KSl9ZS5mb3J3YXJkPUU7ZnVuY3Rpb24gQihDLHcseSl7cmV0dXJuIHcoeSksQyhSPT53KFIpKX1lLnJ1bkFuZFN1YnNjcmliZT1CO2NsYXNzIFF7Y29uc3RydWN0b3Iodyx5KXt0aGlzLl9vYnNlcnZhYmxlPXcsdGhpcy5fY291bnRlcj0wLHRoaXMuX2hhc0NoYW5nZWQ9ITE7Y29uc3QgUj17b25XaWxsQWRkRmlyc3RMaXN0ZW5lcjooKT0+e3cuYWRkT2JzZXJ2ZXIodGhpcyksdGhpcy5fb2JzZXJ2YWJsZS5yZXBvcnRDaGFuZ2VzKCl9LG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyOigpPT57dy5yZW1vdmVPYnNlcnZlcih0aGlzKX19O3RoaXMuZW1pdHRlcj1uZXcgb2UoUikseSYmeS5hZGQodGhpcy5lbWl0dGVyKX1iZWdpblVwZGF0ZSh3KXt0aGlzLl9jb3VudGVyKyt9aGFuZGxlUG9zc2libGVDaGFuZ2Uodyl7fWhhbmRsZUNoYW5nZSh3LHkpe3RoaXMuX2hhc0NoYW5nZWQ9ITB9ZW5kVXBkYXRlKHcpe3RoaXMuX2NvdW50ZXItLSx0aGlzLl9jb3VudGVyPT09MCYmKHRoaXMuX29ic2VydmFibGUucmVwb3J0Q2hhbmdlcygpLHRoaXMuX2hhc0NoYW5nZWQmJih0aGlzLl9oYXNDaGFuZ2VkPSExLHRoaXMuZW1pdHRlci5maXJlKHRoaXMuX29ic2VydmFibGUuZ2V0KCkpKSl9fWZ1bmN0aW9uIHEoQyx3KXtyZXR1cm4gbmV3IFEoQyx3KS5lbWl0dGVyLmV2ZW50fWUuZnJvbU9ic2VydmFibGU9cTtmdW5jdGlvbiBGKEMpe3JldHVybih3LHksUik9PntsZXQgUD0wLEk9ITE7Y29uc3QgVT17YmVnaW5VcGRhdGUoKXtQKyt9LGVuZFVwZGF0ZSgpe1AtLSxQPT09MCYmKEMucmVwb3J0Q2hhbmdlcygpLEkmJihJPSExLHcuY2FsbCh5KSkpfSxoYW5kbGVQb3NzaWJsZUNoYW5nZSgpe30saGFuZGxlQ2hhbmdlKCl7ST0hMH19O0MuYWRkT2JzZXJ2ZXIoVSksQy5yZXBvcnRDaGFuZ2VzKCk7Y29uc3QgSj17ZGlzcG9zZSgpe0MucmVtb3ZlT2JzZXJ2ZXIoVSl9fTtyZXR1cm4gUiBpbnN0YW5jZW9mIFplP1IuYWRkKEopOkFycmF5LmlzQXJyYXkoUikmJlIucHVzaChKKSxKfX1lLmZyb21PYnNlcnZhYmxlTGlnaHQ9Rn0pKG10fHwobXQ9e30pKTtjb25zdCBHZT1jbGFzcyBHZXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmxpc3RlbmVyQ291bnQ9MCx0aGlzLmludm9jYXRpb25Db3VudD0wLHRoaXMuZWxhcHNlZE92ZXJhbGw9MCx0aGlzLmR1cmF0aW9ucz1bXSx0aGlzLm5hbWU9YCR7dH1fJHtHZS5faWRQb29sKyt9YCxHZS5hbGwuYWRkKHRoaXMpfXN0YXJ0KHQpe3RoaXMuX3N0b3BXYXRjaD1uZXcgZHQsdGhpcy5saXN0ZW5lckNvdW50PXR9c3RvcCgpe2lmKHRoaXMuX3N0b3BXYXRjaCl7Y29uc3QgdD10aGlzLl9zdG9wV2F0Y2guZWxhcHNlZCgpO3RoaXMuZHVyYXRpb25zLnB1c2godCksdGhpcy5lbGFwc2VkT3ZlcmFsbCs9dCx0aGlzLmludm9jYXRpb25Db3VudCs9MSx0aGlzLl9zdG9wV2F0Y2g9dm9pZCAwfX19O0dlLmFsbD1uZXcgU2V0LEdlLl9pZFBvb2w9MDtsZXQgVXQ9R2UsWXM9LTE7Y29uc3QgUHQ9Y2xhc3MgUHR7Y29uc3RydWN0b3IodCxuLHI9KFB0Ll9pZFBvb2wrKykudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDMsIjAiKSl7dGhpcy5fZXJyb3JIYW5kbGVyPXQsdGhpcy50aHJlc2hvbGQ9bix0aGlzLm5hbWU9cix0aGlzLl93YXJuQ291bnRkb3duPTB9ZGlzcG9zZSgpe3ZhciB0Oyh0PXRoaXMuX3N0YWNrcyk9PW51bGx8fHQuY2xlYXIoKX1jaGVjayh0LG4pe2NvbnN0IHI9dGhpcy50aHJlc2hvbGQ7aWYocjw9MHx8bjxyKXJldHVybjt0aGlzLl9zdGFja3N8fCh0aGlzLl9zdGFja3M9bmV3IE1hcCk7Y29uc3Qgcz10aGlzLl9zdGFja3MuZ2V0KHQudmFsdWUpfHwwO2lmKHRoaXMuX3N0YWNrcy5zZXQodC52YWx1ZSxzKzEpLHRoaXMuX3dhcm5Db3VudGRvd24tPTEsdGhpcy5fd2FybkNvdW50ZG93bjw9MCl7dGhpcy5fd2FybkNvdW50ZG93bj1yKi41O2NvbnN0W2ksb109dGhpcy5nZXRNb3N0RnJlcXVlbnRTdGFjaygpLGw9YFske3RoaXMubmFtZX1dIHBvdGVudGlhbCBsaXN0ZW5lciBMRUFLIGRldGVjdGVkLCBoYXZpbmcgJHtufSBsaXN0ZW5lcnMgYWxyZWFkeS4gTU9TVCBmcmVxdWVudCBsaXN0ZW5lciAoJHtvfSk6YDtjb25zb2xlLndhcm4obCksY29uc29sZS53YXJuKGkpO2NvbnN0IHU9bmV3IEpzKGwsaSk7dGhpcy5fZXJyb3JIYW5kbGVyKHUpfXJldHVybigpPT57Y29uc3QgaT10aGlzLl9zdGFja3MuZ2V0KHQudmFsdWUpfHwwO3RoaXMuX3N0YWNrcy5zZXQodC52YWx1ZSxpLTEpfX1nZXRNb3N0RnJlcXVlbnRTdGFjaygpe2lmKCF0aGlzLl9zdGFja3MpcmV0dXJuO2xldCB0LG49MDtmb3IoY29uc3RbcixzXW9mIHRoaXMuX3N0YWNrcykoIXR8fG48cykmJih0PVtyLHNdLG49cyk7cmV0dXJuIHR9fTtQdC5faWRQb29sPTE7bGV0ICR0PVB0O2NsYXNzIEh0e3N0YXRpYyBjcmVhdGUoKXtjb25zdCB0PW5ldyBFcnJvcjtyZXR1cm4gbmV3IEh0KHQuc3RhY2s/PyIiKX1jb25zdHJ1Y3Rvcih0KXt0aGlzLnZhbHVlPXR9cHJpbnQoKXtjb25zb2xlLndhcm4odGhpcy52YWx1ZS5zcGxpdChgCmApLnNsaWNlKDIpLmpvaW4oYApgKSl9fWNsYXNzIEpzIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxuKXtzdXBlcih0KSx0aGlzLm5hbWU9Ikxpc3RlbmVyTGVha0Vycm9yIix0aGlzLnN0YWNrPW59fWNsYXNzIFpzIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxuKXtzdXBlcih0KSx0aGlzLm5hbWU9Ikxpc3RlbmVyUmVmdXNhbEVycm9yIix0aGlzLnN0YWNrPW59fWNsYXNzIFd0e2NvbnN0cnVjdG9yKHQpe3RoaXMudmFsdWU9dH19Y29uc3QgS3M9MjtjbGFzcyBvZXtjb25zdHJ1Y3Rvcih0KXt2YXIgbixyLHMsaTt0aGlzLl9zaXplPTAsdGhpcy5fb3B0aW9ucz10LHRoaXMuX2xlYWthZ2VNb249KG49dGhpcy5fb3B0aW9ucykhPW51bGwmJm4ubGVha1dhcm5pbmdUaHJlc2hvbGQ/bmV3ICR0KCh0PT1udWxsP3ZvaWQgMDp0Lm9uTGlzdGVuZXJFcnJvcik/P0plLCgocj10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6ci5sZWFrV2FybmluZ1RocmVzaG9sZCk/P1lzKTp2b2lkIDAsdGhpcy5fcGVyZk1vbj0ocz10aGlzLl9vcHRpb25zKSE9bnVsbCYmcy5fcHJvZk5hbWU/bmV3IFV0KHRoaXMuX29wdGlvbnMuX3Byb2ZOYW1lKTp2b2lkIDAsdGhpcy5fZGVsaXZlcnlRdWV1ZT0oaT10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6aS5kZWxpdmVyeVF1ZXVlfWRpc3Bvc2UoKXt2YXIgdCxuLHIsczt0aGlzLl9kaXNwb3NlZHx8KHRoaXMuX2Rpc3Bvc2VkPSEwLCgodD10aGlzLl9kZWxpdmVyeVF1ZXVlKT09bnVsbD92b2lkIDA6dC5jdXJyZW50KT09PXRoaXMmJnRoaXMuX2RlbGl2ZXJ5UXVldWUucmVzZXQoKSx0aGlzLl9saXN0ZW5lcnMmJih0aGlzLl9saXN0ZW5lcnM9dm9pZCAwLHRoaXMuX3NpemU9MCksKHI9KG49dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOm4ub25EaWRSZW1vdmVMYXN0TGlzdGVuZXIpPT1udWxsfHxyLmNhbGwobiksKHM9dGhpcy5fbGVha2FnZU1vbik9PW51bGx8fHMuZGlzcG9zZSgpKX1nZXQgZXZlbnQoKXtyZXR1cm4gdGhpcy5fZXZlbnQ/Pyh0aGlzLl9ldmVudD0odCxuLHIpPT57dmFyIGwsdSxjLGgsZjtpZih0aGlzLl9sZWFrYWdlTW9uJiZ0aGlzLl9zaXplPnRoaXMuX2xlYWthZ2VNb24udGhyZXNob2xkKioyKXtjb25zdCBkPWBbJHt0aGlzLl9sZWFrYWdlTW9uLm5hbWV9XSBSRUZVU0VTIHRvIGFjY2VwdCBuZXcgbGlzdGVuZXJzIGJlY2F1c2UgaXQgZXhjZWVkZWQgaXRzIHRocmVzaG9sZCBieSBmYXIgKCR7dGhpcy5fc2l6ZX0gdnMgJHt0aGlzLl9sZWFrYWdlTW9uLnRocmVzaG9sZH0pYDtjb25zb2xlLndhcm4oZCk7Y29uc3QgbT10aGlzLl9sZWFrYWdlTW9uLmdldE1vc3RGcmVxdWVudFN0YWNrKCk/P1siVU5LTk9XTiBzdGFjayIsLTFdLGc9bmV3IFpzKGAke2R9LiBISU5UOiBTdGFjayBzaG93cyBtb3N0IGZyZXF1ZW50IGxpc3RlbmVyICgke21bMV19LXRpbWVzKWAsbVswXSk7cmV0dXJuKCgobD10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6bC5vbkxpc3RlbmVyRXJyb3IpfHxKZSkoZyksRmUuTm9uZX1pZih0aGlzLl9kaXNwb3NlZClyZXR1cm4gRmUuTm9uZTtuJiYodD10LmJpbmQobikpO2NvbnN0IHM9bmV3IFd0KHQpO2xldCBpO3RoaXMuX2xlYWthZ2VNb24mJnRoaXMuX3NpemU+PU1hdGguY2VpbCh0aGlzLl9sZWFrYWdlTW9uLnRocmVzaG9sZCouMikmJihzLnN0YWNrPUh0LmNyZWF0ZSgpLGk9dGhpcy5fbGVha2FnZU1vbi5jaGVjayhzLnN0YWNrLHRoaXMuX3NpemUrMSkpLHRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMgaW5zdGFuY2VvZiBXdD8odGhpcy5fZGVsaXZlcnlRdWV1ZT8/KHRoaXMuX2RlbGl2ZXJ5UXVldWU9bmV3IGVpKSx0aGlzLl9saXN0ZW5lcnM9W3RoaXMuX2xpc3RlbmVycyxzXSk6dGhpcy5fbGlzdGVuZXJzLnB1c2gocyk6KChjPSh1PXRoaXMuX29wdGlvbnMpPT1udWxsP3ZvaWQgMDp1Lm9uV2lsbEFkZEZpcnN0TGlzdGVuZXIpPT1udWxsfHxjLmNhbGwodSx0aGlzKSx0aGlzLl9saXN0ZW5lcnM9cywoZj0oaD10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6aC5vbkRpZEFkZEZpcnN0TGlzdGVuZXIpPT1udWxsfHxmLmNhbGwoaCx0aGlzKSksdGhpcy5fc2l6ZSsrO2NvbnN0IG89ZnQoKCk9PntpPT1udWxsfHxpKCksdGhpcy5fcmVtb3ZlTGlzdGVuZXIocyl9KTtyZXR1cm4gciBpbnN0YW5jZW9mIFplP3IuYWRkKG8pOkFycmF5LmlzQXJyYXkocikmJnIucHVzaChvKSxvfSksdGhpcy5fZXZlbnR9X3JlbW92ZUxpc3RlbmVyKHQpe3ZhciBpLG8sbCx1O2lmKChvPShpPXRoaXMuX29wdGlvbnMpPT1udWxsP3ZvaWQgMDppLm9uV2lsbFJlbW92ZUxpc3RlbmVyKT09bnVsbHx8by5jYWxsKGksdGhpcyksIXRoaXMuX2xpc3RlbmVycylyZXR1cm47aWYodGhpcy5fc2l6ZT09PTEpe3RoaXMuX2xpc3RlbmVycz12b2lkIDAsKHU9KGw9dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOmwub25EaWRSZW1vdmVMYXN0TGlzdGVuZXIpPT1udWxsfHx1LmNhbGwobCx0aGlzKSx0aGlzLl9zaXplPTA7cmV0dXJufWNvbnN0IG49dGhpcy5fbGlzdGVuZXJzLHI9bi5pbmRleE9mKHQpO2lmKHI9PT0tMSl0aHJvdyBjb25zb2xlLmxvZygiZGlzcG9zZWQ/Iix0aGlzLl9kaXNwb3NlZCksY29uc29sZS5sb2coInNpemU/Iix0aGlzLl9zaXplKSxjb25zb2xlLmxvZygiYXJyPyIsSlNPTi5zdHJpbmdpZnkodGhpcy5fbGlzdGVuZXJzKSksbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gZGlzcG9zZSB1bmtub3duIGxpc3RlbmVyIik7dGhpcy5fc2l6ZS0tLG5bcl09dm9pZCAwO2NvbnN0IHM9dGhpcy5fZGVsaXZlcnlRdWV1ZS5jdXJyZW50PT09dGhpcztpZih0aGlzLl9zaXplKktzPD1uLmxlbmd0aCl7bGV0IGM9MDtmb3IobGV0IGg9MDtoPG4ubGVuZ3RoO2grKyluW2hdP25bYysrXT1uW2hdOnMmJih0aGlzLl9kZWxpdmVyeVF1ZXVlLmVuZC0tLGM8dGhpcy5fZGVsaXZlcnlRdWV1ZS5pJiZ0aGlzLl9kZWxpdmVyeVF1ZXVlLmktLSk7bi5sZW5ndGg9Y319X2RlbGl2ZXIodCxuKXt2YXIgcztpZighdClyZXR1cm47Y29uc3Qgcj0oKHM9dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOnMub25MaXN0ZW5lckVycm9yKXx8SmU7aWYoIXIpe3QudmFsdWUobik7cmV0dXJufXRyeXt0LnZhbHVlKG4pfWNhdGNoKGkpe3IoaSl9fV9kZWxpdmVyUXVldWUodCl7Y29uc3Qgbj10LmN1cnJlbnQuX2xpc3RlbmVycztmb3IoO3QuaTx0LmVuZDspdGhpcy5fZGVsaXZlcihuW3QuaSsrXSx0LnZhbHVlKTt0LnJlc2V0KCl9ZmlyZSh0KXt2YXIgbixyLHMsaTtpZigobj10aGlzLl9kZWxpdmVyeVF1ZXVlKSE9bnVsbCYmbi5jdXJyZW50JiYodGhpcy5fZGVsaXZlclF1ZXVlKHRoaXMuX2RlbGl2ZXJ5UXVldWUpLChyPXRoaXMuX3BlcmZNb24pPT1udWxsfHxyLnN0b3AoKSksKHM9dGhpcy5fcGVyZk1vbik9PW51bGx8fHMuc3RhcnQodGhpcy5fc2l6ZSksdGhpcy5fbGlzdGVuZXJzKWlmKHRoaXMuX2xpc3RlbmVycyBpbnN0YW5jZW9mIFd0KXRoaXMuX2RlbGl2ZXIodGhpcy5fbGlzdGVuZXJzLHQpO2Vsc2V7Y29uc3Qgbz10aGlzLl9kZWxpdmVyeVF1ZXVlO28uZW5xdWV1ZSh0aGlzLHQsdGhpcy5fbGlzdGVuZXJzLmxlbmd0aCksdGhpcy5fZGVsaXZlclF1ZXVlKG8pfShpPXRoaXMuX3BlcmZNb24pPT1udWxsfHxpLnN0b3AoKX1oYXNMaXN0ZW5lcnMoKXtyZXR1cm4gdGhpcy5fc2l6ZT4wfX1jbGFzcyBlaXtjb25zdHJ1Y3Rvcigpe3RoaXMuaT0tMSx0aGlzLmVuZD0wfWVucXVldWUodCxuLHIpe3RoaXMuaT0wLHRoaXMuZW5kPXIsdGhpcy5jdXJyZW50PXQsdGhpcy52YWx1ZT1ufXJlc2V0KCl7dGhpcy5pPXRoaXMuZW5kLHRoaXMuY3VycmVudD12b2lkIDAsdGhpcy52YWx1ZT12b2lkIDB9fWZ1bmN0aW9uIHRpKCl7cmV0dXJuIGdsb2JhbFRoaXMuX1ZTQ09ERV9OTFNfTUVTU0FHRVN9ZnVuY3Rpb24gRW4oKXtyZXR1cm4gZ2xvYmFsVGhpcy5fVlNDT0RFX05MU19MQU5HVUFHRX1jb25zdCBuaT1FbigpPT09InBzZXVkbyJ8fHR5cGVvZiBkb2N1bWVudDwidSImJmRvY3VtZW50LmxvY2F0aW9uJiZkb2N1bWVudC5sb2NhdGlvbi5oYXNoLmluZGV4T2YoInBzZXVkbz10cnVlIik+PTA7ZnVuY3Rpb24gTW4oZSx0KXtsZXQgbjtyZXR1cm4gdC5sZW5ndGg9PT0wP249ZTpuPWUucmVwbGFjZSgvXHsoXGQrKVx9L2csKHIscyk9Pntjb25zdCBpPXNbMF0sbz10W2ldO2xldCBsPXI7cmV0dXJuIHR5cGVvZiBvPT0ic3RyaW5nIj9sPW86KHR5cGVvZiBvPT0ibnVtYmVyInx8dHlwZW9mIG89PSJib29sZWFuInx8bz09PXZvaWQgMHx8bz09PW51bGwpJiYobD1TdHJpbmcobykpLGx9KSxuaSYmKG49Iu+8uyIrbi5yZXBsYWNlKC9bYW91ZWldL2csIiQmJCYiKSsi77y9Iiksbn1mdW5jdGlvbiB6KGUsdCwuLi5uKXtyZXR1cm4gTW4odHlwZW9mIGU9PSJudW1iZXIiP3JpKGUsdCk6dCxuKX1mdW5jdGlvbiByaShlLHQpe3ZhciByO2NvbnN0IG49KHI9dGkoKSk9PW51bGw/dm9pZCAwOnJbZV07aWYodHlwZW9mIG4hPSJzdHJpbmciKXtpZih0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIHQ7dGhyb3cgbmV3IEVycm9yKGAhISEgTkxTIE1JU1NJTkc6ICR7ZX0gISEhYCl9cmV0dXJuIG59Y29uc3QgRGU9ImVuIjtsZXQgenQ9ITEsT3Q9ITEsR3Q9ITEsa249ITEsanQ9ITEsZ3QsWHQ9RGUsUG49RGUsc2ksaGU7Y29uc3QgeGU9Z2xvYmFsVGhpcztsZXQgWjt0eXBlb2YgeGUudnNjb2RlPCJ1IiYmdHlwZW9mIHhlLnZzY29kZS5wcm9jZXNzPCJ1Ij9aPXhlLnZzY29kZS5wcm9jZXNzOnR5cGVvZiBwcm9jZXNzPCJ1IiYmdHlwZW9mKChCcz1wcm9jZXNzPT1udWxsP3ZvaWQgMDpwcm9jZXNzLnZlcnNpb25zKT09bnVsbD92b2lkIDA6QnMubm9kZSk9PSJzdHJpbmciJiYoWj1wcm9jZXNzKTtjb25zdCBpaT10eXBlb2YoKHFzPVo9PW51bGw/dm9pZCAwOloudmVyc2lvbnMpPT1udWxsP3ZvaWQgMDpxcy5lbGVjdHJvbik9PSJzdHJpbmciJiYoWj09bnVsbD92b2lkIDA6Wi50eXBlKT09PSJyZW5kZXJlciI7aWYodHlwZW9mIFo9PSJvYmplY3QiKXt6dD1aLnBsYXRmb3JtPT09IndpbjMyIixPdD1aLnBsYXRmb3JtPT09ImRhcndpbiIsR3Q9Wi5wbGF0Zm9ybT09PSJsaW51eCIsR3QmJlouZW52LlNOQVAmJlouZW52LlNOQVBfUkVWSVNJT04sWi5lbnYuQ0l8fFouZW52LkJVSUxEX0FSVElGQUNUU1RBR0lOR0RJUkVDVE9SWSxndD1EZSxYdD1EZTtjb25zdCBlPVouZW52LlZTQ09ERV9OTFNfQ09ORklHO2lmKGUpdHJ5e2NvbnN0IHQ9SlNPTi5wYXJzZShlKTtndD10LnVzZXJMb2NhbGUsUG49dC5vc0xvY2FsZSxYdD10LnJlc29sdmVkTGFuZ3VhZ2V8fERlLHNpPShVcz10Lmxhbmd1YWdlUGFjayk9PW51bGw/dm9pZCAwOlVzLnRyYW5zbGF0aW9uc0NvbmZpZ0ZpbGV9Y2F0Y2h7fWtuPSEwfWVsc2UgdHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCImJiFpaT8oaGU9bmF2aWdhdG9yLnVzZXJBZ2VudCx6dD1oZS5pbmRleE9mKCJXaW5kb3dzIik+PTAsT3Q9aGUuaW5kZXhPZigiTWFjaW50b3NoIik+PTAsKGhlLmluZGV4T2YoIk1hY2ludG9zaCIpPj0wfHxoZS5pbmRleE9mKCJpUGFkIik+PTB8fGhlLmluZGV4T2YoImlQaG9uZSIpPj0wKSYmbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzJiZuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHM+MCxHdD1oZS5pbmRleE9mKCJMaW51eCIpPj0wLChoZT09bnVsbD92b2lkIDA6aGUuaW5kZXhPZigiTW9iaSIpKT49MCxqdD0hMCxYdD1FbigpfHxEZSxndD1uYXZpZ2F0b3IubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSxQbj1ndCk6Y29uc29sZS5lcnJvcigiVW5hYmxlIHRvIHJlc29sdmUgcGxhdGZvcm0uIik7Y29uc3QgS2U9enQsYWk9T3Qsb2k9a24sbGk9anQsdWk9anQmJnR5cGVvZiB4ZS5pbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iP3hlLm9yaWdpbjp2b2lkIDAsbWU9aGUsY2k9dHlwZW9mIHhlLnBvc3RNZXNzYWdlPT0iZnVuY3Rpb24iJiYheGUuaW1wb3J0U2NyaXB0czsoKCk9PntpZihjaSl7Y29uc3QgZT1bXTt4ZS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuPT57aWYobi5kYXRhJiZuLmRhdGEudnNjb2RlU2NoZWR1bGVBc3luY1dvcmspZm9yKGxldCByPTAscz1lLmxlbmd0aDtyPHM7cisrKXtjb25zdCBpPWVbcl07aWYoaS5pZD09PW4uZGF0YS52c2NvZGVTY2hlZHVsZUFzeW5jV29yayl7ZS5zcGxpY2UociwxKSxpLmNhbGxiYWNrKCk7cmV0dXJufX19KTtsZXQgdD0wO3JldHVybiBuPT57Y29uc3Qgcj0rK3Q7ZS5wdXNoKHtpZDpyLGNhbGxiYWNrOm59KSx4ZS5wb3N0TWVzc2FnZSh7dnNjb2RlU2NoZWR1bGVBc3luY1dvcms6cn0sIioiKX19cmV0dXJuIGU9PnNldFRpbWVvdXQoZSl9KSgpO2NvbnN0IGhpPSEhKG1lJiZtZS5pbmRleE9mKCJDaHJvbWUiKT49MCk7bWUmJm1lLmluZGV4T2YoIkZpcmVmb3giKT49MCwhaGkmJm1lJiZtZS5pbmRleE9mKCJTYWZhcmkiKT49MCxtZSYmbWUuaW5kZXhPZigiRWRnLyIpPj0wLG1lJiZtZS5pbmRleE9mKCJBbmRyb2lkIik+PTA7ZnVuY3Rpb24gZmkoZSl7cmV0dXJuIGV9Y2xhc3MgZGl7Y29uc3RydWN0b3IodCxuKXt0aGlzLmxhc3RDYWNoZT12b2lkIDAsdGhpcy5sYXN0QXJnS2V5PXZvaWQgMCx0eXBlb2YgdD09ImZ1bmN0aW9uIj8odGhpcy5fZm49dCx0aGlzLl9jb21wdXRlS2V5PWZpKToodGhpcy5fZm49bix0aGlzLl9jb21wdXRlS2V5PXQuZ2V0Q2FjaGVLZXkpfWdldCh0KXtjb25zdCBuPXRoaXMuX2NvbXB1dGVLZXkodCk7cmV0dXJuIHRoaXMubGFzdEFyZ0tleSE9PW4mJih0aGlzLmxhc3RBcmdLZXk9bix0aGlzLmxhc3RDYWNoZT10aGlzLl9mbih0KSksdGhpcy5sYXN0Q2FjaGV9fWNsYXNzIEZue2NvbnN0cnVjdG9yKHQpe3RoaXMuZXhlY3V0b3I9dCx0aGlzLl9kaWRSdW49ITF9Z2V0IHZhbHVlKCl7aWYoIXRoaXMuX2RpZFJ1bil0cnl7dGhpcy5fdmFsdWU9dGhpcy5leGVjdXRvcigpfWNhdGNoKHQpe3RoaXMuX2Vycm9yPXR9ZmluYWxseXt0aGlzLl9kaWRSdW49ITB9aWYodGhpcy5fZXJyb3IpdGhyb3cgdGhpcy5fZXJyb3I7cmV0dXJuIHRoaXMuX3ZhbHVlfWdldCByYXdWYWx1ZSgpe3JldHVybiB0aGlzLl92YWx1ZX19ZnVuY3Rpb24gbWkoZSl7cmV0dXJuIGUucmVwbGFjZSgvW1xcXHtcfVwqXCtcP1x8XF5cJFwuXFtcXVwoXCldL2csIlxcJCYiKX1mdW5jdGlvbiBnaShlKXtyZXR1cm4gZS5zcGxpdCgvXHJcbnxccnxcbi8pfWZ1bmN0aW9uIGJpKGUpe2ZvcihsZXQgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyl7Y29uc3Qgcj1lLmNoYXJDb2RlQXQodCk7aWYociE9PTMyJiZyIT09OSlyZXR1cm4gdH1yZXR1cm4tMX1mdW5jdGlvbiB4aShlLHQ9ZS5sZW5ndGgtMSl7Zm9yKGxldCBuPXQ7bj49MDtuLS0pe2NvbnN0IHI9ZS5jaGFyQ29kZUF0KG4pO2lmKHIhPT0zMiYmciE9PTkpcmV0dXJuIG59cmV0dXJuLTF9ZnVuY3Rpb24gRG4oZSl7cmV0dXJuIGU+PTY1JiZlPD05MH1mdW5jdGlvbiBRdChlKXtyZXR1cm4gNTUyOTY8PWUmJmU8PTU2MzE5fWZ1bmN0aW9uIHBpKGUpe3JldHVybiA1NjMyMDw9ZSYmZTw9NTczNDN9ZnVuY3Rpb24gX2koZSx0KXtyZXR1cm4oZS01NTI5Njw8MTApKyh0LTU2MzIwKSs2NTUzNn1mdW5jdGlvbiB3aShlLHQsbil7Y29uc3Qgcj1lLmNoYXJDb2RlQXQobik7aWYoUXQocikmJm4rMTx0KXtjb25zdCBzPWUuY2hhckNvZGVBdChuKzEpO2lmKHBpKHMpKXJldHVybiBfaShyLHMpfXJldHVybiByfWNvbnN0IExpPS9eW1x0XG5cclx4MjAtXHg3RV0qJC87ZnVuY3Rpb24gdmkoZSl7cmV0dXJuIExpLnRlc3QoZSl9Y29uc3QgYmU9Y2xhc3MgYmV7c3RhdGljIGdldEluc3RhbmNlKHQpe3JldHVybiBiZS5jYWNoZS5nZXQoQXJyYXkuZnJvbSh0KSl9c3RhdGljIGdldExvY2FsZXMoKXtyZXR1cm4gYmUuX2xvY2FsZXMudmFsdWV9Y29uc3RydWN0b3IodCl7dGhpcy5jb25mdXNhYmxlRGljdGlvbmFyeT10fWlzQW1iaWd1b3VzKHQpe3JldHVybiB0aGlzLmNvbmZ1c2FibGVEaWN0aW9uYXJ5Lmhhcyh0KX1nZXRQcmltYXJ5Q29uZnVzYWJsZSh0KXtyZXR1cm4gdGhpcy5jb25mdXNhYmxlRGljdGlvbmFyeS5nZXQodCl9Z2V0Q29uZnVzYWJsZUNvZGVQb2ludHMoKXtyZXR1cm4gbmV3IFNldCh0aGlzLmNvbmZ1c2FibGVEaWN0aW9uYXJ5LmtleXMoKSl9fTtiZS5hbWJpZ3VvdXNDaGFyYWN0ZXJEYXRhPW5ldyBGbigoKT0+SlNPTi5wYXJzZSgneyJfY29tbW9uIjpbODIzMiwzMiw4MjMzLDMyLDU3NjAsMzIsODE5MiwzMiw4MTkzLDMyLDgxOTQsMzIsODE5NSwzMiw4MTk2LDMyLDgxOTcsMzIsODE5OCwzMiw4MjAwLDMyLDgyMDEsMzIsODIwMiwzMiw4Mjg3LDMyLDgxOTksMzIsODIzOSwzMiwyMDQyLDk1LDY1MTAxLDk1LDY1MTAyLDk1LDY1MTAzLDk1LDgyMDgsNDUsODIwOSw0NSw4MjEwLDQ1LDY1MTEyLDQ1LDE3NDgsNDUsODI1OSw0NSw3MjcsNDUsODcyMiw0NSwxMDEzNCw0NSwxMTQ1MCw0NSwxNTQ5LDQ0LDE2NDMsNDQsODIxOCw0NCwxODQsNDQsNDIyMzMsNDQsODk0LDU5LDIzMDcsNTgsMjY5MSw1OCwxNDE3LDU4LDE3OTUsNTgsMTc5Niw1OCw1ODY4LDU4LDY1MDcyLDU4LDYxNDcsNTgsNjE1Myw1OCw4MjgyLDU4LDE0NzUsNTgsNzYwLDU4LDQyODg5LDU4LDg3NTgsNTgsNzIwLDU4LDQyMjM3LDU4LDQ1MSwzMywxMTYwMSwzMyw2NjAsNjMsNTc3LDYzLDI0MjksNjMsNTAzOCw2Myw0MjczMSw2MywxMTkxNDksNDYsODIyOCw0NiwxNzkzLDQ2LDE3OTQsNDYsNDI1MTAsNDYsNjgxNzYsNDYsMTYzMiw0NiwxNzc2LDQ2LDQyMjMyLDQ2LDEzNzMsOTYsNjUyODcsOTYsODIxOSw5Niw4MjQyLDk2LDEzNzAsOTYsMTUyMyw5Niw4MTc1LDk2LDY1MzQ0LDk2LDkwMCw5Niw4MTg5LDk2LDgxMjUsOTYsODEyNyw5Niw4MTkwLDk2LDY5Nyw5Niw4ODQsOTYsNzEyLDk2LDcxNCw5Niw3MTUsOTYsNzU2LDk2LDY5OSw5Niw3MDEsOTYsNzAwLDk2LDcwMiw5Niw0Mjg5Miw5NiwxNDk3LDk2LDIwMzYsOTYsMjAzNyw5Niw1MTk0LDk2LDU4MzYsOTYsOTQwMzMsOTYsOTQwMzQsOTYsNjUzMzksOTEsMTAwODgsNDAsMTAwOTgsNDAsMTIzMDgsNDAsNjQ4MzAsNDAsNjUzNDEsOTMsMTAwODksNDEsMTAwOTksNDEsMTIzMDksNDEsNjQ4MzEsNDEsMTAxMDAsMTIzLDExOTA2MCwxMjMsMTAxMDEsMTI1LDY1MzQyLDk0LDgyNzAsNDIsMTY0NSw0Miw4NzI3LDQyLDY2MzM1LDQyLDU5NDEsNDcsODI1Nyw0Nyw4NzI1LDQ3LDgyNjAsNDcsOTU4NSw0NywxMDE4Nyw0NywxMDc0NCw0NywxMTkzNTQsNDcsMTI3NTUsNDcsMTIzMzksNDcsMTE0NjIsNDcsMjAwMzEsNDcsMTIwMzUsNDcsNjUzNDAsOTIsNjUxMjgsOTIsODcyNiw5MiwxMDE4OSw5MiwxMDc0MSw5MiwxMDc0NSw5MiwxMTkzMTEsOTIsMTE5MzU1LDkyLDEyNzU2LDkyLDIwMDIyLDkyLDEyMDM0LDkyLDQyODcyLDM4LDcwOCw5NCw3MTAsOTQsNTg2OSw0MywxMDEzMyw0Myw2NjIwMyw0Myw4MjQ5LDYwLDEwMDk0LDYwLDcwNiw2MCwxMTkzNTAsNjAsNTE3Niw2MCw1ODEwLDYwLDUxMjAsNjEsMTE4NDAsNjEsMTI0NDgsNjEsNDIyMzksNjEsODI1MCw2MiwxMDA5NSw2Miw3MDcsNjIsMTE5MzUxLDYyLDUxNzEsNjIsOTQwMTUsNjIsODI3NSwxMjYsNzMyLDEyNiw4MTI4LDEyNiw4NzY0LDEyNiw2NTM3MiwxMjQsNjUyOTMsNDUsMTIwNzg0LDUwLDEyMDc5NCw1MCwxMjA4MDQsNTAsMTIwODE0LDUwLDEyMDgyNCw1MCwxMzAwMzQsNTAsNDI4NDIsNTAsNDIzLDUwLDEwMDAsNTAsNDI1NjQsNTAsNTMxMSw1MCw0MjczNSw1MCwxMTkzMDIsNTEsMTIwNzg1LDUxLDEyMDc5NSw1MSwxMjA4MDUsNTEsMTIwODE1LDUxLDEyMDgyNSw1MSwxMzAwMzUsNTEsNDI5MjMsNTEsNTQwLDUxLDQzOSw1MSw0Mjg1OCw1MSwxMTQ2OCw1MSwxMjQ4LDUxLDk0MDExLDUxLDcxODgyLDUxLDEyMDc4Niw1MiwxMjA3OTYsNTIsMTIwODA2LDUyLDEyMDgxNiw1MiwxMjA4MjYsNTIsMTMwMDM2LDUyLDUwNzAsNTIsNzE4NTUsNTIsMTIwNzg3LDUzLDEyMDc5Nyw1MywxMjA4MDcsNTMsMTIwODE3LDUzLDEyMDgyNyw1MywxMzAwMzcsNTMsNDQ0LDUzLDcxODY3LDUzLDEyMDc4OCw1NCwxMjA3OTgsNTQsMTIwODA4LDU0LDEyMDgxOCw1NCwxMjA4MjgsNTQsMTMwMDM4LDU0LDExNDc0LDU0LDUxMDIsNTQsNzE4OTMsNTQsMTE5MzE0LDU1LDEyMDc4OSw1NSwxMjA3OTksNTUsMTIwODA5LDU1LDEyMDgxOSw1NSwxMjA4MjksNTUsMTMwMDM5LDU1LDY2NzcwLDU1LDcxODc4LDU1LDI4MTksNTYsMjUzOCw1NiwyNjY2LDU2LDEyNTEzMSw1NiwxMjA3OTAsNTYsMTIwODAwLDU2LDEyMDgxMCw1NiwxMjA4MjAsNTYsMTIwODMwLDU2LDEzMDA0MCw1Niw1NDcsNTYsNTQ2LDU2LDY2MzMwLDU2LDI2NjMsNTcsMjkyMCw1NywyNTQxLDU3LDM0MzcsNTcsMTIwNzkxLDU3LDEyMDgwMSw1NywxMjA4MTEsNTcsMTIwODIxLDU3LDEyMDgzMSw1NywxMzAwNDEsNTcsNDI4NjIsNTcsMTE0NjYsNTcsNzE4ODQsNTcsNzE4NTIsNTcsNzE4OTQsNTcsOTA4Miw5Nyw2NTM0NSw5NywxMTk4MzQsOTcsMTE5ODg2LDk3LDExOTkzOCw5NywxMTk5OTAsOTcsMTIwMDQyLDk3LDEyMDA5NCw5NywxMjAxNDYsOTcsMTIwMTk4LDk3LDEyMDI1MCw5NywxMjAzMDIsOTcsMTIwMzU0LDk3LDEyMDQwNiw5NywxMjA0NTgsOTcsNTkzLDk3LDk0NSw5NywxMjA1MTQsOTcsMTIwNTcyLDk3LDEyMDYzMCw5NywxMjA2ODgsOTcsMTIwNzQ2LDk3LDY1MzEzLDY1LDExOTgwOCw2NSwxMTk4NjAsNjUsMTE5OTEyLDY1LDExOTk2NCw2NSwxMjAwMTYsNjUsMTIwMDY4LDY1LDEyMDEyMCw2NSwxMjAxNzIsNjUsMTIwMjI0LDY1LDEyMDI3Niw2NSwxMjAzMjgsNjUsMTIwMzgwLDY1LDEyMDQzMiw2NSw5MTMsNjUsMTIwNDg4LDY1LDEyMDU0Niw2NSwxMjA2MDQsNjUsMTIwNjYyLDY1LDEyMDcyMCw2NSw1MDM0LDY1LDU1NzMsNjUsNDIyMjIsNjUsOTQwMTYsNjUsNjYyMDgsNjUsMTE5ODM1LDk4LDExOTg4Nyw5OCwxMTk5MzksOTgsMTE5OTkxLDk4LDEyMDA0Myw5OCwxMjAwOTUsOTgsMTIwMTQ3LDk4LDEyMDE5OSw5OCwxMjAyNTEsOTgsMTIwMzAzLDk4LDEyMDM1NSw5OCwxMjA0MDcsOTgsMTIwNDU5LDk4LDM4OCw5OCw1MDcxLDk4LDUyMzQsOTgsNTU1MSw5OCw2NTMxNCw2Niw4NDkyLDY2LDExOTgwOSw2NiwxMTk4NjEsNjYsMTE5OTEzLDY2LDEyMDAxNyw2NiwxMjAwNjksNjYsMTIwMTIxLDY2LDEyMDE3Myw2NiwxMjAyMjUsNjYsMTIwMjc3LDY2LDEyMDMyOSw2NiwxMjAzODEsNjYsMTIwNDMzLDY2LDQyOTMyLDY2LDkxNCw2NiwxMjA0ODksNjYsMTIwNTQ3LDY2LDEyMDYwNSw2NiwxMjA2NjMsNjYsMTIwNzIxLDY2LDUxMDgsNjYsNTYyMyw2Niw0MjE5Miw2Niw2NjE3OCw2Niw2NjIwOSw2Niw2NjMwNSw2Niw2NTM0Nyw5OSw4NTczLDk5LDExOTgzNiw5OSwxMTk4ODgsOTksMTE5OTQwLDk5LDExOTk5Miw5OSwxMjAwNDQsOTksMTIwMDk2LDk5LDEyMDE0OCw5OSwxMjAyMDAsOTksMTIwMjUyLDk5LDEyMDMwNCw5OSwxMjAzNTYsOTksMTIwNDA4LDk5LDEyMDQ2MCw5OSw3NDI4LDk5LDEwMTAsOTksMTE0MjksOTksNDM5NTEsOTksNjY2MjEsOTksMTI4ODQ0LDY3LDcxOTIyLDY3LDcxOTEzLDY3LDY1MzE1LDY3LDg1NTcsNjcsODQ1MCw2Nyw4NDkzLDY3LDExOTgxMCw2NywxMTk4NjIsNjcsMTE5OTE0LDY3LDExOTk2Niw2NywxMjAwMTgsNjcsMTIwMTc0LDY3LDEyMDIyNiw2NywxMjAyNzgsNjcsMTIwMzMwLDY3LDEyMDM4Miw2NywxMjA0MzQsNjcsMTAxNyw2NywxMTQyOCw2Nyw1MDg3LDY3LDQyMjAyLDY3LDY2MjEwLDY3LDY2MzA2LDY3LDY2NTgxLDY3LDY2ODQ0LDY3LDg1NzQsMTAwLDg1MTgsMTAwLDExOTgzNywxMDAsMTE5ODg5LDEwMCwxMTk5NDEsMTAwLDExOTk5MywxMDAsMTIwMDQ1LDEwMCwxMjAwOTcsMTAwLDEyMDE0OSwxMDAsMTIwMjAxLDEwMCwxMjAyNTMsMTAwLDEyMDMwNSwxMDAsMTIwMzU3LDEwMCwxMjA0MDksMTAwLDEyMDQ2MSwxMDAsMTI4MSwxMDAsNTA5NSwxMDAsNTIzMSwxMDAsNDIxOTQsMTAwLDg1NTgsNjgsODUxNyw2OCwxMTk4MTEsNjgsMTE5ODYzLDY4LDExOTkxNSw2OCwxMTk5NjcsNjgsMTIwMDE5LDY4LDEyMDA3MSw2OCwxMjAxMjMsNjgsMTIwMTc1LDY4LDEyMDIyNyw2OCwxMjAyNzksNjgsMTIwMzMxLDY4LDEyMDM4Myw2OCwxMjA0MzUsNjgsNTAyNCw2OCw1NTk4LDY4LDU2MTAsNjgsNDIxOTUsNjgsODQ5NCwxMDEsNjUzNDksMTAxLDg0OTUsMTAxLDg1MTksMTAxLDExOTgzOCwxMDEsMTE5ODkwLDEwMSwxMTk5NDIsMTAxLDEyMDA0NiwxMDEsMTIwMDk4LDEwMSwxMjAxNTAsMTAxLDEyMDIwMiwxMDEsMTIwMjU0LDEwMSwxMjAzMDYsMTAxLDEyMDM1OCwxMDEsMTIwNDEwLDEwMSwxMjA0NjIsMTAxLDQzODI2LDEwMSwxMjEzLDEwMSw4OTU5LDY5LDY1MzE3LDY5LDg0OTYsNjksMTE5ODEyLDY5LDExOTg2NCw2OSwxMTk5MTYsNjksMTIwMDIwLDY5LDEyMDA3Miw2OSwxMjAxMjQsNjksMTIwMTc2LDY5LDEyMDIyOCw2OSwxMjAyODAsNjksMTIwMzMyLDY5LDEyMDM4NCw2OSwxMjA0MzYsNjksOTE3LDY5LDEyMDQ5Miw2OSwxMjA1NTAsNjksMTIwNjA4LDY5LDEyMDY2Niw2OSwxMjA3MjQsNjksMTE1NzcsNjksNTAzNiw2OSw0MjIyNCw2OSw3MTg0Niw2OSw3MTg1NCw2OSw2NjE4Miw2OSwxMTk4MzksMTAyLDExOTg5MSwxMDIsMTE5OTQzLDEwMiwxMTk5OTUsMTAyLDEyMDA0NywxMDIsMTIwMDk5LDEwMiwxMjAxNTEsMTAyLDEyMDIwMywxMDIsMTIwMjU1LDEwMiwxMjAzMDcsMTAyLDEyMDM1OSwxMDIsMTIwNDExLDEwMiwxMjA0NjMsMTAyLDQzODI5LDEwMiw0MjkwNSwxMDIsMzgzLDEwMiw3ODM3LDEwMiwxNDEyLDEwMiwxMTkzMTUsNzAsODQ5Nyw3MCwxMTk4MTMsNzAsMTE5ODY1LDcwLDExOTkxNyw3MCwxMjAwMjEsNzAsMTIwMDczLDcwLDEyMDEyNSw3MCwxMjAxNzcsNzAsMTIwMjI5LDcwLDEyMDI4MSw3MCwxMjAzMzMsNzAsMTIwMzg1LDcwLDEyMDQzNyw3MCw0MjkwNCw3MCw5ODgsNzAsMTIwNzc4LDcwLDU1NTYsNzAsNDIyMDUsNzAsNzE4NzQsNzAsNzE4NDIsNzAsNjYxODMsNzAsNjYyMTMsNzAsNjY4NTMsNzAsNjUzNTEsMTAzLDg0NTgsMTAzLDExOTg0MCwxMDMsMTE5ODkyLDEwMywxMTk5NDQsMTAzLDEyMDA0OCwxMDMsMTIwMTAwLDEwMywxMjAxNTIsMTAzLDEyMDIwNCwxMDMsMTIwMjU2LDEwMywxMjAzMDgsMTAzLDEyMDM2MCwxMDMsMTIwNDEyLDEwMywxMjA0NjQsMTAzLDYwOSwxMDMsNzU1NSwxMDMsMzk3LDEwMywxNDA5LDEwMywxMTk4MTQsNzEsMTE5ODY2LDcxLDExOTkxOCw3MSwxMTk5NzAsNzEsMTIwMDIyLDcxLDEyMDA3NCw3MSwxMjAxMjYsNzEsMTIwMTc4LDcxLDEyMDIzMCw3MSwxMjAyODIsNzEsMTIwMzM0LDcxLDEyMDM4Niw3MSwxMjA0MzgsNzEsMTI5Miw3MSw1MDU2LDcxLDUxMDcsNzEsNDIxOTgsNzEsNjUzNTIsMTA0LDg0NjIsMTA0LDExOTg0MSwxMDQsMTE5OTQ1LDEwNCwxMTk5OTcsMTA0LDEyMDA0OSwxMDQsMTIwMTAxLDEwNCwxMjAxNTMsMTA0LDEyMDIwNSwxMDQsMTIwMjU3LDEwNCwxMjAzMDksMTA0LDEyMDM2MSwxMDQsMTIwNDEzLDEwNCwxMjA0NjUsMTA0LDEyMTEsMTA0LDEzOTIsMTA0LDUwNTgsMTA0LDY1MzIwLDcyLDg0NTksNzIsODQ2MCw3Miw4NDYxLDcyLDExOTgxNSw3MiwxMTk4NjcsNzIsMTE5OTE5LDcyLDEyMDAyMyw3MiwxMjAxNzksNzIsMTIwMjMxLDcyLDEyMDI4Myw3MiwxMjAzMzUsNzIsMTIwMzg3LDcyLDEyMDQzOSw3Miw5MTksNzIsMTIwNDk0LDcyLDEyMDU1Miw3MiwxMjA2MTAsNzIsMTIwNjY4LDcyLDEyMDcyNiw3MiwxMTQwNiw3Miw1MDUxLDcyLDU1MDAsNzIsNDIyMTUsNzIsNjYyNTUsNzIsNzMxLDEwNSw5MDc1LDEwNSw2NTM1MywxMDUsODU2MCwxMDUsODUwNSwxMDUsODUyMCwxMDUsMTE5ODQyLDEwNSwxMTk4OTQsMTA1LDExOTk0NiwxMDUsMTE5OTk4LDEwNSwxMjAwNTAsMTA1LDEyMDEwMiwxMDUsMTIwMTU0LDEwNSwxMjAyMDYsMTA1LDEyMDI1OCwxMDUsMTIwMzEwLDEwNSwxMjAzNjIsMTA1LDEyMDQxNCwxMDUsMTIwNDY2LDEwNSwxMjA0ODQsMTA1LDYxOCwxMDUsNjE3LDEwNSw5NTMsMTA1LDgxMjYsMTA1LDg5MCwxMDUsMTIwNTIyLDEwNSwxMjA1ODAsMTA1LDEyMDYzOCwxMDUsMTIwNjk2LDEwNSwxMjA3NTQsMTA1LDExMTAsMTA1LDQyNTY3LDEwNSwxMjMxLDEwNSw0Mzg5MywxMDUsNTAyOSwxMDUsNzE4NzUsMTA1LDY1MzU0LDEwNiw4NTIxLDEwNiwxMTk4NDMsMTA2LDExOTg5NSwxMDYsMTE5OTQ3LDEwNiwxMTk5OTksMTA2LDEyMDA1MSwxMDYsMTIwMTAzLDEwNiwxMjAxNTUsMTA2LDEyMDIwNywxMDYsMTIwMjU5LDEwNiwxMjAzMTEsMTA2LDEyMDM2MywxMDYsMTIwNDE1LDEwNiwxMjA0NjcsMTA2LDEwMTEsMTA2LDExMTIsMTA2LDY1MzIyLDc0LDExOTgxNyw3NCwxMTk4NjksNzQsMTE5OTIxLDc0LDExOTk3Myw3NCwxMjAwMjUsNzQsMTIwMDc3LDc0LDEyMDEyOSw3NCwxMjAxODEsNzQsMTIwMjMzLDc0LDEyMDI4NSw3NCwxMjAzMzcsNzQsMTIwMzg5LDc0LDEyMDQ0MSw3NCw0MjkzMCw3NCw4OTUsNzQsMTAzMiw3NCw1MDM1LDc0LDUyNjEsNzQsNDIyMDEsNzQsMTE5ODQ0LDEwNywxMTk4OTYsMTA3LDExOTk0OCwxMDcsMTIwMDAwLDEwNywxMjAwNTIsMTA3LDEyMDEwNCwxMDcsMTIwMTU2LDEwNywxMjAyMDgsMTA3LDEyMDI2MCwxMDcsMTIwMzEyLDEwNywxMjAzNjQsMTA3LDEyMDQxNiwxMDcsMTIwNDY4LDEwNyw4NDkwLDc1LDY1MzIzLDc1LDExOTgxOCw3NSwxMTk4NzAsNzUsMTE5OTIyLDc1LDExOTk3NCw3NSwxMjAwMjYsNzUsMTIwMDc4LDc1LDEyMDEzMCw3NSwxMjAxODIsNzUsMTIwMjM0LDc1LDEyMDI4Niw3NSwxMjAzMzgsNzUsMTIwMzkwLDc1LDEyMDQ0Miw3NSw5MjIsNzUsMTIwNDk3LDc1LDEyMDU1NSw3NSwxMjA2MTMsNzUsMTIwNjcxLDc1LDEyMDcyOSw3NSwxMTQxMiw3NSw1MDk0LDc1LDU4NDUsNzUsNDIxOTksNzUsNjY4NDAsNzUsMTQ3MiwxMDgsODczOSw3Myw5MjEzLDczLDY1NTEyLDczLDE2MzMsMTA4LDE3NzcsNzMsNjYzMzYsMTA4LDEyNTEyNywxMDgsMTIwNzgzLDczLDEyMDc5Myw3MywxMjA4MDMsNzMsMTIwODEzLDczLDEyMDgyMyw3MywxMzAwMzMsNzMsNjUzMjEsNzMsODU0NCw3Myw4NDY0LDczLDg0NjUsNzMsMTE5ODE2LDczLDExOTg2OCw3MywxMTk5MjAsNzMsMTIwMDI0LDczLDEyMDEyOCw3MywxMjAxODAsNzMsMTIwMjMyLDczLDEyMDI4NCw3MywxMjAzMzYsNzMsMTIwMzg4LDczLDEyMDQ0MCw3Myw2NTM1NiwxMDgsODU3Miw3Myw4NDY3LDEwOCwxMTk4NDUsMTA4LDExOTg5NywxMDgsMTE5OTQ5LDEwOCwxMjAwMDEsMTA4LDEyMDA1MywxMDgsMTIwMTA1LDczLDEyMDE1Nyw3MywxMjAyMDksNzMsMTIwMjYxLDczLDEyMDMxMyw3MywxMjAzNjUsNzMsMTIwNDE3LDczLDEyMDQ2OSw3Myw0NDgsNzMsMTIwNDk2LDczLDEyMDU1NCw3MywxMjA2MTIsNzMsMTIwNjcwLDczLDEyMDcyOCw3MywxMTQxMCw3MywxMDMwLDczLDEyMTYsNzMsMTQ5MywxMDgsMTUwMywxMDgsMTU3NSwxMDgsMTI2NDY0LDEwOCwxMjY1OTIsMTA4LDY1MTY2LDEwOCw2NTE2NSwxMDgsMTk5NCwxMDgsMTE1OTksNzMsNTgyNSw3Myw0MjIyNiw3Myw5Mzk5Miw3Myw2NjE4NiwxMjQsNjYzMTMsMTI0LDExOTMzOCw3Niw4NTU2LDc2LDg0NjYsNzYsMTE5ODE5LDc2LDExOTg3MSw3NiwxMTk5MjMsNzYsMTIwMDI3LDc2LDEyMDA3OSw3NiwxMjAxMzEsNzYsMTIwMTgzLDc2LDEyMDIzNSw3NiwxMjAyODcsNzYsMTIwMzM5LDc2LDEyMDM5MSw3NiwxMjA0NDMsNzYsMTE0NzIsNzYsNTA4Niw3Niw1MjkwLDc2LDQyMjA5LDc2LDkzOTc0LDc2LDcxODQzLDc2LDcxODU4LDc2LDY2NTg3LDc2LDY2ODU0LDc2LDY1MzI1LDc3LDg1NTksNzcsODQ5OSw3NywxMTk4MjAsNzcsMTE5ODcyLDc3LDExOTkyNCw3NywxMjAwMjgsNzcsMTIwMDgwLDc3LDEyMDEzMiw3NywxMjAxODQsNzcsMTIwMjM2LDc3LDEyMDI4OCw3NywxMjAzNDAsNzcsMTIwMzkyLDc3LDEyMDQ0NCw3Nyw5MjQsNzcsMTIwNDk5LDc3LDEyMDU1Nyw3NywxMjA2MTUsNzcsMTIwNjczLDc3LDEyMDczMSw3NywxMDE4LDc3LDExNDE2LDc3LDUwNDcsNzcsNTYxNiw3Nyw1ODQ2LDc3LDQyMjA3LDc3LDY2MjI0LDc3LDY2MzIxLDc3LDExOTg0NywxMTAsMTE5ODk5LDExMCwxMTk5NTEsMTEwLDEyMDAwMywxMTAsMTIwMDU1LDExMCwxMjAxMDcsMTEwLDEyMDE1OSwxMTAsMTIwMjExLDExMCwxMjAyNjMsMTEwLDEyMDMxNSwxMTAsMTIwMzY3LDExMCwxMjA0MTksMTEwLDEyMDQ3MSwxMTAsMTQwMCwxMTAsMTQwNCwxMTAsNjUzMjYsNzgsODQ2OSw3OCwxMTk4MjEsNzgsMTE5ODczLDc4LDExOTkyNSw3OCwxMTk5NzcsNzgsMTIwMDI5LDc4LDEyMDA4MSw3OCwxMjAxODUsNzgsMTIwMjM3LDc4LDEyMDI4OSw3OCwxMjAzNDEsNzgsMTIwMzkzLDc4LDEyMDQ0NSw3OCw5MjUsNzgsMTIwNTAwLDc4LDEyMDU1OCw3OCwxMjA2MTYsNzgsMTIwNjc0LDc4LDEyMDczMiw3OCwxMTQxOCw3OCw0MjIwOCw3OCw2NjgzNSw3OCwzMDc0LDExMSwzMjAyLDExMSwzMzMwLDExMSwzNDU4LDExMSwyNDA2LDExMSwyNjYyLDExMSwyNzkwLDExMSwzMDQ2LDExMSwzMTc0LDExMSwzMzAyLDExMSwzNDMwLDExMSwzNjY0LDExMSwzNzkyLDExMSw0MTYwLDExMSwxNjM3LDExMSwxNzgxLDExMSw2NTM1OSwxMTEsODUwMCwxMTEsMTE5ODQ4LDExMSwxMTk5MDAsMTExLDExOTk1MiwxMTEsMTIwMDU2LDExMSwxMjAxMDgsMTExLDEyMDE2MCwxMTEsMTIwMjEyLDExMSwxMjAyNjQsMTExLDEyMDMxNiwxMTEsMTIwMzY4LDExMSwxMjA0MjAsMTExLDEyMDQ3MiwxMTEsNzQzOSwxMTEsNzQ0MSwxMTEsNDM4MzcsMTExLDk1OSwxMTEsMTIwNTI4LDExMSwxMjA1ODYsMTExLDEyMDY0NCwxMTEsMTIwNzAyLDExMSwxMjA3NjAsMTExLDk2MywxMTEsMTIwNTMyLDExMSwxMjA1OTAsMTExLDEyMDY0OCwxMTEsMTIwNzA2LDExMSwxMjA3NjQsMTExLDExNDIzLDExMSw0MzUxLDExMSwxNDEzLDExMSwxNTA1LDExMSwxNjA3LDExMSwxMjY1MDAsMTExLDEyNjU2NCwxMTEsMTI2NTk2LDExMSw2NTI1OSwxMTEsNjUyNjAsMTExLDY1MjU4LDExMSw2NTI1NywxMTEsMTcyNiwxMTEsNjQ0MjgsMTExLDY0NDI5LDExMSw2NDQyNywxMTEsNjQ0MjYsMTExLDE3MjksMTExLDY0NDI0LDExMSw2NDQyNSwxMTEsNjQ0MjMsMTExLDY0NDIyLDExMSwxNzQ5LDExMSwzMzYwLDExMSw0MTI1LDExMSw2Njc5NCwxMTEsNzE4ODAsMTExLDcxODk1LDExMSw2NjYwNCwxMTEsMTk4NCw3OSwyNTM0LDc5LDI5MTgsNzksMTIyOTUsNzksNzA4NjQsNzksNzE5MDQsNzksMTIwNzgyLDc5LDEyMDc5Miw3OSwxMjA4MDIsNzksMTIwODEyLDc5LDEyMDgyMiw3OSwxMzAwMzIsNzksNjUzMjcsNzksMTE5ODIyLDc5LDExOTg3NCw3OSwxMTk5MjYsNzksMTE5OTc4LDc5LDEyMDAzMCw3OSwxMjAwODIsNzksMTIwMTM0LDc5LDEyMDE4Niw3OSwxMjAyMzgsNzksMTIwMjkwLDc5LDEyMDM0Miw3OSwxMjAzOTQsNzksMTIwNDQ2LDc5LDkyNyw3OSwxMjA1MDIsNzksMTIwNTYwLDc5LDEyMDYxOCw3OSwxMjA2NzYsNzksMTIwNzM0LDc5LDExNDIyLDc5LDEzNjUsNzksMTE2MDQsNzksNDgxNiw3OSwyODQ4LDc5LDY2NzU0LDc5LDQyMjI3LDc5LDcxODYxLDc5LDY2MTk0LDc5LDY2MjE5LDc5LDY2NTY0LDc5LDY2ODM4LDc5LDkwNzYsMTEyLDY1MzYwLDExMiwxMTk4NDksMTEyLDExOTkwMSwxMTIsMTE5OTUzLDExMiwxMjAwMDUsMTEyLDEyMDA1NywxMTIsMTIwMTA5LDExMiwxMjAxNjEsMTEyLDEyMDIxMywxMTIsMTIwMjY1LDExMiwxMjAzMTcsMTEyLDEyMDM2OSwxMTIsMTIwNDIxLDExMiwxMjA0NzMsMTEyLDk2MSwxMTIsMTIwNTMwLDExMiwxMjA1NDQsMTEyLDEyMDU4OCwxMTIsMTIwNjAyLDExMiwxMjA2NDYsMTEyLDEyMDY2MCwxMTIsMTIwNzA0LDExMiwxMjA3MTgsMTEyLDEyMDc2MiwxMTIsMTIwNzc2LDExMiwxMTQyNywxMTIsNjUzMjgsODAsODQ3Myw4MCwxMTk4MjMsODAsMTE5ODc1LDgwLDExOTkyNyw4MCwxMTk5NzksODAsMTIwMDMxLDgwLDEyMDA4Myw4MCwxMjAxODcsODAsMTIwMjM5LDgwLDEyMDI5MSw4MCwxMjAzNDMsODAsMTIwMzk1LDgwLDEyMDQ0Nyw4MCw5MjksODAsMTIwNTA0LDgwLDEyMDU2Miw4MCwxMjA2MjAsODAsMTIwNjc4LDgwLDEyMDczNiw4MCwxMTQyNiw4MCw1MDkwLDgwLDUyMjksODAsNDIxOTMsODAsNjYxOTcsODAsMTE5ODUwLDExMywxMTk5MDIsMTEzLDExOTk1NCwxMTMsMTIwMDA2LDExMywxMjAwNTgsMTEzLDEyMDExMCwxMTMsMTIwMTYyLDExMywxMjAyMTQsMTEzLDEyMDI2NiwxMTMsMTIwMzE4LDExMywxMjAzNzAsMTEzLDEyMDQyMiwxMTMsMTIwNDc0LDExMywxMzA3LDExMywxMzc5LDExMywxMzgyLDExMyw4NDc0LDgxLDExOTgyNCw4MSwxMTk4NzYsODEsMTE5OTI4LDgxLDExOTk4MCw4MSwxMjAwMzIsODEsMTIwMDg0LDgxLDEyMDE4OCw4MSwxMjAyNDAsODEsMTIwMjkyLDgxLDEyMDM0NCw4MSwxMjAzOTYsODEsMTIwNDQ4LDgxLDExNjA1LDgxLDExOTg1MSwxMTQsMTE5OTAzLDExNCwxMTk5NTUsMTE0LDEyMDAwNywxMTQsMTIwMDU5LDExNCwxMjAxMTEsMTE0LDEyMDE2MywxMTQsMTIwMjE1LDExNCwxMjAyNjcsMTE0LDEyMDMxOSwxMTQsMTIwMzcxLDExNCwxMjA0MjMsMTE0LDEyMDQ3NSwxMTQsNDM4NDcsMTE0LDQzODQ4LDExNCw3NDYyLDExNCwxMTM5NywxMTQsNDM5MDUsMTE0LDExOTMxOCw4Miw4NDc1LDgyLDg0NzYsODIsODQ3Nyw4MiwxMTk4MjUsODIsMTE5ODc3LDgyLDExOTkyOSw4MiwxMjAwMzMsODIsMTIwMTg5LDgyLDEyMDI0MSw4MiwxMjAyOTMsODIsMTIwMzQ1LDgyLDEyMDM5Nyw4MiwxMjA0NDksODIsNDIyLDgyLDUwMjUsODIsNTA3NCw4Miw2Njc0MCw4Miw1NTExLDgyLDQyMjExLDgyLDk0MDA1LDgyLDY1MzYzLDExNSwxMTk4NTIsMTE1LDExOTkwNCwxMTUsMTE5OTU2LDExNSwxMjAwMDgsMTE1LDEyMDA2MCwxMTUsMTIwMTEyLDExNSwxMjAxNjQsMTE1LDEyMDIxNiwxMTUsMTIwMjY4LDExNSwxMjAzMjAsMTE1LDEyMDM3MiwxMTUsMTIwNDI0LDExNSwxMjA0NzYsMTE1LDQyODAxLDExNSw0NDUsMTE1LDExMDksMTE1LDQzOTQ2LDExNSw3MTg3MywxMTUsNjY2MzIsMTE1LDY1MzMxLDgzLDExOTgyNiw4MywxMTk4NzgsODMsMTE5OTMwLDgzLDExOTk4Miw4MywxMjAwMzQsODMsMTIwMDg2LDgzLDEyMDEzOCw4MywxMjAxOTAsODMsMTIwMjQyLDgzLDEyMDI5NCw4MywxMjAzNDYsODMsMTIwMzk4LDgzLDEyMDQ1MCw4MywxMDI5LDgzLDEzNTksODMsNTA3Nyw4Myw1MDgyLDgzLDQyMjEwLDgzLDk0MDEwLDgzLDY2MTk4LDgzLDY2NTkyLDgzLDExOTg1MywxMTYsMTE5OTA1LDExNiwxMTk5NTcsMTE2LDEyMDAwOSwxMTYsMTIwMDYxLDExNiwxMjAxMTMsMTE2LDEyMDE2NSwxMTYsMTIwMjE3LDExNiwxMjAyNjksMTE2LDEyMDMyMSwxMTYsMTIwMzczLDExNiwxMjA0MjUsMTE2LDEyMDQ3NywxMTYsODg2OCw4NCwxMDIwMSw4NCwxMjg4NzIsODQsNjUzMzIsODQsMTE5ODI3LDg0LDExOTg3OSw4NCwxMTk5MzEsODQsMTE5OTgzLDg0LDEyMDAzNSw4NCwxMjAwODcsODQsMTIwMTM5LDg0LDEyMDE5MSw4NCwxMjAyNDMsODQsMTIwMjk1LDg0LDEyMDM0Nyw4NCwxMjAzOTksODQsMTIwNDUxLDg0LDkzMiw4NCwxMjA1MDcsODQsMTIwNTY1LDg0LDEyMDYyMyw4NCwxMjA2ODEsODQsMTIwNzM5LDg0LDExNDMwLDg0LDUwMjYsODQsNDIxOTYsODQsOTM5NjIsODQsNzE4NjgsODQsNjYxOTksODQsNjYyMjUsODQsNjYzMjUsODQsMTE5ODU0LDExNywxMTk5MDYsMTE3LDExOTk1OCwxMTcsMTIwMDEwLDExNywxMjAwNjIsMTE3LDEyMDExNCwxMTcsMTIwMTY2LDExNywxMjAyMTgsMTE3LDEyMDI3MCwxMTcsMTIwMzIyLDExNywxMjAzNzQsMTE3LDEyMDQyNiwxMTcsMTIwNDc4LDExNyw0MjkxMSwxMTcsNzQ1MiwxMTcsNDM4NTQsMTE3LDQzODU4LDExNyw2NTEsMTE3LDk2NSwxMTcsMTIwNTM0LDExNywxMjA1OTIsMTE3LDEyMDY1MCwxMTcsMTIwNzA4LDExNywxMjA3NjYsMTE3LDE0MDUsMTE3LDY2ODA2LDExNyw3MTg5NiwxMTcsODc0Niw4NSw4ODk5LDg1LDExOTgyOCw4NSwxMTk4ODAsODUsMTE5OTMyLDg1LDExOTk4NCw4NSwxMjAwMzYsODUsMTIwMDg4LDg1LDEyMDE0MCw4NSwxMjAxOTIsODUsMTIwMjQ0LDg1LDEyMDI5Niw4NSwxMjAzNDgsODUsMTIwNDAwLDg1LDEyMDQ1Miw4NSwxMzU3LDg1LDQ2MDgsODUsNjY3NjYsODUsNTE5Niw4NSw0MjIyOCw4NSw5NDAxOCw4NSw3MTg2NCw4NSw4NzQ0LDExOCw4ODk3LDExOCw2NTM2NiwxMTgsODU2NCwxMTgsMTE5ODU1LDExOCwxMTk5MDcsMTE4LDExOTk1OSwxMTgsMTIwMDExLDExOCwxMjAwNjMsMTE4LDEyMDExNSwxMTgsMTIwMTY3LDExOCwxMjAyMTksMTE4LDEyMDI3MSwxMTgsMTIwMzIzLDExOCwxMjAzNzUsMTE4LDEyMDQyNywxMTgsMTIwNDc5LDExOCw3NDU2LDExOCw5NTcsMTE4LDEyMDUyNiwxMTgsMTIwNTg0LDExOCwxMjA2NDIsMTE4LDEyMDcwMCwxMTgsMTIwNzU4LDExOCwxMTQxLDExOCwxNDk2LDExOCw3MTQzMCwxMTgsNDM5NDUsMTE4LDcxODcyLDExOCwxMTkzMDksODYsMTYzOSw4NiwxNzgzLDg2LDg1NDgsODYsMTE5ODI5LDg2LDExOTg4MSw4NiwxMTk5MzMsODYsMTE5OTg1LDg2LDEyMDAzNyw4NiwxMjAwODksODYsMTIwMTQxLDg2LDEyMDE5Myw4NiwxMjAyNDUsODYsMTIwMjk3LDg2LDEyMDM0OSw4NiwxMjA0MDEsODYsMTIwNDUzLDg2LDExNDAsODYsMTE1NzYsODYsNTA4MSw4Niw1MTY3LDg2LDQyNzE5LDg2LDQyMjE0LDg2LDkzOTYwLDg2LDcxODQwLDg2LDY2ODQ1LDg2LDYyMywxMTksMTE5ODU2LDExOSwxMTk5MDgsMTE5LDExOTk2MCwxMTksMTIwMDEyLDExOSwxMjAwNjQsMTE5LDEyMDExNiwxMTksMTIwMTY4LDExOSwxMjAyMjAsMTE5LDEyMDI3MiwxMTksMTIwMzI0LDExOSwxMjAzNzYsMTE5LDEyMDQyOCwxMTksMTIwNDgwLDExOSw3NDU3LDExOSwxMTIxLDExOSwxMzA5LDExOSwxMzc3LDExOSw3MTQzNCwxMTksNzE0MzgsMTE5LDcxNDM5LDExOSw0MzkwNywxMTksNzE5MTksODcsNzE5MTAsODcsMTE5ODMwLDg3LDExOTg4Miw4NywxMTk5MzQsODcsMTE5OTg2LDg3LDEyMDAzOCw4NywxMjAwOTAsODcsMTIwMTQyLDg3LDEyMDE5NCw4NywxMjAyNDYsODcsMTIwMjk4LDg3LDEyMDM1MCw4NywxMjA0MDIsODcsMTIwNDU0LDg3LDEzMDgsODcsNTA0Myw4Nyw1MDc2LDg3LDQyMjE4LDg3LDU3NDIsMTIwLDEwNTM5LDEyMCwxMDU0MCwxMjAsMTA3OTksMTIwLDY1MzY4LDEyMCw4NTY5LDEyMCwxMTk4NTcsMTIwLDExOTkwOSwxMjAsMTE5OTYxLDEyMCwxMjAwMTMsMTIwLDEyMDA2NSwxMjAsMTIwMTE3LDEyMCwxMjAxNjksMTIwLDEyMDIyMSwxMjAsMTIwMjczLDEyMCwxMjAzMjUsMTIwLDEyMDM3NywxMjAsMTIwNDI5LDEyMCwxMjA0ODEsMTIwLDU0NDEsMTIwLDU1MDEsMTIwLDU3NDEsODgsOTU4Nyw4OCw2NjMzOCw4OCw3MTkxNiw4OCw2NTMzNiw4OCw4NTUzLDg4LDExOTgzMSw4OCwxMTk4ODMsODgsMTE5OTM1LDg4LDExOTk4Nyw4OCwxMjAwMzksODgsMTIwMDkxLDg4LDEyMDE0Myw4OCwxMjAxOTUsODgsMTIwMjQ3LDg4LDEyMDI5OSw4OCwxMjAzNTEsODgsMTIwNDAzLDg4LDEyMDQ1NSw4OCw0MjkzMSw4OCw5MzUsODgsMTIwNTEwLDg4LDEyMDU2OCw4OCwxMjA2MjYsODgsMTIwNjg0LDg4LDEyMDc0Miw4OCwxMTQzNiw4OCwxMTYxMyw4OCw1ODE1LDg4LDQyMjE5LDg4LDY2MTkyLDg4LDY2MjI4LDg4LDY2MzI3LDg4LDY2ODU1LDg4LDYxMSwxMjEsNzU2NCwxMjEsNjUzNjksMTIxLDExOTg1OCwxMjEsMTE5OTEwLDEyMSwxMTk5NjIsMTIxLDEyMDAxNCwxMjEsMTIwMDY2LDEyMSwxMjAxMTgsMTIxLDEyMDE3MCwxMjEsMTIwMjIyLDEyMSwxMjAyNzQsMTIxLDEyMDMyNiwxMjEsMTIwMzc4LDEyMSwxMjA0MzAsMTIxLDEyMDQ4MiwxMjEsNjU1LDEyMSw3OTM1LDEyMSw0Mzg2NiwxMjEsOTQ3LDEyMSw4NTA5LDEyMSwxMjA1MTYsMTIxLDEyMDU3NCwxMjEsMTIwNjMyLDEyMSwxMjA2OTAsMTIxLDEyMDc0OCwxMjEsMTE5OSwxMjEsNDMyNywxMjEsNzE5MDAsMTIxLDY1MzM3LDg5LDExOTgzMiw4OSwxMTk4ODQsODksMTE5OTM2LDg5LDExOTk4OCw4OSwxMjAwNDAsODksMTIwMDkyLDg5LDEyMDE0NCw4OSwxMjAxOTYsODksMTIwMjQ4LDg5LDEyMDMwMCw4OSwxMjAzNTIsODksMTIwNDA0LDg5LDEyMDQ1Niw4OSw5MzMsODksOTc4LDg5LDEyMDUwOCw4OSwxMjA1NjYsODksMTIwNjI0LDg5LDEyMDY4Miw4OSwxMjA3NDAsODksMTE0MzIsODksMTE5OCw4OSw1MDMzLDg5LDUwNTMsODksNDIyMjAsODksOTQwMTksODksNzE4NDQsODksNjYyMjYsODksMTE5ODU5LDEyMiwxMTk5MTEsMTIyLDExOTk2MywxMjIsMTIwMDE1LDEyMiwxMjAwNjcsMTIyLDEyMDExOSwxMjIsMTIwMTcxLDEyMiwxMjAyMjMsMTIyLDEyMDI3NSwxMjIsMTIwMzI3LDEyMiwxMjAzNzksMTIyLDEyMDQzMSwxMjIsMTIwNDgzLDEyMiw3NDU4LDEyMiw0MzkyMywxMjIsNzE4NzYsMTIyLDY2MjkzLDkwLDcxOTA5LDkwLDY1MzM4LDkwLDg0ODQsOTAsODQ4OCw5MCwxMTk4MzMsOTAsMTE5ODg1LDkwLDExOTkzNyw5MCwxMTk5ODksOTAsMTIwMDQxLDkwLDEyMDE5Nyw5MCwxMjAyNDksOTAsMTIwMzAxLDkwLDEyMDM1Myw5MCwxMjA0MDUsOTAsMTIwNDU3LDkwLDkxOCw5MCwxMjA0OTMsOTAsMTIwNTUxLDkwLDEyMDYwOSw5MCwxMjA2NjcsOTAsMTIwNzI1LDkwLDUwNTksOTAsNDIyMDQsOTAsNzE4NDksOTAsNjUyODIsMzQsNjUyODQsMzYsNjUyODUsMzcsNjUyODYsMzgsNjUyOTAsNDIsNjUyOTEsNDMsNjUyOTQsNDYsNjUyOTUsNDcsNjUyOTYsNDgsNjUyOTcsNDksNjUyOTgsNTAsNjUyOTksNTEsNjUzMDAsNTIsNjUzMDEsNTMsNjUzMDIsNTQsNjUzMDMsNTUsNjUzMDQsNTYsNjUzMDUsNTcsNjUzMDgsNjAsNjUzMDksNjEsNjUzMTAsNjIsNjUzMTIsNjQsNjUzMTYsNjgsNjUzMTgsNzAsNjUzMTksNzEsNjUzMjQsNzYsNjUzMjksODEsNjUzMzAsODIsNjUzMzMsODUsNjUzMzQsODYsNjUzMzUsODcsNjUzNDMsOTUsNjUzNDYsOTgsNjUzNDgsMTAwLDY1MzUwLDEwMiw2NTM1NSwxMDcsNjUzNTcsMTA5LDY1MzU4LDExMCw2NTM2MSwxMTMsNjUzNjIsMTE0LDY1MzY0LDExNiw2NTM2NSwxMTcsNjUzNjcsMTE5LDY1MzcwLDEyMiw2NTM3MSwxMjMsNjUzNzMsMTI1LDExOTg0NiwxMDldLCJfZGVmYXVsdCI6WzE2MCwzMiw4MjExLDQ1LDY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLCJjcyI6WzY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwiZGUiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sImVzIjpbODIxMSw0NSw2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sImZyIjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODI0NSw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sIml0IjpbMTYwLDMyLDgyMTEsNDUsNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLCJqYSI6WzgyMTEsNDUsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1MjkyLDQ0LDY1MzA3LDU5XSwia28iOls4MjExLDQ1LDY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sInBsIjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sInB0LUJSIjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sInFwcy1wbG9jIjpbMTYwLDMyLDgyMTEsNDUsNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sInJ1IjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywzMDUsMTA1LDkyMSw3MywxMDA5LDExMiwyMTUsMTIwLDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwidHIiOlsxNjAsMzIsODIxMSw0NSw2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwiemgtaGFucyI6WzY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4OCw0MCw2NTI4OSw0MV0sInpoLWhhbnQiOls4MjExLDQ1LDY1Mzc0LDEyNiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUzMDcsNTldfScpKSxiZS5jYWNoZT1uZXcgZGkoe2dldENhY2hlS2V5OkpTT04uc3RyaW5naWZ5fSx0PT57ZnVuY3Rpb24gbihoKXtjb25zdCBmPW5ldyBNYXA7Zm9yKGxldCBkPTA7ZDxoLmxlbmd0aDtkKz0yKWYuc2V0KGhbZF0saFtkKzFdKTtyZXR1cm4gZn1mdW5jdGlvbiByKGgsZil7Y29uc3QgZD1uZXcgTWFwKGgpO2Zvcihjb25zdFttLGddb2YgZilkLnNldChtLGcpO3JldHVybiBkfWZ1bmN0aW9uIHMoaCxmKXtpZighaClyZXR1cm4gZjtjb25zdCBkPW5ldyBNYXA7Zm9yKGNvbnN0W20sZ11vZiBoKWYuaGFzKG0pJiZkLnNldChtLGcpO3JldHVybiBkfWNvbnN0IGk9YmUuYW1iaWd1b3VzQ2hhcmFjdGVyRGF0YS52YWx1ZTtsZXQgbz10LmZpbHRlcihoPT4haC5zdGFydHNXaXRoKCJfIikmJmggaW4gaSk7by5sZW5ndGg9PT0wJiYobz1bIl9kZWZhdWx0Il0pO2xldCBsO2Zvcihjb25zdCBoIG9mIG8pe2NvbnN0IGY9bihpW2hdKTtsPXMobCxmKX1jb25zdCB1PW4oaS5fY29tbW9uKSxjPXIodSxsKTtyZXR1cm4gbmV3IGJlKGMpfSksYmUuX2xvY2FsZXM9bmV3IEZuKCgpPT5PYmplY3Qua2V5cyhiZS5hbWJpZ3VvdXNDaGFyYWN0ZXJEYXRhLnZhbHVlKS5maWx0ZXIodD0+IXQuc3RhcnRzV2l0aCgiXyIpKSk7bGV0IGV0PWJlO2NvbnN0IGplPWNsYXNzIGple3N0YXRpYyBnZXRSYXdEYXRhKCl7cmV0dXJuIEpTT04ucGFyc2UoIls5LDEwLDExLDEyLDEzLDMyLDEyNywxNjAsMTczLDg0NywxNTY0LDQ0NDcsNDQ0OCw2MDY4LDYwNjksNjE1NSw2MTU2LDYxNTcsNjE1OCw3MzU1LDczNTYsODE5Miw4MTkzLDgxOTQsODE5NSw4MTk2LDgxOTcsODE5OCw4MTk5LDgyMDAsODIwMSw4MjAyLDgyMDMsODIwNCw4MjA1LDgyMDYsODIwNyw4MjM0LDgyMzUsODIzNiw4MjM3LDgyMzgsODIzOSw4Mjg3LDgyODgsODI4OSw4MjkwLDgyOTEsODI5Miw4MjkzLDgyOTQsODI5NSw4Mjk2LDgyOTcsODI5OCw4Mjk5LDgzMDAsODMwMSw4MzAyLDgzMDMsMTAyNDAsMTIyODgsMTI2NDQsNjUwMjQsNjUwMjUsNjUwMjYsNjUwMjcsNjUwMjgsNjUwMjksNjUwMzAsNjUwMzEsNjUwMzIsNjUwMzMsNjUwMzQsNjUwMzUsNjUwMzYsNjUwMzcsNjUwMzgsNjUwMzksNjUyNzksNjU0NDAsNjU1MjAsNjU1MjEsNjU1MjIsNjU1MjMsNjU1MjQsNjU1MjUsNjU1MjYsNjU1MjcsNjU1MjgsNjU1MzIsNzg4NDQsMTE5MTU1LDExOTE1NiwxMTkxNTcsMTE5MTU4LDExOTE1OSwxMTkxNjAsMTE5MTYxLDExOTE2Miw5MTc1MDQsOTE3NTA1LDkxNzUwNiw5MTc1MDcsOTE3NTA4LDkxNzUwOSw5MTc1MTAsOTE3NTExLDkxNzUxMiw5MTc1MTMsOTE3NTE0LDkxNzUxNSw5MTc1MTYsOTE3NTE3LDkxNzUxOCw5MTc1MTksOTE3NTIwLDkxNzUyMSw5MTc1MjIsOTE3NTIzLDkxNzUyNCw5MTc1MjUsOTE3NTI2LDkxNzUyNyw5MTc1MjgsOTE3NTI5LDkxNzUzMCw5MTc1MzEsOTE3NTMyLDkxNzUzMyw5MTc1MzQsOTE3NTM1LDkxNzUzNiw5MTc1MzcsOTE3NTM4LDkxNzUzOSw5MTc1NDAsOTE3NTQxLDkxNzU0Miw5MTc1NDMsOTE3NTQ0LDkxNzU0NSw5MTc1NDYsOTE3NTQ3LDkxNzU0OCw5MTc1NDksOTE3NTUwLDkxNzU1MSw5MTc1NTIsOTE3NTUzLDkxNzU1NCw5MTc1NTUsOTE3NTU2LDkxNzU1Nyw5MTc1NTgsOTE3NTU5LDkxNzU2MCw5MTc1NjEsOTE3NTYyLDkxNzU2Myw5MTc1NjQsOTE3NTY1LDkxNzU2Niw5MTc1NjcsOTE3NTY4LDkxNzU2OSw5MTc1NzAsOTE3NTcxLDkxNzU3Miw5MTc1NzMsOTE3NTc0LDkxNzU3NSw5MTc1NzYsOTE3NTc3LDkxNzU3OCw5MTc1NzksOTE3NTgwLDkxNzU4MSw5MTc1ODIsOTE3NTgzLDkxNzU4NCw5MTc1ODUsOTE3NTg2LDkxNzU4Nyw5MTc1ODgsOTE3NTg5LDkxNzU5MCw5MTc1OTEsOTE3NTkyLDkxNzU5Myw5MTc1OTQsOTE3NTk1LDkxNzU5Niw5MTc1OTcsOTE3NTk4LDkxNzU5OSw5MTc2MDAsOTE3NjAxLDkxNzYwMiw5MTc2MDMsOTE3NjA0LDkxNzYwNSw5MTc2MDYsOTE3NjA3LDkxNzYwOCw5MTc2MDksOTE3NjEwLDkxNzYxMSw5MTc2MTIsOTE3NjEzLDkxNzYxNCw5MTc2MTUsOTE3NjE2LDkxNzYxNyw5MTc2MTgsOTE3NjE5LDkxNzYyMCw5MTc2MjEsOTE3NjIyLDkxNzYyMyw5MTc2MjQsOTE3NjI1LDkxNzYyNiw5MTc2MjcsOTE3NjI4LDkxNzYyOSw5MTc2MzAsOTE3NjMxLDkxNzc2MCw5MTc3NjEsOTE3NzYyLDkxNzc2Myw5MTc3NjQsOTE3NzY1LDkxNzc2Niw5MTc3NjcsOTE3NzY4LDkxNzc2OSw5MTc3NzAsOTE3NzcxLDkxNzc3Miw5MTc3NzMsOTE3Nzc0LDkxNzc3NSw5MTc3NzYsOTE3Nzc3LDkxNzc3OCw5MTc3NzksOTE3NzgwLDkxNzc4MSw5MTc3ODIsOTE3NzgzLDkxNzc4NCw5MTc3ODUsOTE3Nzg2LDkxNzc4Nyw5MTc3ODgsOTE3Nzg5LDkxNzc5MCw5MTc3OTEsOTE3NzkyLDkxNzc5Myw5MTc3OTQsOTE3Nzk1LDkxNzc5Niw5MTc3OTcsOTE3Nzk4LDkxNzc5OSw5MTc4MDAsOTE3ODAxLDkxNzgwMiw5MTc4MDMsOTE3ODA0LDkxNzgwNSw5MTc4MDYsOTE3ODA3LDkxNzgwOCw5MTc4MDksOTE3ODEwLDkxNzgxMSw5MTc4MTIsOTE3ODEzLDkxNzgxNCw5MTc4MTUsOTE3ODE2LDkxNzgxNyw5MTc4MTgsOTE3ODE5LDkxNzgyMCw5MTc4MjEsOTE3ODIyLDkxNzgyMyw5MTc4MjQsOTE3ODI1LDkxNzgyNiw5MTc4MjcsOTE3ODI4LDkxNzgyOSw5MTc4MzAsOTE3ODMxLDkxNzgzMiw5MTc4MzMsOTE3ODM0LDkxNzgzNSw5MTc4MzYsOTE3ODM3LDkxNzgzOCw5MTc4MzksOTE3ODQwLDkxNzg0MSw5MTc4NDIsOTE3ODQzLDkxNzg0NCw5MTc4NDUsOTE3ODQ2LDkxNzg0Nyw5MTc4NDgsOTE3ODQ5LDkxNzg1MCw5MTc4NTEsOTE3ODUyLDkxNzg1Myw5MTc4NTQsOTE3ODU1LDkxNzg1Niw5MTc4NTcsOTE3ODU4LDkxNzg1OSw5MTc4NjAsOTE3ODYxLDkxNzg2Miw5MTc4NjMsOTE3ODY0LDkxNzg2NSw5MTc4NjYsOTE3ODY3LDkxNzg2OCw5MTc4NjksOTE3ODcwLDkxNzg3MSw5MTc4NzIsOTE3ODczLDkxNzg3NCw5MTc4NzUsOTE3ODc2LDkxNzg3Nyw5MTc4NzgsOTE3ODc5LDkxNzg4MCw5MTc4ODEsOTE3ODgyLDkxNzg4Myw5MTc4ODQsOTE3ODg1LDkxNzg4Niw5MTc4ODcsOTE3ODg4LDkxNzg4OSw5MTc4OTAsOTE3ODkxLDkxNzg5Miw5MTc4OTMsOTE3ODk0LDkxNzg5NSw5MTc4OTYsOTE3ODk3LDkxNzg5OCw5MTc4OTksOTE3OTAwLDkxNzkwMSw5MTc5MDIsOTE3OTAzLDkxNzkwNCw5MTc5MDUsOTE3OTA2LDkxNzkwNyw5MTc5MDgsOTE3OTA5LDkxNzkxMCw5MTc5MTEsOTE3OTEyLDkxNzkxMyw5MTc5MTQsOTE3OTE1LDkxNzkxNiw5MTc5MTcsOTE3OTE4LDkxNzkxOSw5MTc5MjAsOTE3OTIxLDkxNzkyMiw5MTc5MjMsOTE3OTI0LDkxNzkyNSw5MTc5MjYsOTE3OTI3LDkxNzkyOCw5MTc5MjksOTE3OTMwLDkxNzkzMSw5MTc5MzIsOTE3OTMzLDkxNzkzNCw5MTc5MzUsOTE3OTM2LDkxNzkzNyw5MTc5MzgsOTE3OTM5LDkxNzk0MCw5MTc5NDEsOTE3OTQyLDkxNzk0Myw5MTc5NDQsOTE3OTQ1LDkxNzk0Niw5MTc5NDcsOTE3OTQ4LDkxNzk0OSw5MTc5NTAsOTE3OTUxLDkxNzk1Miw5MTc5NTMsOTE3OTU0LDkxNzk1NSw5MTc5NTYsOTE3OTU3LDkxNzk1OCw5MTc5NTksOTE3OTYwLDkxNzk2MSw5MTc5NjIsOTE3OTYzLDkxNzk2NCw5MTc5NjUsOTE3OTY2LDkxNzk2Nyw5MTc5NjgsOTE3OTY5LDkxNzk3MCw5MTc5NzEsOTE3OTcyLDkxNzk3Myw5MTc5NzQsOTE3OTc1LDkxNzk3Niw5MTc5NzcsOTE3OTc4LDkxNzk3OSw5MTc5ODAsOTE3OTgxLDkxNzk4Miw5MTc5ODMsOTE3OTg0LDkxNzk4NSw5MTc5ODYsOTE3OTg3LDkxNzk4OCw5MTc5ODksOTE3OTkwLDkxNzk5MSw5MTc5OTIsOTE3OTkzLDkxNzk5NCw5MTc5OTUsOTE3OTk2LDkxNzk5Nyw5MTc5OTgsOTE3OTk5XSIpfXN0YXRpYyBnZXREYXRhKCl7cmV0dXJuIHRoaXMuX2RhdGF8fCh0aGlzLl9kYXRhPW5ldyBTZXQoamUuZ2V0UmF3RGF0YSgpKSksdGhpcy5fZGF0YX1zdGF0aWMgaXNJbnZpc2libGVDaGFyYWN0ZXIodCl7cmV0dXJuIGplLmdldERhdGEoKS5oYXModCl9c3RhdGljIGdldCBjb2RlUG9pbnRzKCl7cmV0dXJuIGplLmdldERhdGEoKX19O2plLl9kYXRhPXZvaWQgMDtsZXQgdHQ9amUsVGU7Y29uc3QgWXQ9Z2xvYmFsVGhpcy52c2NvZGU7aWYodHlwZW9mIFl0PCJ1IiYmdHlwZW9mIFl0LnByb2Nlc3M8InUiKXtjb25zdCBlPVl0LnByb2Nlc3M7VGU9e2dldCBwbGF0Zm9ybSgpe3JldHVybiBlLnBsYXRmb3JtfSxnZXQgYXJjaCgpe3JldHVybiBlLmFyY2h9LGdldCBlbnYoKXtyZXR1cm4gZS5lbnZ9LGN3ZCgpe3JldHVybiBlLmN3ZCgpfX19ZWxzZSB0eXBlb2YgcHJvY2VzczwidSImJnR5cGVvZigoJHM9cHJvY2Vzcz09bnVsbD92b2lkIDA6cHJvY2Vzcy52ZXJzaW9ucyk9PW51bGw/dm9pZCAwOiRzLm5vZGUpPT0ic3RyaW5nIj9UZT17Z2V0IHBsYXRmb3JtKCl7cmV0dXJuIHByb2Nlc3MucGxhdGZvcm19LGdldCBhcmNoKCl7cmV0dXJuIHByb2Nlc3MuYXJjaH0sZ2V0IGVudigpe3JldHVybiBwcm9jZXNzLmVudn0sY3dkKCl7cmV0dXJuIHByb2Nlc3MuZW52LlZTQ09ERV9DV0R8fHByb2Nlc3MuY3dkKCl9fTpUZT17Z2V0IHBsYXRmb3JtKCl7cmV0dXJuIEtlPyJ3aW4zMiI6YWk/ImRhcndpbiI6ImxpbnV4In0sZ2V0IGFyY2goKXt9LGdldCBlbnYoKXtyZXR1cm57fX0sY3dkKCl7cmV0dXJuIi8ifX07Y29uc3QgYnQ9VGUuY3dkLE5pPVRlLmVudixTaT1UZS5wbGF0Zm9ybSxDaT02NSxBaT05NyxSaT05MCx5aT0xMjIsdmU9NDYsWT00NyxyZT05MixOZT01OCxFaT02MztjbGFzcyBUbiBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsbixyKXtsZXQgczt0eXBlb2Ygbj09InN0cmluZyImJm4uaW5kZXhPZigibm90ICIpPT09MD8ocz0ibXVzdCBub3QgYmUiLG49bi5yZXBsYWNlKC9ebm90IC8sIiIpKTpzPSJtdXN0IGJlIjtjb25zdCBpPXQuaW5kZXhPZigiLiIpIT09LTE/InByb3BlcnR5IjoiYXJndW1lbnQiO2xldCBvPWBUaGUgIiR7dH0iICR7aX0gJHtzfSBvZiB0eXBlICR7bn1gO28rPWAuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2Ygcn1gLHN1cGVyKG8pLHRoaXMuY29kZT0iRVJSX0lOVkFMSURfQVJHX1RZUEUifX1mdW5jdGlvbiBNaShlLHQpe2lmKGU9PT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IFRuKHQsIk9iamVjdCIsZSl9ZnVuY3Rpb24gaihlLHQpe2lmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBuZXcgVG4odCwic3RyaW5nIixlKX1jb25zdCBwZT1TaT09PSJ3aW4zMiI7ZnVuY3Rpb24gVChlKXtyZXR1cm4gZT09PVl8fGU9PT1yZX1mdW5jdGlvbiBKdChlKXtyZXR1cm4gZT09PVl9ZnVuY3Rpb24gU2UoZSl7cmV0dXJuIGU+PUNpJiZlPD1SaXx8ZT49QWkmJmU8PXlpfWZ1bmN0aW9uIHh0KGUsdCxuLHIpe2xldCBzPSIiLGk9MCxvPS0xLGw9MCx1PTA7Zm9yKGxldCBjPTA7Yzw9ZS5sZW5ndGg7KytjKXtpZihjPGUubGVuZ3RoKXU9ZS5jaGFyQ29kZUF0KGMpO2Vsc2V7aWYocih1KSlicmVhazt1PVl9aWYocih1KSl7aWYoIShvPT09Yy0xfHxsPT09MSkpaWYobD09PTIpe2lmKHMubGVuZ3RoPDJ8fGkhPT0yfHxzLmNoYXJDb2RlQXQocy5sZW5ndGgtMSkhPT12ZXx8cy5jaGFyQ29kZUF0KHMubGVuZ3RoLTIpIT09dmUpe2lmKHMubGVuZ3RoPjIpe2NvbnN0IGg9cy5sYXN0SW5kZXhPZihuKTtoPT09LTE/KHM9IiIsaT0wKToocz1zLnNsaWNlKDAsaCksaT1zLmxlbmd0aC0xLXMubGFzdEluZGV4T2YobikpLG89YyxsPTA7Y29udGludWV9ZWxzZSBpZihzLmxlbmd0aCE9PTApe3M9IiIsaT0wLG89YyxsPTA7Y29udGludWV9fXQmJihzKz1zLmxlbmd0aD4wP2Ake259Li5gOiIuLiIsaT0yKX1lbHNlIHMubGVuZ3RoPjA/cys9YCR7bn0ke2Uuc2xpY2UobysxLGMpfWA6cz1lLnNsaWNlKG8rMSxjKSxpPWMtby0xO289YyxsPTB9ZWxzZSB1PT09dmUmJmwhPT0tMT8rK2w6bD0tMX1yZXR1cm4gc31mdW5jdGlvbiBraShlKXtyZXR1cm4gZT9gJHtlWzBdPT09Ii4iPyIiOiIuIn0ke2V9YDoiIn1mdW5jdGlvbiBJbihlLHQpe01pKHQsInBhdGhPYmplY3QiKTtjb25zdCBuPXQuZGlyfHx0LnJvb3Qscj10LmJhc2V8fGAke3QubmFtZXx8IiJ9JHtraSh0LmV4dCl9YDtyZXR1cm4gbj9uPT09dC5yb290P2Ake259JHtyfWA6YCR7bn0ke2V9JHtyfWA6cn1jb25zdCBLPXtyZXNvbHZlKC4uLmUpe2xldCB0PSIiLG49IiIscj0hMTtmb3IobGV0IHM9ZS5sZW5ndGgtMTtzPj0tMTtzLS0pe2xldCBpO2lmKHM+PTApe2lmKGk9ZVtzXSxqKGksYHBhdGhzWyR7c31dYCksaS5sZW5ndGg9PT0wKWNvbnRpbnVlfWVsc2UgdC5sZW5ndGg9PT0wP2k9YnQoKTooaT1OaVtgPSR7dH1gXXx8YnQoKSwoaT09PXZvaWQgMHx8aS5zbGljZSgwLDIpLnRvTG93ZXJDYXNlKCkhPT10LnRvTG93ZXJDYXNlKCkmJmkuY2hhckNvZGVBdCgyKT09PXJlKSYmKGk9YCR7dH1cXGApKTtjb25zdCBvPWkubGVuZ3RoO2xldCBsPTAsdT0iIixjPSExO2NvbnN0IGg9aS5jaGFyQ29kZUF0KDApO2lmKG89PT0xKVQoaCkmJihsPTEsYz0hMCk7ZWxzZSBpZihUKGgpKWlmKGM9ITAsVChpLmNoYXJDb2RlQXQoMSkpKXtsZXQgZj0yLGQ9Zjtmb3IoO2Y8byYmIVQoaS5jaGFyQ29kZUF0KGYpKTspZisrO2lmKGY8byYmZiE9PWQpe2NvbnN0IG09aS5zbGljZShkLGYpO2ZvcihkPWY7ZjxvJiZUKGkuY2hhckNvZGVBdChmKSk7KWYrKztpZihmPG8mJmYhPT1kKXtmb3IoZD1mO2Y8byYmIVQoaS5jaGFyQ29kZUF0KGYpKTspZisrOyhmPT09b3x8ZiE9PWQpJiYodT1gXFxcXCR7bX1cXCR7aS5zbGljZShkLGYpfWAsbD1mKX19fWVsc2UgbD0xO2Vsc2UgU2UoaCkmJmkuY2hhckNvZGVBdCgxKT09PU5lJiYodT1pLnNsaWNlKDAsMiksbD0yLG8+MiYmVChpLmNoYXJDb2RlQXQoMikpJiYoYz0hMCxsPTMpKTtpZih1Lmxlbmd0aD4wKWlmKHQubGVuZ3RoPjApe2lmKHUudG9Mb3dlckNhc2UoKSE9PXQudG9Mb3dlckNhc2UoKSljb250aW51ZX1lbHNlIHQ9dTtpZihyKXtpZih0Lmxlbmd0aD4wKWJyZWFrfWVsc2UgaWYobj1gJHtpLnNsaWNlKGwpfVxcJHtufWAscj1jLGMmJnQubGVuZ3RoPjApYnJlYWt9cmV0dXJuIG49eHQobiwhciwiXFwiLFQpLHI/YCR7dH1cXCR7bn1gOmAke3R9JHtufWB8fCIuIn0sbm9ybWFsaXplKGUpe2ooZSwicGF0aCIpO2NvbnN0IHQ9ZS5sZW5ndGg7aWYodD09PTApcmV0dXJuIi4iO2xldCBuPTAscixzPSExO2NvbnN0IGk9ZS5jaGFyQ29kZUF0KDApO2lmKHQ9PT0xKXJldHVybiBKdChpKT8iXFwiOmU7aWYoVChpKSlpZihzPSEwLFQoZS5jaGFyQ29kZUF0KDEpKSl7bGV0IGw9Mix1PWw7Zm9yKDtsPHQmJiFUKGUuY2hhckNvZGVBdChsKSk7KWwrKztpZihsPHQmJmwhPT11KXtjb25zdCBjPWUuc2xpY2UodSxsKTtmb3IodT1sO2w8dCYmVChlLmNoYXJDb2RlQXQobCkpOylsKys7aWYobDx0JiZsIT09dSl7Zm9yKHU9bDtsPHQmJiFUKGUuY2hhckNvZGVBdChsKSk7KWwrKztpZihsPT09dClyZXR1cm5gXFxcXCR7Y31cXCR7ZS5zbGljZSh1KX1cXGA7bCE9PXUmJihyPWBcXFxcJHtjfVxcJHtlLnNsaWNlKHUsbCl9YCxuPWwpfX19ZWxzZSBuPTE7ZWxzZSBTZShpKSYmZS5jaGFyQ29kZUF0KDEpPT09TmUmJihyPWUuc2xpY2UoMCwyKSxuPTIsdD4yJiZUKGUuY2hhckNvZGVBdCgyKSkmJihzPSEwLG49MykpO2xldCBvPW48dD94dChlLnNsaWNlKG4pLCFzLCJcXCIsVCk6IiI7cmV0dXJuIG8ubGVuZ3RoPT09MCYmIXMmJihvPSIuIiksby5sZW5ndGg+MCYmVChlLmNoYXJDb2RlQXQodC0xKSkmJihvKz0iXFwiKSxyPT09dm9pZCAwP3M/YFxcJHtvfWA6bzpzP2Ake3J9XFwke299YDpgJHtyfSR7b31gfSxpc0Fic29sdXRlKGUpe2ooZSwicGF0aCIpO2NvbnN0IHQ9ZS5sZW5ndGg7aWYodD09PTApcmV0dXJuITE7Y29uc3Qgbj1lLmNoYXJDb2RlQXQoMCk7cmV0dXJuIFQobil8fHQ+MiYmU2UobikmJmUuY2hhckNvZGVBdCgxKT09PU5lJiZUKGUuY2hhckNvZGVBdCgyKSl9LGpvaW4oLi4uZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiIuIjtsZXQgdCxuO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7KytpKXtjb25zdCBvPWVbaV07aihvLCJwYXRoIiksby5sZW5ndGg+MCYmKHQ9PT12b2lkIDA/dD1uPW86dCs9YFxcJHtvfWApfWlmKHQ9PT12b2lkIDApcmV0dXJuIi4iO2xldCByPSEwLHM9MDtpZih0eXBlb2Ygbj09InN0cmluZyImJlQobi5jaGFyQ29kZUF0KDApKSl7KytzO2NvbnN0IGk9bi5sZW5ndGg7aT4xJiZUKG4uY2hhckNvZGVBdCgxKSkmJigrK3MsaT4yJiYoVChuLmNoYXJDb2RlQXQoMikpPysrczpyPSExKSl9aWYocil7Zm9yKDtzPHQubGVuZ3RoJiZUKHQuY2hhckNvZGVBdChzKSk7KXMrKztzPj0yJiYodD1gXFwke3Quc2xpY2Uocyl9YCl9cmV0dXJuIEsubm9ybWFsaXplKHQpfSxyZWxhdGl2ZShlLHQpe2lmKGooZSwiZnJvbSIpLGoodCwidG8iKSxlPT09dClyZXR1cm4iIjtjb25zdCBuPUsucmVzb2x2ZShlKSxyPUsucmVzb2x2ZSh0KTtpZihuPT09cnx8KGU9bi50b0xvd2VyQ2FzZSgpLHQ9ci50b0xvd2VyQ2FzZSgpLGU9PT10KSlyZXR1cm4iIjtsZXQgcz0wO2Zvcig7czxlLmxlbmd0aCYmZS5jaGFyQ29kZUF0KHMpPT09cmU7KXMrKztsZXQgaT1lLmxlbmd0aDtmb3IoO2ktMT5zJiZlLmNoYXJDb2RlQXQoaS0xKT09PXJlOylpLS07Y29uc3Qgbz1pLXM7bGV0IGw9MDtmb3IoO2w8dC5sZW5ndGgmJnQuY2hhckNvZGVBdChsKT09PXJlOylsKys7bGV0IHU9dC5sZW5ndGg7Zm9yKDt1LTE+bCYmdC5jaGFyQ29kZUF0KHUtMSk9PT1yZTspdS0tO2NvbnN0IGM9dS1sLGg9bzxjP286YztsZXQgZj0tMSxkPTA7Zm9yKDtkPGg7ZCsrKXtjb25zdCBnPWUuY2hhckNvZGVBdChzK2QpO2lmKGchPT10LmNoYXJDb2RlQXQobCtkKSlicmVhaztnPT09cmUmJihmPWQpfWlmKGQhPT1oKXtpZihmPT09LTEpcmV0dXJuIHJ9ZWxzZXtpZihjPmgpe2lmKHQuY2hhckNvZGVBdChsK2QpPT09cmUpcmV0dXJuIHIuc2xpY2UobCtkKzEpO2lmKGQ9PT0yKXJldHVybiByLnNsaWNlKGwrZCl9bz5oJiYoZS5jaGFyQ29kZUF0KHMrZCk9PT1yZT9mPWQ6ZD09PTImJihmPTMpKSxmPT09LTEmJihmPTApfWxldCBtPSIiO2ZvcihkPXMrZisxO2Q8PWk7KytkKShkPT09aXx8ZS5jaGFyQ29kZUF0KGQpPT09cmUpJiYobSs9bS5sZW5ndGg9PT0wPyIuLiI6IlxcLi4iKTtyZXR1cm4gbCs9ZixtLmxlbmd0aD4wP2Ake219JHtyLnNsaWNlKGwsdSl9YDooci5jaGFyQ29kZUF0KGwpPT09cmUmJisrbCxyLnNsaWNlKGwsdSkpfSx0b05hbWVzcGFjZWRQYXRoKGUpe2lmKHR5cGVvZiBlIT0ic3RyaW5nInx8ZS5sZW5ndGg9PT0wKXJldHVybiBlO2NvbnN0IHQ9Sy5yZXNvbHZlKGUpO2lmKHQubGVuZ3RoPD0yKXJldHVybiBlO2lmKHQuY2hhckNvZGVBdCgwKT09PXJlKXtpZih0LmNoYXJDb2RlQXQoMSk9PT1yZSl7Y29uc3Qgbj10LmNoYXJDb2RlQXQoMik7aWYobiE9PUVpJiZuIT09dmUpcmV0dXJuYFxcXFw/XFxVTkNcXCR7dC5zbGljZSgyKX1gfX1lbHNlIGlmKFNlKHQuY2hhckNvZGVBdCgwKSkmJnQuY2hhckNvZGVBdCgxKT09PU5lJiZ0LmNoYXJDb2RlQXQoMik9PT1yZSlyZXR1cm5gXFxcXD9cXCR7dH1gO3JldHVybiBlfSxkaXJuYW1lKGUpe2ooZSwicGF0aCIpO2NvbnN0IHQ9ZS5sZW5ndGg7aWYodD09PTApcmV0dXJuIi4iO2xldCBuPS0xLHI9MDtjb25zdCBzPWUuY2hhckNvZGVBdCgwKTtpZih0PT09MSlyZXR1cm4gVChzKT9lOiIuIjtpZihUKHMpKXtpZihuPXI9MSxUKGUuY2hhckNvZGVBdCgxKSkpe2xldCBsPTIsdT1sO2Zvcig7bDx0JiYhVChlLmNoYXJDb2RlQXQobCkpOylsKys7aWYobDx0JiZsIT09dSl7Zm9yKHU9bDtsPHQmJlQoZS5jaGFyQ29kZUF0KGwpKTspbCsrO2lmKGw8dCYmbCE9PXUpe2Zvcih1PWw7bDx0JiYhVChlLmNoYXJDb2RlQXQobCkpOylsKys7aWYobD09PXQpcmV0dXJuIGU7bCE9PXUmJihuPXI9bCsxKX19fX1lbHNlIFNlKHMpJiZlLmNoYXJDb2RlQXQoMSk9PT1OZSYmKG49dD4yJiZUKGUuY2hhckNvZGVBdCgyKSk/MzoyLHI9bik7bGV0IGk9LTEsbz0hMDtmb3IobGV0IGw9dC0xO2w+PXI7LS1sKWlmKFQoZS5jaGFyQ29kZUF0KGwpKSl7aWYoIW8pe2k9bDticmVha319ZWxzZSBvPSExO2lmKGk9PT0tMSl7aWYobj09PS0xKXJldHVybiIuIjtpPW59cmV0dXJuIGUuc2xpY2UoMCxpKX0sYmFzZW5hbWUoZSx0KXt0IT09dm9pZCAwJiZqKHQsInN1ZmZpeCIpLGooZSwicGF0aCIpO2xldCBuPTAscj0tMSxzPSEwLGk7aWYoZS5sZW5ndGg+PTImJlNlKGUuY2hhckNvZGVBdCgwKSkmJmUuY2hhckNvZGVBdCgxKT09PU5lJiYobj0yKSx0IT09dm9pZCAwJiZ0Lmxlbmd0aD4wJiZ0Lmxlbmd0aDw9ZS5sZW5ndGgpe2lmKHQ9PT1lKXJldHVybiIiO2xldCBvPXQubGVuZ3RoLTEsbD0tMTtmb3IoaT1lLmxlbmd0aC0xO2k+PW47LS1pKXtjb25zdCB1PWUuY2hhckNvZGVBdChpKTtpZihUKHUpKXtpZighcyl7bj1pKzE7YnJlYWt9fWVsc2UgbD09PS0xJiYocz0hMSxsPWkrMSksbz49MCYmKHU9PT10LmNoYXJDb2RlQXQobyk/LS1vPT09LTEmJihyPWkpOihvPS0xLHI9bCkpfXJldHVybiBuPT09cj9yPWw6cj09PS0xJiYocj1lLmxlbmd0aCksZS5zbGljZShuLHIpfWZvcihpPWUubGVuZ3RoLTE7aT49bjstLWkpaWYoVChlLmNoYXJDb2RlQXQoaSkpKXtpZighcyl7bj1pKzE7YnJlYWt9fWVsc2Ugcj09PS0xJiYocz0hMSxyPWkrMSk7cmV0dXJuIHI9PT0tMT8iIjplLnNsaWNlKG4scil9LGV4dG5hbWUoZSl7aihlLCJwYXRoIik7bGV0IHQ9MCxuPS0xLHI9MCxzPS0xLGk9ITAsbz0wO2UubGVuZ3RoPj0yJiZlLmNoYXJDb2RlQXQoMSk9PT1OZSYmU2UoZS5jaGFyQ29kZUF0KDApKSYmKHQ9cj0yKTtmb3IobGV0IGw9ZS5sZW5ndGgtMTtsPj10Oy0tbCl7Y29uc3QgdT1lLmNoYXJDb2RlQXQobCk7aWYoVCh1KSl7aWYoIWkpe3I9bCsxO2JyZWFrfWNvbnRpbnVlfXM9PT0tMSYmKGk9ITEscz1sKzEpLHU9PT12ZT9uPT09LTE/bj1sOm8hPT0xJiYobz0xKTpuIT09LTEmJihvPS0xKX1yZXR1cm4gbj09PS0xfHxzPT09LTF8fG89PT0wfHxvPT09MSYmbj09PXMtMSYmbj09PXIrMT8iIjplLnNsaWNlKG4scyl9LGZvcm1hdDpJbi5iaW5kKG51bGwsIlxcIikscGFyc2UoZSl7aihlLCJwYXRoIik7Y29uc3QgdD17cm9vdDoiIixkaXI6IiIsYmFzZToiIixleHQ6IiIsbmFtZToiIn07aWYoZS5sZW5ndGg9PT0wKXJldHVybiB0O2NvbnN0IG49ZS5sZW5ndGg7bGV0IHI9MCxzPWUuY2hhckNvZGVBdCgwKTtpZihuPT09MSlyZXR1cm4gVChzKT8odC5yb290PXQuZGlyPWUsdCk6KHQuYmFzZT10Lm5hbWU9ZSx0KTtpZihUKHMpKXtpZihyPTEsVChlLmNoYXJDb2RlQXQoMSkpKXtsZXQgZj0yLGQ9Zjtmb3IoO2Y8biYmIVQoZS5jaGFyQ29kZUF0KGYpKTspZisrO2lmKGY8biYmZiE9PWQpe2ZvcihkPWY7ZjxuJiZUKGUuY2hhckNvZGVBdChmKSk7KWYrKztpZihmPG4mJmYhPT1kKXtmb3IoZD1mO2Y8biYmIVQoZS5jaGFyQ29kZUF0KGYpKTspZisrO2Y9PT1uP3I9ZjpmIT09ZCYmKHI9ZisxKX19fX1lbHNlIGlmKFNlKHMpJiZlLmNoYXJDb2RlQXQoMSk9PT1OZSl7aWYobjw9MilyZXR1cm4gdC5yb290PXQuZGlyPWUsdDtpZihyPTIsVChlLmNoYXJDb2RlQXQoMikpKXtpZihuPT09MylyZXR1cm4gdC5yb290PXQuZGlyPWUsdDtyPTN9fXI+MCYmKHQucm9vdD1lLnNsaWNlKDAscikpO2xldCBpPS0xLG89cixsPS0xLHU9ITAsYz1lLmxlbmd0aC0xLGg9MDtmb3IoO2M+PXI7LS1jKXtpZihzPWUuY2hhckNvZGVBdChjKSxUKHMpKXtpZighdSl7bz1jKzE7YnJlYWt9Y29udGludWV9bD09PS0xJiYodT0hMSxsPWMrMSkscz09PXZlP2k9PT0tMT9pPWM6aCE9PTEmJihoPTEpOmkhPT0tMSYmKGg9LTEpfXJldHVybiBsIT09LTEmJihpPT09LTF8fGg9PT0wfHxoPT09MSYmaT09PWwtMSYmaT09PW8rMT90LmJhc2U9dC5uYW1lPWUuc2xpY2UobyxsKToodC5uYW1lPWUuc2xpY2UobyxpKSx0LmJhc2U9ZS5zbGljZShvLGwpLHQuZXh0PWUuc2xpY2UoaSxsKSkpLG8+MCYmbyE9PXI/dC5kaXI9ZS5zbGljZSgwLG8tMSk6dC5kaXI9dC5yb290LHR9LHNlcDoiXFwiLGRlbGltaXRlcjoiOyIsd2luMzI6bnVsbCxwb3NpeDpudWxsfSxQaT0oKCk9PntpZihwZSl7Y29uc3QgZT0vXFwvZztyZXR1cm4oKT0+e2NvbnN0IHQ9YnQoKS5yZXBsYWNlKGUsIi8iKTtyZXR1cm4gdC5zbGljZSh0LmluZGV4T2YoIi8iKSl9fXJldHVybigpPT5idCgpfSkoKSxlZT17cmVzb2x2ZSguLi5lKXtsZXQgdD0iIixuPSExO2ZvcihsZXQgcj1lLmxlbmd0aC0xO3I+PS0xJiYhbjtyLS0pe2NvbnN0IHM9cj49MD9lW3JdOlBpKCk7aihzLGBwYXRoc1ske3J9XWApLHMubGVuZ3RoIT09MCYmKHQ9YCR7c30vJHt0fWAsbj1zLmNoYXJDb2RlQXQoMCk9PT1ZKX1yZXR1cm4gdD14dCh0LCFuLCIvIixKdCksbj9gLyR7dH1gOnQubGVuZ3RoPjA/dDoiLiJ9LG5vcm1hbGl6ZShlKXtpZihqKGUsInBhdGgiKSxlLmxlbmd0aD09PTApcmV0dXJuIi4iO2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KDApPT09WSxuPWUuY2hhckNvZGVBdChlLmxlbmd0aC0xKT09PVk7cmV0dXJuIGU9eHQoZSwhdCwiLyIsSnQpLGUubGVuZ3RoPT09MD90PyIvIjpuPyIuLyI6Ii4iOihuJiYoZSs9Ii8iKSx0P2AvJHtlfWA6ZSl9LGlzQWJzb2x1dGUoZSl7cmV0dXJuIGooZSwicGF0aCIpLGUubGVuZ3RoPjAmJmUuY2hhckNvZGVBdCgwKT09PVl9LGpvaW4oLi4uZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiIuIjtsZXQgdDtmb3IobGV0IG49MDtuPGUubGVuZ3RoOysrbil7Y29uc3Qgcj1lW25dO2oociwicGF0aCIpLHIubGVuZ3RoPjAmJih0PT09dm9pZCAwP3Q9cjp0Kz1gLyR7cn1gKX1yZXR1cm4gdD09PXZvaWQgMD8iLiI6ZWUubm9ybWFsaXplKHQpfSxyZWxhdGl2ZShlLHQpe2lmKGooZSwiZnJvbSIpLGoodCwidG8iKSxlPT09dHx8KGU9ZWUucmVzb2x2ZShlKSx0PWVlLnJlc29sdmUodCksZT09PXQpKXJldHVybiIiO2NvbnN0IG49MSxyPWUubGVuZ3RoLHM9ci1uLGk9MSxvPXQubGVuZ3RoLWksbD1zPG8/czpvO2xldCB1PS0xLGM9MDtmb3IoO2M8bDtjKyspe2NvbnN0IGY9ZS5jaGFyQ29kZUF0KG4rYyk7aWYoZiE9PXQuY2hhckNvZGVBdChpK2MpKWJyZWFrO2Y9PT1ZJiYodT1jKX1pZihjPT09bClpZihvPmwpe2lmKHQuY2hhckNvZGVBdChpK2MpPT09WSlyZXR1cm4gdC5zbGljZShpK2MrMSk7aWYoYz09PTApcmV0dXJuIHQuc2xpY2UoaStjKX1lbHNlIHM+bCYmKGUuY2hhckNvZGVBdChuK2MpPT09WT91PWM6Yz09PTAmJih1PTApKTtsZXQgaD0iIjtmb3IoYz1uK3UrMTtjPD1yOysrYykoYz09PXJ8fGUuY2hhckNvZGVBdChjKT09PVkpJiYoaCs9aC5sZW5ndGg9PT0wPyIuLiI6Ii8uLiIpO3JldHVybmAke2h9JHt0LnNsaWNlKGkrdSl9YH0sdG9OYW1lc3BhY2VkUGF0aChlKXtyZXR1cm4gZX0sZGlybmFtZShlKXtpZihqKGUsInBhdGgiKSxlLmxlbmd0aD09PTApcmV0dXJuIi4iO2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KDApPT09WTtsZXQgbj0tMSxyPSEwO2ZvcihsZXQgcz1lLmxlbmd0aC0xO3M+PTE7LS1zKWlmKGUuY2hhckNvZGVBdChzKT09PVkpe2lmKCFyKXtuPXM7YnJlYWt9fWVsc2Ugcj0hMTtyZXR1cm4gbj09PS0xP3Q/Ii8iOiIuIjp0JiZuPT09MT8iLy8iOmUuc2xpY2UoMCxuKX0sYmFzZW5hbWUoZSx0KXt0IT09dm9pZCAwJiZqKHQsImV4dCIpLGooZSwicGF0aCIpO2xldCBuPTAscj0tMSxzPSEwLGk7aWYodCE9PXZvaWQgMCYmdC5sZW5ndGg+MCYmdC5sZW5ndGg8PWUubGVuZ3RoKXtpZih0PT09ZSlyZXR1cm4iIjtsZXQgbz10Lmxlbmd0aC0xLGw9LTE7Zm9yKGk9ZS5sZW5ndGgtMTtpPj0wOy0taSl7Y29uc3QgdT1lLmNoYXJDb2RlQXQoaSk7aWYodT09PVkpe2lmKCFzKXtuPWkrMTticmVha319ZWxzZSBsPT09LTEmJihzPSExLGw9aSsxKSxvPj0wJiYodT09PXQuY2hhckNvZGVBdChvKT8tLW89PT0tMSYmKHI9aSk6KG89LTEscj1sKSl9cmV0dXJuIG49PT1yP3I9bDpyPT09LTEmJihyPWUubGVuZ3RoKSxlLnNsaWNlKG4scil9Zm9yKGk9ZS5sZW5ndGgtMTtpPj0wOy0taSlpZihlLmNoYXJDb2RlQXQoaSk9PT1ZKXtpZighcyl7bj1pKzE7YnJlYWt9fWVsc2Ugcj09PS0xJiYocz0hMSxyPWkrMSk7cmV0dXJuIHI9PT0tMT8iIjplLnNsaWNlKG4scil9LGV4dG5hbWUoZSl7aihlLCJwYXRoIik7bGV0IHQ9LTEsbj0wLHI9LTEscz0hMCxpPTA7Zm9yKGxldCBvPWUubGVuZ3RoLTE7bz49MDstLW8pe2NvbnN0IGw9ZS5jaGFyQ29kZUF0KG8pO2lmKGw9PT1ZKXtpZighcyl7bj1vKzE7YnJlYWt9Y29udGludWV9cj09PS0xJiYocz0hMSxyPW8rMSksbD09PXZlP3Q9PT0tMT90PW86aSE9PTEmJihpPTEpOnQhPT0tMSYmKGk9LTEpfXJldHVybiB0PT09LTF8fHI9PT0tMXx8aT09PTB8fGk9PT0xJiZ0PT09ci0xJiZ0PT09bisxPyIiOmUuc2xpY2UodCxyKX0sZm9ybWF0OkluLmJpbmQobnVsbCwiLyIpLHBhcnNlKGUpe2ooZSwicGF0aCIpO2NvbnN0IHQ9e3Jvb3Q6IiIsZGlyOiIiLGJhc2U6IiIsZXh0OiIiLG5hbWU6IiJ9O2lmKGUubGVuZ3RoPT09MClyZXR1cm4gdDtjb25zdCBuPWUuY2hhckNvZGVBdCgwKT09PVk7bGV0IHI7bj8odC5yb290PSIvIixyPTEpOnI9MDtsZXQgcz0tMSxpPTAsbz0tMSxsPSEwLHU9ZS5sZW5ndGgtMSxjPTA7Zm9yKDt1Pj1yOy0tdSl7Y29uc3QgaD1lLmNoYXJDb2RlQXQodSk7aWYoaD09PVkpe2lmKCFsKXtpPXUrMTticmVha31jb250aW51ZX1vPT09LTEmJihsPSExLG89dSsxKSxoPT09dmU/cz09PS0xP3M9dTpjIT09MSYmKGM9MSk6cyE9PS0xJiYoYz0tMSl9aWYobyE9PS0xKXtjb25zdCBoPWk9PT0wJiZuPzE6aTtzPT09LTF8fGM9PT0wfHxjPT09MSYmcz09PW8tMSYmcz09PWkrMT90LmJhc2U9dC5uYW1lPWUuc2xpY2UoaCxvKToodC5uYW1lPWUuc2xpY2UoaCxzKSx0LmJhc2U9ZS5zbGljZShoLG8pLHQuZXh0PWUuc2xpY2UocyxvKSl9cmV0dXJuIGk+MD90LmRpcj1lLnNsaWNlKDAsaS0xKTpuJiYodC5kaXI9Ii8iKSx0fSxzZXA6Ii8iLGRlbGltaXRlcjoiOiIsd2luMzI6bnVsbCxwb3NpeDpudWxsfTtlZS53aW4zMj1LLndpbjMyPUssZWUucG9zaXg9Sy5wb3NpeD1lZSxwZT9LLm5vcm1hbGl6ZTplZS5ub3JtYWxpemU7Y29uc3QgRmk9cGU/Sy5qb2luOmVlLmpvaW47cGU/Sy5yZXNvbHZlOmVlLnJlc29sdmUscGU/Sy5yZWxhdGl2ZTplZS5yZWxhdGl2ZSxwZT9LLmRpcm5hbWU6ZWUuZGlybmFtZSxwZT9LLmJhc2VuYW1lOmVlLmJhc2VuYW1lLHBlP0suZXh0bmFtZTplZS5leHRuYW1lLHBlP0suc2VwOmVlLnNlcDtjb25zdCBEaT0vXlx3W1x3XGQrLi1dKiQvLFRpPS9eXC8vLElpPS9eXC9cLy87ZnVuY3Rpb24gVmkoZSx0KXtpZighZS5zY2hlbWUmJnQpdGhyb3cgbmV3IEVycm9yKGBbVXJpRXJyb3JdOiBTY2hlbWUgaXMgbWlzc2luZzoge3NjaGVtZTogIiIsIGF1dGhvcml0eTogIiR7ZS5hdXRob3JpdHl9IiwgcGF0aDogIiR7ZS5wYXRofSIsIHF1ZXJ5OiAiJHtlLnF1ZXJ5fSIsIGZyYWdtZW50OiAiJHtlLmZyYWdtZW50fSJ9YCk7aWYoZS5zY2hlbWUmJiFEaS50ZXN0KGUuc2NoZW1lKSl0aHJvdyBuZXcgRXJyb3IoIltVcmlFcnJvcl06IFNjaGVtZSBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMuIik7aWYoZS5wYXRoKXtpZihlLmF1dGhvcml0eSl7aWYoIVRpLnRlc3QoZS5wYXRoKSl0aHJvdyBuZXcgRXJyb3IoJ1tVcmlFcnJvcl06IElmIGEgVVJJIGNvbnRhaW5zIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY29tcG9uZW50IG11c3QgZWl0aGVyIGJlIGVtcHR5IG9yIGJlZ2luIHdpdGggYSBzbGFzaCAoIi8iKSBjaGFyYWN0ZXInKX1lbHNlIGlmKElpLnRlc3QoZS5wYXRoKSl0aHJvdyBuZXcgRXJyb3IoJ1tVcmlFcnJvcl06IElmIGEgVVJJIGRvZXMgbm90IGNvbnRhaW4gYW4gYXV0aG9yaXR5IGNvbXBvbmVudCwgdGhlbiB0aGUgcGF0aCBjYW5ub3QgYmVnaW4gd2l0aCB0d28gc2xhc2ggY2hhcmFjdGVycyAoIi8vIiknKX19ZnVuY3Rpb24gQmkoZSx0KXtyZXR1cm4hZSYmIXQ/ImZpbGUiOmV9ZnVuY3Rpb24gcWkoZSx0KXtzd2l0Y2goZSl7Y2FzZSJodHRwcyI6Y2FzZSJodHRwIjpjYXNlImZpbGUiOnQ/dFswXSE9PWZlJiYodD1mZSt0KTp0PWZlO2JyZWFrfXJldHVybiB0fWNvbnN0IFc9IiIsZmU9Ii8iLFVpPS9eKChbXjovPyNdKz8pOik/KFwvXC8oW14vPyNdKikpPyhbXj8jXSopKFw/KFteI10qKSk/KCMoLiopKT8vO2NsYXNzIHNle3N0YXRpYyBpc1VyaSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHNlPyEwOnQ/dHlwZW9mIHQuYXV0aG9yaXR5PT0ic3RyaW5nIiYmdHlwZW9mIHQuZnJhZ21lbnQ9PSJzdHJpbmciJiZ0eXBlb2YgdC5wYXRoPT0ic3RyaW5nIiYmdHlwZW9mIHQucXVlcnk9PSJzdHJpbmciJiZ0eXBlb2YgdC5zY2hlbWU9PSJzdHJpbmciJiZ0eXBlb2YgdC5mc1BhdGg9PSJzdHJpbmciJiZ0eXBlb2YgdC53aXRoPT0iZnVuY3Rpb24iJiZ0eXBlb2YgdC50b1N0cmluZz09ImZ1bmN0aW9uIjohMX1jb25zdHJ1Y3Rvcih0LG4scixzLGksbz0hMSl7dHlwZW9mIHQ9PSJvYmplY3QiPyh0aGlzLnNjaGVtZT10LnNjaGVtZXx8Vyx0aGlzLmF1dGhvcml0eT10LmF1dGhvcml0eXx8Vyx0aGlzLnBhdGg9dC5wYXRofHxXLHRoaXMucXVlcnk9dC5xdWVyeXx8Vyx0aGlzLmZyYWdtZW50PXQuZnJhZ21lbnR8fFcpOih0aGlzLnNjaGVtZT1CaSh0LG8pLHRoaXMuYXV0aG9yaXR5PW58fFcsdGhpcy5wYXRoPXFpKHRoaXMuc2NoZW1lLHJ8fFcpLHRoaXMucXVlcnk9c3x8Vyx0aGlzLmZyYWdtZW50PWl8fFcsVmkodGhpcyxvKSl9Z2V0IGZzUGF0aCgpe3JldHVybiBadCh0aGlzLCExKX13aXRoKHQpe2lmKCF0KXJldHVybiB0aGlzO2xldHtzY2hlbWU6bixhdXRob3JpdHk6cixwYXRoOnMscXVlcnk6aSxmcmFnbWVudDpvfT10O3JldHVybiBuPT09dm9pZCAwP249dGhpcy5zY2hlbWU6bj09PW51bGwmJihuPVcpLHI9PT12b2lkIDA/cj10aGlzLmF1dGhvcml0eTpyPT09bnVsbCYmKHI9Vykscz09PXZvaWQgMD9zPXRoaXMucGF0aDpzPT09bnVsbCYmKHM9VyksaT09PXZvaWQgMD9pPXRoaXMucXVlcnk6aT09PW51bGwmJihpPVcpLG89PT12b2lkIDA/bz10aGlzLmZyYWdtZW50Om89PT1udWxsJiYobz1XKSxuPT09dGhpcy5zY2hlbWUmJnI9PT10aGlzLmF1dGhvcml0eSYmcz09PXRoaXMucGF0aCYmaT09PXRoaXMucXVlcnkmJm89PT10aGlzLmZyYWdtZW50P3RoaXM6bmV3IEllKG4scixzLGksbyl9c3RhdGljIHBhcnNlKHQsbj0hMSl7Y29uc3Qgcj1VaS5leGVjKHQpO3JldHVybiByP25ldyBJZShyWzJdfHxXLHB0KHJbNF18fFcpLHB0KHJbNV18fFcpLHB0KHJbN118fFcpLHB0KHJbOV18fFcpLG4pOm5ldyBJZShXLFcsVyxXLFcpfXN0YXRpYyBmaWxlKHQpe2xldCBuPVc7aWYoS2UmJih0PXQucmVwbGFjZSgvXFwvZyxmZSkpLHRbMF09PT1mZSYmdFsxXT09PWZlKXtjb25zdCByPXQuaW5kZXhPZihmZSwyKTtyPT09LTE/KG49dC5zdWJzdHJpbmcoMiksdD1mZSk6KG49dC5zdWJzdHJpbmcoMixyKSx0PXQuc3Vic3RyaW5nKHIpfHxmZSl9cmV0dXJuIG5ldyBJZSgiZmlsZSIsbix0LFcsVyl9c3RhdGljIGZyb20odCxuKXtyZXR1cm4gbmV3IEllKHQuc2NoZW1lLHQuYXV0aG9yaXR5LHQucGF0aCx0LnF1ZXJ5LHQuZnJhZ21lbnQsbil9c3RhdGljIGpvaW5QYXRoKHQsLi4ubil7aWYoIXQucGF0aCl0aHJvdyBuZXcgRXJyb3IoIltVcmlFcnJvcl06IGNhbm5vdCBjYWxsIGpvaW5QYXRoIG9uIFVSSSB3aXRob3V0IHBhdGgiKTtsZXQgcjtyZXR1cm4gS2UmJnQuc2NoZW1lPT09ImZpbGUiP3I9c2UuZmlsZShLLmpvaW4oWnQodCwhMCksLi4ubikpLnBhdGg6cj1lZS5qb2luKHQucGF0aCwuLi5uKSx0LndpdGgoe3BhdGg6cn0pfXRvU3RyaW5nKHQ9ITEpe3JldHVybiBLdCh0aGlzLHQpfXRvSlNPTigpe3JldHVybiB0aGlzfXN0YXRpYyByZXZpdmUodCl7aWYodCl7aWYodCBpbnN0YW5jZW9mIHNlKXJldHVybiB0O3tjb25zdCBuPW5ldyBJZSh0KTtyZXR1cm4gbi5fZm9ybWF0dGVkPXQuZXh0ZXJuYWw/P251bGwsbi5fZnNQYXRoPXQuX3NlcD09PVZuP3QuZnNQYXRoPz9udWxsOm51bGwsbn19ZWxzZSByZXR1cm4gdH19Y29uc3QgVm49S2U/MTp2b2lkIDA7Y2xhc3MgSWUgZXh0ZW5kcyBzZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fZm9ybWF0dGVkPW51bGwsdGhpcy5fZnNQYXRoPW51bGx9Z2V0IGZzUGF0aCgpe3JldHVybiB0aGlzLl9mc1BhdGh8fCh0aGlzLl9mc1BhdGg9WnQodGhpcywhMSkpLHRoaXMuX2ZzUGF0aH10b1N0cmluZyh0PSExKXtyZXR1cm4gdD9LdCh0aGlzLCEwKToodGhpcy5fZm9ybWF0dGVkfHwodGhpcy5fZm9ybWF0dGVkPUt0KHRoaXMsITEpKSx0aGlzLl9mb3JtYXR0ZWQpfXRvSlNPTigpe2NvbnN0IHQ9eyRtaWQ6MX07cmV0dXJuIHRoaXMuX2ZzUGF0aCYmKHQuZnNQYXRoPXRoaXMuX2ZzUGF0aCx0Ll9zZXA9Vm4pLHRoaXMuX2Zvcm1hdHRlZCYmKHQuZXh0ZXJuYWw9dGhpcy5fZm9ybWF0dGVkKSx0aGlzLnBhdGgmJih0LnBhdGg9dGhpcy5wYXRoKSx0aGlzLnNjaGVtZSYmKHQuc2NoZW1lPXRoaXMuc2NoZW1lKSx0aGlzLmF1dGhvcml0eSYmKHQuYXV0aG9yaXR5PXRoaXMuYXV0aG9yaXR5KSx0aGlzLnF1ZXJ5JiYodC5xdWVyeT10aGlzLnF1ZXJ5KSx0aGlzLmZyYWdtZW50JiYodC5mcmFnbWVudD10aGlzLmZyYWdtZW50KSx0fX1jb25zdCBCbj17NTg6IiUzQSIsNDc6IiUyRiIsNjM6IiUzRiIsMzU6IiUyMyIsOTE6IiU1QiIsOTM6IiU1RCIsNjQ6IiU0MCIsMzM6IiUyMSIsMzY6IiUyNCIsMzg6IiUyNiIsMzk6IiUyNyIsNDA6IiUyOCIsNDE6IiUyOSIsNDI6IiUyQSIsNDM6IiUyQiIsNDQ6IiUyQyIsNTk6IiUzQiIsNjE6IiUzRCIsMzI6IiUyMCJ9O2Z1bmN0aW9uIHFuKGUsdCxuKXtsZXQgcixzPS0xO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtjb25zdCBvPWUuY2hhckNvZGVBdChpKTtpZihvPj05NyYmbzw9MTIyfHxvPj02NSYmbzw9OTB8fG8+PTQ4JiZvPD01N3x8bz09PTQ1fHxvPT09NDZ8fG89PT05NXx8bz09PTEyNnx8dCYmbz09PTQ3fHxuJiZvPT09OTF8fG4mJm89PT05M3x8biYmbz09PTU4KXMhPT0tMSYmKHIrPWVuY29kZVVSSUNvbXBvbmVudChlLnN1YnN0cmluZyhzLGkpKSxzPS0xKSxyIT09dm9pZCAwJiYocis9ZS5jaGFyQXQoaSkpO2Vsc2V7cj09PXZvaWQgMCYmKHI9ZS5zdWJzdHIoMCxpKSk7Y29uc3QgbD1CbltvXTtsIT09dm9pZCAwPyhzIT09LTEmJihyKz1lbmNvZGVVUklDb21wb25lbnQoZS5zdWJzdHJpbmcocyxpKSkscz0tMSkscis9bCk6cz09PS0xJiYocz1pKX19cmV0dXJuIHMhPT0tMSYmKHIrPWVuY29kZVVSSUNvbXBvbmVudChlLnN1YnN0cmluZyhzKSkpLHIhPT12b2lkIDA/cjplfWZ1bmN0aW9uICRpKGUpe2xldCB0O2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCByPWUuY2hhckNvZGVBdChuKTtyPT09MzV8fHI9PT02Mz8odD09PXZvaWQgMCYmKHQ9ZS5zdWJzdHIoMCxuKSksdCs9Qm5bcl0pOnQhPT12b2lkIDAmJih0Kz1lW25dKX1yZXR1cm4gdCE9PXZvaWQgMD90OmV9ZnVuY3Rpb24gWnQoZSx0KXtsZXQgbjtyZXR1cm4gZS5hdXRob3JpdHkmJmUucGF0aC5sZW5ndGg+MSYmZS5zY2hlbWU9PT0iZmlsZSI/bj1gLy8ke2UuYXV0aG9yaXR5fSR7ZS5wYXRofWA6ZS5wYXRoLmNoYXJDb2RlQXQoMCk9PT00NyYmKGUucGF0aC5jaGFyQ29kZUF0KDEpPj02NSYmZS5wYXRoLmNoYXJDb2RlQXQoMSk8PTkwfHxlLnBhdGguY2hhckNvZGVBdCgxKT49OTcmJmUucGF0aC5jaGFyQ29kZUF0KDEpPD0xMjIpJiZlLnBhdGguY2hhckNvZGVBdCgyKT09PTU4P3Q/bj1lLnBhdGguc3Vic3RyKDEpOm49ZS5wYXRoWzFdLnRvTG93ZXJDYXNlKCkrZS5wYXRoLnN1YnN0cigyKTpuPWUucGF0aCxLZSYmKG49bi5yZXBsYWNlKC9cLy9nLCJcXCIpKSxufWZ1bmN0aW9uIEt0KGUsdCl7Y29uc3Qgbj10PyRpOnFuO2xldCByPSIiLHtzY2hlbWU6cyxhdXRob3JpdHk6aSxwYXRoOm8scXVlcnk6bCxmcmFnbWVudDp1fT1lO2lmKHMmJihyKz1zLHIrPSI6IiksKGl8fHM9PT0iZmlsZSIpJiYocis9ZmUscis9ZmUpLGkpe2xldCBjPWkuaW5kZXhPZigiQCIpO2lmKGMhPT0tMSl7Y29uc3QgaD1pLnN1YnN0cigwLGMpO2k9aS5zdWJzdHIoYysxKSxjPWgubGFzdEluZGV4T2YoIjoiKSxjPT09LTE/cis9bihoLCExLCExKToocis9bihoLnN1YnN0cigwLGMpLCExLCExKSxyKz0iOiIscis9bihoLnN1YnN0cihjKzEpLCExLCEwKSkscis9IkAifWk9aS50b0xvd2VyQ2FzZSgpLGM9aS5sYXN0SW5kZXhPZigiOiIpLGM9PT0tMT9yKz1uKGksITEsITApOihyKz1uKGkuc3Vic3RyKDAsYyksITEsITApLHIrPWkuc3Vic3RyKGMpKX1pZihvKXtpZihvLmxlbmd0aD49MyYmby5jaGFyQ29kZUF0KDApPT09NDcmJm8uY2hhckNvZGVBdCgyKT09PTU4KXtjb25zdCBjPW8uY2hhckNvZGVBdCgxKTtjPj02NSYmYzw9OTAmJihvPWAvJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGMrMzIpfToke28uc3Vic3RyKDMpfWApfWVsc2UgaWYoby5sZW5ndGg+PTImJm8uY2hhckNvZGVBdCgxKT09PTU4KXtjb25zdCBjPW8uY2hhckNvZGVBdCgwKTtjPj02NSYmYzw9OTAmJihvPWAke1N0cmluZy5mcm9tQ2hhckNvZGUoYyszMil9OiR7by5zdWJzdHIoMil9YCl9cis9bihvLCEwLCExKX1yZXR1cm4gbCYmKHIrPSI/IixyKz1uKGwsITEsITEpKSx1JiYocis9IiMiLHIrPXQ/dTpxbih1LCExLCExKSkscn1mdW5jdGlvbiBVbihlKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlKX1jYXRjaHtyZXR1cm4gZS5sZW5ndGg+Mz9lLnN1YnN0cigwLDMpK1VuKGUuc3Vic3RyKDMpKTplfX1jb25zdCAkbj0vKCVbMC05QS1aYS16XVswLTlBLVphLXpdKSsvZztmdW5jdGlvbiBwdChlKXtyZXR1cm4gZS5tYXRjaCgkbik/ZS5yZXBsYWNlKCRuLHQ9PlVuKHQpKTplfXZhciBDZTsoZnVuY3Rpb24oZSl7ZS5pbk1lbW9yeT0iaW5tZW1vcnkiLGUudnNjb2RlPSJ2c2NvZGUiLGUuaW50ZXJuYWw9InByaXZhdGUiLGUud2Fsa1Rocm91Z2g9IndhbGtUaHJvdWdoIixlLndhbGtUaHJvdWdoU25pcHBldD0id2Fsa1Rocm91Z2hTbmlwcGV0IixlLmh0dHA9Imh0dHAiLGUuaHR0cHM9Imh0dHBzIixlLmZpbGU9ImZpbGUiLGUubWFpbHRvPSJtYWlsdG8iLGUudW50aXRsZWQ9InVudGl0bGVkIixlLmRhdGE9ImRhdGEiLGUuY29tbWFuZD0iY29tbWFuZCIsZS52c2NvZGVSZW1vdGU9InZzY29kZS1yZW1vdGUiLGUudnNjb2RlUmVtb3RlUmVzb3VyY2U9InZzY29kZS1yZW1vdGUtcmVzb3VyY2UiLGUudnNjb2RlTWFuYWdlZFJlbW90ZVJlc291cmNlPSJ2c2NvZGUtbWFuYWdlZC1yZW1vdGUtcmVzb3VyY2UiLGUudnNjb2RlVXNlckRhdGE9InZzY29kZS11c2VyZGF0YSIsZS52c2NvZGVDdXN0b21FZGl0b3I9InZzY29kZS1jdXN0b20tZWRpdG9yIixlLnZzY29kZU5vdGVib29rQ2VsbD0idnNjb2RlLW5vdGVib29rLWNlbGwiLGUudnNjb2RlTm90ZWJvb2tDZWxsTWV0YWRhdGE9InZzY29kZS1ub3RlYm9vay1jZWxsLW1ldGFkYXRhIixlLnZzY29kZU5vdGVib29rQ2VsbE1ldGFkYXRhRGlmZj0idnNjb2RlLW5vdGVib29rLWNlbGwtbWV0YWRhdGEtZGlmZiIsZS52c2NvZGVOb3RlYm9va0NlbGxPdXRwdXQ9InZzY29kZS1ub3RlYm9vay1jZWxsLW91dHB1dCIsZS52c2NvZGVOb3RlYm9va0NlbGxPdXRwdXREaWZmPSJ2c2NvZGUtbm90ZWJvb2stY2VsbC1vdXRwdXQtZGlmZiIsZS52c2NvZGVOb3RlYm9va01ldGFkYXRhPSJ2c2NvZGUtbm90ZWJvb2stbWV0YWRhdGEiLGUudnNjb2RlSW50ZXJhY3RpdmVJbnB1dD0idnNjb2RlLWludGVyYWN0aXZlLWlucHV0IixlLnZzY29kZVNldHRpbmdzPSJ2c2NvZGUtc2V0dGluZ3MiLGUudnNjb2RlV29ya3NwYWNlVHJ1c3Q9InZzY29kZS13b3Jrc3BhY2UtdHJ1c3QiLGUudnNjb2RlVGVybWluYWw9InZzY29kZS10ZXJtaW5hbCIsZS52c2NvZGVDaGF0Q29kZUJsb2NrPSJ2c2NvZGUtY2hhdC1jb2RlLWJsb2NrIixlLnZzY29kZUNoYXRDb2RlQ29tcGFyZUJsb2NrPSJ2c2NvZGUtY2hhdC1jb2RlLWNvbXBhcmUtYmxvY2siLGUudnNjb2RlQ2hhdFNlc3NzaW9uPSJ2c2NvZGUtY2hhdC1lZGl0b3IiLGUud2Vidmlld1BhbmVsPSJ3ZWJ2aWV3LXBhbmVsIixlLnZzY29kZVdlYnZpZXc9InZzY29kZS13ZWJ2aWV3IixlLmV4dGVuc2lvbj0iZXh0ZW5zaW9uIixlLnZzY29kZUZpbGVSZXNvdXJjZT0idnNjb2RlLWZpbGUiLGUudG1wPSJ0bXAiLGUudnNscz0idnNscyIsZS52c2NvZGVTb3VyY2VDb250cm9sPSJ2c2NvZGUtc2NtIixlLmNvbW1lbnRzSW5wdXQ9ImNvbW1lbnQiLGUuY29kZVNldHRpbmc9ImNvZGUtc2V0dGluZyIsZS5vdXRwdXRDaGFubmVsPSJvdXRwdXQifSkoQ2V8fChDZT17fSkpO2NvbnN0IEhpPSJ0a24iO2NsYXNzIFdpe2NvbnN0cnVjdG9yKCl7dGhpcy5faG9zdHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9wb3J0cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2Nvbm5lY3Rpb25Ub2tlbnM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9wcmVmZXJyZWRXZWJTY2hlbWE9Imh0dHAiLHRoaXMuX2RlbGVnYXRlPW51bGwsdGhpcy5fc2VydmVyUm9vdFBhdGg9Ii8ifXNldFByZWZlcnJlZFdlYlNjaGVtYSh0KXt0aGlzLl9wcmVmZXJyZWRXZWJTY2hlbWE9dH1nZXQgX3JlbW90ZVJlc291cmNlc1BhdGgoKXtyZXR1cm4gZWUuam9pbih0aGlzLl9zZXJ2ZXJSb290UGF0aCxDZS52c2NvZGVSZW1vdGVSZXNvdXJjZSl9cmV3cml0ZSh0KXtpZih0aGlzLl9kZWxlZ2F0ZSl0cnl7cmV0dXJuIHRoaXMuX2RlbGVnYXRlKHQpfWNhdGNoKGwpe3JldHVybiBKZShsKSx0fWNvbnN0IG49dC5hdXRob3JpdHk7bGV0IHI9dGhpcy5faG9zdHNbbl07ciYmci5pbmRleE9mKCI6IikhPT0tMSYmci5pbmRleE9mKCJbIik9PT0tMSYmKHI9YFske3J9XWApO2NvbnN0IHM9dGhpcy5fcG9ydHNbbl0saT10aGlzLl9jb25uZWN0aW9uVG9rZW5zW25dO2xldCBvPWBwYXRoPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHQucGF0aCl9YDtyZXR1cm4gdHlwZW9mIGk9PSJzdHJpbmciJiYobys9YCYke0hpfT0ke2VuY29kZVVSSUNvbXBvbmVudChpKX1gKSxzZS5mcm9tKHtzY2hlbWU6bGk/dGhpcy5fcHJlZmVycmVkV2ViU2NoZW1hOkNlLnZzY29kZVJlbW90ZVJlc291cmNlLGF1dGhvcml0eTpgJHtyfToke3N9YCxwYXRoOnRoaXMuX3JlbW90ZVJlc291cmNlc1BhdGgscXVlcnk6b30pfX1jb25zdCB6aT1uZXcgV2ksT2k9InZzY29kZS1hcHAiLGx0PWNsYXNzIGx0e2FzQnJvd3NlclVyaSh0KXtjb25zdCBuPXRoaXMudG9VcmkodCk7cmV0dXJuIHRoaXMudXJpVG9Ccm93c2VyVXJpKG4pfXVyaVRvQnJvd3NlclVyaSh0KXtyZXR1cm4gdC5zY2hlbWU9PT1DZS52c2NvZGVSZW1vdGU/emkucmV3cml0ZSh0KTp0LnNjaGVtZT09PUNlLmZpbGUmJihvaXx8dWk9PT1gJHtDZS52c2NvZGVGaWxlUmVzb3VyY2V9Oi8vJHtsdC5GQUxMQkFDS19BVVRIT1JJVFl9YCk/dC53aXRoKHtzY2hlbWU6Q2UudnNjb2RlRmlsZVJlc291cmNlLGF1dGhvcml0eTp0LmF1dGhvcml0eXx8bHQuRkFMTEJBQ0tfQVVUSE9SSVRZLHF1ZXJ5Om51bGwsZnJhZ21lbnQ6bnVsbH0pOnR9dG9VcmkodCxuKXtpZihzZS5pc1VyaSh0KSlyZXR1cm4gdDtpZihnbG9iYWxUaGlzLl9WU0NPREVfRklMRV9ST09UKXtjb25zdCByPWdsb2JhbFRoaXMuX1ZTQ09ERV9GSUxFX1JPT1Q7aWYoL15cd1tcd1xkKy4tXSo6XC9cLy8udGVzdChyKSlyZXR1cm4gc2Uuam9pblBhdGgoc2UucGFyc2UociwhMCksdCk7Y29uc3Qgcz1GaShyLHQpO3JldHVybiBzZS5maWxlKHMpfXJldHVybiBzZS5wYXJzZShuLnRvVXJsKHQpKX19O2x0LkZBTExCQUNLX0FVVEhPUklUWT1PaTtsZXQgZW49bHQ7Y29uc3QgSG49bmV3IGVuO3ZhciBXbjsoZnVuY3Rpb24oZSl7Y29uc3QgdD1uZXcgTWFwKFtbIjEiLHsiQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3kiOiJzYW1lLW9yaWdpbiJ9XSxbIjIiLHsiQ3Jvc3MtT3JpZ2luLUVtYmVkZGVyLVBvbGljeSI6InJlcXVpcmUtY29ycCJ9XSxbIjMiLHsiQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3kiOiJzYW1lLW9yaWdpbiIsIkNyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3kiOiJyZXF1aXJlLWNvcnAifV1dKTtlLkNvb3BBbmRDb2VwPU9iamVjdC5mcmVlemUodC5nZXQoIjMiKSk7Y29uc3Qgbj0idnNjb2RlLWNvaSI7ZnVuY3Rpb24gcihpKXtsZXQgbzt0eXBlb2YgaT09InN0cmluZyI/bz1uZXcgVVJMKGkpLnNlYXJjaFBhcmFtczppIGluc3RhbmNlb2YgVVJMP289aS5zZWFyY2hQYXJhbXM6c2UuaXNVcmkoaSkmJihvPW5ldyBVUkwoaS50b1N0cmluZyghMCkpLnNlYXJjaFBhcmFtcyk7Y29uc3QgbD1vPT1udWxsP3ZvaWQgMDpvLmdldChuKTtpZihsKXJldHVybiB0LmdldChsKX1lLmdldEhlYWRlcnNGcm9tUXVlcnk9cjtmdW5jdGlvbiBzKGksbyxsKXtpZighZ2xvYmFsVGhpcy5jcm9zc09yaWdpbklzb2xhdGVkKXJldHVybjtjb25zdCB1PW8mJmw/IjMiOmw/IjIiOiIxIjtpIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zP2kuc2V0KG4sdSk6aVtuXT11fWUuYWRkU2VhcmNoUGFyYW09c30pKFdufHwoV249e30pKTtjb25zdCB0bj0iZGVmYXVsdCIsR2k9IiRpbml0aWFsaXplIjtjbGFzcyBqaXtjb25zdHJ1Y3Rvcih0LG4scixzLGkpe3RoaXMudnNXb3JrZXI9dCx0aGlzLnJlcT1uLHRoaXMuY2hhbm5lbD1yLHRoaXMubWV0aG9kPXMsdGhpcy5hcmdzPWksdGhpcy50eXBlPTB9fWNsYXNzIHpue2NvbnN0cnVjdG9yKHQsbixyLHMpe3RoaXMudnNXb3JrZXI9dCx0aGlzLnNlcT1uLHRoaXMucmVzPXIsdGhpcy5lcnI9cyx0aGlzLnR5cGU9MX19Y2xhc3MgWGl7Y29uc3RydWN0b3IodCxuLHIscyxpKXt0aGlzLnZzV29ya2VyPXQsdGhpcy5yZXE9bix0aGlzLmNoYW5uZWw9cix0aGlzLmV2ZW50TmFtZT1zLHRoaXMuYXJnPWksdGhpcy50eXBlPTJ9fWNsYXNzIFFpe2NvbnN0cnVjdG9yKHQsbixyKXt0aGlzLnZzV29ya2VyPXQsdGhpcy5yZXE9bix0aGlzLmV2ZW50PXIsdGhpcy50eXBlPTN9fWNsYXNzIFlpe2NvbnN0cnVjdG9yKHQsbil7dGhpcy52c1dvcmtlcj10LHRoaXMucmVxPW4sdGhpcy50eXBlPTR9fWNsYXNzIEppe2NvbnN0cnVjdG9yKHQpe3RoaXMuX3dvcmtlcklkPS0xLHRoaXMuX2hhbmRsZXI9dCx0aGlzLl9sYXN0U2VudFJlcT0wLHRoaXMuX3BlbmRpbmdSZXBsaWVzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fcGVuZGluZ0VtaXR0ZXJzPW5ldyBNYXAsdGhpcy5fcGVuZGluZ0V2ZW50cz1uZXcgTWFwfXNldFdvcmtlcklkKHQpe3RoaXMuX3dvcmtlcklkPXR9c2VuZE1lc3NhZ2UodCxuLHIpe2NvbnN0IHM9U3RyaW5nKCsrdGhpcy5fbGFzdFNlbnRSZXEpO3JldHVybiBuZXcgUHJvbWlzZSgoaSxvKT0+e3RoaXMuX3BlbmRpbmdSZXBsaWVzW3NdPXtyZXNvbHZlOmkscmVqZWN0Om99LHRoaXMuX3NlbmQobmV3IGppKHRoaXMuX3dvcmtlcklkLHMsdCxuLHIpKX0pfWxpc3Rlbih0LG4scil7bGV0IHM9bnVsbDtjb25zdCBpPW5ldyBvZSh7b25XaWxsQWRkRmlyc3RMaXN0ZW5lcjooKT0+e3M9U3RyaW5nKCsrdGhpcy5fbGFzdFNlbnRSZXEpLHRoaXMuX3BlbmRpbmdFbWl0dGVycy5zZXQocyxpKSx0aGlzLl9zZW5kKG5ldyBYaSh0aGlzLl93b3JrZXJJZCxzLHQsbixyKSl9LG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyOigpPT57dGhpcy5fcGVuZGluZ0VtaXR0ZXJzLmRlbGV0ZShzKSx0aGlzLl9zZW5kKG5ldyBZaSh0aGlzLl93b3JrZXJJZCxzKSkscz1udWxsfX0pO3JldHVybiBpLmV2ZW50fWhhbmRsZU1lc3NhZ2UodCl7IXR8fCF0LnZzV29ya2VyfHx0aGlzLl93b3JrZXJJZCE9PS0xJiZ0LnZzV29ya2VyIT09dGhpcy5fd29ya2VySWR8fHRoaXMuX2hhbmRsZU1lc3NhZ2UodCl9Y3JlYXRlUHJveHlUb1JlbW90ZUNoYW5uZWwodCxuKXtjb25zdCByPXtnZXQ6KHMsaSk9Pih0eXBlb2YgaT09InN0cmluZyImJiFzW2ldJiYoR24oaSk/c1tpXT1vPT50aGlzLmxpc3Rlbih0LGksbyk6T24oaSk/c1tpXT10aGlzLmxpc3Rlbih0LGksdm9pZCAwKTppLmNoYXJDb2RlQXQoMCk9PT0zNiYmKHNbaV09YXN5bmMoLi4ubyk9Pihhd2FpdChuPT1udWxsP3ZvaWQgMDpuKCkpLHRoaXMuc2VuZE1lc3NhZ2UodCxpLG8pKSkpLHNbaV0pfTtyZXR1cm4gbmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCkscil9X2hhbmRsZU1lc3NhZ2UodCl7c3dpdGNoKHQudHlwZSl7Y2FzZSAxOnJldHVybiB0aGlzLl9oYW5kbGVSZXBseU1lc3NhZ2UodCk7Y2FzZSAwOnJldHVybiB0aGlzLl9oYW5kbGVSZXF1ZXN0TWVzc2FnZSh0KTtjYXNlIDI6cmV0dXJuIHRoaXMuX2hhbmRsZVN1YnNjcmliZUV2ZW50TWVzc2FnZSh0KTtjYXNlIDM6cmV0dXJuIHRoaXMuX2hhbmRsZUV2ZW50TWVzc2FnZSh0KTtjYXNlIDQ6cmV0dXJuIHRoaXMuX2hhbmRsZVVuc3Vic2NyaWJlRXZlbnRNZXNzYWdlKHQpfX1faGFuZGxlUmVwbHlNZXNzYWdlKHQpe2lmKCF0aGlzLl9wZW5kaW5nUmVwbGllc1t0LnNlcV0pe2NvbnNvbGUud2FybigiR290IHJlcGx5IHRvIHVua25vd24gc2VxIik7cmV0dXJufWNvbnN0IG49dGhpcy5fcGVuZGluZ1JlcGxpZXNbdC5zZXFdO2lmKGRlbGV0ZSB0aGlzLl9wZW5kaW5nUmVwbGllc1t0LnNlcV0sdC5lcnIpe2xldCByPXQuZXJyO3QuZXJyLiRpc0Vycm9yJiYocj1uZXcgRXJyb3Isci5uYW1lPXQuZXJyLm5hbWUsci5tZXNzYWdlPXQuZXJyLm1lc3NhZ2Usci5zdGFjaz10LmVyci5zdGFjayksbi5yZWplY3Qocik7cmV0dXJufW4ucmVzb2x2ZSh0LnJlcyl9X2hhbmRsZVJlcXVlc3RNZXNzYWdlKHQpe2NvbnN0IG49dC5yZXE7dGhpcy5faGFuZGxlci5oYW5kbGVNZXNzYWdlKHQuY2hhbm5lbCx0Lm1ldGhvZCx0LmFyZ3MpLnRoZW4ocz0+e3RoaXMuX3NlbmQobmV3IHpuKHRoaXMuX3dvcmtlcklkLG4scyx2b2lkIDApKX0scz0+e3MuZGV0YWlsIGluc3RhbmNlb2YgRXJyb3ImJihzLmRldGFpbD1SbihzLmRldGFpbCkpLHRoaXMuX3NlbmQobmV3IHpuKHRoaXMuX3dvcmtlcklkLG4sdm9pZCAwLFJuKHMpKSl9KX1faGFuZGxlU3Vic2NyaWJlRXZlbnRNZXNzYWdlKHQpe2NvbnN0IG49dC5yZXEscj10aGlzLl9oYW5kbGVyLmhhbmRsZUV2ZW50KHQuY2hhbm5lbCx0LmV2ZW50TmFtZSx0LmFyZykocz0+e3RoaXMuX3NlbmQobmV3IFFpKHRoaXMuX3dvcmtlcklkLG4scykpfSk7dGhpcy5fcGVuZGluZ0V2ZW50cy5zZXQobixyKX1faGFuZGxlRXZlbnRNZXNzYWdlKHQpe2lmKCF0aGlzLl9wZW5kaW5nRW1pdHRlcnMuaGFzKHQucmVxKSl7Y29uc29sZS53YXJuKCJHb3QgZXZlbnQgZm9yIHVua25vd24gcmVxIik7cmV0dXJufXRoaXMuX3BlbmRpbmdFbWl0dGVycy5nZXQodC5yZXEpLmZpcmUodC5ldmVudCl9X2hhbmRsZVVuc3Vic2NyaWJlRXZlbnRNZXNzYWdlKHQpe2lmKCF0aGlzLl9wZW5kaW5nRXZlbnRzLmhhcyh0LnJlcSkpe2NvbnNvbGUud2FybigiR290IHVuc3Vic2NyaWJlIGZvciB1bmtub3duIHJlcSIpO3JldHVybn10aGlzLl9wZW5kaW5nRXZlbnRzLmdldCh0LnJlcSkuZGlzcG9zZSgpLHRoaXMuX3BlbmRpbmdFdmVudHMuZGVsZXRlKHQucmVxKX1fc2VuZCh0KXtjb25zdCBuPVtdO2lmKHQudHlwZT09PTApZm9yKGxldCByPTA7cjx0LmFyZ3MubGVuZ3RoO3IrKyl0LmFyZ3Nbcl1pbnN0YW5jZW9mIEFycmF5QnVmZmVyJiZuLnB1c2godC5hcmdzW3JdKTtlbHNlIHQudHlwZT09PTEmJnQucmVzIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJm4ucHVzaCh0LnJlcyk7dGhpcy5faGFuZGxlci5zZW5kTWVzc2FnZSh0LG4pfX1mdW5jdGlvbiBPbihlKXtyZXR1cm4gZVswXT09PSJvIiYmZVsxXT09PSJuIiYmRG4oZS5jaGFyQ29kZUF0KDIpKX1mdW5jdGlvbiBHbihlKXtyZXR1cm4vXm9uRHluYW1pYy8udGVzdChlKSYmRG4oZS5jaGFyQ29kZUF0KDkpKX1jbGFzcyBaaXtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuX2xvY2FsQ2hhbm5lbHM9bmV3IE1hcCx0aGlzLl9yZW1vdGVDaGFubmVscz1uZXcgTWFwLHRoaXMuX3JlcXVlc3RIYW5kbGVyRmFjdG9yeT1uLHRoaXMuX3JlcXVlc3RIYW5kbGVyPW51bGwsdGhpcy5fcHJvdG9jb2w9bmV3IEppKHtzZW5kTWVzc2FnZToocixzKT0+e3QocixzKX0saGFuZGxlTWVzc2FnZToocixzLGkpPT50aGlzLl9oYW5kbGVNZXNzYWdlKHIscyxpKSxoYW5kbGVFdmVudDoocixzLGkpPT50aGlzLl9oYW5kbGVFdmVudChyLHMsaSl9KX1vbm1lc3NhZ2UodCl7dGhpcy5fcHJvdG9jb2wuaGFuZGxlTWVzc2FnZSh0KX1faGFuZGxlTWVzc2FnZSh0LG4scil7aWYodD09PXRuJiZuPT09R2kpcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShyWzBdLHJbMV0sclsyXSk7Y29uc3Qgcz10PT09dG4/dGhpcy5fcmVxdWVzdEhhbmRsZXI6dGhpcy5fbG9jYWxDaGFubmVscy5nZXQodCk7aWYoIXMpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgTWlzc2luZyBjaGFubmVsICR7dH0gb24gd29ya2VyIHRocmVhZGApKTtpZih0eXBlb2Ygc1tuXSE9ImZ1bmN0aW9uIilyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBNaXNzaW5nIG1ldGhvZCAke259IG9uIHdvcmtlciB0aHJlYWQgY2hhbm5lbCAke3R9YCkpO3RyeXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNbbl0uYXBwbHkocyxyKSl9Y2F0Y2goaSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGkpfX1faGFuZGxlRXZlbnQodCxuLHIpe2NvbnN0IHM9dD09PXRuP3RoaXMuX3JlcXVlc3RIYW5kbGVyOnRoaXMuX2xvY2FsQ2hhbm5lbHMuZ2V0KHQpO2lmKCFzKXRocm93IG5ldyBFcnJvcihgTWlzc2luZyBjaGFubmVsICR7dH0gb24gd29ya2VyIHRocmVhZGApO2lmKEduKG4pKXtjb25zdCBpPXNbbl0uY2FsbChzLHIpO2lmKHR5cGVvZiBpIT0iZnVuY3Rpb24iKXRocm93IG5ldyBFcnJvcihgTWlzc2luZyBkeW5hbWljIGV2ZW50ICR7bn0gb24gcmVxdWVzdCBoYW5kbGVyLmApO3JldHVybiBpfWlmKE9uKG4pKXtjb25zdCBpPXNbbl07aWYodHlwZW9mIGkhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGV2ZW50ICR7bn0gb24gcmVxdWVzdCBoYW5kbGVyLmApO3JldHVybiBpfXRocm93IG5ldyBFcnJvcihgTWFsZm9ybWVkIGV2ZW50IG5hbWUgJHtufWApfWdldENoYW5uZWwodCl7aWYoIXRoaXMuX3JlbW90ZUNoYW5uZWxzLmhhcyh0KSl7Y29uc3Qgbj10aGlzLl9wcm90b2NvbC5jcmVhdGVQcm94eVRvUmVtb3RlQ2hhbm5lbCh0KTt0aGlzLl9yZW1vdGVDaGFubmVscy5zZXQodCxuKX1yZXR1cm4gdGhpcy5fcmVtb3RlQ2hhbm5lbHMuZ2V0KHQpfWFzeW5jIGluaXRpYWxpemUodCxuLHIpe2lmKHRoaXMuX3Byb3RvY29sLnNldFdvcmtlcklkKHQpLHRoaXMuX3JlcXVlc3RIYW5kbGVyRmFjdG9yeSl7dGhpcy5fcmVxdWVzdEhhbmRsZXI9dGhpcy5fcmVxdWVzdEhhbmRsZXJGYWN0b3J5KHRoaXMpO3JldHVybn1yZXR1cm4gbiYmKHR5cGVvZiBuLmJhc2VVcmw8InUiJiZkZWxldGUgbi5iYXNlVXJsLHR5cGVvZiBuLnBhdGhzPCJ1IiYmdHlwZW9mIG4ucGF0aHMudnM8InUiJiZkZWxldGUgbi5wYXRocy52cyx0eXBlb2Ygbi50cnVzdGVkVHlwZXNQb2xpY3k8InUiJiZkZWxldGUgbi50cnVzdGVkVHlwZXNQb2xpY3ksbi5jYXRjaEVycm9yPSEwLGdsb2JhbFRoaXMucmVxdWlyZS5jb25maWcobikpLGltcG9ydChgJHtIbi5hc0Jyb3dzZXJVcmkoYCR7cn0uanNgKS50b1N0cmluZyghMCl9YCkudGhlbihpPT57aWYodGhpcy5fcmVxdWVzdEhhbmRsZXI9aS5jcmVhdGUodGhpcyksIXRoaXMuX3JlcXVlc3RIYW5kbGVyKXRocm93IG5ldyBFcnJvcigiTm8gUmVxdWVzdEhhbmRsZXIhIil9KX19Y2xhc3MgQWV7Y29uc3RydWN0b3IodCxuLHIscyl7dGhpcy5vcmlnaW5hbFN0YXJ0PXQsdGhpcy5vcmlnaW5hbExlbmd0aD1uLHRoaXMubW9kaWZpZWRTdGFydD1yLHRoaXMubW9kaWZpZWRMZW5ndGg9c31nZXRPcmlnaW5hbEVuZCgpe3JldHVybiB0aGlzLm9yaWdpbmFsU3RhcnQrdGhpcy5vcmlnaW5hbExlbmd0aH1nZXRNb2RpZmllZEVuZCgpe3JldHVybiB0aGlzLm1vZGlmaWVkU3RhcnQrdGhpcy5tb2RpZmllZExlbmd0aH19ZnVuY3Rpb24gam4oZSx0KXtyZXR1cm4odDw8NSktdCtlfDB9ZnVuY3Rpb24gS2koZSx0KXt0PWpuKDE0OTQxNyx0KTtmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspdD1qbihlLmNoYXJDb2RlQXQobiksdCk7cmV0dXJuIHR9Y2xhc3MgWG57Y29uc3RydWN0b3IodCl7dGhpcy5zb3VyY2U9dH1nZXRFbGVtZW50cygpe2NvbnN0IHQ9dGhpcy5zb3VyY2Usbj1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aCk7Zm9yKGxldCByPTAscz10Lmxlbmd0aDtyPHM7cisrKW5bcl09dC5jaGFyQ29kZUF0KHIpO3JldHVybiBufX1mdW5jdGlvbiBlYShlLHQsbil7cmV0dXJuIG5ldyBSZShuZXcgWG4oZSksbmV3IFhuKHQpKS5Db21wdXRlRGlmZihuKS5jaGFuZ2VzfWNsYXNzIFZle3N0YXRpYyBBc3NlcnQodCxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3Iobil9fWNsYXNzIEJle3N0YXRpYyBDb3B5KHQsbixyLHMsaSl7Zm9yKGxldCBvPTA7bzxpO28rKylyW3Mrb109dFtuK29dfXN0YXRpYyBDb3B5Mih0LG4scixzLGkpe2ZvcihsZXQgbz0wO288aTtvKyspcltzK29dPXRbbitvXX19Y2xhc3MgUW57Y29uc3RydWN0b3IoKXt0aGlzLm1fY2hhbmdlcz1bXSx0aGlzLm1fb3JpZ2luYWxTdGFydD0xMDczNzQxODI0LHRoaXMubV9tb2RpZmllZFN0YXJ0PTEwNzM3NDE4MjQsdGhpcy5tX29yaWdpbmFsQ291bnQ9MCx0aGlzLm1fbW9kaWZpZWRDb3VudD0wfU1hcmtOZXh0Q2hhbmdlKCl7KHRoaXMubV9vcmlnaW5hbENvdW50PjB8fHRoaXMubV9tb2RpZmllZENvdW50PjApJiZ0aGlzLm1fY2hhbmdlcy5wdXNoKG5ldyBBZSh0aGlzLm1fb3JpZ2luYWxTdGFydCx0aGlzLm1fb3JpZ2luYWxDb3VudCx0aGlzLm1fbW9kaWZpZWRTdGFydCx0aGlzLm1fbW9kaWZpZWRDb3VudCkpLHRoaXMubV9vcmlnaW5hbENvdW50PTAsdGhpcy5tX21vZGlmaWVkQ291bnQ9MCx0aGlzLm1fb3JpZ2luYWxTdGFydD0xMDczNzQxODI0LHRoaXMubV9tb2RpZmllZFN0YXJ0PTEwNzM3NDE4MjR9QWRkT3JpZ2luYWxFbGVtZW50KHQsbil7dGhpcy5tX29yaWdpbmFsU3RhcnQ9TWF0aC5taW4odGhpcy5tX29yaWdpbmFsU3RhcnQsdCksdGhpcy5tX21vZGlmaWVkU3RhcnQ9TWF0aC5taW4odGhpcy5tX21vZGlmaWVkU3RhcnQsbiksdGhpcy5tX29yaWdpbmFsQ291bnQrK31BZGRNb2RpZmllZEVsZW1lbnQodCxuKXt0aGlzLm1fb3JpZ2luYWxTdGFydD1NYXRoLm1pbih0aGlzLm1fb3JpZ2luYWxTdGFydCx0KSx0aGlzLm1fbW9kaWZpZWRTdGFydD1NYXRoLm1pbih0aGlzLm1fbW9kaWZpZWRTdGFydCxuKSx0aGlzLm1fbW9kaWZpZWRDb3VudCsrfWdldENoYW5nZXMoKXtyZXR1cm4odGhpcy5tX29yaWdpbmFsQ291bnQ+MHx8dGhpcy5tX21vZGlmaWVkQ291bnQ+MCkmJnRoaXMuTWFya05leHRDaGFuZ2UoKSx0aGlzLm1fY2hhbmdlc31nZXRSZXZlcnNlQ2hhbmdlcygpe3JldHVybih0aGlzLm1fb3JpZ2luYWxDb3VudD4wfHx0aGlzLm1fbW9kaWZpZWRDb3VudD4wKSYmdGhpcy5NYXJrTmV4dENoYW5nZSgpLHRoaXMubV9jaGFuZ2VzLnJldmVyc2UoKSx0aGlzLm1fY2hhbmdlc319Y2xhc3MgUmV7Y29uc3RydWN0b3IodCxuLHI9bnVsbCl7dGhpcy5Db250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGU9cix0aGlzLl9vcmlnaW5hbFNlcXVlbmNlPXQsdGhpcy5fbW9kaWZpZWRTZXF1ZW5jZT1uO2NvbnN0W3MsaSxvXT1SZS5fZ2V0RWxlbWVudHModCksW2wsdSxjXT1SZS5fZ2V0RWxlbWVudHMobik7dGhpcy5faGFzU3RyaW5ncz1vJiZjLHRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHM9cyx0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoPWksdGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50cz1sLHRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2g9dSx0aGlzLm1fZm9yd2FyZEhpc3Rvcnk9W10sdGhpcy5tX3JldmVyc2VIaXN0b3J5PVtdfXN0YXRpYyBfaXNTdHJpbmdBcnJheSh0KXtyZXR1cm4gdC5sZW5ndGg+MCYmdHlwZW9mIHRbMF09PSJzdHJpbmcifXN0YXRpYyBfZ2V0RWxlbWVudHModCl7Y29uc3Qgbj10LmdldEVsZW1lbnRzKCk7aWYoUmUuX2lzU3RyaW5nQXJyYXkobikpe2NvbnN0IHI9bmV3IEludDMyQXJyYXkobi5sZW5ndGgpO2ZvcihsZXQgcz0wLGk9bi5sZW5ndGg7czxpO3MrKylyW3NdPUtpKG5bc10sMCk7cmV0dXJuW24sciwhMF19cmV0dXJuIG4gaW5zdGFuY2VvZiBJbnQzMkFycmF5P1tbXSxuLCExXTpbW10sbmV3IEludDMyQXJyYXkobiksITFdfUVsZW1lbnRzQXJlRXF1YWwodCxuKXtyZXR1cm4gdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaFt0XSE9PXRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2hbbl0/ITE6dGhpcy5faGFzU3RyaW5ncz90aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW3RdPT09dGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50c1tuXTohMH1FbGVtZW50c0FyZVN0cmljdEVxdWFsKHQsbil7aWYoIXRoaXMuRWxlbWVudHNBcmVFcXVhbCh0LG4pKXJldHVybiExO2NvbnN0IHI9UmUuX2dldFN0cmljdEVsZW1lbnQodGhpcy5fb3JpZ2luYWxTZXF1ZW5jZSx0KSxzPVJlLl9nZXRTdHJpY3RFbGVtZW50KHRoaXMuX21vZGlmaWVkU2VxdWVuY2Usbik7cmV0dXJuIHI9PT1zfXN0YXRpYyBfZ2V0U3RyaWN0RWxlbWVudCh0LG4pe3JldHVybiB0eXBlb2YgdC5nZXRTdHJpY3RFbGVtZW50PT0iZnVuY3Rpb24iP3QuZ2V0U3RyaWN0RWxlbWVudChuKTpudWxsfU9yaWdpbmFsRWxlbWVudHNBcmVFcXVhbCh0LG4pe3JldHVybiB0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoW3RdIT09dGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaFtuXT8hMTp0aGlzLl9oYXNTdHJpbmdzP3RoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHNbdF09PT10aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW25dOiEwfU1vZGlmaWVkRWxlbWVudHNBcmVFcXVhbCh0LG4pe3JldHVybiB0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoW3RdIT09dGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaFtuXT8hMTp0aGlzLl9oYXNTdHJpbmdzP3RoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHNbdF09PT10aGlzLl9tb2RpZmllZFN0cmluZ0VsZW1lbnRzW25dOiEwfUNvbXB1dGVEaWZmKHQpe3JldHVybiB0aGlzLl9Db21wdXRlRGlmZigwLHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2gubGVuZ3RoLTEsMCx0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoLmxlbmd0aC0xLHQpfV9Db21wdXRlRGlmZih0LG4scixzLGkpe2NvbnN0IG89WyExXTtsZXQgbD10aGlzLkNvbXB1dGVEaWZmUmVjdXJzaXZlKHQsbixyLHMsbyk7cmV0dXJuIGkmJihsPXRoaXMuUHJldHRpZnlDaGFuZ2VzKGwpKSx7cXVpdEVhcmx5Om9bMF0sY2hhbmdlczpsfX1Db21wdXRlRGlmZlJlY3Vyc2l2ZSh0LG4scixzLGkpe2ZvcihpWzBdPSExO3Q8PW4mJnI8PXMmJnRoaXMuRWxlbWVudHNBcmVFcXVhbCh0LHIpOyl0KysscisrO2Zvcig7bj49dCYmcz49ciYmdGhpcy5FbGVtZW50c0FyZUVxdWFsKG4scyk7KW4tLSxzLS07aWYodD5ufHxyPnMpe2xldCBmO3JldHVybiByPD1zPyhWZS5Bc3NlcnQodD09PW4rMSwib3JpZ2luYWxTdGFydCBzaG91bGQgb25seSBiZSBvbmUgbW9yZSB0aGFuIG9yaWdpbmFsRW5kIiksZj1bbmV3IEFlKHQsMCxyLHMtcisxKV0pOnQ8PW4/KFZlLkFzc2VydChyPT09cysxLCJtb2RpZmllZFN0YXJ0IHNob3VsZCBvbmx5IGJlIG9uZSBtb3JlIHRoYW4gbW9kaWZpZWRFbmQiKSxmPVtuZXcgQWUodCxuLXQrMSxyLDApXSk6KFZlLkFzc2VydCh0PT09bisxLCJvcmlnaW5hbFN0YXJ0IHNob3VsZCBvbmx5IGJlIG9uZSBtb3JlIHRoYW4gb3JpZ2luYWxFbmQiKSxWZS5Bc3NlcnQocj09PXMrMSwibW9kaWZpZWRTdGFydCBzaG91bGQgb25seSBiZSBvbmUgbW9yZSB0aGFuIG1vZGlmaWVkRW5kIiksZj1bXSksZn1jb25zdCBvPVswXSxsPVswXSx1PXRoaXMuQ29tcHV0ZVJlY3Vyc2lvblBvaW50KHQsbixyLHMsbyxsLGkpLGM9b1swXSxoPWxbMF07aWYodSE9PW51bGwpcmV0dXJuIHU7aWYoIWlbMF0pe2NvbnN0IGY9dGhpcy5Db21wdXRlRGlmZlJlY3Vyc2l2ZSh0LGMscixoLGkpO2xldCBkPVtdO3JldHVybiBpWzBdP2Q9W25ldyBBZShjKzEsbi0oYysxKSsxLGgrMSxzLShoKzEpKzEpXTpkPXRoaXMuQ29tcHV0ZURpZmZSZWN1cnNpdmUoYysxLG4saCsxLHMsaSksdGhpcy5Db25jYXRlbmF0ZUNoYW5nZXMoZixkKX1yZXR1cm5bbmV3IEFlKHQsbi10KzEscixzLXIrMSldfVdBTEtUUkFDRSh0LG4scixzLGksbyxsLHUsYyxoLGYsZCxtLGcsYixfLHYsUyl7bGV0IE49bnVsbCxwPW51bGwseD1uZXcgUW4sTD1uLEE9cixFPW1bMF0tX1swXS1zLEI9LTEwNzM3NDE4MjQsUT10aGlzLm1fZm9yd2FyZEhpc3RvcnkubGVuZ3RoLTE7ZG97Y29uc3QgcT1FK3Q7cT09PUx8fHE8QSYmY1txLTFdPGNbcSsxXT8oZj1jW3ErMV0sZz1mLUUtcyxmPEImJnguTWFya05leHRDaGFuZ2UoKSxCPWYseC5BZGRNb2RpZmllZEVsZW1lbnQoZisxLGcpLEU9cSsxLXQpOihmPWNbcS0xXSsxLGc9Zi1FLXMsZjxCJiZ4Lk1hcmtOZXh0Q2hhbmdlKCksQj1mLTEseC5BZGRPcmlnaW5hbEVsZW1lbnQoZixnKzEpLEU9cS0xLXQpLFE+PTAmJihjPXRoaXMubV9mb3J3YXJkSGlzdG9yeVtRXSx0PWNbMF0sTD0xLEE9Yy5sZW5ndGgtMSl9d2hpbGUoLS1RPj0tMSk7aWYoTj14LmdldFJldmVyc2VDaGFuZ2VzKCksU1swXSl7bGV0IHE9bVswXSsxLEY9X1swXSsxO2lmKE4hPT1udWxsJiZOLmxlbmd0aD4wKXtjb25zdCBDPU5bTi5sZW5ndGgtMV07cT1NYXRoLm1heChxLEMuZ2V0T3JpZ2luYWxFbmQoKSksRj1NYXRoLm1heChGLEMuZ2V0TW9kaWZpZWRFbmQoKSl9cD1bbmV3IEFlKHEsZC1xKzEsRixiLUYrMSldfWVsc2V7eD1uZXcgUW4sTD1vLEE9bCxFPW1bMF0tX1swXS11LEI9MTA3Mzc0MTgyNCxRPXY/dGhpcy5tX3JldmVyc2VIaXN0b3J5Lmxlbmd0aC0xOnRoaXMubV9yZXZlcnNlSGlzdG9yeS5sZW5ndGgtMjtkb3tjb25zdCBxPUUraTtxPT09THx8cTxBJiZoW3EtMV0+PWhbcSsxXT8oZj1oW3ErMV0tMSxnPWYtRS11LGY+QiYmeC5NYXJrTmV4dENoYW5nZSgpLEI9ZisxLHguQWRkT3JpZ2luYWxFbGVtZW50KGYrMSxnKzEpLEU9cSsxLWkpOihmPWhbcS0xXSxnPWYtRS11LGY+QiYmeC5NYXJrTmV4dENoYW5nZSgpLEI9Zix4LkFkZE1vZGlmaWVkRWxlbWVudChmKzEsZysxKSxFPXEtMS1pKSxRPj0wJiYoaD10aGlzLm1fcmV2ZXJzZUhpc3RvcnlbUV0saT1oWzBdLEw9MSxBPWgubGVuZ3RoLTEpfXdoaWxlKC0tUT49LTEpO3A9eC5nZXRDaGFuZ2VzKCl9cmV0dXJuIHRoaXMuQ29uY2F0ZW5hdGVDaGFuZ2VzKE4scCl9Q29tcHV0ZVJlY3Vyc2lvblBvaW50KHQsbixyLHMsaSxvLGwpe2xldCB1PTAsYz0wLGg9MCxmPTAsZD0wLG09MDt0LS0sci0tLGlbMF09MCxvWzBdPTAsdGhpcy5tX2ZvcndhcmRIaXN0b3J5PVtdLHRoaXMubV9yZXZlcnNlSGlzdG9yeT1bXTtjb25zdCBnPW4tdCsocy1yKSxiPWcrMSxfPW5ldyBJbnQzMkFycmF5KGIpLHY9bmV3IEludDMyQXJyYXkoYiksUz1zLXIsTj1uLXQscD10LXIseD1uLXMsQT0oTi1TKSUyPT09MDtfW1NdPXQsdltOXT1uLGxbMF09ITE7Zm9yKGxldCBFPTE7RTw9Zy8yKzE7RSsrKXtsZXQgQj0wLFE9MDtoPXRoaXMuQ2xpcERpYWdvbmFsQm91bmQoUy1FLEUsUyxiKSxmPXRoaXMuQ2xpcERpYWdvbmFsQm91bmQoUytFLEUsUyxiKTtmb3IobGV0IEY9aDtGPD1mO0YrPTIpe0Y9PT1ofHxGPGYmJl9bRi0xXTxfW0YrMV0/dT1fW0YrMV06dT1fW0YtMV0rMSxjPXUtKEYtUyktcDtjb25zdCBDPXU7Zm9yKDt1PG4mJmM8cyYmdGhpcy5FbGVtZW50c0FyZUVxdWFsKHUrMSxjKzEpOyl1KyssYysrO2lmKF9bRl09dSx1K2M+QitRJiYoQj11LFE9YyksIUEmJk1hdGguYWJzKEYtTik8PUUtMSYmdT49dltGXSlyZXR1cm4gaVswXT11LG9bMF09YyxDPD12W0ZdJiZFPD0xNDQ4P3RoaXMuV0FMS1RSQUNFKFMsaCxmLHAsTixkLG0seCxfLHYsdSxuLGksYyxzLG8sQSxsKTpudWxsfWNvbnN0IHE9KEItdCsoUS1yKS1FKS8yO2lmKHRoaXMuQ29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlIT09bnVsbCYmIXRoaXMuQ29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlKEIscSkpcmV0dXJuIGxbMF09ITAsaVswXT1CLG9bMF09USxxPjAmJkU8PTE0NDg/dGhpcy5XQUxLVFJBQ0UoUyxoLGYscCxOLGQsbSx4LF8sdix1LG4saSxjLHMsbyxBLGwpOih0KysscisrLFtuZXcgQWUodCxuLXQrMSxyLHMtcisxKV0pO2Q9dGhpcy5DbGlwRGlhZ29uYWxCb3VuZChOLUUsRSxOLGIpLG09dGhpcy5DbGlwRGlhZ29uYWxCb3VuZChOK0UsRSxOLGIpO2ZvcihsZXQgRj1kO0Y8PW07Ris9Mil7Rj09PWR8fEY8bSYmdltGLTFdPj12W0YrMV0/dT12W0YrMV0tMTp1PXZbRi0xXSxjPXUtKEYtTikteDtjb25zdCBDPXU7Zm9yKDt1PnQmJmM+ciYmdGhpcy5FbGVtZW50c0FyZUVxdWFsKHUsYyk7KXUtLSxjLS07aWYodltGXT11LEEmJk1hdGguYWJzKEYtUyk8PUUmJnU8PV9bRl0pcmV0dXJuIGlbMF09dSxvWzBdPWMsQz49X1tGXSYmRTw9MTQ0OD90aGlzLldBTEtUUkFDRShTLGgsZixwLE4sZCxtLHgsXyx2LHUsbixpLGMscyxvLEEsbCk6bnVsbH1pZihFPD0xNDQ3KXtsZXQgRj1uZXcgSW50MzJBcnJheShmLWgrMik7RlswXT1TLWgrMSxCZS5Db3B5MihfLGgsRiwxLGYtaCsxKSx0aGlzLm1fZm9yd2FyZEhpc3RvcnkucHVzaChGKSxGPW5ldyBJbnQzMkFycmF5KG0tZCsyKSxGWzBdPU4tZCsxLEJlLkNvcHkyKHYsZCxGLDEsbS1kKzEpLHRoaXMubV9yZXZlcnNlSGlzdG9yeS5wdXNoKEYpfX1yZXR1cm4gdGhpcy5XQUxLVFJBQ0UoUyxoLGYscCxOLGQsbSx4LF8sdix1LG4saSxjLHMsbyxBLGwpfVByZXR0aWZ5Q2hhbmdlcyh0KXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgcj10W25dLHM9bjx0Lmxlbmd0aC0xP3RbbisxXS5vcmlnaW5hbFN0YXJ0OnRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2gubGVuZ3RoLGk9bjx0Lmxlbmd0aC0xP3RbbisxXS5tb2RpZmllZFN0YXJ0OnRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2gubGVuZ3RoLG89ci5vcmlnaW5hbExlbmd0aD4wLGw9ci5tb2RpZmllZExlbmd0aD4wO2Zvcig7ci5vcmlnaW5hbFN0YXJ0K3Iub3JpZ2luYWxMZW5ndGg8cyYmci5tb2RpZmllZFN0YXJ0K3IubW9kaWZpZWRMZW5ndGg8aSYmKCFvfHx0aGlzLk9yaWdpbmFsRWxlbWVudHNBcmVFcXVhbChyLm9yaWdpbmFsU3RhcnQsci5vcmlnaW5hbFN0YXJ0K3Iub3JpZ2luYWxMZW5ndGgpKSYmKCFsfHx0aGlzLk1vZGlmaWVkRWxlbWVudHNBcmVFcXVhbChyLm1vZGlmaWVkU3RhcnQsci5tb2RpZmllZFN0YXJ0K3IubW9kaWZpZWRMZW5ndGgpKTspe2NvbnN0IGM9dGhpcy5FbGVtZW50c0FyZVN0cmljdEVxdWFsKHIub3JpZ2luYWxTdGFydCxyLm1vZGlmaWVkU3RhcnQpO2lmKHRoaXMuRWxlbWVudHNBcmVTdHJpY3RFcXVhbChyLm9yaWdpbmFsU3RhcnQrci5vcmlnaW5hbExlbmd0aCxyLm1vZGlmaWVkU3RhcnQrci5tb2RpZmllZExlbmd0aCkmJiFjKWJyZWFrO3Iub3JpZ2luYWxTdGFydCsrLHIubW9kaWZpZWRTdGFydCsrfWNvbnN0IHU9W251bGxdO2lmKG48dC5sZW5ndGgtMSYmdGhpcy5DaGFuZ2VzT3ZlcmxhcCh0W25dLHRbbisxXSx1KSl7dFtuXT11WzBdLHQuc3BsaWNlKG4rMSwxKSxuLS07Y29udGludWV9fWZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKXtjb25zdCByPXRbbl07bGV0IHM9MCxpPTA7aWYobj4wKXtjb25zdCBmPXRbbi0xXTtzPWYub3JpZ2luYWxTdGFydCtmLm9yaWdpbmFsTGVuZ3RoLGk9Zi5tb2RpZmllZFN0YXJ0K2YubW9kaWZpZWRMZW5ndGh9Y29uc3Qgbz1yLm9yaWdpbmFsTGVuZ3RoPjAsbD1yLm1vZGlmaWVkTGVuZ3RoPjA7bGV0IHU9MCxjPXRoaXMuX2JvdW5kYXJ5U2NvcmUoci5vcmlnaW5hbFN0YXJ0LHIub3JpZ2luYWxMZW5ndGgsci5tb2RpZmllZFN0YXJ0LHIubW9kaWZpZWRMZW5ndGgpO2ZvcihsZXQgZj0xOztmKyspe2NvbnN0IGQ9ci5vcmlnaW5hbFN0YXJ0LWYsbT1yLm1vZGlmaWVkU3RhcnQtZjtpZihkPHN8fG08aXx8byYmIXRoaXMuT3JpZ2luYWxFbGVtZW50c0FyZUVxdWFsKGQsZCtyLm9yaWdpbmFsTGVuZ3RoKXx8bCYmIXRoaXMuTW9kaWZpZWRFbGVtZW50c0FyZUVxdWFsKG0sbStyLm1vZGlmaWVkTGVuZ3RoKSlicmVhaztjb25zdCBiPShkPT09cyYmbT09PWk/NTowKSt0aGlzLl9ib3VuZGFyeVNjb3JlKGQsci5vcmlnaW5hbExlbmd0aCxtLHIubW9kaWZpZWRMZW5ndGgpO2I+YyYmKGM9Yix1PWYpfXIub3JpZ2luYWxTdGFydC09dSxyLm1vZGlmaWVkU3RhcnQtPXU7Y29uc3QgaD1bbnVsbF07aWYobj4wJiZ0aGlzLkNoYW5nZXNPdmVybGFwKHRbbi0xXSx0W25dLGgpKXt0W24tMV09aFswXSx0LnNwbGljZShuLDEpLG4rKztjb250aW51ZX19aWYodGhpcy5faGFzU3RyaW5ncylmb3IobGV0IG49MSxyPXQubGVuZ3RoO248cjtuKyspe2NvbnN0IHM9dFtuLTFdLGk9dFtuXSxvPWkub3JpZ2luYWxTdGFydC1zLm9yaWdpbmFsU3RhcnQtcy5vcmlnaW5hbExlbmd0aCxsPXMub3JpZ2luYWxTdGFydCx1PWkub3JpZ2luYWxTdGFydCtpLm9yaWdpbmFsTGVuZ3RoLGM9dS1sLGg9cy5tb2RpZmllZFN0YXJ0LGY9aS5tb2RpZmllZFN0YXJ0K2kubW9kaWZpZWRMZW5ndGgsZD1mLWg7aWYobzw1JiZjPDIwJiZkPDIwKXtjb25zdCBtPXRoaXMuX2ZpbmRCZXR0ZXJDb250aWd1b3VzU2VxdWVuY2UobCxjLGgsZCxvKTtpZihtKXtjb25zdFtnLGJdPW07KGchPT1zLm9yaWdpbmFsU3RhcnQrcy5vcmlnaW5hbExlbmd0aHx8YiE9PXMubW9kaWZpZWRTdGFydCtzLm1vZGlmaWVkTGVuZ3RoKSYmKHMub3JpZ2luYWxMZW5ndGg9Zy1zLm9yaWdpbmFsU3RhcnQscy5tb2RpZmllZExlbmd0aD1iLXMubW9kaWZpZWRTdGFydCxpLm9yaWdpbmFsU3RhcnQ9ZytvLGkubW9kaWZpZWRTdGFydD1iK28saS5vcmlnaW5hbExlbmd0aD11LWkub3JpZ2luYWxTdGFydCxpLm1vZGlmaWVkTGVuZ3RoPWYtaS5tb2RpZmllZFN0YXJ0KX19fXJldHVybiB0fV9maW5kQmV0dGVyQ29udGlndW91c1NlcXVlbmNlKHQsbixyLHMsaSl7aWYobjxpfHxzPGkpcmV0dXJuIG51bGw7Y29uc3Qgbz10K24taSsxLGw9citzLWkrMTtsZXQgdT0wLGM9MCxoPTA7Zm9yKGxldCBmPXQ7ZjxvO2YrKylmb3IobGV0IGQ9cjtkPGw7ZCsrKXtjb25zdCBtPXRoaXMuX2NvbnRpZ3VvdXNTZXF1ZW5jZVNjb3JlKGYsZCxpKTttPjAmJm0+dSYmKHU9bSxjPWYsaD1kKX1yZXR1cm4gdT4wP1tjLGhdOm51bGx9X2NvbnRpZ3VvdXNTZXF1ZW5jZVNjb3JlKHQsbixyKXtsZXQgcz0wO2ZvcihsZXQgaT0wO2k8cjtpKyspe2lmKCF0aGlzLkVsZW1lbnRzQXJlRXF1YWwodCtpLG4raSkpcmV0dXJuIDA7cys9dGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1t0K2ldLmxlbmd0aH1yZXR1cm4gc31fT3JpZ2luYWxJc0JvdW5kYXJ5KHQpe3JldHVybiB0PD0wfHx0Pj10aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoLmxlbmd0aC0xPyEwOnRoaXMuX2hhc1N0cmluZ3MmJi9eXHMqJC8udGVzdCh0aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW3RdKX1fT3JpZ2luYWxSZWdpb25Jc0JvdW5kYXJ5KHQsbil7aWYodGhpcy5fT3JpZ2luYWxJc0JvdW5kYXJ5KHQpfHx0aGlzLl9PcmlnaW5hbElzQm91bmRhcnkodC0xKSlyZXR1cm4hMDtpZihuPjApe2NvbnN0IHI9dCtuO2lmKHRoaXMuX09yaWdpbmFsSXNCb3VuZGFyeShyLTEpfHx0aGlzLl9PcmlnaW5hbElzQm91bmRhcnkocikpcmV0dXJuITB9cmV0dXJuITF9X01vZGlmaWVkSXNCb3VuZGFyeSh0KXtyZXR1cm4gdDw9MHx8dD49dGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaC5sZW5ndGgtMT8hMDp0aGlzLl9oYXNTdHJpbmdzJiYvXlxzKiQvLnRlc3QodGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50c1t0XSl9X01vZGlmaWVkUmVnaW9uSXNCb3VuZGFyeSh0LG4pe2lmKHRoaXMuX01vZGlmaWVkSXNCb3VuZGFyeSh0KXx8dGhpcy5fTW9kaWZpZWRJc0JvdW5kYXJ5KHQtMSkpcmV0dXJuITA7aWYobj4wKXtjb25zdCByPXQrbjtpZih0aGlzLl9Nb2RpZmllZElzQm91bmRhcnkoci0xKXx8dGhpcy5fTW9kaWZpZWRJc0JvdW5kYXJ5KHIpKXJldHVybiEwfXJldHVybiExfV9ib3VuZGFyeVNjb3JlKHQsbixyLHMpe2NvbnN0IGk9dGhpcy5fT3JpZ2luYWxSZWdpb25Jc0JvdW5kYXJ5KHQsbik/MTowLG89dGhpcy5fTW9kaWZpZWRSZWdpb25Jc0JvdW5kYXJ5KHIscyk/MTowO3JldHVybiBpK299Q29uY2F0ZW5hdGVDaGFuZ2VzKHQsbil7Y29uc3Qgcj1bXTtpZih0Lmxlbmd0aD09PTB8fG4ubGVuZ3RoPT09MClyZXR1cm4gbi5sZW5ndGg+MD9uOnQ7aWYodGhpcy5DaGFuZ2VzT3ZlcmxhcCh0W3QubGVuZ3RoLTFdLG5bMF0scikpe2NvbnN0IHM9bmV3IEFycmF5KHQubGVuZ3RoK24ubGVuZ3RoLTEpO3JldHVybiBCZS5Db3B5KHQsMCxzLDAsdC5sZW5ndGgtMSksc1t0Lmxlbmd0aC0xXT1yWzBdLEJlLkNvcHkobiwxLHMsdC5sZW5ndGgsbi5sZW5ndGgtMSksc31lbHNle2NvbnN0IHM9bmV3IEFycmF5KHQubGVuZ3RoK24ubGVuZ3RoKTtyZXR1cm4gQmUuQ29weSh0LDAscywwLHQubGVuZ3RoKSxCZS5Db3B5KG4sMCxzLHQubGVuZ3RoLG4ubGVuZ3RoKSxzfX1DaGFuZ2VzT3ZlcmxhcCh0LG4scil7aWYoVmUuQXNzZXJ0KHQub3JpZ2luYWxTdGFydDw9bi5vcmlnaW5hbFN0YXJ0LCJMZWZ0IGNoYW5nZSBpcyBub3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHJpZ2h0IGNoYW5nZSIpLFZlLkFzc2VydCh0Lm1vZGlmaWVkU3RhcnQ8PW4ubW9kaWZpZWRTdGFydCwiTGVmdCBjaGFuZ2UgaXMgbm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byByaWdodCBjaGFuZ2UiKSx0Lm9yaWdpbmFsU3RhcnQrdC5vcmlnaW5hbExlbmd0aD49bi5vcmlnaW5hbFN0YXJ0fHx0Lm1vZGlmaWVkU3RhcnQrdC5tb2RpZmllZExlbmd0aD49bi5tb2RpZmllZFN0YXJ0KXtjb25zdCBzPXQub3JpZ2luYWxTdGFydDtsZXQgaT10Lm9yaWdpbmFsTGVuZ3RoO2NvbnN0IG89dC5tb2RpZmllZFN0YXJ0O2xldCBsPXQubW9kaWZpZWRMZW5ndGg7cmV0dXJuIHQub3JpZ2luYWxTdGFydCt0Lm9yaWdpbmFsTGVuZ3RoPj1uLm9yaWdpbmFsU3RhcnQmJihpPW4ub3JpZ2luYWxTdGFydCtuLm9yaWdpbmFsTGVuZ3RoLXQub3JpZ2luYWxTdGFydCksdC5tb2RpZmllZFN0YXJ0K3QubW9kaWZpZWRMZW5ndGg+PW4ubW9kaWZpZWRTdGFydCYmKGw9bi5tb2RpZmllZFN0YXJ0K24ubW9kaWZpZWRMZW5ndGgtdC5tb2RpZmllZFN0YXJ0KSxyWzBdPW5ldyBBZShzLGksbyxsKSwhMH1lbHNlIHJldHVybiByWzBdPW51bGwsITF9Q2xpcERpYWdvbmFsQm91bmQodCxuLHIscyl7aWYodD49MCYmdDxzKXJldHVybiB0O2NvbnN0IGk9cixvPXMtci0xLGw9biUyPT09MDtpZih0PDApe2NvbnN0IHU9aSUyPT09MDtyZXR1cm4gbD09PXU/MDoxfWVsc2V7Y29uc3QgdT1vJTI9PT0wO3JldHVybiBsPT09dT9zLTE6cy0yfX19Y2xhc3MgJHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMubGluZU51bWJlcj10LHRoaXMuY29sdW1uPW59d2l0aCh0PXRoaXMubGluZU51bWJlcixuPXRoaXMuY29sdW1uKXtyZXR1cm4gdD09PXRoaXMubGluZU51bWJlciYmbj09PXRoaXMuY29sdW1uP3RoaXM6bmV3ICQodCxuKX1kZWx0YSh0PTAsbj0wKXtyZXR1cm4gdGhpcy53aXRoKHRoaXMubGluZU51bWJlcit0LHRoaXMuY29sdW1uK24pfWVxdWFscyh0KXtyZXR1cm4gJC5lcXVhbHModGhpcyx0KX1zdGF0aWMgZXF1YWxzKHQsbil7cmV0dXJuIXQmJiFuPyEwOiEhdCYmISFuJiZ0LmxpbmVOdW1iZXI9PT1uLmxpbmVOdW1iZXImJnQuY29sdW1uPT09bi5jb2x1bW59aXNCZWZvcmUodCl7cmV0dXJuICQuaXNCZWZvcmUodGhpcyx0KX1zdGF0aWMgaXNCZWZvcmUodCxuKXtyZXR1cm4gdC5saW5lTnVtYmVyPG4ubGluZU51bWJlcj8hMDpuLmxpbmVOdW1iZXI8dC5saW5lTnVtYmVyPyExOnQuY29sdW1uPG4uY29sdW1ufWlzQmVmb3JlT3JFcXVhbCh0KXtyZXR1cm4gJC5pc0JlZm9yZU9yRXF1YWwodGhpcyx0KX1zdGF0aWMgaXNCZWZvcmVPckVxdWFsKHQsbil7cmV0dXJuIHQubGluZU51bWJlcjxuLmxpbmVOdW1iZXI/ITA6bi5saW5lTnVtYmVyPHQubGluZU51bWJlcj8hMTp0LmNvbHVtbjw9bi5jb2x1bW59c3RhdGljIGNvbXBhcmUodCxuKXtjb25zdCByPXQubGluZU51bWJlcnwwLHM9bi5saW5lTnVtYmVyfDA7aWYocj09PXMpe2NvbnN0IGk9dC5jb2x1bW58MCxvPW4uY29sdW1ufDA7cmV0dXJuIGktb31yZXR1cm4gci1zfWNsb25lKCl7cmV0dXJuIG5ldyAkKHRoaXMubGluZU51bWJlcix0aGlzLmNvbHVtbil9dG9TdHJpbmcoKXtyZXR1cm4iKCIrdGhpcy5saW5lTnVtYmVyKyIsIit0aGlzLmNvbHVtbisiKSJ9c3RhdGljIGxpZnQodCl7cmV0dXJuIG5ldyAkKHQubGluZU51bWJlcix0LmNvbHVtbil9c3RhdGljIGlzSVBvc2l0aW9uKHQpe3JldHVybiB0JiZ0eXBlb2YgdC5saW5lTnVtYmVyPT0ibnVtYmVyIiYmdHlwZW9mIHQuY29sdW1uPT0ibnVtYmVyIn10b0pTT04oKXtyZXR1cm57bGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uOnRoaXMuY29sdW1ufX19Y2xhc3Mga3tjb25zdHJ1Y3Rvcih0LG4scixzKXt0PnJ8fHQ9PT1yJiZuPnM/KHRoaXMuc3RhcnRMaW5lTnVtYmVyPXIsdGhpcy5zdGFydENvbHVtbj1zLHRoaXMuZW5kTGluZU51bWJlcj10LHRoaXMuZW5kQ29sdW1uPW4pOih0aGlzLnN0YXJ0TGluZU51bWJlcj10LHRoaXMuc3RhcnRDb2x1bW49bix0aGlzLmVuZExpbmVOdW1iZXI9cix0aGlzLmVuZENvbHVtbj1zKX1pc0VtcHR5KCl7cmV0dXJuIGsuaXNFbXB0eSh0aGlzKX1zdGF0aWMgaXNFbXB0eSh0KXtyZXR1cm4gdC5zdGFydExpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXImJnQuc3RhcnRDb2x1bW49PT10LmVuZENvbHVtbn1jb250YWluc1Bvc2l0aW9uKHQpe3JldHVybiBrLmNvbnRhaW5zUG9zaXRpb24odGhpcyx0KX1zdGF0aWMgY29udGFpbnNQb3NpdGlvbih0LG4pe3JldHVybiEobi5saW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxuLmxpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyfHxuLmxpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmbi5jb2x1bW48dC5zdGFydENvbHVtbnx8bi5saW5lTnVtYmVyPT09dC5lbmRMaW5lTnVtYmVyJiZuLmNvbHVtbj50LmVuZENvbHVtbil9c3RhdGljIHN0cmljdENvbnRhaW5zUG9zaXRpb24odCxuKXtyZXR1cm4hKG4ubGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5saW5lTnVtYmVyPnQuZW5kTGluZU51bWJlcnx8bi5saW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXImJm4uY29sdW1uPD10LnN0YXJ0Q29sdW1ufHxuLmxpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXImJm4uY29sdW1uPj10LmVuZENvbHVtbil9Y29udGFpbnNSYW5nZSh0KXtyZXR1cm4gay5jb250YWluc1JhbmdlKHRoaXMsdCl9c3RhdGljIGNvbnRhaW5zUmFuZ2UodCxuKXtyZXR1cm4hKG4uc3RhcnRMaW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxuLmVuZExpbmVOdW1iZXI8dC5zdGFydExpbmVOdW1iZXJ8fG4uc3RhcnRMaW5lTnVtYmVyPnQuZW5kTGluZU51bWJlcnx8bi5lbmRMaW5lTnVtYmVyPnQuZW5kTGluZU51bWJlcnx8bi5zdGFydExpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmbi5zdGFydENvbHVtbjx0LnN0YXJ0Q29sdW1ufHxuLmVuZExpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXImJm4uZW5kQ29sdW1uPnQuZW5kQ29sdW1uKX1zdHJpY3RDb250YWluc1JhbmdlKHQpe3JldHVybiBrLnN0cmljdENvbnRhaW5zUmFuZ2UodGhpcyx0KX1zdGF0aWMgc3RyaWN0Q29udGFpbnNSYW5nZSh0LG4pe3JldHVybiEobi5zdGFydExpbmVOdW1iZXI8dC5zdGFydExpbmVOdW1iZXJ8fG4uZW5kTGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5zdGFydExpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyfHxuLmVuZExpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyfHxuLnN0YXJ0TGluZU51bWJlcj09PXQuc3RhcnRMaW5lTnVtYmVyJiZuLnN0YXJ0Q29sdW1uPD10LnN0YXJ0Q29sdW1ufHxuLmVuZExpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXImJm4uZW5kQ29sdW1uPj10LmVuZENvbHVtbil9cGx1c1JhbmdlKHQpe3JldHVybiBrLnBsdXNSYW5nZSh0aGlzLHQpfXN0YXRpYyBwbHVzUmFuZ2UodCxuKXtsZXQgcixzLGksbztyZXR1cm4gbi5zdGFydExpbmVOdW1iZXI8dC5zdGFydExpbmVOdW1iZXI/KHI9bi5zdGFydExpbmVOdW1iZXIscz1uLnN0YXJ0Q29sdW1uKTpuLnN0YXJ0TGluZU51bWJlcj09PXQuc3RhcnRMaW5lTnVtYmVyPyhyPW4uc3RhcnRMaW5lTnVtYmVyLHM9TWF0aC5taW4obi5zdGFydENvbHVtbix0LnN0YXJ0Q29sdW1uKSk6KHI9dC5zdGFydExpbmVOdW1iZXIscz10LnN0YXJ0Q29sdW1uKSxuLmVuZExpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyPyhpPW4uZW5kTGluZU51bWJlcixvPW4uZW5kQ29sdW1uKTpuLmVuZExpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXI/KGk9bi5lbmRMaW5lTnVtYmVyLG89TWF0aC5tYXgobi5lbmRDb2x1bW4sdC5lbmRDb2x1bW4pKTooaT10LmVuZExpbmVOdW1iZXIsbz10LmVuZENvbHVtbiksbmV3IGsocixzLGksbyl9aW50ZXJzZWN0UmFuZ2VzKHQpe3JldHVybiBrLmludGVyc2VjdFJhbmdlcyh0aGlzLHQpfXN0YXRpYyBpbnRlcnNlY3RSYW5nZXModCxuKXtsZXQgcj10LnN0YXJ0TGluZU51bWJlcixzPXQuc3RhcnRDb2x1bW4saT10LmVuZExpbmVOdW1iZXIsbz10LmVuZENvbHVtbjtjb25zdCBsPW4uc3RhcnRMaW5lTnVtYmVyLHU9bi5zdGFydENvbHVtbixjPW4uZW5kTGluZU51bWJlcixoPW4uZW5kQ29sdW1uO3JldHVybiByPGw/KHI9bCxzPXUpOnI9PT1sJiYocz1NYXRoLm1heChzLHUpKSxpPmM/KGk9YyxvPWgpOmk9PT1jJiYobz1NYXRoLm1pbihvLGgpKSxyPml8fHI9PT1pJiZzPm8/bnVsbDpuZXcgayhyLHMsaSxvKX1lcXVhbHNSYW5nZSh0KXtyZXR1cm4gay5lcXVhbHNSYW5nZSh0aGlzLHQpfXN0YXRpYyBlcXVhbHNSYW5nZSh0LG4pe3JldHVybiF0JiYhbj8hMDohIXQmJiEhbiYmdC5zdGFydExpbmVOdW1iZXI9PT1uLnN0YXJ0TGluZU51bWJlciYmdC5zdGFydENvbHVtbj09PW4uc3RhcnRDb2x1bW4mJnQuZW5kTGluZU51bWJlcj09PW4uZW5kTGluZU51bWJlciYmdC5lbmRDb2x1bW49PT1uLmVuZENvbHVtbn1nZXRFbmRQb3NpdGlvbigpe3JldHVybiBrLmdldEVuZFBvc2l0aW9uKHRoaXMpfXN0YXRpYyBnZXRFbmRQb3NpdGlvbih0KXtyZXR1cm4gbmV3ICQodC5lbmRMaW5lTnVtYmVyLHQuZW5kQ29sdW1uKX1nZXRTdGFydFBvc2l0aW9uKCl7cmV0dXJuIGsuZ2V0U3RhcnRQb3NpdGlvbih0aGlzKX1zdGF0aWMgZ2V0U3RhcnRQb3NpdGlvbih0KXtyZXR1cm4gbmV3ICQodC5zdGFydExpbmVOdW1iZXIsdC5zdGFydENvbHVtbil9dG9TdHJpbmcoKXtyZXR1cm4iWyIrdGhpcy5zdGFydExpbmVOdW1iZXIrIiwiK3RoaXMuc3RhcnRDb2x1bW4rIiAtPiAiK3RoaXMuZW5kTGluZU51bWJlcisiLCIrdGhpcy5lbmRDb2x1bW4rIl0ifXNldEVuZFBvc2l0aW9uKHQsbil7cmV0dXJuIG5ldyBrKHRoaXMuc3RhcnRMaW5lTnVtYmVyLHRoaXMuc3RhcnRDb2x1bW4sdCxuKX1zZXRTdGFydFBvc2l0aW9uKHQsbil7cmV0dXJuIG5ldyBrKHQsbix0aGlzLmVuZExpbmVOdW1iZXIsdGhpcy5lbmRDb2x1bW4pfWNvbGxhcHNlVG9TdGFydCgpe3JldHVybiBrLmNvbGxhcHNlVG9TdGFydCh0aGlzKX1zdGF0aWMgY29sbGFwc2VUb1N0YXJ0KHQpe3JldHVybiBuZXcgayh0LnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0Q29sdW1uLHQuc3RhcnRMaW5lTnVtYmVyLHQuc3RhcnRDb2x1bW4pfWNvbGxhcHNlVG9FbmQoKXtyZXR1cm4gay5jb2xsYXBzZVRvRW5kKHRoaXMpfXN0YXRpYyBjb2xsYXBzZVRvRW5kKHQpe3JldHVybiBuZXcgayh0LmVuZExpbmVOdW1iZXIsdC5lbmRDb2x1bW4sdC5lbmRMaW5lTnVtYmVyLHQuZW5kQ29sdW1uKX1kZWx0YSh0KXtyZXR1cm4gbmV3IGsodGhpcy5zdGFydExpbmVOdW1iZXIrdCx0aGlzLnN0YXJ0Q29sdW1uLHRoaXMuZW5kTGluZU51bWJlcit0LHRoaXMuZW5kQ29sdW1uKX1zdGF0aWMgZnJvbVBvc2l0aW9ucyh0LG49dCl7cmV0dXJuIG5ldyBrKHQubGluZU51bWJlcix0LmNvbHVtbixuLmxpbmVOdW1iZXIsbi5jb2x1bW4pfXN0YXRpYyBsaWZ0KHQpe3JldHVybiB0P25ldyBrKHQuc3RhcnRMaW5lTnVtYmVyLHQuc3RhcnRDb2x1bW4sdC5lbmRMaW5lTnVtYmVyLHQuZW5kQ29sdW1uKTpudWxsfXN0YXRpYyBpc0lSYW5nZSh0KXtyZXR1cm4gdCYmdHlwZW9mIHQuc3RhcnRMaW5lTnVtYmVyPT0ibnVtYmVyIiYmdHlwZW9mIHQuc3RhcnRDb2x1bW49PSJudW1iZXIiJiZ0eXBlb2YgdC5lbmRMaW5lTnVtYmVyPT0ibnVtYmVyIiYmdHlwZW9mIHQuZW5kQ29sdW1uPT0ibnVtYmVyIn1zdGF0aWMgYXJlSW50ZXJzZWN0aW5nT3JUb3VjaGluZyh0LG4pe3JldHVybiEodC5lbmRMaW5lTnVtYmVyPG4uc3RhcnRMaW5lTnVtYmVyfHx0LmVuZExpbmVOdW1iZXI9PT1uLnN0YXJ0TGluZU51bWJlciYmdC5lbmRDb2x1bW48bi5zdGFydENvbHVtbnx8bi5lbmRMaW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxuLmVuZExpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmbi5lbmRDb2x1bW48dC5zdGFydENvbHVtbil9c3RhdGljIGFyZUludGVyc2VjdGluZyh0LG4pe3JldHVybiEodC5lbmRMaW5lTnVtYmVyPG4uc3RhcnRMaW5lTnVtYmVyfHx0LmVuZExpbmVOdW1iZXI9PT1uLnN0YXJ0TGluZU51bWJlciYmdC5lbmRDb2x1bW48PW4uc3RhcnRDb2x1bW58fG4uZW5kTGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5lbmRMaW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXImJm4uZW5kQ29sdW1uPD10LnN0YXJ0Q29sdW1uKX1zdGF0aWMgY29tcGFyZVJhbmdlc1VzaW5nU3RhcnRzKHQsbil7aWYodCYmbil7Y29uc3QgaT10LnN0YXJ0TGluZU51bWJlcnwwLG89bi5zdGFydExpbmVOdW1iZXJ8MDtpZihpPT09byl7Y29uc3QgbD10LnN0YXJ0Q29sdW1ufDAsdT1uLnN0YXJ0Q29sdW1ufDA7aWYobD09PXUpe2NvbnN0IGM9dC5lbmRMaW5lTnVtYmVyfDAsaD1uLmVuZExpbmVOdW1iZXJ8MDtpZihjPT09aCl7Y29uc3QgZj10LmVuZENvbHVtbnwwLGQ9bi5lbmRDb2x1bW58MDtyZXR1cm4gZi1kfXJldHVybiBjLWh9cmV0dXJuIGwtdX1yZXR1cm4gaS1vfXJldHVybih0PzE6MCktKG4/MTowKX1zdGF0aWMgY29tcGFyZVJhbmdlc1VzaW5nRW5kcyh0LG4pe3JldHVybiB0LmVuZExpbmVOdW1iZXI9PT1uLmVuZExpbmVOdW1iZXI/dC5lbmRDb2x1bW49PT1uLmVuZENvbHVtbj90LnN0YXJ0TGluZU51bWJlcj09PW4uc3RhcnRMaW5lTnVtYmVyP3Quc3RhcnRDb2x1bW4tbi5zdGFydENvbHVtbjp0LnN0YXJ0TGluZU51bWJlci1uLnN0YXJ0TGluZU51bWJlcjp0LmVuZENvbHVtbi1uLmVuZENvbHVtbjp0LmVuZExpbmVOdW1iZXItbi5lbmRMaW5lTnVtYmVyfXN0YXRpYyBzcGFuc011bHRpcGxlTGluZXModCl7cmV0dXJuIHQuZW5kTGluZU51bWJlcj50LnN0YXJ0TGluZU51bWJlcn10b0pTT04oKXtyZXR1cm4gdGhpc319ZnVuY3Rpb24gWW4oZSl7cmV0dXJuIGU8MD8wOmU+MjU1PzI1NTplfDB9ZnVuY3Rpb24gcWUoZSl7cmV0dXJuIGU8MD8wOmU+NDI5NDk2NzI5NT80Mjk0OTY3Mjk1OmV8MH1jbGFzcyBubntjb25zdHJ1Y3Rvcih0KXtjb25zdCBuPVluKHQpO3RoaXMuX2RlZmF1bHRWYWx1ZT1uLHRoaXMuX2FzY2lpTWFwPW5uLl9jcmVhdGVBc2NpaU1hcChuKSx0aGlzLl9tYXA9bmV3IE1hcH1zdGF0aWMgX2NyZWF0ZUFzY2lpTWFwKHQpe2NvbnN0IG49bmV3IFVpbnQ4QXJyYXkoMjU2KTtyZXR1cm4gbi5maWxsKHQpLG59c2V0KHQsbil7Y29uc3Qgcj1ZbihuKTt0Pj0wJiZ0PDI1Nj90aGlzLl9hc2NpaU1hcFt0XT1yOnRoaXMuX21hcC5zZXQodCxyKX1nZXQodCl7cmV0dXJuIHQ+PTAmJnQ8MjU2P3RoaXMuX2FzY2lpTWFwW3RdOnRoaXMuX21hcC5nZXQodCl8fHRoaXMuX2RlZmF1bHRWYWx1ZX1jbGVhcigpe3RoaXMuX2FzY2lpTWFwLmZpbGwodGhpcy5fZGVmYXVsdFZhbHVlKSx0aGlzLl9tYXAuY2xlYXIoKX19Y2xhc3MgdGF7Y29uc3RydWN0b3IodCxuLHIpe2NvbnN0IHM9bmV3IFVpbnQ4QXJyYXkodCpuKTtmb3IobGV0IGk9MCxvPXQqbjtpPG87aSsrKXNbaV09cjt0aGlzLl9kYXRhPXMsdGhpcy5yb3dzPXQsdGhpcy5jb2xzPW59Z2V0KHQsbil7cmV0dXJuIHRoaXMuX2RhdGFbdCp0aGlzLmNvbHMrbl19c2V0KHQsbixyKXt0aGlzLl9kYXRhW3QqdGhpcy5jb2xzK25dPXJ9fWNsYXNzIG5he2NvbnN0cnVjdG9yKHQpe2xldCBuPTAscj0wO2ZvcihsZXQgaT0wLG89dC5sZW5ndGg7aTxvO2krKyl7Y29uc3RbbCx1LGNdPXRbaV07dT5uJiYobj11KSxsPnImJihyPWwpLGM+ciYmKHI9Yyl9bisrLHIrKztjb25zdCBzPW5ldyB0YShyLG4sMCk7Zm9yKGxldCBpPTAsbz10Lmxlbmd0aDtpPG87aSsrKXtjb25zdFtsLHUsY109dFtpXTtzLnNldChsLHUsYyl9dGhpcy5fc3RhdGVzPXMsdGhpcy5fbWF4Q2hhckNvZGU9bn1uZXh0U3RhdGUodCxuKXtyZXR1cm4gbjwwfHxuPj10aGlzLl9tYXhDaGFyQ29kZT8wOnRoaXMuX3N0YXRlcy5nZXQodCxuKX19bGV0IHJuPW51bGw7ZnVuY3Rpb24gcmEoKXtyZXR1cm4gcm49PT1udWxsJiYocm49bmV3IG5hKFtbMSwxMDQsMl0sWzEsNzIsMl0sWzEsMTAyLDZdLFsxLDcwLDZdLFsyLDExNiwzXSxbMiw4NCwzXSxbMywxMTYsNF0sWzMsODQsNF0sWzQsMTEyLDVdLFs0LDgwLDVdLFs1LDExNSw5XSxbNSw4Myw5XSxbNSw1OCwxMF0sWzYsMTA1LDddLFs2LDczLDddLFs3LDEwOCw4XSxbNyw3Niw4XSxbOCwxMDEsOV0sWzgsNjksOV0sWzksNTgsMTBdLFsxMCw0NywxMV0sWzExLDQ3LDEyXV0pKSxybn1sZXQgbnQ9bnVsbDtmdW5jdGlvbiBzYSgpe2lmKG50PT09bnVsbCl7bnQ9bmV3IG5uKDApO2NvbnN0IGU9YCAJPD4nIuOAgeOAgu+9oe+9pO+8jO+8ju+8mu+8m+KAmOOAiOOAjOOAjuOAlO+8iO+8u++9m++9ou+9o++9ne+8ve+8ieOAleOAj+OAjeOAieKAme+9gO+9nuKApmA7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspbnQuc2V0KGUuY2hhckNvZGVBdChuKSwxKTtjb25zdCB0PSIuLDs6Ijtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyludC5zZXQodC5jaGFyQ29kZUF0KG4pLDIpfXJldHVybiBudH1jbGFzcyBfdHtzdGF0aWMgX2NyZWF0ZUxpbmsodCxuLHIscyxpKXtsZXQgbz1pLTE7ZG97Y29uc3QgbD1uLmNoYXJDb2RlQXQobyk7aWYodC5nZXQobCkhPT0yKWJyZWFrO28tLX13aGlsZShvPnMpO2lmKHM+MCl7Y29uc3QgbD1uLmNoYXJDb2RlQXQocy0xKSx1PW4uY2hhckNvZGVBdChvKTsobD09PTQwJiZ1PT09NDF8fGw9PT05MSYmdT09PTkzfHxsPT09MTIzJiZ1PT09MTI1KSYmby0tfXJldHVybntyYW5nZTp7c3RhcnRMaW5lTnVtYmVyOnIsc3RhcnRDb2x1bW46cysxLGVuZExpbmVOdW1iZXI6cixlbmRDb2x1bW46bysyfSx1cmw6bi5zdWJzdHJpbmcocyxvKzEpfX1zdGF0aWMgY29tcHV0ZUxpbmtzKHQsbj1yYSgpKXtjb25zdCByPXNhKCkscz1bXTtmb3IobGV0IGk9MSxvPXQuZ2V0TGluZUNvdW50KCk7aTw9bztpKyspe2NvbnN0IGw9dC5nZXRMaW5lQ29udGVudChpKSx1PWwubGVuZ3RoO2xldCBjPTAsaD0wLGY9MCxkPTEsbT0hMSxnPSExLGI9ITEsXz0hMTtmb3IoO2M8dTspe2xldCB2PSExO2NvbnN0IFM9bC5jaGFyQ29kZUF0KGMpO2lmKGQ9PT0xMyl7bGV0IE47c3dpdGNoKFMpe2Nhc2UgNDA6bT0hMCxOPTA7YnJlYWs7Y2FzZSA0MTpOPW0/MDoxO2JyZWFrO2Nhc2UgOTE6Yj0hMCxnPSEwLE49MDticmVhaztjYXNlIDkzOmI9ITEsTj1nPzA6MTticmVhaztjYXNlIDEyMzpfPSEwLE49MDticmVhaztjYXNlIDEyNTpOPV8/MDoxO2JyZWFrO2Nhc2UgMzk6Y2FzZSAzNDpjYXNlIDk2OmY9PT1TP049MTpmPT09Mzl8fGY9PT0zNHx8Zj09PTk2P049MDpOPTE7YnJlYWs7Y2FzZSA0MjpOPWY9PT00Mj8xOjA7YnJlYWs7Y2FzZSAxMjQ6Tj1mPT09MTI0PzE6MDticmVhaztjYXNlIDMyOk49Yj8wOjE7YnJlYWs7ZGVmYXVsdDpOPXIuZ2V0KFMpfU49PT0xJiYocy5wdXNoKF90Ll9jcmVhdGVMaW5rKHIsbCxpLGgsYykpLHY9ITApfWVsc2UgaWYoZD09PTEyKXtsZXQgTjtTPT09OTE/KGc9ITAsTj0wKTpOPXIuZ2V0KFMpLE49PT0xP3Y9ITA6ZD0xM31lbHNlIGQ9bi5uZXh0U3RhdGUoZCxTKSxkPT09MCYmKHY9ITApO3YmJihkPTEsbT0hMSxnPSExLF89ITEsaD1jKzEsZj1TKSxjKyt9ZD09PTEzJiZzLnB1c2goX3QuX2NyZWF0ZUxpbmsocixsLGksaCx1KSl9cmV0dXJuIHN9fWZ1bmN0aW9uIGlhKGUpe3JldHVybiFlfHx0eXBlb2YgZS5nZXRMaW5lQ291bnQhPSJmdW5jdGlvbiJ8fHR5cGVvZiBlLmdldExpbmVDb250ZW50IT0iZnVuY3Rpb24iP1tdOl90LmNvbXB1dGVMaW5rcyhlKX1jb25zdCBGdD1jbGFzcyBGdHtjb25zdHJ1Y3Rvcigpe3RoaXMuX2RlZmF1bHRWYWx1ZVNldD1bWyJ0cnVlIiwiZmFsc2UiXSxbIlRydWUiLCJGYWxzZSJdLFsiUHJpdmF0ZSIsIlB1YmxpYyIsIkZyaWVuZCIsIlJlYWRPbmx5IiwiUGFydGlhbCIsIlByb3RlY3RlZCIsIldyaXRlT25seSJdLFsicHVibGljIiwicHJvdGVjdGVkIiwicHJpdmF0ZSJdXX1uYXZpZ2F0ZVZhbHVlU2V0KHQsbixyLHMsaSl7aWYodCYmbil7Y29uc3Qgbz10aGlzLmRvTmF2aWdhdGVWYWx1ZVNldChuLGkpO2lmKG8pcmV0dXJue3JhbmdlOnQsdmFsdWU6b319aWYociYmcyl7Y29uc3Qgbz10aGlzLmRvTmF2aWdhdGVWYWx1ZVNldChzLGkpO2lmKG8pcmV0dXJue3JhbmdlOnIsdmFsdWU6b319cmV0dXJuIG51bGx9ZG9OYXZpZ2F0ZVZhbHVlU2V0KHQsbil7Y29uc3Qgcj10aGlzLm51bWJlclJlcGxhY2UodCxuKTtyZXR1cm4gciE9PW51bGw/cjp0aGlzLnRleHRSZXBsYWNlKHQsbil9bnVtYmVyUmVwbGFjZSh0LG4pe2NvbnN0IHI9TWF0aC5wb3coMTAsdC5sZW5ndGgtKHQubGFzdEluZGV4T2YoIi4iKSsxKSk7bGV0IHM9TnVtYmVyKHQpO2NvbnN0IGk9cGFyc2VGbG9hdCh0KTtyZXR1cm4haXNOYU4ocykmJiFpc05hTihpKSYmcz09PWk/cz09PTAmJiFuP251bGw6KHM9TWF0aC5mbG9vcihzKnIpLHMrPW4/cjotcixTdHJpbmcocy9yKSk6bnVsbH10ZXh0UmVwbGFjZSh0LG4pe3JldHVybiB0aGlzLnZhbHVlU2V0c1JlcGxhY2UodGhpcy5fZGVmYXVsdFZhbHVlU2V0LHQsbil9dmFsdWVTZXRzUmVwbGFjZSh0LG4scil7bGV0IHM9bnVsbDtmb3IobGV0IGk9MCxvPXQubGVuZ3RoO3M9PT1udWxsJiZpPG87aSsrKXM9dGhpcy52YWx1ZVNldFJlcGxhY2UodFtpXSxuLHIpO3JldHVybiBzfXZhbHVlU2V0UmVwbGFjZSh0LG4scil7bGV0IHM9dC5pbmRleE9mKG4pO3JldHVybiBzPj0wPyhzKz1yPzE6LTEsczwwP3M9dC5sZW5ndGgtMTpzJT10Lmxlbmd0aCx0W3NdKTpudWxsfX07RnQuSU5TVEFOQ0U9bmV3IEZ0O2xldCBzbj1GdDtjb25zdCBKbj1PYmplY3QuZnJlZXplKGZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1zZXRUaW1lb3V0KGUuYmluZCh0KSwwKTtyZXR1cm57ZGlzcG9zZSgpe2NsZWFyVGltZW91dChuKX19fSk7dmFyIHd0OyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3JldHVybiBuPT09ZS5Ob25lfHxuPT09ZS5DYW5jZWxsZWR8fG4gaW5zdGFuY2VvZiBMdD8hMDohbnx8dHlwZW9mIG4hPSJvYmplY3QiPyExOnR5cGVvZiBuLmlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkPT0iYm9vbGVhbiImJnR5cGVvZiBuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkPT0iZnVuY3Rpb24ifWUuaXNDYW5jZWxsYXRpb25Ub2tlbj10LGUuTm9uZT1PYmplY3QuZnJlZXplKHtpc0NhbmNlbGxhdGlvblJlcXVlc3RlZDohMSxvbkNhbmNlbGxhdGlvblJlcXVlc3RlZDptdC5Ob25lfSksZS5DYW5jZWxsZWQ9T2JqZWN0LmZyZWV6ZSh7aXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6ITAsb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6Sm59KX0pKHd0fHwod3Q9e30pKTtjbGFzcyBMdHtjb25zdHJ1Y3Rvcigpe3RoaXMuX2lzQ2FuY2VsbGVkPSExLHRoaXMuX2VtaXR0ZXI9bnVsbH1jYW5jZWwoKXt0aGlzLl9pc0NhbmNlbGxlZHx8KHRoaXMuX2lzQ2FuY2VsbGVkPSEwLHRoaXMuX2VtaXR0ZXImJih0aGlzLl9lbWl0dGVyLmZpcmUodm9pZCAwKSx0aGlzLmRpc3Bvc2UoKSkpfWdldCBpc0NhbmNlbGxhdGlvblJlcXVlc3RlZCgpe3JldHVybiB0aGlzLl9pc0NhbmNlbGxlZH1nZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKXtyZXR1cm4gdGhpcy5faXNDYW5jZWxsZWQ/Sm46KHRoaXMuX2VtaXR0ZXJ8fCh0aGlzLl9lbWl0dGVyPW5ldyBvZSksdGhpcy5fZW1pdHRlci5ldmVudCl9ZGlzcG9zZSgpe3RoaXMuX2VtaXR0ZXImJih0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKSx0aGlzLl9lbWl0dGVyPW51bGwpfX1jbGFzcyBhYXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl90b2tlbj12b2lkIDAsdGhpcy5fcGFyZW50TGlzdGVuZXI9dm9pZCAwLHRoaXMuX3BhcmVudExpc3RlbmVyPXQmJnQub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQodGhpcy5jYW5jZWwsdGhpcyl9Z2V0IHRva2VuKCl7cmV0dXJuIHRoaXMuX3Rva2VufHwodGhpcy5fdG9rZW49bmV3IEx0KSx0aGlzLl90b2tlbn1jYW5jZWwoKXt0aGlzLl90b2tlbj90aGlzLl90b2tlbiBpbnN0YW5jZW9mIEx0JiZ0aGlzLl90b2tlbi5jYW5jZWwoKTp0aGlzLl90b2tlbj13dC5DYW5jZWxsZWR9ZGlzcG9zZSh0PSExKXt2YXIgbjt0JiZ0aGlzLmNhbmNlbCgpLChuPXRoaXMuX3BhcmVudExpc3RlbmVyKT09bnVsbHx8bi5kaXNwb3NlKCksdGhpcy5fdG9rZW4/dGhpcy5fdG9rZW4gaW5zdGFuY2VvZiBMdCYmdGhpcy5fdG9rZW4uZGlzcG9zZSgpOnRoaXMuX3Rva2VuPXd0Lk5vbmV9fWNsYXNzIGFue2NvbnN0cnVjdG9yKCl7dGhpcy5fa2V5Q29kZVRvU3RyPVtdLHRoaXMuX3N0clRvS2V5Q29kZT1PYmplY3QuY3JlYXRlKG51bGwpfWRlZmluZSh0LG4pe3RoaXMuX2tleUNvZGVUb1N0clt0XT1uLHRoaXMuX3N0clRvS2V5Q29kZVtuLnRvTG93ZXJDYXNlKCldPXR9a2V5Q29kZVRvU3RyKHQpe3JldHVybiB0aGlzLl9rZXlDb2RlVG9TdHJbdF19c3RyVG9LZXlDb2RlKHQpe3JldHVybiB0aGlzLl9zdHJUb0tleUNvZGVbdC50b0xvd2VyQ2FzZSgpXXx8MH19Y29uc3QgdnQ9bmV3IGFuLG9uPW5ldyBhbixsbj1uZXcgYW4sb2E9bmV3IEFycmF5KDIzMCksbGE9T2JqZWN0LmNyZWF0ZShudWxsKSx1YT1PYmplY3QuY3JlYXRlKG51bGwpOyhmdW5jdGlvbigpe2NvbnN0IGU9IiIsdD1bWzEsMCwiTm9uZSIsMCwidW5rbm93biIsMCwiVktfVU5LTk9XTiIsZSxlXSxbMSwxLCJIeXBlciIsMCxlLDAsZSxlLGVdLFsxLDIsIlN1cGVyIiwwLGUsMCxlLGUsZV0sWzEsMywiRm4iLDAsZSwwLGUsZSxlXSxbMSw0LCJGbkxvY2siLDAsZSwwLGUsZSxlXSxbMSw1LCJTdXNwZW5kIiwwLGUsMCxlLGUsZV0sWzEsNiwiUmVzdW1lIiwwLGUsMCxlLGUsZV0sWzEsNywiVHVyYm8iLDAsZSwwLGUsZSxlXSxbMSw4LCJTbGVlcCIsMCxlLDAsIlZLX1NMRUVQIixlLGVdLFsxLDksIldha2VVcCIsMCxlLDAsZSxlLGVdLFswLDEwLCJLZXlBIiwzMSwiQSIsNjUsIlZLX0EiLGUsZV0sWzAsMTEsIktleUIiLDMyLCJCIiw2NiwiVktfQiIsZSxlXSxbMCwxMiwiS2V5QyIsMzMsIkMiLDY3LCJWS19DIixlLGVdLFswLDEzLCJLZXlEIiwzNCwiRCIsNjgsIlZLX0QiLGUsZV0sWzAsMTQsIktleUUiLDM1LCJFIiw2OSwiVktfRSIsZSxlXSxbMCwxNSwiS2V5RiIsMzYsIkYiLDcwLCJWS19GIixlLGVdLFswLDE2LCJLZXlHIiwzNywiRyIsNzEsIlZLX0ciLGUsZV0sWzAsMTcsIktleUgiLDM4LCJIIiw3MiwiVktfSCIsZSxlXSxbMCwxOCwiS2V5SSIsMzksIkkiLDczLCJWS19JIixlLGVdLFswLDE5LCJLZXlKIiw0MCwiSiIsNzQsIlZLX0oiLGUsZV0sWzAsMjAsIktleUsiLDQxLCJLIiw3NSwiVktfSyIsZSxlXSxbMCwyMSwiS2V5TCIsNDIsIkwiLDc2LCJWS19MIixlLGVdLFswLDIyLCJLZXlNIiw0MywiTSIsNzcsIlZLX00iLGUsZV0sWzAsMjMsIktleU4iLDQ0LCJOIiw3OCwiVktfTiIsZSxlXSxbMCwyNCwiS2V5TyIsNDUsIk8iLDc5LCJWS19PIixlLGVdLFswLDI1LCJLZXlQIiw0NiwiUCIsODAsIlZLX1AiLGUsZV0sWzAsMjYsIktleVEiLDQ3LCJRIiw4MSwiVktfUSIsZSxlXSxbMCwyNywiS2V5UiIsNDgsIlIiLDgyLCJWS19SIixlLGVdLFswLDI4LCJLZXlTIiw0OSwiUyIsODMsIlZLX1MiLGUsZV0sWzAsMjksIktleVQiLDUwLCJUIiw4NCwiVktfVCIsZSxlXSxbMCwzMCwiS2V5VSIsNTEsIlUiLDg1LCJWS19VIixlLGVdLFswLDMxLCJLZXlWIiw1MiwiViIsODYsIlZLX1YiLGUsZV0sWzAsMzIsIktleVciLDUzLCJXIiw4NywiVktfVyIsZSxlXSxbMCwzMywiS2V5WCIsNTQsIlgiLDg4LCJWS19YIixlLGVdLFswLDM0LCJLZXlZIiw1NSwiWSIsODksIlZLX1kiLGUsZV0sWzAsMzUsIktleVoiLDU2LCJaIiw5MCwiVktfWiIsZSxlXSxbMCwzNiwiRGlnaXQxIiwyMiwiMSIsNDksIlZLXzEiLGUsZV0sWzAsMzcsIkRpZ2l0MiIsMjMsIjIiLDUwLCJWS18yIixlLGVdLFswLDM4LCJEaWdpdDMiLDI0LCIzIiw1MSwiVktfMyIsZSxlXSxbMCwzOSwiRGlnaXQ0IiwyNSwiNCIsNTIsIlZLXzQiLGUsZV0sWzAsNDAsIkRpZ2l0NSIsMjYsIjUiLDUzLCJWS181IixlLGVdLFswLDQxLCJEaWdpdDYiLDI3LCI2Iiw1NCwiVktfNiIsZSxlXSxbMCw0MiwiRGlnaXQ3IiwyOCwiNyIsNTUsIlZLXzciLGUsZV0sWzAsNDMsIkRpZ2l0OCIsMjksIjgiLDU2LCJWS184IixlLGVdLFswLDQ0LCJEaWdpdDkiLDMwLCI5Iiw1NywiVktfOSIsZSxlXSxbMCw0NSwiRGlnaXQwIiwyMSwiMCIsNDgsIlZLXzAiLGUsZV0sWzEsNDYsIkVudGVyIiwzLCJFbnRlciIsMTMsIlZLX1JFVFVSTiIsZSxlXSxbMSw0NywiRXNjYXBlIiw5LCJFc2NhcGUiLDI3LCJWS19FU0NBUEUiLGUsZV0sWzEsNDgsIkJhY2tzcGFjZSIsMSwiQmFja3NwYWNlIiw4LCJWS19CQUNLIixlLGVdLFsxLDQ5LCJUYWIiLDIsIlRhYiIsOSwiVktfVEFCIixlLGVdLFsxLDUwLCJTcGFjZSIsMTAsIlNwYWNlIiwzMiwiVktfU1BBQ0UiLGUsZV0sWzAsNTEsIk1pbnVzIiw4OCwiLSIsMTg5LCJWS19PRU1fTUlOVVMiLCItIiwiT0VNX01JTlVTIl0sWzAsNTIsIkVxdWFsIiw4NiwiPSIsMTg3LCJWS19PRU1fUExVUyIsIj0iLCJPRU1fUExVUyJdLFswLDUzLCJCcmFja2V0TGVmdCIsOTIsIlsiLDIxOSwiVktfT0VNXzQiLCJbIiwiT0VNXzQiXSxbMCw1NCwiQnJhY2tldFJpZ2h0Iiw5NCwiXSIsMjIxLCJWS19PRU1fNiIsIl0iLCJPRU1fNiJdLFswLDU1LCJCYWNrc2xhc2giLDkzLCJcXCIsMjIwLCJWS19PRU1fNSIsIlxcIiwiT0VNXzUiXSxbMCw1NiwiSW50bEhhc2giLDAsZSwwLGUsZSxlXSxbMCw1NywiU2VtaWNvbG9uIiw4NSwiOyIsMTg2LCJWS19PRU1fMSIsIjsiLCJPRU1fMSJdLFswLDU4LCJRdW90ZSIsOTUsIiciLDIyMiwiVktfT0VNXzciLCInIiwiT0VNXzciXSxbMCw1OSwiQmFja3F1b3RlIiw5MSwiYCIsMTkyLCJWS19PRU1fMyIsImAiLCJPRU1fMyJdLFswLDYwLCJDb21tYSIsODcsIiwiLDE4OCwiVktfT0VNX0NPTU1BIiwiLCIsIk9FTV9DT01NQSJdLFswLDYxLCJQZXJpb2QiLDg5LCIuIiwxOTAsIlZLX09FTV9QRVJJT0QiLCIuIiwiT0VNX1BFUklPRCJdLFswLDYyLCJTbGFzaCIsOTAsIi8iLDE5MSwiVktfT0VNXzIiLCIvIiwiT0VNXzIiXSxbMSw2MywiQ2Fwc0xvY2siLDgsIkNhcHNMb2NrIiwyMCwiVktfQ0FQSVRBTCIsZSxlXSxbMSw2NCwiRjEiLDU5LCJGMSIsMTEyLCJWS19GMSIsZSxlXSxbMSw2NSwiRjIiLDYwLCJGMiIsMTEzLCJWS19GMiIsZSxlXSxbMSw2NiwiRjMiLDYxLCJGMyIsMTE0LCJWS19GMyIsZSxlXSxbMSw2NywiRjQiLDYyLCJGNCIsMTE1LCJWS19GNCIsZSxlXSxbMSw2OCwiRjUiLDYzLCJGNSIsMTE2LCJWS19GNSIsZSxlXSxbMSw2OSwiRjYiLDY0LCJGNiIsMTE3LCJWS19GNiIsZSxlXSxbMSw3MCwiRjciLDY1LCJGNyIsMTE4LCJWS19GNyIsZSxlXSxbMSw3MSwiRjgiLDY2LCJGOCIsMTE5LCJWS19GOCIsZSxlXSxbMSw3MiwiRjkiLDY3LCJGOSIsMTIwLCJWS19GOSIsZSxlXSxbMSw3MywiRjEwIiw2OCwiRjEwIiwxMjEsIlZLX0YxMCIsZSxlXSxbMSw3NCwiRjExIiw2OSwiRjExIiwxMjIsIlZLX0YxMSIsZSxlXSxbMSw3NSwiRjEyIiw3MCwiRjEyIiwxMjMsIlZLX0YxMiIsZSxlXSxbMSw3NiwiUHJpbnRTY3JlZW4iLDAsZSwwLGUsZSxlXSxbMSw3NywiU2Nyb2xsTG9jayIsODQsIlNjcm9sbExvY2siLDE0NSwiVktfU0NST0xMIixlLGVdLFsxLDc4LCJQYXVzZSIsNywiUGF1c2VCcmVhayIsMTksIlZLX1BBVVNFIixlLGVdLFsxLDc5LCJJbnNlcnQiLDE5LCJJbnNlcnQiLDQ1LCJWS19JTlNFUlQiLGUsZV0sWzEsODAsIkhvbWUiLDE0LCJIb21lIiwzNiwiVktfSE9NRSIsZSxlXSxbMSw4MSwiUGFnZVVwIiwxMSwiUGFnZVVwIiwzMywiVktfUFJJT1IiLGUsZV0sWzEsODIsIkRlbGV0ZSIsMjAsIkRlbGV0ZSIsNDYsIlZLX0RFTEVURSIsZSxlXSxbMSw4MywiRW5kIiwxMywiRW5kIiwzNSwiVktfRU5EIixlLGVdLFsxLDg0LCJQYWdlRG93biIsMTIsIlBhZ2VEb3duIiwzNCwiVktfTkVYVCIsZSxlXSxbMSw4NSwiQXJyb3dSaWdodCIsMTcsIlJpZ2h0QXJyb3ciLDM5LCJWS19SSUdIVCIsIlJpZ2h0IixlXSxbMSw4NiwiQXJyb3dMZWZ0IiwxNSwiTGVmdEFycm93IiwzNywiVktfTEVGVCIsIkxlZnQiLGVdLFsxLDg3LCJBcnJvd0Rvd24iLDE4LCJEb3duQXJyb3ciLDQwLCJWS19ET1dOIiwiRG93biIsZV0sWzEsODgsIkFycm93VXAiLDE2LCJVcEFycm93IiwzOCwiVktfVVAiLCJVcCIsZV0sWzEsODksIk51bUxvY2siLDgzLCJOdW1Mb2NrIiwxNDQsIlZLX05VTUxPQ0siLGUsZV0sWzEsOTAsIk51bXBhZERpdmlkZSIsMTEzLCJOdW1QYWRfRGl2aWRlIiwxMTEsIlZLX0RJVklERSIsZSxlXSxbMSw5MSwiTnVtcGFkTXVsdGlwbHkiLDEwOCwiTnVtUGFkX011bHRpcGx5IiwxMDYsIlZLX01VTFRJUExZIixlLGVdLFsxLDkyLCJOdW1wYWRTdWJ0cmFjdCIsMTExLCJOdW1QYWRfU3VidHJhY3QiLDEwOSwiVktfU1VCVFJBQ1QiLGUsZV0sWzEsOTMsIk51bXBhZEFkZCIsMTA5LCJOdW1QYWRfQWRkIiwxMDcsIlZLX0FERCIsZSxlXSxbMSw5NCwiTnVtcGFkRW50ZXIiLDMsZSwwLGUsZSxlXSxbMSw5NSwiTnVtcGFkMSIsOTksIk51bVBhZDEiLDk3LCJWS19OVU1QQUQxIixlLGVdLFsxLDk2LCJOdW1wYWQyIiwxMDAsIk51bVBhZDIiLDk4LCJWS19OVU1QQUQyIixlLGVdLFsxLDk3LCJOdW1wYWQzIiwxMDEsIk51bVBhZDMiLDk5LCJWS19OVU1QQUQzIixlLGVdLFsxLDk4LCJOdW1wYWQ0IiwxMDIsIk51bVBhZDQiLDEwMCwiVktfTlVNUEFENCIsZSxlXSxbMSw5OSwiTnVtcGFkNSIsMTAzLCJOdW1QYWQ1IiwxMDEsIlZLX05VTVBBRDUiLGUsZV0sWzEsMTAwLCJOdW1wYWQ2IiwxMDQsIk51bVBhZDYiLDEwMiwiVktfTlVNUEFENiIsZSxlXSxbMSwxMDEsIk51bXBhZDciLDEwNSwiTnVtUGFkNyIsMTAzLCJWS19OVU1QQUQ3IixlLGVdLFsxLDEwMiwiTnVtcGFkOCIsMTA2LCJOdW1QYWQ4IiwxMDQsIlZLX05VTVBBRDgiLGUsZV0sWzEsMTAzLCJOdW1wYWQ5IiwxMDcsIk51bVBhZDkiLDEwNSwiVktfTlVNUEFEOSIsZSxlXSxbMSwxMDQsIk51bXBhZDAiLDk4LCJOdW1QYWQwIiw5NiwiVktfTlVNUEFEMCIsZSxlXSxbMSwxMDUsIk51bXBhZERlY2ltYWwiLDExMiwiTnVtUGFkX0RlY2ltYWwiLDExMCwiVktfREVDSU1BTCIsZSxlXSxbMCwxMDYsIkludGxCYWNrc2xhc2giLDk3LCJPRU1fMTAyIiwyMjYsIlZLX09FTV8xMDIiLGUsZV0sWzEsMTA3LCJDb250ZXh0TWVudSIsNTgsIkNvbnRleHRNZW51Iiw5MyxlLGUsZV0sWzEsMTA4LCJQb3dlciIsMCxlLDAsZSxlLGVdLFsxLDEwOSwiTnVtcGFkRXF1YWwiLDAsZSwwLGUsZSxlXSxbMSwxMTAsIkYxMyIsNzEsIkYxMyIsMTI0LCJWS19GMTMiLGUsZV0sWzEsMTExLCJGMTQiLDcyLCJGMTQiLDEyNSwiVktfRjE0IixlLGVdLFsxLDExMiwiRjE1Iiw3MywiRjE1IiwxMjYsIlZLX0YxNSIsZSxlXSxbMSwxMTMsIkYxNiIsNzQsIkYxNiIsMTI3LCJWS19GMTYiLGUsZV0sWzEsMTE0LCJGMTciLDc1LCJGMTciLDEyOCwiVktfRjE3IixlLGVdLFsxLDExNSwiRjE4Iiw3NiwiRjE4IiwxMjksIlZLX0YxOCIsZSxlXSxbMSwxMTYsIkYxOSIsNzcsIkYxOSIsMTMwLCJWS19GMTkiLGUsZV0sWzEsMTE3LCJGMjAiLDc4LCJGMjAiLDEzMSwiVktfRjIwIixlLGVdLFsxLDExOCwiRjIxIiw3OSwiRjIxIiwxMzIsIlZLX0YyMSIsZSxlXSxbMSwxMTksIkYyMiIsODAsIkYyMiIsMTMzLCJWS19GMjIiLGUsZV0sWzEsMTIwLCJGMjMiLDgxLCJGMjMiLDEzNCwiVktfRjIzIixlLGVdLFsxLDEyMSwiRjI0Iiw4MiwiRjI0IiwxMzUsIlZLX0YyNCIsZSxlXSxbMSwxMjIsIk9wZW4iLDAsZSwwLGUsZSxlXSxbMSwxMjMsIkhlbHAiLDAsZSwwLGUsZSxlXSxbMSwxMjQsIlNlbGVjdCIsMCxlLDAsZSxlLGVdLFsxLDEyNSwiQWdhaW4iLDAsZSwwLGUsZSxlXSxbMSwxMjYsIlVuZG8iLDAsZSwwLGUsZSxlXSxbMSwxMjcsIkN1dCIsMCxlLDAsZSxlLGVdLFsxLDEyOCwiQ29weSIsMCxlLDAsZSxlLGVdLFsxLDEyOSwiUGFzdGUiLDAsZSwwLGUsZSxlXSxbMSwxMzAsIkZpbmQiLDAsZSwwLGUsZSxlXSxbMSwxMzEsIkF1ZGlvVm9sdW1lTXV0ZSIsMTE3LCJBdWRpb1ZvbHVtZU11dGUiLDE3MywiVktfVk9MVU1FX01VVEUiLGUsZV0sWzEsMTMyLCJBdWRpb1ZvbHVtZVVwIiwxMTgsIkF1ZGlvVm9sdW1lVXAiLDE3NSwiVktfVk9MVU1FX1VQIixlLGVdLFsxLDEzMywiQXVkaW9Wb2x1bWVEb3duIiwxMTksIkF1ZGlvVm9sdW1lRG93biIsMTc0LCJWS19WT0xVTUVfRE9XTiIsZSxlXSxbMSwxMzQsIk51bXBhZENvbW1hIiwxMTAsIk51bVBhZF9TZXBhcmF0b3IiLDEwOCwiVktfU0VQQVJBVE9SIixlLGVdLFswLDEzNSwiSW50bFJvIiwxMTUsIkFCTlRfQzEiLDE5MywiVktfQUJOVF9DMSIsZSxlXSxbMSwxMzYsIkthbmFNb2RlIiwwLGUsMCxlLGUsZV0sWzAsMTM3LCJJbnRsWWVuIiwwLGUsMCxlLGUsZV0sWzEsMTM4LCJDb252ZXJ0IiwwLGUsMCxlLGUsZV0sWzEsMTM5LCJOb25Db252ZXJ0IiwwLGUsMCxlLGUsZV0sWzEsMTQwLCJMYW5nMSIsMCxlLDAsZSxlLGVdLFsxLDE0MSwiTGFuZzIiLDAsZSwwLGUsZSxlXSxbMSwxNDIsIkxhbmczIiwwLGUsMCxlLGUsZV0sWzEsMTQzLCJMYW5nNCIsMCxlLDAsZSxlLGVdLFsxLDE0NCwiTGFuZzUiLDAsZSwwLGUsZSxlXSxbMSwxNDUsIkFib3J0IiwwLGUsMCxlLGUsZV0sWzEsMTQ2LCJQcm9wcyIsMCxlLDAsZSxlLGVdLFsxLDE0NywiTnVtcGFkUGFyZW5MZWZ0IiwwLGUsMCxlLGUsZV0sWzEsMTQ4LCJOdW1wYWRQYXJlblJpZ2h0IiwwLGUsMCxlLGUsZV0sWzEsMTQ5LCJOdW1wYWRCYWNrc3BhY2UiLDAsZSwwLGUsZSxlXSxbMSwxNTAsIk51bXBhZE1lbW9yeVN0b3JlIiwwLGUsMCxlLGUsZV0sWzEsMTUxLCJOdW1wYWRNZW1vcnlSZWNhbGwiLDAsZSwwLGUsZSxlXSxbMSwxNTIsIk51bXBhZE1lbW9yeUNsZWFyIiwwLGUsMCxlLGUsZV0sWzEsMTUzLCJOdW1wYWRNZW1vcnlBZGQiLDAsZSwwLGUsZSxlXSxbMSwxNTQsIk51bXBhZE1lbW9yeVN1YnRyYWN0IiwwLGUsMCxlLGUsZV0sWzEsMTU1LCJOdW1wYWRDbGVhciIsMTMxLCJDbGVhciIsMTIsIlZLX0NMRUFSIixlLGVdLFsxLDE1NiwiTnVtcGFkQ2xlYXJFbnRyeSIsMCxlLDAsZSxlLGVdLFsxLDAsZSw1LCJDdHJsIiwxNywiVktfQ09OVFJPTCIsZSxlXSxbMSwwLGUsNCwiU2hpZnQiLDE2LCJWS19TSElGVCIsZSxlXSxbMSwwLGUsNiwiQWx0IiwxOCwiVktfTUVOVSIsZSxlXSxbMSwwLGUsNTcsIk1ldGEiLDkxLCJWS19DT01NQU5EIixlLGVdLFsxLDE1NywiQ29udHJvbExlZnQiLDUsZSwwLCJWS19MQ09OVFJPTCIsZSxlXSxbMSwxNTgsIlNoaWZ0TGVmdCIsNCxlLDAsIlZLX0xTSElGVCIsZSxlXSxbMSwxNTksIkFsdExlZnQiLDYsZSwwLCJWS19MTUVOVSIsZSxlXSxbMSwxNjAsIk1ldGFMZWZ0Iiw1NyxlLDAsIlZLX0xXSU4iLGUsZV0sWzEsMTYxLCJDb250cm9sUmlnaHQiLDUsZSwwLCJWS19SQ09OVFJPTCIsZSxlXSxbMSwxNjIsIlNoaWZ0UmlnaHQiLDQsZSwwLCJWS19SU0hJRlQiLGUsZV0sWzEsMTYzLCJBbHRSaWdodCIsNixlLDAsIlZLX1JNRU5VIixlLGVdLFsxLDE2NCwiTWV0YVJpZ2h0Iiw1NyxlLDAsIlZLX1JXSU4iLGUsZV0sWzEsMTY1LCJCcmlnaHRuZXNzVXAiLDAsZSwwLGUsZSxlXSxbMSwxNjYsIkJyaWdodG5lc3NEb3duIiwwLGUsMCxlLGUsZV0sWzEsMTY3LCJNZWRpYVBsYXkiLDAsZSwwLGUsZSxlXSxbMSwxNjgsIk1lZGlhUmVjb3JkIiwwLGUsMCxlLGUsZV0sWzEsMTY5LCJNZWRpYUZhc3RGb3J3YXJkIiwwLGUsMCxlLGUsZV0sWzEsMTcwLCJNZWRpYVJld2luZCIsMCxlLDAsZSxlLGVdLFsxLDE3MSwiTWVkaWFUcmFja05leHQiLDEyNCwiTWVkaWFUcmFja05leHQiLDE3NiwiVktfTUVESUFfTkVYVF9UUkFDSyIsZSxlXSxbMSwxNzIsIk1lZGlhVHJhY2tQcmV2aW91cyIsMTI1LCJNZWRpYVRyYWNrUHJldmlvdXMiLDE3NywiVktfTUVESUFfUFJFVl9UUkFDSyIsZSxlXSxbMSwxNzMsIk1lZGlhU3RvcCIsMTI2LCJNZWRpYVN0b3AiLDE3OCwiVktfTUVESUFfU1RPUCIsZSxlXSxbMSwxNzQsIkVqZWN0IiwwLGUsMCxlLGUsZV0sWzEsMTc1LCJNZWRpYVBsYXlQYXVzZSIsMTI3LCJNZWRpYVBsYXlQYXVzZSIsMTc5LCJWS19NRURJQV9QTEFZX1BBVVNFIixlLGVdLFsxLDE3NiwiTWVkaWFTZWxlY3QiLDEyOCwiTGF1bmNoTWVkaWFQbGF5ZXIiLDE4MSwiVktfTUVESUFfTEFVTkNIX01FRElBX1NFTEVDVCIsZSxlXSxbMSwxNzcsIkxhdW5jaE1haWwiLDEyOSwiTGF1bmNoTWFpbCIsMTgwLCJWS19NRURJQV9MQVVOQ0hfTUFJTCIsZSxlXSxbMSwxNzgsIkxhdW5jaEFwcDIiLDEzMCwiTGF1bmNoQXBwMiIsMTgzLCJWS19NRURJQV9MQVVOQ0hfQVBQMiIsZSxlXSxbMSwxNzksIkxhdW5jaEFwcDEiLDAsZSwwLCJWS19NRURJQV9MQVVOQ0hfQVBQMSIsZSxlXSxbMSwxODAsIlNlbGVjdFRhc2siLDAsZSwwLGUsZSxlXSxbMSwxODEsIkxhdW5jaFNjcmVlblNhdmVyIiwwLGUsMCxlLGUsZV0sWzEsMTgyLCJCcm93c2VyU2VhcmNoIiwxMjAsIkJyb3dzZXJTZWFyY2giLDE3MCwiVktfQlJPV1NFUl9TRUFSQ0giLGUsZV0sWzEsMTgzLCJCcm93c2VySG9tZSIsMTIxLCJCcm93c2VySG9tZSIsMTcyLCJWS19CUk9XU0VSX0hPTUUiLGUsZV0sWzEsMTg0LCJCcm93c2VyQmFjayIsMTIyLCJCcm93c2VyQmFjayIsMTY2LCJWS19CUk9XU0VSX0JBQ0siLGUsZV0sWzEsMTg1LCJCcm93c2VyRm9yd2FyZCIsMTIzLCJCcm93c2VyRm9yd2FyZCIsMTY3LCJWS19CUk9XU0VSX0ZPUldBUkQiLGUsZV0sWzEsMTg2LCJCcm93c2VyU3RvcCIsMCxlLDAsIlZLX0JST1dTRVJfU1RPUCIsZSxlXSxbMSwxODcsIkJyb3dzZXJSZWZyZXNoIiwwLGUsMCwiVktfQlJPV1NFUl9SRUZSRVNIIixlLGVdLFsxLDE4OCwiQnJvd3NlckZhdm9yaXRlcyIsMCxlLDAsIlZLX0JST1dTRVJfRkFWT1JJVEVTIixlLGVdLFsxLDE4OSwiWm9vbVRvZ2dsZSIsMCxlLDAsZSxlLGVdLFsxLDE5MCwiTWFpbFJlcGx5IiwwLGUsMCxlLGUsZV0sWzEsMTkxLCJNYWlsRm9yd2FyZCIsMCxlLDAsZSxlLGVdLFsxLDE5MiwiTWFpbFNlbmQiLDAsZSwwLGUsZSxlXSxbMSwwLGUsMTE0LCJLZXlJbkNvbXBvc2l0aW9uIiwyMjksZSxlLGVdLFsxLDAsZSwxMTYsIkFCTlRfQzIiLDE5NCwiVktfQUJOVF9DMiIsZSxlXSxbMSwwLGUsOTYsIk9FTV84IiwyMjMsIlZLX09FTV84IixlLGVdLFsxLDAsZSwwLGUsMCwiVktfS0FOQSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0hBTkdVTCIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0pVTkpBIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfRklOQUwiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19IQU5KQSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0tBTkpJIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfQ09OVkVSVCIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX05PTkNPTlZFUlQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19BQ0NFUFQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19NT0RFQ0hBTkdFIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfU0VMRUNUIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfUFJJTlQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19FWEVDVVRFIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfU05BUFNIT1QiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19IRUxQIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfQVBQUyIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX1BST0NFU1NLRVkiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19QQUNLRVQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19EQkVfU0JDU0NIQVIiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19EQkVfREJDU0NIQVIiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19BVFROIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfQ1JTRUwiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19FWFNFTCIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0VSRU9GIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfUExBWSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX1pPT00iLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19OT05BTUUiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19QQTEiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19PRU1fQ0xFQVIiLGUsZV1dLG49W10scj1bXTtmb3IoY29uc3QgcyBvZiB0KXtjb25zdFtpLG8sbCx1LGMsaCxmLGQsbV09cztpZihyW29dfHwocltvXT0hMCxsYVtsXT1vLHVhW2wudG9Mb3dlckNhc2UoKV09byksIW5bdV0pe2lmKG5bdV09ITAsIWMpdGhyb3cgbmV3IEVycm9yKGBTdHJpbmcgcmVwcmVzZW50YXRpb24gbWlzc2luZyBmb3Iga2V5IGNvZGUgJHt1fSBhcm91bmQgc2NhbiBjb2RlICR7bH1gKTt2dC5kZWZpbmUodSxjKSxvbi5kZWZpbmUodSxkfHxjKSxsbi5kZWZpbmUodSxtfHxkfHxjKX1oJiYob2FbaF09dSl9fSkoKTt2YXIgWm47KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobCl7cmV0dXJuIHZ0LmtleUNvZGVUb1N0cihsKX1lLnRvU3RyaW5nPXQ7ZnVuY3Rpb24gbihsKXtyZXR1cm4gdnQuc3RyVG9LZXlDb2RlKGwpfWUuZnJvbVN0cmluZz1uO2Z1bmN0aW9uIHIobCl7cmV0dXJuIG9uLmtleUNvZGVUb1N0cihsKX1lLnRvVXNlclNldHRpbmdzVVM9cjtmdW5jdGlvbiBzKGwpe3JldHVybiBsbi5rZXlDb2RlVG9TdHIobCl9ZS50b1VzZXJTZXR0aW5nc0dlbmVyYWw9cztmdW5jdGlvbiBpKGwpe3JldHVybiBvbi5zdHJUb0tleUNvZGUobCl8fGxuLnN0clRvS2V5Q29kZShsKX1lLmZyb21Vc2VyU2V0dGluZ3M9aTtmdW5jdGlvbiBvKGwpe2lmKGw+PTk4JiZsPD0xMTMpcmV0dXJuIG51bGw7c3dpdGNoKGwpe2Nhc2UgMTY6cmV0dXJuIlVwIjtjYXNlIDE4OnJldHVybiJEb3duIjtjYXNlIDE1OnJldHVybiJMZWZ0IjtjYXNlIDE3OnJldHVybiJSaWdodCJ9cmV0dXJuIHZ0LmtleUNvZGVUb1N0cihsKX1lLnRvRWxlY3Ryb25BY2NlbGVyYXRvcj1vfSkoWm58fChabj17fSkpO2Z1bmN0aW9uIGNhKGUsdCl7Y29uc3Qgbj0odCY2NTUzNSk8PDE2Pj4+MDtyZXR1cm4oZXxuKT4+PjB9Y2xhc3MgYWUgZXh0ZW5kcyBre2NvbnN0cnVjdG9yKHQsbixyLHMpe3N1cGVyKHQsbixyLHMpLHRoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyPXQsdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbj1uLHRoaXMucG9zaXRpb25MaW5lTnVtYmVyPXIsdGhpcy5wb3NpdGlvbkNvbHVtbj1zfXRvU3RyaW5nKCl7cmV0dXJuIlsiK3RoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyKyIsIit0aGlzLnNlbGVjdGlvblN0YXJ0Q29sdW1uKyIgLT4gIit0aGlzLnBvc2l0aW9uTGluZU51bWJlcisiLCIrdGhpcy5wb3NpdGlvbkNvbHVtbisiXSJ9ZXF1YWxzU2VsZWN0aW9uKHQpe3JldHVybiBhZS5zZWxlY3Rpb25zRXF1YWwodGhpcyx0KX1zdGF0aWMgc2VsZWN0aW9uc0VxdWFsKHQsbil7cmV0dXJuIHQuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyPT09bi5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXImJnQuc2VsZWN0aW9uU3RhcnRDb2x1bW49PT1uLnNlbGVjdGlvblN0YXJ0Q29sdW1uJiZ0LnBvc2l0aW9uTGluZU51bWJlcj09PW4ucG9zaXRpb25MaW5lTnVtYmVyJiZ0LnBvc2l0aW9uQ29sdW1uPT09bi5wb3NpdGlvbkNvbHVtbn1nZXREaXJlY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXI9PT10aGlzLnN0YXJ0TGluZU51bWJlciYmdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbj09PXRoaXMuc3RhcnRDb2x1bW4/MDoxfXNldEVuZFBvc2l0aW9uKHQsbil7cmV0dXJuIHRoaXMuZ2V0RGlyZWN0aW9uKCk9PT0wP25ldyBhZSh0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLnN0YXJ0Q29sdW1uLHQsbik6bmV3IGFlKHQsbix0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLnN0YXJ0Q29sdW1uKX1nZXRQb3NpdGlvbigpe3JldHVybiBuZXcgJCh0aGlzLnBvc2l0aW9uTGluZU51bWJlcix0aGlzLnBvc2l0aW9uQ29sdW1uKX1nZXRTZWxlY3Rpb25TdGFydCgpe3JldHVybiBuZXcgJCh0aGlzLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlcix0aGlzLnNlbGVjdGlvblN0YXJ0Q29sdW1uKX1zZXRTdGFydFBvc2l0aW9uKHQsbil7cmV0dXJuIHRoaXMuZ2V0RGlyZWN0aW9uKCk9PT0wP25ldyBhZSh0LG4sdGhpcy5lbmRMaW5lTnVtYmVyLHRoaXMuZW5kQ29sdW1uKTpuZXcgYWUodGhpcy5lbmRMaW5lTnVtYmVyLHRoaXMuZW5kQ29sdW1uLHQsbil9c3RhdGljIGZyb21Qb3NpdGlvbnModCxuPXQpe3JldHVybiBuZXcgYWUodC5saW5lTnVtYmVyLHQuY29sdW1uLG4ubGluZU51bWJlcixuLmNvbHVtbil9c3RhdGljIGZyb21SYW5nZSh0LG4pe3JldHVybiBuPT09MD9uZXcgYWUodC5zdGFydExpbmVOdW1iZXIsdC5zdGFydENvbHVtbix0LmVuZExpbmVOdW1iZXIsdC5lbmRDb2x1bW4pOm5ldyBhZSh0LmVuZExpbmVOdW1iZXIsdC5lbmRDb2x1bW4sdC5zdGFydExpbmVOdW1iZXIsdC5zdGFydENvbHVtbil9c3RhdGljIGxpZnRTZWxlY3Rpb24odCl7cmV0dXJuIG5ldyBhZSh0LnNlbGVjdGlvblN0YXJ0TGluZU51bWJlcix0LnNlbGVjdGlvblN0YXJ0Q29sdW1uLHQucG9zaXRpb25MaW5lTnVtYmVyLHQucG9zaXRpb25Db2x1bW4pfXN0YXRpYyBzZWxlY3Rpb25zQXJyRXF1YWwodCxuKXtpZih0JiYhbnx8IXQmJm4pcmV0dXJuITE7aWYoIXQmJiFuKXJldHVybiEwO2lmKHQubGVuZ3RoIT09bi5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCByPTAscz10Lmxlbmd0aDtyPHM7cisrKWlmKCF0aGlzLnNlbGVjdGlvbnNFcXVhbCh0W3JdLG5bcl0pKXJldHVybiExO3JldHVybiEwfXN0YXRpYyBpc0lTZWxlY3Rpb24odCl7cmV0dXJuIHQmJnR5cGVvZiB0LnNlbGVjdGlvblN0YXJ0TGluZU51bWJlcj09Im51bWJlciImJnR5cGVvZiB0LnNlbGVjdGlvblN0YXJ0Q29sdW1uPT0ibnVtYmVyIiYmdHlwZW9mIHQucG9zaXRpb25MaW5lTnVtYmVyPT0ibnVtYmVyIiYmdHlwZW9mIHQucG9zaXRpb25Db2x1bW49PSJudW1iZXIifXN0YXRpYyBjcmVhdGVXaXRoRGlyZWN0aW9uKHQsbixyLHMsaSl7cmV0dXJuIGk9PT0wP25ldyBhZSh0LG4scixzKTpuZXcgYWUocixzLHQsbil9fWZ1bmN0aW9uIGhhKGUpe3JldHVybiB0eXBlb2YgZT09InN0cmluZyJ9Y29uc3QgS249T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBhKGUsdCl7aWYoaGEodCkpe2NvbnN0IG49S25bdF07aWYobj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYCR7ZX0gcmVmZXJlbmNlcyBhbiB1bmtub3duIGNvZGljb246ICR7dH1gKTt0PW59cmV0dXJuIEtuW2VdPXQse2lkOmV9fWNvbnN0IGZhPXthZGQ6YSgiYWRkIiw2ZTQpLHBsdXM6YSgicGx1cyIsNmU0KSxnaXN0TmV3OmEoImdpc3QtbmV3Iiw2ZTQpLHJlcG9DcmVhdGU6YSgicmVwby1jcmVhdGUiLDZlNCksbGlnaHRidWxiOmEoImxpZ2h0YnVsYiIsNjAwMDEpLGxpZ2h0QnVsYjphKCJsaWdodC1idWxiIiw2MDAwMSkscmVwbzphKCJyZXBvIiw2MDAwMikscmVwb0RlbGV0ZTphKCJyZXBvLWRlbGV0ZSIsNjAwMDIpLGdpc3RGb3JrOmEoImdpc3QtZm9yayIsNjAwMDMpLHJlcG9Gb3JrZWQ6YSgicmVwby1mb3JrZWQiLDYwMDAzKSxnaXRQdWxsUmVxdWVzdDphKCJnaXQtcHVsbC1yZXF1ZXN0Iiw2MDAwNCksZ2l0UHVsbFJlcXVlc3RBYmFuZG9uZWQ6YSgiZ2l0LXB1bGwtcmVxdWVzdC1hYmFuZG9uZWQiLDYwMDA0KSxyZWNvcmRLZXlzOmEoInJlY29yZC1rZXlzIiw2MDAwNSksa2V5Ym9hcmQ6YSgia2V5Ym9hcmQiLDYwMDA1KSx0YWc6YSgidGFnIiw2MDAwNiksZ2l0UHVsbFJlcXVlc3RMYWJlbDphKCJnaXQtcHVsbC1yZXF1ZXN0LWxhYmVsIiw2MDAwNiksdGFnQWRkOmEoInRhZy1hZGQiLDYwMDA2KSx0YWdSZW1vdmU6YSgidGFnLXJlbW92ZSIsNjAwMDYpLHBlcnNvbjphKCJwZXJzb24iLDYwMDA3KSxwZXJzb25Gb2xsb3c6YSgicGVyc29uLWZvbGxvdyIsNjAwMDcpLHBlcnNvbk91dGxpbmU6YSgicGVyc29uLW91dGxpbmUiLDYwMDA3KSxwZXJzb25GaWxsZWQ6YSgicGVyc29uLWZpbGxlZCIsNjAwMDcpLGdpdEJyYW5jaDphKCJnaXQtYnJhbmNoIiw2MDAwOCksZ2l0QnJhbmNoQ3JlYXRlOmEoImdpdC1icmFuY2gtY3JlYXRlIiw2MDAwOCksZ2l0QnJhbmNoRGVsZXRlOmEoImdpdC1icmFuY2gtZGVsZXRlIiw2MDAwOCksc291cmNlQ29udHJvbDphKCJzb3VyY2UtY29udHJvbCIsNjAwMDgpLG1pcnJvcjphKCJtaXJyb3IiLDYwMDA5KSxtaXJyb3JQdWJsaWM6YSgibWlycm9yLXB1YmxpYyIsNjAwMDkpLHN0YXI6YSgic3RhciIsNjAwMTApLHN0YXJBZGQ6YSgic3Rhci1hZGQiLDYwMDEwKSxzdGFyRGVsZXRlOmEoInN0YXItZGVsZXRlIiw2MDAxMCksc3RhckVtcHR5OmEoInN0YXItZW1wdHkiLDYwMDEwKSxjb21tZW50OmEoImNvbW1lbnQiLDYwMDExKSxjb21tZW50QWRkOmEoImNvbW1lbnQtYWRkIiw2MDAxMSksYWxlcnQ6YSgiYWxlcnQiLDYwMDEyKSx3YXJuaW5nOmEoIndhcm5pbmciLDYwMDEyKSxzZWFyY2g6YSgic2VhcmNoIiw2MDAxMyksc2VhcmNoU2F2ZTphKCJzZWFyY2gtc2F2ZSIsNjAwMTMpLGxvZ091dDphKCJsb2ctb3V0Iiw2MDAxNCksc2lnbk91dDphKCJzaWduLW91dCIsNjAwMTQpLGxvZ0luOmEoImxvZy1pbiIsNjAwMTUpLHNpZ25JbjphKCJzaWduLWluIiw2MDAxNSksZXllOmEoImV5ZSIsNjAwMTYpLGV5ZVVud2F0Y2g6YSgiZXllLXVud2F0Y2giLDYwMDE2KSxleWVXYXRjaDphKCJleWUtd2F0Y2giLDYwMDE2KSxjaXJjbGVGaWxsZWQ6YSgiY2lyY2xlLWZpbGxlZCIsNjAwMTcpLHByaW1pdGl2ZURvdDphKCJwcmltaXRpdmUtZG90Iiw2MDAxNyksY2xvc2VEaXJ0eTphKCJjbG9zZS1kaXJ0eSIsNjAwMTcpLGRlYnVnQnJlYWtwb2ludDphKCJkZWJ1Zy1icmVha3BvaW50Iiw2MDAxNyksZGVidWdCcmVha3BvaW50RGlzYWJsZWQ6YSgiZGVidWctYnJlYWtwb2ludC1kaXNhYmxlZCIsNjAwMTcpLGRlYnVnSGludDphKCJkZWJ1Zy1oaW50Iiw2MDAxNyksdGVybWluYWxEZWNvcmF0aW9uU3VjY2VzczphKCJ0ZXJtaW5hbC1kZWNvcmF0aW9uLXN1Y2Nlc3MiLDYwMDE3KSxwcmltaXRpdmVTcXVhcmU6YSgicHJpbWl0aXZlLXNxdWFyZSIsNjAwMTgpLGVkaXQ6YSgiZWRpdCIsNjAwMTkpLHBlbmNpbDphKCJwZW5jaWwiLDYwMDE5KSxpbmZvOmEoImluZm8iLDYwMDIwKSxpc3N1ZU9wZW5lZDphKCJpc3N1ZS1vcGVuZWQiLDYwMDIwKSxnaXN0UHJpdmF0ZTphKCJnaXN0LXByaXZhdGUiLDYwMDIxKSxnaXRGb3JrUHJpdmF0ZTphKCJnaXQtZm9yay1wcml2YXRlIiw2MDAyMSksbG9jazphKCJsb2NrIiw2MDAyMSksbWlycm9yUHJpdmF0ZTphKCJtaXJyb3ItcHJpdmF0ZSIsNjAwMjEpLGNsb3NlOmEoImNsb3NlIiw2MDAyMikscmVtb3ZlQ2xvc2U6YSgicmVtb3ZlLWNsb3NlIiw2MDAyMikseDphKCJ4Iiw2MDAyMikscmVwb1N5bmM6YSgicmVwby1zeW5jIiw2MDAyMyksc3luYzphKCJzeW5jIiw2MDAyMyksY2xvbmU6YSgiY2xvbmUiLDYwMDI0KSxkZXNrdG9wRG93bmxvYWQ6YSgiZGVza3RvcC1kb3dubG9hZCIsNjAwMjQpLGJlYWtlcjphKCJiZWFrZXIiLDYwMDI1KSxtaWNyb3Njb3BlOmEoIm1pY3Jvc2NvcGUiLDYwMDI1KSx2bTphKCJ2bSIsNjAwMjYpLGRldmljZURlc2t0b3A6YSgiZGV2aWNlLWRlc2t0b3AiLDYwMDI2KSxmaWxlOmEoImZpbGUiLDYwMDI3KSxmaWxlVGV4dDphKCJmaWxlLXRleHQiLDYwMDI3KSxtb3JlOmEoIm1vcmUiLDYwMDI4KSxlbGxpcHNpczphKCJlbGxpcHNpcyIsNjAwMjgpLGtlYmFiSG9yaXpvbnRhbDphKCJrZWJhYi1ob3Jpem9udGFsIiw2MDAyOCksbWFpbFJlcGx5OmEoIm1haWwtcmVwbHkiLDYwMDI5KSxyZXBseTphKCJyZXBseSIsNjAwMjkpLG9yZ2FuaXphdGlvbjphKCJvcmdhbml6YXRpb24iLDYwMDMwKSxvcmdhbml6YXRpb25GaWxsZWQ6YSgib3JnYW5pemF0aW9uLWZpbGxlZCIsNjAwMzApLG9yZ2FuaXphdGlvbk91dGxpbmU6YSgib3JnYW5pemF0aW9uLW91dGxpbmUiLDYwMDMwKSxuZXdGaWxlOmEoIm5ldy1maWxlIiw2MDAzMSksZmlsZUFkZDphKCJmaWxlLWFkZCIsNjAwMzEpLG5ld0ZvbGRlcjphKCJuZXctZm9sZGVyIiw2MDAzMiksZmlsZURpcmVjdG9yeUNyZWF0ZTphKCJmaWxlLWRpcmVjdG9yeS1jcmVhdGUiLDYwMDMyKSx0cmFzaDphKCJ0cmFzaCIsNjAwMzMpLHRyYXNoY2FuOmEoInRyYXNoY2FuIiw2MDAzMyksaGlzdG9yeTphKCJoaXN0b3J5Iiw2MDAzNCksY2xvY2s6YSgiY2xvY2siLDYwMDM0KSxmb2xkZXI6YSgiZm9sZGVyIiw2MDAzNSksZmlsZURpcmVjdG9yeTphKCJmaWxlLWRpcmVjdG9yeSIsNjAwMzUpLHN5bWJvbEZvbGRlcjphKCJzeW1ib2wtZm9sZGVyIiw2MDAzNSksbG9nb0dpdGh1YjphKCJsb2dvLWdpdGh1YiIsNjAwMzYpLG1hcmtHaXRodWI6YSgibWFyay1naXRodWIiLDYwMDM2KSxnaXRodWI6YSgiZ2l0aHViIiw2MDAzNiksdGVybWluYWw6YSgidGVybWluYWwiLDYwMDM3KSxjb25zb2xlOmEoImNvbnNvbGUiLDYwMDM3KSxyZXBsOmEoInJlcGwiLDYwMDM3KSx6YXA6YSgiemFwIiw2MDAzOCksc3ltYm9sRXZlbnQ6YSgic3ltYm9sLWV2ZW50Iiw2MDAzOCksZXJyb3I6YSgiZXJyb3IiLDYwMDM5KSxzdG9wOmEoInN0b3AiLDYwMDM5KSx2YXJpYWJsZTphKCJ2YXJpYWJsZSIsNjAwNDApLHN5bWJvbFZhcmlhYmxlOmEoInN5bWJvbC12YXJpYWJsZSIsNjAwNDApLGFycmF5OmEoImFycmF5Iiw2MDA0Miksc3ltYm9sQXJyYXk6YSgic3ltYm9sLWFycmF5Iiw2MDA0Miksc3ltYm9sTW9kdWxlOmEoInN5bWJvbC1tb2R1bGUiLDYwMDQzKSxzeW1ib2xQYWNrYWdlOmEoInN5bWJvbC1wYWNrYWdlIiw2MDA0Myksc3ltYm9sTmFtZXNwYWNlOmEoInN5bWJvbC1uYW1lc3BhY2UiLDYwMDQzKSxzeW1ib2xPYmplY3Q6YSgic3ltYm9sLW9iamVjdCIsNjAwNDMpLHN5bWJvbE1ldGhvZDphKCJzeW1ib2wtbWV0aG9kIiw2MDA0NCksc3ltYm9sRnVuY3Rpb246YSgic3ltYm9sLWZ1bmN0aW9uIiw2MDA0NCksc3ltYm9sQ29uc3RydWN0b3I6YSgic3ltYm9sLWNvbnN0cnVjdG9yIiw2MDA0NCksc3ltYm9sQm9vbGVhbjphKCJzeW1ib2wtYm9vbGVhbiIsNjAwNDcpLHN5bWJvbE51bGw6YSgic3ltYm9sLW51bGwiLDYwMDQ3KSxzeW1ib2xOdW1lcmljOmEoInN5bWJvbC1udW1lcmljIiw2MDA0OCksc3ltYm9sTnVtYmVyOmEoInN5bWJvbC1udW1iZXIiLDYwMDQ4KSxzeW1ib2xTdHJ1Y3R1cmU6YSgic3ltYm9sLXN0cnVjdHVyZSIsNjAwNDkpLHN5bWJvbFN0cnVjdDphKCJzeW1ib2wtc3RydWN0Iiw2MDA0OSksc3ltYm9sUGFyYW1ldGVyOmEoInN5bWJvbC1wYXJhbWV0ZXIiLDYwMDUwKSxzeW1ib2xUeXBlUGFyYW1ldGVyOmEoInN5bWJvbC10eXBlLXBhcmFtZXRlciIsNjAwNTApLHN5bWJvbEtleTphKCJzeW1ib2wta2V5Iiw2MDA1MSksc3ltYm9sVGV4dDphKCJzeW1ib2wtdGV4dCIsNjAwNTEpLHN5bWJvbFJlZmVyZW5jZTphKCJzeW1ib2wtcmVmZXJlbmNlIiw2MDA1MiksZ29Ub0ZpbGU6YSgiZ28tdG8tZmlsZSIsNjAwNTIpLHN5bWJvbEVudW06YSgic3ltYm9sLWVudW0iLDYwMDUzKSxzeW1ib2xWYWx1ZTphKCJzeW1ib2wtdmFsdWUiLDYwMDUzKSxzeW1ib2xSdWxlcjphKCJzeW1ib2wtcnVsZXIiLDYwMDU0KSxzeW1ib2xVbml0OmEoInN5bWJvbC11bml0Iiw2MDA1NCksYWN0aXZhdGVCcmVha3BvaW50czphKCJhY3RpdmF0ZS1icmVha3BvaW50cyIsNjAwNTUpLGFyY2hpdmU6YSgiYXJjaGl2ZSIsNjAwNTYpLGFycm93Qm90aDphKCJhcnJvdy1ib3RoIiw2MDA1NyksYXJyb3dEb3duOmEoImFycm93LWRvd24iLDYwMDU4KSxhcnJvd0xlZnQ6YSgiYXJyb3ctbGVmdCIsNjAwNTkpLGFycm93UmlnaHQ6YSgiYXJyb3ctcmlnaHQiLDYwMDYwKSxhcnJvd1NtYWxsRG93bjphKCJhcnJvdy1zbWFsbC1kb3duIiw2MDA2MSksYXJyb3dTbWFsbExlZnQ6YSgiYXJyb3ctc21hbGwtbGVmdCIsNjAwNjIpLGFycm93U21hbGxSaWdodDphKCJhcnJvdy1zbWFsbC1yaWdodCIsNjAwNjMpLGFycm93U21hbGxVcDphKCJhcnJvdy1zbWFsbC11cCIsNjAwNjQpLGFycm93VXA6YSgiYXJyb3ctdXAiLDYwMDY1KSxiZWxsOmEoImJlbGwiLDYwMDY2KSxib2xkOmEoImJvbGQiLDYwMDY3KSxib29rOmEoImJvb2siLDYwMDY4KSxib29rbWFyazphKCJib29rbWFyayIsNjAwNjkpLGRlYnVnQnJlYWtwb2ludENvbmRpdGlvbmFsVW52ZXJpZmllZDphKCJkZWJ1Zy1icmVha3BvaW50LWNvbmRpdGlvbmFsLXVudmVyaWZpZWQiLDYwMDcwKSxkZWJ1Z0JyZWFrcG9pbnRDb25kaXRpb25hbDphKCJkZWJ1Zy1icmVha3BvaW50LWNvbmRpdGlvbmFsIiw2MDA3MSksZGVidWdCcmVha3BvaW50Q29uZGl0aW9uYWxEaXNhYmxlZDphKCJkZWJ1Zy1icmVha3BvaW50LWNvbmRpdGlvbmFsLWRpc2FibGVkIiw2MDA3MSksZGVidWdCcmVha3BvaW50RGF0YVVudmVyaWZpZWQ6YSgiZGVidWctYnJlYWtwb2ludC1kYXRhLXVudmVyaWZpZWQiLDYwMDcyKSxkZWJ1Z0JyZWFrcG9pbnREYXRhOmEoImRlYnVnLWJyZWFrcG9pbnQtZGF0YSIsNjAwNzMpLGRlYnVnQnJlYWtwb2ludERhdGFEaXNhYmxlZDphKCJkZWJ1Zy1icmVha3BvaW50LWRhdGEtZGlzYWJsZWQiLDYwMDczKSxkZWJ1Z0JyZWFrcG9pbnRMb2dVbnZlcmlmaWVkOmEoImRlYnVnLWJyZWFrcG9pbnQtbG9nLXVudmVyaWZpZWQiLDYwMDc0KSxkZWJ1Z0JyZWFrcG9pbnRMb2c6YSgiZGVidWctYnJlYWtwb2ludC1sb2ciLDYwMDc1KSxkZWJ1Z0JyZWFrcG9pbnRMb2dEaXNhYmxlZDphKCJkZWJ1Zy1icmVha3BvaW50LWxvZy1kaXNhYmxlZCIsNjAwNzUpLGJyaWVmY2FzZTphKCJicmllZmNhc2UiLDYwMDc2KSxicm9hZGNhc3Q6YSgiYnJvYWRjYXN0Iiw2MDA3NyksYnJvd3NlcjphKCJicm93c2VyIiw2MDA3OCksYnVnOmEoImJ1ZyIsNjAwNzkpLGNhbGVuZGFyOmEoImNhbGVuZGFyIiw2MDA4MCksY2FzZVNlbnNpdGl2ZTphKCJjYXNlLXNlbnNpdGl2ZSIsNjAwODEpLGNoZWNrOmEoImNoZWNrIiw2MDA4MiksY2hlY2tsaXN0OmEoImNoZWNrbGlzdCIsNjAwODMpLGNoZXZyb25Eb3duOmEoImNoZXZyb24tZG93biIsNjAwODQpLGNoZXZyb25MZWZ0OmEoImNoZXZyb24tbGVmdCIsNjAwODUpLGNoZXZyb25SaWdodDphKCJjaGV2cm9uLXJpZ2h0Iiw2MDA4NiksY2hldnJvblVwOmEoImNoZXZyb24tdXAiLDYwMDg3KSxjaHJvbWVDbG9zZTphKCJjaHJvbWUtY2xvc2UiLDYwMDg4KSxjaHJvbWVNYXhpbWl6ZTphKCJjaHJvbWUtbWF4aW1pemUiLDYwMDg5KSxjaHJvbWVNaW5pbWl6ZTphKCJjaHJvbWUtbWluaW1pemUiLDYwMDkwKSxjaHJvbWVSZXN0b3JlOmEoImNocm9tZS1yZXN0b3JlIiw2MDA5MSksY2lyY2xlT3V0bGluZTphKCJjaXJjbGUtb3V0bGluZSIsNjAwOTIpLGNpcmNsZTphKCJjaXJjbGUiLDYwMDkyKSxkZWJ1Z0JyZWFrcG9pbnRVbnZlcmlmaWVkOmEoImRlYnVnLWJyZWFrcG9pbnQtdW52ZXJpZmllZCIsNjAwOTIpLHRlcm1pbmFsRGVjb3JhdGlvbkluY29tcGxldGU6YSgidGVybWluYWwtZGVjb3JhdGlvbi1pbmNvbXBsZXRlIiw2MDA5MiksY2lyY2xlU2xhc2g6YSgiY2lyY2xlLXNsYXNoIiw2MDA5MyksY2lyY3VpdEJvYXJkOmEoImNpcmN1aXQtYm9hcmQiLDYwMDk0KSxjbGVhckFsbDphKCJjbGVhci1hbGwiLDYwMDk1KSxjbGlwcHk6YSgiY2xpcHB5Iiw2MDA5NiksY2xvc2VBbGw6YSgiY2xvc2UtYWxsIiw2MDA5NyksY2xvdWREb3dubG9hZDphKCJjbG91ZC1kb3dubG9hZCIsNjAwOTgpLGNsb3VkVXBsb2FkOmEoImNsb3VkLXVwbG9hZCIsNjAwOTkpLGNvZGU6YSgiY29kZSIsNjAxMDApLGNvbGxhcHNlQWxsOmEoImNvbGxhcHNlLWFsbCIsNjAxMDEpLGNvbG9yTW9kZTphKCJjb2xvci1tb2RlIiw2MDEwMiksY29tbWVudERpc2N1c3Npb246YSgiY29tbWVudC1kaXNjdXNzaW9uIiw2MDEwMyksY3JlZGl0Q2FyZDphKCJjcmVkaXQtY2FyZCIsNjAxMDUpLGRhc2g6YSgiZGFzaCIsNjAxMDgpLGRhc2hib2FyZDphKCJkYXNoYm9hcmQiLDYwMTA5KSxkYXRhYmFzZTphKCJkYXRhYmFzZSIsNjAxMTApLGRlYnVnQ29udGludWU6YSgiZGVidWctY29udGludWUiLDYwMTExKSxkZWJ1Z0Rpc2Nvbm5lY3Q6YSgiZGVidWctZGlzY29ubmVjdCIsNjAxMTIpLGRlYnVnUGF1c2U6YSgiZGVidWctcGF1c2UiLDYwMTEzKSxkZWJ1Z1Jlc3RhcnQ6YSgiZGVidWctcmVzdGFydCIsNjAxMTQpLGRlYnVnU3RhcnQ6YSgiZGVidWctc3RhcnQiLDYwMTE1KSxkZWJ1Z1N0ZXBJbnRvOmEoImRlYnVnLXN0ZXAtaW50byIsNjAxMTYpLGRlYnVnU3RlcE91dDphKCJkZWJ1Zy1zdGVwLW91dCIsNjAxMTcpLGRlYnVnU3RlcE92ZXI6YSgiZGVidWctc3RlcC1vdmVyIiw2MDExOCksZGVidWdTdG9wOmEoImRlYnVnLXN0b3AiLDYwMTE5KSxkZWJ1ZzphKCJkZWJ1ZyIsNjAxMjApLGRldmljZUNhbWVyYVZpZGVvOmEoImRldmljZS1jYW1lcmEtdmlkZW8iLDYwMTIxKSxkZXZpY2VDYW1lcmE6YSgiZGV2aWNlLWNhbWVyYSIsNjAxMjIpLGRldmljZU1vYmlsZTphKCJkZXZpY2UtbW9iaWxlIiw2MDEyMyksZGlmZkFkZGVkOmEoImRpZmYtYWRkZWQiLDYwMTI0KSxkaWZmSWdub3JlZDphKCJkaWZmLWlnbm9yZWQiLDYwMTI1KSxkaWZmTW9kaWZpZWQ6YSgiZGlmZi1tb2RpZmllZCIsNjAxMjYpLGRpZmZSZW1vdmVkOmEoImRpZmYtcmVtb3ZlZCIsNjAxMjcpLGRpZmZSZW5hbWVkOmEoImRpZmYtcmVuYW1lZCIsNjAxMjgpLGRpZmY6YSgiZGlmZiIsNjAxMjkpLGRpZmZTaWRlYnlzaWRlOmEoImRpZmYtc2lkZWJ5c2lkZSIsNjAxMjkpLGRpc2NhcmQ6YSgiZGlzY2FyZCIsNjAxMzApLGVkaXRvckxheW91dDphKCJlZGl0b3ItbGF5b3V0Iiw2MDEzMSksZW1wdHlXaW5kb3c6YSgiZW1wdHktd2luZG93Iiw2MDEzMiksZXhjbHVkZTphKCJleGNsdWRlIiw2MDEzMyksZXh0ZW5zaW9uczphKCJleHRlbnNpb25zIiw2MDEzNCksZXllQ2xvc2VkOmEoImV5ZS1jbG9zZWQiLDYwMTM1KSxmaWxlQmluYXJ5OmEoImZpbGUtYmluYXJ5Iiw2MDEzNiksZmlsZUNvZGU6YSgiZmlsZS1jb2RlIiw2MDEzNyksZmlsZU1lZGlhOmEoImZpbGUtbWVkaWEiLDYwMTM4KSxmaWxlUGRmOmEoImZpbGUtcGRmIiw2MDEzOSksZmlsZVN1Ym1vZHVsZTphKCJmaWxlLXN1Ym1vZHVsZSIsNjAxNDApLGZpbGVTeW1saW5rRGlyZWN0b3J5OmEoImZpbGUtc3ltbGluay1kaXJlY3RvcnkiLDYwMTQxKSxmaWxlU3ltbGlua0ZpbGU6YSgiZmlsZS1zeW1saW5rLWZpbGUiLDYwMTQyKSxmaWxlWmlwOmEoImZpbGUtemlwIiw2MDE0MyksZmlsZXM6YSgiZmlsZXMiLDYwMTQ0KSxmaWx0ZXI6YSgiZmlsdGVyIiw2MDE0NSksZmxhbWU6YSgiZmxhbWUiLDYwMTQ2KSxmb2xkRG93bjphKCJmb2xkLWRvd24iLDYwMTQ3KSxmb2xkVXA6YSgiZm9sZC11cCIsNjAxNDgpLGZvbGQ6YSgiZm9sZCIsNjAxNDkpLGZvbGRlckFjdGl2ZTphKCJmb2xkZXItYWN0aXZlIiw2MDE1MCksZm9sZGVyT3BlbmVkOmEoImZvbGRlci1vcGVuZWQiLDYwMTUxKSxnZWFyOmEoImdlYXIiLDYwMTUyKSxnaWZ0OmEoImdpZnQiLDYwMTUzKSxnaXN0U2VjcmV0OmEoImdpc3Qtc2VjcmV0Iiw2MDE1NCksZ2lzdDphKCJnaXN0Iiw2MDE1NSksZ2l0Q29tbWl0OmEoImdpdC1jb21taXQiLDYwMTU2KSxnaXRDb21wYXJlOmEoImdpdC1jb21wYXJlIiw2MDE1NyksY29tcGFyZUNoYW5nZXM6YSgiY29tcGFyZS1jaGFuZ2VzIiw2MDE1NyksZ2l0TWVyZ2U6YSgiZ2l0LW1lcmdlIiw2MDE1OCksZ2l0aHViQWN0aW9uOmEoImdpdGh1Yi1hY3Rpb24iLDYwMTU5KSxnaXRodWJBbHQ6YSgiZ2l0aHViLWFsdCIsNjAxNjApLGdsb2JlOmEoImdsb2JlIiw2MDE2MSksZ3JhYmJlcjphKCJncmFiYmVyIiw2MDE2MiksZ3JhcGg6YSgiZ3JhcGgiLDYwMTYzKSxncmlwcGVyOmEoImdyaXBwZXIiLDYwMTY0KSxoZWFydDphKCJoZWFydCIsNjAxNjUpLGhvbWU6YSgiaG9tZSIsNjAxNjYpLGhvcml6b250YWxSdWxlOmEoImhvcml6b250YWwtcnVsZSIsNjAxNjcpLGh1Ym90OmEoImh1Ym90Iiw2MDE2OCksaW5ib3g6YSgiaW5ib3giLDYwMTY5KSxpc3N1ZVJlb3BlbmVkOmEoImlzc3VlLXJlb3BlbmVkIiw2MDE3MSksaXNzdWVzOmEoImlzc3VlcyIsNjAxNzIpLGl0YWxpYzphKCJpdGFsaWMiLDYwMTczKSxqZXJzZXk6YSgiamVyc2V5Iiw2MDE3NCksanNvbjphKCJqc29uIiw2MDE3NSksa2ViYWJWZXJ0aWNhbDphKCJrZWJhYi12ZXJ0aWNhbCIsNjAxNzYpLGtleTphKCJrZXkiLDYwMTc3KSxsYXc6YSgibGF3Iiw2MDE3OCksbGlnaHRidWxiQXV0b2ZpeDphKCJsaWdodGJ1bGItYXV0b2ZpeCIsNjAxNzkpLGxpbmtFeHRlcm5hbDphKCJsaW5rLWV4dGVybmFsIiw2MDE4MCksbGluazphKCJsaW5rIiw2MDE4MSksbGlzdE9yZGVyZWQ6YSgibGlzdC1vcmRlcmVkIiw2MDE4MiksbGlzdFVub3JkZXJlZDphKCJsaXN0LXVub3JkZXJlZCIsNjAxODMpLGxpdmVTaGFyZTphKCJsaXZlLXNoYXJlIiw2MDE4NCksbG9hZGluZzphKCJsb2FkaW5nIiw2MDE4NSksbG9jYXRpb246YSgibG9jYXRpb24iLDYwMTg2KSxtYWlsUmVhZDphKCJtYWlsLXJlYWQiLDYwMTg3KSxtYWlsOmEoIm1haWwiLDYwMTg4KSxtYXJrZG93bjphKCJtYXJrZG93biIsNjAxODkpLG1lZ2FwaG9uZTphKCJtZWdhcGhvbmUiLDYwMTkwKSxtZW50aW9uOmEoIm1lbnRpb24iLDYwMTkxKSxtaWxlc3RvbmU6YSgibWlsZXN0b25lIiw2MDE5MiksZ2l0UHVsbFJlcXVlc3RNaWxlc3RvbmU6YSgiZ2l0LXB1bGwtcmVxdWVzdC1taWxlc3RvbmUiLDYwMTkyKSxtb3J0YXJCb2FyZDphKCJtb3J0YXItYm9hcmQiLDYwMTkzKSxtb3ZlOmEoIm1vdmUiLDYwMTk0KSxtdWx0aXBsZVdpbmRvd3M6YSgibXVsdGlwbGUtd2luZG93cyIsNjAxOTUpLG11dGU6YSgibXV0ZSIsNjAxOTYpLG5vTmV3bGluZTphKCJuby1uZXdsaW5lIiw2MDE5Nyksbm90ZTphKCJub3RlIiw2MDE5OCksb2N0b2ZhY2U6YSgib2N0b2ZhY2UiLDYwMTk5KSxvcGVuUHJldmlldzphKCJvcGVuLXByZXZpZXciLDYwMjAwKSxwYWNrYWdlOmEoInBhY2thZ2UiLDYwMjAxKSxwYWludGNhbjphKCJwYWludGNhbiIsNjAyMDIpLHBpbjphKCJwaW4iLDYwMjAzKSxwbGF5OmEoInBsYXkiLDYwMjA0KSxydW46YSgicnVuIiw2MDIwNCkscGx1ZzphKCJwbHVnIiw2MDIwNSkscHJlc2VydmVDYXNlOmEoInByZXNlcnZlLWNhc2UiLDYwMjA2KSxwcmV2aWV3OmEoInByZXZpZXciLDYwMjA3KSxwcm9qZWN0OmEoInByb2plY3QiLDYwMjA4KSxwdWxzZTphKCJwdWxzZSIsNjAyMDkpLHF1ZXN0aW9uOmEoInF1ZXN0aW9uIiw2MDIxMCkscXVvdGU6YSgicXVvdGUiLDYwMjExKSxyYWRpb1Rvd2VyOmEoInJhZGlvLXRvd2VyIiw2MDIxMikscmVhY3Rpb25zOmEoInJlYWN0aW9ucyIsNjAyMTMpLHJlZmVyZW5jZXM6YSgicmVmZXJlbmNlcyIsNjAyMTQpLHJlZnJlc2g6YSgicmVmcmVzaCIsNjAyMTUpLHJlZ2V4OmEoInJlZ2V4Iiw2MDIxNikscmVtb3RlRXhwbG9yZXI6YSgicmVtb3RlLWV4cGxvcmVyIiw2MDIxNykscmVtb3RlOmEoInJlbW90ZSIsNjAyMTgpLHJlbW92ZTphKCJyZW1vdmUiLDYwMjE5KSxyZXBsYWNlQWxsOmEoInJlcGxhY2UtYWxsIiw2MDIyMCkscmVwbGFjZTphKCJyZXBsYWNlIiw2MDIyMSkscmVwb0Nsb25lOmEoInJlcG8tY2xvbmUiLDYwMjIyKSxyZXBvRm9yY2VQdXNoOmEoInJlcG8tZm9yY2UtcHVzaCIsNjAyMjMpLHJlcG9QdWxsOmEoInJlcG8tcHVsbCIsNjAyMjQpLHJlcG9QdXNoOmEoInJlcG8tcHVzaCIsNjAyMjUpLHJlcG9ydDphKCJyZXBvcnQiLDYwMjI2KSxyZXF1ZXN0Q2hhbmdlczphKCJyZXF1ZXN0LWNoYW5nZXMiLDYwMjI3KSxyb2NrZXQ6YSgicm9ja2V0Iiw2MDIyOCkscm9vdEZvbGRlck9wZW5lZDphKCJyb290LWZvbGRlci1vcGVuZWQiLDYwMjI5KSxyb290Rm9sZGVyOmEoInJvb3QtZm9sZGVyIiw2MDIzMCkscnNzOmEoInJzcyIsNjAyMzEpLHJ1Ynk6YSgicnVieSIsNjAyMzIpLHNhdmVBbGw6YSgic2F2ZS1hbGwiLDYwMjMzKSxzYXZlQXM6YSgic2F2ZS1hcyIsNjAyMzQpLHNhdmU6YSgic2F2ZSIsNjAyMzUpLHNjcmVlbkZ1bGw6YSgic2NyZWVuLWZ1bGwiLDYwMjM2KSxzY3JlZW5Ob3JtYWw6YSgic2NyZWVuLW5vcm1hbCIsNjAyMzcpLHNlYXJjaFN0b3A6YSgic2VhcmNoLXN0b3AiLDYwMjM4KSxzZXJ2ZXI6YSgic2VydmVyIiw2MDI0MCksc2V0dGluZ3NHZWFyOmEoInNldHRpbmdzLWdlYXIiLDYwMjQxKSxzZXR0aW5nczphKCJzZXR0aW5ncyIsNjAyNDIpLHNoaWVsZDphKCJzaGllbGQiLDYwMjQzKSxzbWlsZXk6YSgic21pbGV5Iiw2MDI0NCksc29ydFByZWNlZGVuY2U6YSgic29ydC1wcmVjZWRlbmNlIiw2MDI0NSksc3BsaXRIb3Jpem9udGFsOmEoInNwbGl0LWhvcml6b250YWwiLDYwMjQ2KSxzcGxpdFZlcnRpY2FsOmEoInNwbGl0LXZlcnRpY2FsIiw2MDI0Nyksc3F1aXJyZWw6YSgic3F1aXJyZWwiLDYwMjQ4KSxzdGFyRnVsbDphKCJzdGFyLWZ1bGwiLDYwMjQ5KSxzdGFySGFsZjphKCJzdGFyLWhhbGYiLDYwMjUwKSxzeW1ib2xDbGFzczphKCJzeW1ib2wtY2xhc3MiLDYwMjUxKSxzeW1ib2xDb2xvcjphKCJzeW1ib2wtY29sb3IiLDYwMjUyKSxzeW1ib2xDb25zdGFudDphKCJzeW1ib2wtY29uc3RhbnQiLDYwMjUzKSxzeW1ib2xFbnVtTWVtYmVyOmEoInN5bWJvbC1lbnVtLW1lbWJlciIsNjAyNTQpLHN5bWJvbEZpZWxkOmEoInN5bWJvbC1maWVsZCIsNjAyNTUpLHN5bWJvbEZpbGU6YSgic3ltYm9sLWZpbGUiLDYwMjU2KSxzeW1ib2xJbnRlcmZhY2U6YSgic3ltYm9sLWludGVyZmFjZSIsNjAyNTcpLHN5bWJvbEtleXdvcmQ6YSgic3ltYm9sLWtleXdvcmQiLDYwMjU4KSxzeW1ib2xNaXNjOmEoInN5bWJvbC1taXNjIiw2MDI1OSksc3ltYm9sT3BlcmF0b3I6YSgic3ltYm9sLW9wZXJhdG9yIiw2MDI2MCksc3ltYm9sUHJvcGVydHk6YSgic3ltYm9sLXByb3BlcnR5Iiw2MDI2MSksd3JlbmNoOmEoIndyZW5jaCIsNjAyNjEpLHdyZW5jaFN1YmFjdGlvbjphKCJ3cmVuY2gtc3ViYWN0aW9uIiw2MDI2MSksc3ltYm9sU25pcHBldDphKCJzeW1ib2wtc25pcHBldCIsNjAyNjIpLHRhc2tsaXN0OmEoInRhc2tsaXN0Iiw2MDI2MyksdGVsZXNjb3BlOmEoInRlbGVzY29wZSIsNjAyNjQpLHRleHRTaXplOmEoInRleHQtc2l6ZSIsNjAyNjUpLHRocmVlQmFyczphKCJ0aHJlZS1iYXJzIiw2MDI2NiksdGh1bWJzZG93bjphKCJ0aHVtYnNkb3duIiw2MDI2NyksdGh1bWJzdXA6YSgidGh1bWJzdXAiLDYwMjY4KSx0b29sczphKCJ0b29scyIsNjAyNjkpLHRyaWFuZ2xlRG93bjphKCJ0cmlhbmdsZS1kb3duIiw2MDI3MCksdHJpYW5nbGVMZWZ0OmEoInRyaWFuZ2xlLWxlZnQiLDYwMjcxKSx0cmlhbmdsZVJpZ2h0OmEoInRyaWFuZ2xlLXJpZ2h0Iiw2MDI3MiksdHJpYW5nbGVVcDphKCJ0cmlhbmdsZS11cCIsNjAyNzMpLHR3aXR0ZXI6YSgidHdpdHRlciIsNjAyNzQpLHVuZm9sZDphKCJ1bmZvbGQiLDYwMjc1KSx1bmxvY2s6YSgidW5sb2NrIiw2MDI3NiksdW5tdXRlOmEoInVubXV0ZSIsNjAyNzcpLHVudmVyaWZpZWQ6YSgidW52ZXJpZmllZCIsNjAyNzgpLHZlcmlmaWVkOmEoInZlcmlmaWVkIiw2MDI3OSksdmVyc2lvbnM6YSgidmVyc2lvbnMiLDYwMjgwKSx2bUFjdGl2ZTphKCJ2bS1hY3RpdmUiLDYwMjgxKSx2bU91dGxpbmU6YSgidm0tb3V0bGluZSIsNjAyODIpLHZtUnVubmluZzphKCJ2bS1ydW5uaW5nIiw2MDI4Myksd2F0Y2g6YSgid2F0Y2giLDYwMjg0KSx3aGl0ZXNwYWNlOmEoIndoaXRlc3BhY2UiLDYwMjg1KSx3aG9sZVdvcmQ6YSgid2hvbGUtd29yZCIsNjAyODYpLHdpbmRvdzphKCJ3aW5kb3ciLDYwMjg3KSx3b3JkV3JhcDphKCJ3b3JkLXdyYXAiLDYwMjg4KSx6b29tSW46YSgiem9vbS1pbiIsNjAyODkpLHpvb21PdXQ6YSgiem9vbS1vdXQiLDYwMjkwKSxsaXN0RmlsdGVyOmEoImxpc3QtZmlsdGVyIiw2MDI5MSksbGlzdEZsYXQ6YSgibGlzdC1mbGF0Iiw2MDI5MiksbGlzdFNlbGVjdGlvbjphKCJsaXN0LXNlbGVjdGlvbiIsNjAyOTMpLHNlbGVjdGlvbjphKCJzZWxlY3Rpb24iLDYwMjkzKSxsaXN0VHJlZTphKCJsaXN0LXRyZWUiLDYwMjk0KSxkZWJ1Z0JyZWFrcG9pbnRGdW5jdGlvblVudmVyaWZpZWQ6YSgiZGVidWctYnJlYWtwb2ludC1mdW5jdGlvbi11bnZlcmlmaWVkIiw2MDI5NSksZGVidWdCcmVha3BvaW50RnVuY3Rpb246YSgiZGVidWctYnJlYWtwb2ludC1mdW5jdGlvbiIsNjAyOTYpLGRlYnVnQnJlYWtwb2ludEZ1bmN0aW9uRGlzYWJsZWQ6YSgiZGVidWctYnJlYWtwb2ludC1mdW5jdGlvbi1kaXNhYmxlZCIsNjAyOTYpLGRlYnVnU3RhY2tmcmFtZUFjdGl2ZTphKCJkZWJ1Zy1zdGFja2ZyYW1lLWFjdGl2ZSIsNjAyOTcpLGNpcmNsZVNtYWxsRmlsbGVkOmEoImNpcmNsZS1zbWFsbC1maWxsZWQiLDYwMjk4KSxkZWJ1Z1N0YWNrZnJhbWVEb3Q6YSgiZGVidWctc3RhY2tmcmFtZS1kb3QiLDYwMjk4KSx0ZXJtaW5hbERlY29yYXRpb25NYXJrOmEoInRlcm1pbmFsLWRlY29yYXRpb24tbWFyayIsNjAyOTgpLGRlYnVnU3RhY2tmcmFtZTphKCJkZWJ1Zy1zdGFja2ZyYW1lIiw2MDI5OSksZGVidWdTdGFja2ZyYW1lRm9jdXNlZDphKCJkZWJ1Zy1zdGFja2ZyYW1lLWZvY3VzZWQiLDYwMjk5KSxkZWJ1Z0JyZWFrcG9pbnRVbnN1cHBvcnRlZDphKCJkZWJ1Zy1icmVha3BvaW50LXVuc3VwcG9ydGVkIiw2MDMwMCksc3ltYm9sU3RyaW5nOmEoInN5bWJvbC1zdHJpbmciLDYwMzAxKSxkZWJ1Z1JldmVyc2VDb250aW51ZTphKCJkZWJ1Zy1yZXZlcnNlLWNvbnRpbnVlIiw2MDMwMiksZGVidWdTdGVwQmFjazphKCJkZWJ1Zy1zdGVwLWJhY2siLDYwMzAzKSxkZWJ1Z1Jlc3RhcnRGcmFtZTphKCJkZWJ1Zy1yZXN0YXJ0LWZyYW1lIiw2MDMwNCksZGVidWdBbHQ6YSgiZGVidWctYWx0Iiw2MDMwNSksY2FsbEluY29taW5nOmEoImNhbGwtaW5jb21pbmciLDYwMzA2KSxjYWxsT3V0Z29pbmc6YSgiY2FsbC1vdXRnb2luZyIsNjAzMDcpLG1lbnU6YSgibWVudSIsNjAzMDgpLGV4cGFuZEFsbDphKCJleHBhbmQtYWxsIiw2MDMwOSksZmVlZGJhY2s6YSgiZmVlZGJhY2siLDYwMzEwKSxnaXRQdWxsUmVxdWVzdFJldmlld2VyOmEoImdpdC1wdWxsLXJlcXVlc3QtcmV2aWV3ZXIiLDYwMzEwKSxncm91cEJ5UmVmVHlwZTphKCJncm91cC1ieS1yZWYtdHlwZSIsNjAzMTEpLHVuZ3JvdXBCeVJlZlR5cGU6YSgidW5ncm91cC1ieS1yZWYtdHlwZSIsNjAzMTIpLGFjY291bnQ6YSgiYWNjb3VudCIsNjAzMTMpLGdpdFB1bGxSZXF1ZXN0QXNzaWduZWU6YSgiZ2l0LXB1bGwtcmVxdWVzdC1hc3NpZ25lZSIsNjAzMTMpLGJlbGxEb3Q6YSgiYmVsbC1kb3QiLDYwMzE0KSxkZWJ1Z0NvbnNvbGU6YSgiZGVidWctY29uc29sZSIsNjAzMTUpLGxpYnJhcnk6YSgibGlicmFyeSIsNjAzMTYpLG91dHB1dDphKCJvdXRwdXQiLDYwMzE3KSxydW5BbGw6YSgicnVuLWFsbCIsNjAzMTgpLHN5bmNJZ25vcmVkOmEoInN5bmMtaWdub3JlZCIsNjAzMTkpLHBpbm5lZDphKCJwaW5uZWQiLDYwMzIwKSxnaXRodWJJbnZlcnRlZDphKCJnaXRodWItaW52ZXJ0ZWQiLDYwMzIxKSxzZXJ2ZXJQcm9jZXNzOmEoInNlcnZlci1wcm9jZXNzIiw2MDMyMiksc2VydmVyRW52aXJvbm1lbnQ6YSgic2VydmVyLWVudmlyb25tZW50Iiw2MDMyMykscGFzczphKCJwYXNzIiw2MDMyNCksaXNzdWVDbG9zZWQ6YSgiaXNzdWUtY2xvc2VkIiw2MDMyNCksc3RvcENpcmNsZTphKCJzdG9wLWNpcmNsZSIsNjAzMjUpLHBsYXlDaXJjbGU6YSgicGxheS1jaXJjbGUiLDYwMzI2KSxyZWNvcmQ6YSgicmVjb3JkIiw2MDMyNyksZGVidWdBbHRTbWFsbDphKCJkZWJ1Zy1hbHQtc21hbGwiLDYwMzI4KSx2bUNvbm5lY3Q6YSgidm0tY29ubmVjdCIsNjAzMjkpLGNsb3VkOmEoImNsb3VkIiw2MDMzMCksbWVyZ2U6YSgibWVyZ2UiLDYwMzMxKSxleHBvcnQ6YSgiZXhwb3J0Iiw2MDMzMiksZ3JhcGhMZWZ0OmEoImdyYXBoLWxlZnQiLDYwMzMzKSxtYWduZXQ6YSgibWFnbmV0Iiw2MDMzNCksbm90ZWJvb2s6YSgibm90ZWJvb2siLDYwMzM1KSxyZWRvOmEoInJlZG8iLDYwMzM2KSxjaGVja0FsbDphKCJjaGVjay1hbGwiLDYwMzM3KSxwaW5uZWREaXJ0eTphKCJwaW5uZWQtZGlydHkiLDYwMzM4KSxwYXNzRmlsbGVkOmEoInBhc3MtZmlsbGVkIiw2MDMzOSksY2lyY2xlTGFyZ2VGaWxsZWQ6YSgiY2lyY2xlLWxhcmdlLWZpbGxlZCIsNjAzNDApLGNpcmNsZUxhcmdlOmEoImNpcmNsZS1sYXJnZSIsNjAzNDEpLGNpcmNsZUxhcmdlT3V0bGluZTphKCJjaXJjbGUtbGFyZ2Utb3V0bGluZSIsNjAzNDEpLGNvbWJpbmU6YSgiY29tYmluZSIsNjAzNDIpLGdhdGhlcjphKCJnYXRoZXIiLDYwMzQyKSx0YWJsZTphKCJ0YWJsZSIsNjAzNDMpLHZhcmlhYmxlR3JvdXA6YSgidmFyaWFibGUtZ3JvdXAiLDYwMzQ0KSx0eXBlSGllcmFyY2h5OmEoInR5cGUtaGllcmFyY2h5Iiw2MDM0NSksdHlwZUhpZXJhcmNoeVN1YjphKCJ0eXBlLWhpZXJhcmNoeS1zdWIiLDYwMzQ2KSx0eXBlSGllcmFyY2h5U3VwZXI6YSgidHlwZS1oaWVyYXJjaHktc3VwZXIiLDYwMzQ3KSxnaXRQdWxsUmVxdWVzdENyZWF0ZTphKCJnaXQtcHVsbC1yZXF1ZXN0LWNyZWF0ZSIsNjAzNDgpLHJ1bkFib3ZlOmEoInJ1bi1hYm92ZSIsNjAzNDkpLHJ1bkJlbG93OmEoInJ1bi1iZWxvdyIsNjAzNTApLG5vdGVib29rVGVtcGxhdGU6YSgibm90ZWJvb2stdGVtcGxhdGUiLDYwMzUxKSxkZWJ1Z1JlcnVuOmEoImRlYnVnLXJlcnVuIiw2MDM1Miksd29ya3NwYWNlVHJ1c3RlZDphKCJ3b3Jrc3BhY2UtdHJ1c3RlZCIsNjAzNTMpLHdvcmtzcGFjZVVudHJ1c3RlZDphKCJ3b3Jrc3BhY2UtdW50cnVzdGVkIiw2MDM1NCksd29ya3NwYWNlVW5rbm93bjphKCJ3b3Jrc3BhY2UtdW5rbm93biIsNjAzNTUpLHRlcm1pbmFsQ21kOmEoInRlcm1pbmFsLWNtZCIsNjAzNTYpLHRlcm1pbmFsRGViaWFuOmEoInRlcm1pbmFsLWRlYmlhbiIsNjAzNTcpLHRlcm1pbmFsTGludXg6YSgidGVybWluYWwtbGludXgiLDYwMzU4KSx0ZXJtaW5hbFBvd2Vyc2hlbGw6YSgidGVybWluYWwtcG93ZXJzaGVsbCIsNjAzNTkpLHRlcm1pbmFsVG11eDphKCJ0ZXJtaW5hbC10bXV4Iiw2MDM2MCksdGVybWluYWxVYnVudHU6YSgidGVybWluYWwtdWJ1bnR1Iiw2MDM2MSksdGVybWluYWxCYXNoOmEoInRlcm1pbmFsLWJhc2giLDYwMzYyKSxhcnJvd1N3YXA6YSgiYXJyb3ctc3dhcCIsNjAzNjMpLGNvcHk6YSgiY29weSIsNjAzNjQpLHBlcnNvbkFkZDphKCJwZXJzb24tYWRkIiw2MDM2NSksZmlsdGVyRmlsbGVkOmEoImZpbHRlci1maWxsZWQiLDYwMzY2KSx3YW5kOmEoIndhbmQiLDYwMzY3KSxkZWJ1Z0xpbmVCeUxpbmU6YSgiZGVidWctbGluZS1ieS1saW5lIiw2MDM2OCksaW5zcGVjdDphKCJpbnNwZWN0Iiw2MDM2OSksbGF5ZXJzOmEoImxheWVycyIsNjAzNzApLGxheWVyc0RvdDphKCJsYXllcnMtZG90Iiw2MDM3MSksbGF5ZXJzQWN0aXZlOmEoImxheWVycy1hY3RpdmUiLDYwMzcyKSxjb21wYXNzOmEoImNvbXBhc3MiLDYwMzczKSxjb21wYXNzRG90OmEoImNvbXBhc3MtZG90Iiw2MDM3NCksY29tcGFzc0FjdGl2ZTphKCJjb21wYXNzLWFjdGl2ZSIsNjAzNzUpLGF6dXJlOmEoImF6dXJlIiw2MDM3NiksaXNzdWVEcmFmdDphKCJpc3N1ZS1kcmFmdCIsNjAzNzcpLGdpdFB1bGxSZXF1ZXN0Q2xvc2VkOmEoImdpdC1wdWxsLXJlcXVlc3QtY2xvc2VkIiw2MDM3OCksZ2l0UHVsbFJlcXVlc3REcmFmdDphKCJnaXQtcHVsbC1yZXF1ZXN0LWRyYWZ0Iiw2MDM3OSksZGVidWdBbGw6YSgiZGVidWctYWxsIiw2MDM4MCksZGVidWdDb3ZlcmFnZTphKCJkZWJ1Zy1jb3ZlcmFnZSIsNjAzODEpLHJ1bkVycm9yczphKCJydW4tZXJyb3JzIiw2MDM4MiksZm9sZGVyTGlicmFyeTphKCJmb2xkZXItbGlicmFyeSIsNjAzODMpLGRlYnVnQ29udGludWVTbWFsbDphKCJkZWJ1Zy1jb250aW51ZS1zbWFsbCIsNjAzODQpLGJlYWtlclN0b3A6YSgiYmVha2VyLXN0b3AiLDYwMzg1KSxncmFwaExpbmU6YSgiZ3JhcGgtbGluZSIsNjAzODYpLGdyYXBoU2NhdHRlcjphKCJncmFwaC1zY2F0dGVyIiw2MDM4NykscGllQ2hhcnQ6YSgicGllLWNoYXJ0Iiw2MDM4OCksYnJhY2tldDphKCJicmFja2V0Iiw2MDE3NSksYnJhY2tldERvdDphKCJicmFja2V0LWRvdCIsNjAzODkpLGJyYWNrZXRFcnJvcjphKCJicmFja2V0LWVycm9yIiw2MDM5MCksbG9ja1NtYWxsOmEoImxvY2stc21hbGwiLDYwMzkxKSxhenVyZURldm9wczphKCJhenVyZS1kZXZvcHMiLDYwMzkyKSx2ZXJpZmllZEZpbGxlZDphKCJ2ZXJpZmllZC1maWxsZWQiLDYwMzkzKSxuZXdsaW5lOmEoIm5ld2xpbmUiLDYwMzk0KSxsYXlvdXQ6YSgibGF5b3V0Iiw2MDM5NSksbGF5b3V0QWN0aXZpdHliYXJMZWZ0OmEoImxheW91dC1hY3Rpdml0eWJhci1sZWZ0Iiw2MDM5NiksbGF5b3V0QWN0aXZpdHliYXJSaWdodDphKCJsYXlvdXQtYWN0aXZpdHliYXItcmlnaHQiLDYwMzk3KSxsYXlvdXRQYW5lbExlZnQ6YSgibGF5b3V0LXBhbmVsLWxlZnQiLDYwMzk4KSxsYXlvdXRQYW5lbENlbnRlcjphKCJsYXlvdXQtcGFuZWwtY2VudGVyIiw2MDM5OSksbGF5b3V0UGFuZWxKdXN0aWZ5OmEoImxheW91dC1wYW5lbC1qdXN0aWZ5Iiw2MDQwMCksbGF5b3V0UGFuZWxSaWdodDphKCJsYXlvdXQtcGFuZWwtcmlnaHQiLDYwNDAxKSxsYXlvdXRQYW5lbDphKCJsYXlvdXQtcGFuZWwiLDYwNDAyKSxsYXlvdXRTaWRlYmFyTGVmdDphKCJsYXlvdXQtc2lkZWJhci1sZWZ0Iiw2MDQwMyksbGF5b3V0U2lkZWJhclJpZ2h0OmEoImxheW91dC1zaWRlYmFyLXJpZ2h0Iiw2MDQwNCksbGF5b3V0U3RhdHVzYmFyOmEoImxheW91dC1zdGF0dXNiYXIiLDYwNDA1KSxsYXlvdXRNZW51YmFyOmEoImxheW91dC1tZW51YmFyIiw2MDQwNiksbGF5b3V0Q2VudGVyZWQ6YSgibGF5b3V0LWNlbnRlcmVkIiw2MDQwNyksdGFyZ2V0OmEoInRhcmdldCIsNjA0MDgpLGluZGVudDphKCJpbmRlbnQiLDYwNDA5KSxyZWNvcmRTbWFsbDphKCJyZWNvcmQtc21hbGwiLDYwNDEwKSxlcnJvclNtYWxsOmEoImVycm9yLXNtYWxsIiw2MDQxMSksdGVybWluYWxEZWNvcmF0aW9uRXJyb3I6YSgidGVybWluYWwtZGVjb3JhdGlvbi1lcnJvciIsNjA0MTEpLGFycm93Q2lyY2xlRG93bjphKCJhcnJvdy1jaXJjbGUtZG93biIsNjA0MTIpLGFycm93Q2lyY2xlTGVmdDphKCJhcnJvdy1jaXJjbGUtbGVmdCIsNjA0MTMpLGFycm93Q2lyY2xlUmlnaHQ6YSgiYXJyb3ctY2lyY2xlLXJpZ2h0Iiw2MDQxNCksYXJyb3dDaXJjbGVVcDphKCJhcnJvdy1jaXJjbGUtdXAiLDYwNDE1KSxsYXlvdXRTaWRlYmFyUmlnaHRPZmY6YSgibGF5b3V0LXNpZGViYXItcmlnaHQtb2ZmIiw2MDQxNiksbGF5b3V0UGFuZWxPZmY6YSgibGF5b3V0LXBhbmVsLW9mZiIsNjA0MTcpLGxheW91dFNpZGViYXJMZWZ0T2ZmOmEoImxheW91dC1zaWRlYmFyLWxlZnQtb2ZmIiw2MDQxOCksYmxhbms6YSgiYmxhbmsiLDYwNDE5KSxoZWFydEZpbGxlZDphKCJoZWFydC1maWxsZWQiLDYwNDIwKSxtYXA6YSgibWFwIiw2MDQyMSksbWFwSG9yaXpvbnRhbDphKCJtYXAtaG9yaXpvbnRhbCIsNjA0MjEpLGZvbGRIb3Jpem9udGFsOmEoImZvbGQtaG9yaXpvbnRhbCIsNjA0MjEpLG1hcEZpbGxlZDphKCJtYXAtZmlsbGVkIiw2MDQyMiksbWFwSG9yaXpvbnRhbEZpbGxlZDphKCJtYXAtaG9yaXpvbnRhbC1maWxsZWQiLDYwNDIyKSxmb2xkSG9yaXpvbnRhbEZpbGxlZDphKCJmb2xkLWhvcml6b250YWwtZmlsbGVkIiw2MDQyMiksY2lyY2xlU21hbGw6YSgiY2lyY2xlLXNtYWxsIiw2MDQyMyksYmVsbFNsYXNoOmEoImJlbGwtc2xhc2giLDYwNDI0KSxiZWxsU2xhc2hEb3Q6YSgiYmVsbC1zbGFzaC1kb3QiLDYwNDI1KSxjb21tZW50VW5yZXNvbHZlZDphKCJjb21tZW50LXVucmVzb2x2ZWQiLDYwNDI2KSxnaXRQdWxsUmVxdWVzdEdvVG9DaGFuZ2VzOmEoImdpdC1wdWxsLXJlcXVlc3QtZ28tdG8tY2hhbmdlcyIsNjA0MjcpLGdpdFB1bGxSZXF1ZXN0TmV3Q2hhbmdlczphKCJnaXQtcHVsbC1yZXF1ZXN0LW5ldy1jaGFuZ2VzIiw2MDQyOCksc2VhcmNoRnV6enk6YSgic2VhcmNoLWZ1enp5Iiw2MDQyOSksY29tbWVudERyYWZ0OmEoImNvbW1lbnQtZHJhZnQiLDYwNDMwKSxzZW5kOmEoInNlbmQiLDYwNDMxKSxzcGFya2xlOmEoInNwYXJrbGUiLDYwNDMyKSxpbnNlcnQ6YSgiaW5zZXJ0Iiw2MDQzMyksbWljOmEoIm1pYyIsNjA0MzQpLHRodW1ic2Rvd25GaWxsZWQ6YSgidGh1bWJzZG93bi1maWxsZWQiLDYwNDM1KSx0aHVtYnN1cEZpbGxlZDphKCJ0aHVtYnN1cC1maWxsZWQiLDYwNDM2KSxjb2ZmZWU6YSgiY29mZmVlIiw2MDQzNyksc25ha2U6YSgic25ha2UiLDYwNDM4KSxnYW1lOmEoImdhbWUiLDYwNDM5KSx2cjphKCJ2ciIsNjA0NDApLGNoaXA6YSgiY2hpcCIsNjA0NDEpLHBpYW5vOmEoInBpYW5vIiw2MDQ0MiksbXVzaWM6YSgibXVzaWMiLDYwNDQzKSxtaWNGaWxsZWQ6YSgibWljLWZpbGxlZCIsNjA0NDQpLHJlcG9GZXRjaDphKCJyZXBvLWZldGNoIiw2MDQ0NSksY29waWxvdDphKCJjb3BpbG90Iiw2MDQ0NiksbGlnaHRidWxiU3BhcmtsZTphKCJsaWdodGJ1bGItc3BhcmtsZSIsNjA0NDcpLHJvYm90OmEoInJvYm90Iiw2MDQ0OCksc3BhcmtsZUZpbGxlZDphKCJzcGFya2xlLWZpbGxlZCIsNjA0NDkpLGRpZmZTaW5nbGU6YSgiZGlmZi1zaW5nbGUiLDYwNDUwKSxkaWZmTXVsdGlwbGU6YSgiZGlmZi1tdWx0aXBsZSIsNjA0NTEpLHN1cnJvdW5kV2l0aDphKCJzdXJyb3VuZC13aXRoIiw2MDQ1Miksc2hhcmU6YSgic2hhcmUiLDYwNDUzKSxnaXRTdGFzaDphKCJnaXQtc3Rhc2giLDYwNDU0KSxnaXRTdGFzaEFwcGx5OmEoImdpdC1zdGFzaC1hcHBseSIsNjA0NTUpLGdpdFN0YXNoUG9wOmEoImdpdC1zdGFzaC1wb3AiLDYwNDU2KSx2c2NvZGU6YSgidnNjb2RlIiw2MDQ1NyksdnNjb2RlSW5zaWRlcnM6YSgidnNjb2RlLWluc2lkZXJzIiw2MDQ1OCksY29kZU9zczphKCJjb2RlLW9zcyIsNjA0NTkpLHJ1bkNvdmVyYWdlOmEoInJ1bi1jb3ZlcmFnZSIsNjA0NjApLHJ1bkFsbENvdmVyYWdlOmEoInJ1bi1hbGwtY292ZXJhZ2UiLDYwNDYxKSxjb3ZlcmFnZTphKCJjb3ZlcmFnZSIsNjA0NjIpLGdpdGh1YlByb2plY3Q6YSgiZ2l0aHViLXByb2plY3QiLDYwNDYzKSxtYXBWZXJ0aWNhbDphKCJtYXAtdmVydGljYWwiLDYwNDY0KSxmb2xkVmVydGljYWw6YSgiZm9sZC12ZXJ0aWNhbCIsNjA0NjQpLG1hcFZlcnRpY2FsRmlsbGVkOmEoIm1hcC12ZXJ0aWNhbC1maWxsZWQiLDYwNDY1KSxmb2xkVmVydGljYWxGaWxsZWQ6YSgiZm9sZC12ZXJ0aWNhbC1maWxsZWQiLDYwNDY1KSxnb1RvU2VhcmNoOmEoImdvLXRvLXNlYXJjaCIsNjA0NjYpLHBlcmNlbnRhZ2U6YSgicGVyY2VudGFnZSIsNjA0NjcpLHNvcnRQZXJjZW50YWdlOmEoInNvcnQtcGVyY2VudGFnZSIsNjA0NjcpLGF0dGFjaDphKCJhdHRhY2giLDYwNDY4KX0sZGE9e2RpYWxvZ0Vycm9yOmEoImRpYWxvZy1lcnJvciIsImVycm9yIiksZGlhbG9nV2FybmluZzphKCJkaWFsb2ctd2FybmluZyIsIndhcm5pbmciKSxkaWFsb2dJbmZvOmEoImRpYWxvZy1pbmZvIiwiaW5mbyIpLGRpYWxvZ0Nsb3NlOmEoImRpYWxvZy1jbG9zZSIsImNsb3NlIiksdHJlZUl0ZW1FeHBhbmRlZDphKCJ0cmVlLWl0ZW0tZXhwYW5kZWQiLCJjaGV2cm9uLWRvd24iKSx0cmVlRmlsdGVyT25UeXBlT246YSgidHJlZS1maWx0ZXItb24tdHlwZS1vbiIsImxpc3QtZmlsdGVyIiksdHJlZUZpbHRlck9uVHlwZU9mZjphKCJ0cmVlLWZpbHRlci1vbi10eXBlLW9mZiIsImxpc3Qtc2VsZWN0aW9uIiksdHJlZUZpbHRlckNsZWFyOmEoInRyZWUtZmlsdGVyLWNsZWFyIiwiY2xvc2UiKSx0cmVlSXRlbUxvYWRpbmc6YSgidHJlZS1pdGVtLWxvYWRpbmciLCJsb2FkaW5nIiksbWVudVNlbGVjdGlvbjphKCJtZW51LXNlbGVjdGlvbiIsImNoZWNrIiksbWVudVN1Ym1lbnU6YSgibWVudS1zdWJtZW51IiwiY2hldnJvbi1yaWdodCIpLG1lbnVCYXJNb3JlOmEoIm1lbnViYXItbW9yZSIsIm1vcmUiKSxzY3JvbGxiYXJCdXR0b25MZWZ0OmEoInNjcm9sbGJhci1idXR0b24tbGVmdCIsInRyaWFuZ2xlLWxlZnQiKSxzY3JvbGxiYXJCdXR0b25SaWdodDphKCJzY3JvbGxiYXItYnV0dG9uLXJpZ2h0IiwidHJpYW5nbGUtcmlnaHQiKSxzY3JvbGxiYXJCdXR0b25VcDphKCJzY3JvbGxiYXItYnV0dG9uLXVwIiwidHJpYW5nbGUtdXAiKSxzY3JvbGxiYXJCdXR0b25Eb3duOmEoInNjcm9sbGJhci1idXR0b24tZG93biIsInRyaWFuZ2xlLWRvd24iKSx0b29sQmFyTW9yZTphKCJ0b29sYmFyLW1vcmUiLCJtb3JlIikscXVpY2tJbnB1dEJhY2s6YSgicXVpY2staW5wdXQtYmFjayIsImFycm93LWxlZnQiKSxkcm9wRG93bkJ1dHRvbjphKCJkcm9wLWRvd24tYnV0dG9uIiw2MDA4NCksc3ltYm9sQ3VzdG9tQ29sb3I6YSgic3ltYm9sLWN1c3RvbWNvbG9yIiw2MDI1MiksZXhwb3J0SWNvbjphKCJleHBvcnQiLDYwMzMyKSx3b3Jrc3BhY2VVbnNwZWNpZmllZDphKCJ3b3Jrc3BhY2UtdW5zcGVjaWZpZWQiLDYwMzU1KSxuZXdMaW5lOmEoIm5ld2xpbmUiLDYwMzk0KSx0aHVtYnNEb3duRmlsbGVkOmEoInRodW1ic2Rvd24tZmlsbGVkIiw2MDQzNSksdGh1bWJzVXBGaWxsZWQ6YSgidGh1bWJzdXAtZmlsbGVkIiw2MDQzNiksZ2l0RmV0Y2g6YSgiZ2l0LWZldGNoIiw2MDQ0NSksbGlnaHRidWxiU3BhcmtsZUF1dG9maXg6YSgibGlnaHRidWxiLXNwYXJrbGUtYXV0b2ZpeCIsNjA0NDcpLGRlYnVnQnJlYWtwb2ludFBlbmRpbmc6YSgiZGVidWctYnJlYWtwb2ludC1wZW5kaW5nIiw2MDM3Nyl9LE09ey4uLmZhLC4uLmRhfTtjbGFzcyBlcntjb25zdHJ1Y3Rvcigpe3RoaXMuX3Rva2VuaXphdGlvblN1cHBvcnRzPW5ldyBNYXAsdGhpcy5fZmFjdG9yaWVzPW5ldyBNYXAsdGhpcy5fb25EaWRDaGFuZ2U9bmV3IG9lLHRoaXMub25EaWRDaGFuZ2U9dGhpcy5fb25EaWRDaGFuZ2UuZXZlbnQsdGhpcy5fY29sb3JNYXA9bnVsbH1oYW5kbGVDaGFuZ2UodCl7dGhpcy5fb25EaWRDaGFuZ2UuZmlyZSh7Y2hhbmdlZExhbmd1YWdlczp0LGNoYW5nZWRDb2xvck1hcDohMX0pfXJlZ2lzdGVyKHQsbil7cmV0dXJuIHRoaXMuX3Rva2VuaXphdGlvblN1cHBvcnRzLnNldCh0LG4pLHRoaXMuaGFuZGxlQ2hhbmdlKFt0XSksZnQoKCk9Pnt0aGlzLl90b2tlbml6YXRpb25TdXBwb3J0cy5nZXQodCk9PT1uJiYodGhpcy5fdG9rZW5pemF0aW9uU3VwcG9ydHMuZGVsZXRlKHQpLHRoaXMuaGFuZGxlQ2hhbmdlKFt0XSkpfSl9Z2V0KHQpe3JldHVybiB0aGlzLl90b2tlbml6YXRpb25TdXBwb3J0cy5nZXQodCl8fG51bGx9cmVnaXN0ZXJGYWN0b3J5KHQsbil7dmFyIHM7KHM9dGhpcy5fZmFjdG9yaWVzLmdldCh0KSk9PW51bGx8fHMuZGlzcG9zZSgpO2NvbnN0IHI9bmV3IG1hKHRoaXMsdCxuKTtyZXR1cm4gdGhpcy5fZmFjdG9yaWVzLnNldCh0LHIpLGZ0KCgpPT57Y29uc3QgaT10aGlzLl9mYWN0b3JpZXMuZ2V0KHQpOyFpfHxpIT09cnx8KHRoaXMuX2ZhY3Rvcmllcy5kZWxldGUodCksaS5kaXNwb3NlKCkpfSl9YXN5bmMgZ2V0T3JDcmVhdGUodCl7Y29uc3Qgbj10aGlzLmdldCh0KTtpZihuKXJldHVybiBuO2NvbnN0IHI9dGhpcy5fZmFjdG9yaWVzLmdldCh0KTtyZXR1cm4hcnx8ci5pc1Jlc29sdmVkP251bGw6KGF3YWl0IHIucmVzb2x2ZSgpLHRoaXMuZ2V0KHQpKX1pc1Jlc29sdmVkKHQpe2lmKHRoaXMuZ2V0KHQpKXJldHVybiEwO2NvbnN0IHI9dGhpcy5fZmFjdG9yaWVzLmdldCh0KTtyZXR1cm4hISghcnx8ci5pc1Jlc29sdmVkKX1zZXRDb2xvck1hcCh0KXt0aGlzLl9jb2xvck1hcD10LHRoaXMuX29uRGlkQ2hhbmdlLmZpcmUoe2NoYW5nZWRMYW5ndWFnZXM6QXJyYXkuZnJvbSh0aGlzLl90b2tlbml6YXRpb25TdXBwb3J0cy5rZXlzKCkpLGNoYW5nZWRDb2xvck1hcDohMH0pfWdldENvbG9yTWFwKCl7cmV0dXJuIHRoaXMuX2NvbG9yTWFwfWdldERlZmF1bHRCYWNrZ3JvdW5kKCl7cmV0dXJuIHRoaXMuX2NvbG9yTWFwJiZ0aGlzLl9jb2xvck1hcC5sZW5ndGg+Mj90aGlzLl9jb2xvck1hcFsyXTpudWxsfX1jbGFzcyBtYSBleHRlbmRzIEZle2dldCBpc1Jlc29sdmVkKCl7cmV0dXJuIHRoaXMuX2lzUmVzb2x2ZWR9Y29uc3RydWN0b3IodCxuLHIpe3N1cGVyKCksdGhpcy5fcmVnaXN0cnk9dCx0aGlzLl9sYW5ndWFnZUlkPW4sdGhpcy5fZmFjdG9yeT1yLHRoaXMuX2lzRGlzcG9zZWQ9ITEsdGhpcy5fcmVzb2x2ZVByb21pc2U9bnVsbCx0aGlzLl9pc1Jlc29sdmVkPSExfWRpc3Bvc2UoKXt0aGlzLl9pc0Rpc3Bvc2VkPSEwLHN1cGVyLmRpc3Bvc2UoKX1hc3luYyByZXNvbHZlKCl7cmV0dXJuIHRoaXMuX3Jlc29sdmVQcm9taXNlfHwodGhpcy5fcmVzb2x2ZVByb21pc2U9dGhpcy5fY3JlYXRlKCkpLHRoaXMuX3Jlc29sdmVQcm9taXNlfWFzeW5jIF9jcmVhdGUoKXtjb25zdCB0PWF3YWl0IHRoaXMuX2ZhY3RvcnkudG9rZW5pemF0aW9uU3VwcG9ydDt0aGlzLl9pc1Jlc29sdmVkPSEwLHQmJiF0aGlzLl9pc0Rpc3Bvc2VkJiZ0aGlzLl9yZWdpc3Rlcih0aGlzLl9yZWdpc3RyeS5yZWdpc3Rlcih0aGlzLl9sYW5ndWFnZUlkLHQpKX19Y2xhc3MgZ2F7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMub2Zmc2V0PXQsdGhpcy50eXBlPW4sdGhpcy5sYW5ndWFnZT1yLHRoaXMuX3Rva2VuQnJhbmQ9dm9pZCAwfXRvU3RyaW5nKCl7cmV0dXJuIigiK3RoaXMub2Zmc2V0KyIsICIrdGhpcy50eXBlKyIpIn19dmFyIHRyOyhmdW5jdGlvbihlKXtlW2UuSW5jcmVhc2U9MF09IkluY3JlYXNlIixlW2UuRGVjcmVhc2U9MV09IkRlY3JlYXNlIn0pKHRyfHwodHI9e30pKTt2YXIgbnI7KGZ1bmN0aW9uKGUpe2NvbnN0IHQ9bmV3IE1hcDt0LnNldCgwLE0uc3ltYm9sTWV0aG9kKSx0LnNldCgxLE0uc3ltYm9sRnVuY3Rpb24pLHQuc2V0KDIsTS5zeW1ib2xDb25zdHJ1Y3RvciksdC5zZXQoMyxNLnN5bWJvbEZpZWxkKSx0LnNldCg0LE0uc3ltYm9sVmFyaWFibGUpLHQuc2V0KDUsTS5zeW1ib2xDbGFzcyksdC5zZXQoNixNLnN5bWJvbFN0cnVjdCksdC5zZXQoNyxNLnN5bWJvbEludGVyZmFjZSksdC5zZXQoOCxNLnN5bWJvbE1vZHVsZSksdC5zZXQoOSxNLnN5bWJvbFByb3BlcnR5KSx0LnNldCgxMCxNLnN5bWJvbEV2ZW50KSx0LnNldCgxMSxNLnN5bWJvbE9wZXJhdG9yKSx0LnNldCgxMixNLnN5bWJvbFVuaXQpLHQuc2V0KDEzLE0uc3ltYm9sVmFsdWUpLHQuc2V0KDE1LE0uc3ltYm9sRW51bSksdC5zZXQoMTQsTS5zeW1ib2xDb25zdGFudCksdC5zZXQoMTUsTS5zeW1ib2xFbnVtKSx0LnNldCgxNixNLnN5bWJvbEVudW1NZW1iZXIpLHQuc2V0KDE3LE0uc3ltYm9sS2V5d29yZCksdC5zZXQoMjcsTS5zeW1ib2xTbmlwcGV0KSx0LnNldCgxOCxNLnN5bWJvbFRleHQpLHQuc2V0KDE5LE0uc3ltYm9sQ29sb3IpLHQuc2V0KDIwLE0uc3ltYm9sRmlsZSksdC5zZXQoMjEsTS5zeW1ib2xSZWZlcmVuY2UpLHQuc2V0KDIyLE0uc3ltYm9sQ3VzdG9tQ29sb3IpLHQuc2V0KDIzLE0uc3ltYm9sRm9sZGVyKSx0LnNldCgyNCxNLnN5bWJvbFR5cGVQYXJhbWV0ZXIpLHQuc2V0KDI1LE0uYWNjb3VudCksdC5zZXQoMjYsTS5pc3N1ZXMpO2Z1bmN0aW9uIG4oaSl7bGV0IG89dC5nZXQoaSk7cmV0dXJuIG98fChjb25zb2xlLmluZm8oIk5vIGNvZGljb24gZm91bmQgZm9yIENvbXBsZXRpb25JdGVtS2luZCAiK2kpLG89TS5zeW1ib2xQcm9wZXJ0eSksb31lLnRvSWNvbj1uO2NvbnN0IHI9bmV3IE1hcDtyLnNldCgibWV0aG9kIiwwKSxyLnNldCgiZnVuY3Rpb24iLDEpLHIuc2V0KCJjb25zdHJ1Y3RvciIsMiksci5zZXQoImZpZWxkIiwzKSxyLnNldCgidmFyaWFibGUiLDQpLHIuc2V0KCJjbGFzcyIsNSksci5zZXQoInN0cnVjdCIsNiksci5zZXQoImludGVyZmFjZSIsNyksci5zZXQoIm1vZHVsZSIsOCksci5zZXQoInByb3BlcnR5Iiw5KSxyLnNldCgiZXZlbnQiLDEwKSxyLnNldCgib3BlcmF0b3IiLDExKSxyLnNldCgidW5pdCIsMTIpLHIuc2V0KCJ2YWx1ZSIsMTMpLHIuc2V0KCJjb25zdGFudCIsMTQpLHIuc2V0KCJlbnVtIiwxNSksci5zZXQoImVudW0tbWVtYmVyIiwxNiksci5zZXQoImVudW1NZW1iZXIiLDE2KSxyLnNldCgia2V5d29yZCIsMTcpLHIuc2V0KCJzbmlwcGV0IiwyNyksci5zZXQoInRleHQiLDE4KSxyLnNldCgiY29sb3IiLDE5KSxyLnNldCgiZmlsZSIsMjApLHIuc2V0KCJyZWZlcmVuY2UiLDIxKSxyLnNldCgiY3VzdG9tY29sb3IiLDIyKSxyLnNldCgiZm9sZGVyIiwyMyksci5zZXQoInR5cGUtcGFyYW1ldGVyIiwyNCksci5zZXQoInR5cGVQYXJhbWV0ZXIiLDI0KSxyLnNldCgiYWNjb3VudCIsMjUpLHIuc2V0KCJpc3N1ZSIsMjYpO2Z1bmN0aW9uIHMoaSxvKXtsZXQgbD1yLmdldChpKTtyZXR1cm4gdHlwZW9mIGw+InUiJiYhbyYmKGw9OSksbH1lLmZyb21TdHJpbmc9c30pKG5yfHwobnI9e30pKTt2YXIgcnI7KGZ1bmN0aW9uKGUpe2VbZS5BdXRvbWF0aWM9MF09IkF1dG9tYXRpYyIsZVtlLkV4cGxpY2l0PTFdPSJFeHBsaWNpdCJ9KShycnx8KHJyPXt9KSk7dmFyIHNyOyhmdW5jdGlvbihlKXtlW2UuQXV0b21hdGljPTBdPSJBdXRvbWF0aWMiLGVbZS5QYXN0ZUFzPTFdPSJQYXN0ZUFzIn0pKHNyfHwoc3I9e30pKTt2YXIgaXI7KGZ1bmN0aW9uKGUpe2VbZS5JbnZva2U9MV09Ikludm9rZSIsZVtlLlRyaWdnZXJDaGFyYWN0ZXI9Ml09IlRyaWdnZXJDaGFyYWN0ZXIiLGVbZS5Db250ZW50Q2hhbmdlPTNdPSJDb250ZW50Q2hhbmdlIn0pKGlyfHwoaXI9e30pKTt2YXIgYXI7KGZ1bmN0aW9uKGUpe2VbZS5UZXh0PTBdPSJUZXh0IixlW2UuUmVhZD0xXT0iUmVhZCIsZVtlLldyaXRlPTJdPSJXcml0ZSJ9KShhcnx8KGFyPXt9KSkseigiQXJyYXkiLCJhcnJheSIpLHooIkJvb2xlYW4iLCJib29sZWFuIikseigiQ2xhc3MiLCJjbGFzcyIpLHooIkNvbnN0YW50IiwiY29uc3RhbnQiKSx6KCJDb25zdHJ1Y3RvciIsImNvbnN0cnVjdG9yIikseigiRW51bSIsImVudW1lcmF0aW9uIikseigiRW51bU1lbWJlciIsImVudW1lcmF0aW9uIG1lbWJlciIpLHooIkV2ZW50IiwiZXZlbnQiKSx6KCJGaWVsZCIsImZpZWxkIikseigiRmlsZSIsImZpbGUiKSx6KCJGdW5jdGlvbiIsImZ1bmN0aW9uIikseigiSW50ZXJmYWNlIiwiaW50ZXJmYWNlIikseigiS2V5Iiwia2V5IikseigiTWV0aG9kIiwibWV0aG9kIikseigiTW9kdWxlIiwibW9kdWxlIikseigiTmFtZXNwYWNlIiwibmFtZXNwYWNlIikseigiTnVsbCIsIm51bGwiKSx6KCJOdW1iZXIiLCJudW1iZXIiKSx6KCJPYmplY3QiLCJvYmplY3QiKSx6KCJPcGVyYXRvciIsIm9wZXJhdG9yIikseigiUGFja2FnZSIsInBhY2thZ2UiKSx6KCJQcm9wZXJ0eSIsInByb3BlcnR5IikseigiU3RyaW5nIiwic3RyaW5nIikseigiU3RydWN0Iiwic3RydWN0IikseigiVHlwZVBhcmFtZXRlciIsInR5cGUgcGFyYW1ldGVyIikseigiVmFyaWFibGUiLCJ2YXJpYWJsZSIpO3ZhciBvcjsoZnVuY3Rpb24oZSl7Y29uc3QgdD1uZXcgTWFwO3Quc2V0KDAsTS5zeW1ib2xGaWxlKSx0LnNldCgxLE0uc3ltYm9sTW9kdWxlKSx0LnNldCgyLE0uc3ltYm9sTmFtZXNwYWNlKSx0LnNldCgzLE0uc3ltYm9sUGFja2FnZSksdC5zZXQoNCxNLnN5bWJvbENsYXNzKSx0LnNldCg1LE0uc3ltYm9sTWV0aG9kKSx0LnNldCg2LE0uc3ltYm9sUHJvcGVydHkpLHQuc2V0KDcsTS5zeW1ib2xGaWVsZCksdC5zZXQoOCxNLnN5bWJvbENvbnN0cnVjdG9yKSx0LnNldCg5LE0uc3ltYm9sRW51bSksdC5zZXQoMTAsTS5zeW1ib2xJbnRlcmZhY2UpLHQuc2V0KDExLE0uc3ltYm9sRnVuY3Rpb24pLHQuc2V0KDEyLE0uc3ltYm9sVmFyaWFibGUpLHQuc2V0KDEzLE0uc3ltYm9sQ29uc3RhbnQpLHQuc2V0KDE0LE0uc3ltYm9sU3RyaW5nKSx0LnNldCgxNSxNLnN5bWJvbE51bWJlciksdC5zZXQoMTYsTS5zeW1ib2xCb29sZWFuKSx0LnNldCgxNyxNLnN5bWJvbEFycmF5KSx0LnNldCgxOCxNLnN5bWJvbE9iamVjdCksdC5zZXQoMTksTS5zeW1ib2xLZXkpLHQuc2V0KDIwLE0uc3ltYm9sTnVsbCksdC5zZXQoMjEsTS5zeW1ib2xFbnVtTWVtYmVyKSx0LnNldCgyMixNLnN5bWJvbFN0cnVjdCksdC5zZXQoMjMsTS5zeW1ib2xFdmVudCksdC5zZXQoMjQsTS5zeW1ib2xPcGVyYXRvciksdC5zZXQoMjUsTS5zeW1ib2xUeXBlUGFyYW1ldGVyKTtmdW5jdGlvbiBuKHIpe2xldCBzPXQuZ2V0KHIpO3JldHVybiBzfHwoY29uc29sZS5pbmZvKCJObyBjb2RpY29uIGZvdW5kIGZvciBTeW1ib2xLaW5kICIrcikscz1NLnN5bWJvbFByb3BlcnR5KSxzfWUudG9JY29uPW59KShvcnx8KG9yPXt9KSk7Y29uc3QgY2U9Y2xhc3MgY2V7c3RhdGljIGZyb21WYWx1ZSh0KXtzd2l0Y2godCl7Y2FzZSJjb21tZW50IjpyZXR1cm4gY2UuQ29tbWVudDtjYXNlImltcG9ydHMiOnJldHVybiBjZS5JbXBvcnRzO2Nhc2UicmVnaW9uIjpyZXR1cm4gY2UuUmVnaW9ufXJldHVybiBuZXcgY2UodCl9Y29uc3RydWN0b3IodCl7dGhpcy52YWx1ZT10fX07Y2UuQ29tbWVudD1uZXcgY2UoImNvbW1lbnQiKSxjZS5JbXBvcnRzPW5ldyBjZSgiaW1wb3J0cyIpLGNlLlJlZ2lvbj1uZXcgY2UoInJlZ2lvbiIpO2xldCBscj1jZTt2YXIgdXI7KGZ1bmN0aW9uKGUpe2VbZS5BSUdlbmVyYXRlZD0xXT0iQUlHZW5lcmF0ZWQifSkodXJ8fCh1cj17fSkpO3ZhciBjcjsoZnVuY3Rpb24oZSl7ZVtlLkludm9rZT0wXT0iSW52b2tlIixlW2UuQXV0b21hdGljPTFdPSJBdXRvbWF0aWMifSkoY3J8fChjcj17fSkpO3ZhciBocjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtyZXR1cm4hbnx8dHlwZW9mIG4hPSJvYmplY3QiPyExOnR5cGVvZiBuLmlkPT0ic3RyaW5nIiYmdHlwZW9mIG4udGl0bGU9PSJzdHJpbmcifWUuaXM9dH0pKGhyfHwoaHI9e30pKTt2YXIgZnI7KGZ1bmN0aW9uKGUpe2VbZS5UeXBlPTFdPSJUeXBlIixlW2UuUGFyYW1ldGVyPTJdPSJQYXJhbWV0ZXIifSkoZnJ8fChmcj17fSkpLG5ldyBlcixuZXcgZXI7dmFyIGRyOyhmdW5jdGlvbihlKXtlW2UuSW52b2tlPTBdPSJJbnZva2UiLGVbZS5BdXRvbWF0aWM9MV09IkF1dG9tYXRpYyJ9KShkcnx8KGRyPXt9KSk7dmFyIG1yOyhmdW5jdGlvbihlKXtlW2UuVW5rbm93bj0wXT0iVW5rbm93biIsZVtlLkRpc2FibGVkPTFdPSJEaXNhYmxlZCIsZVtlLkVuYWJsZWQ9Ml09IkVuYWJsZWQifSkobXJ8fChtcj17fSkpO3ZhciBncjsoZnVuY3Rpb24oZSl7ZVtlLkludm9rZT0xXT0iSW52b2tlIixlW2UuQXV0bz0yXT0iQXV0byJ9KShncnx8KGdyPXt9KSk7dmFyIGJyOyhmdW5jdGlvbihlKXtlW2UuTm9uZT0wXT0iTm9uZSIsZVtlLktlZXBXaGl0ZXNwYWNlPTFdPSJLZWVwV2hpdGVzcGFjZSIsZVtlLkluc2VydEFzU25pcHBldD00XT0iSW5zZXJ0QXNTbmlwcGV0In0pKGJyfHwoYnI9e30pKTt2YXIgeHI7KGZ1bmN0aW9uKGUpe2VbZS5NZXRob2Q9MF09Ik1ldGhvZCIsZVtlLkZ1bmN0aW9uPTFdPSJGdW5jdGlvbiIsZVtlLkNvbnN0cnVjdG9yPTJdPSJDb25zdHJ1Y3RvciIsZVtlLkZpZWxkPTNdPSJGaWVsZCIsZVtlLlZhcmlhYmxlPTRdPSJWYXJpYWJsZSIsZVtlLkNsYXNzPTVdPSJDbGFzcyIsZVtlLlN0cnVjdD02XT0iU3RydWN0IixlW2UuSW50ZXJmYWNlPTddPSJJbnRlcmZhY2UiLGVbZS5Nb2R1bGU9OF09Ik1vZHVsZSIsZVtlLlByb3BlcnR5PTldPSJQcm9wZXJ0eSIsZVtlLkV2ZW50PTEwXT0iRXZlbnQiLGVbZS5PcGVyYXRvcj0xMV09Ik9wZXJhdG9yIixlW2UuVW5pdD0xMl09IlVuaXQiLGVbZS5WYWx1ZT0xM109IlZhbHVlIixlW2UuQ29uc3RhbnQ9MTRdPSJDb25zdGFudCIsZVtlLkVudW09MTVdPSJFbnVtIixlW2UuRW51bU1lbWJlcj0xNl09IkVudW1NZW1iZXIiLGVbZS5LZXl3b3JkPTE3XT0iS2V5d29yZCIsZVtlLlRleHQ9MThdPSJUZXh0IixlW2UuQ29sb3I9MTldPSJDb2xvciIsZVtlLkZpbGU9MjBdPSJGaWxlIixlW2UuUmVmZXJlbmNlPTIxXT0iUmVmZXJlbmNlIixlW2UuQ3VzdG9tY29sb3I9MjJdPSJDdXN0b21jb2xvciIsZVtlLkZvbGRlcj0yM109IkZvbGRlciIsZVtlLlR5cGVQYXJhbWV0ZXI9MjRdPSJUeXBlUGFyYW1ldGVyIixlW2UuVXNlcj0yNV09IlVzZXIiLGVbZS5Jc3N1ZT0yNl09Iklzc3VlIixlW2UuU25pcHBldD0yN109IlNuaXBwZXQifSkoeHJ8fCh4cj17fSkpO3ZhciBwcjsoZnVuY3Rpb24oZSl7ZVtlLkRlcHJlY2F0ZWQ9MV09IkRlcHJlY2F0ZWQifSkocHJ8fChwcj17fSkpO3ZhciBfcjsoZnVuY3Rpb24oZSl7ZVtlLkludm9rZT0wXT0iSW52b2tlIixlW2UuVHJpZ2dlckNoYXJhY3Rlcj0xXT0iVHJpZ2dlckNoYXJhY3RlciIsZVtlLlRyaWdnZXJGb3JJbmNvbXBsZXRlQ29tcGxldGlvbnM9Ml09IlRyaWdnZXJGb3JJbmNvbXBsZXRlQ29tcGxldGlvbnMifSkoX3J8fChfcj17fSkpO3ZhciB3cjsoZnVuY3Rpb24oZSl7ZVtlLkVYQUNUPTBdPSJFWEFDVCIsZVtlLkFCT1ZFPTFdPSJBQk9WRSIsZVtlLkJFTE9XPTJdPSJCRUxPVyJ9KSh3cnx8KHdyPXt9KSk7dmFyIExyOyhmdW5jdGlvbihlKXtlW2UuTm90U2V0PTBdPSJOb3RTZXQiLGVbZS5Db250ZW50Rmx1c2g9MV09IkNvbnRlbnRGbHVzaCIsZVtlLlJlY292ZXJGcm9tTWFya2Vycz0yXT0iUmVjb3ZlckZyb21NYXJrZXJzIixlW2UuRXhwbGljaXQ9M109IkV4cGxpY2l0IixlW2UuUGFzdGU9NF09IlBhc3RlIixlW2UuVW5kbz01XT0iVW5kbyIsZVtlLlJlZG89Nl09IlJlZG8ifSkoTHJ8fChMcj17fSkpO3ZhciB2cjsoZnVuY3Rpb24oZSl7ZVtlLkxGPTFdPSJMRiIsZVtlLkNSTEY9Ml09IkNSTEYifSkodnJ8fCh2cj17fSkpO3ZhciBOcjsoZnVuY3Rpb24oZSl7ZVtlLlRleHQ9MF09IlRleHQiLGVbZS5SZWFkPTFdPSJSZWFkIixlW2UuV3JpdGU9Ml09IldyaXRlIn0pKE5yfHwoTnI9e30pKTt2YXIgU3I7KGZ1bmN0aW9uKGUpe2VbZS5Ob25lPTBdPSJOb25lIixlW2UuS2VlcD0xXT0iS2VlcCIsZVtlLkJyYWNrZXRzPTJdPSJCcmFja2V0cyIsZVtlLkFkdmFuY2VkPTNdPSJBZHZhbmNlZCIsZVtlLkZ1bGw9NF09IkZ1bGwifSkoU3J8fChTcj17fSkpO3ZhciBDcjsoZnVuY3Rpb24oZSl7ZVtlLmFjY2VwdFN1Z2dlc3Rpb25PbkNvbW1pdENoYXJhY3Rlcj0wXT0iYWNjZXB0U3VnZ2VzdGlvbk9uQ29tbWl0Q2hhcmFjdGVyIixlW2UuYWNjZXB0U3VnZ2VzdGlvbk9uRW50ZXI9MV09ImFjY2VwdFN1Z2dlc3Rpb25PbkVudGVyIixlW2UuYWNjZXNzaWJpbGl0eVN1cHBvcnQ9Ml09ImFjY2Vzc2liaWxpdHlTdXBwb3J0IixlW2UuYWNjZXNzaWJpbGl0eVBhZ2VTaXplPTNdPSJhY2Nlc3NpYmlsaXR5UGFnZVNpemUiLGVbZS5hcmlhTGFiZWw9NF09ImFyaWFMYWJlbCIsZVtlLmFyaWFSZXF1aXJlZD01XT0iYXJpYVJlcXVpcmVkIixlW2UuYXV0b0Nsb3NpbmdCcmFja2V0cz02XT0iYXV0b0Nsb3NpbmdCcmFja2V0cyIsZVtlLmF1dG9DbG9zaW5nQ29tbWVudHM9N109ImF1dG9DbG9zaW5nQ29tbWVudHMiLGVbZS5zY3JlZW5SZWFkZXJBbm5vdW5jZUlubGluZVN1Z2dlc3Rpb249OF09InNjcmVlblJlYWRlckFubm91bmNlSW5saW5lU3VnZ2VzdGlvbiIsZVtlLmF1dG9DbG9zaW5nRGVsZXRlPTldPSJhdXRvQ2xvc2luZ0RlbGV0ZSIsZVtlLmF1dG9DbG9zaW5nT3ZlcnR5cGU9MTBdPSJhdXRvQ2xvc2luZ092ZXJ0eXBlIixlW2UuYXV0b0Nsb3NpbmdRdW90ZXM9MTFdPSJhdXRvQ2xvc2luZ1F1b3RlcyIsZVtlLmF1dG9JbmRlbnQ9MTJdPSJhdXRvSW5kZW50IixlW2UuYXV0b21hdGljTGF5b3V0PTEzXT0iYXV0b21hdGljTGF5b3V0IixlW2UuYXV0b1N1cnJvdW5kPTE0XT0iYXV0b1N1cnJvdW5kIixlW2UuYnJhY2tldFBhaXJDb2xvcml6YXRpb249MTVdPSJicmFja2V0UGFpckNvbG9yaXphdGlvbiIsZVtlLmd1aWRlcz0xNl09Imd1aWRlcyIsZVtlLmNvZGVMZW5zPTE3XT0iY29kZUxlbnMiLGVbZS5jb2RlTGVuc0ZvbnRGYW1pbHk9MThdPSJjb2RlTGVuc0ZvbnRGYW1pbHkiLGVbZS5jb2RlTGVuc0ZvbnRTaXplPTE5XT0iY29kZUxlbnNGb250U2l6ZSIsZVtlLmNvbG9yRGVjb3JhdG9ycz0yMF09ImNvbG9yRGVjb3JhdG9ycyIsZVtlLmNvbG9yRGVjb3JhdG9yc0xpbWl0PTIxXT0iY29sb3JEZWNvcmF0b3JzTGltaXQiLGVbZS5jb2x1bW5TZWxlY3Rpb249MjJdPSJjb2x1bW5TZWxlY3Rpb24iLGVbZS5jb21tZW50cz0yM109ImNvbW1lbnRzIixlW2UuY29udGV4dG1lbnU9MjRdPSJjb250ZXh0bWVudSIsZVtlLmNvcHlXaXRoU3ludGF4SGlnaGxpZ2h0aW5nPTI1XT0iY29weVdpdGhTeW50YXhIaWdobGlnaHRpbmciLGVbZS5jdXJzb3JCbGlua2luZz0yNl09ImN1cnNvckJsaW5raW5nIixlW2UuY3Vyc29yU21vb3RoQ2FyZXRBbmltYXRpb249MjddPSJjdXJzb3JTbW9vdGhDYXJldEFuaW1hdGlvbiIsZVtlLmN1cnNvclN0eWxlPTI4XT0iY3Vyc29yU3R5bGUiLGVbZS5jdXJzb3JTdXJyb3VuZGluZ0xpbmVzPTI5XT0iY3Vyc29yU3Vycm91bmRpbmdMaW5lcyIsZVtlLmN1cnNvclN1cnJvdW5kaW5nTGluZXNTdHlsZT0zMF09ImN1cnNvclN1cnJvdW5kaW5nTGluZXNTdHlsZSIsZVtlLmN1cnNvcldpZHRoPTMxXT0iY3Vyc29yV2lkdGgiLGVbZS5kaXNhYmxlTGF5ZXJIaW50aW5nPTMyXT0iZGlzYWJsZUxheWVySGludGluZyIsZVtlLmRpc2FibGVNb25vc3BhY2VPcHRpbWl6YXRpb25zPTMzXT0iZGlzYWJsZU1vbm9zcGFjZU9wdGltaXphdGlvbnMiLGVbZS5kb21SZWFkT25seT0zNF09ImRvbVJlYWRPbmx5IixlW2UuZHJhZ0FuZERyb3A9MzVdPSJkcmFnQW5kRHJvcCIsZVtlLmRyb3BJbnRvRWRpdG9yPTM2XT0iZHJvcEludG9FZGl0b3IiLGVbZS5lbXB0eVNlbGVjdGlvbkNsaXBib2FyZD0zN109ImVtcHR5U2VsZWN0aW9uQ2xpcGJvYXJkIixlW2UuZXhwZXJpbWVudGFsV2hpdGVzcGFjZVJlbmRlcmluZz0zOF09ImV4cGVyaW1lbnRhbFdoaXRlc3BhY2VSZW5kZXJpbmciLGVbZS5leHRyYUVkaXRvckNsYXNzTmFtZT0zOV09ImV4dHJhRWRpdG9yQ2xhc3NOYW1lIixlW2UuZmFzdFNjcm9sbFNlbnNpdGl2aXR5PTQwXT0iZmFzdFNjcm9sbFNlbnNpdGl2aXR5IixlW2UuZmluZD00MV09ImZpbmQiLGVbZS5maXhlZE92ZXJmbG93V2lkZ2V0cz00Ml09ImZpeGVkT3ZlcmZsb3dXaWRnZXRzIixlW2UuZm9sZGluZz00M109ImZvbGRpbmciLGVbZS5mb2xkaW5nU3RyYXRlZ3k9NDRdPSJmb2xkaW5nU3RyYXRlZ3kiLGVbZS5mb2xkaW5nSGlnaGxpZ2h0PTQ1XT0iZm9sZGluZ0hpZ2hsaWdodCIsZVtlLmZvbGRpbmdJbXBvcnRzQnlEZWZhdWx0PTQ2XT0iZm9sZGluZ0ltcG9ydHNCeURlZmF1bHQiLGVbZS5mb2xkaW5nTWF4aW11bVJlZ2lvbnM9NDddPSJmb2xkaW5nTWF4aW11bVJlZ2lvbnMiLGVbZS51bmZvbGRPbkNsaWNrQWZ0ZXJFbmRPZkxpbmU9NDhdPSJ1bmZvbGRPbkNsaWNrQWZ0ZXJFbmRPZkxpbmUiLGVbZS5mb250RmFtaWx5PTQ5XT0iZm9udEZhbWlseSIsZVtlLmZvbnRJbmZvPTUwXT0iZm9udEluZm8iLGVbZS5mb250TGlnYXR1cmVzPTUxXT0iZm9udExpZ2F0dXJlcyIsZVtlLmZvbnRTaXplPTUyXT0iZm9udFNpemUiLGVbZS5mb250V2VpZ2h0PTUzXT0iZm9udFdlaWdodCIsZVtlLmZvbnRWYXJpYXRpb25zPTU0XT0iZm9udFZhcmlhdGlvbnMiLGVbZS5mb3JtYXRPblBhc3RlPTU1XT0iZm9ybWF0T25QYXN0ZSIsZVtlLmZvcm1hdE9uVHlwZT01Nl09ImZvcm1hdE9uVHlwZSIsZVtlLmdseXBoTWFyZ2luPTU3XT0iZ2x5cGhNYXJnaW4iLGVbZS5nb3RvTG9jYXRpb249NThdPSJnb3RvTG9jYXRpb24iLGVbZS5oaWRlQ3Vyc29ySW5PdmVydmlld1J1bGVyPTU5XT0iaGlkZUN1cnNvckluT3ZlcnZpZXdSdWxlciIsZVtlLmhvdmVyPTYwXT0iaG92ZXIiLGVbZS5pbkRpZmZFZGl0b3I9NjFdPSJpbkRpZmZFZGl0b3IiLGVbZS5pbmxpbmVTdWdnZXN0PTYyXT0iaW5saW5lU3VnZ2VzdCIsZVtlLmlubGluZUVkaXQ9NjNdPSJpbmxpbmVFZGl0IixlW2UubGV0dGVyU3BhY2luZz02NF09ImxldHRlclNwYWNpbmciLGVbZS5saWdodGJ1bGI9NjVdPSJsaWdodGJ1bGIiLGVbZS5saW5lRGVjb3JhdGlvbnNXaWR0aD02Nl09ImxpbmVEZWNvcmF0aW9uc1dpZHRoIixlW2UubGluZUhlaWdodD02N109ImxpbmVIZWlnaHQiLGVbZS5saW5lTnVtYmVycz02OF09ImxpbmVOdW1iZXJzIixlW2UubGluZU51bWJlcnNNaW5DaGFycz02OV09ImxpbmVOdW1iZXJzTWluQ2hhcnMiLGVbZS5saW5rZWRFZGl0aW5nPTcwXT0ibGlua2VkRWRpdGluZyIsZVtlLmxpbmtzPTcxXT0ibGlua3MiLGVbZS5tYXRjaEJyYWNrZXRzPTcyXT0ibWF0Y2hCcmFja2V0cyIsZVtlLm1pbmltYXA9NzNdPSJtaW5pbWFwIixlW2UubW91c2VTdHlsZT03NF09Im1vdXNlU3R5bGUiLGVbZS5tb3VzZVdoZWVsU2Nyb2xsU2Vuc2l0aXZpdHk9NzVdPSJtb3VzZVdoZWVsU2Nyb2xsU2Vuc2l0aXZpdHkiLGVbZS5tb3VzZVdoZWVsWm9vbT03Nl09Im1vdXNlV2hlZWxab29tIixlW2UubXVsdGlDdXJzb3JNZXJnZU92ZXJsYXBwaW5nPTc3XT0ibXVsdGlDdXJzb3JNZXJnZU92ZXJsYXBwaW5nIixlW2UubXVsdGlDdXJzb3JNb2RpZmllcj03OF09Im11bHRpQ3Vyc29yTW9kaWZpZXIiLGVbZS5tdWx0aUN1cnNvclBhc3RlPTc5XT0ibXVsdGlDdXJzb3JQYXN0ZSIsZVtlLm11bHRpQ3Vyc29yTGltaXQ9ODBdPSJtdWx0aUN1cnNvckxpbWl0IixlW2Uub2NjdXJyZW5jZXNIaWdobGlnaHQ9ODFdPSJvY2N1cnJlbmNlc0hpZ2hsaWdodCIsZVtlLm92ZXJ2aWV3UnVsZXJCb3JkZXI9ODJdPSJvdmVydmlld1J1bGVyQm9yZGVyIixlW2Uub3ZlcnZpZXdSdWxlckxhbmVzPTgzXT0ib3ZlcnZpZXdSdWxlckxhbmVzIixlW2UucGFkZGluZz04NF09InBhZGRpbmciLGVbZS5wYXN0ZUFzPTg1XT0icGFzdGVBcyIsZVtlLnBhcmFtZXRlckhpbnRzPTg2XT0icGFyYW1ldGVySGludHMiLGVbZS5wZWVrV2lkZ2V0RGVmYXVsdEZvY3VzPTg3XT0icGVla1dpZGdldERlZmF1bHRGb2N1cyIsZVtlLnBsYWNlaG9sZGVyPTg4XT0icGxhY2Vob2xkZXIiLGVbZS5kZWZpbml0aW9uTGlua09wZW5zSW5QZWVrPTg5XT0iZGVmaW5pdGlvbkxpbmtPcGVuc0luUGVlayIsZVtlLnF1aWNrU3VnZ2VzdGlvbnM9OTBdPSJxdWlja1N1Z2dlc3Rpb25zIixlW2UucXVpY2tTdWdnZXN0aW9uc0RlbGF5PTkxXT0icXVpY2tTdWdnZXN0aW9uc0RlbGF5IixlW2UucmVhZE9ubHk9OTJdPSJyZWFkT25seSIsZVtlLnJlYWRPbmx5TWVzc2FnZT05M109InJlYWRPbmx5TWVzc2FnZSIsZVtlLnJlbmFtZU9uVHlwZT05NF09InJlbmFtZU9uVHlwZSIsZVtlLnJlbmRlckNvbnRyb2xDaGFyYWN0ZXJzPTk1XT0icmVuZGVyQ29udHJvbENoYXJhY3RlcnMiLGVbZS5yZW5kZXJGaW5hbE5ld2xpbmU9OTZdPSJyZW5kZXJGaW5hbE5ld2xpbmUiLGVbZS5yZW5kZXJMaW5lSGlnaGxpZ2h0PTk3XT0icmVuZGVyTGluZUhpZ2hsaWdodCIsZVtlLnJlbmRlckxpbmVIaWdobGlnaHRPbmx5V2hlbkZvY3VzPTk4XT0icmVuZGVyTGluZUhpZ2hsaWdodE9ubHlXaGVuRm9jdXMiLGVbZS5yZW5kZXJWYWxpZGF0aW9uRGVjb3JhdGlvbnM9OTldPSJyZW5kZXJWYWxpZGF0aW9uRGVjb3JhdGlvbnMiLGVbZS5yZW5kZXJXaGl0ZXNwYWNlPTEwMF09InJlbmRlcldoaXRlc3BhY2UiLGVbZS5yZXZlYWxIb3Jpem9udGFsUmlnaHRQYWRkaW5nPTEwMV09InJldmVhbEhvcml6b250YWxSaWdodFBhZGRpbmciLGVbZS5yb3VuZGVkU2VsZWN0aW9uPTEwMl09InJvdW5kZWRTZWxlY3Rpb24iLGVbZS5ydWxlcnM9MTAzXT0icnVsZXJzIixlW2Uuc2Nyb2xsYmFyPTEwNF09InNjcm9sbGJhciIsZVtlLnNjcm9sbEJleW9uZExhc3RDb2x1bW49MTA1XT0ic2Nyb2xsQmV5b25kTGFzdENvbHVtbiIsZVtlLnNjcm9sbEJleW9uZExhc3RMaW5lPTEwNl09InNjcm9sbEJleW9uZExhc3RMaW5lIixlW2Uuc2Nyb2xsUHJlZG9taW5hbnRBeGlzPTEwN109InNjcm9sbFByZWRvbWluYW50QXhpcyIsZVtlLnNlbGVjdGlvbkNsaXBib2FyZD0xMDhdPSJzZWxlY3Rpb25DbGlwYm9hcmQiLGVbZS5zZWxlY3Rpb25IaWdobGlnaHQ9MTA5XT0ic2VsZWN0aW9uSGlnaGxpZ2h0IixlW2Uuc2VsZWN0T25MaW5lTnVtYmVycz0xMTBdPSJzZWxlY3RPbkxpbmVOdW1iZXJzIixlW2Uuc2hvd0ZvbGRpbmdDb250cm9scz0xMTFdPSJzaG93Rm9sZGluZ0NvbnRyb2xzIixlW2Uuc2hvd1VudXNlZD0xMTJdPSJzaG93VW51c2VkIixlW2Uuc25pcHBldFN1Z2dlc3Rpb25zPTExM109InNuaXBwZXRTdWdnZXN0aW9ucyIsZVtlLnNtYXJ0U2VsZWN0PTExNF09InNtYXJ0U2VsZWN0IixlW2Uuc21vb3RoU2Nyb2xsaW5nPTExNV09InNtb290aFNjcm9sbGluZyIsZVtlLnN0aWNreVNjcm9sbD0xMTZdPSJzdGlja3lTY3JvbGwiLGVbZS5zdGlja3lUYWJTdG9wcz0xMTddPSJzdGlja3lUYWJTdG9wcyIsZVtlLnN0b3BSZW5kZXJpbmdMaW5lQWZ0ZXI9MTE4XT0ic3RvcFJlbmRlcmluZ0xpbmVBZnRlciIsZVtlLnN1Z2dlc3Q9MTE5XT0ic3VnZ2VzdCIsZVtlLnN1Z2dlc3RGb250U2l6ZT0xMjBdPSJzdWdnZXN0Rm9udFNpemUiLGVbZS5zdWdnZXN0TGluZUhlaWdodD0xMjFdPSJzdWdnZXN0TGluZUhlaWdodCIsZVtlLnN1Z2dlc3RPblRyaWdnZXJDaGFyYWN0ZXJzPTEyMl09InN1Z2dlc3RPblRyaWdnZXJDaGFyYWN0ZXJzIixlW2Uuc3VnZ2VzdFNlbGVjdGlvbj0xMjNdPSJzdWdnZXN0U2VsZWN0aW9uIixlW2UudGFiQ29tcGxldGlvbj0xMjRdPSJ0YWJDb21wbGV0aW9uIixlW2UudGFiSW5kZXg9MTI1XT0idGFiSW5kZXgiLGVbZS51bmljb2RlSGlnaGxpZ2h0aW5nPTEyNl09InVuaWNvZGVIaWdobGlnaHRpbmciLGVbZS51bnVzdWFsTGluZVRlcm1pbmF0b3JzPTEyN109InVudXN1YWxMaW5lVGVybWluYXRvcnMiLGVbZS51c2VTaGFkb3dET009MTI4XT0idXNlU2hhZG93RE9NIixlW2UudXNlVGFiU3RvcHM9MTI5XT0idXNlVGFiU3RvcHMiLGVbZS53b3JkQnJlYWs9MTMwXT0id29yZEJyZWFrIixlW2Uud29yZFNlZ21lbnRlckxvY2FsZXM9MTMxXT0id29yZFNlZ21lbnRlckxvY2FsZXMiLGVbZS53b3JkU2VwYXJhdG9ycz0xMzJdPSJ3b3JkU2VwYXJhdG9ycyIsZVtlLndvcmRXcmFwPTEzM109IndvcmRXcmFwIixlW2Uud29yZFdyYXBCcmVha0FmdGVyQ2hhcmFjdGVycz0xMzRdPSJ3b3JkV3JhcEJyZWFrQWZ0ZXJDaGFyYWN0ZXJzIixlW2Uud29yZFdyYXBCcmVha0JlZm9yZUNoYXJhY3RlcnM9MTM1XT0id29yZFdyYXBCcmVha0JlZm9yZUNoYXJhY3RlcnMiLGVbZS53b3JkV3JhcENvbHVtbj0xMzZdPSJ3b3JkV3JhcENvbHVtbiIsZVtlLndvcmRXcmFwT3ZlcnJpZGUxPTEzN109IndvcmRXcmFwT3ZlcnJpZGUxIixlW2Uud29yZFdyYXBPdmVycmlkZTI9MTM4XT0id29yZFdyYXBPdmVycmlkZTIiLGVbZS53cmFwcGluZ0luZGVudD0xMzldPSJ3cmFwcGluZ0luZGVudCIsZVtlLndyYXBwaW5nU3RyYXRlZ3k9MTQwXT0id3JhcHBpbmdTdHJhdGVneSIsZVtlLnNob3dEZXByZWNhdGVkPTE0MV09InNob3dEZXByZWNhdGVkIixlW2UuaW5sYXlIaW50cz0xNDJdPSJpbmxheUhpbnRzIixlW2UuZWRpdG9yQ2xhc3NOYW1lPTE0M109ImVkaXRvckNsYXNzTmFtZSIsZVtlLnBpeGVsUmF0aW89MTQ0XT0icGl4ZWxSYXRpbyIsZVtlLnRhYkZvY3VzTW9kZT0xNDVdPSJ0YWJGb2N1c01vZGUiLGVbZS5sYXlvdXRJbmZvPTE0Nl09ImxheW91dEluZm8iLGVbZS53cmFwcGluZ0luZm89MTQ3XT0id3JhcHBpbmdJbmZvIixlW2UuZGVmYXVsdENvbG9yRGVjb3JhdG9ycz0xNDhdPSJkZWZhdWx0Q29sb3JEZWNvcmF0b3JzIixlW2UuY29sb3JEZWNvcmF0b3JzQWN0aXZhdGVkT249MTQ5XT0iY29sb3JEZWNvcmF0b3JzQWN0aXZhdGVkT24iLGVbZS5pbmxpbmVDb21wbGV0aW9uc0FjY2Vzc2liaWxpdHlWZXJib3NlPTE1MF09ImlubGluZUNvbXBsZXRpb25zQWNjZXNzaWJpbGl0eVZlcmJvc2UifSkoQ3J8fChDcj17fSkpO3ZhciBBcjsoZnVuY3Rpb24oZSl7ZVtlLlRleHREZWZpbmVkPTBdPSJUZXh0RGVmaW5lZCIsZVtlLkxGPTFdPSJMRiIsZVtlLkNSTEY9Ml09IkNSTEYifSkoQXJ8fChBcj17fSkpO3ZhciBScjsoZnVuY3Rpb24oZSl7ZVtlLkxGPTBdPSJMRiIsZVtlLkNSTEY9MV09IkNSTEYifSkoUnJ8fChScj17fSkpO3ZhciB5cjsoZnVuY3Rpb24oZSl7ZVtlLkxlZnQ9MV09IkxlZnQiLGVbZS5DZW50ZXI9Ml09IkNlbnRlciIsZVtlLlJpZ2h0PTNdPSJSaWdodCJ9KSh5cnx8KHlyPXt9KSk7dmFyIEVyOyhmdW5jdGlvbihlKXtlW2UuSW5jcmVhc2U9MF09IkluY3JlYXNlIixlW2UuRGVjcmVhc2U9MV09IkRlY3JlYXNlIn0pKEVyfHwoRXI9e30pKTt2YXIgTXI7KGZ1bmN0aW9uKGUpe2VbZS5Ob25lPTBdPSJOb25lIixlW2UuSW5kZW50PTFdPSJJbmRlbnQiLGVbZS5JbmRlbnRPdXRkZW50PTJdPSJJbmRlbnRPdXRkZW50IixlW2UuT3V0ZGVudD0zXT0iT3V0ZGVudCJ9KShNcnx8KE1yPXt9KSk7dmFyIGtyOyhmdW5jdGlvbihlKXtlW2UuQm90aD0wXT0iQm90aCIsZVtlLlJpZ2h0PTFdPSJSaWdodCIsZVtlLkxlZnQ9Ml09IkxlZnQiLGVbZS5Ob25lPTNdPSJOb25lIn0pKGtyfHwoa3I9e30pKTt2YXIgUHI7KGZ1bmN0aW9uKGUpe2VbZS5UeXBlPTFdPSJUeXBlIixlW2UuUGFyYW1ldGVyPTJdPSJQYXJhbWV0ZXIifSkoUHJ8fChQcj17fSkpO3ZhciBGcjsoZnVuY3Rpb24oZSl7ZVtlLkF1dG9tYXRpYz0wXT0iQXV0b21hdGljIixlW2UuRXhwbGljaXQ9MV09IkV4cGxpY2l0In0pKEZyfHwoRnI9e30pKTt2YXIgRHI7KGZ1bmN0aW9uKGUpe2VbZS5JbnZva2U9MF09Ikludm9rZSIsZVtlLkF1dG9tYXRpYz0xXT0iQXV0b21hdGljIn0pKERyfHwoRHI9e30pKTt2YXIgdW47KGZ1bmN0aW9uKGUpe2VbZS5EZXBlbmRzT25LYkxheW91dD0tMV09IkRlcGVuZHNPbktiTGF5b3V0IixlW2UuVW5rbm93bj0wXT0iVW5rbm93biIsZVtlLkJhY2tzcGFjZT0xXT0iQmFja3NwYWNlIixlW2UuVGFiPTJdPSJUYWIiLGVbZS5FbnRlcj0zXT0iRW50ZXIiLGVbZS5TaGlmdD00XT0iU2hpZnQiLGVbZS5DdHJsPTVdPSJDdHJsIixlW2UuQWx0PTZdPSJBbHQiLGVbZS5QYXVzZUJyZWFrPTddPSJQYXVzZUJyZWFrIixlW2UuQ2Fwc0xvY2s9OF09IkNhcHNMb2NrIixlW2UuRXNjYXBlPTldPSJFc2NhcGUiLGVbZS5TcGFjZT0xMF09IlNwYWNlIixlW2UuUGFnZVVwPTExXT0iUGFnZVVwIixlW2UuUGFnZURvd249MTJdPSJQYWdlRG93biIsZVtlLkVuZD0xM109IkVuZCIsZVtlLkhvbWU9MTRdPSJIb21lIixlW2UuTGVmdEFycm93PTE1XT0iTGVmdEFycm93IixlW2UuVXBBcnJvdz0xNl09IlVwQXJyb3ciLGVbZS5SaWdodEFycm93PTE3XT0iUmlnaHRBcnJvdyIsZVtlLkRvd25BcnJvdz0xOF09IkRvd25BcnJvdyIsZVtlLkluc2VydD0xOV09Ikluc2VydCIsZVtlLkRlbGV0ZT0yMF09IkRlbGV0ZSIsZVtlLkRpZ2l0MD0yMV09IkRpZ2l0MCIsZVtlLkRpZ2l0MT0yMl09IkRpZ2l0MSIsZVtlLkRpZ2l0Mj0yM109IkRpZ2l0MiIsZVtlLkRpZ2l0Mz0yNF09IkRpZ2l0MyIsZVtlLkRpZ2l0ND0yNV09IkRpZ2l0NCIsZVtlLkRpZ2l0NT0yNl09IkRpZ2l0NSIsZVtlLkRpZ2l0Nj0yN109IkRpZ2l0NiIsZVtlLkRpZ2l0Nz0yOF09IkRpZ2l0NyIsZVtlLkRpZ2l0OD0yOV09IkRpZ2l0OCIsZVtlLkRpZ2l0OT0zMF09IkRpZ2l0OSIsZVtlLktleUE9MzFdPSJLZXlBIixlW2UuS2V5Qj0zMl09IktleUIiLGVbZS5LZXlDPTMzXT0iS2V5QyIsZVtlLktleUQ9MzRdPSJLZXlEIixlW2UuS2V5RT0zNV09IktleUUiLGVbZS5LZXlGPTM2XT0iS2V5RiIsZVtlLktleUc9MzddPSJLZXlHIixlW2UuS2V5SD0zOF09IktleUgiLGVbZS5LZXlJPTM5XT0iS2V5SSIsZVtlLktleUo9NDBdPSJLZXlKIixlW2UuS2V5Sz00MV09IktleUsiLGVbZS5LZXlMPTQyXT0iS2V5TCIsZVtlLktleU09NDNdPSJLZXlNIixlW2UuS2V5Tj00NF09IktleU4iLGVbZS5LZXlPPTQ1XT0iS2V5TyIsZVtlLktleVA9NDZdPSJLZXlQIixlW2UuS2V5UT00N109IktleVEiLGVbZS5LZXlSPTQ4XT0iS2V5UiIsZVtlLktleVM9NDldPSJLZXlTIixlW2UuS2V5VD01MF09IktleVQiLGVbZS5LZXlVPTUxXT0iS2V5VSIsZVtlLktleVY9NTJdPSJLZXlWIixlW2UuS2V5Vz01M109IktleVciLGVbZS5LZXlYPTU0XT0iS2V5WCIsZVtlLktleVk9NTVdPSJLZXlZIixlW2UuS2V5Wj01Nl09IktleVoiLGVbZS5NZXRhPTU3XT0iTWV0YSIsZVtlLkNvbnRleHRNZW51PTU4XT0iQ29udGV4dE1lbnUiLGVbZS5GMT01OV09IkYxIixlW2UuRjI9NjBdPSJGMiIsZVtlLkYzPTYxXT0iRjMiLGVbZS5GND02Ml09IkY0IixlW2UuRjU9NjNdPSJGNSIsZVtlLkY2PTY0XT0iRjYiLGVbZS5GNz02NV09IkY3IixlW2UuRjg9NjZdPSJGOCIsZVtlLkY5PTY3XT0iRjkiLGVbZS5GMTA9NjhdPSJGMTAiLGVbZS5GMTE9NjldPSJGMTEiLGVbZS5GMTI9NzBdPSJGMTIiLGVbZS5GMTM9NzFdPSJGMTMiLGVbZS5GMTQ9NzJdPSJGMTQiLGVbZS5GMTU9NzNdPSJGMTUiLGVbZS5GMTY9NzRdPSJGMTYiLGVbZS5GMTc9NzVdPSJGMTciLGVbZS5GMTg9NzZdPSJGMTgiLGVbZS5GMTk9NzddPSJGMTkiLGVbZS5GMjA9NzhdPSJGMjAiLGVbZS5GMjE9NzldPSJGMjEiLGVbZS5GMjI9ODBdPSJGMjIiLGVbZS5GMjM9ODFdPSJGMjMiLGVbZS5GMjQ9ODJdPSJGMjQiLGVbZS5OdW1Mb2NrPTgzXT0iTnVtTG9jayIsZVtlLlNjcm9sbExvY2s9ODRdPSJTY3JvbGxMb2NrIixlW2UuU2VtaWNvbG9uPTg1XT0iU2VtaWNvbG9uIixlW2UuRXF1YWw9ODZdPSJFcXVhbCIsZVtlLkNvbW1hPTg3XT0iQ29tbWEiLGVbZS5NaW51cz04OF09Ik1pbnVzIixlW2UuUGVyaW9kPTg5XT0iUGVyaW9kIixlW2UuU2xhc2g9OTBdPSJTbGFzaCIsZVtlLkJhY2txdW90ZT05MV09IkJhY2txdW90ZSIsZVtlLkJyYWNrZXRMZWZ0PTkyXT0iQnJhY2tldExlZnQiLGVbZS5CYWNrc2xhc2g9OTNdPSJCYWNrc2xhc2giLGVbZS5CcmFja2V0UmlnaHQ9OTRdPSJCcmFja2V0UmlnaHQiLGVbZS5RdW90ZT05NV09IlF1b3RlIixlW2UuT0VNXzg9OTZdPSJPRU1fOCIsZVtlLkludGxCYWNrc2xhc2g9OTddPSJJbnRsQmFja3NsYXNoIixlW2UuTnVtcGFkMD05OF09Ik51bXBhZDAiLGVbZS5OdW1wYWQxPTk5XT0iTnVtcGFkMSIsZVtlLk51bXBhZDI9MTAwXT0iTnVtcGFkMiIsZVtlLk51bXBhZDM9MTAxXT0iTnVtcGFkMyIsZVtlLk51bXBhZDQ9MTAyXT0iTnVtcGFkNCIsZVtlLk51bXBhZDU9MTAzXT0iTnVtcGFkNSIsZVtlLk51bXBhZDY9MTA0XT0iTnVtcGFkNiIsZVtlLk51bXBhZDc9MTA1XT0iTnVtcGFkNyIsZVtlLk51bXBhZDg9MTA2XT0iTnVtcGFkOCIsZVtlLk51bXBhZDk9MTA3XT0iTnVtcGFkOSIsZVtlLk51bXBhZE11bHRpcGx5PTEwOF09Ik51bXBhZE11bHRpcGx5IixlW2UuTnVtcGFkQWRkPTEwOV09Ik51bXBhZEFkZCIsZVtlLk5VTVBBRF9TRVBBUkFUT1I9MTEwXT0iTlVNUEFEX1NFUEFSQVRPUiIsZVtlLk51bXBhZFN1YnRyYWN0PTExMV09Ik51bXBhZFN1YnRyYWN0IixlW2UuTnVtcGFkRGVjaW1hbD0xMTJdPSJOdW1wYWREZWNpbWFsIixlW2UuTnVtcGFkRGl2aWRlPTExM109Ik51bXBhZERpdmlkZSIsZVtlLktFWV9JTl9DT01QT1NJVElPTj0xMTRdPSJLRVlfSU5fQ09NUE9TSVRJT04iLGVbZS5BQk5UX0MxPTExNV09IkFCTlRfQzEiLGVbZS5BQk5UX0MyPTExNl09IkFCTlRfQzIiLGVbZS5BdWRpb1ZvbHVtZU11dGU9MTE3XT0iQXVkaW9Wb2x1bWVNdXRlIixlW2UuQXVkaW9Wb2x1bWVVcD0xMThdPSJBdWRpb1ZvbHVtZVVwIixlW2UuQXVkaW9Wb2x1bWVEb3duPTExOV09IkF1ZGlvVm9sdW1lRG93biIsZVtlLkJyb3dzZXJTZWFyY2g9MTIwXT0iQnJvd3NlclNlYXJjaCIsZVtlLkJyb3dzZXJIb21lPTEyMV09IkJyb3dzZXJIb21lIixlW2UuQnJvd3NlckJhY2s9MTIyXT0iQnJvd3NlckJhY2siLGVbZS5Ccm93c2VyRm9yd2FyZD0xMjNdPSJCcm93c2VyRm9yd2FyZCIsZVtlLk1lZGlhVHJhY2tOZXh0PTEyNF09Ik1lZGlhVHJhY2tOZXh0IixlW2UuTWVkaWFUcmFja1ByZXZpb3VzPTEyNV09Ik1lZGlhVHJhY2tQcmV2aW91cyIsZVtlLk1lZGlhU3RvcD0xMjZdPSJNZWRpYVN0b3AiLGVbZS5NZWRpYVBsYXlQYXVzZT0xMjddPSJNZWRpYVBsYXlQYXVzZSIsZVtlLkxhdW5jaE1lZGlhUGxheWVyPTEyOF09IkxhdW5jaE1lZGlhUGxheWVyIixlW2UuTGF1bmNoTWFpbD0xMjldPSJMYXVuY2hNYWlsIixlW2UuTGF1bmNoQXBwMj0xMzBdPSJMYXVuY2hBcHAyIixlW2UuQ2xlYXI9MTMxXT0iQ2xlYXIiLGVbZS5NQVhfVkFMVUU9MTMyXT0iTUFYX1ZBTFVFIn0pKHVufHwodW49e30pKTt2YXIgY247KGZ1bmN0aW9uKGUpe2VbZS5IaW50PTFdPSJIaW50IixlW2UuSW5mbz0yXT0iSW5mbyIsZVtlLldhcm5pbmc9NF09Ildhcm5pbmciLGVbZS5FcnJvcj04XT0iRXJyb3IifSkoY258fChjbj17fSkpO3ZhciBobjsoZnVuY3Rpb24oZSl7ZVtlLlVubmVjZXNzYXJ5PTFdPSJVbm5lY2Vzc2FyeSIsZVtlLkRlcHJlY2F0ZWQ9Ml09IkRlcHJlY2F0ZWQifSkoaG58fChobj17fSkpO3ZhciBUcjsoZnVuY3Rpb24oZSl7ZVtlLklubGluZT0xXT0iSW5saW5lIixlW2UuR3V0dGVyPTJdPSJHdXR0ZXIifSkoVHJ8fChUcj17fSkpO3ZhciBJcjsoZnVuY3Rpb24oZSl7ZVtlLk5vcm1hbD0xXT0iTm9ybWFsIixlW2UuVW5kZXJsaW5lZD0yXT0iVW5kZXJsaW5lZCJ9KShJcnx8KElyPXt9KSk7dmFyIFZyOyhmdW5jdGlvbihlKXtlW2UuVU5LTk9XTj0wXT0iVU5LTk9XTiIsZVtlLlRFWFRBUkVBPTFdPSJURVhUQVJFQSIsZVtlLkdVVFRFUl9HTFlQSF9NQVJHSU49Ml09IkdVVFRFUl9HTFlQSF9NQVJHSU4iLGVbZS5HVVRURVJfTElORV9OVU1CRVJTPTNdPSJHVVRURVJfTElORV9OVU1CRVJTIixlW2UuR1VUVEVSX0xJTkVfREVDT1JBVElPTlM9NF09IkdVVFRFUl9MSU5FX0RFQ09SQVRJT05TIixlW2UuR1VUVEVSX1ZJRVdfWk9ORT01XT0iR1VUVEVSX1ZJRVdfWk9ORSIsZVtlLkNPTlRFTlRfVEVYVD02XT0iQ09OVEVOVF9URVhUIixlW2UuQ09OVEVOVF9FTVBUWT03XT0iQ09OVEVOVF9FTVBUWSIsZVtlLkNPTlRFTlRfVklFV19aT05FPThdPSJDT05URU5UX1ZJRVdfWk9ORSIsZVtlLkNPTlRFTlRfV0lER0VUPTldPSJDT05URU5UX1dJREdFVCIsZVtlLk9WRVJWSUVXX1JVTEVSPTEwXT0iT1ZFUlZJRVdfUlVMRVIiLGVbZS5TQ1JPTExCQVI9MTFdPSJTQ1JPTExCQVIiLGVbZS5PVkVSTEFZX1dJREdFVD0xMl09Ik9WRVJMQVlfV0lER0VUIixlW2UuT1VUU0lERV9FRElUT1I9MTNdPSJPVVRTSURFX0VESVRPUiJ9KShWcnx8KFZyPXt9KSk7dmFyIEJyOyhmdW5jdGlvbihlKXtlW2UuQUlHZW5lcmF0ZWQ9MV09IkFJR2VuZXJhdGVkIn0pKEJyfHwoQnI9e30pKTt2YXIgcXI7KGZ1bmN0aW9uKGUpe2VbZS5JbnZva2U9MF09Ikludm9rZSIsZVtlLkF1dG9tYXRpYz0xXT0iQXV0b21hdGljIn0pKHFyfHwocXI9e30pKTt2YXIgVXI7KGZ1bmN0aW9uKGUpe2VbZS5UT1BfUklHSFRfQ09STkVSPTBdPSJUT1BfUklHSFRfQ09STkVSIixlW2UuQk9UVE9NX1JJR0hUX0NPUk5FUj0xXT0iQk9UVE9NX1JJR0hUX0NPUk5FUiIsZVtlLlRPUF9DRU5URVI9Ml09IlRPUF9DRU5URVIifSkoVXJ8fChVcj17fSkpO3ZhciAkcjsoZnVuY3Rpb24oZSl7ZVtlLkxlZnQ9MV09IkxlZnQiLGVbZS5DZW50ZXI9Ml09IkNlbnRlciIsZVtlLlJpZ2h0PTRdPSJSaWdodCIsZVtlLkZ1bGw9N109IkZ1bGwifSkoJHJ8fCgkcj17fSkpO3ZhciBIcjsoZnVuY3Rpb24oZSl7ZVtlLldvcmQ9MF09IldvcmQiLGVbZS5MaW5lPTFdPSJMaW5lIixlW2UuU3VnZ2VzdD0yXT0iU3VnZ2VzdCJ9KShIcnx8KEhyPXt9KSk7dmFyIFdyOyhmdW5jdGlvbihlKXtlW2UuTGVmdD0wXT0iTGVmdCIsZVtlLlJpZ2h0PTFdPSJSaWdodCIsZVtlLk5vbmU9Ml09Ik5vbmUiLGVbZS5MZWZ0T2ZJbmplY3RlZFRleHQ9M109IkxlZnRPZkluamVjdGVkVGV4dCIsZVtlLlJpZ2h0T2ZJbmplY3RlZFRleHQ9NF09IlJpZ2h0T2ZJbmplY3RlZFRleHQifSkoV3J8fChXcj17fSkpO3ZhciB6cjsoZnVuY3Rpb24oZSl7ZVtlLk9mZj0wXT0iT2ZmIixlW2UuT249MV09Ik9uIixlW2UuUmVsYXRpdmU9Ml09IlJlbGF0aXZlIixlW2UuSW50ZXJ2YWw9M109IkludGVydmFsIixlW2UuQ3VzdG9tPTRdPSJDdXN0b20ifSkoenJ8fCh6cj17fSkpO3ZhciBPcjsoZnVuY3Rpb24oZSl7ZVtlLk5vbmU9MF09Ik5vbmUiLGVbZS5UZXh0PTFdPSJUZXh0IixlW2UuQmxvY2tzPTJdPSJCbG9ja3MifSkoT3J8fChPcj17fSkpO3ZhciBHcjsoZnVuY3Rpb24oZSl7ZVtlLlNtb290aD0wXT0iU21vb3RoIixlW2UuSW1tZWRpYXRlPTFdPSJJbW1lZGlhdGUifSkoR3J8fChHcj17fSkpO3ZhciBqcjsoZnVuY3Rpb24oZSl7ZVtlLkF1dG89MV09IkF1dG8iLGVbZS5IaWRkZW49Ml09IkhpZGRlbiIsZVtlLlZpc2libGU9M109IlZpc2libGUifSkoanJ8fChqcj17fSkpO3ZhciBmbjsoZnVuY3Rpb24oZSl7ZVtlLkxUUj0wXT0iTFRSIixlW2UuUlRMPTFdPSJSVEwifSkoZm58fChmbj17fSkpO3ZhciBYcjsoZnVuY3Rpb24oZSl7ZS5PZmY9Im9mZiIsZS5PbkNvZGU9Im9uQ29kZSIsZS5Pbj0ib24ifSkoWHJ8fChYcj17fSkpO3ZhciBRcjsoZnVuY3Rpb24oZSl7ZVtlLkludm9rZT0xXT0iSW52b2tlIixlW2UuVHJpZ2dlckNoYXJhY3Rlcj0yXT0iVHJpZ2dlckNoYXJhY3RlciIsZVtlLkNvbnRlbnRDaGFuZ2U9M109IkNvbnRlbnRDaGFuZ2UifSkoUXJ8fChRcj17fSkpO3ZhciBZcjsoZnVuY3Rpb24oZSl7ZVtlLkZpbGU9MF09IkZpbGUiLGVbZS5Nb2R1bGU9MV09Ik1vZHVsZSIsZVtlLk5hbWVzcGFjZT0yXT0iTmFtZXNwYWNlIixlW2UuUGFja2FnZT0zXT0iUGFja2FnZSIsZVtlLkNsYXNzPTRdPSJDbGFzcyIsZVtlLk1ldGhvZD01XT0iTWV0aG9kIixlW2UuUHJvcGVydHk9Nl09IlByb3BlcnR5IixlW2UuRmllbGQ9N109IkZpZWxkIixlW2UuQ29uc3RydWN0b3I9OF09IkNvbnN0cnVjdG9yIixlW2UuRW51bT05XT0iRW51bSIsZVtlLkludGVyZmFjZT0xMF09IkludGVyZmFjZSIsZVtlLkZ1bmN0aW9uPTExXT0iRnVuY3Rpb24iLGVbZS5WYXJpYWJsZT0xMl09IlZhcmlhYmxlIixlW2UuQ29uc3RhbnQ9MTNdPSJDb25zdGFudCIsZVtlLlN0cmluZz0xNF09IlN0cmluZyIsZVtlLk51bWJlcj0xNV09Ik51bWJlciIsZVtlLkJvb2xlYW49MTZdPSJCb29sZWFuIixlW2UuQXJyYXk9MTddPSJBcnJheSIsZVtlLk9iamVjdD0xOF09Ik9iamVjdCIsZVtlLktleT0xOV09IktleSIsZVtlLk51bGw9MjBdPSJOdWxsIixlW2UuRW51bU1lbWJlcj0yMV09IkVudW1NZW1iZXIiLGVbZS5TdHJ1Y3Q9MjJdPSJTdHJ1Y3QiLGVbZS5FdmVudD0yM109IkV2ZW50IixlW2UuT3BlcmF0b3I9MjRdPSJPcGVyYXRvciIsZVtlLlR5cGVQYXJhbWV0ZXI9MjVdPSJUeXBlUGFyYW1ldGVyIn0pKFlyfHwoWXI9e30pKTt2YXIgSnI7KGZ1bmN0aW9uKGUpe2VbZS5EZXByZWNhdGVkPTFdPSJEZXByZWNhdGVkIn0pKEpyfHwoSnI9e30pKTt2YXIgWnI7KGZ1bmN0aW9uKGUpe2VbZS5IaWRkZW49MF09IkhpZGRlbiIsZVtlLkJsaW5rPTFdPSJCbGluayIsZVtlLlNtb290aD0yXT0iU21vb3RoIixlW2UuUGhhc2U9M109IlBoYXNlIixlW2UuRXhwYW5kPTRdPSJFeHBhbmQiLGVbZS5Tb2xpZD01XT0iU29saWQifSkoWnJ8fChacj17fSkpO3ZhciBLcjsoZnVuY3Rpb24oZSl7ZVtlLkxpbmU9MV09IkxpbmUiLGVbZS5CbG9jaz0yXT0iQmxvY2siLGVbZS5VbmRlcmxpbmU9M109IlVuZGVybGluZSIsZVtlLkxpbmVUaGluPTRdPSJMaW5lVGhpbiIsZVtlLkJsb2NrT3V0bGluZT01XT0iQmxvY2tPdXRsaW5lIixlW2UuVW5kZXJsaW5lVGhpbj02XT0iVW5kZXJsaW5lVGhpbiJ9KShLcnx8KEtyPXt9KSk7dmFyIGVzOyhmdW5jdGlvbihlKXtlW2UuQWx3YXlzR3Jvd3NXaGVuVHlwaW5nQXRFZGdlcz0wXT0iQWx3YXlzR3Jvd3NXaGVuVHlwaW5nQXRFZGdlcyIsZVtlLk5ldmVyR3Jvd3NXaGVuVHlwaW5nQXRFZGdlcz0xXT0iTmV2ZXJHcm93c1doZW5UeXBpbmdBdEVkZ2VzIixlW2UuR3Jvd3NPbmx5V2hlblR5cGluZ0JlZm9yZT0yXT0iR3Jvd3NPbmx5V2hlblR5cGluZ0JlZm9yZSIsZVtlLkdyb3dzT25seVdoZW5UeXBpbmdBZnRlcj0zXT0iR3Jvd3NPbmx5V2hlblR5cGluZ0FmdGVyIn0pKGVzfHwoZXM9e30pKTt2YXIgdHM7KGZ1bmN0aW9uKGUpe2VbZS5Ob25lPTBdPSJOb25lIixlW2UuU2FtZT0xXT0iU2FtZSIsZVtlLkluZGVudD0yXT0iSW5kZW50IixlW2UuRGVlcEluZGVudD0zXT0iRGVlcEluZGVudCJ9KSh0c3x8KHRzPXt9KSk7Y29uc3QgWGU9Y2xhc3MgWGV7c3RhdGljIGNob3JkKHQsbil7cmV0dXJuIGNhKHQsbil9fTtYZS5DdHJsQ21kPTIwNDgsWGUuU2hpZnQ9MTAyNCxYZS5BbHQ9NTEyLFhlLldpbkN0cmw9MjU2O2xldCBkbj1YZTtmdW5jdGlvbiBiYSgpe3JldHVybntlZGl0b3I6dm9pZCAwLGxhbmd1YWdlczp2b2lkIDAsQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2U6YWEsRW1pdHRlcjpvZSxLZXlDb2RlOnVuLEtleU1vZDpkbixQb3NpdGlvbjokLFJhbmdlOmssU2VsZWN0aW9uOmFlLFNlbGVjdGlvbkRpcmVjdGlvbjpmbixNYXJrZXJTZXZlcml0eTpjbixNYXJrZXJUYWc6aG4sVXJpOnNlLFRva2VuOmdhfX1jb25zdCB1dD1jbGFzcyB1dHtzdGF0aWMgZ2V0Q2hhbm5lbCh0KXtyZXR1cm4gdC5nZXRDaGFubmVsKHV0LkNIQU5ORUxfTkFNRSl9c3RhdGljIHNldENoYW5uZWwodCxuKXt0LnNldENoYW5uZWwodXQuQ0hBTk5FTF9OQU1FLG4pfX07dXQuQ0hBTk5FTF9OQU1FPSJlZGl0b3JXb3JrZXJIb3N0IjtsZXQgbW49dXQ7dmFyIG5zO2NsYXNzIHhhe2NvbnN0cnVjdG9yKCl7dGhpc1tuc109IkxpbmtlZE1hcCIsdGhpcy5fbWFwPW5ldyBNYXAsdGhpcy5faGVhZD12b2lkIDAsdGhpcy5fdGFpbD12b2lkIDAsdGhpcy5fc2l6ZT0wLHRoaXMuX3N0YXRlPTB9Y2xlYXIoKXt0aGlzLl9tYXAuY2xlYXIoKSx0aGlzLl9oZWFkPXZvaWQgMCx0aGlzLl90YWlsPXZvaWQgMCx0aGlzLl9zaXplPTAsdGhpcy5fc3RhdGUrK31pc0VtcHR5KCl7cmV0dXJuIXRoaXMuX2hlYWQmJiF0aGlzLl90YWlsfWdldCBzaXplKCl7cmV0dXJuIHRoaXMuX3NpemV9Z2V0IGZpcnN0KCl7dmFyIHQ7cmV0dXJuKHQ9dGhpcy5faGVhZCk9PW51bGw/dm9pZCAwOnQudmFsdWV9Z2V0IGxhc3QoKXt2YXIgdDtyZXR1cm4odD10aGlzLl90YWlsKT09bnVsbD92b2lkIDA6dC52YWx1ZX1oYXModCl7cmV0dXJuIHRoaXMuX21hcC5oYXModCl9Z2V0KHQsbj0wKXtjb25zdCByPXRoaXMuX21hcC5nZXQodCk7aWYocilyZXR1cm4gbiE9PTAmJnRoaXMudG91Y2gocixuKSxyLnZhbHVlfXNldCh0LG4scj0wKXtsZXQgcz10aGlzLl9tYXAuZ2V0KHQpO2lmKHMpcy52YWx1ZT1uLHIhPT0wJiZ0aGlzLnRvdWNoKHMscik7ZWxzZXtzd2l0Y2gocz17a2V5OnQsdmFsdWU6bixuZXh0OnZvaWQgMCxwcmV2aW91czp2b2lkIDB9LHIpe2Nhc2UgMDp0aGlzLmFkZEl0ZW1MYXN0KHMpO2JyZWFrO2Nhc2UgMTp0aGlzLmFkZEl0ZW1GaXJzdChzKTticmVhaztjYXNlIDI6dGhpcy5hZGRJdGVtTGFzdChzKTticmVhaztkZWZhdWx0OnRoaXMuYWRkSXRlbUxhc3Qocyk7YnJlYWt9dGhpcy5fbWFwLnNldCh0LHMpLHRoaXMuX3NpemUrK31yZXR1cm4gdGhpc31kZWxldGUodCl7cmV0dXJuISF0aGlzLnJlbW92ZSh0KX1yZW1vdmUodCl7Y29uc3Qgbj10aGlzLl9tYXAuZ2V0KHQpO2lmKG4pcmV0dXJuIHRoaXMuX21hcC5kZWxldGUodCksdGhpcy5yZW1vdmVJdGVtKG4pLHRoaXMuX3NpemUtLSxuLnZhbHVlfXNoaWZ0KCl7aWYoIXRoaXMuX2hlYWQmJiF0aGlzLl90YWlsKXJldHVybjtpZighdGhpcy5faGVhZHx8IXRoaXMuX3RhaWwpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTtjb25zdCB0PXRoaXMuX2hlYWQ7cmV0dXJuIHRoaXMuX21hcC5kZWxldGUodC5rZXkpLHRoaXMucmVtb3ZlSXRlbSh0KSx0aGlzLl9zaXplLS0sdC52YWx1ZX1mb3JFYWNoKHQsbil7Y29uc3Qgcj10aGlzLl9zdGF0ZTtsZXQgcz10aGlzLl9oZWFkO2Zvcig7czspe2lmKG4/dC5iaW5kKG4pKHMudmFsdWUscy5rZXksdGhpcyk6dChzLnZhbHVlLHMua2V5LHRoaXMpLHRoaXMuX3N0YXRlIT09cil0aHJvdyBuZXcgRXJyb3IoIkxpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi4iKTtzPXMubmV4dH19a2V5cygpe2NvbnN0IHQ9dGhpcyxuPXRoaXMuX3N0YXRlO2xldCByPXRoaXMuX2hlYWQ7Y29uc3Qgcz17W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gc30sbmV4dCgpe2lmKHQuX3N0YXRlIT09bil0aHJvdyBuZXcgRXJyb3IoIkxpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi4iKTtpZihyKXtjb25zdCBpPXt2YWx1ZTpyLmtleSxkb25lOiExfTtyZXR1cm4gcj1yLm5leHQsaX1lbHNlIHJldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH19fTtyZXR1cm4gc312YWx1ZXMoKXtjb25zdCB0PXRoaXMsbj10aGlzLl9zdGF0ZTtsZXQgcj10aGlzLl9oZWFkO2NvbnN0IHM9e1tTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHN9LG5leHQoKXtpZih0Ll9zdGF0ZSE9PW4pdGhyb3cgbmV3IEVycm9yKCJMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uIik7aWYocil7Y29uc3QgaT17dmFsdWU6ci52YWx1ZSxkb25lOiExfTtyZXR1cm4gcj1yLm5leHQsaX1lbHNlIHJldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH19fTtyZXR1cm4gc31lbnRyaWVzKCl7Y29uc3QgdD10aGlzLG49dGhpcy5fc3RhdGU7bGV0IHI9dGhpcy5faGVhZDtjb25zdCBzPXtbU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBzfSxuZXh0KCl7aWYodC5fc3RhdGUhPT1uKXRocm93IG5ldyBFcnJvcigiTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLiIpO2lmKHIpe2NvbnN0IGk9e3ZhbHVlOltyLmtleSxyLnZhbHVlXSxkb25lOiExfTtyZXR1cm4gcj1yLm5leHQsaX1lbHNlIHJldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH19fTtyZXR1cm4gc31bKG5zPVN5bWJvbC50b1N0cmluZ1RhZyxTeW1ib2wuaXRlcmF0b3IpXSgpe3JldHVybiB0aGlzLmVudHJpZXMoKX10cmltT2xkKHQpe2lmKHQ+PXRoaXMuc2l6ZSlyZXR1cm47aWYodD09PTApe3RoaXMuY2xlYXIoKTtyZXR1cm59bGV0IG49dGhpcy5faGVhZCxyPXRoaXMuc2l6ZTtmb3IoO24mJnI+dDspdGhpcy5fbWFwLmRlbGV0ZShuLmtleSksbj1uLm5leHQsci0tO3RoaXMuX2hlYWQ9bix0aGlzLl9zaXplPXIsbiYmKG4ucHJldmlvdXM9dm9pZCAwKSx0aGlzLl9zdGF0ZSsrfXRyaW1OZXcodCl7aWYodD49dGhpcy5zaXplKXJldHVybjtpZih0PT09MCl7dGhpcy5jbGVhcigpO3JldHVybn1sZXQgbj10aGlzLl90YWlsLHI9dGhpcy5zaXplO2Zvcig7biYmcj50Oyl0aGlzLl9tYXAuZGVsZXRlKG4ua2V5KSxuPW4ucHJldmlvdXMsci0tO3RoaXMuX3RhaWw9bix0aGlzLl9zaXplPXIsbiYmKG4ubmV4dD12b2lkIDApLHRoaXMuX3N0YXRlKyt9YWRkSXRlbUZpcnN0KHQpe2lmKCF0aGlzLl9oZWFkJiYhdGhpcy5fdGFpbCl0aGlzLl90YWlsPXQ7ZWxzZSBpZih0aGlzLl9oZWFkKXQubmV4dD10aGlzLl9oZWFkLHRoaXMuX2hlYWQucHJldmlvdXM9dDtlbHNlIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7dGhpcy5faGVhZD10LHRoaXMuX3N0YXRlKyt9YWRkSXRlbUxhc3QodCl7aWYoIXRoaXMuX2hlYWQmJiF0aGlzLl90YWlsKXRoaXMuX2hlYWQ9dDtlbHNlIGlmKHRoaXMuX3RhaWwpdC5wcmV2aW91cz10aGlzLl90YWlsLHRoaXMuX3RhaWwubmV4dD10O2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTt0aGlzLl90YWlsPXQsdGhpcy5fc3RhdGUrK31yZW1vdmVJdGVtKHQpe2lmKHQ9PT10aGlzLl9oZWFkJiZ0PT09dGhpcy5fdGFpbCl0aGlzLl9oZWFkPXZvaWQgMCx0aGlzLl90YWlsPXZvaWQgMDtlbHNlIGlmKHQ9PT10aGlzLl9oZWFkKXtpZighdC5uZXh0KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7dC5uZXh0LnByZXZpb3VzPXZvaWQgMCx0aGlzLl9oZWFkPXQubmV4dH1lbHNlIGlmKHQ9PT10aGlzLl90YWlsKXtpZighdC5wcmV2aW91cyl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbGlzdCIpO3QucHJldmlvdXMubmV4dD12b2lkIDAsdGhpcy5fdGFpbD10LnByZXZpb3VzfWVsc2V7Y29uc3Qgbj10Lm5leHQscj10LnByZXZpb3VzO2lmKCFufHwhcil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbGlzdCIpO24ucHJldmlvdXM9cixyLm5leHQ9bn10Lm5leHQ9dm9pZCAwLHQucHJldmlvdXM9dm9pZCAwLHRoaXMuX3N0YXRlKyt9dG91Y2godCxuKXtpZighdGhpcy5faGVhZHx8IXRoaXMuX3RhaWwpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTtpZighKG4hPT0xJiZuIT09Mikpe2lmKG49PT0xKXtpZih0PT09dGhpcy5faGVhZClyZXR1cm47Y29uc3Qgcj10Lm5leHQscz10LnByZXZpb3VzO3Q9PT10aGlzLl90YWlsPyhzLm5leHQ9dm9pZCAwLHRoaXMuX3RhaWw9cyk6KHIucHJldmlvdXM9cyxzLm5leHQ9ciksdC5wcmV2aW91cz12b2lkIDAsdC5uZXh0PXRoaXMuX2hlYWQsdGhpcy5faGVhZC5wcmV2aW91cz10LHRoaXMuX2hlYWQ9dCx0aGlzLl9zdGF0ZSsrfWVsc2UgaWYobj09PTIpe2lmKHQ9PT10aGlzLl90YWlsKXJldHVybjtjb25zdCByPXQubmV4dCxzPXQucHJldmlvdXM7dD09PXRoaXMuX2hlYWQ/KHIucHJldmlvdXM9dm9pZCAwLHRoaXMuX2hlYWQ9cik6KHIucHJldmlvdXM9cyxzLm5leHQ9ciksdC5uZXh0PXZvaWQgMCx0LnByZXZpb3VzPXRoaXMuX3RhaWwsdGhpcy5fdGFpbC5uZXh0PXQsdGhpcy5fdGFpbD10LHRoaXMuX3N0YXRlKyt9fX10b0pTT04oKXtjb25zdCB0PVtdO3JldHVybiB0aGlzLmZvckVhY2goKG4scik9Pnt0LnB1c2goW3Isbl0pfSksdH1mcm9tSlNPTih0KXt0aGlzLmNsZWFyKCk7Zm9yKGNvbnN0W24scl1vZiB0KXRoaXMuc2V0KG4scil9fWNsYXNzIHBhIGV4dGVuZHMgeGF7Y29uc3RydWN0b3IodCxuPTEpe3N1cGVyKCksdGhpcy5fbGltaXQ9dCx0aGlzLl9yYXRpbz1NYXRoLm1pbihNYXRoLm1heCgwLG4pLDEpfWdldCBsaW1pdCgpe3JldHVybiB0aGlzLl9saW1pdH1zZXQgbGltaXQodCl7dGhpcy5fbGltaXQ9dCx0aGlzLmNoZWNrVHJpbSgpfWdldCh0LG49Mil7cmV0dXJuIHN1cGVyLmdldCh0LG4pfXBlZWsodCl7cmV0dXJuIHN1cGVyLmdldCh0LDApfXNldCh0LG4pe3JldHVybiBzdXBlci5zZXQodCxuLDIpLHRoaXN9Y2hlY2tUcmltKCl7dGhpcy5zaXplPnRoaXMuX2xpbWl0JiZ0aGlzLnRyaW0oTWF0aC5yb3VuZCh0aGlzLl9saW1pdCp0aGlzLl9yYXRpbykpfX1jbGFzcyBfYSBleHRlbmRzIHBhe2NvbnN0cnVjdG9yKHQsbj0xKXtzdXBlcih0LG4pfXRyaW0odCl7dGhpcy50cmltT2xkKHQpfXNldCh0LG4pe3JldHVybiBzdXBlci5zZXQodCxuKSx0aGlzLmNoZWNrVHJpbSgpLHRoaXN9fWNsYXNzIHdhe2NvbnN0cnVjdG9yKCl7dGhpcy5tYXA9bmV3IE1hcH1hZGQodCxuKXtsZXQgcj10aGlzLm1hcC5nZXQodCk7cnx8KHI9bmV3IFNldCx0aGlzLm1hcC5zZXQodCxyKSksci5hZGQobil9ZGVsZXRlKHQsbil7Y29uc3Qgcj10aGlzLm1hcC5nZXQodCk7ciYmKHIuZGVsZXRlKG4pLHIuc2l6ZT09PTAmJnRoaXMubWFwLmRlbGV0ZSh0KSl9Zm9yRWFjaCh0LG4pe2NvbnN0IHI9dGhpcy5tYXAuZ2V0KHQpO3ImJnIuZm9yRWFjaChuKX1nZXQodCl7Y29uc3Qgbj10aGlzLm1hcC5nZXQodCk7cmV0dXJuIG58fG5ldyBTZXR9fW5ldyBfYSgxMCk7ZnVuY3Rpb24gTGEoZSl7bGV0IHQ9W107Zm9yKDtPYmplY3QucHJvdG90eXBlIT09ZTspdD10LmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSksZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cmV0dXJuIHR9ZnVuY3Rpb24gcnMoZSl7Y29uc3QgdD1bXTtmb3IoY29uc3QgbiBvZiBMYShlKSl0eXBlb2YgZVtuXT09ImZ1bmN0aW9uIiYmdC5wdXNoKG4pO3JldHVybiB0fWZ1bmN0aW9uIHZhKGUsdCl7Y29uc3Qgbj1zPT5mdW5jdGlvbigpe2NvbnN0IGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiB0KHMsaSl9LHI9e307Zm9yKGNvbnN0IHMgb2YgZSlyW3NdPW4ocyk7cmV0dXJuIHJ9dmFyIHNzOyhmdW5jdGlvbihlKXtlW2UuTGVmdD0xXT0iTGVmdCIsZVtlLkNlbnRlcj0yXT0iQ2VudGVyIixlW2UuUmlnaHQ9NF09IlJpZ2h0IixlW2UuRnVsbD03XT0iRnVsbCJ9KShzc3x8KHNzPXt9KSk7dmFyIGlzOyhmdW5jdGlvbihlKXtlW2UuTGVmdD0xXT0iTGVmdCIsZVtlLkNlbnRlcj0yXT0iQ2VudGVyIixlW2UuUmlnaHQ9M109IlJpZ2h0In0pKGlzfHwoaXM9e30pKTt2YXIgYXM7KGZ1bmN0aW9uKGUpe2VbZS5Cb3RoPTBdPSJCb3RoIixlW2UuUmlnaHQ9MV09IlJpZ2h0IixlW2UuTGVmdD0yXT0iTGVmdCIsZVtlLk5vbmU9M109Ik5vbmUifSkoYXN8fChhcz17fSkpO2Z1bmN0aW9uIE5hKGUsdCxuLHIscyl7aWYocj09PTApcmV0dXJuITA7Y29uc3QgaT10LmNoYXJDb2RlQXQoci0xKTtpZihlLmdldChpKSE9PTB8fGk9PT0xM3x8aT09PTEwKXJldHVybiEwO2lmKHM+MCl7Y29uc3Qgbz10LmNoYXJDb2RlQXQocik7aWYoZS5nZXQobykhPT0wKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFNhKGUsdCxuLHIscyl7aWYocitzPT09bilyZXR1cm4hMDtjb25zdCBpPXQuY2hhckNvZGVBdChyK3MpO2lmKGUuZ2V0KGkpIT09MHx8aT09PTEzfHxpPT09MTApcmV0dXJuITA7aWYocz4wKXtjb25zdCBvPXQuY2hhckNvZGVBdChyK3MtMSk7aWYoZS5nZXQobykhPT0wKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIENhKGUsdCxuLHIscyl7cmV0dXJuIE5hKGUsdCxuLHIscykmJlNhKGUsdCxuLHIscyl9Y2xhc3MgQWF7Y29uc3RydWN0b3IodCxuKXt0aGlzLl93b3JkU2VwYXJhdG9ycz10LHRoaXMuX3NlYXJjaFJlZ2V4PW4sdGhpcy5fcHJldk1hdGNoU3RhcnRJbmRleD0tMSx0aGlzLl9wcmV2TWF0Y2hMZW5ndGg9MH1yZXNldCh0KXt0aGlzLl9zZWFyY2hSZWdleC5sYXN0SW5kZXg9dCx0aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4PS0xLHRoaXMuX3ByZXZNYXRjaExlbmd0aD0wfW5leHQodCl7Y29uc3Qgbj10Lmxlbmd0aDtsZXQgcjtkb3tpZih0aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4K3RoaXMuX3ByZXZNYXRjaExlbmd0aD09PW58fChyPXRoaXMuX3NlYXJjaFJlZ2V4LmV4ZWModCksIXIpKXJldHVybiBudWxsO2NvbnN0IHM9ci5pbmRleCxpPXJbMF0ubGVuZ3RoO2lmKHM9PT10aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4JiZpPT09dGhpcy5fcHJldk1hdGNoTGVuZ3RoKXtpZihpPT09MCl7d2kodCxuLHRoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleCk+NjU1MzU/dGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4Kz0yOnRoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleCs9MTtjb250aW51ZX1yZXR1cm4gbnVsbH1pZih0aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4PXMsdGhpcy5fcHJldk1hdGNoTGVuZ3RoPWksIXRoaXMuX3dvcmRTZXBhcmF0b3JzfHxDYSh0aGlzLl93b3JkU2VwYXJhdG9ycyx0LG4scyxpKSlyZXR1cm4gcn13aGlsZShyKTtyZXR1cm4gbnVsbH19ZnVuY3Rpb24gUmEoZSx0PSJVbnJlYWNoYWJsZSIpe3Rocm93IG5ldyBFcnJvcih0KX1mdW5jdGlvbiBOdChlKXtpZighZSgpKXtkZWJ1Z2dlcjtlKCksSmUobmV3IGllKCJBc3NlcnRpb24gRmFpbGVkIikpfX1mdW5jdGlvbiBvcyhlLHQpe2xldCBuPTA7Zm9yKDtuPGUubGVuZ3RoLTE7KXtjb25zdCByPWVbbl0scz1lW24rMV07aWYoIXQocixzKSlyZXR1cm4hMTtuKyt9cmV0dXJuITB9Y29uc3QgeWE9ImB+IUAjJCVeJiooKS09K1t7XX1cXHw7OidcIiwuPD4vPyI7ZnVuY3Rpb24gRWEoZT0iIil7bGV0IHQ9IigtP1xcZCpcXC5cXGRcXHcqKXwoW14iO2Zvcihjb25zdCBuIG9mIHlhKWUuaW5kZXhPZihuKT49MHx8KHQrPSJcXCIrbik7cmV0dXJuIHQrPSJcXHNdKykiLG5ldyBSZWdFeHAodCwiZyIpfWNvbnN0IGxzPUVhKCk7ZnVuY3Rpb24gdXMoZSl7bGV0IHQ9bHM7aWYoZSYmZSBpbnN0YW5jZW9mIFJlZ0V4cClpZihlLmdsb2JhbCl0PWU7ZWxzZXtsZXQgbj0iZyI7ZS5pZ25vcmVDYXNlJiYobis9ImkiKSxlLm11bHRpbGluZSYmKG4rPSJtIiksZS51bmljb2RlJiYobis9InUiKSx0PW5ldyBSZWdFeHAoZS5zb3VyY2Usbil9cmV0dXJuIHQubGFzdEluZGV4PTAsdH1jb25zdCBjcz1uZXcgWHM7Y3MudW5zaGlmdCh7bWF4TGVuOjFlMyx3aW5kb3dTaXplOjE1LHRpbWVCdWRnZXQ6MTUwfSk7ZnVuY3Rpb24gZ24oZSx0LG4scixzKXtpZih0PXVzKHQpLHN8fChzPWh0LmZpcnN0KGNzKSksbi5sZW5ndGg+cy5tYXhMZW4pe2xldCBjPWUtcy5tYXhMZW4vMjtyZXR1cm4gYzwwP2M9MDpyKz1jLG49bi5zdWJzdHJpbmcoYyxlK3MubWF4TGVuLzIpLGduKGUsdCxuLHIscyl9Y29uc3QgaT1EYXRlLm5vdygpLG89ZS0xLXI7bGV0IGw9LTEsdT1udWxsO2ZvcihsZXQgYz0xOyEoRGF0ZS5ub3coKS1pPj1zLnRpbWVCdWRnZXQpO2MrKyl7Y29uc3QgaD1vLXMud2luZG93U2l6ZSpjO3QubGFzdEluZGV4PU1hdGgubWF4KDAsaCk7Y29uc3QgZj1NYSh0LG4sbyxsKTtpZighZiYmdXx8KHU9ZixoPD0wKSlicmVhaztsPWh9aWYodSl7Y29uc3QgYz17d29yZDp1WzBdLHN0YXJ0Q29sdW1uOnIrMSt1LmluZGV4LGVuZENvbHVtbjpyKzErdS5pbmRleCt1WzBdLmxlbmd0aH07cmV0dXJuIHQubGFzdEluZGV4PTAsY31yZXR1cm4gbnVsbH1mdW5jdGlvbiBNYShlLHQsbixyKXtsZXQgcztmb3IoO3M9ZS5leGVjKHQpOyl7Y29uc3QgaT1zLmluZGV4fHwwO2lmKGk8PW4mJmUubGFzdEluZGV4Pj1uKXJldHVybiBzO2lmKHI+MCYmaT5yKXJldHVybiBudWxsfXJldHVybiBudWxsfWNsYXNzIGthe3N0YXRpYyBjb21wdXRlVW5pY29kZUhpZ2hsaWdodHModCxuLHIpe2NvbnN0IHM9cj9yLnN0YXJ0TGluZU51bWJlcjoxLGk9cj9yLmVuZExpbmVOdW1iZXI6dC5nZXRMaW5lQ291bnQoKSxvPW5ldyBocyhuKSxsPW8uZ2V0Q2FuZGlkYXRlQ29kZVBvaW50cygpO2xldCB1O2w9PT0iYWxsTm9uQmFzaWNBc2NpaSI/dT1uZXcgUmVnRXhwKCJbXlxcdFxcblxcclxceDIwLVxceDdFXSIsImciKTp1PW5ldyBSZWdFeHAoYCR7UGEoQXJyYXkuZnJvbShsKSl9YCwiZyIpO2NvbnN0IGM9bmV3IEFhKG51bGwsdSksaD1bXTtsZXQgZj0hMSxkLG09MCxnPTAsYj0wO2U6Zm9yKGxldCBfPXMsdj1pO188PXY7XysrKXtjb25zdCBTPXQuZ2V0TGluZUNvbnRlbnQoXyksTj1TLmxlbmd0aDtjLnJlc2V0KDApO2RvIGlmKGQ9Yy5uZXh0KFMpLGQpe2xldCBwPWQuaW5kZXgseD1kLmluZGV4K2RbMF0ubGVuZ3RoO2lmKHA+MCl7Y29uc3QgQj1TLmNoYXJDb2RlQXQocC0xKTtRdChCKSYmcC0tfWlmKHgrMTxOKXtjb25zdCBCPVMuY2hhckNvZGVBdCh4LTEpO1F0KEIpJiZ4Kyt9Y29uc3QgTD1TLnN1YnN0cmluZyhwLHgpO2xldCBBPWduKHArMSxscyxTLDApO0EmJkEuZW5kQ29sdW1uPD1wKzEmJihBPW51bGwpO2NvbnN0IEU9by5zaG91bGRIaWdobGlnaHROb25CYXNpY0FTQ0lJKEwsQT9BLndvcmQ6bnVsbCk7aWYoRSE9PTApe2lmKEU9PT0zP20rKzpFPT09Mj9nKys6RT09PTE/YisrOlJhKCksaC5sZW5ndGg+PTFlMyl7Zj0hMDticmVhayBlfWgucHVzaChuZXcgayhfLHArMSxfLHgrMSkpfX13aGlsZShkKX1yZXR1cm57cmFuZ2VzOmgsaGFzTW9yZTpmLGFtYmlndW91c0NoYXJhY3RlckNvdW50Om0saW52aXNpYmxlQ2hhcmFjdGVyQ291bnQ6Zyxub25CYXNpY0FzY2lpQ2hhcmFjdGVyQ291bnQ6Yn19c3RhdGljIGNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0UmVhc29uKHQsbil7Y29uc3Qgcj1uZXcgaHMobik7c3dpdGNoKHIuc2hvdWxkSGlnaGxpZ2h0Tm9uQmFzaWNBU0NJSSh0LG51bGwpKXtjYXNlIDA6cmV0dXJuIG51bGw7Y2FzZSAyOnJldHVybntraW5kOjF9O2Nhc2UgMzp7Y29uc3QgaT10LmNvZGVQb2ludEF0KDApLG89ci5hbWJpZ3VvdXNDaGFyYWN0ZXJzLmdldFByaW1hcnlDb25mdXNhYmxlKGkpLGw9ZXQuZ2V0TG9jYWxlcygpLmZpbHRlcih1PT4hZXQuZ2V0SW5zdGFuY2UobmV3IFNldChbLi4ubi5hbGxvd2VkTG9jYWxlcyx1XSkpLmlzQW1iaWd1b3VzKGkpKTtyZXR1cm57a2luZDowLGNvbmZ1c2FibGVXaXRoOlN0cmluZy5mcm9tQ29kZVBvaW50KG8pLG5vdEFtYmlndW91c0luTG9jYWxlczpsfX1jYXNlIDE6cmV0dXJue2tpbmQ6Mn19fX1mdW5jdGlvbiBQYShlLHQpe3JldHVybmBbJHttaShlLm1hcChyPT5TdHJpbmcuZnJvbUNvZGVQb2ludChyKSkuam9pbigiIikpfV1gfWNsYXNzIGhze2NvbnN0cnVjdG9yKHQpe3RoaXMub3B0aW9ucz10LHRoaXMuYWxsb3dlZENvZGVQb2ludHM9bmV3IFNldCh0LmFsbG93ZWRDb2RlUG9pbnRzKSx0aGlzLmFtYmlndW91c0NoYXJhY3RlcnM9ZXQuZ2V0SW5zdGFuY2UobmV3IFNldCh0LmFsbG93ZWRMb2NhbGVzKSl9Z2V0Q2FuZGlkYXRlQ29kZVBvaW50cygpe2lmKHRoaXMub3B0aW9ucy5ub25CYXNpY0FTQ0lJKXJldHVybiJhbGxOb25CYXNpY0FzY2lpIjtjb25zdCB0PW5ldyBTZXQ7aWYodGhpcy5vcHRpb25zLmludmlzaWJsZUNoYXJhY3RlcnMpZm9yKGNvbnN0IG4gb2YgdHQuY29kZVBvaW50cylmcyhTdHJpbmcuZnJvbUNvZGVQb2ludChuKSl8fHQuYWRkKG4pO2lmKHRoaXMub3B0aW9ucy5hbWJpZ3VvdXNDaGFyYWN0ZXJzKWZvcihjb25zdCBuIG9mIHRoaXMuYW1iaWd1b3VzQ2hhcmFjdGVycy5nZXRDb25mdXNhYmxlQ29kZVBvaW50cygpKXQuYWRkKG4pO2Zvcihjb25zdCBuIG9mIHRoaXMuYWxsb3dlZENvZGVQb2ludHMpdC5kZWxldGUobik7cmV0dXJuIHR9c2hvdWxkSGlnaGxpZ2h0Tm9uQmFzaWNBU0NJSSh0LG4pe2NvbnN0IHI9dC5jb2RlUG9pbnRBdCgwKTtpZih0aGlzLmFsbG93ZWRDb2RlUG9pbnRzLmhhcyhyKSlyZXR1cm4gMDtpZih0aGlzLm9wdGlvbnMubm9uQmFzaWNBU0NJSSlyZXR1cm4gMTtsZXQgcz0hMSxpPSExO2lmKG4pZm9yKGNvbnN0IG8gb2Ygbil7Y29uc3QgbD1vLmNvZGVQb2ludEF0KDApLHU9dmkobyk7cz1zfHx1LCF1JiYhdGhpcy5hbWJpZ3VvdXNDaGFyYWN0ZXJzLmlzQW1iaWd1b3VzKGwpJiYhdHQuaXNJbnZpc2libGVDaGFyYWN0ZXIobCkmJihpPSEwKX1yZXR1cm4hcyYmaT8wOnRoaXMub3B0aW9ucy5pbnZpc2libGVDaGFyYWN0ZXJzJiYhZnModCkmJnR0LmlzSW52aXNpYmxlQ2hhcmFjdGVyKHIpPzI6dGhpcy5vcHRpb25zLmFtYmlndW91c0NoYXJhY3RlcnMmJnRoaXMuYW1iaWd1b3VzQ2hhcmFjdGVycy5pc0FtYmlndW91cyhyKT8zOjB9fWZ1bmN0aW9uIGZzKGUpe3JldHVybiBlPT09IiAifHxlPT09YApgfHxlPT09IgkifWNsYXNzIFN0e2NvbnN0cnVjdG9yKHQsbixyKXt0aGlzLmNoYW5nZXM9dCx0aGlzLm1vdmVzPW4sdGhpcy5oaXRUaW1lb3V0PXJ9fWNsYXNzIEZhe2NvbnN0cnVjdG9yKHQsbil7dGhpcy5saW5lUmFuZ2VNYXBwaW5nPXQsdGhpcy5jaGFuZ2VzPW59fWNsYXNzIFZ7c3RhdGljIGFkZFJhbmdlKHQsbil7bGV0IHI9MDtmb3IoO3I8bi5sZW5ndGgmJm5bcl0uZW5kRXhjbHVzaXZlPHQuc3RhcnQ7KXIrKztsZXQgcz1yO2Zvcig7czxuLmxlbmd0aCYmbltzXS5zdGFydDw9dC5lbmRFeGNsdXNpdmU7KXMrKztpZihyPT09cyluLnNwbGljZShyLDAsdCk7ZWxzZXtjb25zdCBpPU1hdGgubWluKHQuc3RhcnQsbltyXS5zdGFydCksbz1NYXRoLm1heCh0LmVuZEV4Y2x1c2l2ZSxuW3MtMV0uZW5kRXhjbHVzaXZlKTtuLnNwbGljZShyLHMtcixuZXcgVihpLG8pKX19c3RhdGljIHRyeUNyZWF0ZSh0LG4pe2lmKCEodD5uKSlyZXR1cm4gbmV3IFYodCxuKX1zdGF0aWMgb2ZMZW5ndGgodCl7cmV0dXJuIG5ldyBWKDAsdCl9c3RhdGljIG9mU3RhcnRBbmRMZW5ndGgodCxuKXtyZXR1cm4gbmV3IFYodCx0K24pfWNvbnN0cnVjdG9yKHQsbil7aWYodGhpcy5zdGFydD10LHRoaXMuZW5kRXhjbHVzaXZlPW4sdD5uKXRocm93IG5ldyBpZShgSW52YWxpZCByYW5nZTogJHt0aGlzLnRvU3RyaW5nKCl9YCl9Z2V0IGlzRW1wdHkoKXtyZXR1cm4gdGhpcy5zdGFydD09PXRoaXMuZW5kRXhjbHVzaXZlfWRlbHRhKHQpe3JldHVybiBuZXcgVih0aGlzLnN0YXJ0K3QsdGhpcy5lbmRFeGNsdXNpdmUrdCl9ZGVsdGFTdGFydCh0KXtyZXR1cm4gbmV3IFYodGhpcy5zdGFydCt0LHRoaXMuZW5kRXhjbHVzaXZlKX1kZWx0YUVuZCh0KXtyZXR1cm4gbmV3IFYodGhpcy5zdGFydCx0aGlzLmVuZEV4Y2x1c2l2ZSt0KX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuZW5kRXhjbHVzaXZlLXRoaXMuc3RhcnR9dG9TdHJpbmcoKXtyZXR1cm5gWyR7dGhpcy5zdGFydH0sICR7dGhpcy5lbmRFeGNsdXNpdmV9KWB9Y29udGFpbnModCl7cmV0dXJuIHRoaXMuc3RhcnQ8PXQmJnQ8dGhpcy5lbmRFeGNsdXNpdmV9am9pbih0KXtyZXR1cm4gbmV3IFYoTWF0aC5taW4odGhpcy5zdGFydCx0LnN0YXJ0KSxNYXRoLm1heCh0aGlzLmVuZEV4Y2x1c2l2ZSx0LmVuZEV4Y2x1c2l2ZSkpfWludGVyc2VjdCh0KXtjb25zdCBuPU1hdGgubWF4KHRoaXMuc3RhcnQsdC5zdGFydCkscj1NYXRoLm1pbih0aGlzLmVuZEV4Y2x1c2l2ZSx0LmVuZEV4Y2x1c2l2ZSk7aWYobjw9cilyZXR1cm4gbmV3IFYobixyKX1pbnRlcnNlY3RzKHQpe2NvbnN0IG49TWF0aC5tYXgodGhpcy5zdGFydCx0LnN0YXJ0KSxyPU1hdGgubWluKHRoaXMuZW5kRXhjbHVzaXZlLHQuZW5kRXhjbHVzaXZlKTtyZXR1cm4gbjxyfWlzQmVmb3JlKHQpe3JldHVybiB0aGlzLmVuZEV4Y2x1c2l2ZTw9dC5zdGFydH1pc0FmdGVyKHQpe3JldHVybiB0aGlzLnN0YXJ0Pj10LmVuZEV4Y2x1c2l2ZX1zbGljZSh0KXtyZXR1cm4gdC5zbGljZSh0aGlzLnN0YXJ0LHRoaXMuZW5kRXhjbHVzaXZlKX1zdWJzdHJpbmcodCl7cmV0dXJuIHQuc3Vic3RyaW5nKHRoaXMuc3RhcnQsdGhpcy5lbmRFeGNsdXNpdmUpfWNsaXAodCl7aWYodGhpcy5pc0VtcHR5KXRocm93IG5ldyBpZShgSW52YWxpZCBjbGlwcGluZyByYW5nZTogJHt0aGlzLnRvU3RyaW5nKCl9YCk7cmV0dXJuIE1hdGgubWF4KHRoaXMuc3RhcnQsTWF0aC5taW4odGhpcy5lbmRFeGNsdXNpdmUtMSx0KSl9Y2xpcEN5Y2xpYyh0KXtpZih0aGlzLmlzRW1wdHkpdGhyb3cgbmV3IGllKGBJbnZhbGlkIGNsaXBwaW5nIHJhbmdlOiAke3RoaXMudG9TdHJpbmcoKX1gKTtyZXR1cm4gdDx0aGlzLnN0YXJ0P3RoaXMuZW5kRXhjbHVzaXZlLSh0aGlzLnN0YXJ0LXQpJXRoaXMubGVuZ3RoOnQ+PXRoaXMuZW5kRXhjbHVzaXZlP3RoaXMuc3RhcnQrKHQtdGhpcy5zdGFydCkldGhpcy5sZW5ndGg6dH1mb3JFYWNoKHQpe2ZvcihsZXQgbj10aGlzLnN0YXJ0O248dGhpcy5lbmRFeGNsdXNpdmU7bisrKXQobil9fWZ1bmN0aW9uIFVlKGUsdCl7Y29uc3Qgbj1ydChlLHQpO3JldHVybiBuPT09LTE/dm9pZCAwOmVbbl19ZnVuY3Rpb24gcnQoZSx0LG49MCxyPWUubGVuZ3RoKXtsZXQgcz1uLGk9cjtmb3IoO3M8aTspe2NvbnN0IG89TWF0aC5mbG9vcigocytpKS8yKTt0KGVbb10pP3M9bysxOmk9b31yZXR1cm4gcy0xfWZ1bmN0aW9uIERhKGUsdCl7Y29uc3Qgbj1ibihlLHQpO3JldHVybiBuPT09ZS5sZW5ndGg/dm9pZCAwOmVbbl19ZnVuY3Rpb24gYm4oZSx0LG49MCxyPWUubGVuZ3RoKXtsZXQgcz1uLGk9cjtmb3IoO3M8aTspe2NvbnN0IG89TWF0aC5mbG9vcigocytpKS8yKTt0KGVbb10pP2k9bzpzPW8rMX1yZXR1cm4gc31jb25zdCBEdD1jbGFzcyBEdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9hcnJheT10LHRoaXMuX2ZpbmRMYXN0TW9ub3Rvbm91c0xhc3RJZHg9MH1maW5kTGFzdE1vbm90b25vdXModCl7aWYoRHQuYXNzZXJ0SW52YXJpYW50cyl7aWYodGhpcy5fcHJldkZpbmRMYXN0UHJlZGljYXRlKXtmb3IoY29uc3QgciBvZiB0aGlzLl9hcnJheSlpZih0aGlzLl9wcmV2RmluZExhc3RQcmVkaWNhdGUocikmJiF0KHIpKXRocm93IG5ldyBFcnJvcigiTW9ub3Rvbm91c0FycmF5OiBjdXJyZW50IHByZWRpY2F0ZSBtdXN0IGJlIHdlYWtlciB0aGFuIChvciBlcXVhbCB0bykgdGhlIHByZXZpb3VzIHByZWRpY2F0ZS4iKX10aGlzLl9wcmV2RmluZExhc3RQcmVkaWNhdGU9dH1jb25zdCBuPXJ0KHRoaXMuX2FycmF5LHQsdGhpcy5fZmluZExhc3RNb25vdG9ub3VzTGFzdElkeCk7cmV0dXJuIHRoaXMuX2ZpbmRMYXN0TW9ub3Rvbm91c0xhc3RJZHg9bisxLG49PT0tMT92b2lkIDA6dGhpcy5fYXJyYXlbbl19fTtEdC5hc3NlcnRJbnZhcmlhbnRzPSExO2xldCBDdD1EdDtjbGFzcyBEe3N0YXRpYyBmcm9tUmFuZ2VJbmNsdXNpdmUodCl7cmV0dXJuIG5ldyBEKHQuc3RhcnRMaW5lTnVtYmVyLHQuZW5kTGluZU51bWJlcisxKX1zdGF0aWMgam9pbk1hbnkodCl7aWYodC5sZW5ndGg9PT0wKXJldHVybltdO2xldCBuPW5ldyBnZSh0WzBdLnNsaWNlKCkpO2ZvcihsZXQgcj0xO3I8dC5sZW5ndGg7cisrKW49bi5nZXRVbmlvbihuZXcgZ2UodFtyXS5zbGljZSgpKSk7cmV0dXJuIG4ucmFuZ2VzfXN0YXRpYyBqb2luKHQpe2lmKHQubGVuZ3RoPT09MCl0aHJvdyBuZXcgaWUoImxpbmVSYW5nZXMgY2Fubm90IGJlIGVtcHR5Iik7bGV0IG49dFswXS5zdGFydExpbmVOdW1iZXIscj10WzBdLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU7Zm9yKGxldCBzPTE7czx0Lmxlbmd0aDtzKyspbj1NYXRoLm1pbihuLHRbc10uc3RhcnRMaW5lTnVtYmVyKSxyPU1hdGgubWF4KHIsdFtzXS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKTtyZXR1cm4gbmV3IEQobixyKX1zdGF0aWMgb2ZMZW5ndGgodCxuKXtyZXR1cm4gbmV3IEQodCx0K24pfXN0YXRpYyBkZXNlcmlhbGl6ZSh0KXtyZXR1cm4gbmV3IEQodFswXSx0WzFdKX1jb25zdHJ1Y3Rvcih0LG4pe2lmKHQ+bil0aHJvdyBuZXcgaWUoYHN0YXJ0TGluZU51bWJlciAke3R9IGNhbm5vdCBiZSBhZnRlciBlbmRMaW5lTnVtYmVyRXhjbHVzaXZlICR7bn1gKTt0aGlzLnN0YXJ0TGluZU51bWJlcj10LHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT1ufWNvbnRhaW5zKHQpe3JldHVybiB0aGlzLnN0YXJ0TGluZU51bWJlcjw9dCYmdDx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmV9Z2V0IGlzRW1wdHkoKXtyZXR1cm4gdGhpcy5zdGFydExpbmVOdW1iZXI9PT10aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmV9ZGVsdGEodCl7cmV0dXJuIG5ldyBEKHRoaXMuc3RhcnRMaW5lTnVtYmVyK3QsdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlK3QpfWRlbHRhTGVuZ3RoKHQpe3JldHVybiBuZXcgRCh0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUrdCl9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtdGhpcy5zdGFydExpbmVOdW1iZXJ9am9pbih0KXtyZXR1cm4gbmV3IEQoTWF0aC5taW4odGhpcy5zdGFydExpbmVOdW1iZXIsdC5zdGFydExpbmVOdW1iZXIpLE1hdGgubWF4KHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSx0LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpKX10b1N0cmluZygpe3JldHVybmBbJHt0aGlzLnN0YXJ0TGluZU51bWJlcn0sJHt0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmV9KWB9aW50ZXJzZWN0KHQpe2NvbnN0IG49TWF0aC5tYXgodGhpcy5zdGFydExpbmVOdW1iZXIsdC5zdGFydExpbmVOdW1iZXIpLHI9TWF0aC5taW4odGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSk7aWYobjw9cilyZXR1cm4gbmV3IEQobixyKX1pbnRlcnNlY3RzU3RyaWN0KHQpe3JldHVybiB0aGlzLnN0YXJ0TGluZU51bWJlcjx0LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUmJnQuc3RhcnRMaW5lTnVtYmVyPHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1vdmVybGFwT3JUb3VjaCh0KXtyZXR1cm4gdGhpcy5zdGFydExpbmVOdW1iZXI8PXQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSYmdC5zdGFydExpbmVOdW1iZXI8PXRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1lcXVhbHModCl7cmV0dXJuIHRoaXMuc3RhcnRMaW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXImJnRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT09PXQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX10b0luY2x1c2l2ZVJhbmdlKCl7cmV0dXJuIHRoaXMuaXNFbXB0eT9udWxsOm5ldyBrKHRoaXMuc3RhcnRMaW5lTnVtYmVyLDEsdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLTEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpfXRvRXhjbHVzaXZlUmFuZ2UoKXtyZXR1cm4gbmV3IGsodGhpcy5zdGFydExpbmVOdW1iZXIsMSx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsMSl9bWFwVG9MaW5lQXJyYXkodCl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9dGhpcy5zdGFydExpbmVOdW1iZXI7cjx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU7cisrKW4ucHVzaCh0KHIpKTtyZXR1cm4gbn1mb3JFYWNoKHQpe2ZvcihsZXQgbj10aGlzLnN0YXJ0TGluZU51bWJlcjtuPHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTtuKyspdChuKX1zZXJpYWxpemUoKXtyZXR1cm5bdGhpcy5zdGFydExpbmVOdW1iZXIsdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlXX1pbmNsdWRlcyh0KXtyZXR1cm4gdGhpcy5zdGFydExpbmVOdW1iZXI8PXQmJnQ8dGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlfXRvT2Zmc2V0UmFuZ2UoKXtyZXR1cm4gbmV3IFYodGhpcy5zdGFydExpbmVOdW1iZXItMSx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSl9fWNsYXNzIGdle2NvbnN0cnVjdG9yKHQ9W10pe3RoaXMuX25vcm1hbGl6ZWRSYW5nZXM9dH1nZXQgcmFuZ2VzKCl7cmV0dXJuIHRoaXMuX25vcm1hbGl6ZWRSYW5nZXN9YWRkUmFuZ2UodCl7aWYodC5sZW5ndGg9PT0wKXJldHVybjtjb25zdCBuPWJuKHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMscz0+cy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPj10LnN0YXJ0TGluZU51bWJlcikscj1ydCh0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLHM9PnMuc3RhcnRMaW5lTnVtYmVyPD10LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpKzE7aWYobj09PXIpdGhpcy5fbm9ybWFsaXplZFJhbmdlcy5zcGxpY2UobiwwLHQpO2Vsc2UgaWYobj09PXItMSl7Y29uc3Qgcz10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW25dO3RoaXMuX25vcm1hbGl6ZWRSYW5nZXNbbl09cy5qb2luKHQpfWVsc2V7Y29uc3Qgcz10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW25dLmpvaW4odGhpcy5fbm9ybWFsaXplZFJhbmdlc1tyLTFdKS5qb2luKHQpO3RoaXMuX25vcm1hbGl6ZWRSYW5nZXMuc3BsaWNlKG4sci1uLHMpfX1jb250YWlucyh0KXtjb25zdCBuPVVlKHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMscj0+ci5zdGFydExpbmVOdW1iZXI8PXQpO3JldHVybiEhbiYmbi5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPnR9aW50ZXJzZWN0cyh0KXtjb25zdCBuPVVlKHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMscj0+ci5zdGFydExpbmVOdW1iZXI8dC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKTtyZXR1cm4hIW4mJm4uZW5kTGluZU51bWJlckV4Y2x1c2l2ZT50LnN0YXJ0TGluZU51bWJlcn1nZXRVbmlvbih0KXtpZih0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aD09PTApcmV0dXJuIHQ7aWYodC5fbm9ybWFsaXplZFJhbmdlcy5sZW5ndGg9PT0wKXJldHVybiB0aGlzO2NvbnN0IG49W107bGV0IHI9MCxzPTAsaT1udWxsO2Zvcig7cjx0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aHx8czx0Ll9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aDspe2xldCBvPW51bGw7aWYocjx0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aCYmczx0Ll9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aCl7Y29uc3QgbD10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW3JdLHU9dC5fbm9ybWFsaXplZFJhbmdlc1tzXTtsLnN0YXJ0TGluZU51bWJlcjx1LnN0YXJ0TGluZU51bWJlcj8obz1sLHIrKyk6KG89dSxzKyspfWVsc2Ugcjx0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aD8obz10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW3JdLHIrKyk6KG89dC5fbm9ybWFsaXplZFJhbmdlc1tzXSxzKyspO2k9PT1udWxsP2k9bzppLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU+PW8uc3RhcnRMaW5lTnVtYmVyP2k9bmV3IEQoaS5zdGFydExpbmVOdW1iZXIsTWF0aC5tYXgoaS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLG8uZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkpOihuLnB1c2goaSksaT1vKX1yZXR1cm4gaSE9PW51bGwmJm4ucHVzaChpKSxuZXcgZ2Uobil9c3VidHJhY3RGcm9tKHQpe2NvbnN0IG49Ym4odGhpcy5fbm9ybWFsaXplZFJhbmdlcyxvPT5vLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU+PXQuc3RhcnRMaW5lTnVtYmVyKSxyPXJ0KHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMsbz0+by5zdGFydExpbmVOdW1iZXI8PXQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkrMTtpZihuPT09cilyZXR1cm4gbmV3IGdlKFt0XSk7Y29uc3Qgcz1bXTtsZXQgaT10LnN0YXJ0TGluZU51bWJlcjtmb3IobGV0IG89bjtvPHI7bysrKXtjb25zdCBsPXRoaXMuX25vcm1hbGl6ZWRSYW5nZXNbb107bC5zdGFydExpbmVOdW1iZXI+aSYmcy5wdXNoKG5ldyBEKGksbC5zdGFydExpbmVOdW1iZXIpKSxpPWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1yZXR1cm4gaTx0LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUmJnMucHVzaChuZXcgRChpLHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkpLG5ldyBnZShzKX10b1N0cmluZygpe3JldHVybiB0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLm1hcCh0PT50LnRvU3RyaW5nKCkpLmpvaW4oIiwgIil9Z2V0SW50ZXJzZWN0aW9uKHQpe2NvbnN0IG49W107bGV0IHI9MCxzPTA7Zm9yKDtyPHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoJiZzPHQuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoOyl7Y29uc3QgaT10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW3JdLG89dC5fbm9ybWFsaXplZFJhbmdlc1tzXSxsPWkuaW50ZXJzZWN0KG8pO2wmJiFsLmlzRW1wdHkmJm4ucHVzaChsKSxpLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU8by5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlP3IrKzpzKyt9cmV0dXJuIG5ldyBnZShuKX1nZXRXaXRoRGVsdGEodCl7cmV0dXJuIG5ldyBnZSh0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLm1hcChuPT5uLmRlbHRhKHQpKSl9fWNvbnN0IEVlPWNsYXNzIEVle3N0YXRpYyBiZXR3ZWVuUG9zaXRpb25zKHQsbil7cmV0dXJuIHQubGluZU51bWJlcj09PW4ubGluZU51bWJlcj9uZXcgRWUoMCxuLmNvbHVtbi10LmNvbHVtbik6bmV3IEVlKG4ubGluZU51bWJlci10LmxpbmVOdW1iZXIsbi5jb2x1bW4tMSl9c3RhdGljIG9mUmFuZ2UodCl7cmV0dXJuIEVlLmJldHdlZW5Qb3NpdGlvbnModC5nZXRTdGFydFBvc2l0aW9uKCksdC5nZXRFbmRQb3NpdGlvbigpKX1zdGF0aWMgb2ZUZXh0KHQpe2xldCBuPTAscj0wO2Zvcihjb25zdCBzIG9mIHQpcz09PWAKYD8obisrLHI9MCk6cisrO3JldHVybiBuZXcgRWUobixyKX1jb25zdHJ1Y3Rvcih0LG4pe3RoaXMubGluZUNvdW50PXQsdGhpcy5jb2x1bW5Db3VudD1ufWlzR3JlYXRlclRoYW5PckVxdWFsVG8odCl7cmV0dXJuIHRoaXMubGluZUNvdW50IT09dC5saW5lQ291bnQ/dGhpcy5saW5lQ291bnQ+dC5saW5lQ291bnQ6dGhpcy5jb2x1bW5Db3VudD49dC5jb2x1bW5Db3VudH1jcmVhdGVSYW5nZSh0KXtyZXR1cm4gdGhpcy5saW5lQ291bnQ9PT0wP25ldyBrKHQubGluZU51bWJlcix0LmNvbHVtbix0LmxpbmVOdW1iZXIsdC5jb2x1bW4rdGhpcy5jb2x1bW5Db3VudCk6bmV3IGsodC5saW5lTnVtYmVyLHQuY29sdW1uLHQubGluZU51bWJlcit0aGlzLmxpbmVDb3VudCx0aGlzLmNvbHVtbkNvdW50KzEpfWFkZFRvUG9zaXRpb24odCl7cmV0dXJuIHRoaXMubGluZUNvdW50PT09MD9uZXcgJCh0LmxpbmVOdW1iZXIsdC5jb2x1bW4rdGhpcy5jb2x1bW5Db3VudCk6bmV3ICQodC5saW5lTnVtYmVyK3RoaXMubGluZUNvdW50LHRoaXMuY29sdW1uQ291bnQrMSl9dG9TdHJpbmcoKXtyZXR1cm5gJHt0aGlzLmxpbmVDb3VudH0sJHt0aGlzLmNvbHVtbkNvdW50fWB9fTtFZS56ZXJvPW5ldyBFZSgwLDApO2xldCBkcz1FZTtjbGFzcyBUYXtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMucmFuZ2U9dCx0aGlzLnRleHQ9bn10b1NpbmdsZUVkaXRPcGVyYXRpb24oKXtyZXR1cm57cmFuZ2U6dGhpcy5yYW5nZSx0ZXh0OnRoaXMudGV4dH19fWNsYXNzIGxle3N0YXRpYyBpbnZlcnNlKHQsbixyKXtjb25zdCBzPVtdO2xldCBpPTEsbz0xO2Zvcihjb25zdCB1IG9mIHQpe2NvbnN0IGM9bmV3IGxlKG5ldyBEKGksdS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIpLG5ldyBEKG8sdS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIpKTtjLm1vZGlmaWVkLmlzRW1wdHl8fHMucHVzaChjKSxpPXUub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxvPXUubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1jb25zdCBsPW5ldyBsZShuZXcgRChpLG4rMSksbmV3IEQobyxyKzEpKTtyZXR1cm4gbC5tb2RpZmllZC5pc0VtcHR5fHxzLnB1c2gobCksc31zdGF0aWMgY2xpcCh0LG4scil7Y29uc3Qgcz1bXTtmb3IoY29uc3QgaSBvZiB0KXtjb25zdCBvPWkub3JpZ2luYWwuaW50ZXJzZWN0KG4pLGw9aS5tb2RpZmllZC5pbnRlcnNlY3Qocik7byYmIW8uaXNFbXB0eSYmbCYmIWwuaXNFbXB0eSYmcy5wdXNoKG5ldyBsZShvLGwpKX1yZXR1cm4gc31jb25zdHJ1Y3Rvcih0LG4pe3RoaXMub3JpZ2luYWw9dCx0aGlzLm1vZGlmaWVkPW59dG9TdHJpbmcoKXtyZXR1cm5geyR7dGhpcy5vcmlnaW5hbC50b1N0cmluZygpfS0+JHt0aGlzLm1vZGlmaWVkLnRvU3RyaW5nKCl9fWB9ZmxpcCgpe3JldHVybiBuZXcgbGUodGhpcy5tb2RpZmllZCx0aGlzLm9yaWdpbmFsKX1qb2luKHQpe3JldHVybiBuZXcgbGUodGhpcy5vcmlnaW5hbC5qb2luKHQub3JpZ2luYWwpLHRoaXMubW9kaWZpZWQuam9pbih0Lm1vZGlmaWVkKSl9dG9SYW5nZU1hcHBpbmcoKXtjb25zdCB0PXRoaXMub3JpZ2luYWwudG9JbmNsdXNpdmVSYW5nZSgpLG49dGhpcy5tb2RpZmllZC50b0luY2x1c2l2ZVJhbmdlKCk7aWYodCYmbilyZXR1cm4gbmV3IGRlKHQsbik7aWYodGhpcy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXI9PT0xfHx0aGlzLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcj09PTEpe2lmKCEodGhpcy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXI9PT0xJiZ0aGlzLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcj09PTEpKXRocm93IG5ldyBpZSgibm90IGEgdmFsaWQgZGlmZiIpO3JldHVybiBuZXcgZGUobmV3IGsodGhpcy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIsMSx0aGlzLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsMSksbmV3IGsodGhpcy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIsMSx0aGlzLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsMSkpfWVsc2UgcmV0dXJuIG5ldyBkZShuZXcgayh0aGlzLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlci0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLHRoaXMub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSxuZXcgayh0aGlzLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlci0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLHRoaXMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSl9dG9SYW5nZU1hcHBpbmcyKHQsbil7aWYobXModGhpcy5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLHQpJiZtcyh0aGlzLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsbikpcmV0dXJuIG5ldyBkZShuZXcgayh0aGlzLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlciwxLHRoaXMub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSwxKSxuZXcgayh0aGlzLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlciwxLHRoaXMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSwxKSk7aWYoIXRoaXMub3JpZ2luYWwuaXNFbXB0eSYmIXRoaXMubW9kaWZpZWQuaXNFbXB0eSlyZXR1cm4gbmV3IGRlKGsuZnJvbVBvc2l0aW9ucyhuZXcgJCh0aGlzLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlciwxKSwkZShuZXcgJCh0aGlzLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksdCkpLGsuZnJvbVBvc2l0aW9ucyhuZXcgJCh0aGlzLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlciwxKSwkZShuZXcgJCh0aGlzLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksbikpKTtpZih0aGlzLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcj4xJiZ0aGlzLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcj4xKXJldHVybiBuZXcgZGUoay5mcm9tUG9zaXRpb25zKCRlKG5ldyAkKHRoaXMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLTEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLHQpLCRlKG5ldyAkKHRoaXMub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSx0KSksay5mcm9tUG9zaXRpb25zKCRlKG5ldyAkKHRoaXMubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLTEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLG4pLCRlKG5ldyAkKHRoaXMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSxuKSkpO3Rocm93IG5ldyBpZX19ZnVuY3Rpb24gJGUoZSx0KXtpZihlLmxpbmVOdW1iZXI8MSlyZXR1cm4gbmV3ICQoMSwxKTtpZihlLmxpbmVOdW1iZXI+dC5sZW5ndGgpcmV0dXJuIG5ldyAkKHQubGVuZ3RoLHRbdC5sZW5ndGgtMV0ubGVuZ3RoKzEpO2NvbnN0IG49dFtlLmxpbmVOdW1iZXItMV07cmV0dXJuIGUuY29sdW1uPm4ubGVuZ3RoKzE/bmV3ICQoZS5saW5lTnVtYmVyLG4ubGVuZ3RoKzEpOmV9ZnVuY3Rpb24gbXMoZSx0KXtyZXR1cm4gZT49MSYmZTw9dC5sZW5ndGh9Y2xhc3MgX2UgZXh0ZW5kcyBsZXtzdGF0aWMgZnJvbVJhbmdlTWFwcGluZ3ModCl7Y29uc3Qgbj1ELmpvaW4odC5tYXAocz0+RC5mcm9tUmFuZ2VJbmNsdXNpdmUocy5vcmlnaW5hbFJhbmdlKSkpLHI9RC5qb2luKHQubWFwKHM9PkQuZnJvbVJhbmdlSW5jbHVzaXZlKHMubW9kaWZpZWRSYW5nZSkpKTtyZXR1cm4gbmV3IF9lKG4scix0KX1jb25zdHJ1Y3Rvcih0LG4scil7c3VwZXIodCxuKSx0aGlzLmlubmVyQ2hhbmdlcz1yfWZsaXAoKXt2YXIgdDtyZXR1cm4gbmV3IF9lKHRoaXMubW9kaWZpZWQsdGhpcy5vcmlnaW5hbCwodD10aGlzLmlubmVyQ2hhbmdlcyk9PW51bGw/dm9pZCAwOnQubWFwKG49Pm4uZmxpcCgpKSl9d2l0aElubmVyQ2hhbmdlc0Zyb21MaW5lUmFuZ2VzKCl7cmV0dXJuIG5ldyBfZSh0aGlzLm9yaWdpbmFsLHRoaXMubW9kaWZpZWQsW3RoaXMudG9SYW5nZU1hcHBpbmcoKV0pfX1jbGFzcyBkZXtzdGF0aWMgYXNzZXJ0U29ydGVkKHQpe2ZvcihsZXQgbj0xO248dC5sZW5ndGg7bisrKXtjb25zdCByPXRbbi0xXSxzPXRbbl07aWYoIShyLm9yaWdpbmFsUmFuZ2UuZ2V0RW5kUG9zaXRpb24oKS5pc0JlZm9yZU9yRXF1YWwocy5vcmlnaW5hbFJhbmdlLmdldFN0YXJ0UG9zaXRpb24oKSkmJnIubW9kaWZpZWRSYW5nZS5nZXRFbmRQb3NpdGlvbigpLmlzQmVmb3JlT3JFcXVhbChzLm1vZGlmaWVkUmFuZ2UuZ2V0U3RhcnRQb3NpdGlvbigpKSkpdGhyb3cgbmV3IGllKCJSYW5nZSBtYXBwaW5ncyBtdXN0IGJlIHNvcnRlZCIpfX1jb25zdHJ1Y3Rvcih0LG4pe3RoaXMub3JpZ2luYWxSYW5nZT10LHRoaXMubW9kaWZpZWRSYW5nZT1ufXRvU3RyaW5nKCl7cmV0dXJuYHske3RoaXMub3JpZ2luYWxSYW5nZS50b1N0cmluZygpfS0+JHt0aGlzLm1vZGlmaWVkUmFuZ2UudG9TdHJpbmcoKX19YH1mbGlwKCl7cmV0dXJuIG5ldyBkZSh0aGlzLm1vZGlmaWVkUmFuZ2UsdGhpcy5vcmlnaW5hbFJhbmdlKX10b1RleHRFZGl0KHQpe2NvbnN0IG49dC5nZXRWYWx1ZU9mUmFuZ2UodGhpcy5tb2RpZmllZFJhbmdlKTtyZXR1cm4gbmV3IFRhKHRoaXMub3JpZ2luYWxSYW5nZSxuKX19Y29uc3QgSWE9MztjbGFzcyBWYXtjb21wdXRlRGlmZih0LG4scil7dmFyIHU7Y29uc3QgaT1uZXcgVWEodCxuLHttYXhDb21wdXRhdGlvblRpbWU6ci5tYXhDb21wdXRhdGlvblRpbWVNcyxzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZTpyLmlnbm9yZVRyaW1XaGl0ZXNwYWNlLHNob3VsZENvbXB1dGVDaGFyQ2hhbmdlczohMCxzaG91bGRNYWtlUHJldHR5RGlmZjohMCxzaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzOiEwfSkuY29tcHV0ZURpZmYoKSxvPVtdO2xldCBsPW51bGw7Zm9yKGNvbnN0IGMgb2YgaS5jaGFuZ2VzKXtsZXQgaDtjLm9yaWdpbmFsRW5kTGluZU51bWJlcj09PTA/aD1uZXcgRChjLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyKzEsYy5vcmlnaW5hbFN0YXJ0TGluZU51bWJlcisxKTpoPW5ldyBEKGMub3JpZ2luYWxTdGFydExpbmVOdW1iZXIsYy5vcmlnaW5hbEVuZExpbmVOdW1iZXIrMSk7bGV0IGY7Yy5tb2RpZmllZEVuZExpbmVOdW1iZXI9PT0wP2Y9bmV3IEQoYy5tb2RpZmllZFN0YXJ0TGluZU51bWJlcisxLGMubW9kaWZpZWRTdGFydExpbmVOdW1iZXIrMSk6Zj1uZXcgRChjLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyLGMubW9kaWZpZWRFbmRMaW5lTnVtYmVyKzEpO2xldCBkPW5ldyBfZShoLGYsKHU9Yy5jaGFyQ2hhbmdlcyk9PW51bGw/dm9pZCAwOnUubWFwKG09Pm5ldyBkZShuZXcgayhtLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyLG0ub3JpZ2luYWxTdGFydENvbHVtbixtLm9yaWdpbmFsRW5kTGluZU51bWJlcixtLm9yaWdpbmFsRW5kQ29sdW1uKSxuZXcgayhtLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyLG0ubW9kaWZpZWRTdGFydENvbHVtbixtLm1vZGlmaWVkRW5kTGluZU51bWJlcixtLm1vZGlmaWVkRW5kQ29sdW1uKSkpKTtsJiYobC5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPT09ZC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXJ8fGwub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT09PWQub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyKSYmKGQ9bmV3IF9lKGwub3JpZ2luYWwuam9pbihkLm9yaWdpbmFsKSxsLm1vZGlmaWVkLmpvaW4oZC5tb2RpZmllZCksbC5pbm5lckNoYW5nZXMmJmQuaW5uZXJDaGFuZ2VzP2wuaW5uZXJDaGFuZ2VzLmNvbmNhdChkLmlubmVyQ2hhbmdlcyk6dm9pZCAwKSxvLnBvcCgpKSxvLnB1c2goZCksbD1kfXJldHVybiBOdCgoKT0+b3MobywoYyxoKT0+aC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItYy5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPT09aC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItYy5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlJiZjLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU8aC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXImJmMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTxoLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcikpLG5ldyBTdChvLFtdLGkucXVpdEVhcmx5KX19ZnVuY3Rpb24gZ3MoZSx0LG4scil7cmV0dXJuIG5ldyBSZShlLHQsbikuQ29tcHV0ZURpZmYocil9bGV0IGJzPWNsYXNze2NvbnN0cnVjdG9yKHQpe2NvbnN0IG49W10scj1bXTtmb3IobGV0IHM9MCxpPXQubGVuZ3RoO3M8aTtzKyspbltzXT14bih0W3NdLDEpLHJbc109cG4odFtzXSwxKTt0aGlzLmxpbmVzPXQsdGhpcy5fc3RhcnRDb2x1bW5zPW4sdGhpcy5fZW5kQ29sdW1ucz1yfWdldEVsZW1lbnRzKCl7Y29uc3QgdD1bXTtmb3IobGV0IG49MCxyPXRoaXMubGluZXMubGVuZ3RoO248cjtuKyspdFtuXT10aGlzLmxpbmVzW25dLnN1YnN0cmluZyh0aGlzLl9zdGFydENvbHVtbnNbbl0tMSx0aGlzLl9lbmRDb2x1bW5zW25dLTEpO3JldHVybiB0fWdldFN0cmljdEVsZW1lbnQodCl7cmV0dXJuIHRoaXMubGluZXNbdF19Z2V0U3RhcnRMaW5lTnVtYmVyKHQpe3JldHVybiB0KzF9Z2V0RW5kTGluZU51bWJlcih0KXtyZXR1cm4gdCsxfWNyZWF0ZUNoYXJTZXF1ZW5jZSh0LG4scil7Y29uc3Qgcz1bXSxpPVtdLG89W107bGV0IGw9MDtmb3IobGV0IHU9bjt1PD1yO3UrKyl7Y29uc3QgYz10aGlzLmxpbmVzW3VdLGg9dD90aGlzLl9zdGFydENvbHVtbnNbdV06MSxmPXQ/dGhpcy5fZW5kQ29sdW1uc1t1XTpjLmxlbmd0aCsxO2ZvcihsZXQgZD1oO2Q8ZjtkKyspc1tsXT1jLmNoYXJDb2RlQXQoZC0xKSxpW2xdPXUrMSxvW2xdPWQsbCsrOyF0JiZ1PHImJihzW2xdPTEwLGlbbF09dSsxLG9bbF09Yy5sZW5ndGgrMSxsKyspfXJldHVybiBuZXcgQmEocyxpLG8pfX07Y2xhc3MgQmF7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuX2NoYXJDb2Rlcz10LHRoaXMuX2xpbmVOdW1iZXJzPW4sdGhpcy5fY29sdW1ucz1yfXRvU3RyaW5nKCl7cmV0dXJuIlsiK3RoaXMuX2NoYXJDb2Rlcy5tYXAoKHQsbik9Pih0PT09MTA/IlxcbiI6U3RyaW5nLmZyb21DaGFyQ29kZSh0KSkrYC0oJHt0aGlzLl9saW5lTnVtYmVyc1tuXX0sJHt0aGlzLl9jb2x1bW5zW25dfSlgKS5qb2luKCIsICIpKyJdIn1fYXNzZXJ0SW5kZXgodCxuKXtpZih0PDB8fHQ+PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSWxsZWdhbCBpbmRleCIpfWdldEVsZW1lbnRzKCl7cmV0dXJuIHRoaXMuX2NoYXJDb2Rlc31nZXRTdGFydExpbmVOdW1iZXIodCl7cmV0dXJuIHQ+MCYmdD09PXRoaXMuX2xpbmVOdW1iZXJzLmxlbmd0aD90aGlzLmdldEVuZExpbmVOdW1iZXIodC0xKToodGhpcy5fYXNzZXJ0SW5kZXgodCx0aGlzLl9saW5lTnVtYmVycyksdGhpcy5fbGluZU51bWJlcnNbdF0pfWdldEVuZExpbmVOdW1iZXIodCl7cmV0dXJuIHQ9PT0tMT90aGlzLmdldFN0YXJ0TGluZU51bWJlcih0KzEpOih0aGlzLl9hc3NlcnRJbmRleCh0LHRoaXMuX2xpbmVOdW1iZXJzKSx0aGlzLl9jaGFyQ29kZXNbdF09PT0xMD90aGlzLl9saW5lTnVtYmVyc1t0XSsxOnRoaXMuX2xpbmVOdW1iZXJzW3RdKX1nZXRTdGFydENvbHVtbih0KXtyZXR1cm4gdD4wJiZ0PT09dGhpcy5fY29sdW1ucy5sZW5ndGg/dGhpcy5nZXRFbmRDb2x1bW4odC0xKToodGhpcy5fYXNzZXJ0SW5kZXgodCx0aGlzLl9jb2x1bW5zKSx0aGlzLl9jb2x1bW5zW3RdKX1nZXRFbmRDb2x1bW4odCl7cmV0dXJuIHQ9PT0tMT90aGlzLmdldFN0YXJ0Q29sdW1uKHQrMSk6KHRoaXMuX2Fzc2VydEluZGV4KHQsdGhpcy5fY29sdW1ucyksdGhpcy5fY2hhckNvZGVzW3RdPT09MTA/MTp0aGlzLl9jb2x1bW5zW3RdKzEpfX1jbGFzcyBIZXtjb25zdHJ1Y3Rvcih0LG4scixzLGksbyxsLHUpe3RoaXMub3JpZ2luYWxTdGFydExpbmVOdW1iZXI9dCx0aGlzLm9yaWdpbmFsU3RhcnRDb2x1bW49bix0aGlzLm9yaWdpbmFsRW5kTGluZU51bWJlcj1yLHRoaXMub3JpZ2luYWxFbmRDb2x1bW49cyx0aGlzLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyPWksdGhpcy5tb2RpZmllZFN0YXJ0Q29sdW1uPW8sdGhpcy5tb2RpZmllZEVuZExpbmVOdW1iZXI9bCx0aGlzLm1vZGlmaWVkRW5kQ29sdW1uPXV9c3RhdGljIGNyZWF0ZUZyb21EaWZmQ2hhbmdlKHQsbixyKXtjb25zdCBzPW4uZ2V0U3RhcnRMaW5lTnVtYmVyKHQub3JpZ2luYWxTdGFydCksaT1uLmdldFN0YXJ0Q29sdW1uKHQub3JpZ2luYWxTdGFydCksbz1uLmdldEVuZExpbmVOdW1iZXIodC5vcmlnaW5hbFN0YXJ0K3Qub3JpZ2luYWxMZW5ndGgtMSksbD1uLmdldEVuZENvbHVtbih0Lm9yaWdpbmFsU3RhcnQrdC5vcmlnaW5hbExlbmd0aC0xKSx1PXIuZ2V0U3RhcnRMaW5lTnVtYmVyKHQubW9kaWZpZWRTdGFydCksYz1yLmdldFN0YXJ0Q29sdW1uKHQubW9kaWZpZWRTdGFydCksaD1yLmdldEVuZExpbmVOdW1iZXIodC5tb2RpZmllZFN0YXJ0K3QubW9kaWZpZWRMZW5ndGgtMSksZj1yLmdldEVuZENvbHVtbih0Lm1vZGlmaWVkU3RhcnQrdC5tb2RpZmllZExlbmd0aC0xKTtyZXR1cm4gbmV3IEhlKHMsaSxvLGwsdSxjLGgsZil9fWZ1bmN0aW9uIHFhKGUpe2lmKGUubGVuZ3RoPD0xKXJldHVybiBlO2NvbnN0IHQ9W2VbMF1dO2xldCBuPXRbMF07Zm9yKGxldCByPTEscz1lLmxlbmd0aDtyPHM7cisrKXtjb25zdCBpPWVbcl0sbz1pLm9yaWdpbmFsU3RhcnQtKG4ub3JpZ2luYWxTdGFydCtuLm9yaWdpbmFsTGVuZ3RoKSxsPWkubW9kaWZpZWRTdGFydC0obi5tb2RpZmllZFN0YXJ0K24ubW9kaWZpZWRMZW5ndGgpO01hdGgubWluKG8sbCk8SWE/KG4ub3JpZ2luYWxMZW5ndGg9aS5vcmlnaW5hbFN0YXJ0K2kub3JpZ2luYWxMZW5ndGgtbi5vcmlnaW5hbFN0YXJ0LG4ubW9kaWZpZWRMZW5ndGg9aS5tb2RpZmllZFN0YXJ0K2kubW9kaWZpZWRMZW5ndGgtbi5tb2RpZmllZFN0YXJ0KToodC5wdXNoKGkpLG49aSl9cmV0dXJuIHR9Y2xhc3Mgc3R7Y29uc3RydWN0b3IodCxuLHIscyxpKXt0aGlzLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyPXQsdGhpcy5vcmlnaW5hbEVuZExpbmVOdW1iZXI9bix0aGlzLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyPXIsdGhpcy5tb2RpZmllZEVuZExpbmVOdW1iZXI9cyx0aGlzLmNoYXJDaGFuZ2VzPWl9c3RhdGljIGNyZWF0ZUZyb21EaWZmUmVzdWx0KHQsbixyLHMsaSxvLGwpe2xldCB1LGMsaCxmLGQ7aWYobi5vcmlnaW5hbExlbmd0aD09PTA/KHU9ci5nZXRTdGFydExpbmVOdW1iZXIobi5vcmlnaW5hbFN0YXJ0KS0xLGM9MCk6KHU9ci5nZXRTdGFydExpbmVOdW1iZXIobi5vcmlnaW5hbFN0YXJ0KSxjPXIuZ2V0RW5kTGluZU51bWJlcihuLm9yaWdpbmFsU3RhcnQrbi5vcmlnaW5hbExlbmd0aC0xKSksbi5tb2RpZmllZExlbmd0aD09PTA/KGg9cy5nZXRTdGFydExpbmVOdW1iZXIobi5tb2RpZmllZFN0YXJ0KS0xLGY9MCk6KGg9cy5nZXRTdGFydExpbmVOdW1iZXIobi5tb2RpZmllZFN0YXJ0KSxmPXMuZ2V0RW5kTGluZU51bWJlcihuLm1vZGlmaWVkU3RhcnQrbi5tb2RpZmllZExlbmd0aC0xKSksbyYmbi5vcmlnaW5hbExlbmd0aD4wJiZuLm9yaWdpbmFsTGVuZ3RoPDIwJiZuLm1vZGlmaWVkTGVuZ3RoPjAmJm4ubW9kaWZpZWRMZW5ndGg8MjAmJmkoKSl7Y29uc3QgbT1yLmNyZWF0ZUNoYXJTZXF1ZW5jZSh0LG4ub3JpZ2luYWxTdGFydCxuLm9yaWdpbmFsU3RhcnQrbi5vcmlnaW5hbExlbmd0aC0xKSxnPXMuY3JlYXRlQ2hhclNlcXVlbmNlKHQsbi5tb2RpZmllZFN0YXJ0LG4ubW9kaWZpZWRTdGFydCtuLm1vZGlmaWVkTGVuZ3RoLTEpO2lmKG0uZ2V0RWxlbWVudHMoKS5sZW5ndGg+MCYmZy5nZXRFbGVtZW50cygpLmxlbmd0aD4wKXtsZXQgYj1ncyhtLGcsaSwhMCkuY2hhbmdlcztsJiYoYj1xYShiKSksZD1bXTtmb3IobGV0IF89MCx2PWIubGVuZ3RoO188djtfKyspZC5wdXNoKEhlLmNyZWF0ZUZyb21EaWZmQ2hhbmdlKGJbX10sbSxnKSl9fXJldHVybiBuZXcgc3QodSxjLGgsZixkKX19Y2xhc3MgVWF7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzPXIuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzLHRoaXMuc2hvdWxkUG9zdFByb2Nlc3NDaGFyQ2hhbmdlcz1yLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMsdGhpcy5zaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZT1yLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLHRoaXMuc2hvdWxkTWFrZVByZXR0eURpZmY9ci5zaG91bGRNYWtlUHJldHR5RGlmZix0aGlzLm9yaWdpbmFsTGluZXM9dCx0aGlzLm1vZGlmaWVkTGluZXM9bix0aGlzLm9yaWdpbmFsPW5ldyBicyh0KSx0aGlzLm1vZGlmaWVkPW5ldyBicyhuKSx0aGlzLmNvbnRpbnVlTGluZURpZmY9eHMoci5tYXhDb21wdXRhdGlvblRpbWUpLHRoaXMuY29udGludWVDaGFyRGlmZj14cyhyLm1heENvbXB1dGF0aW9uVGltZT09PTA/MDpNYXRoLm1pbihyLm1heENvbXB1dGF0aW9uVGltZSw1ZTMpKX1jb21wdXRlRGlmZigpe2lmKHRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoPT09MSYmdGhpcy5vcmlnaW5hbC5saW5lc1swXS5sZW5ndGg9PT0wKXJldHVybiB0aGlzLm1vZGlmaWVkLmxpbmVzLmxlbmd0aD09PTEmJnRoaXMubW9kaWZpZWQubGluZXNbMF0ubGVuZ3RoPT09MD97cXVpdEVhcmx5OiExLGNoYW5nZXM6W119OntxdWl0RWFybHk6ITEsY2hhbmdlczpbe29yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOjEsb3JpZ2luYWxFbmRMaW5lTnVtYmVyOjEsbW9kaWZpZWRTdGFydExpbmVOdW1iZXI6MSxtb2RpZmllZEVuZExpbmVOdW1iZXI6dGhpcy5tb2RpZmllZC5saW5lcy5sZW5ndGgsY2hhckNoYW5nZXM6dm9pZCAwfV19O2lmKHRoaXMubW9kaWZpZWQubGluZXMubGVuZ3RoPT09MSYmdGhpcy5tb2RpZmllZC5saW5lc1swXS5sZW5ndGg9PT0wKXJldHVybntxdWl0RWFybHk6ITEsY2hhbmdlczpbe29yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOjEsb3JpZ2luYWxFbmRMaW5lTnVtYmVyOnRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoLG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyOjEsbW9kaWZpZWRFbmRMaW5lTnVtYmVyOjEsY2hhckNoYW5nZXM6dm9pZCAwfV19O2NvbnN0IHQ9Z3ModGhpcy5vcmlnaW5hbCx0aGlzLm1vZGlmaWVkLHRoaXMuY29udGludWVMaW5lRGlmZix0aGlzLnNob3VsZE1ha2VQcmV0dHlEaWZmKSxuPXQuY2hhbmdlcyxyPXQucXVpdEVhcmx5O2lmKHRoaXMuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2Upe2NvbnN0IGw9W107Zm9yKGxldCB1PTAsYz1uLmxlbmd0aDt1PGM7dSsrKWwucHVzaChzdC5jcmVhdGVGcm9tRGlmZlJlc3VsdCh0aGlzLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLG5bdV0sdGhpcy5vcmlnaW5hbCx0aGlzLm1vZGlmaWVkLHRoaXMuY29udGludWVDaGFyRGlmZix0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyx0aGlzLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMpKTtyZXR1cm57cXVpdEVhcmx5OnIsY2hhbmdlczpsfX1jb25zdCBzPVtdO2xldCBpPTAsbz0wO2ZvcihsZXQgbD0tMSx1PW4ubGVuZ3RoO2w8dTtsKyspe2NvbnN0IGM9bCsxPHU/bltsKzFdOm51bGwsaD1jP2Mub3JpZ2luYWxTdGFydDp0aGlzLm9yaWdpbmFsTGluZXMubGVuZ3RoLGY9Yz9jLm1vZGlmaWVkU3RhcnQ6dGhpcy5tb2RpZmllZExpbmVzLmxlbmd0aDtmb3IoO2k8aCYmbzxmOyl7Y29uc3QgZD10aGlzLm9yaWdpbmFsTGluZXNbaV0sbT10aGlzLm1vZGlmaWVkTGluZXNbb107aWYoZCE9PW0pe3tsZXQgZz14bihkLDEpLGI9eG4obSwxKTtmb3IoO2c+MSYmYj4xOyl7Y29uc3QgXz1kLmNoYXJDb2RlQXQoZy0yKSx2PW0uY2hhckNvZGVBdChiLTIpO2lmKF8hPT12KWJyZWFrO2ctLSxiLS19KGc+MXx8Yj4xKSYmdGhpcy5fcHVzaFRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZShzLGkrMSwxLGcsbysxLDEsYil9e2xldCBnPXBuKGQsMSksYj1wbihtLDEpO2NvbnN0IF89ZC5sZW5ndGgrMSx2PW0ubGVuZ3RoKzE7Zm9yKDtnPF8mJmI8djspe2NvbnN0IFM9ZC5jaGFyQ29kZUF0KGctMSksTj1kLmNoYXJDb2RlQXQoYi0xKTtpZihTIT09TilicmVhaztnKyssYisrfShnPF98fGI8dikmJnRoaXMuX3B1c2hUcmltV2hpdGVzcGFjZUNoYXJDaGFuZ2UocyxpKzEsZyxfLG8rMSxiLHYpfX1pKyssbysrfWMmJihzLnB1c2goc3QuY3JlYXRlRnJvbURpZmZSZXN1bHQodGhpcy5zaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSxjLHRoaXMub3JpZ2luYWwsdGhpcy5tb2RpZmllZCx0aGlzLmNvbnRpbnVlQ2hhckRpZmYsdGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMsdGhpcy5zaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzKSksaSs9Yy5vcmlnaW5hbExlbmd0aCxvKz1jLm1vZGlmaWVkTGVuZ3RoKX1yZXR1cm57cXVpdEVhcmx5OnIsY2hhbmdlczpzfX1fcHVzaFRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZSh0LG4scixzLGksbyxsKXtpZih0aGlzLl9tZXJnZVRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZSh0LG4scixzLGksbyxsKSlyZXR1cm47bGV0IHU7dGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMmJih1PVtuZXcgSGUobixyLG4scyxpLG8saSxsKV0pLHQucHVzaChuZXcgc3QobixuLGksaSx1KSl9X21lcmdlVHJpbVdoaXRlc3BhY2VDaGFyQ2hhbmdlKHQsbixyLHMsaSxvLGwpe2NvbnN0IHU9dC5sZW5ndGg7aWYodT09PTApcmV0dXJuITE7Y29uc3QgYz10W3UtMV07cmV0dXJuIGMub3JpZ2luYWxFbmRMaW5lTnVtYmVyPT09MHx8Yy5tb2RpZmllZEVuZExpbmVOdW1iZXI9PT0wPyExOmMub3JpZ2luYWxFbmRMaW5lTnVtYmVyPT09biYmYy5tb2RpZmllZEVuZExpbmVOdW1iZXI9PT1pPyh0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyYmYy5jaGFyQ2hhbmdlcyYmYy5jaGFyQ2hhbmdlcy5wdXNoKG5ldyBIZShuLHIsbixzLGksbyxpLGwpKSwhMCk6Yy5vcmlnaW5hbEVuZExpbmVOdW1iZXIrMT09PW4mJmMubW9kaWZpZWRFbmRMaW5lTnVtYmVyKzE9PT1pPyhjLm9yaWdpbmFsRW5kTGluZU51bWJlcj1uLGMubW9kaWZpZWRFbmRMaW5lTnVtYmVyPWksdGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMmJmMuY2hhckNoYW5nZXMmJmMuY2hhckNoYW5nZXMucHVzaChuZXcgSGUobixyLG4scyxpLG8saSxsKSksITApOiExfX1mdW5jdGlvbiB4bihlLHQpe2NvbnN0IG49YmkoZSk7cmV0dXJuIG49PT0tMT90Om4rMX1mdW5jdGlvbiBwbihlLHQpe2NvbnN0IG49eGkoZSk7cmV0dXJuIG49PT0tMT90Om4rMn1mdW5jdGlvbiB4cyhlKXtpZihlPT09MClyZXR1cm4oKT0+ITA7Y29uc3QgdD1EYXRlLm5vdygpO3JldHVybigpPT5EYXRlLm5vdygpLXQ8ZX1mdW5jdGlvbiAkYShlLHQsbj0ocixzKT0+cj09PXMpe2lmKGU9PT10KXJldHVybiEwO2lmKCFlfHwhdHx8ZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IHI9MCxzPWUubGVuZ3RoO3I8cztyKyspaWYoIW4oZVtyXSx0W3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbipIYShlLHQpe2xldCBuLHI7Zm9yKGNvbnN0IHMgb2YgZSlyIT09dm9pZCAwJiZ0KHIscyk/bi5wdXNoKHMpOihuJiYoeWllbGQgbiksbj1bc10pLHI9cztuJiYoeWllbGQgbil9ZnVuY3Rpb24gV2EoZSx0KXtmb3IobGV0IG49MDtuPD1lLmxlbmd0aDtuKyspdChuPT09MD92b2lkIDA6ZVtuLTFdLG49PT1lLmxlbmd0aD92b2lkIDA6ZVtuXSl9ZnVuY3Rpb24gemEoZSx0KXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0KG49PT0wP3ZvaWQgMDplW24tMV0sZVtuXSxuKzE9PT1lLmxlbmd0aD92b2lkIDA6ZVtuKzFdKX1mdW5jdGlvbiBPYShlLHQpe2Zvcihjb25zdCBuIG9mIHQpZS5wdXNoKG4pfXZhciBfbjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChpKXtyZXR1cm4gaTwwfWUuaXNMZXNzVGhhbj10O2Z1bmN0aW9uIG4oaSl7cmV0dXJuIGk8PTB9ZS5pc0xlc3NUaGFuT3JFcXVhbD1uO2Z1bmN0aW9uIHIoaSl7cmV0dXJuIGk+MH1lLmlzR3JlYXRlclRoYW49cjtmdW5jdGlvbiBzKGkpe3JldHVybiBpPT09MH1lLmlzTmVpdGhlckxlc3NPckdyZWF0ZXJUaGFuPXMsZS5ncmVhdGVyVGhhbj0xLGUubGVzc1RoYW49LTEsZS5uZWl0aGVyTGVzc09yR3JlYXRlclRoYW49MH0pKF9ufHwoX249e30pKTtmdW5jdGlvbiBBdChlLHQpe3JldHVybihuLHIpPT50KGUobiksZShyKSl9Y29uc3QgUnQ9KGUsdCk9PmUtdDtmdW5jdGlvbiBHYShlKXtyZXR1cm4odCxuKT0+LWUodCxuKX1jb25zdCBRZT1jbGFzcyBRZXtjb25zdHJ1Y3Rvcih0KXt0aGlzLml0ZXJhdGU9dH10b0FycmF5KCl7Y29uc3QgdD1bXTtyZXR1cm4gdGhpcy5pdGVyYXRlKG49Pih0LnB1c2gobiksITApKSx0fWZpbHRlcih0KXtyZXR1cm4gbmV3IFFlKG49PnRoaXMuaXRlcmF0ZShyPT50KHIpP24ocik6ITApKX1tYXAodCl7cmV0dXJuIG5ldyBRZShuPT50aGlzLml0ZXJhdGUocj0+bih0KHIpKSkpfWZpbmRMYXN0KHQpe2xldCBuO3JldHVybiB0aGlzLml0ZXJhdGUocj0+KHQocikmJihuPXIpLCEwKSksbn1maW5kTGFzdE1heEJ5KHQpe2xldCBuLHI9ITA7cmV0dXJuIHRoaXMuaXRlcmF0ZShzPT4oKHJ8fF9uLmlzR3JlYXRlclRoYW4odChzLG4pKSkmJihyPSExLG49cyksITApKSxufX07UWUuZW1wdHk9bmV3IFFlKHQ9Pnt9KTtsZXQgcHM9UWU7Y2xhc3Mgd2V7c3RhdGljIHRyaXZpYWwodCxuKXtyZXR1cm4gbmV3IHdlKFtuZXcgRyhWLm9mTGVuZ3RoKHQubGVuZ3RoKSxWLm9mTGVuZ3RoKG4ubGVuZ3RoKSldLCExKX1zdGF0aWMgdHJpdmlhbFRpbWVkT3V0KHQsbil7cmV0dXJuIG5ldyB3ZShbbmV3IEcoVi5vZkxlbmd0aCh0Lmxlbmd0aCksVi5vZkxlbmd0aChuLmxlbmd0aCkpXSwhMCl9Y29uc3RydWN0b3IodCxuKXt0aGlzLmRpZmZzPXQsdGhpcy5oaXRUaW1lb3V0PW59fWNsYXNzIEd7c3RhdGljIGludmVydCh0LG4pe2NvbnN0IHI9W107cmV0dXJuIFdhKHQsKHMsaSk9PntyLnB1c2goRy5mcm9tT2Zmc2V0UGFpcnMocz9zLmdldEVuZEV4Y2x1c2l2ZXMoKTpMZS56ZXJvLGk/aS5nZXRTdGFydHMoKTpuZXcgTGUobiwocz9zLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUtcy5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlOjApK24pKSl9KSxyfXN0YXRpYyBmcm9tT2Zmc2V0UGFpcnModCxuKXtyZXR1cm4gbmV3IEcobmV3IFYodC5vZmZzZXQxLG4ub2Zmc2V0MSksbmV3IFYodC5vZmZzZXQyLG4ub2Zmc2V0MikpfXN0YXRpYyBhc3NlcnRTb3J0ZWQodCl7bGV0IG47Zm9yKGNvbnN0IHIgb2YgdCl7aWYobiYmIShuLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmU8PXIuc2VxMVJhbmdlLnN0YXJ0JiZuLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmU8PXIuc2VxMlJhbmdlLnN0YXJ0KSl0aHJvdyBuZXcgaWUoIlNlcXVlbmNlIGRpZmZzIG11c3QgYmUgc29ydGVkIik7bj1yfX1jb25zdHJ1Y3Rvcih0LG4pe3RoaXMuc2VxMVJhbmdlPXQsdGhpcy5zZXEyUmFuZ2U9bn1zd2FwKCl7cmV0dXJuIG5ldyBHKHRoaXMuc2VxMlJhbmdlLHRoaXMuc2VxMVJhbmdlKX10b1N0cmluZygpe3JldHVybmAke3RoaXMuc2VxMVJhbmdlfSA8LT4gJHt0aGlzLnNlcTJSYW5nZX1gfWpvaW4odCl7cmV0dXJuIG5ldyBHKHRoaXMuc2VxMVJhbmdlLmpvaW4odC5zZXExUmFuZ2UpLHRoaXMuc2VxMlJhbmdlLmpvaW4odC5zZXEyUmFuZ2UpKX1kZWx0YSh0KXtyZXR1cm4gdD09PTA/dGhpczpuZXcgRyh0aGlzLnNlcTFSYW5nZS5kZWx0YSh0KSx0aGlzLnNlcTJSYW5nZS5kZWx0YSh0KSl9ZGVsdGFTdGFydCh0KXtyZXR1cm4gdD09PTA/dGhpczpuZXcgRyh0aGlzLnNlcTFSYW5nZS5kZWx0YVN0YXJ0KHQpLHRoaXMuc2VxMlJhbmdlLmRlbHRhU3RhcnQodCkpfWRlbHRhRW5kKHQpe3JldHVybiB0PT09MD90aGlzOm5ldyBHKHRoaXMuc2VxMVJhbmdlLmRlbHRhRW5kKHQpLHRoaXMuc2VxMlJhbmdlLmRlbHRhRW5kKHQpKX1pbnRlcnNlY3QodCl7Y29uc3Qgbj10aGlzLnNlcTFSYW5nZS5pbnRlcnNlY3QodC5zZXExUmFuZ2UpLHI9dGhpcy5zZXEyUmFuZ2UuaW50ZXJzZWN0KHQuc2VxMlJhbmdlKTtpZighKCFufHwhcikpcmV0dXJuIG5ldyBHKG4scil9Z2V0U3RhcnRzKCl7cmV0dXJuIG5ldyBMZSh0aGlzLnNlcTFSYW5nZS5zdGFydCx0aGlzLnNlcTJSYW5nZS5zdGFydCl9Z2V0RW5kRXhjbHVzaXZlcygpe3JldHVybiBuZXcgTGUodGhpcy5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlLHRoaXMuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZSl9fWNvbnN0IE1lPWNsYXNzIE1le2NvbnN0cnVjdG9yKHQsbil7dGhpcy5vZmZzZXQxPXQsdGhpcy5vZmZzZXQyPW59dG9TdHJpbmcoKXtyZXR1cm5gJHt0aGlzLm9mZnNldDF9IDwtPiAke3RoaXMub2Zmc2V0Mn1gfWRlbHRhKHQpe3JldHVybiB0PT09MD90aGlzOm5ldyBNZSh0aGlzLm9mZnNldDErdCx0aGlzLm9mZnNldDIrdCl9ZXF1YWxzKHQpe3JldHVybiB0aGlzLm9mZnNldDE9PT10Lm9mZnNldDEmJnRoaXMub2Zmc2V0Mj09PXQub2Zmc2V0Mn19O01lLnplcm89bmV3IE1lKDAsMCksTWUubWF4PW5ldyBNZShOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7bGV0IExlPU1lO2NvbnN0IFR0PWNsYXNzIFR0e2lzVmFsaWQoKXtyZXR1cm4hMH19O1R0Lmluc3RhbmNlPW5ldyBUdDtsZXQgaXQ9VHQ7Y2xhc3MgamF7Y29uc3RydWN0b3IodCl7aWYodGhpcy50aW1lb3V0PXQsdGhpcy5zdGFydFRpbWU9RGF0ZS5ub3coKSx0aGlzLnZhbGlkPSEwLHQ8PTApdGhyb3cgbmV3IGllKCJ0aW1lb3V0IG11c3QgYmUgcG9zaXRpdmUiKX1pc1ZhbGlkKCl7aWYoIShEYXRlLm5vdygpLXRoaXMuc3RhcnRUaW1lPHRoaXMudGltZW91dCkmJnRoaXMudmFsaWQpe3RoaXMudmFsaWQ9ITE7ZGVidWdnZXJ9cmV0dXJuIHRoaXMudmFsaWR9fWNsYXNzIHdue2NvbnN0cnVjdG9yKHQsbil7dGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PW4sdGhpcy5hcnJheT1bXSx0aGlzLmFycmF5PW5ldyBBcnJheSh0Km4pfWdldCh0LG4pe3JldHVybiB0aGlzLmFycmF5W3Qrbip0aGlzLndpZHRoXX1zZXQodCxuLHIpe3RoaXMuYXJyYXlbdCtuKnRoaXMud2lkdGhdPXJ9fWZ1bmN0aW9uIExuKGUpe3JldHVybiBlPT09MzJ8fGU9PT05fWNvbnN0IGN0PWNsYXNzIGN0e3N0YXRpYyBnZXRLZXkodCl7bGV0IG49dGhpcy5jaHJLZXlzLmdldCh0KTtyZXR1cm4gbj09PXZvaWQgMCYmKG49dGhpcy5jaHJLZXlzLnNpemUsdGhpcy5jaHJLZXlzLnNldCh0LG4pKSxufWNvbnN0cnVjdG9yKHQsbixyKXt0aGlzLnJhbmdlPXQsdGhpcy5saW5lcz1uLHRoaXMuc291cmNlPXIsdGhpcy5oaXN0b2dyYW09W107bGV0IHM9MDtmb3IobGV0IGk9dC5zdGFydExpbmVOdW1iZXItMTtpPHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xO2krKyl7Y29uc3Qgbz1uW2ldO2ZvcihsZXQgdT0wO3U8by5sZW5ndGg7dSsrKXtzKys7Y29uc3QgYz1vW3VdLGg9Y3QuZ2V0S2V5KGMpO3RoaXMuaGlzdG9ncmFtW2hdPSh0aGlzLmhpc3RvZ3JhbVtoXXx8MCkrMX1zKys7Y29uc3QgbD1jdC5nZXRLZXkoYApgKTt0aGlzLmhpc3RvZ3JhbVtsXT0odGhpcy5oaXN0b2dyYW1bbF18fDApKzF9dGhpcy50b3RhbENvdW50PXN9Y29tcHV0ZVNpbWlsYXJpdHkodCl7bGV0IG49MDtjb25zdCByPU1hdGgubWF4KHRoaXMuaGlzdG9ncmFtLmxlbmd0aCx0Lmhpc3RvZ3JhbS5sZW5ndGgpO2ZvcihsZXQgcz0wO3M8cjtzKyspbis9TWF0aC5hYnMoKHRoaXMuaGlzdG9ncmFtW3NdPz8wKS0odC5oaXN0b2dyYW1bc10/PzApKTtyZXR1cm4gMS1uLyh0aGlzLnRvdGFsQ291bnQrdC50b3RhbENvdW50KX19O2N0LmNocktleXM9bmV3IE1hcDtsZXQgeXQ9Y3Q7Y2xhc3MgWGF7Y29tcHV0ZSh0LG4scj1pdC5pbnN0YW5jZSxzKXtpZih0Lmxlbmd0aD09PTB8fG4ubGVuZ3RoPT09MClyZXR1cm4gd2UudHJpdmlhbCh0LG4pO2NvbnN0IGk9bmV3IHduKHQubGVuZ3RoLG4ubGVuZ3RoKSxvPW5ldyB3bih0Lmxlbmd0aCxuLmxlbmd0aCksbD1uZXcgd24odC5sZW5ndGgsbi5sZW5ndGgpO2ZvcihsZXQgZz0wO2c8dC5sZW5ndGg7ZysrKWZvcihsZXQgYj0wO2I8bi5sZW5ndGg7YisrKXtpZighci5pc1ZhbGlkKCkpcmV0dXJuIHdlLnRyaXZpYWxUaW1lZE91dCh0LG4pO2NvbnN0IF89Zz09PTA/MDppLmdldChnLTEsYiksdj1iPT09MD8wOmkuZ2V0KGcsYi0xKTtsZXQgUzt0LmdldEVsZW1lbnQoZyk9PT1uLmdldEVsZW1lbnQoYik/KGc9PT0wfHxiPT09MD9TPTA6Uz1pLmdldChnLTEsYi0xKSxnPjAmJmI+MCYmby5nZXQoZy0xLGItMSk9PT0zJiYoUys9bC5nZXQoZy0xLGItMSkpLFMrPXM/cyhnLGIpOjEpOlM9LTE7Y29uc3QgTj1NYXRoLm1heChfLHYsUyk7aWYoTj09PVMpe2NvbnN0IHA9Zz4wJiZiPjA/bC5nZXQoZy0xLGItMSk6MDtsLnNldChnLGIscCsxKSxvLnNldChnLGIsMyl9ZWxzZSBOPT09Xz8obC5zZXQoZyxiLDApLG8uc2V0KGcsYiwxKSk6Tj09PXYmJihsLnNldChnLGIsMCksby5zZXQoZyxiLDIpKTtpLnNldChnLGIsTil9Y29uc3QgdT1bXTtsZXQgYz10Lmxlbmd0aCxoPW4ubGVuZ3RoO2Z1bmN0aW9uIGYoZyxiKXsoZysxIT09Y3x8YisxIT09aCkmJnUucHVzaChuZXcgRyhuZXcgVihnKzEsYyksbmV3IFYoYisxLGgpKSksYz1nLGg9Yn1sZXQgZD10Lmxlbmd0aC0xLG09bi5sZW5ndGgtMTtmb3IoO2Q+PTAmJm0+PTA7KW8uZ2V0KGQsbSk9PT0zPyhmKGQsbSksZC0tLG0tLSk6by5nZXQoZCxtKT09PTE/ZC0tOm0tLTtyZXR1cm4gZigtMSwtMSksdS5yZXZlcnNlKCksbmV3IHdlKHUsITEpfX1jbGFzcyBfc3tjb21wdXRlKHQsbixyPWl0Lmluc3RhbmNlKXtpZih0Lmxlbmd0aD09PTB8fG4ubGVuZ3RoPT09MClyZXR1cm4gd2UudHJpdmlhbCh0LG4pO2NvbnN0IHM9dCxpPW47ZnVuY3Rpb24gbyhiLF8pe2Zvcig7YjxzLmxlbmd0aCYmXzxpLmxlbmd0aCYmcy5nZXRFbGVtZW50KGIpPT09aS5nZXRFbGVtZW50KF8pOyliKyssXysrO3JldHVybiBifWxldCBsPTA7Y29uc3QgdT1uZXcgUWE7dS5zZXQoMCxvKDAsMCkpO2NvbnN0IGM9bmV3IFlhO2Muc2V0KDAsdS5nZXQoMCk9PT0wP251bGw6bmV3IHdzKG51bGwsMCwwLHUuZ2V0KDApKSk7bGV0IGg9MDtlOmZvcig7Oyl7aWYobCsrLCFyLmlzVmFsaWQoKSlyZXR1cm4gd2UudHJpdmlhbFRpbWVkT3V0KHMsaSk7Y29uc3QgYj0tTWF0aC5taW4obCxpLmxlbmd0aCtsJTIpLF89TWF0aC5taW4obCxzLmxlbmd0aCtsJTIpO2ZvcihoPWI7aDw9XztoKz0yKXtjb25zdCB2PWg9PT1fPy0xOnUuZ2V0KGgrMSksUz1oPT09Yj8tMTp1LmdldChoLTEpKzEsTj1NYXRoLm1pbihNYXRoLm1heCh2LFMpLHMubGVuZ3RoKSxwPU4taDtpZihOPnMubGVuZ3RofHxwPmkubGVuZ3RoKWNvbnRpbnVlO2NvbnN0IHg9byhOLHApO3Uuc2V0KGgseCk7Y29uc3QgTD1OPT09dj9jLmdldChoKzEpOmMuZ2V0KGgtMSk7aWYoYy5zZXQoaCx4IT09Tj9uZXcgd3MoTCxOLHAseC1OKTpMKSx1LmdldChoKT09PXMubGVuZ3RoJiZ1LmdldChoKS1oPT09aS5sZW5ndGgpYnJlYWsgZX19bGV0IGY9Yy5nZXQoaCk7Y29uc3QgZD1bXTtsZXQgbT1zLmxlbmd0aCxnPWkubGVuZ3RoO2Zvcig7Oyl7Y29uc3QgYj1mP2YueCtmLmxlbmd0aDowLF89Zj9mLnkrZi5sZW5ndGg6MDtpZigoYiE9PW18fF8hPT1nKSYmZC5wdXNoKG5ldyBHKG5ldyBWKGIsbSksbmV3IFYoXyxnKSkpLCFmKWJyZWFrO209Zi54LGc9Zi55LGY9Zi5wcmV2fXJldHVybiBkLnJldmVyc2UoKSxuZXcgd2UoZCwhMSl9fWNsYXNzIHdze2NvbnN0cnVjdG9yKHQsbixyLHMpe3RoaXMucHJldj10LHRoaXMueD1uLHRoaXMueT1yLHRoaXMubGVuZ3RoPXN9fWNsYXNzIFFhe2NvbnN0cnVjdG9yKCl7dGhpcy5wb3NpdGl2ZUFycj1uZXcgSW50MzJBcnJheSgxMCksdGhpcy5uZWdhdGl2ZUFycj1uZXcgSW50MzJBcnJheSgxMCl9Z2V0KHQpe3JldHVybiB0PDA/KHQ9LXQtMSx0aGlzLm5lZ2F0aXZlQXJyW3RdKTp0aGlzLnBvc2l0aXZlQXJyW3RdfXNldCh0LG4pe2lmKHQ8MCl7aWYodD0tdC0xLHQ+PXRoaXMubmVnYXRpdmVBcnIubGVuZ3RoKXtjb25zdCByPXRoaXMubmVnYXRpdmVBcnI7dGhpcy5uZWdhdGl2ZUFycj1uZXcgSW50MzJBcnJheShyLmxlbmd0aCoyKSx0aGlzLm5lZ2F0aXZlQXJyLnNldChyKX10aGlzLm5lZ2F0aXZlQXJyW3RdPW59ZWxzZXtpZih0Pj10aGlzLnBvc2l0aXZlQXJyLmxlbmd0aCl7Y29uc3Qgcj10aGlzLnBvc2l0aXZlQXJyO3RoaXMucG9zaXRpdmVBcnI9bmV3IEludDMyQXJyYXkoci5sZW5ndGgqMiksdGhpcy5wb3NpdGl2ZUFyci5zZXQocil9dGhpcy5wb3NpdGl2ZUFyclt0XT1ufX19Y2xhc3MgWWF7Y29uc3RydWN0b3IoKXt0aGlzLnBvc2l0aXZlQXJyPVtdLHRoaXMubmVnYXRpdmVBcnI9W119Z2V0KHQpe3JldHVybiB0PDA/KHQ9LXQtMSx0aGlzLm5lZ2F0aXZlQXJyW3RdKTp0aGlzLnBvc2l0aXZlQXJyW3RdfXNldCh0LG4pe3Q8MD8odD0tdC0xLHRoaXMubmVnYXRpdmVBcnJbdF09bik6dGhpcy5wb3NpdGl2ZUFyclt0XT1ufX1jbGFzcyBFdHtjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy5saW5lcz10LHRoaXMucmFuZ2U9bix0aGlzLmNvbnNpZGVyV2hpdGVzcGFjZUNoYW5nZXM9cix0aGlzLmVsZW1lbnRzPVtdLHRoaXMuZmlyc3RFbGVtZW50T2Zmc2V0QnlMaW5lSWR4PVtdLHRoaXMubGluZVN0YXJ0T2Zmc2V0cz1bXSx0aGlzLnRyaW1tZWRXc0xlbmd0aHNCeUxpbmVJZHg9W10sdGhpcy5maXJzdEVsZW1lbnRPZmZzZXRCeUxpbmVJZHgucHVzaCgwKTtmb3IobGV0IHM9dGhpcy5yYW5nZS5zdGFydExpbmVOdW1iZXI7czw9dGhpcy5yYW5nZS5lbmRMaW5lTnVtYmVyO3MrKyl7bGV0IGk9dFtzLTFdLG89MDtzPT09dGhpcy5yYW5nZS5zdGFydExpbmVOdW1iZXImJnRoaXMucmFuZ2Uuc3RhcnRDb2x1bW4+MSYmKG89dGhpcy5yYW5nZS5zdGFydENvbHVtbi0xLGk9aS5zdWJzdHJpbmcobykpLHRoaXMubGluZVN0YXJ0T2Zmc2V0cy5wdXNoKG8pO2xldCBsPTA7aWYoIXIpe2NvbnN0IGM9aS50cmltU3RhcnQoKTtsPWkubGVuZ3RoLWMubGVuZ3RoLGk9Yy50cmltRW5kKCl9dGhpcy50cmltbWVkV3NMZW5ndGhzQnlMaW5lSWR4LnB1c2gobCk7Y29uc3QgdT1zPT09dGhpcy5yYW5nZS5lbmRMaW5lTnVtYmVyP01hdGgubWluKHRoaXMucmFuZ2UuZW5kQ29sdW1uLTEtby1sLGkubGVuZ3RoKTppLmxlbmd0aDtmb3IobGV0IGM9MDtjPHU7YysrKXRoaXMuZWxlbWVudHMucHVzaChpLmNoYXJDb2RlQXQoYykpO3M8dGhpcy5yYW5nZS5lbmRMaW5lTnVtYmVyJiYodGhpcy5lbGVtZW50cy5wdXNoKDEwKSx0aGlzLmZpcnN0RWxlbWVudE9mZnNldEJ5TGluZUlkeC5wdXNoKHRoaXMuZWxlbWVudHMubGVuZ3RoKSl9fXRvU3RyaW5nKCl7cmV0dXJuYFNsaWNlOiAiJHt0aGlzLnRleHR9ImB9Z2V0IHRleHQoKXtyZXR1cm4gdGhpcy5nZXRUZXh0KG5ldyBWKDAsdGhpcy5sZW5ndGgpKX1nZXRUZXh0KHQpe3JldHVybiB0aGlzLmVsZW1lbnRzLnNsaWNlKHQuc3RhcnQsdC5lbmRFeGNsdXNpdmUpLm1hcChuPT5TdHJpbmcuZnJvbUNoYXJDb2RlKG4pKS5qb2luKCIiKX1nZXRFbGVtZW50KHQpe3JldHVybiB0aGlzLmVsZW1lbnRzW3RdfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5sZW5ndGh9Z2V0Qm91bmRhcnlTY29yZSh0KXtjb25zdCBuPXZzKHQ+MD90aGlzLmVsZW1lbnRzW3QtMV06LTEpLHI9dnModDx0aGlzLmVsZW1lbnRzLmxlbmd0aD90aGlzLmVsZW1lbnRzW3RdOi0xKTtpZihuPT09NyYmcj09PTgpcmV0dXJuIDA7aWYobj09PTgpcmV0dXJuIDE1MDtsZXQgcz0wO3JldHVybiBuIT09ciYmKHMrPTEwLG49PT0wJiZyPT09MSYmKHMrPTEpKSxzKz1McyhuKSxzKz1McyhyKSxzfXRyYW5zbGF0ZU9mZnNldCh0LG49InJpZ2h0Iil7Y29uc3Qgcj1ydCh0aGlzLmZpcnN0RWxlbWVudE9mZnNldEJ5TGluZUlkeCxpPT5pPD10KSxzPXQtdGhpcy5maXJzdEVsZW1lbnRPZmZzZXRCeUxpbmVJZHhbcl07cmV0dXJuIG5ldyAkKHRoaXMucmFuZ2Uuc3RhcnRMaW5lTnVtYmVyK3IsMSt0aGlzLmxpbmVTdGFydE9mZnNldHNbcl0rcysocz09PTAmJm49PT0ibGVmdCI/MDp0aGlzLnRyaW1tZWRXc0xlbmd0aHNCeUxpbmVJZHhbcl0pKX10cmFuc2xhdGVSYW5nZSh0KXtjb25zdCBuPXRoaXMudHJhbnNsYXRlT2Zmc2V0KHQuc3RhcnQsInJpZ2h0Iikscj10aGlzLnRyYW5zbGF0ZU9mZnNldCh0LmVuZEV4Y2x1c2l2ZSwibGVmdCIpO3JldHVybiByLmlzQmVmb3JlKG4pP2suZnJvbVBvc2l0aW9ucyhyLHIpOmsuZnJvbVBvc2l0aW9ucyhuLHIpfWZpbmRXb3JkQ29udGFpbmluZyh0KXtpZih0PDB8fHQ+PXRoaXMuZWxlbWVudHMubGVuZ3RofHwhdm4odGhpcy5lbGVtZW50c1t0XSkpcmV0dXJuO2xldCBuPXQ7Zm9yKDtuPjAmJnZuKHRoaXMuZWxlbWVudHNbbi0xXSk7KW4tLTtsZXQgcj10O2Zvcig7cjx0aGlzLmVsZW1lbnRzLmxlbmd0aCYmdm4odGhpcy5lbGVtZW50c1tyXSk7KXIrKztyZXR1cm4gbmV3IFYobixyKX1jb3VudExpbmVzSW4odCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT2Zmc2V0KHQuZW5kRXhjbHVzaXZlKS5saW5lTnVtYmVyLXRoaXMudHJhbnNsYXRlT2Zmc2V0KHQuc3RhcnQpLmxpbmVOdW1iZXJ9aXNTdHJvbmdseUVxdWFsKHQsbil7cmV0dXJuIHRoaXMuZWxlbWVudHNbdF09PT10aGlzLmVsZW1lbnRzW25dfWV4dGVuZFRvRnVsbExpbmVzKHQpe2NvbnN0IG49VWUodGhpcy5maXJzdEVsZW1lbnRPZmZzZXRCeUxpbmVJZHgscz0+czw9dC5zdGFydCk/PzAscj1EYSh0aGlzLmZpcnN0RWxlbWVudE9mZnNldEJ5TGluZUlkeCxzPT50LmVuZEV4Y2x1c2l2ZTw9cyk/P3RoaXMuZWxlbWVudHMubGVuZ3RoO3JldHVybiBuZXcgVihuLHIpfX1mdW5jdGlvbiB2bihlKXtyZXR1cm4gZT49OTcmJmU8PTEyMnx8ZT49NjUmJmU8PTkwfHxlPj00OCYmZTw9NTd9Y29uc3QgSmE9ezA6MCwxOjAsMjowLDM6MTAsNDoyLDU6MzAsNjozLDc6MTAsODoxMH07ZnVuY3Rpb24gTHMoZSl7cmV0dXJuIEphW2VdfWZ1bmN0aW9uIHZzKGUpe3JldHVybiBlPT09MTA/ODplPT09MTM/NzpMbihlKT82OmU+PTk3JiZlPD0xMjI/MDplPj02NSYmZTw9OTA/MTplPj00OCYmZTw9NTc/MjplPT09LTE/MzplPT09NDR8fGU9PT01OT81OjR9ZnVuY3Rpb24gWmEoZSx0LG4scixzLGkpe2xldHttb3ZlczpvLGV4Y2x1ZGVkQ2hhbmdlczpsfT1lMShlLHQsbixpKTtpZighaS5pc1ZhbGlkKCkpcmV0dXJuW107Y29uc3QgdT1lLmZpbHRlcihoPT4hbC5oYXMoaCkpLGM9dDEodSxyLHMsdCxuLGkpO3JldHVybiBPYShvLGMpLG89bjEobyksbz1vLmZpbHRlcihoPT57Y29uc3QgZj1oLm9yaWdpbmFsLnRvT2Zmc2V0UmFuZ2UoKS5zbGljZSh0KS5tYXAobT0+bS50cmltKCkpO3JldHVybiBmLmpvaW4oYApgKS5sZW5ndGg+PTE1JiZLYShmLG09Pm0ubGVuZ3RoPj0yKT49Mn0pLG89cjEoZSxvKSxvfWZ1bmN0aW9uIEthKGUsdCl7bGV0IG49MDtmb3IoY29uc3QgciBvZiBlKXQocikmJm4rKztyZXR1cm4gbn1mdW5jdGlvbiBlMShlLHQsbixyKXtjb25zdCBzPVtdLGk9ZS5maWx0ZXIodT0+dS5tb2RpZmllZC5pc0VtcHR5JiZ1Lm9yaWdpbmFsLmxlbmd0aD49MykubWFwKHU9Pm5ldyB5dCh1Lm9yaWdpbmFsLHQsdSkpLG89bmV3IFNldChlLmZpbHRlcih1PT51Lm9yaWdpbmFsLmlzRW1wdHkmJnUubW9kaWZpZWQubGVuZ3RoPj0zKS5tYXAodT0+bmV3IHl0KHUubW9kaWZpZWQsbix1KSkpLGw9bmV3IFNldDtmb3IoY29uc3QgdSBvZiBpKXtsZXQgYz0tMSxoO2Zvcihjb25zdCBmIG9mIG8pe2NvbnN0IGQ9dS5jb21wdXRlU2ltaWxhcml0eShmKTtkPmMmJihjPWQsaD1mKX1pZihjPi45JiZoJiYoby5kZWxldGUoaCkscy5wdXNoKG5ldyBsZSh1LnJhbmdlLGgucmFuZ2UpKSxsLmFkZCh1LnNvdXJjZSksbC5hZGQoaC5zb3VyY2UpKSwhci5pc1ZhbGlkKCkpcmV0dXJue21vdmVzOnMsZXhjbHVkZWRDaGFuZ2VzOmx9fXJldHVybnttb3ZlczpzLGV4Y2x1ZGVkQ2hhbmdlczpsfX1mdW5jdGlvbiB0MShlLHQsbixyLHMsaSl7Y29uc3Qgbz1bXSxsPW5ldyB3YTtmb3IoY29uc3QgZCBvZiBlKWZvcihsZXQgbT1kLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcjttPGQub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0yO20rKyl7Y29uc3QgZz1gJHt0W20tMV19OiR7dFttKzEtMV19OiR7dFttKzItMV19YDtsLmFkZChnLHtyYW5nZTpuZXcgRChtLG0rMyl9KX1jb25zdCB1PVtdO2Uuc29ydChBdChkPT5kLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcixSdCkpO2Zvcihjb25zdCBkIG9mIGUpe2xldCBtPVtdO2ZvcihsZXQgZz1kLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcjtnPGQubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0yO2crKyl7Y29uc3QgYj1gJHtuW2ctMV19OiR7bltnKzEtMV19OiR7bltnKzItMV19YCxfPW5ldyBEKGcsZyszKSx2PVtdO2wuZm9yRWFjaChiLCh7cmFuZ2U6U30pPT57Zm9yKGNvbnN0IHAgb2YgbSlpZihwLm9yaWdpbmFsTGluZVJhbmdlLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUrMT09PVMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSYmcC5tb2RpZmllZExpbmVSYW5nZS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKzE9PT1fLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpe3Aub3JpZ2luYWxMaW5lUmFuZ2U9bmV3IEQocC5vcmlnaW5hbExpbmVSYW5nZS5zdGFydExpbmVOdW1iZXIsUy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKSxwLm1vZGlmaWVkTGluZVJhbmdlPW5ldyBEKHAubW9kaWZpZWRMaW5lUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLF8uZW5kTGluZU51bWJlckV4Y2x1c2l2ZSksdi5wdXNoKHApO3JldHVybn1jb25zdCBOPXttb2RpZmllZExpbmVSYW5nZTpfLG9yaWdpbmFsTGluZVJhbmdlOlN9O3UucHVzaChOKSx2LnB1c2goTil9KSxtPXZ9aWYoIWkuaXNWYWxpZCgpKXJldHVybltdfXUuc29ydChHYShBdChkPT5kLm1vZGlmaWVkTGluZVJhbmdlLmxlbmd0aCxSdCkpKTtjb25zdCBjPW5ldyBnZSxoPW5ldyBnZTtmb3IoY29uc3QgZCBvZiB1KXtjb25zdCBtPWQubW9kaWZpZWRMaW5lUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLWQub3JpZ2luYWxMaW5lUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLGc9Yy5zdWJ0cmFjdEZyb20oZC5tb2RpZmllZExpbmVSYW5nZSksYj1oLnN1YnRyYWN0RnJvbShkLm9yaWdpbmFsTGluZVJhbmdlKS5nZXRXaXRoRGVsdGEobSksXz1nLmdldEludGVyc2VjdGlvbihiKTtmb3IoY29uc3QgdiBvZiBfLnJhbmdlcyl7aWYodi5sZW5ndGg8Myljb250aW51ZTtjb25zdCBTPXYsTj12LmRlbHRhKC1tKTtvLnB1c2gobmV3IGxlKE4sUykpLGMuYWRkUmFuZ2UoUyksaC5hZGRSYW5nZShOKX19by5zb3J0KEF0KGQ9PmQub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLFJ0KSk7Y29uc3QgZj1uZXcgQ3QoZSk7Zm9yKGxldCBkPTA7ZDxvLmxlbmd0aDtkKyspe2NvbnN0IG09b1tkXSxnPWYuZmluZExhc3RNb25vdG9ub3VzKEw9Pkwub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyPD1tLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlciksYj1VZShlLEw9PkwubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyPD1tLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlciksXz1NYXRoLm1heChtLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlci1nLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcixtLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlci1iLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlciksdj1mLmZpbmRMYXN0TW9ub3Rvbm91cyhMPT5MLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcjxtLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpLFM9VWUoZSxMPT5MLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcjxtLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpLE49TWF0aC5tYXgodi5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLW0ub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxTLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtbS5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKTtsZXQgcDtmb3IocD0wO3A8XztwKyspe2NvbnN0IEw9bS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItcC0xLEE9bS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItcC0xO2lmKEw+ci5sZW5ndGh8fEE+cy5sZW5ndGh8fGMuY29udGFpbnMoQSl8fGguY29udGFpbnMoTCl8fCFOcyhyW0wtMV0sc1tBLTFdLGkpKWJyZWFrfXA+MCYmKGguYWRkUmFuZ2UobmV3IEQobS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItcCxtLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcikpLGMuYWRkUmFuZ2UobmV3IEQobS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItcCxtLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcikpKTtsZXQgeDtmb3IoeD0wO3g8Tjt4Kyspe2NvbnN0IEw9bS5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlK3gsQT1tLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUreDtpZihMPnIubGVuZ3RofHxBPnMubGVuZ3RofHxjLmNvbnRhaW5zKEEpfHxoLmNvbnRhaW5zKEwpfHwhTnMocltMLTFdLHNbQS0xXSxpKSlicmVha314PjAmJihoLmFkZFJhbmdlKG5ldyBEKG0ub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxtLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUreCkpLGMuYWRkUmFuZ2UobmV3IEQobS5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLG0ubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSt4KSkpLChwPjB8fHg+MCkmJihvW2RdPW5ldyBsZShuZXcgRChtLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlci1wLG0ub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSt4KSxuZXcgRChtLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlci1wLG0ubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSt4KSkpfXJldHVybiBvfWZ1bmN0aW9uIE5zKGUsdCxuKXtpZihlLnRyaW0oKT09PXQudHJpbSgpKXJldHVybiEwO2lmKGUubGVuZ3RoPjMwMCYmdC5sZW5ndGg+MzAwKXJldHVybiExO2NvbnN0IHM9bmV3IF9zKCkuY29tcHV0ZShuZXcgRXQoW2VdLG5ldyBrKDEsMSwxLGUubGVuZ3RoKSwhMSksbmV3IEV0KFt0XSxuZXcgaygxLDEsMSx0Lmxlbmd0aCksITEpLG4pO2xldCBpPTA7Y29uc3Qgbz1HLmludmVydChzLmRpZmZzLGUubGVuZ3RoKTtmb3IoY29uc3QgaCBvZiBvKWguc2VxMVJhbmdlLmZvckVhY2goZj0+e0xuKGUuY2hhckNvZGVBdChmKSl8fGkrK30pO2Z1bmN0aW9uIGwoaCl7bGV0IGY9MDtmb3IobGV0IGQ9MDtkPGUubGVuZ3RoO2QrKylMbihoLmNoYXJDb2RlQXQoZCkpfHxmKys7cmV0dXJuIGZ9Y29uc3QgdT1sKGUubGVuZ3RoPnQubGVuZ3RoP2U6dCk7cmV0dXJuIGkvdT4uNiYmdT4xMH1mdW5jdGlvbiBuMShlKXtpZihlLmxlbmd0aD09PTApcmV0dXJuIGU7ZS5zb3J0KEF0KG49Pm4ub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLFJ0KSk7Y29uc3QgdD1bZVswXV07Zm9yKGxldCBuPTE7bjxlLmxlbmd0aDtuKyspe2NvbnN0IHI9dFt0Lmxlbmd0aC0xXSxzPWVbbl0saT1zLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlci1yLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsbz1zLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlci1yLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU7aWYoaT49MCYmbz49MCYmaStvPD0yKXt0W3QubGVuZ3RoLTFdPXIuam9pbihzKTtjb250aW51ZX10LnB1c2gocyl9cmV0dXJuIHR9ZnVuY3Rpb24gcjEoZSx0KXtjb25zdCBuPW5ldyBDdChlKTtyZXR1cm4gdD10LmZpbHRlcihyPT57Y29uc3Qgcz1uLmZpbmRMYXN0TW9ub3Rvbm91cyhsPT5sLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcjxyLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpfHxuZXcgbGUobmV3IEQoMSwxKSxuZXcgRCgxLDEpKSxpPVVlKGUsbD0+bC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXI8ci5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKTtyZXR1cm4gcyE9PWl9KSx0fWZ1bmN0aW9uIFNzKGUsdCxuKXtsZXQgcj1uO3JldHVybiByPUNzKGUsdCxyKSxyPUNzKGUsdCxyKSxyPXMxKGUsdCxyKSxyfWZ1bmN0aW9uIENzKGUsdCxuKXtpZihuLmxlbmd0aD09PTApcmV0dXJuIG47Y29uc3Qgcj1bXTtyLnB1c2goblswXSk7Zm9yKGxldCBpPTE7aTxuLmxlbmd0aDtpKyspe2NvbnN0IG89cltyLmxlbmd0aC0xXTtsZXQgbD1uW2ldO2lmKGwuc2VxMVJhbmdlLmlzRW1wdHl8fGwuc2VxMlJhbmdlLmlzRW1wdHkpe2NvbnN0IHU9bC5zZXExUmFuZ2Uuc3RhcnQtby5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlO2xldCBjO2ZvcihjPTE7Yzw9dSYmIShlLmdldEVsZW1lbnQobC5zZXExUmFuZ2Uuc3RhcnQtYykhPT1lLmdldEVsZW1lbnQobC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlLWMpfHx0LmdldEVsZW1lbnQobC5zZXEyUmFuZ2Uuc3RhcnQtYykhPT10LmdldEVsZW1lbnQobC5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlLWMpKTtjKyspO2lmKGMtLSxjPT09dSl7cltyLmxlbmd0aC0xXT1uZXcgRyhuZXcgVihvLnNlcTFSYW5nZS5zdGFydCxsLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUtdSksbmV3IFYoby5zZXEyUmFuZ2Uuc3RhcnQsbC5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlLXUpKTtjb250aW51ZX1sPWwuZGVsdGEoLWMpfXIucHVzaChsKX1jb25zdCBzPVtdO2ZvcihsZXQgaT0wO2k8ci5sZW5ndGgtMTtpKyspe2NvbnN0IG89cltpKzFdO2xldCBsPXJbaV07aWYobC5zZXExUmFuZ2UuaXNFbXB0eXx8bC5zZXEyUmFuZ2UuaXNFbXB0eSl7Y29uc3QgdT1vLnNlcTFSYW5nZS5zdGFydC1sLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmU7bGV0IGM7Zm9yKGM9MDtjPHUmJiEoIWUuaXNTdHJvbmdseUVxdWFsKGwuc2VxMVJhbmdlLnN0YXJ0K2MsbC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlK2MpfHwhdC5pc1N0cm9uZ2x5RXF1YWwobC5zZXEyUmFuZ2Uuc3RhcnQrYyxsLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUrYykpO2MrKyk7aWYoYz09PXUpe3JbaSsxXT1uZXcgRyhuZXcgVihsLnNlcTFSYW5nZS5zdGFydCt1LG8uc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSksbmV3IFYobC5zZXEyUmFuZ2Uuc3RhcnQrdSxvLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUpKTtjb250aW51ZX1jPjAmJihsPWwuZGVsdGEoYykpfXMucHVzaChsKX1yZXR1cm4gci5sZW5ndGg+MCYmcy5wdXNoKHJbci5sZW5ndGgtMV0pLHN9ZnVuY3Rpb24gczEoZSx0LG4pe2lmKCFlLmdldEJvdW5kYXJ5U2NvcmV8fCF0LmdldEJvdW5kYXJ5U2NvcmUpcmV0dXJuIG47Zm9yKGxldCByPTA7cjxuLmxlbmd0aDtyKyspe2NvbnN0IHM9cj4wP25bci0xXTp2b2lkIDAsaT1uW3JdLG89cisxPG4ubGVuZ3RoP25bcisxXTp2b2lkIDAsbD1uZXcgVihzP3Muc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSsxOjAsbz9vLnNlcTFSYW5nZS5zdGFydC0xOmUubGVuZ3RoKSx1PW5ldyBWKHM/cy5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlKzE6MCxvP28uc2VxMlJhbmdlLnN0YXJ0LTE6dC5sZW5ndGgpO2kuc2VxMVJhbmdlLmlzRW1wdHk/bltyXT1BcyhpLGUsdCxsLHUpOmkuc2VxMlJhbmdlLmlzRW1wdHkmJihuW3JdPUFzKGkuc3dhcCgpLHQsZSx1LGwpLnN3YXAoKSl9cmV0dXJuIG59ZnVuY3Rpb24gQXMoZSx0LG4scixzKXtsZXQgbz0xO2Zvcig7ZS5zZXExUmFuZ2Uuc3RhcnQtbz49ci5zdGFydCYmZS5zZXEyUmFuZ2Uuc3RhcnQtbz49cy5zdGFydCYmbi5pc1N0cm9uZ2x5RXF1YWwoZS5zZXEyUmFuZ2Uuc3RhcnQtbyxlLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUtbykmJm88MTAwOylvKys7by0tO2xldCBsPTA7Zm9yKDtlLnNlcTFSYW5nZS5zdGFydCtsPHIuZW5kRXhjbHVzaXZlJiZlLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUrbDxzLmVuZEV4Y2x1c2l2ZSYmbi5pc1N0cm9uZ2x5RXF1YWwoZS5zZXEyUmFuZ2Uuc3RhcnQrbCxlLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUrbCkmJmw8MTAwOylsKys7aWYobz09PTAmJmw9PT0wKXJldHVybiBlO2xldCB1PTAsYz0tMTtmb3IobGV0IGg9LW87aDw9bDtoKyspe2NvbnN0IGY9ZS5zZXEyUmFuZ2Uuc3RhcnQraCxkPWUuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZStoLG09ZS5zZXExUmFuZ2Uuc3RhcnQraCxnPXQuZ2V0Qm91bmRhcnlTY29yZShtKStuLmdldEJvdW5kYXJ5U2NvcmUoZikrbi5nZXRCb3VuZGFyeVNjb3JlKGQpO2c+YyYmKGM9Zyx1PWgpfXJldHVybiBlLmRlbHRhKHUpfWZ1bmN0aW9uIGkxKGUsdCxuKXtjb25zdCByPVtdO2Zvcihjb25zdCBzIG9mIG4pe2NvbnN0IGk9cltyLmxlbmd0aC0xXTtpZighaSl7ci5wdXNoKHMpO2NvbnRpbnVlfXMuc2VxMVJhbmdlLnN0YXJ0LWkuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZTw9Mnx8cy5zZXEyUmFuZ2Uuc3RhcnQtaS5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlPD0yP3Jbci5sZW5ndGgtMV09bmV3IEcoaS5zZXExUmFuZ2Uuam9pbihzLnNlcTFSYW5nZSksaS5zZXEyUmFuZ2Uuam9pbihzLnNlcTJSYW5nZSkpOnIucHVzaChzKX1yZXR1cm4gcn1mdW5jdGlvbiBhMShlLHQsbil7Y29uc3Qgcj1HLmludmVydChuLGUubGVuZ3RoKSxzPVtdO2xldCBpPW5ldyBMZSgwLDApO2Z1bmN0aW9uIG8odSxjKXtpZih1Lm9mZnNldDE8aS5vZmZzZXQxfHx1Lm9mZnNldDI8aS5vZmZzZXQyKXJldHVybjtjb25zdCBoPWUuZmluZFdvcmRDb250YWluaW5nKHUub2Zmc2V0MSksZj10LmZpbmRXb3JkQ29udGFpbmluZyh1Lm9mZnNldDIpO2lmKCFofHwhZilyZXR1cm47bGV0IGQ9bmV3IEcoaCxmKTtjb25zdCBtPWQuaW50ZXJzZWN0KGMpO2xldCBnPW0uc2VxMVJhbmdlLmxlbmd0aCxiPW0uc2VxMlJhbmdlLmxlbmd0aDtmb3IoO3IubGVuZ3RoPjA7KXtjb25zdCBfPXJbMF07aWYoIShfLnNlcTFSYW5nZS5pbnRlcnNlY3RzKGQuc2VxMVJhbmdlKXx8Xy5zZXEyUmFuZ2UuaW50ZXJzZWN0cyhkLnNlcTJSYW5nZSkpKWJyZWFrO2NvbnN0IFM9ZS5maW5kV29yZENvbnRhaW5pbmcoXy5zZXExUmFuZ2Uuc3RhcnQpLE49dC5maW5kV29yZENvbnRhaW5pbmcoXy5zZXEyUmFuZ2Uuc3RhcnQpLHA9bmV3IEcoUyxOKSx4PXAuaW50ZXJzZWN0KF8pO2lmKGcrPXguc2VxMVJhbmdlLmxlbmd0aCxiKz14LnNlcTJSYW5nZS5sZW5ndGgsZD1kLmpvaW4ocCksZC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlPj1fLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUpci5zaGlmdCgpO2Vsc2UgYnJlYWt9ZytiPChkLnNlcTFSYW5nZS5sZW5ndGgrZC5zZXEyUmFuZ2UubGVuZ3RoKSoyLzMmJnMucHVzaChkKSxpPWQuZ2V0RW5kRXhjbHVzaXZlcygpfWZvcig7ci5sZW5ndGg+MDspe2NvbnN0IHU9ci5zaGlmdCgpO3Uuc2VxMVJhbmdlLmlzRW1wdHl8fChvKHUuZ2V0U3RhcnRzKCksdSksbyh1LmdldEVuZEV4Y2x1c2l2ZXMoKS5kZWx0YSgtMSksdSkpfXJldHVybiBvMShuLHMpfWZ1bmN0aW9uIG8xKGUsdCl7Y29uc3Qgbj1bXTtmb3IoO2UubGVuZ3RoPjB8fHQubGVuZ3RoPjA7KXtjb25zdCByPWVbMF0scz10WzBdO2xldCBpO3ImJighc3x8ci5zZXExUmFuZ2Uuc3RhcnQ8cy5zZXExUmFuZ2Uuc3RhcnQpP2k9ZS5zaGlmdCgpOmk9dC5zaGlmdCgpLG4ubGVuZ3RoPjAmJm5bbi5sZW5ndGgtMV0uc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZT49aS5zZXExUmFuZ2Uuc3RhcnQ/bltuLmxlbmd0aC0xXT1uW24ubGVuZ3RoLTFdLmpvaW4oaSk6bi5wdXNoKGkpfXJldHVybiBufWZ1bmN0aW9uIGwxKGUsdCxuKXtsZXQgcj1uO2lmKHIubGVuZ3RoPT09MClyZXR1cm4gcjtsZXQgcz0wLGk7ZG97aT0hMTtjb25zdCBvPVtyWzBdXTtmb3IobGV0IGw9MTtsPHIubGVuZ3RoO2wrKyl7bGV0IGg9ZnVuY3Rpb24oZCxtKXtjb25zdCBnPW5ldyBWKGMuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSx1LnNlcTFSYW5nZS5zdGFydCk7cmV0dXJuIGUuZ2V0VGV4dChnKS5yZXBsYWNlKC9ccy9nLCIiKS5sZW5ndGg8PTQmJihkLnNlcTFSYW5nZS5sZW5ndGgrZC5zZXEyUmFuZ2UubGVuZ3RoPjV8fG0uc2VxMVJhbmdlLmxlbmd0aCttLnNlcTJSYW5nZS5sZW5ndGg+NSl9O2NvbnN0IHU9cltsXSxjPW9bby5sZW5ndGgtMV07aChjLHUpPyhpPSEwLG9bby5sZW5ndGgtMV09b1tvLmxlbmd0aC0xXS5qb2luKHUpKTpvLnB1c2godSl9cj1vfXdoaWxlKHMrKzwxMCYmaSk7cmV0dXJuIHJ9ZnVuY3Rpb24gdTEoZSx0LG4pe2xldCByPW47aWYoci5sZW5ndGg9PT0wKXJldHVybiByO2xldCBzPTAsaTtkb3tpPSExO2NvbnN0IGw9W3JbMF1dO2ZvcihsZXQgdT0xO3U8ci5sZW5ndGg7dSsrKXtsZXQgZj1mdW5jdGlvbihtLGcpe2NvbnN0IGI9bmV3IFYoaC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlLGMuc2VxMVJhbmdlLnN0YXJ0KTtpZihlLmNvdW50TGluZXNJbihiKT41fHxiLmxlbmd0aD41MDApcmV0dXJuITE7Y29uc3Qgdj1lLmdldFRleHQoYikudHJpbSgpO2lmKHYubGVuZ3RoPjIwfHx2LnNwbGl0KC9cclxufFxyfFxuLykubGVuZ3RoPjEpcmV0dXJuITE7Y29uc3QgUz1lLmNvdW50TGluZXNJbihtLnNlcTFSYW5nZSksTj1tLnNlcTFSYW5nZS5sZW5ndGgscD10LmNvdW50TGluZXNJbihtLnNlcTJSYW5nZSkseD1tLnNlcTJSYW5nZS5sZW5ndGgsTD1lLmNvdW50TGluZXNJbihnLnNlcTFSYW5nZSksQT1nLnNlcTFSYW5nZS5sZW5ndGgsRT10LmNvdW50TGluZXNJbihnLnNlcTJSYW5nZSksQj1nLnNlcTJSYW5nZS5sZW5ndGgsUT0yKjQwKzUwO2Z1bmN0aW9uIHEoRil7cmV0dXJuIE1hdGgubWluKEYsUSl9cmV0dXJuIE1hdGgucG93KE1hdGgucG93KHEoUyo0MCtOKSwxLjUpK01hdGgucG93KHEocCo0MCt4KSwxLjUpLDEuNSkrTWF0aC5wb3coTWF0aC5wb3cocShMKjQwK0EpLDEuNSkrTWF0aC5wb3cocShFKjQwK0IpLDEuNSksMS41KT4oUSoqMS41KSoqMS41KjEuM307Y29uc3QgYz1yW3VdLGg9bFtsLmxlbmd0aC0xXTtmKGgsYyk/KGk9ITAsbFtsLmxlbmd0aC0xXT1sW2wubGVuZ3RoLTFdLmpvaW4oYykpOmwucHVzaChjKX1yPWx9d2hpbGUocysrPDEwJiZpKTtjb25zdCBvPVtdO3JldHVybiB6YShyLChsLHUsYyk9PntsZXQgaD11O2Z1bmN0aW9uIGYodil7cmV0dXJuIHYubGVuZ3RoPjAmJnYudHJpbSgpLmxlbmd0aDw9MyYmdS5zZXExUmFuZ2UubGVuZ3RoK3Uuc2VxMlJhbmdlLmxlbmd0aD4xMDB9Y29uc3QgZD1lLmV4dGVuZFRvRnVsbExpbmVzKHUuc2VxMVJhbmdlKSxtPWUuZ2V0VGV4dChuZXcgVihkLnN0YXJ0LHUuc2VxMVJhbmdlLnN0YXJ0KSk7ZihtKSYmKGg9aC5kZWx0YVN0YXJ0KC1tLmxlbmd0aCkpO2NvbnN0IGc9ZS5nZXRUZXh0KG5ldyBWKHUuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSxkLmVuZEV4Y2x1c2l2ZSkpO2YoZykmJihoPWguZGVsdGFFbmQoZy5sZW5ndGgpKTtjb25zdCBiPUcuZnJvbU9mZnNldFBhaXJzKGw/bC5nZXRFbmRFeGNsdXNpdmVzKCk6TGUuemVybyxjP2MuZ2V0U3RhcnRzKCk6TGUubWF4KSxfPWguaW50ZXJzZWN0KGIpO28ubGVuZ3RoPjAmJl8uZ2V0U3RhcnRzKCkuZXF1YWxzKG9bby5sZW5ndGgtMV0uZ2V0RW5kRXhjbHVzaXZlcygpKT9vW28ubGVuZ3RoLTFdPW9bby5sZW5ndGgtMV0uam9pbihfKTpvLnB1c2goXyl9KSxvfWNsYXNzIFJze2NvbnN0cnVjdG9yKHQsbil7dGhpcy50cmltbWVkSGFzaD10LHRoaXMubGluZXM9bn1nZXRFbGVtZW50KHQpe3JldHVybiB0aGlzLnRyaW1tZWRIYXNoW3RdfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy50cmltbWVkSGFzaC5sZW5ndGh9Z2V0Qm91bmRhcnlTY29yZSh0KXtjb25zdCBuPXQ9PT0wPzA6eXModGhpcy5saW5lc1t0LTFdKSxyPXQ9PT10aGlzLmxpbmVzLmxlbmd0aD8wOnlzKHRoaXMubGluZXNbdF0pO3JldHVybiAxZTMtKG4rcil9Z2V0VGV4dCh0KXtyZXR1cm4gdGhpcy5saW5lcy5zbGljZSh0LnN0YXJ0LHQuZW5kRXhjbHVzaXZlKS5qb2luKGAKYCl9aXNTdHJvbmdseUVxdWFsKHQsbil7cmV0dXJuIHRoaXMubGluZXNbdF09PT10aGlzLmxpbmVzW25dfX1mdW5jdGlvbiB5cyhlKXtsZXQgdD0wO2Zvcig7dDxlLmxlbmd0aCYmKGUuY2hhckNvZGVBdCh0KT09PTMyfHxlLmNoYXJDb2RlQXQodCk9PT05KTspdCsrO3JldHVybiB0fWNsYXNzIGMxe2NvbnN0cnVjdG9yKCl7dGhpcy5keW5hbWljUHJvZ3JhbW1pbmdEaWZmaW5nPW5ldyBYYSx0aGlzLm15ZXJzRGlmZmluZ0FsZ29yaXRobT1uZXcgX3N9Y29tcHV0ZURpZmYodCxuLHIpe2lmKHQubGVuZ3RoPD0xJiYkYSh0LG4sKHgsTCk9Png9PT1MKSlyZXR1cm4gbmV3IFN0KFtdLFtdLCExKTtpZih0Lmxlbmd0aD09PTEmJnRbMF0ubGVuZ3RoPT09MHx8bi5sZW5ndGg9PT0xJiZuWzBdLmxlbmd0aD09PTApcmV0dXJuIG5ldyBTdChbbmV3IF9lKG5ldyBEKDEsdC5sZW5ndGgrMSksbmV3IEQoMSxuLmxlbmd0aCsxKSxbbmV3IGRlKG5ldyBrKDEsMSx0Lmxlbmd0aCx0W3QubGVuZ3RoLTFdLmxlbmd0aCsxKSxuZXcgaygxLDEsbi5sZW5ndGgsbltuLmxlbmd0aC0xXS5sZW5ndGgrMSkpXSldLFtdLCExKTtjb25zdCBzPXIubWF4Q29tcHV0YXRpb25UaW1lTXM9PT0wP2l0Lmluc3RhbmNlOm5ldyBqYShyLm1heENvbXB1dGF0aW9uVGltZU1zKSxpPSFyLmlnbm9yZVRyaW1XaGl0ZXNwYWNlLG89bmV3IE1hcDtmdW5jdGlvbiBsKHgpe2xldCBMPW8uZ2V0KHgpO3JldHVybiBMPT09dm9pZCAwJiYoTD1vLnNpemUsby5zZXQoeCxMKSksTH1jb25zdCB1PXQubWFwKHg9PmwoeC50cmltKCkpKSxjPW4ubWFwKHg9PmwoeC50cmltKCkpKSxoPW5ldyBScyh1LHQpLGY9bmV3IFJzKGMsbiksZD1oLmxlbmd0aCtmLmxlbmd0aDwxNzAwP3RoaXMuZHluYW1pY1Byb2dyYW1taW5nRGlmZmluZy5jb21wdXRlKGgsZixzLCh4LEwpPT50W3hdPT09bltMXT9uW0xdLmxlbmd0aD09PTA/LjE6MStNYXRoLmxvZygxK25bTF0ubGVuZ3RoKTouOTkpOnRoaXMubXllcnNEaWZmaW5nQWxnb3JpdGhtLmNvbXB1dGUoaCxmLHMpO2xldCBtPWQuZGlmZnMsZz1kLmhpdFRpbWVvdXQ7bT1TcyhoLGYsbSksbT1sMShoLGYsbSk7Y29uc3QgYj1bXSxfPXg9PntpZihpKWZvcihsZXQgTD0wO0w8eDtMKyspe2NvbnN0IEE9ditMLEU9UytMO2lmKHRbQV0hPT1uW0VdKXtjb25zdCBCPXRoaXMucmVmaW5lRGlmZih0LG4sbmV3IEcobmV3IFYoQSxBKzEpLG5ldyBWKEUsRSsxKSkscyxpKTtmb3IoY29uc3QgUSBvZiBCLm1hcHBpbmdzKWIucHVzaChRKTtCLmhpdFRpbWVvdXQmJihnPSEwKX19fTtsZXQgdj0wLFM9MDtmb3IoY29uc3QgeCBvZiBtKXtOdCgoKT0+eC5zZXExUmFuZ2Uuc3RhcnQtdj09PXguc2VxMlJhbmdlLnN0YXJ0LVMpO2NvbnN0IEw9eC5zZXExUmFuZ2Uuc3RhcnQtdjtfKEwpLHY9eC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlLFM9eC5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlO2NvbnN0IEE9dGhpcy5yZWZpbmVEaWZmKHQsbix4LHMsaSk7QS5oaXRUaW1lb3V0JiYoZz0hMCk7Zm9yKGNvbnN0IEUgb2YgQS5tYXBwaW5ncyliLnB1c2goRSl9Xyh0Lmxlbmd0aC12KTtjb25zdCBOPUVzKGIsdCxuKTtsZXQgcD1bXTtyZXR1cm4gci5jb21wdXRlTW92ZXMmJihwPXRoaXMuY29tcHV0ZU1vdmVzKE4sdCxuLHUsYyxzLGkpKSxOdCgoKT0+e2Z1bmN0aW9uIHgoQSxFKXtpZihBLmxpbmVOdW1iZXI8MXx8QS5saW5lTnVtYmVyPkUubGVuZ3RoKXJldHVybiExO2NvbnN0IEI9RVtBLmxpbmVOdW1iZXItMV07cmV0dXJuIShBLmNvbHVtbjwxfHxBLmNvbHVtbj5CLmxlbmd0aCsxKX1mdW5jdGlvbiBMKEEsRSl7cmV0dXJuIShBLnN0YXJ0TGluZU51bWJlcjwxfHxBLnN0YXJ0TGluZU51bWJlcj5FLmxlbmd0aCsxfHxBLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU8MXx8QS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPkUubGVuZ3RoKzEpfWZvcihjb25zdCBBIG9mIE4pe2lmKCFBLmlubmVyQ2hhbmdlcylyZXR1cm4hMTtmb3IoY29uc3QgRSBvZiBBLmlubmVyQ2hhbmdlcylpZighKHgoRS5tb2RpZmllZFJhbmdlLmdldFN0YXJ0UG9zaXRpb24oKSxuKSYmeChFLm1vZGlmaWVkUmFuZ2UuZ2V0RW5kUG9zaXRpb24oKSxuKSYmeChFLm9yaWdpbmFsUmFuZ2UuZ2V0U3RhcnRQb3NpdGlvbigpLHQpJiZ4KEUub3JpZ2luYWxSYW5nZS5nZXRFbmRQb3NpdGlvbigpLHQpKSlyZXR1cm4hMTtpZighTChBLm1vZGlmaWVkLG4pfHwhTChBLm9yaWdpbmFsLHQpKXJldHVybiExfXJldHVybiEwfSksbmV3IFN0KE4scCxnKX1jb21wdXRlTW92ZXModCxuLHIscyxpLG8sbCl7cmV0dXJuIFphKHQsbixyLHMsaSxvKS5tYXAoaD0+e2NvbnN0IGY9dGhpcy5yZWZpbmVEaWZmKG4scixuZXcgRyhoLm9yaWdpbmFsLnRvT2Zmc2V0UmFuZ2UoKSxoLm1vZGlmaWVkLnRvT2Zmc2V0UmFuZ2UoKSksbyxsKSxkPUVzKGYubWFwcGluZ3MsbixyLCEwKTtyZXR1cm4gbmV3IEZhKGgsZCl9KX1yZWZpbmVEaWZmKHQsbixyLHMsaSl7Y29uc3QgbD1mMShyKS50b1JhbmdlTWFwcGluZzIodCxuKSx1PW5ldyBFdCh0LGwub3JpZ2luYWxSYW5nZSxpKSxjPW5ldyBFdChuLGwubW9kaWZpZWRSYW5nZSxpKSxoPXUubGVuZ3RoK2MubGVuZ3RoPDUwMD90aGlzLmR5bmFtaWNQcm9ncmFtbWluZ0RpZmZpbmcuY29tcHV0ZSh1LGMscyk6dGhpcy5teWVyc0RpZmZpbmdBbGdvcml0aG0uY29tcHV0ZSh1LGMscyk7bGV0IGY9aC5kaWZmcztyZXR1cm4gZj1Tcyh1LGMsZiksZj1hMSh1LGMsZiksZj1pMSh1LGMsZiksZj11MSh1LGMsZikse21hcHBpbmdzOmYubWFwKG09Pm5ldyBkZSh1LnRyYW5zbGF0ZVJhbmdlKG0uc2VxMVJhbmdlKSxjLnRyYW5zbGF0ZVJhbmdlKG0uc2VxMlJhbmdlKSkpLGhpdFRpbWVvdXQ6aC5oaXRUaW1lb3V0fX19ZnVuY3Rpb24gRXMoZSx0LG4scj0hMSl7Y29uc3Qgcz1bXTtmb3IoY29uc3QgaSBvZiBIYShlLm1hcChvPT5oMShvLHQsbikpLChvLGwpPT5vLm9yaWdpbmFsLm92ZXJsYXBPclRvdWNoKGwub3JpZ2luYWwpfHxvLm1vZGlmaWVkLm92ZXJsYXBPclRvdWNoKGwubW9kaWZpZWQpKSl7Y29uc3Qgbz1pWzBdLGw9aVtpLmxlbmd0aC0xXTtzLnB1c2gobmV3IF9lKG8ub3JpZ2luYWwuam9pbihsLm9yaWdpbmFsKSxvLm1vZGlmaWVkLmpvaW4obC5tb2RpZmllZCksaS5tYXAodT0+dS5pbm5lckNoYW5nZXNbMF0pKSl9cmV0dXJuIE50KCgpPT4hciYmcy5sZW5ndGg+MCYmKHNbMF0ubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyIT09c1swXS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXJ8fG4ubGVuZ3RoLXNbcy5sZW5ndGgtMV0ubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSE9PXQubGVuZ3RoLXNbcy5sZW5ndGgtMV0ub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSk/ITE6b3MocywoaSxvKT0+by5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItaS5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPT09by5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItaS5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlJiZpLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU8by5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXImJmkubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTxvLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcikpLHN9ZnVuY3Rpb24gaDEoZSx0LG4pe2xldCByPTAscz0wO2UubW9kaWZpZWRSYW5nZS5lbmRDb2x1bW49PT0xJiZlLm9yaWdpbmFsUmFuZ2UuZW5kQ29sdW1uPT09MSYmZS5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlcityPD1lLm9yaWdpbmFsUmFuZ2UuZW5kTGluZU51bWJlciYmZS5tb2RpZmllZFJhbmdlLnN0YXJ0TGluZU51bWJlcityPD1lLm1vZGlmaWVkUmFuZ2UuZW5kTGluZU51bWJlciYmKHM9LTEpLGUubW9kaWZpZWRSYW5nZS5zdGFydENvbHVtbi0xPj1uW2UubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXItMV0ubGVuZ3RoJiZlLm9yaWdpbmFsUmFuZ2Uuc3RhcnRDb2x1bW4tMT49dFtlLm9yaWdpbmFsUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLTFdLmxlbmd0aCYmZS5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlcjw9ZS5vcmlnaW5hbFJhbmdlLmVuZExpbmVOdW1iZXIrcyYmZS5tb2RpZmllZFJhbmdlLnN0YXJ0TGluZU51bWJlcjw9ZS5tb2RpZmllZFJhbmdlLmVuZExpbmVOdW1iZXIrcyYmKHI9MSk7Y29uc3QgaT1uZXcgRChlLm9yaWdpbmFsUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyK3IsZS5vcmlnaW5hbFJhbmdlLmVuZExpbmVOdW1iZXIrMStzKSxvPW5ldyBEKGUubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXIrcixlLm1vZGlmaWVkUmFuZ2UuZW5kTGluZU51bWJlcisxK3MpO3JldHVybiBuZXcgX2UoaSxvLFtlXSl9ZnVuY3Rpb24gZjEoZSl7cmV0dXJuIG5ldyBsZShuZXcgRChlLnNlcTFSYW5nZS5zdGFydCsxLGUuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSsxKSxuZXcgRChlLnNlcTJSYW5nZS5zdGFydCsxLGUuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZSsxKSl9Y29uc3QgTXM9e2dldExlZ2FjeTooKT0+bmV3IFZhLGdldERlZmF1bHQ6KCk9Pm5ldyBjMX07ZnVuY3Rpb24geWUoZSx0KXtjb25zdCBuPU1hdGgucG93KDEwLHQpO3JldHVybiBNYXRoLnJvdW5kKGUqbikvbn1jbGFzcyBYe2NvbnN0cnVjdG9yKHQsbixyLHM9MSl7dGhpcy5fcmdiYUJyYW5kPXZvaWQgMCx0aGlzLnI9TWF0aC5taW4oMjU1LE1hdGgubWF4KDAsdCkpfDAsdGhpcy5nPU1hdGgubWluKDI1NSxNYXRoLm1heCgwLG4pKXwwLHRoaXMuYj1NYXRoLm1pbigyNTUsTWF0aC5tYXgoMCxyKSl8MCx0aGlzLmE9eWUoTWF0aC5tYXgoTWF0aC5taW4oMSxzKSwwKSwzKX1zdGF0aWMgZXF1YWxzKHQsbil7cmV0dXJuIHQucj09PW4uciYmdC5nPT09bi5nJiZ0LmI9PT1uLmImJnQuYT09PW4uYX19Y2xhc3MgdWV7Y29uc3RydWN0b3IodCxuLHIscyl7dGhpcy5faHNsYUJyYW5kPXZvaWQgMCx0aGlzLmg9TWF0aC5tYXgoTWF0aC5taW4oMzYwLHQpLDApfDAsdGhpcy5zPXllKE1hdGgubWF4KE1hdGgubWluKDEsbiksMCksMyksdGhpcy5sPXllKE1hdGgubWF4KE1hdGgubWluKDEsciksMCksMyksdGhpcy5hPXllKE1hdGgubWF4KE1hdGgubWluKDEscyksMCksMyl9c3RhdGljIGVxdWFscyh0LG4pe3JldHVybiB0Lmg9PT1uLmgmJnQucz09PW4ucyYmdC5sPT09bi5sJiZ0LmE9PT1uLmF9c3RhdGljIGZyb21SR0JBKHQpe2NvbnN0IG49dC5yLzI1NSxyPXQuZy8yNTUscz10LmIvMjU1LGk9dC5hLG89TWF0aC5tYXgobixyLHMpLGw9TWF0aC5taW4obixyLHMpO2xldCB1PTAsYz0wO2NvbnN0IGg9KGwrbykvMixmPW8tbDtpZihmPjApe3N3aXRjaChjPU1hdGgubWluKGg8PS41P2YvKDIqaCk6Zi8oMi0yKmgpLDEpLG8pe2Nhc2Ugbjp1PShyLXMpL2YrKHI8cz82OjApO2JyZWFrO2Nhc2Ugcjp1PShzLW4pL2YrMjticmVhaztjYXNlIHM6dT0obi1yKS9mKzQ7YnJlYWt9dSo9NjAsdT1NYXRoLnJvdW5kKHUpfXJldHVybiBuZXcgdWUodSxjLGgsaSl9c3RhdGljIF9odWUycmdiKHQsbixyKXtyZXR1cm4gcjwwJiYocis9MSkscj4xJiYoci09MSkscjwxLzY/dCsobi10KSo2KnI6cjwxLzI/bjpyPDIvMz90KyhuLXQpKigyLzMtcikqNjp0fXN0YXRpYyB0b1JHQkEodCl7Y29uc3Qgbj10LmgvMzYwLHtzOnIsbDpzLGE6aX09dDtsZXQgbyxsLHU7aWYocj09PTApbz1sPXU9cztlbHNle2NvbnN0IGM9czwuNT9zKigxK3IpOnMrci1zKnIsaD0yKnMtYztvPXVlLl9odWUycmdiKGgsYyxuKzEvMyksbD11ZS5faHVlMnJnYihoLGMsbiksdT11ZS5faHVlMnJnYihoLGMsbi0xLzMpfXJldHVybiBuZXcgWChNYXRoLnJvdW5kKG8qMjU1KSxNYXRoLnJvdW5kKGwqMjU1KSxNYXRoLnJvdW5kKHUqMjU1KSxpKX19Y2xhc3MgV2V7Y29uc3RydWN0b3IodCxuLHIscyl7dGhpcy5faHN2YUJyYW5kPXZvaWQgMCx0aGlzLmg9TWF0aC5tYXgoTWF0aC5taW4oMzYwLHQpLDApfDAsdGhpcy5zPXllKE1hdGgubWF4KE1hdGgubWluKDEsbiksMCksMyksdGhpcy52PXllKE1hdGgubWF4KE1hdGgubWluKDEsciksMCksMyksdGhpcy5hPXllKE1hdGgubWF4KE1hdGgubWluKDEscyksMCksMyl9c3RhdGljIGVxdWFscyh0LG4pe3JldHVybiB0Lmg9PT1uLmgmJnQucz09PW4ucyYmdC52PT09bi52JiZ0LmE9PT1uLmF9c3RhdGljIGZyb21SR0JBKHQpe2NvbnN0IG49dC5yLzI1NSxyPXQuZy8yNTUscz10LmIvMjU1LGk9TWF0aC5tYXgobixyLHMpLG89TWF0aC5taW4obixyLHMpLGw9aS1vLHU9aT09PTA/MDpsL2k7bGV0IGM7cmV0dXJuIGw9PT0wP2M9MDppPT09bj9jPSgoci1zKS9sJTYrNiklNjppPT09cj9jPShzLW4pL2wrMjpjPShuLXIpL2wrNCxuZXcgV2UoTWF0aC5yb3VuZChjKjYwKSx1LGksdC5hKX1zdGF0aWMgdG9SR0JBKHQpe2NvbnN0e2g6bixzOnIsdjpzLGE6aX09dCxvPXMqcixsPW8qKDEtTWF0aC5hYnMobi82MCUyLTEpKSx1PXMtbztsZXRbYyxoLGZdPVswLDAsMF07cmV0dXJuIG48NjA/KGM9byxoPWwpOm48MTIwPyhjPWwsaD1vKTpuPDE4MD8oaD1vLGY9bCk6bjwyNDA/KGg9bCxmPW8pOm48MzAwPyhjPWwsZj1vKTpuPD0zNjAmJihjPW8sZj1sKSxjPU1hdGgucm91bmQoKGMrdSkqMjU1KSxoPU1hdGgucm91bmQoKGgrdSkqMjU1KSxmPU1hdGgucm91bmQoKGYrdSkqMjU1KSxuZXcgWChjLGgsZixpKX19Y29uc3QgSD1jbGFzcyBIe3N0YXRpYyBmcm9tSGV4KHQpe3JldHVybiBILkZvcm1hdC5DU1MucGFyc2VIZXgodCl8fEgucmVkfXN0YXRpYyBlcXVhbHModCxuKXtyZXR1cm4hdCYmIW4/ITA6IXR8fCFuPyExOnQuZXF1YWxzKG4pfWdldCBoc2xhKCl7cmV0dXJuIHRoaXMuX2hzbGE/dGhpcy5faHNsYTp1ZS5mcm9tUkdCQSh0aGlzLnJnYmEpfWdldCBoc3ZhKCl7cmV0dXJuIHRoaXMuX2hzdmE/dGhpcy5faHN2YTpXZS5mcm9tUkdCQSh0aGlzLnJnYmEpfWNvbnN0cnVjdG9yKHQpe2lmKHQpaWYodCBpbnN0YW5jZW9mIFgpdGhpcy5yZ2JhPXQ7ZWxzZSBpZih0IGluc3RhbmNlb2YgdWUpdGhpcy5faHNsYT10LHRoaXMucmdiYT11ZS50b1JHQkEodCk7ZWxzZSBpZih0IGluc3RhbmNlb2YgV2UpdGhpcy5faHN2YT10LHRoaXMucmdiYT1XZS50b1JHQkEodCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29sb3IgY3RvciBhcmd1bWVudCIpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJDb2xvciBuZWVkcyBhIHZhbHVlIil9ZXF1YWxzKHQpe3JldHVybiEhdCYmWC5lcXVhbHModGhpcy5yZ2JhLHQucmdiYSkmJnVlLmVxdWFscyh0aGlzLmhzbGEsdC5oc2xhKSYmV2UuZXF1YWxzKHRoaXMuaHN2YSx0LmhzdmEpfWdldFJlbGF0aXZlTHVtaW5hbmNlKCl7Y29uc3QgdD1ILl9yZWxhdGl2ZUx1bWluYW5jZUZvckNvbXBvbmVudCh0aGlzLnJnYmEuciksbj1ILl9yZWxhdGl2ZUx1bWluYW5jZUZvckNvbXBvbmVudCh0aGlzLnJnYmEuZykscj1ILl9yZWxhdGl2ZUx1bWluYW5jZUZvckNvbXBvbmVudCh0aGlzLnJnYmEuYikscz0uMjEyNip0Ky43MTUyKm4rLjA3MjIqcjtyZXR1cm4geWUocyw0KX1zdGF0aWMgX3JlbGF0aXZlTHVtaW5hbmNlRm9yQ29tcG9uZW50KHQpe2NvbnN0IG49dC8yNTU7cmV0dXJuIG48PS4wMzkyOD9uLzEyLjkyOk1hdGgucG93KChuKy4wNTUpLzEuMDU1LDIuNCl9aXNMaWdodGVyKCl7cmV0dXJuKHRoaXMucmdiYS5yKjI5OSt0aGlzLnJnYmEuZyo1ODcrdGhpcy5yZ2JhLmIqMTE0KS8xZTM+PTEyOH1pc0xpZ2h0ZXJUaGFuKHQpe2NvbnN0IG49dGhpcy5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLHI9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiBuPnJ9aXNEYXJrZXJUaGFuKHQpe2NvbnN0IG49dGhpcy5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLHI9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiBuPHJ9bGlnaHRlbih0KXtyZXR1cm4gbmV3IEgobmV3IHVlKHRoaXMuaHNsYS5oLHRoaXMuaHNsYS5zLHRoaXMuaHNsYS5sK3RoaXMuaHNsYS5sKnQsdGhpcy5oc2xhLmEpKX1kYXJrZW4odCl7cmV0dXJuIG5ldyBIKG5ldyB1ZSh0aGlzLmhzbGEuaCx0aGlzLmhzbGEucyx0aGlzLmhzbGEubC10aGlzLmhzbGEubCp0LHRoaXMuaHNsYS5hKSl9dHJhbnNwYXJlbnQodCl7Y29uc3R7cjpuLGc6cixiOnMsYTppfT10aGlzLnJnYmE7cmV0dXJuIG5ldyBIKG5ldyBYKG4scixzLGkqdCkpfWlzVHJhbnNwYXJlbnQoKXtyZXR1cm4gdGhpcy5yZ2JhLmE9PT0wfWlzT3BhcXVlKCl7cmV0dXJuIHRoaXMucmdiYS5hPT09MX1vcHBvc2l0ZSgpe3JldHVybiBuZXcgSChuZXcgWCgyNTUtdGhpcy5yZ2JhLnIsMjU1LXRoaXMucmdiYS5nLDI1NS10aGlzLnJnYmEuYix0aGlzLnJnYmEuYSkpfW1ha2VPcGFxdWUodCl7aWYodGhpcy5pc09wYXF1ZSgpfHx0LnJnYmEuYSE9PTEpcmV0dXJuIHRoaXM7Y29uc3R7cjpuLGc6cixiOnMsYTppfT10aGlzLnJnYmE7cmV0dXJuIG5ldyBIKG5ldyBYKHQucmdiYS5yLWkqKHQucmdiYS5yLW4pLHQucmdiYS5nLWkqKHQucmdiYS5nLXIpLHQucmdiYS5iLWkqKHQucmdiYS5iLXMpLDEpKX10b1N0cmluZygpe3JldHVybiB0aGlzLl90b1N0cmluZ3x8KHRoaXMuX3RvU3RyaW5nPUguRm9ybWF0LkNTUy5mb3JtYXQodGhpcykpLHRoaXMuX3RvU3RyaW5nfXN0YXRpYyBnZXRMaWdodGVyQ29sb3IodCxuLHIpe2lmKHQuaXNMaWdodGVyVGhhbihuKSlyZXR1cm4gdDtyPXJ8fC41O2NvbnN0IHM9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLGk9bi5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiByPXIqKGktcykvaSx0LmxpZ2h0ZW4ocil9c3RhdGljIGdldERhcmtlckNvbG9yKHQsbixyKXtpZih0LmlzRGFya2VyVGhhbihuKSlyZXR1cm4gdDtyPXJ8fC41O2NvbnN0IHM9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLGk9bi5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiByPXIqKHMtaSkvcyx0LmRhcmtlbihyKX19O0gud2hpdGU9bmV3IEgobmV3IFgoMjU1LDI1NSwyNTUsMSkpLEguYmxhY2s9bmV3IEgobmV3IFgoMCwwLDAsMSkpLEgucmVkPW5ldyBIKG5ldyBYKDI1NSwwLDAsMSkpLEguYmx1ZT1uZXcgSChuZXcgWCgwLDAsMjU1LDEpKSxILmdyZWVuPW5ldyBIKG5ldyBYKDAsMjU1LDAsMSkpLEguY3lhbj1uZXcgSChuZXcgWCgwLDI1NSwyNTUsMSkpLEgubGlnaHRncmV5PW5ldyBIKG5ldyBYKDIxMSwyMTEsMjExLDEpKSxILnRyYW5zcGFyZW50PW5ldyBIKG5ldyBYKDAsMCwwLDApKTtsZXQgemU9SDsoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKHQpeyhmdW5jdGlvbihuKXtmdW5jdGlvbiByKG0pe3JldHVybiBtLnJnYmEuYT09PTE/YHJnYigke20ucmdiYS5yfSwgJHttLnJnYmEuZ30sICR7bS5yZ2JhLmJ9KWA6ZS5Gb3JtYXQuQ1NTLmZvcm1hdFJHQkEobSl9bi5mb3JtYXRSR0I9cjtmdW5jdGlvbiBzKG0pe3JldHVybmByZ2JhKCR7bS5yZ2JhLnJ9LCAke20ucmdiYS5nfSwgJHttLnJnYmEuYn0sICR7K20ucmdiYS5hLnRvRml4ZWQoMil9KWB9bi5mb3JtYXRSR0JBPXM7ZnVuY3Rpb24gaShtKXtyZXR1cm4gbS5oc2xhLmE9PT0xP2Boc2woJHttLmhzbGEuaH0sICR7KG0uaHNsYS5zKjEwMCkudG9GaXhlZCgyKX0lLCAkeyhtLmhzbGEubCoxMDApLnRvRml4ZWQoMil9JSlgOmUuRm9ybWF0LkNTUy5mb3JtYXRIU0xBKG0pfW4uZm9ybWF0SFNMPWk7ZnVuY3Rpb24gbyhtKXtyZXR1cm5gaHNsYSgke20uaHNsYS5ofSwgJHsobS5oc2xhLnMqMTAwKS50b0ZpeGVkKDIpfSUsICR7KG0uaHNsYS5sKjEwMCkudG9GaXhlZCgyKX0lLCAke20uaHNsYS5hLnRvRml4ZWQoMil9KWB9bi5mb3JtYXRIU0xBPW87ZnVuY3Rpb24gbChtKXtjb25zdCBnPW0udG9TdHJpbmcoMTYpO3JldHVybiBnLmxlbmd0aCE9PTI/IjAiK2c6Z31mdW5jdGlvbiB1KG0pe3JldHVybmAjJHtsKG0ucmdiYS5yKX0ke2wobS5yZ2JhLmcpfSR7bChtLnJnYmEuYil9YH1uLmZvcm1hdEhleD11O2Z1bmN0aW9uIGMobSxnPSExKXtyZXR1cm4gZyYmbS5yZ2JhLmE9PT0xP2UuRm9ybWF0LkNTUy5mb3JtYXRIZXgobSk6YCMke2wobS5yZ2JhLnIpfSR7bChtLnJnYmEuZyl9JHtsKG0ucmdiYS5iKX0ke2woTWF0aC5yb3VuZChtLnJnYmEuYSoyNTUpKX1gfW4uZm9ybWF0SGV4QT1jO2Z1bmN0aW9uIGgobSl7cmV0dXJuIG0uaXNPcGFxdWUoKT9lLkZvcm1hdC5DU1MuZm9ybWF0SGV4KG0pOmUuRm9ybWF0LkNTUy5mb3JtYXRSR0JBKG0pfW4uZm9ybWF0PWg7ZnVuY3Rpb24gZihtKXtjb25zdCBnPW0ubGVuZ3RoO2lmKGc9PT0wfHxtLmNoYXJDb2RlQXQoMCkhPT0zNSlyZXR1cm4gbnVsbDtpZihnPT09Nyl7Y29uc3QgYj0xNipkKG0uY2hhckNvZGVBdCgxKSkrZChtLmNoYXJDb2RlQXQoMikpLF89MTYqZChtLmNoYXJDb2RlQXQoMykpK2QobS5jaGFyQ29kZUF0KDQpKSx2PTE2KmQobS5jaGFyQ29kZUF0KDUpKStkKG0uY2hhckNvZGVBdCg2KSk7cmV0dXJuIG5ldyBlKG5ldyBYKGIsXyx2LDEpKX1pZihnPT09OSl7Y29uc3QgYj0xNipkKG0uY2hhckNvZGVBdCgxKSkrZChtLmNoYXJDb2RlQXQoMikpLF89MTYqZChtLmNoYXJDb2RlQXQoMykpK2QobS5jaGFyQ29kZUF0KDQpKSx2PTE2KmQobS5jaGFyQ29kZUF0KDUpKStkKG0uY2hhckNvZGVBdCg2KSksUz0xNipkKG0uY2hhckNvZGVBdCg3KSkrZChtLmNoYXJDb2RlQXQoOCkpO3JldHVybiBuZXcgZShuZXcgWChiLF8sdixTLzI1NSkpfWlmKGc9PT00KXtjb25zdCBiPWQobS5jaGFyQ29kZUF0KDEpKSxfPWQobS5jaGFyQ29kZUF0KDIpKSx2PWQobS5jaGFyQ29kZUF0KDMpKTtyZXR1cm4gbmV3IGUobmV3IFgoMTYqYitiLDE2Kl8rXywxNip2K3YpKX1pZihnPT09NSl7Y29uc3QgYj1kKG0uY2hhckNvZGVBdCgxKSksXz1kKG0uY2hhckNvZGVBdCgyKSksdj1kKG0uY2hhckNvZGVBdCgzKSksUz1kKG0uY2hhckNvZGVBdCg0KSk7cmV0dXJuIG5ldyBlKG5ldyBYKDE2KmIrYiwxNipfK18sMTYqdit2LCgxNipTK1MpLzI1NSkpfXJldHVybiBudWxsfW4ucGFyc2VIZXg9ZjtmdW5jdGlvbiBkKG0pe3N3aXRjaChtKXtjYXNlIDQ4OnJldHVybiAwO2Nhc2UgNDk6cmV0dXJuIDE7Y2FzZSA1MDpyZXR1cm4gMjtjYXNlIDUxOnJldHVybiAzO2Nhc2UgNTI6cmV0dXJuIDQ7Y2FzZSA1MzpyZXR1cm4gNTtjYXNlIDU0OnJldHVybiA2O2Nhc2UgNTU6cmV0dXJuIDc7Y2FzZSA1NjpyZXR1cm4gODtjYXNlIDU3OnJldHVybiA5O2Nhc2UgOTc6cmV0dXJuIDEwO2Nhc2UgNjU6cmV0dXJuIDEwO2Nhc2UgOTg6cmV0dXJuIDExO2Nhc2UgNjY6cmV0dXJuIDExO2Nhc2UgOTk6cmV0dXJuIDEyO2Nhc2UgNjc6cmV0dXJuIDEyO2Nhc2UgMTAwOnJldHVybiAxMztjYXNlIDY4OnJldHVybiAxMztjYXNlIDEwMTpyZXR1cm4gMTQ7Y2FzZSA2OTpyZXR1cm4gMTQ7Y2FzZSAxMDI6cmV0dXJuIDE1O2Nhc2UgNzA6cmV0dXJuIDE1fXJldHVybiAwfX0pKHQuQ1NTfHwodC5DU1M9e30pKX0pKGUuRm9ybWF0fHwoZS5Gb3JtYXQ9e30pKX0pKHplfHwoemU9e30pKTtmdW5jdGlvbiBrcyhlKXtjb25zdCB0PVtdO2Zvcihjb25zdCBuIG9mIGUpe2NvbnN0IHI9TnVtYmVyKG4pOyhyfHxyPT09MCYmbi5yZXBsYWNlKC9ccy9nLCIiKSE9PSIiKSYmdC5wdXNoKHIpfXJldHVybiB0fWZ1bmN0aW9uIE5uKGUsdCxuLHIpe3JldHVybntyZWQ6ZS8yNTUsYmx1ZTpuLzI1NSxncmVlbjp0LzI1NSxhbHBoYTpyfX1mdW5jdGlvbiBhdChlLHQpe2NvbnN0IG49dC5pbmRleCxyPXRbMF0ubGVuZ3RoO2lmKCFuKXJldHVybjtjb25zdCBzPWUucG9zaXRpb25BdChuKTtyZXR1cm57c3RhcnRMaW5lTnVtYmVyOnMubGluZU51bWJlcixzdGFydENvbHVtbjpzLmNvbHVtbixlbmRMaW5lTnVtYmVyOnMubGluZU51bWJlcixlbmRDb2x1bW46cy5jb2x1bW4rcn19ZnVuY3Rpb24gZDEoZSx0KXtpZighZSlyZXR1cm47Y29uc3Qgbj16ZS5Gb3JtYXQuQ1NTLnBhcnNlSGV4KHQpO2lmKG4pcmV0dXJue3JhbmdlOmUsY29sb3I6Tm4obi5yZ2JhLnIsbi5yZ2JhLmcsbi5yZ2JhLmIsbi5yZ2JhLmEpfX1mdW5jdGlvbiBQcyhlLHQsbil7aWYoIWV8fHQubGVuZ3RoIT09MSlyZXR1cm47Y29uc3Qgcz10WzBdLnZhbHVlcygpLGk9a3Mocyk7cmV0dXJue3JhbmdlOmUsY29sb3I6Tm4oaVswXSxpWzFdLGlbMl0sbj9pWzNdOjEpfX1mdW5jdGlvbiBGcyhlLHQsbil7aWYoIWV8fHQubGVuZ3RoIT09MSlyZXR1cm47Y29uc3Qgcz10WzBdLnZhbHVlcygpLGk9a3Mocyksbz1uZXcgemUobmV3IHVlKGlbMF0saVsxXS8xMDAsaVsyXS8xMDAsbj9pWzNdOjEpKTtyZXR1cm57cmFuZ2U6ZSxjb2xvcjpObihvLnJnYmEucixvLnJnYmEuZyxvLnJnYmEuYixvLnJnYmEuYSl9fWZ1bmN0aW9uIG90KGUsdCl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIj9bLi4uZS5tYXRjaEFsbCh0KV06ZS5maW5kTWF0Y2hlcyh0KX1mdW5jdGlvbiBtMShlKXtjb25zdCB0PVtdLHI9b3QoZSwvXGIocmdifHJnYmF8aHNsfGhzbGEpKFwoWzAtOVxzLC5cJV0qXCkpfCgjKShbQS1GYS1mMC05XXszfSlcYnwoIykoW0EtRmEtZjAtOV17NH0pXGJ8KCMpKFtBLUZhLWYwLTldezZ9KVxifCgjKShbQS1GYS1mMC05XXs4fSlcYi9nbSk7aWYoci5sZW5ndGg+MClmb3IoY29uc3QgcyBvZiByKXtjb25zdCBpPXMuZmlsdGVyKGM9PmMhPT12b2lkIDApLG89aVsxXSxsPWlbMl07aWYoIWwpY29udGludWU7bGV0IHU7aWYobz09PSJyZ2IiKXtjb25zdCBjPS9eXChccyooMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlccyosXHMqKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXHMqLFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxzKlwpJC9nbTt1PVBzKGF0KGUscyksb3QobCxjKSwhMSl9ZWxzZSBpZihvPT09InJnYmEiKXtjb25zdCBjPS9eXChccyooMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlccyosXHMqKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXHMqLFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxzKixccyooMFsuXVswLTldK3xbLl1bMC05XSt8WzAxXVsuXXxbMDFdKVxzKlwpJC9nbTt1PVBzKGF0KGUscyksb3QobCxjKSwhMCl9ZWxzZSBpZihvPT09ImhzbCIpe2NvbnN0IGM9L15cKFxzKigzNlswXXwzWzAtNV1bMC05XXxbMTJdWzAtOV1bMC05XXxbMS05XT9bMC05XSlccyosXHMqKDEwMHxcZHsxLDJ9Wy5dXGQqfFxkezEsMn0pJVxzKixccyooMTAwfFxkezEsMn1bLl1cZCp8XGR7MSwyfSklXHMqXCkkL2dtO3U9RnMoYXQoZSxzKSxvdChsLGMpLCExKX1lbHNlIGlmKG89PT0iaHNsYSIpe2NvbnN0IGM9L15cKFxzKigzNlswXXwzWzAtNV1bMC05XXxbMTJdWzAtOV1bMC05XXxbMS05XT9bMC05XSlccyosXHMqKDEwMHxcZHsxLDJ9Wy5dXGQqfFxkezEsMn0pJVxzKixccyooMTAwfFxkezEsMn1bLl1cZCp8XGR7MSwyfSklXHMqLFxzKigwWy5dWzAtOV0rfFsuXVswLTldK3xbMDFdWy5dfFswMV0pXHMqXCkkL2dtO3U9RnMoYXQoZSxzKSxvdChsLGMpLCEwKX1lbHNlIG89PT0iIyImJih1PWQxKGF0KGUscyksbytsKSk7dSYmdC5wdXNoKHUpfXJldHVybiB0fWZ1bmN0aW9uIGcxKGUpe3JldHVybiFlfHx0eXBlb2YgZS5nZXRWYWx1ZSE9ImZ1bmN0aW9uInx8dHlwZW9mIGUucG9zaXRpb25BdCE9ImZ1bmN0aW9uIj9bXTptMShlKX1jb25zdCBEcz1uZXcgUmVnRXhwKCJcXGJNQVJLOlxccyooLiopJCIsImQiKSxiMT0vXi0rfC0rJC9nO2Z1bmN0aW9uIHgxKGUsdCl7dmFyIHI7bGV0IG49W107aWYodC5maW5kUmVnaW9uU2VjdGlvbkhlYWRlcnMmJigocj10LmZvbGRpbmdSdWxlcykhPW51bGwmJnIubWFya2Vycykpe2NvbnN0IHM9cDEoZSx0KTtuPW4uY29uY2F0KHMpfWlmKHQuZmluZE1hcmtTZWN0aW9uSGVhZGVycyl7Y29uc3Qgcz1fMShlKTtuPW4uY29uY2F0KHMpfXJldHVybiBufWZ1bmN0aW9uIHAxKGUsdCl7Y29uc3Qgbj1bXSxyPWUuZ2V0TGluZUNvdW50KCk7Zm9yKGxldCBzPTE7czw9cjtzKyspe2NvbnN0IGk9ZS5nZXRMaW5lQ29udGVudChzKSxvPWkubWF0Y2godC5mb2xkaW5nUnVsZXMubWFya2Vycy5zdGFydCk7aWYobyl7Y29uc3QgbD17c3RhcnRMaW5lTnVtYmVyOnMsc3RhcnRDb2x1bW46b1swXS5sZW5ndGgrMSxlbmRMaW5lTnVtYmVyOnMsZW5kQ29sdW1uOmkubGVuZ3RoKzF9O2lmKGwuZW5kQ29sdW1uPmwuc3RhcnRDb2x1bW4pe2NvbnN0IHU9e3JhbmdlOmwsLi4uVHMoaS5zdWJzdHJpbmcob1swXS5sZW5ndGgpKSxzaG91bGRCZUluQ29tbWVudHM6ITF9Oyh1LnRleHR8fHUuaGFzU2VwYXJhdG9yTGluZSkmJm4ucHVzaCh1KX19fXJldHVybiBufWZ1bmN0aW9uIF8xKGUpe2NvbnN0IHQ9W10sbj1lLmdldExpbmVDb3VudCgpO2ZvcihsZXQgcj0xO3I8PW47cisrKXtjb25zdCBzPWUuZ2V0TGluZUNvbnRlbnQocik7dzEocyxyLHQpfXJldHVybiB0fWZ1bmN0aW9uIHcxKGUsdCxuKXtEcy5sYXN0SW5kZXg9MDtjb25zdCByPURzLmV4ZWMoZSk7aWYocil7Y29uc3Qgcz1yLmluZGljZXNbMV1bMF0rMSxpPXIuaW5kaWNlc1sxXVsxXSsxLG89e3N0YXJ0TGluZU51bWJlcjp0LHN0YXJ0Q29sdW1uOnMsZW5kTGluZU51bWJlcjp0LGVuZENvbHVtbjppfTtpZihvLmVuZENvbHVtbj5vLnN0YXJ0Q29sdW1uKXtjb25zdCBsPXtyYW5nZTpvLC4uLlRzKHJbMV0pLHNob3VsZEJlSW5Db21tZW50czohMH07KGwudGV4dHx8bC5oYXNTZXBhcmF0b3JMaW5lKSYmbi5wdXNoKGwpfX19ZnVuY3Rpb24gVHMoZSl7ZT1lLnRyaW0oKTtjb25zdCB0PWUuc3RhcnRzV2l0aCgiLSIpO3JldHVybiBlPWUucmVwbGFjZShiMSwiIikse3RleHQ6ZSxoYXNTZXBhcmF0b3JMaW5lOnR9fXZhciBJczsoZnVuY3Rpb24oZSl7YXN5bmMgZnVuY3Rpb24gdChyKXtsZXQgcztjb25zdCBpPWF3YWl0IFByb21pc2UuYWxsKHIubWFwKG89Pm8udGhlbihsPT5sLGw9PntzfHwocz1sKX0pKSk7aWYodHlwZW9mIHM8InUiKXRocm93IHM7cmV0dXJuIGl9ZS5zZXR0bGVkPXQ7ZnVuY3Rpb24gbihyKXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMocyxpKT0+e3RyeXthd2FpdCByKHMsaSl9Y2F0Y2gobyl7aShvKX19KX1lLndpdGhBc3luY0JvZHk9bn0pKElzfHwoSXM9e30pKTtjb25zdCBuZT1jbGFzcyBuZXtzdGF0aWMgZnJvbUFycmF5KHQpe3JldHVybiBuZXcgbmUobj0+e24uZW1pdE1hbnkodCl9KX1zdGF0aWMgZnJvbVByb21pc2UodCl7cmV0dXJuIG5ldyBuZShhc3luYyBuPT57bi5lbWl0TWFueShhd2FpdCB0KX0pfXN0YXRpYyBmcm9tUHJvbWlzZXModCl7cmV0dXJuIG5ldyBuZShhc3luYyBuPT57YXdhaXQgUHJvbWlzZS5hbGwodC5tYXAoYXN5bmMgcj0+bi5lbWl0T25lKGF3YWl0IHIpKSl9KX1zdGF0aWMgbWVyZ2UodCl7cmV0dXJuIG5ldyBuZShhc3luYyBuPT57YXdhaXQgUHJvbWlzZS5hbGwodC5tYXAoYXN5bmMgcj0+e2ZvciBhd2FpdChjb25zdCBzIG9mIHIpbi5lbWl0T25lKHMpfSkpfSl9Y29uc3RydWN0b3IodCxuKXt0aGlzLl9zdGF0ZT0wLHRoaXMuX3Jlc3VsdHM9W10sdGhpcy5fZXJyb3I9bnVsbCx0aGlzLl9vblJldHVybj1uLHRoaXMuX29uU3RhdGVDaGFuZ2VkPW5ldyBvZSxxdWV1ZU1pY3JvdGFzayhhc3luYygpPT57Y29uc3Qgcj17ZW1pdE9uZTpzPT50aGlzLmVtaXRPbmUocyksZW1pdE1hbnk6cz0+dGhpcy5lbWl0TWFueShzKSxyZWplY3Q6cz0+dGhpcy5yZWplY3Qocyl9O3RyeXthd2FpdCBQcm9taXNlLnJlc29sdmUodChyKSksdGhpcy5yZXNvbHZlKCl9Y2F0Y2gocyl7dGhpcy5yZWplY3Qocyl9ZmluYWxseXtyLmVtaXRPbmU9dm9pZCAwLHIuZW1pdE1hbnk9dm9pZCAwLHIucmVqZWN0PXZvaWQgMH19KX1bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7bGV0IHQ9MDtyZXR1cm57bmV4dDphc3luYygpPT57ZG97aWYodGhpcy5fc3RhdGU9PT0yKXRocm93IHRoaXMuX2Vycm9yO2lmKHQ8dGhpcy5fcmVzdWx0cy5sZW5ndGgpcmV0dXJue2RvbmU6ITEsdmFsdWU6dGhpcy5fcmVzdWx0c1t0KytdfTtpZih0aGlzLl9zdGF0ZT09PTEpcmV0dXJue2RvbmU6ITAsdmFsdWU6dm9pZCAwfTthd2FpdCBtdC50b1Byb21pc2UodGhpcy5fb25TdGF0ZUNoYW5nZWQuZXZlbnQpfXdoaWxlKCEwKX0scmV0dXJuOmFzeW5jKCk9Pnt2YXIgbjtyZXR1cm4obj10aGlzLl9vblJldHVybik9PW51bGx8fG4uY2FsbCh0aGlzKSx7ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fX19c3RhdGljIG1hcCh0LG4pe3JldHVybiBuZXcgbmUoYXN5bmMgcj0+e2ZvciBhd2FpdChjb25zdCBzIG9mIHQpci5lbWl0T25lKG4ocykpfSl9bWFwKHQpe3JldHVybiBuZS5tYXAodGhpcyx0KX1zdGF0aWMgZmlsdGVyKHQsbil7cmV0dXJuIG5ldyBuZShhc3luYyByPT57Zm9yIGF3YWl0KGNvbnN0IHMgb2YgdCluKHMpJiZyLmVtaXRPbmUocyl9KX1maWx0ZXIodCl7cmV0dXJuIG5lLmZpbHRlcih0aGlzLHQpfXN0YXRpYyBjb2FsZXNjZSh0KXtyZXR1cm4gbmUuZmlsdGVyKHQsbj0+ISFuKX1jb2FsZXNjZSgpe3JldHVybiBuZS5jb2FsZXNjZSh0aGlzKX1zdGF0aWMgYXN5bmMgdG9Qcm9taXNlKHQpe2NvbnN0IG49W107Zm9yIGF3YWl0KGNvbnN0IHIgb2YgdCluLnB1c2gocik7cmV0dXJuIG59dG9Qcm9taXNlKCl7cmV0dXJuIG5lLnRvUHJvbWlzZSh0aGlzKX1lbWl0T25lKHQpe3RoaXMuX3N0YXRlPT09MCYmKHRoaXMuX3Jlc3VsdHMucHVzaCh0KSx0aGlzLl9vblN0YXRlQ2hhbmdlZC5maXJlKCkpfWVtaXRNYW55KHQpe3RoaXMuX3N0YXRlPT09MCYmKHRoaXMuX3Jlc3VsdHM9dGhpcy5fcmVzdWx0cy5jb25jYXQodCksdGhpcy5fb25TdGF0ZUNoYW5nZWQuZmlyZSgpKX1yZXNvbHZlKCl7dGhpcy5fc3RhdGU9PT0wJiYodGhpcy5fc3RhdGU9MSx0aGlzLl9vblN0YXRlQ2hhbmdlZC5maXJlKCkpfXJlamVjdCh0KXt0aGlzLl9zdGF0ZT09PTAmJih0aGlzLl9zdGF0ZT0yLHRoaXMuX2Vycm9yPXQsdGhpcy5fb25TdGF0ZUNoYW5nZWQuZmlyZSgpKX19O25lLkVNUFRZPW5lLmZyb21BcnJheShbXSk7bGV0IFZzPW5lO2NsYXNzIEwxe2NvbnN0cnVjdG9yKHQpe3RoaXMudmFsdWVzPXQsdGhpcy5wcmVmaXhTdW09bmV3IFVpbnQzMkFycmF5KHQubGVuZ3RoKSx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXg9bmV3IEludDMyQXJyYXkoMSksdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPS0xfWluc2VydFZhbHVlcyh0LG4pe3Q9cWUodCk7Y29uc3Qgcj10aGlzLnZhbHVlcyxzPXRoaXMucHJlZml4U3VtLGk9bi5sZW5ndGg7cmV0dXJuIGk9PT0wPyExOih0aGlzLnZhbHVlcz1uZXcgVWludDMyQXJyYXkoci5sZW5ndGgraSksdGhpcy52YWx1ZXMuc2V0KHIuc3ViYXJyYXkoMCx0KSwwKSx0aGlzLnZhbHVlcy5zZXQoci5zdWJhcnJheSh0KSx0K2kpLHRoaXMudmFsdWVzLnNldChuLHQpLHQtMTx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0mJih0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF09dC0xKSx0aGlzLnByZWZpeFN1bT1uZXcgVWludDMyQXJyYXkodGhpcy52YWx1ZXMubGVuZ3RoKSx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0+PTAmJnRoaXMucHJlZml4U3VtLnNldChzLnN1YmFycmF5KDAsdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKzEpKSwhMCl9c2V0VmFsdWUodCxuKXtyZXR1cm4gdD1xZSh0KSxuPXFlKG4pLHRoaXMudmFsdWVzW3RdPT09bj8hMToodGhpcy52YWx1ZXNbdF09bix0LTE8dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdJiYodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPXQtMSksITApfXJlbW92ZVZhbHVlcyh0LG4pe3Q9cWUodCksbj1xZShuKTtjb25zdCByPXRoaXMudmFsdWVzLHM9dGhpcy5wcmVmaXhTdW07aWYodD49ci5sZW5ndGgpcmV0dXJuITE7Y29uc3QgaT1yLmxlbmd0aC10O3JldHVybiBuPj1pJiYobj1pKSxuPT09MD8hMToodGhpcy52YWx1ZXM9bmV3IFVpbnQzMkFycmF5KHIubGVuZ3RoLW4pLHRoaXMudmFsdWVzLnNldChyLnN1YmFycmF5KDAsdCksMCksdGhpcy52YWx1ZXMuc2V0KHIuc3ViYXJyYXkodCtuKSx0KSx0aGlzLnByZWZpeFN1bT1uZXcgVWludDMyQXJyYXkodGhpcy52YWx1ZXMubGVuZ3RoKSx0LTE8dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdJiYodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPXQtMSksdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPj0wJiZ0aGlzLnByZWZpeFN1bS5zZXQocy5zdWJhcnJheSgwLHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSsxKSksITApfWdldFRvdGFsU3VtKCl7cmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aD09PTA/MDp0aGlzLl9nZXRQcmVmaXhTdW0odGhpcy52YWx1ZXMubGVuZ3RoLTEpfWdldFByZWZpeFN1bSh0KXtyZXR1cm4gdDwwPzA6KHQ9cWUodCksdGhpcy5fZ2V0UHJlZml4U3VtKHQpKX1fZ2V0UHJlZml4U3VtKHQpe2lmKHQ8PXRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSlyZXR1cm4gdGhpcy5wcmVmaXhTdW1bdF07bGV0IG49dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKzE7bj09PTAmJih0aGlzLnByZWZpeFN1bVswXT10aGlzLnZhbHVlc1swXSxuKyspLHQ+PXRoaXMudmFsdWVzLmxlbmd0aCYmKHQ9dGhpcy52YWx1ZXMubGVuZ3RoLTEpO2ZvcihsZXQgcj1uO3I8PXQ7cisrKXRoaXMucHJlZml4U3VtW3JdPXRoaXMucHJlZml4U3VtW3ItMV0rdGhpcy52YWx1ZXNbcl07cmV0dXJuIHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXT1NYXRoLm1heCh0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0sdCksdGhpcy5wcmVmaXhTdW1bdF19Z2V0SW5kZXhPZih0KXt0PU1hdGguZmxvb3IodCksdGhpcy5nZXRUb3RhbFN1bSgpO2xldCBuPTAscj10aGlzLnZhbHVlcy5sZW5ndGgtMSxzPTAsaT0wLG89MDtmb3IoO248PXI7KWlmKHM9bisoci1uKS8yfDAsaT10aGlzLnByZWZpeFN1bVtzXSxvPWktdGhpcy52YWx1ZXNbc10sdDxvKXI9cy0xO2Vsc2UgaWYodD49aSluPXMrMTtlbHNlIGJyZWFrO3JldHVybiBuZXcgdjEocyx0LW8pfX1jbGFzcyB2MXtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuaW5kZXg9dCx0aGlzLnJlbWFpbmRlcj1uLHRoaXMuX3ByZWZpeFN1bUluZGV4T2ZSZXN1bHRCcmFuZD12b2lkIDAsdGhpcy5pbmRleD10LHRoaXMucmVtYWluZGVyPW59fWNsYXNzIE4xe2NvbnN0cnVjdG9yKHQsbixyLHMpe3RoaXMuX3VyaT10LHRoaXMuX2xpbmVzPW4sdGhpcy5fZW9sPXIsdGhpcy5fdmVyc2lvbklkPXMsdGhpcy5fbGluZVN0YXJ0cz1udWxsLHRoaXMuX2NhY2hlZFRleHRWYWx1ZT1udWxsfWRpc3Bvc2UoKXt0aGlzLl9saW5lcy5sZW5ndGg9MH1nZXQgdmVyc2lvbigpe3JldHVybiB0aGlzLl92ZXJzaW9uSWR9Z2V0VGV4dCgpe3JldHVybiB0aGlzLl9jYWNoZWRUZXh0VmFsdWU9PT1udWxsJiYodGhpcy5fY2FjaGVkVGV4dFZhbHVlPXRoaXMuX2xpbmVzLmpvaW4odGhpcy5fZW9sKSksdGhpcy5fY2FjaGVkVGV4dFZhbHVlfW9uRXZlbnRzKHQpe3QuZW9sJiZ0LmVvbCE9PXRoaXMuX2VvbCYmKHRoaXMuX2VvbD10LmVvbCx0aGlzLl9saW5lU3RhcnRzPW51bGwpO2NvbnN0IG49dC5jaGFuZ2VzO2Zvcihjb25zdCByIG9mIG4pdGhpcy5fYWNjZXB0RGVsZXRlUmFuZ2Uoci5yYW5nZSksdGhpcy5fYWNjZXB0SW5zZXJ0VGV4dChuZXcgJChyLnJhbmdlLnN0YXJ0TGluZU51bWJlcixyLnJhbmdlLnN0YXJ0Q29sdW1uKSxyLnRleHQpO3RoaXMuX3ZlcnNpb25JZD10LnZlcnNpb25JZCx0aGlzLl9jYWNoZWRUZXh0VmFsdWU9bnVsbH1fZW5zdXJlTGluZVN0YXJ0cygpe2lmKCF0aGlzLl9saW5lU3RhcnRzKXtjb25zdCB0PXRoaXMuX2VvbC5sZW5ndGgsbj10aGlzLl9saW5lcy5sZW5ndGgscj1uZXcgVWludDMyQXJyYXkobik7Zm9yKGxldCBzPTA7czxuO3MrKylyW3NdPXRoaXMuX2xpbmVzW3NdLmxlbmd0aCt0O3RoaXMuX2xpbmVTdGFydHM9bmV3IEwxKHIpfX1fc2V0TGluZVRleHQodCxuKXt0aGlzLl9saW5lc1t0XT1uLHRoaXMuX2xpbmVTdGFydHMmJnRoaXMuX2xpbmVTdGFydHMuc2V0VmFsdWUodCx0aGlzLl9saW5lc1t0XS5sZW5ndGgrdGhpcy5fZW9sLmxlbmd0aCl9X2FjY2VwdERlbGV0ZVJhbmdlKHQpe2lmKHQuc3RhcnRMaW5lTnVtYmVyPT09dC5lbmRMaW5lTnVtYmVyKXtpZih0LnN0YXJ0Q29sdW1uPT09dC5lbmRDb2x1bW4pcmV0dXJuO3RoaXMuX3NldExpbmVUZXh0KHQuc3RhcnRMaW5lTnVtYmVyLTEsdGhpcy5fbGluZXNbdC5zdGFydExpbmVOdW1iZXItMV0uc3Vic3RyaW5nKDAsdC5zdGFydENvbHVtbi0xKSt0aGlzLl9saW5lc1t0LnN0YXJ0TGluZU51bWJlci0xXS5zdWJzdHJpbmcodC5lbmRDb2x1bW4tMSkpO3JldHVybn10aGlzLl9zZXRMaW5lVGV4dCh0LnN0YXJ0TGluZU51bWJlci0xLHRoaXMuX2xpbmVzW3Quc3RhcnRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZygwLHQuc3RhcnRDb2x1bW4tMSkrdGhpcy5fbGluZXNbdC5lbmRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZyh0LmVuZENvbHVtbi0xKSksdGhpcy5fbGluZXMuc3BsaWNlKHQuc3RhcnRMaW5lTnVtYmVyLHQuZW5kTGluZU51bWJlci10LnN0YXJ0TGluZU51bWJlciksdGhpcy5fbGluZVN0YXJ0cyYmdGhpcy5fbGluZVN0YXJ0cy5yZW1vdmVWYWx1ZXModC5zdGFydExpbmVOdW1iZXIsdC5lbmRMaW5lTnVtYmVyLXQuc3RhcnRMaW5lTnVtYmVyKX1fYWNjZXB0SW5zZXJ0VGV4dCh0LG4pe2lmKG4ubGVuZ3RoPT09MClyZXR1cm47Y29uc3Qgcj1naShuKTtpZihyLmxlbmd0aD09PTEpe3RoaXMuX3NldExpbmVUZXh0KHQubGluZU51bWJlci0xLHRoaXMuX2xpbmVzW3QubGluZU51bWJlci0xXS5zdWJzdHJpbmcoMCx0LmNvbHVtbi0xKStyWzBdK3RoaXMuX2xpbmVzW3QubGluZU51bWJlci0xXS5zdWJzdHJpbmcodC5jb2x1bW4tMSkpO3JldHVybn1yW3IubGVuZ3RoLTFdKz10aGlzLl9saW5lc1t0LmxpbmVOdW1iZXItMV0uc3Vic3RyaW5nKHQuY29sdW1uLTEpLHRoaXMuX3NldExpbmVUZXh0KHQubGluZU51bWJlci0xLHRoaXMuX2xpbmVzW3QubGluZU51bWJlci0xXS5zdWJzdHJpbmcoMCx0LmNvbHVtbi0xKStyWzBdKTtjb25zdCBzPW5ldyBVaW50MzJBcnJheShyLmxlbmd0aC0xKTtmb3IobGV0IGk9MTtpPHIubGVuZ3RoO2krKyl0aGlzLl9saW5lcy5zcGxpY2UodC5saW5lTnVtYmVyK2ktMSwwLHJbaV0pLHNbaS0xXT1yW2ldLmxlbmd0aCt0aGlzLl9lb2wubGVuZ3RoO3RoaXMuX2xpbmVTdGFydHMmJnRoaXMuX2xpbmVTdGFydHMuaW5zZXJ0VmFsdWVzKHQubGluZU51bWJlcixzKX19Y2xhc3MgUzF7Y29uc3RydWN0b3IoKXt0aGlzLl9tb2RlbHM9T2JqZWN0LmNyZWF0ZShudWxsKX1nZXRNb2RlbCh0KXtyZXR1cm4gdGhpcy5fbW9kZWxzW3RdfWdldE1vZGVscygpe2NvbnN0IHQ9W107cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX21vZGVscykuZm9yRWFjaChuPT50LnB1c2godGhpcy5fbW9kZWxzW25dKSksdH0kYWNjZXB0TmV3TW9kZWwodCl7dGhpcy5fbW9kZWxzW3QudXJsXT1uZXcgQzEoc2UucGFyc2UodC51cmwpLHQubGluZXMsdC5FT0wsdC52ZXJzaW9uSWQpfSRhY2NlcHRNb2RlbENoYW5nZWQodCxuKXtpZighdGhpcy5fbW9kZWxzW3RdKXJldHVybjt0aGlzLl9tb2RlbHNbdF0ub25FdmVudHMobil9JGFjY2VwdFJlbW92ZWRNb2RlbCh0KXt0aGlzLl9tb2RlbHNbdF0mJmRlbGV0ZSB0aGlzLl9tb2RlbHNbdF19fWNsYXNzIEMxIGV4dGVuZHMgTjF7Z2V0IHVyaSgpe3JldHVybiB0aGlzLl91cml9Z2V0IGVvbCgpe3JldHVybiB0aGlzLl9lb2x9Z2V0VmFsdWUoKXtyZXR1cm4gdGhpcy5nZXRUZXh0KCl9ZmluZE1hdGNoZXModCl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9MDtyPHRoaXMuX2xpbmVzLmxlbmd0aDtyKyspe2NvbnN0IHM9dGhpcy5fbGluZXNbcl0saT10aGlzLm9mZnNldEF0KG5ldyAkKHIrMSwxKSksbz1zLm1hdGNoQWxsKHQpO2Zvcihjb25zdCBsIG9mIG8pKGwuaW5kZXh8fGwuaW5kZXg9PT0wKSYmKGwuaW5kZXg9bC5pbmRleCtpKSxuLnB1c2gobCl9cmV0dXJuIG59Z2V0TGluZXNDb250ZW50KCl7cmV0dXJuIHRoaXMuX2xpbmVzLnNsaWNlKDApfWdldExpbmVDb3VudCgpe3JldHVybiB0aGlzLl9saW5lcy5sZW5ndGh9Z2V0TGluZUNvbnRlbnQodCl7cmV0dXJuIHRoaXMuX2xpbmVzW3QtMV19Z2V0V29yZEF0UG9zaXRpb24odCxuKXtjb25zdCByPWduKHQuY29sdW1uLHVzKG4pLHRoaXMuX2xpbmVzW3QubGluZU51bWJlci0xXSwwKTtyZXR1cm4gcj9uZXcgayh0LmxpbmVOdW1iZXIsci5zdGFydENvbHVtbix0LmxpbmVOdW1iZXIsci5lbmRDb2x1bW4pOm51bGx9d29yZHModCl7Y29uc3Qgbj10aGlzLl9saW5lcyxyPXRoaXMuX3dvcmRlbml6ZS5iaW5kKHRoaXMpO2xldCBzPTAsaT0iIixvPTAsbD1bXTtyZXR1cm57KltTeW1ib2wuaXRlcmF0b3JdKCl7Zm9yKDs7KWlmKG88bC5sZW5ndGgpe2NvbnN0IHU9aS5zdWJzdHJpbmcobFtvXS5zdGFydCxsW29dLmVuZCk7bys9MSx5aWVsZCB1fWVsc2UgaWYoczxuLmxlbmd0aClpPW5bc10sbD1yKGksdCksbz0wLHMrPTE7ZWxzZSBicmVha319fWdldExpbmVXb3Jkcyh0LG4pe2NvbnN0IHI9dGhpcy5fbGluZXNbdC0xXSxzPXRoaXMuX3dvcmRlbml6ZShyLG4pLGk9W107Zm9yKGNvbnN0IG8gb2YgcylpLnB1c2goe3dvcmQ6ci5zdWJzdHJpbmcoby5zdGFydCxvLmVuZCksc3RhcnRDb2x1bW46by5zdGFydCsxLGVuZENvbHVtbjpvLmVuZCsxfSk7cmV0dXJuIGl9X3dvcmRlbml6ZSh0LG4pe2NvbnN0IHI9W107bGV0IHM7Zm9yKG4ubGFzdEluZGV4PTA7KHM9bi5leGVjKHQpKSYmc1swXS5sZW5ndGghPT0wOylyLnB1c2goe3N0YXJ0OnMuaW5kZXgsZW5kOnMuaW5kZXgrc1swXS5sZW5ndGh9KTtyZXR1cm4gcn1nZXRWYWx1ZUluUmFuZ2UodCl7aWYodD10aGlzLl92YWxpZGF0ZVJhbmdlKHQpLHQuc3RhcnRMaW5lTnVtYmVyPT09dC5lbmRMaW5lTnVtYmVyKXJldHVybiB0aGlzLl9saW5lc1t0LnN0YXJ0TGluZU51bWJlci0xXS5zdWJzdHJpbmcodC5zdGFydENvbHVtbi0xLHQuZW5kQ29sdW1uLTEpO2NvbnN0IG49dGhpcy5fZW9sLHI9dC5zdGFydExpbmVOdW1iZXItMSxzPXQuZW5kTGluZU51bWJlci0xLGk9W107aS5wdXNoKHRoaXMuX2xpbmVzW3JdLnN1YnN0cmluZyh0LnN0YXJ0Q29sdW1uLTEpKTtmb3IobGV0IG89cisxO288cztvKyspaS5wdXNoKHRoaXMuX2xpbmVzW29dKTtyZXR1cm4gaS5wdXNoKHRoaXMuX2xpbmVzW3NdLnN1YnN0cmluZygwLHQuZW5kQ29sdW1uLTEpKSxpLmpvaW4obil9b2Zmc2V0QXQodCl7cmV0dXJuIHQ9dGhpcy5fdmFsaWRhdGVQb3NpdGlvbih0KSx0aGlzLl9lbnN1cmVMaW5lU3RhcnRzKCksdGhpcy5fbGluZVN0YXJ0cy5nZXRQcmVmaXhTdW0odC5saW5lTnVtYmVyLTIpKyh0LmNvbHVtbi0xKX1wb3NpdGlvbkF0KHQpe3Q9TWF0aC5mbG9vcih0KSx0PU1hdGgubWF4KDAsdCksdGhpcy5fZW5zdXJlTGluZVN0YXJ0cygpO2NvbnN0IG49dGhpcy5fbGluZVN0YXJ0cy5nZXRJbmRleE9mKHQpLHI9dGhpcy5fbGluZXNbbi5pbmRleF0ubGVuZ3RoO3JldHVybntsaW5lTnVtYmVyOjErbi5pbmRleCxjb2x1bW46MStNYXRoLm1pbihuLnJlbWFpbmRlcixyKX19X3ZhbGlkYXRlUmFuZ2UodCl7Y29uc3Qgbj10aGlzLl92YWxpZGF0ZVBvc2l0aW9uKHtsaW5lTnVtYmVyOnQuc3RhcnRMaW5lTnVtYmVyLGNvbHVtbjp0LnN0YXJ0Q29sdW1ufSkscj10aGlzLl92YWxpZGF0ZVBvc2l0aW9uKHtsaW5lTnVtYmVyOnQuZW5kTGluZU51bWJlcixjb2x1bW46dC5lbmRDb2x1bW59KTtyZXR1cm4gbi5saW5lTnVtYmVyIT09dC5zdGFydExpbmVOdW1iZXJ8fG4uY29sdW1uIT09dC5zdGFydENvbHVtbnx8ci5saW5lTnVtYmVyIT09dC5lbmRMaW5lTnVtYmVyfHxyLmNvbHVtbiE9PXQuZW5kQ29sdW1uP3tzdGFydExpbmVOdW1iZXI6bi5saW5lTnVtYmVyLHN0YXJ0Q29sdW1uOm4uY29sdW1uLGVuZExpbmVOdW1iZXI6ci5saW5lTnVtYmVyLGVuZENvbHVtbjpyLmNvbHVtbn06dH1fdmFsaWRhdGVQb3NpdGlvbih0KXtpZighJC5pc0lQb3NpdGlvbih0KSl0aHJvdyBuZXcgRXJyb3IoImJhZCBwb3NpdGlvbiIpO2xldHtsaW5lTnVtYmVyOm4sY29sdW1uOnJ9PXQscz0hMTtpZihuPDEpbj0xLHI9MSxzPSEwO2Vsc2UgaWYobj50aGlzLl9saW5lcy5sZW5ndGgpbj10aGlzLl9saW5lcy5sZW5ndGgscj10aGlzLl9saW5lc1tuLTFdLmxlbmd0aCsxLHM9ITA7ZWxzZXtjb25zdCBpPXRoaXMuX2xpbmVzW24tMV0ubGVuZ3RoKzE7cjwxPyhyPTEscz0hMCk6cj5pJiYocj1pLHM9ITApfXJldHVybiBzP3tsaW5lTnVtYmVyOm4sY29sdW1uOnJ9OnR9fWNvbnN0IEl0PWNsYXNzIEl0e2NvbnN0cnVjdG9yKCl7dGhpcy5fd29ya2VyVGV4dE1vZGVsU3luY1NlcnZlcj1uZXcgUzF9ZGlzcG9zZSgpe31fZ2V0TW9kZWwodCl7cmV0dXJuIHRoaXMuX3dvcmtlclRleHRNb2RlbFN5bmNTZXJ2ZXIuZ2V0TW9kZWwodCl9X2dldE1vZGVscygpe3JldHVybiB0aGlzLl93b3JrZXJUZXh0TW9kZWxTeW5jU2VydmVyLmdldE1vZGVscygpfSRhY2NlcHROZXdNb2RlbCh0KXt0aGlzLl93b3JrZXJUZXh0TW9kZWxTeW5jU2VydmVyLiRhY2NlcHROZXdNb2RlbCh0KX0kYWNjZXB0TW9kZWxDaGFuZ2VkKHQsbil7dGhpcy5fd29ya2VyVGV4dE1vZGVsU3luY1NlcnZlci4kYWNjZXB0TW9kZWxDaGFuZ2VkKHQsbil9JGFjY2VwdFJlbW92ZWRNb2RlbCh0KXt0aGlzLl93b3JrZXJUZXh0TW9kZWxTeW5jU2VydmVyLiRhY2NlcHRSZW1vdmVkTW9kZWwodCl9YXN5bmMgJGNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0cyh0LG4scil7Y29uc3Qgcz10aGlzLl9nZXRNb2RlbCh0KTtyZXR1cm4gcz9rYS5jb21wdXRlVW5pY29kZUhpZ2hsaWdodHMocyxuLHIpOntyYW5nZXM6W10saGFzTW9yZTohMSxhbWJpZ3VvdXNDaGFyYWN0ZXJDb3VudDowLGludmlzaWJsZUNoYXJhY3RlckNvdW50OjAsbm9uQmFzaWNBc2NpaUNoYXJhY3RlckNvdW50OjB9fWFzeW5jICRmaW5kU2VjdGlvbkhlYWRlcnModCxuKXtjb25zdCByPXRoaXMuX2dldE1vZGVsKHQpO3JldHVybiByP3gxKHIsbik6W119YXN5bmMgJGNvbXB1dGVEaWZmKHQsbixyLHMpe2NvbnN0IGk9dGhpcy5fZ2V0TW9kZWwodCksbz10aGlzLl9nZXRNb2RlbChuKTtyZXR1cm4haXx8IW8/bnVsbDpNdC5jb21wdXRlRGlmZihpLG8scixzKX1zdGF0aWMgY29tcHV0ZURpZmYodCxuLHIscyl7Y29uc3QgaT1zPT09ImFkdmFuY2VkIj9Ncy5nZXREZWZhdWx0KCk6TXMuZ2V0TGVnYWN5KCksbz10LmdldExpbmVzQ29udGVudCgpLGw9bi5nZXRMaW5lc0NvbnRlbnQoKSx1PWkuY29tcHV0ZURpZmYobyxsLHIpLGM9dS5jaGFuZ2VzLmxlbmd0aD4wPyExOnRoaXMuX21vZGVsc0FyZUlkZW50aWNhbCh0LG4pO2Z1bmN0aW9uIGgoZil7cmV0dXJuIGYubWFwKGQ9Pnt2YXIgbTtyZXR1cm5bZC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIsZC5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLGQubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLGQubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSwobT1kLmlubmVyQ2hhbmdlcyk9PW51bGw/dm9pZCAwOm0ubWFwKGc9PltnLm9yaWdpbmFsUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLGcub3JpZ2luYWxSYW5nZS5zdGFydENvbHVtbixnLm9yaWdpbmFsUmFuZ2UuZW5kTGluZU51bWJlcixnLm9yaWdpbmFsUmFuZ2UuZW5kQ29sdW1uLGcubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXIsZy5tb2RpZmllZFJhbmdlLnN0YXJ0Q29sdW1uLGcubW9kaWZpZWRSYW5nZS5lbmRMaW5lTnVtYmVyLGcubW9kaWZpZWRSYW5nZS5lbmRDb2x1bW5dKV19KX1yZXR1cm57aWRlbnRpY2FsOmMscXVpdEVhcmx5OnUuaGl0VGltZW91dCxjaGFuZ2VzOmgodS5jaGFuZ2VzKSxtb3Zlczp1Lm1vdmVzLm1hcChmPT5bZi5saW5lUmFuZ2VNYXBwaW5nLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcixmLmxpbmVSYW5nZU1hcHBpbmcub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxmLmxpbmVSYW5nZU1hcHBpbmcubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLGYubGluZVJhbmdlTWFwcGluZy5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLGgoZi5jaGFuZ2VzKV0pfX1zdGF0aWMgX21vZGVsc0FyZUlkZW50aWNhbCh0LG4pe2NvbnN0IHI9dC5nZXRMaW5lQ291bnQoKSxzPW4uZ2V0TGluZUNvdW50KCk7aWYociE9PXMpcmV0dXJuITE7Zm9yKGxldCBpPTE7aTw9cjtpKyspe2NvbnN0IG89dC5nZXRMaW5lQ29udGVudChpKSxsPW4uZ2V0TGluZUNvbnRlbnQoaSk7aWYobyE9PWwpcmV0dXJuITF9cmV0dXJuITB9YXN5bmMgJGNvbXB1dGVNb3JlTWluaW1hbEVkaXRzKHQsbixyKXtjb25zdCBzPXRoaXMuX2dldE1vZGVsKHQpO2lmKCFzKXJldHVybiBuO2NvbnN0IGk9W107bGV0IG87bj1uLnNsaWNlKDApLnNvcnQoKHUsYyk9PntpZih1LnJhbmdlJiZjLnJhbmdlKXJldHVybiBrLmNvbXBhcmVSYW5nZXNVc2luZ1N0YXJ0cyh1LnJhbmdlLGMucmFuZ2UpO2NvbnN0IGg9dS5yYW5nZT8wOjEsZj1jLnJhbmdlPzA6MTtyZXR1cm4gaC1mfSk7bGV0IGw9MDtmb3IobGV0IHU9MTt1PG4ubGVuZ3RoO3UrKylrLmdldEVuZFBvc2l0aW9uKG5bbF0ucmFuZ2UpLmVxdWFscyhrLmdldFN0YXJ0UG9zaXRpb24oblt1XS5yYW5nZSkpPyhuW2xdLnJhbmdlPWsuZnJvbVBvc2l0aW9ucyhrLmdldFN0YXJ0UG9zaXRpb24obltsXS5yYW5nZSksay5nZXRFbmRQb3NpdGlvbihuW3VdLnJhbmdlKSksbltsXS50ZXh0Kz1uW3VdLnRleHQpOihsKyssbltsXT1uW3VdKTtuLmxlbmd0aD1sKzE7Zm9yKGxldHtyYW5nZTp1LHRleHQ6Yyxlb2w6aH1vZiBuKXtpZih0eXBlb2YgaD09Im51bWJlciImJihvPWgpLGsuaXNFbXB0eSh1KSYmIWMpY29udGludWU7Y29uc3QgZj1zLmdldFZhbHVlSW5SYW5nZSh1KTtpZihjPWMucmVwbGFjZSgvXHJcbnxcbnxcci9nLHMuZW9sKSxmPT09Yyljb250aW51ZTtpZihNYXRoLm1heChjLmxlbmd0aCxmLmxlbmd0aCk+TXQuX2RpZmZMaW1pdCl7aS5wdXNoKHtyYW5nZTp1LHRleHQ6Y30pO2NvbnRpbnVlfWNvbnN0IGQ9ZWEoZixjLHIpLG09cy5vZmZzZXRBdChrLmxpZnQodSkuZ2V0U3RhcnRQb3NpdGlvbigpKTtmb3IoY29uc3QgZyBvZiBkKXtjb25zdCBiPXMucG9zaXRpb25BdChtK2cub3JpZ2luYWxTdGFydCksXz1zLnBvc2l0aW9uQXQobStnLm9yaWdpbmFsU3RhcnQrZy5vcmlnaW5hbExlbmd0aCksdj17dGV4dDpjLnN1YnN0cihnLm1vZGlmaWVkU3RhcnQsZy5tb2RpZmllZExlbmd0aCkscmFuZ2U6e3N0YXJ0TGluZU51bWJlcjpiLmxpbmVOdW1iZXIsc3RhcnRDb2x1bW46Yi5jb2x1bW4sZW5kTGluZU51bWJlcjpfLmxpbmVOdW1iZXIsZW5kQ29sdW1uOl8uY29sdW1ufX07cy5nZXRWYWx1ZUluUmFuZ2Uodi5yYW5nZSkhPT12LnRleHQmJmkucHVzaCh2KX19cmV0dXJuIHR5cGVvZiBvPT0ibnVtYmVyIiYmaS5wdXNoKHtlb2w6byx0ZXh0OiIiLHJhbmdlOntzdGFydExpbmVOdW1iZXI6MCxzdGFydENvbHVtbjowLGVuZExpbmVOdW1iZXI6MCxlbmRDb2x1bW46MH19KSxpfWFzeW5jICRjb21wdXRlTGlua3ModCl7Y29uc3Qgbj10aGlzLl9nZXRNb2RlbCh0KTtyZXR1cm4gbj9pYShuKTpudWxsfWFzeW5jICRjb21wdXRlRGVmYXVsdERvY3VtZW50Q29sb3JzKHQpe2NvbnN0IG49dGhpcy5fZ2V0TW9kZWwodCk7cmV0dXJuIG4/ZzEobik6bnVsbH1hc3luYyAkdGV4dHVhbFN1Z2dlc3QodCxuLHIscyl7Y29uc3QgaT1uZXcgZHQsbz1uZXcgUmVnRXhwKHIscyksbD1uZXcgU2V0O2U6Zm9yKGNvbnN0IHUgb2YgdCl7Y29uc3QgYz10aGlzLl9nZXRNb2RlbCh1KTtpZihjKXtmb3IoY29uc3QgaCBvZiBjLndvcmRzKG8pKWlmKCEoaD09PW58fCFpc05hTihOdW1iZXIoaCkpKSYmKGwuYWRkKGgpLGwuc2l6ZT5NdC5fc3VnZ2VzdGlvbnNMaW1pdCkpYnJlYWsgZX19cmV0dXJue3dvcmRzOkFycmF5LmZyb20obCksZHVyYXRpb246aS5lbGFwc2VkKCl9fWFzeW5jICRjb21wdXRlV29yZFJhbmdlcyh0LG4scixzKXtjb25zdCBpPXRoaXMuX2dldE1vZGVsKHQpO2lmKCFpKXJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO2NvbnN0IG89bmV3IFJlZ0V4cChyLHMpLGw9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IHU9bi5zdGFydExpbmVOdW1iZXI7dTxuLmVuZExpbmVOdW1iZXI7dSsrKXtjb25zdCBjPWkuZ2V0TGluZVdvcmRzKHUsbyk7Zm9yKGNvbnN0IGggb2YgYyl7aWYoIWlzTmFOKE51bWJlcihoLndvcmQpKSljb250aW51ZTtsZXQgZj1sW2gud29yZF07Znx8KGY9W10sbFtoLndvcmRdPWYpLGYucHVzaCh7c3RhcnRMaW5lTnVtYmVyOnUsc3RhcnRDb2x1bW46aC5zdGFydENvbHVtbixlbmRMaW5lTnVtYmVyOnUsZW5kQ29sdW1uOmguZW5kQ29sdW1ufSl9fXJldHVybiBsfWFzeW5jICRuYXZpZ2F0ZVZhbHVlU2V0KHQsbixyLHMsaSl7Y29uc3Qgbz10aGlzLl9nZXRNb2RlbCh0KTtpZighbylyZXR1cm4gbnVsbDtjb25zdCBsPW5ldyBSZWdFeHAocyxpKTtuLnN0YXJ0Q29sdW1uPT09bi5lbmRDb2x1bW4mJihuPXtzdGFydExpbmVOdW1iZXI6bi5zdGFydExpbmVOdW1iZXIsc3RhcnRDb2x1bW46bi5zdGFydENvbHVtbixlbmRMaW5lTnVtYmVyOm4uZW5kTGluZU51bWJlcixlbmRDb2x1bW46bi5lbmRDb2x1bW4rMX0pO2NvbnN0IHU9by5nZXRWYWx1ZUluUmFuZ2UobiksYz1vLmdldFdvcmRBdFBvc2l0aW9uKHtsaW5lTnVtYmVyOm4uc3RhcnRMaW5lTnVtYmVyLGNvbHVtbjpuLnN0YXJ0Q29sdW1ufSxsKTtpZighYylyZXR1cm4gbnVsbDtjb25zdCBoPW8uZ2V0VmFsdWVJblJhbmdlKGMpO3JldHVybiBzbi5JTlNUQU5DRS5uYXZpZ2F0ZVZhbHVlU2V0KG4sdSxjLGgscil9fTtJdC5fZGlmZkxpbWl0PTFlNSxJdC5fc3VnZ2VzdGlvbnNMaW1pdD0xZTQ7bGV0IFNuPUl0O2NsYXNzIE10IGV4dGVuZHMgU257Y29uc3RydWN0b3IodCxuKXtzdXBlcigpLHRoaXMuX2hvc3Q9dCx0aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeT1uLHRoaXMuX2ZvcmVpZ25Nb2R1bGU9bnVsbH1hc3luYyAkcGluZygpe3JldHVybiJwb25nIn0kbG9hZEZvcmVpZ25Nb2R1bGUodCxuLHIpe2NvbnN0IG89e2hvc3Q6dmEociwobCx1KT0+dGhpcy5faG9zdC4kZmhyKGwsdSkpLGdldE1pcnJvck1vZGVsczooKT0+dGhpcy5fZ2V0TW9kZWxzKCl9O3JldHVybiB0aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeT8odGhpcy5fZm9yZWlnbk1vZHVsZT10aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeShvLG4pLFByb21pc2UucmVzb2x2ZShycyh0aGlzLl9mb3JlaWduTW9kdWxlKSkpOm5ldyBQcm9taXNlKChsLHUpPT57Y29uc3QgYz1oPT57dGhpcy5fZm9yZWlnbk1vZHVsZT1oLmNyZWF0ZShvLG4pLGwocnModGhpcy5fZm9yZWlnbk1vZHVsZSkpfTtpbXBvcnQoYCR7SG4uYXNCcm93c2VyVXJpKGAke3R9LmpzYCkudG9TdHJpbmcoITApfWApLnRoZW4oYykuY2F0Y2godSl9KX0kZm1yKHQsbil7aWYoIXRoaXMuX2ZvcmVpZ25Nb2R1bGV8fHR5cGVvZiB0aGlzLl9mb3JlaWduTW9kdWxlW3RdIT0iZnVuY3Rpb24iKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIk1pc3NpbmcgcmVxdWVzdEhhbmRsZXIgb3IgbWV0aG9kOiAiK3QpKTt0cnl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9mb3JlaWduTW9kdWxlW3RdLmFwcGx5KHRoaXMuX2ZvcmVpZ25Nb2R1bGUsbikpfWNhdGNoKHIpe3JldHVybiBQcm9taXNlLnJlamVjdChyKX19fXR5cGVvZiBpbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iJiYoZ2xvYmFsVGhpcy5tb25hY289YmEoKSk7bGV0IENuPSExO2Z1bmN0aW9uIEExKGUpe2lmKENuKXJldHVybjtDbj0hMDtjb25zdCB0PW5ldyBaaShuPT57Z2xvYmFsVGhpcy5wb3N0TWVzc2FnZShuKX0sbj0+bmV3IE10KG1uLmdldENoYW5uZWwobiksZSkpO2dsb2JhbFRoaXMub25tZXNzYWdlPW49Pnt0Lm9ubWVzc2FnZShuLmRhdGEpfX1nbG9iYWxUaGlzLm9ubWVzc2FnZT1lPT57Q258fEExKG51bGwpfX0pKCk7Cg==", JNe = (s) => Uint8Array.from(atob(s), (e) => e.charCodeAt(0)), jB = typeof self < "u" && self.Blob && new Blob([JNe(b8)], { type: "text/javascript;charset=utf-8" }); -function UNe(s) { +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/ +var ERe = Object.defineProperty, DRe = Object.getOwnPropertyDescriptor, FRe = Object.getOwnPropertyNames, zRe = Object.prototype.hasOwnProperty, ARe = (s, e, t, i) => { + if (e && typeof e == "object" || typeof e == "function") + for (let n of FRe(e)) + !zRe.call(s, n) && n !== t && ERe(s, n, { get: () => e[n], enumerable: !(i = DRe(e, n)) || i.enumerable }); + return s; +}, KRe = (s, e, t) => (ARe(s, e, "default"), t), kf = {}; +KRe(kf, C0); +var j8 = {}, SN = {}, URe = class q8 { + static getOrCreate(e) { + return SN[e] || (SN[e] = new q8(e)), SN[e]; + } + constructor(e) { + this._languageId = e, this._loadingTriggered = !1, this._lazyLoadPromise = new Promise((t, i) => { + this._lazyLoadPromiseResolve = t, this._lazyLoadPromiseReject = i; + }); + } + load() { + return this._loadingTriggered || (this._loadingTriggered = !0, j8[this._languageId].loader().then( + (e) => this._lazyLoadPromiseResolve(e), + (e) => this._lazyLoadPromiseReject(e) + )), this._lazyLoadPromise; + } +}; +function PRe(s) { + const e = s.id; + j8[e] = s, kf.languages.register(s); + const t = URe.getOrCreate(e); + kf.languages.registerTokensProviderFactory(e, { + create: async () => (await t.load()).language + }), kf.languages.onLanguageEncountered(e, async () => { + const i = await t.load(); + kf.languages.setLanguageConfiguration(e, i.conf); + }); +} +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/ +PRe({ + id: "yaml", + extensions: [".yaml", ".yml"], + aliases: ["YAML", "yaml", "YML", "yml"], + mimetypes: ["application/x-yaml", "text/x-yaml"], + loader: () => Promise.resolve().then(() => Ewe) +}); +const $8 = "KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBCcyxxcyxVcywkcztjbGFzcyBIc3tjb25zdHJ1Y3Rvcigpe3RoaXMubGlzdGVuZXJzPVtdLHRoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcj1mdW5jdGlvbih0KXtzZXRUaW1lb3V0KCgpPT57dGhyb3cgdC5zdGFjaz9QZS5pc0Vycm9yTm9UZWxlbWV0cnkodCk/bmV3IFBlKHQubWVzc2FnZStgCgpgK3Quc3RhY2spOm5ldyBFcnJvcih0Lm1lc3NhZ2UrYAoKYCt0LnN0YWNrKTp0fSwwKX19ZW1pdCh0KXt0aGlzLmxpc3RlbmVycy5mb3JFYWNoKG49PntuKHQpfSl9b25VbmV4cGVjdGVkRXJyb3IodCl7dGhpcy51bmV4cGVjdGVkRXJyb3JIYW5kbGVyKHQpLHRoaXMuZW1pdCh0KX1vblVuZXhwZWN0ZWRFeHRlcm5hbEVycm9yKHQpe3RoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcih0KX19Y29uc3QgV3M9bmV3IEhzO2Z1bmN0aW9uIEplKGUpe3pzKGUpfHxXcy5vblVuZXhwZWN0ZWRFcnJvcihlKX1mdW5jdGlvbiBSbihlKXtpZihlIGluc3RhbmNlb2YgRXJyb3Ipe2NvbnN0e25hbWU6dCxtZXNzYWdlOm59PWUscj1lLnN0YWNrdHJhY2V8fGUuc3RhY2s7cmV0dXJueyRpc0Vycm9yOiEwLG5hbWU6dCxtZXNzYWdlOm4sc3RhY2s6cixub1RlbGVtZXRyeTpQZS5pc0Vycm9yTm9UZWxlbWV0cnkoZSl9fXJldHVybiBlfWNvbnN0IHF0PSJDYW5jZWxlZCI7ZnVuY3Rpb24genMoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBPcz8hMDplIGluc3RhbmNlb2YgRXJyb3ImJmUubmFtZT09PXF0JiZlLm1lc3NhZ2U9PT1xdH1jbGFzcyBPcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKCl7c3VwZXIocXQpLHRoaXMubmFtZT10aGlzLm1lc3NhZ2V9fWNsYXNzIFBlIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5uYW1lPSJDb2RlRXhwZWN0ZWRFcnJvciJ9c3RhdGljIGZyb21FcnJvcih0KXtpZih0IGluc3RhbmNlb2YgUGUpcmV0dXJuIHQ7Y29uc3Qgbj1uZXcgUGU7cmV0dXJuIG4ubWVzc2FnZT10Lm1lc3NhZ2Usbi5zdGFjaz10LnN0YWNrLG59c3RhdGljIGlzRXJyb3JOb1RlbGVtZXRyeSh0KXtyZXR1cm4gdC5uYW1lPT09IkNvZGVFeHBlY3RlZEVycm9yIn19Y2xhc3MgaWUgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0fHwiQW4gdW5leHBlY3RlZCBidWcgb2NjdXJyZWQuIiksT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsaWUucHJvdG90eXBlKX19ZnVuY3Rpb24gR3MoZSx0KXtjb25zdCBuPXRoaXM7bGV0IHI9ITEscztyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcnx8KHI9ITAscz1lLmFwcGx5KG4sYXJndW1lbnRzKSksc319dmFyIGh0OyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHApe3JldHVybiBwJiZ0eXBlb2YgcD09Im9iamVjdCImJnR5cGVvZiBwW1N5bWJvbC5pdGVyYXRvcl09PSJmdW5jdGlvbiJ9ZS5pcz10O2NvbnN0IG49T2JqZWN0LmZyZWV6ZShbXSk7ZnVuY3Rpb24gcigpe3JldHVybiBufWUuZW1wdHk9cjtmdW5jdGlvbipzKHApe3lpZWxkIHB9ZS5zaW5nbGU9cztmdW5jdGlvbiBpKHApe3JldHVybiB0KHApP3A6cyhwKX1lLndyYXA9aTtmdW5jdGlvbiBvKHApe3JldHVybiBwfHxufWUuZnJvbT1vO2Z1bmN0aW9uKmwocCl7Zm9yKGxldCB4PXAubGVuZ3RoLTE7eD49MDt4LS0peWllbGQgcFt4XX1lLnJldmVyc2U9bDtmdW5jdGlvbiB1KHApe3JldHVybiFwfHxwW1N5bWJvbC5pdGVyYXRvcl0oKS5uZXh0KCkuZG9uZT09PSEwfWUuaXNFbXB0eT11O2Z1bmN0aW9uIGMocCl7cmV0dXJuIHBbU3ltYm9sLml0ZXJhdG9yXSgpLm5leHQoKS52YWx1ZX1lLmZpcnN0PWM7ZnVuY3Rpb24gaChwLHgpe2xldCBMPTA7Zm9yKGNvbnN0IEEgb2YgcClpZih4KEEsTCsrKSlyZXR1cm4hMDtyZXR1cm4hMX1lLnNvbWU9aDtmdW5jdGlvbiBmKHAseCl7Zm9yKGNvbnN0IEwgb2YgcClpZih4KEwpKXJldHVybiBMfWUuZmluZD1mO2Z1bmN0aW9uKmQocCx4KXtmb3IoY29uc3QgTCBvZiBwKXgoTCkmJih5aWVsZCBMKX1lLmZpbHRlcj1kO2Z1bmN0aW9uKm0ocCx4KXtsZXQgTD0wO2Zvcihjb25zdCBBIG9mIHApeWllbGQgeChBLEwrKyl9ZS5tYXA9bTtmdW5jdGlvbipnKHAseCl7bGV0IEw9MDtmb3IoY29uc3QgQSBvZiBwKXlpZWxkKngoQSxMKyspfWUuZmxhdE1hcD1nO2Z1bmN0aW9uKmIoLi4ucCl7Zm9yKGNvbnN0IHggb2YgcCl5aWVsZCp4fWUuY29uY2F0PWI7ZnVuY3Rpb24gXyhwLHgsTCl7bGV0IEE9TDtmb3IoY29uc3QgRSBvZiBwKUE9eChBLEUpO3JldHVybiBBfWUucmVkdWNlPV87ZnVuY3Rpb24qdihwLHgsTD1wLmxlbmd0aCl7Zm9yKHg8MCYmKHgrPXAubGVuZ3RoKSxMPDA/TCs9cC5sZW5ndGg6TD5wLmxlbmd0aCYmKEw9cC5sZW5ndGgpO3g8TDt4KyspeWllbGQgcFt4XX1lLnNsaWNlPXY7ZnVuY3Rpb24gUyhwLHg9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKXtjb25zdCBMPVtdO2lmKHg9PT0wKXJldHVybltMLHBdO2NvbnN0IEE9cFtTeW1ib2wuaXRlcmF0b3JdKCk7Zm9yKGxldCBFPTA7RTx4O0UrKyl7Y29uc3QgQj1BLm5leHQoKTtpZihCLmRvbmUpcmV0dXJuW0wsZS5lbXB0eSgpXTtMLnB1c2goQi52YWx1ZSl9cmV0dXJuW0wse1tTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIEF9fV19ZS5jb25zdW1lPVM7YXN5bmMgZnVuY3Rpb24gTihwKXtjb25zdCB4PVtdO2ZvciBhd2FpdChjb25zdCBMIG9mIHApeC5wdXNoKEwpO3JldHVybiBQcm9taXNlLnJlc29sdmUoeCl9ZS5hc3luY1RvQXJyYXk9Tn0pKGh0fHwoaHQ9e30pKTtmdW5jdGlvbiBNMShlKXtyZXR1cm4gZX1mdW5jdGlvbiBrMShlLHQpe31mdW5jdGlvbiB5bihlKXtpZihodC5pcyhlKSl7Y29uc3QgdD1bXTtmb3IoY29uc3QgbiBvZiBlKWlmKG4pdHJ5e24uZGlzcG9zZSgpfWNhdGNoKHIpe3QucHVzaChyKX1pZih0Lmxlbmd0aD09PTEpdGhyb3cgdFswXTtpZih0Lmxlbmd0aD4xKXRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcih0LCJFbmNvdW50ZXJlZCBlcnJvcnMgd2hpbGUgZGlzcG9zaW5nIG9mIHN0b3JlIik7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/W106ZX1lbHNlIGlmKGUpcmV0dXJuIGUuZGlzcG9zZSgpLGV9ZnVuY3Rpb24ganMoLi4uZSl7cmV0dXJuIGZ0KCgpPT55bihlKSl9ZnVuY3Rpb24gZnQoZSl7cmV0dXJue2Rpc3Bvc2U6R3MoKCk9PntlKCl9KX19Y29uc3Qga3Q9Y2xhc3Mga3R7Y29uc3RydWN0b3IoKXt0aGlzLl90b0Rpc3Bvc2U9bmV3IFNldCx0aGlzLl9pc0Rpc3Bvc2VkPSExfWRpc3Bvc2UoKXt0aGlzLl9pc0Rpc3Bvc2VkfHwodGhpcy5faXNEaXNwb3NlZD0hMCx0aGlzLmNsZWFyKCkpfWdldCBpc0Rpc3Bvc2VkKCl7cmV0dXJuIHRoaXMuX2lzRGlzcG9zZWR9Y2xlYXIoKXtpZih0aGlzLl90b0Rpc3Bvc2Uuc2l6ZSE9PTApdHJ5e3luKHRoaXMuX3RvRGlzcG9zZSl9ZmluYWxseXt0aGlzLl90b0Rpc3Bvc2UuY2xlYXIoKX19YWRkKHQpe2lmKCF0KXJldHVybiB0O2lmKHQ9PT10aGlzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIGEgZGlzcG9zYWJsZSBvbiBpdHNlbGYhIik7cmV0dXJuIHRoaXMuX2lzRGlzcG9zZWQ/a3QuRElTQUJMRV9ESVNQT1NFRF9XQVJOSU5HfHxjb25zb2xlLndhcm4obmV3IEVycm9yKCJUcnlpbmcgdG8gYWRkIGEgZGlzcG9zYWJsZSB0byBhIERpc3Bvc2FibGVTdG9yZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQgb2YuIFRoZSBhZGRlZCBvYmplY3Qgd2lsbCBiZSBsZWFrZWQhIikuc3RhY2spOnRoaXMuX3RvRGlzcG9zZS5hZGQodCksdH1kZWxldGVBbmRMZWFrKHQpe3QmJnRoaXMuX3RvRGlzcG9zZS5oYXModCkmJnRoaXMuX3RvRGlzcG9zZS5kZWxldGUodCl9fTtrdC5ESVNBQkxFX0RJU1BPU0VEX1dBUk5JTkc9ITE7bGV0IFplPWt0O2NvbnN0IEFuPWNsYXNzIEFue2NvbnN0cnVjdG9yKCl7dGhpcy5fc3RvcmU9bmV3IFplLHRoaXMuX3N0b3JlfWRpc3Bvc2UoKXt0aGlzLl9zdG9yZS5kaXNwb3NlKCl9X3JlZ2lzdGVyKHQpe2lmKHQ9PT10aGlzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIGEgZGlzcG9zYWJsZSBvbiBpdHNlbGYhIik7cmV0dXJuIHRoaXMuX3N0b3JlLmFkZCh0KX19O0FuLk5vbmU9T2JqZWN0LmZyZWV6ZSh7ZGlzcG9zZSgpe319KTtsZXQgRmU9QW47Y29uc3QgT2U9Y2xhc3MgT2V7Y29uc3RydWN0b3IodCl7dGhpcy5lbGVtZW50PXQsdGhpcy5uZXh0PU9lLlVuZGVmaW5lZCx0aGlzLnByZXY9T2UuVW5kZWZpbmVkfX07T2UuVW5kZWZpbmVkPW5ldyBPZSh2b2lkIDApO2xldCBPPU9lO2NsYXNzIFhze2NvbnN0cnVjdG9yKCl7dGhpcy5fZmlyc3Q9Ty5VbmRlZmluZWQsdGhpcy5fbGFzdD1PLlVuZGVmaW5lZCx0aGlzLl9zaXplPTB9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5fc2l6ZX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMuX2ZpcnN0PT09Ty5VbmRlZmluZWR9Y2xlYXIoKXtsZXQgdD10aGlzLl9maXJzdDtmb3IoO3QhPT1PLlVuZGVmaW5lZDspe2NvbnN0IG49dC5uZXh0O3QucHJldj1PLlVuZGVmaW5lZCx0Lm5leHQ9Ty5VbmRlZmluZWQsdD1ufXRoaXMuX2ZpcnN0PU8uVW5kZWZpbmVkLHRoaXMuX2xhc3Q9Ty5VbmRlZmluZWQsdGhpcy5fc2l6ZT0wfXVuc2hpZnQodCl7cmV0dXJuIHRoaXMuX2luc2VydCh0LCExKX1wdXNoKHQpe3JldHVybiB0aGlzLl9pbnNlcnQodCwhMCl9X2luc2VydCh0LG4pe2NvbnN0IHI9bmV3IE8odCk7aWYodGhpcy5fZmlyc3Q9PT1PLlVuZGVmaW5lZCl0aGlzLl9maXJzdD1yLHRoaXMuX2xhc3Q9cjtlbHNlIGlmKG4pe2NvbnN0IGk9dGhpcy5fbGFzdDt0aGlzLl9sYXN0PXIsci5wcmV2PWksaS5uZXh0PXJ9ZWxzZXtjb25zdCBpPXRoaXMuX2ZpcnN0O3RoaXMuX2ZpcnN0PXIsci5uZXh0PWksaS5wcmV2PXJ9dGhpcy5fc2l6ZSs9MTtsZXQgcz0hMTtyZXR1cm4oKT0+e3N8fChzPSEwLHRoaXMuX3JlbW92ZShyKSl9fXNoaWZ0KCl7aWYodGhpcy5fZmlyc3QhPT1PLlVuZGVmaW5lZCl7Y29uc3QgdD10aGlzLl9maXJzdC5lbGVtZW50O3JldHVybiB0aGlzLl9yZW1vdmUodGhpcy5fZmlyc3QpLHR9fXBvcCgpe2lmKHRoaXMuX2xhc3QhPT1PLlVuZGVmaW5lZCl7Y29uc3QgdD10aGlzLl9sYXN0LmVsZW1lbnQ7cmV0dXJuIHRoaXMuX3JlbW92ZSh0aGlzLl9sYXN0KSx0fX1fcmVtb3ZlKHQpe2lmKHQucHJldiE9PU8uVW5kZWZpbmVkJiZ0Lm5leHQhPT1PLlVuZGVmaW5lZCl7Y29uc3Qgbj10LnByZXY7bi5uZXh0PXQubmV4dCx0Lm5leHQucHJldj1ufWVsc2UgdC5wcmV2PT09Ty5VbmRlZmluZWQmJnQubmV4dD09PU8uVW5kZWZpbmVkPyh0aGlzLl9maXJzdD1PLlVuZGVmaW5lZCx0aGlzLl9sYXN0PU8uVW5kZWZpbmVkKTp0Lm5leHQ9PT1PLlVuZGVmaW5lZD8odGhpcy5fbGFzdD10aGlzLl9sYXN0LnByZXYsdGhpcy5fbGFzdC5uZXh0PU8uVW5kZWZpbmVkKTp0LnByZXY9PT1PLlVuZGVmaW5lZCYmKHRoaXMuX2ZpcnN0PXRoaXMuX2ZpcnN0Lm5leHQsdGhpcy5fZmlyc3QucHJldj1PLlVuZGVmaW5lZCk7dGhpcy5fc2l6ZS09MX0qW1N5bWJvbC5pdGVyYXRvcl0oKXtsZXQgdD10aGlzLl9maXJzdDtmb3IoO3QhPT1PLlVuZGVmaW5lZDspeWllbGQgdC5lbGVtZW50LHQ9dC5uZXh0fX1jb25zdCBRcz1nbG9iYWxUaGlzLnBlcmZvcm1hbmNlJiZ0eXBlb2YgZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZS5ub3c9PSJmdW5jdGlvbiI7Y2xhc3MgZHR7c3RhdGljIGNyZWF0ZSh0KXtyZXR1cm4gbmV3IGR0KHQpfWNvbnN0cnVjdG9yKHQpe3RoaXMuX25vdz1RcyYmdD09PSExP0RhdGUubm93Omdsb2JhbFRoaXMucGVyZm9ybWFuY2Uubm93LmJpbmQoZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZSksdGhpcy5fc3RhcnRUaW1lPXRoaXMuX25vdygpLHRoaXMuX3N0b3BUaW1lPS0xfXN0b3AoKXt0aGlzLl9zdG9wVGltZT10aGlzLl9ub3coKX1yZXNldCgpe3RoaXMuX3N0YXJ0VGltZT10aGlzLl9ub3coKSx0aGlzLl9zdG9wVGltZT0tMX1lbGFwc2VkKCl7cmV0dXJuIHRoaXMuX3N0b3BUaW1lIT09LTE/dGhpcy5fc3RvcFRpbWUtdGhpcy5fc3RhcnRUaW1lOnRoaXMuX25vdygpLXRoaXMuX3N0YXJ0VGltZX19dmFyIG10OyhmdW5jdGlvbihlKXtlLk5vbmU9KCk9PkZlLk5vbmU7ZnVuY3Rpb24gdChDLHcpe3JldHVybiBkKEMsKCk9Pnt9LDAsdm9pZCAwLCEwLHZvaWQgMCx3KX1lLmRlZmVyPXQ7ZnVuY3Rpb24gbihDKXtyZXR1cm4odyx5PW51bGwsUik9PntsZXQgUD0hMSxJO3JldHVybiBJPUMoVT0+e2lmKCFQKXJldHVybiBJP0kuZGlzcG9zZSgpOlA9ITAsdy5jYWxsKHksVSl9LG51bGwsUiksUCYmSS5kaXNwb3NlKCksSX19ZS5vbmNlPW47ZnVuY3Rpb24gcihDLHcpe3JldHVybiBlLm9uY2UoZS5maWx0ZXIoQyx3KSl9ZS5vbmNlSWY9cjtmdW5jdGlvbiBzKEMsdyx5KXtyZXR1cm4gaCgoUixQPW51bGwsSSk9PkMoVT0+Ui5jYWxsKFAsdyhVKSksbnVsbCxJKSx5KX1lLm1hcD1zO2Z1bmN0aW9uIGkoQyx3LHkpe3JldHVybiBoKChSLFA9bnVsbCxJKT0+QyhVPT57dyhVKSxSLmNhbGwoUCxVKX0sbnVsbCxJKSx5KX1lLmZvckVhY2g9aTtmdW5jdGlvbiBvKEMsdyx5KXtyZXR1cm4gaCgoUixQPW51bGwsSSk9PkMoVT0+dyhVKSYmUi5jYWxsKFAsVSksbnVsbCxJKSx5KX1lLmZpbHRlcj1vO2Z1bmN0aW9uIGwoQyl7cmV0dXJuIEN9ZS5zaWduYWw9bDtmdW5jdGlvbiB1KC4uLkMpe3JldHVybih3LHk9bnVsbCxSKT0+e2NvbnN0IFA9anMoLi4uQy5tYXAoST0+SShVPT53LmNhbGwoeSxVKSkpKTtyZXR1cm4gZihQLFIpfX1lLmFueT11O2Z1bmN0aW9uIGMoQyx3LHksUil7bGV0IFA9eTtyZXR1cm4gcyhDLEk9PihQPXcoUCxJKSxQKSxSKX1lLnJlZHVjZT1jO2Z1bmN0aW9uIGgoQyx3KXtsZXQgeTtjb25zdCBSPXtvbldpbGxBZGRGaXJzdExpc3RlbmVyKCl7eT1DKFAuZmlyZSxQKX0sb25EaWRSZW1vdmVMYXN0TGlzdGVuZXIoKXt5PT1udWxsfHx5LmRpc3Bvc2UoKX19LFA9bmV3IG9lKFIpO3JldHVybiB3PT1udWxsfHx3LmFkZChQKSxQLmV2ZW50fWZ1bmN0aW9uIGYoQyx3KXtyZXR1cm4gdyBpbnN0YW5jZW9mIEFycmF5P3cucHVzaChDKTp3JiZ3LmFkZChDKSxDfWZ1bmN0aW9uIGQoQyx3LHk9MTAwLFI9ITEsUD0hMSxJLFUpe2xldCBKLHRlLFllLFZ0PTAsa2U7Y29uc3QgUjE9e2xlYWtXYXJuaW5nVGhyZXNob2xkOkksb25XaWxsQWRkRmlyc3RMaXN0ZW5lcigpe0o9Qyh5MT0+e1Z0KyssdGU9dyh0ZSx5MSksUiYmIVllJiYoQnQuZmlyZSh0ZSksdGU9dm9pZCAwKSxrZT0oKT0+e2NvbnN0IEUxPXRlO3RlPXZvaWQgMCxZZT12b2lkIDAsKCFSfHxWdD4xKSYmQnQuZmlyZShFMSksVnQ9MH0sdHlwZW9mIHk9PSJudW1iZXIiPyhjbGVhclRpbWVvdXQoWWUpLFllPXNldFRpbWVvdXQoa2UseSkpOlllPT09dm9pZCAwJiYoWWU9MCxxdWV1ZU1pY3JvdGFzayhrZSkpfSl9LG9uV2lsbFJlbW92ZUxpc3RlbmVyKCl7UCYmVnQ+MCYmKGtlPT1udWxsfHxrZSgpKX0sb25EaWRSZW1vdmVMYXN0TGlzdGVuZXIoKXtrZT12b2lkIDAsSi5kaXNwb3NlKCl9fSxCdD1uZXcgb2UoUjEpO3JldHVybiBVPT1udWxsfHxVLmFkZChCdCksQnQuZXZlbnR9ZS5kZWJvdW5jZT1kO2Z1bmN0aW9uIG0oQyx3PTAseSl7cmV0dXJuIGUuZGVib3VuY2UoQywoUixQKT0+Uj8oUi5wdXNoKFApLFIpOltQXSx3LHZvaWQgMCwhMCx2b2lkIDAseSl9ZS5hY2N1bXVsYXRlPW07ZnVuY3Rpb24gZyhDLHc9KFIsUCk9PlI9PT1QLHkpe2xldCBSPSEwLFA7cmV0dXJuIG8oQyxJPT57Y29uc3QgVT1SfHwhdyhJLFApO3JldHVybiBSPSExLFA9SSxVfSx5KX1lLmxhdGNoPWc7ZnVuY3Rpb24gYihDLHcseSl7cmV0dXJuW2UuZmlsdGVyKEMsdyx5KSxlLmZpbHRlcihDLFI9PiF3KFIpLHkpXX1lLnNwbGl0PWI7ZnVuY3Rpb24gXyhDLHc9ITEseT1bXSxSKXtsZXQgUD15LnNsaWNlKCksST1DKHRlPT57UD9QLnB1c2godGUpOkouZmlyZSh0ZSl9KTtSJiZSLmFkZChJKTtjb25zdCBVPSgpPT57UD09bnVsbHx8UC5mb3JFYWNoKHRlPT5KLmZpcmUodGUpKSxQPW51bGx9LEo9bmV3IG9lKHtvbldpbGxBZGRGaXJzdExpc3RlbmVyKCl7SXx8KEk9Qyh0ZT0+Si5maXJlKHRlKSksUiYmUi5hZGQoSSkpfSxvbkRpZEFkZEZpcnN0TGlzdGVuZXIoKXtQJiYodz9zZXRUaW1lb3V0KFUpOlUoKSl9LG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyKCl7SSYmSS5kaXNwb3NlKCksST1udWxsfX0pO3JldHVybiBSJiZSLmFkZChKKSxKLmV2ZW50fWUuYnVmZmVyPV87ZnVuY3Rpb24gdihDLHcpe3JldHVybihSLFAsSSk9Pntjb25zdCBVPXcobmV3IE4pO3JldHVybiBDKGZ1bmN0aW9uKEope2NvbnN0IHRlPVUuZXZhbHVhdGUoSik7dGUhPT1TJiZSLmNhbGwoUCx0ZSl9LHZvaWQgMCxJKX19ZS5jaGFpbj12O2NvbnN0IFM9U3ltYm9sKCJIYWx0Q2hhaW5hYmxlIik7Y2xhc3MgTntjb25zdHJ1Y3Rvcigpe3RoaXMuc3RlcHM9W119bWFwKHcpe3JldHVybiB0aGlzLnN0ZXBzLnB1c2godyksdGhpc31mb3JFYWNoKHcpe3JldHVybiB0aGlzLnN0ZXBzLnB1c2goeT0+KHcoeSkseSkpLHRoaXN9ZmlsdGVyKHcpe3JldHVybiB0aGlzLnN0ZXBzLnB1c2goeT0+dyh5KT95OlMpLHRoaXN9cmVkdWNlKHcseSl7bGV0IFI9eTtyZXR1cm4gdGhpcy5zdGVwcy5wdXNoKFA9PihSPXcoUixQKSxSKSksdGhpc31sYXRjaCh3PSh5LFIpPT55PT09Uil7bGV0IHk9ITAsUjtyZXR1cm4gdGhpcy5zdGVwcy5wdXNoKFA9Pntjb25zdCBJPXl8fCF3KFAsUik7cmV0dXJuIHk9ITEsUj1QLEk/UDpTfSksdGhpc31ldmFsdWF0ZSh3KXtmb3IoY29uc3QgeSBvZiB0aGlzLnN0ZXBzKWlmKHc9eSh3KSx3PT09UylicmVhaztyZXR1cm4gd319ZnVuY3Rpb24gcChDLHcseT1SPT5SKXtjb25zdCBSPSguLi5KKT0+VS5maXJlKHkoLi4uSikpLFA9KCk9PkMub24odyxSKSxJPSgpPT5DLnJlbW92ZUxpc3RlbmVyKHcsUiksVT1uZXcgb2Uoe29uV2lsbEFkZEZpcnN0TGlzdGVuZXI6UCxvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcjpJfSk7cmV0dXJuIFUuZXZlbnR9ZS5mcm9tTm9kZUV2ZW50RW1pdHRlcj1wO2Z1bmN0aW9uIHgoQyx3LHk9Uj0+Uil7Y29uc3QgUj0oLi4uSik9PlUuZmlyZSh5KC4uLkopKSxQPSgpPT5DLmFkZEV2ZW50TGlzdGVuZXIodyxSKSxJPSgpPT5DLnJlbW92ZUV2ZW50TGlzdGVuZXIodyxSKSxVPW5ldyBvZSh7b25XaWxsQWRkRmlyc3RMaXN0ZW5lcjpQLG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyOkl9KTtyZXR1cm4gVS5ldmVudH1lLmZyb21ET01FdmVudEVtaXR0ZXI9eDtmdW5jdGlvbiBMKEMpe3JldHVybiBuZXcgUHJvbWlzZSh3PT5uKEMpKHcpKX1lLnRvUHJvbWlzZT1MO2Z1bmN0aW9uIEEoQyl7Y29uc3Qgdz1uZXcgb2U7cmV0dXJuIEMudGhlbih5PT57dy5maXJlKHkpfSwoKT0+e3cuZmlyZSh2b2lkIDApfSkuZmluYWxseSgoKT0+e3cuZGlzcG9zZSgpfSksdy5ldmVudH1lLmZyb21Qcm9taXNlPUE7ZnVuY3Rpb24gRShDLHcpe3JldHVybiBDKHk9PncuZmlyZSh5KSl9ZS5mb3J3YXJkPUU7ZnVuY3Rpb24gQihDLHcseSl7cmV0dXJuIHcoeSksQyhSPT53KFIpKX1lLnJ1bkFuZFN1YnNjcmliZT1CO2NsYXNzIFF7Y29uc3RydWN0b3Iodyx5KXt0aGlzLl9vYnNlcnZhYmxlPXcsdGhpcy5fY291bnRlcj0wLHRoaXMuX2hhc0NoYW5nZWQ9ITE7Y29uc3QgUj17b25XaWxsQWRkRmlyc3RMaXN0ZW5lcjooKT0+e3cuYWRkT2JzZXJ2ZXIodGhpcyksdGhpcy5fb2JzZXJ2YWJsZS5yZXBvcnRDaGFuZ2VzKCl9LG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyOigpPT57dy5yZW1vdmVPYnNlcnZlcih0aGlzKX19O3RoaXMuZW1pdHRlcj1uZXcgb2UoUikseSYmeS5hZGQodGhpcy5lbWl0dGVyKX1iZWdpblVwZGF0ZSh3KXt0aGlzLl9jb3VudGVyKyt9aGFuZGxlUG9zc2libGVDaGFuZ2Uodyl7fWhhbmRsZUNoYW5nZSh3LHkpe3RoaXMuX2hhc0NoYW5nZWQ9ITB9ZW5kVXBkYXRlKHcpe3RoaXMuX2NvdW50ZXItLSx0aGlzLl9jb3VudGVyPT09MCYmKHRoaXMuX29ic2VydmFibGUucmVwb3J0Q2hhbmdlcygpLHRoaXMuX2hhc0NoYW5nZWQmJih0aGlzLl9oYXNDaGFuZ2VkPSExLHRoaXMuZW1pdHRlci5maXJlKHRoaXMuX29ic2VydmFibGUuZ2V0KCkpKSl9fWZ1bmN0aW9uIHEoQyx3KXtyZXR1cm4gbmV3IFEoQyx3KS5lbWl0dGVyLmV2ZW50fWUuZnJvbU9ic2VydmFibGU9cTtmdW5jdGlvbiBGKEMpe3JldHVybih3LHksUik9PntsZXQgUD0wLEk9ITE7Y29uc3QgVT17YmVnaW5VcGRhdGUoKXtQKyt9LGVuZFVwZGF0ZSgpe1AtLSxQPT09MCYmKEMucmVwb3J0Q2hhbmdlcygpLEkmJihJPSExLHcuY2FsbCh5KSkpfSxoYW5kbGVQb3NzaWJsZUNoYW5nZSgpe30saGFuZGxlQ2hhbmdlKCl7ST0hMH19O0MuYWRkT2JzZXJ2ZXIoVSksQy5yZXBvcnRDaGFuZ2VzKCk7Y29uc3QgSj17ZGlzcG9zZSgpe0MucmVtb3ZlT2JzZXJ2ZXIoVSl9fTtyZXR1cm4gUiBpbnN0YW5jZW9mIFplP1IuYWRkKEopOkFycmF5LmlzQXJyYXkoUikmJlIucHVzaChKKSxKfX1lLmZyb21PYnNlcnZhYmxlTGlnaHQ9Rn0pKG10fHwobXQ9e30pKTtjb25zdCBHZT1jbGFzcyBHZXtjb25zdHJ1Y3Rvcih0KXt0aGlzLmxpc3RlbmVyQ291bnQ9MCx0aGlzLmludm9jYXRpb25Db3VudD0wLHRoaXMuZWxhcHNlZE92ZXJhbGw9MCx0aGlzLmR1cmF0aW9ucz1bXSx0aGlzLm5hbWU9YCR7dH1fJHtHZS5faWRQb29sKyt9YCxHZS5hbGwuYWRkKHRoaXMpfXN0YXJ0KHQpe3RoaXMuX3N0b3BXYXRjaD1uZXcgZHQsdGhpcy5saXN0ZW5lckNvdW50PXR9c3RvcCgpe2lmKHRoaXMuX3N0b3BXYXRjaCl7Y29uc3QgdD10aGlzLl9zdG9wV2F0Y2guZWxhcHNlZCgpO3RoaXMuZHVyYXRpb25zLnB1c2godCksdGhpcy5lbGFwc2VkT3ZlcmFsbCs9dCx0aGlzLmludm9jYXRpb25Db3VudCs9MSx0aGlzLl9zdG9wV2F0Y2g9dm9pZCAwfX19O0dlLmFsbD1uZXcgU2V0LEdlLl9pZFBvb2w9MDtsZXQgVXQ9R2UsWXM9LTE7Y29uc3QgUHQ9Y2xhc3MgUHR7Y29uc3RydWN0b3IodCxuLHI9KFB0Ll9pZFBvb2wrKykudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDMsIjAiKSl7dGhpcy5fZXJyb3JIYW5kbGVyPXQsdGhpcy50aHJlc2hvbGQ9bix0aGlzLm5hbWU9cix0aGlzLl93YXJuQ291bnRkb3duPTB9ZGlzcG9zZSgpe3ZhciB0Oyh0PXRoaXMuX3N0YWNrcyk9PW51bGx8fHQuY2xlYXIoKX1jaGVjayh0LG4pe2NvbnN0IHI9dGhpcy50aHJlc2hvbGQ7aWYocjw9MHx8bjxyKXJldHVybjt0aGlzLl9zdGFja3N8fCh0aGlzLl9zdGFja3M9bmV3IE1hcCk7Y29uc3Qgcz10aGlzLl9zdGFja3MuZ2V0KHQudmFsdWUpfHwwO2lmKHRoaXMuX3N0YWNrcy5zZXQodC52YWx1ZSxzKzEpLHRoaXMuX3dhcm5Db3VudGRvd24tPTEsdGhpcy5fd2FybkNvdW50ZG93bjw9MCl7dGhpcy5fd2FybkNvdW50ZG93bj1yKi41O2NvbnN0W2ksb109dGhpcy5nZXRNb3N0RnJlcXVlbnRTdGFjaygpLGw9YFske3RoaXMubmFtZX1dIHBvdGVudGlhbCBsaXN0ZW5lciBMRUFLIGRldGVjdGVkLCBoYXZpbmcgJHtufSBsaXN0ZW5lcnMgYWxyZWFkeS4gTU9TVCBmcmVxdWVudCBsaXN0ZW5lciAoJHtvfSk6YDtjb25zb2xlLndhcm4obCksY29uc29sZS53YXJuKGkpO2NvbnN0IHU9bmV3IEpzKGwsaSk7dGhpcy5fZXJyb3JIYW5kbGVyKHUpfXJldHVybigpPT57Y29uc3QgaT10aGlzLl9zdGFja3MuZ2V0KHQudmFsdWUpfHwwO3RoaXMuX3N0YWNrcy5zZXQodC52YWx1ZSxpLTEpfX1nZXRNb3N0RnJlcXVlbnRTdGFjaygpe2lmKCF0aGlzLl9zdGFja3MpcmV0dXJuO2xldCB0LG49MDtmb3IoY29uc3RbcixzXW9mIHRoaXMuX3N0YWNrcykoIXR8fG48cykmJih0PVtyLHNdLG49cyk7cmV0dXJuIHR9fTtQdC5faWRQb29sPTE7bGV0ICR0PVB0O2NsYXNzIEh0e3N0YXRpYyBjcmVhdGUoKXtjb25zdCB0PW5ldyBFcnJvcjtyZXR1cm4gbmV3IEh0KHQuc3RhY2s/PyIiKX1jb25zdHJ1Y3Rvcih0KXt0aGlzLnZhbHVlPXR9cHJpbnQoKXtjb25zb2xlLndhcm4odGhpcy52YWx1ZS5zcGxpdChgCmApLnNsaWNlKDIpLmpvaW4oYApgKSl9fWNsYXNzIEpzIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxuKXtzdXBlcih0KSx0aGlzLm5hbWU9Ikxpc3RlbmVyTGVha0Vycm9yIix0aGlzLnN0YWNrPW59fWNsYXNzIFpzIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxuKXtzdXBlcih0KSx0aGlzLm5hbWU9Ikxpc3RlbmVyUmVmdXNhbEVycm9yIix0aGlzLnN0YWNrPW59fWNsYXNzIFd0e2NvbnN0cnVjdG9yKHQpe3RoaXMudmFsdWU9dH19Y29uc3QgS3M9MjtjbGFzcyBvZXtjb25zdHJ1Y3Rvcih0KXt2YXIgbixyLHMsaTt0aGlzLl9zaXplPTAsdGhpcy5fb3B0aW9ucz10LHRoaXMuX2xlYWthZ2VNb249KG49dGhpcy5fb3B0aW9ucykhPW51bGwmJm4ubGVha1dhcm5pbmdUaHJlc2hvbGQ/bmV3ICR0KCh0PT1udWxsP3ZvaWQgMDp0Lm9uTGlzdGVuZXJFcnJvcik/P0plLCgocj10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6ci5sZWFrV2FybmluZ1RocmVzaG9sZCk/P1lzKTp2b2lkIDAsdGhpcy5fcGVyZk1vbj0ocz10aGlzLl9vcHRpb25zKSE9bnVsbCYmcy5fcHJvZk5hbWU/bmV3IFV0KHRoaXMuX29wdGlvbnMuX3Byb2ZOYW1lKTp2b2lkIDAsdGhpcy5fZGVsaXZlcnlRdWV1ZT0oaT10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6aS5kZWxpdmVyeVF1ZXVlfWRpc3Bvc2UoKXt2YXIgdCxuLHIsczt0aGlzLl9kaXNwb3NlZHx8KHRoaXMuX2Rpc3Bvc2VkPSEwLCgodD10aGlzLl9kZWxpdmVyeVF1ZXVlKT09bnVsbD92b2lkIDA6dC5jdXJyZW50KT09PXRoaXMmJnRoaXMuX2RlbGl2ZXJ5UXVldWUucmVzZXQoKSx0aGlzLl9saXN0ZW5lcnMmJih0aGlzLl9saXN0ZW5lcnM9dm9pZCAwLHRoaXMuX3NpemU9MCksKHI9KG49dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOm4ub25EaWRSZW1vdmVMYXN0TGlzdGVuZXIpPT1udWxsfHxyLmNhbGwobiksKHM9dGhpcy5fbGVha2FnZU1vbik9PW51bGx8fHMuZGlzcG9zZSgpKX1nZXQgZXZlbnQoKXtyZXR1cm4gdGhpcy5fZXZlbnQ/Pyh0aGlzLl9ldmVudD0odCxuLHIpPT57dmFyIGwsdSxjLGgsZjtpZih0aGlzLl9sZWFrYWdlTW9uJiZ0aGlzLl9zaXplPnRoaXMuX2xlYWthZ2VNb24udGhyZXNob2xkKioyKXtjb25zdCBkPWBbJHt0aGlzLl9sZWFrYWdlTW9uLm5hbWV9XSBSRUZVU0VTIHRvIGFjY2VwdCBuZXcgbGlzdGVuZXJzIGJlY2F1c2UgaXQgZXhjZWVkZWQgaXRzIHRocmVzaG9sZCBieSBmYXIgKCR7dGhpcy5fc2l6ZX0gdnMgJHt0aGlzLl9sZWFrYWdlTW9uLnRocmVzaG9sZH0pYDtjb25zb2xlLndhcm4oZCk7Y29uc3QgbT10aGlzLl9sZWFrYWdlTW9uLmdldE1vc3RGcmVxdWVudFN0YWNrKCk/P1siVU5LTk9XTiBzdGFjayIsLTFdLGc9bmV3IFpzKGAke2R9LiBISU5UOiBTdGFjayBzaG93cyBtb3N0IGZyZXF1ZW50IGxpc3RlbmVyICgke21bMV19LXRpbWVzKWAsbVswXSk7cmV0dXJuKCgobD10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6bC5vbkxpc3RlbmVyRXJyb3IpfHxKZSkoZyksRmUuTm9uZX1pZih0aGlzLl9kaXNwb3NlZClyZXR1cm4gRmUuTm9uZTtuJiYodD10LmJpbmQobikpO2NvbnN0IHM9bmV3IFd0KHQpO2xldCBpO3RoaXMuX2xlYWthZ2VNb24mJnRoaXMuX3NpemU+PU1hdGguY2VpbCh0aGlzLl9sZWFrYWdlTW9uLnRocmVzaG9sZCouMikmJihzLnN0YWNrPUh0LmNyZWF0ZSgpLGk9dGhpcy5fbGVha2FnZU1vbi5jaGVjayhzLnN0YWNrLHRoaXMuX3NpemUrMSkpLHRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMgaW5zdGFuY2VvZiBXdD8odGhpcy5fZGVsaXZlcnlRdWV1ZT8/KHRoaXMuX2RlbGl2ZXJ5UXVldWU9bmV3IGVpKSx0aGlzLl9saXN0ZW5lcnM9W3RoaXMuX2xpc3RlbmVycyxzXSk6dGhpcy5fbGlzdGVuZXJzLnB1c2gocyk6KChjPSh1PXRoaXMuX29wdGlvbnMpPT1udWxsP3ZvaWQgMDp1Lm9uV2lsbEFkZEZpcnN0TGlzdGVuZXIpPT1udWxsfHxjLmNhbGwodSx0aGlzKSx0aGlzLl9saXN0ZW5lcnM9cywoZj0oaD10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6aC5vbkRpZEFkZEZpcnN0TGlzdGVuZXIpPT1udWxsfHxmLmNhbGwoaCx0aGlzKSksdGhpcy5fc2l6ZSsrO2NvbnN0IG89ZnQoKCk9PntpPT1udWxsfHxpKCksdGhpcy5fcmVtb3ZlTGlzdGVuZXIocyl9KTtyZXR1cm4gciBpbnN0YW5jZW9mIFplP3IuYWRkKG8pOkFycmF5LmlzQXJyYXkocikmJnIucHVzaChvKSxvfSksdGhpcy5fZXZlbnR9X3JlbW92ZUxpc3RlbmVyKHQpe3ZhciBpLG8sbCx1O2lmKChvPShpPXRoaXMuX29wdGlvbnMpPT1udWxsP3ZvaWQgMDppLm9uV2lsbFJlbW92ZUxpc3RlbmVyKT09bnVsbHx8by5jYWxsKGksdGhpcyksIXRoaXMuX2xpc3RlbmVycylyZXR1cm47aWYodGhpcy5fc2l6ZT09PTEpe3RoaXMuX2xpc3RlbmVycz12b2lkIDAsKHU9KGw9dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOmwub25EaWRSZW1vdmVMYXN0TGlzdGVuZXIpPT1udWxsfHx1LmNhbGwobCx0aGlzKSx0aGlzLl9zaXplPTA7cmV0dXJufWNvbnN0IG49dGhpcy5fbGlzdGVuZXJzLHI9bi5pbmRleE9mKHQpO2lmKHI9PT0tMSl0aHJvdyBjb25zb2xlLmxvZygiZGlzcG9zZWQ/Iix0aGlzLl9kaXNwb3NlZCksY29uc29sZS5sb2coInNpemU/Iix0aGlzLl9zaXplKSxjb25zb2xlLmxvZygiYXJyPyIsSlNPTi5zdHJpbmdpZnkodGhpcy5fbGlzdGVuZXJzKSksbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gZGlzcG9zZSB1bmtub3duIGxpc3RlbmVyIik7dGhpcy5fc2l6ZS0tLG5bcl09dm9pZCAwO2NvbnN0IHM9dGhpcy5fZGVsaXZlcnlRdWV1ZS5jdXJyZW50PT09dGhpcztpZih0aGlzLl9zaXplKktzPD1uLmxlbmd0aCl7bGV0IGM9MDtmb3IobGV0IGg9MDtoPG4ubGVuZ3RoO2grKyluW2hdP25bYysrXT1uW2hdOnMmJih0aGlzLl9kZWxpdmVyeVF1ZXVlLmVuZC0tLGM8dGhpcy5fZGVsaXZlcnlRdWV1ZS5pJiZ0aGlzLl9kZWxpdmVyeVF1ZXVlLmktLSk7bi5sZW5ndGg9Y319X2RlbGl2ZXIodCxuKXt2YXIgcztpZighdClyZXR1cm47Y29uc3Qgcj0oKHM9dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOnMub25MaXN0ZW5lckVycm9yKXx8SmU7aWYoIXIpe3QudmFsdWUobik7cmV0dXJufXRyeXt0LnZhbHVlKG4pfWNhdGNoKGkpe3IoaSl9fV9kZWxpdmVyUXVldWUodCl7Y29uc3Qgbj10LmN1cnJlbnQuX2xpc3RlbmVycztmb3IoO3QuaTx0LmVuZDspdGhpcy5fZGVsaXZlcihuW3QuaSsrXSx0LnZhbHVlKTt0LnJlc2V0KCl9ZmlyZSh0KXt2YXIgbixyLHMsaTtpZigobj10aGlzLl9kZWxpdmVyeVF1ZXVlKSE9bnVsbCYmbi5jdXJyZW50JiYodGhpcy5fZGVsaXZlclF1ZXVlKHRoaXMuX2RlbGl2ZXJ5UXVldWUpLChyPXRoaXMuX3BlcmZNb24pPT1udWxsfHxyLnN0b3AoKSksKHM9dGhpcy5fcGVyZk1vbik9PW51bGx8fHMuc3RhcnQodGhpcy5fc2l6ZSksdGhpcy5fbGlzdGVuZXJzKWlmKHRoaXMuX2xpc3RlbmVycyBpbnN0YW5jZW9mIFd0KXRoaXMuX2RlbGl2ZXIodGhpcy5fbGlzdGVuZXJzLHQpO2Vsc2V7Y29uc3Qgbz10aGlzLl9kZWxpdmVyeVF1ZXVlO28uZW5xdWV1ZSh0aGlzLHQsdGhpcy5fbGlzdGVuZXJzLmxlbmd0aCksdGhpcy5fZGVsaXZlclF1ZXVlKG8pfShpPXRoaXMuX3BlcmZNb24pPT1udWxsfHxpLnN0b3AoKX1oYXNMaXN0ZW5lcnMoKXtyZXR1cm4gdGhpcy5fc2l6ZT4wfX1jbGFzcyBlaXtjb25zdHJ1Y3Rvcigpe3RoaXMuaT0tMSx0aGlzLmVuZD0wfWVucXVldWUodCxuLHIpe3RoaXMuaT0wLHRoaXMuZW5kPXIsdGhpcy5jdXJyZW50PXQsdGhpcy52YWx1ZT1ufXJlc2V0KCl7dGhpcy5pPXRoaXMuZW5kLHRoaXMuY3VycmVudD12b2lkIDAsdGhpcy52YWx1ZT12b2lkIDB9fWZ1bmN0aW9uIHRpKCl7cmV0dXJuIGdsb2JhbFRoaXMuX1ZTQ09ERV9OTFNfTUVTU0FHRVN9ZnVuY3Rpb24gRW4oKXtyZXR1cm4gZ2xvYmFsVGhpcy5fVlNDT0RFX05MU19MQU5HVUFHRX1jb25zdCBuaT1FbigpPT09InBzZXVkbyJ8fHR5cGVvZiBkb2N1bWVudDwidSImJmRvY3VtZW50LmxvY2F0aW9uJiZkb2N1bWVudC5sb2NhdGlvbi5oYXNoLmluZGV4T2YoInBzZXVkbz10cnVlIik+PTA7ZnVuY3Rpb24gTW4oZSx0KXtsZXQgbjtyZXR1cm4gdC5sZW5ndGg9PT0wP249ZTpuPWUucmVwbGFjZSgvXHsoXGQrKVx9L2csKHIscyk9Pntjb25zdCBpPXNbMF0sbz10W2ldO2xldCBsPXI7cmV0dXJuIHR5cGVvZiBvPT0ic3RyaW5nIj9sPW86KHR5cGVvZiBvPT0ibnVtYmVyInx8dHlwZW9mIG89PSJib29sZWFuInx8bz09PXZvaWQgMHx8bz09PW51bGwpJiYobD1TdHJpbmcobykpLGx9KSxuaSYmKG49Iu+8uyIrbi5yZXBsYWNlKC9bYW91ZWldL2csIiQmJCYiKSsi77y9Iiksbn1mdW5jdGlvbiB6KGUsdCwuLi5uKXtyZXR1cm4gTW4odHlwZW9mIGU9PSJudW1iZXIiP3JpKGUsdCk6dCxuKX1mdW5jdGlvbiByaShlLHQpe3ZhciByO2NvbnN0IG49KHI9dGkoKSk9PW51bGw/dm9pZCAwOnJbZV07aWYodHlwZW9mIG4hPSJzdHJpbmciKXtpZih0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIHQ7dGhyb3cgbmV3IEVycm9yKGAhISEgTkxTIE1JU1NJTkc6ICR7ZX0gISEhYCl9cmV0dXJuIG59Y29uc3QgRGU9ImVuIjtsZXQgenQ9ITEsT3Q9ITEsR3Q9ITEsa249ITEsanQ9ITEsZ3QsWHQ9RGUsUG49RGUsc2ksaGU7Y29uc3QgeGU9Z2xvYmFsVGhpcztsZXQgWjt0eXBlb2YgeGUudnNjb2RlPCJ1IiYmdHlwZW9mIHhlLnZzY29kZS5wcm9jZXNzPCJ1Ij9aPXhlLnZzY29kZS5wcm9jZXNzOnR5cGVvZiBwcm9jZXNzPCJ1IiYmdHlwZW9mKChCcz1wcm9jZXNzPT1udWxsP3ZvaWQgMDpwcm9jZXNzLnZlcnNpb25zKT09bnVsbD92b2lkIDA6QnMubm9kZSk9PSJzdHJpbmciJiYoWj1wcm9jZXNzKTtjb25zdCBpaT10eXBlb2YoKHFzPVo9PW51bGw/dm9pZCAwOloudmVyc2lvbnMpPT1udWxsP3ZvaWQgMDpxcy5lbGVjdHJvbik9PSJzdHJpbmciJiYoWj09bnVsbD92b2lkIDA6Wi50eXBlKT09PSJyZW5kZXJlciI7aWYodHlwZW9mIFo9PSJvYmplY3QiKXt6dD1aLnBsYXRmb3JtPT09IndpbjMyIixPdD1aLnBsYXRmb3JtPT09ImRhcndpbiIsR3Q9Wi5wbGF0Zm9ybT09PSJsaW51eCIsR3QmJlouZW52LlNOQVAmJlouZW52LlNOQVBfUkVWSVNJT04sWi5lbnYuQ0l8fFouZW52LkJVSUxEX0FSVElGQUNUU1RBR0lOR0RJUkVDVE9SWSxndD1EZSxYdD1EZTtjb25zdCBlPVouZW52LlZTQ09ERV9OTFNfQ09ORklHO2lmKGUpdHJ5e2NvbnN0IHQ9SlNPTi5wYXJzZShlKTtndD10LnVzZXJMb2NhbGUsUG49dC5vc0xvY2FsZSxYdD10LnJlc29sdmVkTGFuZ3VhZ2V8fERlLHNpPShVcz10Lmxhbmd1YWdlUGFjayk9PW51bGw/dm9pZCAwOlVzLnRyYW5zbGF0aW9uc0NvbmZpZ0ZpbGV9Y2F0Y2h7fWtuPSEwfWVsc2UgdHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCImJiFpaT8oaGU9bmF2aWdhdG9yLnVzZXJBZ2VudCx6dD1oZS5pbmRleE9mKCJXaW5kb3dzIik+PTAsT3Q9aGUuaW5kZXhPZigiTWFjaW50b3NoIik+PTAsKGhlLmluZGV4T2YoIk1hY2ludG9zaCIpPj0wfHxoZS5pbmRleE9mKCJpUGFkIik+PTB8fGhlLmluZGV4T2YoImlQaG9uZSIpPj0wKSYmbmF2aWdhdG9yLm1heFRvdWNoUG9pbnRzJiZuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHM+MCxHdD1oZS5pbmRleE9mKCJMaW51eCIpPj0wLChoZT09bnVsbD92b2lkIDA6aGUuaW5kZXhPZigiTW9iaSIpKT49MCxqdD0hMCxYdD1FbigpfHxEZSxndD1uYXZpZ2F0b3IubGFuZ3VhZ2UudG9Mb3dlckNhc2UoKSxQbj1ndCk6Y29uc29sZS5lcnJvcigiVW5hYmxlIHRvIHJlc29sdmUgcGxhdGZvcm0uIik7Y29uc3QgS2U9enQsYWk9T3Qsb2k9a24sbGk9anQsdWk9anQmJnR5cGVvZiB4ZS5pbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iP3hlLm9yaWdpbjp2b2lkIDAsbWU9aGUsY2k9dHlwZW9mIHhlLnBvc3RNZXNzYWdlPT0iZnVuY3Rpb24iJiYheGUuaW1wb3J0U2NyaXB0czsoKCk9PntpZihjaSl7Y29uc3QgZT1bXTt4ZS5hZGRFdmVudExpc3RlbmVyKCJtZXNzYWdlIixuPT57aWYobi5kYXRhJiZuLmRhdGEudnNjb2RlU2NoZWR1bGVBc3luY1dvcmspZm9yKGxldCByPTAscz1lLmxlbmd0aDtyPHM7cisrKXtjb25zdCBpPWVbcl07aWYoaS5pZD09PW4uZGF0YS52c2NvZGVTY2hlZHVsZUFzeW5jV29yayl7ZS5zcGxpY2UociwxKSxpLmNhbGxiYWNrKCk7cmV0dXJufX19KTtsZXQgdD0wO3JldHVybiBuPT57Y29uc3Qgcj0rK3Q7ZS5wdXNoKHtpZDpyLGNhbGxiYWNrOm59KSx4ZS5wb3N0TWVzc2FnZSh7dnNjb2RlU2NoZWR1bGVBc3luY1dvcms6cn0sIioiKX19cmV0dXJuIGU9PnNldFRpbWVvdXQoZSl9KSgpO2NvbnN0IGhpPSEhKG1lJiZtZS5pbmRleE9mKCJDaHJvbWUiKT49MCk7bWUmJm1lLmluZGV4T2YoIkZpcmVmb3giKT49MCwhaGkmJm1lJiZtZS5pbmRleE9mKCJTYWZhcmkiKT49MCxtZSYmbWUuaW5kZXhPZigiRWRnLyIpPj0wLG1lJiZtZS5pbmRleE9mKCJBbmRyb2lkIik+PTA7ZnVuY3Rpb24gZmkoZSl7cmV0dXJuIGV9Y2xhc3MgZGl7Y29uc3RydWN0b3IodCxuKXt0aGlzLmxhc3RDYWNoZT12b2lkIDAsdGhpcy5sYXN0QXJnS2V5PXZvaWQgMCx0eXBlb2YgdD09ImZ1bmN0aW9uIj8odGhpcy5fZm49dCx0aGlzLl9jb21wdXRlS2V5PWZpKToodGhpcy5fZm49bix0aGlzLl9jb21wdXRlS2V5PXQuZ2V0Q2FjaGVLZXkpfWdldCh0KXtjb25zdCBuPXRoaXMuX2NvbXB1dGVLZXkodCk7cmV0dXJuIHRoaXMubGFzdEFyZ0tleSE9PW4mJih0aGlzLmxhc3RBcmdLZXk9bix0aGlzLmxhc3RDYWNoZT10aGlzLl9mbih0KSksdGhpcy5sYXN0Q2FjaGV9fWNsYXNzIEZue2NvbnN0cnVjdG9yKHQpe3RoaXMuZXhlY3V0b3I9dCx0aGlzLl9kaWRSdW49ITF9Z2V0IHZhbHVlKCl7aWYoIXRoaXMuX2RpZFJ1bil0cnl7dGhpcy5fdmFsdWU9dGhpcy5leGVjdXRvcigpfWNhdGNoKHQpe3RoaXMuX2Vycm9yPXR9ZmluYWxseXt0aGlzLl9kaWRSdW49ITB9aWYodGhpcy5fZXJyb3IpdGhyb3cgdGhpcy5fZXJyb3I7cmV0dXJuIHRoaXMuX3ZhbHVlfWdldCByYXdWYWx1ZSgpe3JldHVybiB0aGlzLl92YWx1ZX19ZnVuY3Rpb24gbWkoZSl7cmV0dXJuIGUucmVwbGFjZSgvW1xcXHtcfVwqXCtcP1x8XF5cJFwuXFtcXVwoXCldL2csIlxcJCYiKX1mdW5jdGlvbiBnaShlKXtyZXR1cm4gZS5zcGxpdCgvXHJcbnxccnxcbi8pfWZ1bmN0aW9uIGJpKGUpe2ZvcihsZXQgdD0wLG49ZS5sZW5ndGg7dDxuO3QrKyl7Y29uc3Qgcj1lLmNoYXJDb2RlQXQodCk7aWYociE9PTMyJiZyIT09OSlyZXR1cm4gdH1yZXR1cm4tMX1mdW5jdGlvbiB4aShlLHQ9ZS5sZW5ndGgtMSl7Zm9yKGxldCBuPXQ7bj49MDtuLS0pe2NvbnN0IHI9ZS5jaGFyQ29kZUF0KG4pO2lmKHIhPT0zMiYmciE9PTkpcmV0dXJuIG59cmV0dXJuLTF9ZnVuY3Rpb24gRG4oZSl7cmV0dXJuIGU+PTY1JiZlPD05MH1mdW5jdGlvbiBRdChlKXtyZXR1cm4gNTUyOTY8PWUmJmU8PTU2MzE5fWZ1bmN0aW9uIHBpKGUpe3JldHVybiA1NjMyMDw9ZSYmZTw9NTczNDN9ZnVuY3Rpb24gX2koZSx0KXtyZXR1cm4oZS01NTI5Njw8MTApKyh0LTU2MzIwKSs2NTUzNn1mdW5jdGlvbiB3aShlLHQsbil7Y29uc3Qgcj1lLmNoYXJDb2RlQXQobik7aWYoUXQocikmJm4rMTx0KXtjb25zdCBzPWUuY2hhckNvZGVBdChuKzEpO2lmKHBpKHMpKXJldHVybiBfaShyLHMpfXJldHVybiByfWNvbnN0IExpPS9eW1x0XG5cclx4MjAtXHg3RV0qJC87ZnVuY3Rpb24gdmkoZSl7cmV0dXJuIExpLnRlc3QoZSl9Y29uc3QgYmU9Y2xhc3MgYmV7c3RhdGljIGdldEluc3RhbmNlKHQpe3JldHVybiBiZS5jYWNoZS5nZXQoQXJyYXkuZnJvbSh0KSl9c3RhdGljIGdldExvY2FsZXMoKXtyZXR1cm4gYmUuX2xvY2FsZXMudmFsdWV9Y29uc3RydWN0b3IodCl7dGhpcy5jb25mdXNhYmxlRGljdGlvbmFyeT10fWlzQW1iaWd1b3VzKHQpe3JldHVybiB0aGlzLmNvbmZ1c2FibGVEaWN0aW9uYXJ5Lmhhcyh0KX1nZXRQcmltYXJ5Q29uZnVzYWJsZSh0KXtyZXR1cm4gdGhpcy5jb25mdXNhYmxlRGljdGlvbmFyeS5nZXQodCl9Z2V0Q29uZnVzYWJsZUNvZGVQb2ludHMoKXtyZXR1cm4gbmV3IFNldCh0aGlzLmNvbmZ1c2FibGVEaWN0aW9uYXJ5LmtleXMoKSl9fTtiZS5hbWJpZ3VvdXNDaGFyYWN0ZXJEYXRhPW5ldyBGbigoKT0+SlNPTi5wYXJzZSgneyJfY29tbW9uIjpbODIzMiwzMiw4MjMzLDMyLDU3NjAsMzIsODE5MiwzMiw4MTkzLDMyLDgxOTQsMzIsODE5NSwzMiw4MTk2LDMyLDgxOTcsMzIsODE5OCwzMiw4MjAwLDMyLDgyMDEsMzIsODIwMiwzMiw4Mjg3LDMyLDgxOTksMzIsODIzOSwzMiwyMDQyLDk1LDY1MTAxLDk1LDY1MTAyLDk1LDY1MTAzLDk1LDgyMDgsNDUsODIwOSw0NSw4MjEwLDQ1LDY1MTEyLDQ1LDE3NDgsNDUsODI1OSw0NSw3MjcsNDUsODcyMiw0NSwxMDEzNCw0NSwxMTQ1MCw0NSwxNTQ5LDQ0LDE2NDMsNDQsODIxOCw0NCwxODQsNDQsNDIyMzMsNDQsODk0LDU5LDIzMDcsNTgsMjY5MSw1OCwxNDE3LDU4LDE3OTUsNTgsMTc5Niw1OCw1ODY4LDU4LDY1MDcyLDU4LDYxNDcsNTgsNjE1Myw1OCw4MjgyLDU4LDE0NzUsNTgsNzYwLDU4LDQyODg5LDU4LDg3NTgsNTgsNzIwLDU4LDQyMjM3LDU4LDQ1MSwzMywxMTYwMSwzMyw2NjAsNjMsNTc3LDYzLDI0MjksNjMsNTAzOCw2Myw0MjczMSw2MywxMTkxNDksNDYsODIyOCw0NiwxNzkzLDQ2LDE3OTQsNDYsNDI1MTAsNDYsNjgxNzYsNDYsMTYzMiw0NiwxNzc2LDQ2LDQyMjMyLDQ2LDEzNzMsOTYsNjUyODcsOTYsODIxOSw5Niw4MjQyLDk2LDEzNzAsOTYsMTUyMyw5Niw4MTc1LDk2LDY1MzQ0LDk2LDkwMCw5Niw4MTg5LDk2LDgxMjUsOTYsODEyNyw5Niw4MTkwLDk2LDY5Nyw5Niw4ODQsOTYsNzEyLDk2LDcxNCw5Niw3MTUsOTYsNzU2LDk2LDY5OSw5Niw3MDEsOTYsNzAwLDk2LDcwMiw5Niw0Mjg5Miw5NiwxNDk3LDk2LDIwMzYsOTYsMjAzNyw5Niw1MTk0LDk2LDU4MzYsOTYsOTQwMzMsOTYsOTQwMzQsOTYsNjUzMzksOTEsMTAwODgsNDAsMTAwOTgsNDAsMTIzMDgsNDAsNjQ4MzAsNDAsNjUzNDEsOTMsMTAwODksNDEsMTAwOTksNDEsMTIzMDksNDEsNjQ4MzEsNDEsMTAxMDAsMTIzLDExOTA2MCwxMjMsMTAxMDEsMTI1LDY1MzQyLDk0LDgyNzAsNDIsMTY0NSw0Miw4NzI3LDQyLDY2MzM1LDQyLDU5NDEsNDcsODI1Nyw0Nyw4NzI1LDQ3LDgyNjAsNDcsOTU4NSw0NywxMDE4Nyw0NywxMDc0NCw0NywxMTkzNTQsNDcsMTI3NTUsNDcsMTIzMzksNDcsMTE0NjIsNDcsMjAwMzEsNDcsMTIwMzUsNDcsNjUzNDAsOTIsNjUxMjgsOTIsODcyNiw5MiwxMDE4OSw5MiwxMDc0MSw5MiwxMDc0NSw5MiwxMTkzMTEsOTIsMTE5MzU1LDkyLDEyNzU2LDkyLDIwMDIyLDkyLDEyMDM0LDkyLDQyODcyLDM4LDcwOCw5NCw3MTAsOTQsNTg2OSw0MywxMDEzMyw0Myw2NjIwMyw0Myw4MjQ5LDYwLDEwMDk0LDYwLDcwNiw2MCwxMTkzNTAsNjAsNTE3Niw2MCw1ODEwLDYwLDUxMjAsNjEsMTE4NDAsNjEsMTI0NDgsNjEsNDIyMzksNjEsODI1MCw2MiwxMDA5NSw2Miw3MDcsNjIsMTE5MzUxLDYyLDUxNzEsNjIsOTQwMTUsNjIsODI3NSwxMjYsNzMyLDEyNiw4MTI4LDEyNiw4NzY0LDEyNiw2NTM3MiwxMjQsNjUyOTMsNDUsMTIwNzg0LDUwLDEyMDc5NCw1MCwxMjA4MDQsNTAsMTIwODE0LDUwLDEyMDgyNCw1MCwxMzAwMzQsNTAsNDI4NDIsNTAsNDIzLDUwLDEwMDAsNTAsNDI1NjQsNTAsNTMxMSw1MCw0MjczNSw1MCwxMTkzMDIsNTEsMTIwNzg1LDUxLDEyMDc5NSw1MSwxMjA4MDUsNTEsMTIwODE1LDUxLDEyMDgyNSw1MSwxMzAwMzUsNTEsNDI5MjMsNTEsNTQwLDUxLDQzOSw1MSw0Mjg1OCw1MSwxMTQ2OCw1MSwxMjQ4LDUxLDk0MDExLDUxLDcxODgyLDUxLDEyMDc4Niw1MiwxMjA3OTYsNTIsMTIwODA2LDUyLDEyMDgxNiw1MiwxMjA4MjYsNTIsMTMwMDM2LDUyLDUwNzAsNTIsNzE4NTUsNTIsMTIwNzg3LDUzLDEyMDc5Nyw1MywxMjA4MDcsNTMsMTIwODE3LDUzLDEyMDgyNyw1MywxMzAwMzcsNTMsNDQ0LDUzLDcxODY3LDUzLDEyMDc4OCw1NCwxMjA3OTgsNTQsMTIwODA4LDU0LDEyMDgxOCw1NCwxMjA4MjgsNTQsMTMwMDM4LDU0LDExNDc0LDU0LDUxMDIsNTQsNzE4OTMsNTQsMTE5MzE0LDU1LDEyMDc4OSw1NSwxMjA3OTksNTUsMTIwODA5LDU1LDEyMDgxOSw1NSwxMjA4MjksNTUsMTMwMDM5LDU1LDY2NzcwLDU1LDcxODc4LDU1LDI4MTksNTYsMjUzOCw1NiwyNjY2LDU2LDEyNTEzMSw1NiwxMjA3OTAsNTYsMTIwODAwLDU2LDEyMDgxMCw1NiwxMjA4MjAsNTYsMTIwODMwLDU2LDEzMDA0MCw1Niw1NDcsNTYsNTQ2LDU2LDY2MzMwLDU2LDI2NjMsNTcsMjkyMCw1NywyNTQxLDU3LDM0MzcsNTcsMTIwNzkxLDU3LDEyMDgwMSw1NywxMjA4MTEsNTcsMTIwODIxLDU3LDEyMDgzMSw1NywxMzAwNDEsNTcsNDI4NjIsNTcsMTE0NjYsNTcsNzE4ODQsNTcsNzE4NTIsNTcsNzE4OTQsNTcsOTA4Miw5Nyw2NTM0NSw5NywxMTk4MzQsOTcsMTE5ODg2LDk3LDExOTkzOCw5NywxMTk5OTAsOTcsMTIwMDQyLDk3LDEyMDA5NCw5NywxMjAxNDYsOTcsMTIwMTk4LDk3LDEyMDI1MCw5NywxMjAzMDIsOTcsMTIwMzU0LDk3LDEyMDQwNiw5NywxMjA0NTgsOTcsNTkzLDk3LDk0NSw5NywxMjA1MTQsOTcsMTIwNTcyLDk3LDEyMDYzMCw5NywxMjA2ODgsOTcsMTIwNzQ2LDk3LDY1MzEzLDY1LDExOTgwOCw2NSwxMTk4NjAsNjUsMTE5OTEyLDY1LDExOTk2NCw2NSwxMjAwMTYsNjUsMTIwMDY4LDY1LDEyMDEyMCw2NSwxMjAxNzIsNjUsMTIwMjI0LDY1LDEyMDI3Niw2NSwxMjAzMjgsNjUsMTIwMzgwLDY1LDEyMDQzMiw2NSw5MTMsNjUsMTIwNDg4LDY1LDEyMDU0Niw2NSwxMjA2MDQsNjUsMTIwNjYyLDY1LDEyMDcyMCw2NSw1MDM0LDY1LDU1NzMsNjUsNDIyMjIsNjUsOTQwMTYsNjUsNjYyMDgsNjUsMTE5ODM1LDk4LDExOTg4Nyw5OCwxMTk5MzksOTgsMTE5OTkxLDk4LDEyMDA0Myw5OCwxMjAwOTUsOTgsMTIwMTQ3LDk4LDEyMDE5OSw5OCwxMjAyNTEsOTgsMTIwMzAzLDk4LDEyMDM1NSw5OCwxMjA0MDcsOTgsMTIwNDU5LDk4LDM4OCw5OCw1MDcxLDk4LDUyMzQsOTgsNTU1MSw5OCw2NTMxNCw2Niw4NDkyLDY2LDExOTgwOSw2NiwxMTk4NjEsNjYsMTE5OTEzLDY2LDEyMDAxNyw2NiwxMjAwNjksNjYsMTIwMTIxLDY2LDEyMDE3Myw2NiwxMjAyMjUsNjYsMTIwMjc3LDY2LDEyMDMyOSw2NiwxMjAzODEsNjYsMTIwNDMzLDY2LDQyOTMyLDY2LDkxNCw2NiwxMjA0ODksNjYsMTIwNTQ3LDY2LDEyMDYwNSw2NiwxMjA2NjMsNjYsMTIwNzIxLDY2LDUxMDgsNjYsNTYyMyw2Niw0MjE5Miw2Niw2NjE3OCw2Niw2NjIwOSw2Niw2NjMwNSw2Niw2NTM0Nyw5OSw4NTczLDk5LDExOTgzNiw5OSwxMTk4ODgsOTksMTE5OTQwLDk5LDExOTk5Miw5OSwxMjAwNDQsOTksMTIwMDk2LDk5LDEyMDE0OCw5OSwxMjAyMDAsOTksMTIwMjUyLDk5LDEyMDMwNCw5OSwxMjAzNTYsOTksMTIwNDA4LDk5LDEyMDQ2MCw5OSw3NDI4LDk5LDEwMTAsOTksMTE0MjksOTksNDM5NTEsOTksNjY2MjEsOTksMTI4ODQ0LDY3LDcxOTIyLDY3LDcxOTEzLDY3LDY1MzE1LDY3LDg1NTcsNjcsODQ1MCw2Nyw4NDkzLDY3LDExOTgxMCw2NywxMTk4NjIsNjcsMTE5OTE0LDY3LDExOTk2Niw2NywxMjAwMTgsNjcsMTIwMTc0LDY3LDEyMDIyNiw2NywxMjAyNzgsNjcsMTIwMzMwLDY3LDEyMDM4Miw2NywxMjA0MzQsNjcsMTAxNyw2NywxMTQyOCw2Nyw1MDg3LDY3LDQyMjAyLDY3LDY2MjEwLDY3LDY2MzA2LDY3LDY2NTgxLDY3LDY2ODQ0LDY3LDg1NzQsMTAwLDg1MTgsMTAwLDExOTgzNywxMDAsMTE5ODg5LDEwMCwxMTk5NDEsMTAwLDExOTk5MywxMDAsMTIwMDQ1LDEwMCwxMjAwOTcsMTAwLDEyMDE0OSwxMDAsMTIwMjAxLDEwMCwxMjAyNTMsMTAwLDEyMDMwNSwxMDAsMTIwMzU3LDEwMCwxMjA0MDksMTAwLDEyMDQ2MSwxMDAsMTI4MSwxMDAsNTA5NSwxMDAsNTIzMSwxMDAsNDIxOTQsMTAwLDg1NTgsNjgsODUxNyw2OCwxMTk4MTEsNjgsMTE5ODYzLDY4LDExOTkxNSw2OCwxMTk5NjcsNjgsMTIwMDE5LDY4LDEyMDA3MSw2OCwxMjAxMjMsNjgsMTIwMTc1LDY4LDEyMDIyNyw2OCwxMjAyNzksNjgsMTIwMzMxLDY4LDEyMDM4Myw2OCwxMjA0MzUsNjgsNTAyNCw2OCw1NTk4LDY4LDU2MTAsNjgsNDIxOTUsNjgsODQ5NCwxMDEsNjUzNDksMTAxLDg0OTUsMTAxLDg1MTksMTAxLDExOTgzOCwxMDEsMTE5ODkwLDEwMSwxMTk5NDIsMTAxLDEyMDA0NiwxMDEsMTIwMDk4LDEwMSwxMjAxNTAsMTAxLDEyMDIwMiwxMDEsMTIwMjU0LDEwMSwxMjAzMDYsMTAxLDEyMDM1OCwxMDEsMTIwNDEwLDEwMSwxMjA0NjIsMTAxLDQzODI2LDEwMSwxMjEzLDEwMSw4OTU5LDY5LDY1MzE3LDY5LDg0OTYsNjksMTE5ODEyLDY5LDExOTg2NCw2OSwxMTk5MTYsNjksMTIwMDIwLDY5LDEyMDA3Miw2OSwxMjAxMjQsNjksMTIwMTc2LDY5LDEyMDIyOCw2OSwxMjAyODAsNjksMTIwMzMyLDY5LDEyMDM4NCw2OSwxMjA0MzYsNjksOTE3LDY5LDEyMDQ5Miw2OSwxMjA1NTAsNjksMTIwNjA4LDY5LDEyMDY2Niw2OSwxMjA3MjQsNjksMTE1NzcsNjksNTAzNiw2OSw0MjIyNCw2OSw3MTg0Niw2OSw3MTg1NCw2OSw2NjE4Miw2OSwxMTk4MzksMTAyLDExOTg5MSwxMDIsMTE5OTQzLDEwMiwxMTk5OTUsMTAyLDEyMDA0NywxMDIsMTIwMDk5LDEwMiwxMjAxNTEsMTAyLDEyMDIwMywxMDIsMTIwMjU1LDEwMiwxMjAzMDcsMTAyLDEyMDM1OSwxMDIsMTIwNDExLDEwMiwxMjA0NjMsMTAyLDQzODI5LDEwMiw0MjkwNSwxMDIsMzgzLDEwMiw3ODM3LDEwMiwxNDEyLDEwMiwxMTkzMTUsNzAsODQ5Nyw3MCwxMTk4MTMsNzAsMTE5ODY1LDcwLDExOTkxNyw3MCwxMjAwMjEsNzAsMTIwMDczLDcwLDEyMDEyNSw3MCwxMjAxNzcsNzAsMTIwMjI5LDcwLDEyMDI4MSw3MCwxMjAzMzMsNzAsMTIwMzg1LDcwLDEyMDQzNyw3MCw0MjkwNCw3MCw5ODgsNzAsMTIwNzc4LDcwLDU1NTYsNzAsNDIyMDUsNzAsNzE4NzQsNzAsNzE4NDIsNzAsNjYxODMsNzAsNjYyMTMsNzAsNjY4NTMsNzAsNjUzNTEsMTAzLDg0NTgsMTAzLDExOTg0MCwxMDMsMTE5ODkyLDEwMywxMTk5NDQsMTAzLDEyMDA0OCwxMDMsMTIwMTAwLDEwMywxMjAxNTIsMTAzLDEyMDIwNCwxMDMsMTIwMjU2LDEwMywxMjAzMDgsMTAzLDEyMDM2MCwxMDMsMTIwNDEyLDEwMywxMjA0NjQsMTAzLDYwOSwxMDMsNzU1NSwxMDMsMzk3LDEwMywxNDA5LDEwMywxMTk4MTQsNzEsMTE5ODY2LDcxLDExOTkxOCw3MSwxMTk5NzAsNzEsMTIwMDIyLDcxLDEyMDA3NCw3MSwxMjAxMjYsNzEsMTIwMTc4LDcxLDEyMDIzMCw3MSwxMjAyODIsNzEsMTIwMzM0LDcxLDEyMDM4Niw3MSwxMjA0MzgsNzEsMTI5Miw3MSw1MDU2LDcxLDUxMDcsNzEsNDIxOTgsNzEsNjUzNTIsMTA0LDg0NjIsMTA0LDExOTg0MSwxMDQsMTE5OTQ1LDEwNCwxMTk5OTcsMTA0LDEyMDA0OSwxMDQsMTIwMTAxLDEwNCwxMjAxNTMsMTA0LDEyMDIwNSwxMDQsMTIwMjU3LDEwNCwxMjAzMDksMTA0LDEyMDM2MSwxMDQsMTIwNDEzLDEwNCwxMjA0NjUsMTA0LDEyMTEsMTA0LDEzOTIsMTA0LDUwNTgsMTA0LDY1MzIwLDcyLDg0NTksNzIsODQ2MCw3Miw4NDYxLDcyLDExOTgxNSw3MiwxMTk4NjcsNzIsMTE5OTE5LDcyLDEyMDAyMyw3MiwxMjAxNzksNzIsMTIwMjMxLDcyLDEyMDI4Myw3MiwxMjAzMzUsNzIsMTIwMzg3LDcyLDEyMDQzOSw3Miw5MTksNzIsMTIwNDk0LDcyLDEyMDU1Miw3MiwxMjA2MTAsNzIsMTIwNjY4LDcyLDEyMDcyNiw3MiwxMTQwNiw3Miw1MDUxLDcyLDU1MDAsNzIsNDIyMTUsNzIsNjYyNTUsNzIsNzMxLDEwNSw5MDc1LDEwNSw2NTM1MywxMDUsODU2MCwxMDUsODUwNSwxMDUsODUyMCwxMDUsMTE5ODQyLDEwNSwxMTk4OTQsMTA1LDExOTk0NiwxMDUsMTE5OTk4LDEwNSwxMjAwNTAsMTA1LDEyMDEwMiwxMDUsMTIwMTU0LDEwNSwxMjAyMDYsMTA1LDEyMDI1OCwxMDUsMTIwMzEwLDEwNSwxMjAzNjIsMTA1LDEyMDQxNCwxMDUsMTIwNDY2LDEwNSwxMjA0ODQsMTA1LDYxOCwxMDUsNjE3LDEwNSw5NTMsMTA1LDgxMjYsMTA1LDg5MCwxMDUsMTIwNTIyLDEwNSwxMjA1ODAsMTA1LDEyMDYzOCwxMDUsMTIwNjk2LDEwNSwxMjA3NTQsMTA1LDExMTAsMTA1LDQyNTY3LDEwNSwxMjMxLDEwNSw0Mzg5MywxMDUsNTAyOSwxMDUsNzE4NzUsMTA1LDY1MzU0LDEwNiw4NTIxLDEwNiwxMTk4NDMsMTA2LDExOTg5NSwxMDYsMTE5OTQ3LDEwNiwxMTk5OTksMTA2LDEyMDA1MSwxMDYsMTIwMTAzLDEwNiwxMjAxNTUsMTA2LDEyMDIwNywxMDYsMTIwMjU5LDEwNiwxMjAzMTEsMTA2LDEyMDM2MywxMDYsMTIwNDE1LDEwNiwxMjA0NjcsMTA2LDEwMTEsMTA2LDExMTIsMTA2LDY1MzIyLDc0LDExOTgxNyw3NCwxMTk4NjksNzQsMTE5OTIxLDc0LDExOTk3Myw3NCwxMjAwMjUsNzQsMTIwMDc3LDc0LDEyMDEyOSw3NCwxMjAxODEsNzQsMTIwMjMzLDc0LDEyMDI4NSw3NCwxMjAzMzcsNzQsMTIwMzg5LDc0LDEyMDQ0MSw3NCw0MjkzMCw3NCw4OTUsNzQsMTAzMiw3NCw1MDM1LDc0LDUyNjEsNzQsNDIyMDEsNzQsMTE5ODQ0LDEwNywxMTk4OTYsMTA3LDExOTk0OCwxMDcsMTIwMDAwLDEwNywxMjAwNTIsMTA3LDEyMDEwNCwxMDcsMTIwMTU2LDEwNywxMjAyMDgsMTA3LDEyMDI2MCwxMDcsMTIwMzEyLDEwNywxMjAzNjQsMTA3LDEyMDQxNiwxMDcsMTIwNDY4LDEwNyw4NDkwLDc1LDY1MzIzLDc1LDExOTgxOCw3NSwxMTk4NzAsNzUsMTE5OTIyLDc1LDExOTk3NCw3NSwxMjAwMjYsNzUsMTIwMDc4LDc1LDEyMDEzMCw3NSwxMjAxODIsNzUsMTIwMjM0LDc1LDEyMDI4Niw3NSwxMjAzMzgsNzUsMTIwMzkwLDc1LDEyMDQ0Miw3NSw5MjIsNzUsMTIwNDk3LDc1LDEyMDU1NSw3NSwxMjA2MTMsNzUsMTIwNjcxLDc1LDEyMDcyOSw3NSwxMTQxMiw3NSw1MDk0LDc1LDU4NDUsNzUsNDIxOTksNzUsNjY4NDAsNzUsMTQ3MiwxMDgsODczOSw3Myw5MjEzLDczLDY1NTEyLDczLDE2MzMsMTA4LDE3NzcsNzMsNjYzMzYsMTA4LDEyNTEyNywxMDgsMTIwNzgzLDczLDEyMDc5Myw3MywxMjA4MDMsNzMsMTIwODEzLDczLDEyMDgyMyw3MywxMzAwMzMsNzMsNjUzMjEsNzMsODU0NCw3Myw4NDY0LDczLDg0NjUsNzMsMTE5ODE2LDczLDExOTg2OCw3MywxMTk5MjAsNzMsMTIwMDI0LDczLDEyMDEyOCw3MywxMjAxODAsNzMsMTIwMjMyLDczLDEyMDI4NCw3MywxMjAzMzYsNzMsMTIwMzg4LDczLDEyMDQ0MCw3Myw2NTM1NiwxMDgsODU3Miw3Myw4NDY3LDEwOCwxMTk4NDUsMTA4LDExOTg5NywxMDgsMTE5OTQ5LDEwOCwxMjAwMDEsMTA4LDEyMDA1MywxMDgsMTIwMTA1LDczLDEyMDE1Nyw3MywxMjAyMDksNzMsMTIwMjYxLDczLDEyMDMxMyw3MywxMjAzNjUsNzMsMTIwNDE3LDczLDEyMDQ2OSw3Myw0NDgsNzMsMTIwNDk2LDczLDEyMDU1NCw3MywxMjA2MTIsNzMsMTIwNjcwLDczLDEyMDcyOCw3MywxMTQxMCw3MywxMDMwLDczLDEyMTYsNzMsMTQ5MywxMDgsMTUwMywxMDgsMTU3NSwxMDgsMTI2NDY0LDEwOCwxMjY1OTIsMTA4LDY1MTY2LDEwOCw2NTE2NSwxMDgsMTk5NCwxMDgsMTE1OTksNzMsNTgyNSw3Myw0MjIyNiw3Myw5Mzk5Miw3Myw2NjE4NiwxMjQsNjYzMTMsMTI0LDExOTMzOCw3Niw4NTU2LDc2LDg0NjYsNzYsMTE5ODE5LDc2LDExOTg3MSw3NiwxMTk5MjMsNzYsMTIwMDI3LDc2LDEyMDA3OSw3NiwxMjAxMzEsNzYsMTIwMTgzLDc2LDEyMDIzNSw3NiwxMjAyODcsNzYsMTIwMzM5LDc2LDEyMDM5MSw3NiwxMjA0NDMsNzYsMTE0NzIsNzYsNTA4Niw3Niw1MjkwLDc2LDQyMjA5LDc2LDkzOTc0LDc2LDcxODQzLDc2LDcxODU4LDc2LDY2NTg3LDc2LDY2ODU0LDc2LDY1MzI1LDc3LDg1NTksNzcsODQ5OSw3NywxMTk4MjAsNzcsMTE5ODcyLDc3LDExOTkyNCw3NywxMjAwMjgsNzcsMTIwMDgwLDc3LDEyMDEzMiw3NywxMjAxODQsNzcsMTIwMjM2LDc3LDEyMDI4OCw3NywxMjAzNDAsNzcsMTIwMzkyLDc3LDEyMDQ0NCw3Nyw5MjQsNzcsMTIwNDk5LDc3LDEyMDU1Nyw3NywxMjA2MTUsNzcsMTIwNjczLDc3LDEyMDczMSw3NywxMDE4LDc3LDExNDE2LDc3LDUwNDcsNzcsNTYxNiw3Nyw1ODQ2LDc3LDQyMjA3LDc3LDY2MjI0LDc3LDY2MzIxLDc3LDExOTg0NywxMTAsMTE5ODk5LDExMCwxMTk5NTEsMTEwLDEyMDAwMywxMTAsMTIwMDU1LDExMCwxMjAxMDcsMTEwLDEyMDE1OSwxMTAsMTIwMjExLDExMCwxMjAyNjMsMTEwLDEyMDMxNSwxMTAsMTIwMzY3LDExMCwxMjA0MTksMTEwLDEyMDQ3MSwxMTAsMTQwMCwxMTAsMTQwNCwxMTAsNjUzMjYsNzgsODQ2OSw3OCwxMTk4MjEsNzgsMTE5ODczLDc4LDExOTkyNSw3OCwxMTk5NzcsNzgsMTIwMDI5LDc4LDEyMDA4MSw3OCwxMjAxODUsNzgsMTIwMjM3LDc4LDEyMDI4OSw3OCwxMjAzNDEsNzgsMTIwMzkzLDc4LDEyMDQ0NSw3OCw5MjUsNzgsMTIwNTAwLDc4LDEyMDU1OCw3OCwxMjA2MTYsNzgsMTIwNjc0LDc4LDEyMDczMiw3OCwxMTQxOCw3OCw0MjIwOCw3OCw2NjgzNSw3OCwzMDc0LDExMSwzMjAyLDExMSwzMzMwLDExMSwzNDU4LDExMSwyNDA2LDExMSwyNjYyLDExMSwyNzkwLDExMSwzMDQ2LDExMSwzMTc0LDExMSwzMzAyLDExMSwzNDMwLDExMSwzNjY0LDExMSwzNzkyLDExMSw0MTYwLDExMSwxNjM3LDExMSwxNzgxLDExMSw2NTM1OSwxMTEsODUwMCwxMTEsMTE5ODQ4LDExMSwxMTk5MDAsMTExLDExOTk1MiwxMTEsMTIwMDU2LDExMSwxMjAxMDgsMTExLDEyMDE2MCwxMTEsMTIwMjEyLDExMSwxMjAyNjQsMTExLDEyMDMxNiwxMTEsMTIwMzY4LDExMSwxMjA0MjAsMTExLDEyMDQ3MiwxMTEsNzQzOSwxMTEsNzQ0MSwxMTEsNDM4MzcsMTExLDk1OSwxMTEsMTIwNTI4LDExMSwxMjA1ODYsMTExLDEyMDY0NCwxMTEsMTIwNzAyLDExMSwxMjA3NjAsMTExLDk2MywxMTEsMTIwNTMyLDExMSwxMjA1OTAsMTExLDEyMDY0OCwxMTEsMTIwNzA2LDExMSwxMjA3NjQsMTExLDExNDIzLDExMSw0MzUxLDExMSwxNDEzLDExMSwxNTA1LDExMSwxNjA3LDExMSwxMjY1MDAsMTExLDEyNjU2NCwxMTEsMTI2NTk2LDExMSw2NTI1OSwxMTEsNjUyNjAsMTExLDY1MjU4LDExMSw2NTI1NywxMTEsMTcyNiwxMTEsNjQ0MjgsMTExLDY0NDI5LDExMSw2NDQyNywxMTEsNjQ0MjYsMTExLDE3MjksMTExLDY0NDI0LDExMSw2NDQyNSwxMTEsNjQ0MjMsMTExLDY0NDIyLDExMSwxNzQ5LDExMSwzMzYwLDExMSw0MTI1LDExMSw2Njc5NCwxMTEsNzE4ODAsMTExLDcxODk1LDExMSw2NjYwNCwxMTEsMTk4NCw3OSwyNTM0LDc5LDI5MTgsNzksMTIyOTUsNzksNzA4NjQsNzksNzE5MDQsNzksMTIwNzgyLDc5LDEyMDc5Miw3OSwxMjA4MDIsNzksMTIwODEyLDc5LDEyMDgyMiw3OSwxMzAwMzIsNzksNjUzMjcsNzksMTE5ODIyLDc5LDExOTg3NCw3OSwxMTk5MjYsNzksMTE5OTc4LDc5LDEyMDAzMCw3OSwxMjAwODIsNzksMTIwMTM0LDc5LDEyMDE4Niw3OSwxMjAyMzgsNzksMTIwMjkwLDc5LDEyMDM0Miw3OSwxMjAzOTQsNzksMTIwNDQ2LDc5LDkyNyw3OSwxMjA1MDIsNzksMTIwNTYwLDc5LDEyMDYxOCw3OSwxMjA2NzYsNzksMTIwNzM0LDc5LDExNDIyLDc5LDEzNjUsNzksMTE2MDQsNzksNDgxNiw3OSwyODQ4LDc5LDY2NzU0LDc5LDQyMjI3LDc5LDcxODYxLDc5LDY2MTk0LDc5LDY2MjE5LDc5LDY2NTY0LDc5LDY2ODM4LDc5LDkwNzYsMTEyLDY1MzYwLDExMiwxMTk4NDksMTEyLDExOTkwMSwxMTIsMTE5OTUzLDExMiwxMjAwMDUsMTEyLDEyMDA1NywxMTIsMTIwMTA5LDExMiwxMjAxNjEsMTEyLDEyMDIxMywxMTIsMTIwMjY1LDExMiwxMjAzMTcsMTEyLDEyMDM2OSwxMTIsMTIwNDIxLDExMiwxMjA0NzMsMTEyLDk2MSwxMTIsMTIwNTMwLDExMiwxMjA1NDQsMTEyLDEyMDU4OCwxMTIsMTIwNjAyLDExMiwxMjA2NDYsMTEyLDEyMDY2MCwxMTIsMTIwNzA0LDExMiwxMjA3MTgsMTEyLDEyMDc2MiwxMTIsMTIwNzc2LDExMiwxMTQyNywxMTIsNjUzMjgsODAsODQ3Myw4MCwxMTk4MjMsODAsMTE5ODc1LDgwLDExOTkyNyw4MCwxMTk5NzksODAsMTIwMDMxLDgwLDEyMDA4Myw4MCwxMjAxODcsODAsMTIwMjM5LDgwLDEyMDI5MSw4MCwxMjAzNDMsODAsMTIwMzk1LDgwLDEyMDQ0Nyw4MCw5MjksODAsMTIwNTA0LDgwLDEyMDU2Miw4MCwxMjA2MjAsODAsMTIwNjc4LDgwLDEyMDczNiw4MCwxMTQyNiw4MCw1MDkwLDgwLDUyMjksODAsNDIxOTMsODAsNjYxOTcsODAsMTE5ODUwLDExMywxMTk5MDIsMTEzLDExOTk1NCwxMTMsMTIwMDA2LDExMywxMjAwNTgsMTEzLDEyMDExMCwxMTMsMTIwMTYyLDExMywxMjAyMTQsMTEzLDEyMDI2NiwxMTMsMTIwMzE4LDExMywxMjAzNzAsMTEzLDEyMDQyMiwxMTMsMTIwNDc0LDExMywxMzA3LDExMywxMzc5LDExMywxMzgyLDExMyw4NDc0LDgxLDExOTgyNCw4MSwxMTk4NzYsODEsMTE5OTI4LDgxLDExOTk4MCw4MSwxMjAwMzIsODEsMTIwMDg0LDgxLDEyMDE4OCw4MSwxMjAyNDAsODEsMTIwMjkyLDgxLDEyMDM0NCw4MSwxMjAzOTYsODEsMTIwNDQ4LDgxLDExNjA1LDgxLDExOTg1MSwxMTQsMTE5OTAzLDExNCwxMTk5NTUsMTE0LDEyMDAwNywxMTQsMTIwMDU5LDExNCwxMjAxMTEsMTE0LDEyMDE2MywxMTQsMTIwMjE1LDExNCwxMjAyNjcsMTE0LDEyMDMxOSwxMTQsMTIwMzcxLDExNCwxMjA0MjMsMTE0LDEyMDQ3NSwxMTQsNDM4NDcsMTE0LDQzODQ4LDExNCw3NDYyLDExNCwxMTM5NywxMTQsNDM5MDUsMTE0LDExOTMxOCw4Miw4NDc1LDgyLDg0NzYsODIsODQ3Nyw4MiwxMTk4MjUsODIsMTE5ODc3LDgyLDExOTkyOSw4MiwxMjAwMzMsODIsMTIwMTg5LDgyLDEyMDI0MSw4MiwxMjAyOTMsODIsMTIwMzQ1LDgyLDEyMDM5Nyw4MiwxMjA0NDksODIsNDIyLDgyLDUwMjUsODIsNTA3NCw4Miw2Njc0MCw4Miw1NTExLDgyLDQyMjExLDgyLDk0MDA1LDgyLDY1MzYzLDExNSwxMTk4NTIsMTE1LDExOTkwNCwxMTUsMTE5OTU2LDExNSwxMjAwMDgsMTE1LDEyMDA2MCwxMTUsMTIwMTEyLDExNSwxMjAxNjQsMTE1LDEyMDIxNiwxMTUsMTIwMjY4LDExNSwxMjAzMjAsMTE1LDEyMDM3MiwxMTUsMTIwNDI0LDExNSwxMjA0NzYsMTE1LDQyODAxLDExNSw0NDUsMTE1LDExMDksMTE1LDQzOTQ2LDExNSw3MTg3MywxMTUsNjY2MzIsMTE1LDY1MzMxLDgzLDExOTgyNiw4MywxMTk4NzgsODMsMTE5OTMwLDgzLDExOTk4Miw4MywxMjAwMzQsODMsMTIwMDg2LDgzLDEyMDEzOCw4MywxMjAxOTAsODMsMTIwMjQyLDgzLDEyMDI5NCw4MywxMjAzNDYsODMsMTIwMzk4LDgzLDEyMDQ1MCw4MywxMDI5LDgzLDEzNTksODMsNTA3Nyw4Myw1MDgyLDgzLDQyMjEwLDgzLDk0MDEwLDgzLDY2MTk4LDgzLDY2NTkyLDgzLDExOTg1MywxMTYsMTE5OTA1LDExNiwxMTk5NTcsMTE2LDEyMDAwOSwxMTYsMTIwMDYxLDExNiwxMjAxMTMsMTE2LDEyMDE2NSwxMTYsMTIwMjE3LDExNiwxMjAyNjksMTE2LDEyMDMyMSwxMTYsMTIwMzczLDExNiwxMjA0MjUsMTE2LDEyMDQ3NywxMTYsODg2OCw4NCwxMDIwMSw4NCwxMjg4NzIsODQsNjUzMzIsODQsMTE5ODI3LDg0LDExOTg3OSw4NCwxMTk5MzEsODQsMTE5OTgzLDg0LDEyMDAzNSw4NCwxMjAwODcsODQsMTIwMTM5LDg0LDEyMDE5MSw4NCwxMjAyNDMsODQsMTIwMjk1LDg0LDEyMDM0Nyw4NCwxMjAzOTksODQsMTIwNDUxLDg0LDkzMiw4NCwxMjA1MDcsODQsMTIwNTY1LDg0LDEyMDYyMyw4NCwxMjA2ODEsODQsMTIwNzM5LDg0LDExNDMwLDg0LDUwMjYsODQsNDIxOTYsODQsOTM5NjIsODQsNzE4NjgsODQsNjYxOTksODQsNjYyMjUsODQsNjYzMjUsODQsMTE5ODU0LDExNywxMTk5MDYsMTE3LDExOTk1OCwxMTcsMTIwMDEwLDExNywxMjAwNjIsMTE3LDEyMDExNCwxMTcsMTIwMTY2LDExNywxMjAyMTgsMTE3LDEyMDI3MCwxMTcsMTIwMzIyLDExNywxMjAzNzQsMTE3LDEyMDQyNiwxMTcsMTIwNDc4LDExNyw0MjkxMSwxMTcsNzQ1MiwxMTcsNDM4NTQsMTE3LDQzODU4LDExNyw2NTEsMTE3LDk2NSwxMTcsMTIwNTM0LDExNywxMjA1OTIsMTE3LDEyMDY1MCwxMTcsMTIwNzA4LDExNywxMjA3NjYsMTE3LDE0MDUsMTE3LDY2ODA2LDExNyw3MTg5NiwxMTcsODc0Niw4NSw4ODk5LDg1LDExOTgyOCw4NSwxMTk4ODAsODUsMTE5OTMyLDg1LDExOTk4NCw4NSwxMjAwMzYsODUsMTIwMDg4LDg1LDEyMDE0MCw4NSwxMjAxOTIsODUsMTIwMjQ0LDg1LDEyMDI5Niw4NSwxMjAzNDgsODUsMTIwNDAwLDg1LDEyMDQ1Miw4NSwxMzU3LDg1LDQ2MDgsODUsNjY3NjYsODUsNTE5Niw4NSw0MjIyOCw4NSw5NDAxOCw4NSw3MTg2NCw4NSw4NzQ0LDExOCw4ODk3LDExOCw2NTM2NiwxMTgsODU2NCwxMTgsMTE5ODU1LDExOCwxMTk5MDcsMTE4LDExOTk1OSwxMTgsMTIwMDExLDExOCwxMjAwNjMsMTE4LDEyMDExNSwxMTgsMTIwMTY3LDExOCwxMjAyMTksMTE4LDEyMDI3MSwxMTgsMTIwMzIzLDExOCwxMjAzNzUsMTE4LDEyMDQyNywxMTgsMTIwNDc5LDExOCw3NDU2LDExOCw5NTcsMTE4LDEyMDUyNiwxMTgsMTIwNTg0LDExOCwxMjA2NDIsMTE4LDEyMDcwMCwxMTgsMTIwNzU4LDExOCwxMTQxLDExOCwxNDk2LDExOCw3MTQzMCwxMTgsNDM5NDUsMTE4LDcxODcyLDExOCwxMTkzMDksODYsMTYzOSw4NiwxNzgzLDg2LDg1NDgsODYsMTE5ODI5LDg2LDExOTg4MSw4NiwxMTk5MzMsODYsMTE5OTg1LDg2LDEyMDAzNyw4NiwxMjAwODksODYsMTIwMTQxLDg2LDEyMDE5Myw4NiwxMjAyNDUsODYsMTIwMjk3LDg2LDEyMDM0OSw4NiwxMjA0MDEsODYsMTIwNDUzLDg2LDExNDAsODYsMTE1NzYsODYsNTA4MSw4Niw1MTY3LDg2LDQyNzE5LDg2LDQyMjE0LDg2LDkzOTYwLDg2LDcxODQwLDg2LDY2ODQ1LDg2LDYyMywxMTksMTE5ODU2LDExOSwxMTk5MDgsMTE5LDExOTk2MCwxMTksMTIwMDEyLDExOSwxMjAwNjQsMTE5LDEyMDExNiwxMTksMTIwMTY4LDExOSwxMjAyMjAsMTE5LDEyMDI3MiwxMTksMTIwMzI0LDExOSwxMjAzNzYsMTE5LDEyMDQyOCwxMTksMTIwNDgwLDExOSw3NDU3LDExOSwxMTIxLDExOSwxMzA5LDExOSwxMzc3LDExOSw3MTQzNCwxMTksNzE0MzgsMTE5LDcxNDM5LDExOSw0MzkwNywxMTksNzE5MTksODcsNzE5MTAsODcsMTE5ODMwLDg3LDExOTg4Miw4NywxMTk5MzQsODcsMTE5OTg2LDg3LDEyMDAzOCw4NywxMjAwOTAsODcsMTIwMTQyLDg3LDEyMDE5NCw4NywxMjAyNDYsODcsMTIwMjk4LDg3LDEyMDM1MCw4NywxMjA0MDIsODcsMTIwNDU0LDg3LDEzMDgsODcsNTA0Myw4Nyw1MDc2LDg3LDQyMjE4LDg3LDU3NDIsMTIwLDEwNTM5LDEyMCwxMDU0MCwxMjAsMTA3OTksMTIwLDY1MzY4LDEyMCw4NTY5LDEyMCwxMTk4NTcsMTIwLDExOTkwOSwxMjAsMTE5OTYxLDEyMCwxMjAwMTMsMTIwLDEyMDA2NSwxMjAsMTIwMTE3LDEyMCwxMjAxNjksMTIwLDEyMDIyMSwxMjAsMTIwMjczLDEyMCwxMjAzMjUsMTIwLDEyMDM3NywxMjAsMTIwNDI5LDEyMCwxMjA0ODEsMTIwLDU0NDEsMTIwLDU1MDEsMTIwLDU3NDEsODgsOTU4Nyw4OCw2NjMzOCw4OCw3MTkxNiw4OCw2NTMzNiw4OCw4NTUzLDg4LDExOTgzMSw4OCwxMTk4ODMsODgsMTE5OTM1LDg4LDExOTk4Nyw4OCwxMjAwMzksODgsMTIwMDkxLDg4LDEyMDE0Myw4OCwxMjAxOTUsODgsMTIwMjQ3LDg4LDEyMDI5OSw4OCwxMjAzNTEsODgsMTIwNDAzLDg4LDEyMDQ1NSw4OCw0MjkzMSw4OCw5MzUsODgsMTIwNTEwLDg4LDEyMDU2OCw4OCwxMjA2MjYsODgsMTIwNjg0LDg4LDEyMDc0Miw4OCwxMTQzNiw4OCwxMTYxMyw4OCw1ODE1LDg4LDQyMjE5LDg4LDY2MTkyLDg4LDY2MjI4LDg4LDY2MzI3LDg4LDY2ODU1LDg4LDYxMSwxMjEsNzU2NCwxMjEsNjUzNjksMTIxLDExOTg1OCwxMjEsMTE5OTEwLDEyMSwxMTk5NjIsMTIxLDEyMDAxNCwxMjEsMTIwMDY2LDEyMSwxMjAxMTgsMTIxLDEyMDE3MCwxMjEsMTIwMjIyLDEyMSwxMjAyNzQsMTIxLDEyMDMyNiwxMjEsMTIwMzc4LDEyMSwxMjA0MzAsMTIxLDEyMDQ4MiwxMjEsNjU1LDEyMSw3OTM1LDEyMSw0Mzg2NiwxMjEsOTQ3LDEyMSw4NTA5LDEyMSwxMjA1MTYsMTIxLDEyMDU3NCwxMjEsMTIwNjMyLDEyMSwxMjA2OTAsMTIxLDEyMDc0OCwxMjEsMTE5OSwxMjEsNDMyNywxMjEsNzE5MDAsMTIxLDY1MzM3LDg5LDExOTgzMiw4OSwxMTk4ODQsODksMTE5OTM2LDg5LDExOTk4OCw4OSwxMjAwNDAsODksMTIwMDkyLDg5LDEyMDE0NCw4OSwxMjAxOTYsODksMTIwMjQ4LDg5LDEyMDMwMCw4OSwxMjAzNTIsODksMTIwNDA0LDg5LDEyMDQ1Niw4OSw5MzMsODksOTc4LDg5LDEyMDUwOCw4OSwxMjA1NjYsODksMTIwNjI0LDg5LDEyMDY4Miw4OSwxMjA3NDAsODksMTE0MzIsODksMTE5OCw4OSw1MDMzLDg5LDUwNTMsODksNDIyMjAsODksOTQwMTksODksNzE4NDQsODksNjYyMjYsODksMTE5ODU5LDEyMiwxMTk5MTEsMTIyLDExOTk2MywxMjIsMTIwMDE1LDEyMiwxMjAwNjcsMTIyLDEyMDExOSwxMjIsMTIwMTcxLDEyMiwxMjAyMjMsMTIyLDEyMDI3NSwxMjIsMTIwMzI3LDEyMiwxMjAzNzksMTIyLDEyMDQzMSwxMjIsMTIwNDgzLDEyMiw3NDU4LDEyMiw0MzkyMywxMjIsNzE4NzYsMTIyLDY2MjkzLDkwLDcxOTA5LDkwLDY1MzM4LDkwLDg0ODQsOTAsODQ4OCw5MCwxMTk4MzMsOTAsMTE5ODg1LDkwLDExOTkzNyw5MCwxMTk5ODksOTAsMTIwMDQxLDkwLDEyMDE5Nyw5MCwxMjAyNDksOTAsMTIwMzAxLDkwLDEyMDM1Myw5MCwxMjA0MDUsOTAsMTIwNDU3LDkwLDkxOCw5MCwxMjA0OTMsOTAsMTIwNTUxLDkwLDEyMDYwOSw5MCwxMjA2NjcsOTAsMTIwNzI1LDkwLDUwNTksOTAsNDIyMDQsOTAsNzE4NDksOTAsNjUyODIsMzQsNjUyODQsMzYsNjUyODUsMzcsNjUyODYsMzgsNjUyOTAsNDIsNjUyOTEsNDMsNjUyOTQsNDYsNjUyOTUsNDcsNjUyOTYsNDgsNjUyOTcsNDksNjUyOTgsNTAsNjUyOTksNTEsNjUzMDAsNTIsNjUzMDEsNTMsNjUzMDIsNTQsNjUzMDMsNTUsNjUzMDQsNTYsNjUzMDUsNTcsNjUzMDgsNjAsNjUzMDksNjEsNjUzMTAsNjIsNjUzMTIsNjQsNjUzMTYsNjgsNjUzMTgsNzAsNjUzMTksNzEsNjUzMjQsNzYsNjUzMjksODEsNjUzMzAsODIsNjUzMzMsODUsNjUzMzQsODYsNjUzMzUsODcsNjUzNDMsOTUsNjUzNDYsOTgsNjUzNDgsMTAwLDY1MzUwLDEwMiw2NTM1NSwxMDcsNjUzNTcsMTA5LDY1MzU4LDExMCw2NTM2MSwxMTMsNjUzNjIsMTE0LDY1MzY0LDExNiw2NTM2NSwxMTcsNjUzNjcsMTE5LDY1MzcwLDEyMiw2NTM3MSwxMjMsNjUzNzMsMTI1LDExOTg0NiwxMDldLCJfZGVmYXVsdCI6WzE2MCwzMiw4MjExLDQ1LDY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLCJjcyI6WzY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwiZGUiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sImVzIjpbODIxMSw0NSw2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sImZyIjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODI0NSw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sIml0IjpbMTYwLDMyLDgyMTEsNDUsNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLCJqYSI6WzgyMTEsNDUsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1MjkyLDQ0LDY1MzA3LDU5XSwia28iOls4MjExLDQ1LDY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sInBsIjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sInB0LUJSIjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sInFwcy1wbG9jIjpbMTYwLDMyLDgyMTEsNDUsNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sInJ1IjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywzMDUsMTA1LDkyMSw3MywxMDA5LDExMiwyMTUsMTIwLDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwidHIiOlsxNjAsMzIsODIxMSw0NSw2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwiemgtaGFucyI6WzY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4OCw0MCw2NTI4OSw0MV0sInpoLWhhbnQiOls4MjExLDQ1LDY1Mzc0LDEyNiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUzMDcsNTldfScpKSxiZS5jYWNoZT1uZXcgZGkoe2dldENhY2hlS2V5OkpTT04uc3RyaW5naWZ5fSx0PT57ZnVuY3Rpb24gbihoKXtjb25zdCBmPW5ldyBNYXA7Zm9yKGxldCBkPTA7ZDxoLmxlbmd0aDtkKz0yKWYuc2V0KGhbZF0saFtkKzFdKTtyZXR1cm4gZn1mdW5jdGlvbiByKGgsZil7Y29uc3QgZD1uZXcgTWFwKGgpO2Zvcihjb25zdFttLGddb2YgZilkLnNldChtLGcpO3JldHVybiBkfWZ1bmN0aW9uIHMoaCxmKXtpZighaClyZXR1cm4gZjtjb25zdCBkPW5ldyBNYXA7Zm9yKGNvbnN0W20sZ11vZiBoKWYuaGFzKG0pJiZkLnNldChtLGcpO3JldHVybiBkfWNvbnN0IGk9YmUuYW1iaWd1b3VzQ2hhcmFjdGVyRGF0YS52YWx1ZTtsZXQgbz10LmZpbHRlcihoPT4haC5zdGFydHNXaXRoKCJfIikmJmggaW4gaSk7by5sZW5ndGg9PT0wJiYobz1bIl9kZWZhdWx0Il0pO2xldCBsO2Zvcihjb25zdCBoIG9mIG8pe2NvbnN0IGY9bihpW2hdKTtsPXMobCxmKX1jb25zdCB1PW4oaS5fY29tbW9uKSxjPXIodSxsKTtyZXR1cm4gbmV3IGJlKGMpfSksYmUuX2xvY2FsZXM9bmV3IEZuKCgpPT5PYmplY3Qua2V5cyhiZS5hbWJpZ3VvdXNDaGFyYWN0ZXJEYXRhLnZhbHVlKS5maWx0ZXIodD0+IXQuc3RhcnRzV2l0aCgiXyIpKSk7bGV0IGV0PWJlO2NvbnN0IGplPWNsYXNzIGple3N0YXRpYyBnZXRSYXdEYXRhKCl7cmV0dXJuIEpTT04ucGFyc2UoIls5LDEwLDExLDEyLDEzLDMyLDEyNywxNjAsMTczLDg0NywxNTY0LDQ0NDcsNDQ0OCw2MDY4LDYwNjksNjE1NSw2MTU2LDYxNTcsNjE1OCw3MzU1LDczNTYsODE5Miw4MTkzLDgxOTQsODE5NSw4MTk2LDgxOTcsODE5OCw4MTk5LDgyMDAsODIwMSw4MjAyLDgyMDMsODIwNCw4MjA1LDgyMDYsODIwNyw4MjM0LDgyMzUsODIzNiw4MjM3LDgyMzgsODIzOSw4Mjg3LDgyODgsODI4OSw4MjkwLDgyOTEsODI5Miw4MjkzLDgyOTQsODI5NSw4Mjk2LDgyOTcsODI5OCw4Mjk5LDgzMDAsODMwMSw4MzAyLDgzMDMsMTAyNDAsMTIyODgsMTI2NDQsNjUwMjQsNjUwMjUsNjUwMjYsNjUwMjcsNjUwMjgsNjUwMjksNjUwMzAsNjUwMzEsNjUwMzIsNjUwMzMsNjUwMzQsNjUwMzUsNjUwMzYsNjUwMzcsNjUwMzgsNjUwMzksNjUyNzksNjU0NDAsNjU1MjAsNjU1MjEsNjU1MjIsNjU1MjMsNjU1MjQsNjU1MjUsNjU1MjYsNjU1MjcsNjU1MjgsNjU1MzIsNzg4NDQsMTE5MTU1LDExOTE1NiwxMTkxNTcsMTE5MTU4LDExOTE1OSwxMTkxNjAsMTE5MTYxLDExOTE2Miw5MTc1MDQsOTE3NTA1LDkxNzUwNiw5MTc1MDcsOTE3NTA4LDkxNzUwOSw5MTc1MTAsOTE3NTExLDkxNzUxMiw5MTc1MTMsOTE3NTE0LDkxNzUxNSw5MTc1MTYsOTE3NTE3LDkxNzUxOCw5MTc1MTksOTE3NTIwLDkxNzUyMSw5MTc1MjIsOTE3NTIzLDkxNzUyNCw5MTc1MjUsOTE3NTI2LDkxNzUyNyw5MTc1MjgsOTE3NTI5LDkxNzUzMCw5MTc1MzEsOTE3NTMyLDkxNzUzMyw5MTc1MzQsOTE3NTM1LDkxNzUzNiw5MTc1MzcsOTE3NTM4LDkxNzUzOSw5MTc1NDAsOTE3NTQxLDkxNzU0Miw5MTc1NDMsOTE3NTQ0LDkxNzU0NSw5MTc1NDYsOTE3NTQ3LDkxNzU0OCw5MTc1NDksOTE3NTUwLDkxNzU1MSw5MTc1NTIsOTE3NTUzLDkxNzU1NCw5MTc1NTUsOTE3NTU2LDkxNzU1Nyw5MTc1NTgsOTE3NTU5LDkxNzU2MCw5MTc1NjEsOTE3NTYyLDkxNzU2Myw5MTc1NjQsOTE3NTY1LDkxNzU2Niw5MTc1NjcsOTE3NTY4LDkxNzU2OSw5MTc1NzAsOTE3NTcxLDkxNzU3Miw5MTc1NzMsOTE3NTc0LDkxNzU3NSw5MTc1NzYsOTE3NTc3LDkxNzU3OCw5MTc1NzksOTE3NTgwLDkxNzU4MSw5MTc1ODIsOTE3NTgzLDkxNzU4NCw5MTc1ODUsOTE3NTg2LDkxNzU4Nyw5MTc1ODgsOTE3NTg5LDkxNzU5MCw5MTc1OTEsOTE3NTkyLDkxNzU5Myw5MTc1OTQsOTE3NTk1LDkxNzU5Niw5MTc1OTcsOTE3NTk4LDkxNzU5OSw5MTc2MDAsOTE3NjAxLDkxNzYwMiw5MTc2MDMsOTE3NjA0LDkxNzYwNSw5MTc2MDYsOTE3NjA3LDkxNzYwOCw5MTc2MDksOTE3NjEwLDkxNzYxMSw5MTc2MTIsOTE3NjEzLDkxNzYxNCw5MTc2MTUsOTE3NjE2LDkxNzYxNyw5MTc2MTgsOTE3NjE5LDkxNzYyMCw5MTc2MjEsOTE3NjIyLDkxNzYyMyw5MTc2MjQsOTE3NjI1LDkxNzYyNiw5MTc2MjcsOTE3NjI4LDkxNzYyOSw5MTc2MzAsOTE3NjMxLDkxNzc2MCw5MTc3NjEsOTE3NzYyLDkxNzc2Myw5MTc3NjQsOTE3NzY1LDkxNzc2Niw5MTc3NjcsOTE3NzY4LDkxNzc2OSw5MTc3NzAsOTE3NzcxLDkxNzc3Miw5MTc3NzMsOTE3Nzc0LDkxNzc3NSw5MTc3NzYsOTE3Nzc3LDkxNzc3OCw5MTc3NzksOTE3NzgwLDkxNzc4MSw5MTc3ODIsOTE3NzgzLDkxNzc4NCw5MTc3ODUsOTE3Nzg2LDkxNzc4Nyw5MTc3ODgsOTE3Nzg5LDkxNzc5MCw5MTc3OTEsOTE3NzkyLDkxNzc5Myw5MTc3OTQsOTE3Nzk1LDkxNzc5Niw5MTc3OTcsOTE3Nzk4LDkxNzc5OSw5MTc4MDAsOTE3ODAxLDkxNzgwMiw5MTc4MDMsOTE3ODA0LDkxNzgwNSw5MTc4MDYsOTE3ODA3LDkxNzgwOCw5MTc4MDksOTE3ODEwLDkxNzgxMSw5MTc4MTIsOTE3ODEzLDkxNzgxNCw5MTc4MTUsOTE3ODE2LDkxNzgxNyw5MTc4MTgsOTE3ODE5LDkxNzgyMCw5MTc4MjEsOTE3ODIyLDkxNzgyMyw5MTc4MjQsOTE3ODI1LDkxNzgyNiw5MTc4MjcsOTE3ODI4LDkxNzgyOSw5MTc4MzAsOTE3ODMxLDkxNzgzMiw5MTc4MzMsOTE3ODM0LDkxNzgzNSw5MTc4MzYsOTE3ODM3LDkxNzgzOCw5MTc4MzksOTE3ODQwLDkxNzg0MSw5MTc4NDIsOTE3ODQzLDkxNzg0NCw5MTc4NDUsOTE3ODQ2LDkxNzg0Nyw5MTc4NDgsOTE3ODQ5LDkxNzg1MCw5MTc4NTEsOTE3ODUyLDkxNzg1Myw5MTc4NTQsOTE3ODU1LDkxNzg1Niw5MTc4NTcsOTE3ODU4LDkxNzg1OSw5MTc4NjAsOTE3ODYxLDkxNzg2Miw5MTc4NjMsOTE3ODY0LDkxNzg2NSw5MTc4NjYsOTE3ODY3LDkxNzg2OCw5MTc4NjksOTE3ODcwLDkxNzg3MSw5MTc4NzIsOTE3ODczLDkxNzg3NCw5MTc4NzUsOTE3ODc2LDkxNzg3Nyw5MTc4NzgsOTE3ODc5LDkxNzg4MCw5MTc4ODEsOTE3ODgyLDkxNzg4Myw5MTc4ODQsOTE3ODg1LDkxNzg4Niw5MTc4ODcsOTE3ODg4LDkxNzg4OSw5MTc4OTAsOTE3ODkxLDkxNzg5Miw5MTc4OTMsOTE3ODk0LDkxNzg5NSw5MTc4OTYsOTE3ODk3LDkxNzg5OCw5MTc4OTksOTE3OTAwLDkxNzkwMSw5MTc5MDIsOTE3OTAzLDkxNzkwNCw5MTc5MDUsOTE3OTA2LDkxNzkwNyw5MTc5MDgsOTE3OTA5LDkxNzkxMCw5MTc5MTEsOTE3OTEyLDkxNzkxMyw5MTc5MTQsOTE3OTE1LDkxNzkxNiw5MTc5MTcsOTE3OTE4LDkxNzkxOSw5MTc5MjAsOTE3OTIxLDkxNzkyMiw5MTc5MjMsOTE3OTI0LDkxNzkyNSw5MTc5MjYsOTE3OTI3LDkxNzkyOCw5MTc5MjksOTE3OTMwLDkxNzkzMSw5MTc5MzIsOTE3OTMzLDkxNzkzNCw5MTc5MzUsOTE3OTM2LDkxNzkzNyw5MTc5MzgsOTE3OTM5LDkxNzk0MCw5MTc5NDEsOTE3OTQyLDkxNzk0Myw5MTc5NDQsOTE3OTQ1LDkxNzk0Niw5MTc5NDcsOTE3OTQ4LDkxNzk0OSw5MTc5NTAsOTE3OTUxLDkxNzk1Miw5MTc5NTMsOTE3OTU0LDkxNzk1NSw5MTc5NTYsOTE3OTU3LDkxNzk1OCw5MTc5NTksOTE3OTYwLDkxNzk2MSw5MTc5NjIsOTE3OTYzLDkxNzk2NCw5MTc5NjUsOTE3OTY2LDkxNzk2Nyw5MTc5NjgsOTE3OTY5LDkxNzk3MCw5MTc5NzEsOTE3OTcyLDkxNzk3Myw5MTc5NzQsOTE3OTc1LDkxNzk3Niw5MTc5NzcsOTE3OTc4LDkxNzk3OSw5MTc5ODAsOTE3OTgxLDkxNzk4Miw5MTc5ODMsOTE3OTg0LDkxNzk4NSw5MTc5ODYsOTE3OTg3LDkxNzk4OCw5MTc5ODksOTE3OTkwLDkxNzk5MSw5MTc5OTIsOTE3OTkzLDkxNzk5NCw5MTc5OTUsOTE3OTk2LDkxNzk5Nyw5MTc5OTgsOTE3OTk5XSIpfXN0YXRpYyBnZXREYXRhKCl7cmV0dXJuIHRoaXMuX2RhdGF8fCh0aGlzLl9kYXRhPW5ldyBTZXQoamUuZ2V0UmF3RGF0YSgpKSksdGhpcy5fZGF0YX1zdGF0aWMgaXNJbnZpc2libGVDaGFyYWN0ZXIodCl7cmV0dXJuIGplLmdldERhdGEoKS5oYXModCl9c3RhdGljIGdldCBjb2RlUG9pbnRzKCl7cmV0dXJuIGplLmdldERhdGEoKX19O2plLl9kYXRhPXZvaWQgMDtsZXQgdHQ9amUsVGU7Y29uc3QgWXQ9Z2xvYmFsVGhpcy52c2NvZGU7aWYodHlwZW9mIFl0PCJ1IiYmdHlwZW9mIFl0LnByb2Nlc3M8InUiKXtjb25zdCBlPVl0LnByb2Nlc3M7VGU9e2dldCBwbGF0Zm9ybSgpe3JldHVybiBlLnBsYXRmb3JtfSxnZXQgYXJjaCgpe3JldHVybiBlLmFyY2h9LGdldCBlbnYoKXtyZXR1cm4gZS5lbnZ9LGN3ZCgpe3JldHVybiBlLmN3ZCgpfX19ZWxzZSB0eXBlb2YgcHJvY2VzczwidSImJnR5cGVvZigoJHM9cHJvY2Vzcz09bnVsbD92b2lkIDA6cHJvY2Vzcy52ZXJzaW9ucyk9PW51bGw/dm9pZCAwOiRzLm5vZGUpPT0ic3RyaW5nIj9UZT17Z2V0IHBsYXRmb3JtKCl7cmV0dXJuIHByb2Nlc3MucGxhdGZvcm19LGdldCBhcmNoKCl7cmV0dXJuIHByb2Nlc3MuYXJjaH0sZ2V0IGVudigpe3JldHVybiBwcm9jZXNzLmVudn0sY3dkKCl7cmV0dXJuIHByb2Nlc3MuZW52LlZTQ09ERV9DV0R8fHByb2Nlc3MuY3dkKCl9fTpUZT17Z2V0IHBsYXRmb3JtKCl7cmV0dXJuIEtlPyJ3aW4zMiI6YWk/ImRhcndpbiI6ImxpbnV4In0sZ2V0IGFyY2goKXt9LGdldCBlbnYoKXtyZXR1cm57fX0sY3dkKCl7cmV0dXJuIi8ifX07Y29uc3QgYnQ9VGUuY3dkLE5pPVRlLmVudixTaT1UZS5wbGF0Zm9ybSxDaT02NSxBaT05NyxSaT05MCx5aT0xMjIsdmU9NDYsWT00NyxyZT05MixOZT01OCxFaT02MztjbGFzcyBUbiBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsbixyKXtsZXQgczt0eXBlb2Ygbj09InN0cmluZyImJm4uaW5kZXhPZigibm90ICIpPT09MD8ocz0ibXVzdCBub3QgYmUiLG49bi5yZXBsYWNlKC9ebm90IC8sIiIpKTpzPSJtdXN0IGJlIjtjb25zdCBpPXQuaW5kZXhPZigiLiIpIT09LTE/InByb3BlcnR5IjoiYXJndW1lbnQiO2xldCBvPWBUaGUgIiR7dH0iICR7aX0gJHtzfSBvZiB0eXBlICR7bn1gO28rPWAuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2Ygcn1gLHN1cGVyKG8pLHRoaXMuY29kZT0iRVJSX0lOVkFMSURfQVJHX1RZUEUifX1mdW5jdGlvbiBNaShlLHQpe2lmKGU9PT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IFRuKHQsIk9iamVjdCIsZSl9ZnVuY3Rpb24gaihlLHQpe2lmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBuZXcgVG4odCwic3RyaW5nIixlKX1jb25zdCBwZT1TaT09PSJ3aW4zMiI7ZnVuY3Rpb24gVChlKXtyZXR1cm4gZT09PVl8fGU9PT1yZX1mdW5jdGlvbiBKdChlKXtyZXR1cm4gZT09PVl9ZnVuY3Rpb24gU2UoZSl7cmV0dXJuIGU+PUNpJiZlPD1SaXx8ZT49QWkmJmU8PXlpfWZ1bmN0aW9uIHh0KGUsdCxuLHIpe2xldCBzPSIiLGk9MCxvPS0xLGw9MCx1PTA7Zm9yKGxldCBjPTA7Yzw9ZS5sZW5ndGg7KytjKXtpZihjPGUubGVuZ3RoKXU9ZS5jaGFyQ29kZUF0KGMpO2Vsc2V7aWYocih1KSlicmVhazt1PVl9aWYocih1KSl7aWYoIShvPT09Yy0xfHxsPT09MSkpaWYobD09PTIpe2lmKHMubGVuZ3RoPDJ8fGkhPT0yfHxzLmNoYXJDb2RlQXQocy5sZW5ndGgtMSkhPT12ZXx8cy5jaGFyQ29kZUF0KHMubGVuZ3RoLTIpIT09dmUpe2lmKHMubGVuZ3RoPjIpe2NvbnN0IGg9cy5sYXN0SW5kZXhPZihuKTtoPT09LTE/KHM9IiIsaT0wKToocz1zLnNsaWNlKDAsaCksaT1zLmxlbmd0aC0xLXMubGFzdEluZGV4T2YobikpLG89YyxsPTA7Y29udGludWV9ZWxzZSBpZihzLmxlbmd0aCE9PTApe3M9IiIsaT0wLG89YyxsPTA7Y29udGludWV9fXQmJihzKz1zLmxlbmd0aD4wP2Ake259Li5gOiIuLiIsaT0yKX1lbHNlIHMubGVuZ3RoPjA/cys9YCR7bn0ke2Uuc2xpY2UobysxLGMpfWA6cz1lLnNsaWNlKG8rMSxjKSxpPWMtby0xO289YyxsPTB9ZWxzZSB1PT09dmUmJmwhPT0tMT8rK2w6bD0tMX1yZXR1cm4gc31mdW5jdGlvbiBraShlKXtyZXR1cm4gZT9gJHtlWzBdPT09Ii4iPyIiOiIuIn0ke2V9YDoiIn1mdW5jdGlvbiBJbihlLHQpe01pKHQsInBhdGhPYmplY3QiKTtjb25zdCBuPXQuZGlyfHx0LnJvb3Qscj10LmJhc2V8fGAke3QubmFtZXx8IiJ9JHtraSh0LmV4dCl9YDtyZXR1cm4gbj9uPT09dC5yb290P2Ake259JHtyfWA6YCR7bn0ke2V9JHtyfWA6cn1jb25zdCBLPXtyZXNvbHZlKC4uLmUpe2xldCB0PSIiLG49IiIscj0hMTtmb3IobGV0IHM9ZS5sZW5ndGgtMTtzPj0tMTtzLS0pe2xldCBpO2lmKHM+PTApe2lmKGk9ZVtzXSxqKGksYHBhdGhzWyR7c31dYCksaS5sZW5ndGg9PT0wKWNvbnRpbnVlfWVsc2UgdC5sZW5ndGg9PT0wP2k9YnQoKTooaT1OaVtgPSR7dH1gXXx8YnQoKSwoaT09PXZvaWQgMHx8aS5zbGljZSgwLDIpLnRvTG93ZXJDYXNlKCkhPT10LnRvTG93ZXJDYXNlKCkmJmkuY2hhckNvZGVBdCgyKT09PXJlKSYmKGk9YCR7dH1cXGApKTtjb25zdCBvPWkubGVuZ3RoO2xldCBsPTAsdT0iIixjPSExO2NvbnN0IGg9aS5jaGFyQ29kZUF0KDApO2lmKG89PT0xKVQoaCkmJihsPTEsYz0hMCk7ZWxzZSBpZihUKGgpKWlmKGM9ITAsVChpLmNoYXJDb2RlQXQoMSkpKXtsZXQgZj0yLGQ9Zjtmb3IoO2Y8byYmIVQoaS5jaGFyQ29kZUF0KGYpKTspZisrO2lmKGY8byYmZiE9PWQpe2NvbnN0IG09aS5zbGljZShkLGYpO2ZvcihkPWY7ZjxvJiZUKGkuY2hhckNvZGVBdChmKSk7KWYrKztpZihmPG8mJmYhPT1kKXtmb3IoZD1mO2Y8byYmIVQoaS5jaGFyQ29kZUF0KGYpKTspZisrOyhmPT09b3x8ZiE9PWQpJiYodT1gXFxcXCR7bX1cXCR7aS5zbGljZShkLGYpfWAsbD1mKX19fWVsc2UgbD0xO2Vsc2UgU2UoaCkmJmkuY2hhckNvZGVBdCgxKT09PU5lJiYodT1pLnNsaWNlKDAsMiksbD0yLG8+MiYmVChpLmNoYXJDb2RlQXQoMikpJiYoYz0hMCxsPTMpKTtpZih1Lmxlbmd0aD4wKWlmKHQubGVuZ3RoPjApe2lmKHUudG9Mb3dlckNhc2UoKSE9PXQudG9Mb3dlckNhc2UoKSljb250aW51ZX1lbHNlIHQ9dTtpZihyKXtpZih0Lmxlbmd0aD4wKWJyZWFrfWVsc2UgaWYobj1gJHtpLnNsaWNlKGwpfVxcJHtufWAscj1jLGMmJnQubGVuZ3RoPjApYnJlYWt9cmV0dXJuIG49eHQobiwhciwiXFwiLFQpLHI/YCR7dH1cXCR7bn1gOmAke3R9JHtufWB8fCIuIn0sbm9ybWFsaXplKGUpe2ooZSwicGF0aCIpO2NvbnN0IHQ9ZS5sZW5ndGg7aWYodD09PTApcmV0dXJuIi4iO2xldCBuPTAscixzPSExO2NvbnN0IGk9ZS5jaGFyQ29kZUF0KDApO2lmKHQ9PT0xKXJldHVybiBKdChpKT8iXFwiOmU7aWYoVChpKSlpZihzPSEwLFQoZS5jaGFyQ29kZUF0KDEpKSl7bGV0IGw9Mix1PWw7Zm9yKDtsPHQmJiFUKGUuY2hhckNvZGVBdChsKSk7KWwrKztpZihsPHQmJmwhPT11KXtjb25zdCBjPWUuc2xpY2UodSxsKTtmb3IodT1sO2w8dCYmVChlLmNoYXJDb2RlQXQobCkpOylsKys7aWYobDx0JiZsIT09dSl7Zm9yKHU9bDtsPHQmJiFUKGUuY2hhckNvZGVBdChsKSk7KWwrKztpZihsPT09dClyZXR1cm5gXFxcXCR7Y31cXCR7ZS5zbGljZSh1KX1cXGA7bCE9PXUmJihyPWBcXFxcJHtjfVxcJHtlLnNsaWNlKHUsbCl9YCxuPWwpfX19ZWxzZSBuPTE7ZWxzZSBTZShpKSYmZS5jaGFyQ29kZUF0KDEpPT09TmUmJihyPWUuc2xpY2UoMCwyKSxuPTIsdD4yJiZUKGUuY2hhckNvZGVBdCgyKSkmJihzPSEwLG49MykpO2xldCBvPW48dD94dChlLnNsaWNlKG4pLCFzLCJcXCIsVCk6IiI7cmV0dXJuIG8ubGVuZ3RoPT09MCYmIXMmJihvPSIuIiksby5sZW5ndGg+MCYmVChlLmNoYXJDb2RlQXQodC0xKSkmJihvKz0iXFwiKSxyPT09dm9pZCAwP3M/YFxcJHtvfWA6bzpzP2Ake3J9XFwke299YDpgJHtyfSR7b31gfSxpc0Fic29sdXRlKGUpe2ooZSwicGF0aCIpO2NvbnN0IHQ9ZS5sZW5ndGg7aWYodD09PTApcmV0dXJuITE7Y29uc3Qgbj1lLmNoYXJDb2RlQXQoMCk7cmV0dXJuIFQobil8fHQ+MiYmU2UobikmJmUuY2hhckNvZGVBdCgxKT09PU5lJiZUKGUuY2hhckNvZGVBdCgyKSl9LGpvaW4oLi4uZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiIuIjtsZXQgdCxuO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7KytpKXtjb25zdCBvPWVbaV07aihvLCJwYXRoIiksby5sZW5ndGg+MCYmKHQ9PT12b2lkIDA/dD1uPW86dCs9YFxcJHtvfWApfWlmKHQ9PT12b2lkIDApcmV0dXJuIi4iO2xldCByPSEwLHM9MDtpZih0eXBlb2Ygbj09InN0cmluZyImJlQobi5jaGFyQ29kZUF0KDApKSl7KytzO2NvbnN0IGk9bi5sZW5ndGg7aT4xJiZUKG4uY2hhckNvZGVBdCgxKSkmJigrK3MsaT4yJiYoVChuLmNoYXJDb2RlQXQoMikpPysrczpyPSExKSl9aWYocil7Zm9yKDtzPHQubGVuZ3RoJiZUKHQuY2hhckNvZGVBdChzKSk7KXMrKztzPj0yJiYodD1gXFwke3Quc2xpY2Uocyl9YCl9cmV0dXJuIEsubm9ybWFsaXplKHQpfSxyZWxhdGl2ZShlLHQpe2lmKGooZSwiZnJvbSIpLGoodCwidG8iKSxlPT09dClyZXR1cm4iIjtjb25zdCBuPUsucmVzb2x2ZShlKSxyPUsucmVzb2x2ZSh0KTtpZihuPT09cnx8KGU9bi50b0xvd2VyQ2FzZSgpLHQ9ci50b0xvd2VyQ2FzZSgpLGU9PT10KSlyZXR1cm4iIjtsZXQgcz0wO2Zvcig7czxlLmxlbmd0aCYmZS5jaGFyQ29kZUF0KHMpPT09cmU7KXMrKztsZXQgaT1lLmxlbmd0aDtmb3IoO2ktMT5zJiZlLmNoYXJDb2RlQXQoaS0xKT09PXJlOylpLS07Y29uc3Qgbz1pLXM7bGV0IGw9MDtmb3IoO2w8dC5sZW5ndGgmJnQuY2hhckNvZGVBdChsKT09PXJlOylsKys7bGV0IHU9dC5sZW5ndGg7Zm9yKDt1LTE+bCYmdC5jaGFyQ29kZUF0KHUtMSk9PT1yZTspdS0tO2NvbnN0IGM9dS1sLGg9bzxjP286YztsZXQgZj0tMSxkPTA7Zm9yKDtkPGg7ZCsrKXtjb25zdCBnPWUuY2hhckNvZGVBdChzK2QpO2lmKGchPT10LmNoYXJDb2RlQXQobCtkKSlicmVhaztnPT09cmUmJihmPWQpfWlmKGQhPT1oKXtpZihmPT09LTEpcmV0dXJuIHJ9ZWxzZXtpZihjPmgpe2lmKHQuY2hhckNvZGVBdChsK2QpPT09cmUpcmV0dXJuIHIuc2xpY2UobCtkKzEpO2lmKGQ9PT0yKXJldHVybiByLnNsaWNlKGwrZCl9bz5oJiYoZS5jaGFyQ29kZUF0KHMrZCk9PT1yZT9mPWQ6ZD09PTImJihmPTMpKSxmPT09LTEmJihmPTApfWxldCBtPSIiO2ZvcihkPXMrZisxO2Q8PWk7KytkKShkPT09aXx8ZS5jaGFyQ29kZUF0KGQpPT09cmUpJiYobSs9bS5sZW5ndGg9PT0wPyIuLiI6IlxcLi4iKTtyZXR1cm4gbCs9ZixtLmxlbmd0aD4wP2Ake219JHtyLnNsaWNlKGwsdSl9YDooci5jaGFyQ29kZUF0KGwpPT09cmUmJisrbCxyLnNsaWNlKGwsdSkpfSx0b05hbWVzcGFjZWRQYXRoKGUpe2lmKHR5cGVvZiBlIT0ic3RyaW5nInx8ZS5sZW5ndGg9PT0wKXJldHVybiBlO2NvbnN0IHQ9Sy5yZXNvbHZlKGUpO2lmKHQubGVuZ3RoPD0yKXJldHVybiBlO2lmKHQuY2hhckNvZGVBdCgwKT09PXJlKXtpZih0LmNoYXJDb2RlQXQoMSk9PT1yZSl7Y29uc3Qgbj10LmNoYXJDb2RlQXQoMik7aWYobiE9PUVpJiZuIT09dmUpcmV0dXJuYFxcXFw/XFxVTkNcXCR7dC5zbGljZSgyKX1gfX1lbHNlIGlmKFNlKHQuY2hhckNvZGVBdCgwKSkmJnQuY2hhckNvZGVBdCgxKT09PU5lJiZ0LmNoYXJDb2RlQXQoMik9PT1yZSlyZXR1cm5gXFxcXD9cXCR7dH1gO3JldHVybiBlfSxkaXJuYW1lKGUpe2ooZSwicGF0aCIpO2NvbnN0IHQ9ZS5sZW5ndGg7aWYodD09PTApcmV0dXJuIi4iO2xldCBuPS0xLHI9MDtjb25zdCBzPWUuY2hhckNvZGVBdCgwKTtpZih0PT09MSlyZXR1cm4gVChzKT9lOiIuIjtpZihUKHMpKXtpZihuPXI9MSxUKGUuY2hhckNvZGVBdCgxKSkpe2xldCBsPTIsdT1sO2Zvcig7bDx0JiYhVChlLmNoYXJDb2RlQXQobCkpOylsKys7aWYobDx0JiZsIT09dSl7Zm9yKHU9bDtsPHQmJlQoZS5jaGFyQ29kZUF0KGwpKTspbCsrO2lmKGw8dCYmbCE9PXUpe2Zvcih1PWw7bDx0JiYhVChlLmNoYXJDb2RlQXQobCkpOylsKys7aWYobD09PXQpcmV0dXJuIGU7bCE9PXUmJihuPXI9bCsxKX19fX1lbHNlIFNlKHMpJiZlLmNoYXJDb2RlQXQoMSk9PT1OZSYmKG49dD4yJiZUKGUuY2hhckNvZGVBdCgyKSk/MzoyLHI9bik7bGV0IGk9LTEsbz0hMDtmb3IobGV0IGw9dC0xO2w+PXI7LS1sKWlmKFQoZS5jaGFyQ29kZUF0KGwpKSl7aWYoIW8pe2k9bDticmVha319ZWxzZSBvPSExO2lmKGk9PT0tMSl7aWYobj09PS0xKXJldHVybiIuIjtpPW59cmV0dXJuIGUuc2xpY2UoMCxpKX0sYmFzZW5hbWUoZSx0KXt0IT09dm9pZCAwJiZqKHQsInN1ZmZpeCIpLGooZSwicGF0aCIpO2xldCBuPTAscj0tMSxzPSEwLGk7aWYoZS5sZW5ndGg+PTImJlNlKGUuY2hhckNvZGVBdCgwKSkmJmUuY2hhckNvZGVBdCgxKT09PU5lJiYobj0yKSx0IT09dm9pZCAwJiZ0Lmxlbmd0aD4wJiZ0Lmxlbmd0aDw9ZS5sZW5ndGgpe2lmKHQ9PT1lKXJldHVybiIiO2xldCBvPXQubGVuZ3RoLTEsbD0tMTtmb3IoaT1lLmxlbmd0aC0xO2k+PW47LS1pKXtjb25zdCB1PWUuY2hhckNvZGVBdChpKTtpZihUKHUpKXtpZighcyl7bj1pKzE7YnJlYWt9fWVsc2UgbD09PS0xJiYocz0hMSxsPWkrMSksbz49MCYmKHU9PT10LmNoYXJDb2RlQXQobyk/LS1vPT09LTEmJihyPWkpOihvPS0xLHI9bCkpfXJldHVybiBuPT09cj9yPWw6cj09PS0xJiYocj1lLmxlbmd0aCksZS5zbGljZShuLHIpfWZvcihpPWUubGVuZ3RoLTE7aT49bjstLWkpaWYoVChlLmNoYXJDb2RlQXQoaSkpKXtpZighcyl7bj1pKzE7YnJlYWt9fWVsc2Ugcj09PS0xJiYocz0hMSxyPWkrMSk7cmV0dXJuIHI9PT0tMT8iIjplLnNsaWNlKG4scil9LGV4dG5hbWUoZSl7aihlLCJwYXRoIik7bGV0IHQ9MCxuPS0xLHI9MCxzPS0xLGk9ITAsbz0wO2UubGVuZ3RoPj0yJiZlLmNoYXJDb2RlQXQoMSk9PT1OZSYmU2UoZS5jaGFyQ29kZUF0KDApKSYmKHQ9cj0yKTtmb3IobGV0IGw9ZS5sZW5ndGgtMTtsPj10Oy0tbCl7Y29uc3QgdT1lLmNoYXJDb2RlQXQobCk7aWYoVCh1KSl7aWYoIWkpe3I9bCsxO2JyZWFrfWNvbnRpbnVlfXM9PT0tMSYmKGk9ITEscz1sKzEpLHU9PT12ZT9uPT09LTE/bj1sOm8hPT0xJiYobz0xKTpuIT09LTEmJihvPS0xKX1yZXR1cm4gbj09PS0xfHxzPT09LTF8fG89PT0wfHxvPT09MSYmbj09PXMtMSYmbj09PXIrMT8iIjplLnNsaWNlKG4scyl9LGZvcm1hdDpJbi5iaW5kKG51bGwsIlxcIikscGFyc2UoZSl7aihlLCJwYXRoIik7Y29uc3QgdD17cm9vdDoiIixkaXI6IiIsYmFzZToiIixleHQ6IiIsbmFtZToiIn07aWYoZS5sZW5ndGg9PT0wKXJldHVybiB0O2NvbnN0IG49ZS5sZW5ndGg7bGV0IHI9MCxzPWUuY2hhckNvZGVBdCgwKTtpZihuPT09MSlyZXR1cm4gVChzKT8odC5yb290PXQuZGlyPWUsdCk6KHQuYmFzZT10Lm5hbWU9ZSx0KTtpZihUKHMpKXtpZihyPTEsVChlLmNoYXJDb2RlQXQoMSkpKXtsZXQgZj0yLGQ9Zjtmb3IoO2Y8biYmIVQoZS5jaGFyQ29kZUF0KGYpKTspZisrO2lmKGY8biYmZiE9PWQpe2ZvcihkPWY7ZjxuJiZUKGUuY2hhckNvZGVBdChmKSk7KWYrKztpZihmPG4mJmYhPT1kKXtmb3IoZD1mO2Y8biYmIVQoZS5jaGFyQ29kZUF0KGYpKTspZisrO2Y9PT1uP3I9ZjpmIT09ZCYmKHI9ZisxKX19fX1lbHNlIGlmKFNlKHMpJiZlLmNoYXJDb2RlQXQoMSk9PT1OZSl7aWYobjw9MilyZXR1cm4gdC5yb290PXQuZGlyPWUsdDtpZihyPTIsVChlLmNoYXJDb2RlQXQoMikpKXtpZihuPT09MylyZXR1cm4gdC5yb290PXQuZGlyPWUsdDtyPTN9fXI+MCYmKHQucm9vdD1lLnNsaWNlKDAscikpO2xldCBpPS0xLG89cixsPS0xLHU9ITAsYz1lLmxlbmd0aC0xLGg9MDtmb3IoO2M+PXI7LS1jKXtpZihzPWUuY2hhckNvZGVBdChjKSxUKHMpKXtpZighdSl7bz1jKzE7YnJlYWt9Y29udGludWV9bD09PS0xJiYodT0hMSxsPWMrMSkscz09PXZlP2k9PT0tMT9pPWM6aCE9PTEmJihoPTEpOmkhPT0tMSYmKGg9LTEpfXJldHVybiBsIT09LTEmJihpPT09LTF8fGg9PT0wfHxoPT09MSYmaT09PWwtMSYmaT09PW8rMT90LmJhc2U9dC5uYW1lPWUuc2xpY2UobyxsKToodC5uYW1lPWUuc2xpY2UobyxpKSx0LmJhc2U9ZS5zbGljZShvLGwpLHQuZXh0PWUuc2xpY2UoaSxsKSkpLG8+MCYmbyE9PXI/dC5kaXI9ZS5zbGljZSgwLG8tMSk6dC5kaXI9dC5yb290LHR9LHNlcDoiXFwiLGRlbGltaXRlcjoiOyIsd2luMzI6bnVsbCxwb3NpeDpudWxsfSxQaT0oKCk9PntpZihwZSl7Y29uc3QgZT0vXFwvZztyZXR1cm4oKT0+e2NvbnN0IHQ9YnQoKS5yZXBsYWNlKGUsIi8iKTtyZXR1cm4gdC5zbGljZSh0LmluZGV4T2YoIi8iKSl9fXJldHVybigpPT5idCgpfSkoKSxlZT17cmVzb2x2ZSguLi5lKXtsZXQgdD0iIixuPSExO2ZvcihsZXQgcj1lLmxlbmd0aC0xO3I+PS0xJiYhbjtyLS0pe2NvbnN0IHM9cj49MD9lW3JdOlBpKCk7aihzLGBwYXRoc1ske3J9XWApLHMubGVuZ3RoIT09MCYmKHQ9YCR7c30vJHt0fWAsbj1zLmNoYXJDb2RlQXQoMCk9PT1ZKX1yZXR1cm4gdD14dCh0LCFuLCIvIixKdCksbj9gLyR7dH1gOnQubGVuZ3RoPjA/dDoiLiJ9LG5vcm1hbGl6ZShlKXtpZihqKGUsInBhdGgiKSxlLmxlbmd0aD09PTApcmV0dXJuIi4iO2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KDApPT09WSxuPWUuY2hhckNvZGVBdChlLmxlbmd0aC0xKT09PVk7cmV0dXJuIGU9eHQoZSwhdCwiLyIsSnQpLGUubGVuZ3RoPT09MD90PyIvIjpuPyIuLyI6Ii4iOihuJiYoZSs9Ii8iKSx0P2AvJHtlfWA6ZSl9LGlzQWJzb2x1dGUoZSl7cmV0dXJuIGooZSwicGF0aCIpLGUubGVuZ3RoPjAmJmUuY2hhckNvZGVBdCgwKT09PVl9LGpvaW4oLi4uZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiIuIjtsZXQgdDtmb3IobGV0IG49MDtuPGUubGVuZ3RoOysrbil7Y29uc3Qgcj1lW25dO2oociwicGF0aCIpLHIubGVuZ3RoPjAmJih0PT09dm9pZCAwP3Q9cjp0Kz1gLyR7cn1gKX1yZXR1cm4gdD09PXZvaWQgMD8iLiI6ZWUubm9ybWFsaXplKHQpfSxyZWxhdGl2ZShlLHQpe2lmKGooZSwiZnJvbSIpLGoodCwidG8iKSxlPT09dHx8KGU9ZWUucmVzb2x2ZShlKSx0PWVlLnJlc29sdmUodCksZT09PXQpKXJldHVybiIiO2NvbnN0IG49MSxyPWUubGVuZ3RoLHM9ci1uLGk9MSxvPXQubGVuZ3RoLWksbD1zPG8/czpvO2xldCB1PS0xLGM9MDtmb3IoO2M8bDtjKyspe2NvbnN0IGY9ZS5jaGFyQ29kZUF0KG4rYyk7aWYoZiE9PXQuY2hhckNvZGVBdChpK2MpKWJyZWFrO2Y9PT1ZJiYodT1jKX1pZihjPT09bClpZihvPmwpe2lmKHQuY2hhckNvZGVBdChpK2MpPT09WSlyZXR1cm4gdC5zbGljZShpK2MrMSk7aWYoYz09PTApcmV0dXJuIHQuc2xpY2UoaStjKX1lbHNlIHM+bCYmKGUuY2hhckNvZGVBdChuK2MpPT09WT91PWM6Yz09PTAmJih1PTApKTtsZXQgaD0iIjtmb3IoYz1uK3UrMTtjPD1yOysrYykoYz09PXJ8fGUuY2hhckNvZGVBdChjKT09PVkpJiYoaCs9aC5sZW5ndGg9PT0wPyIuLiI6Ii8uLiIpO3JldHVybmAke2h9JHt0LnNsaWNlKGkrdSl9YH0sdG9OYW1lc3BhY2VkUGF0aChlKXtyZXR1cm4gZX0sZGlybmFtZShlKXtpZihqKGUsInBhdGgiKSxlLmxlbmd0aD09PTApcmV0dXJuIi4iO2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KDApPT09WTtsZXQgbj0tMSxyPSEwO2ZvcihsZXQgcz1lLmxlbmd0aC0xO3M+PTE7LS1zKWlmKGUuY2hhckNvZGVBdChzKT09PVkpe2lmKCFyKXtuPXM7YnJlYWt9fWVsc2Ugcj0hMTtyZXR1cm4gbj09PS0xP3Q/Ii8iOiIuIjp0JiZuPT09MT8iLy8iOmUuc2xpY2UoMCxuKX0sYmFzZW5hbWUoZSx0KXt0IT09dm9pZCAwJiZqKHQsImV4dCIpLGooZSwicGF0aCIpO2xldCBuPTAscj0tMSxzPSEwLGk7aWYodCE9PXZvaWQgMCYmdC5sZW5ndGg+MCYmdC5sZW5ndGg8PWUubGVuZ3RoKXtpZih0PT09ZSlyZXR1cm4iIjtsZXQgbz10Lmxlbmd0aC0xLGw9LTE7Zm9yKGk9ZS5sZW5ndGgtMTtpPj0wOy0taSl7Y29uc3QgdT1lLmNoYXJDb2RlQXQoaSk7aWYodT09PVkpe2lmKCFzKXtuPWkrMTticmVha319ZWxzZSBsPT09LTEmJihzPSExLGw9aSsxKSxvPj0wJiYodT09PXQuY2hhckNvZGVBdChvKT8tLW89PT0tMSYmKHI9aSk6KG89LTEscj1sKSl9cmV0dXJuIG49PT1yP3I9bDpyPT09LTEmJihyPWUubGVuZ3RoKSxlLnNsaWNlKG4scil9Zm9yKGk9ZS5sZW5ndGgtMTtpPj0wOy0taSlpZihlLmNoYXJDb2RlQXQoaSk9PT1ZKXtpZighcyl7bj1pKzE7YnJlYWt9fWVsc2Ugcj09PS0xJiYocz0hMSxyPWkrMSk7cmV0dXJuIHI9PT0tMT8iIjplLnNsaWNlKG4scil9LGV4dG5hbWUoZSl7aihlLCJwYXRoIik7bGV0IHQ9LTEsbj0wLHI9LTEscz0hMCxpPTA7Zm9yKGxldCBvPWUubGVuZ3RoLTE7bz49MDstLW8pe2NvbnN0IGw9ZS5jaGFyQ29kZUF0KG8pO2lmKGw9PT1ZKXtpZighcyl7bj1vKzE7YnJlYWt9Y29udGludWV9cj09PS0xJiYocz0hMSxyPW8rMSksbD09PXZlP3Q9PT0tMT90PW86aSE9PTEmJihpPTEpOnQhPT0tMSYmKGk9LTEpfXJldHVybiB0PT09LTF8fHI9PT0tMXx8aT09PTB8fGk9PT0xJiZ0PT09ci0xJiZ0PT09bisxPyIiOmUuc2xpY2UodCxyKX0sZm9ybWF0OkluLmJpbmQobnVsbCwiLyIpLHBhcnNlKGUpe2ooZSwicGF0aCIpO2NvbnN0IHQ9e3Jvb3Q6IiIsZGlyOiIiLGJhc2U6IiIsZXh0OiIiLG5hbWU6IiJ9O2lmKGUubGVuZ3RoPT09MClyZXR1cm4gdDtjb25zdCBuPWUuY2hhckNvZGVBdCgwKT09PVk7bGV0IHI7bj8odC5yb290PSIvIixyPTEpOnI9MDtsZXQgcz0tMSxpPTAsbz0tMSxsPSEwLHU9ZS5sZW5ndGgtMSxjPTA7Zm9yKDt1Pj1yOy0tdSl7Y29uc3QgaD1lLmNoYXJDb2RlQXQodSk7aWYoaD09PVkpe2lmKCFsKXtpPXUrMTticmVha31jb250aW51ZX1vPT09LTEmJihsPSExLG89dSsxKSxoPT09dmU/cz09PS0xP3M9dTpjIT09MSYmKGM9MSk6cyE9PS0xJiYoYz0tMSl9aWYobyE9PS0xKXtjb25zdCBoPWk9PT0wJiZuPzE6aTtzPT09LTF8fGM9PT0wfHxjPT09MSYmcz09PW8tMSYmcz09PWkrMT90LmJhc2U9dC5uYW1lPWUuc2xpY2UoaCxvKToodC5uYW1lPWUuc2xpY2UoaCxzKSx0LmJhc2U9ZS5zbGljZShoLG8pLHQuZXh0PWUuc2xpY2UocyxvKSl9cmV0dXJuIGk+MD90LmRpcj1lLnNsaWNlKDAsaS0xKTpuJiYodC5kaXI9Ii8iKSx0fSxzZXA6Ii8iLGRlbGltaXRlcjoiOiIsd2luMzI6bnVsbCxwb3NpeDpudWxsfTtlZS53aW4zMj1LLndpbjMyPUssZWUucG9zaXg9Sy5wb3NpeD1lZSxwZT9LLm5vcm1hbGl6ZTplZS5ub3JtYWxpemU7Y29uc3QgRmk9cGU/Sy5qb2luOmVlLmpvaW47cGU/Sy5yZXNvbHZlOmVlLnJlc29sdmUscGU/Sy5yZWxhdGl2ZTplZS5yZWxhdGl2ZSxwZT9LLmRpcm5hbWU6ZWUuZGlybmFtZSxwZT9LLmJhc2VuYW1lOmVlLmJhc2VuYW1lLHBlP0suZXh0bmFtZTplZS5leHRuYW1lLHBlP0suc2VwOmVlLnNlcDtjb25zdCBEaT0vXlx3W1x3XGQrLi1dKiQvLFRpPS9eXC8vLElpPS9eXC9cLy87ZnVuY3Rpb24gVmkoZSx0KXtpZighZS5zY2hlbWUmJnQpdGhyb3cgbmV3IEVycm9yKGBbVXJpRXJyb3JdOiBTY2hlbWUgaXMgbWlzc2luZzoge3NjaGVtZTogIiIsIGF1dGhvcml0eTogIiR7ZS5hdXRob3JpdHl9IiwgcGF0aDogIiR7ZS5wYXRofSIsIHF1ZXJ5OiAiJHtlLnF1ZXJ5fSIsIGZyYWdtZW50OiAiJHtlLmZyYWdtZW50fSJ9YCk7aWYoZS5zY2hlbWUmJiFEaS50ZXN0KGUuc2NoZW1lKSl0aHJvdyBuZXcgRXJyb3IoIltVcmlFcnJvcl06IFNjaGVtZSBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMuIik7aWYoZS5wYXRoKXtpZihlLmF1dGhvcml0eSl7aWYoIVRpLnRlc3QoZS5wYXRoKSl0aHJvdyBuZXcgRXJyb3IoJ1tVcmlFcnJvcl06IElmIGEgVVJJIGNvbnRhaW5zIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY29tcG9uZW50IG11c3QgZWl0aGVyIGJlIGVtcHR5IG9yIGJlZ2luIHdpdGggYSBzbGFzaCAoIi8iKSBjaGFyYWN0ZXInKX1lbHNlIGlmKElpLnRlc3QoZS5wYXRoKSl0aHJvdyBuZXcgRXJyb3IoJ1tVcmlFcnJvcl06IElmIGEgVVJJIGRvZXMgbm90IGNvbnRhaW4gYW4gYXV0aG9yaXR5IGNvbXBvbmVudCwgdGhlbiB0aGUgcGF0aCBjYW5ub3QgYmVnaW4gd2l0aCB0d28gc2xhc2ggY2hhcmFjdGVycyAoIi8vIiknKX19ZnVuY3Rpb24gQmkoZSx0KXtyZXR1cm4hZSYmIXQ/ImZpbGUiOmV9ZnVuY3Rpb24gcWkoZSx0KXtzd2l0Y2goZSl7Y2FzZSJodHRwcyI6Y2FzZSJodHRwIjpjYXNlImZpbGUiOnQ/dFswXSE9PWZlJiYodD1mZSt0KTp0PWZlO2JyZWFrfXJldHVybiB0fWNvbnN0IFc9IiIsZmU9Ii8iLFVpPS9eKChbXjovPyNdKz8pOik/KFwvXC8oW14vPyNdKikpPyhbXj8jXSopKFw/KFteI10qKSk/KCMoLiopKT8vO2NsYXNzIHNle3N0YXRpYyBpc1VyaSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHNlPyEwOnQ/dHlwZW9mIHQuYXV0aG9yaXR5PT0ic3RyaW5nIiYmdHlwZW9mIHQuZnJhZ21lbnQ9PSJzdHJpbmciJiZ0eXBlb2YgdC5wYXRoPT0ic3RyaW5nIiYmdHlwZW9mIHQucXVlcnk9PSJzdHJpbmciJiZ0eXBlb2YgdC5zY2hlbWU9PSJzdHJpbmciJiZ0eXBlb2YgdC5mc1BhdGg9PSJzdHJpbmciJiZ0eXBlb2YgdC53aXRoPT0iZnVuY3Rpb24iJiZ0eXBlb2YgdC50b1N0cmluZz09ImZ1bmN0aW9uIjohMX1jb25zdHJ1Y3Rvcih0LG4scixzLGksbz0hMSl7dHlwZW9mIHQ9PSJvYmplY3QiPyh0aGlzLnNjaGVtZT10LnNjaGVtZXx8Vyx0aGlzLmF1dGhvcml0eT10LmF1dGhvcml0eXx8Vyx0aGlzLnBhdGg9dC5wYXRofHxXLHRoaXMucXVlcnk9dC5xdWVyeXx8Vyx0aGlzLmZyYWdtZW50PXQuZnJhZ21lbnR8fFcpOih0aGlzLnNjaGVtZT1CaSh0LG8pLHRoaXMuYXV0aG9yaXR5PW58fFcsdGhpcy5wYXRoPXFpKHRoaXMuc2NoZW1lLHJ8fFcpLHRoaXMucXVlcnk9c3x8Vyx0aGlzLmZyYWdtZW50PWl8fFcsVmkodGhpcyxvKSl9Z2V0IGZzUGF0aCgpe3JldHVybiBadCh0aGlzLCExKX13aXRoKHQpe2lmKCF0KXJldHVybiB0aGlzO2xldHtzY2hlbWU6bixhdXRob3JpdHk6cixwYXRoOnMscXVlcnk6aSxmcmFnbWVudDpvfT10O3JldHVybiBuPT09dm9pZCAwP249dGhpcy5zY2hlbWU6bj09PW51bGwmJihuPVcpLHI9PT12b2lkIDA/cj10aGlzLmF1dGhvcml0eTpyPT09bnVsbCYmKHI9Vykscz09PXZvaWQgMD9zPXRoaXMucGF0aDpzPT09bnVsbCYmKHM9VyksaT09PXZvaWQgMD9pPXRoaXMucXVlcnk6aT09PW51bGwmJihpPVcpLG89PT12b2lkIDA/bz10aGlzLmZyYWdtZW50Om89PT1udWxsJiYobz1XKSxuPT09dGhpcy5zY2hlbWUmJnI9PT10aGlzLmF1dGhvcml0eSYmcz09PXRoaXMucGF0aCYmaT09PXRoaXMucXVlcnkmJm89PT10aGlzLmZyYWdtZW50P3RoaXM6bmV3IEllKG4scixzLGksbyl9c3RhdGljIHBhcnNlKHQsbj0hMSl7Y29uc3Qgcj1VaS5leGVjKHQpO3JldHVybiByP25ldyBJZShyWzJdfHxXLHB0KHJbNF18fFcpLHB0KHJbNV18fFcpLHB0KHJbN118fFcpLHB0KHJbOV18fFcpLG4pOm5ldyBJZShXLFcsVyxXLFcpfXN0YXRpYyBmaWxlKHQpe2xldCBuPVc7aWYoS2UmJih0PXQucmVwbGFjZSgvXFwvZyxmZSkpLHRbMF09PT1mZSYmdFsxXT09PWZlKXtjb25zdCByPXQuaW5kZXhPZihmZSwyKTtyPT09LTE/KG49dC5zdWJzdHJpbmcoMiksdD1mZSk6KG49dC5zdWJzdHJpbmcoMixyKSx0PXQuc3Vic3RyaW5nKHIpfHxmZSl9cmV0dXJuIG5ldyBJZSgiZmlsZSIsbix0LFcsVyl9c3RhdGljIGZyb20odCxuKXtyZXR1cm4gbmV3IEllKHQuc2NoZW1lLHQuYXV0aG9yaXR5LHQucGF0aCx0LnF1ZXJ5LHQuZnJhZ21lbnQsbil9c3RhdGljIGpvaW5QYXRoKHQsLi4ubil7aWYoIXQucGF0aCl0aHJvdyBuZXcgRXJyb3IoIltVcmlFcnJvcl06IGNhbm5vdCBjYWxsIGpvaW5QYXRoIG9uIFVSSSB3aXRob3V0IHBhdGgiKTtsZXQgcjtyZXR1cm4gS2UmJnQuc2NoZW1lPT09ImZpbGUiP3I9c2UuZmlsZShLLmpvaW4oWnQodCwhMCksLi4ubikpLnBhdGg6cj1lZS5qb2luKHQucGF0aCwuLi5uKSx0LndpdGgoe3BhdGg6cn0pfXRvU3RyaW5nKHQ9ITEpe3JldHVybiBLdCh0aGlzLHQpfXRvSlNPTigpe3JldHVybiB0aGlzfXN0YXRpYyByZXZpdmUodCl7aWYodCl7aWYodCBpbnN0YW5jZW9mIHNlKXJldHVybiB0O3tjb25zdCBuPW5ldyBJZSh0KTtyZXR1cm4gbi5fZm9ybWF0dGVkPXQuZXh0ZXJuYWw/P251bGwsbi5fZnNQYXRoPXQuX3NlcD09PVZuP3QuZnNQYXRoPz9udWxsOm51bGwsbn19ZWxzZSByZXR1cm4gdH19Y29uc3QgVm49S2U/MTp2b2lkIDA7Y2xhc3MgSWUgZXh0ZW5kcyBzZXtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyksdGhpcy5fZm9ybWF0dGVkPW51bGwsdGhpcy5fZnNQYXRoPW51bGx9Z2V0IGZzUGF0aCgpe3JldHVybiB0aGlzLl9mc1BhdGh8fCh0aGlzLl9mc1BhdGg9WnQodGhpcywhMSkpLHRoaXMuX2ZzUGF0aH10b1N0cmluZyh0PSExKXtyZXR1cm4gdD9LdCh0aGlzLCEwKToodGhpcy5fZm9ybWF0dGVkfHwodGhpcy5fZm9ybWF0dGVkPUt0KHRoaXMsITEpKSx0aGlzLl9mb3JtYXR0ZWQpfXRvSlNPTigpe2NvbnN0IHQ9eyRtaWQ6MX07cmV0dXJuIHRoaXMuX2ZzUGF0aCYmKHQuZnNQYXRoPXRoaXMuX2ZzUGF0aCx0Ll9zZXA9Vm4pLHRoaXMuX2Zvcm1hdHRlZCYmKHQuZXh0ZXJuYWw9dGhpcy5fZm9ybWF0dGVkKSx0aGlzLnBhdGgmJih0LnBhdGg9dGhpcy5wYXRoKSx0aGlzLnNjaGVtZSYmKHQuc2NoZW1lPXRoaXMuc2NoZW1lKSx0aGlzLmF1dGhvcml0eSYmKHQuYXV0aG9yaXR5PXRoaXMuYXV0aG9yaXR5KSx0aGlzLnF1ZXJ5JiYodC5xdWVyeT10aGlzLnF1ZXJ5KSx0aGlzLmZyYWdtZW50JiYodC5mcmFnbWVudD10aGlzLmZyYWdtZW50KSx0fX1jb25zdCBCbj17NTg6IiUzQSIsNDc6IiUyRiIsNjM6IiUzRiIsMzU6IiUyMyIsOTE6IiU1QiIsOTM6IiU1RCIsNjQ6IiU0MCIsMzM6IiUyMSIsMzY6IiUyNCIsMzg6IiUyNiIsMzk6IiUyNyIsNDA6IiUyOCIsNDE6IiUyOSIsNDI6IiUyQSIsNDM6IiUyQiIsNDQ6IiUyQyIsNTk6IiUzQiIsNjE6IiUzRCIsMzI6IiUyMCJ9O2Z1bmN0aW9uIHFuKGUsdCxuKXtsZXQgcixzPS0xO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtjb25zdCBvPWUuY2hhckNvZGVBdChpKTtpZihvPj05NyYmbzw9MTIyfHxvPj02NSYmbzw9OTB8fG8+PTQ4JiZvPD01N3x8bz09PTQ1fHxvPT09NDZ8fG89PT05NXx8bz09PTEyNnx8dCYmbz09PTQ3fHxuJiZvPT09OTF8fG4mJm89PT05M3x8biYmbz09PTU4KXMhPT0tMSYmKHIrPWVuY29kZVVSSUNvbXBvbmVudChlLnN1YnN0cmluZyhzLGkpKSxzPS0xKSxyIT09dm9pZCAwJiYocis9ZS5jaGFyQXQoaSkpO2Vsc2V7cj09PXZvaWQgMCYmKHI9ZS5zdWJzdHIoMCxpKSk7Y29uc3QgbD1CbltvXTtsIT09dm9pZCAwPyhzIT09LTEmJihyKz1lbmNvZGVVUklDb21wb25lbnQoZS5zdWJzdHJpbmcocyxpKSkscz0tMSkscis9bCk6cz09PS0xJiYocz1pKX19cmV0dXJuIHMhPT0tMSYmKHIrPWVuY29kZVVSSUNvbXBvbmVudChlLnN1YnN0cmluZyhzKSkpLHIhPT12b2lkIDA/cjplfWZ1bmN0aW9uICRpKGUpe2xldCB0O2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXtjb25zdCByPWUuY2hhckNvZGVBdChuKTtyPT09MzV8fHI9PT02Mz8odD09PXZvaWQgMCYmKHQ9ZS5zdWJzdHIoMCxuKSksdCs9Qm5bcl0pOnQhPT12b2lkIDAmJih0Kz1lW25dKX1yZXR1cm4gdCE9PXZvaWQgMD90OmV9ZnVuY3Rpb24gWnQoZSx0KXtsZXQgbjtyZXR1cm4gZS5hdXRob3JpdHkmJmUucGF0aC5sZW5ndGg+MSYmZS5zY2hlbWU9PT0iZmlsZSI/bj1gLy8ke2UuYXV0aG9yaXR5fSR7ZS5wYXRofWA6ZS5wYXRoLmNoYXJDb2RlQXQoMCk9PT00NyYmKGUucGF0aC5jaGFyQ29kZUF0KDEpPj02NSYmZS5wYXRoLmNoYXJDb2RlQXQoMSk8PTkwfHxlLnBhdGguY2hhckNvZGVBdCgxKT49OTcmJmUucGF0aC5jaGFyQ29kZUF0KDEpPD0xMjIpJiZlLnBhdGguY2hhckNvZGVBdCgyKT09PTU4P3Q/bj1lLnBhdGguc3Vic3RyKDEpOm49ZS5wYXRoWzFdLnRvTG93ZXJDYXNlKCkrZS5wYXRoLnN1YnN0cigyKTpuPWUucGF0aCxLZSYmKG49bi5yZXBsYWNlKC9cLy9nLCJcXCIpKSxufWZ1bmN0aW9uIEt0KGUsdCl7Y29uc3Qgbj10PyRpOnFuO2xldCByPSIiLHtzY2hlbWU6cyxhdXRob3JpdHk6aSxwYXRoOm8scXVlcnk6bCxmcmFnbWVudDp1fT1lO2lmKHMmJihyKz1zLHIrPSI6IiksKGl8fHM9PT0iZmlsZSIpJiYocis9ZmUscis9ZmUpLGkpe2xldCBjPWkuaW5kZXhPZigiQCIpO2lmKGMhPT0tMSl7Y29uc3QgaD1pLnN1YnN0cigwLGMpO2k9aS5zdWJzdHIoYysxKSxjPWgubGFzdEluZGV4T2YoIjoiKSxjPT09LTE/cis9bihoLCExLCExKToocis9bihoLnN1YnN0cigwLGMpLCExLCExKSxyKz0iOiIscis9bihoLnN1YnN0cihjKzEpLCExLCEwKSkscis9IkAifWk9aS50b0xvd2VyQ2FzZSgpLGM9aS5sYXN0SW5kZXhPZigiOiIpLGM9PT0tMT9yKz1uKGksITEsITApOihyKz1uKGkuc3Vic3RyKDAsYyksITEsITApLHIrPWkuc3Vic3RyKGMpKX1pZihvKXtpZihvLmxlbmd0aD49MyYmby5jaGFyQ29kZUF0KDApPT09NDcmJm8uY2hhckNvZGVBdCgyKT09PTU4KXtjb25zdCBjPW8uY2hhckNvZGVBdCgxKTtjPj02NSYmYzw9OTAmJihvPWAvJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGMrMzIpfToke28uc3Vic3RyKDMpfWApfWVsc2UgaWYoby5sZW5ndGg+PTImJm8uY2hhckNvZGVBdCgxKT09PTU4KXtjb25zdCBjPW8uY2hhckNvZGVBdCgwKTtjPj02NSYmYzw9OTAmJihvPWAke1N0cmluZy5mcm9tQ2hhckNvZGUoYyszMil9OiR7by5zdWJzdHIoMil9YCl9cis9bihvLCEwLCExKX1yZXR1cm4gbCYmKHIrPSI/IixyKz1uKGwsITEsITEpKSx1JiYocis9IiMiLHIrPXQ/dTpxbih1LCExLCExKSkscn1mdW5jdGlvbiBVbihlKXt0cnl7cmV0dXJuIGRlY29kZVVSSUNvbXBvbmVudChlKX1jYXRjaHtyZXR1cm4gZS5sZW5ndGg+Mz9lLnN1YnN0cigwLDMpK1VuKGUuc3Vic3RyKDMpKTplfX1jb25zdCAkbj0vKCVbMC05QS1aYS16XVswLTlBLVphLXpdKSsvZztmdW5jdGlvbiBwdChlKXtyZXR1cm4gZS5tYXRjaCgkbik/ZS5yZXBsYWNlKCRuLHQ9PlVuKHQpKTplfXZhciBDZTsoZnVuY3Rpb24oZSl7ZS5pbk1lbW9yeT0iaW5tZW1vcnkiLGUudnNjb2RlPSJ2c2NvZGUiLGUuaW50ZXJuYWw9InByaXZhdGUiLGUud2Fsa1Rocm91Z2g9IndhbGtUaHJvdWdoIixlLndhbGtUaHJvdWdoU25pcHBldD0id2Fsa1Rocm91Z2hTbmlwcGV0IixlLmh0dHA9Imh0dHAiLGUuaHR0cHM9Imh0dHBzIixlLmZpbGU9ImZpbGUiLGUubWFpbHRvPSJtYWlsdG8iLGUudW50aXRsZWQ9InVudGl0bGVkIixlLmRhdGE9ImRhdGEiLGUuY29tbWFuZD0iY29tbWFuZCIsZS52c2NvZGVSZW1vdGU9InZzY29kZS1yZW1vdGUiLGUudnNjb2RlUmVtb3RlUmVzb3VyY2U9InZzY29kZS1yZW1vdGUtcmVzb3VyY2UiLGUudnNjb2RlTWFuYWdlZFJlbW90ZVJlc291cmNlPSJ2c2NvZGUtbWFuYWdlZC1yZW1vdGUtcmVzb3VyY2UiLGUudnNjb2RlVXNlckRhdGE9InZzY29kZS11c2VyZGF0YSIsZS52c2NvZGVDdXN0b21FZGl0b3I9InZzY29kZS1jdXN0b20tZWRpdG9yIixlLnZzY29kZU5vdGVib29rQ2VsbD0idnNjb2RlLW5vdGVib29rLWNlbGwiLGUudnNjb2RlTm90ZWJvb2tDZWxsTWV0YWRhdGE9InZzY29kZS1ub3RlYm9vay1jZWxsLW1ldGFkYXRhIixlLnZzY29kZU5vdGVib29rQ2VsbE1ldGFkYXRhRGlmZj0idnNjb2RlLW5vdGVib29rLWNlbGwtbWV0YWRhdGEtZGlmZiIsZS52c2NvZGVOb3RlYm9va0NlbGxPdXRwdXQ9InZzY29kZS1ub3RlYm9vay1jZWxsLW91dHB1dCIsZS52c2NvZGVOb3RlYm9va0NlbGxPdXRwdXREaWZmPSJ2c2NvZGUtbm90ZWJvb2stY2VsbC1vdXRwdXQtZGlmZiIsZS52c2NvZGVOb3RlYm9va01ldGFkYXRhPSJ2c2NvZGUtbm90ZWJvb2stbWV0YWRhdGEiLGUudnNjb2RlSW50ZXJhY3RpdmVJbnB1dD0idnNjb2RlLWludGVyYWN0aXZlLWlucHV0IixlLnZzY29kZVNldHRpbmdzPSJ2c2NvZGUtc2V0dGluZ3MiLGUudnNjb2RlV29ya3NwYWNlVHJ1c3Q9InZzY29kZS13b3Jrc3BhY2UtdHJ1c3QiLGUudnNjb2RlVGVybWluYWw9InZzY29kZS10ZXJtaW5hbCIsZS52c2NvZGVDaGF0Q29kZUJsb2NrPSJ2c2NvZGUtY2hhdC1jb2RlLWJsb2NrIixlLnZzY29kZUNoYXRDb2RlQ29tcGFyZUJsb2NrPSJ2c2NvZGUtY2hhdC1jb2RlLWNvbXBhcmUtYmxvY2siLGUudnNjb2RlQ2hhdFNlc3NzaW9uPSJ2c2NvZGUtY2hhdC1lZGl0b3IiLGUud2Vidmlld1BhbmVsPSJ3ZWJ2aWV3LXBhbmVsIixlLnZzY29kZVdlYnZpZXc9InZzY29kZS13ZWJ2aWV3IixlLmV4dGVuc2lvbj0iZXh0ZW5zaW9uIixlLnZzY29kZUZpbGVSZXNvdXJjZT0idnNjb2RlLWZpbGUiLGUudG1wPSJ0bXAiLGUudnNscz0idnNscyIsZS52c2NvZGVTb3VyY2VDb250cm9sPSJ2c2NvZGUtc2NtIixlLmNvbW1lbnRzSW5wdXQ9ImNvbW1lbnQiLGUuY29kZVNldHRpbmc9ImNvZGUtc2V0dGluZyIsZS5vdXRwdXRDaGFubmVsPSJvdXRwdXQifSkoQ2V8fChDZT17fSkpO2NvbnN0IEhpPSJ0a24iO2NsYXNzIFdpe2NvbnN0cnVjdG9yKCl7dGhpcy5faG9zdHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9wb3J0cz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX2Nvbm5lY3Rpb25Ub2tlbnM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9wcmVmZXJyZWRXZWJTY2hlbWE9Imh0dHAiLHRoaXMuX2RlbGVnYXRlPW51bGwsdGhpcy5fc2VydmVyUm9vdFBhdGg9Ii8ifXNldFByZWZlcnJlZFdlYlNjaGVtYSh0KXt0aGlzLl9wcmVmZXJyZWRXZWJTY2hlbWE9dH1nZXQgX3JlbW90ZVJlc291cmNlc1BhdGgoKXtyZXR1cm4gZWUuam9pbih0aGlzLl9zZXJ2ZXJSb290UGF0aCxDZS52c2NvZGVSZW1vdGVSZXNvdXJjZSl9cmV3cml0ZSh0KXtpZih0aGlzLl9kZWxlZ2F0ZSl0cnl7cmV0dXJuIHRoaXMuX2RlbGVnYXRlKHQpfWNhdGNoKGwpe3JldHVybiBKZShsKSx0fWNvbnN0IG49dC5hdXRob3JpdHk7bGV0IHI9dGhpcy5faG9zdHNbbl07ciYmci5pbmRleE9mKCI6IikhPT0tMSYmci5pbmRleE9mKCJbIik9PT0tMSYmKHI9YFske3J9XWApO2NvbnN0IHM9dGhpcy5fcG9ydHNbbl0saT10aGlzLl9jb25uZWN0aW9uVG9rZW5zW25dO2xldCBvPWBwYXRoPSR7ZW5jb2RlVVJJQ29tcG9uZW50KHQucGF0aCl9YDtyZXR1cm4gdHlwZW9mIGk9PSJzdHJpbmciJiYobys9YCYke0hpfT0ke2VuY29kZVVSSUNvbXBvbmVudChpKX1gKSxzZS5mcm9tKHtzY2hlbWU6bGk/dGhpcy5fcHJlZmVycmVkV2ViU2NoZW1hOkNlLnZzY29kZVJlbW90ZVJlc291cmNlLGF1dGhvcml0eTpgJHtyfToke3N9YCxwYXRoOnRoaXMuX3JlbW90ZVJlc291cmNlc1BhdGgscXVlcnk6b30pfX1jb25zdCB6aT1uZXcgV2ksT2k9InZzY29kZS1hcHAiLGx0PWNsYXNzIGx0e2FzQnJvd3NlclVyaSh0KXtjb25zdCBuPXRoaXMudG9VcmkodCk7cmV0dXJuIHRoaXMudXJpVG9Ccm93c2VyVXJpKG4pfXVyaVRvQnJvd3NlclVyaSh0KXtyZXR1cm4gdC5zY2hlbWU9PT1DZS52c2NvZGVSZW1vdGU/emkucmV3cml0ZSh0KTp0LnNjaGVtZT09PUNlLmZpbGUmJihvaXx8dWk9PT1gJHtDZS52c2NvZGVGaWxlUmVzb3VyY2V9Oi8vJHtsdC5GQUxMQkFDS19BVVRIT1JJVFl9YCk/dC53aXRoKHtzY2hlbWU6Q2UudnNjb2RlRmlsZVJlc291cmNlLGF1dGhvcml0eTp0LmF1dGhvcml0eXx8bHQuRkFMTEJBQ0tfQVVUSE9SSVRZLHF1ZXJ5Om51bGwsZnJhZ21lbnQ6bnVsbH0pOnR9dG9VcmkodCxuKXtpZihzZS5pc1VyaSh0KSlyZXR1cm4gdDtpZihnbG9iYWxUaGlzLl9WU0NPREVfRklMRV9ST09UKXtjb25zdCByPWdsb2JhbFRoaXMuX1ZTQ09ERV9GSUxFX1JPT1Q7aWYoL15cd1tcd1xkKy4tXSo6XC9cLy8udGVzdChyKSlyZXR1cm4gc2Uuam9pblBhdGgoc2UucGFyc2UociwhMCksdCk7Y29uc3Qgcz1GaShyLHQpO3JldHVybiBzZS5maWxlKHMpfXJldHVybiBzZS5wYXJzZShuLnRvVXJsKHQpKX19O2x0LkZBTExCQUNLX0FVVEhPUklUWT1PaTtsZXQgZW49bHQ7Y29uc3QgSG49bmV3IGVuO3ZhciBXbjsoZnVuY3Rpb24oZSl7Y29uc3QgdD1uZXcgTWFwKFtbIjEiLHsiQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3kiOiJzYW1lLW9yaWdpbiJ9XSxbIjIiLHsiQ3Jvc3MtT3JpZ2luLUVtYmVkZGVyLVBvbGljeSI6InJlcXVpcmUtY29ycCJ9XSxbIjMiLHsiQ3Jvc3MtT3JpZ2luLU9wZW5lci1Qb2xpY3kiOiJzYW1lLW9yaWdpbiIsIkNyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3kiOiJyZXF1aXJlLWNvcnAifV1dKTtlLkNvb3BBbmRDb2VwPU9iamVjdC5mcmVlemUodC5nZXQoIjMiKSk7Y29uc3Qgbj0idnNjb2RlLWNvaSI7ZnVuY3Rpb24gcihpKXtsZXQgbzt0eXBlb2YgaT09InN0cmluZyI/bz1uZXcgVVJMKGkpLnNlYXJjaFBhcmFtczppIGluc3RhbmNlb2YgVVJMP289aS5zZWFyY2hQYXJhbXM6c2UuaXNVcmkoaSkmJihvPW5ldyBVUkwoaS50b1N0cmluZyghMCkpLnNlYXJjaFBhcmFtcyk7Y29uc3QgbD1vPT1udWxsP3ZvaWQgMDpvLmdldChuKTtpZihsKXJldHVybiB0LmdldChsKX1lLmdldEhlYWRlcnNGcm9tUXVlcnk9cjtmdW5jdGlvbiBzKGksbyxsKXtpZighZ2xvYmFsVGhpcy5jcm9zc09yaWdpbklzb2xhdGVkKXJldHVybjtjb25zdCB1PW8mJmw/IjMiOmw/IjIiOiIxIjtpIGluc3RhbmNlb2YgVVJMU2VhcmNoUGFyYW1zP2kuc2V0KG4sdSk6aVtuXT11fWUuYWRkU2VhcmNoUGFyYW09c30pKFdufHwoV249e30pKTtjb25zdCB0bj0iZGVmYXVsdCIsR2k9IiRpbml0aWFsaXplIjtjbGFzcyBqaXtjb25zdHJ1Y3Rvcih0LG4scixzLGkpe3RoaXMudnNXb3JrZXI9dCx0aGlzLnJlcT1uLHRoaXMuY2hhbm5lbD1yLHRoaXMubWV0aG9kPXMsdGhpcy5hcmdzPWksdGhpcy50eXBlPTB9fWNsYXNzIHpue2NvbnN0cnVjdG9yKHQsbixyLHMpe3RoaXMudnNXb3JrZXI9dCx0aGlzLnNlcT1uLHRoaXMucmVzPXIsdGhpcy5lcnI9cyx0aGlzLnR5cGU9MX19Y2xhc3MgWGl7Y29uc3RydWN0b3IodCxuLHIscyxpKXt0aGlzLnZzV29ya2VyPXQsdGhpcy5yZXE9bix0aGlzLmNoYW5uZWw9cix0aGlzLmV2ZW50TmFtZT1zLHRoaXMuYXJnPWksdGhpcy50eXBlPTJ9fWNsYXNzIFFpe2NvbnN0cnVjdG9yKHQsbixyKXt0aGlzLnZzV29ya2VyPXQsdGhpcy5yZXE9bix0aGlzLmV2ZW50PXIsdGhpcy50eXBlPTN9fWNsYXNzIFlpe2NvbnN0cnVjdG9yKHQsbil7dGhpcy52c1dvcmtlcj10LHRoaXMucmVxPW4sdGhpcy50eXBlPTR9fWNsYXNzIEppe2NvbnN0cnVjdG9yKHQpe3RoaXMuX3dvcmtlcklkPS0xLHRoaXMuX2hhbmRsZXI9dCx0aGlzLl9sYXN0U2VudFJlcT0wLHRoaXMuX3BlbmRpbmdSZXBsaWVzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fcGVuZGluZ0VtaXR0ZXJzPW5ldyBNYXAsdGhpcy5fcGVuZGluZ0V2ZW50cz1uZXcgTWFwfXNldFdvcmtlcklkKHQpe3RoaXMuX3dvcmtlcklkPXR9c2VuZE1lc3NhZ2UodCxuLHIpe2NvbnN0IHM9U3RyaW5nKCsrdGhpcy5fbGFzdFNlbnRSZXEpO3JldHVybiBuZXcgUHJvbWlzZSgoaSxvKT0+e3RoaXMuX3BlbmRpbmdSZXBsaWVzW3NdPXtyZXNvbHZlOmkscmVqZWN0Om99LHRoaXMuX3NlbmQobmV3IGppKHRoaXMuX3dvcmtlcklkLHMsdCxuLHIpKX0pfWxpc3Rlbih0LG4scil7bGV0IHM9bnVsbDtjb25zdCBpPW5ldyBvZSh7b25XaWxsQWRkRmlyc3RMaXN0ZW5lcjooKT0+e3M9U3RyaW5nKCsrdGhpcy5fbGFzdFNlbnRSZXEpLHRoaXMuX3BlbmRpbmdFbWl0dGVycy5zZXQocyxpKSx0aGlzLl9zZW5kKG5ldyBYaSh0aGlzLl93b3JrZXJJZCxzLHQsbixyKSl9LG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyOigpPT57dGhpcy5fcGVuZGluZ0VtaXR0ZXJzLmRlbGV0ZShzKSx0aGlzLl9zZW5kKG5ldyBZaSh0aGlzLl93b3JrZXJJZCxzKSkscz1udWxsfX0pO3JldHVybiBpLmV2ZW50fWhhbmRsZU1lc3NhZ2UodCl7IXR8fCF0LnZzV29ya2VyfHx0aGlzLl93b3JrZXJJZCE9PS0xJiZ0LnZzV29ya2VyIT09dGhpcy5fd29ya2VySWR8fHRoaXMuX2hhbmRsZU1lc3NhZ2UodCl9Y3JlYXRlUHJveHlUb1JlbW90ZUNoYW5uZWwodCxuKXtjb25zdCByPXtnZXQ6KHMsaSk9Pih0eXBlb2YgaT09InN0cmluZyImJiFzW2ldJiYoR24oaSk/c1tpXT1vPT50aGlzLmxpc3Rlbih0LGksbyk6T24oaSk/c1tpXT10aGlzLmxpc3Rlbih0LGksdm9pZCAwKTppLmNoYXJDb2RlQXQoMCk9PT0zNiYmKHNbaV09YXN5bmMoLi4ubyk9Pihhd2FpdChuPT1udWxsP3ZvaWQgMDpuKCkpLHRoaXMuc2VuZE1lc3NhZ2UodCxpLG8pKSkpLHNbaV0pfTtyZXR1cm4gbmV3IFByb3h5KE9iamVjdC5jcmVhdGUobnVsbCkscil9X2hhbmRsZU1lc3NhZ2UodCl7c3dpdGNoKHQudHlwZSl7Y2FzZSAxOnJldHVybiB0aGlzLl9oYW5kbGVSZXBseU1lc3NhZ2UodCk7Y2FzZSAwOnJldHVybiB0aGlzLl9oYW5kbGVSZXF1ZXN0TWVzc2FnZSh0KTtjYXNlIDI6cmV0dXJuIHRoaXMuX2hhbmRsZVN1YnNjcmliZUV2ZW50TWVzc2FnZSh0KTtjYXNlIDM6cmV0dXJuIHRoaXMuX2hhbmRsZUV2ZW50TWVzc2FnZSh0KTtjYXNlIDQ6cmV0dXJuIHRoaXMuX2hhbmRsZVVuc3Vic2NyaWJlRXZlbnRNZXNzYWdlKHQpfX1faGFuZGxlUmVwbHlNZXNzYWdlKHQpe2lmKCF0aGlzLl9wZW5kaW5nUmVwbGllc1t0LnNlcV0pe2NvbnNvbGUud2FybigiR290IHJlcGx5IHRvIHVua25vd24gc2VxIik7cmV0dXJufWNvbnN0IG49dGhpcy5fcGVuZGluZ1JlcGxpZXNbdC5zZXFdO2lmKGRlbGV0ZSB0aGlzLl9wZW5kaW5nUmVwbGllc1t0LnNlcV0sdC5lcnIpe2xldCByPXQuZXJyO3QuZXJyLiRpc0Vycm9yJiYocj1uZXcgRXJyb3Isci5uYW1lPXQuZXJyLm5hbWUsci5tZXNzYWdlPXQuZXJyLm1lc3NhZ2Usci5zdGFjaz10LmVyci5zdGFjayksbi5yZWplY3Qocik7cmV0dXJufW4ucmVzb2x2ZSh0LnJlcyl9X2hhbmRsZVJlcXVlc3RNZXNzYWdlKHQpe2NvbnN0IG49dC5yZXE7dGhpcy5faGFuZGxlci5oYW5kbGVNZXNzYWdlKHQuY2hhbm5lbCx0Lm1ldGhvZCx0LmFyZ3MpLnRoZW4ocz0+e3RoaXMuX3NlbmQobmV3IHpuKHRoaXMuX3dvcmtlcklkLG4scyx2b2lkIDApKX0scz0+e3MuZGV0YWlsIGluc3RhbmNlb2YgRXJyb3ImJihzLmRldGFpbD1SbihzLmRldGFpbCkpLHRoaXMuX3NlbmQobmV3IHpuKHRoaXMuX3dvcmtlcklkLG4sdm9pZCAwLFJuKHMpKSl9KX1faGFuZGxlU3Vic2NyaWJlRXZlbnRNZXNzYWdlKHQpe2NvbnN0IG49dC5yZXEscj10aGlzLl9oYW5kbGVyLmhhbmRsZUV2ZW50KHQuY2hhbm5lbCx0LmV2ZW50TmFtZSx0LmFyZykocz0+e3RoaXMuX3NlbmQobmV3IFFpKHRoaXMuX3dvcmtlcklkLG4scykpfSk7dGhpcy5fcGVuZGluZ0V2ZW50cy5zZXQobixyKX1faGFuZGxlRXZlbnRNZXNzYWdlKHQpe2lmKCF0aGlzLl9wZW5kaW5nRW1pdHRlcnMuaGFzKHQucmVxKSl7Y29uc29sZS53YXJuKCJHb3QgZXZlbnQgZm9yIHVua25vd24gcmVxIik7cmV0dXJufXRoaXMuX3BlbmRpbmdFbWl0dGVycy5nZXQodC5yZXEpLmZpcmUodC5ldmVudCl9X2hhbmRsZVVuc3Vic2NyaWJlRXZlbnRNZXNzYWdlKHQpe2lmKCF0aGlzLl9wZW5kaW5nRXZlbnRzLmhhcyh0LnJlcSkpe2NvbnNvbGUud2FybigiR290IHVuc3Vic2NyaWJlIGZvciB1bmtub3duIHJlcSIpO3JldHVybn10aGlzLl9wZW5kaW5nRXZlbnRzLmdldCh0LnJlcSkuZGlzcG9zZSgpLHRoaXMuX3BlbmRpbmdFdmVudHMuZGVsZXRlKHQucmVxKX1fc2VuZCh0KXtjb25zdCBuPVtdO2lmKHQudHlwZT09PTApZm9yKGxldCByPTA7cjx0LmFyZ3MubGVuZ3RoO3IrKyl0LmFyZ3Nbcl1pbnN0YW5jZW9mIEFycmF5QnVmZmVyJiZuLnB1c2godC5hcmdzW3JdKTtlbHNlIHQudHlwZT09PTEmJnQucmVzIGluc3RhbmNlb2YgQXJyYXlCdWZmZXImJm4ucHVzaCh0LnJlcyk7dGhpcy5faGFuZGxlci5zZW5kTWVzc2FnZSh0LG4pfX1mdW5jdGlvbiBPbihlKXtyZXR1cm4gZVswXT09PSJvIiYmZVsxXT09PSJuIiYmRG4oZS5jaGFyQ29kZUF0KDIpKX1mdW5jdGlvbiBHbihlKXtyZXR1cm4vXm9uRHluYW1pYy8udGVzdChlKSYmRG4oZS5jaGFyQ29kZUF0KDkpKX1jbGFzcyBaaXtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuX2xvY2FsQ2hhbm5lbHM9bmV3IE1hcCx0aGlzLl9yZW1vdGVDaGFubmVscz1uZXcgTWFwLHRoaXMuX3JlcXVlc3RIYW5kbGVyRmFjdG9yeT1uLHRoaXMuX3JlcXVlc3RIYW5kbGVyPW51bGwsdGhpcy5fcHJvdG9jb2w9bmV3IEppKHtzZW5kTWVzc2FnZToocixzKT0+e3QocixzKX0saGFuZGxlTWVzc2FnZToocixzLGkpPT50aGlzLl9oYW5kbGVNZXNzYWdlKHIscyxpKSxoYW5kbGVFdmVudDoocixzLGkpPT50aGlzLl9oYW5kbGVFdmVudChyLHMsaSl9KX1vbm1lc3NhZ2UodCl7dGhpcy5fcHJvdG9jb2wuaGFuZGxlTWVzc2FnZSh0KX1faGFuZGxlTWVzc2FnZSh0LG4scil7aWYodD09PXRuJiZuPT09R2kpcmV0dXJuIHRoaXMuaW5pdGlhbGl6ZShyWzBdLHJbMV0sclsyXSk7Y29uc3Qgcz10PT09dG4/dGhpcy5fcmVxdWVzdEhhbmRsZXI6dGhpcy5fbG9jYWxDaGFubmVscy5nZXQodCk7aWYoIXMpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgTWlzc2luZyBjaGFubmVsICR7dH0gb24gd29ya2VyIHRocmVhZGApKTtpZih0eXBlb2Ygc1tuXSE9ImZ1bmN0aW9uIilyZXR1cm4gUHJvbWlzZS5yZWplY3QobmV3IEVycm9yKGBNaXNzaW5nIG1ldGhvZCAke259IG9uIHdvcmtlciB0aHJlYWQgY2hhbm5lbCAke3R9YCkpO3RyeXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHNbbl0uYXBwbHkocyxyKSl9Y2F0Y2goaSl7cmV0dXJuIFByb21pc2UucmVqZWN0KGkpfX1faGFuZGxlRXZlbnQodCxuLHIpe2NvbnN0IHM9dD09PXRuP3RoaXMuX3JlcXVlc3RIYW5kbGVyOnRoaXMuX2xvY2FsQ2hhbm5lbHMuZ2V0KHQpO2lmKCFzKXRocm93IG5ldyBFcnJvcihgTWlzc2luZyBjaGFubmVsICR7dH0gb24gd29ya2VyIHRocmVhZGApO2lmKEduKG4pKXtjb25zdCBpPXNbbl0uY2FsbChzLHIpO2lmKHR5cGVvZiBpIT0iZnVuY3Rpb24iKXRocm93IG5ldyBFcnJvcihgTWlzc2luZyBkeW5hbWljIGV2ZW50ICR7bn0gb24gcmVxdWVzdCBoYW5kbGVyLmApO3JldHVybiBpfWlmKE9uKG4pKXtjb25zdCBpPXNbbl07aWYodHlwZW9mIGkhPSJmdW5jdGlvbiIpdGhyb3cgbmV3IEVycm9yKGBNaXNzaW5nIGV2ZW50ICR7bn0gb24gcmVxdWVzdCBoYW5kbGVyLmApO3JldHVybiBpfXRocm93IG5ldyBFcnJvcihgTWFsZm9ybWVkIGV2ZW50IG5hbWUgJHtufWApfWdldENoYW5uZWwodCl7aWYoIXRoaXMuX3JlbW90ZUNoYW5uZWxzLmhhcyh0KSl7Y29uc3Qgbj10aGlzLl9wcm90b2NvbC5jcmVhdGVQcm94eVRvUmVtb3RlQ2hhbm5lbCh0KTt0aGlzLl9yZW1vdGVDaGFubmVscy5zZXQodCxuKX1yZXR1cm4gdGhpcy5fcmVtb3RlQ2hhbm5lbHMuZ2V0KHQpfWFzeW5jIGluaXRpYWxpemUodCxuLHIpe2lmKHRoaXMuX3Byb3RvY29sLnNldFdvcmtlcklkKHQpLHRoaXMuX3JlcXVlc3RIYW5kbGVyRmFjdG9yeSl7dGhpcy5fcmVxdWVzdEhhbmRsZXI9dGhpcy5fcmVxdWVzdEhhbmRsZXJGYWN0b3J5KHRoaXMpO3JldHVybn1yZXR1cm4gbiYmKHR5cGVvZiBuLmJhc2VVcmw8InUiJiZkZWxldGUgbi5iYXNlVXJsLHR5cGVvZiBuLnBhdGhzPCJ1IiYmdHlwZW9mIG4ucGF0aHMudnM8InUiJiZkZWxldGUgbi5wYXRocy52cyx0eXBlb2Ygbi50cnVzdGVkVHlwZXNQb2xpY3k8InUiJiZkZWxldGUgbi50cnVzdGVkVHlwZXNQb2xpY3ksbi5jYXRjaEVycm9yPSEwLGdsb2JhbFRoaXMucmVxdWlyZS5jb25maWcobikpLGltcG9ydChgJHtIbi5hc0Jyb3dzZXJVcmkoYCR7cn0uanNgKS50b1N0cmluZyghMCl9YCkudGhlbihpPT57aWYodGhpcy5fcmVxdWVzdEhhbmRsZXI9aS5jcmVhdGUodGhpcyksIXRoaXMuX3JlcXVlc3RIYW5kbGVyKXRocm93IG5ldyBFcnJvcigiTm8gUmVxdWVzdEhhbmRsZXIhIil9KX19Y2xhc3MgQWV7Y29uc3RydWN0b3IodCxuLHIscyl7dGhpcy5vcmlnaW5hbFN0YXJ0PXQsdGhpcy5vcmlnaW5hbExlbmd0aD1uLHRoaXMubW9kaWZpZWRTdGFydD1yLHRoaXMubW9kaWZpZWRMZW5ndGg9c31nZXRPcmlnaW5hbEVuZCgpe3JldHVybiB0aGlzLm9yaWdpbmFsU3RhcnQrdGhpcy5vcmlnaW5hbExlbmd0aH1nZXRNb2RpZmllZEVuZCgpe3JldHVybiB0aGlzLm1vZGlmaWVkU3RhcnQrdGhpcy5tb2RpZmllZExlbmd0aH19ZnVuY3Rpb24gam4oZSx0KXtyZXR1cm4odDw8NSktdCtlfDB9ZnVuY3Rpb24gS2koZSx0KXt0PWpuKDE0OTQxNyx0KTtmb3IobGV0IG49MCxyPWUubGVuZ3RoO248cjtuKyspdD1qbihlLmNoYXJDb2RlQXQobiksdCk7cmV0dXJuIHR9Y2xhc3MgWG57Y29uc3RydWN0b3IodCl7dGhpcy5zb3VyY2U9dH1nZXRFbGVtZW50cygpe2NvbnN0IHQ9dGhpcy5zb3VyY2Usbj1uZXcgSW50MzJBcnJheSh0Lmxlbmd0aCk7Zm9yKGxldCByPTAscz10Lmxlbmd0aDtyPHM7cisrKW5bcl09dC5jaGFyQ29kZUF0KHIpO3JldHVybiBufX1mdW5jdGlvbiBlYShlLHQsbil7cmV0dXJuIG5ldyBSZShuZXcgWG4oZSksbmV3IFhuKHQpKS5Db21wdXRlRGlmZihuKS5jaGFuZ2VzfWNsYXNzIFZle3N0YXRpYyBBc3NlcnQodCxuKXtpZighdCl0aHJvdyBuZXcgRXJyb3Iobil9fWNsYXNzIEJle3N0YXRpYyBDb3B5KHQsbixyLHMsaSl7Zm9yKGxldCBvPTA7bzxpO28rKylyW3Mrb109dFtuK29dfXN0YXRpYyBDb3B5Mih0LG4scixzLGkpe2ZvcihsZXQgbz0wO288aTtvKyspcltzK29dPXRbbitvXX19Y2xhc3MgUW57Y29uc3RydWN0b3IoKXt0aGlzLm1fY2hhbmdlcz1bXSx0aGlzLm1fb3JpZ2luYWxTdGFydD0xMDczNzQxODI0LHRoaXMubV9tb2RpZmllZFN0YXJ0PTEwNzM3NDE4MjQsdGhpcy5tX29yaWdpbmFsQ291bnQ9MCx0aGlzLm1fbW9kaWZpZWRDb3VudD0wfU1hcmtOZXh0Q2hhbmdlKCl7KHRoaXMubV9vcmlnaW5hbENvdW50PjB8fHRoaXMubV9tb2RpZmllZENvdW50PjApJiZ0aGlzLm1fY2hhbmdlcy5wdXNoKG5ldyBBZSh0aGlzLm1fb3JpZ2luYWxTdGFydCx0aGlzLm1fb3JpZ2luYWxDb3VudCx0aGlzLm1fbW9kaWZpZWRTdGFydCx0aGlzLm1fbW9kaWZpZWRDb3VudCkpLHRoaXMubV9vcmlnaW5hbENvdW50PTAsdGhpcy5tX21vZGlmaWVkQ291bnQ9MCx0aGlzLm1fb3JpZ2luYWxTdGFydD0xMDczNzQxODI0LHRoaXMubV9tb2RpZmllZFN0YXJ0PTEwNzM3NDE4MjR9QWRkT3JpZ2luYWxFbGVtZW50KHQsbil7dGhpcy5tX29yaWdpbmFsU3RhcnQ9TWF0aC5taW4odGhpcy5tX29yaWdpbmFsU3RhcnQsdCksdGhpcy5tX21vZGlmaWVkU3RhcnQ9TWF0aC5taW4odGhpcy5tX21vZGlmaWVkU3RhcnQsbiksdGhpcy5tX29yaWdpbmFsQ291bnQrK31BZGRNb2RpZmllZEVsZW1lbnQodCxuKXt0aGlzLm1fb3JpZ2luYWxTdGFydD1NYXRoLm1pbih0aGlzLm1fb3JpZ2luYWxTdGFydCx0KSx0aGlzLm1fbW9kaWZpZWRTdGFydD1NYXRoLm1pbih0aGlzLm1fbW9kaWZpZWRTdGFydCxuKSx0aGlzLm1fbW9kaWZpZWRDb3VudCsrfWdldENoYW5nZXMoKXtyZXR1cm4odGhpcy5tX29yaWdpbmFsQ291bnQ+MHx8dGhpcy5tX21vZGlmaWVkQ291bnQ+MCkmJnRoaXMuTWFya05leHRDaGFuZ2UoKSx0aGlzLm1fY2hhbmdlc31nZXRSZXZlcnNlQ2hhbmdlcygpe3JldHVybih0aGlzLm1fb3JpZ2luYWxDb3VudD4wfHx0aGlzLm1fbW9kaWZpZWRDb3VudD4wKSYmdGhpcy5NYXJrTmV4dENoYW5nZSgpLHRoaXMubV9jaGFuZ2VzLnJldmVyc2UoKSx0aGlzLm1fY2hhbmdlc319Y2xhc3MgUmV7Y29uc3RydWN0b3IodCxuLHI9bnVsbCl7dGhpcy5Db250aW51ZVByb2Nlc3NpbmdQcmVkaWNhdGU9cix0aGlzLl9vcmlnaW5hbFNlcXVlbmNlPXQsdGhpcy5fbW9kaWZpZWRTZXF1ZW5jZT1uO2NvbnN0W3MsaSxvXT1SZS5fZ2V0RWxlbWVudHModCksW2wsdSxjXT1SZS5fZ2V0RWxlbWVudHMobik7dGhpcy5faGFzU3RyaW5ncz1vJiZjLHRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHM9cyx0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoPWksdGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50cz1sLHRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2g9dSx0aGlzLm1fZm9yd2FyZEhpc3Rvcnk9W10sdGhpcy5tX3JldmVyc2VIaXN0b3J5PVtdfXN0YXRpYyBfaXNTdHJpbmdBcnJheSh0KXtyZXR1cm4gdC5sZW5ndGg+MCYmdHlwZW9mIHRbMF09PSJzdHJpbmcifXN0YXRpYyBfZ2V0RWxlbWVudHModCl7Y29uc3Qgbj10LmdldEVsZW1lbnRzKCk7aWYoUmUuX2lzU3RyaW5nQXJyYXkobikpe2NvbnN0IHI9bmV3IEludDMyQXJyYXkobi5sZW5ndGgpO2ZvcihsZXQgcz0wLGk9bi5sZW5ndGg7czxpO3MrKylyW3NdPUtpKG5bc10sMCk7cmV0dXJuW24sciwhMF19cmV0dXJuIG4gaW5zdGFuY2VvZiBJbnQzMkFycmF5P1tbXSxuLCExXTpbW10sbmV3IEludDMyQXJyYXkobiksITFdfUVsZW1lbnRzQXJlRXF1YWwodCxuKXtyZXR1cm4gdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaFt0XSE9PXRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2hbbl0/ITE6dGhpcy5faGFzU3RyaW5ncz90aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW3RdPT09dGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50c1tuXTohMH1FbGVtZW50c0FyZVN0cmljdEVxdWFsKHQsbil7aWYoIXRoaXMuRWxlbWVudHNBcmVFcXVhbCh0LG4pKXJldHVybiExO2NvbnN0IHI9UmUuX2dldFN0cmljdEVsZW1lbnQodGhpcy5fb3JpZ2luYWxTZXF1ZW5jZSx0KSxzPVJlLl9nZXRTdHJpY3RFbGVtZW50KHRoaXMuX21vZGlmaWVkU2VxdWVuY2Usbik7cmV0dXJuIHI9PT1zfXN0YXRpYyBfZ2V0U3RyaWN0RWxlbWVudCh0LG4pe3JldHVybiB0eXBlb2YgdC5nZXRTdHJpY3RFbGVtZW50PT0iZnVuY3Rpb24iP3QuZ2V0U3RyaWN0RWxlbWVudChuKTpudWxsfU9yaWdpbmFsRWxlbWVudHNBcmVFcXVhbCh0LG4pe3JldHVybiB0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoW3RdIT09dGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaFtuXT8hMTp0aGlzLl9oYXNTdHJpbmdzP3RoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHNbdF09PT10aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW25dOiEwfU1vZGlmaWVkRWxlbWVudHNBcmVFcXVhbCh0LG4pe3JldHVybiB0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoW3RdIT09dGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaFtuXT8hMTp0aGlzLl9oYXNTdHJpbmdzP3RoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHNbdF09PT10aGlzLl9tb2RpZmllZFN0cmluZ0VsZW1lbnRzW25dOiEwfUNvbXB1dGVEaWZmKHQpe3JldHVybiB0aGlzLl9Db21wdXRlRGlmZigwLHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2gubGVuZ3RoLTEsMCx0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoLmxlbmd0aC0xLHQpfV9Db21wdXRlRGlmZih0LG4scixzLGkpe2NvbnN0IG89WyExXTtsZXQgbD10aGlzLkNvbXB1dGVEaWZmUmVjdXJzaXZlKHQsbixyLHMsbyk7cmV0dXJuIGkmJihsPXRoaXMuUHJldHRpZnlDaGFuZ2VzKGwpKSx7cXVpdEVhcmx5Om9bMF0sY2hhbmdlczpsfX1Db21wdXRlRGlmZlJlY3Vyc2l2ZSh0LG4scixzLGkpe2ZvcihpWzBdPSExO3Q8PW4mJnI8PXMmJnRoaXMuRWxlbWVudHNBcmVFcXVhbCh0LHIpOyl0KysscisrO2Zvcig7bj49dCYmcz49ciYmdGhpcy5FbGVtZW50c0FyZUVxdWFsKG4scyk7KW4tLSxzLS07aWYodD5ufHxyPnMpe2xldCBmO3JldHVybiByPD1zPyhWZS5Bc3NlcnQodD09PW4rMSwib3JpZ2luYWxTdGFydCBzaG91bGQgb25seSBiZSBvbmUgbW9yZSB0aGFuIG9yaWdpbmFsRW5kIiksZj1bbmV3IEFlKHQsMCxyLHMtcisxKV0pOnQ8PW4/KFZlLkFzc2VydChyPT09cysxLCJtb2RpZmllZFN0YXJ0IHNob3VsZCBvbmx5IGJlIG9uZSBtb3JlIHRoYW4gbW9kaWZpZWRFbmQiKSxmPVtuZXcgQWUodCxuLXQrMSxyLDApXSk6KFZlLkFzc2VydCh0PT09bisxLCJvcmlnaW5hbFN0YXJ0IHNob3VsZCBvbmx5IGJlIG9uZSBtb3JlIHRoYW4gb3JpZ2luYWxFbmQiKSxWZS5Bc3NlcnQocj09PXMrMSwibW9kaWZpZWRTdGFydCBzaG91bGQgb25seSBiZSBvbmUgbW9yZSB0aGFuIG1vZGlmaWVkRW5kIiksZj1bXSksZn1jb25zdCBvPVswXSxsPVswXSx1PXRoaXMuQ29tcHV0ZVJlY3Vyc2lvblBvaW50KHQsbixyLHMsbyxsLGkpLGM9b1swXSxoPWxbMF07aWYodSE9PW51bGwpcmV0dXJuIHU7aWYoIWlbMF0pe2NvbnN0IGY9dGhpcy5Db21wdXRlRGlmZlJlY3Vyc2l2ZSh0LGMscixoLGkpO2xldCBkPVtdO3JldHVybiBpWzBdP2Q9W25ldyBBZShjKzEsbi0oYysxKSsxLGgrMSxzLShoKzEpKzEpXTpkPXRoaXMuQ29tcHV0ZURpZmZSZWN1cnNpdmUoYysxLG4saCsxLHMsaSksdGhpcy5Db25jYXRlbmF0ZUNoYW5nZXMoZixkKX1yZXR1cm5bbmV3IEFlKHQsbi10KzEscixzLXIrMSldfVdBTEtUUkFDRSh0LG4scixzLGksbyxsLHUsYyxoLGYsZCxtLGcsYixfLHYsUyl7bGV0IE49bnVsbCxwPW51bGwseD1uZXcgUW4sTD1uLEE9cixFPW1bMF0tX1swXS1zLEI9LTEwNzM3NDE4MjQsUT10aGlzLm1fZm9yd2FyZEhpc3RvcnkubGVuZ3RoLTE7ZG97Y29uc3QgcT1FK3Q7cT09PUx8fHE8QSYmY1txLTFdPGNbcSsxXT8oZj1jW3ErMV0sZz1mLUUtcyxmPEImJnguTWFya05leHRDaGFuZ2UoKSxCPWYseC5BZGRNb2RpZmllZEVsZW1lbnQoZisxLGcpLEU9cSsxLXQpOihmPWNbcS0xXSsxLGc9Zi1FLXMsZjxCJiZ4Lk1hcmtOZXh0Q2hhbmdlKCksQj1mLTEseC5BZGRPcmlnaW5hbEVsZW1lbnQoZixnKzEpLEU9cS0xLXQpLFE+PTAmJihjPXRoaXMubV9mb3J3YXJkSGlzdG9yeVtRXSx0PWNbMF0sTD0xLEE9Yy5sZW5ndGgtMSl9d2hpbGUoLS1RPj0tMSk7aWYoTj14LmdldFJldmVyc2VDaGFuZ2VzKCksU1swXSl7bGV0IHE9bVswXSsxLEY9X1swXSsxO2lmKE4hPT1udWxsJiZOLmxlbmd0aD4wKXtjb25zdCBDPU5bTi5sZW5ndGgtMV07cT1NYXRoLm1heChxLEMuZ2V0T3JpZ2luYWxFbmQoKSksRj1NYXRoLm1heChGLEMuZ2V0TW9kaWZpZWRFbmQoKSl9cD1bbmV3IEFlKHEsZC1xKzEsRixiLUYrMSldfWVsc2V7eD1uZXcgUW4sTD1vLEE9bCxFPW1bMF0tX1swXS11LEI9MTA3Mzc0MTgyNCxRPXY/dGhpcy5tX3JldmVyc2VIaXN0b3J5Lmxlbmd0aC0xOnRoaXMubV9yZXZlcnNlSGlzdG9yeS5sZW5ndGgtMjtkb3tjb25zdCBxPUUraTtxPT09THx8cTxBJiZoW3EtMV0+PWhbcSsxXT8oZj1oW3ErMV0tMSxnPWYtRS11LGY+QiYmeC5NYXJrTmV4dENoYW5nZSgpLEI9ZisxLHguQWRkT3JpZ2luYWxFbGVtZW50KGYrMSxnKzEpLEU9cSsxLWkpOihmPWhbcS0xXSxnPWYtRS11LGY+QiYmeC5NYXJrTmV4dENoYW5nZSgpLEI9Zix4LkFkZE1vZGlmaWVkRWxlbWVudChmKzEsZysxKSxFPXEtMS1pKSxRPj0wJiYoaD10aGlzLm1fcmV2ZXJzZUhpc3RvcnlbUV0saT1oWzBdLEw9MSxBPWgubGVuZ3RoLTEpfXdoaWxlKC0tUT49LTEpO3A9eC5nZXRDaGFuZ2VzKCl9cmV0dXJuIHRoaXMuQ29uY2F0ZW5hdGVDaGFuZ2VzKE4scCl9Q29tcHV0ZVJlY3Vyc2lvblBvaW50KHQsbixyLHMsaSxvLGwpe2xldCB1PTAsYz0wLGg9MCxmPTAsZD0wLG09MDt0LS0sci0tLGlbMF09MCxvWzBdPTAsdGhpcy5tX2ZvcndhcmRIaXN0b3J5PVtdLHRoaXMubV9yZXZlcnNlSGlzdG9yeT1bXTtjb25zdCBnPW4tdCsocy1yKSxiPWcrMSxfPW5ldyBJbnQzMkFycmF5KGIpLHY9bmV3IEludDMyQXJyYXkoYiksUz1zLXIsTj1uLXQscD10LXIseD1uLXMsQT0oTi1TKSUyPT09MDtfW1NdPXQsdltOXT1uLGxbMF09ITE7Zm9yKGxldCBFPTE7RTw9Zy8yKzE7RSsrKXtsZXQgQj0wLFE9MDtoPXRoaXMuQ2xpcERpYWdvbmFsQm91bmQoUy1FLEUsUyxiKSxmPXRoaXMuQ2xpcERpYWdvbmFsQm91bmQoUytFLEUsUyxiKTtmb3IobGV0IEY9aDtGPD1mO0YrPTIpe0Y9PT1ofHxGPGYmJl9bRi0xXTxfW0YrMV0/dT1fW0YrMV06dT1fW0YtMV0rMSxjPXUtKEYtUyktcDtjb25zdCBDPXU7Zm9yKDt1PG4mJmM8cyYmdGhpcy5FbGVtZW50c0FyZUVxdWFsKHUrMSxjKzEpOyl1KyssYysrO2lmKF9bRl09dSx1K2M+QitRJiYoQj11LFE9YyksIUEmJk1hdGguYWJzKEYtTik8PUUtMSYmdT49dltGXSlyZXR1cm4gaVswXT11LG9bMF09YyxDPD12W0ZdJiZFPD0xNDQ4P3RoaXMuV0FMS1RSQUNFKFMsaCxmLHAsTixkLG0seCxfLHYsdSxuLGksYyxzLG8sQSxsKTpudWxsfWNvbnN0IHE9KEItdCsoUS1yKS1FKS8yO2lmKHRoaXMuQ29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlIT09bnVsbCYmIXRoaXMuQ29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlKEIscSkpcmV0dXJuIGxbMF09ITAsaVswXT1CLG9bMF09USxxPjAmJkU8PTE0NDg/dGhpcy5XQUxLVFJBQ0UoUyxoLGYscCxOLGQsbSx4LF8sdix1LG4saSxjLHMsbyxBLGwpOih0KysscisrLFtuZXcgQWUodCxuLXQrMSxyLHMtcisxKV0pO2Q9dGhpcy5DbGlwRGlhZ29uYWxCb3VuZChOLUUsRSxOLGIpLG09dGhpcy5DbGlwRGlhZ29uYWxCb3VuZChOK0UsRSxOLGIpO2ZvcihsZXQgRj1kO0Y8PW07Ris9Mil7Rj09PWR8fEY8bSYmdltGLTFdPj12W0YrMV0/dT12W0YrMV0tMTp1PXZbRi0xXSxjPXUtKEYtTikteDtjb25zdCBDPXU7Zm9yKDt1PnQmJmM+ciYmdGhpcy5FbGVtZW50c0FyZUVxdWFsKHUsYyk7KXUtLSxjLS07aWYodltGXT11LEEmJk1hdGguYWJzKEYtUyk8PUUmJnU8PV9bRl0pcmV0dXJuIGlbMF09dSxvWzBdPWMsQz49X1tGXSYmRTw9MTQ0OD90aGlzLldBTEtUUkFDRShTLGgsZixwLE4sZCxtLHgsXyx2LHUsbixpLGMscyxvLEEsbCk6bnVsbH1pZihFPD0xNDQ3KXtsZXQgRj1uZXcgSW50MzJBcnJheShmLWgrMik7RlswXT1TLWgrMSxCZS5Db3B5MihfLGgsRiwxLGYtaCsxKSx0aGlzLm1fZm9yd2FyZEhpc3RvcnkucHVzaChGKSxGPW5ldyBJbnQzMkFycmF5KG0tZCsyKSxGWzBdPU4tZCsxLEJlLkNvcHkyKHYsZCxGLDEsbS1kKzEpLHRoaXMubV9yZXZlcnNlSGlzdG9yeS5wdXNoKEYpfX1yZXR1cm4gdGhpcy5XQUxLVFJBQ0UoUyxoLGYscCxOLGQsbSx4LF8sdix1LG4saSxjLHMsbyxBLGwpfVByZXR0aWZ5Q2hhbmdlcyh0KXtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyl7Y29uc3Qgcj10W25dLHM9bjx0Lmxlbmd0aC0xP3RbbisxXS5vcmlnaW5hbFN0YXJ0OnRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2gubGVuZ3RoLGk9bjx0Lmxlbmd0aC0xP3RbbisxXS5tb2RpZmllZFN0YXJ0OnRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2gubGVuZ3RoLG89ci5vcmlnaW5hbExlbmd0aD4wLGw9ci5tb2RpZmllZExlbmd0aD4wO2Zvcig7ci5vcmlnaW5hbFN0YXJ0K3Iub3JpZ2luYWxMZW5ndGg8cyYmci5tb2RpZmllZFN0YXJ0K3IubW9kaWZpZWRMZW5ndGg8aSYmKCFvfHx0aGlzLk9yaWdpbmFsRWxlbWVudHNBcmVFcXVhbChyLm9yaWdpbmFsU3RhcnQsci5vcmlnaW5hbFN0YXJ0K3Iub3JpZ2luYWxMZW5ndGgpKSYmKCFsfHx0aGlzLk1vZGlmaWVkRWxlbWVudHNBcmVFcXVhbChyLm1vZGlmaWVkU3RhcnQsci5tb2RpZmllZFN0YXJ0K3IubW9kaWZpZWRMZW5ndGgpKTspe2NvbnN0IGM9dGhpcy5FbGVtZW50c0FyZVN0cmljdEVxdWFsKHIub3JpZ2luYWxTdGFydCxyLm1vZGlmaWVkU3RhcnQpO2lmKHRoaXMuRWxlbWVudHNBcmVTdHJpY3RFcXVhbChyLm9yaWdpbmFsU3RhcnQrci5vcmlnaW5hbExlbmd0aCxyLm1vZGlmaWVkU3RhcnQrci5tb2RpZmllZExlbmd0aCkmJiFjKWJyZWFrO3Iub3JpZ2luYWxTdGFydCsrLHIubW9kaWZpZWRTdGFydCsrfWNvbnN0IHU9W251bGxdO2lmKG48dC5sZW5ndGgtMSYmdGhpcy5DaGFuZ2VzT3ZlcmxhcCh0W25dLHRbbisxXSx1KSl7dFtuXT11WzBdLHQuc3BsaWNlKG4rMSwxKSxuLS07Y29udGludWV9fWZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi0tKXtjb25zdCByPXRbbl07bGV0IHM9MCxpPTA7aWYobj4wKXtjb25zdCBmPXRbbi0xXTtzPWYub3JpZ2luYWxTdGFydCtmLm9yaWdpbmFsTGVuZ3RoLGk9Zi5tb2RpZmllZFN0YXJ0K2YubW9kaWZpZWRMZW5ndGh9Y29uc3Qgbz1yLm9yaWdpbmFsTGVuZ3RoPjAsbD1yLm1vZGlmaWVkTGVuZ3RoPjA7bGV0IHU9MCxjPXRoaXMuX2JvdW5kYXJ5U2NvcmUoci5vcmlnaW5hbFN0YXJ0LHIub3JpZ2luYWxMZW5ndGgsci5tb2RpZmllZFN0YXJ0LHIubW9kaWZpZWRMZW5ndGgpO2ZvcihsZXQgZj0xOztmKyspe2NvbnN0IGQ9ci5vcmlnaW5hbFN0YXJ0LWYsbT1yLm1vZGlmaWVkU3RhcnQtZjtpZihkPHN8fG08aXx8byYmIXRoaXMuT3JpZ2luYWxFbGVtZW50c0FyZUVxdWFsKGQsZCtyLm9yaWdpbmFsTGVuZ3RoKXx8bCYmIXRoaXMuTW9kaWZpZWRFbGVtZW50c0FyZUVxdWFsKG0sbStyLm1vZGlmaWVkTGVuZ3RoKSlicmVhaztjb25zdCBiPShkPT09cyYmbT09PWk/NTowKSt0aGlzLl9ib3VuZGFyeVNjb3JlKGQsci5vcmlnaW5hbExlbmd0aCxtLHIubW9kaWZpZWRMZW5ndGgpO2I+YyYmKGM9Yix1PWYpfXIub3JpZ2luYWxTdGFydC09dSxyLm1vZGlmaWVkU3RhcnQtPXU7Y29uc3QgaD1bbnVsbF07aWYobj4wJiZ0aGlzLkNoYW5nZXNPdmVybGFwKHRbbi0xXSx0W25dLGgpKXt0W24tMV09aFswXSx0LnNwbGljZShuLDEpLG4rKztjb250aW51ZX19aWYodGhpcy5faGFzU3RyaW5ncylmb3IobGV0IG49MSxyPXQubGVuZ3RoO248cjtuKyspe2NvbnN0IHM9dFtuLTFdLGk9dFtuXSxvPWkub3JpZ2luYWxTdGFydC1zLm9yaWdpbmFsU3RhcnQtcy5vcmlnaW5hbExlbmd0aCxsPXMub3JpZ2luYWxTdGFydCx1PWkub3JpZ2luYWxTdGFydCtpLm9yaWdpbmFsTGVuZ3RoLGM9dS1sLGg9cy5tb2RpZmllZFN0YXJ0LGY9aS5tb2RpZmllZFN0YXJ0K2kubW9kaWZpZWRMZW5ndGgsZD1mLWg7aWYobzw1JiZjPDIwJiZkPDIwKXtjb25zdCBtPXRoaXMuX2ZpbmRCZXR0ZXJDb250aWd1b3VzU2VxdWVuY2UobCxjLGgsZCxvKTtpZihtKXtjb25zdFtnLGJdPW07KGchPT1zLm9yaWdpbmFsU3RhcnQrcy5vcmlnaW5hbExlbmd0aHx8YiE9PXMubW9kaWZpZWRTdGFydCtzLm1vZGlmaWVkTGVuZ3RoKSYmKHMub3JpZ2luYWxMZW5ndGg9Zy1zLm9yaWdpbmFsU3RhcnQscy5tb2RpZmllZExlbmd0aD1iLXMubW9kaWZpZWRTdGFydCxpLm9yaWdpbmFsU3RhcnQ9ZytvLGkubW9kaWZpZWRTdGFydD1iK28saS5vcmlnaW5hbExlbmd0aD11LWkub3JpZ2luYWxTdGFydCxpLm1vZGlmaWVkTGVuZ3RoPWYtaS5tb2RpZmllZFN0YXJ0KX19fXJldHVybiB0fV9maW5kQmV0dGVyQ29udGlndW91c1NlcXVlbmNlKHQsbixyLHMsaSl7aWYobjxpfHxzPGkpcmV0dXJuIG51bGw7Y29uc3Qgbz10K24taSsxLGw9citzLWkrMTtsZXQgdT0wLGM9MCxoPTA7Zm9yKGxldCBmPXQ7ZjxvO2YrKylmb3IobGV0IGQ9cjtkPGw7ZCsrKXtjb25zdCBtPXRoaXMuX2NvbnRpZ3VvdXNTZXF1ZW5jZVNjb3JlKGYsZCxpKTttPjAmJm0+dSYmKHU9bSxjPWYsaD1kKX1yZXR1cm4gdT4wP1tjLGhdOm51bGx9X2NvbnRpZ3VvdXNTZXF1ZW5jZVNjb3JlKHQsbixyKXtsZXQgcz0wO2ZvcihsZXQgaT0wO2k8cjtpKyspe2lmKCF0aGlzLkVsZW1lbnRzQXJlRXF1YWwodCtpLG4raSkpcmV0dXJuIDA7cys9dGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1t0K2ldLmxlbmd0aH1yZXR1cm4gc31fT3JpZ2luYWxJc0JvdW5kYXJ5KHQpe3JldHVybiB0PD0wfHx0Pj10aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoLmxlbmd0aC0xPyEwOnRoaXMuX2hhc1N0cmluZ3MmJi9eXHMqJC8udGVzdCh0aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW3RdKX1fT3JpZ2luYWxSZWdpb25Jc0JvdW5kYXJ5KHQsbil7aWYodGhpcy5fT3JpZ2luYWxJc0JvdW5kYXJ5KHQpfHx0aGlzLl9PcmlnaW5hbElzQm91bmRhcnkodC0xKSlyZXR1cm4hMDtpZihuPjApe2NvbnN0IHI9dCtuO2lmKHRoaXMuX09yaWdpbmFsSXNCb3VuZGFyeShyLTEpfHx0aGlzLl9PcmlnaW5hbElzQm91bmRhcnkocikpcmV0dXJuITB9cmV0dXJuITF9X01vZGlmaWVkSXNCb3VuZGFyeSh0KXtyZXR1cm4gdDw9MHx8dD49dGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaC5sZW5ndGgtMT8hMDp0aGlzLl9oYXNTdHJpbmdzJiYvXlxzKiQvLnRlc3QodGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50c1t0XSl9X01vZGlmaWVkUmVnaW9uSXNCb3VuZGFyeSh0LG4pe2lmKHRoaXMuX01vZGlmaWVkSXNCb3VuZGFyeSh0KXx8dGhpcy5fTW9kaWZpZWRJc0JvdW5kYXJ5KHQtMSkpcmV0dXJuITA7aWYobj4wKXtjb25zdCByPXQrbjtpZih0aGlzLl9Nb2RpZmllZElzQm91bmRhcnkoci0xKXx8dGhpcy5fTW9kaWZpZWRJc0JvdW5kYXJ5KHIpKXJldHVybiEwfXJldHVybiExfV9ib3VuZGFyeVNjb3JlKHQsbixyLHMpe2NvbnN0IGk9dGhpcy5fT3JpZ2luYWxSZWdpb25Jc0JvdW5kYXJ5KHQsbik/MTowLG89dGhpcy5fTW9kaWZpZWRSZWdpb25Jc0JvdW5kYXJ5KHIscyk/MTowO3JldHVybiBpK299Q29uY2F0ZW5hdGVDaGFuZ2VzKHQsbil7Y29uc3Qgcj1bXTtpZih0Lmxlbmd0aD09PTB8fG4ubGVuZ3RoPT09MClyZXR1cm4gbi5sZW5ndGg+MD9uOnQ7aWYodGhpcy5DaGFuZ2VzT3ZlcmxhcCh0W3QubGVuZ3RoLTFdLG5bMF0scikpe2NvbnN0IHM9bmV3IEFycmF5KHQubGVuZ3RoK24ubGVuZ3RoLTEpO3JldHVybiBCZS5Db3B5KHQsMCxzLDAsdC5sZW5ndGgtMSksc1t0Lmxlbmd0aC0xXT1yWzBdLEJlLkNvcHkobiwxLHMsdC5sZW5ndGgsbi5sZW5ndGgtMSksc31lbHNle2NvbnN0IHM9bmV3IEFycmF5KHQubGVuZ3RoK24ubGVuZ3RoKTtyZXR1cm4gQmUuQ29weSh0LDAscywwLHQubGVuZ3RoKSxCZS5Db3B5KG4sMCxzLHQubGVuZ3RoLG4ubGVuZ3RoKSxzfX1DaGFuZ2VzT3ZlcmxhcCh0LG4scil7aWYoVmUuQXNzZXJ0KHQub3JpZ2luYWxTdGFydDw9bi5vcmlnaW5hbFN0YXJ0LCJMZWZ0IGNoYW5nZSBpcyBub3QgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHJpZ2h0IGNoYW5nZSIpLFZlLkFzc2VydCh0Lm1vZGlmaWVkU3RhcnQ8PW4ubW9kaWZpZWRTdGFydCwiTGVmdCBjaGFuZ2UgaXMgbm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byByaWdodCBjaGFuZ2UiKSx0Lm9yaWdpbmFsU3RhcnQrdC5vcmlnaW5hbExlbmd0aD49bi5vcmlnaW5hbFN0YXJ0fHx0Lm1vZGlmaWVkU3RhcnQrdC5tb2RpZmllZExlbmd0aD49bi5tb2RpZmllZFN0YXJ0KXtjb25zdCBzPXQub3JpZ2luYWxTdGFydDtsZXQgaT10Lm9yaWdpbmFsTGVuZ3RoO2NvbnN0IG89dC5tb2RpZmllZFN0YXJ0O2xldCBsPXQubW9kaWZpZWRMZW5ndGg7cmV0dXJuIHQub3JpZ2luYWxTdGFydCt0Lm9yaWdpbmFsTGVuZ3RoPj1uLm9yaWdpbmFsU3RhcnQmJihpPW4ub3JpZ2luYWxTdGFydCtuLm9yaWdpbmFsTGVuZ3RoLXQub3JpZ2luYWxTdGFydCksdC5tb2RpZmllZFN0YXJ0K3QubW9kaWZpZWRMZW5ndGg+PW4ubW9kaWZpZWRTdGFydCYmKGw9bi5tb2RpZmllZFN0YXJ0K24ubW9kaWZpZWRMZW5ndGgtdC5tb2RpZmllZFN0YXJ0KSxyWzBdPW5ldyBBZShzLGksbyxsKSwhMH1lbHNlIHJldHVybiByWzBdPW51bGwsITF9Q2xpcERpYWdvbmFsQm91bmQodCxuLHIscyl7aWYodD49MCYmdDxzKXJldHVybiB0O2NvbnN0IGk9cixvPXMtci0xLGw9biUyPT09MDtpZih0PDApe2NvbnN0IHU9aSUyPT09MDtyZXR1cm4gbD09PXU/MDoxfWVsc2V7Y29uc3QgdT1vJTI9PT0wO3JldHVybiBsPT09dT9zLTE6cy0yfX19Y2xhc3MgJHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMubGluZU51bWJlcj10LHRoaXMuY29sdW1uPW59d2l0aCh0PXRoaXMubGluZU51bWJlcixuPXRoaXMuY29sdW1uKXtyZXR1cm4gdD09PXRoaXMubGluZU51bWJlciYmbj09PXRoaXMuY29sdW1uP3RoaXM6bmV3ICQodCxuKX1kZWx0YSh0PTAsbj0wKXtyZXR1cm4gdGhpcy53aXRoKHRoaXMubGluZU51bWJlcit0LHRoaXMuY29sdW1uK24pfWVxdWFscyh0KXtyZXR1cm4gJC5lcXVhbHModGhpcyx0KX1zdGF0aWMgZXF1YWxzKHQsbil7cmV0dXJuIXQmJiFuPyEwOiEhdCYmISFuJiZ0LmxpbmVOdW1iZXI9PT1uLmxpbmVOdW1iZXImJnQuY29sdW1uPT09bi5jb2x1bW59aXNCZWZvcmUodCl7cmV0dXJuICQuaXNCZWZvcmUodGhpcyx0KX1zdGF0aWMgaXNCZWZvcmUodCxuKXtyZXR1cm4gdC5saW5lTnVtYmVyPG4ubGluZU51bWJlcj8hMDpuLmxpbmVOdW1iZXI8dC5saW5lTnVtYmVyPyExOnQuY29sdW1uPG4uY29sdW1ufWlzQmVmb3JlT3JFcXVhbCh0KXtyZXR1cm4gJC5pc0JlZm9yZU9yRXF1YWwodGhpcyx0KX1zdGF0aWMgaXNCZWZvcmVPckVxdWFsKHQsbil7cmV0dXJuIHQubGluZU51bWJlcjxuLmxpbmVOdW1iZXI/ITA6bi5saW5lTnVtYmVyPHQubGluZU51bWJlcj8hMTp0LmNvbHVtbjw9bi5jb2x1bW59c3RhdGljIGNvbXBhcmUodCxuKXtjb25zdCByPXQubGluZU51bWJlcnwwLHM9bi5saW5lTnVtYmVyfDA7aWYocj09PXMpe2NvbnN0IGk9dC5jb2x1bW58MCxvPW4uY29sdW1ufDA7cmV0dXJuIGktb31yZXR1cm4gci1zfWNsb25lKCl7cmV0dXJuIG5ldyAkKHRoaXMubGluZU51bWJlcix0aGlzLmNvbHVtbil9dG9TdHJpbmcoKXtyZXR1cm4iKCIrdGhpcy5saW5lTnVtYmVyKyIsIit0aGlzLmNvbHVtbisiKSJ9c3RhdGljIGxpZnQodCl7cmV0dXJuIG5ldyAkKHQubGluZU51bWJlcix0LmNvbHVtbil9c3RhdGljIGlzSVBvc2l0aW9uKHQpe3JldHVybiB0JiZ0eXBlb2YgdC5saW5lTnVtYmVyPT0ibnVtYmVyIiYmdHlwZW9mIHQuY29sdW1uPT0ibnVtYmVyIn10b0pTT04oKXtyZXR1cm57bGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uOnRoaXMuY29sdW1ufX19Y2xhc3Mga3tjb25zdHJ1Y3Rvcih0LG4scixzKXt0PnJ8fHQ9PT1yJiZuPnM/KHRoaXMuc3RhcnRMaW5lTnVtYmVyPXIsdGhpcy5zdGFydENvbHVtbj1zLHRoaXMuZW5kTGluZU51bWJlcj10LHRoaXMuZW5kQ29sdW1uPW4pOih0aGlzLnN0YXJ0TGluZU51bWJlcj10LHRoaXMuc3RhcnRDb2x1bW49bix0aGlzLmVuZExpbmVOdW1iZXI9cix0aGlzLmVuZENvbHVtbj1zKX1pc0VtcHR5KCl7cmV0dXJuIGsuaXNFbXB0eSh0aGlzKX1zdGF0aWMgaXNFbXB0eSh0KXtyZXR1cm4gdC5zdGFydExpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXImJnQuc3RhcnRDb2x1bW49PT10LmVuZENvbHVtbn1jb250YWluc1Bvc2l0aW9uKHQpe3JldHVybiBrLmNvbnRhaW5zUG9zaXRpb24odGhpcyx0KX1zdGF0aWMgY29udGFpbnNQb3NpdGlvbih0LG4pe3JldHVybiEobi5saW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxuLmxpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyfHxuLmxpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmbi5jb2x1bW48dC5zdGFydENvbHVtbnx8bi5saW5lTnVtYmVyPT09dC5lbmRMaW5lTnVtYmVyJiZuLmNvbHVtbj50LmVuZENvbHVtbil9c3RhdGljIHN0cmljdENvbnRhaW5zUG9zaXRpb24odCxuKXtyZXR1cm4hKG4ubGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5saW5lTnVtYmVyPnQuZW5kTGluZU51bWJlcnx8bi5saW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXImJm4uY29sdW1uPD10LnN0YXJ0Q29sdW1ufHxuLmxpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXImJm4uY29sdW1uPj10LmVuZENvbHVtbil9Y29udGFpbnNSYW5nZSh0KXtyZXR1cm4gay5jb250YWluc1JhbmdlKHRoaXMsdCl9c3RhdGljIGNvbnRhaW5zUmFuZ2UodCxuKXtyZXR1cm4hKG4uc3RhcnRMaW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxuLmVuZExpbmVOdW1iZXI8dC5zdGFydExpbmVOdW1iZXJ8fG4uc3RhcnRMaW5lTnVtYmVyPnQuZW5kTGluZU51bWJlcnx8bi5lbmRMaW5lTnVtYmVyPnQuZW5kTGluZU51bWJlcnx8bi5zdGFydExpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmbi5zdGFydENvbHVtbjx0LnN0YXJ0Q29sdW1ufHxuLmVuZExpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXImJm4uZW5kQ29sdW1uPnQuZW5kQ29sdW1uKX1zdHJpY3RDb250YWluc1JhbmdlKHQpe3JldHVybiBrLnN0cmljdENvbnRhaW5zUmFuZ2UodGhpcyx0KX1zdGF0aWMgc3RyaWN0Q29udGFpbnNSYW5nZSh0LG4pe3JldHVybiEobi5zdGFydExpbmVOdW1iZXI8dC5zdGFydExpbmVOdW1iZXJ8fG4uZW5kTGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5zdGFydExpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyfHxuLmVuZExpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyfHxuLnN0YXJ0TGluZU51bWJlcj09PXQuc3RhcnRMaW5lTnVtYmVyJiZuLnN0YXJ0Q29sdW1uPD10LnN0YXJ0Q29sdW1ufHxuLmVuZExpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXImJm4uZW5kQ29sdW1uPj10LmVuZENvbHVtbil9cGx1c1JhbmdlKHQpe3JldHVybiBrLnBsdXNSYW5nZSh0aGlzLHQpfXN0YXRpYyBwbHVzUmFuZ2UodCxuKXtsZXQgcixzLGksbztyZXR1cm4gbi5zdGFydExpbmVOdW1iZXI8dC5zdGFydExpbmVOdW1iZXI/KHI9bi5zdGFydExpbmVOdW1iZXIscz1uLnN0YXJ0Q29sdW1uKTpuLnN0YXJ0TGluZU51bWJlcj09PXQuc3RhcnRMaW5lTnVtYmVyPyhyPW4uc3RhcnRMaW5lTnVtYmVyLHM9TWF0aC5taW4obi5zdGFydENvbHVtbix0LnN0YXJ0Q29sdW1uKSk6KHI9dC5zdGFydExpbmVOdW1iZXIscz10LnN0YXJ0Q29sdW1uKSxuLmVuZExpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyPyhpPW4uZW5kTGluZU51bWJlcixvPW4uZW5kQ29sdW1uKTpuLmVuZExpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXI/KGk9bi5lbmRMaW5lTnVtYmVyLG89TWF0aC5tYXgobi5lbmRDb2x1bW4sdC5lbmRDb2x1bW4pKTooaT10LmVuZExpbmVOdW1iZXIsbz10LmVuZENvbHVtbiksbmV3IGsocixzLGksbyl9aW50ZXJzZWN0UmFuZ2VzKHQpe3JldHVybiBrLmludGVyc2VjdFJhbmdlcyh0aGlzLHQpfXN0YXRpYyBpbnRlcnNlY3RSYW5nZXModCxuKXtsZXQgcj10LnN0YXJ0TGluZU51bWJlcixzPXQuc3RhcnRDb2x1bW4saT10LmVuZExpbmVOdW1iZXIsbz10LmVuZENvbHVtbjtjb25zdCBsPW4uc3RhcnRMaW5lTnVtYmVyLHU9bi5zdGFydENvbHVtbixjPW4uZW5kTGluZU51bWJlcixoPW4uZW5kQ29sdW1uO3JldHVybiByPGw/KHI9bCxzPXUpOnI9PT1sJiYocz1NYXRoLm1heChzLHUpKSxpPmM/KGk9YyxvPWgpOmk9PT1jJiYobz1NYXRoLm1pbihvLGgpKSxyPml8fHI9PT1pJiZzPm8/bnVsbDpuZXcgayhyLHMsaSxvKX1lcXVhbHNSYW5nZSh0KXtyZXR1cm4gay5lcXVhbHNSYW5nZSh0aGlzLHQpfXN0YXRpYyBlcXVhbHNSYW5nZSh0LG4pe3JldHVybiF0JiYhbj8hMDohIXQmJiEhbiYmdC5zdGFydExpbmVOdW1iZXI9PT1uLnN0YXJ0TGluZU51bWJlciYmdC5zdGFydENvbHVtbj09PW4uc3RhcnRDb2x1bW4mJnQuZW5kTGluZU51bWJlcj09PW4uZW5kTGluZU51bWJlciYmdC5lbmRDb2x1bW49PT1uLmVuZENvbHVtbn1nZXRFbmRQb3NpdGlvbigpe3JldHVybiBrLmdldEVuZFBvc2l0aW9uKHRoaXMpfXN0YXRpYyBnZXRFbmRQb3NpdGlvbih0KXtyZXR1cm4gbmV3ICQodC5lbmRMaW5lTnVtYmVyLHQuZW5kQ29sdW1uKX1nZXRTdGFydFBvc2l0aW9uKCl7cmV0dXJuIGsuZ2V0U3RhcnRQb3NpdGlvbih0aGlzKX1zdGF0aWMgZ2V0U3RhcnRQb3NpdGlvbih0KXtyZXR1cm4gbmV3ICQodC5zdGFydExpbmVOdW1iZXIsdC5zdGFydENvbHVtbil9dG9TdHJpbmcoKXtyZXR1cm4iWyIrdGhpcy5zdGFydExpbmVOdW1iZXIrIiwiK3RoaXMuc3RhcnRDb2x1bW4rIiAtPiAiK3RoaXMuZW5kTGluZU51bWJlcisiLCIrdGhpcy5lbmRDb2x1bW4rIl0ifXNldEVuZFBvc2l0aW9uKHQsbil7cmV0dXJuIG5ldyBrKHRoaXMuc3RhcnRMaW5lTnVtYmVyLHRoaXMuc3RhcnRDb2x1bW4sdCxuKX1zZXRTdGFydFBvc2l0aW9uKHQsbil7cmV0dXJuIG5ldyBrKHQsbix0aGlzLmVuZExpbmVOdW1iZXIsdGhpcy5lbmRDb2x1bW4pfWNvbGxhcHNlVG9TdGFydCgpe3JldHVybiBrLmNvbGxhcHNlVG9TdGFydCh0aGlzKX1zdGF0aWMgY29sbGFwc2VUb1N0YXJ0KHQpe3JldHVybiBuZXcgayh0LnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0Q29sdW1uLHQuc3RhcnRMaW5lTnVtYmVyLHQuc3RhcnRDb2x1bW4pfWNvbGxhcHNlVG9FbmQoKXtyZXR1cm4gay5jb2xsYXBzZVRvRW5kKHRoaXMpfXN0YXRpYyBjb2xsYXBzZVRvRW5kKHQpe3JldHVybiBuZXcgayh0LmVuZExpbmVOdW1iZXIsdC5lbmRDb2x1bW4sdC5lbmRMaW5lTnVtYmVyLHQuZW5kQ29sdW1uKX1kZWx0YSh0KXtyZXR1cm4gbmV3IGsodGhpcy5zdGFydExpbmVOdW1iZXIrdCx0aGlzLnN0YXJ0Q29sdW1uLHRoaXMuZW5kTGluZU51bWJlcit0LHRoaXMuZW5kQ29sdW1uKX1zdGF0aWMgZnJvbVBvc2l0aW9ucyh0LG49dCl7cmV0dXJuIG5ldyBrKHQubGluZU51bWJlcix0LmNvbHVtbixuLmxpbmVOdW1iZXIsbi5jb2x1bW4pfXN0YXRpYyBsaWZ0KHQpe3JldHVybiB0P25ldyBrKHQuc3RhcnRMaW5lTnVtYmVyLHQuc3RhcnRDb2x1bW4sdC5lbmRMaW5lTnVtYmVyLHQuZW5kQ29sdW1uKTpudWxsfXN0YXRpYyBpc0lSYW5nZSh0KXtyZXR1cm4gdCYmdHlwZW9mIHQuc3RhcnRMaW5lTnVtYmVyPT0ibnVtYmVyIiYmdHlwZW9mIHQuc3RhcnRDb2x1bW49PSJudW1iZXIiJiZ0eXBlb2YgdC5lbmRMaW5lTnVtYmVyPT0ibnVtYmVyIiYmdHlwZW9mIHQuZW5kQ29sdW1uPT0ibnVtYmVyIn1zdGF0aWMgYXJlSW50ZXJzZWN0aW5nT3JUb3VjaGluZyh0LG4pe3JldHVybiEodC5lbmRMaW5lTnVtYmVyPG4uc3RhcnRMaW5lTnVtYmVyfHx0LmVuZExpbmVOdW1iZXI9PT1uLnN0YXJ0TGluZU51bWJlciYmdC5lbmRDb2x1bW48bi5zdGFydENvbHVtbnx8bi5lbmRMaW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxuLmVuZExpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmbi5lbmRDb2x1bW48dC5zdGFydENvbHVtbil9c3RhdGljIGFyZUludGVyc2VjdGluZyh0LG4pe3JldHVybiEodC5lbmRMaW5lTnVtYmVyPG4uc3RhcnRMaW5lTnVtYmVyfHx0LmVuZExpbmVOdW1iZXI9PT1uLnN0YXJ0TGluZU51bWJlciYmdC5lbmRDb2x1bW48PW4uc3RhcnRDb2x1bW58fG4uZW5kTGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5lbmRMaW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXImJm4uZW5kQ29sdW1uPD10LnN0YXJ0Q29sdW1uKX1zdGF0aWMgY29tcGFyZVJhbmdlc1VzaW5nU3RhcnRzKHQsbil7aWYodCYmbil7Y29uc3QgaT10LnN0YXJ0TGluZU51bWJlcnwwLG89bi5zdGFydExpbmVOdW1iZXJ8MDtpZihpPT09byl7Y29uc3QgbD10LnN0YXJ0Q29sdW1ufDAsdT1uLnN0YXJ0Q29sdW1ufDA7aWYobD09PXUpe2NvbnN0IGM9dC5lbmRMaW5lTnVtYmVyfDAsaD1uLmVuZExpbmVOdW1iZXJ8MDtpZihjPT09aCl7Y29uc3QgZj10LmVuZENvbHVtbnwwLGQ9bi5lbmRDb2x1bW58MDtyZXR1cm4gZi1kfXJldHVybiBjLWh9cmV0dXJuIGwtdX1yZXR1cm4gaS1vfXJldHVybih0PzE6MCktKG4/MTowKX1zdGF0aWMgY29tcGFyZVJhbmdlc1VzaW5nRW5kcyh0LG4pe3JldHVybiB0LmVuZExpbmVOdW1iZXI9PT1uLmVuZExpbmVOdW1iZXI/dC5lbmRDb2x1bW49PT1uLmVuZENvbHVtbj90LnN0YXJ0TGluZU51bWJlcj09PW4uc3RhcnRMaW5lTnVtYmVyP3Quc3RhcnRDb2x1bW4tbi5zdGFydENvbHVtbjp0LnN0YXJ0TGluZU51bWJlci1uLnN0YXJ0TGluZU51bWJlcjp0LmVuZENvbHVtbi1uLmVuZENvbHVtbjp0LmVuZExpbmVOdW1iZXItbi5lbmRMaW5lTnVtYmVyfXN0YXRpYyBzcGFuc011bHRpcGxlTGluZXModCl7cmV0dXJuIHQuZW5kTGluZU51bWJlcj50LnN0YXJ0TGluZU51bWJlcn10b0pTT04oKXtyZXR1cm4gdGhpc319ZnVuY3Rpb24gWW4oZSl7cmV0dXJuIGU8MD8wOmU+MjU1PzI1NTplfDB9ZnVuY3Rpb24gcWUoZSl7cmV0dXJuIGU8MD8wOmU+NDI5NDk2NzI5NT80Mjk0OTY3Mjk1OmV8MH1jbGFzcyBubntjb25zdHJ1Y3Rvcih0KXtjb25zdCBuPVluKHQpO3RoaXMuX2RlZmF1bHRWYWx1ZT1uLHRoaXMuX2FzY2lpTWFwPW5uLl9jcmVhdGVBc2NpaU1hcChuKSx0aGlzLl9tYXA9bmV3IE1hcH1zdGF0aWMgX2NyZWF0ZUFzY2lpTWFwKHQpe2NvbnN0IG49bmV3IFVpbnQ4QXJyYXkoMjU2KTtyZXR1cm4gbi5maWxsKHQpLG59c2V0KHQsbil7Y29uc3Qgcj1ZbihuKTt0Pj0wJiZ0PDI1Nj90aGlzLl9hc2NpaU1hcFt0XT1yOnRoaXMuX21hcC5zZXQodCxyKX1nZXQodCl7cmV0dXJuIHQ+PTAmJnQ8MjU2P3RoaXMuX2FzY2lpTWFwW3RdOnRoaXMuX21hcC5nZXQodCl8fHRoaXMuX2RlZmF1bHRWYWx1ZX1jbGVhcigpe3RoaXMuX2FzY2lpTWFwLmZpbGwodGhpcy5fZGVmYXVsdFZhbHVlKSx0aGlzLl9tYXAuY2xlYXIoKX19Y2xhc3MgdGF7Y29uc3RydWN0b3IodCxuLHIpe2NvbnN0IHM9bmV3IFVpbnQ4QXJyYXkodCpuKTtmb3IobGV0IGk9MCxvPXQqbjtpPG87aSsrKXNbaV09cjt0aGlzLl9kYXRhPXMsdGhpcy5yb3dzPXQsdGhpcy5jb2xzPW59Z2V0KHQsbil7cmV0dXJuIHRoaXMuX2RhdGFbdCp0aGlzLmNvbHMrbl19c2V0KHQsbixyKXt0aGlzLl9kYXRhW3QqdGhpcy5jb2xzK25dPXJ9fWNsYXNzIG5he2NvbnN0cnVjdG9yKHQpe2xldCBuPTAscj0wO2ZvcihsZXQgaT0wLG89dC5sZW5ndGg7aTxvO2krKyl7Y29uc3RbbCx1LGNdPXRbaV07dT5uJiYobj11KSxsPnImJihyPWwpLGM+ciYmKHI9Yyl9bisrLHIrKztjb25zdCBzPW5ldyB0YShyLG4sMCk7Zm9yKGxldCBpPTAsbz10Lmxlbmd0aDtpPG87aSsrKXtjb25zdFtsLHUsY109dFtpXTtzLnNldChsLHUsYyl9dGhpcy5fc3RhdGVzPXMsdGhpcy5fbWF4Q2hhckNvZGU9bn1uZXh0U3RhdGUodCxuKXtyZXR1cm4gbjwwfHxuPj10aGlzLl9tYXhDaGFyQ29kZT8wOnRoaXMuX3N0YXRlcy5nZXQodCxuKX19bGV0IHJuPW51bGw7ZnVuY3Rpb24gcmEoKXtyZXR1cm4gcm49PT1udWxsJiYocm49bmV3IG5hKFtbMSwxMDQsMl0sWzEsNzIsMl0sWzEsMTAyLDZdLFsxLDcwLDZdLFsyLDExNiwzXSxbMiw4NCwzXSxbMywxMTYsNF0sWzMsODQsNF0sWzQsMTEyLDVdLFs0LDgwLDVdLFs1LDExNSw5XSxbNSw4Myw5XSxbNSw1OCwxMF0sWzYsMTA1LDddLFs2LDczLDddLFs3LDEwOCw4XSxbNyw3Niw4XSxbOCwxMDEsOV0sWzgsNjksOV0sWzksNTgsMTBdLFsxMCw0NywxMV0sWzExLDQ3LDEyXV0pKSxybn1sZXQgbnQ9bnVsbDtmdW5jdGlvbiBzYSgpe2lmKG50PT09bnVsbCl7bnQ9bmV3IG5uKDApO2NvbnN0IGU9YCAJPD4nIuOAgeOAgu+9oe+9pO+8jO+8ju+8mu+8m+KAmOOAiOOAjOOAjuOAlO+8iO+8u++9m++9ou+9o++9ne+8ve+8ieOAleOAj+OAjeOAieKAme+9gO+9nuKApmA7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspbnQuc2V0KGUuY2hhckNvZGVBdChuKSwxKTtjb25zdCB0PSIuLDs6Ijtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKyludC5zZXQodC5jaGFyQ29kZUF0KG4pLDIpfXJldHVybiBudH1jbGFzcyBfdHtzdGF0aWMgX2NyZWF0ZUxpbmsodCxuLHIscyxpKXtsZXQgbz1pLTE7ZG97Y29uc3QgbD1uLmNoYXJDb2RlQXQobyk7aWYodC5nZXQobCkhPT0yKWJyZWFrO28tLX13aGlsZShvPnMpO2lmKHM+MCl7Y29uc3QgbD1uLmNoYXJDb2RlQXQocy0xKSx1PW4uY2hhckNvZGVBdChvKTsobD09PTQwJiZ1PT09NDF8fGw9PT05MSYmdT09PTkzfHxsPT09MTIzJiZ1PT09MTI1KSYmby0tfXJldHVybntyYW5nZTp7c3RhcnRMaW5lTnVtYmVyOnIsc3RhcnRDb2x1bW46cysxLGVuZExpbmVOdW1iZXI6cixlbmRDb2x1bW46bysyfSx1cmw6bi5zdWJzdHJpbmcocyxvKzEpfX1zdGF0aWMgY29tcHV0ZUxpbmtzKHQsbj1yYSgpKXtjb25zdCByPXNhKCkscz1bXTtmb3IobGV0IGk9MSxvPXQuZ2V0TGluZUNvdW50KCk7aTw9bztpKyspe2NvbnN0IGw9dC5nZXRMaW5lQ29udGVudChpKSx1PWwubGVuZ3RoO2xldCBjPTAsaD0wLGY9MCxkPTEsbT0hMSxnPSExLGI9ITEsXz0hMTtmb3IoO2M8dTspe2xldCB2PSExO2NvbnN0IFM9bC5jaGFyQ29kZUF0KGMpO2lmKGQ9PT0xMyl7bGV0IE47c3dpdGNoKFMpe2Nhc2UgNDA6bT0hMCxOPTA7YnJlYWs7Y2FzZSA0MTpOPW0/MDoxO2JyZWFrO2Nhc2UgOTE6Yj0hMCxnPSEwLE49MDticmVhaztjYXNlIDkzOmI9ITEsTj1nPzA6MTticmVhaztjYXNlIDEyMzpfPSEwLE49MDticmVhaztjYXNlIDEyNTpOPV8/MDoxO2JyZWFrO2Nhc2UgMzk6Y2FzZSAzNDpjYXNlIDk2OmY9PT1TP049MTpmPT09Mzl8fGY9PT0zNHx8Zj09PTk2P049MDpOPTE7YnJlYWs7Y2FzZSA0MjpOPWY9PT00Mj8xOjA7YnJlYWs7Y2FzZSAxMjQ6Tj1mPT09MTI0PzE6MDticmVhaztjYXNlIDMyOk49Yj8wOjE7YnJlYWs7ZGVmYXVsdDpOPXIuZ2V0KFMpfU49PT0xJiYocy5wdXNoKF90Ll9jcmVhdGVMaW5rKHIsbCxpLGgsYykpLHY9ITApfWVsc2UgaWYoZD09PTEyKXtsZXQgTjtTPT09OTE/KGc9ITAsTj0wKTpOPXIuZ2V0KFMpLE49PT0xP3Y9ITA6ZD0xM31lbHNlIGQ9bi5uZXh0U3RhdGUoZCxTKSxkPT09MCYmKHY9ITApO3YmJihkPTEsbT0hMSxnPSExLF89ITEsaD1jKzEsZj1TKSxjKyt9ZD09PTEzJiZzLnB1c2goX3QuX2NyZWF0ZUxpbmsocixsLGksaCx1KSl9cmV0dXJuIHN9fWZ1bmN0aW9uIGlhKGUpe3JldHVybiFlfHx0eXBlb2YgZS5nZXRMaW5lQ291bnQhPSJmdW5jdGlvbiJ8fHR5cGVvZiBlLmdldExpbmVDb250ZW50IT0iZnVuY3Rpb24iP1tdOl90LmNvbXB1dGVMaW5rcyhlKX1jb25zdCBGdD1jbGFzcyBGdHtjb25zdHJ1Y3Rvcigpe3RoaXMuX2RlZmF1bHRWYWx1ZVNldD1bWyJ0cnVlIiwiZmFsc2UiXSxbIlRydWUiLCJGYWxzZSJdLFsiUHJpdmF0ZSIsIlB1YmxpYyIsIkZyaWVuZCIsIlJlYWRPbmx5IiwiUGFydGlhbCIsIlByb3RlY3RlZCIsIldyaXRlT25seSJdLFsicHVibGljIiwicHJvdGVjdGVkIiwicHJpdmF0ZSJdXX1uYXZpZ2F0ZVZhbHVlU2V0KHQsbixyLHMsaSl7aWYodCYmbil7Y29uc3Qgbz10aGlzLmRvTmF2aWdhdGVWYWx1ZVNldChuLGkpO2lmKG8pcmV0dXJue3JhbmdlOnQsdmFsdWU6b319aWYociYmcyl7Y29uc3Qgbz10aGlzLmRvTmF2aWdhdGVWYWx1ZVNldChzLGkpO2lmKG8pcmV0dXJue3JhbmdlOnIsdmFsdWU6b319cmV0dXJuIG51bGx9ZG9OYXZpZ2F0ZVZhbHVlU2V0KHQsbil7Y29uc3Qgcj10aGlzLm51bWJlclJlcGxhY2UodCxuKTtyZXR1cm4gciE9PW51bGw/cjp0aGlzLnRleHRSZXBsYWNlKHQsbil9bnVtYmVyUmVwbGFjZSh0LG4pe2NvbnN0IHI9TWF0aC5wb3coMTAsdC5sZW5ndGgtKHQubGFzdEluZGV4T2YoIi4iKSsxKSk7bGV0IHM9TnVtYmVyKHQpO2NvbnN0IGk9cGFyc2VGbG9hdCh0KTtyZXR1cm4haXNOYU4ocykmJiFpc05hTihpKSYmcz09PWk/cz09PTAmJiFuP251bGw6KHM9TWF0aC5mbG9vcihzKnIpLHMrPW4/cjotcixTdHJpbmcocy9yKSk6bnVsbH10ZXh0UmVwbGFjZSh0LG4pe3JldHVybiB0aGlzLnZhbHVlU2V0c1JlcGxhY2UodGhpcy5fZGVmYXVsdFZhbHVlU2V0LHQsbil9dmFsdWVTZXRzUmVwbGFjZSh0LG4scil7bGV0IHM9bnVsbDtmb3IobGV0IGk9MCxvPXQubGVuZ3RoO3M9PT1udWxsJiZpPG87aSsrKXM9dGhpcy52YWx1ZVNldFJlcGxhY2UodFtpXSxuLHIpO3JldHVybiBzfXZhbHVlU2V0UmVwbGFjZSh0LG4scil7bGV0IHM9dC5pbmRleE9mKG4pO3JldHVybiBzPj0wPyhzKz1yPzE6LTEsczwwP3M9dC5sZW5ndGgtMTpzJT10Lmxlbmd0aCx0W3NdKTpudWxsfX07RnQuSU5TVEFOQ0U9bmV3IEZ0O2xldCBzbj1GdDtjb25zdCBKbj1PYmplY3QuZnJlZXplKGZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1zZXRUaW1lb3V0KGUuYmluZCh0KSwwKTtyZXR1cm57ZGlzcG9zZSgpe2NsZWFyVGltZW91dChuKX19fSk7dmFyIHd0OyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3JldHVybiBuPT09ZS5Ob25lfHxuPT09ZS5DYW5jZWxsZWR8fG4gaW5zdGFuY2VvZiBMdD8hMDohbnx8dHlwZW9mIG4hPSJvYmplY3QiPyExOnR5cGVvZiBuLmlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkPT0iYm9vbGVhbiImJnR5cGVvZiBuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkPT0iZnVuY3Rpb24ifWUuaXNDYW5jZWxsYXRpb25Ub2tlbj10LGUuTm9uZT1PYmplY3QuZnJlZXplKHtpc0NhbmNlbGxhdGlvblJlcXVlc3RlZDohMSxvbkNhbmNlbGxhdGlvblJlcXVlc3RlZDptdC5Ob25lfSksZS5DYW5jZWxsZWQ9T2JqZWN0LmZyZWV6ZSh7aXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6ITAsb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6Sm59KX0pKHd0fHwod3Q9e30pKTtjbGFzcyBMdHtjb25zdHJ1Y3Rvcigpe3RoaXMuX2lzQ2FuY2VsbGVkPSExLHRoaXMuX2VtaXR0ZXI9bnVsbH1jYW5jZWwoKXt0aGlzLl9pc0NhbmNlbGxlZHx8KHRoaXMuX2lzQ2FuY2VsbGVkPSEwLHRoaXMuX2VtaXR0ZXImJih0aGlzLl9lbWl0dGVyLmZpcmUodm9pZCAwKSx0aGlzLmRpc3Bvc2UoKSkpfWdldCBpc0NhbmNlbGxhdGlvblJlcXVlc3RlZCgpe3JldHVybiB0aGlzLl9pc0NhbmNlbGxlZH1nZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKXtyZXR1cm4gdGhpcy5faXNDYW5jZWxsZWQ/Sm46KHRoaXMuX2VtaXR0ZXJ8fCh0aGlzLl9lbWl0dGVyPW5ldyBvZSksdGhpcy5fZW1pdHRlci5ldmVudCl9ZGlzcG9zZSgpe3RoaXMuX2VtaXR0ZXImJih0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKSx0aGlzLl9lbWl0dGVyPW51bGwpfX1jbGFzcyBhYXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl90b2tlbj12b2lkIDAsdGhpcy5fcGFyZW50TGlzdGVuZXI9dm9pZCAwLHRoaXMuX3BhcmVudExpc3RlbmVyPXQmJnQub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQodGhpcy5jYW5jZWwsdGhpcyl9Z2V0IHRva2VuKCl7cmV0dXJuIHRoaXMuX3Rva2VufHwodGhpcy5fdG9rZW49bmV3IEx0KSx0aGlzLl90b2tlbn1jYW5jZWwoKXt0aGlzLl90b2tlbj90aGlzLl90b2tlbiBpbnN0YW5jZW9mIEx0JiZ0aGlzLl90b2tlbi5jYW5jZWwoKTp0aGlzLl90b2tlbj13dC5DYW5jZWxsZWR9ZGlzcG9zZSh0PSExKXt2YXIgbjt0JiZ0aGlzLmNhbmNlbCgpLChuPXRoaXMuX3BhcmVudExpc3RlbmVyKT09bnVsbHx8bi5kaXNwb3NlKCksdGhpcy5fdG9rZW4/dGhpcy5fdG9rZW4gaW5zdGFuY2VvZiBMdCYmdGhpcy5fdG9rZW4uZGlzcG9zZSgpOnRoaXMuX3Rva2VuPXd0Lk5vbmV9fWNsYXNzIGFue2NvbnN0cnVjdG9yKCl7dGhpcy5fa2V5Q29kZVRvU3RyPVtdLHRoaXMuX3N0clRvS2V5Q29kZT1PYmplY3QuY3JlYXRlKG51bGwpfWRlZmluZSh0LG4pe3RoaXMuX2tleUNvZGVUb1N0clt0XT1uLHRoaXMuX3N0clRvS2V5Q29kZVtuLnRvTG93ZXJDYXNlKCldPXR9a2V5Q29kZVRvU3RyKHQpe3JldHVybiB0aGlzLl9rZXlDb2RlVG9TdHJbdF19c3RyVG9LZXlDb2RlKHQpe3JldHVybiB0aGlzLl9zdHJUb0tleUNvZGVbdC50b0xvd2VyQ2FzZSgpXXx8MH19Y29uc3QgdnQ9bmV3IGFuLG9uPW5ldyBhbixsbj1uZXcgYW4sb2E9bmV3IEFycmF5KDIzMCksbGE9T2JqZWN0LmNyZWF0ZShudWxsKSx1YT1PYmplY3QuY3JlYXRlKG51bGwpOyhmdW5jdGlvbigpe2NvbnN0IGU9IiIsdD1bWzEsMCwiTm9uZSIsMCwidW5rbm93biIsMCwiVktfVU5LTk9XTiIsZSxlXSxbMSwxLCJIeXBlciIsMCxlLDAsZSxlLGVdLFsxLDIsIlN1cGVyIiwwLGUsMCxlLGUsZV0sWzEsMywiRm4iLDAsZSwwLGUsZSxlXSxbMSw0LCJGbkxvY2siLDAsZSwwLGUsZSxlXSxbMSw1LCJTdXNwZW5kIiwwLGUsMCxlLGUsZV0sWzEsNiwiUmVzdW1lIiwwLGUsMCxlLGUsZV0sWzEsNywiVHVyYm8iLDAsZSwwLGUsZSxlXSxbMSw4LCJTbGVlcCIsMCxlLDAsIlZLX1NMRUVQIixlLGVdLFsxLDksIldha2VVcCIsMCxlLDAsZSxlLGVdLFswLDEwLCJLZXlBIiwzMSwiQSIsNjUsIlZLX0EiLGUsZV0sWzAsMTEsIktleUIiLDMyLCJCIiw2NiwiVktfQiIsZSxlXSxbMCwxMiwiS2V5QyIsMzMsIkMiLDY3LCJWS19DIixlLGVdLFswLDEzLCJLZXlEIiwzNCwiRCIsNjgsIlZLX0QiLGUsZV0sWzAsMTQsIktleUUiLDM1LCJFIiw2OSwiVktfRSIsZSxlXSxbMCwxNSwiS2V5RiIsMzYsIkYiLDcwLCJWS19GIixlLGVdLFswLDE2LCJLZXlHIiwzNywiRyIsNzEsIlZLX0ciLGUsZV0sWzAsMTcsIktleUgiLDM4LCJIIiw3MiwiVktfSCIsZSxlXSxbMCwxOCwiS2V5SSIsMzksIkkiLDczLCJWS19JIixlLGVdLFswLDE5LCJLZXlKIiw0MCwiSiIsNzQsIlZLX0oiLGUsZV0sWzAsMjAsIktleUsiLDQxLCJLIiw3NSwiVktfSyIsZSxlXSxbMCwyMSwiS2V5TCIsNDIsIkwiLDc2LCJWS19MIixlLGVdLFswLDIyLCJLZXlNIiw0MywiTSIsNzcsIlZLX00iLGUsZV0sWzAsMjMsIktleU4iLDQ0LCJOIiw3OCwiVktfTiIsZSxlXSxbMCwyNCwiS2V5TyIsNDUsIk8iLDc5LCJWS19PIixlLGVdLFswLDI1LCJLZXlQIiw0NiwiUCIsODAsIlZLX1AiLGUsZV0sWzAsMjYsIktleVEiLDQ3LCJRIiw4MSwiVktfUSIsZSxlXSxbMCwyNywiS2V5UiIsNDgsIlIiLDgyLCJWS19SIixlLGVdLFswLDI4LCJLZXlTIiw0OSwiUyIsODMsIlZLX1MiLGUsZV0sWzAsMjksIktleVQiLDUwLCJUIiw4NCwiVktfVCIsZSxlXSxbMCwzMCwiS2V5VSIsNTEsIlUiLDg1LCJWS19VIixlLGVdLFswLDMxLCJLZXlWIiw1MiwiViIsODYsIlZLX1YiLGUsZV0sWzAsMzIsIktleVciLDUzLCJXIiw4NywiVktfVyIsZSxlXSxbMCwzMywiS2V5WCIsNTQsIlgiLDg4LCJWS19YIixlLGVdLFswLDM0LCJLZXlZIiw1NSwiWSIsODksIlZLX1kiLGUsZV0sWzAsMzUsIktleVoiLDU2LCJaIiw5MCwiVktfWiIsZSxlXSxbMCwzNiwiRGlnaXQxIiwyMiwiMSIsNDksIlZLXzEiLGUsZV0sWzAsMzcsIkRpZ2l0MiIsMjMsIjIiLDUwLCJWS18yIixlLGVdLFswLDM4LCJEaWdpdDMiLDI0LCIzIiw1MSwiVktfMyIsZSxlXSxbMCwzOSwiRGlnaXQ0IiwyNSwiNCIsNTIsIlZLXzQiLGUsZV0sWzAsNDAsIkRpZ2l0NSIsMjYsIjUiLDUzLCJWS181IixlLGVdLFswLDQxLCJEaWdpdDYiLDI3LCI2Iiw1NCwiVktfNiIsZSxlXSxbMCw0MiwiRGlnaXQ3IiwyOCwiNyIsNTUsIlZLXzciLGUsZV0sWzAsNDMsIkRpZ2l0OCIsMjksIjgiLDU2LCJWS184IixlLGVdLFswLDQ0LCJEaWdpdDkiLDMwLCI5Iiw1NywiVktfOSIsZSxlXSxbMCw0NSwiRGlnaXQwIiwyMSwiMCIsNDgsIlZLXzAiLGUsZV0sWzEsNDYsIkVudGVyIiwzLCJFbnRlciIsMTMsIlZLX1JFVFVSTiIsZSxlXSxbMSw0NywiRXNjYXBlIiw5LCJFc2NhcGUiLDI3LCJWS19FU0NBUEUiLGUsZV0sWzEsNDgsIkJhY2tzcGFjZSIsMSwiQmFja3NwYWNlIiw4LCJWS19CQUNLIixlLGVdLFsxLDQ5LCJUYWIiLDIsIlRhYiIsOSwiVktfVEFCIixlLGVdLFsxLDUwLCJTcGFjZSIsMTAsIlNwYWNlIiwzMiwiVktfU1BBQ0UiLGUsZV0sWzAsNTEsIk1pbnVzIiw4OCwiLSIsMTg5LCJWS19PRU1fTUlOVVMiLCItIiwiT0VNX01JTlVTIl0sWzAsNTIsIkVxdWFsIiw4NiwiPSIsMTg3LCJWS19PRU1fUExVUyIsIj0iLCJPRU1fUExVUyJdLFswLDUzLCJCcmFja2V0TGVmdCIsOTIsIlsiLDIxOSwiVktfT0VNXzQiLCJbIiwiT0VNXzQiXSxbMCw1NCwiQnJhY2tldFJpZ2h0Iiw5NCwiXSIsMjIxLCJWS19PRU1fNiIsIl0iLCJPRU1fNiJdLFswLDU1LCJCYWNrc2xhc2giLDkzLCJcXCIsMjIwLCJWS19PRU1fNSIsIlxcIiwiT0VNXzUiXSxbMCw1NiwiSW50bEhhc2giLDAsZSwwLGUsZSxlXSxbMCw1NywiU2VtaWNvbG9uIiw4NSwiOyIsMTg2LCJWS19PRU1fMSIsIjsiLCJPRU1fMSJdLFswLDU4LCJRdW90ZSIsOTUsIiciLDIyMiwiVktfT0VNXzciLCInIiwiT0VNXzciXSxbMCw1OSwiQmFja3F1b3RlIiw5MSwiYCIsMTkyLCJWS19PRU1fMyIsImAiLCJPRU1fMyJdLFswLDYwLCJDb21tYSIsODcsIiwiLDE4OCwiVktfT0VNX0NPTU1BIiwiLCIsIk9FTV9DT01NQSJdLFswLDYxLCJQZXJpb2QiLDg5LCIuIiwxOTAsIlZLX09FTV9QRVJJT0QiLCIuIiwiT0VNX1BFUklPRCJdLFswLDYyLCJTbGFzaCIsOTAsIi8iLDE5MSwiVktfT0VNXzIiLCIvIiwiT0VNXzIiXSxbMSw2MywiQ2Fwc0xvY2siLDgsIkNhcHNMb2NrIiwyMCwiVktfQ0FQSVRBTCIsZSxlXSxbMSw2NCwiRjEiLDU5LCJGMSIsMTEyLCJWS19GMSIsZSxlXSxbMSw2NSwiRjIiLDYwLCJGMiIsMTEzLCJWS19GMiIsZSxlXSxbMSw2NiwiRjMiLDYxLCJGMyIsMTE0LCJWS19GMyIsZSxlXSxbMSw2NywiRjQiLDYyLCJGNCIsMTE1LCJWS19GNCIsZSxlXSxbMSw2OCwiRjUiLDYzLCJGNSIsMTE2LCJWS19GNSIsZSxlXSxbMSw2OSwiRjYiLDY0LCJGNiIsMTE3LCJWS19GNiIsZSxlXSxbMSw3MCwiRjciLDY1LCJGNyIsMTE4LCJWS19GNyIsZSxlXSxbMSw3MSwiRjgiLDY2LCJGOCIsMTE5LCJWS19GOCIsZSxlXSxbMSw3MiwiRjkiLDY3LCJGOSIsMTIwLCJWS19GOSIsZSxlXSxbMSw3MywiRjEwIiw2OCwiRjEwIiwxMjEsIlZLX0YxMCIsZSxlXSxbMSw3NCwiRjExIiw2OSwiRjExIiwxMjIsIlZLX0YxMSIsZSxlXSxbMSw3NSwiRjEyIiw3MCwiRjEyIiwxMjMsIlZLX0YxMiIsZSxlXSxbMSw3NiwiUHJpbnRTY3JlZW4iLDAsZSwwLGUsZSxlXSxbMSw3NywiU2Nyb2xsTG9jayIsODQsIlNjcm9sbExvY2siLDE0NSwiVktfU0NST0xMIixlLGVdLFsxLDc4LCJQYXVzZSIsNywiUGF1c2VCcmVhayIsMTksIlZLX1BBVVNFIixlLGVdLFsxLDc5LCJJbnNlcnQiLDE5LCJJbnNlcnQiLDQ1LCJWS19JTlNFUlQiLGUsZV0sWzEsODAsIkhvbWUiLDE0LCJIb21lIiwzNiwiVktfSE9NRSIsZSxlXSxbMSw4MSwiUGFnZVVwIiwxMSwiUGFnZVVwIiwzMywiVktfUFJJT1IiLGUsZV0sWzEsODIsIkRlbGV0ZSIsMjAsIkRlbGV0ZSIsNDYsIlZLX0RFTEVURSIsZSxlXSxbMSw4MywiRW5kIiwxMywiRW5kIiwzNSwiVktfRU5EIixlLGVdLFsxLDg0LCJQYWdlRG93biIsMTIsIlBhZ2VEb3duIiwzNCwiVktfTkVYVCIsZSxlXSxbMSw4NSwiQXJyb3dSaWdodCIsMTcsIlJpZ2h0QXJyb3ciLDM5LCJWS19SSUdIVCIsIlJpZ2h0IixlXSxbMSw4NiwiQXJyb3dMZWZ0IiwxNSwiTGVmdEFycm93IiwzNywiVktfTEVGVCIsIkxlZnQiLGVdLFsxLDg3LCJBcnJvd0Rvd24iLDE4LCJEb3duQXJyb3ciLDQwLCJWS19ET1dOIiwiRG93biIsZV0sWzEsODgsIkFycm93VXAiLDE2LCJVcEFycm93IiwzOCwiVktfVVAiLCJVcCIsZV0sWzEsODksIk51bUxvY2siLDgzLCJOdW1Mb2NrIiwxNDQsIlZLX05VTUxPQ0siLGUsZV0sWzEsOTAsIk51bXBhZERpdmlkZSIsMTEzLCJOdW1QYWRfRGl2aWRlIiwxMTEsIlZLX0RJVklERSIsZSxlXSxbMSw5MSwiTnVtcGFkTXVsdGlwbHkiLDEwOCwiTnVtUGFkX011bHRpcGx5IiwxMDYsIlZLX01VTFRJUExZIixlLGVdLFsxLDkyLCJOdW1wYWRTdWJ0cmFjdCIsMTExLCJOdW1QYWRfU3VidHJhY3QiLDEwOSwiVktfU1VCVFJBQ1QiLGUsZV0sWzEsOTMsIk51bXBhZEFkZCIsMTA5LCJOdW1QYWRfQWRkIiwxMDcsIlZLX0FERCIsZSxlXSxbMSw5NCwiTnVtcGFkRW50ZXIiLDMsZSwwLGUsZSxlXSxbMSw5NSwiTnVtcGFkMSIsOTksIk51bVBhZDEiLDk3LCJWS19OVU1QQUQxIixlLGVdLFsxLDk2LCJOdW1wYWQyIiwxMDAsIk51bVBhZDIiLDk4LCJWS19OVU1QQUQyIixlLGVdLFsxLDk3LCJOdW1wYWQzIiwxMDEsIk51bVBhZDMiLDk5LCJWS19OVU1QQUQzIixlLGVdLFsxLDk4LCJOdW1wYWQ0IiwxMDIsIk51bVBhZDQiLDEwMCwiVktfTlVNUEFENCIsZSxlXSxbMSw5OSwiTnVtcGFkNSIsMTAzLCJOdW1QYWQ1IiwxMDEsIlZLX05VTVBBRDUiLGUsZV0sWzEsMTAwLCJOdW1wYWQ2IiwxMDQsIk51bVBhZDYiLDEwMiwiVktfTlVNUEFENiIsZSxlXSxbMSwxMDEsIk51bXBhZDciLDEwNSwiTnVtUGFkNyIsMTAzLCJWS19OVU1QQUQ3IixlLGVdLFsxLDEwMiwiTnVtcGFkOCIsMTA2LCJOdW1QYWQ4IiwxMDQsIlZLX05VTVBBRDgiLGUsZV0sWzEsMTAzLCJOdW1wYWQ5IiwxMDcsIk51bVBhZDkiLDEwNSwiVktfTlVNUEFEOSIsZSxlXSxbMSwxMDQsIk51bXBhZDAiLDk4LCJOdW1QYWQwIiw5NiwiVktfTlVNUEFEMCIsZSxlXSxbMSwxMDUsIk51bXBhZERlY2ltYWwiLDExMiwiTnVtUGFkX0RlY2ltYWwiLDExMCwiVktfREVDSU1BTCIsZSxlXSxbMCwxMDYsIkludGxCYWNrc2xhc2giLDk3LCJPRU1fMTAyIiwyMjYsIlZLX09FTV8xMDIiLGUsZV0sWzEsMTA3LCJDb250ZXh0TWVudSIsNTgsIkNvbnRleHRNZW51Iiw5MyxlLGUsZV0sWzEsMTA4LCJQb3dlciIsMCxlLDAsZSxlLGVdLFsxLDEwOSwiTnVtcGFkRXF1YWwiLDAsZSwwLGUsZSxlXSxbMSwxMTAsIkYxMyIsNzEsIkYxMyIsMTI0LCJWS19GMTMiLGUsZV0sWzEsMTExLCJGMTQiLDcyLCJGMTQiLDEyNSwiVktfRjE0IixlLGVdLFsxLDExMiwiRjE1Iiw3MywiRjE1IiwxMjYsIlZLX0YxNSIsZSxlXSxbMSwxMTMsIkYxNiIsNzQsIkYxNiIsMTI3LCJWS19GMTYiLGUsZV0sWzEsMTE0LCJGMTciLDc1LCJGMTciLDEyOCwiVktfRjE3IixlLGVdLFsxLDExNSwiRjE4Iiw3NiwiRjE4IiwxMjksIlZLX0YxOCIsZSxlXSxbMSwxMTYsIkYxOSIsNzcsIkYxOSIsMTMwLCJWS19GMTkiLGUsZV0sWzEsMTE3LCJGMjAiLDc4LCJGMjAiLDEzMSwiVktfRjIwIixlLGVdLFsxLDExOCwiRjIxIiw3OSwiRjIxIiwxMzIsIlZLX0YyMSIsZSxlXSxbMSwxMTksIkYyMiIsODAsIkYyMiIsMTMzLCJWS19GMjIiLGUsZV0sWzEsMTIwLCJGMjMiLDgxLCJGMjMiLDEzNCwiVktfRjIzIixlLGVdLFsxLDEyMSwiRjI0Iiw4MiwiRjI0IiwxMzUsIlZLX0YyNCIsZSxlXSxbMSwxMjIsIk9wZW4iLDAsZSwwLGUsZSxlXSxbMSwxMjMsIkhlbHAiLDAsZSwwLGUsZSxlXSxbMSwxMjQsIlNlbGVjdCIsMCxlLDAsZSxlLGVdLFsxLDEyNSwiQWdhaW4iLDAsZSwwLGUsZSxlXSxbMSwxMjYsIlVuZG8iLDAsZSwwLGUsZSxlXSxbMSwxMjcsIkN1dCIsMCxlLDAsZSxlLGVdLFsxLDEyOCwiQ29weSIsMCxlLDAsZSxlLGVdLFsxLDEyOSwiUGFzdGUiLDAsZSwwLGUsZSxlXSxbMSwxMzAsIkZpbmQiLDAsZSwwLGUsZSxlXSxbMSwxMzEsIkF1ZGlvVm9sdW1lTXV0ZSIsMTE3LCJBdWRpb1ZvbHVtZU11dGUiLDE3MywiVktfVk9MVU1FX01VVEUiLGUsZV0sWzEsMTMyLCJBdWRpb1ZvbHVtZVVwIiwxMTgsIkF1ZGlvVm9sdW1lVXAiLDE3NSwiVktfVk9MVU1FX1VQIixlLGVdLFsxLDEzMywiQXVkaW9Wb2x1bWVEb3duIiwxMTksIkF1ZGlvVm9sdW1lRG93biIsMTc0LCJWS19WT0xVTUVfRE9XTiIsZSxlXSxbMSwxMzQsIk51bXBhZENvbW1hIiwxMTAsIk51bVBhZF9TZXBhcmF0b3IiLDEwOCwiVktfU0VQQVJBVE9SIixlLGVdLFswLDEzNSwiSW50bFJvIiwxMTUsIkFCTlRfQzEiLDE5MywiVktfQUJOVF9DMSIsZSxlXSxbMSwxMzYsIkthbmFNb2RlIiwwLGUsMCxlLGUsZV0sWzAsMTM3LCJJbnRsWWVuIiwwLGUsMCxlLGUsZV0sWzEsMTM4LCJDb252ZXJ0IiwwLGUsMCxlLGUsZV0sWzEsMTM5LCJOb25Db252ZXJ0IiwwLGUsMCxlLGUsZV0sWzEsMTQwLCJMYW5nMSIsMCxlLDAsZSxlLGVdLFsxLDE0MSwiTGFuZzIiLDAsZSwwLGUsZSxlXSxbMSwxNDIsIkxhbmczIiwwLGUsMCxlLGUsZV0sWzEsMTQzLCJMYW5nNCIsMCxlLDAsZSxlLGVdLFsxLDE0NCwiTGFuZzUiLDAsZSwwLGUsZSxlXSxbMSwxNDUsIkFib3J0IiwwLGUsMCxlLGUsZV0sWzEsMTQ2LCJQcm9wcyIsMCxlLDAsZSxlLGVdLFsxLDE0NywiTnVtcGFkUGFyZW5MZWZ0IiwwLGUsMCxlLGUsZV0sWzEsMTQ4LCJOdW1wYWRQYXJlblJpZ2h0IiwwLGUsMCxlLGUsZV0sWzEsMTQ5LCJOdW1wYWRCYWNrc3BhY2UiLDAsZSwwLGUsZSxlXSxbMSwxNTAsIk51bXBhZE1lbW9yeVN0b3JlIiwwLGUsMCxlLGUsZV0sWzEsMTUxLCJOdW1wYWRNZW1vcnlSZWNhbGwiLDAsZSwwLGUsZSxlXSxbMSwxNTIsIk51bXBhZE1lbW9yeUNsZWFyIiwwLGUsMCxlLGUsZV0sWzEsMTUzLCJOdW1wYWRNZW1vcnlBZGQiLDAsZSwwLGUsZSxlXSxbMSwxNTQsIk51bXBhZE1lbW9yeVN1YnRyYWN0IiwwLGUsMCxlLGUsZV0sWzEsMTU1LCJOdW1wYWRDbGVhciIsMTMxLCJDbGVhciIsMTIsIlZLX0NMRUFSIixlLGVdLFsxLDE1NiwiTnVtcGFkQ2xlYXJFbnRyeSIsMCxlLDAsZSxlLGVdLFsxLDAsZSw1LCJDdHJsIiwxNywiVktfQ09OVFJPTCIsZSxlXSxbMSwwLGUsNCwiU2hpZnQiLDE2LCJWS19TSElGVCIsZSxlXSxbMSwwLGUsNiwiQWx0IiwxOCwiVktfTUVOVSIsZSxlXSxbMSwwLGUsNTcsIk1ldGEiLDkxLCJWS19DT01NQU5EIixlLGVdLFsxLDE1NywiQ29udHJvbExlZnQiLDUsZSwwLCJWS19MQ09OVFJPTCIsZSxlXSxbMSwxNTgsIlNoaWZ0TGVmdCIsNCxlLDAsIlZLX0xTSElGVCIsZSxlXSxbMSwxNTksIkFsdExlZnQiLDYsZSwwLCJWS19MTUVOVSIsZSxlXSxbMSwxNjAsIk1ldGFMZWZ0Iiw1NyxlLDAsIlZLX0xXSU4iLGUsZV0sWzEsMTYxLCJDb250cm9sUmlnaHQiLDUsZSwwLCJWS19SQ09OVFJPTCIsZSxlXSxbMSwxNjIsIlNoaWZ0UmlnaHQiLDQsZSwwLCJWS19SU0hJRlQiLGUsZV0sWzEsMTYzLCJBbHRSaWdodCIsNixlLDAsIlZLX1JNRU5VIixlLGVdLFsxLDE2NCwiTWV0YVJpZ2h0Iiw1NyxlLDAsIlZLX1JXSU4iLGUsZV0sWzEsMTY1LCJCcmlnaHRuZXNzVXAiLDAsZSwwLGUsZSxlXSxbMSwxNjYsIkJyaWdodG5lc3NEb3duIiwwLGUsMCxlLGUsZV0sWzEsMTY3LCJNZWRpYVBsYXkiLDAsZSwwLGUsZSxlXSxbMSwxNjgsIk1lZGlhUmVjb3JkIiwwLGUsMCxlLGUsZV0sWzEsMTY5LCJNZWRpYUZhc3RGb3J3YXJkIiwwLGUsMCxlLGUsZV0sWzEsMTcwLCJNZWRpYVJld2luZCIsMCxlLDAsZSxlLGVdLFsxLDE3MSwiTWVkaWFUcmFja05leHQiLDEyNCwiTWVkaWFUcmFja05leHQiLDE3NiwiVktfTUVESUFfTkVYVF9UUkFDSyIsZSxlXSxbMSwxNzIsIk1lZGlhVHJhY2tQcmV2aW91cyIsMTI1LCJNZWRpYVRyYWNrUHJldmlvdXMiLDE3NywiVktfTUVESUFfUFJFVl9UUkFDSyIsZSxlXSxbMSwxNzMsIk1lZGlhU3RvcCIsMTI2LCJNZWRpYVN0b3AiLDE3OCwiVktfTUVESUFfU1RPUCIsZSxlXSxbMSwxNzQsIkVqZWN0IiwwLGUsMCxlLGUsZV0sWzEsMTc1LCJNZWRpYVBsYXlQYXVzZSIsMTI3LCJNZWRpYVBsYXlQYXVzZSIsMTc5LCJWS19NRURJQV9QTEFZX1BBVVNFIixlLGVdLFsxLDE3NiwiTWVkaWFTZWxlY3QiLDEyOCwiTGF1bmNoTWVkaWFQbGF5ZXIiLDE4MSwiVktfTUVESUFfTEFVTkNIX01FRElBX1NFTEVDVCIsZSxlXSxbMSwxNzcsIkxhdW5jaE1haWwiLDEyOSwiTGF1bmNoTWFpbCIsMTgwLCJWS19NRURJQV9MQVVOQ0hfTUFJTCIsZSxlXSxbMSwxNzgsIkxhdW5jaEFwcDIiLDEzMCwiTGF1bmNoQXBwMiIsMTgzLCJWS19NRURJQV9MQVVOQ0hfQVBQMiIsZSxlXSxbMSwxNzksIkxhdW5jaEFwcDEiLDAsZSwwLCJWS19NRURJQV9MQVVOQ0hfQVBQMSIsZSxlXSxbMSwxODAsIlNlbGVjdFRhc2siLDAsZSwwLGUsZSxlXSxbMSwxODEsIkxhdW5jaFNjcmVlblNhdmVyIiwwLGUsMCxlLGUsZV0sWzEsMTgyLCJCcm93c2VyU2VhcmNoIiwxMjAsIkJyb3dzZXJTZWFyY2giLDE3MCwiVktfQlJPV1NFUl9TRUFSQ0giLGUsZV0sWzEsMTgzLCJCcm93c2VySG9tZSIsMTIxLCJCcm93c2VySG9tZSIsMTcyLCJWS19CUk9XU0VSX0hPTUUiLGUsZV0sWzEsMTg0LCJCcm93c2VyQmFjayIsMTIyLCJCcm93c2VyQmFjayIsMTY2LCJWS19CUk9XU0VSX0JBQ0siLGUsZV0sWzEsMTg1LCJCcm93c2VyRm9yd2FyZCIsMTIzLCJCcm93c2VyRm9yd2FyZCIsMTY3LCJWS19CUk9XU0VSX0ZPUldBUkQiLGUsZV0sWzEsMTg2LCJCcm93c2VyU3RvcCIsMCxlLDAsIlZLX0JST1dTRVJfU1RPUCIsZSxlXSxbMSwxODcsIkJyb3dzZXJSZWZyZXNoIiwwLGUsMCwiVktfQlJPV1NFUl9SRUZSRVNIIixlLGVdLFsxLDE4OCwiQnJvd3NlckZhdm9yaXRlcyIsMCxlLDAsIlZLX0JST1dTRVJfRkFWT1JJVEVTIixlLGVdLFsxLDE4OSwiWm9vbVRvZ2dsZSIsMCxlLDAsZSxlLGVdLFsxLDE5MCwiTWFpbFJlcGx5IiwwLGUsMCxlLGUsZV0sWzEsMTkxLCJNYWlsRm9yd2FyZCIsMCxlLDAsZSxlLGVdLFsxLDE5MiwiTWFpbFNlbmQiLDAsZSwwLGUsZSxlXSxbMSwwLGUsMTE0LCJLZXlJbkNvbXBvc2l0aW9uIiwyMjksZSxlLGVdLFsxLDAsZSwxMTYsIkFCTlRfQzIiLDE5NCwiVktfQUJOVF9DMiIsZSxlXSxbMSwwLGUsOTYsIk9FTV84IiwyMjMsIlZLX09FTV84IixlLGVdLFsxLDAsZSwwLGUsMCwiVktfS0FOQSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0hBTkdVTCIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0pVTkpBIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfRklOQUwiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19IQU5KQSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0tBTkpJIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfQ09OVkVSVCIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX05PTkNPTlZFUlQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19BQ0NFUFQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19NT0RFQ0hBTkdFIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfU0VMRUNUIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfUFJJTlQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19FWEVDVVRFIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfU05BUFNIT1QiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19IRUxQIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfQVBQUyIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX1BST0NFU1NLRVkiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19QQUNLRVQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19EQkVfU0JDU0NIQVIiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19EQkVfREJDU0NIQVIiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19BVFROIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfQ1JTRUwiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19FWFNFTCIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0VSRU9GIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfUExBWSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX1pPT00iLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19OT05BTUUiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19QQTEiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19PRU1fQ0xFQVIiLGUsZV1dLG49W10scj1bXTtmb3IoY29uc3QgcyBvZiB0KXtjb25zdFtpLG8sbCx1LGMsaCxmLGQsbV09cztpZihyW29dfHwocltvXT0hMCxsYVtsXT1vLHVhW2wudG9Mb3dlckNhc2UoKV09byksIW5bdV0pe2lmKG5bdV09ITAsIWMpdGhyb3cgbmV3IEVycm9yKGBTdHJpbmcgcmVwcmVzZW50YXRpb24gbWlzc2luZyBmb3Iga2V5IGNvZGUgJHt1fSBhcm91bmQgc2NhbiBjb2RlICR7bH1gKTt2dC5kZWZpbmUodSxjKSxvbi5kZWZpbmUodSxkfHxjKSxsbi5kZWZpbmUodSxtfHxkfHxjKX1oJiYob2FbaF09dSl9fSkoKTt2YXIgWm47KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobCl7cmV0dXJuIHZ0LmtleUNvZGVUb1N0cihsKX1lLnRvU3RyaW5nPXQ7ZnVuY3Rpb24gbihsKXtyZXR1cm4gdnQuc3RyVG9LZXlDb2RlKGwpfWUuZnJvbVN0cmluZz1uO2Z1bmN0aW9uIHIobCl7cmV0dXJuIG9uLmtleUNvZGVUb1N0cihsKX1lLnRvVXNlclNldHRpbmdzVVM9cjtmdW5jdGlvbiBzKGwpe3JldHVybiBsbi5rZXlDb2RlVG9TdHIobCl9ZS50b1VzZXJTZXR0aW5nc0dlbmVyYWw9cztmdW5jdGlvbiBpKGwpe3JldHVybiBvbi5zdHJUb0tleUNvZGUobCl8fGxuLnN0clRvS2V5Q29kZShsKX1lLmZyb21Vc2VyU2V0dGluZ3M9aTtmdW5jdGlvbiBvKGwpe2lmKGw+PTk4JiZsPD0xMTMpcmV0dXJuIG51bGw7c3dpdGNoKGwpe2Nhc2UgMTY6cmV0dXJuIlVwIjtjYXNlIDE4OnJldHVybiJEb3duIjtjYXNlIDE1OnJldHVybiJMZWZ0IjtjYXNlIDE3OnJldHVybiJSaWdodCJ9cmV0dXJuIHZ0LmtleUNvZGVUb1N0cihsKX1lLnRvRWxlY3Ryb25BY2NlbGVyYXRvcj1vfSkoWm58fChabj17fSkpO2Z1bmN0aW9uIGNhKGUsdCl7Y29uc3Qgbj0odCY2NTUzNSk8PDE2Pj4+MDtyZXR1cm4oZXxuKT4+PjB9Y2xhc3MgYWUgZXh0ZW5kcyBre2NvbnN0cnVjdG9yKHQsbixyLHMpe3N1cGVyKHQsbixyLHMpLHRoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyPXQsdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbj1uLHRoaXMucG9zaXRpb25MaW5lTnVtYmVyPXIsdGhpcy5wb3NpdGlvbkNvbHVtbj1zfXRvU3RyaW5nKCl7cmV0dXJuIlsiK3RoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyKyIsIit0aGlzLnNlbGVjdGlvblN0YXJ0Q29sdW1uKyIgLT4gIit0aGlzLnBvc2l0aW9uTGluZU51bWJlcisiLCIrdGhpcy5wb3NpdGlvbkNvbHVtbisiXSJ9ZXF1YWxzU2VsZWN0aW9uKHQpe3JldHVybiBhZS5zZWxlY3Rpb25zRXF1YWwodGhpcyx0KX1zdGF0aWMgc2VsZWN0aW9uc0VxdWFsKHQsbil7cmV0dXJuIHQuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyPT09bi5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXImJnQuc2VsZWN0aW9uU3RhcnRDb2x1bW49PT1uLnNlbGVjdGlvblN0YXJ0Q29sdW1uJiZ0LnBvc2l0aW9uTGluZU51bWJlcj09PW4ucG9zaXRpb25MaW5lTnVtYmVyJiZ0LnBvc2l0aW9uQ29sdW1uPT09bi5wb3NpdGlvbkNvbHVtbn1nZXREaXJlY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXI9PT10aGlzLnN0YXJ0TGluZU51bWJlciYmdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbj09PXRoaXMuc3RhcnRDb2x1bW4/MDoxfXNldEVuZFBvc2l0aW9uKHQsbil7cmV0dXJuIHRoaXMuZ2V0RGlyZWN0aW9uKCk9PT0wP25ldyBhZSh0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLnN0YXJ0Q29sdW1uLHQsbik6bmV3IGFlKHQsbix0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLnN0YXJ0Q29sdW1uKX1nZXRQb3NpdGlvbigpe3JldHVybiBuZXcgJCh0aGlzLnBvc2l0aW9uTGluZU51bWJlcix0aGlzLnBvc2l0aW9uQ29sdW1uKX1nZXRTZWxlY3Rpb25TdGFydCgpe3JldHVybiBuZXcgJCh0aGlzLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlcix0aGlzLnNlbGVjdGlvblN0YXJ0Q29sdW1uKX1zZXRTdGFydFBvc2l0aW9uKHQsbil7cmV0dXJuIHRoaXMuZ2V0RGlyZWN0aW9uKCk9PT0wP25ldyBhZSh0LG4sdGhpcy5lbmRMaW5lTnVtYmVyLHRoaXMuZW5kQ29sdW1uKTpuZXcgYWUodGhpcy5lbmRMaW5lTnVtYmVyLHRoaXMuZW5kQ29sdW1uLHQsbil9c3RhdGljIGZyb21Qb3NpdGlvbnModCxuPXQpe3JldHVybiBuZXcgYWUodC5saW5lTnVtYmVyLHQuY29sdW1uLG4ubGluZU51bWJlcixuLmNvbHVtbil9c3RhdGljIGZyb21SYW5nZSh0LG4pe3JldHVybiBuPT09MD9uZXcgYWUodC5zdGFydExpbmVOdW1iZXIsdC5zdGFydENvbHVtbix0LmVuZExpbmVOdW1iZXIsdC5lbmRDb2x1bW4pOm5ldyBhZSh0LmVuZExpbmVOdW1iZXIsdC5lbmRDb2x1bW4sdC5zdGFydExpbmVOdW1iZXIsdC5zdGFydENvbHVtbil9c3RhdGljIGxpZnRTZWxlY3Rpb24odCl7cmV0dXJuIG5ldyBhZSh0LnNlbGVjdGlvblN0YXJ0TGluZU51bWJlcix0LnNlbGVjdGlvblN0YXJ0Q29sdW1uLHQucG9zaXRpb25MaW5lTnVtYmVyLHQucG9zaXRpb25Db2x1bW4pfXN0YXRpYyBzZWxlY3Rpb25zQXJyRXF1YWwodCxuKXtpZih0JiYhbnx8IXQmJm4pcmV0dXJuITE7aWYoIXQmJiFuKXJldHVybiEwO2lmKHQubGVuZ3RoIT09bi5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCByPTAscz10Lmxlbmd0aDtyPHM7cisrKWlmKCF0aGlzLnNlbGVjdGlvbnNFcXVhbCh0W3JdLG5bcl0pKXJldHVybiExO3JldHVybiEwfXN0YXRpYyBpc0lTZWxlY3Rpb24odCl7cmV0dXJuIHQmJnR5cGVvZiB0LnNlbGVjdGlvblN0YXJ0TGluZU51bWJlcj09Im51bWJlciImJnR5cGVvZiB0LnNlbGVjdGlvblN0YXJ0Q29sdW1uPT0ibnVtYmVyIiYmdHlwZW9mIHQucG9zaXRpb25MaW5lTnVtYmVyPT0ibnVtYmVyIiYmdHlwZW9mIHQucG9zaXRpb25Db2x1bW49PSJudW1iZXIifXN0YXRpYyBjcmVhdGVXaXRoRGlyZWN0aW9uKHQsbixyLHMsaSl7cmV0dXJuIGk9PT0wP25ldyBhZSh0LG4scixzKTpuZXcgYWUocixzLHQsbil9fWZ1bmN0aW9uIGhhKGUpe3JldHVybiB0eXBlb2YgZT09InN0cmluZyJ9Y29uc3QgS249T2JqZWN0LmNyZWF0ZShudWxsKTtmdW5jdGlvbiBhKGUsdCl7aWYoaGEodCkpe2NvbnN0IG49S25bdF07aWYobj09PXZvaWQgMCl0aHJvdyBuZXcgRXJyb3IoYCR7ZX0gcmVmZXJlbmNlcyBhbiB1bmtub3duIGNvZGljb246ICR7dH1gKTt0PW59cmV0dXJuIEtuW2VdPXQse2lkOmV9fWNvbnN0IGZhPXthZGQ6YSgiYWRkIiw2ZTQpLHBsdXM6YSgicGx1cyIsNmU0KSxnaXN0TmV3OmEoImdpc3QtbmV3Iiw2ZTQpLHJlcG9DcmVhdGU6YSgicmVwby1jcmVhdGUiLDZlNCksbGlnaHRidWxiOmEoImxpZ2h0YnVsYiIsNjAwMDEpLGxpZ2h0QnVsYjphKCJsaWdodC1idWxiIiw2MDAwMSkscmVwbzphKCJyZXBvIiw2MDAwMikscmVwb0RlbGV0ZTphKCJyZXBvLWRlbGV0ZSIsNjAwMDIpLGdpc3RGb3JrOmEoImdpc3QtZm9yayIsNjAwMDMpLHJlcG9Gb3JrZWQ6YSgicmVwby1mb3JrZWQiLDYwMDAzKSxnaXRQdWxsUmVxdWVzdDphKCJnaXQtcHVsbC1yZXF1ZXN0Iiw2MDAwNCksZ2l0UHVsbFJlcXVlc3RBYmFuZG9uZWQ6YSgiZ2l0LXB1bGwtcmVxdWVzdC1hYmFuZG9uZWQiLDYwMDA0KSxyZWNvcmRLZXlzOmEoInJlY29yZC1rZXlzIiw2MDAwNSksa2V5Ym9hcmQ6YSgia2V5Ym9hcmQiLDYwMDA1KSx0YWc6YSgidGFnIiw2MDAwNiksZ2l0UHVsbFJlcXVlc3RMYWJlbDphKCJnaXQtcHVsbC1yZXF1ZXN0LWxhYmVsIiw2MDAwNiksdGFnQWRkOmEoInRhZy1hZGQiLDYwMDA2KSx0YWdSZW1vdmU6YSgidGFnLXJlbW92ZSIsNjAwMDYpLHBlcnNvbjphKCJwZXJzb24iLDYwMDA3KSxwZXJzb25Gb2xsb3c6YSgicGVyc29uLWZvbGxvdyIsNjAwMDcpLHBlcnNvbk91dGxpbmU6YSgicGVyc29uLW91dGxpbmUiLDYwMDA3KSxwZXJzb25GaWxsZWQ6YSgicGVyc29uLWZpbGxlZCIsNjAwMDcpLGdpdEJyYW5jaDphKCJnaXQtYnJhbmNoIiw2MDAwOCksZ2l0QnJhbmNoQ3JlYXRlOmEoImdpdC1icmFuY2gtY3JlYXRlIiw2MDAwOCksZ2l0QnJhbmNoRGVsZXRlOmEoImdpdC1icmFuY2gtZGVsZXRlIiw2MDAwOCksc291cmNlQ29udHJvbDphKCJzb3VyY2UtY29udHJvbCIsNjAwMDgpLG1pcnJvcjphKCJtaXJyb3IiLDYwMDA5KSxtaXJyb3JQdWJsaWM6YSgibWlycm9yLXB1YmxpYyIsNjAwMDkpLHN0YXI6YSgic3RhciIsNjAwMTApLHN0YXJBZGQ6YSgic3Rhci1hZGQiLDYwMDEwKSxzdGFyRGVsZXRlOmEoInN0YXItZGVsZXRlIiw2MDAxMCksc3RhckVtcHR5OmEoInN0YXItZW1wdHkiLDYwMDEwKSxjb21tZW50OmEoImNvbW1lbnQiLDYwMDExKSxjb21tZW50QWRkOmEoImNvbW1lbnQtYWRkIiw2MDAxMSksYWxlcnQ6YSgiYWxlcnQiLDYwMDEyKSx3YXJuaW5nOmEoIndhcm5pbmciLDYwMDEyKSxzZWFyY2g6YSgic2VhcmNoIiw2MDAxMyksc2VhcmNoU2F2ZTphKCJzZWFyY2gtc2F2ZSIsNjAwMTMpLGxvZ091dDphKCJsb2ctb3V0Iiw2MDAxNCksc2lnbk91dDphKCJzaWduLW91dCIsNjAwMTQpLGxvZ0luOmEoImxvZy1pbiIsNjAwMTUpLHNpZ25JbjphKCJzaWduLWluIiw2MDAxNSksZXllOmEoImV5ZSIsNjAwMTYpLGV5ZVVud2F0Y2g6YSgiZXllLXVud2F0Y2giLDYwMDE2KSxleWVXYXRjaDphKCJleWUtd2F0Y2giLDYwMDE2KSxjaXJjbGVGaWxsZWQ6YSgiY2lyY2xlLWZpbGxlZCIsNjAwMTcpLHByaW1pdGl2ZURvdDphKCJwcmltaXRpdmUtZG90Iiw2MDAxNyksY2xvc2VEaXJ0eTphKCJjbG9zZS1kaXJ0eSIsNjAwMTcpLGRlYnVnQnJlYWtwb2ludDphKCJkZWJ1Zy1icmVha3BvaW50Iiw2MDAxNyksZGVidWdCcmVha3BvaW50RGlzYWJsZWQ6YSgiZGVidWctYnJlYWtwb2ludC1kaXNhYmxlZCIsNjAwMTcpLGRlYnVnSGludDphKCJkZWJ1Zy1oaW50Iiw2MDAxNyksdGVybWluYWxEZWNvcmF0aW9uU3VjY2VzczphKCJ0ZXJtaW5hbC1kZWNvcmF0aW9uLXN1Y2Nlc3MiLDYwMDE3KSxwcmltaXRpdmVTcXVhcmU6YSgicHJpbWl0aXZlLXNxdWFyZSIsNjAwMTgpLGVkaXQ6YSgiZWRpdCIsNjAwMTkpLHBlbmNpbDphKCJwZW5jaWwiLDYwMDE5KSxpbmZvOmEoImluZm8iLDYwMDIwKSxpc3N1ZU9wZW5lZDphKCJpc3N1ZS1vcGVuZWQiLDYwMDIwKSxnaXN0UHJpdmF0ZTphKCJnaXN0LXByaXZhdGUiLDYwMDIxKSxnaXRGb3JrUHJpdmF0ZTphKCJnaXQtZm9yay1wcml2YXRlIiw2MDAyMSksbG9jazphKCJsb2NrIiw2MDAyMSksbWlycm9yUHJpdmF0ZTphKCJtaXJyb3ItcHJpdmF0ZSIsNjAwMjEpLGNsb3NlOmEoImNsb3NlIiw2MDAyMikscmVtb3ZlQ2xvc2U6YSgicmVtb3ZlLWNsb3NlIiw2MDAyMikseDphKCJ4Iiw2MDAyMikscmVwb1N5bmM6YSgicmVwby1zeW5jIiw2MDAyMyksc3luYzphKCJzeW5jIiw2MDAyMyksY2xvbmU6YSgiY2xvbmUiLDYwMDI0KSxkZXNrdG9wRG93bmxvYWQ6YSgiZGVza3RvcC1kb3dubG9hZCIsNjAwMjQpLGJlYWtlcjphKCJiZWFrZXIiLDYwMDI1KSxtaWNyb3Njb3BlOmEoIm1pY3Jvc2NvcGUiLDYwMDI1KSx2bTphKCJ2bSIsNjAwMjYpLGRldmljZURlc2t0b3A6YSgiZGV2aWNlLWRlc2t0b3AiLDYwMDI2KSxmaWxlOmEoImZpbGUiLDYwMDI3KSxmaWxlVGV4dDphKCJmaWxlLXRleHQiLDYwMDI3KSxtb3JlOmEoIm1vcmUiLDYwMDI4KSxlbGxpcHNpczphKCJlbGxpcHNpcyIsNjAwMjgpLGtlYmFiSG9yaXpvbnRhbDphKCJrZWJhYi1ob3Jpem9udGFsIiw2MDAyOCksbWFpbFJlcGx5OmEoIm1haWwtcmVwbHkiLDYwMDI5KSxyZXBseTphKCJyZXBseSIsNjAwMjkpLG9yZ2FuaXphdGlvbjphKCJvcmdhbml6YXRpb24iLDYwMDMwKSxvcmdhbml6YXRpb25GaWxsZWQ6YSgib3JnYW5pemF0aW9uLWZpbGxlZCIsNjAwMzApLG9yZ2FuaXphdGlvbk91dGxpbmU6YSgib3JnYW5pemF0aW9uLW91dGxpbmUiLDYwMDMwKSxuZXdGaWxlOmEoIm5ldy1maWxlIiw2MDAzMSksZmlsZUFkZDphKCJmaWxlLWFkZCIsNjAwMzEpLG5ld0ZvbGRlcjphKCJuZXctZm9sZGVyIiw2MDAzMiksZmlsZURpcmVjdG9yeUNyZWF0ZTphKCJmaWxlLWRpcmVjdG9yeS1jcmVhdGUiLDYwMDMyKSx0cmFzaDphKCJ0cmFzaCIsNjAwMzMpLHRyYXNoY2FuOmEoInRyYXNoY2FuIiw2MDAzMyksaGlzdG9yeTphKCJoaXN0b3J5Iiw2MDAzNCksY2xvY2s6YSgiY2xvY2siLDYwMDM0KSxmb2xkZXI6YSgiZm9sZGVyIiw2MDAzNSksZmlsZURpcmVjdG9yeTphKCJmaWxlLWRpcmVjdG9yeSIsNjAwMzUpLHN5bWJvbEZvbGRlcjphKCJzeW1ib2wtZm9sZGVyIiw2MDAzNSksbG9nb0dpdGh1YjphKCJsb2dvLWdpdGh1YiIsNjAwMzYpLG1hcmtHaXRodWI6YSgibWFyay1naXRodWIiLDYwMDM2KSxnaXRodWI6YSgiZ2l0aHViIiw2MDAzNiksdGVybWluYWw6YSgidGVybWluYWwiLDYwMDM3KSxjb25zb2xlOmEoImNvbnNvbGUiLDYwMDM3KSxyZXBsOmEoInJlcGwiLDYwMDM3KSx6YXA6YSgiemFwIiw2MDAzOCksc3ltYm9sRXZlbnQ6YSgic3ltYm9sLWV2ZW50Iiw2MDAzOCksZXJyb3I6YSgiZXJyb3IiLDYwMDM5KSxzdG9wOmEoInN0b3AiLDYwMDM5KSx2YXJpYWJsZTphKCJ2YXJpYWJsZSIsNjAwNDApLHN5bWJvbFZhcmlhYmxlOmEoInN5bWJvbC12YXJpYWJsZSIsNjAwNDApLGFycmF5OmEoImFycmF5Iiw2MDA0Miksc3ltYm9sQXJyYXk6YSgic3ltYm9sLWFycmF5Iiw2MDA0Miksc3ltYm9sTW9kdWxlOmEoInN5bWJvbC1tb2R1bGUiLDYwMDQzKSxzeW1ib2xQYWNrYWdlOmEoInN5bWJvbC1wYWNrYWdlIiw2MDA0Myksc3ltYm9sTmFtZXNwYWNlOmEoInN5bWJvbC1uYW1lc3BhY2UiLDYwMDQzKSxzeW1ib2xPYmplY3Q6YSgic3ltYm9sLW9iamVjdCIsNjAwNDMpLHN5bWJvbE1ldGhvZDphKCJzeW1ib2wtbWV0aG9kIiw2MDA0NCksc3ltYm9sRnVuY3Rpb246YSgic3ltYm9sLWZ1bmN0aW9uIiw2MDA0NCksc3ltYm9sQ29uc3RydWN0b3I6YSgic3ltYm9sLWNvbnN0cnVjdG9yIiw2MDA0NCksc3ltYm9sQm9vbGVhbjphKCJzeW1ib2wtYm9vbGVhbiIsNjAwNDcpLHN5bWJvbE51bGw6YSgic3ltYm9sLW51bGwiLDYwMDQ3KSxzeW1ib2xOdW1lcmljOmEoInN5bWJvbC1udW1lcmljIiw2MDA0OCksc3ltYm9sTnVtYmVyOmEoInN5bWJvbC1udW1iZXIiLDYwMDQ4KSxzeW1ib2xTdHJ1Y3R1cmU6YSgic3ltYm9sLXN0cnVjdHVyZSIsNjAwNDkpLHN5bWJvbFN0cnVjdDphKCJzeW1ib2wtc3RydWN0Iiw2MDA0OSksc3ltYm9sUGFyYW1ldGVyOmEoInN5bWJvbC1wYXJhbWV0ZXIiLDYwMDUwKSxzeW1ib2xUeXBlUGFyYW1ldGVyOmEoInN5bWJvbC10eXBlLXBhcmFtZXRlciIsNjAwNTApLHN5bWJvbEtleTphKCJzeW1ib2wta2V5Iiw2MDA1MSksc3ltYm9sVGV4dDphKCJzeW1ib2wtdGV4dCIsNjAwNTEpLHN5bWJvbFJlZmVyZW5jZTphKCJzeW1ib2wtcmVmZXJlbmNlIiw2MDA1MiksZ29Ub0ZpbGU6YSgiZ28tdG8tZmlsZSIsNjAwNTIpLHN5bWJvbEVudW06YSgic3ltYm9sLWVudW0iLDYwMDUzKSxzeW1ib2xWYWx1ZTphKCJzeW1ib2wtdmFsdWUiLDYwMDUzKSxzeW1ib2xSdWxlcjphKCJzeW1ib2wtcnVsZXIiLDYwMDU0KSxzeW1ib2xVbml0OmEoInN5bWJvbC11bml0Iiw2MDA1NCksYWN0aXZhdGVCcmVha3BvaW50czphKCJhY3RpdmF0ZS1icmVha3BvaW50cyIsNjAwNTUpLGFyY2hpdmU6YSgiYXJjaGl2ZSIsNjAwNTYpLGFycm93Qm90aDphKCJhcnJvdy1ib3RoIiw2MDA1NyksYXJyb3dEb3duOmEoImFycm93LWRvd24iLDYwMDU4KSxhcnJvd0xlZnQ6YSgiYXJyb3ctbGVmdCIsNjAwNTkpLGFycm93UmlnaHQ6YSgiYXJyb3ctcmlnaHQiLDYwMDYwKSxhcnJvd1NtYWxsRG93bjphKCJhcnJvdy1zbWFsbC1kb3duIiw2MDA2MSksYXJyb3dTbWFsbExlZnQ6YSgiYXJyb3ctc21hbGwtbGVmdCIsNjAwNjIpLGFycm93U21hbGxSaWdodDphKCJhcnJvdy1zbWFsbC1yaWdodCIsNjAwNjMpLGFycm93U21hbGxVcDphKCJhcnJvdy1zbWFsbC11cCIsNjAwNjQpLGFycm93VXA6YSgiYXJyb3ctdXAiLDYwMDY1KSxiZWxsOmEoImJlbGwiLDYwMDY2KSxib2xkOmEoImJvbGQiLDYwMDY3KSxib29rOmEoImJvb2siLDYwMDY4KSxib29rbWFyazphKCJib29rbWFyayIsNjAwNjkpLGRlYnVnQnJlYWtwb2ludENvbmRpdGlvbmFsVW52ZXJpZmllZDphKCJkZWJ1Zy1icmVha3BvaW50LWNvbmRpdGlvbmFsLXVudmVyaWZpZWQiLDYwMDcwKSxkZWJ1Z0JyZWFrcG9pbnRDb25kaXRpb25hbDphKCJkZWJ1Zy1icmVha3BvaW50LWNvbmRpdGlvbmFsIiw2MDA3MSksZGVidWdCcmVha3BvaW50Q29uZGl0aW9uYWxEaXNhYmxlZDphKCJkZWJ1Zy1icmVha3BvaW50LWNvbmRpdGlvbmFsLWRpc2FibGVkIiw2MDA3MSksZGVidWdCcmVha3BvaW50RGF0YVVudmVyaWZpZWQ6YSgiZGVidWctYnJlYWtwb2ludC1kYXRhLXVudmVyaWZpZWQiLDYwMDcyKSxkZWJ1Z0JyZWFrcG9pbnREYXRhOmEoImRlYnVnLWJyZWFrcG9pbnQtZGF0YSIsNjAwNzMpLGRlYnVnQnJlYWtwb2ludERhdGFEaXNhYmxlZDphKCJkZWJ1Zy1icmVha3BvaW50LWRhdGEtZGlzYWJsZWQiLDYwMDczKSxkZWJ1Z0JyZWFrcG9pbnRMb2dVbnZlcmlmaWVkOmEoImRlYnVnLWJyZWFrcG9pbnQtbG9nLXVudmVyaWZpZWQiLDYwMDc0KSxkZWJ1Z0JyZWFrcG9pbnRMb2c6YSgiZGVidWctYnJlYWtwb2ludC1sb2ciLDYwMDc1KSxkZWJ1Z0JyZWFrcG9pbnRMb2dEaXNhYmxlZDphKCJkZWJ1Zy1icmVha3BvaW50LWxvZy1kaXNhYmxlZCIsNjAwNzUpLGJyaWVmY2FzZTphKCJicmllZmNhc2UiLDYwMDc2KSxicm9hZGNhc3Q6YSgiYnJvYWRjYXN0Iiw2MDA3NyksYnJvd3NlcjphKCJicm93c2VyIiw2MDA3OCksYnVnOmEoImJ1ZyIsNjAwNzkpLGNhbGVuZGFyOmEoImNhbGVuZGFyIiw2MDA4MCksY2FzZVNlbnNpdGl2ZTphKCJjYXNlLXNlbnNpdGl2ZSIsNjAwODEpLGNoZWNrOmEoImNoZWNrIiw2MDA4MiksY2hlY2tsaXN0OmEoImNoZWNrbGlzdCIsNjAwODMpLGNoZXZyb25Eb3duOmEoImNoZXZyb24tZG93biIsNjAwODQpLGNoZXZyb25MZWZ0OmEoImNoZXZyb24tbGVmdCIsNjAwODUpLGNoZXZyb25SaWdodDphKCJjaGV2cm9uLXJpZ2h0Iiw2MDA4NiksY2hldnJvblVwOmEoImNoZXZyb24tdXAiLDYwMDg3KSxjaHJvbWVDbG9zZTphKCJjaHJvbWUtY2xvc2UiLDYwMDg4KSxjaHJvbWVNYXhpbWl6ZTphKCJjaHJvbWUtbWF4aW1pemUiLDYwMDg5KSxjaHJvbWVNaW5pbWl6ZTphKCJjaHJvbWUtbWluaW1pemUiLDYwMDkwKSxjaHJvbWVSZXN0b3JlOmEoImNocm9tZS1yZXN0b3JlIiw2MDA5MSksY2lyY2xlT3V0bGluZTphKCJjaXJjbGUtb3V0bGluZSIsNjAwOTIpLGNpcmNsZTphKCJjaXJjbGUiLDYwMDkyKSxkZWJ1Z0JyZWFrcG9pbnRVbnZlcmlmaWVkOmEoImRlYnVnLWJyZWFrcG9pbnQtdW52ZXJpZmllZCIsNjAwOTIpLHRlcm1pbmFsRGVjb3JhdGlvbkluY29tcGxldGU6YSgidGVybWluYWwtZGVjb3JhdGlvbi1pbmNvbXBsZXRlIiw2MDA5MiksY2lyY2xlU2xhc2g6YSgiY2lyY2xlLXNsYXNoIiw2MDA5MyksY2lyY3VpdEJvYXJkOmEoImNpcmN1aXQtYm9hcmQiLDYwMDk0KSxjbGVhckFsbDphKCJjbGVhci1hbGwiLDYwMDk1KSxjbGlwcHk6YSgiY2xpcHB5Iiw2MDA5NiksY2xvc2VBbGw6YSgiY2xvc2UtYWxsIiw2MDA5NyksY2xvdWREb3dubG9hZDphKCJjbG91ZC1kb3dubG9hZCIsNjAwOTgpLGNsb3VkVXBsb2FkOmEoImNsb3VkLXVwbG9hZCIsNjAwOTkpLGNvZGU6YSgiY29kZSIsNjAxMDApLGNvbGxhcHNlQWxsOmEoImNvbGxhcHNlLWFsbCIsNjAxMDEpLGNvbG9yTW9kZTphKCJjb2xvci1tb2RlIiw2MDEwMiksY29tbWVudERpc2N1c3Npb246YSgiY29tbWVudC1kaXNjdXNzaW9uIiw2MDEwMyksY3JlZGl0Q2FyZDphKCJjcmVkaXQtY2FyZCIsNjAxMDUpLGRhc2g6YSgiZGFzaCIsNjAxMDgpLGRhc2hib2FyZDphKCJkYXNoYm9hcmQiLDYwMTA5KSxkYXRhYmFzZTphKCJkYXRhYmFzZSIsNjAxMTApLGRlYnVnQ29udGludWU6YSgiZGVidWctY29udGludWUiLDYwMTExKSxkZWJ1Z0Rpc2Nvbm5lY3Q6YSgiZGVidWctZGlzY29ubmVjdCIsNjAxMTIpLGRlYnVnUGF1c2U6YSgiZGVidWctcGF1c2UiLDYwMTEzKSxkZWJ1Z1Jlc3RhcnQ6YSgiZGVidWctcmVzdGFydCIsNjAxMTQpLGRlYnVnU3RhcnQ6YSgiZGVidWctc3RhcnQiLDYwMTE1KSxkZWJ1Z1N0ZXBJbnRvOmEoImRlYnVnLXN0ZXAtaW50byIsNjAxMTYpLGRlYnVnU3RlcE91dDphKCJkZWJ1Zy1zdGVwLW91dCIsNjAxMTcpLGRlYnVnU3RlcE92ZXI6YSgiZGVidWctc3RlcC1vdmVyIiw2MDExOCksZGVidWdTdG9wOmEoImRlYnVnLXN0b3AiLDYwMTE5KSxkZWJ1ZzphKCJkZWJ1ZyIsNjAxMjApLGRldmljZUNhbWVyYVZpZGVvOmEoImRldmljZS1jYW1lcmEtdmlkZW8iLDYwMTIxKSxkZXZpY2VDYW1lcmE6YSgiZGV2aWNlLWNhbWVyYSIsNjAxMjIpLGRldmljZU1vYmlsZTphKCJkZXZpY2UtbW9iaWxlIiw2MDEyMyksZGlmZkFkZGVkOmEoImRpZmYtYWRkZWQiLDYwMTI0KSxkaWZmSWdub3JlZDphKCJkaWZmLWlnbm9yZWQiLDYwMTI1KSxkaWZmTW9kaWZpZWQ6YSgiZGlmZi1tb2RpZmllZCIsNjAxMjYpLGRpZmZSZW1vdmVkOmEoImRpZmYtcmVtb3ZlZCIsNjAxMjcpLGRpZmZSZW5hbWVkOmEoImRpZmYtcmVuYW1lZCIsNjAxMjgpLGRpZmY6YSgiZGlmZiIsNjAxMjkpLGRpZmZTaWRlYnlzaWRlOmEoImRpZmYtc2lkZWJ5c2lkZSIsNjAxMjkpLGRpc2NhcmQ6YSgiZGlzY2FyZCIsNjAxMzApLGVkaXRvckxheW91dDphKCJlZGl0b3ItbGF5b3V0Iiw2MDEzMSksZW1wdHlXaW5kb3c6YSgiZW1wdHktd2luZG93Iiw2MDEzMiksZXhjbHVkZTphKCJleGNsdWRlIiw2MDEzMyksZXh0ZW5zaW9uczphKCJleHRlbnNpb25zIiw2MDEzNCksZXllQ2xvc2VkOmEoImV5ZS1jbG9zZWQiLDYwMTM1KSxmaWxlQmluYXJ5OmEoImZpbGUtYmluYXJ5Iiw2MDEzNiksZmlsZUNvZGU6YSgiZmlsZS1jb2RlIiw2MDEzNyksZmlsZU1lZGlhOmEoImZpbGUtbWVkaWEiLDYwMTM4KSxmaWxlUGRmOmEoImZpbGUtcGRmIiw2MDEzOSksZmlsZVN1Ym1vZHVsZTphKCJmaWxlLXN1Ym1vZHVsZSIsNjAxNDApLGZpbGVTeW1saW5rRGlyZWN0b3J5OmEoImZpbGUtc3ltbGluay1kaXJlY3RvcnkiLDYwMTQxKSxmaWxlU3ltbGlua0ZpbGU6YSgiZmlsZS1zeW1saW5rLWZpbGUiLDYwMTQyKSxmaWxlWmlwOmEoImZpbGUtemlwIiw2MDE0MyksZmlsZXM6YSgiZmlsZXMiLDYwMTQ0KSxmaWx0ZXI6YSgiZmlsdGVyIiw2MDE0NSksZmxhbWU6YSgiZmxhbWUiLDYwMTQ2KSxmb2xkRG93bjphKCJmb2xkLWRvd24iLDYwMTQ3KSxmb2xkVXA6YSgiZm9sZC11cCIsNjAxNDgpLGZvbGQ6YSgiZm9sZCIsNjAxNDkpLGZvbGRlckFjdGl2ZTphKCJmb2xkZXItYWN0aXZlIiw2MDE1MCksZm9sZGVyT3BlbmVkOmEoImZvbGRlci1vcGVuZWQiLDYwMTUxKSxnZWFyOmEoImdlYXIiLDYwMTUyKSxnaWZ0OmEoImdpZnQiLDYwMTUzKSxnaXN0U2VjcmV0OmEoImdpc3Qtc2VjcmV0Iiw2MDE1NCksZ2lzdDphKCJnaXN0Iiw2MDE1NSksZ2l0Q29tbWl0OmEoImdpdC1jb21taXQiLDYwMTU2KSxnaXRDb21wYXJlOmEoImdpdC1jb21wYXJlIiw2MDE1NyksY29tcGFyZUNoYW5nZXM6YSgiY29tcGFyZS1jaGFuZ2VzIiw2MDE1NyksZ2l0TWVyZ2U6YSgiZ2l0LW1lcmdlIiw2MDE1OCksZ2l0aHViQWN0aW9uOmEoImdpdGh1Yi1hY3Rpb24iLDYwMTU5KSxnaXRodWJBbHQ6YSgiZ2l0aHViLWFsdCIsNjAxNjApLGdsb2JlOmEoImdsb2JlIiw2MDE2MSksZ3JhYmJlcjphKCJncmFiYmVyIiw2MDE2MiksZ3JhcGg6YSgiZ3JhcGgiLDYwMTYzKSxncmlwcGVyOmEoImdyaXBwZXIiLDYwMTY0KSxoZWFydDphKCJoZWFydCIsNjAxNjUpLGhvbWU6YSgiaG9tZSIsNjAxNjYpLGhvcml6b250YWxSdWxlOmEoImhvcml6b250YWwtcnVsZSIsNjAxNjcpLGh1Ym90OmEoImh1Ym90Iiw2MDE2OCksaW5ib3g6YSgiaW5ib3giLDYwMTY5KSxpc3N1ZVJlb3BlbmVkOmEoImlzc3VlLXJlb3BlbmVkIiw2MDE3MSksaXNzdWVzOmEoImlzc3VlcyIsNjAxNzIpLGl0YWxpYzphKCJpdGFsaWMiLDYwMTczKSxqZXJzZXk6YSgiamVyc2V5Iiw2MDE3NCksanNvbjphKCJqc29uIiw2MDE3NSksa2ViYWJWZXJ0aWNhbDphKCJrZWJhYi12ZXJ0aWNhbCIsNjAxNzYpLGtleTphKCJrZXkiLDYwMTc3KSxsYXc6YSgibGF3Iiw2MDE3OCksbGlnaHRidWxiQXV0b2ZpeDphKCJsaWdodGJ1bGItYXV0b2ZpeCIsNjAxNzkpLGxpbmtFeHRlcm5hbDphKCJsaW5rLWV4dGVybmFsIiw2MDE4MCksbGluazphKCJsaW5rIiw2MDE4MSksbGlzdE9yZGVyZWQ6YSgibGlzdC1vcmRlcmVkIiw2MDE4MiksbGlzdFVub3JkZXJlZDphKCJsaXN0LXVub3JkZXJlZCIsNjAxODMpLGxpdmVTaGFyZTphKCJsaXZlLXNoYXJlIiw2MDE4NCksbG9hZGluZzphKCJsb2FkaW5nIiw2MDE4NSksbG9jYXRpb246YSgibG9jYXRpb24iLDYwMTg2KSxtYWlsUmVhZDphKCJtYWlsLXJlYWQiLDYwMTg3KSxtYWlsOmEoIm1haWwiLDYwMTg4KSxtYXJrZG93bjphKCJtYXJrZG93biIsNjAxODkpLG1lZ2FwaG9uZTphKCJtZWdhcGhvbmUiLDYwMTkwKSxtZW50aW9uOmEoIm1lbnRpb24iLDYwMTkxKSxtaWxlc3RvbmU6YSgibWlsZXN0b25lIiw2MDE5MiksZ2l0UHVsbFJlcXVlc3RNaWxlc3RvbmU6YSgiZ2l0LXB1bGwtcmVxdWVzdC1taWxlc3RvbmUiLDYwMTkyKSxtb3J0YXJCb2FyZDphKCJtb3J0YXItYm9hcmQiLDYwMTkzKSxtb3ZlOmEoIm1vdmUiLDYwMTk0KSxtdWx0aXBsZVdpbmRvd3M6YSgibXVsdGlwbGUtd2luZG93cyIsNjAxOTUpLG11dGU6YSgibXV0ZSIsNjAxOTYpLG5vTmV3bGluZTphKCJuby1uZXdsaW5lIiw2MDE5Nyksbm90ZTphKCJub3RlIiw2MDE5OCksb2N0b2ZhY2U6YSgib2N0b2ZhY2UiLDYwMTk5KSxvcGVuUHJldmlldzphKCJvcGVuLXByZXZpZXciLDYwMjAwKSxwYWNrYWdlOmEoInBhY2thZ2UiLDYwMjAxKSxwYWludGNhbjphKCJwYWludGNhbiIsNjAyMDIpLHBpbjphKCJwaW4iLDYwMjAzKSxwbGF5OmEoInBsYXkiLDYwMjA0KSxydW46YSgicnVuIiw2MDIwNCkscGx1ZzphKCJwbHVnIiw2MDIwNSkscHJlc2VydmVDYXNlOmEoInByZXNlcnZlLWNhc2UiLDYwMjA2KSxwcmV2aWV3OmEoInByZXZpZXciLDYwMjA3KSxwcm9qZWN0OmEoInByb2plY3QiLDYwMjA4KSxwdWxzZTphKCJwdWxzZSIsNjAyMDkpLHF1ZXN0aW9uOmEoInF1ZXN0aW9uIiw2MDIxMCkscXVvdGU6YSgicXVvdGUiLDYwMjExKSxyYWRpb1Rvd2VyOmEoInJhZGlvLXRvd2VyIiw2MDIxMikscmVhY3Rpb25zOmEoInJlYWN0aW9ucyIsNjAyMTMpLHJlZmVyZW5jZXM6YSgicmVmZXJlbmNlcyIsNjAyMTQpLHJlZnJlc2g6YSgicmVmcmVzaCIsNjAyMTUpLHJlZ2V4OmEoInJlZ2V4Iiw2MDIxNikscmVtb3RlRXhwbG9yZXI6YSgicmVtb3RlLWV4cGxvcmVyIiw2MDIxNykscmVtb3RlOmEoInJlbW90ZSIsNjAyMTgpLHJlbW92ZTphKCJyZW1vdmUiLDYwMjE5KSxyZXBsYWNlQWxsOmEoInJlcGxhY2UtYWxsIiw2MDIyMCkscmVwbGFjZTphKCJyZXBsYWNlIiw2MDIyMSkscmVwb0Nsb25lOmEoInJlcG8tY2xvbmUiLDYwMjIyKSxyZXBvRm9yY2VQdXNoOmEoInJlcG8tZm9yY2UtcHVzaCIsNjAyMjMpLHJlcG9QdWxsOmEoInJlcG8tcHVsbCIsNjAyMjQpLHJlcG9QdXNoOmEoInJlcG8tcHVzaCIsNjAyMjUpLHJlcG9ydDphKCJyZXBvcnQiLDYwMjI2KSxyZXF1ZXN0Q2hhbmdlczphKCJyZXF1ZXN0LWNoYW5nZXMiLDYwMjI3KSxyb2NrZXQ6YSgicm9ja2V0Iiw2MDIyOCkscm9vdEZvbGRlck9wZW5lZDphKCJyb290LWZvbGRlci1vcGVuZWQiLDYwMjI5KSxyb290Rm9sZGVyOmEoInJvb3QtZm9sZGVyIiw2MDIzMCkscnNzOmEoInJzcyIsNjAyMzEpLHJ1Ynk6YSgicnVieSIsNjAyMzIpLHNhdmVBbGw6YSgic2F2ZS1hbGwiLDYwMjMzKSxzYXZlQXM6YSgic2F2ZS1hcyIsNjAyMzQpLHNhdmU6YSgic2F2ZSIsNjAyMzUpLHNjcmVlbkZ1bGw6YSgic2NyZWVuLWZ1bGwiLDYwMjM2KSxzY3JlZW5Ob3JtYWw6YSgic2NyZWVuLW5vcm1hbCIsNjAyMzcpLHNlYXJjaFN0b3A6YSgic2VhcmNoLXN0b3AiLDYwMjM4KSxzZXJ2ZXI6YSgic2VydmVyIiw2MDI0MCksc2V0dGluZ3NHZWFyOmEoInNldHRpbmdzLWdlYXIiLDYwMjQxKSxzZXR0aW5nczphKCJzZXR0aW5ncyIsNjAyNDIpLHNoaWVsZDphKCJzaGllbGQiLDYwMjQzKSxzbWlsZXk6YSgic21pbGV5Iiw2MDI0NCksc29ydFByZWNlZGVuY2U6YSgic29ydC1wcmVjZWRlbmNlIiw2MDI0NSksc3BsaXRIb3Jpem9udGFsOmEoInNwbGl0LWhvcml6b250YWwiLDYwMjQ2KSxzcGxpdFZlcnRpY2FsOmEoInNwbGl0LXZlcnRpY2FsIiw2MDI0Nyksc3F1aXJyZWw6YSgic3F1aXJyZWwiLDYwMjQ4KSxzdGFyRnVsbDphKCJzdGFyLWZ1bGwiLDYwMjQ5KSxzdGFySGFsZjphKCJzdGFyLWhhbGYiLDYwMjUwKSxzeW1ib2xDbGFzczphKCJzeW1ib2wtY2xhc3MiLDYwMjUxKSxzeW1ib2xDb2xvcjphKCJzeW1ib2wtY29sb3IiLDYwMjUyKSxzeW1ib2xDb25zdGFudDphKCJzeW1ib2wtY29uc3RhbnQiLDYwMjUzKSxzeW1ib2xFbnVtTWVtYmVyOmEoInN5bWJvbC1lbnVtLW1lbWJlciIsNjAyNTQpLHN5bWJvbEZpZWxkOmEoInN5bWJvbC1maWVsZCIsNjAyNTUpLHN5bWJvbEZpbGU6YSgic3ltYm9sLWZpbGUiLDYwMjU2KSxzeW1ib2xJbnRlcmZhY2U6YSgic3ltYm9sLWludGVyZmFjZSIsNjAyNTcpLHN5bWJvbEtleXdvcmQ6YSgic3ltYm9sLWtleXdvcmQiLDYwMjU4KSxzeW1ib2xNaXNjOmEoInN5bWJvbC1taXNjIiw2MDI1OSksc3ltYm9sT3BlcmF0b3I6YSgic3ltYm9sLW9wZXJhdG9yIiw2MDI2MCksc3ltYm9sUHJvcGVydHk6YSgic3ltYm9sLXByb3BlcnR5Iiw2MDI2MSksd3JlbmNoOmEoIndyZW5jaCIsNjAyNjEpLHdyZW5jaFN1YmFjdGlvbjphKCJ3cmVuY2gtc3ViYWN0aW9uIiw2MDI2MSksc3ltYm9sU25pcHBldDphKCJzeW1ib2wtc25pcHBldCIsNjAyNjIpLHRhc2tsaXN0OmEoInRhc2tsaXN0Iiw2MDI2MyksdGVsZXNjb3BlOmEoInRlbGVzY29wZSIsNjAyNjQpLHRleHRTaXplOmEoInRleHQtc2l6ZSIsNjAyNjUpLHRocmVlQmFyczphKCJ0aHJlZS1iYXJzIiw2MDI2NiksdGh1bWJzZG93bjphKCJ0aHVtYnNkb3duIiw2MDI2NyksdGh1bWJzdXA6YSgidGh1bWJzdXAiLDYwMjY4KSx0b29sczphKCJ0b29scyIsNjAyNjkpLHRyaWFuZ2xlRG93bjphKCJ0cmlhbmdsZS1kb3duIiw2MDI3MCksdHJpYW5nbGVMZWZ0OmEoInRyaWFuZ2xlLWxlZnQiLDYwMjcxKSx0cmlhbmdsZVJpZ2h0OmEoInRyaWFuZ2xlLXJpZ2h0Iiw2MDI3MiksdHJpYW5nbGVVcDphKCJ0cmlhbmdsZS11cCIsNjAyNzMpLHR3aXR0ZXI6YSgidHdpdHRlciIsNjAyNzQpLHVuZm9sZDphKCJ1bmZvbGQiLDYwMjc1KSx1bmxvY2s6YSgidW5sb2NrIiw2MDI3NiksdW5tdXRlOmEoInVubXV0ZSIsNjAyNzcpLHVudmVyaWZpZWQ6YSgidW52ZXJpZmllZCIsNjAyNzgpLHZlcmlmaWVkOmEoInZlcmlmaWVkIiw2MDI3OSksdmVyc2lvbnM6YSgidmVyc2lvbnMiLDYwMjgwKSx2bUFjdGl2ZTphKCJ2bS1hY3RpdmUiLDYwMjgxKSx2bU91dGxpbmU6YSgidm0tb3V0bGluZSIsNjAyODIpLHZtUnVubmluZzphKCJ2bS1ydW5uaW5nIiw2MDI4Myksd2F0Y2g6YSgid2F0Y2giLDYwMjg0KSx3aGl0ZXNwYWNlOmEoIndoaXRlc3BhY2UiLDYwMjg1KSx3aG9sZVdvcmQ6YSgid2hvbGUtd29yZCIsNjAyODYpLHdpbmRvdzphKCJ3aW5kb3ciLDYwMjg3KSx3b3JkV3JhcDphKCJ3b3JkLXdyYXAiLDYwMjg4KSx6b29tSW46YSgiem9vbS1pbiIsNjAyODkpLHpvb21PdXQ6YSgiem9vbS1vdXQiLDYwMjkwKSxsaXN0RmlsdGVyOmEoImxpc3QtZmlsdGVyIiw2MDI5MSksbGlzdEZsYXQ6YSgibGlzdC1mbGF0Iiw2MDI5MiksbGlzdFNlbGVjdGlvbjphKCJsaXN0LXNlbGVjdGlvbiIsNjAyOTMpLHNlbGVjdGlvbjphKCJzZWxlY3Rpb24iLDYwMjkzKSxsaXN0VHJlZTphKCJsaXN0LXRyZWUiLDYwMjk0KSxkZWJ1Z0JyZWFrcG9pbnRGdW5jdGlvblVudmVyaWZpZWQ6YSgiZGVidWctYnJlYWtwb2ludC1mdW5jdGlvbi11bnZlcmlmaWVkIiw2MDI5NSksZGVidWdCcmVha3BvaW50RnVuY3Rpb246YSgiZGVidWctYnJlYWtwb2ludC1mdW5jdGlvbiIsNjAyOTYpLGRlYnVnQnJlYWtwb2ludEZ1bmN0aW9uRGlzYWJsZWQ6YSgiZGVidWctYnJlYWtwb2ludC1mdW5jdGlvbi1kaXNhYmxlZCIsNjAyOTYpLGRlYnVnU3RhY2tmcmFtZUFjdGl2ZTphKCJkZWJ1Zy1zdGFja2ZyYW1lLWFjdGl2ZSIsNjAyOTcpLGNpcmNsZVNtYWxsRmlsbGVkOmEoImNpcmNsZS1zbWFsbC1maWxsZWQiLDYwMjk4KSxkZWJ1Z1N0YWNrZnJhbWVEb3Q6YSgiZGVidWctc3RhY2tmcmFtZS1kb3QiLDYwMjk4KSx0ZXJtaW5hbERlY29yYXRpb25NYXJrOmEoInRlcm1pbmFsLWRlY29yYXRpb24tbWFyayIsNjAyOTgpLGRlYnVnU3RhY2tmcmFtZTphKCJkZWJ1Zy1zdGFja2ZyYW1lIiw2MDI5OSksZGVidWdTdGFja2ZyYW1lRm9jdXNlZDphKCJkZWJ1Zy1zdGFja2ZyYW1lLWZvY3VzZWQiLDYwMjk5KSxkZWJ1Z0JyZWFrcG9pbnRVbnN1cHBvcnRlZDphKCJkZWJ1Zy1icmVha3BvaW50LXVuc3VwcG9ydGVkIiw2MDMwMCksc3ltYm9sU3RyaW5nOmEoInN5bWJvbC1zdHJpbmciLDYwMzAxKSxkZWJ1Z1JldmVyc2VDb250aW51ZTphKCJkZWJ1Zy1yZXZlcnNlLWNvbnRpbnVlIiw2MDMwMiksZGVidWdTdGVwQmFjazphKCJkZWJ1Zy1zdGVwLWJhY2siLDYwMzAzKSxkZWJ1Z1Jlc3RhcnRGcmFtZTphKCJkZWJ1Zy1yZXN0YXJ0LWZyYW1lIiw2MDMwNCksZGVidWdBbHQ6YSgiZGVidWctYWx0Iiw2MDMwNSksY2FsbEluY29taW5nOmEoImNhbGwtaW5jb21pbmciLDYwMzA2KSxjYWxsT3V0Z29pbmc6YSgiY2FsbC1vdXRnb2luZyIsNjAzMDcpLG1lbnU6YSgibWVudSIsNjAzMDgpLGV4cGFuZEFsbDphKCJleHBhbmQtYWxsIiw2MDMwOSksZmVlZGJhY2s6YSgiZmVlZGJhY2siLDYwMzEwKSxnaXRQdWxsUmVxdWVzdFJldmlld2VyOmEoImdpdC1wdWxsLXJlcXVlc3QtcmV2aWV3ZXIiLDYwMzEwKSxncm91cEJ5UmVmVHlwZTphKCJncm91cC1ieS1yZWYtdHlwZSIsNjAzMTEpLHVuZ3JvdXBCeVJlZlR5cGU6YSgidW5ncm91cC1ieS1yZWYtdHlwZSIsNjAzMTIpLGFjY291bnQ6YSgiYWNjb3VudCIsNjAzMTMpLGdpdFB1bGxSZXF1ZXN0QXNzaWduZWU6YSgiZ2l0LXB1bGwtcmVxdWVzdC1hc3NpZ25lZSIsNjAzMTMpLGJlbGxEb3Q6YSgiYmVsbC1kb3QiLDYwMzE0KSxkZWJ1Z0NvbnNvbGU6YSgiZGVidWctY29uc29sZSIsNjAzMTUpLGxpYnJhcnk6YSgibGlicmFyeSIsNjAzMTYpLG91dHB1dDphKCJvdXRwdXQiLDYwMzE3KSxydW5BbGw6YSgicnVuLWFsbCIsNjAzMTgpLHN5bmNJZ25vcmVkOmEoInN5bmMtaWdub3JlZCIsNjAzMTkpLHBpbm5lZDphKCJwaW5uZWQiLDYwMzIwKSxnaXRodWJJbnZlcnRlZDphKCJnaXRodWItaW52ZXJ0ZWQiLDYwMzIxKSxzZXJ2ZXJQcm9jZXNzOmEoInNlcnZlci1wcm9jZXNzIiw2MDMyMiksc2VydmVyRW52aXJvbm1lbnQ6YSgic2VydmVyLWVudmlyb25tZW50Iiw2MDMyMykscGFzczphKCJwYXNzIiw2MDMyNCksaXNzdWVDbG9zZWQ6YSgiaXNzdWUtY2xvc2VkIiw2MDMyNCksc3RvcENpcmNsZTphKCJzdG9wLWNpcmNsZSIsNjAzMjUpLHBsYXlDaXJjbGU6YSgicGxheS1jaXJjbGUiLDYwMzI2KSxyZWNvcmQ6YSgicmVjb3JkIiw2MDMyNyksZGVidWdBbHRTbWFsbDphKCJkZWJ1Zy1hbHQtc21hbGwiLDYwMzI4KSx2bUNvbm5lY3Q6YSgidm0tY29ubmVjdCIsNjAzMjkpLGNsb3VkOmEoImNsb3VkIiw2MDMzMCksbWVyZ2U6YSgibWVyZ2UiLDYwMzMxKSxleHBvcnQ6YSgiZXhwb3J0Iiw2MDMzMiksZ3JhcGhMZWZ0OmEoImdyYXBoLWxlZnQiLDYwMzMzKSxtYWduZXQ6YSgibWFnbmV0Iiw2MDMzNCksbm90ZWJvb2s6YSgibm90ZWJvb2siLDYwMzM1KSxyZWRvOmEoInJlZG8iLDYwMzM2KSxjaGVja0FsbDphKCJjaGVjay1hbGwiLDYwMzM3KSxwaW5uZWREaXJ0eTphKCJwaW5uZWQtZGlydHkiLDYwMzM4KSxwYXNzRmlsbGVkOmEoInBhc3MtZmlsbGVkIiw2MDMzOSksY2lyY2xlTGFyZ2VGaWxsZWQ6YSgiY2lyY2xlLWxhcmdlLWZpbGxlZCIsNjAzNDApLGNpcmNsZUxhcmdlOmEoImNpcmNsZS1sYXJnZSIsNjAzNDEpLGNpcmNsZUxhcmdlT3V0bGluZTphKCJjaXJjbGUtbGFyZ2Utb3V0bGluZSIsNjAzNDEpLGNvbWJpbmU6YSgiY29tYmluZSIsNjAzNDIpLGdhdGhlcjphKCJnYXRoZXIiLDYwMzQyKSx0YWJsZTphKCJ0YWJsZSIsNjAzNDMpLHZhcmlhYmxlR3JvdXA6YSgidmFyaWFibGUtZ3JvdXAiLDYwMzQ0KSx0eXBlSGllcmFyY2h5OmEoInR5cGUtaGllcmFyY2h5Iiw2MDM0NSksdHlwZUhpZXJhcmNoeVN1YjphKCJ0eXBlLWhpZXJhcmNoeS1zdWIiLDYwMzQ2KSx0eXBlSGllcmFyY2h5U3VwZXI6YSgidHlwZS1oaWVyYXJjaHktc3VwZXIiLDYwMzQ3KSxnaXRQdWxsUmVxdWVzdENyZWF0ZTphKCJnaXQtcHVsbC1yZXF1ZXN0LWNyZWF0ZSIsNjAzNDgpLHJ1bkFib3ZlOmEoInJ1bi1hYm92ZSIsNjAzNDkpLHJ1bkJlbG93OmEoInJ1bi1iZWxvdyIsNjAzNTApLG5vdGVib29rVGVtcGxhdGU6YSgibm90ZWJvb2stdGVtcGxhdGUiLDYwMzUxKSxkZWJ1Z1JlcnVuOmEoImRlYnVnLXJlcnVuIiw2MDM1Miksd29ya3NwYWNlVHJ1c3RlZDphKCJ3b3Jrc3BhY2UtdHJ1c3RlZCIsNjAzNTMpLHdvcmtzcGFjZVVudHJ1c3RlZDphKCJ3b3Jrc3BhY2UtdW50cnVzdGVkIiw2MDM1NCksd29ya3NwYWNlVW5rbm93bjphKCJ3b3Jrc3BhY2UtdW5rbm93biIsNjAzNTUpLHRlcm1pbmFsQ21kOmEoInRlcm1pbmFsLWNtZCIsNjAzNTYpLHRlcm1pbmFsRGViaWFuOmEoInRlcm1pbmFsLWRlYmlhbiIsNjAzNTcpLHRlcm1pbmFsTGludXg6YSgidGVybWluYWwtbGludXgiLDYwMzU4KSx0ZXJtaW5hbFBvd2Vyc2hlbGw6YSgidGVybWluYWwtcG93ZXJzaGVsbCIsNjAzNTkpLHRlcm1pbmFsVG11eDphKCJ0ZXJtaW5hbC10bXV4Iiw2MDM2MCksdGVybWluYWxVYnVudHU6YSgidGVybWluYWwtdWJ1bnR1Iiw2MDM2MSksdGVybWluYWxCYXNoOmEoInRlcm1pbmFsLWJhc2giLDYwMzYyKSxhcnJvd1N3YXA6YSgiYXJyb3ctc3dhcCIsNjAzNjMpLGNvcHk6YSgiY29weSIsNjAzNjQpLHBlcnNvbkFkZDphKCJwZXJzb24tYWRkIiw2MDM2NSksZmlsdGVyRmlsbGVkOmEoImZpbHRlci1maWxsZWQiLDYwMzY2KSx3YW5kOmEoIndhbmQiLDYwMzY3KSxkZWJ1Z0xpbmVCeUxpbmU6YSgiZGVidWctbGluZS1ieS1saW5lIiw2MDM2OCksaW5zcGVjdDphKCJpbnNwZWN0Iiw2MDM2OSksbGF5ZXJzOmEoImxheWVycyIsNjAzNzApLGxheWVyc0RvdDphKCJsYXllcnMtZG90Iiw2MDM3MSksbGF5ZXJzQWN0aXZlOmEoImxheWVycy1hY3RpdmUiLDYwMzcyKSxjb21wYXNzOmEoImNvbXBhc3MiLDYwMzczKSxjb21wYXNzRG90OmEoImNvbXBhc3MtZG90Iiw2MDM3NCksY29tcGFzc0FjdGl2ZTphKCJjb21wYXNzLWFjdGl2ZSIsNjAzNzUpLGF6dXJlOmEoImF6dXJlIiw2MDM3NiksaXNzdWVEcmFmdDphKCJpc3N1ZS1kcmFmdCIsNjAzNzcpLGdpdFB1bGxSZXF1ZXN0Q2xvc2VkOmEoImdpdC1wdWxsLXJlcXVlc3QtY2xvc2VkIiw2MDM3OCksZ2l0UHVsbFJlcXVlc3REcmFmdDphKCJnaXQtcHVsbC1yZXF1ZXN0LWRyYWZ0Iiw2MDM3OSksZGVidWdBbGw6YSgiZGVidWctYWxsIiw2MDM4MCksZGVidWdDb3ZlcmFnZTphKCJkZWJ1Zy1jb3ZlcmFnZSIsNjAzODEpLHJ1bkVycm9yczphKCJydW4tZXJyb3JzIiw2MDM4MiksZm9sZGVyTGlicmFyeTphKCJmb2xkZXItbGlicmFyeSIsNjAzODMpLGRlYnVnQ29udGludWVTbWFsbDphKCJkZWJ1Zy1jb250aW51ZS1zbWFsbCIsNjAzODQpLGJlYWtlclN0b3A6YSgiYmVha2VyLXN0b3AiLDYwMzg1KSxncmFwaExpbmU6YSgiZ3JhcGgtbGluZSIsNjAzODYpLGdyYXBoU2NhdHRlcjphKCJncmFwaC1zY2F0dGVyIiw2MDM4NykscGllQ2hhcnQ6YSgicGllLWNoYXJ0Iiw2MDM4OCksYnJhY2tldDphKCJicmFja2V0Iiw2MDE3NSksYnJhY2tldERvdDphKCJicmFja2V0LWRvdCIsNjAzODkpLGJyYWNrZXRFcnJvcjphKCJicmFja2V0LWVycm9yIiw2MDM5MCksbG9ja1NtYWxsOmEoImxvY2stc21hbGwiLDYwMzkxKSxhenVyZURldm9wczphKCJhenVyZS1kZXZvcHMiLDYwMzkyKSx2ZXJpZmllZEZpbGxlZDphKCJ2ZXJpZmllZC1maWxsZWQiLDYwMzkzKSxuZXdsaW5lOmEoIm5ld2xpbmUiLDYwMzk0KSxsYXlvdXQ6YSgibGF5b3V0Iiw2MDM5NSksbGF5b3V0QWN0aXZpdHliYXJMZWZ0OmEoImxheW91dC1hY3Rpdml0eWJhci1sZWZ0Iiw2MDM5NiksbGF5b3V0QWN0aXZpdHliYXJSaWdodDphKCJsYXlvdXQtYWN0aXZpdHliYXItcmlnaHQiLDYwMzk3KSxsYXlvdXRQYW5lbExlZnQ6YSgibGF5b3V0LXBhbmVsLWxlZnQiLDYwMzk4KSxsYXlvdXRQYW5lbENlbnRlcjphKCJsYXlvdXQtcGFuZWwtY2VudGVyIiw2MDM5OSksbGF5b3V0UGFuZWxKdXN0aWZ5OmEoImxheW91dC1wYW5lbC1qdXN0aWZ5Iiw2MDQwMCksbGF5b3V0UGFuZWxSaWdodDphKCJsYXlvdXQtcGFuZWwtcmlnaHQiLDYwNDAxKSxsYXlvdXRQYW5lbDphKCJsYXlvdXQtcGFuZWwiLDYwNDAyKSxsYXlvdXRTaWRlYmFyTGVmdDphKCJsYXlvdXQtc2lkZWJhci1sZWZ0Iiw2MDQwMyksbGF5b3V0U2lkZWJhclJpZ2h0OmEoImxheW91dC1zaWRlYmFyLXJpZ2h0Iiw2MDQwNCksbGF5b3V0U3RhdHVzYmFyOmEoImxheW91dC1zdGF0dXNiYXIiLDYwNDA1KSxsYXlvdXRNZW51YmFyOmEoImxheW91dC1tZW51YmFyIiw2MDQwNiksbGF5b3V0Q2VudGVyZWQ6YSgibGF5b3V0LWNlbnRlcmVkIiw2MDQwNyksdGFyZ2V0OmEoInRhcmdldCIsNjA0MDgpLGluZGVudDphKCJpbmRlbnQiLDYwNDA5KSxyZWNvcmRTbWFsbDphKCJyZWNvcmQtc21hbGwiLDYwNDEwKSxlcnJvclNtYWxsOmEoImVycm9yLXNtYWxsIiw2MDQxMSksdGVybWluYWxEZWNvcmF0aW9uRXJyb3I6YSgidGVybWluYWwtZGVjb3JhdGlvbi1lcnJvciIsNjA0MTEpLGFycm93Q2lyY2xlRG93bjphKCJhcnJvdy1jaXJjbGUtZG93biIsNjA0MTIpLGFycm93Q2lyY2xlTGVmdDphKCJhcnJvdy1jaXJjbGUtbGVmdCIsNjA0MTMpLGFycm93Q2lyY2xlUmlnaHQ6YSgiYXJyb3ctY2lyY2xlLXJpZ2h0Iiw2MDQxNCksYXJyb3dDaXJjbGVVcDphKCJhcnJvdy1jaXJjbGUtdXAiLDYwNDE1KSxsYXlvdXRTaWRlYmFyUmlnaHRPZmY6YSgibGF5b3V0LXNpZGViYXItcmlnaHQtb2ZmIiw2MDQxNiksbGF5b3V0UGFuZWxPZmY6YSgibGF5b3V0LXBhbmVsLW9mZiIsNjA0MTcpLGxheW91dFNpZGViYXJMZWZ0T2ZmOmEoImxheW91dC1zaWRlYmFyLWxlZnQtb2ZmIiw2MDQxOCksYmxhbms6YSgiYmxhbmsiLDYwNDE5KSxoZWFydEZpbGxlZDphKCJoZWFydC1maWxsZWQiLDYwNDIwKSxtYXA6YSgibWFwIiw2MDQyMSksbWFwSG9yaXpvbnRhbDphKCJtYXAtaG9yaXpvbnRhbCIsNjA0MjEpLGZvbGRIb3Jpem9udGFsOmEoImZvbGQtaG9yaXpvbnRhbCIsNjA0MjEpLG1hcEZpbGxlZDphKCJtYXAtZmlsbGVkIiw2MDQyMiksbWFwSG9yaXpvbnRhbEZpbGxlZDphKCJtYXAtaG9yaXpvbnRhbC1maWxsZWQiLDYwNDIyKSxmb2xkSG9yaXpvbnRhbEZpbGxlZDphKCJmb2xkLWhvcml6b250YWwtZmlsbGVkIiw2MDQyMiksY2lyY2xlU21hbGw6YSgiY2lyY2xlLXNtYWxsIiw2MDQyMyksYmVsbFNsYXNoOmEoImJlbGwtc2xhc2giLDYwNDI0KSxiZWxsU2xhc2hEb3Q6YSgiYmVsbC1zbGFzaC1kb3QiLDYwNDI1KSxjb21tZW50VW5yZXNvbHZlZDphKCJjb21tZW50LXVucmVzb2x2ZWQiLDYwNDI2KSxnaXRQdWxsUmVxdWVzdEdvVG9DaGFuZ2VzOmEoImdpdC1wdWxsLXJlcXVlc3QtZ28tdG8tY2hhbmdlcyIsNjA0MjcpLGdpdFB1bGxSZXF1ZXN0TmV3Q2hhbmdlczphKCJnaXQtcHVsbC1yZXF1ZXN0LW5ldy1jaGFuZ2VzIiw2MDQyOCksc2VhcmNoRnV6enk6YSgic2VhcmNoLWZ1enp5Iiw2MDQyOSksY29tbWVudERyYWZ0OmEoImNvbW1lbnQtZHJhZnQiLDYwNDMwKSxzZW5kOmEoInNlbmQiLDYwNDMxKSxzcGFya2xlOmEoInNwYXJrbGUiLDYwNDMyKSxpbnNlcnQ6YSgiaW5zZXJ0Iiw2MDQzMyksbWljOmEoIm1pYyIsNjA0MzQpLHRodW1ic2Rvd25GaWxsZWQ6YSgidGh1bWJzZG93bi1maWxsZWQiLDYwNDM1KSx0aHVtYnN1cEZpbGxlZDphKCJ0aHVtYnN1cC1maWxsZWQiLDYwNDM2KSxjb2ZmZWU6YSgiY29mZmVlIiw2MDQzNyksc25ha2U6YSgic25ha2UiLDYwNDM4KSxnYW1lOmEoImdhbWUiLDYwNDM5KSx2cjphKCJ2ciIsNjA0NDApLGNoaXA6YSgiY2hpcCIsNjA0NDEpLHBpYW5vOmEoInBpYW5vIiw2MDQ0MiksbXVzaWM6YSgibXVzaWMiLDYwNDQzKSxtaWNGaWxsZWQ6YSgibWljLWZpbGxlZCIsNjA0NDQpLHJlcG9GZXRjaDphKCJyZXBvLWZldGNoIiw2MDQ0NSksY29waWxvdDphKCJjb3BpbG90Iiw2MDQ0NiksbGlnaHRidWxiU3BhcmtsZTphKCJsaWdodGJ1bGItc3BhcmtsZSIsNjA0NDcpLHJvYm90OmEoInJvYm90Iiw2MDQ0OCksc3BhcmtsZUZpbGxlZDphKCJzcGFya2xlLWZpbGxlZCIsNjA0NDkpLGRpZmZTaW5nbGU6YSgiZGlmZi1zaW5nbGUiLDYwNDUwKSxkaWZmTXVsdGlwbGU6YSgiZGlmZi1tdWx0aXBsZSIsNjA0NTEpLHN1cnJvdW5kV2l0aDphKCJzdXJyb3VuZC13aXRoIiw2MDQ1Miksc2hhcmU6YSgic2hhcmUiLDYwNDUzKSxnaXRTdGFzaDphKCJnaXQtc3Rhc2giLDYwNDU0KSxnaXRTdGFzaEFwcGx5OmEoImdpdC1zdGFzaC1hcHBseSIsNjA0NTUpLGdpdFN0YXNoUG9wOmEoImdpdC1zdGFzaC1wb3AiLDYwNDU2KSx2c2NvZGU6YSgidnNjb2RlIiw2MDQ1NyksdnNjb2RlSW5zaWRlcnM6YSgidnNjb2RlLWluc2lkZXJzIiw2MDQ1OCksY29kZU9zczphKCJjb2RlLW9zcyIsNjA0NTkpLHJ1bkNvdmVyYWdlOmEoInJ1bi1jb3ZlcmFnZSIsNjA0NjApLHJ1bkFsbENvdmVyYWdlOmEoInJ1bi1hbGwtY292ZXJhZ2UiLDYwNDYxKSxjb3ZlcmFnZTphKCJjb3ZlcmFnZSIsNjA0NjIpLGdpdGh1YlByb2plY3Q6YSgiZ2l0aHViLXByb2plY3QiLDYwNDYzKSxtYXBWZXJ0aWNhbDphKCJtYXAtdmVydGljYWwiLDYwNDY0KSxmb2xkVmVydGljYWw6YSgiZm9sZC12ZXJ0aWNhbCIsNjA0NjQpLG1hcFZlcnRpY2FsRmlsbGVkOmEoIm1hcC12ZXJ0aWNhbC1maWxsZWQiLDYwNDY1KSxmb2xkVmVydGljYWxGaWxsZWQ6YSgiZm9sZC12ZXJ0aWNhbC1maWxsZWQiLDYwNDY1KSxnb1RvU2VhcmNoOmEoImdvLXRvLXNlYXJjaCIsNjA0NjYpLHBlcmNlbnRhZ2U6YSgicGVyY2VudGFnZSIsNjA0NjcpLHNvcnRQZXJjZW50YWdlOmEoInNvcnQtcGVyY2VudGFnZSIsNjA0NjcpLGF0dGFjaDphKCJhdHRhY2giLDYwNDY4KX0sZGE9e2RpYWxvZ0Vycm9yOmEoImRpYWxvZy1lcnJvciIsImVycm9yIiksZGlhbG9nV2FybmluZzphKCJkaWFsb2ctd2FybmluZyIsIndhcm5pbmciKSxkaWFsb2dJbmZvOmEoImRpYWxvZy1pbmZvIiwiaW5mbyIpLGRpYWxvZ0Nsb3NlOmEoImRpYWxvZy1jbG9zZSIsImNsb3NlIiksdHJlZUl0ZW1FeHBhbmRlZDphKCJ0cmVlLWl0ZW0tZXhwYW5kZWQiLCJjaGV2cm9uLWRvd24iKSx0cmVlRmlsdGVyT25UeXBlT246YSgidHJlZS1maWx0ZXItb24tdHlwZS1vbiIsImxpc3QtZmlsdGVyIiksdHJlZUZpbHRlck9uVHlwZU9mZjphKCJ0cmVlLWZpbHRlci1vbi10eXBlLW9mZiIsImxpc3Qtc2VsZWN0aW9uIiksdHJlZUZpbHRlckNsZWFyOmEoInRyZWUtZmlsdGVyLWNsZWFyIiwiY2xvc2UiKSx0cmVlSXRlbUxvYWRpbmc6YSgidHJlZS1pdGVtLWxvYWRpbmciLCJsb2FkaW5nIiksbWVudVNlbGVjdGlvbjphKCJtZW51LXNlbGVjdGlvbiIsImNoZWNrIiksbWVudVN1Ym1lbnU6YSgibWVudS1zdWJtZW51IiwiY2hldnJvbi1yaWdodCIpLG1lbnVCYXJNb3JlOmEoIm1lbnViYXItbW9yZSIsIm1vcmUiKSxzY3JvbGxiYXJCdXR0b25MZWZ0OmEoInNjcm9sbGJhci1idXR0b24tbGVmdCIsInRyaWFuZ2xlLWxlZnQiKSxzY3JvbGxiYXJCdXR0b25SaWdodDphKCJzY3JvbGxiYXItYnV0dG9uLXJpZ2h0IiwidHJpYW5nbGUtcmlnaHQiKSxzY3JvbGxiYXJCdXR0b25VcDphKCJzY3JvbGxiYXItYnV0dG9uLXVwIiwidHJpYW5nbGUtdXAiKSxzY3JvbGxiYXJCdXR0b25Eb3duOmEoInNjcm9sbGJhci1idXR0b24tZG93biIsInRyaWFuZ2xlLWRvd24iKSx0b29sQmFyTW9yZTphKCJ0b29sYmFyLW1vcmUiLCJtb3JlIikscXVpY2tJbnB1dEJhY2s6YSgicXVpY2staW5wdXQtYmFjayIsImFycm93LWxlZnQiKSxkcm9wRG93bkJ1dHRvbjphKCJkcm9wLWRvd24tYnV0dG9uIiw2MDA4NCksc3ltYm9sQ3VzdG9tQ29sb3I6YSgic3ltYm9sLWN1c3RvbWNvbG9yIiw2MDI1MiksZXhwb3J0SWNvbjphKCJleHBvcnQiLDYwMzMyKSx3b3Jrc3BhY2VVbnNwZWNpZmllZDphKCJ3b3Jrc3BhY2UtdW5zcGVjaWZpZWQiLDYwMzU1KSxuZXdMaW5lOmEoIm5ld2xpbmUiLDYwMzk0KSx0aHVtYnNEb3duRmlsbGVkOmEoInRodW1ic2Rvd24tZmlsbGVkIiw2MDQzNSksdGh1bWJzVXBGaWxsZWQ6YSgidGh1bWJzdXAtZmlsbGVkIiw2MDQzNiksZ2l0RmV0Y2g6YSgiZ2l0LWZldGNoIiw2MDQ0NSksbGlnaHRidWxiU3BhcmtsZUF1dG9maXg6YSgibGlnaHRidWxiLXNwYXJrbGUtYXV0b2ZpeCIsNjA0NDcpLGRlYnVnQnJlYWtwb2ludFBlbmRpbmc6YSgiZGVidWctYnJlYWtwb2ludC1wZW5kaW5nIiw2MDM3Nyl9LE09ey4uLmZhLC4uLmRhfTtjbGFzcyBlcntjb25zdHJ1Y3Rvcigpe3RoaXMuX3Rva2VuaXphdGlvblN1cHBvcnRzPW5ldyBNYXAsdGhpcy5fZmFjdG9yaWVzPW5ldyBNYXAsdGhpcy5fb25EaWRDaGFuZ2U9bmV3IG9lLHRoaXMub25EaWRDaGFuZ2U9dGhpcy5fb25EaWRDaGFuZ2UuZXZlbnQsdGhpcy5fY29sb3JNYXA9bnVsbH1oYW5kbGVDaGFuZ2UodCl7dGhpcy5fb25EaWRDaGFuZ2UuZmlyZSh7Y2hhbmdlZExhbmd1YWdlczp0LGNoYW5nZWRDb2xvck1hcDohMX0pfXJlZ2lzdGVyKHQsbil7cmV0dXJuIHRoaXMuX3Rva2VuaXphdGlvblN1cHBvcnRzLnNldCh0LG4pLHRoaXMuaGFuZGxlQ2hhbmdlKFt0XSksZnQoKCk9Pnt0aGlzLl90b2tlbml6YXRpb25TdXBwb3J0cy5nZXQodCk9PT1uJiYodGhpcy5fdG9rZW5pemF0aW9uU3VwcG9ydHMuZGVsZXRlKHQpLHRoaXMuaGFuZGxlQ2hhbmdlKFt0XSkpfSl9Z2V0KHQpe3JldHVybiB0aGlzLl90b2tlbml6YXRpb25TdXBwb3J0cy5nZXQodCl8fG51bGx9cmVnaXN0ZXJGYWN0b3J5KHQsbil7dmFyIHM7KHM9dGhpcy5fZmFjdG9yaWVzLmdldCh0KSk9PW51bGx8fHMuZGlzcG9zZSgpO2NvbnN0IHI9bmV3IG1hKHRoaXMsdCxuKTtyZXR1cm4gdGhpcy5fZmFjdG9yaWVzLnNldCh0LHIpLGZ0KCgpPT57Y29uc3QgaT10aGlzLl9mYWN0b3JpZXMuZ2V0KHQpOyFpfHxpIT09cnx8KHRoaXMuX2ZhY3Rvcmllcy5kZWxldGUodCksaS5kaXNwb3NlKCkpfSl9YXN5bmMgZ2V0T3JDcmVhdGUodCl7Y29uc3Qgbj10aGlzLmdldCh0KTtpZihuKXJldHVybiBuO2NvbnN0IHI9dGhpcy5fZmFjdG9yaWVzLmdldCh0KTtyZXR1cm4hcnx8ci5pc1Jlc29sdmVkP251bGw6KGF3YWl0IHIucmVzb2x2ZSgpLHRoaXMuZ2V0KHQpKX1pc1Jlc29sdmVkKHQpe2lmKHRoaXMuZ2V0KHQpKXJldHVybiEwO2NvbnN0IHI9dGhpcy5fZmFjdG9yaWVzLmdldCh0KTtyZXR1cm4hISghcnx8ci5pc1Jlc29sdmVkKX1zZXRDb2xvck1hcCh0KXt0aGlzLl9jb2xvck1hcD10LHRoaXMuX29uRGlkQ2hhbmdlLmZpcmUoe2NoYW5nZWRMYW5ndWFnZXM6QXJyYXkuZnJvbSh0aGlzLl90b2tlbml6YXRpb25TdXBwb3J0cy5rZXlzKCkpLGNoYW5nZWRDb2xvck1hcDohMH0pfWdldENvbG9yTWFwKCl7cmV0dXJuIHRoaXMuX2NvbG9yTWFwfWdldERlZmF1bHRCYWNrZ3JvdW5kKCl7cmV0dXJuIHRoaXMuX2NvbG9yTWFwJiZ0aGlzLl9jb2xvck1hcC5sZW5ndGg+Mj90aGlzLl9jb2xvck1hcFsyXTpudWxsfX1jbGFzcyBtYSBleHRlbmRzIEZle2dldCBpc1Jlc29sdmVkKCl7cmV0dXJuIHRoaXMuX2lzUmVzb2x2ZWR9Y29uc3RydWN0b3IodCxuLHIpe3N1cGVyKCksdGhpcy5fcmVnaXN0cnk9dCx0aGlzLl9sYW5ndWFnZUlkPW4sdGhpcy5fZmFjdG9yeT1yLHRoaXMuX2lzRGlzcG9zZWQ9ITEsdGhpcy5fcmVzb2x2ZVByb21pc2U9bnVsbCx0aGlzLl9pc1Jlc29sdmVkPSExfWRpc3Bvc2UoKXt0aGlzLl9pc0Rpc3Bvc2VkPSEwLHN1cGVyLmRpc3Bvc2UoKX1hc3luYyByZXNvbHZlKCl7cmV0dXJuIHRoaXMuX3Jlc29sdmVQcm9taXNlfHwodGhpcy5fcmVzb2x2ZVByb21pc2U9dGhpcy5fY3JlYXRlKCkpLHRoaXMuX3Jlc29sdmVQcm9taXNlfWFzeW5jIF9jcmVhdGUoKXtjb25zdCB0PWF3YWl0IHRoaXMuX2ZhY3RvcnkudG9rZW5pemF0aW9uU3VwcG9ydDt0aGlzLl9pc1Jlc29sdmVkPSEwLHQmJiF0aGlzLl9pc0Rpc3Bvc2VkJiZ0aGlzLl9yZWdpc3Rlcih0aGlzLl9yZWdpc3RyeS5yZWdpc3Rlcih0aGlzLl9sYW5ndWFnZUlkLHQpKX19Y2xhc3MgZ2F7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMub2Zmc2V0PXQsdGhpcy50eXBlPW4sdGhpcy5sYW5ndWFnZT1yLHRoaXMuX3Rva2VuQnJhbmQ9dm9pZCAwfXRvU3RyaW5nKCl7cmV0dXJuIigiK3RoaXMub2Zmc2V0KyIsICIrdGhpcy50eXBlKyIpIn19dmFyIHRyOyhmdW5jdGlvbihlKXtlW2UuSW5jcmVhc2U9MF09IkluY3JlYXNlIixlW2UuRGVjcmVhc2U9MV09IkRlY3JlYXNlIn0pKHRyfHwodHI9e30pKTt2YXIgbnI7KGZ1bmN0aW9uKGUpe2NvbnN0IHQ9bmV3IE1hcDt0LnNldCgwLE0uc3ltYm9sTWV0aG9kKSx0LnNldCgxLE0uc3ltYm9sRnVuY3Rpb24pLHQuc2V0KDIsTS5zeW1ib2xDb25zdHJ1Y3RvciksdC5zZXQoMyxNLnN5bWJvbEZpZWxkKSx0LnNldCg0LE0uc3ltYm9sVmFyaWFibGUpLHQuc2V0KDUsTS5zeW1ib2xDbGFzcyksdC5zZXQoNixNLnN5bWJvbFN0cnVjdCksdC5zZXQoNyxNLnN5bWJvbEludGVyZmFjZSksdC5zZXQoOCxNLnN5bWJvbE1vZHVsZSksdC5zZXQoOSxNLnN5bWJvbFByb3BlcnR5KSx0LnNldCgxMCxNLnN5bWJvbEV2ZW50KSx0LnNldCgxMSxNLnN5bWJvbE9wZXJhdG9yKSx0LnNldCgxMixNLnN5bWJvbFVuaXQpLHQuc2V0KDEzLE0uc3ltYm9sVmFsdWUpLHQuc2V0KDE1LE0uc3ltYm9sRW51bSksdC5zZXQoMTQsTS5zeW1ib2xDb25zdGFudCksdC5zZXQoMTUsTS5zeW1ib2xFbnVtKSx0LnNldCgxNixNLnN5bWJvbEVudW1NZW1iZXIpLHQuc2V0KDE3LE0uc3ltYm9sS2V5d29yZCksdC5zZXQoMjcsTS5zeW1ib2xTbmlwcGV0KSx0LnNldCgxOCxNLnN5bWJvbFRleHQpLHQuc2V0KDE5LE0uc3ltYm9sQ29sb3IpLHQuc2V0KDIwLE0uc3ltYm9sRmlsZSksdC5zZXQoMjEsTS5zeW1ib2xSZWZlcmVuY2UpLHQuc2V0KDIyLE0uc3ltYm9sQ3VzdG9tQ29sb3IpLHQuc2V0KDIzLE0uc3ltYm9sRm9sZGVyKSx0LnNldCgyNCxNLnN5bWJvbFR5cGVQYXJhbWV0ZXIpLHQuc2V0KDI1LE0uYWNjb3VudCksdC5zZXQoMjYsTS5pc3N1ZXMpO2Z1bmN0aW9uIG4oaSl7bGV0IG89dC5nZXQoaSk7cmV0dXJuIG98fChjb25zb2xlLmluZm8oIk5vIGNvZGljb24gZm91bmQgZm9yIENvbXBsZXRpb25JdGVtS2luZCAiK2kpLG89TS5zeW1ib2xQcm9wZXJ0eSksb31lLnRvSWNvbj1uO2NvbnN0IHI9bmV3IE1hcDtyLnNldCgibWV0aG9kIiwwKSxyLnNldCgiZnVuY3Rpb24iLDEpLHIuc2V0KCJjb25zdHJ1Y3RvciIsMiksci5zZXQoImZpZWxkIiwzKSxyLnNldCgidmFyaWFibGUiLDQpLHIuc2V0KCJjbGFzcyIsNSksci5zZXQoInN0cnVjdCIsNiksci5zZXQoImludGVyZmFjZSIsNyksci5zZXQoIm1vZHVsZSIsOCksci5zZXQoInByb3BlcnR5Iiw5KSxyLnNldCgiZXZlbnQiLDEwKSxyLnNldCgib3BlcmF0b3IiLDExKSxyLnNldCgidW5pdCIsMTIpLHIuc2V0KCJ2YWx1ZSIsMTMpLHIuc2V0KCJjb25zdGFudCIsMTQpLHIuc2V0KCJlbnVtIiwxNSksci5zZXQoImVudW0tbWVtYmVyIiwxNiksci5zZXQoImVudW1NZW1iZXIiLDE2KSxyLnNldCgia2V5d29yZCIsMTcpLHIuc2V0KCJzbmlwcGV0IiwyNyksci5zZXQoInRleHQiLDE4KSxyLnNldCgiY29sb3IiLDE5KSxyLnNldCgiZmlsZSIsMjApLHIuc2V0KCJyZWZlcmVuY2UiLDIxKSxyLnNldCgiY3VzdG9tY29sb3IiLDIyKSxyLnNldCgiZm9sZGVyIiwyMyksci5zZXQoInR5cGUtcGFyYW1ldGVyIiwyNCksci5zZXQoInR5cGVQYXJhbWV0ZXIiLDI0KSxyLnNldCgiYWNjb3VudCIsMjUpLHIuc2V0KCJpc3N1ZSIsMjYpO2Z1bmN0aW9uIHMoaSxvKXtsZXQgbD1yLmdldChpKTtyZXR1cm4gdHlwZW9mIGw+InUiJiYhbyYmKGw9OSksbH1lLmZyb21TdHJpbmc9c30pKG5yfHwobnI9e30pKTt2YXIgcnI7KGZ1bmN0aW9uKGUpe2VbZS5BdXRvbWF0aWM9MF09IkF1dG9tYXRpYyIsZVtlLkV4cGxpY2l0PTFdPSJFeHBsaWNpdCJ9KShycnx8KHJyPXt9KSk7dmFyIHNyOyhmdW5jdGlvbihlKXtlW2UuQXV0b21hdGljPTBdPSJBdXRvbWF0aWMiLGVbZS5QYXN0ZUFzPTFdPSJQYXN0ZUFzIn0pKHNyfHwoc3I9e30pKTt2YXIgaXI7KGZ1bmN0aW9uKGUpe2VbZS5JbnZva2U9MV09Ikludm9rZSIsZVtlLlRyaWdnZXJDaGFyYWN0ZXI9Ml09IlRyaWdnZXJDaGFyYWN0ZXIiLGVbZS5Db250ZW50Q2hhbmdlPTNdPSJDb250ZW50Q2hhbmdlIn0pKGlyfHwoaXI9e30pKTt2YXIgYXI7KGZ1bmN0aW9uKGUpe2VbZS5UZXh0PTBdPSJUZXh0IixlW2UuUmVhZD0xXT0iUmVhZCIsZVtlLldyaXRlPTJdPSJXcml0ZSJ9KShhcnx8KGFyPXt9KSkseigiQXJyYXkiLCJhcnJheSIpLHooIkJvb2xlYW4iLCJib29sZWFuIikseigiQ2xhc3MiLCJjbGFzcyIpLHooIkNvbnN0YW50IiwiY29uc3RhbnQiKSx6KCJDb25zdHJ1Y3RvciIsImNvbnN0cnVjdG9yIikseigiRW51bSIsImVudW1lcmF0aW9uIikseigiRW51bU1lbWJlciIsImVudW1lcmF0aW9uIG1lbWJlciIpLHooIkV2ZW50IiwiZXZlbnQiKSx6KCJGaWVsZCIsImZpZWxkIikseigiRmlsZSIsImZpbGUiKSx6KCJGdW5jdGlvbiIsImZ1bmN0aW9uIikseigiSW50ZXJmYWNlIiwiaW50ZXJmYWNlIikseigiS2V5Iiwia2V5IikseigiTWV0aG9kIiwibWV0aG9kIikseigiTW9kdWxlIiwibW9kdWxlIikseigiTmFtZXNwYWNlIiwibmFtZXNwYWNlIikseigiTnVsbCIsIm51bGwiKSx6KCJOdW1iZXIiLCJudW1iZXIiKSx6KCJPYmplY3QiLCJvYmplY3QiKSx6KCJPcGVyYXRvciIsIm9wZXJhdG9yIikseigiUGFja2FnZSIsInBhY2thZ2UiKSx6KCJQcm9wZXJ0eSIsInByb3BlcnR5IikseigiU3RyaW5nIiwic3RyaW5nIikseigiU3RydWN0Iiwic3RydWN0IikseigiVHlwZVBhcmFtZXRlciIsInR5cGUgcGFyYW1ldGVyIikseigiVmFyaWFibGUiLCJ2YXJpYWJsZSIpO3ZhciBvcjsoZnVuY3Rpb24oZSl7Y29uc3QgdD1uZXcgTWFwO3Quc2V0KDAsTS5zeW1ib2xGaWxlKSx0LnNldCgxLE0uc3ltYm9sTW9kdWxlKSx0LnNldCgyLE0uc3ltYm9sTmFtZXNwYWNlKSx0LnNldCgzLE0uc3ltYm9sUGFja2FnZSksdC5zZXQoNCxNLnN5bWJvbENsYXNzKSx0LnNldCg1LE0uc3ltYm9sTWV0aG9kKSx0LnNldCg2LE0uc3ltYm9sUHJvcGVydHkpLHQuc2V0KDcsTS5zeW1ib2xGaWVsZCksdC5zZXQoOCxNLnN5bWJvbENvbnN0cnVjdG9yKSx0LnNldCg5LE0uc3ltYm9sRW51bSksdC5zZXQoMTAsTS5zeW1ib2xJbnRlcmZhY2UpLHQuc2V0KDExLE0uc3ltYm9sRnVuY3Rpb24pLHQuc2V0KDEyLE0uc3ltYm9sVmFyaWFibGUpLHQuc2V0KDEzLE0uc3ltYm9sQ29uc3RhbnQpLHQuc2V0KDE0LE0uc3ltYm9sU3RyaW5nKSx0LnNldCgxNSxNLnN5bWJvbE51bWJlciksdC5zZXQoMTYsTS5zeW1ib2xCb29sZWFuKSx0LnNldCgxNyxNLnN5bWJvbEFycmF5KSx0LnNldCgxOCxNLnN5bWJvbE9iamVjdCksdC5zZXQoMTksTS5zeW1ib2xLZXkpLHQuc2V0KDIwLE0uc3ltYm9sTnVsbCksdC5zZXQoMjEsTS5zeW1ib2xFbnVtTWVtYmVyKSx0LnNldCgyMixNLnN5bWJvbFN0cnVjdCksdC5zZXQoMjMsTS5zeW1ib2xFdmVudCksdC5zZXQoMjQsTS5zeW1ib2xPcGVyYXRvciksdC5zZXQoMjUsTS5zeW1ib2xUeXBlUGFyYW1ldGVyKTtmdW5jdGlvbiBuKHIpe2xldCBzPXQuZ2V0KHIpO3JldHVybiBzfHwoY29uc29sZS5pbmZvKCJObyBjb2RpY29uIGZvdW5kIGZvciBTeW1ib2xLaW5kICIrcikscz1NLnN5bWJvbFByb3BlcnR5KSxzfWUudG9JY29uPW59KShvcnx8KG9yPXt9KSk7Y29uc3QgY2U9Y2xhc3MgY2V7c3RhdGljIGZyb21WYWx1ZSh0KXtzd2l0Y2godCl7Y2FzZSJjb21tZW50IjpyZXR1cm4gY2UuQ29tbWVudDtjYXNlImltcG9ydHMiOnJldHVybiBjZS5JbXBvcnRzO2Nhc2UicmVnaW9uIjpyZXR1cm4gY2UuUmVnaW9ufXJldHVybiBuZXcgY2UodCl9Y29uc3RydWN0b3IodCl7dGhpcy52YWx1ZT10fX07Y2UuQ29tbWVudD1uZXcgY2UoImNvbW1lbnQiKSxjZS5JbXBvcnRzPW5ldyBjZSgiaW1wb3J0cyIpLGNlLlJlZ2lvbj1uZXcgY2UoInJlZ2lvbiIpO2xldCBscj1jZTt2YXIgdXI7KGZ1bmN0aW9uKGUpe2VbZS5BSUdlbmVyYXRlZD0xXT0iQUlHZW5lcmF0ZWQifSkodXJ8fCh1cj17fSkpO3ZhciBjcjsoZnVuY3Rpb24oZSl7ZVtlLkludm9rZT0wXT0iSW52b2tlIixlW2UuQXV0b21hdGljPTFdPSJBdXRvbWF0aWMifSkoY3J8fChjcj17fSkpO3ZhciBocjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtyZXR1cm4hbnx8dHlwZW9mIG4hPSJvYmplY3QiPyExOnR5cGVvZiBuLmlkPT0ic3RyaW5nIiYmdHlwZW9mIG4udGl0bGU9PSJzdHJpbmcifWUuaXM9dH0pKGhyfHwoaHI9e30pKTt2YXIgZnI7KGZ1bmN0aW9uKGUpe2VbZS5UeXBlPTFdPSJUeXBlIixlW2UuUGFyYW1ldGVyPTJdPSJQYXJhbWV0ZXIifSkoZnJ8fChmcj17fSkpLG5ldyBlcixuZXcgZXI7dmFyIGRyOyhmdW5jdGlvbihlKXtlW2UuSW52b2tlPTBdPSJJbnZva2UiLGVbZS5BdXRvbWF0aWM9MV09IkF1dG9tYXRpYyJ9KShkcnx8KGRyPXt9KSk7dmFyIG1yOyhmdW5jdGlvbihlKXtlW2UuVW5rbm93bj0wXT0iVW5rbm93biIsZVtlLkRpc2FibGVkPTFdPSJEaXNhYmxlZCIsZVtlLkVuYWJsZWQ9Ml09IkVuYWJsZWQifSkobXJ8fChtcj17fSkpO3ZhciBncjsoZnVuY3Rpb24oZSl7ZVtlLkludm9rZT0xXT0iSW52b2tlIixlW2UuQXV0bz0yXT0iQXV0byJ9KShncnx8KGdyPXt9KSk7dmFyIGJyOyhmdW5jdGlvbihlKXtlW2UuTm9uZT0wXT0iTm9uZSIsZVtlLktlZXBXaGl0ZXNwYWNlPTFdPSJLZWVwV2hpdGVzcGFjZSIsZVtlLkluc2VydEFzU25pcHBldD00XT0iSW5zZXJ0QXNTbmlwcGV0In0pKGJyfHwoYnI9e30pKTt2YXIgeHI7KGZ1bmN0aW9uKGUpe2VbZS5NZXRob2Q9MF09Ik1ldGhvZCIsZVtlLkZ1bmN0aW9uPTFdPSJGdW5jdGlvbiIsZVtlLkNvbnN0cnVjdG9yPTJdPSJDb25zdHJ1Y3RvciIsZVtlLkZpZWxkPTNdPSJGaWVsZCIsZVtlLlZhcmlhYmxlPTRdPSJWYXJpYWJsZSIsZVtlLkNsYXNzPTVdPSJDbGFzcyIsZVtlLlN0cnVjdD02XT0iU3RydWN0IixlW2UuSW50ZXJmYWNlPTddPSJJbnRlcmZhY2UiLGVbZS5Nb2R1bGU9OF09Ik1vZHVsZSIsZVtlLlByb3BlcnR5PTldPSJQcm9wZXJ0eSIsZVtlLkV2ZW50PTEwXT0iRXZlbnQiLGVbZS5PcGVyYXRvcj0xMV09Ik9wZXJhdG9yIixlW2UuVW5pdD0xMl09IlVuaXQiLGVbZS5WYWx1ZT0xM109IlZhbHVlIixlW2UuQ29uc3RhbnQ9MTRdPSJDb25zdGFudCIsZVtlLkVudW09MTVdPSJFbnVtIixlW2UuRW51bU1lbWJlcj0xNl09IkVudW1NZW1iZXIiLGVbZS5LZXl3b3JkPTE3XT0iS2V5d29yZCIsZVtlLlRleHQ9MThdPSJUZXh0IixlW2UuQ29sb3I9MTldPSJDb2xvciIsZVtlLkZpbGU9MjBdPSJGaWxlIixlW2UuUmVmZXJlbmNlPTIxXT0iUmVmZXJlbmNlIixlW2UuQ3VzdG9tY29sb3I9MjJdPSJDdXN0b21jb2xvciIsZVtlLkZvbGRlcj0yM109IkZvbGRlciIsZVtlLlR5cGVQYXJhbWV0ZXI9MjRdPSJUeXBlUGFyYW1ldGVyIixlW2UuVXNlcj0yNV09IlVzZXIiLGVbZS5Jc3N1ZT0yNl09Iklzc3VlIixlW2UuU25pcHBldD0yN109IlNuaXBwZXQifSkoeHJ8fCh4cj17fSkpO3ZhciBwcjsoZnVuY3Rpb24oZSl7ZVtlLkRlcHJlY2F0ZWQ9MV09IkRlcHJlY2F0ZWQifSkocHJ8fChwcj17fSkpO3ZhciBfcjsoZnVuY3Rpb24oZSl7ZVtlLkludm9rZT0wXT0iSW52b2tlIixlW2UuVHJpZ2dlckNoYXJhY3Rlcj0xXT0iVHJpZ2dlckNoYXJhY3RlciIsZVtlLlRyaWdnZXJGb3JJbmNvbXBsZXRlQ29tcGxldGlvbnM9Ml09IlRyaWdnZXJGb3JJbmNvbXBsZXRlQ29tcGxldGlvbnMifSkoX3J8fChfcj17fSkpO3ZhciB3cjsoZnVuY3Rpb24oZSl7ZVtlLkVYQUNUPTBdPSJFWEFDVCIsZVtlLkFCT1ZFPTFdPSJBQk9WRSIsZVtlLkJFTE9XPTJdPSJCRUxPVyJ9KSh3cnx8KHdyPXt9KSk7dmFyIExyOyhmdW5jdGlvbihlKXtlW2UuTm90U2V0PTBdPSJOb3RTZXQiLGVbZS5Db250ZW50Rmx1c2g9MV09IkNvbnRlbnRGbHVzaCIsZVtlLlJlY292ZXJGcm9tTWFya2Vycz0yXT0iUmVjb3ZlckZyb21NYXJrZXJzIixlW2UuRXhwbGljaXQ9M109IkV4cGxpY2l0IixlW2UuUGFzdGU9NF09IlBhc3RlIixlW2UuVW5kbz01XT0iVW5kbyIsZVtlLlJlZG89Nl09IlJlZG8ifSkoTHJ8fChMcj17fSkpO3ZhciB2cjsoZnVuY3Rpb24oZSl7ZVtlLkxGPTFdPSJMRiIsZVtlLkNSTEY9Ml09IkNSTEYifSkodnJ8fCh2cj17fSkpO3ZhciBOcjsoZnVuY3Rpb24oZSl7ZVtlLlRleHQ9MF09IlRleHQiLGVbZS5SZWFkPTFdPSJSZWFkIixlW2UuV3JpdGU9Ml09IldyaXRlIn0pKE5yfHwoTnI9e30pKTt2YXIgU3I7KGZ1bmN0aW9uKGUpe2VbZS5Ob25lPTBdPSJOb25lIixlW2UuS2VlcD0xXT0iS2VlcCIsZVtlLkJyYWNrZXRzPTJdPSJCcmFja2V0cyIsZVtlLkFkdmFuY2VkPTNdPSJBZHZhbmNlZCIsZVtlLkZ1bGw9NF09IkZ1bGwifSkoU3J8fChTcj17fSkpO3ZhciBDcjsoZnVuY3Rpb24oZSl7ZVtlLmFjY2VwdFN1Z2dlc3Rpb25PbkNvbW1pdENoYXJhY3Rlcj0wXT0iYWNjZXB0U3VnZ2VzdGlvbk9uQ29tbWl0Q2hhcmFjdGVyIixlW2UuYWNjZXB0U3VnZ2VzdGlvbk9uRW50ZXI9MV09ImFjY2VwdFN1Z2dlc3Rpb25PbkVudGVyIixlW2UuYWNjZXNzaWJpbGl0eVN1cHBvcnQ9Ml09ImFjY2Vzc2liaWxpdHlTdXBwb3J0IixlW2UuYWNjZXNzaWJpbGl0eVBhZ2VTaXplPTNdPSJhY2Nlc3NpYmlsaXR5UGFnZVNpemUiLGVbZS5hcmlhTGFiZWw9NF09ImFyaWFMYWJlbCIsZVtlLmFyaWFSZXF1aXJlZD01XT0iYXJpYVJlcXVpcmVkIixlW2UuYXV0b0Nsb3NpbmdCcmFja2V0cz02XT0iYXV0b0Nsb3NpbmdCcmFja2V0cyIsZVtlLmF1dG9DbG9zaW5nQ29tbWVudHM9N109ImF1dG9DbG9zaW5nQ29tbWVudHMiLGVbZS5zY3JlZW5SZWFkZXJBbm5vdW5jZUlubGluZVN1Z2dlc3Rpb249OF09InNjcmVlblJlYWRlckFubm91bmNlSW5saW5lU3VnZ2VzdGlvbiIsZVtlLmF1dG9DbG9zaW5nRGVsZXRlPTldPSJhdXRvQ2xvc2luZ0RlbGV0ZSIsZVtlLmF1dG9DbG9zaW5nT3ZlcnR5cGU9MTBdPSJhdXRvQ2xvc2luZ092ZXJ0eXBlIixlW2UuYXV0b0Nsb3NpbmdRdW90ZXM9MTFdPSJhdXRvQ2xvc2luZ1F1b3RlcyIsZVtlLmF1dG9JbmRlbnQ9MTJdPSJhdXRvSW5kZW50IixlW2UuYXV0b21hdGljTGF5b3V0PTEzXT0iYXV0b21hdGljTGF5b3V0IixlW2UuYXV0b1N1cnJvdW5kPTE0XT0iYXV0b1N1cnJvdW5kIixlW2UuYnJhY2tldFBhaXJDb2xvcml6YXRpb249MTVdPSJicmFja2V0UGFpckNvbG9yaXphdGlvbiIsZVtlLmd1aWRlcz0xNl09Imd1aWRlcyIsZVtlLmNvZGVMZW5zPTE3XT0iY29kZUxlbnMiLGVbZS5jb2RlTGVuc0ZvbnRGYW1pbHk9MThdPSJjb2RlTGVuc0ZvbnRGYW1pbHkiLGVbZS5jb2RlTGVuc0ZvbnRTaXplPTE5XT0iY29kZUxlbnNGb250U2l6ZSIsZVtlLmNvbG9yRGVjb3JhdG9ycz0yMF09ImNvbG9yRGVjb3JhdG9ycyIsZVtlLmNvbG9yRGVjb3JhdG9yc0xpbWl0PTIxXT0iY29sb3JEZWNvcmF0b3JzTGltaXQiLGVbZS5jb2x1bW5TZWxlY3Rpb249MjJdPSJjb2x1bW5TZWxlY3Rpb24iLGVbZS5jb21tZW50cz0yM109ImNvbW1lbnRzIixlW2UuY29udGV4dG1lbnU9MjRdPSJjb250ZXh0bWVudSIsZVtlLmNvcHlXaXRoU3ludGF4SGlnaGxpZ2h0aW5nPTI1XT0iY29weVdpdGhTeW50YXhIaWdobGlnaHRpbmciLGVbZS5jdXJzb3JCbGlua2luZz0yNl09ImN1cnNvckJsaW5raW5nIixlW2UuY3Vyc29yU21vb3RoQ2FyZXRBbmltYXRpb249MjddPSJjdXJzb3JTbW9vdGhDYXJldEFuaW1hdGlvbiIsZVtlLmN1cnNvclN0eWxlPTI4XT0iY3Vyc29yU3R5bGUiLGVbZS5jdXJzb3JTdXJyb3VuZGluZ0xpbmVzPTI5XT0iY3Vyc29yU3Vycm91bmRpbmdMaW5lcyIsZVtlLmN1cnNvclN1cnJvdW5kaW5nTGluZXNTdHlsZT0zMF09ImN1cnNvclN1cnJvdW5kaW5nTGluZXNTdHlsZSIsZVtlLmN1cnNvcldpZHRoPTMxXT0iY3Vyc29yV2lkdGgiLGVbZS5kaXNhYmxlTGF5ZXJIaW50aW5nPTMyXT0iZGlzYWJsZUxheWVySGludGluZyIsZVtlLmRpc2FibGVNb25vc3BhY2VPcHRpbWl6YXRpb25zPTMzXT0iZGlzYWJsZU1vbm9zcGFjZU9wdGltaXphdGlvbnMiLGVbZS5kb21SZWFkT25seT0zNF09ImRvbVJlYWRPbmx5IixlW2UuZHJhZ0FuZERyb3A9MzVdPSJkcmFnQW5kRHJvcCIsZVtlLmRyb3BJbnRvRWRpdG9yPTM2XT0iZHJvcEludG9FZGl0b3IiLGVbZS5lbXB0eVNlbGVjdGlvbkNsaXBib2FyZD0zN109ImVtcHR5U2VsZWN0aW9uQ2xpcGJvYXJkIixlW2UuZXhwZXJpbWVudGFsV2hpdGVzcGFjZVJlbmRlcmluZz0zOF09ImV4cGVyaW1lbnRhbFdoaXRlc3BhY2VSZW5kZXJpbmciLGVbZS5leHRyYUVkaXRvckNsYXNzTmFtZT0zOV09ImV4dHJhRWRpdG9yQ2xhc3NOYW1lIixlW2UuZmFzdFNjcm9sbFNlbnNpdGl2aXR5PTQwXT0iZmFzdFNjcm9sbFNlbnNpdGl2aXR5IixlW2UuZmluZD00MV09ImZpbmQiLGVbZS5maXhlZE92ZXJmbG93V2lkZ2V0cz00Ml09ImZpeGVkT3ZlcmZsb3dXaWRnZXRzIixlW2UuZm9sZGluZz00M109ImZvbGRpbmciLGVbZS5mb2xkaW5nU3RyYXRlZ3k9NDRdPSJmb2xkaW5nU3RyYXRlZ3kiLGVbZS5mb2xkaW5nSGlnaGxpZ2h0PTQ1XT0iZm9sZGluZ0hpZ2hsaWdodCIsZVtlLmZvbGRpbmdJbXBvcnRzQnlEZWZhdWx0PTQ2XT0iZm9sZGluZ0ltcG9ydHNCeURlZmF1bHQiLGVbZS5mb2xkaW5nTWF4aW11bVJlZ2lvbnM9NDddPSJmb2xkaW5nTWF4aW11bVJlZ2lvbnMiLGVbZS51bmZvbGRPbkNsaWNrQWZ0ZXJFbmRPZkxpbmU9NDhdPSJ1bmZvbGRPbkNsaWNrQWZ0ZXJFbmRPZkxpbmUiLGVbZS5mb250RmFtaWx5PTQ5XT0iZm9udEZhbWlseSIsZVtlLmZvbnRJbmZvPTUwXT0iZm9udEluZm8iLGVbZS5mb250TGlnYXR1cmVzPTUxXT0iZm9udExpZ2F0dXJlcyIsZVtlLmZvbnRTaXplPTUyXT0iZm9udFNpemUiLGVbZS5mb250V2VpZ2h0PTUzXT0iZm9udFdlaWdodCIsZVtlLmZvbnRWYXJpYXRpb25zPTU0XT0iZm9udFZhcmlhdGlvbnMiLGVbZS5mb3JtYXRPblBhc3RlPTU1XT0iZm9ybWF0T25QYXN0ZSIsZVtlLmZvcm1hdE9uVHlwZT01Nl09ImZvcm1hdE9uVHlwZSIsZVtlLmdseXBoTWFyZ2luPTU3XT0iZ2x5cGhNYXJnaW4iLGVbZS5nb3RvTG9jYXRpb249NThdPSJnb3RvTG9jYXRpb24iLGVbZS5oaWRlQ3Vyc29ySW5PdmVydmlld1J1bGVyPTU5XT0iaGlkZUN1cnNvckluT3ZlcnZpZXdSdWxlciIsZVtlLmhvdmVyPTYwXT0iaG92ZXIiLGVbZS5pbkRpZmZFZGl0b3I9NjFdPSJpbkRpZmZFZGl0b3IiLGVbZS5pbmxpbmVTdWdnZXN0PTYyXT0iaW5saW5lU3VnZ2VzdCIsZVtlLmlubGluZUVkaXQ9NjNdPSJpbmxpbmVFZGl0IixlW2UubGV0dGVyU3BhY2luZz02NF09ImxldHRlclNwYWNpbmciLGVbZS5saWdodGJ1bGI9NjVdPSJsaWdodGJ1bGIiLGVbZS5saW5lRGVjb3JhdGlvbnNXaWR0aD02Nl09ImxpbmVEZWNvcmF0aW9uc1dpZHRoIixlW2UubGluZUhlaWdodD02N109ImxpbmVIZWlnaHQiLGVbZS5saW5lTnVtYmVycz02OF09ImxpbmVOdW1iZXJzIixlW2UubGluZU51bWJlcnNNaW5DaGFycz02OV09ImxpbmVOdW1iZXJzTWluQ2hhcnMiLGVbZS5saW5rZWRFZGl0aW5nPTcwXT0ibGlua2VkRWRpdGluZyIsZVtlLmxpbmtzPTcxXT0ibGlua3MiLGVbZS5tYXRjaEJyYWNrZXRzPTcyXT0ibWF0Y2hCcmFja2V0cyIsZVtlLm1pbmltYXA9NzNdPSJtaW5pbWFwIixlW2UubW91c2VTdHlsZT03NF09Im1vdXNlU3R5bGUiLGVbZS5tb3VzZVdoZWVsU2Nyb2xsU2Vuc2l0aXZpdHk9NzVdPSJtb3VzZVdoZWVsU2Nyb2xsU2Vuc2l0aXZpdHkiLGVbZS5tb3VzZVdoZWVsWm9vbT03Nl09Im1vdXNlV2hlZWxab29tIixlW2UubXVsdGlDdXJzb3JNZXJnZU92ZXJsYXBwaW5nPTc3XT0ibXVsdGlDdXJzb3JNZXJnZU92ZXJsYXBwaW5nIixlW2UubXVsdGlDdXJzb3JNb2RpZmllcj03OF09Im11bHRpQ3Vyc29yTW9kaWZpZXIiLGVbZS5tdWx0aUN1cnNvclBhc3RlPTc5XT0ibXVsdGlDdXJzb3JQYXN0ZSIsZVtlLm11bHRpQ3Vyc29yTGltaXQ9ODBdPSJtdWx0aUN1cnNvckxpbWl0IixlW2Uub2NjdXJyZW5jZXNIaWdobGlnaHQ9ODFdPSJvY2N1cnJlbmNlc0hpZ2hsaWdodCIsZVtlLm92ZXJ2aWV3UnVsZXJCb3JkZXI9ODJdPSJvdmVydmlld1J1bGVyQm9yZGVyIixlW2Uub3ZlcnZpZXdSdWxlckxhbmVzPTgzXT0ib3ZlcnZpZXdSdWxlckxhbmVzIixlW2UucGFkZGluZz04NF09InBhZGRpbmciLGVbZS5wYXN0ZUFzPTg1XT0icGFzdGVBcyIsZVtlLnBhcmFtZXRlckhpbnRzPTg2XT0icGFyYW1ldGVySGludHMiLGVbZS5wZWVrV2lkZ2V0RGVmYXVsdEZvY3VzPTg3XT0icGVla1dpZGdldERlZmF1bHRGb2N1cyIsZVtlLnBsYWNlaG9sZGVyPTg4XT0icGxhY2Vob2xkZXIiLGVbZS5kZWZpbml0aW9uTGlua09wZW5zSW5QZWVrPTg5XT0iZGVmaW5pdGlvbkxpbmtPcGVuc0luUGVlayIsZVtlLnF1aWNrU3VnZ2VzdGlvbnM9OTBdPSJxdWlja1N1Z2dlc3Rpb25zIixlW2UucXVpY2tTdWdnZXN0aW9uc0RlbGF5PTkxXT0icXVpY2tTdWdnZXN0aW9uc0RlbGF5IixlW2UucmVhZE9ubHk9OTJdPSJyZWFkT25seSIsZVtlLnJlYWRPbmx5TWVzc2FnZT05M109InJlYWRPbmx5TWVzc2FnZSIsZVtlLnJlbmFtZU9uVHlwZT05NF09InJlbmFtZU9uVHlwZSIsZVtlLnJlbmRlckNvbnRyb2xDaGFyYWN0ZXJzPTk1XT0icmVuZGVyQ29udHJvbENoYXJhY3RlcnMiLGVbZS5yZW5kZXJGaW5hbE5ld2xpbmU9OTZdPSJyZW5kZXJGaW5hbE5ld2xpbmUiLGVbZS5yZW5kZXJMaW5lSGlnaGxpZ2h0PTk3XT0icmVuZGVyTGluZUhpZ2hsaWdodCIsZVtlLnJlbmRlckxpbmVIaWdobGlnaHRPbmx5V2hlbkZvY3VzPTk4XT0icmVuZGVyTGluZUhpZ2hsaWdodE9ubHlXaGVuRm9jdXMiLGVbZS5yZW5kZXJWYWxpZGF0aW9uRGVjb3JhdGlvbnM9OTldPSJyZW5kZXJWYWxpZGF0aW9uRGVjb3JhdGlvbnMiLGVbZS5yZW5kZXJXaGl0ZXNwYWNlPTEwMF09InJlbmRlcldoaXRlc3BhY2UiLGVbZS5yZXZlYWxIb3Jpem9udGFsUmlnaHRQYWRkaW5nPTEwMV09InJldmVhbEhvcml6b250YWxSaWdodFBhZGRpbmciLGVbZS5yb3VuZGVkU2VsZWN0aW9uPTEwMl09InJvdW5kZWRTZWxlY3Rpb24iLGVbZS5ydWxlcnM9MTAzXT0icnVsZXJzIixlW2Uuc2Nyb2xsYmFyPTEwNF09InNjcm9sbGJhciIsZVtlLnNjcm9sbEJleW9uZExhc3RDb2x1bW49MTA1XT0ic2Nyb2xsQmV5b25kTGFzdENvbHVtbiIsZVtlLnNjcm9sbEJleW9uZExhc3RMaW5lPTEwNl09InNjcm9sbEJleW9uZExhc3RMaW5lIixlW2Uuc2Nyb2xsUHJlZG9taW5hbnRBeGlzPTEwN109InNjcm9sbFByZWRvbWluYW50QXhpcyIsZVtlLnNlbGVjdGlvbkNsaXBib2FyZD0xMDhdPSJzZWxlY3Rpb25DbGlwYm9hcmQiLGVbZS5zZWxlY3Rpb25IaWdobGlnaHQ9MTA5XT0ic2VsZWN0aW9uSGlnaGxpZ2h0IixlW2Uuc2VsZWN0T25MaW5lTnVtYmVycz0xMTBdPSJzZWxlY3RPbkxpbmVOdW1iZXJzIixlW2Uuc2hvd0ZvbGRpbmdDb250cm9scz0xMTFdPSJzaG93Rm9sZGluZ0NvbnRyb2xzIixlW2Uuc2hvd1VudXNlZD0xMTJdPSJzaG93VW51c2VkIixlW2Uuc25pcHBldFN1Z2dlc3Rpb25zPTExM109InNuaXBwZXRTdWdnZXN0aW9ucyIsZVtlLnNtYXJ0U2VsZWN0PTExNF09InNtYXJ0U2VsZWN0IixlW2Uuc21vb3RoU2Nyb2xsaW5nPTExNV09InNtb290aFNjcm9sbGluZyIsZVtlLnN0aWNreVNjcm9sbD0xMTZdPSJzdGlja3lTY3JvbGwiLGVbZS5zdGlja3lUYWJTdG9wcz0xMTddPSJzdGlja3lUYWJTdG9wcyIsZVtlLnN0b3BSZW5kZXJpbmdMaW5lQWZ0ZXI9MTE4XT0ic3RvcFJlbmRlcmluZ0xpbmVBZnRlciIsZVtlLnN1Z2dlc3Q9MTE5XT0ic3VnZ2VzdCIsZVtlLnN1Z2dlc3RGb250U2l6ZT0xMjBdPSJzdWdnZXN0Rm9udFNpemUiLGVbZS5zdWdnZXN0TGluZUhlaWdodD0xMjFdPSJzdWdnZXN0TGluZUhlaWdodCIsZVtlLnN1Z2dlc3RPblRyaWdnZXJDaGFyYWN0ZXJzPTEyMl09InN1Z2dlc3RPblRyaWdnZXJDaGFyYWN0ZXJzIixlW2Uuc3VnZ2VzdFNlbGVjdGlvbj0xMjNdPSJzdWdnZXN0U2VsZWN0aW9uIixlW2UudGFiQ29tcGxldGlvbj0xMjRdPSJ0YWJDb21wbGV0aW9uIixlW2UudGFiSW5kZXg9MTI1XT0idGFiSW5kZXgiLGVbZS51bmljb2RlSGlnaGxpZ2h0aW5nPTEyNl09InVuaWNvZGVIaWdobGlnaHRpbmciLGVbZS51bnVzdWFsTGluZVRlcm1pbmF0b3JzPTEyN109InVudXN1YWxMaW5lVGVybWluYXRvcnMiLGVbZS51c2VTaGFkb3dET009MTI4XT0idXNlU2hhZG93RE9NIixlW2UudXNlVGFiU3RvcHM9MTI5XT0idXNlVGFiU3RvcHMiLGVbZS53b3JkQnJlYWs9MTMwXT0id29yZEJyZWFrIixlW2Uud29yZFNlZ21lbnRlckxvY2FsZXM9MTMxXT0id29yZFNlZ21lbnRlckxvY2FsZXMiLGVbZS53b3JkU2VwYXJhdG9ycz0xMzJdPSJ3b3JkU2VwYXJhdG9ycyIsZVtlLndvcmRXcmFwPTEzM109IndvcmRXcmFwIixlW2Uud29yZFdyYXBCcmVha0FmdGVyQ2hhcmFjdGVycz0xMzRdPSJ3b3JkV3JhcEJyZWFrQWZ0ZXJDaGFyYWN0ZXJzIixlW2Uud29yZFdyYXBCcmVha0JlZm9yZUNoYXJhY3RlcnM9MTM1XT0id29yZFdyYXBCcmVha0JlZm9yZUNoYXJhY3RlcnMiLGVbZS53b3JkV3JhcENvbHVtbj0xMzZdPSJ3b3JkV3JhcENvbHVtbiIsZVtlLndvcmRXcmFwT3ZlcnJpZGUxPTEzN109IndvcmRXcmFwT3ZlcnJpZGUxIixlW2Uud29yZFdyYXBPdmVycmlkZTI9MTM4XT0id29yZFdyYXBPdmVycmlkZTIiLGVbZS53cmFwcGluZ0luZGVudD0xMzldPSJ3cmFwcGluZ0luZGVudCIsZVtlLndyYXBwaW5nU3RyYXRlZ3k9MTQwXT0id3JhcHBpbmdTdHJhdGVneSIsZVtlLnNob3dEZXByZWNhdGVkPTE0MV09InNob3dEZXByZWNhdGVkIixlW2UuaW5sYXlIaW50cz0xNDJdPSJpbmxheUhpbnRzIixlW2UuZWRpdG9yQ2xhc3NOYW1lPTE0M109ImVkaXRvckNsYXNzTmFtZSIsZVtlLnBpeGVsUmF0aW89MTQ0XT0icGl4ZWxSYXRpbyIsZVtlLnRhYkZvY3VzTW9kZT0xNDVdPSJ0YWJGb2N1c01vZGUiLGVbZS5sYXlvdXRJbmZvPTE0Nl09ImxheW91dEluZm8iLGVbZS53cmFwcGluZ0luZm89MTQ3XT0id3JhcHBpbmdJbmZvIixlW2UuZGVmYXVsdENvbG9yRGVjb3JhdG9ycz0xNDhdPSJkZWZhdWx0Q29sb3JEZWNvcmF0b3JzIixlW2UuY29sb3JEZWNvcmF0b3JzQWN0aXZhdGVkT249MTQ5XT0iY29sb3JEZWNvcmF0b3JzQWN0aXZhdGVkT24iLGVbZS5pbmxpbmVDb21wbGV0aW9uc0FjY2Vzc2liaWxpdHlWZXJib3NlPTE1MF09ImlubGluZUNvbXBsZXRpb25zQWNjZXNzaWJpbGl0eVZlcmJvc2UifSkoQ3J8fChDcj17fSkpO3ZhciBBcjsoZnVuY3Rpb24oZSl7ZVtlLlRleHREZWZpbmVkPTBdPSJUZXh0RGVmaW5lZCIsZVtlLkxGPTFdPSJMRiIsZVtlLkNSTEY9Ml09IkNSTEYifSkoQXJ8fChBcj17fSkpO3ZhciBScjsoZnVuY3Rpb24oZSl7ZVtlLkxGPTBdPSJMRiIsZVtlLkNSTEY9MV09IkNSTEYifSkoUnJ8fChScj17fSkpO3ZhciB5cjsoZnVuY3Rpb24oZSl7ZVtlLkxlZnQ9MV09IkxlZnQiLGVbZS5DZW50ZXI9Ml09IkNlbnRlciIsZVtlLlJpZ2h0PTNdPSJSaWdodCJ9KSh5cnx8KHlyPXt9KSk7dmFyIEVyOyhmdW5jdGlvbihlKXtlW2UuSW5jcmVhc2U9MF09IkluY3JlYXNlIixlW2UuRGVjcmVhc2U9MV09IkRlY3JlYXNlIn0pKEVyfHwoRXI9e30pKTt2YXIgTXI7KGZ1bmN0aW9uKGUpe2VbZS5Ob25lPTBdPSJOb25lIixlW2UuSW5kZW50PTFdPSJJbmRlbnQiLGVbZS5JbmRlbnRPdXRkZW50PTJdPSJJbmRlbnRPdXRkZW50IixlW2UuT3V0ZGVudD0zXT0iT3V0ZGVudCJ9KShNcnx8KE1yPXt9KSk7dmFyIGtyOyhmdW5jdGlvbihlKXtlW2UuQm90aD0wXT0iQm90aCIsZVtlLlJpZ2h0PTFdPSJSaWdodCIsZVtlLkxlZnQ9Ml09IkxlZnQiLGVbZS5Ob25lPTNdPSJOb25lIn0pKGtyfHwoa3I9e30pKTt2YXIgUHI7KGZ1bmN0aW9uKGUpe2VbZS5UeXBlPTFdPSJUeXBlIixlW2UuUGFyYW1ldGVyPTJdPSJQYXJhbWV0ZXIifSkoUHJ8fChQcj17fSkpO3ZhciBGcjsoZnVuY3Rpb24oZSl7ZVtlLkF1dG9tYXRpYz0wXT0iQXV0b21hdGljIixlW2UuRXhwbGljaXQ9MV09IkV4cGxpY2l0In0pKEZyfHwoRnI9e30pKTt2YXIgRHI7KGZ1bmN0aW9uKGUpe2VbZS5JbnZva2U9MF09Ikludm9rZSIsZVtlLkF1dG9tYXRpYz0xXT0iQXV0b21hdGljIn0pKERyfHwoRHI9e30pKTt2YXIgdW47KGZ1bmN0aW9uKGUpe2VbZS5EZXBlbmRzT25LYkxheW91dD0tMV09IkRlcGVuZHNPbktiTGF5b3V0IixlW2UuVW5rbm93bj0wXT0iVW5rbm93biIsZVtlLkJhY2tzcGFjZT0xXT0iQmFja3NwYWNlIixlW2UuVGFiPTJdPSJUYWIiLGVbZS5FbnRlcj0zXT0iRW50ZXIiLGVbZS5TaGlmdD00XT0iU2hpZnQiLGVbZS5DdHJsPTVdPSJDdHJsIixlW2UuQWx0PTZdPSJBbHQiLGVbZS5QYXVzZUJyZWFrPTddPSJQYXVzZUJyZWFrIixlW2UuQ2Fwc0xvY2s9OF09IkNhcHNMb2NrIixlW2UuRXNjYXBlPTldPSJFc2NhcGUiLGVbZS5TcGFjZT0xMF09IlNwYWNlIixlW2UuUGFnZVVwPTExXT0iUGFnZVVwIixlW2UuUGFnZURvd249MTJdPSJQYWdlRG93biIsZVtlLkVuZD0xM109IkVuZCIsZVtlLkhvbWU9MTRdPSJIb21lIixlW2UuTGVmdEFycm93PTE1XT0iTGVmdEFycm93IixlW2UuVXBBcnJvdz0xNl09IlVwQXJyb3ciLGVbZS5SaWdodEFycm93PTE3XT0iUmlnaHRBcnJvdyIsZVtlLkRvd25BcnJvdz0xOF09IkRvd25BcnJvdyIsZVtlLkluc2VydD0xOV09Ikluc2VydCIsZVtlLkRlbGV0ZT0yMF09IkRlbGV0ZSIsZVtlLkRpZ2l0MD0yMV09IkRpZ2l0MCIsZVtlLkRpZ2l0MT0yMl09IkRpZ2l0MSIsZVtlLkRpZ2l0Mj0yM109IkRpZ2l0MiIsZVtlLkRpZ2l0Mz0yNF09IkRpZ2l0MyIsZVtlLkRpZ2l0ND0yNV09IkRpZ2l0NCIsZVtlLkRpZ2l0NT0yNl09IkRpZ2l0NSIsZVtlLkRpZ2l0Nj0yN109IkRpZ2l0NiIsZVtlLkRpZ2l0Nz0yOF09IkRpZ2l0NyIsZVtlLkRpZ2l0OD0yOV09IkRpZ2l0OCIsZVtlLkRpZ2l0OT0zMF09IkRpZ2l0OSIsZVtlLktleUE9MzFdPSJLZXlBIixlW2UuS2V5Qj0zMl09IktleUIiLGVbZS5LZXlDPTMzXT0iS2V5QyIsZVtlLktleUQ9MzRdPSJLZXlEIixlW2UuS2V5RT0zNV09IktleUUiLGVbZS5LZXlGPTM2XT0iS2V5RiIsZVtlLktleUc9MzddPSJLZXlHIixlW2UuS2V5SD0zOF09IktleUgiLGVbZS5LZXlJPTM5XT0iS2V5SSIsZVtlLktleUo9NDBdPSJLZXlKIixlW2UuS2V5Sz00MV09IktleUsiLGVbZS5LZXlMPTQyXT0iS2V5TCIsZVtlLktleU09NDNdPSJLZXlNIixlW2UuS2V5Tj00NF09IktleU4iLGVbZS5LZXlPPTQ1XT0iS2V5TyIsZVtlLktleVA9NDZdPSJLZXlQIixlW2UuS2V5UT00N109IktleVEiLGVbZS5LZXlSPTQ4XT0iS2V5UiIsZVtlLktleVM9NDldPSJLZXlTIixlW2UuS2V5VD01MF09IktleVQiLGVbZS5LZXlVPTUxXT0iS2V5VSIsZVtlLktleVY9NTJdPSJLZXlWIixlW2UuS2V5Vz01M109IktleVciLGVbZS5LZXlYPTU0XT0iS2V5WCIsZVtlLktleVk9NTVdPSJLZXlZIixlW2UuS2V5Wj01Nl09IktleVoiLGVbZS5NZXRhPTU3XT0iTWV0YSIsZVtlLkNvbnRleHRNZW51PTU4XT0iQ29udGV4dE1lbnUiLGVbZS5GMT01OV09IkYxIixlW2UuRjI9NjBdPSJGMiIsZVtlLkYzPTYxXT0iRjMiLGVbZS5GND02Ml09IkY0IixlW2UuRjU9NjNdPSJGNSIsZVtlLkY2PTY0XT0iRjYiLGVbZS5GNz02NV09IkY3IixlW2UuRjg9NjZdPSJGOCIsZVtlLkY5PTY3XT0iRjkiLGVbZS5GMTA9NjhdPSJGMTAiLGVbZS5GMTE9NjldPSJGMTEiLGVbZS5GMTI9NzBdPSJGMTIiLGVbZS5GMTM9NzFdPSJGMTMiLGVbZS5GMTQ9NzJdPSJGMTQiLGVbZS5GMTU9NzNdPSJGMTUiLGVbZS5GMTY9NzRdPSJGMTYiLGVbZS5GMTc9NzVdPSJGMTciLGVbZS5GMTg9NzZdPSJGMTgiLGVbZS5GMTk9NzddPSJGMTkiLGVbZS5GMjA9NzhdPSJGMjAiLGVbZS5GMjE9NzldPSJGMjEiLGVbZS5GMjI9ODBdPSJGMjIiLGVbZS5GMjM9ODFdPSJGMjMiLGVbZS5GMjQ9ODJdPSJGMjQiLGVbZS5OdW1Mb2NrPTgzXT0iTnVtTG9jayIsZVtlLlNjcm9sbExvY2s9ODRdPSJTY3JvbGxMb2NrIixlW2UuU2VtaWNvbG9uPTg1XT0iU2VtaWNvbG9uIixlW2UuRXF1YWw9ODZdPSJFcXVhbCIsZVtlLkNvbW1hPTg3XT0iQ29tbWEiLGVbZS5NaW51cz04OF09Ik1pbnVzIixlW2UuUGVyaW9kPTg5XT0iUGVyaW9kIixlW2UuU2xhc2g9OTBdPSJTbGFzaCIsZVtlLkJhY2txdW90ZT05MV09IkJhY2txdW90ZSIsZVtlLkJyYWNrZXRMZWZ0PTkyXT0iQnJhY2tldExlZnQiLGVbZS5CYWNrc2xhc2g9OTNdPSJCYWNrc2xhc2giLGVbZS5CcmFja2V0UmlnaHQ9OTRdPSJCcmFja2V0UmlnaHQiLGVbZS5RdW90ZT05NV09IlF1b3RlIixlW2UuT0VNXzg9OTZdPSJPRU1fOCIsZVtlLkludGxCYWNrc2xhc2g9OTddPSJJbnRsQmFja3NsYXNoIixlW2UuTnVtcGFkMD05OF09Ik51bXBhZDAiLGVbZS5OdW1wYWQxPTk5XT0iTnVtcGFkMSIsZVtlLk51bXBhZDI9MTAwXT0iTnVtcGFkMiIsZVtlLk51bXBhZDM9MTAxXT0iTnVtcGFkMyIsZVtlLk51bXBhZDQ9MTAyXT0iTnVtcGFkNCIsZVtlLk51bXBhZDU9MTAzXT0iTnVtcGFkNSIsZVtlLk51bXBhZDY9MTA0XT0iTnVtcGFkNiIsZVtlLk51bXBhZDc9MTA1XT0iTnVtcGFkNyIsZVtlLk51bXBhZDg9MTA2XT0iTnVtcGFkOCIsZVtlLk51bXBhZDk9MTA3XT0iTnVtcGFkOSIsZVtlLk51bXBhZE11bHRpcGx5PTEwOF09Ik51bXBhZE11bHRpcGx5IixlW2UuTnVtcGFkQWRkPTEwOV09Ik51bXBhZEFkZCIsZVtlLk5VTVBBRF9TRVBBUkFUT1I9MTEwXT0iTlVNUEFEX1NFUEFSQVRPUiIsZVtlLk51bXBhZFN1YnRyYWN0PTExMV09Ik51bXBhZFN1YnRyYWN0IixlW2UuTnVtcGFkRGVjaW1hbD0xMTJdPSJOdW1wYWREZWNpbWFsIixlW2UuTnVtcGFkRGl2aWRlPTExM109Ik51bXBhZERpdmlkZSIsZVtlLktFWV9JTl9DT01QT1NJVElPTj0xMTRdPSJLRVlfSU5fQ09NUE9TSVRJT04iLGVbZS5BQk5UX0MxPTExNV09IkFCTlRfQzEiLGVbZS5BQk5UX0MyPTExNl09IkFCTlRfQzIiLGVbZS5BdWRpb1ZvbHVtZU11dGU9MTE3XT0iQXVkaW9Wb2x1bWVNdXRlIixlW2UuQXVkaW9Wb2x1bWVVcD0xMThdPSJBdWRpb1ZvbHVtZVVwIixlW2UuQXVkaW9Wb2x1bWVEb3duPTExOV09IkF1ZGlvVm9sdW1lRG93biIsZVtlLkJyb3dzZXJTZWFyY2g9MTIwXT0iQnJvd3NlclNlYXJjaCIsZVtlLkJyb3dzZXJIb21lPTEyMV09IkJyb3dzZXJIb21lIixlW2UuQnJvd3NlckJhY2s9MTIyXT0iQnJvd3NlckJhY2siLGVbZS5Ccm93c2VyRm9yd2FyZD0xMjNdPSJCcm93c2VyRm9yd2FyZCIsZVtlLk1lZGlhVHJhY2tOZXh0PTEyNF09Ik1lZGlhVHJhY2tOZXh0IixlW2UuTWVkaWFUcmFja1ByZXZpb3VzPTEyNV09Ik1lZGlhVHJhY2tQcmV2aW91cyIsZVtlLk1lZGlhU3RvcD0xMjZdPSJNZWRpYVN0b3AiLGVbZS5NZWRpYVBsYXlQYXVzZT0xMjddPSJNZWRpYVBsYXlQYXVzZSIsZVtlLkxhdW5jaE1lZGlhUGxheWVyPTEyOF09IkxhdW5jaE1lZGlhUGxheWVyIixlW2UuTGF1bmNoTWFpbD0xMjldPSJMYXVuY2hNYWlsIixlW2UuTGF1bmNoQXBwMj0xMzBdPSJMYXVuY2hBcHAyIixlW2UuQ2xlYXI9MTMxXT0iQ2xlYXIiLGVbZS5NQVhfVkFMVUU9MTMyXT0iTUFYX1ZBTFVFIn0pKHVufHwodW49e30pKTt2YXIgY247KGZ1bmN0aW9uKGUpe2VbZS5IaW50PTFdPSJIaW50IixlW2UuSW5mbz0yXT0iSW5mbyIsZVtlLldhcm5pbmc9NF09Ildhcm5pbmciLGVbZS5FcnJvcj04XT0iRXJyb3IifSkoY258fChjbj17fSkpO3ZhciBobjsoZnVuY3Rpb24oZSl7ZVtlLlVubmVjZXNzYXJ5PTFdPSJVbm5lY2Vzc2FyeSIsZVtlLkRlcHJlY2F0ZWQ9Ml09IkRlcHJlY2F0ZWQifSkoaG58fChobj17fSkpO3ZhciBUcjsoZnVuY3Rpb24oZSl7ZVtlLklubGluZT0xXT0iSW5saW5lIixlW2UuR3V0dGVyPTJdPSJHdXR0ZXIifSkoVHJ8fChUcj17fSkpO3ZhciBJcjsoZnVuY3Rpb24oZSl7ZVtlLk5vcm1hbD0xXT0iTm9ybWFsIixlW2UuVW5kZXJsaW5lZD0yXT0iVW5kZXJsaW5lZCJ9KShJcnx8KElyPXt9KSk7dmFyIFZyOyhmdW5jdGlvbihlKXtlW2UuVU5LTk9XTj0wXT0iVU5LTk9XTiIsZVtlLlRFWFRBUkVBPTFdPSJURVhUQVJFQSIsZVtlLkdVVFRFUl9HTFlQSF9NQVJHSU49Ml09IkdVVFRFUl9HTFlQSF9NQVJHSU4iLGVbZS5HVVRURVJfTElORV9OVU1CRVJTPTNdPSJHVVRURVJfTElORV9OVU1CRVJTIixlW2UuR1VUVEVSX0xJTkVfREVDT1JBVElPTlM9NF09IkdVVFRFUl9MSU5FX0RFQ09SQVRJT05TIixlW2UuR1VUVEVSX1ZJRVdfWk9ORT01XT0iR1VUVEVSX1ZJRVdfWk9ORSIsZVtlLkNPTlRFTlRfVEVYVD02XT0iQ09OVEVOVF9URVhUIixlW2UuQ09OVEVOVF9FTVBUWT03XT0iQ09OVEVOVF9FTVBUWSIsZVtlLkNPTlRFTlRfVklFV19aT05FPThdPSJDT05URU5UX1ZJRVdfWk9ORSIsZVtlLkNPTlRFTlRfV0lER0VUPTldPSJDT05URU5UX1dJREdFVCIsZVtlLk9WRVJWSUVXX1JVTEVSPTEwXT0iT1ZFUlZJRVdfUlVMRVIiLGVbZS5TQ1JPTExCQVI9MTFdPSJTQ1JPTExCQVIiLGVbZS5PVkVSTEFZX1dJREdFVD0xMl09Ik9WRVJMQVlfV0lER0VUIixlW2UuT1VUU0lERV9FRElUT1I9MTNdPSJPVVRTSURFX0VESVRPUiJ9KShWcnx8KFZyPXt9KSk7dmFyIEJyOyhmdW5jdGlvbihlKXtlW2UuQUlHZW5lcmF0ZWQ9MV09IkFJR2VuZXJhdGVkIn0pKEJyfHwoQnI9e30pKTt2YXIgcXI7KGZ1bmN0aW9uKGUpe2VbZS5JbnZva2U9MF09Ikludm9rZSIsZVtlLkF1dG9tYXRpYz0xXT0iQXV0b21hdGljIn0pKHFyfHwocXI9e30pKTt2YXIgVXI7KGZ1bmN0aW9uKGUpe2VbZS5UT1BfUklHSFRfQ09STkVSPTBdPSJUT1BfUklHSFRfQ09STkVSIixlW2UuQk9UVE9NX1JJR0hUX0NPUk5FUj0xXT0iQk9UVE9NX1JJR0hUX0NPUk5FUiIsZVtlLlRPUF9DRU5URVI9Ml09IlRPUF9DRU5URVIifSkoVXJ8fChVcj17fSkpO3ZhciAkcjsoZnVuY3Rpb24oZSl7ZVtlLkxlZnQ9MV09IkxlZnQiLGVbZS5DZW50ZXI9Ml09IkNlbnRlciIsZVtlLlJpZ2h0PTRdPSJSaWdodCIsZVtlLkZ1bGw9N109IkZ1bGwifSkoJHJ8fCgkcj17fSkpO3ZhciBIcjsoZnVuY3Rpb24oZSl7ZVtlLldvcmQ9MF09IldvcmQiLGVbZS5MaW5lPTFdPSJMaW5lIixlW2UuU3VnZ2VzdD0yXT0iU3VnZ2VzdCJ9KShIcnx8KEhyPXt9KSk7dmFyIFdyOyhmdW5jdGlvbihlKXtlW2UuTGVmdD0wXT0iTGVmdCIsZVtlLlJpZ2h0PTFdPSJSaWdodCIsZVtlLk5vbmU9Ml09Ik5vbmUiLGVbZS5MZWZ0T2ZJbmplY3RlZFRleHQ9M109IkxlZnRPZkluamVjdGVkVGV4dCIsZVtlLlJpZ2h0T2ZJbmplY3RlZFRleHQ9NF09IlJpZ2h0T2ZJbmplY3RlZFRleHQifSkoV3J8fChXcj17fSkpO3ZhciB6cjsoZnVuY3Rpb24oZSl7ZVtlLk9mZj0wXT0iT2ZmIixlW2UuT249MV09Ik9uIixlW2UuUmVsYXRpdmU9Ml09IlJlbGF0aXZlIixlW2UuSW50ZXJ2YWw9M109IkludGVydmFsIixlW2UuQ3VzdG9tPTRdPSJDdXN0b20ifSkoenJ8fCh6cj17fSkpO3ZhciBPcjsoZnVuY3Rpb24oZSl7ZVtlLk5vbmU9MF09Ik5vbmUiLGVbZS5UZXh0PTFdPSJUZXh0IixlW2UuQmxvY2tzPTJdPSJCbG9ja3MifSkoT3J8fChPcj17fSkpO3ZhciBHcjsoZnVuY3Rpb24oZSl7ZVtlLlNtb290aD0wXT0iU21vb3RoIixlW2UuSW1tZWRpYXRlPTFdPSJJbW1lZGlhdGUifSkoR3J8fChHcj17fSkpO3ZhciBqcjsoZnVuY3Rpb24oZSl7ZVtlLkF1dG89MV09IkF1dG8iLGVbZS5IaWRkZW49Ml09IkhpZGRlbiIsZVtlLlZpc2libGU9M109IlZpc2libGUifSkoanJ8fChqcj17fSkpO3ZhciBmbjsoZnVuY3Rpb24oZSl7ZVtlLkxUUj0wXT0iTFRSIixlW2UuUlRMPTFdPSJSVEwifSkoZm58fChmbj17fSkpO3ZhciBYcjsoZnVuY3Rpb24oZSl7ZS5PZmY9Im9mZiIsZS5PbkNvZGU9Im9uQ29kZSIsZS5Pbj0ib24ifSkoWHJ8fChYcj17fSkpO3ZhciBRcjsoZnVuY3Rpb24oZSl7ZVtlLkludm9rZT0xXT0iSW52b2tlIixlW2UuVHJpZ2dlckNoYXJhY3Rlcj0yXT0iVHJpZ2dlckNoYXJhY3RlciIsZVtlLkNvbnRlbnRDaGFuZ2U9M109IkNvbnRlbnRDaGFuZ2UifSkoUXJ8fChRcj17fSkpO3ZhciBZcjsoZnVuY3Rpb24oZSl7ZVtlLkZpbGU9MF09IkZpbGUiLGVbZS5Nb2R1bGU9MV09Ik1vZHVsZSIsZVtlLk5hbWVzcGFjZT0yXT0iTmFtZXNwYWNlIixlW2UuUGFja2FnZT0zXT0iUGFja2FnZSIsZVtlLkNsYXNzPTRdPSJDbGFzcyIsZVtlLk1ldGhvZD01XT0iTWV0aG9kIixlW2UuUHJvcGVydHk9Nl09IlByb3BlcnR5IixlW2UuRmllbGQ9N109IkZpZWxkIixlW2UuQ29uc3RydWN0b3I9OF09IkNvbnN0cnVjdG9yIixlW2UuRW51bT05XT0iRW51bSIsZVtlLkludGVyZmFjZT0xMF09IkludGVyZmFjZSIsZVtlLkZ1bmN0aW9uPTExXT0iRnVuY3Rpb24iLGVbZS5WYXJpYWJsZT0xMl09IlZhcmlhYmxlIixlW2UuQ29uc3RhbnQ9MTNdPSJDb25zdGFudCIsZVtlLlN0cmluZz0xNF09IlN0cmluZyIsZVtlLk51bWJlcj0xNV09Ik51bWJlciIsZVtlLkJvb2xlYW49MTZdPSJCb29sZWFuIixlW2UuQXJyYXk9MTddPSJBcnJheSIsZVtlLk9iamVjdD0xOF09Ik9iamVjdCIsZVtlLktleT0xOV09IktleSIsZVtlLk51bGw9MjBdPSJOdWxsIixlW2UuRW51bU1lbWJlcj0yMV09IkVudW1NZW1iZXIiLGVbZS5TdHJ1Y3Q9MjJdPSJTdHJ1Y3QiLGVbZS5FdmVudD0yM109IkV2ZW50IixlW2UuT3BlcmF0b3I9MjRdPSJPcGVyYXRvciIsZVtlLlR5cGVQYXJhbWV0ZXI9MjVdPSJUeXBlUGFyYW1ldGVyIn0pKFlyfHwoWXI9e30pKTt2YXIgSnI7KGZ1bmN0aW9uKGUpe2VbZS5EZXByZWNhdGVkPTFdPSJEZXByZWNhdGVkIn0pKEpyfHwoSnI9e30pKTt2YXIgWnI7KGZ1bmN0aW9uKGUpe2VbZS5IaWRkZW49MF09IkhpZGRlbiIsZVtlLkJsaW5rPTFdPSJCbGluayIsZVtlLlNtb290aD0yXT0iU21vb3RoIixlW2UuUGhhc2U9M109IlBoYXNlIixlW2UuRXhwYW5kPTRdPSJFeHBhbmQiLGVbZS5Tb2xpZD01XT0iU29saWQifSkoWnJ8fChacj17fSkpO3ZhciBLcjsoZnVuY3Rpb24oZSl7ZVtlLkxpbmU9MV09IkxpbmUiLGVbZS5CbG9jaz0yXT0iQmxvY2siLGVbZS5VbmRlcmxpbmU9M109IlVuZGVybGluZSIsZVtlLkxpbmVUaGluPTRdPSJMaW5lVGhpbiIsZVtlLkJsb2NrT3V0bGluZT01XT0iQmxvY2tPdXRsaW5lIixlW2UuVW5kZXJsaW5lVGhpbj02XT0iVW5kZXJsaW5lVGhpbiJ9KShLcnx8KEtyPXt9KSk7dmFyIGVzOyhmdW5jdGlvbihlKXtlW2UuQWx3YXlzR3Jvd3NXaGVuVHlwaW5nQXRFZGdlcz0wXT0iQWx3YXlzR3Jvd3NXaGVuVHlwaW5nQXRFZGdlcyIsZVtlLk5ldmVyR3Jvd3NXaGVuVHlwaW5nQXRFZGdlcz0xXT0iTmV2ZXJHcm93c1doZW5UeXBpbmdBdEVkZ2VzIixlW2UuR3Jvd3NPbmx5V2hlblR5cGluZ0JlZm9yZT0yXT0iR3Jvd3NPbmx5V2hlblR5cGluZ0JlZm9yZSIsZVtlLkdyb3dzT25seVdoZW5UeXBpbmdBZnRlcj0zXT0iR3Jvd3NPbmx5V2hlblR5cGluZ0FmdGVyIn0pKGVzfHwoZXM9e30pKTt2YXIgdHM7KGZ1bmN0aW9uKGUpe2VbZS5Ob25lPTBdPSJOb25lIixlW2UuU2FtZT0xXT0iU2FtZSIsZVtlLkluZGVudD0yXT0iSW5kZW50IixlW2UuRGVlcEluZGVudD0zXT0iRGVlcEluZGVudCJ9KSh0c3x8KHRzPXt9KSk7Y29uc3QgWGU9Y2xhc3MgWGV7c3RhdGljIGNob3JkKHQsbil7cmV0dXJuIGNhKHQsbil9fTtYZS5DdHJsQ21kPTIwNDgsWGUuU2hpZnQ9MTAyNCxYZS5BbHQ9NTEyLFhlLldpbkN0cmw9MjU2O2xldCBkbj1YZTtmdW5jdGlvbiBiYSgpe3JldHVybntlZGl0b3I6dm9pZCAwLGxhbmd1YWdlczp2b2lkIDAsQ2FuY2VsbGF0aW9uVG9rZW5Tb3VyY2U6YWEsRW1pdHRlcjpvZSxLZXlDb2RlOnVuLEtleU1vZDpkbixQb3NpdGlvbjokLFJhbmdlOmssU2VsZWN0aW9uOmFlLFNlbGVjdGlvbkRpcmVjdGlvbjpmbixNYXJrZXJTZXZlcml0eTpjbixNYXJrZXJUYWc6aG4sVXJpOnNlLFRva2VuOmdhfX1jb25zdCB1dD1jbGFzcyB1dHtzdGF0aWMgZ2V0Q2hhbm5lbCh0KXtyZXR1cm4gdC5nZXRDaGFubmVsKHV0LkNIQU5ORUxfTkFNRSl9c3RhdGljIHNldENoYW5uZWwodCxuKXt0LnNldENoYW5uZWwodXQuQ0hBTk5FTF9OQU1FLG4pfX07dXQuQ0hBTk5FTF9OQU1FPSJlZGl0b3JXb3JrZXJIb3N0IjtsZXQgbW49dXQ7dmFyIG5zO2NsYXNzIHhhe2NvbnN0cnVjdG9yKCl7dGhpc1tuc109IkxpbmtlZE1hcCIsdGhpcy5fbWFwPW5ldyBNYXAsdGhpcy5faGVhZD12b2lkIDAsdGhpcy5fdGFpbD12b2lkIDAsdGhpcy5fc2l6ZT0wLHRoaXMuX3N0YXRlPTB9Y2xlYXIoKXt0aGlzLl9tYXAuY2xlYXIoKSx0aGlzLl9oZWFkPXZvaWQgMCx0aGlzLl90YWlsPXZvaWQgMCx0aGlzLl9zaXplPTAsdGhpcy5fc3RhdGUrK31pc0VtcHR5KCl7cmV0dXJuIXRoaXMuX2hlYWQmJiF0aGlzLl90YWlsfWdldCBzaXplKCl7cmV0dXJuIHRoaXMuX3NpemV9Z2V0IGZpcnN0KCl7dmFyIHQ7cmV0dXJuKHQ9dGhpcy5faGVhZCk9PW51bGw/dm9pZCAwOnQudmFsdWV9Z2V0IGxhc3QoKXt2YXIgdDtyZXR1cm4odD10aGlzLl90YWlsKT09bnVsbD92b2lkIDA6dC52YWx1ZX1oYXModCl7cmV0dXJuIHRoaXMuX21hcC5oYXModCl9Z2V0KHQsbj0wKXtjb25zdCByPXRoaXMuX21hcC5nZXQodCk7aWYocilyZXR1cm4gbiE9PTAmJnRoaXMudG91Y2gocixuKSxyLnZhbHVlfXNldCh0LG4scj0wKXtsZXQgcz10aGlzLl9tYXAuZ2V0KHQpO2lmKHMpcy52YWx1ZT1uLHIhPT0wJiZ0aGlzLnRvdWNoKHMscik7ZWxzZXtzd2l0Y2gocz17a2V5OnQsdmFsdWU6bixuZXh0OnZvaWQgMCxwcmV2aW91czp2b2lkIDB9LHIpe2Nhc2UgMDp0aGlzLmFkZEl0ZW1MYXN0KHMpO2JyZWFrO2Nhc2UgMTp0aGlzLmFkZEl0ZW1GaXJzdChzKTticmVhaztjYXNlIDI6dGhpcy5hZGRJdGVtTGFzdChzKTticmVhaztkZWZhdWx0OnRoaXMuYWRkSXRlbUxhc3Qocyk7YnJlYWt9dGhpcy5fbWFwLnNldCh0LHMpLHRoaXMuX3NpemUrK31yZXR1cm4gdGhpc31kZWxldGUodCl7cmV0dXJuISF0aGlzLnJlbW92ZSh0KX1yZW1vdmUodCl7Y29uc3Qgbj10aGlzLl9tYXAuZ2V0KHQpO2lmKG4pcmV0dXJuIHRoaXMuX21hcC5kZWxldGUodCksdGhpcy5yZW1vdmVJdGVtKG4pLHRoaXMuX3NpemUtLSxuLnZhbHVlfXNoaWZ0KCl7aWYoIXRoaXMuX2hlYWQmJiF0aGlzLl90YWlsKXJldHVybjtpZighdGhpcy5faGVhZHx8IXRoaXMuX3RhaWwpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTtjb25zdCB0PXRoaXMuX2hlYWQ7cmV0dXJuIHRoaXMuX21hcC5kZWxldGUodC5rZXkpLHRoaXMucmVtb3ZlSXRlbSh0KSx0aGlzLl9zaXplLS0sdC52YWx1ZX1mb3JFYWNoKHQsbil7Y29uc3Qgcj10aGlzLl9zdGF0ZTtsZXQgcz10aGlzLl9oZWFkO2Zvcig7czspe2lmKG4/dC5iaW5kKG4pKHMudmFsdWUscy5rZXksdGhpcyk6dChzLnZhbHVlLHMua2V5LHRoaXMpLHRoaXMuX3N0YXRlIT09cil0aHJvdyBuZXcgRXJyb3IoIkxpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi4iKTtzPXMubmV4dH19a2V5cygpe2NvbnN0IHQ9dGhpcyxuPXRoaXMuX3N0YXRlO2xldCByPXRoaXMuX2hlYWQ7Y29uc3Qgcz17W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gc30sbmV4dCgpe2lmKHQuX3N0YXRlIT09bil0aHJvdyBuZXcgRXJyb3IoIkxpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi4iKTtpZihyKXtjb25zdCBpPXt2YWx1ZTpyLmtleSxkb25lOiExfTtyZXR1cm4gcj1yLm5leHQsaX1lbHNlIHJldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH19fTtyZXR1cm4gc312YWx1ZXMoKXtjb25zdCB0PXRoaXMsbj10aGlzLl9zdGF0ZTtsZXQgcj10aGlzLl9oZWFkO2NvbnN0IHM9e1tTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHN9LG5leHQoKXtpZih0Ll9zdGF0ZSE9PW4pdGhyb3cgbmV3IEVycm9yKCJMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uIik7aWYocil7Y29uc3QgaT17dmFsdWU6ci52YWx1ZSxkb25lOiExfTtyZXR1cm4gcj1yLm5leHQsaX1lbHNlIHJldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH19fTtyZXR1cm4gc31lbnRyaWVzKCl7Y29uc3QgdD10aGlzLG49dGhpcy5fc3RhdGU7bGV0IHI9dGhpcy5faGVhZDtjb25zdCBzPXtbU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBzfSxuZXh0KCl7aWYodC5fc3RhdGUhPT1uKXRocm93IG5ldyBFcnJvcigiTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLiIpO2lmKHIpe2NvbnN0IGk9e3ZhbHVlOltyLmtleSxyLnZhbHVlXSxkb25lOiExfTtyZXR1cm4gcj1yLm5leHQsaX1lbHNlIHJldHVybnt2YWx1ZTp2b2lkIDAsZG9uZTohMH19fTtyZXR1cm4gc31bKG5zPVN5bWJvbC50b1N0cmluZ1RhZyxTeW1ib2wuaXRlcmF0b3IpXSgpe3JldHVybiB0aGlzLmVudHJpZXMoKX10cmltT2xkKHQpe2lmKHQ+PXRoaXMuc2l6ZSlyZXR1cm47aWYodD09PTApe3RoaXMuY2xlYXIoKTtyZXR1cm59bGV0IG49dGhpcy5faGVhZCxyPXRoaXMuc2l6ZTtmb3IoO24mJnI+dDspdGhpcy5fbWFwLmRlbGV0ZShuLmtleSksbj1uLm5leHQsci0tO3RoaXMuX2hlYWQ9bix0aGlzLl9zaXplPXIsbiYmKG4ucHJldmlvdXM9dm9pZCAwKSx0aGlzLl9zdGF0ZSsrfXRyaW1OZXcodCl7aWYodD49dGhpcy5zaXplKXJldHVybjtpZih0PT09MCl7dGhpcy5jbGVhcigpO3JldHVybn1sZXQgbj10aGlzLl90YWlsLHI9dGhpcy5zaXplO2Zvcig7biYmcj50Oyl0aGlzLl9tYXAuZGVsZXRlKG4ua2V5KSxuPW4ucHJldmlvdXMsci0tO3RoaXMuX3RhaWw9bix0aGlzLl9zaXplPXIsbiYmKG4ubmV4dD12b2lkIDApLHRoaXMuX3N0YXRlKyt9YWRkSXRlbUZpcnN0KHQpe2lmKCF0aGlzLl9oZWFkJiYhdGhpcy5fdGFpbCl0aGlzLl90YWlsPXQ7ZWxzZSBpZih0aGlzLl9oZWFkKXQubmV4dD10aGlzLl9oZWFkLHRoaXMuX2hlYWQucHJldmlvdXM9dDtlbHNlIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7dGhpcy5faGVhZD10LHRoaXMuX3N0YXRlKyt9YWRkSXRlbUxhc3QodCl7aWYoIXRoaXMuX2hlYWQmJiF0aGlzLl90YWlsKXRoaXMuX2hlYWQ9dDtlbHNlIGlmKHRoaXMuX3RhaWwpdC5wcmV2aW91cz10aGlzLl90YWlsLHRoaXMuX3RhaWwubmV4dD10O2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTt0aGlzLl90YWlsPXQsdGhpcy5fc3RhdGUrK31yZW1vdmVJdGVtKHQpe2lmKHQ9PT10aGlzLl9oZWFkJiZ0PT09dGhpcy5fdGFpbCl0aGlzLl9oZWFkPXZvaWQgMCx0aGlzLl90YWlsPXZvaWQgMDtlbHNlIGlmKHQ9PT10aGlzLl9oZWFkKXtpZighdC5uZXh0KXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7dC5uZXh0LnByZXZpb3VzPXZvaWQgMCx0aGlzLl9oZWFkPXQubmV4dH1lbHNlIGlmKHQ9PT10aGlzLl90YWlsKXtpZighdC5wcmV2aW91cyl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbGlzdCIpO3QucHJldmlvdXMubmV4dD12b2lkIDAsdGhpcy5fdGFpbD10LnByZXZpb3VzfWVsc2V7Y29uc3Qgbj10Lm5leHQscj10LnByZXZpb3VzO2lmKCFufHwhcil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbGlzdCIpO24ucHJldmlvdXM9cixyLm5leHQ9bn10Lm5leHQ9dm9pZCAwLHQucHJldmlvdXM9dm9pZCAwLHRoaXMuX3N0YXRlKyt9dG91Y2godCxuKXtpZighdGhpcy5faGVhZHx8IXRoaXMuX3RhaWwpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTtpZighKG4hPT0xJiZuIT09Mikpe2lmKG49PT0xKXtpZih0PT09dGhpcy5faGVhZClyZXR1cm47Y29uc3Qgcj10Lm5leHQscz10LnByZXZpb3VzO3Q9PT10aGlzLl90YWlsPyhzLm5leHQ9dm9pZCAwLHRoaXMuX3RhaWw9cyk6KHIucHJldmlvdXM9cyxzLm5leHQ9ciksdC5wcmV2aW91cz12b2lkIDAsdC5uZXh0PXRoaXMuX2hlYWQsdGhpcy5faGVhZC5wcmV2aW91cz10LHRoaXMuX2hlYWQ9dCx0aGlzLl9zdGF0ZSsrfWVsc2UgaWYobj09PTIpe2lmKHQ9PT10aGlzLl90YWlsKXJldHVybjtjb25zdCByPXQubmV4dCxzPXQucHJldmlvdXM7dD09PXRoaXMuX2hlYWQ/KHIucHJldmlvdXM9dm9pZCAwLHRoaXMuX2hlYWQ9cik6KHIucHJldmlvdXM9cyxzLm5leHQ9ciksdC5uZXh0PXZvaWQgMCx0LnByZXZpb3VzPXRoaXMuX3RhaWwsdGhpcy5fdGFpbC5uZXh0PXQsdGhpcy5fdGFpbD10LHRoaXMuX3N0YXRlKyt9fX10b0pTT04oKXtjb25zdCB0PVtdO3JldHVybiB0aGlzLmZvckVhY2goKG4scik9Pnt0LnB1c2goW3Isbl0pfSksdH1mcm9tSlNPTih0KXt0aGlzLmNsZWFyKCk7Zm9yKGNvbnN0W24scl1vZiB0KXRoaXMuc2V0KG4scil9fWNsYXNzIHBhIGV4dGVuZHMgeGF7Y29uc3RydWN0b3IodCxuPTEpe3N1cGVyKCksdGhpcy5fbGltaXQ9dCx0aGlzLl9yYXRpbz1NYXRoLm1pbihNYXRoLm1heCgwLG4pLDEpfWdldCBsaW1pdCgpe3JldHVybiB0aGlzLl9saW1pdH1zZXQgbGltaXQodCl7dGhpcy5fbGltaXQ9dCx0aGlzLmNoZWNrVHJpbSgpfWdldCh0LG49Mil7cmV0dXJuIHN1cGVyLmdldCh0LG4pfXBlZWsodCl7cmV0dXJuIHN1cGVyLmdldCh0LDApfXNldCh0LG4pe3JldHVybiBzdXBlci5zZXQodCxuLDIpLHRoaXN9Y2hlY2tUcmltKCl7dGhpcy5zaXplPnRoaXMuX2xpbWl0JiZ0aGlzLnRyaW0oTWF0aC5yb3VuZCh0aGlzLl9saW1pdCp0aGlzLl9yYXRpbykpfX1jbGFzcyBfYSBleHRlbmRzIHBhe2NvbnN0cnVjdG9yKHQsbj0xKXtzdXBlcih0LG4pfXRyaW0odCl7dGhpcy50cmltT2xkKHQpfXNldCh0LG4pe3JldHVybiBzdXBlci5zZXQodCxuKSx0aGlzLmNoZWNrVHJpbSgpLHRoaXN9fWNsYXNzIHdhe2NvbnN0cnVjdG9yKCl7dGhpcy5tYXA9bmV3IE1hcH1hZGQodCxuKXtsZXQgcj10aGlzLm1hcC5nZXQodCk7cnx8KHI9bmV3IFNldCx0aGlzLm1hcC5zZXQodCxyKSksci5hZGQobil9ZGVsZXRlKHQsbil7Y29uc3Qgcj10aGlzLm1hcC5nZXQodCk7ciYmKHIuZGVsZXRlKG4pLHIuc2l6ZT09PTAmJnRoaXMubWFwLmRlbGV0ZSh0KSl9Zm9yRWFjaCh0LG4pe2NvbnN0IHI9dGhpcy5tYXAuZ2V0KHQpO3ImJnIuZm9yRWFjaChuKX1nZXQodCl7Y29uc3Qgbj10aGlzLm1hcC5nZXQodCk7cmV0dXJuIG58fG5ldyBTZXR9fW5ldyBfYSgxMCk7ZnVuY3Rpb24gTGEoZSl7bGV0IHQ9W107Zm9yKDtPYmplY3QucHJvdG90eXBlIT09ZTspdD10LmNvbmNhdChPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyhlKSksZT1PYmplY3QuZ2V0UHJvdG90eXBlT2YoZSk7cmV0dXJuIHR9ZnVuY3Rpb24gcnMoZSl7Y29uc3QgdD1bXTtmb3IoY29uc3QgbiBvZiBMYShlKSl0eXBlb2YgZVtuXT09ImZ1bmN0aW9uIiYmdC5wdXNoKG4pO3JldHVybiB0fWZ1bmN0aW9uIHZhKGUsdCl7Y29uc3Qgbj1zPT5mdW5jdGlvbigpe2NvbnN0IGk9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDApO3JldHVybiB0KHMsaSl9LHI9e307Zm9yKGNvbnN0IHMgb2YgZSlyW3NdPW4ocyk7cmV0dXJuIHJ9dmFyIHNzOyhmdW5jdGlvbihlKXtlW2UuTGVmdD0xXT0iTGVmdCIsZVtlLkNlbnRlcj0yXT0iQ2VudGVyIixlW2UuUmlnaHQ9NF09IlJpZ2h0IixlW2UuRnVsbD03XT0iRnVsbCJ9KShzc3x8KHNzPXt9KSk7dmFyIGlzOyhmdW5jdGlvbihlKXtlW2UuTGVmdD0xXT0iTGVmdCIsZVtlLkNlbnRlcj0yXT0iQ2VudGVyIixlW2UuUmlnaHQ9M109IlJpZ2h0In0pKGlzfHwoaXM9e30pKTt2YXIgYXM7KGZ1bmN0aW9uKGUpe2VbZS5Cb3RoPTBdPSJCb3RoIixlW2UuUmlnaHQ9MV09IlJpZ2h0IixlW2UuTGVmdD0yXT0iTGVmdCIsZVtlLk5vbmU9M109Ik5vbmUifSkoYXN8fChhcz17fSkpO2Z1bmN0aW9uIE5hKGUsdCxuLHIscyl7aWYocj09PTApcmV0dXJuITA7Y29uc3QgaT10LmNoYXJDb2RlQXQoci0xKTtpZihlLmdldChpKSE9PTB8fGk9PT0xM3x8aT09PTEwKXJldHVybiEwO2lmKHM+MCl7Y29uc3Qgbz10LmNoYXJDb2RlQXQocik7aWYoZS5nZXQobykhPT0wKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFNhKGUsdCxuLHIscyl7aWYocitzPT09bilyZXR1cm4hMDtjb25zdCBpPXQuY2hhckNvZGVBdChyK3MpO2lmKGUuZ2V0KGkpIT09MHx8aT09PTEzfHxpPT09MTApcmV0dXJuITA7aWYocz4wKXtjb25zdCBvPXQuY2hhckNvZGVBdChyK3MtMSk7aWYoZS5nZXQobykhPT0wKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIENhKGUsdCxuLHIscyl7cmV0dXJuIE5hKGUsdCxuLHIscykmJlNhKGUsdCxuLHIscyl9Y2xhc3MgQWF7Y29uc3RydWN0b3IodCxuKXt0aGlzLl93b3JkU2VwYXJhdG9ycz10LHRoaXMuX3NlYXJjaFJlZ2V4PW4sdGhpcy5fcHJldk1hdGNoU3RhcnRJbmRleD0tMSx0aGlzLl9wcmV2TWF0Y2hMZW5ndGg9MH1yZXNldCh0KXt0aGlzLl9zZWFyY2hSZWdleC5sYXN0SW5kZXg9dCx0aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4PS0xLHRoaXMuX3ByZXZNYXRjaExlbmd0aD0wfW5leHQodCl7Y29uc3Qgbj10Lmxlbmd0aDtsZXQgcjtkb3tpZih0aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4K3RoaXMuX3ByZXZNYXRjaExlbmd0aD09PW58fChyPXRoaXMuX3NlYXJjaFJlZ2V4LmV4ZWModCksIXIpKXJldHVybiBudWxsO2NvbnN0IHM9ci5pbmRleCxpPXJbMF0ubGVuZ3RoO2lmKHM9PT10aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4JiZpPT09dGhpcy5fcHJldk1hdGNoTGVuZ3RoKXtpZihpPT09MCl7d2kodCxuLHRoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleCk+NjU1MzU/dGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4Kz0yOnRoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleCs9MTtjb250aW51ZX1yZXR1cm4gbnVsbH1pZih0aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4PXMsdGhpcy5fcHJldk1hdGNoTGVuZ3RoPWksIXRoaXMuX3dvcmRTZXBhcmF0b3JzfHxDYSh0aGlzLl93b3JkU2VwYXJhdG9ycyx0LG4scyxpKSlyZXR1cm4gcn13aGlsZShyKTtyZXR1cm4gbnVsbH19ZnVuY3Rpb24gUmEoZSx0PSJVbnJlYWNoYWJsZSIpe3Rocm93IG5ldyBFcnJvcih0KX1mdW5jdGlvbiBOdChlKXtpZighZSgpKXtkZWJ1Z2dlcjtlKCksSmUobmV3IGllKCJBc3NlcnRpb24gRmFpbGVkIikpfX1mdW5jdGlvbiBvcyhlLHQpe2xldCBuPTA7Zm9yKDtuPGUubGVuZ3RoLTE7KXtjb25zdCByPWVbbl0scz1lW24rMV07aWYoIXQocixzKSlyZXR1cm4hMTtuKyt9cmV0dXJuITB9Y29uc3QgeWE9ImB+IUAjJCVeJiooKS09K1t7XX1cXHw7OidcIiwuPD4vPyI7ZnVuY3Rpb24gRWEoZT0iIil7bGV0IHQ9IigtP1xcZCpcXC5cXGRcXHcqKXwoW14iO2Zvcihjb25zdCBuIG9mIHlhKWUuaW5kZXhPZihuKT49MHx8KHQrPSJcXCIrbik7cmV0dXJuIHQrPSJcXHNdKykiLG5ldyBSZWdFeHAodCwiZyIpfWNvbnN0IGxzPUVhKCk7ZnVuY3Rpb24gdXMoZSl7bGV0IHQ9bHM7aWYoZSYmZSBpbnN0YW5jZW9mIFJlZ0V4cClpZihlLmdsb2JhbCl0PWU7ZWxzZXtsZXQgbj0iZyI7ZS5pZ25vcmVDYXNlJiYobis9ImkiKSxlLm11bHRpbGluZSYmKG4rPSJtIiksZS51bmljb2RlJiYobis9InUiKSx0PW5ldyBSZWdFeHAoZS5zb3VyY2Usbil9cmV0dXJuIHQubGFzdEluZGV4PTAsdH1jb25zdCBjcz1uZXcgWHM7Y3MudW5zaGlmdCh7bWF4TGVuOjFlMyx3aW5kb3dTaXplOjE1LHRpbWVCdWRnZXQ6MTUwfSk7ZnVuY3Rpb24gZ24oZSx0LG4scixzKXtpZih0PXVzKHQpLHN8fChzPWh0LmZpcnN0KGNzKSksbi5sZW5ndGg+cy5tYXhMZW4pe2xldCBjPWUtcy5tYXhMZW4vMjtyZXR1cm4gYzwwP2M9MDpyKz1jLG49bi5zdWJzdHJpbmcoYyxlK3MubWF4TGVuLzIpLGduKGUsdCxuLHIscyl9Y29uc3QgaT1EYXRlLm5vdygpLG89ZS0xLXI7bGV0IGw9LTEsdT1udWxsO2ZvcihsZXQgYz0xOyEoRGF0ZS5ub3coKS1pPj1zLnRpbWVCdWRnZXQpO2MrKyl7Y29uc3QgaD1vLXMud2luZG93U2l6ZSpjO3QubGFzdEluZGV4PU1hdGgubWF4KDAsaCk7Y29uc3QgZj1NYSh0LG4sbyxsKTtpZighZiYmdXx8KHU9ZixoPD0wKSlicmVhaztsPWh9aWYodSl7Y29uc3QgYz17d29yZDp1WzBdLHN0YXJ0Q29sdW1uOnIrMSt1LmluZGV4LGVuZENvbHVtbjpyKzErdS5pbmRleCt1WzBdLmxlbmd0aH07cmV0dXJuIHQubGFzdEluZGV4PTAsY31yZXR1cm4gbnVsbH1mdW5jdGlvbiBNYShlLHQsbixyKXtsZXQgcztmb3IoO3M9ZS5leGVjKHQpOyl7Y29uc3QgaT1zLmluZGV4fHwwO2lmKGk8PW4mJmUubGFzdEluZGV4Pj1uKXJldHVybiBzO2lmKHI+MCYmaT5yKXJldHVybiBudWxsfXJldHVybiBudWxsfWNsYXNzIGthe3N0YXRpYyBjb21wdXRlVW5pY29kZUhpZ2hsaWdodHModCxuLHIpe2NvbnN0IHM9cj9yLnN0YXJ0TGluZU51bWJlcjoxLGk9cj9yLmVuZExpbmVOdW1iZXI6dC5nZXRMaW5lQ291bnQoKSxvPW5ldyBocyhuKSxsPW8uZ2V0Q2FuZGlkYXRlQ29kZVBvaW50cygpO2xldCB1O2w9PT0iYWxsTm9uQmFzaWNBc2NpaSI/dT1uZXcgUmVnRXhwKCJbXlxcdFxcblxcclxceDIwLVxceDdFXSIsImciKTp1PW5ldyBSZWdFeHAoYCR7UGEoQXJyYXkuZnJvbShsKSl9YCwiZyIpO2NvbnN0IGM9bmV3IEFhKG51bGwsdSksaD1bXTtsZXQgZj0hMSxkLG09MCxnPTAsYj0wO2U6Zm9yKGxldCBfPXMsdj1pO188PXY7XysrKXtjb25zdCBTPXQuZ2V0TGluZUNvbnRlbnQoXyksTj1TLmxlbmd0aDtjLnJlc2V0KDApO2RvIGlmKGQ9Yy5uZXh0KFMpLGQpe2xldCBwPWQuaW5kZXgseD1kLmluZGV4K2RbMF0ubGVuZ3RoO2lmKHA+MCl7Y29uc3QgQj1TLmNoYXJDb2RlQXQocC0xKTtRdChCKSYmcC0tfWlmKHgrMTxOKXtjb25zdCBCPVMuY2hhckNvZGVBdCh4LTEpO1F0KEIpJiZ4Kyt9Y29uc3QgTD1TLnN1YnN0cmluZyhwLHgpO2xldCBBPWduKHArMSxscyxTLDApO0EmJkEuZW5kQ29sdW1uPD1wKzEmJihBPW51bGwpO2NvbnN0IEU9by5zaG91bGRIaWdobGlnaHROb25CYXNpY0FTQ0lJKEwsQT9BLndvcmQ6bnVsbCk7aWYoRSE9PTApe2lmKEU9PT0zP20rKzpFPT09Mj9nKys6RT09PTE/YisrOlJhKCksaC5sZW5ndGg+PTFlMyl7Zj0hMDticmVhayBlfWgucHVzaChuZXcgayhfLHArMSxfLHgrMSkpfX13aGlsZShkKX1yZXR1cm57cmFuZ2VzOmgsaGFzTW9yZTpmLGFtYmlndW91c0NoYXJhY3RlckNvdW50Om0saW52aXNpYmxlQ2hhcmFjdGVyQ291bnQ6Zyxub25CYXNpY0FzY2lpQ2hhcmFjdGVyQ291bnQ6Yn19c3RhdGljIGNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0UmVhc29uKHQsbil7Y29uc3Qgcj1uZXcgaHMobik7c3dpdGNoKHIuc2hvdWxkSGlnaGxpZ2h0Tm9uQmFzaWNBU0NJSSh0LG51bGwpKXtjYXNlIDA6cmV0dXJuIG51bGw7Y2FzZSAyOnJldHVybntraW5kOjF9O2Nhc2UgMzp7Y29uc3QgaT10LmNvZGVQb2ludEF0KDApLG89ci5hbWJpZ3VvdXNDaGFyYWN0ZXJzLmdldFByaW1hcnlDb25mdXNhYmxlKGkpLGw9ZXQuZ2V0TG9jYWxlcygpLmZpbHRlcih1PT4hZXQuZ2V0SW5zdGFuY2UobmV3IFNldChbLi4ubi5hbGxvd2VkTG9jYWxlcyx1XSkpLmlzQW1iaWd1b3VzKGkpKTtyZXR1cm57a2luZDowLGNvbmZ1c2FibGVXaXRoOlN0cmluZy5mcm9tQ29kZVBvaW50KG8pLG5vdEFtYmlndW91c0luTG9jYWxlczpsfX1jYXNlIDE6cmV0dXJue2tpbmQ6Mn19fX1mdW5jdGlvbiBQYShlLHQpe3JldHVybmBbJHttaShlLm1hcChyPT5TdHJpbmcuZnJvbUNvZGVQb2ludChyKSkuam9pbigiIikpfV1gfWNsYXNzIGhze2NvbnN0cnVjdG9yKHQpe3RoaXMub3B0aW9ucz10LHRoaXMuYWxsb3dlZENvZGVQb2ludHM9bmV3IFNldCh0LmFsbG93ZWRDb2RlUG9pbnRzKSx0aGlzLmFtYmlndW91c0NoYXJhY3RlcnM9ZXQuZ2V0SW5zdGFuY2UobmV3IFNldCh0LmFsbG93ZWRMb2NhbGVzKSl9Z2V0Q2FuZGlkYXRlQ29kZVBvaW50cygpe2lmKHRoaXMub3B0aW9ucy5ub25CYXNpY0FTQ0lJKXJldHVybiJhbGxOb25CYXNpY0FzY2lpIjtjb25zdCB0PW5ldyBTZXQ7aWYodGhpcy5vcHRpb25zLmludmlzaWJsZUNoYXJhY3RlcnMpZm9yKGNvbnN0IG4gb2YgdHQuY29kZVBvaW50cylmcyhTdHJpbmcuZnJvbUNvZGVQb2ludChuKSl8fHQuYWRkKG4pO2lmKHRoaXMub3B0aW9ucy5hbWJpZ3VvdXNDaGFyYWN0ZXJzKWZvcihjb25zdCBuIG9mIHRoaXMuYW1iaWd1b3VzQ2hhcmFjdGVycy5nZXRDb25mdXNhYmxlQ29kZVBvaW50cygpKXQuYWRkKG4pO2Zvcihjb25zdCBuIG9mIHRoaXMuYWxsb3dlZENvZGVQb2ludHMpdC5kZWxldGUobik7cmV0dXJuIHR9c2hvdWxkSGlnaGxpZ2h0Tm9uQmFzaWNBU0NJSSh0LG4pe2NvbnN0IHI9dC5jb2RlUG9pbnRBdCgwKTtpZih0aGlzLmFsbG93ZWRDb2RlUG9pbnRzLmhhcyhyKSlyZXR1cm4gMDtpZih0aGlzLm9wdGlvbnMubm9uQmFzaWNBU0NJSSlyZXR1cm4gMTtsZXQgcz0hMSxpPSExO2lmKG4pZm9yKGNvbnN0IG8gb2Ygbil7Y29uc3QgbD1vLmNvZGVQb2ludEF0KDApLHU9dmkobyk7cz1zfHx1LCF1JiYhdGhpcy5hbWJpZ3VvdXNDaGFyYWN0ZXJzLmlzQW1iaWd1b3VzKGwpJiYhdHQuaXNJbnZpc2libGVDaGFyYWN0ZXIobCkmJihpPSEwKX1yZXR1cm4hcyYmaT8wOnRoaXMub3B0aW9ucy5pbnZpc2libGVDaGFyYWN0ZXJzJiYhZnModCkmJnR0LmlzSW52aXNpYmxlQ2hhcmFjdGVyKHIpPzI6dGhpcy5vcHRpb25zLmFtYmlndW91c0NoYXJhY3RlcnMmJnRoaXMuYW1iaWd1b3VzQ2hhcmFjdGVycy5pc0FtYmlndW91cyhyKT8zOjB9fWZ1bmN0aW9uIGZzKGUpe3JldHVybiBlPT09IiAifHxlPT09YApgfHxlPT09IgkifWNsYXNzIFN0e2NvbnN0cnVjdG9yKHQsbixyKXt0aGlzLmNoYW5nZXM9dCx0aGlzLm1vdmVzPW4sdGhpcy5oaXRUaW1lb3V0PXJ9fWNsYXNzIEZhe2NvbnN0cnVjdG9yKHQsbil7dGhpcy5saW5lUmFuZ2VNYXBwaW5nPXQsdGhpcy5jaGFuZ2VzPW59fWNsYXNzIFZ7c3RhdGljIGFkZFJhbmdlKHQsbil7bGV0IHI9MDtmb3IoO3I8bi5sZW5ndGgmJm5bcl0uZW5kRXhjbHVzaXZlPHQuc3RhcnQ7KXIrKztsZXQgcz1yO2Zvcig7czxuLmxlbmd0aCYmbltzXS5zdGFydDw9dC5lbmRFeGNsdXNpdmU7KXMrKztpZihyPT09cyluLnNwbGljZShyLDAsdCk7ZWxzZXtjb25zdCBpPU1hdGgubWluKHQuc3RhcnQsbltyXS5zdGFydCksbz1NYXRoLm1heCh0LmVuZEV4Y2x1c2l2ZSxuW3MtMV0uZW5kRXhjbHVzaXZlKTtuLnNwbGljZShyLHMtcixuZXcgVihpLG8pKX19c3RhdGljIHRyeUNyZWF0ZSh0LG4pe2lmKCEodD5uKSlyZXR1cm4gbmV3IFYodCxuKX1zdGF0aWMgb2ZMZW5ndGgodCl7cmV0dXJuIG5ldyBWKDAsdCl9c3RhdGljIG9mU3RhcnRBbmRMZW5ndGgodCxuKXtyZXR1cm4gbmV3IFYodCx0K24pfWNvbnN0cnVjdG9yKHQsbil7aWYodGhpcy5zdGFydD10LHRoaXMuZW5kRXhjbHVzaXZlPW4sdD5uKXRocm93IG5ldyBpZShgSW52YWxpZCByYW5nZTogJHt0aGlzLnRvU3RyaW5nKCl9YCl9Z2V0IGlzRW1wdHkoKXtyZXR1cm4gdGhpcy5zdGFydD09PXRoaXMuZW5kRXhjbHVzaXZlfWRlbHRhKHQpe3JldHVybiBuZXcgVih0aGlzLnN0YXJ0K3QsdGhpcy5lbmRFeGNsdXNpdmUrdCl9ZGVsdGFTdGFydCh0KXtyZXR1cm4gbmV3IFYodGhpcy5zdGFydCt0LHRoaXMuZW5kRXhjbHVzaXZlKX1kZWx0YUVuZCh0KXtyZXR1cm4gbmV3IFYodGhpcy5zdGFydCx0aGlzLmVuZEV4Y2x1c2l2ZSt0KX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuZW5kRXhjbHVzaXZlLXRoaXMuc3RhcnR9dG9TdHJpbmcoKXtyZXR1cm5gWyR7dGhpcy5zdGFydH0sICR7dGhpcy5lbmRFeGNsdXNpdmV9KWB9Y29udGFpbnModCl7cmV0dXJuIHRoaXMuc3RhcnQ8PXQmJnQ8dGhpcy5lbmRFeGNsdXNpdmV9am9pbih0KXtyZXR1cm4gbmV3IFYoTWF0aC5taW4odGhpcy5zdGFydCx0LnN0YXJ0KSxNYXRoLm1heCh0aGlzLmVuZEV4Y2x1c2l2ZSx0LmVuZEV4Y2x1c2l2ZSkpfWludGVyc2VjdCh0KXtjb25zdCBuPU1hdGgubWF4KHRoaXMuc3RhcnQsdC5zdGFydCkscj1NYXRoLm1pbih0aGlzLmVuZEV4Y2x1c2l2ZSx0LmVuZEV4Y2x1c2l2ZSk7aWYobjw9cilyZXR1cm4gbmV3IFYobixyKX1pbnRlcnNlY3RzKHQpe2NvbnN0IG49TWF0aC5tYXgodGhpcy5zdGFydCx0LnN0YXJ0KSxyPU1hdGgubWluKHRoaXMuZW5kRXhjbHVzaXZlLHQuZW5kRXhjbHVzaXZlKTtyZXR1cm4gbjxyfWlzQmVmb3JlKHQpe3JldHVybiB0aGlzLmVuZEV4Y2x1c2l2ZTw9dC5zdGFydH1pc0FmdGVyKHQpe3JldHVybiB0aGlzLnN0YXJ0Pj10LmVuZEV4Y2x1c2l2ZX1zbGljZSh0KXtyZXR1cm4gdC5zbGljZSh0aGlzLnN0YXJ0LHRoaXMuZW5kRXhjbHVzaXZlKX1zdWJzdHJpbmcodCl7cmV0dXJuIHQuc3Vic3RyaW5nKHRoaXMuc3RhcnQsdGhpcy5lbmRFeGNsdXNpdmUpfWNsaXAodCl7aWYodGhpcy5pc0VtcHR5KXRocm93IG5ldyBpZShgSW52YWxpZCBjbGlwcGluZyByYW5nZTogJHt0aGlzLnRvU3RyaW5nKCl9YCk7cmV0dXJuIE1hdGgubWF4KHRoaXMuc3RhcnQsTWF0aC5taW4odGhpcy5lbmRFeGNsdXNpdmUtMSx0KSl9Y2xpcEN5Y2xpYyh0KXtpZih0aGlzLmlzRW1wdHkpdGhyb3cgbmV3IGllKGBJbnZhbGlkIGNsaXBwaW5nIHJhbmdlOiAke3RoaXMudG9TdHJpbmcoKX1gKTtyZXR1cm4gdDx0aGlzLnN0YXJ0P3RoaXMuZW5kRXhjbHVzaXZlLSh0aGlzLnN0YXJ0LXQpJXRoaXMubGVuZ3RoOnQ+PXRoaXMuZW5kRXhjbHVzaXZlP3RoaXMuc3RhcnQrKHQtdGhpcy5zdGFydCkldGhpcy5sZW5ndGg6dH1mb3JFYWNoKHQpe2ZvcihsZXQgbj10aGlzLnN0YXJ0O248dGhpcy5lbmRFeGNsdXNpdmU7bisrKXQobil9fWZ1bmN0aW9uIFVlKGUsdCl7Y29uc3Qgbj1ydChlLHQpO3JldHVybiBuPT09LTE/dm9pZCAwOmVbbl19ZnVuY3Rpb24gcnQoZSx0LG49MCxyPWUubGVuZ3RoKXtsZXQgcz1uLGk9cjtmb3IoO3M8aTspe2NvbnN0IG89TWF0aC5mbG9vcigocytpKS8yKTt0KGVbb10pP3M9bysxOmk9b31yZXR1cm4gcy0xfWZ1bmN0aW9uIERhKGUsdCl7Y29uc3Qgbj1ibihlLHQpO3JldHVybiBuPT09ZS5sZW5ndGg/dm9pZCAwOmVbbl19ZnVuY3Rpb24gYm4oZSx0LG49MCxyPWUubGVuZ3RoKXtsZXQgcz1uLGk9cjtmb3IoO3M8aTspe2NvbnN0IG89TWF0aC5mbG9vcigocytpKS8yKTt0KGVbb10pP2k9bzpzPW8rMX1yZXR1cm4gc31jb25zdCBEdD1jbGFzcyBEdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLl9hcnJheT10LHRoaXMuX2ZpbmRMYXN0TW9ub3Rvbm91c0xhc3RJZHg9MH1maW5kTGFzdE1vbm90b25vdXModCl7aWYoRHQuYXNzZXJ0SW52YXJpYW50cyl7aWYodGhpcy5fcHJldkZpbmRMYXN0UHJlZGljYXRlKXtmb3IoY29uc3QgciBvZiB0aGlzLl9hcnJheSlpZih0aGlzLl9wcmV2RmluZExhc3RQcmVkaWNhdGUocikmJiF0KHIpKXRocm93IG5ldyBFcnJvcigiTW9ub3Rvbm91c0FycmF5OiBjdXJyZW50IHByZWRpY2F0ZSBtdXN0IGJlIHdlYWtlciB0aGFuIChvciBlcXVhbCB0bykgdGhlIHByZXZpb3VzIHByZWRpY2F0ZS4iKX10aGlzLl9wcmV2RmluZExhc3RQcmVkaWNhdGU9dH1jb25zdCBuPXJ0KHRoaXMuX2FycmF5LHQsdGhpcy5fZmluZExhc3RNb25vdG9ub3VzTGFzdElkeCk7cmV0dXJuIHRoaXMuX2ZpbmRMYXN0TW9ub3Rvbm91c0xhc3RJZHg9bisxLG49PT0tMT92b2lkIDA6dGhpcy5fYXJyYXlbbl19fTtEdC5hc3NlcnRJbnZhcmlhbnRzPSExO2xldCBDdD1EdDtjbGFzcyBEe3N0YXRpYyBmcm9tUmFuZ2VJbmNsdXNpdmUodCl7cmV0dXJuIG5ldyBEKHQuc3RhcnRMaW5lTnVtYmVyLHQuZW5kTGluZU51bWJlcisxKX1zdGF0aWMgam9pbk1hbnkodCl7aWYodC5sZW5ndGg9PT0wKXJldHVybltdO2xldCBuPW5ldyBnZSh0WzBdLnNsaWNlKCkpO2ZvcihsZXQgcj0xO3I8dC5sZW5ndGg7cisrKW49bi5nZXRVbmlvbihuZXcgZ2UodFtyXS5zbGljZSgpKSk7cmV0dXJuIG4ucmFuZ2VzfXN0YXRpYyBqb2luKHQpe2lmKHQubGVuZ3RoPT09MCl0aHJvdyBuZXcgaWUoImxpbmVSYW5nZXMgY2Fubm90IGJlIGVtcHR5Iik7bGV0IG49dFswXS5zdGFydExpbmVOdW1iZXIscj10WzBdLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU7Zm9yKGxldCBzPTE7czx0Lmxlbmd0aDtzKyspbj1NYXRoLm1pbihuLHRbc10uc3RhcnRMaW5lTnVtYmVyKSxyPU1hdGgubWF4KHIsdFtzXS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKTtyZXR1cm4gbmV3IEQobixyKX1zdGF0aWMgb2ZMZW5ndGgodCxuKXtyZXR1cm4gbmV3IEQodCx0K24pfXN0YXRpYyBkZXNlcmlhbGl6ZSh0KXtyZXR1cm4gbmV3IEQodFswXSx0WzFdKX1jb25zdHJ1Y3Rvcih0LG4pe2lmKHQ+bil0aHJvdyBuZXcgaWUoYHN0YXJ0TGluZU51bWJlciAke3R9IGNhbm5vdCBiZSBhZnRlciBlbmRMaW5lTnVtYmVyRXhjbHVzaXZlICR7bn1gKTt0aGlzLnN0YXJ0TGluZU51bWJlcj10LHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT1ufWNvbnRhaW5zKHQpe3JldHVybiB0aGlzLnN0YXJ0TGluZU51bWJlcjw9dCYmdDx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmV9Z2V0IGlzRW1wdHkoKXtyZXR1cm4gdGhpcy5zdGFydExpbmVOdW1iZXI9PT10aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmV9ZGVsdGEodCl7cmV0dXJuIG5ldyBEKHRoaXMuc3RhcnRMaW5lTnVtYmVyK3QsdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlK3QpfWRlbHRhTGVuZ3RoKHQpe3JldHVybiBuZXcgRCh0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUrdCl9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtdGhpcy5zdGFydExpbmVOdW1iZXJ9am9pbih0KXtyZXR1cm4gbmV3IEQoTWF0aC5taW4odGhpcy5zdGFydExpbmVOdW1iZXIsdC5zdGFydExpbmVOdW1iZXIpLE1hdGgubWF4KHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSx0LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpKX10b1N0cmluZygpe3JldHVybmBbJHt0aGlzLnN0YXJ0TGluZU51bWJlcn0sJHt0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmV9KWB9aW50ZXJzZWN0KHQpe2NvbnN0IG49TWF0aC5tYXgodGhpcy5zdGFydExpbmVOdW1iZXIsdC5zdGFydExpbmVOdW1iZXIpLHI9TWF0aC5taW4odGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSk7aWYobjw9cilyZXR1cm4gbmV3IEQobixyKX1pbnRlcnNlY3RzU3RyaWN0KHQpe3JldHVybiB0aGlzLnN0YXJ0TGluZU51bWJlcjx0LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUmJnQuc3RhcnRMaW5lTnVtYmVyPHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1vdmVybGFwT3JUb3VjaCh0KXtyZXR1cm4gdGhpcy5zdGFydExpbmVOdW1iZXI8PXQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSYmdC5zdGFydExpbmVOdW1iZXI8PXRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1lcXVhbHModCl7cmV0dXJuIHRoaXMuc3RhcnRMaW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXImJnRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT09PXQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX10b0luY2x1c2l2ZVJhbmdlKCl7cmV0dXJuIHRoaXMuaXNFbXB0eT9udWxsOm5ldyBrKHRoaXMuc3RhcnRMaW5lTnVtYmVyLDEsdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLTEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpfXRvRXhjbHVzaXZlUmFuZ2UoKXtyZXR1cm4gbmV3IGsodGhpcy5zdGFydExpbmVOdW1iZXIsMSx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsMSl9bWFwVG9MaW5lQXJyYXkodCl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9dGhpcy5zdGFydExpbmVOdW1iZXI7cjx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU7cisrKW4ucHVzaCh0KHIpKTtyZXR1cm4gbn1mb3JFYWNoKHQpe2ZvcihsZXQgbj10aGlzLnN0YXJ0TGluZU51bWJlcjtuPHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTtuKyspdChuKX1zZXJpYWxpemUoKXtyZXR1cm5bdGhpcy5zdGFydExpbmVOdW1iZXIsdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlXX1pbmNsdWRlcyh0KXtyZXR1cm4gdGhpcy5zdGFydExpbmVOdW1iZXI8PXQmJnQ8dGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlfXRvT2Zmc2V0UmFuZ2UoKXtyZXR1cm4gbmV3IFYodGhpcy5zdGFydExpbmVOdW1iZXItMSx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSl9fWNsYXNzIGdle2NvbnN0cnVjdG9yKHQ9W10pe3RoaXMuX25vcm1hbGl6ZWRSYW5nZXM9dH1nZXQgcmFuZ2VzKCl7cmV0dXJuIHRoaXMuX25vcm1hbGl6ZWRSYW5nZXN9YWRkUmFuZ2UodCl7aWYodC5sZW5ndGg9PT0wKXJldHVybjtjb25zdCBuPWJuKHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMscz0+cy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPj10LnN0YXJ0TGluZU51bWJlcikscj1ydCh0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLHM9PnMuc3RhcnRMaW5lTnVtYmVyPD10LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpKzE7aWYobj09PXIpdGhpcy5fbm9ybWFsaXplZFJhbmdlcy5zcGxpY2UobiwwLHQpO2Vsc2UgaWYobj09PXItMSl7Y29uc3Qgcz10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW25dO3RoaXMuX25vcm1hbGl6ZWRSYW5nZXNbbl09cy5qb2luKHQpfWVsc2V7Y29uc3Qgcz10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW25dLmpvaW4odGhpcy5fbm9ybWFsaXplZFJhbmdlc1tyLTFdKS5qb2luKHQpO3RoaXMuX25vcm1hbGl6ZWRSYW5nZXMuc3BsaWNlKG4sci1uLHMpfX1jb250YWlucyh0KXtjb25zdCBuPVVlKHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMscj0+ci5zdGFydExpbmVOdW1iZXI8PXQpO3JldHVybiEhbiYmbi5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPnR9aW50ZXJzZWN0cyh0KXtjb25zdCBuPVVlKHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMscj0+ci5zdGFydExpbmVOdW1iZXI8dC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKTtyZXR1cm4hIW4mJm4uZW5kTGluZU51bWJlckV4Y2x1c2l2ZT50LnN0YXJ0TGluZU51bWJlcn1nZXRVbmlvbih0KXtpZih0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aD09PTApcmV0dXJuIHQ7aWYodC5fbm9ybWFsaXplZFJhbmdlcy5sZW5ndGg9PT0wKXJldHVybiB0aGlzO2NvbnN0IG49W107bGV0IHI9MCxzPTAsaT1udWxsO2Zvcig7cjx0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aHx8czx0Ll9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aDspe2xldCBvPW51bGw7aWYocjx0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aCYmczx0Ll9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aCl7Y29uc3QgbD10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW3JdLHU9dC5fbm9ybWFsaXplZFJhbmdlc1tzXTtsLnN0YXJ0TGluZU51bWJlcjx1LnN0YXJ0TGluZU51bWJlcj8obz1sLHIrKyk6KG89dSxzKyspfWVsc2Ugcjx0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aD8obz10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW3JdLHIrKyk6KG89dC5fbm9ybWFsaXplZFJhbmdlc1tzXSxzKyspO2k9PT1udWxsP2k9bzppLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU+PW8uc3RhcnRMaW5lTnVtYmVyP2k9bmV3IEQoaS5zdGFydExpbmVOdW1iZXIsTWF0aC5tYXgoaS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLG8uZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkpOihuLnB1c2goaSksaT1vKX1yZXR1cm4gaSE9PW51bGwmJm4ucHVzaChpKSxuZXcgZ2Uobil9c3VidHJhY3RGcm9tKHQpe2NvbnN0IG49Ym4odGhpcy5fbm9ybWFsaXplZFJhbmdlcyxvPT5vLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU+PXQuc3RhcnRMaW5lTnVtYmVyKSxyPXJ0KHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMsbz0+by5zdGFydExpbmVOdW1iZXI8PXQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkrMTtpZihuPT09cilyZXR1cm4gbmV3IGdlKFt0XSk7Y29uc3Qgcz1bXTtsZXQgaT10LnN0YXJ0TGluZU51bWJlcjtmb3IobGV0IG89bjtvPHI7bysrKXtjb25zdCBsPXRoaXMuX25vcm1hbGl6ZWRSYW5nZXNbb107bC5zdGFydExpbmVOdW1iZXI+aSYmcy5wdXNoKG5ldyBEKGksbC5zdGFydExpbmVOdW1iZXIpKSxpPWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1yZXR1cm4gaTx0LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUmJnMucHVzaChuZXcgRChpLHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkpLG5ldyBnZShzKX10b1N0cmluZygpe3JldHVybiB0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLm1hcCh0PT50LnRvU3RyaW5nKCkpLmpvaW4oIiwgIil9Z2V0SW50ZXJzZWN0aW9uKHQpe2NvbnN0IG49W107bGV0IHI9MCxzPTA7Zm9yKDtyPHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoJiZzPHQuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoOyl7Y29uc3QgaT10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW3JdLG89dC5fbm9ybWFsaXplZFJhbmdlc1tzXSxsPWkuaW50ZXJzZWN0KG8pO2wmJiFsLmlzRW1wdHkmJm4ucHVzaChsKSxpLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU8by5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlP3IrKzpzKyt9cmV0dXJuIG5ldyBnZShuKX1nZXRXaXRoRGVsdGEodCl7cmV0dXJuIG5ldyBnZSh0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLm1hcChuPT5uLmRlbHRhKHQpKSl9fWNvbnN0IEVlPWNsYXNzIEVle3N0YXRpYyBiZXR3ZWVuUG9zaXRpb25zKHQsbil7cmV0dXJuIHQubGluZU51bWJlcj09PW4ubGluZU51bWJlcj9uZXcgRWUoMCxuLmNvbHVtbi10LmNvbHVtbik6bmV3IEVlKG4ubGluZU51bWJlci10LmxpbmVOdW1iZXIsbi5jb2x1bW4tMSl9c3RhdGljIG9mUmFuZ2UodCl7cmV0dXJuIEVlLmJldHdlZW5Qb3NpdGlvbnModC5nZXRTdGFydFBvc2l0aW9uKCksdC5nZXRFbmRQb3NpdGlvbigpKX1zdGF0aWMgb2ZUZXh0KHQpe2xldCBuPTAscj0wO2Zvcihjb25zdCBzIG9mIHQpcz09PWAKYD8obisrLHI9MCk6cisrO3JldHVybiBuZXcgRWUobixyKX1jb25zdHJ1Y3Rvcih0LG4pe3RoaXMubGluZUNvdW50PXQsdGhpcy5jb2x1bW5Db3VudD1ufWlzR3JlYXRlclRoYW5PckVxdWFsVG8odCl7cmV0dXJuIHRoaXMubGluZUNvdW50IT09dC5saW5lQ291bnQ/dGhpcy5saW5lQ291bnQ+dC5saW5lQ291bnQ6dGhpcy5jb2x1bW5Db3VudD49dC5jb2x1bW5Db3VudH1jcmVhdGVSYW5nZSh0KXtyZXR1cm4gdGhpcy5saW5lQ291bnQ9PT0wP25ldyBrKHQubGluZU51bWJlcix0LmNvbHVtbix0LmxpbmVOdW1iZXIsdC5jb2x1bW4rdGhpcy5jb2x1bW5Db3VudCk6bmV3IGsodC5saW5lTnVtYmVyLHQuY29sdW1uLHQubGluZU51bWJlcit0aGlzLmxpbmVDb3VudCx0aGlzLmNvbHVtbkNvdW50KzEpfWFkZFRvUG9zaXRpb24odCl7cmV0dXJuIHRoaXMubGluZUNvdW50PT09MD9uZXcgJCh0LmxpbmVOdW1iZXIsdC5jb2x1bW4rdGhpcy5jb2x1bW5Db3VudCk6bmV3ICQodC5saW5lTnVtYmVyK3RoaXMubGluZUNvdW50LHRoaXMuY29sdW1uQ291bnQrMSl9dG9TdHJpbmcoKXtyZXR1cm5gJHt0aGlzLmxpbmVDb3VudH0sJHt0aGlzLmNvbHVtbkNvdW50fWB9fTtFZS56ZXJvPW5ldyBFZSgwLDApO2xldCBkcz1FZTtjbGFzcyBUYXtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMucmFuZ2U9dCx0aGlzLnRleHQ9bn10b1NpbmdsZUVkaXRPcGVyYXRpb24oKXtyZXR1cm57cmFuZ2U6dGhpcy5yYW5nZSx0ZXh0OnRoaXMudGV4dH19fWNsYXNzIGxle3N0YXRpYyBpbnZlcnNlKHQsbixyKXtjb25zdCBzPVtdO2xldCBpPTEsbz0xO2Zvcihjb25zdCB1IG9mIHQpe2NvbnN0IGM9bmV3IGxlKG5ldyBEKGksdS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIpLG5ldyBEKG8sdS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIpKTtjLm1vZGlmaWVkLmlzRW1wdHl8fHMucHVzaChjKSxpPXUub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxvPXUubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1jb25zdCBsPW5ldyBsZShuZXcgRChpLG4rMSksbmV3IEQobyxyKzEpKTtyZXR1cm4gbC5tb2RpZmllZC5pc0VtcHR5fHxzLnB1c2gobCksc31zdGF0aWMgY2xpcCh0LG4scil7Y29uc3Qgcz1bXTtmb3IoY29uc3QgaSBvZiB0KXtjb25zdCBvPWkub3JpZ2luYWwuaW50ZXJzZWN0KG4pLGw9aS5tb2RpZmllZC5pbnRlcnNlY3Qocik7byYmIW8uaXNFbXB0eSYmbCYmIWwuaXNFbXB0eSYmcy5wdXNoKG5ldyBsZShvLGwpKX1yZXR1cm4gc31jb25zdHJ1Y3Rvcih0LG4pe3RoaXMub3JpZ2luYWw9dCx0aGlzLm1vZGlmaWVkPW59dG9TdHJpbmcoKXtyZXR1cm5geyR7dGhpcy5vcmlnaW5hbC50b1N0cmluZygpfS0+JHt0aGlzLm1vZGlmaWVkLnRvU3RyaW5nKCl9fWB9ZmxpcCgpe3JldHVybiBuZXcgbGUodGhpcy5tb2RpZmllZCx0aGlzLm9yaWdpbmFsKX1qb2luKHQpe3JldHVybiBuZXcgbGUodGhpcy5vcmlnaW5hbC5qb2luKHQub3JpZ2luYWwpLHRoaXMubW9kaWZpZWQuam9pbih0Lm1vZGlmaWVkKSl9dG9SYW5nZU1hcHBpbmcoKXtjb25zdCB0PXRoaXMub3JpZ2luYWwudG9JbmNsdXNpdmVSYW5nZSgpLG49dGhpcy5tb2RpZmllZC50b0luY2x1c2l2ZVJhbmdlKCk7aWYodCYmbilyZXR1cm4gbmV3IGRlKHQsbik7aWYodGhpcy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXI9PT0xfHx0aGlzLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcj09PTEpe2lmKCEodGhpcy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXI9PT0xJiZ0aGlzLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcj09PTEpKXRocm93IG5ldyBpZSgibm90IGEgdmFsaWQgZGlmZiIpO3JldHVybiBuZXcgZGUobmV3IGsodGhpcy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIsMSx0aGlzLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsMSksbmV3IGsodGhpcy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIsMSx0aGlzLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsMSkpfWVsc2UgcmV0dXJuIG5ldyBkZShuZXcgayh0aGlzLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlci0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLHRoaXMub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSxuZXcgayh0aGlzLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlci0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLHRoaXMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSl9dG9SYW5nZU1hcHBpbmcyKHQsbil7aWYobXModGhpcy5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLHQpJiZtcyh0aGlzLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsbikpcmV0dXJuIG5ldyBkZShuZXcgayh0aGlzLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlciwxLHRoaXMub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSwxKSxuZXcgayh0aGlzLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlciwxLHRoaXMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSwxKSk7aWYoIXRoaXMub3JpZ2luYWwuaXNFbXB0eSYmIXRoaXMubW9kaWZpZWQuaXNFbXB0eSlyZXR1cm4gbmV3IGRlKGsuZnJvbVBvc2l0aW9ucyhuZXcgJCh0aGlzLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlciwxKSwkZShuZXcgJCh0aGlzLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksdCkpLGsuZnJvbVBvc2l0aW9ucyhuZXcgJCh0aGlzLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlciwxKSwkZShuZXcgJCh0aGlzLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksbikpKTtpZih0aGlzLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcj4xJiZ0aGlzLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcj4xKXJldHVybiBuZXcgZGUoay5mcm9tUG9zaXRpb25zKCRlKG5ldyAkKHRoaXMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLTEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLHQpLCRlKG5ldyAkKHRoaXMub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSx0KSksay5mcm9tUG9zaXRpb25zKCRlKG5ldyAkKHRoaXMubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLTEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLG4pLCRlKG5ldyAkKHRoaXMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSxuKSkpO3Rocm93IG5ldyBpZX19ZnVuY3Rpb24gJGUoZSx0KXtpZihlLmxpbmVOdW1iZXI8MSlyZXR1cm4gbmV3ICQoMSwxKTtpZihlLmxpbmVOdW1iZXI+dC5sZW5ndGgpcmV0dXJuIG5ldyAkKHQubGVuZ3RoLHRbdC5sZW5ndGgtMV0ubGVuZ3RoKzEpO2NvbnN0IG49dFtlLmxpbmVOdW1iZXItMV07cmV0dXJuIGUuY29sdW1uPm4ubGVuZ3RoKzE/bmV3ICQoZS5saW5lTnVtYmVyLG4ubGVuZ3RoKzEpOmV9ZnVuY3Rpb24gbXMoZSx0KXtyZXR1cm4gZT49MSYmZTw9dC5sZW5ndGh9Y2xhc3MgX2UgZXh0ZW5kcyBsZXtzdGF0aWMgZnJvbVJhbmdlTWFwcGluZ3ModCl7Y29uc3Qgbj1ELmpvaW4odC5tYXAocz0+RC5mcm9tUmFuZ2VJbmNsdXNpdmUocy5vcmlnaW5hbFJhbmdlKSkpLHI9RC5qb2luKHQubWFwKHM9PkQuZnJvbVJhbmdlSW5jbHVzaXZlKHMubW9kaWZpZWRSYW5nZSkpKTtyZXR1cm4gbmV3IF9lKG4scix0KX1jb25zdHJ1Y3Rvcih0LG4scil7c3VwZXIodCxuKSx0aGlzLmlubmVyQ2hhbmdlcz1yfWZsaXAoKXt2YXIgdDtyZXR1cm4gbmV3IF9lKHRoaXMubW9kaWZpZWQsdGhpcy5vcmlnaW5hbCwodD10aGlzLmlubmVyQ2hhbmdlcyk9PW51bGw/dm9pZCAwOnQubWFwKG49Pm4uZmxpcCgpKSl9d2l0aElubmVyQ2hhbmdlc0Zyb21MaW5lUmFuZ2VzKCl7cmV0dXJuIG5ldyBfZSh0aGlzLm9yaWdpbmFsLHRoaXMubW9kaWZpZWQsW3RoaXMudG9SYW5nZU1hcHBpbmcoKV0pfX1jbGFzcyBkZXtzdGF0aWMgYXNzZXJ0U29ydGVkKHQpe2ZvcihsZXQgbj0xO248dC5sZW5ndGg7bisrKXtjb25zdCByPXRbbi0xXSxzPXRbbl07aWYoIShyLm9yaWdpbmFsUmFuZ2UuZ2V0RW5kUG9zaXRpb24oKS5pc0JlZm9yZU9yRXF1YWwocy5vcmlnaW5hbFJhbmdlLmdldFN0YXJ0UG9zaXRpb24oKSkmJnIubW9kaWZpZWRSYW5nZS5nZXRFbmRQb3NpdGlvbigpLmlzQmVmb3JlT3JFcXVhbChzLm1vZGlmaWVkUmFuZ2UuZ2V0U3RhcnRQb3NpdGlvbigpKSkpdGhyb3cgbmV3IGllKCJSYW5nZSBtYXBwaW5ncyBtdXN0IGJlIHNvcnRlZCIpfX1jb25zdHJ1Y3Rvcih0LG4pe3RoaXMub3JpZ2luYWxSYW5nZT10LHRoaXMubW9kaWZpZWRSYW5nZT1ufXRvU3RyaW5nKCl7cmV0dXJuYHske3RoaXMub3JpZ2luYWxSYW5nZS50b1N0cmluZygpfS0+JHt0aGlzLm1vZGlmaWVkUmFuZ2UudG9TdHJpbmcoKX19YH1mbGlwKCl7cmV0dXJuIG5ldyBkZSh0aGlzLm1vZGlmaWVkUmFuZ2UsdGhpcy5vcmlnaW5hbFJhbmdlKX10b1RleHRFZGl0KHQpe2NvbnN0IG49dC5nZXRWYWx1ZU9mUmFuZ2UodGhpcy5tb2RpZmllZFJhbmdlKTtyZXR1cm4gbmV3IFRhKHRoaXMub3JpZ2luYWxSYW5nZSxuKX19Y29uc3QgSWE9MztjbGFzcyBWYXtjb21wdXRlRGlmZih0LG4scil7dmFyIHU7Y29uc3QgaT1uZXcgVWEodCxuLHttYXhDb21wdXRhdGlvblRpbWU6ci5tYXhDb21wdXRhdGlvblRpbWVNcyxzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZTpyLmlnbm9yZVRyaW1XaGl0ZXNwYWNlLHNob3VsZENvbXB1dGVDaGFyQ2hhbmdlczohMCxzaG91bGRNYWtlUHJldHR5RGlmZjohMCxzaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzOiEwfSkuY29tcHV0ZURpZmYoKSxvPVtdO2xldCBsPW51bGw7Zm9yKGNvbnN0IGMgb2YgaS5jaGFuZ2VzKXtsZXQgaDtjLm9yaWdpbmFsRW5kTGluZU51bWJlcj09PTA/aD1uZXcgRChjLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyKzEsYy5vcmlnaW5hbFN0YXJ0TGluZU51bWJlcisxKTpoPW5ldyBEKGMub3JpZ2luYWxTdGFydExpbmVOdW1iZXIsYy5vcmlnaW5hbEVuZExpbmVOdW1iZXIrMSk7bGV0IGY7Yy5tb2RpZmllZEVuZExpbmVOdW1iZXI9PT0wP2Y9bmV3IEQoYy5tb2RpZmllZFN0YXJ0TGluZU51bWJlcisxLGMubW9kaWZpZWRTdGFydExpbmVOdW1iZXIrMSk6Zj1uZXcgRChjLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyLGMubW9kaWZpZWRFbmRMaW5lTnVtYmVyKzEpO2xldCBkPW5ldyBfZShoLGYsKHU9Yy5jaGFyQ2hhbmdlcyk9PW51bGw/dm9pZCAwOnUubWFwKG09Pm5ldyBkZShuZXcgayhtLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyLG0ub3JpZ2luYWxTdGFydENvbHVtbixtLm9yaWdpbmFsRW5kTGluZU51bWJlcixtLm9yaWdpbmFsRW5kQ29sdW1uKSxuZXcgayhtLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyLG0ubW9kaWZpZWRTdGFydENvbHVtbixtLm1vZGlmaWVkRW5kTGluZU51bWJlcixtLm1vZGlmaWVkRW5kQ29sdW1uKSkpKTtsJiYobC5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPT09ZC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXJ8fGwub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT09PWQub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyKSYmKGQ9bmV3IF9lKGwub3JpZ2luYWwuam9pbihkLm9yaWdpbmFsKSxsLm1vZGlmaWVkLmpvaW4oZC5tb2RpZmllZCksbC5pbm5lckNoYW5nZXMmJmQuaW5uZXJDaGFuZ2VzP2wuaW5uZXJDaGFuZ2VzLmNvbmNhdChkLmlubmVyQ2hhbmdlcyk6dm9pZCAwKSxvLnBvcCgpKSxvLnB1c2goZCksbD1kfXJldHVybiBOdCgoKT0+b3MobywoYyxoKT0+aC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItYy5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPT09aC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItYy5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlJiZjLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU8aC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXImJmMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTxoLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcikpLG5ldyBTdChvLFtdLGkucXVpdEVhcmx5KX19ZnVuY3Rpb24gZ3MoZSx0LG4scil7cmV0dXJuIG5ldyBSZShlLHQsbikuQ29tcHV0ZURpZmYocil9bGV0IGJzPWNsYXNze2NvbnN0cnVjdG9yKHQpe2NvbnN0IG49W10scj1bXTtmb3IobGV0IHM9MCxpPXQubGVuZ3RoO3M8aTtzKyspbltzXT14bih0W3NdLDEpLHJbc109cG4odFtzXSwxKTt0aGlzLmxpbmVzPXQsdGhpcy5fc3RhcnRDb2x1bW5zPW4sdGhpcy5fZW5kQ29sdW1ucz1yfWdldEVsZW1lbnRzKCl7Y29uc3QgdD1bXTtmb3IobGV0IG49MCxyPXRoaXMubGluZXMubGVuZ3RoO248cjtuKyspdFtuXT10aGlzLmxpbmVzW25dLnN1YnN0cmluZyh0aGlzLl9zdGFydENvbHVtbnNbbl0tMSx0aGlzLl9lbmRDb2x1bW5zW25dLTEpO3JldHVybiB0fWdldFN0cmljdEVsZW1lbnQodCl7cmV0dXJuIHRoaXMubGluZXNbdF19Z2V0U3RhcnRMaW5lTnVtYmVyKHQpe3JldHVybiB0KzF9Z2V0RW5kTGluZU51bWJlcih0KXtyZXR1cm4gdCsxfWNyZWF0ZUNoYXJTZXF1ZW5jZSh0LG4scil7Y29uc3Qgcz1bXSxpPVtdLG89W107bGV0IGw9MDtmb3IobGV0IHU9bjt1PD1yO3UrKyl7Y29uc3QgYz10aGlzLmxpbmVzW3VdLGg9dD90aGlzLl9zdGFydENvbHVtbnNbdV06MSxmPXQ/dGhpcy5fZW5kQ29sdW1uc1t1XTpjLmxlbmd0aCsxO2ZvcihsZXQgZD1oO2Q8ZjtkKyspc1tsXT1jLmNoYXJDb2RlQXQoZC0xKSxpW2xdPXUrMSxvW2xdPWQsbCsrOyF0JiZ1PHImJihzW2xdPTEwLGlbbF09dSsxLG9bbF09Yy5sZW5ndGgrMSxsKyspfXJldHVybiBuZXcgQmEocyxpLG8pfX07Y2xhc3MgQmF7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuX2NoYXJDb2Rlcz10LHRoaXMuX2xpbmVOdW1iZXJzPW4sdGhpcy5fY29sdW1ucz1yfXRvU3RyaW5nKCl7cmV0dXJuIlsiK3RoaXMuX2NoYXJDb2Rlcy5tYXAoKHQsbik9Pih0PT09MTA/IlxcbiI6U3RyaW5nLmZyb21DaGFyQ29kZSh0KSkrYC0oJHt0aGlzLl9saW5lTnVtYmVyc1tuXX0sJHt0aGlzLl9jb2x1bW5zW25dfSlgKS5qb2luKCIsICIpKyJdIn1fYXNzZXJ0SW5kZXgodCxuKXtpZih0PDB8fHQ+PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSWxsZWdhbCBpbmRleCIpfWdldEVsZW1lbnRzKCl7cmV0dXJuIHRoaXMuX2NoYXJDb2Rlc31nZXRTdGFydExpbmVOdW1iZXIodCl7cmV0dXJuIHQ+MCYmdD09PXRoaXMuX2xpbmVOdW1iZXJzLmxlbmd0aD90aGlzLmdldEVuZExpbmVOdW1iZXIodC0xKToodGhpcy5fYXNzZXJ0SW5kZXgodCx0aGlzLl9saW5lTnVtYmVycyksdGhpcy5fbGluZU51bWJlcnNbdF0pfWdldEVuZExpbmVOdW1iZXIodCl7cmV0dXJuIHQ9PT0tMT90aGlzLmdldFN0YXJ0TGluZU51bWJlcih0KzEpOih0aGlzLl9hc3NlcnRJbmRleCh0LHRoaXMuX2xpbmVOdW1iZXJzKSx0aGlzLl9jaGFyQ29kZXNbdF09PT0xMD90aGlzLl9saW5lTnVtYmVyc1t0XSsxOnRoaXMuX2xpbmVOdW1iZXJzW3RdKX1nZXRTdGFydENvbHVtbih0KXtyZXR1cm4gdD4wJiZ0PT09dGhpcy5fY29sdW1ucy5sZW5ndGg/dGhpcy5nZXRFbmRDb2x1bW4odC0xKToodGhpcy5fYXNzZXJ0SW5kZXgodCx0aGlzLl9jb2x1bW5zKSx0aGlzLl9jb2x1bW5zW3RdKX1nZXRFbmRDb2x1bW4odCl7cmV0dXJuIHQ9PT0tMT90aGlzLmdldFN0YXJ0Q29sdW1uKHQrMSk6KHRoaXMuX2Fzc2VydEluZGV4KHQsdGhpcy5fY29sdW1ucyksdGhpcy5fY2hhckNvZGVzW3RdPT09MTA/MTp0aGlzLl9jb2x1bW5zW3RdKzEpfX1jbGFzcyBIZXtjb25zdHJ1Y3Rvcih0LG4scixzLGksbyxsLHUpe3RoaXMub3JpZ2luYWxTdGFydExpbmVOdW1iZXI9dCx0aGlzLm9yaWdpbmFsU3RhcnRDb2x1bW49bix0aGlzLm9yaWdpbmFsRW5kTGluZU51bWJlcj1yLHRoaXMub3JpZ2luYWxFbmRDb2x1bW49cyx0aGlzLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyPWksdGhpcy5tb2RpZmllZFN0YXJ0Q29sdW1uPW8sdGhpcy5tb2RpZmllZEVuZExpbmVOdW1iZXI9bCx0aGlzLm1vZGlmaWVkRW5kQ29sdW1uPXV9c3RhdGljIGNyZWF0ZUZyb21EaWZmQ2hhbmdlKHQsbixyKXtjb25zdCBzPW4uZ2V0U3RhcnRMaW5lTnVtYmVyKHQub3JpZ2luYWxTdGFydCksaT1uLmdldFN0YXJ0Q29sdW1uKHQub3JpZ2luYWxTdGFydCksbz1uLmdldEVuZExpbmVOdW1iZXIodC5vcmlnaW5hbFN0YXJ0K3Qub3JpZ2luYWxMZW5ndGgtMSksbD1uLmdldEVuZENvbHVtbih0Lm9yaWdpbmFsU3RhcnQrdC5vcmlnaW5hbExlbmd0aC0xKSx1PXIuZ2V0U3RhcnRMaW5lTnVtYmVyKHQubW9kaWZpZWRTdGFydCksYz1yLmdldFN0YXJ0Q29sdW1uKHQubW9kaWZpZWRTdGFydCksaD1yLmdldEVuZExpbmVOdW1iZXIodC5tb2RpZmllZFN0YXJ0K3QubW9kaWZpZWRMZW5ndGgtMSksZj1yLmdldEVuZENvbHVtbih0Lm1vZGlmaWVkU3RhcnQrdC5tb2RpZmllZExlbmd0aC0xKTtyZXR1cm4gbmV3IEhlKHMsaSxvLGwsdSxjLGgsZil9fWZ1bmN0aW9uIHFhKGUpe2lmKGUubGVuZ3RoPD0xKXJldHVybiBlO2NvbnN0IHQ9W2VbMF1dO2xldCBuPXRbMF07Zm9yKGxldCByPTEscz1lLmxlbmd0aDtyPHM7cisrKXtjb25zdCBpPWVbcl0sbz1pLm9yaWdpbmFsU3RhcnQtKG4ub3JpZ2luYWxTdGFydCtuLm9yaWdpbmFsTGVuZ3RoKSxsPWkubW9kaWZpZWRTdGFydC0obi5tb2RpZmllZFN0YXJ0K24ubW9kaWZpZWRMZW5ndGgpO01hdGgubWluKG8sbCk8SWE/KG4ub3JpZ2luYWxMZW5ndGg9aS5vcmlnaW5hbFN0YXJ0K2kub3JpZ2luYWxMZW5ndGgtbi5vcmlnaW5hbFN0YXJ0LG4ubW9kaWZpZWRMZW5ndGg9aS5tb2RpZmllZFN0YXJ0K2kubW9kaWZpZWRMZW5ndGgtbi5tb2RpZmllZFN0YXJ0KToodC5wdXNoKGkpLG49aSl9cmV0dXJuIHR9Y2xhc3Mgc3R7Y29uc3RydWN0b3IodCxuLHIscyxpKXt0aGlzLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyPXQsdGhpcy5vcmlnaW5hbEVuZExpbmVOdW1iZXI9bix0aGlzLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyPXIsdGhpcy5tb2RpZmllZEVuZExpbmVOdW1iZXI9cyx0aGlzLmNoYXJDaGFuZ2VzPWl9c3RhdGljIGNyZWF0ZUZyb21EaWZmUmVzdWx0KHQsbixyLHMsaSxvLGwpe2xldCB1LGMsaCxmLGQ7aWYobi5vcmlnaW5hbExlbmd0aD09PTA/KHU9ci5nZXRTdGFydExpbmVOdW1iZXIobi5vcmlnaW5hbFN0YXJ0KS0xLGM9MCk6KHU9ci5nZXRTdGFydExpbmVOdW1iZXIobi5vcmlnaW5hbFN0YXJ0KSxjPXIuZ2V0RW5kTGluZU51bWJlcihuLm9yaWdpbmFsU3RhcnQrbi5vcmlnaW5hbExlbmd0aC0xKSksbi5tb2RpZmllZExlbmd0aD09PTA/KGg9cy5nZXRTdGFydExpbmVOdW1iZXIobi5tb2RpZmllZFN0YXJ0KS0xLGY9MCk6KGg9cy5nZXRTdGFydExpbmVOdW1iZXIobi5tb2RpZmllZFN0YXJ0KSxmPXMuZ2V0RW5kTGluZU51bWJlcihuLm1vZGlmaWVkU3RhcnQrbi5tb2RpZmllZExlbmd0aC0xKSksbyYmbi5vcmlnaW5hbExlbmd0aD4wJiZuLm9yaWdpbmFsTGVuZ3RoPDIwJiZuLm1vZGlmaWVkTGVuZ3RoPjAmJm4ubW9kaWZpZWRMZW5ndGg8MjAmJmkoKSl7Y29uc3QgbT1yLmNyZWF0ZUNoYXJTZXF1ZW5jZSh0LG4ub3JpZ2luYWxTdGFydCxuLm9yaWdpbmFsU3RhcnQrbi5vcmlnaW5hbExlbmd0aC0xKSxnPXMuY3JlYXRlQ2hhclNlcXVlbmNlKHQsbi5tb2RpZmllZFN0YXJ0LG4ubW9kaWZpZWRTdGFydCtuLm1vZGlmaWVkTGVuZ3RoLTEpO2lmKG0uZ2V0RWxlbWVudHMoKS5sZW5ndGg+MCYmZy5nZXRFbGVtZW50cygpLmxlbmd0aD4wKXtsZXQgYj1ncyhtLGcsaSwhMCkuY2hhbmdlcztsJiYoYj1xYShiKSksZD1bXTtmb3IobGV0IF89MCx2PWIubGVuZ3RoO188djtfKyspZC5wdXNoKEhlLmNyZWF0ZUZyb21EaWZmQ2hhbmdlKGJbX10sbSxnKSl9fXJldHVybiBuZXcgc3QodSxjLGgsZixkKX19Y2xhc3MgVWF7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzPXIuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzLHRoaXMuc2hvdWxkUG9zdFByb2Nlc3NDaGFyQ2hhbmdlcz1yLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMsdGhpcy5zaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZT1yLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLHRoaXMuc2hvdWxkTWFrZVByZXR0eURpZmY9ci5zaG91bGRNYWtlUHJldHR5RGlmZix0aGlzLm9yaWdpbmFsTGluZXM9dCx0aGlzLm1vZGlmaWVkTGluZXM9bix0aGlzLm9yaWdpbmFsPW5ldyBicyh0KSx0aGlzLm1vZGlmaWVkPW5ldyBicyhuKSx0aGlzLmNvbnRpbnVlTGluZURpZmY9eHMoci5tYXhDb21wdXRhdGlvblRpbWUpLHRoaXMuY29udGludWVDaGFyRGlmZj14cyhyLm1heENvbXB1dGF0aW9uVGltZT09PTA/MDpNYXRoLm1pbihyLm1heENvbXB1dGF0aW9uVGltZSw1ZTMpKX1jb21wdXRlRGlmZigpe2lmKHRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoPT09MSYmdGhpcy5vcmlnaW5hbC5saW5lc1swXS5sZW5ndGg9PT0wKXJldHVybiB0aGlzLm1vZGlmaWVkLmxpbmVzLmxlbmd0aD09PTEmJnRoaXMubW9kaWZpZWQubGluZXNbMF0ubGVuZ3RoPT09MD97cXVpdEVhcmx5OiExLGNoYW5nZXM6W119OntxdWl0RWFybHk6ITEsY2hhbmdlczpbe29yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOjEsb3JpZ2luYWxFbmRMaW5lTnVtYmVyOjEsbW9kaWZpZWRTdGFydExpbmVOdW1iZXI6MSxtb2RpZmllZEVuZExpbmVOdW1iZXI6dGhpcy5tb2RpZmllZC5saW5lcy5sZW5ndGgsY2hhckNoYW5nZXM6dm9pZCAwfV19O2lmKHRoaXMubW9kaWZpZWQubGluZXMubGVuZ3RoPT09MSYmdGhpcy5tb2RpZmllZC5saW5lc1swXS5sZW5ndGg9PT0wKXJldHVybntxdWl0RWFybHk6ITEsY2hhbmdlczpbe29yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOjEsb3JpZ2luYWxFbmRMaW5lTnVtYmVyOnRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoLG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyOjEsbW9kaWZpZWRFbmRMaW5lTnVtYmVyOjEsY2hhckNoYW5nZXM6dm9pZCAwfV19O2NvbnN0IHQ9Z3ModGhpcy5vcmlnaW5hbCx0aGlzLm1vZGlmaWVkLHRoaXMuY29udGludWVMaW5lRGlmZix0aGlzLnNob3VsZE1ha2VQcmV0dHlEaWZmKSxuPXQuY2hhbmdlcyxyPXQucXVpdEVhcmx5O2lmKHRoaXMuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2Upe2NvbnN0IGw9W107Zm9yKGxldCB1PTAsYz1uLmxlbmd0aDt1PGM7dSsrKWwucHVzaChzdC5jcmVhdGVGcm9tRGlmZlJlc3VsdCh0aGlzLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLG5bdV0sdGhpcy5vcmlnaW5hbCx0aGlzLm1vZGlmaWVkLHRoaXMuY29udGludWVDaGFyRGlmZix0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyx0aGlzLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMpKTtyZXR1cm57cXVpdEVhcmx5OnIsY2hhbmdlczpsfX1jb25zdCBzPVtdO2xldCBpPTAsbz0wO2ZvcihsZXQgbD0tMSx1PW4ubGVuZ3RoO2w8dTtsKyspe2NvbnN0IGM9bCsxPHU/bltsKzFdOm51bGwsaD1jP2Mub3JpZ2luYWxTdGFydDp0aGlzLm9yaWdpbmFsTGluZXMubGVuZ3RoLGY9Yz9jLm1vZGlmaWVkU3RhcnQ6dGhpcy5tb2RpZmllZExpbmVzLmxlbmd0aDtmb3IoO2k8aCYmbzxmOyl7Y29uc3QgZD10aGlzLm9yaWdpbmFsTGluZXNbaV0sbT10aGlzLm1vZGlmaWVkTGluZXNbb107aWYoZCE9PW0pe3tsZXQgZz14bihkLDEpLGI9eG4obSwxKTtmb3IoO2c+MSYmYj4xOyl7Y29uc3QgXz1kLmNoYXJDb2RlQXQoZy0yKSx2PW0uY2hhckNvZGVBdChiLTIpO2lmKF8hPT12KWJyZWFrO2ctLSxiLS19KGc+MXx8Yj4xKSYmdGhpcy5fcHVzaFRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZShzLGkrMSwxLGcsbysxLDEsYil9e2xldCBnPXBuKGQsMSksYj1wbihtLDEpO2NvbnN0IF89ZC5sZW5ndGgrMSx2PW0ubGVuZ3RoKzE7Zm9yKDtnPF8mJmI8djspe2NvbnN0IFM9ZC5jaGFyQ29kZUF0KGctMSksTj1kLmNoYXJDb2RlQXQoYi0xKTtpZihTIT09TilicmVhaztnKyssYisrfShnPF98fGI8dikmJnRoaXMuX3B1c2hUcmltV2hpdGVzcGFjZUNoYXJDaGFuZ2UocyxpKzEsZyxfLG8rMSxiLHYpfX1pKyssbysrfWMmJihzLnB1c2goc3QuY3JlYXRlRnJvbURpZmZSZXN1bHQodGhpcy5zaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSxjLHRoaXMub3JpZ2luYWwsdGhpcy5tb2RpZmllZCx0aGlzLmNvbnRpbnVlQ2hhckRpZmYsdGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMsdGhpcy5zaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzKSksaSs9Yy5vcmlnaW5hbExlbmd0aCxvKz1jLm1vZGlmaWVkTGVuZ3RoKX1yZXR1cm57cXVpdEVhcmx5OnIsY2hhbmdlczpzfX1fcHVzaFRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZSh0LG4scixzLGksbyxsKXtpZih0aGlzLl9tZXJnZVRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZSh0LG4scixzLGksbyxsKSlyZXR1cm47bGV0IHU7dGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMmJih1PVtuZXcgSGUobixyLG4scyxpLG8saSxsKV0pLHQucHVzaChuZXcgc3QobixuLGksaSx1KSl9X21lcmdlVHJpbVdoaXRlc3BhY2VDaGFyQ2hhbmdlKHQsbixyLHMsaSxvLGwpe2NvbnN0IHU9dC5sZW5ndGg7aWYodT09PTApcmV0dXJuITE7Y29uc3QgYz10W3UtMV07cmV0dXJuIGMub3JpZ2luYWxFbmRMaW5lTnVtYmVyPT09MHx8Yy5tb2RpZmllZEVuZExpbmVOdW1iZXI9PT0wPyExOmMub3JpZ2luYWxFbmRMaW5lTnVtYmVyPT09biYmYy5tb2RpZmllZEVuZExpbmVOdW1iZXI9PT1pPyh0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyYmYy5jaGFyQ2hhbmdlcyYmYy5jaGFyQ2hhbmdlcy5wdXNoKG5ldyBIZShuLHIsbixzLGksbyxpLGwpKSwhMCk6Yy5vcmlnaW5hbEVuZExpbmVOdW1iZXIrMT09PW4mJmMubW9kaWZpZWRFbmRMaW5lTnVtYmVyKzE9PT1pPyhjLm9yaWdpbmFsRW5kTGluZU51bWJlcj1uLGMubW9kaWZpZWRFbmRMaW5lTnVtYmVyPWksdGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMmJmMuY2hhckNoYW5nZXMmJmMuY2hhckNoYW5nZXMucHVzaChuZXcgSGUobixyLG4scyxpLG8saSxsKSksITApOiExfX1mdW5jdGlvbiB4bihlLHQpe2NvbnN0IG49YmkoZSk7cmV0dXJuIG49PT0tMT90Om4rMX1mdW5jdGlvbiBwbihlLHQpe2NvbnN0IG49eGkoZSk7cmV0dXJuIG49PT0tMT90Om4rMn1mdW5jdGlvbiB4cyhlKXtpZihlPT09MClyZXR1cm4oKT0+ITA7Y29uc3QgdD1EYXRlLm5vdygpO3JldHVybigpPT5EYXRlLm5vdygpLXQ8ZX1mdW5jdGlvbiAkYShlLHQsbj0ocixzKT0+cj09PXMpe2lmKGU9PT10KXJldHVybiEwO2lmKCFlfHwhdHx8ZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IHI9MCxzPWUubGVuZ3RoO3I8cztyKyspaWYoIW4oZVtyXSx0W3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbipIYShlLHQpe2xldCBuLHI7Zm9yKGNvbnN0IHMgb2YgZSlyIT09dm9pZCAwJiZ0KHIscyk/bi5wdXNoKHMpOihuJiYoeWllbGQgbiksbj1bc10pLHI9cztuJiYoeWllbGQgbil9ZnVuY3Rpb24gV2EoZSx0KXtmb3IobGV0IG49MDtuPD1lLmxlbmd0aDtuKyspdChuPT09MD92b2lkIDA6ZVtuLTFdLG49PT1lLmxlbmd0aD92b2lkIDA6ZVtuXSl9ZnVuY3Rpb24gemEoZSx0KXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0KG49PT0wP3ZvaWQgMDplW24tMV0sZVtuXSxuKzE9PT1lLmxlbmd0aD92b2lkIDA6ZVtuKzFdKX1mdW5jdGlvbiBPYShlLHQpe2Zvcihjb25zdCBuIG9mIHQpZS5wdXNoKG4pfXZhciBfbjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChpKXtyZXR1cm4gaTwwfWUuaXNMZXNzVGhhbj10O2Z1bmN0aW9uIG4oaSl7cmV0dXJuIGk8PTB9ZS5pc0xlc3NUaGFuT3JFcXVhbD1uO2Z1bmN0aW9uIHIoaSl7cmV0dXJuIGk+MH1lLmlzR3JlYXRlclRoYW49cjtmdW5jdGlvbiBzKGkpe3JldHVybiBpPT09MH1lLmlzTmVpdGhlckxlc3NPckdyZWF0ZXJUaGFuPXMsZS5ncmVhdGVyVGhhbj0xLGUubGVzc1RoYW49LTEsZS5uZWl0aGVyTGVzc09yR3JlYXRlclRoYW49MH0pKF9ufHwoX249e30pKTtmdW5jdGlvbiBBdChlLHQpe3JldHVybihuLHIpPT50KGUobiksZShyKSl9Y29uc3QgUnQ9KGUsdCk9PmUtdDtmdW5jdGlvbiBHYShlKXtyZXR1cm4odCxuKT0+LWUodCxuKX1jb25zdCBRZT1jbGFzcyBRZXtjb25zdHJ1Y3Rvcih0KXt0aGlzLml0ZXJhdGU9dH10b0FycmF5KCl7Y29uc3QgdD1bXTtyZXR1cm4gdGhpcy5pdGVyYXRlKG49Pih0LnB1c2gobiksITApKSx0fWZpbHRlcih0KXtyZXR1cm4gbmV3IFFlKG49PnRoaXMuaXRlcmF0ZShyPT50KHIpP24ocik6ITApKX1tYXAodCl7cmV0dXJuIG5ldyBRZShuPT50aGlzLml0ZXJhdGUocj0+bih0KHIpKSkpfWZpbmRMYXN0KHQpe2xldCBuO3JldHVybiB0aGlzLml0ZXJhdGUocj0+KHQocikmJihuPXIpLCEwKSksbn1maW5kTGFzdE1heEJ5KHQpe2xldCBuLHI9ITA7cmV0dXJuIHRoaXMuaXRlcmF0ZShzPT4oKHJ8fF9uLmlzR3JlYXRlclRoYW4odChzLG4pKSkmJihyPSExLG49cyksITApKSxufX07UWUuZW1wdHk9bmV3IFFlKHQ9Pnt9KTtsZXQgcHM9UWU7Y2xhc3Mgd2V7c3RhdGljIHRyaXZpYWwodCxuKXtyZXR1cm4gbmV3IHdlKFtuZXcgRyhWLm9mTGVuZ3RoKHQubGVuZ3RoKSxWLm9mTGVuZ3RoKG4ubGVuZ3RoKSldLCExKX1zdGF0aWMgdHJpdmlhbFRpbWVkT3V0KHQsbil7cmV0dXJuIG5ldyB3ZShbbmV3IEcoVi5vZkxlbmd0aCh0Lmxlbmd0aCksVi5vZkxlbmd0aChuLmxlbmd0aCkpXSwhMCl9Y29uc3RydWN0b3IodCxuKXt0aGlzLmRpZmZzPXQsdGhpcy5oaXRUaW1lb3V0PW59fWNsYXNzIEd7c3RhdGljIGludmVydCh0LG4pe2NvbnN0IHI9W107cmV0dXJuIFdhKHQsKHMsaSk9PntyLnB1c2goRy5mcm9tT2Zmc2V0UGFpcnMocz9zLmdldEVuZEV4Y2x1c2l2ZXMoKTpMZS56ZXJvLGk/aS5nZXRTdGFydHMoKTpuZXcgTGUobiwocz9zLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUtcy5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlOjApK24pKSl9KSxyfXN0YXRpYyBmcm9tT2Zmc2V0UGFpcnModCxuKXtyZXR1cm4gbmV3IEcobmV3IFYodC5vZmZzZXQxLG4ub2Zmc2V0MSksbmV3IFYodC5vZmZzZXQyLG4ub2Zmc2V0MikpfXN0YXRpYyBhc3NlcnRTb3J0ZWQodCl7bGV0IG47Zm9yKGNvbnN0IHIgb2YgdCl7aWYobiYmIShuLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmU8PXIuc2VxMVJhbmdlLnN0YXJ0JiZuLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmU8PXIuc2VxMlJhbmdlLnN0YXJ0KSl0aHJvdyBuZXcgaWUoIlNlcXVlbmNlIGRpZmZzIG11c3QgYmUgc29ydGVkIik7bj1yfX1jb25zdHJ1Y3Rvcih0LG4pe3RoaXMuc2VxMVJhbmdlPXQsdGhpcy5zZXEyUmFuZ2U9bn1zd2FwKCl7cmV0dXJuIG5ldyBHKHRoaXMuc2VxMlJhbmdlLHRoaXMuc2VxMVJhbmdlKX10b1N0cmluZygpe3JldHVybmAke3RoaXMuc2VxMVJhbmdlfSA8LT4gJHt0aGlzLnNlcTJSYW5nZX1gfWpvaW4odCl7cmV0dXJuIG5ldyBHKHRoaXMuc2VxMVJhbmdlLmpvaW4odC5zZXExUmFuZ2UpLHRoaXMuc2VxMlJhbmdlLmpvaW4odC5zZXEyUmFuZ2UpKX1kZWx0YSh0KXtyZXR1cm4gdD09PTA/dGhpczpuZXcgRyh0aGlzLnNlcTFSYW5nZS5kZWx0YSh0KSx0aGlzLnNlcTJSYW5nZS5kZWx0YSh0KSl9ZGVsdGFTdGFydCh0KXtyZXR1cm4gdD09PTA/dGhpczpuZXcgRyh0aGlzLnNlcTFSYW5nZS5kZWx0YVN0YXJ0KHQpLHRoaXMuc2VxMlJhbmdlLmRlbHRhU3RhcnQodCkpfWRlbHRhRW5kKHQpe3JldHVybiB0PT09MD90aGlzOm5ldyBHKHRoaXMuc2VxMVJhbmdlLmRlbHRhRW5kKHQpLHRoaXMuc2VxMlJhbmdlLmRlbHRhRW5kKHQpKX1pbnRlcnNlY3QodCl7Y29uc3Qgbj10aGlzLnNlcTFSYW5nZS5pbnRlcnNlY3QodC5zZXExUmFuZ2UpLHI9dGhpcy5zZXEyUmFuZ2UuaW50ZXJzZWN0KHQuc2VxMlJhbmdlKTtpZighKCFufHwhcikpcmV0dXJuIG5ldyBHKG4scil9Z2V0U3RhcnRzKCl7cmV0dXJuIG5ldyBMZSh0aGlzLnNlcTFSYW5nZS5zdGFydCx0aGlzLnNlcTJSYW5nZS5zdGFydCl9Z2V0RW5kRXhjbHVzaXZlcygpe3JldHVybiBuZXcgTGUodGhpcy5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlLHRoaXMuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZSl9fWNvbnN0IE1lPWNsYXNzIE1le2NvbnN0cnVjdG9yKHQsbil7dGhpcy5vZmZzZXQxPXQsdGhpcy5vZmZzZXQyPW59dG9TdHJpbmcoKXtyZXR1cm5gJHt0aGlzLm9mZnNldDF9IDwtPiAke3RoaXMub2Zmc2V0Mn1gfWRlbHRhKHQpe3JldHVybiB0PT09MD90aGlzOm5ldyBNZSh0aGlzLm9mZnNldDErdCx0aGlzLm9mZnNldDIrdCl9ZXF1YWxzKHQpe3JldHVybiB0aGlzLm9mZnNldDE9PT10Lm9mZnNldDEmJnRoaXMub2Zmc2V0Mj09PXQub2Zmc2V0Mn19O01lLnplcm89bmV3IE1lKDAsMCksTWUubWF4PW5ldyBNZShOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7bGV0IExlPU1lO2NvbnN0IFR0PWNsYXNzIFR0e2lzVmFsaWQoKXtyZXR1cm4hMH19O1R0Lmluc3RhbmNlPW5ldyBUdDtsZXQgaXQ9VHQ7Y2xhc3MgamF7Y29uc3RydWN0b3IodCl7aWYodGhpcy50aW1lb3V0PXQsdGhpcy5zdGFydFRpbWU9RGF0ZS5ub3coKSx0aGlzLnZhbGlkPSEwLHQ8PTApdGhyb3cgbmV3IGllKCJ0aW1lb3V0IG11c3QgYmUgcG9zaXRpdmUiKX1pc1ZhbGlkKCl7aWYoIShEYXRlLm5vdygpLXRoaXMuc3RhcnRUaW1lPHRoaXMudGltZW91dCkmJnRoaXMudmFsaWQpe3RoaXMudmFsaWQ9ITE7ZGVidWdnZXJ9cmV0dXJuIHRoaXMudmFsaWR9fWNsYXNzIHdue2NvbnN0cnVjdG9yKHQsbil7dGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PW4sdGhpcy5hcnJheT1bXSx0aGlzLmFycmF5PW5ldyBBcnJheSh0Km4pfWdldCh0LG4pe3JldHVybiB0aGlzLmFycmF5W3Qrbip0aGlzLndpZHRoXX1zZXQodCxuLHIpe3RoaXMuYXJyYXlbdCtuKnRoaXMud2lkdGhdPXJ9fWZ1bmN0aW9uIExuKGUpe3JldHVybiBlPT09MzJ8fGU9PT05fWNvbnN0IGN0PWNsYXNzIGN0e3N0YXRpYyBnZXRLZXkodCl7bGV0IG49dGhpcy5jaHJLZXlzLmdldCh0KTtyZXR1cm4gbj09PXZvaWQgMCYmKG49dGhpcy5jaHJLZXlzLnNpemUsdGhpcy5jaHJLZXlzLnNldCh0LG4pKSxufWNvbnN0cnVjdG9yKHQsbixyKXt0aGlzLnJhbmdlPXQsdGhpcy5saW5lcz1uLHRoaXMuc291cmNlPXIsdGhpcy5oaXN0b2dyYW09W107bGV0IHM9MDtmb3IobGV0IGk9dC5zdGFydExpbmVOdW1iZXItMTtpPHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xO2krKyl7Y29uc3Qgbz1uW2ldO2ZvcihsZXQgdT0wO3U8by5sZW5ndGg7dSsrKXtzKys7Y29uc3QgYz1vW3VdLGg9Y3QuZ2V0S2V5KGMpO3RoaXMuaGlzdG9ncmFtW2hdPSh0aGlzLmhpc3RvZ3JhbVtoXXx8MCkrMX1zKys7Y29uc3QgbD1jdC5nZXRLZXkoYApgKTt0aGlzLmhpc3RvZ3JhbVtsXT0odGhpcy5oaXN0b2dyYW1bbF18fDApKzF9dGhpcy50b3RhbENvdW50PXN9Y29tcHV0ZVNpbWlsYXJpdHkodCl7bGV0IG49MDtjb25zdCByPU1hdGgubWF4KHRoaXMuaGlzdG9ncmFtLmxlbmd0aCx0Lmhpc3RvZ3JhbS5sZW5ndGgpO2ZvcihsZXQgcz0wO3M8cjtzKyspbis9TWF0aC5hYnMoKHRoaXMuaGlzdG9ncmFtW3NdPz8wKS0odC5oaXN0b2dyYW1bc10/PzApKTtyZXR1cm4gMS1uLyh0aGlzLnRvdGFsQ291bnQrdC50b3RhbENvdW50KX19O2N0LmNocktleXM9bmV3IE1hcDtsZXQgeXQ9Y3Q7Y2xhc3MgWGF7Y29tcHV0ZSh0LG4scj1pdC5pbnN0YW5jZSxzKXtpZih0Lmxlbmd0aD09PTB8fG4ubGVuZ3RoPT09MClyZXR1cm4gd2UudHJpdmlhbCh0LG4pO2NvbnN0IGk9bmV3IHduKHQubGVuZ3RoLG4ubGVuZ3RoKSxvPW5ldyB3bih0Lmxlbmd0aCxuLmxlbmd0aCksbD1uZXcgd24odC5sZW5ndGgsbi5sZW5ndGgpO2ZvcihsZXQgZz0wO2c8dC5sZW5ndGg7ZysrKWZvcihsZXQgYj0wO2I8bi5sZW5ndGg7YisrKXtpZighci5pc1ZhbGlkKCkpcmV0dXJuIHdlLnRyaXZpYWxUaW1lZE91dCh0LG4pO2NvbnN0IF89Zz09PTA/MDppLmdldChnLTEsYiksdj1iPT09MD8wOmkuZ2V0KGcsYi0xKTtsZXQgUzt0LmdldEVsZW1lbnQoZyk9PT1uLmdldEVsZW1lbnQoYik/KGc9PT0wfHxiPT09MD9TPTA6Uz1pLmdldChnLTEsYi0xKSxnPjAmJmI+MCYmby5nZXQoZy0xLGItMSk9PT0zJiYoUys9bC5nZXQoZy0xLGItMSkpLFMrPXM/cyhnLGIpOjEpOlM9LTE7Y29uc3QgTj1NYXRoLm1heChfLHYsUyk7aWYoTj09PVMpe2NvbnN0IHA9Zz4wJiZiPjA/bC5nZXQoZy0xLGItMSk6MDtsLnNldChnLGIscCsxKSxvLnNldChnLGIsMyl9ZWxzZSBOPT09Xz8obC5zZXQoZyxiLDApLG8uc2V0KGcsYiwxKSk6Tj09PXYmJihsLnNldChnLGIsMCksby5zZXQoZyxiLDIpKTtpLnNldChnLGIsTil9Y29uc3QgdT1bXTtsZXQgYz10Lmxlbmd0aCxoPW4ubGVuZ3RoO2Z1bmN0aW9uIGYoZyxiKXsoZysxIT09Y3x8YisxIT09aCkmJnUucHVzaChuZXcgRyhuZXcgVihnKzEsYyksbmV3IFYoYisxLGgpKSksYz1nLGg9Yn1sZXQgZD10Lmxlbmd0aC0xLG09bi5sZW5ndGgtMTtmb3IoO2Q+PTAmJm0+PTA7KW8uZ2V0KGQsbSk9PT0zPyhmKGQsbSksZC0tLG0tLSk6by5nZXQoZCxtKT09PTE/ZC0tOm0tLTtyZXR1cm4gZigtMSwtMSksdS5yZXZlcnNlKCksbmV3IHdlKHUsITEpfX1jbGFzcyBfc3tjb21wdXRlKHQsbixyPWl0Lmluc3RhbmNlKXtpZih0Lmxlbmd0aD09PTB8fG4ubGVuZ3RoPT09MClyZXR1cm4gd2UudHJpdmlhbCh0LG4pO2NvbnN0IHM9dCxpPW47ZnVuY3Rpb24gbyhiLF8pe2Zvcig7YjxzLmxlbmd0aCYmXzxpLmxlbmd0aCYmcy5nZXRFbGVtZW50KGIpPT09aS5nZXRFbGVtZW50KF8pOyliKyssXysrO3JldHVybiBifWxldCBsPTA7Y29uc3QgdT1uZXcgUWE7dS5zZXQoMCxvKDAsMCkpO2NvbnN0IGM9bmV3IFlhO2Muc2V0KDAsdS5nZXQoMCk9PT0wP251bGw6bmV3IHdzKG51bGwsMCwwLHUuZ2V0KDApKSk7bGV0IGg9MDtlOmZvcig7Oyl7aWYobCsrLCFyLmlzVmFsaWQoKSlyZXR1cm4gd2UudHJpdmlhbFRpbWVkT3V0KHMsaSk7Y29uc3QgYj0tTWF0aC5taW4obCxpLmxlbmd0aCtsJTIpLF89TWF0aC5taW4obCxzLmxlbmd0aCtsJTIpO2ZvcihoPWI7aDw9XztoKz0yKXtjb25zdCB2PWg9PT1fPy0xOnUuZ2V0KGgrMSksUz1oPT09Yj8tMTp1LmdldChoLTEpKzEsTj1NYXRoLm1pbihNYXRoLm1heCh2LFMpLHMubGVuZ3RoKSxwPU4taDtpZihOPnMubGVuZ3RofHxwPmkubGVuZ3RoKWNvbnRpbnVlO2NvbnN0IHg9byhOLHApO3Uuc2V0KGgseCk7Y29uc3QgTD1OPT09dj9jLmdldChoKzEpOmMuZ2V0KGgtMSk7aWYoYy5zZXQoaCx4IT09Tj9uZXcgd3MoTCxOLHAseC1OKTpMKSx1LmdldChoKT09PXMubGVuZ3RoJiZ1LmdldChoKS1oPT09aS5sZW5ndGgpYnJlYWsgZX19bGV0IGY9Yy5nZXQoaCk7Y29uc3QgZD1bXTtsZXQgbT1zLmxlbmd0aCxnPWkubGVuZ3RoO2Zvcig7Oyl7Y29uc3QgYj1mP2YueCtmLmxlbmd0aDowLF89Zj9mLnkrZi5sZW5ndGg6MDtpZigoYiE9PW18fF8hPT1nKSYmZC5wdXNoKG5ldyBHKG5ldyBWKGIsbSksbmV3IFYoXyxnKSkpLCFmKWJyZWFrO209Zi54LGc9Zi55LGY9Zi5wcmV2fXJldHVybiBkLnJldmVyc2UoKSxuZXcgd2UoZCwhMSl9fWNsYXNzIHdze2NvbnN0cnVjdG9yKHQsbixyLHMpe3RoaXMucHJldj10LHRoaXMueD1uLHRoaXMueT1yLHRoaXMubGVuZ3RoPXN9fWNsYXNzIFFhe2NvbnN0cnVjdG9yKCl7dGhpcy5wb3NpdGl2ZUFycj1uZXcgSW50MzJBcnJheSgxMCksdGhpcy5uZWdhdGl2ZUFycj1uZXcgSW50MzJBcnJheSgxMCl9Z2V0KHQpe3JldHVybiB0PDA/KHQ9LXQtMSx0aGlzLm5lZ2F0aXZlQXJyW3RdKTp0aGlzLnBvc2l0aXZlQXJyW3RdfXNldCh0LG4pe2lmKHQ8MCl7aWYodD0tdC0xLHQ+PXRoaXMubmVnYXRpdmVBcnIubGVuZ3RoKXtjb25zdCByPXRoaXMubmVnYXRpdmVBcnI7dGhpcy5uZWdhdGl2ZUFycj1uZXcgSW50MzJBcnJheShyLmxlbmd0aCoyKSx0aGlzLm5lZ2F0aXZlQXJyLnNldChyKX10aGlzLm5lZ2F0aXZlQXJyW3RdPW59ZWxzZXtpZih0Pj10aGlzLnBvc2l0aXZlQXJyLmxlbmd0aCl7Y29uc3Qgcj10aGlzLnBvc2l0aXZlQXJyO3RoaXMucG9zaXRpdmVBcnI9bmV3IEludDMyQXJyYXkoci5sZW5ndGgqMiksdGhpcy5wb3NpdGl2ZUFyci5zZXQocil9dGhpcy5wb3NpdGl2ZUFyclt0XT1ufX19Y2xhc3MgWWF7Y29uc3RydWN0b3IoKXt0aGlzLnBvc2l0aXZlQXJyPVtdLHRoaXMubmVnYXRpdmVBcnI9W119Z2V0KHQpe3JldHVybiB0PDA/KHQ9LXQtMSx0aGlzLm5lZ2F0aXZlQXJyW3RdKTp0aGlzLnBvc2l0aXZlQXJyW3RdfXNldCh0LG4pe3Q8MD8odD0tdC0xLHRoaXMubmVnYXRpdmVBcnJbdF09bik6dGhpcy5wb3NpdGl2ZUFyclt0XT1ufX1jbGFzcyBFdHtjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy5saW5lcz10LHRoaXMucmFuZ2U9bix0aGlzLmNvbnNpZGVyV2hpdGVzcGFjZUNoYW5nZXM9cix0aGlzLmVsZW1lbnRzPVtdLHRoaXMuZmlyc3RFbGVtZW50T2Zmc2V0QnlMaW5lSWR4PVtdLHRoaXMubGluZVN0YXJ0T2Zmc2V0cz1bXSx0aGlzLnRyaW1tZWRXc0xlbmd0aHNCeUxpbmVJZHg9W10sdGhpcy5maXJzdEVsZW1lbnRPZmZzZXRCeUxpbmVJZHgucHVzaCgwKTtmb3IobGV0IHM9dGhpcy5yYW5nZS5zdGFydExpbmVOdW1iZXI7czw9dGhpcy5yYW5nZS5lbmRMaW5lTnVtYmVyO3MrKyl7bGV0IGk9dFtzLTFdLG89MDtzPT09dGhpcy5yYW5nZS5zdGFydExpbmVOdW1iZXImJnRoaXMucmFuZ2Uuc3RhcnRDb2x1bW4+MSYmKG89dGhpcy5yYW5nZS5zdGFydENvbHVtbi0xLGk9aS5zdWJzdHJpbmcobykpLHRoaXMubGluZVN0YXJ0T2Zmc2V0cy5wdXNoKG8pO2xldCBsPTA7aWYoIXIpe2NvbnN0IGM9aS50cmltU3RhcnQoKTtsPWkubGVuZ3RoLWMubGVuZ3RoLGk9Yy50cmltRW5kKCl9dGhpcy50cmltbWVkV3NMZW5ndGhzQnlMaW5lSWR4LnB1c2gobCk7Y29uc3QgdT1zPT09dGhpcy5yYW5nZS5lbmRMaW5lTnVtYmVyP01hdGgubWluKHRoaXMucmFuZ2UuZW5kQ29sdW1uLTEtby1sLGkubGVuZ3RoKTppLmxlbmd0aDtmb3IobGV0IGM9MDtjPHU7YysrKXRoaXMuZWxlbWVudHMucHVzaChpLmNoYXJDb2RlQXQoYykpO3M8dGhpcy5yYW5nZS5lbmRMaW5lTnVtYmVyJiYodGhpcy5lbGVtZW50cy5wdXNoKDEwKSx0aGlzLmZpcnN0RWxlbWVudE9mZnNldEJ5TGluZUlkeC5wdXNoKHRoaXMuZWxlbWVudHMubGVuZ3RoKSl9fXRvU3RyaW5nKCl7cmV0dXJuYFNsaWNlOiAiJHt0aGlzLnRleHR9ImB9Z2V0IHRleHQoKXtyZXR1cm4gdGhpcy5nZXRUZXh0KG5ldyBWKDAsdGhpcy5sZW5ndGgpKX1nZXRUZXh0KHQpe3JldHVybiB0aGlzLmVsZW1lbnRzLnNsaWNlKHQuc3RhcnQsdC5lbmRFeGNsdXNpdmUpLm1hcChuPT5TdHJpbmcuZnJvbUNoYXJDb2RlKG4pKS5qb2luKCIiKX1nZXRFbGVtZW50KHQpe3JldHVybiB0aGlzLmVsZW1lbnRzW3RdfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5sZW5ndGh9Z2V0Qm91bmRhcnlTY29yZSh0KXtjb25zdCBuPXZzKHQ+MD90aGlzLmVsZW1lbnRzW3QtMV06LTEpLHI9dnModDx0aGlzLmVsZW1lbnRzLmxlbmd0aD90aGlzLmVsZW1lbnRzW3RdOi0xKTtpZihuPT09NyYmcj09PTgpcmV0dXJuIDA7aWYobj09PTgpcmV0dXJuIDE1MDtsZXQgcz0wO3JldHVybiBuIT09ciYmKHMrPTEwLG49PT0wJiZyPT09MSYmKHMrPTEpKSxzKz1McyhuKSxzKz1McyhyKSxzfXRyYW5zbGF0ZU9mZnNldCh0LG49InJpZ2h0Iil7Y29uc3Qgcj1ydCh0aGlzLmZpcnN0RWxlbWVudE9mZnNldEJ5TGluZUlkeCxpPT5pPD10KSxzPXQtdGhpcy5maXJzdEVsZW1lbnRPZmZzZXRCeUxpbmVJZHhbcl07cmV0dXJuIG5ldyAkKHRoaXMucmFuZ2Uuc3RhcnRMaW5lTnVtYmVyK3IsMSt0aGlzLmxpbmVTdGFydE9mZnNldHNbcl0rcysocz09PTAmJm49PT0ibGVmdCI/MDp0aGlzLnRyaW1tZWRXc0xlbmd0aHNCeUxpbmVJZHhbcl0pKX10cmFuc2xhdGVSYW5nZSh0KXtjb25zdCBuPXRoaXMudHJhbnNsYXRlT2Zmc2V0KHQuc3RhcnQsInJpZ2h0Iikscj10aGlzLnRyYW5zbGF0ZU9mZnNldCh0LmVuZEV4Y2x1c2l2ZSwibGVmdCIpO3JldHVybiByLmlzQmVmb3JlKG4pP2suZnJvbVBvc2l0aW9ucyhyLHIpOmsuZnJvbVBvc2l0aW9ucyhuLHIpfWZpbmRXb3JkQ29udGFpbmluZyh0KXtpZih0PDB8fHQ+PXRoaXMuZWxlbWVudHMubGVuZ3RofHwhdm4odGhpcy5lbGVtZW50c1t0XSkpcmV0dXJuO2xldCBuPXQ7Zm9yKDtuPjAmJnZuKHRoaXMuZWxlbWVudHNbbi0xXSk7KW4tLTtsZXQgcj10O2Zvcig7cjx0aGlzLmVsZW1lbnRzLmxlbmd0aCYmdm4odGhpcy5lbGVtZW50c1tyXSk7KXIrKztyZXR1cm4gbmV3IFYobixyKX1jb3VudExpbmVzSW4odCl7cmV0dXJuIHRoaXMudHJhbnNsYXRlT2Zmc2V0KHQuZW5kRXhjbHVzaXZlKS5saW5lTnVtYmVyLXRoaXMudHJhbnNsYXRlT2Zmc2V0KHQuc3RhcnQpLmxpbmVOdW1iZXJ9aXNTdHJvbmdseUVxdWFsKHQsbil7cmV0dXJuIHRoaXMuZWxlbWVudHNbdF09PT10aGlzLmVsZW1lbnRzW25dfWV4dGVuZFRvRnVsbExpbmVzKHQpe2NvbnN0IG49VWUodGhpcy5maXJzdEVsZW1lbnRPZmZzZXRCeUxpbmVJZHgscz0+czw9dC5zdGFydCk/PzAscj1EYSh0aGlzLmZpcnN0RWxlbWVudE9mZnNldEJ5TGluZUlkeCxzPT50LmVuZEV4Y2x1c2l2ZTw9cyk/P3RoaXMuZWxlbWVudHMubGVuZ3RoO3JldHVybiBuZXcgVihuLHIpfX1mdW5jdGlvbiB2bihlKXtyZXR1cm4gZT49OTcmJmU8PTEyMnx8ZT49NjUmJmU8PTkwfHxlPj00OCYmZTw9NTd9Y29uc3QgSmE9ezA6MCwxOjAsMjowLDM6MTAsNDoyLDU6MzAsNjozLDc6MTAsODoxMH07ZnVuY3Rpb24gTHMoZSl7cmV0dXJuIEphW2VdfWZ1bmN0aW9uIHZzKGUpe3JldHVybiBlPT09MTA/ODplPT09MTM/NzpMbihlKT82OmU+PTk3JiZlPD0xMjI/MDplPj02NSYmZTw9OTA/MTplPj00OCYmZTw9NTc/MjplPT09LTE/MzplPT09NDR8fGU9PT01OT81OjR9ZnVuY3Rpb24gWmEoZSx0LG4scixzLGkpe2xldHttb3ZlczpvLGV4Y2x1ZGVkQ2hhbmdlczpsfT1lMShlLHQsbixpKTtpZighaS5pc1ZhbGlkKCkpcmV0dXJuW107Y29uc3QgdT1lLmZpbHRlcihoPT4hbC5oYXMoaCkpLGM9dDEodSxyLHMsdCxuLGkpO3JldHVybiBPYShvLGMpLG89bjEobyksbz1vLmZpbHRlcihoPT57Y29uc3QgZj1oLm9yaWdpbmFsLnRvT2Zmc2V0UmFuZ2UoKS5zbGljZSh0KS5tYXAobT0+bS50cmltKCkpO3JldHVybiBmLmpvaW4oYApgKS5sZW5ndGg+PTE1JiZLYShmLG09Pm0ubGVuZ3RoPj0yKT49Mn0pLG89cjEoZSxvKSxvfWZ1bmN0aW9uIEthKGUsdCl7bGV0IG49MDtmb3IoY29uc3QgciBvZiBlKXQocikmJm4rKztyZXR1cm4gbn1mdW5jdGlvbiBlMShlLHQsbixyKXtjb25zdCBzPVtdLGk9ZS5maWx0ZXIodT0+dS5tb2RpZmllZC5pc0VtcHR5JiZ1Lm9yaWdpbmFsLmxlbmd0aD49MykubWFwKHU9Pm5ldyB5dCh1Lm9yaWdpbmFsLHQsdSkpLG89bmV3IFNldChlLmZpbHRlcih1PT51Lm9yaWdpbmFsLmlzRW1wdHkmJnUubW9kaWZpZWQubGVuZ3RoPj0zKS5tYXAodT0+bmV3IHl0KHUubW9kaWZpZWQsbix1KSkpLGw9bmV3IFNldDtmb3IoY29uc3QgdSBvZiBpKXtsZXQgYz0tMSxoO2Zvcihjb25zdCBmIG9mIG8pe2NvbnN0IGQ9dS5jb21wdXRlU2ltaWxhcml0eShmKTtkPmMmJihjPWQsaD1mKX1pZihjPi45JiZoJiYoby5kZWxldGUoaCkscy5wdXNoKG5ldyBsZSh1LnJhbmdlLGgucmFuZ2UpKSxsLmFkZCh1LnNvdXJjZSksbC5hZGQoaC5zb3VyY2UpKSwhci5pc1ZhbGlkKCkpcmV0dXJue21vdmVzOnMsZXhjbHVkZWRDaGFuZ2VzOmx9fXJldHVybnttb3ZlczpzLGV4Y2x1ZGVkQ2hhbmdlczpsfX1mdW5jdGlvbiB0MShlLHQsbixyLHMsaSl7Y29uc3Qgbz1bXSxsPW5ldyB3YTtmb3IoY29uc3QgZCBvZiBlKWZvcihsZXQgbT1kLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcjttPGQub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0yO20rKyl7Y29uc3QgZz1gJHt0W20tMV19OiR7dFttKzEtMV19OiR7dFttKzItMV19YDtsLmFkZChnLHtyYW5nZTpuZXcgRChtLG0rMyl9KX1jb25zdCB1PVtdO2Uuc29ydChBdChkPT5kLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcixSdCkpO2Zvcihjb25zdCBkIG9mIGUpe2xldCBtPVtdO2ZvcihsZXQgZz1kLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcjtnPGQubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0yO2crKyl7Y29uc3QgYj1gJHtuW2ctMV19OiR7bltnKzEtMV19OiR7bltnKzItMV19YCxfPW5ldyBEKGcsZyszKSx2PVtdO2wuZm9yRWFjaChiLCh7cmFuZ2U6U30pPT57Zm9yKGNvbnN0IHAgb2YgbSlpZihwLm9yaWdpbmFsTGluZVJhbmdlLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUrMT09PVMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSYmcC5tb2RpZmllZExpbmVSYW5nZS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKzE9PT1fLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpe3Aub3JpZ2luYWxMaW5lUmFuZ2U9bmV3IEQocC5vcmlnaW5hbExpbmVSYW5nZS5zdGFydExpbmVOdW1iZXIsUy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKSxwLm1vZGlmaWVkTGluZVJhbmdlPW5ldyBEKHAubW9kaWZpZWRMaW5lUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLF8uZW5kTGluZU51bWJlckV4Y2x1c2l2ZSksdi5wdXNoKHApO3JldHVybn1jb25zdCBOPXttb2RpZmllZExpbmVSYW5nZTpfLG9yaWdpbmFsTGluZVJhbmdlOlN9O3UucHVzaChOKSx2LnB1c2goTil9KSxtPXZ9aWYoIWkuaXNWYWxpZCgpKXJldHVybltdfXUuc29ydChHYShBdChkPT5kLm1vZGlmaWVkTGluZVJhbmdlLmxlbmd0aCxSdCkpKTtjb25zdCBjPW5ldyBnZSxoPW5ldyBnZTtmb3IoY29uc3QgZCBvZiB1KXtjb25zdCBtPWQubW9kaWZpZWRMaW5lUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLWQub3JpZ2luYWxMaW5lUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLGc9Yy5zdWJ0cmFjdEZyb20oZC5tb2RpZmllZExpbmVSYW5nZSksYj1oLnN1YnRyYWN0RnJvbShkLm9yaWdpbmFsTGluZVJhbmdlKS5nZXRXaXRoRGVsdGEobSksXz1nLmdldEludGVyc2VjdGlvbihiKTtmb3IoY29uc3QgdiBvZiBfLnJhbmdlcyl7aWYodi5sZW5ndGg8Myljb250aW51ZTtjb25zdCBTPXYsTj12LmRlbHRhKC1tKTtvLnB1c2gobmV3IGxlKE4sUykpLGMuYWRkUmFuZ2UoUyksaC5hZGRSYW5nZShOKX19by5zb3J0KEF0KGQ9PmQub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLFJ0KSk7Y29uc3QgZj1uZXcgQ3QoZSk7Zm9yKGxldCBkPTA7ZDxvLmxlbmd0aDtkKyspe2NvbnN0IG09b1tkXSxnPWYuZmluZExhc3RNb25vdG9ub3VzKEw9Pkwub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyPD1tLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlciksYj1VZShlLEw9PkwubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyPD1tLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlciksXz1NYXRoLm1heChtLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlci1nLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcixtLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlci1iLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlciksdj1mLmZpbmRMYXN0TW9ub3Rvbm91cyhMPT5MLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcjxtLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpLFM9VWUoZSxMPT5MLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcjxtLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpLE49TWF0aC5tYXgodi5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLW0ub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxTLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtbS5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKTtsZXQgcDtmb3IocD0wO3A8XztwKyspe2NvbnN0IEw9bS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItcC0xLEE9bS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItcC0xO2lmKEw+ci5sZW5ndGh8fEE+cy5sZW5ndGh8fGMuY29udGFpbnMoQSl8fGguY29udGFpbnMoTCl8fCFOcyhyW0wtMV0sc1tBLTFdLGkpKWJyZWFrfXA+MCYmKGguYWRkUmFuZ2UobmV3IEQobS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItcCxtLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcikpLGMuYWRkUmFuZ2UobmV3IEQobS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItcCxtLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcikpKTtsZXQgeDtmb3IoeD0wO3g8Tjt4Kyspe2NvbnN0IEw9bS5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlK3gsQT1tLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUreDtpZihMPnIubGVuZ3RofHxBPnMubGVuZ3RofHxjLmNvbnRhaW5zKEEpfHxoLmNvbnRhaW5zKEwpfHwhTnMocltMLTFdLHNbQS0xXSxpKSlicmVha314PjAmJihoLmFkZFJhbmdlKG5ldyBEKG0ub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxtLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUreCkpLGMuYWRkUmFuZ2UobmV3IEQobS5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLG0ubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSt4KSkpLChwPjB8fHg+MCkmJihvW2RdPW5ldyBsZShuZXcgRChtLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlci1wLG0ub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSt4KSxuZXcgRChtLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlci1wLG0ubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSt4KSkpfXJldHVybiBvfWZ1bmN0aW9uIE5zKGUsdCxuKXtpZihlLnRyaW0oKT09PXQudHJpbSgpKXJldHVybiEwO2lmKGUubGVuZ3RoPjMwMCYmdC5sZW5ndGg+MzAwKXJldHVybiExO2NvbnN0IHM9bmV3IF9zKCkuY29tcHV0ZShuZXcgRXQoW2VdLG5ldyBrKDEsMSwxLGUubGVuZ3RoKSwhMSksbmV3IEV0KFt0XSxuZXcgaygxLDEsMSx0Lmxlbmd0aCksITEpLG4pO2xldCBpPTA7Y29uc3Qgbz1HLmludmVydChzLmRpZmZzLGUubGVuZ3RoKTtmb3IoY29uc3QgaCBvZiBvKWguc2VxMVJhbmdlLmZvckVhY2goZj0+e0xuKGUuY2hhckNvZGVBdChmKSl8fGkrK30pO2Z1bmN0aW9uIGwoaCl7bGV0IGY9MDtmb3IobGV0IGQ9MDtkPGUubGVuZ3RoO2QrKylMbihoLmNoYXJDb2RlQXQoZCkpfHxmKys7cmV0dXJuIGZ9Y29uc3QgdT1sKGUubGVuZ3RoPnQubGVuZ3RoP2U6dCk7cmV0dXJuIGkvdT4uNiYmdT4xMH1mdW5jdGlvbiBuMShlKXtpZihlLmxlbmd0aD09PTApcmV0dXJuIGU7ZS5zb3J0KEF0KG49Pm4ub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLFJ0KSk7Y29uc3QgdD1bZVswXV07Zm9yKGxldCBuPTE7bjxlLmxlbmd0aDtuKyspe2NvbnN0IHI9dFt0Lmxlbmd0aC0xXSxzPWVbbl0saT1zLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlci1yLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsbz1zLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlci1yLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU7aWYoaT49MCYmbz49MCYmaStvPD0yKXt0W3QubGVuZ3RoLTFdPXIuam9pbihzKTtjb250aW51ZX10LnB1c2gocyl9cmV0dXJuIHR9ZnVuY3Rpb24gcjEoZSx0KXtjb25zdCBuPW5ldyBDdChlKTtyZXR1cm4gdD10LmZpbHRlcihyPT57Y29uc3Qgcz1uLmZpbmRMYXN0TW9ub3Rvbm91cyhsPT5sLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcjxyLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpfHxuZXcgbGUobmV3IEQoMSwxKSxuZXcgRCgxLDEpKSxpPVVlKGUsbD0+bC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXI8ci5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKTtyZXR1cm4gcyE9PWl9KSx0fWZ1bmN0aW9uIFNzKGUsdCxuKXtsZXQgcj1uO3JldHVybiByPUNzKGUsdCxyKSxyPUNzKGUsdCxyKSxyPXMxKGUsdCxyKSxyfWZ1bmN0aW9uIENzKGUsdCxuKXtpZihuLmxlbmd0aD09PTApcmV0dXJuIG47Y29uc3Qgcj1bXTtyLnB1c2goblswXSk7Zm9yKGxldCBpPTE7aTxuLmxlbmd0aDtpKyspe2NvbnN0IG89cltyLmxlbmd0aC0xXTtsZXQgbD1uW2ldO2lmKGwuc2VxMVJhbmdlLmlzRW1wdHl8fGwuc2VxMlJhbmdlLmlzRW1wdHkpe2NvbnN0IHU9bC5zZXExUmFuZ2Uuc3RhcnQtby5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlO2xldCBjO2ZvcihjPTE7Yzw9dSYmIShlLmdldEVsZW1lbnQobC5zZXExUmFuZ2Uuc3RhcnQtYykhPT1lLmdldEVsZW1lbnQobC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlLWMpfHx0LmdldEVsZW1lbnQobC5zZXEyUmFuZ2Uuc3RhcnQtYykhPT10LmdldEVsZW1lbnQobC5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlLWMpKTtjKyspO2lmKGMtLSxjPT09dSl7cltyLmxlbmd0aC0xXT1uZXcgRyhuZXcgVihvLnNlcTFSYW5nZS5zdGFydCxsLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUtdSksbmV3IFYoby5zZXEyUmFuZ2Uuc3RhcnQsbC5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlLXUpKTtjb250aW51ZX1sPWwuZGVsdGEoLWMpfXIucHVzaChsKX1jb25zdCBzPVtdO2ZvcihsZXQgaT0wO2k8ci5sZW5ndGgtMTtpKyspe2NvbnN0IG89cltpKzFdO2xldCBsPXJbaV07aWYobC5zZXExUmFuZ2UuaXNFbXB0eXx8bC5zZXEyUmFuZ2UuaXNFbXB0eSl7Y29uc3QgdT1vLnNlcTFSYW5nZS5zdGFydC1sLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmU7bGV0IGM7Zm9yKGM9MDtjPHUmJiEoIWUuaXNTdHJvbmdseUVxdWFsKGwuc2VxMVJhbmdlLnN0YXJ0K2MsbC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlK2MpfHwhdC5pc1N0cm9uZ2x5RXF1YWwobC5zZXEyUmFuZ2Uuc3RhcnQrYyxsLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUrYykpO2MrKyk7aWYoYz09PXUpe3JbaSsxXT1uZXcgRyhuZXcgVihsLnNlcTFSYW5nZS5zdGFydCt1LG8uc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSksbmV3IFYobC5zZXEyUmFuZ2Uuc3RhcnQrdSxvLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUpKTtjb250aW51ZX1jPjAmJihsPWwuZGVsdGEoYykpfXMucHVzaChsKX1yZXR1cm4gci5sZW5ndGg+MCYmcy5wdXNoKHJbci5sZW5ndGgtMV0pLHN9ZnVuY3Rpb24gczEoZSx0LG4pe2lmKCFlLmdldEJvdW5kYXJ5U2NvcmV8fCF0LmdldEJvdW5kYXJ5U2NvcmUpcmV0dXJuIG47Zm9yKGxldCByPTA7cjxuLmxlbmd0aDtyKyspe2NvbnN0IHM9cj4wP25bci0xXTp2b2lkIDAsaT1uW3JdLG89cisxPG4ubGVuZ3RoP25bcisxXTp2b2lkIDAsbD1uZXcgVihzP3Muc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSsxOjAsbz9vLnNlcTFSYW5nZS5zdGFydC0xOmUubGVuZ3RoKSx1PW5ldyBWKHM/cy5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlKzE6MCxvP28uc2VxMlJhbmdlLnN0YXJ0LTE6dC5sZW5ndGgpO2kuc2VxMVJhbmdlLmlzRW1wdHk/bltyXT1BcyhpLGUsdCxsLHUpOmkuc2VxMlJhbmdlLmlzRW1wdHkmJihuW3JdPUFzKGkuc3dhcCgpLHQsZSx1LGwpLnN3YXAoKSl9cmV0dXJuIG59ZnVuY3Rpb24gQXMoZSx0LG4scixzKXtsZXQgbz0xO2Zvcig7ZS5zZXExUmFuZ2Uuc3RhcnQtbz49ci5zdGFydCYmZS5zZXEyUmFuZ2Uuc3RhcnQtbz49cy5zdGFydCYmbi5pc1N0cm9uZ2x5RXF1YWwoZS5zZXEyUmFuZ2Uuc3RhcnQtbyxlLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUtbykmJm88MTAwOylvKys7by0tO2xldCBsPTA7Zm9yKDtlLnNlcTFSYW5nZS5zdGFydCtsPHIuZW5kRXhjbHVzaXZlJiZlLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUrbDxzLmVuZEV4Y2x1c2l2ZSYmbi5pc1N0cm9uZ2x5RXF1YWwoZS5zZXEyUmFuZ2Uuc3RhcnQrbCxlLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUrbCkmJmw8MTAwOylsKys7aWYobz09PTAmJmw9PT0wKXJldHVybiBlO2xldCB1PTAsYz0tMTtmb3IobGV0IGg9LW87aDw9bDtoKyspe2NvbnN0IGY9ZS5zZXEyUmFuZ2Uuc3RhcnQraCxkPWUuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZStoLG09ZS5zZXExUmFuZ2Uuc3RhcnQraCxnPXQuZ2V0Qm91bmRhcnlTY29yZShtKStuLmdldEJvdW5kYXJ5U2NvcmUoZikrbi5nZXRCb3VuZGFyeVNjb3JlKGQpO2c+YyYmKGM9Zyx1PWgpfXJldHVybiBlLmRlbHRhKHUpfWZ1bmN0aW9uIGkxKGUsdCxuKXtjb25zdCByPVtdO2Zvcihjb25zdCBzIG9mIG4pe2NvbnN0IGk9cltyLmxlbmd0aC0xXTtpZighaSl7ci5wdXNoKHMpO2NvbnRpbnVlfXMuc2VxMVJhbmdlLnN0YXJ0LWkuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZTw9Mnx8cy5zZXEyUmFuZ2Uuc3RhcnQtaS5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlPD0yP3Jbci5sZW5ndGgtMV09bmV3IEcoaS5zZXExUmFuZ2Uuam9pbihzLnNlcTFSYW5nZSksaS5zZXEyUmFuZ2Uuam9pbihzLnNlcTJSYW5nZSkpOnIucHVzaChzKX1yZXR1cm4gcn1mdW5jdGlvbiBhMShlLHQsbil7Y29uc3Qgcj1HLmludmVydChuLGUubGVuZ3RoKSxzPVtdO2xldCBpPW5ldyBMZSgwLDApO2Z1bmN0aW9uIG8odSxjKXtpZih1Lm9mZnNldDE8aS5vZmZzZXQxfHx1Lm9mZnNldDI8aS5vZmZzZXQyKXJldHVybjtjb25zdCBoPWUuZmluZFdvcmRDb250YWluaW5nKHUub2Zmc2V0MSksZj10LmZpbmRXb3JkQ29udGFpbmluZyh1Lm9mZnNldDIpO2lmKCFofHwhZilyZXR1cm47bGV0IGQ9bmV3IEcoaCxmKTtjb25zdCBtPWQuaW50ZXJzZWN0KGMpO2xldCBnPW0uc2VxMVJhbmdlLmxlbmd0aCxiPW0uc2VxMlJhbmdlLmxlbmd0aDtmb3IoO3IubGVuZ3RoPjA7KXtjb25zdCBfPXJbMF07aWYoIShfLnNlcTFSYW5nZS5pbnRlcnNlY3RzKGQuc2VxMVJhbmdlKXx8Xy5zZXEyUmFuZ2UuaW50ZXJzZWN0cyhkLnNlcTJSYW5nZSkpKWJyZWFrO2NvbnN0IFM9ZS5maW5kV29yZENvbnRhaW5pbmcoXy5zZXExUmFuZ2Uuc3RhcnQpLE49dC5maW5kV29yZENvbnRhaW5pbmcoXy5zZXEyUmFuZ2Uuc3RhcnQpLHA9bmV3IEcoUyxOKSx4PXAuaW50ZXJzZWN0KF8pO2lmKGcrPXguc2VxMVJhbmdlLmxlbmd0aCxiKz14LnNlcTJSYW5nZS5sZW5ndGgsZD1kLmpvaW4ocCksZC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlPj1fLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUpci5zaGlmdCgpO2Vsc2UgYnJlYWt9ZytiPChkLnNlcTFSYW5nZS5sZW5ndGgrZC5zZXEyUmFuZ2UubGVuZ3RoKSoyLzMmJnMucHVzaChkKSxpPWQuZ2V0RW5kRXhjbHVzaXZlcygpfWZvcig7ci5sZW5ndGg+MDspe2NvbnN0IHU9ci5zaGlmdCgpO3Uuc2VxMVJhbmdlLmlzRW1wdHl8fChvKHUuZ2V0U3RhcnRzKCksdSksbyh1LmdldEVuZEV4Y2x1c2l2ZXMoKS5kZWx0YSgtMSksdSkpfXJldHVybiBvMShuLHMpfWZ1bmN0aW9uIG8xKGUsdCl7Y29uc3Qgbj1bXTtmb3IoO2UubGVuZ3RoPjB8fHQubGVuZ3RoPjA7KXtjb25zdCByPWVbMF0scz10WzBdO2xldCBpO3ImJighc3x8ci5zZXExUmFuZ2Uuc3RhcnQ8cy5zZXExUmFuZ2Uuc3RhcnQpP2k9ZS5zaGlmdCgpOmk9dC5zaGlmdCgpLG4ubGVuZ3RoPjAmJm5bbi5sZW5ndGgtMV0uc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZT49aS5zZXExUmFuZ2Uuc3RhcnQ/bltuLmxlbmd0aC0xXT1uW24ubGVuZ3RoLTFdLmpvaW4oaSk6bi5wdXNoKGkpfXJldHVybiBufWZ1bmN0aW9uIGwxKGUsdCxuKXtsZXQgcj1uO2lmKHIubGVuZ3RoPT09MClyZXR1cm4gcjtsZXQgcz0wLGk7ZG97aT0hMTtjb25zdCBvPVtyWzBdXTtmb3IobGV0IGw9MTtsPHIubGVuZ3RoO2wrKyl7bGV0IGg9ZnVuY3Rpb24oZCxtKXtjb25zdCBnPW5ldyBWKGMuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSx1LnNlcTFSYW5nZS5zdGFydCk7cmV0dXJuIGUuZ2V0VGV4dChnKS5yZXBsYWNlKC9ccy9nLCIiKS5sZW5ndGg8PTQmJihkLnNlcTFSYW5nZS5sZW5ndGgrZC5zZXEyUmFuZ2UubGVuZ3RoPjV8fG0uc2VxMVJhbmdlLmxlbmd0aCttLnNlcTJSYW5nZS5sZW5ndGg+NSl9O2NvbnN0IHU9cltsXSxjPW9bby5sZW5ndGgtMV07aChjLHUpPyhpPSEwLG9bby5sZW5ndGgtMV09b1tvLmxlbmd0aC0xXS5qb2luKHUpKTpvLnB1c2godSl9cj1vfXdoaWxlKHMrKzwxMCYmaSk7cmV0dXJuIHJ9ZnVuY3Rpb24gdTEoZSx0LG4pe2xldCByPW47aWYoci5sZW5ndGg9PT0wKXJldHVybiByO2xldCBzPTAsaTtkb3tpPSExO2NvbnN0IGw9W3JbMF1dO2ZvcihsZXQgdT0xO3U8ci5sZW5ndGg7dSsrKXtsZXQgZj1mdW5jdGlvbihtLGcpe2NvbnN0IGI9bmV3IFYoaC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlLGMuc2VxMVJhbmdlLnN0YXJ0KTtpZihlLmNvdW50TGluZXNJbihiKT41fHxiLmxlbmd0aD41MDApcmV0dXJuITE7Y29uc3Qgdj1lLmdldFRleHQoYikudHJpbSgpO2lmKHYubGVuZ3RoPjIwfHx2LnNwbGl0KC9cclxufFxyfFxuLykubGVuZ3RoPjEpcmV0dXJuITE7Y29uc3QgUz1lLmNvdW50TGluZXNJbihtLnNlcTFSYW5nZSksTj1tLnNlcTFSYW5nZS5sZW5ndGgscD10LmNvdW50TGluZXNJbihtLnNlcTJSYW5nZSkseD1tLnNlcTJSYW5nZS5sZW5ndGgsTD1lLmNvdW50TGluZXNJbihnLnNlcTFSYW5nZSksQT1nLnNlcTFSYW5nZS5sZW5ndGgsRT10LmNvdW50TGluZXNJbihnLnNlcTJSYW5nZSksQj1nLnNlcTJSYW5nZS5sZW5ndGgsUT0yKjQwKzUwO2Z1bmN0aW9uIHEoRil7cmV0dXJuIE1hdGgubWluKEYsUSl9cmV0dXJuIE1hdGgucG93KE1hdGgucG93KHEoUyo0MCtOKSwxLjUpK01hdGgucG93KHEocCo0MCt4KSwxLjUpLDEuNSkrTWF0aC5wb3coTWF0aC5wb3cocShMKjQwK0EpLDEuNSkrTWF0aC5wb3cocShFKjQwK0IpLDEuNSksMS41KT4oUSoqMS41KSoqMS41KjEuM307Y29uc3QgYz1yW3VdLGg9bFtsLmxlbmd0aC0xXTtmKGgsYyk/KGk9ITAsbFtsLmxlbmd0aC0xXT1sW2wubGVuZ3RoLTFdLmpvaW4oYykpOmwucHVzaChjKX1yPWx9d2hpbGUocysrPDEwJiZpKTtjb25zdCBvPVtdO3JldHVybiB6YShyLChsLHUsYyk9PntsZXQgaD11O2Z1bmN0aW9uIGYodil7cmV0dXJuIHYubGVuZ3RoPjAmJnYudHJpbSgpLmxlbmd0aDw9MyYmdS5zZXExUmFuZ2UubGVuZ3RoK3Uuc2VxMlJhbmdlLmxlbmd0aD4xMDB9Y29uc3QgZD1lLmV4dGVuZFRvRnVsbExpbmVzKHUuc2VxMVJhbmdlKSxtPWUuZ2V0VGV4dChuZXcgVihkLnN0YXJ0LHUuc2VxMVJhbmdlLnN0YXJ0KSk7ZihtKSYmKGg9aC5kZWx0YVN0YXJ0KC1tLmxlbmd0aCkpO2NvbnN0IGc9ZS5nZXRUZXh0KG5ldyBWKHUuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSxkLmVuZEV4Y2x1c2l2ZSkpO2YoZykmJihoPWguZGVsdGFFbmQoZy5sZW5ndGgpKTtjb25zdCBiPUcuZnJvbU9mZnNldFBhaXJzKGw/bC5nZXRFbmRFeGNsdXNpdmVzKCk6TGUuemVybyxjP2MuZ2V0U3RhcnRzKCk6TGUubWF4KSxfPWguaW50ZXJzZWN0KGIpO28ubGVuZ3RoPjAmJl8uZ2V0U3RhcnRzKCkuZXF1YWxzKG9bby5sZW5ndGgtMV0uZ2V0RW5kRXhjbHVzaXZlcygpKT9vW28ubGVuZ3RoLTFdPW9bby5sZW5ndGgtMV0uam9pbihfKTpvLnB1c2goXyl9KSxvfWNsYXNzIFJze2NvbnN0cnVjdG9yKHQsbil7dGhpcy50cmltbWVkSGFzaD10LHRoaXMubGluZXM9bn1nZXRFbGVtZW50KHQpe3JldHVybiB0aGlzLnRyaW1tZWRIYXNoW3RdfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy50cmltbWVkSGFzaC5sZW5ndGh9Z2V0Qm91bmRhcnlTY29yZSh0KXtjb25zdCBuPXQ9PT0wPzA6eXModGhpcy5saW5lc1t0LTFdKSxyPXQ9PT10aGlzLmxpbmVzLmxlbmd0aD8wOnlzKHRoaXMubGluZXNbdF0pO3JldHVybiAxZTMtKG4rcil9Z2V0VGV4dCh0KXtyZXR1cm4gdGhpcy5saW5lcy5zbGljZSh0LnN0YXJ0LHQuZW5kRXhjbHVzaXZlKS5qb2luKGAKYCl9aXNTdHJvbmdseUVxdWFsKHQsbil7cmV0dXJuIHRoaXMubGluZXNbdF09PT10aGlzLmxpbmVzW25dfX1mdW5jdGlvbiB5cyhlKXtsZXQgdD0wO2Zvcig7dDxlLmxlbmd0aCYmKGUuY2hhckNvZGVBdCh0KT09PTMyfHxlLmNoYXJDb2RlQXQodCk9PT05KTspdCsrO3JldHVybiB0fWNsYXNzIGMxe2NvbnN0cnVjdG9yKCl7dGhpcy5keW5hbWljUHJvZ3JhbW1pbmdEaWZmaW5nPW5ldyBYYSx0aGlzLm15ZXJzRGlmZmluZ0FsZ29yaXRobT1uZXcgX3N9Y29tcHV0ZURpZmYodCxuLHIpe2lmKHQubGVuZ3RoPD0xJiYkYSh0LG4sKHgsTCk9Png9PT1MKSlyZXR1cm4gbmV3IFN0KFtdLFtdLCExKTtpZih0Lmxlbmd0aD09PTEmJnRbMF0ubGVuZ3RoPT09MHx8bi5sZW5ndGg9PT0xJiZuWzBdLmxlbmd0aD09PTApcmV0dXJuIG5ldyBTdChbbmV3IF9lKG5ldyBEKDEsdC5sZW5ndGgrMSksbmV3IEQoMSxuLmxlbmd0aCsxKSxbbmV3IGRlKG5ldyBrKDEsMSx0Lmxlbmd0aCx0W3QubGVuZ3RoLTFdLmxlbmd0aCsxKSxuZXcgaygxLDEsbi5sZW5ndGgsbltuLmxlbmd0aC0xXS5sZW5ndGgrMSkpXSldLFtdLCExKTtjb25zdCBzPXIubWF4Q29tcHV0YXRpb25UaW1lTXM9PT0wP2l0Lmluc3RhbmNlOm5ldyBqYShyLm1heENvbXB1dGF0aW9uVGltZU1zKSxpPSFyLmlnbm9yZVRyaW1XaGl0ZXNwYWNlLG89bmV3IE1hcDtmdW5jdGlvbiBsKHgpe2xldCBMPW8uZ2V0KHgpO3JldHVybiBMPT09dm9pZCAwJiYoTD1vLnNpemUsby5zZXQoeCxMKSksTH1jb25zdCB1PXQubWFwKHg9PmwoeC50cmltKCkpKSxjPW4ubWFwKHg9PmwoeC50cmltKCkpKSxoPW5ldyBScyh1LHQpLGY9bmV3IFJzKGMsbiksZD1oLmxlbmd0aCtmLmxlbmd0aDwxNzAwP3RoaXMuZHluYW1pY1Byb2dyYW1taW5nRGlmZmluZy5jb21wdXRlKGgsZixzLCh4LEwpPT50W3hdPT09bltMXT9uW0xdLmxlbmd0aD09PTA/LjE6MStNYXRoLmxvZygxK25bTF0ubGVuZ3RoKTouOTkpOnRoaXMubXllcnNEaWZmaW5nQWxnb3JpdGhtLmNvbXB1dGUoaCxmLHMpO2xldCBtPWQuZGlmZnMsZz1kLmhpdFRpbWVvdXQ7bT1TcyhoLGYsbSksbT1sMShoLGYsbSk7Y29uc3QgYj1bXSxfPXg9PntpZihpKWZvcihsZXQgTD0wO0w8eDtMKyspe2NvbnN0IEE9ditMLEU9UytMO2lmKHRbQV0hPT1uW0VdKXtjb25zdCBCPXRoaXMucmVmaW5lRGlmZih0LG4sbmV3IEcobmV3IFYoQSxBKzEpLG5ldyBWKEUsRSsxKSkscyxpKTtmb3IoY29uc3QgUSBvZiBCLm1hcHBpbmdzKWIucHVzaChRKTtCLmhpdFRpbWVvdXQmJihnPSEwKX19fTtsZXQgdj0wLFM9MDtmb3IoY29uc3QgeCBvZiBtKXtOdCgoKT0+eC5zZXExUmFuZ2Uuc3RhcnQtdj09PXguc2VxMlJhbmdlLnN0YXJ0LVMpO2NvbnN0IEw9eC5zZXExUmFuZ2Uuc3RhcnQtdjtfKEwpLHY9eC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlLFM9eC5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlO2NvbnN0IEE9dGhpcy5yZWZpbmVEaWZmKHQsbix4LHMsaSk7QS5oaXRUaW1lb3V0JiYoZz0hMCk7Zm9yKGNvbnN0IEUgb2YgQS5tYXBwaW5ncyliLnB1c2goRSl9Xyh0Lmxlbmd0aC12KTtjb25zdCBOPUVzKGIsdCxuKTtsZXQgcD1bXTtyZXR1cm4gci5jb21wdXRlTW92ZXMmJihwPXRoaXMuY29tcHV0ZU1vdmVzKE4sdCxuLHUsYyxzLGkpKSxOdCgoKT0+e2Z1bmN0aW9uIHgoQSxFKXtpZihBLmxpbmVOdW1iZXI8MXx8QS5saW5lTnVtYmVyPkUubGVuZ3RoKXJldHVybiExO2NvbnN0IEI9RVtBLmxpbmVOdW1iZXItMV07cmV0dXJuIShBLmNvbHVtbjwxfHxBLmNvbHVtbj5CLmxlbmd0aCsxKX1mdW5jdGlvbiBMKEEsRSl7cmV0dXJuIShBLnN0YXJ0TGluZU51bWJlcjwxfHxBLnN0YXJ0TGluZU51bWJlcj5FLmxlbmd0aCsxfHxBLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU8MXx8QS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPkUubGVuZ3RoKzEpfWZvcihjb25zdCBBIG9mIE4pe2lmKCFBLmlubmVyQ2hhbmdlcylyZXR1cm4hMTtmb3IoY29uc3QgRSBvZiBBLmlubmVyQ2hhbmdlcylpZighKHgoRS5tb2RpZmllZFJhbmdlLmdldFN0YXJ0UG9zaXRpb24oKSxuKSYmeChFLm1vZGlmaWVkUmFuZ2UuZ2V0RW5kUG9zaXRpb24oKSxuKSYmeChFLm9yaWdpbmFsUmFuZ2UuZ2V0U3RhcnRQb3NpdGlvbigpLHQpJiZ4KEUub3JpZ2luYWxSYW5nZS5nZXRFbmRQb3NpdGlvbigpLHQpKSlyZXR1cm4hMTtpZighTChBLm1vZGlmaWVkLG4pfHwhTChBLm9yaWdpbmFsLHQpKXJldHVybiExfXJldHVybiEwfSksbmV3IFN0KE4scCxnKX1jb21wdXRlTW92ZXModCxuLHIscyxpLG8sbCl7cmV0dXJuIFphKHQsbixyLHMsaSxvKS5tYXAoaD0+e2NvbnN0IGY9dGhpcy5yZWZpbmVEaWZmKG4scixuZXcgRyhoLm9yaWdpbmFsLnRvT2Zmc2V0UmFuZ2UoKSxoLm1vZGlmaWVkLnRvT2Zmc2V0UmFuZ2UoKSksbyxsKSxkPUVzKGYubWFwcGluZ3MsbixyLCEwKTtyZXR1cm4gbmV3IEZhKGgsZCl9KX1yZWZpbmVEaWZmKHQsbixyLHMsaSl7Y29uc3QgbD1mMShyKS50b1JhbmdlTWFwcGluZzIodCxuKSx1PW5ldyBFdCh0LGwub3JpZ2luYWxSYW5nZSxpKSxjPW5ldyBFdChuLGwubW9kaWZpZWRSYW5nZSxpKSxoPXUubGVuZ3RoK2MubGVuZ3RoPDUwMD90aGlzLmR5bmFtaWNQcm9ncmFtbWluZ0RpZmZpbmcuY29tcHV0ZSh1LGMscyk6dGhpcy5teWVyc0RpZmZpbmdBbGdvcml0aG0uY29tcHV0ZSh1LGMscyk7bGV0IGY9aC5kaWZmcztyZXR1cm4gZj1Tcyh1LGMsZiksZj1hMSh1LGMsZiksZj1pMSh1LGMsZiksZj11MSh1LGMsZikse21hcHBpbmdzOmYubWFwKG09Pm5ldyBkZSh1LnRyYW5zbGF0ZVJhbmdlKG0uc2VxMVJhbmdlKSxjLnRyYW5zbGF0ZVJhbmdlKG0uc2VxMlJhbmdlKSkpLGhpdFRpbWVvdXQ6aC5oaXRUaW1lb3V0fX19ZnVuY3Rpb24gRXMoZSx0LG4scj0hMSl7Y29uc3Qgcz1bXTtmb3IoY29uc3QgaSBvZiBIYShlLm1hcChvPT5oMShvLHQsbikpLChvLGwpPT5vLm9yaWdpbmFsLm92ZXJsYXBPclRvdWNoKGwub3JpZ2luYWwpfHxvLm1vZGlmaWVkLm92ZXJsYXBPclRvdWNoKGwubW9kaWZpZWQpKSl7Y29uc3Qgbz1pWzBdLGw9aVtpLmxlbmd0aC0xXTtzLnB1c2gobmV3IF9lKG8ub3JpZ2luYWwuam9pbihsLm9yaWdpbmFsKSxvLm1vZGlmaWVkLmpvaW4obC5tb2RpZmllZCksaS5tYXAodT0+dS5pbm5lckNoYW5nZXNbMF0pKSl9cmV0dXJuIE50KCgpPT4hciYmcy5sZW5ndGg+MCYmKHNbMF0ubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyIT09c1swXS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXJ8fG4ubGVuZ3RoLXNbcy5sZW5ndGgtMV0ubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSE9PXQubGVuZ3RoLXNbcy5sZW5ndGgtMV0ub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSk/ITE6b3MocywoaSxvKT0+by5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItaS5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPT09by5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItaS5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlJiZpLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU8by5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXImJmkubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTxvLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcikpLHN9ZnVuY3Rpb24gaDEoZSx0LG4pe2xldCByPTAscz0wO2UubW9kaWZpZWRSYW5nZS5lbmRDb2x1bW49PT0xJiZlLm9yaWdpbmFsUmFuZ2UuZW5kQ29sdW1uPT09MSYmZS5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlcityPD1lLm9yaWdpbmFsUmFuZ2UuZW5kTGluZU51bWJlciYmZS5tb2RpZmllZFJhbmdlLnN0YXJ0TGluZU51bWJlcityPD1lLm1vZGlmaWVkUmFuZ2UuZW5kTGluZU51bWJlciYmKHM9LTEpLGUubW9kaWZpZWRSYW5nZS5zdGFydENvbHVtbi0xPj1uW2UubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXItMV0ubGVuZ3RoJiZlLm9yaWdpbmFsUmFuZ2Uuc3RhcnRDb2x1bW4tMT49dFtlLm9yaWdpbmFsUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLTFdLmxlbmd0aCYmZS5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlcjw9ZS5vcmlnaW5hbFJhbmdlLmVuZExpbmVOdW1iZXIrcyYmZS5tb2RpZmllZFJhbmdlLnN0YXJ0TGluZU51bWJlcjw9ZS5tb2RpZmllZFJhbmdlLmVuZExpbmVOdW1iZXIrcyYmKHI9MSk7Y29uc3QgaT1uZXcgRChlLm9yaWdpbmFsUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyK3IsZS5vcmlnaW5hbFJhbmdlLmVuZExpbmVOdW1iZXIrMStzKSxvPW5ldyBEKGUubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXIrcixlLm1vZGlmaWVkUmFuZ2UuZW5kTGluZU51bWJlcisxK3MpO3JldHVybiBuZXcgX2UoaSxvLFtlXSl9ZnVuY3Rpb24gZjEoZSl7cmV0dXJuIG5ldyBsZShuZXcgRChlLnNlcTFSYW5nZS5zdGFydCsxLGUuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSsxKSxuZXcgRChlLnNlcTJSYW5nZS5zdGFydCsxLGUuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZSsxKSl9Y29uc3QgTXM9e2dldExlZ2FjeTooKT0+bmV3IFZhLGdldERlZmF1bHQ6KCk9Pm5ldyBjMX07ZnVuY3Rpb24geWUoZSx0KXtjb25zdCBuPU1hdGgucG93KDEwLHQpO3JldHVybiBNYXRoLnJvdW5kKGUqbikvbn1jbGFzcyBYe2NvbnN0cnVjdG9yKHQsbixyLHM9MSl7dGhpcy5fcmdiYUJyYW5kPXZvaWQgMCx0aGlzLnI9TWF0aC5taW4oMjU1LE1hdGgubWF4KDAsdCkpfDAsdGhpcy5nPU1hdGgubWluKDI1NSxNYXRoLm1heCgwLG4pKXwwLHRoaXMuYj1NYXRoLm1pbigyNTUsTWF0aC5tYXgoMCxyKSl8MCx0aGlzLmE9eWUoTWF0aC5tYXgoTWF0aC5taW4oMSxzKSwwKSwzKX1zdGF0aWMgZXF1YWxzKHQsbil7cmV0dXJuIHQucj09PW4uciYmdC5nPT09bi5nJiZ0LmI9PT1uLmImJnQuYT09PW4uYX19Y2xhc3MgdWV7Y29uc3RydWN0b3IodCxuLHIscyl7dGhpcy5faHNsYUJyYW5kPXZvaWQgMCx0aGlzLmg9TWF0aC5tYXgoTWF0aC5taW4oMzYwLHQpLDApfDAsdGhpcy5zPXllKE1hdGgubWF4KE1hdGgubWluKDEsbiksMCksMyksdGhpcy5sPXllKE1hdGgubWF4KE1hdGgubWluKDEsciksMCksMyksdGhpcy5hPXllKE1hdGgubWF4KE1hdGgubWluKDEscyksMCksMyl9c3RhdGljIGVxdWFscyh0LG4pe3JldHVybiB0Lmg9PT1uLmgmJnQucz09PW4ucyYmdC5sPT09bi5sJiZ0LmE9PT1uLmF9c3RhdGljIGZyb21SR0JBKHQpe2NvbnN0IG49dC5yLzI1NSxyPXQuZy8yNTUscz10LmIvMjU1LGk9dC5hLG89TWF0aC5tYXgobixyLHMpLGw9TWF0aC5taW4obixyLHMpO2xldCB1PTAsYz0wO2NvbnN0IGg9KGwrbykvMixmPW8tbDtpZihmPjApe3N3aXRjaChjPU1hdGgubWluKGg8PS41P2YvKDIqaCk6Zi8oMi0yKmgpLDEpLG8pe2Nhc2Ugbjp1PShyLXMpL2YrKHI8cz82OjApO2JyZWFrO2Nhc2Ugcjp1PShzLW4pL2YrMjticmVhaztjYXNlIHM6dT0obi1yKS9mKzQ7YnJlYWt9dSo9NjAsdT1NYXRoLnJvdW5kKHUpfXJldHVybiBuZXcgdWUodSxjLGgsaSl9c3RhdGljIF9odWUycmdiKHQsbixyKXtyZXR1cm4gcjwwJiYocis9MSkscj4xJiYoci09MSkscjwxLzY/dCsobi10KSo2KnI6cjwxLzI/bjpyPDIvMz90KyhuLXQpKigyLzMtcikqNjp0fXN0YXRpYyB0b1JHQkEodCl7Y29uc3Qgbj10LmgvMzYwLHtzOnIsbDpzLGE6aX09dDtsZXQgbyxsLHU7aWYocj09PTApbz1sPXU9cztlbHNle2NvbnN0IGM9czwuNT9zKigxK3IpOnMrci1zKnIsaD0yKnMtYztvPXVlLl9odWUycmdiKGgsYyxuKzEvMyksbD11ZS5faHVlMnJnYihoLGMsbiksdT11ZS5faHVlMnJnYihoLGMsbi0xLzMpfXJldHVybiBuZXcgWChNYXRoLnJvdW5kKG8qMjU1KSxNYXRoLnJvdW5kKGwqMjU1KSxNYXRoLnJvdW5kKHUqMjU1KSxpKX19Y2xhc3MgV2V7Y29uc3RydWN0b3IodCxuLHIscyl7dGhpcy5faHN2YUJyYW5kPXZvaWQgMCx0aGlzLmg9TWF0aC5tYXgoTWF0aC5taW4oMzYwLHQpLDApfDAsdGhpcy5zPXllKE1hdGgubWF4KE1hdGgubWluKDEsbiksMCksMyksdGhpcy52PXllKE1hdGgubWF4KE1hdGgubWluKDEsciksMCksMyksdGhpcy5hPXllKE1hdGgubWF4KE1hdGgubWluKDEscyksMCksMyl9c3RhdGljIGVxdWFscyh0LG4pe3JldHVybiB0Lmg9PT1uLmgmJnQucz09PW4ucyYmdC52PT09bi52JiZ0LmE9PT1uLmF9c3RhdGljIGZyb21SR0JBKHQpe2NvbnN0IG49dC5yLzI1NSxyPXQuZy8yNTUscz10LmIvMjU1LGk9TWF0aC5tYXgobixyLHMpLG89TWF0aC5taW4obixyLHMpLGw9aS1vLHU9aT09PTA/MDpsL2k7bGV0IGM7cmV0dXJuIGw9PT0wP2M9MDppPT09bj9jPSgoci1zKS9sJTYrNiklNjppPT09cj9jPShzLW4pL2wrMjpjPShuLXIpL2wrNCxuZXcgV2UoTWF0aC5yb3VuZChjKjYwKSx1LGksdC5hKX1zdGF0aWMgdG9SR0JBKHQpe2NvbnN0e2g6bixzOnIsdjpzLGE6aX09dCxvPXMqcixsPW8qKDEtTWF0aC5hYnMobi82MCUyLTEpKSx1PXMtbztsZXRbYyxoLGZdPVswLDAsMF07cmV0dXJuIG48NjA/KGM9byxoPWwpOm48MTIwPyhjPWwsaD1vKTpuPDE4MD8oaD1vLGY9bCk6bjwyNDA/KGg9bCxmPW8pOm48MzAwPyhjPWwsZj1vKTpuPD0zNjAmJihjPW8sZj1sKSxjPU1hdGgucm91bmQoKGMrdSkqMjU1KSxoPU1hdGgucm91bmQoKGgrdSkqMjU1KSxmPU1hdGgucm91bmQoKGYrdSkqMjU1KSxuZXcgWChjLGgsZixpKX19Y29uc3QgSD1jbGFzcyBIe3N0YXRpYyBmcm9tSGV4KHQpe3JldHVybiBILkZvcm1hdC5DU1MucGFyc2VIZXgodCl8fEgucmVkfXN0YXRpYyBlcXVhbHModCxuKXtyZXR1cm4hdCYmIW4/ITA6IXR8fCFuPyExOnQuZXF1YWxzKG4pfWdldCBoc2xhKCl7cmV0dXJuIHRoaXMuX2hzbGE/dGhpcy5faHNsYTp1ZS5mcm9tUkdCQSh0aGlzLnJnYmEpfWdldCBoc3ZhKCl7cmV0dXJuIHRoaXMuX2hzdmE/dGhpcy5faHN2YTpXZS5mcm9tUkdCQSh0aGlzLnJnYmEpfWNvbnN0cnVjdG9yKHQpe2lmKHQpaWYodCBpbnN0YW5jZW9mIFgpdGhpcy5yZ2JhPXQ7ZWxzZSBpZih0IGluc3RhbmNlb2YgdWUpdGhpcy5faHNsYT10LHRoaXMucmdiYT11ZS50b1JHQkEodCk7ZWxzZSBpZih0IGluc3RhbmNlb2YgV2UpdGhpcy5faHN2YT10LHRoaXMucmdiYT1XZS50b1JHQkEodCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgY29sb3IgY3RvciBhcmd1bWVudCIpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJDb2xvciBuZWVkcyBhIHZhbHVlIil9ZXF1YWxzKHQpe3JldHVybiEhdCYmWC5lcXVhbHModGhpcy5yZ2JhLHQucmdiYSkmJnVlLmVxdWFscyh0aGlzLmhzbGEsdC5oc2xhKSYmV2UuZXF1YWxzKHRoaXMuaHN2YSx0LmhzdmEpfWdldFJlbGF0aXZlTHVtaW5hbmNlKCl7Y29uc3QgdD1ILl9yZWxhdGl2ZUx1bWluYW5jZUZvckNvbXBvbmVudCh0aGlzLnJnYmEuciksbj1ILl9yZWxhdGl2ZUx1bWluYW5jZUZvckNvbXBvbmVudCh0aGlzLnJnYmEuZykscj1ILl9yZWxhdGl2ZUx1bWluYW5jZUZvckNvbXBvbmVudCh0aGlzLnJnYmEuYikscz0uMjEyNip0Ky43MTUyKm4rLjA3MjIqcjtyZXR1cm4geWUocyw0KX1zdGF0aWMgX3JlbGF0aXZlTHVtaW5hbmNlRm9yQ29tcG9uZW50KHQpe2NvbnN0IG49dC8yNTU7cmV0dXJuIG48PS4wMzkyOD9uLzEyLjkyOk1hdGgucG93KChuKy4wNTUpLzEuMDU1LDIuNCl9aXNMaWdodGVyKCl7cmV0dXJuKHRoaXMucmdiYS5yKjI5OSt0aGlzLnJnYmEuZyo1ODcrdGhpcy5yZ2JhLmIqMTE0KS8xZTM+PTEyOH1pc0xpZ2h0ZXJUaGFuKHQpe2NvbnN0IG49dGhpcy5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLHI9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiBuPnJ9aXNEYXJrZXJUaGFuKHQpe2NvbnN0IG49dGhpcy5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLHI9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiBuPHJ9bGlnaHRlbih0KXtyZXR1cm4gbmV3IEgobmV3IHVlKHRoaXMuaHNsYS5oLHRoaXMuaHNsYS5zLHRoaXMuaHNsYS5sK3RoaXMuaHNsYS5sKnQsdGhpcy5oc2xhLmEpKX1kYXJrZW4odCl7cmV0dXJuIG5ldyBIKG5ldyB1ZSh0aGlzLmhzbGEuaCx0aGlzLmhzbGEucyx0aGlzLmhzbGEubC10aGlzLmhzbGEubCp0LHRoaXMuaHNsYS5hKSl9dHJhbnNwYXJlbnQodCl7Y29uc3R7cjpuLGc6cixiOnMsYTppfT10aGlzLnJnYmE7cmV0dXJuIG5ldyBIKG5ldyBYKG4scixzLGkqdCkpfWlzVHJhbnNwYXJlbnQoKXtyZXR1cm4gdGhpcy5yZ2JhLmE9PT0wfWlzT3BhcXVlKCl7cmV0dXJuIHRoaXMucmdiYS5hPT09MX1vcHBvc2l0ZSgpe3JldHVybiBuZXcgSChuZXcgWCgyNTUtdGhpcy5yZ2JhLnIsMjU1LXRoaXMucmdiYS5nLDI1NS10aGlzLnJnYmEuYix0aGlzLnJnYmEuYSkpfW1ha2VPcGFxdWUodCl7aWYodGhpcy5pc09wYXF1ZSgpfHx0LnJnYmEuYSE9PTEpcmV0dXJuIHRoaXM7Y29uc3R7cjpuLGc6cixiOnMsYTppfT10aGlzLnJnYmE7cmV0dXJuIG5ldyBIKG5ldyBYKHQucmdiYS5yLWkqKHQucmdiYS5yLW4pLHQucmdiYS5nLWkqKHQucmdiYS5nLXIpLHQucmdiYS5iLWkqKHQucmdiYS5iLXMpLDEpKX10b1N0cmluZygpe3JldHVybiB0aGlzLl90b1N0cmluZ3x8KHRoaXMuX3RvU3RyaW5nPUguRm9ybWF0LkNTUy5mb3JtYXQodGhpcykpLHRoaXMuX3RvU3RyaW5nfXN0YXRpYyBnZXRMaWdodGVyQ29sb3IodCxuLHIpe2lmKHQuaXNMaWdodGVyVGhhbihuKSlyZXR1cm4gdDtyPXJ8fC41O2NvbnN0IHM9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLGk9bi5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiByPXIqKGktcykvaSx0LmxpZ2h0ZW4ocil9c3RhdGljIGdldERhcmtlckNvbG9yKHQsbixyKXtpZih0LmlzRGFya2VyVGhhbihuKSlyZXR1cm4gdDtyPXJ8fC41O2NvbnN0IHM9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLGk9bi5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiByPXIqKHMtaSkvcyx0LmRhcmtlbihyKX19O0gud2hpdGU9bmV3IEgobmV3IFgoMjU1LDI1NSwyNTUsMSkpLEguYmxhY2s9bmV3IEgobmV3IFgoMCwwLDAsMSkpLEgucmVkPW5ldyBIKG5ldyBYKDI1NSwwLDAsMSkpLEguYmx1ZT1uZXcgSChuZXcgWCgwLDAsMjU1LDEpKSxILmdyZWVuPW5ldyBIKG5ldyBYKDAsMjU1LDAsMSkpLEguY3lhbj1uZXcgSChuZXcgWCgwLDI1NSwyNTUsMSkpLEgubGlnaHRncmV5PW5ldyBIKG5ldyBYKDIxMSwyMTEsMjExLDEpKSxILnRyYW5zcGFyZW50PW5ldyBIKG5ldyBYKDAsMCwwLDApKTtsZXQgemU9SDsoZnVuY3Rpb24oZSl7KGZ1bmN0aW9uKHQpeyhmdW5jdGlvbihuKXtmdW5jdGlvbiByKG0pe3JldHVybiBtLnJnYmEuYT09PTE/YHJnYigke20ucmdiYS5yfSwgJHttLnJnYmEuZ30sICR7bS5yZ2JhLmJ9KWA6ZS5Gb3JtYXQuQ1NTLmZvcm1hdFJHQkEobSl9bi5mb3JtYXRSR0I9cjtmdW5jdGlvbiBzKG0pe3JldHVybmByZ2JhKCR7bS5yZ2JhLnJ9LCAke20ucmdiYS5nfSwgJHttLnJnYmEuYn0sICR7K20ucmdiYS5hLnRvRml4ZWQoMil9KWB9bi5mb3JtYXRSR0JBPXM7ZnVuY3Rpb24gaShtKXtyZXR1cm4gbS5oc2xhLmE9PT0xP2Boc2woJHttLmhzbGEuaH0sICR7KG0uaHNsYS5zKjEwMCkudG9GaXhlZCgyKX0lLCAkeyhtLmhzbGEubCoxMDApLnRvRml4ZWQoMil9JSlgOmUuRm9ybWF0LkNTUy5mb3JtYXRIU0xBKG0pfW4uZm9ybWF0SFNMPWk7ZnVuY3Rpb24gbyhtKXtyZXR1cm5gaHNsYSgke20uaHNsYS5ofSwgJHsobS5oc2xhLnMqMTAwKS50b0ZpeGVkKDIpfSUsICR7KG0uaHNsYS5sKjEwMCkudG9GaXhlZCgyKX0lLCAke20uaHNsYS5hLnRvRml4ZWQoMil9KWB9bi5mb3JtYXRIU0xBPW87ZnVuY3Rpb24gbChtKXtjb25zdCBnPW0udG9TdHJpbmcoMTYpO3JldHVybiBnLmxlbmd0aCE9PTI/IjAiK2c6Z31mdW5jdGlvbiB1KG0pe3JldHVybmAjJHtsKG0ucmdiYS5yKX0ke2wobS5yZ2JhLmcpfSR7bChtLnJnYmEuYil9YH1uLmZvcm1hdEhleD11O2Z1bmN0aW9uIGMobSxnPSExKXtyZXR1cm4gZyYmbS5yZ2JhLmE9PT0xP2UuRm9ybWF0LkNTUy5mb3JtYXRIZXgobSk6YCMke2wobS5yZ2JhLnIpfSR7bChtLnJnYmEuZyl9JHtsKG0ucmdiYS5iKX0ke2woTWF0aC5yb3VuZChtLnJnYmEuYSoyNTUpKX1gfW4uZm9ybWF0SGV4QT1jO2Z1bmN0aW9uIGgobSl7cmV0dXJuIG0uaXNPcGFxdWUoKT9lLkZvcm1hdC5DU1MuZm9ybWF0SGV4KG0pOmUuRm9ybWF0LkNTUy5mb3JtYXRSR0JBKG0pfW4uZm9ybWF0PWg7ZnVuY3Rpb24gZihtKXtjb25zdCBnPW0ubGVuZ3RoO2lmKGc9PT0wfHxtLmNoYXJDb2RlQXQoMCkhPT0zNSlyZXR1cm4gbnVsbDtpZihnPT09Nyl7Y29uc3QgYj0xNipkKG0uY2hhckNvZGVBdCgxKSkrZChtLmNoYXJDb2RlQXQoMikpLF89MTYqZChtLmNoYXJDb2RlQXQoMykpK2QobS5jaGFyQ29kZUF0KDQpKSx2PTE2KmQobS5jaGFyQ29kZUF0KDUpKStkKG0uY2hhckNvZGVBdCg2KSk7cmV0dXJuIG5ldyBlKG5ldyBYKGIsXyx2LDEpKX1pZihnPT09OSl7Y29uc3QgYj0xNipkKG0uY2hhckNvZGVBdCgxKSkrZChtLmNoYXJDb2RlQXQoMikpLF89MTYqZChtLmNoYXJDb2RlQXQoMykpK2QobS5jaGFyQ29kZUF0KDQpKSx2PTE2KmQobS5jaGFyQ29kZUF0KDUpKStkKG0uY2hhckNvZGVBdCg2KSksUz0xNipkKG0uY2hhckNvZGVBdCg3KSkrZChtLmNoYXJDb2RlQXQoOCkpO3JldHVybiBuZXcgZShuZXcgWChiLF8sdixTLzI1NSkpfWlmKGc9PT00KXtjb25zdCBiPWQobS5jaGFyQ29kZUF0KDEpKSxfPWQobS5jaGFyQ29kZUF0KDIpKSx2PWQobS5jaGFyQ29kZUF0KDMpKTtyZXR1cm4gbmV3IGUobmV3IFgoMTYqYitiLDE2Kl8rXywxNip2K3YpKX1pZihnPT09NSl7Y29uc3QgYj1kKG0uY2hhckNvZGVBdCgxKSksXz1kKG0uY2hhckNvZGVBdCgyKSksdj1kKG0uY2hhckNvZGVBdCgzKSksUz1kKG0uY2hhckNvZGVBdCg0KSk7cmV0dXJuIG5ldyBlKG5ldyBYKDE2KmIrYiwxNipfK18sMTYqdit2LCgxNipTK1MpLzI1NSkpfXJldHVybiBudWxsfW4ucGFyc2VIZXg9ZjtmdW5jdGlvbiBkKG0pe3N3aXRjaChtKXtjYXNlIDQ4OnJldHVybiAwO2Nhc2UgNDk6cmV0dXJuIDE7Y2FzZSA1MDpyZXR1cm4gMjtjYXNlIDUxOnJldHVybiAzO2Nhc2UgNTI6cmV0dXJuIDQ7Y2FzZSA1MzpyZXR1cm4gNTtjYXNlIDU0OnJldHVybiA2O2Nhc2UgNTU6cmV0dXJuIDc7Y2FzZSA1NjpyZXR1cm4gODtjYXNlIDU3OnJldHVybiA5O2Nhc2UgOTc6cmV0dXJuIDEwO2Nhc2UgNjU6cmV0dXJuIDEwO2Nhc2UgOTg6cmV0dXJuIDExO2Nhc2UgNjY6cmV0dXJuIDExO2Nhc2UgOTk6cmV0dXJuIDEyO2Nhc2UgNjc6cmV0dXJuIDEyO2Nhc2UgMTAwOnJldHVybiAxMztjYXNlIDY4OnJldHVybiAxMztjYXNlIDEwMTpyZXR1cm4gMTQ7Y2FzZSA2OTpyZXR1cm4gMTQ7Y2FzZSAxMDI6cmV0dXJuIDE1O2Nhc2UgNzA6cmV0dXJuIDE1fXJldHVybiAwfX0pKHQuQ1NTfHwodC5DU1M9e30pKX0pKGUuRm9ybWF0fHwoZS5Gb3JtYXQ9e30pKX0pKHplfHwoemU9e30pKTtmdW5jdGlvbiBrcyhlKXtjb25zdCB0PVtdO2Zvcihjb25zdCBuIG9mIGUpe2NvbnN0IHI9TnVtYmVyKG4pOyhyfHxyPT09MCYmbi5yZXBsYWNlKC9ccy9nLCIiKSE9PSIiKSYmdC5wdXNoKHIpfXJldHVybiB0fWZ1bmN0aW9uIE5uKGUsdCxuLHIpe3JldHVybntyZWQ6ZS8yNTUsYmx1ZTpuLzI1NSxncmVlbjp0LzI1NSxhbHBoYTpyfX1mdW5jdGlvbiBhdChlLHQpe2NvbnN0IG49dC5pbmRleCxyPXRbMF0ubGVuZ3RoO2lmKCFuKXJldHVybjtjb25zdCBzPWUucG9zaXRpb25BdChuKTtyZXR1cm57c3RhcnRMaW5lTnVtYmVyOnMubGluZU51bWJlcixzdGFydENvbHVtbjpzLmNvbHVtbixlbmRMaW5lTnVtYmVyOnMubGluZU51bWJlcixlbmRDb2x1bW46cy5jb2x1bW4rcn19ZnVuY3Rpb24gZDEoZSx0KXtpZighZSlyZXR1cm47Y29uc3Qgbj16ZS5Gb3JtYXQuQ1NTLnBhcnNlSGV4KHQpO2lmKG4pcmV0dXJue3JhbmdlOmUsY29sb3I6Tm4obi5yZ2JhLnIsbi5yZ2JhLmcsbi5yZ2JhLmIsbi5yZ2JhLmEpfX1mdW5jdGlvbiBQcyhlLHQsbil7aWYoIWV8fHQubGVuZ3RoIT09MSlyZXR1cm47Y29uc3Qgcz10WzBdLnZhbHVlcygpLGk9a3Mocyk7cmV0dXJue3JhbmdlOmUsY29sb3I6Tm4oaVswXSxpWzFdLGlbMl0sbj9pWzNdOjEpfX1mdW5jdGlvbiBGcyhlLHQsbil7aWYoIWV8fHQubGVuZ3RoIT09MSlyZXR1cm47Y29uc3Qgcz10WzBdLnZhbHVlcygpLGk9a3Mocyksbz1uZXcgemUobmV3IHVlKGlbMF0saVsxXS8xMDAsaVsyXS8xMDAsbj9pWzNdOjEpKTtyZXR1cm57cmFuZ2U6ZSxjb2xvcjpObihvLnJnYmEucixvLnJnYmEuZyxvLnJnYmEuYixvLnJnYmEuYSl9fWZ1bmN0aW9uIG90KGUsdCl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIj9bLi4uZS5tYXRjaEFsbCh0KV06ZS5maW5kTWF0Y2hlcyh0KX1mdW5jdGlvbiBtMShlKXtjb25zdCB0PVtdLHI9b3QoZSwvXGIocmdifHJnYmF8aHNsfGhzbGEpKFwoWzAtOVxzLC5cJV0qXCkpfCgjKShbQS1GYS1mMC05XXszfSlcYnwoIykoW0EtRmEtZjAtOV17NH0pXGJ8KCMpKFtBLUZhLWYwLTldezZ9KVxifCgjKShbQS1GYS1mMC05XXs4fSlcYi9nbSk7aWYoci5sZW5ndGg+MClmb3IoY29uc3QgcyBvZiByKXtjb25zdCBpPXMuZmlsdGVyKGM9PmMhPT12b2lkIDApLG89aVsxXSxsPWlbMl07aWYoIWwpY29udGludWU7bGV0IHU7aWYobz09PSJyZ2IiKXtjb25zdCBjPS9eXChccyooMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlccyosXHMqKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXHMqLFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxzKlwpJC9nbTt1PVBzKGF0KGUscyksb3QobCxjKSwhMSl9ZWxzZSBpZihvPT09InJnYmEiKXtjb25zdCBjPS9eXChccyooMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlccyosXHMqKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXHMqLFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxzKixccyooMFsuXVswLTldK3xbLl1bMC05XSt8WzAxXVsuXXxbMDFdKVxzKlwpJC9nbTt1PVBzKGF0KGUscyksb3QobCxjKSwhMCl9ZWxzZSBpZihvPT09ImhzbCIpe2NvbnN0IGM9L15cKFxzKigzNlswXXwzWzAtNV1bMC05XXxbMTJdWzAtOV1bMC05XXxbMS05XT9bMC05XSlccyosXHMqKDEwMHxcZHsxLDJ9Wy5dXGQqfFxkezEsMn0pJVxzKixccyooMTAwfFxkezEsMn1bLl1cZCp8XGR7MSwyfSklXHMqXCkkL2dtO3U9RnMoYXQoZSxzKSxvdChsLGMpLCExKX1lbHNlIGlmKG89PT0iaHNsYSIpe2NvbnN0IGM9L15cKFxzKigzNlswXXwzWzAtNV1bMC05XXxbMTJdWzAtOV1bMC05XXxbMS05XT9bMC05XSlccyosXHMqKDEwMHxcZHsxLDJ9Wy5dXGQqfFxkezEsMn0pJVxzKixccyooMTAwfFxkezEsMn1bLl1cZCp8XGR7MSwyfSklXHMqLFxzKigwWy5dWzAtOV0rfFsuXVswLTldK3xbMDFdWy5dfFswMV0pXHMqXCkkL2dtO3U9RnMoYXQoZSxzKSxvdChsLGMpLCEwKX1lbHNlIG89PT0iIyImJih1PWQxKGF0KGUscyksbytsKSk7dSYmdC5wdXNoKHUpfXJldHVybiB0fWZ1bmN0aW9uIGcxKGUpe3JldHVybiFlfHx0eXBlb2YgZS5nZXRWYWx1ZSE9ImZ1bmN0aW9uInx8dHlwZW9mIGUucG9zaXRpb25BdCE9ImZ1bmN0aW9uIj9bXTptMShlKX1jb25zdCBEcz1uZXcgUmVnRXhwKCJcXGJNQVJLOlxccyooLiopJCIsImQiKSxiMT0vXi0rfC0rJC9nO2Z1bmN0aW9uIHgxKGUsdCl7dmFyIHI7bGV0IG49W107aWYodC5maW5kUmVnaW9uU2VjdGlvbkhlYWRlcnMmJigocj10LmZvbGRpbmdSdWxlcykhPW51bGwmJnIubWFya2Vycykpe2NvbnN0IHM9cDEoZSx0KTtuPW4uY29uY2F0KHMpfWlmKHQuZmluZE1hcmtTZWN0aW9uSGVhZGVycyl7Y29uc3Qgcz1fMShlKTtuPW4uY29uY2F0KHMpfXJldHVybiBufWZ1bmN0aW9uIHAxKGUsdCl7Y29uc3Qgbj1bXSxyPWUuZ2V0TGluZUNvdW50KCk7Zm9yKGxldCBzPTE7czw9cjtzKyspe2NvbnN0IGk9ZS5nZXRMaW5lQ29udGVudChzKSxvPWkubWF0Y2godC5mb2xkaW5nUnVsZXMubWFya2Vycy5zdGFydCk7aWYobyl7Y29uc3QgbD17c3RhcnRMaW5lTnVtYmVyOnMsc3RhcnRDb2x1bW46b1swXS5sZW5ndGgrMSxlbmRMaW5lTnVtYmVyOnMsZW5kQ29sdW1uOmkubGVuZ3RoKzF9O2lmKGwuZW5kQ29sdW1uPmwuc3RhcnRDb2x1bW4pe2NvbnN0IHU9e3JhbmdlOmwsLi4uVHMoaS5zdWJzdHJpbmcob1swXS5sZW5ndGgpKSxzaG91bGRCZUluQ29tbWVudHM6ITF9Oyh1LnRleHR8fHUuaGFzU2VwYXJhdG9yTGluZSkmJm4ucHVzaCh1KX19fXJldHVybiBufWZ1bmN0aW9uIF8xKGUpe2NvbnN0IHQ9W10sbj1lLmdldExpbmVDb3VudCgpO2ZvcihsZXQgcj0xO3I8PW47cisrKXtjb25zdCBzPWUuZ2V0TGluZUNvbnRlbnQocik7dzEocyxyLHQpfXJldHVybiB0fWZ1bmN0aW9uIHcxKGUsdCxuKXtEcy5sYXN0SW5kZXg9MDtjb25zdCByPURzLmV4ZWMoZSk7aWYocil7Y29uc3Qgcz1yLmluZGljZXNbMV1bMF0rMSxpPXIuaW5kaWNlc1sxXVsxXSsxLG89e3N0YXJ0TGluZU51bWJlcjp0LHN0YXJ0Q29sdW1uOnMsZW5kTGluZU51bWJlcjp0LGVuZENvbHVtbjppfTtpZihvLmVuZENvbHVtbj5vLnN0YXJ0Q29sdW1uKXtjb25zdCBsPXtyYW5nZTpvLC4uLlRzKHJbMV0pLHNob3VsZEJlSW5Db21tZW50czohMH07KGwudGV4dHx8bC5oYXNTZXBhcmF0b3JMaW5lKSYmbi5wdXNoKGwpfX19ZnVuY3Rpb24gVHMoZSl7ZT1lLnRyaW0oKTtjb25zdCB0PWUuc3RhcnRzV2l0aCgiLSIpO3JldHVybiBlPWUucmVwbGFjZShiMSwiIikse3RleHQ6ZSxoYXNTZXBhcmF0b3JMaW5lOnR9fXZhciBJczsoZnVuY3Rpb24oZSl7YXN5bmMgZnVuY3Rpb24gdChyKXtsZXQgcztjb25zdCBpPWF3YWl0IFByb21pc2UuYWxsKHIubWFwKG89Pm8udGhlbihsPT5sLGw9PntzfHwocz1sKX0pKSk7aWYodHlwZW9mIHM8InUiKXRocm93IHM7cmV0dXJuIGl9ZS5zZXR0bGVkPXQ7ZnVuY3Rpb24gbihyKXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMocyxpKT0+e3RyeXthd2FpdCByKHMsaSl9Y2F0Y2gobyl7aShvKX19KX1lLndpdGhBc3luY0JvZHk9bn0pKElzfHwoSXM9e30pKTtjb25zdCBuZT1jbGFzcyBuZXtzdGF0aWMgZnJvbUFycmF5KHQpe3JldHVybiBuZXcgbmUobj0+e24uZW1pdE1hbnkodCl9KX1zdGF0aWMgZnJvbVByb21pc2UodCl7cmV0dXJuIG5ldyBuZShhc3luYyBuPT57bi5lbWl0TWFueShhd2FpdCB0KX0pfXN0YXRpYyBmcm9tUHJvbWlzZXModCl7cmV0dXJuIG5ldyBuZShhc3luYyBuPT57YXdhaXQgUHJvbWlzZS5hbGwodC5tYXAoYXN5bmMgcj0+bi5lbWl0T25lKGF3YWl0IHIpKSl9KX1zdGF0aWMgbWVyZ2UodCl7cmV0dXJuIG5ldyBuZShhc3luYyBuPT57YXdhaXQgUHJvbWlzZS5hbGwodC5tYXAoYXN5bmMgcj0+e2ZvciBhd2FpdChjb25zdCBzIG9mIHIpbi5lbWl0T25lKHMpfSkpfSl9Y29uc3RydWN0b3IodCxuKXt0aGlzLl9zdGF0ZT0wLHRoaXMuX3Jlc3VsdHM9W10sdGhpcy5fZXJyb3I9bnVsbCx0aGlzLl9vblJldHVybj1uLHRoaXMuX29uU3RhdGVDaGFuZ2VkPW5ldyBvZSxxdWV1ZU1pY3JvdGFzayhhc3luYygpPT57Y29uc3Qgcj17ZW1pdE9uZTpzPT50aGlzLmVtaXRPbmUocyksZW1pdE1hbnk6cz0+dGhpcy5lbWl0TWFueShzKSxyZWplY3Q6cz0+dGhpcy5yZWplY3Qocyl9O3RyeXthd2FpdCBQcm9taXNlLnJlc29sdmUodChyKSksdGhpcy5yZXNvbHZlKCl9Y2F0Y2gocyl7dGhpcy5yZWplY3Qocyl9ZmluYWxseXtyLmVtaXRPbmU9dm9pZCAwLHIuZW1pdE1hbnk9dm9pZCAwLHIucmVqZWN0PXZvaWQgMH19KX1bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7bGV0IHQ9MDtyZXR1cm57bmV4dDphc3luYygpPT57ZG97aWYodGhpcy5fc3RhdGU9PT0yKXRocm93IHRoaXMuX2Vycm9yO2lmKHQ8dGhpcy5fcmVzdWx0cy5sZW5ndGgpcmV0dXJue2RvbmU6ITEsdmFsdWU6dGhpcy5fcmVzdWx0c1t0KytdfTtpZih0aGlzLl9zdGF0ZT09PTEpcmV0dXJue2RvbmU6ITAsdmFsdWU6dm9pZCAwfTthd2FpdCBtdC50b1Byb21pc2UodGhpcy5fb25TdGF0ZUNoYW5nZWQuZXZlbnQpfXdoaWxlKCEwKX0scmV0dXJuOmFzeW5jKCk9Pnt2YXIgbjtyZXR1cm4obj10aGlzLl9vblJldHVybik9PW51bGx8fG4uY2FsbCh0aGlzKSx7ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fX19c3RhdGljIG1hcCh0LG4pe3JldHVybiBuZXcgbmUoYXN5bmMgcj0+e2ZvciBhd2FpdChjb25zdCBzIG9mIHQpci5lbWl0T25lKG4ocykpfSl9bWFwKHQpe3JldHVybiBuZS5tYXAodGhpcyx0KX1zdGF0aWMgZmlsdGVyKHQsbil7cmV0dXJuIG5ldyBuZShhc3luYyByPT57Zm9yIGF3YWl0KGNvbnN0IHMgb2YgdCluKHMpJiZyLmVtaXRPbmUocyl9KX1maWx0ZXIodCl7cmV0dXJuIG5lLmZpbHRlcih0aGlzLHQpfXN0YXRpYyBjb2FsZXNjZSh0KXtyZXR1cm4gbmUuZmlsdGVyKHQsbj0+ISFuKX1jb2FsZXNjZSgpe3JldHVybiBuZS5jb2FsZXNjZSh0aGlzKX1zdGF0aWMgYXN5bmMgdG9Qcm9taXNlKHQpe2NvbnN0IG49W107Zm9yIGF3YWl0KGNvbnN0IHIgb2YgdCluLnB1c2gocik7cmV0dXJuIG59dG9Qcm9taXNlKCl7cmV0dXJuIG5lLnRvUHJvbWlzZSh0aGlzKX1lbWl0T25lKHQpe3RoaXMuX3N0YXRlPT09MCYmKHRoaXMuX3Jlc3VsdHMucHVzaCh0KSx0aGlzLl9vblN0YXRlQ2hhbmdlZC5maXJlKCkpfWVtaXRNYW55KHQpe3RoaXMuX3N0YXRlPT09MCYmKHRoaXMuX3Jlc3VsdHM9dGhpcy5fcmVzdWx0cy5jb25jYXQodCksdGhpcy5fb25TdGF0ZUNoYW5nZWQuZmlyZSgpKX1yZXNvbHZlKCl7dGhpcy5fc3RhdGU9PT0wJiYodGhpcy5fc3RhdGU9MSx0aGlzLl9vblN0YXRlQ2hhbmdlZC5maXJlKCkpfXJlamVjdCh0KXt0aGlzLl9zdGF0ZT09PTAmJih0aGlzLl9zdGF0ZT0yLHRoaXMuX2Vycm9yPXQsdGhpcy5fb25TdGF0ZUNoYW5nZWQuZmlyZSgpKX19O25lLkVNUFRZPW5lLmZyb21BcnJheShbXSk7bGV0IFZzPW5lO2NsYXNzIEwxe2NvbnN0cnVjdG9yKHQpe3RoaXMudmFsdWVzPXQsdGhpcy5wcmVmaXhTdW09bmV3IFVpbnQzMkFycmF5KHQubGVuZ3RoKSx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXg9bmV3IEludDMyQXJyYXkoMSksdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPS0xfWluc2VydFZhbHVlcyh0LG4pe3Q9cWUodCk7Y29uc3Qgcj10aGlzLnZhbHVlcyxzPXRoaXMucHJlZml4U3VtLGk9bi5sZW5ndGg7cmV0dXJuIGk9PT0wPyExOih0aGlzLnZhbHVlcz1uZXcgVWludDMyQXJyYXkoci5sZW5ndGgraSksdGhpcy52YWx1ZXMuc2V0KHIuc3ViYXJyYXkoMCx0KSwwKSx0aGlzLnZhbHVlcy5zZXQoci5zdWJhcnJheSh0KSx0K2kpLHRoaXMudmFsdWVzLnNldChuLHQpLHQtMTx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0mJih0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF09dC0xKSx0aGlzLnByZWZpeFN1bT1uZXcgVWludDMyQXJyYXkodGhpcy52YWx1ZXMubGVuZ3RoKSx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0+PTAmJnRoaXMucHJlZml4U3VtLnNldChzLnN1YmFycmF5KDAsdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKzEpKSwhMCl9c2V0VmFsdWUodCxuKXtyZXR1cm4gdD1xZSh0KSxuPXFlKG4pLHRoaXMudmFsdWVzW3RdPT09bj8hMToodGhpcy52YWx1ZXNbdF09bix0LTE8dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdJiYodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPXQtMSksITApfXJlbW92ZVZhbHVlcyh0LG4pe3Q9cWUodCksbj1xZShuKTtjb25zdCByPXRoaXMudmFsdWVzLHM9dGhpcy5wcmVmaXhTdW07aWYodD49ci5sZW5ndGgpcmV0dXJuITE7Y29uc3QgaT1yLmxlbmd0aC10O3JldHVybiBuPj1pJiYobj1pKSxuPT09MD8hMToodGhpcy52YWx1ZXM9bmV3IFVpbnQzMkFycmF5KHIubGVuZ3RoLW4pLHRoaXMudmFsdWVzLnNldChyLnN1YmFycmF5KDAsdCksMCksdGhpcy52YWx1ZXMuc2V0KHIuc3ViYXJyYXkodCtuKSx0KSx0aGlzLnByZWZpeFN1bT1uZXcgVWludDMyQXJyYXkodGhpcy52YWx1ZXMubGVuZ3RoKSx0LTE8dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdJiYodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPXQtMSksdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPj0wJiZ0aGlzLnByZWZpeFN1bS5zZXQocy5zdWJhcnJheSgwLHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSsxKSksITApfWdldFRvdGFsU3VtKCl7cmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aD09PTA/MDp0aGlzLl9nZXRQcmVmaXhTdW0odGhpcy52YWx1ZXMubGVuZ3RoLTEpfWdldFByZWZpeFN1bSh0KXtyZXR1cm4gdDwwPzA6KHQ9cWUodCksdGhpcy5fZ2V0UHJlZml4U3VtKHQpKX1fZ2V0UHJlZml4U3VtKHQpe2lmKHQ8PXRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSlyZXR1cm4gdGhpcy5wcmVmaXhTdW1bdF07bGV0IG49dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKzE7bj09PTAmJih0aGlzLnByZWZpeFN1bVswXT10aGlzLnZhbHVlc1swXSxuKyspLHQ+PXRoaXMudmFsdWVzLmxlbmd0aCYmKHQ9dGhpcy52YWx1ZXMubGVuZ3RoLTEpO2ZvcihsZXQgcj1uO3I8PXQ7cisrKXRoaXMucHJlZml4U3VtW3JdPXRoaXMucHJlZml4U3VtW3ItMV0rdGhpcy52YWx1ZXNbcl07cmV0dXJuIHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXT1NYXRoLm1heCh0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0sdCksdGhpcy5wcmVmaXhTdW1bdF19Z2V0SW5kZXhPZih0KXt0PU1hdGguZmxvb3IodCksdGhpcy5nZXRUb3RhbFN1bSgpO2xldCBuPTAscj10aGlzLnZhbHVlcy5sZW5ndGgtMSxzPTAsaT0wLG89MDtmb3IoO248PXI7KWlmKHM9bisoci1uKS8yfDAsaT10aGlzLnByZWZpeFN1bVtzXSxvPWktdGhpcy52YWx1ZXNbc10sdDxvKXI9cy0xO2Vsc2UgaWYodD49aSluPXMrMTtlbHNlIGJyZWFrO3JldHVybiBuZXcgdjEocyx0LW8pfX1jbGFzcyB2MXtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuaW5kZXg9dCx0aGlzLnJlbWFpbmRlcj1uLHRoaXMuX3ByZWZpeFN1bUluZGV4T2ZSZXN1bHRCcmFuZD12b2lkIDAsdGhpcy5pbmRleD10LHRoaXMucmVtYWluZGVyPW59fWNsYXNzIE4xe2NvbnN0cnVjdG9yKHQsbixyLHMpe3RoaXMuX3VyaT10LHRoaXMuX2xpbmVzPW4sdGhpcy5fZW9sPXIsdGhpcy5fdmVyc2lvbklkPXMsdGhpcy5fbGluZVN0YXJ0cz1udWxsLHRoaXMuX2NhY2hlZFRleHRWYWx1ZT1udWxsfWRpc3Bvc2UoKXt0aGlzLl9saW5lcy5sZW5ndGg9MH1nZXQgdmVyc2lvbigpe3JldHVybiB0aGlzLl92ZXJzaW9uSWR9Z2V0VGV4dCgpe3JldHVybiB0aGlzLl9jYWNoZWRUZXh0VmFsdWU9PT1udWxsJiYodGhpcy5fY2FjaGVkVGV4dFZhbHVlPXRoaXMuX2xpbmVzLmpvaW4odGhpcy5fZW9sKSksdGhpcy5fY2FjaGVkVGV4dFZhbHVlfW9uRXZlbnRzKHQpe3QuZW9sJiZ0LmVvbCE9PXRoaXMuX2VvbCYmKHRoaXMuX2VvbD10LmVvbCx0aGlzLl9saW5lU3RhcnRzPW51bGwpO2NvbnN0IG49dC5jaGFuZ2VzO2Zvcihjb25zdCByIG9mIG4pdGhpcy5fYWNjZXB0RGVsZXRlUmFuZ2Uoci5yYW5nZSksdGhpcy5fYWNjZXB0SW5zZXJ0VGV4dChuZXcgJChyLnJhbmdlLnN0YXJ0TGluZU51bWJlcixyLnJhbmdlLnN0YXJ0Q29sdW1uKSxyLnRleHQpO3RoaXMuX3ZlcnNpb25JZD10LnZlcnNpb25JZCx0aGlzLl9jYWNoZWRUZXh0VmFsdWU9bnVsbH1fZW5zdXJlTGluZVN0YXJ0cygpe2lmKCF0aGlzLl9saW5lU3RhcnRzKXtjb25zdCB0PXRoaXMuX2VvbC5sZW5ndGgsbj10aGlzLl9saW5lcy5sZW5ndGgscj1uZXcgVWludDMyQXJyYXkobik7Zm9yKGxldCBzPTA7czxuO3MrKylyW3NdPXRoaXMuX2xpbmVzW3NdLmxlbmd0aCt0O3RoaXMuX2xpbmVTdGFydHM9bmV3IEwxKHIpfX1fc2V0TGluZVRleHQodCxuKXt0aGlzLl9saW5lc1t0XT1uLHRoaXMuX2xpbmVTdGFydHMmJnRoaXMuX2xpbmVTdGFydHMuc2V0VmFsdWUodCx0aGlzLl9saW5lc1t0XS5sZW5ndGgrdGhpcy5fZW9sLmxlbmd0aCl9X2FjY2VwdERlbGV0ZVJhbmdlKHQpe2lmKHQuc3RhcnRMaW5lTnVtYmVyPT09dC5lbmRMaW5lTnVtYmVyKXtpZih0LnN0YXJ0Q29sdW1uPT09dC5lbmRDb2x1bW4pcmV0dXJuO3RoaXMuX3NldExpbmVUZXh0KHQuc3RhcnRMaW5lTnVtYmVyLTEsdGhpcy5fbGluZXNbdC5zdGFydExpbmVOdW1iZXItMV0uc3Vic3RyaW5nKDAsdC5zdGFydENvbHVtbi0xKSt0aGlzLl9saW5lc1t0LnN0YXJ0TGluZU51bWJlci0xXS5zdWJzdHJpbmcodC5lbmRDb2x1bW4tMSkpO3JldHVybn10aGlzLl9zZXRMaW5lVGV4dCh0LnN0YXJ0TGluZU51bWJlci0xLHRoaXMuX2xpbmVzW3Quc3RhcnRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZygwLHQuc3RhcnRDb2x1bW4tMSkrdGhpcy5fbGluZXNbdC5lbmRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZyh0LmVuZENvbHVtbi0xKSksdGhpcy5fbGluZXMuc3BsaWNlKHQuc3RhcnRMaW5lTnVtYmVyLHQuZW5kTGluZU51bWJlci10LnN0YXJ0TGluZU51bWJlciksdGhpcy5fbGluZVN0YXJ0cyYmdGhpcy5fbGluZVN0YXJ0cy5yZW1vdmVWYWx1ZXModC5zdGFydExpbmVOdW1iZXIsdC5lbmRMaW5lTnVtYmVyLXQuc3RhcnRMaW5lTnVtYmVyKX1fYWNjZXB0SW5zZXJ0VGV4dCh0LG4pe2lmKG4ubGVuZ3RoPT09MClyZXR1cm47Y29uc3Qgcj1naShuKTtpZihyLmxlbmd0aD09PTEpe3RoaXMuX3NldExpbmVUZXh0KHQubGluZU51bWJlci0xLHRoaXMuX2xpbmVzW3QubGluZU51bWJlci0xXS5zdWJzdHJpbmcoMCx0LmNvbHVtbi0xKStyWzBdK3RoaXMuX2xpbmVzW3QubGluZU51bWJlci0xXS5zdWJzdHJpbmcodC5jb2x1bW4tMSkpO3JldHVybn1yW3IubGVuZ3RoLTFdKz10aGlzLl9saW5lc1t0LmxpbmVOdW1iZXItMV0uc3Vic3RyaW5nKHQuY29sdW1uLTEpLHRoaXMuX3NldExpbmVUZXh0KHQubGluZU51bWJlci0xLHRoaXMuX2xpbmVzW3QubGluZU51bWJlci0xXS5zdWJzdHJpbmcoMCx0LmNvbHVtbi0xKStyWzBdKTtjb25zdCBzPW5ldyBVaW50MzJBcnJheShyLmxlbmd0aC0xKTtmb3IobGV0IGk9MTtpPHIubGVuZ3RoO2krKyl0aGlzLl9saW5lcy5zcGxpY2UodC5saW5lTnVtYmVyK2ktMSwwLHJbaV0pLHNbaS0xXT1yW2ldLmxlbmd0aCt0aGlzLl9lb2wubGVuZ3RoO3RoaXMuX2xpbmVTdGFydHMmJnRoaXMuX2xpbmVTdGFydHMuaW5zZXJ0VmFsdWVzKHQubGluZU51bWJlcixzKX19Y2xhc3MgUzF7Y29uc3RydWN0b3IoKXt0aGlzLl9tb2RlbHM9T2JqZWN0LmNyZWF0ZShudWxsKX1nZXRNb2RlbCh0KXtyZXR1cm4gdGhpcy5fbW9kZWxzW3RdfWdldE1vZGVscygpe2NvbnN0IHQ9W107cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX21vZGVscykuZm9yRWFjaChuPT50LnB1c2godGhpcy5fbW9kZWxzW25dKSksdH0kYWNjZXB0TmV3TW9kZWwodCl7dGhpcy5fbW9kZWxzW3QudXJsXT1uZXcgQzEoc2UucGFyc2UodC51cmwpLHQubGluZXMsdC5FT0wsdC52ZXJzaW9uSWQpfSRhY2NlcHRNb2RlbENoYW5nZWQodCxuKXtpZighdGhpcy5fbW9kZWxzW3RdKXJldHVybjt0aGlzLl9tb2RlbHNbdF0ub25FdmVudHMobil9JGFjY2VwdFJlbW92ZWRNb2RlbCh0KXt0aGlzLl9tb2RlbHNbdF0mJmRlbGV0ZSB0aGlzLl9tb2RlbHNbdF19fWNsYXNzIEMxIGV4dGVuZHMgTjF7Z2V0IHVyaSgpe3JldHVybiB0aGlzLl91cml9Z2V0IGVvbCgpe3JldHVybiB0aGlzLl9lb2x9Z2V0VmFsdWUoKXtyZXR1cm4gdGhpcy5nZXRUZXh0KCl9ZmluZE1hdGNoZXModCl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9MDtyPHRoaXMuX2xpbmVzLmxlbmd0aDtyKyspe2NvbnN0IHM9dGhpcy5fbGluZXNbcl0saT10aGlzLm9mZnNldEF0KG5ldyAkKHIrMSwxKSksbz1zLm1hdGNoQWxsKHQpO2Zvcihjb25zdCBsIG9mIG8pKGwuaW5kZXh8fGwuaW5kZXg9PT0wKSYmKGwuaW5kZXg9bC5pbmRleCtpKSxuLnB1c2gobCl9cmV0dXJuIG59Z2V0TGluZXNDb250ZW50KCl7cmV0dXJuIHRoaXMuX2xpbmVzLnNsaWNlKDApfWdldExpbmVDb3VudCgpe3JldHVybiB0aGlzLl9saW5lcy5sZW5ndGh9Z2V0TGluZUNvbnRlbnQodCl7cmV0dXJuIHRoaXMuX2xpbmVzW3QtMV19Z2V0V29yZEF0UG9zaXRpb24odCxuKXtjb25zdCByPWduKHQuY29sdW1uLHVzKG4pLHRoaXMuX2xpbmVzW3QubGluZU51bWJlci0xXSwwKTtyZXR1cm4gcj9uZXcgayh0LmxpbmVOdW1iZXIsci5zdGFydENvbHVtbix0LmxpbmVOdW1iZXIsci5lbmRDb2x1bW4pOm51bGx9d29yZHModCl7Y29uc3Qgbj10aGlzLl9saW5lcyxyPXRoaXMuX3dvcmRlbml6ZS5iaW5kKHRoaXMpO2xldCBzPTAsaT0iIixvPTAsbD1bXTtyZXR1cm57KltTeW1ib2wuaXRlcmF0b3JdKCl7Zm9yKDs7KWlmKG88bC5sZW5ndGgpe2NvbnN0IHU9aS5zdWJzdHJpbmcobFtvXS5zdGFydCxsW29dLmVuZCk7bys9MSx5aWVsZCB1fWVsc2UgaWYoczxuLmxlbmd0aClpPW5bc10sbD1yKGksdCksbz0wLHMrPTE7ZWxzZSBicmVha319fWdldExpbmVXb3Jkcyh0LG4pe2NvbnN0IHI9dGhpcy5fbGluZXNbdC0xXSxzPXRoaXMuX3dvcmRlbml6ZShyLG4pLGk9W107Zm9yKGNvbnN0IG8gb2YgcylpLnB1c2goe3dvcmQ6ci5zdWJzdHJpbmcoby5zdGFydCxvLmVuZCksc3RhcnRDb2x1bW46by5zdGFydCsxLGVuZENvbHVtbjpvLmVuZCsxfSk7cmV0dXJuIGl9X3dvcmRlbml6ZSh0LG4pe2NvbnN0IHI9W107bGV0IHM7Zm9yKG4ubGFzdEluZGV4PTA7KHM9bi5leGVjKHQpKSYmc1swXS5sZW5ndGghPT0wOylyLnB1c2goe3N0YXJ0OnMuaW5kZXgsZW5kOnMuaW5kZXgrc1swXS5sZW5ndGh9KTtyZXR1cm4gcn1nZXRWYWx1ZUluUmFuZ2UodCl7aWYodD10aGlzLl92YWxpZGF0ZVJhbmdlKHQpLHQuc3RhcnRMaW5lTnVtYmVyPT09dC5lbmRMaW5lTnVtYmVyKXJldHVybiB0aGlzLl9saW5lc1t0LnN0YXJ0TGluZU51bWJlci0xXS5zdWJzdHJpbmcodC5zdGFydENvbHVtbi0xLHQuZW5kQ29sdW1uLTEpO2NvbnN0IG49dGhpcy5fZW9sLHI9dC5zdGFydExpbmVOdW1iZXItMSxzPXQuZW5kTGluZU51bWJlci0xLGk9W107aS5wdXNoKHRoaXMuX2xpbmVzW3JdLnN1YnN0cmluZyh0LnN0YXJ0Q29sdW1uLTEpKTtmb3IobGV0IG89cisxO288cztvKyspaS5wdXNoKHRoaXMuX2xpbmVzW29dKTtyZXR1cm4gaS5wdXNoKHRoaXMuX2xpbmVzW3NdLnN1YnN0cmluZygwLHQuZW5kQ29sdW1uLTEpKSxpLmpvaW4obil9b2Zmc2V0QXQodCl7cmV0dXJuIHQ9dGhpcy5fdmFsaWRhdGVQb3NpdGlvbih0KSx0aGlzLl9lbnN1cmVMaW5lU3RhcnRzKCksdGhpcy5fbGluZVN0YXJ0cy5nZXRQcmVmaXhTdW0odC5saW5lTnVtYmVyLTIpKyh0LmNvbHVtbi0xKX1wb3NpdGlvbkF0KHQpe3Q9TWF0aC5mbG9vcih0KSx0PU1hdGgubWF4KDAsdCksdGhpcy5fZW5zdXJlTGluZVN0YXJ0cygpO2NvbnN0IG49dGhpcy5fbGluZVN0YXJ0cy5nZXRJbmRleE9mKHQpLHI9dGhpcy5fbGluZXNbbi5pbmRleF0ubGVuZ3RoO3JldHVybntsaW5lTnVtYmVyOjErbi5pbmRleCxjb2x1bW46MStNYXRoLm1pbihuLnJlbWFpbmRlcixyKX19X3ZhbGlkYXRlUmFuZ2UodCl7Y29uc3Qgbj10aGlzLl92YWxpZGF0ZVBvc2l0aW9uKHtsaW5lTnVtYmVyOnQuc3RhcnRMaW5lTnVtYmVyLGNvbHVtbjp0LnN0YXJ0Q29sdW1ufSkscj10aGlzLl92YWxpZGF0ZVBvc2l0aW9uKHtsaW5lTnVtYmVyOnQuZW5kTGluZU51bWJlcixjb2x1bW46dC5lbmRDb2x1bW59KTtyZXR1cm4gbi5saW5lTnVtYmVyIT09dC5zdGFydExpbmVOdW1iZXJ8fG4uY29sdW1uIT09dC5zdGFydENvbHVtbnx8ci5saW5lTnVtYmVyIT09dC5lbmRMaW5lTnVtYmVyfHxyLmNvbHVtbiE9PXQuZW5kQ29sdW1uP3tzdGFydExpbmVOdW1iZXI6bi5saW5lTnVtYmVyLHN0YXJ0Q29sdW1uOm4uY29sdW1uLGVuZExpbmVOdW1iZXI6ci5saW5lTnVtYmVyLGVuZENvbHVtbjpyLmNvbHVtbn06dH1fdmFsaWRhdGVQb3NpdGlvbih0KXtpZighJC5pc0lQb3NpdGlvbih0KSl0aHJvdyBuZXcgRXJyb3IoImJhZCBwb3NpdGlvbiIpO2xldHtsaW5lTnVtYmVyOm4sY29sdW1uOnJ9PXQscz0hMTtpZihuPDEpbj0xLHI9MSxzPSEwO2Vsc2UgaWYobj50aGlzLl9saW5lcy5sZW5ndGgpbj10aGlzLl9saW5lcy5sZW5ndGgscj10aGlzLl9saW5lc1tuLTFdLmxlbmd0aCsxLHM9ITA7ZWxzZXtjb25zdCBpPXRoaXMuX2xpbmVzW24tMV0ubGVuZ3RoKzE7cjwxPyhyPTEscz0hMCk6cj5pJiYocj1pLHM9ITApfXJldHVybiBzP3tsaW5lTnVtYmVyOm4sY29sdW1uOnJ9OnR9fWNvbnN0IEl0PWNsYXNzIEl0e2NvbnN0cnVjdG9yKCl7dGhpcy5fd29ya2VyVGV4dE1vZGVsU3luY1NlcnZlcj1uZXcgUzF9ZGlzcG9zZSgpe31fZ2V0TW9kZWwodCl7cmV0dXJuIHRoaXMuX3dvcmtlclRleHRNb2RlbFN5bmNTZXJ2ZXIuZ2V0TW9kZWwodCl9X2dldE1vZGVscygpe3JldHVybiB0aGlzLl93b3JrZXJUZXh0TW9kZWxTeW5jU2VydmVyLmdldE1vZGVscygpfSRhY2NlcHROZXdNb2RlbCh0KXt0aGlzLl93b3JrZXJUZXh0TW9kZWxTeW5jU2VydmVyLiRhY2NlcHROZXdNb2RlbCh0KX0kYWNjZXB0TW9kZWxDaGFuZ2VkKHQsbil7dGhpcy5fd29ya2VyVGV4dE1vZGVsU3luY1NlcnZlci4kYWNjZXB0TW9kZWxDaGFuZ2VkKHQsbil9JGFjY2VwdFJlbW92ZWRNb2RlbCh0KXt0aGlzLl93b3JrZXJUZXh0TW9kZWxTeW5jU2VydmVyLiRhY2NlcHRSZW1vdmVkTW9kZWwodCl9YXN5bmMgJGNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0cyh0LG4scil7Y29uc3Qgcz10aGlzLl9nZXRNb2RlbCh0KTtyZXR1cm4gcz9rYS5jb21wdXRlVW5pY29kZUhpZ2hsaWdodHMocyxuLHIpOntyYW5nZXM6W10saGFzTW9yZTohMSxhbWJpZ3VvdXNDaGFyYWN0ZXJDb3VudDowLGludmlzaWJsZUNoYXJhY3RlckNvdW50OjAsbm9uQmFzaWNBc2NpaUNoYXJhY3RlckNvdW50OjB9fWFzeW5jICRmaW5kU2VjdGlvbkhlYWRlcnModCxuKXtjb25zdCByPXRoaXMuX2dldE1vZGVsKHQpO3JldHVybiByP3gxKHIsbik6W119YXN5bmMgJGNvbXB1dGVEaWZmKHQsbixyLHMpe2NvbnN0IGk9dGhpcy5fZ2V0TW9kZWwodCksbz10aGlzLl9nZXRNb2RlbChuKTtyZXR1cm4haXx8IW8/bnVsbDpNdC5jb21wdXRlRGlmZihpLG8scixzKX1zdGF0aWMgY29tcHV0ZURpZmYodCxuLHIscyl7Y29uc3QgaT1zPT09ImFkdmFuY2VkIj9Ncy5nZXREZWZhdWx0KCk6TXMuZ2V0TGVnYWN5KCksbz10LmdldExpbmVzQ29udGVudCgpLGw9bi5nZXRMaW5lc0NvbnRlbnQoKSx1PWkuY29tcHV0ZURpZmYobyxsLHIpLGM9dS5jaGFuZ2VzLmxlbmd0aD4wPyExOnRoaXMuX21vZGVsc0FyZUlkZW50aWNhbCh0LG4pO2Z1bmN0aW9uIGgoZil7cmV0dXJuIGYubWFwKGQ9Pnt2YXIgbTtyZXR1cm5bZC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIsZC5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLGQubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLGQubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSwobT1kLmlubmVyQ2hhbmdlcyk9PW51bGw/dm9pZCAwOm0ubWFwKGc9PltnLm9yaWdpbmFsUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLGcub3JpZ2luYWxSYW5nZS5zdGFydENvbHVtbixnLm9yaWdpbmFsUmFuZ2UuZW5kTGluZU51bWJlcixnLm9yaWdpbmFsUmFuZ2UuZW5kQ29sdW1uLGcubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXIsZy5tb2RpZmllZFJhbmdlLnN0YXJ0Q29sdW1uLGcubW9kaWZpZWRSYW5nZS5lbmRMaW5lTnVtYmVyLGcubW9kaWZpZWRSYW5nZS5lbmRDb2x1bW5dKV19KX1yZXR1cm57aWRlbnRpY2FsOmMscXVpdEVhcmx5OnUuaGl0VGltZW91dCxjaGFuZ2VzOmgodS5jaGFuZ2VzKSxtb3Zlczp1Lm1vdmVzLm1hcChmPT5bZi5saW5lUmFuZ2VNYXBwaW5nLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcixmLmxpbmVSYW5nZU1hcHBpbmcub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxmLmxpbmVSYW5nZU1hcHBpbmcubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLGYubGluZVJhbmdlTWFwcGluZy5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLGgoZi5jaGFuZ2VzKV0pfX1zdGF0aWMgX21vZGVsc0FyZUlkZW50aWNhbCh0LG4pe2NvbnN0IHI9dC5nZXRMaW5lQ291bnQoKSxzPW4uZ2V0TGluZUNvdW50KCk7aWYociE9PXMpcmV0dXJuITE7Zm9yKGxldCBpPTE7aTw9cjtpKyspe2NvbnN0IG89dC5nZXRMaW5lQ29udGVudChpKSxsPW4uZ2V0TGluZUNvbnRlbnQoaSk7aWYobyE9PWwpcmV0dXJuITF9cmV0dXJuITB9YXN5bmMgJGNvbXB1dGVNb3JlTWluaW1hbEVkaXRzKHQsbixyKXtjb25zdCBzPXRoaXMuX2dldE1vZGVsKHQpO2lmKCFzKXJldHVybiBuO2NvbnN0IGk9W107bGV0IG87bj1uLnNsaWNlKDApLnNvcnQoKHUsYyk9PntpZih1LnJhbmdlJiZjLnJhbmdlKXJldHVybiBrLmNvbXBhcmVSYW5nZXNVc2luZ1N0YXJ0cyh1LnJhbmdlLGMucmFuZ2UpO2NvbnN0IGg9dS5yYW5nZT8wOjEsZj1jLnJhbmdlPzA6MTtyZXR1cm4gaC1mfSk7bGV0IGw9MDtmb3IobGV0IHU9MTt1PG4ubGVuZ3RoO3UrKylrLmdldEVuZFBvc2l0aW9uKG5bbF0ucmFuZ2UpLmVxdWFscyhrLmdldFN0YXJ0UG9zaXRpb24oblt1XS5yYW5nZSkpPyhuW2xdLnJhbmdlPWsuZnJvbVBvc2l0aW9ucyhrLmdldFN0YXJ0UG9zaXRpb24obltsXS5yYW5nZSksay5nZXRFbmRQb3NpdGlvbihuW3VdLnJhbmdlKSksbltsXS50ZXh0Kz1uW3VdLnRleHQpOihsKyssbltsXT1uW3VdKTtuLmxlbmd0aD1sKzE7Zm9yKGxldHtyYW5nZTp1LHRleHQ6Yyxlb2w6aH1vZiBuKXtpZih0eXBlb2YgaD09Im51bWJlciImJihvPWgpLGsuaXNFbXB0eSh1KSYmIWMpY29udGludWU7Y29uc3QgZj1zLmdldFZhbHVlSW5SYW5nZSh1KTtpZihjPWMucmVwbGFjZSgvXHJcbnxcbnxcci9nLHMuZW9sKSxmPT09Yyljb250aW51ZTtpZihNYXRoLm1heChjLmxlbmd0aCxmLmxlbmd0aCk+TXQuX2RpZmZMaW1pdCl7aS5wdXNoKHtyYW5nZTp1LHRleHQ6Y30pO2NvbnRpbnVlfWNvbnN0IGQ9ZWEoZixjLHIpLG09cy5vZmZzZXRBdChrLmxpZnQodSkuZ2V0U3RhcnRQb3NpdGlvbigpKTtmb3IoY29uc3QgZyBvZiBkKXtjb25zdCBiPXMucG9zaXRpb25BdChtK2cub3JpZ2luYWxTdGFydCksXz1zLnBvc2l0aW9uQXQobStnLm9yaWdpbmFsU3RhcnQrZy5vcmlnaW5hbExlbmd0aCksdj17dGV4dDpjLnN1YnN0cihnLm1vZGlmaWVkU3RhcnQsZy5tb2RpZmllZExlbmd0aCkscmFuZ2U6e3N0YXJ0TGluZU51bWJlcjpiLmxpbmVOdW1iZXIsc3RhcnRDb2x1bW46Yi5jb2x1bW4sZW5kTGluZU51bWJlcjpfLmxpbmVOdW1iZXIsZW5kQ29sdW1uOl8uY29sdW1ufX07cy5nZXRWYWx1ZUluUmFuZ2Uodi5yYW5nZSkhPT12LnRleHQmJmkucHVzaCh2KX19cmV0dXJuIHR5cGVvZiBvPT0ibnVtYmVyIiYmaS5wdXNoKHtlb2w6byx0ZXh0OiIiLHJhbmdlOntzdGFydExpbmVOdW1iZXI6MCxzdGFydENvbHVtbjowLGVuZExpbmVOdW1iZXI6MCxlbmRDb2x1bW46MH19KSxpfWFzeW5jICRjb21wdXRlTGlua3ModCl7Y29uc3Qgbj10aGlzLl9nZXRNb2RlbCh0KTtyZXR1cm4gbj9pYShuKTpudWxsfWFzeW5jICRjb21wdXRlRGVmYXVsdERvY3VtZW50Q29sb3JzKHQpe2NvbnN0IG49dGhpcy5fZ2V0TW9kZWwodCk7cmV0dXJuIG4/ZzEobik6bnVsbH1hc3luYyAkdGV4dHVhbFN1Z2dlc3QodCxuLHIscyl7Y29uc3QgaT1uZXcgZHQsbz1uZXcgUmVnRXhwKHIscyksbD1uZXcgU2V0O2U6Zm9yKGNvbnN0IHUgb2YgdCl7Y29uc3QgYz10aGlzLl9nZXRNb2RlbCh1KTtpZihjKXtmb3IoY29uc3QgaCBvZiBjLndvcmRzKG8pKWlmKCEoaD09PW58fCFpc05hTihOdW1iZXIoaCkpKSYmKGwuYWRkKGgpLGwuc2l6ZT5NdC5fc3VnZ2VzdGlvbnNMaW1pdCkpYnJlYWsgZX19cmV0dXJue3dvcmRzOkFycmF5LmZyb20obCksZHVyYXRpb246aS5lbGFwc2VkKCl9fWFzeW5jICRjb21wdXRlV29yZFJhbmdlcyh0LG4scixzKXtjb25zdCBpPXRoaXMuX2dldE1vZGVsKHQpO2lmKCFpKXJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO2NvbnN0IG89bmV3IFJlZ0V4cChyLHMpLGw9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IHU9bi5zdGFydExpbmVOdW1iZXI7dTxuLmVuZExpbmVOdW1iZXI7dSsrKXtjb25zdCBjPWkuZ2V0TGluZVdvcmRzKHUsbyk7Zm9yKGNvbnN0IGggb2YgYyl7aWYoIWlzTmFOKE51bWJlcihoLndvcmQpKSljb250aW51ZTtsZXQgZj1sW2gud29yZF07Znx8KGY9W10sbFtoLndvcmRdPWYpLGYucHVzaCh7c3RhcnRMaW5lTnVtYmVyOnUsc3RhcnRDb2x1bW46aC5zdGFydENvbHVtbixlbmRMaW5lTnVtYmVyOnUsZW5kQ29sdW1uOmguZW5kQ29sdW1ufSl9fXJldHVybiBsfWFzeW5jICRuYXZpZ2F0ZVZhbHVlU2V0KHQsbixyLHMsaSl7Y29uc3Qgbz10aGlzLl9nZXRNb2RlbCh0KTtpZighbylyZXR1cm4gbnVsbDtjb25zdCBsPW5ldyBSZWdFeHAocyxpKTtuLnN0YXJ0Q29sdW1uPT09bi5lbmRDb2x1bW4mJihuPXtzdGFydExpbmVOdW1iZXI6bi5zdGFydExpbmVOdW1iZXIsc3RhcnRDb2x1bW46bi5zdGFydENvbHVtbixlbmRMaW5lTnVtYmVyOm4uZW5kTGluZU51bWJlcixlbmRDb2x1bW46bi5lbmRDb2x1bW4rMX0pO2NvbnN0IHU9by5nZXRWYWx1ZUluUmFuZ2UobiksYz1vLmdldFdvcmRBdFBvc2l0aW9uKHtsaW5lTnVtYmVyOm4uc3RhcnRMaW5lTnVtYmVyLGNvbHVtbjpuLnN0YXJ0Q29sdW1ufSxsKTtpZighYylyZXR1cm4gbnVsbDtjb25zdCBoPW8uZ2V0VmFsdWVJblJhbmdlKGMpO3JldHVybiBzbi5JTlNUQU5DRS5uYXZpZ2F0ZVZhbHVlU2V0KG4sdSxjLGgscil9fTtJdC5fZGlmZkxpbWl0PTFlNSxJdC5fc3VnZ2VzdGlvbnNMaW1pdD0xZTQ7bGV0IFNuPUl0O2NsYXNzIE10IGV4dGVuZHMgU257Y29uc3RydWN0b3IodCxuKXtzdXBlcigpLHRoaXMuX2hvc3Q9dCx0aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeT1uLHRoaXMuX2ZvcmVpZ25Nb2R1bGU9bnVsbH1hc3luYyAkcGluZygpe3JldHVybiJwb25nIn0kbG9hZEZvcmVpZ25Nb2R1bGUodCxuLHIpe2NvbnN0IG89e2hvc3Q6dmEociwobCx1KT0+dGhpcy5faG9zdC4kZmhyKGwsdSkpLGdldE1pcnJvck1vZGVsczooKT0+dGhpcy5fZ2V0TW9kZWxzKCl9O3JldHVybiB0aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeT8odGhpcy5fZm9yZWlnbk1vZHVsZT10aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeShvLG4pLFByb21pc2UucmVzb2x2ZShycyh0aGlzLl9mb3JlaWduTW9kdWxlKSkpOm5ldyBQcm9taXNlKChsLHUpPT57Y29uc3QgYz1oPT57dGhpcy5fZm9yZWlnbk1vZHVsZT1oLmNyZWF0ZShvLG4pLGwocnModGhpcy5fZm9yZWlnbk1vZHVsZSkpfTtpbXBvcnQoYCR7SG4uYXNCcm93c2VyVXJpKGAke3R9LmpzYCkudG9TdHJpbmcoITApfWApLnRoZW4oYykuY2F0Y2godSl9KX0kZm1yKHQsbil7aWYoIXRoaXMuX2ZvcmVpZ25Nb2R1bGV8fHR5cGVvZiB0aGlzLl9mb3JlaWduTW9kdWxlW3RdIT0iZnVuY3Rpb24iKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIk1pc3NpbmcgcmVxdWVzdEhhbmRsZXIgb3IgbWV0aG9kOiAiK3QpKTt0cnl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9mb3JlaWduTW9kdWxlW3RdLmFwcGx5KHRoaXMuX2ZvcmVpZ25Nb2R1bGUsbikpfWNhdGNoKHIpe3JldHVybiBQcm9taXNlLnJlamVjdChyKX19fXR5cGVvZiBpbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iJiYoZ2xvYmFsVGhpcy5tb25hY289YmEoKSk7bGV0IENuPSExO2Z1bmN0aW9uIEExKGUpe2lmKENuKXJldHVybjtDbj0hMDtjb25zdCB0PW5ldyBaaShuPT57Z2xvYmFsVGhpcy5wb3N0TWVzc2FnZShuKX0sbj0+bmV3IE10KG1uLmdldENoYW5uZWwobiksZSkpO2dsb2JhbFRoaXMub25tZXNzYWdlPW49Pnt0Lm9ubWVzc2FnZShuLmRhdGEpfX1nbG9iYWxUaGlzLm9ubWVzc2FnZT1lPT57Q258fEExKG51bGwpfX0pKCk7Cg==", BRe = (s) => Uint8Array.from(atob(s), (e) => e.charCodeAt(0)), XU = typeof self < "u" && self.Blob && new Blob([BRe($8)], { type: "text/javascript;charset=utf-8" }); +function _Re(s) { + let e; + try { + if (e = XU && (self.URL || self.webkitURL).createObjectURL(XU), !e) throw ""; + const t = new Worker(e, { + name: s == null ? void 0 : s.name + }); + return t.addEventListener("error", () => { + (self.URL || self.webkitURL).revokeObjectURL(e); + }), t; + } catch { + return new Worker( + "data:text/javascript;base64," + $8, + { + name: s == null ? void 0 : s.name + } + ); + } finally { + e && (self.URL || self.webkitURL).revokeObjectURL(e); + } +} +const e6 = "dmFyIEIxPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgcTE9KHN0LFVlLFRlKT0+VWUgaW4gc3Q/QjEoc3QsVWUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlRlfSk6c3RbVWVdPVRlO3ZhciBpdD0oc3QsVWUsVGUpPT5xMShzdCx0eXBlb2YgVWUhPSJzeW1ib2wiP1VlKyIiOlVlLFRlKTsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIHFvLGpvLFdvLEhvLG1lLEc7Y2xhc3Mgc3R7Y29uc3RydWN0b3IoKXt0aGlzLmxpc3RlbmVycz1bXSx0aGlzLnVuZXhwZWN0ZWRFcnJvckhhbmRsZXI9ZnVuY3Rpb24odCl7c2V0VGltZW91dCgoKT0+e3Rocm93IHQuc3RhY2s/ZHQuaXNFcnJvck5vVGVsZW1ldHJ5KHQpP25ldyBkdCh0Lm1lc3NhZ2UrYAoKYCt0LnN0YWNrKTpuZXcgRXJyb3IodC5tZXNzYWdlK2AKCmArdC5zdGFjayk6dH0sMCl9fWVtaXQodCl7dGhpcy5saXN0ZW5lcnMuZm9yRWFjaChuPT57bih0KX0pfW9uVW5leHBlY3RlZEVycm9yKHQpe3RoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcih0KSx0aGlzLmVtaXQodCl9b25VbmV4cGVjdGVkRXh0ZXJuYWxFcnJvcih0KXt0aGlzLnVuZXhwZWN0ZWRFcnJvckhhbmRsZXIodCl9fWNvbnN0IFVlPW5ldyBzdDtmdW5jdGlvbiBUZShlKXtHbyhlKXx8VWUub25VbmV4cGVjdGVkRXJyb3IoZSl9ZnVuY3Rpb24gc2koZSl7aWYoZSBpbnN0YW5jZW9mIEVycm9yKXtjb25zdHtuYW1lOnQsbWVzc2FnZTpufT1lLHI9ZS5zdGFja3RyYWNlfHxlLnN0YWNrO3JldHVybnskaXNFcnJvcjohMCxuYW1lOnQsbWVzc2FnZTpuLHN0YWNrOnIsbm9UZWxlbWV0cnk6ZHQuaXNFcnJvck5vVGVsZW1ldHJ5KGUpfX1yZXR1cm4gZX1jb25zdCBIbj0iQ2FuY2VsZWQiO2Z1bmN0aW9uIEdvKGUpe3JldHVybiBlIGluc3RhbmNlb2YgSm8/ITA6ZSBpbnN0YW5jZW9mIEVycm9yJiZlLm5hbWU9PT1IbiYmZS5tZXNzYWdlPT09SG59Y2xhc3MgSm8gZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcigpe3N1cGVyKEhuKSx0aGlzLm5hbWU9dGhpcy5tZXNzYWdlfX1jbGFzcyBkdCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMubmFtZT0iQ29kZUV4cGVjdGVkRXJyb3IifXN0YXRpYyBmcm9tRXJyb3IodCl7aWYodCBpbnN0YW5jZW9mIGR0KXJldHVybiB0O2NvbnN0IG49bmV3IGR0O3JldHVybiBuLm1lc3NhZ2U9dC5tZXNzYWdlLG4uc3RhY2s9dC5zdGFjayxufXN0YXRpYyBpc0Vycm9yTm9UZWxlbWV0cnkodCl7cmV0dXJuIHQubmFtZT09PSJDb2RlRXhwZWN0ZWRFcnJvciJ9fWNsYXNzIGJlIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCl7c3VwZXIodHx8IkFuIHVuZXhwZWN0ZWQgYnVnIG9jY3VycmVkLiIpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLGJlLnByb3RvdHlwZSl9fWZ1bmN0aW9uIFhvKGUsdCl7Y29uc3Qgbj10aGlzO2xldCByPSExLGk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHJ8fChyPSEwLGk9ZS5hcHBseShuLGFyZ3VtZW50cykpLGl9fXZhciBhbjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh5KXtyZXR1cm4geSYmdHlwZW9mIHk9PSJvYmplY3QiJiZ0eXBlb2YgeVtTeW1ib2wuaXRlcmF0b3JdPT0iZnVuY3Rpb24ifWUuaXM9dDtjb25zdCBuPU9iamVjdC5mcmVlemUoW10pO2Z1bmN0aW9uIHIoKXtyZXR1cm4gbn1lLmVtcHR5PXI7ZnVuY3Rpb24qaSh5KXt5aWVsZCB5fWUuc2luZ2xlPWk7ZnVuY3Rpb24gcyh5KXtyZXR1cm4gdCh5KT95OmkoeSl9ZS53cmFwPXM7ZnVuY3Rpb24gYSh5KXtyZXR1cm4geXx8bn1lLmZyb209YTtmdW5jdGlvbipsKHkpe2ZvcihsZXQgYj15Lmxlbmd0aC0xO2I+PTA7Yi0tKXlpZWxkIHlbYl19ZS5yZXZlcnNlPWw7ZnVuY3Rpb24gbyh5KXtyZXR1cm4heXx8eVtTeW1ib2wuaXRlcmF0b3JdKCkubmV4dCgpLmRvbmU9PT0hMH1lLmlzRW1wdHk9bztmdW5jdGlvbiB1KHkpe3JldHVybiB5W1N5bWJvbC5pdGVyYXRvcl0oKS5uZXh0KCkudmFsdWV9ZS5maXJzdD11O2Z1bmN0aW9uIGgoeSxiKXtsZXQgXz0wO2Zvcihjb25zdCBBIG9mIHkpaWYoYihBLF8rKykpcmV0dXJuITA7cmV0dXJuITF9ZS5zb21lPWg7ZnVuY3Rpb24gZih5LGIpe2Zvcihjb25zdCBfIG9mIHkpaWYoYihfKSlyZXR1cm4gX31lLmZpbmQ9ZjtmdW5jdGlvbipkKHksYil7Zm9yKGNvbnN0IF8gb2YgeSliKF8pJiYoeWllbGQgXyl9ZS5maWx0ZXI9ZDtmdW5jdGlvbiptKHksYil7bGV0IF89MDtmb3IoY29uc3QgQSBvZiB5KXlpZWxkIGIoQSxfKyspfWUubWFwPW07ZnVuY3Rpb24qZyh5LGIpe2xldCBfPTA7Zm9yKGNvbnN0IEEgb2YgeSl5aWVsZCpiKEEsXysrKX1lLmZsYXRNYXA9ZztmdW5jdGlvbipwKC4uLnkpe2Zvcihjb25zdCBiIG9mIHkpeWllbGQqYn1lLmNvbmNhdD1wO2Z1bmN0aW9uIHgoeSxiLF8pe2xldCBBPV87Zm9yKGNvbnN0IEMgb2YgeSlBPWIoQSxDKTtyZXR1cm4gQX1lLnJlZHVjZT14O2Z1bmN0aW9uKncoeSxiLF89eS5sZW5ndGgpe2ZvcihiPDAmJihiKz15Lmxlbmd0aCksXzwwP18rPXkubGVuZ3RoOl8+eS5sZW5ndGgmJihfPXkubGVuZ3RoKTtiPF87YisrKXlpZWxkIHlbYl19ZS5zbGljZT13O2Z1bmN0aW9uIEwoeSxiPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSl7Y29uc3QgXz1bXTtpZihiPT09MClyZXR1cm5bXyx5XTtjb25zdCBBPXlbU3ltYm9sLml0ZXJhdG9yXSgpO2ZvcihsZXQgQz0wO0M8YjtDKyspe2NvbnN0IEY9QS5uZXh0KCk7aWYoRi5kb25lKXJldHVybltfLGUuZW1wdHkoKV07Xy5wdXNoKEYudmFsdWUpfXJldHVybltfLHtbU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBBfX1dfWUuY29uc3VtZT1MO2FzeW5jIGZ1bmN0aW9uIHYoeSl7Y29uc3QgYj1bXTtmb3IgYXdhaXQoY29uc3QgXyBvZiB5KWIucHVzaChfKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGIpfWUuYXN5bmNUb0FycmF5PXZ9KShhbnx8KGFuPXt9KSk7ZnVuY3Rpb24gajEoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gVzEoZSx0KXt9ZnVuY3Rpb24gYWkoZSl7aWYoYW4uaXMoZSkpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IG4gb2YgZSlpZihuKXRyeXtuLmRpc3Bvc2UoKX1jYXRjaChyKXt0LnB1c2gocil9aWYodC5sZW5ndGg9PT0xKXRocm93IHRbMF07aWYodC5sZW5ndGg+MSl0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IodCwiRW5jb3VudGVyZWQgZXJyb3JzIHdoaWxlIGRpc3Bvc2luZyBvZiBzdG9yZSIpO3JldHVybiBBcnJheS5pc0FycmF5KGUpP1tdOmV9ZWxzZSBpZihlKXJldHVybiBlLmRpc3Bvc2UoKSxlfWZ1bmN0aW9uIFFvKC4uLmUpe3JldHVybiBvbigoKT0+YWkoZSkpfWZ1bmN0aW9uIG9uKGUpe3JldHVybntkaXNwb3NlOlhvKCgpPT57ZSgpfSl9fWNvbnN0IFZuPWNsYXNzIFZue2NvbnN0cnVjdG9yKCl7dGhpcy5fdG9EaXNwb3NlPW5ldyBTZXQsdGhpcy5faXNEaXNwb3NlZD0hMX1kaXNwb3NlKCl7dGhpcy5faXNEaXNwb3NlZHx8KHRoaXMuX2lzRGlzcG9zZWQ9ITAsdGhpcy5jbGVhcigpKX1nZXQgaXNEaXNwb3NlZCgpe3JldHVybiB0aGlzLl9pc0Rpc3Bvc2VkfWNsZWFyKCl7aWYodGhpcy5fdG9EaXNwb3NlLnNpemUhPT0wKXRyeXthaSh0aGlzLl90b0Rpc3Bvc2UpfWZpbmFsbHl7dGhpcy5fdG9EaXNwb3NlLmNsZWFyKCl9fWFkZCh0KXtpZighdClyZXR1cm4gdDtpZih0PT09dGhpcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWdpc3RlciBhIGRpc3Bvc2FibGUgb24gaXRzZWxmISIpO3JldHVybiB0aGlzLl9pc0Rpc3Bvc2VkP1ZuLkRJU0FCTEVfRElTUE9TRURfV0FSTklOR3x8Y29uc29sZS53YXJuKG5ldyBFcnJvcigiVHJ5aW5nIHRvIGFkZCBhIGRpc3Bvc2FibGUgdG8gYSBEaXNwb3NhYmxlU3RvcmUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkIG9mLiBUaGUgYWRkZWQgb2JqZWN0IHdpbGwgYmUgbGVha2VkISIpLnN0YWNrKTp0aGlzLl90b0Rpc3Bvc2UuYWRkKHQpLHR9ZGVsZXRlQW5kTGVhayh0KXt0JiZ0aGlzLl90b0Rpc3Bvc2UuaGFzKHQpJiZ0aGlzLl90b0Rpc3Bvc2UuZGVsZXRlKHQpfX07Vm4uRElTQUJMRV9ESVNQT1NFRF9XQVJOSU5HPSExO2xldCAkdD1Wbjtjb25zdCByaT1jbGFzcyByaXtjb25zdHJ1Y3Rvcigpe3RoaXMuX3N0b3JlPW5ldyAkdCx0aGlzLl9zdG9yZX1kaXNwb3NlKCl7dGhpcy5fc3RvcmUuZGlzcG9zZSgpfV9yZWdpc3Rlcih0KXtpZih0PT09dGhpcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWdpc3RlciBhIGRpc3Bvc2FibGUgb24gaXRzZWxmISIpO3JldHVybiB0aGlzLl9zdG9yZS5hZGQodCl9fTtyaS5Ob25lPU9iamVjdC5mcmVlemUoe2Rpc3Bvc2UoKXt9fSk7bGV0IG10PXJpO2NvbnN0IFB0PWNsYXNzIFB0e2NvbnN0cnVjdG9yKHQpe3RoaXMuZWxlbWVudD10LHRoaXMubmV4dD1QdC5VbmRlZmluZWQsdGhpcy5wcmV2PVB0LlVuZGVmaW5lZH19O1B0LlVuZGVmaW5lZD1uZXcgUHQodm9pZCAwKTtsZXQgUT1QdDtjbGFzcyBZb3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2ZpcnN0PVEuVW5kZWZpbmVkLHRoaXMuX2xhc3Q9US5VbmRlZmluZWQsdGhpcy5fc2l6ZT0wfWdldCBzaXplKCl7cmV0dXJuIHRoaXMuX3NpemV9aXNFbXB0eSgpe3JldHVybiB0aGlzLl9maXJzdD09PVEuVW5kZWZpbmVkfWNsZWFyKCl7bGV0IHQ9dGhpcy5fZmlyc3Q7Zm9yKDt0IT09US5VbmRlZmluZWQ7KXtjb25zdCBuPXQubmV4dDt0LnByZXY9US5VbmRlZmluZWQsdC5uZXh0PVEuVW5kZWZpbmVkLHQ9bn10aGlzLl9maXJzdD1RLlVuZGVmaW5lZCx0aGlzLl9sYXN0PVEuVW5kZWZpbmVkLHRoaXMuX3NpemU9MH11bnNoaWZ0KHQpe3JldHVybiB0aGlzLl9pbnNlcnQodCwhMSl9cHVzaCh0KXtyZXR1cm4gdGhpcy5faW5zZXJ0KHQsITApfV9pbnNlcnQodCxuKXtjb25zdCByPW5ldyBRKHQpO2lmKHRoaXMuX2ZpcnN0PT09US5VbmRlZmluZWQpdGhpcy5fZmlyc3Q9cix0aGlzLl9sYXN0PXI7ZWxzZSBpZihuKXtjb25zdCBzPXRoaXMuX2xhc3Q7dGhpcy5fbGFzdD1yLHIucHJldj1zLHMubmV4dD1yfWVsc2V7Y29uc3Qgcz10aGlzLl9maXJzdDt0aGlzLl9maXJzdD1yLHIubmV4dD1zLHMucHJldj1yfXRoaXMuX3NpemUrPTE7bGV0IGk9ITE7cmV0dXJuKCk9PntpfHwoaT0hMCx0aGlzLl9yZW1vdmUocikpfX1zaGlmdCgpe2lmKHRoaXMuX2ZpcnN0IT09US5VbmRlZmluZWQpe2NvbnN0IHQ9dGhpcy5fZmlyc3QuZWxlbWVudDtyZXR1cm4gdGhpcy5fcmVtb3ZlKHRoaXMuX2ZpcnN0KSx0fX1wb3AoKXtpZih0aGlzLl9sYXN0IT09US5VbmRlZmluZWQpe2NvbnN0IHQ9dGhpcy5fbGFzdC5lbGVtZW50O3JldHVybiB0aGlzLl9yZW1vdmUodGhpcy5fbGFzdCksdH19X3JlbW92ZSh0KXtpZih0LnByZXYhPT1RLlVuZGVmaW5lZCYmdC5uZXh0IT09US5VbmRlZmluZWQpe2NvbnN0IG49dC5wcmV2O24ubmV4dD10Lm5leHQsdC5uZXh0LnByZXY9bn1lbHNlIHQucHJldj09PVEuVW5kZWZpbmVkJiZ0Lm5leHQ9PT1RLlVuZGVmaW5lZD8odGhpcy5fZmlyc3Q9US5VbmRlZmluZWQsdGhpcy5fbGFzdD1RLlVuZGVmaW5lZCk6dC5uZXh0PT09US5VbmRlZmluZWQ/KHRoaXMuX2xhc3Q9dGhpcy5fbGFzdC5wcmV2LHRoaXMuX2xhc3QubmV4dD1RLlVuZGVmaW5lZCk6dC5wcmV2PT09US5VbmRlZmluZWQmJih0aGlzLl9maXJzdD10aGlzLl9maXJzdC5uZXh0LHRoaXMuX2ZpcnN0LnByZXY9US5VbmRlZmluZWQpO3RoaXMuX3NpemUtPTF9KltTeW1ib2wuaXRlcmF0b3JdKCl7bGV0IHQ9dGhpcy5fZmlyc3Q7Zm9yKDt0IT09US5VbmRlZmluZWQ7KXlpZWxkIHQuZWxlbWVudCx0PXQubmV4dH19Y29uc3QgWm89Z2xvYmFsVGhpcy5wZXJmb3JtYW5jZSYmdHlwZW9mIGdsb2JhbFRoaXMucGVyZm9ybWFuY2Uubm93PT0iZnVuY3Rpb24iO2NsYXNzIGxue3N0YXRpYyBjcmVhdGUodCl7cmV0dXJuIG5ldyBsbih0KX1jb25zdHJ1Y3Rvcih0KXt0aGlzLl9ub3c9Wm8mJnQ9PT0hMT9EYXRlLm5vdzpnbG9iYWxUaGlzLnBlcmZvcm1hbmNlLm5vdy5iaW5kKGdsb2JhbFRoaXMucGVyZm9ybWFuY2UpLHRoaXMuX3N0YXJ0VGltZT10aGlzLl9ub3coKSx0aGlzLl9zdG9wVGltZT0tMX1zdG9wKCl7dGhpcy5fc3RvcFRpbWU9dGhpcy5fbm93KCl9cmVzZXQoKXt0aGlzLl9zdGFydFRpbWU9dGhpcy5fbm93KCksdGhpcy5fc3RvcFRpbWU9LTF9ZWxhcHNlZCgpe3JldHVybiB0aGlzLl9zdG9wVGltZSE9PS0xP3RoaXMuX3N0b3BUaW1lLXRoaXMuX3N0YXJ0VGltZTp0aGlzLl9ub3coKS10aGlzLl9zdGFydFRpbWV9fXZhciB1bjsoZnVuY3Rpb24oZSl7ZS5Ob25lPSgpPT5tdC5Ob25lO2Z1bmN0aW9uIHQoayxSKXtyZXR1cm4gZChrLCgpPT57fSwwLHZvaWQgMCwhMCx2b2lkIDAsUil9ZS5kZWZlcj10O2Z1bmN0aW9uIG4oayl7cmV0dXJuKFIsST1udWxsLFQpPT57bGV0IFA9ITEsRDtyZXR1cm4gRD1rKCQ9PntpZighUClyZXR1cm4gRD9ELmRpc3Bvc2UoKTpQPSEwLFIuY2FsbChJLCQpfSxudWxsLFQpLFAmJkQuZGlzcG9zZSgpLER9fWUub25jZT1uO2Z1bmN0aW9uIHIoayxSKXtyZXR1cm4gZS5vbmNlKGUuZmlsdGVyKGssUikpfWUub25jZUlmPXI7ZnVuY3Rpb24gaShrLFIsSSl7cmV0dXJuIGgoKFQsUD1udWxsLEQpPT5rKCQ9PlQuY2FsbChQLFIoJCkpLG51bGwsRCksSSl9ZS5tYXA9aTtmdW5jdGlvbiBzKGssUixJKXtyZXR1cm4gaCgoVCxQPW51bGwsRCk9PmsoJD0+e1IoJCksVC5jYWxsKFAsJCl9LG51bGwsRCksSSl9ZS5mb3JFYWNoPXM7ZnVuY3Rpb24gYShrLFIsSSl7cmV0dXJuIGgoKFQsUD1udWxsLEQpPT5rKCQ9PlIoJCkmJlQuY2FsbChQLCQpLG51bGwsRCksSSl9ZS5maWx0ZXI9YTtmdW5jdGlvbiBsKGspe3JldHVybiBrfWUuc2lnbmFsPWw7ZnVuY3Rpb24gbyguLi5rKXtyZXR1cm4oUixJPW51bGwsVCk9Pntjb25zdCBQPVFvKC4uLmsubWFwKEQ9PkQoJD0+Ui5jYWxsKEksJCkpKSk7cmV0dXJuIGYoUCxUKX19ZS5hbnk9bztmdW5jdGlvbiB1KGssUixJLFQpe2xldCBQPUk7cmV0dXJuIGkoayxEPT4oUD1SKFAsRCksUCksVCl9ZS5yZWR1Y2U9dTtmdW5jdGlvbiBoKGssUil7bGV0IEk7Y29uc3QgVD17b25XaWxsQWRkRmlyc3RMaXN0ZW5lcigpe0k9ayhQLmZpcmUsUCl9LG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyKCl7ST09bnVsbHx8SS5kaXNwb3NlKCl9fSxQPW5ldyBfZShUKTtyZXR1cm4gUj09bnVsbHx8Ui5hZGQoUCksUC5ldmVudH1mdW5jdGlvbiBmKGssUil7cmV0dXJuIFIgaW5zdGFuY2VvZiBBcnJheT9SLnB1c2goayk6UiYmUi5hZGQoayksa31mdW5jdGlvbiBkKGssUixJPTEwMCxUPSExLFA9ITEsRCwkKXtsZXQgaixuZSxPdCxxbj0wLGZ0O2NvbnN0IE8xPXtsZWFrV2FybmluZ1RocmVzaG9sZDpELG9uV2lsbEFkZEZpcnN0TGlzdGVuZXIoKXtqPWsoJDE9PntxbisrLG5lPVIobmUsJDEpLFQmJiFPdCYmKGpuLmZpcmUobmUpLG5lPXZvaWQgMCksZnQ9KCk9Pntjb25zdCBVMT1uZTtuZT12b2lkIDAsT3Q9dm9pZCAwLCghVHx8cW4+MSkmJmpuLmZpcmUoVTEpLHFuPTB9LHR5cGVvZiBJPT0ibnVtYmVyIj8oY2xlYXJUaW1lb3V0KE90KSxPdD1zZXRUaW1lb3V0KGZ0LEkpKTpPdD09PXZvaWQgMCYmKE90PTAscXVldWVNaWNyb3Rhc2soZnQpKX0pfSxvbldpbGxSZW1vdmVMaXN0ZW5lcigpe1AmJnFuPjAmJihmdD09bnVsbHx8ZnQoKSl9LG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyKCl7ZnQ9dm9pZCAwLGouZGlzcG9zZSgpfX0sam49bmV3IF9lKE8xKTtyZXR1cm4gJD09bnVsbHx8JC5hZGQoam4pLGpuLmV2ZW50fWUuZGVib3VuY2U9ZDtmdW5jdGlvbiBtKGssUj0wLEkpe3JldHVybiBlLmRlYm91bmNlKGssKFQsUCk9PlQ/KFQucHVzaChQKSxUKTpbUF0sUix2b2lkIDAsITAsdm9pZCAwLEkpfWUuYWNjdW11bGF0ZT1tO2Z1bmN0aW9uIGcoayxSPShULFApPT5UPT09UCxJKXtsZXQgVD0hMCxQO3JldHVybiBhKGssRD0+e2NvbnN0ICQ9VHx8IVIoRCxQKTtyZXR1cm4gVD0hMSxQPUQsJH0sSSl9ZS5sYXRjaD1nO2Z1bmN0aW9uIHAoayxSLEkpe3JldHVybltlLmZpbHRlcihrLFIsSSksZS5maWx0ZXIoayxUPT4hUihUKSxJKV19ZS5zcGxpdD1wO2Z1bmN0aW9uIHgoayxSPSExLEk9W10sVCl7bGV0IFA9SS5zbGljZSgpLEQ9ayhuZT0+e1A/UC5wdXNoKG5lKTpqLmZpcmUobmUpfSk7VCYmVC5hZGQoRCk7Y29uc3QgJD0oKT0+e1A9PW51bGx8fFAuZm9yRWFjaChuZT0+ai5maXJlKG5lKSksUD1udWxsfSxqPW5ldyBfZSh7b25XaWxsQWRkRmlyc3RMaXN0ZW5lcigpe0R8fChEPWsobmU9PmouZmlyZShuZSkpLFQmJlQuYWRkKEQpKX0sb25EaWRBZGRGaXJzdExpc3RlbmVyKCl7UCYmKFI/c2V0VGltZW91dCgkKTokKCkpfSxvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcigpe0QmJkQuZGlzcG9zZSgpLEQ9bnVsbH19KTtyZXR1cm4gVCYmVC5hZGQoaiksai5ldmVudH1lLmJ1ZmZlcj14O2Z1bmN0aW9uIHcoayxSKXtyZXR1cm4oVCxQLEQpPT57Y29uc3QgJD1SKG5ldyB2KTtyZXR1cm4gayhmdW5jdGlvbihqKXtjb25zdCBuZT0kLmV2YWx1YXRlKGopO25lIT09TCYmVC5jYWxsKFAsbmUpfSx2b2lkIDAsRCl9fWUuY2hhaW49dztjb25zdCBMPVN5bWJvbCgiSGFsdENoYWluYWJsZSIpO2NsYXNzIHZ7Y29uc3RydWN0b3IoKXt0aGlzLnN0ZXBzPVtdfW1hcChSKXtyZXR1cm4gdGhpcy5zdGVwcy5wdXNoKFIpLHRoaXN9Zm9yRWFjaChSKXtyZXR1cm4gdGhpcy5zdGVwcy5wdXNoKEk9PihSKEkpLEkpKSx0aGlzfWZpbHRlcihSKXtyZXR1cm4gdGhpcy5zdGVwcy5wdXNoKEk9PlIoSSk/STpMKSx0aGlzfXJlZHVjZShSLEkpe2xldCBUPUk7cmV0dXJuIHRoaXMuc3RlcHMucHVzaChQPT4oVD1SKFQsUCksVCkpLHRoaXN9bGF0Y2goUj0oSSxUKT0+ST09PVQpe2xldCBJPSEwLFQ7cmV0dXJuIHRoaXMuc3RlcHMucHVzaChQPT57Y29uc3QgRD1JfHwhUihQLFQpO3JldHVybiBJPSExLFQ9UCxEP1A6TH0pLHRoaXN9ZXZhbHVhdGUoUil7Zm9yKGNvbnN0IEkgb2YgdGhpcy5zdGVwcylpZihSPUkoUiksUj09PUwpYnJlYWs7cmV0dXJuIFJ9fWZ1bmN0aW9uIHkoayxSLEk9VD0+VCl7Y29uc3QgVD0oLi4uaik9PiQuZmlyZShJKC4uLmopKSxQPSgpPT5rLm9uKFIsVCksRD0oKT0+ay5yZW1vdmVMaXN0ZW5lcihSLFQpLCQ9bmV3IF9lKHtvbldpbGxBZGRGaXJzdExpc3RlbmVyOlAsb25EaWRSZW1vdmVMYXN0TGlzdGVuZXI6RH0pO3JldHVybiAkLmV2ZW50fWUuZnJvbU5vZGVFdmVudEVtaXR0ZXI9eTtmdW5jdGlvbiBiKGssUixJPVQ9PlQpe2NvbnN0IFQ9KC4uLmopPT4kLmZpcmUoSSguLi5qKSksUD0oKT0+ay5hZGRFdmVudExpc3RlbmVyKFIsVCksRD0oKT0+ay5yZW1vdmVFdmVudExpc3RlbmVyKFIsVCksJD1uZXcgX2Uoe29uV2lsbEFkZEZpcnN0TGlzdGVuZXI6UCxvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcjpEfSk7cmV0dXJuICQuZXZlbnR9ZS5mcm9tRE9NRXZlbnRFbWl0dGVyPWI7ZnVuY3Rpb24gXyhrKXtyZXR1cm4gbmV3IFByb21pc2UoUj0+bihrKShSKSl9ZS50b1Byb21pc2U9XztmdW5jdGlvbiBBKGspe2NvbnN0IFI9bmV3IF9lO3JldHVybiBrLnRoZW4oST0+e1IuZmlyZShJKX0sKCk9PntSLmZpcmUodm9pZCAwKX0pLmZpbmFsbHkoKCk9PntSLmRpc3Bvc2UoKX0pLFIuZXZlbnR9ZS5mcm9tUHJvbWlzZT1BO2Z1bmN0aW9uIEMoayxSKXtyZXR1cm4gayhJPT5SLmZpcmUoSSkpfWUuZm9yd2FyZD1DO2Z1bmN0aW9uIEYoayxSLEkpe3JldHVybiBSKEkpLGsoVD0+UihUKSl9ZS5ydW5BbmRTdWJzY3JpYmU9RjtjbGFzcyBPe2NvbnN0cnVjdG9yKFIsSSl7dGhpcy5fb2JzZXJ2YWJsZT1SLHRoaXMuX2NvdW50ZXI9MCx0aGlzLl9oYXNDaGFuZ2VkPSExO2NvbnN0IFQ9e29uV2lsbEFkZEZpcnN0TGlzdGVuZXI6KCk9PntSLmFkZE9ic2VydmVyKHRoaXMpLHRoaXMuX29ic2VydmFibGUucmVwb3J0Q2hhbmdlcygpfSxvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcjooKT0+e1IucmVtb3ZlT2JzZXJ2ZXIodGhpcyl9fTt0aGlzLmVtaXR0ZXI9bmV3IF9lKFQpLEkmJkkuYWRkKHRoaXMuZW1pdHRlcil9YmVnaW5VcGRhdGUoUil7dGhpcy5fY291bnRlcisrfWhhbmRsZVBvc3NpYmxlQ2hhbmdlKFIpe31oYW5kbGVDaGFuZ2UoUixJKXt0aGlzLl9oYXNDaGFuZ2VkPSEwfWVuZFVwZGF0ZShSKXt0aGlzLl9jb3VudGVyLS0sdGhpcy5fY291bnRlcj09PTAmJih0aGlzLl9vYnNlcnZhYmxlLnJlcG9ydENoYW5nZXMoKSx0aGlzLl9oYXNDaGFuZ2VkJiYodGhpcy5faGFzQ2hhbmdlZD0hMSx0aGlzLmVtaXR0ZXIuZmlyZSh0aGlzLl9vYnNlcnZhYmxlLmdldCgpKSkpfX1mdW5jdGlvbiBNKGssUil7cmV0dXJuIG5ldyBPKGssUikuZW1pdHRlci5ldmVudH1lLmZyb21PYnNlcnZhYmxlPU07ZnVuY3Rpb24gTihrKXtyZXR1cm4oUixJLFQpPT57bGV0IFA9MCxEPSExO2NvbnN0ICQ9e2JlZ2luVXBkYXRlKCl7UCsrfSxlbmRVcGRhdGUoKXtQLS0sUD09PTAmJihrLnJlcG9ydENoYW5nZXMoKSxEJiYoRD0hMSxSLmNhbGwoSSkpKX0saGFuZGxlUG9zc2libGVDaGFuZ2UoKXt9LGhhbmRsZUNoYW5nZSgpe0Q9ITB9fTtrLmFkZE9ic2VydmVyKCQpLGsucmVwb3J0Q2hhbmdlcygpO2NvbnN0IGo9e2Rpc3Bvc2UoKXtrLnJlbW92ZU9ic2VydmVyKCQpfX07cmV0dXJuIFQgaW5zdGFuY2VvZiAkdD9ULmFkZChqKTpBcnJheS5pc0FycmF5KFQpJiZULnB1c2goaiksan19ZS5mcm9tT2JzZXJ2YWJsZUxpZ2h0PU59KSh1bnx8KHVuPXt9KSk7Y29uc3QgSXQ9Y2xhc3MgSXR7Y29uc3RydWN0b3IodCl7dGhpcy5saXN0ZW5lckNvdW50PTAsdGhpcy5pbnZvY2F0aW9uQ291bnQ9MCx0aGlzLmVsYXBzZWRPdmVyYWxsPTAsdGhpcy5kdXJhdGlvbnM9W10sdGhpcy5uYW1lPWAke3R9XyR7SXQuX2lkUG9vbCsrfWAsSXQuYWxsLmFkZCh0aGlzKX1zdGFydCh0KXt0aGlzLl9zdG9wV2F0Y2g9bmV3IGxuLHRoaXMubGlzdGVuZXJDb3VudD10fXN0b3AoKXtpZih0aGlzLl9zdG9wV2F0Y2gpe2NvbnN0IHQ9dGhpcy5fc3RvcFdhdGNoLmVsYXBzZWQoKTt0aGlzLmR1cmF0aW9ucy5wdXNoKHQpLHRoaXMuZWxhcHNlZE92ZXJhbGwrPXQsdGhpcy5pbnZvY2F0aW9uQ291bnQrPTEsdGhpcy5fc3RvcFdhdGNoPXZvaWQgMH19fTtJdC5hbGw9bmV3IFNldCxJdC5faWRQb29sPTA7bGV0IHpuPUl0LEtvPS0xO2NvbnN0IERuPWNsYXNzIERue2NvbnN0cnVjdG9yKHQsbixyPShEbi5faWRQb29sKyspLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgzLCIwIikpe3RoaXMuX2Vycm9ySGFuZGxlcj10LHRoaXMudGhyZXNob2xkPW4sdGhpcy5uYW1lPXIsdGhpcy5fd2FybkNvdW50ZG93bj0wfWRpc3Bvc2UoKXt2YXIgdDsodD10aGlzLl9zdGFja3MpPT1udWxsfHx0LmNsZWFyKCl9Y2hlY2sodCxuKXtjb25zdCByPXRoaXMudGhyZXNob2xkO2lmKHI8PTB8fG48cilyZXR1cm47dGhpcy5fc3RhY2tzfHwodGhpcy5fc3RhY2tzPW5ldyBNYXApO2NvbnN0IGk9dGhpcy5fc3RhY2tzLmdldCh0LnZhbHVlKXx8MDtpZih0aGlzLl9zdGFja3Muc2V0KHQudmFsdWUsaSsxKSx0aGlzLl93YXJuQ291bnRkb3duLT0xLHRoaXMuX3dhcm5Db3VudGRvd248PTApe3RoaXMuX3dhcm5Db3VudGRvd249ciouNTtjb25zdFtzLGFdPXRoaXMuZ2V0TW9zdEZyZXF1ZW50U3RhY2soKSxsPWBbJHt0aGlzLm5hbWV9XSBwb3RlbnRpYWwgbGlzdGVuZXIgTEVBSyBkZXRlY3RlZCwgaGF2aW5nICR7bn0gbGlzdGVuZXJzIGFscmVhZHkuIE1PU1QgZnJlcXVlbnQgbGlzdGVuZXIgKCR7YX0pOmA7Y29uc29sZS53YXJuKGwpLGNvbnNvbGUud2FybihzKTtjb25zdCBvPW5ldyBlbChsLHMpO3RoaXMuX2Vycm9ySGFuZGxlcihvKX1yZXR1cm4oKT0+e2NvbnN0IHM9dGhpcy5fc3RhY2tzLmdldCh0LnZhbHVlKXx8MDt0aGlzLl9zdGFja3Muc2V0KHQudmFsdWUscy0xKX19Z2V0TW9zdEZyZXF1ZW50U3RhY2soKXtpZighdGhpcy5fc3RhY2tzKXJldHVybjtsZXQgdCxuPTA7Zm9yKGNvbnN0W3IsaV1vZiB0aGlzLl9zdGFja3MpKCF0fHxuPGkpJiYodD1bcixpXSxuPWkpO3JldHVybiB0fX07RG4uX2lkUG9vbD0xO2xldCBHbj1EbjtjbGFzcyBKbntzdGF0aWMgY3JlYXRlKCl7Y29uc3QgdD1uZXcgRXJyb3I7cmV0dXJuIG5ldyBKbih0LnN0YWNrPz8iIil9Y29uc3RydWN0b3IodCl7dGhpcy52YWx1ZT10fXByaW50KCl7Y29uc29sZS53YXJuKHRoaXMudmFsdWUuc3BsaXQoYApgKS5zbGljZSgyKS5qb2luKGAKYCkpfX1jbGFzcyBlbCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsbil7c3VwZXIodCksdGhpcy5uYW1lPSJMaXN0ZW5lckxlYWtFcnJvciIsdGhpcy5zdGFjaz1ufX1jbGFzcyB0bCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsbil7c3VwZXIodCksdGhpcy5uYW1lPSJMaXN0ZW5lclJlZnVzYWxFcnJvciIsdGhpcy5zdGFjaz1ufX1jbGFzcyBYbntjb25zdHJ1Y3Rvcih0KXt0aGlzLnZhbHVlPXR9fWNvbnN0IG5sPTI7Y2xhc3MgX2V7Y29uc3RydWN0b3IodCl7dmFyIG4scixpLHM7dGhpcy5fc2l6ZT0wLHRoaXMuX29wdGlvbnM9dCx0aGlzLl9sZWFrYWdlTW9uPShuPXRoaXMuX29wdGlvbnMpIT1udWxsJiZuLmxlYWtXYXJuaW5nVGhyZXNob2xkP25ldyBHbigodD09bnVsbD92b2lkIDA6dC5vbkxpc3RlbmVyRXJyb3IpPz9UZSwoKHI9dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOnIubGVha1dhcm5pbmdUaHJlc2hvbGQpPz9Lbyk6dm9pZCAwLHRoaXMuX3BlcmZNb249KGk9dGhpcy5fb3B0aW9ucykhPW51bGwmJmkuX3Byb2ZOYW1lP25ldyB6bih0aGlzLl9vcHRpb25zLl9wcm9mTmFtZSk6dm9pZCAwLHRoaXMuX2RlbGl2ZXJ5UXVldWU9KHM9dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOnMuZGVsaXZlcnlRdWV1ZX1kaXNwb3NlKCl7dmFyIHQsbixyLGk7dGhpcy5fZGlzcG9zZWR8fCh0aGlzLl9kaXNwb3NlZD0hMCwoKHQ9dGhpcy5fZGVsaXZlcnlRdWV1ZSk9PW51bGw/dm9pZCAwOnQuY3VycmVudCk9PT10aGlzJiZ0aGlzLl9kZWxpdmVyeVF1ZXVlLnJlc2V0KCksdGhpcy5fbGlzdGVuZXJzJiYodGhpcy5fbGlzdGVuZXJzPXZvaWQgMCx0aGlzLl9zaXplPTApLChyPShuPXRoaXMuX29wdGlvbnMpPT1udWxsP3ZvaWQgMDpuLm9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyKT09bnVsbHx8ci5jYWxsKG4pLChpPXRoaXMuX2xlYWthZ2VNb24pPT1udWxsfHxpLmRpc3Bvc2UoKSl9Z2V0IGV2ZW50KCl7cmV0dXJuIHRoaXMuX2V2ZW50Pz8odGhpcy5fZXZlbnQ9KHQsbixyKT0+e3ZhciBsLG8sdSxoLGY7aWYodGhpcy5fbGVha2FnZU1vbiYmdGhpcy5fc2l6ZT50aGlzLl9sZWFrYWdlTW9uLnRocmVzaG9sZCoqMil7Y29uc3QgZD1gWyR7dGhpcy5fbGVha2FnZU1vbi5uYW1lfV0gUkVGVVNFUyB0byBhY2NlcHQgbmV3IGxpc3RlbmVycyBiZWNhdXNlIGl0IGV4Y2VlZGVkIGl0cyB0aHJlc2hvbGQgYnkgZmFyICgke3RoaXMuX3NpemV9IHZzICR7dGhpcy5fbGVha2FnZU1vbi50aHJlc2hvbGR9KWA7Y29uc29sZS53YXJuKGQpO2NvbnN0IG09dGhpcy5fbGVha2FnZU1vbi5nZXRNb3N0RnJlcXVlbnRTdGFjaygpPz9bIlVOS05PV04gc3RhY2siLC0xXSxnPW5ldyB0bChgJHtkfS4gSElOVDogU3RhY2sgc2hvd3MgbW9zdCBmcmVxdWVudCBsaXN0ZW5lciAoJHttWzFdfS10aW1lcylgLG1bMF0pO3JldHVybigoKGw9dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOmwub25MaXN0ZW5lckVycm9yKXx8VGUpKGcpLG10Lk5vbmV9aWYodGhpcy5fZGlzcG9zZWQpcmV0dXJuIG10Lk5vbmU7biYmKHQ9dC5iaW5kKG4pKTtjb25zdCBpPW5ldyBYbih0KTtsZXQgczt0aGlzLl9sZWFrYWdlTW9uJiZ0aGlzLl9zaXplPj1NYXRoLmNlaWwodGhpcy5fbGVha2FnZU1vbi50aHJlc2hvbGQqLjIpJiYoaS5zdGFjaz1Kbi5jcmVhdGUoKSxzPXRoaXMuX2xlYWthZ2VNb24uY2hlY2soaS5zdGFjayx0aGlzLl9zaXplKzEpKSx0aGlzLl9saXN0ZW5lcnM/dGhpcy5fbGlzdGVuZXJzIGluc3RhbmNlb2YgWG4/KHRoaXMuX2RlbGl2ZXJ5UXVldWU/Pyh0aGlzLl9kZWxpdmVyeVF1ZXVlPW5ldyBybCksdGhpcy5fbGlzdGVuZXJzPVt0aGlzLl9saXN0ZW5lcnMsaV0pOnRoaXMuX2xpc3RlbmVycy5wdXNoKGkpOigodT0obz10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6by5vbldpbGxBZGRGaXJzdExpc3RlbmVyKT09bnVsbHx8dS5jYWxsKG8sdGhpcyksdGhpcy5fbGlzdGVuZXJzPWksKGY9KGg9dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOmgub25EaWRBZGRGaXJzdExpc3RlbmVyKT09bnVsbHx8Zi5jYWxsKGgsdGhpcykpLHRoaXMuX3NpemUrKztjb25zdCBhPW9uKCgpPT57cz09bnVsbHx8cygpLHRoaXMuX3JlbW92ZUxpc3RlbmVyKGkpfSk7cmV0dXJuIHIgaW5zdGFuY2VvZiAkdD9yLmFkZChhKTpBcnJheS5pc0FycmF5KHIpJiZyLnB1c2goYSksYX0pLHRoaXMuX2V2ZW50fV9yZW1vdmVMaXN0ZW5lcih0KXt2YXIgcyxhLGwsbztpZigoYT0ocz10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6cy5vbldpbGxSZW1vdmVMaXN0ZW5lcik9PW51bGx8fGEuY2FsbChzLHRoaXMpLCF0aGlzLl9saXN0ZW5lcnMpcmV0dXJuO2lmKHRoaXMuX3NpemU9PT0xKXt0aGlzLl9saXN0ZW5lcnM9dm9pZCAwLChvPShsPXRoaXMuX29wdGlvbnMpPT1udWxsP3ZvaWQgMDpsLm9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyKT09bnVsbHx8by5jYWxsKGwsdGhpcyksdGhpcy5fc2l6ZT0wO3JldHVybn1jb25zdCBuPXRoaXMuX2xpc3RlbmVycyxyPW4uaW5kZXhPZih0KTtpZihyPT09LTEpdGhyb3cgY29uc29sZS5sb2coImRpc3Bvc2VkPyIsdGhpcy5fZGlzcG9zZWQpLGNvbnNvbGUubG9nKCJzaXplPyIsdGhpcy5fc2l6ZSksY29uc29sZS5sb2coImFycj8iLEpTT04uc3RyaW5naWZ5KHRoaXMuX2xpc3RlbmVycykpLG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIGRpc3Bvc2UgdW5rbm93biBsaXN0ZW5lciIpO3RoaXMuX3NpemUtLSxuW3JdPXZvaWQgMDtjb25zdCBpPXRoaXMuX2RlbGl2ZXJ5UXVldWUuY3VycmVudD09PXRoaXM7aWYodGhpcy5fc2l6ZSpubDw9bi5sZW5ndGgpe2xldCB1PTA7Zm9yKGxldCBoPTA7aDxuLmxlbmd0aDtoKyspbltoXT9uW3UrK109bltoXTppJiYodGhpcy5fZGVsaXZlcnlRdWV1ZS5lbmQtLSx1PHRoaXMuX2RlbGl2ZXJ5UXVldWUuaSYmdGhpcy5fZGVsaXZlcnlRdWV1ZS5pLS0pO24ubGVuZ3RoPXV9fV9kZWxpdmVyKHQsbil7dmFyIGk7aWYoIXQpcmV0dXJuO2NvbnN0IHI9KChpPXRoaXMuX29wdGlvbnMpPT1udWxsP3ZvaWQgMDppLm9uTGlzdGVuZXJFcnJvcil8fFRlO2lmKCFyKXt0LnZhbHVlKG4pO3JldHVybn10cnl7dC52YWx1ZShuKX1jYXRjaChzKXtyKHMpfX1fZGVsaXZlclF1ZXVlKHQpe2NvbnN0IG49dC5jdXJyZW50Ll9saXN0ZW5lcnM7Zm9yKDt0Lmk8dC5lbmQ7KXRoaXMuX2RlbGl2ZXIoblt0LmkrK10sdC52YWx1ZSk7dC5yZXNldCgpfWZpcmUodCl7dmFyIG4scixpLHM7aWYoKG49dGhpcy5fZGVsaXZlcnlRdWV1ZSkhPW51bGwmJm4uY3VycmVudCYmKHRoaXMuX2RlbGl2ZXJRdWV1ZSh0aGlzLl9kZWxpdmVyeVF1ZXVlKSwocj10aGlzLl9wZXJmTW9uKT09bnVsbHx8ci5zdG9wKCkpLChpPXRoaXMuX3BlcmZNb24pPT1udWxsfHxpLnN0YXJ0KHRoaXMuX3NpemUpLHRoaXMuX2xpc3RlbmVycylpZih0aGlzLl9saXN0ZW5lcnMgaW5zdGFuY2VvZiBYbil0aGlzLl9kZWxpdmVyKHRoaXMuX2xpc3RlbmVycyx0KTtlbHNle2NvbnN0IGE9dGhpcy5fZGVsaXZlcnlRdWV1ZTthLmVucXVldWUodGhpcyx0LHRoaXMuX2xpc3RlbmVycy5sZW5ndGgpLHRoaXMuX2RlbGl2ZXJRdWV1ZShhKX0ocz10aGlzLl9wZXJmTW9uKT09bnVsbHx8cy5zdG9wKCl9aGFzTGlzdGVuZXJzKCl7cmV0dXJuIHRoaXMuX3NpemU+MH19Y2xhc3Mgcmx7Y29uc3RydWN0b3IoKXt0aGlzLmk9LTEsdGhpcy5lbmQ9MH1lbnF1ZXVlKHQsbixyKXt0aGlzLmk9MCx0aGlzLmVuZD1yLHRoaXMuY3VycmVudD10LHRoaXMudmFsdWU9bn1yZXNldCgpe3RoaXMuaT10aGlzLmVuZCx0aGlzLmN1cnJlbnQ9dm9pZCAwLHRoaXMudmFsdWU9dm9pZCAwfX1mdW5jdGlvbiBpbCgpe3JldHVybiBnbG9iYWxUaGlzLl9WU0NPREVfTkxTX01FU1NBR0VTfWZ1bmN0aW9uIG9pKCl7cmV0dXJuIGdsb2JhbFRoaXMuX1ZTQ09ERV9OTFNfTEFOR1VBR0V9Y29uc3Qgc2w9b2koKT09PSJwc2V1ZG8ifHx0eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5sb2NhdGlvbiYmZG9jdW1lbnQubG9jYXRpb24uaGFzaC5pbmRleE9mKCJwc2V1ZG89dHJ1ZSIpPj0wO2Z1bmN0aW9uIGxpKGUsdCl7bGV0IG47cmV0dXJuIHQubGVuZ3RoPT09MD9uPWU6bj1lLnJlcGxhY2UoL1x7KFxkKylcfS9nLChyLGkpPT57Y29uc3Qgcz1pWzBdLGE9dFtzXTtsZXQgbD1yO3JldHVybiB0eXBlb2YgYT09InN0cmluZyI/bD1hOih0eXBlb2YgYT09Im51bWJlciJ8fHR5cGVvZiBhPT0iYm9vbGVhbiJ8fGE9PT12b2lkIDB8fGE9PT1udWxsKSYmKGw9U3RyaW5nKGEpKSxsfSksc2wmJihuPSLvvLsiK24ucmVwbGFjZSgvW2FvdWVpXS9nLCIkJiQmIikrIu+8vSIpLG59ZnVuY3Rpb24gWChlLHQsLi4ubil7cmV0dXJuIGxpKHR5cGVvZiBlPT0ibnVtYmVyIj9hbChlLHQpOnQsbil9ZnVuY3Rpb24gYWwoZSx0KXt2YXIgcjtjb25zdCBuPShyPWlsKCkpPT1udWxsP3ZvaWQgMDpyW2VdO2lmKHR5cGVvZiBuIT0ic3RyaW5nIil7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0O3Rocm93IG5ldyBFcnJvcihgISEhIE5MUyBNSVNTSU5HOiAke2V9ICEhIWApfXJldHVybiBufWNvbnN0IGd0PSJlbiI7bGV0IFFuPSExLFluPSExLFpuPSExLHVpPSExLEtuPSExLGNuLGVyPWd0LGNpPWd0LG9sLEFlO2NvbnN0IEJlPWdsb2JhbFRoaXM7bGV0IHVlO3R5cGVvZiBCZS52c2NvZGU8InUiJiZ0eXBlb2YgQmUudnNjb2RlLnByb2Nlc3M8InUiP3VlPUJlLnZzY29kZS5wcm9jZXNzOnR5cGVvZiBwcm9jZXNzPCJ1IiYmdHlwZW9mKChxbz1wcm9jZXNzPT1udWxsP3ZvaWQgMDpwcm9jZXNzLnZlcnNpb25zKT09bnVsbD92b2lkIDA6cW8ubm9kZSk9PSJzdHJpbmciJiYodWU9cHJvY2Vzcyk7Y29uc3QgbGw9dHlwZW9mKChqbz11ZT09bnVsbD92b2lkIDA6dWUudmVyc2lvbnMpPT1udWxsP3ZvaWQgMDpqby5lbGVjdHJvbik9PSJzdHJpbmciJiYodWU9PW51bGw/dm9pZCAwOnVlLnR5cGUpPT09InJlbmRlcmVyIjtpZih0eXBlb2YgdWU9PSJvYmplY3QiKXtRbj11ZS5wbGF0Zm9ybT09PSJ3aW4zMiIsWW49dWUucGxhdGZvcm09PT0iZGFyd2luIixabj11ZS5wbGF0Zm9ybT09PSJsaW51eCIsWm4mJnVlLmVudi5TTkFQJiZ1ZS5lbnYuU05BUF9SRVZJU0lPTix1ZS5lbnYuQ0l8fHVlLmVudi5CVUlMRF9BUlRJRkFDVFNUQUdJTkdESVJFQ1RPUlksY249Z3QsZXI9Z3Q7Y29uc3QgZT11ZS5lbnYuVlNDT0RFX05MU19DT05GSUc7aWYoZSl0cnl7Y29uc3QgdD1KU09OLnBhcnNlKGUpO2NuPXQudXNlckxvY2FsZSxjaT10Lm9zTG9jYWxlLGVyPXQucmVzb2x2ZWRMYW5ndWFnZXx8Z3Qsb2w9KFdvPXQubGFuZ3VhZ2VQYWNrKT09bnVsbD92b2lkIDA6V28udHJhbnNsYXRpb25zQ29uZmlnRmlsZX1jYXRjaHt9dWk9ITB9ZWxzZSB0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmIWxsPyhBZT1uYXZpZ2F0b3IudXNlckFnZW50LFFuPUFlLmluZGV4T2YoIldpbmRvd3MiKT49MCxZbj1BZS5pbmRleE9mKCJNYWNpbnRvc2giKT49MCwoQWUuaW5kZXhPZigiTWFjaW50b3NoIik+PTB8fEFlLmluZGV4T2YoImlQYWQiKT49MHx8QWUuaW5kZXhPZigiaVBob25lIik+PTApJiZuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMmJm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cz4wLFpuPUFlLmluZGV4T2YoIkxpbnV4Iik+PTAsKEFlPT1udWxsP3ZvaWQgMDpBZS5pbmRleE9mKCJNb2JpIikpPj0wLEtuPSEwLGVyPW9pKCl8fGd0LGNuPW5hdmlnYXRvci5sYW5ndWFnZS50b0xvd2VyQ2FzZSgpLGNpPWNuKTpjb25zb2xlLmVycm9yKCJVbmFibGUgdG8gcmVzb2x2ZSBwbGF0Zm9ybS4iKTtjb25zdCBVdD1Rbix1bD1ZbixjbD11aSxmbD1LbixobD1LbiYmdHlwZW9mIEJlLmltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiI/QmUub3JpZ2luOnZvaWQgMCxQZT1BZSxkbD10eXBlb2YgQmUucG9zdE1lc3NhZ2U9PSJmdW5jdGlvbiImJiFCZS5pbXBvcnRTY3JpcHRzOygoKT0+e2lmKGRsKXtjb25zdCBlPVtdO0JlLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG49PntpZihuLmRhdGEmJm4uZGF0YS52c2NvZGVTY2hlZHVsZUFzeW5jV29yaylmb3IobGV0IHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspe2NvbnN0IHM9ZVtyXTtpZihzLmlkPT09bi5kYXRhLnZzY29kZVNjaGVkdWxlQXN5bmNXb3JrKXtlLnNwbGljZShyLDEpLHMuY2FsbGJhY2soKTtyZXR1cm59fX0pO2xldCB0PTA7cmV0dXJuIG49Pntjb25zdCByPSsrdDtlLnB1c2goe2lkOnIsY2FsbGJhY2s6bn0pLEJlLnBvc3RNZXNzYWdlKHt2c2NvZGVTY2hlZHVsZUFzeW5jV29yazpyfSwiKiIpfX1yZXR1cm4gZT0+c2V0VGltZW91dChlKX0pKCk7Y29uc3QgbWw9ISEoUGUmJlBlLmluZGV4T2YoIkNocm9tZSIpPj0wKTtQZSYmUGUuaW5kZXhPZigiRmlyZWZveCIpPj0wLCFtbCYmUGUmJlBlLmluZGV4T2YoIlNhZmFyaSIpPj0wLFBlJiZQZS5pbmRleE9mKCJFZGcvIik+PTAsUGUmJlBlLmluZGV4T2YoIkFuZHJvaWQiKT49MDtmdW5jdGlvbiBnbChlKXtyZXR1cm4gZX1jbGFzcyBwbHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMubGFzdENhY2hlPXZvaWQgMCx0aGlzLmxhc3RBcmdLZXk9dm9pZCAwLHR5cGVvZiB0PT0iZnVuY3Rpb24iPyh0aGlzLl9mbj10LHRoaXMuX2NvbXB1dGVLZXk9Z2wpOih0aGlzLl9mbj1uLHRoaXMuX2NvbXB1dGVLZXk9dC5nZXRDYWNoZUtleSl9Z2V0KHQpe2NvbnN0IG49dGhpcy5fY29tcHV0ZUtleSh0KTtyZXR1cm4gdGhpcy5sYXN0QXJnS2V5IT09biYmKHRoaXMubGFzdEFyZ0tleT1uLHRoaXMubGFzdENhY2hlPXRoaXMuX2ZuKHQpKSx0aGlzLmxhc3RDYWNoZX19Y2xhc3MgZml7Y29uc3RydWN0b3IodCl7dGhpcy5leGVjdXRvcj10LHRoaXMuX2RpZFJ1bj0hMX1nZXQgdmFsdWUoKXtpZighdGhpcy5fZGlkUnVuKXRyeXt0aGlzLl92YWx1ZT10aGlzLmV4ZWN1dG9yKCl9Y2F0Y2godCl7dGhpcy5fZXJyb3I9dH1maW5hbGx5e3RoaXMuX2RpZFJ1bj0hMH1pZih0aGlzLl9lcnJvcil0aHJvdyB0aGlzLl9lcnJvcjtyZXR1cm4gdGhpcy5fdmFsdWV9Z2V0IHJhd1ZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfX1mdW5jdGlvbiBibChlKXtyZXR1cm4gZS5yZXBsYWNlKC9bXFxce1x9XCpcK1w/XHxcXlwkXC5cW1xdXChcKV0vZywiXFwkJiIpfWZ1bmN0aW9uIHZsKGUpe3JldHVybiBlLnNwbGl0KC9cclxufFxyfFxuLyl9ZnVuY3Rpb24geGwoZSl7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKXtjb25zdCByPWUuY2hhckNvZGVBdCh0KTtpZihyIT09MzImJnIhPT05KXJldHVybiB0fXJldHVybi0xfWZ1bmN0aW9uIHlsKGUsdD1lLmxlbmd0aC0xKXtmb3IobGV0IG49dDtuPj0wO24tLSl7Y29uc3Qgcj1lLmNoYXJDb2RlQXQobik7aWYociE9PTMyJiZyIT09OSlyZXR1cm4gbn1yZXR1cm4tMX1mdW5jdGlvbiBoaShlKXtyZXR1cm4gZT49NjUmJmU8PTkwfWZ1bmN0aW9uIHRyKGUpe3JldHVybiA1NTI5Njw9ZSYmZTw9NTYzMTl9ZnVuY3Rpb24gd2woZSl7cmV0dXJuIDU2MzIwPD1lJiZlPD01NzM0M31mdW5jdGlvbiBfbChlLHQpe3JldHVybihlLTU1Mjk2PDwxMCkrKHQtNTYzMjApKzY1NTM2fWZ1bmN0aW9uIExsKGUsdCxuKXtjb25zdCByPWUuY2hhckNvZGVBdChuKTtpZih0cihyKSYmbisxPHQpe2NvbnN0IGk9ZS5jaGFyQ29kZUF0KG4rMSk7aWYod2woaSkpcmV0dXJuIF9sKHIsaSl9cmV0dXJuIHJ9Y29uc3QgTmw9L15bXHRcblxyXHgyMC1ceDdFXSokLztmdW5jdGlvbiBTbChlKXtyZXR1cm4gTmwudGVzdChlKX1jb25zdCAkZT1jbGFzcyAkZXtzdGF0aWMgZ2V0SW5zdGFuY2UodCl7cmV0dXJuICRlLmNhY2hlLmdldChBcnJheS5mcm9tKHQpKX1zdGF0aWMgZ2V0TG9jYWxlcygpe3JldHVybiAkZS5fbG9jYWxlcy52YWx1ZX1jb25zdHJ1Y3Rvcih0KXt0aGlzLmNvbmZ1c2FibGVEaWN0aW9uYXJ5PXR9aXNBbWJpZ3VvdXModCl7cmV0dXJuIHRoaXMuY29uZnVzYWJsZURpY3Rpb25hcnkuaGFzKHQpfWdldFByaW1hcnlDb25mdXNhYmxlKHQpe3JldHVybiB0aGlzLmNvbmZ1c2FibGVEaWN0aW9uYXJ5LmdldCh0KX1nZXRDb25mdXNhYmxlQ29kZVBvaW50cygpe3JldHVybiBuZXcgU2V0KHRoaXMuY29uZnVzYWJsZURpY3Rpb25hcnkua2V5cygpKX19OyRlLmFtYmlndW91c0NoYXJhY3RlckRhdGE9bmV3IGZpKCgpPT5KU09OLnBhcnNlKCd7Il9jb21tb24iOls4MjMyLDMyLDgyMzMsMzIsNTc2MCwzMiw4MTkyLDMyLDgxOTMsMzIsODE5NCwzMiw4MTk1LDMyLDgxOTYsMzIsODE5NywzMiw4MTk4LDMyLDgyMDAsMzIsODIwMSwzMiw4MjAyLDMyLDgyODcsMzIsODE5OSwzMiw4MjM5LDMyLDIwNDIsOTUsNjUxMDEsOTUsNjUxMDIsOTUsNjUxMDMsOTUsODIwOCw0NSw4MjA5LDQ1LDgyMTAsNDUsNjUxMTIsNDUsMTc0OCw0NSw4MjU5LDQ1LDcyNyw0NSw4NzIyLDQ1LDEwMTM0LDQ1LDExNDUwLDQ1LDE1NDksNDQsMTY0Myw0NCw4MjE4LDQ0LDE4NCw0NCw0MjIzMyw0NCw4OTQsNTksMjMwNyw1OCwyNjkxLDU4LDE0MTcsNTgsMTc5NSw1OCwxNzk2LDU4LDU4NjgsNTgsNjUwNzIsNTgsNjE0Nyw1OCw2MTUzLDU4LDgyODIsNTgsMTQ3NSw1OCw3NjAsNTgsNDI4ODksNTgsODc1OCw1OCw3MjAsNTgsNDIyMzcsNTgsNDUxLDMzLDExNjAxLDMzLDY2MCw2Myw1NzcsNjMsMjQyOSw2Myw1MDM4LDYzLDQyNzMxLDYzLDExOTE0OSw0Niw4MjI4LDQ2LDE3OTMsNDYsMTc5NCw0Niw0MjUxMCw0Niw2ODE3Niw0NiwxNjMyLDQ2LDE3NzYsNDYsNDIyMzIsNDYsMTM3Myw5Niw2NTI4Nyw5Niw4MjE5LDk2LDgyNDIsOTYsMTM3MCw5NiwxNTIzLDk2LDgxNzUsOTYsNjUzNDQsOTYsOTAwLDk2LDgxODksOTYsODEyNSw5Niw4MTI3LDk2LDgxOTAsOTYsNjk3LDk2LDg4NCw5Niw3MTIsOTYsNzE0LDk2LDcxNSw5Niw3NTYsOTYsNjk5LDk2LDcwMSw5Niw3MDAsOTYsNzAyLDk2LDQyODkyLDk2LDE0OTcsOTYsMjAzNiw5NiwyMDM3LDk2LDUxOTQsOTYsNTgzNiw5Niw5NDAzMyw5Niw5NDAzNCw5Niw2NTMzOSw5MSwxMDA4OCw0MCwxMDA5OCw0MCwxMjMwOCw0MCw2NDgzMCw0MCw2NTM0MSw5MywxMDA4OSw0MSwxMDA5OSw0MSwxMjMwOSw0MSw2NDgzMSw0MSwxMDEwMCwxMjMsMTE5MDYwLDEyMywxMDEwMSwxMjUsNjUzNDIsOTQsODI3MCw0MiwxNjQ1LDQyLDg3MjcsNDIsNjYzMzUsNDIsNTk0MSw0Nyw4MjU3LDQ3LDg3MjUsNDcsODI2MCw0Nyw5NTg1LDQ3LDEwMTg3LDQ3LDEwNzQ0LDQ3LDExOTM1NCw0NywxMjc1NSw0NywxMjMzOSw0NywxMTQ2Miw0NywyMDAzMSw0NywxMjAzNSw0Nyw2NTM0MCw5Miw2NTEyOCw5Miw4NzI2LDkyLDEwMTg5LDkyLDEwNzQxLDkyLDEwNzQ1LDkyLDExOTMxMSw5MiwxMTkzNTUsOTIsMTI3NTYsOTIsMjAwMjIsOTIsMTIwMzQsOTIsNDI4NzIsMzgsNzA4LDk0LDcxMCw5NCw1ODY5LDQzLDEwMTMzLDQzLDY2MjAzLDQzLDgyNDksNjAsMTAwOTQsNjAsNzA2LDYwLDExOTM1MCw2MCw1MTc2LDYwLDU4MTAsNjAsNTEyMCw2MSwxMTg0MCw2MSwxMjQ0OCw2MSw0MjIzOSw2MSw4MjUwLDYyLDEwMDk1LDYyLDcwNyw2MiwxMTkzNTEsNjIsNTE3MSw2Miw5NDAxNSw2Miw4Mjc1LDEyNiw3MzIsMTI2LDgxMjgsMTI2LDg3NjQsMTI2LDY1MzcyLDEyNCw2NTI5Myw0NSwxMjA3ODQsNTAsMTIwNzk0LDUwLDEyMDgwNCw1MCwxMjA4MTQsNTAsMTIwODI0LDUwLDEzMDAzNCw1MCw0Mjg0Miw1MCw0MjMsNTAsMTAwMCw1MCw0MjU2NCw1MCw1MzExLDUwLDQyNzM1LDUwLDExOTMwMiw1MSwxMjA3ODUsNTEsMTIwNzk1LDUxLDEyMDgwNSw1MSwxMjA4MTUsNTEsMTIwODI1LDUxLDEzMDAzNSw1MSw0MjkyMyw1MSw1NDAsNTEsNDM5LDUxLDQyODU4LDUxLDExNDY4LDUxLDEyNDgsNTEsOTQwMTEsNTEsNzE4ODIsNTEsMTIwNzg2LDUyLDEyMDc5Niw1MiwxMjA4MDYsNTIsMTIwODE2LDUyLDEyMDgyNiw1MiwxMzAwMzYsNTIsNTA3MCw1Miw3MTg1NSw1MiwxMjA3ODcsNTMsMTIwNzk3LDUzLDEyMDgwNyw1MywxMjA4MTcsNTMsMTIwODI3LDUzLDEzMDAzNyw1Myw0NDQsNTMsNzE4NjcsNTMsMTIwNzg4LDU0LDEyMDc5OCw1NCwxMjA4MDgsNTQsMTIwODE4LDU0LDEyMDgyOCw1NCwxMzAwMzgsNTQsMTE0NzQsNTQsNTEwMiw1NCw3MTg5Myw1NCwxMTkzMTQsNTUsMTIwNzg5LDU1LDEyMDc5OSw1NSwxMjA4MDksNTUsMTIwODE5LDU1LDEyMDgyOSw1NSwxMzAwMzksNTUsNjY3NzAsNTUsNzE4NzgsNTUsMjgxOSw1NiwyNTM4LDU2LDI2NjYsNTYsMTI1MTMxLDU2LDEyMDc5MCw1NiwxMjA4MDAsNTYsMTIwODEwLDU2LDEyMDgyMCw1NiwxMjA4MzAsNTYsMTMwMDQwLDU2LDU0Nyw1Niw1NDYsNTYsNjYzMzAsNTYsMjY2Myw1NywyOTIwLDU3LDI1NDEsNTcsMzQzNyw1NywxMjA3OTEsNTcsMTIwODAxLDU3LDEyMDgxMSw1NywxMjA4MjEsNTcsMTIwODMxLDU3LDEzMDA0MSw1Nyw0Mjg2Miw1NywxMTQ2Niw1Nyw3MTg4NCw1Nyw3MTg1Miw1Nyw3MTg5NCw1Nyw5MDgyLDk3LDY1MzQ1LDk3LDExOTgzNCw5NywxMTk4ODYsOTcsMTE5OTM4LDk3LDExOTk5MCw5NywxMjAwNDIsOTcsMTIwMDk0LDk3LDEyMDE0Niw5NywxMjAxOTgsOTcsMTIwMjUwLDk3LDEyMDMwMiw5NywxMjAzNTQsOTcsMTIwNDA2LDk3LDEyMDQ1OCw5Nyw1OTMsOTcsOTQ1LDk3LDEyMDUxNCw5NywxMjA1NzIsOTcsMTIwNjMwLDk3LDEyMDY4OCw5NywxMjA3NDYsOTcsNjUzMTMsNjUsMTE5ODA4LDY1LDExOTg2MCw2NSwxMTk5MTIsNjUsMTE5OTY0LDY1LDEyMDAxNiw2NSwxMjAwNjgsNjUsMTIwMTIwLDY1LDEyMDE3Miw2NSwxMjAyMjQsNjUsMTIwMjc2LDY1LDEyMDMyOCw2NSwxMjAzODAsNjUsMTIwNDMyLDY1LDkxMyw2NSwxMjA0ODgsNjUsMTIwNTQ2LDY1LDEyMDYwNCw2NSwxMjA2NjIsNjUsMTIwNzIwLDY1LDUwMzQsNjUsNTU3Myw2NSw0MjIyMiw2NSw5NDAxNiw2NSw2NjIwOCw2NSwxMTk4MzUsOTgsMTE5ODg3LDk4LDExOTkzOSw5OCwxMTk5OTEsOTgsMTIwMDQzLDk4LDEyMDA5NSw5OCwxMjAxNDcsOTgsMTIwMTk5LDk4LDEyMDI1MSw5OCwxMjAzMDMsOTgsMTIwMzU1LDk4LDEyMDQwNyw5OCwxMjA0NTksOTgsMzg4LDk4LDUwNzEsOTgsNTIzNCw5OCw1NTUxLDk4LDY1MzE0LDY2LDg0OTIsNjYsMTE5ODA5LDY2LDExOTg2MSw2NiwxMTk5MTMsNjYsMTIwMDE3LDY2LDEyMDA2OSw2NiwxMjAxMjEsNjYsMTIwMTczLDY2LDEyMDIyNSw2NiwxMjAyNzcsNjYsMTIwMzI5LDY2LDEyMDM4MSw2NiwxMjA0MzMsNjYsNDI5MzIsNjYsOTE0LDY2LDEyMDQ4OSw2NiwxMjA1NDcsNjYsMTIwNjA1LDY2LDEyMDY2Myw2NiwxMjA3MjEsNjYsNTEwOCw2Niw1NjIzLDY2LDQyMTkyLDY2LDY2MTc4LDY2LDY2MjA5LDY2LDY2MzA1LDY2LDY1MzQ3LDk5LDg1NzMsOTksMTE5ODM2LDk5LDExOTg4OCw5OSwxMTk5NDAsOTksMTE5OTkyLDk5LDEyMDA0NCw5OSwxMjAwOTYsOTksMTIwMTQ4LDk5LDEyMDIwMCw5OSwxMjAyNTIsOTksMTIwMzA0LDk5LDEyMDM1Niw5OSwxMjA0MDgsOTksMTIwNDYwLDk5LDc0MjgsOTksMTAxMCw5OSwxMTQyOSw5OSw0Mzk1MSw5OSw2NjYyMSw5OSwxMjg4NDQsNjcsNzE5MjIsNjcsNzE5MTMsNjcsNjUzMTUsNjcsODU1Nyw2Nyw4NDUwLDY3LDg0OTMsNjcsMTE5ODEwLDY3LDExOTg2Miw2NywxMTk5MTQsNjcsMTE5OTY2LDY3LDEyMDAxOCw2NywxMjAxNzQsNjcsMTIwMjI2LDY3LDEyMDI3OCw2NywxMjAzMzAsNjcsMTIwMzgyLDY3LDEyMDQzNCw2NywxMDE3LDY3LDExNDI4LDY3LDUwODcsNjcsNDIyMDIsNjcsNjYyMTAsNjcsNjYzMDYsNjcsNjY1ODEsNjcsNjY4NDQsNjcsODU3NCwxMDAsODUxOCwxMDAsMTE5ODM3LDEwMCwxMTk4ODksMTAwLDExOTk0MSwxMDAsMTE5OTkzLDEwMCwxMjAwNDUsMTAwLDEyMDA5NywxMDAsMTIwMTQ5LDEwMCwxMjAyMDEsMTAwLDEyMDI1MywxMDAsMTIwMzA1LDEwMCwxMjAzNTcsMTAwLDEyMDQwOSwxMDAsMTIwNDYxLDEwMCwxMjgxLDEwMCw1MDk1LDEwMCw1MjMxLDEwMCw0MjE5NCwxMDAsODU1OCw2OCw4NTE3LDY4LDExOTgxMSw2OCwxMTk4NjMsNjgsMTE5OTE1LDY4LDExOTk2Nyw2OCwxMjAwMTksNjgsMTIwMDcxLDY4LDEyMDEyMyw2OCwxMjAxNzUsNjgsMTIwMjI3LDY4LDEyMDI3OSw2OCwxMjAzMzEsNjgsMTIwMzgzLDY4LDEyMDQzNSw2OCw1MDI0LDY4LDU1OTgsNjgsNTYxMCw2OCw0MjE5NSw2OCw4NDk0LDEwMSw2NTM0OSwxMDEsODQ5NSwxMDEsODUxOSwxMDEsMTE5ODM4LDEwMSwxMTk4OTAsMTAxLDExOTk0MiwxMDEsMTIwMDQ2LDEwMSwxMjAwOTgsMTAxLDEyMDE1MCwxMDEsMTIwMjAyLDEwMSwxMjAyNTQsMTAxLDEyMDMwNiwxMDEsMTIwMzU4LDEwMSwxMjA0MTAsMTAxLDEyMDQ2MiwxMDEsNDM4MjYsMTAxLDEyMTMsMTAxLDg5NTksNjksNjUzMTcsNjksODQ5Niw2OSwxMTk4MTIsNjksMTE5ODY0LDY5LDExOTkxNiw2OSwxMjAwMjAsNjksMTIwMDcyLDY5LDEyMDEyNCw2OSwxMjAxNzYsNjksMTIwMjI4LDY5LDEyMDI4MCw2OSwxMjAzMzIsNjksMTIwMzg0LDY5LDEyMDQzNiw2OSw5MTcsNjksMTIwNDkyLDY5LDEyMDU1MCw2OSwxMjA2MDgsNjksMTIwNjY2LDY5LDEyMDcyNCw2OSwxMTU3Nyw2OSw1MDM2LDY5LDQyMjI0LDY5LDcxODQ2LDY5LDcxODU0LDY5LDY2MTgyLDY5LDExOTgzOSwxMDIsMTE5ODkxLDEwMiwxMTk5NDMsMTAyLDExOTk5NSwxMDIsMTIwMDQ3LDEwMiwxMjAwOTksMTAyLDEyMDE1MSwxMDIsMTIwMjAzLDEwMiwxMjAyNTUsMTAyLDEyMDMwNywxMDIsMTIwMzU5LDEwMiwxMjA0MTEsMTAyLDEyMDQ2MywxMDIsNDM4MjksMTAyLDQyOTA1LDEwMiwzODMsMTAyLDc4MzcsMTAyLDE0MTIsMTAyLDExOTMxNSw3MCw4NDk3LDcwLDExOTgxMyw3MCwxMTk4NjUsNzAsMTE5OTE3LDcwLDEyMDAyMSw3MCwxMjAwNzMsNzAsMTIwMTI1LDcwLDEyMDE3Nyw3MCwxMjAyMjksNzAsMTIwMjgxLDcwLDEyMDMzMyw3MCwxMjAzODUsNzAsMTIwNDM3LDcwLDQyOTA0LDcwLDk4OCw3MCwxMjA3NzgsNzAsNTU1Niw3MCw0MjIwNSw3MCw3MTg3NCw3MCw3MTg0Miw3MCw2NjE4Myw3MCw2NjIxMyw3MCw2Njg1Myw3MCw2NTM1MSwxMDMsODQ1OCwxMDMsMTE5ODQwLDEwMywxMTk4OTIsMTAzLDExOTk0NCwxMDMsMTIwMDQ4LDEwMywxMjAxMDAsMTAzLDEyMDE1MiwxMDMsMTIwMjA0LDEwMywxMjAyNTYsMTAzLDEyMDMwOCwxMDMsMTIwMzYwLDEwMywxMjA0MTIsMTAzLDEyMDQ2NCwxMDMsNjA5LDEwMyw3NTU1LDEwMywzOTcsMTAzLDE0MDksMTAzLDExOTgxNCw3MSwxMTk4NjYsNzEsMTE5OTE4LDcxLDExOTk3MCw3MSwxMjAwMjIsNzEsMTIwMDc0LDcxLDEyMDEyNiw3MSwxMjAxNzgsNzEsMTIwMjMwLDcxLDEyMDI4Miw3MSwxMjAzMzQsNzEsMTIwMzg2LDcxLDEyMDQzOCw3MSwxMjkyLDcxLDUwNTYsNzEsNTEwNyw3MSw0MjE5OCw3MSw2NTM1MiwxMDQsODQ2MiwxMDQsMTE5ODQxLDEwNCwxMTk5NDUsMTA0LDExOTk5NywxMDQsMTIwMDQ5LDEwNCwxMjAxMDEsMTA0LDEyMDE1MywxMDQsMTIwMjA1LDEwNCwxMjAyNTcsMTA0LDEyMDMwOSwxMDQsMTIwMzYxLDEwNCwxMjA0MTMsMTA0LDEyMDQ2NSwxMDQsMTIxMSwxMDQsMTM5MiwxMDQsNTA1OCwxMDQsNjUzMjAsNzIsODQ1OSw3Miw4NDYwLDcyLDg0NjEsNzIsMTE5ODE1LDcyLDExOTg2Nyw3MiwxMTk5MTksNzIsMTIwMDIzLDcyLDEyMDE3OSw3MiwxMjAyMzEsNzIsMTIwMjgzLDcyLDEyMDMzNSw3MiwxMjAzODcsNzIsMTIwNDM5LDcyLDkxOSw3MiwxMjA0OTQsNzIsMTIwNTUyLDcyLDEyMDYxMCw3MiwxMjA2NjgsNzIsMTIwNzI2LDcyLDExNDA2LDcyLDUwNTEsNzIsNTUwMCw3Miw0MjIxNSw3Miw2NjI1NSw3Miw3MzEsMTA1LDkwNzUsMTA1LDY1MzUzLDEwNSw4NTYwLDEwNSw4NTA1LDEwNSw4NTIwLDEwNSwxMTk4NDIsMTA1LDExOTg5NCwxMDUsMTE5OTQ2LDEwNSwxMTk5OTgsMTA1LDEyMDA1MCwxMDUsMTIwMTAyLDEwNSwxMjAxNTQsMTA1LDEyMDIwNiwxMDUsMTIwMjU4LDEwNSwxMjAzMTAsMTA1LDEyMDM2MiwxMDUsMTIwNDE0LDEwNSwxMjA0NjYsMTA1LDEyMDQ4NCwxMDUsNjE4LDEwNSw2MTcsMTA1LDk1MywxMDUsODEyNiwxMDUsODkwLDEwNSwxMjA1MjIsMTA1LDEyMDU4MCwxMDUsMTIwNjM4LDEwNSwxMjA2OTYsMTA1LDEyMDc1NCwxMDUsMTExMCwxMDUsNDI1NjcsMTA1LDEyMzEsMTA1LDQzODkzLDEwNSw1MDI5LDEwNSw3MTg3NSwxMDUsNjUzNTQsMTA2LDg1MjEsMTA2LDExOTg0MywxMDYsMTE5ODk1LDEwNiwxMTk5NDcsMTA2LDExOTk5OSwxMDYsMTIwMDUxLDEwNiwxMjAxMDMsMTA2LDEyMDE1NSwxMDYsMTIwMjA3LDEwNiwxMjAyNTksMTA2LDEyMDMxMSwxMDYsMTIwMzYzLDEwNiwxMjA0MTUsMTA2LDEyMDQ2NywxMDYsMTAxMSwxMDYsMTExMiwxMDYsNjUzMjIsNzQsMTE5ODE3LDc0LDExOTg2OSw3NCwxMTk5MjEsNzQsMTE5OTczLDc0LDEyMDAyNSw3NCwxMjAwNzcsNzQsMTIwMTI5LDc0LDEyMDE4MSw3NCwxMjAyMzMsNzQsMTIwMjg1LDc0LDEyMDMzNyw3NCwxMjAzODksNzQsMTIwNDQxLDc0LDQyOTMwLDc0LDg5NSw3NCwxMDMyLDc0LDUwMzUsNzQsNTI2MSw3NCw0MjIwMSw3NCwxMTk4NDQsMTA3LDExOTg5NiwxMDcsMTE5OTQ4LDEwNywxMjAwMDAsMTA3LDEyMDA1MiwxMDcsMTIwMTA0LDEwNywxMjAxNTYsMTA3LDEyMDIwOCwxMDcsMTIwMjYwLDEwNywxMjAzMTIsMTA3LDEyMDM2NCwxMDcsMTIwNDE2LDEwNywxMjA0NjgsMTA3LDg0OTAsNzUsNjUzMjMsNzUsMTE5ODE4LDc1LDExOTg3MCw3NSwxMTk5MjIsNzUsMTE5OTc0LDc1LDEyMDAyNiw3NSwxMjAwNzgsNzUsMTIwMTMwLDc1LDEyMDE4Miw3NSwxMjAyMzQsNzUsMTIwMjg2LDc1LDEyMDMzOCw3NSwxMjAzOTAsNzUsMTIwNDQyLDc1LDkyMiw3NSwxMjA0OTcsNzUsMTIwNTU1LDc1LDEyMDYxMyw3NSwxMjA2NzEsNzUsMTIwNzI5LDc1LDExNDEyLDc1LDUwOTQsNzUsNTg0NSw3NSw0MjE5OSw3NSw2Njg0MCw3NSwxNDcyLDEwOCw4NzM5LDczLDkyMTMsNzMsNjU1MTIsNzMsMTYzMywxMDgsMTc3Nyw3Myw2NjMzNiwxMDgsMTI1MTI3LDEwOCwxMjA3ODMsNzMsMTIwNzkzLDczLDEyMDgwMyw3MywxMjA4MTMsNzMsMTIwODIzLDczLDEzMDAzMyw3Myw2NTMyMSw3Myw4NTQ0LDczLDg0NjQsNzMsODQ2NSw3MywxMTk4MTYsNzMsMTE5ODY4LDczLDExOTkyMCw3MywxMjAwMjQsNzMsMTIwMTI4LDczLDEyMDE4MCw3MywxMjAyMzIsNzMsMTIwMjg0LDczLDEyMDMzNiw3MywxMjAzODgsNzMsMTIwNDQwLDczLDY1MzU2LDEwOCw4NTcyLDczLDg0NjcsMTA4LDExOTg0NSwxMDgsMTE5ODk3LDEwOCwxMTk5NDksMTA4LDEyMDAwMSwxMDgsMTIwMDUzLDEwOCwxMjAxMDUsNzMsMTIwMTU3LDczLDEyMDIwOSw3MywxMjAyNjEsNzMsMTIwMzEzLDczLDEyMDM2NSw3MywxMjA0MTcsNzMsMTIwNDY5LDczLDQ0OCw3MywxMjA0OTYsNzMsMTIwNTU0LDczLDEyMDYxMiw3MywxMjA2NzAsNzMsMTIwNzI4LDczLDExNDEwLDczLDEwMzAsNzMsMTIxNiw3MywxNDkzLDEwOCwxNTAzLDEwOCwxNTc1LDEwOCwxMjY0NjQsMTA4LDEyNjU5MiwxMDgsNjUxNjYsMTA4LDY1MTY1LDEwOCwxOTk0LDEwOCwxMTU5OSw3Myw1ODI1LDczLDQyMjI2LDczLDkzOTkyLDczLDY2MTg2LDEyNCw2NjMxMywxMjQsMTE5MzM4LDc2LDg1NTYsNzYsODQ2Niw3NiwxMTk4MTksNzYsMTE5ODcxLDc2LDExOTkyMyw3NiwxMjAwMjcsNzYsMTIwMDc5LDc2LDEyMDEzMSw3NiwxMjAxODMsNzYsMTIwMjM1LDc2LDEyMDI4Nyw3NiwxMjAzMzksNzYsMTIwMzkxLDc2LDEyMDQ0Myw3NiwxMTQ3Miw3Niw1MDg2LDc2LDUyOTAsNzYsNDIyMDksNzYsOTM5NzQsNzYsNzE4NDMsNzYsNzE4NTgsNzYsNjY1ODcsNzYsNjY4NTQsNzYsNjUzMjUsNzcsODU1OSw3Nyw4NDk5LDc3LDExOTgyMCw3NywxMTk4NzIsNzcsMTE5OTI0LDc3LDEyMDAyOCw3NywxMjAwODAsNzcsMTIwMTMyLDc3LDEyMDE4NCw3NywxMjAyMzYsNzcsMTIwMjg4LDc3LDEyMDM0MCw3NywxMjAzOTIsNzcsMTIwNDQ0LDc3LDkyNCw3NywxMjA0OTksNzcsMTIwNTU3LDc3LDEyMDYxNSw3NywxMjA2NzMsNzcsMTIwNzMxLDc3LDEwMTgsNzcsMTE0MTYsNzcsNTA0Nyw3Nyw1NjE2LDc3LDU4NDYsNzcsNDIyMDcsNzcsNjYyMjQsNzcsNjYzMjEsNzcsMTE5ODQ3LDExMCwxMTk4OTksMTEwLDExOTk1MSwxMTAsMTIwMDAzLDExMCwxMjAwNTUsMTEwLDEyMDEwNywxMTAsMTIwMTU5LDExMCwxMjAyMTEsMTEwLDEyMDI2MywxMTAsMTIwMzE1LDExMCwxMjAzNjcsMTEwLDEyMDQxOSwxMTAsMTIwNDcxLDExMCwxNDAwLDExMCwxNDA0LDExMCw2NTMyNiw3OCw4NDY5LDc4LDExOTgyMSw3OCwxMTk4NzMsNzgsMTE5OTI1LDc4LDExOTk3Nyw3OCwxMjAwMjksNzgsMTIwMDgxLDc4LDEyMDE4NSw3OCwxMjAyMzcsNzgsMTIwMjg5LDc4LDEyMDM0MSw3OCwxMjAzOTMsNzgsMTIwNDQ1LDc4LDkyNSw3OCwxMjA1MDAsNzgsMTIwNTU4LDc4LDEyMDYxNiw3OCwxMjA2NzQsNzgsMTIwNzMyLDc4LDExNDE4LDc4LDQyMjA4LDc4LDY2ODM1LDc4LDMwNzQsMTExLDMyMDIsMTExLDMzMzAsMTExLDM0NTgsMTExLDI0MDYsMTExLDI2NjIsMTExLDI3OTAsMTExLDMwNDYsMTExLDMxNzQsMTExLDMzMDIsMTExLDM0MzAsMTExLDM2NjQsMTExLDM3OTIsMTExLDQxNjAsMTExLDE2MzcsMTExLDE3ODEsMTExLDY1MzU5LDExMSw4NTAwLDExMSwxMTk4NDgsMTExLDExOTkwMCwxMTEsMTE5OTUyLDExMSwxMjAwNTYsMTExLDEyMDEwOCwxMTEsMTIwMTYwLDExMSwxMjAyMTIsMTExLDEyMDI2NCwxMTEsMTIwMzE2LDExMSwxMjAzNjgsMTExLDEyMDQyMCwxMTEsMTIwNDcyLDExMSw3NDM5LDExMSw3NDQxLDExMSw0MzgzNywxMTEsOTU5LDExMSwxMjA1MjgsMTExLDEyMDU4NiwxMTEsMTIwNjQ0LDExMSwxMjA3MDIsMTExLDEyMDc2MCwxMTEsOTYzLDExMSwxMjA1MzIsMTExLDEyMDU5MCwxMTEsMTIwNjQ4LDExMSwxMjA3MDYsMTExLDEyMDc2NCwxMTEsMTE0MjMsMTExLDQzNTEsMTExLDE0MTMsMTExLDE1MDUsMTExLDE2MDcsMTExLDEyNjUwMCwxMTEsMTI2NTY0LDExMSwxMjY1OTYsMTExLDY1MjU5LDExMSw2NTI2MCwxMTEsNjUyNTgsMTExLDY1MjU3LDExMSwxNzI2LDExMSw2NDQyOCwxMTEsNjQ0MjksMTExLDY0NDI3LDExMSw2NDQyNiwxMTEsMTcyOSwxMTEsNjQ0MjQsMTExLDY0NDI1LDExMSw2NDQyMywxMTEsNjQ0MjIsMTExLDE3NDksMTExLDMzNjAsMTExLDQxMjUsMTExLDY2Nzk0LDExMSw3MTg4MCwxMTEsNzE4OTUsMTExLDY2NjA0LDExMSwxOTg0LDc5LDI1MzQsNzksMjkxOCw3OSwxMjI5NSw3OSw3MDg2NCw3OSw3MTkwNCw3OSwxMjA3ODIsNzksMTIwNzkyLDc5LDEyMDgwMiw3OSwxMjA4MTIsNzksMTIwODIyLDc5LDEzMDAzMiw3OSw2NTMyNyw3OSwxMTk4MjIsNzksMTE5ODc0LDc5LDExOTkyNiw3OSwxMTk5NzgsNzksMTIwMDMwLDc5LDEyMDA4Miw3OSwxMjAxMzQsNzksMTIwMTg2LDc5LDEyMDIzOCw3OSwxMjAyOTAsNzksMTIwMzQyLDc5LDEyMDM5NCw3OSwxMjA0NDYsNzksOTI3LDc5LDEyMDUwMiw3OSwxMjA1NjAsNzksMTIwNjE4LDc5LDEyMDY3Niw3OSwxMjA3MzQsNzksMTE0MjIsNzksMTM2NSw3OSwxMTYwNCw3OSw0ODE2LDc5LDI4NDgsNzksNjY3NTQsNzksNDIyMjcsNzksNzE4NjEsNzksNjYxOTQsNzksNjYyMTksNzksNjY1NjQsNzksNjY4MzgsNzksOTA3NiwxMTIsNjUzNjAsMTEyLDExOTg0OSwxMTIsMTE5OTAxLDExMiwxMTk5NTMsMTEyLDEyMDAwNSwxMTIsMTIwMDU3LDExMiwxMjAxMDksMTEyLDEyMDE2MSwxMTIsMTIwMjEzLDExMiwxMjAyNjUsMTEyLDEyMDMxNywxMTIsMTIwMzY5LDExMiwxMjA0MjEsMTEyLDEyMDQ3MywxMTIsOTYxLDExMiwxMjA1MzAsMTEyLDEyMDU0NCwxMTIsMTIwNTg4LDExMiwxMjA2MDIsMTEyLDEyMDY0NiwxMTIsMTIwNjYwLDExMiwxMjA3MDQsMTEyLDEyMDcxOCwxMTIsMTIwNzYyLDExMiwxMjA3NzYsMTEyLDExNDI3LDExMiw2NTMyOCw4MCw4NDczLDgwLDExOTgyMyw4MCwxMTk4NzUsODAsMTE5OTI3LDgwLDExOTk3OSw4MCwxMjAwMzEsODAsMTIwMDgzLDgwLDEyMDE4Nyw4MCwxMjAyMzksODAsMTIwMjkxLDgwLDEyMDM0Myw4MCwxMjAzOTUsODAsMTIwNDQ3LDgwLDkyOSw4MCwxMjA1MDQsODAsMTIwNTYyLDgwLDEyMDYyMCw4MCwxMjA2NzgsODAsMTIwNzM2LDgwLDExNDI2LDgwLDUwOTAsODAsNTIyOSw4MCw0MjE5Myw4MCw2NjE5Nyw4MCwxMTk4NTAsMTEzLDExOTkwMiwxMTMsMTE5OTU0LDExMywxMjAwMDYsMTEzLDEyMDA1OCwxMTMsMTIwMTEwLDExMywxMjAxNjIsMTEzLDEyMDIxNCwxMTMsMTIwMjY2LDExMywxMjAzMTgsMTEzLDEyMDM3MCwxMTMsMTIwNDIyLDExMywxMjA0NzQsMTEzLDEzMDcsMTEzLDEzNzksMTEzLDEzODIsMTEzLDg0NzQsODEsMTE5ODI0LDgxLDExOTg3Niw4MSwxMTk5MjgsODEsMTE5OTgwLDgxLDEyMDAzMiw4MSwxMjAwODQsODEsMTIwMTg4LDgxLDEyMDI0MCw4MSwxMjAyOTIsODEsMTIwMzQ0LDgxLDEyMDM5Niw4MSwxMjA0NDgsODEsMTE2MDUsODEsMTE5ODUxLDExNCwxMTk5MDMsMTE0LDExOTk1NSwxMTQsMTIwMDA3LDExNCwxMjAwNTksMTE0LDEyMDExMSwxMTQsMTIwMTYzLDExNCwxMjAyMTUsMTE0LDEyMDI2NywxMTQsMTIwMzE5LDExNCwxMjAzNzEsMTE0LDEyMDQyMywxMTQsMTIwNDc1LDExNCw0Mzg0NywxMTQsNDM4NDgsMTE0LDc0NjIsMTE0LDExMzk3LDExNCw0MzkwNSwxMTQsMTE5MzE4LDgyLDg0NzUsODIsODQ3Niw4Miw4NDc3LDgyLDExOTgyNSw4MiwxMTk4NzcsODIsMTE5OTI5LDgyLDEyMDAzMyw4MiwxMjAxODksODIsMTIwMjQxLDgyLDEyMDI5Myw4MiwxMjAzNDUsODIsMTIwMzk3LDgyLDEyMDQ0OSw4Miw0MjIsODIsNTAyNSw4Miw1MDc0LDgyLDY2NzQwLDgyLDU1MTEsODIsNDIyMTEsODIsOTQwMDUsODIsNjUzNjMsMTE1LDExOTg1MiwxMTUsMTE5OTA0LDExNSwxMTk5NTYsMTE1LDEyMDAwOCwxMTUsMTIwMDYwLDExNSwxMjAxMTIsMTE1LDEyMDE2NCwxMTUsMTIwMjE2LDExNSwxMjAyNjgsMTE1LDEyMDMyMCwxMTUsMTIwMzcyLDExNSwxMjA0MjQsMTE1LDEyMDQ3NiwxMTUsNDI4MDEsMTE1LDQ0NSwxMTUsMTEwOSwxMTUsNDM5NDYsMTE1LDcxODczLDExNSw2NjYzMiwxMTUsNjUzMzEsODMsMTE5ODI2LDgzLDExOTg3OCw4MywxMTk5MzAsODMsMTE5OTgyLDgzLDEyMDAzNCw4MywxMjAwODYsODMsMTIwMTM4LDgzLDEyMDE5MCw4MywxMjAyNDIsODMsMTIwMjk0LDgzLDEyMDM0Niw4MywxMjAzOTgsODMsMTIwNDUwLDgzLDEwMjksODMsMTM1OSw4Myw1MDc3LDgzLDUwODIsODMsNDIyMTAsODMsOTQwMTAsODMsNjYxOTgsODMsNjY1OTIsODMsMTE5ODUzLDExNiwxMTk5MDUsMTE2LDExOTk1NywxMTYsMTIwMDA5LDExNiwxMjAwNjEsMTE2LDEyMDExMywxMTYsMTIwMTY1LDExNiwxMjAyMTcsMTE2LDEyMDI2OSwxMTYsMTIwMzIxLDExNiwxMjAzNzMsMTE2LDEyMDQyNSwxMTYsMTIwNDc3LDExNiw4ODY4LDg0LDEwMjAxLDg0LDEyODg3Miw4NCw2NTMzMiw4NCwxMTk4MjcsODQsMTE5ODc5LDg0LDExOTkzMSw4NCwxMTk5ODMsODQsMTIwMDM1LDg0LDEyMDA4Nyw4NCwxMjAxMzksODQsMTIwMTkxLDg0LDEyMDI0Myw4NCwxMjAyOTUsODQsMTIwMzQ3LDg0LDEyMDM5OSw4NCwxMjA0NTEsODQsOTMyLDg0LDEyMDUwNyw4NCwxMjA1NjUsODQsMTIwNjIzLDg0LDEyMDY4MSw4NCwxMjA3MzksODQsMTE0MzAsODQsNTAyNiw4NCw0MjE5Niw4NCw5Mzk2Miw4NCw3MTg2OCw4NCw2NjE5OSw4NCw2NjIyNSw4NCw2NjMyNSw4NCwxMTk4NTQsMTE3LDExOTkwNiwxMTcsMTE5OTU4LDExNywxMjAwMTAsMTE3LDEyMDA2MiwxMTcsMTIwMTE0LDExNywxMjAxNjYsMTE3LDEyMDIxOCwxMTcsMTIwMjcwLDExNywxMjAzMjIsMTE3LDEyMDM3NCwxMTcsMTIwNDI2LDExNywxMjA0NzgsMTE3LDQyOTExLDExNyw3NDUyLDExNyw0Mzg1NCwxMTcsNDM4NTgsMTE3LDY1MSwxMTcsOTY1LDExNywxMjA1MzQsMTE3LDEyMDU5MiwxMTcsMTIwNjUwLDExNywxMjA3MDgsMTE3LDEyMDc2NiwxMTcsMTQwNSwxMTcsNjY4MDYsMTE3LDcxODk2LDExNyw4NzQ2LDg1LDg4OTksODUsMTE5ODI4LDg1LDExOTg4MCw4NSwxMTk5MzIsODUsMTE5OTg0LDg1LDEyMDAzNiw4NSwxMjAwODgsODUsMTIwMTQwLDg1LDEyMDE5Miw4NSwxMjAyNDQsODUsMTIwMjk2LDg1LDEyMDM0OCw4NSwxMjA0MDAsODUsMTIwNDUyLDg1LDEzNTcsODUsNDYwOCw4NSw2Njc2Niw4NSw1MTk2LDg1LDQyMjI4LDg1LDk0MDE4LDg1LDcxODY0LDg1LDg3NDQsMTE4LDg4OTcsMTE4LDY1MzY2LDExOCw4NTY0LDExOCwxMTk4NTUsMTE4LDExOTkwNywxMTgsMTE5OTU5LDExOCwxMjAwMTEsMTE4LDEyMDA2MywxMTgsMTIwMTE1LDExOCwxMjAxNjcsMTE4LDEyMDIxOSwxMTgsMTIwMjcxLDExOCwxMjAzMjMsMTE4LDEyMDM3NSwxMTgsMTIwNDI3LDExOCwxMjA0NzksMTE4LDc0NTYsMTE4LDk1NywxMTgsMTIwNTI2LDExOCwxMjA1ODQsMTE4LDEyMDY0MiwxMTgsMTIwNzAwLDExOCwxMjA3NTgsMTE4LDExNDEsMTE4LDE0OTYsMTE4LDcxNDMwLDExOCw0Mzk0NSwxMTgsNzE4NzIsMTE4LDExOTMwOSw4NiwxNjM5LDg2LDE3ODMsODYsODU0OCw4NiwxMTk4MjksODYsMTE5ODgxLDg2LDExOTkzMyw4NiwxMTk5ODUsODYsMTIwMDM3LDg2LDEyMDA4OSw4NiwxMjAxNDEsODYsMTIwMTkzLDg2LDEyMDI0NSw4NiwxMjAyOTcsODYsMTIwMzQ5LDg2LDEyMDQwMSw4NiwxMjA0NTMsODYsMTE0MCw4NiwxMTU3Niw4Niw1MDgxLDg2LDUxNjcsODYsNDI3MTksODYsNDIyMTQsODYsOTM5NjAsODYsNzE4NDAsODYsNjY4NDUsODYsNjIzLDExOSwxMTk4NTYsMTE5LDExOTkwOCwxMTksMTE5OTYwLDExOSwxMjAwMTIsMTE5LDEyMDA2NCwxMTksMTIwMTE2LDExOSwxMjAxNjgsMTE5LDEyMDIyMCwxMTksMTIwMjcyLDExOSwxMjAzMjQsMTE5LDEyMDM3NiwxMTksMTIwNDI4LDExOSwxMjA0ODAsMTE5LDc0NTcsMTE5LDExMjEsMTE5LDEzMDksMTE5LDEzNzcsMTE5LDcxNDM0LDExOSw3MTQzOCwxMTksNzE0MzksMTE5LDQzOTA3LDExOSw3MTkxOSw4Nyw3MTkxMCw4NywxMTk4MzAsODcsMTE5ODgyLDg3LDExOTkzNCw4NywxMTk5ODYsODcsMTIwMDM4LDg3LDEyMDA5MCw4NywxMjAxNDIsODcsMTIwMTk0LDg3LDEyMDI0Niw4NywxMjAyOTgsODcsMTIwMzUwLDg3LDEyMDQwMiw4NywxMjA0NTQsODcsMTMwOCw4Nyw1MDQzLDg3LDUwNzYsODcsNDIyMTgsODcsNTc0MiwxMjAsMTA1MzksMTIwLDEwNTQwLDEyMCwxMDc5OSwxMjAsNjUzNjgsMTIwLDg1NjksMTIwLDExOTg1NywxMjAsMTE5OTA5LDEyMCwxMTk5NjEsMTIwLDEyMDAxMywxMjAsMTIwMDY1LDEyMCwxMjAxMTcsMTIwLDEyMDE2OSwxMjAsMTIwMjIxLDEyMCwxMjAyNzMsMTIwLDEyMDMyNSwxMjAsMTIwMzc3LDEyMCwxMjA0MjksMTIwLDEyMDQ4MSwxMjAsNTQ0MSwxMjAsNTUwMSwxMjAsNTc0MSw4OCw5NTg3LDg4LDY2MzM4LDg4LDcxOTE2LDg4LDY1MzM2LDg4LDg1NTMsODgsMTE5ODMxLDg4LDExOTg4Myw4OCwxMTk5MzUsODgsMTE5OTg3LDg4LDEyMDAzOSw4OCwxMjAwOTEsODgsMTIwMTQzLDg4LDEyMDE5NSw4OCwxMjAyNDcsODgsMTIwMjk5LDg4LDEyMDM1MSw4OCwxMjA0MDMsODgsMTIwNDU1LDg4LDQyOTMxLDg4LDkzNSw4OCwxMjA1MTAsODgsMTIwNTY4LDg4LDEyMDYyNiw4OCwxMjA2ODQsODgsMTIwNzQyLDg4LDExNDM2LDg4LDExNjEzLDg4LDU4MTUsODgsNDIyMTksODgsNjYxOTIsODgsNjYyMjgsODgsNjYzMjcsODgsNjY4NTUsODgsNjExLDEyMSw3NTY0LDEyMSw2NTM2OSwxMjEsMTE5ODU4LDEyMSwxMTk5MTAsMTIxLDExOTk2MiwxMjEsMTIwMDE0LDEyMSwxMjAwNjYsMTIxLDEyMDExOCwxMjEsMTIwMTcwLDEyMSwxMjAyMjIsMTIxLDEyMDI3NCwxMjEsMTIwMzI2LDEyMSwxMjAzNzgsMTIxLDEyMDQzMCwxMjEsMTIwNDgyLDEyMSw2NTUsMTIxLDc5MzUsMTIxLDQzODY2LDEyMSw5NDcsMTIxLDg1MDksMTIxLDEyMDUxNiwxMjEsMTIwNTc0LDEyMSwxMjA2MzIsMTIxLDEyMDY5MCwxMjEsMTIwNzQ4LDEyMSwxMTk5LDEyMSw0MzI3LDEyMSw3MTkwMCwxMjEsNjUzMzcsODksMTE5ODMyLDg5LDExOTg4NCw4OSwxMTk5MzYsODksMTE5OTg4LDg5LDEyMDA0MCw4OSwxMjAwOTIsODksMTIwMTQ0LDg5LDEyMDE5Niw4OSwxMjAyNDgsODksMTIwMzAwLDg5LDEyMDM1Miw4OSwxMjA0MDQsODksMTIwNDU2LDg5LDkzMyw4OSw5NzgsODksMTIwNTA4LDg5LDEyMDU2Niw4OSwxMjA2MjQsODksMTIwNjgyLDg5LDEyMDc0MCw4OSwxMTQzMiw4OSwxMTk4LDg5LDUwMzMsODksNTA1Myw4OSw0MjIyMCw4OSw5NDAxOSw4OSw3MTg0NCw4OSw2NjIyNiw4OSwxMTk4NTksMTIyLDExOTkxMSwxMjIsMTE5OTYzLDEyMiwxMjAwMTUsMTIyLDEyMDA2NywxMjIsMTIwMTE5LDEyMiwxMjAxNzEsMTIyLDEyMDIyMywxMjIsMTIwMjc1LDEyMiwxMjAzMjcsMTIyLDEyMDM3OSwxMjIsMTIwNDMxLDEyMiwxMjA0ODMsMTIyLDc0NTgsMTIyLDQzOTIzLDEyMiw3MTg3NiwxMjIsNjYyOTMsOTAsNzE5MDksOTAsNjUzMzgsOTAsODQ4NCw5MCw4NDg4LDkwLDExOTgzMyw5MCwxMTk4ODUsOTAsMTE5OTM3LDkwLDExOTk4OSw5MCwxMjAwNDEsOTAsMTIwMTk3LDkwLDEyMDI0OSw5MCwxMjAzMDEsOTAsMTIwMzUzLDkwLDEyMDQwNSw5MCwxMjA0NTcsOTAsOTE4LDkwLDEyMDQ5Myw5MCwxMjA1NTEsOTAsMTIwNjA5LDkwLDEyMDY2Nyw5MCwxMjA3MjUsOTAsNTA1OSw5MCw0MjIwNCw5MCw3MTg0OSw5MCw2NTI4MiwzNCw2NTI4NCwzNiw2NTI4NSwzNyw2NTI4NiwzOCw2NTI5MCw0Miw2NTI5MSw0Myw2NTI5NCw0Niw2NTI5NSw0Nyw2NTI5Niw0OCw2NTI5Nyw0OSw2NTI5OCw1MCw2NTI5OSw1MSw2NTMwMCw1Miw2NTMwMSw1Myw2NTMwMiw1NCw2NTMwMyw1NSw2NTMwNCw1Niw2NTMwNSw1Nyw2NTMwOCw2MCw2NTMwOSw2MSw2NTMxMCw2Miw2NTMxMiw2NCw2NTMxNiw2OCw2NTMxOCw3MCw2NTMxOSw3MSw2NTMyNCw3Niw2NTMyOSw4MSw2NTMzMCw4Miw2NTMzMyw4NSw2NTMzNCw4Niw2NTMzNSw4Nyw2NTM0Myw5NSw2NTM0Niw5OCw2NTM0OCwxMDAsNjUzNTAsMTAyLDY1MzU1LDEwNyw2NTM1NywxMDksNjUzNTgsMTEwLDY1MzYxLDExMyw2NTM2MiwxMTQsNjUzNjQsMTE2LDY1MzY1LDExNyw2NTM2NywxMTksNjUzNzAsMTIyLDY1MzcxLDEyMyw2NTM3MywxMjUsMTE5ODQ2LDEwOV0sIl9kZWZhdWx0IjpbMTYwLDMyLDgyMTEsNDUsNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sImNzIjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLCJkZSI6WzY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwiZXMiOls4MjExLDQ1LDY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwiZnIiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjQ1LDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwiaXQiOlsxNjAsMzIsODIxMSw0NSw2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sImphIjpbODIxMSw0NSw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyOTIsNDQsNjUzMDcsNTldLCJrbyI6WzgyMTEsNDUsNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwicGwiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwicHQtQlIiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwicXBzLXBsb2MiOlsxNjAsMzIsODIxMSw0NSw2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwicnUiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDMwNSwxMDUsOTIxLDczLDEwMDksMTEyLDIxNSwxMjAsNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLCJ0ciI6WzE2MCwzMiw4MjExLDQ1LDY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLCJ6aC1oYW5zIjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1Mjg4LDQwLDY1Mjg5LDQxXSwiemgtaGFudCI6WzgyMTEsNDUsNjUzNzQsMTI2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTMwNyw1OV19JykpLCRlLmNhY2hlPW5ldyBwbCh7Z2V0Q2FjaGVLZXk6SlNPTi5zdHJpbmdpZnl9LHQ9PntmdW5jdGlvbiBuKGgpe2NvbnN0IGY9bmV3IE1hcDtmb3IobGV0IGQ9MDtkPGgubGVuZ3RoO2QrPTIpZi5zZXQoaFtkXSxoW2QrMV0pO3JldHVybiBmfWZ1bmN0aW9uIHIoaCxmKXtjb25zdCBkPW5ldyBNYXAoaCk7Zm9yKGNvbnN0W20sZ11vZiBmKWQuc2V0KG0sZyk7cmV0dXJuIGR9ZnVuY3Rpb24gaShoLGYpe2lmKCFoKXJldHVybiBmO2NvbnN0IGQ9bmV3IE1hcDtmb3IoY29uc3RbbSxnXW9mIGgpZi5oYXMobSkmJmQuc2V0KG0sZyk7cmV0dXJuIGR9Y29uc3Qgcz0kZS5hbWJpZ3VvdXNDaGFyYWN0ZXJEYXRhLnZhbHVlO2xldCBhPXQuZmlsdGVyKGg9PiFoLnN0YXJ0c1dpdGgoIl8iKSYmaCBpbiBzKTthLmxlbmd0aD09PTAmJihhPVsiX2RlZmF1bHQiXSk7bGV0IGw7Zm9yKGNvbnN0IGggb2YgYSl7Y29uc3QgZj1uKHNbaF0pO2w9aShsLGYpfWNvbnN0IG89bihzLl9jb21tb24pLHU9cihvLGwpO3JldHVybiBuZXcgJGUodSl9KSwkZS5fbG9jYWxlcz1uZXcgZmkoKCk9Pk9iamVjdC5rZXlzKCRlLmFtYmlndW91c0NoYXJhY3RlckRhdGEudmFsdWUpLmZpbHRlcih0PT4hdC5zdGFydHNXaXRoKCJfIikpKTtsZXQgQnQ9JGU7Y29uc3QgRnQ9Y2xhc3MgRnR7c3RhdGljIGdldFJhd0RhdGEoKXtyZXR1cm4gSlNPTi5wYXJzZSgiWzksMTAsMTEsMTIsMTMsMzIsMTI3LDE2MCwxNzMsODQ3LDE1NjQsNDQ0Nyw0NDQ4LDYwNjgsNjA2OSw2MTU1LDYxNTYsNjE1Nyw2MTU4LDczNTUsNzM1Niw4MTkyLDgxOTMsODE5NCw4MTk1LDgxOTYsODE5Nyw4MTk4LDgxOTksODIwMCw4MjAxLDgyMDIsODIwMyw4MjA0LDgyMDUsODIwNiw4MjA3LDgyMzQsODIzNSw4MjM2LDgyMzcsODIzOCw4MjM5LDgyODcsODI4OCw4Mjg5LDgyOTAsODI5MSw4MjkyLDgyOTMsODI5NCw4Mjk1LDgyOTYsODI5Nyw4Mjk4LDgyOTksODMwMCw4MzAxLDgzMDIsODMwMywxMDI0MCwxMjI4OCwxMjY0NCw2NTAyNCw2NTAyNSw2NTAyNiw2NTAyNyw2NTAyOCw2NTAyOSw2NTAzMCw2NTAzMSw2NTAzMiw2NTAzMyw2NTAzNCw2NTAzNSw2NTAzNiw2NTAzNyw2NTAzOCw2NTAzOSw2NTI3OSw2NTQ0MCw2NTUyMCw2NTUyMSw2NTUyMiw2NTUyMyw2NTUyNCw2NTUyNSw2NTUyNiw2NTUyNyw2NTUyOCw2NTUzMiw3ODg0NCwxMTkxNTUsMTE5MTU2LDExOTE1NywxMTkxNTgsMTE5MTU5LDExOTE2MCwxMTkxNjEsMTE5MTYyLDkxNzUwNCw5MTc1MDUsOTE3NTA2LDkxNzUwNyw5MTc1MDgsOTE3NTA5LDkxNzUxMCw5MTc1MTEsOTE3NTEyLDkxNzUxMyw5MTc1MTQsOTE3NTE1LDkxNzUxNiw5MTc1MTcsOTE3NTE4LDkxNzUxOSw5MTc1MjAsOTE3NTIxLDkxNzUyMiw5MTc1MjMsOTE3NTI0LDkxNzUyNSw5MTc1MjYsOTE3NTI3LDkxNzUyOCw5MTc1MjksOTE3NTMwLDkxNzUzMSw5MTc1MzIsOTE3NTMzLDkxNzUzNCw5MTc1MzUsOTE3NTM2LDkxNzUzNyw5MTc1MzgsOTE3NTM5LDkxNzU0MCw5MTc1NDEsOTE3NTQyLDkxNzU0Myw5MTc1NDQsOTE3NTQ1LDkxNzU0Niw5MTc1NDcsOTE3NTQ4LDkxNzU0OSw5MTc1NTAsOTE3NTUxLDkxNzU1Miw5MTc1NTMsOTE3NTU0LDkxNzU1NSw5MTc1NTYsOTE3NTU3LDkxNzU1OCw5MTc1NTksOTE3NTYwLDkxNzU2MSw5MTc1NjIsOTE3NTYzLDkxNzU2NCw5MTc1NjUsOTE3NTY2LDkxNzU2Nyw5MTc1NjgsOTE3NTY5LDkxNzU3MCw5MTc1NzEsOTE3NTcyLDkxNzU3Myw5MTc1NzQsOTE3NTc1LDkxNzU3Niw5MTc1NzcsOTE3NTc4LDkxNzU3OSw5MTc1ODAsOTE3NTgxLDkxNzU4Miw5MTc1ODMsOTE3NTg0LDkxNzU4NSw5MTc1ODYsOTE3NTg3LDkxNzU4OCw5MTc1ODksOTE3NTkwLDkxNzU5MSw5MTc1OTIsOTE3NTkzLDkxNzU5NCw5MTc1OTUsOTE3NTk2LDkxNzU5Nyw5MTc1OTgsOTE3NTk5LDkxNzYwMCw5MTc2MDEsOTE3NjAyLDkxNzYwMyw5MTc2MDQsOTE3NjA1LDkxNzYwNiw5MTc2MDcsOTE3NjA4LDkxNzYwOSw5MTc2MTAsOTE3NjExLDkxNzYxMiw5MTc2MTMsOTE3NjE0LDkxNzYxNSw5MTc2MTYsOTE3NjE3LDkxNzYxOCw5MTc2MTksOTE3NjIwLDkxNzYyMSw5MTc2MjIsOTE3NjIzLDkxNzYyNCw5MTc2MjUsOTE3NjI2LDkxNzYyNyw5MTc2MjgsOTE3NjI5LDkxNzYzMCw5MTc2MzEsOTE3NzYwLDkxNzc2MSw5MTc3NjIsOTE3NzYzLDkxNzc2NCw5MTc3NjUsOTE3NzY2LDkxNzc2Nyw5MTc3NjgsOTE3NzY5LDkxNzc3MCw5MTc3NzEsOTE3NzcyLDkxNzc3Myw5MTc3NzQsOTE3Nzc1LDkxNzc3Niw5MTc3NzcsOTE3Nzc4LDkxNzc3OSw5MTc3ODAsOTE3NzgxLDkxNzc4Miw5MTc3ODMsOTE3Nzg0LDkxNzc4NSw5MTc3ODYsOTE3Nzg3LDkxNzc4OCw5MTc3ODksOTE3NzkwLDkxNzc5MSw5MTc3OTIsOTE3NzkzLDkxNzc5NCw5MTc3OTUsOTE3Nzk2LDkxNzc5Nyw5MTc3OTgsOTE3Nzk5LDkxNzgwMCw5MTc4MDEsOTE3ODAyLDkxNzgwMyw5MTc4MDQsOTE3ODA1LDkxNzgwNiw5MTc4MDcsOTE3ODA4LDkxNzgwOSw5MTc4MTAsOTE3ODExLDkxNzgxMiw5MTc4MTMsOTE3ODE0LDkxNzgxNSw5MTc4MTYsOTE3ODE3LDkxNzgxOCw5MTc4MTksOTE3ODIwLDkxNzgyMSw5MTc4MjIsOTE3ODIzLDkxNzgyNCw5MTc4MjUsOTE3ODI2LDkxNzgyNyw5MTc4MjgsOTE3ODI5LDkxNzgzMCw5MTc4MzEsOTE3ODMyLDkxNzgzMyw5MTc4MzQsOTE3ODM1LDkxNzgzNiw5MTc4MzcsOTE3ODM4LDkxNzgzOSw5MTc4NDAsOTE3ODQxLDkxNzg0Miw5MTc4NDMsOTE3ODQ0LDkxNzg0NSw5MTc4NDYsOTE3ODQ3LDkxNzg0OCw5MTc4NDksOTE3ODUwLDkxNzg1MSw5MTc4NTIsOTE3ODUzLDkxNzg1NCw5MTc4NTUsOTE3ODU2LDkxNzg1Nyw5MTc4NTgsOTE3ODU5LDkxNzg2MCw5MTc4NjEsOTE3ODYyLDkxNzg2Myw5MTc4NjQsOTE3ODY1LDkxNzg2Niw5MTc4NjcsOTE3ODY4LDkxNzg2OSw5MTc4NzAsOTE3ODcxLDkxNzg3Miw5MTc4NzMsOTE3ODc0LDkxNzg3NSw5MTc4NzYsOTE3ODc3LDkxNzg3OCw5MTc4NzksOTE3ODgwLDkxNzg4MSw5MTc4ODIsOTE3ODgzLDkxNzg4NCw5MTc4ODUsOTE3ODg2LDkxNzg4Nyw5MTc4ODgsOTE3ODg5LDkxNzg5MCw5MTc4OTEsOTE3ODkyLDkxNzg5Myw5MTc4OTQsOTE3ODk1LDkxNzg5Niw5MTc4OTcsOTE3ODk4LDkxNzg5OSw5MTc5MDAsOTE3OTAxLDkxNzkwMiw5MTc5MDMsOTE3OTA0LDkxNzkwNSw5MTc5MDYsOTE3OTA3LDkxNzkwOCw5MTc5MDksOTE3OTEwLDkxNzkxMSw5MTc5MTIsOTE3OTEzLDkxNzkxNCw5MTc5MTUsOTE3OTE2LDkxNzkxNyw5MTc5MTgsOTE3OTE5LDkxNzkyMCw5MTc5MjEsOTE3OTIyLDkxNzkyMyw5MTc5MjQsOTE3OTI1LDkxNzkyNiw5MTc5MjcsOTE3OTI4LDkxNzkyOSw5MTc5MzAsOTE3OTMxLDkxNzkzMiw5MTc5MzMsOTE3OTM0LDkxNzkzNSw5MTc5MzYsOTE3OTM3LDkxNzkzOCw5MTc5MzksOTE3OTQwLDkxNzk0MSw5MTc5NDIsOTE3OTQzLDkxNzk0NCw5MTc5NDUsOTE3OTQ2LDkxNzk0Nyw5MTc5NDgsOTE3OTQ5LDkxNzk1MCw5MTc5NTEsOTE3OTUyLDkxNzk1Myw5MTc5NTQsOTE3OTU1LDkxNzk1Niw5MTc5NTcsOTE3OTU4LDkxNzk1OSw5MTc5NjAsOTE3OTYxLDkxNzk2Miw5MTc5NjMsOTE3OTY0LDkxNzk2NSw5MTc5NjYsOTE3OTY3LDkxNzk2OCw5MTc5NjksOTE3OTcwLDkxNzk3MSw5MTc5NzIsOTE3OTczLDkxNzk3NCw5MTc5NzUsOTE3OTc2LDkxNzk3Nyw5MTc5NzgsOTE3OTc5LDkxNzk4MCw5MTc5ODEsOTE3OTgyLDkxNzk4Myw5MTc5ODQsOTE3OTg1LDkxNzk4Niw5MTc5ODcsOTE3OTg4LDkxNzk4OSw5MTc5OTAsOTE3OTkxLDkxNzk5Miw5MTc5OTMsOTE3OTk0LDkxNzk5NSw5MTc5OTYsOTE3OTk3LDkxNzk5OCw5MTc5OTldIil9c3RhdGljIGdldERhdGEoKXtyZXR1cm4gdGhpcy5fZGF0YXx8KHRoaXMuX2RhdGE9bmV3IFNldChGdC5nZXRSYXdEYXRhKCkpKSx0aGlzLl9kYXRhfXN0YXRpYyBpc0ludmlzaWJsZUNoYXJhY3Rlcih0KXtyZXR1cm4gRnQuZ2V0RGF0YSgpLmhhcyh0KX1zdGF0aWMgZ2V0IGNvZGVQb2ludHMoKXtyZXR1cm4gRnQuZ2V0RGF0YSgpfX07RnQuX2RhdGE9dm9pZCAwO2xldCBxdD1GdCxwdDtjb25zdCBucj1nbG9iYWxUaGlzLnZzY29kZTtpZih0eXBlb2YgbnI8InUiJiZ0eXBlb2YgbnIucHJvY2VzczwidSIpe2NvbnN0IGU9bnIucHJvY2VzcztwdD17Z2V0IHBsYXRmb3JtKCl7cmV0dXJuIGUucGxhdGZvcm19LGdldCBhcmNoKCl7cmV0dXJuIGUuYXJjaH0sZ2V0IGVudigpe3JldHVybiBlLmVudn0sY3dkKCl7cmV0dXJuIGUuY3dkKCl9fX1lbHNlIHR5cGVvZiBwcm9jZXNzPCJ1IiYmdHlwZW9mKChIbz1wcm9jZXNzPT1udWxsP3ZvaWQgMDpwcm9jZXNzLnZlcnNpb25zKT09bnVsbD92b2lkIDA6SG8ubm9kZSk9PSJzdHJpbmciP3B0PXtnZXQgcGxhdGZvcm0oKXtyZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybX0sZ2V0IGFyY2goKXtyZXR1cm4gcHJvY2Vzcy5hcmNofSxnZXQgZW52KCl7cmV0dXJuIHByb2Nlc3MuZW52fSxjd2QoKXtyZXR1cm4gcHJvY2Vzcy5lbnYuVlNDT0RFX0NXRHx8cHJvY2Vzcy5jd2QoKX19OnB0PXtnZXQgcGxhdGZvcm0oKXtyZXR1cm4gVXQ/IndpbjMyIjp1bD8iZGFyd2luIjoibGludXgifSxnZXQgYXJjaCgpe30sZ2V0IGVudigpe3JldHVybnt9fSxjd2QoKXtyZXR1cm4iLyJ9fTtjb25zdCBmbj1wdC5jd2QsQWw9cHQuZW52LGtsPXB0LnBsYXRmb3JtLFJsPTY1LEVsPTk3LE1sPTkwLENsPTEyMixHZT00NixvZT00NyxwZT05MixKZT01OCxUbD02MztjbGFzcyBkaSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsbixyKXtsZXQgaTt0eXBlb2Ygbj09InN0cmluZyImJm4uaW5kZXhPZigibm90ICIpPT09MD8oaT0ibXVzdCBub3QgYmUiLG49bi5yZXBsYWNlKC9ebm90IC8sIiIpKTppPSJtdXN0IGJlIjtjb25zdCBzPXQuaW5kZXhPZigiLiIpIT09LTE/InByb3BlcnR5IjoiYXJndW1lbnQiO2xldCBhPWBUaGUgIiR7dH0iICR7c30gJHtpfSBvZiB0eXBlICR7bn1gO2ErPWAuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2Ygcn1gLHN1cGVyKGEpLHRoaXMuY29kZT0iRVJSX0lOVkFMSURfQVJHX1RZUEUifX1mdW5jdGlvbiBQbChlLHQpe2lmKGU9PT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IGRpKHQsIk9iamVjdCIsZSl9ZnVuY3Rpb24gSyhlLHQpe2lmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBuZXcgZGkodCwic3RyaW5nIixlKX1jb25zdCBxZT1rbD09PSJ3aW4zMiI7ZnVuY3Rpb24gQihlKXtyZXR1cm4gZT09PW9lfHxlPT09cGV9ZnVuY3Rpb24gcnIoZSl7cmV0dXJuIGU9PT1vZX1mdW5jdGlvbiBYZShlKXtyZXR1cm4gZT49UmwmJmU8PU1sfHxlPj1FbCYmZTw9Q2x9ZnVuY3Rpb24gaG4oZSx0LG4scil7bGV0IGk9IiIscz0wLGE9LTEsbD0wLG89MDtmb3IobGV0IHU9MDt1PD1lLmxlbmd0aDsrK3Upe2lmKHU8ZS5sZW5ndGgpbz1lLmNoYXJDb2RlQXQodSk7ZWxzZXtpZihyKG8pKWJyZWFrO289b2V9aWYocihvKSl7aWYoIShhPT09dS0xfHxsPT09MSkpaWYobD09PTIpe2lmKGkubGVuZ3RoPDJ8fHMhPT0yfHxpLmNoYXJDb2RlQXQoaS5sZW5ndGgtMSkhPT1HZXx8aS5jaGFyQ29kZUF0KGkubGVuZ3RoLTIpIT09R2Upe2lmKGkubGVuZ3RoPjIpe2NvbnN0IGg9aS5sYXN0SW5kZXhPZihuKTtoPT09LTE/KGk9IiIscz0wKTooaT1pLnNsaWNlKDAsaCkscz1pLmxlbmd0aC0xLWkubGFzdEluZGV4T2YobikpLGE9dSxsPTA7Y29udGludWV9ZWxzZSBpZihpLmxlbmd0aCE9PTApe2k9IiIscz0wLGE9dSxsPTA7Y29udGludWV9fXQmJihpKz1pLmxlbmd0aD4wP2Ake259Li5gOiIuLiIscz0yKX1lbHNlIGkubGVuZ3RoPjA/aSs9YCR7bn0ke2Uuc2xpY2UoYSsxLHUpfWA6aT1lLnNsaWNlKGErMSx1KSxzPXUtYS0xO2E9dSxsPTB9ZWxzZSBvPT09R2UmJmwhPT0tMT8rK2w6bD0tMX1yZXR1cm4gaX1mdW5jdGlvbiBJbChlKXtyZXR1cm4gZT9gJHtlWzBdPT09Ii4iPyIiOiIuIn0ke2V9YDoiIn1mdW5jdGlvbiBtaShlLHQpe1BsKHQsInBhdGhPYmplY3QiKTtjb25zdCBuPXQuZGlyfHx0LnJvb3Qscj10LmJhc2V8fGAke3QubmFtZXx8IiJ9JHtJbCh0LmV4dCl9YDtyZXR1cm4gbj9uPT09dC5yb290P2Ake259JHtyfWA6YCR7bn0ke2V9JHtyfWA6cn1jb25zdCBjZT17cmVzb2x2ZSguLi5lKXtsZXQgdD0iIixuPSIiLHI9ITE7Zm9yKGxldCBpPWUubGVuZ3RoLTE7aT49LTE7aS0tKXtsZXQgcztpZihpPj0wKXtpZihzPWVbaV0sSyhzLGBwYXRoc1ske2l9XWApLHMubGVuZ3RoPT09MCljb250aW51ZX1lbHNlIHQubGVuZ3RoPT09MD9zPWZuKCk6KHM9QWxbYD0ke3R9YF18fGZuKCksKHM9PT12b2lkIDB8fHMuc2xpY2UoMCwyKS50b0xvd2VyQ2FzZSgpIT09dC50b0xvd2VyQ2FzZSgpJiZzLmNoYXJDb2RlQXQoMik9PT1wZSkmJihzPWAke3R9XFxgKSk7Y29uc3QgYT1zLmxlbmd0aDtsZXQgbD0wLG89IiIsdT0hMTtjb25zdCBoPXMuY2hhckNvZGVBdCgwKTtpZihhPT09MSlCKGgpJiYobD0xLHU9ITApO2Vsc2UgaWYoQihoKSlpZih1PSEwLEIocy5jaGFyQ29kZUF0KDEpKSl7bGV0IGY9MixkPWY7Zm9yKDtmPGEmJiFCKHMuY2hhckNvZGVBdChmKSk7KWYrKztpZihmPGEmJmYhPT1kKXtjb25zdCBtPXMuc2xpY2UoZCxmKTtmb3IoZD1mO2Y8YSYmQihzLmNoYXJDb2RlQXQoZikpOylmKys7aWYoZjxhJiZmIT09ZCl7Zm9yKGQ9ZjtmPGEmJiFCKHMuY2hhckNvZGVBdChmKSk7KWYrKzsoZj09PWF8fGYhPT1kKSYmKG89YFxcXFwke219XFwke3Muc2xpY2UoZCxmKX1gLGw9Zil9fX1lbHNlIGw9MTtlbHNlIFhlKGgpJiZzLmNoYXJDb2RlQXQoMSk9PT1KZSYmKG89cy5zbGljZSgwLDIpLGw9MixhPjImJkIocy5jaGFyQ29kZUF0KDIpKSYmKHU9ITAsbD0zKSk7aWYoby5sZW5ndGg+MClpZih0Lmxlbmd0aD4wKXtpZihvLnRvTG93ZXJDYXNlKCkhPT10LnRvTG93ZXJDYXNlKCkpY29udGludWV9ZWxzZSB0PW87aWYocil7aWYodC5sZW5ndGg+MClicmVha31lbHNlIGlmKG49YCR7cy5zbGljZShsKX1cXCR7bn1gLHI9dSx1JiZ0Lmxlbmd0aD4wKWJyZWFrfXJldHVybiBuPWhuKG4sIXIsIlxcIixCKSxyP2Ake3R9XFwke259YDpgJHt0fSR7bn1gfHwiLiJ9LG5vcm1hbGl6ZShlKXtLKGUsInBhdGgiKTtjb25zdCB0PWUubGVuZ3RoO2lmKHQ9PT0wKXJldHVybiIuIjtsZXQgbj0wLHIsaT0hMTtjb25zdCBzPWUuY2hhckNvZGVBdCgwKTtpZih0PT09MSlyZXR1cm4gcnIocyk/IlxcIjplO2lmKEIocykpaWYoaT0hMCxCKGUuY2hhckNvZGVBdCgxKSkpe2xldCBsPTIsbz1sO2Zvcig7bDx0JiYhQihlLmNoYXJDb2RlQXQobCkpOylsKys7aWYobDx0JiZsIT09byl7Y29uc3QgdT1lLnNsaWNlKG8sbCk7Zm9yKG89bDtsPHQmJkIoZS5jaGFyQ29kZUF0KGwpKTspbCsrO2lmKGw8dCYmbCE9PW8pe2ZvcihvPWw7bDx0JiYhQihlLmNoYXJDb2RlQXQobCkpOylsKys7aWYobD09PXQpcmV0dXJuYFxcXFwke3V9XFwke2Uuc2xpY2Uobyl9XFxgO2whPT1vJiYocj1gXFxcXCR7dX1cXCR7ZS5zbGljZShvLGwpfWAsbj1sKX19fWVsc2Ugbj0xO2Vsc2UgWGUocykmJmUuY2hhckNvZGVBdCgxKT09PUplJiYocj1lLnNsaWNlKDAsMiksbj0yLHQ+MiYmQihlLmNoYXJDb2RlQXQoMikpJiYoaT0hMCxuPTMpKTtsZXQgYT1uPHQ/aG4oZS5zbGljZShuKSwhaSwiXFwiLEIpOiIiO3JldHVybiBhLmxlbmd0aD09PTAmJiFpJiYoYT0iLiIpLGEubGVuZ3RoPjAmJkIoZS5jaGFyQ29kZUF0KHQtMSkpJiYoYSs9IlxcIikscj09PXZvaWQgMD9pP2BcXCR7YX1gOmE6aT9gJHtyfVxcJHthfWA6YCR7cn0ke2F9YH0saXNBYnNvbHV0ZShlKXtLKGUsInBhdGgiKTtjb25zdCB0PWUubGVuZ3RoO2lmKHQ9PT0wKXJldHVybiExO2NvbnN0IG49ZS5jaGFyQ29kZUF0KDApO3JldHVybiBCKG4pfHx0PjImJlhlKG4pJiZlLmNoYXJDb2RlQXQoMSk9PT1KZSYmQihlLmNoYXJDb2RlQXQoMikpfSxqb2luKC4uLmUpe2lmKGUubGVuZ3RoPT09MClyZXR1cm4iLiI7bGV0IHQsbjtmb3IobGV0IHM9MDtzPGUubGVuZ3RoOysrcyl7Y29uc3QgYT1lW3NdO0soYSwicGF0aCIpLGEubGVuZ3RoPjAmJih0PT09dm9pZCAwP3Q9bj1hOnQrPWBcXCR7YX1gKX1pZih0PT09dm9pZCAwKXJldHVybiIuIjtsZXQgcj0hMCxpPTA7aWYodHlwZW9mIG49PSJzdHJpbmciJiZCKG4uY2hhckNvZGVBdCgwKSkpeysraTtjb25zdCBzPW4ubGVuZ3RoO3M+MSYmQihuLmNoYXJDb2RlQXQoMSkpJiYoKytpLHM+MiYmKEIobi5jaGFyQ29kZUF0KDIpKT8rK2k6cj0hMSkpfWlmKHIpe2Zvcig7aTx0Lmxlbmd0aCYmQih0LmNoYXJDb2RlQXQoaSkpOylpKys7aT49MiYmKHQ9YFxcJHt0LnNsaWNlKGkpfWApfXJldHVybiBjZS5ub3JtYWxpemUodCl9LHJlbGF0aXZlKGUsdCl7aWYoSyhlLCJmcm9tIiksSyh0LCJ0byIpLGU9PT10KXJldHVybiIiO2NvbnN0IG49Y2UucmVzb2x2ZShlKSxyPWNlLnJlc29sdmUodCk7aWYobj09PXJ8fChlPW4udG9Mb3dlckNhc2UoKSx0PXIudG9Mb3dlckNhc2UoKSxlPT09dCkpcmV0dXJuIiI7bGV0IGk9MDtmb3IoO2k8ZS5sZW5ndGgmJmUuY2hhckNvZGVBdChpKT09PXBlOylpKys7bGV0IHM9ZS5sZW5ndGg7Zm9yKDtzLTE+aSYmZS5jaGFyQ29kZUF0KHMtMSk9PT1wZTspcy0tO2NvbnN0IGE9cy1pO2xldCBsPTA7Zm9yKDtsPHQubGVuZ3RoJiZ0LmNoYXJDb2RlQXQobCk9PT1wZTspbCsrO2xldCBvPXQubGVuZ3RoO2Zvcig7by0xPmwmJnQuY2hhckNvZGVBdChvLTEpPT09cGU7KW8tLTtjb25zdCB1PW8tbCxoPWE8dT9hOnU7bGV0IGY9LTEsZD0wO2Zvcig7ZDxoO2QrKyl7Y29uc3QgZz1lLmNoYXJDb2RlQXQoaStkKTtpZihnIT09dC5jaGFyQ29kZUF0KGwrZCkpYnJlYWs7Zz09PXBlJiYoZj1kKX1pZihkIT09aCl7aWYoZj09PS0xKXJldHVybiByfWVsc2V7aWYodT5oKXtpZih0LmNoYXJDb2RlQXQobCtkKT09PXBlKXJldHVybiByLnNsaWNlKGwrZCsxKTtpZihkPT09MilyZXR1cm4gci5zbGljZShsK2QpfWE+aCYmKGUuY2hhckNvZGVBdChpK2QpPT09cGU/Zj1kOmQ9PT0yJiYoZj0zKSksZj09PS0xJiYoZj0wKX1sZXQgbT0iIjtmb3IoZD1pK2YrMTtkPD1zOysrZCkoZD09PXN8fGUuY2hhckNvZGVBdChkKT09PXBlKSYmKG0rPW0ubGVuZ3RoPT09MD8iLi4iOiJcXC4uIik7cmV0dXJuIGwrPWYsbS5sZW5ndGg+MD9gJHttfSR7ci5zbGljZShsLG8pfWA6KHIuY2hhckNvZGVBdChsKT09PXBlJiYrK2wsci5zbGljZShsLG8pKX0sdG9OYW1lc3BhY2VkUGF0aChlKXtpZih0eXBlb2YgZSE9InN0cmluZyJ8fGUubGVuZ3RoPT09MClyZXR1cm4gZTtjb25zdCB0PWNlLnJlc29sdmUoZSk7aWYodC5sZW5ndGg8PTIpcmV0dXJuIGU7aWYodC5jaGFyQ29kZUF0KDApPT09cGUpe2lmKHQuY2hhckNvZGVBdCgxKT09PXBlKXtjb25zdCBuPXQuY2hhckNvZGVBdCgyKTtpZihuIT09VGwmJm4hPT1HZSlyZXR1cm5gXFxcXD9cXFVOQ1xcJHt0LnNsaWNlKDIpfWB9fWVsc2UgaWYoWGUodC5jaGFyQ29kZUF0KDApKSYmdC5jaGFyQ29kZUF0KDEpPT09SmUmJnQuY2hhckNvZGVBdCgyKT09PXBlKXJldHVybmBcXFxcP1xcJHt0fWA7cmV0dXJuIGV9LGRpcm5hbWUoZSl7SyhlLCJwYXRoIik7Y29uc3QgdD1lLmxlbmd0aDtpZih0PT09MClyZXR1cm4iLiI7bGV0IG49LTEscj0wO2NvbnN0IGk9ZS5jaGFyQ29kZUF0KDApO2lmKHQ9PT0xKXJldHVybiBCKGkpP2U6Ii4iO2lmKEIoaSkpe2lmKG49cj0xLEIoZS5jaGFyQ29kZUF0KDEpKSl7bGV0IGw9MixvPWw7Zm9yKDtsPHQmJiFCKGUuY2hhckNvZGVBdChsKSk7KWwrKztpZihsPHQmJmwhPT1vKXtmb3Iobz1sO2w8dCYmQihlLmNoYXJDb2RlQXQobCkpOylsKys7aWYobDx0JiZsIT09byl7Zm9yKG89bDtsPHQmJiFCKGUuY2hhckNvZGVBdChsKSk7KWwrKztpZihsPT09dClyZXR1cm4gZTtsIT09byYmKG49cj1sKzEpfX19fWVsc2UgWGUoaSkmJmUuY2hhckNvZGVBdCgxKT09PUplJiYobj10PjImJkIoZS5jaGFyQ29kZUF0KDIpKT8zOjIscj1uKTtsZXQgcz0tMSxhPSEwO2ZvcihsZXQgbD10LTE7bD49cjstLWwpaWYoQihlLmNoYXJDb2RlQXQobCkpKXtpZighYSl7cz1sO2JyZWFrfX1lbHNlIGE9ITE7aWYocz09PS0xKXtpZihuPT09LTEpcmV0dXJuIi4iO3M9bn1yZXR1cm4gZS5zbGljZSgwLHMpfSxiYXNlbmFtZShlLHQpe3QhPT12b2lkIDAmJksodCwic3VmZml4IiksSyhlLCJwYXRoIik7bGV0IG49MCxyPS0xLGk9ITAscztpZihlLmxlbmd0aD49MiYmWGUoZS5jaGFyQ29kZUF0KDApKSYmZS5jaGFyQ29kZUF0KDEpPT09SmUmJihuPTIpLHQhPT12b2lkIDAmJnQubGVuZ3RoPjAmJnQubGVuZ3RoPD1lLmxlbmd0aCl7aWYodD09PWUpcmV0dXJuIiI7bGV0IGE9dC5sZW5ndGgtMSxsPS0xO2ZvcihzPWUubGVuZ3RoLTE7cz49bjstLXMpe2NvbnN0IG89ZS5jaGFyQ29kZUF0KHMpO2lmKEIobykpe2lmKCFpKXtuPXMrMTticmVha319ZWxzZSBsPT09LTEmJihpPSExLGw9cysxKSxhPj0wJiYobz09PXQuY2hhckNvZGVBdChhKT8tLWE9PT0tMSYmKHI9cyk6KGE9LTEscj1sKSl9cmV0dXJuIG49PT1yP3I9bDpyPT09LTEmJihyPWUubGVuZ3RoKSxlLnNsaWNlKG4scil9Zm9yKHM9ZS5sZW5ndGgtMTtzPj1uOy0tcylpZihCKGUuY2hhckNvZGVBdChzKSkpe2lmKCFpKXtuPXMrMTticmVha319ZWxzZSByPT09LTEmJihpPSExLHI9cysxKTtyZXR1cm4gcj09PS0xPyIiOmUuc2xpY2UobixyKX0sZXh0bmFtZShlKXtLKGUsInBhdGgiKTtsZXQgdD0wLG49LTEscj0wLGk9LTEscz0hMCxhPTA7ZS5sZW5ndGg+PTImJmUuY2hhckNvZGVBdCgxKT09PUplJiZYZShlLmNoYXJDb2RlQXQoMCkpJiYodD1yPTIpO2ZvcihsZXQgbD1lLmxlbmd0aC0xO2w+PXQ7LS1sKXtjb25zdCBvPWUuY2hhckNvZGVBdChsKTtpZihCKG8pKXtpZighcyl7cj1sKzE7YnJlYWt9Y29udGludWV9aT09PS0xJiYocz0hMSxpPWwrMSksbz09PUdlP249PT0tMT9uPWw6YSE9PTEmJihhPTEpOm4hPT0tMSYmKGE9LTEpfXJldHVybiBuPT09LTF8fGk9PT0tMXx8YT09PTB8fGE9PT0xJiZuPT09aS0xJiZuPT09cisxPyIiOmUuc2xpY2UobixpKX0sZm9ybWF0Om1pLmJpbmQobnVsbCwiXFwiKSxwYXJzZShlKXtLKGUsInBhdGgiKTtjb25zdCB0PXtyb290OiIiLGRpcjoiIixiYXNlOiIiLGV4dDoiIixuYW1lOiIifTtpZihlLmxlbmd0aD09PTApcmV0dXJuIHQ7Y29uc3Qgbj1lLmxlbmd0aDtsZXQgcj0wLGk9ZS5jaGFyQ29kZUF0KDApO2lmKG49PT0xKXJldHVybiBCKGkpPyh0LnJvb3Q9dC5kaXI9ZSx0KToodC5iYXNlPXQubmFtZT1lLHQpO2lmKEIoaSkpe2lmKHI9MSxCKGUuY2hhckNvZGVBdCgxKSkpe2xldCBmPTIsZD1mO2Zvcig7ZjxuJiYhQihlLmNoYXJDb2RlQXQoZikpOylmKys7aWYoZjxuJiZmIT09ZCl7Zm9yKGQ9ZjtmPG4mJkIoZS5jaGFyQ29kZUF0KGYpKTspZisrO2lmKGY8biYmZiE9PWQpe2ZvcihkPWY7ZjxuJiYhQihlLmNoYXJDb2RlQXQoZikpOylmKys7Zj09PW4/cj1mOmYhPT1kJiYocj1mKzEpfX19fWVsc2UgaWYoWGUoaSkmJmUuY2hhckNvZGVBdCgxKT09PUplKXtpZihuPD0yKXJldHVybiB0LnJvb3Q9dC5kaXI9ZSx0O2lmKHI9MixCKGUuY2hhckNvZGVBdCgyKSkpe2lmKG49PT0zKXJldHVybiB0LnJvb3Q9dC5kaXI9ZSx0O3I9M319cj4wJiYodC5yb290PWUuc2xpY2UoMCxyKSk7bGV0IHM9LTEsYT1yLGw9LTEsbz0hMCx1PWUubGVuZ3RoLTEsaD0wO2Zvcig7dT49cjstLXUpe2lmKGk9ZS5jaGFyQ29kZUF0KHUpLEIoaSkpe2lmKCFvKXthPXUrMTticmVha31jb250aW51ZX1sPT09LTEmJihvPSExLGw9dSsxKSxpPT09R2U/cz09PS0xP3M9dTpoIT09MSYmKGg9MSk6cyE9PS0xJiYoaD0tMSl9cmV0dXJuIGwhPT0tMSYmKHM9PT0tMXx8aD09PTB8fGg9PT0xJiZzPT09bC0xJiZzPT09YSsxP3QuYmFzZT10Lm5hbWU9ZS5zbGljZShhLGwpOih0Lm5hbWU9ZS5zbGljZShhLHMpLHQuYmFzZT1lLnNsaWNlKGEsbCksdC5leHQ9ZS5zbGljZShzLGwpKSksYT4wJiZhIT09cj90LmRpcj1lLnNsaWNlKDAsYS0xKTp0LmRpcj10LnJvb3QsdH0sc2VwOiJcXCIsZGVsaW1pdGVyOiI7Iix3aW4zMjpudWxsLHBvc2l4Om51bGx9LEZsPSgoKT0+e2lmKHFlKXtjb25zdCBlPS9cXC9nO3JldHVybigpPT57Y29uc3QgdD1mbigpLnJlcGxhY2UoZSwiLyIpO3JldHVybiB0LnNsaWNlKHQuaW5kZXhPZigiLyIpKX19cmV0dXJuKCk9PmZuKCl9KSgpLGZlPXtyZXNvbHZlKC4uLmUpe2xldCB0PSIiLG49ITE7Zm9yKGxldCByPWUubGVuZ3RoLTE7cj49LTEmJiFuO3ItLSl7Y29uc3QgaT1yPj0wP2Vbcl06RmwoKTtLKGksYHBhdGhzWyR7cn1dYCksaS5sZW5ndGghPT0wJiYodD1gJHtpfS8ke3R9YCxuPWkuY2hhckNvZGVBdCgwKT09PW9lKX1yZXR1cm4gdD1obih0LCFuLCIvIixyciksbj9gLyR7dH1gOnQubGVuZ3RoPjA/dDoiLiJ9LG5vcm1hbGl6ZShlKXtpZihLKGUsInBhdGgiKSxlLmxlbmd0aD09PTApcmV0dXJuIi4iO2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KDApPT09b2Usbj1lLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSk9PT1vZTtyZXR1cm4gZT1obihlLCF0LCIvIixyciksZS5sZW5ndGg9PT0wP3Q/Ii8iOm4/Ii4vIjoiLiI6KG4mJihlKz0iLyIpLHQ/YC8ke2V9YDplKX0saXNBYnNvbHV0ZShlKXtyZXR1cm4gSyhlLCJwYXRoIiksZS5sZW5ndGg+MCYmZS5jaGFyQ29kZUF0KDApPT09b2V9LGpvaW4oLi4uZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiIuIjtsZXQgdDtmb3IobGV0IG49MDtuPGUubGVuZ3RoOysrbil7Y29uc3Qgcj1lW25dO0sociwicGF0aCIpLHIubGVuZ3RoPjAmJih0PT09dm9pZCAwP3Q9cjp0Kz1gLyR7cn1gKX1yZXR1cm4gdD09PXZvaWQgMD8iLiI6ZmUubm9ybWFsaXplKHQpfSxyZWxhdGl2ZShlLHQpe2lmKEsoZSwiZnJvbSIpLEsodCwidG8iKSxlPT09dHx8KGU9ZmUucmVzb2x2ZShlKSx0PWZlLnJlc29sdmUodCksZT09PXQpKXJldHVybiIiO2NvbnN0IG49MSxyPWUubGVuZ3RoLGk9ci1uLHM9MSxhPXQubGVuZ3RoLXMsbD1pPGE/aTphO2xldCBvPS0xLHU9MDtmb3IoO3U8bDt1Kyspe2NvbnN0IGY9ZS5jaGFyQ29kZUF0KG4rdSk7aWYoZiE9PXQuY2hhckNvZGVBdChzK3UpKWJyZWFrO2Y9PT1vZSYmKG89dSl9aWYodT09PWwpaWYoYT5sKXtpZih0LmNoYXJDb2RlQXQocyt1KT09PW9lKXJldHVybiB0LnNsaWNlKHMrdSsxKTtpZih1PT09MClyZXR1cm4gdC5zbGljZShzK3UpfWVsc2UgaT5sJiYoZS5jaGFyQ29kZUF0KG4rdSk9PT1vZT9vPXU6dT09PTAmJihvPTApKTtsZXQgaD0iIjtmb3IodT1uK28rMTt1PD1yOysrdSkodT09PXJ8fGUuY2hhckNvZGVBdCh1KT09PW9lKSYmKGgrPWgubGVuZ3RoPT09MD8iLi4iOiIvLi4iKTtyZXR1cm5gJHtofSR7dC5zbGljZShzK28pfWB9LHRvTmFtZXNwYWNlZFBhdGgoZSl7cmV0dXJuIGV9LGRpcm5hbWUoZSl7aWYoSyhlLCJwYXRoIiksZS5sZW5ndGg9PT0wKXJldHVybiIuIjtjb25zdCB0PWUuY2hhckNvZGVBdCgwKT09PW9lO2xldCBuPS0xLHI9ITA7Zm9yKGxldCBpPWUubGVuZ3RoLTE7aT49MTstLWkpaWYoZS5jaGFyQ29kZUF0KGkpPT09b2Upe2lmKCFyKXtuPWk7YnJlYWt9fWVsc2Ugcj0hMTtyZXR1cm4gbj09PS0xP3Q/Ii8iOiIuIjp0JiZuPT09MT8iLy8iOmUuc2xpY2UoMCxuKX0sYmFzZW5hbWUoZSx0KXt0IT09dm9pZCAwJiZLKHQsImV4dCIpLEsoZSwicGF0aCIpO2xldCBuPTAscj0tMSxpPSEwLHM7aWYodCE9PXZvaWQgMCYmdC5sZW5ndGg+MCYmdC5sZW5ndGg8PWUubGVuZ3RoKXtpZih0PT09ZSlyZXR1cm4iIjtsZXQgYT10Lmxlbmd0aC0xLGw9LTE7Zm9yKHM9ZS5sZW5ndGgtMTtzPj0wOy0tcyl7Y29uc3Qgbz1lLmNoYXJDb2RlQXQocyk7aWYobz09PW9lKXtpZighaSl7bj1zKzE7YnJlYWt9fWVsc2UgbD09PS0xJiYoaT0hMSxsPXMrMSksYT49MCYmKG89PT10LmNoYXJDb2RlQXQoYSk/LS1hPT09LTEmJihyPXMpOihhPS0xLHI9bCkpfXJldHVybiBuPT09cj9yPWw6cj09PS0xJiYocj1lLmxlbmd0aCksZS5zbGljZShuLHIpfWZvcihzPWUubGVuZ3RoLTE7cz49MDstLXMpaWYoZS5jaGFyQ29kZUF0KHMpPT09b2Upe2lmKCFpKXtuPXMrMTticmVha319ZWxzZSByPT09LTEmJihpPSExLHI9cysxKTtyZXR1cm4gcj09PS0xPyIiOmUuc2xpY2UobixyKX0sZXh0bmFtZShlKXtLKGUsInBhdGgiKTtsZXQgdD0tMSxuPTAscj0tMSxpPSEwLHM9MDtmb3IobGV0IGE9ZS5sZW5ndGgtMTthPj0wOy0tYSl7Y29uc3QgbD1lLmNoYXJDb2RlQXQoYSk7aWYobD09PW9lKXtpZighaSl7bj1hKzE7YnJlYWt9Y29udGludWV9cj09PS0xJiYoaT0hMSxyPWErMSksbD09PUdlP3Q9PT0tMT90PWE6cyE9PTEmJihzPTEpOnQhPT0tMSYmKHM9LTEpfXJldHVybiB0PT09LTF8fHI9PT0tMXx8cz09PTB8fHM9PT0xJiZ0PT09ci0xJiZ0PT09bisxPyIiOmUuc2xpY2UodCxyKX0sZm9ybWF0Om1pLmJpbmQobnVsbCwiLyIpLHBhcnNlKGUpe0soZSwicGF0aCIpO2NvbnN0IHQ9e3Jvb3Q6IiIsZGlyOiIiLGJhc2U6IiIsZXh0OiIiLG5hbWU6IiJ9O2lmKGUubGVuZ3RoPT09MClyZXR1cm4gdDtjb25zdCBuPWUuY2hhckNvZGVBdCgwKT09PW9lO2xldCByO24/KHQucm9vdD0iLyIscj0xKTpyPTA7bGV0IGk9LTEscz0wLGE9LTEsbD0hMCxvPWUubGVuZ3RoLTEsdT0wO2Zvcig7bz49cjstLW8pe2NvbnN0IGg9ZS5jaGFyQ29kZUF0KG8pO2lmKGg9PT1vZSl7aWYoIWwpe3M9bysxO2JyZWFrfWNvbnRpbnVlfWE9PT0tMSYmKGw9ITEsYT1vKzEpLGg9PT1HZT9pPT09LTE/aT1vOnUhPT0xJiYodT0xKTppIT09LTEmJih1PS0xKX1pZihhIT09LTEpe2NvbnN0IGg9cz09PTAmJm4/MTpzO2k9PT0tMXx8dT09PTB8fHU9PT0xJiZpPT09YS0xJiZpPT09cysxP3QuYmFzZT10Lm5hbWU9ZS5zbGljZShoLGEpOih0Lm5hbWU9ZS5zbGljZShoLGkpLHQuYmFzZT1lLnNsaWNlKGgsYSksdC5leHQ9ZS5zbGljZShpLGEpKX1yZXR1cm4gcz4wP3QuZGlyPWUuc2xpY2UoMCxzLTEpOm4mJih0LmRpcj0iLyIpLHR9LHNlcDoiLyIsZGVsaW1pdGVyOiI6Iix3aW4zMjpudWxsLHBvc2l4Om51bGx9O2ZlLndpbjMyPWNlLndpbjMyPWNlLGZlLnBvc2l4PWNlLnBvc2l4PWZlLHFlP2NlLm5vcm1hbGl6ZTpmZS5ub3JtYWxpemU7Y29uc3QgVmw9cWU/Y2Uuam9pbjpmZS5qb2luO3FlP2NlLnJlc29sdmU6ZmUucmVzb2x2ZSxxZT9jZS5yZWxhdGl2ZTpmZS5yZWxhdGl2ZSxxZT9jZS5kaXJuYW1lOmZlLmRpcm5hbWUscWU/Y2UuYmFzZW5hbWU6ZmUuYmFzZW5hbWUscWU/Y2UuZXh0bmFtZTpmZS5leHRuYW1lLHFlP2NlLnNlcDpmZS5zZXA7Y29uc3QgRGw9L15cd1tcd1xkKy4tXSokLyxPbD0vXlwvLywkbD0vXlwvXC8vO2Z1bmN0aW9uIFVsKGUsdCl7aWYoIWUuc2NoZW1lJiZ0KXRocm93IG5ldyBFcnJvcihgW1VyaUVycm9yXTogU2NoZW1lIGlzIG1pc3Npbmc6IHtzY2hlbWU6ICIiLCBhdXRob3JpdHk6ICIke2UuYXV0aG9yaXR5fSIsIHBhdGg6ICIke2UucGF0aH0iLCBxdWVyeTogIiR7ZS5xdWVyeX0iLCBmcmFnbWVudDogIiR7ZS5mcmFnbWVudH0ifWApO2lmKGUuc2NoZW1lJiYhRGwudGVzdChlLnNjaGVtZSkpdGhyb3cgbmV3IEVycm9yKCJbVXJpRXJyb3JdOiBTY2hlbWUgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzLiIpO2lmKGUucGF0aCl7aWYoZS5hdXRob3JpdHkpe2lmKCFPbC50ZXN0KGUucGF0aCkpdGhyb3cgbmV3IEVycm9yKCdbVXJpRXJyb3JdOiBJZiBhIFVSSSBjb250YWlucyBhbiBhdXRob3JpdHkgY29tcG9uZW50LCB0aGVuIHRoZSBwYXRoIGNvbXBvbmVudCBtdXN0IGVpdGhlciBiZSBlbXB0eSBvciBiZWdpbiB3aXRoIGEgc2xhc2ggKCIvIikgY2hhcmFjdGVyJyl9ZWxzZSBpZigkbC50ZXN0KGUucGF0aCkpdGhyb3cgbmV3IEVycm9yKCdbVXJpRXJyb3JdOiBJZiBhIFVSSSBkb2VzIG5vdCBjb250YWluIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY2Fubm90IGJlZ2luIHdpdGggdHdvIHNsYXNoIGNoYXJhY3RlcnMgKCIvLyIpJyl9fWZ1bmN0aW9uIEJsKGUsdCl7cmV0dXJuIWUmJiF0PyJmaWxlIjplfWZ1bmN0aW9uIHFsKGUsdCl7c3dpdGNoKGUpe2Nhc2UiaHR0cHMiOmNhc2UiaHR0cCI6Y2FzZSJmaWxlIjp0P3RbMF0hPT1rZSYmKHQ9a2UrdCk6dD1rZTticmVha31yZXR1cm4gdH1jb25zdCBKPSIiLGtlPSIvIixqbD0vXigoW146Lz8jXSs/KTopPyhcL1wvKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/LztsZXQgSWU9Y2xhc3MgV257c3RhdGljIGlzVXJpKHQpe3JldHVybiB0IGluc3RhbmNlb2YgV24/ITA6dD90eXBlb2YgdC5hdXRob3JpdHk9PSJzdHJpbmciJiZ0eXBlb2YgdC5mcmFnbWVudD09InN0cmluZyImJnR5cGVvZiB0LnBhdGg9PSJzdHJpbmciJiZ0eXBlb2YgdC5xdWVyeT09InN0cmluZyImJnR5cGVvZiB0LnNjaGVtZT09InN0cmluZyImJnR5cGVvZiB0LmZzUGF0aD09InN0cmluZyImJnR5cGVvZiB0LndpdGg9PSJmdW5jdGlvbiImJnR5cGVvZiB0LnRvU3RyaW5nPT0iZnVuY3Rpb24iOiExfWNvbnN0cnVjdG9yKHQsbixyLGkscyxhPSExKXt0eXBlb2YgdD09Im9iamVjdCI/KHRoaXMuc2NoZW1lPXQuc2NoZW1lfHxKLHRoaXMuYXV0aG9yaXR5PXQuYXV0aG9yaXR5fHxKLHRoaXMucGF0aD10LnBhdGh8fEosdGhpcy5xdWVyeT10LnF1ZXJ5fHxKLHRoaXMuZnJhZ21lbnQ9dC5mcmFnbWVudHx8Sik6KHRoaXMuc2NoZW1lPUJsKHQsYSksdGhpcy5hdXRob3JpdHk9bnx8Six0aGlzLnBhdGg9cWwodGhpcy5zY2hlbWUscnx8SiksdGhpcy5xdWVyeT1pfHxKLHRoaXMuZnJhZ21lbnQ9c3x8SixVbCh0aGlzLGEpKX1nZXQgZnNQYXRoKCl7cmV0dXJuIGlyKHRoaXMsITEpfXdpdGgodCl7aWYoIXQpcmV0dXJuIHRoaXM7bGV0e3NjaGVtZTpuLGF1dGhvcml0eTpyLHBhdGg6aSxxdWVyeTpzLGZyYWdtZW50OmF9PXQ7cmV0dXJuIG49PT12b2lkIDA/bj10aGlzLnNjaGVtZTpuPT09bnVsbCYmKG49Sikscj09PXZvaWQgMD9yPXRoaXMuYXV0aG9yaXR5OnI9PT1udWxsJiYocj1KKSxpPT09dm9pZCAwP2k9dGhpcy5wYXRoOmk9PT1udWxsJiYoaT1KKSxzPT09dm9pZCAwP3M9dGhpcy5xdWVyeTpzPT09bnVsbCYmKHM9SiksYT09PXZvaWQgMD9hPXRoaXMuZnJhZ21lbnQ6YT09PW51bGwmJihhPUopLG49PT10aGlzLnNjaGVtZSYmcj09PXRoaXMuYXV0aG9yaXR5JiZpPT09dGhpcy5wYXRoJiZzPT09dGhpcy5xdWVyeSYmYT09PXRoaXMuZnJhZ21lbnQ/dGhpczpuZXcgYnQobixyLGkscyxhKX1zdGF0aWMgcGFyc2UodCxuPSExKXtjb25zdCByPWpsLmV4ZWModCk7cmV0dXJuIHI/bmV3IGJ0KHJbMl18fEosZG4ocls0XXx8SiksZG4ocls1XXx8SiksZG4ocls3XXx8SiksZG4ocls5XXx8Siksbik6bmV3IGJ0KEosSixKLEosSil9c3RhdGljIGZpbGUodCl7bGV0IG49SjtpZihVdCYmKHQ9dC5yZXBsYWNlKC9cXC9nLGtlKSksdFswXT09PWtlJiZ0WzFdPT09a2Upe2NvbnN0IHI9dC5pbmRleE9mKGtlLDIpO3I9PT0tMT8obj10LnN1YnN0cmluZygyKSx0PWtlKToobj10LnN1YnN0cmluZygyLHIpLHQ9dC5zdWJzdHJpbmcocil8fGtlKX1yZXR1cm4gbmV3IGJ0KCJmaWxlIixuLHQsSixKKX1zdGF0aWMgZnJvbSh0LG4pe3JldHVybiBuZXcgYnQodC5zY2hlbWUsdC5hdXRob3JpdHksdC5wYXRoLHQucXVlcnksdC5mcmFnbWVudCxuKX1zdGF0aWMgam9pblBhdGgodCwuLi5uKXtpZighdC5wYXRoKXRocm93IG5ldyBFcnJvcigiW1VyaUVycm9yXTogY2Fubm90IGNhbGwgam9pblBhdGggb24gVVJJIHdpdGhvdXQgcGF0aCIpO2xldCByO3JldHVybiBVdCYmdC5zY2hlbWU9PT0iZmlsZSI/cj1Xbi5maWxlKGNlLmpvaW4oaXIodCwhMCksLi4ubikpLnBhdGg6cj1mZS5qb2luKHQucGF0aCwuLi5uKSx0LndpdGgoe3BhdGg6cn0pfXRvU3RyaW5nKHQ9ITEpe3JldHVybiBzcih0aGlzLHQpfXRvSlNPTigpe3JldHVybiB0aGlzfXN0YXRpYyByZXZpdmUodCl7aWYodCl7aWYodCBpbnN0YW5jZW9mIFduKXJldHVybiB0O3tjb25zdCBuPW5ldyBidCh0KTtyZXR1cm4gbi5fZm9ybWF0dGVkPXQuZXh0ZXJuYWw/P251bGwsbi5fZnNQYXRoPXQuX3NlcD09PWdpP3QuZnNQYXRoPz9udWxsOm51bGwsbn19ZWxzZSByZXR1cm4gdH19O2NvbnN0IGdpPVV0PzE6dm9pZCAwO2NsYXNzIGJ0IGV4dGVuZHMgSWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2Zvcm1hdHRlZD1udWxsLHRoaXMuX2ZzUGF0aD1udWxsfWdldCBmc1BhdGgoKXtyZXR1cm4gdGhpcy5fZnNQYXRofHwodGhpcy5fZnNQYXRoPWlyKHRoaXMsITEpKSx0aGlzLl9mc1BhdGh9dG9TdHJpbmcodD0hMSl7cmV0dXJuIHQ/c3IodGhpcywhMCk6KHRoaXMuX2Zvcm1hdHRlZHx8KHRoaXMuX2Zvcm1hdHRlZD1zcih0aGlzLCExKSksdGhpcy5fZm9ybWF0dGVkKX10b0pTT04oKXtjb25zdCB0PXskbWlkOjF9O3JldHVybiB0aGlzLl9mc1BhdGgmJih0LmZzUGF0aD10aGlzLl9mc1BhdGgsdC5fc2VwPWdpKSx0aGlzLl9mb3JtYXR0ZWQmJih0LmV4dGVybmFsPXRoaXMuX2Zvcm1hdHRlZCksdGhpcy5wYXRoJiYodC5wYXRoPXRoaXMucGF0aCksdGhpcy5zY2hlbWUmJih0LnNjaGVtZT10aGlzLnNjaGVtZSksdGhpcy5hdXRob3JpdHkmJih0LmF1dGhvcml0eT10aGlzLmF1dGhvcml0eSksdGhpcy5xdWVyeSYmKHQucXVlcnk9dGhpcy5xdWVyeSksdGhpcy5mcmFnbWVudCYmKHQuZnJhZ21lbnQ9dGhpcy5mcmFnbWVudCksdH19Y29uc3QgcGk9ezU4OiIlM0EiLDQ3OiIlMkYiLDYzOiIlM0YiLDM1OiIlMjMiLDkxOiIlNUIiLDkzOiIlNUQiLDY0OiIlNDAiLDMzOiIlMjEiLDM2OiIlMjQiLDM4OiIlMjYiLDM5OiIlMjciLDQwOiIlMjgiLDQxOiIlMjkiLDQyOiIlMkEiLDQzOiIlMkIiLDQ0OiIlMkMiLDU5OiIlM0IiLDYxOiIlM0QiLDMyOiIlMjAifTtmdW5jdGlvbiBiaShlLHQsbil7bGV0IHIsaT0tMTtmb3IobGV0IHM9MDtzPGUubGVuZ3RoO3MrKyl7Y29uc3QgYT1lLmNoYXJDb2RlQXQocyk7aWYoYT49OTcmJmE8PTEyMnx8YT49NjUmJmE8PTkwfHxhPj00OCYmYTw9NTd8fGE9PT00NXx8YT09PTQ2fHxhPT09OTV8fGE9PT0xMjZ8fHQmJmE9PT00N3x8biYmYT09PTkxfHxuJiZhPT09OTN8fG4mJmE9PT01OClpIT09LTEmJihyKz1lbmNvZGVVUklDb21wb25lbnQoZS5zdWJzdHJpbmcoaSxzKSksaT0tMSksciE9PXZvaWQgMCYmKHIrPWUuY2hhckF0KHMpKTtlbHNle3I9PT12b2lkIDAmJihyPWUuc3Vic3RyKDAscykpO2NvbnN0IGw9cGlbYV07bCE9PXZvaWQgMD8oaSE9PS0xJiYocis9ZW5jb2RlVVJJQ29tcG9uZW50KGUuc3Vic3RyaW5nKGkscykpLGk9LTEpLHIrPWwpOmk9PT0tMSYmKGk9cyl9fXJldHVybiBpIT09LTEmJihyKz1lbmNvZGVVUklDb21wb25lbnQoZS5zdWJzdHJpbmcoaSkpKSxyIT09dm9pZCAwP3I6ZX1mdW5jdGlvbiBXbChlKXtsZXQgdDtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7Y29uc3Qgcj1lLmNoYXJDb2RlQXQobik7cj09PTM1fHxyPT09NjM/KHQ9PT12b2lkIDAmJih0PWUuc3Vic3RyKDAsbikpLHQrPXBpW3JdKTp0IT09dm9pZCAwJiYodCs9ZVtuXSl9cmV0dXJuIHQhPT12b2lkIDA/dDplfWZ1bmN0aW9uIGlyKGUsdCl7bGV0IG47cmV0dXJuIGUuYXV0aG9yaXR5JiZlLnBhdGgubGVuZ3RoPjEmJmUuc2NoZW1lPT09ImZpbGUiP249YC8vJHtlLmF1dGhvcml0eX0ke2UucGF0aH1gOmUucGF0aC5jaGFyQ29kZUF0KDApPT09NDcmJihlLnBhdGguY2hhckNvZGVBdCgxKT49NjUmJmUucGF0aC5jaGFyQ29kZUF0KDEpPD05MHx8ZS5wYXRoLmNoYXJDb2RlQXQoMSk+PTk3JiZlLnBhdGguY2hhckNvZGVBdCgxKTw9MTIyKSYmZS5wYXRoLmNoYXJDb2RlQXQoMik9PT01OD90P249ZS5wYXRoLnN1YnN0cigxKTpuPWUucGF0aFsxXS50b0xvd2VyQ2FzZSgpK2UucGF0aC5zdWJzdHIoMik6bj1lLnBhdGgsVXQmJihuPW4ucmVwbGFjZSgvXC8vZywiXFwiKSksbn1mdW5jdGlvbiBzcihlLHQpe2NvbnN0IG49dD9XbDpiaTtsZXQgcj0iIix7c2NoZW1lOmksYXV0aG9yaXR5OnMscGF0aDphLHF1ZXJ5OmwsZnJhZ21lbnQ6b309ZTtpZihpJiYocis9aSxyKz0iOiIpLChzfHxpPT09ImZpbGUiKSYmKHIrPWtlLHIrPWtlKSxzKXtsZXQgdT1zLmluZGV4T2YoIkAiKTtpZih1IT09LTEpe2NvbnN0IGg9cy5zdWJzdHIoMCx1KTtzPXMuc3Vic3RyKHUrMSksdT1oLmxhc3RJbmRleE9mKCI6IiksdT09PS0xP3IrPW4oaCwhMSwhMSk6KHIrPW4oaC5zdWJzdHIoMCx1KSwhMSwhMSkscis9IjoiLHIrPW4oaC5zdWJzdHIodSsxKSwhMSwhMCkpLHIrPSJAIn1zPXMudG9Mb3dlckNhc2UoKSx1PXMubGFzdEluZGV4T2YoIjoiKSx1PT09LTE/cis9bihzLCExLCEwKToocis9bihzLnN1YnN0cigwLHUpLCExLCEwKSxyKz1zLnN1YnN0cih1KSl9aWYoYSl7aWYoYS5sZW5ndGg+PTMmJmEuY2hhckNvZGVBdCgwKT09PTQ3JiZhLmNoYXJDb2RlQXQoMik9PT01OCl7Y29uc3QgdT1hLmNoYXJDb2RlQXQoMSk7dT49NjUmJnU8PTkwJiYoYT1gLyR7U3RyaW5nLmZyb21DaGFyQ29kZSh1KzMyKX06JHthLnN1YnN0cigzKX1gKX1lbHNlIGlmKGEubGVuZ3RoPj0yJiZhLmNoYXJDb2RlQXQoMSk9PT01OCl7Y29uc3QgdT1hLmNoYXJDb2RlQXQoMCk7dT49NjUmJnU8PTkwJiYoYT1gJHtTdHJpbmcuZnJvbUNoYXJDb2RlKHUrMzIpfToke2Euc3Vic3RyKDIpfWApfXIrPW4oYSwhMCwhMSl9cmV0dXJuIGwmJihyKz0iPyIscis9bihsLCExLCExKSksbyYmKHIrPSIjIixyKz10P286YmkobywhMSwhMSkpLHJ9ZnVuY3Rpb24gdmkoZSl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2h7cmV0dXJuIGUubGVuZ3RoPjM/ZS5zdWJzdHIoMCwzKSt2aShlLnN1YnN0cigzKSk6ZX19Y29uc3QgeGk9LyglWzAtOUEtWmEtel1bMC05QS1aYS16XSkrL2c7ZnVuY3Rpb24gZG4oZSl7cmV0dXJuIGUubWF0Y2goeGkpP2UucmVwbGFjZSh4aSx0PT52aSh0KSk6ZX12YXIgUWU7KGZ1bmN0aW9uKGUpe2UuaW5NZW1vcnk9ImlubWVtb3J5IixlLnZzY29kZT0idnNjb2RlIixlLmludGVybmFsPSJwcml2YXRlIixlLndhbGtUaHJvdWdoPSJ3YWxrVGhyb3VnaCIsZS53YWxrVGhyb3VnaFNuaXBwZXQ9IndhbGtUaHJvdWdoU25pcHBldCIsZS5odHRwPSJodHRwIixlLmh0dHBzPSJodHRwcyIsZS5maWxlPSJmaWxlIixlLm1haWx0bz0ibWFpbHRvIixlLnVudGl0bGVkPSJ1bnRpdGxlZCIsZS5kYXRhPSJkYXRhIixlLmNvbW1hbmQ9ImNvbW1hbmQiLGUudnNjb2RlUmVtb3RlPSJ2c2NvZGUtcmVtb3RlIixlLnZzY29kZVJlbW90ZVJlc291cmNlPSJ2c2NvZGUtcmVtb3RlLXJlc291cmNlIixlLnZzY29kZU1hbmFnZWRSZW1vdGVSZXNvdXJjZT0idnNjb2RlLW1hbmFnZWQtcmVtb3RlLXJlc291cmNlIixlLnZzY29kZVVzZXJEYXRhPSJ2c2NvZGUtdXNlcmRhdGEiLGUudnNjb2RlQ3VzdG9tRWRpdG9yPSJ2c2NvZGUtY3VzdG9tLWVkaXRvciIsZS52c2NvZGVOb3RlYm9va0NlbGw9InZzY29kZS1ub3RlYm9vay1jZWxsIixlLnZzY29kZU5vdGVib29rQ2VsbE1ldGFkYXRhPSJ2c2NvZGUtbm90ZWJvb2stY2VsbC1tZXRhZGF0YSIsZS52c2NvZGVOb3RlYm9va0NlbGxNZXRhZGF0YURpZmY9InZzY29kZS1ub3RlYm9vay1jZWxsLW1ldGFkYXRhLWRpZmYiLGUudnNjb2RlTm90ZWJvb2tDZWxsT3V0cHV0PSJ2c2NvZGUtbm90ZWJvb2stY2VsbC1vdXRwdXQiLGUudnNjb2RlTm90ZWJvb2tDZWxsT3V0cHV0RGlmZj0idnNjb2RlLW5vdGVib29rLWNlbGwtb3V0cHV0LWRpZmYiLGUudnNjb2RlTm90ZWJvb2tNZXRhZGF0YT0idnNjb2RlLW5vdGVib29rLW1ldGFkYXRhIixlLnZzY29kZUludGVyYWN0aXZlSW5wdXQ9InZzY29kZS1pbnRlcmFjdGl2ZS1pbnB1dCIsZS52c2NvZGVTZXR0aW5ncz0idnNjb2RlLXNldHRpbmdzIixlLnZzY29kZVdvcmtzcGFjZVRydXN0PSJ2c2NvZGUtd29ya3NwYWNlLXRydXN0IixlLnZzY29kZVRlcm1pbmFsPSJ2c2NvZGUtdGVybWluYWwiLGUudnNjb2RlQ2hhdENvZGVCbG9jaz0idnNjb2RlLWNoYXQtY29kZS1ibG9jayIsZS52c2NvZGVDaGF0Q29kZUNvbXBhcmVCbG9jaz0idnNjb2RlLWNoYXQtY29kZS1jb21wYXJlLWJsb2NrIixlLnZzY29kZUNoYXRTZXNzc2lvbj0idnNjb2RlLWNoYXQtZWRpdG9yIixlLndlYnZpZXdQYW5lbD0id2Vidmlldy1wYW5lbCIsZS52c2NvZGVXZWJ2aWV3PSJ2c2NvZGUtd2VidmlldyIsZS5leHRlbnNpb249ImV4dGVuc2lvbiIsZS52c2NvZGVGaWxlUmVzb3VyY2U9InZzY29kZS1maWxlIixlLnRtcD0idG1wIixlLnZzbHM9InZzbHMiLGUudnNjb2RlU291cmNlQ29udHJvbD0idnNjb2RlLXNjbSIsZS5jb21tZW50c0lucHV0PSJjb21tZW50IixlLmNvZGVTZXR0aW5nPSJjb2RlLXNldHRpbmciLGUub3V0cHV0Q2hhbm5lbD0ib3V0cHV0In0pKFFlfHwoUWU9e30pKTtjb25zdCBIbD0idGtuIjtjbGFzcyB6bHtjb25zdHJ1Y3Rvcigpe3RoaXMuX2hvc3RzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fcG9ydHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9jb25uZWN0aW9uVG9rZW5zPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fcHJlZmVycmVkV2ViU2NoZW1hPSJodHRwIix0aGlzLl9kZWxlZ2F0ZT1udWxsLHRoaXMuX3NlcnZlclJvb3RQYXRoPSIvIn1zZXRQcmVmZXJyZWRXZWJTY2hlbWEodCl7dGhpcy5fcHJlZmVycmVkV2ViU2NoZW1hPXR9Z2V0IF9yZW1vdGVSZXNvdXJjZXNQYXRoKCl7cmV0dXJuIGZlLmpvaW4odGhpcy5fc2VydmVyUm9vdFBhdGgsUWUudnNjb2RlUmVtb3RlUmVzb3VyY2UpfXJld3JpdGUodCl7aWYodGhpcy5fZGVsZWdhdGUpdHJ5e3JldHVybiB0aGlzLl9kZWxlZ2F0ZSh0KX1jYXRjaChsKXtyZXR1cm4gVGUobCksdH1jb25zdCBuPXQuYXV0aG9yaXR5O2xldCByPXRoaXMuX2hvc3RzW25dO3ImJnIuaW5kZXhPZigiOiIpIT09LTEmJnIuaW5kZXhPZigiWyIpPT09LTEmJihyPWBbJHtyfV1gKTtjb25zdCBpPXRoaXMuX3BvcnRzW25dLHM9dGhpcy5fY29ubmVjdGlvblRva2Vuc1tuXTtsZXQgYT1gcGF0aD0ke2VuY29kZVVSSUNvbXBvbmVudCh0LnBhdGgpfWA7cmV0dXJuIHR5cGVvZiBzPT0ic3RyaW5nIiYmKGErPWAmJHtIbH09JHtlbmNvZGVVUklDb21wb25lbnQocyl9YCksSWUuZnJvbSh7c2NoZW1lOmZsP3RoaXMuX3ByZWZlcnJlZFdlYlNjaGVtYTpRZS52c2NvZGVSZW1vdGVSZXNvdXJjZSxhdXRob3JpdHk6YCR7cn06JHtpfWAscGF0aDp0aGlzLl9yZW1vdGVSZXNvdXJjZXNQYXRoLHF1ZXJ5OmF9KX19Y29uc3QgR2w9bmV3IHpsLEpsPSJ2c2NvZGUtYXBwIixubj1jbGFzcyBubnthc0Jyb3dzZXJVcmkodCl7Y29uc3Qgbj10aGlzLnRvVXJpKHQpO3JldHVybiB0aGlzLnVyaVRvQnJvd3NlclVyaShuKX11cmlUb0Jyb3dzZXJVcmkodCl7cmV0dXJuIHQuc2NoZW1lPT09UWUudnNjb2RlUmVtb3RlP0dsLnJld3JpdGUodCk6dC5zY2hlbWU9PT1RZS5maWxlJiYoY2x8fGhsPT09YCR7UWUudnNjb2RlRmlsZVJlc291cmNlfTovLyR7bm4uRkFMTEJBQ0tfQVVUSE9SSVRZfWApP3Qud2l0aCh7c2NoZW1lOlFlLnZzY29kZUZpbGVSZXNvdXJjZSxhdXRob3JpdHk6dC5hdXRob3JpdHl8fG5uLkZBTExCQUNLX0FVVEhPUklUWSxxdWVyeTpudWxsLGZyYWdtZW50Om51bGx9KTp0fXRvVXJpKHQsbil7aWYoSWUuaXNVcmkodCkpcmV0dXJuIHQ7aWYoZ2xvYmFsVGhpcy5fVlNDT0RFX0ZJTEVfUk9PVCl7Y29uc3Qgcj1nbG9iYWxUaGlzLl9WU0NPREVfRklMRV9ST09UO2lmKC9eXHdbXHdcZCsuLV0qOlwvXC8vLnRlc3QocikpcmV0dXJuIEllLmpvaW5QYXRoKEllLnBhcnNlKHIsITApLHQpO2NvbnN0IGk9Vmwocix0KTtyZXR1cm4gSWUuZmlsZShpKX1yZXR1cm4gSWUucGFyc2Uobi50b1VybCh0KSl9fTtubi5GQUxMQkFDS19BVVRIT1JJVFk9Smw7bGV0IGFyPW5uO2NvbnN0IHlpPW5ldyBhcjt2YXIgd2k7KGZ1bmN0aW9uKGUpe2NvbnN0IHQ9bmV3IE1hcChbWyIxIix7IkNyb3NzLU9yaWdpbi1PcGVuZXItUG9saWN5Ijoic2FtZS1vcmlnaW4ifV0sWyIyIix7IkNyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3kiOiJyZXF1aXJlLWNvcnAifV0sWyIzIix7IkNyb3NzLU9yaWdpbi1PcGVuZXItUG9saWN5Ijoic2FtZS1vcmlnaW4iLCJDcm9zcy1PcmlnaW4tRW1iZWRkZXItUG9saWN5IjoicmVxdWlyZS1jb3JwIn1dXSk7ZS5Db29wQW5kQ29lcD1PYmplY3QuZnJlZXplKHQuZ2V0KCIzIikpO2NvbnN0IG49InZzY29kZS1jb2kiO2Z1bmN0aW9uIHIocyl7bGV0IGE7dHlwZW9mIHM9PSJzdHJpbmciP2E9bmV3IFVSTChzKS5zZWFyY2hQYXJhbXM6cyBpbnN0YW5jZW9mIFVSTD9hPXMuc2VhcmNoUGFyYW1zOkllLmlzVXJpKHMpJiYoYT1uZXcgVVJMKHMudG9TdHJpbmcoITApKS5zZWFyY2hQYXJhbXMpO2NvbnN0IGw9YT09bnVsbD92b2lkIDA6YS5nZXQobik7aWYobClyZXR1cm4gdC5nZXQobCl9ZS5nZXRIZWFkZXJzRnJvbVF1ZXJ5PXI7ZnVuY3Rpb24gaShzLGEsbCl7aWYoIWdsb2JhbFRoaXMuY3Jvc3NPcmlnaW5Jc29sYXRlZClyZXR1cm47Y29uc3Qgbz1hJiZsPyIzIjpsPyIyIjoiMSI7cyBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcz9zLnNldChuLG8pOnNbbl09b31lLmFkZFNlYXJjaFBhcmFtPWl9KSh3aXx8KHdpPXt9KSk7Y29uc3Qgb3I9ImRlZmF1bHQiLFhsPSIkaW5pdGlhbGl6ZSI7Y2xhc3MgUWx7Y29uc3RydWN0b3IodCxuLHIsaSxzKXt0aGlzLnZzV29ya2VyPXQsdGhpcy5yZXE9bix0aGlzLmNoYW5uZWw9cix0aGlzLm1ldGhvZD1pLHRoaXMuYXJncz1zLHRoaXMudHlwZT0wfX1jbGFzcyBfaXtjb25zdHJ1Y3Rvcih0LG4scixpKXt0aGlzLnZzV29ya2VyPXQsdGhpcy5zZXE9bix0aGlzLnJlcz1yLHRoaXMuZXJyPWksdGhpcy50eXBlPTF9fWNsYXNzIFlse2NvbnN0cnVjdG9yKHQsbixyLGkscyl7dGhpcy52c1dvcmtlcj10LHRoaXMucmVxPW4sdGhpcy5jaGFubmVsPXIsdGhpcy5ldmVudE5hbWU9aSx0aGlzLmFyZz1zLHRoaXMudHlwZT0yfX1jbGFzcyBabHtjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy52c1dvcmtlcj10LHRoaXMucmVxPW4sdGhpcy5ldmVudD1yLHRoaXMudHlwZT0zfX1jbGFzcyBLbHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMudnNXb3JrZXI9dCx0aGlzLnJlcT1uLHRoaXMudHlwZT00fX1jbGFzcyBldXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl93b3JrZXJJZD0tMSx0aGlzLl9oYW5kbGVyPXQsdGhpcy5fbGFzdFNlbnRSZXE9MCx0aGlzLl9wZW5kaW5nUmVwbGllcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX3BlbmRpbmdFbWl0dGVycz1uZXcgTWFwLHRoaXMuX3BlbmRpbmdFdmVudHM9bmV3IE1hcH1zZXRXb3JrZXJJZCh0KXt0aGlzLl93b3JrZXJJZD10fXNlbmRNZXNzYWdlKHQsbixyKXtjb25zdCBpPVN0cmluZygrK3RoaXMuX2xhc3RTZW50UmVxKTtyZXR1cm4gbmV3IFByb21pc2UoKHMsYSk9Pnt0aGlzLl9wZW5kaW5nUmVwbGllc1tpXT17cmVzb2x2ZTpzLHJlamVjdDphfSx0aGlzLl9zZW5kKG5ldyBRbCh0aGlzLl93b3JrZXJJZCxpLHQsbixyKSl9KX1saXN0ZW4odCxuLHIpe2xldCBpPW51bGw7Y29uc3Qgcz1uZXcgX2Uoe29uV2lsbEFkZEZpcnN0TGlzdGVuZXI6KCk9PntpPVN0cmluZygrK3RoaXMuX2xhc3RTZW50UmVxKSx0aGlzLl9wZW5kaW5nRW1pdHRlcnMuc2V0KGkscyksdGhpcy5fc2VuZChuZXcgWWwodGhpcy5fd29ya2VySWQsaSx0LG4scikpfSxvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcjooKT0+e3RoaXMuX3BlbmRpbmdFbWl0dGVycy5kZWxldGUoaSksdGhpcy5fc2VuZChuZXcgS2wodGhpcy5fd29ya2VySWQsaSkpLGk9bnVsbH19KTtyZXR1cm4gcy5ldmVudH1oYW5kbGVNZXNzYWdlKHQpeyF0fHwhdC52c1dvcmtlcnx8dGhpcy5fd29ya2VySWQhPT0tMSYmdC52c1dvcmtlciE9PXRoaXMuX3dvcmtlcklkfHx0aGlzLl9oYW5kbGVNZXNzYWdlKHQpfWNyZWF0ZVByb3h5VG9SZW1vdGVDaGFubmVsKHQsbil7Y29uc3Qgcj17Z2V0OihpLHMpPT4odHlwZW9mIHM9PSJzdHJpbmciJiYhaVtzXSYmKE5pKHMpP2lbc109YT0+dGhpcy5saXN0ZW4odCxzLGEpOkxpKHMpP2lbc109dGhpcy5saXN0ZW4odCxzLHZvaWQgMCk6cy5jaGFyQ29kZUF0KDApPT09MzYmJihpW3NdPWFzeW5jKC4uLmEpPT4oYXdhaXQobj09bnVsbD92b2lkIDA6bigpKSx0aGlzLnNlbmRNZXNzYWdlKHQscyxhKSkpKSxpW3NdKX07cmV0dXJuIG5ldyBQcm94eShPYmplY3QuY3JlYXRlKG51bGwpLHIpfV9oYW5kbGVNZXNzYWdlKHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UgMTpyZXR1cm4gdGhpcy5faGFuZGxlUmVwbHlNZXNzYWdlKHQpO2Nhc2UgMDpyZXR1cm4gdGhpcy5faGFuZGxlUmVxdWVzdE1lc3NhZ2UodCk7Y2FzZSAyOnJldHVybiB0aGlzLl9oYW5kbGVTdWJzY3JpYmVFdmVudE1lc3NhZ2UodCk7Y2FzZSAzOnJldHVybiB0aGlzLl9oYW5kbGVFdmVudE1lc3NhZ2UodCk7Y2FzZSA0OnJldHVybiB0aGlzLl9oYW5kbGVVbnN1YnNjcmliZUV2ZW50TWVzc2FnZSh0KX19X2hhbmRsZVJlcGx5TWVzc2FnZSh0KXtpZighdGhpcy5fcGVuZGluZ1JlcGxpZXNbdC5zZXFdKXtjb25zb2xlLndhcm4oIkdvdCByZXBseSB0byB1bmtub3duIHNlcSIpO3JldHVybn1jb25zdCBuPXRoaXMuX3BlbmRpbmdSZXBsaWVzW3Quc2VxXTtpZihkZWxldGUgdGhpcy5fcGVuZGluZ1JlcGxpZXNbdC5zZXFdLHQuZXJyKXtsZXQgcj10LmVycjt0LmVyci4kaXNFcnJvciYmKHI9bmV3IEVycm9yLHIubmFtZT10LmVyci5uYW1lLHIubWVzc2FnZT10LmVyci5tZXNzYWdlLHIuc3RhY2s9dC5lcnIuc3RhY2spLG4ucmVqZWN0KHIpO3JldHVybn1uLnJlc29sdmUodC5yZXMpfV9oYW5kbGVSZXF1ZXN0TWVzc2FnZSh0KXtjb25zdCBuPXQucmVxO3RoaXMuX2hhbmRsZXIuaGFuZGxlTWVzc2FnZSh0LmNoYW5uZWwsdC5tZXRob2QsdC5hcmdzKS50aGVuKGk9Pnt0aGlzLl9zZW5kKG5ldyBfaSh0aGlzLl93b3JrZXJJZCxuLGksdm9pZCAwKSl9LGk9PntpLmRldGFpbCBpbnN0YW5jZW9mIEVycm9yJiYoaS5kZXRhaWw9c2koaS5kZXRhaWwpKSx0aGlzLl9zZW5kKG5ldyBfaSh0aGlzLl93b3JrZXJJZCxuLHZvaWQgMCxzaShpKSkpfSl9X2hhbmRsZVN1YnNjcmliZUV2ZW50TWVzc2FnZSh0KXtjb25zdCBuPXQucmVxLHI9dGhpcy5faGFuZGxlci5oYW5kbGVFdmVudCh0LmNoYW5uZWwsdC5ldmVudE5hbWUsdC5hcmcpKGk9Pnt0aGlzLl9zZW5kKG5ldyBabCh0aGlzLl93b3JrZXJJZCxuLGkpKX0pO3RoaXMuX3BlbmRpbmdFdmVudHMuc2V0KG4scil9X2hhbmRsZUV2ZW50TWVzc2FnZSh0KXtpZighdGhpcy5fcGVuZGluZ0VtaXR0ZXJzLmhhcyh0LnJlcSkpe2NvbnNvbGUud2FybigiR290IGV2ZW50IGZvciB1bmtub3duIHJlcSIpO3JldHVybn10aGlzLl9wZW5kaW5nRW1pdHRlcnMuZ2V0KHQucmVxKS5maXJlKHQuZXZlbnQpfV9oYW5kbGVVbnN1YnNjcmliZUV2ZW50TWVzc2FnZSh0KXtpZighdGhpcy5fcGVuZGluZ0V2ZW50cy5oYXModC5yZXEpKXtjb25zb2xlLndhcm4oIkdvdCB1bnN1YnNjcmliZSBmb3IgdW5rbm93biByZXEiKTtyZXR1cm59dGhpcy5fcGVuZGluZ0V2ZW50cy5nZXQodC5yZXEpLmRpc3Bvc2UoKSx0aGlzLl9wZW5kaW5nRXZlbnRzLmRlbGV0ZSh0LnJlcSl9X3NlbmQodCl7Y29uc3Qgbj1bXTtpZih0LnR5cGU9PT0wKWZvcihsZXQgcj0wO3I8dC5hcmdzLmxlbmd0aDtyKyspdC5hcmdzW3JdaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciYmbi5wdXNoKHQuYXJnc1tyXSk7ZWxzZSB0LnR5cGU9PT0xJiZ0LnJlcyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyJiZuLnB1c2godC5yZXMpO3RoaXMuX2hhbmRsZXIuc2VuZE1lc3NhZ2UodCxuKX19ZnVuY3Rpb24gTGkoZSl7cmV0dXJuIGVbMF09PT0ibyImJmVbMV09PT0ibiImJmhpKGUuY2hhckNvZGVBdCgyKSl9ZnVuY3Rpb24gTmkoZSl7cmV0dXJuL15vbkR5bmFtaWMvLnRlc3QoZSkmJmhpKGUuY2hhckNvZGVBdCg5KSl9Y2xhc3MgdHV7Y29uc3RydWN0b3IodCxuKXt0aGlzLl9sb2NhbENoYW5uZWxzPW5ldyBNYXAsdGhpcy5fcmVtb3RlQ2hhbm5lbHM9bmV3IE1hcCx0aGlzLl9yZXF1ZXN0SGFuZGxlckZhY3Rvcnk9bix0aGlzLl9yZXF1ZXN0SGFuZGxlcj1udWxsLHRoaXMuX3Byb3RvY29sPW5ldyBldSh7c2VuZE1lc3NhZ2U6KHIsaSk9Pnt0KHIsaSl9LGhhbmRsZU1lc3NhZ2U6KHIsaSxzKT0+dGhpcy5faGFuZGxlTWVzc2FnZShyLGkscyksaGFuZGxlRXZlbnQ6KHIsaSxzKT0+dGhpcy5faGFuZGxlRXZlbnQocixpLHMpfSl9b25tZXNzYWdlKHQpe3RoaXMuX3Byb3RvY29sLmhhbmRsZU1lc3NhZ2UodCl9X2hhbmRsZU1lc3NhZ2UodCxuLHIpe2lmKHQ9PT1vciYmbj09PVhsKXJldHVybiB0aGlzLmluaXRpYWxpemUoclswXSxyWzFdLHJbMl0pO2NvbnN0IGk9dD09PW9yP3RoaXMuX3JlcXVlc3RIYW5kbGVyOnRoaXMuX2xvY2FsQ2hhbm5lbHMuZ2V0KHQpO2lmKCFpKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE1pc3NpbmcgY2hhbm5lbCAke3R9IG9uIHdvcmtlciB0aHJlYWRgKSk7aWYodHlwZW9mIGlbbl0hPSJmdW5jdGlvbiIpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgTWlzc2luZyBtZXRob2QgJHtufSBvbiB3b3JrZXIgdGhyZWFkIGNoYW5uZWwgJHt0fWApKTt0cnl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShpW25dLmFwcGx5KGkscikpfWNhdGNoKHMpe3JldHVybiBQcm9taXNlLnJlamVjdChzKX19X2hhbmRsZUV2ZW50KHQsbixyKXtjb25zdCBpPXQ9PT1vcj90aGlzLl9yZXF1ZXN0SGFuZGxlcjp0aGlzLl9sb2NhbENoYW5uZWxzLmdldCh0KTtpZighaSl0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgY2hhbm5lbCAke3R9IG9uIHdvcmtlciB0aHJlYWRgKTtpZihOaShuKSl7Y29uc3Qgcz1pW25dLmNhbGwoaSxyKTtpZih0eXBlb2YgcyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZHluYW1pYyBldmVudCAke259IG9uIHJlcXVlc3QgaGFuZGxlci5gKTtyZXR1cm4gc31pZihMaShuKSl7Y29uc3Qgcz1pW25dO2lmKHR5cGVvZiBzIT0iZnVuY3Rpb24iKXRocm93IG5ldyBFcnJvcihgTWlzc2luZyBldmVudCAke259IG9uIHJlcXVlc3QgaGFuZGxlci5gKTtyZXR1cm4gc310aHJvdyBuZXcgRXJyb3IoYE1hbGZvcm1lZCBldmVudCBuYW1lICR7bn1gKX1nZXRDaGFubmVsKHQpe2lmKCF0aGlzLl9yZW1vdGVDaGFubmVscy5oYXModCkpe2NvbnN0IG49dGhpcy5fcHJvdG9jb2wuY3JlYXRlUHJveHlUb1JlbW90ZUNoYW5uZWwodCk7dGhpcy5fcmVtb3RlQ2hhbm5lbHMuc2V0KHQsbil9cmV0dXJuIHRoaXMuX3JlbW90ZUNoYW5uZWxzLmdldCh0KX1hc3luYyBpbml0aWFsaXplKHQsbixyKXtpZih0aGlzLl9wcm90b2NvbC5zZXRXb3JrZXJJZCh0KSx0aGlzLl9yZXF1ZXN0SGFuZGxlckZhY3Rvcnkpe3RoaXMuX3JlcXVlc3RIYW5kbGVyPXRoaXMuX3JlcXVlc3RIYW5kbGVyRmFjdG9yeSh0aGlzKTtyZXR1cm59cmV0dXJuIG4mJih0eXBlb2Ygbi5iYXNlVXJsPCJ1IiYmZGVsZXRlIG4uYmFzZVVybCx0eXBlb2Ygbi5wYXRoczwidSImJnR5cGVvZiBuLnBhdGhzLnZzPCJ1IiYmZGVsZXRlIG4ucGF0aHMudnMsdHlwZW9mIG4udHJ1c3RlZFR5cGVzUG9saWN5PCJ1IiYmZGVsZXRlIG4udHJ1c3RlZFR5cGVzUG9saWN5LG4uY2F0Y2hFcnJvcj0hMCxnbG9iYWxUaGlzLnJlcXVpcmUuY29uZmlnKG4pKSxpbXBvcnQoYCR7eWkuYXNCcm93c2VyVXJpKGAke3J9LmpzYCkudG9TdHJpbmcoITApfWApLnRoZW4ocz0+e2lmKHRoaXMuX3JlcXVlc3RIYW5kbGVyPXMuY3JlYXRlKHRoaXMpLCF0aGlzLl9yZXF1ZXN0SGFuZGxlcil0aHJvdyBuZXcgRXJyb3IoIk5vIFJlcXVlc3RIYW5kbGVyISIpfSl9fWNsYXNzIFlle2NvbnN0cnVjdG9yKHQsbixyLGkpe3RoaXMub3JpZ2luYWxTdGFydD10LHRoaXMub3JpZ2luYWxMZW5ndGg9bix0aGlzLm1vZGlmaWVkU3RhcnQ9cix0aGlzLm1vZGlmaWVkTGVuZ3RoPWl9Z2V0T3JpZ2luYWxFbmQoKXtyZXR1cm4gdGhpcy5vcmlnaW5hbFN0YXJ0K3RoaXMub3JpZ2luYWxMZW5ndGh9Z2V0TW9kaWZpZWRFbmQoKXtyZXR1cm4gdGhpcy5tb2RpZmllZFN0YXJ0K3RoaXMubW9kaWZpZWRMZW5ndGh9fWZ1bmN0aW9uIFNpKGUsdCl7cmV0dXJuKHQ8PDUpLXQrZXwwfWZ1bmN0aW9uIG51KGUsdCl7dD1TaSgxNDk0MTcsdCk7Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXQ9U2koZS5jaGFyQ29kZUF0KG4pLHQpO3JldHVybiB0fWNsYXNzIEFpe2NvbnN0cnVjdG9yKHQpe3RoaXMuc291cmNlPXR9Z2V0RWxlbWVudHMoKXtjb25zdCB0PXRoaXMuc291cmNlLG49bmV3IEludDMyQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgcj0wLGk9dC5sZW5ndGg7cjxpO3IrKyluW3JdPXQuY2hhckNvZGVBdChyKTtyZXR1cm4gbn19ZnVuY3Rpb24gcnUoZSx0LG4pe3JldHVybiBuZXcgWmUobmV3IEFpKGUpLG5ldyBBaSh0KSkuQ29tcHV0ZURpZmYobikuY2hhbmdlc31jbGFzcyB2dHtzdGF0aWMgQXNzZXJ0KHQsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKG4pfX1jbGFzcyB4dHtzdGF0aWMgQ29weSh0LG4scixpLHMpe2ZvcihsZXQgYT0wO2E8czthKyspcltpK2FdPXRbbithXX1zdGF0aWMgQ29weTIodCxuLHIsaSxzKXtmb3IobGV0IGE9MDthPHM7YSsrKXJbaSthXT10W24rYV19fWNsYXNzIGtpe2NvbnN0cnVjdG9yKCl7dGhpcy5tX2NoYW5nZXM9W10sdGhpcy5tX29yaWdpbmFsU3RhcnQ9MTA3Mzc0MTgyNCx0aGlzLm1fbW9kaWZpZWRTdGFydD0xMDczNzQxODI0LHRoaXMubV9vcmlnaW5hbENvdW50PTAsdGhpcy5tX21vZGlmaWVkQ291bnQ9MH1NYXJrTmV4dENoYW5nZSgpeyh0aGlzLm1fb3JpZ2luYWxDb3VudD4wfHx0aGlzLm1fbW9kaWZpZWRDb3VudD4wKSYmdGhpcy5tX2NoYW5nZXMucHVzaChuZXcgWWUodGhpcy5tX29yaWdpbmFsU3RhcnQsdGhpcy5tX29yaWdpbmFsQ291bnQsdGhpcy5tX21vZGlmaWVkU3RhcnQsdGhpcy5tX21vZGlmaWVkQ291bnQpKSx0aGlzLm1fb3JpZ2luYWxDb3VudD0wLHRoaXMubV9tb2RpZmllZENvdW50PTAsdGhpcy5tX29yaWdpbmFsU3RhcnQ9MTA3Mzc0MTgyNCx0aGlzLm1fbW9kaWZpZWRTdGFydD0xMDczNzQxODI0fUFkZE9yaWdpbmFsRWxlbWVudCh0LG4pe3RoaXMubV9vcmlnaW5hbFN0YXJ0PU1hdGgubWluKHRoaXMubV9vcmlnaW5hbFN0YXJ0LHQpLHRoaXMubV9tb2RpZmllZFN0YXJ0PU1hdGgubWluKHRoaXMubV9tb2RpZmllZFN0YXJ0LG4pLHRoaXMubV9vcmlnaW5hbENvdW50Kyt9QWRkTW9kaWZpZWRFbGVtZW50KHQsbil7dGhpcy5tX29yaWdpbmFsU3RhcnQ9TWF0aC5taW4odGhpcy5tX29yaWdpbmFsU3RhcnQsdCksdGhpcy5tX21vZGlmaWVkU3RhcnQ9TWF0aC5taW4odGhpcy5tX21vZGlmaWVkU3RhcnQsbiksdGhpcy5tX21vZGlmaWVkQ291bnQrK31nZXRDaGFuZ2VzKCl7cmV0dXJuKHRoaXMubV9vcmlnaW5hbENvdW50PjB8fHRoaXMubV9tb2RpZmllZENvdW50PjApJiZ0aGlzLk1hcmtOZXh0Q2hhbmdlKCksdGhpcy5tX2NoYW5nZXN9Z2V0UmV2ZXJzZUNoYW5nZXMoKXtyZXR1cm4odGhpcy5tX29yaWdpbmFsQ291bnQ+MHx8dGhpcy5tX21vZGlmaWVkQ291bnQ+MCkmJnRoaXMuTWFya05leHRDaGFuZ2UoKSx0aGlzLm1fY2hhbmdlcy5yZXZlcnNlKCksdGhpcy5tX2NoYW5nZXN9fWNsYXNzIFple2NvbnN0cnVjdG9yKHQsbixyPW51bGwpe3RoaXMuQ29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlPXIsdGhpcy5fb3JpZ2luYWxTZXF1ZW5jZT10LHRoaXMuX21vZGlmaWVkU2VxdWVuY2U9bjtjb25zdFtpLHMsYV09WmUuX2dldEVsZW1lbnRzKHQpLFtsLG8sdV09WmUuX2dldEVsZW1lbnRzKG4pO3RoaXMuX2hhc1N0cmluZ3M9YSYmdSx0aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzPWksdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaD1zLHRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHM9bCx0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoPW8sdGhpcy5tX2ZvcndhcmRIaXN0b3J5PVtdLHRoaXMubV9yZXZlcnNlSGlzdG9yeT1bXX1zdGF0aWMgX2lzU3RyaW5nQXJyYXkodCl7cmV0dXJuIHQubGVuZ3RoPjAmJnR5cGVvZiB0WzBdPT0ic3RyaW5nIn1zdGF0aWMgX2dldEVsZW1lbnRzKHQpe2NvbnN0IG49dC5nZXRFbGVtZW50cygpO2lmKFplLl9pc1N0cmluZ0FycmF5KG4pKXtjb25zdCByPW5ldyBJbnQzMkFycmF5KG4ubGVuZ3RoKTtmb3IobGV0IGk9MCxzPW4ubGVuZ3RoO2k8cztpKyspcltpXT1udShuW2ldLDApO3JldHVybltuLHIsITBdfXJldHVybiBuIGluc3RhbmNlb2YgSW50MzJBcnJheT9bW10sbiwhMV06W1tdLG5ldyBJbnQzMkFycmF5KG4pLCExXX1FbGVtZW50c0FyZUVxdWFsKHQsbil7cmV0dXJuIHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2hbdF0hPT10aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoW25dPyExOnRoaXMuX2hhc1N0cmluZ3M/dGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1t0XT09PXRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHNbbl06ITB9RWxlbWVudHNBcmVTdHJpY3RFcXVhbCh0LG4pe2lmKCF0aGlzLkVsZW1lbnRzQXJlRXF1YWwodCxuKSlyZXR1cm4hMTtjb25zdCByPVplLl9nZXRTdHJpY3RFbGVtZW50KHRoaXMuX29yaWdpbmFsU2VxdWVuY2UsdCksaT1aZS5fZ2V0U3RyaWN0RWxlbWVudCh0aGlzLl9tb2RpZmllZFNlcXVlbmNlLG4pO3JldHVybiByPT09aX1zdGF0aWMgX2dldFN0cmljdEVsZW1lbnQodCxuKXtyZXR1cm4gdHlwZW9mIHQuZ2V0U3RyaWN0RWxlbWVudD09ImZ1bmN0aW9uIj90LmdldFN0cmljdEVsZW1lbnQobik6bnVsbH1PcmlnaW5hbEVsZW1lbnRzQXJlRXF1YWwodCxuKXtyZXR1cm4gdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaFt0XSE9PXRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2hbbl0/ITE6dGhpcy5faGFzU3RyaW5ncz90aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW3RdPT09dGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1tuXTohMH1Nb2RpZmllZEVsZW1lbnRzQXJlRXF1YWwodCxuKXtyZXR1cm4gdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaFt0XSE9PXRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2hbbl0/ITE6dGhpcy5faGFzU3RyaW5ncz90aGlzLl9tb2RpZmllZFN0cmluZ0VsZW1lbnRzW3RdPT09dGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50c1tuXTohMH1Db21wdXRlRGlmZih0KXtyZXR1cm4gdGhpcy5fQ29tcHV0ZURpZmYoMCx0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoLmxlbmd0aC0xLDAsdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaC5sZW5ndGgtMSx0KX1fQ29tcHV0ZURpZmYodCxuLHIsaSxzKXtjb25zdCBhPVshMV07bGV0IGw9dGhpcy5Db21wdXRlRGlmZlJlY3Vyc2l2ZSh0LG4scixpLGEpO3JldHVybiBzJiYobD10aGlzLlByZXR0aWZ5Q2hhbmdlcyhsKSkse3F1aXRFYXJseTphWzBdLGNoYW5nZXM6bH19Q29tcHV0ZURpZmZSZWN1cnNpdmUodCxuLHIsaSxzKXtmb3Ioc1swXT0hMTt0PD1uJiZyPD1pJiZ0aGlzLkVsZW1lbnRzQXJlRXF1YWwodCxyKTspdCsrLHIrKztmb3IoO24+PXQmJmk+PXImJnRoaXMuRWxlbWVudHNBcmVFcXVhbChuLGkpOyluLS0saS0tO2lmKHQ+bnx8cj5pKXtsZXQgZjtyZXR1cm4gcjw9aT8odnQuQXNzZXJ0KHQ9PT1uKzEsIm9yaWdpbmFsU3RhcnQgc2hvdWxkIG9ubHkgYmUgb25lIG1vcmUgdGhhbiBvcmlnaW5hbEVuZCIpLGY9W25ldyBZZSh0LDAscixpLXIrMSldKTp0PD1uPyh2dC5Bc3NlcnQocj09PWkrMSwibW9kaWZpZWRTdGFydCBzaG91bGQgb25seSBiZSBvbmUgbW9yZSB0aGFuIG1vZGlmaWVkRW5kIiksZj1bbmV3IFllKHQsbi10KzEsciwwKV0pOih2dC5Bc3NlcnQodD09PW4rMSwib3JpZ2luYWxTdGFydCBzaG91bGQgb25seSBiZSBvbmUgbW9yZSB0aGFuIG9yaWdpbmFsRW5kIiksdnQuQXNzZXJ0KHI9PT1pKzEsIm1vZGlmaWVkU3RhcnQgc2hvdWxkIG9ubHkgYmUgb25lIG1vcmUgdGhhbiBtb2RpZmllZEVuZCIpLGY9W10pLGZ9Y29uc3QgYT1bMF0sbD1bMF0sbz10aGlzLkNvbXB1dGVSZWN1cnNpb25Qb2ludCh0LG4scixpLGEsbCxzKSx1PWFbMF0saD1sWzBdO2lmKG8hPT1udWxsKXJldHVybiBvO2lmKCFzWzBdKXtjb25zdCBmPXRoaXMuQ29tcHV0ZURpZmZSZWN1cnNpdmUodCx1LHIsaCxzKTtsZXQgZD1bXTtyZXR1cm4gc1swXT9kPVtuZXcgWWUodSsxLG4tKHUrMSkrMSxoKzEsaS0oaCsxKSsxKV06ZD10aGlzLkNvbXB1dGVEaWZmUmVjdXJzaXZlKHUrMSxuLGgrMSxpLHMpLHRoaXMuQ29uY2F0ZW5hdGVDaGFuZ2VzKGYsZCl9cmV0dXJuW25ldyBZZSh0LG4tdCsxLHIsaS1yKzEpXX1XQUxLVFJBQ0UodCxuLHIsaSxzLGEsbCxvLHUsaCxmLGQsbSxnLHAseCx3LEwpe2xldCB2PW51bGwseT1udWxsLGI9bmV3IGtpLF89bixBPXIsQz1tWzBdLXhbMF0taSxGPS0xMDczNzQxODI0LE89dGhpcy5tX2ZvcndhcmRIaXN0b3J5Lmxlbmd0aC0xO2Rve2NvbnN0IE09Qyt0O009PT1ffHxNPEEmJnVbTS0xXTx1W00rMV0/KGY9dVtNKzFdLGc9Zi1DLWksZjxGJiZiLk1hcmtOZXh0Q2hhbmdlKCksRj1mLGIuQWRkTW9kaWZpZWRFbGVtZW50KGYrMSxnKSxDPU0rMS10KTooZj11W00tMV0rMSxnPWYtQy1pLGY8RiYmYi5NYXJrTmV4dENoYW5nZSgpLEY9Zi0xLGIuQWRkT3JpZ2luYWxFbGVtZW50KGYsZysxKSxDPU0tMS10KSxPPj0wJiYodT10aGlzLm1fZm9yd2FyZEhpc3RvcnlbT10sdD11WzBdLF89MSxBPXUubGVuZ3RoLTEpfXdoaWxlKC0tTz49LTEpO2lmKHY9Yi5nZXRSZXZlcnNlQ2hhbmdlcygpLExbMF0pe2xldCBNPW1bMF0rMSxOPXhbMF0rMTtpZih2IT09bnVsbCYmdi5sZW5ndGg+MCl7Y29uc3Qgaz12W3YubGVuZ3RoLTFdO009TWF0aC5tYXgoTSxrLmdldE9yaWdpbmFsRW5kKCkpLE49TWF0aC5tYXgoTixrLmdldE1vZGlmaWVkRW5kKCkpfXk9W25ldyBZZShNLGQtTSsxLE4scC1OKzEpXX1lbHNle2I9bmV3IGtpLF89YSxBPWwsQz1tWzBdLXhbMF0tbyxGPTEwNzM3NDE4MjQsTz13P3RoaXMubV9yZXZlcnNlSGlzdG9yeS5sZW5ndGgtMTp0aGlzLm1fcmV2ZXJzZUhpc3RvcnkubGVuZ3RoLTI7ZG97Y29uc3QgTT1DK3M7TT09PV98fE08QSYmaFtNLTFdPj1oW00rMV0/KGY9aFtNKzFdLTEsZz1mLUMtbyxmPkYmJmIuTWFya05leHRDaGFuZ2UoKSxGPWYrMSxiLkFkZE9yaWdpbmFsRWxlbWVudChmKzEsZysxKSxDPU0rMS1zKTooZj1oW00tMV0sZz1mLUMtbyxmPkYmJmIuTWFya05leHRDaGFuZ2UoKSxGPWYsYi5BZGRNb2RpZmllZEVsZW1lbnQoZisxLGcrMSksQz1NLTEtcyksTz49MCYmKGg9dGhpcy5tX3JldmVyc2VIaXN0b3J5W09dLHM9aFswXSxfPTEsQT1oLmxlbmd0aC0xKX13aGlsZSgtLU8+PS0xKTt5PWIuZ2V0Q2hhbmdlcygpfXJldHVybiB0aGlzLkNvbmNhdGVuYXRlQ2hhbmdlcyh2LHkpfUNvbXB1dGVSZWN1cnNpb25Qb2ludCh0LG4scixpLHMsYSxsKXtsZXQgbz0wLHU9MCxoPTAsZj0wLGQ9MCxtPTA7dC0tLHItLSxzWzBdPTAsYVswXT0wLHRoaXMubV9mb3J3YXJkSGlzdG9yeT1bXSx0aGlzLm1fcmV2ZXJzZUhpc3Rvcnk9W107Y29uc3QgZz1uLXQrKGktcikscD1nKzEseD1uZXcgSW50MzJBcnJheShwKSx3PW5ldyBJbnQzMkFycmF5KHApLEw9aS1yLHY9bi10LHk9dC1yLGI9bi1pLEE9KHYtTCklMj09PTA7eFtMXT10LHdbdl09bixsWzBdPSExO2ZvcihsZXQgQz0xO0M8PWcvMisxO0MrKyl7bGV0IEY9MCxPPTA7aD10aGlzLkNsaXBEaWFnb25hbEJvdW5kKEwtQyxDLEwscCksZj10aGlzLkNsaXBEaWFnb25hbEJvdW5kKEwrQyxDLEwscCk7Zm9yKGxldCBOPWg7Tjw9ZjtOKz0yKXtOPT09aHx8TjxmJiZ4W04tMV08eFtOKzFdP289eFtOKzFdOm89eFtOLTFdKzEsdT1vLShOLUwpLXk7Y29uc3Qgaz1vO2Zvcig7bzxuJiZ1PGkmJnRoaXMuRWxlbWVudHNBcmVFcXVhbChvKzEsdSsxKTspbysrLHUrKztpZih4W05dPW8sbyt1PkYrTyYmKEY9byxPPXUpLCFBJiZNYXRoLmFicyhOLXYpPD1DLTEmJm8+PXdbTl0pcmV0dXJuIHNbMF09byxhWzBdPXUsazw9d1tOXSYmQzw9MTQ0OD90aGlzLldBTEtUUkFDRShMLGgsZix5LHYsZCxtLGIseCx3LG8sbixzLHUsaSxhLEEsbCk6bnVsbH1jb25zdCBNPShGLXQrKE8tciktQykvMjtpZih0aGlzLkNvbnRpbnVlUHJvY2Vzc2luZ1ByZWRpY2F0ZSE9PW51bGwmJiF0aGlzLkNvbnRpbnVlUHJvY2Vzc2luZ1ByZWRpY2F0ZShGLE0pKXJldHVybiBsWzBdPSEwLHNbMF09RixhWzBdPU8sTT4wJiZDPD0xNDQ4P3RoaXMuV0FMS1RSQUNFKEwsaCxmLHksdixkLG0sYix4LHcsbyxuLHMsdSxpLGEsQSxsKToodCsrLHIrKyxbbmV3IFllKHQsbi10KzEscixpLXIrMSldKTtkPXRoaXMuQ2xpcERpYWdvbmFsQm91bmQodi1DLEMsdixwKSxtPXRoaXMuQ2xpcERpYWdvbmFsQm91bmQoditDLEMsdixwKTtmb3IobGV0IE49ZDtOPD1tO04rPTIpe049PT1kfHxOPG0mJndbTi0xXT49d1tOKzFdP289d1tOKzFdLTE6bz13W04tMV0sdT1vLShOLXYpLWI7Y29uc3Qgaz1vO2Zvcig7bz50JiZ1PnImJnRoaXMuRWxlbWVudHNBcmVFcXVhbChvLHUpOylvLS0sdS0tO2lmKHdbTl09byxBJiZNYXRoLmFicyhOLUwpPD1DJiZvPD14W05dKXJldHVybiBzWzBdPW8sYVswXT11LGs+PXhbTl0mJkM8PTE0NDg/dGhpcy5XQUxLVFJBQ0UoTCxoLGYseSx2LGQsbSxiLHgsdyxvLG4scyx1LGksYSxBLGwpOm51bGx9aWYoQzw9MTQ0Nyl7bGV0IE49bmV3IEludDMyQXJyYXkoZi1oKzIpO05bMF09TC1oKzEseHQuQ29weTIoeCxoLE4sMSxmLWgrMSksdGhpcy5tX2ZvcndhcmRIaXN0b3J5LnB1c2goTiksTj1uZXcgSW50MzJBcnJheShtLWQrMiksTlswXT12LWQrMSx4dC5Db3B5Mih3LGQsTiwxLG0tZCsxKSx0aGlzLm1fcmV2ZXJzZUhpc3RvcnkucHVzaChOKX19cmV0dXJuIHRoaXMuV0FMS1RSQUNFKEwsaCxmLHksdixkLG0sYix4LHcsbyxuLHMsdSxpLGEsQSxsKX1QcmV0dGlmeUNoYW5nZXModCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dFtuXSxpPW48dC5sZW5ndGgtMT90W24rMV0ub3JpZ2luYWxTdGFydDp0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoLmxlbmd0aCxzPW48dC5sZW5ndGgtMT90W24rMV0ubW9kaWZpZWRTdGFydDp0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoLmxlbmd0aCxhPXIub3JpZ2luYWxMZW5ndGg+MCxsPXIubW9kaWZpZWRMZW5ndGg+MDtmb3IoO3Iub3JpZ2luYWxTdGFydCtyLm9yaWdpbmFsTGVuZ3RoPGkmJnIubW9kaWZpZWRTdGFydCtyLm1vZGlmaWVkTGVuZ3RoPHMmJighYXx8dGhpcy5PcmlnaW5hbEVsZW1lbnRzQXJlRXF1YWwoci5vcmlnaW5hbFN0YXJ0LHIub3JpZ2luYWxTdGFydCtyLm9yaWdpbmFsTGVuZ3RoKSkmJighbHx8dGhpcy5Nb2RpZmllZEVsZW1lbnRzQXJlRXF1YWwoci5tb2RpZmllZFN0YXJ0LHIubW9kaWZpZWRTdGFydCtyLm1vZGlmaWVkTGVuZ3RoKSk7KXtjb25zdCB1PXRoaXMuRWxlbWVudHNBcmVTdHJpY3RFcXVhbChyLm9yaWdpbmFsU3RhcnQsci5tb2RpZmllZFN0YXJ0KTtpZih0aGlzLkVsZW1lbnRzQXJlU3RyaWN0RXF1YWwoci5vcmlnaW5hbFN0YXJ0K3Iub3JpZ2luYWxMZW5ndGgsci5tb2RpZmllZFN0YXJ0K3IubW9kaWZpZWRMZW5ndGgpJiYhdSlicmVhaztyLm9yaWdpbmFsU3RhcnQrKyxyLm1vZGlmaWVkU3RhcnQrK31jb25zdCBvPVtudWxsXTtpZihuPHQubGVuZ3RoLTEmJnRoaXMuQ2hhbmdlc092ZXJsYXAodFtuXSx0W24rMV0sbykpe3Rbbl09b1swXSx0LnNwbGljZShuKzEsMSksbi0tO2NvbnRpbnVlfX1mb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSl7Y29uc3Qgcj10W25dO2xldCBpPTAscz0wO2lmKG4+MCl7Y29uc3QgZj10W24tMV07aT1mLm9yaWdpbmFsU3RhcnQrZi5vcmlnaW5hbExlbmd0aCxzPWYubW9kaWZpZWRTdGFydCtmLm1vZGlmaWVkTGVuZ3RofWNvbnN0IGE9ci5vcmlnaW5hbExlbmd0aD4wLGw9ci5tb2RpZmllZExlbmd0aD4wO2xldCBvPTAsdT10aGlzLl9ib3VuZGFyeVNjb3JlKHIub3JpZ2luYWxTdGFydCxyLm9yaWdpbmFsTGVuZ3RoLHIubW9kaWZpZWRTdGFydCxyLm1vZGlmaWVkTGVuZ3RoKTtmb3IobGV0IGY9MTs7ZisrKXtjb25zdCBkPXIub3JpZ2luYWxTdGFydC1mLG09ci5tb2RpZmllZFN0YXJ0LWY7aWYoZDxpfHxtPHN8fGEmJiF0aGlzLk9yaWdpbmFsRWxlbWVudHNBcmVFcXVhbChkLGQrci5vcmlnaW5hbExlbmd0aCl8fGwmJiF0aGlzLk1vZGlmaWVkRWxlbWVudHNBcmVFcXVhbChtLG0rci5tb2RpZmllZExlbmd0aCkpYnJlYWs7Y29uc3QgcD0oZD09PWkmJm09PT1zPzU6MCkrdGhpcy5fYm91bmRhcnlTY29yZShkLHIub3JpZ2luYWxMZW5ndGgsbSxyLm1vZGlmaWVkTGVuZ3RoKTtwPnUmJih1PXAsbz1mKX1yLm9yaWdpbmFsU3RhcnQtPW8sci5tb2RpZmllZFN0YXJ0LT1vO2NvbnN0IGg9W251bGxdO2lmKG4+MCYmdGhpcy5DaGFuZ2VzT3ZlcmxhcCh0W24tMV0sdFtuXSxoKSl7dFtuLTFdPWhbMF0sdC5zcGxpY2UobiwxKSxuKys7Y29udGludWV9fWlmKHRoaXMuX2hhc1N0cmluZ3MpZm9yKGxldCBuPTEscj10Lmxlbmd0aDtuPHI7bisrKXtjb25zdCBpPXRbbi0xXSxzPXRbbl0sYT1zLm9yaWdpbmFsU3RhcnQtaS5vcmlnaW5hbFN0YXJ0LWkub3JpZ2luYWxMZW5ndGgsbD1pLm9yaWdpbmFsU3RhcnQsbz1zLm9yaWdpbmFsU3RhcnQrcy5vcmlnaW5hbExlbmd0aCx1PW8tbCxoPWkubW9kaWZpZWRTdGFydCxmPXMubW9kaWZpZWRTdGFydCtzLm1vZGlmaWVkTGVuZ3RoLGQ9Zi1oO2lmKGE8NSYmdTwyMCYmZDwyMCl7Y29uc3QgbT10aGlzLl9maW5kQmV0dGVyQ29udGlndW91c1NlcXVlbmNlKGwsdSxoLGQsYSk7aWYobSl7Y29uc3RbZyxwXT1tOyhnIT09aS5vcmlnaW5hbFN0YXJ0K2kub3JpZ2luYWxMZW5ndGh8fHAhPT1pLm1vZGlmaWVkU3RhcnQraS5tb2RpZmllZExlbmd0aCkmJihpLm9yaWdpbmFsTGVuZ3RoPWctaS5vcmlnaW5hbFN0YXJ0LGkubW9kaWZpZWRMZW5ndGg9cC1pLm1vZGlmaWVkU3RhcnQscy5vcmlnaW5hbFN0YXJ0PWcrYSxzLm1vZGlmaWVkU3RhcnQ9cCthLHMub3JpZ2luYWxMZW5ndGg9by1zLm9yaWdpbmFsU3RhcnQscy5tb2RpZmllZExlbmd0aD1mLXMubW9kaWZpZWRTdGFydCl9fX1yZXR1cm4gdH1fZmluZEJldHRlckNvbnRpZ3VvdXNTZXF1ZW5jZSh0LG4scixpLHMpe2lmKG48c3x8aTxzKXJldHVybiBudWxsO2NvbnN0IGE9dCtuLXMrMSxsPXIraS1zKzE7bGV0IG89MCx1PTAsaD0wO2ZvcihsZXQgZj10O2Y8YTtmKyspZm9yKGxldCBkPXI7ZDxsO2QrKyl7Y29uc3QgbT10aGlzLl9jb250aWd1b3VzU2VxdWVuY2VTY29yZShmLGQscyk7bT4wJiZtPm8mJihvPW0sdT1mLGg9ZCl9cmV0dXJuIG8+MD9bdSxoXTpudWxsfV9jb250aWd1b3VzU2VxdWVuY2VTY29yZSh0LG4scil7bGV0IGk9MDtmb3IobGV0IHM9MDtzPHI7cysrKXtpZighdGhpcy5FbGVtZW50c0FyZUVxdWFsKHQrcyxuK3MpKXJldHVybiAwO2krPXRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHNbdCtzXS5sZW5ndGh9cmV0dXJuIGl9X09yaWdpbmFsSXNCb3VuZGFyeSh0KXtyZXR1cm4gdDw9MHx8dD49dGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaC5sZW5ndGgtMT8hMDp0aGlzLl9oYXNTdHJpbmdzJiYvXlxzKiQvLnRlc3QodGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1t0XSl9X09yaWdpbmFsUmVnaW9uSXNCb3VuZGFyeSh0LG4pe2lmKHRoaXMuX09yaWdpbmFsSXNCb3VuZGFyeSh0KXx8dGhpcy5fT3JpZ2luYWxJc0JvdW5kYXJ5KHQtMSkpcmV0dXJuITA7aWYobj4wKXtjb25zdCByPXQrbjtpZih0aGlzLl9PcmlnaW5hbElzQm91bmRhcnkoci0xKXx8dGhpcy5fT3JpZ2luYWxJc0JvdW5kYXJ5KHIpKXJldHVybiEwfXJldHVybiExfV9Nb2RpZmllZElzQm91bmRhcnkodCl7cmV0dXJuIHQ8PTB8fHQ+PXRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2gubGVuZ3RoLTE/ITA6dGhpcy5faGFzU3RyaW5ncyYmL15ccyokLy50ZXN0KHRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHNbdF0pfV9Nb2RpZmllZFJlZ2lvbklzQm91bmRhcnkodCxuKXtpZih0aGlzLl9Nb2RpZmllZElzQm91bmRhcnkodCl8fHRoaXMuX01vZGlmaWVkSXNCb3VuZGFyeSh0LTEpKXJldHVybiEwO2lmKG4+MCl7Y29uc3Qgcj10K247aWYodGhpcy5fTW9kaWZpZWRJc0JvdW5kYXJ5KHItMSl8fHRoaXMuX01vZGlmaWVkSXNCb3VuZGFyeShyKSlyZXR1cm4hMH1yZXR1cm4hMX1fYm91bmRhcnlTY29yZSh0LG4scixpKXtjb25zdCBzPXRoaXMuX09yaWdpbmFsUmVnaW9uSXNCb3VuZGFyeSh0LG4pPzE6MCxhPXRoaXMuX01vZGlmaWVkUmVnaW9uSXNCb3VuZGFyeShyLGkpPzE6MDtyZXR1cm4gcythfUNvbmNhdGVuYXRlQ2hhbmdlcyh0LG4pe2NvbnN0IHI9W107aWYodC5sZW5ndGg9PT0wfHxuLmxlbmd0aD09PTApcmV0dXJuIG4ubGVuZ3RoPjA/bjp0O2lmKHRoaXMuQ2hhbmdlc092ZXJsYXAodFt0Lmxlbmd0aC0xXSxuWzBdLHIpKXtjb25zdCBpPW5ldyBBcnJheSh0Lmxlbmd0aCtuLmxlbmd0aC0xKTtyZXR1cm4geHQuQ29weSh0LDAsaSwwLHQubGVuZ3RoLTEpLGlbdC5sZW5ndGgtMV09clswXSx4dC5Db3B5KG4sMSxpLHQubGVuZ3RoLG4ubGVuZ3RoLTEpLGl9ZWxzZXtjb25zdCBpPW5ldyBBcnJheSh0Lmxlbmd0aCtuLmxlbmd0aCk7cmV0dXJuIHh0LkNvcHkodCwwLGksMCx0Lmxlbmd0aCkseHQuQ29weShuLDAsaSx0Lmxlbmd0aCxuLmxlbmd0aCksaX19Q2hhbmdlc092ZXJsYXAodCxuLHIpe2lmKHZ0LkFzc2VydCh0Lm9yaWdpbmFsU3RhcnQ8PW4ub3JpZ2luYWxTdGFydCwiTGVmdCBjaGFuZ2UgaXMgbm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byByaWdodCBjaGFuZ2UiKSx2dC5Bc3NlcnQodC5tb2RpZmllZFN0YXJ0PD1uLm1vZGlmaWVkU3RhcnQsIkxlZnQgY2hhbmdlIGlzIG5vdCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcmlnaHQgY2hhbmdlIiksdC5vcmlnaW5hbFN0YXJ0K3Qub3JpZ2luYWxMZW5ndGg+PW4ub3JpZ2luYWxTdGFydHx8dC5tb2RpZmllZFN0YXJ0K3QubW9kaWZpZWRMZW5ndGg+PW4ubW9kaWZpZWRTdGFydCl7Y29uc3QgaT10Lm9yaWdpbmFsU3RhcnQ7bGV0IHM9dC5vcmlnaW5hbExlbmd0aDtjb25zdCBhPXQubW9kaWZpZWRTdGFydDtsZXQgbD10Lm1vZGlmaWVkTGVuZ3RoO3JldHVybiB0Lm9yaWdpbmFsU3RhcnQrdC5vcmlnaW5hbExlbmd0aD49bi5vcmlnaW5hbFN0YXJ0JiYocz1uLm9yaWdpbmFsU3RhcnQrbi5vcmlnaW5hbExlbmd0aC10Lm9yaWdpbmFsU3RhcnQpLHQubW9kaWZpZWRTdGFydCt0Lm1vZGlmaWVkTGVuZ3RoPj1uLm1vZGlmaWVkU3RhcnQmJihsPW4ubW9kaWZpZWRTdGFydCtuLm1vZGlmaWVkTGVuZ3RoLXQubW9kaWZpZWRTdGFydCksclswXT1uZXcgWWUoaSxzLGEsbCksITB9ZWxzZSByZXR1cm4gclswXT1udWxsLCExfUNsaXBEaWFnb25hbEJvdW5kKHQsbixyLGkpe2lmKHQ+PTAmJnQ8aSlyZXR1cm4gdDtjb25zdCBzPXIsYT1pLXItMSxsPW4lMj09PTA7aWYodDwwKXtjb25zdCBvPXMlMj09PTA7cmV0dXJuIGw9PT1vPzA6MX1lbHNle2NvbnN0IG89YSUyPT09MDtyZXR1cm4gbD09PW8/aS0xOmktMn19fWxldCBlZT1jbGFzcyBodHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMubGluZU51bWJlcj10LHRoaXMuY29sdW1uPW59d2l0aCh0PXRoaXMubGluZU51bWJlcixuPXRoaXMuY29sdW1uKXtyZXR1cm4gdD09PXRoaXMubGluZU51bWJlciYmbj09PXRoaXMuY29sdW1uP3RoaXM6bmV3IGh0KHQsbil9ZGVsdGEodD0wLG49MCl7cmV0dXJuIHRoaXMud2l0aCh0aGlzLmxpbmVOdW1iZXIrdCx0aGlzLmNvbHVtbituKX1lcXVhbHModCl7cmV0dXJuIGh0LmVxdWFscyh0aGlzLHQpfXN0YXRpYyBlcXVhbHModCxuKXtyZXR1cm4hdCYmIW4/ITA6ISF0JiYhIW4mJnQubGluZU51bWJlcj09PW4ubGluZU51bWJlciYmdC5jb2x1bW49PT1uLmNvbHVtbn1pc0JlZm9yZSh0KXtyZXR1cm4gaHQuaXNCZWZvcmUodGhpcyx0KX1zdGF0aWMgaXNCZWZvcmUodCxuKXtyZXR1cm4gdC5saW5lTnVtYmVyPG4ubGluZU51bWJlcj8hMDpuLmxpbmVOdW1iZXI8dC5saW5lTnVtYmVyPyExOnQuY29sdW1uPG4uY29sdW1ufWlzQmVmb3JlT3JFcXVhbCh0KXtyZXR1cm4gaHQuaXNCZWZvcmVPckVxdWFsKHRoaXMsdCl9c3RhdGljIGlzQmVmb3JlT3JFcXVhbCh0LG4pe3JldHVybiB0LmxpbmVOdW1iZXI8bi5saW5lTnVtYmVyPyEwOm4ubGluZU51bWJlcjx0LmxpbmVOdW1iZXI/ITE6dC5jb2x1bW48PW4uY29sdW1ufXN0YXRpYyBjb21wYXJlKHQsbil7Y29uc3Qgcj10LmxpbmVOdW1iZXJ8MCxpPW4ubGluZU51bWJlcnwwO2lmKHI9PT1pKXtjb25zdCBzPXQuY29sdW1ufDAsYT1uLmNvbHVtbnwwO3JldHVybiBzLWF9cmV0dXJuIHItaX1jbG9uZSgpe3JldHVybiBuZXcgaHQodGhpcy5saW5lTnVtYmVyLHRoaXMuY29sdW1uKX10b1N0cmluZygpe3JldHVybiIoIit0aGlzLmxpbmVOdW1iZXIrIiwiK3RoaXMuY29sdW1uKyIpIn1zdGF0aWMgbGlmdCh0KXtyZXR1cm4gbmV3IGh0KHQubGluZU51bWJlcix0LmNvbHVtbil9c3RhdGljIGlzSVBvc2l0aW9uKHQpe3JldHVybiB0JiZ0eXBlb2YgdC5saW5lTnVtYmVyPT0ibnVtYmVyIiYmdHlwZW9mIHQuY29sdW1uPT0ibnVtYmVyIn10b0pTT04oKXtyZXR1cm57bGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uOnRoaXMuY29sdW1ufX19LHo9Y2xhc3MgcmV7Y29uc3RydWN0b3IodCxuLHIsaSl7dD5yfHx0PT09ciYmbj5pPyh0aGlzLnN0YXJ0TGluZU51bWJlcj1yLHRoaXMuc3RhcnRDb2x1bW49aSx0aGlzLmVuZExpbmVOdW1iZXI9dCx0aGlzLmVuZENvbHVtbj1uKToodGhpcy5zdGFydExpbmVOdW1iZXI9dCx0aGlzLnN0YXJ0Q29sdW1uPW4sdGhpcy5lbmRMaW5lTnVtYmVyPXIsdGhpcy5lbmRDb2x1bW49aSl9aXNFbXB0eSgpe3JldHVybiByZS5pc0VtcHR5KHRoaXMpfXN0YXRpYyBpc0VtcHR5KHQpe3JldHVybiB0LnN0YXJ0TGluZU51bWJlcj09PXQuZW5kTGluZU51bWJlciYmdC5zdGFydENvbHVtbj09PXQuZW5kQ29sdW1ufWNvbnRhaW5zUG9zaXRpb24odCl7cmV0dXJuIHJlLmNvbnRhaW5zUG9zaXRpb24odGhpcyx0KX1zdGF0aWMgY29udGFpbnNQb3NpdGlvbih0LG4pe3JldHVybiEobi5saW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxuLmxpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyfHxuLmxpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmbi5jb2x1bW48dC5zdGFydENvbHVtbnx8bi5saW5lTnVtYmVyPT09dC5lbmRMaW5lTnVtYmVyJiZuLmNvbHVtbj50LmVuZENvbHVtbil9c3RhdGljIHN0cmljdENvbnRhaW5zUG9zaXRpb24odCxuKXtyZXR1cm4hKG4ubGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5saW5lTnVtYmVyPnQuZW5kTGluZU51bWJlcnx8bi5saW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXImJm4uY29sdW1uPD10LnN0YXJ0Q29sdW1ufHxuLmxpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXImJm4uY29sdW1uPj10LmVuZENvbHVtbil9Y29udGFpbnNSYW5nZSh0KXtyZXR1cm4gcmUuY29udGFpbnNSYW5nZSh0aGlzLHQpfXN0YXRpYyBjb250YWluc1JhbmdlKHQsbil7cmV0dXJuIShuLnN0YXJ0TGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5lbmRMaW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxuLnN0YXJ0TGluZU51bWJlcj50LmVuZExpbmVOdW1iZXJ8fG4uZW5kTGluZU51bWJlcj50LmVuZExpbmVOdW1iZXJ8fG4uc3RhcnRMaW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXImJm4uc3RhcnRDb2x1bW48dC5zdGFydENvbHVtbnx8bi5lbmRMaW5lTnVtYmVyPT09dC5lbmRMaW5lTnVtYmVyJiZuLmVuZENvbHVtbj50LmVuZENvbHVtbil9c3RyaWN0Q29udGFpbnNSYW5nZSh0KXtyZXR1cm4gcmUuc3RyaWN0Q29udGFpbnNSYW5nZSh0aGlzLHQpfXN0YXRpYyBzdHJpY3RDb250YWluc1JhbmdlKHQsbil7cmV0dXJuIShuLnN0YXJ0TGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5lbmRMaW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxuLnN0YXJ0TGluZU51bWJlcj50LmVuZExpbmVOdW1iZXJ8fG4uZW5kTGluZU51bWJlcj50LmVuZExpbmVOdW1iZXJ8fG4uc3RhcnRMaW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXImJm4uc3RhcnRDb2x1bW48PXQuc3RhcnRDb2x1bW58fG4uZW5kTGluZU51bWJlcj09PXQuZW5kTGluZU51bWJlciYmbi5lbmRDb2x1bW4+PXQuZW5kQ29sdW1uKX1wbHVzUmFuZ2UodCl7cmV0dXJuIHJlLnBsdXNSYW5nZSh0aGlzLHQpfXN0YXRpYyBwbHVzUmFuZ2UodCxuKXtsZXQgcixpLHMsYTtyZXR1cm4gbi5zdGFydExpbmVOdW1iZXI8dC5zdGFydExpbmVOdW1iZXI/KHI9bi5zdGFydExpbmVOdW1iZXIsaT1uLnN0YXJ0Q29sdW1uKTpuLnN0YXJ0TGluZU51bWJlcj09PXQuc3RhcnRMaW5lTnVtYmVyPyhyPW4uc3RhcnRMaW5lTnVtYmVyLGk9TWF0aC5taW4obi5zdGFydENvbHVtbix0LnN0YXJ0Q29sdW1uKSk6KHI9dC5zdGFydExpbmVOdW1iZXIsaT10LnN0YXJ0Q29sdW1uKSxuLmVuZExpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyPyhzPW4uZW5kTGluZU51bWJlcixhPW4uZW5kQ29sdW1uKTpuLmVuZExpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXI/KHM9bi5lbmRMaW5lTnVtYmVyLGE9TWF0aC5tYXgobi5lbmRDb2x1bW4sdC5lbmRDb2x1bW4pKToocz10LmVuZExpbmVOdW1iZXIsYT10LmVuZENvbHVtbiksbmV3IHJlKHIsaSxzLGEpfWludGVyc2VjdFJhbmdlcyh0KXtyZXR1cm4gcmUuaW50ZXJzZWN0UmFuZ2VzKHRoaXMsdCl9c3RhdGljIGludGVyc2VjdFJhbmdlcyh0LG4pe2xldCByPXQuc3RhcnRMaW5lTnVtYmVyLGk9dC5zdGFydENvbHVtbixzPXQuZW5kTGluZU51bWJlcixhPXQuZW5kQ29sdW1uO2NvbnN0IGw9bi5zdGFydExpbmVOdW1iZXIsbz1uLnN0YXJ0Q29sdW1uLHU9bi5lbmRMaW5lTnVtYmVyLGg9bi5lbmRDb2x1bW47cmV0dXJuIHI8bD8ocj1sLGk9byk6cj09PWwmJihpPU1hdGgubWF4KGksbykpLHM+dT8ocz11LGE9aCk6cz09PXUmJihhPU1hdGgubWluKGEsaCkpLHI+c3x8cj09PXMmJmk+YT9udWxsOm5ldyByZShyLGkscyxhKX1lcXVhbHNSYW5nZSh0KXtyZXR1cm4gcmUuZXF1YWxzUmFuZ2UodGhpcyx0KX1zdGF0aWMgZXF1YWxzUmFuZ2UodCxuKXtyZXR1cm4hdCYmIW4/ITA6ISF0JiYhIW4mJnQuc3RhcnRMaW5lTnVtYmVyPT09bi5zdGFydExpbmVOdW1iZXImJnQuc3RhcnRDb2x1bW49PT1uLnN0YXJ0Q29sdW1uJiZ0LmVuZExpbmVOdW1iZXI9PT1uLmVuZExpbmVOdW1iZXImJnQuZW5kQ29sdW1uPT09bi5lbmRDb2x1bW59Z2V0RW5kUG9zaXRpb24oKXtyZXR1cm4gcmUuZ2V0RW5kUG9zaXRpb24odGhpcyl9c3RhdGljIGdldEVuZFBvc2l0aW9uKHQpe3JldHVybiBuZXcgZWUodC5lbmRMaW5lTnVtYmVyLHQuZW5kQ29sdW1uKX1nZXRTdGFydFBvc2l0aW9uKCl7cmV0dXJuIHJlLmdldFN0YXJ0UG9zaXRpb24odGhpcyl9c3RhdGljIGdldFN0YXJ0UG9zaXRpb24odCl7cmV0dXJuIG5ldyBlZSh0LnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0Q29sdW1uKX10b1N0cmluZygpe3JldHVybiJbIit0aGlzLnN0YXJ0TGluZU51bWJlcisiLCIrdGhpcy5zdGFydENvbHVtbisiIC0+ICIrdGhpcy5lbmRMaW5lTnVtYmVyKyIsIit0aGlzLmVuZENvbHVtbisiXSJ9c2V0RW5kUG9zaXRpb24odCxuKXtyZXR1cm4gbmV3IHJlKHRoaXMuc3RhcnRMaW5lTnVtYmVyLHRoaXMuc3RhcnRDb2x1bW4sdCxuKX1zZXRTdGFydFBvc2l0aW9uKHQsbil7cmV0dXJuIG5ldyByZSh0LG4sdGhpcy5lbmRMaW5lTnVtYmVyLHRoaXMuZW5kQ29sdW1uKX1jb2xsYXBzZVRvU3RhcnQoKXtyZXR1cm4gcmUuY29sbGFwc2VUb1N0YXJ0KHRoaXMpfXN0YXRpYyBjb2xsYXBzZVRvU3RhcnQodCl7cmV0dXJuIG5ldyByZSh0LnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0Q29sdW1uLHQuc3RhcnRMaW5lTnVtYmVyLHQuc3RhcnRDb2x1bW4pfWNvbGxhcHNlVG9FbmQoKXtyZXR1cm4gcmUuY29sbGFwc2VUb0VuZCh0aGlzKX1zdGF0aWMgY29sbGFwc2VUb0VuZCh0KXtyZXR1cm4gbmV3IHJlKHQuZW5kTGluZU51bWJlcix0LmVuZENvbHVtbix0LmVuZExpbmVOdW1iZXIsdC5lbmRDb2x1bW4pfWRlbHRhKHQpe3JldHVybiBuZXcgcmUodGhpcy5zdGFydExpbmVOdW1iZXIrdCx0aGlzLnN0YXJ0Q29sdW1uLHRoaXMuZW5kTGluZU51bWJlcit0LHRoaXMuZW5kQ29sdW1uKX1zdGF0aWMgZnJvbVBvc2l0aW9ucyh0LG49dCl7cmV0dXJuIG5ldyByZSh0LmxpbmVOdW1iZXIsdC5jb2x1bW4sbi5saW5lTnVtYmVyLG4uY29sdW1uKX1zdGF0aWMgbGlmdCh0KXtyZXR1cm4gdD9uZXcgcmUodC5zdGFydExpbmVOdW1iZXIsdC5zdGFydENvbHVtbix0LmVuZExpbmVOdW1iZXIsdC5lbmRDb2x1bW4pOm51bGx9c3RhdGljIGlzSVJhbmdlKHQpe3JldHVybiB0JiZ0eXBlb2YgdC5zdGFydExpbmVOdW1iZXI9PSJudW1iZXIiJiZ0eXBlb2YgdC5zdGFydENvbHVtbj09Im51bWJlciImJnR5cGVvZiB0LmVuZExpbmVOdW1iZXI9PSJudW1iZXIiJiZ0eXBlb2YgdC5lbmRDb2x1bW49PSJudW1iZXIifXN0YXRpYyBhcmVJbnRlcnNlY3RpbmdPclRvdWNoaW5nKHQsbil7cmV0dXJuISh0LmVuZExpbmVOdW1iZXI8bi5zdGFydExpbmVOdW1iZXJ8fHQuZW5kTGluZU51bWJlcj09PW4uc3RhcnRMaW5lTnVtYmVyJiZ0LmVuZENvbHVtbjxuLnN0YXJ0Q29sdW1ufHxuLmVuZExpbmVOdW1iZXI8dC5zdGFydExpbmVOdW1iZXJ8fG4uZW5kTGluZU51bWJlcj09PXQuc3RhcnRMaW5lTnVtYmVyJiZuLmVuZENvbHVtbjx0LnN0YXJ0Q29sdW1uKX1zdGF0aWMgYXJlSW50ZXJzZWN0aW5nKHQsbil7cmV0dXJuISh0LmVuZExpbmVOdW1iZXI8bi5zdGFydExpbmVOdW1iZXJ8fHQuZW5kTGluZU51bWJlcj09PW4uc3RhcnRMaW5lTnVtYmVyJiZ0LmVuZENvbHVtbjw9bi5zdGFydENvbHVtbnx8bi5lbmRMaW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxuLmVuZExpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmbi5lbmRDb2x1bW48PXQuc3RhcnRDb2x1bW4pfXN0YXRpYyBjb21wYXJlUmFuZ2VzVXNpbmdTdGFydHModCxuKXtpZih0JiZuKXtjb25zdCBzPXQuc3RhcnRMaW5lTnVtYmVyfDAsYT1uLnN0YXJ0TGluZU51bWJlcnwwO2lmKHM9PT1hKXtjb25zdCBsPXQuc3RhcnRDb2x1bW58MCxvPW4uc3RhcnRDb2x1bW58MDtpZihsPT09byl7Y29uc3QgdT10LmVuZExpbmVOdW1iZXJ8MCxoPW4uZW5kTGluZU51bWJlcnwwO2lmKHU9PT1oKXtjb25zdCBmPXQuZW5kQ29sdW1ufDAsZD1uLmVuZENvbHVtbnwwO3JldHVybiBmLWR9cmV0dXJuIHUtaH1yZXR1cm4gbC1vfXJldHVybiBzLWF9cmV0dXJuKHQ/MTowKS0obj8xOjApfXN0YXRpYyBjb21wYXJlUmFuZ2VzVXNpbmdFbmRzKHQsbil7cmV0dXJuIHQuZW5kTGluZU51bWJlcj09PW4uZW5kTGluZU51bWJlcj90LmVuZENvbHVtbj09PW4uZW5kQ29sdW1uP3Quc3RhcnRMaW5lTnVtYmVyPT09bi5zdGFydExpbmVOdW1iZXI/dC5zdGFydENvbHVtbi1uLnN0YXJ0Q29sdW1uOnQuc3RhcnRMaW5lTnVtYmVyLW4uc3RhcnRMaW5lTnVtYmVyOnQuZW5kQ29sdW1uLW4uZW5kQ29sdW1uOnQuZW5kTGluZU51bWJlci1uLmVuZExpbmVOdW1iZXJ9c3RhdGljIHNwYW5zTXVsdGlwbGVMaW5lcyh0KXtyZXR1cm4gdC5lbmRMaW5lTnVtYmVyPnQuc3RhcnRMaW5lTnVtYmVyfXRvSlNPTigpe3JldHVybiB0aGlzfX07ZnVuY3Rpb24gUmkoZSl7cmV0dXJuIGU8MD8wOmU+MjU1PzI1NTplfDB9ZnVuY3Rpb24geXQoZSl7cmV0dXJuIGU8MD8wOmU+NDI5NDk2NzI5NT80Mjk0OTY3Mjk1OmV8MH1jbGFzcyBscntjb25zdHJ1Y3Rvcih0KXtjb25zdCBuPVJpKHQpO3RoaXMuX2RlZmF1bHRWYWx1ZT1uLHRoaXMuX2FzY2lpTWFwPWxyLl9jcmVhdGVBc2NpaU1hcChuKSx0aGlzLl9tYXA9bmV3IE1hcH1zdGF0aWMgX2NyZWF0ZUFzY2lpTWFwKHQpe2NvbnN0IG49bmV3IFVpbnQ4QXJyYXkoMjU2KTtyZXR1cm4gbi5maWxsKHQpLG59c2V0KHQsbil7Y29uc3Qgcj1SaShuKTt0Pj0wJiZ0PDI1Nj90aGlzLl9hc2NpaU1hcFt0XT1yOnRoaXMuX21hcC5zZXQodCxyKX1nZXQodCl7cmV0dXJuIHQ+PTAmJnQ8MjU2P3RoaXMuX2FzY2lpTWFwW3RdOnRoaXMuX21hcC5nZXQodCl8fHRoaXMuX2RlZmF1bHRWYWx1ZX1jbGVhcigpe3RoaXMuX2FzY2lpTWFwLmZpbGwodGhpcy5fZGVmYXVsdFZhbHVlKSx0aGlzLl9tYXAuY2xlYXIoKX19Y2xhc3MgaXV7Y29uc3RydWN0b3IodCxuLHIpe2NvbnN0IGk9bmV3IFVpbnQ4QXJyYXkodCpuKTtmb3IobGV0IHM9MCxhPXQqbjtzPGE7cysrKWlbc109cjt0aGlzLl9kYXRhPWksdGhpcy5yb3dzPXQsdGhpcy5jb2xzPW59Z2V0KHQsbil7cmV0dXJuIHRoaXMuX2RhdGFbdCp0aGlzLmNvbHMrbl19c2V0KHQsbixyKXt0aGlzLl9kYXRhW3QqdGhpcy5jb2xzK25dPXJ9fWNsYXNzIHN1e2NvbnN0cnVjdG9yKHQpe2xldCBuPTAscj0wO2ZvcihsZXQgcz0wLGE9dC5sZW5ndGg7czxhO3MrKyl7Y29uc3RbbCxvLHVdPXRbc107bz5uJiYobj1vKSxsPnImJihyPWwpLHU+ciYmKHI9dSl9bisrLHIrKztjb25zdCBpPW5ldyBpdShyLG4sMCk7Zm9yKGxldCBzPTAsYT10Lmxlbmd0aDtzPGE7cysrKXtjb25zdFtsLG8sdV09dFtzXTtpLnNldChsLG8sdSl9dGhpcy5fc3RhdGVzPWksdGhpcy5fbWF4Q2hhckNvZGU9bn1uZXh0U3RhdGUodCxuKXtyZXR1cm4gbjwwfHxuPj10aGlzLl9tYXhDaGFyQ29kZT8wOnRoaXMuX3N0YXRlcy5nZXQodCxuKX19bGV0IHVyPW51bGw7ZnVuY3Rpb24gYXUoKXtyZXR1cm4gdXI9PT1udWxsJiYodXI9bmV3IHN1KFtbMSwxMDQsMl0sWzEsNzIsMl0sWzEsMTAyLDZdLFsxLDcwLDZdLFsyLDExNiwzXSxbMiw4NCwzXSxbMywxMTYsNF0sWzMsODQsNF0sWzQsMTEyLDVdLFs0LDgwLDVdLFs1LDExNSw5XSxbNSw4Myw5XSxbNSw1OCwxMF0sWzYsMTA1LDddLFs2LDczLDddLFs3LDEwOCw4XSxbNyw3Niw4XSxbOCwxMDEsOV0sWzgsNjksOV0sWzksNTgsMTBdLFsxMCw0NywxMV0sWzExLDQ3LDEyXV0pKSx1cn1sZXQganQ9bnVsbDtmdW5jdGlvbiBvdSgpe2lmKGp0PT09bnVsbCl7anQ9bmV3IGxyKDApO2NvbnN0IGU9YCAJPD4nIuOAgeOAgu+9oe+9pO+8jO+8ju+8mu+8m+KAmOOAiOOAjOOAjuOAlO+8iO+8u++9m++9ou+9o++9ne+8ve+8ieOAleOAj+OAjeOAieKAme+9gO+9nuKApmA7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspanQuc2V0KGUuY2hhckNvZGVBdChuKSwxKTtjb25zdCB0PSIuLDs6Ijtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylqdC5zZXQodC5jaGFyQ29kZUF0KG4pLDIpfXJldHVybiBqdH1jbGFzcyBtbntzdGF0aWMgX2NyZWF0ZUxpbmsodCxuLHIsaSxzKXtsZXQgYT1zLTE7ZG97Y29uc3QgbD1uLmNoYXJDb2RlQXQoYSk7aWYodC5nZXQobCkhPT0yKWJyZWFrO2EtLX13aGlsZShhPmkpO2lmKGk+MCl7Y29uc3QgbD1uLmNoYXJDb2RlQXQoaS0xKSxvPW4uY2hhckNvZGVBdChhKTsobD09PTQwJiZvPT09NDF8fGw9PT05MSYmbz09PTkzfHxsPT09MTIzJiZvPT09MTI1KSYmYS0tfXJldHVybntyYW5nZTp7c3RhcnRMaW5lTnVtYmVyOnIsc3RhcnRDb2x1bW46aSsxLGVuZExpbmVOdW1iZXI6cixlbmRDb2x1bW46YSsyfSx1cmw6bi5zdWJzdHJpbmcoaSxhKzEpfX1zdGF0aWMgY29tcHV0ZUxpbmtzKHQsbj1hdSgpKXtjb25zdCByPW91KCksaT1bXTtmb3IobGV0IHM9MSxhPXQuZ2V0TGluZUNvdW50KCk7czw9YTtzKyspe2NvbnN0IGw9dC5nZXRMaW5lQ29udGVudChzKSxvPWwubGVuZ3RoO2xldCB1PTAsaD0wLGY9MCxkPTEsbT0hMSxnPSExLHA9ITEseD0hMTtmb3IoO3U8bzspe2xldCB3PSExO2NvbnN0IEw9bC5jaGFyQ29kZUF0KHUpO2lmKGQ9PT0xMyl7bGV0IHY7c3dpdGNoKEwpe2Nhc2UgNDA6bT0hMCx2PTA7YnJlYWs7Y2FzZSA0MTp2PW0/MDoxO2JyZWFrO2Nhc2UgOTE6cD0hMCxnPSEwLHY9MDticmVhaztjYXNlIDkzOnA9ITEsdj1nPzA6MTticmVhaztjYXNlIDEyMzp4PSEwLHY9MDticmVhaztjYXNlIDEyNTp2PXg/MDoxO2JyZWFrO2Nhc2UgMzk6Y2FzZSAzNDpjYXNlIDk2OmY9PT1MP3Y9MTpmPT09Mzl8fGY9PT0zNHx8Zj09PTk2P3Y9MDp2PTE7YnJlYWs7Y2FzZSA0Mjp2PWY9PT00Mj8xOjA7YnJlYWs7Y2FzZSAxMjQ6dj1mPT09MTI0PzE6MDticmVhaztjYXNlIDMyOnY9cD8wOjE7YnJlYWs7ZGVmYXVsdDp2PXIuZ2V0KEwpfXY9PT0xJiYoaS5wdXNoKG1uLl9jcmVhdGVMaW5rKHIsbCxzLGgsdSkpLHc9ITApfWVsc2UgaWYoZD09PTEyKXtsZXQgdjtMPT09OTE/KGc9ITAsdj0wKTp2PXIuZ2V0KEwpLHY9PT0xP3c9ITA6ZD0xM31lbHNlIGQ9bi5uZXh0U3RhdGUoZCxMKSxkPT09MCYmKHc9ITApO3cmJihkPTEsbT0hMSxnPSExLHg9ITEsaD11KzEsZj1MKSx1Kyt9ZD09PTEzJiZpLnB1c2gobW4uX2NyZWF0ZUxpbmsocixsLHMsaCxvKSl9cmV0dXJuIGl9fWZ1bmN0aW9uIGx1KGUpe3JldHVybiFlfHx0eXBlb2YgZS5nZXRMaW5lQ291bnQhPSJmdW5jdGlvbiJ8fHR5cGVvZiBlLmdldExpbmVDb250ZW50IT0iZnVuY3Rpb24iP1tdOm1uLmNvbXB1dGVMaW5rcyhlKX1jb25zdCBPbj1jbGFzcyBPbntjb25zdHJ1Y3Rvcigpe3RoaXMuX2RlZmF1bHRWYWx1ZVNldD1bWyJ0cnVlIiwiZmFsc2UiXSxbIlRydWUiLCJGYWxzZSJdLFsiUHJpdmF0ZSIsIlB1YmxpYyIsIkZyaWVuZCIsIlJlYWRPbmx5IiwiUGFydGlhbCIsIlByb3RlY3RlZCIsIldyaXRlT25seSJdLFsicHVibGljIiwicHJvdGVjdGVkIiwicHJpdmF0ZSJdXX1uYXZpZ2F0ZVZhbHVlU2V0KHQsbixyLGkscyl7aWYodCYmbil7Y29uc3QgYT10aGlzLmRvTmF2aWdhdGVWYWx1ZVNldChuLHMpO2lmKGEpcmV0dXJue3JhbmdlOnQsdmFsdWU6YX19aWYociYmaSl7Y29uc3QgYT10aGlzLmRvTmF2aWdhdGVWYWx1ZVNldChpLHMpO2lmKGEpcmV0dXJue3JhbmdlOnIsdmFsdWU6YX19cmV0dXJuIG51bGx9ZG9OYXZpZ2F0ZVZhbHVlU2V0KHQsbil7Y29uc3Qgcj10aGlzLm51bWJlclJlcGxhY2UodCxuKTtyZXR1cm4gciE9PW51bGw/cjp0aGlzLnRleHRSZXBsYWNlKHQsbil9bnVtYmVyUmVwbGFjZSh0LG4pe2NvbnN0IHI9TWF0aC5wb3coMTAsdC5sZW5ndGgtKHQubGFzdEluZGV4T2YoIi4iKSsxKSk7bGV0IGk9TnVtYmVyKHQpO2NvbnN0IHM9cGFyc2VGbG9hdCh0KTtyZXR1cm4haXNOYU4oaSkmJiFpc05hTihzKSYmaT09PXM/aT09PTAmJiFuP251bGw6KGk9TWF0aC5mbG9vcihpKnIpLGkrPW4/cjotcixTdHJpbmcoaS9yKSk6bnVsbH10ZXh0UmVwbGFjZSh0LG4pe3JldHVybiB0aGlzLnZhbHVlU2V0c1JlcGxhY2UodGhpcy5fZGVmYXVsdFZhbHVlU2V0LHQsbil9dmFsdWVTZXRzUmVwbGFjZSh0LG4scil7bGV0IGk9bnVsbDtmb3IobGV0IHM9MCxhPXQubGVuZ3RoO2k9PT1udWxsJiZzPGE7cysrKWk9dGhpcy52YWx1ZVNldFJlcGxhY2UodFtzXSxuLHIpO3JldHVybiBpfXZhbHVlU2V0UmVwbGFjZSh0LG4scil7bGV0IGk9dC5pbmRleE9mKG4pO3JldHVybiBpPj0wPyhpKz1yPzE6LTEsaTwwP2k9dC5sZW5ndGgtMTppJT10Lmxlbmd0aCx0W2ldKTpudWxsfX07T24uSU5TVEFOQ0U9bmV3IE9uO2xldCBjcj1Pbjtjb25zdCBFaT1PYmplY3QuZnJlZXplKGZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1zZXRUaW1lb3V0KGUuYmluZCh0KSwwKTtyZXR1cm57ZGlzcG9zZSgpe2NsZWFyVGltZW91dChuKX19fSk7dmFyIGduOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3JldHVybiBuPT09ZS5Ob25lfHxuPT09ZS5DYW5jZWxsZWR8fG4gaW5zdGFuY2VvZiBwbj8hMDohbnx8dHlwZW9mIG4hPSJvYmplY3QiPyExOnR5cGVvZiBuLmlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkPT0iYm9vbGVhbiImJnR5cGVvZiBuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkPT0iZnVuY3Rpb24ifWUuaXNDYW5jZWxsYXRpb25Ub2tlbj10LGUuTm9uZT1PYmplY3QuZnJlZXplKHtpc0NhbmNlbGxhdGlvblJlcXVlc3RlZDohMSxvbkNhbmNlbGxhdGlvblJlcXVlc3RlZDp1bi5Ob25lfSksZS5DYW5jZWxsZWQ9T2JqZWN0LmZyZWV6ZSh7aXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6ITAsb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6RWl9KX0pKGdufHwoZ249e30pKTtjbGFzcyBwbntjb25zdHJ1Y3Rvcigpe3RoaXMuX2lzQ2FuY2VsbGVkPSExLHRoaXMuX2VtaXR0ZXI9bnVsbH1jYW5jZWwoKXt0aGlzLl9pc0NhbmNlbGxlZHx8KHRoaXMuX2lzQ2FuY2VsbGVkPSEwLHRoaXMuX2VtaXR0ZXImJih0aGlzLl9lbWl0dGVyLmZpcmUodm9pZCAwKSx0aGlzLmRpc3Bvc2UoKSkpfWdldCBpc0NhbmNlbGxhdGlvblJlcXVlc3RlZCgpe3JldHVybiB0aGlzLl9pc0NhbmNlbGxlZH1nZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKXtyZXR1cm4gdGhpcy5faXNDYW5jZWxsZWQ/RWk6KHRoaXMuX2VtaXR0ZXJ8fCh0aGlzLl9lbWl0dGVyPW5ldyBfZSksdGhpcy5fZW1pdHRlci5ldmVudCl9ZGlzcG9zZSgpe3RoaXMuX2VtaXR0ZXImJih0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKSx0aGlzLl9lbWl0dGVyPW51bGwpfX1jbGFzcyB1dXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl90b2tlbj12b2lkIDAsdGhpcy5fcGFyZW50TGlzdGVuZXI9dm9pZCAwLHRoaXMuX3BhcmVudExpc3RlbmVyPXQmJnQub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQodGhpcy5jYW5jZWwsdGhpcyl9Z2V0IHRva2VuKCl7cmV0dXJuIHRoaXMuX3Rva2VufHwodGhpcy5fdG9rZW49bmV3IHBuKSx0aGlzLl90b2tlbn1jYW5jZWwoKXt0aGlzLl90b2tlbj90aGlzLl90b2tlbiBpbnN0YW5jZW9mIHBuJiZ0aGlzLl90b2tlbi5jYW5jZWwoKTp0aGlzLl90b2tlbj1nbi5DYW5jZWxsZWR9ZGlzcG9zZSh0PSExKXt2YXIgbjt0JiZ0aGlzLmNhbmNlbCgpLChuPXRoaXMuX3BhcmVudExpc3RlbmVyKT09bnVsbHx8bi5kaXNwb3NlKCksdGhpcy5fdG9rZW4/dGhpcy5fdG9rZW4gaW5zdGFuY2VvZiBwbiYmdGhpcy5fdG9rZW4uZGlzcG9zZSgpOnRoaXMuX3Rva2VuPWduLk5vbmV9fWNsYXNzIGZye2NvbnN0cnVjdG9yKCl7dGhpcy5fa2V5Q29kZVRvU3RyPVtdLHRoaXMuX3N0clRvS2V5Q29kZT1PYmplY3QuY3JlYXRlKG51bGwpfWRlZmluZSh0LG4pe3RoaXMuX2tleUNvZGVUb1N0clt0XT1uLHRoaXMuX3N0clRvS2V5Q29kZVtuLnRvTG93ZXJDYXNlKCldPXR9a2V5Q29kZVRvU3RyKHQpe3JldHVybiB0aGlzLl9rZXlDb2RlVG9TdHJbdF19c3RyVG9LZXlDb2RlKHQpe3JldHVybiB0aGlzLl9zdHJUb0tleUNvZGVbdC50b0xvd2VyQ2FzZSgpXXx8MH19Y29uc3QgYm49bmV3IGZyLGhyPW5ldyBmcixkcj1uZXcgZnIsY3U9bmV3IEFycmF5KDIzMCksZnU9T2JqZWN0LmNyZWF0ZShudWxsKSxodT1PYmplY3QuY3JlYXRlKG51bGwpOyhmdW5jdGlvbigpe2NvbnN0IGU9IiIsdD1bWzEsMCwiTm9uZSIsMCwidW5rbm93biIsMCwiVktfVU5LTk9XTiIsZSxlXSxbMSwxLCJIeXBlciIsMCxlLDAsZSxlLGVdLFsxLDIsIlN1cGVyIiwwLGUsMCxlLGUsZV0sWzEsMywiRm4iLDAsZSwwLGUsZSxlXSxbMSw0LCJGbkxvY2siLDAsZSwwLGUsZSxlXSxbMSw1LCJTdXNwZW5kIiwwLGUsMCxlLGUsZV0sWzEsNiwiUmVzdW1lIiwwLGUsMCxlLGUsZV0sWzEsNywiVHVyYm8iLDAsZSwwLGUsZSxlXSxbMSw4LCJTbGVlcCIsMCxlLDAsIlZLX1NMRUVQIixlLGVdLFsxLDksIldha2VVcCIsMCxlLDAsZSxlLGVdLFswLDEwLCJLZXlBIiwzMSwiQSIsNjUsIlZLX0EiLGUsZV0sWzAsMTEsIktleUIiLDMyLCJCIiw2NiwiVktfQiIsZSxlXSxbMCwxMiwiS2V5QyIsMzMsIkMiLDY3LCJWS19DIixlLGVdLFswLDEzLCJLZXlEIiwzNCwiRCIsNjgsIlZLX0QiLGUsZV0sWzAsMTQsIktleUUiLDM1LCJFIiw2OSwiVktfRSIsZSxlXSxbMCwxNSwiS2V5RiIsMzYsIkYiLDcwLCJWS19GIixlLGVdLFswLDE2LCJLZXlHIiwzNywiRyIsNzEsIlZLX0ciLGUsZV0sWzAsMTcsIktleUgiLDM4LCJIIiw3MiwiVktfSCIsZSxlXSxbMCwxOCwiS2V5SSIsMzksIkkiLDczLCJWS19JIixlLGVdLFswLDE5LCJLZXlKIiw0MCwiSiIsNzQsIlZLX0oiLGUsZV0sWzAsMjAsIktleUsiLDQxLCJLIiw3NSwiVktfSyIsZSxlXSxbMCwyMSwiS2V5TCIsNDIsIkwiLDc2LCJWS19MIixlLGVdLFswLDIyLCJLZXlNIiw0MywiTSIsNzcsIlZLX00iLGUsZV0sWzAsMjMsIktleU4iLDQ0LCJOIiw3OCwiVktfTiIsZSxlXSxbMCwyNCwiS2V5TyIsNDUsIk8iLDc5LCJWS19PIixlLGVdLFswLDI1LCJLZXlQIiw0NiwiUCIsODAsIlZLX1AiLGUsZV0sWzAsMjYsIktleVEiLDQ3LCJRIiw4MSwiVktfUSIsZSxlXSxbMCwyNywiS2V5UiIsNDgsIlIiLDgyLCJWS19SIixlLGVdLFswLDI4LCJLZXlTIiw0OSwiUyIsODMsIlZLX1MiLGUsZV0sWzAsMjksIktleVQiLDUwLCJUIiw4NCwiVktfVCIsZSxlXSxbMCwzMCwiS2V5VSIsNTEsIlUiLDg1LCJWS19VIixlLGVdLFswLDMxLCJLZXlWIiw1MiwiViIsODYsIlZLX1YiLGUsZV0sWzAsMzIsIktleVciLDUzLCJXIiw4NywiVktfVyIsZSxlXSxbMCwzMywiS2V5WCIsNTQsIlgiLDg4LCJWS19YIixlLGVdLFswLDM0LCJLZXlZIiw1NSwiWSIsODksIlZLX1kiLGUsZV0sWzAsMzUsIktleVoiLDU2LCJaIiw5MCwiVktfWiIsZSxlXSxbMCwzNiwiRGlnaXQxIiwyMiwiMSIsNDksIlZLXzEiLGUsZV0sWzAsMzcsIkRpZ2l0MiIsMjMsIjIiLDUwLCJWS18yIixlLGVdLFswLDM4LCJEaWdpdDMiLDI0LCIzIiw1MSwiVktfMyIsZSxlXSxbMCwzOSwiRGlnaXQ0IiwyNSwiNCIsNTIsIlZLXzQiLGUsZV0sWzAsNDAsIkRpZ2l0NSIsMjYsIjUiLDUzLCJWS181IixlLGVdLFswLDQxLCJEaWdpdDYiLDI3LCI2Iiw1NCwiVktfNiIsZSxlXSxbMCw0MiwiRGlnaXQ3IiwyOCwiNyIsNTUsIlZLXzciLGUsZV0sWzAsNDMsIkRpZ2l0OCIsMjksIjgiLDU2LCJWS184IixlLGVdLFswLDQ0LCJEaWdpdDkiLDMwLCI5Iiw1NywiVktfOSIsZSxlXSxbMCw0NSwiRGlnaXQwIiwyMSwiMCIsNDgsIlZLXzAiLGUsZV0sWzEsNDYsIkVudGVyIiwzLCJFbnRlciIsMTMsIlZLX1JFVFVSTiIsZSxlXSxbMSw0NywiRXNjYXBlIiw5LCJFc2NhcGUiLDI3LCJWS19FU0NBUEUiLGUsZV0sWzEsNDgsIkJhY2tzcGFjZSIsMSwiQmFja3NwYWNlIiw4LCJWS19CQUNLIixlLGVdLFsxLDQ5LCJUYWIiLDIsIlRhYiIsOSwiVktfVEFCIixlLGVdLFsxLDUwLCJTcGFjZSIsMTAsIlNwYWNlIiwzMiwiVktfU1BBQ0UiLGUsZV0sWzAsNTEsIk1pbnVzIiw4OCwiLSIsMTg5LCJWS19PRU1fTUlOVVMiLCItIiwiT0VNX01JTlVTIl0sWzAsNTIsIkVxdWFsIiw4NiwiPSIsMTg3LCJWS19PRU1fUExVUyIsIj0iLCJPRU1fUExVUyJdLFswLDUzLCJCcmFja2V0TGVmdCIsOTIsIlsiLDIxOSwiVktfT0VNXzQiLCJbIiwiT0VNXzQiXSxbMCw1NCwiQnJhY2tldFJpZ2h0Iiw5NCwiXSIsMjIxLCJWS19PRU1fNiIsIl0iLCJPRU1fNiJdLFswLDU1LCJCYWNrc2xhc2giLDkzLCJcXCIsMjIwLCJWS19PRU1fNSIsIlxcIiwiT0VNXzUiXSxbMCw1NiwiSW50bEhhc2giLDAsZSwwLGUsZSxlXSxbMCw1NywiU2VtaWNvbG9uIiw4NSwiOyIsMTg2LCJWS19PRU1fMSIsIjsiLCJPRU1fMSJdLFswLDU4LCJRdW90ZSIsOTUsIiciLDIyMiwiVktfT0VNXzciLCInIiwiT0VNXzciXSxbMCw1OSwiQmFja3F1b3RlIiw5MSwiYCIsMTkyLCJWS19PRU1fMyIsImAiLCJPRU1fMyJdLFswLDYwLCJDb21tYSIsODcsIiwiLDE4OCwiVktfT0VNX0NPTU1BIiwiLCIsIk9FTV9DT01NQSJdLFswLDYxLCJQZXJpb2QiLDg5LCIuIiwxOTAsIlZLX09FTV9QRVJJT0QiLCIuIiwiT0VNX1BFUklPRCJdLFswLDYyLCJTbGFzaCIsOTAsIi8iLDE5MSwiVktfT0VNXzIiLCIvIiwiT0VNXzIiXSxbMSw2MywiQ2Fwc0xvY2siLDgsIkNhcHNMb2NrIiwyMCwiVktfQ0FQSVRBTCIsZSxlXSxbMSw2NCwiRjEiLDU5LCJGMSIsMTEyLCJWS19GMSIsZSxlXSxbMSw2NSwiRjIiLDYwLCJGMiIsMTEzLCJWS19GMiIsZSxlXSxbMSw2NiwiRjMiLDYxLCJGMyIsMTE0LCJWS19GMyIsZSxlXSxbMSw2NywiRjQiLDYyLCJGNCIsMTE1LCJWS19GNCIsZSxlXSxbMSw2OCwiRjUiLDYzLCJGNSIsMTE2LCJWS19GNSIsZSxlXSxbMSw2OSwiRjYiLDY0LCJGNiIsMTE3LCJWS19GNiIsZSxlXSxbMSw3MCwiRjciLDY1LCJGNyIsMTE4LCJWS19GNyIsZSxlXSxbMSw3MSwiRjgiLDY2LCJGOCIsMTE5LCJWS19GOCIsZSxlXSxbMSw3MiwiRjkiLDY3LCJGOSIsMTIwLCJWS19GOSIsZSxlXSxbMSw3MywiRjEwIiw2OCwiRjEwIiwxMjEsIlZLX0YxMCIsZSxlXSxbMSw3NCwiRjExIiw2OSwiRjExIiwxMjIsIlZLX0YxMSIsZSxlXSxbMSw3NSwiRjEyIiw3MCwiRjEyIiwxMjMsIlZLX0YxMiIsZSxlXSxbMSw3NiwiUHJpbnRTY3JlZW4iLDAsZSwwLGUsZSxlXSxbMSw3NywiU2Nyb2xsTG9jayIsODQsIlNjcm9sbExvY2siLDE0NSwiVktfU0NST0xMIixlLGVdLFsxLDc4LCJQYXVzZSIsNywiUGF1c2VCcmVhayIsMTksIlZLX1BBVVNFIixlLGVdLFsxLDc5LCJJbnNlcnQiLDE5LCJJbnNlcnQiLDQ1LCJWS19JTlNFUlQiLGUsZV0sWzEsODAsIkhvbWUiLDE0LCJIb21lIiwzNiwiVktfSE9NRSIsZSxlXSxbMSw4MSwiUGFnZVVwIiwxMSwiUGFnZVVwIiwzMywiVktfUFJJT1IiLGUsZV0sWzEsODIsIkRlbGV0ZSIsMjAsIkRlbGV0ZSIsNDYsIlZLX0RFTEVURSIsZSxlXSxbMSw4MywiRW5kIiwxMywiRW5kIiwzNSwiVktfRU5EIixlLGVdLFsxLDg0LCJQYWdlRG93biIsMTIsIlBhZ2VEb3duIiwzNCwiVktfTkVYVCIsZSxlXSxbMSw4NSwiQXJyb3dSaWdodCIsMTcsIlJpZ2h0QXJyb3ciLDM5LCJWS19SSUdIVCIsIlJpZ2h0IixlXSxbMSw4NiwiQXJyb3dMZWZ0IiwxNSwiTGVmdEFycm93IiwzNywiVktfTEVGVCIsIkxlZnQiLGVdLFsxLDg3LCJBcnJvd0Rvd24iLDE4LCJEb3duQXJyb3ciLDQwLCJWS19ET1dOIiwiRG93biIsZV0sWzEsODgsIkFycm93VXAiLDE2LCJVcEFycm93IiwzOCwiVktfVVAiLCJVcCIsZV0sWzEsODksIk51bUxvY2siLDgzLCJOdW1Mb2NrIiwxNDQsIlZLX05VTUxPQ0siLGUsZV0sWzEsOTAsIk51bXBhZERpdmlkZSIsMTEzLCJOdW1QYWRfRGl2aWRlIiwxMTEsIlZLX0RJVklERSIsZSxlXSxbMSw5MSwiTnVtcGFkTXVsdGlwbHkiLDEwOCwiTnVtUGFkX011bHRpcGx5IiwxMDYsIlZLX01VTFRJUExZIixlLGVdLFsxLDkyLCJOdW1wYWRTdWJ0cmFjdCIsMTExLCJOdW1QYWRfU3VidHJhY3QiLDEwOSwiVktfU1VCVFJBQ1QiLGUsZV0sWzEsOTMsIk51bXBhZEFkZCIsMTA5LCJOdW1QYWRfQWRkIiwxMDcsIlZLX0FERCIsZSxlXSxbMSw5NCwiTnVtcGFkRW50ZXIiLDMsZSwwLGUsZSxlXSxbMSw5NSwiTnVtcGFkMSIsOTksIk51bVBhZDEiLDk3LCJWS19OVU1QQUQxIixlLGVdLFsxLDk2LCJOdW1wYWQyIiwxMDAsIk51bVBhZDIiLDk4LCJWS19OVU1QQUQyIixlLGVdLFsxLDk3LCJOdW1wYWQzIiwxMDEsIk51bVBhZDMiLDk5LCJWS19OVU1QQUQzIixlLGVdLFsxLDk4LCJOdW1wYWQ0IiwxMDIsIk51bVBhZDQiLDEwMCwiVktfTlVNUEFENCIsZSxlXSxbMSw5OSwiTnVtcGFkNSIsMTAzLCJOdW1QYWQ1IiwxMDEsIlZLX05VTVBBRDUiLGUsZV0sWzEsMTAwLCJOdW1wYWQ2IiwxMDQsIk51bVBhZDYiLDEwMiwiVktfTlVNUEFENiIsZSxlXSxbMSwxMDEsIk51bXBhZDciLDEwNSwiTnVtUGFkNyIsMTAzLCJWS19OVU1QQUQ3IixlLGVdLFsxLDEwMiwiTnVtcGFkOCIsMTA2LCJOdW1QYWQ4IiwxMDQsIlZLX05VTVBBRDgiLGUsZV0sWzEsMTAzLCJOdW1wYWQ5IiwxMDcsIk51bVBhZDkiLDEwNSwiVktfTlVNUEFEOSIsZSxlXSxbMSwxMDQsIk51bXBhZDAiLDk4LCJOdW1QYWQwIiw5NiwiVktfTlVNUEFEMCIsZSxlXSxbMSwxMDUsIk51bXBhZERlY2ltYWwiLDExMiwiTnVtUGFkX0RlY2ltYWwiLDExMCwiVktfREVDSU1BTCIsZSxlXSxbMCwxMDYsIkludGxCYWNrc2xhc2giLDk3LCJPRU1fMTAyIiwyMjYsIlZLX09FTV8xMDIiLGUsZV0sWzEsMTA3LCJDb250ZXh0TWVudSIsNTgsIkNvbnRleHRNZW51Iiw5MyxlLGUsZV0sWzEsMTA4LCJQb3dlciIsMCxlLDAsZSxlLGVdLFsxLDEwOSwiTnVtcGFkRXF1YWwiLDAsZSwwLGUsZSxlXSxbMSwxMTAsIkYxMyIsNzEsIkYxMyIsMTI0LCJWS19GMTMiLGUsZV0sWzEsMTExLCJGMTQiLDcyLCJGMTQiLDEyNSwiVktfRjE0IixlLGVdLFsxLDExMiwiRjE1Iiw3MywiRjE1IiwxMjYsIlZLX0YxNSIsZSxlXSxbMSwxMTMsIkYxNiIsNzQsIkYxNiIsMTI3LCJWS19GMTYiLGUsZV0sWzEsMTE0LCJGMTciLDc1LCJGMTciLDEyOCwiVktfRjE3IixlLGVdLFsxLDExNSwiRjE4Iiw3NiwiRjE4IiwxMjksIlZLX0YxOCIsZSxlXSxbMSwxMTYsIkYxOSIsNzcsIkYxOSIsMTMwLCJWS19GMTkiLGUsZV0sWzEsMTE3LCJGMjAiLDc4LCJGMjAiLDEzMSwiVktfRjIwIixlLGVdLFsxLDExOCwiRjIxIiw3OSwiRjIxIiwxMzIsIlZLX0YyMSIsZSxlXSxbMSwxMTksIkYyMiIsODAsIkYyMiIsMTMzLCJWS19GMjIiLGUsZV0sWzEsMTIwLCJGMjMiLDgxLCJGMjMiLDEzNCwiVktfRjIzIixlLGVdLFsxLDEyMSwiRjI0Iiw4MiwiRjI0IiwxMzUsIlZLX0YyNCIsZSxlXSxbMSwxMjIsIk9wZW4iLDAsZSwwLGUsZSxlXSxbMSwxMjMsIkhlbHAiLDAsZSwwLGUsZSxlXSxbMSwxMjQsIlNlbGVjdCIsMCxlLDAsZSxlLGVdLFsxLDEyNSwiQWdhaW4iLDAsZSwwLGUsZSxlXSxbMSwxMjYsIlVuZG8iLDAsZSwwLGUsZSxlXSxbMSwxMjcsIkN1dCIsMCxlLDAsZSxlLGVdLFsxLDEyOCwiQ29weSIsMCxlLDAsZSxlLGVdLFsxLDEyOSwiUGFzdGUiLDAsZSwwLGUsZSxlXSxbMSwxMzAsIkZpbmQiLDAsZSwwLGUsZSxlXSxbMSwxMzEsIkF1ZGlvVm9sdW1lTXV0ZSIsMTE3LCJBdWRpb1ZvbHVtZU11dGUiLDE3MywiVktfVk9MVU1FX01VVEUiLGUsZV0sWzEsMTMyLCJBdWRpb1ZvbHVtZVVwIiwxMTgsIkF1ZGlvVm9sdW1lVXAiLDE3NSwiVktfVk9MVU1FX1VQIixlLGVdLFsxLDEzMywiQXVkaW9Wb2x1bWVEb3duIiwxMTksIkF1ZGlvVm9sdW1lRG93biIsMTc0LCJWS19WT0xVTUVfRE9XTiIsZSxlXSxbMSwxMzQsIk51bXBhZENvbW1hIiwxMTAsIk51bVBhZF9TZXBhcmF0b3IiLDEwOCwiVktfU0VQQVJBVE9SIixlLGVdLFswLDEzNSwiSW50bFJvIiwxMTUsIkFCTlRfQzEiLDE5MywiVktfQUJOVF9DMSIsZSxlXSxbMSwxMzYsIkthbmFNb2RlIiwwLGUsMCxlLGUsZV0sWzAsMTM3LCJJbnRsWWVuIiwwLGUsMCxlLGUsZV0sWzEsMTM4LCJDb252ZXJ0IiwwLGUsMCxlLGUsZV0sWzEsMTM5LCJOb25Db252ZXJ0IiwwLGUsMCxlLGUsZV0sWzEsMTQwLCJMYW5nMSIsMCxlLDAsZSxlLGVdLFsxLDE0MSwiTGFuZzIiLDAsZSwwLGUsZSxlXSxbMSwxNDIsIkxhbmczIiwwLGUsMCxlLGUsZV0sWzEsMTQzLCJMYW5nNCIsMCxlLDAsZSxlLGVdLFsxLDE0NCwiTGFuZzUiLDAsZSwwLGUsZSxlXSxbMSwxNDUsIkFib3J0IiwwLGUsMCxlLGUsZV0sWzEsMTQ2LCJQcm9wcyIsMCxlLDAsZSxlLGVdLFsxLDE0NywiTnVtcGFkUGFyZW5MZWZ0IiwwLGUsMCxlLGUsZV0sWzEsMTQ4LCJOdW1wYWRQYXJlblJpZ2h0IiwwLGUsMCxlLGUsZV0sWzEsMTQ5LCJOdW1wYWRCYWNrc3BhY2UiLDAsZSwwLGUsZSxlXSxbMSwxNTAsIk51bXBhZE1lbW9yeVN0b3JlIiwwLGUsMCxlLGUsZV0sWzEsMTUxLCJOdW1wYWRNZW1vcnlSZWNhbGwiLDAsZSwwLGUsZSxlXSxbMSwxNTIsIk51bXBhZE1lbW9yeUNsZWFyIiwwLGUsMCxlLGUsZV0sWzEsMTUzLCJOdW1wYWRNZW1vcnlBZGQiLDAsZSwwLGUsZSxlXSxbMSwxNTQsIk51bXBhZE1lbW9yeVN1YnRyYWN0IiwwLGUsMCxlLGUsZV0sWzEsMTU1LCJOdW1wYWRDbGVhciIsMTMxLCJDbGVhciIsMTIsIlZLX0NMRUFSIixlLGVdLFsxLDE1NiwiTnVtcGFkQ2xlYXJFbnRyeSIsMCxlLDAsZSxlLGVdLFsxLDAsZSw1LCJDdHJsIiwxNywiVktfQ09OVFJPTCIsZSxlXSxbMSwwLGUsNCwiU2hpZnQiLDE2LCJWS19TSElGVCIsZSxlXSxbMSwwLGUsNiwiQWx0IiwxOCwiVktfTUVOVSIsZSxlXSxbMSwwLGUsNTcsIk1ldGEiLDkxLCJWS19DT01NQU5EIixlLGVdLFsxLDE1NywiQ29udHJvbExlZnQiLDUsZSwwLCJWS19MQ09OVFJPTCIsZSxlXSxbMSwxNTgsIlNoaWZ0TGVmdCIsNCxlLDAsIlZLX0xTSElGVCIsZSxlXSxbMSwxNTksIkFsdExlZnQiLDYsZSwwLCJWS19MTUVOVSIsZSxlXSxbMSwxNjAsIk1ldGFMZWZ0Iiw1NyxlLDAsIlZLX0xXSU4iLGUsZV0sWzEsMTYxLCJDb250cm9sUmlnaHQiLDUsZSwwLCJWS19SQ09OVFJPTCIsZSxlXSxbMSwxNjIsIlNoaWZ0UmlnaHQiLDQsZSwwLCJWS19SU0hJRlQiLGUsZV0sWzEsMTYzLCJBbHRSaWdodCIsNixlLDAsIlZLX1JNRU5VIixlLGVdLFsxLDE2NCwiTWV0YVJpZ2h0Iiw1NyxlLDAsIlZLX1JXSU4iLGUsZV0sWzEsMTY1LCJCcmlnaHRuZXNzVXAiLDAsZSwwLGUsZSxlXSxbMSwxNjYsIkJyaWdodG5lc3NEb3duIiwwLGUsMCxlLGUsZV0sWzEsMTY3LCJNZWRpYVBsYXkiLDAsZSwwLGUsZSxlXSxbMSwxNjgsIk1lZGlhUmVjb3JkIiwwLGUsMCxlLGUsZV0sWzEsMTY5LCJNZWRpYUZhc3RGb3J3YXJkIiwwLGUsMCxlLGUsZV0sWzEsMTcwLCJNZWRpYVJld2luZCIsMCxlLDAsZSxlLGVdLFsxLDE3MSwiTWVkaWFUcmFja05leHQiLDEyNCwiTWVkaWFUcmFja05leHQiLDE3NiwiVktfTUVESUFfTkVYVF9UUkFDSyIsZSxlXSxbMSwxNzIsIk1lZGlhVHJhY2tQcmV2aW91cyIsMTI1LCJNZWRpYVRyYWNrUHJldmlvdXMiLDE3NywiVktfTUVESUFfUFJFVl9UUkFDSyIsZSxlXSxbMSwxNzMsIk1lZGlhU3RvcCIsMTI2LCJNZWRpYVN0b3AiLDE3OCwiVktfTUVESUFfU1RPUCIsZSxlXSxbMSwxNzQsIkVqZWN0IiwwLGUsMCxlLGUsZV0sWzEsMTc1LCJNZWRpYVBsYXlQYXVzZSIsMTI3LCJNZWRpYVBsYXlQYXVzZSIsMTc5LCJWS19NRURJQV9QTEFZX1BBVVNFIixlLGVdLFsxLDE3NiwiTWVkaWFTZWxlY3QiLDEyOCwiTGF1bmNoTWVkaWFQbGF5ZXIiLDE4MSwiVktfTUVESUFfTEFVTkNIX01FRElBX1NFTEVDVCIsZSxlXSxbMSwxNzcsIkxhdW5jaE1haWwiLDEyOSwiTGF1bmNoTWFpbCIsMTgwLCJWS19NRURJQV9MQVVOQ0hfTUFJTCIsZSxlXSxbMSwxNzgsIkxhdW5jaEFwcDIiLDEzMCwiTGF1bmNoQXBwMiIsMTgzLCJWS19NRURJQV9MQVVOQ0hfQVBQMiIsZSxlXSxbMSwxNzksIkxhdW5jaEFwcDEiLDAsZSwwLCJWS19NRURJQV9MQVVOQ0hfQVBQMSIsZSxlXSxbMSwxODAsIlNlbGVjdFRhc2siLDAsZSwwLGUsZSxlXSxbMSwxODEsIkxhdW5jaFNjcmVlblNhdmVyIiwwLGUsMCxlLGUsZV0sWzEsMTgyLCJCcm93c2VyU2VhcmNoIiwxMjAsIkJyb3dzZXJTZWFyY2giLDE3MCwiVktfQlJPV1NFUl9TRUFSQ0giLGUsZV0sWzEsMTgzLCJCcm93c2VySG9tZSIsMTIxLCJCcm93c2VySG9tZSIsMTcyLCJWS19CUk9XU0VSX0hPTUUiLGUsZV0sWzEsMTg0LCJCcm93c2VyQmFjayIsMTIyLCJCcm93c2VyQmFjayIsMTY2LCJWS19CUk9XU0VSX0JBQ0siLGUsZV0sWzEsMTg1LCJCcm93c2VyRm9yd2FyZCIsMTIzLCJCcm93c2VyRm9yd2FyZCIsMTY3LCJWS19CUk9XU0VSX0ZPUldBUkQiLGUsZV0sWzEsMTg2LCJCcm93c2VyU3RvcCIsMCxlLDAsIlZLX0JST1dTRVJfU1RPUCIsZSxlXSxbMSwxODcsIkJyb3dzZXJSZWZyZXNoIiwwLGUsMCwiVktfQlJPV1NFUl9SRUZSRVNIIixlLGVdLFsxLDE4OCwiQnJvd3NlckZhdm9yaXRlcyIsMCxlLDAsIlZLX0JST1dTRVJfRkFWT1JJVEVTIixlLGVdLFsxLDE4OSwiWm9vbVRvZ2dsZSIsMCxlLDAsZSxlLGVdLFsxLDE5MCwiTWFpbFJlcGx5IiwwLGUsMCxlLGUsZV0sWzEsMTkxLCJNYWlsRm9yd2FyZCIsMCxlLDAsZSxlLGVdLFsxLDE5MiwiTWFpbFNlbmQiLDAsZSwwLGUsZSxlXSxbMSwwLGUsMTE0LCJLZXlJbkNvbXBvc2l0aW9uIiwyMjksZSxlLGVdLFsxLDAsZSwxMTYsIkFCTlRfQzIiLDE5NCwiVktfQUJOVF9DMiIsZSxlXSxbMSwwLGUsOTYsIk9FTV84IiwyMjMsIlZLX09FTV84IixlLGVdLFsxLDAsZSwwLGUsMCwiVktfS0FOQSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0hBTkdVTCIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0pVTkpBIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfRklOQUwiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19IQU5KQSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0tBTkpJIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfQ09OVkVSVCIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX05PTkNPTlZFUlQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19BQ0NFUFQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19NT0RFQ0hBTkdFIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfU0VMRUNUIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfUFJJTlQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19FWEVDVVRFIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfU05BUFNIT1QiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19IRUxQIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfQVBQUyIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX1BST0NFU1NLRVkiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19QQUNLRVQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19EQkVfU0JDU0NIQVIiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19EQkVfREJDU0NIQVIiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19BVFROIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfQ1JTRUwiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19FWFNFTCIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0VSRU9GIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfUExBWSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX1pPT00iLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19OT05BTUUiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19QQTEiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19PRU1fQ0xFQVIiLGUsZV1dLG49W10scj1bXTtmb3IoY29uc3QgaSBvZiB0KXtjb25zdFtzLGEsbCxvLHUsaCxmLGQsbV09aTtpZihyW2FdfHwoclthXT0hMCxmdVtsXT1hLGh1W2wudG9Mb3dlckNhc2UoKV09YSksIW5bb10pe2lmKG5bb109ITAsIXUpdGhyb3cgbmV3IEVycm9yKGBTdHJpbmcgcmVwcmVzZW50YXRpb24gbWlzc2luZyBmb3Iga2V5IGNvZGUgJHtvfSBhcm91bmQgc2NhbiBjb2RlICR7bH1gKTtibi5kZWZpbmUobyx1KSxoci5kZWZpbmUobyxkfHx1KSxkci5kZWZpbmUobyxtfHxkfHx1KX1oJiYoY3VbaF09byl9fSkoKTt2YXIgTWk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobCl7cmV0dXJuIGJuLmtleUNvZGVUb1N0cihsKX1lLnRvU3RyaW5nPXQ7ZnVuY3Rpb24gbihsKXtyZXR1cm4gYm4uc3RyVG9LZXlDb2RlKGwpfWUuZnJvbVN0cmluZz1uO2Z1bmN0aW9uIHIobCl7cmV0dXJuIGhyLmtleUNvZGVUb1N0cihsKX1lLnRvVXNlclNldHRpbmdzVVM9cjtmdW5jdGlvbiBpKGwpe3JldHVybiBkci5rZXlDb2RlVG9TdHIobCl9ZS50b1VzZXJTZXR0aW5nc0dlbmVyYWw9aTtmdW5jdGlvbiBzKGwpe3JldHVybiBoci5zdHJUb0tleUNvZGUobCl8fGRyLnN0clRvS2V5Q29kZShsKX1lLmZyb21Vc2VyU2V0dGluZ3M9cztmdW5jdGlvbiBhKGwpe2lmKGw+PTk4JiZsPD0xMTMpcmV0dXJuIG51bGw7c3dpdGNoKGwpe2Nhc2UgMTY6cmV0dXJuIlVwIjtjYXNlIDE4OnJldHVybiJEb3duIjtjYXNlIDE1OnJldHVybiJMZWZ0IjtjYXNlIDE3OnJldHVybiJSaWdodCJ9cmV0dXJuIGJuLmtleUNvZGVUb1N0cihsKX1lLnRvRWxlY3Ryb25BY2NlbGVyYXRvcj1hfSkoTWl8fChNaT17fSkpO2Z1bmN0aW9uIGR1KGUsdCl7Y29uc3Qgbj0odCY2NTUzNSk8PDE2Pj4+MDtyZXR1cm4oZXxuKT4+PjB9Y2xhc3MgdmUgZXh0ZW5kcyB6e2NvbnN0cnVjdG9yKHQsbixyLGkpe3N1cGVyKHQsbixyLGkpLHRoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyPXQsdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbj1uLHRoaXMucG9zaXRpb25MaW5lTnVtYmVyPXIsdGhpcy5wb3NpdGlvbkNvbHVtbj1pfXRvU3RyaW5nKCl7cmV0dXJuIlsiK3RoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyKyIsIit0aGlzLnNlbGVjdGlvblN0YXJ0Q29sdW1uKyIgLT4gIit0aGlzLnBvc2l0aW9uTGluZU51bWJlcisiLCIrdGhpcy5wb3NpdGlvbkNvbHVtbisiXSJ9ZXF1YWxzU2VsZWN0aW9uKHQpe3JldHVybiB2ZS5zZWxlY3Rpb25zRXF1YWwodGhpcyx0KX1zdGF0aWMgc2VsZWN0aW9uc0VxdWFsKHQsbil7cmV0dXJuIHQuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyPT09bi5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXImJnQuc2VsZWN0aW9uU3RhcnRDb2x1bW49PT1uLnNlbGVjdGlvblN0YXJ0Q29sdW1uJiZ0LnBvc2l0aW9uTGluZU51bWJlcj09PW4ucG9zaXRpb25MaW5lTnVtYmVyJiZ0LnBvc2l0aW9uQ29sdW1uPT09bi5wb3NpdGlvbkNvbHVtbn1nZXREaXJlY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXI9PT10aGlzLnN0YXJ0TGluZU51bWJlciYmdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbj09PXRoaXMuc3RhcnRDb2x1bW4/MDoxfXNldEVuZFBvc2l0aW9uKHQsbil7cmV0dXJuIHRoaXMuZ2V0RGlyZWN0aW9uKCk9PT0wP25ldyB2ZSh0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLnN0YXJ0Q29sdW1uLHQsbik6bmV3IHZlKHQsbix0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLnN0YXJ0Q29sdW1uKX1nZXRQb3NpdGlvbigpe3JldHVybiBuZXcgZWUodGhpcy5wb3NpdGlvbkxpbmVOdW1iZXIsdGhpcy5wb3NpdGlvbkNvbHVtbil9Z2V0U2VsZWN0aW9uU3RhcnQoKXtyZXR1cm4gbmV3IGVlKHRoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyLHRoaXMuc2VsZWN0aW9uU3RhcnRDb2x1bW4pfXNldFN0YXJ0UG9zaXRpb24odCxuKXtyZXR1cm4gdGhpcy5nZXREaXJlY3Rpb24oKT09PTA/bmV3IHZlKHQsbix0aGlzLmVuZExpbmVOdW1iZXIsdGhpcy5lbmRDb2x1bW4pOm5ldyB2ZSh0aGlzLmVuZExpbmVOdW1iZXIsdGhpcy5lbmRDb2x1bW4sdCxuKX1zdGF0aWMgZnJvbVBvc2l0aW9ucyh0LG49dCl7cmV0dXJuIG5ldyB2ZSh0LmxpbmVOdW1iZXIsdC5jb2x1bW4sbi5saW5lTnVtYmVyLG4uY29sdW1uKX1zdGF0aWMgZnJvbVJhbmdlKHQsbil7cmV0dXJuIG49PT0wP25ldyB2ZSh0LnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0Q29sdW1uLHQuZW5kTGluZU51bWJlcix0LmVuZENvbHVtbik6bmV3IHZlKHQuZW5kTGluZU51bWJlcix0LmVuZENvbHVtbix0LnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0Q29sdW1uKX1zdGF0aWMgbGlmdFNlbGVjdGlvbih0KXtyZXR1cm4gbmV3IHZlKHQuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyLHQuc2VsZWN0aW9uU3RhcnRDb2x1bW4sdC5wb3NpdGlvbkxpbmVOdW1iZXIsdC5wb3NpdGlvbkNvbHVtbil9c3RhdGljIHNlbGVjdGlvbnNBcnJFcXVhbCh0LG4pe2lmKHQmJiFufHwhdCYmbilyZXR1cm4hMTtpZighdCYmIW4pcmV0dXJuITA7aWYodC5sZW5ndGghPT1uLmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspaWYoIXRoaXMuc2VsZWN0aW9uc0VxdWFsKHRbcl0sbltyXSkpcmV0dXJuITE7cmV0dXJuITB9c3RhdGljIGlzSVNlbGVjdGlvbih0KXtyZXR1cm4gdCYmdHlwZW9mIHQuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyPT0ibnVtYmVyIiYmdHlwZW9mIHQuc2VsZWN0aW9uU3RhcnRDb2x1bW49PSJudW1iZXIiJiZ0eXBlb2YgdC5wb3NpdGlvbkxpbmVOdW1iZXI9PSJudW1iZXIiJiZ0eXBlb2YgdC5wb3NpdGlvbkNvbHVtbj09Im51bWJlciJ9c3RhdGljIGNyZWF0ZVdpdGhEaXJlY3Rpb24odCxuLHIsaSxzKXtyZXR1cm4gcz09PTA/bmV3IHZlKHQsbixyLGkpOm5ldyB2ZShyLGksdCxuKX19ZnVuY3Rpb24gbXUoZSl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIn1jb25zdCBDaT1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIGMoZSx0KXtpZihtdSh0KSl7Y29uc3Qgbj1DaVt0XTtpZihuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgJHtlfSByZWZlcmVuY2VzIGFuIHVua25vd24gY29kaWNvbjogJHt0fWApO3Q9bn1yZXR1cm4gQ2lbZV09dCx7aWQ6ZX19Y29uc3QgZ3U9e2FkZDpjKCJhZGQiLDZlNCkscGx1czpjKCJwbHVzIiw2ZTQpLGdpc3ROZXc6YygiZ2lzdC1uZXciLDZlNCkscmVwb0NyZWF0ZTpjKCJyZXBvLWNyZWF0ZSIsNmU0KSxsaWdodGJ1bGI6YygibGlnaHRidWxiIiw2MDAwMSksbGlnaHRCdWxiOmMoImxpZ2h0LWJ1bGIiLDYwMDAxKSxyZXBvOmMoInJlcG8iLDYwMDAyKSxyZXBvRGVsZXRlOmMoInJlcG8tZGVsZXRlIiw2MDAwMiksZ2lzdEZvcms6YygiZ2lzdC1mb3JrIiw2MDAwMykscmVwb0ZvcmtlZDpjKCJyZXBvLWZvcmtlZCIsNjAwMDMpLGdpdFB1bGxSZXF1ZXN0OmMoImdpdC1wdWxsLXJlcXVlc3QiLDYwMDA0KSxnaXRQdWxsUmVxdWVzdEFiYW5kb25lZDpjKCJnaXQtcHVsbC1yZXF1ZXN0LWFiYW5kb25lZCIsNjAwMDQpLHJlY29yZEtleXM6YygicmVjb3JkLWtleXMiLDYwMDA1KSxrZXlib2FyZDpjKCJrZXlib2FyZCIsNjAwMDUpLHRhZzpjKCJ0YWciLDYwMDA2KSxnaXRQdWxsUmVxdWVzdExhYmVsOmMoImdpdC1wdWxsLXJlcXVlc3QtbGFiZWwiLDYwMDA2KSx0YWdBZGQ6YygidGFnLWFkZCIsNjAwMDYpLHRhZ1JlbW92ZTpjKCJ0YWctcmVtb3ZlIiw2MDAwNikscGVyc29uOmMoInBlcnNvbiIsNjAwMDcpLHBlcnNvbkZvbGxvdzpjKCJwZXJzb24tZm9sbG93Iiw2MDAwNykscGVyc29uT3V0bGluZTpjKCJwZXJzb24tb3V0bGluZSIsNjAwMDcpLHBlcnNvbkZpbGxlZDpjKCJwZXJzb24tZmlsbGVkIiw2MDAwNyksZ2l0QnJhbmNoOmMoImdpdC1icmFuY2giLDYwMDA4KSxnaXRCcmFuY2hDcmVhdGU6YygiZ2l0LWJyYW5jaC1jcmVhdGUiLDYwMDA4KSxnaXRCcmFuY2hEZWxldGU6YygiZ2l0LWJyYW5jaC1kZWxldGUiLDYwMDA4KSxzb3VyY2VDb250cm9sOmMoInNvdXJjZS1jb250cm9sIiw2MDAwOCksbWlycm9yOmMoIm1pcnJvciIsNjAwMDkpLG1pcnJvclB1YmxpYzpjKCJtaXJyb3ItcHVibGljIiw2MDAwOSksc3RhcjpjKCJzdGFyIiw2MDAxMCksc3RhckFkZDpjKCJzdGFyLWFkZCIsNjAwMTApLHN0YXJEZWxldGU6Yygic3Rhci1kZWxldGUiLDYwMDEwKSxzdGFyRW1wdHk6Yygic3Rhci1lbXB0eSIsNjAwMTApLGNvbW1lbnQ6YygiY29tbWVudCIsNjAwMTEpLGNvbW1lbnRBZGQ6YygiY29tbWVudC1hZGQiLDYwMDExKSxhbGVydDpjKCJhbGVydCIsNjAwMTIpLHdhcm5pbmc6Yygid2FybmluZyIsNjAwMTIpLHNlYXJjaDpjKCJzZWFyY2giLDYwMDEzKSxzZWFyY2hTYXZlOmMoInNlYXJjaC1zYXZlIiw2MDAxMyksbG9nT3V0OmMoImxvZy1vdXQiLDYwMDE0KSxzaWduT3V0OmMoInNpZ24tb3V0Iiw2MDAxNCksbG9nSW46YygibG9nLWluIiw2MDAxNSksc2lnbkluOmMoInNpZ24taW4iLDYwMDE1KSxleWU6YygiZXllIiw2MDAxNiksZXllVW53YXRjaDpjKCJleWUtdW53YXRjaCIsNjAwMTYpLGV5ZVdhdGNoOmMoImV5ZS13YXRjaCIsNjAwMTYpLGNpcmNsZUZpbGxlZDpjKCJjaXJjbGUtZmlsbGVkIiw2MDAxNykscHJpbWl0aXZlRG90OmMoInByaW1pdGl2ZS1kb3QiLDYwMDE3KSxjbG9zZURpcnR5OmMoImNsb3NlLWRpcnR5Iiw2MDAxNyksZGVidWdCcmVha3BvaW50OmMoImRlYnVnLWJyZWFrcG9pbnQiLDYwMDE3KSxkZWJ1Z0JyZWFrcG9pbnREaXNhYmxlZDpjKCJkZWJ1Zy1icmVha3BvaW50LWRpc2FibGVkIiw2MDAxNyksZGVidWdIaW50OmMoImRlYnVnLWhpbnQiLDYwMDE3KSx0ZXJtaW5hbERlY29yYXRpb25TdWNjZXNzOmMoInRlcm1pbmFsLWRlY29yYXRpb24tc3VjY2VzcyIsNjAwMTcpLHByaW1pdGl2ZVNxdWFyZTpjKCJwcmltaXRpdmUtc3F1YXJlIiw2MDAxOCksZWRpdDpjKCJlZGl0Iiw2MDAxOSkscGVuY2lsOmMoInBlbmNpbCIsNjAwMTkpLGluZm86YygiaW5mbyIsNjAwMjApLGlzc3VlT3BlbmVkOmMoImlzc3VlLW9wZW5lZCIsNjAwMjApLGdpc3RQcml2YXRlOmMoImdpc3QtcHJpdmF0ZSIsNjAwMjEpLGdpdEZvcmtQcml2YXRlOmMoImdpdC1mb3JrLXByaXZhdGUiLDYwMDIxKSxsb2NrOmMoImxvY2siLDYwMDIxKSxtaXJyb3JQcml2YXRlOmMoIm1pcnJvci1wcml2YXRlIiw2MDAyMSksY2xvc2U6YygiY2xvc2UiLDYwMDIyKSxyZW1vdmVDbG9zZTpjKCJyZW1vdmUtY2xvc2UiLDYwMDIyKSx4OmMoIngiLDYwMDIyKSxyZXBvU3luYzpjKCJyZXBvLXN5bmMiLDYwMDIzKSxzeW5jOmMoInN5bmMiLDYwMDIzKSxjbG9uZTpjKCJjbG9uZSIsNjAwMjQpLGRlc2t0b3BEb3dubG9hZDpjKCJkZXNrdG9wLWRvd25sb2FkIiw2MDAyNCksYmVha2VyOmMoImJlYWtlciIsNjAwMjUpLG1pY3Jvc2NvcGU6YygibWljcm9zY29wZSIsNjAwMjUpLHZtOmMoInZtIiw2MDAyNiksZGV2aWNlRGVza3RvcDpjKCJkZXZpY2UtZGVza3RvcCIsNjAwMjYpLGZpbGU6YygiZmlsZSIsNjAwMjcpLGZpbGVUZXh0OmMoImZpbGUtdGV4dCIsNjAwMjcpLG1vcmU6YygibW9yZSIsNjAwMjgpLGVsbGlwc2lzOmMoImVsbGlwc2lzIiw2MDAyOCksa2ViYWJIb3Jpem9udGFsOmMoImtlYmFiLWhvcml6b250YWwiLDYwMDI4KSxtYWlsUmVwbHk6YygibWFpbC1yZXBseSIsNjAwMjkpLHJlcGx5OmMoInJlcGx5Iiw2MDAyOSksb3JnYW5pemF0aW9uOmMoIm9yZ2FuaXphdGlvbiIsNjAwMzApLG9yZ2FuaXphdGlvbkZpbGxlZDpjKCJvcmdhbml6YXRpb24tZmlsbGVkIiw2MDAzMCksb3JnYW5pemF0aW9uT3V0bGluZTpjKCJvcmdhbml6YXRpb24tb3V0bGluZSIsNjAwMzApLG5ld0ZpbGU6YygibmV3LWZpbGUiLDYwMDMxKSxmaWxlQWRkOmMoImZpbGUtYWRkIiw2MDAzMSksbmV3Rm9sZGVyOmMoIm5ldy1mb2xkZXIiLDYwMDMyKSxmaWxlRGlyZWN0b3J5Q3JlYXRlOmMoImZpbGUtZGlyZWN0b3J5LWNyZWF0ZSIsNjAwMzIpLHRyYXNoOmMoInRyYXNoIiw2MDAzMyksdHJhc2hjYW46YygidHJhc2hjYW4iLDYwMDMzKSxoaXN0b3J5OmMoImhpc3RvcnkiLDYwMDM0KSxjbG9jazpjKCJjbG9jayIsNjAwMzQpLGZvbGRlcjpjKCJmb2xkZXIiLDYwMDM1KSxmaWxlRGlyZWN0b3J5OmMoImZpbGUtZGlyZWN0b3J5Iiw2MDAzNSksc3ltYm9sRm9sZGVyOmMoInN5bWJvbC1mb2xkZXIiLDYwMDM1KSxsb2dvR2l0aHViOmMoImxvZ28tZ2l0aHViIiw2MDAzNiksbWFya0dpdGh1YjpjKCJtYXJrLWdpdGh1YiIsNjAwMzYpLGdpdGh1YjpjKCJnaXRodWIiLDYwMDM2KSx0ZXJtaW5hbDpjKCJ0ZXJtaW5hbCIsNjAwMzcpLGNvbnNvbGU6YygiY29uc29sZSIsNjAwMzcpLHJlcGw6YygicmVwbCIsNjAwMzcpLHphcDpjKCJ6YXAiLDYwMDM4KSxzeW1ib2xFdmVudDpjKCJzeW1ib2wtZXZlbnQiLDYwMDM4KSxlcnJvcjpjKCJlcnJvciIsNjAwMzkpLHN0b3A6Yygic3RvcCIsNjAwMzkpLHZhcmlhYmxlOmMoInZhcmlhYmxlIiw2MDA0MCksc3ltYm9sVmFyaWFibGU6Yygic3ltYm9sLXZhcmlhYmxlIiw2MDA0MCksYXJyYXk6YygiYXJyYXkiLDYwMDQyKSxzeW1ib2xBcnJheTpjKCJzeW1ib2wtYXJyYXkiLDYwMDQyKSxzeW1ib2xNb2R1bGU6Yygic3ltYm9sLW1vZHVsZSIsNjAwNDMpLHN5bWJvbFBhY2thZ2U6Yygic3ltYm9sLXBhY2thZ2UiLDYwMDQzKSxzeW1ib2xOYW1lc3BhY2U6Yygic3ltYm9sLW5hbWVzcGFjZSIsNjAwNDMpLHN5bWJvbE9iamVjdDpjKCJzeW1ib2wtb2JqZWN0Iiw2MDA0Myksc3ltYm9sTWV0aG9kOmMoInN5bWJvbC1tZXRob2QiLDYwMDQ0KSxzeW1ib2xGdW5jdGlvbjpjKCJzeW1ib2wtZnVuY3Rpb24iLDYwMDQ0KSxzeW1ib2xDb25zdHJ1Y3RvcjpjKCJzeW1ib2wtY29uc3RydWN0b3IiLDYwMDQ0KSxzeW1ib2xCb29sZWFuOmMoInN5bWJvbC1ib29sZWFuIiw2MDA0Nyksc3ltYm9sTnVsbDpjKCJzeW1ib2wtbnVsbCIsNjAwNDcpLHN5bWJvbE51bWVyaWM6Yygic3ltYm9sLW51bWVyaWMiLDYwMDQ4KSxzeW1ib2xOdW1iZXI6Yygic3ltYm9sLW51bWJlciIsNjAwNDgpLHN5bWJvbFN0cnVjdHVyZTpjKCJzeW1ib2wtc3RydWN0dXJlIiw2MDA0OSksc3ltYm9sU3RydWN0OmMoInN5bWJvbC1zdHJ1Y3QiLDYwMDQ5KSxzeW1ib2xQYXJhbWV0ZXI6Yygic3ltYm9sLXBhcmFtZXRlciIsNjAwNTApLHN5bWJvbFR5cGVQYXJhbWV0ZXI6Yygic3ltYm9sLXR5cGUtcGFyYW1ldGVyIiw2MDA1MCksc3ltYm9sS2V5OmMoInN5bWJvbC1rZXkiLDYwMDUxKSxzeW1ib2xUZXh0OmMoInN5bWJvbC10ZXh0Iiw2MDA1MSksc3ltYm9sUmVmZXJlbmNlOmMoInN5bWJvbC1yZWZlcmVuY2UiLDYwMDUyKSxnb1RvRmlsZTpjKCJnby10by1maWxlIiw2MDA1Miksc3ltYm9sRW51bTpjKCJzeW1ib2wtZW51bSIsNjAwNTMpLHN5bWJvbFZhbHVlOmMoInN5bWJvbC12YWx1ZSIsNjAwNTMpLHN5bWJvbFJ1bGVyOmMoInN5bWJvbC1ydWxlciIsNjAwNTQpLHN5bWJvbFVuaXQ6Yygic3ltYm9sLXVuaXQiLDYwMDU0KSxhY3RpdmF0ZUJyZWFrcG9pbnRzOmMoImFjdGl2YXRlLWJyZWFrcG9pbnRzIiw2MDA1NSksYXJjaGl2ZTpjKCJhcmNoaXZlIiw2MDA1NiksYXJyb3dCb3RoOmMoImFycm93LWJvdGgiLDYwMDU3KSxhcnJvd0Rvd246YygiYXJyb3ctZG93biIsNjAwNTgpLGFycm93TGVmdDpjKCJhcnJvdy1sZWZ0Iiw2MDA1OSksYXJyb3dSaWdodDpjKCJhcnJvdy1yaWdodCIsNjAwNjApLGFycm93U21hbGxEb3duOmMoImFycm93LXNtYWxsLWRvd24iLDYwMDYxKSxhcnJvd1NtYWxsTGVmdDpjKCJhcnJvdy1zbWFsbC1sZWZ0Iiw2MDA2MiksYXJyb3dTbWFsbFJpZ2h0OmMoImFycm93LXNtYWxsLXJpZ2h0Iiw2MDA2MyksYXJyb3dTbWFsbFVwOmMoImFycm93LXNtYWxsLXVwIiw2MDA2NCksYXJyb3dVcDpjKCJhcnJvdy11cCIsNjAwNjUpLGJlbGw6YygiYmVsbCIsNjAwNjYpLGJvbGQ6YygiYm9sZCIsNjAwNjcpLGJvb2s6YygiYm9vayIsNjAwNjgpLGJvb2ttYXJrOmMoImJvb2ttYXJrIiw2MDA2OSksZGVidWdCcmVha3BvaW50Q29uZGl0aW9uYWxVbnZlcmlmaWVkOmMoImRlYnVnLWJyZWFrcG9pbnQtY29uZGl0aW9uYWwtdW52ZXJpZmllZCIsNjAwNzApLGRlYnVnQnJlYWtwb2ludENvbmRpdGlvbmFsOmMoImRlYnVnLWJyZWFrcG9pbnQtY29uZGl0aW9uYWwiLDYwMDcxKSxkZWJ1Z0JyZWFrcG9pbnRDb25kaXRpb25hbERpc2FibGVkOmMoImRlYnVnLWJyZWFrcG9pbnQtY29uZGl0aW9uYWwtZGlzYWJsZWQiLDYwMDcxKSxkZWJ1Z0JyZWFrcG9pbnREYXRhVW52ZXJpZmllZDpjKCJkZWJ1Zy1icmVha3BvaW50LWRhdGEtdW52ZXJpZmllZCIsNjAwNzIpLGRlYnVnQnJlYWtwb2ludERhdGE6YygiZGVidWctYnJlYWtwb2ludC1kYXRhIiw2MDA3MyksZGVidWdCcmVha3BvaW50RGF0YURpc2FibGVkOmMoImRlYnVnLWJyZWFrcG9pbnQtZGF0YS1kaXNhYmxlZCIsNjAwNzMpLGRlYnVnQnJlYWtwb2ludExvZ1VudmVyaWZpZWQ6YygiZGVidWctYnJlYWtwb2ludC1sb2ctdW52ZXJpZmllZCIsNjAwNzQpLGRlYnVnQnJlYWtwb2ludExvZzpjKCJkZWJ1Zy1icmVha3BvaW50LWxvZyIsNjAwNzUpLGRlYnVnQnJlYWtwb2ludExvZ0Rpc2FibGVkOmMoImRlYnVnLWJyZWFrcG9pbnQtbG9nLWRpc2FibGVkIiw2MDA3NSksYnJpZWZjYXNlOmMoImJyaWVmY2FzZSIsNjAwNzYpLGJyb2FkY2FzdDpjKCJicm9hZGNhc3QiLDYwMDc3KSxicm93c2VyOmMoImJyb3dzZXIiLDYwMDc4KSxidWc6YygiYnVnIiw2MDA3OSksY2FsZW5kYXI6YygiY2FsZW5kYXIiLDYwMDgwKSxjYXNlU2Vuc2l0aXZlOmMoImNhc2Utc2Vuc2l0aXZlIiw2MDA4MSksY2hlY2s6YygiY2hlY2siLDYwMDgyKSxjaGVja2xpc3Q6YygiY2hlY2tsaXN0Iiw2MDA4MyksY2hldnJvbkRvd246YygiY2hldnJvbi1kb3duIiw2MDA4NCksY2hldnJvbkxlZnQ6YygiY2hldnJvbi1sZWZ0Iiw2MDA4NSksY2hldnJvblJpZ2h0OmMoImNoZXZyb24tcmlnaHQiLDYwMDg2KSxjaGV2cm9uVXA6YygiY2hldnJvbi11cCIsNjAwODcpLGNocm9tZUNsb3NlOmMoImNocm9tZS1jbG9zZSIsNjAwODgpLGNocm9tZU1heGltaXplOmMoImNocm9tZS1tYXhpbWl6ZSIsNjAwODkpLGNocm9tZU1pbmltaXplOmMoImNocm9tZS1taW5pbWl6ZSIsNjAwOTApLGNocm9tZVJlc3RvcmU6YygiY2hyb21lLXJlc3RvcmUiLDYwMDkxKSxjaXJjbGVPdXRsaW5lOmMoImNpcmNsZS1vdXRsaW5lIiw2MDA5MiksY2lyY2xlOmMoImNpcmNsZSIsNjAwOTIpLGRlYnVnQnJlYWtwb2ludFVudmVyaWZpZWQ6YygiZGVidWctYnJlYWtwb2ludC11bnZlcmlmaWVkIiw2MDA5MiksdGVybWluYWxEZWNvcmF0aW9uSW5jb21wbGV0ZTpjKCJ0ZXJtaW5hbC1kZWNvcmF0aW9uLWluY29tcGxldGUiLDYwMDkyKSxjaXJjbGVTbGFzaDpjKCJjaXJjbGUtc2xhc2giLDYwMDkzKSxjaXJjdWl0Qm9hcmQ6YygiY2lyY3VpdC1ib2FyZCIsNjAwOTQpLGNsZWFyQWxsOmMoImNsZWFyLWFsbCIsNjAwOTUpLGNsaXBweTpjKCJjbGlwcHkiLDYwMDk2KSxjbG9zZUFsbDpjKCJjbG9zZS1hbGwiLDYwMDk3KSxjbG91ZERvd25sb2FkOmMoImNsb3VkLWRvd25sb2FkIiw2MDA5OCksY2xvdWRVcGxvYWQ6YygiY2xvdWQtdXBsb2FkIiw2MDA5OSksY29kZTpjKCJjb2RlIiw2MDEwMCksY29sbGFwc2VBbGw6YygiY29sbGFwc2UtYWxsIiw2MDEwMSksY29sb3JNb2RlOmMoImNvbG9yLW1vZGUiLDYwMTAyKSxjb21tZW50RGlzY3Vzc2lvbjpjKCJjb21tZW50LWRpc2N1c3Npb24iLDYwMTAzKSxjcmVkaXRDYXJkOmMoImNyZWRpdC1jYXJkIiw2MDEwNSksZGFzaDpjKCJkYXNoIiw2MDEwOCksZGFzaGJvYXJkOmMoImRhc2hib2FyZCIsNjAxMDkpLGRhdGFiYXNlOmMoImRhdGFiYXNlIiw2MDExMCksZGVidWdDb250aW51ZTpjKCJkZWJ1Zy1jb250aW51ZSIsNjAxMTEpLGRlYnVnRGlzY29ubmVjdDpjKCJkZWJ1Zy1kaXNjb25uZWN0Iiw2MDExMiksZGVidWdQYXVzZTpjKCJkZWJ1Zy1wYXVzZSIsNjAxMTMpLGRlYnVnUmVzdGFydDpjKCJkZWJ1Zy1yZXN0YXJ0Iiw2MDExNCksZGVidWdTdGFydDpjKCJkZWJ1Zy1zdGFydCIsNjAxMTUpLGRlYnVnU3RlcEludG86YygiZGVidWctc3RlcC1pbnRvIiw2MDExNiksZGVidWdTdGVwT3V0OmMoImRlYnVnLXN0ZXAtb3V0Iiw2MDExNyksZGVidWdTdGVwT3ZlcjpjKCJkZWJ1Zy1zdGVwLW92ZXIiLDYwMTE4KSxkZWJ1Z1N0b3A6YygiZGVidWctc3RvcCIsNjAxMTkpLGRlYnVnOmMoImRlYnVnIiw2MDEyMCksZGV2aWNlQ2FtZXJhVmlkZW86YygiZGV2aWNlLWNhbWVyYS12aWRlbyIsNjAxMjEpLGRldmljZUNhbWVyYTpjKCJkZXZpY2UtY2FtZXJhIiw2MDEyMiksZGV2aWNlTW9iaWxlOmMoImRldmljZS1tb2JpbGUiLDYwMTIzKSxkaWZmQWRkZWQ6YygiZGlmZi1hZGRlZCIsNjAxMjQpLGRpZmZJZ25vcmVkOmMoImRpZmYtaWdub3JlZCIsNjAxMjUpLGRpZmZNb2RpZmllZDpjKCJkaWZmLW1vZGlmaWVkIiw2MDEyNiksZGlmZlJlbW92ZWQ6YygiZGlmZi1yZW1vdmVkIiw2MDEyNyksZGlmZlJlbmFtZWQ6YygiZGlmZi1yZW5hbWVkIiw2MDEyOCksZGlmZjpjKCJkaWZmIiw2MDEyOSksZGlmZlNpZGVieXNpZGU6YygiZGlmZi1zaWRlYnlzaWRlIiw2MDEyOSksZGlzY2FyZDpjKCJkaXNjYXJkIiw2MDEzMCksZWRpdG9yTGF5b3V0OmMoImVkaXRvci1sYXlvdXQiLDYwMTMxKSxlbXB0eVdpbmRvdzpjKCJlbXB0eS13aW5kb3ciLDYwMTMyKSxleGNsdWRlOmMoImV4Y2x1ZGUiLDYwMTMzKSxleHRlbnNpb25zOmMoImV4dGVuc2lvbnMiLDYwMTM0KSxleWVDbG9zZWQ6YygiZXllLWNsb3NlZCIsNjAxMzUpLGZpbGVCaW5hcnk6YygiZmlsZS1iaW5hcnkiLDYwMTM2KSxmaWxlQ29kZTpjKCJmaWxlLWNvZGUiLDYwMTM3KSxmaWxlTWVkaWE6YygiZmlsZS1tZWRpYSIsNjAxMzgpLGZpbGVQZGY6YygiZmlsZS1wZGYiLDYwMTM5KSxmaWxlU3VibW9kdWxlOmMoImZpbGUtc3VibW9kdWxlIiw2MDE0MCksZmlsZVN5bWxpbmtEaXJlY3Rvcnk6YygiZmlsZS1zeW1saW5rLWRpcmVjdG9yeSIsNjAxNDEpLGZpbGVTeW1saW5rRmlsZTpjKCJmaWxlLXN5bWxpbmstZmlsZSIsNjAxNDIpLGZpbGVaaXA6YygiZmlsZS16aXAiLDYwMTQzKSxmaWxlczpjKCJmaWxlcyIsNjAxNDQpLGZpbHRlcjpjKCJmaWx0ZXIiLDYwMTQ1KSxmbGFtZTpjKCJmbGFtZSIsNjAxNDYpLGZvbGREb3duOmMoImZvbGQtZG93biIsNjAxNDcpLGZvbGRVcDpjKCJmb2xkLXVwIiw2MDE0OCksZm9sZDpjKCJmb2xkIiw2MDE0OSksZm9sZGVyQWN0aXZlOmMoImZvbGRlci1hY3RpdmUiLDYwMTUwKSxmb2xkZXJPcGVuZWQ6YygiZm9sZGVyLW9wZW5lZCIsNjAxNTEpLGdlYXI6YygiZ2VhciIsNjAxNTIpLGdpZnQ6YygiZ2lmdCIsNjAxNTMpLGdpc3RTZWNyZXQ6YygiZ2lzdC1zZWNyZXQiLDYwMTU0KSxnaXN0OmMoImdpc3QiLDYwMTU1KSxnaXRDb21taXQ6YygiZ2l0LWNvbW1pdCIsNjAxNTYpLGdpdENvbXBhcmU6YygiZ2l0LWNvbXBhcmUiLDYwMTU3KSxjb21wYXJlQ2hhbmdlczpjKCJjb21wYXJlLWNoYW5nZXMiLDYwMTU3KSxnaXRNZXJnZTpjKCJnaXQtbWVyZ2UiLDYwMTU4KSxnaXRodWJBY3Rpb246YygiZ2l0aHViLWFjdGlvbiIsNjAxNTkpLGdpdGh1YkFsdDpjKCJnaXRodWItYWx0Iiw2MDE2MCksZ2xvYmU6YygiZ2xvYmUiLDYwMTYxKSxncmFiYmVyOmMoImdyYWJiZXIiLDYwMTYyKSxncmFwaDpjKCJncmFwaCIsNjAxNjMpLGdyaXBwZXI6YygiZ3JpcHBlciIsNjAxNjQpLGhlYXJ0OmMoImhlYXJ0Iiw2MDE2NSksaG9tZTpjKCJob21lIiw2MDE2NiksaG9yaXpvbnRhbFJ1bGU6YygiaG9yaXpvbnRhbC1ydWxlIiw2MDE2NyksaHVib3Q6YygiaHVib3QiLDYwMTY4KSxpbmJveDpjKCJpbmJveCIsNjAxNjkpLGlzc3VlUmVvcGVuZWQ6YygiaXNzdWUtcmVvcGVuZWQiLDYwMTcxKSxpc3N1ZXM6YygiaXNzdWVzIiw2MDE3MiksaXRhbGljOmMoIml0YWxpYyIsNjAxNzMpLGplcnNleTpjKCJqZXJzZXkiLDYwMTc0KSxqc29uOmMoImpzb24iLDYwMTc1KSxrZWJhYlZlcnRpY2FsOmMoImtlYmFiLXZlcnRpY2FsIiw2MDE3Niksa2V5OmMoImtleSIsNjAxNzcpLGxhdzpjKCJsYXciLDYwMTc4KSxsaWdodGJ1bGJBdXRvZml4OmMoImxpZ2h0YnVsYi1hdXRvZml4Iiw2MDE3OSksbGlua0V4dGVybmFsOmMoImxpbmstZXh0ZXJuYWwiLDYwMTgwKSxsaW5rOmMoImxpbmsiLDYwMTgxKSxsaXN0T3JkZXJlZDpjKCJsaXN0LW9yZGVyZWQiLDYwMTgyKSxsaXN0VW5vcmRlcmVkOmMoImxpc3QtdW5vcmRlcmVkIiw2MDE4MyksbGl2ZVNoYXJlOmMoImxpdmUtc2hhcmUiLDYwMTg0KSxsb2FkaW5nOmMoImxvYWRpbmciLDYwMTg1KSxsb2NhdGlvbjpjKCJsb2NhdGlvbiIsNjAxODYpLG1haWxSZWFkOmMoIm1haWwtcmVhZCIsNjAxODcpLG1haWw6YygibWFpbCIsNjAxODgpLG1hcmtkb3duOmMoIm1hcmtkb3duIiw2MDE4OSksbWVnYXBob25lOmMoIm1lZ2FwaG9uZSIsNjAxOTApLG1lbnRpb246YygibWVudGlvbiIsNjAxOTEpLG1pbGVzdG9uZTpjKCJtaWxlc3RvbmUiLDYwMTkyKSxnaXRQdWxsUmVxdWVzdE1pbGVzdG9uZTpjKCJnaXQtcHVsbC1yZXF1ZXN0LW1pbGVzdG9uZSIsNjAxOTIpLG1vcnRhckJvYXJkOmMoIm1vcnRhci1ib2FyZCIsNjAxOTMpLG1vdmU6YygibW92ZSIsNjAxOTQpLG11bHRpcGxlV2luZG93czpjKCJtdWx0aXBsZS13aW5kb3dzIiw2MDE5NSksbXV0ZTpjKCJtdXRlIiw2MDE5Niksbm9OZXdsaW5lOmMoIm5vLW5ld2xpbmUiLDYwMTk3KSxub3RlOmMoIm5vdGUiLDYwMTk4KSxvY3RvZmFjZTpjKCJvY3RvZmFjZSIsNjAxOTkpLG9wZW5QcmV2aWV3OmMoIm9wZW4tcHJldmlldyIsNjAyMDApLHBhY2thZ2U6YygicGFja2FnZSIsNjAyMDEpLHBhaW50Y2FuOmMoInBhaW50Y2FuIiw2MDIwMikscGluOmMoInBpbiIsNjAyMDMpLHBsYXk6YygicGxheSIsNjAyMDQpLHJ1bjpjKCJydW4iLDYwMjA0KSxwbHVnOmMoInBsdWciLDYwMjA1KSxwcmVzZXJ2ZUNhc2U6YygicHJlc2VydmUtY2FzZSIsNjAyMDYpLHByZXZpZXc6YygicHJldmlldyIsNjAyMDcpLHByb2plY3Q6YygicHJvamVjdCIsNjAyMDgpLHB1bHNlOmMoInB1bHNlIiw2MDIwOSkscXVlc3Rpb246YygicXVlc3Rpb24iLDYwMjEwKSxxdW90ZTpjKCJxdW90ZSIsNjAyMTEpLHJhZGlvVG93ZXI6YygicmFkaW8tdG93ZXIiLDYwMjEyKSxyZWFjdGlvbnM6YygicmVhY3Rpb25zIiw2MDIxMykscmVmZXJlbmNlczpjKCJyZWZlcmVuY2VzIiw2MDIxNCkscmVmcmVzaDpjKCJyZWZyZXNoIiw2MDIxNSkscmVnZXg6YygicmVnZXgiLDYwMjE2KSxyZW1vdGVFeHBsb3JlcjpjKCJyZW1vdGUtZXhwbG9yZXIiLDYwMjE3KSxyZW1vdGU6YygicmVtb3RlIiw2MDIxOCkscmVtb3ZlOmMoInJlbW92ZSIsNjAyMTkpLHJlcGxhY2VBbGw6YygicmVwbGFjZS1hbGwiLDYwMjIwKSxyZXBsYWNlOmMoInJlcGxhY2UiLDYwMjIxKSxyZXBvQ2xvbmU6YygicmVwby1jbG9uZSIsNjAyMjIpLHJlcG9Gb3JjZVB1c2g6YygicmVwby1mb3JjZS1wdXNoIiw2MDIyMykscmVwb1B1bGw6YygicmVwby1wdWxsIiw2MDIyNCkscmVwb1B1c2g6YygicmVwby1wdXNoIiw2MDIyNSkscmVwb3J0OmMoInJlcG9ydCIsNjAyMjYpLHJlcXVlc3RDaGFuZ2VzOmMoInJlcXVlc3QtY2hhbmdlcyIsNjAyMjcpLHJvY2tldDpjKCJyb2NrZXQiLDYwMjI4KSxyb290Rm9sZGVyT3BlbmVkOmMoInJvb3QtZm9sZGVyLW9wZW5lZCIsNjAyMjkpLHJvb3RGb2xkZXI6Yygicm9vdC1mb2xkZXIiLDYwMjMwKSxyc3M6YygicnNzIiw2MDIzMSkscnVieTpjKCJydWJ5Iiw2MDIzMiksc2F2ZUFsbDpjKCJzYXZlLWFsbCIsNjAyMzMpLHNhdmVBczpjKCJzYXZlLWFzIiw2MDIzNCksc2F2ZTpjKCJzYXZlIiw2MDIzNSksc2NyZWVuRnVsbDpjKCJzY3JlZW4tZnVsbCIsNjAyMzYpLHNjcmVlbk5vcm1hbDpjKCJzY3JlZW4tbm9ybWFsIiw2MDIzNyksc2VhcmNoU3RvcDpjKCJzZWFyY2gtc3RvcCIsNjAyMzgpLHNlcnZlcjpjKCJzZXJ2ZXIiLDYwMjQwKSxzZXR0aW5nc0dlYXI6Yygic2V0dGluZ3MtZ2VhciIsNjAyNDEpLHNldHRpbmdzOmMoInNldHRpbmdzIiw2MDI0Miksc2hpZWxkOmMoInNoaWVsZCIsNjAyNDMpLHNtaWxleTpjKCJzbWlsZXkiLDYwMjQ0KSxzb3J0UHJlY2VkZW5jZTpjKCJzb3J0LXByZWNlZGVuY2UiLDYwMjQ1KSxzcGxpdEhvcml6b250YWw6Yygic3BsaXQtaG9yaXpvbnRhbCIsNjAyNDYpLHNwbGl0VmVydGljYWw6Yygic3BsaXQtdmVydGljYWwiLDYwMjQ3KSxzcXVpcnJlbDpjKCJzcXVpcnJlbCIsNjAyNDgpLHN0YXJGdWxsOmMoInN0YXItZnVsbCIsNjAyNDkpLHN0YXJIYWxmOmMoInN0YXItaGFsZiIsNjAyNTApLHN5bWJvbENsYXNzOmMoInN5bWJvbC1jbGFzcyIsNjAyNTEpLHN5bWJvbENvbG9yOmMoInN5bWJvbC1jb2xvciIsNjAyNTIpLHN5bWJvbENvbnN0YW50OmMoInN5bWJvbC1jb25zdGFudCIsNjAyNTMpLHN5bWJvbEVudW1NZW1iZXI6Yygic3ltYm9sLWVudW0tbWVtYmVyIiw2MDI1NCksc3ltYm9sRmllbGQ6Yygic3ltYm9sLWZpZWxkIiw2MDI1NSksc3ltYm9sRmlsZTpjKCJzeW1ib2wtZmlsZSIsNjAyNTYpLHN5bWJvbEludGVyZmFjZTpjKCJzeW1ib2wtaW50ZXJmYWNlIiw2MDI1Nyksc3ltYm9sS2V5d29yZDpjKCJzeW1ib2wta2V5d29yZCIsNjAyNTgpLHN5bWJvbE1pc2M6Yygic3ltYm9sLW1pc2MiLDYwMjU5KSxzeW1ib2xPcGVyYXRvcjpjKCJzeW1ib2wtb3BlcmF0b3IiLDYwMjYwKSxzeW1ib2xQcm9wZXJ0eTpjKCJzeW1ib2wtcHJvcGVydHkiLDYwMjYxKSx3cmVuY2g6Yygid3JlbmNoIiw2MDI2MSksd3JlbmNoU3ViYWN0aW9uOmMoIndyZW5jaC1zdWJhY3Rpb24iLDYwMjYxKSxzeW1ib2xTbmlwcGV0OmMoInN5bWJvbC1zbmlwcGV0Iiw2MDI2MiksdGFza2xpc3Q6YygidGFza2xpc3QiLDYwMjYzKSx0ZWxlc2NvcGU6YygidGVsZXNjb3BlIiw2MDI2NCksdGV4dFNpemU6YygidGV4dC1zaXplIiw2MDI2NSksdGhyZWVCYXJzOmMoInRocmVlLWJhcnMiLDYwMjY2KSx0aHVtYnNkb3duOmMoInRodW1ic2Rvd24iLDYwMjY3KSx0aHVtYnN1cDpjKCJ0aHVtYnN1cCIsNjAyNjgpLHRvb2xzOmMoInRvb2xzIiw2MDI2OSksdHJpYW5nbGVEb3duOmMoInRyaWFuZ2xlLWRvd24iLDYwMjcwKSx0cmlhbmdsZUxlZnQ6YygidHJpYW5nbGUtbGVmdCIsNjAyNzEpLHRyaWFuZ2xlUmlnaHQ6YygidHJpYW5nbGUtcmlnaHQiLDYwMjcyKSx0cmlhbmdsZVVwOmMoInRyaWFuZ2xlLXVwIiw2MDI3MyksdHdpdHRlcjpjKCJ0d2l0dGVyIiw2MDI3NCksdW5mb2xkOmMoInVuZm9sZCIsNjAyNzUpLHVubG9jazpjKCJ1bmxvY2siLDYwMjc2KSx1bm11dGU6YygidW5tdXRlIiw2MDI3NyksdW52ZXJpZmllZDpjKCJ1bnZlcmlmaWVkIiw2MDI3OCksdmVyaWZpZWQ6YygidmVyaWZpZWQiLDYwMjc5KSx2ZXJzaW9uczpjKCJ2ZXJzaW9ucyIsNjAyODApLHZtQWN0aXZlOmMoInZtLWFjdGl2ZSIsNjAyODEpLHZtT3V0bGluZTpjKCJ2bS1vdXRsaW5lIiw2MDI4Miksdm1SdW5uaW5nOmMoInZtLXJ1bm5pbmciLDYwMjgzKSx3YXRjaDpjKCJ3YXRjaCIsNjAyODQpLHdoaXRlc3BhY2U6Yygid2hpdGVzcGFjZSIsNjAyODUpLHdob2xlV29yZDpjKCJ3aG9sZS13b3JkIiw2MDI4Niksd2luZG93OmMoIndpbmRvdyIsNjAyODcpLHdvcmRXcmFwOmMoIndvcmQtd3JhcCIsNjAyODgpLHpvb21JbjpjKCJ6b29tLWluIiw2MDI4OSksem9vbU91dDpjKCJ6b29tLW91dCIsNjAyOTApLGxpc3RGaWx0ZXI6YygibGlzdC1maWx0ZXIiLDYwMjkxKSxsaXN0RmxhdDpjKCJsaXN0LWZsYXQiLDYwMjkyKSxsaXN0U2VsZWN0aW9uOmMoImxpc3Qtc2VsZWN0aW9uIiw2MDI5Myksc2VsZWN0aW9uOmMoInNlbGVjdGlvbiIsNjAyOTMpLGxpc3RUcmVlOmMoImxpc3QtdHJlZSIsNjAyOTQpLGRlYnVnQnJlYWtwb2ludEZ1bmN0aW9uVW52ZXJpZmllZDpjKCJkZWJ1Zy1icmVha3BvaW50LWZ1bmN0aW9uLXVudmVyaWZpZWQiLDYwMjk1KSxkZWJ1Z0JyZWFrcG9pbnRGdW5jdGlvbjpjKCJkZWJ1Zy1icmVha3BvaW50LWZ1bmN0aW9uIiw2MDI5NiksZGVidWdCcmVha3BvaW50RnVuY3Rpb25EaXNhYmxlZDpjKCJkZWJ1Zy1icmVha3BvaW50LWZ1bmN0aW9uLWRpc2FibGVkIiw2MDI5NiksZGVidWdTdGFja2ZyYW1lQWN0aXZlOmMoImRlYnVnLXN0YWNrZnJhbWUtYWN0aXZlIiw2MDI5NyksY2lyY2xlU21hbGxGaWxsZWQ6YygiY2lyY2xlLXNtYWxsLWZpbGxlZCIsNjAyOTgpLGRlYnVnU3RhY2tmcmFtZURvdDpjKCJkZWJ1Zy1zdGFja2ZyYW1lLWRvdCIsNjAyOTgpLHRlcm1pbmFsRGVjb3JhdGlvbk1hcms6YygidGVybWluYWwtZGVjb3JhdGlvbi1tYXJrIiw2MDI5OCksZGVidWdTdGFja2ZyYW1lOmMoImRlYnVnLXN0YWNrZnJhbWUiLDYwMjk5KSxkZWJ1Z1N0YWNrZnJhbWVGb2N1c2VkOmMoImRlYnVnLXN0YWNrZnJhbWUtZm9jdXNlZCIsNjAyOTkpLGRlYnVnQnJlYWtwb2ludFVuc3VwcG9ydGVkOmMoImRlYnVnLWJyZWFrcG9pbnQtdW5zdXBwb3J0ZWQiLDYwMzAwKSxzeW1ib2xTdHJpbmc6Yygic3ltYm9sLXN0cmluZyIsNjAzMDEpLGRlYnVnUmV2ZXJzZUNvbnRpbnVlOmMoImRlYnVnLXJldmVyc2UtY29udGludWUiLDYwMzAyKSxkZWJ1Z1N0ZXBCYWNrOmMoImRlYnVnLXN0ZXAtYmFjayIsNjAzMDMpLGRlYnVnUmVzdGFydEZyYW1lOmMoImRlYnVnLXJlc3RhcnQtZnJhbWUiLDYwMzA0KSxkZWJ1Z0FsdDpjKCJkZWJ1Zy1hbHQiLDYwMzA1KSxjYWxsSW5jb21pbmc6YygiY2FsbC1pbmNvbWluZyIsNjAzMDYpLGNhbGxPdXRnb2luZzpjKCJjYWxsLW91dGdvaW5nIiw2MDMwNyksbWVudTpjKCJtZW51Iiw2MDMwOCksZXhwYW5kQWxsOmMoImV4cGFuZC1hbGwiLDYwMzA5KSxmZWVkYmFjazpjKCJmZWVkYmFjayIsNjAzMTApLGdpdFB1bGxSZXF1ZXN0UmV2aWV3ZXI6YygiZ2l0LXB1bGwtcmVxdWVzdC1yZXZpZXdlciIsNjAzMTApLGdyb3VwQnlSZWZUeXBlOmMoImdyb3VwLWJ5LXJlZi10eXBlIiw2MDMxMSksdW5ncm91cEJ5UmVmVHlwZTpjKCJ1bmdyb3VwLWJ5LXJlZi10eXBlIiw2MDMxMiksYWNjb3VudDpjKCJhY2NvdW50Iiw2MDMxMyksZ2l0UHVsbFJlcXVlc3RBc3NpZ25lZTpjKCJnaXQtcHVsbC1yZXF1ZXN0LWFzc2lnbmVlIiw2MDMxMyksYmVsbERvdDpjKCJiZWxsLWRvdCIsNjAzMTQpLGRlYnVnQ29uc29sZTpjKCJkZWJ1Zy1jb25zb2xlIiw2MDMxNSksbGlicmFyeTpjKCJsaWJyYXJ5Iiw2MDMxNiksb3V0cHV0OmMoIm91dHB1dCIsNjAzMTcpLHJ1bkFsbDpjKCJydW4tYWxsIiw2MDMxOCksc3luY0lnbm9yZWQ6Yygic3luYy1pZ25vcmVkIiw2MDMxOSkscGlubmVkOmMoInBpbm5lZCIsNjAzMjApLGdpdGh1YkludmVydGVkOmMoImdpdGh1Yi1pbnZlcnRlZCIsNjAzMjEpLHNlcnZlclByb2Nlc3M6Yygic2VydmVyLXByb2Nlc3MiLDYwMzIyKSxzZXJ2ZXJFbnZpcm9ubWVudDpjKCJzZXJ2ZXItZW52aXJvbm1lbnQiLDYwMzIzKSxwYXNzOmMoInBhc3MiLDYwMzI0KSxpc3N1ZUNsb3NlZDpjKCJpc3N1ZS1jbG9zZWQiLDYwMzI0KSxzdG9wQ2lyY2xlOmMoInN0b3AtY2lyY2xlIiw2MDMyNSkscGxheUNpcmNsZTpjKCJwbGF5LWNpcmNsZSIsNjAzMjYpLHJlY29yZDpjKCJyZWNvcmQiLDYwMzI3KSxkZWJ1Z0FsdFNtYWxsOmMoImRlYnVnLWFsdC1zbWFsbCIsNjAzMjgpLHZtQ29ubmVjdDpjKCJ2bS1jb25uZWN0Iiw2MDMyOSksY2xvdWQ6YygiY2xvdWQiLDYwMzMwKSxtZXJnZTpjKCJtZXJnZSIsNjAzMzEpLGV4cG9ydDpjKCJleHBvcnQiLDYwMzMyKSxncmFwaExlZnQ6YygiZ3JhcGgtbGVmdCIsNjAzMzMpLG1hZ25ldDpjKCJtYWduZXQiLDYwMzM0KSxub3RlYm9vazpjKCJub3RlYm9vayIsNjAzMzUpLHJlZG86YygicmVkbyIsNjAzMzYpLGNoZWNrQWxsOmMoImNoZWNrLWFsbCIsNjAzMzcpLHBpbm5lZERpcnR5OmMoInBpbm5lZC1kaXJ0eSIsNjAzMzgpLHBhc3NGaWxsZWQ6YygicGFzcy1maWxsZWQiLDYwMzM5KSxjaXJjbGVMYXJnZUZpbGxlZDpjKCJjaXJjbGUtbGFyZ2UtZmlsbGVkIiw2MDM0MCksY2lyY2xlTGFyZ2U6YygiY2lyY2xlLWxhcmdlIiw2MDM0MSksY2lyY2xlTGFyZ2VPdXRsaW5lOmMoImNpcmNsZS1sYXJnZS1vdXRsaW5lIiw2MDM0MSksY29tYmluZTpjKCJjb21iaW5lIiw2MDM0MiksZ2F0aGVyOmMoImdhdGhlciIsNjAzNDIpLHRhYmxlOmMoInRhYmxlIiw2MDM0MyksdmFyaWFibGVHcm91cDpjKCJ2YXJpYWJsZS1ncm91cCIsNjAzNDQpLHR5cGVIaWVyYXJjaHk6YygidHlwZS1oaWVyYXJjaHkiLDYwMzQ1KSx0eXBlSGllcmFyY2h5U3ViOmMoInR5cGUtaGllcmFyY2h5LXN1YiIsNjAzNDYpLHR5cGVIaWVyYXJjaHlTdXBlcjpjKCJ0eXBlLWhpZXJhcmNoeS1zdXBlciIsNjAzNDcpLGdpdFB1bGxSZXF1ZXN0Q3JlYXRlOmMoImdpdC1wdWxsLXJlcXVlc3QtY3JlYXRlIiw2MDM0OCkscnVuQWJvdmU6YygicnVuLWFib3ZlIiw2MDM0OSkscnVuQmVsb3c6YygicnVuLWJlbG93Iiw2MDM1MCksbm90ZWJvb2tUZW1wbGF0ZTpjKCJub3RlYm9vay10ZW1wbGF0ZSIsNjAzNTEpLGRlYnVnUmVydW46YygiZGVidWctcmVydW4iLDYwMzUyKSx3b3Jrc3BhY2VUcnVzdGVkOmMoIndvcmtzcGFjZS10cnVzdGVkIiw2MDM1Myksd29ya3NwYWNlVW50cnVzdGVkOmMoIndvcmtzcGFjZS11bnRydXN0ZWQiLDYwMzU0KSx3b3Jrc3BhY2VVbmtub3duOmMoIndvcmtzcGFjZS11bmtub3duIiw2MDM1NSksdGVybWluYWxDbWQ6YygidGVybWluYWwtY21kIiw2MDM1NiksdGVybWluYWxEZWJpYW46YygidGVybWluYWwtZGViaWFuIiw2MDM1NyksdGVybWluYWxMaW51eDpjKCJ0ZXJtaW5hbC1saW51eCIsNjAzNTgpLHRlcm1pbmFsUG93ZXJzaGVsbDpjKCJ0ZXJtaW5hbC1wb3dlcnNoZWxsIiw2MDM1OSksdGVybWluYWxUbXV4OmMoInRlcm1pbmFsLXRtdXgiLDYwMzYwKSx0ZXJtaW5hbFVidW50dTpjKCJ0ZXJtaW5hbC11YnVudHUiLDYwMzYxKSx0ZXJtaW5hbEJhc2g6YygidGVybWluYWwtYmFzaCIsNjAzNjIpLGFycm93U3dhcDpjKCJhcnJvdy1zd2FwIiw2MDM2MyksY29weTpjKCJjb3B5Iiw2MDM2NCkscGVyc29uQWRkOmMoInBlcnNvbi1hZGQiLDYwMzY1KSxmaWx0ZXJGaWxsZWQ6YygiZmlsdGVyLWZpbGxlZCIsNjAzNjYpLHdhbmQ6Yygid2FuZCIsNjAzNjcpLGRlYnVnTGluZUJ5TGluZTpjKCJkZWJ1Zy1saW5lLWJ5LWxpbmUiLDYwMzY4KSxpbnNwZWN0OmMoImluc3BlY3QiLDYwMzY5KSxsYXllcnM6YygibGF5ZXJzIiw2MDM3MCksbGF5ZXJzRG90OmMoImxheWVycy1kb3QiLDYwMzcxKSxsYXllcnNBY3RpdmU6YygibGF5ZXJzLWFjdGl2ZSIsNjAzNzIpLGNvbXBhc3M6YygiY29tcGFzcyIsNjAzNzMpLGNvbXBhc3NEb3Q6YygiY29tcGFzcy1kb3QiLDYwMzc0KSxjb21wYXNzQWN0aXZlOmMoImNvbXBhc3MtYWN0aXZlIiw2MDM3NSksYXp1cmU6YygiYXp1cmUiLDYwMzc2KSxpc3N1ZURyYWZ0OmMoImlzc3VlLWRyYWZ0Iiw2MDM3NyksZ2l0UHVsbFJlcXVlc3RDbG9zZWQ6YygiZ2l0LXB1bGwtcmVxdWVzdC1jbG9zZWQiLDYwMzc4KSxnaXRQdWxsUmVxdWVzdERyYWZ0OmMoImdpdC1wdWxsLXJlcXVlc3QtZHJhZnQiLDYwMzc5KSxkZWJ1Z0FsbDpjKCJkZWJ1Zy1hbGwiLDYwMzgwKSxkZWJ1Z0NvdmVyYWdlOmMoImRlYnVnLWNvdmVyYWdlIiw2MDM4MSkscnVuRXJyb3JzOmMoInJ1bi1lcnJvcnMiLDYwMzgyKSxmb2xkZXJMaWJyYXJ5OmMoImZvbGRlci1saWJyYXJ5Iiw2MDM4MyksZGVidWdDb250aW51ZVNtYWxsOmMoImRlYnVnLWNvbnRpbnVlLXNtYWxsIiw2MDM4NCksYmVha2VyU3RvcDpjKCJiZWFrZXItc3RvcCIsNjAzODUpLGdyYXBoTGluZTpjKCJncmFwaC1saW5lIiw2MDM4NiksZ3JhcGhTY2F0dGVyOmMoImdyYXBoLXNjYXR0ZXIiLDYwMzg3KSxwaWVDaGFydDpjKCJwaWUtY2hhcnQiLDYwMzg4KSxicmFja2V0OmMoImJyYWNrZXQiLDYwMTc1KSxicmFja2V0RG90OmMoImJyYWNrZXQtZG90Iiw2MDM4OSksYnJhY2tldEVycm9yOmMoImJyYWNrZXQtZXJyb3IiLDYwMzkwKSxsb2NrU21hbGw6YygibG9jay1zbWFsbCIsNjAzOTEpLGF6dXJlRGV2b3BzOmMoImF6dXJlLWRldm9wcyIsNjAzOTIpLHZlcmlmaWVkRmlsbGVkOmMoInZlcmlmaWVkLWZpbGxlZCIsNjAzOTMpLG5ld2xpbmU6YygibmV3bGluZSIsNjAzOTQpLGxheW91dDpjKCJsYXlvdXQiLDYwMzk1KSxsYXlvdXRBY3Rpdml0eWJhckxlZnQ6YygibGF5b3V0LWFjdGl2aXR5YmFyLWxlZnQiLDYwMzk2KSxsYXlvdXRBY3Rpdml0eWJhclJpZ2h0OmMoImxheW91dC1hY3Rpdml0eWJhci1yaWdodCIsNjAzOTcpLGxheW91dFBhbmVsTGVmdDpjKCJsYXlvdXQtcGFuZWwtbGVmdCIsNjAzOTgpLGxheW91dFBhbmVsQ2VudGVyOmMoImxheW91dC1wYW5lbC1jZW50ZXIiLDYwMzk5KSxsYXlvdXRQYW5lbEp1c3RpZnk6YygibGF5b3V0LXBhbmVsLWp1c3RpZnkiLDYwNDAwKSxsYXlvdXRQYW5lbFJpZ2h0OmMoImxheW91dC1wYW5lbC1yaWdodCIsNjA0MDEpLGxheW91dFBhbmVsOmMoImxheW91dC1wYW5lbCIsNjA0MDIpLGxheW91dFNpZGViYXJMZWZ0OmMoImxheW91dC1zaWRlYmFyLWxlZnQiLDYwNDAzKSxsYXlvdXRTaWRlYmFyUmlnaHQ6YygibGF5b3V0LXNpZGViYXItcmlnaHQiLDYwNDA0KSxsYXlvdXRTdGF0dXNiYXI6YygibGF5b3V0LXN0YXR1c2JhciIsNjA0MDUpLGxheW91dE1lbnViYXI6YygibGF5b3V0LW1lbnViYXIiLDYwNDA2KSxsYXlvdXRDZW50ZXJlZDpjKCJsYXlvdXQtY2VudGVyZWQiLDYwNDA3KSx0YXJnZXQ6YygidGFyZ2V0Iiw2MDQwOCksaW5kZW50OmMoImluZGVudCIsNjA0MDkpLHJlY29yZFNtYWxsOmMoInJlY29yZC1zbWFsbCIsNjA0MTApLGVycm9yU21hbGw6YygiZXJyb3Itc21hbGwiLDYwNDExKSx0ZXJtaW5hbERlY29yYXRpb25FcnJvcjpjKCJ0ZXJtaW5hbC1kZWNvcmF0aW9uLWVycm9yIiw2MDQxMSksYXJyb3dDaXJjbGVEb3duOmMoImFycm93LWNpcmNsZS1kb3duIiw2MDQxMiksYXJyb3dDaXJjbGVMZWZ0OmMoImFycm93LWNpcmNsZS1sZWZ0Iiw2MDQxMyksYXJyb3dDaXJjbGVSaWdodDpjKCJhcnJvdy1jaXJjbGUtcmlnaHQiLDYwNDE0KSxhcnJvd0NpcmNsZVVwOmMoImFycm93LWNpcmNsZS11cCIsNjA0MTUpLGxheW91dFNpZGViYXJSaWdodE9mZjpjKCJsYXlvdXQtc2lkZWJhci1yaWdodC1vZmYiLDYwNDE2KSxsYXlvdXRQYW5lbE9mZjpjKCJsYXlvdXQtcGFuZWwtb2ZmIiw2MDQxNyksbGF5b3V0U2lkZWJhckxlZnRPZmY6YygibGF5b3V0LXNpZGViYXItbGVmdC1vZmYiLDYwNDE4KSxibGFuazpjKCJibGFuayIsNjA0MTkpLGhlYXJ0RmlsbGVkOmMoImhlYXJ0LWZpbGxlZCIsNjA0MjApLG1hcDpjKCJtYXAiLDYwNDIxKSxtYXBIb3Jpem9udGFsOmMoIm1hcC1ob3Jpem9udGFsIiw2MDQyMSksZm9sZEhvcml6b250YWw6YygiZm9sZC1ob3Jpem9udGFsIiw2MDQyMSksbWFwRmlsbGVkOmMoIm1hcC1maWxsZWQiLDYwNDIyKSxtYXBIb3Jpem9udGFsRmlsbGVkOmMoIm1hcC1ob3Jpem9udGFsLWZpbGxlZCIsNjA0MjIpLGZvbGRIb3Jpem9udGFsRmlsbGVkOmMoImZvbGQtaG9yaXpvbnRhbC1maWxsZWQiLDYwNDIyKSxjaXJjbGVTbWFsbDpjKCJjaXJjbGUtc21hbGwiLDYwNDIzKSxiZWxsU2xhc2g6YygiYmVsbC1zbGFzaCIsNjA0MjQpLGJlbGxTbGFzaERvdDpjKCJiZWxsLXNsYXNoLWRvdCIsNjA0MjUpLGNvbW1lbnRVbnJlc29sdmVkOmMoImNvbW1lbnQtdW5yZXNvbHZlZCIsNjA0MjYpLGdpdFB1bGxSZXF1ZXN0R29Ub0NoYW5nZXM6YygiZ2l0LXB1bGwtcmVxdWVzdC1nby10by1jaGFuZ2VzIiw2MDQyNyksZ2l0UHVsbFJlcXVlc3ROZXdDaGFuZ2VzOmMoImdpdC1wdWxsLXJlcXVlc3QtbmV3LWNoYW5nZXMiLDYwNDI4KSxzZWFyY2hGdXp6eTpjKCJzZWFyY2gtZnV6enkiLDYwNDI5KSxjb21tZW50RHJhZnQ6YygiY29tbWVudC1kcmFmdCIsNjA0MzApLHNlbmQ6Yygic2VuZCIsNjA0MzEpLHNwYXJrbGU6Yygic3BhcmtsZSIsNjA0MzIpLGluc2VydDpjKCJpbnNlcnQiLDYwNDMzKSxtaWM6YygibWljIiw2MDQzNCksdGh1bWJzZG93bkZpbGxlZDpjKCJ0aHVtYnNkb3duLWZpbGxlZCIsNjA0MzUpLHRodW1ic3VwRmlsbGVkOmMoInRodW1ic3VwLWZpbGxlZCIsNjA0MzYpLGNvZmZlZTpjKCJjb2ZmZWUiLDYwNDM3KSxzbmFrZTpjKCJzbmFrZSIsNjA0MzgpLGdhbWU6YygiZ2FtZSIsNjA0MzkpLHZyOmMoInZyIiw2MDQ0MCksY2hpcDpjKCJjaGlwIiw2MDQ0MSkscGlhbm86YygicGlhbm8iLDYwNDQyKSxtdXNpYzpjKCJtdXNpYyIsNjA0NDMpLG1pY0ZpbGxlZDpjKCJtaWMtZmlsbGVkIiw2MDQ0NCkscmVwb0ZldGNoOmMoInJlcG8tZmV0Y2giLDYwNDQ1KSxjb3BpbG90OmMoImNvcGlsb3QiLDYwNDQ2KSxsaWdodGJ1bGJTcGFya2xlOmMoImxpZ2h0YnVsYi1zcGFya2xlIiw2MDQ0Nykscm9ib3Q6Yygicm9ib3QiLDYwNDQ4KSxzcGFya2xlRmlsbGVkOmMoInNwYXJrbGUtZmlsbGVkIiw2MDQ0OSksZGlmZlNpbmdsZTpjKCJkaWZmLXNpbmdsZSIsNjA0NTApLGRpZmZNdWx0aXBsZTpjKCJkaWZmLW11bHRpcGxlIiw2MDQ1MSksc3Vycm91bmRXaXRoOmMoInN1cnJvdW5kLXdpdGgiLDYwNDUyKSxzaGFyZTpjKCJzaGFyZSIsNjA0NTMpLGdpdFN0YXNoOmMoImdpdC1zdGFzaCIsNjA0NTQpLGdpdFN0YXNoQXBwbHk6YygiZ2l0LXN0YXNoLWFwcGx5Iiw2MDQ1NSksZ2l0U3Rhc2hQb3A6YygiZ2l0LXN0YXNoLXBvcCIsNjA0NTYpLHZzY29kZTpjKCJ2c2NvZGUiLDYwNDU3KSx2c2NvZGVJbnNpZGVyczpjKCJ2c2NvZGUtaW5zaWRlcnMiLDYwNDU4KSxjb2RlT3NzOmMoImNvZGUtb3NzIiw2MDQ1OSkscnVuQ292ZXJhZ2U6YygicnVuLWNvdmVyYWdlIiw2MDQ2MCkscnVuQWxsQ292ZXJhZ2U6YygicnVuLWFsbC1jb3ZlcmFnZSIsNjA0NjEpLGNvdmVyYWdlOmMoImNvdmVyYWdlIiw2MDQ2MiksZ2l0aHViUHJvamVjdDpjKCJnaXRodWItcHJvamVjdCIsNjA0NjMpLG1hcFZlcnRpY2FsOmMoIm1hcC12ZXJ0aWNhbCIsNjA0NjQpLGZvbGRWZXJ0aWNhbDpjKCJmb2xkLXZlcnRpY2FsIiw2MDQ2NCksbWFwVmVydGljYWxGaWxsZWQ6YygibWFwLXZlcnRpY2FsLWZpbGxlZCIsNjA0NjUpLGZvbGRWZXJ0aWNhbEZpbGxlZDpjKCJmb2xkLXZlcnRpY2FsLWZpbGxlZCIsNjA0NjUpLGdvVG9TZWFyY2g6YygiZ28tdG8tc2VhcmNoIiw2MDQ2NikscGVyY2VudGFnZTpjKCJwZXJjZW50YWdlIiw2MDQ2Nyksc29ydFBlcmNlbnRhZ2U6Yygic29ydC1wZXJjZW50YWdlIiw2MDQ2NyksYXR0YWNoOmMoImF0dGFjaCIsNjA0NjgpfSxwdT17ZGlhbG9nRXJyb3I6YygiZGlhbG9nLWVycm9yIiwiZXJyb3IiKSxkaWFsb2dXYXJuaW5nOmMoImRpYWxvZy13YXJuaW5nIiwid2FybmluZyIpLGRpYWxvZ0luZm86YygiZGlhbG9nLWluZm8iLCJpbmZvIiksZGlhbG9nQ2xvc2U6YygiZGlhbG9nLWNsb3NlIiwiY2xvc2UiKSx0cmVlSXRlbUV4cGFuZGVkOmMoInRyZWUtaXRlbS1leHBhbmRlZCIsImNoZXZyb24tZG93biIpLHRyZWVGaWx0ZXJPblR5cGVPbjpjKCJ0cmVlLWZpbHRlci1vbi10eXBlLW9uIiwibGlzdC1maWx0ZXIiKSx0cmVlRmlsdGVyT25UeXBlT2ZmOmMoInRyZWUtZmlsdGVyLW9uLXR5cGUtb2ZmIiwibGlzdC1zZWxlY3Rpb24iKSx0cmVlRmlsdGVyQ2xlYXI6YygidHJlZS1maWx0ZXItY2xlYXIiLCJjbG9zZSIpLHRyZWVJdGVtTG9hZGluZzpjKCJ0cmVlLWl0ZW0tbG9hZGluZyIsImxvYWRpbmciKSxtZW51U2VsZWN0aW9uOmMoIm1lbnUtc2VsZWN0aW9uIiwiY2hlY2siKSxtZW51U3VibWVudTpjKCJtZW51LXN1Ym1lbnUiLCJjaGV2cm9uLXJpZ2h0IiksbWVudUJhck1vcmU6YygibWVudWJhci1tb3JlIiwibW9yZSIpLHNjcm9sbGJhckJ1dHRvbkxlZnQ6Yygic2Nyb2xsYmFyLWJ1dHRvbi1sZWZ0IiwidHJpYW5nbGUtbGVmdCIpLHNjcm9sbGJhckJ1dHRvblJpZ2h0OmMoInNjcm9sbGJhci1idXR0b24tcmlnaHQiLCJ0cmlhbmdsZS1yaWdodCIpLHNjcm9sbGJhckJ1dHRvblVwOmMoInNjcm9sbGJhci1idXR0b24tdXAiLCJ0cmlhbmdsZS11cCIpLHNjcm9sbGJhckJ1dHRvbkRvd246Yygic2Nyb2xsYmFyLWJ1dHRvbi1kb3duIiwidHJpYW5nbGUtZG93biIpLHRvb2xCYXJNb3JlOmMoInRvb2xiYXItbW9yZSIsIm1vcmUiKSxxdWlja0lucHV0QmFjazpjKCJxdWljay1pbnB1dC1iYWNrIiwiYXJyb3ctbGVmdCIpLGRyb3BEb3duQnV0dG9uOmMoImRyb3AtZG93bi1idXR0b24iLDYwMDg0KSxzeW1ib2xDdXN0b21Db2xvcjpjKCJzeW1ib2wtY3VzdG9tY29sb3IiLDYwMjUyKSxleHBvcnRJY29uOmMoImV4cG9ydCIsNjAzMzIpLHdvcmtzcGFjZVVuc3BlY2lmaWVkOmMoIndvcmtzcGFjZS11bnNwZWNpZmllZCIsNjAzNTUpLG5ld0xpbmU6YygibmV3bGluZSIsNjAzOTQpLHRodW1ic0Rvd25GaWxsZWQ6YygidGh1bWJzZG93bi1maWxsZWQiLDYwNDM1KSx0aHVtYnNVcEZpbGxlZDpjKCJ0aHVtYnN1cC1maWxsZWQiLDYwNDM2KSxnaXRGZXRjaDpjKCJnaXQtZmV0Y2giLDYwNDQ1KSxsaWdodGJ1bGJTcGFya2xlQXV0b2ZpeDpjKCJsaWdodGJ1bGItc3BhcmtsZS1hdXRvZml4Iiw2MDQ0NyksZGVidWdCcmVha3BvaW50UGVuZGluZzpjKCJkZWJ1Zy1icmVha3BvaW50LXBlbmRpbmciLDYwMzc3KX0sVj17Li4uZ3UsLi4ucHV9O2NsYXNzIFRpe2NvbnN0cnVjdG9yKCl7dGhpcy5fdG9rZW5pemF0aW9uU3VwcG9ydHM9bmV3IE1hcCx0aGlzLl9mYWN0b3JpZXM9bmV3IE1hcCx0aGlzLl9vbkRpZENoYW5nZT1uZXcgX2UsdGhpcy5vbkRpZENoYW5nZT10aGlzLl9vbkRpZENoYW5nZS5ldmVudCx0aGlzLl9jb2xvck1hcD1udWxsfWhhbmRsZUNoYW5nZSh0KXt0aGlzLl9vbkRpZENoYW5nZS5maXJlKHtjaGFuZ2VkTGFuZ3VhZ2VzOnQsY2hhbmdlZENvbG9yTWFwOiExfSl9cmVnaXN0ZXIodCxuKXtyZXR1cm4gdGhpcy5fdG9rZW5pemF0aW9uU3VwcG9ydHMuc2V0KHQsbiksdGhpcy5oYW5kbGVDaGFuZ2UoW3RdKSxvbigoKT0+e3RoaXMuX3Rva2VuaXphdGlvblN1cHBvcnRzLmdldCh0KT09PW4mJih0aGlzLl90b2tlbml6YXRpb25TdXBwb3J0cy5kZWxldGUodCksdGhpcy5oYW5kbGVDaGFuZ2UoW3RdKSl9KX1nZXQodCl7cmV0dXJuIHRoaXMuX3Rva2VuaXphdGlvblN1cHBvcnRzLmdldCh0KXx8bnVsbH1yZWdpc3RlckZhY3RvcnkodCxuKXt2YXIgaTsoaT10aGlzLl9mYWN0b3JpZXMuZ2V0KHQpKT09bnVsbHx8aS5kaXNwb3NlKCk7Y29uc3Qgcj1uZXcgYnUodGhpcyx0LG4pO3JldHVybiB0aGlzLl9mYWN0b3JpZXMuc2V0KHQsciksb24oKCk9Pntjb25zdCBzPXRoaXMuX2ZhY3Rvcmllcy5nZXQodCk7IXN8fHMhPT1yfHwodGhpcy5fZmFjdG9yaWVzLmRlbGV0ZSh0KSxzLmRpc3Bvc2UoKSl9KX1hc3luYyBnZXRPckNyZWF0ZSh0KXtjb25zdCBuPXRoaXMuZ2V0KHQpO2lmKG4pcmV0dXJuIG47Y29uc3Qgcj10aGlzLl9mYWN0b3JpZXMuZ2V0KHQpO3JldHVybiFyfHxyLmlzUmVzb2x2ZWQ/bnVsbDooYXdhaXQgci5yZXNvbHZlKCksdGhpcy5nZXQodCkpfWlzUmVzb2x2ZWQodCl7aWYodGhpcy5nZXQodCkpcmV0dXJuITA7Y29uc3Qgcj10aGlzLl9mYWN0b3JpZXMuZ2V0KHQpO3JldHVybiEhKCFyfHxyLmlzUmVzb2x2ZWQpfXNldENvbG9yTWFwKHQpe3RoaXMuX2NvbG9yTWFwPXQsdGhpcy5fb25EaWRDaGFuZ2UuZmlyZSh7Y2hhbmdlZExhbmd1YWdlczpBcnJheS5mcm9tKHRoaXMuX3Rva2VuaXphdGlvblN1cHBvcnRzLmtleXMoKSksY2hhbmdlZENvbG9yTWFwOiEwfSl9Z2V0Q29sb3JNYXAoKXtyZXR1cm4gdGhpcy5fY29sb3JNYXB9Z2V0RGVmYXVsdEJhY2tncm91bmQoKXtyZXR1cm4gdGhpcy5fY29sb3JNYXAmJnRoaXMuX2NvbG9yTWFwLmxlbmd0aD4yP3RoaXMuX2NvbG9yTWFwWzJdOm51bGx9fWNsYXNzIGJ1IGV4dGVuZHMgbXR7Z2V0IGlzUmVzb2x2ZWQoKXtyZXR1cm4gdGhpcy5faXNSZXNvbHZlZH1jb25zdHJ1Y3Rvcih0LG4scil7c3VwZXIoKSx0aGlzLl9yZWdpc3RyeT10LHRoaXMuX2xhbmd1YWdlSWQ9bix0aGlzLl9mYWN0b3J5PXIsdGhpcy5faXNEaXNwb3NlZD0hMSx0aGlzLl9yZXNvbHZlUHJvbWlzZT1udWxsLHRoaXMuX2lzUmVzb2x2ZWQ9ITF9ZGlzcG9zZSgpe3RoaXMuX2lzRGlzcG9zZWQ9ITAsc3VwZXIuZGlzcG9zZSgpfWFzeW5jIHJlc29sdmUoKXtyZXR1cm4gdGhpcy5fcmVzb2x2ZVByb21pc2V8fCh0aGlzLl9yZXNvbHZlUHJvbWlzZT10aGlzLl9jcmVhdGUoKSksdGhpcy5fcmVzb2x2ZVByb21pc2V9YXN5bmMgX2NyZWF0ZSgpe2NvbnN0IHQ9YXdhaXQgdGhpcy5fZmFjdG9yeS50b2tlbml6YXRpb25TdXBwb3J0O3RoaXMuX2lzUmVzb2x2ZWQ9ITAsdCYmIXRoaXMuX2lzRGlzcG9zZWQmJnRoaXMuX3JlZ2lzdGVyKHRoaXMuX3JlZ2lzdHJ5LnJlZ2lzdGVyKHRoaXMuX2xhbmd1YWdlSWQsdCkpfX1jbGFzcyB2dXtjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy5vZmZzZXQ9dCx0aGlzLnR5cGU9bix0aGlzLmxhbmd1YWdlPXIsdGhpcy5fdG9rZW5CcmFuZD12b2lkIDB9dG9TdHJpbmcoKXtyZXR1cm4iKCIrdGhpcy5vZmZzZXQrIiwgIit0aGlzLnR5cGUrIikifX12YXIgUGk7KGZ1bmN0aW9uKGUpe2VbZS5JbmNyZWFzZT0wXT0iSW5jcmVhc2UiLGVbZS5EZWNyZWFzZT0xXT0iRGVjcmVhc2UifSkoUGl8fChQaT17fSkpO3ZhciBJaTsoZnVuY3Rpb24oZSl7Y29uc3QgdD1uZXcgTWFwO3Quc2V0KDAsVi5zeW1ib2xNZXRob2QpLHQuc2V0KDEsVi5zeW1ib2xGdW5jdGlvbiksdC5zZXQoMixWLnN5bWJvbENvbnN0cnVjdG9yKSx0LnNldCgzLFYuc3ltYm9sRmllbGQpLHQuc2V0KDQsVi5zeW1ib2xWYXJpYWJsZSksdC5zZXQoNSxWLnN5bWJvbENsYXNzKSx0LnNldCg2LFYuc3ltYm9sU3RydWN0KSx0LnNldCg3LFYuc3ltYm9sSW50ZXJmYWNlKSx0LnNldCg4LFYuc3ltYm9sTW9kdWxlKSx0LnNldCg5LFYuc3ltYm9sUHJvcGVydHkpLHQuc2V0KDEwLFYuc3ltYm9sRXZlbnQpLHQuc2V0KDExLFYuc3ltYm9sT3BlcmF0b3IpLHQuc2V0KDEyLFYuc3ltYm9sVW5pdCksdC5zZXQoMTMsVi5zeW1ib2xWYWx1ZSksdC5zZXQoMTUsVi5zeW1ib2xFbnVtKSx0LnNldCgxNCxWLnN5bWJvbENvbnN0YW50KSx0LnNldCgxNSxWLnN5bWJvbEVudW0pLHQuc2V0KDE2LFYuc3ltYm9sRW51bU1lbWJlciksdC5zZXQoMTcsVi5zeW1ib2xLZXl3b3JkKSx0LnNldCgyNyxWLnN5bWJvbFNuaXBwZXQpLHQuc2V0KDE4LFYuc3ltYm9sVGV4dCksdC5zZXQoMTksVi5zeW1ib2xDb2xvciksdC5zZXQoMjAsVi5zeW1ib2xGaWxlKSx0LnNldCgyMSxWLnN5bWJvbFJlZmVyZW5jZSksdC5zZXQoMjIsVi5zeW1ib2xDdXN0b21Db2xvciksdC5zZXQoMjMsVi5zeW1ib2xGb2xkZXIpLHQuc2V0KDI0LFYuc3ltYm9sVHlwZVBhcmFtZXRlciksdC5zZXQoMjUsVi5hY2NvdW50KSx0LnNldCgyNixWLmlzc3Vlcyk7ZnVuY3Rpb24gbihzKXtsZXQgYT10LmdldChzKTtyZXR1cm4gYXx8KGNvbnNvbGUuaW5mbygiTm8gY29kaWNvbiBmb3VuZCBmb3IgQ29tcGxldGlvbkl0ZW1LaW5kICIrcyksYT1WLnN5bWJvbFByb3BlcnR5KSxhfWUudG9JY29uPW47Y29uc3Qgcj1uZXcgTWFwO3Iuc2V0KCJtZXRob2QiLDApLHIuc2V0KCJmdW5jdGlvbiIsMSksci5zZXQoImNvbnN0cnVjdG9yIiwyKSxyLnNldCgiZmllbGQiLDMpLHIuc2V0KCJ2YXJpYWJsZSIsNCksci5zZXQoImNsYXNzIiw1KSxyLnNldCgic3RydWN0Iiw2KSxyLnNldCgiaW50ZXJmYWNlIiw3KSxyLnNldCgibW9kdWxlIiw4KSxyLnNldCgicHJvcGVydHkiLDkpLHIuc2V0KCJldmVudCIsMTApLHIuc2V0KCJvcGVyYXRvciIsMTEpLHIuc2V0KCJ1bml0IiwxMiksci5zZXQoInZhbHVlIiwxMyksci5zZXQoImNvbnN0YW50IiwxNCksci5zZXQoImVudW0iLDE1KSxyLnNldCgiZW51bS1tZW1iZXIiLDE2KSxyLnNldCgiZW51bU1lbWJlciIsMTYpLHIuc2V0KCJrZXl3b3JkIiwxNyksci5zZXQoInNuaXBwZXQiLDI3KSxyLnNldCgidGV4dCIsMTgpLHIuc2V0KCJjb2xvciIsMTkpLHIuc2V0KCJmaWxlIiwyMCksci5zZXQoInJlZmVyZW5jZSIsMjEpLHIuc2V0KCJjdXN0b21jb2xvciIsMjIpLHIuc2V0KCJmb2xkZXIiLDIzKSxyLnNldCgidHlwZS1wYXJhbWV0ZXIiLDI0KSxyLnNldCgidHlwZVBhcmFtZXRlciIsMjQpLHIuc2V0KCJhY2NvdW50IiwyNSksci5zZXQoImlzc3VlIiwyNik7ZnVuY3Rpb24gaShzLGEpe2xldCBsPXIuZ2V0KHMpO3JldHVybiB0eXBlb2YgbD4idSImJiFhJiYobD05KSxsfWUuZnJvbVN0cmluZz1pfSkoSWl8fChJaT17fSkpO3ZhciBGaTsoZnVuY3Rpb24oZSl7ZVtlLkF1dG9tYXRpYz0wXT0iQXV0b21hdGljIixlW2UuRXhwbGljaXQ9MV09IkV4cGxpY2l0In0pKEZpfHwoRmk9e30pKTt2YXIgVmk7KGZ1bmN0aW9uKGUpe2VbZS5BdXRvbWF0aWM9MF09IkF1dG9tYXRpYyIsZVtlLlBhc3RlQXM9MV09IlBhc3RlQXMifSkoVml8fChWaT17fSkpO3ZhciBEaTsoZnVuY3Rpb24oZSl7ZVtlLkludm9rZT0xXT0iSW52b2tlIixlW2UuVHJpZ2dlckNoYXJhY3Rlcj0yXT0iVHJpZ2dlckNoYXJhY3RlciIsZVtlLkNvbnRlbnRDaGFuZ2U9M109IkNvbnRlbnRDaGFuZ2UifSkoRGl8fChEaT17fSkpO3ZhciBPaTsoZnVuY3Rpb24oZSl7ZVtlLlRleHQ9MF09IlRleHQiLGVbZS5SZWFkPTFdPSJSZWFkIixlW2UuV3JpdGU9Ml09IldyaXRlIn0pKE9pfHwoT2k9e30pKSxYKCJBcnJheSIsImFycmF5IiksWCgiQm9vbGVhbiIsImJvb2xlYW4iKSxYKCJDbGFzcyIsImNsYXNzIiksWCgiQ29uc3RhbnQiLCJjb25zdGFudCIpLFgoIkNvbnN0cnVjdG9yIiwiY29uc3RydWN0b3IiKSxYKCJFbnVtIiwiZW51bWVyYXRpb24iKSxYKCJFbnVtTWVtYmVyIiwiZW51bWVyYXRpb24gbWVtYmVyIiksWCgiRXZlbnQiLCJldmVudCIpLFgoIkZpZWxkIiwiZmllbGQiKSxYKCJGaWxlIiwiZmlsZSIpLFgoIkZ1bmN0aW9uIiwiZnVuY3Rpb24iKSxYKCJJbnRlcmZhY2UiLCJpbnRlcmZhY2UiKSxYKCJLZXkiLCJrZXkiKSxYKCJNZXRob2QiLCJtZXRob2QiKSxYKCJNb2R1bGUiLCJtb2R1bGUiKSxYKCJOYW1lc3BhY2UiLCJuYW1lc3BhY2UiKSxYKCJOdWxsIiwibnVsbCIpLFgoIk51bWJlciIsIm51bWJlciIpLFgoIk9iamVjdCIsIm9iamVjdCIpLFgoIk9wZXJhdG9yIiwib3BlcmF0b3IiKSxYKCJQYWNrYWdlIiwicGFja2FnZSIpLFgoIlByb3BlcnR5IiwicHJvcGVydHkiKSxYKCJTdHJpbmciLCJzdHJpbmciKSxYKCJTdHJ1Y3QiLCJzdHJ1Y3QiKSxYKCJUeXBlUGFyYW1ldGVyIiwidHlwZSBwYXJhbWV0ZXIiKSxYKCJWYXJpYWJsZSIsInZhcmlhYmxlIik7dmFyICRpOyhmdW5jdGlvbihlKXtjb25zdCB0PW5ldyBNYXA7dC5zZXQoMCxWLnN5bWJvbEZpbGUpLHQuc2V0KDEsVi5zeW1ib2xNb2R1bGUpLHQuc2V0KDIsVi5zeW1ib2xOYW1lc3BhY2UpLHQuc2V0KDMsVi5zeW1ib2xQYWNrYWdlKSx0LnNldCg0LFYuc3ltYm9sQ2xhc3MpLHQuc2V0KDUsVi5zeW1ib2xNZXRob2QpLHQuc2V0KDYsVi5zeW1ib2xQcm9wZXJ0eSksdC5zZXQoNyxWLnN5bWJvbEZpZWxkKSx0LnNldCg4LFYuc3ltYm9sQ29uc3RydWN0b3IpLHQuc2V0KDksVi5zeW1ib2xFbnVtKSx0LnNldCgxMCxWLnN5bWJvbEludGVyZmFjZSksdC5zZXQoMTEsVi5zeW1ib2xGdW5jdGlvbiksdC5zZXQoMTIsVi5zeW1ib2xWYXJpYWJsZSksdC5zZXQoMTMsVi5zeW1ib2xDb25zdGFudCksdC5zZXQoMTQsVi5zeW1ib2xTdHJpbmcpLHQuc2V0KDE1LFYuc3ltYm9sTnVtYmVyKSx0LnNldCgxNixWLnN5bWJvbEJvb2xlYW4pLHQuc2V0KDE3LFYuc3ltYm9sQXJyYXkpLHQuc2V0KDE4LFYuc3ltYm9sT2JqZWN0KSx0LnNldCgxOSxWLnN5bWJvbEtleSksdC5zZXQoMjAsVi5zeW1ib2xOdWxsKSx0LnNldCgyMSxWLnN5bWJvbEVudW1NZW1iZXIpLHQuc2V0KDIyLFYuc3ltYm9sU3RydWN0KSx0LnNldCgyMyxWLnN5bWJvbEV2ZW50KSx0LnNldCgyNCxWLnN5bWJvbE9wZXJhdG9yKSx0LnNldCgyNSxWLnN5bWJvbFR5cGVQYXJhbWV0ZXIpO2Z1bmN0aW9uIG4ocil7bGV0IGk9dC5nZXQocik7cmV0dXJuIGl8fChjb25zb2xlLmluZm8oIk5vIGNvZGljb24gZm91bmQgZm9yIFN5bWJvbEtpbmQgIityKSxpPVYuc3ltYm9sUHJvcGVydHkpLGl9ZS50b0ljb249bn0pKCRpfHwoJGk9e30pKTtsZXQgRzE9KG1lPWNsYXNze3N0YXRpYyBmcm9tVmFsdWUodCl7c3dpdGNoKHQpe2Nhc2UiY29tbWVudCI6cmV0dXJuIG1lLkNvbW1lbnQ7Y2FzZSJpbXBvcnRzIjpyZXR1cm4gbWUuSW1wb3J0cztjYXNlInJlZ2lvbiI6cmV0dXJuIG1lLlJlZ2lvbn1yZXR1cm4gbmV3IG1lKHQpfWNvbnN0cnVjdG9yKHQpe3RoaXMudmFsdWU9dH19LG1lLkNvbW1lbnQ9bmV3IG1lKCJjb21tZW50IiksbWUuSW1wb3J0cz1uZXcgbWUoImltcG9ydHMiKSxtZS5SZWdpb249bmV3IG1lKCJyZWdpb24iKSxtZSk7dmFyIFVpOyhmdW5jdGlvbihlKXtlW2UuQUlHZW5lcmF0ZWQ9MV09IkFJR2VuZXJhdGVkIn0pKFVpfHwoVWk9e30pKTt2YXIgQmk7KGZ1bmN0aW9uKGUpe2VbZS5JbnZva2U9MF09Ikludm9rZSIsZVtlLkF1dG9tYXRpYz0xXT0iQXV0b21hdGljIn0pKEJpfHwoQmk9e30pKTt2YXIgcWk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7cmV0dXJuIW58fHR5cGVvZiBuIT0ib2JqZWN0Ij8hMTp0eXBlb2Ygbi5pZD09InN0cmluZyImJnR5cGVvZiBuLnRpdGxlPT0ic3RyaW5nIn1lLmlzPXR9KShxaXx8KHFpPXt9KSk7dmFyIGppOyhmdW5jdGlvbihlKXtlW2UuVHlwZT0xXT0iVHlwZSIsZVtlLlBhcmFtZXRlcj0yXT0iUGFyYW1ldGVyIn0pKGppfHwoamk9e30pKSxuZXcgVGksbmV3IFRpO3ZhciBXaTsoZnVuY3Rpb24oZSl7ZVtlLkludm9rZT0wXT0iSW52b2tlIixlW2UuQXV0b21hdGljPTFdPSJBdXRvbWF0aWMifSkoV2l8fChXaT17fSkpO3ZhciBIaTsoZnVuY3Rpb24oZSl7ZVtlLlVua25vd249MF09IlVua25vd24iLGVbZS5EaXNhYmxlZD0xXT0iRGlzYWJsZWQiLGVbZS5FbmFibGVkPTJdPSJFbmFibGVkIn0pKEhpfHwoSGk9e30pKTt2YXIgemk7KGZ1bmN0aW9uKGUpe2VbZS5JbnZva2U9MV09Ikludm9rZSIsZVtlLkF1dG89Ml09IkF1dG8ifSkoeml8fCh6aT17fSkpO3ZhciBHaTsoZnVuY3Rpb24oZSl7ZVtlLk5vbmU9MF09Ik5vbmUiLGVbZS5LZWVwV2hpdGVzcGFjZT0xXT0iS2VlcFdoaXRlc3BhY2UiLGVbZS5JbnNlcnRBc1NuaXBwZXQ9NF09Ikluc2VydEFzU25pcHBldCJ9KShHaXx8KEdpPXt9KSk7dmFyIEppOyhmdW5jdGlvbihlKXtlW2UuTWV0aG9kPTBdPSJNZXRob2QiLGVbZS5GdW5jdGlvbj0xXT0iRnVuY3Rpb24iLGVbZS5Db25zdHJ1Y3Rvcj0yXT0iQ29uc3RydWN0b3IiLGVbZS5GaWVsZD0zXT0iRmllbGQiLGVbZS5WYXJpYWJsZT00XT0iVmFyaWFibGUiLGVbZS5DbGFzcz01XT0iQ2xhc3MiLGVbZS5TdHJ1Y3Q9Nl09IlN0cnVjdCIsZVtlLkludGVyZmFjZT03XT0iSW50ZXJmYWNlIixlW2UuTW9kdWxlPThdPSJNb2R1bGUiLGVbZS5Qcm9wZXJ0eT05XT0iUHJvcGVydHkiLGVbZS5FdmVudD0xMF09IkV2ZW50IixlW2UuT3BlcmF0b3I9MTFdPSJPcGVyYXRvciIsZVtlLlVuaXQ9MTJdPSJVbml0IixlW2UuVmFsdWU9MTNdPSJWYWx1ZSIsZVtlLkNvbnN0YW50PTE0XT0iQ29uc3RhbnQiLGVbZS5FbnVtPTE1XT0iRW51bSIsZVtlLkVudW1NZW1iZXI9MTZdPSJFbnVtTWVtYmVyIixlW2UuS2V5d29yZD0xN109IktleXdvcmQiLGVbZS5UZXh0PTE4XT0iVGV4dCIsZVtlLkNvbG9yPTE5XT0iQ29sb3IiLGVbZS5GaWxlPTIwXT0iRmlsZSIsZVtlLlJlZmVyZW5jZT0yMV09IlJlZmVyZW5jZSIsZVtlLkN1c3RvbWNvbG9yPTIyXT0iQ3VzdG9tY29sb3IiLGVbZS5Gb2xkZXI9MjNdPSJGb2xkZXIiLGVbZS5UeXBlUGFyYW1ldGVyPTI0XT0iVHlwZVBhcmFtZXRlciIsZVtlLlVzZXI9MjVdPSJVc2VyIixlW2UuSXNzdWU9MjZdPSJJc3N1ZSIsZVtlLlNuaXBwZXQ9MjddPSJTbmlwcGV0In0pKEppfHwoSmk9e30pKTt2YXIgWGk7KGZ1bmN0aW9uKGUpe2VbZS5EZXByZWNhdGVkPTFdPSJEZXByZWNhdGVkIn0pKFhpfHwoWGk9e30pKTt2YXIgUWk7KGZ1bmN0aW9uKGUpe2VbZS5JbnZva2U9MF09Ikludm9rZSIsZVtlLlRyaWdnZXJDaGFyYWN0ZXI9MV09IlRyaWdnZXJDaGFyYWN0ZXIiLGVbZS5UcmlnZ2VyRm9ySW5jb21wbGV0ZUNvbXBsZXRpb25zPTJdPSJUcmlnZ2VyRm9ySW5jb21wbGV0ZUNvbXBsZXRpb25zIn0pKFFpfHwoUWk9e30pKTt2YXIgWWk7KGZ1bmN0aW9uKGUpe2VbZS5FWEFDVD0wXT0iRVhBQ1QiLGVbZS5BQk9WRT0xXT0iQUJPVkUiLGVbZS5CRUxPVz0yXT0iQkVMT1cifSkoWWl8fChZaT17fSkpO3ZhciBaaTsoZnVuY3Rpb24oZSl7ZVtlLk5vdFNldD0wXT0iTm90U2V0IixlW2UuQ29udGVudEZsdXNoPTFdPSJDb250ZW50Rmx1c2giLGVbZS5SZWNvdmVyRnJvbU1hcmtlcnM9Ml09IlJlY292ZXJGcm9tTWFya2VycyIsZVtlLkV4cGxpY2l0PTNdPSJFeHBsaWNpdCIsZVtlLlBhc3RlPTRdPSJQYXN0ZSIsZVtlLlVuZG89NV09IlVuZG8iLGVbZS5SZWRvPTZdPSJSZWRvIn0pKFppfHwoWmk9e30pKTt2YXIgS2k7KGZ1bmN0aW9uKGUpe2VbZS5MRj0xXT0iTEYiLGVbZS5DUkxGPTJdPSJDUkxGIn0pKEtpfHwoS2k9e30pKTt2YXIgZXM7KGZ1bmN0aW9uKGUpe2VbZS5UZXh0PTBdPSJUZXh0IixlW2UuUmVhZD0xXT0iUmVhZCIsZVtlLldyaXRlPTJdPSJXcml0ZSJ9KShlc3x8KGVzPXt9KSk7dmFyIHRzOyhmdW5jdGlvbihlKXtlW2UuTm9uZT0wXT0iTm9uZSIsZVtlLktlZXA9MV09IktlZXAiLGVbZS5CcmFja2V0cz0yXT0iQnJhY2tldHMiLGVbZS5BZHZhbmNlZD0zXT0iQWR2YW5jZWQiLGVbZS5GdWxsPTRdPSJGdWxsIn0pKHRzfHwodHM9e30pKTt2YXIgbnM7KGZ1bmN0aW9uKGUpe2VbZS5hY2NlcHRTdWdnZXN0aW9uT25Db21taXRDaGFyYWN0ZXI9MF09ImFjY2VwdFN1Z2dlc3Rpb25PbkNvbW1pdENoYXJhY3RlciIsZVtlLmFjY2VwdFN1Z2dlc3Rpb25PbkVudGVyPTFdPSJhY2NlcHRTdWdnZXN0aW9uT25FbnRlciIsZVtlLmFjY2Vzc2liaWxpdHlTdXBwb3J0PTJdPSJhY2Nlc3NpYmlsaXR5U3VwcG9ydCIsZVtlLmFjY2Vzc2liaWxpdHlQYWdlU2l6ZT0zXT0iYWNjZXNzaWJpbGl0eVBhZ2VTaXplIixlW2UuYXJpYUxhYmVsPTRdPSJhcmlhTGFiZWwiLGVbZS5hcmlhUmVxdWlyZWQ9NV09ImFyaWFSZXF1aXJlZCIsZVtlLmF1dG9DbG9zaW5nQnJhY2tldHM9Nl09ImF1dG9DbG9zaW5nQnJhY2tldHMiLGVbZS5hdXRvQ2xvc2luZ0NvbW1lbnRzPTddPSJhdXRvQ2xvc2luZ0NvbW1lbnRzIixlW2Uuc2NyZWVuUmVhZGVyQW5ub3VuY2VJbmxpbmVTdWdnZXN0aW9uPThdPSJzY3JlZW5SZWFkZXJBbm5vdW5jZUlubGluZVN1Z2dlc3Rpb24iLGVbZS5hdXRvQ2xvc2luZ0RlbGV0ZT05XT0iYXV0b0Nsb3NpbmdEZWxldGUiLGVbZS5hdXRvQ2xvc2luZ092ZXJ0eXBlPTEwXT0iYXV0b0Nsb3NpbmdPdmVydHlwZSIsZVtlLmF1dG9DbG9zaW5nUXVvdGVzPTExXT0iYXV0b0Nsb3NpbmdRdW90ZXMiLGVbZS5hdXRvSW5kZW50PTEyXT0iYXV0b0luZGVudCIsZVtlLmF1dG9tYXRpY0xheW91dD0xM109ImF1dG9tYXRpY0xheW91dCIsZVtlLmF1dG9TdXJyb3VuZD0xNF09ImF1dG9TdXJyb3VuZCIsZVtlLmJyYWNrZXRQYWlyQ29sb3JpemF0aW9uPTE1XT0iYnJhY2tldFBhaXJDb2xvcml6YXRpb24iLGVbZS5ndWlkZXM9MTZdPSJndWlkZXMiLGVbZS5jb2RlTGVucz0xN109ImNvZGVMZW5zIixlW2UuY29kZUxlbnNGb250RmFtaWx5PTE4XT0iY29kZUxlbnNGb250RmFtaWx5IixlW2UuY29kZUxlbnNGb250U2l6ZT0xOV09ImNvZGVMZW5zRm9udFNpemUiLGVbZS5jb2xvckRlY29yYXRvcnM9MjBdPSJjb2xvckRlY29yYXRvcnMiLGVbZS5jb2xvckRlY29yYXRvcnNMaW1pdD0yMV09ImNvbG9yRGVjb3JhdG9yc0xpbWl0IixlW2UuY29sdW1uU2VsZWN0aW9uPTIyXT0iY29sdW1uU2VsZWN0aW9uIixlW2UuY29tbWVudHM9MjNdPSJjb21tZW50cyIsZVtlLmNvbnRleHRtZW51PTI0XT0iY29udGV4dG1lbnUiLGVbZS5jb3B5V2l0aFN5bnRheEhpZ2hsaWdodGluZz0yNV09ImNvcHlXaXRoU3ludGF4SGlnaGxpZ2h0aW5nIixlW2UuY3Vyc29yQmxpbmtpbmc9MjZdPSJjdXJzb3JCbGlua2luZyIsZVtlLmN1cnNvclNtb290aENhcmV0QW5pbWF0aW9uPTI3XT0iY3Vyc29yU21vb3RoQ2FyZXRBbmltYXRpb24iLGVbZS5jdXJzb3JTdHlsZT0yOF09ImN1cnNvclN0eWxlIixlW2UuY3Vyc29yU3Vycm91bmRpbmdMaW5lcz0yOV09ImN1cnNvclN1cnJvdW5kaW5nTGluZXMiLGVbZS5jdXJzb3JTdXJyb3VuZGluZ0xpbmVzU3R5bGU9MzBdPSJjdXJzb3JTdXJyb3VuZGluZ0xpbmVzU3R5bGUiLGVbZS5jdXJzb3JXaWR0aD0zMV09ImN1cnNvcldpZHRoIixlW2UuZGlzYWJsZUxheWVySGludGluZz0zMl09ImRpc2FibGVMYXllckhpbnRpbmciLGVbZS5kaXNhYmxlTW9ub3NwYWNlT3B0aW1pemF0aW9ucz0zM109ImRpc2FibGVNb25vc3BhY2VPcHRpbWl6YXRpb25zIixlW2UuZG9tUmVhZE9ubHk9MzRdPSJkb21SZWFkT25seSIsZVtlLmRyYWdBbmREcm9wPTM1XT0iZHJhZ0FuZERyb3AiLGVbZS5kcm9wSW50b0VkaXRvcj0zNl09ImRyb3BJbnRvRWRpdG9yIixlW2UuZW1wdHlTZWxlY3Rpb25DbGlwYm9hcmQ9MzddPSJlbXB0eVNlbGVjdGlvbkNsaXBib2FyZCIsZVtlLmV4cGVyaW1lbnRhbFdoaXRlc3BhY2VSZW5kZXJpbmc9MzhdPSJleHBlcmltZW50YWxXaGl0ZXNwYWNlUmVuZGVyaW5nIixlW2UuZXh0cmFFZGl0b3JDbGFzc05hbWU9MzldPSJleHRyYUVkaXRvckNsYXNzTmFtZSIsZVtlLmZhc3RTY3JvbGxTZW5zaXRpdml0eT00MF09ImZhc3RTY3JvbGxTZW5zaXRpdml0eSIsZVtlLmZpbmQ9NDFdPSJmaW5kIixlW2UuZml4ZWRPdmVyZmxvd1dpZGdldHM9NDJdPSJmaXhlZE92ZXJmbG93V2lkZ2V0cyIsZVtlLmZvbGRpbmc9NDNdPSJmb2xkaW5nIixlW2UuZm9sZGluZ1N0cmF0ZWd5PTQ0XT0iZm9sZGluZ1N0cmF0ZWd5IixlW2UuZm9sZGluZ0hpZ2hsaWdodD00NV09ImZvbGRpbmdIaWdobGlnaHQiLGVbZS5mb2xkaW5nSW1wb3J0c0J5RGVmYXVsdD00Nl09ImZvbGRpbmdJbXBvcnRzQnlEZWZhdWx0IixlW2UuZm9sZGluZ01heGltdW1SZWdpb25zPTQ3XT0iZm9sZGluZ01heGltdW1SZWdpb25zIixlW2UudW5mb2xkT25DbGlja0FmdGVyRW5kT2ZMaW5lPTQ4XT0idW5mb2xkT25DbGlja0FmdGVyRW5kT2ZMaW5lIixlW2UuZm9udEZhbWlseT00OV09ImZvbnRGYW1pbHkiLGVbZS5mb250SW5mbz01MF09ImZvbnRJbmZvIixlW2UuZm9udExpZ2F0dXJlcz01MV09ImZvbnRMaWdhdHVyZXMiLGVbZS5mb250U2l6ZT01Ml09ImZvbnRTaXplIixlW2UuZm9udFdlaWdodD01M109ImZvbnRXZWlnaHQiLGVbZS5mb250VmFyaWF0aW9ucz01NF09ImZvbnRWYXJpYXRpb25zIixlW2UuZm9ybWF0T25QYXN0ZT01NV09ImZvcm1hdE9uUGFzdGUiLGVbZS5mb3JtYXRPblR5cGU9NTZdPSJmb3JtYXRPblR5cGUiLGVbZS5nbHlwaE1hcmdpbj01N109ImdseXBoTWFyZ2luIixlW2UuZ290b0xvY2F0aW9uPTU4XT0iZ290b0xvY2F0aW9uIixlW2UuaGlkZUN1cnNvckluT3ZlcnZpZXdSdWxlcj01OV09ImhpZGVDdXJzb3JJbk92ZXJ2aWV3UnVsZXIiLGVbZS5ob3Zlcj02MF09ImhvdmVyIixlW2UuaW5EaWZmRWRpdG9yPTYxXT0iaW5EaWZmRWRpdG9yIixlW2UuaW5saW5lU3VnZ2VzdD02Ml09ImlubGluZVN1Z2dlc3QiLGVbZS5pbmxpbmVFZGl0PTYzXT0iaW5saW5lRWRpdCIsZVtlLmxldHRlclNwYWNpbmc9NjRdPSJsZXR0ZXJTcGFjaW5nIixlW2UubGlnaHRidWxiPTY1XT0ibGlnaHRidWxiIixlW2UubGluZURlY29yYXRpb25zV2lkdGg9NjZdPSJsaW5lRGVjb3JhdGlvbnNXaWR0aCIsZVtlLmxpbmVIZWlnaHQ9NjddPSJsaW5lSGVpZ2h0IixlW2UubGluZU51bWJlcnM9NjhdPSJsaW5lTnVtYmVycyIsZVtlLmxpbmVOdW1iZXJzTWluQ2hhcnM9NjldPSJsaW5lTnVtYmVyc01pbkNoYXJzIixlW2UubGlua2VkRWRpdGluZz03MF09ImxpbmtlZEVkaXRpbmciLGVbZS5saW5rcz03MV09ImxpbmtzIixlW2UubWF0Y2hCcmFja2V0cz03Ml09Im1hdGNoQnJhY2tldHMiLGVbZS5taW5pbWFwPTczXT0ibWluaW1hcCIsZVtlLm1vdXNlU3R5bGU9NzRdPSJtb3VzZVN0eWxlIixlW2UubW91c2VXaGVlbFNjcm9sbFNlbnNpdGl2aXR5PTc1XT0ibW91c2VXaGVlbFNjcm9sbFNlbnNpdGl2aXR5IixlW2UubW91c2VXaGVlbFpvb209NzZdPSJtb3VzZVdoZWVsWm9vbSIsZVtlLm11bHRpQ3Vyc29yTWVyZ2VPdmVybGFwcGluZz03N109Im11bHRpQ3Vyc29yTWVyZ2VPdmVybGFwcGluZyIsZVtlLm11bHRpQ3Vyc29yTW9kaWZpZXI9NzhdPSJtdWx0aUN1cnNvck1vZGlmaWVyIixlW2UubXVsdGlDdXJzb3JQYXN0ZT03OV09Im11bHRpQ3Vyc29yUGFzdGUiLGVbZS5tdWx0aUN1cnNvckxpbWl0PTgwXT0ibXVsdGlDdXJzb3JMaW1pdCIsZVtlLm9jY3VycmVuY2VzSGlnaGxpZ2h0PTgxXT0ib2NjdXJyZW5jZXNIaWdobGlnaHQiLGVbZS5vdmVydmlld1J1bGVyQm9yZGVyPTgyXT0ib3ZlcnZpZXdSdWxlckJvcmRlciIsZVtlLm92ZXJ2aWV3UnVsZXJMYW5lcz04M109Im92ZXJ2aWV3UnVsZXJMYW5lcyIsZVtlLnBhZGRpbmc9ODRdPSJwYWRkaW5nIixlW2UucGFzdGVBcz04NV09InBhc3RlQXMiLGVbZS5wYXJhbWV0ZXJIaW50cz04Nl09InBhcmFtZXRlckhpbnRzIixlW2UucGVla1dpZGdldERlZmF1bHRGb2N1cz04N109InBlZWtXaWRnZXREZWZhdWx0Rm9jdXMiLGVbZS5wbGFjZWhvbGRlcj04OF09InBsYWNlaG9sZGVyIixlW2UuZGVmaW5pdGlvbkxpbmtPcGVuc0luUGVlaz04OV09ImRlZmluaXRpb25MaW5rT3BlbnNJblBlZWsiLGVbZS5xdWlja1N1Z2dlc3Rpb25zPTkwXT0icXVpY2tTdWdnZXN0aW9ucyIsZVtlLnF1aWNrU3VnZ2VzdGlvbnNEZWxheT05MV09InF1aWNrU3VnZ2VzdGlvbnNEZWxheSIsZVtlLnJlYWRPbmx5PTkyXT0icmVhZE9ubHkiLGVbZS5yZWFkT25seU1lc3NhZ2U9OTNdPSJyZWFkT25seU1lc3NhZ2UiLGVbZS5yZW5hbWVPblR5cGU9OTRdPSJyZW5hbWVPblR5cGUiLGVbZS5yZW5kZXJDb250cm9sQ2hhcmFjdGVycz05NV09InJlbmRlckNvbnRyb2xDaGFyYWN0ZXJzIixlW2UucmVuZGVyRmluYWxOZXdsaW5lPTk2XT0icmVuZGVyRmluYWxOZXdsaW5lIixlW2UucmVuZGVyTGluZUhpZ2hsaWdodD05N109InJlbmRlckxpbmVIaWdobGlnaHQiLGVbZS5yZW5kZXJMaW5lSGlnaGxpZ2h0T25seVdoZW5Gb2N1cz05OF09InJlbmRlckxpbmVIaWdobGlnaHRPbmx5V2hlbkZvY3VzIixlW2UucmVuZGVyVmFsaWRhdGlvbkRlY29yYXRpb25zPTk5XT0icmVuZGVyVmFsaWRhdGlvbkRlY29yYXRpb25zIixlW2UucmVuZGVyV2hpdGVzcGFjZT0xMDBdPSJyZW5kZXJXaGl0ZXNwYWNlIixlW2UucmV2ZWFsSG9yaXpvbnRhbFJpZ2h0UGFkZGluZz0xMDFdPSJyZXZlYWxIb3Jpem9udGFsUmlnaHRQYWRkaW5nIixlW2Uucm91bmRlZFNlbGVjdGlvbj0xMDJdPSJyb3VuZGVkU2VsZWN0aW9uIixlW2UucnVsZXJzPTEwM109InJ1bGVycyIsZVtlLnNjcm9sbGJhcj0xMDRdPSJzY3JvbGxiYXIiLGVbZS5zY3JvbGxCZXlvbmRMYXN0Q29sdW1uPTEwNV09InNjcm9sbEJleW9uZExhc3RDb2x1bW4iLGVbZS5zY3JvbGxCZXlvbmRMYXN0TGluZT0xMDZdPSJzY3JvbGxCZXlvbmRMYXN0TGluZSIsZVtlLnNjcm9sbFByZWRvbWluYW50QXhpcz0xMDddPSJzY3JvbGxQcmVkb21pbmFudEF4aXMiLGVbZS5zZWxlY3Rpb25DbGlwYm9hcmQ9MTA4XT0ic2VsZWN0aW9uQ2xpcGJvYXJkIixlW2Uuc2VsZWN0aW9uSGlnaGxpZ2h0PTEwOV09InNlbGVjdGlvbkhpZ2hsaWdodCIsZVtlLnNlbGVjdE9uTGluZU51bWJlcnM9MTEwXT0ic2VsZWN0T25MaW5lTnVtYmVycyIsZVtlLnNob3dGb2xkaW5nQ29udHJvbHM9MTExXT0ic2hvd0ZvbGRpbmdDb250cm9scyIsZVtlLnNob3dVbnVzZWQ9MTEyXT0ic2hvd1VudXNlZCIsZVtlLnNuaXBwZXRTdWdnZXN0aW9ucz0xMTNdPSJzbmlwcGV0U3VnZ2VzdGlvbnMiLGVbZS5zbWFydFNlbGVjdD0xMTRdPSJzbWFydFNlbGVjdCIsZVtlLnNtb290aFNjcm9sbGluZz0xMTVdPSJzbW9vdGhTY3JvbGxpbmciLGVbZS5zdGlja3lTY3JvbGw9MTE2XT0ic3RpY2t5U2Nyb2xsIixlW2Uuc3RpY2t5VGFiU3RvcHM9MTE3XT0ic3RpY2t5VGFiU3RvcHMiLGVbZS5zdG9wUmVuZGVyaW5nTGluZUFmdGVyPTExOF09InN0b3BSZW5kZXJpbmdMaW5lQWZ0ZXIiLGVbZS5zdWdnZXN0PTExOV09InN1Z2dlc3QiLGVbZS5zdWdnZXN0Rm9udFNpemU9MTIwXT0ic3VnZ2VzdEZvbnRTaXplIixlW2Uuc3VnZ2VzdExpbmVIZWlnaHQ9MTIxXT0ic3VnZ2VzdExpbmVIZWlnaHQiLGVbZS5zdWdnZXN0T25UcmlnZ2VyQ2hhcmFjdGVycz0xMjJdPSJzdWdnZXN0T25UcmlnZ2VyQ2hhcmFjdGVycyIsZVtlLnN1Z2dlc3RTZWxlY3Rpb249MTIzXT0ic3VnZ2VzdFNlbGVjdGlvbiIsZVtlLnRhYkNvbXBsZXRpb249MTI0XT0idGFiQ29tcGxldGlvbiIsZVtlLnRhYkluZGV4PTEyNV09InRhYkluZGV4IixlW2UudW5pY29kZUhpZ2hsaWdodGluZz0xMjZdPSJ1bmljb2RlSGlnaGxpZ2h0aW5nIixlW2UudW51c3VhbExpbmVUZXJtaW5hdG9ycz0xMjddPSJ1bnVzdWFsTGluZVRlcm1pbmF0b3JzIixlW2UudXNlU2hhZG93RE9NPTEyOF09InVzZVNoYWRvd0RPTSIsZVtlLnVzZVRhYlN0b3BzPTEyOV09InVzZVRhYlN0b3BzIixlW2Uud29yZEJyZWFrPTEzMF09IndvcmRCcmVhayIsZVtlLndvcmRTZWdtZW50ZXJMb2NhbGVzPTEzMV09IndvcmRTZWdtZW50ZXJMb2NhbGVzIixlW2Uud29yZFNlcGFyYXRvcnM9MTMyXT0id29yZFNlcGFyYXRvcnMiLGVbZS53b3JkV3JhcD0xMzNdPSJ3b3JkV3JhcCIsZVtlLndvcmRXcmFwQnJlYWtBZnRlckNoYXJhY3RlcnM9MTM0XT0id29yZFdyYXBCcmVha0FmdGVyQ2hhcmFjdGVycyIsZVtlLndvcmRXcmFwQnJlYWtCZWZvcmVDaGFyYWN0ZXJzPTEzNV09IndvcmRXcmFwQnJlYWtCZWZvcmVDaGFyYWN0ZXJzIixlW2Uud29yZFdyYXBDb2x1bW49MTM2XT0id29yZFdyYXBDb2x1bW4iLGVbZS53b3JkV3JhcE92ZXJyaWRlMT0xMzddPSJ3b3JkV3JhcE92ZXJyaWRlMSIsZVtlLndvcmRXcmFwT3ZlcnJpZGUyPTEzOF09IndvcmRXcmFwT3ZlcnJpZGUyIixlW2Uud3JhcHBpbmdJbmRlbnQ9MTM5XT0id3JhcHBpbmdJbmRlbnQiLGVbZS53cmFwcGluZ1N0cmF0ZWd5PTE0MF09IndyYXBwaW5nU3RyYXRlZ3kiLGVbZS5zaG93RGVwcmVjYXRlZD0xNDFdPSJzaG93RGVwcmVjYXRlZCIsZVtlLmlubGF5SGludHM9MTQyXT0iaW5sYXlIaW50cyIsZVtlLmVkaXRvckNsYXNzTmFtZT0xNDNdPSJlZGl0b3JDbGFzc05hbWUiLGVbZS5waXhlbFJhdGlvPTE0NF09InBpeGVsUmF0aW8iLGVbZS50YWJGb2N1c01vZGU9MTQ1XT0idGFiRm9jdXNNb2RlIixlW2UubGF5b3V0SW5mbz0xNDZdPSJsYXlvdXRJbmZvIixlW2Uud3JhcHBpbmdJbmZvPTE0N109IndyYXBwaW5nSW5mbyIsZVtlLmRlZmF1bHRDb2xvckRlY29yYXRvcnM9MTQ4XT0iZGVmYXVsdENvbG9yRGVjb3JhdG9ycyIsZVtlLmNvbG9yRGVjb3JhdG9yc0FjdGl2YXRlZE9uPTE0OV09ImNvbG9yRGVjb3JhdG9yc0FjdGl2YXRlZE9uIixlW2UuaW5saW5lQ29tcGxldGlvbnNBY2Nlc3NpYmlsaXR5VmVyYm9zZT0xNTBdPSJpbmxpbmVDb21wbGV0aW9uc0FjY2Vzc2liaWxpdHlWZXJib3NlIn0pKG5zfHwobnM9e30pKTt2YXIgcnM7KGZ1bmN0aW9uKGUpe2VbZS5UZXh0RGVmaW5lZD0wXT0iVGV4dERlZmluZWQiLGVbZS5MRj0xXT0iTEYiLGVbZS5DUkxGPTJdPSJDUkxGIn0pKHJzfHwocnM9e30pKTt2YXIgaXM7KGZ1bmN0aW9uKGUpe2VbZS5MRj0wXT0iTEYiLGVbZS5DUkxGPTFdPSJDUkxGIn0pKGlzfHwoaXM9e30pKTt2YXIgc3M7KGZ1bmN0aW9uKGUpe2VbZS5MZWZ0PTFdPSJMZWZ0IixlW2UuQ2VudGVyPTJdPSJDZW50ZXIiLGVbZS5SaWdodD0zXT0iUmlnaHQifSkoc3N8fChzcz17fSkpO3ZhciBhczsoZnVuY3Rpb24oZSl7ZVtlLkluY3JlYXNlPTBdPSJJbmNyZWFzZSIsZVtlLkRlY3JlYXNlPTFdPSJEZWNyZWFzZSJ9KShhc3x8KGFzPXt9KSk7dmFyIG9zOyhmdW5jdGlvbihlKXtlW2UuTm9uZT0wXT0iTm9uZSIsZVtlLkluZGVudD0xXT0iSW5kZW50IixlW2UuSW5kZW50T3V0ZGVudD0yXT0iSW5kZW50T3V0ZGVudCIsZVtlLk91dGRlbnQ9M109Ik91dGRlbnQifSkob3N8fChvcz17fSkpO3ZhciBsczsoZnVuY3Rpb24oZSl7ZVtlLkJvdGg9MF09IkJvdGgiLGVbZS5SaWdodD0xXT0iUmlnaHQiLGVbZS5MZWZ0PTJdPSJMZWZ0IixlW2UuTm9uZT0zXT0iTm9uZSJ9KShsc3x8KGxzPXt9KSk7dmFyIHVzOyhmdW5jdGlvbihlKXtlW2UuVHlwZT0xXT0iVHlwZSIsZVtlLlBhcmFtZXRlcj0yXT0iUGFyYW1ldGVyIn0pKHVzfHwodXM9e30pKTt2YXIgY3M7KGZ1bmN0aW9uKGUpe2VbZS5BdXRvbWF0aWM9MF09IkF1dG9tYXRpYyIsZVtlLkV4cGxpY2l0PTFdPSJFeHBsaWNpdCJ9KShjc3x8KGNzPXt9KSk7dmFyIGZzOyhmdW5jdGlvbihlKXtlW2UuSW52b2tlPTBdPSJJbnZva2UiLGVbZS5BdXRvbWF0aWM9MV09IkF1dG9tYXRpYyJ9KShmc3x8KGZzPXt9KSk7dmFyIG1yOyhmdW5jdGlvbihlKXtlW2UuRGVwZW5kc09uS2JMYXlvdXQ9LTFdPSJEZXBlbmRzT25LYkxheW91dCIsZVtlLlVua25vd249MF09IlVua25vd24iLGVbZS5CYWNrc3BhY2U9MV09IkJhY2tzcGFjZSIsZVtlLlRhYj0yXT0iVGFiIixlW2UuRW50ZXI9M109IkVudGVyIixlW2UuU2hpZnQ9NF09IlNoaWZ0IixlW2UuQ3RybD01XT0iQ3RybCIsZVtlLkFsdD02XT0iQWx0IixlW2UuUGF1c2VCcmVhaz03XT0iUGF1c2VCcmVhayIsZVtlLkNhcHNMb2NrPThdPSJDYXBzTG9jayIsZVtlLkVzY2FwZT05XT0iRXNjYXBlIixlW2UuU3BhY2U9MTBdPSJTcGFjZSIsZVtlLlBhZ2VVcD0xMV09IlBhZ2VVcCIsZVtlLlBhZ2VEb3duPTEyXT0iUGFnZURvd24iLGVbZS5FbmQ9MTNdPSJFbmQiLGVbZS5Ib21lPTE0XT0iSG9tZSIsZVtlLkxlZnRBcnJvdz0xNV09IkxlZnRBcnJvdyIsZVtlLlVwQXJyb3c9MTZdPSJVcEFycm93IixlW2UuUmlnaHRBcnJvdz0xN109IlJpZ2h0QXJyb3ciLGVbZS5Eb3duQXJyb3c9MThdPSJEb3duQXJyb3ciLGVbZS5JbnNlcnQ9MTldPSJJbnNlcnQiLGVbZS5EZWxldGU9MjBdPSJEZWxldGUiLGVbZS5EaWdpdDA9MjFdPSJEaWdpdDAiLGVbZS5EaWdpdDE9MjJdPSJEaWdpdDEiLGVbZS5EaWdpdDI9MjNdPSJEaWdpdDIiLGVbZS5EaWdpdDM9MjRdPSJEaWdpdDMiLGVbZS5EaWdpdDQ9MjVdPSJEaWdpdDQiLGVbZS5EaWdpdDU9MjZdPSJEaWdpdDUiLGVbZS5EaWdpdDY9MjddPSJEaWdpdDYiLGVbZS5EaWdpdDc9MjhdPSJEaWdpdDciLGVbZS5EaWdpdDg9MjldPSJEaWdpdDgiLGVbZS5EaWdpdDk9MzBdPSJEaWdpdDkiLGVbZS5LZXlBPTMxXT0iS2V5QSIsZVtlLktleUI9MzJdPSJLZXlCIixlW2UuS2V5Qz0zM109IktleUMiLGVbZS5LZXlEPTM0XT0iS2V5RCIsZVtlLktleUU9MzVdPSJLZXlFIixlW2UuS2V5Rj0zNl09IktleUYiLGVbZS5LZXlHPTM3XT0iS2V5RyIsZVtlLktleUg9MzhdPSJLZXlIIixlW2UuS2V5ST0zOV09IktleUkiLGVbZS5LZXlKPTQwXT0iS2V5SiIsZVtlLktleUs9NDFdPSJLZXlLIixlW2UuS2V5TD00Ml09IktleUwiLGVbZS5LZXlNPTQzXT0iS2V5TSIsZVtlLktleU49NDRdPSJLZXlOIixlW2UuS2V5Tz00NV09IktleU8iLGVbZS5LZXlQPTQ2XT0iS2V5UCIsZVtlLktleVE9NDddPSJLZXlRIixlW2UuS2V5Uj00OF09IktleVIiLGVbZS5LZXlTPTQ5XT0iS2V5UyIsZVtlLktleVQ9NTBdPSJLZXlUIixlW2UuS2V5VT01MV09IktleVUiLGVbZS5LZXlWPTUyXT0iS2V5ViIsZVtlLktleVc9NTNdPSJLZXlXIixlW2UuS2V5WD01NF09IktleVgiLGVbZS5LZXlZPTU1XT0iS2V5WSIsZVtlLktleVo9NTZdPSJLZXlaIixlW2UuTWV0YT01N109Ik1ldGEiLGVbZS5Db250ZXh0TWVudT01OF09IkNvbnRleHRNZW51IixlW2UuRjE9NTldPSJGMSIsZVtlLkYyPTYwXT0iRjIiLGVbZS5GMz02MV09IkYzIixlW2UuRjQ9NjJdPSJGNCIsZVtlLkY1PTYzXT0iRjUiLGVbZS5GNj02NF09IkY2IixlW2UuRjc9NjVdPSJGNyIsZVtlLkY4PTY2XT0iRjgiLGVbZS5GOT02N109IkY5IixlW2UuRjEwPTY4XT0iRjEwIixlW2UuRjExPTY5XT0iRjExIixlW2UuRjEyPTcwXT0iRjEyIixlW2UuRjEzPTcxXT0iRjEzIixlW2UuRjE0PTcyXT0iRjE0IixlW2UuRjE1PTczXT0iRjE1IixlW2UuRjE2PTc0XT0iRjE2IixlW2UuRjE3PTc1XT0iRjE3IixlW2UuRjE4PTc2XT0iRjE4IixlW2UuRjE5PTc3XT0iRjE5IixlW2UuRjIwPTc4XT0iRjIwIixlW2UuRjIxPTc5XT0iRjIxIixlW2UuRjIyPTgwXT0iRjIyIixlW2UuRjIzPTgxXT0iRjIzIixlW2UuRjI0PTgyXT0iRjI0IixlW2UuTnVtTG9jaz04M109Ik51bUxvY2siLGVbZS5TY3JvbGxMb2NrPTg0XT0iU2Nyb2xsTG9jayIsZVtlLlNlbWljb2xvbj04NV09IlNlbWljb2xvbiIsZVtlLkVxdWFsPTg2XT0iRXF1YWwiLGVbZS5Db21tYT04N109IkNvbW1hIixlW2UuTWludXM9ODhdPSJNaW51cyIsZVtlLlBlcmlvZD04OV09IlBlcmlvZCIsZVtlLlNsYXNoPTkwXT0iU2xhc2giLGVbZS5CYWNrcXVvdGU9OTFdPSJCYWNrcXVvdGUiLGVbZS5CcmFja2V0TGVmdD05Ml09IkJyYWNrZXRMZWZ0IixlW2UuQmFja3NsYXNoPTkzXT0iQmFja3NsYXNoIixlW2UuQnJhY2tldFJpZ2h0PTk0XT0iQnJhY2tldFJpZ2h0IixlW2UuUXVvdGU9OTVdPSJRdW90ZSIsZVtlLk9FTV84PTk2XT0iT0VNXzgiLGVbZS5JbnRsQmFja3NsYXNoPTk3XT0iSW50bEJhY2tzbGFzaCIsZVtlLk51bXBhZDA9OThdPSJOdW1wYWQwIixlW2UuTnVtcGFkMT05OV09Ik51bXBhZDEiLGVbZS5OdW1wYWQyPTEwMF09Ik51bXBhZDIiLGVbZS5OdW1wYWQzPTEwMV09Ik51bXBhZDMiLGVbZS5OdW1wYWQ0PTEwMl09Ik51bXBhZDQiLGVbZS5OdW1wYWQ1PTEwM109Ik51bXBhZDUiLGVbZS5OdW1wYWQ2PTEwNF09Ik51bXBhZDYiLGVbZS5OdW1wYWQ3PTEwNV09Ik51bXBhZDciLGVbZS5OdW1wYWQ4PTEwNl09Ik51bXBhZDgiLGVbZS5OdW1wYWQ5PTEwN109Ik51bXBhZDkiLGVbZS5OdW1wYWRNdWx0aXBseT0xMDhdPSJOdW1wYWRNdWx0aXBseSIsZVtlLk51bXBhZEFkZD0xMDldPSJOdW1wYWRBZGQiLGVbZS5OVU1QQURfU0VQQVJBVE9SPTExMF09Ik5VTVBBRF9TRVBBUkFUT1IiLGVbZS5OdW1wYWRTdWJ0cmFjdD0xMTFdPSJOdW1wYWRTdWJ0cmFjdCIsZVtlLk51bXBhZERlY2ltYWw9MTEyXT0iTnVtcGFkRGVjaW1hbCIsZVtlLk51bXBhZERpdmlkZT0xMTNdPSJOdW1wYWREaXZpZGUiLGVbZS5LRVlfSU5fQ09NUE9TSVRJT049MTE0XT0iS0VZX0lOX0NPTVBPU0lUSU9OIixlW2UuQUJOVF9DMT0xMTVdPSJBQk5UX0MxIixlW2UuQUJOVF9DMj0xMTZdPSJBQk5UX0MyIixlW2UuQXVkaW9Wb2x1bWVNdXRlPTExN109IkF1ZGlvVm9sdW1lTXV0ZSIsZVtlLkF1ZGlvVm9sdW1lVXA9MTE4XT0iQXVkaW9Wb2x1bWVVcCIsZVtlLkF1ZGlvVm9sdW1lRG93bj0xMTldPSJBdWRpb1ZvbHVtZURvd24iLGVbZS5Ccm93c2VyU2VhcmNoPTEyMF09IkJyb3dzZXJTZWFyY2giLGVbZS5Ccm93c2VySG9tZT0xMjFdPSJCcm93c2VySG9tZSIsZVtlLkJyb3dzZXJCYWNrPTEyMl09IkJyb3dzZXJCYWNrIixlW2UuQnJvd3NlckZvcndhcmQ9MTIzXT0iQnJvd3NlckZvcndhcmQiLGVbZS5NZWRpYVRyYWNrTmV4dD0xMjRdPSJNZWRpYVRyYWNrTmV4dCIsZVtlLk1lZGlhVHJhY2tQcmV2aW91cz0xMjVdPSJNZWRpYVRyYWNrUHJldmlvdXMiLGVbZS5NZWRpYVN0b3A9MTI2XT0iTWVkaWFTdG9wIixlW2UuTWVkaWFQbGF5UGF1c2U9MTI3XT0iTWVkaWFQbGF5UGF1c2UiLGVbZS5MYXVuY2hNZWRpYVBsYXllcj0xMjhdPSJMYXVuY2hNZWRpYVBsYXllciIsZVtlLkxhdW5jaE1haWw9MTI5XT0iTGF1bmNoTWFpbCIsZVtlLkxhdW5jaEFwcDI9MTMwXT0iTGF1bmNoQXBwMiIsZVtlLkNsZWFyPTEzMV09IkNsZWFyIixlW2UuTUFYX1ZBTFVFPTEzMl09Ik1BWF9WQUxVRSJ9KShtcnx8KG1yPXt9KSk7dmFyIGdyOyhmdW5jdGlvbihlKXtlW2UuSGludD0xXT0iSGludCIsZVtlLkluZm89Ml09IkluZm8iLGVbZS5XYXJuaW5nPTRdPSJXYXJuaW5nIixlW2UuRXJyb3I9OF09IkVycm9yIn0pKGdyfHwoZ3I9e30pKTt2YXIgcHI7KGZ1bmN0aW9uKGUpe2VbZS5Vbm5lY2Vzc2FyeT0xXT0iVW5uZWNlc3NhcnkiLGVbZS5EZXByZWNhdGVkPTJdPSJEZXByZWNhdGVkIn0pKHByfHwocHI9e30pKTt2YXIgaHM7KGZ1bmN0aW9uKGUpe2VbZS5JbmxpbmU9MV09IklubGluZSIsZVtlLkd1dHRlcj0yXT0iR3V0dGVyIn0pKGhzfHwoaHM9e30pKTt2YXIgZHM7KGZ1bmN0aW9uKGUpe2VbZS5Ob3JtYWw9MV09Ik5vcm1hbCIsZVtlLlVuZGVybGluZWQ9Ml09IlVuZGVybGluZWQifSkoZHN8fChkcz17fSkpO3ZhciBtczsoZnVuY3Rpb24oZSl7ZVtlLlVOS05PV049MF09IlVOS05PV04iLGVbZS5URVhUQVJFQT0xXT0iVEVYVEFSRUEiLGVbZS5HVVRURVJfR0xZUEhfTUFSR0lOPTJdPSJHVVRURVJfR0xZUEhfTUFSR0lOIixlW2UuR1VUVEVSX0xJTkVfTlVNQkVSUz0zXT0iR1VUVEVSX0xJTkVfTlVNQkVSUyIsZVtlLkdVVFRFUl9MSU5FX0RFQ09SQVRJT05TPTRdPSJHVVRURVJfTElORV9ERUNPUkFUSU9OUyIsZVtlLkdVVFRFUl9WSUVXX1pPTkU9NV09IkdVVFRFUl9WSUVXX1pPTkUiLGVbZS5DT05URU5UX1RFWFQ9Nl09IkNPTlRFTlRfVEVYVCIsZVtlLkNPTlRFTlRfRU1QVFk9N109IkNPTlRFTlRfRU1QVFkiLGVbZS5DT05URU5UX1ZJRVdfWk9ORT04XT0iQ09OVEVOVF9WSUVXX1pPTkUiLGVbZS5DT05URU5UX1dJREdFVD05XT0iQ09OVEVOVF9XSURHRVQiLGVbZS5PVkVSVklFV19SVUxFUj0xMF09Ik9WRVJWSUVXX1JVTEVSIixlW2UuU0NST0xMQkFSPTExXT0iU0NST0xMQkFSIixlW2UuT1ZFUkxBWV9XSURHRVQ9MTJdPSJPVkVSTEFZX1dJREdFVCIsZVtlLk9VVFNJREVfRURJVE9SPTEzXT0iT1VUU0lERV9FRElUT1IifSkobXN8fChtcz17fSkpO3ZhciBnczsoZnVuY3Rpb24oZSl7ZVtlLkFJR2VuZXJhdGVkPTFdPSJBSUdlbmVyYXRlZCJ9KShnc3x8KGdzPXt9KSk7dmFyIHBzOyhmdW5jdGlvbihlKXtlW2UuSW52b2tlPTBdPSJJbnZva2UiLGVbZS5BdXRvbWF0aWM9MV09IkF1dG9tYXRpYyJ9KShwc3x8KHBzPXt9KSk7dmFyIGJzOyhmdW5jdGlvbihlKXtlW2UuVE9QX1JJR0hUX0NPUk5FUj0wXT0iVE9QX1JJR0hUX0NPUk5FUiIsZVtlLkJPVFRPTV9SSUdIVF9DT1JORVI9MV09IkJPVFRPTV9SSUdIVF9DT1JORVIiLGVbZS5UT1BfQ0VOVEVSPTJdPSJUT1BfQ0VOVEVSIn0pKGJzfHwoYnM9e30pKTt2YXIgdnM7KGZ1bmN0aW9uKGUpe2VbZS5MZWZ0PTFdPSJMZWZ0IixlW2UuQ2VudGVyPTJdPSJDZW50ZXIiLGVbZS5SaWdodD00XT0iUmlnaHQiLGVbZS5GdWxsPTddPSJGdWxsIn0pKHZzfHwodnM9e30pKTt2YXIgeHM7KGZ1bmN0aW9uKGUpe2VbZS5Xb3JkPTBdPSJXb3JkIixlW2UuTGluZT0xXT0iTGluZSIsZVtlLlN1Z2dlc3Q9Ml09IlN1Z2dlc3QifSkoeHN8fCh4cz17fSkpO3ZhciB5czsoZnVuY3Rpb24oZSl7ZVtlLkxlZnQ9MF09IkxlZnQiLGVbZS5SaWdodD0xXT0iUmlnaHQiLGVbZS5Ob25lPTJdPSJOb25lIixlW2UuTGVmdE9mSW5qZWN0ZWRUZXh0PTNdPSJMZWZ0T2ZJbmplY3RlZFRleHQiLGVbZS5SaWdodE9mSW5qZWN0ZWRUZXh0PTRdPSJSaWdodE9mSW5qZWN0ZWRUZXh0In0pKHlzfHwoeXM9e30pKTt2YXIgd3M7KGZ1bmN0aW9uKGUpe2VbZS5PZmY9MF09Ik9mZiIsZVtlLk9uPTFdPSJPbiIsZVtlLlJlbGF0aXZlPTJdPSJSZWxhdGl2ZSIsZVtlLkludGVydmFsPTNdPSJJbnRlcnZhbCIsZVtlLkN1c3RvbT00XT0iQ3VzdG9tIn0pKHdzfHwod3M9e30pKTt2YXIgX3M7KGZ1bmN0aW9uKGUpe2VbZS5Ob25lPTBdPSJOb25lIixlW2UuVGV4dD0xXT0iVGV4dCIsZVtlLkJsb2Nrcz0yXT0iQmxvY2tzIn0pKF9zfHwoX3M9e30pKTt2YXIgTHM7KGZ1bmN0aW9uKGUpe2VbZS5TbW9vdGg9MF09IlNtb290aCIsZVtlLkltbWVkaWF0ZT0xXT0iSW1tZWRpYXRlIn0pKExzfHwoTHM9e30pKTt2YXIgTnM7KGZ1bmN0aW9uKGUpe2VbZS5BdXRvPTFdPSJBdXRvIixlW2UuSGlkZGVuPTJdPSJIaWRkZW4iLGVbZS5WaXNpYmxlPTNdPSJWaXNpYmxlIn0pKE5zfHwoTnM9e30pKTt2YXIgYnI7KGZ1bmN0aW9uKGUpe2VbZS5MVFI9MF09IkxUUiIsZVtlLlJUTD0xXT0iUlRMIn0pKGJyfHwoYnI9e30pKTt2YXIgU3M7KGZ1bmN0aW9uKGUpe2UuT2ZmPSJvZmYiLGUuT25Db2RlPSJvbkNvZGUiLGUuT249Im9uIn0pKFNzfHwoU3M9e30pKTt2YXIgQXM7KGZ1bmN0aW9uKGUpe2VbZS5JbnZva2U9MV09Ikludm9rZSIsZVtlLlRyaWdnZXJDaGFyYWN0ZXI9Ml09IlRyaWdnZXJDaGFyYWN0ZXIiLGVbZS5Db250ZW50Q2hhbmdlPTNdPSJDb250ZW50Q2hhbmdlIn0pKEFzfHwoQXM9e30pKTt2YXIga3M7KGZ1bmN0aW9uKGUpe2VbZS5GaWxlPTBdPSJGaWxlIixlW2UuTW9kdWxlPTFdPSJNb2R1bGUiLGVbZS5OYW1lc3BhY2U9Ml09Ik5hbWVzcGFjZSIsZVtlLlBhY2thZ2U9M109IlBhY2thZ2UiLGVbZS5DbGFzcz00XT0iQ2xhc3MiLGVbZS5NZXRob2Q9NV09Ik1ldGhvZCIsZVtlLlByb3BlcnR5PTZdPSJQcm9wZXJ0eSIsZVtlLkZpZWxkPTddPSJGaWVsZCIsZVtlLkNvbnN0cnVjdG9yPThdPSJDb25zdHJ1Y3RvciIsZVtlLkVudW09OV09IkVudW0iLGVbZS5JbnRlcmZhY2U9MTBdPSJJbnRlcmZhY2UiLGVbZS5GdW5jdGlvbj0xMV09IkZ1bmN0aW9uIixlW2UuVmFyaWFibGU9MTJdPSJWYXJpYWJsZSIsZVtlLkNvbnN0YW50PTEzXT0iQ29uc3RhbnQiLGVbZS5TdHJpbmc9MTRdPSJTdHJpbmciLGVbZS5OdW1iZXI9MTVdPSJOdW1iZXIiLGVbZS5Cb29sZWFuPTE2XT0iQm9vbGVhbiIsZVtlLkFycmF5PTE3XT0iQXJyYXkiLGVbZS5PYmplY3Q9MThdPSJPYmplY3QiLGVbZS5LZXk9MTldPSJLZXkiLGVbZS5OdWxsPTIwXT0iTnVsbCIsZVtlLkVudW1NZW1iZXI9MjFdPSJFbnVtTWVtYmVyIixlW2UuU3RydWN0PTIyXT0iU3RydWN0IixlW2UuRXZlbnQ9MjNdPSJFdmVudCIsZVtlLk9wZXJhdG9yPTI0XT0iT3BlcmF0b3IiLGVbZS5UeXBlUGFyYW1ldGVyPTI1XT0iVHlwZVBhcmFtZXRlciJ9KShrc3x8KGtzPXt9KSk7dmFyIFJzOyhmdW5jdGlvbihlKXtlW2UuRGVwcmVjYXRlZD0xXT0iRGVwcmVjYXRlZCJ9KShSc3x8KFJzPXt9KSk7dmFyIEVzOyhmdW5jdGlvbihlKXtlW2UuSGlkZGVuPTBdPSJIaWRkZW4iLGVbZS5CbGluaz0xXT0iQmxpbmsiLGVbZS5TbW9vdGg9Ml09IlNtb290aCIsZVtlLlBoYXNlPTNdPSJQaGFzZSIsZVtlLkV4cGFuZD00XT0iRXhwYW5kIixlW2UuU29saWQ9NV09IlNvbGlkIn0pKEVzfHwoRXM9e30pKTt2YXIgTXM7KGZ1bmN0aW9uKGUpe2VbZS5MaW5lPTFdPSJMaW5lIixlW2UuQmxvY2s9Ml09IkJsb2NrIixlW2UuVW5kZXJsaW5lPTNdPSJVbmRlcmxpbmUiLGVbZS5MaW5lVGhpbj00XT0iTGluZVRoaW4iLGVbZS5CbG9ja091dGxpbmU9NV09IkJsb2NrT3V0bGluZSIsZVtlLlVuZGVybGluZVRoaW49Nl09IlVuZGVybGluZVRoaW4ifSkoTXN8fChNcz17fSkpO3ZhciBDczsoZnVuY3Rpb24oZSl7ZVtlLkFsd2F5c0dyb3dzV2hlblR5cGluZ0F0RWRnZXM9MF09IkFsd2F5c0dyb3dzV2hlblR5cGluZ0F0RWRnZXMiLGVbZS5OZXZlckdyb3dzV2hlblR5cGluZ0F0RWRnZXM9MV09Ik5ldmVyR3Jvd3NXaGVuVHlwaW5nQXRFZGdlcyIsZVtlLkdyb3dzT25seVdoZW5UeXBpbmdCZWZvcmU9Ml09Ikdyb3dzT25seVdoZW5UeXBpbmdCZWZvcmUiLGVbZS5Hcm93c09ubHlXaGVuVHlwaW5nQWZ0ZXI9M109Ikdyb3dzT25seVdoZW5UeXBpbmdBZnRlciJ9KShDc3x8KENzPXt9KSk7dmFyIFRzOyhmdW5jdGlvbihlKXtlW2UuTm9uZT0wXT0iTm9uZSIsZVtlLlNhbWU9MV09IlNhbWUiLGVbZS5JbmRlbnQ9Ml09IkluZGVudCIsZVtlLkRlZXBJbmRlbnQ9M109IkRlZXBJbmRlbnQifSkoVHN8fChUcz17fSkpO2NvbnN0IFZ0PWNsYXNzIFZ0e3N0YXRpYyBjaG9yZCh0LG4pe3JldHVybiBkdSh0LG4pfX07VnQuQ3RybENtZD0yMDQ4LFZ0LlNoaWZ0PTEwMjQsVnQuQWx0PTUxMixWdC5XaW5DdHJsPTI1NjtsZXQgdnI9VnQ7ZnVuY3Rpb24geHUoKXtyZXR1cm57ZWRpdG9yOnZvaWQgMCxsYW5ndWFnZXM6dm9pZCAwLENhbmNlbGxhdGlvblRva2VuU291cmNlOnV1LEVtaXR0ZXI6X2UsS2V5Q29kZTptcixLZXlNb2Q6dnIsUG9zaXRpb246ZWUsUmFuZ2U6eixTZWxlY3Rpb246dmUsU2VsZWN0aW9uRGlyZWN0aW9uOmJyLE1hcmtlclNldmVyaXR5OmdyLE1hcmtlclRhZzpwcixVcmk6SWUsVG9rZW46dnV9fWNvbnN0IHJuPWNsYXNzIHJue3N0YXRpYyBnZXRDaGFubmVsKHQpe3JldHVybiB0LmdldENoYW5uZWwocm4uQ0hBTk5FTF9OQU1FKX1zdGF0aWMgc2V0Q2hhbm5lbCh0LG4pe3Quc2V0Q2hhbm5lbChybi5DSEFOTkVMX05BTUUsbil9fTtybi5DSEFOTkVMX05BTUU9ImVkaXRvcldvcmtlckhvc3QiO2xldCB4cj1ybjt2YXIgUHM7Y2xhc3MgeXV7Y29uc3RydWN0b3IoKXt0aGlzW1BzXT0iTGlua2VkTWFwIix0aGlzLl9tYXA9bmV3IE1hcCx0aGlzLl9oZWFkPXZvaWQgMCx0aGlzLl90YWlsPXZvaWQgMCx0aGlzLl9zaXplPTAsdGhpcy5fc3RhdGU9MH1jbGVhcigpe3RoaXMuX21hcC5jbGVhcigpLHRoaXMuX2hlYWQ9dm9pZCAwLHRoaXMuX3RhaWw9dm9pZCAwLHRoaXMuX3NpemU9MCx0aGlzLl9zdGF0ZSsrfWlzRW1wdHkoKXtyZXR1cm4hdGhpcy5faGVhZCYmIXRoaXMuX3RhaWx9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5fc2l6ZX1nZXQgZmlyc3QoKXt2YXIgdDtyZXR1cm4odD10aGlzLl9oZWFkKT09bnVsbD92b2lkIDA6dC52YWx1ZX1nZXQgbGFzdCgpe3ZhciB0O3JldHVybih0PXRoaXMuX3RhaWwpPT1udWxsP3ZvaWQgMDp0LnZhbHVlfWhhcyh0KXtyZXR1cm4gdGhpcy5fbWFwLmhhcyh0KX1nZXQodCxuPTApe2NvbnN0IHI9dGhpcy5fbWFwLmdldCh0KTtpZihyKXJldHVybiBuIT09MCYmdGhpcy50b3VjaChyLG4pLHIudmFsdWV9c2V0KHQsbixyPTApe2xldCBpPXRoaXMuX21hcC5nZXQodCk7aWYoaSlpLnZhbHVlPW4sciE9PTAmJnRoaXMudG91Y2goaSxyKTtlbHNle3N3aXRjaChpPXtrZXk6dCx2YWx1ZTpuLG5leHQ6dm9pZCAwLHByZXZpb3VzOnZvaWQgMH0scil7Y2FzZSAwOnRoaXMuYWRkSXRlbUxhc3QoaSk7YnJlYWs7Y2FzZSAxOnRoaXMuYWRkSXRlbUZpcnN0KGkpO2JyZWFrO2Nhc2UgMjp0aGlzLmFkZEl0ZW1MYXN0KGkpO2JyZWFrO2RlZmF1bHQ6dGhpcy5hZGRJdGVtTGFzdChpKTticmVha310aGlzLl9tYXAuc2V0KHQsaSksdGhpcy5fc2l6ZSsrfXJldHVybiB0aGlzfWRlbGV0ZSh0KXtyZXR1cm4hIXRoaXMucmVtb3ZlKHQpfXJlbW92ZSh0KXtjb25zdCBuPXRoaXMuX21hcC5nZXQodCk7aWYobilyZXR1cm4gdGhpcy5fbWFwLmRlbGV0ZSh0KSx0aGlzLnJlbW92ZUl0ZW0obiksdGhpcy5fc2l6ZS0tLG4udmFsdWV9c2hpZnQoKXtpZighdGhpcy5faGVhZCYmIXRoaXMuX3RhaWwpcmV0dXJuO2lmKCF0aGlzLl9oZWFkfHwhdGhpcy5fdGFpbCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbGlzdCIpO2NvbnN0IHQ9dGhpcy5faGVhZDtyZXR1cm4gdGhpcy5fbWFwLmRlbGV0ZSh0LmtleSksdGhpcy5yZW1vdmVJdGVtKHQpLHRoaXMuX3NpemUtLSx0LnZhbHVlfWZvckVhY2godCxuKXtjb25zdCByPXRoaXMuX3N0YXRlO2xldCBpPXRoaXMuX2hlYWQ7Zm9yKDtpOyl7aWYobj90LmJpbmQobikoaS52YWx1ZSxpLmtleSx0aGlzKTp0KGkudmFsdWUsaS5rZXksdGhpcyksdGhpcy5fc3RhdGUhPT1yKXRocm93IG5ldyBFcnJvcigiTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLiIpO2k9aS5uZXh0fX1rZXlzKCl7Y29uc3QgdD10aGlzLG49dGhpcy5fc3RhdGU7bGV0IHI9dGhpcy5faGVhZDtjb25zdCBpPXtbU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBpfSxuZXh0KCl7aWYodC5fc3RhdGUhPT1uKXRocm93IG5ldyBFcnJvcigiTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLiIpO2lmKHIpe2NvbnN0IHM9e3ZhbHVlOnIua2V5LGRvbmU6ITF9O3JldHVybiByPXIubmV4dCxzfWVsc2UgcmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX19O3JldHVybiBpfXZhbHVlcygpe2NvbnN0IHQ9dGhpcyxuPXRoaXMuX3N0YXRlO2xldCByPXRoaXMuX2hlYWQ7Y29uc3QgaT17W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gaX0sbmV4dCgpe2lmKHQuX3N0YXRlIT09bil0aHJvdyBuZXcgRXJyb3IoIkxpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi4iKTtpZihyKXtjb25zdCBzPXt2YWx1ZTpyLnZhbHVlLGRvbmU6ITF9O3JldHVybiByPXIubmV4dCxzfWVsc2UgcmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX19O3JldHVybiBpfWVudHJpZXMoKXtjb25zdCB0PXRoaXMsbj10aGlzLl9zdGF0ZTtsZXQgcj10aGlzLl9oZWFkO2NvbnN0IGk9e1tTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIGl9LG5leHQoKXtpZih0Ll9zdGF0ZSE9PW4pdGhyb3cgbmV3IEVycm9yKCJMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uIik7aWYocil7Y29uc3Qgcz17dmFsdWU6W3Iua2V5LHIudmFsdWVdLGRvbmU6ITF9O3JldHVybiByPXIubmV4dCxzfWVsc2UgcmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX19O3JldHVybiBpfVsoUHM9U3ltYm9sLnRvU3RyaW5nVGFnLFN5bWJvbC5pdGVyYXRvcildKCl7cmV0dXJuIHRoaXMuZW50cmllcygpfXRyaW1PbGQodCl7aWYodD49dGhpcy5zaXplKXJldHVybjtpZih0PT09MCl7dGhpcy5jbGVhcigpO3JldHVybn1sZXQgbj10aGlzLl9oZWFkLHI9dGhpcy5zaXplO2Zvcig7biYmcj50Oyl0aGlzLl9tYXAuZGVsZXRlKG4ua2V5KSxuPW4ubmV4dCxyLS07dGhpcy5faGVhZD1uLHRoaXMuX3NpemU9cixuJiYobi5wcmV2aW91cz12b2lkIDApLHRoaXMuX3N0YXRlKyt9dHJpbU5ldyh0KXtpZih0Pj10aGlzLnNpemUpcmV0dXJuO2lmKHQ9PT0wKXt0aGlzLmNsZWFyKCk7cmV0dXJufWxldCBuPXRoaXMuX3RhaWwscj10aGlzLnNpemU7Zm9yKDtuJiZyPnQ7KXRoaXMuX21hcC5kZWxldGUobi5rZXkpLG49bi5wcmV2aW91cyxyLS07dGhpcy5fdGFpbD1uLHRoaXMuX3NpemU9cixuJiYobi5uZXh0PXZvaWQgMCksdGhpcy5fc3RhdGUrK31hZGRJdGVtRmlyc3QodCl7aWYoIXRoaXMuX2hlYWQmJiF0aGlzLl90YWlsKXRoaXMuX3RhaWw9dDtlbHNlIGlmKHRoaXMuX2hlYWQpdC5uZXh0PXRoaXMuX2hlYWQsdGhpcy5faGVhZC5wcmV2aW91cz10O2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTt0aGlzLl9oZWFkPXQsdGhpcy5fc3RhdGUrK31hZGRJdGVtTGFzdCh0KXtpZighdGhpcy5faGVhZCYmIXRoaXMuX3RhaWwpdGhpcy5faGVhZD10O2Vsc2UgaWYodGhpcy5fdGFpbCl0LnByZXZpb3VzPXRoaXMuX3RhaWwsdGhpcy5fdGFpbC5uZXh0PXQ7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbGlzdCIpO3RoaXMuX3RhaWw9dCx0aGlzLl9zdGF0ZSsrfXJlbW92ZUl0ZW0odCl7aWYodD09PXRoaXMuX2hlYWQmJnQ9PT10aGlzLl90YWlsKXRoaXMuX2hlYWQ9dm9pZCAwLHRoaXMuX3RhaWw9dm9pZCAwO2Vsc2UgaWYodD09PXRoaXMuX2hlYWQpe2lmKCF0Lm5leHQpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTt0Lm5leHQucHJldmlvdXM9dm9pZCAwLHRoaXMuX2hlYWQ9dC5uZXh0fWVsc2UgaWYodD09PXRoaXMuX3RhaWwpe2lmKCF0LnByZXZpb3VzKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7dC5wcmV2aW91cy5uZXh0PXZvaWQgMCx0aGlzLl90YWlsPXQucHJldmlvdXN9ZWxzZXtjb25zdCBuPXQubmV4dCxyPXQucHJldmlvdXM7aWYoIW58fCFyKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7bi5wcmV2aW91cz1yLHIubmV4dD1ufXQubmV4dD12b2lkIDAsdC5wcmV2aW91cz12b2lkIDAsdGhpcy5fc3RhdGUrK310b3VjaCh0LG4pe2lmKCF0aGlzLl9oZWFkfHwhdGhpcy5fdGFpbCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbGlzdCIpO2lmKCEobiE9PTEmJm4hPT0yKSl7aWYobj09PTEpe2lmKHQ9PT10aGlzLl9oZWFkKXJldHVybjtjb25zdCByPXQubmV4dCxpPXQucHJldmlvdXM7dD09PXRoaXMuX3RhaWw/KGkubmV4dD12b2lkIDAsdGhpcy5fdGFpbD1pKTooci5wcmV2aW91cz1pLGkubmV4dD1yKSx0LnByZXZpb3VzPXZvaWQgMCx0Lm5leHQ9dGhpcy5faGVhZCx0aGlzLl9oZWFkLnByZXZpb3VzPXQsdGhpcy5faGVhZD10LHRoaXMuX3N0YXRlKyt9ZWxzZSBpZihuPT09Mil7aWYodD09PXRoaXMuX3RhaWwpcmV0dXJuO2NvbnN0IHI9dC5uZXh0LGk9dC5wcmV2aW91czt0PT09dGhpcy5faGVhZD8oci5wcmV2aW91cz12b2lkIDAsdGhpcy5faGVhZD1yKTooci5wcmV2aW91cz1pLGkubmV4dD1yKSx0Lm5leHQ9dm9pZCAwLHQucHJldmlvdXM9dGhpcy5fdGFpbCx0aGlzLl90YWlsLm5leHQ9dCx0aGlzLl90YWlsPXQsdGhpcy5fc3RhdGUrK319fXRvSlNPTigpe2NvbnN0IHQ9W107cmV0dXJuIHRoaXMuZm9yRWFjaCgobixyKT0+e3QucHVzaChbcixuXSl9KSx0fWZyb21KU09OKHQpe3RoaXMuY2xlYXIoKTtmb3IoY29uc3RbbixyXW9mIHQpdGhpcy5zZXQobixyKX19Y2xhc3Mgd3UgZXh0ZW5kcyB5dXtjb25zdHJ1Y3Rvcih0LG49MSl7c3VwZXIoKSx0aGlzLl9saW1pdD10LHRoaXMuX3JhdGlvPU1hdGgubWluKE1hdGgubWF4KDAsbiksMSl9Z2V0IGxpbWl0KCl7cmV0dXJuIHRoaXMuX2xpbWl0fXNldCBsaW1pdCh0KXt0aGlzLl9saW1pdD10LHRoaXMuY2hlY2tUcmltKCl9Z2V0KHQsbj0yKXtyZXR1cm4gc3VwZXIuZ2V0KHQsbil9cGVlayh0KXtyZXR1cm4gc3VwZXIuZ2V0KHQsMCl9c2V0KHQsbil7cmV0dXJuIHN1cGVyLnNldCh0LG4sMiksdGhpc31jaGVja1RyaW0oKXt0aGlzLnNpemU+dGhpcy5fbGltaXQmJnRoaXMudHJpbShNYXRoLnJvdW5kKHRoaXMuX2xpbWl0KnRoaXMuX3JhdGlvKSl9fWNsYXNzIF91IGV4dGVuZHMgd3V7Y29uc3RydWN0b3IodCxuPTEpe3N1cGVyKHQsbil9dHJpbSh0KXt0aGlzLnRyaW1PbGQodCl9c2V0KHQsbil7cmV0dXJuIHN1cGVyLnNldCh0LG4pLHRoaXMuY2hlY2tUcmltKCksdGhpc319Y2xhc3MgTHV7Y29uc3RydWN0b3IoKXt0aGlzLm1hcD1uZXcgTWFwfWFkZCh0LG4pe2xldCByPXRoaXMubWFwLmdldCh0KTtyfHwocj1uZXcgU2V0LHRoaXMubWFwLnNldCh0LHIpKSxyLmFkZChuKX1kZWxldGUodCxuKXtjb25zdCByPXRoaXMubWFwLmdldCh0KTtyJiYoci5kZWxldGUobiksci5zaXplPT09MCYmdGhpcy5tYXAuZGVsZXRlKHQpKX1mb3JFYWNoKHQsbil7Y29uc3Qgcj10aGlzLm1hcC5nZXQodCk7ciYmci5mb3JFYWNoKG4pfWdldCh0KXtjb25zdCBuPXRoaXMubWFwLmdldCh0KTtyZXR1cm4gbnx8bmV3IFNldH19bmV3IF91KDEwKTtmdW5jdGlvbiBOdShlKXtsZXQgdD1bXTtmb3IoO09iamVjdC5wcm90b3R5cGUhPT1lOyl0PXQuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpKSxlPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gdH1mdW5jdGlvbiBJcyhlKXtjb25zdCB0PVtdO2Zvcihjb25zdCBuIG9mIE51KGUpKXR5cGVvZiBlW25dPT0iZnVuY3Rpb24iJiZ0LnB1c2gobik7cmV0dXJuIHR9ZnVuY3Rpb24gU3UoZSx0KXtjb25zdCBuPWk9PmZ1bmN0aW9uKCl7Y29uc3Qgcz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIHQoaSxzKX0scj17fTtmb3IoY29uc3QgaSBvZiBlKXJbaV09bihpKTtyZXR1cm4gcn12YXIgRnM7KGZ1bmN0aW9uKGUpe2VbZS5MZWZ0PTFdPSJMZWZ0IixlW2UuQ2VudGVyPTJdPSJDZW50ZXIiLGVbZS5SaWdodD00XT0iUmlnaHQiLGVbZS5GdWxsPTddPSJGdWxsIn0pKEZzfHwoRnM9e30pKTt2YXIgVnM7KGZ1bmN0aW9uKGUpe2VbZS5MZWZ0PTFdPSJMZWZ0IixlW2UuQ2VudGVyPTJdPSJDZW50ZXIiLGVbZS5SaWdodD0zXT0iUmlnaHQifSkoVnN8fChWcz17fSkpO3ZhciBEczsoZnVuY3Rpb24oZSl7ZVtlLkJvdGg9MF09IkJvdGgiLGVbZS5SaWdodD0xXT0iUmlnaHQiLGVbZS5MZWZ0PTJdPSJMZWZ0IixlW2UuTm9uZT0zXT0iTm9uZSJ9KShEc3x8KERzPXt9KSk7ZnVuY3Rpb24gQXUoZSx0LG4scixpKXtpZihyPT09MClyZXR1cm4hMDtjb25zdCBzPXQuY2hhckNvZGVBdChyLTEpO2lmKGUuZ2V0KHMpIT09MHx8cz09PTEzfHxzPT09MTApcmV0dXJuITA7aWYoaT4wKXtjb25zdCBhPXQuY2hhckNvZGVBdChyKTtpZihlLmdldChhKSE9PTApcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24ga3UoZSx0LG4scixpKXtpZihyK2k9PT1uKXJldHVybiEwO2NvbnN0IHM9dC5jaGFyQ29kZUF0KHIraSk7aWYoZS5nZXQocykhPT0wfHxzPT09MTN8fHM9PT0xMClyZXR1cm4hMDtpZihpPjApe2NvbnN0IGE9dC5jaGFyQ29kZUF0KHIraS0xKTtpZihlLmdldChhKSE9PTApcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gUnUoZSx0LG4scixpKXtyZXR1cm4gQXUoZSx0LG4scixpKSYma3UoZSx0LG4scixpKX1jbGFzcyBFdXtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuX3dvcmRTZXBhcmF0b3JzPXQsdGhpcy5fc2VhcmNoUmVnZXg9bix0aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4PS0xLHRoaXMuX3ByZXZNYXRjaExlbmd0aD0wfXJlc2V0KHQpe3RoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleD10LHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXg9LTEsdGhpcy5fcHJldk1hdGNoTGVuZ3RoPTB9bmV4dCh0KXtjb25zdCBuPXQubGVuZ3RoO2xldCByO2Rve2lmKHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXgrdGhpcy5fcHJldk1hdGNoTGVuZ3RoPT09bnx8KHI9dGhpcy5fc2VhcmNoUmVnZXguZXhlYyh0KSwhcikpcmV0dXJuIG51bGw7Y29uc3QgaT1yLmluZGV4LHM9clswXS5sZW5ndGg7aWYoaT09PXRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXgmJnM9PT10aGlzLl9wcmV2TWF0Y2hMZW5ndGgpe2lmKHM9PT0wKXtMbCh0LG4sdGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4KT42NTUzNT90aGlzLl9zZWFyY2hSZWdleC5sYXN0SW5kZXgrPTI6dGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4Kz0xO2NvbnRpbnVlfXJldHVybiBudWxsfWlmKHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXg9aSx0aGlzLl9wcmV2TWF0Y2hMZW5ndGg9cywhdGhpcy5fd29yZFNlcGFyYXRvcnN8fFJ1KHRoaXMuX3dvcmRTZXBhcmF0b3JzLHQsbixpLHMpKXJldHVybiByfXdoaWxlKHIpO3JldHVybiBudWxsfX1mdW5jdGlvbiBNdShlLHQ9IlVucmVhY2hhYmxlIil7dGhyb3cgbmV3IEVycm9yKHQpfWZ1bmN0aW9uIHZuKGUpe2lmKCFlKCkpe2RlYnVnZ2VyO2UoKSxUZShuZXcgYmUoIkFzc2VydGlvbiBGYWlsZWQiKSl9fWZ1bmN0aW9uIE9zKGUsdCl7bGV0IG49MDtmb3IoO248ZS5sZW5ndGgtMTspe2NvbnN0IHI9ZVtuXSxpPWVbbisxXTtpZighdChyLGkpKXJldHVybiExO24rK31yZXR1cm4hMH1jb25zdCBDdT0iYH4hQCMkJV4mKigpLT0rW3tdfVxcfDs6J1wiLC48Pi8/IjtmdW5jdGlvbiBUdShlPSIiKXtsZXQgdD0iKC0/XFxkKlxcLlxcZFxcdyopfChbXiI7Zm9yKGNvbnN0IG4gb2YgQ3UpZS5pbmRleE9mKG4pPj0wfHwodCs9IlxcIituKTtyZXR1cm4gdCs9Ilxcc10rKSIsbmV3IFJlZ0V4cCh0LCJnIil9Y29uc3QgJHM9VHUoKTtmdW5jdGlvbiBVcyhlKXtsZXQgdD0kcztpZihlJiZlIGluc3RhbmNlb2YgUmVnRXhwKWlmKGUuZ2xvYmFsKXQ9ZTtlbHNle2xldCBuPSJnIjtlLmlnbm9yZUNhc2UmJihuKz0iaSIpLGUubXVsdGlsaW5lJiYobis9Im0iKSxlLnVuaWNvZGUmJihuKz0idSIpLHQ9bmV3IFJlZ0V4cChlLnNvdXJjZSxuKX1yZXR1cm4gdC5sYXN0SW5kZXg9MCx0fWNvbnN0IEJzPW5ldyBZbztCcy51bnNoaWZ0KHttYXhMZW46MWUzLHdpbmRvd1NpemU6MTUsdGltZUJ1ZGdldDoxNTB9KTtmdW5jdGlvbiB5cihlLHQsbixyLGkpe2lmKHQ9VXModCksaXx8KGk9YW4uZmlyc3QoQnMpKSxuLmxlbmd0aD5pLm1heExlbil7bGV0IHU9ZS1pLm1heExlbi8yO3JldHVybiB1PDA/dT0wOnIrPXUsbj1uLnN1YnN0cmluZyh1LGUraS5tYXhMZW4vMikseXIoZSx0LG4scixpKX1jb25zdCBzPURhdGUubm93KCksYT1lLTEtcjtsZXQgbD0tMSxvPW51bGw7Zm9yKGxldCB1PTE7IShEYXRlLm5vdygpLXM+PWkudGltZUJ1ZGdldCk7dSsrKXtjb25zdCBoPWEtaS53aW5kb3dTaXplKnU7dC5sYXN0SW5kZXg9TWF0aC5tYXgoMCxoKTtjb25zdCBmPVB1KHQsbixhLGwpO2lmKCFmJiZvfHwobz1mLGg8PTApKWJyZWFrO2w9aH1pZihvKXtjb25zdCB1PXt3b3JkOm9bMF0sc3RhcnRDb2x1bW46cisxK28uaW5kZXgsZW5kQ29sdW1uOnIrMStvLmluZGV4K29bMF0ubGVuZ3RofTtyZXR1cm4gdC5sYXN0SW5kZXg9MCx1fXJldHVybiBudWxsfWZ1bmN0aW9uIFB1KGUsdCxuLHIpe2xldCBpO2Zvcig7aT1lLmV4ZWModCk7KXtjb25zdCBzPWkuaW5kZXh8fDA7aWYoczw9biYmZS5sYXN0SW5kZXg+PW4pcmV0dXJuIGk7aWYocj4wJiZzPnIpcmV0dXJuIG51bGx9cmV0dXJuIG51bGx9Y2xhc3MgSXV7c3RhdGljIGNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0cyh0LG4scil7Y29uc3QgaT1yP3Iuc3RhcnRMaW5lTnVtYmVyOjEscz1yP3IuZW5kTGluZU51bWJlcjp0LmdldExpbmVDb3VudCgpLGE9bmV3IHFzKG4pLGw9YS5nZXRDYW5kaWRhdGVDb2RlUG9pbnRzKCk7bGV0IG87bD09PSJhbGxOb25CYXNpY0FzY2lpIj9vPW5ldyBSZWdFeHAoIlteXFx0XFxuXFxyXFx4MjAtXFx4N0VdIiwiZyIpOm89bmV3IFJlZ0V4cChgJHtGdShBcnJheS5mcm9tKGwpKX1gLCJnIik7Y29uc3QgdT1uZXcgRXUobnVsbCxvKSxoPVtdO2xldCBmPSExLGQsbT0wLGc9MCxwPTA7ZTpmb3IobGV0IHg9aSx3PXM7eDw9dzt4Kyspe2NvbnN0IEw9dC5nZXRMaW5lQ29udGVudCh4KSx2PUwubGVuZ3RoO3UucmVzZXQoMCk7ZG8gaWYoZD11Lm5leHQoTCksZCl7bGV0IHk9ZC5pbmRleCxiPWQuaW5kZXgrZFswXS5sZW5ndGg7aWYoeT4wKXtjb25zdCBGPUwuY2hhckNvZGVBdCh5LTEpO3RyKEYpJiZ5LS19aWYoYisxPHYpe2NvbnN0IEY9TC5jaGFyQ29kZUF0KGItMSk7dHIoRikmJmIrK31jb25zdCBfPUwuc3Vic3RyaW5nKHksYik7bGV0IEE9eXIoeSsxLCRzLEwsMCk7QSYmQS5lbmRDb2x1bW48PXkrMSYmKEE9bnVsbCk7Y29uc3QgQz1hLnNob3VsZEhpZ2hsaWdodE5vbkJhc2ljQVNDSUkoXyxBP0Eud29yZDpudWxsKTtpZihDIT09MCl7aWYoQz09PTM/bSsrOkM9PT0yP2crKzpDPT09MT9wKys6TXUoKSxoLmxlbmd0aD49MWUzKXtmPSEwO2JyZWFrIGV9aC5wdXNoKG5ldyB6KHgseSsxLHgsYisxKSl9fXdoaWxlKGQpfXJldHVybntyYW5nZXM6aCxoYXNNb3JlOmYsYW1iaWd1b3VzQ2hhcmFjdGVyQ291bnQ6bSxpbnZpc2libGVDaGFyYWN0ZXJDb3VudDpnLG5vbkJhc2ljQXNjaWlDaGFyYWN0ZXJDb3VudDpwfX1zdGF0aWMgY29tcHV0ZVVuaWNvZGVIaWdobGlnaHRSZWFzb24odCxuKXtjb25zdCByPW5ldyBxcyhuKTtzd2l0Y2goci5zaG91bGRIaWdobGlnaHROb25CYXNpY0FTQ0lJKHQsbnVsbCkpe2Nhc2UgMDpyZXR1cm4gbnVsbDtjYXNlIDI6cmV0dXJue2tpbmQ6MX07Y2FzZSAzOntjb25zdCBzPXQuY29kZVBvaW50QXQoMCksYT1yLmFtYmlndW91c0NoYXJhY3RlcnMuZ2V0UHJpbWFyeUNvbmZ1c2FibGUocyksbD1CdC5nZXRMb2NhbGVzKCkuZmlsdGVyKG89PiFCdC5nZXRJbnN0YW5jZShuZXcgU2V0KFsuLi5uLmFsbG93ZWRMb2NhbGVzLG9dKSkuaXNBbWJpZ3VvdXMocykpO3JldHVybntraW5kOjAsY29uZnVzYWJsZVdpdGg6U3RyaW5nLmZyb21Db2RlUG9pbnQoYSksbm90QW1iaWd1b3VzSW5Mb2NhbGVzOmx9fWNhc2UgMTpyZXR1cm57a2luZDoyfX19fWZ1bmN0aW9uIEZ1KGUsdCl7cmV0dXJuYFske2JsKGUubWFwKHI9PlN0cmluZy5mcm9tQ29kZVBvaW50KHIpKS5qb2luKCIiKSl9XWB9Y2xhc3MgcXN7Y29uc3RydWN0b3IodCl7dGhpcy5vcHRpb25zPXQsdGhpcy5hbGxvd2VkQ29kZVBvaW50cz1uZXcgU2V0KHQuYWxsb3dlZENvZGVQb2ludHMpLHRoaXMuYW1iaWd1b3VzQ2hhcmFjdGVycz1CdC5nZXRJbnN0YW5jZShuZXcgU2V0KHQuYWxsb3dlZExvY2FsZXMpKX1nZXRDYW5kaWRhdGVDb2RlUG9pbnRzKCl7aWYodGhpcy5vcHRpb25zLm5vbkJhc2ljQVNDSUkpcmV0dXJuImFsbE5vbkJhc2ljQXNjaWkiO2NvbnN0IHQ9bmV3IFNldDtpZih0aGlzLm9wdGlvbnMuaW52aXNpYmxlQ2hhcmFjdGVycylmb3IoY29uc3QgbiBvZiBxdC5jb2RlUG9pbnRzKWpzKFN0cmluZy5mcm9tQ29kZVBvaW50KG4pKXx8dC5hZGQobik7aWYodGhpcy5vcHRpb25zLmFtYmlndW91c0NoYXJhY3RlcnMpZm9yKGNvbnN0IG4gb2YgdGhpcy5hbWJpZ3VvdXNDaGFyYWN0ZXJzLmdldENvbmZ1c2FibGVDb2RlUG9pbnRzKCkpdC5hZGQobik7Zm9yKGNvbnN0IG4gb2YgdGhpcy5hbGxvd2VkQ29kZVBvaW50cyl0LmRlbGV0ZShuKTtyZXR1cm4gdH1zaG91bGRIaWdobGlnaHROb25CYXNpY0FTQ0lJKHQsbil7Y29uc3Qgcj10LmNvZGVQb2ludEF0KDApO2lmKHRoaXMuYWxsb3dlZENvZGVQb2ludHMuaGFzKHIpKXJldHVybiAwO2lmKHRoaXMub3B0aW9ucy5ub25CYXNpY0FTQ0lJKXJldHVybiAxO2xldCBpPSExLHM9ITE7aWYobilmb3IoY29uc3QgYSBvZiBuKXtjb25zdCBsPWEuY29kZVBvaW50QXQoMCksbz1TbChhKTtpPWl8fG8sIW8mJiF0aGlzLmFtYmlndW91c0NoYXJhY3RlcnMuaXNBbWJpZ3VvdXMobCkmJiFxdC5pc0ludmlzaWJsZUNoYXJhY3RlcihsKSYmKHM9ITApfXJldHVybiFpJiZzPzA6dGhpcy5vcHRpb25zLmludmlzaWJsZUNoYXJhY3RlcnMmJiFqcyh0KSYmcXQuaXNJbnZpc2libGVDaGFyYWN0ZXIocik/Mjp0aGlzLm9wdGlvbnMuYW1iaWd1b3VzQ2hhcmFjdGVycyYmdGhpcy5hbWJpZ3VvdXNDaGFyYWN0ZXJzLmlzQW1iaWd1b3VzKHIpPzM6MH19ZnVuY3Rpb24ganMoZSl7cmV0dXJuIGU9PT0iICJ8fGU9PT1gCmB8fGU9PT0iCSJ9Y2xhc3MgeG57Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuY2hhbmdlcz10LHRoaXMubW92ZXM9bix0aGlzLmhpdFRpbWVvdXQ9cn19Y2xhc3MgVnV7Y29uc3RydWN0b3IodCxuKXt0aGlzLmxpbmVSYW5nZU1hcHBpbmc9dCx0aGlzLmNoYW5nZXM9bn19Y2xhc3MgV3tzdGF0aWMgYWRkUmFuZ2UodCxuKXtsZXQgcj0wO2Zvcig7cjxuLmxlbmd0aCYmbltyXS5lbmRFeGNsdXNpdmU8dC5zdGFydDspcisrO2xldCBpPXI7Zm9yKDtpPG4ubGVuZ3RoJiZuW2ldLnN0YXJ0PD10LmVuZEV4Y2x1c2l2ZTspaSsrO2lmKHI9PT1pKW4uc3BsaWNlKHIsMCx0KTtlbHNle2NvbnN0IHM9TWF0aC5taW4odC5zdGFydCxuW3JdLnN0YXJ0KSxhPU1hdGgubWF4KHQuZW5kRXhjbHVzaXZlLG5baS0xXS5lbmRFeGNsdXNpdmUpO24uc3BsaWNlKHIsaS1yLG5ldyBXKHMsYSkpfX1zdGF0aWMgdHJ5Q3JlYXRlKHQsbil7aWYoISh0Pm4pKXJldHVybiBuZXcgVyh0LG4pfXN0YXRpYyBvZkxlbmd0aCh0KXtyZXR1cm4gbmV3IFcoMCx0KX1zdGF0aWMgb2ZTdGFydEFuZExlbmd0aCh0LG4pe3JldHVybiBuZXcgVyh0LHQrbil9Y29uc3RydWN0b3IodCxuKXtpZih0aGlzLnN0YXJ0PXQsdGhpcy5lbmRFeGNsdXNpdmU9bix0Pm4pdGhyb3cgbmV3IGJlKGBJbnZhbGlkIHJhbmdlOiAke3RoaXMudG9TdHJpbmcoKX1gKX1nZXQgaXNFbXB0eSgpe3JldHVybiB0aGlzLnN0YXJ0PT09dGhpcy5lbmRFeGNsdXNpdmV9ZGVsdGEodCl7cmV0dXJuIG5ldyBXKHRoaXMuc3RhcnQrdCx0aGlzLmVuZEV4Y2x1c2l2ZSt0KX1kZWx0YVN0YXJ0KHQpe3JldHVybiBuZXcgVyh0aGlzLnN0YXJ0K3QsdGhpcy5lbmRFeGNsdXNpdmUpfWRlbHRhRW5kKHQpe3JldHVybiBuZXcgVyh0aGlzLnN0YXJ0LHRoaXMuZW5kRXhjbHVzaXZlK3QpfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5lbmRFeGNsdXNpdmUtdGhpcy5zdGFydH10b1N0cmluZygpe3JldHVybmBbJHt0aGlzLnN0YXJ0fSwgJHt0aGlzLmVuZEV4Y2x1c2l2ZX0pYH1jb250YWlucyh0KXtyZXR1cm4gdGhpcy5zdGFydDw9dCYmdDx0aGlzLmVuZEV4Y2x1c2l2ZX1qb2luKHQpe3JldHVybiBuZXcgVyhNYXRoLm1pbih0aGlzLnN0YXJ0LHQuc3RhcnQpLE1hdGgubWF4KHRoaXMuZW5kRXhjbHVzaXZlLHQuZW5kRXhjbHVzaXZlKSl9aW50ZXJzZWN0KHQpe2NvbnN0IG49TWF0aC5tYXgodGhpcy5zdGFydCx0LnN0YXJ0KSxyPU1hdGgubWluKHRoaXMuZW5kRXhjbHVzaXZlLHQuZW5kRXhjbHVzaXZlKTtpZihuPD1yKXJldHVybiBuZXcgVyhuLHIpfWludGVyc2VjdHModCl7Y29uc3Qgbj1NYXRoLm1heCh0aGlzLnN0YXJ0LHQuc3RhcnQpLHI9TWF0aC5taW4odGhpcy5lbmRFeGNsdXNpdmUsdC5lbmRFeGNsdXNpdmUpO3JldHVybiBuPHJ9aXNCZWZvcmUodCl7cmV0dXJuIHRoaXMuZW5kRXhjbHVzaXZlPD10LnN0YXJ0fWlzQWZ0ZXIodCl7cmV0dXJuIHRoaXMuc3RhcnQ+PXQuZW5kRXhjbHVzaXZlfXNsaWNlKHQpe3JldHVybiB0LnNsaWNlKHRoaXMuc3RhcnQsdGhpcy5lbmRFeGNsdXNpdmUpfXN1YnN0cmluZyh0KXtyZXR1cm4gdC5zdWJzdHJpbmcodGhpcy5zdGFydCx0aGlzLmVuZEV4Y2x1c2l2ZSl9Y2xpcCh0KXtpZih0aGlzLmlzRW1wdHkpdGhyb3cgbmV3IGJlKGBJbnZhbGlkIGNsaXBwaW5nIHJhbmdlOiAke3RoaXMudG9TdHJpbmcoKX1gKTtyZXR1cm4gTWF0aC5tYXgodGhpcy5zdGFydCxNYXRoLm1pbih0aGlzLmVuZEV4Y2x1c2l2ZS0xLHQpKX1jbGlwQ3ljbGljKHQpe2lmKHRoaXMuaXNFbXB0eSl0aHJvdyBuZXcgYmUoYEludmFsaWQgY2xpcHBpbmcgcmFuZ2U6ICR7dGhpcy50b1N0cmluZygpfWApO3JldHVybiB0PHRoaXMuc3RhcnQ/dGhpcy5lbmRFeGNsdXNpdmUtKHRoaXMuc3RhcnQtdCkldGhpcy5sZW5ndGg6dD49dGhpcy5lbmRFeGNsdXNpdmU/dGhpcy5zdGFydCsodC10aGlzLnN0YXJ0KSV0aGlzLmxlbmd0aDp0fWZvckVhY2godCl7Zm9yKGxldCBuPXRoaXMuc3RhcnQ7bjx0aGlzLmVuZEV4Y2x1c2l2ZTtuKyspdChuKX19ZnVuY3Rpb24gd3QoZSx0KXtjb25zdCBuPVd0KGUsdCk7cmV0dXJuIG49PT0tMT92b2lkIDA6ZVtuXX1mdW5jdGlvbiBXdChlLHQsbj0wLHI9ZS5sZW5ndGgpe2xldCBpPW4scz1yO2Zvcig7aTxzOyl7Y29uc3QgYT1NYXRoLmZsb29yKChpK3MpLzIpO3QoZVthXSk/aT1hKzE6cz1hfXJldHVybiBpLTF9ZnVuY3Rpb24gRHUoZSx0KXtjb25zdCBuPXdyKGUsdCk7cmV0dXJuIG49PT1lLmxlbmd0aD92b2lkIDA6ZVtuXX1mdW5jdGlvbiB3cihlLHQsbj0wLHI9ZS5sZW5ndGgpe2xldCBpPW4scz1yO2Zvcig7aTxzOyl7Y29uc3QgYT1NYXRoLmZsb29yKChpK3MpLzIpO3QoZVthXSk/cz1hOmk9YSsxfXJldHVybiBpfWNvbnN0ICRuPWNsYXNzICRue2NvbnN0cnVjdG9yKHQpe3RoaXMuX2FycmF5PXQsdGhpcy5fZmluZExhc3RNb25vdG9ub3VzTGFzdElkeD0wfWZpbmRMYXN0TW9ub3Rvbm91cyh0KXtpZigkbi5hc3NlcnRJbnZhcmlhbnRzKXtpZih0aGlzLl9wcmV2RmluZExhc3RQcmVkaWNhdGUpe2Zvcihjb25zdCByIG9mIHRoaXMuX2FycmF5KWlmKHRoaXMuX3ByZXZGaW5kTGFzdFByZWRpY2F0ZShyKSYmIXQocikpdGhyb3cgbmV3IEVycm9yKCJNb25vdG9ub3VzQXJyYXk6IGN1cnJlbnQgcHJlZGljYXRlIG11c3QgYmUgd2Vha2VyIHRoYW4gKG9yIGVxdWFsIHRvKSB0aGUgcHJldmlvdXMgcHJlZGljYXRlLiIpfXRoaXMuX3ByZXZGaW5kTGFzdFByZWRpY2F0ZT10fWNvbnN0IG49V3QodGhpcy5fYXJyYXksdCx0aGlzLl9maW5kTGFzdE1vbm90b25vdXNMYXN0SWR4KTtyZXR1cm4gdGhpcy5fZmluZExhc3RNb25vdG9ub3VzTGFzdElkeD1uKzEsbj09PS0xP3ZvaWQgMDp0aGlzLl9hcnJheVtuXX19OyRuLmFzc2VydEludmFyaWFudHM9ITE7bGV0IHluPSRuO2NsYXNzIFV7c3RhdGljIGZyb21SYW5nZUluY2x1c2l2ZSh0KXtyZXR1cm4gbmV3IFUodC5zdGFydExpbmVOdW1iZXIsdC5lbmRMaW5lTnVtYmVyKzEpfXN0YXRpYyBqb2luTWFueSh0KXtpZih0Lmxlbmd0aD09PTApcmV0dXJuW107bGV0IG49bmV3IEZlKHRbMF0uc2xpY2UoKSk7Zm9yKGxldCByPTE7cjx0Lmxlbmd0aDtyKyspbj1uLmdldFVuaW9uKG5ldyBGZSh0W3JdLnNsaWNlKCkpKTtyZXR1cm4gbi5yYW5nZXN9c3RhdGljIGpvaW4odCl7aWYodC5sZW5ndGg9PT0wKXRocm93IG5ldyBiZSgibGluZVJhbmdlcyBjYW5ub3QgYmUgZW1wdHkiKTtsZXQgbj10WzBdLnN0YXJ0TGluZU51bWJlcixyPXRbMF0uZW5kTGluZU51bWJlckV4Y2x1c2l2ZTtmb3IobGV0IGk9MTtpPHQubGVuZ3RoO2krKyluPU1hdGgubWluKG4sdFtpXS5zdGFydExpbmVOdW1iZXIpLHI9TWF0aC5tYXgocix0W2ldLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpO3JldHVybiBuZXcgVShuLHIpfXN0YXRpYyBvZkxlbmd0aCh0LG4pe3JldHVybiBuZXcgVSh0LHQrbil9c3RhdGljIGRlc2VyaWFsaXplKHQpe3JldHVybiBuZXcgVSh0WzBdLHRbMV0pfWNvbnN0cnVjdG9yKHQsbil7aWYodD5uKXRocm93IG5ldyBiZShgc3RhcnRMaW5lTnVtYmVyICR7dH0gY2Fubm90IGJlIGFmdGVyIGVuZExpbmVOdW1iZXJFeGNsdXNpdmUgJHtufWApO3RoaXMuc3RhcnRMaW5lTnVtYmVyPXQsdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPW59Y29udGFpbnModCl7cmV0dXJuIHRoaXMuc3RhcnRMaW5lTnVtYmVyPD10JiZ0PHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1nZXQgaXNFbXB0eSgpe3JldHVybiB0aGlzLnN0YXJ0TGluZU51bWJlcj09PXRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1kZWx0YSh0KXtyZXR1cm4gbmV3IFUodGhpcy5zdGFydExpbmVOdW1iZXIrdCx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUrdCl9ZGVsdGFMZW5ndGgodCl7cmV0dXJuIG5ldyBVKHRoaXMuc3RhcnRMaW5lTnVtYmVyLHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSt0KX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS10aGlzLnN0YXJ0TGluZU51bWJlcn1qb2luKHQpe3JldHVybiBuZXcgVShNYXRoLm1pbih0aGlzLnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0TGluZU51bWJlciksTWF0aC5tYXgodGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkpfXRvU3RyaW5nKCl7cmV0dXJuYFske3RoaXMuc3RhcnRMaW5lTnVtYmVyfSwke3RoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX0pYH1pbnRlcnNlY3QodCl7Y29uc3Qgbj1NYXRoLm1heCh0aGlzLnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0TGluZU51bWJlcikscj1NYXRoLm1pbih0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsdC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKTtpZihuPD1yKXJldHVybiBuZXcgVShuLHIpfWludGVyc2VjdHNTdHJpY3QodCl7cmV0dXJuIHRoaXMuc3RhcnRMaW5lTnVtYmVyPHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSYmdC5zdGFydExpbmVOdW1iZXI8dGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlfW92ZXJsYXBPclRvdWNoKHQpe3JldHVybiB0aGlzLnN0YXJ0TGluZU51bWJlcjw9dC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlJiZ0LnN0YXJ0TGluZU51bWJlcjw9dGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlfWVxdWFscyh0KXtyZXR1cm4gdGhpcy5zdGFydExpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPT09dC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlfXRvSW5jbHVzaXZlUmFuZ2UoKXtyZXR1cm4gdGhpcy5pc0VtcHR5P251bGw6bmV3IHoodGhpcy5zdGFydExpbmVOdW1iZXIsMSx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUil9dG9FeGNsdXNpdmVSYW5nZSgpe3JldHVybiBuZXcgeih0aGlzLnN0YXJ0TGluZU51bWJlciwxLHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSwxKX1tYXBUb0xpbmVBcnJheSh0KXtjb25zdCBuPVtdO2ZvcihsZXQgcj10aGlzLnN0YXJ0TGluZU51bWJlcjtyPHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTtyKyspbi5wdXNoKHQocikpO3JldHVybiBufWZvckVhY2godCl7Zm9yKGxldCBuPXRoaXMuc3RhcnRMaW5lTnVtYmVyO248dGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlO24rKyl0KG4pfXNlcmlhbGl6ZSgpe3JldHVyblt0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmVdfWluY2x1ZGVzKHQpe3JldHVybiB0aGlzLnN0YXJ0TGluZU51bWJlcjw9dCYmdDx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmV9dG9PZmZzZXRSYW5nZSgpe3JldHVybiBuZXcgVyh0aGlzLnN0YXJ0TGluZU51bWJlci0xLHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xKX19Y2xhc3MgRmV7Y29uc3RydWN0b3IodD1bXSl7dGhpcy5fbm9ybWFsaXplZFJhbmdlcz10fWdldCByYW5nZXMoKXtyZXR1cm4gdGhpcy5fbm9ybWFsaXplZFJhbmdlc31hZGRSYW5nZSh0KXtpZih0Lmxlbmd0aD09PTApcmV0dXJuO2NvbnN0IG49d3IodGhpcy5fbm9ybWFsaXplZFJhbmdlcyxpPT5pLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU+PXQuc3RhcnRMaW5lTnVtYmVyKSxyPVd0KHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMsaT0+aS5zdGFydExpbmVOdW1iZXI8PXQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkrMTtpZihuPT09cil0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLnNwbGljZShuLDAsdCk7ZWxzZSBpZihuPT09ci0xKXtjb25zdCBpPXRoaXMuX25vcm1hbGl6ZWRSYW5nZXNbbl07dGhpcy5fbm9ybWFsaXplZFJhbmdlc1tuXT1pLmpvaW4odCl9ZWxzZXtjb25zdCBpPXRoaXMuX25vcm1hbGl6ZWRSYW5nZXNbbl0uam9pbih0aGlzLl9ub3JtYWxpemVkUmFuZ2VzW3ItMV0pLmpvaW4odCk7dGhpcy5fbm9ybWFsaXplZFJhbmdlcy5zcGxpY2UobixyLW4saSl9fWNvbnRhaW5zKHQpe2NvbnN0IG49d3QodGhpcy5fbm9ybWFsaXplZFJhbmdlcyxyPT5yLnN0YXJ0TGluZU51bWJlcjw9dCk7cmV0dXJuISFuJiZuLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU+dH1pbnRlcnNlY3RzKHQpe2NvbnN0IG49d3QodGhpcy5fbm9ybWFsaXplZFJhbmdlcyxyPT5yLnN0YXJ0TGluZU51bWJlcjx0LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpO3JldHVybiEhbiYmbi5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPnQuc3RhcnRMaW5lTnVtYmVyfWdldFVuaW9uKHQpe2lmKHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoPT09MClyZXR1cm4gdDtpZih0Ll9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aD09PTApcmV0dXJuIHRoaXM7Y29uc3Qgbj1bXTtsZXQgcj0wLGk9MCxzPW51bGw7Zm9yKDtyPHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RofHxpPHQuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoOyl7bGV0IGE9bnVsbDtpZihyPHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoJiZpPHQuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoKXtjb25zdCBsPXRoaXMuX25vcm1hbGl6ZWRSYW5nZXNbcl0sbz10Ll9ub3JtYWxpemVkUmFuZ2VzW2ldO2wuc3RhcnRMaW5lTnVtYmVyPG8uc3RhcnRMaW5lTnVtYmVyPyhhPWwscisrKTooYT1vLGkrKyl9ZWxzZSByPHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoPyhhPXRoaXMuX25vcm1hbGl6ZWRSYW5nZXNbcl0scisrKTooYT10Ll9ub3JtYWxpemVkUmFuZ2VzW2ldLGkrKyk7cz09PW51bGw/cz1hOnMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT49YS5zdGFydExpbmVOdW1iZXI/cz1uZXcgVShzLnN0YXJ0TGluZU51bWJlcixNYXRoLm1heChzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsYS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKSk6KG4ucHVzaChzKSxzPWEpfXJldHVybiBzIT09bnVsbCYmbi5wdXNoKHMpLG5ldyBGZShuKX1zdWJ0cmFjdEZyb20odCl7Y29uc3Qgbj13cih0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLGE9PmEuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT49dC5zdGFydExpbmVOdW1iZXIpLHI9V3QodGhpcy5fbm9ybWFsaXplZFJhbmdlcyxhPT5hLnN0YXJ0TGluZU51bWJlcjw9dC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKSsxO2lmKG49PT1yKXJldHVybiBuZXcgRmUoW3RdKTtjb25zdCBpPVtdO2xldCBzPXQuc3RhcnRMaW5lTnVtYmVyO2ZvcihsZXQgYT1uO2E8cjthKyspe2NvbnN0IGw9dGhpcy5fbm9ybWFsaXplZFJhbmdlc1thXTtsLnN0YXJ0TGluZU51bWJlcj5zJiZpLnB1c2gobmV3IFUocyxsLnN0YXJ0TGluZU51bWJlcikpLHM9bC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlfXJldHVybiBzPHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSYmaS5wdXNoKG5ldyBVKHMsdC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKSksbmV3IEZlKGkpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMubWFwKHQ9PnQudG9TdHJpbmcoKSkuam9pbigiLCAiKX1nZXRJbnRlcnNlY3Rpb24odCl7Y29uc3Qgbj1bXTtsZXQgcj0wLGk9MDtmb3IoO3I8dGhpcy5fbm9ybWFsaXplZFJhbmdlcy5sZW5ndGgmJmk8dC5fbm9ybWFsaXplZFJhbmdlcy5sZW5ndGg7KXtjb25zdCBzPXRoaXMuX25vcm1hbGl6ZWRSYW5nZXNbcl0sYT10Ll9ub3JtYWxpemVkUmFuZ2VzW2ldLGw9cy5pbnRlcnNlY3QoYSk7bCYmIWwuaXNFbXB0eSYmbi5wdXNoKGwpLHMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTxhLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU/cisrOmkrK31yZXR1cm4gbmV3IEZlKG4pfWdldFdpdGhEZWx0YSh0KXtyZXR1cm4gbmV3IEZlKHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMubWFwKG49Pm4uZGVsdGEodCkpKX19Y29uc3QgcnQ9Y2xhc3MgcnR7c3RhdGljIGJldHdlZW5Qb3NpdGlvbnModCxuKXtyZXR1cm4gdC5saW5lTnVtYmVyPT09bi5saW5lTnVtYmVyP25ldyBydCgwLG4uY29sdW1uLXQuY29sdW1uKTpuZXcgcnQobi5saW5lTnVtYmVyLXQubGluZU51bWJlcixuLmNvbHVtbi0xKX1zdGF0aWMgb2ZSYW5nZSh0KXtyZXR1cm4gcnQuYmV0d2VlblBvc2l0aW9ucyh0LmdldFN0YXJ0UG9zaXRpb24oKSx0LmdldEVuZFBvc2l0aW9uKCkpfXN0YXRpYyBvZlRleHQodCl7bGV0IG49MCxyPTA7Zm9yKGNvbnN0IGkgb2YgdClpPT09YApgPyhuKysscj0wKTpyKys7cmV0dXJuIG5ldyBydChuLHIpfWNvbnN0cnVjdG9yKHQsbil7dGhpcy5saW5lQ291bnQ9dCx0aGlzLmNvbHVtbkNvdW50PW59aXNHcmVhdGVyVGhhbk9yRXF1YWxUbyh0KXtyZXR1cm4gdGhpcy5saW5lQ291bnQhPT10LmxpbmVDb3VudD90aGlzLmxpbmVDb3VudD50LmxpbmVDb3VudDp0aGlzLmNvbHVtbkNvdW50Pj10LmNvbHVtbkNvdW50fWNyZWF0ZVJhbmdlKHQpe3JldHVybiB0aGlzLmxpbmVDb3VudD09PTA/bmV3IHoodC5saW5lTnVtYmVyLHQuY29sdW1uLHQubGluZU51bWJlcix0LmNvbHVtbit0aGlzLmNvbHVtbkNvdW50KTpuZXcgeih0LmxpbmVOdW1iZXIsdC5jb2x1bW4sdC5saW5lTnVtYmVyK3RoaXMubGluZUNvdW50LHRoaXMuY29sdW1uQ291bnQrMSl9YWRkVG9Qb3NpdGlvbih0KXtyZXR1cm4gdGhpcy5saW5lQ291bnQ9PT0wP25ldyBlZSh0LmxpbmVOdW1iZXIsdC5jb2x1bW4rdGhpcy5jb2x1bW5Db3VudCk6bmV3IGVlKHQubGluZU51bWJlcit0aGlzLmxpbmVDb3VudCx0aGlzLmNvbHVtbkNvdW50KzEpfXRvU3RyaW5nKCl7cmV0dXJuYCR7dGhpcy5saW5lQ291bnR9LCR7dGhpcy5jb2x1bW5Db3VudH1gfX07cnQuemVybz1uZXcgcnQoMCwwKTtsZXQgV3M9cnQ7Y2xhc3MgT3V7Y29uc3RydWN0b3IodCxuKXt0aGlzLnJhbmdlPXQsdGhpcy50ZXh0PW59dG9TaW5nbGVFZGl0T3BlcmF0aW9uKCl7cmV0dXJue3JhbmdlOnRoaXMucmFuZ2UsdGV4dDp0aGlzLnRleHR9fX1jbGFzcyBMZXtzdGF0aWMgaW52ZXJzZSh0LG4scil7Y29uc3QgaT1bXTtsZXQgcz0xLGE9MTtmb3IoY29uc3QgbyBvZiB0KXtjb25zdCB1PW5ldyBMZShuZXcgVShzLG8ub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyKSxuZXcgVShhLG8ubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyKSk7dS5tb2RpZmllZC5pc0VtcHR5fHxpLnB1c2godSkscz1vLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsYT1vLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmV9Y29uc3QgbD1uZXcgTGUobmV3IFUocyxuKzEpLG5ldyBVKGEscisxKSk7cmV0dXJuIGwubW9kaWZpZWQuaXNFbXB0eXx8aS5wdXNoKGwpLGl9c3RhdGljIGNsaXAodCxuLHIpe2NvbnN0IGk9W107Zm9yKGNvbnN0IHMgb2YgdCl7Y29uc3QgYT1zLm9yaWdpbmFsLmludGVyc2VjdChuKSxsPXMubW9kaWZpZWQuaW50ZXJzZWN0KHIpO2EmJiFhLmlzRW1wdHkmJmwmJiFsLmlzRW1wdHkmJmkucHVzaChuZXcgTGUoYSxsKSl9cmV0dXJuIGl9Y29uc3RydWN0b3IodCxuKXt0aGlzLm9yaWdpbmFsPXQsdGhpcy5tb2RpZmllZD1ufXRvU3RyaW5nKCl7cmV0dXJuYHske3RoaXMub3JpZ2luYWwudG9TdHJpbmcoKX0tPiR7dGhpcy5tb2RpZmllZC50b1N0cmluZygpfX1gfWZsaXAoKXtyZXR1cm4gbmV3IExlKHRoaXMubW9kaWZpZWQsdGhpcy5vcmlnaW5hbCl9am9pbih0KXtyZXR1cm4gbmV3IExlKHRoaXMub3JpZ2luYWwuam9pbih0Lm9yaWdpbmFsKSx0aGlzLm1vZGlmaWVkLmpvaW4odC5tb2RpZmllZCkpfXRvUmFuZ2VNYXBwaW5nKCl7Y29uc3QgdD10aGlzLm9yaWdpbmFsLnRvSW5jbHVzaXZlUmFuZ2UoKSxuPXRoaXMubW9kaWZpZWQudG9JbmNsdXNpdmVSYW5nZSgpO2lmKHQmJm4pcmV0dXJuIG5ldyBSZSh0LG4pO2lmKHRoaXMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyPT09MXx8dGhpcy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXI9PT0xKXtpZighKHRoaXMubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyPT09MSYmdGhpcy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXI9PT0xKSl0aHJvdyBuZXcgYmUoIm5vdCBhIHZhbGlkIGRpZmYiKTtyZXR1cm4gbmV3IFJlKG5ldyB6KHRoaXMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLDEsdGhpcy5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLDEpLG5ldyB6KHRoaXMubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLDEsdGhpcy5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLDEpKX1lbHNlIHJldHVybiBuZXcgUmUobmV3IHoodGhpcy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUix0aGlzLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksbmV3IHoodGhpcy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUix0aGlzLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikpfXRvUmFuZ2VNYXBwaW5nMih0LG4pe2lmKEhzKHRoaXMub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSx0KSYmSHModGhpcy5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLG4pKXJldHVybiBuZXcgUmUobmV3IHoodGhpcy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIsMSx0aGlzLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsMSksbmV3IHoodGhpcy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIsMSx0aGlzLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsMSkpO2lmKCF0aGlzLm9yaWdpbmFsLmlzRW1wdHkmJiF0aGlzLm1vZGlmaWVkLmlzRW1wdHkpcmV0dXJuIG5ldyBSZSh6LmZyb21Qb3NpdGlvbnMobmV3IGVlKHRoaXMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLDEpLF90KG5ldyBlZSh0aGlzLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksdCkpLHouZnJvbVBvc2l0aW9ucyhuZXcgZWUodGhpcy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIsMSksX3QobmV3IGVlKHRoaXMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSxuKSkpO2lmKHRoaXMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyPjEmJnRoaXMubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyPjEpcmV0dXJuIG5ldyBSZSh6LmZyb21Qb3NpdGlvbnMoX3QobmV3IGVlKHRoaXMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLTEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLHQpLF90KG5ldyBlZSh0aGlzLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksdCkpLHouZnJvbVBvc2l0aW9ucyhfdChuZXcgZWUodGhpcy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksbiksX3QobmV3IGVlKHRoaXMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSxuKSkpO3Rocm93IG5ldyBiZX19ZnVuY3Rpb24gX3QoZSx0KXtpZihlLmxpbmVOdW1iZXI8MSlyZXR1cm4gbmV3IGVlKDEsMSk7aWYoZS5saW5lTnVtYmVyPnQubGVuZ3RoKXJldHVybiBuZXcgZWUodC5sZW5ndGgsdFt0Lmxlbmd0aC0xXS5sZW5ndGgrMSk7Y29uc3Qgbj10W2UubGluZU51bWJlci0xXTtyZXR1cm4gZS5jb2x1bW4+bi5sZW5ndGgrMT9uZXcgZWUoZS5saW5lTnVtYmVyLG4ubGVuZ3RoKzEpOmV9ZnVuY3Rpb24gSHMoZSx0KXtyZXR1cm4gZT49MSYmZTw9dC5sZW5ndGh9Y2xhc3MgamUgZXh0ZW5kcyBMZXtzdGF0aWMgZnJvbVJhbmdlTWFwcGluZ3ModCl7Y29uc3Qgbj1VLmpvaW4odC5tYXAoaT0+VS5mcm9tUmFuZ2VJbmNsdXNpdmUoaS5vcmlnaW5hbFJhbmdlKSkpLHI9VS5qb2luKHQubWFwKGk9PlUuZnJvbVJhbmdlSW5jbHVzaXZlKGkubW9kaWZpZWRSYW5nZSkpKTtyZXR1cm4gbmV3IGplKG4scix0KX1jb25zdHJ1Y3Rvcih0LG4scil7c3VwZXIodCxuKSx0aGlzLmlubmVyQ2hhbmdlcz1yfWZsaXAoKXt2YXIgdDtyZXR1cm4gbmV3IGplKHRoaXMubW9kaWZpZWQsdGhpcy5vcmlnaW5hbCwodD10aGlzLmlubmVyQ2hhbmdlcyk9PW51bGw/dm9pZCAwOnQubWFwKG49Pm4uZmxpcCgpKSl9d2l0aElubmVyQ2hhbmdlc0Zyb21MaW5lUmFuZ2VzKCl7cmV0dXJuIG5ldyBqZSh0aGlzLm9yaWdpbmFsLHRoaXMubW9kaWZpZWQsW3RoaXMudG9SYW5nZU1hcHBpbmcoKV0pfX1jbGFzcyBSZXtzdGF0aWMgYXNzZXJ0U29ydGVkKHQpe2ZvcihsZXQgbj0xO248dC5sZW5ndGg7bisrKXtjb25zdCByPXRbbi0xXSxpPXRbbl07aWYoIShyLm9yaWdpbmFsUmFuZ2UuZ2V0RW5kUG9zaXRpb24oKS5pc0JlZm9yZU9yRXF1YWwoaS5vcmlnaW5hbFJhbmdlLmdldFN0YXJ0UG9zaXRpb24oKSkmJnIubW9kaWZpZWRSYW5nZS5nZXRFbmRQb3NpdGlvbigpLmlzQmVmb3JlT3JFcXVhbChpLm1vZGlmaWVkUmFuZ2UuZ2V0U3RhcnRQb3NpdGlvbigpKSkpdGhyb3cgbmV3IGJlKCJSYW5nZSBtYXBwaW5ncyBtdXN0IGJlIHNvcnRlZCIpfX1jb25zdHJ1Y3Rvcih0LG4pe3RoaXMub3JpZ2luYWxSYW5nZT10LHRoaXMubW9kaWZpZWRSYW5nZT1ufXRvU3RyaW5nKCl7cmV0dXJuYHske3RoaXMub3JpZ2luYWxSYW5nZS50b1N0cmluZygpfS0+JHt0aGlzLm1vZGlmaWVkUmFuZ2UudG9TdHJpbmcoKX19YH1mbGlwKCl7cmV0dXJuIG5ldyBSZSh0aGlzLm1vZGlmaWVkUmFuZ2UsdGhpcy5vcmlnaW5hbFJhbmdlKX10b1RleHRFZGl0KHQpe2NvbnN0IG49dC5nZXRWYWx1ZU9mUmFuZ2UodGhpcy5tb2RpZmllZFJhbmdlKTtyZXR1cm4gbmV3IE91KHRoaXMub3JpZ2luYWxSYW5nZSxuKX19Y29uc3QgJHU9MztjbGFzcyBVdXtjb21wdXRlRGlmZih0LG4scil7dmFyIG87Y29uc3Qgcz1uZXcganUodCxuLHttYXhDb21wdXRhdGlvblRpbWU6ci5tYXhDb21wdXRhdGlvblRpbWVNcyxzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZTpyLmlnbm9yZVRyaW1XaGl0ZXNwYWNlLHNob3VsZENvbXB1dGVDaGFyQ2hhbmdlczohMCxzaG91bGRNYWtlUHJldHR5RGlmZjohMCxzaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzOiEwfSkuY29tcHV0ZURpZmYoKSxhPVtdO2xldCBsPW51bGw7Zm9yKGNvbnN0IHUgb2Ygcy5jaGFuZ2VzKXtsZXQgaDt1Lm9yaWdpbmFsRW5kTGluZU51bWJlcj09PTA/aD1uZXcgVSh1Lm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyKzEsdS5vcmlnaW5hbFN0YXJ0TGluZU51bWJlcisxKTpoPW5ldyBVKHUub3JpZ2luYWxTdGFydExpbmVOdW1iZXIsdS5vcmlnaW5hbEVuZExpbmVOdW1iZXIrMSk7bGV0IGY7dS5tb2RpZmllZEVuZExpbmVOdW1iZXI9PT0wP2Y9bmV3IFUodS5tb2RpZmllZFN0YXJ0TGluZU51bWJlcisxLHUubW9kaWZpZWRTdGFydExpbmVOdW1iZXIrMSk6Zj1uZXcgVSh1Lm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyLHUubW9kaWZpZWRFbmRMaW5lTnVtYmVyKzEpO2xldCBkPW5ldyBqZShoLGYsKG89dS5jaGFyQ2hhbmdlcyk9PW51bGw/dm9pZCAwOm8ubWFwKG09Pm5ldyBSZShuZXcgeihtLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyLG0ub3JpZ2luYWxTdGFydENvbHVtbixtLm9yaWdpbmFsRW5kTGluZU51bWJlcixtLm9yaWdpbmFsRW5kQ29sdW1uKSxuZXcgeihtLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyLG0ubW9kaWZpZWRTdGFydENvbHVtbixtLm1vZGlmaWVkRW5kTGluZU51bWJlcixtLm1vZGlmaWVkRW5kQ29sdW1uKSkpKTtsJiYobC5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPT09ZC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXJ8fGwub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT09PWQub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyKSYmKGQ9bmV3IGplKGwub3JpZ2luYWwuam9pbihkLm9yaWdpbmFsKSxsLm1vZGlmaWVkLmpvaW4oZC5tb2RpZmllZCksbC5pbm5lckNoYW5nZXMmJmQuaW5uZXJDaGFuZ2VzP2wuaW5uZXJDaGFuZ2VzLmNvbmNhdChkLmlubmVyQ2hhbmdlcyk6dm9pZCAwKSxhLnBvcCgpKSxhLnB1c2goZCksbD1kfXJldHVybiB2bigoKT0+T3MoYSwodSxoKT0+aC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItdS5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPT09aC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItdS5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlJiZ1Lm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU8aC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXImJnUubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTxoLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcikpLG5ldyB4bihhLFtdLHMucXVpdEVhcmx5KX19ZnVuY3Rpb24genMoZSx0LG4scil7cmV0dXJuIG5ldyBaZShlLHQsbikuQ29tcHV0ZURpZmYocil9bGV0IEdzPWNsYXNze2NvbnN0cnVjdG9yKHQpe2NvbnN0IG49W10scj1bXTtmb3IobGV0IGk9MCxzPXQubGVuZ3RoO2k8cztpKyspbltpXT1fcih0W2ldLDEpLHJbaV09THIodFtpXSwxKTt0aGlzLmxpbmVzPXQsdGhpcy5fc3RhcnRDb2x1bW5zPW4sdGhpcy5fZW5kQ29sdW1ucz1yfWdldEVsZW1lbnRzKCl7Y29uc3QgdD1bXTtmb3IobGV0IG49MCxyPXRoaXMubGluZXMubGVuZ3RoO248cjtuKyspdFtuXT10aGlzLmxpbmVzW25dLnN1YnN0cmluZyh0aGlzLl9zdGFydENvbHVtbnNbbl0tMSx0aGlzLl9lbmRDb2x1bW5zW25dLTEpO3JldHVybiB0fWdldFN0cmljdEVsZW1lbnQodCl7cmV0dXJuIHRoaXMubGluZXNbdF19Z2V0U3RhcnRMaW5lTnVtYmVyKHQpe3JldHVybiB0KzF9Z2V0RW5kTGluZU51bWJlcih0KXtyZXR1cm4gdCsxfWNyZWF0ZUNoYXJTZXF1ZW5jZSh0LG4scil7Y29uc3QgaT1bXSxzPVtdLGE9W107bGV0IGw9MDtmb3IobGV0IG89bjtvPD1yO28rKyl7Y29uc3QgdT10aGlzLmxpbmVzW29dLGg9dD90aGlzLl9zdGFydENvbHVtbnNbb106MSxmPXQ/dGhpcy5fZW5kQ29sdW1uc1tvXTp1Lmxlbmd0aCsxO2ZvcihsZXQgZD1oO2Q8ZjtkKyspaVtsXT11LmNoYXJDb2RlQXQoZC0xKSxzW2xdPW8rMSxhW2xdPWQsbCsrOyF0JiZvPHImJihpW2xdPTEwLHNbbF09bysxLGFbbF09dS5sZW5ndGgrMSxsKyspfXJldHVybiBuZXcgQnUoaSxzLGEpfX07Y2xhc3MgQnV7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuX2NoYXJDb2Rlcz10LHRoaXMuX2xpbmVOdW1iZXJzPW4sdGhpcy5fY29sdW1ucz1yfXRvU3RyaW5nKCl7cmV0dXJuIlsiK3RoaXMuX2NoYXJDb2Rlcy5tYXAoKHQsbik9Pih0PT09MTA/IlxcbiI6U3RyaW5nLmZyb21DaGFyQ29kZSh0KSkrYC0oJHt0aGlzLl9saW5lTnVtYmVyc1tuXX0sJHt0aGlzLl9jb2x1bW5zW25dfSlgKS5qb2luKCIsICIpKyJdIn1fYXNzZXJ0SW5kZXgodCxuKXtpZih0PDB8fHQ+PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSWxsZWdhbCBpbmRleCIpfWdldEVsZW1lbnRzKCl7cmV0dXJuIHRoaXMuX2NoYXJDb2Rlc31nZXRTdGFydExpbmVOdW1iZXIodCl7cmV0dXJuIHQ+MCYmdD09PXRoaXMuX2xpbmVOdW1iZXJzLmxlbmd0aD90aGlzLmdldEVuZExpbmVOdW1iZXIodC0xKToodGhpcy5fYXNzZXJ0SW5kZXgodCx0aGlzLl9saW5lTnVtYmVycyksdGhpcy5fbGluZU51bWJlcnNbdF0pfWdldEVuZExpbmVOdW1iZXIodCl7cmV0dXJuIHQ9PT0tMT90aGlzLmdldFN0YXJ0TGluZU51bWJlcih0KzEpOih0aGlzLl9hc3NlcnRJbmRleCh0LHRoaXMuX2xpbmVOdW1iZXJzKSx0aGlzLl9jaGFyQ29kZXNbdF09PT0xMD90aGlzLl9saW5lTnVtYmVyc1t0XSsxOnRoaXMuX2xpbmVOdW1iZXJzW3RdKX1nZXRTdGFydENvbHVtbih0KXtyZXR1cm4gdD4wJiZ0PT09dGhpcy5fY29sdW1ucy5sZW5ndGg/dGhpcy5nZXRFbmRDb2x1bW4odC0xKToodGhpcy5fYXNzZXJ0SW5kZXgodCx0aGlzLl9jb2x1bW5zKSx0aGlzLl9jb2x1bW5zW3RdKX1nZXRFbmRDb2x1bW4odCl7cmV0dXJuIHQ9PT0tMT90aGlzLmdldFN0YXJ0Q29sdW1uKHQrMSk6KHRoaXMuX2Fzc2VydEluZGV4KHQsdGhpcy5fY29sdW1ucyksdGhpcy5fY2hhckNvZGVzW3RdPT09MTA/MTp0aGlzLl9jb2x1bW5zW3RdKzEpfX1jbGFzcyBMdHtjb25zdHJ1Y3Rvcih0LG4scixpLHMsYSxsLG8pe3RoaXMub3JpZ2luYWxTdGFydExpbmVOdW1iZXI9dCx0aGlzLm9yaWdpbmFsU3RhcnRDb2x1bW49bix0aGlzLm9yaWdpbmFsRW5kTGluZU51bWJlcj1yLHRoaXMub3JpZ2luYWxFbmRDb2x1bW49aSx0aGlzLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyPXMsdGhpcy5tb2RpZmllZFN0YXJ0Q29sdW1uPWEsdGhpcy5tb2RpZmllZEVuZExpbmVOdW1iZXI9bCx0aGlzLm1vZGlmaWVkRW5kQ29sdW1uPW99c3RhdGljIGNyZWF0ZUZyb21EaWZmQ2hhbmdlKHQsbixyKXtjb25zdCBpPW4uZ2V0U3RhcnRMaW5lTnVtYmVyKHQub3JpZ2luYWxTdGFydCkscz1uLmdldFN0YXJ0Q29sdW1uKHQub3JpZ2luYWxTdGFydCksYT1uLmdldEVuZExpbmVOdW1iZXIodC5vcmlnaW5hbFN0YXJ0K3Qub3JpZ2luYWxMZW5ndGgtMSksbD1uLmdldEVuZENvbHVtbih0Lm9yaWdpbmFsU3RhcnQrdC5vcmlnaW5hbExlbmd0aC0xKSxvPXIuZ2V0U3RhcnRMaW5lTnVtYmVyKHQubW9kaWZpZWRTdGFydCksdT1yLmdldFN0YXJ0Q29sdW1uKHQubW9kaWZpZWRTdGFydCksaD1yLmdldEVuZExpbmVOdW1iZXIodC5tb2RpZmllZFN0YXJ0K3QubW9kaWZpZWRMZW5ndGgtMSksZj1yLmdldEVuZENvbHVtbih0Lm1vZGlmaWVkU3RhcnQrdC5tb2RpZmllZExlbmd0aC0xKTtyZXR1cm4gbmV3IEx0KGkscyxhLGwsbyx1LGgsZil9fWZ1bmN0aW9uIHF1KGUpe2lmKGUubGVuZ3RoPD0xKXJldHVybiBlO2NvbnN0IHQ9W2VbMF1dO2xldCBuPXRbMF07Zm9yKGxldCByPTEsaT1lLmxlbmd0aDtyPGk7cisrKXtjb25zdCBzPWVbcl0sYT1zLm9yaWdpbmFsU3RhcnQtKG4ub3JpZ2luYWxTdGFydCtuLm9yaWdpbmFsTGVuZ3RoKSxsPXMubW9kaWZpZWRTdGFydC0obi5tb2RpZmllZFN0YXJ0K24ubW9kaWZpZWRMZW5ndGgpO01hdGgubWluKGEsbCk8JHU/KG4ub3JpZ2luYWxMZW5ndGg9cy5vcmlnaW5hbFN0YXJ0K3Mub3JpZ2luYWxMZW5ndGgtbi5vcmlnaW5hbFN0YXJ0LG4ubW9kaWZpZWRMZW5ndGg9cy5tb2RpZmllZFN0YXJ0K3MubW9kaWZpZWRMZW5ndGgtbi5tb2RpZmllZFN0YXJ0KToodC5wdXNoKHMpLG49cyl9cmV0dXJuIHR9Y2xhc3MgSHR7Y29uc3RydWN0b3IodCxuLHIsaSxzKXt0aGlzLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyPXQsdGhpcy5vcmlnaW5hbEVuZExpbmVOdW1iZXI9bix0aGlzLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyPXIsdGhpcy5tb2RpZmllZEVuZExpbmVOdW1iZXI9aSx0aGlzLmNoYXJDaGFuZ2VzPXN9c3RhdGljIGNyZWF0ZUZyb21EaWZmUmVzdWx0KHQsbixyLGkscyxhLGwpe2xldCBvLHUsaCxmLGQ7aWYobi5vcmlnaW5hbExlbmd0aD09PTA/KG89ci5nZXRTdGFydExpbmVOdW1iZXIobi5vcmlnaW5hbFN0YXJ0KS0xLHU9MCk6KG89ci5nZXRTdGFydExpbmVOdW1iZXIobi5vcmlnaW5hbFN0YXJ0KSx1PXIuZ2V0RW5kTGluZU51bWJlcihuLm9yaWdpbmFsU3RhcnQrbi5vcmlnaW5hbExlbmd0aC0xKSksbi5tb2RpZmllZExlbmd0aD09PTA/KGg9aS5nZXRTdGFydExpbmVOdW1iZXIobi5tb2RpZmllZFN0YXJ0KS0xLGY9MCk6KGg9aS5nZXRTdGFydExpbmVOdW1iZXIobi5tb2RpZmllZFN0YXJ0KSxmPWkuZ2V0RW5kTGluZU51bWJlcihuLm1vZGlmaWVkU3RhcnQrbi5tb2RpZmllZExlbmd0aC0xKSksYSYmbi5vcmlnaW5hbExlbmd0aD4wJiZuLm9yaWdpbmFsTGVuZ3RoPDIwJiZuLm1vZGlmaWVkTGVuZ3RoPjAmJm4ubW9kaWZpZWRMZW5ndGg8MjAmJnMoKSl7Y29uc3QgbT1yLmNyZWF0ZUNoYXJTZXF1ZW5jZSh0LG4ub3JpZ2luYWxTdGFydCxuLm9yaWdpbmFsU3RhcnQrbi5vcmlnaW5hbExlbmd0aC0xKSxnPWkuY3JlYXRlQ2hhclNlcXVlbmNlKHQsbi5tb2RpZmllZFN0YXJ0LG4ubW9kaWZpZWRTdGFydCtuLm1vZGlmaWVkTGVuZ3RoLTEpO2lmKG0uZ2V0RWxlbWVudHMoKS5sZW5ndGg+MCYmZy5nZXRFbGVtZW50cygpLmxlbmd0aD4wKXtsZXQgcD16cyhtLGcscywhMCkuY2hhbmdlcztsJiYocD1xdShwKSksZD1bXTtmb3IobGV0IHg9MCx3PXAubGVuZ3RoO3g8dzt4KyspZC5wdXNoKEx0LmNyZWF0ZUZyb21EaWZmQ2hhbmdlKHBbeF0sbSxnKSl9fXJldHVybiBuZXcgSHQobyx1LGgsZixkKX19Y2xhc3MganV7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzPXIuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzLHRoaXMuc2hvdWxkUG9zdFByb2Nlc3NDaGFyQ2hhbmdlcz1yLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMsdGhpcy5zaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZT1yLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLHRoaXMuc2hvdWxkTWFrZVByZXR0eURpZmY9ci5zaG91bGRNYWtlUHJldHR5RGlmZix0aGlzLm9yaWdpbmFsTGluZXM9dCx0aGlzLm1vZGlmaWVkTGluZXM9bix0aGlzLm9yaWdpbmFsPW5ldyBHcyh0KSx0aGlzLm1vZGlmaWVkPW5ldyBHcyhuKSx0aGlzLmNvbnRpbnVlTGluZURpZmY9SnMoci5tYXhDb21wdXRhdGlvblRpbWUpLHRoaXMuY29udGludWVDaGFyRGlmZj1KcyhyLm1heENvbXB1dGF0aW9uVGltZT09PTA/MDpNYXRoLm1pbihyLm1heENvbXB1dGF0aW9uVGltZSw1ZTMpKX1jb21wdXRlRGlmZigpe2lmKHRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoPT09MSYmdGhpcy5vcmlnaW5hbC5saW5lc1swXS5sZW5ndGg9PT0wKXJldHVybiB0aGlzLm1vZGlmaWVkLmxpbmVzLmxlbmd0aD09PTEmJnRoaXMubW9kaWZpZWQubGluZXNbMF0ubGVuZ3RoPT09MD97cXVpdEVhcmx5OiExLGNoYW5nZXM6W119OntxdWl0RWFybHk6ITEsY2hhbmdlczpbe29yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOjEsb3JpZ2luYWxFbmRMaW5lTnVtYmVyOjEsbW9kaWZpZWRTdGFydExpbmVOdW1iZXI6MSxtb2RpZmllZEVuZExpbmVOdW1iZXI6dGhpcy5tb2RpZmllZC5saW5lcy5sZW5ndGgsY2hhckNoYW5nZXM6dm9pZCAwfV19O2lmKHRoaXMubW9kaWZpZWQubGluZXMubGVuZ3RoPT09MSYmdGhpcy5tb2RpZmllZC5saW5lc1swXS5sZW5ndGg9PT0wKXJldHVybntxdWl0RWFybHk6ITEsY2hhbmdlczpbe29yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOjEsb3JpZ2luYWxFbmRMaW5lTnVtYmVyOnRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoLG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyOjEsbW9kaWZpZWRFbmRMaW5lTnVtYmVyOjEsY2hhckNoYW5nZXM6dm9pZCAwfV19O2NvbnN0IHQ9enModGhpcy5vcmlnaW5hbCx0aGlzLm1vZGlmaWVkLHRoaXMuY29udGludWVMaW5lRGlmZix0aGlzLnNob3VsZE1ha2VQcmV0dHlEaWZmKSxuPXQuY2hhbmdlcyxyPXQucXVpdEVhcmx5O2lmKHRoaXMuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2Upe2NvbnN0IGw9W107Zm9yKGxldCBvPTAsdT1uLmxlbmd0aDtvPHU7bysrKWwucHVzaChIdC5jcmVhdGVGcm9tRGlmZlJlc3VsdCh0aGlzLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLG5bb10sdGhpcy5vcmlnaW5hbCx0aGlzLm1vZGlmaWVkLHRoaXMuY29udGludWVDaGFyRGlmZix0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyx0aGlzLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMpKTtyZXR1cm57cXVpdEVhcmx5OnIsY2hhbmdlczpsfX1jb25zdCBpPVtdO2xldCBzPTAsYT0wO2ZvcihsZXQgbD0tMSxvPW4ubGVuZ3RoO2w8bztsKyspe2NvbnN0IHU9bCsxPG8/bltsKzFdOm51bGwsaD11P3Uub3JpZ2luYWxTdGFydDp0aGlzLm9yaWdpbmFsTGluZXMubGVuZ3RoLGY9dT91Lm1vZGlmaWVkU3RhcnQ6dGhpcy5tb2RpZmllZExpbmVzLmxlbmd0aDtmb3IoO3M8aCYmYTxmOyl7Y29uc3QgZD10aGlzLm9yaWdpbmFsTGluZXNbc10sbT10aGlzLm1vZGlmaWVkTGluZXNbYV07aWYoZCE9PW0pe3tsZXQgZz1fcihkLDEpLHA9X3IobSwxKTtmb3IoO2c+MSYmcD4xOyl7Y29uc3QgeD1kLmNoYXJDb2RlQXQoZy0yKSx3PW0uY2hhckNvZGVBdChwLTIpO2lmKHghPT13KWJyZWFrO2ctLSxwLS19KGc+MXx8cD4xKSYmdGhpcy5fcHVzaFRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZShpLHMrMSwxLGcsYSsxLDEscCl9e2xldCBnPUxyKGQsMSkscD1McihtLDEpO2NvbnN0IHg9ZC5sZW5ndGgrMSx3PW0ubGVuZ3RoKzE7Zm9yKDtnPHgmJnA8dzspe2NvbnN0IEw9ZC5jaGFyQ29kZUF0KGctMSksdj1kLmNoYXJDb2RlQXQocC0xKTtpZihMIT09dilicmVhaztnKysscCsrfShnPHh8fHA8dykmJnRoaXMuX3B1c2hUcmltV2hpdGVzcGFjZUNoYXJDaGFuZ2UoaSxzKzEsZyx4LGErMSxwLHcpfX1zKyssYSsrfXUmJihpLnB1c2goSHQuY3JlYXRlRnJvbURpZmZSZXN1bHQodGhpcy5zaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSx1LHRoaXMub3JpZ2luYWwsdGhpcy5tb2RpZmllZCx0aGlzLmNvbnRpbnVlQ2hhckRpZmYsdGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMsdGhpcy5zaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzKSkscys9dS5vcmlnaW5hbExlbmd0aCxhKz11Lm1vZGlmaWVkTGVuZ3RoKX1yZXR1cm57cXVpdEVhcmx5OnIsY2hhbmdlczppfX1fcHVzaFRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZSh0LG4scixpLHMsYSxsKXtpZih0aGlzLl9tZXJnZVRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZSh0LG4scixpLHMsYSxsKSlyZXR1cm47bGV0IG87dGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMmJihvPVtuZXcgTHQobixyLG4saSxzLGEscyxsKV0pLHQucHVzaChuZXcgSHQobixuLHMscyxvKSl9X21lcmdlVHJpbVdoaXRlc3BhY2VDaGFyQ2hhbmdlKHQsbixyLGkscyxhLGwpe2NvbnN0IG89dC5sZW5ndGg7aWYobz09PTApcmV0dXJuITE7Y29uc3QgdT10W28tMV07cmV0dXJuIHUub3JpZ2luYWxFbmRMaW5lTnVtYmVyPT09MHx8dS5tb2RpZmllZEVuZExpbmVOdW1iZXI9PT0wPyExOnUub3JpZ2luYWxFbmRMaW5lTnVtYmVyPT09biYmdS5tb2RpZmllZEVuZExpbmVOdW1iZXI9PT1zPyh0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyYmdS5jaGFyQ2hhbmdlcyYmdS5jaGFyQ2hhbmdlcy5wdXNoKG5ldyBMdChuLHIsbixpLHMsYSxzLGwpKSwhMCk6dS5vcmlnaW5hbEVuZExpbmVOdW1iZXIrMT09PW4mJnUubW9kaWZpZWRFbmRMaW5lTnVtYmVyKzE9PT1zPyh1Lm9yaWdpbmFsRW5kTGluZU51bWJlcj1uLHUubW9kaWZpZWRFbmRMaW5lTnVtYmVyPXMsdGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMmJnUuY2hhckNoYW5nZXMmJnUuY2hhckNoYW5nZXMucHVzaChuZXcgTHQobixyLG4saSxzLGEscyxsKSksITApOiExfX1mdW5jdGlvbiBfcihlLHQpe2NvbnN0IG49eGwoZSk7cmV0dXJuIG49PT0tMT90Om4rMX1mdW5jdGlvbiBMcihlLHQpe2NvbnN0IG49eWwoZSk7cmV0dXJuIG49PT0tMT90Om4rMn1mdW5jdGlvbiBKcyhlKXtpZihlPT09MClyZXR1cm4oKT0+ITA7Y29uc3QgdD1EYXRlLm5vdygpO3JldHVybigpPT5EYXRlLm5vdygpLXQ8ZX1mdW5jdGlvbiBXdShlLHQsbj0ocixpKT0+cj09PWkpe2lmKGU9PT10KXJldHVybiEwO2lmKCFlfHwhdHx8ZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspaWYoIW4oZVtyXSx0W3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbipIdShlLHQpe2xldCBuLHI7Zm9yKGNvbnN0IGkgb2YgZSlyIT09dm9pZCAwJiZ0KHIsaSk/bi5wdXNoKGkpOihuJiYoeWllbGQgbiksbj1baV0pLHI9aTtuJiYoeWllbGQgbil9ZnVuY3Rpb24genUoZSx0KXtmb3IobGV0IG49MDtuPD1lLmxlbmd0aDtuKyspdChuPT09MD92b2lkIDA6ZVtuLTFdLG49PT1lLmxlbmd0aD92b2lkIDA6ZVtuXSl9ZnVuY3Rpb24gR3UoZSx0KXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0KG49PT0wP3ZvaWQgMDplW24tMV0sZVtuXSxuKzE9PT1lLmxlbmd0aD92b2lkIDA6ZVtuKzFdKX1mdW5jdGlvbiBKdShlLHQpe2Zvcihjb25zdCBuIG9mIHQpZS5wdXNoKG4pfXZhciBOcjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChzKXtyZXR1cm4gczwwfWUuaXNMZXNzVGhhbj10O2Z1bmN0aW9uIG4ocyl7cmV0dXJuIHM8PTB9ZS5pc0xlc3NUaGFuT3JFcXVhbD1uO2Z1bmN0aW9uIHIocyl7cmV0dXJuIHM+MH1lLmlzR3JlYXRlclRoYW49cjtmdW5jdGlvbiBpKHMpe3JldHVybiBzPT09MH1lLmlzTmVpdGhlckxlc3NPckdyZWF0ZXJUaGFuPWksZS5ncmVhdGVyVGhhbj0xLGUubGVzc1RoYW49LTEsZS5uZWl0aGVyTGVzc09yR3JlYXRlclRoYW49MH0pKE5yfHwoTnI9e30pKTtmdW5jdGlvbiB3bihlLHQpe3JldHVybihuLHIpPT50KGUobiksZShyKSl9Y29uc3QgX249KGUsdCk9PmUtdDtmdW5jdGlvbiBYdShlKXtyZXR1cm4odCxuKT0+LWUodCxuKX1jb25zdCBEdD1jbGFzcyBEdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLml0ZXJhdGU9dH10b0FycmF5KCl7Y29uc3QgdD1bXTtyZXR1cm4gdGhpcy5pdGVyYXRlKG49Pih0LnB1c2gobiksITApKSx0fWZpbHRlcih0KXtyZXR1cm4gbmV3IER0KG49PnRoaXMuaXRlcmF0ZShyPT50KHIpP24ocik6ITApKX1tYXAodCl7cmV0dXJuIG5ldyBEdChuPT50aGlzLml0ZXJhdGUocj0+bih0KHIpKSkpfWZpbmRMYXN0KHQpe2xldCBuO3JldHVybiB0aGlzLml0ZXJhdGUocj0+KHQocikmJihuPXIpLCEwKSksbn1maW5kTGFzdE1heEJ5KHQpe2xldCBuLHI9ITA7cmV0dXJuIHRoaXMuaXRlcmF0ZShpPT4oKHJ8fE5yLmlzR3JlYXRlclRoYW4odChpLG4pKSkmJihyPSExLG49aSksITApKSxufX07RHQuZW1wdHk9bmV3IER0KHQ9Pnt9KTtsZXQgWHM9RHQ7Y2xhc3MgV2V7c3RhdGljIHRyaXZpYWwodCxuKXtyZXR1cm4gbmV3IFdlKFtuZXcgWShXLm9mTGVuZ3RoKHQubGVuZ3RoKSxXLm9mTGVuZ3RoKG4ubGVuZ3RoKSldLCExKX1zdGF0aWMgdHJpdmlhbFRpbWVkT3V0KHQsbil7cmV0dXJuIG5ldyBXZShbbmV3IFkoVy5vZkxlbmd0aCh0Lmxlbmd0aCksVy5vZkxlbmd0aChuLmxlbmd0aCkpXSwhMCl9Y29uc3RydWN0b3IodCxuKXt0aGlzLmRpZmZzPXQsdGhpcy5oaXRUaW1lb3V0PW59fWNsYXNzIFl7c3RhdGljIGludmVydCh0LG4pe2NvbnN0IHI9W107cmV0dXJuIHp1KHQsKGkscyk9PntyLnB1c2goWS5mcm9tT2Zmc2V0UGFpcnMoaT9pLmdldEVuZEV4Y2x1c2l2ZXMoKTpIZS56ZXJvLHM/cy5nZXRTdGFydHMoKTpuZXcgSGUobiwoaT9pLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUtaS5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlOjApK24pKSl9KSxyfXN0YXRpYyBmcm9tT2Zmc2V0UGFpcnModCxuKXtyZXR1cm4gbmV3IFkobmV3IFcodC5vZmZzZXQxLG4ub2Zmc2V0MSksbmV3IFcodC5vZmZzZXQyLG4ub2Zmc2V0MikpfXN0YXRpYyBhc3NlcnRTb3J0ZWQodCl7bGV0IG47Zm9yKGNvbnN0IHIgb2YgdCl7aWYobiYmIShuLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmU8PXIuc2VxMVJhbmdlLnN0YXJ0JiZuLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmU8PXIuc2VxMlJhbmdlLnN0YXJ0KSl0aHJvdyBuZXcgYmUoIlNlcXVlbmNlIGRpZmZzIG11c3QgYmUgc29ydGVkIik7bj1yfX1jb25zdHJ1Y3Rvcih0LG4pe3RoaXMuc2VxMVJhbmdlPXQsdGhpcy5zZXEyUmFuZ2U9bn1zd2FwKCl7cmV0dXJuIG5ldyBZKHRoaXMuc2VxMlJhbmdlLHRoaXMuc2VxMVJhbmdlKX10b1N0cmluZygpe3JldHVybmAke3RoaXMuc2VxMVJhbmdlfSA8LT4gJHt0aGlzLnNlcTJSYW5nZX1gfWpvaW4odCl7cmV0dXJuIG5ldyBZKHRoaXMuc2VxMVJhbmdlLmpvaW4odC5zZXExUmFuZ2UpLHRoaXMuc2VxMlJhbmdlLmpvaW4odC5zZXEyUmFuZ2UpKX1kZWx0YSh0KXtyZXR1cm4gdD09PTA/dGhpczpuZXcgWSh0aGlzLnNlcTFSYW5nZS5kZWx0YSh0KSx0aGlzLnNlcTJSYW5nZS5kZWx0YSh0KSl9ZGVsdGFTdGFydCh0KXtyZXR1cm4gdD09PTA/dGhpczpuZXcgWSh0aGlzLnNlcTFSYW5nZS5kZWx0YVN0YXJ0KHQpLHRoaXMuc2VxMlJhbmdlLmRlbHRhU3RhcnQodCkpfWRlbHRhRW5kKHQpe3JldHVybiB0PT09MD90aGlzOm5ldyBZKHRoaXMuc2VxMVJhbmdlLmRlbHRhRW5kKHQpLHRoaXMuc2VxMlJhbmdlLmRlbHRhRW5kKHQpKX1pbnRlcnNlY3QodCl7Y29uc3Qgbj10aGlzLnNlcTFSYW5nZS5pbnRlcnNlY3QodC5zZXExUmFuZ2UpLHI9dGhpcy5zZXEyUmFuZ2UuaW50ZXJzZWN0KHQuc2VxMlJhbmdlKTtpZighKCFufHwhcikpcmV0dXJuIG5ldyBZKG4scil9Z2V0U3RhcnRzKCl7cmV0dXJuIG5ldyBIZSh0aGlzLnNlcTFSYW5nZS5zdGFydCx0aGlzLnNlcTJSYW5nZS5zdGFydCl9Z2V0RW5kRXhjbHVzaXZlcygpe3JldHVybiBuZXcgSGUodGhpcy5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlLHRoaXMuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZSl9fWNvbnN0IGN0PWNsYXNzIGN0e2NvbnN0cnVjdG9yKHQsbil7dGhpcy5vZmZzZXQxPXQsdGhpcy5vZmZzZXQyPW59dG9TdHJpbmcoKXtyZXR1cm5gJHt0aGlzLm9mZnNldDF9IDwtPiAke3RoaXMub2Zmc2V0Mn1gfWRlbHRhKHQpe3JldHVybiB0PT09MD90aGlzOm5ldyBjdCh0aGlzLm9mZnNldDErdCx0aGlzLm9mZnNldDIrdCl9ZXF1YWxzKHQpe3JldHVybiB0aGlzLm9mZnNldDE9PT10Lm9mZnNldDEmJnRoaXMub2Zmc2V0Mj09PXQub2Zmc2V0Mn19O2N0Lnplcm89bmV3IGN0KDAsMCksY3QubWF4PW5ldyBjdChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7bGV0IEhlPWN0O2NvbnN0IFVuPWNsYXNzIFVue2lzVmFsaWQoKXtyZXR1cm4hMH19O1VuLmluc3RhbmNlPW5ldyBVbjtsZXQgenQ9VW47Y2xhc3MgUXV7Y29uc3RydWN0b3IodCl7aWYodGhpcy50aW1lb3V0PXQsdGhpcy5zdGFydFRpbWU9RGF0ZS5ub3coKSx0aGlzLnZhbGlkPSEwLHQ8PTApdGhyb3cgbmV3IGJlKCJ0aW1lb3V0IG11c3QgYmUgcG9zaXRpdmUiKX1pc1ZhbGlkKCl7aWYoIShEYXRlLm5vdygpLXRoaXMuc3RhcnRUaW1lPHRoaXMudGltZW91dCkmJnRoaXMudmFsaWQpe3RoaXMudmFsaWQ9ITE7ZGVidWdnZXJ9cmV0dXJuIHRoaXMudmFsaWR9fWNsYXNzIFNye2NvbnN0cnVjdG9yKHQsbil7dGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PW4sdGhpcy5hcnJheT1bXSx0aGlzLmFycmF5PW5ldyBBcnJheSh0Km4pfWdldCh0LG4pe3JldHVybiB0aGlzLmFycmF5W3Qrbip0aGlzLndpZHRoXX1zZXQodCxuLHIpe3RoaXMuYXJyYXlbdCtuKnRoaXMud2lkdGhdPXJ9fWZ1bmN0aW9uIEFyKGUpe3JldHVybiBlPT09MzJ8fGU9PT05fWNvbnN0IHNuPWNsYXNzIHNue3N0YXRpYyBnZXRLZXkodCl7bGV0IG49dGhpcy5jaHJLZXlzLmdldCh0KTtyZXR1cm4gbj09PXZvaWQgMCYmKG49dGhpcy5jaHJLZXlzLnNpemUsdGhpcy5jaHJLZXlzLnNldCh0LG4pKSxufWNvbnN0cnVjdG9yKHQsbixyKXt0aGlzLnJhbmdlPXQsdGhpcy5saW5lcz1uLHRoaXMuc291cmNlPXIsdGhpcy5oaXN0b2dyYW09W107bGV0IGk9MDtmb3IobGV0IHM9dC5zdGFydExpbmVOdW1iZXItMTtzPHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xO3MrKyl7Y29uc3QgYT1uW3NdO2ZvcihsZXQgbz0wO288YS5sZW5ndGg7bysrKXtpKys7Y29uc3QgdT1hW29dLGg9c24uZ2V0S2V5KHUpO3RoaXMuaGlzdG9ncmFtW2hdPSh0aGlzLmhpc3RvZ3JhbVtoXXx8MCkrMX1pKys7Y29uc3QgbD1zbi5nZXRLZXkoYApgKTt0aGlzLmhpc3RvZ3JhbVtsXT0odGhpcy5oaXN0b2dyYW1bbF18fDApKzF9dGhpcy50b3RhbENvdW50PWl9Y29tcHV0ZVNpbWlsYXJpdHkodCl7bGV0IG49MDtjb25zdCByPU1hdGgubWF4KHRoaXMuaGlzdG9ncmFtLmxlbmd0aCx0Lmhpc3RvZ3JhbS5sZW5ndGgpO2ZvcihsZXQgaT0wO2k8cjtpKyspbis9TWF0aC5hYnMoKHRoaXMuaGlzdG9ncmFtW2ldPz8wKS0odC5oaXN0b2dyYW1baV0/PzApKTtyZXR1cm4gMS1uLyh0aGlzLnRvdGFsQ291bnQrdC50b3RhbENvdW50KX19O3NuLmNocktleXM9bmV3IE1hcDtsZXQgTG49c247Y2xhc3MgWXV7Y29tcHV0ZSh0LG4scj16dC5pbnN0YW5jZSxpKXtpZih0Lmxlbmd0aD09PTB8fG4ubGVuZ3RoPT09MClyZXR1cm4gV2UudHJpdmlhbCh0LG4pO2NvbnN0IHM9bmV3IFNyKHQubGVuZ3RoLG4ubGVuZ3RoKSxhPW5ldyBTcih0Lmxlbmd0aCxuLmxlbmd0aCksbD1uZXcgU3IodC5sZW5ndGgsbi5sZW5ndGgpO2ZvcihsZXQgZz0wO2c8dC5sZW5ndGg7ZysrKWZvcihsZXQgcD0wO3A8bi5sZW5ndGg7cCsrKXtpZighci5pc1ZhbGlkKCkpcmV0dXJuIFdlLnRyaXZpYWxUaW1lZE91dCh0LG4pO2NvbnN0IHg9Zz09PTA/MDpzLmdldChnLTEscCksdz1wPT09MD8wOnMuZ2V0KGcscC0xKTtsZXQgTDt0LmdldEVsZW1lbnQoZyk9PT1uLmdldEVsZW1lbnQocCk/KGc9PT0wfHxwPT09MD9MPTA6TD1zLmdldChnLTEscC0xKSxnPjAmJnA+MCYmYS5nZXQoZy0xLHAtMSk9PT0zJiYoTCs9bC5nZXQoZy0xLHAtMSkpLEwrPWk/aShnLHApOjEpOkw9LTE7Y29uc3Qgdj1NYXRoLm1heCh4LHcsTCk7aWYodj09PUwpe2NvbnN0IHk9Zz4wJiZwPjA/bC5nZXQoZy0xLHAtMSk6MDtsLnNldChnLHAseSsxKSxhLnNldChnLHAsMyl9ZWxzZSB2PT09eD8obC5zZXQoZyxwLDApLGEuc2V0KGcscCwxKSk6dj09PXcmJihsLnNldChnLHAsMCksYS5zZXQoZyxwLDIpKTtzLnNldChnLHAsdil9Y29uc3Qgbz1bXTtsZXQgdT10Lmxlbmd0aCxoPW4ubGVuZ3RoO2Z1bmN0aW9uIGYoZyxwKXsoZysxIT09dXx8cCsxIT09aCkmJm8ucHVzaChuZXcgWShuZXcgVyhnKzEsdSksbmV3IFcocCsxLGgpKSksdT1nLGg9cH1sZXQgZD10Lmxlbmd0aC0xLG09bi5sZW5ndGgtMTtmb3IoO2Q+PTAmJm0+PTA7KWEuZ2V0KGQsbSk9PT0zPyhmKGQsbSksZC0tLG0tLSk6YS5nZXQoZCxtKT09PTE/ZC0tOm0tLTtyZXR1cm4gZigtMSwtMSksby5yZXZlcnNlKCksbmV3IFdlKG8sITEpfX1jbGFzcyBRc3tjb21wdXRlKHQsbixyPXp0Lmluc3RhbmNlKXtpZih0Lmxlbmd0aD09PTB8fG4ubGVuZ3RoPT09MClyZXR1cm4gV2UudHJpdmlhbCh0LG4pO2NvbnN0IGk9dCxzPW47ZnVuY3Rpb24gYShwLHgpe2Zvcig7cDxpLmxlbmd0aCYmeDxzLmxlbmd0aCYmaS5nZXRFbGVtZW50KHApPT09cy5nZXRFbGVtZW50KHgpOylwKysseCsrO3JldHVybiBwfWxldCBsPTA7Y29uc3Qgbz1uZXcgWnU7by5zZXQoMCxhKDAsMCkpO2NvbnN0IHU9bmV3IEt1O3Uuc2V0KDAsby5nZXQoMCk9PT0wP251bGw6bmV3IFlzKG51bGwsMCwwLG8uZ2V0KDApKSk7bGV0IGg9MDtlOmZvcig7Oyl7aWYobCsrLCFyLmlzVmFsaWQoKSlyZXR1cm4gV2UudHJpdmlhbFRpbWVkT3V0KGkscyk7Y29uc3QgcD0tTWF0aC5taW4obCxzLmxlbmd0aCtsJTIpLHg9TWF0aC5taW4obCxpLmxlbmd0aCtsJTIpO2ZvcihoPXA7aDw9eDtoKz0yKXtjb25zdCB3PWg9PT14Py0xOm8uZ2V0KGgrMSksTD1oPT09cD8tMTpvLmdldChoLTEpKzEsdj1NYXRoLm1pbihNYXRoLm1heCh3LEwpLGkubGVuZ3RoKSx5PXYtaDtpZih2PmkubGVuZ3RofHx5PnMubGVuZ3RoKWNvbnRpbnVlO2NvbnN0IGI9YSh2LHkpO28uc2V0KGgsYik7Y29uc3QgXz12PT09dz91LmdldChoKzEpOnUuZ2V0KGgtMSk7aWYodS5zZXQoaCxiIT09dj9uZXcgWXMoXyx2LHksYi12KTpfKSxvLmdldChoKT09PWkubGVuZ3RoJiZvLmdldChoKS1oPT09cy5sZW5ndGgpYnJlYWsgZX19bGV0IGY9dS5nZXQoaCk7Y29uc3QgZD1bXTtsZXQgbT1pLmxlbmd0aCxnPXMubGVuZ3RoO2Zvcig7Oyl7Y29uc3QgcD1mP2YueCtmLmxlbmd0aDowLHg9Zj9mLnkrZi5sZW5ndGg6MDtpZigocCE9PW18fHghPT1nKSYmZC5wdXNoKG5ldyBZKG5ldyBXKHAsbSksbmV3IFcoeCxnKSkpLCFmKWJyZWFrO209Zi54LGc9Zi55LGY9Zi5wcmV2fXJldHVybiBkLnJldmVyc2UoKSxuZXcgV2UoZCwhMSl9fWNsYXNzIFlze2NvbnN0cnVjdG9yKHQsbixyLGkpe3RoaXMucHJldj10LHRoaXMueD1uLHRoaXMueT1yLHRoaXMubGVuZ3RoPWl9fWNsYXNzIFp1e2NvbnN0cnVjdG9yKCl7dGhpcy5wb3NpdGl2ZUFycj1uZXcgSW50MzJBcnJheSgxMCksdGhpcy5uZWdhdGl2ZUFycj1uZXcgSW50MzJBcnJheSgxMCl9Z2V0KHQpe3JldHVybiB0PDA/KHQ9LXQtMSx0aGlzLm5lZ2F0aXZlQXJyW3RdKTp0aGlzLnBvc2l0aXZlQXJyW3RdfXNldCh0LG4pe2lmKHQ8MCl7aWYodD0tdC0xLHQ+PXRoaXMubmVnYXRpdmVBcnIubGVuZ3RoKXtjb25zdCByPXRoaXMubmVnYXRpdmVBcnI7dGhpcy5uZWdhdGl2ZUFycj1uZXcgSW50MzJBcnJheShyLmxlbmd0aCoyKSx0aGlzLm5lZ2F0aXZlQXJyLnNldChyKX10aGlzLm5lZ2F0aXZlQXJyW3RdPW59ZWxzZXtpZih0Pj10aGlzLnBvc2l0aXZlQXJyLmxlbmd0aCl7Y29uc3Qgcj10aGlzLnBvc2l0aXZlQXJyO3RoaXMucG9zaXRpdmVBcnI9bmV3IEludDMyQXJyYXkoci5sZW5ndGgqMiksdGhpcy5wb3NpdGl2ZUFyci5zZXQocil9dGhpcy5wb3NpdGl2ZUFyclt0XT1ufX19Y2xhc3MgS3V7Y29uc3RydWN0b3IoKXt0aGlzLnBvc2l0aXZlQXJyPVtdLHRoaXMubmVnYXRpdmVBcnI9W119Z2V0KHQpe3JldHVybiB0PDA/KHQ9LXQtMSx0aGlzLm5lZ2F0aXZlQXJyW3RdKTp0aGlzLnBvc2l0aXZlQXJyW3RdfXNldCh0LG4pe3Q8MD8odD0tdC0xLHRoaXMubmVnYXRpdmVBcnJbdF09bik6dGhpcy5wb3NpdGl2ZUFyclt0XT1ufX1jbGFzcyBObntjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy5saW5lcz10LHRoaXMucmFuZ2U9bix0aGlzLmNvbnNpZGVyV2hpdGVzcGFjZUNoYW5nZXM9cix0aGlzLmVsZW1lbnRzPVtdLHRoaXMuZmlyc3RFbGVtZW50T2Zmc2V0QnlMaW5lSWR4PVtdLHRoaXMubGluZVN0YXJ0T2Zmc2V0cz1bXSx0aGlzLnRyaW1tZWRXc0xlbmd0aHNCeUxpbmVJZHg9W10sdGhpcy5maXJzdEVsZW1lbnRPZmZzZXRCeUxpbmVJZHgucHVzaCgwKTtmb3IobGV0IGk9dGhpcy5yYW5nZS5zdGFydExpbmVOdW1iZXI7aTw9dGhpcy5yYW5nZS5lbmRMaW5lTnVtYmVyO2krKyl7bGV0IHM9dFtpLTFdLGE9MDtpPT09dGhpcy5yYW5nZS5zdGFydExpbmVOdW1iZXImJnRoaXMucmFuZ2Uuc3RhcnRDb2x1bW4+MSYmKGE9dGhpcy5yYW5nZS5zdGFydENvbHVtbi0xLHM9cy5zdWJzdHJpbmcoYSkpLHRoaXMubGluZVN0YXJ0T2Zmc2V0cy5wdXNoKGEpO2xldCBsPTA7aWYoIXIpe2NvbnN0IHU9cy50cmltU3RhcnQoKTtsPXMubGVuZ3RoLXUubGVuZ3RoLHM9dS50cmltRW5kKCl9dGhpcy50cmltbWVkV3NMZW5ndGhzQnlMaW5lSWR4LnB1c2gobCk7Y29uc3Qgbz1pPT09dGhpcy5yYW5nZS5lbmRMaW5lTnVtYmVyP01hdGgubWluKHRoaXMucmFuZ2UuZW5kQ29sdW1uLTEtYS1sLHMubGVuZ3RoKTpzLmxlbmd0aDtmb3IobGV0IHU9MDt1PG87dSsrKXRoaXMuZWxlbWVudHMucHVzaChzLmNoYXJDb2RlQXQodSkpO2k8dGhpcy5yYW5nZS5lbmRMaW5lTnVtYmVyJiYodGhpcy5lbGVtZW50cy5wdXNoKDEwKSx0aGlzLmZpcnN0RWxlbWVudE9mZnNldEJ5TGluZUlkeC5wdXNoKHRoaXMuZWxlbWVudHMubGVuZ3RoKSl9fXRvU3RyaW5nKCl7cmV0dXJuYFNsaWNlOiAiJHt0aGlzLnRleHR9ImB9Z2V0IHRleHQoKXtyZXR1cm4gdGhpcy5nZXRUZXh0KG5ldyBXKDAsdGhpcy5sZW5ndGgpKX1nZXRUZXh0KHQpe3JldHVybiB0aGlzLmVsZW1lbnRzLnNsaWNlKHQuc3RhcnQsdC5lbmRFeGNsdXNpdmUpLm1hcChuPT5TdHJpbmcuZnJvbUNoYXJDb2RlKG4pKS5qb2luKCIiKX1nZXRFbGVtZW50KHQpe3JldHVybiB0aGlzLmVsZW1lbnRzW3RdfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5sZW5ndGh9Z2V0Qm91bmRhcnlTY29yZSh0KXtjb25zdCBuPUtzKHQ+MD90aGlzLmVsZW1lbnRzW3QtMV06LTEpLHI9S3ModDx0aGlzLmVsZW1lbnRzLmxlbmd0aD90aGlzLmVsZW1lbnRzW3RdOi0xKTtpZihuPT09NyYmcj09PTgpcmV0dXJuIDA7aWYobj09PTgpcmV0dXJuIDE1MDtsZXQgaT0wO3JldHVybiBuIT09ciYmKGkrPTEwLG49PT0wJiZyPT09MSYmKGkrPTEpKSxpKz1acyhuKSxpKz1acyhyKSxpfXRyYW5zbGF0ZU9mZnNldCh0LG49InJpZ2h0Iil7Y29uc3Qgcj1XdCh0aGlzLmZpcnN0RWxlbWVudE9mZnNldEJ5TGluZUlkeCxzPT5zPD10KSxpPXQtdGhpcy5maXJzdEVsZW1lbnRPZmZzZXRCeUxpbmVJZHhbcl07cmV0dXJuIG5ldyBlZSh0aGlzLnJhbmdlLnN0YXJ0TGluZU51bWJlcityLDErdGhpcy5saW5lU3RhcnRPZmZzZXRzW3JdK2krKGk9PT0wJiZuPT09ImxlZnQiPzA6dGhpcy50cmltbWVkV3NMZW5ndGhzQnlMaW5lSWR4W3JdKSl9dHJhbnNsYXRlUmFuZ2UodCl7Y29uc3Qgbj10aGlzLnRyYW5zbGF0ZU9mZnNldCh0LnN0YXJ0LCJyaWdodCIpLHI9dGhpcy50cmFuc2xhdGVPZmZzZXQodC5lbmRFeGNsdXNpdmUsImxlZnQiKTtyZXR1cm4gci5pc0JlZm9yZShuKT96LmZyb21Qb3NpdGlvbnMocixyKTp6LmZyb21Qb3NpdGlvbnMobixyKX1maW5kV29yZENvbnRhaW5pbmcodCl7aWYodDwwfHx0Pj10aGlzLmVsZW1lbnRzLmxlbmd0aHx8IWtyKHRoaXMuZWxlbWVudHNbdF0pKXJldHVybjtsZXQgbj10O2Zvcig7bj4wJiZrcih0aGlzLmVsZW1lbnRzW24tMV0pOyluLS07bGV0IHI9dDtmb3IoO3I8dGhpcy5lbGVtZW50cy5sZW5ndGgmJmtyKHRoaXMuZWxlbWVudHNbcl0pOylyKys7cmV0dXJuIG5ldyBXKG4scil9Y291bnRMaW5lc0luKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9mZnNldCh0LmVuZEV4Y2x1c2l2ZSkubGluZU51bWJlci10aGlzLnRyYW5zbGF0ZU9mZnNldCh0LnN0YXJ0KS5saW5lTnVtYmVyfWlzU3Ryb25nbHlFcXVhbCh0LG4pe3JldHVybiB0aGlzLmVsZW1lbnRzW3RdPT09dGhpcy5lbGVtZW50c1tuXX1leHRlbmRUb0Z1bGxMaW5lcyh0KXtjb25zdCBuPXd0KHRoaXMuZmlyc3RFbGVtZW50T2Zmc2V0QnlMaW5lSWR4LGk9Pmk8PXQuc3RhcnQpPz8wLHI9RHUodGhpcy5maXJzdEVsZW1lbnRPZmZzZXRCeUxpbmVJZHgsaT0+dC5lbmRFeGNsdXNpdmU8PWkpPz90aGlzLmVsZW1lbnRzLmxlbmd0aDtyZXR1cm4gbmV3IFcobixyKX19ZnVuY3Rpb24ga3IoZSl7cmV0dXJuIGU+PTk3JiZlPD0xMjJ8fGU+PTY1JiZlPD05MHx8ZT49NDgmJmU8PTU3fWNvbnN0IGVjPXswOjAsMTowLDI6MCwzOjEwLDQ6Miw1OjMwLDY6Myw3OjEwLDg6MTB9O2Z1bmN0aW9uIFpzKGUpe3JldHVybiBlY1tlXX1mdW5jdGlvbiBLcyhlKXtyZXR1cm4gZT09PTEwPzg6ZT09PTEzPzc6QXIoZSk/NjplPj05NyYmZTw9MTIyPzA6ZT49NjUmJmU8PTkwPzE6ZT49NDgmJmU8PTU3PzI6ZT09PS0xPzM6ZT09PTQ0fHxlPT09NTk/NTo0fWZ1bmN0aW9uIHRjKGUsdCxuLHIsaSxzKXtsZXR7bW92ZXM6YSxleGNsdWRlZENoYW5nZXM6bH09cmMoZSx0LG4scyk7aWYoIXMuaXNWYWxpZCgpKXJldHVybltdO2NvbnN0IG89ZS5maWx0ZXIoaD0+IWwuaGFzKGgpKSx1PWljKG8scixpLHQsbixzKTtyZXR1cm4gSnUoYSx1KSxhPXNjKGEpLGE9YS5maWx0ZXIoaD0+e2NvbnN0IGY9aC5vcmlnaW5hbC50b09mZnNldFJhbmdlKCkuc2xpY2UodCkubWFwKG09Pm0udHJpbSgpKTtyZXR1cm4gZi5qb2luKGAKYCkubGVuZ3RoPj0xNSYmbmMoZixtPT5tLmxlbmd0aD49Mik+PTJ9KSxhPWFjKGUsYSksYX1mdW5jdGlvbiBuYyhlLHQpe2xldCBuPTA7Zm9yKGNvbnN0IHIgb2YgZSl0KHIpJiZuKys7cmV0dXJuIG59ZnVuY3Rpb24gcmMoZSx0LG4scil7Y29uc3QgaT1bXSxzPWUuZmlsdGVyKG89Pm8ubW9kaWZpZWQuaXNFbXB0eSYmby5vcmlnaW5hbC5sZW5ndGg+PTMpLm1hcChvPT5uZXcgTG4oby5vcmlnaW5hbCx0LG8pKSxhPW5ldyBTZXQoZS5maWx0ZXIobz0+by5vcmlnaW5hbC5pc0VtcHR5JiZvLm1vZGlmaWVkLmxlbmd0aD49MykubWFwKG89Pm5ldyBMbihvLm1vZGlmaWVkLG4sbykpKSxsPW5ldyBTZXQ7Zm9yKGNvbnN0IG8gb2Ygcyl7bGV0IHU9LTEsaDtmb3IoY29uc3QgZiBvZiBhKXtjb25zdCBkPW8uY29tcHV0ZVNpbWlsYXJpdHkoZik7ZD51JiYodT1kLGg9Zil9aWYodT4uOSYmaCYmKGEuZGVsZXRlKGgpLGkucHVzaChuZXcgTGUoby5yYW5nZSxoLnJhbmdlKSksbC5hZGQoby5zb3VyY2UpLGwuYWRkKGguc291cmNlKSksIXIuaXNWYWxpZCgpKXJldHVybnttb3ZlczppLGV4Y2x1ZGVkQ2hhbmdlczpsfX1yZXR1cm57bW92ZXM6aSxleGNsdWRlZENoYW5nZXM6bH19ZnVuY3Rpb24gaWMoZSx0LG4scixpLHMpe2NvbnN0IGE9W10sbD1uZXcgTHU7Zm9yKGNvbnN0IGQgb2YgZSlmb3IobGV0IG09ZC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXI7bTxkLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMjttKyspe2NvbnN0IGc9YCR7dFttLTFdfToke3RbbSsxLTFdfToke3RbbSsyLTFdfWA7bC5hZGQoZyx7cmFuZ2U6bmV3IFUobSxtKzMpfSl9Y29uc3Qgbz1bXTtlLnNvcnQod24oZD0+ZC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIsX24pKTtmb3IoY29uc3QgZCBvZiBlKXtsZXQgbT1bXTtmb3IobGV0IGc9ZC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXI7ZzxkLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMjtnKyspe2NvbnN0IHA9YCR7bltnLTFdfToke25bZysxLTFdfToke25bZysyLTFdfWAseD1uZXcgVShnLGcrMyksdz1bXTtsLmZvckVhY2gocCwoe3JhbmdlOkx9KT0+e2Zvcihjb25zdCB5IG9mIG0paWYoeS5vcmlnaW5hbExpbmVSYW5nZS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKzE9PT1MLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUmJnkubW9kaWZpZWRMaW5lUmFuZ2UuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSsxPT09eC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKXt5Lm9yaWdpbmFsTGluZVJhbmdlPW5ldyBVKHkub3JpZ2luYWxMaW5lUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLEwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkseS5tb2RpZmllZExpbmVSYW5nZT1uZXcgVSh5Lm1vZGlmaWVkTGluZVJhbmdlLnN0YXJ0TGluZU51bWJlcix4LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpLHcucHVzaCh5KTtyZXR1cm59Y29uc3Qgdj17bW9kaWZpZWRMaW5lUmFuZ2U6eCxvcmlnaW5hbExpbmVSYW5nZTpMfTtvLnB1c2godiksdy5wdXNoKHYpfSksbT13fWlmKCFzLmlzVmFsaWQoKSlyZXR1cm5bXX1vLnNvcnQoWHUod24oZD0+ZC5tb2RpZmllZExpbmVSYW5nZS5sZW5ndGgsX24pKSk7Y29uc3QgdT1uZXcgRmUsaD1uZXcgRmU7Zm9yKGNvbnN0IGQgb2Ygbyl7Y29uc3QgbT1kLm1vZGlmaWVkTGluZVJhbmdlLnN0YXJ0TGluZU51bWJlci1kLm9yaWdpbmFsTGluZVJhbmdlLnN0YXJ0TGluZU51bWJlcixnPXUuc3VidHJhY3RGcm9tKGQubW9kaWZpZWRMaW5lUmFuZ2UpLHA9aC5zdWJ0cmFjdEZyb20oZC5vcmlnaW5hbExpbmVSYW5nZSkuZ2V0V2l0aERlbHRhKG0pLHg9Zy5nZXRJbnRlcnNlY3Rpb24ocCk7Zm9yKGNvbnN0IHcgb2YgeC5yYW5nZXMpe2lmKHcubGVuZ3RoPDMpY29udGludWU7Y29uc3QgTD13LHY9dy5kZWx0YSgtbSk7YS5wdXNoKG5ldyBMZSh2LEwpKSx1LmFkZFJhbmdlKEwpLGguYWRkUmFuZ2Uodil9fWEuc29ydCh3bihkPT5kLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcixfbikpO2NvbnN0IGY9bmV3IHluKGUpO2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKXtjb25zdCBtPWFbZF0sZz1mLmZpbmRMYXN0TW9ub3Rvbm91cyhfPT5fLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcjw9bS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIpLHA9d3QoZSxfPT5fLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcjw9bS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIpLHg9TWF0aC5tYXgobS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItZy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIsbS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItcC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIpLHc9Zi5maW5kTGFzdE1vbm90b25vdXMoXz0+Xy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXI8bS5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKSxMPXd0KGUsXz0+Xy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXI8bS5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKSx2PU1hdGgubWF4KHcub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS1tLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsTC5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLW0ubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSk7bGV0IHk7Zm9yKHk9MDt5PHg7eSsrKXtjb25zdCBfPW0ub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLXktMSxBPW0ubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLXktMTtpZihfPnIubGVuZ3RofHxBPmkubGVuZ3RofHx1LmNvbnRhaW5zKEEpfHxoLmNvbnRhaW5zKF8pfHwhZWEocltfLTFdLGlbQS0xXSxzKSlicmVha315PjAmJihoLmFkZFJhbmdlKG5ldyBVKG0ub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLXksbS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIpKSx1LmFkZFJhbmdlKG5ldyBVKG0ubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLXksbS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIpKSk7bGV0IGI7Zm9yKGI9MDtiPHY7YisrKXtjb25zdCBfPW0ub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZStiLEE9bS5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlK2I7aWYoXz5yLmxlbmd0aHx8QT5pLmxlbmd0aHx8dS5jb250YWlucyhBKXx8aC5jb250YWlucyhfKXx8IWVhKHJbXy0xXSxpW0EtMV0scykpYnJlYWt9Yj4wJiYoaC5hZGRSYW5nZShuZXcgVShtLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsbS5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlK2IpKSx1LmFkZFJhbmdlKG5ldyBVKG0ubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxtLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUrYikpKSwoeT4wfHxiPjApJiYoYVtkXT1uZXcgTGUobmV3IFUobS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIteSxtLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUrYiksbmV3IFUobS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIteSxtLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUrYikpKX1yZXR1cm4gYX1mdW5jdGlvbiBlYShlLHQsbil7aWYoZS50cmltKCk9PT10LnRyaW0oKSlyZXR1cm4hMDtpZihlLmxlbmd0aD4zMDAmJnQubGVuZ3RoPjMwMClyZXR1cm4hMTtjb25zdCBpPW5ldyBRcygpLmNvbXB1dGUobmV3IE5uKFtlXSxuZXcgeigxLDEsMSxlLmxlbmd0aCksITEpLG5ldyBObihbdF0sbmV3IHooMSwxLDEsdC5sZW5ndGgpLCExKSxuKTtsZXQgcz0wO2NvbnN0IGE9WS5pbnZlcnQoaS5kaWZmcyxlLmxlbmd0aCk7Zm9yKGNvbnN0IGggb2YgYSloLnNlcTFSYW5nZS5mb3JFYWNoKGY9PntBcihlLmNoYXJDb2RlQXQoZikpfHxzKyt9KTtmdW5jdGlvbiBsKGgpe2xldCBmPTA7Zm9yKGxldCBkPTA7ZDxlLmxlbmd0aDtkKyspQXIoaC5jaGFyQ29kZUF0KGQpKXx8ZisrO3JldHVybiBmfWNvbnN0IG89bChlLmxlbmd0aD50Lmxlbmd0aD9lOnQpO3JldHVybiBzL28+LjYmJm8+MTB9ZnVuY3Rpb24gc2MoZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBlO2Uuc29ydCh3bihuPT5uLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcixfbikpO2NvbnN0IHQ9W2VbMF1dO2ZvcihsZXQgbj0xO248ZS5sZW5ndGg7bisrKXtjb25zdCByPXRbdC5sZW5ndGgtMV0saT1lW25dLHM9aS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItci5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLGE9aS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItci5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlO2lmKHM+PTAmJmE+PTAmJnMrYTw9Mil7dFt0Lmxlbmd0aC0xXT1yLmpvaW4oaSk7Y29udGludWV9dC5wdXNoKGkpfXJldHVybiB0fWZ1bmN0aW9uIGFjKGUsdCl7Y29uc3Qgbj1uZXcgeW4oZSk7cmV0dXJuIHQ9dC5maWx0ZXIocj0+e2NvbnN0IGk9bi5maW5kTGFzdE1vbm90b25vdXMobD0+bC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXI8ci5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKXx8bmV3IExlKG5ldyBVKDEsMSksbmV3IFUoMSwxKSkscz13dChlLGw9PmwubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyPHIubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSk7cmV0dXJuIGkhPT1zfSksdH1mdW5jdGlvbiB0YShlLHQsbil7bGV0IHI9bjtyZXR1cm4gcj1uYShlLHQscikscj1uYShlLHQscikscj1vYyhlLHQscikscn1mdW5jdGlvbiBuYShlLHQsbil7aWYobi5sZW5ndGg9PT0wKXJldHVybiBuO2NvbnN0IHI9W107ci5wdXNoKG5bMF0pO2ZvcihsZXQgcz0xO3M8bi5sZW5ndGg7cysrKXtjb25zdCBhPXJbci5sZW5ndGgtMV07bGV0IGw9bltzXTtpZihsLnNlcTFSYW5nZS5pc0VtcHR5fHxsLnNlcTJSYW5nZS5pc0VtcHR5KXtjb25zdCBvPWwuc2VxMVJhbmdlLnN0YXJ0LWEuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZTtsZXQgdTtmb3IodT0xO3U8PW8mJiEoZS5nZXRFbGVtZW50KGwuc2VxMVJhbmdlLnN0YXJ0LXUpIT09ZS5nZXRFbGVtZW50KGwuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZS11KXx8dC5nZXRFbGVtZW50KGwuc2VxMlJhbmdlLnN0YXJ0LXUpIT09dC5nZXRFbGVtZW50KGwuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZS11KSk7dSsrKTtpZih1LS0sdT09PW8pe3Jbci5sZW5ndGgtMV09bmV3IFkobmV3IFcoYS5zZXExUmFuZ2Uuc3RhcnQsbC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlLW8pLG5ldyBXKGEuc2VxMlJhbmdlLnN0YXJ0LGwuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZS1vKSk7Y29udGludWV9bD1sLmRlbHRhKC11KX1yLnB1c2gobCl9Y29uc3QgaT1bXTtmb3IobGV0IHM9MDtzPHIubGVuZ3RoLTE7cysrKXtjb25zdCBhPXJbcysxXTtsZXQgbD1yW3NdO2lmKGwuc2VxMVJhbmdlLmlzRW1wdHl8fGwuc2VxMlJhbmdlLmlzRW1wdHkpe2NvbnN0IG89YS5zZXExUmFuZ2Uuc3RhcnQtbC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlO2xldCB1O2Zvcih1PTA7dTxvJiYhKCFlLmlzU3Ryb25nbHlFcXVhbChsLnNlcTFSYW5nZS5zdGFydCt1LGwuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSt1KXx8IXQuaXNTdHJvbmdseUVxdWFsKGwuc2VxMlJhbmdlLnN0YXJ0K3UsbC5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlK3UpKTt1KyspO2lmKHU9PT1vKXtyW3MrMV09bmV3IFkobmV3IFcobC5zZXExUmFuZ2Uuc3RhcnQrbyxhLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUpLG5ldyBXKGwuc2VxMlJhbmdlLnN0YXJ0K28sYS5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlKSk7Y29udGludWV9dT4wJiYobD1sLmRlbHRhKHUpKX1pLnB1c2gobCl9cmV0dXJuIHIubGVuZ3RoPjAmJmkucHVzaChyW3IubGVuZ3RoLTFdKSxpfWZ1bmN0aW9uIG9jKGUsdCxuKXtpZighZS5nZXRCb3VuZGFyeVNjb3JlfHwhdC5nZXRCb3VuZGFyeVNjb3JlKXJldHVybiBuO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKXtjb25zdCBpPXI+MD9uW3ItMV06dm9pZCAwLHM9bltyXSxhPXIrMTxuLmxlbmd0aD9uW3IrMV06dm9pZCAwLGw9bmV3IFcoaT9pLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUrMTowLGE/YS5zZXExUmFuZ2Uuc3RhcnQtMTplLmxlbmd0aCksbz1uZXcgVyhpP2kuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZSsxOjAsYT9hLnNlcTJSYW5nZS5zdGFydC0xOnQubGVuZ3RoKTtzLnNlcTFSYW5nZS5pc0VtcHR5P25bcl09cmEocyxlLHQsbCxvKTpzLnNlcTJSYW5nZS5pc0VtcHR5JiYobltyXT1yYShzLnN3YXAoKSx0LGUsbyxsKS5zd2FwKCkpfXJldHVybiBufWZ1bmN0aW9uIHJhKGUsdCxuLHIsaSl7bGV0IGE9MTtmb3IoO2Uuc2VxMVJhbmdlLnN0YXJ0LWE+PXIuc3RhcnQmJmUuc2VxMlJhbmdlLnN0YXJ0LWE+PWkuc3RhcnQmJm4uaXNTdHJvbmdseUVxdWFsKGUuc2VxMlJhbmdlLnN0YXJ0LWEsZS5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlLWEpJiZhPDEwMDspYSsrO2EtLTtsZXQgbD0wO2Zvcig7ZS5zZXExUmFuZ2Uuc3RhcnQrbDxyLmVuZEV4Y2x1c2l2ZSYmZS5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlK2w8aS5lbmRFeGNsdXNpdmUmJm4uaXNTdHJvbmdseUVxdWFsKGUuc2VxMlJhbmdlLnN0YXJ0K2wsZS5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlK2wpJiZsPDEwMDspbCsrO2lmKGE9PT0wJiZsPT09MClyZXR1cm4gZTtsZXQgbz0wLHU9LTE7Zm9yKGxldCBoPS1hO2g8PWw7aCsrKXtjb25zdCBmPWUuc2VxMlJhbmdlLnN0YXJ0K2gsZD1lLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUraCxtPWUuc2VxMVJhbmdlLnN0YXJ0K2gsZz10LmdldEJvdW5kYXJ5U2NvcmUobSkrbi5nZXRCb3VuZGFyeVNjb3JlKGYpK24uZ2V0Qm91bmRhcnlTY29yZShkKTtnPnUmJih1PWcsbz1oKX1yZXR1cm4gZS5kZWx0YShvKX1mdW5jdGlvbiBsYyhlLHQsbil7Y29uc3Qgcj1bXTtmb3IoY29uc3QgaSBvZiBuKXtjb25zdCBzPXJbci5sZW5ndGgtMV07aWYoIXMpe3IucHVzaChpKTtjb250aW51ZX1pLnNlcTFSYW5nZS5zdGFydC1zLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmU8PTJ8fGkuc2VxMlJhbmdlLnN0YXJ0LXMuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZTw9Mj9yW3IubGVuZ3RoLTFdPW5ldyBZKHMuc2VxMVJhbmdlLmpvaW4oaS5zZXExUmFuZ2UpLHMuc2VxMlJhbmdlLmpvaW4oaS5zZXEyUmFuZ2UpKTpyLnB1c2goaSl9cmV0dXJuIHJ9ZnVuY3Rpb24gdWMoZSx0LG4pe2NvbnN0IHI9WS5pbnZlcnQobixlLmxlbmd0aCksaT1bXTtsZXQgcz1uZXcgSGUoMCwwKTtmdW5jdGlvbiBhKG8sdSl7aWYoby5vZmZzZXQxPHMub2Zmc2V0MXx8by5vZmZzZXQyPHMub2Zmc2V0MilyZXR1cm47Y29uc3QgaD1lLmZpbmRXb3JkQ29udGFpbmluZyhvLm9mZnNldDEpLGY9dC5maW5kV29yZENvbnRhaW5pbmcoby5vZmZzZXQyKTtpZighaHx8IWYpcmV0dXJuO2xldCBkPW5ldyBZKGgsZik7Y29uc3QgbT1kLmludGVyc2VjdCh1KTtsZXQgZz1tLnNlcTFSYW5nZS5sZW5ndGgscD1tLnNlcTJSYW5nZS5sZW5ndGg7Zm9yKDtyLmxlbmd0aD4wOyl7Y29uc3QgeD1yWzBdO2lmKCEoeC5zZXExUmFuZ2UuaW50ZXJzZWN0cyhkLnNlcTFSYW5nZSl8fHguc2VxMlJhbmdlLmludGVyc2VjdHMoZC5zZXEyUmFuZ2UpKSlicmVhaztjb25zdCBMPWUuZmluZFdvcmRDb250YWluaW5nKHguc2VxMVJhbmdlLnN0YXJ0KSx2PXQuZmluZFdvcmRDb250YWluaW5nKHguc2VxMlJhbmdlLnN0YXJ0KSx5PW5ldyBZKEwsdiksYj15LmludGVyc2VjdCh4KTtpZihnKz1iLnNlcTFSYW5nZS5sZW5ndGgscCs9Yi5zZXEyUmFuZ2UubGVuZ3RoLGQ9ZC5qb2luKHkpLGQuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZT49eC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlKXIuc2hpZnQoKTtlbHNlIGJyZWFrfWcrcDwoZC5zZXExUmFuZ2UubGVuZ3RoK2Quc2VxMlJhbmdlLmxlbmd0aCkqMi8zJiZpLnB1c2goZCkscz1kLmdldEVuZEV4Y2x1c2l2ZXMoKX1mb3IoO3IubGVuZ3RoPjA7KXtjb25zdCBvPXIuc2hpZnQoKTtvLnNlcTFSYW5nZS5pc0VtcHR5fHwoYShvLmdldFN0YXJ0cygpLG8pLGEoby5nZXRFbmRFeGNsdXNpdmVzKCkuZGVsdGEoLTEpLG8pKX1yZXR1cm4gY2MobixpKX1mdW5jdGlvbiBjYyhlLHQpe2NvbnN0IG49W107Zm9yKDtlLmxlbmd0aD4wfHx0Lmxlbmd0aD4wOyl7Y29uc3Qgcj1lWzBdLGk9dFswXTtsZXQgcztyJiYoIWl8fHIuc2VxMVJhbmdlLnN0YXJ0PGkuc2VxMVJhbmdlLnN0YXJ0KT9zPWUuc2hpZnQoKTpzPXQuc2hpZnQoKSxuLmxlbmd0aD4wJiZuW24ubGVuZ3RoLTFdLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmU+PXMuc2VxMVJhbmdlLnN0YXJ0P25bbi5sZW5ndGgtMV09bltuLmxlbmd0aC0xXS5qb2luKHMpOm4ucHVzaChzKX1yZXR1cm4gbn1mdW5jdGlvbiBmYyhlLHQsbil7bGV0IHI9bjtpZihyLmxlbmd0aD09PTApcmV0dXJuIHI7bGV0IGk9MCxzO2Rve3M9ITE7Y29uc3QgYT1bclswXV07Zm9yKGxldCBsPTE7bDxyLmxlbmd0aDtsKyspe2xldCBoPWZ1bmN0aW9uKGQsbSl7Y29uc3QgZz1uZXcgVyh1LnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUsby5zZXExUmFuZ2Uuc3RhcnQpO3JldHVybiBlLmdldFRleHQoZykucmVwbGFjZSgvXHMvZywiIikubGVuZ3RoPD00JiYoZC5zZXExUmFuZ2UubGVuZ3RoK2Quc2VxMlJhbmdlLmxlbmd0aD41fHxtLnNlcTFSYW5nZS5sZW5ndGgrbS5zZXEyUmFuZ2UubGVuZ3RoPjUpfTtjb25zdCBvPXJbbF0sdT1hW2EubGVuZ3RoLTFdO2godSxvKT8ocz0hMCxhW2EubGVuZ3RoLTFdPWFbYS5sZW5ndGgtMV0uam9pbihvKSk6YS5wdXNoKG8pfXI9YX13aGlsZShpKys8MTAmJnMpO3JldHVybiByfWZ1bmN0aW9uIGhjKGUsdCxuKXtsZXQgcj1uO2lmKHIubGVuZ3RoPT09MClyZXR1cm4gcjtsZXQgaT0wLHM7ZG97cz0hMTtjb25zdCBsPVtyWzBdXTtmb3IobGV0IG89MTtvPHIubGVuZ3RoO28rKyl7bGV0IGY9ZnVuY3Rpb24obSxnKXtjb25zdCBwPW5ldyBXKGguc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSx1LnNlcTFSYW5nZS5zdGFydCk7aWYoZS5jb3VudExpbmVzSW4ocCk+NXx8cC5sZW5ndGg+NTAwKXJldHVybiExO2NvbnN0IHc9ZS5nZXRUZXh0KHApLnRyaW0oKTtpZih3Lmxlbmd0aD4yMHx8dy5zcGxpdCgvXHJcbnxccnxcbi8pLmxlbmd0aD4xKXJldHVybiExO2NvbnN0IEw9ZS5jb3VudExpbmVzSW4obS5zZXExUmFuZ2UpLHY9bS5zZXExUmFuZ2UubGVuZ3RoLHk9dC5jb3VudExpbmVzSW4obS5zZXEyUmFuZ2UpLGI9bS5zZXEyUmFuZ2UubGVuZ3RoLF89ZS5jb3VudExpbmVzSW4oZy5zZXExUmFuZ2UpLEE9Zy5zZXExUmFuZ2UubGVuZ3RoLEM9dC5jb3VudExpbmVzSW4oZy5zZXEyUmFuZ2UpLEY9Zy5zZXEyUmFuZ2UubGVuZ3RoLE89Mio0MCs1MDtmdW5jdGlvbiBNKE4pe3JldHVybiBNYXRoLm1pbihOLE8pfXJldHVybiBNYXRoLnBvdyhNYXRoLnBvdyhNKEwqNDArdiksMS41KStNYXRoLnBvdyhNKHkqNDArYiksMS41KSwxLjUpK01hdGgucG93KE1hdGgucG93KE0oXyo0MCtBKSwxLjUpK01hdGgucG93KE0oQyo0MCtGKSwxLjUpLDEuNSk+KE8qKjEuNSkqKjEuNSoxLjN9O2NvbnN0IHU9cltvXSxoPWxbbC5sZW5ndGgtMV07ZihoLHUpPyhzPSEwLGxbbC5sZW5ndGgtMV09bFtsLmxlbmd0aC0xXS5qb2luKHUpKTpsLnB1c2godSl9cj1sfXdoaWxlKGkrKzwxMCYmcyk7Y29uc3QgYT1bXTtyZXR1cm4gR3UociwobCxvLHUpPT57bGV0IGg9bztmdW5jdGlvbiBmKHcpe3JldHVybiB3Lmxlbmd0aD4wJiZ3LnRyaW0oKS5sZW5ndGg8PTMmJm8uc2VxMVJhbmdlLmxlbmd0aCtvLnNlcTJSYW5nZS5sZW5ndGg+MTAwfWNvbnN0IGQ9ZS5leHRlbmRUb0Z1bGxMaW5lcyhvLnNlcTFSYW5nZSksbT1lLmdldFRleHQobmV3IFcoZC5zdGFydCxvLnNlcTFSYW5nZS5zdGFydCkpO2YobSkmJihoPWguZGVsdGFTdGFydCgtbS5sZW5ndGgpKTtjb25zdCBnPWUuZ2V0VGV4dChuZXcgVyhvLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUsZC5lbmRFeGNsdXNpdmUpKTtmKGcpJiYoaD1oLmRlbHRhRW5kKGcubGVuZ3RoKSk7Y29uc3QgcD1ZLmZyb21PZmZzZXRQYWlycyhsP2wuZ2V0RW5kRXhjbHVzaXZlcygpOkhlLnplcm8sdT91LmdldFN0YXJ0cygpOkhlLm1heCkseD1oLmludGVyc2VjdChwKTthLmxlbmd0aD4wJiZ4LmdldFN0YXJ0cygpLmVxdWFscyhhW2EubGVuZ3RoLTFdLmdldEVuZEV4Y2x1c2l2ZXMoKSk/YVthLmxlbmd0aC0xXT1hW2EubGVuZ3RoLTFdLmpvaW4oeCk6YS5wdXNoKHgpfSksYX1jbGFzcyBpYXtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMudHJpbW1lZEhhc2g9dCx0aGlzLmxpbmVzPW59Z2V0RWxlbWVudCh0KXtyZXR1cm4gdGhpcy50cmltbWVkSGFzaFt0XX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMudHJpbW1lZEhhc2gubGVuZ3RofWdldEJvdW5kYXJ5U2NvcmUodCl7Y29uc3Qgbj10PT09MD8wOnNhKHRoaXMubGluZXNbdC0xXSkscj10PT09dGhpcy5saW5lcy5sZW5ndGg/MDpzYSh0aGlzLmxpbmVzW3RdKTtyZXR1cm4gMWUzLShuK3IpfWdldFRleHQodCl7cmV0dXJuIHRoaXMubGluZXMuc2xpY2UodC5zdGFydCx0LmVuZEV4Y2x1c2l2ZSkuam9pbihgCmApfWlzU3Ryb25nbHlFcXVhbCh0LG4pe3JldHVybiB0aGlzLmxpbmVzW3RdPT09dGhpcy5saW5lc1tuXX19ZnVuY3Rpb24gc2EoZSl7bGV0IHQ9MDtmb3IoO3Q8ZS5sZW5ndGgmJihlLmNoYXJDb2RlQXQodCk9PT0zMnx8ZS5jaGFyQ29kZUF0KHQpPT09OSk7KXQrKztyZXR1cm4gdH1jbGFzcyBkY3tjb25zdHJ1Y3Rvcigpe3RoaXMuZHluYW1pY1Byb2dyYW1taW5nRGlmZmluZz1uZXcgWXUsdGhpcy5teWVyc0RpZmZpbmdBbGdvcml0aG09bmV3IFFzfWNvbXB1dGVEaWZmKHQsbixyKXtpZih0Lmxlbmd0aDw9MSYmV3UodCxuLChiLF8pPT5iPT09XykpcmV0dXJuIG5ldyB4bihbXSxbXSwhMSk7aWYodC5sZW5ndGg9PT0xJiZ0WzBdLmxlbmd0aD09PTB8fG4ubGVuZ3RoPT09MSYmblswXS5sZW5ndGg9PT0wKXJldHVybiBuZXcgeG4oW25ldyBqZShuZXcgVSgxLHQubGVuZ3RoKzEpLG5ldyBVKDEsbi5sZW5ndGgrMSksW25ldyBSZShuZXcgeigxLDEsdC5sZW5ndGgsdFt0Lmxlbmd0aC0xXS5sZW5ndGgrMSksbmV3IHooMSwxLG4ubGVuZ3RoLG5bbi5sZW5ndGgtMV0ubGVuZ3RoKzEpKV0pXSxbXSwhMSk7Y29uc3QgaT1yLm1heENvbXB1dGF0aW9uVGltZU1zPT09MD96dC5pbnN0YW5jZTpuZXcgUXUoci5tYXhDb21wdXRhdGlvblRpbWVNcykscz0hci5pZ25vcmVUcmltV2hpdGVzcGFjZSxhPW5ldyBNYXA7ZnVuY3Rpb24gbChiKXtsZXQgXz1hLmdldChiKTtyZXR1cm4gXz09PXZvaWQgMCYmKF89YS5zaXplLGEuc2V0KGIsXykpLF99Y29uc3Qgbz10Lm1hcChiPT5sKGIudHJpbSgpKSksdT1uLm1hcChiPT5sKGIudHJpbSgpKSksaD1uZXcgaWEobyx0KSxmPW5ldyBpYSh1LG4pLGQ9aC5sZW5ndGgrZi5sZW5ndGg8MTcwMD90aGlzLmR5bmFtaWNQcm9ncmFtbWluZ0RpZmZpbmcuY29tcHV0ZShoLGYsaSwoYixfKT0+dFtiXT09PW5bX10/bltfXS5sZW5ndGg9PT0wPy4xOjErTWF0aC5sb2coMStuW19dLmxlbmd0aCk6Ljk5KTp0aGlzLm15ZXJzRGlmZmluZ0FsZ29yaXRobS5jb21wdXRlKGgsZixpKTtsZXQgbT1kLmRpZmZzLGc9ZC5oaXRUaW1lb3V0O209dGEoaCxmLG0pLG09ZmMoaCxmLG0pO2NvbnN0IHA9W10seD1iPT57aWYocylmb3IobGV0IF89MDtfPGI7XysrKXtjb25zdCBBPXcrXyxDPUwrXztpZih0W0FdIT09bltDXSl7Y29uc3QgRj10aGlzLnJlZmluZURpZmYodCxuLG5ldyBZKG5ldyBXKEEsQSsxKSxuZXcgVyhDLEMrMSkpLGkscyk7Zm9yKGNvbnN0IE8gb2YgRi5tYXBwaW5ncylwLnB1c2goTyk7Ri5oaXRUaW1lb3V0JiYoZz0hMCl9fX07bGV0IHc9MCxMPTA7Zm9yKGNvbnN0IGIgb2YgbSl7dm4oKCk9PmIuc2VxMVJhbmdlLnN0YXJ0LXc9PT1iLnNlcTJSYW5nZS5zdGFydC1MKTtjb25zdCBfPWIuc2VxMVJhbmdlLnN0YXJ0LXc7eChfKSx3PWIuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSxMPWIuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZTtjb25zdCBBPXRoaXMucmVmaW5lRGlmZih0LG4sYixpLHMpO0EuaGl0VGltZW91dCYmKGc9ITApO2Zvcihjb25zdCBDIG9mIEEubWFwcGluZ3MpcC5wdXNoKEMpfXgodC5sZW5ndGgtdyk7Y29uc3Qgdj1hYShwLHQsbik7bGV0IHk9W107cmV0dXJuIHIuY29tcHV0ZU1vdmVzJiYoeT10aGlzLmNvbXB1dGVNb3Zlcyh2LHQsbixvLHUsaSxzKSksdm4oKCk9PntmdW5jdGlvbiBiKEEsQyl7aWYoQS5saW5lTnVtYmVyPDF8fEEubGluZU51bWJlcj5DLmxlbmd0aClyZXR1cm4hMTtjb25zdCBGPUNbQS5saW5lTnVtYmVyLTFdO3JldHVybiEoQS5jb2x1bW48MXx8QS5jb2x1bW4+Ri5sZW5ndGgrMSl9ZnVuY3Rpb24gXyhBLEMpe3JldHVybiEoQS5zdGFydExpbmVOdW1iZXI8MXx8QS5zdGFydExpbmVOdW1iZXI+Qy5sZW5ndGgrMXx8QS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPDF8fEEuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT5DLmxlbmd0aCsxKX1mb3IoY29uc3QgQSBvZiB2KXtpZighQS5pbm5lckNoYW5nZXMpcmV0dXJuITE7Zm9yKGNvbnN0IEMgb2YgQS5pbm5lckNoYW5nZXMpaWYoIShiKEMubW9kaWZpZWRSYW5nZS5nZXRTdGFydFBvc2l0aW9uKCksbikmJmIoQy5tb2RpZmllZFJhbmdlLmdldEVuZFBvc2l0aW9uKCksbikmJmIoQy5vcmlnaW5hbFJhbmdlLmdldFN0YXJ0UG9zaXRpb24oKSx0KSYmYihDLm9yaWdpbmFsUmFuZ2UuZ2V0RW5kUG9zaXRpb24oKSx0KSkpcmV0dXJuITE7aWYoIV8oQS5tb2RpZmllZCxuKXx8IV8oQS5vcmlnaW5hbCx0KSlyZXR1cm4hMX1yZXR1cm4hMH0pLG5ldyB4bih2LHksZyl9Y29tcHV0ZU1vdmVzKHQsbixyLGkscyxhLGwpe3JldHVybiB0Yyh0LG4scixpLHMsYSkubWFwKGg9Pntjb25zdCBmPXRoaXMucmVmaW5lRGlmZihuLHIsbmV3IFkoaC5vcmlnaW5hbC50b09mZnNldFJhbmdlKCksaC5tb2RpZmllZC50b09mZnNldFJhbmdlKCkpLGEsbCksZD1hYShmLm1hcHBpbmdzLG4sciwhMCk7cmV0dXJuIG5ldyBWdShoLGQpfSl9cmVmaW5lRGlmZih0LG4scixpLHMpe2NvbnN0IGw9Z2MocikudG9SYW5nZU1hcHBpbmcyKHQsbiksbz1uZXcgTm4odCxsLm9yaWdpbmFsUmFuZ2UscyksdT1uZXcgTm4obixsLm1vZGlmaWVkUmFuZ2UscyksaD1vLmxlbmd0aCt1Lmxlbmd0aDw1MDA/dGhpcy5keW5hbWljUHJvZ3JhbW1pbmdEaWZmaW5nLmNvbXB1dGUobyx1LGkpOnRoaXMubXllcnNEaWZmaW5nQWxnb3JpdGhtLmNvbXB1dGUobyx1LGkpO2xldCBmPWguZGlmZnM7cmV0dXJuIGY9dGEobyx1LGYpLGY9dWMobyx1LGYpLGY9bGMobyx1LGYpLGY9aGMobyx1LGYpLHttYXBwaW5nczpmLm1hcChtPT5uZXcgUmUoby50cmFuc2xhdGVSYW5nZShtLnNlcTFSYW5nZSksdS50cmFuc2xhdGVSYW5nZShtLnNlcTJSYW5nZSkpKSxoaXRUaW1lb3V0OmguaGl0VGltZW91dH19fWZ1bmN0aW9uIGFhKGUsdCxuLHI9ITEpe2NvbnN0IGk9W107Zm9yKGNvbnN0IHMgb2YgSHUoZS5tYXAoYT0+bWMoYSx0LG4pKSwoYSxsKT0+YS5vcmlnaW5hbC5vdmVybGFwT3JUb3VjaChsLm9yaWdpbmFsKXx8YS5tb2RpZmllZC5vdmVybGFwT3JUb3VjaChsLm1vZGlmaWVkKSkpe2NvbnN0IGE9c1swXSxsPXNbcy5sZW5ndGgtMV07aS5wdXNoKG5ldyBqZShhLm9yaWdpbmFsLmpvaW4obC5vcmlnaW5hbCksYS5tb2RpZmllZC5qb2luKGwubW9kaWZpZWQpLHMubWFwKG89Pm8uaW5uZXJDaGFuZ2VzWzBdKSkpfXJldHVybiB2bigoKT0+IXImJmkubGVuZ3RoPjAmJihpWzBdLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlciE9PWlbMF0ub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyfHxuLmxlbmd0aC1pW2kubGVuZ3RoLTFdLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUhPT10Lmxlbmd0aC1pW2kubGVuZ3RoLTFdLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpPyExOk9zKGksKHMsYSk9PmEub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLXMub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT09PWEubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLXMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSYmcy5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPGEub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyJiZzLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU8YS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIpKSxpfWZ1bmN0aW9uIG1jKGUsdCxuKXtsZXQgcj0wLGk9MDtlLm1vZGlmaWVkUmFuZ2UuZW5kQ29sdW1uPT09MSYmZS5vcmlnaW5hbFJhbmdlLmVuZENvbHVtbj09PTEmJmUub3JpZ2luYWxSYW5nZS5zdGFydExpbmVOdW1iZXIrcjw9ZS5vcmlnaW5hbFJhbmdlLmVuZExpbmVOdW1iZXImJmUubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXIrcjw9ZS5tb2RpZmllZFJhbmdlLmVuZExpbmVOdW1iZXImJihpPS0xKSxlLm1vZGlmaWVkUmFuZ2Uuc3RhcnRDb2x1bW4tMT49bltlLm1vZGlmaWVkUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLTFdLmxlbmd0aCYmZS5vcmlnaW5hbFJhbmdlLnN0YXJ0Q29sdW1uLTE+PXRbZS5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlci0xXS5sZW5ndGgmJmUub3JpZ2luYWxSYW5nZS5zdGFydExpbmVOdW1iZXI8PWUub3JpZ2luYWxSYW5nZS5lbmRMaW5lTnVtYmVyK2kmJmUubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXI8PWUubW9kaWZpZWRSYW5nZS5lbmRMaW5lTnVtYmVyK2kmJihyPTEpO2NvbnN0IHM9bmV3IFUoZS5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlcityLGUub3JpZ2luYWxSYW5nZS5lbmRMaW5lTnVtYmVyKzEraSksYT1uZXcgVShlLm1vZGlmaWVkUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyK3IsZS5tb2RpZmllZFJhbmdlLmVuZExpbmVOdW1iZXIrMStpKTtyZXR1cm4gbmV3IGplKHMsYSxbZV0pfWZ1bmN0aW9uIGdjKGUpe3JldHVybiBuZXcgTGUobmV3IFUoZS5zZXExUmFuZ2Uuc3RhcnQrMSxlLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUrMSksbmV3IFUoZS5zZXEyUmFuZ2Uuc3RhcnQrMSxlLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUrMSkpfWNvbnN0IG9hPXtnZXRMZWdhY3k6KCk9Pm5ldyBVdSxnZXREZWZhdWx0OigpPT5uZXcgZGN9O2Z1bmN0aW9uIEtlKGUsdCl7Y29uc3Qgbj1NYXRoLnBvdygxMCx0KTtyZXR1cm4gTWF0aC5yb3VuZChlKm4pL259Y2xhc3MgYWV7Y29uc3RydWN0b3IodCxuLHIsaT0xKXt0aGlzLl9yZ2JhQnJhbmQ9dm9pZCAwLHRoaXMucj1NYXRoLm1pbigyNTUsTWF0aC5tYXgoMCx0KSl8MCx0aGlzLmc9TWF0aC5taW4oMjU1LE1hdGgubWF4KDAsbikpfDAsdGhpcy5iPU1hdGgubWluKDI1NSxNYXRoLm1heCgwLHIpKXwwLHRoaXMuYT1LZShNYXRoLm1heChNYXRoLm1pbigxLGkpLDApLDMpfXN0YXRpYyBlcXVhbHModCxuKXtyZXR1cm4gdC5yPT09bi5yJiZ0Lmc9PT1uLmcmJnQuYj09PW4uYiYmdC5hPT09bi5hfX1jbGFzcyBOZXtjb25zdHJ1Y3Rvcih0LG4scixpKXt0aGlzLl9oc2xhQnJhbmQ9dm9pZCAwLHRoaXMuaD1NYXRoLm1heChNYXRoLm1pbigzNjAsdCksMCl8MCx0aGlzLnM9S2UoTWF0aC5tYXgoTWF0aC5taW4oMSxuKSwwKSwzKSx0aGlzLmw9S2UoTWF0aC5tYXgoTWF0aC5taW4oMSxyKSwwKSwzKSx0aGlzLmE9S2UoTWF0aC5tYXgoTWF0aC5taW4oMSxpKSwwKSwzKX1zdGF0aWMgZXF1YWxzKHQsbil7cmV0dXJuIHQuaD09PW4uaCYmdC5zPT09bi5zJiZ0Lmw9PT1uLmwmJnQuYT09PW4uYX1zdGF0aWMgZnJvbVJHQkEodCl7Y29uc3Qgbj10LnIvMjU1LHI9dC5nLzI1NSxpPXQuYi8yNTUscz10LmEsYT1NYXRoLm1heChuLHIsaSksbD1NYXRoLm1pbihuLHIsaSk7bGV0IG89MCx1PTA7Y29uc3QgaD0obCthKS8yLGY9YS1sO2lmKGY+MCl7c3dpdGNoKHU9TWF0aC5taW4oaDw9LjU/Zi8oMipoKTpmLygyLTIqaCksMSksYSl7Y2FzZSBuOm89KHItaSkvZisocjxpPzY6MCk7YnJlYWs7Y2FzZSByOm89KGktbikvZisyO2JyZWFrO2Nhc2UgaTpvPShuLXIpL2YrNDticmVha31vKj02MCxvPU1hdGgucm91bmQobyl9cmV0dXJuIG5ldyBOZShvLHUsaCxzKX1zdGF0aWMgX2h1ZTJyZ2IodCxuLHIpe3JldHVybiByPDAmJihyKz0xKSxyPjEmJihyLT0xKSxyPDEvNj90KyhuLXQpKjYqcjpyPDEvMj9uOnI8Mi8zP3QrKG4tdCkqKDIvMy1yKSo2OnR9c3RhdGljIHRvUkdCQSh0KXtjb25zdCBuPXQuaC8zNjAse3M6cixsOmksYTpzfT10O2xldCBhLGwsbztpZihyPT09MClhPWw9bz1pO2Vsc2V7Y29uc3QgdT1pPC41P2kqKDErcik6aStyLWkqcixoPTIqaS11O2E9TmUuX2h1ZTJyZ2IoaCx1LG4rMS8zKSxsPU5lLl9odWUycmdiKGgsdSxuKSxvPU5lLl9odWUycmdiKGgsdSxuLTEvMyl9cmV0dXJuIG5ldyBhZShNYXRoLnJvdW5kKGEqMjU1KSxNYXRoLnJvdW5kKGwqMjU1KSxNYXRoLnJvdW5kKG8qMjU1KSxzKX19Y2xhc3MgTnR7Y29uc3RydWN0b3IodCxuLHIsaSl7dGhpcy5faHN2YUJyYW5kPXZvaWQgMCx0aGlzLmg9TWF0aC5tYXgoTWF0aC5taW4oMzYwLHQpLDApfDAsdGhpcy5zPUtlKE1hdGgubWF4KE1hdGgubWluKDEsbiksMCksMyksdGhpcy52PUtlKE1hdGgubWF4KE1hdGgubWluKDEsciksMCksMyksdGhpcy5hPUtlKE1hdGgubWF4KE1hdGgubWluKDEsaSksMCksMyl9c3RhdGljIGVxdWFscyh0LG4pe3JldHVybiB0Lmg9PT1uLmgmJnQucz09PW4ucyYmdC52PT09bi52JiZ0LmE9PT1uLmF9c3RhdGljIGZyb21SR0JBKHQpe2NvbnN0IG49dC5yLzI1NSxyPXQuZy8yNTUsaT10LmIvMjU1LHM9TWF0aC5tYXgobixyLGkpLGE9TWF0aC5taW4obixyLGkpLGw9cy1hLG89cz09PTA/MDpsL3M7bGV0IHU7cmV0dXJuIGw9PT0wP3U9MDpzPT09bj91PSgoci1pKS9sJTYrNiklNjpzPT09cj91PShpLW4pL2wrMjp1PShuLXIpL2wrNCxuZXcgTnQoTWF0aC5yb3VuZCh1KjYwKSxvLHMsdC5hKX1zdGF0aWMgdG9SR0JBKHQpe2NvbnN0e2g6bixzOnIsdjppLGE6c309dCxhPWkqcixsPWEqKDEtTWF0aC5hYnMobi82MCUyLTEpKSxvPWktYTtsZXRbdSxoLGZdPVswLDAsMF07cmV0dXJuIG48NjA/KHU9YSxoPWwpOm48MTIwPyh1PWwsaD1hKTpuPDE4MD8oaD1hLGY9bCk6bjwyNDA/KGg9bCxmPWEpOm48MzAwPyh1PWwsZj1hKTpuPD0zNjAmJih1PWEsZj1sKSx1PU1hdGgucm91bmQoKHUrbykqMjU1KSxoPU1hdGgucm91bmQoKGgrbykqMjU1KSxmPU1hdGgucm91bmQoKGYrbykqMjU1KSxuZXcgYWUodSxoLGYscyl9fWxldCBTbj0oRz1jbGFzc3tzdGF0aWMgZnJvbUhleCh0KXtyZXR1cm4gRy5Gb3JtYXQuQ1NTLnBhcnNlSGV4KHQpfHxHLnJlZH1zdGF0aWMgZXF1YWxzKHQsbil7cmV0dXJuIXQmJiFuPyEwOiF0fHwhbj8hMTp0LmVxdWFscyhuKX1nZXQgaHNsYSgpe3JldHVybiB0aGlzLl9oc2xhP3RoaXMuX2hzbGE6TmUuZnJvbVJHQkEodGhpcy5yZ2JhKX1nZXQgaHN2YSgpe3JldHVybiB0aGlzLl9oc3ZhP3RoaXMuX2hzdmE6TnQuZnJvbVJHQkEodGhpcy5yZ2JhKX1jb25zdHJ1Y3Rvcih0KXtpZih0KWlmKHQgaW5zdGFuY2VvZiBhZSl0aGlzLnJnYmE9dDtlbHNlIGlmKHQgaW5zdGFuY2VvZiBOZSl0aGlzLl9oc2xhPXQsdGhpcy5yZ2JhPU5lLnRvUkdCQSh0KTtlbHNlIGlmKHQgaW5zdGFuY2VvZiBOdCl0aGlzLl9oc3ZhPXQsdGhpcy5yZ2JhPU50LnRvUkdCQSh0KTtlbHNlIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2xvciBjdG9yIGFyZ3VtZW50Iik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNvbG9yIG5lZWRzIGEgdmFsdWUiKX1lcXVhbHModCl7cmV0dXJuISF0JiZhZS5lcXVhbHModGhpcy5yZ2JhLHQucmdiYSkmJk5lLmVxdWFscyh0aGlzLmhzbGEsdC5oc2xhKSYmTnQuZXF1YWxzKHRoaXMuaHN2YSx0LmhzdmEpfWdldFJlbGF0aXZlTHVtaW5hbmNlKCl7Y29uc3QgdD1HLl9yZWxhdGl2ZUx1bWluYW5jZUZvckNvbXBvbmVudCh0aGlzLnJnYmEuciksbj1HLl9yZWxhdGl2ZUx1bWluYW5jZUZvckNvbXBvbmVudCh0aGlzLnJnYmEuZykscj1HLl9yZWxhdGl2ZUx1bWluYW5jZUZvckNvbXBvbmVudCh0aGlzLnJnYmEuYiksaT0uMjEyNip0Ky43MTUyKm4rLjA3MjIqcjtyZXR1cm4gS2UoaSw0KX1zdGF0aWMgX3JlbGF0aXZlTHVtaW5hbmNlRm9yQ29tcG9uZW50KHQpe2NvbnN0IG49dC8yNTU7cmV0dXJuIG48PS4wMzkyOD9uLzEyLjkyOk1hdGgucG93KChuKy4wNTUpLzEuMDU1LDIuNCl9aXNMaWdodGVyKCl7cmV0dXJuKHRoaXMucmdiYS5yKjI5OSt0aGlzLnJnYmEuZyo1ODcrdGhpcy5yZ2JhLmIqMTE0KS8xZTM+PTEyOH1pc0xpZ2h0ZXJUaGFuKHQpe2NvbnN0IG49dGhpcy5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLHI9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiBuPnJ9aXNEYXJrZXJUaGFuKHQpe2NvbnN0IG49dGhpcy5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLHI9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiBuPHJ9bGlnaHRlbih0KXtyZXR1cm4gbmV3IEcobmV3IE5lKHRoaXMuaHNsYS5oLHRoaXMuaHNsYS5zLHRoaXMuaHNsYS5sK3RoaXMuaHNsYS5sKnQsdGhpcy5oc2xhLmEpKX1kYXJrZW4odCl7cmV0dXJuIG5ldyBHKG5ldyBOZSh0aGlzLmhzbGEuaCx0aGlzLmhzbGEucyx0aGlzLmhzbGEubC10aGlzLmhzbGEubCp0LHRoaXMuaHNsYS5hKSl9dHJhbnNwYXJlbnQodCl7Y29uc3R7cjpuLGc6cixiOmksYTpzfT10aGlzLnJnYmE7cmV0dXJuIG5ldyBHKG5ldyBhZShuLHIsaSxzKnQpKX1pc1RyYW5zcGFyZW50KCl7cmV0dXJuIHRoaXMucmdiYS5hPT09MH1pc09wYXF1ZSgpe3JldHVybiB0aGlzLnJnYmEuYT09PTF9b3Bwb3NpdGUoKXtyZXR1cm4gbmV3IEcobmV3IGFlKDI1NS10aGlzLnJnYmEuciwyNTUtdGhpcy5yZ2JhLmcsMjU1LXRoaXMucmdiYS5iLHRoaXMucmdiYS5hKSl9bWFrZU9wYXF1ZSh0KXtpZih0aGlzLmlzT3BhcXVlKCl8fHQucmdiYS5hIT09MSlyZXR1cm4gdGhpcztjb25zdHtyOm4sZzpyLGI6aSxhOnN9PXRoaXMucmdiYTtyZXR1cm4gbmV3IEcobmV3IGFlKHQucmdiYS5yLXMqKHQucmdiYS5yLW4pLHQucmdiYS5nLXMqKHQucmdiYS5nLXIpLHQucmdiYS5iLXMqKHQucmdiYS5iLWkpLDEpKX10b1N0cmluZygpe3JldHVybiB0aGlzLl90b1N0cmluZ3x8KHRoaXMuX3RvU3RyaW5nPUcuRm9ybWF0LkNTUy5mb3JtYXQodGhpcykpLHRoaXMuX3RvU3RyaW5nfXN0YXRpYyBnZXRMaWdodGVyQ29sb3IodCxuLHIpe2lmKHQuaXNMaWdodGVyVGhhbihuKSlyZXR1cm4gdDtyPXJ8fC41O2NvbnN0IGk9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLHM9bi5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiByPXIqKHMtaSkvcyx0LmxpZ2h0ZW4ocil9c3RhdGljIGdldERhcmtlckNvbG9yKHQsbixyKXtpZih0LmlzRGFya2VyVGhhbihuKSlyZXR1cm4gdDtyPXJ8fC41O2NvbnN0IGk9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLHM9bi5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiByPXIqKGktcykvaSx0LmRhcmtlbihyKX19LEcud2hpdGU9bmV3IEcobmV3IGFlKDI1NSwyNTUsMjU1LDEpKSxHLmJsYWNrPW5ldyBHKG5ldyBhZSgwLDAsMCwxKSksRy5yZWQ9bmV3IEcobmV3IGFlKDI1NSwwLDAsMSkpLEcuYmx1ZT1uZXcgRyhuZXcgYWUoMCwwLDI1NSwxKSksRy5ncmVlbj1uZXcgRyhuZXcgYWUoMCwyNTUsMCwxKSksRy5jeWFuPW5ldyBHKG5ldyBhZSgwLDI1NSwyNTUsMSkpLEcubGlnaHRncmV5PW5ldyBHKG5ldyBhZSgyMTEsMjExLDIxMSwxKSksRy50cmFuc3BhcmVudD1uZXcgRyhuZXcgYWUoMCwwLDAsMCkpLEcpOyhmdW5jdGlvbihlKXsoZnVuY3Rpb24odCl7KGZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHIobSl7cmV0dXJuIG0ucmdiYS5hPT09MT9gcmdiKCR7bS5yZ2JhLnJ9LCAke20ucmdiYS5nfSwgJHttLnJnYmEuYn0pYDplLkZvcm1hdC5DU1MuZm9ybWF0UkdCQShtKX1uLmZvcm1hdFJHQj1yO2Z1bmN0aW9uIGkobSl7cmV0dXJuYHJnYmEoJHttLnJnYmEucn0sICR7bS5yZ2JhLmd9LCAke20ucmdiYS5ifSwgJHsrbS5yZ2JhLmEudG9GaXhlZCgyKX0pYH1uLmZvcm1hdFJHQkE9aTtmdW5jdGlvbiBzKG0pe3JldHVybiBtLmhzbGEuYT09PTE/YGhzbCgke20uaHNsYS5ofSwgJHsobS5oc2xhLnMqMTAwKS50b0ZpeGVkKDIpfSUsICR7KG0uaHNsYS5sKjEwMCkudG9GaXhlZCgyKX0lKWA6ZS5Gb3JtYXQuQ1NTLmZvcm1hdEhTTEEobSl9bi5mb3JtYXRIU0w9cztmdW5jdGlvbiBhKG0pe3JldHVybmBoc2xhKCR7bS5oc2xhLmh9LCAkeyhtLmhzbGEucyoxMDApLnRvRml4ZWQoMil9JSwgJHsobS5oc2xhLmwqMTAwKS50b0ZpeGVkKDIpfSUsICR7bS5oc2xhLmEudG9GaXhlZCgyKX0pYH1uLmZvcm1hdEhTTEE9YTtmdW5jdGlvbiBsKG0pe2NvbnN0IGc9bS50b1N0cmluZygxNik7cmV0dXJuIGcubGVuZ3RoIT09Mj8iMCIrZzpnfWZ1bmN0aW9uIG8obSl7cmV0dXJuYCMke2wobS5yZ2JhLnIpfSR7bChtLnJnYmEuZyl9JHtsKG0ucmdiYS5iKX1gfW4uZm9ybWF0SGV4PW87ZnVuY3Rpb24gdShtLGc9ITEpe3JldHVybiBnJiZtLnJnYmEuYT09PTE/ZS5Gb3JtYXQuQ1NTLmZvcm1hdEhleChtKTpgIyR7bChtLnJnYmEucil9JHtsKG0ucmdiYS5nKX0ke2wobS5yZ2JhLmIpfSR7bChNYXRoLnJvdW5kKG0ucmdiYS5hKjI1NSkpfWB9bi5mb3JtYXRIZXhBPXU7ZnVuY3Rpb24gaChtKXtyZXR1cm4gbS5pc09wYXF1ZSgpP2UuRm9ybWF0LkNTUy5mb3JtYXRIZXgobSk6ZS5Gb3JtYXQuQ1NTLmZvcm1hdFJHQkEobSl9bi5mb3JtYXQ9aDtmdW5jdGlvbiBmKG0pe2NvbnN0IGc9bS5sZW5ndGg7aWYoZz09PTB8fG0uY2hhckNvZGVBdCgwKSE9PTM1KXJldHVybiBudWxsO2lmKGc9PT03KXtjb25zdCBwPTE2KmQobS5jaGFyQ29kZUF0KDEpKStkKG0uY2hhckNvZGVBdCgyKSkseD0xNipkKG0uY2hhckNvZGVBdCgzKSkrZChtLmNoYXJDb2RlQXQoNCkpLHc9MTYqZChtLmNoYXJDb2RlQXQoNSkpK2QobS5jaGFyQ29kZUF0KDYpKTtyZXR1cm4gbmV3IGUobmV3IGFlKHAseCx3LDEpKX1pZihnPT09OSl7Y29uc3QgcD0xNipkKG0uY2hhckNvZGVBdCgxKSkrZChtLmNoYXJDb2RlQXQoMikpLHg9MTYqZChtLmNoYXJDb2RlQXQoMykpK2QobS5jaGFyQ29kZUF0KDQpKSx3PTE2KmQobS5jaGFyQ29kZUF0KDUpKStkKG0uY2hhckNvZGVBdCg2KSksTD0xNipkKG0uY2hhckNvZGVBdCg3KSkrZChtLmNoYXJDb2RlQXQoOCkpO3JldHVybiBuZXcgZShuZXcgYWUocCx4LHcsTC8yNTUpKX1pZihnPT09NCl7Y29uc3QgcD1kKG0uY2hhckNvZGVBdCgxKSkseD1kKG0uY2hhckNvZGVBdCgyKSksdz1kKG0uY2hhckNvZGVBdCgzKSk7cmV0dXJuIG5ldyBlKG5ldyBhZSgxNipwK3AsMTYqeCt4LDE2KncrdykpfWlmKGc9PT01KXtjb25zdCBwPWQobS5jaGFyQ29kZUF0KDEpKSx4PWQobS5jaGFyQ29kZUF0KDIpKSx3PWQobS5jaGFyQ29kZUF0KDMpKSxMPWQobS5jaGFyQ29kZUF0KDQpKTtyZXR1cm4gbmV3IGUobmV3IGFlKDE2KnArcCwxNip4K3gsMTYqdyt3LCgxNipMK0wpLzI1NSkpfXJldHVybiBudWxsfW4ucGFyc2VIZXg9ZjtmdW5jdGlvbiBkKG0pe3N3aXRjaChtKXtjYXNlIDQ4OnJldHVybiAwO2Nhc2UgNDk6cmV0dXJuIDE7Y2FzZSA1MDpyZXR1cm4gMjtjYXNlIDUxOnJldHVybiAzO2Nhc2UgNTI6cmV0dXJuIDQ7Y2FzZSA1MzpyZXR1cm4gNTtjYXNlIDU0OnJldHVybiA2O2Nhc2UgNTU6cmV0dXJuIDc7Y2FzZSA1NjpyZXR1cm4gODtjYXNlIDU3OnJldHVybiA5O2Nhc2UgOTc6cmV0dXJuIDEwO2Nhc2UgNjU6cmV0dXJuIDEwO2Nhc2UgOTg6cmV0dXJuIDExO2Nhc2UgNjY6cmV0dXJuIDExO2Nhc2UgOTk6cmV0dXJuIDEyO2Nhc2UgNjc6cmV0dXJuIDEyO2Nhc2UgMTAwOnJldHVybiAxMztjYXNlIDY4OnJldHVybiAxMztjYXNlIDEwMTpyZXR1cm4gMTQ7Y2FzZSA2OTpyZXR1cm4gMTQ7Y2FzZSAxMDI6cmV0dXJuIDE1O2Nhc2UgNzA6cmV0dXJuIDE1fXJldHVybiAwfX0pKHQuQ1NTfHwodC5DU1M9e30pKX0pKGUuRm9ybWF0fHwoZS5Gb3JtYXQ9e30pKX0pKFNufHwoU249e30pKTtmdW5jdGlvbiBsYShlKXtjb25zdCB0PVtdO2Zvcihjb25zdCBuIG9mIGUpe2NvbnN0IHI9TnVtYmVyKG4pOyhyfHxyPT09MCYmbi5yZXBsYWNlKC9ccy9nLCIiKSE9PSIiKSYmdC5wdXNoKHIpfXJldHVybiB0fWZ1bmN0aW9uIFJyKGUsdCxuLHIpe3JldHVybntyZWQ6ZS8yNTUsYmx1ZTpuLzI1NSxncmVlbjp0LzI1NSxhbHBoYTpyfX1mdW5jdGlvbiBHdChlLHQpe2NvbnN0IG49dC5pbmRleCxyPXRbMF0ubGVuZ3RoO2lmKCFuKXJldHVybjtjb25zdCBpPWUucG9zaXRpb25BdChuKTtyZXR1cm57c3RhcnRMaW5lTnVtYmVyOmkubGluZU51bWJlcixzdGFydENvbHVtbjppLmNvbHVtbixlbmRMaW5lTnVtYmVyOmkubGluZU51bWJlcixlbmRDb2x1bW46aS5jb2x1bW4rcn19ZnVuY3Rpb24gcGMoZSx0KXtpZighZSlyZXR1cm47Y29uc3Qgbj1Tbi5Gb3JtYXQuQ1NTLnBhcnNlSGV4KHQpO2lmKG4pcmV0dXJue3JhbmdlOmUsY29sb3I6UnIobi5yZ2JhLnIsbi5yZ2JhLmcsbi5yZ2JhLmIsbi5yZ2JhLmEpfX1mdW5jdGlvbiB1YShlLHQsbil7aWYoIWV8fHQubGVuZ3RoIT09MSlyZXR1cm47Y29uc3QgaT10WzBdLnZhbHVlcygpLHM9bGEoaSk7cmV0dXJue3JhbmdlOmUsY29sb3I6UnIoc1swXSxzWzFdLHNbMl0sbj9zWzNdOjEpfX1mdW5jdGlvbiBjYShlLHQsbil7aWYoIWV8fHQubGVuZ3RoIT09MSlyZXR1cm47Y29uc3QgaT10WzBdLnZhbHVlcygpLHM9bGEoaSksYT1uZXcgU24obmV3IE5lKHNbMF0sc1sxXS8xMDAsc1syXS8xMDAsbj9zWzNdOjEpKTtyZXR1cm57cmFuZ2U6ZSxjb2xvcjpScihhLnJnYmEucixhLnJnYmEuZyxhLnJnYmEuYixhLnJnYmEuYSl9fWZ1bmN0aW9uIEp0KGUsdCl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIj9bLi4uZS5tYXRjaEFsbCh0KV06ZS5maW5kTWF0Y2hlcyh0KX1mdW5jdGlvbiBiYyhlKXtjb25zdCB0PVtdLHI9SnQoZSwvXGIocmdifHJnYmF8aHNsfGhzbGEpKFwoWzAtOVxzLC5cJV0qXCkpfCgjKShbQS1GYS1mMC05XXszfSlcYnwoIykoW0EtRmEtZjAtOV17NH0pXGJ8KCMpKFtBLUZhLWYwLTldezZ9KVxifCgjKShbQS1GYS1mMC05XXs4fSlcYi9nbSk7aWYoci5sZW5ndGg+MClmb3IoY29uc3QgaSBvZiByKXtjb25zdCBzPWkuZmlsdGVyKHU9PnUhPT12b2lkIDApLGE9c1sxXSxsPXNbMl07aWYoIWwpY29udGludWU7bGV0IG87aWYoYT09PSJyZ2IiKXtjb25zdCB1PS9eXChccyooMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlccyosXHMqKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXHMqLFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxzKlwpJC9nbTtvPXVhKEd0KGUsaSksSnQobCx1KSwhMSl9ZWxzZSBpZihhPT09InJnYmEiKXtjb25zdCB1PS9eXChccyooMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlccyosXHMqKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXHMqLFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxzKixccyooMFsuXVswLTldK3xbLl1bMC05XSt8WzAxXVsuXXxbMDFdKVxzKlwpJC9nbTtvPXVhKEd0KGUsaSksSnQobCx1KSwhMCl9ZWxzZSBpZihhPT09ImhzbCIpe2NvbnN0IHU9L15cKFxzKigzNlswXXwzWzAtNV1bMC05XXxbMTJdWzAtOV1bMC05XXxbMS05XT9bMC05XSlccyosXHMqKDEwMHxcZHsxLDJ9Wy5dXGQqfFxkezEsMn0pJVxzKixccyooMTAwfFxkezEsMn1bLl1cZCp8XGR7MSwyfSklXHMqXCkkL2dtO289Y2EoR3QoZSxpKSxKdChsLHUpLCExKX1lbHNlIGlmKGE9PT0iaHNsYSIpe2NvbnN0IHU9L15cKFxzKigzNlswXXwzWzAtNV1bMC05XXxbMTJdWzAtOV1bMC05XXxbMS05XT9bMC05XSlccyosXHMqKDEwMHxcZHsxLDJ9Wy5dXGQqfFxkezEsMn0pJVxzKixccyooMTAwfFxkezEsMn1bLl1cZCp8XGR7MSwyfSklXHMqLFxzKigwWy5dWzAtOV0rfFsuXVswLTldK3xbMDFdWy5dfFswMV0pXHMqXCkkL2dtO289Y2EoR3QoZSxpKSxKdChsLHUpLCEwKX1lbHNlIGE9PT0iIyImJihvPXBjKEd0KGUsaSksYStsKSk7byYmdC5wdXNoKG8pfXJldHVybiB0fWZ1bmN0aW9uIHZjKGUpe3JldHVybiFlfHx0eXBlb2YgZS5nZXRWYWx1ZSE9ImZ1bmN0aW9uInx8dHlwZW9mIGUucG9zaXRpb25BdCE9ImZ1bmN0aW9uIj9bXTpiYyhlKX1jb25zdCBmYT1uZXcgUmVnRXhwKCJcXGJNQVJLOlxccyooLiopJCIsImQiKSx4Yz0vXi0rfC0rJC9nO2Z1bmN0aW9uIHljKGUsdCl7dmFyIHI7bGV0IG49W107aWYodC5maW5kUmVnaW9uU2VjdGlvbkhlYWRlcnMmJigocj10LmZvbGRpbmdSdWxlcykhPW51bGwmJnIubWFya2Vycykpe2NvbnN0IGk9d2MoZSx0KTtuPW4uY29uY2F0KGkpfWlmKHQuZmluZE1hcmtTZWN0aW9uSGVhZGVycyl7Y29uc3QgaT1fYyhlKTtuPW4uY29uY2F0KGkpfXJldHVybiBufWZ1bmN0aW9uIHdjKGUsdCl7Y29uc3Qgbj1bXSxyPWUuZ2V0TGluZUNvdW50KCk7Zm9yKGxldCBpPTE7aTw9cjtpKyspe2NvbnN0IHM9ZS5nZXRMaW5lQ29udGVudChpKSxhPXMubWF0Y2godC5mb2xkaW5nUnVsZXMubWFya2Vycy5zdGFydCk7aWYoYSl7Y29uc3QgbD17c3RhcnRMaW5lTnVtYmVyOmksc3RhcnRDb2x1bW46YVswXS5sZW5ndGgrMSxlbmRMaW5lTnVtYmVyOmksZW5kQ29sdW1uOnMubGVuZ3RoKzF9O2lmKGwuZW5kQ29sdW1uPmwuc3RhcnRDb2x1bW4pe2NvbnN0IG89e3JhbmdlOmwsLi4uaGEocy5zdWJzdHJpbmcoYVswXS5sZW5ndGgpKSxzaG91bGRCZUluQ29tbWVudHM6ITF9OyhvLnRleHR8fG8uaGFzU2VwYXJhdG9yTGluZSkmJm4ucHVzaChvKX19fXJldHVybiBufWZ1bmN0aW9uIF9jKGUpe2NvbnN0IHQ9W10sbj1lLmdldExpbmVDb3VudCgpO2ZvcihsZXQgcj0xO3I8PW47cisrKXtjb25zdCBpPWUuZ2V0TGluZUNvbnRlbnQocik7TGMoaSxyLHQpfXJldHVybiB0fWZ1bmN0aW9uIExjKGUsdCxuKXtmYS5sYXN0SW5kZXg9MDtjb25zdCByPWZhLmV4ZWMoZSk7aWYocil7Y29uc3QgaT1yLmluZGljZXNbMV1bMF0rMSxzPXIuaW5kaWNlc1sxXVsxXSsxLGE9e3N0YXJ0TGluZU51bWJlcjp0LHN0YXJ0Q29sdW1uOmksZW5kTGluZU51bWJlcjp0LGVuZENvbHVtbjpzfTtpZihhLmVuZENvbHVtbj5hLnN0YXJ0Q29sdW1uKXtjb25zdCBsPXtyYW5nZTphLC4uLmhhKHJbMV0pLHNob3VsZEJlSW5Db21tZW50czohMH07KGwudGV4dHx8bC5oYXNTZXBhcmF0b3JMaW5lKSYmbi5wdXNoKGwpfX19ZnVuY3Rpb24gaGEoZSl7ZT1lLnRyaW0oKTtjb25zdCB0PWUuc3RhcnRzV2l0aCgiLSIpO3JldHVybiBlPWUucmVwbGFjZSh4YywiIikse3RleHQ6ZSxoYXNTZXBhcmF0b3JMaW5lOnR9fXZhciBkYTsoZnVuY3Rpb24oZSl7YXN5bmMgZnVuY3Rpb24gdChyKXtsZXQgaTtjb25zdCBzPWF3YWl0IFByb21pc2UuYWxsKHIubWFwKGE9PmEudGhlbihsPT5sLGw9PntpfHwoaT1sKX0pKSk7aWYodHlwZW9mIGk8InUiKXRocm93IGk7cmV0dXJuIHN9ZS5zZXR0bGVkPXQ7ZnVuY3Rpb24gbihyKXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMoaSxzKT0+e3RyeXthd2FpdCByKGkscyl9Y2F0Y2goYSl7cyhhKX19KX1lLndpdGhBc3luY0JvZHk9bn0pKGRhfHwoZGE9e30pKTtjb25zdCBnZT1jbGFzcyBnZXtzdGF0aWMgZnJvbUFycmF5KHQpe3JldHVybiBuZXcgZ2Uobj0+e24uZW1pdE1hbnkodCl9KX1zdGF0aWMgZnJvbVByb21pc2UodCl7cmV0dXJuIG5ldyBnZShhc3luYyBuPT57bi5lbWl0TWFueShhd2FpdCB0KX0pfXN0YXRpYyBmcm9tUHJvbWlzZXModCl7cmV0dXJuIG5ldyBnZShhc3luYyBuPT57YXdhaXQgUHJvbWlzZS5hbGwodC5tYXAoYXN5bmMgcj0+bi5lbWl0T25lKGF3YWl0IHIpKSl9KX1zdGF0aWMgbWVyZ2UodCl7cmV0dXJuIG5ldyBnZShhc3luYyBuPT57YXdhaXQgUHJvbWlzZS5hbGwodC5tYXAoYXN5bmMgcj0+e2ZvciBhd2FpdChjb25zdCBpIG9mIHIpbi5lbWl0T25lKGkpfSkpfSl9Y29uc3RydWN0b3IodCxuKXt0aGlzLl9zdGF0ZT0wLHRoaXMuX3Jlc3VsdHM9W10sdGhpcy5fZXJyb3I9bnVsbCx0aGlzLl9vblJldHVybj1uLHRoaXMuX29uU3RhdGVDaGFuZ2VkPW5ldyBfZSxxdWV1ZU1pY3JvdGFzayhhc3luYygpPT57Y29uc3Qgcj17ZW1pdE9uZTppPT50aGlzLmVtaXRPbmUoaSksZW1pdE1hbnk6aT0+dGhpcy5lbWl0TWFueShpKSxyZWplY3Q6aT0+dGhpcy5yZWplY3QoaSl9O3RyeXthd2FpdCBQcm9taXNlLnJlc29sdmUodChyKSksdGhpcy5yZXNvbHZlKCl9Y2F0Y2goaSl7dGhpcy5yZWplY3QoaSl9ZmluYWxseXtyLmVtaXRPbmU9dm9pZCAwLHIuZW1pdE1hbnk9dm9pZCAwLHIucmVqZWN0PXZvaWQgMH19KX1bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7bGV0IHQ9MDtyZXR1cm57bmV4dDphc3luYygpPT57ZG97aWYodGhpcy5fc3RhdGU9PT0yKXRocm93IHRoaXMuX2Vycm9yO2lmKHQ8dGhpcy5fcmVzdWx0cy5sZW5ndGgpcmV0dXJue2RvbmU6ITEsdmFsdWU6dGhpcy5fcmVzdWx0c1t0KytdfTtpZih0aGlzLl9zdGF0ZT09PTEpcmV0dXJue2RvbmU6ITAsdmFsdWU6dm9pZCAwfTthd2FpdCB1bi50b1Byb21pc2UodGhpcy5fb25TdGF0ZUNoYW5nZWQuZXZlbnQpfXdoaWxlKCEwKX0scmV0dXJuOmFzeW5jKCk9Pnt2YXIgbjtyZXR1cm4obj10aGlzLl9vblJldHVybik9PW51bGx8fG4uY2FsbCh0aGlzKSx7ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fX19c3RhdGljIG1hcCh0LG4pe3JldHVybiBuZXcgZ2UoYXN5bmMgcj0+e2ZvciBhd2FpdChjb25zdCBpIG9mIHQpci5lbWl0T25lKG4oaSkpfSl9bWFwKHQpe3JldHVybiBnZS5tYXAodGhpcyx0KX1zdGF0aWMgZmlsdGVyKHQsbil7cmV0dXJuIG5ldyBnZShhc3luYyByPT57Zm9yIGF3YWl0KGNvbnN0IGkgb2YgdCluKGkpJiZyLmVtaXRPbmUoaSl9KX1maWx0ZXIodCl7cmV0dXJuIGdlLmZpbHRlcih0aGlzLHQpfXN0YXRpYyBjb2FsZXNjZSh0KXtyZXR1cm4gZ2UuZmlsdGVyKHQsbj0+ISFuKX1jb2FsZXNjZSgpe3JldHVybiBnZS5jb2FsZXNjZSh0aGlzKX1zdGF0aWMgYXN5bmMgdG9Qcm9taXNlKHQpe2NvbnN0IG49W107Zm9yIGF3YWl0KGNvbnN0IHIgb2YgdCluLnB1c2gocik7cmV0dXJuIG59dG9Qcm9taXNlKCl7cmV0dXJuIGdlLnRvUHJvbWlzZSh0aGlzKX1lbWl0T25lKHQpe3RoaXMuX3N0YXRlPT09MCYmKHRoaXMuX3Jlc3VsdHMucHVzaCh0KSx0aGlzLl9vblN0YXRlQ2hhbmdlZC5maXJlKCkpfWVtaXRNYW55KHQpe3RoaXMuX3N0YXRlPT09MCYmKHRoaXMuX3Jlc3VsdHM9dGhpcy5fcmVzdWx0cy5jb25jYXQodCksdGhpcy5fb25TdGF0ZUNoYW5nZWQuZmlyZSgpKX1yZXNvbHZlKCl7dGhpcy5fc3RhdGU9PT0wJiYodGhpcy5fc3RhdGU9MSx0aGlzLl9vblN0YXRlQ2hhbmdlZC5maXJlKCkpfXJlamVjdCh0KXt0aGlzLl9zdGF0ZT09PTAmJih0aGlzLl9zdGF0ZT0yLHRoaXMuX2Vycm9yPXQsdGhpcy5fb25TdGF0ZUNoYW5nZWQuZmlyZSgpKX19O2dlLkVNUFRZPWdlLmZyb21BcnJheShbXSk7bGV0IG1hPWdlO2NsYXNzIE5je2NvbnN0cnVjdG9yKHQpe3RoaXMudmFsdWVzPXQsdGhpcy5wcmVmaXhTdW09bmV3IFVpbnQzMkFycmF5KHQubGVuZ3RoKSx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXg9bmV3IEludDMyQXJyYXkoMSksdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPS0xfWluc2VydFZhbHVlcyh0LG4pe3Q9eXQodCk7Y29uc3Qgcj10aGlzLnZhbHVlcyxpPXRoaXMucHJlZml4U3VtLHM9bi5sZW5ndGg7cmV0dXJuIHM9PT0wPyExOih0aGlzLnZhbHVlcz1uZXcgVWludDMyQXJyYXkoci5sZW5ndGgrcyksdGhpcy52YWx1ZXMuc2V0KHIuc3ViYXJyYXkoMCx0KSwwKSx0aGlzLnZhbHVlcy5zZXQoci5zdWJhcnJheSh0KSx0K3MpLHRoaXMudmFsdWVzLnNldChuLHQpLHQtMTx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0mJih0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF09dC0xKSx0aGlzLnByZWZpeFN1bT1uZXcgVWludDMyQXJyYXkodGhpcy52YWx1ZXMubGVuZ3RoKSx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0+PTAmJnRoaXMucHJlZml4U3VtLnNldChpLnN1YmFycmF5KDAsdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKzEpKSwhMCl9c2V0VmFsdWUodCxuKXtyZXR1cm4gdD15dCh0KSxuPXl0KG4pLHRoaXMudmFsdWVzW3RdPT09bj8hMToodGhpcy52YWx1ZXNbdF09bix0LTE8dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdJiYodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPXQtMSksITApfXJlbW92ZVZhbHVlcyh0LG4pe3Q9eXQodCksbj15dChuKTtjb25zdCByPXRoaXMudmFsdWVzLGk9dGhpcy5wcmVmaXhTdW07aWYodD49ci5sZW5ndGgpcmV0dXJuITE7Y29uc3Qgcz1yLmxlbmd0aC10O3JldHVybiBuPj1zJiYobj1zKSxuPT09MD8hMToodGhpcy52YWx1ZXM9bmV3IFVpbnQzMkFycmF5KHIubGVuZ3RoLW4pLHRoaXMudmFsdWVzLnNldChyLnN1YmFycmF5KDAsdCksMCksdGhpcy52YWx1ZXMuc2V0KHIuc3ViYXJyYXkodCtuKSx0KSx0aGlzLnByZWZpeFN1bT1uZXcgVWludDMyQXJyYXkodGhpcy52YWx1ZXMubGVuZ3RoKSx0LTE8dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdJiYodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPXQtMSksdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPj0wJiZ0aGlzLnByZWZpeFN1bS5zZXQoaS5zdWJhcnJheSgwLHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSsxKSksITApfWdldFRvdGFsU3VtKCl7cmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aD09PTA/MDp0aGlzLl9nZXRQcmVmaXhTdW0odGhpcy52YWx1ZXMubGVuZ3RoLTEpfWdldFByZWZpeFN1bSh0KXtyZXR1cm4gdDwwPzA6KHQ9eXQodCksdGhpcy5fZ2V0UHJlZml4U3VtKHQpKX1fZ2V0UHJlZml4U3VtKHQpe2lmKHQ8PXRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSlyZXR1cm4gdGhpcy5wcmVmaXhTdW1bdF07bGV0IG49dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKzE7bj09PTAmJih0aGlzLnByZWZpeFN1bVswXT10aGlzLnZhbHVlc1swXSxuKyspLHQ+PXRoaXMudmFsdWVzLmxlbmd0aCYmKHQ9dGhpcy52YWx1ZXMubGVuZ3RoLTEpO2ZvcihsZXQgcj1uO3I8PXQ7cisrKXRoaXMucHJlZml4U3VtW3JdPXRoaXMucHJlZml4U3VtW3ItMV0rdGhpcy52YWx1ZXNbcl07cmV0dXJuIHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXT1NYXRoLm1heCh0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0sdCksdGhpcy5wcmVmaXhTdW1bdF19Z2V0SW5kZXhPZih0KXt0PU1hdGguZmxvb3IodCksdGhpcy5nZXRUb3RhbFN1bSgpO2xldCBuPTAscj10aGlzLnZhbHVlcy5sZW5ndGgtMSxpPTAscz0wLGE9MDtmb3IoO248PXI7KWlmKGk9bisoci1uKS8yfDAscz10aGlzLnByZWZpeFN1bVtpXSxhPXMtdGhpcy52YWx1ZXNbaV0sdDxhKXI9aS0xO2Vsc2UgaWYodD49cyluPWkrMTtlbHNlIGJyZWFrO3JldHVybiBuZXcgU2MoaSx0LWEpfX1jbGFzcyBTY3tjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuaW5kZXg9dCx0aGlzLnJlbWFpbmRlcj1uLHRoaXMuX3ByZWZpeFN1bUluZGV4T2ZSZXN1bHRCcmFuZD12b2lkIDAsdGhpcy5pbmRleD10LHRoaXMucmVtYWluZGVyPW59fWNsYXNzIEFje2NvbnN0cnVjdG9yKHQsbixyLGkpe3RoaXMuX3VyaT10LHRoaXMuX2xpbmVzPW4sdGhpcy5fZW9sPXIsdGhpcy5fdmVyc2lvbklkPWksdGhpcy5fbGluZVN0YXJ0cz1udWxsLHRoaXMuX2NhY2hlZFRleHRWYWx1ZT1udWxsfWRpc3Bvc2UoKXt0aGlzLl9saW5lcy5sZW5ndGg9MH1nZXQgdmVyc2lvbigpe3JldHVybiB0aGlzLl92ZXJzaW9uSWR9Z2V0VGV4dCgpe3JldHVybiB0aGlzLl9jYWNoZWRUZXh0VmFsdWU9PT1udWxsJiYodGhpcy5fY2FjaGVkVGV4dFZhbHVlPXRoaXMuX2xpbmVzLmpvaW4odGhpcy5fZW9sKSksdGhpcy5fY2FjaGVkVGV4dFZhbHVlfW9uRXZlbnRzKHQpe3QuZW9sJiZ0LmVvbCE9PXRoaXMuX2VvbCYmKHRoaXMuX2VvbD10LmVvbCx0aGlzLl9saW5lU3RhcnRzPW51bGwpO2NvbnN0IG49dC5jaGFuZ2VzO2Zvcihjb25zdCByIG9mIG4pdGhpcy5fYWNjZXB0RGVsZXRlUmFuZ2Uoci5yYW5nZSksdGhpcy5fYWNjZXB0SW5zZXJ0VGV4dChuZXcgZWUoci5yYW5nZS5zdGFydExpbmVOdW1iZXIsci5yYW5nZS5zdGFydENvbHVtbiksci50ZXh0KTt0aGlzLl92ZXJzaW9uSWQ9dC52ZXJzaW9uSWQsdGhpcy5fY2FjaGVkVGV4dFZhbHVlPW51bGx9X2Vuc3VyZUxpbmVTdGFydHMoKXtpZighdGhpcy5fbGluZVN0YXJ0cyl7Y29uc3QgdD10aGlzLl9lb2wubGVuZ3RoLG49dGhpcy5fbGluZXMubGVuZ3RoLHI9bmV3IFVpbnQzMkFycmF5KG4pO2ZvcihsZXQgaT0wO2k8bjtpKyspcltpXT10aGlzLl9saW5lc1tpXS5sZW5ndGgrdDt0aGlzLl9saW5lU3RhcnRzPW5ldyBOYyhyKX19X3NldExpbmVUZXh0KHQsbil7dGhpcy5fbGluZXNbdF09bix0aGlzLl9saW5lU3RhcnRzJiZ0aGlzLl9saW5lU3RhcnRzLnNldFZhbHVlKHQsdGhpcy5fbGluZXNbdF0ubGVuZ3RoK3RoaXMuX2VvbC5sZW5ndGgpfV9hY2NlcHREZWxldGVSYW5nZSh0KXtpZih0LnN0YXJ0TGluZU51bWJlcj09PXQuZW5kTGluZU51bWJlcil7aWYodC5zdGFydENvbHVtbj09PXQuZW5kQ29sdW1uKXJldHVybjt0aGlzLl9zZXRMaW5lVGV4dCh0LnN0YXJ0TGluZU51bWJlci0xLHRoaXMuX2xpbmVzW3Quc3RhcnRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZygwLHQuc3RhcnRDb2x1bW4tMSkrdGhpcy5fbGluZXNbdC5zdGFydExpbmVOdW1iZXItMV0uc3Vic3RyaW5nKHQuZW5kQ29sdW1uLTEpKTtyZXR1cm59dGhpcy5fc2V0TGluZVRleHQodC5zdGFydExpbmVOdW1iZXItMSx0aGlzLl9saW5lc1t0LnN0YXJ0TGluZU51bWJlci0xXS5zdWJzdHJpbmcoMCx0LnN0YXJ0Q29sdW1uLTEpK3RoaXMuX2xpbmVzW3QuZW5kTGluZU51bWJlci0xXS5zdWJzdHJpbmcodC5lbmRDb2x1bW4tMSkpLHRoaXMuX2xpbmVzLnNwbGljZSh0LnN0YXJ0TGluZU51bWJlcix0LmVuZExpbmVOdW1iZXItdC5zdGFydExpbmVOdW1iZXIpLHRoaXMuX2xpbmVTdGFydHMmJnRoaXMuX2xpbmVTdGFydHMucmVtb3ZlVmFsdWVzKHQuc3RhcnRMaW5lTnVtYmVyLHQuZW5kTGluZU51bWJlci10LnN0YXJ0TGluZU51bWJlcil9X2FjY2VwdEluc2VydFRleHQodCxuKXtpZihuLmxlbmd0aD09PTApcmV0dXJuO2NvbnN0IHI9dmwobik7aWYoci5sZW5ndGg9PT0xKXt0aGlzLl9zZXRMaW5lVGV4dCh0LmxpbmVOdW1iZXItMSx0aGlzLl9saW5lc1t0LmxpbmVOdW1iZXItMV0uc3Vic3RyaW5nKDAsdC5jb2x1bW4tMSkrclswXSt0aGlzLl9saW5lc1t0LmxpbmVOdW1iZXItMV0uc3Vic3RyaW5nKHQuY29sdW1uLTEpKTtyZXR1cm59cltyLmxlbmd0aC0xXSs9dGhpcy5fbGluZXNbdC5saW5lTnVtYmVyLTFdLnN1YnN0cmluZyh0LmNvbHVtbi0xKSx0aGlzLl9zZXRMaW5lVGV4dCh0LmxpbmVOdW1iZXItMSx0aGlzLl9saW5lc1t0LmxpbmVOdW1iZXItMV0uc3Vic3RyaW5nKDAsdC5jb2x1bW4tMSkrclswXSk7Y29uc3QgaT1uZXcgVWludDMyQXJyYXkoci5sZW5ndGgtMSk7Zm9yKGxldCBzPTE7czxyLmxlbmd0aDtzKyspdGhpcy5fbGluZXMuc3BsaWNlKHQubGluZU51bWJlcitzLTEsMCxyW3NdKSxpW3MtMV09cltzXS5sZW5ndGgrdGhpcy5fZW9sLmxlbmd0aDt0aGlzLl9saW5lU3RhcnRzJiZ0aGlzLl9saW5lU3RhcnRzLmluc2VydFZhbHVlcyh0LmxpbmVOdW1iZXIsaSl9fWNsYXNzIGtje2NvbnN0cnVjdG9yKCl7dGhpcy5fbW9kZWxzPU9iamVjdC5jcmVhdGUobnVsbCl9Z2V0TW9kZWwodCl7cmV0dXJuIHRoaXMuX21vZGVsc1t0XX1nZXRNb2RlbHMoKXtjb25zdCB0PVtdO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tb2RlbHMpLmZvckVhY2gobj0+dC5wdXNoKHRoaXMuX21vZGVsc1tuXSkpLHR9JGFjY2VwdE5ld01vZGVsKHQpe3RoaXMuX21vZGVsc1t0LnVybF09bmV3IFJjKEllLnBhcnNlKHQudXJsKSx0LmxpbmVzLHQuRU9MLHQudmVyc2lvbklkKX0kYWNjZXB0TW9kZWxDaGFuZ2VkKHQsbil7aWYoIXRoaXMuX21vZGVsc1t0XSlyZXR1cm47dGhpcy5fbW9kZWxzW3RdLm9uRXZlbnRzKG4pfSRhY2NlcHRSZW1vdmVkTW9kZWwodCl7dGhpcy5fbW9kZWxzW3RdJiZkZWxldGUgdGhpcy5fbW9kZWxzW3RdfX1jbGFzcyBSYyBleHRlbmRzIEFje2dldCB1cmkoKXtyZXR1cm4gdGhpcy5fdXJpfWdldCBlb2woKXtyZXR1cm4gdGhpcy5fZW9sfWdldFZhbHVlKCl7cmV0dXJuIHRoaXMuZ2V0VGV4dCgpfWZpbmRNYXRjaGVzKHQpe2NvbnN0IG49W107Zm9yKGxldCByPTA7cjx0aGlzLl9saW5lcy5sZW5ndGg7cisrKXtjb25zdCBpPXRoaXMuX2xpbmVzW3JdLHM9dGhpcy5vZmZzZXRBdChuZXcgZWUocisxLDEpKSxhPWkubWF0Y2hBbGwodCk7Zm9yKGNvbnN0IGwgb2YgYSkobC5pbmRleHx8bC5pbmRleD09PTApJiYobC5pbmRleD1sLmluZGV4K3MpLG4ucHVzaChsKX1yZXR1cm4gbn1nZXRMaW5lc0NvbnRlbnQoKXtyZXR1cm4gdGhpcy5fbGluZXMuc2xpY2UoMCl9Z2V0TGluZUNvdW50KCl7cmV0dXJuIHRoaXMuX2xpbmVzLmxlbmd0aH1nZXRMaW5lQ29udGVudCh0KXtyZXR1cm4gdGhpcy5fbGluZXNbdC0xXX1nZXRXb3JkQXRQb3NpdGlvbih0LG4pe2NvbnN0IHI9eXIodC5jb2x1bW4sVXMobiksdGhpcy5fbGluZXNbdC5saW5lTnVtYmVyLTFdLDApO3JldHVybiByP25ldyB6KHQubGluZU51bWJlcixyLnN0YXJ0Q29sdW1uLHQubGluZU51bWJlcixyLmVuZENvbHVtbik6bnVsbH13b3Jkcyh0KXtjb25zdCBuPXRoaXMuX2xpbmVzLHI9dGhpcy5fd29yZGVuaXplLmJpbmQodGhpcyk7bGV0IGk9MCxzPSIiLGE9MCxsPVtdO3JldHVybnsqW1N5bWJvbC5pdGVyYXRvcl0oKXtmb3IoOzspaWYoYTxsLmxlbmd0aCl7Y29uc3Qgbz1zLnN1YnN0cmluZyhsW2FdLnN0YXJ0LGxbYV0uZW5kKTthKz0xLHlpZWxkIG99ZWxzZSBpZihpPG4ubGVuZ3RoKXM9bltpXSxsPXIocyx0KSxhPTAsaSs9MTtlbHNlIGJyZWFrfX19Z2V0TGluZVdvcmRzKHQsbil7Y29uc3Qgcj10aGlzLl9saW5lc1t0LTFdLGk9dGhpcy5fd29yZGVuaXplKHIsbikscz1bXTtmb3IoY29uc3QgYSBvZiBpKXMucHVzaCh7d29yZDpyLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kKSxzdGFydENvbHVtbjphLnN0YXJ0KzEsZW5kQ29sdW1uOmEuZW5kKzF9KTtyZXR1cm4gc31fd29yZGVuaXplKHQsbil7Y29uc3Qgcj1bXTtsZXQgaTtmb3Iobi5sYXN0SW5kZXg9MDsoaT1uLmV4ZWModCkpJiZpWzBdLmxlbmd0aCE9PTA7KXIucHVzaCh7c3RhcnQ6aS5pbmRleCxlbmQ6aS5pbmRleCtpWzBdLmxlbmd0aH0pO3JldHVybiByfWdldFZhbHVlSW5SYW5nZSh0KXtpZih0PXRoaXMuX3ZhbGlkYXRlUmFuZ2UodCksdC5zdGFydExpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXIpcmV0dXJuIHRoaXMuX2xpbmVzW3Quc3RhcnRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZyh0LnN0YXJ0Q29sdW1uLTEsdC5lbmRDb2x1bW4tMSk7Y29uc3Qgbj10aGlzLl9lb2wscj10LnN0YXJ0TGluZU51bWJlci0xLGk9dC5lbmRMaW5lTnVtYmVyLTEscz1bXTtzLnB1c2godGhpcy5fbGluZXNbcl0uc3Vic3RyaW5nKHQuc3RhcnRDb2x1bW4tMSkpO2ZvcihsZXQgYT1yKzE7YTxpO2ErKylzLnB1c2godGhpcy5fbGluZXNbYV0pO3JldHVybiBzLnB1c2godGhpcy5fbGluZXNbaV0uc3Vic3RyaW5nKDAsdC5lbmRDb2x1bW4tMSkpLHMuam9pbihuKX1vZmZzZXRBdCh0KXtyZXR1cm4gdD10aGlzLl92YWxpZGF0ZVBvc2l0aW9uKHQpLHRoaXMuX2Vuc3VyZUxpbmVTdGFydHMoKSx0aGlzLl9saW5lU3RhcnRzLmdldFByZWZpeFN1bSh0LmxpbmVOdW1iZXItMikrKHQuY29sdW1uLTEpfXBvc2l0aW9uQXQodCl7dD1NYXRoLmZsb29yKHQpLHQ9TWF0aC5tYXgoMCx0KSx0aGlzLl9lbnN1cmVMaW5lU3RhcnRzKCk7Y29uc3Qgbj10aGlzLl9saW5lU3RhcnRzLmdldEluZGV4T2YodCkscj10aGlzLl9saW5lc1tuLmluZGV4XS5sZW5ndGg7cmV0dXJue2xpbmVOdW1iZXI6MStuLmluZGV4LGNvbHVtbjoxK01hdGgubWluKG4ucmVtYWluZGVyLHIpfX1fdmFsaWRhdGVSYW5nZSh0KXtjb25zdCBuPXRoaXMuX3ZhbGlkYXRlUG9zaXRpb24oe2xpbmVOdW1iZXI6dC5zdGFydExpbmVOdW1iZXIsY29sdW1uOnQuc3RhcnRDb2x1bW59KSxyPXRoaXMuX3ZhbGlkYXRlUG9zaXRpb24oe2xpbmVOdW1iZXI6dC5lbmRMaW5lTnVtYmVyLGNvbHVtbjp0LmVuZENvbHVtbn0pO3JldHVybiBuLmxpbmVOdW1iZXIhPT10LnN0YXJ0TGluZU51bWJlcnx8bi5jb2x1bW4hPT10LnN0YXJ0Q29sdW1ufHxyLmxpbmVOdW1iZXIhPT10LmVuZExpbmVOdW1iZXJ8fHIuY29sdW1uIT09dC5lbmRDb2x1bW4/e3N0YXJ0TGluZU51bWJlcjpuLmxpbmVOdW1iZXIsc3RhcnRDb2x1bW46bi5jb2x1bW4sZW5kTGluZU51bWJlcjpyLmxpbmVOdW1iZXIsZW5kQ29sdW1uOnIuY29sdW1ufTp0fV92YWxpZGF0ZVBvc2l0aW9uKHQpe2lmKCFlZS5pc0lQb3NpdGlvbih0KSl0aHJvdyBuZXcgRXJyb3IoImJhZCBwb3NpdGlvbiIpO2xldHtsaW5lTnVtYmVyOm4sY29sdW1uOnJ9PXQsaT0hMTtpZihuPDEpbj0xLHI9MSxpPSEwO2Vsc2UgaWYobj50aGlzLl9saW5lcy5sZW5ndGgpbj10aGlzLl9saW5lcy5sZW5ndGgscj10aGlzLl9saW5lc1tuLTFdLmxlbmd0aCsxLGk9ITA7ZWxzZXtjb25zdCBzPXRoaXMuX2xpbmVzW24tMV0ubGVuZ3RoKzE7cjwxPyhyPTEsaT0hMCk6cj5zJiYocj1zLGk9ITApfXJldHVybiBpP3tsaW5lTnVtYmVyOm4sY29sdW1uOnJ9OnR9fWNvbnN0IEJuPWNsYXNzIEJue2NvbnN0cnVjdG9yKCl7dGhpcy5fd29ya2VyVGV4dE1vZGVsU3luY1NlcnZlcj1uZXcga2N9ZGlzcG9zZSgpe31fZ2V0TW9kZWwodCl7cmV0dXJuIHRoaXMuX3dvcmtlclRleHRNb2RlbFN5bmNTZXJ2ZXIuZ2V0TW9kZWwodCl9X2dldE1vZGVscygpe3JldHVybiB0aGlzLl93b3JrZXJUZXh0TW9kZWxTeW5jU2VydmVyLmdldE1vZGVscygpfSRhY2NlcHROZXdNb2RlbCh0KXt0aGlzLl93b3JrZXJUZXh0TW9kZWxTeW5jU2VydmVyLiRhY2NlcHROZXdNb2RlbCh0KX0kYWNjZXB0TW9kZWxDaGFuZ2VkKHQsbil7dGhpcy5fd29ya2VyVGV4dE1vZGVsU3luY1NlcnZlci4kYWNjZXB0TW9kZWxDaGFuZ2VkKHQsbil9JGFjY2VwdFJlbW92ZWRNb2RlbCh0KXt0aGlzLl93b3JrZXJUZXh0TW9kZWxTeW5jU2VydmVyLiRhY2NlcHRSZW1vdmVkTW9kZWwodCl9YXN5bmMgJGNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0cyh0LG4scil7Y29uc3QgaT10aGlzLl9nZXRNb2RlbCh0KTtyZXR1cm4gaT9JdS5jb21wdXRlVW5pY29kZUhpZ2hsaWdodHMoaSxuLHIpOntyYW5nZXM6W10saGFzTW9yZTohMSxhbWJpZ3VvdXNDaGFyYWN0ZXJDb3VudDowLGludmlzaWJsZUNoYXJhY3RlckNvdW50OjAsbm9uQmFzaWNBc2NpaUNoYXJhY3RlckNvdW50OjB9fWFzeW5jICRmaW5kU2VjdGlvbkhlYWRlcnModCxuKXtjb25zdCByPXRoaXMuX2dldE1vZGVsKHQpO3JldHVybiByP3ljKHIsbik6W119YXN5bmMgJGNvbXB1dGVEaWZmKHQsbixyLGkpe2NvbnN0IHM9dGhpcy5fZ2V0TW9kZWwodCksYT10aGlzLl9nZXRNb2RlbChuKTtyZXR1cm4hc3x8IWE/bnVsbDpBbi5jb21wdXRlRGlmZihzLGEscixpKX1zdGF0aWMgY29tcHV0ZURpZmYodCxuLHIsaSl7Y29uc3Qgcz1pPT09ImFkdmFuY2VkIj9vYS5nZXREZWZhdWx0KCk6b2EuZ2V0TGVnYWN5KCksYT10LmdldExpbmVzQ29udGVudCgpLGw9bi5nZXRMaW5lc0NvbnRlbnQoKSxvPXMuY29tcHV0ZURpZmYoYSxsLHIpLHU9by5jaGFuZ2VzLmxlbmd0aD4wPyExOnRoaXMuX21vZGVsc0FyZUlkZW50aWNhbCh0LG4pO2Z1bmN0aW9uIGgoZil7cmV0dXJuIGYubWFwKGQ9Pnt2YXIgbTtyZXR1cm5bZC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIsZC5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLGQubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLGQubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSwobT1kLmlubmVyQ2hhbmdlcyk9PW51bGw/dm9pZCAwOm0ubWFwKGc9PltnLm9yaWdpbmFsUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLGcub3JpZ2luYWxSYW5nZS5zdGFydENvbHVtbixnLm9yaWdpbmFsUmFuZ2UuZW5kTGluZU51bWJlcixnLm9yaWdpbmFsUmFuZ2UuZW5kQ29sdW1uLGcubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXIsZy5tb2RpZmllZFJhbmdlLnN0YXJ0Q29sdW1uLGcubW9kaWZpZWRSYW5nZS5lbmRMaW5lTnVtYmVyLGcubW9kaWZpZWRSYW5nZS5lbmRDb2x1bW5dKV19KX1yZXR1cm57aWRlbnRpY2FsOnUscXVpdEVhcmx5Om8uaGl0VGltZW91dCxjaGFuZ2VzOmgoby5jaGFuZ2VzKSxtb3ZlczpvLm1vdmVzLm1hcChmPT5bZi5saW5lUmFuZ2VNYXBwaW5nLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcixmLmxpbmVSYW5nZU1hcHBpbmcub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxmLmxpbmVSYW5nZU1hcHBpbmcubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLGYubGluZVJhbmdlTWFwcGluZy5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLGgoZi5jaGFuZ2VzKV0pfX1zdGF0aWMgX21vZGVsc0FyZUlkZW50aWNhbCh0LG4pe2NvbnN0IHI9dC5nZXRMaW5lQ291bnQoKSxpPW4uZ2V0TGluZUNvdW50KCk7aWYociE9PWkpcmV0dXJuITE7Zm9yKGxldCBzPTE7czw9cjtzKyspe2NvbnN0IGE9dC5nZXRMaW5lQ29udGVudChzKSxsPW4uZ2V0TGluZUNvbnRlbnQocyk7aWYoYSE9PWwpcmV0dXJuITF9cmV0dXJuITB9YXN5bmMgJGNvbXB1dGVNb3JlTWluaW1hbEVkaXRzKHQsbixyKXtjb25zdCBpPXRoaXMuX2dldE1vZGVsKHQpO2lmKCFpKXJldHVybiBuO2NvbnN0IHM9W107bGV0IGE7bj1uLnNsaWNlKDApLnNvcnQoKG8sdSk9PntpZihvLnJhbmdlJiZ1LnJhbmdlKXJldHVybiB6LmNvbXBhcmVSYW5nZXNVc2luZ1N0YXJ0cyhvLnJhbmdlLHUucmFuZ2UpO2NvbnN0IGg9by5yYW5nZT8wOjEsZj11LnJhbmdlPzA6MTtyZXR1cm4gaC1mfSk7bGV0IGw9MDtmb3IobGV0IG89MTtvPG4ubGVuZ3RoO28rKyl6LmdldEVuZFBvc2l0aW9uKG5bbF0ucmFuZ2UpLmVxdWFscyh6LmdldFN0YXJ0UG9zaXRpb24obltvXS5yYW5nZSkpPyhuW2xdLnJhbmdlPXouZnJvbVBvc2l0aW9ucyh6LmdldFN0YXJ0UG9zaXRpb24obltsXS5yYW5nZSksei5nZXRFbmRQb3NpdGlvbihuW29dLnJhbmdlKSksbltsXS50ZXh0Kz1uW29dLnRleHQpOihsKyssbltsXT1uW29dKTtuLmxlbmd0aD1sKzE7Zm9yKGxldHtyYW5nZTpvLHRleHQ6dSxlb2w6aH1vZiBuKXtpZih0eXBlb2YgaD09Im51bWJlciImJihhPWgpLHouaXNFbXB0eShvKSYmIXUpY29udGludWU7Y29uc3QgZj1pLmdldFZhbHVlSW5SYW5nZShvKTtpZih1PXUucmVwbGFjZSgvXHJcbnxcbnxcci9nLGkuZW9sKSxmPT09dSljb250aW51ZTtpZihNYXRoLm1heCh1Lmxlbmd0aCxmLmxlbmd0aCk+QW4uX2RpZmZMaW1pdCl7cy5wdXNoKHtyYW5nZTpvLHRleHQ6dX0pO2NvbnRpbnVlfWNvbnN0IGQ9cnUoZix1LHIpLG09aS5vZmZzZXRBdCh6LmxpZnQobykuZ2V0U3RhcnRQb3NpdGlvbigpKTtmb3IoY29uc3QgZyBvZiBkKXtjb25zdCBwPWkucG9zaXRpb25BdChtK2cub3JpZ2luYWxTdGFydCkseD1pLnBvc2l0aW9uQXQobStnLm9yaWdpbmFsU3RhcnQrZy5vcmlnaW5hbExlbmd0aCksdz17dGV4dDp1LnN1YnN0cihnLm1vZGlmaWVkU3RhcnQsZy5tb2RpZmllZExlbmd0aCkscmFuZ2U6e3N0YXJ0TGluZU51bWJlcjpwLmxpbmVOdW1iZXIsc3RhcnRDb2x1bW46cC5jb2x1bW4sZW5kTGluZU51bWJlcjp4LmxpbmVOdW1iZXIsZW5kQ29sdW1uOnguY29sdW1ufX07aS5nZXRWYWx1ZUluUmFuZ2Uody5yYW5nZSkhPT13LnRleHQmJnMucHVzaCh3KX19cmV0dXJuIHR5cGVvZiBhPT0ibnVtYmVyIiYmcy5wdXNoKHtlb2w6YSx0ZXh0OiIiLHJhbmdlOntzdGFydExpbmVOdW1iZXI6MCxzdGFydENvbHVtbjowLGVuZExpbmVOdW1iZXI6MCxlbmRDb2x1bW46MH19KSxzfWFzeW5jICRjb21wdXRlTGlua3ModCl7Y29uc3Qgbj10aGlzLl9nZXRNb2RlbCh0KTtyZXR1cm4gbj9sdShuKTpudWxsfWFzeW5jICRjb21wdXRlRGVmYXVsdERvY3VtZW50Q29sb3JzKHQpe2NvbnN0IG49dGhpcy5fZ2V0TW9kZWwodCk7cmV0dXJuIG4/dmMobik6bnVsbH1hc3luYyAkdGV4dHVhbFN1Z2dlc3QodCxuLHIsaSl7Y29uc3Qgcz1uZXcgbG4sYT1uZXcgUmVnRXhwKHIsaSksbD1uZXcgU2V0O2U6Zm9yKGNvbnN0IG8gb2YgdCl7Y29uc3QgdT10aGlzLl9nZXRNb2RlbChvKTtpZih1KXtmb3IoY29uc3QgaCBvZiB1LndvcmRzKGEpKWlmKCEoaD09PW58fCFpc05hTihOdW1iZXIoaCkpKSYmKGwuYWRkKGgpLGwuc2l6ZT5Bbi5fc3VnZ2VzdGlvbnNMaW1pdCkpYnJlYWsgZX19cmV0dXJue3dvcmRzOkFycmF5LmZyb20obCksZHVyYXRpb246cy5lbGFwc2VkKCl9fWFzeW5jICRjb21wdXRlV29yZFJhbmdlcyh0LG4scixpKXtjb25zdCBzPXRoaXMuX2dldE1vZGVsKHQpO2lmKCFzKXJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO2NvbnN0IGE9bmV3IFJlZ0V4cChyLGkpLGw9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IG89bi5zdGFydExpbmVOdW1iZXI7bzxuLmVuZExpbmVOdW1iZXI7bysrKXtjb25zdCB1PXMuZ2V0TGluZVdvcmRzKG8sYSk7Zm9yKGNvbnN0IGggb2YgdSl7aWYoIWlzTmFOKE51bWJlcihoLndvcmQpKSljb250aW51ZTtsZXQgZj1sW2gud29yZF07Znx8KGY9W10sbFtoLndvcmRdPWYpLGYucHVzaCh7c3RhcnRMaW5lTnVtYmVyOm8sc3RhcnRDb2x1bW46aC5zdGFydENvbHVtbixlbmRMaW5lTnVtYmVyOm8sZW5kQ29sdW1uOmguZW5kQ29sdW1ufSl9fXJldHVybiBsfWFzeW5jICRuYXZpZ2F0ZVZhbHVlU2V0KHQsbixyLGkscyl7Y29uc3QgYT10aGlzLl9nZXRNb2RlbCh0KTtpZighYSlyZXR1cm4gbnVsbDtjb25zdCBsPW5ldyBSZWdFeHAoaSxzKTtuLnN0YXJ0Q29sdW1uPT09bi5lbmRDb2x1bW4mJihuPXtzdGFydExpbmVOdW1iZXI6bi5zdGFydExpbmVOdW1iZXIsc3RhcnRDb2x1bW46bi5zdGFydENvbHVtbixlbmRMaW5lTnVtYmVyOm4uZW5kTGluZU51bWJlcixlbmRDb2x1bW46bi5lbmRDb2x1bW4rMX0pO2NvbnN0IG89YS5nZXRWYWx1ZUluUmFuZ2UobiksdT1hLmdldFdvcmRBdFBvc2l0aW9uKHtsaW5lTnVtYmVyOm4uc3RhcnRMaW5lTnVtYmVyLGNvbHVtbjpuLnN0YXJ0Q29sdW1ufSxsKTtpZighdSlyZXR1cm4gbnVsbDtjb25zdCBoPWEuZ2V0VmFsdWVJblJhbmdlKHUpO3JldHVybiBjci5JTlNUQU5DRS5uYXZpZ2F0ZVZhbHVlU2V0KG4sbyx1LGgscil9fTtCbi5fZGlmZkxpbWl0PTFlNSxCbi5fc3VnZ2VzdGlvbnNMaW1pdD0xZTQ7bGV0IEVyPUJuO2NsYXNzIEFuIGV4dGVuZHMgRXJ7Y29uc3RydWN0b3IodCxuKXtzdXBlcigpLHRoaXMuX2hvc3Q9dCx0aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeT1uLHRoaXMuX2ZvcmVpZ25Nb2R1bGU9bnVsbH1hc3luYyAkcGluZygpe3JldHVybiJwb25nIn0kbG9hZEZvcmVpZ25Nb2R1bGUodCxuLHIpe2NvbnN0IGE9e2hvc3Q6U3UociwobCxvKT0+dGhpcy5faG9zdC4kZmhyKGwsbykpLGdldE1pcnJvck1vZGVsczooKT0+dGhpcy5fZ2V0TW9kZWxzKCl9O3JldHVybiB0aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeT8odGhpcy5fZm9yZWlnbk1vZHVsZT10aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeShhLG4pLFByb21pc2UucmVzb2x2ZShJcyh0aGlzLl9mb3JlaWduTW9kdWxlKSkpOm5ldyBQcm9taXNlKChsLG8pPT57Y29uc3QgdT1oPT57dGhpcy5fZm9yZWlnbk1vZHVsZT1oLmNyZWF0ZShhLG4pLGwoSXModGhpcy5fZm9yZWlnbk1vZHVsZSkpfTtpbXBvcnQoYCR7eWkuYXNCcm93c2VyVXJpKGAke3R9LmpzYCkudG9TdHJpbmcoITApfWApLnRoZW4odSkuY2F0Y2gobyl9KX0kZm1yKHQsbil7aWYoIXRoaXMuX2ZvcmVpZ25Nb2R1bGV8fHR5cGVvZiB0aGlzLl9mb3JlaWduTW9kdWxlW3RdIT0iZnVuY3Rpb24iKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIk1pc3NpbmcgcmVxdWVzdEhhbmRsZXIgb3IgbWV0aG9kOiAiK3QpKTt0cnl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9mb3JlaWduTW9kdWxlW3RdLmFwcGx5KHRoaXMuX2ZvcmVpZ25Nb2R1bGUsbikpfWNhdGNoKHIpe3JldHVybiBQcm9taXNlLnJlamVjdChyKX19fXR5cGVvZiBpbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iJiYoZ2xvYmFsVGhpcy5tb25hY289eHUoKSk7bGV0IE1yPSExO2Z1bmN0aW9uIGdhKGUpe2lmKE1yKXJldHVybjtNcj0hMDtjb25zdCB0PW5ldyB0dShuPT57Z2xvYmFsVGhpcy5wb3N0TWVzc2FnZShuKX0sbj0+bmV3IEFuKHhyLmdldENoYW5uZWwobiksZSkpO2dsb2JhbFRoaXMub25tZXNzYWdlPW49Pnt0Lm9ubWVzc2FnZShuLmRhdGEpfX1nbG9iYWxUaGlzLm9ubWVzc2FnZT1lPT57TXJ8fGdhKG51bGwpfTsvKiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVmVyc2lvbjogMC41Mi4yKDQwNDU0NWJkZWQxZGY2ZmZhNDFlYTBhZjRlOGRkYjIxOTAxOGM2YzEpCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L21vbmFjby1lZGl0b3IvYmxvYi9tYWluL0xJQ0VOU0UudHh0CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL2Z1bmN0aW9uIENyKGUsdD0hMSl7Y29uc3Qgbj1lLmxlbmd0aDtsZXQgcj0wLGk9IiIscz0wLGE9MTYsbD0wLG89MCx1PTAsaD0wLGY9MDtmdW5jdGlvbiBkKHYseSl7bGV0IGI9MCxfPTA7Zm9yKDtiPHY7KXtsZXQgQT1lLmNoYXJDb2RlQXQocik7aWYoQT49NDgmJkE8PTU3KV89XyoxNitBLTQ4O2Vsc2UgaWYoQT49NjUmJkE8PTcwKV89XyoxNitBLTY1KzEwO2Vsc2UgaWYoQT49OTcmJkE8PTEwMilfPV8qMTYrQS05NysxMDtlbHNlIGJyZWFrO3IrKyxiKyt9cmV0dXJuIGI8diYmKF89LTEpLF99ZnVuY3Rpb24gbSh2KXtyPXYsaT0iIixzPTAsYT0xNixmPTB9ZnVuY3Rpb24gZygpe2xldCB2PXI7aWYoZS5jaGFyQ29kZUF0KHIpPT09NDgpcisrO2Vsc2UgZm9yKHIrKztyPGUubGVuZ3RoJiZTdChlLmNoYXJDb2RlQXQocikpOylyKys7aWYocjxlLmxlbmd0aCYmZS5jaGFyQ29kZUF0KHIpPT09NDYpaWYocisrLHI8ZS5sZW5ndGgmJlN0KGUuY2hhckNvZGVBdChyKSkpZm9yKHIrKztyPGUubGVuZ3RoJiZTdChlLmNoYXJDb2RlQXQocikpOylyKys7ZWxzZSByZXR1cm4gZj0zLGUuc3Vic3RyaW5nKHYscik7bGV0IHk9cjtpZihyPGUubGVuZ3RoJiYoZS5jaGFyQ29kZUF0KHIpPT09Njl8fGUuY2hhckNvZGVBdChyKT09PTEwMSkpaWYocisrLChyPGUubGVuZ3RoJiZlLmNoYXJDb2RlQXQocik9PT00M3x8ZS5jaGFyQ29kZUF0KHIpPT09NDUpJiZyKysscjxlLmxlbmd0aCYmU3QoZS5jaGFyQ29kZUF0KHIpKSl7Zm9yKHIrKztyPGUubGVuZ3RoJiZTdChlLmNoYXJDb2RlQXQocikpOylyKys7eT1yfWVsc2UgZj0zO3JldHVybiBlLnN1YnN0cmluZyh2LHkpfWZ1bmN0aW9uIHAoKXtsZXQgdj0iIix5PXI7Zm9yKDs7KXtpZihyPj1uKXt2Kz1lLnN1YnN0cmluZyh5LHIpLGY9MjticmVha31jb25zdCBiPWUuY2hhckNvZGVBdChyKTtpZihiPT09MzQpe3YrPWUuc3Vic3RyaW5nKHkscikscisrO2JyZWFrfWlmKGI9PT05Mil7aWYodis9ZS5zdWJzdHJpbmcoeSxyKSxyKysscj49bil7Zj0yO2JyZWFrfXN3aXRjaChlLmNoYXJDb2RlQXQocisrKSl7Y2FzZSAzNDp2Kz0nIic7YnJlYWs7Y2FzZSA5Mjp2Kz0iXFwiO2JyZWFrO2Nhc2UgNDc6dis9Ii8iO2JyZWFrO2Nhc2UgOTg6dis9IlxiIjticmVhaztjYXNlIDEwMjp2Kz0iXGYiO2JyZWFrO2Nhc2UgMTEwOnYrPWAKYDticmVhaztjYXNlIDExNDp2Kz0iXHIiO2JyZWFrO2Nhc2UgMTE2OnYrPSIJIjticmVhaztjYXNlIDExNzpjb25zdCBBPWQoNCk7QT49MD92Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKEEpOmY9NDticmVhaztkZWZhdWx0OmY9NX15PXI7Y29udGludWV9aWYoYj49MCYmYjw9MzEpaWYoWHQoYikpe3YrPWUuc3Vic3RyaW5nKHksciksZj0yO2JyZWFrfWVsc2UgZj02O3IrK31yZXR1cm4gdn1mdW5jdGlvbiB4KCl7aWYoaT0iIixmPTAscz1yLG89bCxoPXUscj49bilyZXR1cm4gcz1uLGE9MTc7bGV0IHY9ZS5jaGFyQ29kZUF0KHIpO2lmKFRyKHYpKXtkbyByKyssaSs9U3RyaW5nLmZyb21DaGFyQ29kZSh2KSx2PWUuY2hhckNvZGVBdChyKTt3aGlsZShUcih2KSk7cmV0dXJuIGE9MTV9aWYoWHQodikpcmV0dXJuIHIrKyxpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHYpLHY9PT0xMyYmZS5jaGFyQ29kZUF0KHIpPT09MTAmJihyKyssaSs9YApgKSxsKyssdT1yLGE9MTQ7c3dpdGNoKHYpe2Nhc2UgMTIzOnJldHVybiByKyssYT0xO2Nhc2UgMTI1OnJldHVybiByKyssYT0yO2Nhc2UgOTE6cmV0dXJuIHIrKyxhPTM7Y2FzZSA5MzpyZXR1cm4gcisrLGE9NDtjYXNlIDU4OnJldHVybiByKyssYT02O2Nhc2UgNDQ6cmV0dXJuIHIrKyxhPTU7Y2FzZSAzNDpyZXR1cm4gcisrLGk9cCgpLGE9MTA7Y2FzZSA0Nzpjb25zdCB5PXItMTtpZihlLmNoYXJDb2RlQXQocisxKT09PTQ3KXtmb3Iocis9MjtyPG4mJiFYdChlLmNoYXJDb2RlQXQocikpOylyKys7cmV0dXJuIGk9ZS5zdWJzdHJpbmcoeSxyKSxhPTEyfWlmKGUuY2hhckNvZGVBdChyKzEpPT09NDIpe3IrPTI7Y29uc3QgYj1uLTE7bGV0IF89ITE7Zm9yKDtyPGI7KXtjb25zdCBBPWUuY2hhckNvZGVBdChyKTtpZihBPT09NDImJmUuY2hhckNvZGVBdChyKzEpPT09NDcpe3IrPTIsXz0hMDticmVha31yKyssWHQoQSkmJihBPT09MTMmJmUuY2hhckNvZGVBdChyKT09PTEwJiZyKyssbCsrLHU9cil9cmV0dXJuIF98fChyKyssZj0xKSxpPWUuc3Vic3RyaW5nKHksciksYT0xM31yZXR1cm4gaSs9U3RyaW5nLmZyb21DaGFyQ29kZSh2KSxyKyssYT0xNjtjYXNlIDQ1OmlmKGkrPVN0cmluZy5mcm9tQ2hhckNvZGUodikscisrLHI9PT1ufHwhU3QoZS5jaGFyQ29kZUF0KHIpKSlyZXR1cm4gYT0xNjtjYXNlIDQ4OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDUxOmNhc2UgNTI6Y2FzZSA1MzpjYXNlIDU0OmNhc2UgNTU6Y2FzZSA1NjpjYXNlIDU3OnJldHVybiBpKz1nKCksYT0xMTtkZWZhdWx0OmZvcig7cjxuJiZ3KHYpOylyKyssdj1lLmNoYXJDb2RlQXQocik7aWYocyE9PXIpe3N3aXRjaChpPWUuc3Vic3RyaW5nKHMsciksaSl7Y2FzZSJ0cnVlIjpyZXR1cm4gYT04O2Nhc2UiZmFsc2UiOnJldHVybiBhPTk7Y2FzZSJudWxsIjpyZXR1cm4gYT03fXJldHVybiBhPTE2fXJldHVybiBpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHYpLHIrKyxhPTE2fX1mdW5jdGlvbiB3KHYpe2lmKFRyKHYpfHxYdCh2KSlyZXR1cm4hMTtzd2l0Y2godil7Y2FzZSAxMjU6Y2FzZSA5MzpjYXNlIDEyMzpjYXNlIDkxOmNhc2UgMzQ6Y2FzZSA1ODpjYXNlIDQ0OmNhc2UgNDc6cmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gTCgpe2xldCB2O2RvIHY9eCgpO3doaWxlKHY+PTEyJiZ2PD0xNSk7cmV0dXJuIHZ9cmV0dXJue3NldFBvc2l0aW9uOm0sZ2V0UG9zaXRpb246KCk9PnIsc2Nhbjp0P0w6eCxnZXRUb2tlbjooKT0+YSxnZXRUb2tlblZhbHVlOigpPT5pLGdldFRva2VuT2Zmc2V0OigpPT5zLGdldFRva2VuTGVuZ3RoOigpPT5yLXMsZ2V0VG9rZW5TdGFydExpbmU6KCk9Pm8sZ2V0VG9rZW5TdGFydENoYXJhY3RlcjooKT0+cy1oLGdldFRva2VuRXJyb3I6KCk9PmZ9fWZ1bmN0aW9uIFRyKGUpe3JldHVybiBlPT09MzJ8fGU9PT05fWZ1bmN0aW9uIFh0KGUpe3JldHVybiBlPT09MTB8fGU9PT0xM31mdW5jdGlvbiBTdChlKXtyZXR1cm4gZT49NDgmJmU8PTU3fXZhciBwYTsoZnVuY3Rpb24oZSl7ZVtlLmxpbmVGZWVkPTEwXT0ibGluZUZlZWQiLGVbZS5jYXJyaWFnZVJldHVybj0xM109ImNhcnJpYWdlUmV0dXJuIixlW2Uuc3BhY2U9MzJdPSJzcGFjZSIsZVtlLl8wPTQ4XT0iXzAiLGVbZS5fMT00OV09Il8xIixlW2UuXzI9NTBdPSJfMiIsZVtlLl8zPTUxXT0iXzMiLGVbZS5fND01Ml09Il80IixlW2UuXzU9NTNdPSJfNSIsZVtlLl82PTU0XT0iXzYiLGVbZS5fNz01NV09Il83IixlW2UuXzg9NTZdPSJfOCIsZVtlLl85PTU3XT0iXzkiLGVbZS5hPTk3XT0iYSIsZVtlLmI9OThdPSJiIixlW2UuYz05OV09ImMiLGVbZS5kPTEwMF09ImQiLGVbZS5lPTEwMV09ImUiLGVbZS5mPTEwMl09ImYiLGVbZS5nPTEwM109ImciLGVbZS5oPTEwNF09ImgiLGVbZS5pPTEwNV09ImkiLGVbZS5qPTEwNl09ImoiLGVbZS5rPTEwN109ImsiLGVbZS5sPTEwOF09ImwiLGVbZS5tPTEwOV09Im0iLGVbZS5uPTExMF09Im4iLGVbZS5vPTExMV09Im8iLGVbZS5wPTExMl09InAiLGVbZS5xPTExM109InEiLGVbZS5yPTExNF09InIiLGVbZS5zPTExNV09InMiLGVbZS50PTExNl09InQiLGVbZS51PTExN109InUiLGVbZS52PTExOF09InYiLGVbZS53PTExOV09InciLGVbZS54PTEyMF09IngiLGVbZS55PTEyMV09InkiLGVbZS56PTEyMl09InoiLGVbZS5BPTY1XT0iQSIsZVtlLkI9NjZdPSJCIixlW2UuQz02N109IkMiLGVbZS5EPTY4XT0iRCIsZVtlLkU9NjldPSJFIixlW2UuRj03MF09IkYiLGVbZS5HPTcxXT0iRyIsZVtlLkg9NzJdPSJIIixlW2UuST03M109IkkiLGVbZS5KPTc0XT0iSiIsZVtlLks9NzVdPSJLIixlW2UuTD03Nl09IkwiLGVbZS5NPTc3XT0iTSIsZVtlLk49NzhdPSJOIixlW2UuTz03OV09Ik8iLGVbZS5QPTgwXT0iUCIsZVtlLlE9ODFdPSJRIixlW2UuUj04Ml09IlIiLGVbZS5TPTgzXT0iUyIsZVtlLlQ9ODRdPSJUIixlW2UuVT04NV09IlUiLGVbZS5WPTg2XT0iViIsZVtlLlc9ODddPSJXIixlW2UuWD04OF09IlgiLGVbZS5ZPTg5XT0iWSIsZVtlLlo9OTBdPSJaIixlW2UuYXN0ZXJpc2s9NDJdPSJhc3RlcmlzayIsZVtlLmJhY2tzbGFzaD05Ml09ImJhY2tzbGFzaCIsZVtlLmNsb3NlQnJhY2U9MTI1XT0iY2xvc2VCcmFjZSIsZVtlLmNsb3NlQnJhY2tldD05M109ImNsb3NlQnJhY2tldCIsZVtlLmNvbG9uPTU4XT0iY29sb24iLGVbZS5jb21tYT00NF09ImNvbW1hIixlW2UuZG90PTQ2XT0iZG90IixlW2UuZG91YmxlUXVvdGU9MzRdPSJkb3VibGVRdW90ZSIsZVtlLm1pbnVzPTQ1XT0ibWludXMiLGVbZS5vcGVuQnJhY2U9MTIzXT0ib3BlbkJyYWNlIixlW2Uub3BlbkJyYWNrZXQ9OTFdPSJvcGVuQnJhY2tldCIsZVtlLnBsdXM9NDNdPSJwbHVzIixlW2Uuc2xhc2g9NDddPSJzbGFzaCIsZVtlLmZvcm1GZWVkPTEyXT0iZm9ybUZlZWQiLGVbZS50YWI9OV09InRhYiJ9KShwYXx8KHBhPXt9KSk7dmFyIFNlPW5ldyBBcnJheSgyMCkuZmlsbCgwKS5tYXAoKGUsdCk9PiIgIi5yZXBlYXQodCkpLEF0PTIwMCxiYT17IiAiOnsiXG4iOm5ldyBBcnJheShBdCkuZmlsbCgwKS5tYXAoKGUsdCk9PmAKYCsiICIucmVwZWF0KHQpKSwiXHIiOm5ldyBBcnJheShBdCkuZmlsbCgwKS5tYXAoKGUsdCk9PiJcciIrIiAiLnJlcGVhdCh0KSksIlxyXG4iOm5ldyBBcnJheShBdCkuZmlsbCgwKS5tYXAoKGUsdCk9PmBccgpgKyIgIi5yZXBlYXQodCkpfSwiCSI6eyJcbiI6bmV3IEFycmF5KEF0KS5maWxsKDApLm1hcCgoZSx0KT0+YApgKyIJIi5yZXBlYXQodCkpLCJcciI6bmV3IEFycmF5KEF0KS5maWxsKDApLm1hcCgoZSx0KT0+IlxyIisiCSIucmVwZWF0KHQpKSwiXHJcbiI6bmV3IEFycmF5KEF0KS5maWxsKDApLm1hcCgoZSx0KT0+YFxyCmArIgkiLnJlcGVhdCh0KSl9fSxFYz1bYApgLCJcciIsYFxyCmBdO2Z1bmN0aW9uIE1jKGUsdCxuKXtsZXQgcixpLHMsYSxsO2lmKHQpe2ZvcihhPXQub2Zmc2V0LGw9YSt0Lmxlbmd0aCxzPWE7cz4wJiYhdmEoZSxzLTEpOylzLS07bGV0IGI9bDtmb3IoO2I8ZS5sZW5ndGgmJiF2YShlLGIpOyliKys7aT1lLnN1YnN0cmluZyhzLGIpLHI9Q2MoaSxuKX1lbHNlIGk9ZSxyPTAscz0wLGE9MCxsPWUubGVuZ3RoO2NvbnN0IG89VGMobixlKSx1PUVjLmluY2x1ZGVzKG8pO2xldCBoPTAsZj0wLGQ7bi5pbnNlcnRTcGFjZXM/ZD1TZVtuLnRhYlNpemV8fDRdPz9rdChTZVsxXSxuLnRhYlNpemV8fDQpOmQ9IgkiO2NvbnN0IG09ZD09PSIJIj8iCSI6IiAiO2xldCBnPUNyKGksITEpLHA9ITE7ZnVuY3Rpb24geCgpe2lmKGg+MSlyZXR1cm4ga3QobyxoKStrdChkLHIrZik7Y29uc3QgYj1kLmxlbmd0aCoocitmKTtyZXR1cm4hdXx8Yj5iYVttXVtvXS5sZW5ndGg/bytrdChkLHIrZik6Yjw9MD9vOmJhW21dW29dW2JdfWZ1bmN0aW9uIHcoKXtsZXQgYj1nLnNjYW4oKTtmb3IoaD0wO2I9PT0xNXx8Yj09PTE0OyliPT09MTQmJm4ua2VlcExpbmVzP2grPTE6Yj09PTE0JiYoaD0xKSxiPWcuc2NhbigpO3JldHVybiBwPWI9PT0xNnx8Zy5nZXRUb2tlbkVycm9yKCkhPT0wLGJ9Y29uc3QgTD1bXTtmdW5jdGlvbiB2KGIsXyxBKXshcCYmKCF0fHxfPGwmJkE+YSkmJmUuc3Vic3RyaW5nKF8sQSkhPT1iJiZMLnB1c2goe29mZnNldDpfLGxlbmd0aDpBLV8sY29udGVudDpifSl9bGV0IHk9dygpO2lmKG4ua2VlcExpbmVzJiZoPjAmJnYoa3QobyxoKSwwLDApLHkhPT0xNyl7bGV0IGI9Zy5nZXRUb2tlbk9mZnNldCgpK3MsXz1kLmxlbmd0aCpyPDIwJiZuLmluc2VydFNwYWNlcz9TZVtkLmxlbmd0aCpyXTprdChkLHIpO3YoXyxzLGIpfWZvcig7eSE9PTE3Oyl7bGV0IGI9Zy5nZXRUb2tlbk9mZnNldCgpK2cuZ2V0VG9rZW5MZW5ndGgoKStzLF89dygpLEE9IiIsQz0hMTtmb3IoO2g9PT0wJiYoXz09PTEyfHxfPT09MTMpOyl7bGV0IE89Zy5nZXRUb2tlbk9mZnNldCgpK3M7dihTZVsxXSxiLE8pLGI9Zy5nZXRUb2tlbk9mZnNldCgpK2cuZ2V0VG9rZW5MZW5ndGgoKStzLEM9Xz09PTEyLEE9Qz94KCk6IiIsXz13KCl9aWYoXz09PTIpeSE9PTEmJmYtLSxuLmtlZXBMaW5lcyYmaD4wfHwhbi5rZWVwTGluZXMmJnkhPT0xP0E9eCgpOm4ua2VlcExpbmVzJiYoQT1TZVsxXSk7ZWxzZSBpZihfPT09NCl5IT09MyYmZi0tLG4ua2VlcExpbmVzJiZoPjB8fCFuLmtlZXBMaW5lcyYmeSE9PTM/QT14KCk6bi5rZWVwTGluZXMmJihBPVNlWzFdKTtlbHNle3N3aXRjaCh5KXtjYXNlIDM6Y2FzZSAxOmYrKyxuLmtlZXBMaW5lcyYmaD4wfHwhbi5rZWVwTGluZXM/QT14KCk6QT1TZVsxXTticmVhaztjYXNlIDU6bi5rZWVwTGluZXMmJmg+MHx8IW4ua2VlcExpbmVzP0E9eCgpOkE9U2VbMV07YnJlYWs7Y2FzZSAxMjpBPXgoKTticmVhaztjYXNlIDEzOmg+MD9BPXgoKTpDfHwoQT1TZVsxXSk7YnJlYWs7Y2FzZSA2Om4ua2VlcExpbmVzJiZoPjA/QT14KCk6Q3x8KEE9U2VbMV0pO2JyZWFrO2Nhc2UgMTA6bi5rZWVwTGluZXMmJmg+MD9BPXgoKTpfPT09NiYmIUMmJihBPSIiKTticmVhaztjYXNlIDc6Y2FzZSA4OmNhc2UgOTpjYXNlIDExOmNhc2UgMjpjYXNlIDQ6bi5rZWVwTGluZXMmJmg+MD9BPXgoKTooXz09PTEyfHxfPT09MTMpJiYhQz9BPVNlWzFdOl8hPT01JiZfIT09MTcmJihwPSEwKTticmVhaztjYXNlIDE2OnA9ITA7YnJlYWt9aD4wJiYoXz09PTEyfHxfPT09MTMpJiYoQT14KCkpfV89PT0xNyYmKG4ua2VlcExpbmVzJiZoPjA/QT14KCk6QT1uLmluc2VydEZpbmFsTmV3bGluZT9vOiIiKTtjb25zdCBGPWcuZ2V0VG9rZW5PZmZzZXQoKStzO3YoQSxiLEYpLHk9X31yZXR1cm4gTH1mdW5jdGlvbiBrdChlLHQpe2xldCBuPSIiO2ZvcihsZXQgcj0wO3I8dDtyKyspbis9ZTtyZXR1cm4gbn1mdW5jdGlvbiBDYyhlLHQpe2xldCBuPTAscj0wO2NvbnN0IGk9dC50YWJTaXplfHw0O2Zvcig7bjxlLmxlbmd0aDspe2xldCBzPWUuY2hhckF0KG4pO2lmKHM9PT1TZVsxXSlyKys7ZWxzZSBpZihzPT09IgkiKXIrPWk7ZWxzZSBicmVhaztuKyt9cmV0dXJuIE1hdGguZmxvb3Ioci9pKX1mdW5jdGlvbiBUYyhlLHQpe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCByPXQuY2hhckF0KG4pO2lmKHI9PT0iXHIiKXJldHVybiBuKzE8dC5sZW5ndGgmJnQuY2hhckF0KG4rMSk9PT1gCmA/YFxyCmA6IlxyIjtpZihyPT09YApgKXJldHVybmAKYH1yZXR1cm4gZSYmZS5lb2x8fGAKYH1mdW5jdGlvbiB2YShlLHQpe3JldHVybmBccgpgLmluZGV4T2YoZS5jaGFyQXQodCkpIT09LTF9dmFyIGtuOyhmdW5jdGlvbihlKXtlLkRFRkFVTFQ9e2FsbG93VHJhaWxpbmdDb21tYTohMX19KShrbnx8KGtuPXt9KSk7ZnVuY3Rpb24gUGMoZSx0PVtdLG49a24uREVGQVVMVCl7bGV0IHI9bnVsbCxpPVtdO2NvbnN0IHM9W107ZnVuY3Rpb24gYShvKXtBcnJheS5pc0FycmF5KGkpP2kucHVzaChvKTpyIT09bnVsbCYmKGlbcl09byl9cmV0dXJuIEZjKGUse29uT2JqZWN0QmVnaW46KCk9Pntjb25zdCBvPXt9O2Eobykscy5wdXNoKGkpLGk9byxyPW51bGx9LG9uT2JqZWN0UHJvcGVydHk6bz0+e3I9b30sb25PYmplY3RFbmQ6KCk9PntpPXMucG9wKCl9LG9uQXJyYXlCZWdpbjooKT0+e2NvbnN0IG89W107YShvKSxzLnB1c2goaSksaT1vLHI9bnVsbH0sb25BcnJheUVuZDooKT0+e2k9cy5wb3AoKX0sb25MaXRlcmFsVmFsdWU6YSxvbkVycm9yOihvLHUsaCk9Pnt0LnB1c2goe2Vycm9yOm8sb2Zmc2V0OnUsbGVuZ3RoOmh9KX19LG4pLGlbMF19ZnVuY3Rpb24geGEoZSl7aWYoIWUucGFyZW50fHwhZS5wYXJlbnQuY2hpbGRyZW4pcmV0dXJuW107Y29uc3QgdD14YShlLnBhcmVudCk7aWYoZS5wYXJlbnQudHlwZT09PSJwcm9wZXJ0eSIpe2NvbnN0IG49ZS5wYXJlbnQuY2hpbGRyZW5bMF0udmFsdWU7dC5wdXNoKG4pfWVsc2UgaWYoZS5wYXJlbnQudHlwZT09PSJhcnJheSIpe2NvbnN0IG49ZS5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihlKTtuIT09LTEmJnQucHVzaChuKX1yZXR1cm4gdH1mdW5jdGlvbiBQcihlKXtzd2l0Y2goZS50eXBlKXtjYXNlImFycmF5IjpyZXR1cm4gZS5jaGlsZHJlbi5tYXAoUHIpO2Nhc2Uib2JqZWN0Ijpjb25zdCB0PU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGxldCBuIG9mIGUuY2hpbGRyZW4pe2NvbnN0IHI9bi5jaGlsZHJlblsxXTtyJiYodFtuLmNoaWxkcmVuWzBdLnZhbHVlXT1QcihyKSl9cmV0dXJuIHQ7Y2FzZSJudWxsIjpjYXNlInN0cmluZyI6Y2FzZSJudW1iZXIiOmNhc2UiYm9vbGVhbiI6cmV0dXJuIGUudmFsdWU7ZGVmYXVsdDpyZXR1cm59fWZ1bmN0aW9uIEljKGUsdCxuPSExKXtyZXR1cm4gdD49ZS5vZmZzZXQmJnQ8ZS5vZmZzZXQrZS5sZW5ndGh8fG4mJnQ9PT1lLm9mZnNldCtlLmxlbmd0aH1mdW5jdGlvbiB5YShlLHQsbj0hMSl7aWYoSWMoZSx0LG4pKXtjb25zdCByPWUuY2hpbGRyZW47aWYoQXJyYXkuaXNBcnJheShyKSlmb3IobGV0IGk9MDtpPHIubGVuZ3RoJiZyW2ldLm9mZnNldDw9dDtpKyspe2NvbnN0IHM9eWEocltpXSx0LG4pO2lmKHMpcmV0dXJuIHN9cmV0dXJuIGV9fWZ1bmN0aW9uIEZjKGUsdCxuPWtuLkRFRkFVTFQpe2NvbnN0IHI9Q3IoZSwhMSksaT1bXTtmdW5jdGlvbiBzKE4pe3JldHVybiBOPygpPT5OKHIuZ2V0VG9rZW5PZmZzZXQoKSxyLmdldFRva2VuTGVuZ3RoKCksci5nZXRUb2tlblN0YXJ0TGluZSgpLHIuZ2V0VG9rZW5TdGFydENoYXJhY3RlcigpKTooKT0+ITB9ZnVuY3Rpb24gYShOKXtyZXR1cm4gTj8oKT0+TihyLmdldFRva2VuT2Zmc2V0KCksci5nZXRUb2tlbkxlbmd0aCgpLHIuZ2V0VG9rZW5TdGFydExpbmUoKSxyLmdldFRva2VuU3RhcnRDaGFyYWN0ZXIoKSwoKT0+aS5zbGljZSgpKTooKT0+ITB9ZnVuY3Rpb24gbChOKXtyZXR1cm4gTj9rPT5OKGssci5nZXRUb2tlbk9mZnNldCgpLHIuZ2V0VG9rZW5MZW5ndGgoKSxyLmdldFRva2VuU3RhcnRMaW5lKCksci5nZXRUb2tlblN0YXJ0Q2hhcmFjdGVyKCkpOigpPT4hMH1mdW5jdGlvbiBvKE4pe3JldHVybiBOP2s9Pk4oayxyLmdldFRva2VuT2Zmc2V0KCksci5nZXRUb2tlbkxlbmd0aCgpLHIuZ2V0VG9rZW5TdGFydExpbmUoKSxyLmdldFRva2VuU3RhcnRDaGFyYWN0ZXIoKSwoKT0+aS5zbGljZSgpKTooKT0+ITB9Y29uc3QgdT1hKHQub25PYmplY3RCZWdpbiksaD1vKHQub25PYmplY3RQcm9wZXJ0eSksZj1zKHQub25PYmplY3RFbmQpLGQ9YSh0Lm9uQXJyYXlCZWdpbiksbT1zKHQub25BcnJheUVuZCksZz1vKHQub25MaXRlcmFsVmFsdWUpLHA9bCh0Lm9uU2VwYXJhdG9yKSx4PXModC5vbkNvbW1lbnQpLHc9bCh0Lm9uRXJyb3IpLEw9biYmbi5kaXNhbGxvd0NvbW1lbnRzLHY9biYmbi5hbGxvd1RyYWlsaW5nQ29tbWE7ZnVuY3Rpb24geSgpe2Zvcig7Oyl7Y29uc3QgTj1yLnNjYW4oKTtzd2l0Y2goci5nZXRUb2tlbkVycm9yKCkpe2Nhc2UgNDpiKDE0KTticmVhaztjYXNlIDU6YigxNSk7YnJlYWs7Y2FzZSAzOmIoMTMpO2JyZWFrO2Nhc2UgMTpMfHxiKDExKTticmVhaztjYXNlIDI6YigxMik7YnJlYWs7Y2FzZSA2OmIoMTYpO2JyZWFrfXN3aXRjaChOKXtjYXNlIDEyOmNhc2UgMTM6TD9iKDEwKTp4KCk7YnJlYWs7Y2FzZSAxNjpiKDEpO2JyZWFrO2Nhc2UgMTU6Y2FzZSAxNDpicmVhaztkZWZhdWx0OnJldHVybiBOfX19ZnVuY3Rpb24gYihOLGs9W10sUj1bXSl7aWYodyhOKSxrLmxlbmd0aCtSLmxlbmd0aD4wKXtsZXQgST1yLmdldFRva2VuKCk7Zm9yKDtJIT09MTc7KXtpZihrLmluZGV4T2YoSSkhPT0tMSl7eSgpO2JyZWFrfWVsc2UgaWYoUi5pbmRleE9mKEkpIT09LTEpYnJlYWs7ST15KCl9fX1mdW5jdGlvbiBfKE4pe2NvbnN0IGs9ci5nZXRUb2tlblZhbHVlKCk7cmV0dXJuIE4/ZyhrKTooaChrKSxpLnB1c2goaykpLHkoKSwhMH1mdW5jdGlvbiBBKCl7c3dpdGNoKHIuZ2V0VG9rZW4oKSl7Y2FzZSAxMTpjb25zdCBOPXIuZ2V0VG9rZW5WYWx1ZSgpO2xldCBrPU51bWJlcihOKTtpc05hTihrKSYmKGIoMiksaz0wKSxnKGspO2JyZWFrO2Nhc2UgNzpnKG51bGwpO2JyZWFrO2Nhc2UgODpnKCEwKTticmVhaztjYXNlIDk6ZyghMSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4hMX1yZXR1cm4geSgpLCEwfWZ1bmN0aW9uIEMoKXtyZXR1cm4gci5nZXRUb2tlbigpIT09MTA/KGIoMyxbXSxbMiw1XSksITEpOihfKCExKSxyLmdldFRva2VuKCk9PT02PyhwKCI6IikseSgpLE0oKXx8Yig0LFtdLFsyLDVdKSk6Yig1LFtdLFsyLDVdKSxpLnBvcCgpLCEwKX1mdW5jdGlvbiBGKCl7dSgpLHkoKTtsZXQgTj0hMTtmb3IoO3IuZ2V0VG9rZW4oKSE9PTImJnIuZ2V0VG9rZW4oKSE9PTE3Oyl7aWYoci5nZXRUb2tlbigpPT09NSl7aWYoTnx8Yig0LFtdLFtdKSxwKCIsIikseSgpLHIuZ2V0VG9rZW4oKT09PTImJnYpYnJlYWt9ZWxzZSBOJiZiKDYsW10sW10pO0MoKXx8Yig0LFtdLFsyLDVdKSxOPSEwfXJldHVybiBmKCksci5nZXRUb2tlbigpIT09Mj9iKDcsWzJdLFtdKTp5KCksITB9ZnVuY3Rpb24gTygpe2QoKSx5KCk7bGV0IE49ITAsaz0hMTtmb3IoO3IuZ2V0VG9rZW4oKSE9PTQmJnIuZ2V0VG9rZW4oKSE9PTE3Oyl7aWYoci5nZXRUb2tlbigpPT09NSl7aWYoa3x8Yig0LFtdLFtdKSxwKCIsIikseSgpLHIuZ2V0VG9rZW4oKT09PTQmJnYpYnJlYWt9ZWxzZSBrJiZiKDYsW10sW10pO04/KGkucHVzaCgwKSxOPSExKTppW2kubGVuZ3RoLTFdKyssTSgpfHxiKDQsW10sWzQsNV0pLGs9ITB9cmV0dXJuIG0oKSxOfHxpLnBvcCgpLHIuZ2V0VG9rZW4oKSE9PTQ/Yig4LFs0XSxbXSk6eSgpLCEwfWZ1bmN0aW9uIE0oKXtzd2l0Y2goci5nZXRUb2tlbigpKXtjYXNlIDM6cmV0dXJuIE8oKTtjYXNlIDE6cmV0dXJuIEYoKTtjYXNlIDEwOnJldHVybiBfKCEwKTtkZWZhdWx0OnJldHVybiBBKCl9fXJldHVybiB5KCksci5nZXRUb2tlbigpPT09MTc/bi5hbGxvd0VtcHR5Q29udGVudD8hMDooYig0LFtdLFtdKSwhMSk6TSgpPyhyLmdldFRva2VuKCkhPT0xNyYmYig5LFtdLFtdKSwhMCk6KGIoNCxbXSxbXSksITEpfXZhciBhdD1Dcix3YTsoZnVuY3Rpb24oZSl7ZVtlLk5vbmU9MF09Ik5vbmUiLGVbZS5VbmV4cGVjdGVkRW5kT2ZDb21tZW50PTFdPSJVbmV4cGVjdGVkRW5kT2ZDb21tZW50IixlW2UuVW5leHBlY3RlZEVuZE9mU3RyaW5nPTJdPSJVbmV4cGVjdGVkRW5kT2ZTdHJpbmciLGVbZS5VbmV4cGVjdGVkRW5kT2ZOdW1iZXI9M109IlVuZXhwZWN0ZWRFbmRPZk51bWJlciIsZVtlLkludmFsaWRVbmljb2RlPTRdPSJJbnZhbGlkVW5pY29kZSIsZVtlLkludmFsaWRFc2NhcGVDaGFyYWN0ZXI9NV09IkludmFsaWRFc2NhcGVDaGFyYWN0ZXIiLGVbZS5JbnZhbGlkQ2hhcmFjdGVyPTZdPSJJbnZhbGlkQ2hhcmFjdGVyIn0pKHdhfHwod2E9e30pKTt2YXIgX2E7KGZ1bmN0aW9uKGUpe2VbZS5PcGVuQnJhY2VUb2tlbj0xXT0iT3BlbkJyYWNlVG9rZW4iLGVbZS5DbG9zZUJyYWNlVG9rZW49Ml09IkNsb3NlQnJhY2VUb2tlbiIsZVtlLk9wZW5CcmFja2V0VG9rZW49M109Ik9wZW5CcmFja2V0VG9rZW4iLGVbZS5DbG9zZUJyYWNrZXRUb2tlbj00XT0iQ2xvc2VCcmFja2V0VG9rZW4iLGVbZS5Db21tYVRva2VuPTVdPSJDb21tYVRva2VuIixlW2UuQ29sb25Ub2tlbj02XT0iQ29sb25Ub2tlbiIsZVtlLk51bGxLZXl3b3JkPTddPSJOdWxsS2V5d29yZCIsZVtlLlRydWVLZXl3b3JkPThdPSJUcnVlS2V5d29yZCIsZVtlLkZhbHNlS2V5d29yZD05XT0iRmFsc2VLZXl3b3JkIixlW2UuU3RyaW5nTGl0ZXJhbD0xMF09IlN0cmluZ0xpdGVyYWwiLGVbZS5OdW1lcmljTGl0ZXJhbD0xMV09Ik51bWVyaWNMaXRlcmFsIixlW2UuTGluZUNvbW1lbnRUcml2aWE9MTJdPSJMaW5lQ29tbWVudFRyaXZpYSIsZVtlLkJsb2NrQ29tbWVudFRyaXZpYT0xM109IkJsb2NrQ29tbWVudFRyaXZpYSIsZVtlLkxpbmVCcmVha1RyaXZpYT0xNF09IkxpbmVCcmVha1RyaXZpYSIsZVtlLlRyaXZpYT0xNV09IlRyaXZpYSIsZVtlLlVua25vd249MTZdPSJVbmtub3duIixlW2UuRU9GPTE3XT0iRU9GIn0pKF9hfHwoX2E9e30pKTt2YXIgVmM9UGMsRGM9eWEsT2M9eGEsJGM9UHIsTGE7KGZ1bmN0aW9uKGUpe2VbZS5JbnZhbGlkU3ltYm9sPTFdPSJJbnZhbGlkU3ltYm9sIixlW2UuSW52YWxpZE51bWJlckZvcm1hdD0yXT0iSW52YWxpZE51bWJlckZvcm1hdCIsZVtlLlByb3BlcnR5TmFtZUV4cGVjdGVkPTNdPSJQcm9wZXJ0eU5hbWVFeHBlY3RlZCIsZVtlLlZhbHVlRXhwZWN0ZWQ9NF09IlZhbHVlRXhwZWN0ZWQiLGVbZS5Db2xvbkV4cGVjdGVkPTVdPSJDb2xvbkV4cGVjdGVkIixlW2UuQ29tbWFFeHBlY3RlZD02XT0iQ29tbWFFeHBlY3RlZCIsZVtlLkNsb3NlQnJhY2VFeHBlY3RlZD03XT0iQ2xvc2VCcmFjZUV4cGVjdGVkIixlW2UuQ2xvc2VCcmFja2V0RXhwZWN0ZWQ9OF09IkNsb3NlQnJhY2tldEV4cGVjdGVkIixlW2UuRW5kT2ZGaWxlRXhwZWN0ZWQ9OV09IkVuZE9mRmlsZUV4cGVjdGVkIixlW2UuSW52YWxpZENvbW1lbnRUb2tlbj0xMF09IkludmFsaWRDb21tZW50VG9rZW4iLGVbZS5VbmV4cGVjdGVkRW5kT2ZDb21tZW50PTExXT0iVW5leHBlY3RlZEVuZE9mQ29tbWVudCIsZVtlLlVuZXhwZWN0ZWRFbmRPZlN0cmluZz0xMl09IlVuZXhwZWN0ZWRFbmRPZlN0cmluZyIsZVtlLlVuZXhwZWN0ZWRFbmRPZk51bWJlcj0xM109IlVuZXhwZWN0ZWRFbmRPZk51bWJlciIsZVtlLkludmFsaWRVbmljb2RlPTE0XT0iSW52YWxpZFVuaWNvZGUiLGVbZS5JbnZhbGlkRXNjYXBlQ2hhcmFjdGVyPTE1XT0iSW52YWxpZEVzY2FwZUNoYXJhY3RlciIsZVtlLkludmFsaWRDaGFyYWN0ZXI9MTZdPSJJbnZhbGlkQ2hhcmFjdGVyIn0pKExhfHwoTGE9e30pKTtmdW5jdGlvbiBVYyhlLHQsbil7cmV0dXJuIE1jKGUsdCxuKX1mdW5jdGlvbiBSdChlLHQpe2lmKGU9PT10KXJldHVybiEwO2lmKGU9PW51bGx8fHQ9PT1udWxsfHx0PT09dm9pZCAwfHx0eXBlb2YgZSE9dHlwZW9mIHR8fHR5cGVvZiBlIT0ib2JqZWN0Inx8QXJyYXkuaXNBcnJheShlKSE9PUFycmF5LmlzQXJyYXkodCkpcmV0dXJuITE7bGV0IG4scjtpZihBcnJheS5pc0FycmF5KGUpKXtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspaWYoIVJ0KGVbbl0sdFtuXSkpcmV0dXJuITF9ZWxzZXtjb25zdCBpPVtdO2ZvcihyIGluIGUpaS5wdXNoKHIpO2kuc29ydCgpO2NvbnN0IHM9W107Zm9yKHIgaW4gdClzLnB1c2gocik7aWYocy5zb3J0KCksIVJ0KGkscykpcmV0dXJuITE7Zm9yKG49MDtuPGkubGVuZ3RoO24rKylpZighUnQoZVtpW25dXSx0W2lbbl1dKSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBoZShlKXtyZXR1cm4gdHlwZW9mIGU9PSJudW1iZXIifWZ1bmN0aW9uIEVlKGUpe3JldHVybiB0eXBlb2YgZTwidSJ9ZnVuY3Rpb24gVmUoZSl7cmV0dXJuIHR5cGVvZiBlPT0iYm9vbGVhbiJ9ZnVuY3Rpb24gTmEoZSl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIn1mdW5jdGlvbiBldChlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmIUFycmF5LmlzQXJyYXkoZSl9ZnVuY3Rpb24gQmMoZSx0KXtpZihlLmxlbmd0aDx0Lmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylpZihlW25dIT09dFtuXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBRdChlLHQpe2NvbnN0IG49ZS5sZW5ndGgtdC5sZW5ndGg7cmV0dXJuIG4+MD9lLmxhc3RJbmRleE9mKHQpPT09bjpuPT09MD9lPT09dDohMX1mdW5jdGlvbiBSbihlKXtsZXQgdD0iIjtCYyhlLCIoP2kpIikmJihlPWUuc3Vic3RyaW5nKDQpLHQ9ImkiKTt0cnl7cmV0dXJuIG5ldyBSZWdFeHAoZSx0KyJ1Iil9Y2F0Y2h7dHJ5e3JldHVybiBuZXcgUmVnRXhwKGUsdCl9Y2F0Y2h7cmV0dXJufX19ZnVuY3Rpb24gU2EoZSl7bGV0IHQ9MDtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7dCsrO2NvbnN0IHI9ZS5jaGFyQ29kZUF0KG4pOzU1Mjk2PD1yJiZyPD01NjMxOSYmbisrfXJldHVybiB0fXZhciBBYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtyZXR1cm4gdHlwZW9mIG49PSJzdHJpbmcifWUuaXM9dH0pKEFhfHwoQWE9e30pKTt2YXIgSXI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7cmV0dXJuIHR5cGVvZiBuPT0ic3RyaW5nIn1lLmlzPXR9KShJcnx8KElyPXt9KSk7dmFyIGthOyhmdW5jdGlvbihlKXtlLk1JTl9WQUxVRT0tMjE0NzQ4MzY0OCxlLk1BWF9WQUxVRT0yMTQ3NDgzNjQ3O2Z1bmN0aW9uIHQobil7cmV0dXJuIHR5cGVvZiBuPT0ibnVtYmVyIiYmZS5NSU5fVkFMVUU8PW4mJm48PWUuTUFYX1ZBTFVFfWUuaXM9dH0pKGthfHwoa2E9e30pKTt2YXIgRW47KGZ1bmN0aW9uKGUpe2UuTUlOX1ZBTFVFPTAsZS5NQVhfVkFMVUU9MjE0NzQ4MzY0NztmdW5jdGlvbiB0KG4pe3JldHVybiB0eXBlb2Ygbj09Im51bWJlciImJmUuTUlOX1ZBTFVFPD1uJiZuPD1lLk1BWF9WQUxVRX1lLmlzPXR9KShFbnx8KEVuPXt9KSk7dmFyIFo7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpKXtyZXR1cm4gcj09PU51bWJlci5NQVhfVkFMVUUmJihyPUVuLk1BWF9WQUxVRSksaT09PU51bWJlci5NQVhfVkFMVUUmJihpPUVuLk1BWF9WQUxVRSkse2xpbmU6cixjaGFyYWN0ZXI6aX19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmUy51aW50ZWdlcihpLmxpbmUpJiZTLnVpbnRlZ2VyKGkuY2hhcmFjdGVyKX1lLmlzPW59KShafHwoWj17fSkpO3ZhciBxOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSxzLGEpe2lmKFMudWludGVnZXIocikmJlMudWludGVnZXIoaSkmJlMudWludGVnZXIocykmJlMudWludGVnZXIoYSkpcmV0dXJue3N0YXJ0OlouY3JlYXRlKHIsaSksZW5kOlouY3JlYXRlKHMsYSl9O2lmKFouaXMocikmJlouaXMoaSkpcmV0dXJue3N0YXJ0OnIsZW5kOml9O3Rocm93IG5ldyBFcnJvcihgUmFuZ2UjY3JlYXRlIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnRzWyR7cn0sICR7aX0sICR7c30sICR7YX1dYCl9ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmWi5pcyhpLnN0YXJ0KSYmWi5pcyhpLmVuZCl9ZS5pcz1ufSkocXx8KHE9e30pKTt2YXIgRXQ7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpKXtyZXR1cm57dXJpOnIscmFuZ2U6aX19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmcS5pcyhpLnJhbmdlKSYmKFMuc3RyaW5nKGkudXJpKXx8Uy51bmRlZmluZWQoaS51cmkpKX1lLmlzPW59KShFdHx8KEV0PXt9KSk7dmFyIFJhOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSxzLGEpe3JldHVybnt0YXJnZXRVcmk6cix0YXJnZXRSYW5nZTppLHRhcmdldFNlbGVjdGlvblJhbmdlOnMsb3JpZ2luU2VsZWN0aW9uUmFuZ2U6YX19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmcS5pcyhpLnRhcmdldFJhbmdlKSYmUy5zdHJpbmcoaS50YXJnZXRVcmkpJiZxLmlzKGkudGFyZ2V0U2VsZWN0aW9uUmFuZ2UpJiYocS5pcyhpLm9yaWdpblNlbGVjdGlvblJhbmdlKXx8Uy51bmRlZmluZWQoaS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkpfWUuaXM9bn0pKFJhfHwoUmE9e30pKTt2YXIgRnI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpLHMsYSl7cmV0dXJue3JlZDpyLGdyZWVuOmksYmx1ZTpzLGFscGhhOmF9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmUy5udW1iZXJSYW5nZShpLnJlZCwwLDEpJiZTLm51bWJlclJhbmdlKGkuZ3JlZW4sMCwxKSYmUy5udW1iZXJSYW5nZShpLmJsdWUsMCwxKSYmUy5udW1iZXJSYW5nZShpLmFscGhhLDAsMSl9ZS5pcz1ufSkoRnJ8fChGcj17fSkpO3ZhciBFYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkpe3JldHVybntyYW5nZTpyLGNvbG9yOml9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmcS5pcyhpLnJhbmdlKSYmRnIuaXMoaS5jb2xvcil9ZS5pcz1ufSkoRWF8fChFYT17fSkpO3ZhciBNYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyl7cmV0dXJue2xhYmVsOnIsdGV4dEVkaXQ6aSxhZGRpdGlvbmFsVGV4dEVkaXRzOnN9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmUy5zdHJpbmcoaS5sYWJlbCkmJihTLnVuZGVmaW5lZChpLnRleHRFZGl0KXx8RGUuaXMoaSkpJiYoUy51bmRlZmluZWQoaS5hZGRpdGlvbmFsVGV4dEVkaXRzKXx8Uy50eXBlZEFycmF5KGkuYWRkaXRpb25hbFRleHRFZGl0cyxEZS5pcykpfWUuaXM9bn0pKE1hfHwoTWE9e30pKTt2YXIgWXQ7KGZ1bmN0aW9uKGUpe2UuQ29tbWVudD0iY29tbWVudCIsZS5JbXBvcnRzPSJpbXBvcnRzIixlLlJlZ2lvbj0icmVnaW9uIn0pKFl0fHwoWXQ9e30pKTt2YXIgQ2E7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpLHMsYSxsLG8pe2NvbnN0IHU9e3N0YXJ0TGluZTpyLGVuZExpbmU6aX07cmV0dXJuIFMuZGVmaW5lZChzKSYmKHUuc3RhcnRDaGFyYWN0ZXI9cyksUy5kZWZpbmVkKGEpJiYodS5lbmRDaGFyYWN0ZXI9YSksUy5kZWZpbmVkKGwpJiYodS5raW5kPWwpLFMuZGVmaW5lZChvKSYmKHUuY29sbGFwc2VkVGV4dD1vKSx1fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmUy51aW50ZWdlcihpLnN0YXJ0TGluZSkmJlMudWludGVnZXIoaS5zdGFydExpbmUpJiYoUy51bmRlZmluZWQoaS5zdGFydENoYXJhY3Rlcil8fFMudWludGVnZXIoaS5zdGFydENoYXJhY3RlcikpJiYoUy51bmRlZmluZWQoaS5lbmRDaGFyYWN0ZXIpfHxTLnVpbnRlZ2VyKGkuZW5kQ2hhcmFjdGVyKSkmJihTLnVuZGVmaW5lZChpLmtpbmQpfHxTLnN0cmluZyhpLmtpbmQpKX1lLmlzPW59KShDYXx8KENhPXt9KSk7dmFyIFZyOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSl7cmV0dXJue2xvY2F0aW9uOnIsbWVzc2FnZTppfX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gUy5kZWZpbmVkKGkpJiZFdC5pcyhpLmxvY2F0aW9uKSYmUy5zdHJpbmcoaS5tZXNzYWdlKX1lLmlzPW59KShWcnx8KFZyPXt9KSk7dmFyIHhlOyhmdW5jdGlvbihlKXtlLkVycm9yPTEsZS5XYXJuaW5nPTIsZS5JbmZvcm1hdGlvbj0zLGUuSGludD00fSkoeGV8fCh4ZT17fSkpO3ZhciBUYTsoZnVuY3Rpb24oZSl7ZS5Vbm5lY2Vzc2FyeT0xLGUuRGVwcmVjYXRlZD0yfSkoVGF8fChUYT17fSkpO3ZhciBQYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtjb25zdCByPW47cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChyKSYmUy5zdHJpbmcoci5ocmVmKX1lLmlzPXR9KShQYXx8KFBhPXt9KSk7dmFyIHplOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSxzLGEsbCxvKXtsZXQgdT17cmFuZ2U6cixtZXNzYWdlOml9O3JldHVybiBTLmRlZmluZWQocykmJih1LnNldmVyaXR5PXMpLFMuZGVmaW5lZChhKSYmKHUuY29kZT1hKSxTLmRlZmluZWQobCkmJih1LnNvdXJjZT1sKSxTLmRlZmluZWQobykmJih1LnJlbGF0ZWRJbmZvcm1hdGlvbj1vKSx1fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXt2YXIgaTtsZXQgcz1yO3JldHVybiBTLmRlZmluZWQocykmJnEuaXMocy5yYW5nZSkmJlMuc3RyaW5nKHMubWVzc2FnZSkmJihTLm51bWJlcihzLnNldmVyaXR5KXx8Uy51bmRlZmluZWQocy5zZXZlcml0eSkpJiYoUy5pbnRlZ2VyKHMuY29kZSl8fFMuc3RyaW5nKHMuY29kZSl8fFMudW5kZWZpbmVkKHMuY29kZSkpJiYoUy51bmRlZmluZWQocy5jb2RlRGVzY3JpcHRpb24pfHxTLnN0cmluZygoaT1zLmNvZGVEZXNjcmlwdGlvbik9PT1udWxsfHxpPT09dm9pZCAwP3ZvaWQgMDppLmhyZWYpKSYmKFMuc3RyaW5nKHMuc291cmNlKXx8Uy51bmRlZmluZWQocy5zb3VyY2UpKSYmKFMudW5kZWZpbmVkKHMucmVsYXRlZEluZm9ybWF0aW9uKXx8Uy50eXBlZEFycmF5KHMucmVsYXRlZEluZm9ybWF0aW9uLFZyLmlzKSl9ZS5pcz1ufSkoemV8fCh6ZT17fSkpO3ZhciBNdDsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGksLi4ucyl7bGV0IGE9e3RpdGxlOnIsY29tbWFuZDppfTtyZXR1cm4gUy5kZWZpbmVkKHMpJiZzLmxlbmd0aD4wJiYoYS5hcmd1bWVudHM9cyksYX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gUy5kZWZpbmVkKGkpJiZTLnN0cmluZyhpLnRpdGxlKSYmUy5zdHJpbmcoaS5jb21tYW5kKX1lLmlzPW59KShNdHx8KE10PXt9KSk7dmFyIERlOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHMsYSl7cmV0dXJue3JhbmdlOnMsbmV3VGV4dDphfX1lLnJlcGxhY2U9dDtmdW5jdGlvbiBuKHMsYSl7cmV0dXJue3JhbmdlOntzdGFydDpzLGVuZDpzfSxuZXdUZXh0OmF9fWUuaW5zZXJ0PW47ZnVuY3Rpb24gcihzKXtyZXR1cm57cmFuZ2U6cyxuZXdUZXh0OiIifX1lLmRlbD1yO2Z1bmN0aW9uIGkocyl7Y29uc3QgYT1zO3JldHVybiBTLm9iamVjdExpdGVyYWwoYSkmJlMuc3RyaW5nKGEubmV3VGV4dCkmJnEuaXMoYS5yYW5nZSl9ZS5pcz1pfSkoRGV8fChEZT17fSkpO3ZhciBEcjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyl7Y29uc3QgYT17bGFiZWw6cn07cmV0dXJuIGkhPT12b2lkIDAmJihhLm5lZWRzQ29uZmlybWF0aW9uPWkpLHMhPT12b2lkIDAmJihhLmRlc2NyaXB0aW9uPXMpLGF9ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IGk9cjtyZXR1cm4gUy5vYmplY3RMaXRlcmFsKGkpJiZTLnN0cmluZyhpLmxhYmVsKSYmKFMuYm9vbGVhbihpLm5lZWRzQ29uZmlybWF0aW9uKXx8aS5uZWVkc0NvbmZpcm1hdGlvbj09PXZvaWQgMCkmJihTLnN0cmluZyhpLmRlc2NyaXB0aW9uKXx8aS5kZXNjcmlwdGlvbj09PXZvaWQgMCl9ZS5pcz1ufSkoRHJ8fChEcj17fSkpO3ZhciBDdDsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtjb25zdCByPW47cmV0dXJuIFMuc3RyaW5nKHIpfWUuaXM9dH0pKEN0fHwoQ3Q9e30pKTt2YXIgSWE7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocyxhLGwpe3JldHVybntyYW5nZTpzLG5ld1RleHQ6YSxhbm5vdGF0aW9uSWQ6bH19ZS5yZXBsYWNlPXQ7ZnVuY3Rpb24gbihzLGEsbCl7cmV0dXJue3JhbmdlOntzdGFydDpzLGVuZDpzfSxuZXdUZXh0OmEsYW5ub3RhdGlvbklkOmx9fWUuaW5zZXJ0PW47ZnVuY3Rpb24gcihzLGEpe3JldHVybntyYW5nZTpzLG5ld1RleHQ6IiIsYW5ub3RhdGlvbklkOmF9fWUuZGVsPXI7ZnVuY3Rpb24gaShzKXtjb25zdCBhPXM7cmV0dXJuIERlLmlzKGEpJiYoRHIuaXMoYS5hbm5vdGF0aW9uSWQpfHxDdC5pcyhhLmFubm90YXRpb25JZCkpfWUuaXM9aX0pKElhfHwoSWE9e30pKTt2YXIgT3I7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpKXtyZXR1cm57dGV4dERvY3VtZW50OnIsZWRpdHM6aX19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMuZGVmaW5lZChpKSYmanIuaXMoaS50ZXh0RG9jdW1lbnQpJiZBcnJheS5pc0FycmF5KGkuZWRpdHMpfWUuaXM9bn0pKE9yfHwoT3I9e30pKTt2YXIgJHI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpLHMpe2xldCBhPXtraW5kOiJjcmVhdGUiLHVyaTpyfTtyZXR1cm4gaSE9PXZvaWQgMCYmKGkub3ZlcndyaXRlIT09dm9pZCAwfHxpLmlnbm9yZUlmRXhpc3RzIT09dm9pZCAwKSYmKGEub3B0aW9ucz1pKSxzIT09dm9pZCAwJiYoYS5hbm5vdGF0aW9uSWQ9cyksYX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gaSYmaS5raW5kPT09ImNyZWF0ZSImJlMuc3RyaW5nKGkudXJpKSYmKGkub3B0aW9ucz09PXZvaWQgMHx8KGkub3B0aW9ucy5vdmVyd3JpdGU9PT12b2lkIDB8fFMuYm9vbGVhbihpLm9wdGlvbnMub3ZlcndyaXRlKSkmJihpLm9wdGlvbnMuaWdub3JlSWZFeGlzdHM9PT12b2lkIDB8fFMuYm9vbGVhbihpLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkmJihpLmFubm90YXRpb25JZD09PXZvaWQgMHx8Q3QuaXMoaS5hbm5vdGF0aW9uSWQpKX1lLmlzPW59KSgkcnx8KCRyPXt9KSk7dmFyIFVyOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSxzLGEpe2xldCBsPXtraW5kOiJyZW5hbWUiLG9sZFVyaTpyLG5ld1VyaTppfTtyZXR1cm4gcyE9PXZvaWQgMCYmKHMub3ZlcndyaXRlIT09dm9pZCAwfHxzLmlnbm9yZUlmRXhpc3RzIT09dm9pZCAwKSYmKGwub3B0aW9ucz1zKSxhIT09dm9pZCAwJiYobC5hbm5vdGF0aW9uSWQ9YSksbH1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gaSYmaS5raW5kPT09InJlbmFtZSImJlMuc3RyaW5nKGkub2xkVXJpKSYmUy5zdHJpbmcoaS5uZXdVcmkpJiYoaS5vcHRpb25zPT09dm9pZCAwfHwoaS5vcHRpb25zLm92ZXJ3cml0ZT09PXZvaWQgMHx8Uy5ib29sZWFuKGkub3B0aW9ucy5vdmVyd3JpdGUpKSYmKGkub3B0aW9ucy5pZ25vcmVJZkV4aXN0cz09PXZvaWQgMHx8Uy5ib29sZWFuKGkub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSYmKGkuYW5ub3RhdGlvbklkPT09dm9pZCAwfHxDdC5pcyhpLmFubm90YXRpb25JZCkpfWUuaXM9bn0pKFVyfHwoVXI9e30pKTt2YXIgQnI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpLHMpe2xldCBhPXtraW5kOiJkZWxldGUiLHVyaTpyfTtyZXR1cm4gaSE9PXZvaWQgMCYmKGkucmVjdXJzaXZlIT09dm9pZCAwfHxpLmlnbm9yZUlmTm90RXhpc3RzIT09dm9pZCAwKSYmKGEub3B0aW9ucz1pKSxzIT09dm9pZCAwJiYoYS5hbm5vdGF0aW9uSWQ9cyksYX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gaSYmaS5raW5kPT09ImRlbGV0ZSImJlMuc3RyaW5nKGkudXJpKSYmKGkub3B0aW9ucz09PXZvaWQgMHx8KGkub3B0aW9ucy5yZWN1cnNpdmU9PT12b2lkIDB8fFMuYm9vbGVhbihpLm9wdGlvbnMucmVjdXJzaXZlKSkmJihpLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHM9PT12b2lkIDB8fFMuYm9vbGVhbihpLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMpKSkmJihpLmFubm90YXRpb25JZD09PXZvaWQgMHx8Q3QuaXMoaS5hbm5vdGF0aW9uSWQpKX1lLmlzPW59KShCcnx8KEJyPXt9KSk7dmFyIHFyOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe2xldCByPW47cmV0dXJuIHImJihyLmNoYW5nZXMhPT12b2lkIDB8fHIuZG9jdW1lbnRDaGFuZ2VzIT09dm9pZCAwKSYmKHIuZG9jdW1lbnRDaGFuZ2VzPT09dm9pZCAwfHxyLmRvY3VtZW50Q2hhbmdlcy5ldmVyeShpPT5TLnN0cmluZyhpLmtpbmQpPyRyLmlzKGkpfHxVci5pcyhpKXx8QnIuaXMoaSk6T3IuaXMoaSkpKX1lLmlzPXR9KShxcnx8KHFyPXt9KSk7dmFyIEZhOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe3JldHVybnt1cmk6cn19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMuZGVmaW5lZChpKSYmUy5zdHJpbmcoaS51cmkpfWUuaXM9bn0pKEZhfHwoRmE9e30pKTt2YXIgVmE7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpKXtyZXR1cm57dXJpOnIsdmVyc2lvbjppfX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gUy5kZWZpbmVkKGkpJiZTLnN0cmluZyhpLnVyaSkmJlMuaW50ZWdlcihpLnZlcnNpb24pfWUuaXM9bn0pKFZhfHwoVmE9e30pKTt2YXIganI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpKXtyZXR1cm57dXJpOnIsdmVyc2lvbjppfX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gUy5kZWZpbmVkKGkpJiZTLnN0cmluZyhpLnVyaSkmJihpLnZlcnNpb249PT1udWxsfHxTLmludGVnZXIoaS52ZXJzaW9uKSl9ZS5pcz1ufSkoanJ8fChqcj17fSkpO3ZhciBEYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyxhKXtyZXR1cm57dXJpOnIsbGFuZ3VhZ2VJZDppLHZlcnNpb246cyx0ZXh0OmF9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtsZXQgaT1yO3JldHVybiBTLmRlZmluZWQoaSkmJlMuc3RyaW5nKGkudXJpKSYmUy5zdHJpbmcoaS5sYW5ndWFnZUlkKSYmUy5pbnRlZ2VyKGkudmVyc2lvbikmJlMuc3RyaW5nKGkudGV4dCl9ZS5pcz1ufSkoRGF8fChEYT17fSkpO3ZhciBvdDsoZnVuY3Rpb24oZSl7ZS5QbGFpblRleHQ9InBsYWludGV4dCIsZS5NYXJrZG93bj0ibWFya2Rvd24iO2Z1bmN0aW9uIHQobil7Y29uc3Qgcj1uO3JldHVybiByPT09ZS5QbGFpblRleHR8fHI9PT1lLk1hcmtkb3dufWUuaXM9dH0pKG90fHwob3Q9e30pKTt2YXIgWnQ7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7Y29uc3Qgcj1uO3JldHVybiBTLm9iamVjdExpdGVyYWwobikmJm90LmlzKHIua2luZCkmJlMuc3RyaW5nKHIudmFsdWUpfWUuaXM9dH0pKFp0fHwoWnQ9e30pKTt2YXIgeWU7KGZ1bmN0aW9uKGUpe2UuVGV4dD0xLGUuTWV0aG9kPTIsZS5GdW5jdGlvbj0zLGUuQ29uc3RydWN0b3I9NCxlLkZpZWxkPTUsZS5WYXJpYWJsZT02LGUuQ2xhc3M9NyxlLkludGVyZmFjZT04LGUuTW9kdWxlPTksZS5Qcm9wZXJ0eT0xMCxlLlVuaXQ9MTEsZS5WYWx1ZT0xMixlLkVudW09MTMsZS5LZXl3b3JkPTE0LGUuU25pcHBldD0xNSxlLkNvbG9yPTE2LGUuRmlsZT0xNyxlLlJlZmVyZW5jZT0xOCxlLkZvbGRlcj0xOSxlLkVudW1NZW1iZXI9MjAsZS5Db25zdGFudD0yMSxlLlN0cnVjdD0yMixlLkV2ZW50PTIzLGUuT3BlcmF0b3I9MjQsZS5UeXBlUGFyYW1ldGVyPTI1fSkoeWV8fCh5ZT17fSkpO3ZhciBpZTsoZnVuY3Rpb24oZSl7ZS5QbGFpblRleHQ9MSxlLlNuaXBwZXQ9Mn0pKGllfHwoaWU9e30pKTt2YXIgT2E7KGZ1bmN0aW9uKGUpe2UuRGVwcmVjYXRlZD0xfSkoT2F8fChPYT17fSkpO3ZhciAkYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyl7cmV0dXJue25ld1RleHQ6cixpbnNlcnQ6aSxyZXBsYWNlOnN9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIGkmJlMuc3RyaW5nKGkubmV3VGV4dCkmJnEuaXMoaS5pbnNlcnQpJiZxLmlzKGkucmVwbGFjZSl9ZS5pcz1ufSkoJGF8fCgkYT17fSkpO3ZhciBVYTsoZnVuY3Rpb24oZSl7ZS5hc0lzPTEsZS5hZGp1c3RJbmRlbnRhdGlvbj0yfSkoVWF8fChVYT17fSkpO3ZhciBCYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtjb25zdCByPW47cmV0dXJuIHImJihTLnN0cmluZyhyLmRldGFpbCl8fHIuZGV0YWlsPT09dm9pZCAwKSYmKFMuc3RyaW5nKHIuZGVzY3JpcHRpb24pfHxyLmRlc2NyaXB0aW9uPT09dm9pZCAwKX1lLmlzPXR9KShCYXx8KEJhPXt9KSk7dmFyIFdyOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3JldHVybntsYWJlbDpufX1lLmNyZWF0ZT10fSkoV3J8fChXcj17fSkpO3ZhciBxYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuLHIpe3JldHVybntpdGVtczpufHxbXSxpc0luY29tcGxldGU6ISFyfX1lLmNyZWF0ZT10fSkocWF8fChxYT17fSkpO3ZhciBNbjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyKXtyZXR1cm4gci5yZXBsYWNlKC9bXFxgKl97fVtcXSgpIytcLS4hXS9nLCJcXCQmIil9ZS5mcm9tUGxhaW5UZXh0PXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIFMuc3RyaW5nKGkpfHxTLm9iamVjdExpdGVyYWwoaSkmJlMuc3RyaW5nKGkubGFuZ3VhZ2UpJiZTLnN0cmluZyhpLnZhbHVlKX1lLmlzPW59KShNbnx8KE1uPXt9KSk7dmFyIGphOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe2xldCByPW47cmV0dXJuISFyJiZTLm9iamVjdExpdGVyYWwocikmJihadC5pcyhyLmNvbnRlbnRzKXx8TW4uaXMoci5jb250ZW50cyl8fFMudHlwZWRBcnJheShyLmNvbnRlbnRzLE1uLmlzKSkmJihuLnJhbmdlPT09dm9pZCAwfHxxLmlzKG4ucmFuZ2UpKX1lLmlzPXR9KShqYXx8KGphPXt9KSk7dmFyIFdhOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4scil7cmV0dXJuIHI/e2xhYmVsOm4sZG9jdW1lbnRhdGlvbjpyfTp7bGFiZWw6bn19ZS5jcmVhdGU9dH0pKFdhfHwoV2E9e30pKTt2YXIgSGE7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobixyLC4uLmkpe2xldCBzPXtsYWJlbDpufTtyZXR1cm4gUy5kZWZpbmVkKHIpJiYocy5kb2N1bWVudGF0aW9uPXIpLFMuZGVmaW5lZChpKT9zLnBhcmFtZXRlcnM9aTpzLnBhcmFtZXRlcnM9W10sc31lLmNyZWF0ZT10fSkoSGF8fChIYT17fSkpO3ZhciB6YTsoZnVuY3Rpb24oZSl7ZS5UZXh0PTEsZS5SZWFkPTIsZS5Xcml0ZT0zfSkoemF8fCh6YT17fSkpO3ZhciBHYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuLHIpe2xldCBpPXtyYW5nZTpufTtyZXR1cm4gUy5udW1iZXIocikmJihpLmtpbmQ9ciksaX1lLmNyZWF0ZT10fSkoR2F8fChHYT17fSkpO3ZhciBPZTsoZnVuY3Rpb24oZSl7ZS5GaWxlPTEsZS5Nb2R1bGU9MixlLk5hbWVzcGFjZT0zLGUuUGFja2FnZT00LGUuQ2xhc3M9NSxlLk1ldGhvZD02LGUuUHJvcGVydHk9NyxlLkZpZWxkPTgsZS5Db25zdHJ1Y3Rvcj05LGUuRW51bT0xMCxlLkludGVyZmFjZT0xMSxlLkZ1bmN0aW9uPTEyLGUuVmFyaWFibGU9MTMsZS5Db25zdGFudD0xNCxlLlN0cmluZz0xNSxlLk51bWJlcj0xNixlLkJvb2xlYW49MTcsZS5BcnJheT0xOCxlLk9iamVjdD0xOSxlLktleT0yMCxlLk51bGw9MjEsZS5FbnVtTWVtYmVyPTIyLGUuU3RydWN0PTIzLGUuRXZlbnQ9MjQsZS5PcGVyYXRvcj0yNSxlLlR5cGVQYXJhbWV0ZXI9MjZ9KShPZXx8KE9lPXt9KSk7dmFyIEphOyhmdW5jdGlvbihlKXtlLkRlcHJlY2F0ZWQ9MX0pKEphfHwoSmE9e30pKTt2YXIgWGE7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobixyLGkscyxhKXtsZXQgbD17bmFtZTpuLGtpbmQ6cixsb2NhdGlvbjp7dXJpOnMscmFuZ2U6aX19O3JldHVybiBhJiYobC5jb250YWluZXJOYW1lPWEpLGx9ZS5jcmVhdGU9dH0pKFhhfHwoWGE9e30pKTt2YXIgUWE7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobixyLGkscyl7cmV0dXJuIHMhPT12b2lkIDA/e25hbWU6bixraW5kOnIsbG9jYXRpb246e3VyaTppLHJhbmdlOnN9fTp7bmFtZTpuLGtpbmQ6cixsb2NhdGlvbjp7dXJpOml9fX1lLmNyZWF0ZT10fSkoUWF8fChRYT17fSkpO3ZhciBZYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyxhLGwsbyl7bGV0IHU9e25hbWU6cixkZXRhaWw6aSxraW5kOnMscmFuZ2U6YSxzZWxlY3Rpb25SYW5nZTpsfTtyZXR1cm4gbyE9PXZvaWQgMCYmKHUuY2hpbGRyZW49byksdX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gaSYmUy5zdHJpbmcoaS5uYW1lKSYmUy5udW1iZXIoaS5raW5kKSYmcS5pcyhpLnJhbmdlKSYmcS5pcyhpLnNlbGVjdGlvblJhbmdlKSYmKGkuZGV0YWlsPT09dm9pZCAwfHxTLnN0cmluZyhpLmRldGFpbCkpJiYoaS5kZXByZWNhdGVkPT09dm9pZCAwfHxTLmJvb2xlYW4oaS5kZXByZWNhdGVkKSkmJihpLmNoaWxkcmVuPT09dm9pZCAwfHxBcnJheS5pc0FycmF5KGkuY2hpbGRyZW4pKSYmKGkudGFncz09PXZvaWQgMHx8QXJyYXkuaXNBcnJheShpLnRhZ3MpKX1lLmlzPW59KShZYXx8KFlhPXt9KSk7dmFyIFphOyhmdW5jdGlvbihlKXtlLkVtcHR5PSIiLGUuUXVpY2tGaXg9InF1aWNrZml4IixlLlJlZmFjdG9yPSJyZWZhY3RvciIsZS5SZWZhY3RvckV4dHJhY3Q9InJlZmFjdG9yLmV4dHJhY3QiLGUuUmVmYWN0b3JJbmxpbmU9InJlZmFjdG9yLmlubGluZSIsZS5SZWZhY3RvclJld3JpdGU9InJlZmFjdG9yLnJld3JpdGUiLGUuU291cmNlPSJzb3VyY2UiLGUuU291cmNlT3JnYW5pemVJbXBvcnRzPSJzb3VyY2Uub3JnYW5pemVJbXBvcnRzIixlLlNvdXJjZUZpeEFsbD0ic291cmNlLmZpeEFsbCJ9KShaYXx8KFphPXt9KSk7dmFyIENuOyhmdW5jdGlvbihlKXtlLkludm9rZWQ9MSxlLkF1dG9tYXRpYz0yfSkoQ258fChDbj17fSkpO3ZhciBLYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyl7bGV0IGE9e2RpYWdub3N0aWNzOnJ9O3JldHVybiBpIT1udWxsJiYoYS5vbmx5PWkpLHMhPW51bGwmJihhLnRyaWdnZXJLaW5kPXMpLGF9ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMuZGVmaW5lZChpKSYmUy50eXBlZEFycmF5KGkuZGlhZ25vc3RpY3MsemUuaXMpJiYoaS5vbmx5PT09dm9pZCAwfHxTLnR5cGVkQXJyYXkoaS5vbmx5LFMuc3RyaW5nKSkmJihpLnRyaWdnZXJLaW5kPT09dm9pZCAwfHxpLnRyaWdnZXJLaW5kPT09Q24uSW52b2tlZHx8aS50cmlnZ2VyS2luZD09PUNuLkF1dG9tYXRpYyl9ZS5pcz1ufSkoS2F8fChLYT17fSkpO3ZhciBlbzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyl7bGV0IGE9e3RpdGxlOnJ9LGw9ITA7cmV0dXJuIHR5cGVvZiBpPT0ic3RyaW5nIj8obD0hMSxhLmtpbmQ9aSk6TXQuaXMoaSk/YS5jb21tYW5kPWk6YS5lZGl0PWksbCYmcyE9PXZvaWQgMCYmKGEua2luZD1zKSxhfWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtsZXQgaT1yO3JldHVybiBpJiZTLnN0cmluZyhpLnRpdGxlKSYmKGkuZGlhZ25vc3RpY3M9PT12b2lkIDB8fFMudHlwZWRBcnJheShpLmRpYWdub3N0aWNzLHplLmlzKSkmJihpLmtpbmQ9PT12b2lkIDB8fFMuc3RyaW5nKGkua2luZCkpJiYoaS5lZGl0IT09dm9pZCAwfHxpLmNvbW1hbmQhPT12b2lkIDApJiYoaS5jb21tYW5kPT09dm9pZCAwfHxNdC5pcyhpLmNvbW1hbmQpKSYmKGkuaXNQcmVmZXJyZWQ9PT12b2lkIDB8fFMuYm9vbGVhbihpLmlzUHJlZmVycmVkKSkmJihpLmVkaXQ9PT12b2lkIDB8fHFyLmlzKGkuZWRpdCkpfWUuaXM9bn0pKGVvfHwoZW89e30pKTt2YXIgdG87KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpKXtsZXQgcz17cmFuZ2U6cn07cmV0dXJuIFMuZGVmaW5lZChpKSYmKHMuZGF0YT1pKSxzfWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtsZXQgaT1yO3JldHVybiBTLmRlZmluZWQoaSkmJnEuaXMoaS5yYW5nZSkmJihTLnVuZGVmaW5lZChpLmNvbW1hbmQpfHxNdC5pcyhpLmNvbW1hbmQpKX1lLmlzPW59KSh0b3x8KHRvPXt9KSk7dmFyIG5vOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSl7cmV0dXJue3RhYlNpemU6cixpbnNlcnRTcGFjZXM6aX19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMuZGVmaW5lZChpKSYmUy51aW50ZWdlcihpLnRhYlNpemUpJiZTLmJvb2xlYW4oaS5pbnNlcnRTcGFjZXMpfWUuaXM9bn0pKG5vfHwobm89e30pKTt2YXIgcm87KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpLHMpe3JldHVybntyYW5nZTpyLHRhcmdldDppLGRhdGE6c319ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMuZGVmaW5lZChpKSYmcS5pcyhpLnJhbmdlKSYmKFMudW5kZWZpbmVkKGkudGFyZ2V0KXx8Uy5zdHJpbmcoaS50YXJnZXQpKX1lLmlzPW59KShyb3x8KHJvPXt9KSk7dmFyIFRuOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSl7cmV0dXJue3JhbmdlOnIscGFyZW50Oml9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtsZXQgaT1yO3JldHVybiBTLm9iamVjdExpdGVyYWwoaSkmJnEuaXMoaS5yYW5nZSkmJihpLnBhcmVudD09PXZvaWQgMHx8ZS5pcyhpLnBhcmVudCkpfWUuaXM9bn0pKFRufHwoVG49e30pKTt2YXIgaW87KGZ1bmN0aW9uKGUpe2UubmFtZXNwYWNlPSJuYW1lc3BhY2UiLGUudHlwZT0idHlwZSIsZS5jbGFzcz0iY2xhc3MiLGUuZW51bT0iZW51bSIsZS5pbnRlcmZhY2U9ImludGVyZmFjZSIsZS5zdHJ1Y3Q9InN0cnVjdCIsZS50eXBlUGFyYW1ldGVyPSJ0eXBlUGFyYW1ldGVyIixlLnBhcmFtZXRlcj0icGFyYW1ldGVyIixlLnZhcmlhYmxlPSJ2YXJpYWJsZSIsZS5wcm9wZXJ0eT0icHJvcGVydHkiLGUuZW51bU1lbWJlcj0iZW51bU1lbWJlciIsZS5ldmVudD0iZXZlbnQiLGUuZnVuY3Rpb249ImZ1bmN0aW9uIixlLm1ldGhvZD0ibWV0aG9kIixlLm1hY3JvPSJtYWNybyIsZS5rZXl3b3JkPSJrZXl3b3JkIixlLm1vZGlmaWVyPSJtb2RpZmllciIsZS5jb21tZW50PSJjb21tZW50IixlLnN0cmluZz0ic3RyaW5nIixlLm51bWJlcj0ibnVtYmVyIixlLnJlZ2V4cD0icmVnZXhwIixlLm9wZXJhdG9yPSJvcGVyYXRvciIsZS5kZWNvcmF0b3I9ImRlY29yYXRvciJ9KShpb3x8KGlvPXt9KSk7dmFyIHNvOyhmdW5jdGlvbihlKXtlLmRlY2xhcmF0aW9uPSJkZWNsYXJhdGlvbiIsZS5kZWZpbml0aW9uPSJkZWZpbml0aW9uIixlLnJlYWRvbmx5PSJyZWFkb25seSIsZS5zdGF0aWM9InN0YXRpYyIsZS5kZXByZWNhdGVkPSJkZXByZWNhdGVkIixlLmFic3RyYWN0PSJhYnN0cmFjdCIsZS5hc3luYz0iYXN5bmMiLGUubW9kaWZpY2F0aW9uPSJtb2RpZmljYXRpb24iLGUuZG9jdW1lbnRhdGlvbj0iZG9jdW1lbnRhdGlvbiIsZS5kZWZhdWx0TGlicmFyeT0iZGVmYXVsdExpYnJhcnkifSkoc298fChzbz17fSkpO3ZhciBhbzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtjb25zdCByPW47cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChyKSYmKHIucmVzdWx0SWQ9PT12b2lkIDB8fHR5cGVvZiByLnJlc3VsdElkPT0ic3RyaW5nIikmJkFycmF5LmlzQXJyYXkoci5kYXRhKSYmKHIuZGF0YS5sZW5ndGg9PT0wfHx0eXBlb2Ygci5kYXRhWzBdPT0ibnVtYmVyIil9ZS5pcz10fSkoYW98fChhbz17fSkpO3ZhciBvbzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkpe3JldHVybntyYW5nZTpyLHRleHQ6aX19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IGk9cjtyZXR1cm4gaSE9bnVsbCYmcS5pcyhpLnJhbmdlKSYmUy5zdHJpbmcoaS50ZXh0KX1lLmlzPW59KShvb3x8KG9vPXt9KSk7dmFyIGxvOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSxzKXtyZXR1cm57cmFuZ2U6cix2YXJpYWJsZU5hbWU6aSxjYXNlU2Vuc2l0aXZlTG9va3VwOnN9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIGkhPW51bGwmJnEuaXMoaS5yYW5nZSkmJlMuYm9vbGVhbihpLmNhc2VTZW5zaXRpdmVMb29rdXApJiYoUy5zdHJpbmcoaS52YXJpYWJsZU5hbWUpfHxpLnZhcmlhYmxlTmFtZT09PXZvaWQgMCl9ZS5pcz1ufSkobG98fChsbz17fSkpO3ZhciB1bzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkpe3JldHVybntyYW5nZTpyLGV4cHJlc3Npb246aX19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IGk9cjtyZXR1cm4gaSE9bnVsbCYmcS5pcyhpLnJhbmdlKSYmKFMuc3RyaW5nKGkuZXhwcmVzc2lvbil8fGkuZXhwcmVzc2lvbj09PXZvaWQgMCl9ZS5pcz1ufSkodW98fCh1bz17fSkpO3ZhciBjbzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkpe3JldHVybntmcmFtZUlkOnIsc3RvcHBlZExvY2F0aW9uOml9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIFMuZGVmaW5lZChpKSYmcS5pcyhyLnN0b3BwZWRMb2NhdGlvbil9ZS5pcz1ufSkoY298fChjbz17fSkpO3ZhciBIcjsoZnVuY3Rpb24oZSl7ZS5UeXBlPTEsZS5QYXJhbWV0ZXI9MjtmdW5jdGlvbiB0KG4pe3JldHVybiBuPT09MXx8bj09PTJ9ZS5pcz10fSkoSHJ8fChIcj17fSkpO3ZhciB6cjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyKXtyZXR1cm57dmFsdWU6cn19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IGk9cjtyZXR1cm4gUy5vYmplY3RMaXRlcmFsKGkpJiYoaS50b29sdGlwPT09dm9pZCAwfHxTLnN0cmluZyhpLnRvb2x0aXApfHxadC5pcyhpLnRvb2x0aXApKSYmKGkubG9jYXRpb249PT12b2lkIDB8fEV0LmlzKGkubG9jYXRpb24pKSYmKGkuY29tbWFuZD09PXZvaWQgMHx8TXQuaXMoaS5jb21tYW5kKSl9ZS5pcz1ufSkoenJ8fCh6cj17fSkpO3ZhciBmbzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyl7Y29uc3QgYT17cG9zaXRpb246cixsYWJlbDppfTtyZXR1cm4gcyE9PXZvaWQgMCYmKGEua2luZD1zKSxhfWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmWi5pcyhpLnBvc2l0aW9uKSYmKFMuc3RyaW5nKGkubGFiZWwpfHxTLnR5cGVkQXJyYXkoaS5sYWJlbCx6ci5pcykpJiYoaS5raW5kPT09dm9pZCAwfHxIci5pcyhpLmtpbmQpKSYmaS50ZXh0RWRpdHM9PT12b2lkIDB8fFMudHlwZWRBcnJheShpLnRleHRFZGl0cyxEZS5pcykmJihpLnRvb2x0aXA9PT12b2lkIDB8fFMuc3RyaW5nKGkudG9vbHRpcCl8fFp0LmlzKGkudG9vbHRpcCkpJiYoaS5wYWRkaW5nTGVmdD09PXZvaWQgMHx8Uy5ib29sZWFuKGkucGFkZGluZ0xlZnQpKSYmKGkucGFkZGluZ1JpZ2h0PT09dm9pZCAwfHxTLmJvb2xlYW4oaS5wYWRkaW5nUmlnaHQpKX1lLmlzPW59KShmb3x8KGZvPXt9KSk7dmFyIGhvOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3JldHVybntraW5kOiJzbmlwcGV0Iix2YWx1ZTpufX1lLmNyZWF0ZVNuaXBwZXQ9dH0pKGhvfHwoaG89e30pKTt2YXIgbW87KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobixyLGkscyl7cmV0dXJue2luc2VydFRleHQ6bixmaWx0ZXJUZXh0OnIscmFuZ2U6aSxjb21tYW5kOnN9fWUuY3JlYXRlPXR9KShtb3x8KG1vPXt9KSk7dmFyIGdvOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3JldHVybntpdGVtczpufX1lLmNyZWF0ZT10fSkoZ298fChnbz17fSkpO3ZhciBwbzsoZnVuY3Rpb24oZSl7ZS5JbnZva2VkPTAsZS5BdXRvbWF0aWM9MX0pKHBvfHwocG89e30pKTt2YXIgYm87KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobixyKXtyZXR1cm57cmFuZ2U6bix0ZXh0OnJ9fWUuY3JlYXRlPXR9KShib3x8KGJvPXt9KSk7dmFyIHZvOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4scil7cmV0dXJue3RyaWdnZXJLaW5kOm4sc2VsZWN0ZWRDb21wbGV0aW9uSW5mbzpyfX1lLmNyZWF0ZT10fSkodm98fCh2bz17fSkpO3ZhciB4bzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtjb25zdCByPW47cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChyKSYmSXIuaXMoci51cmkpJiZTLnN0cmluZyhyLm5hbWUpfWUuaXM9dH0pKHhvfHwoeG89e30pKTt2YXIgeW87KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocyxhLGwsbyl7cmV0dXJuIG5ldyBxYyhzLGEsbCxvKX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocyl7bGV0IGE9cztyZXR1cm4hIShTLmRlZmluZWQoYSkmJlMuc3RyaW5nKGEudXJpKSYmKFMudW5kZWZpbmVkKGEubGFuZ3VhZ2VJZCl8fFMuc3RyaW5nKGEubGFuZ3VhZ2VJZCkpJiZTLnVpbnRlZ2VyKGEubGluZUNvdW50KSYmUy5mdW5jKGEuZ2V0VGV4dCkmJlMuZnVuYyhhLnBvc2l0aW9uQXQpJiZTLmZ1bmMoYS5vZmZzZXRBdCkpfWUuaXM9bjtmdW5jdGlvbiByKHMsYSl7bGV0IGw9cy5nZXRUZXh0KCksbz1pKGEsKGgsZik9PntsZXQgZD1oLnJhbmdlLnN0YXJ0LmxpbmUtZi5yYW5nZS5zdGFydC5saW5lO3JldHVybiBkPT09MD9oLnJhbmdlLnN0YXJ0LmNoYXJhY3Rlci1mLnJhbmdlLnN0YXJ0LmNoYXJhY3RlcjpkfSksdT1sLmxlbmd0aDtmb3IobGV0IGg9by5sZW5ndGgtMTtoPj0wO2gtLSl7bGV0IGY9b1toXSxkPXMub2Zmc2V0QXQoZi5yYW5nZS5zdGFydCksbT1zLm9mZnNldEF0KGYucmFuZ2UuZW5kKTtpZihtPD11KWw9bC5zdWJzdHJpbmcoMCxkKStmLm5ld1RleHQrbC5zdWJzdHJpbmcobSxsLmxlbmd0aCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIk92ZXJsYXBwaW5nIGVkaXQiKTt1PWR9cmV0dXJuIGx9ZS5hcHBseUVkaXRzPXI7ZnVuY3Rpb24gaShzLGEpe2lmKHMubGVuZ3RoPD0xKXJldHVybiBzO2NvbnN0IGw9cy5sZW5ndGgvMnwwLG89cy5zbGljZSgwLGwpLHU9cy5zbGljZShsKTtpKG8sYSksaSh1LGEpO2xldCBoPTAsZj0wLGQ9MDtmb3IoO2g8by5sZW5ndGgmJmY8dS5sZW5ndGg7KWEob1toXSx1W2ZdKTw9MD9zW2QrK109b1toKytdOnNbZCsrXT11W2YrK107Zm9yKDtoPG8ubGVuZ3RoOylzW2QrK109b1toKytdO2Zvcig7Zjx1Lmxlbmd0aDspc1tkKytdPXVbZisrXTtyZXR1cm4gc319KSh5b3x8KHlvPXt9KSk7dmFyIHFjPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuLHIpe3RoaXMuX3VyaT1lLHRoaXMuX2xhbmd1YWdlSWQ9dCx0aGlzLl92ZXJzaW9uPW4sdGhpcy5fY29udGVudD1yLHRoaXMuX2xpbmVPZmZzZXRzPXZvaWQgMH1nZXQgdXJpKCl7cmV0dXJuIHRoaXMuX3VyaX1nZXQgbGFuZ3VhZ2VJZCgpe3JldHVybiB0aGlzLl9sYW5ndWFnZUlkfWdldCB2ZXJzaW9uKCl7cmV0dXJuIHRoaXMuX3ZlcnNpb259Z2V0VGV4dChlKXtpZihlKXtsZXQgdD10aGlzLm9mZnNldEF0KGUuc3RhcnQpLG49dGhpcy5vZmZzZXRBdChlLmVuZCk7cmV0dXJuIHRoaXMuX2NvbnRlbnQuc3Vic3RyaW5nKHQsbil9cmV0dXJuIHRoaXMuX2NvbnRlbnR9dXBkYXRlKGUsdCl7dGhpcy5fY29udGVudD1lLnRleHQsdGhpcy5fdmVyc2lvbj10LHRoaXMuX2xpbmVPZmZzZXRzPXZvaWQgMH1nZXRMaW5lT2Zmc2V0cygpe2lmKHRoaXMuX2xpbmVPZmZzZXRzPT09dm9pZCAwKXtsZXQgZT1bXSx0PXRoaXMuX2NvbnRlbnQsbj0hMDtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7biYmKGUucHVzaChyKSxuPSExKTtsZXQgaT10LmNoYXJBdChyKTtuPWk9PT0iXHIifHxpPT09YApgLGk9PT0iXHIiJiZyKzE8dC5sZW5ndGgmJnQuY2hhckF0KHIrMSk9PT1gCmAmJnIrK31uJiZ0Lmxlbmd0aD4wJiZlLnB1c2godC5sZW5ndGgpLHRoaXMuX2xpbmVPZmZzZXRzPWV9cmV0dXJuIHRoaXMuX2xpbmVPZmZzZXRzfXBvc2l0aW9uQXQoZSl7ZT1NYXRoLm1heChNYXRoLm1pbihlLHRoaXMuX2NvbnRlbnQubGVuZ3RoKSwwKTtsZXQgdD10aGlzLmdldExpbmVPZmZzZXRzKCksbj0wLHI9dC5sZW5ndGg7aWYocj09PTApcmV0dXJuIFouY3JlYXRlKDAsZSk7Zm9yKDtuPHI7KXtsZXQgcz1NYXRoLmZsb29yKChuK3IpLzIpO3Rbc10+ZT9yPXM6bj1zKzF9bGV0IGk9bi0xO3JldHVybiBaLmNyZWF0ZShpLGUtdFtpXSl9b2Zmc2V0QXQoZSl7bGV0IHQ9dGhpcy5nZXRMaW5lT2Zmc2V0cygpO2lmKGUubGluZT49dC5sZW5ndGgpcmV0dXJuIHRoaXMuX2NvbnRlbnQubGVuZ3RoO2lmKGUubGluZTwwKXJldHVybiAwO2xldCBuPXRbZS5saW5lXSxyPWUubGluZSsxPHQubGVuZ3RoP3RbZS5saW5lKzFdOnRoaXMuX2NvbnRlbnQubGVuZ3RoO3JldHVybiBNYXRoLm1heChNYXRoLm1pbihuK2UuY2hhcmFjdGVyLHIpLG4pfWdldCBsaW5lQ291bnQoKXtyZXR1cm4gdGhpcy5nZXRMaW5lT2Zmc2V0cygpLmxlbmd0aH19LFM7KGZ1bmN0aW9uKGUpe2NvbnN0IHQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBuKG0pe3JldHVybiB0eXBlb2YgbTwidSJ9ZS5kZWZpbmVkPW47ZnVuY3Rpb24gcihtKXtyZXR1cm4gdHlwZW9mIG0+InUifWUudW5kZWZpbmVkPXI7ZnVuY3Rpb24gaShtKXtyZXR1cm4gbT09PSEwfHxtPT09ITF9ZS5ib29sZWFuPWk7ZnVuY3Rpb24gcyhtKXtyZXR1cm4gdC5jYWxsKG0pPT09IltvYmplY3QgU3RyaW5nXSJ9ZS5zdHJpbmc9cztmdW5jdGlvbiBhKG0pe3JldHVybiB0LmNhbGwobSk9PT0iW29iamVjdCBOdW1iZXJdIn1lLm51bWJlcj1hO2Z1bmN0aW9uIGwobSxnLHApe3JldHVybiB0LmNhbGwobSk9PT0iW29iamVjdCBOdW1iZXJdIiYmZzw9bSYmbTw9cH1lLm51bWJlclJhbmdlPWw7ZnVuY3Rpb24gbyhtKXtyZXR1cm4gdC5jYWxsKG0pPT09IltvYmplY3QgTnVtYmVyXSImJi0yMTQ3NDgzNjQ4PD1tJiZtPD0yMTQ3NDgzNjQ3fWUuaW50ZWdlcj1vO2Z1bmN0aW9uIHUobSl7cmV0dXJuIHQuY2FsbChtKT09PSJbb2JqZWN0IE51bWJlcl0iJiYwPD1tJiZtPD0yMTQ3NDgzNjQ3fWUudWludGVnZXI9dTtmdW5jdGlvbiBoKG0pe3JldHVybiB0LmNhbGwobSk9PT0iW29iamVjdCBGdW5jdGlvbl0ifWUuZnVuYz1oO2Z1bmN0aW9uIGYobSl7cmV0dXJuIG0hPT1udWxsJiZ0eXBlb2YgbT09Im9iamVjdCJ9ZS5vYmplY3RMaXRlcmFsPWY7ZnVuY3Rpb24gZChtLGcpe3JldHVybiBBcnJheS5pc0FycmF5KG0pJiZtLmV2ZXJ5KGcpfWUudHlwZWRBcnJheT1kfSkoU3x8KFM9e30pKTt2YXIgd289Y2xhc3MgaWl7Y29uc3RydWN0b3IodCxuLHIsaSl7dGhpcy5fdXJpPXQsdGhpcy5fbGFuZ3VhZ2VJZD1uLHRoaXMuX3ZlcnNpb249cix0aGlzLl9jb250ZW50PWksdGhpcy5fbGluZU9mZnNldHM9dm9pZCAwfWdldCB1cmkoKXtyZXR1cm4gdGhpcy5fdXJpfWdldCBsYW5ndWFnZUlkKCl7cmV0dXJuIHRoaXMuX2xhbmd1YWdlSWR9Z2V0IHZlcnNpb24oKXtyZXR1cm4gdGhpcy5fdmVyc2lvbn1nZXRUZXh0KHQpe2lmKHQpe2NvbnN0IG49dGhpcy5vZmZzZXRBdCh0LnN0YXJ0KSxyPXRoaXMub2Zmc2V0QXQodC5lbmQpO3JldHVybiB0aGlzLl9jb250ZW50LnN1YnN0cmluZyhuLHIpfXJldHVybiB0aGlzLl9jb250ZW50fXVwZGF0ZSh0LG4pe2ZvcihsZXQgciBvZiB0KWlmKGlpLmlzSW5jcmVtZW50YWwocikpe2NvbnN0IGk9TG8oci5yYW5nZSkscz10aGlzLm9mZnNldEF0KGkuc3RhcnQpLGE9dGhpcy5vZmZzZXRBdChpLmVuZCk7dGhpcy5fY29udGVudD10aGlzLl9jb250ZW50LnN1YnN0cmluZygwLHMpK3IudGV4dCt0aGlzLl9jb250ZW50LnN1YnN0cmluZyhhLHRoaXMuX2NvbnRlbnQubGVuZ3RoKTtjb25zdCBsPU1hdGgubWF4KGkuc3RhcnQubGluZSwwKSxvPU1hdGgubWF4KGkuZW5kLmxpbmUsMCk7bGV0IHU9dGhpcy5fbGluZU9mZnNldHM7Y29uc3QgaD1fbyhyLnRleHQsITEscyk7aWYoby1sPT09aC5sZW5ndGgpZm9yKGxldCBkPTAsbT1oLmxlbmd0aDtkPG07ZCsrKXVbZCtsKzFdPWhbZF07ZWxzZSBoLmxlbmd0aDwxZTQ/dS5zcGxpY2UobCsxLG8tbCwuLi5oKTp0aGlzLl9saW5lT2Zmc2V0cz11PXUuc2xpY2UoMCxsKzEpLmNvbmNhdChoLHUuc2xpY2UobysxKSk7Y29uc3QgZj1yLnRleHQubGVuZ3RoLShhLXMpO2lmKGYhPT0wKWZvcihsZXQgZD1sKzEraC5sZW5ndGgsbT11Lmxlbmd0aDtkPG07ZCsrKXVbZF09dVtkXStmfWVsc2UgaWYoaWkuaXNGdWxsKHIpKXRoaXMuX2NvbnRlbnQ9ci50ZXh0LHRoaXMuX2xpbmVPZmZzZXRzPXZvaWQgMDtlbHNlIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBjaGFuZ2UgZXZlbnQgcmVjZWl2ZWQiKTt0aGlzLl92ZXJzaW9uPW59Z2V0TGluZU9mZnNldHMoKXtyZXR1cm4gdGhpcy5fbGluZU9mZnNldHM9PT12b2lkIDAmJih0aGlzLl9saW5lT2Zmc2V0cz1fbyh0aGlzLl9jb250ZW50LCEwKSksdGhpcy5fbGluZU9mZnNldHN9cG9zaXRpb25BdCh0KXt0PU1hdGgubWF4KE1hdGgubWluKHQsdGhpcy5fY29udGVudC5sZW5ndGgpLDApO2xldCBuPXRoaXMuZ2V0TGluZU9mZnNldHMoKSxyPTAsaT1uLmxlbmd0aDtpZihpPT09MClyZXR1cm57bGluZTowLGNoYXJhY3Rlcjp0fTtmb3IoO3I8aTspe2xldCBhPU1hdGguZmxvb3IoKHIraSkvMik7blthXT50P2k9YTpyPWErMX1sZXQgcz1yLTE7cmV0dXJue2xpbmU6cyxjaGFyYWN0ZXI6dC1uW3NdfX1vZmZzZXRBdCh0KXtsZXQgbj10aGlzLmdldExpbmVPZmZzZXRzKCk7aWYodC5saW5lPj1uLmxlbmd0aClyZXR1cm4gdGhpcy5fY29udGVudC5sZW5ndGg7aWYodC5saW5lPDApcmV0dXJuIDA7bGV0IHI9blt0LmxpbmVdLGk9dC5saW5lKzE8bi5sZW5ndGg/blt0LmxpbmUrMV06dGhpcy5fY29udGVudC5sZW5ndGg7cmV0dXJuIE1hdGgubWF4KE1hdGgubWluKHIrdC5jaGFyYWN0ZXIsaSkscil9Z2V0IGxpbmVDb3VudCgpe3JldHVybiB0aGlzLmdldExpbmVPZmZzZXRzKCkubGVuZ3RofXN0YXRpYyBpc0luY3JlbWVudGFsKHQpe2xldCBuPXQ7cmV0dXJuIG4hPW51bGwmJnR5cGVvZiBuLnRleHQ9PSJzdHJpbmciJiZuLnJhbmdlIT09dm9pZCAwJiYobi5yYW5nZUxlbmd0aD09PXZvaWQgMHx8dHlwZW9mIG4ucmFuZ2VMZW5ndGg9PSJudW1iZXIiKX1zdGF0aWMgaXNGdWxsKHQpe2xldCBuPXQ7cmV0dXJuIG4hPW51bGwmJnR5cGVvZiBuLnRleHQ9PSJzdHJpbmciJiZuLnJhbmdlPT09dm9pZCAwJiZuLnJhbmdlTGVuZ3RoPT09dm9pZCAwfX0sTWU7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoaSxzLGEsbCl7cmV0dXJuIG5ldyB3byhpLHMsYSxsKX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4oaSxzLGEpe2lmKGkgaW5zdGFuY2VvZiB3bylyZXR1cm4gaS51cGRhdGUocyxhKSxpO3Rocm93IG5ldyBFcnJvcigiVGV4dERvY3VtZW50LnVwZGF0ZTogZG9jdW1lbnQgbXVzdCBiZSBjcmVhdGVkIGJ5IFRleHREb2N1bWVudC5jcmVhdGUiKX1lLnVwZGF0ZT1uO2Z1bmN0aW9uIHIoaSxzKXtsZXQgYT1pLmdldFRleHQoKSxsPUdyKHMubWFwKGpjKSwoaCxmKT0+e2xldCBkPWgucmFuZ2Uuc3RhcnQubGluZS1mLnJhbmdlLnN0YXJ0LmxpbmU7cmV0dXJuIGQ9PT0wP2gucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyLWYucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyOmR9KSxvPTA7Y29uc3QgdT1bXTtmb3IoY29uc3QgaCBvZiBsKXtsZXQgZj1pLm9mZnNldEF0KGgucmFuZ2Uuc3RhcnQpO2lmKGY8byl0aHJvdyBuZXcgRXJyb3IoIk92ZXJsYXBwaW5nIGVkaXQiKTtmPm8mJnUucHVzaChhLnN1YnN0cmluZyhvLGYpKSxoLm5ld1RleHQubGVuZ3RoJiZ1LnB1c2goaC5uZXdUZXh0KSxvPWkub2Zmc2V0QXQoaC5yYW5nZS5lbmQpfXJldHVybiB1LnB1c2goYS5zdWJzdHIobykpLHUuam9pbigiIil9ZS5hcHBseUVkaXRzPXJ9KShNZXx8KE1lPXt9KSk7ZnVuY3Rpb24gR3IoZSx0KXtpZihlLmxlbmd0aDw9MSlyZXR1cm4gZTtjb25zdCBuPWUubGVuZ3RoLzJ8MCxyPWUuc2xpY2UoMCxuKSxpPWUuc2xpY2Uobik7R3Iocix0KSxHcihpLHQpO2xldCBzPTAsYT0wLGw9MDtmb3IoO3M8ci5sZW5ndGgmJmE8aS5sZW5ndGg7KXQocltzXSxpW2FdKTw9MD9lW2wrK109cltzKytdOmVbbCsrXT1pW2ErK107Zm9yKDtzPHIubGVuZ3RoOyllW2wrK109cltzKytdO2Zvcig7YTxpLmxlbmd0aDspZVtsKytdPWlbYSsrXTtyZXR1cm4gZX1mdW5jdGlvbiBfbyhlLHQsbj0wKXtjb25zdCByPXQ/W25dOltdO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtsZXQgcz1lLmNoYXJDb2RlQXQoaSk7KHM9PT0xM3x8cz09PTEwKSYmKHM9PT0xMyYmaSsxPGUubGVuZ3RoJiZlLmNoYXJDb2RlQXQoaSsxKT09PTEwJiZpKyssci5wdXNoKG4raSsxKSl9cmV0dXJuIHJ9ZnVuY3Rpb24gTG8oZSl7Y29uc3QgdD1lLnN0YXJ0LG49ZS5lbmQ7cmV0dXJuIHQubGluZT5uLmxpbmV8fHQubGluZT09PW4ubGluZSYmdC5jaGFyYWN0ZXI+bi5jaGFyYWN0ZXI/e3N0YXJ0Om4sZW5kOnR9OmV9ZnVuY3Rpb24gamMoZSl7Y29uc3QgdD1MbyhlLnJhbmdlKTtyZXR1cm4gdCE9PWUucmFuZ2U/e25ld1RleHQ6ZS5uZXdUZXh0LHJhbmdlOnR9OmV9dmFyIEg7KGZ1bmN0aW9uKGUpe2VbZS5VbmRlZmluZWQ9MF09IlVuZGVmaW5lZCIsZVtlLkVudW1WYWx1ZU1pc21hdGNoPTFdPSJFbnVtVmFsdWVNaXNtYXRjaCIsZVtlLkRlcHJlY2F0ZWQ9Ml09IkRlcHJlY2F0ZWQiLGVbZS5VbmV4cGVjdGVkRW5kT2ZDb21tZW50PTI1N109IlVuZXhwZWN0ZWRFbmRPZkNvbW1lbnQiLGVbZS5VbmV4cGVjdGVkRW5kT2ZTdHJpbmc9MjU4XT0iVW5leHBlY3RlZEVuZE9mU3RyaW5nIixlW2UuVW5leHBlY3RlZEVuZE9mTnVtYmVyPTI1OV09IlVuZXhwZWN0ZWRFbmRPZk51bWJlciIsZVtlLkludmFsaWRVbmljb2RlPTI2MF09IkludmFsaWRVbmljb2RlIixlW2UuSW52YWxpZEVzY2FwZUNoYXJhY3Rlcj0yNjFdPSJJbnZhbGlkRXNjYXBlQ2hhcmFjdGVyIixlW2UuSW52YWxpZENoYXJhY3Rlcj0yNjJdPSJJbnZhbGlkQ2hhcmFjdGVyIixlW2UuUHJvcGVydHlFeHBlY3RlZD01MTNdPSJQcm9wZXJ0eUV4cGVjdGVkIixlW2UuQ29tbWFFeHBlY3RlZD01MTRdPSJDb21tYUV4cGVjdGVkIixlW2UuQ29sb25FeHBlY3RlZD01MTVdPSJDb2xvbkV4cGVjdGVkIixlW2UuVmFsdWVFeHBlY3RlZD01MTZdPSJWYWx1ZUV4cGVjdGVkIixlW2UuQ29tbWFPckNsb3NlQmFja2V0RXhwZWN0ZWQ9NTE3XT0iQ29tbWFPckNsb3NlQmFja2V0RXhwZWN0ZWQiLGVbZS5Db21tYU9yQ2xvc2VCcmFjZUV4cGVjdGVkPTUxOF09IkNvbW1hT3JDbG9zZUJyYWNlRXhwZWN0ZWQiLGVbZS5UcmFpbGluZ0NvbW1hPTUxOV09IlRyYWlsaW5nQ29tbWEiLGVbZS5EdXBsaWNhdGVLZXk9NTIwXT0iRHVwbGljYXRlS2V5IixlW2UuQ29tbWVudE5vdFBlcm1pdHRlZD01MjFdPSJDb21tZW50Tm90UGVybWl0dGVkIixlW2UuUHJvcGVydHlLZXlzTXVzdEJlRG91YmxlcXVvdGVkPTUyOF09IlByb3BlcnR5S2V5c011c3RCZURvdWJsZXF1b3RlZCIsZVtlLlNjaGVtYVJlc29sdmVFcnJvcj03NjhdPSJTY2hlbWFSZXNvbHZlRXJyb3IiLGVbZS5TY2hlbWFVbnN1cHBvcnRlZEZlYXR1cmU9NzY5XT0iU2NoZW1hVW5zdXBwb3J0ZWRGZWF0dXJlIn0pKEh8fChIPXt9KSk7dmFyIENlOyhmdW5jdGlvbihlKXtlW2UudjM9M109InYzIixlW2UudjQ9NF09InY0IixlW2UudjY9Nl09InY2IixlW2Uudjc9N109InY3IixlW2UudjIwMTlfMDk9MTldPSJ2MjAxOV8wOSIsZVtlLnYyMDIwXzEyPTIwXT0idjIwMjBfMTIifSkoQ2V8fChDZT17fSkpO3ZhciBKcjsoZnVuY3Rpb24oZSl7ZS5MQVRFU1Q9e3RleHREb2N1bWVudDp7Y29tcGxldGlvbjp7Y29tcGxldGlvbkl0ZW06e2RvY3VtZW50YXRpb25Gb3JtYXQ6W290Lk1hcmtkb3duLG90LlBsYWluVGV4dF0sY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6ITAsbGFiZWxEZXRhaWxzU3VwcG9ydDohMH19fX19KShKcnx8KEpyPXt9KSk7ZnVuY3Rpb24gRSguLi5lKXtjb25zdCB0PWVbMF07bGV0IG4scixpO2lmKHR5cGVvZiB0PT0ic3RyaW5nIiluPXQscj10LGUuc3BsaWNlKDAsMSksaT0hZXx8dHlwZW9mIGVbMF0hPSJvYmplY3QiP2U6ZVswXTtlbHNlIGlmKHQgaW5zdGFuY2VvZiBBcnJheSl7Y29uc3Qgcz1lLnNsaWNlKDEpO2lmKHQubGVuZ3RoIT09cy5sZW5ndGgrMSl0aHJvdyBuZXcgRXJyb3IoImV4cGVjdGVkIGEgc3RyaW5nIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBsMTBuLnQiKTtsZXQgYT10WzBdO2ZvcihsZXQgbD0xO2w8dC5sZW5ndGg7bCsrKWErPWB7JHtsLTF9fWArdFtsXTtyZXR1cm4gRShhLC4uLnMpfWVsc2Ugcj10Lm1lc3NhZ2Usbj1yLHQuY29tbWVudCYmdC5jb21tZW50Lmxlbmd0aD4wJiYobis9YC8ke0FycmF5LmlzQXJyYXkodC5jb21tZW50KT90LmNvbW1lbnQuam9pbigiIik6dC5jb21tZW50fWApLGk9dC5hcmdzPz97fTtyZXR1cm4gSGMocixpKX12YXIgV2M9L3soW159XSspfS9nO2Z1bmN0aW9uIEhjKGUsdCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmxlbmd0aD09PTA/ZTplLnJlcGxhY2UoV2MsKG4scik9PnRbcl0/P24pfXZhciB6Yz17ImNvbG9yLWhleCI6e2Vycm9yTWVzc2FnZTpFKCJJbnZhbGlkIGNvbG9yIGZvcm1hdC4gVXNlICNSR0IsICNSR0JBLCAjUlJHR0JCIG9yICNSUkdHQkJBQS4iKSxwYXR0ZXJuOi9eIyhbMC05QS1GYS1mXXszLDR9fChbMC05QS1GYS1mXXsyfSl7Myw0fSkkL30sImRhdGUtdGltZSI6e2Vycm9yTWVzc2FnZTpFKCJTdHJpbmcgaXMgbm90IGEgUkZDMzMzOSBkYXRlLXRpbWUuIikscGF0dGVybjovXihcZHs0fSktKDBbMS05XXwxWzAtMl0pLSgwWzEtOV18WzEyXVswLTldfDNbMDFdKVQoWzAxXVswLTldfDJbMC0zXSk6KFswLTVdWzAtOV0pOihbMC01XVswLTldfDYwKShcLlswLTldKyk/KFp8KFwrfC0pKFswMV1bMC05XXwyWzAtM10pOihbMC01XVswLTldKSkkL2l9LGRhdGU6e2Vycm9yTWVzc2FnZTpFKCJTdHJpbmcgaXMgbm90IGEgUkZDMzMzOSBkYXRlLiIpLHBhdHRlcm46L14oXGR7NH0pLSgwWzEtOV18MVswLTJdKS0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSkkL2l9LHRpbWU6e2Vycm9yTWVzc2FnZTpFKCJTdHJpbmcgaXMgbm90IGEgUkZDMzMzOSB0aW1lLiIpLHBhdHRlcm46L14oWzAxXVswLTldfDJbMC0zXSk6KFswLTVdWzAtOV0pOihbMC01XVswLTldfDYwKShcLlswLTldKyk/KFp8KFwrfC0pKFswMV1bMC05XXwyWzAtM10pOihbMC01XVswLTldKSkkL2l9LGVtYWlsOntlcnJvck1lc3NhZ2U6RSgiU3RyaW5nIGlzIG5vdCBhbiBlLW1haWwgYWRkcmVzcy4iKSxwYXR0ZXJuOi9eKChbXjw+KClcW1xdXFwuLDs6XHNAIl0rKFwuW148PigpXFtcXVxcLiw7OlxzQCJdKykqKXwoIi4rIikpQCgoXFtbMC05XXsxLDN9XC5bMC05XXsxLDN9XC5bMC05XXsxLDN9XC5bMC05XXsxLDN9XSl8KChbYS16QS1aMC05LV0rXC4pK1thLXpBLVpdezIsfSkpJC99LGhvc3RuYW1lOntlcnJvck1lc3NhZ2U6RSgiU3RyaW5nIGlzIG5vdCBhIGhvc3RuYW1lLiIpLHBhdHRlcm46L14oPz0uezEsMjUzfVwuPyQpW2EtejAtOV0oPzpbYS16MC05LV17MCw2MX1bYS16MC05XSk/KD86XC5bYS16MC05XSg/OlstMC05YS16XXswLDYxfVswLTlhLXpdKT8pKlwuPyQvaX0saXB2NDp7ZXJyb3JNZXNzYWdlOkUoIlN0cmluZyBpcyBub3QgYW4gSVB2NCBhZGRyZXNzLiIpLHBhdHRlcm46L14oPzooPzoyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKVwuKXszfSg/OjI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpJC99LGlwdjY6e2Vycm9yTWVzc2FnZTpFKCJTdHJpbmcgaXMgbm90IGFuIElQdjYgYWRkcmVzcy4iKSxwYXR0ZXJuOi9eKCgoWzAtOWEtZl17MSw0fTopezd9KFswLTlhLWZdezEsNH18OikpfCgoWzAtOWEtZl17MSw0fTopezZ9KDpbMC05YS1mXXsxLDR9fCgoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KXw6KSl8KChbMC05YS1mXXsxLDR9Oil7NX0oKCg6WzAtOWEtZl17MSw0fSl7MSwyfSl8OigoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KXw6KSl8KChbMC05YS1mXXsxLDR9Oil7NH0oKCg6WzAtOWEtZl17MSw0fSl7MSwzfSl8KCg6WzAtOWEtZl17MSw0fSk/OigoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KSl8OikpfCgoWzAtOWEtZl17MSw0fTopezN9KCgoOlswLTlhLWZdezEsNH0pezEsNH0pfCgoOlswLTlhLWZdezEsNH0pezAsMn06KCgyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKShcLigyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKSl7M30pKXw6KSl8KChbMC05YS1mXXsxLDR9Oil7Mn0oKCg6WzAtOWEtZl17MSw0fSl7MSw1fSl8KCg6WzAtOWEtZl17MSw0fSl7MCwzfTooKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKFwuKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKXszfSkpfDopKXwoKFswLTlhLWZdezEsNH06KXsxfSgoKDpbMC05YS1mXXsxLDR9KXsxLDZ9KXwoKDpbMC05YS1mXXsxLDR9KXswLDR9OigoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KSl8OikpfCg6KCgoOlswLTlhLWZdezEsNH0pezEsN30pfCgoOlswLTlhLWZdezEsNH0pezAsNX06KCgyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKShcLigyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKSl7M30pKXw6KSkpJC9pfX0sbHQ9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG49MCl7dGhpcy5vZmZzZXQ9dCx0aGlzLmxlbmd0aD1uLHRoaXMucGFyZW50PWV9Z2V0IGNoaWxkcmVuKCl7cmV0dXJuW119dG9TdHJpbmcoKXtyZXR1cm4idHlwZTogIit0aGlzLnR5cGUrIiAoIit0aGlzLm9mZnNldCsiLyIrdGhpcy5sZW5ndGgrIikiKyh0aGlzLnBhcmVudD8iIHBhcmVudDogeyIrdGhpcy5wYXJlbnQudG9TdHJpbmcoKSsifSI6IiIpfX0sR2M9Y2xhc3MgZXh0ZW5kcyBsdHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksdGhpcy50eXBlPSJudWxsIix0aGlzLnZhbHVlPW51bGx9fSxObz1jbGFzcyBleHRlbmRzIGx0e2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihlLG4pLHRoaXMudHlwZT0iYm9vbGVhbiIsdGhpcy52YWx1ZT10fX0sSmM9Y2xhc3MgZXh0ZW5kcyBsdHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksdGhpcy50eXBlPSJhcnJheSIsdGhpcy5pdGVtcz1bXX1nZXQgY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5pdGVtc319LFhjPWNsYXNzIGV4dGVuZHMgbHR7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpLHRoaXMudHlwZT0ibnVtYmVyIix0aGlzLmlzSW50ZWdlcj0hMCx0aGlzLnZhbHVlPU51bWJlci5OYU59fSxYcj1jbGFzcyBleHRlbmRzIGx0e2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihlLHQsbiksdGhpcy50eXBlPSJzdHJpbmciLHRoaXMudmFsdWU9IiJ9fSxRYz1jbGFzcyBleHRlbmRzIGx0e2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihlLHQpLHRoaXMudHlwZT0icHJvcGVydHkiLHRoaXMuY29sb25PZmZzZXQ9LTEsdGhpcy5rZXlOb2RlPW59Z2V0IGNoaWxkcmVuKCl7cmV0dXJuIHRoaXMudmFsdWVOb2RlP1t0aGlzLmtleU5vZGUsdGhpcy52YWx1ZU5vZGVdOlt0aGlzLmtleU5vZGVdfX0sWWM9Y2xhc3MgZXh0ZW5kcyBsdHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksdGhpcy50eXBlPSJvYmplY3QiLHRoaXMucHJvcGVydGllcz1bXX1nZXQgY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5wcm9wZXJ0aWVzfX07ZnVuY3Rpb24gd2UoZSl7cmV0dXJuIFZlKGUpP2U/e306e25vdDp7fX06ZX12YXIgU287KGZ1bmN0aW9uKGUpe2VbZS5LZXk9MF09IktleSIsZVtlLkVudW09MV09IkVudW0ifSkoU298fChTbz17fSkpO3ZhciBaYz17Imh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDMvc2NoZW1hIyI6Q2UudjMsImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyI6Q2UudjQsImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDYvc2NoZW1hIyI6Q2UudjYsImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hIyI6Q2UudjcsImh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMTktMDkvc2NoZW1hIjpDZS52MjAxOV8wOSwiaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQvMjAyMC0xMi9zY2hlbWEiOkNlLnYyMDIwXzEyfSxBbz1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLnNjaGVtYURyYWZ0PWV9fSxLYz1jbGFzcyB6b3tjb25zdHJ1Y3Rvcih0PS0xLG4pe3RoaXMuZm9jdXNPZmZzZXQ9dCx0aGlzLmV4Y2x1ZGU9bix0aGlzLnNjaGVtYXM9W119YWRkKHQpe3RoaXMuc2NoZW1hcy5wdXNoKHQpfW1lcmdlKHQpe0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMuc2NoZW1hcyx0LnNjaGVtYXMpfWluY2x1ZGUodCl7cmV0dXJuKHRoaXMuZm9jdXNPZmZzZXQ9PT0tMXx8a28odCx0aGlzLmZvY3VzT2Zmc2V0KSkmJnQhPT10aGlzLmV4Y2x1ZGV9bmV3U3ViKCl7cmV0dXJuIG5ldyB6bygtMSx0aGlzLmV4Y2x1ZGUpfX0sS3Q9Y2xhc3N7Y29uc3RydWN0b3IoKXt9Z2V0IHNjaGVtYXMoKXtyZXR1cm5bXX1hZGQoZSl7fW1lcmdlKGUpe31pbmNsdWRlKGUpe3JldHVybiEwfW5ld1N1Yigpe3JldHVybiB0aGlzfX07S3QuaW5zdGFuY2U9bmV3IEt0O3ZhciBkZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMucHJvYmxlbXM9W10sdGhpcy5wcm9wZXJ0aWVzTWF0Y2hlcz0wLHRoaXMucHJvY2Vzc2VkUHJvcGVydGllcz1uZXcgU2V0LHRoaXMucHJvcGVydGllc1ZhbHVlTWF0Y2hlcz0wLHRoaXMucHJpbWFyeVZhbHVlTWF0Y2hlcz0wLHRoaXMuZW51bVZhbHVlTWF0Y2g9ITEsdGhpcy5lbnVtVmFsdWVzPXZvaWQgMH1oYXNQcm9ibGVtcygpe3JldHVybiEhdGhpcy5wcm9ibGVtcy5sZW5ndGh9bWVyZ2UoZSl7dGhpcy5wcm9ibGVtcz10aGlzLnByb2JsZW1zLmNvbmNhdChlLnByb2JsZW1zKSx0aGlzLnByb3BlcnRpZXNNYXRjaGVzKz1lLnByb3BlcnRpZXNNYXRjaGVzLHRoaXMucHJvcGVydGllc1ZhbHVlTWF0Y2hlcys9ZS5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzLHRoaXMubWVyZ2VQcm9jZXNzZWRQcm9wZXJ0aWVzKGUpfW1lcmdlRW51bVZhbHVlcyhlKXtpZighdGhpcy5lbnVtVmFsdWVNYXRjaCYmIWUuZW51bVZhbHVlTWF0Y2gmJnRoaXMuZW51bVZhbHVlcyYmZS5lbnVtVmFsdWVzKXt0aGlzLmVudW1WYWx1ZXM9dGhpcy5lbnVtVmFsdWVzLmNvbmNhdChlLmVudW1WYWx1ZXMpO2Zvcihjb25zdCB0IG9mIHRoaXMucHJvYmxlbXMpdC5jb2RlPT09SC5FbnVtVmFsdWVNaXNtYXRjaCYmKHQubWVzc2FnZT1FKCJWYWx1ZSBpcyBub3QgYWNjZXB0ZWQuIFZhbGlkIHZhbHVlczogezB9LiIsdGhpcy5lbnVtVmFsdWVzLm1hcChuPT5KU09OLnN0cmluZ2lmeShuKSkuam9pbigiLCAiKSkpfX1tZXJnZVByb3BlcnR5TWF0Y2goZSl7dGhpcy5wcm9ibGVtcz10aGlzLnByb2JsZW1zLmNvbmNhdChlLnByb2JsZW1zKSx0aGlzLnByb3BlcnRpZXNNYXRjaGVzKyssKGUuZW51bVZhbHVlTWF0Y2h8fCFlLmhhc1Byb2JsZW1zKCkmJmUucHJvcGVydGllc01hdGNoZXMpJiZ0aGlzLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMrKyxlLmVudW1WYWx1ZU1hdGNoJiZlLmVudW1WYWx1ZXMmJmUuZW51bVZhbHVlcy5sZW5ndGg9PT0xJiZ0aGlzLnByaW1hcnlWYWx1ZU1hdGNoZXMrK31tZXJnZVByb2Nlc3NlZFByb3BlcnRpZXMoZSl7ZS5wcm9jZXNzZWRQcm9wZXJ0aWVzLmZvckVhY2godD0+dGhpcy5wcm9jZXNzZWRQcm9wZXJ0aWVzLmFkZCh0KSl9Y29tcGFyZShlKXtjb25zdCB0PXRoaXMuaGFzUHJvYmxlbXMoKTtyZXR1cm4gdCE9PWUuaGFzUHJvYmxlbXMoKT90Py0xOjE6dGhpcy5lbnVtVmFsdWVNYXRjaCE9PWUuZW51bVZhbHVlTWF0Y2g/ZS5lbnVtVmFsdWVNYXRjaD8tMToxOnRoaXMucHJpbWFyeVZhbHVlTWF0Y2hlcyE9PWUucHJpbWFyeVZhbHVlTWF0Y2hlcz90aGlzLnByaW1hcnlWYWx1ZU1hdGNoZXMtZS5wcmltYXJ5VmFsdWVNYXRjaGVzOnRoaXMucHJvcGVydGllc1ZhbHVlTWF0Y2hlcyE9PWUucHJvcGVydGllc1ZhbHVlTWF0Y2hlcz90aGlzLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMtZS5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzOnRoaXMucHJvcGVydGllc01hdGNoZXMtZS5wcm9wZXJ0aWVzTWF0Y2hlc319O2Z1bmN0aW9uIGUxKGUsdD1bXSl7cmV0dXJuIG5ldyBSbyhlLHQsW10pfWZ1bmN0aW9uIHV0KGUpe3JldHVybiAkYyhlKX1mdW5jdGlvbiBRcihlKXtyZXR1cm4gT2MoZSl9ZnVuY3Rpb24ga28oZSx0LG49ITEpe3JldHVybiB0Pj1lLm9mZnNldCYmdDxlLm9mZnNldCtlLmxlbmd0aHx8biYmdD09PWUub2Zmc2V0K2UubGVuZ3RofXZhciBSbz1jbGFzc3tjb25zdHJ1Y3RvcihlLHQ9W10sbj1bXSl7dGhpcy5yb290PWUsdGhpcy5zeW50YXhFcnJvcnM9dCx0aGlzLmNvbW1lbnRzPW59Z2V0Tm9kZUZyb21PZmZzZXQoZSx0PSExKXtpZih0aGlzLnJvb3QpcmV0dXJuIERjKHRoaXMucm9vdCxlLHQpfXZpc2l0KGUpe2lmKHRoaXMucm9vdCl7Y29uc3QgdD1uPT57bGV0IHI9ZShuKTtjb25zdCBpPW4uY2hpbGRyZW47aWYoQXJyYXkuaXNBcnJheShpKSlmb3IobGV0IHM9MDtzPGkubGVuZ3RoJiZyO3MrKylyPXQoaVtzXSk7cmV0dXJuIHJ9O3QodGhpcy5yb290KX19dmFsaWRhdGUoZSx0LG49eGUuV2FybmluZyxyKXtpZih0aGlzLnJvb3QmJnQpe2NvbnN0IGk9bmV3IGRlO3JldHVybiBsZSh0aGlzLnJvb3QsdCxpLEt0Lmluc3RhbmNlLG5ldyBBbyhyPz9Fbyh0KSkpLGkucHJvYmxlbXMubWFwKHM9Pntjb25zdCBhPXEuY3JlYXRlKGUucG9zaXRpb25BdChzLmxvY2F0aW9uLm9mZnNldCksZS5wb3NpdGlvbkF0KHMubG9jYXRpb24ub2Zmc2V0K3MubG9jYXRpb24ubGVuZ3RoKSk7cmV0dXJuIHplLmNyZWF0ZShhLHMubWVzc2FnZSxzLnNldmVyaXR5Pz9uLHMuY29kZSl9KX19Z2V0TWF0Y2hpbmdTY2hlbWFzKGUsdD0tMSxuKXtpZih0aGlzLnJvb3QmJmUpe2NvbnN0IHI9bmV3IEtjKHQsbiksaT1FbyhlKSxzPW5ldyBBbyhpKTtyZXR1cm4gbGUodGhpcy5yb290LGUsbmV3IGRlLHIscyksci5zY2hlbWFzfXJldHVybltdfX07ZnVuY3Rpb24gRW8oZSx0PUNlLnYyMDIwXzEyKXtsZXQgbj1lLiRzY2hlbWE7cmV0dXJuIG4/WmNbbl0/P3Q6dH1mdW5jdGlvbiBsZShlLHQsbixyLGkpe2lmKCFlfHwhci5pbmNsdWRlKGUpKXJldHVybjtpZihlLnR5cGU9PT0icHJvcGVydHkiKXJldHVybiBsZShlLnZhbHVlTm9kZSx0LG4scixpKTtjb25zdCBzPWU7c3dpdGNoKGEoKSxzLnR5cGUpe2Nhc2Uib2JqZWN0IjpoKHMpO2JyZWFrO2Nhc2UiYXJyYXkiOnUocyk7YnJlYWs7Y2FzZSJzdHJpbmciOm8ocyk7YnJlYWs7Y2FzZSJudW1iZXIiOmwocyk7YnJlYWt9ci5hZGQoe25vZGU6cyxzY2hlbWE6dH0pO2Z1bmN0aW9uIGEoKXt2YXIgTDtmdW5jdGlvbiBmKHYpe3JldHVybiBzLnR5cGU9PT12fHx2PT09ImludGVnZXIiJiZzLnR5cGU9PT0ibnVtYmVyIiYmcy5pc0ludGVnZXJ9aWYoQXJyYXkuaXNBcnJheSh0LnR5cGUpP3QudHlwZS5zb21lKGYpfHxuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6cy5vZmZzZXQsbGVuZ3RoOnMubGVuZ3RofSxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxFKCJJbmNvcnJlY3QgdHlwZS4gRXhwZWN0ZWQgb25lIG9mIHswfS4iLHQudHlwZS5qb2luKCIsICIpKX0pOnQudHlwZSYmKGYodC50eXBlKXx8bi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OnMub2Zmc2V0LGxlbmd0aDpzLmxlbmd0aH0sbWVzc2FnZTp0LmVycm9yTWVzc2FnZXx8RSgnSW5jb3JyZWN0IHR5cGUuIEV4cGVjdGVkICJ7MH0iLicsdC50eXBlKX0pKSxBcnJheS5pc0FycmF5KHQuYWxsT2YpKWZvcihjb25zdCB2IG9mIHQuYWxsT2Ype2NvbnN0IHk9bmV3IGRlLGI9ci5uZXdTdWIoKTtsZShzLHdlKHYpLHksYixpKSxuLm1lcmdlKHkpLHIubWVyZ2UoYil9Y29uc3QgZD13ZSh0Lm5vdCk7aWYoZCl7Y29uc3Qgdj1uZXcgZGUseT1yLm5ld1N1YigpO2xlKHMsZCx2LHksaSksdi5oYXNQcm9ibGVtcygpfHxuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6cy5vZmZzZXQsbGVuZ3RoOnMubGVuZ3RofSxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxFKCJNYXRjaGVzIGEgc2NoZW1hIHRoYXQgaXMgbm90IGFsbG93ZWQuIil9KTtmb3IoY29uc3QgYiBvZiB5LnNjaGVtYXMpYi5pbnZlcnRlZD0hYi5pbnZlcnRlZCxyLmFkZChiKX1jb25zdCBtPSh2LHkpPT57Y29uc3QgYj1bXTtsZXQgXztmb3IoY29uc3QgQSBvZiB2KXtjb25zdCBDPXdlKEEpLEY9bmV3IGRlLE89ci5uZXdTdWIoKTtpZihsZShzLEMsRixPLGkpLEYuaGFzUHJvYmxlbXMoKXx8Yi5wdXNoKEMpLCFfKV89e3NjaGVtYTpDLHZhbGlkYXRpb25SZXN1bHQ6RixtYXRjaGluZ1NjaGVtYXM6T307ZWxzZSBpZigheSYmIUYuaGFzUHJvYmxlbXMoKSYmIV8udmFsaWRhdGlvblJlc3VsdC5oYXNQcm9ibGVtcygpKV8ubWF0Y2hpbmdTY2hlbWFzLm1lcmdlKE8pLF8udmFsaWRhdGlvblJlc3VsdC5wcm9wZXJ0aWVzTWF0Y2hlcys9Ri5wcm9wZXJ0aWVzTWF0Y2hlcyxfLnZhbGlkYXRpb25SZXN1bHQucHJvcGVydGllc1ZhbHVlTWF0Y2hlcys9Ri5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzLF8udmFsaWRhdGlvblJlc3VsdC5tZXJnZVByb2Nlc3NlZFByb3BlcnRpZXMoRik7ZWxzZXtjb25zdCBNPUYuY29tcGFyZShfLnZhbGlkYXRpb25SZXN1bHQpO00+MD9fPXtzY2hlbWE6Qyx2YWxpZGF0aW9uUmVzdWx0OkYsbWF0Y2hpbmdTY2hlbWFzOk99Ok09PT0wJiYoXy5tYXRjaGluZ1NjaGVtYXMubWVyZ2UoTyksXy52YWxpZGF0aW9uUmVzdWx0Lm1lcmdlRW51bVZhbHVlcyhGKSl9fXJldHVybiBiLmxlbmd0aD4xJiZ5JiZuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6cy5vZmZzZXQsbGVuZ3RoOjF9LG1lc3NhZ2U6RSgiTWF0Y2hlcyBtdWx0aXBsZSBzY2hlbWFzIHdoZW4gb25seSBvbmUgbXVzdCB2YWxpZGF0ZS4iKX0pLF8mJihuLm1lcmdlKF8udmFsaWRhdGlvblJlc3VsdCksci5tZXJnZShfLm1hdGNoaW5nU2NoZW1hcykpLGIubGVuZ3RofTtBcnJheS5pc0FycmF5KHQuYW55T2YpJiZtKHQuYW55T2YsITEpLEFycmF5LmlzQXJyYXkodC5vbmVPZikmJm0odC5vbmVPZiwhMCk7Y29uc3QgZz12PT57Y29uc3QgeT1uZXcgZGUsYj1yLm5ld1N1YigpO2xlKHMsd2UodikseSxiLGkpLG4ubWVyZ2UoeSksci5tZXJnZShiKX0scD0odix5LGIpPT57Y29uc3QgXz13ZSh2KSxBPW5ldyBkZSxDPXIubmV3U3ViKCk7bGUocyxfLEEsQyxpKSxyLm1lcmdlKEMpLG4ubWVyZ2VQcm9jZXNzZWRQcm9wZXJ0aWVzKEEpLEEuaGFzUHJvYmxlbXMoKT9iJiZnKGIpOnkmJmcoeSl9LHg9d2UodC5pZik7aWYoeCYmcCh4LHdlKHQudGhlbiksd2UodC5lbHNlKSksQXJyYXkuaXNBcnJheSh0LmVudW0pKXtjb25zdCB2PXV0KHMpO2xldCB5PSExO2Zvcihjb25zdCBiIG9mIHQuZW51bSlpZihSdCh2LGIpKXt5PSEwO2JyZWFrfW4uZW51bVZhbHVlcz10LmVudW0sbi5lbnVtVmFsdWVNYXRjaD15LHl8fG4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpzLm9mZnNldCxsZW5ndGg6cy5sZW5ndGh9LGNvZGU6SC5FbnVtVmFsdWVNaXNtYXRjaCxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxFKCJWYWx1ZSBpcyBub3QgYWNjZXB0ZWQuIFZhbGlkIHZhbHVlczogezB9LiIsdC5lbnVtLm1hcChiPT5KU09OLnN0cmluZ2lmeShiKSkuam9pbigiLCAiKSl9KX1pZihFZSh0LmNvbnN0KSl7Y29uc3Qgdj11dChzKTtSdCh2LHQuY29uc3QpP24uZW51bVZhbHVlTWF0Y2g9ITA6KG4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpzLm9mZnNldCxsZW5ndGg6cy5sZW5ndGh9LGNvZGU6SC5FbnVtVmFsdWVNaXNtYXRjaCxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxFKCJWYWx1ZSBtdXN0IGJlIHswfS4iLEpTT04uc3RyaW5naWZ5KHQuY29uc3QpKX0pLG4uZW51bVZhbHVlTWF0Y2g9ITEpLG4uZW51bVZhbHVlcz1bdC5jb25zdF19bGV0IHc9dC5kZXByZWNhdGlvbk1lc3NhZ2U7aWYod3x8dC5kZXByZWNhdGVkKXt3PXd8fEUoIlZhbHVlIGlzIGRlcHJlY2F0ZWQiKTtsZXQgdj0oKEw9cy5wYXJlbnQpPT1udWxsP3ZvaWQgMDpMLnR5cGUpPT09InByb3BlcnR5Ij9zLnBhcmVudDpzO24ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDp2Lm9mZnNldCxsZW5ndGg6di5sZW5ndGh9LHNldmVyaXR5OnhlLldhcm5pbmcsbWVzc2FnZTp3LGNvZGU6SC5EZXByZWNhdGVkfSl9fWZ1bmN0aW9uIGwoZil7Y29uc3QgZD1mLnZhbHVlO2Z1bmN0aW9uIG0oeSl7dmFyIF87Y29uc3QgYj0vXigtP1xkKykoPzpcLihcZCspKT8oPzplKFstK11cZCspKT8kLy5leGVjKHkudG9TdHJpbmcoKSk7cmV0dXJuIGImJnt2YWx1ZTpOdW1iZXIoYlsxXSsoYlsyXXx8IiIpKSxtdWx0aXBsaWVyOigoKF89YlsyXSk9PW51bGw/dm9pZCAwOl8ubGVuZ3RoKXx8MCktKHBhcnNlSW50KGJbM10pfHwwKX19aWYoaGUodC5tdWx0aXBsZU9mKSl7bGV0IHk9LTE7aWYoTnVtYmVyLmlzSW50ZWdlcih0Lm11bHRpcGxlT2YpKXk9ZCV0Lm11bHRpcGxlT2Y7ZWxzZXtsZXQgYj1tKHQubXVsdGlwbGVPZiksXz1tKGQpO2lmKGImJl8pe2NvbnN0IEE9MTAqKk1hdGguYWJzKF8ubXVsdGlwbGllci1iLm11bHRpcGxpZXIpO18ubXVsdGlwbGllcjxiLm11bHRpcGxpZXI/Xy52YWx1ZSo9QTpiLnZhbHVlKj1BLHk9Xy52YWx1ZSViLnZhbHVlfX15IT09MCYmbi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmYub2Zmc2V0LGxlbmd0aDpmLmxlbmd0aH0sbWVzc2FnZTpFKCJWYWx1ZSBpcyBub3QgZGl2aXNpYmxlIGJ5IHswfS4iLHQubXVsdGlwbGVPZil9KX1mdW5jdGlvbiBnKHksYil7aWYoaGUoYikpcmV0dXJuIGI7aWYoVmUoYikmJmIpcmV0dXJuIHl9ZnVuY3Rpb24gcCh5LGIpe2lmKCFWZShiKXx8IWIpcmV0dXJuIHl9Y29uc3QgeD1nKHQubWluaW11bSx0LmV4Y2x1c2l2ZU1pbmltdW0pO2hlKHgpJiZkPD14JiZuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOkUoIlZhbHVlIGlzIGJlbG93IHRoZSBleGNsdXNpdmUgbWluaW11bSBvZiB7MH0uIix4KX0pO2NvbnN0IHc9Zyh0Lm1heGltdW0sdC5leGNsdXNpdmVNYXhpbXVtKTtoZSh3KSYmZD49dyYmbi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmYub2Zmc2V0LGxlbmd0aDpmLmxlbmd0aH0sbWVzc2FnZTpFKCJWYWx1ZSBpcyBhYm92ZSB0aGUgZXhjbHVzaXZlIG1heGltdW0gb2YgezB9LiIsdyl9KTtjb25zdCBMPXAodC5taW5pbXVtLHQuZXhjbHVzaXZlTWluaW11bSk7aGUoTCkmJmQ8TCYmbi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmYub2Zmc2V0LGxlbmd0aDpmLmxlbmd0aH0sbWVzc2FnZTpFKCJWYWx1ZSBpcyBiZWxvdyB0aGUgbWluaW11bSBvZiB7MH0uIixMKX0pO2NvbnN0IHY9cCh0Lm1heGltdW0sdC5leGNsdXNpdmVNYXhpbXVtKTtoZSh2KSYmZD52JiZuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOkUoIlZhbHVlIGlzIGFib3ZlIHRoZSBtYXhpbXVtIG9mIHswfS4iLHYpfSl9ZnVuY3Rpb24gbyhmKXtpZihoZSh0Lm1pbkxlbmd0aCkmJlNhKGYudmFsdWUpPHQubWluTGVuZ3RoJiZuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOkUoIlN0cmluZyBpcyBzaG9ydGVyIHRoYW4gdGhlIG1pbmltdW0gbGVuZ3RoIG9mIHswfS4iLHQubWluTGVuZ3RoKX0pLGhlKHQubWF4TGVuZ3RoKSYmU2EoZi52YWx1ZSk+dC5tYXhMZW5ndGgmJm4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpmLm9mZnNldCxsZW5ndGg6Zi5sZW5ndGh9LG1lc3NhZ2U6RSgiU3RyaW5nIGlzIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB7MH0uIix0Lm1heExlbmd0aCl9KSxOYSh0LnBhdHRlcm4pKXtjb25zdCBkPVJuKHQucGF0dGVybik7ZCE9bnVsbCYmZC50ZXN0KGYudmFsdWUpfHxuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOnQucGF0dGVybkVycm9yTWVzc2FnZXx8dC5lcnJvck1lc3NhZ2V8fEUoJ1N0cmluZyBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVybiBvZiAiezB9Ii4nLHQucGF0dGVybil9KX1pZih0LmZvcm1hdClzd2l0Y2godC5mb3JtYXQpe2Nhc2UidXJpIjpjYXNlInVyaS1yZWZlcmVuY2UiOntsZXQgbTtpZighZi52YWx1ZSltPUUoIlVSSSBleHBlY3RlZC4iKTtlbHNle2NvbnN0IGc9L14oKFteOi8/I10rPyk6KT8oXC9cLyhbXi8/I10qKSk/KFtePyNdKikoXD8oW14jXSopKT8oIyguKikpPy8uZXhlYyhmLnZhbHVlKTtnPyFnWzJdJiZ0LmZvcm1hdD09PSJ1cmkiJiYobT1FKCJVUkkgd2l0aCBhIHNjaGVtZSBpcyBleHBlY3RlZC4iKSk6bT1FKCJVUkkgaXMgZXhwZWN0ZWQuIil9bSYmbi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmYub2Zmc2V0LGxlbmd0aDpmLmxlbmd0aH0sbWVzc2FnZTp0LnBhdHRlcm5FcnJvck1lc3NhZ2V8fHQuZXJyb3JNZXNzYWdlfHxFKCJTdHJpbmcgaXMgbm90IGEgVVJJOiB7MH0iLG0pfSl9YnJlYWs7Y2FzZSJjb2xvci1oZXgiOmNhc2UiZGF0ZS10aW1lIjpjYXNlImRhdGUiOmNhc2UidGltZSI6Y2FzZSJlbWFpbCI6Y2FzZSJob3N0bmFtZSI6Y2FzZSJpcHY0IjpjYXNlImlwdjYiOmNvbnN0IGQ9emNbdC5mb3JtYXRdOyghZi52YWx1ZXx8IWQucGF0dGVybi5leGVjKGYudmFsdWUpKSYmbi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmYub2Zmc2V0LGxlbmd0aDpmLmxlbmd0aH0sbWVzc2FnZTp0LnBhdHRlcm5FcnJvck1lc3NhZ2V8fHQuZXJyb3JNZXNzYWdlfHxkLmVycm9yTWVzc2FnZX0pfX1mdW5jdGlvbiB1KGYpe2xldCBkLG07aS5zY2hlbWFEcmFmdD49Q2UudjIwMjBfMTI/KGQ9dC5wcmVmaXhJdGVtcyxtPUFycmF5LmlzQXJyYXkodC5pdGVtcyk/dm9pZCAwOnQuaXRlbXMpOihkPUFycmF5LmlzQXJyYXkodC5pdGVtcyk/dC5pdGVtczp2b2lkIDAsbT1BcnJheS5pc0FycmF5KHQuaXRlbXMpP3QuYWRkaXRpb25hbEl0ZW1zOnQuaXRlbXMpO2xldCBnPTA7aWYoZCE9PXZvaWQgMCl7Y29uc3Qgdz1NYXRoLm1pbihkLmxlbmd0aCxmLml0ZW1zLmxlbmd0aCk7Zm9yKDtnPHc7ZysrKXtjb25zdCBMPWRbZ10sdj13ZShMKSx5PW5ldyBkZSxiPWYuaXRlbXNbZ107YiYmKGxlKGIsdix5LHIsaSksbi5tZXJnZVByb3BlcnR5TWF0Y2goeSkpLG4ucHJvY2Vzc2VkUHJvcGVydGllcy5hZGQoU3RyaW5nKGcpKX19aWYobSE9PXZvaWQgMCYmZzxmLml0ZW1zLmxlbmd0aClpZih0eXBlb2YgbT09ImJvb2xlYW4iKWZvcihtPT09ITEmJm4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpmLm9mZnNldCxsZW5ndGg6Zi5sZW5ndGh9LG1lc3NhZ2U6RSgiQXJyYXkgaGFzIHRvbyBtYW55IGl0ZW1zIGFjY29yZGluZyB0byBzY2hlbWEuIEV4cGVjdGVkIHswfSBvciBmZXdlci4iLGcpfSk7ZzxmLml0ZW1zLmxlbmd0aDtnKyspbi5wcm9jZXNzZWRQcm9wZXJ0aWVzLmFkZChTdHJpbmcoZykpLG4ucHJvcGVydGllc1ZhbHVlTWF0Y2hlcysrO2Vsc2UgZm9yKDtnPGYuaXRlbXMubGVuZ3RoO2crKyl7Y29uc3Qgdz1uZXcgZGU7bGUoZi5pdGVtc1tnXSxtLHcscixpKSxuLm1lcmdlUHJvcGVydHlNYXRjaCh3KSxuLnByb2Nlc3NlZFByb3BlcnRpZXMuYWRkKFN0cmluZyhnKSl9Y29uc3QgcD13ZSh0LmNvbnRhaW5zKTtpZihwKXtsZXQgdz0wO2ZvcihsZXQgTD0wO0w8Zi5pdGVtcy5sZW5ndGg7TCsrKXtjb25zdCB2PWYuaXRlbXNbTF0seT1uZXcgZGU7bGUodixwLHksS3QuaW5zdGFuY2UsaSkseS5oYXNQcm9ibGVtcygpfHwodysrLGkuc2NoZW1hRHJhZnQ+PUNlLnYyMDIwXzEyJiZuLnByb2Nlc3NlZFByb3BlcnRpZXMuYWRkKFN0cmluZyhMKSkpfXc9PT0wJiYhaGUodC5taW5Db250YWlucykmJm4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpmLm9mZnNldCxsZW5ndGg6Zi5sZW5ndGh9LG1lc3NhZ2U6dC5lcnJvck1lc3NhZ2V8fEUoIkFycmF5IGRvZXMgbm90IGNvbnRhaW4gcmVxdWlyZWQgaXRlbS4iKX0pLGhlKHQubWluQ29udGFpbnMpJiZ3PHQubWluQ29udGFpbnMmJm4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpmLm9mZnNldCxsZW5ndGg6Zi5sZW5ndGh9LG1lc3NhZ2U6dC5lcnJvck1lc3NhZ2V8fEUoIkFycmF5IGhhcyB0b28gZmV3IGl0ZW1zIHRoYXQgbWF0Y2ggdGhlIGNvbnRhaW5zIGNvbnRyYWludC4gRXhwZWN0ZWQgezB9IG9yIG1vcmUuIix0Lm1pbkNvbnRhaW5zKX0pLGhlKHQubWF4Q29udGFpbnMpJiZ3PnQubWF4Q29udGFpbnMmJm4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpmLm9mZnNldCxsZW5ndGg6Zi5sZW5ndGh9LG1lc3NhZ2U6dC5lcnJvck1lc3NhZ2V8fEUoIkFycmF5IGhhcyB0b28gbWFueSBpdGVtcyB0aGF0IG1hdGNoIHRoZSBjb250YWlucyBjb250cmFpbnQuIEV4cGVjdGVkIHswfSBvciBsZXNzLiIsdC5tYXhDb250YWlucyl9KX1jb25zdCB4PXQudW5ldmFsdWF0ZWRJdGVtcztpZih4IT09dm9pZCAwKWZvcihsZXQgdz0wO3c8Zi5pdGVtcy5sZW5ndGg7dysrKXtpZighbi5wcm9jZXNzZWRQcm9wZXJ0aWVzLmhhcyhTdHJpbmcodykpKWlmKHg9PT0hMSluLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOkUoIkl0ZW0gZG9lcyBub3QgbWF0Y2ggYW55IHZhbGlkYXRpb24gcnVsZSBmcm9tIHRoZSBhcnJheS4iKX0pO2Vsc2V7Y29uc3QgTD1uZXcgZGU7bGUoZi5pdGVtc1t3XSx0LnVuZXZhbHVhdGVkSXRlbXMsTCxyLGkpLG4ubWVyZ2VQcm9wZXJ0eU1hdGNoKEwpfW4ucHJvY2Vzc2VkUHJvcGVydGllcy5hZGQoU3RyaW5nKHcpKSxuLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMrK31pZihoZSh0Lm1pbkl0ZW1zKSYmZi5pdGVtcy5sZW5ndGg8dC5taW5JdGVtcyYmbi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmYub2Zmc2V0LGxlbmd0aDpmLmxlbmd0aH0sbWVzc2FnZTpFKCJBcnJheSBoYXMgdG9vIGZldyBpdGVtcy4gRXhwZWN0ZWQgezB9IG9yIG1vcmUuIix0Lm1pbkl0ZW1zKX0pLGhlKHQubWF4SXRlbXMpJiZmLml0ZW1zLmxlbmd0aD50Lm1heEl0ZW1zJiZuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOkUoIkFycmF5IGhhcyB0b28gbWFueSBpdGVtcy4gRXhwZWN0ZWQgezB9IG9yIGZld2VyLiIsdC5tYXhJdGVtcyl9KSx0LnVuaXF1ZUl0ZW1zPT09ITApe2xldCB3PWZ1bmN0aW9uKCl7Zm9yKGxldCB2PTA7djxMLmxlbmd0aC0xO3YrKyl7Y29uc3QgeT1MW3ZdO2ZvcihsZXQgYj12KzE7YjxMLmxlbmd0aDtiKyspaWYoUnQoeSxMW2JdKSlyZXR1cm4hMH1yZXR1cm4hMX07Y29uc3QgTD11dChmKTt3KCkmJm4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpmLm9mZnNldCxsZW5ndGg6Zi5sZW5ndGh9LG1lc3NhZ2U6RSgiQXJyYXkgaGFzIGR1cGxpY2F0ZSBpdGVtcy4iKX0pfX1mdW5jdGlvbiBoKGYpe2NvbnN0IGQ9T2JqZWN0LmNyZWF0ZShudWxsKSxtPW5ldyBTZXQ7Zm9yKGNvbnN0IHYgb2YgZi5wcm9wZXJ0aWVzKXtjb25zdCB5PXYua2V5Tm9kZS52YWx1ZTtkW3ldPXYudmFsdWVOb2RlLG0uYWRkKHkpfWlmKEFycmF5LmlzQXJyYXkodC5yZXF1aXJlZCkpe2Zvcihjb25zdCB2IG9mIHQucmVxdWlyZWQpaWYoIWRbdl0pe2NvbnN0IHk9Zi5wYXJlbnQmJmYucGFyZW50LnR5cGU9PT0icHJvcGVydHkiJiZmLnBhcmVudC5rZXlOb2RlLGI9eT97b2Zmc2V0Onkub2Zmc2V0LGxlbmd0aDp5Lmxlbmd0aH06e29mZnNldDpmLm9mZnNldCxsZW5ndGg6MX07bi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjpiLG1lc3NhZ2U6RSgnTWlzc2luZyBwcm9wZXJ0eSAiezB9Ii4nLHYpfSl9fWNvbnN0IGc9dj0+e20uZGVsZXRlKHYpLG4ucHJvY2Vzc2VkUHJvcGVydGllcy5hZGQodil9O2lmKHQucHJvcGVydGllcylmb3IoY29uc3QgdiBvZiBPYmplY3Qua2V5cyh0LnByb3BlcnRpZXMpKXtnKHYpO2NvbnN0IHk9dC5wcm9wZXJ0aWVzW3ZdLGI9ZFt2XTtpZihiKWlmKFZlKHkpKWlmKHkpbi5wcm9wZXJ0aWVzTWF0Y2hlcysrLG4ucHJvcGVydGllc1ZhbHVlTWF0Y2hlcysrO2Vsc2V7Y29uc3QgXz1iLnBhcmVudDtuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Xy5rZXlOb2RlLm9mZnNldCxsZW5ndGg6Xy5rZXlOb2RlLmxlbmd0aH0sbWVzc2FnZTp0LmVycm9yTWVzc2FnZXx8RSgiUHJvcGVydHkgezB9IGlzIG5vdCBhbGxvd2VkLiIsdil9KX1lbHNle2NvbnN0IF89bmV3IGRlO2xlKGIseSxfLHIsaSksbi5tZXJnZVByb3BlcnR5TWF0Y2goXyl9fWlmKHQucGF0dGVyblByb3BlcnRpZXMpZm9yKGNvbnN0IHYgb2YgT2JqZWN0LmtleXModC5wYXR0ZXJuUHJvcGVydGllcykpe2NvbnN0IHk9Um4odik7aWYoeSl7Y29uc3QgYj1bXTtmb3IoY29uc3QgXyBvZiBtKWlmKHkudGVzdChfKSl7Yi5wdXNoKF8pO2NvbnN0IEE9ZFtfXTtpZihBKXtjb25zdCBDPXQucGF0dGVyblByb3BlcnRpZXNbdl07aWYoVmUoQykpaWYoQyluLnByb3BlcnRpZXNNYXRjaGVzKyssbi5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzKys7ZWxzZXtjb25zdCBGPUEucGFyZW50O24ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpGLmtleU5vZGUub2Zmc2V0LGxlbmd0aDpGLmtleU5vZGUubGVuZ3RofSxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxFKCJQcm9wZXJ0eSB7MH0gaXMgbm90IGFsbG93ZWQuIixfKX0pfWVsc2V7Y29uc3QgRj1uZXcgZGU7bGUoQSxDLEYscixpKSxuLm1lcmdlUHJvcGVydHlNYXRjaChGKX19fWIuZm9yRWFjaChnKX19Y29uc3QgcD10LmFkZGl0aW9uYWxQcm9wZXJ0aWVzO2lmKHAhPT12b2lkIDApZm9yKGNvbnN0IHYgb2YgbSl7Zyh2KTtjb25zdCB5PWRbdl07aWYoeSl7aWYocD09PSExKXtjb25zdCBiPXkucGFyZW50O24ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpiLmtleU5vZGUub2Zmc2V0LGxlbmd0aDpiLmtleU5vZGUubGVuZ3RofSxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxFKCJQcm9wZXJ0eSB7MH0gaXMgbm90IGFsbG93ZWQuIix2KX0pfWVsc2UgaWYocCE9PSEwKXtjb25zdCBiPW5ldyBkZTtsZSh5LHAsYixyLGkpLG4ubWVyZ2VQcm9wZXJ0eU1hdGNoKGIpfX19Y29uc3QgeD10LnVuZXZhbHVhdGVkUHJvcGVydGllcztpZih4IT09dm9pZCAwKXtjb25zdCB2PVtdO2Zvcihjb25zdCB5IG9mIG0paWYoIW4ucHJvY2Vzc2VkUHJvcGVydGllcy5oYXMoeSkpe3YucHVzaCh5KTtjb25zdCBiPWRbeV07aWYoYil7aWYoeD09PSExKXtjb25zdCBfPWIucGFyZW50O24ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpfLmtleU5vZGUub2Zmc2V0LGxlbmd0aDpfLmtleU5vZGUubGVuZ3RofSxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxFKCJQcm9wZXJ0eSB7MH0gaXMgbm90IGFsbG93ZWQuIix5KX0pfWVsc2UgaWYoeCE9PSEwKXtjb25zdCBfPW5ldyBkZTtsZShiLHgsXyxyLGkpLG4ubWVyZ2VQcm9wZXJ0eU1hdGNoKF8pfX19di5mb3JFYWNoKGcpfWlmKGhlKHQubWF4UHJvcGVydGllcykmJmYucHJvcGVydGllcy5sZW5ndGg+dC5tYXhQcm9wZXJ0aWVzJiZuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOkUoIk9iamVjdCBoYXMgbW9yZSBwcm9wZXJ0aWVzIHRoYW4gbGltaXQgb2YgezB9LiIsdC5tYXhQcm9wZXJ0aWVzKX0pLGhlKHQubWluUHJvcGVydGllcykmJmYucHJvcGVydGllcy5sZW5ndGg8dC5taW5Qcm9wZXJ0aWVzJiZuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOkUoIk9iamVjdCBoYXMgZmV3ZXIgcHJvcGVydGllcyB0aGFuIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgezB9Iix0Lm1pblByb3BlcnRpZXMpfSksdC5kZXBlbmRlbnRSZXF1aXJlZClmb3IoY29uc3QgdiBpbiB0LmRlcGVuZGVudFJlcXVpcmVkKXtjb25zdCB5PWRbdl0sYj10LmRlcGVuZGVudFJlcXVpcmVkW3ZdO3kmJkFycmF5LmlzQXJyYXkoYikmJkwodixiKX1pZih0LmRlcGVuZGVudFNjaGVtYXMpZm9yKGNvbnN0IHYgaW4gdC5kZXBlbmRlbnRTY2hlbWFzKXtjb25zdCB5PWRbdl0sYj10LmRlcGVuZGVudFNjaGVtYXNbdl07eSYmZXQoYikmJkwodixiKX1pZih0LmRlcGVuZGVuY2llcylmb3IoY29uc3QgdiBpbiB0LmRlcGVuZGVuY2llcylkW3ZdJiZMKHYsdC5kZXBlbmRlbmNpZXNbdl0pO2NvbnN0IHc9d2UodC5wcm9wZXJ0eU5hbWVzKTtpZih3KWZvcihjb25zdCB2IG9mIGYucHJvcGVydGllcyl7Y29uc3QgeT12LmtleU5vZGU7eSYmbGUoeSx3LG4sS3QuaW5zdGFuY2UsaSl9ZnVuY3Rpb24gTCh2LHkpe2lmKEFycmF5LmlzQXJyYXkoeSkpZm9yKGNvbnN0IGIgb2YgeSlkW2JdP24ucHJvcGVydGllc1ZhbHVlTWF0Y2hlcysrOm4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpmLm9mZnNldCxsZW5ndGg6Zi5sZW5ndGh9LG1lc3NhZ2U6RSgiT2JqZWN0IGlzIG1pc3NpbmcgcHJvcGVydHkgezB9IHJlcXVpcmVkIGJ5IHByb3BlcnR5IHsxfS4iLGIsdil9KTtlbHNle2NvbnN0IGI9d2UoeSk7aWYoYil7Y29uc3QgXz1uZXcgZGU7bGUoZixiLF8scixpKSxuLm1lcmdlUHJvcGVydHlNYXRjaChfKX19fX19ZnVuY3Rpb24gdDEoZSx0KXtjb25zdCBuPVtdO2xldCByPS0xO2NvbnN0IGk9ZS5nZXRUZXh0KCkscz1hdChpLCExKSxhPXQmJnQuY29sbGVjdENvbW1lbnRzP1tdOnZvaWQgMDtmdW5jdGlvbiBsKCl7Zm9yKDs7KXtjb25zdCBfPXMuc2NhbigpO3N3aXRjaChoKCksXyl7Y2FzZSAxMjpjYXNlIDEzOkFycmF5LmlzQXJyYXkoYSkmJmEucHVzaChxLmNyZWF0ZShlLnBvc2l0aW9uQXQocy5nZXRUb2tlbk9mZnNldCgpKSxlLnBvc2l0aW9uQXQocy5nZXRUb2tlbk9mZnNldCgpK3MuZ2V0VG9rZW5MZW5ndGgoKSkpKTticmVhaztjYXNlIDE1OmNhc2UgMTQ6YnJlYWs7ZGVmYXVsdDpyZXR1cm4gX319fWZ1bmN0aW9uIG8oXyxBLEMsRixPPXhlLkVycm9yKXtpZihuLmxlbmd0aD09PTB8fEMhPT1yKXtjb25zdCBNPXEuY3JlYXRlKGUucG9zaXRpb25BdChDKSxlLnBvc2l0aW9uQXQoRikpO24ucHVzaCh6ZS5jcmVhdGUoTSxfLE8sQSxlLmxhbmd1YWdlSWQpKSxyPUN9fWZ1bmN0aW9uIHUoXyxBLEM9dm9pZCAwLEY9W10sTz1bXSl7bGV0IE09cy5nZXRUb2tlbk9mZnNldCgpLE49cy5nZXRUb2tlbk9mZnNldCgpK3MuZ2V0VG9rZW5MZW5ndGgoKTtpZihNPT09TiYmTT4wKXtmb3IoTS0tO00+MCYmL1xzLy50ZXN0KGkuY2hhckF0KE0pKTspTS0tO049TSsxfWlmKG8oXyxBLE0sTiksQyYmZihDLCExKSxGLmxlbmd0aCtPLmxlbmd0aD4wKXtsZXQgaz1zLmdldFRva2VuKCk7Zm9yKDtrIT09MTc7KXtpZihGLmluZGV4T2YoaykhPT0tMSl7bCgpO2JyZWFrfWVsc2UgaWYoTy5pbmRleE9mKGspIT09LTEpYnJlYWs7az1sKCl9fXJldHVybiBDfWZ1bmN0aW9uIGgoKXtzd2l0Y2gocy5nZXRUb2tlbkVycm9yKCkpe2Nhc2UgNDpyZXR1cm4gdShFKCJJbnZhbGlkIHVuaWNvZGUgc2VxdWVuY2UgaW4gc3RyaW5nLiIpLEguSW52YWxpZFVuaWNvZGUpLCEwO2Nhc2UgNTpyZXR1cm4gdShFKCJJbnZhbGlkIGVzY2FwZSBjaGFyYWN0ZXIgaW4gc3RyaW5nLiIpLEguSW52YWxpZEVzY2FwZUNoYXJhY3RlciksITA7Y2FzZSAzOnJldHVybiB1KEUoIlVuZXhwZWN0ZWQgZW5kIG9mIG51bWJlci4iKSxILlVuZXhwZWN0ZWRFbmRPZk51bWJlciksITA7Y2FzZSAxOnJldHVybiB1KEUoIlVuZXhwZWN0ZWQgZW5kIG9mIGNvbW1lbnQuIiksSC5VbmV4cGVjdGVkRW5kT2ZDb21tZW50KSwhMDtjYXNlIDI6cmV0dXJuIHUoRSgiVW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nLiIpLEguVW5leHBlY3RlZEVuZE9mU3RyaW5nKSwhMDtjYXNlIDY6cmV0dXJuIHUoRSgiSW52YWxpZCBjaGFyYWN0ZXJzIGluIHN0cmluZy4gQ29udHJvbCBjaGFyYWN0ZXJzIG11c3QgYmUgZXNjYXBlZC4iKSxILkludmFsaWRDaGFyYWN0ZXIpLCEwfXJldHVybiExfWZ1bmN0aW9uIGYoXyxBKXtyZXR1cm4gXy5sZW5ndGg9cy5nZXRUb2tlbk9mZnNldCgpK3MuZ2V0VG9rZW5MZW5ndGgoKS1fLm9mZnNldCxBJiZsKCksX31mdW5jdGlvbiBkKF8pe2lmKHMuZ2V0VG9rZW4oKSE9PTMpcmV0dXJuO2NvbnN0IEE9bmV3IEpjKF8scy5nZXRUb2tlbk9mZnNldCgpKTtsKCk7bGV0IEM9ITE7Zm9yKDtzLmdldFRva2VuKCkhPT00JiZzLmdldFRva2VuKCkhPT0xNzspe2lmKHMuZ2V0VG9rZW4oKT09PTUpe0N8fHUoRSgiVmFsdWUgZXhwZWN0ZWQiKSxILlZhbHVlRXhwZWN0ZWQpO2NvbnN0IE89cy5nZXRUb2tlbk9mZnNldCgpO2lmKGwoKSxzLmdldFRva2VuKCk9PT00KXtDJiZvKEUoIlRyYWlsaW5nIGNvbW1hIiksSC5UcmFpbGluZ0NvbW1hLE8sTysxKTtjb250aW51ZX19ZWxzZSBDJiZ1KEUoIkV4cGVjdGVkIGNvbW1hIiksSC5Db21tYUV4cGVjdGVkKTtjb25zdCBGPXYoQSk7Rj9BLml0ZW1zLnB1c2goRik6dShFKCJWYWx1ZSBleHBlY3RlZCIpLEguVmFsdWVFeHBlY3RlZCx2b2lkIDAsW10sWzQsNV0pLEM9ITB9cmV0dXJuIHMuZ2V0VG9rZW4oKSE9PTQ/dShFKCJFeHBlY3RlZCBjb21tYSBvciBjbG9zaW5nIGJyYWNrZXQiKSxILkNvbW1hT3JDbG9zZUJhY2tldEV4cGVjdGVkLEEpOmYoQSwhMCl9Y29uc3QgbT1uZXcgWHIodm9pZCAwLDAsMCk7ZnVuY3Rpb24gZyhfLEEpe2NvbnN0IEM9bmV3IFFjKF8scy5nZXRUb2tlbk9mZnNldCgpLG0pO2xldCBGPXgoQyk7aWYoIUYpaWYocy5nZXRUb2tlbigpPT09MTYpe3UoRSgiUHJvcGVydHkga2V5cyBtdXN0IGJlIGRvdWJsZXF1b3RlZCIpLEguUHJvcGVydHlLZXlzTXVzdEJlRG91YmxlcXVvdGVkKTtjb25zdCBNPW5ldyBYcihDLHMuZ2V0VG9rZW5PZmZzZXQoKSxzLmdldFRva2VuTGVuZ3RoKCkpO00udmFsdWU9cy5nZXRUb2tlblZhbHVlKCksRj1NLGwoKX1lbHNlIHJldHVybjtpZihDLmtleU5vZGU9RixGLnZhbHVlIT09Ii8vIil7Y29uc3QgTT1BW0YudmFsdWVdO00/KG8oRSgiRHVwbGljYXRlIG9iamVjdCBrZXkiKSxILkR1cGxpY2F0ZUtleSxDLmtleU5vZGUub2Zmc2V0LEMua2V5Tm9kZS5vZmZzZXQrQy5rZXlOb2RlLmxlbmd0aCx4ZS5XYXJuaW5nKSxldChNKSYmbyhFKCJEdXBsaWNhdGUgb2JqZWN0IGtleSIpLEguRHVwbGljYXRlS2V5LE0ua2V5Tm9kZS5vZmZzZXQsTS5rZXlOb2RlLm9mZnNldCtNLmtleU5vZGUubGVuZ3RoLHhlLldhcm5pbmcpLEFbRi52YWx1ZV09ITApOkFbRi52YWx1ZV09Q31pZihzLmdldFRva2VuKCk9PT02KUMuY29sb25PZmZzZXQ9cy5nZXRUb2tlbk9mZnNldCgpLGwoKTtlbHNlIGlmKHUoRSgiQ29sb24gZXhwZWN0ZWQiKSxILkNvbG9uRXhwZWN0ZWQpLHMuZ2V0VG9rZW4oKT09PTEwJiZlLnBvc2l0aW9uQXQoRi5vZmZzZXQrRi5sZW5ndGgpLmxpbmU8ZS5wb3NpdGlvbkF0KHMuZ2V0VG9rZW5PZmZzZXQoKSkubGluZSlyZXR1cm4gQy5sZW5ndGg9Ri5sZW5ndGgsQztjb25zdCBPPXYoQyk7cmV0dXJuIE8/KEMudmFsdWVOb2RlPU8sQy5sZW5ndGg9Ty5vZmZzZXQrTy5sZW5ndGgtQy5vZmZzZXQsQyk6dShFKCJWYWx1ZSBleHBlY3RlZCIpLEguVmFsdWVFeHBlY3RlZCxDLFtdLFsyLDVdKX1mdW5jdGlvbiBwKF8pe2lmKHMuZ2V0VG9rZW4oKSE9PTEpcmV0dXJuO2NvbnN0IEE9bmV3IFljKF8scy5nZXRUb2tlbk9mZnNldCgpKSxDPU9iamVjdC5jcmVhdGUobnVsbCk7bCgpO2xldCBGPSExO2Zvcig7cy5nZXRUb2tlbigpIT09MiYmcy5nZXRUb2tlbigpIT09MTc7KXtpZihzLmdldFRva2VuKCk9PT01KXtGfHx1KEUoIlByb3BlcnR5IGV4cGVjdGVkIiksSC5Qcm9wZXJ0eUV4cGVjdGVkKTtjb25zdCBNPXMuZ2V0VG9rZW5PZmZzZXQoKTtpZihsKCkscy5nZXRUb2tlbigpPT09Mil7RiYmbyhFKCJUcmFpbGluZyBjb21tYSIpLEguVHJhaWxpbmdDb21tYSxNLE0rMSk7Y29udGludWV9fWVsc2UgRiYmdShFKCJFeHBlY3RlZCBjb21tYSIpLEguQ29tbWFFeHBlY3RlZCk7Y29uc3QgTz1nKEEsQyk7Tz9BLnByb3BlcnRpZXMucHVzaChPKTp1KEUoIlByb3BlcnR5IGV4cGVjdGVkIiksSC5Qcm9wZXJ0eUV4cGVjdGVkLHZvaWQgMCxbXSxbMiw1XSksRj0hMH1yZXR1cm4gcy5nZXRUb2tlbigpIT09Mj91KEUoIkV4cGVjdGVkIGNvbW1hIG9yIGNsb3NpbmcgYnJhY2UiKSxILkNvbW1hT3JDbG9zZUJyYWNlRXhwZWN0ZWQsQSk6ZihBLCEwKX1mdW5jdGlvbiB4KF8pe2lmKHMuZ2V0VG9rZW4oKSE9PTEwKXJldHVybjtjb25zdCBBPW5ldyBYcihfLHMuZ2V0VG9rZW5PZmZzZXQoKSk7cmV0dXJuIEEudmFsdWU9cy5nZXRUb2tlblZhbHVlKCksZihBLCEwKX1mdW5jdGlvbiB3KF8pe2lmKHMuZ2V0VG9rZW4oKSE9PTExKXJldHVybjtjb25zdCBBPW5ldyBYYyhfLHMuZ2V0VG9rZW5PZmZzZXQoKSk7aWYocy5nZXRUb2tlbkVycm9yKCk9PT0wKXtjb25zdCBDPXMuZ2V0VG9rZW5WYWx1ZSgpO3RyeXtjb25zdCBGPUpTT04ucGFyc2UoQyk7aWYoIWhlKEYpKXJldHVybiB1KEUoIkludmFsaWQgbnVtYmVyIGZvcm1hdC4iKSxILlVuZGVmaW5lZCxBKTtBLnZhbHVlPUZ9Y2F0Y2h7cmV0dXJuIHUoRSgiSW52YWxpZCBudW1iZXIgZm9ybWF0LiIpLEguVW5kZWZpbmVkLEEpfUEuaXNJbnRlZ2VyPUMuaW5kZXhPZigiLiIpPT09LTF9cmV0dXJuIGYoQSwhMCl9ZnVuY3Rpb24gTChfKXtzd2l0Y2gocy5nZXRUb2tlbigpKXtjYXNlIDc6cmV0dXJuIGYobmV3IEdjKF8scy5nZXRUb2tlbk9mZnNldCgpKSwhMCk7Y2FzZSA4OnJldHVybiBmKG5ldyBObyhfLCEwLHMuZ2V0VG9rZW5PZmZzZXQoKSksITApO2Nhc2UgOTpyZXR1cm4gZihuZXcgTm8oXywhMSxzLmdldFRva2VuT2Zmc2V0KCkpLCEwKTtkZWZhdWx0OnJldHVybn19ZnVuY3Rpb24gdihfKXtyZXR1cm4gZChfKXx8cChfKXx8eChfKXx8dyhfKXx8TChfKX1sZXQgeTtyZXR1cm4gbCgpIT09MTcmJih5PXYoeSkseT9zLmdldFRva2VuKCkhPT0xNyYmdShFKCJFbmQgb2YgZmlsZSBleHBlY3RlZC4iKSxILlVuZGVmaW5lZCk6dShFKCJFeHBlY3RlZCBhIEpTT04gb2JqZWN0LCBhcnJheSBvciBsaXRlcmFsLiIpLEguVW5kZWZpbmVkKSksbmV3IFJvKHksbixhKX1mdW5jdGlvbiBZcihlLHQsbil7aWYoZSE9PW51bGwmJnR5cGVvZiBlPT0ib2JqZWN0Iil7Y29uc3Qgcj10KyIJIjtpZihBcnJheS5pc0FycmF5KGUpKXtpZihlLmxlbmd0aD09PTApcmV0dXJuIltdIjtsZXQgaT1gWwpgO2ZvcihsZXQgcz0wO3M8ZS5sZW5ndGg7cysrKWkrPXIrWXIoZVtzXSxyLG4pLHM8ZS5sZW5ndGgtMSYmKGkrPSIsIiksaSs9YApgO3JldHVybiBpKz10KyJdIixpfWVsc2V7Y29uc3QgaT1PYmplY3Qua2V5cyhlKTtpZihpLmxlbmd0aD09PTApcmV0dXJuInt9IjtsZXQgcz1gewpgO2ZvcihsZXQgYT0wO2E8aS5sZW5ndGg7YSsrKXtjb25zdCBsPWlbYV07cys9citKU09OLnN0cmluZ2lmeShsKSsiOiAiK1lyKGVbbF0scixuKSxhPGkubGVuZ3RoLTEmJihzKz0iLCIpLHMrPWAKYH1yZXR1cm4gcys9dCsifSIsc319cmV0dXJuIG4oZSl9dmFyIG4xPWNsYXNze2NvbnN0cnVjdG9yKGUsdD1bXSxuPVByb21pc2Uscj17fSl7dGhpcy5zY2hlbWFTZXJ2aWNlPWUsdGhpcy5jb250cmlidXRpb25zPXQsdGhpcy5wcm9taXNlQ29uc3RydWN0b3I9bix0aGlzLmNsaWVudENhcGFiaWxpdGllcz1yfWRvUmVzb2x2ZShlKXtmb3IobGV0IHQ9dGhpcy5jb250cmlidXRpb25zLmxlbmd0aC0xO3Q+PTA7dC0tKXtjb25zdCBuPXRoaXMuY29udHJpYnV0aW9uc1t0XS5yZXNvbHZlQ29tcGxldGlvbjtpZihuKXtjb25zdCByPW4oZSk7aWYocilyZXR1cm4gcn19cmV0dXJuIHRoaXMucHJvbWlzZUNvbnN0cnVjdG9yLnJlc29sdmUoZSl9ZG9Db21wbGV0ZShlLHQsbil7Y29uc3Qgcj17aXRlbXM6W10saXNJbmNvbXBsZXRlOiExfSxpPWUuZ2V0VGV4dCgpLHM9ZS5vZmZzZXRBdCh0KTtsZXQgYT1uLmdldE5vZGVGcm9tT2Zmc2V0KHMsITApO2lmKHRoaXMuaXNJbkNvbW1lbnQoZSxhP2Eub2Zmc2V0OjAscykpcmV0dXJuIFByb21pc2UucmVzb2x2ZShyKTtpZihhJiZzPT09YS5vZmZzZXQrYS5sZW5ndGgmJnM+MCl7Y29uc3QgZj1pW3MtMV07KGEudHlwZT09PSJvYmplY3QiJiZmPT09In0ifHxhLnR5cGU9PT0iYXJyYXkiJiZmPT09Il0iKSYmKGE9YS5wYXJlbnQpfWNvbnN0IGw9dGhpcy5nZXRDdXJyZW50V29yZChlLHMpO2xldCBvO2lmKGEmJihhLnR5cGU9PT0ic3RyaW5nInx8YS50eXBlPT09Im51bWJlciJ8fGEudHlwZT09PSJib29sZWFuInx8YS50eXBlPT09Im51bGwiKSlvPXEuY3JlYXRlKGUucG9zaXRpb25BdChhLm9mZnNldCksZS5wb3NpdGlvbkF0KGEub2Zmc2V0K2EubGVuZ3RoKSk7ZWxzZXtsZXQgZj1zLWwubGVuZ3RoO2Y+MCYmaVtmLTFdPT09JyInJiZmLS0sbz1xLmNyZWF0ZShlLnBvc2l0aW9uQXQoZiksdCl9Y29uc3QgdT1uZXcgTWFwLGg9e2FkZDpmPT57bGV0IGQ9Zi5sYWJlbDtjb25zdCBtPXUuZ2V0KGQpO2lmKG0pbS5kb2N1bWVudGF0aW9ufHwobS5kb2N1bWVudGF0aW9uPWYuZG9jdW1lbnRhdGlvbiksbS5kZXRhaWx8fChtLmRldGFpbD1mLmRldGFpbCksbS5sYWJlbERldGFpbHN8fChtLmxhYmVsRGV0YWlscz1mLmxhYmVsRGV0YWlscyk7ZWxzZXtpZihkPWQucmVwbGFjZSgvW1xuXS9nLCLihrUiKSxkLmxlbmd0aD42MCl7Y29uc3QgZz1kLnN1YnN0cigwLDU3KS50cmltKCkrIi4uLiI7dS5oYXMoZyl8fChkPWcpfWYudGV4dEVkaXQ9RGUucmVwbGFjZShvLGYuaW5zZXJ0VGV4dCksZi5sYWJlbD1kLHUuc2V0KGQsZiksci5pdGVtcy5wdXNoKGYpfX0sc2V0QXNJbmNvbXBsZXRlOigpPT57ci5pc0luY29tcGxldGU9ITB9LGVycm9yOmY9Pntjb25zb2xlLmVycm9yKGYpfSxnZXROdW1iZXJPZlByb3Bvc2FsczooKT0+ci5pdGVtcy5sZW5ndGh9O3JldHVybiB0aGlzLnNjaGVtYVNlcnZpY2UuZ2V0U2NoZW1hRm9yUmVzb3VyY2UoZS51cmksbikudGhlbihmPT57Y29uc3QgZD1bXTtsZXQgbT0hMCxnPSIiLHA7aWYoYSYmYS50eXBlPT09InN0cmluZyIpe2NvbnN0IHc9YS5wYXJlbnQ7dyYmdy50eXBlPT09InByb3BlcnR5IiYmdy5rZXlOb2RlPT09YSYmKG09IXcudmFsdWVOb2RlLHA9dyxnPWkuc3Vic3RyKGEub2Zmc2V0KzEsYS5sZW5ndGgtMiksdyYmKGE9dy5wYXJlbnQpKX1pZihhJiZhLnR5cGU9PT0ib2JqZWN0Iil7aWYoYS5vZmZzZXQ9PT1zKXJldHVybiByO2EucHJvcGVydGllcy5mb3JFYWNoKHk9PnsoIXB8fHAhPT15KSYmdS5zZXQoeS5rZXlOb2RlLnZhbHVlLFdyLmNyZWF0ZSgiX18iKSl9KTtsZXQgTD0iIjttJiYoTD10aGlzLmV2YWx1YXRlU2VwYXJhdG9yQWZ0ZXIoZSxlLm9mZnNldEF0KG8uZW5kKSkpLGY/dGhpcy5nZXRQcm9wZXJ0eUNvbXBsZXRpb25zKGYsbixhLG0sTCxoKTp0aGlzLmdldFNjaGVtYUxlc3NQcm9wZXJ0eUNvbXBsZXRpb25zKG4sYSxnLGgpO2NvbnN0IHY9UXIoYSk7dGhpcy5jb250cmlidXRpb25zLmZvckVhY2goeT0+e2NvbnN0IGI9eS5jb2xsZWN0UHJvcGVydHlDb21wbGV0aW9ucyhlLnVyaSx2LGwsbSxMPT09IiIsaCk7YiYmZC5wdXNoKGIpfSksIWYmJmwubGVuZ3RoPjAmJmkuY2hhckF0KHMtbC5sZW5ndGgtMSkhPT0nIicmJihoLmFkZCh7a2luZDp5ZS5Qcm9wZXJ0eSxsYWJlbDp0aGlzLmdldExhYmVsRm9yVmFsdWUobCksaW5zZXJ0VGV4dDp0aGlzLmdldEluc2VydFRleHRGb3JQcm9wZXJ0eShsLHZvaWQgMCwhMSxMKSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjoiIn0pLGguc2V0QXNJbmNvbXBsZXRlKCkpfWNvbnN0IHg9e307cmV0dXJuIGY/dGhpcy5nZXRWYWx1ZUNvbXBsZXRpb25zKGYsbixhLHMsZSxoLHgpOnRoaXMuZ2V0U2NoZW1hTGVzc1ZhbHVlQ29tcGxldGlvbnMobixhLHMsZSxoKSx0aGlzLmNvbnRyaWJ1dGlvbnMubGVuZ3RoPjAmJnRoaXMuZ2V0Q29udHJpYnV0ZWRWYWx1ZUNvbXBsZXRpb25zKG4sYSxzLGUsaCxkKSx0aGlzLnByb21pc2VDb25zdHJ1Y3Rvci5hbGwoZCkudGhlbigoKT0+e2lmKGguZ2V0TnVtYmVyT2ZQcm9wb3NhbHMoKT09PTApe2xldCB3PXM7YSYmKGEudHlwZT09PSJzdHJpbmcifHxhLnR5cGU9PT0ibnVtYmVyInx8YS50eXBlPT09ImJvb2xlYW4ifHxhLnR5cGU9PT0ibnVsbCIpJiYodz1hLm9mZnNldCthLmxlbmd0aCk7Y29uc3QgTD10aGlzLmV2YWx1YXRlU2VwYXJhdG9yQWZ0ZXIoZSx3KTt0aGlzLmFkZEZpbGxlclZhbHVlQ29tcGxldGlvbnMoeCxMLGgpfXJldHVybiByfSl9KX1nZXRQcm9wZXJ0eUNvbXBsZXRpb25zKGUsdCxuLHIsaSxzKXt0LmdldE1hdGNoaW5nU2NoZW1hcyhlLnNjaGVtYSxuLm9mZnNldCkuZm9yRWFjaChsPT57aWYobC5ub2RlPT09biYmIWwuaW52ZXJ0ZWQpe2NvbnN0IG89bC5zY2hlbWEucHJvcGVydGllcztvJiZPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGg9Pntjb25zdCBmPW9baF07aWYodHlwZW9mIGY9PSJvYmplY3QiJiYhZi5kZXByZWNhdGlvbk1lc3NhZ2UmJiFmLmRvTm90U3VnZ2VzdCl7Y29uc3QgZD17a2luZDp5ZS5Qcm9wZXJ0eSxsYWJlbDpoLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yUHJvcGVydHkoaCxmLHIsaSksaW5zZXJ0VGV4dEZvcm1hdDppZS5TbmlwcGV0LGZpbHRlclRleHQ6dGhpcy5nZXRGaWx0ZXJUZXh0Rm9yVmFsdWUoaCksZG9jdW1lbnRhdGlvbjp0aGlzLmZyb21NYXJrdXAoZi5tYXJrZG93bkRlc2NyaXB0aW9uKXx8Zi5kZXNjcmlwdGlvbnx8IiJ9O2Yuc3VnZ2VzdFNvcnRUZXh0IT09dm9pZCAwJiYoZC5zb3J0VGV4dD1mLnN1Z2dlc3RTb3J0VGV4dCksZC5pbnNlcnRUZXh0JiZRdChkLmluc2VydFRleHQsYCQxJHtpfWApJiYoZC5jb21tYW5kPXt0aXRsZToiU3VnZ2VzdCIsY29tbWFuZDoiZWRpdG9yLmFjdGlvbi50cmlnZ2VyU3VnZ2VzdCJ9KSxzLmFkZChkKX19KTtjb25zdCB1PWwuc2NoZW1hLnByb3BlcnR5TmFtZXM7aWYodHlwZW9mIHU9PSJvYmplY3QiJiYhdS5kZXByZWNhdGlvbk1lc3NhZ2UmJiF1LmRvTm90U3VnZ2VzdCl7Y29uc3QgaD0oZixkPXZvaWQgMCk9Pntjb25zdCBtPXtraW5kOnllLlByb3BlcnR5LGxhYmVsOmYsaW5zZXJ0VGV4dDp0aGlzLmdldEluc2VydFRleHRGb3JQcm9wZXJ0eShmLHZvaWQgMCxyLGkpLGluc2VydFRleHRGb3JtYXQ6aWUuU25pcHBldCxmaWx0ZXJUZXh0OnRoaXMuZ2V0RmlsdGVyVGV4dEZvclZhbHVlKGYpLGRvY3VtZW50YXRpb246ZHx8dGhpcy5mcm9tTWFya3VwKHUubWFya2Rvd25EZXNjcmlwdGlvbil8fHUuZGVzY3JpcHRpb258fCIifTt1LnN1Z2dlc3RTb3J0VGV4dCE9PXZvaWQgMCYmKG0uc29ydFRleHQ9dS5zdWdnZXN0U29ydFRleHQpLG0uaW5zZXJ0VGV4dCYmUXQobS5pbnNlcnRUZXh0LGAkMSR7aX1gKSYmKG0uY29tbWFuZD17dGl0bGU6IlN1Z2dlc3QiLGNvbW1hbmQ6ImVkaXRvci5hY3Rpb24udHJpZ2dlclN1Z2dlc3QifSkscy5hZGQobSl9O2lmKHUuZW51bSlmb3IobGV0IGY9MDtmPHUuZW51bS5sZW5ndGg7ZisrKXtsZXQgZDt1Lm1hcmtkb3duRW51bURlc2NyaXB0aW9ucyYmZjx1Lm1hcmtkb3duRW51bURlc2NyaXB0aW9ucy5sZW5ndGg/ZD10aGlzLmZyb21NYXJrdXAodS5tYXJrZG93bkVudW1EZXNjcmlwdGlvbnNbZl0pOnUuZW51bURlc2NyaXB0aW9ucyYmZjx1LmVudW1EZXNjcmlwdGlvbnMubGVuZ3RoJiYoZD11LmVudW1EZXNjcmlwdGlvbnNbZl0pLGgodS5lbnVtW2ZdLGQpfXUuY29uc3QmJmgodS5jb25zdCl9fX0pfWdldFNjaGVtYUxlc3NQcm9wZXJ0eUNvbXBsZXRpb25zKGUsdCxuLHIpe2NvbnN0IGk9cz0+e3MucHJvcGVydGllcy5mb3JFYWNoKGE9Pntjb25zdCBsPWEua2V5Tm9kZS52YWx1ZTtyLmFkZCh7a2luZDp5ZS5Qcm9wZXJ0eSxsYWJlbDpsLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUobCwiIiksaW5zZXJ0VGV4dEZvcm1hdDppZS5TbmlwcGV0LGZpbHRlclRleHQ6dGhpcy5nZXRGaWx0ZXJUZXh0Rm9yVmFsdWUobCksZG9jdW1lbnRhdGlvbjoiIn0pfSl9O2lmKHQucGFyZW50KWlmKHQucGFyZW50LnR5cGU9PT0icHJvcGVydHkiKXtjb25zdCBzPXQucGFyZW50LmtleU5vZGUudmFsdWU7ZS52aXNpdChhPT4oYS50eXBlPT09InByb3BlcnR5IiYmYSE9PXQucGFyZW50JiZhLmtleU5vZGUudmFsdWU9PT1zJiZhLnZhbHVlTm9kZSYmYS52YWx1ZU5vZGUudHlwZT09PSJvYmplY3QiJiZpKGEudmFsdWVOb2RlKSwhMCkpfWVsc2UgdC5wYXJlbnQudHlwZT09PSJhcnJheSImJnQucGFyZW50Lml0ZW1zLmZvckVhY2gocz0+e3MudHlwZT09PSJvYmplY3QiJiZzIT09dCYmaShzKX0pO2Vsc2UgdC50eXBlPT09Im9iamVjdCImJnIuYWRkKHtraW5kOnllLlByb3BlcnR5LGxhYmVsOiIkc2NoZW1hIixpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclByb3BlcnR5KCIkc2NoZW1hIix2b2lkIDAsITAsIiIpLGluc2VydFRleHRGb3JtYXQ6aWUuU25pcHBldCxkb2N1bWVudGF0aW9uOiIiLGZpbHRlclRleHQ6dGhpcy5nZXRGaWx0ZXJUZXh0Rm9yVmFsdWUoIiRzY2hlbWEiKX0pfWdldFNjaGVtYUxlc3NWYWx1ZUNvbXBsZXRpb25zKGUsdCxuLHIsaSl7bGV0IHM9bjtpZih0JiYodC50eXBlPT09InN0cmluZyJ8fHQudHlwZT09PSJudW1iZXIifHx0LnR5cGU9PT0iYm9vbGVhbiJ8fHQudHlwZT09PSJudWxsIikmJihzPXQub2Zmc2V0K3QubGVuZ3RoLHQ9dC5wYXJlbnQpLCF0KXtpLmFkZCh7a2luZDp0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKCJvYmplY3QiKSxsYWJlbDoiRW1wdHkgb2JqZWN0IixpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKHt9LCIiKSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjoiIn0pLGkuYWRkKHtraW5kOnRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoImFycmF5IiksbGFiZWw6IkVtcHR5IGFycmF5IixpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKFtdLCIiKSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjoiIn0pO3JldHVybn1jb25zdCBhPXRoaXMuZXZhbHVhdGVTZXBhcmF0b3JBZnRlcihyLHMpLGw9bz0+e28ucGFyZW50JiYha28oby5wYXJlbnQsbiwhMCkmJmkuYWRkKHtraW5kOnRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoby50eXBlKSxsYWJlbDp0aGlzLmdldExhYmVsVGV4dEZvck1hdGNoaW5nTm9kZShvLHIpLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yTWF0Y2hpbmdOb2RlKG8scixhKSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjoiIn0pLG8udHlwZT09PSJib29sZWFuIiYmdGhpcy5hZGRCb29sZWFuVmFsdWVDb21wbGV0aW9uKCFvLnZhbHVlLGEsaSl9O2lmKHQudHlwZT09PSJwcm9wZXJ0eSImJm4+KHQuY29sb25PZmZzZXR8fDApKXtjb25zdCBvPXQudmFsdWVOb2RlO2lmKG8mJihuPm8ub2Zmc2V0K28ubGVuZ3RofHxvLnR5cGU9PT0ib2JqZWN0Inx8by50eXBlPT09ImFycmF5IikpcmV0dXJuO2NvbnN0IHU9dC5rZXlOb2RlLnZhbHVlO2UudmlzaXQoaD0+KGgudHlwZT09PSJwcm9wZXJ0eSImJmgua2V5Tm9kZS52YWx1ZT09PXUmJmgudmFsdWVOb2RlJiZsKGgudmFsdWVOb2RlKSwhMCkpLHU9PT0iJHNjaGVtYSImJnQucGFyZW50JiYhdC5wYXJlbnQucGFyZW50JiZ0aGlzLmFkZERvbGxhclNjaGVtYUNvbXBsZXRpb25zKGEsaSl9aWYodC50eXBlPT09ImFycmF5IilpZih0LnBhcmVudCYmdC5wYXJlbnQudHlwZT09PSJwcm9wZXJ0eSIpe2NvbnN0IG89dC5wYXJlbnQua2V5Tm9kZS52YWx1ZTtlLnZpc2l0KHU9Pih1LnR5cGU9PT0icHJvcGVydHkiJiZ1LmtleU5vZGUudmFsdWU9PT1vJiZ1LnZhbHVlTm9kZSYmdS52YWx1ZU5vZGUudHlwZT09PSJhcnJheSImJnUudmFsdWVOb2RlLml0ZW1zLmZvckVhY2gobCksITApKX1lbHNlIHQuaXRlbXMuZm9yRWFjaChsKX1nZXRWYWx1ZUNvbXBsZXRpb25zKGUsdCxuLHIsaSxzLGEpe2xldCBsPXIsbyx1O2lmKG4mJihuLnR5cGU9PT0ic3RyaW5nInx8bi50eXBlPT09Im51bWJlciJ8fG4udHlwZT09PSJib29sZWFuInx8bi50eXBlPT09Im51bGwiKSYmKGw9bi5vZmZzZXQrbi5sZW5ndGgsdT1uLG49bi5wYXJlbnQpLCFuKXt0aGlzLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMoZS5zY2hlbWEsIiIscyxhKTtyZXR1cm59aWYobi50eXBlPT09InByb3BlcnR5IiYmcj4obi5jb2xvbk9mZnNldHx8MCkpe2NvbnN0IGg9bi52YWx1ZU5vZGU7aWYoaCYmcj5oLm9mZnNldCtoLmxlbmd0aClyZXR1cm47bz1uLmtleU5vZGUudmFsdWUsbj1uLnBhcmVudH1pZihuJiYobyE9PXZvaWQgMHx8bi50eXBlPT09ImFycmF5Iikpe2NvbnN0IGg9dGhpcy5ldmFsdWF0ZVNlcGFyYXRvckFmdGVyKGksbCksZj10LmdldE1hdGNoaW5nU2NoZW1hcyhlLnNjaGVtYSxuLm9mZnNldCx1KTtmb3IoY29uc3QgZCBvZiBmKWlmKGQubm9kZT09PW4mJiFkLmludmVydGVkJiZkLnNjaGVtYSl7aWYobi50eXBlPT09ImFycmF5IiYmZC5zY2hlbWEuaXRlbXMpe2xldCBtPXM7aWYoZC5zY2hlbWEudW5pcXVlSXRlbXMpe2NvbnN0IGc9bmV3IFNldDtuLmNoaWxkcmVuLmZvckVhY2gocD0+e3AudHlwZSE9PSJhcnJheSImJnAudHlwZSE9PSJvYmplY3QiJiZnLmFkZCh0aGlzLmdldExhYmVsRm9yVmFsdWUodXQocCkpKX0pLG09ey4uLnMsYWRkKHApe2cuaGFzKHAubGFiZWwpfHxzLmFkZChwKX19fWlmKEFycmF5LmlzQXJyYXkoZC5zY2hlbWEuaXRlbXMpKXtjb25zdCBnPXRoaXMuZmluZEl0ZW1BdE9mZnNldChuLGkscik7ZzxkLnNjaGVtYS5pdGVtcy5sZW5ndGgmJnRoaXMuYWRkU2NoZW1hVmFsdWVDb21wbGV0aW9ucyhkLnNjaGVtYS5pdGVtc1tnXSxoLG0sYSl9ZWxzZSB0aGlzLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMoZC5zY2hlbWEuaXRlbXMsaCxtLGEpfWlmKG8hPT12b2lkIDApe2xldCBtPSExO2lmKGQuc2NoZW1hLnByb3BlcnRpZXMpe2NvbnN0IGc9ZC5zY2hlbWEucHJvcGVydGllc1tvXTtnJiYobT0hMCx0aGlzLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMoZyxoLHMsYSkpfWlmKGQuc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzJiYhbSlmb3IoY29uc3QgZyBvZiBPYmplY3Qua2V5cyhkLnNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcykpe2NvbnN0IHA9Um4oZyk7aWYocCE9bnVsbCYmcC50ZXN0KG8pKXttPSEwO2NvbnN0IHg9ZC5zY2hlbWEucGF0dGVyblByb3BlcnRpZXNbZ107dGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKHgsaCxzLGEpfX1pZihkLnNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyYmIW0pe2NvbnN0IGc9ZC5zY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXM7dGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKGcsaCxzLGEpfX19bz09PSIkc2NoZW1hIiYmIW4ucGFyZW50JiZ0aGlzLmFkZERvbGxhclNjaGVtYUNvbXBsZXRpb25zKGgscyksYS5ib29sZWFuJiYodGhpcy5hZGRCb29sZWFuVmFsdWVDb21wbGV0aW9uKCEwLGgscyksdGhpcy5hZGRCb29sZWFuVmFsdWVDb21wbGV0aW9uKCExLGgscykpLGEubnVsbCYmdGhpcy5hZGROdWxsVmFsdWVDb21wbGV0aW9uKGgscyl9fWdldENvbnRyaWJ1dGVkVmFsdWVDb21wbGV0aW9ucyhlLHQsbixyLGkscyl7aWYoIXQpdGhpcy5jb250cmlidXRpb25zLmZvckVhY2goYT0+e2NvbnN0IGw9YS5jb2xsZWN0RGVmYXVsdENvbXBsZXRpb25zKHIudXJpLGkpO2wmJnMucHVzaChsKX0pO2Vsc2UgaWYoKHQudHlwZT09PSJzdHJpbmcifHx0LnR5cGU9PT0ibnVtYmVyInx8dC50eXBlPT09ImJvb2xlYW4ifHx0LnR5cGU9PT0ibnVsbCIpJiYodD10LnBhcmVudCksdCYmdC50eXBlPT09InByb3BlcnR5IiYmbj4odC5jb2xvbk9mZnNldHx8MCkpe2NvbnN0IGE9dC5rZXlOb2RlLnZhbHVlLGw9dC52YWx1ZU5vZGU7aWYoKCFsfHxuPD1sLm9mZnNldCtsLmxlbmd0aCkmJnQucGFyZW50KXtjb25zdCBvPVFyKHQucGFyZW50KTt0aGlzLmNvbnRyaWJ1dGlvbnMuZm9yRWFjaCh1PT57Y29uc3QgaD11LmNvbGxlY3RWYWx1ZUNvbXBsZXRpb25zKHIudXJpLG8sYSxpKTtoJiZzLnB1c2goaCl9KX19fWFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMoZSx0LG4scil7dHlwZW9mIGU9PSJvYmplY3QiJiYodGhpcy5hZGRFbnVtVmFsdWVDb21wbGV0aW9ucyhlLHQsbiksdGhpcy5hZGREZWZhdWx0VmFsdWVDb21wbGV0aW9ucyhlLHQsbiksdGhpcy5jb2xsZWN0VHlwZXMoZSxyKSxBcnJheS5pc0FycmF5KGUuYWxsT2YpJiZlLmFsbE9mLmZvckVhY2goaT0+dGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKGksdCxuLHIpKSxBcnJheS5pc0FycmF5KGUuYW55T2YpJiZlLmFueU9mLmZvckVhY2goaT0+dGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKGksdCxuLHIpKSxBcnJheS5pc0FycmF5KGUub25lT2YpJiZlLm9uZU9mLmZvckVhY2goaT0+dGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKGksdCxuLHIpKSl9YWRkRGVmYXVsdFZhbHVlQ29tcGxldGlvbnMoZSx0LG4scj0wKXtsZXQgaT0hMTtpZihFZShlLmRlZmF1bHQpKXtsZXQgcz1lLnR5cGUsYT1lLmRlZmF1bHQ7Zm9yKGxldCBvPXI7bz4wO28tLSlhPVthXSxzPSJhcnJheSI7Y29uc3QgbD17a2luZDp0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKHMpLGxhYmVsOnRoaXMuZ2V0TGFiZWxGb3JWYWx1ZShhKSxpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKGEsdCksaW5zZXJ0VGV4dEZvcm1hdDppZS5TbmlwcGV0fTt0aGlzLmRvZXNTdXBwb3J0c0xhYmVsRGV0YWlscygpP2wubGFiZWxEZXRhaWxzPXtkZXNjcmlwdGlvbjpFKCJEZWZhdWx0IHZhbHVlIil9OmwuZGV0YWlsPUUoIkRlZmF1bHQgdmFsdWUiKSxuLmFkZChsKSxpPSEwfUFycmF5LmlzQXJyYXkoZS5leGFtcGxlcykmJmUuZXhhbXBsZXMuZm9yRWFjaChzPT57bGV0IGE9ZS50eXBlLGw9cztmb3IobGV0IG89cjtvPjA7by0tKWw9W2xdLGE9ImFycmF5IjtuLmFkZCh7a2luZDp0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKGEpLGxhYmVsOnRoaXMuZ2V0TGFiZWxGb3JWYWx1ZShsKSxpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKGwsdCksaW5zZXJ0VGV4dEZvcm1hdDppZS5TbmlwcGV0fSksaT0hMH0pLEFycmF5LmlzQXJyYXkoZS5kZWZhdWx0U25pcHBldHMpJiZlLmRlZmF1bHRTbmlwcGV0cy5mb3JFYWNoKHM9PntsZXQgYT1lLnR5cGUsbD1zLmJvZHksbz1zLmxhYmVsLHUsaDtpZihFZShsKSl7ZS50eXBlO2ZvcihsZXQgZj1yO2Y+MDtmLS0pbD1bbF07dT10aGlzLmdldEluc2VydFRleHRGb3JTbmlwcGV0VmFsdWUobCx0KSxoPXRoaXMuZ2V0RmlsdGVyVGV4dEZvclNuaXBwZXRWYWx1ZShsKSxvPW98fHRoaXMuZ2V0TGFiZWxGb3JTbmlwcGV0VmFsdWUobCl9ZWxzZSBpZih0eXBlb2Ygcy5ib2R5VGV4dD09InN0cmluZyIpe2xldCBmPSIiLGQ9IiIsbT0iIjtmb3IobGV0IGc9cjtnPjA7Zy0tKWY9ZittK2BbCmAsZD1kK2AKYCttKyJdIixtKz0iCSIsYT0iYXJyYXkiO3U9ZittK3MuYm9keVRleHQuc3BsaXQoYApgKS5qb2luKGAKYCttKStkK3Qsbz1vfHx1LGg9dS5yZXBsYWNlKC9bXG5dL2csIiIpfWVsc2UgcmV0dXJuO24uYWRkKHtraW5kOnRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoYSksbGFiZWw6byxkb2N1bWVudGF0aW9uOnRoaXMuZnJvbU1hcmt1cChzLm1hcmtkb3duRGVzY3JpcHRpb24pfHxzLmRlc2NyaXB0aW9uLGluc2VydFRleHQ6dSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZmlsdGVyVGV4dDpofSksaT0hMH0pLCFpJiZ0eXBlb2YgZS5pdGVtcz09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGUuaXRlbXMpJiZyPDUmJnRoaXMuYWRkRGVmYXVsdFZhbHVlQ29tcGxldGlvbnMoZS5pdGVtcyx0LG4scisxKX1hZGRFbnVtVmFsdWVDb21wbGV0aW9ucyhlLHQsbil7aWYoRWUoZS5jb25zdCkmJm4uYWRkKHtraW5kOnRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoZS50eXBlKSxsYWJlbDp0aGlzLmdldExhYmVsRm9yVmFsdWUoZS5jb25zdCksaW5zZXJ0VGV4dDp0aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZShlLmNvbnN0LHQpLGluc2VydFRleHRGb3JtYXQ6aWUuU25pcHBldCxkb2N1bWVudGF0aW9uOnRoaXMuZnJvbU1hcmt1cChlLm1hcmtkb3duRGVzY3JpcHRpb24pfHxlLmRlc2NyaXB0aW9ufSksQXJyYXkuaXNBcnJheShlLmVudW0pKWZvcihsZXQgcj0wLGk9ZS5lbnVtLmxlbmd0aDtyPGk7cisrKXtjb25zdCBzPWUuZW51bVtyXTtsZXQgYT10aGlzLmZyb21NYXJrdXAoZS5tYXJrZG93bkRlc2NyaXB0aW9uKXx8ZS5kZXNjcmlwdGlvbjtlLm1hcmtkb3duRW51bURlc2NyaXB0aW9ucyYmcjxlLm1hcmtkb3duRW51bURlc2NyaXB0aW9ucy5sZW5ndGgmJnRoaXMuZG9lc1N1cHBvcnRNYXJrZG93bigpP2E9dGhpcy5mcm9tTWFya3VwKGUubWFya2Rvd25FbnVtRGVzY3JpcHRpb25zW3JdKTplLmVudW1EZXNjcmlwdGlvbnMmJnI8ZS5lbnVtRGVzY3JpcHRpb25zLmxlbmd0aCYmKGE9ZS5lbnVtRGVzY3JpcHRpb25zW3JdKSxuLmFkZCh7a2luZDp0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKGUudHlwZSksbGFiZWw6dGhpcy5nZXRMYWJlbEZvclZhbHVlKHMpLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUocyx0KSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjphfSl9fWNvbGxlY3RUeXBlcyhlLHQpe2lmKEFycmF5LmlzQXJyYXkoZS5lbnVtKXx8RWUoZS5jb25zdCkpcmV0dXJuO2NvbnN0IG49ZS50eXBlO0FycmF5LmlzQXJyYXkobik/bi5mb3JFYWNoKHI9PnRbcl09ITApOm4mJih0W25dPSEwKX1hZGRGaWxsZXJWYWx1ZUNvbXBsZXRpb25zKGUsdCxuKXtlLm9iamVjdCYmbi5hZGQoe2tpbmQ6dGhpcy5nZXRTdWdnZXN0aW9uS2luZCgib2JqZWN0IiksbGFiZWw6Int9IixpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvckd1ZXNzZWRWYWx1ZSh7fSx0KSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZGV0YWlsOkUoIk5ldyBvYmplY3QiKSxkb2N1bWVudGF0aW9uOiIifSksZS5hcnJheSYmbi5hZGQoe2tpbmQ6dGhpcy5nZXRTdWdnZXN0aW9uS2luZCgiYXJyYXkiKSxsYWJlbDoiW10iLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yR3Vlc3NlZFZhbHVlKFtdLHQpLGluc2VydFRleHRGb3JtYXQ6aWUuU25pcHBldCxkZXRhaWw6RSgiTmV3IGFycmF5IiksZG9jdW1lbnRhdGlvbjoiIn0pfWFkZEJvb2xlYW5WYWx1ZUNvbXBsZXRpb24oZSx0LG4pe24uYWRkKHtraW5kOnRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoImJvb2xlYW4iKSxsYWJlbDplPyJ0cnVlIjoiZmFsc2UiLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoZSx0KSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjoiIn0pfWFkZE51bGxWYWx1ZUNvbXBsZXRpb24oZSx0KXt0LmFkZCh7a2luZDp0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKCJudWxsIiksbGFiZWw6Im51bGwiLGluc2VydFRleHQ6Im51bGwiK2UsaW5zZXJ0VGV4dEZvcm1hdDppZS5TbmlwcGV0LGRvY3VtZW50YXRpb246IiJ9KX1hZGREb2xsYXJTY2hlbWFDb21wbGV0aW9ucyhlLHQpe3RoaXMuc2NoZW1hU2VydmljZS5nZXRSZWdpc3RlcmVkU2NoZW1hSWRzKHI9PnI9PT0iaHR0cCJ8fHI9PT0iaHR0cHMiKS5mb3JFYWNoKHI9PntyLnN0YXJ0c1dpdGgoImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtIikmJihyPXIrIiMiKSx0LmFkZCh7a2luZDp5ZS5Nb2R1bGUsbGFiZWw6dGhpcy5nZXRMYWJlbEZvclZhbHVlKHIpLGZpbHRlclRleHQ6dGhpcy5nZXRGaWx0ZXJUZXh0Rm9yVmFsdWUociksaW5zZXJ0VGV4dDp0aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZShyLGUpLGluc2VydFRleHRGb3JtYXQ6aWUuU25pcHBldCxkb2N1bWVudGF0aW9uOiIifSl9KX1nZXRMYWJlbEZvclZhbHVlKGUpe3JldHVybiBKU09OLnN0cmluZ2lmeShlKX1nZXRWYWx1ZUZyb21MYWJlbChlKXtyZXR1cm4gSlNPTi5wYXJzZShlKX1nZXRGaWx0ZXJUZXh0Rm9yVmFsdWUoZSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpfWdldEZpbHRlclRleHRGb3JTbmlwcGV0VmFsdWUoZSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpLnJlcGxhY2UoL1wkXHtcZCs6KFtefV0rKVx9fFwkXGQrL2csIiQxIil9Z2V0TGFiZWxGb3JTbmlwcGV0VmFsdWUoZSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpLnJlcGxhY2UoL1wkXHtcZCs6KFtefV0rKVx9fFwkXGQrL2csIiQxIil9Z2V0SW5zZXJ0VGV4dEZvclBsYWluVGV4dChlKXtyZXR1cm4gZS5yZXBsYWNlKC9bXFxcJFx9XS9nLCJcXCQmIil9Z2V0SW5zZXJ0VGV4dEZvclZhbHVlKGUsdCl7Y29uc3Qgbj1KU09OLnN0cmluZ2lmeShlLG51bGwsIgkiKTtyZXR1cm4gbj09PSJ7fSI/InskMX0iK3Q6bj09PSJbXSI/IlskMV0iK3Q6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yUGxhaW5UZXh0KG4rdCl9Z2V0SW5zZXJ0VGV4dEZvclNuaXBwZXRWYWx1ZShlLHQpe3JldHVybiBZcihlLCIiLHI9PnR5cGVvZiByPT0ic3RyaW5nIiYmclswXT09PSJeIj9yLnN1YnN0cigxKTpKU09OLnN0cmluZ2lmeShyKSkrdH1nZXRJbnNlcnRUZXh0Rm9yR3Vlc3NlZFZhbHVlKGUsdCl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlIm9iamVjdCI6cmV0dXJuIGU9PT1udWxsPyIkezE6bnVsbH0iK3Q6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoZSx0KTtjYXNlInN0cmluZyI6bGV0IG49SlNPTi5zdHJpbmdpZnkoZSk7cmV0dXJuIG49bi5zdWJzdHIoMSxuLmxlbmd0aC0yKSxuPXRoaXMuZ2V0SW5zZXJ0VGV4dEZvclBsYWluVGV4dChuKSwnIiR7MTonK24rJ30iJyt0O2Nhc2UibnVtYmVyIjpjYXNlImJvb2xlYW4iOnJldHVybiIkezE6IitKU09OLnN0cmluZ2lmeShlKSsifSIrdH1yZXR1cm4gdGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoZSx0KX1nZXRTdWdnZXN0aW9uS2luZChlKXtpZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCB0PWU7ZT10Lmxlbmd0aD4wP3RbMF06dm9pZCAwfWlmKCFlKXJldHVybiB5ZS5WYWx1ZTtzd2l0Y2goZSl7Y2FzZSJzdHJpbmciOnJldHVybiB5ZS5WYWx1ZTtjYXNlIm9iamVjdCI6cmV0dXJuIHllLk1vZHVsZTtjYXNlInByb3BlcnR5IjpyZXR1cm4geWUuUHJvcGVydHk7ZGVmYXVsdDpyZXR1cm4geWUuVmFsdWV9fWdldExhYmVsVGV4dEZvck1hdGNoaW5nTm9kZShlLHQpe3N3aXRjaChlLnR5cGUpe2Nhc2UiYXJyYXkiOnJldHVybiJbXSI7Y2FzZSJvYmplY3QiOnJldHVybiJ7fSI7ZGVmYXVsdDpyZXR1cm4gdC5nZXRUZXh0KCkuc3Vic3RyKGUub2Zmc2V0LGUubGVuZ3RoKX19Z2V0SW5zZXJ0VGV4dEZvck1hdGNoaW5nTm9kZShlLHQsbil7c3dpdGNoKGUudHlwZSl7Y2FzZSJhcnJheSI6cmV0dXJuIHRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKFtdLG4pO2Nhc2Uib2JqZWN0IjpyZXR1cm4gdGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoe30sbik7ZGVmYXVsdDpjb25zdCByPXQuZ2V0VGV4dCgpLnN1YnN0cihlLm9mZnNldCxlLmxlbmd0aCkrbjtyZXR1cm4gdGhpcy5nZXRJbnNlcnRUZXh0Rm9yUGxhaW5UZXh0KHIpfX1nZXRJbnNlcnRUZXh0Rm9yUHJvcGVydHkoZSx0LG4scil7Y29uc3QgaT10aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZShlLCIiKTtpZighbilyZXR1cm4gaTtjb25zdCBzPWkrIjogIjtsZXQgYSxsPTA7aWYodCl7aWYoQXJyYXkuaXNBcnJheSh0LmRlZmF1bHRTbmlwcGV0cykpe2lmKHQuZGVmYXVsdFNuaXBwZXRzLmxlbmd0aD09PTEpe2NvbnN0IG89dC5kZWZhdWx0U25pcHBldHNbMF0uYm9keTtFZShvKSYmKGE9dGhpcy5nZXRJbnNlcnRUZXh0Rm9yU25pcHBldFZhbHVlKG8sIiIpKX1sKz10LmRlZmF1bHRTbmlwcGV0cy5sZW5ndGh9aWYodC5lbnVtJiYoIWEmJnQuZW51bS5sZW5ndGg9PT0xJiYoYT10aGlzLmdldEluc2VydFRleHRGb3JHdWVzc2VkVmFsdWUodC5lbnVtWzBdLCIiKSksbCs9dC5lbnVtLmxlbmd0aCksRWUodC5jb25zdCkmJihhfHwoYT10aGlzLmdldEluc2VydFRleHRGb3JHdWVzc2VkVmFsdWUodC5jb25zdCwiIikpLGwrKyksRWUodC5kZWZhdWx0KSYmKGF8fChhPXRoaXMuZ2V0SW5zZXJ0VGV4dEZvckd1ZXNzZWRWYWx1ZSh0LmRlZmF1bHQsIiIpKSxsKyspLEFycmF5LmlzQXJyYXkodC5leGFtcGxlcykmJnQuZXhhbXBsZXMubGVuZ3RoJiYoYXx8KGE9dGhpcy5nZXRJbnNlcnRUZXh0Rm9yR3Vlc3NlZFZhbHVlKHQuZXhhbXBsZXNbMF0sIiIpKSxsKz10LmV4YW1wbGVzLmxlbmd0aCksbD09PTApe2xldCBvPUFycmF5LmlzQXJyYXkodC50eXBlKT90LnR5cGVbMF06dC50eXBlO3N3aXRjaChvfHwodC5wcm9wZXJ0aWVzP289Im9iamVjdCI6dC5pdGVtcyYmKG89ImFycmF5IikpLG8pe2Nhc2UiYm9vbGVhbiI6YT0iJDEiO2JyZWFrO2Nhc2Uic3RyaW5nIjphPSciJDEiJzticmVhaztjYXNlIm9iamVjdCI6YT0ieyQxfSI7YnJlYWs7Y2FzZSJhcnJheSI6YT0iWyQxXSI7YnJlYWs7Y2FzZSJudW1iZXIiOmNhc2UiaW50ZWdlciI6YT0iJHsxOjB9IjticmVhaztjYXNlIm51bGwiOmE9IiR7MTpudWxsfSI7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gaX19fXJldHVybighYXx8bD4xKSYmKGE9IiQxIikscythK3J9Z2V0Q3VycmVudFdvcmQoZSx0KXtsZXQgbj10LTE7Y29uc3Qgcj1lLmdldFRleHQoKTtmb3IoO24+PTAmJmAgCQpcclx2Ijp7WyxdfWAuaW5kZXhPZihyLmNoYXJBdChuKSk9PT0tMTspbi0tO3JldHVybiByLnN1YnN0cmluZyhuKzEsdCl9ZXZhbHVhdGVTZXBhcmF0b3JBZnRlcihlLHQpe2NvbnN0IG49YXQoZS5nZXRUZXh0KCksITApO3N3aXRjaChuLnNldFBvc2l0aW9uKHQpLG4uc2NhbigpKXtjYXNlIDU6Y2FzZSAyOmNhc2UgNDpjYXNlIDE3OnJldHVybiIiO2RlZmF1bHQ6cmV0dXJuIiwifX1maW5kSXRlbUF0T2Zmc2V0KGUsdCxuKXtjb25zdCByPWF0KHQuZ2V0VGV4dCgpLCEwKSxpPWUuaXRlbXM7Zm9yKGxldCBzPWkubGVuZ3RoLTE7cz49MDtzLS0pe2NvbnN0IGE9aVtzXTtpZihuPmEub2Zmc2V0K2EubGVuZ3RoKXJldHVybiByLnNldFBvc2l0aW9uKGEub2Zmc2V0K2EubGVuZ3RoKSxyLnNjYW4oKT09PTUmJm4+PXIuZ2V0VG9rZW5PZmZzZXQoKStyLmdldFRva2VuTGVuZ3RoKCk/cysxOnM7aWYobj49YS5vZmZzZXQpcmV0dXJuIHN9cmV0dXJuIDB9aXNJbkNvbW1lbnQoZSx0LG4pe2NvbnN0IHI9YXQoZS5nZXRUZXh0KCksITEpO3Iuc2V0UG9zaXRpb24odCk7bGV0IGk9ci5zY2FuKCk7Zm9yKDtpIT09MTcmJnIuZ2V0VG9rZW5PZmZzZXQoKStyLmdldFRva2VuTGVuZ3RoKCk8bjspaT1yLnNjYW4oKTtyZXR1cm4oaT09PTEyfHxpPT09MTMpJiZyLmdldFRva2VuT2Zmc2V0KCk8PW59ZnJvbU1hcmt1cChlKXtpZihlJiZ0aGlzLmRvZXNTdXBwb3J0TWFya2Rvd24oKSlyZXR1cm57a2luZDpvdC5NYXJrZG93bix2YWx1ZTplfX1kb2VzU3VwcG9ydE1hcmtkb3duKCl7dmFyIGUsdCxuO2lmKCFFZSh0aGlzLnN1cHBvcnRzTWFya2Rvd24pKXtjb25zdCByPShuPSh0PShlPXRoaXMuY2xpZW50Q2FwYWJpbGl0aWVzLnRleHREb2N1bWVudCk9PW51bGw/dm9pZCAwOmUuY29tcGxldGlvbik9PW51bGw/dm9pZCAwOnQuY29tcGxldGlvbkl0ZW0pPT1udWxsP3ZvaWQgMDpuLmRvY3VtZW50YXRpb25Gb3JtYXQ7dGhpcy5zdXBwb3J0c01hcmtkb3duPUFycmF5LmlzQXJyYXkocikmJnIuaW5kZXhPZihvdC5NYXJrZG93bikhPT0tMX1yZXR1cm4gdGhpcy5zdXBwb3J0c01hcmtkb3dufWRvZXNTdXBwb3J0c0NvbW1pdENoYXJhY3RlcnMoKXt2YXIgZSx0LG47cmV0dXJuIEVlKHRoaXMuc3VwcG9ydHNDb21taXRDaGFyYWN0ZXJzKXx8KHRoaXMubGFiZWxEZXRhaWxzU3VwcG9ydD0obj0odD0oZT10aGlzLmNsaWVudENhcGFiaWxpdGllcy50ZXh0RG9jdW1lbnQpPT1udWxsP3ZvaWQgMDplLmNvbXBsZXRpb24pPT1udWxsP3ZvaWQgMDp0LmNvbXBsZXRpb25JdGVtKT09bnVsbD92b2lkIDA6bi5jb21taXRDaGFyYWN0ZXJzU3VwcG9ydCksdGhpcy5zdXBwb3J0c0NvbW1pdENoYXJhY3RlcnN9ZG9lc1N1cHBvcnRzTGFiZWxEZXRhaWxzKCl7dmFyIGUsdCxuO3JldHVybiBFZSh0aGlzLmxhYmVsRGV0YWlsc1N1cHBvcnQpfHwodGhpcy5sYWJlbERldGFpbHNTdXBwb3J0PShuPSh0PShlPXRoaXMuY2xpZW50Q2FwYWJpbGl0aWVzLnRleHREb2N1bWVudCk9PW51bGw/dm9pZCAwOmUuY29tcGxldGlvbik9PW51bGw/dm9pZCAwOnQuY29tcGxldGlvbkl0ZW0pPT1udWxsP3ZvaWQgMDpuLmxhYmVsRGV0YWlsc1N1cHBvcnQpLHRoaXMubGFiZWxEZXRhaWxzU3VwcG9ydH19LHIxPWNsYXNze2NvbnN0cnVjdG9yKGUsdD1bXSxuKXt0aGlzLnNjaGVtYVNlcnZpY2U9ZSx0aGlzLmNvbnRyaWJ1dGlvbnM9dCx0aGlzLnByb21pc2U9bnx8UHJvbWlzZX1kb0hvdmVyKGUsdCxuKXtjb25zdCByPWUub2Zmc2V0QXQodCk7bGV0IGk9bi5nZXROb2RlRnJvbU9mZnNldChyKTtpZighaXx8KGkudHlwZT09PSJvYmplY3QifHxpLnR5cGU9PT0iYXJyYXkiKSYmcj5pLm9mZnNldCsxJiZyPGkub2Zmc2V0K2kubGVuZ3RoLTEpcmV0dXJuIHRoaXMucHJvbWlzZS5yZXNvbHZlKG51bGwpO2NvbnN0IHM9aTtpZihpLnR5cGU9PT0ic3RyaW5nIil7Y29uc3QgdT1pLnBhcmVudDtpZih1JiZ1LnR5cGU9PT0icHJvcGVydHkiJiZ1LmtleU5vZGU9PT1pJiYoaT11LnZhbHVlTm9kZSwhaSkpcmV0dXJuIHRoaXMucHJvbWlzZS5yZXNvbHZlKG51bGwpfWNvbnN0IGE9cS5jcmVhdGUoZS5wb3NpdGlvbkF0KHMub2Zmc2V0KSxlLnBvc2l0aW9uQXQocy5vZmZzZXQrcy5sZW5ndGgpKSxsPXU9Pih7Y29udGVudHM6dSxyYW5nZTphfSksbz1RcihpKTtmb3IobGV0IHU9dGhpcy5jb250cmlidXRpb25zLmxlbmd0aC0xO3U+PTA7dS0tKXtjb25zdCBmPXRoaXMuY29udHJpYnV0aW9uc1t1XS5nZXRJbmZvQ29udHJpYnV0aW9uKGUudXJpLG8pO2lmKGYpcmV0dXJuIGYudGhlbihkPT5sKGQpKX1yZXR1cm4gdGhpcy5zY2hlbWFTZXJ2aWNlLmdldFNjaGVtYUZvclJlc291cmNlKGUudXJpLG4pLnRoZW4odT0+e2lmKHUmJmkpe2NvbnN0IGg9bi5nZXRNYXRjaGluZ1NjaGVtYXModS5zY2hlbWEsaS5vZmZzZXQpO2xldCBmLGQsbSxnO2guZXZlcnkoeD0+e2lmKHgubm9kZT09PWkmJiF4LmludmVydGVkJiZ4LnNjaGVtYSYmKGY9Znx8eC5zY2hlbWEudGl0bGUsZD1kfHx4LnNjaGVtYS5tYXJrZG93bkRlc2NyaXB0aW9ufHxacih4LnNjaGVtYS5kZXNjcmlwdGlvbikseC5zY2hlbWEuZW51bSkpe2NvbnN0IHc9eC5zY2hlbWEuZW51bS5pbmRleE9mKHV0KGkpKTt4LnNjaGVtYS5tYXJrZG93bkVudW1EZXNjcmlwdGlvbnM/bT14LnNjaGVtYS5tYXJrZG93bkVudW1EZXNjcmlwdGlvbnNbd106eC5zY2hlbWEuZW51bURlc2NyaXB0aW9ucyYmKG09WnIoeC5zY2hlbWEuZW51bURlc2NyaXB0aW9uc1t3XSkpLG0mJihnPXguc2NoZW1hLmVudW1bd10sdHlwZW9mIGchPSJzdHJpbmciJiYoZz1KU09OLnN0cmluZ2lmeShnKSkpfXJldHVybiEwfSk7bGV0IHA9IiI7cmV0dXJuIGYmJihwPVpyKGYpKSxkJiYocC5sZW5ndGg+MCYmKHArPWAKCmApLHArPWQpLG0mJihwLmxlbmd0aD4wJiYocCs9YAoKYCkscCs9YFxgJHtpMShnKX1cYDogJHttfWApLGwoW3BdKX1yZXR1cm4gbnVsbH0pfX07ZnVuY3Rpb24gWnIoZSl7aWYoZSlyZXR1cm4gZS5yZXBsYWNlKC8oW15cblxyXSkoXHI/XG4pKFteXG5ccl0pL2dtLGAkMQoKJDNgKS5yZXBsYWNlKC9bXFxgKl97fVtcXSgpIytcLS4hXS9nLCJcXCQmIil9ZnVuY3Rpb24gaTEoZSl7cmV0dXJuIGUuaW5kZXhPZigiYCIpIT09LTE/ImBgICIrZSsiIGBgIjplfXZhciBzMT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuanNvblNjaGVtYVNlcnZpY2U9ZSx0aGlzLnByb21pc2U9dCx0aGlzLnZhbGlkYXRpb25FbmFibGVkPSEwfWNvbmZpZ3VyZShlKXtlJiYodGhpcy52YWxpZGF0aW9uRW5hYmxlZD1lLnZhbGlkYXRlIT09ITEsdGhpcy5jb21tZW50U2V2ZXJpdHk9ZS5hbGxvd0NvbW1lbnRzP3ZvaWQgMDp4ZS5FcnJvcil9ZG9WYWxpZGF0aW9uKGUsdCxuLHIpe2lmKCF0aGlzLnZhbGlkYXRpb25FbmFibGVkKXJldHVybiB0aGlzLnByb21pc2UucmVzb2x2ZShbXSk7Y29uc3QgaT1bXSxzPXt9LGE9bz0+e2NvbnN0IHU9by5yYW5nZS5zdGFydC5saW5lKyIgIitvLnJhbmdlLnN0YXJ0LmNoYXJhY3RlcisiICIrby5tZXNzYWdlO3NbdV18fChzW3VdPSEwLGkucHVzaChvKSl9LGw9bz0+e2xldCB1PW4hPW51bGwmJm4udHJhaWxpbmdDb21tYXM/UG4obi50cmFpbGluZ0NvbW1hcyk6eGUuRXJyb3IsaD1uIT1udWxsJiZuLmNvbW1lbnRzP1BuKG4uY29tbWVudHMpOnRoaXMuY29tbWVudFNldmVyaXR5LGY9biE9bnVsbCYmbi5zY2hlbWFWYWxpZGF0aW9uP1BuKG4uc2NoZW1hVmFsaWRhdGlvbik6eGUuV2FybmluZyxkPW4hPW51bGwmJm4uc2NoZW1hUmVxdWVzdD9QbihuLnNjaGVtYVJlcXVlc3QpOnhlLldhcm5pbmc7aWYobyl7Y29uc3QgbT0oZyxwKT0+e2lmKHQucm9vdCYmZCl7Y29uc3QgeD10LnJvb3Qsdz14LnR5cGU9PT0ib2JqZWN0Ij94LnByb3BlcnRpZXNbMF06dm9pZCAwO2lmKHcmJncua2V5Tm9kZS52YWx1ZT09PSIkc2NoZW1hIil7Y29uc3QgTD13LnZhbHVlTm9kZXx8dyx2PXEuY3JlYXRlKGUucG9zaXRpb25BdChMLm9mZnNldCksZS5wb3NpdGlvbkF0KEwub2Zmc2V0K0wubGVuZ3RoKSk7YSh6ZS5jcmVhdGUodixnLGQscCkpfWVsc2V7Y29uc3QgTD1xLmNyZWF0ZShlLnBvc2l0aW9uQXQoeC5vZmZzZXQpLGUucG9zaXRpb25BdCh4Lm9mZnNldCsxKSk7YSh6ZS5jcmVhdGUoTCxnLGQscCkpfX19O2lmKG8uZXJyb3JzLmxlbmd0aCltKG8uZXJyb3JzWzBdLEguU2NoZW1hUmVzb2x2ZUVycm9yKTtlbHNlIGlmKGYpe2Zvcihjb25zdCBwIG9mIG8ud2FybmluZ3MpbShwLEguU2NoZW1hVW5zdXBwb3J0ZWRGZWF0dXJlKTtjb25zdCBnPXQudmFsaWRhdGUoZSxvLnNjaGVtYSxmLG49PW51bGw/dm9pZCAwOm4uc2NoZW1hRHJhZnQpO2cmJmcuZm9yRWFjaChhKX1NbyhvLnNjaGVtYSkmJihoPXZvaWQgMCksQ28oby5zY2hlbWEpJiYodT12b2lkIDApfWZvcihjb25zdCBtIG9mIHQuc3ludGF4RXJyb3JzKXtpZihtLmNvZGU9PT1ILlRyYWlsaW5nQ29tbWEpe2lmKHR5cGVvZiB1IT0ibnVtYmVyIiljb250aW51ZTttLnNldmVyaXR5PXV9YShtKX1pZih0eXBlb2YgaD09Im51bWJlciIpe2NvbnN0IG09RSgiQ29tbWVudHMgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gSlNPTi4iKTt0LmNvbW1lbnRzLmZvckVhY2goZz0+e2EoemUuY3JlYXRlKGcsbSxoLEguQ29tbWVudE5vdFBlcm1pdHRlZCkpfSl9cmV0dXJuIGl9O2lmKHIpe2NvbnN0IG89ci5pZHx8InNjaGVtYXNlcnZpY2U6Ly91bnRpdGxlZC8iK2ExKys7cmV0dXJuIHRoaXMuanNvblNjaGVtYVNlcnZpY2UucmVnaXN0ZXJFeHRlcm5hbFNjaGVtYSh7dXJpOm8sc2NoZW1hOnJ9KS5nZXRSZXNvbHZlZFNjaGVtYSgpLnRoZW4oaD0+bChoKSl9cmV0dXJuIHRoaXMuanNvblNjaGVtYVNlcnZpY2UuZ2V0U2NoZW1hRm9yUmVzb3VyY2UoZS51cmksdCkudGhlbihvPT5sKG8pKX1nZXRMYW5ndWFnZVN0YXR1cyhlLHQpe3JldHVybntzY2hlbWFzOnRoaXMuanNvblNjaGVtYVNlcnZpY2UuZ2V0U2NoZW1hVVJJc0ZvclJlc291cmNlKGUudXJpLHQpfX19LGExPTA7ZnVuY3Rpb24gTW8oZSl7aWYoZSYmdHlwZW9mIGU9PSJvYmplY3QiKXtpZihWZShlLmFsbG93Q29tbWVudHMpKXJldHVybiBlLmFsbG93Q29tbWVudHM7aWYoZS5hbGxPZilmb3IoY29uc3QgdCBvZiBlLmFsbE9mKXtjb25zdCBuPU1vKHQpO2lmKFZlKG4pKXJldHVybiBufX19ZnVuY3Rpb24gQ28oZSl7aWYoZSYmdHlwZW9mIGU9PSJvYmplY3QiKXtpZihWZShlLmFsbG93VHJhaWxpbmdDb21tYXMpKXJldHVybiBlLmFsbG93VHJhaWxpbmdDb21tYXM7Y29uc3QgdD1lO2lmKFZlKHQuYWxsb3dzVHJhaWxpbmdDb21tYXMpKXJldHVybiB0LmFsbG93c1RyYWlsaW5nQ29tbWFzO2lmKGUuYWxsT2YpZm9yKGNvbnN0IG4gb2YgZS5hbGxPZil7Y29uc3Qgcj1DbyhuKTtpZihWZShyKSlyZXR1cm4gcn19fWZ1bmN0aW9uIFBuKGUpe3N3aXRjaChlKXtjYXNlImVycm9yIjpyZXR1cm4geGUuRXJyb3I7Y2FzZSJ3YXJuaW5nIjpyZXR1cm4geGUuV2FybmluZztjYXNlImlnbm9yZSI6cmV0dXJufX12YXIgVG89NDgsbzE9NTcsbDE9NjUsSW49OTcsdTE9MTAyO2Z1bmN0aW9uIHRlKGUpe3JldHVybiBlPFRvPzA6ZTw9bzE/ZS1UbzooZTxJbiYmKGUrPUluLWwxKSxlPj1JbiYmZTw9dTE/ZS1JbisxMDowKX1mdW5jdGlvbiBjMShlKXtpZihlWzBdPT09IiMiKXN3aXRjaChlLmxlbmd0aCl7Y2FzZSA0OnJldHVybntyZWQ6dGUoZS5jaGFyQ29kZUF0KDEpKSoxNy8yNTUsZ3JlZW46dGUoZS5jaGFyQ29kZUF0KDIpKSoxNy8yNTUsYmx1ZTp0ZShlLmNoYXJDb2RlQXQoMykpKjE3LzI1NSxhbHBoYToxfTtjYXNlIDU6cmV0dXJue3JlZDp0ZShlLmNoYXJDb2RlQXQoMSkpKjE3LzI1NSxncmVlbjp0ZShlLmNoYXJDb2RlQXQoMikpKjE3LzI1NSxibHVlOnRlKGUuY2hhckNvZGVBdCgzKSkqMTcvMjU1LGFscGhhOnRlKGUuY2hhckNvZGVBdCg0KSkqMTcvMjU1fTtjYXNlIDc6cmV0dXJue3JlZDoodGUoZS5jaGFyQ29kZUF0KDEpKSoxNit0ZShlLmNoYXJDb2RlQXQoMikpKS8yNTUsZ3JlZW46KHRlKGUuY2hhckNvZGVBdCgzKSkqMTYrdGUoZS5jaGFyQ29kZUF0KDQpKSkvMjU1LGJsdWU6KHRlKGUuY2hhckNvZGVBdCg1KSkqMTYrdGUoZS5jaGFyQ29kZUF0KDYpKSkvMjU1LGFscGhhOjF9O2Nhc2UgOTpyZXR1cm57cmVkOih0ZShlLmNoYXJDb2RlQXQoMSkpKjE2K3RlKGUuY2hhckNvZGVBdCgyKSkpLzI1NSxncmVlbjoodGUoZS5jaGFyQ29kZUF0KDMpKSoxNit0ZShlLmNoYXJDb2RlQXQoNCkpKS8yNTUsYmx1ZToodGUoZS5jaGFyQ29kZUF0KDUpKSoxNit0ZShlLmNoYXJDb2RlQXQoNikpKS8yNTUsYWxwaGE6KHRlKGUuY2hhckNvZGVBdCg3KSkqMTYrdGUoZS5jaGFyQ29kZUF0KDgpKSkvMjU1fX19dmFyIGYxPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuc2NoZW1hU2VydmljZT1lfWZpbmREb2N1bWVudFN5bWJvbHMoZSx0LG49e3Jlc3VsdExpbWl0Ok51bWJlci5NQVhfVkFMVUV9KXtjb25zdCByPXQucm9vdDtpZighcilyZXR1cm5bXTtsZXQgaT1uLnJlc3VsdExpbWl0fHxOdW1iZXIuTUFYX1ZBTFVFO2NvbnN0IHM9ZS51cmk7aWYoKHM9PT0idnNjb2RlOi8vZGVmYXVsdHNldHRpbmdzL2tleWJpbmRpbmdzLmpzb24ifHxRdChzLnRvTG93ZXJDYXNlKCksIi91c2VyL2tleWJpbmRpbmdzLmpzb24iKSkmJnIudHlwZT09PSJhcnJheSIpe2NvbnN0IGY9W107Zm9yKGNvbnN0IGQgb2Ygci5pdGVtcylpZihkLnR5cGU9PT0ib2JqZWN0Iil7Zm9yKGNvbnN0IG0gb2YgZC5wcm9wZXJ0aWVzKWlmKG0ua2V5Tm9kZS52YWx1ZT09PSJrZXkiJiZtLnZhbHVlTm9kZSl7Y29uc3QgZz1FdC5jcmVhdGUoZS51cmksdHQoZSxkKSk7aWYoZi5wdXNoKHtuYW1lOlBvKG0udmFsdWVOb2RlKSxraW5kOk9lLkZ1bmN0aW9uLGxvY2F0aW9uOmd9KSxpLS0saTw9MClyZXR1cm4gbiYmbi5vblJlc3VsdExpbWl0RXhjZWVkZWQmJm4ub25SZXN1bHRMaW1pdEV4Y2VlZGVkKHMpLGZ9fXJldHVybiBmfWNvbnN0IGE9W3tub2RlOnIsY29udGFpbmVyTmFtZToiIn1dO2xldCBsPTAsbz0hMTtjb25zdCB1PVtdLGg9KGYsZCk9PntmLnR5cGU9PT0iYXJyYXkiP2YuaXRlbXMuZm9yRWFjaChtPT57bSYmYS5wdXNoKHtub2RlOm0sY29udGFpbmVyTmFtZTpkfSl9KTpmLnR5cGU9PT0ib2JqZWN0IiYmZi5wcm9wZXJ0aWVzLmZvckVhY2gobT0+e2NvbnN0IGc9bS52YWx1ZU5vZGU7aWYoZylpZihpPjApe2ktLTtjb25zdCBwPUV0LmNyZWF0ZShlLnVyaSx0dChlLG0pKSx4PWQ/ZCsiLiIrbS5rZXlOb2RlLnZhbHVlOm0ua2V5Tm9kZS52YWx1ZTt1LnB1c2goe25hbWU6dGhpcy5nZXRLZXlMYWJlbChtKSxraW5kOnRoaXMuZ2V0U3ltYm9sS2luZChnLnR5cGUpLGxvY2F0aW9uOnAsY29udGFpbmVyTmFtZTpkfSksYS5wdXNoKHtub2RlOmcsY29udGFpbmVyTmFtZTp4fSl9ZWxzZSBvPSEwfSl9O2Zvcig7bDxhLmxlbmd0aDspe2NvbnN0IGY9YVtsKytdO2goZi5ub2RlLGYuY29udGFpbmVyTmFtZSl9cmV0dXJuIG8mJm4mJm4ub25SZXN1bHRMaW1pdEV4Y2VlZGVkJiZuLm9uUmVzdWx0TGltaXRFeGNlZWRlZChzKSx1fWZpbmREb2N1bWVudFN5bWJvbHMyKGUsdCxuPXtyZXN1bHRMaW1pdDpOdW1iZXIuTUFYX1ZBTFVFfSl7Y29uc3Qgcj10LnJvb3Q7aWYoIXIpcmV0dXJuW107bGV0IGk9bi5yZXN1bHRMaW1pdHx8TnVtYmVyLk1BWF9WQUxVRTtjb25zdCBzPWUudXJpO2lmKChzPT09InZzY29kZTovL2RlZmF1bHRzZXR0aW5ncy9rZXliaW5kaW5ncy5qc29uInx8UXQocy50b0xvd2VyQ2FzZSgpLCIvdXNlci9rZXliaW5kaW5ncy5qc29uIikpJiZyLnR5cGU9PT0iYXJyYXkiKXtjb25zdCBmPVtdO2Zvcihjb25zdCBkIG9mIHIuaXRlbXMpaWYoZC50eXBlPT09Im9iamVjdCIpe2Zvcihjb25zdCBtIG9mIGQucHJvcGVydGllcylpZihtLmtleU5vZGUudmFsdWU9PT0ia2V5IiYmbS52YWx1ZU5vZGUpe2NvbnN0IGc9dHQoZSxkKSxwPXR0KGUsbS5rZXlOb2RlKTtpZihmLnB1c2goe25hbWU6UG8obS52YWx1ZU5vZGUpLGtpbmQ6T2UuRnVuY3Rpb24scmFuZ2U6ZyxzZWxlY3Rpb25SYW5nZTpwfSksaS0tLGk8PTApcmV0dXJuIG4mJm4ub25SZXN1bHRMaW1pdEV4Y2VlZGVkJiZuLm9uUmVzdWx0TGltaXRFeGNlZWRlZChzKSxmfX1yZXR1cm4gZn1jb25zdCBhPVtdLGw9W3tub2RlOnIscmVzdWx0OmF9XTtsZXQgbz0wLHU9ITE7Y29uc3QgaD0oZixkKT0+e2YudHlwZT09PSJhcnJheSI/Zi5pdGVtcy5mb3JFYWNoKChtLGcpPT57aWYobSlpZihpPjApe2ktLTtjb25zdCBwPXR0KGUsbSkseD1wLEw9e25hbWU6U3RyaW5nKGcpLGtpbmQ6dGhpcy5nZXRTeW1ib2xLaW5kKG0udHlwZSkscmFuZ2U6cCxzZWxlY3Rpb25SYW5nZTp4LGNoaWxkcmVuOltdfTtkLnB1c2goTCksbC5wdXNoKHtyZXN1bHQ6TC5jaGlsZHJlbixub2RlOm19KX1lbHNlIHU9ITB9KTpmLnR5cGU9PT0ib2JqZWN0IiYmZi5wcm9wZXJ0aWVzLmZvckVhY2gobT0+e2NvbnN0IGc9bS52YWx1ZU5vZGU7aWYoZylpZihpPjApe2ktLTtjb25zdCBwPXR0KGUsbSkseD10dChlLG0ua2V5Tm9kZSksdz1bXSxMPXtuYW1lOnRoaXMuZ2V0S2V5TGFiZWwobSksa2luZDp0aGlzLmdldFN5bWJvbEtpbmQoZy50eXBlKSxyYW5nZTpwLHNlbGVjdGlvblJhbmdlOngsY2hpbGRyZW46dyxkZXRhaWw6dGhpcy5nZXREZXRhaWwoZyl9O2QucHVzaChMKSxsLnB1c2goe3Jlc3VsdDp3LG5vZGU6Z30pfWVsc2UgdT0hMH0pfTtmb3IoO288bC5sZW5ndGg7KXtjb25zdCBmPWxbbysrXTtoKGYubm9kZSxmLnJlc3VsdCl9cmV0dXJuIHUmJm4mJm4ub25SZXN1bHRMaW1pdEV4Y2VlZGVkJiZuLm9uUmVzdWx0TGltaXRFeGNlZWRlZChzKSxhfWdldFN5bWJvbEtpbmQoZSl7c3dpdGNoKGUpe2Nhc2Uib2JqZWN0IjpyZXR1cm4gT2UuTW9kdWxlO2Nhc2Uic3RyaW5nIjpyZXR1cm4gT2UuU3RyaW5nO2Nhc2UibnVtYmVyIjpyZXR1cm4gT2UuTnVtYmVyO2Nhc2UiYXJyYXkiOnJldHVybiBPZS5BcnJheTtjYXNlImJvb2xlYW4iOnJldHVybiBPZS5Cb29sZWFuO2RlZmF1bHQ6cmV0dXJuIE9lLlZhcmlhYmxlfX1nZXRLZXlMYWJlbChlKXtsZXQgdD1lLmtleU5vZGUudmFsdWU7cmV0dXJuIHQmJih0PXQucmVwbGFjZSgvW1xuXS9nLCLihrUiKSksdCYmdC50cmltKCk/dDpgIiR7dH0iYH1nZXREZXRhaWwoZSl7aWYoZSl7aWYoZS50eXBlPT09ImJvb2xlYW4ifHxlLnR5cGU9PT0ibnVtYmVyInx8ZS50eXBlPT09Im51bGwifHxlLnR5cGU9PT0ic3RyaW5nIilyZXR1cm4gU3RyaW5nKGUudmFsdWUpO2lmKGUudHlwZT09PSJhcnJheSIpcmV0dXJuIGUuY2hpbGRyZW4ubGVuZ3RoP3ZvaWQgMDoiW10iO2lmKGUudHlwZT09PSJvYmplY3QiKXJldHVybiBlLmNoaWxkcmVuLmxlbmd0aD92b2lkIDA6Int9In19ZmluZERvY3VtZW50Q29sb3JzKGUsdCxuKXtyZXR1cm4gdGhpcy5zY2hlbWFTZXJ2aWNlLmdldFNjaGVtYUZvclJlc291cmNlKGUudXJpLHQpLnRoZW4ocj0+e2NvbnN0IGk9W107aWYocil7bGV0IHM9biYmdHlwZW9mIG4ucmVzdWx0TGltaXQ9PSJudW1iZXIiP24ucmVzdWx0TGltaXQ6TnVtYmVyLk1BWF9WQUxVRTtjb25zdCBhPXQuZ2V0TWF0Y2hpbmdTY2hlbWFzKHIuc2NoZW1hKSxsPXt9O2Zvcihjb25zdCBvIG9mIGEpaWYoIW8uaW52ZXJ0ZWQmJm8uc2NoZW1hJiYoby5zY2hlbWEuZm9ybWF0PT09ImNvbG9yInx8by5zY2hlbWEuZm9ybWF0PT09ImNvbG9yLWhleCIpJiZvLm5vZGUmJm8ubm9kZS50eXBlPT09InN0cmluZyIpe2NvbnN0IHU9U3RyaW5nKG8ubm9kZS5vZmZzZXQpO2lmKCFsW3VdKXtjb25zdCBoPWMxKHV0KG8ubm9kZSkpO2lmKGgpe2NvbnN0IGY9dHQoZSxvLm5vZGUpO2kucHVzaCh7Y29sb3I6aCxyYW5nZTpmfSl9aWYobFt1XT0hMCxzLS0sczw9MClyZXR1cm4gbiYmbi5vblJlc3VsdExpbWl0RXhjZWVkZWQmJm4ub25SZXN1bHRMaW1pdEV4Y2VlZGVkKGUudXJpKSxpfX19cmV0dXJuIGl9KX1nZXRDb2xvclByZXNlbnRhdGlvbnMoZSx0LG4scil7Y29uc3QgaT1bXSxzPU1hdGgucm91bmQobi5yZWQqMjU1KSxhPU1hdGgucm91bmQobi5ncmVlbioyNTUpLGw9TWF0aC5yb3VuZChuLmJsdWUqMjU1KTtmdW5jdGlvbiBvKGgpe2NvbnN0IGY9aC50b1N0cmluZygxNik7cmV0dXJuIGYubGVuZ3RoIT09Mj8iMCIrZjpmfWxldCB1O3JldHVybiBuLmFscGhhPT09MT91PWAjJHtvKHMpfSR7byhhKX0ke28obCl9YDp1PWAjJHtvKHMpfSR7byhhKX0ke28obCl9JHtvKE1hdGgucm91bmQobi5hbHBoYSoyNTUpKX1gLGkucHVzaCh7bGFiZWw6dSx0ZXh0RWRpdDpEZS5yZXBsYWNlKHIsSlNPTi5zdHJpbmdpZnkodSkpfSksaX19O2Z1bmN0aW9uIHR0KGUsdCl7cmV0dXJuIHEuY3JlYXRlKGUucG9zaXRpb25BdCh0Lm9mZnNldCksZS5wb3NpdGlvbkF0KHQub2Zmc2V0K3QubGVuZ3RoKSl9ZnVuY3Rpb24gUG8oZSl7cmV0dXJuIHV0KGUpfHxFKCI8ZW1wdHk+Iil9dmFyIEtyPXtzY2hlbWFBc3NvY2lhdGlvbnM6W10sc2NoZW1hczp7Imh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyI6eyRzY2hlbWE6Imh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsZGVmaW5pdGlvbnM6e3NjaGVtYUFycmF5Ont0eXBlOiJhcnJheSIsbWluSXRlbXM6MSxpdGVtczp7JHJlZjoiIyJ9fSxwb3NpdGl2ZUludGVnZXI6e3R5cGU6ImludGVnZXIiLG1pbmltdW06MH0scG9zaXRpdmVJbnRlZ2VyRGVmYXVsdDA6e2FsbE9mOlt7JHJlZjoiIy9kZWZpbml0aW9ucy9wb3NpdGl2ZUludGVnZXIifSx7ZGVmYXVsdDowfV19LHNpbXBsZVR5cGVzOnt0eXBlOiJzdHJpbmciLGVudW06WyJhcnJheSIsImJvb2xlYW4iLCJpbnRlZ2VyIiwibnVsbCIsIm51bWJlciIsIm9iamVjdCIsInN0cmluZyJdfSxzdHJpbmdBcnJheTp7dHlwZToiYXJyYXkiLGl0ZW1zOnt0eXBlOiJzdHJpbmcifSxtaW5JdGVtczoxLHVuaXF1ZUl0ZW1zOiEwfX0sdHlwZToib2JqZWN0Iixwcm9wZXJ0aWVzOntpZDp7dHlwZToic3RyaW5nIixmb3JtYXQ6InVyaSJ9LCRzY2hlbWE6e3R5cGU6InN0cmluZyIsZm9ybWF0OiJ1cmkifSx0aXRsZTp7dHlwZToic3RyaW5nIn0sZGVzY3JpcHRpb246e3R5cGU6InN0cmluZyJ9LGRlZmF1bHQ6e30sbXVsdGlwbGVPZjp7dHlwZToibnVtYmVyIixtaW5pbXVtOjAsZXhjbHVzaXZlTWluaW11bTohMH0sbWF4aW11bTp7dHlwZToibnVtYmVyIn0sZXhjbHVzaXZlTWF4aW11bTp7dHlwZToiYm9vbGVhbiIsZGVmYXVsdDohMX0sbWluaW11bTp7dHlwZToibnVtYmVyIn0sZXhjbHVzaXZlTWluaW11bTp7dHlwZToiYm9vbGVhbiIsZGVmYXVsdDohMX0sbWF4TGVuZ3RoOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvcG9zaXRpdmVJbnRlZ2VyIn1dfSxtaW5MZW5ndGg6e2FsbE9mOlt7JHJlZjoiIy9kZWZpbml0aW9ucy9wb3NpdGl2ZUludGVnZXJEZWZhdWx0MCJ9XX0scGF0dGVybjp7dHlwZToic3RyaW5nIixmb3JtYXQ6InJlZ2V4In0sYWRkaXRpb25hbEl0ZW1zOnthbnlPZjpbe3R5cGU6ImJvb2xlYW4ifSx7JHJlZjoiIyJ9XSxkZWZhdWx0Ont9fSxpdGVtczp7YW55T2Y6W3skcmVmOiIjIn0seyRyZWY6IiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkifV0sZGVmYXVsdDp7fX0sbWF4SXRlbXM6e2FsbE9mOlt7JHJlZjoiIy9kZWZpbml0aW9ucy9wb3NpdGl2ZUludGVnZXIifV19LG1pbkl0ZW1zOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvcG9zaXRpdmVJbnRlZ2VyRGVmYXVsdDAifV19LHVuaXF1ZUl0ZW1zOnt0eXBlOiJib29sZWFuIixkZWZhdWx0OiExfSxtYXhQcm9wZXJ0aWVzOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvcG9zaXRpdmVJbnRlZ2VyIn1dfSxtaW5Qcm9wZXJ0aWVzOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvcG9zaXRpdmVJbnRlZ2VyRGVmYXVsdDAifV19LHJlcXVpcmVkOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvc3RyaW5nQXJyYXkifV19LGFkZGl0aW9uYWxQcm9wZXJ0aWVzOnthbnlPZjpbe3R5cGU6ImJvb2xlYW4ifSx7JHJlZjoiIyJ9XSxkZWZhdWx0Ont9fSxkZWZpbml0aW9uczp7dHlwZToib2JqZWN0IixhZGRpdGlvbmFsUHJvcGVydGllczp7JHJlZjoiIyJ9LGRlZmF1bHQ6e319LHByb3BlcnRpZXM6e3R5cGU6Im9iamVjdCIsYWRkaXRpb25hbFByb3BlcnRpZXM6eyRyZWY6IiMifSxkZWZhdWx0Ont9fSxwYXR0ZXJuUHJvcGVydGllczp7dHlwZToib2JqZWN0IixhZGRpdGlvbmFsUHJvcGVydGllczp7JHJlZjoiIyJ9LGRlZmF1bHQ6e319LGRlcGVuZGVuY2llczp7dHlwZToib2JqZWN0IixhZGRpdGlvbmFsUHJvcGVydGllczp7YW55T2Y6W3skcmVmOiIjIn0seyRyZWY6IiMvZGVmaW5pdGlvbnMvc3RyaW5nQXJyYXkifV19fSxlbnVtOnt0eXBlOiJhcnJheSIsbWluSXRlbXM6MSx1bmlxdWVJdGVtczohMH0sdHlwZTp7YW55T2Y6W3skcmVmOiIjL2RlZmluaXRpb25zL3NpbXBsZVR5cGVzIn0se3R5cGU6ImFycmF5IixpdGVtczp7JHJlZjoiIy9kZWZpbml0aW9ucy9zaW1wbGVUeXBlcyJ9LG1pbkl0ZW1zOjEsdW5pcXVlSXRlbXM6ITB9XX0sZm9ybWF0OnthbnlPZjpbe3R5cGU6InN0cmluZyIsZW51bTpbImRhdGUtdGltZSIsInVyaSIsImVtYWlsIiwiaG9zdG5hbWUiLCJpcHY0IiwiaXB2NiIsInJlZ2V4Il19LHt0eXBlOiJzdHJpbmcifV19LGFsbE9mOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkifV19LGFueU9mOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkifV19LG9uZU9mOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkifV19LG5vdDp7YWxsT2Y6W3skcmVmOiIjIn1dfX0sZGVwZW5kZW5jaWVzOntleGNsdXNpdmVNYXhpbXVtOlsibWF4aW11bSJdLGV4Y2x1c2l2ZU1pbmltdW06WyJtaW5pbXVtIl19LGRlZmF1bHQ6e319LCJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSMiOntkZWZpbml0aW9uczp7c2NoZW1hQXJyYXk6e3R5cGU6ImFycmF5IixtaW5JdGVtczoxLGl0ZW1zOnskcmVmOiIjIn19LG5vbk5lZ2F0aXZlSW50ZWdlcjp7dHlwZToiaW50ZWdlciIsbWluaW11bTowfSxub25OZWdhdGl2ZUludGVnZXJEZWZhdWx0MDp7YWxsT2Y6W3skcmVmOiIjL2RlZmluaXRpb25zL25vbk5lZ2F0aXZlSW50ZWdlciJ9LHtkZWZhdWx0OjB9XX0sc2ltcGxlVHlwZXM6e2VudW06WyJhcnJheSIsImJvb2xlYW4iLCJpbnRlZ2VyIiwibnVsbCIsIm51bWJlciIsIm9iamVjdCIsInN0cmluZyJdfSxzdHJpbmdBcnJheTp7dHlwZToiYXJyYXkiLGl0ZW1zOnt0eXBlOiJzdHJpbmcifSx1bmlxdWVJdGVtczohMCxkZWZhdWx0OltdfX0sdHlwZTpbIm9iamVjdCIsImJvb2xlYW4iXSxwcm9wZXJ0aWVzOnskaWQ6e3R5cGU6InN0cmluZyIsZm9ybWF0OiJ1cmktcmVmZXJlbmNlIn0sJHNjaGVtYTp7dHlwZToic3RyaW5nIixmb3JtYXQ6InVyaSJ9LCRyZWY6e3R5cGU6InN0cmluZyIsZm9ybWF0OiJ1cmktcmVmZXJlbmNlIn0sJGNvbW1lbnQ6e3R5cGU6InN0cmluZyJ9LHRpdGxlOnt0eXBlOiJzdHJpbmcifSxkZXNjcmlwdGlvbjp7dHlwZToic3RyaW5nIn0sZGVmYXVsdDohMCxyZWFkT25seTp7dHlwZToiYm9vbGVhbiIsZGVmYXVsdDohMX0sZXhhbXBsZXM6e3R5cGU6ImFycmF5IixpdGVtczohMH0sbXVsdGlwbGVPZjp7dHlwZToibnVtYmVyIixleGNsdXNpdmVNaW5pbXVtOjB9LG1heGltdW06e3R5cGU6Im51bWJlciJ9LGV4Y2x1c2l2ZU1heGltdW06e3R5cGU6Im51bWJlciJ9LG1pbmltdW06e3R5cGU6Im51bWJlciJ9LGV4Y2x1c2l2ZU1pbmltdW06e3R5cGU6Im51bWJlciJ9LG1heExlbmd0aDp7JHJlZjoiIy9kZWZpbml0aW9ucy9ub25OZWdhdGl2ZUludGVnZXIifSxtaW5MZW5ndGg6eyRyZWY6IiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyRGVmYXVsdDAifSxwYXR0ZXJuOnt0eXBlOiJzdHJpbmciLGZvcm1hdDoicmVnZXgifSxhZGRpdGlvbmFsSXRlbXM6eyRyZWY6IiMifSxpdGVtczp7YW55T2Y6W3skcmVmOiIjIn0seyRyZWY6IiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkifV0sZGVmYXVsdDohMH0sbWF4SXRlbXM6eyRyZWY6IiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyIn0sbWluSXRlbXM6eyRyZWY6IiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyRGVmYXVsdDAifSx1bmlxdWVJdGVtczp7dHlwZToiYm9vbGVhbiIsZGVmYXVsdDohMX0sY29udGFpbnM6eyRyZWY6IiMifSxtYXhQcm9wZXJ0aWVzOnskcmVmOiIjL2RlZmluaXRpb25zL25vbk5lZ2F0aXZlSW50ZWdlciJ9LG1pblByb3BlcnRpZXM6eyRyZWY6IiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyRGVmYXVsdDAifSxyZXF1aXJlZDp7JHJlZjoiIy9kZWZpbml0aW9ucy9zdHJpbmdBcnJheSJ9LGFkZGl0aW9uYWxQcm9wZXJ0aWVzOnskcmVmOiIjIn0sZGVmaW5pdGlvbnM6e3R5cGU6Im9iamVjdCIsYWRkaXRpb25hbFByb3BlcnRpZXM6eyRyZWY6IiMifSxkZWZhdWx0Ont9fSxwcm9wZXJ0aWVzOnt0eXBlOiJvYmplY3QiLGFkZGl0aW9uYWxQcm9wZXJ0aWVzOnskcmVmOiIjIn0sZGVmYXVsdDp7fX0scGF0dGVyblByb3BlcnRpZXM6e3R5cGU6Im9iamVjdCIsYWRkaXRpb25hbFByb3BlcnRpZXM6eyRyZWY6IiMifSxwcm9wZXJ0eU5hbWVzOntmb3JtYXQ6InJlZ2V4In0sZGVmYXVsdDp7fX0sZGVwZW5kZW5jaWVzOnt0eXBlOiJvYmplY3QiLGFkZGl0aW9uYWxQcm9wZXJ0aWVzOnthbnlPZjpbeyRyZWY6IiMifSx7JHJlZjoiIy9kZWZpbml0aW9ucy9zdHJpbmdBcnJheSJ9XX19LHByb3BlcnR5TmFtZXM6eyRyZWY6IiMifSxjb25zdDohMCxlbnVtOnt0eXBlOiJhcnJheSIsaXRlbXM6ITAsbWluSXRlbXM6MSx1bmlxdWVJdGVtczohMH0sdHlwZTp7YW55T2Y6W3skcmVmOiIjL2RlZmluaXRpb25zL3NpbXBsZVR5cGVzIn0se3R5cGU6ImFycmF5IixpdGVtczp7JHJlZjoiIy9kZWZpbml0aW9ucy9zaW1wbGVUeXBlcyJ9LG1pbkl0ZW1zOjEsdW5pcXVlSXRlbXM6ITB9XX0sZm9ybWF0Ont0eXBlOiJzdHJpbmcifSxjb250ZW50TWVkaWFUeXBlOnt0eXBlOiJzdHJpbmcifSxjb250ZW50RW5jb2Rpbmc6e3R5cGU6InN0cmluZyJ9LGlmOnskcmVmOiIjIn0sdGhlbjp7JHJlZjoiIyJ9LGVsc2U6eyRyZWY6IiMifSxhbGxPZjp7JHJlZjoiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheSJ9LGFueU9mOnskcmVmOiIjL2RlZmluaXRpb25zL3NjaGVtYUFycmF5In0sb25lT2Y6eyRyZWY6IiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkifSxub3Q6eyRyZWY6IiMifX0sZGVmYXVsdDohMH19fSxoMT17aWQ6RSgiQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHNjaGVtYS4iKSwkc2NoZW1hOkUoIlRoZSBzY2hlbWEgdG8gdmVyaWZ5IHRoaXMgZG9jdW1lbnQgYWdhaW5zdC4iKSx0aXRsZTpFKCJBIGRlc2NyaXB0aXZlIHRpdGxlIG9mIHRoZSBlbGVtZW50LiIpLGRlc2NyaXB0aW9uOkUoIkEgbG9uZyBkZXNjcmlwdGlvbiBvZiB0aGUgZWxlbWVudC4gVXNlZCBpbiBob3ZlciBtZW51cyBhbmQgc3VnZ2VzdGlvbnMuIiksZGVmYXVsdDpFKCJBIGRlZmF1bHQgdmFsdWUuIFVzZWQgYnkgc3VnZ2VzdGlvbnMuIiksbXVsdGlwbGVPZjpFKCJBIG51bWJlciB0aGF0IHNob3VsZCBjbGVhbmx5IGRpdmlkZSB0aGUgY3VycmVudCB2YWx1ZSAoaS5lLiBoYXZlIG5vIHJlbWFpbmRlcikuIiksbWF4aW11bTpFKCJUaGUgbWF4aW11bSBudW1lcmljYWwgdmFsdWUsIGluY2x1c2l2ZSBieSBkZWZhdWx0LiIpLGV4Y2x1c2l2ZU1heGltdW06RSgiTWFrZXMgdGhlIG1heGltdW0gcHJvcGVydHkgZXhjbHVzaXZlLiIpLG1pbmltdW06RSgiVGhlIG1pbmltdW0gbnVtZXJpY2FsIHZhbHVlLCBpbmNsdXNpdmUgYnkgZGVmYXVsdC4iKSxleGNsdXNpdmVNaW5pbXVtOkUoIk1ha2VzIHRoZSBtaW5pbXVtIHByb3BlcnR5IGV4Y2x1c2l2ZS4iKSxtYXhMZW5ndGg6RSgiVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc3RyaW5nLiIpLG1pbkxlbmd0aDpFKCJUaGUgbWluaW11bSBsZW5ndGggb2YgYSBzdHJpbmcuIikscGF0dGVybjpFKCJBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCB0aGUgc3RyaW5nIGFnYWluc3QuIEl0IGlzIG5vdCBpbXBsaWNpdGx5IGFuY2hvcmVkLiIpLGFkZGl0aW9uYWxJdGVtczpFKCJGb3IgYXJyYXlzLCBvbmx5IHdoZW4gaXRlbXMgaXMgc2V0IGFzIGFuIGFycmF5LiBJZiBpdCBpcyBhIHNjaGVtYSwgdGhlbiB0aGlzIHNjaGVtYSB2YWxpZGF0ZXMgaXRlbXMgYWZ0ZXIgdGhlIG9uZXMgc3BlY2lmaWVkIGJ5IHRoZSBpdGVtcyBhcnJheS4gSWYgaXQgaXMgZmFsc2UsIHRoZW4gYWRkaXRpb25hbCBpdGVtcyB3aWxsIGNhdXNlIHZhbGlkYXRpb24gdG8gZmFpbC4iKSxpdGVtczpFKCJGb3IgYXJyYXlzLiBDYW4gZWl0aGVyIGJlIGEgc2NoZW1hIHRvIHZhbGlkYXRlIGV2ZXJ5IGVsZW1lbnQgYWdhaW5zdCBvciBhbiBhcnJheSBvZiBzY2hlbWFzIHRvIHZhbGlkYXRlIGVhY2ggaXRlbSBhZ2FpbnN0IGluIG9yZGVyICh0aGUgZmlyc3Qgc2NoZW1hIHdpbGwgdmFsaWRhdGUgdGhlIGZpcnN0IGVsZW1lbnQsIHRoZSBzZWNvbmQgc2NoZW1hIHdpbGwgdmFsaWRhdGUgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uIiksbWF4SXRlbXM6RSgiVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIGluc2lkZSBhbiBhcnJheS4gSW5jbHVzaXZlLiIpLG1pbkl0ZW1zOkUoIlRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBpbnNpZGUgYW4gYXJyYXkuIEluY2x1c2l2ZS4iKSx1bmlxdWVJdGVtczpFKCJJZiBhbGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBhcnJheSBtdXN0IGJlIHVuaXF1ZS4gRGVmYXVsdHMgdG8gZmFsc2UuIiksbWF4UHJvcGVydGllczpFKCJUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvcGVydGllcyBhbiBvYmplY3QgY2FuIGhhdmUuIEluY2x1c2l2ZS4iKSxtaW5Qcm9wZXJ0aWVzOkUoIlRoZSBtaW5pbXVtIG51bWJlciBvZiBwcm9wZXJ0aWVzIGFuIG9iamVjdCBjYW4gaGF2ZS4gSW5jbHVzaXZlLiIpLHJlcXVpcmVkOkUoIkFuIGFycmF5IG9mIHN0cmluZ3MgdGhhdCBsaXN0cyB0aGUgbmFtZXMgb2YgYWxsIHByb3BlcnRpZXMgcmVxdWlyZWQgb24gdGhpcyBvYmplY3QuIiksYWRkaXRpb25hbFByb3BlcnRpZXM6RSgiRWl0aGVyIGEgc2NoZW1hIG9yIGEgYm9vbGVhbi4gSWYgYSBzY2hlbWEsIHRoZW4gdXNlZCB0byB2YWxpZGF0ZSBhbGwgcHJvcGVydGllcyBub3QgbWF0Y2hlZCBieSAncHJvcGVydGllcycgb3IgJ3BhdHRlcm5Qcm9wZXJ0aWVzJy4gSWYgZmFsc2UsIHRoZW4gYW55IHByb3BlcnRpZXMgbm90IG1hdGNoZWQgYnkgZWl0aGVyIHdpbGwgY2F1c2UgdGhpcyBzY2hlbWEgdG8gZmFpbC4iKSxkZWZpbml0aW9uczpFKCJOb3QgdXNlZCBmb3IgdmFsaWRhdGlvbi4gUGxhY2Ugc3Vic2NoZW1hcyBoZXJlIHRoYXQgeW91IHdpc2ggdG8gcmVmZXJlbmNlIGlubGluZSB3aXRoICRyZWYuIikscHJvcGVydGllczpFKCJBIG1hcCBvZiBwcm9wZXJ0eSBuYW1lcyB0byBzY2hlbWFzIGZvciBlYWNoIHByb3BlcnR5LiIpLHBhdHRlcm5Qcm9wZXJ0aWVzOkUoIkEgbWFwIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgb24gcHJvcGVydHkgbmFtZXMgdG8gc2NoZW1hcyBmb3IgbWF0Y2hpbmcgcHJvcGVydGllcy4iKSxkZXBlbmRlbmNpZXM6RSgiQSBtYXAgb2YgcHJvcGVydHkgbmFtZXMgdG8gZWl0aGVyIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIG9yIGEgc2NoZW1hLiBBbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBtZWFucyB0aGUgcHJvcGVydHkgbmFtZWQgaW4gdGhlIGtleSBkZXBlbmRzIG9uIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBhcnJheSBiZWluZyBwcmVzZW50IGluIHRoZSBvYmplY3QgaW4gb3JkZXIgdG8gYmUgdmFsaWQuIElmIHRoZSB2YWx1ZSBpcyBhIHNjaGVtYSwgdGhlbiB0aGUgc2NoZW1hIGlzIG9ubHkgYXBwbGllZCB0byB0aGUgb2JqZWN0IGlmIHRoZSBwcm9wZXJ0eSBpbiB0aGUga2V5IGV4aXN0cyBvbiB0aGUgb2JqZWN0LiIpLGVudW06RSgiVGhlIHNldCBvZiBsaXRlcmFsIHZhbHVlcyB0aGF0IGFyZSB2YWxpZC4iKSx0eXBlOkUoIkVpdGhlciBhIHN0cmluZyBvZiBvbmUgb2YgdGhlIGJhc2ljIHNjaGVtYSB0eXBlcyAobnVtYmVyLCBpbnRlZ2VyLCBudWxsLCBhcnJheSwgb2JqZWN0LCBib29sZWFuLCBzdHJpbmcpIG9yIGFuIGFycmF5IG9mIHN0cmluZ3Mgc3BlY2lmeWluZyBhIHN1YnNldCBvZiB0aG9zZSB0eXBlcy4iKSxmb3JtYXQ6RSgiRGVzY3JpYmVzIHRoZSBmb3JtYXQgZXhwZWN0ZWQgZm9yIHRoZSB2YWx1ZS4iKSxhbGxPZjpFKCJBbiBhcnJheSBvZiBzY2hlbWFzLCBhbGwgb2Ygd2hpY2ggbXVzdCBtYXRjaC4iKSxhbnlPZjpFKCJBbiBhcnJheSBvZiBzY2hlbWFzLCB3aGVyZSBhdCBsZWFzdCBvbmUgbXVzdCBtYXRjaC4iKSxvbmVPZjpFKCJBbiBhcnJheSBvZiBzY2hlbWFzLCBleGFjdGx5IG9uZSBvZiB3aGljaCBtdXN0IG1hdGNoLiIpLG5vdDpFKCJBIHNjaGVtYSB3aGljaCBtdXN0IG5vdCBtYXRjaC4iKSwkaWQ6RSgiQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHNjaGVtYS4iKSwkcmVmOkUoIlJlZmVyZW5jZSBhIGRlZmluaXRpb24gaG9zdGVkIG9uIGFueSBsb2NhdGlvbi4iKSwkY29tbWVudDpFKCJDb21tZW50cyBmcm9tIHNjaGVtYSBhdXRob3JzIHRvIHJlYWRlcnMgb3IgbWFpbnRhaW5lcnMgb2YgdGhlIHNjaGVtYS4iKSxyZWFkT25seTpFKCJJbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIGluc3RhbmNlIGlzIG1hbmFnZWQgZXhjbHVzaXZlbHkgYnkgdGhlIG93bmluZyBhdXRob3JpdHkuIiksZXhhbXBsZXM6RSgiU2FtcGxlIEpTT04gdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgc2NoZW1hLCBmb3IgdGhlIHB1cnBvc2Ugb2YgaWxsdXN0cmF0aW5nIHVzYWdlLiIpLGNvbnRhaW5zOkUoJ0FuIGFycmF5IGluc3RhbmNlIGlzIHZhbGlkIGFnYWluc3QgImNvbnRhaW5zIiBpZiBhdCBsZWFzdCBvbmUgb2YgaXRzIGVsZW1lbnRzIGlzIHZhbGlkIGFnYWluc3QgdGhlIGdpdmVuIHNjaGVtYS4nKSxwcm9wZXJ0eU5hbWVzOkUoIklmIHRoZSBpbnN0YW5jZSBpcyBhbiBvYmplY3QsIHRoaXMga2V5d29yZCB2YWxpZGF0ZXMgaWYgZXZlcnkgcHJvcGVydHkgbmFtZSBpbiB0aGUgaW5zdGFuY2UgdmFsaWRhdGVzIGFnYWluc3QgdGhlIHByb3ZpZGVkIHNjaGVtYS4iKSxjb25zdDpFKCJBbiBpbnN0YW5jZSB2YWxpZGF0ZXMgc3VjY2Vzc2Z1bGx5IGFnYWluc3QgdGhpcyBrZXl3b3JkIGlmIGl0cyB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgdmFsdWUgb2YgdGhlIGtleXdvcmQuIiksY29udGVudE1lZGlhVHlwZTpFKCJEZXNjcmliZXMgdGhlIG1lZGlhIHR5cGUgb2YgYSBzdHJpbmcgcHJvcGVydHkuIiksY29udGVudEVuY29kaW5nOkUoIkRlc2NyaWJlcyB0aGUgY29udGVudCBlbmNvZGluZyBvZiBhIHN0cmluZyBwcm9wZXJ0eS4iKSxpZjpFKCdUaGUgdmFsaWRhdGlvbiBvdXRjb21lIG9mIHRoZSAiaWYiIHN1YnNjaGVtYSBjb250cm9scyB3aGljaCBvZiB0aGUgInRoZW4iIG9yICJlbHNlIiBrZXl3b3JkcyBhcmUgZXZhbHVhdGVkLicpLHRoZW46RSgnVGhlICJpZiIgc3Vic2NoZW1hIGlzIHVzZWQgZm9yIHZhbGlkYXRpb24gd2hlbiB0aGUgImlmIiBzdWJzY2hlbWEgc3VjY2VlZHMuJyksZWxzZTpFKCdUaGUgImVsc2UiIHN1YnNjaGVtYSBpcyB1c2VkIGZvciB2YWxpZGF0aW9uIHdoZW4gdGhlICJpZiIgc3Vic2NoZW1hIGZhaWxzLicpfTtmb3IoY29uc3QgZSBpbiBLci5zY2hlbWFzKXtjb25zdCB0PUtyLnNjaGVtYXNbZV07Zm9yKGNvbnN0IG4gaW4gdC5wcm9wZXJ0aWVzKXtsZXQgcj10LnByb3BlcnRpZXNbbl07dHlwZW9mIHI9PSJib29sZWFuIiYmKHI9dC5wcm9wZXJ0aWVzW25dPXt9KTtjb25zdCBpPWgxW25dO2kmJihyLmRlc2NyaXB0aW9uPWkpfX12YXIgSW87KCgpPT57dmFyIGU9ezQ3MDppPT57ZnVuY3Rpb24gcyhvKXtpZih0eXBlb2YgbyE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiUGF0aCBtdXN0IGJlIGEgc3RyaW5nLiBSZWNlaXZlZCAiK0pTT04uc3RyaW5naWZ5KG8pKX1mdW5jdGlvbiBhKG8sdSl7Zm9yKHZhciBoLGY9IiIsZD0wLG09LTEsZz0wLHA9MDtwPD1vLmxlbmd0aDsrK3Ape2lmKHA8by5sZW5ndGgpaD1vLmNoYXJDb2RlQXQocCk7ZWxzZXtpZihoPT09NDcpYnJlYWs7aD00N31pZihoPT09NDcpe2lmKCEobT09PXAtMXx8Zz09PTEpKWlmKG0hPT1wLTEmJmc9PT0yKXtpZihmLmxlbmd0aDwyfHxkIT09Mnx8Zi5jaGFyQ29kZUF0KGYubGVuZ3RoLTEpIT09NDZ8fGYuY2hhckNvZGVBdChmLmxlbmd0aC0yKSE9PTQ2KXtpZihmLmxlbmd0aD4yKXt2YXIgeD1mLmxhc3RJbmRleE9mKCIvIik7aWYoeCE9PWYubGVuZ3RoLTEpe3g9PT0tMT8oZj0iIixkPTApOmQ9KGY9Zi5zbGljZSgwLHgpKS5sZW5ndGgtMS1mLmxhc3RJbmRleE9mKCIvIiksbT1wLGc9MDtjb250aW51ZX19ZWxzZSBpZihmLmxlbmd0aD09PTJ8fGYubGVuZ3RoPT09MSl7Zj0iIixkPTAsbT1wLGc9MDtjb250aW51ZX19dSYmKGYubGVuZ3RoPjA/Zis9Ii8uLiI6Zj0iLi4iLGQ9Mil9ZWxzZSBmLmxlbmd0aD4wP2YrPSIvIitvLnNsaWNlKG0rMSxwKTpmPW8uc2xpY2UobSsxLHApLGQ9cC1tLTE7bT1wLGc9MH1lbHNlIGg9PT00NiYmZyE9PS0xPysrZzpnPS0xfXJldHVybiBmfXZhciBsPXtyZXNvbHZlOmZ1bmN0aW9uKCl7Zm9yKHZhciBvLHU9IiIsaD0hMSxmPWFyZ3VtZW50cy5sZW5ndGgtMTtmPj0tMSYmIWg7Zi0tKXt2YXIgZDtmPj0wP2Q9YXJndW1lbnRzW2ZdOihvPT09dm9pZCAwJiYobz1wcm9jZXNzLmN3ZCgpKSxkPW8pLHMoZCksZC5sZW5ndGghPT0wJiYodT1kKyIvIit1LGg9ZC5jaGFyQ29kZUF0KDApPT09NDcpfXJldHVybiB1PWEodSwhaCksaD91Lmxlbmd0aD4wPyIvIit1OiIvIjp1Lmxlbmd0aD4wP3U6Ii4ifSxub3JtYWxpemU6ZnVuY3Rpb24obyl7aWYocyhvKSxvLmxlbmd0aD09PTApcmV0dXJuIi4iO3ZhciB1PW8uY2hhckNvZGVBdCgwKT09PTQ3LGg9by5jaGFyQ29kZUF0KG8ubGVuZ3RoLTEpPT09NDc7cmV0dXJuKG89YShvLCF1KSkubGVuZ3RoIT09MHx8dXx8KG89Ii4iKSxvLmxlbmd0aD4wJiZoJiYobys9Ii8iKSx1PyIvIitvOm99LGlzQWJzb2x1dGU6ZnVuY3Rpb24obyl7cmV0dXJuIHMobyksby5sZW5ndGg+MCYmby5jaGFyQ29kZUF0KDApPT09NDd9LGpvaW46ZnVuY3Rpb24oKXtpZihhcmd1bWVudHMubGVuZ3RoPT09MClyZXR1cm4iLiI7Zm9yKHZhciBvLHU9MDt1PGFyZ3VtZW50cy5sZW5ndGg7Kyt1KXt2YXIgaD1hcmd1bWVudHNbdV07cyhoKSxoLmxlbmd0aD4wJiYobz09PXZvaWQgMD9vPWg6bys9Ii8iK2gpfXJldHVybiBvPT09dm9pZCAwPyIuIjpsLm5vcm1hbGl6ZShvKX0scmVsYXRpdmU6ZnVuY3Rpb24obyx1KXtpZihzKG8pLHModSksbz09PXV8fChvPWwucmVzb2x2ZShvKSk9PT0odT1sLnJlc29sdmUodSkpKXJldHVybiIiO2Zvcih2YXIgaD0xO2g8by5sZW5ndGgmJm8uY2hhckNvZGVBdChoKT09PTQ3OysraCk7Zm9yKHZhciBmPW8ubGVuZ3RoLGQ9Zi1oLG09MTttPHUubGVuZ3RoJiZ1LmNoYXJDb2RlQXQobSk9PT00NzsrK20pO2Zvcih2YXIgZz11Lmxlbmd0aC1tLHA9ZDxnP2Q6Zyx4PS0xLHc9MDt3PD1wOysrdyl7aWYodz09PXApe2lmKGc+cCl7aWYodS5jaGFyQ29kZUF0KG0rdyk9PT00NylyZXR1cm4gdS5zbGljZShtK3crMSk7aWYodz09PTApcmV0dXJuIHUuc2xpY2UobSt3KX1lbHNlIGQ+cCYmKG8uY2hhckNvZGVBdChoK3cpPT09NDc/eD13Onc9PT0wJiYoeD0wKSk7YnJlYWt9dmFyIEw9by5jaGFyQ29kZUF0KGgrdyk7aWYoTCE9PXUuY2hhckNvZGVBdChtK3cpKWJyZWFrO0w9PT00NyYmKHg9dyl9dmFyIHY9IiI7Zm9yKHc9aCt4KzE7dzw9ZjsrK3cpdyE9PWYmJm8uY2hhckNvZGVBdCh3KSE9PTQ3fHwodi5sZW5ndGg9PT0wP3YrPSIuLiI6dis9Ii8uLiIpO3JldHVybiB2Lmxlbmd0aD4wP3YrdS5zbGljZShtK3gpOihtKz14LHUuY2hhckNvZGVBdChtKT09PTQ3JiYrK20sdS5zbGljZShtKSl9LF9tYWtlTG9uZzpmdW5jdGlvbihvKXtyZXR1cm4gb30sZGlybmFtZTpmdW5jdGlvbihvKXtpZihzKG8pLG8ubGVuZ3RoPT09MClyZXR1cm4iLiI7Zm9yKHZhciB1PW8uY2hhckNvZGVBdCgwKSxoPXU9PT00NyxmPS0xLGQ9ITAsbT1vLmxlbmd0aC0xO20+PTE7LS1tKWlmKCh1PW8uY2hhckNvZGVBdChtKSk9PT00Nyl7aWYoIWQpe2Y9bTticmVha319ZWxzZSBkPSExO3JldHVybiBmPT09LTE/aD8iLyI6Ii4iOmgmJmY9PT0xPyIvLyI6by5zbGljZSgwLGYpfSxiYXNlbmFtZTpmdW5jdGlvbihvLHUpe2lmKHUhPT12b2lkIDAmJnR5cGVvZiB1IT0ic3RyaW5nIil0aHJvdyBuZXcgVHlwZUVycm9yKCciZXh0IiBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJyk7cyhvKTt2YXIgaCxmPTAsZD0tMSxtPSEwO2lmKHUhPT12b2lkIDAmJnUubGVuZ3RoPjAmJnUubGVuZ3RoPD1vLmxlbmd0aCl7aWYodS5sZW5ndGg9PT1vLmxlbmd0aCYmdT09PW8pcmV0dXJuIiI7dmFyIGc9dS5sZW5ndGgtMSxwPS0xO2ZvcihoPW8ubGVuZ3RoLTE7aD49MDstLWgpe3ZhciB4PW8uY2hhckNvZGVBdChoKTtpZih4PT09NDcpe2lmKCFtKXtmPWgrMTticmVha319ZWxzZSBwPT09LTEmJihtPSExLHA9aCsxKSxnPj0wJiYoeD09PXUuY2hhckNvZGVBdChnKT8tLWc9PS0xJiYoZD1oKTooZz0tMSxkPXApKX1yZXR1cm4gZj09PWQ/ZD1wOmQ9PT0tMSYmKGQ9by5sZW5ndGgpLG8uc2xpY2UoZixkKX1mb3IoaD1vLmxlbmd0aC0xO2g+PTA7LS1oKWlmKG8uY2hhckNvZGVBdChoKT09PTQ3KXtpZighbSl7Zj1oKzE7YnJlYWt9fWVsc2UgZD09PS0xJiYobT0hMSxkPWgrMSk7cmV0dXJuIGQ9PT0tMT8iIjpvLnNsaWNlKGYsZCl9LGV4dG5hbWU6ZnVuY3Rpb24obyl7cyhvKTtmb3IodmFyIHU9LTEsaD0wLGY9LTEsZD0hMCxtPTAsZz1vLmxlbmd0aC0xO2c+PTA7LS1nKXt2YXIgcD1vLmNoYXJDb2RlQXQoZyk7aWYocCE9PTQ3KWY9PT0tMSYmKGQ9ITEsZj1nKzEpLHA9PT00Nj91PT09LTE/dT1nOm0hPT0xJiYobT0xKTp1IT09LTEmJihtPS0xKTtlbHNlIGlmKCFkKXtoPWcrMTticmVha319cmV0dXJuIHU9PT0tMXx8Zj09PS0xfHxtPT09MHx8bT09PTEmJnU9PT1mLTEmJnU9PT1oKzE/IiI6by5zbGljZSh1LGYpfSxmb3JtYXQ6ZnVuY3Rpb24obyl7aWYobz09PW51bGx8fHR5cGVvZiBvIT0ib2JqZWN0Iil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgInBhdGhPYmplY3QiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2Ygbyk7cmV0dXJuIGZ1bmN0aW9uKHUsaCl7dmFyIGY9aC5kaXJ8fGgucm9vdCxkPWguYmFzZXx8KGgubmFtZXx8IiIpKyhoLmV4dHx8IiIpO3JldHVybiBmP2Y9PT1oLnJvb3Q/ZitkOmYrIi8iK2Q6ZH0oMCxvKX0scGFyc2U6ZnVuY3Rpb24obyl7cyhvKTt2YXIgdT17cm9vdDoiIixkaXI6IiIsYmFzZToiIixleHQ6IiIsbmFtZToiIn07aWYoby5sZW5ndGg9PT0wKXJldHVybiB1O3ZhciBoLGY9by5jaGFyQ29kZUF0KDApLGQ9Zj09PTQ3O2Q/KHUucm9vdD0iLyIsaD0xKTpoPTA7Zm9yKHZhciBtPS0xLGc9MCxwPS0xLHg9ITAsdz1vLmxlbmd0aC0xLEw9MDt3Pj1oOy0tdylpZigoZj1vLmNoYXJDb2RlQXQodykpIT09NDcpcD09PS0xJiYoeD0hMSxwPXcrMSksZj09PTQ2P209PT0tMT9tPXc6TCE9PTEmJihMPTEpOm0hPT0tMSYmKEw9LTEpO2Vsc2UgaWYoIXgpe2c9dysxO2JyZWFrfXJldHVybiBtPT09LTF8fHA9PT0tMXx8TD09PTB8fEw9PT0xJiZtPT09cC0xJiZtPT09ZysxP3AhPT0tMSYmKHUuYmFzZT11Lm5hbWU9Zz09PTAmJmQ/by5zbGljZSgxLHApOm8uc2xpY2UoZyxwKSk6KGc9PT0wJiZkPyh1Lm5hbWU9by5zbGljZSgxLG0pLHUuYmFzZT1vLnNsaWNlKDEscCkpOih1Lm5hbWU9by5zbGljZShnLG0pLHUuYmFzZT1vLnNsaWNlKGcscCkpLHUuZXh0PW8uc2xpY2UobSxwKSksZz4wP3UuZGlyPW8uc2xpY2UoMCxnLTEpOmQmJih1LmRpcj0iLyIpLHV9LHNlcDoiLyIsZGVsaW1pdGVyOiI6Iix3aW4zMjpudWxsLHBvc2l4Om51bGx9O2wucG9zaXg9bCxpLmV4cG9ydHM9bH19LHQ9e307ZnVuY3Rpb24gbihpKXt2YXIgcz10W2ldO2lmKHMhPT12b2lkIDApcmV0dXJuIHMuZXhwb3J0czt2YXIgYT10W2ldPXtleHBvcnRzOnt9fTtyZXR1cm4gZVtpXShhLGEuZXhwb3J0cyxuKSxhLmV4cG9ydHN9bi5kPShpLHMpPT57Zm9yKHZhciBhIGluIHMpbi5vKHMsYSkmJiFuLm8oaSxhKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGksYSx7ZW51bWVyYWJsZTohMCxnZXQ6c1thXX0pfSxuLm89KGkscyk9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLHMpLG4ucj1pPT57dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGksU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX07dmFyIHI9e307KCgpPT57bGV0IGk7bi5yKHIpLG4uZChyLHtVUkk6KCk9PmQsVXRpbHM6KCk9Pk99KSx0eXBlb2YgcHJvY2Vzcz09Im9iamVjdCI/aT1wcm9jZXNzLnBsYXRmb3JtPT09IndpbjMyIjp0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmKGk9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJXaW5kb3dzIik+PTApO2NvbnN0IHM9L15cd1tcd1xkKy4tXSokLyxhPS9eXC8vLGw9L15cL1wvLztmdW5jdGlvbiBvKE0sTil7aWYoIU0uc2NoZW1lJiZOKXRocm93IG5ldyBFcnJvcihgW1VyaUVycm9yXTogU2NoZW1lIGlzIG1pc3Npbmc6IHtzY2hlbWU6ICIiLCBhdXRob3JpdHk6ICIke00uYXV0aG9yaXR5fSIsIHBhdGg6ICIke00ucGF0aH0iLCBxdWVyeTogIiR7TS5xdWVyeX0iLCBmcmFnbWVudDogIiR7TS5mcmFnbWVudH0ifWApO2lmKE0uc2NoZW1lJiYhcy50ZXN0KE0uc2NoZW1lKSl0aHJvdyBuZXcgRXJyb3IoIltVcmlFcnJvcl06IFNjaGVtZSBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMuIik7aWYoTS5wYXRoKXtpZihNLmF1dGhvcml0eSl7aWYoIWEudGVzdChNLnBhdGgpKXRocm93IG5ldyBFcnJvcignW1VyaUVycm9yXTogSWYgYSBVUkkgY29udGFpbnMgYW4gYXV0aG9yaXR5IGNvbXBvbmVudCwgdGhlbiB0aGUgcGF0aCBjb21wb25lbnQgbXVzdCBlaXRoZXIgYmUgZW1wdHkgb3IgYmVnaW4gd2l0aCBhIHNsYXNoICgiLyIpIGNoYXJhY3RlcicpfWVsc2UgaWYobC50ZXN0KE0ucGF0aCkpdGhyb3cgbmV3IEVycm9yKCdbVXJpRXJyb3JdOiBJZiBhIFVSSSBkb2VzIG5vdCBjb250YWluIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY2Fubm90IGJlZ2luIHdpdGggdHdvIHNsYXNoIGNoYXJhY3RlcnMgKCIvLyIpJyl9fWNvbnN0IHU9IiIsaD0iLyIsZj0vXigoW146Lz8jXSs/KTopPyhcL1wvKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/LztjbGFzcyBke2NvbnN0cnVjdG9yKE4sayxSLEksVCxQPSExKXtpdCh0aGlzLCJzY2hlbWUiKTtpdCh0aGlzLCJhdXRob3JpdHkiKTtpdCh0aGlzLCJwYXRoIik7aXQodGhpcywicXVlcnkiKTtpdCh0aGlzLCJmcmFnbWVudCIpO3R5cGVvZiBOPT0ib2JqZWN0Ij8odGhpcy5zY2hlbWU9Ti5zY2hlbWV8fHUsdGhpcy5hdXRob3JpdHk9Ti5hdXRob3JpdHl8fHUsdGhpcy5wYXRoPU4ucGF0aHx8dSx0aGlzLnF1ZXJ5PU4ucXVlcnl8fHUsdGhpcy5mcmFnbWVudD1OLmZyYWdtZW50fHx1KToodGhpcy5zY2hlbWU9ZnVuY3Rpb24oRCwkKXtyZXR1cm4gRHx8JD9EOiJmaWxlIn0oTixQKSx0aGlzLmF1dGhvcml0eT1rfHx1LHRoaXMucGF0aD1mdW5jdGlvbihELCQpe3N3aXRjaChEKXtjYXNlImh0dHBzIjpjYXNlImh0dHAiOmNhc2UiZmlsZSI6JD8kWzBdIT09aCYmKCQ9aCskKTokPWh9cmV0dXJuICR9KHRoaXMuc2NoZW1lLFJ8fHUpLHRoaXMucXVlcnk9SXx8dSx0aGlzLmZyYWdtZW50PVR8fHUsbyh0aGlzLFApKX1zdGF0aWMgaXNVcmkoTil7cmV0dXJuIE4gaW5zdGFuY2VvZiBkfHwhIU4mJnR5cGVvZiBOLmF1dGhvcml0eT09InN0cmluZyImJnR5cGVvZiBOLmZyYWdtZW50PT0ic3RyaW5nIiYmdHlwZW9mIE4ucGF0aD09InN0cmluZyImJnR5cGVvZiBOLnF1ZXJ5PT0ic3RyaW5nIiYmdHlwZW9mIE4uc2NoZW1lPT0ic3RyaW5nIiYmdHlwZW9mIE4uZnNQYXRoPT0ic3RyaW5nIiYmdHlwZW9mIE4ud2l0aD09ImZ1bmN0aW9uIiYmdHlwZW9mIE4udG9TdHJpbmc9PSJmdW5jdGlvbiJ9Z2V0IGZzUGF0aCgpe3JldHVybiBMKHRoaXMpfXdpdGgoTil7aWYoIU4pcmV0dXJuIHRoaXM7bGV0e3NjaGVtZTprLGF1dGhvcml0eTpSLHBhdGg6SSxxdWVyeTpULGZyYWdtZW50OlB9PU47cmV0dXJuIGs9PT12b2lkIDA/az10aGlzLnNjaGVtZTprPT09bnVsbCYmKGs9dSksUj09PXZvaWQgMD9SPXRoaXMuYXV0aG9yaXR5OlI9PT1udWxsJiYoUj11KSxJPT09dm9pZCAwP0k9dGhpcy5wYXRoOkk9PT1udWxsJiYoST11KSxUPT09dm9pZCAwP1Q9dGhpcy5xdWVyeTpUPT09bnVsbCYmKFQ9dSksUD09PXZvaWQgMD9QPXRoaXMuZnJhZ21lbnQ6UD09PW51bGwmJihQPXUpLGs9PT10aGlzLnNjaGVtZSYmUj09PXRoaXMuYXV0aG9yaXR5JiZJPT09dGhpcy5wYXRoJiZUPT09dGhpcy5xdWVyeSYmUD09PXRoaXMuZnJhZ21lbnQ/dGhpczpuZXcgZyhrLFIsSSxULFApfXN0YXRpYyBwYXJzZShOLGs9ITEpe2NvbnN0IFI9Zi5leGVjKE4pO3JldHVybiBSP25ldyBnKFJbMl18fHUsXyhSWzRdfHx1KSxfKFJbNV18fHUpLF8oUls3XXx8dSksXyhSWzldfHx1KSxrKTpuZXcgZyh1LHUsdSx1LHUpfXN0YXRpYyBmaWxlKE4pe2xldCBrPXU7aWYoaSYmKE49Ti5yZXBsYWNlKC9cXC9nLGgpKSxOWzBdPT09aCYmTlsxXT09PWgpe2NvbnN0IFI9Ti5pbmRleE9mKGgsMik7Uj09PS0xPyhrPU4uc3Vic3RyaW5nKDIpLE49aCk6KGs9Ti5zdWJzdHJpbmcoMixSKSxOPU4uc3Vic3RyaW5nKFIpfHxoKX1yZXR1cm4gbmV3IGcoImZpbGUiLGssTix1LHUpfXN0YXRpYyBmcm9tKE4pe2NvbnN0IGs9bmV3IGcoTi5zY2hlbWUsTi5hdXRob3JpdHksTi5wYXRoLE4ucXVlcnksTi5mcmFnbWVudCk7cmV0dXJuIG8oaywhMCksa310b1N0cmluZyhOPSExKXtyZXR1cm4gdih0aGlzLE4pfXRvSlNPTigpe3JldHVybiB0aGlzfXN0YXRpYyByZXZpdmUoTil7aWYoTil7aWYoTiBpbnN0YW5jZW9mIGQpcmV0dXJuIE47e2NvbnN0IGs9bmV3IGcoTik7cmV0dXJuIGsuX2Zvcm1hdHRlZD1OLmV4dGVybmFsLGsuX2ZzUGF0aD1OLl9zZXA9PT1tP04uZnNQYXRoOm51bGwsa319cmV0dXJuIE59fWNvbnN0IG09aT8xOnZvaWQgMDtjbGFzcyBnIGV4dGVuZHMgZHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7aXQodGhpcywiX2Zvcm1hdHRlZCIsbnVsbCk7aXQodGhpcywiX2ZzUGF0aCIsbnVsbCl9Z2V0IGZzUGF0aCgpe3JldHVybiB0aGlzLl9mc1BhdGh8fCh0aGlzLl9mc1BhdGg9TCh0aGlzKSksdGhpcy5fZnNQYXRofXRvU3RyaW5nKGs9ITEpe3JldHVybiBrP3YodGhpcywhMCk6KHRoaXMuX2Zvcm1hdHRlZHx8KHRoaXMuX2Zvcm1hdHRlZD12KHRoaXMsITEpKSx0aGlzLl9mb3JtYXR0ZWQpfXRvSlNPTigpe2NvbnN0IGs9eyRtaWQ6MX07cmV0dXJuIHRoaXMuX2ZzUGF0aCYmKGsuZnNQYXRoPXRoaXMuX2ZzUGF0aCxrLl9zZXA9bSksdGhpcy5fZm9ybWF0dGVkJiYoay5leHRlcm5hbD10aGlzLl9mb3JtYXR0ZWQpLHRoaXMucGF0aCYmKGsucGF0aD10aGlzLnBhdGgpLHRoaXMuc2NoZW1lJiYoay5zY2hlbWU9dGhpcy5zY2hlbWUpLHRoaXMuYXV0aG9yaXR5JiYoay5hdXRob3JpdHk9dGhpcy5hdXRob3JpdHkpLHRoaXMucXVlcnkmJihrLnF1ZXJ5PXRoaXMucXVlcnkpLHRoaXMuZnJhZ21lbnQmJihrLmZyYWdtZW50PXRoaXMuZnJhZ21lbnQpLGt9fWNvbnN0IHA9ezU4OiIlM0EiLDQ3OiIlMkYiLDYzOiIlM0YiLDM1OiIlMjMiLDkxOiIlNUIiLDkzOiIlNUQiLDY0OiIlNDAiLDMzOiIlMjEiLDM2OiIlMjQiLDM4OiIlMjYiLDM5OiIlMjciLDQwOiIlMjgiLDQxOiIlMjkiLDQyOiIlMkEiLDQzOiIlMkIiLDQ0OiIlMkMiLDU5OiIlM0IiLDYxOiIlM0QiLDMyOiIlMjAifTtmdW5jdGlvbiB4KE0sTixrKXtsZXQgUixJPS0xO2ZvcihsZXQgVD0wO1Q8TS5sZW5ndGg7VCsrKXtjb25zdCBQPU0uY2hhckNvZGVBdChUKTtpZihQPj05NyYmUDw9MTIyfHxQPj02NSYmUDw9OTB8fFA+PTQ4JiZQPD01N3x8UD09PTQ1fHxQPT09NDZ8fFA9PT05NXx8UD09PTEyNnx8TiYmUD09PTQ3fHxrJiZQPT09OTF8fGsmJlA9PT05M3x8ayYmUD09PTU4KUkhPT0tMSYmKFIrPWVuY29kZVVSSUNvbXBvbmVudChNLnN1YnN0cmluZyhJLFQpKSxJPS0xKSxSIT09dm9pZCAwJiYoUis9TS5jaGFyQXQoVCkpO2Vsc2V7Uj09PXZvaWQgMCYmKFI9TS5zdWJzdHIoMCxUKSk7Y29uc3QgRD1wW1BdO0QhPT12b2lkIDA/KEkhPT0tMSYmKFIrPWVuY29kZVVSSUNvbXBvbmVudChNLnN1YnN0cmluZyhJLFQpKSxJPS0xKSxSKz1EKTpJPT09LTEmJihJPVQpfX1yZXR1cm4gSSE9PS0xJiYoUis9ZW5jb2RlVVJJQ29tcG9uZW50KE0uc3Vic3RyaW5nKEkpKSksUiE9PXZvaWQgMD9SOk19ZnVuY3Rpb24gdyhNKXtsZXQgTjtmb3IobGV0IGs9MDtrPE0ubGVuZ3RoO2srKyl7Y29uc3QgUj1NLmNoYXJDb2RlQXQoayk7Uj09PTM1fHxSPT09NjM/KE49PT12b2lkIDAmJihOPU0uc3Vic3RyKDAsaykpLE4rPXBbUl0pOk4hPT12b2lkIDAmJihOKz1NW2tdKX1yZXR1cm4gTiE9PXZvaWQgMD9OOk19ZnVuY3Rpb24gTChNLE4pe2xldCBrO3JldHVybiBrPU0uYXV0aG9yaXR5JiZNLnBhdGgubGVuZ3RoPjEmJk0uc2NoZW1lPT09ImZpbGUiP2AvLyR7TS5hdXRob3JpdHl9JHtNLnBhdGh9YDpNLnBhdGguY2hhckNvZGVBdCgwKT09PTQ3JiYoTS5wYXRoLmNoYXJDb2RlQXQoMSk+PTY1JiZNLnBhdGguY2hhckNvZGVBdCgxKTw9OTB8fE0ucGF0aC5jaGFyQ29kZUF0KDEpPj05NyYmTS5wYXRoLmNoYXJDb2RlQXQoMSk8PTEyMikmJk0ucGF0aC5jaGFyQ29kZUF0KDIpPT09NTg/TS5wYXRoWzFdLnRvTG93ZXJDYXNlKCkrTS5wYXRoLnN1YnN0cigyKTpNLnBhdGgsaSYmKGs9ay5yZXBsYWNlKC9cLy9nLCJcXCIpKSxrfWZ1bmN0aW9uIHYoTSxOKXtjb25zdCBrPU4/dzp4O2xldCBSPSIiLHtzY2hlbWU6SSxhdXRob3JpdHk6VCxwYXRoOlAscXVlcnk6RCxmcmFnbWVudDokfT1NO2lmKEkmJihSKz1JLFIrPSI6IiksKFR8fEk9PT0iZmlsZSIpJiYoUis9aCxSKz1oKSxUKXtsZXQgaj1ULmluZGV4T2YoIkAiKTtpZihqIT09LTEpe2NvbnN0IG5lPVQuc3Vic3RyKDAsaik7VD1ULnN1YnN0cihqKzEpLGo9bmUubGFzdEluZGV4T2YoIjoiKSxqPT09LTE/Uis9ayhuZSwhMSwhMSk6KFIrPWsobmUuc3Vic3RyKDAsaiksITEsITEpLFIrPSI6IixSKz1rKG5lLnN1YnN0cihqKzEpLCExLCEwKSksUis9IkAifVQ9VC50b0xvd2VyQ2FzZSgpLGo9VC5sYXN0SW5kZXhPZigiOiIpLGo9PT0tMT9SKz1rKFQsITEsITApOihSKz1rKFQuc3Vic3RyKDAsaiksITEsITApLFIrPVQuc3Vic3RyKGopKX1pZihQKXtpZihQLmxlbmd0aD49MyYmUC5jaGFyQ29kZUF0KDApPT09NDcmJlAuY2hhckNvZGVBdCgyKT09PTU4KXtjb25zdCBqPVAuY2hhckNvZGVBdCgxKTtqPj02NSYmajw9OTAmJihQPWAvJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGorMzIpfToke1Auc3Vic3RyKDMpfWApfWVsc2UgaWYoUC5sZW5ndGg+PTImJlAuY2hhckNvZGVBdCgxKT09PTU4KXtjb25zdCBqPVAuY2hhckNvZGVBdCgwKTtqPj02NSYmajw9OTAmJihQPWAke1N0cmluZy5mcm9tQ2hhckNvZGUoaiszMil9OiR7UC5zdWJzdHIoMil9YCl9Uis9ayhQLCEwLCExKX1yZXR1cm4gRCYmKFIrPSI/IixSKz1rKEQsITEsITEpKSwkJiYoUis9IiMiLFIrPU4/JDp4KCQsITEsITEpKSxSfWZ1bmN0aW9uIHkoTSl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoTSl9Y2F0Y2h7cmV0dXJuIE0ubGVuZ3RoPjM/TS5zdWJzdHIoMCwzKSt5KE0uc3Vic3RyKDMpKTpNfX1jb25zdCBiPS8oJVswLTlBLVphLXpdWzAtOUEtWmEtel0pKy9nO2Z1bmN0aW9uIF8oTSl7cmV0dXJuIE0ubWF0Y2goYik/TS5yZXBsYWNlKGIsTj0+eShOKSk6TX12YXIgQT1uKDQ3MCk7Y29uc3QgQz1BLnBvc2l4fHxBLEY9Ii8iO3ZhciBPOyhmdW5jdGlvbihNKXtNLmpvaW5QYXRoPWZ1bmN0aW9uKE4sLi4uayl7cmV0dXJuIE4ud2l0aCh7cGF0aDpDLmpvaW4oTi5wYXRoLC4uLmspfSl9LE0ucmVzb2x2ZVBhdGg9ZnVuY3Rpb24oTiwuLi5rKXtsZXQgUj1OLnBhdGgsST0hMTtSWzBdIT09RiYmKFI9RitSLEk9ITApO2xldCBUPUMucmVzb2x2ZShSLC4uLmspO3JldHVybiBJJiZUWzBdPT09RiYmIU4uYXV0aG9yaXR5JiYoVD1ULnN1YnN0cmluZygxKSksTi53aXRoKHtwYXRoOlR9KX0sTS5kaXJuYW1lPWZ1bmN0aW9uKE4pe2lmKE4ucGF0aC5sZW5ndGg9PT0wfHxOLnBhdGg9PT1GKXJldHVybiBOO2xldCBrPUMuZGlybmFtZShOLnBhdGgpO3JldHVybiBrLmxlbmd0aD09PTEmJmsuY2hhckNvZGVBdCgwKT09PTQ2JiYoaz0iIiksTi53aXRoKHtwYXRoOmt9KX0sTS5iYXNlbmFtZT1mdW5jdGlvbihOKXtyZXR1cm4gQy5iYXNlbmFtZShOLnBhdGgpfSxNLmV4dG5hbWU9ZnVuY3Rpb24oTil7cmV0dXJuIEMuZXh0bmFtZShOLnBhdGgpfX0pKE98fChPPXt9KSl9KSgpLElvPXJ9KSgpO3ZhcntVUkk6VHQsVXRpbHM6SjF9PUlvO2Z1bmN0aW9uIGQxKGUsdCl7aWYodHlwZW9mIGUhPSJzdHJpbmciKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgc3RyaW5nIik7Y29uc3Qgbj1TdHJpbmcoZSk7bGV0IHI9IiI7Y29uc3QgaT0hIXQscz0hIXQ7bGV0IGE9ITE7Y29uc3QgbD10JiZ0eXBlb2YgdC5mbGFncz09InN0cmluZyI/dC5mbGFnczoiIjtsZXQgbztmb3IobGV0IHU9MCxoPW4ubGVuZ3RoO3U8aDt1Kyspc3dpdGNoKG89blt1XSxvKXtjYXNlIi8iOmNhc2UiJCI6Y2FzZSJeIjpjYXNlIisiOmNhc2UiLiI6Y2FzZSIoIjpjYXNlIikiOmNhc2UiPSI6Y2FzZSIhIjpjYXNlInwiOnIrPSJcXCIrbzticmVhaztjYXNlIj8iOmlmKGkpe3IrPSIuIjticmVha31jYXNlIlsiOmNhc2UiXSI6aWYoaSl7cis9bzticmVha31jYXNlInsiOmlmKGkpe2E9ITAscis9IigiO2JyZWFrfWNhc2UifSI6aWYoaSl7YT0hMSxyKz0iKSI7YnJlYWt9Y2FzZSIsIjppZihhKXtyKz0ifCI7YnJlYWt9cis9IlxcIitvO2JyZWFrO2Nhc2UiKiI6Y29uc3QgZj1uW3UtMV07bGV0IGQ9MTtmb3IoO25bdSsxXT09PSIqIjspZCsrLHUrKztjb25zdCBtPW5bdSsxXTtzP2Q+MSYmKGY9PT0iLyJ8fGY9PT12b2lkIDB8fGY9PT0ieyJ8fGY9PT0iLCIpJiYobT09PSIvInx8bT09PXZvaWQgMHx8bT09PSIsInx8bT09PSJ9Iik/KG09PT0iLyI/dSsrOmY9PT0iLyImJnIuZW5kc1dpdGgoIlxcLyIpJiYocj1yLnN1YnN0cigwLHIubGVuZ3RoLTIpKSxyKz0iKCg/OlteL10qKD86L3wkKSkqKSIpOnIrPSIoW14vXSopIjpyKz0iLioiO2JyZWFrO2RlZmF1bHQ6cis9b31yZXR1cm4oIWx8fCF+bC5pbmRleE9mKCJnIikpJiYocj0iXiIrcisiJCIpLG5ldyBSZWdFeHAocixsKX12YXIgbTE9IiEiLGcxPSIvIixwMT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5mb2xkZXJVcmk9dCx0aGlzLnVyaXM9bix0aGlzLmdsb2JXcmFwcGVycz1bXTt0cnl7Zm9yKGxldCByIG9mIGUpe2NvbnN0IGk9clswXSE9PW0xO2l8fChyPXIuc3Vic3RyaW5nKDEpKSxyLmxlbmd0aD4wJiYoclswXT09PWcxJiYocj1yLnN1YnN0cmluZygxKSksdGhpcy5nbG9iV3JhcHBlcnMucHVzaCh7cmVnZXhwOmQxKCIqKi8iK3Ise2V4dGVuZGVkOiEwLGdsb2JzdGFyOiEwfSksaW5jbHVkZTppfSkpfXQmJih0PVZvKHQpLHQuZW5kc1dpdGgoIi8iKXx8KHQ9dCsiLyIpLHRoaXMuZm9sZGVyVXJpPXQpfWNhdGNoe3RoaXMuZ2xvYldyYXBwZXJzLmxlbmd0aD0wLHRoaXMudXJpcz1bXX19bWF0Y2hlc1BhdHRlcm4oZSl7aWYodGhpcy5mb2xkZXJVcmkmJiFlLnN0YXJ0c1dpdGgodGhpcy5mb2xkZXJVcmkpKXJldHVybiExO2xldCB0PSExO2Zvcihjb25zdHtyZWdleHA6bixpbmNsdWRlOnJ9b2YgdGhpcy5nbG9iV3JhcHBlcnMpbi50ZXN0KGUpJiYodD1yKTtyZXR1cm4gdH1nZXRVUklzKCl7cmV0dXJuIHRoaXMudXJpc319LGIxPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLnNlcnZpY2U9ZSx0aGlzLnVyaT10LHRoaXMuZGVwZW5kZW5jaWVzPW5ldyBTZXQsdGhpcy5hbmNob3JzPXZvaWQgMCxuJiYodGhpcy51bnJlc29sdmVkU2NoZW1hPXRoaXMuc2VydmljZS5wcm9taXNlLnJlc29sdmUobmV3IGVuKG4pKSl9Z2V0VW5yZXNvbHZlZFNjaGVtYSgpe3JldHVybiB0aGlzLnVucmVzb2x2ZWRTY2hlbWF8fCh0aGlzLnVucmVzb2x2ZWRTY2hlbWE9dGhpcy5zZXJ2aWNlLmxvYWRTY2hlbWEodGhpcy51cmkpKSx0aGlzLnVucmVzb2x2ZWRTY2hlbWF9Z2V0UmVzb2x2ZWRTY2hlbWEoKXtyZXR1cm4gdGhpcy5yZXNvbHZlZFNjaGVtYXx8KHRoaXMucmVzb2x2ZWRTY2hlbWE9dGhpcy5nZXRVbnJlc29sdmVkU2NoZW1hKCkudGhlbihlPT50aGlzLnNlcnZpY2UucmVzb2x2ZVNjaGVtYUNvbnRlbnQoZSx0aGlzKSkpLHRoaXMucmVzb2x2ZWRTY2hlbWF9Y2xlYXJTY2hlbWEoKXtjb25zdCBlPSEhdGhpcy51bnJlc29sdmVkU2NoZW1hO3JldHVybiB0aGlzLnJlc29sdmVkU2NoZW1hPXZvaWQgMCx0aGlzLnVucmVzb2x2ZWRTY2hlbWE9dm9pZCAwLHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCksdGhpcy5hbmNob3JzPXZvaWQgMCxlfX0sZW49Y2xhc3N7Y29uc3RydWN0b3IoZSx0PVtdKXt0aGlzLnNjaGVtYT1lLHRoaXMuZXJyb3JzPXR9fSxGbz1jbGFzc3tjb25zdHJ1Y3RvcihlLHQ9W10sbj1bXSxyKXt0aGlzLnNjaGVtYT1lLHRoaXMuZXJyb3JzPXQsdGhpcy53YXJuaW5ncz1uLHRoaXMuc2NoZW1hRHJhZnQ9cn1nZXRTZWN0aW9uKGUpe2NvbnN0IHQ9dGhpcy5nZXRTZWN0aW9uUmVjdXJzaXZlKGUsdGhpcy5zY2hlbWEpO2lmKHQpcmV0dXJuIHdlKHQpfWdldFNlY3Rpb25SZWN1cnNpdmUoZSx0KXtpZighdHx8dHlwZW9mIHQ9PSJib29sZWFuInx8ZS5sZW5ndGg9PT0wKXJldHVybiB0O2NvbnN0IG49ZS5zaGlmdCgpO2lmKHQucHJvcGVydGllcyYmdHlwZW9mIHQucHJvcGVydGllc1tuXSlyZXR1cm4gdGhpcy5nZXRTZWN0aW9uUmVjdXJzaXZlKGUsdC5wcm9wZXJ0aWVzW25dKTtpZih0LnBhdHRlcm5Qcm9wZXJ0aWVzKWZvcihjb25zdCByIG9mIE9iamVjdC5rZXlzKHQucGF0dGVyblByb3BlcnRpZXMpKXtjb25zdCBpPVJuKHIpO2lmKGkhPW51bGwmJmkudGVzdChuKSlyZXR1cm4gdGhpcy5nZXRTZWN0aW9uUmVjdXJzaXZlKGUsdC5wYXR0ZXJuUHJvcGVydGllc1tyXSl9ZWxzZXtpZih0eXBlb2YgdC5hZGRpdGlvbmFsUHJvcGVydGllcz09Im9iamVjdCIpcmV0dXJuIHRoaXMuZ2V0U2VjdGlvblJlY3Vyc2l2ZShlLHQuYWRkaXRpb25hbFByb3BlcnRpZXMpO2lmKG4ubWF0Y2goIlswLTldKyIpKXtpZihBcnJheS5pc0FycmF5KHQuaXRlbXMpKXtjb25zdCByPXBhcnNlSW50KG4sMTApO2lmKCFpc05hTihyKSYmdC5pdGVtc1tyXSlyZXR1cm4gdGhpcy5nZXRTZWN0aW9uUmVjdXJzaXZlKGUsdC5pdGVtc1tyXSl9ZWxzZSBpZih0Lml0ZW1zKXJldHVybiB0aGlzLmdldFNlY3Rpb25SZWN1cnNpdmUoZSx0Lml0ZW1zKX19fX0sdjE9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuY29udGV4dFNlcnZpY2U9dCx0aGlzLnJlcXVlc3RTZXJ2aWNlPWUsdGhpcy5wcm9taXNlQ29uc3RydWN0b3I9bnx8UHJvbWlzZSx0aGlzLmNhbGxPbkRpc3Bvc2U9W10sdGhpcy5jb250cmlidXRpb25TY2hlbWFzPXt9LHRoaXMuY29udHJpYnV0aW9uQXNzb2NpYXRpb25zPVtdLHRoaXMuc2NoZW1hc0J5SWQ9e30sdGhpcy5maWxlUGF0dGVybkFzc29jaWF0aW9ucz1bXSx0aGlzLnJlZ2lzdGVyZWRTY2hlbWFzSWRzPXt9fWdldFJlZ2lzdGVyZWRTY2hlbWFJZHMoZSl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucmVnaXN0ZXJlZFNjaGVtYXNJZHMpLmZpbHRlcih0PT57Y29uc3Qgbj1UdC5wYXJzZSh0KS5zY2hlbWU7cmV0dXJuIG4hPT0ic2NoZW1hc2VydmljZSImJighZXx8ZShuKSl9KX1nZXQgcHJvbWlzZSgpe3JldHVybiB0aGlzLnByb21pc2VDb25zdHJ1Y3Rvcn1kaXNwb3NlKCl7Zm9yKDt0aGlzLmNhbGxPbkRpc3Bvc2UubGVuZ3RoPjA7KXRoaXMuY2FsbE9uRGlzcG9zZS5wb3AoKSgpfW9uUmVzb3VyY2VDaGFuZ2UoZSl7dGhpcy5jYWNoZWRTY2hlbWFGb3JSZXNvdXJjZT12b2lkIDA7bGV0IHQ9ITE7ZT1udChlKTtjb25zdCBuPVtlXSxyPU9iamVjdC5rZXlzKHRoaXMuc2NoZW1hc0J5SWQpLm1hcChpPT50aGlzLnNjaGVtYXNCeUlkW2ldKTtmb3IoO24ubGVuZ3RoOyl7Y29uc3QgaT1uLnBvcCgpO2ZvcihsZXQgcz0wO3M8ci5sZW5ndGg7cysrKXtjb25zdCBhPXJbc107YSYmKGEudXJpPT09aXx8YS5kZXBlbmRlbmNpZXMuaGFzKGkpKSYmKGEudXJpIT09aSYmbi5wdXNoKGEudXJpKSxhLmNsZWFyU2NoZW1hKCkmJih0PSEwKSxyW3NdPXZvaWQgMCl9fXJldHVybiB0fXNldFNjaGVtYUNvbnRyaWJ1dGlvbnMoZSl7aWYoZS5zY2hlbWFzKXtjb25zdCB0PWUuc2NoZW1hcztmb3IoY29uc3QgbiBpbiB0KXtjb25zdCByPW50KG4pO3RoaXMuY29udHJpYnV0aW9uU2NoZW1hc1tyXT10aGlzLmFkZFNjaGVtYUhhbmRsZShyLHRbbl0pfX1pZihBcnJheS5pc0FycmF5KGUuc2NoZW1hQXNzb2NpYXRpb25zKSl7Y29uc3QgdD1lLnNjaGVtYUFzc29jaWF0aW9ucztmb3IobGV0IG4gb2YgdCl7Y29uc3Qgcj1uLnVyaXMubWFwKG50KSxpPXRoaXMuYWRkRmlsZVBhdHRlcm5Bc3NvY2lhdGlvbihuLnBhdHRlcm4sbi5mb2xkZXJVcmkscik7dGhpcy5jb250cmlidXRpb25Bc3NvY2lhdGlvbnMucHVzaChpKX19fWFkZFNjaGVtYUhhbmRsZShlLHQpe2NvbnN0IG49bmV3IGIxKHRoaXMsZSx0KTtyZXR1cm4gdGhpcy5zY2hlbWFzQnlJZFtlXT1uLG59Z2V0T3JBZGRTY2hlbWFIYW5kbGUoZSx0KXtyZXR1cm4gdGhpcy5zY2hlbWFzQnlJZFtlXXx8dGhpcy5hZGRTY2hlbWFIYW5kbGUoZSx0KX1hZGRGaWxlUGF0dGVybkFzc29jaWF0aW9uKGUsdCxuKXtjb25zdCByPW5ldyBwMShlLHQsbik7cmV0dXJuIHRoaXMuZmlsZVBhdHRlcm5Bc3NvY2lhdGlvbnMucHVzaChyKSxyfXJlZ2lzdGVyRXh0ZXJuYWxTY2hlbWEoZSl7Y29uc3QgdD1udChlLnVyaSk7cmV0dXJuIHRoaXMucmVnaXN0ZXJlZFNjaGVtYXNJZHNbdF09ITAsdGhpcy5jYWNoZWRTY2hlbWFGb3JSZXNvdXJjZT12b2lkIDAsZS5maWxlTWF0Y2gmJmUuZmlsZU1hdGNoLmxlbmd0aCYmdGhpcy5hZGRGaWxlUGF0dGVybkFzc29jaWF0aW9uKGUuZmlsZU1hdGNoLGUuZm9sZGVyVXJpLFt0XSksZS5zY2hlbWE/dGhpcy5hZGRTY2hlbWFIYW5kbGUodCxlLnNjaGVtYSk6dGhpcy5nZXRPckFkZFNjaGVtYUhhbmRsZSh0KX1jbGVhckV4dGVybmFsU2NoZW1hcygpe3RoaXMuc2NoZW1hc0J5SWQ9e30sdGhpcy5maWxlUGF0dGVybkFzc29jaWF0aW9ucz1bXSx0aGlzLnJlZ2lzdGVyZWRTY2hlbWFzSWRzPXt9LHRoaXMuY2FjaGVkU2NoZW1hRm9yUmVzb3VyY2U9dm9pZCAwO2Zvcihjb25zdCBlIGluIHRoaXMuY29udHJpYnV0aW9uU2NoZW1hcyl0aGlzLnNjaGVtYXNCeUlkW2VdPXRoaXMuY29udHJpYnV0aW9uU2NoZW1hc1tlXSx0aGlzLnJlZ2lzdGVyZWRTY2hlbWFzSWRzW2VdPSEwO2Zvcihjb25zdCBlIG9mIHRoaXMuY29udHJpYnV0aW9uQXNzb2NpYXRpb25zKXRoaXMuZmlsZVBhdHRlcm5Bc3NvY2lhdGlvbnMucHVzaChlKX1nZXRSZXNvbHZlZFNjaGVtYShlKXtjb25zdCB0PW50KGUpLG49dGhpcy5zY2hlbWFzQnlJZFt0XTtyZXR1cm4gbj9uLmdldFJlc29sdmVkU2NoZW1hKCk6dGhpcy5wcm9taXNlLnJlc29sdmUodm9pZCAwKX1sb2FkU2NoZW1hKGUpe2lmKCF0aGlzLnJlcXVlc3RTZXJ2aWNlKXtjb25zdCB0PUUoIlVuYWJsZSB0byBsb2FkIHNjaGVtYSBmcm9tICd7MH0nLiBObyBzY2hlbWEgcmVxdWVzdCBzZXJ2aWNlIGF2YWlsYWJsZSIsdG4oZSkpO3JldHVybiB0aGlzLnByb21pc2UucmVzb2x2ZShuZXcgZW4oe30sW3RdKSl9cmV0dXJuIGUuc3RhcnRzV2l0aCgiaHR0cDovL2pzb24tc2NoZW1hLm9yZy8iKSYmKGU9Imh0dHBzIitlLnN1YnN0cmluZyg0KSksdGhpcy5yZXF1ZXN0U2VydmljZShlKS50aGVuKHQ9PntpZighdCl7Y29uc3Qgcz1FKCJVbmFibGUgdG8gbG9hZCBzY2hlbWEgZnJvbSAnezB9JzogTm8gY29udGVudC4iLHRuKGUpKTtyZXR1cm4gbmV3IGVuKHt9LFtzXSl9Y29uc3Qgbj1bXTt0LmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKG4ucHVzaChFKCJQcm9ibGVtIHJlYWRpbmcgY29udGVudCBmcm9tICd7MH0nOiBVVEYtOCB3aXRoIEJPTSBkZXRlY3RlZCwgb25seSBVVEYgOCBpcyBhbGxvd2VkLiIsdG4oZSkpKSx0PXQudHJpbVN0YXJ0KCkpO2xldCByPXt9O2NvbnN0IGk9W107cmV0dXJuIHI9VmModCxpKSxpLmxlbmd0aCYmbi5wdXNoKEUoIlVuYWJsZSB0byBwYXJzZSBjb250ZW50IGZyb20gJ3swfSc6IFBhcnNlIGVycm9yIGF0IG9mZnNldCB7MX0uIix0bihlKSxpWzBdLm9mZnNldCkpLG5ldyBlbihyLG4pfSx0PT57bGV0IG49dC50b1N0cmluZygpO2NvbnN0IHI9dC50b1N0cmluZygpLnNwbGl0KCJFcnJvcjogIik7cmV0dXJuIHIubGVuZ3RoPjEmJihuPXJbMV0pLFF0KG4sIi4iKSYmKG49bi5zdWJzdHIoMCxuLmxlbmd0aC0xKSksbmV3IGVuKHt9LFtFKCJVbmFibGUgdG8gbG9hZCBzY2hlbWEgZnJvbSAnezB9JzogezF9LiIsdG4oZSksbildKX0pfXJlc29sdmVTY2hlbWFDb250ZW50KGUsdCl7Y29uc3Qgbj1lLmVycm9ycy5zbGljZSgwKSxyPWUuc2NoZW1hO2xldCBpPXIuJHNjaGVtYT9udChyLiRzY2hlbWEpOnZvaWQgMDtpZihpPT09Imh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDMvc2NoZW1hIilyZXR1cm4gdGhpcy5wcm9taXNlLnJlc29sdmUobmV3IEZvKHt9LFtFKCJEcmFmdC0wMyBzY2hlbWFzIGFyZSBub3Qgc3VwcG9ydGVkLiIpXSxbXSxpKSk7bGV0IHM9bmV3IFNldDtjb25zdCBhPXRoaXMuY29udGV4dFNlcnZpY2UsbD0oZyxwKT0+e3A9ZGVjb2RlVVJJQ29tcG9uZW50KHApO2xldCB4PWc7cmV0dXJuIHBbMF09PT0iLyImJihwPXAuc3Vic3RyaW5nKDEpKSxwLnNwbGl0KCIvIikuc29tZSh3PT4odz13LnJlcGxhY2UoL34xL2csIi8iKS5yZXBsYWNlKC9+MC9nLCJ+IikseD14W3ddLCF4KSkseH0sbz0oZyxwLHgpPT4ocC5hbmNob3JzfHwocC5hbmNob3JzPW0oZykpLHAuYW5jaG9ycy5nZXQoeCkpLHU9KGcscCk9Pntmb3IoY29uc3QgeCBpbiBwKXAuaGFzT3duUHJvcGVydHkoeCkmJnghPT0iaWQiJiZ4IT09IiRpZCImJihnW3hdPXBbeF0pfSxoPShnLHAseCx3KT0+e2xldCBMO3c9PT12b2lkIDB8fHcubGVuZ3RoPT09MD9MPXA6dy5jaGFyQXQoMCk9PT0iLyI/TD1sKHAsdyk6TD1vKHAseCx3KSxMP3UoZyxMKTpuLnB1c2goRSgiJHJlZiAnezB9JyBpbiAnezF9JyBjYW4gbm90IGJlIHJlc29sdmVkLiIsd3x8IiIseC51cmkpKX0sZj0oZyxwLHgsdyk9PnthJiYhL15bQS1aYS16XVtBLVphLXowLTkrXC0uK10qOlwvXC8uKi8udGVzdChwKSYmKHA9YS5yZXNvbHZlUmVsYXRpdmVQYXRoKHAsdy51cmkpKSxwPW50KHApO2NvbnN0IEw9dGhpcy5nZXRPckFkZFNjaGVtYUhhbmRsZShwKTtyZXR1cm4gTC5nZXRVbnJlc29sdmVkU2NoZW1hKCkudGhlbih2PT57aWYody5kZXBlbmRlbmNpZXMuYWRkKHApLHYuZXJyb3JzLmxlbmd0aCl7Y29uc3QgeT14P3ArIiMiK3g6cDtuLnB1c2goRSgiUHJvYmxlbXMgbG9hZGluZyByZWZlcmVuY2UgJ3swfSc6IHsxfSIseSx2LmVycm9yc1swXSkpfXJldHVybiBoKGcsdi5zY2hlbWEsTCx4KSxkKGcsdi5zY2hlbWEsTCl9KX0sZD0oZyxwLHgpPT57Y29uc3Qgdz1bXTtyZXR1cm4gdGhpcy50cmF2ZXJzZU5vZGVzKGcsTD0+e2NvbnN0IHY9bmV3IFNldDtmb3IoO0wuJHJlZjspe2NvbnN0IHk9TC4kcmVmLGI9eS5zcGxpdCgiIyIsMik7aWYoZGVsZXRlIEwuJHJlZixiWzBdLmxlbmd0aD4wKXt3LnB1c2goZihMLGJbMF0sYlsxXSx4KSk7cmV0dXJufWVsc2UgaWYoIXYuaGFzKHkpKXtjb25zdCBfPWJbMV07aChMLHAseCxfKSx2LmFkZCh5KX19TC4kcmVjdXJzaXZlUmVmJiZzLmFkZCgiJHJlY3Vyc2l2ZVJlZiIpLEwuJGR5bmFtaWNSZWYmJnMuYWRkKCIkZHluYW1pY1JlZiIpfSksdGhpcy5wcm9taXNlLmFsbCh3KX0sbT1nPT57Y29uc3QgcD1uZXcgTWFwO3JldHVybiB0aGlzLnRyYXZlcnNlTm9kZXMoZyx4PT57Y29uc3Qgdz14LiRpZHx8eC5pZCxMPU5hKHcpJiZ3LmNoYXJBdCgwKT09PSIjIj93LnN1YnN0cmluZygxKTp4LiRhbmNob3I7TCYmKHAuaGFzKEwpP24ucHVzaChFKCJEdXBsaWNhdGUgYW5jaG9yIGRlY2xhcmF0aW9uOiAnezB9JyIsTCkpOnAuc2V0KEwseCkpLHguJHJlY3Vyc2l2ZUFuY2hvciYmcy5hZGQoIiRyZWN1cnNpdmVBbmNob3IiKSx4LiRkeW5hbWljQW5jaG9yJiZzLmFkZCgiJGR5bmFtaWNBbmNob3IiKX0pLHB9O3JldHVybiBkKHIscix0KS50aGVuKGc9PntsZXQgcD1bXTtyZXR1cm4gcy5zaXplJiZwLnB1c2goRSgiVGhlIHNjaGVtYSB1c2VzIG1ldGEtc2NoZW1hIGZlYXR1cmVzICh7MH0pIHRoYXQgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IHRoZSB2YWxpZGF0b3IuIixBcnJheS5mcm9tKHMua2V5cygpKS5qb2luKCIsICIpKSksbmV3IEZvKHIsbixwLGkpfSl9dHJhdmVyc2VOb2RlcyhlLHQpe2lmKCFlfHx0eXBlb2YgZSE9Im9iamVjdCIpcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtjb25zdCBuPW5ldyBTZXQscj0oLi4udSk9Pntmb3IoY29uc3QgaCBvZiB1KWV0KGgpJiZsLnB1c2goaCl9LGk9KC4uLnUpPT57Zm9yKGNvbnN0IGggb2YgdSlpZihldChoKSlmb3IoY29uc3QgZiBpbiBoKXtjb25zdCBtPWhbZl07ZXQobSkmJmwucHVzaChtKX19LHM9KC4uLnUpPT57Zm9yKGNvbnN0IGggb2YgdSlpZihBcnJheS5pc0FycmF5KGgpKWZvcihjb25zdCBmIG9mIGgpZXQoZikmJmwucHVzaChmKX0sYT11PT57aWYoQXJyYXkuaXNBcnJheSh1KSlmb3IoY29uc3QgaCBvZiB1KWV0KGgpJiZsLnB1c2goaCk7ZWxzZSBldCh1KSYmbC5wdXNoKHUpfSxsPVtlXTtsZXQgbz1sLnBvcCgpO2Zvcig7bzspbi5oYXMobyl8fChuLmFkZChvKSx0KG8pLHIoby5hZGRpdGlvbmFsSXRlbXMsby5hZGRpdGlvbmFsUHJvcGVydGllcyxvLm5vdCxvLmNvbnRhaW5zLG8ucHJvcGVydHlOYW1lcyxvLmlmLG8udGhlbixvLmVsc2Usby51bmV2YWx1YXRlZEl0ZW1zLG8udW5ldmFsdWF0ZWRQcm9wZXJ0aWVzKSxpKG8uZGVmaW5pdGlvbnMsby4kZGVmcyxvLnByb3BlcnRpZXMsby5wYXR0ZXJuUHJvcGVydGllcyxvLmRlcGVuZGVuY2llcyxvLmRlcGVuZGVudFNjaGVtYXMpLHMoby5hbnlPZixvLmFsbE9mLG8ub25lT2Ysby5wcmVmaXhJdGVtcyksYShvLml0ZW1zKSksbz1sLnBvcCgpfWdldFNjaGVtYUZyb21Qcm9wZXJ0eShlLHQpe3ZhciBuLHI7aWYoKChuPXQucm9vdCk9PW51bGw/dm9pZCAwOm4udHlwZSk9PT0ib2JqZWN0Iil7Zm9yKGNvbnN0IGkgb2YgdC5yb290LnByb3BlcnRpZXMpaWYoaS5rZXlOb2RlLnZhbHVlPT09IiRzY2hlbWEiJiYoKHI9aS52YWx1ZU5vZGUpPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09InN0cmluZyIpe2xldCBzPWkudmFsdWVOb2RlLnZhbHVlO3JldHVybiB0aGlzLmNvbnRleHRTZXJ2aWNlJiYhL15cd1tcd1xkKy4tXSo6Ly50ZXN0KHMpJiYocz10aGlzLmNvbnRleHRTZXJ2aWNlLnJlc29sdmVSZWxhdGl2ZVBhdGgocyxlKSksc319fWdldEFzc29jaWF0ZWRTY2hlbWFzKGUpe2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKSxuPVtdLHI9Vm8oZSk7Zm9yKGNvbnN0IGkgb2YgdGhpcy5maWxlUGF0dGVybkFzc29jaWF0aW9ucylpZihpLm1hdGNoZXNQYXR0ZXJuKHIpKWZvcihjb25zdCBzIG9mIGkuZ2V0VVJJcygpKXRbc118fChuLnB1c2gocyksdFtzXT0hMCk7cmV0dXJuIG59Z2V0U2NoZW1hVVJJc0ZvclJlc291cmNlKGUsdCl7bGV0IG49dCYmdGhpcy5nZXRTY2hlbWFGcm9tUHJvcGVydHkoZSx0KTtyZXR1cm4gbj9bbl06dGhpcy5nZXRBc3NvY2lhdGVkU2NoZW1hcyhlKX1nZXRTY2hlbWFGb3JSZXNvdXJjZShlLHQpe2lmKHQpe2xldCBpPXRoaXMuZ2V0U2NoZW1hRnJvbVByb3BlcnR5KGUsdCk7aWYoaSl7Y29uc3Qgcz1udChpKTtyZXR1cm4gdGhpcy5nZXRPckFkZFNjaGVtYUhhbmRsZShzKS5nZXRSZXNvbHZlZFNjaGVtYSgpfX1pZih0aGlzLmNhY2hlZFNjaGVtYUZvclJlc291cmNlJiZ0aGlzLmNhY2hlZFNjaGVtYUZvclJlc291cmNlLnJlc291cmNlPT09ZSlyZXR1cm4gdGhpcy5jYWNoZWRTY2hlbWFGb3JSZXNvdXJjZS5yZXNvbHZlZFNjaGVtYTtjb25zdCBuPXRoaXMuZ2V0QXNzb2NpYXRlZFNjaGVtYXMoZSkscj1uLmxlbmd0aD4wP3RoaXMuY3JlYXRlQ29tYmluZWRTY2hlbWEoZSxuKS5nZXRSZXNvbHZlZFNjaGVtYSgpOnRoaXMucHJvbWlzZS5yZXNvbHZlKHZvaWQgMCk7cmV0dXJuIHRoaXMuY2FjaGVkU2NoZW1hRm9yUmVzb3VyY2U9e3Jlc291cmNlOmUscmVzb2x2ZWRTY2hlbWE6cn0scn1jcmVhdGVDb21iaW5lZFNjaGVtYShlLHQpe2lmKHQubGVuZ3RoPT09MSlyZXR1cm4gdGhpcy5nZXRPckFkZFNjaGVtYUhhbmRsZSh0WzBdKTt7Y29uc3Qgbj0ic2NoZW1hc2VydmljZTovL2NvbWJpbmVkU2NoZW1hLyIrZW5jb2RlVVJJQ29tcG9uZW50KGUpLHI9e2FsbE9mOnQubWFwKGk9Pih7JHJlZjppfSkpfTtyZXR1cm4gdGhpcy5hZGRTY2hlbWFIYW5kbGUobixyKX19Z2V0TWF0Y2hpbmdTY2hlbWFzKGUsdCxuKXtpZihuKXtjb25zdCByPW4uaWR8fCJzY2hlbWFzZXJ2aWNlOi8vdW50aXRsZWQvbWF0Y2hpbmdTY2hlbWFzLyIreDErKztyZXR1cm4gdGhpcy5hZGRTY2hlbWFIYW5kbGUocixuKS5nZXRSZXNvbHZlZFNjaGVtYSgpLnRoZW4ocz0+dC5nZXRNYXRjaGluZ1NjaGVtYXMocy5zY2hlbWEpLmZpbHRlcihhPT4hYS5pbnZlcnRlZCkpfXJldHVybiB0aGlzLmdldFNjaGVtYUZvclJlc291cmNlKGUudXJpLHQpLnRoZW4ocj0+cj90LmdldE1hdGNoaW5nU2NoZW1hcyhyLnNjaGVtYSkuZmlsdGVyKGk9PiFpLmludmVydGVkKTpbXSl9fSx4MT0wO2Z1bmN0aW9uIG50KGUpe3RyeXtyZXR1cm4gVHQucGFyc2UoZSkudG9TdHJpbmcoITApfWNhdGNoe3JldHVybiBlfX1mdW5jdGlvbiBWbyhlKXt0cnl7cmV0dXJuIFR0LnBhcnNlKGUpLndpdGgoe2ZyYWdtZW50Om51bGwscXVlcnk6bnVsbH0pLnRvU3RyaW5nKCEwKX1jYXRjaHtyZXR1cm4gZX19ZnVuY3Rpb24gdG4oZSl7dHJ5e2NvbnN0IHQ9VHQucGFyc2UoZSk7aWYodC5zY2hlbWU9PT0iZmlsZSIpcmV0dXJuIHQuZnNQYXRofWNhdGNoe31yZXR1cm4gZX1mdW5jdGlvbiB5MShlLHQpe2NvbnN0IG49W10scj1bXSxpPVtdO2xldCBzPS0xO2NvbnN0IGE9YXQoZS5nZXRUZXh0KCksITEpO2xldCBsPWEuc2NhbigpO2Z1bmN0aW9uIG8oZyl7bi5wdXNoKGcpLHIucHVzaChpLmxlbmd0aCl9Zm9yKDtsIT09MTc7KXtzd2l0Y2gobCl7Y2FzZSAxOmNhc2UgMzp7Y29uc3QgZz1lLnBvc2l0aW9uQXQoYS5nZXRUb2tlbk9mZnNldCgpKS5saW5lLHA9e3N0YXJ0TGluZTpnLGVuZExpbmU6ZyxraW5kOmw9PT0xPyJvYmplY3QiOiJhcnJheSJ9O2kucHVzaChwKTticmVha31jYXNlIDI6Y2FzZSA0Ontjb25zdCBnPWw9PT0yPyJvYmplY3QiOiJhcnJheSI7aWYoaS5sZW5ndGg+MCYmaVtpLmxlbmd0aC0xXS5raW5kPT09Zyl7Y29uc3QgcD1pLnBvcCgpLHg9ZS5wb3NpdGlvbkF0KGEuZ2V0VG9rZW5PZmZzZXQoKSkubGluZTtwJiZ4PnAuc3RhcnRMaW5lKzEmJnMhPT1wLnN0YXJ0TGluZSYmKHAuZW5kTGluZT14LTEsbyhwKSxzPXAuc3RhcnRMaW5lKX1icmVha31jYXNlIDEzOntjb25zdCBnPWUucG9zaXRpb25BdChhLmdldFRva2VuT2Zmc2V0KCkpLmxpbmUscD1lLnBvc2l0aW9uQXQoYS5nZXRUb2tlbk9mZnNldCgpK2EuZ2V0VG9rZW5MZW5ndGgoKSkubGluZTthLmdldFRva2VuRXJyb3IoKT09PTEmJmcrMTxlLmxpbmVDb3VudD9hLnNldFBvc2l0aW9uKGUub2Zmc2V0QXQoWi5jcmVhdGUoZysxLDApKSk6ZzxwJiYobyh7c3RhcnRMaW5lOmcsZW5kTGluZTpwLGtpbmQ6WXQuQ29tbWVudH0pLHM9Zyk7YnJlYWt9Y2FzZSAxMjp7Y29uc3QgcD1lLmdldFRleHQoKS5zdWJzdHIoYS5nZXRUb2tlbk9mZnNldCgpLGEuZ2V0VG9rZW5MZW5ndGgoKSkubWF0Y2goL15cL1wvXHMqIyhyZWdpb25cYil8KGVuZHJlZ2lvblxiKS8pO2lmKHApe2NvbnN0IHg9ZS5wb3NpdGlvbkF0KGEuZ2V0VG9rZW5PZmZzZXQoKSkubGluZTtpZihwWzFdKXtjb25zdCB3PXtzdGFydExpbmU6eCxlbmRMaW5lOngsa2luZDpZdC5SZWdpb259O2kucHVzaCh3KX1lbHNle2xldCB3PWkubGVuZ3RoLTE7Zm9yKDt3Pj0wJiZpW3ddLmtpbmQhPT1ZdC5SZWdpb247KXctLTtpZih3Pj0wKXtjb25zdCBMPWlbd107aS5sZW5ndGg9dyx4Pkwuc3RhcnRMaW5lJiZzIT09TC5zdGFydExpbmUmJihMLmVuZExpbmU9eCxvKEwpLHM9TC5zdGFydExpbmUpfX19YnJlYWt9fWw9YS5zY2FuKCl9Y29uc3QgdT10JiZ0LnJhbmdlTGltaXQ7aWYodHlwZW9mIHUhPSJudW1iZXIifHxuLmxlbmd0aDw9dSlyZXR1cm4gbjt0JiZ0Lm9uUmFuZ2VMaW1pdEV4Y2VlZGVkJiZ0Lm9uUmFuZ2VMaW1pdEV4Y2VlZGVkKGUudXJpKTtjb25zdCBoPVtdO2ZvcihsZXQgZyBvZiByKWc8MzAmJihoW2ddPShoW2ddfHwwKSsxKTtsZXQgZj0wLGQ9MDtmb3IobGV0IGc9MDtnPGgubGVuZ3RoO2crKyl7Y29uc3QgcD1oW2ddO2lmKHApe2lmKHArZj51KXtkPWc7YnJlYWt9Zis9cH19Y29uc3QgbT1bXTtmb3IobGV0IGc9MDtnPG4ubGVuZ3RoO2crKyl7Y29uc3QgcD1yW2ddO3R5cGVvZiBwPT0ibnVtYmVyIiYmKHA8ZHx8cD09PWQmJmYrKzx1KSYmbS5wdXNoKG5bZ10pfXJldHVybiBtfWZ1bmN0aW9uIHcxKGUsdCxuKXtmdW5jdGlvbiByKGwpe2xldCBvPWUub2Zmc2V0QXQobCksdT1uLmdldE5vZGVGcm9tT2Zmc2V0KG8sITApO2NvbnN0IGg9W107Zm9yKDt1Oyl7c3dpdGNoKHUudHlwZSl7Y2FzZSJzdHJpbmciOmNhc2Uib2JqZWN0IjpjYXNlImFycmF5Ijpjb25zdCBkPXUub2Zmc2V0KzEsbT11Lm9mZnNldCt1Lmxlbmd0aC0xO2Q8bSYmbz49ZCYmbzw9bSYmaC5wdXNoKGkoZCxtKSksaC5wdXNoKGkodS5vZmZzZXQsdS5vZmZzZXQrdS5sZW5ndGgpKTticmVhaztjYXNlIm51bWJlciI6Y2FzZSJib29sZWFuIjpjYXNlIm51bGwiOmNhc2UicHJvcGVydHkiOmgucHVzaChpKHUub2Zmc2V0LHUub2Zmc2V0K3UubGVuZ3RoKSk7YnJlYWt9aWYodS50eXBlPT09InByb3BlcnR5Inx8dS5wYXJlbnQmJnUucGFyZW50LnR5cGU9PT0iYXJyYXkiKXtjb25zdCBkPWEodS5vZmZzZXQrdS5sZW5ndGgsNSk7ZCE9PS0xJiZoLnB1c2goaSh1Lm9mZnNldCxkKSl9dT11LnBhcmVudH1sZXQgZjtmb3IobGV0IGQ9aC5sZW5ndGgtMTtkPj0wO2QtLSlmPVRuLmNyZWF0ZShoW2RdLGYpO3JldHVybiBmfHwoZj1Ubi5jcmVhdGUocS5jcmVhdGUobCxsKSkpLGZ9ZnVuY3Rpb24gaShsLG8pe3JldHVybiBxLmNyZWF0ZShlLnBvc2l0aW9uQXQobCksZS5wb3NpdGlvbkF0KG8pKX1jb25zdCBzPWF0KGUuZ2V0VGV4dCgpLCEwKTtmdW5jdGlvbiBhKGwsbyl7cmV0dXJuIHMuc2V0UG9zaXRpb24obCkscy5zY2FuKCk9PT1vP3MuZ2V0VG9rZW5PZmZzZXQoKStzLmdldFRva2VuTGVuZ3RoKCk6LTF9cmV0dXJuIHQubWFwKHIpfWZ1bmN0aW9uIGVpKGUsdCxuKXtsZXQgcjtpZihuKXtjb25zdCBzPWUub2Zmc2V0QXQobi5zdGFydCksYT1lLm9mZnNldEF0KG4uZW5kKS1zO3I9e29mZnNldDpzLGxlbmd0aDphfX1jb25zdCBpPXt0YWJTaXplOnQ/dC50YWJTaXplOjQsaW5zZXJ0U3BhY2VzOih0PT1udWxsP3ZvaWQgMDp0Lmluc2VydFNwYWNlcyk9PT0hMCxpbnNlcnRGaW5hbE5ld2xpbmU6KHQ9PW51bGw/dm9pZCAwOnQuaW5zZXJ0RmluYWxOZXdsaW5lKT09PSEwLGVvbDpgCmAsa2VlcExpbmVzOih0PT1udWxsP3ZvaWQgMDp0LmtlZXBMaW5lcyk9PT0hMH07cmV0dXJuIFVjKGUuZ2V0VGV4dCgpLHIsaSkubWFwKHM9PkRlLnJlcGxhY2UocS5jcmVhdGUoZS5wb3NpdGlvbkF0KHMub2Zmc2V0KSxlLnBvc2l0aW9uQXQocy5vZmZzZXQrcy5sZW5ndGgpKSxzLmNvbnRlbnQpKX12YXIgc2U7KGZ1bmN0aW9uKGUpe2VbZS5PYmplY3Q9MF09Ik9iamVjdCIsZVtlLkFycmF5PTFdPSJBcnJheSJ9KShzZXx8KHNlPXt9KSk7dmFyIEZuPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5wcm9wZXJ0eU5hbWU9ZT8/IiIsdGhpcy5iZWdpbm5pbmdMaW5lTnVtYmVyPXQsdGhpcy5jaGlsZHJlblByb3BlcnRpZXM9W10sdGhpcy5sYXN0UHJvcGVydHk9ITEsdGhpcy5ub0tleU5hbWU9ITF9YWRkQ2hpbGRQcm9wZXJ0eShlKXtpZihlLnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW5Qcm9wZXJ0aWVzLmxlbmd0aD4wKXtsZXQgdD0wO2Uubm9LZXlOYW1lP3Q9dGhpcy5jaGlsZHJlblByb3BlcnRpZXMubGVuZ3RoOnQ9TDEodGhpcy5jaGlsZHJlblByb3BlcnRpZXMsZSxfMSksdDwwJiYodD10Ki0xLTEpLHRoaXMuY2hpbGRyZW5Qcm9wZXJ0aWVzLnNwbGljZSh0LDAsZSl9ZWxzZSB0aGlzLmNoaWxkcmVuUHJvcGVydGllcy5wdXNoKGUpO3JldHVybiBlfX07ZnVuY3Rpb24gXzEoZSx0KXtjb25zdCBuPWUucHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKCkscj10LnByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBuPHI/LTE6bj5yPzE6MH1mdW5jdGlvbiBMMShlLHQsbil7Y29uc3Qgcj10LnByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpLGk9ZVswXS5wcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKSxzPWVbZS5sZW5ndGgtMV0ucHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKCk7aWYocjxpKXJldHVybiAwO2lmKHI+cylyZXR1cm4gZS5sZW5ndGg7bGV0IGE9MCxsPWUubGVuZ3RoLTE7Zm9yKDthPD1sOyl7bGV0IG89bCthPj4xLHU9bih0LGVbb10pO2lmKHU+MClhPW8rMTtlbHNlIGlmKHU8MClsPW8tMTtlbHNlIHJldHVybiBvfXJldHVybi1hLTF9ZnVuY3Rpb24gTjEoZSx0KXtjb25zdCBuPXsuLi50LGtlZXBMaW5lczohMX0scj1NZS5hcHBseUVkaXRzKGUsZWkoZSxuLHZvaWQgMCkpLGk9TWUuY3JlYXRlKCJ0ZXN0Oi8vdGVzdC5qc29uIiwianNvbiIsMCxyKSxzPVMxKGkpLGE9QTEoaSxzKSxsPWVpKGEsbix2b2lkIDApLG89TWUuYXBwbHlFZGl0cyhhLGwpO3JldHVybltEZS5yZXBsYWNlKHEuY3JlYXRlKFouY3JlYXRlKDAsMCksZS5wb3NpdGlvbkF0KGUuZ2V0VGV4dCgpLmxlbmd0aCkpLG8pXX1mdW5jdGlvbiBTMShlKXtjb25zdCB0PWUuZ2V0VGV4dCgpLG49YXQodCwhMSk7bGV0IHI9bmV3IEZuLGk9cixzPXIsYT1yLGwsbz0wLHU9MCxoLGYsZD0tMSxtPS0xLGc9MCxwPTAseD1bXSx3PSExLEw9ITE7Zm9yKDsobD1uLnNjYW4oKSkhPT0xNzspe2lmKHc9PT0hMCYmbCE9PTE0JiZsIT09MTUmJmwhPT0xMiYmbCE9PTEzJiZzLmVuZExpbmVOdW1iZXI9PT12b2lkIDApe2xldCB2PW4uZ2V0VG9rZW5TdGFydExpbmUoKTtmPT09Mnx8Zj09PTQ/YS5lbmRMaW5lTnVtYmVyPXYtMTpzLmVuZExpbmVOdW1iZXI9di0xLGc9dix3PSExfWlmKEw9PT0hMCYmbCE9PTE0JiZsIT09MTUmJmwhPT0xMiYmbCE9PTEzJiYoZz1uLmdldFRva2VuU3RhcnRMaW5lKCksTD0hMSksbi5nZXRUb2tlblN0YXJ0TGluZSgpIT09byl7Zm9yKGxldCB2PW87djxuLmdldFRva2VuU3RhcnRMaW5lKCk7disrKXtjb25zdCB5PWUuZ2V0VGV4dChxLmNyZWF0ZShaLmNyZWF0ZSh2LDApLFouY3JlYXRlKHYrMSwwKSkpLmxlbmd0aDt1PXUreX1vPW4uZ2V0VG9rZW5TdGFydExpbmUoKX1zd2l0Y2gobCl7Y2FzZSAxMDp7aWYoaD09PXZvaWQgMHx8aD09PTF8fGg9PT01JiZ4W3gubGVuZ3RoLTFdPT09c2UuT2JqZWN0KXtjb25zdCB2PW5ldyBGbihuLmdldFRva2VuVmFsdWUoKSxnKTthPXMscz1pLmFkZENoaWxkUHJvcGVydHkodil9YnJlYWt9Y2FzZSAzOntpZihyLmJlZ2lubmluZ0xpbmVOdW1iZXI9PT12b2lkIDAmJihyLmJlZ2lubmluZ0xpbmVOdW1iZXI9bi5nZXRUb2tlblN0YXJ0TGluZSgpKSx4W3gubGVuZ3RoLTFdPT09c2UuT2JqZWN0KWk9cztlbHNlIGlmKHhbeC5sZW5ndGgtMV09PT1zZS5BcnJheSl7Y29uc3Qgdj1uZXcgRm4obi5nZXRUb2tlblZhbHVlKCksZyk7di5ub0tleU5hbWU9ITAsYT1zLHM9aS5hZGRDaGlsZFByb3BlcnR5KHYpLGk9c314LnB1c2goc2UuQXJyYXkpLHMudHlwZT1zZS5BcnJheSxnPW4uZ2V0VG9rZW5TdGFydExpbmUoKSxnKys7YnJlYWt9Y2FzZSAxOntpZihyLmJlZ2lubmluZ0xpbmVOdW1iZXI9PT12b2lkIDApci5iZWdpbm5pbmdMaW5lTnVtYmVyPW4uZ2V0VG9rZW5TdGFydExpbmUoKTtlbHNlIGlmKHhbeC5sZW5ndGgtMV09PT1zZS5BcnJheSl7Y29uc3Qgdj1uZXcgRm4obi5nZXRUb2tlblZhbHVlKCksZyk7di5ub0tleU5hbWU9ITAsYT1zLHM9aS5hZGRDaGlsZFByb3BlcnR5KHYpfXMudHlwZT1zZS5PYmplY3QseC5wdXNoKHNlLk9iamVjdCksaT1zLGc9bi5nZXRUb2tlblN0YXJ0TGluZSgpLGcrKzticmVha31jYXNlIDQ6e3A9bi5nZXRUb2tlblN0YXJ0TGluZSgpLHgucG9wKCkscy5lbmRMaW5lTnVtYmVyPT09dm9pZCAwJiYoaD09PTJ8fGg9PT00KSYmKHMuZW5kTGluZU51bWJlcj1wLTEscy5sYXN0UHJvcGVydHk9ITAscy5saW5lV2hlcmVUb0FkZENvbW1hPWQscy5pbmRleFdoZXJlVG9BZGRDb21hPW0sYT1zLHM9cz9zLnBhcmVudDp2b2lkIDAsaT1zKSxyLmVuZExpbmVOdW1iZXI9cCxnPXArMTticmVha31jYXNlIDI6e3A9bi5nZXRUb2tlblN0YXJ0TGluZSgpLHgucG9wKCksaCE9PTEmJihzLmVuZExpbmVOdW1iZXI9PT12b2lkIDAmJihzLmVuZExpbmVOdW1iZXI9cC0xLHMubGFzdFByb3BlcnR5PSEwLHMubGluZVdoZXJlVG9BZGRDb21tYT1kLHMuaW5kZXhXaGVyZVRvQWRkQ29tYT1tKSxhPXMscz1zP3MucGFyZW50OnZvaWQgMCxpPXMpLHIuZW5kTGluZU51bWJlcj1uLmdldFRva2VuU3RhcnRMaW5lKCksZz1wKzE7YnJlYWt9Y2FzZSA1OntwPW4uZ2V0VG9rZW5TdGFydExpbmUoKSxzLmVuZExpbmVOdW1iZXI9PT12b2lkIDAmJih4W3gubGVuZ3RoLTFdPT09c2UuT2JqZWN0fHx4W3gubGVuZ3RoLTFdPT09c2UuQXJyYXkmJihoPT09Mnx8aD09PTQpKSYmKHMuZW5kTGluZU51bWJlcj1wLHMuY29tbWFJbmRleD1uLmdldFRva2VuT2Zmc2V0KCktdSxzLmNvbW1hTGluZT1wKSwoaD09PTJ8fGg9PT00KSYmKGE9cyxzPXM/cy5wYXJlbnQ6dm9pZCAwLGk9cyksZz1wKzE7YnJlYWt9Y2FzZSAxMzp7aD09PTUmJmQ9PT1uLmdldFRva2VuU3RhcnRMaW5lKCkmJih4W3gubGVuZ3RoLTFdPT09c2UuQXJyYXkmJihmPT09Mnx8Zj09PTQpfHx4W3gubGVuZ3RoLTFdPT09c2UuT2JqZWN0KSYmKHhbeC5sZW5ndGgtMV09PT1zZS5BcnJheSYmKGY9PT0yfHxmPT09NCl8fHhbeC5sZW5ndGgtMV09PT1zZS5PYmplY3QpJiYocy5lbmRMaW5lTnVtYmVyPXZvaWQgMCx3PSEwKSwoaD09PTF8fGg9PT0zKSYmZD09PW4uZ2V0VG9rZW5TdGFydExpbmUoKSYmKEw9ITApO2JyZWFrfX1sIT09MTQmJmwhPT0xMyYmbCE9PTEyJiZsIT09MTUmJihmPWgsaD1sLGQ9bi5nZXRUb2tlblN0YXJ0TGluZSgpLG09bi5nZXRUb2tlbk9mZnNldCgpK24uZ2V0VG9rZW5MZW5ndGgoKS11KX1yZXR1cm4gcn1mdW5jdGlvbiBBMShlLHQpe2lmKHQuY2hpbGRyZW5Qcm9wZXJ0aWVzLmxlbmd0aD09PTApcmV0dXJuIGU7Y29uc3Qgbj1NZS5jcmVhdGUoInRlc3Q6Ly90ZXN0Lmpzb24iLCJqc29uIiwwLGUuZ2V0VGV4dCgpKSxyPVtdO2ZvcihEbyhyLHQsdC5iZWdpbm5pbmdMaW5lTnVtYmVyKTtyLmxlbmd0aD4wOyl7Y29uc3QgaT1yLnNoaWZ0KCkscz1pLnByb3BlcnR5VHJlZUFycmF5O2xldCBhPWkuYmVnaW5uaW5nTGluZU51bWJlcjtmb3IobGV0IGw9MDtsPHMubGVuZ3RoO2wrKyl7Y29uc3Qgbz1zW2xdLHU9cS5jcmVhdGUoWi5jcmVhdGUoby5iZWdpbm5pbmdMaW5lTnVtYmVyLDApLFouY3JlYXRlKG8uZW5kTGluZU51bWJlcisxLDApKSxoPWUuZ2V0VGV4dCh1KSxmPU1lLmNyZWF0ZSgidGVzdDovL3Rlc3QuanNvbiIsImpzb24iLDAsaCk7aWYoby5sYXN0UHJvcGVydHk9PT0hMCYmbCE9PXMubGVuZ3RoLTEpe2NvbnN0IGc9by5saW5lV2hlcmVUb0FkZENvbW1hLW8uYmVnaW5uaW5nTGluZU51bWJlcixwPW8uaW5kZXhXaGVyZVRvQWRkQ29tYSx4PXtyYW5nZTpxLmNyZWF0ZShaLmNyZWF0ZShnLHApLFouY3JlYXRlKGcscCkpLHRleHQ6IiwifTtNZS51cGRhdGUoZixbeF0sMSl9ZWxzZSBpZihvLmxhc3RQcm9wZXJ0eT09PSExJiZsPT09cy5sZW5ndGgtMSl7Y29uc3QgZz1vLmNvbW1hSW5kZXgseD1vLmNvbW1hTGluZS1vLmJlZ2lubmluZ0xpbmVOdW1iZXIsdz17cmFuZ2U6cS5jcmVhdGUoWi5jcmVhdGUoeCxnKSxaLmNyZWF0ZSh4LGcrMSkpLHRleHQ6IiJ9O01lLnVwZGF0ZShmLFt3XSwxKX1jb25zdCBkPW8uZW5kTGluZU51bWJlci1vLmJlZ2lubmluZ0xpbmVOdW1iZXIrMSxtPXtyYW5nZTpxLmNyZWF0ZShaLmNyZWF0ZShhLDApLFouY3JlYXRlKGErZCwwKSksdGV4dDpmLmdldFRleHQoKX07TWUudXBkYXRlKG4sW21dLDEpLERvKHIsbyxhKSxhPWErZH19cmV0dXJuIG59ZnVuY3Rpb24gRG8oZSx0LG4pe2lmKHQuY2hpbGRyZW5Qcm9wZXJ0aWVzLmxlbmd0aCE9PTApaWYodC50eXBlPT09c2UuT2JqZWN0KXtsZXQgcj0xLzA7Zm9yKGNvbnN0IHMgb2YgdC5jaGlsZHJlblByb3BlcnRpZXMpcy5iZWdpbm5pbmdMaW5lTnVtYmVyPHImJihyPXMuYmVnaW5uaW5nTGluZU51bWJlcik7Y29uc3QgaT1yLXQuYmVnaW5uaW5nTGluZU51bWJlcjtuPW4raSxlLnB1c2gobmV3ICRvKG4sdC5jaGlsZHJlblByb3BlcnRpZXMpKX1lbHNlIHQudHlwZT09PXNlLkFycmF5JiZPbyhlLHQsbil9ZnVuY3Rpb24gT28oZSx0LG4pe2Zvcihjb25zdCByIG9mIHQuY2hpbGRyZW5Qcm9wZXJ0aWVzKXtpZihyLnR5cGU9PT1zZS5PYmplY3Qpe2xldCBpPTEvMDtmb3IoY29uc3QgYSBvZiByLmNoaWxkcmVuUHJvcGVydGllcylhLmJlZ2lubmluZ0xpbmVOdW1iZXI8aSYmKGk9YS5iZWdpbm5pbmdMaW5lTnVtYmVyKTtjb25zdCBzPWktci5iZWdpbm5pbmdMaW5lTnVtYmVyO2UucHVzaChuZXcgJG8obityLmJlZ2lubmluZ0xpbmVOdW1iZXItdC5iZWdpbm5pbmdMaW5lTnVtYmVyK3Msci5jaGlsZHJlblByb3BlcnRpZXMpKX1yLnR5cGU9PT1zZS5BcnJheSYmT28oZSxyLG4rci5iZWdpbm5pbmdMaW5lTnVtYmVyLXQuYmVnaW5uaW5nTGluZU51bWJlcil9fXZhciAkbz1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuYmVnaW5uaW5nTGluZU51bWJlcj1lLHRoaXMucHJvcGVydHlUcmVlQXJyYXk9dH19O2Z1bmN0aW9uIGsxKGUsdCl7Y29uc3Qgbj1bXTtyZXR1cm4gdC52aXNpdChyPT57dmFyIGk7aWYoci50eXBlPT09InByb3BlcnR5IiYmci5rZXlOb2RlLnZhbHVlPT09IiRyZWYiJiYoKGk9ci52YWx1ZU5vZGUpPT1udWxsP3ZvaWQgMDppLnR5cGUpPT09InN0cmluZyIpe2NvbnN0IHM9ci52YWx1ZU5vZGUudmFsdWUsYT1FMSh0LHMpO2lmKGEpe2NvbnN0IGw9ZS5wb3NpdGlvbkF0KGEub2Zmc2V0KTtuLnB1c2goe3RhcmdldDpgJHtlLnVyaX0jJHtsLmxpbmUrMX0sJHtsLmNoYXJhY3RlcisxfWAscmFuZ2U6UjEoZSxyLnZhbHVlTm9kZSl9KX19cmV0dXJuITB9KSxQcm9taXNlLnJlc29sdmUobil9ZnVuY3Rpb24gUjEoZSx0KXtyZXR1cm4gcS5jcmVhdGUoZS5wb3NpdGlvbkF0KHQub2Zmc2V0KzEpLGUucG9zaXRpb25BdCh0Lm9mZnNldCt0Lmxlbmd0aC0xKSl9ZnVuY3Rpb24gRTEoZSx0KXtjb25zdCBuPU0xKHQpO3JldHVybiBuP3RpKG4sZS5yb290KTpudWxsfWZ1bmN0aW9uIHRpKGUsdCl7aWYoIXQpcmV0dXJuIG51bGw7aWYoZS5sZW5ndGg9PT0wKXJldHVybiB0O2NvbnN0IG49ZS5zaGlmdCgpO2lmKHQmJnQudHlwZT09PSJvYmplY3QiKXtjb25zdCByPXQucHJvcGVydGllcy5maW5kKGk9Pmkua2V5Tm9kZS52YWx1ZT09PW4pO3JldHVybiByP3RpKGUsci52YWx1ZU5vZGUpOm51bGx9ZWxzZSBpZih0JiZ0LnR5cGU9PT0iYXJyYXkiJiZuLm1hdGNoKC9eKDB8WzEtOV1bMC05XSopJC8pKXtjb25zdCByPU51bWJlci5wYXJzZUludChuKSxpPXQuaXRlbXNbcl07cmV0dXJuIGk/dGkoZSxpKTpudWxsfXJldHVybiBudWxsfWZ1bmN0aW9uIE0xKGUpe3JldHVybiBlPT09IiMiP1tdOmVbMF0hPT0iIyJ8fGVbMV0hPT0iLyI/bnVsbDplLnN1YnN0cmluZygyKS5zcGxpdCgvXC8vKS5tYXAoQzEpfWZ1bmN0aW9uIEMxKGUpe3JldHVybiBlLnJlcGxhY2UoL34xL2csIi8iKS5yZXBsYWNlKC9+MC9nLCJ+Iil9ZnVuY3Rpb24gVDEoZSl7Y29uc3QgdD1lLnByb21pc2VDb25zdHJ1Y3Rvcnx8UHJvbWlzZSxuPW5ldyB2MShlLnNjaGVtYVJlcXVlc3RTZXJ2aWNlLGUud29ya3NwYWNlQ29udGV4dCx0KTtuLnNldFNjaGVtYUNvbnRyaWJ1dGlvbnMoS3IpO2NvbnN0IHI9bmV3IG4xKG4sZS5jb250cmlidXRpb25zLHQsZS5jbGllbnRDYXBhYmlsaXRpZXMpLGk9bmV3IHIxKG4sZS5jb250cmlidXRpb25zLHQpLHM9bmV3IGYxKG4pLGE9bmV3IHMxKG4sdCk7cmV0dXJue2NvbmZpZ3VyZTpsPT57dmFyIG87bi5jbGVhckV4dGVybmFsU2NoZW1hcygpLChvPWwuc2NoZW1hcyk9PW51bGx8fG8uZm9yRWFjaChuLnJlZ2lzdGVyRXh0ZXJuYWxTY2hlbWEuYmluZChuKSksYS5jb25maWd1cmUobCl9LHJlc2V0U2NoZW1hOmw9Pm4ub25SZXNvdXJjZUNoYW5nZShsKSxkb1ZhbGlkYXRpb246YS5kb1ZhbGlkYXRpb24uYmluZChhKSxnZXRMYW5ndWFnZVN0YXR1czphLmdldExhbmd1YWdlU3RhdHVzLmJpbmQoYSkscGFyc2VKU09ORG9jdW1lbnQ6bD0+dDEobCx7Y29sbGVjdENvbW1lbnRzOiEwfSksbmV3SlNPTkRvY3VtZW50OihsLG8pPT5lMShsLG8pLGdldE1hdGNoaW5nU2NoZW1hczpuLmdldE1hdGNoaW5nU2NoZW1hcy5iaW5kKG4pLGRvUmVzb2x2ZTpyLmRvUmVzb2x2ZS5iaW5kKHIpLGRvQ29tcGxldGU6ci5kb0NvbXBsZXRlLmJpbmQociksZmluZERvY3VtZW50U3ltYm9sczpzLmZpbmREb2N1bWVudFN5bWJvbHMuYmluZChzKSxmaW5kRG9jdW1lbnRTeW1ib2xzMjpzLmZpbmREb2N1bWVudFN5bWJvbHMyLmJpbmQocyksZmluZERvY3VtZW50Q29sb3JzOnMuZmluZERvY3VtZW50Q29sb3JzLmJpbmQocyksZ2V0Q29sb3JQcmVzZW50YXRpb25zOnMuZ2V0Q29sb3JQcmVzZW50YXRpb25zLmJpbmQocyksZG9Ib3ZlcjppLmRvSG92ZXIuYmluZChpKSxnZXRGb2xkaW5nUmFuZ2VzOnkxLGdldFNlbGVjdGlvblJhbmdlczp3MSxmaW5kRGVmaW5pdGlvbjooKT0+UHJvbWlzZS5yZXNvbHZlKFtdKSxmaW5kTGlua3M6azEsZm9ybWF0OihsLG8sdSk9PmVpKGwsdSxvKSxzb3J0OihsLG8pPT5OMShsLG8pfX12YXIgVW87dHlwZW9mIGZldGNoPCJ1IiYmKFVvPWZ1bmN0aW9uKGUpe3JldHVybiBmZXRjaChlKS50aGVuKHQ9PnQudGV4dCgpKX0pO3ZhciBQMT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuX2N0eD1lLHRoaXMuX2xhbmd1YWdlU2V0dGluZ3M9dC5sYW5ndWFnZVNldHRpbmdzLHRoaXMuX2xhbmd1YWdlSWQ9dC5sYW5ndWFnZUlkLHRoaXMuX2xhbmd1YWdlU2VydmljZT1UMSh7d29ya3NwYWNlQ29udGV4dDp7cmVzb2x2ZVJlbGF0aXZlUGF0aDoobixyKT0+e2NvbnN0IGk9ci5zdWJzdHIoMCxyLmxhc3RJbmRleE9mKCIvIikrMSk7cmV0dXJuIFYxKGksbil9fSxzY2hlbWFSZXF1ZXN0U2VydmljZTp0LmVuYWJsZVNjaGVtYVJlcXVlc3Q/VW86dm9pZCAwLGNsaWVudENhcGFiaWxpdGllczpKci5MQVRFU1R9KSx0aGlzLl9sYW5ndWFnZVNlcnZpY2UuY29uZmlndXJlKHRoaXMuX2xhbmd1YWdlU2V0dGluZ3MpfWFzeW5jIGRvVmFsaWRhdGlvbihlKXtsZXQgdD10aGlzLl9nZXRUZXh0RG9jdW1lbnQoZSk7aWYodCl7bGV0IG49dGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLnBhcnNlSlNPTkRvY3VtZW50KHQpO3JldHVybiB0aGlzLl9sYW5ndWFnZVNlcnZpY2UuZG9WYWxpZGF0aW9uKHQsbix0aGlzLl9sYW5ndWFnZVNldHRpbmdzKX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKX1hc3luYyBkb0NvbXBsZXRlKGUsdCl7bGV0IG49dGhpcy5fZ2V0VGV4dERvY3VtZW50KGUpO2lmKCFuKXJldHVybiBudWxsO2xldCByPXRoaXMuX2xhbmd1YWdlU2VydmljZS5wYXJzZUpTT05Eb2N1bWVudChuKTtyZXR1cm4gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmRvQ29tcGxldGUobix0LHIpfWFzeW5jIGRvUmVzb2x2ZShlKXtyZXR1cm4gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmRvUmVzb2x2ZShlKX1hc3luYyBkb0hvdmVyKGUsdCl7bGV0IG49dGhpcy5fZ2V0VGV4dERvY3VtZW50KGUpO2lmKCFuKXJldHVybiBudWxsO2xldCByPXRoaXMuX2xhbmd1YWdlU2VydmljZS5wYXJzZUpTT05Eb2N1bWVudChuKTtyZXR1cm4gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmRvSG92ZXIobix0LHIpfWFzeW5jIGZvcm1hdChlLHQsbil7bGV0IHI9dGhpcy5fZ2V0VGV4dERvY3VtZW50KGUpO2lmKCFyKXJldHVybltdO2xldCBpPXRoaXMuX2xhbmd1YWdlU2VydmljZS5mb3JtYXQocix0LG4pO3JldHVybiBQcm9taXNlLnJlc29sdmUoaSl9YXN5bmMgcmVzZXRTY2hlbWEoZSl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9sYW5ndWFnZVNlcnZpY2UucmVzZXRTY2hlbWEoZSkpfWFzeW5jIGZpbmREb2N1bWVudFN5bWJvbHMoZSl7bGV0IHQ9dGhpcy5fZ2V0VGV4dERvY3VtZW50KGUpO2lmKCF0KXJldHVybltdO2xldCBuPXRoaXMuX2xhbmd1YWdlU2VydmljZS5wYXJzZUpTT05Eb2N1bWVudCh0KSxyPXRoaXMuX2xhbmd1YWdlU2VydmljZS5maW5kRG9jdW1lbnRTeW1ib2xzMih0LG4pO3JldHVybiBQcm9taXNlLnJlc29sdmUocil9YXN5bmMgZmluZERvY3VtZW50Q29sb3JzKGUpe2xldCB0PXRoaXMuX2dldFRleHREb2N1bWVudChlKTtpZighdClyZXR1cm5bXTtsZXQgbj10aGlzLl9sYW5ndWFnZVNlcnZpY2UucGFyc2VKU09ORG9jdW1lbnQodCkscj10aGlzLl9sYW5ndWFnZVNlcnZpY2UuZmluZERvY3VtZW50Q29sb3JzKHQsbik7cmV0dXJuIFByb21pc2UucmVzb2x2ZShyKX1hc3luYyBnZXRDb2xvclByZXNlbnRhdGlvbnMoZSx0LG4pe2xldCByPXRoaXMuX2dldFRleHREb2N1bWVudChlKTtpZighcilyZXR1cm5bXTtsZXQgaT10aGlzLl9sYW5ndWFnZVNlcnZpY2UucGFyc2VKU09ORG9jdW1lbnQocikscz10aGlzLl9sYW5ndWFnZVNlcnZpY2UuZ2V0Q29sb3JQcmVzZW50YXRpb25zKHIsaSx0LG4pO3JldHVybiBQcm9taXNlLnJlc29sdmUocyl9YXN5bmMgZ2V0Rm9sZGluZ1JhbmdlcyhlLHQpe2xldCBuPXRoaXMuX2dldFRleHREb2N1bWVudChlKTtpZighbilyZXR1cm5bXTtsZXQgcj10aGlzLl9sYW5ndWFnZVNlcnZpY2UuZ2V0Rm9sZGluZ1JhbmdlcyhuLHQpO3JldHVybiBQcm9taXNlLnJlc29sdmUocil9YXN5bmMgZ2V0U2VsZWN0aW9uUmFuZ2VzKGUsdCl7bGV0IG49dGhpcy5fZ2V0VGV4dERvY3VtZW50KGUpO2lmKCFuKXJldHVybltdO2xldCByPXRoaXMuX2xhbmd1YWdlU2VydmljZS5wYXJzZUpTT05Eb2N1bWVudChuKSxpPXRoaXMuX2xhbmd1YWdlU2VydmljZS5nZXRTZWxlY3Rpb25SYW5nZXMobix0LHIpO3JldHVybiBQcm9taXNlLnJlc29sdmUoaSl9YXN5bmMgcGFyc2VKU09ORG9jdW1lbnQoZSl7bGV0IHQ9dGhpcy5fZ2V0VGV4dERvY3VtZW50KGUpO2lmKCF0KXJldHVybiBudWxsO2xldCBuPXRoaXMuX2xhbmd1YWdlU2VydmljZS5wYXJzZUpTT05Eb2N1bWVudCh0KTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG4pfWFzeW5jIGdldE1hdGNoaW5nU2NoZW1hcyhlKXtsZXQgdD10aGlzLl9nZXRUZXh0RG9jdW1lbnQoZSk7aWYoIXQpcmV0dXJuW107bGV0IG49dGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLnBhcnNlSlNPTkRvY3VtZW50KHQpO3JldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmdldE1hdGNoaW5nU2NoZW1hcyh0LG4pKX1fZ2V0VGV4dERvY3VtZW50KGUpe2xldCB0PXRoaXMuX2N0eC5nZXRNaXJyb3JNb2RlbHMoKTtmb3IobGV0IG4gb2YgdClpZihuLnVyaS50b1N0cmluZygpPT09ZSlyZXR1cm4gTWUuY3JlYXRlKGUsdGhpcy5fbGFuZ3VhZ2VJZCxuLnZlcnNpb24sbi5nZXRWYWx1ZSgpKTtyZXR1cm4gbnVsbH19LEkxPTQ3LG5pPTQ2O2Z1bmN0aW9uIEYxKGUpe3JldHVybiBlLmNoYXJDb2RlQXQoMCk9PT1JMX1mdW5jdGlvbiBWMShlLHQpe2lmKEYxKHQpKXtjb25zdCBuPVR0LnBhcnNlKGUpLHI9dC5zcGxpdCgiLyIpO3JldHVybiBuLndpdGgoe3BhdGg6Qm8ocil9KS50b1N0cmluZygpfXJldHVybiBEMShlLHQpfWZ1bmN0aW9uIEJvKGUpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IHIgb2YgZSlyLmxlbmd0aD09PTB8fHIubGVuZ3RoPT09MSYmci5jaGFyQ29kZUF0KDApPT09bml8fChyLmxlbmd0aD09PTImJnIuY2hhckNvZGVBdCgwKT09PW5pJiZyLmNoYXJDb2RlQXQoMSk9PT1uaT90LnBvcCgpOnQucHVzaChyKSk7ZS5sZW5ndGg+MSYmZVtlLmxlbmd0aC0xXS5sZW5ndGg9PT0wJiZ0LnB1c2goIiIpO2xldCBuPXQuam9pbigiLyIpO3JldHVybiBlWzBdLmxlbmd0aD09PTAmJihuPSIvIituKSxufWZ1bmN0aW9uIEQxKGUsLi4udCl7Y29uc3Qgbj1UdC5wYXJzZShlKSxyPW4ucGF0aC5zcGxpdCgiLyIpO2ZvcihsZXQgaSBvZiB0KXIucHVzaCguLi5pLnNwbGl0KCIvIikpO3JldHVybiBuLndpdGgoe3BhdGg6Qm8ocil9KS50b1N0cmluZygpfXNlbGYub25tZXNzYWdlPSgpPT57Z2EoKGUsdCk9Pm5ldyBQMShlLHQpKX19KSgpOwo=", QRe = (s) => Uint8Array.from(atob(s), (e) => e.charCodeAt(0)), VU = typeof self < "u" && self.Blob && new Blob([QRe(e6)], { type: "text/javascript;charset=utf-8" }); +function ORe(s) { let e; try { - if (e = jB && (self.URL || self.webkitURL).createObjectURL(jB), !e) throw ""; + if (e = VU && (self.URL || self.webkitURL).createObjectURL(VU), !e) throw ""; const t = new Worker(e, { name: s == null ? void 0 : s.name }); @@ -108823,7 +108898,7 @@ function UNe(s) { }), t; } catch { return new Worker( - "data:text/javascript;base64," + b8, + "data:text/javascript;base64," + e6, { name: s == null ? void 0 : s.name } @@ -108832,11 +108907,869 @@ function UNe(s) { e && (self.URL || self.webkitURL).revokeObjectURL(e); } } -const y8 = "dmFyIEIxPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgcTE9KHN0LFVlLFRlKT0+VWUgaW4gc3Q/QjEoc3QsVWUse2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOlRlfSk6c3RbVWVdPVRlO3ZhciBpdD0oc3QsVWUsVGUpPT5xMShzdCx0eXBlb2YgVWUhPSJzeW1ib2wiP1VlKyIiOlVlLFRlKTsoZnVuY3Rpb24oKXsidXNlIHN0cmljdCI7dmFyIHFvLGpvLFdvLEhvLG1lLEc7Y2xhc3Mgc3R7Y29uc3RydWN0b3IoKXt0aGlzLmxpc3RlbmVycz1bXSx0aGlzLnVuZXhwZWN0ZWRFcnJvckhhbmRsZXI9ZnVuY3Rpb24odCl7c2V0VGltZW91dCgoKT0+e3Rocm93IHQuc3RhY2s/ZHQuaXNFcnJvck5vVGVsZW1ldHJ5KHQpP25ldyBkdCh0Lm1lc3NhZ2UrYAoKYCt0LnN0YWNrKTpuZXcgRXJyb3IodC5tZXNzYWdlK2AKCmArdC5zdGFjayk6dH0sMCl9fWVtaXQodCl7dGhpcy5saXN0ZW5lcnMuZm9yRWFjaChuPT57bih0KX0pfW9uVW5leHBlY3RlZEVycm9yKHQpe3RoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcih0KSx0aGlzLmVtaXQodCl9b25VbmV4cGVjdGVkRXh0ZXJuYWxFcnJvcih0KXt0aGlzLnVuZXhwZWN0ZWRFcnJvckhhbmRsZXIodCl9fWNvbnN0IFVlPW5ldyBzdDtmdW5jdGlvbiBUZShlKXtHbyhlKXx8VWUub25VbmV4cGVjdGVkRXJyb3IoZSl9ZnVuY3Rpb24gc2koZSl7aWYoZSBpbnN0YW5jZW9mIEVycm9yKXtjb25zdHtuYW1lOnQsbWVzc2FnZTpufT1lLHI9ZS5zdGFja3RyYWNlfHxlLnN0YWNrO3JldHVybnskaXNFcnJvcjohMCxuYW1lOnQsbWVzc2FnZTpuLHN0YWNrOnIsbm9UZWxlbWV0cnk6ZHQuaXNFcnJvck5vVGVsZW1ldHJ5KGUpfX1yZXR1cm4gZX1jb25zdCBIbj0iQ2FuY2VsZWQiO2Z1bmN0aW9uIEdvKGUpe3JldHVybiBlIGluc3RhbmNlb2YgSm8/ITA6ZSBpbnN0YW5jZW9mIEVycm9yJiZlLm5hbWU9PT1IbiYmZS5tZXNzYWdlPT09SG59Y2xhc3MgSm8gZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcigpe3N1cGVyKEhuKSx0aGlzLm5hbWU9dGhpcy5tZXNzYWdlfX1jbGFzcyBkdCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMubmFtZT0iQ29kZUV4cGVjdGVkRXJyb3IifXN0YXRpYyBmcm9tRXJyb3IodCl7aWYodCBpbnN0YW5jZW9mIGR0KXJldHVybiB0O2NvbnN0IG49bmV3IGR0O3JldHVybiBuLm1lc3NhZ2U9dC5tZXNzYWdlLG4uc3RhY2s9dC5zdGFjayxufXN0YXRpYyBpc0Vycm9yTm9UZWxlbWV0cnkodCl7cmV0dXJuIHQubmFtZT09PSJDb2RlRXhwZWN0ZWRFcnJvciJ9fWNsYXNzIGJlIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCl7c3VwZXIodHx8IkFuIHVuZXhwZWN0ZWQgYnVnIG9jY3VycmVkLiIpLE9iamVjdC5zZXRQcm90b3R5cGVPZih0aGlzLGJlLnByb3RvdHlwZSl9fWZ1bmN0aW9uIFhvKGUsdCl7Y29uc3Qgbj10aGlzO2xldCByPSExLGk7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIHJ8fChyPSEwLGk9ZS5hcHBseShuLGFyZ3VtZW50cykpLGl9fXZhciBhbjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdCh5KXtyZXR1cm4geSYmdHlwZW9mIHk9PSJvYmplY3QiJiZ0eXBlb2YgeVtTeW1ib2wuaXRlcmF0b3JdPT0iZnVuY3Rpb24ifWUuaXM9dDtjb25zdCBuPU9iamVjdC5mcmVlemUoW10pO2Z1bmN0aW9uIHIoKXtyZXR1cm4gbn1lLmVtcHR5PXI7ZnVuY3Rpb24qaSh5KXt5aWVsZCB5fWUuc2luZ2xlPWk7ZnVuY3Rpb24gcyh5KXtyZXR1cm4gdCh5KT95OmkoeSl9ZS53cmFwPXM7ZnVuY3Rpb24gYSh5KXtyZXR1cm4geXx8bn1lLmZyb209YTtmdW5jdGlvbipsKHkpe2ZvcihsZXQgYj15Lmxlbmd0aC0xO2I+PTA7Yi0tKXlpZWxkIHlbYl19ZS5yZXZlcnNlPWw7ZnVuY3Rpb24gbyh5KXtyZXR1cm4heXx8eVtTeW1ib2wuaXRlcmF0b3JdKCkubmV4dCgpLmRvbmU9PT0hMH1lLmlzRW1wdHk9bztmdW5jdGlvbiB1KHkpe3JldHVybiB5W1N5bWJvbC5pdGVyYXRvcl0oKS5uZXh0KCkudmFsdWV9ZS5maXJzdD11O2Z1bmN0aW9uIGgoeSxiKXtsZXQgXz0wO2Zvcihjb25zdCBBIG9mIHkpaWYoYihBLF8rKykpcmV0dXJuITA7cmV0dXJuITF9ZS5zb21lPWg7ZnVuY3Rpb24gZih5LGIpe2Zvcihjb25zdCBfIG9mIHkpaWYoYihfKSlyZXR1cm4gX31lLmZpbmQ9ZjtmdW5jdGlvbipkKHksYil7Zm9yKGNvbnN0IF8gb2YgeSliKF8pJiYoeWllbGQgXyl9ZS5maWx0ZXI9ZDtmdW5jdGlvbiptKHksYil7bGV0IF89MDtmb3IoY29uc3QgQSBvZiB5KXlpZWxkIGIoQSxfKyspfWUubWFwPW07ZnVuY3Rpb24qZyh5LGIpe2xldCBfPTA7Zm9yKGNvbnN0IEEgb2YgeSl5aWVsZCpiKEEsXysrKX1lLmZsYXRNYXA9ZztmdW5jdGlvbipwKC4uLnkpe2Zvcihjb25zdCBiIG9mIHkpeWllbGQqYn1lLmNvbmNhdD1wO2Z1bmN0aW9uIHgoeSxiLF8pe2xldCBBPV87Zm9yKGNvbnN0IEMgb2YgeSlBPWIoQSxDKTtyZXR1cm4gQX1lLnJlZHVjZT14O2Z1bmN0aW9uKncoeSxiLF89eS5sZW5ndGgpe2ZvcihiPDAmJihiKz15Lmxlbmd0aCksXzwwP18rPXkubGVuZ3RoOl8+eS5sZW5ndGgmJihfPXkubGVuZ3RoKTtiPF87YisrKXlpZWxkIHlbYl19ZS5zbGljZT13O2Z1bmN0aW9uIEwoeSxiPU51bWJlci5QT1NJVElWRV9JTkZJTklUWSl7Y29uc3QgXz1bXTtpZihiPT09MClyZXR1cm5bXyx5XTtjb25zdCBBPXlbU3ltYm9sLml0ZXJhdG9yXSgpO2ZvcihsZXQgQz0wO0M8YjtDKyspe2NvbnN0IEY9QS5uZXh0KCk7aWYoRi5kb25lKXJldHVybltfLGUuZW1wdHkoKV07Xy5wdXNoKEYudmFsdWUpfXJldHVybltfLHtbU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBBfX1dfWUuY29uc3VtZT1MO2FzeW5jIGZ1bmN0aW9uIHYoeSl7Y29uc3QgYj1bXTtmb3IgYXdhaXQoY29uc3QgXyBvZiB5KWIucHVzaChfKTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKGIpfWUuYXN5bmNUb0FycmF5PXZ9KShhbnx8KGFuPXt9KSk7ZnVuY3Rpb24gajEoZSl7cmV0dXJuIGV9ZnVuY3Rpb24gVzEoZSx0KXt9ZnVuY3Rpb24gYWkoZSl7aWYoYW4uaXMoZSkpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IG4gb2YgZSlpZihuKXRyeXtuLmRpc3Bvc2UoKX1jYXRjaChyKXt0LnB1c2gocil9aWYodC5sZW5ndGg9PT0xKXRocm93IHRbMF07aWYodC5sZW5ndGg+MSl0aHJvdyBuZXcgQWdncmVnYXRlRXJyb3IodCwiRW5jb3VudGVyZWQgZXJyb3JzIHdoaWxlIGRpc3Bvc2luZyBvZiBzdG9yZSIpO3JldHVybiBBcnJheS5pc0FycmF5KGUpP1tdOmV9ZWxzZSBpZihlKXJldHVybiBlLmRpc3Bvc2UoKSxlfWZ1bmN0aW9uIFFvKC4uLmUpe3JldHVybiBvbigoKT0+YWkoZSkpfWZ1bmN0aW9uIG9uKGUpe3JldHVybntkaXNwb3NlOlhvKCgpPT57ZSgpfSl9fWNvbnN0IFZuPWNsYXNzIFZue2NvbnN0cnVjdG9yKCl7dGhpcy5fdG9EaXNwb3NlPW5ldyBTZXQsdGhpcy5faXNEaXNwb3NlZD0hMX1kaXNwb3NlKCl7dGhpcy5faXNEaXNwb3NlZHx8KHRoaXMuX2lzRGlzcG9zZWQ9ITAsdGhpcy5jbGVhcigpKX1nZXQgaXNEaXNwb3NlZCgpe3JldHVybiB0aGlzLl9pc0Rpc3Bvc2VkfWNsZWFyKCl7aWYodGhpcy5fdG9EaXNwb3NlLnNpemUhPT0wKXRyeXthaSh0aGlzLl90b0Rpc3Bvc2UpfWZpbmFsbHl7dGhpcy5fdG9EaXNwb3NlLmNsZWFyKCl9fWFkZCh0KXtpZighdClyZXR1cm4gdDtpZih0PT09dGhpcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWdpc3RlciBhIGRpc3Bvc2FibGUgb24gaXRzZWxmISIpO3JldHVybiB0aGlzLl9pc0Rpc3Bvc2VkP1ZuLkRJU0FCTEVfRElTUE9TRURfV0FSTklOR3x8Y29uc29sZS53YXJuKG5ldyBFcnJvcigiVHJ5aW5nIHRvIGFkZCBhIGRpc3Bvc2FibGUgdG8gYSBEaXNwb3NhYmxlU3RvcmUgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGRpc3Bvc2VkIG9mLiBUaGUgYWRkZWQgb2JqZWN0IHdpbGwgYmUgbGVha2VkISIpLnN0YWNrKTp0aGlzLl90b0Rpc3Bvc2UuYWRkKHQpLHR9ZGVsZXRlQW5kTGVhayh0KXt0JiZ0aGlzLl90b0Rpc3Bvc2UuaGFzKHQpJiZ0aGlzLl90b0Rpc3Bvc2UuZGVsZXRlKHQpfX07Vm4uRElTQUJMRV9ESVNQT1NFRF9XQVJOSU5HPSExO2xldCAkdD1Wbjtjb25zdCByaT1jbGFzcyByaXtjb25zdHJ1Y3Rvcigpe3RoaXMuX3N0b3JlPW5ldyAkdCx0aGlzLl9zdG9yZX1kaXNwb3NlKCl7dGhpcy5fc3RvcmUuZGlzcG9zZSgpfV9yZWdpc3Rlcih0KXtpZih0PT09dGhpcyl0aHJvdyBuZXcgRXJyb3IoIkNhbm5vdCByZWdpc3RlciBhIGRpc3Bvc2FibGUgb24gaXRzZWxmISIpO3JldHVybiB0aGlzLl9zdG9yZS5hZGQodCl9fTtyaS5Ob25lPU9iamVjdC5mcmVlemUoe2Rpc3Bvc2UoKXt9fSk7bGV0IG10PXJpO2NvbnN0IFB0PWNsYXNzIFB0e2NvbnN0cnVjdG9yKHQpe3RoaXMuZWxlbWVudD10LHRoaXMubmV4dD1QdC5VbmRlZmluZWQsdGhpcy5wcmV2PVB0LlVuZGVmaW5lZH19O1B0LlVuZGVmaW5lZD1uZXcgUHQodm9pZCAwKTtsZXQgUT1QdDtjbGFzcyBZb3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2ZpcnN0PVEuVW5kZWZpbmVkLHRoaXMuX2xhc3Q9US5VbmRlZmluZWQsdGhpcy5fc2l6ZT0wfWdldCBzaXplKCl7cmV0dXJuIHRoaXMuX3NpemV9aXNFbXB0eSgpe3JldHVybiB0aGlzLl9maXJzdD09PVEuVW5kZWZpbmVkfWNsZWFyKCl7bGV0IHQ9dGhpcy5fZmlyc3Q7Zm9yKDt0IT09US5VbmRlZmluZWQ7KXtjb25zdCBuPXQubmV4dDt0LnByZXY9US5VbmRlZmluZWQsdC5uZXh0PVEuVW5kZWZpbmVkLHQ9bn10aGlzLl9maXJzdD1RLlVuZGVmaW5lZCx0aGlzLl9sYXN0PVEuVW5kZWZpbmVkLHRoaXMuX3NpemU9MH11bnNoaWZ0KHQpe3JldHVybiB0aGlzLl9pbnNlcnQodCwhMSl9cHVzaCh0KXtyZXR1cm4gdGhpcy5faW5zZXJ0KHQsITApfV9pbnNlcnQodCxuKXtjb25zdCByPW5ldyBRKHQpO2lmKHRoaXMuX2ZpcnN0PT09US5VbmRlZmluZWQpdGhpcy5fZmlyc3Q9cix0aGlzLl9sYXN0PXI7ZWxzZSBpZihuKXtjb25zdCBzPXRoaXMuX2xhc3Q7dGhpcy5fbGFzdD1yLHIucHJldj1zLHMubmV4dD1yfWVsc2V7Y29uc3Qgcz10aGlzLl9maXJzdDt0aGlzLl9maXJzdD1yLHIubmV4dD1zLHMucHJldj1yfXRoaXMuX3NpemUrPTE7bGV0IGk9ITE7cmV0dXJuKCk9PntpfHwoaT0hMCx0aGlzLl9yZW1vdmUocikpfX1zaGlmdCgpe2lmKHRoaXMuX2ZpcnN0IT09US5VbmRlZmluZWQpe2NvbnN0IHQ9dGhpcy5fZmlyc3QuZWxlbWVudDtyZXR1cm4gdGhpcy5fcmVtb3ZlKHRoaXMuX2ZpcnN0KSx0fX1wb3AoKXtpZih0aGlzLl9sYXN0IT09US5VbmRlZmluZWQpe2NvbnN0IHQ9dGhpcy5fbGFzdC5lbGVtZW50O3JldHVybiB0aGlzLl9yZW1vdmUodGhpcy5fbGFzdCksdH19X3JlbW92ZSh0KXtpZih0LnByZXYhPT1RLlVuZGVmaW5lZCYmdC5uZXh0IT09US5VbmRlZmluZWQpe2NvbnN0IG49dC5wcmV2O24ubmV4dD10Lm5leHQsdC5uZXh0LnByZXY9bn1lbHNlIHQucHJldj09PVEuVW5kZWZpbmVkJiZ0Lm5leHQ9PT1RLlVuZGVmaW5lZD8odGhpcy5fZmlyc3Q9US5VbmRlZmluZWQsdGhpcy5fbGFzdD1RLlVuZGVmaW5lZCk6dC5uZXh0PT09US5VbmRlZmluZWQ/KHRoaXMuX2xhc3Q9dGhpcy5fbGFzdC5wcmV2LHRoaXMuX2xhc3QubmV4dD1RLlVuZGVmaW5lZCk6dC5wcmV2PT09US5VbmRlZmluZWQmJih0aGlzLl9maXJzdD10aGlzLl9maXJzdC5uZXh0LHRoaXMuX2ZpcnN0LnByZXY9US5VbmRlZmluZWQpO3RoaXMuX3NpemUtPTF9KltTeW1ib2wuaXRlcmF0b3JdKCl7bGV0IHQ9dGhpcy5fZmlyc3Q7Zm9yKDt0IT09US5VbmRlZmluZWQ7KXlpZWxkIHQuZWxlbWVudCx0PXQubmV4dH19Y29uc3QgWm89Z2xvYmFsVGhpcy5wZXJmb3JtYW5jZSYmdHlwZW9mIGdsb2JhbFRoaXMucGVyZm9ybWFuY2Uubm93PT0iZnVuY3Rpb24iO2NsYXNzIGxue3N0YXRpYyBjcmVhdGUodCl7cmV0dXJuIG5ldyBsbih0KX1jb25zdHJ1Y3Rvcih0KXt0aGlzLl9ub3c9Wm8mJnQ9PT0hMT9EYXRlLm5vdzpnbG9iYWxUaGlzLnBlcmZvcm1hbmNlLm5vdy5iaW5kKGdsb2JhbFRoaXMucGVyZm9ybWFuY2UpLHRoaXMuX3N0YXJ0VGltZT10aGlzLl9ub3coKSx0aGlzLl9zdG9wVGltZT0tMX1zdG9wKCl7dGhpcy5fc3RvcFRpbWU9dGhpcy5fbm93KCl9cmVzZXQoKXt0aGlzLl9zdGFydFRpbWU9dGhpcy5fbm93KCksdGhpcy5fc3RvcFRpbWU9LTF9ZWxhcHNlZCgpe3JldHVybiB0aGlzLl9zdG9wVGltZSE9PS0xP3RoaXMuX3N0b3BUaW1lLXRoaXMuX3N0YXJ0VGltZTp0aGlzLl9ub3coKS10aGlzLl9zdGFydFRpbWV9fXZhciB1bjsoZnVuY3Rpb24oZSl7ZS5Ob25lPSgpPT5tdC5Ob25lO2Z1bmN0aW9uIHQoayxSKXtyZXR1cm4gZChrLCgpPT57fSwwLHZvaWQgMCwhMCx2b2lkIDAsUil9ZS5kZWZlcj10O2Z1bmN0aW9uIG4oayl7cmV0dXJuKFIsST1udWxsLFQpPT57bGV0IFA9ITEsRDtyZXR1cm4gRD1rKCQ9PntpZighUClyZXR1cm4gRD9ELmRpc3Bvc2UoKTpQPSEwLFIuY2FsbChJLCQpfSxudWxsLFQpLFAmJkQuZGlzcG9zZSgpLER9fWUub25jZT1uO2Z1bmN0aW9uIHIoayxSKXtyZXR1cm4gZS5vbmNlKGUuZmlsdGVyKGssUikpfWUub25jZUlmPXI7ZnVuY3Rpb24gaShrLFIsSSl7cmV0dXJuIGgoKFQsUD1udWxsLEQpPT5rKCQ9PlQuY2FsbChQLFIoJCkpLG51bGwsRCksSSl9ZS5tYXA9aTtmdW5jdGlvbiBzKGssUixJKXtyZXR1cm4gaCgoVCxQPW51bGwsRCk9PmsoJD0+e1IoJCksVC5jYWxsKFAsJCl9LG51bGwsRCksSSl9ZS5mb3JFYWNoPXM7ZnVuY3Rpb24gYShrLFIsSSl7cmV0dXJuIGgoKFQsUD1udWxsLEQpPT5rKCQ9PlIoJCkmJlQuY2FsbChQLCQpLG51bGwsRCksSSl9ZS5maWx0ZXI9YTtmdW5jdGlvbiBsKGspe3JldHVybiBrfWUuc2lnbmFsPWw7ZnVuY3Rpb24gbyguLi5rKXtyZXR1cm4oUixJPW51bGwsVCk9Pntjb25zdCBQPVFvKC4uLmsubWFwKEQ9PkQoJD0+Ui5jYWxsKEksJCkpKSk7cmV0dXJuIGYoUCxUKX19ZS5hbnk9bztmdW5jdGlvbiB1KGssUixJLFQpe2xldCBQPUk7cmV0dXJuIGkoayxEPT4oUD1SKFAsRCksUCksVCl9ZS5yZWR1Y2U9dTtmdW5jdGlvbiBoKGssUil7bGV0IEk7Y29uc3QgVD17b25XaWxsQWRkRmlyc3RMaXN0ZW5lcigpe0k9ayhQLmZpcmUsUCl9LG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyKCl7ST09bnVsbHx8SS5kaXNwb3NlKCl9fSxQPW5ldyBfZShUKTtyZXR1cm4gUj09bnVsbHx8Ui5hZGQoUCksUC5ldmVudH1mdW5jdGlvbiBmKGssUil7cmV0dXJuIFIgaW5zdGFuY2VvZiBBcnJheT9SLnB1c2goayk6UiYmUi5hZGQoayksa31mdW5jdGlvbiBkKGssUixJPTEwMCxUPSExLFA9ITEsRCwkKXtsZXQgaixuZSxPdCxxbj0wLGZ0O2NvbnN0IE8xPXtsZWFrV2FybmluZ1RocmVzaG9sZDpELG9uV2lsbEFkZEZpcnN0TGlzdGVuZXIoKXtqPWsoJDE9PntxbisrLG5lPVIobmUsJDEpLFQmJiFPdCYmKGpuLmZpcmUobmUpLG5lPXZvaWQgMCksZnQ9KCk9Pntjb25zdCBVMT1uZTtuZT12b2lkIDAsT3Q9dm9pZCAwLCghVHx8cW4+MSkmJmpuLmZpcmUoVTEpLHFuPTB9LHR5cGVvZiBJPT0ibnVtYmVyIj8oY2xlYXJUaW1lb3V0KE90KSxPdD1zZXRUaW1lb3V0KGZ0LEkpKTpPdD09PXZvaWQgMCYmKE90PTAscXVldWVNaWNyb3Rhc2soZnQpKX0pfSxvbldpbGxSZW1vdmVMaXN0ZW5lcigpe1AmJnFuPjAmJihmdD09bnVsbHx8ZnQoKSl9LG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyKCl7ZnQ9dm9pZCAwLGouZGlzcG9zZSgpfX0sam49bmV3IF9lKE8xKTtyZXR1cm4gJD09bnVsbHx8JC5hZGQoam4pLGpuLmV2ZW50fWUuZGVib3VuY2U9ZDtmdW5jdGlvbiBtKGssUj0wLEkpe3JldHVybiBlLmRlYm91bmNlKGssKFQsUCk9PlQ/KFQucHVzaChQKSxUKTpbUF0sUix2b2lkIDAsITAsdm9pZCAwLEkpfWUuYWNjdW11bGF0ZT1tO2Z1bmN0aW9uIGcoayxSPShULFApPT5UPT09UCxJKXtsZXQgVD0hMCxQO3JldHVybiBhKGssRD0+e2NvbnN0ICQ9VHx8IVIoRCxQKTtyZXR1cm4gVD0hMSxQPUQsJH0sSSl9ZS5sYXRjaD1nO2Z1bmN0aW9uIHAoayxSLEkpe3JldHVybltlLmZpbHRlcihrLFIsSSksZS5maWx0ZXIoayxUPT4hUihUKSxJKV19ZS5zcGxpdD1wO2Z1bmN0aW9uIHgoayxSPSExLEk9W10sVCl7bGV0IFA9SS5zbGljZSgpLEQ9ayhuZT0+e1A/UC5wdXNoKG5lKTpqLmZpcmUobmUpfSk7VCYmVC5hZGQoRCk7Y29uc3QgJD0oKT0+e1A9PW51bGx8fFAuZm9yRWFjaChuZT0+ai5maXJlKG5lKSksUD1udWxsfSxqPW5ldyBfZSh7b25XaWxsQWRkRmlyc3RMaXN0ZW5lcigpe0R8fChEPWsobmU9PmouZmlyZShuZSkpLFQmJlQuYWRkKEQpKX0sb25EaWRBZGRGaXJzdExpc3RlbmVyKCl7UCYmKFI/c2V0VGltZW91dCgkKTokKCkpfSxvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcigpe0QmJkQuZGlzcG9zZSgpLEQ9bnVsbH19KTtyZXR1cm4gVCYmVC5hZGQoaiksai5ldmVudH1lLmJ1ZmZlcj14O2Z1bmN0aW9uIHcoayxSKXtyZXR1cm4oVCxQLEQpPT57Y29uc3QgJD1SKG5ldyB2KTtyZXR1cm4gayhmdW5jdGlvbihqKXtjb25zdCBuZT0kLmV2YWx1YXRlKGopO25lIT09TCYmVC5jYWxsKFAsbmUpfSx2b2lkIDAsRCl9fWUuY2hhaW49dztjb25zdCBMPVN5bWJvbCgiSGFsdENoYWluYWJsZSIpO2NsYXNzIHZ7Y29uc3RydWN0b3IoKXt0aGlzLnN0ZXBzPVtdfW1hcChSKXtyZXR1cm4gdGhpcy5zdGVwcy5wdXNoKFIpLHRoaXN9Zm9yRWFjaChSKXtyZXR1cm4gdGhpcy5zdGVwcy5wdXNoKEk9PihSKEkpLEkpKSx0aGlzfWZpbHRlcihSKXtyZXR1cm4gdGhpcy5zdGVwcy5wdXNoKEk9PlIoSSk/STpMKSx0aGlzfXJlZHVjZShSLEkpe2xldCBUPUk7cmV0dXJuIHRoaXMuc3RlcHMucHVzaChQPT4oVD1SKFQsUCksVCkpLHRoaXN9bGF0Y2goUj0oSSxUKT0+ST09PVQpe2xldCBJPSEwLFQ7cmV0dXJuIHRoaXMuc3RlcHMucHVzaChQPT57Y29uc3QgRD1JfHwhUihQLFQpO3JldHVybiBJPSExLFQ9UCxEP1A6TH0pLHRoaXN9ZXZhbHVhdGUoUil7Zm9yKGNvbnN0IEkgb2YgdGhpcy5zdGVwcylpZihSPUkoUiksUj09PUwpYnJlYWs7cmV0dXJuIFJ9fWZ1bmN0aW9uIHkoayxSLEk9VD0+VCl7Y29uc3QgVD0oLi4uaik9PiQuZmlyZShJKC4uLmopKSxQPSgpPT5rLm9uKFIsVCksRD0oKT0+ay5yZW1vdmVMaXN0ZW5lcihSLFQpLCQ9bmV3IF9lKHtvbldpbGxBZGRGaXJzdExpc3RlbmVyOlAsb25EaWRSZW1vdmVMYXN0TGlzdGVuZXI6RH0pO3JldHVybiAkLmV2ZW50fWUuZnJvbU5vZGVFdmVudEVtaXR0ZXI9eTtmdW5jdGlvbiBiKGssUixJPVQ9PlQpe2NvbnN0IFQ9KC4uLmopPT4kLmZpcmUoSSguLi5qKSksUD0oKT0+ay5hZGRFdmVudExpc3RlbmVyKFIsVCksRD0oKT0+ay5yZW1vdmVFdmVudExpc3RlbmVyKFIsVCksJD1uZXcgX2Uoe29uV2lsbEFkZEZpcnN0TGlzdGVuZXI6UCxvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcjpEfSk7cmV0dXJuICQuZXZlbnR9ZS5mcm9tRE9NRXZlbnRFbWl0dGVyPWI7ZnVuY3Rpb24gXyhrKXtyZXR1cm4gbmV3IFByb21pc2UoUj0+bihrKShSKSl9ZS50b1Byb21pc2U9XztmdW5jdGlvbiBBKGspe2NvbnN0IFI9bmV3IF9lO3JldHVybiBrLnRoZW4oST0+e1IuZmlyZShJKX0sKCk9PntSLmZpcmUodm9pZCAwKX0pLmZpbmFsbHkoKCk9PntSLmRpc3Bvc2UoKX0pLFIuZXZlbnR9ZS5mcm9tUHJvbWlzZT1BO2Z1bmN0aW9uIEMoayxSKXtyZXR1cm4gayhJPT5SLmZpcmUoSSkpfWUuZm9yd2FyZD1DO2Z1bmN0aW9uIEYoayxSLEkpe3JldHVybiBSKEkpLGsoVD0+UihUKSl9ZS5ydW5BbmRTdWJzY3JpYmU9RjtjbGFzcyBPe2NvbnN0cnVjdG9yKFIsSSl7dGhpcy5fb2JzZXJ2YWJsZT1SLHRoaXMuX2NvdW50ZXI9MCx0aGlzLl9oYXNDaGFuZ2VkPSExO2NvbnN0IFQ9e29uV2lsbEFkZEZpcnN0TGlzdGVuZXI6KCk9PntSLmFkZE9ic2VydmVyKHRoaXMpLHRoaXMuX29ic2VydmFibGUucmVwb3J0Q2hhbmdlcygpfSxvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcjooKT0+e1IucmVtb3ZlT2JzZXJ2ZXIodGhpcyl9fTt0aGlzLmVtaXR0ZXI9bmV3IF9lKFQpLEkmJkkuYWRkKHRoaXMuZW1pdHRlcil9YmVnaW5VcGRhdGUoUil7dGhpcy5fY291bnRlcisrfWhhbmRsZVBvc3NpYmxlQ2hhbmdlKFIpe31oYW5kbGVDaGFuZ2UoUixJKXt0aGlzLl9oYXNDaGFuZ2VkPSEwfWVuZFVwZGF0ZShSKXt0aGlzLl9jb3VudGVyLS0sdGhpcy5fY291bnRlcj09PTAmJih0aGlzLl9vYnNlcnZhYmxlLnJlcG9ydENoYW5nZXMoKSx0aGlzLl9oYXNDaGFuZ2VkJiYodGhpcy5faGFzQ2hhbmdlZD0hMSx0aGlzLmVtaXR0ZXIuZmlyZSh0aGlzLl9vYnNlcnZhYmxlLmdldCgpKSkpfX1mdW5jdGlvbiBNKGssUil7cmV0dXJuIG5ldyBPKGssUikuZW1pdHRlci5ldmVudH1lLmZyb21PYnNlcnZhYmxlPU07ZnVuY3Rpb24gTihrKXtyZXR1cm4oUixJLFQpPT57bGV0IFA9MCxEPSExO2NvbnN0ICQ9e2JlZ2luVXBkYXRlKCl7UCsrfSxlbmRVcGRhdGUoKXtQLS0sUD09PTAmJihrLnJlcG9ydENoYW5nZXMoKSxEJiYoRD0hMSxSLmNhbGwoSSkpKX0saGFuZGxlUG9zc2libGVDaGFuZ2UoKXt9LGhhbmRsZUNoYW5nZSgpe0Q9ITB9fTtrLmFkZE9ic2VydmVyKCQpLGsucmVwb3J0Q2hhbmdlcygpO2NvbnN0IGo9e2Rpc3Bvc2UoKXtrLnJlbW92ZU9ic2VydmVyKCQpfX07cmV0dXJuIFQgaW5zdGFuY2VvZiAkdD9ULmFkZChqKTpBcnJheS5pc0FycmF5KFQpJiZULnB1c2goaiksan19ZS5mcm9tT2JzZXJ2YWJsZUxpZ2h0PU59KSh1bnx8KHVuPXt9KSk7Y29uc3QgSXQ9Y2xhc3MgSXR7Y29uc3RydWN0b3IodCl7dGhpcy5saXN0ZW5lckNvdW50PTAsdGhpcy5pbnZvY2F0aW9uQ291bnQ9MCx0aGlzLmVsYXBzZWRPdmVyYWxsPTAsdGhpcy5kdXJhdGlvbnM9W10sdGhpcy5uYW1lPWAke3R9XyR7SXQuX2lkUG9vbCsrfWAsSXQuYWxsLmFkZCh0aGlzKX1zdGFydCh0KXt0aGlzLl9zdG9wV2F0Y2g9bmV3IGxuLHRoaXMubGlzdGVuZXJDb3VudD10fXN0b3AoKXtpZih0aGlzLl9zdG9wV2F0Y2gpe2NvbnN0IHQ9dGhpcy5fc3RvcFdhdGNoLmVsYXBzZWQoKTt0aGlzLmR1cmF0aW9ucy5wdXNoKHQpLHRoaXMuZWxhcHNlZE92ZXJhbGwrPXQsdGhpcy5pbnZvY2F0aW9uQ291bnQrPTEsdGhpcy5fc3RvcFdhdGNoPXZvaWQgMH19fTtJdC5hbGw9bmV3IFNldCxJdC5faWRQb29sPTA7bGV0IHpuPUl0LEtvPS0xO2NvbnN0IERuPWNsYXNzIERue2NvbnN0cnVjdG9yKHQsbixyPShEbi5faWRQb29sKyspLnRvU3RyaW5nKDE2KS5wYWRTdGFydCgzLCIwIikpe3RoaXMuX2Vycm9ySGFuZGxlcj10LHRoaXMudGhyZXNob2xkPW4sdGhpcy5uYW1lPXIsdGhpcy5fd2FybkNvdW50ZG93bj0wfWRpc3Bvc2UoKXt2YXIgdDsodD10aGlzLl9zdGFja3MpPT1udWxsfHx0LmNsZWFyKCl9Y2hlY2sodCxuKXtjb25zdCByPXRoaXMudGhyZXNob2xkO2lmKHI8PTB8fG48cilyZXR1cm47dGhpcy5fc3RhY2tzfHwodGhpcy5fc3RhY2tzPW5ldyBNYXApO2NvbnN0IGk9dGhpcy5fc3RhY2tzLmdldCh0LnZhbHVlKXx8MDtpZih0aGlzLl9zdGFja3Muc2V0KHQudmFsdWUsaSsxKSx0aGlzLl93YXJuQ291bnRkb3duLT0xLHRoaXMuX3dhcm5Db3VudGRvd248PTApe3RoaXMuX3dhcm5Db3VudGRvd249ciouNTtjb25zdFtzLGFdPXRoaXMuZ2V0TW9zdEZyZXF1ZW50U3RhY2soKSxsPWBbJHt0aGlzLm5hbWV9XSBwb3RlbnRpYWwgbGlzdGVuZXIgTEVBSyBkZXRlY3RlZCwgaGF2aW5nICR7bn0gbGlzdGVuZXJzIGFscmVhZHkuIE1PU1QgZnJlcXVlbnQgbGlzdGVuZXIgKCR7YX0pOmA7Y29uc29sZS53YXJuKGwpLGNvbnNvbGUud2FybihzKTtjb25zdCBvPW5ldyBlbChsLHMpO3RoaXMuX2Vycm9ySGFuZGxlcihvKX1yZXR1cm4oKT0+e2NvbnN0IHM9dGhpcy5fc3RhY2tzLmdldCh0LnZhbHVlKXx8MDt0aGlzLl9zdGFja3Muc2V0KHQudmFsdWUscy0xKX19Z2V0TW9zdEZyZXF1ZW50U3RhY2soKXtpZighdGhpcy5fc3RhY2tzKXJldHVybjtsZXQgdCxuPTA7Zm9yKGNvbnN0W3IsaV1vZiB0aGlzLl9zdGFja3MpKCF0fHxuPGkpJiYodD1bcixpXSxuPWkpO3JldHVybiB0fX07RG4uX2lkUG9vbD0xO2xldCBHbj1EbjtjbGFzcyBKbntzdGF0aWMgY3JlYXRlKCl7Y29uc3QgdD1uZXcgRXJyb3I7cmV0dXJuIG5ldyBKbih0LnN0YWNrPz8iIil9Y29uc3RydWN0b3IodCl7dGhpcy52YWx1ZT10fXByaW50KCl7Y29uc29sZS53YXJuKHRoaXMudmFsdWUuc3BsaXQoYApgKS5zbGljZSgyKS5qb2luKGAKYCkpfX1jbGFzcyBlbCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsbil7c3VwZXIodCksdGhpcy5uYW1lPSJMaXN0ZW5lckxlYWtFcnJvciIsdGhpcy5zdGFjaz1ufX1jbGFzcyB0bCBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsbil7c3VwZXIodCksdGhpcy5uYW1lPSJMaXN0ZW5lclJlZnVzYWxFcnJvciIsdGhpcy5zdGFjaz1ufX1jbGFzcyBYbntjb25zdHJ1Y3Rvcih0KXt0aGlzLnZhbHVlPXR9fWNvbnN0IG5sPTI7Y2xhc3MgX2V7Y29uc3RydWN0b3IodCl7dmFyIG4scixpLHM7dGhpcy5fc2l6ZT0wLHRoaXMuX29wdGlvbnM9dCx0aGlzLl9sZWFrYWdlTW9uPShuPXRoaXMuX29wdGlvbnMpIT1udWxsJiZuLmxlYWtXYXJuaW5nVGhyZXNob2xkP25ldyBHbigodD09bnVsbD92b2lkIDA6dC5vbkxpc3RlbmVyRXJyb3IpPz9UZSwoKHI9dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOnIubGVha1dhcm5pbmdUaHJlc2hvbGQpPz9Lbyk6dm9pZCAwLHRoaXMuX3BlcmZNb249KGk9dGhpcy5fb3B0aW9ucykhPW51bGwmJmkuX3Byb2ZOYW1lP25ldyB6bih0aGlzLl9vcHRpb25zLl9wcm9mTmFtZSk6dm9pZCAwLHRoaXMuX2RlbGl2ZXJ5UXVldWU9KHM9dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOnMuZGVsaXZlcnlRdWV1ZX1kaXNwb3NlKCl7dmFyIHQsbixyLGk7dGhpcy5fZGlzcG9zZWR8fCh0aGlzLl9kaXNwb3NlZD0hMCwoKHQ9dGhpcy5fZGVsaXZlcnlRdWV1ZSk9PW51bGw/dm9pZCAwOnQuY3VycmVudCk9PT10aGlzJiZ0aGlzLl9kZWxpdmVyeVF1ZXVlLnJlc2V0KCksdGhpcy5fbGlzdGVuZXJzJiYodGhpcy5fbGlzdGVuZXJzPXZvaWQgMCx0aGlzLl9zaXplPTApLChyPShuPXRoaXMuX29wdGlvbnMpPT1udWxsP3ZvaWQgMDpuLm9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyKT09bnVsbHx8ci5jYWxsKG4pLChpPXRoaXMuX2xlYWthZ2VNb24pPT1udWxsfHxpLmRpc3Bvc2UoKSl9Z2V0IGV2ZW50KCl7cmV0dXJuIHRoaXMuX2V2ZW50Pz8odGhpcy5fZXZlbnQ9KHQsbixyKT0+e3ZhciBsLG8sdSxoLGY7aWYodGhpcy5fbGVha2FnZU1vbiYmdGhpcy5fc2l6ZT50aGlzLl9sZWFrYWdlTW9uLnRocmVzaG9sZCoqMil7Y29uc3QgZD1gWyR7dGhpcy5fbGVha2FnZU1vbi5uYW1lfV0gUkVGVVNFUyB0byBhY2NlcHQgbmV3IGxpc3RlbmVycyBiZWNhdXNlIGl0IGV4Y2VlZGVkIGl0cyB0aHJlc2hvbGQgYnkgZmFyICgke3RoaXMuX3NpemV9IHZzICR7dGhpcy5fbGVha2FnZU1vbi50aHJlc2hvbGR9KWA7Y29uc29sZS53YXJuKGQpO2NvbnN0IG09dGhpcy5fbGVha2FnZU1vbi5nZXRNb3N0RnJlcXVlbnRTdGFjaygpPz9bIlVOS05PV04gc3RhY2siLC0xXSxnPW5ldyB0bChgJHtkfS4gSElOVDogU3RhY2sgc2hvd3MgbW9zdCBmcmVxdWVudCBsaXN0ZW5lciAoJHttWzFdfS10aW1lcylgLG1bMF0pO3JldHVybigoKGw9dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOmwub25MaXN0ZW5lckVycm9yKXx8VGUpKGcpLG10Lk5vbmV9aWYodGhpcy5fZGlzcG9zZWQpcmV0dXJuIG10Lk5vbmU7biYmKHQ9dC5iaW5kKG4pKTtjb25zdCBpPW5ldyBYbih0KTtsZXQgczt0aGlzLl9sZWFrYWdlTW9uJiZ0aGlzLl9zaXplPj1NYXRoLmNlaWwodGhpcy5fbGVha2FnZU1vbi50aHJlc2hvbGQqLjIpJiYoaS5zdGFjaz1Kbi5jcmVhdGUoKSxzPXRoaXMuX2xlYWthZ2VNb24uY2hlY2soaS5zdGFjayx0aGlzLl9zaXplKzEpKSx0aGlzLl9saXN0ZW5lcnM/dGhpcy5fbGlzdGVuZXJzIGluc3RhbmNlb2YgWG4/KHRoaXMuX2RlbGl2ZXJ5UXVldWU/Pyh0aGlzLl9kZWxpdmVyeVF1ZXVlPW5ldyBybCksdGhpcy5fbGlzdGVuZXJzPVt0aGlzLl9saXN0ZW5lcnMsaV0pOnRoaXMuX2xpc3RlbmVycy5wdXNoKGkpOigodT0obz10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6by5vbldpbGxBZGRGaXJzdExpc3RlbmVyKT09bnVsbHx8dS5jYWxsKG8sdGhpcyksdGhpcy5fbGlzdGVuZXJzPWksKGY9KGg9dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOmgub25EaWRBZGRGaXJzdExpc3RlbmVyKT09bnVsbHx8Zi5jYWxsKGgsdGhpcykpLHRoaXMuX3NpemUrKztjb25zdCBhPW9uKCgpPT57cz09bnVsbHx8cygpLHRoaXMuX3JlbW92ZUxpc3RlbmVyKGkpfSk7cmV0dXJuIHIgaW5zdGFuY2VvZiAkdD9yLmFkZChhKTpBcnJheS5pc0FycmF5KHIpJiZyLnB1c2goYSksYX0pLHRoaXMuX2V2ZW50fV9yZW1vdmVMaXN0ZW5lcih0KXt2YXIgcyxhLGwsbztpZigoYT0ocz10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6cy5vbldpbGxSZW1vdmVMaXN0ZW5lcik9PW51bGx8fGEuY2FsbChzLHRoaXMpLCF0aGlzLl9saXN0ZW5lcnMpcmV0dXJuO2lmKHRoaXMuX3NpemU9PT0xKXt0aGlzLl9saXN0ZW5lcnM9dm9pZCAwLChvPShsPXRoaXMuX29wdGlvbnMpPT1udWxsP3ZvaWQgMDpsLm9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyKT09bnVsbHx8by5jYWxsKGwsdGhpcyksdGhpcy5fc2l6ZT0wO3JldHVybn1jb25zdCBuPXRoaXMuX2xpc3RlbmVycyxyPW4uaW5kZXhPZih0KTtpZihyPT09LTEpdGhyb3cgY29uc29sZS5sb2coImRpc3Bvc2VkPyIsdGhpcy5fZGlzcG9zZWQpLGNvbnNvbGUubG9nKCJzaXplPyIsdGhpcy5fc2l6ZSksY29uc29sZS5sb2coImFycj8iLEpTT04uc3RyaW5naWZ5KHRoaXMuX2xpc3RlbmVycykpLG5ldyBFcnJvcigiQXR0ZW1wdGVkIHRvIGRpc3Bvc2UgdW5rbm93biBsaXN0ZW5lciIpO3RoaXMuX3NpemUtLSxuW3JdPXZvaWQgMDtjb25zdCBpPXRoaXMuX2RlbGl2ZXJ5UXVldWUuY3VycmVudD09PXRoaXM7aWYodGhpcy5fc2l6ZSpubDw9bi5sZW5ndGgpe2xldCB1PTA7Zm9yKGxldCBoPTA7aDxuLmxlbmd0aDtoKyspbltoXT9uW3UrK109bltoXTppJiYodGhpcy5fZGVsaXZlcnlRdWV1ZS5lbmQtLSx1PHRoaXMuX2RlbGl2ZXJ5UXVldWUuaSYmdGhpcy5fZGVsaXZlcnlRdWV1ZS5pLS0pO24ubGVuZ3RoPXV9fV9kZWxpdmVyKHQsbil7dmFyIGk7aWYoIXQpcmV0dXJuO2NvbnN0IHI9KChpPXRoaXMuX29wdGlvbnMpPT1udWxsP3ZvaWQgMDppLm9uTGlzdGVuZXJFcnJvcil8fFRlO2lmKCFyKXt0LnZhbHVlKG4pO3JldHVybn10cnl7dC52YWx1ZShuKX1jYXRjaChzKXtyKHMpfX1fZGVsaXZlclF1ZXVlKHQpe2NvbnN0IG49dC5jdXJyZW50Ll9saXN0ZW5lcnM7Zm9yKDt0Lmk8dC5lbmQ7KXRoaXMuX2RlbGl2ZXIoblt0LmkrK10sdC52YWx1ZSk7dC5yZXNldCgpfWZpcmUodCl7dmFyIG4scixpLHM7aWYoKG49dGhpcy5fZGVsaXZlcnlRdWV1ZSkhPW51bGwmJm4uY3VycmVudCYmKHRoaXMuX2RlbGl2ZXJRdWV1ZSh0aGlzLl9kZWxpdmVyeVF1ZXVlKSwocj10aGlzLl9wZXJmTW9uKT09bnVsbHx8ci5zdG9wKCkpLChpPXRoaXMuX3BlcmZNb24pPT1udWxsfHxpLnN0YXJ0KHRoaXMuX3NpemUpLHRoaXMuX2xpc3RlbmVycylpZih0aGlzLl9saXN0ZW5lcnMgaW5zdGFuY2VvZiBYbil0aGlzLl9kZWxpdmVyKHRoaXMuX2xpc3RlbmVycyx0KTtlbHNle2NvbnN0IGE9dGhpcy5fZGVsaXZlcnlRdWV1ZTthLmVucXVldWUodGhpcyx0LHRoaXMuX2xpc3RlbmVycy5sZW5ndGgpLHRoaXMuX2RlbGl2ZXJRdWV1ZShhKX0ocz10aGlzLl9wZXJmTW9uKT09bnVsbHx8cy5zdG9wKCl9aGFzTGlzdGVuZXJzKCl7cmV0dXJuIHRoaXMuX3NpemU+MH19Y2xhc3Mgcmx7Y29uc3RydWN0b3IoKXt0aGlzLmk9LTEsdGhpcy5lbmQ9MH1lbnF1ZXVlKHQsbixyKXt0aGlzLmk9MCx0aGlzLmVuZD1yLHRoaXMuY3VycmVudD10LHRoaXMudmFsdWU9bn1yZXNldCgpe3RoaXMuaT10aGlzLmVuZCx0aGlzLmN1cnJlbnQ9dm9pZCAwLHRoaXMudmFsdWU9dm9pZCAwfX1mdW5jdGlvbiBpbCgpe3JldHVybiBnbG9iYWxUaGlzLl9WU0NPREVfTkxTX01FU1NBR0VTfWZ1bmN0aW9uIG9pKCl7cmV0dXJuIGdsb2JhbFRoaXMuX1ZTQ09ERV9OTFNfTEFOR1VBR0V9Y29uc3Qgc2w9b2koKT09PSJwc2V1ZG8ifHx0eXBlb2YgZG9jdW1lbnQ8InUiJiZkb2N1bWVudC5sb2NhdGlvbiYmZG9jdW1lbnQubG9jYXRpb24uaGFzaC5pbmRleE9mKCJwc2V1ZG89dHJ1ZSIpPj0wO2Z1bmN0aW9uIGxpKGUsdCl7bGV0IG47cmV0dXJuIHQubGVuZ3RoPT09MD9uPWU6bj1lLnJlcGxhY2UoL1x7KFxkKylcfS9nLChyLGkpPT57Y29uc3Qgcz1pWzBdLGE9dFtzXTtsZXQgbD1yO3JldHVybiB0eXBlb2YgYT09InN0cmluZyI/bD1hOih0eXBlb2YgYT09Im51bWJlciJ8fHR5cGVvZiBhPT0iYm9vbGVhbiJ8fGE9PT12b2lkIDB8fGE9PT1udWxsKSYmKGw9U3RyaW5nKGEpKSxsfSksc2wmJihuPSLvvLsiK24ucmVwbGFjZSgvW2FvdWVpXS9nLCIkJiQmIikrIu+8vSIpLG59ZnVuY3Rpb24gWChlLHQsLi4ubil7cmV0dXJuIGxpKHR5cGVvZiBlPT0ibnVtYmVyIj9hbChlLHQpOnQsbil9ZnVuY3Rpb24gYWwoZSx0KXt2YXIgcjtjb25zdCBuPShyPWlsKCkpPT1udWxsP3ZvaWQgMDpyW2VdO2lmKHR5cGVvZiBuIT0ic3RyaW5nIil7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0O3Rocm93IG5ldyBFcnJvcihgISEhIE5MUyBNSVNTSU5HOiAke2V9ICEhIWApfXJldHVybiBufWNvbnN0IGd0PSJlbiI7bGV0IFFuPSExLFluPSExLFpuPSExLHVpPSExLEtuPSExLGNuLGVyPWd0LGNpPWd0LG9sLEFlO2NvbnN0IEJlPWdsb2JhbFRoaXM7bGV0IHVlO3R5cGVvZiBCZS52c2NvZGU8InUiJiZ0eXBlb2YgQmUudnNjb2RlLnByb2Nlc3M8InUiP3VlPUJlLnZzY29kZS5wcm9jZXNzOnR5cGVvZiBwcm9jZXNzPCJ1IiYmdHlwZW9mKChxbz1wcm9jZXNzPT1udWxsP3ZvaWQgMDpwcm9jZXNzLnZlcnNpb25zKT09bnVsbD92b2lkIDA6cW8ubm9kZSk9PSJzdHJpbmciJiYodWU9cHJvY2Vzcyk7Y29uc3QgbGw9dHlwZW9mKChqbz11ZT09bnVsbD92b2lkIDA6dWUudmVyc2lvbnMpPT1udWxsP3ZvaWQgMDpqby5lbGVjdHJvbik9PSJzdHJpbmciJiYodWU9PW51bGw/dm9pZCAwOnVlLnR5cGUpPT09InJlbmRlcmVyIjtpZih0eXBlb2YgdWU9PSJvYmplY3QiKXtRbj11ZS5wbGF0Zm9ybT09PSJ3aW4zMiIsWW49dWUucGxhdGZvcm09PT0iZGFyd2luIixabj11ZS5wbGF0Zm9ybT09PSJsaW51eCIsWm4mJnVlLmVudi5TTkFQJiZ1ZS5lbnYuU05BUF9SRVZJU0lPTix1ZS5lbnYuQ0l8fHVlLmVudi5CVUlMRF9BUlRJRkFDVFNUQUdJTkdESVJFQ1RPUlksY249Z3QsZXI9Z3Q7Y29uc3QgZT11ZS5lbnYuVlNDT0RFX05MU19DT05GSUc7aWYoZSl0cnl7Y29uc3QgdD1KU09OLnBhcnNlKGUpO2NuPXQudXNlckxvY2FsZSxjaT10Lm9zTG9jYWxlLGVyPXQucmVzb2x2ZWRMYW5ndWFnZXx8Z3Qsb2w9KFdvPXQubGFuZ3VhZ2VQYWNrKT09bnVsbD92b2lkIDA6V28udHJhbnNsYXRpb25zQ29uZmlnRmlsZX1jYXRjaHt9dWk9ITB9ZWxzZSB0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmIWxsPyhBZT1uYXZpZ2F0b3IudXNlckFnZW50LFFuPUFlLmluZGV4T2YoIldpbmRvd3MiKT49MCxZbj1BZS5pbmRleE9mKCJNYWNpbnRvc2giKT49MCwoQWUuaW5kZXhPZigiTWFjaW50b3NoIik+PTB8fEFlLmluZGV4T2YoImlQYWQiKT49MHx8QWUuaW5kZXhPZigiaVBob25lIik+PTApJiZuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMmJm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cz4wLFpuPUFlLmluZGV4T2YoIkxpbnV4Iik+PTAsKEFlPT1udWxsP3ZvaWQgMDpBZS5pbmRleE9mKCJNb2JpIikpPj0wLEtuPSEwLGVyPW9pKCl8fGd0LGNuPW5hdmlnYXRvci5sYW5ndWFnZS50b0xvd2VyQ2FzZSgpLGNpPWNuKTpjb25zb2xlLmVycm9yKCJVbmFibGUgdG8gcmVzb2x2ZSBwbGF0Zm9ybS4iKTtjb25zdCBVdD1Rbix1bD1ZbixjbD11aSxmbD1LbixobD1LbiYmdHlwZW9mIEJlLmltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiI/QmUub3JpZ2luOnZvaWQgMCxQZT1BZSxkbD10eXBlb2YgQmUucG9zdE1lc3NhZ2U9PSJmdW5jdGlvbiImJiFCZS5pbXBvcnRTY3JpcHRzOygoKT0+e2lmKGRsKXtjb25zdCBlPVtdO0JlLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG49PntpZihuLmRhdGEmJm4uZGF0YS52c2NvZGVTY2hlZHVsZUFzeW5jV29yaylmb3IobGV0IHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspe2NvbnN0IHM9ZVtyXTtpZihzLmlkPT09bi5kYXRhLnZzY29kZVNjaGVkdWxlQXN5bmNXb3JrKXtlLnNwbGljZShyLDEpLHMuY2FsbGJhY2soKTtyZXR1cm59fX0pO2xldCB0PTA7cmV0dXJuIG49Pntjb25zdCByPSsrdDtlLnB1c2goe2lkOnIsY2FsbGJhY2s6bn0pLEJlLnBvc3RNZXNzYWdlKHt2c2NvZGVTY2hlZHVsZUFzeW5jV29yazpyfSwiKiIpfX1yZXR1cm4gZT0+c2V0VGltZW91dChlKX0pKCk7Y29uc3QgbWw9ISEoUGUmJlBlLmluZGV4T2YoIkNocm9tZSIpPj0wKTtQZSYmUGUuaW5kZXhPZigiRmlyZWZveCIpPj0wLCFtbCYmUGUmJlBlLmluZGV4T2YoIlNhZmFyaSIpPj0wLFBlJiZQZS5pbmRleE9mKCJFZGcvIik+PTAsUGUmJlBlLmluZGV4T2YoIkFuZHJvaWQiKT49MDtmdW5jdGlvbiBnbChlKXtyZXR1cm4gZX1jbGFzcyBwbHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMubGFzdENhY2hlPXZvaWQgMCx0aGlzLmxhc3RBcmdLZXk9dm9pZCAwLHR5cGVvZiB0PT0iZnVuY3Rpb24iPyh0aGlzLl9mbj10LHRoaXMuX2NvbXB1dGVLZXk9Z2wpOih0aGlzLl9mbj1uLHRoaXMuX2NvbXB1dGVLZXk9dC5nZXRDYWNoZUtleSl9Z2V0KHQpe2NvbnN0IG49dGhpcy5fY29tcHV0ZUtleSh0KTtyZXR1cm4gdGhpcy5sYXN0QXJnS2V5IT09biYmKHRoaXMubGFzdEFyZ0tleT1uLHRoaXMubGFzdENhY2hlPXRoaXMuX2ZuKHQpKSx0aGlzLmxhc3RDYWNoZX19Y2xhc3MgZml7Y29uc3RydWN0b3IodCl7dGhpcy5leGVjdXRvcj10LHRoaXMuX2RpZFJ1bj0hMX1nZXQgdmFsdWUoKXtpZighdGhpcy5fZGlkUnVuKXRyeXt0aGlzLl92YWx1ZT10aGlzLmV4ZWN1dG9yKCl9Y2F0Y2godCl7dGhpcy5fZXJyb3I9dH1maW5hbGx5e3RoaXMuX2RpZFJ1bj0hMH1pZih0aGlzLl9lcnJvcil0aHJvdyB0aGlzLl9lcnJvcjtyZXR1cm4gdGhpcy5fdmFsdWV9Z2V0IHJhd1ZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfX1mdW5jdGlvbiBibChlKXtyZXR1cm4gZS5yZXBsYWNlKC9bXFxce1x9XCpcK1w/XHxcXlwkXC5cW1xdXChcKV0vZywiXFwkJiIpfWZ1bmN0aW9uIHZsKGUpe3JldHVybiBlLnNwbGl0KC9cclxufFxyfFxuLyl9ZnVuY3Rpb24geGwoZSl7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKXtjb25zdCByPWUuY2hhckNvZGVBdCh0KTtpZihyIT09MzImJnIhPT05KXJldHVybiB0fXJldHVybi0xfWZ1bmN0aW9uIHlsKGUsdD1lLmxlbmd0aC0xKXtmb3IobGV0IG49dDtuPj0wO24tLSl7Y29uc3Qgcj1lLmNoYXJDb2RlQXQobik7aWYociE9PTMyJiZyIT09OSlyZXR1cm4gbn1yZXR1cm4tMX1mdW5jdGlvbiBoaShlKXtyZXR1cm4gZT49NjUmJmU8PTkwfWZ1bmN0aW9uIHRyKGUpe3JldHVybiA1NTI5Njw9ZSYmZTw9NTYzMTl9ZnVuY3Rpb24gd2woZSl7cmV0dXJuIDU2MzIwPD1lJiZlPD01NzM0M31mdW5jdGlvbiBfbChlLHQpe3JldHVybihlLTU1Mjk2PDwxMCkrKHQtNTYzMjApKzY1NTM2fWZ1bmN0aW9uIExsKGUsdCxuKXtjb25zdCByPWUuY2hhckNvZGVBdChuKTtpZih0cihyKSYmbisxPHQpe2NvbnN0IGk9ZS5jaGFyQ29kZUF0KG4rMSk7aWYod2woaSkpcmV0dXJuIF9sKHIsaSl9cmV0dXJuIHJ9Y29uc3QgTmw9L15bXHRcblxyXHgyMC1ceDdFXSokLztmdW5jdGlvbiBTbChlKXtyZXR1cm4gTmwudGVzdChlKX1jb25zdCAkZT1jbGFzcyAkZXtzdGF0aWMgZ2V0SW5zdGFuY2UodCl7cmV0dXJuICRlLmNhY2hlLmdldChBcnJheS5mcm9tKHQpKX1zdGF0aWMgZ2V0TG9jYWxlcygpe3JldHVybiAkZS5fbG9jYWxlcy52YWx1ZX1jb25zdHJ1Y3Rvcih0KXt0aGlzLmNvbmZ1c2FibGVEaWN0aW9uYXJ5PXR9aXNBbWJpZ3VvdXModCl7cmV0dXJuIHRoaXMuY29uZnVzYWJsZURpY3Rpb25hcnkuaGFzKHQpfWdldFByaW1hcnlDb25mdXNhYmxlKHQpe3JldHVybiB0aGlzLmNvbmZ1c2FibGVEaWN0aW9uYXJ5LmdldCh0KX1nZXRDb25mdXNhYmxlQ29kZVBvaW50cygpe3JldHVybiBuZXcgU2V0KHRoaXMuY29uZnVzYWJsZURpY3Rpb25hcnkua2V5cygpKX19OyRlLmFtYmlndW91c0NoYXJhY3RlckRhdGE9bmV3IGZpKCgpPT5KU09OLnBhcnNlKCd7Il9jb21tb24iOls4MjMyLDMyLDgyMzMsMzIsNTc2MCwzMiw4MTkyLDMyLDgxOTMsMzIsODE5NCwzMiw4MTk1LDMyLDgxOTYsMzIsODE5NywzMiw4MTk4LDMyLDgyMDAsMzIsODIwMSwzMiw4MjAyLDMyLDgyODcsMzIsODE5OSwzMiw4MjM5LDMyLDIwNDIsOTUsNjUxMDEsOTUsNjUxMDIsOTUsNjUxMDMsOTUsODIwOCw0NSw4MjA5LDQ1LDgyMTAsNDUsNjUxMTIsNDUsMTc0OCw0NSw4MjU5LDQ1LDcyNyw0NSw4NzIyLDQ1LDEwMTM0LDQ1LDExNDUwLDQ1LDE1NDksNDQsMTY0Myw0NCw4MjE4LDQ0LDE4NCw0NCw0MjIzMyw0NCw4OTQsNTksMjMwNyw1OCwyNjkxLDU4LDE0MTcsNTgsMTc5NSw1OCwxNzk2LDU4LDU4NjgsNTgsNjUwNzIsNTgsNjE0Nyw1OCw2MTUzLDU4LDgyODIsNTgsMTQ3NSw1OCw3NjAsNTgsNDI4ODksNTgsODc1OCw1OCw3MjAsNTgsNDIyMzcsNTgsNDUxLDMzLDExNjAxLDMzLDY2MCw2Myw1NzcsNjMsMjQyOSw2Myw1MDM4LDYzLDQyNzMxLDYzLDExOTE0OSw0Niw4MjI4LDQ2LDE3OTMsNDYsMTc5NCw0Niw0MjUxMCw0Niw2ODE3Niw0NiwxNjMyLDQ2LDE3NzYsNDYsNDIyMzIsNDYsMTM3Myw5Niw2NTI4Nyw5Niw4MjE5LDk2LDgyNDIsOTYsMTM3MCw5NiwxNTIzLDk2LDgxNzUsOTYsNjUzNDQsOTYsOTAwLDk2LDgxODksOTYsODEyNSw5Niw4MTI3LDk2LDgxOTAsOTYsNjk3LDk2LDg4NCw5Niw3MTIsOTYsNzE0LDk2LDcxNSw5Niw3NTYsOTYsNjk5LDk2LDcwMSw5Niw3MDAsOTYsNzAyLDk2LDQyODkyLDk2LDE0OTcsOTYsMjAzNiw5NiwyMDM3LDk2LDUxOTQsOTYsNTgzNiw5Niw5NDAzMyw5Niw5NDAzNCw5Niw2NTMzOSw5MSwxMDA4OCw0MCwxMDA5OCw0MCwxMjMwOCw0MCw2NDgzMCw0MCw2NTM0MSw5MywxMDA4OSw0MSwxMDA5OSw0MSwxMjMwOSw0MSw2NDgzMSw0MSwxMDEwMCwxMjMsMTE5MDYwLDEyMywxMDEwMSwxMjUsNjUzNDIsOTQsODI3MCw0MiwxNjQ1LDQyLDg3MjcsNDIsNjYzMzUsNDIsNTk0MSw0Nyw4MjU3LDQ3LDg3MjUsNDcsODI2MCw0Nyw5NTg1LDQ3LDEwMTg3LDQ3LDEwNzQ0LDQ3LDExOTM1NCw0NywxMjc1NSw0NywxMjMzOSw0NywxMTQ2Miw0NywyMDAzMSw0NywxMjAzNSw0Nyw2NTM0MCw5Miw2NTEyOCw5Miw4NzI2LDkyLDEwMTg5LDkyLDEwNzQxLDkyLDEwNzQ1LDkyLDExOTMxMSw5MiwxMTkzNTUsOTIsMTI3NTYsOTIsMjAwMjIsOTIsMTIwMzQsOTIsNDI4NzIsMzgsNzA4LDk0LDcxMCw5NCw1ODY5LDQzLDEwMTMzLDQzLDY2MjAzLDQzLDgyNDksNjAsMTAwOTQsNjAsNzA2LDYwLDExOTM1MCw2MCw1MTc2LDYwLDU4MTAsNjAsNTEyMCw2MSwxMTg0MCw2MSwxMjQ0OCw2MSw0MjIzOSw2MSw4MjUwLDYyLDEwMDk1LDYyLDcwNyw2MiwxMTkzNTEsNjIsNTE3MSw2Miw5NDAxNSw2Miw4Mjc1LDEyNiw3MzIsMTI2LDgxMjgsMTI2LDg3NjQsMTI2LDY1MzcyLDEyNCw2NTI5Myw0NSwxMjA3ODQsNTAsMTIwNzk0LDUwLDEyMDgwNCw1MCwxMjA4MTQsNTAsMTIwODI0LDUwLDEzMDAzNCw1MCw0Mjg0Miw1MCw0MjMsNTAsMTAwMCw1MCw0MjU2NCw1MCw1MzExLDUwLDQyNzM1LDUwLDExOTMwMiw1MSwxMjA3ODUsNTEsMTIwNzk1LDUxLDEyMDgwNSw1MSwxMjA4MTUsNTEsMTIwODI1LDUxLDEzMDAzNSw1MSw0MjkyMyw1MSw1NDAsNTEsNDM5LDUxLDQyODU4LDUxLDExNDY4LDUxLDEyNDgsNTEsOTQwMTEsNTEsNzE4ODIsNTEsMTIwNzg2LDUyLDEyMDc5Niw1MiwxMjA4MDYsNTIsMTIwODE2LDUyLDEyMDgyNiw1MiwxMzAwMzYsNTIsNTA3MCw1Miw3MTg1NSw1MiwxMjA3ODcsNTMsMTIwNzk3LDUzLDEyMDgwNyw1MywxMjA4MTcsNTMsMTIwODI3LDUzLDEzMDAzNyw1Myw0NDQsNTMsNzE4NjcsNTMsMTIwNzg4LDU0LDEyMDc5OCw1NCwxMjA4MDgsNTQsMTIwODE4LDU0LDEyMDgyOCw1NCwxMzAwMzgsNTQsMTE0NzQsNTQsNTEwMiw1NCw3MTg5Myw1NCwxMTkzMTQsNTUsMTIwNzg5LDU1LDEyMDc5OSw1NSwxMjA4MDksNTUsMTIwODE5LDU1LDEyMDgyOSw1NSwxMzAwMzksNTUsNjY3NzAsNTUsNzE4NzgsNTUsMjgxOSw1NiwyNTM4LDU2LDI2NjYsNTYsMTI1MTMxLDU2LDEyMDc5MCw1NiwxMjA4MDAsNTYsMTIwODEwLDU2LDEyMDgyMCw1NiwxMjA4MzAsNTYsMTMwMDQwLDU2LDU0Nyw1Niw1NDYsNTYsNjYzMzAsNTYsMjY2Myw1NywyOTIwLDU3LDI1NDEsNTcsMzQzNyw1NywxMjA3OTEsNTcsMTIwODAxLDU3LDEyMDgxMSw1NywxMjA4MjEsNTcsMTIwODMxLDU3LDEzMDA0MSw1Nyw0Mjg2Miw1NywxMTQ2Niw1Nyw3MTg4NCw1Nyw3MTg1Miw1Nyw3MTg5NCw1Nyw5MDgyLDk3LDY1MzQ1LDk3LDExOTgzNCw5NywxMTk4ODYsOTcsMTE5OTM4LDk3LDExOTk5MCw5NywxMjAwNDIsOTcsMTIwMDk0LDk3LDEyMDE0Niw5NywxMjAxOTgsOTcsMTIwMjUwLDk3LDEyMDMwMiw5NywxMjAzNTQsOTcsMTIwNDA2LDk3LDEyMDQ1OCw5Nyw1OTMsOTcsOTQ1LDk3LDEyMDUxNCw5NywxMjA1NzIsOTcsMTIwNjMwLDk3LDEyMDY4OCw5NywxMjA3NDYsOTcsNjUzMTMsNjUsMTE5ODA4LDY1LDExOTg2MCw2NSwxMTk5MTIsNjUsMTE5OTY0LDY1LDEyMDAxNiw2NSwxMjAwNjgsNjUsMTIwMTIwLDY1LDEyMDE3Miw2NSwxMjAyMjQsNjUsMTIwMjc2LDY1LDEyMDMyOCw2NSwxMjAzODAsNjUsMTIwNDMyLDY1LDkxMyw2NSwxMjA0ODgsNjUsMTIwNTQ2LDY1LDEyMDYwNCw2NSwxMjA2NjIsNjUsMTIwNzIwLDY1LDUwMzQsNjUsNTU3Myw2NSw0MjIyMiw2NSw5NDAxNiw2NSw2NjIwOCw2NSwxMTk4MzUsOTgsMTE5ODg3LDk4LDExOTkzOSw5OCwxMTk5OTEsOTgsMTIwMDQzLDk4LDEyMDA5NSw5OCwxMjAxNDcsOTgsMTIwMTk5LDk4LDEyMDI1MSw5OCwxMjAzMDMsOTgsMTIwMzU1LDk4LDEyMDQwNyw5OCwxMjA0NTksOTgsMzg4LDk4LDUwNzEsOTgsNTIzNCw5OCw1NTUxLDk4LDY1MzE0LDY2LDg0OTIsNjYsMTE5ODA5LDY2LDExOTg2MSw2NiwxMTk5MTMsNjYsMTIwMDE3LDY2LDEyMDA2OSw2NiwxMjAxMjEsNjYsMTIwMTczLDY2LDEyMDIyNSw2NiwxMjAyNzcsNjYsMTIwMzI5LDY2LDEyMDM4MSw2NiwxMjA0MzMsNjYsNDI5MzIsNjYsOTE0LDY2LDEyMDQ4OSw2NiwxMjA1NDcsNjYsMTIwNjA1LDY2LDEyMDY2Myw2NiwxMjA3MjEsNjYsNTEwOCw2Niw1NjIzLDY2LDQyMTkyLDY2LDY2MTc4LDY2LDY2MjA5LDY2LDY2MzA1LDY2LDY1MzQ3LDk5LDg1NzMsOTksMTE5ODM2LDk5LDExOTg4OCw5OSwxMTk5NDAsOTksMTE5OTkyLDk5LDEyMDA0NCw5OSwxMjAwOTYsOTksMTIwMTQ4LDk5LDEyMDIwMCw5OSwxMjAyNTIsOTksMTIwMzA0LDk5LDEyMDM1Niw5OSwxMjA0MDgsOTksMTIwNDYwLDk5LDc0MjgsOTksMTAxMCw5OSwxMTQyOSw5OSw0Mzk1MSw5OSw2NjYyMSw5OSwxMjg4NDQsNjcsNzE5MjIsNjcsNzE5MTMsNjcsNjUzMTUsNjcsODU1Nyw2Nyw4NDUwLDY3LDg0OTMsNjcsMTE5ODEwLDY3LDExOTg2Miw2NywxMTk5MTQsNjcsMTE5OTY2LDY3LDEyMDAxOCw2NywxMjAxNzQsNjcsMTIwMjI2LDY3LDEyMDI3OCw2NywxMjAzMzAsNjcsMTIwMzgyLDY3LDEyMDQzNCw2NywxMDE3LDY3LDExNDI4LDY3LDUwODcsNjcsNDIyMDIsNjcsNjYyMTAsNjcsNjYzMDYsNjcsNjY1ODEsNjcsNjY4NDQsNjcsODU3NCwxMDAsODUxOCwxMDAsMTE5ODM3LDEwMCwxMTk4ODksMTAwLDExOTk0MSwxMDAsMTE5OTkzLDEwMCwxMjAwNDUsMTAwLDEyMDA5NywxMDAsMTIwMTQ5LDEwMCwxMjAyMDEsMTAwLDEyMDI1MywxMDAsMTIwMzA1LDEwMCwxMjAzNTcsMTAwLDEyMDQwOSwxMDAsMTIwNDYxLDEwMCwxMjgxLDEwMCw1MDk1LDEwMCw1MjMxLDEwMCw0MjE5NCwxMDAsODU1OCw2OCw4NTE3LDY4LDExOTgxMSw2OCwxMTk4NjMsNjgsMTE5OTE1LDY4LDExOTk2Nyw2OCwxMjAwMTksNjgsMTIwMDcxLDY4LDEyMDEyMyw2OCwxMjAxNzUsNjgsMTIwMjI3LDY4LDEyMDI3OSw2OCwxMjAzMzEsNjgsMTIwMzgzLDY4LDEyMDQzNSw2OCw1MDI0LDY4LDU1OTgsNjgsNTYxMCw2OCw0MjE5NSw2OCw4NDk0LDEwMSw2NTM0OSwxMDEsODQ5NSwxMDEsODUxOSwxMDEsMTE5ODM4LDEwMSwxMTk4OTAsMTAxLDExOTk0MiwxMDEsMTIwMDQ2LDEwMSwxMjAwOTgsMTAxLDEyMDE1MCwxMDEsMTIwMjAyLDEwMSwxMjAyNTQsMTAxLDEyMDMwNiwxMDEsMTIwMzU4LDEwMSwxMjA0MTAsMTAxLDEyMDQ2MiwxMDEsNDM4MjYsMTAxLDEyMTMsMTAxLDg5NTksNjksNjUzMTcsNjksODQ5Niw2OSwxMTk4MTIsNjksMTE5ODY0LDY5LDExOTkxNiw2OSwxMjAwMjAsNjksMTIwMDcyLDY5LDEyMDEyNCw2OSwxMjAxNzYsNjksMTIwMjI4LDY5LDEyMDI4MCw2OSwxMjAzMzIsNjksMTIwMzg0LDY5LDEyMDQzNiw2OSw5MTcsNjksMTIwNDkyLDY5LDEyMDU1MCw2OSwxMjA2MDgsNjksMTIwNjY2LDY5LDEyMDcyNCw2OSwxMTU3Nyw2OSw1MDM2LDY5LDQyMjI0LDY5LDcxODQ2LDY5LDcxODU0LDY5LDY2MTgyLDY5LDExOTgzOSwxMDIsMTE5ODkxLDEwMiwxMTk5NDMsMTAyLDExOTk5NSwxMDIsMTIwMDQ3LDEwMiwxMjAwOTksMTAyLDEyMDE1MSwxMDIsMTIwMjAzLDEwMiwxMjAyNTUsMTAyLDEyMDMwNywxMDIsMTIwMzU5LDEwMiwxMjA0MTEsMTAyLDEyMDQ2MywxMDIsNDM4MjksMTAyLDQyOTA1LDEwMiwzODMsMTAyLDc4MzcsMTAyLDE0MTIsMTAyLDExOTMxNSw3MCw4NDk3LDcwLDExOTgxMyw3MCwxMTk4NjUsNzAsMTE5OTE3LDcwLDEyMDAyMSw3MCwxMjAwNzMsNzAsMTIwMTI1LDcwLDEyMDE3Nyw3MCwxMjAyMjksNzAsMTIwMjgxLDcwLDEyMDMzMyw3MCwxMjAzODUsNzAsMTIwNDM3LDcwLDQyOTA0LDcwLDk4OCw3MCwxMjA3NzgsNzAsNTU1Niw3MCw0MjIwNSw3MCw3MTg3NCw3MCw3MTg0Miw3MCw2NjE4Myw3MCw2NjIxMyw3MCw2Njg1Myw3MCw2NTM1MSwxMDMsODQ1OCwxMDMsMTE5ODQwLDEwMywxMTk4OTIsMTAzLDExOTk0NCwxMDMsMTIwMDQ4LDEwMywxMjAxMDAsMTAzLDEyMDE1MiwxMDMsMTIwMjA0LDEwMywxMjAyNTYsMTAzLDEyMDMwOCwxMDMsMTIwMzYwLDEwMywxMjA0MTIsMTAzLDEyMDQ2NCwxMDMsNjA5LDEwMyw3NTU1LDEwMywzOTcsMTAzLDE0MDksMTAzLDExOTgxNCw3MSwxMTk4NjYsNzEsMTE5OTE4LDcxLDExOTk3MCw3MSwxMjAwMjIsNzEsMTIwMDc0LDcxLDEyMDEyNiw3MSwxMjAxNzgsNzEsMTIwMjMwLDcxLDEyMDI4Miw3MSwxMjAzMzQsNzEsMTIwMzg2LDcxLDEyMDQzOCw3MSwxMjkyLDcxLDUwNTYsNzEsNTEwNyw3MSw0MjE5OCw3MSw2NTM1MiwxMDQsODQ2MiwxMDQsMTE5ODQxLDEwNCwxMTk5NDUsMTA0LDExOTk5NywxMDQsMTIwMDQ5LDEwNCwxMjAxMDEsMTA0LDEyMDE1MywxMDQsMTIwMjA1LDEwNCwxMjAyNTcsMTA0LDEyMDMwOSwxMDQsMTIwMzYxLDEwNCwxMjA0MTMsMTA0LDEyMDQ2NSwxMDQsMTIxMSwxMDQsMTM5MiwxMDQsNTA1OCwxMDQsNjUzMjAsNzIsODQ1OSw3Miw4NDYwLDcyLDg0NjEsNzIsMTE5ODE1LDcyLDExOTg2Nyw3MiwxMTk5MTksNzIsMTIwMDIzLDcyLDEyMDE3OSw3MiwxMjAyMzEsNzIsMTIwMjgzLDcyLDEyMDMzNSw3MiwxMjAzODcsNzIsMTIwNDM5LDcyLDkxOSw3MiwxMjA0OTQsNzIsMTIwNTUyLDcyLDEyMDYxMCw3MiwxMjA2NjgsNzIsMTIwNzI2LDcyLDExNDA2LDcyLDUwNTEsNzIsNTUwMCw3Miw0MjIxNSw3Miw2NjI1NSw3Miw3MzEsMTA1LDkwNzUsMTA1LDY1MzUzLDEwNSw4NTYwLDEwNSw4NTA1LDEwNSw4NTIwLDEwNSwxMTk4NDIsMTA1LDExOTg5NCwxMDUsMTE5OTQ2LDEwNSwxMTk5OTgsMTA1LDEyMDA1MCwxMDUsMTIwMTAyLDEwNSwxMjAxNTQsMTA1LDEyMDIwNiwxMDUsMTIwMjU4LDEwNSwxMjAzMTAsMTA1LDEyMDM2MiwxMDUsMTIwNDE0LDEwNSwxMjA0NjYsMTA1LDEyMDQ4NCwxMDUsNjE4LDEwNSw2MTcsMTA1LDk1MywxMDUsODEyNiwxMDUsODkwLDEwNSwxMjA1MjIsMTA1LDEyMDU4MCwxMDUsMTIwNjM4LDEwNSwxMjA2OTYsMTA1LDEyMDc1NCwxMDUsMTExMCwxMDUsNDI1NjcsMTA1LDEyMzEsMTA1LDQzODkzLDEwNSw1MDI5LDEwNSw3MTg3NSwxMDUsNjUzNTQsMTA2LDg1MjEsMTA2LDExOTg0MywxMDYsMTE5ODk1LDEwNiwxMTk5NDcsMTA2LDExOTk5OSwxMDYsMTIwMDUxLDEwNiwxMjAxMDMsMTA2LDEyMDE1NSwxMDYsMTIwMjA3LDEwNiwxMjAyNTksMTA2LDEyMDMxMSwxMDYsMTIwMzYzLDEwNiwxMjA0MTUsMTA2LDEyMDQ2NywxMDYsMTAxMSwxMDYsMTExMiwxMDYsNjUzMjIsNzQsMTE5ODE3LDc0LDExOTg2OSw3NCwxMTk5MjEsNzQsMTE5OTczLDc0LDEyMDAyNSw3NCwxMjAwNzcsNzQsMTIwMTI5LDc0LDEyMDE4MSw3NCwxMjAyMzMsNzQsMTIwMjg1LDc0LDEyMDMzNyw3NCwxMjAzODksNzQsMTIwNDQxLDc0LDQyOTMwLDc0LDg5NSw3NCwxMDMyLDc0LDUwMzUsNzQsNTI2MSw3NCw0MjIwMSw3NCwxMTk4NDQsMTA3LDExOTg5NiwxMDcsMTE5OTQ4LDEwNywxMjAwMDAsMTA3LDEyMDA1MiwxMDcsMTIwMTA0LDEwNywxMjAxNTYsMTA3LDEyMDIwOCwxMDcsMTIwMjYwLDEwNywxMjAzMTIsMTA3LDEyMDM2NCwxMDcsMTIwNDE2LDEwNywxMjA0NjgsMTA3LDg0OTAsNzUsNjUzMjMsNzUsMTE5ODE4LDc1LDExOTg3MCw3NSwxMTk5MjIsNzUsMTE5OTc0LDc1LDEyMDAyNiw3NSwxMjAwNzgsNzUsMTIwMTMwLDc1LDEyMDE4Miw3NSwxMjAyMzQsNzUsMTIwMjg2LDc1LDEyMDMzOCw3NSwxMjAzOTAsNzUsMTIwNDQyLDc1LDkyMiw3NSwxMjA0OTcsNzUsMTIwNTU1LDc1LDEyMDYxMyw3NSwxMjA2NzEsNzUsMTIwNzI5LDc1LDExNDEyLDc1LDUwOTQsNzUsNTg0NSw3NSw0MjE5OSw3NSw2Njg0MCw3NSwxNDcyLDEwOCw4NzM5LDczLDkyMTMsNzMsNjU1MTIsNzMsMTYzMywxMDgsMTc3Nyw3Myw2NjMzNiwxMDgsMTI1MTI3LDEwOCwxMjA3ODMsNzMsMTIwNzkzLDczLDEyMDgwMyw3MywxMjA4MTMsNzMsMTIwODIzLDczLDEzMDAzMyw3Myw2NTMyMSw3Myw4NTQ0LDczLDg0NjQsNzMsODQ2NSw3MywxMTk4MTYsNzMsMTE5ODY4LDczLDExOTkyMCw3MywxMjAwMjQsNzMsMTIwMTI4LDczLDEyMDE4MCw3MywxMjAyMzIsNzMsMTIwMjg0LDczLDEyMDMzNiw3MywxMjAzODgsNzMsMTIwNDQwLDczLDY1MzU2LDEwOCw4NTcyLDczLDg0NjcsMTA4LDExOTg0NSwxMDgsMTE5ODk3LDEwOCwxMTk5NDksMTA4LDEyMDAwMSwxMDgsMTIwMDUzLDEwOCwxMjAxMDUsNzMsMTIwMTU3LDczLDEyMDIwOSw3MywxMjAyNjEsNzMsMTIwMzEzLDczLDEyMDM2NSw3MywxMjA0MTcsNzMsMTIwNDY5LDczLDQ0OCw3MywxMjA0OTYsNzMsMTIwNTU0LDczLDEyMDYxMiw3MywxMjA2NzAsNzMsMTIwNzI4LDczLDExNDEwLDczLDEwMzAsNzMsMTIxNiw3MywxNDkzLDEwOCwxNTAzLDEwOCwxNTc1LDEwOCwxMjY0NjQsMTA4LDEyNjU5MiwxMDgsNjUxNjYsMTA4LDY1MTY1LDEwOCwxOTk0LDEwOCwxMTU5OSw3Myw1ODI1LDczLDQyMjI2LDczLDkzOTkyLDczLDY2MTg2LDEyNCw2NjMxMywxMjQsMTE5MzM4LDc2LDg1NTYsNzYsODQ2Niw3NiwxMTk4MTksNzYsMTE5ODcxLDc2LDExOTkyMyw3NiwxMjAwMjcsNzYsMTIwMDc5LDc2LDEyMDEzMSw3NiwxMjAxODMsNzYsMTIwMjM1LDc2LDEyMDI4Nyw3NiwxMjAzMzksNzYsMTIwMzkxLDc2LDEyMDQ0Myw3NiwxMTQ3Miw3Niw1MDg2LDc2LDUyOTAsNzYsNDIyMDksNzYsOTM5NzQsNzYsNzE4NDMsNzYsNzE4NTgsNzYsNjY1ODcsNzYsNjY4NTQsNzYsNjUzMjUsNzcsODU1OSw3Nyw4NDk5LDc3LDExOTgyMCw3NywxMTk4NzIsNzcsMTE5OTI0LDc3LDEyMDAyOCw3NywxMjAwODAsNzcsMTIwMTMyLDc3LDEyMDE4NCw3NywxMjAyMzYsNzcsMTIwMjg4LDc3LDEyMDM0MCw3NywxMjAzOTIsNzcsMTIwNDQ0LDc3LDkyNCw3NywxMjA0OTksNzcsMTIwNTU3LDc3LDEyMDYxNSw3NywxMjA2NzMsNzcsMTIwNzMxLDc3LDEwMTgsNzcsMTE0MTYsNzcsNTA0Nyw3Nyw1NjE2LDc3LDU4NDYsNzcsNDIyMDcsNzcsNjYyMjQsNzcsNjYzMjEsNzcsMTE5ODQ3LDExMCwxMTk4OTksMTEwLDExOTk1MSwxMTAsMTIwMDAzLDExMCwxMjAwNTUsMTEwLDEyMDEwNywxMTAsMTIwMTU5LDExMCwxMjAyMTEsMTEwLDEyMDI2MywxMTAsMTIwMzE1LDExMCwxMjAzNjcsMTEwLDEyMDQxOSwxMTAsMTIwNDcxLDExMCwxNDAwLDExMCwxNDA0LDExMCw2NTMyNiw3OCw4NDY5LDc4LDExOTgyMSw3OCwxMTk4NzMsNzgsMTE5OTI1LDc4LDExOTk3Nyw3OCwxMjAwMjksNzgsMTIwMDgxLDc4LDEyMDE4NSw3OCwxMjAyMzcsNzgsMTIwMjg5LDc4LDEyMDM0MSw3OCwxMjAzOTMsNzgsMTIwNDQ1LDc4LDkyNSw3OCwxMjA1MDAsNzgsMTIwNTU4LDc4LDEyMDYxNiw3OCwxMjA2NzQsNzgsMTIwNzMyLDc4LDExNDE4LDc4LDQyMjA4LDc4LDY2ODM1LDc4LDMwNzQsMTExLDMyMDIsMTExLDMzMzAsMTExLDM0NTgsMTExLDI0MDYsMTExLDI2NjIsMTExLDI3OTAsMTExLDMwNDYsMTExLDMxNzQsMTExLDMzMDIsMTExLDM0MzAsMTExLDM2NjQsMTExLDM3OTIsMTExLDQxNjAsMTExLDE2MzcsMTExLDE3ODEsMTExLDY1MzU5LDExMSw4NTAwLDExMSwxMTk4NDgsMTExLDExOTkwMCwxMTEsMTE5OTUyLDExMSwxMjAwNTYsMTExLDEyMDEwOCwxMTEsMTIwMTYwLDExMSwxMjAyMTIsMTExLDEyMDI2NCwxMTEsMTIwMzE2LDExMSwxMjAzNjgsMTExLDEyMDQyMCwxMTEsMTIwNDcyLDExMSw3NDM5LDExMSw3NDQxLDExMSw0MzgzNywxMTEsOTU5LDExMSwxMjA1MjgsMTExLDEyMDU4NiwxMTEsMTIwNjQ0LDExMSwxMjA3MDIsMTExLDEyMDc2MCwxMTEsOTYzLDExMSwxMjA1MzIsMTExLDEyMDU5MCwxMTEsMTIwNjQ4LDExMSwxMjA3MDYsMTExLDEyMDc2NCwxMTEsMTE0MjMsMTExLDQzNTEsMTExLDE0MTMsMTExLDE1MDUsMTExLDE2MDcsMTExLDEyNjUwMCwxMTEsMTI2NTY0LDExMSwxMjY1OTYsMTExLDY1MjU5LDExMSw2NTI2MCwxMTEsNjUyNTgsMTExLDY1MjU3LDExMSwxNzI2LDExMSw2NDQyOCwxMTEsNjQ0MjksMTExLDY0NDI3LDExMSw2NDQyNiwxMTEsMTcyOSwxMTEsNjQ0MjQsMTExLDY0NDI1LDExMSw2NDQyMywxMTEsNjQ0MjIsMTExLDE3NDksMTExLDMzNjAsMTExLDQxMjUsMTExLDY2Nzk0LDExMSw3MTg4MCwxMTEsNzE4OTUsMTExLDY2NjA0LDExMSwxOTg0LDc5LDI1MzQsNzksMjkxOCw3OSwxMjI5NSw3OSw3MDg2NCw3OSw3MTkwNCw3OSwxMjA3ODIsNzksMTIwNzkyLDc5LDEyMDgwMiw3OSwxMjA4MTIsNzksMTIwODIyLDc5LDEzMDAzMiw3OSw2NTMyNyw3OSwxMTk4MjIsNzksMTE5ODc0LDc5LDExOTkyNiw3OSwxMTk5NzgsNzksMTIwMDMwLDc5LDEyMDA4Miw3OSwxMjAxMzQsNzksMTIwMTg2LDc5LDEyMDIzOCw3OSwxMjAyOTAsNzksMTIwMzQyLDc5LDEyMDM5NCw3OSwxMjA0NDYsNzksOTI3LDc5LDEyMDUwMiw3OSwxMjA1NjAsNzksMTIwNjE4LDc5LDEyMDY3Niw3OSwxMjA3MzQsNzksMTE0MjIsNzksMTM2NSw3OSwxMTYwNCw3OSw0ODE2LDc5LDI4NDgsNzksNjY3NTQsNzksNDIyMjcsNzksNzE4NjEsNzksNjYxOTQsNzksNjYyMTksNzksNjY1NjQsNzksNjY4MzgsNzksOTA3NiwxMTIsNjUzNjAsMTEyLDExOTg0OSwxMTIsMTE5OTAxLDExMiwxMTk5NTMsMTEyLDEyMDAwNSwxMTIsMTIwMDU3LDExMiwxMjAxMDksMTEyLDEyMDE2MSwxMTIsMTIwMjEzLDExMiwxMjAyNjUsMTEyLDEyMDMxNywxMTIsMTIwMzY5LDExMiwxMjA0MjEsMTEyLDEyMDQ3MywxMTIsOTYxLDExMiwxMjA1MzAsMTEyLDEyMDU0NCwxMTIsMTIwNTg4LDExMiwxMjA2MDIsMTEyLDEyMDY0NiwxMTIsMTIwNjYwLDExMiwxMjA3MDQsMTEyLDEyMDcxOCwxMTIsMTIwNzYyLDExMiwxMjA3NzYsMTEyLDExNDI3LDExMiw2NTMyOCw4MCw4NDczLDgwLDExOTgyMyw4MCwxMTk4NzUsODAsMTE5OTI3LDgwLDExOTk3OSw4MCwxMjAwMzEsODAsMTIwMDgzLDgwLDEyMDE4Nyw4MCwxMjAyMzksODAsMTIwMjkxLDgwLDEyMDM0Myw4MCwxMjAzOTUsODAsMTIwNDQ3LDgwLDkyOSw4MCwxMjA1MDQsODAsMTIwNTYyLDgwLDEyMDYyMCw4MCwxMjA2NzgsODAsMTIwNzM2LDgwLDExNDI2LDgwLDUwOTAsODAsNTIyOSw4MCw0MjE5Myw4MCw2NjE5Nyw4MCwxMTk4NTAsMTEzLDExOTkwMiwxMTMsMTE5OTU0LDExMywxMjAwMDYsMTEzLDEyMDA1OCwxMTMsMTIwMTEwLDExMywxMjAxNjIsMTEzLDEyMDIxNCwxMTMsMTIwMjY2LDExMywxMjAzMTgsMTEzLDEyMDM3MCwxMTMsMTIwNDIyLDExMywxMjA0NzQsMTEzLDEzMDcsMTEzLDEzNzksMTEzLDEzODIsMTEzLDg0NzQsODEsMTE5ODI0LDgxLDExOTg3Niw4MSwxMTk5MjgsODEsMTE5OTgwLDgxLDEyMDAzMiw4MSwxMjAwODQsODEsMTIwMTg4LDgxLDEyMDI0MCw4MSwxMjAyOTIsODEsMTIwMzQ0LDgxLDEyMDM5Niw4MSwxMjA0NDgsODEsMTE2MDUsODEsMTE5ODUxLDExNCwxMTk5MDMsMTE0LDExOTk1NSwxMTQsMTIwMDA3LDExNCwxMjAwNTksMTE0LDEyMDExMSwxMTQsMTIwMTYzLDExNCwxMjAyMTUsMTE0LDEyMDI2NywxMTQsMTIwMzE5LDExNCwxMjAzNzEsMTE0LDEyMDQyMywxMTQsMTIwNDc1LDExNCw0Mzg0NywxMTQsNDM4NDgsMTE0LDc0NjIsMTE0LDExMzk3LDExNCw0MzkwNSwxMTQsMTE5MzE4LDgyLDg0NzUsODIsODQ3Niw4Miw4NDc3LDgyLDExOTgyNSw4MiwxMTk4NzcsODIsMTE5OTI5LDgyLDEyMDAzMyw4MiwxMjAxODksODIsMTIwMjQxLDgyLDEyMDI5Myw4MiwxMjAzNDUsODIsMTIwMzk3LDgyLDEyMDQ0OSw4Miw0MjIsODIsNTAyNSw4Miw1MDc0LDgyLDY2NzQwLDgyLDU1MTEsODIsNDIyMTEsODIsOTQwMDUsODIsNjUzNjMsMTE1LDExOTg1MiwxMTUsMTE5OTA0LDExNSwxMTk5NTYsMTE1LDEyMDAwOCwxMTUsMTIwMDYwLDExNSwxMjAxMTIsMTE1LDEyMDE2NCwxMTUsMTIwMjE2LDExNSwxMjAyNjgsMTE1LDEyMDMyMCwxMTUsMTIwMzcyLDExNSwxMjA0MjQsMTE1LDEyMDQ3NiwxMTUsNDI4MDEsMTE1LDQ0NSwxMTUsMTEwOSwxMTUsNDM5NDYsMTE1LDcxODczLDExNSw2NjYzMiwxMTUsNjUzMzEsODMsMTE5ODI2LDgzLDExOTg3OCw4MywxMTk5MzAsODMsMTE5OTgyLDgzLDEyMDAzNCw4MywxMjAwODYsODMsMTIwMTM4LDgzLDEyMDE5MCw4MywxMjAyNDIsODMsMTIwMjk0LDgzLDEyMDM0Niw4MywxMjAzOTgsODMsMTIwNDUwLDgzLDEwMjksODMsMTM1OSw4Myw1MDc3LDgzLDUwODIsODMsNDIyMTAsODMsOTQwMTAsODMsNjYxOTgsODMsNjY1OTIsODMsMTE5ODUzLDExNiwxMTk5MDUsMTE2LDExOTk1NywxMTYsMTIwMDA5LDExNiwxMjAwNjEsMTE2LDEyMDExMywxMTYsMTIwMTY1LDExNiwxMjAyMTcsMTE2LDEyMDI2OSwxMTYsMTIwMzIxLDExNiwxMjAzNzMsMTE2LDEyMDQyNSwxMTYsMTIwNDc3LDExNiw4ODY4LDg0LDEwMjAxLDg0LDEyODg3Miw4NCw2NTMzMiw4NCwxMTk4MjcsODQsMTE5ODc5LDg0LDExOTkzMSw4NCwxMTk5ODMsODQsMTIwMDM1LDg0LDEyMDA4Nyw4NCwxMjAxMzksODQsMTIwMTkxLDg0LDEyMDI0Myw4NCwxMjAyOTUsODQsMTIwMzQ3LDg0LDEyMDM5OSw4NCwxMjA0NTEsODQsOTMyLDg0LDEyMDUwNyw4NCwxMjA1NjUsODQsMTIwNjIzLDg0LDEyMDY4MSw4NCwxMjA3MzksODQsMTE0MzAsODQsNTAyNiw4NCw0MjE5Niw4NCw5Mzk2Miw4NCw3MTg2OCw4NCw2NjE5OSw4NCw2NjIyNSw4NCw2NjMyNSw4NCwxMTk4NTQsMTE3LDExOTkwNiwxMTcsMTE5OTU4LDExNywxMjAwMTAsMTE3LDEyMDA2MiwxMTcsMTIwMTE0LDExNywxMjAxNjYsMTE3LDEyMDIxOCwxMTcsMTIwMjcwLDExNywxMjAzMjIsMTE3LDEyMDM3NCwxMTcsMTIwNDI2LDExNywxMjA0NzgsMTE3LDQyOTExLDExNyw3NDUyLDExNyw0Mzg1NCwxMTcsNDM4NTgsMTE3LDY1MSwxMTcsOTY1LDExNywxMjA1MzQsMTE3LDEyMDU5MiwxMTcsMTIwNjUwLDExNywxMjA3MDgsMTE3LDEyMDc2NiwxMTcsMTQwNSwxMTcsNjY4MDYsMTE3LDcxODk2LDExNyw4NzQ2LDg1LDg4OTksODUsMTE5ODI4LDg1LDExOTg4MCw4NSwxMTk5MzIsODUsMTE5OTg0LDg1LDEyMDAzNiw4NSwxMjAwODgsODUsMTIwMTQwLDg1LDEyMDE5Miw4NSwxMjAyNDQsODUsMTIwMjk2LDg1LDEyMDM0OCw4NSwxMjA0MDAsODUsMTIwNDUyLDg1LDEzNTcsODUsNDYwOCw4NSw2Njc2Niw4NSw1MTk2LDg1LDQyMjI4LDg1LDk0MDE4LDg1LDcxODY0LDg1LDg3NDQsMTE4LDg4OTcsMTE4LDY1MzY2LDExOCw4NTY0LDExOCwxMTk4NTUsMTE4LDExOTkwNywxMTgsMTE5OTU5LDExOCwxMjAwMTEsMTE4LDEyMDA2MywxMTgsMTIwMTE1LDExOCwxMjAxNjcsMTE4LDEyMDIxOSwxMTgsMTIwMjcxLDExOCwxMjAzMjMsMTE4LDEyMDM3NSwxMTgsMTIwNDI3LDExOCwxMjA0NzksMTE4LDc0NTYsMTE4LDk1NywxMTgsMTIwNTI2LDExOCwxMjA1ODQsMTE4LDEyMDY0MiwxMTgsMTIwNzAwLDExOCwxMjA3NTgsMTE4LDExNDEsMTE4LDE0OTYsMTE4LDcxNDMwLDExOCw0Mzk0NSwxMTgsNzE4NzIsMTE4LDExOTMwOSw4NiwxNjM5LDg2LDE3ODMsODYsODU0OCw4NiwxMTk4MjksODYsMTE5ODgxLDg2LDExOTkzMyw4NiwxMTk5ODUsODYsMTIwMDM3LDg2LDEyMDA4OSw4NiwxMjAxNDEsODYsMTIwMTkzLDg2LDEyMDI0NSw4NiwxMjAyOTcsODYsMTIwMzQ5LDg2LDEyMDQwMSw4NiwxMjA0NTMsODYsMTE0MCw4NiwxMTU3Niw4Niw1MDgxLDg2LDUxNjcsODYsNDI3MTksODYsNDIyMTQsODYsOTM5NjAsODYsNzE4NDAsODYsNjY4NDUsODYsNjIzLDExOSwxMTk4NTYsMTE5LDExOTkwOCwxMTksMTE5OTYwLDExOSwxMjAwMTIsMTE5LDEyMDA2NCwxMTksMTIwMTE2LDExOSwxMjAxNjgsMTE5LDEyMDIyMCwxMTksMTIwMjcyLDExOSwxMjAzMjQsMTE5LDEyMDM3NiwxMTksMTIwNDI4LDExOSwxMjA0ODAsMTE5LDc0NTcsMTE5LDExMjEsMTE5LDEzMDksMTE5LDEzNzcsMTE5LDcxNDM0LDExOSw3MTQzOCwxMTksNzE0MzksMTE5LDQzOTA3LDExOSw3MTkxOSw4Nyw3MTkxMCw4NywxMTk4MzAsODcsMTE5ODgyLDg3LDExOTkzNCw4NywxMTk5ODYsODcsMTIwMDM4LDg3LDEyMDA5MCw4NywxMjAxNDIsODcsMTIwMTk0LDg3LDEyMDI0Niw4NywxMjAyOTgsODcsMTIwMzUwLDg3LDEyMDQwMiw4NywxMjA0NTQsODcsMTMwOCw4Nyw1MDQzLDg3LDUwNzYsODcsNDIyMTgsODcsNTc0MiwxMjAsMTA1MzksMTIwLDEwNTQwLDEyMCwxMDc5OSwxMjAsNjUzNjgsMTIwLDg1NjksMTIwLDExOTg1NywxMjAsMTE5OTA5LDEyMCwxMTk5NjEsMTIwLDEyMDAxMywxMjAsMTIwMDY1LDEyMCwxMjAxMTcsMTIwLDEyMDE2OSwxMjAsMTIwMjIxLDEyMCwxMjAyNzMsMTIwLDEyMDMyNSwxMjAsMTIwMzc3LDEyMCwxMjA0MjksMTIwLDEyMDQ4MSwxMjAsNTQ0MSwxMjAsNTUwMSwxMjAsNTc0MSw4OCw5NTg3LDg4LDY2MzM4LDg4LDcxOTE2LDg4LDY1MzM2LDg4LDg1NTMsODgsMTE5ODMxLDg4LDExOTg4Myw4OCwxMTk5MzUsODgsMTE5OTg3LDg4LDEyMDAzOSw4OCwxMjAwOTEsODgsMTIwMTQzLDg4LDEyMDE5NSw4OCwxMjAyNDcsODgsMTIwMjk5LDg4LDEyMDM1MSw4OCwxMjA0MDMsODgsMTIwNDU1LDg4LDQyOTMxLDg4LDkzNSw4OCwxMjA1MTAsODgsMTIwNTY4LDg4LDEyMDYyNiw4OCwxMjA2ODQsODgsMTIwNzQyLDg4LDExNDM2LDg4LDExNjEzLDg4LDU4MTUsODgsNDIyMTksODgsNjYxOTIsODgsNjYyMjgsODgsNjYzMjcsODgsNjY4NTUsODgsNjExLDEyMSw3NTY0LDEyMSw2NTM2OSwxMjEsMTE5ODU4LDEyMSwxMTk5MTAsMTIxLDExOTk2MiwxMjEsMTIwMDE0LDEyMSwxMjAwNjYsMTIxLDEyMDExOCwxMjEsMTIwMTcwLDEyMSwxMjAyMjIsMTIxLDEyMDI3NCwxMjEsMTIwMzI2LDEyMSwxMjAzNzgsMTIxLDEyMDQzMCwxMjEsMTIwNDgyLDEyMSw2NTUsMTIxLDc5MzUsMTIxLDQzODY2LDEyMSw5NDcsMTIxLDg1MDksMTIxLDEyMDUxNiwxMjEsMTIwNTc0LDEyMSwxMjA2MzIsMTIxLDEyMDY5MCwxMjEsMTIwNzQ4LDEyMSwxMTk5LDEyMSw0MzI3LDEyMSw3MTkwMCwxMjEsNjUzMzcsODksMTE5ODMyLDg5LDExOTg4NCw4OSwxMTk5MzYsODksMTE5OTg4LDg5LDEyMDA0MCw4OSwxMjAwOTIsODksMTIwMTQ0LDg5LDEyMDE5Niw4OSwxMjAyNDgsODksMTIwMzAwLDg5LDEyMDM1Miw4OSwxMjA0MDQsODksMTIwNDU2LDg5LDkzMyw4OSw5NzgsODksMTIwNTA4LDg5LDEyMDU2Niw4OSwxMjA2MjQsODksMTIwNjgyLDg5LDEyMDc0MCw4OSwxMTQzMiw4OSwxMTk4LDg5LDUwMzMsODksNTA1Myw4OSw0MjIyMCw4OSw5NDAxOSw4OSw3MTg0NCw4OSw2NjIyNiw4OSwxMTk4NTksMTIyLDExOTkxMSwxMjIsMTE5OTYzLDEyMiwxMjAwMTUsMTIyLDEyMDA2NywxMjIsMTIwMTE5LDEyMiwxMjAxNzEsMTIyLDEyMDIyMywxMjIsMTIwMjc1LDEyMiwxMjAzMjcsMTIyLDEyMDM3OSwxMjIsMTIwNDMxLDEyMiwxMjA0ODMsMTIyLDc0NTgsMTIyLDQzOTIzLDEyMiw3MTg3NiwxMjIsNjYyOTMsOTAsNzE5MDksOTAsNjUzMzgsOTAsODQ4NCw5MCw4NDg4LDkwLDExOTgzMyw5MCwxMTk4ODUsOTAsMTE5OTM3LDkwLDExOTk4OSw5MCwxMjAwNDEsOTAsMTIwMTk3LDkwLDEyMDI0OSw5MCwxMjAzMDEsOTAsMTIwMzUzLDkwLDEyMDQwNSw5MCwxMjA0NTcsOTAsOTE4LDkwLDEyMDQ5Myw5MCwxMjA1NTEsOTAsMTIwNjA5LDkwLDEyMDY2Nyw5MCwxMjA3MjUsOTAsNTA1OSw5MCw0MjIwNCw5MCw3MTg0OSw5MCw2NTI4MiwzNCw2NTI4NCwzNiw2NTI4NSwzNyw2NTI4NiwzOCw2NTI5MCw0Miw2NTI5MSw0Myw2NTI5NCw0Niw2NTI5NSw0Nyw2NTI5Niw0OCw2NTI5Nyw0OSw2NTI5OCw1MCw2NTI5OSw1MSw2NTMwMCw1Miw2NTMwMSw1Myw2NTMwMiw1NCw2NTMwMyw1NSw2NTMwNCw1Niw2NTMwNSw1Nyw2NTMwOCw2MCw2NTMwOSw2MSw2NTMxMCw2Miw2NTMxMiw2NCw2NTMxNiw2OCw2NTMxOCw3MCw2NTMxOSw3MSw2NTMyNCw3Niw2NTMyOSw4MSw2NTMzMCw4Miw2NTMzMyw4NSw2NTMzNCw4Niw2NTMzNSw4Nyw2NTM0Myw5NSw2NTM0Niw5OCw2NTM0OCwxMDAsNjUzNTAsMTAyLDY1MzU1LDEwNyw2NTM1NywxMDksNjUzNTgsMTEwLDY1MzYxLDExMyw2NTM2MiwxMTQsNjUzNjQsMTE2LDY1MzY1LDExNyw2NTM2NywxMTksNjUzNzAsMTIyLDY1MzcxLDEyMyw2NTM3MywxMjUsMTE5ODQ2LDEwOV0sIl9kZWZhdWx0IjpbMTYwLDMyLDgyMTEsNDUsNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sImNzIjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLCJkZSI6WzY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwiZXMiOls4MjExLDQ1LDY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwiZnIiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjQ1LDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwiaXQiOlsxNjAsMzIsODIxMSw0NSw2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sImphIjpbODIxMSw0NSw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyOTIsNDQsNjUzMDcsNTldLCJrbyI6WzgyMTEsNDUsNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwicGwiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwicHQtQlIiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwicXBzLXBsb2MiOlsxNjAsMzIsODIxMSw0NSw2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwicnUiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDMwNSwxMDUsOTIxLDczLDEwMDksMTEyLDIxNSwxMjAsNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLCJ0ciI6WzE2MCwzMiw4MjExLDQ1LDY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLCJ6aC1oYW5zIjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1Mjg4LDQwLDY1Mjg5LDQxXSwiemgtaGFudCI6WzgyMTEsNDUsNjUzNzQsMTI2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTMwNyw1OV19JykpLCRlLmNhY2hlPW5ldyBwbCh7Z2V0Q2FjaGVLZXk6SlNPTi5zdHJpbmdpZnl9LHQ9PntmdW5jdGlvbiBuKGgpe2NvbnN0IGY9bmV3IE1hcDtmb3IobGV0IGQ9MDtkPGgubGVuZ3RoO2QrPTIpZi5zZXQoaFtkXSxoW2QrMV0pO3JldHVybiBmfWZ1bmN0aW9uIHIoaCxmKXtjb25zdCBkPW5ldyBNYXAoaCk7Zm9yKGNvbnN0W20sZ11vZiBmKWQuc2V0KG0sZyk7cmV0dXJuIGR9ZnVuY3Rpb24gaShoLGYpe2lmKCFoKXJldHVybiBmO2NvbnN0IGQ9bmV3IE1hcDtmb3IoY29uc3RbbSxnXW9mIGgpZi5oYXMobSkmJmQuc2V0KG0sZyk7cmV0dXJuIGR9Y29uc3Qgcz0kZS5hbWJpZ3VvdXNDaGFyYWN0ZXJEYXRhLnZhbHVlO2xldCBhPXQuZmlsdGVyKGg9PiFoLnN0YXJ0c1dpdGgoIl8iKSYmaCBpbiBzKTthLmxlbmd0aD09PTAmJihhPVsiX2RlZmF1bHQiXSk7bGV0IGw7Zm9yKGNvbnN0IGggb2YgYSl7Y29uc3QgZj1uKHNbaF0pO2w9aShsLGYpfWNvbnN0IG89bihzLl9jb21tb24pLHU9cihvLGwpO3JldHVybiBuZXcgJGUodSl9KSwkZS5fbG9jYWxlcz1uZXcgZmkoKCk9Pk9iamVjdC5rZXlzKCRlLmFtYmlndW91c0NoYXJhY3RlckRhdGEudmFsdWUpLmZpbHRlcih0PT4hdC5zdGFydHNXaXRoKCJfIikpKTtsZXQgQnQ9JGU7Y29uc3QgRnQ9Y2xhc3MgRnR7c3RhdGljIGdldFJhd0RhdGEoKXtyZXR1cm4gSlNPTi5wYXJzZSgiWzksMTAsMTEsMTIsMTMsMzIsMTI3LDE2MCwxNzMsODQ3LDE1NjQsNDQ0Nyw0NDQ4LDYwNjgsNjA2OSw2MTU1LDYxNTYsNjE1Nyw2MTU4LDczNTUsNzM1Niw4MTkyLDgxOTMsODE5NCw4MTk1LDgxOTYsODE5Nyw4MTk4LDgxOTksODIwMCw4MjAxLDgyMDIsODIwMyw4MjA0LDgyMDUsODIwNiw4MjA3LDgyMzQsODIzNSw4MjM2LDgyMzcsODIzOCw4MjM5LDgyODcsODI4OCw4Mjg5LDgyOTAsODI5MSw4MjkyLDgyOTMsODI5NCw4Mjk1LDgyOTYsODI5Nyw4Mjk4LDgyOTksODMwMCw4MzAxLDgzMDIsODMwMywxMDI0MCwxMjI4OCwxMjY0NCw2NTAyNCw2NTAyNSw2NTAyNiw2NTAyNyw2NTAyOCw2NTAyOSw2NTAzMCw2NTAzMSw2NTAzMiw2NTAzMyw2NTAzNCw2NTAzNSw2NTAzNiw2NTAzNyw2NTAzOCw2NTAzOSw2NTI3OSw2NTQ0MCw2NTUyMCw2NTUyMSw2NTUyMiw2NTUyMyw2NTUyNCw2NTUyNSw2NTUyNiw2NTUyNyw2NTUyOCw2NTUzMiw3ODg0NCwxMTkxNTUsMTE5MTU2LDExOTE1NywxMTkxNTgsMTE5MTU5LDExOTE2MCwxMTkxNjEsMTE5MTYyLDkxNzUwNCw5MTc1MDUsOTE3NTA2LDkxNzUwNyw5MTc1MDgsOTE3NTA5LDkxNzUxMCw5MTc1MTEsOTE3NTEyLDkxNzUxMyw5MTc1MTQsOTE3NTE1LDkxNzUxNiw5MTc1MTcsOTE3NTE4LDkxNzUxOSw5MTc1MjAsOTE3NTIxLDkxNzUyMiw5MTc1MjMsOTE3NTI0LDkxNzUyNSw5MTc1MjYsOTE3NTI3LDkxNzUyOCw5MTc1MjksOTE3NTMwLDkxNzUzMSw5MTc1MzIsOTE3NTMzLDkxNzUzNCw5MTc1MzUsOTE3NTM2LDkxNzUzNyw5MTc1MzgsOTE3NTM5LDkxNzU0MCw5MTc1NDEsOTE3NTQyLDkxNzU0Myw5MTc1NDQsOTE3NTQ1LDkxNzU0Niw5MTc1NDcsOTE3NTQ4LDkxNzU0OSw5MTc1NTAsOTE3NTUxLDkxNzU1Miw5MTc1NTMsOTE3NTU0LDkxNzU1NSw5MTc1NTYsOTE3NTU3LDkxNzU1OCw5MTc1NTksOTE3NTYwLDkxNzU2MSw5MTc1NjIsOTE3NTYzLDkxNzU2NCw5MTc1NjUsOTE3NTY2LDkxNzU2Nyw5MTc1NjgsOTE3NTY5LDkxNzU3MCw5MTc1NzEsOTE3NTcyLDkxNzU3Myw5MTc1NzQsOTE3NTc1LDkxNzU3Niw5MTc1NzcsOTE3NTc4LDkxNzU3OSw5MTc1ODAsOTE3NTgxLDkxNzU4Miw5MTc1ODMsOTE3NTg0LDkxNzU4NSw5MTc1ODYsOTE3NTg3LDkxNzU4OCw5MTc1ODksOTE3NTkwLDkxNzU5MSw5MTc1OTIsOTE3NTkzLDkxNzU5NCw5MTc1OTUsOTE3NTk2LDkxNzU5Nyw5MTc1OTgsOTE3NTk5LDkxNzYwMCw5MTc2MDEsOTE3NjAyLDkxNzYwMyw5MTc2MDQsOTE3NjA1LDkxNzYwNiw5MTc2MDcsOTE3NjA4LDkxNzYwOSw5MTc2MTAsOTE3NjExLDkxNzYxMiw5MTc2MTMsOTE3NjE0LDkxNzYxNSw5MTc2MTYsOTE3NjE3LDkxNzYxOCw5MTc2MTksOTE3NjIwLDkxNzYyMSw5MTc2MjIsOTE3NjIzLDkxNzYyNCw5MTc2MjUsOTE3NjI2LDkxNzYyNyw5MTc2MjgsOTE3NjI5LDkxNzYzMCw5MTc2MzEsOTE3NzYwLDkxNzc2MSw5MTc3NjIsOTE3NzYzLDkxNzc2NCw5MTc3NjUsOTE3NzY2LDkxNzc2Nyw5MTc3NjgsOTE3NzY5LDkxNzc3MCw5MTc3NzEsOTE3NzcyLDkxNzc3Myw5MTc3NzQsOTE3Nzc1LDkxNzc3Niw5MTc3NzcsOTE3Nzc4LDkxNzc3OSw5MTc3ODAsOTE3NzgxLDkxNzc4Miw5MTc3ODMsOTE3Nzg0LDkxNzc4NSw5MTc3ODYsOTE3Nzg3LDkxNzc4OCw5MTc3ODksOTE3NzkwLDkxNzc5MSw5MTc3OTIsOTE3NzkzLDkxNzc5NCw5MTc3OTUsOTE3Nzk2LDkxNzc5Nyw5MTc3OTgsOTE3Nzk5LDkxNzgwMCw5MTc4MDEsOTE3ODAyLDkxNzgwMyw5MTc4MDQsOTE3ODA1LDkxNzgwNiw5MTc4MDcsOTE3ODA4LDkxNzgwOSw5MTc4MTAsOTE3ODExLDkxNzgxMiw5MTc4MTMsOTE3ODE0LDkxNzgxNSw5MTc4MTYsOTE3ODE3LDkxNzgxOCw5MTc4MTksOTE3ODIwLDkxNzgyMSw5MTc4MjIsOTE3ODIzLDkxNzgyNCw5MTc4MjUsOTE3ODI2LDkxNzgyNyw5MTc4MjgsOTE3ODI5LDkxNzgzMCw5MTc4MzEsOTE3ODMyLDkxNzgzMyw5MTc4MzQsOTE3ODM1LDkxNzgzNiw5MTc4MzcsOTE3ODM4LDkxNzgzOSw5MTc4NDAsOTE3ODQxLDkxNzg0Miw5MTc4NDMsOTE3ODQ0LDkxNzg0NSw5MTc4NDYsOTE3ODQ3LDkxNzg0OCw5MTc4NDksOTE3ODUwLDkxNzg1MSw5MTc4NTIsOTE3ODUzLDkxNzg1NCw5MTc4NTUsOTE3ODU2LDkxNzg1Nyw5MTc4NTgsOTE3ODU5LDkxNzg2MCw5MTc4NjEsOTE3ODYyLDkxNzg2Myw5MTc4NjQsOTE3ODY1LDkxNzg2Niw5MTc4NjcsOTE3ODY4LDkxNzg2OSw5MTc4NzAsOTE3ODcxLDkxNzg3Miw5MTc4NzMsOTE3ODc0LDkxNzg3NSw5MTc4NzYsOTE3ODc3LDkxNzg3OCw5MTc4NzksOTE3ODgwLDkxNzg4MSw5MTc4ODIsOTE3ODgzLDkxNzg4NCw5MTc4ODUsOTE3ODg2LDkxNzg4Nyw5MTc4ODgsOTE3ODg5LDkxNzg5MCw5MTc4OTEsOTE3ODkyLDkxNzg5Myw5MTc4OTQsOTE3ODk1LDkxNzg5Niw5MTc4OTcsOTE3ODk4LDkxNzg5OSw5MTc5MDAsOTE3OTAxLDkxNzkwMiw5MTc5MDMsOTE3OTA0LDkxNzkwNSw5MTc5MDYsOTE3OTA3LDkxNzkwOCw5MTc5MDksOTE3OTEwLDkxNzkxMSw5MTc5MTIsOTE3OTEzLDkxNzkxNCw5MTc5MTUsOTE3OTE2LDkxNzkxNyw5MTc5MTgsOTE3OTE5LDkxNzkyMCw5MTc5MjEsOTE3OTIyLDkxNzkyMyw5MTc5MjQsOTE3OTI1LDkxNzkyNiw5MTc5MjcsOTE3OTI4LDkxNzkyOSw5MTc5MzAsOTE3OTMxLDkxNzkzMiw5MTc5MzMsOTE3OTM0LDkxNzkzNSw5MTc5MzYsOTE3OTM3LDkxNzkzOCw5MTc5MzksOTE3OTQwLDkxNzk0MSw5MTc5NDIsOTE3OTQzLDkxNzk0NCw5MTc5NDUsOTE3OTQ2LDkxNzk0Nyw5MTc5NDgsOTE3OTQ5LDkxNzk1MCw5MTc5NTEsOTE3OTUyLDkxNzk1Myw5MTc5NTQsOTE3OTU1LDkxNzk1Niw5MTc5NTcsOTE3OTU4LDkxNzk1OSw5MTc5NjAsOTE3OTYxLDkxNzk2Miw5MTc5NjMsOTE3OTY0LDkxNzk2NSw5MTc5NjYsOTE3OTY3LDkxNzk2OCw5MTc5NjksOTE3OTcwLDkxNzk3MSw5MTc5NzIsOTE3OTczLDkxNzk3NCw5MTc5NzUsOTE3OTc2LDkxNzk3Nyw5MTc5NzgsOTE3OTc5LDkxNzk4MCw5MTc5ODEsOTE3OTgyLDkxNzk4Myw5MTc5ODQsOTE3OTg1LDkxNzk4Niw5MTc5ODcsOTE3OTg4LDkxNzk4OSw5MTc5OTAsOTE3OTkxLDkxNzk5Miw5MTc5OTMsOTE3OTk0LDkxNzk5NSw5MTc5OTYsOTE3OTk3LDkxNzk5OCw5MTc5OTldIil9c3RhdGljIGdldERhdGEoKXtyZXR1cm4gdGhpcy5fZGF0YXx8KHRoaXMuX2RhdGE9bmV3IFNldChGdC5nZXRSYXdEYXRhKCkpKSx0aGlzLl9kYXRhfXN0YXRpYyBpc0ludmlzaWJsZUNoYXJhY3Rlcih0KXtyZXR1cm4gRnQuZ2V0RGF0YSgpLmhhcyh0KX1zdGF0aWMgZ2V0IGNvZGVQb2ludHMoKXtyZXR1cm4gRnQuZ2V0RGF0YSgpfX07RnQuX2RhdGE9dm9pZCAwO2xldCBxdD1GdCxwdDtjb25zdCBucj1nbG9iYWxUaGlzLnZzY29kZTtpZih0eXBlb2YgbnI8InUiJiZ0eXBlb2YgbnIucHJvY2VzczwidSIpe2NvbnN0IGU9bnIucHJvY2VzcztwdD17Z2V0IHBsYXRmb3JtKCl7cmV0dXJuIGUucGxhdGZvcm19LGdldCBhcmNoKCl7cmV0dXJuIGUuYXJjaH0sZ2V0IGVudigpe3JldHVybiBlLmVudn0sY3dkKCl7cmV0dXJuIGUuY3dkKCl9fX1lbHNlIHR5cGVvZiBwcm9jZXNzPCJ1IiYmdHlwZW9mKChIbz1wcm9jZXNzPT1udWxsP3ZvaWQgMDpwcm9jZXNzLnZlcnNpb25zKT09bnVsbD92b2lkIDA6SG8ubm9kZSk9PSJzdHJpbmciP3B0PXtnZXQgcGxhdGZvcm0oKXtyZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybX0sZ2V0IGFyY2goKXtyZXR1cm4gcHJvY2Vzcy5hcmNofSxnZXQgZW52KCl7cmV0dXJuIHByb2Nlc3MuZW52fSxjd2QoKXtyZXR1cm4gcHJvY2Vzcy5lbnYuVlNDT0RFX0NXRHx8cHJvY2Vzcy5jd2QoKX19OnB0PXtnZXQgcGxhdGZvcm0oKXtyZXR1cm4gVXQ/IndpbjMyIjp1bD8iZGFyd2luIjoibGludXgifSxnZXQgYXJjaCgpe30sZ2V0IGVudigpe3JldHVybnt9fSxjd2QoKXtyZXR1cm4iLyJ9fTtjb25zdCBmbj1wdC5jd2QsQWw9cHQuZW52LGtsPXB0LnBsYXRmb3JtLFJsPTY1LEVsPTk3LE1sPTkwLENsPTEyMixHZT00NixvZT00NyxwZT05MixKZT01OCxUbD02MztjbGFzcyBkaSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsbixyKXtsZXQgaTt0eXBlb2Ygbj09InN0cmluZyImJm4uaW5kZXhPZigibm90ICIpPT09MD8oaT0ibXVzdCBub3QgYmUiLG49bi5yZXBsYWNlKC9ebm90IC8sIiIpKTppPSJtdXN0IGJlIjtjb25zdCBzPXQuaW5kZXhPZigiLiIpIT09LTE/InByb3BlcnR5IjoiYXJndW1lbnQiO2xldCBhPWBUaGUgIiR7dH0iICR7c30gJHtpfSBvZiB0eXBlICR7bn1gO2ErPWAuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2Ygcn1gLHN1cGVyKGEpLHRoaXMuY29kZT0iRVJSX0lOVkFMSURfQVJHX1RZUEUifX1mdW5jdGlvbiBQbChlLHQpe2lmKGU9PT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IGRpKHQsIk9iamVjdCIsZSl9ZnVuY3Rpb24gSyhlLHQpe2lmKHR5cGVvZiBlIT0ic3RyaW5nIil0aHJvdyBuZXcgZGkodCwic3RyaW5nIixlKX1jb25zdCBxZT1rbD09PSJ3aW4zMiI7ZnVuY3Rpb24gQihlKXtyZXR1cm4gZT09PW9lfHxlPT09cGV9ZnVuY3Rpb24gcnIoZSl7cmV0dXJuIGU9PT1vZX1mdW5jdGlvbiBYZShlKXtyZXR1cm4gZT49UmwmJmU8PU1sfHxlPj1FbCYmZTw9Q2x9ZnVuY3Rpb24gaG4oZSx0LG4scil7bGV0IGk9IiIscz0wLGE9LTEsbD0wLG89MDtmb3IobGV0IHU9MDt1PD1lLmxlbmd0aDsrK3Upe2lmKHU8ZS5sZW5ndGgpbz1lLmNoYXJDb2RlQXQodSk7ZWxzZXtpZihyKG8pKWJyZWFrO289b2V9aWYocihvKSl7aWYoIShhPT09dS0xfHxsPT09MSkpaWYobD09PTIpe2lmKGkubGVuZ3RoPDJ8fHMhPT0yfHxpLmNoYXJDb2RlQXQoaS5sZW5ndGgtMSkhPT1HZXx8aS5jaGFyQ29kZUF0KGkubGVuZ3RoLTIpIT09R2Upe2lmKGkubGVuZ3RoPjIpe2NvbnN0IGg9aS5sYXN0SW5kZXhPZihuKTtoPT09LTE/KGk9IiIscz0wKTooaT1pLnNsaWNlKDAsaCkscz1pLmxlbmd0aC0xLWkubGFzdEluZGV4T2YobikpLGE9dSxsPTA7Y29udGludWV9ZWxzZSBpZihpLmxlbmd0aCE9PTApe2k9IiIscz0wLGE9dSxsPTA7Y29udGludWV9fXQmJihpKz1pLmxlbmd0aD4wP2Ake259Li5gOiIuLiIscz0yKX1lbHNlIGkubGVuZ3RoPjA/aSs9YCR7bn0ke2Uuc2xpY2UoYSsxLHUpfWA6aT1lLnNsaWNlKGErMSx1KSxzPXUtYS0xO2E9dSxsPTB9ZWxzZSBvPT09R2UmJmwhPT0tMT8rK2w6bD0tMX1yZXR1cm4gaX1mdW5jdGlvbiBJbChlKXtyZXR1cm4gZT9gJHtlWzBdPT09Ii4iPyIiOiIuIn0ke2V9YDoiIn1mdW5jdGlvbiBtaShlLHQpe1BsKHQsInBhdGhPYmplY3QiKTtjb25zdCBuPXQuZGlyfHx0LnJvb3Qscj10LmJhc2V8fGAke3QubmFtZXx8IiJ9JHtJbCh0LmV4dCl9YDtyZXR1cm4gbj9uPT09dC5yb290P2Ake259JHtyfWA6YCR7bn0ke2V9JHtyfWA6cn1jb25zdCBjZT17cmVzb2x2ZSguLi5lKXtsZXQgdD0iIixuPSIiLHI9ITE7Zm9yKGxldCBpPWUubGVuZ3RoLTE7aT49LTE7aS0tKXtsZXQgcztpZihpPj0wKXtpZihzPWVbaV0sSyhzLGBwYXRoc1ske2l9XWApLHMubGVuZ3RoPT09MCljb250aW51ZX1lbHNlIHQubGVuZ3RoPT09MD9zPWZuKCk6KHM9QWxbYD0ke3R9YF18fGZuKCksKHM9PT12b2lkIDB8fHMuc2xpY2UoMCwyKS50b0xvd2VyQ2FzZSgpIT09dC50b0xvd2VyQ2FzZSgpJiZzLmNoYXJDb2RlQXQoMik9PT1wZSkmJihzPWAke3R9XFxgKSk7Y29uc3QgYT1zLmxlbmd0aDtsZXQgbD0wLG89IiIsdT0hMTtjb25zdCBoPXMuY2hhckNvZGVBdCgwKTtpZihhPT09MSlCKGgpJiYobD0xLHU9ITApO2Vsc2UgaWYoQihoKSlpZih1PSEwLEIocy5jaGFyQ29kZUF0KDEpKSl7bGV0IGY9MixkPWY7Zm9yKDtmPGEmJiFCKHMuY2hhckNvZGVBdChmKSk7KWYrKztpZihmPGEmJmYhPT1kKXtjb25zdCBtPXMuc2xpY2UoZCxmKTtmb3IoZD1mO2Y8YSYmQihzLmNoYXJDb2RlQXQoZikpOylmKys7aWYoZjxhJiZmIT09ZCl7Zm9yKGQ9ZjtmPGEmJiFCKHMuY2hhckNvZGVBdChmKSk7KWYrKzsoZj09PWF8fGYhPT1kKSYmKG89YFxcXFwke219XFwke3Muc2xpY2UoZCxmKX1gLGw9Zil9fX1lbHNlIGw9MTtlbHNlIFhlKGgpJiZzLmNoYXJDb2RlQXQoMSk9PT1KZSYmKG89cy5zbGljZSgwLDIpLGw9MixhPjImJkIocy5jaGFyQ29kZUF0KDIpKSYmKHU9ITAsbD0zKSk7aWYoby5sZW5ndGg+MClpZih0Lmxlbmd0aD4wKXtpZihvLnRvTG93ZXJDYXNlKCkhPT10LnRvTG93ZXJDYXNlKCkpY29udGludWV9ZWxzZSB0PW87aWYocil7aWYodC5sZW5ndGg+MClicmVha31lbHNlIGlmKG49YCR7cy5zbGljZShsKX1cXCR7bn1gLHI9dSx1JiZ0Lmxlbmd0aD4wKWJyZWFrfXJldHVybiBuPWhuKG4sIXIsIlxcIixCKSxyP2Ake3R9XFwke259YDpgJHt0fSR7bn1gfHwiLiJ9LG5vcm1hbGl6ZShlKXtLKGUsInBhdGgiKTtjb25zdCB0PWUubGVuZ3RoO2lmKHQ9PT0wKXJldHVybiIuIjtsZXQgbj0wLHIsaT0hMTtjb25zdCBzPWUuY2hhckNvZGVBdCgwKTtpZih0PT09MSlyZXR1cm4gcnIocyk/IlxcIjplO2lmKEIocykpaWYoaT0hMCxCKGUuY2hhckNvZGVBdCgxKSkpe2xldCBsPTIsbz1sO2Zvcig7bDx0JiYhQihlLmNoYXJDb2RlQXQobCkpOylsKys7aWYobDx0JiZsIT09byl7Y29uc3QgdT1lLnNsaWNlKG8sbCk7Zm9yKG89bDtsPHQmJkIoZS5jaGFyQ29kZUF0KGwpKTspbCsrO2lmKGw8dCYmbCE9PW8pe2ZvcihvPWw7bDx0JiYhQihlLmNoYXJDb2RlQXQobCkpOylsKys7aWYobD09PXQpcmV0dXJuYFxcXFwke3V9XFwke2Uuc2xpY2Uobyl9XFxgO2whPT1vJiYocj1gXFxcXCR7dX1cXCR7ZS5zbGljZShvLGwpfWAsbj1sKX19fWVsc2Ugbj0xO2Vsc2UgWGUocykmJmUuY2hhckNvZGVBdCgxKT09PUplJiYocj1lLnNsaWNlKDAsMiksbj0yLHQ+MiYmQihlLmNoYXJDb2RlQXQoMikpJiYoaT0hMCxuPTMpKTtsZXQgYT1uPHQ/aG4oZS5zbGljZShuKSwhaSwiXFwiLEIpOiIiO3JldHVybiBhLmxlbmd0aD09PTAmJiFpJiYoYT0iLiIpLGEubGVuZ3RoPjAmJkIoZS5jaGFyQ29kZUF0KHQtMSkpJiYoYSs9IlxcIikscj09PXZvaWQgMD9pP2BcXCR7YX1gOmE6aT9gJHtyfVxcJHthfWA6YCR7cn0ke2F9YH0saXNBYnNvbHV0ZShlKXtLKGUsInBhdGgiKTtjb25zdCB0PWUubGVuZ3RoO2lmKHQ9PT0wKXJldHVybiExO2NvbnN0IG49ZS5jaGFyQ29kZUF0KDApO3JldHVybiBCKG4pfHx0PjImJlhlKG4pJiZlLmNoYXJDb2RlQXQoMSk9PT1KZSYmQihlLmNoYXJDb2RlQXQoMikpfSxqb2luKC4uLmUpe2lmKGUubGVuZ3RoPT09MClyZXR1cm4iLiI7bGV0IHQsbjtmb3IobGV0IHM9MDtzPGUubGVuZ3RoOysrcyl7Y29uc3QgYT1lW3NdO0soYSwicGF0aCIpLGEubGVuZ3RoPjAmJih0PT09dm9pZCAwP3Q9bj1hOnQrPWBcXCR7YX1gKX1pZih0PT09dm9pZCAwKXJldHVybiIuIjtsZXQgcj0hMCxpPTA7aWYodHlwZW9mIG49PSJzdHJpbmciJiZCKG4uY2hhckNvZGVBdCgwKSkpeysraTtjb25zdCBzPW4ubGVuZ3RoO3M+MSYmQihuLmNoYXJDb2RlQXQoMSkpJiYoKytpLHM+MiYmKEIobi5jaGFyQ29kZUF0KDIpKT8rK2k6cj0hMSkpfWlmKHIpe2Zvcig7aTx0Lmxlbmd0aCYmQih0LmNoYXJDb2RlQXQoaSkpOylpKys7aT49MiYmKHQ9YFxcJHt0LnNsaWNlKGkpfWApfXJldHVybiBjZS5ub3JtYWxpemUodCl9LHJlbGF0aXZlKGUsdCl7aWYoSyhlLCJmcm9tIiksSyh0LCJ0byIpLGU9PT10KXJldHVybiIiO2NvbnN0IG49Y2UucmVzb2x2ZShlKSxyPWNlLnJlc29sdmUodCk7aWYobj09PXJ8fChlPW4udG9Mb3dlckNhc2UoKSx0PXIudG9Mb3dlckNhc2UoKSxlPT09dCkpcmV0dXJuIiI7bGV0IGk9MDtmb3IoO2k8ZS5sZW5ndGgmJmUuY2hhckNvZGVBdChpKT09PXBlOylpKys7bGV0IHM9ZS5sZW5ndGg7Zm9yKDtzLTE+aSYmZS5jaGFyQ29kZUF0KHMtMSk9PT1wZTspcy0tO2NvbnN0IGE9cy1pO2xldCBsPTA7Zm9yKDtsPHQubGVuZ3RoJiZ0LmNoYXJDb2RlQXQobCk9PT1wZTspbCsrO2xldCBvPXQubGVuZ3RoO2Zvcig7by0xPmwmJnQuY2hhckNvZGVBdChvLTEpPT09cGU7KW8tLTtjb25zdCB1PW8tbCxoPWE8dT9hOnU7bGV0IGY9LTEsZD0wO2Zvcig7ZDxoO2QrKyl7Y29uc3QgZz1lLmNoYXJDb2RlQXQoaStkKTtpZihnIT09dC5jaGFyQ29kZUF0KGwrZCkpYnJlYWs7Zz09PXBlJiYoZj1kKX1pZihkIT09aCl7aWYoZj09PS0xKXJldHVybiByfWVsc2V7aWYodT5oKXtpZih0LmNoYXJDb2RlQXQobCtkKT09PXBlKXJldHVybiByLnNsaWNlKGwrZCsxKTtpZihkPT09MilyZXR1cm4gci5zbGljZShsK2QpfWE+aCYmKGUuY2hhckNvZGVBdChpK2QpPT09cGU/Zj1kOmQ9PT0yJiYoZj0zKSksZj09PS0xJiYoZj0wKX1sZXQgbT0iIjtmb3IoZD1pK2YrMTtkPD1zOysrZCkoZD09PXN8fGUuY2hhckNvZGVBdChkKT09PXBlKSYmKG0rPW0ubGVuZ3RoPT09MD8iLi4iOiJcXC4uIik7cmV0dXJuIGwrPWYsbS5sZW5ndGg+MD9gJHttfSR7ci5zbGljZShsLG8pfWA6KHIuY2hhckNvZGVBdChsKT09PXBlJiYrK2wsci5zbGljZShsLG8pKX0sdG9OYW1lc3BhY2VkUGF0aChlKXtpZih0eXBlb2YgZSE9InN0cmluZyJ8fGUubGVuZ3RoPT09MClyZXR1cm4gZTtjb25zdCB0PWNlLnJlc29sdmUoZSk7aWYodC5sZW5ndGg8PTIpcmV0dXJuIGU7aWYodC5jaGFyQ29kZUF0KDApPT09cGUpe2lmKHQuY2hhckNvZGVBdCgxKT09PXBlKXtjb25zdCBuPXQuY2hhckNvZGVBdCgyKTtpZihuIT09VGwmJm4hPT1HZSlyZXR1cm5gXFxcXD9cXFVOQ1xcJHt0LnNsaWNlKDIpfWB9fWVsc2UgaWYoWGUodC5jaGFyQ29kZUF0KDApKSYmdC5jaGFyQ29kZUF0KDEpPT09SmUmJnQuY2hhckNvZGVBdCgyKT09PXBlKXJldHVybmBcXFxcP1xcJHt0fWA7cmV0dXJuIGV9LGRpcm5hbWUoZSl7SyhlLCJwYXRoIik7Y29uc3QgdD1lLmxlbmd0aDtpZih0PT09MClyZXR1cm4iLiI7bGV0IG49LTEscj0wO2NvbnN0IGk9ZS5jaGFyQ29kZUF0KDApO2lmKHQ9PT0xKXJldHVybiBCKGkpP2U6Ii4iO2lmKEIoaSkpe2lmKG49cj0xLEIoZS5jaGFyQ29kZUF0KDEpKSl7bGV0IGw9MixvPWw7Zm9yKDtsPHQmJiFCKGUuY2hhckNvZGVBdChsKSk7KWwrKztpZihsPHQmJmwhPT1vKXtmb3Iobz1sO2w8dCYmQihlLmNoYXJDb2RlQXQobCkpOylsKys7aWYobDx0JiZsIT09byl7Zm9yKG89bDtsPHQmJiFCKGUuY2hhckNvZGVBdChsKSk7KWwrKztpZihsPT09dClyZXR1cm4gZTtsIT09byYmKG49cj1sKzEpfX19fWVsc2UgWGUoaSkmJmUuY2hhckNvZGVBdCgxKT09PUplJiYobj10PjImJkIoZS5jaGFyQ29kZUF0KDIpKT8zOjIscj1uKTtsZXQgcz0tMSxhPSEwO2ZvcihsZXQgbD10LTE7bD49cjstLWwpaWYoQihlLmNoYXJDb2RlQXQobCkpKXtpZighYSl7cz1sO2JyZWFrfX1lbHNlIGE9ITE7aWYocz09PS0xKXtpZihuPT09LTEpcmV0dXJuIi4iO3M9bn1yZXR1cm4gZS5zbGljZSgwLHMpfSxiYXNlbmFtZShlLHQpe3QhPT12b2lkIDAmJksodCwic3VmZml4IiksSyhlLCJwYXRoIik7bGV0IG49MCxyPS0xLGk9ITAscztpZihlLmxlbmd0aD49MiYmWGUoZS5jaGFyQ29kZUF0KDApKSYmZS5jaGFyQ29kZUF0KDEpPT09SmUmJihuPTIpLHQhPT12b2lkIDAmJnQubGVuZ3RoPjAmJnQubGVuZ3RoPD1lLmxlbmd0aCl7aWYodD09PWUpcmV0dXJuIiI7bGV0IGE9dC5sZW5ndGgtMSxsPS0xO2ZvcihzPWUubGVuZ3RoLTE7cz49bjstLXMpe2NvbnN0IG89ZS5jaGFyQ29kZUF0KHMpO2lmKEIobykpe2lmKCFpKXtuPXMrMTticmVha319ZWxzZSBsPT09LTEmJihpPSExLGw9cysxKSxhPj0wJiYobz09PXQuY2hhckNvZGVBdChhKT8tLWE9PT0tMSYmKHI9cyk6KGE9LTEscj1sKSl9cmV0dXJuIG49PT1yP3I9bDpyPT09LTEmJihyPWUubGVuZ3RoKSxlLnNsaWNlKG4scil9Zm9yKHM9ZS5sZW5ndGgtMTtzPj1uOy0tcylpZihCKGUuY2hhckNvZGVBdChzKSkpe2lmKCFpKXtuPXMrMTticmVha319ZWxzZSByPT09LTEmJihpPSExLHI9cysxKTtyZXR1cm4gcj09PS0xPyIiOmUuc2xpY2UobixyKX0sZXh0bmFtZShlKXtLKGUsInBhdGgiKTtsZXQgdD0wLG49LTEscj0wLGk9LTEscz0hMCxhPTA7ZS5sZW5ndGg+PTImJmUuY2hhckNvZGVBdCgxKT09PUplJiZYZShlLmNoYXJDb2RlQXQoMCkpJiYodD1yPTIpO2ZvcihsZXQgbD1lLmxlbmd0aC0xO2w+PXQ7LS1sKXtjb25zdCBvPWUuY2hhckNvZGVBdChsKTtpZihCKG8pKXtpZighcyl7cj1sKzE7YnJlYWt9Y29udGludWV9aT09PS0xJiYocz0hMSxpPWwrMSksbz09PUdlP249PT0tMT9uPWw6YSE9PTEmJihhPTEpOm4hPT0tMSYmKGE9LTEpfXJldHVybiBuPT09LTF8fGk9PT0tMXx8YT09PTB8fGE9PT0xJiZuPT09aS0xJiZuPT09cisxPyIiOmUuc2xpY2UobixpKX0sZm9ybWF0Om1pLmJpbmQobnVsbCwiXFwiKSxwYXJzZShlKXtLKGUsInBhdGgiKTtjb25zdCB0PXtyb290OiIiLGRpcjoiIixiYXNlOiIiLGV4dDoiIixuYW1lOiIifTtpZihlLmxlbmd0aD09PTApcmV0dXJuIHQ7Y29uc3Qgbj1lLmxlbmd0aDtsZXQgcj0wLGk9ZS5jaGFyQ29kZUF0KDApO2lmKG49PT0xKXJldHVybiBCKGkpPyh0LnJvb3Q9dC5kaXI9ZSx0KToodC5iYXNlPXQubmFtZT1lLHQpO2lmKEIoaSkpe2lmKHI9MSxCKGUuY2hhckNvZGVBdCgxKSkpe2xldCBmPTIsZD1mO2Zvcig7ZjxuJiYhQihlLmNoYXJDb2RlQXQoZikpOylmKys7aWYoZjxuJiZmIT09ZCl7Zm9yKGQ9ZjtmPG4mJkIoZS5jaGFyQ29kZUF0KGYpKTspZisrO2lmKGY8biYmZiE9PWQpe2ZvcihkPWY7ZjxuJiYhQihlLmNoYXJDb2RlQXQoZikpOylmKys7Zj09PW4/cj1mOmYhPT1kJiYocj1mKzEpfX19fWVsc2UgaWYoWGUoaSkmJmUuY2hhckNvZGVBdCgxKT09PUplKXtpZihuPD0yKXJldHVybiB0LnJvb3Q9dC5kaXI9ZSx0O2lmKHI9MixCKGUuY2hhckNvZGVBdCgyKSkpe2lmKG49PT0zKXJldHVybiB0LnJvb3Q9dC5kaXI9ZSx0O3I9M319cj4wJiYodC5yb290PWUuc2xpY2UoMCxyKSk7bGV0IHM9LTEsYT1yLGw9LTEsbz0hMCx1PWUubGVuZ3RoLTEsaD0wO2Zvcig7dT49cjstLXUpe2lmKGk9ZS5jaGFyQ29kZUF0KHUpLEIoaSkpe2lmKCFvKXthPXUrMTticmVha31jb250aW51ZX1sPT09LTEmJihvPSExLGw9dSsxKSxpPT09R2U/cz09PS0xP3M9dTpoIT09MSYmKGg9MSk6cyE9PS0xJiYoaD0tMSl9cmV0dXJuIGwhPT0tMSYmKHM9PT0tMXx8aD09PTB8fGg9PT0xJiZzPT09bC0xJiZzPT09YSsxP3QuYmFzZT10Lm5hbWU9ZS5zbGljZShhLGwpOih0Lm5hbWU9ZS5zbGljZShhLHMpLHQuYmFzZT1lLnNsaWNlKGEsbCksdC5leHQ9ZS5zbGljZShzLGwpKSksYT4wJiZhIT09cj90LmRpcj1lLnNsaWNlKDAsYS0xKTp0LmRpcj10LnJvb3QsdH0sc2VwOiJcXCIsZGVsaW1pdGVyOiI7Iix3aW4zMjpudWxsLHBvc2l4Om51bGx9LEZsPSgoKT0+e2lmKHFlKXtjb25zdCBlPS9cXC9nO3JldHVybigpPT57Y29uc3QgdD1mbigpLnJlcGxhY2UoZSwiLyIpO3JldHVybiB0LnNsaWNlKHQuaW5kZXhPZigiLyIpKX19cmV0dXJuKCk9PmZuKCl9KSgpLGZlPXtyZXNvbHZlKC4uLmUpe2xldCB0PSIiLG49ITE7Zm9yKGxldCByPWUubGVuZ3RoLTE7cj49LTEmJiFuO3ItLSl7Y29uc3QgaT1yPj0wP2Vbcl06RmwoKTtLKGksYHBhdGhzWyR7cn1dYCksaS5sZW5ndGghPT0wJiYodD1gJHtpfS8ke3R9YCxuPWkuY2hhckNvZGVBdCgwKT09PW9lKX1yZXR1cm4gdD1obih0LCFuLCIvIixyciksbj9gLyR7dH1gOnQubGVuZ3RoPjA/dDoiLiJ9LG5vcm1hbGl6ZShlKXtpZihLKGUsInBhdGgiKSxlLmxlbmd0aD09PTApcmV0dXJuIi4iO2NvbnN0IHQ9ZS5jaGFyQ29kZUF0KDApPT09b2Usbj1lLmNoYXJDb2RlQXQoZS5sZW5ndGgtMSk9PT1vZTtyZXR1cm4gZT1obihlLCF0LCIvIixyciksZS5sZW5ndGg9PT0wP3Q/Ii8iOm4/Ii4vIjoiLiI6KG4mJihlKz0iLyIpLHQ/YC8ke2V9YDplKX0saXNBYnNvbHV0ZShlKXtyZXR1cm4gSyhlLCJwYXRoIiksZS5sZW5ndGg+MCYmZS5jaGFyQ29kZUF0KDApPT09b2V9LGpvaW4oLi4uZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiIuIjtsZXQgdDtmb3IobGV0IG49MDtuPGUubGVuZ3RoOysrbil7Y29uc3Qgcj1lW25dO0sociwicGF0aCIpLHIubGVuZ3RoPjAmJih0PT09dm9pZCAwP3Q9cjp0Kz1gLyR7cn1gKX1yZXR1cm4gdD09PXZvaWQgMD8iLiI6ZmUubm9ybWFsaXplKHQpfSxyZWxhdGl2ZShlLHQpe2lmKEsoZSwiZnJvbSIpLEsodCwidG8iKSxlPT09dHx8KGU9ZmUucmVzb2x2ZShlKSx0PWZlLnJlc29sdmUodCksZT09PXQpKXJldHVybiIiO2NvbnN0IG49MSxyPWUubGVuZ3RoLGk9ci1uLHM9MSxhPXQubGVuZ3RoLXMsbD1pPGE/aTphO2xldCBvPS0xLHU9MDtmb3IoO3U8bDt1Kyspe2NvbnN0IGY9ZS5jaGFyQ29kZUF0KG4rdSk7aWYoZiE9PXQuY2hhckNvZGVBdChzK3UpKWJyZWFrO2Y9PT1vZSYmKG89dSl9aWYodT09PWwpaWYoYT5sKXtpZih0LmNoYXJDb2RlQXQocyt1KT09PW9lKXJldHVybiB0LnNsaWNlKHMrdSsxKTtpZih1PT09MClyZXR1cm4gdC5zbGljZShzK3UpfWVsc2UgaT5sJiYoZS5jaGFyQ29kZUF0KG4rdSk9PT1vZT9vPXU6dT09PTAmJihvPTApKTtsZXQgaD0iIjtmb3IodT1uK28rMTt1PD1yOysrdSkodT09PXJ8fGUuY2hhckNvZGVBdCh1KT09PW9lKSYmKGgrPWgubGVuZ3RoPT09MD8iLi4iOiIvLi4iKTtyZXR1cm5gJHtofSR7dC5zbGljZShzK28pfWB9LHRvTmFtZXNwYWNlZFBhdGgoZSl7cmV0dXJuIGV9LGRpcm5hbWUoZSl7aWYoSyhlLCJwYXRoIiksZS5sZW5ndGg9PT0wKXJldHVybiIuIjtjb25zdCB0PWUuY2hhckNvZGVBdCgwKT09PW9lO2xldCBuPS0xLHI9ITA7Zm9yKGxldCBpPWUubGVuZ3RoLTE7aT49MTstLWkpaWYoZS5jaGFyQ29kZUF0KGkpPT09b2Upe2lmKCFyKXtuPWk7YnJlYWt9fWVsc2Ugcj0hMTtyZXR1cm4gbj09PS0xP3Q/Ii8iOiIuIjp0JiZuPT09MT8iLy8iOmUuc2xpY2UoMCxuKX0sYmFzZW5hbWUoZSx0KXt0IT09dm9pZCAwJiZLKHQsImV4dCIpLEsoZSwicGF0aCIpO2xldCBuPTAscj0tMSxpPSEwLHM7aWYodCE9PXZvaWQgMCYmdC5sZW5ndGg+MCYmdC5sZW5ndGg8PWUubGVuZ3RoKXtpZih0PT09ZSlyZXR1cm4iIjtsZXQgYT10Lmxlbmd0aC0xLGw9LTE7Zm9yKHM9ZS5sZW5ndGgtMTtzPj0wOy0tcyl7Y29uc3Qgbz1lLmNoYXJDb2RlQXQocyk7aWYobz09PW9lKXtpZighaSl7bj1zKzE7YnJlYWt9fWVsc2UgbD09PS0xJiYoaT0hMSxsPXMrMSksYT49MCYmKG89PT10LmNoYXJDb2RlQXQoYSk/LS1hPT09LTEmJihyPXMpOihhPS0xLHI9bCkpfXJldHVybiBuPT09cj9yPWw6cj09PS0xJiYocj1lLmxlbmd0aCksZS5zbGljZShuLHIpfWZvcihzPWUubGVuZ3RoLTE7cz49MDstLXMpaWYoZS5jaGFyQ29kZUF0KHMpPT09b2Upe2lmKCFpKXtuPXMrMTticmVha319ZWxzZSByPT09LTEmJihpPSExLHI9cysxKTtyZXR1cm4gcj09PS0xPyIiOmUuc2xpY2UobixyKX0sZXh0bmFtZShlKXtLKGUsInBhdGgiKTtsZXQgdD0tMSxuPTAscj0tMSxpPSEwLHM9MDtmb3IobGV0IGE9ZS5sZW5ndGgtMTthPj0wOy0tYSl7Y29uc3QgbD1lLmNoYXJDb2RlQXQoYSk7aWYobD09PW9lKXtpZighaSl7bj1hKzE7YnJlYWt9Y29udGludWV9cj09PS0xJiYoaT0hMSxyPWErMSksbD09PUdlP3Q9PT0tMT90PWE6cyE9PTEmJihzPTEpOnQhPT0tMSYmKHM9LTEpfXJldHVybiB0PT09LTF8fHI9PT0tMXx8cz09PTB8fHM9PT0xJiZ0PT09ci0xJiZ0PT09bisxPyIiOmUuc2xpY2UodCxyKX0sZm9ybWF0Om1pLmJpbmQobnVsbCwiLyIpLHBhcnNlKGUpe0soZSwicGF0aCIpO2NvbnN0IHQ9e3Jvb3Q6IiIsZGlyOiIiLGJhc2U6IiIsZXh0OiIiLG5hbWU6IiJ9O2lmKGUubGVuZ3RoPT09MClyZXR1cm4gdDtjb25zdCBuPWUuY2hhckNvZGVBdCgwKT09PW9lO2xldCByO24/KHQucm9vdD0iLyIscj0xKTpyPTA7bGV0IGk9LTEscz0wLGE9LTEsbD0hMCxvPWUubGVuZ3RoLTEsdT0wO2Zvcig7bz49cjstLW8pe2NvbnN0IGg9ZS5jaGFyQ29kZUF0KG8pO2lmKGg9PT1vZSl7aWYoIWwpe3M9bysxO2JyZWFrfWNvbnRpbnVlfWE9PT0tMSYmKGw9ITEsYT1vKzEpLGg9PT1HZT9pPT09LTE/aT1vOnUhPT0xJiYodT0xKTppIT09LTEmJih1PS0xKX1pZihhIT09LTEpe2NvbnN0IGg9cz09PTAmJm4/MTpzO2k9PT0tMXx8dT09PTB8fHU9PT0xJiZpPT09YS0xJiZpPT09cysxP3QuYmFzZT10Lm5hbWU9ZS5zbGljZShoLGEpOih0Lm5hbWU9ZS5zbGljZShoLGkpLHQuYmFzZT1lLnNsaWNlKGgsYSksdC5leHQ9ZS5zbGljZShpLGEpKX1yZXR1cm4gcz4wP3QuZGlyPWUuc2xpY2UoMCxzLTEpOm4mJih0LmRpcj0iLyIpLHR9LHNlcDoiLyIsZGVsaW1pdGVyOiI6Iix3aW4zMjpudWxsLHBvc2l4Om51bGx9O2ZlLndpbjMyPWNlLndpbjMyPWNlLGZlLnBvc2l4PWNlLnBvc2l4PWZlLHFlP2NlLm5vcm1hbGl6ZTpmZS5ub3JtYWxpemU7Y29uc3QgVmw9cWU/Y2Uuam9pbjpmZS5qb2luO3FlP2NlLnJlc29sdmU6ZmUucmVzb2x2ZSxxZT9jZS5yZWxhdGl2ZTpmZS5yZWxhdGl2ZSxxZT9jZS5kaXJuYW1lOmZlLmRpcm5hbWUscWU/Y2UuYmFzZW5hbWU6ZmUuYmFzZW5hbWUscWU/Y2UuZXh0bmFtZTpmZS5leHRuYW1lLHFlP2NlLnNlcDpmZS5zZXA7Y29uc3QgRGw9L15cd1tcd1xkKy4tXSokLyxPbD0vXlwvLywkbD0vXlwvXC8vO2Z1bmN0aW9uIFVsKGUsdCl7aWYoIWUuc2NoZW1lJiZ0KXRocm93IG5ldyBFcnJvcihgW1VyaUVycm9yXTogU2NoZW1lIGlzIG1pc3Npbmc6IHtzY2hlbWU6ICIiLCBhdXRob3JpdHk6ICIke2UuYXV0aG9yaXR5fSIsIHBhdGg6ICIke2UucGF0aH0iLCBxdWVyeTogIiR7ZS5xdWVyeX0iLCBmcmFnbWVudDogIiR7ZS5mcmFnbWVudH0ifWApO2lmKGUuc2NoZW1lJiYhRGwudGVzdChlLnNjaGVtZSkpdGhyb3cgbmV3IEVycm9yKCJbVXJpRXJyb3JdOiBTY2hlbWUgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzLiIpO2lmKGUucGF0aCl7aWYoZS5hdXRob3JpdHkpe2lmKCFPbC50ZXN0KGUucGF0aCkpdGhyb3cgbmV3IEVycm9yKCdbVXJpRXJyb3JdOiBJZiBhIFVSSSBjb250YWlucyBhbiBhdXRob3JpdHkgY29tcG9uZW50LCB0aGVuIHRoZSBwYXRoIGNvbXBvbmVudCBtdXN0IGVpdGhlciBiZSBlbXB0eSBvciBiZWdpbiB3aXRoIGEgc2xhc2ggKCIvIikgY2hhcmFjdGVyJyl9ZWxzZSBpZigkbC50ZXN0KGUucGF0aCkpdGhyb3cgbmV3IEVycm9yKCdbVXJpRXJyb3JdOiBJZiBhIFVSSSBkb2VzIG5vdCBjb250YWluIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY2Fubm90IGJlZ2luIHdpdGggdHdvIHNsYXNoIGNoYXJhY3RlcnMgKCIvLyIpJyl9fWZ1bmN0aW9uIEJsKGUsdCl7cmV0dXJuIWUmJiF0PyJmaWxlIjplfWZ1bmN0aW9uIHFsKGUsdCl7c3dpdGNoKGUpe2Nhc2UiaHR0cHMiOmNhc2UiaHR0cCI6Y2FzZSJmaWxlIjp0P3RbMF0hPT1rZSYmKHQ9a2UrdCk6dD1rZTticmVha31yZXR1cm4gdH1jb25zdCBKPSIiLGtlPSIvIixqbD0vXigoW146Lz8jXSs/KTopPyhcL1wvKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/LztsZXQgSWU9Y2xhc3MgV257c3RhdGljIGlzVXJpKHQpe3JldHVybiB0IGluc3RhbmNlb2YgV24/ITA6dD90eXBlb2YgdC5hdXRob3JpdHk9PSJzdHJpbmciJiZ0eXBlb2YgdC5mcmFnbWVudD09InN0cmluZyImJnR5cGVvZiB0LnBhdGg9PSJzdHJpbmciJiZ0eXBlb2YgdC5xdWVyeT09InN0cmluZyImJnR5cGVvZiB0LnNjaGVtZT09InN0cmluZyImJnR5cGVvZiB0LmZzUGF0aD09InN0cmluZyImJnR5cGVvZiB0LndpdGg9PSJmdW5jdGlvbiImJnR5cGVvZiB0LnRvU3RyaW5nPT0iZnVuY3Rpb24iOiExfWNvbnN0cnVjdG9yKHQsbixyLGkscyxhPSExKXt0eXBlb2YgdD09Im9iamVjdCI/KHRoaXMuc2NoZW1lPXQuc2NoZW1lfHxKLHRoaXMuYXV0aG9yaXR5PXQuYXV0aG9yaXR5fHxKLHRoaXMucGF0aD10LnBhdGh8fEosdGhpcy5xdWVyeT10LnF1ZXJ5fHxKLHRoaXMuZnJhZ21lbnQ9dC5mcmFnbWVudHx8Sik6KHRoaXMuc2NoZW1lPUJsKHQsYSksdGhpcy5hdXRob3JpdHk9bnx8Six0aGlzLnBhdGg9cWwodGhpcy5zY2hlbWUscnx8SiksdGhpcy5xdWVyeT1pfHxKLHRoaXMuZnJhZ21lbnQ9c3x8SixVbCh0aGlzLGEpKX1nZXQgZnNQYXRoKCl7cmV0dXJuIGlyKHRoaXMsITEpfXdpdGgodCl7aWYoIXQpcmV0dXJuIHRoaXM7bGV0e3NjaGVtZTpuLGF1dGhvcml0eTpyLHBhdGg6aSxxdWVyeTpzLGZyYWdtZW50OmF9PXQ7cmV0dXJuIG49PT12b2lkIDA/bj10aGlzLnNjaGVtZTpuPT09bnVsbCYmKG49Sikscj09PXZvaWQgMD9yPXRoaXMuYXV0aG9yaXR5OnI9PT1udWxsJiYocj1KKSxpPT09dm9pZCAwP2k9dGhpcy5wYXRoOmk9PT1udWxsJiYoaT1KKSxzPT09dm9pZCAwP3M9dGhpcy5xdWVyeTpzPT09bnVsbCYmKHM9SiksYT09PXZvaWQgMD9hPXRoaXMuZnJhZ21lbnQ6YT09PW51bGwmJihhPUopLG49PT10aGlzLnNjaGVtZSYmcj09PXRoaXMuYXV0aG9yaXR5JiZpPT09dGhpcy5wYXRoJiZzPT09dGhpcy5xdWVyeSYmYT09PXRoaXMuZnJhZ21lbnQ/dGhpczpuZXcgYnQobixyLGkscyxhKX1zdGF0aWMgcGFyc2UodCxuPSExKXtjb25zdCByPWpsLmV4ZWModCk7cmV0dXJuIHI/bmV3IGJ0KHJbMl18fEosZG4ocls0XXx8SiksZG4ocls1XXx8SiksZG4ocls3XXx8SiksZG4ocls5XXx8Siksbik6bmV3IGJ0KEosSixKLEosSil9c3RhdGljIGZpbGUodCl7bGV0IG49SjtpZihVdCYmKHQ9dC5yZXBsYWNlKC9cXC9nLGtlKSksdFswXT09PWtlJiZ0WzFdPT09a2Upe2NvbnN0IHI9dC5pbmRleE9mKGtlLDIpO3I9PT0tMT8obj10LnN1YnN0cmluZygyKSx0PWtlKToobj10LnN1YnN0cmluZygyLHIpLHQ9dC5zdWJzdHJpbmcocil8fGtlKX1yZXR1cm4gbmV3IGJ0KCJmaWxlIixuLHQsSixKKX1zdGF0aWMgZnJvbSh0LG4pe3JldHVybiBuZXcgYnQodC5zY2hlbWUsdC5hdXRob3JpdHksdC5wYXRoLHQucXVlcnksdC5mcmFnbWVudCxuKX1zdGF0aWMgam9pblBhdGgodCwuLi5uKXtpZighdC5wYXRoKXRocm93IG5ldyBFcnJvcigiW1VyaUVycm9yXTogY2Fubm90IGNhbGwgam9pblBhdGggb24gVVJJIHdpdGhvdXQgcGF0aCIpO2xldCByO3JldHVybiBVdCYmdC5zY2hlbWU9PT0iZmlsZSI/cj1Xbi5maWxlKGNlLmpvaW4oaXIodCwhMCksLi4ubikpLnBhdGg6cj1mZS5qb2luKHQucGF0aCwuLi5uKSx0LndpdGgoe3BhdGg6cn0pfXRvU3RyaW5nKHQ9ITEpe3JldHVybiBzcih0aGlzLHQpfXRvSlNPTigpe3JldHVybiB0aGlzfXN0YXRpYyByZXZpdmUodCl7aWYodCl7aWYodCBpbnN0YW5jZW9mIFduKXJldHVybiB0O3tjb25zdCBuPW5ldyBidCh0KTtyZXR1cm4gbi5fZm9ybWF0dGVkPXQuZXh0ZXJuYWw/P251bGwsbi5fZnNQYXRoPXQuX3NlcD09PWdpP3QuZnNQYXRoPz9udWxsOm51bGwsbn19ZWxzZSByZXR1cm4gdH19O2NvbnN0IGdpPVV0PzE6dm9pZCAwO2NsYXNzIGJ0IGV4dGVuZHMgSWV7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2Zvcm1hdHRlZD1udWxsLHRoaXMuX2ZzUGF0aD1udWxsfWdldCBmc1BhdGgoKXtyZXR1cm4gdGhpcy5fZnNQYXRofHwodGhpcy5fZnNQYXRoPWlyKHRoaXMsITEpKSx0aGlzLl9mc1BhdGh9dG9TdHJpbmcodD0hMSl7cmV0dXJuIHQ/c3IodGhpcywhMCk6KHRoaXMuX2Zvcm1hdHRlZHx8KHRoaXMuX2Zvcm1hdHRlZD1zcih0aGlzLCExKSksdGhpcy5fZm9ybWF0dGVkKX10b0pTT04oKXtjb25zdCB0PXskbWlkOjF9O3JldHVybiB0aGlzLl9mc1BhdGgmJih0LmZzUGF0aD10aGlzLl9mc1BhdGgsdC5fc2VwPWdpKSx0aGlzLl9mb3JtYXR0ZWQmJih0LmV4dGVybmFsPXRoaXMuX2Zvcm1hdHRlZCksdGhpcy5wYXRoJiYodC5wYXRoPXRoaXMucGF0aCksdGhpcy5zY2hlbWUmJih0LnNjaGVtZT10aGlzLnNjaGVtZSksdGhpcy5hdXRob3JpdHkmJih0LmF1dGhvcml0eT10aGlzLmF1dGhvcml0eSksdGhpcy5xdWVyeSYmKHQucXVlcnk9dGhpcy5xdWVyeSksdGhpcy5mcmFnbWVudCYmKHQuZnJhZ21lbnQ9dGhpcy5mcmFnbWVudCksdH19Y29uc3QgcGk9ezU4OiIlM0EiLDQ3OiIlMkYiLDYzOiIlM0YiLDM1OiIlMjMiLDkxOiIlNUIiLDkzOiIlNUQiLDY0OiIlNDAiLDMzOiIlMjEiLDM2OiIlMjQiLDM4OiIlMjYiLDM5OiIlMjciLDQwOiIlMjgiLDQxOiIlMjkiLDQyOiIlMkEiLDQzOiIlMkIiLDQ0OiIlMkMiLDU5OiIlM0IiLDYxOiIlM0QiLDMyOiIlMjAifTtmdW5jdGlvbiBiaShlLHQsbil7bGV0IHIsaT0tMTtmb3IobGV0IHM9MDtzPGUubGVuZ3RoO3MrKyl7Y29uc3QgYT1lLmNoYXJDb2RlQXQocyk7aWYoYT49OTcmJmE8PTEyMnx8YT49NjUmJmE8PTkwfHxhPj00OCYmYTw9NTd8fGE9PT00NXx8YT09PTQ2fHxhPT09OTV8fGE9PT0xMjZ8fHQmJmE9PT00N3x8biYmYT09PTkxfHxuJiZhPT09OTN8fG4mJmE9PT01OClpIT09LTEmJihyKz1lbmNvZGVVUklDb21wb25lbnQoZS5zdWJzdHJpbmcoaSxzKSksaT0tMSksciE9PXZvaWQgMCYmKHIrPWUuY2hhckF0KHMpKTtlbHNle3I9PT12b2lkIDAmJihyPWUuc3Vic3RyKDAscykpO2NvbnN0IGw9cGlbYV07bCE9PXZvaWQgMD8oaSE9PS0xJiYocis9ZW5jb2RlVVJJQ29tcG9uZW50KGUuc3Vic3RyaW5nKGkscykpLGk9LTEpLHIrPWwpOmk9PT0tMSYmKGk9cyl9fXJldHVybiBpIT09LTEmJihyKz1lbmNvZGVVUklDb21wb25lbnQoZS5zdWJzdHJpbmcoaSkpKSxyIT09dm9pZCAwP3I6ZX1mdW5jdGlvbiBXbChlKXtsZXQgdDtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7Y29uc3Qgcj1lLmNoYXJDb2RlQXQobik7cj09PTM1fHxyPT09NjM/KHQ9PT12b2lkIDAmJih0PWUuc3Vic3RyKDAsbikpLHQrPXBpW3JdKTp0IT09dm9pZCAwJiYodCs9ZVtuXSl9cmV0dXJuIHQhPT12b2lkIDA/dDplfWZ1bmN0aW9uIGlyKGUsdCl7bGV0IG47cmV0dXJuIGUuYXV0aG9yaXR5JiZlLnBhdGgubGVuZ3RoPjEmJmUuc2NoZW1lPT09ImZpbGUiP249YC8vJHtlLmF1dGhvcml0eX0ke2UucGF0aH1gOmUucGF0aC5jaGFyQ29kZUF0KDApPT09NDcmJihlLnBhdGguY2hhckNvZGVBdCgxKT49NjUmJmUucGF0aC5jaGFyQ29kZUF0KDEpPD05MHx8ZS5wYXRoLmNoYXJDb2RlQXQoMSk+PTk3JiZlLnBhdGguY2hhckNvZGVBdCgxKTw9MTIyKSYmZS5wYXRoLmNoYXJDb2RlQXQoMik9PT01OD90P249ZS5wYXRoLnN1YnN0cigxKTpuPWUucGF0aFsxXS50b0xvd2VyQ2FzZSgpK2UucGF0aC5zdWJzdHIoMik6bj1lLnBhdGgsVXQmJihuPW4ucmVwbGFjZSgvXC8vZywiXFwiKSksbn1mdW5jdGlvbiBzcihlLHQpe2NvbnN0IG49dD9XbDpiaTtsZXQgcj0iIix7c2NoZW1lOmksYXV0aG9yaXR5OnMscGF0aDphLHF1ZXJ5OmwsZnJhZ21lbnQ6b309ZTtpZihpJiYocis9aSxyKz0iOiIpLChzfHxpPT09ImZpbGUiKSYmKHIrPWtlLHIrPWtlKSxzKXtsZXQgdT1zLmluZGV4T2YoIkAiKTtpZih1IT09LTEpe2NvbnN0IGg9cy5zdWJzdHIoMCx1KTtzPXMuc3Vic3RyKHUrMSksdT1oLmxhc3RJbmRleE9mKCI6IiksdT09PS0xP3IrPW4oaCwhMSwhMSk6KHIrPW4oaC5zdWJzdHIoMCx1KSwhMSwhMSkscis9IjoiLHIrPW4oaC5zdWJzdHIodSsxKSwhMSwhMCkpLHIrPSJAIn1zPXMudG9Mb3dlckNhc2UoKSx1PXMubGFzdEluZGV4T2YoIjoiKSx1PT09LTE/cis9bihzLCExLCEwKToocis9bihzLnN1YnN0cigwLHUpLCExLCEwKSxyKz1zLnN1YnN0cih1KSl9aWYoYSl7aWYoYS5sZW5ndGg+PTMmJmEuY2hhckNvZGVBdCgwKT09PTQ3JiZhLmNoYXJDb2RlQXQoMik9PT01OCl7Y29uc3QgdT1hLmNoYXJDb2RlQXQoMSk7dT49NjUmJnU8PTkwJiYoYT1gLyR7U3RyaW5nLmZyb21DaGFyQ29kZSh1KzMyKX06JHthLnN1YnN0cigzKX1gKX1lbHNlIGlmKGEubGVuZ3RoPj0yJiZhLmNoYXJDb2RlQXQoMSk9PT01OCl7Y29uc3QgdT1hLmNoYXJDb2RlQXQoMCk7dT49NjUmJnU8PTkwJiYoYT1gJHtTdHJpbmcuZnJvbUNoYXJDb2RlKHUrMzIpfToke2Euc3Vic3RyKDIpfWApfXIrPW4oYSwhMCwhMSl9cmV0dXJuIGwmJihyKz0iPyIscis9bihsLCExLCExKSksbyYmKHIrPSIjIixyKz10P286YmkobywhMSwhMSkpLHJ9ZnVuY3Rpb24gdmkoZSl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2h7cmV0dXJuIGUubGVuZ3RoPjM/ZS5zdWJzdHIoMCwzKSt2aShlLnN1YnN0cigzKSk6ZX19Y29uc3QgeGk9LyglWzAtOUEtWmEtel1bMC05QS1aYS16XSkrL2c7ZnVuY3Rpb24gZG4oZSl7cmV0dXJuIGUubWF0Y2goeGkpP2UucmVwbGFjZSh4aSx0PT52aSh0KSk6ZX12YXIgUWU7KGZ1bmN0aW9uKGUpe2UuaW5NZW1vcnk9ImlubWVtb3J5IixlLnZzY29kZT0idnNjb2RlIixlLmludGVybmFsPSJwcml2YXRlIixlLndhbGtUaHJvdWdoPSJ3YWxrVGhyb3VnaCIsZS53YWxrVGhyb3VnaFNuaXBwZXQ9IndhbGtUaHJvdWdoU25pcHBldCIsZS5odHRwPSJodHRwIixlLmh0dHBzPSJodHRwcyIsZS5maWxlPSJmaWxlIixlLm1haWx0bz0ibWFpbHRvIixlLnVudGl0bGVkPSJ1bnRpdGxlZCIsZS5kYXRhPSJkYXRhIixlLmNvbW1hbmQ9ImNvbW1hbmQiLGUudnNjb2RlUmVtb3RlPSJ2c2NvZGUtcmVtb3RlIixlLnZzY29kZVJlbW90ZVJlc291cmNlPSJ2c2NvZGUtcmVtb3RlLXJlc291cmNlIixlLnZzY29kZU1hbmFnZWRSZW1vdGVSZXNvdXJjZT0idnNjb2RlLW1hbmFnZWQtcmVtb3RlLXJlc291cmNlIixlLnZzY29kZVVzZXJEYXRhPSJ2c2NvZGUtdXNlcmRhdGEiLGUudnNjb2RlQ3VzdG9tRWRpdG9yPSJ2c2NvZGUtY3VzdG9tLWVkaXRvciIsZS52c2NvZGVOb3RlYm9va0NlbGw9InZzY29kZS1ub3RlYm9vay1jZWxsIixlLnZzY29kZU5vdGVib29rQ2VsbE1ldGFkYXRhPSJ2c2NvZGUtbm90ZWJvb2stY2VsbC1tZXRhZGF0YSIsZS52c2NvZGVOb3RlYm9va0NlbGxNZXRhZGF0YURpZmY9InZzY29kZS1ub3RlYm9vay1jZWxsLW1ldGFkYXRhLWRpZmYiLGUudnNjb2RlTm90ZWJvb2tDZWxsT3V0cHV0PSJ2c2NvZGUtbm90ZWJvb2stY2VsbC1vdXRwdXQiLGUudnNjb2RlTm90ZWJvb2tDZWxsT3V0cHV0RGlmZj0idnNjb2RlLW5vdGVib29rLWNlbGwtb3V0cHV0LWRpZmYiLGUudnNjb2RlTm90ZWJvb2tNZXRhZGF0YT0idnNjb2RlLW5vdGVib29rLW1ldGFkYXRhIixlLnZzY29kZUludGVyYWN0aXZlSW5wdXQ9InZzY29kZS1pbnRlcmFjdGl2ZS1pbnB1dCIsZS52c2NvZGVTZXR0aW5ncz0idnNjb2RlLXNldHRpbmdzIixlLnZzY29kZVdvcmtzcGFjZVRydXN0PSJ2c2NvZGUtd29ya3NwYWNlLXRydXN0IixlLnZzY29kZVRlcm1pbmFsPSJ2c2NvZGUtdGVybWluYWwiLGUudnNjb2RlQ2hhdENvZGVCbG9jaz0idnNjb2RlLWNoYXQtY29kZS1ibG9jayIsZS52c2NvZGVDaGF0Q29kZUNvbXBhcmVCbG9jaz0idnNjb2RlLWNoYXQtY29kZS1jb21wYXJlLWJsb2NrIixlLnZzY29kZUNoYXRTZXNzc2lvbj0idnNjb2RlLWNoYXQtZWRpdG9yIixlLndlYnZpZXdQYW5lbD0id2Vidmlldy1wYW5lbCIsZS52c2NvZGVXZWJ2aWV3PSJ2c2NvZGUtd2VidmlldyIsZS5leHRlbnNpb249ImV4dGVuc2lvbiIsZS52c2NvZGVGaWxlUmVzb3VyY2U9InZzY29kZS1maWxlIixlLnRtcD0idG1wIixlLnZzbHM9InZzbHMiLGUudnNjb2RlU291cmNlQ29udHJvbD0idnNjb2RlLXNjbSIsZS5jb21tZW50c0lucHV0PSJjb21tZW50IixlLmNvZGVTZXR0aW5nPSJjb2RlLXNldHRpbmciLGUub3V0cHV0Q2hhbm5lbD0ib3V0cHV0In0pKFFlfHwoUWU9e30pKTtjb25zdCBIbD0idGtuIjtjbGFzcyB6bHtjb25zdHJ1Y3Rvcigpe3RoaXMuX2hvc3RzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fcG9ydHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9jb25uZWN0aW9uVG9rZW5zPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fcHJlZmVycmVkV2ViU2NoZW1hPSJodHRwIix0aGlzLl9kZWxlZ2F0ZT1udWxsLHRoaXMuX3NlcnZlclJvb3RQYXRoPSIvIn1zZXRQcmVmZXJyZWRXZWJTY2hlbWEodCl7dGhpcy5fcHJlZmVycmVkV2ViU2NoZW1hPXR9Z2V0IF9yZW1vdGVSZXNvdXJjZXNQYXRoKCl7cmV0dXJuIGZlLmpvaW4odGhpcy5fc2VydmVyUm9vdFBhdGgsUWUudnNjb2RlUmVtb3RlUmVzb3VyY2UpfXJld3JpdGUodCl7aWYodGhpcy5fZGVsZWdhdGUpdHJ5e3JldHVybiB0aGlzLl9kZWxlZ2F0ZSh0KX1jYXRjaChsKXtyZXR1cm4gVGUobCksdH1jb25zdCBuPXQuYXV0aG9yaXR5O2xldCByPXRoaXMuX2hvc3RzW25dO3ImJnIuaW5kZXhPZigiOiIpIT09LTEmJnIuaW5kZXhPZigiWyIpPT09LTEmJihyPWBbJHtyfV1gKTtjb25zdCBpPXRoaXMuX3BvcnRzW25dLHM9dGhpcy5fY29ubmVjdGlvblRva2Vuc1tuXTtsZXQgYT1gcGF0aD0ke2VuY29kZVVSSUNvbXBvbmVudCh0LnBhdGgpfWA7cmV0dXJuIHR5cGVvZiBzPT0ic3RyaW5nIiYmKGErPWAmJHtIbH09JHtlbmNvZGVVUklDb21wb25lbnQocyl9YCksSWUuZnJvbSh7c2NoZW1lOmZsP3RoaXMuX3ByZWZlcnJlZFdlYlNjaGVtYTpRZS52c2NvZGVSZW1vdGVSZXNvdXJjZSxhdXRob3JpdHk6YCR7cn06JHtpfWAscGF0aDp0aGlzLl9yZW1vdGVSZXNvdXJjZXNQYXRoLHF1ZXJ5OmF9KX19Y29uc3QgR2w9bmV3IHpsLEpsPSJ2c2NvZGUtYXBwIixubj1jbGFzcyBubnthc0Jyb3dzZXJVcmkodCl7Y29uc3Qgbj10aGlzLnRvVXJpKHQpO3JldHVybiB0aGlzLnVyaVRvQnJvd3NlclVyaShuKX11cmlUb0Jyb3dzZXJVcmkodCl7cmV0dXJuIHQuc2NoZW1lPT09UWUudnNjb2RlUmVtb3RlP0dsLnJld3JpdGUodCk6dC5zY2hlbWU9PT1RZS5maWxlJiYoY2x8fGhsPT09YCR7UWUudnNjb2RlRmlsZVJlc291cmNlfTovLyR7bm4uRkFMTEJBQ0tfQVVUSE9SSVRZfWApP3Qud2l0aCh7c2NoZW1lOlFlLnZzY29kZUZpbGVSZXNvdXJjZSxhdXRob3JpdHk6dC5hdXRob3JpdHl8fG5uLkZBTExCQUNLX0FVVEhPUklUWSxxdWVyeTpudWxsLGZyYWdtZW50Om51bGx9KTp0fXRvVXJpKHQsbil7aWYoSWUuaXNVcmkodCkpcmV0dXJuIHQ7aWYoZ2xvYmFsVGhpcy5fVlNDT0RFX0ZJTEVfUk9PVCl7Y29uc3Qgcj1nbG9iYWxUaGlzLl9WU0NPREVfRklMRV9ST09UO2lmKC9eXHdbXHdcZCsuLV0qOlwvXC8vLnRlc3QocikpcmV0dXJuIEllLmpvaW5QYXRoKEllLnBhcnNlKHIsITApLHQpO2NvbnN0IGk9Vmwocix0KTtyZXR1cm4gSWUuZmlsZShpKX1yZXR1cm4gSWUucGFyc2Uobi50b1VybCh0KSl9fTtubi5GQUxMQkFDS19BVVRIT1JJVFk9Smw7bGV0IGFyPW5uO2NvbnN0IHlpPW5ldyBhcjt2YXIgd2k7KGZ1bmN0aW9uKGUpe2NvbnN0IHQ9bmV3IE1hcChbWyIxIix7IkNyb3NzLU9yaWdpbi1PcGVuZXItUG9saWN5Ijoic2FtZS1vcmlnaW4ifV0sWyIyIix7IkNyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3kiOiJyZXF1aXJlLWNvcnAifV0sWyIzIix7IkNyb3NzLU9yaWdpbi1PcGVuZXItUG9saWN5Ijoic2FtZS1vcmlnaW4iLCJDcm9zcy1PcmlnaW4tRW1iZWRkZXItUG9saWN5IjoicmVxdWlyZS1jb3JwIn1dXSk7ZS5Db29wQW5kQ29lcD1PYmplY3QuZnJlZXplKHQuZ2V0KCIzIikpO2NvbnN0IG49InZzY29kZS1jb2kiO2Z1bmN0aW9uIHIocyl7bGV0IGE7dHlwZW9mIHM9PSJzdHJpbmciP2E9bmV3IFVSTChzKS5zZWFyY2hQYXJhbXM6cyBpbnN0YW5jZW9mIFVSTD9hPXMuc2VhcmNoUGFyYW1zOkllLmlzVXJpKHMpJiYoYT1uZXcgVVJMKHMudG9TdHJpbmcoITApKS5zZWFyY2hQYXJhbXMpO2NvbnN0IGw9YT09bnVsbD92b2lkIDA6YS5nZXQobik7aWYobClyZXR1cm4gdC5nZXQobCl9ZS5nZXRIZWFkZXJzRnJvbVF1ZXJ5PXI7ZnVuY3Rpb24gaShzLGEsbCl7aWYoIWdsb2JhbFRoaXMuY3Jvc3NPcmlnaW5Jc29sYXRlZClyZXR1cm47Y29uc3Qgbz1hJiZsPyIzIjpsPyIyIjoiMSI7cyBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcz9zLnNldChuLG8pOnNbbl09b31lLmFkZFNlYXJjaFBhcmFtPWl9KSh3aXx8KHdpPXt9KSk7Y29uc3Qgb3I9ImRlZmF1bHQiLFhsPSIkaW5pdGlhbGl6ZSI7Y2xhc3MgUWx7Y29uc3RydWN0b3IodCxuLHIsaSxzKXt0aGlzLnZzV29ya2VyPXQsdGhpcy5yZXE9bix0aGlzLmNoYW5uZWw9cix0aGlzLm1ldGhvZD1pLHRoaXMuYXJncz1zLHRoaXMudHlwZT0wfX1jbGFzcyBfaXtjb25zdHJ1Y3Rvcih0LG4scixpKXt0aGlzLnZzV29ya2VyPXQsdGhpcy5zZXE9bix0aGlzLnJlcz1yLHRoaXMuZXJyPWksdGhpcy50eXBlPTF9fWNsYXNzIFlse2NvbnN0cnVjdG9yKHQsbixyLGkscyl7dGhpcy52c1dvcmtlcj10LHRoaXMucmVxPW4sdGhpcy5jaGFubmVsPXIsdGhpcy5ldmVudE5hbWU9aSx0aGlzLmFyZz1zLHRoaXMudHlwZT0yfX1jbGFzcyBabHtjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy52c1dvcmtlcj10LHRoaXMucmVxPW4sdGhpcy5ldmVudD1yLHRoaXMudHlwZT0zfX1jbGFzcyBLbHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMudnNXb3JrZXI9dCx0aGlzLnJlcT1uLHRoaXMudHlwZT00fX1jbGFzcyBldXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl93b3JrZXJJZD0tMSx0aGlzLl9oYW5kbGVyPXQsdGhpcy5fbGFzdFNlbnRSZXE9MCx0aGlzLl9wZW5kaW5nUmVwbGllcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX3BlbmRpbmdFbWl0dGVycz1uZXcgTWFwLHRoaXMuX3BlbmRpbmdFdmVudHM9bmV3IE1hcH1zZXRXb3JrZXJJZCh0KXt0aGlzLl93b3JrZXJJZD10fXNlbmRNZXNzYWdlKHQsbixyKXtjb25zdCBpPVN0cmluZygrK3RoaXMuX2xhc3RTZW50UmVxKTtyZXR1cm4gbmV3IFByb21pc2UoKHMsYSk9Pnt0aGlzLl9wZW5kaW5nUmVwbGllc1tpXT17cmVzb2x2ZTpzLHJlamVjdDphfSx0aGlzLl9zZW5kKG5ldyBRbCh0aGlzLl93b3JrZXJJZCxpLHQsbixyKSl9KX1saXN0ZW4odCxuLHIpe2xldCBpPW51bGw7Y29uc3Qgcz1uZXcgX2Uoe29uV2lsbEFkZEZpcnN0TGlzdGVuZXI6KCk9PntpPVN0cmluZygrK3RoaXMuX2xhc3RTZW50UmVxKSx0aGlzLl9wZW5kaW5nRW1pdHRlcnMuc2V0KGkscyksdGhpcy5fc2VuZChuZXcgWWwodGhpcy5fd29ya2VySWQsaSx0LG4scikpfSxvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcjooKT0+e3RoaXMuX3BlbmRpbmdFbWl0dGVycy5kZWxldGUoaSksdGhpcy5fc2VuZChuZXcgS2wodGhpcy5fd29ya2VySWQsaSkpLGk9bnVsbH19KTtyZXR1cm4gcy5ldmVudH1oYW5kbGVNZXNzYWdlKHQpeyF0fHwhdC52c1dvcmtlcnx8dGhpcy5fd29ya2VySWQhPT0tMSYmdC52c1dvcmtlciE9PXRoaXMuX3dvcmtlcklkfHx0aGlzLl9oYW5kbGVNZXNzYWdlKHQpfWNyZWF0ZVByb3h5VG9SZW1vdGVDaGFubmVsKHQsbil7Y29uc3Qgcj17Z2V0OihpLHMpPT4odHlwZW9mIHM9PSJzdHJpbmciJiYhaVtzXSYmKE5pKHMpP2lbc109YT0+dGhpcy5saXN0ZW4odCxzLGEpOkxpKHMpP2lbc109dGhpcy5saXN0ZW4odCxzLHZvaWQgMCk6cy5jaGFyQ29kZUF0KDApPT09MzYmJihpW3NdPWFzeW5jKC4uLmEpPT4oYXdhaXQobj09bnVsbD92b2lkIDA6bigpKSx0aGlzLnNlbmRNZXNzYWdlKHQscyxhKSkpKSxpW3NdKX07cmV0dXJuIG5ldyBQcm94eShPYmplY3QuY3JlYXRlKG51bGwpLHIpfV9oYW5kbGVNZXNzYWdlKHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UgMTpyZXR1cm4gdGhpcy5faGFuZGxlUmVwbHlNZXNzYWdlKHQpO2Nhc2UgMDpyZXR1cm4gdGhpcy5faGFuZGxlUmVxdWVzdE1lc3NhZ2UodCk7Y2FzZSAyOnJldHVybiB0aGlzLl9oYW5kbGVTdWJzY3JpYmVFdmVudE1lc3NhZ2UodCk7Y2FzZSAzOnJldHVybiB0aGlzLl9oYW5kbGVFdmVudE1lc3NhZ2UodCk7Y2FzZSA0OnJldHVybiB0aGlzLl9oYW5kbGVVbnN1YnNjcmliZUV2ZW50TWVzc2FnZSh0KX19X2hhbmRsZVJlcGx5TWVzc2FnZSh0KXtpZighdGhpcy5fcGVuZGluZ1JlcGxpZXNbdC5zZXFdKXtjb25zb2xlLndhcm4oIkdvdCByZXBseSB0byB1bmtub3duIHNlcSIpO3JldHVybn1jb25zdCBuPXRoaXMuX3BlbmRpbmdSZXBsaWVzW3Quc2VxXTtpZihkZWxldGUgdGhpcy5fcGVuZGluZ1JlcGxpZXNbdC5zZXFdLHQuZXJyKXtsZXQgcj10LmVycjt0LmVyci4kaXNFcnJvciYmKHI9bmV3IEVycm9yLHIubmFtZT10LmVyci5uYW1lLHIubWVzc2FnZT10LmVyci5tZXNzYWdlLHIuc3RhY2s9dC5lcnIuc3RhY2spLG4ucmVqZWN0KHIpO3JldHVybn1uLnJlc29sdmUodC5yZXMpfV9oYW5kbGVSZXF1ZXN0TWVzc2FnZSh0KXtjb25zdCBuPXQucmVxO3RoaXMuX2hhbmRsZXIuaGFuZGxlTWVzc2FnZSh0LmNoYW5uZWwsdC5tZXRob2QsdC5hcmdzKS50aGVuKGk9Pnt0aGlzLl9zZW5kKG5ldyBfaSh0aGlzLl93b3JrZXJJZCxuLGksdm9pZCAwKSl9LGk9PntpLmRldGFpbCBpbnN0YW5jZW9mIEVycm9yJiYoaS5kZXRhaWw9c2koaS5kZXRhaWwpKSx0aGlzLl9zZW5kKG5ldyBfaSh0aGlzLl93b3JrZXJJZCxuLHZvaWQgMCxzaShpKSkpfSl9X2hhbmRsZVN1YnNjcmliZUV2ZW50TWVzc2FnZSh0KXtjb25zdCBuPXQucmVxLHI9dGhpcy5faGFuZGxlci5oYW5kbGVFdmVudCh0LmNoYW5uZWwsdC5ldmVudE5hbWUsdC5hcmcpKGk9Pnt0aGlzLl9zZW5kKG5ldyBabCh0aGlzLl93b3JrZXJJZCxuLGkpKX0pO3RoaXMuX3BlbmRpbmdFdmVudHMuc2V0KG4scil9X2hhbmRsZUV2ZW50TWVzc2FnZSh0KXtpZighdGhpcy5fcGVuZGluZ0VtaXR0ZXJzLmhhcyh0LnJlcSkpe2NvbnNvbGUud2FybigiR290IGV2ZW50IGZvciB1bmtub3duIHJlcSIpO3JldHVybn10aGlzLl9wZW5kaW5nRW1pdHRlcnMuZ2V0KHQucmVxKS5maXJlKHQuZXZlbnQpfV9oYW5kbGVVbnN1YnNjcmliZUV2ZW50TWVzc2FnZSh0KXtpZighdGhpcy5fcGVuZGluZ0V2ZW50cy5oYXModC5yZXEpKXtjb25zb2xlLndhcm4oIkdvdCB1bnN1YnNjcmliZSBmb3IgdW5rbm93biByZXEiKTtyZXR1cm59dGhpcy5fcGVuZGluZ0V2ZW50cy5nZXQodC5yZXEpLmRpc3Bvc2UoKSx0aGlzLl9wZW5kaW5nRXZlbnRzLmRlbGV0ZSh0LnJlcSl9X3NlbmQodCl7Y29uc3Qgbj1bXTtpZih0LnR5cGU9PT0wKWZvcihsZXQgcj0wO3I8dC5hcmdzLmxlbmd0aDtyKyspdC5hcmdzW3JdaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciYmbi5wdXNoKHQuYXJnc1tyXSk7ZWxzZSB0LnR5cGU9PT0xJiZ0LnJlcyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyJiZuLnB1c2godC5yZXMpO3RoaXMuX2hhbmRsZXIuc2VuZE1lc3NhZ2UodCxuKX19ZnVuY3Rpb24gTGkoZSl7cmV0dXJuIGVbMF09PT0ibyImJmVbMV09PT0ibiImJmhpKGUuY2hhckNvZGVBdCgyKSl9ZnVuY3Rpb24gTmkoZSl7cmV0dXJuL15vbkR5bmFtaWMvLnRlc3QoZSkmJmhpKGUuY2hhckNvZGVBdCg5KSl9Y2xhc3MgdHV7Y29uc3RydWN0b3IodCxuKXt0aGlzLl9sb2NhbENoYW5uZWxzPW5ldyBNYXAsdGhpcy5fcmVtb3RlQ2hhbm5lbHM9bmV3IE1hcCx0aGlzLl9yZXF1ZXN0SGFuZGxlckZhY3Rvcnk9bix0aGlzLl9yZXF1ZXN0SGFuZGxlcj1udWxsLHRoaXMuX3Byb3RvY29sPW5ldyBldSh7c2VuZE1lc3NhZ2U6KHIsaSk9Pnt0KHIsaSl9LGhhbmRsZU1lc3NhZ2U6KHIsaSxzKT0+dGhpcy5faGFuZGxlTWVzc2FnZShyLGkscyksaGFuZGxlRXZlbnQ6KHIsaSxzKT0+dGhpcy5faGFuZGxlRXZlbnQocixpLHMpfSl9b25tZXNzYWdlKHQpe3RoaXMuX3Byb3RvY29sLmhhbmRsZU1lc3NhZ2UodCl9X2hhbmRsZU1lc3NhZ2UodCxuLHIpe2lmKHQ9PT1vciYmbj09PVhsKXJldHVybiB0aGlzLmluaXRpYWxpemUoclswXSxyWzFdLHJbMl0pO2NvbnN0IGk9dD09PW9yP3RoaXMuX3JlcXVlc3RIYW5kbGVyOnRoaXMuX2xvY2FsQ2hhbm5lbHMuZ2V0KHQpO2lmKCFpKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE1pc3NpbmcgY2hhbm5lbCAke3R9IG9uIHdvcmtlciB0aHJlYWRgKSk7aWYodHlwZW9mIGlbbl0hPSJmdW5jdGlvbiIpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgTWlzc2luZyBtZXRob2QgJHtufSBvbiB3b3JrZXIgdGhyZWFkIGNoYW5uZWwgJHt0fWApKTt0cnl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShpW25dLmFwcGx5KGkscikpfWNhdGNoKHMpe3JldHVybiBQcm9taXNlLnJlamVjdChzKX19X2hhbmRsZUV2ZW50KHQsbixyKXtjb25zdCBpPXQ9PT1vcj90aGlzLl9yZXF1ZXN0SGFuZGxlcjp0aGlzLl9sb2NhbENoYW5uZWxzLmdldCh0KTtpZighaSl0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgY2hhbm5lbCAke3R9IG9uIHdvcmtlciB0aHJlYWRgKTtpZihOaShuKSl7Y29uc3Qgcz1pW25dLmNhbGwoaSxyKTtpZih0eXBlb2YgcyE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZHluYW1pYyBldmVudCAke259IG9uIHJlcXVlc3QgaGFuZGxlci5gKTtyZXR1cm4gc31pZihMaShuKSl7Y29uc3Qgcz1pW25dO2lmKHR5cGVvZiBzIT0iZnVuY3Rpb24iKXRocm93IG5ldyBFcnJvcihgTWlzc2luZyBldmVudCAke259IG9uIHJlcXVlc3QgaGFuZGxlci5gKTtyZXR1cm4gc310aHJvdyBuZXcgRXJyb3IoYE1hbGZvcm1lZCBldmVudCBuYW1lICR7bn1gKX1nZXRDaGFubmVsKHQpe2lmKCF0aGlzLl9yZW1vdGVDaGFubmVscy5oYXModCkpe2NvbnN0IG49dGhpcy5fcHJvdG9jb2wuY3JlYXRlUHJveHlUb1JlbW90ZUNoYW5uZWwodCk7dGhpcy5fcmVtb3RlQ2hhbm5lbHMuc2V0KHQsbil9cmV0dXJuIHRoaXMuX3JlbW90ZUNoYW5uZWxzLmdldCh0KX1hc3luYyBpbml0aWFsaXplKHQsbixyKXtpZih0aGlzLl9wcm90b2NvbC5zZXRXb3JrZXJJZCh0KSx0aGlzLl9yZXF1ZXN0SGFuZGxlckZhY3Rvcnkpe3RoaXMuX3JlcXVlc3RIYW5kbGVyPXRoaXMuX3JlcXVlc3RIYW5kbGVyRmFjdG9yeSh0aGlzKTtyZXR1cm59cmV0dXJuIG4mJih0eXBlb2Ygbi5iYXNlVXJsPCJ1IiYmZGVsZXRlIG4uYmFzZVVybCx0eXBlb2Ygbi5wYXRoczwidSImJnR5cGVvZiBuLnBhdGhzLnZzPCJ1IiYmZGVsZXRlIG4ucGF0aHMudnMsdHlwZW9mIG4udHJ1c3RlZFR5cGVzUG9saWN5PCJ1IiYmZGVsZXRlIG4udHJ1c3RlZFR5cGVzUG9saWN5LG4uY2F0Y2hFcnJvcj0hMCxnbG9iYWxUaGlzLnJlcXVpcmUuY29uZmlnKG4pKSxpbXBvcnQoYCR7eWkuYXNCcm93c2VyVXJpKGAke3J9LmpzYCkudG9TdHJpbmcoITApfWApLnRoZW4ocz0+e2lmKHRoaXMuX3JlcXVlc3RIYW5kbGVyPXMuY3JlYXRlKHRoaXMpLCF0aGlzLl9yZXF1ZXN0SGFuZGxlcil0aHJvdyBuZXcgRXJyb3IoIk5vIFJlcXVlc3RIYW5kbGVyISIpfSl9fWNsYXNzIFlle2NvbnN0cnVjdG9yKHQsbixyLGkpe3RoaXMub3JpZ2luYWxTdGFydD10LHRoaXMub3JpZ2luYWxMZW5ndGg9bix0aGlzLm1vZGlmaWVkU3RhcnQ9cix0aGlzLm1vZGlmaWVkTGVuZ3RoPWl9Z2V0T3JpZ2luYWxFbmQoKXtyZXR1cm4gdGhpcy5vcmlnaW5hbFN0YXJ0K3RoaXMub3JpZ2luYWxMZW5ndGh9Z2V0TW9kaWZpZWRFbmQoKXtyZXR1cm4gdGhpcy5tb2RpZmllZFN0YXJ0K3RoaXMubW9kaWZpZWRMZW5ndGh9fWZ1bmN0aW9uIFNpKGUsdCl7cmV0dXJuKHQ8PDUpLXQrZXwwfWZ1bmN0aW9uIG51KGUsdCl7dD1TaSgxNDk0MTcsdCk7Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXQ9U2koZS5jaGFyQ29kZUF0KG4pLHQpO3JldHVybiB0fWNsYXNzIEFpe2NvbnN0cnVjdG9yKHQpe3RoaXMuc291cmNlPXR9Z2V0RWxlbWVudHMoKXtjb25zdCB0PXRoaXMuc291cmNlLG49bmV3IEludDMyQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgcj0wLGk9dC5sZW5ndGg7cjxpO3IrKyluW3JdPXQuY2hhckNvZGVBdChyKTtyZXR1cm4gbn19ZnVuY3Rpb24gcnUoZSx0LG4pe3JldHVybiBuZXcgWmUobmV3IEFpKGUpLG5ldyBBaSh0KSkuQ29tcHV0ZURpZmYobikuY2hhbmdlc31jbGFzcyB2dHtzdGF0aWMgQXNzZXJ0KHQsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKG4pfX1jbGFzcyB4dHtzdGF0aWMgQ29weSh0LG4scixpLHMpe2ZvcihsZXQgYT0wO2E8czthKyspcltpK2FdPXRbbithXX1zdGF0aWMgQ29weTIodCxuLHIsaSxzKXtmb3IobGV0IGE9MDthPHM7YSsrKXJbaSthXT10W24rYV19fWNsYXNzIGtpe2NvbnN0cnVjdG9yKCl7dGhpcy5tX2NoYW5nZXM9W10sdGhpcy5tX29yaWdpbmFsU3RhcnQ9MTA3Mzc0MTgyNCx0aGlzLm1fbW9kaWZpZWRTdGFydD0xMDczNzQxODI0LHRoaXMubV9vcmlnaW5hbENvdW50PTAsdGhpcy5tX21vZGlmaWVkQ291bnQ9MH1NYXJrTmV4dENoYW5nZSgpeyh0aGlzLm1fb3JpZ2luYWxDb3VudD4wfHx0aGlzLm1fbW9kaWZpZWRDb3VudD4wKSYmdGhpcy5tX2NoYW5nZXMucHVzaChuZXcgWWUodGhpcy5tX29yaWdpbmFsU3RhcnQsdGhpcy5tX29yaWdpbmFsQ291bnQsdGhpcy5tX21vZGlmaWVkU3RhcnQsdGhpcy5tX21vZGlmaWVkQ291bnQpKSx0aGlzLm1fb3JpZ2luYWxDb3VudD0wLHRoaXMubV9tb2RpZmllZENvdW50PTAsdGhpcy5tX29yaWdpbmFsU3RhcnQ9MTA3Mzc0MTgyNCx0aGlzLm1fbW9kaWZpZWRTdGFydD0xMDczNzQxODI0fUFkZE9yaWdpbmFsRWxlbWVudCh0LG4pe3RoaXMubV9vcmlnaW5hbFN0YXJ0PU1hdGgubWluKHRoaXMubV9vcmlnaW5hbFN0YXJ0LHQpLHRoaXMubV9tb2RpZmllZFN0YXJ0PU1hdGgubWluKHRoaXMubV9tb2RpZmllZFN0YXJ0LG4pLHRoaXMubV9vcmlnaW5hbENvdW50Kyt9QWRkTW9kaWZpZWRFbGVtZW50KHQsbil7dGhpcy5tX29yaWdpbmFsU3RhcnQ9TWF0aC5taW4odGhpcy5tX29yaWdpbmFsU3RhcnQsdCksdGhpcy5tX21vZGlmaWVkU3RhcnQ9TWF0aC5taW4odGhpcy5tX21vZGlmaWVkU3RhcnQsbiksdGhpcy5tX21vZGlmaWVkQ291bnQrK31nZXRDaGFuZ2VzKCl7cmV0dXJuKHRoaXMubV9vcmlnaW5hbENvdW50PjB8fHRoaXMubV9tb2RpZmllZENvdW50PjApJiZ0aGlzLk1hcmtOZXh0Q2hhbmdlKCksdGhpcy5tX2NoYW5nZXN9Z2V0UmV2ZXJzZUNoYW5nZXMoKXtyZXR1cm4odGhpcy5tX29yaWdpbmFsQ291bnQ+MHx8dGhpcy5tX21vZGlmaWVkQ291bnQ+MCkmJnRoaXMuTWFya05leHRDaGFuZ2UoKSx0aGlzLm1fY2hhbmdlcy5yZXZlcnNlKCksdGhpcy5tX2NoYW5nZXN9fWNsYXNzIFple2NvbnN0cnVjdG9yKHQsbixyPW51bGwpe3RoaXMuQ29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlPXIsdGhpcy5fb3JpZ2luYWxTZXF1ZW5jZT10LHRoaXMuX21vZGlmaWVkU2VxdWVuY2U9bjtjb25zdFtpLHMsYV09WmUuX2dldEVsZW1lbnRzKHQpLFtsLG8sdV09WmUuX2dldEVsZW1lbnRzKG4pO3RoaXMuX2hhc1N0cmluZ3M9YSYmdSx0aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzPWksdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaD1zLHRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHM9bCx0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoPW8sdGhpcy5tX2ZvcndhcmRIaXN0b3J5PVtdLHRoaXMubV9yZXZlcnNlSGlzdG9yeT1bXX1zdGF0aWMgX2lzU3RyaW5nQXJyYXkodCl7cmV0dXJuIHQubGVuZ3RoPjAmJnR5cGVvZiB0WzBdPT0ic3RyaW5nIn1zdGF0aWMgX2dldEVsZW1lbnRzKHQpe2NvbnN0IG49dC5nZXRFbGVtZW50cygpO2lmKFplLl9pc1N0cmluZ0FycmF5KG4pKXtjb25zdCByPW5ldyBJbnQzMkFycmF5KG4ubGVuZ3RoKTtmb3IobGV0IGk9MCxzPW4ubGVuZ3RoO2k8cztpKyspcltpXT1udShuW2ldLDApO3JldHVybltuLHIsITBdfXJldHVybiBuIGluc3RhbmNlb2YgSW50MzJBcnJheT9bW10sbiwhMV06W1tdLG5ldyBJbnQzMkFycmF5KG4pLCExXX1FbGVtZW50c0FyZUVxdWFsKHQsbil7cmV0dXJuIHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2hbdF0hPT10aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoW25dPyExOnRoaXMuX2hhc1N0cmluZ3M/dGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1t0XT09PXRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHNbbl06ITB9RWxlbWVudHNBcmVTdHJpY3RFcXVhbCh0LG4pe2lmKCF0aGlzLkVsZW1lbnRzQXJlRXF1YWwodCxuKSlyZXR1cm4hMTtjb25zdCByPVplLl9nZXRTdHJpY3RFbGVtZW50KHRoaXMuX29yaWdpbmFsU2VxdWVuY2UsdCksaT1aZS5fZ2V0U3RyaWN0RWxlbWVudCh0aGlzLl9tb2RpZmllZFNlcXVlbmNlLG4pO3JldHVybiByPT09aX1zdGF0aWMgX2dldFN0cmljdEVsZW1lbnQodCxuKXtyZXR1cm4gdHlwZW9mIHQuZ2V0U3RyaWN0RWxlbWVudD09ImZ1bmN0aW9uIj90LmdldFN0cmljdEVsZW1lbnQobik6bnVsbH1PcmlnaW5hbEVsZW1lbnRzQXJlRXF1YWwodCxuKXtyZXR1cm4gdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaFt0XSE9PXRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2hbbl0/ITE6dGhpcy5faGFzU3RyaW5ncz90aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW3RdPT09dGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1tuXTohMH1Nb2RpZmllZEVsZW1lbnRzQXJlRXF1YWwodCxuKXtyZXR1cm4gdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaFt0XSE9PXRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2hbbl0/ITE6dGhpcy5faGFzU3RyaW5ncz90aGlzLl9tb2RpZmllZFN0cmluZ0VsZW1lbnRzW3RdPT09dGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50c1tuXTohMH1Db21wdXRlRGlmZih0KXtyZXR1cm4gdGhpcy5fQ29tcHV0ZURpZmYoMCx0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoLmxlbmd0aC0xLDAsdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaC5sZW5ndGgtMSx0KX1fQ29tcHV0ZURpZmYodCxuLHIsaSxzKXtjb25zdCBhPVshMV07bGV0IGw9dGhpcy5Db21wdXRlRGlmZlJlY3Vyc2l2ZSh0LG4scixpLGEpO3JldHVybiBzJiYobD10aGlzLlByZXR0aWZ5Q2hhbmdlcyhsKSkse3F1aXRFYXJseTphWzBdLGNoYW5nZXM6bH19Q29tcHV0ZURpZmZSZWN1cnNpdmUodCxuLHIsaSxzKXtmb3Ioc1swXT0hMTt0PD1uJiZyPD1pJiZ0aGlzLkVsZW1lbnRzQXJlRXF1YWwodCxyKTspdCsrLHIrKztmb3IoO24+PXQmJmk+PXImJnRoaXMuRWxlbWVudHNBcmVFcXVhbChuLGkpOyluLS0saS0tO2lmKHQ+bnx8cj5pKXtsZXQgZjtyZXR1cm4gcjw9aT8odnQuQXNzZXJ0KHQ9PT1uKzEsIm9yaWdpbmFsU3RhcnQgc2hvdWxkIG9ubHkgYmUgb25lIG1vcmUgdGhhbiBvcmlnaW5hbEVuZCIpLGY9W25ldyBZZSh0LDAscixpLXIrMSldKTp0PD1uPyh2dC5Bc3NlcnQocj09PWkrMSwibW9kaWZpZWRTdGFydCBzaG91bGQgb25seSBiZSBvbmUgbW9yZSB0aGFuIG1vZGlmaWVkRW5kIiksZj1bbmV3IFllKHQsbi10KzEsciwwKV0pOih2dC5Bc3NlcnQodD09PW4rMSwib3JpZ2luYWxTdGFydCBzaG91bGQgb25seSBiZSBvbmUgbW9yZSB0aGFuIG9yaWdpbmFsRW5kIiksdnQuQXNzZXJ0KHI9PT1pKzEsIm1vZGlmaWVkU3RhcnQgc2hvdWxkIG9ubHkgYmUgb25lIG1vcmUgdGhhbiBtb2RpZmllZEVuZCIpLGY9W10pLGZ9Y29uc3QgYT1bMF0sbD1bMF0sbz10aGlzLkNvbXB1dGVSZWN1cnNpb25Qb2ludCh0LG4scixpLGEsbCxzKSx1PWFbMF0saD1sWzBdO2lmKG8hPT1udWxsKXJldHVybiBvO2lmKCFzWzBdKXtjb25zdCBmPXRoaXMuQ29tcHV0ZURpZmZSZWN1cnNpdmUodCx1LHIsaCxzKTtsZXQgZD1bXTtyZXR1cm4gc1swXT9kPVtuZXcgWWUodSsxLG4tKHUrMSkrMSxoKzEsaS0oaCsxKSsxKV06ZD10aGlzLkNvbXB1dGVEaWZmUmVjdXJzaXZlKHUrMSxuLGgrMSxpLHMpLHRoaXMuQ29uY2F0ZW5hdGVDaGFuZ2VzKGYsZCl9cmV0dXJuW25ldyBZZSh0LG4tdCsxLHIsaS1yKzEpXX1XQUxLVFJBQ0UodCxuLHIsaSxzLGEsbCxvLHUsaCxmLGQsbSxnLHAseCx3LEwpe2xldCB2PW51bGwseT1udWxsLGI9bmV3IGtpLF89bixBPXIsQz1tWzBdLXhbMF0taSxGPS0xMDczNzQxODI0LE89dGhpcy5tX2ZvcndhcmRIaXN0b3J5Lmxlbmd0aC0xO2Rve2NvbnN0IE09Qyt0O009PT1ffHxNPEEmJnVbTS0xXTx1W00rMV0/KGY9dVtNKzFdLGc9Zi1DLWksZjxGJiZiLk1hcmtOZXh0Q2hhbmdlKCksRj1mLGIuQWRkTW9kaWZpZWRFbGVtZW50KGYrMSxnKSxDPU0rMS10KTooZj11W00tMV0rMSxnPWYtQy1pLGY8RiYmYi5NYXJrTmV4dENoYW5nZSgpLEY9Zi0xLGIuQWRkT3JpZ2luYWxFbGVtZW50KGYsZysxKSxDPU0tMS10KSxPPj0wJiYodT10aGlzLm1fZm9yd2FyZEhpc3RvcnlbT10sdD11WzBdLF89MSxBPXUubGVuZ3RoLTEpfXdoaWxlKC0tTz49LTEpO2lmKHY9Yi5nZXRSZXZlcnNlQ2hhbmdlcygpLExbMF0pe2xldCBNPW1bMF0rMSxOPXhbMF0rMTtpZih2IT09bnVsbCYmdi5sZW5ndGg+MCl7Y29uc3Qgaz12W3YubGVuZ3RoLTFdO009TWF0aC5tYXgoTSxrLmdldE9yaWdpbmFsRW5kKCkpLE49TWF0aC5tYXgoTixrLmdldE1vZGlmaWVkRW5kKCkpfXk9W25ldyBZZShNLGQtTSsxLE4scC1OKzEpXX1lbHNle2I9bmV3IGtpLF89YSxBPWwsQz1tWzBdLXhbMF0tbyxGPTEwNzM3NDE4MjQsTz13P3RoaXMubV9yZXZlcnNlSGlzdG9yeS5sZW5ndGgtMTp0aGlzLm1fcmV2ZXJzZUhpc3RvcnkubGVuZ3RoLTI7ZG97Y29uc3QgTT1DK3M7TT09PV98fE08QSYmaFtNLTFdPj1oW00rMV0/KGY9aFtNKzFdLTEsZz1mLUMtbyxmPkYmJmIuTWFya05leHRDaGFuZ2UoKSxGPWYrMSxiLkFkZE9yaWdpbmFsRWxlbWVudChmKzEsZysxKSxDPU0rMS1zKTooZj1oW00tMV0sZz1mLUMtbyxmPkYmJmIuTWFya05leHRDaGFuZ2UoKSxGPWYsYi5BZGRNb2RpZmllZEVsZW1lbnQoZisxLGcrMSksQz1NLTEtcyksTz49MCYmKGg9dGhpcy5tX3JldmVyc2VIaXN0b3J5W09dLHM9aFswXSxfPTEsQT1oLmxlbmd0aC0xKX13aGlsZSgtLU8+PS0xKTt5PWIuZ2V0Q2hhbmdlcygpfXJldHVybiB0aGlzLkNvbmNhdGVuYXRlQ2hhbmdlcyh2LHkpfUNvbXB1dGVSZWN1cnNpb25Qb2ludCh0LG4scixpLHMsYSxsKXtsZXQgbz0wLHU9MCxoPTAsZj0wLGQ9MCxtPTA7dC0tLHItLSxzWzBdPTAsYVswXT0wLHRoaXMubV9mb3J3YXJkSGlzdG9yeT1bXSx0aGlzLm1fcmV2ZXJzZUhpc3Rvcnk9W107Y29uc3QgZz1uLXQrKGktcikscD1nKzEseD1uZXcgSW50MzJBcnJheShwKSx3PW5ldyBJbnQzMkFycmF5KHApLEw9aS1yLHY9bi10LHk9dC1yLGI9bi1pLEE9KHYtTCklMj09PTA7eFtMXT10LHdbdl09bixsWzBdPSExO2ZvcihsZXQgQz0xO0M8PWcvMisxO0MrKyl7bGV0IEY9MCxPPTA7aD10aGlzLkNsaXBEaWFnb25hbEJvdW5kKEwtQyxDLEwscCksZj10aGlzLkNsaXBEaWFnb25hbEJvdW5kKEwrQyxDLEwscCk7Zm9yKGxldCBOPWg7Tjw9ZjtOKz0yKXtOPT09aHx8TjxmJiZ4W04tMV08eFtOKzFdP289eFtOKzFdOm89eFtOLTFdKzEsdT1vLShOLUwpLXk7Y29uc3Qgaz1vO2Zvcig7bzxuJiZ1PGkmJnRoaXMuRWxlbWVudHNBcmVFcXVhbChvKzEsdSsxKTspbysrLHUrKztpZih4W05dPW8sbyt1PkYrTyYmKEY9byxPPXUpLCFBJiZNYXRoLmFicyhOLXYpPD1DLTEmJm8+PXdbTl0pcmV0dXJuIHNbMF09byxhWzBdPXUsazw9d1tOXSYmQzw9MTQ0OD90aGlzLldBTEtUUkFDRShMLGgsZix5LHYsZCxtLGIseCx3LG8sbixzLHUsaSxhLEEsbCk6bnVsbH1jb25zdCBNPShGLXQrKE8tciktQykvMjtpZih0aGlzLkNvbnRpbnVlUHJvY2Vzc2luZ1ByZWRpY2F0ZSE9PW51bGwmJiF0aGlzLkNvbnRpbnVlUHJvY2Vzc2luZ1ByZWRpY2F0ZShGLE0pKXJldHVybiBsWzBdPSEwLHNbMF09RixhWzBdPU8sTT4wJiZDPD0xNDQ4P3RoaXMuV0FMS1RSQUNFKEwsaCxmLHksdixkLG0sYix4LHcsbyxuLHMsdSxpLGEsQSxsKToodCsrLHIrKyxbbmV3IFllKHQsbi10KzEscixpLXIrMSldKTtkPXRoaXMuQ2xpcERpYWdvbmFsQm91bmQodi1DLEMsdixwKSxtPXRoaXMuQ2xpcERpYWdvbmFsQm91bmQoditDLEMsdixwKTtmb3IobGV0IE49ZDtOPD1tO04rPTIpe049PT1kfHxOPG0mJndbTi0xXT49d1tOKzFdP289d1tOKzFdLTE6bz13W04tMV0sdT1vLShOLXYpLWI7Y29uc3Qgaz1vO2Zvcig7bz50JiZ1PnImJnRoaXMuRWxlbWVudHNBcmVFcXVhbChvLHUpOylvLS0sdS0tO2lmKHdbTl09byxBJiZNYXRoLmFicyhOLUwpPD1DJiZvPD14W05dKXJldHVybiBzWzBdPW8sYVswXT11LGs+PXhbTl0mJkM8PTE0NDg/dGhpcy5XQUxLVFJBQ0UoTCxoLGYseSx2LGQsbSxiLHgsdyxvLG4scyx1LGksYSxBLGwpOm51bGx9aWYoQzw9MTQ0Nyl7bGV0IE49bmV3IEludDMyQXJyYXkoZi1oKzIpO05bMF09TC1oKzEseHQuQ29weTIoeCxoLE4sMSxmLWgrMSksdGhpcy5tX2ZvcndhcmRIaXN0b3J5LnB1c2goTiksTj1uZXcgSW50MzJBcnJheShtLWQrMiksTlswXT12LWQrMSx4dC5Db3B5Mih3LGQsTiwxLG0tZCsxKSx0aGlzLm1fcmV2ZXJzZUhpc3RvcnkucHVzaChOKX19cmV0dXJuIHRoaXMuV0FMS1RSQUNFKEwsaCxmLHksdixkLG0sYix4LHcsbyxuLHMsdSxpLGEsQSxsKX1QcmV0dGlmeUNoYW5nZXModCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dFtuXSxpPW48dC5sZW5ndGgtMT90W24rMV0ub3JpZ2luYWxTdGFydDp0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoLmxlbmd0aCxzPW48dC5sZW5ndGgtMT90W24rMV0ubW9kaWZpZWRTdGFydDp0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoLmxlbmd0aCxhPXIub3JpZ2luYWxMZW5ndGg+MCxsPXIubW9kaWZpZWRMZW5ndGg+MDtmb3IoO3Iub3JpZ2luYWxTdGFydCtyLm9yaWdpbmFsTGVuZ3RoPGkmJnIubW9kaWZpZWRTdGFydCtyLm1vZGlmaWVkTGVuZ3RoPHMmJighYXx8dGhpcy5PcmlnaW5hbEVsZW1lbnRzQXJlRXF1YWwoci5vcmlnaW5hbFN0YXJ0LHIub3JpZ2luYWxTdGFydCtyLm9yaWdpbmFsTGVuZ3RoKSkmJighbHx8dGhpcy5Nb2RpZmllZEVsZW1lbnRzQXJlRXF1YWwoci5tb2RpZmllZFN0YXJ0LHIubW9kaWZpZWRTdGFydCtyLm1vZGlmaWVkTGVuZ3RoKSk7KXtjb25zdCB1PXRoaXMuRWxlbWVudHNBcmVTdHJpY3RFcXVhbChyLm9yaWdpbmFsU3RhcnQsci5tb2RpZmllZFN0YXJ0KTtpZih0aGlzLkVsZW1lbnRzQXJlU3RyaWN0RXF1YWwoci5vcmlnaW5hbFN0YXJ0K3Iub3JpZ2luYWxMZW5ndGgsci5tb2RpZmllZFN0YXJ0K3IubW9kaWZpZWRMZW5ndGgpJiYhdSlicmVhaztyLm9yaWdpbmFsU3RhcnQrKyxyLm1vZGlmaWVkU3RhcnQrK31jb25zdCBvPVtudWxsXTtpZihuPHQubGVuZ3RoLTEmJnRoaXMuQ2hhbmdlc092ZXJsYXAodFtuXSx0W24rMV0sbykpe3Rbbl09b1swXSx0LnNwbGljZShuKzEsMSksbi0tO2NvbnRpbnVlfX1mb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSl7Y29uc3Qgcj10W25dO2xldCBpPTAscz0wO2lmKG4+MCl7Y29uc3QgZj10W24tMV07aT1mLm9yaWdpbmFsU3RhcnQrZi5vcmlnaW5hbExlbmd0aCxzPWYubW9kaWZpZWRTdGFydCtmLm1vZGlmaWVkTGVuZ3RofWNvbnN0IGE9ci5vcmlnaW5hbExlbmd0aD4wLGw9ci5tb2RpZmllZExlbmd0aD4wO2xldCBvPTAsdT10aGlzLl9ib3VuZGFyeVNjb3JlKHIub3JpZ2luYWxTdGFydCxyLm9yaWdpbmFsTGVuZ3RoLHIubW9kaWZpZWRTdGFydCxyLm1vZGlmaWVkTGVuZ3RoKTtmb3IobGV0IGY9MTs7ZisrKXtjb25zdCBkPXIub3JpZ2luYWxTdGFydC1mLG09ci5tb2RpZmllZFN0YXJ0LWY7aWYoZDxpfHxtPHN8fGEmJiF0aGlzLk9yaWdpbmFsRWxlbWVudHNBcmVFcXVhbChkLGQrci5vcmlnaW5hbExlbmd0aCl8fGwmJiF0aGlzLk1vZGlmaWVkRWxlbWVudHNBcmVFcXVhbChtLG0rci5tb2RpZmllZExlbmd0aCkpYnJlYWs7Y29uc3QgcD0oZD09PWkmJm09PT1zPzU6MCkrdGhpcy5fYm91bmRhcnlTY29yZShkLHIub3JpZ2luYWxMZW5ndGgsbSxyLm1vZGlmaWVkTGVuZ3RoKTtwPnUmJih1PXAsbz1mKX1yLm9yaWdpbmFsU3RhcnQtPW8sci5tb2RpZmllZFN0YXJ0LT1vO2NvbnN0IGg9W251bGxdO2lmKG4+MCYmdGhpcy5DaGFuZ2VzT3ZlcmxhcCh0W24tMV0sdFtuXSxoKSl7dFtuLTFdPWhbMF0sdC5zcGxpY2UobiwxKSxuKys7Y29udGludWV9fWlmKHRoaXMuX2hhc1N0cmluZ3MpZm9yKGxldCBuPTEscj10Lmxlbmd0aDtuPHI7bisrKXtjb25zdCBpPXRbbi0xXSxzPXRbbl0sYT1zLm9yaWdpbmFsU3RhcnQtaS5vcmlnaW5hbFN0YXJ0LWkub3JpZ2luYWxMZW5ndGgsbD1pLm9yaWdpbmFsU3RhcnQsbz1zLm9yaWdpbmFsU3RhcnQrcy5vcmlnaW5hbExlbmd0aCx1PW8tbCxoPWkubW9kaWZpZWRTdGFydCxmPXMubW9kaWZpZWRTdGFydCtzLm1vZGlmaWVkTGVuZ3RoLGQ9Zi1oO2lmKGE8NSYmdTwyMCYmZDwyMCl7Y29uc3QgbT10aGlzLl9maW5kQmV0dGVyQ29udGlndW91c1NlcXVlbmNlKGwsdSxoLGQsYSk7aWYobSl7Y29uc3RbZyxwXT1tOyhnIT09aS5vcmlnaW5hbFN0YXJ0K2kub3JpZ2luYWxMZW5ndGh8fHAhPT1pLm1vZGlmaWVkU3RhcnQraS5tb2RpZmllZExlbmd0aCkmJihpLm9yaWdpbmFsTGVuZ3RoPWctaS5vcmlnaW5hbFN0YXJ0LGkubW9kaWZpZWRMZW5ndGg9cC1pLm1vZGlmaWVkU3RhcnQscy5vcmlnaW5hbFN0YXJ0PWcrYSxzLm1vZGlmaWVkU3RhcnQ9cCthLHMub3JpZ2luYWxMZW5ndGg9by1zLm9yaWdpbmFsU3RhcnQscy5tb2RpZmllZExlbmd0aD1mLXMubW9kaWZpZWRTdGFydCl9fX1yZXR1cm4gdH1fZmluZEJldHRlckNvbnRpZ3VvdXNTZXF1ZW5jZSh0LG4scixpLHMpe2lmKG48c3x8aTxzKXJldHVybiBudWxsO2NvbnN0IGE9dCtuLXMrMSxsPXIraS1zKzE7bGV0IG89MCx1PTAsaD0wO2ZvcihsZXQgZj10O2Y8YTtmKyspZm9yKGxldCBkPXI7ZDxsO2QrKyl7Y29uc3QgbT10aGlzLl9jb250aWd1b3VzU2VxdWVuY2VTY29yZShmLGQscyk7bT4wJiZtPm8mJihvPW0sdT1mLGg9ZCl9cmV0dXJuIG8+MD9bdSxoXTpudWxsfV9jb250aWd1b3VzU2VxdWVuY2VTY29yZSh0LG4scil7bGV0IGk9MDtmb3IobGV0IHM9MDtzPHI7cysrKXtpZighdGhpcy5FbGVtZW50c0FyZUVxdWFsKHQrcyxuK3MpKXJldHVybiAwO2krPXRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHNbdCtzXS5sZW5ndGh9cmV0dXJuIGl9X09yaWdpbmFsSXNCb3VuZGFyeSh0KXtyZXR1cm4gdDw9MHx8dD49dGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaC5sZW5ndGgtMT8hMDp0aGlzLl9oYXNTdHJpbmdzJiYvXlxzKiQvLnRlc3QodGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1t0XSl9X09yaWdpbmFsUmVnaW9uSXNCb3VuZGFyeSh0LG4pe2lmKHRoaXMuX09yaWdpbmFsSXNCb3VuZGFyeSh0KXx8dGhpcy5fT3JpZ2luYWxJc0JvdW5kYXJ5KHQtMSkpcmV0dXJuITA7aWYobj4wKXtjb25zdCByPXQrbjtpZih0aGlzLl9PcmlnaW5hbElzQm91bmRhcnkoci0xKXx8dGhpcy5fT3JpZ2luYWxJc0JvdW5kYXJ5KHIpKXJldHVybiEwfXJldHVybiExfV9Nb2RpZmllZElzQm91bmRhcnkodCl7cmV0dXJuIHQ8PTB8fHQ+PXRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2gubGVuZ3RoLTE/ITA6dGhpcy5faGFzU3RyaW5ncyYmL15ccyokLy50ZXN0KHRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHNbdF0pfV9Nb2RpZmllZFJlZ2lvbklzQm91bmRhcnkodCxuKXtpZih0aGlzLl9Nb2RpZmllZElzQm91bmRhcnkodCl8fHRoaXMuX01vZGlmaWVkSXNCb3VuZGFyeSh0LTEpKXJldHVybiEwO2lmKG4+MCl7Y29uc3Qgcj10K247aWYodGhpcy5fTW9kaWZpZWRJc0JvdW5kYXJ5KHItMSl8fHRoaXMuX01vZGlmaWVkSXNCb3VuZGFyeShyKSlyZXR1cm4hMH1yZXR1cm4hMX1fYm91bmRhcnlTY29yZSh0LG4scixpKXtjb25zdCBzPXRoaXMuX09yaWdpbmFsUmVnaW9uSXNCb3VuZGFyeSh0LG4pPzE6MCxhPXRoaXMuX01vZGlmaWVkUmVnaW9uSXNCb3VuZGFyeShyLGkpPzE6MDtyZXR1cm4gcythfUNvbmNhdGVuYXRlQ2hhbmdlcyh0LG4pe2NvbnN0IHI9W107aWYodC5sZW5ndGg9PT0wfHxuLmxlbmd0aD09PTApcmV0dXJuIG4ubGVuZ3RoPjA/bjp0O2lmKHRoaXMuQ2hhbmdlc092ZXJsYXAodFt0Lmxlbmd0aC0xXSxuWzBdLHIpKXtjb25zdCBpPW5ldyBBcnJheSh0Lmxlbmd0aCtuLmxlbmd0aC0xKTtyZXR1cm4geHQuQ29weSh0LDAsaSwwLHQubGVuZ3RoLTEpLGlbdC5sZW5ndGgtMV09clswXSx4dC5Db3B5KG4sMSxpLHQubGVuZ3RoLG4ubGVuZ3RoLTEpLGl9ZWxzZXtjb25zdCBpPW5ldyBBcnJheSh0Lmxlbmd0aCtuLmxlbmd0aCk7cmV0dXJuIHh0LkNvcHkodCwwLGksMCx0Lmxlbmd0aCkseHQuQ29weShuLDAsaSx0Lmxlbmd0aCxuLmxlbmd0aCksaX19Q2hhbmdlc092ZXJsYXAodCxuLHIpe2lmKHZ0LkFzc2VydCh0Lm9yaWdpbmFsU3RhcnQ8PW4ub3JpZ2luYWxTdGFydCwiTGVmdCBjaGFuZ2UgaXMgbm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byByaWdodCBjaGFuZ2UiKSx2dC5Bc3NlcnQodC5tb2RpZmllZFN0YXJ0PD1uLm1vZGlmaWVkU3RhcnQsIkxlZnQgY2hhbmdlIGlzIG5vdCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcmlnaHQgY2hhbmdlIiksdC5vcmlnaW5hbFN0YXJ0K3Qub3JpZ2luYWxMZW5ndGg+PW4ub3JpZ2luYWxTdGFydHx8dC5tb2RpZmllZFN0YXJ0K3QubW9kaWZpZWRMZW5ndGg+PW4ubW9kaWZpZWRTdGFydCl7Y29uc3QgaT10Lm9yaWdpbmFsU3RhcnQ7bGV0IHM9dC5vcmlnaW5hbExlbmd0aDtjb25zdCBhPXQubW9kaWZpZWRTdGFydDtsZXQgbD10Lm1vZGlmaWVkTGVuZ3RoO3JldHVybiB0Lm9yaWdpbmFsU3RhcnQrdC5vcmlnaW5hbExlbmd0aD49bi5vcmlnaW5hbFN0YXJ0JiYocz1uLm9yaWdpbmFsU3RhcnQrbi5vcmlnaW5hbExlbmd0aC10Lm9yaWdpbmFsU3RhcnQpLHQubW9kaWZpZWRTdGFydCt0Lm1vZGlmaWVkTGVuZ3RoPj1uLm1vZGlmaWVkU3RhcnQmJihsPW4ubW9kaWZpZWRTdGFydCtuLm1vZGlmaWVkTGVuZ3RoLXQubW9kaWZpZWRTdGFydCksclswXT1uZXcgWWUoaSxzLGEsbCksITB9ZWxzZSByZXR1cm4gclswXT1udWxsLCExfUNsaXBEaWFnb25hbEJvdW5kKHQsbixyLGkpe2lmKHQ+PTAmJnQ8aSlyZXR1cm4gdDtjb25zdCBzPXIsYT1pLXItMSxsPW4lMj09PTA7aWYodDwwKXtjb25zdCBvPXMlMj09PTA7cmV0dXJuIGw9PT1vPzA6MX1lbHNle2NvbnN0IG89YSUyPT09MDtyZXR1cm4gbD09PW8/aS0xOmktMn19fWxldCBlZT1jbGFzcyBodHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMubGluZU51bWJlcj10LHRoaXMuY29sdW1uPW59d2l0aCh0PXRoaXMubGluZU51bWJlcixuPXRoaXMuY29sdW1uKXtyZXR1cm4gdD09PXRoaXMubGluZU51bWJlciYmbj09PXRoaXMuY29sdW1uP3RoaXM6bmV3IGh0KHQsbil9ZGVsdGEodD0wLG49MCl7cmV0dXJuIHRoaXMud2l0aCh0aGlzLmxpbmVOdW1iZXIrdCx0aGlzLmNvbHVtbituKX1lcXVhbHModCl7cmV0dXJuIGh0LmVxdWFscyh0aGlzLHQpfXN0YXRpYyBlcXVhbHModCxuKXtyZXR1cm4hdCYmIW4/ITA6ISF0JiYhIW4mJnQubGluZU51bWJlcj09PW4ubGluZU51bWJlciYmdC5jb2x1bW49PT1uLmNvbHVtbn1pc0JlZm9yZSh0KXtyZXR1cm4gaHQuaXNCZWZvcmUodGhpcyx0KX1zdGF0aWMgaXNCZWZvcmUodCxuKXtyZXR1cm4gdC5saW5lTnVtYmVyPG4ubGluZU51bWJlcj8hMDpuLmxpbmVOdW1iZXI8dC5saW5lTnVtYmVyPyExOnQuY29sdW1uPG4uY29sdW1ufWlzQmVmb3JlT3JFcXVhbCh0KXtyZXR1cm4gaHQuaXNCZWZvcmVPckVxdWFsKHRoaXMsdCl9c3RhdGljIGlzQmVmb3JlT3JFcXVhbCh0LG4pe3JldHVybiB0LmxpbmVOdW1iZXI8bi5saW5lTnVtYmVyPyEwOm4ubGluZU51bWJlcjx0LmxpbmVOdW1iZXI/ITE6dC5jb2x1bW48PW4uY29sdW1ufXN0YXRpYyBjb21wYXJlKHQsbil7Y29uc3Qgcj10LmxpbmVOdW1iZXJ8MCxpPW4ubGluZU51bWJlcnwwO2lmKHI9PT1pKXtjb25zdCBzPXQuY29sdW1ufDAsYT1uLmNvbHVtbnwwO3JldHVybiBzLWF9cmV0dXJuIHItaX1jbG9uZSgpe3JldHVybiBuZXcgaHQodGhpcy5saW5lTnVtYmVyLHRoaXMuY29sdW1uKX10b1N0cmluZygpe3JldHVybiIoIit0aGlzLmxpbmVOdW1iZXIrIiwiK3RoaXMuY29sdW1uKyIpIn1zdGF0aWMgbGlmdCh0KXtyZXR1cm4gbmV3IGh0KHQubGluZU51bWJlcix0LmNvbHVtbil9c3RhdGljIGlzSVBvc2l0aW9uKHQpe3JldHVybiB0JiZ0eXBlb2YgdC5saW5lTnVtYmVyPT0ibnVtYmVyIiYmdHlwZW9mIHQuY29sdW1uPT0ibnVtYmVyIn10b0pTT04oKXtyZXR1cm57bGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uOnRoaXMuY29sdW1ufX19LHo9Y2xhc3MgcmV7Y29uc3RydWN0b3IodCxuLHIsaSl7dD5yfHx0PT09ciYmbj5pPyh0aGlzLnN0YXJ0TGluZU51bWJlcj1yLHRoaXMuc3RhcnRDb2x1bW49aSx0aGlzLmVuZExpbmVOdW1iZXI9dCx0aGlzLmVuZENvbHVtbj1uKToodGhpcy5zdGFydExpbmVOdW1iZXI9dCx0aGlzLnN0YXJ0Q29sdW1uPW4sdGhpcy5lbmRMaW5lTnVtYmVyPXIsdGhpcy5lbmRDb2x1bW49aSl9aXNFbXB0eSgpe3JldHVybiByZS5pc0VtcHR5KHRoaXMpfXN0YXRpYyBpc0VtcHR5KHQpe3JldHVybiB0LnN0YXJ0TGluZU51bWJlcj09PXQuZW5kTGluZU51bWJlciYmdC5zdGFydENvbHVtbj09PXQuZW5kQ29sdW1ufWNvbnRhaW5zUG9zaXRpb24odCl7cmV0dXJuIHJlLmNvbnRhaW5zUG9zaXRpb24odGhpcyx0KX1zdGF0aWMgY29udGFpbnNQb3NpdGlvbih0LG4pe3JldHVybiEobi5saW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxuLmxpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyfHxuLmxpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmbi5jb2x1bW48dC5zdGFydENvbHVtbnx8bi5saW5lTnVtYmVyPT09dC5lbmRMaW5lTnVtYmVyJiZuLmNvbHVtbj50LmVuZENvbHVtbil9c3RhdGljIHN0cmljdENvbnRhaW5zUG9zaXRpb24odCxuKXtyZXR1cm4hKG4ubGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5saW5lTnVtYmVyPnQuZW5kTGluZU51bWJlcnx8bi5saW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXImJm4uY29sdW1uPD10LnN0YXJ0Q29sdW1ufHxuLmxpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXImJm4uY29sdW1uPj10LmVuZENvbHVtbil9Y29udGFpbnNSYW5nZSh0KXtyZXR1cm4gcmUuY29udGFpbnNSYW5nZSh0aGlzLHQpfXN0YXRpYyBjb250YWluc1JhbmdlKHQsbil7cmV0dXJuIShuLnN0YXJ0TGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5lbmRMaW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxuLnN0YXJ0TGluZU51bWJlcj50LmVuZExpbmVOdW1iZXJ8fG4uZW5kTGluZU51bWJlcj50LmVuZExpbmVOdW1iZXJ8fG4uc3RhcnRMaW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXImJm4uc3RhcnRDb2x1bW48dC5zdGFydENvbHVtbnx8bi5lbmRMaW5lTnVtYmVyPT09dC5lbmRMaW5lTnVtYmVyJiZuLmVuZENvbHVtbj50LmVuZENvbHVtbil9c3RyaWN0Q29udGFpbnNSYW5nZSh0KXtyZXR1cm4gcmUuc3RyaWN0Q29udGFpbnNSYW5nZSh0aGlzLHQpfXN0YXRpYyBzdHJpY3RDb250YWluc1JhbmdlKHQsbil7cmV0dXJuIShuLnN0YXJ0TGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5lbmRMaW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxuLnN0YXJ0TGluZU51bWJlcj50LmVuZExpbmVOdW1iZXJ8fG4uZW5kTGluZU51bWJlcj50LmVuZExpbmVOdW1iZXJ8fG4uc3RhcnRMaW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXImJm4uc3RhcnRDb2x1bW48PXQuc3RhcnRDb2x1bW58fG4uZW5kTGluZU51bWJlcj09PXQuZW5kTGluZU51bWJlciYmbi5lbmRDb2x1bW4+PXQuZW5kQ29sdW1uKX1wbHVzUmFuZ2UodCl7cmV0dXJuIHJlLnBsdXNSYW5nZSh0aGlzLHQpfXN0YXRpYyBwbHVzUmFuZ2UodCxuKXtsZXQgcixpLHMsYTtyZXR1cm4gbi5zdGFydExpbmVOdW1iZXI8dC5zdGFydExpbmVOdW1iZXI/KHI9bi5zdGFydExpbmVOdW1iZXIsaT1uLnN0YXJ0Q29sdW1uKTpuLnN0YXJ0TGluZU51bWJlcj09PXQuc3RhcnRMaW5lTnVtYmVyPyhyPW4uc3RhcnRMaW5lTnVtYmVyLGk9TWF0aC5taW4obi5zdGFydENvbHVtbix0LnN0YXJ0Q29sdW1uKSk6KHI9dC5zdGFydExpbmVOdW1iZXIsaT10LnN0YXJ0Q29sdW1uKSxuLmVuZExpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyPyhzPW4uZW5kTGluZU51bWJlcixhPW4uZW5kQ29sdW1uKTpuLmVuZExpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXI/KHM9bi5lbmRMaW5lTnVtYmVyLGE9TWF0aC5tYXgobi5lbmRDb2x1bW4sdC5lbmRDb2x1bW4pKToocz10LmVuZExpbmVOdW1iZXIsYT10LmVuZENvbHVtbiksbmV3IHJlKHIsaSxzLGEpfWludGVyc2VjdFJhbmdlcyh0KXtyZXR1cm4gcmUuaW50ZXJzZWN0UmFuZ2VzKHRoaXMsdCl9c3RhdGljIGludGVyc2VjdFJhbmdlcyh0LG4pe2xldCByPXQuc3RhcnRMaW5lTnVtYmVyLGk9dC5zdGFydENvbHVtbixzPXQuZW5kTGluZU51bWJlcixhPXQuZW5kQ29sdW1uO2NvbnN0IGw9bi5zdGFydExpbmVOdW1iZXIsbz1uLnN0YXJ0Q29sdW1uLHU9bi5lbmRMaW5lTnVtYmVyLGg9bi5lbmRDb2x1bW47cmV0dXJuIHI8bD8ocj1sLGk9byk6cj09PWwmJihpPU1hdGgubWF4KGksbykpLHM+dT8ocz11LGE9aCk6cz09PXUmJihhPU1hdGgubWluKGEsaCkpLHI+c3x8cj09PXMmJmk+YT9udWxsOm5ldyByZShyLGkscyxhKX1lcXVhbHNSYW5nZSh0KXtyZXR1cm4gcmUuZXF1YWxzUmFuZ2UodGhpcyx0KX1zdGF0aWMgZXF1YWxzUmFuZ2UodCxuKXtyZXR1cm4hdCYmIW4/ITA6ISF0JiYhIW4mJnQuc3RhcnRMaW5lTnVtYmVyPT09bi5zdGFydExpbmVOdW1iZXImJnQuc3RhcnRDb2x1bW49PT1uLnN0YXJ0Q29sdW1uJiZ0LmVuZExpbmVOdW1iZXI9PT1uLmVuZExpbmVOdW1iZXImJnQuZW5kQ29sdW1uPT09bi5lbmRDb2x1bW59Z2V0RW5kUG9zaXRpb24oKXtyZXR1cm4gcmUuZ2V0RW5kUG9zaXRpb24odGhpcyl9c3RhdGljIGdldEVuZFBvc2l0aW9uKHQpe3JldHVybiBuZXcgZWUodC5lbmRMaW5lTnVtYmVyLHQuZW5kQ29sdW1uKX1nZXRTdGFydFBvc2l0aW9uKCl7cmV0dXJuIHJlLmdldFN0YXJ0UG9zaXRpb24odGhpcyl9c3RhdGljIGdldFN0YXJ0UG9zaXRpb24odCl7cmV0dXJuIG5ldyBlZSh0LnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0Q29sdW1uKX10b1N0cmluZygpe3JldHVybiJbIit0aGlzLnN0YXJ0TGluZU51bWJlcisiLCIrdGhpcy5zdGFydENvbHVtbisiIC0+ICIrdGhpcy5lbmRMaW5lTnVtYmVyKyIsIit0aGlzLmVuZENvbHVtbisiXSJ9c2V0RW5kUG9zaXRpb24odCxuKXtyZXR1cm4gbmV3IHJlKHRoaXMuc3RhcnRMaW5lTnVtYmVyLHRoaXMuc3RhcnRDb2x1bW4sdCxuKX1zZXRTdGFydFBvc2l0aW9uKHQsbil7cmV0dXJuIG5ldyByZSh0LG4sdGhpcy5lbmRMaW5lTnVtYmVyLHRoaXMuZW5kQ29sdW1uKX1jb2xsYXBzZVRvU3RhcnQoKXtyZXR1cm4gcmUuY29sbGFwc2VUb1N0YXJ0KHRoaXMpfXN0YXRpYyBjb2xsYXBzZVRvU3RhcnQodCl7cmV0dXJuIG5ldyByZSh0LnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0Q29sdW1uLHQuc3RhcnRMaW5lTnVtYmVyLHQuc3RhcnRDb2x1bW4pfWNvbGxhcHNlVG9FbmQoKXtyZXR1cm4gcmUuY29sbGFwc2VUb0VuZCh0aGlzKX1zdGF0aWMgY29sbGFwc2VUb0VuZCh0KXtyZXR1cm4gbmV3IHJlKHQuZW5kTGluZU51bWJlcix0LmVuZENvbHVtbix0LmVuZExpbmVOdW1iZXIsdC5lbmRDb2x1bW4pfWRlbHRhKHQpe3JldHVybiBuZXcgcmUodGhpcy5zdGFydExpbmVOdW1iZXIrdCx0aGlzLnN0YXJ0Q29sdW1uLHRoaXMuZW5kTGluZU51bWJlcit0LHRoaXMuZW5kQ29sdW1uKX1zdGF0aWMgZnJvbVBvc2l0aW9ucyh0LG49dCl7cmV0dXJuIG5ldyByZSh0LmxpbmVOdW1iZXIsdC5jb2x1bW4sbi5saW5lTnVtYmVyLG4uY29sdW1uKX1zdGF0aWMgbGlmdCh0KXtyZXR1cm4gdD9uZXcgcmUodC5zdGFydExpbmVOdW1iZXIsdC5zdGFydENvbHVtbix0LmVuZExpbmVOdW1iZXIsdC5lbmRDb2x1bW4pOm51bGx9c3RhdGljIGlzSVJhbmdlKHQpe3JldHVybiB0JiZ0eXBlb2YgdC5zdGFydExpbmVOdW1iZXI9PSJudW1iZXIiJiZ0eXBlb2YgdC5zdGFydENvbHVtbj09Im51bWJlciImJnR5cGVvZiB0LmVuZExpbmVOdW1iZXI9PSJudW1iZXIiJiZ0eXBlb2YgdC5lbmRDb2x1bW49PSJudW1iZXIifXN0YXRpYyBhcmVJbnRlcnNlY3RpbmdPclRvdWNoaW5nKHQsbil7cmV0dXJuISh0LmVuZExpbmVOdW1iZXI8bi5zdGFydExpbmVOdW1iZXJ8fHQuZW5kTGluZU51bWJlcj09PW4uc3RhcnRMaW5lTnVtYmVyJiZ0LmVuZENvbHVtbjxuLnN0YXJ0Q29sdW1ufHxuLmVuZExpbmVOdW1iZXI8dC5zdGFydExpbmVOdW1iZXJ8fG4uZW5kTGluZU51bWJlcj09PXQuc3RhcnRMaW5lTnVtYmVyJiZuLmVuZENvbHVtbjx0LnN0YXJ0Q29sdW1uKX1zdGF0aWMgYXJlSW50ZXJzZWN0aW5nKHQsbil7cmV0dXJuISh0LmVuZExpbmVOdW1iZXI8bi5zdGFydExpbmVOdW1iZXJ8fHQuZW5kTGluZU51bWJlcj09PW4uc3RhcnRMaW5lTnVtYmVyJiZ0LmVuZENvbHVtbjw9bi5zdGFydENvbHVtbnx8bi5lbmRMaW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxuLmVuZExpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmbi5lbmRDb2x1bW48PXQuc3RhcnRDb2x1bW4pfXN0YXRpYyBjb21wYXJlUmFuZ2VzVXNpbmdTdGFydHModCxuKXtpZih0JiZuKXtjb25zdCBzPXQuc3RhcnRMaW5lTnVtYmVyfDAsYT1uLnN0YXJ0TGluZU51bWJlcnwwO2lmKHM9PT1hKXtjb25zdCBsPXQuc3RhcnRDb2x1bW58MCxvPW4uc3RhcnRDb2x1bW58MDtpZihsPT09byl7Y29uc3QgdT10LmVuZExpbmVOdW1iZXJ8MCxoPW4uZW5kTGluZU51bWJlcnwwO2lmKHU9PT1oKXtjb25zdCBmPXQuZW5kQ29sdW1ufDAsZD1uLmVuZENvbHVtbnwwO3JldHVybiBmLWR9cmV0dXJuIHUtaH1yZXR1cm4gbC1vfXJldHVybiBzLWF9cmV0dXJuKHQ/MTowKS0obj8xOjApfXN0YXRpYyBjb21wYXJlUmFuZ2VzVXNpbmdFbmRzKHQsbil7cmV0dXJuIHQuZW5kTGluZU51bWJlcj09PW4uZW5kTGluZU51bWJlcj90LmVuZENvbHVtbj09PW4uZW5kQ29sdW1uP3Quc3RhcnRMaW5lTnVtYmVyPT09bi5zdGFydExpbmVOdW1iZXI/dC5zdGFydENvbHVtbi1uLnN0YXJ0Q29sdW1uOnQuc3RhcnRMaW5lTnVtYmVyLW4uc3RhcnRMaW5lTnVtYmVyOnQuZW5kQ29sdW1uLW4uZW5kQ29sdW1uOnQuZW5kTGluZU51bWJlci1uLmVuZExpbmVOdW1iZXJ9c3RhdGljIHNwYW5zTXVsdGlwbGVMaW5lcyh0KXtyZXR1cm4gdC5lbmRMaW5lTnVtYmVyPnQuc3RhcnRMaW5lTnVtYmVyfXRvSlNPTigpe3JldHVybiB0aGlzfX07ZnVuY3Rpb24gUmkoZSl7cmV0dXJuIGU8MD8wOmU+MjU1PzI1NTplfDB9ZnVuY3Rpb24geXQoZSl7cmV0dXJuIGU8MD8wOmU+NDI5NDk2NzI5NT80Mjk0OTY3Mjk1OmV8MH1jbGFzcyBscntjb25zdHJ1Y3Rvcih0KXtjb25zdCBuPVJpKHQpO3RoaXMuX2RlZmF1bHRWYWx1ZT1uLHRoaXMuX2FzY2lpTWFwPWxyLl9jcmVhdGVBc2NpaU1hcChuKSx0aGlzLl9tYXA9bmV3IE1hcH1zdGF0aWMgX2NyZWF0ZUFzY2lpTWFwKHQpe2NvbnN0IG49bmV3IFVpbnQ4QXJyYXkoMjU2KTtyZXR1cm4gbi5maWxsKHQpLG59c2V0KHQsbil7Y29uc3Qgcj1SaShuKTt0Pj0wJiZ0PDI1Nj90aGlzLl9hc2NpaU1hcFt0XT1yOnRoaXMuX21hcC5zZXQodCxyKX1nZXQodCl7cmV0dXJuIHQ+PTAmJnQ8MjU2P3RoaXMuX2FzY2lpTWFwW3RdOnRoaXMuX21hcC5nZXQodCl8fHRoaXMuX2RlZmF1bHRWYWx1ZX1jbGVhcigpe3RoaXMuX2FzY2lpTWFwLmZpbGwodGhpcy5fZGVmYXVsdFZhbHVlKSx0aGlzLl9tYXAuY2xlYXIoKX19Y2xhc3MgaXV7Y29uc3RydWN0b3IodCxuLHIpe2NvbnN0IGk9bmV3IFVpbnQ4QXJyYXkodCpuKTtmb3IobGV0IHM9MCxhPXQqbjtzPGE7cysrKWlbc109cjt0aGlzLl9kYXRhPWksdGhpcy5yb3dzPXQsdGhpcy5jb2xzPW59Z2V0KHQsbil7cmV0dXJuIHRoaXMuX2RhdGFbdCp0aGlzLmNvbHMrbl19c2V0KHQsbixyKXt0aGlzLl9kYXRhW3QqdGhpcy5jb2xzK25dPXJ9fWNsYXNzIHN1e2NvbnN0cnVjdG9yKHQpe2xldCBuPTAscj0wO2ZvcihsZXQgcz0wLGE9dC5sZW5ndGg7czxhO3MrKyl7Y29uc3RbbCxvLHVdPXRbc107bz5uJiYobj1vKSxsPnImJihyPWwpLHU+ciYmKHI9dSl9bisrLHIrKztjb25zdCBpPW5ldyBpdShyLG4sMCk7Zm9yKGxldCBzPTAsYT10Lmxlbmd0aDtzPGE7cysrKXtjb25zdFtsLG8sdV09dFtzXTtpLnNldChsLG8sdSl9dGhpcy5fc3RhdGVzPWksdGhpcy5fbWF4Q2hhckNvZGU9bn1uZXh0U3RhdGUodCxuKXtyZXR1cm4gbjwwfHxuPj10aGlzLl9tYXhDaGFyQ29kZT8wOnRoaXMuX3N0YXRlcy5nZXQodCxuKX19bGV0IHVyPW51bGw7ZnVuY3Rpb24gYXUoKXtyZXR1cm4gdXI9PT1udWxsJiYodXI9bmV3IHN1KFtbMSwxMDQsMl0sWzEsNzIsMl0sWzEsMTAyLDZdLFsxLDcwLDZdLFsyLDExNiwzXSxbMiw4NCwzXSxbMywxMTYsNF0sWzMsODQsNF0sWzQsMTEyLDVdLFs0LDgwLDVdLFs1LDExNSw5XSxbNSw4Myw5XSxbNSw1OCwxMF0sWzYsMTA1LDddLFs2LDczLDddLFs3LDEwOCw4XSxbNyw3Niw4XSxbOCwxMDEsOV0sWzgsNjksOV0sWzksNTgsMTBdLFsxMCw0NywxMV0sWzExLDQ3LDEyXV0pKSx1cn1sZXQganQ9bnVsbDtmdW5jdGlvbiBvdSgpe2lmKGp0PT09bnVsbCl7anQ9bmV3IGxyKDApO2NvbnN0IGU9YCAJPD4nIuOAgeOAgu+9oe+9pO+8jO+8ju+8mu+8m+KAmOOAiOOAjOOAjuOAlO+8iO+8u++9m++9ou+9o++9ne+8ve+8ieOAleOAj+OAjeOAieKAme+9gO+9nuKApmA7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspanQuc2V0KGUuY2hhckNvZGVBdChuKSwxKTtjb25zdCB0PSIuLDs6Ijtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylqdC5zZXQodC5jaGFyQ29kZUF0KG4pLDIpfXJldHVybiBqdH1jbGFzcyBtbntzdGF0aWMgX2NyZWF0ZUxpbmsodCxuLHIsaSxzKXtsZXQgYT1zLTE7ZG97Y29uc3QgbD1uLmNoYXJDb2RlQXQoYSk7aWYodC5nZXQobCkhPT0yKWJyZWFrO2EtLX13aGlsZShhPmkpO2lmKGk+MCl7Y29uc3QgbD1uLmNoYXJDb2RlQXQoaS0xKSxvPW4uY2hhckNvZGVBdChhKTsobD09PTQwJiZvPT09NDF8fGw9PT05MSYmbz09PTkzfHxsPT09MTIzJiZvPT09MTI1KSYmYS0tfXJldHVybntyYW5nZTp7c3RhcnRMaW5lTnVtYmVyOnIsc3RhcnRDb2x1bW46aSsxLGVuZExpbmVOdW1iZXI6cixlbmRDb2x1bW46YSsyfSx1cmw6bi5zdWJzdHJpbmcoaSxhKzEpfX1zdGF0aWMgY29tcHV0ZUxpbmtzKHQsbj1hdSgpKXtjb25zdCByPW91KCksaT1bXTtmb3IobGV0IHM9MSxhPXQuZ2V0TGluZUNvdW50KCk7czw9YTtzKyspe2NvbnN0IGw9dC5nZXRMaW5lQ29udGVudChzKSxvPWwubGVuZ3RoO2xldCB1PTAsaD0wLGY9MCxkPTEsbT0hMSxnPSExLHA9ITEseD0hMTtmb3IoO3U8bzspe2xldCB3PSExO2NvbnN0IEw9bC5jaGFyQ29kZUF0KHUpO2lmKGQ9PT0xMyl7bGV0IHY7c3dpdGNoKEwpe2Nhc2UgNDA6bT0hMCx2PTA7YnJlYWs7Y2FzZSA0MTp2PW0/MDoxO2JyZWFrO2Nhc2UgOTE6cD0hMCxnPSEwLHY9MDticmVhaztjYXNlIDkzOnA9ITEsdj1nPzA6MTticmVhaztjYXNlIDEyMzp4PSEwLHY9MDticmVhaztjYXNlIDEyNTp2PXg/MDoxO2JyZWFrO2Nhc2UgMzk6Y2FzZSAzNDpjYXNlIDk2OmY9PT1MP3Y9MTpmPT09Mzl8fGY9PT0zNHx8Zj09PTk2P3Y9MDp2PTE7YnJlYWs7Y2FzZSA0Mjp2PWY9PT00Mj8xOjA7YnJlYWs7Y2FzZSAxMjQ6dj1mPT09MTI0PzE6MDticmVhaztjYXNlIDMyOnY9cD8wOjE7YnJlYWs7ZGVmYXVsdDp2PXIuZ2V0KEwpfXY9PT0xJiYoaS5wdXNoKG1uLl9jcmVhdGVMaW5rKHIsbCxzLGgsdSkpLHc9ITApfWVsc2UgaWYoZD09PTEyKXtsZXQgdjtMPT09OTE/KGc9ITAsdj0wKTp2PXIuZ2V0KEwpLHY9PT0xP3c9ITA6ZD0xM31lbHNlIGQ9bi5uZXh0U3RhdGUoZCxMKSxkPT09MCYmKHc9ITApO3cmJihkPTEsbT0hMSxnPSExLHg9ITEsaD11KzEsZj1MKSx1Kyt9ZD09PTEzJiZpLnB1c2gobW4uX2NyZWF0ZUxpbmsocixsLHMsaCxvKSl9cmV0dXJuIGl9fWZ1bmN0aW9uIGx1KGUpe3JldHVybiFlfHx0eXBlb2YgZS5nZXRMaW5lQ291bnQhPSJmdW5jdGlvbiJ8fHR5cGVvZiBlLmdldExpbmVDb250ZW50IT0iZnVuY3Rpb24iP1tdOm1uLmNvbXB1dGVMaW5rcyhlKX1jb25zdCBPbj1jbGFzcyBPbntjb25zdHJ1Y3Rvcigpe3RoaXMuX2RlZmF1bHRWYWx1ZVNldD1bWyJ0cnVlIiwiZmFsc2UiXSxbIlRydWUiLCJGYWxzZSJdLFsiUHJpdmF0ZSIsIlB1YmxpYyIsIkZyaWVuZCIsIlJlYWRPbmx5IiwiUGFydGlhbCIsIlByb3RlY3RlZCIsIldyaXRlT25seSJdLFsicHVibGljIiwicHJvdGVjdGVkIiwicHJpdmF0ZSJdXX1uYXZpZ2F0ZVZhbHVlU2V0KHQsbixyLGkscyl7aWYodCYmbil7Y29uc3QgYT10aGlzLmRvTmF2aWdhdGVWYWx1ZVNldChuLHMpO2lmKGEpcmV0dXJue3JhbmdlOnQsdmFsdWU6YX19aWYociYmaSl7Y29uc3QgYT10aGlzLmRvTmF2aWdhdGVWYWx1ZVNldChpLHMpO2lmKGEpcmV0dXJue3JhbmdlOnIsdmFsdWU6YX19cmV0dXJuIG51bGx9ZG9OYXZpZ2F0ZVZhbHVlU2V0KHQsbil7Y29uc3Qgcj10aGlzLm51bWJlclJlcGxhY2UodCxuKTtyZXR1cm4gciE9PW51bGw/cjp0aGlzLnRleHRSZXBsYWNlKHQsbil9bnVtYmVyUmVwbGFjZSh0LG4pe2NvbnN0IHI9TWF0aC5wb3coMTAsdC5sZW5ndGgtKHQubGFzdEluZGV4T2YoIi4iKSsxKSk7bGV0IGk9TnVtYmVyKHQpO2NvbnN0IHM9cGFyc2VGbG9hdCh0KTtyZXR1cm4haXNOYU4oaSkmJiFpc05hTihzKSYmaT09PXM/aT09PTAmJiFuP251bGw6KGk9TWF0aC5mbG9vcihpKnIpLGkrPW4/cjotcixTdHJpbmcoaS9yKSk6bnVsbH10ZXh0UmVwbGFjZSh0LG4pe3JldHVybiB0aGlzLnZhbHVlU2V0c1JlcGxhY2UodGhpcy5fZGVmYXVsdFZhbHVlU2V0LHQsbil9dmFsdWVTZXRzUmVwbGFjZSh0LG4scil7bGV0IGk9bnVsbDtmb3IobGV0IHM9MCxhPXQubGVuZ3RoO2k9PT1udWxsJiZzPGE7cysrKWk9dGhpcy52YWx1ZVNldFJlcGxhY2UodFtzXSxuLHIpO3JldHVybiBpfXZhbHVlU2V0UmVwbGFjZSh0LG4scil7bGV0IGk9dC5pbmRleE9mKG4pO3JldHVybiBpPj0wPyhpKz1yPzE6LTEsaTwwP2k9dC5sZW5ndGgtMTppJT10Lmxlbmd0aCx0W2ldKTpudWxsfX07T24uSU5TVEFOQ0U9bmV3IE9uO2xldCBjcj1Pbjtjb25zdCBFaT1PYmplY3QuZnJlZXplKGZ1bmN0aW9uKGUsdCl7Y29uc3Qgbj1zZXRUaW1lb3V0KGUuYmluZCh0KSwwKTtyZXR1cm57ZGlzcG9zZSgpe2NsZWFyVGltZW91dChuKX19fSk7dmFyIGduOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3JldHVybiBuPT09ZS5Ob25lfHxuPT09ZS5DYW5jZWxsZWR8fG4gaW5zdGFuY2VvZiBwbj8hMDohbnx8dHlwZW9mIG4hPSJvYmplY3QiPyExOnR5cGVvZiBuLmlzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkPT0iYm9vbGVhbiImJnR5cGVvZiBuLm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkPT0iZnVuY3Rpb24ifWUuaXNDYW5jZWxsYXRpb25Ub2tlbj10LGUuTm9uZT1PYmplY3QuZnJlZXplKHtpc0NhbmNlbGxhdGlvblJlcXVlc3RlZDohMSxvbkNhbmNlbGxhdGlvblJlcXVlc3RlZDp1bi5Ob25lfSksZS5DYW5jZWxsZWQ9T2JqZWN0LmZyZWV6ZSh7aXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6ITAsb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6RWl9KX0pKGdufHwoZ249e30pKTtjbGFzcyBwbntjb25zdHJ1Y3Rvcigpe3RoaXMuX2lzQ2FuY2VsbGVkPSExLHRoaXMuX2VtaXR0ZXI9bnVsbH1jYW5jZWwoKXt0aGlzLl9pc0NhbmNlbGxlZHx8KHRoaXMuX2lzQ2FuY2VsbGVkPSEwLHRoaXMuX2VtaXR0ZXImJih0aGlzLl9lbWl0dGVyLmZpcmUodm9pZCAwKSx0aGlzLmRpc3Bvc2UoKSkpfWdldCBpc0NhbmNlbGxhdGlvblJlcXVlc3RlZCgpe3JldHVybiB0aGlzLl9pc0NhbmNlbGxlZH1nZXQgb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKXtyZXR1cm4gdGhpcy5faXNDYW5jZWxsZWQ/RWk6KHRoaXMuX2VtaXR0ZXJ8fCh0aGlzLl9lbWl0dGVyPW5ldyBfZSksdGhpcy5fZW1pdHRlci5ldmVudCl9ZGlzcG9zZSgpe3RoaXMuX2VtaXR0ZXImJih0aGlzLl9lbWl0dGVyLmRpc3Bvc2UoKSx0aGlzLl9lbWl0dGVyPW51bGwpfX1jbGFzcyB1dXtjb25zdHJ1Y3Rvcih0KXt0aGlzLl90b2tlbj12b2lkIDAsdGhpcy5fcGFyZW50TGlzdGVuZXI9dm9pZCAwLHRoaXMuX3BhcmVudExpc3RlbmVyPXQmJnQub25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQodGhpcy5jYW5jZWwsdGhpcyl9Z2V0IHRva2VuKCl7cmV0dXJuIHRoaXMuX3Rva2VufHwodGhpcy5fdG9rZW49bmV3IHBuKSx0aGlzLl90b2tlbn1jYW5jZWwoKXt0aGlzLl90b2tlbj90aGlzLl90b2tlbiBpbnN0YW5jZW9mIHBuJiZ0aGlzLl90b2tlbi5jYW5jZWwoKTp0aGlzLl90b2tlbj1nbi5DYW5jZWxsZWR9ZGlzcG9zZSh0PSExKXt2YXIgbjt0JiZ0aGlzLmNhbmNlbCgpLChuPXRoaXMuX3BhcmVudExpc3RlbmVyKT09bnVsbHx8bi5kaXNwb3NlKCksdGhpcy5fdG9rZW4/dGhpcy5fdG9rZW4gaW5zdGFuY2VvZiBwbiYmdGhpcy5fdG9rZW4uZGlzcG9zZSgpOnRoaXMuX3Rva2VuPWduLk5vbmV9fWNsYXNzIGZye2NvbnN0cnVjdG9yKCl7dGhpcy5fa2V5Q29kZVRvU3RyPVtdLHRoaXMuX3N0clRvS2V5Q29kZT1PYmplY3QuY3JlYXRlKG51bGwpfWRlZmluZSh0LG4pe3RoaXMuX2tleUNvZGVUb1N0clt0XT1uLHRoaXMuX3N0clRvS2V5Q29kZVtuLnRvTG93ZXJDYXNlKCldPXR9a2V5Q29kZVRvU3RyKHQpe3JldHVybiB0aGlzLl9rZXlDb2RlVG9TdHJbdF19c3RyVG9LZXlDb2RlKHQpe3JldHVybiB0aGlzLl9zdHJUb0tleUNvZGVbdC50b0xvd2VyQ2FzZSgpXXx8MH19Y29uc3QgYm49bmV3IGZyLGhyPW5ldyBmcixkcj1uZXcgZnIsY3U9bmV3IEFycmF5KDIzMCksZnU9T2JqZWN0LmNyZWF0ZShudWxsKSxodT1PYmplY3QuY3JlYXRlKG51bGwpOyhmdW5jdGlvbigpe2NvbnN0IGU9IiIsdD1bWzEsMCwiTm9uZSIsMCwidW5rbm93biIsMCwiVktfVU5LTk9XTiIsZSxlXSxbMSwxLCJIeXBlciIsMCxlLDAsZSxlLGVdLFsxLDIsIlN1cGVyIiwwLGUsMCxlLGUsZV0sWzEsMywiRm4iLDAsZSwwLGUsZSxlXSxbMSw0LCJGbkxvY2siLDAsZSwwLGUsZSxlXSxbMSw1LCJTdXNwZW5kIiwwLGUsMCxlLGUsZV0sWzEsNiwiUmVzdW1lIiwwLGUsMCxlLGUsZV0sWzEsNywiVHVyYm8iLDAsZSwwLGUsZSxlXSxbMSw4LCJTbGVlcCIsMCxlLDAsIlZLX1NMRUVQIixlLGVdLFsxLDksIldha2VVcCIsMCxlLDAsZSxlLGVdLFswLDEwLCJLZXlBIiwzMSwiQSIsNjUsIlZLX0EiLGUsZV0sWzAsMTEsIktleUIiLDMyLCJCIiw2NiwiVktfQiIsZSxlXSxbMCwxMiwiS2V5QyIsMzMsIkMiLDY3LCJWS19DIixlLGVdLFswLDEzLCJLZXlEIiwzNCwiRCIsNjgsIlZLX0QiLGUsZV0sWzAsMTQsIktleUUiLDM1LCJFIiw2OSwiVktfRSIsZSxlXSxbMCwxNSwiS2V5RiIsMzYsIkYiLDcwLCJWS19GIixlLGVdLFswLDE2LCJLZXlHIiwzNywiRyIsNzEsIlZLX0ciLGUsZV0sWzAsMTcsIktleUgiLDM4LCJIIiw3MiwiVktfSCIsZSxlXSxbMCwxOCwiS2V5SSIsMzksIkkiLDczLCJWS19JIixlLGVdLFswLDE5LCJLZXlKIiw0MCwiSiIsNzQsIlZLX0oiLGUsZV0sWzAsMjAsIktleUsiLDQxLCJLIiw3NSwiVktfSyIsZSxlXSxbMCwyMSwiS2V5TCIsNDIsIkwiLDc2LCJWS19MIixlLGVdLFswLDIyLCJLZXlNIiw0MywiTSIsNzcsIlZLX00iLGUsZV0sWzAsMjMsIktleU4iLDQ0LCJOIiw3OCwiVktfTiIsZSxlXSxbMCwyNCwiS2V5TyIsNDUsIk8iLDc5LCJWS19PIixlLGVdLFswLDI1LCJLZXlQIiw0NiwiUCIsODAsIlZLX1AiLGUsZV0sWzAsMjYsIktleVEiLDQ3LCJRIiw4MSwiVktfUSIsZSxlXSxbMCwyNywiS2V5UiIsNDgsIlIiLDgyLCJWS19SIixlLGVdLFswLDI4LCJLZXlTIiw0OSwiUyIsODMsIlZLX1MiLGUsZV0sWzAsMjksIktleVQiLDUwLCJUIiw4NCwiVktfVCIsZSxlXSxbMCwzMCwiS2V5VSIsNTEsIlUiLDg1LCJWS19VIixlLGVdLFswLDMxLCJLZXlWIiw1MiwiViIsODYsIlZLX1YiLGUsZV0sWzAsMzIsIktleVciLDUzLCJXIiw4NywiVktfVyIsZSxlXSxbMCwzMywiS2V5WCIsNTQsIlgiLDg4LCJWS19YIixlLGVdLFswLDM0LCJLZXlZIiw1NSwiWSIsODksIlZLX1kiLGUsZV0sWzAsMzUsIktleVoiLDU2LCJaIiw5MCwiVktfWiIsZSxlXSxbMCwzNiwiRGlnaXQxIiwyMiwiMSIsNDksIlZLXzEiLGUsZV0sWzAsMzcsIkRpZ2l0MiIsMjMsIjIiLDUwLCJWS18yIixlLGVdLFswLDM4LCJEaWdpdDMiLDI0LCIzIiw1MSwiVktfMyIsZSxlXSxbMCwzOSwiRGlnaXQ0IiwyNSwiNCIsNTIsIlZLXzQiLGUsZV0sWzAsNDAsIkRpZ2l0NSIsMjYsIjUiLDUzLCJWS181IixlLGVdLFswLDQxLCJEaWdpdDYiLDI3LCI2Iiw1NCwiVktfNiIsZSxlXSxbMCw0MiwiRGlnaXQ3IiwyOCwiNyIsNTUsIlZLXzciLGUsZV0sWzAsNDMsIkRpZ2l0OCIsMjksIjgiLDU2LCJWS184IixlLGVdLFswLDQ0LCJEaWdpdDkiLDMwLCI5Iiw1NywiVktfOSIsZSxlXSxbMCw0NSwiRGlnaXQwIiwyMSwiMCIsNDgsIlZLXzAiLGUsZV0sWzEsNDYsIkVudGVyIiwzLCJFbnRlciIsMTMsIlZLX1JFVFVSTiIsZSxlXSxbMSw0NywiRXNjYXBlIiw5LCJFc2NhcGUiLDI3LCJWS19FU0NBUEUiLGUsZV0sWzEsNDgsIkJhY2tzcGFjZSIsMSwiQmFja3NwYWNlIiw4LCJWS19CQUNLIixlLGVdLFsxLDQ5LCJUYWIiLDIsIlRhYiIsOSwiVktfVEFCIixlLGVdLFsxLDUwLCJTcGFjZSIsMTAsIlNwYWNlIiwzMiwiVktfU1BBQ0UiLGUsZV0sWzAsNTEsIk1pbnVzIiw4OCwiLSIsMTg5LCJWS19PRU1fTUlOVVMiLCItIiwiT0VNX01JTlVTIl0sWzAsNTIsIkVxdWFsIiw4NiwiPSIsMTg3LCJWS19PRU1fUExVUyIsIj0iLCJPRU1fUExVUyJdLFswLDUzLCJCcmFja2V0TGVmdCIsOTIsIlsiLDIxOSwiVktfT0VNXzQiLCJbIiwiT0VNXzQiXSxbMCw1NCwiQnJhY2tldFJpZ2h0Iiw5NCwiXSIsMjIxLCJWS19PRU1fNiIsIl0iLCJPRU1fNiJdLFswLDU1LCJCYWNrc2xhc2giLDkzLCJcXCIsMjIwLCJWS19PRU1fNSIsIlxcIiwiT0VNXzUiXSxbMCw1NiwiSW50bEhhc2giLDAsZSwwLGUsZSxlXSxbMCw1NywiU2VtaWNvbG9uIiw4NSwiOyIsMTg2LCJWS19PRU1fMSIsIjsiLCJPRU1fMSJdLFswLDU4LCJRdW90ZSIsOTUsIiciLDIyMiwiVktfT0VNXzciLCInIiwiT0VNXzciXSxbMCw1OSwiQmFja3F1b3RlIiw5MSwiYCIsMTkyLCJWS19PRU1fMyIsImAiLCJPRU1fMyJdLFswLDYwLCJDb21tYSIsODcsIiwiLDE4OCwiVktfT0VNX0NPTU1BIiwiLCIsIk9FTV9DT01NQSJdLFswLDYxLCJQZXJpb2QiLDg5LCIuIiwxOTAsIlZLX09FTV9QRVJJT0QiLCIuIiwiT0VNX1BFUklPRCJdLFswLDYyLCJTbGFzaCIsOTAsIi8iLDE5MSwiVktfT0VNXzIiLCIvIiwiT0VNXzIiXSxbMSw2MywiQ2Fwc0xvY2siLDgsIkNhcHNMb2NrIiwyMCwiVktfQ0FQSVRBTCIsZSxlXSxbMSw2NCwiRjEiLDU5LCJGMSIsMTEyLCJWS19GMSIsZSxlXSxbMSw2NSwiRjIiLDYwLCJGMiIsMTEzLCJWS19GMiIsZSxlXSxbMSw2NiwiRjMiLDYxLCJGMyIsMTE0LCJWS19GMyIsZSxlXSxbMSw2NywiRjQiLDYyLCJGNCIsMTE1LCJWS19GNCIsZSxlXSxbMSw2OCwiRjUiLDYzLCJGNSIsMTE2LCJWS19GNSIsZSxlXSxbMSw2OSwiRjYiLDY0LCJGNiIsMTE3LCJWS19GNiIsZSxlXSxbMSw3MCwiRjciLDY1LCJGNyIsMTE4LCJWS19GNyIsZSxlXSxbMSw3MSwiRjgiLDY2LCJGOCIsMTE5LCJWS19GOCIsZSxlXSxbMSw3MiwiRjkiLDY3LCJGOSIsMTIwLCJWS19GOSIsZSxlXSxbMSw3MywiRjEwIiw2OCwiRjEwIiwxMjEsIlZLX0YxMCIsZSxlXSxbMSw3NCwiRjExIiw2OSwiRjExIiwxMjIsIlZLX0YxMSIsZSxlXSxbMSw3NSwiRjEyIiw3MCwiRjEyIiwxMjMsIlZLX0YxMiIsZSxlXSxbMSw3NiwiUHJpbnRTY3JlZW4iLDAsZSwwLGUsZSxlXSxbMSw3NywiU2Nyb2xsTG9jayIsODQsIlNjcm9sbExvY2siLDE0NSwiVktfU0NST0xMIixlLGVdLFsxLDc4LCJQYXVzZSIsNywiUGF1c2VCcmVhayIsMTksIlZLX1BBVVNFIixlLGVdLFsxLDc5LCJJbnNlcnQiLDE5LCJJbnNlcnQiLDQ1LCJWS19JTlNFUlQiLGUsZV0sWzEsODAsIkhvbWUiLDE0LCJIb21lIiwzNiwiVktfSE9NRSIsZSxlXSxbMSw4MSwiUGFnZVVwIiwxMSwiUGFnZVVwIiwzMywiVktfUFJJT1IiLGUsZV0sWzEsODIsIkRlbGV0ZSIsMjAsIkRlbGV0ZSIsNDYsIlZLX0RFTEVURSIsZSxlXSxbMSw4MywiRW5kIiwxMywiRW5kIiwzNSwiVktfRU5EIixlLGVdLFsxLDg0LCJQYWdlRG93biIsMTIsIlBhZ2VEb3duIiwzNCwiVktfTkVYVCIsZSxlXSxbMSw4NSwiQXJyb3dSaWdodCIsMTcsIlJpZ2h0QXJyb3ciLDM5LCJWS19SSUdIVCIsIlJpZ2h0IixlXSxbMSw4NiwiQXJyb3dMZWZ0IiwxNSwiTGVmdEFycm93IiwzNywiVktfTEVGVCIsIkxlZnQiLGVdLFsxLDg3LCJBcnJvd0Rvd24iLDE4LCJEb3duQXJyb3ciLDQwLCJWS19ET1dOIiwiRG93biIsZV0sWzEsODgsIkFycm93VXAiLDE2LCJVcEFycm93IiwzOCwiVktfVVAiLCJVcCIsZV0sWzEsODksIk51bUxvY2siLDgzLCJOdW1Mb2NrIiwxNDQsIlZLX05VTUxPQ0siLGUsZV0sWzEsOTAsIk51bXBhZERpdmlkZSIsMTEzLCJOdW1QYWRfRGl2aWRlIiwxMTEsIlZLX0RJVklERSIsZSxlXSxbMSw5MSwiTnVtcGFkTXVsdGlwbHkiLDEwOCwiTnVtUGFkX011bHRpcGx5IiwxMDYsIlZLX01VTFRJUExZIixlLGVdLFsxLDkyLCJOdW1wYWRTdWJ0cmFjdCIsMTExLCJOdW1QYWRfU3VidHJhY3QiLDEwOSwiVktfU1VCVFJBQ1QiLGUsZV0sWzEsOTMsIk51bXBhZEFkZCIsMTA5LCJOdW1QYWRfQWRkIiwxMDcsIlZLX0FERCIsZSxlXSxbMSw5NCwiTnVtcGFkRW50ZXIiLDMsZSwwLGUsZSxlXSxbMSw5NSwiTnVtcGFkMSIsOTksIk51bVBhZDEiLDk3LCJWS19OVU1QQUQxIixlLGVdLFsxLDk2LCJOdW1wYWQyIiwxMDAsIk51bVBhZDIiLDk4LCJWS19OVU1QQUQyIixlLGVdLFsxLDk3LCJOdW1wYWQzIiwxMDEsIk51bVBhZDMiLDk5LCJWS19OVU1QQUQzIixlLGVdLFsxLDk4LCJOdW1wYWQ0IiwxMDIsIk51bVBhZDQiLDEwMCwiVktfTlVNUEFENCIsZSxlXSxbMSw5OSwiTnVtcGFkNSIsMTAzLCJOdW1QYWQ1IiwxMDEsIlZLX05VTVBBRDUiLGUsZV0sWzEsMTAwLCJOdW1wYWQ2IiwxMDQsIk51bVBhZDYiLDEwMiwiVktfTlVNUEFENiIsZSxlXSxbMSwxMDEsIk51bXBhZDciLDEwNSwiTnVtUGFkNyIsMTAzLCJWS19OVU1QQUQ3IixlLGVdLFsxLDEwMiwiTnVtcGFkOCIsMTA2LCJOdW1QYWQ4IiwxMDQsIlZLX05VTVBBRDgiLGUsZV0sWzEsMTAzLCJOdW1wYWQ5IiwxMDcsIk51bVBhZDkiLDEwNSwiVktfTlVNUEFEOSIsZSxlXSxbMSwxMDQsIk51bXBhZDAiLDk4LCJOdW1QYWQwIiw5NiwiVktfTlVNUEFEMCIsZSxlXSxbMSwxMDUsIk51bXBhZERlY2ltYWwiLDExMiwiTnVtUGFkX0RlY2ltYWwiLDExMCwiVktfREVDSU1BTCIsZSxlXSxbMCwxMDYsIkludGxCYWNrc2xhc2giLDk3LCJPRU1fMTAyIiwyMjYsIlZLX09FTV8xMDIiLGUsZV0sWzEsMTA3LCJDb250ZXh0TWVudSIsNTgsIkNvbnRleHRNZW51Iiw5MyxlLGUsZV0sWzEsMTA4LCJQb3dlciIsMCxlLDAsZSxlLGVdLFsxLDEwOSwiTnVtcGFkRXF1YWwiLDAsZSwwLGUsZSxlXSxbMSwxMTAsIkYxMyIsNzEsIkYxMyIsMTI0LCJWS19GMTMiLGUsZV0sWzEsMTExLCJGMTQiLDcyLCJGMTQiLDEyNSwiVktfRjE0IixlLGVdLFsxLDExMiwiRjE1Iiw3MywiRjE1IiwxMjYsIlZLX0YxNSIsZSxlXSxbMSwxMTMsIkYxNiIsNzQsIkYxNiIsMTI3LCJWS19GMTYiLGUsZV0sWzEsMTE0LCJGMTciLDc1LCJGMTciLDEyOCwiVktfRjE3IixlLGVdLFsxLDExNSwiRjE4Iiw3NiwiRjE4IiwxMjksIlZLX0YxOCIsZSxlXSxbMSwxMTYsIkYxOSIsNzcsIkYxOSIsMTMwLCJWS19GMTkiLGUsZV0sWzEsMTE3LCJGMjAiLDc4LCJGMjAiLDEzMSwiVktfRjIwIixlLGVdLFsxLDExOCwiRjIxIiw3OSwiRjIxIiwxMzIsIlZLX0YyMSIsZSxlXSxbMSwxMTksIkYyMiIsODAsIkYyMiIsMTMzLCJWS19GMjIiLGUsZV0sWzEsMTIwLCJGMjMiLDgxLCJGMjMiLDEzNCwiVktfRjIzIixlLGVdLFsxLDEyMSwiRjI0Iiw4MiwiRjI0IiwxMzUsIlZLX0YyNCIsZSxlXSxbMSwxMjIsIk9wZW4iLDAsZSwwLGUsZSxlXSxbMSwxMjMsIkhlbHAiLDAsZSwwLGUsZSxlXSxbMSwxMjQsIlNlbGVjdCIsMCxlLDAsZSxlLGVdLFsxLDEyNSwiQWdhaW4iLDAsZSwwLGUsZSxlXSxbMSwxMjYsIlVuZG8iLDAsZSwwLGUsZSxlXSxbMSwxMjcsIkN1dCIsMCxlLDAsZSxlLGVdLFsxLDEyOCwiQ29weSIsMCxlLDAsZSxlLGVdLFsxLDEyOSwiUGFzdGUiLDAsZSwwLGUsZSxlXSxbMSwxMzAsIkZpbmQiLDAsZSwwLGUsZSxlXSxbMSwxMzEsIkF1ZGlvVm9sdW1lTXV0ZSIsMTE3LCJBdWRpb1ZvbHVtZU11dGUiLDE3MywiVktfVk9MVU1FX01VVEUiLGUsZV0sWzEsMTMyLCJBdWRpb1ZvbHVtZVVwIiwxMTgsIkF1ZGlvVm9sdW1lVXAiLDE3NSwiVktfVk9MVU1FX1VQIixlLGVdLFsxLDEzMywiQXVkaW9Wb2x1bWVEb3duIiwxMTksIkF1ZGlvVm9sdW1lRG93biIsMTc0LCJWS19WT0xVTUVfRE9XTiIsZSxlXSxbMSwxMzQsIk51bXBhZENvbW1hIiwxMTAsIk51bVBhZF9TZXBhcmF0b3IiLDEwOCwiVktfU0VQQVJBVE9SIixlLGVdLFswLDEzNSwiSW50bFJvIiwxMTUsIkFCTlRfQzEiLDE5MywiVktfQUJOVF9DMSIsZSxlXSxbMSwxMzYsIkthbmFNb2RlIiwwLGUsMCxlLGUsZV0sWzAsMTM3LCJJbnRsWWVuIiwwLGUsMCxlLGUsZV0sWzEsMTM4LCJDb252ZXJ0IiwwLGUsMCxlLGUsZV0sWzEsMTM5LCJOb25Db252ZXJ0IiwwLGUsMCxlLGUsZV0sWzEsMTQwLCJMYW5nMSIsMCxlLDAsZSxlLGVdLFsxLDE0MSwiTGFuZzIiLDAsZSwwLGUsZSxlXSxbMSwxNDIsIkxhbmczIiwwLGUsMCxlLGUsZV0sWzEsMTQzLCJMYW5nNCIsMCxlLDAsZSxlLGVdLFsxLDE0NCwiTGFuZzUiLDAsZSwwLGUsZSxlXSxbMSwxNDUsIkFib3J0IiwwLGUsMCxlLGUsZV0sWzEsMTQ2LCJQcm9wcyIsMCxlLDAsZSxlLGVdLFsxLDE0NywiTnVtcGFkUGFyZW5MZWZ0IiwwLGUsMCxlLGUsZV0sWzEsMTQ4LCJOdW1wYWRQYXJlblJpZ2h0IiwwLGUsMCxlLGUsZV0sWzEsMTQ5LCJOdW1wYWRCYWNrc3BhY2UiLDAsZSwwLGUsZSxlXSxbMSwxNTAsIk51bXBhZE1lbW9yeVN0b3JlIiwwLGUsMCxlLGUsZV0sWzEsMTUxLCJOdW1wYWRNZW1vcnlSZWNhbGwiLDAsZSwwLGUsZSxlXSxbMSwxNTIsIk51bXBhZE1lbW9yeUNsZWFyIiwwLGUsMCxlLGUsZV0sWzEsMTUzLCJOdW1wYWRNZW1vcnlBZGQiLDAsZSwwLGUsZSxlXSxbMSwxNTQsIk51bXBhZE1lbW9yeVN1YnRyYWN0IiwwLGUsMCxlLGUsZV0sWzEsMTU1LCJOdW1wYWRDbGVhciIsMTMxLCJDbGVhciIsMTIsIlZLX0NMRUFSIixlLGVdLFsxLDE1NiwiTnVtcGFkQ2xlYXJFbnRyeSIsMCxlLDAsZSxlLGVdLFsxLDAsZSw1LCJDdHJsIiwxNywiVktfQ09OVFJPTCIsZSxlXSxbMSwwLGUsNCwiU2hpZnQiLDE2LCJWS19TSElGVCIsZSxlXSxbMSwwLGUsNiwiQWx0IiwxOCwiVktfTUVOVSIsZSxlXSxbMSwwLGUsNTcsIk1ldGEiLDkxLCJWS19DT01NQU5EIixlLGVdLFsxLDE1NywiQ29udHJvbExlZnQiLDUsZSwwLCJWS19MQ09OVFJPTCIsZSxlXSxbMSwxNTgsIlNoaWZ0TGVmdCIsNCxlLDAsIlZLX0xTSElGVCIsZSxlXSxbMSwxNTksIkFsdExlZnQiLDYsZSwwLCJWS19MTUVOVSIsZSxlXSxbMSwxNjAsIk1ldGFMZWZ0Iiw1NyxlLDAsIlZLX0xXSU4iLGUsZV0sWzEsMTYxLCJDb250cm9sUmlnaHQiLDUsZSwwLCJWS19SQ09OVFJPTCIsZSxlXSxbMSwxNjIsIlNoaWZ0UmlnaHQiLDQsZSwwLCJWS19SU0hJRlQiLGUsZV0sWzEsMTYzLCJBbHRSaWdodCIsNixlLDAsIlZLX1JNRU5VIixlLGVdLFsxLDE2NCwiTWV0YVJpZ2h0Iiw1NyxlLDAsIlZLX1JXSU4iLGUsZV0sWzEsMTY1LCJCcmlnaHRuZXNzVXAiLDAsZSwwLGUsZSxlXSxbMSwxNjYsIkJyaWdodG5lc3NEb3duIiwwLGUsMCxlLGUsZV0sWzEsMTY3LCJNZWRpYVBsYXkiLDAsZSwwLGUsZSxlXSxbMSwxNjgsIk1lZGlhUmVjb3JkIiwwLGUsMCxlLGUsZV0sWzEsMTY5LCJNZWRpYUZhc3RGb3J3YXJkIiwwLGUsMCxlLGUsZV0sWzEsMTcwLCJNZWRpYVJld2luZCIsMCxlLDAsZSxlLGVdLFsxLDE3MSwiTWVkaWFUcmFja05leHQiLDEyNCwiTWVkaWFUcmFja05leHQiLDE3NiwiVktfTUVESUFfTkVYVF9UUkFDSyIsZSxlXSxbMSwxNzIsIk1lZGlhVHJhY2tQcmV2aW91cyIsMTI1LCJNZWRpYVRyYWNrUHJldmlvdXMiLDE3NywiVktfTUVESUFfUFJFVl9UUkFDSyIsZSxlXSxbMSwxNzMsIk1lZGlhU3RvcCIsMTI2LCJNZWRpYVN0b3AiLDE3OCwiVktfTUVESUFfU1RPUCIsZSxlXSxbMSwxNzQsIkVqZWN0IiwwLGUsMCxlLGUsZV0sWzEsMTc1LCJNZWRpYVBsYXlQYXVzZSIsMTI3LCJNZWRpYVBsYXlQYXVzZSIsMTc5LCJWS19NRURJQV9QTEFZX1BBVVNFIixlLGVdLFsxLDE3NiwiTWVkaWFTZWxlY3QiLDEyOCwiTGF1bmNoTWVkaWFQbGF5ZXIiLDE4MSwiVktfTUVESUFfTEFVTkNIX01FRElBX1NFTEVDVCIsZSxlXSxbMSwxNzcsIkxhdW5jaE1haWwiLDEyOSwiTGF1bmNoTWFpbCIsMTgwLCJWS19NRURJQV9MQVVOQ0hfTUFJTCIsZSxlXSxbMSwxNzgsIkxhdW5jaEFwcDIiLDEzMCwiTGF1bmNoQXBwMiIsMTgzLCJWS19NRURJQV9MQVVOQ0hfQVBQMiIsZSxlXSxbMSwxNzksIkxhdW5jaEFwcDEiLDAsZSwwLCJWS19NRURJQV9MQVVOQ0hfQVBQMSIsZSxlXSxbMSwxODAsIlNlbGVjdFRhc2siLDAsZSwwLGUsZSxlXSxbMSwxODEsIkxhdW5jaFNjcmVlblNhdmVyIiwwLGUsMCxlLGUsZV0sWzEsMTgyLCJCcm93c2VyU2VhcmNoIiwxMjAsIkJyb3dzZXJTZWFyY2giLDE3MCwiVktfQlJPV1NFUl9TRUFSQ0giLGUsZV0sWzEsMTgzLCJCcm93c2VySG9tZSIsMTIxLCJCcm93c2VySG9tZSIsMTcyLCJWS19CUk9XU0VSX0hPTUUiLGUsZV0sWzEsMTg0LCJCcm93c2VyQmFjayIsMTIyLCJCcm93c2VyQmFjayIsMTY2LCJWS19CUk9XU0VSX0JBQ0siLGUsZV0sWzEsMTg1LCJCcm93c2VyRm9yd2FyZCIsMTIzLCJCcm93c2VyRm9yd2FyZCIsMTY3LCJWS19CUk9XU0VSX0ZPUldBUkQiLGUsZV0sWzEsMTg2LCJCcm93c2VyU3RvcCIsMCxlLDAsIlZLX0JST1dTRVJfU1RPUCIsZSxlXSxbMSwxODcsIkJyb3dzZXJSZWZyZXNoIiwwLGUsMCwiVktfQlJPV1NFUl9SRUZSRVNIIixlLGVdLFsxLDE4OCwiQnJvd3NlckZhdm9yaXRlcyIsMCxlLDAsIlZLX0JST1dTRVJfRkFWT1JJVEVTIixlLGVdLFsxLDE4OSwiWm9vbVRvZ2dsZSIsMCxlLDAsZSxlLGVdLFsxLDE5MCwiTWFpbFJlcGx5IiwwLGUsMCxlLGUsZV0sWzEsMTkxLCJNYWlsRm9yd2FyZCIsMCxlLDAsZSxlLGVdLFsxLDE5MiwiTWFpbFNlbmQiLDAsZSwwLGUsZSxlXSxbMSwwLGUsMTE0LCJLZXlJbkNvbXBvc2l0aW9uIiwyMjksZSxlLGVdLFsxLDAsZSwxMTYsIkFCTlRfQzIiLDE5NCwiVktfQUJOVF9DMiIsZSxlXSxbMSwwLGUsOTYsIk9FTV84IiwyMjMsIlZLX09FTV84IixlLGVdLFsxLDAsZSwwLGUsMCwiVktfS0FOQSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0hBTkdVTCIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0pVTkpBIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfRklOQUwiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19IQU5KQSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0tBTkpJIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfQ09OVkVSVCIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX05PTkNPTlZFUlQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19BQ0NFUFQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19NT0RFQ0hBTkdFIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfU0VMRUNUIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfUFJJTlQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19FWEVDVVRFIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfU05BUFNIT1QiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19IRUxQIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfQVBQUyIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX1BST0NFU1NLRVkiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19QQUNLRVQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19EQkVfU0JDU0NIQVIiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19EQkVfREJDU0NIQVIiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19BVFROIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfQ1JTRUwiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19FWFNFTCIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0VSRU9GIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfUExBWSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX1pPT00iLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19OT05BTUUiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19QQTEiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19PRU1fQ0xFQVIiLGUsZV1dLG49W10scj1bXTtmb3IoY29uc3QgaSBvZiB0KXtjb25zdFtzLGEsbCxvLHUsaCxmLGQsbV09aTtpZihyW2FdfHwoclthXT0hMCxmdVtsXT1hLGh1W2wudG9Mb3dlckNhc2UoKV09YSksIW5bb10pe2lmKG5bb109ITAsIXUpdGhyb3cgbmV3IEVycm9yKGBTdHJpbmcgcmVwcmVzZW50YXRpb24gbWlzc2luZyBmb3Iga2V5IGNvZGUgJHtvfSBhcm91bmQgc2NhbiBjb2RlICR7bH1gKTtibi5kZWZpbmUobyx1KSxoci5kZWZpbmUobyxkfHx1KSxkci5kZWZpbmUobyxtfHxkfHx1KX1oJiYoY3VbaF09byl9fSkoKTt2YXIgTWk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobCl7cmV0dXJuIGJuLmtleUNvZGVUb1N0cihsKX1lLnRvU3RyaW5nPXQ7ZnVuY3Rpb24gbihsKXtyZXR1cm4gYm4uc3RyVG9LZXlDb2RlKGwpfWUuZnJvbVN0cmluZz1uO2Z1bmN0aW9uIHIobCl7cmV0dXJuIGhyLmtleUNvZGVUb1N0cihsKX1lLnRvVXNlclNldHRpbmdzVVM9cjtmdW5jdGlvbiBpKGwpe3JldHVybiBkci5rZXlDb2RlVG9TdHIobCl9ZS50b1VzZXJTZXR0aW5nc0dlbmVyYWw9aTtmdW5jdGlvbiBzKGwpe3JldHVybiBoci5zdHJUb0tleUNvZGUobCl8fGRyLnN0clRvS2V5Q29kZShsKX1lLmZyb21Vc2VyU2V0dGluZ3M9cztmdW5jdGlvbiBhKGwpe2lmKGw+PTk4JiZsPD0xMTMpcmV0dXJuIG51bGw7c3dpdGNoKGwpe2Nhc2UgMTY6cmV0dXJuIlVwIjtjYXNlIDE4OnJldHVybiJEb3duIjtjYXNlIDE1OnJldHVybiJMZWZ0IjtjYXNlIDE3OnJldHVybiJSaWdodCJ9cmV0dXJuIGJuLmtleUNvZGVUb1N0cihsKX1lLnRvRWxlY3Ryb25BY2NlbGVyYXRvcj1hfSkoTWl8fChNaT17fSkpO2Z1bmN0aW9uIGR1KGUsdCl7Y29uc3Qgbj0odCY2NTUzNSk8PDE2Pj4+MDtyZXR1cm4oZXxuKT4+PjB9Y2xhc3MgdmUgZXh0ZW5kcyB6e2NvbnN0cnVjdG9yKHQsbixyLGkpe3N1cGVyKHQsbixyLGkpLHRoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyPXQsdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbj1uLHRoaXMucG9zaXRpb25MaW5lTnVtYmVyPXIsdGhpcy5wb3NpdGlvbkNvbHVtbj1pfXRvU3RyaW5nKCl7cmV0dXJuIlsiK3RoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyKyIsIit0aGlzLnNlbGVjdGlvblN0YXJ0Q29sdW1uKyIgLT4gIit0aGlzLnBvc2l0aW9uTGluZU51bWJlcisiLCIrdGhpcy5wb3NpdGlvbkNvbHVtbisiXSJ9ZXF1YWxzU2VsZWN0aW9uKHQpe3JldHVybiB2ZS5zZWxlY3Rpb25zRXF1YWwodGhpcyx0KX1zdGF0aWMgc2VsZWN0aW9uc0VxdWFsKHQsbil7cmV0dXJuIHQuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyPT09bi5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXImJnQuc2VsZWN0aW9uU3RhcnRDb2x1bW49PT1uLnNlbGVjdGlvblN0YXJ0Q29sdW1uJiZ0LnBvc2l0aW9uTGluZU51bWJlcj09PW4ucG9zaXRpb25MaW5lTnVtYmVyJiZ0LnBvc2l0aW9uQ29sdW1uPT09bi5wb3NpdGlvbkNvbHVtbn1nZXREaXJlY3Rpb24oKXtyZXR1cm4gdGhpcy5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXI9PT10aGlzLnN0YXJ0TGluZU51bWJlciYmdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbj09PXRoaXMuc3RhcnRDb2x1bW4/MDoxfXNldEVuZFBvc2l0aW9uKHQsbil7cmV0dXJuIHRoaXMuZ2V0RGlyZWN0aW9uKCk9PT0wP25ldyB2ZSh0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLnN0YXJ0Q29sdW1uLHQsbik6bmV3IHZlKHQsbix0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLnN0YXJ0Q29sdW1uKX1nZXRQb3NpdGlvbigpe3JldHVybiBuZXcgZWUodGhpcy5wb3NpdGlvbkxpbmVOdW1iZXIsdGhpcy5wb3NpdGlvbkNvbHVtbil9Z2V0U2VsZWN0aW9uU3RhcnQoKXtyZXR1cm4gbmV3IGVlKHRoaXMuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyLHRoaXMuc2VsZWN0aW9uU3RhcnRDb2x1bW4pfXNldFN0YXJ0UG9zaXRpb24odCxuKXtyZXR1cm4gdGhpcy5nZXREaXJlY3Rpb24oKT09PTA/bmV3IHZlKHQsbix0aGlzLmVuZExpbmVOdW1iZXIsdGhpcy5lbmRDb2x1bW4pOm5ldyB2ZSh0aGlzLmVuZExpbmVOdW1iZXIsdGhpcy5lbmRDb2x1bW4sdCxuKX1zdGF0aWMgZnJvbVBvc2l0aW9ucyh0LG49dCl7cmV0dXJuIG5ldyB2ZSh0LmxpbmVOdW1iZXIsdC5jb2x1bW4sbi5saW5lTnVtYmVyLG4uY29sdW1uKX1zdGF0aWMgZnJvbVJhbmdlKHQsbil7cmV0dXJuIG49PT0wP25ldyB2ZSh0LnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0Q29sdW1uLHQuZW5kTGluZU51bWJlcix0LmVuZENvbHVtbik6bmV3IHZlKHQuZW5kTGluZU51bWJlcix0LmVuZENvbHVtbix0LnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0Q29sdW1uKX1zdGF0aWMgbGlmdFNlbGVjdGlvbih0KXtyZXR1cm4gbmV3IHZlKHQuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyLHQuc2VsZWN0aW9uU3RhcnRDb2x1bW4sdC5wb3NpdGlvbkxpbmVOdW1iZXIsdC5wb3NpdGlvbkNvbHVtbil9c3RhdGljIHNlbGVjdGlvbnNBcnJFcXVhbCh0LG4pe2lmKHQmJiFufHwhdCYmbilyZXR1cm4hMTtpZighdCYmIW4pcmV0dXJuITA7aWYodC5sZW5ndGghPT1uLmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IHI9MCxpPXQubGVuZ3RoO3I8aTtyKyspaWYoIXRoaXMuc2VsZWN0aW9uc0VxdWFsKHRbcl0sbltyXSkpcmV0dXJuITE7cmV0dXJuITB9c3RhdGljIGlzSVNlbGVjdGlvbih0KXtyZXR1cm4gdCYmdHlwZW9mIHQuc2VsZWN0aW9uU3RhcnRMaW5lTnVtYmVyPT0ibnVtYmVyIiYmdHlwZW9mIHQuc2VsZWN0aW9uU3RhcnRDb2x1bW49PSJudW1iZXIiJiZ0eXBlb2YgdC5wb3NpdGlvbkxpbmVOdW1iZXI9PSJudW1iZXIiJiZ0eXBlb2YgdC5wb3NpdGlvbkNvbHVtbj09Im51bWJlciJ9c3RhdGljIGNyZWF0ZVdpdGhEaXJlY3Rpb24odCxuLHIsaSxzKXtyZXR1cm4gcz09PTA/bmV3IHZlKHQsbixyLGkpOm5ldyB2ZShyLGksdCxuKX19ZnVuY3Rpb24gbXUoZSl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIn1jb25zdCBDaT1PYmplY3QuY3JlYXRlKG51bGwpO2Z1bmN0aW9uIGMoZSx0KXtpZihtdSh0KSl7Y29uc3Qgbj1DaVt0XTtpZihuPT09dm9pZCAwKXRocm93IG5ldyBFcnJvcihgJHtlfSByZWZlcmVuY2VzIGFuIHVua25vd24gY29kaWNvbjogJHt0fWApO3Q9bn1yZXR1cm4gQ2lbZV09dCx7aWQ6ZX19Y29uc3QgZ3U9e2FkZDpjKCJhZGQiLDZlNCkscGx1czpjKCJwbHVzIiw2ZTQpLGdpc3ROZXc6YygiZ2lzdC1uZXciLDZlNCkscmVwb0NyZWF0ZTpjKCJyZXBvLWNyZWF0ZSIsNmU0KSxsaWdodGJ1bGI6YygibGlnaHRidWxiIiw2MDAwMSksbGlnaHRCdWxiOmMoImxpZ2h0LWJ1bGIiLDYwMDAxKSxyZXBvOmMoInJlcG8iLDYwMDAyKSxyZXBvRGVsZXRlOmMoInJlcG8tZGVsZXRlIiw2MDAwMiksZ2lzdEZvcms6YygiZ2lzdC1mb3JrIiw2MDAwMykscmVwb0ZvcmtlZDpjKCJyZXBvLWZvcmtlZCIsNjAwMDMpLGdpdFB1bGxSZXF1ZXN0OmMoImdpdC1wdWxsLXJlcXVlc3QiLDYwMDA0KSxnaXRQdWxsUmVxdWVzdEFiYW5kb25lZDpjKCJnaXQtcHVsbC1yZXF1ZXN0LWFiYW5kb25lZCIsNjAwMDQpLHJlY29yZEtleXM6YygicmVjb3JkLWtleXMiLDYwMDA1KSxrZXlib2FyZDpjKCJrZXlib2FyZCIsNjAwMDUpLHRhZzpjKCJ0YWciLDYwMDA2KSxnaXRQdWxsUmVxdWVzdExhYmVsOmMoImdpdC1wdWxsLXJlcXVlc3QtbGFiZWwiLDYwMDA2KSx0YWdBZGQ6YygidGFnLWFkZCIsNjAwMDYpLHRhZ1JlbW92ZTpjKCJ0YWctcmVtb3ZlIiw2MDAwNikscGVyc29uOmMoInBlcnNvbiIsNjAwMDcpLHBlcnNvbkZvbGxvdzpjKCJwZXJzb24tZm9sbG93Iiw2MDAwNykscGVyc29uT3V0bGluZTpjKCJwZXJzb24tb3V0bGluZSIsNjAwMDcpLHBlcnNvbkZpbGxlZDpjKCJwZXJzb24tZmlsbGVkIiw2MDAwNyksZ2l0QnJhbmNoOmMoImdpdC1icmFuY2giLDYwMDA4KSxnaXRCcmFuY2hDcmVhdGU6YygiZ2l0LWJyYW5jaC1jcmVhdGUiLDYwMDA4KSxnaXRCcmFuY2hEZWxldGU6YygiZ2l0LWJyYW5jaC1kZWxldGUiLDYwMDA4KSxzb3VyY2VDb250cm9sOmMoInNvdXJjZS1jb250cm9sIiw2MDAwOCksbWlycm9yOmMoIm1pcnJvciIsNjAwMDkpLG1pcnJvclB1YmxpYzpjKCJtaXJyb3ItcHVibGljIiw2MDAwOSksc3RhcjpjKCJzdGFyIiw2MDAxMCksc3RhckFkZDpjKCJzdGFyLWFkZCIsNjAwMTApLHN0YXJEZWxldGU6Yygic3Rhci1kZWxldGUiLDYwMDEwKSxzdGFyRW1wdHk6Yygic3Rhci1lbXB0eSIsNjAwMTApLGNvbW1lbnQ6YygiY29tbWVudCIsNjAwMTEpLGNvbW1lbnRBZGQ6YygiY29tbWVudC1hZGQiLDYwMDExKSxhbGVydDpjKCJhbGVydCIsNjAwMTIpLHdhcm5pbmc6Yygid2FybmluZyIsNjAwMTIpLHNlYXJjaDpjKCJzZWFyY2giLDYwMDEzKSxzZWFyY2hTYXZlOmMoInNlYXJjaC1zYXZlIiw2MDAxMyksbG9nT3V0OmMoImxvZy1vdXQiLDYwMDE0KSxzaWduT3V0OmMoInNpZ24tb3V0Iiw2MDAxNCksbG9nSW46YygibG9nLWluIiw2MDAxNSksc2lnbkluOmMoInNpZ24taW4iLDYwMDE1KSxleWU6YygiZXllIiw2MDAxNiksZXllVW53YXRjaDpjKCJleWUtdW53YXRjaCIsNjAwMTYpLGV5ZVdhdGNoOmMoImV5ZS13YXRjaCIsNjAwMTYpLGNpcmNsZUZpbGxlZDpjKCJjaXJjbGUtZmlsbGVkIiw2MDAxNykscHJpbWl0aXZlRG90OmMoInByaW1pdGl2ZS1kb3QiLDYwMDE3KSxjbG9zZURpcnR5OmMoImNsb3NlLWRpcnR5Iiw2MDAxNyksZGVidWdCcmVha3BvaW50OmMoImRlYnVnLWJyZWFrcG9pbnQiLDYwMDE3KSxkZWJ1Z0JyZWFrcG9pbnREaXNhYmxlZDpjKCJkZWJ1Zy1icmVha3BvaW50LWRpc2FibGVkIiw2MDAxNyksZGVidWdIaW50OmMoImRlYnVnLWhpbnQiLDYwMDE3KSx0ZXJtaW5hbERlY29yYXRpb25TdWNjZXNzOmMoInRlcm1pbmFsLWRlY29yYXRpb24tc3VjY2VzcyIsNjAwMTcpLHByaW1pdGl2ZVNxdWFyZTpjKCJwcmltaXRpdmUtc3F1YXJlIiw2MDAxOCksZWRpdDpjKCJlZGl0Iiw2MDAxOSkscGVuY2lsOmMoInBlbmNpbCIsNjAwMTkpLGluZm86YygiaW5mbyIsNjAwMjApLGlzc3VlT3BlbmVkOmMoImlzc3VlLW9wZW5lZCIsNjAwMjApLGdpc3RQcml2YXRlOmMoImdpc3QtcHJpdmF0ZSIsNjAwMjEpLGdpdEZvcmtQcml2YXRlOmMoImdpdC1mb3JrLXByaXZhdGUiLDYwMDIxKSxsb2NrOmMoImxvY2siLDYwMDIxKSxtaXJyb3JQcml2YXRlOmMoIm1pcnJvci1wcml2YXRlIiw2MDAyMSksY2xvc2U6YygiY2xvc2UiLDYwMDIyKSxyZW1vdmVDbG9zZTpjKCJyZW1vdmUtY2xvc2UiLDYwMDIyKSx4OmMoIngiLDYwMDIyKSxyZXBvU3luYzpjKCJyZXBvLXN5bmMiLDYwMDIzKSxzeW5jOmMoInN5bmMiLDYwMDIzKSxjbG9uZTpjKCJjbG9uZSIsNjAwMjQpLGRlc2t0b3BEb3dubG9hZDpjKCJkZXNrdG9wLWRvd25sb2FkIiw2MDAyNCksYmVha2VyOmMoImJlYWtlciIsNjAwMjUpLG1pY3Jvc2NvcGU6YygibWljcm9zY29wZSIsNjAwMjUpLHZtOmMoInZtIiw2MDAyNiksZGV2aWNlRGVza3RvcDpjKCJkZXZpY2UtZGVza3RvcCIsNjAwMjYpLGZpbGU6YygiZmlsZSIsNjAwMjcpLGZpbGVUZXh0OmMoImZpbGUtdGV4dCIsNjAwMjcpLG1vcmU6YygibW9yZSIsNjAwMjgpLGVsbGlwc2lzOmMoImVsbGlwc2lzIiw2MDAyOCksa2ViYWJIb3Jpem9udGFsOmMoImtlYmFiLWhvcml6b250YWwiLDYwMDI4KSxtYWlsUmVwbHk6YygibWFpbC1yZXBseSIsNjAwMjkpLHJlcGx5OmMoInJlcGx5Iiw2MDAyOSksb3JnYW5pemF0aW9uOmMoIm9yZ2FuaXphdGlvbiIsNjAwMzApLG9yZ2FuaXphdGlvbkZpbGxlZDpjKCJvcmdhbml6YXRpb24tZmlsbGVkIiw2MDAzMCksb3JnYW5pemF0aW9uT3V0bGluZTpjKCJvcmdhbml6YXRpb24tb3V0bGluZSIsNjAwMzApLG5ld0ZpbGU6YygibmV3LWZpbGUiLDYwMDMxKSxmaWxlQWRkOmMoImZpbGUtYWRkIiw2MDAzMSksbmV3Rm9sZGVyOmMoIm5ldy1mb2xkZXIiLDYwMDMyKSxmaWxlRGlyZWN0b3J5Q3JlYXRlOmMoImZpbGUtZGlyZWN0b3J5LWNyZWF0ZSIsNjAwMzIpLHRyYXNoOmMoInRyYXNoIiw2MDAzMyksdHJhc2hjYW46YygidHJhc2hjYW4iLDYwMDMzKSxoaXN0b3J5OmMoImhpc3RvcnkiLDYwMDM0KSxjbG9jazpjKCJjbG9jayIsNjAwMzQpLGZvbGRlcjpjKCJmb2xkZXIiLDYwMDM1KSxmaWxlRGlyZWN0b3J5OmMoImZpbGUtZGlyZWN0b3J5Iiw2MDAzNSksc3ltYm9sRm9sZGVyOmMoInN5bWJvbC1mb2xkZXIiLDYwMDM1KSxsb2dvR2l0aHViOmMoImxvZ28tZ2l0aHViIiw2MDAzNiksbWFya0dpdGh1YjpjKCJtYXJrLWdpdGh1YiIsNjAwMzYpLGdpdGh1YjpjKCJnaXRodWIiLDYwMDM2KSx0ZXJtaW5hbDpjKCJ0ZXJtaW5hbCIsNjAwMzcpLGNvbnNvbGU6YygiY29uc29sZSIsNjAwMzcpLHJlcGw6YygicmVwbCIsNjAwMzcpLHphcDpjKCJ6YXAiLDYwMDM4KSxzeW1ib2xFdmVudDpjKCJzeW1ib2wtZXZlbnQiLDYwMDM4KSxlcnJvcjpjKCJlcnJvciIsNjAwMzkpLHN0b3A6Yygic3RvcCIsNjAwMzkpLHZhcmlhYmxlOmMoInZhcmlhYmxlIiw2MDA0MCksc3ltYm9sVmFyaWFibGU6Yygic3ltYm9sLXZhcmlhYmxlIiw2MDA0MCksYXJyYXk6YygiYXJyYXkiLDYwMDQyKSxzeW1ib2xBcnJheTpjKCJzeW1ib2wtYXJyYXkiLDYwMDQyKSxzeW1ib2xNb2R1bGU6Yygic3ltYm9sLW1vZHVsZSIsNjAwNDMpLHN5bWJvbFBhY2thZ2U6Yygic3ltYm9sLXBhY2thZ2UiLDYwMDQzKSxzeW1ib2xOYW1lc3BhY2U6Yygic3ltYm9sLW5hbWVzcGFjZSIsNjAwNDMpLHN5bWJvbE9iamVjdDpjKCJzeW1ib2wtb2JqZWN0Iiw2MDA0Myksc3ltYm9sTWV0aG9kOmMoInN5bWJvbC1tZXRob2QiLDYwMDQ0KSxzeW1ib2xGdW5jdGlvbjpjKCJzeW1ib2wtZnVuY3Rpb24iLDYwMDQ0KSxzeW1ib2xDb25zdHJ1Y3RvcjpjKCJzeW1ib2wtY29uc3RydWN0b3IiLDYwMDQ0KSxzeW1ib2xCb29sZWFuOmMoInN5bWJvbC1ib29sZWFuIiw2MDA0Nyksc3ltYm9sTnVsbDpjKCJzeW1ib2wtbnVsbCIsNjAwNDcpLHN5bWJvbE51bWVyaWM6Yygic3ltYm9sLW51bWVyaWMiLDYwMDQ4KSxzeW1ib2xOdW1iZXI6Yygic3ltYm9sLW51bWJlciIsNjAwNDgpLHN5bWJvbFN0cnVjdHVyZTpjKCJzeW1ib2wtc3RydWN0dXJlIiw2MDA0OSksc3ltYm9sU3RydWN0OmMoInN5bWJvbC1zdHJ1Y3QiLDYwMDQ5KSxzeW1ib2xQYXJhbWV0ZXI6Yygic3ltYm9sLXBhcmFtZXRlciIsNjAwNTApLHN5bWJvbFR5cGVQYXJhbWV0ZXI6Yygic3ltYm9sLXR5cGUtcGFyYW1ldGVyIiw2MDA1MCksc3ltYm9sS2V5OmMoInN5bWJvbC1rZXkiLDYwMDUxKSxzeW1ib2xUZXh0OmMoInN5bWJvbC10ZXh0Iiw2MDA1MSksc3ltYm9sUmVmZXJlbmNlOmMoInN5bWJvbC1yZWZlcmVuY2UiLDYwMDUyKSxnb1RvRmlsZTpjKCJnby10by1maWxlIiw2MDA1Miksc3ltYm9sRW51bTpjKCJzeW1ib2wtZW51bSIsNjAwNTMpLHN5bWJvbFZhbHVlOmMoInN5bWJvbC12YWx1ZSIsNjAwNTMpLHN5bWJvbFJ1bGVyOmMoInN5bWJvbC1ydWxlciIsNjAwNTQpLHN5bWJvbFVuaXQ6Yygic3ltYm9sLXVuaXQiLDYwMDU0KSxhY3RpdmF0ZUJyZWFrcG9pbnRzOmMoImFjdGl2YXRlLWJyZWFrcG9pbnRzIiw2MDA1NSksYXJjaGl2ZTpjKCJhcmNoaXZlIiw2MDA1NiksYXJyb3dCb3RoOmMoImFycm93LWJvdGgiLDYwMDU3KSxhcnJvd0Rvd246YygiYXJyb3ctZG93biIsNjAwNTgpLGFycm93TGVmdDpjKCJhcnJvdy1sZWZ0Iiw2MDA1OSksYXJyb3dSaWdodDpjKCJhcnJvdy1yaWdodCIsNjAwNjApLGFycm93U21hbGxEb3duOmMoImFycm93LXNtYWxsLWRvd24iLDYwMDYxKSxhcnJvd1NtYWxsTGVmdDpjKCJhcnJvdy1zbWFsbC1sZWZ0Iiw2MDA2MiksYXJyb3dTbWFsbFJpZ2h0OmMoImFycm93LXNtYWxsLXJpZ2h0Iiw2MDA2MyksYXJyb3dTbWFsbFVwOmMoImFycm93LXNtYWxsLXVwIiw2MDA2NCksYXJyb3dVcDpjKCJhcnJvdy11cCIsNjAwNjUpLGJlbGw6YygiYmVsbCIsNjAwNjYpLGJvbGQ6YygiYm9sZCIsNjAwNjcpLGJvb2s6YygiYm9vayIsNjAwNjgpLGJvb2ttYXJrOmMoImJvb2ttYXJrIiw2MDA2OSksZGVidWdCcmVha3BvaW50Q29uZGl0aW9uYWxVbnZlcmlmaWVkOmMoImRlYnVnLWJyZWFrcG9pbnQtY29uZGl0aW9uYWwtdW52ZXJpZmllZCIsNjAwNzApLGRlYnVnQnJlYWtwb2ludENvbmRpdGlvbmFsOmMoImRlYnVnLWJyZWFrcG9pbnQtY29uZGl0aW9uYWwiLDYwMDcxKSxkZWJ1Z0JyZWFrcG9pbnRDb25kaXRpb25hbERpc2FibGVkOmMoImRlYnVnLWJyZWFrcG9pbnQtY29uZGl0aW9uYWwtZGlzYWJsZWQiLDYwMDcxKSxkZWJ1Z0JyZWFrcG9pbnREYXRhVW52ZXJpZmllZDpjKCJkZWJ1Zy1icmVha3BvaW50LWRhdGEtdW52ZXJpZmllZCIsNjAwNzIpLGRlYnVnQnJlYWtwb2ludERhdGE6YygiZGVidWctYnJlYWtwb2ludC1kYXRhIiw2MDA3MyksZGVidWdCcmVha3BvaW50RGF0YURpc2FibGVkOmMoImRlYnVnLWJyZWFrcG9pbnQtZGF0YS1kaXNhYmxlZCIsNjAwNzMpLGRlYnVnQnJlYWtwb2ludExvZ1VudmVyaWZpZWQ6YygiZGVidWctYnJlYWtwb2ludC1sb2ctdW52ZXJpZmllZCIsNjAwNzQpLGRlYnVnQnJlYWtwb2ludExvZzpjKCJkZWJ1Zy1icmVha3BvaW50LWxvZyIsNjAwNzUpLGRlYnVnQnJlYWtwb2ludExvZ0Rpc2FibGVkOmMoImRlYnVnLWJyZWFrcG9pbnQtbG9nLWRpc2FibGVkIiw2MDA3NSksYnJpZWZjYXNlOmMoImJyaWVmY2FzZSIsNjAwNzYpLGJyb2FkY2FzdDpjKCJicm9hZGNhc3QiLDYwMDc3KSxicm93c2VyOmMoImJyb3dzZXIiLDYwMDc4KSxidWc6YygiYnVnIiw2MDA3OSksY2FsZW5kYXI6YygiY2FsZW5kYXIiLDYwMDgwKSxjYXNlU2Vuc2l0aXZlOmMoImNhc2Utc2Vuc2l0aXZlIiw2MDA4MSksY2hlY2s6YygiY2hlY2siLDYwMDgyKSxjaGVja2xpc3Q6YygiY2hlY2tsaXN0Iiw2MDA4MyksY2hldnJvbkRvd246YygiY2hldnJvbi1kb3duIiw2MDA4NCksY2hldnJvbkxlZnQ6YygiY2hldnJvbi1sZWZ0Iiw2MDA4NSksY2hldnJvblJpZ2h0OmMoImNoZXZyb24tcmlnaHQiLDYwMDg2KSxjaGV2cm9uVXA6YygiY2hldnJvbi11cCIsNjAwODcpLGNocm9tZUNsb3NlOmMoImNocm9tZS1jbG9zZSIsNjAwODgpLGNocm9tZU1heGltaXplOmMoImNocm9tZS1tYXhpbWl6ZSIsNjAwODkpLGNocm9tZU1pbmltaXplOmMoImNocm9tZS1taW5pbWl6ZSIsNjAwOTApLGNocm9tZVJlc3RvcmU6YygiY2hyb21lLXJlc3RvcmUiLDYwMDkxKSxjaXJjbGVPdXRsaW5lOmMoImNpcmNsZS1vdXRsaW5lIiw2MDA5MiksY2lyY2xlOmMoImNpcmNsZSIsNjAwOTIpLGRlYnVnQnJlYWtwb2ludFVudmVyaWZpZWQ6YygiZGVidWctYnJlYWtwb2ludC11bnZlcmlmaWVkIiw2MDA5MiksdGVybWluYWxEZWNvcmF0aW9uSW5jb21wbGV0ZTpjKCJ0ZXJtaW5hbC1kZWNvcmF0aW9uLWluY29tcGxldGUiLDYwMDkyKSxjaXJjbGVTbGFzaDpjKCJjaXJjbGUtc2xhc2giLDYwMDkzKSxjaXJjdWl0Qm9hcmQ6YygiY2lyY3VpdC1ib2FyZCIsNjAwOTQpLGNsZWFyQWxsOmMoImNsZWFyLWFsbCIsNjAwOTUpLGNsaXBweTpjKCJjbGlwcHkiLDYwMDk2KSxjbG9zZUFsbDpjKCJjbG9zZS1hbGwiLDYwMDk3KSxjbG91ZERvd25sb2FkOmMoImNsb3VkLWRvd25sb2FkIiw2MDA5OCksY2xvdWRVcGxvYWQ6YygiY2xvdWQtdXBsb2FkIiw2MDA5OSksY29kZTpjKCJjb2RlIiw2MDEwMCksY29sbGFwc2VBbGw6YygiY29sbGFwc2UtYWxsIiw2MDEwMSksY29sb3JNb2RlOmMoImNvbG9yLW1vZGUiLDYwMTAyKSxjb21tZW50RGlzY3Vzc2lvbjpjKCJjb21tZW50LWRpc2N1c3Npb24iLDYwMTAzKSxjcmVkaXRDYXJkOmMoImNyZWRpdC1jYXJkIiw2MDEwNSksZGFzaDpjKCJkYXNoIiw2MDEwOCksZGFzaGJvYXJkOmMoImRhc2hib2FyZCIsNjAxMDkpLGRhdGFiYXNlOmMoImRhdGFiYXNlIiw2MDExMCksZGVidWdDb250aW51ZTpjKCJkZWJ1Zy1jb250aW51ZSIsNjAxMTEpLGRlYnVnRGlzY29ubmVjdDpjKCJkZWJ1Zy1kaXNjb25uZWN0Iiw2MDExMiksZGVidWdQYXVzZTpjKCJkZWJ1Zy1wYXVzZSIsNjAxMTMpLGRlYnVnUmVzdGFydDpjKCJkZWJ1Zy1yZXN0YXJ0Iiw2MDExNCksZGVidWdTdGFydDpjKCJkZWJ1Zy1zdGFydCIsNjAxMTUpLGRlYnVnU3RlcEludG86YygiZGVidWctc3RlcC1pbnRvIiw2MDExNiksZGVidWdTdGVwT3V0OmMoImRlYnVnLXN0ZXAtb3V0Iiw2MDExNyksZGVidWdTdGVwT3ZlcjpjKCJkZWJ1Zy1zdGVwLW92ZXIiLDYwMTE4KSxkZWJ1Z1N0b3A6YygiZGVidWctc3RvcCIsNjAxMTkpLGRlYnVnOmMoImRlYnVnIiw2MDEyMCksZGV2aWNlQ2FtZXJhVmlkZW86YygiZGV2aWNlLWNhbWVyYS12aWRlbyIsNjAxMjEpLGRldmljZUNhbWVyYTpjKCJkZXZpY2UtY2FtZXJhIiw2MDEyMiksZGV2aWNlTW9iaWxlOmMoImRldmljZS1tb2JpbGUiLDYwMTIzKSxkaWZmQWRkZWQ6YygiZGlmZi1hZGRlZCIsNjAxMjQpLGRpZmZJZ25vcmVkOmMoImRpZmYtaWdub3JlZCIsNjAxMjUpLGRpZmZNb2RpZmllZDpjKCJkaWZmLW1vZGlmaWVkIiw2MDEyNiksZGlmZlJlbW92ZWQ6YygiZGlmZi1yZW1vdmVkIiw2MDEyNyksZGlmZlJlbmFtZWQ6YygiZGlmZi1yZW5hbWVkIiw2MDEyOCksZGlmZjpjKCJkaWZmIiw2MDEyOSksZGlmZlNpZGVieXNpZGU6YygiZGlmZi1zaWRlYnlzaWRlIiw2MDEyOSksZGlzY2FyZDpjKCJkaXNjYXJkIiw2MDEzMCksZWRpdG9yTGF5b3V0OmMoImVkaXRvci1sYXlvdXQiLDYwMTMxKSxlbXB0eVdpbmRvdzpjKCJlbXB0eS13aW5kb3ciLDYwMTMyKSxleGNsdWRlOmMoImV4Y2x1ZGUiLDYwMTMzKSxleHRlbnNpb25zOmMoImV4dGVuc2lvbnMiLDYwMTM0KSxleWVDbG9zZWQ6YygiZXllLWNsb3NlZCIsNjAxMzUpLGZpbGVCaW5hcnk6YygiZmlsZS1iaW5hcnkiLDYwMTM2KSxmaWxlQ29kZTpjKCJmaWxlLWNvZGUiLDYwMTM3KSxmaWxlTWVkaWE6YygiZmlsZS1tZWRpYSIsNjAxMzgpLGZpbGVQZGY6YygiZmlsZS1wZGYiLDYwMTM5KSxmaWxlU3VibW9kdWxlOmMoImZpbGUtc3VibW9kdWxlIiw2MDE0MCksZmlsZVN5bWxpbmtEaXJlY3Rvcnk6YygiZmlsZS1zeW1saW5rLWRpcmVjdG9yeSIsNjAxNDEpLGZpbGVTeW1saW5rRmlsZTpjKCJmaWxlLXN5bWxpbmstZmlsZSIsNjAxNDIpLGZpbGVaaXA6YygiZmlsZS16aXAiLDYwMTQzKSxmaWxlczpjKCJmaWxlcyIsNjAxNDQpLGZpbHRlcjpjKCJmaWx0ZXIiLDYwMTQ1KSxmbGFtZTpjKCJmbGFtZSIsNjAxNDYpLGZvbGREb3duOmMoImZvbGQtZG93biIsNjAxNDcpLGZvbGRVcDpjKCJmb2xkLXVwIiw2MDE0OCksZm9sZDpjKCJmb2xkIiw2MDE0OSksZm9sZGVyQWN0aXZlOmMoImZvbGRlci1hY3RpdmUiLDYwMTUwKSxmb2xkZXJPcGVuZWQ6YygiZm9sZGVyLW9wZW5lZCIsNjAxNTEpLGdlYXI6YygiZ2VhciIsNjAxNTIpLGdpZnQ6YygiZ2lmdCIsNjAxNTMpLGdpc3RTZWNyZXQ6YygiZ2lzdC1zZWNyZXQiLDYwMTU0KSxnaXN0OmMoImdpc3QiLDYwMTU1KSxnaXRDb21taXQ6YygiZ2l0LWNvbW1pdCIsNjAxNTYpLGdpdENvbXBhcmU6YygiZ2l0LWNvbXBhcmUiLDYwMTU3KSxjb21wYXJlQ2hhbmdlczpjKCJjb21wYXJlLWNoYW5nZXMiLDYwMTU3KSxnaXRNZXJnZTpjKCJnaXQtbWVyZ2UiLDYwMTU4KSxnaXRodWJBY3Rpb246YygiZ2l0aHViLWFjdGlvbiIsNjAxNTkpLGdpdGh1YkFsdDpjKCJnaXRodWItYWx0Iiw2MDE2MCksZ2xvYmU6YygiZ2xvYmUiLDYwMTYxKSxncmFiYmVyOmMoImdyYWJiZXIiLDYwMTYyKSxncmFwaDpjKCJncmFwaCIsNjAxNjMpLGdyaXBwZXI6YygiZ3JpcHBlciIsNjAxNjQpLGhlYXJ0OmMoImhlYXJ0Iiw2MDE2NSksaG9tZTpjKCJob21lIiw2MDE2NiksaG9yaXpvbnRhbFJ1bGU6YygiaG9yaXpvbnRhbC1ydWxlIiw2MDE2NyksaHVib3Q6YygiaHVib3QiLDYwMTY4KSxpbmJveDpjKCJpbmJveCIsNjAxNjkpLGlzc3VlUmVvcGVuZWQ6YygiaXNzdWUtcmVvcGVuZWQiLDYwMTcxKSxpc3N1ZXM6YygiaXNzdWVzIiw2MDE3MiksaXRhbGljOmMoIml0YWxpYyIsNjAxNzMpLGplcnNleTpjKCJqZXJzZXkiLDYwMTc0KSxqc29uOmMoImpzb24iLDYwMTc1KSxrZWJhYlZlcnRpY2FsOmMoImtlYmFiLXZlcnRpY2FsIiw2MDE3Niksa2V5OmMoImtleSIsNjAxNzcpLGxhdzpjKCJsYXciLDYwMTc4KSxsaWdodGJ1bGJBdXRvZml4OmMoImxpZ2h0YnVsYi1hdXRvZml4Iiw2MDE3OSksbGlua0V4dGVybmFsOmMoImxpbmstZXh0ZXJuYWwiLDYwMTgwKSxsaW5rOmMoImxpbmsiLDYwMTgxKSxsaXN0T3JkZXJlZDpjKCJsaXN0LW9yZGVyZWQiLDYwMTgyKSxsaXN0VW5vcmRlcmVkOmMoImxpc3QtdW5vcmRlcmVkIiw2MDE4MyksbGl2ZVNoYXJlOmMoImxpdmUtc2hhcmUiLDYwMTg0KSxsb2FkaW5nOmMoImxvYWRpbmciLDYwMTg1KSxsb2NhdGlvbjpjKCJsb2NhdGlvbiIsNjAxODYpLG1haWxSZWFkOmMoIm1haWwtcmVhZCIsNjAxODcpLG1haWw6YygibWFpbCIsNjAxODgpLG1hcmtkb3duOmMoIm1hcmtkb3duIiw2MDE4OSksbWVnYXBob25lOmMoIm1lZ2FwaG9uZSIsNjAxOTApLG1lbnRpb246YygibWVudGlvbiIsNjAxOTEpLG1pbGVzdG9uZTpjKCJtaWxlc3RvbmUiLDYwMTkyKSxnaXRQdWxsUmVxdWVzdE1pbGVzdG9uZTpjKCJnaXQtcHVsbC1yZXF1ZXN0LW1pbGVzdG9uZSIsNjAxOTIpLG1vcnRhckJvYXJkOmMoIm1vcnRhci1ib2FyZCIsNjAxOTMpLG1vdmU6YygibW92ZSIsNjAxOTQpLG11bHRpcGxlV2luZG93czpjKCJtdWx0aXBsZS13aW5kb3dzIiw2MDE5NSksbXV0ZTpjKCJtdXRlIiw2MDE5Niksbm9OZXdsaW5lOmMoIm5vLW5ld2xpbmUiLDYwMTk3KSxub3RlOmMoIm5vdGUiLDYwMTk4KSxvY3RvZmFjZTpjKCJvY3RvZmFjZSIsNjAxOTkpLG9wZW5QcmV2aWV3OmMoIm9wZW4tcHJldmlldyIsNjAyMDApLHBhY2thZ2U6YygicGFja2FnZSIsNjAyMDEpLHBhaW50Y2FuOmMoInBhaW50Y2FuIiw2MDIwMikscGluOmMoInBpbiIsNjAyMDMpLHBsYXk6YygicGxheSIsNjAyMDQpLHJ1bjpjKCJydW4iLDYwMjA0KSxwbHVnOmMoInBsdWciLDYwMjA1KSxwcmVzZXJ2ZUNhc2U6YygicHJlc2VydmUtY2FzZSIsNjAyMDYpLHByZXZpZXc6YygicHJldmlldyIsNjAyMDcpLHByb2plY3Q6YygicHJvamVjdCIsNjAyMDgpLHB1bHNlOmMoInB1bHNlIiw2MDIwOSkscXVlc3Rpb246YygicXVlc3Rpb24iLDYwMjEwKSxxdW90ZTpjKCJxdW90ZSIsNjAyMTEpLHJhZGlvVG93ZXI6YygicmFkaW8tdG93ZXIiLDYwMjEyKSxyZWFjdGlvbnM6YygicmVhY3Rpb25zIiw2MDIxMykscmVmZXJlbmNlczpjKCJyZWZlcmVuY2VzIiw2MDIxNCkscmVmcmVzaDpjKCJyZWZyZXNoIiw2MDIxNSkscmVnZXg6YygicmVnZXgiLDYwMjE2KSxyZW1vdGVFeHBsb3JlcjpjKCJyZW1vdGUtZXhwbG9yZXIiLDYwMjE3KSxyZW1vdGU6YygicmVtb3RlIiw2MDIxOCkscmVtb3ZlOmMoInJlbW92ZSIsNjAyMTkpLHJlcGxhY2VBbGw6YygicmVwbGFjZS1hbGwiLDYwMjIwKSxyZXBsYWNlOmMoInJlcGxhY2UiLDYwMjIxKSxyZXBvQ2xvbmU6YygicmVwby1jbG9uZSIsNjAyMjIpLHJlcG9Gb3JjZVB1c2g6YygicmVwby1mb3JjZS1wdXNoIiw2MDIyMykscmVwb1B1bGw6YygicmVwby1wdWxsIiw2MDIyNCkscmVwb1B1c2g6YygicmVwby1wdXNoIiw2MDIyNSkscmVwb3J0OmMoInJlcG9ydCIsNjAyMjYpLHJlcXVlc3RDaGFuZ2VzOmMoInJlcXVlc3QtY2hhbmdlcyIsNjAyMjcpLHJvY2tldDpjKCJyb2NrZXQiLDYwMjI4KSxyb290Rm9sZGVyT3BlbmVkOmMoInJvb3QtZm9sZGVyLW9wZW5lZCIsNjAyMjkpLHJvb3RGb2xkZXI6Yygicm9vdC1mb2xkZXIiLDYwMjMwKSxyc3M6YygicnNzIiw2MDIzMSkscnVieTpjKCJydWJ5Iiw2MDIzMiksc2F2ZUFsbDpjKCJzYXZlLWFsbCIsNjAyMzMpLHNhdmVBczpjKCJzYXZlLWFzIiw2MDIzNCksc2F2ZTpjKCJzYXZlIiw2MDIzNSksc2NyZWVuRnVsbDpjKCJzY3JlZW4tZnVsbCIsNjAyMzYpLHNjcmVlbk5vcm1hbDpjKCJzY3JlZW4tbm9ybWFsIiw2MDIzNyksc2VhcmNoU3RvcDpjKCJzZWFyY2gtc3RvcCIsNjAyMzgpLHNlcnZlcjpjKCJzZXJ2ZXIiLDYwMjQwKSxzZXR0aW5nc0dlYXI6Yygic2V0dGluZ3MtZ2VhciIsNjAyNDEpLHNldHRpbmdzOmMoInNldHRpbmdzIiw2MDI0Miksc2hpZWxkOmMoInNoaWVsZCIsNjAyNDMpLHNtaWxleTpjKCJzbWlsZXkiLDYwMjQ0KSxzb3J0UHJlY2VkZW5jZTpjKCJzb3J0LXByZWNlZGVuY2UiLDYwMjQ1KSxzcGxpdEhvcml6b250YWw6Yygic3BsaXQtaG9yaXpvbnRhbCIsNjAyNDYpLHNwbGl0VmVydGljYWw6Yygic3BsaXQtdmVydGljYWwiLDYwMjQ3KSxzcXVpcnJlbDpjKCJzcXVpcnJlbCIsNjAyNDgpLHN0YXJGdWxsOmMoInN0YXItZnVsbCIsNjAyNDkpLHN0YXJIYWxmOmMoInN0YXItaGFsZiIsNjAyNTApLHN5bWJvbENsYXNzOmMoInN5bWJvbC1jbGFzcyIsNjAyNTEpLHN5bWJvbENvbG9yOmMoInN5bWJvbC1jb2xvciIsNjAyNTIpLHN5bWJvbENvbnN0YW50OmMoInN5bWJvbC1jb25zdGFudCIsNjAyNTMpLHN5bWJvbEVudW1NZW1iZXI6Yygic3ltYm9sLWVudW0tbWVtYmVyIiw2MDI1NCksc3ltYm9sRmllbGQ6Yygic3ltYm9sLWZpZWxkIiw2MDI1NSksc3ltYm9sRmlsZTpjKCJzeW1ib2wtZmlsZSIsNjAyNTYpLHN5bWJvbEludGVyZmFjZTpjKCJzeW1ib2wtaW50ZXJmYWNlIiw2MDI1Nyksc3ltYm9sS2V5d29yZDpjKCJzeW1ib2wta2V5d29yZCIsNjAyNTgpLHN5bWJvbE1pc2M6Yygic3ltYm9sLW1pc2MiLDYwMjU5KSxzeW1ib2xPcGVyYXRvcjpjKCJzeW1ib2wtb3BlcmF0b3IiLDYwMjYwKSxzeW1ib2xQcm9wZXJ0eTpjKCJzeW1ib2wtcHJvcGVydHkiLDYwMjYxKSx3cmVuY2g6Yygid3JlbmNoIiw2MDI2MSksd3JlbmNoU3ViYWN0aW9uOmMoIndyZW5jaC1zdWJhY3Rpb24iLDYwMjYxKSxzeW1ib2xTbmlwcGV0OmMoInN5bWJvbC1zbmlwcGV0Iiw2MDI2MiksdGFza2xpc3Q6YygidGFza2xpc3QiLDYwMjYzKSx0ZWxlc2NvcGU6YygidGVsZXNjb3BlIiw2MDI2NCksdGV4dFNpemU6YygidGV4dC1zaXplIiw2MDI2NSksdGhyZWVCYXJzOmMoInRocmVlLWJhcnMiLDYwMjY2KSx0aHVtYnNkb3duOmMoInRodW1ic2Rvd24iLDYwMjY3KSx0aHVtYnN1cDpjKCJ0aHVtYnN1cCIsNjAyNjgpLHRvb2xzOmMoInRvb2xzIiw2MDI2OSksdHJpYW5nbGVEb3duOmMoInRyaWFuZ2xlLWRvd24iLDYwMjcwKSx0cmlhbmdsZUxlZnQ6YygidHJpYW5nbGUtbGVmdCIsNjAyNzEpLHRyaWFuZ2xlUmlnaHQ6YygidHJpYW5nbGUtcmlnaHQiLDYwMjcyKSx0cmlhbmdsZVVwOmMoInRyaWFuZ2xlLXVwIiw2MDI3MyksdHdpdHRlcjpjKCJ0d2l0dGVyIiw2MDI3NCksdW5mb2xkOmMoInVuZm9sZCIsNjAyNzUpLHVubG9jazpjKCJ1bmxvY2siLDYwMjc2KSx1bm11dGU6YygidW5tdXRlIiw2MDI3NyksdW52ZXJpZmllZDpjKCJ1bnZlcmlmaWVkIiw2MDI3OCksdmVyaWZpZWQ6YygidmVyaWZpZWQiLDYwMjc5KSx2ZXJzaW9uczpjKCJ2ZXJzaW9ucyIsNjAyODApLHZtQWN0aXZlOmMoInZtLWFjdGl2ZSIsNjAyODEpLHZtT3V0bGluZTpjKCJ2bS1vdXRsaW5lIiw2MDI4Miksdm1SdW5uaW5nOmMoInZtLXJ1bm5pbmciLDYwMjgzKSx3YXRjaDpjKCJ3YXRjaCIsNjAyODQpLHdoaXRlc3BhY2U6Yygid2hpdGVzcGFjZSIsNjAyODUpLHdob2xlV29yZDpjKCJ3aG9sZS13b3JkIiw2MDI4Niksd2luZG93OmMoIndpbmRvdyIsNjAyODcpLHdvcmRXcmFwOmMoIndvcmQtd3JhcCIsNjAyODgpLHpvb21JbjpjKCJ6b29tLWluIiw2MDI4OSksem9vbU91dDpjKCJ6b29tLW91dCIsNjAyOTApLGxpc3RGaWx0ZXI6YygibGlzdC1maWx0ZXIiLDYwMjkxKSxsaXN0RmxhdDpjKCJsaXN0LWZsYXQiLDYwMjkyKSxsaXN0U2VsZWN0aW9uOmMoImxpc3Qtc2VsZWN0aW9uIiw2MDI5Myksc2VsZWN0aW9uOmMoInNlbGVjdGlvbiIsNjAyOTMpLGxpc3RUcmVlOmMoImxpc3QtdHJlZSIsNjAyOTQpLGRlYnVnQnJlYWtwb2ludEZ1bmN0aW9uVW52ZXJpZmllZDpjKCJkZWJ1Zy1icmVha3BvaW50LWZ1bmN0aW9uLXVudmVyaWZpZWQiLDYwMjk1KSxkZWJ1Z0JyZWFrcG9pbnRGdW5jdGlvbjpjKCJkZWJ1Zy1icmVha3BvaW50LWZ1bmN0aW9uIiw2MDI5NiksZGVidWdCcmVha3BvaW50RnVuY3Rpb25EaXNhYmxlZDpjKCJkZWJ1Zy1icmVha3BvaW50LWZ1bmN0aW9uLWRpc2FibGVkIiw2MDI5NiksZGVidWdTdGFja2ZyYW1lQWN0aXZlOmMoImRlYnVnLXN0YWNrZnJhbWUtYWN0aXZlIiw2MDI5NyksY2lyY2xlU21hbGxGaWxsZWQ6YygiY2lyY2xlLXNtYWxsLWZpbGxlZCIsNjAyOTgpLGRlYnVnU3RhY2tmcmFtZURvdDpjKCJkZWJ1Zy1zdGFja2ZyYW1lLWRvdCIsNjAyOTgpLHRlcm1pbmFsRGVjb3JhdGlvbk1hcms6YygidGVybWluYWwtZGVjb3JhdGlvbi1tYXJrIiw2MDI5OCksZGVidWdTdGFja2ZyYW1lOmMoImRlYnVnLXN0YWNrZnJhbWUiLDYwMjk5KSxkZWJ1Z1N0YWNrZnJhbWVGb2N1c2VkOmMoImRlYnVnLXN0YWNrZnJhbWUtZm9jdXNlZCIsNjAyOTkpLGRlYnVnQnJlYWtwb2ludFVuc3VwcG9ydGVkOmMoImRlYnVnLWJyZWFrcG9pbnQtdW5zdXBwb3J0ZWQiLDYwMzAwKSxzeW1ib2xTdHJpbmc6Yygic3ltYm9sLXN0cmluZyIsNjAzMDEpLGRlYnVnUmV2ZXJzZUNvbnRpbnVlOmMoImRlYnVnLXJldmVyc2UtY29udGludWUiLDYwMzAyKSxkZWJ1Z1N0ZXBCYWNrOmMoImRlYnVnLXN0ZXAtYmFjayIsNjAzMDMpLGRlYnVnUmVzdGFydEZyYW1lOmMoImRlYnVnLXJlc3RhcnQtZnJhbWUiLDYwMzA0KSxkZWJ1Z0FsdDpjKCJkZWJ1Zy1hbHQiLDYwMzA1KSxjYWxsSW5jb21pbmc6YygiY2FsbC1pbmNvbWluZyIsNjAzMDYpLGNhbGxPdXRnb2luZzpjKCJjYWxsLW91dGdvaW5nIiw2MDMwNyksbWVudTpjKCJtZW51Iiw2MDMwOCksZXhwYW5kQWxsOmMoImV4cGFuZC1hbGwiLDYwMzA5KSxmZWVkYmFjazpjKCJmZWVkYmFjayIsNjAzMTApLGdpdFB1bGxSZXF1ZXN0UmV2aWV3ZXI6YygiZ2l0LXB1bGwtcmVxdWVzdC1yZXZpZXdlciIsNjAzMTApLGdyb3VwQnlSZWZUeXBlOmMoImdyb3VwLWJ5LXJlZi10eXBlIiw2MDMxMSksdW5ncm91cEJ5UmVmVHlwZTpjKCJ1bmdyb3VwLWJ5LXJlZi10eXBlIiw2MDMxMiksYWNjb3VudDpjKCJhY2NvdW50Iiw2MDMxMyksZ2l0UHVsbFJlcXVlc3RBc3NpZ25lZTpjKCJnaXQtcHVsbC1yZXF1ZXN0LWFzc2lnbmVlIiw2MDMxMyksYmVsbERvdDpjKCJiZWxsLWRvdCIsNjAzMTQpLGRlYnVnQ29uc29sZTpjKCJkZWJ1Zy1jb25zb2xlIiw2MDMxNSksbGlicmFyeTpjKCJsaWJyYXJ5Iiw2MDMxNiksb3V0cHV0OmMoIm91dHB1dCIsNjAzMTcpLHJ1bkFsbDpjKCJydW4tYWxsIiw2MDMxOCksc3luY0lnbm9yZWQ6Yygic3luYy1pZ25vcmVkIiw2MDMxOSkscGlubmVkOmMoInBpbm5lZCIsNjAzMjApLGdpdGh1YkludmVydGVkOmMoImdpdGh1Yi1pbnZlcnRlZCIsNjAzMjEpLHNlcnZlclByb2Nlc3M6Yygic2VydmVyLXByb2Nlc3MiLDYwMzIyKSxzZXJ2ZXJFbnZpcm9ubWVudDpjKCJzZXJ2ZXItZW52aXJvbm1lbnQiLDYwMzIzKSxwYXNzOmMoInBhc3MiLDYwMzI0KSxpc3N1ZUNsb3NlZDpjKCJpc3N1ZS1jbG9zZWQiLDYwMzI0KSxzdG9wQ2lyY2xlOmMoInN0b3AtY2lyY2xlIiw2MDMyNSkscGxheUNpcmNsZTpjKCJwbGF5LWNpcmNsZSIsNjAzMjYpLHJlY29yZDpjKCJyZWNvcmQiLDYwMzI3KSxkZWJ1Z0FsdFNtYWxsOmMoImRlYnVnLWFsdC1zbWFsbCIsNjAzMjgpLHZtQ29ubmVjdDpjKCJ2bS1jb25uZWN0Iiw2MDMyOSksY2xvdWQ6YygiY2xvdWQiLDYwMzMwKSxtZXJnZTpjKCJtZXJnZSIsNjAzMzEpLGV4cG9ydDpjKCJleHBvcnQiLDYwMzMyKSxncmFwaExlZnQ6YygiZ3JhcGgtbGVmdCIsNjAzMzMpLG1hZ25ldDpjKCJtYWduZXQiLDYwMzM0KSxub3RlYm9vazpjKCJub3RlYm9vayIsNjAzMzUpLHJlZG86YygicmVkbyIsNjAzMzYpLGNoZWNrQWxsOmMoImNoZWNrLWFsbCIsNjAzMzcpLHBpbm5lZERpcnR5OmMoInBpbm5lZC1kaXJ0eSIsNjAzMzgpLHBhc3NGaWxsZWQ6YygicGFzcy1maWxsZWQiLDYwMzM5KSxjaXJjbGVMYXJnZUZpbGxlZDpjKCJjaXJjbGUtbGFyZ2UtZmlsbGVkIiw2MDM0MCksY2lyY2xlTGFyZ2U6YygiY2lyY2xlLWxhcmdlIiw2MDM0MSksY2lyY2xlTGFyZ2VPdXRsaW5lOmMoImNpcmNsZS1sYXJnZS1vdXRsaW5lIiw2MDM0MSksY29tYmluZTpjKCJjb21iaW5lIiw2MDM0MiksZ2F0aGVyOmMoImdhdGhlciIsNjAzNDIpLHRhYmxlOmMoInRhYmxlIiw2MDM0MyksdmFyaWFibGVHcm91cDpjKCJ2YXJpYWJsZS1ncm91cCIsNjAzNDQpLHR5cGVIaWVyYXJjaHk6YygidHlwZS1oaWVyYXJjaHkiLDYwMzQ1KSx0eXBlSGllcmFyY2h5U3ViOmMoInR5cGUtaGllcmFyY2h5LXN1YiIsNjAzNDYpLHR5cGVIaWVyYXJjaHlTdXBlcjpjKCJ0eXBlLWhpZXJhcmNoeS1zdXBlciIsNjAzNDcpLGdpdFB1bGxSZXF1ZXN0Q3JlYXRlOmMoImdpdC1wdWxsLXJlcXVlc3QtY3JlYXRlIiw2MDM0OCkscnVuQWJvdmU6YygicnVuLWFib3ZlIiw2MDM0OSkscnVuQmVsb3c6YygicnVuLWJlbG93Iiw2MDM1MCksbm90ZWJvb2tUZW1wbGF0ZTpjKCJub3RlYm9vay10ZW1wbGF0ZSIsNjAzNTEpLGRlYnVnUmVydW46YygiZGVidWctcmVydW4iLDYwMzUyKSx3b3Jrc3BhY2VUcnVzdGVkOmMoIndvcmtzcGFjZS10cnVzdGVkIiw2MDM1Myksd29ya3NwYWNlVW50cnVzdGVkOmMoIndvcmtzcGFjZS11bnRydXN0ZWQiLDYwMzU0KSx3b3Jrc3BhY2VVbmtub3duOmMoIndvcmtzcGFjZS11bmtub3duIiw2MDM1NSksdGVybWluYWxDbWQ6YygidGVybWluYWwtY21kIiw2MDM1NiksdGVybWluYWxEZWJpYW46YygidGVybWluYWwtZGViaWFuIiw2MDM1NyksdGVybWluYWxMaW51eDpjKCJ0ZXJtaW5hbC1saW51eCIsNjAzNTgpLHRlcm1pbmFsUG93ZXJzaGVsbDpjKCJ0ZXJtaW5hbC1wb3dlcnNoZWxsIiw2MDM1OSksdGVybWluYWxUbXV4OmMoInRlcm1pbmFsLXRtdXgiLDYwMzYwKSx0ZXJtaW5hbFVidW50dTpjKCJ0ZXJtaW5hbC11YnVudHUiLDYwMzYxKSx0ZXJtaW5hbEJhc2g6YygidGVybWluYWwtYmFzaCIsNjAzNjIpLGFycm93U3dhcDpjKCJhcnJvdy1zd2FwIiw2MDM2MyksY29weTpjKCJjb3B5Iiw2MDM2NCkscGVyc29uQWRkOmMoInBlcnNvbi1hZGQiLDYwMzY1KSxmaWx0ZXJGaWxsZWQ6YygiZmlsdGVyLWZpbGxlZCIsNjAzNjYpLHdhbmQ6Yygid2FuZCIsNjAzNjcpLGRlYnVnTGluZUJ5TGluZTpjKCJkZWJ1Zy1saW5lLWJ5LWxpbmUiLDYwMzY4KSxpbnNwZWN0OmMoImluc3BlY3QiLDYwMzY5KSxsYXllcnM6YygibGF5ZXJzIiw2MDM3MCksbGF5ZXJzRG90OmMoImxheWVycy1kb3QiLDYwMzcxKSxsYXllcnNBY3RpdmU6YygibGF5ZXJzLWFjdGl2ZSIsNjAzNzIpLGNvbXBhc3M6YygiY29tcGFzcyIsNjAzNzMpLGNvbXBhc3NEb3Q6YygiY29tcGFzcy1kb3QiLDYwMzc0KSxjb21wYXNzQWN0aXZlOmMoImNvbXBhc3MtYWN0aXZlIiw2MDM3NSksYXp1cmU6YygiYXp1cmUiLDYwMzc2KSxpc3N1ZURyYWZ0OmMoImlzc3VlLWRyYWZ0Iiw2MDM3NyksZ2l0UHVsbFJlcXVlc3RDbG9zZWQ6YygiZ2l0LXB1bGwtcmVxdWVzdC1jbG9zZWQiLDYwMzc4KSxnaXRQdWxsUmVxdWVzdERyYWZ0OmMoImdpdC1wdWxsLXJlcXVlc3QtZHJhZnQiLDYwMzc5KSxkZWJ1Z0FsbDpjKCJkZWJ1Zy1hbGwiLDYwMzgwKSxkZWJ1Z0NvdmVyYWdlOmMoImRlYnVnLWNvdmVyYWdlIiw2MDM4MSkscnVuRXJyb3JzOmMoInJ1bi1lcnJvcnMiLDYwMzgyKSxmb2xkZXJMaWJyYXJ5OmMoImZvbGRlci1saWJyYXJ5Iiw2MDM4MyksZGVidWdDb250aW51ZVNtYWxsOmMoImRlYnVnLWNvbnRpbnVlLXNtYWxsIiw2MDM4NCksYmVha2VyU3RvcDpjKCJiZWFrZXItc3RvcCIsNjAzODUpLGdyYXBoTGluZTpjKCJncmFwaC1saW5lIiw2MDM4NiksZ3JhcGhTY2F0dGVyOmMoImdyYXBoLXNjYXR0ZXIiLDYwMzg3KSxwaWVDaGFydDpjKCJwaWUtY2hhcnQiLDYwMzg4KSxicmFja2V0OmMoImJyYWNrZXQiLDYwMTc1KSxicmFja2V0RG90OmMoImJyYWNrZXQtZG90Iiw2MDM4OSksYnJhY2tldEVycm9yOmMoImJyYWNrZXQtZXJyb3IiLDYwMzkwKSxsb2NrU21hbGw6YygibG9jay1zbWFsbCIsNjAzOTEpLGF6dXJlRGV2b3BzOmMoImF6dXJlLWRldm9wcyIsNjAzOTIpLHZlcmlmaWVkRmlsbGVkOmMoInZlcmlmaWVkLWZpbGxlZCIsNjAzOTMpLG5ld2xpbmU6YygibmV3bGluZSIsNjAzOTQpLGxheW91dDpjKCJsYXlvdXQiLDYwMzk1KSxsYXlvdXRBY3Rpdml0eWJhckxlZnQ6YygibGF5b3V0LWFjdGl2aXR5YmFyLWxlZnQiLDYwMzk2KSxsYXlvdXRBY3Rpdml0eWJhclJpZ2h0OmMoImxheW91dC1hY3Rpdml0eWJhci1yaWdodCIsNjAzOTcpLGxheW91dFBhbmVsTGVmdDpjKCJsYXlvdXQtcGFuZWwtbGVmdCIsNjAzOTgpLGxheW91dFBhbmVsQ2VudGVyOmMoImxheW91dC1wYW5lbC1jZW50ZXIiLDYwMzk5KSxsYXlvdXRQYW5lbEp1c3RpZnk6YygibGF5b3V0LXBhbmVsLWp1c3RpZnkiLDYwNDAwKSxsYXlvdXRQYW5lbFJpZ2h0OmMoImxheW91dC1wYW5lbC1yaWdodCIsNjA0MDEpLGxheW91dFBhbmVsOmMoImxheW91dC1wYW5lbCIsNjA0MDIpLGxheW91dFNpZGViYXJMZWZ0OmMoImxheW91dC1zaWRlYmFyLWxlZnQiLDYwNDAzKSxsYXlvdXRTaWRlYmFyUmlnaHQ6YygibGF5b3V0LXNpZGViYXItcmlnaHQiLDYwNDA0KSxsYXlvdXRTdGF0dXNiYXI6YygibGF5b3V0LXN0YXR1c2JhciIsNjA0MDUpLGxheW91dE1lbnViYXI6YygibGF5b3V0LW1lbnViYXIiLDYwNDA2KSxsYXlvdXRDZW50ZXJlZDpjKCJsYXlvdXQtY2VudGVyZWQiLDYwNDA3KSx0YXJnZXQ6YygidGFyZ2V0Iiw2MDQwOCksaW5kZW50OmMoImluZGVudCIsNjA0MDkpLHJlY29yZFNtYWxsOmMoInJlY29yZC1zbWFsbCIsNjA0MTApLGVycm9yU21hbGw6YygiZXJyb3Itc21hbGwiLDYwNDExKSx0ZXJtaW5hbERlY29yYXRpb25FcnJvcjpjKCJ0ZXJtaW5hbC1kZWNvcmF0aW9uLWVycm9yIiw2MDQxMSksYXJyb3dDaXJjbGVEb3duOmMoImFycm93LWNpcmNsZS1kb3duIiw2MDQxMiksYXJyb3dDaXJjbGVMZWZ0OmMoImFycm93LWNpcmNsZS1sZWZ0Iiw2MDQxMyksYXJyb3dDaXJjbGVSaWdodDpjKCJhcnJvdy1jaXJjbGUtcmlnaHQiLDYwNDE0KSxhcnJvd0NpcmNsZVVwOmMoImFycm93LWNpcmNsZS11cCIsNjA0MTUpLGxheW91dFNpZGViYXJSaWdodE9mZjpjKCJsYXlvdXQtc2lkZWJhci1yaWdodC1vZmYiLDYwNDE2KSxsYXlvdXRQYW5lbE9mZjpjKCJsYXlvdXQtcGFuZWwtb2ZmIiw2MDQxNyksbGF5b3V0U2lkZWJhckxlZnRPZmY6YygibGF5b3V0LXNpZGViYXItbGVmdC1vZmYiLDYwNDE4KSxibGFuazpjKCJibGFuayIsNjA0MTkpLGhlYXJ0RmlsbGVkOmMoImhlYXJ0LWZpbGxlZCIsNjA0MjApLG1hcDpjKCJtYXAiLDYwNDIxKSxtYXBIb3Jpem9udGFsOmMoIm1hcC1ob3Jpem9udGFsIiw2MDQyMSksZm9sZEhvcml6b250YWw6YygiZm9sZC1ob3Jpem9udGFsIiw2MDQyMSksbWFwRmlsbGVkOmMoIm1hcC1maWxsZWQiLDYwNDIyKSxtYXBIb3Jpem9udGFsRmlsbGVkOmMoIm1hcC1ob3Jpem9udGFsLWZpbGxlZCIsNjA0MjIpLGZvbGRIb3Jpem9udGFsRmlsbGVkOmMoImZvbGQtaG9yaXpvbnRhbC1maWxsZWQiLDYwNDIyKSxjaXJjbGVTbWFsbDpjKCJjaXJjbGUtc21hbGwiLDYwNDIzKSxiZWxsU2xhc2g6YygiYmVsbC1zbGFzaCIsNjA0MjQpLGJlbGxTbGFzaERvdDpjKCJiZWxsLXNsYXNoLWRvdCIsNjA0MjUpLGNvbW1lbnRVbnJlc29sdmVkOmMoImNvbW1lbnQtdW5yZXNvbHZlZCIsNjA0MjYpLGdpdFB1bGxSZXF1ZXN0R29Ub0NoYW5nZXM6YygiZ2l0LXB1bGwtcmVxdWVzdC1nby10by1jaGFuZ2VzIiw2MDQyNyksZ2l0UHVsbFJlcXVlc3ROZXdDaGFuZ2VzOmMoImdpdC1wdWxsLXJlcXVlc3QtbmV3LWNoYW5nZXMiLDYwNDI4KSxzZWFyY2hGdXp6eTpjKCJzZWFyY2gtZnV6enkiLDYwNDI5KSxjb21tZW50RHJhZnQ6YygiY29tbWVudC1kcmFmdCIsNjA0MzApLHNlbmQ6Yygic2VuZCIsNjA0MzEpLHNwYXJrbGU6Yygic3BhcmtsZSIsNjA0MzIpLGluc2VydDpjKCJpbnNlcnQiLDYwNDMzKSxtaWM6YygibWljIiw2MDQzNCksdGh1bWJzZG93bkZpbGxlZDpjKCJ0aHVtYnNkb3duLWZpbGxlZCIsNjA0MzUpLHRodW1ic3VwRmlsbGVkOmMoInRodW1ic3VwLWZpbGxlZCIsNjA0MzYpLGNvZmZlZTpjKCJjb2ZmZWUiLDYwNDM3KSxzbmFrZTpjKCJzbmFrZSIsNjA0MzgpLGdhbWU6YygiZ2FtZSIsNjA0MzkpLHZyOmMoInZyIiw2MDQ0MCksY2hpcDpjKCJjaGlwIiw2MDQ0MSkscGlhbm86YygicGlhbm8iLDYwNDQyKSxtdXNpYzpjKCJtdXNpYyIsNjA0NDMpLG1pY0ZpbGxlZDpjKCJtaWMtZmlsbGVkIiw2MDQ0NCkscmVwb0ZldGNoOmMoInJlcG8tZmV0Y2giLDYwNDQ1KSxjb3BpbG90OmMoImNvcGlsb3QiLDYwNDQ2KSxsaWdodGJ1bGJTcGFya2xlOmMoImxpZ2h0YnVsYi1zcGFya2xlIiw2MDQ0Nykscm9ib3Q6Yygicm9ib3QiLDYwNDQ4KSxzcGFya2xlRmlsbGVkOmMoInNwYXJrbGUtZmlsbGVkIiw2MDQ0OSksZGlmZlNpbmdsZTpjKCJkaWZmLXNpbmdsZSIsNjA0NTApLGRpZmZNdWx0aXBsZTpjKCJkaWZmLW11bHRpcGxlIiw2MDQ1MSksc3Vycm91bmRXaXRoOmMoInN1cnJvdW5kLXdpdGgiLDYwNDUyKSxzaGFyZTpjKCJzaGFyZSIsNjA0NTMpLGdpdFN0YXNoOmMoImdpdC1zdGFzaCIsNjA0NTQpLGdpdFN0YXNoQXBwbHk6YygiZ2l0LXN0YXNoLWFwcGx5Iiw2MDQ1NSksZ2l0U3Rhc2hQb3A6YygiZ2l0LXN0YXNoLXBvcCIsNjA0NTYpLHZzY29kZTpjKCJ2c2NvZGUiLDYwNDU3KSx2c2NvZGVJbnNpZGVyczpjKCJ2c2NvZGUtaW5zaWRlcnMiLDYwNDU4KSxjb2RlT3NzOmMoImNvZGUtb3NzIiw2MDQ1OSkscnVuQ292ZXJhZ2U6YygicnVuLWNvdmVyYWdlIiw2MDQ2MCkscnVuQWxsQ292ZXJhZ2U6YygicnVuLWFsbC1jb3ZlcmFnZSIsNjA0NjEpLGNvdmVyYWdlOmMoImNvdmVyYWdlIiw2MDQ2MiksZ2l0aHViUHJvamVjdDpjKCJnaXRodWItcHJvamVjdCIsNjA0NjMpLG1hcFZlcnRpY2FsOmMoIm1hcC12ZXJ0aWNhbCIsNjA0NjQpLGZvbGRWZXJ0aWNhbDpjKCJmb2xkLXZlcnRpY2FsIiw2MDQ2NCksbWFwVmVydGljYWxGaWxsZWQ6YygibWFwLXZlcnRpY2FsLWZpbGxlZCIsNjA0NjUpLGZvbGRWZXJ0aWNhbEZpbGxlZDpjKCJmb2xkLXZlcnRpY2FsLWZpbGxlZCIsNjA0NjUpLGdvVG9TZWFyY2g6YygiZ28tdG8tc2VhcmNoIiw2MDQ2NikscGVyY2VudGFnZTpjKCJwZXJjZW50YWdlIiw2MDQ2Nyksc29ydFBlcmNlbnRhZ2U6Yygic29ydC1wZXJjZW50YWdlIiw2MDQ2NyksYXR0YWNoOmMoImF0dGFjaCIsNjA0NjgpfSxwdT17ZGlhbG9nRXJyb3I6YygiZGlhbG9nLWVycm9yIiwiZXJyb3IiKSxkaWFsb2dXYXJuaW5nOmMoImRpYWxvZy13YXJuaW5nIiwid2FybmluZyIpLGRpYWxvZ0luZm86YygiZGlhbG9nLWluZm8iLCJpbmZvIiksZGlhbG9nQ2xvc2U6YygiZGlhbG9nLWNsb3NlIiwiY2xvc2UiKSx0cmVlSXRlbUV4cGFuZGVkOmMoInRyZWUtaXRlbS1leHBhbmRlZCIsImNoZXZyb24tZG93biIpLHRyZWVGaWx0ZXJPblR5cGVPbjpjKCJ0cmVlLWZpbHRlci1vbi10eXBlLW9uIiwibGlzdC1maWx0ZXIiKSx0cmVlRmlsdGVyT25UeXBlT2ZmOmMoInRyZWUtZmlsdGVyLW9uLXR5cGUtb2ZmIiwibGlzdC1zZWxlY3Rpb24iKSx0cmVlRmlsdGVyQ2xlYXI6YygidHJlZS1maWx0ZXItY2xlYXIiLCJjbG9zZSIpLHRyZWVJdGVtTG9hZGluZzpjKCJ0cmVlLWl0ZW0tbG9hZGluZyIsImxvYWRpbmciKSxtZW51U2VsZWN0aW9uOmMoIm1lbnUtc2VsZWN0aW9uIiwiY2hlY2siKSxtZW51U3VibWVudTpjKCJtZW51LXN1Ym1lbnUiLCJjaGV2cm9uLXJpZ2h0IiksbWVudUJhck1vcmU6YygibWVudWJhci1tb3JlIiwibW9yZSIpLHNjcm9sbGJhckJ1dHRvbkxlZnQ6Yygic2Nyb2xsYmFyLWJ1dHRvbi1sZWZ0IiwidHJpYW5nbGUtbGVmdCIpLHNjcm9sbGJhckJ1dHRvblJpZ2h0OmMoInNjcm9sbGJhci1idXR0b24tcmlnaHQiLCJ0cmlhbmdsZS1yaWdodCIpLHNjcm9sbGJhckJ1dHRvblVwOmMoInNjcm9sbGJhci1idXR0b24tdXAiLCJ0cmlhbmdsZS11cCIpLHNjcm9sbGJhckJ1dHRvbkRvd246Yygic2Nyb2xsYmFyLWJ1dHRvbi1kb3duIiwidHJpYW5nbGUtZG93biIpLHRvb2xCYXJNb3JlOmMoInRvb2xiYXItbW9yZSIsIm1vcmUiKSxxdWlja0lucHV0QmFjazpjKCJxdWljay1pbnB1dC1iYWNrIiwiYXJyb3ctbGVmdCIpLGRyb3BEb3duQnV0dG9uOmMoImRyb3AtZG93bi1idXR0b24iLDYwMDg0KSxzeW1ib2xDdXN0b21Db2xvcjpjKCJzeW1ib2wtY3VzdG9tY29sb3IiLDYwMjUyKSxleHBvcnRJY29uOmMoImV4cG9ydCIsNjAzMzIpLHdvcmtzcGFjZVVuc3BlY2lmaWVkOmMoIndvcmtzcGFjZS11bnNwZWNpZmllZCIsNjAzNTUpLG5ld0xpbmU6YygibmV3bGluZSIsNjAzOTQpLHRodW1ic0Rvd25GaWxsZWQ6YygidGh1bWJzZG93bi1maWxsZWQiLDYwNDM1KSx0aHVtYnNVcEZpbGxlZDpjKCJ0aHVtYnN1cC1maWxsZWQiLDYwNDM2KSxnaXRGZXRjaDpjKCJnaXQtZmV0Y2giLDYwNDQ1KSxsaWdodGJ1bGJTcGFya2xlQXV0b2ZpeDpjKCJsaWdodGJ1bGItc3BhcmtsZS1hdXRvZml4Iiw2MDQ0NyksZGVidWdCcmVha3BvaW50UGVuZGluZzpjKCJkZWJ1Zy1icmVha3BvaW50LXBlbmRpbmciLDYwMzc3KX0sVj17Li4uZ3UsLi4ucHV9O2NsYXNzIFRpe2NvbnN0cnVjdG9yKCl7dGhpcy5fdG9rZW5pemF0aW9uU3VwcG9ydHM9bmV3IE1hcCx0aGlzLl9mYWN0b3JpZXM9bmV3IE1hcCx0aGlzLl9vbkRpZENoYW5nZT1uZXcgX2UsdGhpcy5vbkRpZENoYW5nZT10aGlzLl9vbkRpZENoYW5nZS5ldmVudCx0aGlzLl9jb2xvck1hcD1udWxsfWhhbmRsZUNoYW5nZSh0KXt0aGlzLl9vbkRpZENoYW5nZS5maXJlKHtjaGFuZ2VkTGFuZ3VhZ2VzOnQsY2hhbmdlZENvbG9yTWFwOiExfSl9cmVnaXN0ZXIodCxuKXtyZXR1cm4gdGhpcy5fdG9rZW5pemF0aW9uU3VwcG9ydHMuc2V0KHQsbiksdGhpcy5oYW5kbGVDaGFuZ2UoW3RdKSxvbigoKT0+e3RoaXMuX3Rva2VuaXphdGlvblN1cHBvcnRzLmdldCh0KT09PW4mJih0aGlzLl90b2tlbml6YXRpb25TdXBwb3J0cy5kZWxldGUodCksdGhpcy5oYW5kbGVDaGFuZ2UoW3RdKSl9KX1nZXQodCl7cmV0dXJuIHRoaXMuX3Rva2VuaXphdGlvblN1cHBvcnRzLmdldCh0KXx8bnVsbH1yZWdpc3RlckZhY3RvcnkodCxuKXt2YXIgaTsoaT10aGlzLl9mYWN0b3JpZXMuZ2V0KHQpKT09bnVsbHx8aS5kaXNwb3NlKCk7Y29uc3Qgcj1uZXcgYnUodGhpcyx0LG4pO3JldHVybiB0aGlzLl9mYWN0b3JpZXMuc2V0KHQsciksb24oKCk9Pntjb25zdCBzPXRoaXMuX2ZhY3Rvcmllcy5nZXQodCk7IXN8fHMhPT1yfHwodGhpcy5fZmFjdG9yaWVzLmRlbGV0ZSh0KSxzLmRpc3Bvc2UoKSl9KX1hc3luYyBnZXRPckNyZWF0ZSh0KXtjb25zdCBuPXRoaXMuZ2V0KHQpO2lmKG4pcmV0dXJuIG47Y29uc3Qgcj10aGlzLl9mYWN0b3JpZXMuZ2V0KHQpO3JldHVybiFyfHxyLmlzUmVzb2x2ZWQ/bnVsbDooYXdhaXQgci5yZXNvbHZlKCksdGhpcy5nZXQodCkpfWlzUmVzb2x2ZWQodCl7aWYodGhpcy5nZXQodCkpcmV0dXJuITA7Y29uc3Qgcj10aGlzLl9mYWN0b3JpZXMuZ2V0KHQpO3JldHVybiEhKCFyfHxyLmlzUmVzb2x2ZWQpfXNldENvbG9yTWFwKHQpe3RoaXMuX2NvbG9yTWFwPXQsdGhpcy5fb25EaWRDaGFuZ2UuZmlyZSh7Y2hhbmdlZExhbmd1YWdlczpBcnJheS5mcm9tKHRoaXMuX3Rva2VuaXphdGlvblN1cHBvcnRzLmtleXMoKSksY2hhbmdlZENvbG9yTWFwOiEwfSl9Z2V0Q29sb3JNYXAoKXtyZXR1cm4gdGhpcy5fY29sb3JNYXB9Z2V0RGVmYXVsdEJhY2tncm91bmQoKXtyZXR1cm4gdGhpcy5fY29sb3JNYXAmJnRoaXMuX2NvbG9yTWFwLmxlbmd0aD4yP3RoaXMuX2NvbG9yTWFwWzJdOm51bGx9fWNsYXNzIGJ1IGV4dGVuZHMgbXR7Z2V0IGlzUmVzb2x2ZWQoKXtyZXR1cm4gdGhpcy5faXNSZXNvbHZlZH1jb25zdHJ1Y3Rvcih0LG4scil7c3VwZXIoKSx0aGlzLl9yZWdpc3RyeT10LHRoaXMuX2xhbmd1YWdlSWQ9bix0aGlzLl9mYWN0b3J5PXIsdGhpcy5faXNEaXNwb3NlZD0hMSx0aGlzLl9yZXNvbHZlUHJvbWlzZT1udWxsLHRoaXMuX2lzUmVzb2x2ZWQ9ITF9ZGlzcG9zZSgpe3RoaXMuX2lzRGlzcG9zZWQ9ITAsc3VwZXIuZGlzcG9zZSgpfWFzeW5jIHJlc29sdmUoKXtyZXR1cm4gdGhpcy5fcmVzb2x2ZVByb21pc2V8fCh0aGlzLl9yZXNvbHZlUHJvbWlzZT10aGlzLl9jcmVhdGUoKSksdGhpcy5fcmVzb2x2ZVByb21pc2V9YXN5bmMgX2NyZWF0ZSgpe2NvbnN0IHQ9YXdhaXQgdGhpcy5fZmFjdG9yeS50b2tlbml6YXRpb25TdXBwb3J0O3RoaXMuX2lzUmVzb2x2ZWQ9ITAsdCYmIXRoaXMuX2lzRGlzcG9zZWQmJnRoaXMuX3JlZ2lzdGVyKHRoaXMuX3JlZ2lzdHJ5LnJlZ2lzdGVyKHRoaXMuX2xhbmd1YWdlSWQsdCkpfX1jbGFzcyB2dXtjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy5vZmZzZXQ9dCx0aGlzLnR5cGU9bix0aGlzLmxhbmd1YWdlPXIsdGhpcy5fdG9rZW5CcmFuZD12b2lkIDB9dG9TdHJpbmcoKXtyZXR1cm4iKCIrdGhpcy5vZmZzZXQrIiwgIit0aGlzLnR5cGUrIikifX12YXIgUGk7KGZ1bmN0aW9uKGUpe2VbZS5JbmNyZWFzZT0wXT0iSW5jcmVhc2UiLGVbZS5EZWNyZWFzZT0xXT0iRGVjcmVhc2UifSkoUGl8fChQaT17fSkpO3ZhciBJaTsoZnVuY3Rpb24oZSl7Y29uc3QgdD1uZXcgTWFwO3Quc2V0KDAsVi5zeW1ib2xNZXRob2QpLHQuc2V0KDEsVi5zeW1ib2xGdW5jdGlvbiksdC5zZXQoMixWLnN5bWJvbENvbnN0cnVjdG9yKSx0LnNldCgzLFYuc3ltYm9sRmllbGQpLHQuc2V0KDQsVi5zeW1ib2xWYXJpYWJsZSksdC5zZXQoNSxWLnN5bWJvbENsYXNzKSx0LnNldCg2LFYuc3ltYm9sU3RydWN0KSx0LnNldCg3LFYuc3ltYm9sSW50ZXJmYWNlKSx0LnNldCg4LFYuc3ltYm9sTW9kdWxlKSx0LnNldCg5LFYuc3ltYm9sUHJvcGVydHkpLHQuc2V0KDEwLFYuc3ltYm9sRXZlbnQpLHQuc2V0KDExLFYuc3ltYm9sT3BlcmF0b3IpLHQuc2V0KDEyLFYuc3ltYm9sVW5pdCksdC5zZXQoMTMsVi5zeW1ib2xWYWx1ZSksdC5zZXQoMTUsVi5zeW1ib2xFbnVtKSx0LnNldCgxNCxWLnN5bWJvbENvbnN0YW50KSx0LnNldCgxNSxWLnN5bWJvbEVudW0pLHQuc2V0KDE2LFYuc3ltYm9sRW51bU1lbWJlciksdC5zZXQoMTcsVi5zeW1ib2xLZXl3b3JkKSx0LnNldCgyNyxWLnN5bWJvbFNuaXBwZXQpLHQuc2V0KDE4LFYuc3ltYm9sVGV4dCksdC5zZXQoMTksVi5zeW1ib2xDb2xvciksdC5zZXQoMjAsVi5zeW1ib2xGaWxlKSx0LnNldCgyMSxWLnN5bWJvbFJlZmVyZW5jZSksdC5zZXQoMjIsVi5zeW1ib2xDdXN0b21Db2xvciksdC5zZXQoMjMsVi5zeW1ib2xGb2xkZXIpLHQuc2V0KDI0LFYuc3ltYm9sVHlwZVBhcmFtZXRlciksdC5zZXQoMjUsVi5hY2NvdW50KSx0LnNldCgyNixWLmlzc3Vlcyk7ZnVuY3Rpb24gbihzKXtsZXQgYT10LmdldChzKTtyZXR1cm4gYXx8KGNvbnNvbGUuaW5mbygiTm8gY29kaWNvbiBmb3VuZCBmb3IgQ29tcGxldGlvbkl0ZW1LaW5kICIrcyksYT1WLnN5bWJvbFByb3BlcnR5KSxhfWUudG9JY29uPW47Y29uc3Qgcj1uZXcgTWFwO3Iuc2V0KCJtZXRob2QiLDApLHIuc2V0KCJmdW5jdGlvbiIsMSksci5zZXQoImNvbnN0cnVjdG9yIiwyKSxyLnNldCgiZmllbGQiLDMpLHIuc2V0KCJ2YXJpYWJsZSIsNCksci5zZXQoImNsYXNzIiw1KSxyLnNldCgic3RydWN0Iiw2KSxyLnNldCgiaW50ZXJmYWNlIiw3KSxyLnNldCgibW9kdWxlIiw4KSxyLnNldCgicHJvcGVydHkiLDkpLHIuc2V0KCJldmVudCIsMTApLHIuc2V0KCJvcGVyYXRvciIsMTEpLHIuc2V0KCJ1bml0IiwxMiksci5zZXQoInZhbHVlIiwxMyksci5zZXQoImNvbnN0YW50IiwxNCksci5zZXQoImVudW0iLDE1KSxyLnNldCgiZW51bS1tZW1iZXIiLDE2KSxyLnNldCgiZW51bU1lbWJlciIsMTYpLHIuc2V0KCJrZXl3b3JkIiwxNyksci5zZXQoInNuaXBwZXQiLDI3KSxyLnNldCgidGV4dCIsMTgpLHIuc2V0KCJjb2xvciIsMTkpLHIuc2V0KCJmaWxlIiwyMCksci5zZXQoInJlZmVyZW5jZSIsMjEpLHIuc2V0KCJjdXN0b21jb2xvciIsMjIpLHIuc2V0KCJmb2xkZXIiLDIzKSxyLnNldCgidHlwZS1wYXJhbWV0ZXIiLDI0KSxyLnNldCgidHlwZVBhcmFtZXRlciIsMjQpLHIuc2V0KCJhY2NvdW50IiwyNSksci5zZXQoImlzc3VlIiwyNik7ZnVuY3Rpb24gaShzLGEpe2xldCBsPXIuZ2V0KHMpO3JldHVybiB0eXBlb2YgbD4idSImJiFhJiYobD05KSxsfWUuZnJvbVN0cmluZz1pfSkoSWl8fChJaT17fSkpO3ZhciBGaTsoZnVuY3Rpb24oZSl7ZVtlLkF1dG9tYXRpYz0wXT0iQXV0b21hdGljIixlW2UuRXhwbGljaXQ9MV09IkV4cGxpY2l0In0pKEZpfHwoRmk9e30pKTt2YXIgVmk7KGZ1bmN0aW9uKGUpe2VbZS5BdXRvbWF0aWM9MF09IkF1dG9tYXRpYyIsZVtlLlBhc3RlQXM9MV09IlBhc3RlQXMifSkoVml8fChWaT17fSkpO3ZhciBEaTsoZnVuY3Rpb24oZSl7ZVtlLkludm9rZT0xXT0iSW52b2tlIixlW2UuVHJpZ2dlckNoYXJhY3Rlcj0yXT0iVHJpZ2dlckNoYXJhY3RlciIsZVtlLkNvbnRlbnRDaGFuZ2U9M109IkNvbnRlbnRDaGFuZ2UifSkoRGl8fChEaT17fSkpO3ZhciBPaTsoZnVuY3Rpb24oZSl7ZVtlLlRleHQ9MF09IlRleHQiLGVbZS5SZWFkPTFdPSJSZWFkIixlW2UuV3JpdGU9Ml09IldyaXRlIn0pKE9pfHwoT2k9e30pKSxYKCJBcnJheSIsImFycmF5IiksWCgiQm9vbGVhbiIsImJvb2xlYW4iKSxYKCJDbGFzcyIsImNsYXNzIiksWCgiQ29uc3RhbnQiLCJjb25zdGFudCIpLFgoIkNvbnN0cnVjdG9yIiwiY29uc3RydWN0b3IiKSxYKCJFbnVtIiwiZW51bWVyYXRpb24iKSxYKCJFbnVtTWVtYmVyIiwiZW51bWVyYXRpb24gbWVtYmVyIiksWCgiRXZlbnQiLCJldmVudCIpLFgoIkZpZWxkIiwiZmllbGQiKSxYKCJGaWxlIiwiZmlsZSIpLFgoIkZ1bmN0aW9uIiwiZnVuY3Rpb24iKSxYKCJJbnRlcmZhY2UiLCJpbnRlcmZhY2UiKSxYKCJLZXkiLCJrZXkiKSxYKCJNZXRob2QiLCJtZXRob2QiKSxYKCJNb2R1bGUiLCJtb2R1bGUiKSxYKCJOYW1lc3BhY2UiLCJuYW1lc3BhY2UiKSxYKCJOdWxsIiwibnVsbCIpLFgoIk51bWJlciIsIm51bWJlciIpLFgoIk9iamVjdCIsIm9iamVjdCIpLFgoIk9wZXJhdG9yIiwib3BlcmF0b3IiKSxYKCJQYWNrYWdlIiwicGFja2FnZSIpLFgoIlByb3BlcnR5IiwicHJvcGVydHkiKSxYKCJTdHJpbmciLCJzdHJpbmciKSxYKCJTdHJ1Y3QiLCJzdHJ1Y3QiKSxYKCJUeXBlUGFyYW1ldGVyIiwidHlwZSBwYXJhbWV0ZXIiKSxYKCJWYXJpYWJsZSIsInZhcmlhYmxlIik7dmFyICRpOyhmdW5jdGlvbihlKXtjb25zdCB0PW5ldyBNYXA7dC5zZXQoMCxWLnN5bWJvbEZpbGUpLHQuc2V0KDEsVi5zeW1ib2xNb2R1bGUpLHQuc2V0KDIsVi5zeW1ib2xOYW1lc3BhY2UpLHQuc2V0KDMsVi5zeW1ib2xQYWNrYWdlKSx0LnNldCg0LFYuc3ltYm9sQ2xhc3MpLHQuc2V0KDUsVi5zeW1ib2xNZXRob2QpLHQuc2V0KDYsVi5zeW1ib2xQcm9wZXJ0eSksdC5zZXQoNyxWLnN5bWJvbEZpZWxkKSx0LnNldCg4LFYuc3ltYm9sQ29uc3RydWN0b3IpLHQuc2V0KDksVi5zeW1ib2xFbnVtKSx0LnNldCgxMCxWLnN5bWJvbEludGVyZmFjZSksdC5zZXQoMTEsVi5zeW1ib2xGdW5jdGlvbiksdC5zZXQoMTIsVi5zeW1ib2xWYXJpYWJsZSksdC5zZXQoMTMsVi5zeW1ib2xDb25zdGFudCksdC5zZXQoMTQsVi5zeW1ib2xTdHJpbmcpLHQuc2V0KDE1LFYuc3ltYm9sTnVtYmVyKSx0LnNldCgxNixWLnN5bWJvbEJvb2xlYW4pLHQuc2V0KDE3LFYuc3ltYm9sQXJyYXkpLHQuc2V0KDE4LFYuc3ltYm9sT2JqZWN0KSx0LnNldCgxOSxWLnN5bWJvbEtleSksdC5zZXQoMjAsVi5zeW1ib2xOdWxsKSx0LnNldCgyMSxWLnN5bWJvbEVudW1NZW1iZXIpLHQuc2V0KDIyLFYuc3ltYm9sU3RydWN0KSx0LnNldCgyMyxWLnN5bWJvbEV2ZW50KSx0LnNldCgyNCxWLnN5bWJvbE9wZXJhdG9yKSx0LnNldCgyNSxWLnN5bWJvbFR5cGVQYXJhbWV0ZXIpO2Z1bmN0aW9uIG4ocil7bGV0IGk9dC5nZXQocik7cmV0dXJuIGl8fChjb25zb2xlLmluZm8oIk5vIGNvZGljb24gZm91bmQgZm9yIFN5bWJvbEtpbmQgIityKSxpPVYuc3ltYm9sUHJvcGVydHkpLGl9ZS50b0ljb249bn0pKCRpfHwoJGk9e30pKTtsZXQgRzE9KG1lPWNsYXNze3N0YXRpYyBmcm9tVmFsdWUodCl7c3dpdGNoKHQpe2Nhc2UiY29tbWVudCI6cmV0dXJuIG1lLkNvbW1lbnQ7Y2FzZSJpbXBvcnRzIjpyZXR1cm4gbWUuSW1wb3J0cztjYXNlInJlZ2lvbiI6cmV0dXJuIG1lLlJlZ2lvbn1yZXR1cm4gbmV3IG1lKHQpfWNvbnN0cnVjdG9yKHQpe3RoaXMudmFsdWU9dH19LG1lLkNvbW1lbnQ9bmV3IG1lKCJjb21tZW50IiksbWUuSW1wb3J0cz1uZXcgbWUoImltcG9ydHMiKSxtZS5SZWdpb249bmV3IG1lKCJyZWdpb24iKSxtZSk7dmFyIFVpOyhmdW5jdGlvbihlKXtlW2UuQUlHZW5lcmF0ZWQ9MV09IkFJR2VuZXJhdGVkIn0pKFVpfHwoVWk9e30pKTt2YXIgQmk7KGZ1bmN0aW9uKGUpe2VbZS5JbnZva2U9MF09Ikludm9rZSIsZVtlLkF1dG9tYXRpYz0xXT0iQXV0b21hdGljIn0pKEJpfHwoQmk9e30pKTt2YXIgcWk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7cmV0dXJuIW58fHR5cGVvZiBuIT0ib2JqZWN0Ij8hMTp0eXBlb2Ygbi5pZD09InN0cmluZyImJnR5cGVvZiBuLnRpdGxlPT0ic3RyaW5nIn1lLmlzPXR9KShxaXx8KHFpPXt9KSk7dmFyIGppOyhmdW5jdGlvbihlKXtlW2UuVHlwZT0xXT0iVHlwZSIsZVtlLlBhcmFtZXRlcj0yXT0iUGFyYW1ldGVyIn0pKGppfHwoamk9e30pKSxuZXcgVGksbmV3IFRpO3ZhciBXaTsoZnVuY3Rpb24oZSl7ZVtlLkludm9rZT0wXT0iSW52b2tlIixlW2UuQXV0b21hdGljPTFdPSJBdXRvbWF0aWMifSkoV2l8fChXaT17fSkpO3ZhciBIaTsoZnVuY3Rpb24oZSl7ZVtlLlVua25vd249MF09IlVua25vd24iLGVbZS5EaXNhYmxlZD0xXT0iRGlzYWJsZWQiLGVbZS5FbmFibGVkPTJdPSJFbmFibGVkIn0pKEhpfHwoSGk9e30pKTt2YXIgemk7KGZ1bmN0aW9uKGUpe2VbZS5JbnZva2U9MV09Ikludm9rZSIsZVtlLkF1dG89Ml09IkF1dG8ifSkoeml8fCh6aT17fSkpO3ZhciBHaTsoZnVuY3Rpb24oZSl7ZVtlLk5vbmU9MF09Ik5vbmUiLGVbZS5LZWVwV2hpdGVzcGFjZT0xXT0iS2VlcFdoaXRlc3BhY2UiLGVbZS5JbnNlcnRBc1NuaXBwZXQ9NF09Ikluc2VydEFzU25pcHBldCJ9KShHaXx8KEdpPXt9KSk7dmFyIEppOyhmdW5jdGlvbihlKXtlW2UuTWV0aG9kPTBdPSJNZXRob2QiLGVbZS5GdW5jdGlvbj0xXT0iRnVuY3Rpb24iLGVbZS5Db25zdHJ1Y3Rvcj0yXT0iQ29uc3RydWN0b3IiLGVbZS5GaWVsZD0zXT0iRmllbGQiLGVbZS5WYXJpYWJsZT00XT0iVmFyaWFibGUiLGVbZS5DbGFzcz01XT0iQ2xhc3MiLGVbZS5TdHJ1Y3Q9Nl09IlN0cnVjdCIsZVtlLkludGVyZmFjZT03XT0iSW50ZXJmYWNlIixlW2UuTW9kdWxlPThdPSJNb2R1bGUiLGVbZS5Qcm9wZXJ0eT05XT0iUHJvcGVydHkiLGVbZS5FdmVudD0xMF09IkV2ZW50IixlW2UuT3BlcmF0b3I9MTFdPSJPcGVyYXRvciIsZVtlLlVuaXQ9MTJdPSJVbml0IixlW2UuVmFsdWU9MTNdPSJWYWx1ZSIsZVtlLkNvbnN0YW50PTE0XT0iQ29uc3RhbnQiLGVbZS5FbnVtPTE1XT0iRW51bSIsZVtlLkVudW1NZW1iZXI9MTZdPSJFbnVtTWVtYmVyIixlW2UuS2V5d29yZD0xN109IktleXdvcmQiLGVbZS5UZXh0PTE4XT0iVGV4dCIsZVtlLkNvbG9yPTE5XT0iQ29sb3IiLGVbZS5GaWxlPTIwXT0iRmlsZSIsZVtlLlJlZmVyZW5jZT0yMV09IlJlZmVyZW5jZSIsZVtlLkN1c3RvbWNvbG9yPTIyXT0iQ3VzdG9tY29sb3IiLGVbZS5Gb2xkZXI9MjNdPSJGb2xkZXIiLGVbZS5UeXBlUGFyYW1ldGVyPTI0XT0iVHlwZVBhcmFtZXRlciIsZVtlLlVzZXI9MjVdPSJVc2VyIixlW2UuSXNzdWU9MjZdPSJJc3N1ZSIsZVtlLlNuaXBwZXQ9MjddPSJTbmlwcGV0In0pKEppfHwoSmk9e30pKTt2YXIgWGk7KGZ1bmN0aW9uKGUpe2VbZS5EZXByZWNhdGVkPTFdPSJEZXByZWNhdGVkIn0pKFhpfHwoWGk9e30pKTt2YXIgUWk7KGZ1bmN0aW9uKGUpe2VbZS5JbnZva2U9MF09Ikludm9rZSIsZVtlLlRyaWdnZXJDaGFyYWN0ZXI9MV09IlRyaWdnZXJDaGFyYWN0ZXIiLGVbZS5UcmlnZ2VyRm9ySW5jb21wbGV0ZUNvbXBsZXRpb25zPTJdPSJUcmlnZ2VyRm9ySW5jb21wbGV0ZUNvbXBsZXRpb25zIn0pKFFpfHwoUWk9e30pKTt2YXIgWWk7KGZ1bmN0aW9uKGUpe2VbZS5FWEFDVD0wXT0iRVhBQ1QiLGVbZS5BQk9WRT0xXT0iQUJPVkUiLGVbZS5CRUxPVz0yXT0iQkVMT1cifSkoWWl8fChZaT17fSkpO3ZhciBaaTsoZnVuY3Rpb24oZSl7ZVtlLk5vdFNldD0wXT0iTm90U2V0IixlW2UuQ29udGVudEZsdXNoPTFdPSJDb250ZW50Rmx1c2giLGVbZS5SZWNvdmVyRnJvbU1hcmtlcnM9Ml09IlJlY292ZXJGcm9tTWFya2VycyIsZVtlLkV4cGxpY2l0PTNdPSJFeHBsaWNpdCIsZVtlLlBhc3RlPTRdPSJQYXN0ZSIsZVtlLlVuZG89NV09IlVuZG8iLGVbZS5SZWRvPTZdPSJSZWRvIn0pKFppfHwoWmk9e30pKTt2YXIgS2k7KGZ1bmN0aW9uKGUpe2VbZS5MRj0xXT0iTEYiLGVbZS5DUkxGPTJdPSJDUkxGIn0pKEtpfHwoS2k9e30pKTt2YXIgZXM7KGZ1bmN0aW9uKGUpe2VbZS5UZXh0PTBdPSJUZXh0IixlW2UuUmVhZD0xXT0iUmVhZCIsZVtlLldyaXRlPTJdPSJXcml0ZSJ9KShlc3x8KGVzPXt9KSk7dmFyIHRzOyhmdW5jdGlvbihlKXtlW2UuTm9uZT0wXT0iTm9uZSIsZVtlLktlZXA9MV09IktlZXAiLGVbZS5CcmFja2V0cz0yXT0iQnJhY2tldHMiLGVbZS5BZHZhbmNlZD0zXT0iQWR2YW5jZWQiLGVbZS5GdWxsPTRdPSJGdWxsIn0pKHRzfHwodHM9e30pKTt2YXIgbnM7KGZ1bmN0aW9uKGUpe2VbZS5hY2NlcHRTdWdnZXN0aW9uT25Db21taXRDaGFyYWN0ZXI9MF09ImFjY2VwdFN1Z2dlc3Rpb25PbkNvbW1pdENoYXJhY3RlciIsZVtlLmFjY2VwdFN1Z2dlc3Rpb25PbkVudGVyPTFdPSJhY2NlcHRTdWdnZXN0aW9uT25FbnRlciIsZVtlLmFjY2Vzc2liaWxpdHlTdXBwb3J0PTJdPSJhY2Nlc3NpYmlsaXR5U3VwcG9ydCIsZVtlLmFjY2Vzc2liaWxpdHlQYWdlU2l6ZT0zXT0iYWNjZXNzaWJpbGl0eVBhZ2VTaXplIixlW2UuYXJpYUxhYmVsPTRdPSJhcmlhTGFiZWwiLGVbZS5hcmlhUmVxdWlyZWQ9NV09ImFyaWFSZXF1aXJlZCIsZVtlLmF1dG9DbG9zaW5nQnJhY2tldHM9Nl09ImF1dG9DbG9zaW5nQnJhY2tldHMiLGVbZS5hdXRvQ2xvc2luZ0NvbW1lbnRzPTddPSJhdXRvQ2xvc2luZ0NvbW1lbnRzIixlW2Uuc2NyZWVuUmVhZGVyQW5ub3VuY2VJbmxpbmVTdWdnZXN0aW9uPThdPSJzY3JlZW5SZWFkZXJBbm5vdW5jZUlubGluZVN1Z2dlc3Rpb24iLGVbZS5hdXRvQ2xvc2luZ0RlbGV0ZT05XT0iYXV0b0Nsb3NpbmdEZWxldGUiLGVbZS5hdXRvQ2xvc2luZ092ZXJ0eXBlPTEwXT0iYXV0b0Nsb3NpbmdPdmVydHlwZSIsZVtlLmF1dG9DbG9zaW5nUXVvdGVzPTExXT0iYXV0b0Nsb3NpbmdRdW90ZXMiLGVbZS5hdXRvSW5kZW50PTEyXT0iYXV0b0luZGVudCIsZVtlLmF1dG9tYXRpY0xheW91dD0xM109ImF1dG9tYXRpY0xheW91dCIsZVtlLmF1dG9TdXJyb3VuZD0xNF09ImF1dG9TdXJyb3VuZCIsZVtlLmJyYWNrZXRQYWlyQ29sb3JpemF0aW9uPTE1XT0iYnJhY2tldFBhaXJDb2xvcml6YXRpb24iLGVbZS5ndWlkZXM9MTZdPSJndWlkZXMiLGVbZS5jb2RlTGVucz0xN109ImNvZGVMZW5zIixlW2UuY29kZUxlbnNGb250RmFtaWx5PTE4XT0iY29kZUxlbnNGb250RmFtaWx5IixlW2UuY29kZUxlbnNGb250U2l6ZT0xOV09ImNvZGVMZW5zRm9udFNpemUiLGVbZS5jb2xvckRlY29yYXRvcnM9MjBdPSJjb2xvckRlY29yYXRvcnMiLGVbZS5jb2xvckRlY29yYXRvcnNMaW1pdD0yMV09ImNvbG9yRGVjb3JhdG9yc0xpbWl0IixlW2UuY29sdW1uU2VsZWN0aW9uPTIyXT0iY29sdW1uU2VsZWN0aW9uIixlW2UuY29tbWVudHM9MjNdPSJjb21tZW50cyIsZVtlLmNvbnRleHRtZW51PTI0XT0iY29udGV4dG1lbnUiLGVbZS5jb3B5V2l0aFN5bnRheEhpZ2hsaWdodGluZz0yNV09ImNvcHlXaXRoU3ludGF4SGlnaGxpZ2h0aW5nIixlW2UuY3Vyc29yQmxpbmtpbmc9MjZdPSJjdXJzb3JCbGlua2luZyIsZVtlLmN1cnNvclNtb290aENhcmV0QW5pbWF0aW9uPTI3XT0iY3Vyc29yU21vb3RoQ2FyZXRBbmltYXRpb24iLGVbZS5jdXJzb3JTdHlsZT0yOF09ImN1cnNvclN0eWxlIixlW2UuY3Vyc29yU3Vycm91bmRpbmdMaW5lcz0yOV09ImN1cnNvclN1cnJvdW5kaW5nTGluZXMiLGVbZS5jdXJzb3JTdXJyb3VuZGluZ0xpbmVzU3R5bGU9MzBdPSJjdXJzb3JTdXJyb3VuZGluZ0xpbmVzU3R5bGUiLGVbZS5jdXJzb3JXaWR0aD0zMV09ImN1cnNvcldpZHRoIixlW2UuZGlzYWJsZUxheWVySGludGluZz0zMl09ImRpc2FibGVMYXllckhpbnRpbmciLGVbZS5kaXNhYmxlTW9ub3NwYWNlT3B0aW1pemF0aW9ucz0zM109ImRpc2FibGVNb25vc3BhY2VPcHRpbWl6YXRpb25zIixlW2UuZG9tUmVhZE9ubHk9MzRdPSJkb21SZWFkT25seSIsZVtlLmRyYWdBbmREcm9wPTM1XT0iZHJhZ0FuZERyb3AiLGVbZS5kcm9wSW50b0VkaXRvcj0zNl09ImRyb3BJbnRvRWRpdG9yIixlW2UuZW1wdHlTZWxlY3Rpb25DbGlwYm9hcmQ9MzddPSJlbXB0eVNlbGVjdGlvbkNsaXBib2FyZCIsZVtlLmV4cGVyaW1lbnRhbFdoaXRlc3BhY2VSZW5kZXJpbmc9MzhdPSJleHBlcmltZW50YWxXaGl0ZXNwYWNlUmVuZGVyaW5nIixlW2UuZXh0cmFFZGl0b3JDbGFzc05hbWU9MzldPSJleHRyYUVkaXRvckNsYXNzTmFtZSIsZVtlLmZhc3RTY3JvbGxTZW5zaXRpdml0eT00MF09ImZhc3RTY3JvbGxTZW5zaXRpdml0eSIsZVtlLmZpbmQ9NDFdPSJmaW5kIixlW2UuZml4ZWRPdmVyZmxvd1dpZGdldHM9NDJdPSJmaXhlZE92ZXJmbG93V2lkZ2V0cyIsZVtlLmZvbGRpbmc9NDNdPSJmb2xkaW5nIixlW2UuZm9sZGluZ1N0cmF0ZWd5PTQ0XT0iZm9sZGluZ1N0cmF0ZWd5IixlW2UuZm9sZGluZ0hpZ2hsaWdodD00NV09ImZvbGRpbmdIaWdobGlnaHQiLGVbZS5mb2xkaW5nSW1wb3J0c0J5RGVmYXVsdD00Nl09ImZvbGRpbmdJbXBvcnRzQnlEZWZhdWx0IixlW2UuZm9sZGluZ01heGltdW1SZWdpb25zPTQ3XT0iZm9sZGluZ01heGltdW1SZWdpb25zIixlW2UudW5mb2xkT25DbGlja0FmdGVyRW5kT2ZMaW5lPTQ4XT0idW5mb2xkT25DbGlja0FmdGVyRW5kT2ZMaW5lIixlW2UuZm9udEZhbWlseT00OV09ImZvbnRGYW1pbHkiLGVbZS5mb250SW5mbz01MF09ImZvbnRJbmZvIixlW2UuZm9udExpZ2F0dXJlcz01MV09ImZvbnRMaWdhdHVyZXMiLGVbZS5mb250U2l6ZT01Ml09ImZvbnRTaXplIixlW2UuZm9udFdlaWdodD01M109ImZvbnRXZWlnaHQiLGVbZS5mb250VmFyaWF0aW9ucz01NF09ImZvbnRWYXJpYXRpb25zIixlW2UuZm9ybWF0T25QYXN0ZT01NV09ImZvcm1hdE9uUGFzdGUiLGVbZS5mb3JtYXRPblR5cGU9NTZdPSJmb3JtYXRPblR5cGUiLGVbZS5nbHlwaE1hcmdpbj01N109ImdseXBoTWFyZ2luIixlW2UuZ290b0xvY2F0aW9uPTU4XT0iZ290b0xvY2F0aW9uIixlW2UuaGlkZUN1cnNvckluT3ZlcnZpZXdSdWxlcj01OV09ImhpZGVDdXJzb3JJbk92ZXJ2aWV3UnVsZXIiLGVbZS5ob3Zlcj02MF09ImhvdmVyIixlW2UuaW5EaWZmRWRpdG9yPTYxXT0iaW5EaWZmRWRpdG9yIixlW2UuaW5saW5lU3VnZ2VzdD02Ml09ImlubGluZVN1Z2dlc3QiLGVbZS5pbmxpbmVFZGl0PTYzXT0iaW5saW5lRWRpdCIsZVtlLmxldHRlclNwYWNpbmc9NjRdPSJsZXR0ZXJTcGFjaW5nIixlW2UubGlnaHRidWxiPTY1XT0ibGlnaHRidWxiIixlW2UubGluZURlY29yYXRpb25zV2lkdGg9NjZdPSJsaW5lRGVjb3JhdGlvbnNXaWR0aCIsZVtlLmxpbmVIZWlnaHQ9NjddPSJsaW5lSGVpZ2h0IixlW2UubGluZU51bWJlcnM9NjhdPSJsaW5lTnVtYmVycyIsZVtlLmxpbmVOdW1iZXJzTWluQ2hhcnM9NjldPSJsaW5lTnVtYmVyc01pbkNoYXJzIixlW2UubGlua2VkRWRpdGluZz03MF09ImxpbmtlZEVkaXRpbmciLGVbZS5saW5rcz03MV09ImxpbmtzIixlW2UubWF0Y2hCcmFja2V0cz03Ml09Im1hdGNoQnJhY2tldHMiLGVbZS5taW5pbWFwPTczXT0ibWluaW1hcCIsZVtlLm1vdXNlU3R5bGU9NzRdPSJtb3VzZVN0eWxlIixlW2UubW91c2VXaGVlbFNjcm9sbFNlbnNpdGl2aXR5PTc1XT0ibW91c2VXaGVlbFNjcm9sbFNlbnNpdGl2aXR5IixlW2UubW91c2VXaGVlbFpvb209NzZdPSJtb3VzZVdoZWVsWm9vbSIsZVtlLm11bHRpQ3Vyc29yTWVyZ2VPdmVybGFwcGluZz03N109Im11bHRpQ3Vyc29yTWVyZ2VPdmVybGFwcGluZyIsZVtlLm11bHRpQ3Vyc29yTW9kaWZpZXI9NzhdPSJtdWx0aUN1cnNvck1vZGlmaWVyIixlW2UubXVsdGlDdXJzb3JQYXN0ZT03OV09Im11bHRpQ3Vyc29yUGFzdGUiLGVbZS5tdWx0aUN1cnNvckxpbWl0PTgwXT0ibXVsdGlDdXJzb3JMaW1pdCIsZVtlLm9jY3VycmVuY2VzSGlnaGxpZ2h0PTgxXT0ib2NjdXJyZW5jZXNIaWdobGlnaHQiLGVbZS5vdmVydmlld1J1bGVyQm9yZGVyPTgyXT0ib3ZlcnZpZXdSdWxlckJvcmRlciIsZVtlLm92ZXJ2aWV3UnVsZXJMYW5lcz04M109Im92ZXJ2aWV3UnVsZXJMYW5lcyIsZVtlLnBhZGRpbmc9ODRdPSJwYWRkaW5nIixlW2UucGFzdGVBcz04NV09InBhc3RlQXMiLGVbZS5wYXJhbWV0ZXJIaW50cz04Nl09InBhcmFtZXRlckhpbnRzIixlW2UucGVla1dpZGdldERlZmF1bHRGb2N1cz04N109InBlZWtXaWRnZXREZWZhdWx0Rm9jdXMiLGVbZS5wbGFjZWhvbGRlcj04OF09InBsYWNlaG9sZGVyIixlW2UuZGVmaW5pdGlvbkxpbmtPcGVuc0luUGVlaz04OV09ImRlZmluaXRpb25MaW5rT3BlbnNJblBlZWsiLGVbZS5xdWlja1N1Z2dlc3Rpb25zPTkwXT0icXVpY2tTdWdnZXN0aW9ucyIsZVtlLnF1aWNrU3VnZ2VzdGlvbnNEZWxheT05MV09InF1aWNrU3VnZ2VzdGlvbnNEZWxheSIsZVtlLnJlYWRPbmx5PTkyXT0icmVhZE9ubHkiLGVbZS5yZWFkT25seU1lc3NhZ2U9OTNdPSJyZWFkT25seU1lc3NhZ2UiLGVbZS5yZW5hbWVPblR5cGU9OTRdPSJyZW5hbWVPblR5cGUiLGVbZS5yZW5kZXJDb250cm9sQ2hhcmFjdGVycz05NV09InJlbmRlckNvbnRyb2xDaGFyYWN0ZXJzIixlW2UucmVuZGVyRmluYWxOZXdsaW5lPTk2XT0icmVuZGVyRmluYWxOZXdsaW5lIixlW2UucmVuZGVyTGluZUhpZ2hsaWdodD05N109InJlbmRlckxpbmVIaWdobGlnaHQiLGVbZS5yZW5kZXJMaW5lSGlnaGxpZ2h0T25seVdoZW5Gb2N1cz05OF09InJlbmRlckxpbmVIaWdobGlnaHRPbmx5V2hlbkZvY3VzIixlW2UucmVuZGVyVmFsaWRhdGlvbkRlY29yYXRpb25zPTk5XT0icmVuZGVyVmFsaWRhdGlvbkRlY29yYXRpb25zIixlW2UucmVuZGVyV2hpdGVzcGFjZT0xMDBdPSJyZW5kZXJXaGl0ZXNwYWNlIixlW2UucmV2ZWFsSG9yaXpvbnRhbFJpZ2h0UGFkZGluZz0xMDFdPSJyZXZlYWxIb3Jpem9udGFsUmlnaHRQYWRkaW5nIixlW2Uucm91bmRlZFNlbGVjdGlvbj0xMDJdPSJyb3VuZGVkU2VsZWN0aW9uIixlW2UucnVsZXJzPTEwM109InJ1bGVycyIsZVtlLnNjcm9sbGJhcj0xMDRdPSJzY3JvbGxiYXIiLGVbZS5zY3JvbGxCZXlvbmRMYXN0Q29sdW1uPTEwNV09InNjcm9sbEJleW9uZExhc3RDb2x1bW4iLGVbZS5zY3JvbGxCZXlvbmRMYXN0TGluZT0xMDZdPSJzY3JvbGxCZXlvbmRMYXN0TGluZSIsZVtlLnNjcm9sbFByZWRvbWluYW50QXhpcz0xMDddPSJzY3JvbGxQcmVkb21pbmFudEF4aXMiLGVbZS5zZWxlY3Rpb25DbGlwYm9hcmQ9MTA4XT0ic2VsZWN0aW9uQ2xpcGJvYXJkIixlW2Uuc2VsZWN0aW9uSGlnaGxpZ2h0PTEwOV09InNlbGVjdGlvbkhpZ2hsaWdodCIsZVtlLnNlbGVjdE9uTGluZU51bWJlcnM9MTEwXT0ic2VsZWN0T25MaW5lTnVtYmVycyIsZVtlLnNob3dGb2xkaW5nQ29udHJvbHM9MTExXT0ic2hvd0ZvbGRpbmdDb250cm9scyIsZVtlLnNob3dVbnVzZWQ9MTEyXT0ic2hvd1VudXNlZCIsZVtlLnNuaXBwZXRTdWdnZXN0aW9ucz0xMTNdPSJzbmlwcGV0U3VnZ2VzdGlvbnMiLGVbZS5zbWFydFNlbGVjdD0xMTRdPSJzbWFydFNlbGVjdCIsZVtlLnNtb290aFNjcm9sbGluZz0xMTVdPSJzbW9vdGhTY3JvbGxpbmciLGVbZS5zdGlja3lTY3JvbGw9MTE2XT0ic3RpY2t5U2Nyb2xsIixlW2Uuc3RpY2t5VGFiU3RvcHM9MTE3XT0ic3RpY2t5VGFiU3RvcHMiLGVbZS5zdG9wUmVuZGVyaW5nTGluZUFmdGVyPTExOF09InN0b3BSZW5kZXJpbmdMaW5lQWZ0ZXIiLGVbZS5zdWdnZXN0PTExOV09InN1Z2dlc3QiLGVbZS5zdWdnZXN0Rm9udFNpemU9MTIwXT0ic3VnZ2VzdEZvbnRTaXplIixlW2Uuc3VnZ2VzdExpbmVIZWlnaHQ9MTIxXT0ic3VnZ2VzdExpbmVIZWlnaHQiLGVbZS5zdWdnZXN0T25UcmlnZ2VyQ2hhcmFjdGVycz0xMjJdPSJzdWdnZXN0T25UcmlnZ2VyQ2hhcmFjdGVycyIsZVtlLnN1Z2dlc3RTZWxlY3Rpb249MTIzXT0ic3VnZ2VzdFNlbGVjdGlvbiIsZVtlLnRhYkNvbXBsZXRpb249MTI0XT0idGFiQ29tcGxldGlvbiIsZVtlLnRhYkluZGV4PTEyNV09InRhYkluZGV4IixlW2UudW5pY29kZUhpZ2hsaWdodGluZz0xMjZdPSJ1bmljb2RlSGlnaGxpZ2h0aW5nIixlW2UudW51c3VhbExpbmVUZXJtaW5hdG9ycz0xMjddPSJ1bnVzdWFsTGluZVRlcm1pbmF0b3JzIixlW2UudXNlU2hhZG93RE9NPTEyOF09InVzZVNoYWRvd0RPTSIsZVtlLnVzZVRhYlN0b3BzPTEyOV09InVzZVRhYlN0b3BzIixlW2Uud29yZEJyZWFrPTEzMF09IndvcmRCcmVhayIsZVtlLndvcmRTZWdtZW50ZXJMb2NhbGVzPTEzMV09IndvcmRTZWdtZW50ZXJMb2NhbGVzIixlW2Uud29yZFNlcGFyYXRvcnM9MTMyXT0id29yZFNlcGFyYXRvcnMiLGVbZS53b3JkV3JhcD0xMzNdPSJ3b3JkV3JhcCIsZVtlLndvcmRXcmFwQnJlYWtBZnRlckNoYXJhY3RlcnM9MTM0XT0id29yZFdyYXBCcmVha0FmdGVyQ2hhcmFjdGVycyIsZVtlLndvcmRXcmFwQnJlYWtCZWZvcmVDaGFyYWN0ZXJzPTEzNV09IndvcmRXcmFwQnJlYWtCZWZvcmVDaGFyYWN0ZXJzIixlW2Uud29yZFdyYXBDb2x1bW49MTM2XT0id29yZFdyYXBDb2x1bW4iLGVbZS53b3JkV3JhcE92ZXJyaWRlMT0xMzddPSJ3b3JkV3JhcE92ZXJyaWRlMSIsZVtlLndvcmRXcmFwT3ZlcnJpZGUyPTEzOF09IndvcmRXcmFwT3ZlcnJpZGUyIixlW2Uud3JhcHBpbmdJbmRlbnQ9MTM5XT0id3JhcHBpbmdJbmRlbnQiLGVbZS53cmFwcGluZ1N0cmF0ZWd5PTE0MF09IndyYXBwaW5nU3RyYXRlZ3kiLGVbZS5zaG93RGVwcmVjYXRlZD0xNDFdPSJzaG93RGVwcmVjYXRlZCIsZVtlLmlubGF5SGludHM9MTQyXT0iaW5sYXlIaW50cyIsZVtlLmVkaXRvckNsYXNzTmFtZT0xNDNdPSJlZGl0b3JDbGFzc05hbWUiLGVbZS5waXhlbFJhdGlvPTE0NF09InBpeGVsUmF0aW8iLGVbZS50YWJGb2N1c01vZGU9MTQ1XT0idGFiRm9jdXNNb2RlIixlW2UubGF5b3V0SW5mbz0xNDZdPSJsYXlvdXRJbmZvIixlW2Uud3JhcHBpbmdJbmZvPTE0N109IndyYXBwaW5nSW5mbyIsZVtlLmRlZmF1bHRDb2xvckRlY29yYXRvcnM9MTQ4XT0iZGVmYXVsdENvbG9yRGVjb3JhdG9ycyIsZVtlLmNvbG9yRGVjb3JhdG9yc0FjdGl2YXRlZE9uPTE0OV09ImNvbG9yRGVjb3JhdG9yc0FjdGl2YXRlZE9uIixlW2UuaW5saW5lQ29tcGxldGlvbnNBY2Nlc3NpYmlsaXR5VmVyYm9zZT0xNTBdPSJpbmxpbmVDb21wbGV0aW9uc0FjY2Vzc2liaWxpdHlWZXJib3NlIn0pKG5zfHwobnM9e30pKTt2YXIgcnM7KGZ1bmN0aW9uKGUpe2VbZS5UZXh0RGVmaW5lZD0wXT0iVGV4dERlZmluZWQiLGVbZS5MRj0xXT0iTEYiLGVbZS5DUkxGPTJdPSJDUkxGIn0pKHJzfHwocnM9e30pKTt2YXIgaXM7KGZ1bmN0aW9uKGUpe2VbZS5MRj0wXT0iTEYiLGVbZS5DUkxGPTFdPSJDUkxGIn0pKGlzfHwoaXM9e30pKTt2YXIgc3M7KGZ1bmN0aW9uKGUpe2VbZS5MZWZ0PTFdPSJMZWZ0IixlW2UuQ2VudGVyPTJdPSJDZW50ZXIiLGVbZS5SaWdodD0zXT0iUmlnaHQifSkoc3N8fChzcz17fSkpO3ZhciBhczsoZnVuY3Rpb24oZSl7ZVtlLkluY3JlYXNlPTBdPSJJbmNyZWFzZSIsZVtlLkRlY3JlYXNlPTFdPSJEZWNyZWFzZSJ9KShhc3x8KGFzPXt9KSk7dmFyIG9zOyhmdW5jdGlvbihlKXtlW2UuTm9uZT0wXT0iTm9uZSIsZVtlLkluZGVudD0xXT0iSW5kZW50IixlW2UuSW5kZW50T3V0ZGVudD0yXT0iSW5kZW50T3V0ZGVudCIsZVtlLk91dGRlbnQ9M109Ik91dGRlbnQifSkob3N8fChvcz17fSkpO3ZhciBsczsoZnVuY3Rpb24oZSl7ZVtlLkJvdGg9MF09IkJvdGgiLGVbZS5SaWdodD0xXT0iUmlnaHQiLGVbZS5MZWZ0PTJdPSJMZWZ0IixlW2UuTm9uZT0zXT0iTm9uZSJ9KShsc3x8KGxzPXt9KSk7dmFyIHVzOyhmdW5jdGlvbihlKXtlW2UuVHlwZT0xXT0iVHlwZSIsZVtlLlBhcmFtZXRlcj0yXT0iUGFyYW1ldGVyIn0pKHVzfHwodXM9e30pKTt2YXIgY3M7KGZ1bmN0aW9uKGUpe2VbZS5BdXRvbWF0aWM9MF09IkF1dG9tYXRpYyIsZVtlLkV4cGxpY2l0PTFdPSJFeHBsaWNpdCJ9KShjc3x8KGNzPXt9KSk7dmFyIGZzOyhmdW5jdGlvbihlKXtlW2UuSW52b2tlPTBdPSJJbnZva2UiLGVbZS5BdXRvbWF0aWM9MV09IkF1dG9tYXRpYyJ9KShmc3x8KGZzPXt9KSk7dmFyIG1yOyhmdW5jdGlvbihlKXtlW2UuRGVwZW5kc09uS2JMYXlvdXQ9LTFdPSJEZXBlbmRzT25LYkxheW91dCIsZVtlLlVua25vd249MF09IlVua25vd24iLGVbZS5CYWNrc3BhY2U9MV09IkJhY2tzcGFjZSIsZVtlLlRhYj0yXT0iVGFiIixlW2UuRW50ZXI9M109IkVudGVyIixlW2UuU2hpZnQ9NF09IlNoaWZ0IixlW2UuQ3RybD01XT0iQ3RybCIsZVtlLkFsdD02XT0iQWx0IixlW2UuUGF1c2VCcmVhaz03XT0iUGF1c2VCcmVhayIsZVtlLkNhcHNMb2NrPThdPSJDYXBzTG9jayIsZVtlLkVzY2FwZT05XT0iRXNjYXBlIixlW2UuU3BhY2U9MTBdPSJTcGFjZSIsZVtlLlBhZ2VVcD0xMV09IlBhZ2VVcCIsZVtlLlBhZ2VEb3duPTEyXT0iUGFnZURvd24iLGVbZS5FbmQ9MTNdPSJFbmQiLGVbZS5Ib21lPTE0XT0iSG9tZSIsZVtlLkxlZnRBcnJvdz0xNV09IkxlZnRBcnJvdyIsZVtlLlVwQXJyb3c9MTZdPSJVcEFycm93IixlW2UuUmlnaHRBcnJvdz0xN109IlJpZ2h0QXJyb3ciLGVbZS5Eb3duQXJyb3c9MThdPSJEb3duQXJyb3ciLGVbZS5JbnNlcnQ9MTldPSJJbnNlcnQiLGVbZS5EZWxldGU9MjBdPSJEZWxldGUiLGVbZS5EaWdpdDA9MjFdPSJEaWdpdDAiLGVbZS5EaWdpdDE9MjJdPSJEaWdpdDEiLGVbZS5EaWdpdDI9MjNdPSJEaWdpdDIiLGVbZS5EaWdpdDM9MjRdPSJEaWdpdDMiLGVbZS5EaWdpdDQ9MjVdPSJEaWdpdDQiLGVbZS5EaWdpdDU9MjZdPSJEaWdpdDUiLGVbZS5EaWdpdDY9MjddPSJEaWdpdDYiLGVbZS5EaWdpdDc9MjhdPSJEaWdpdDciLGVbZS5EaWdpdDg9MjldPSJEaWdpdDgiLGVbZS5EaWdpdDk9MzBdPSJEaWdpdDkiLGVbZS5LZXlBPTMxXT0iS2V5QSIsZVtlLktleUI9MzJdPSJLZXlCIixlW2UuS2V5Qz0zM109IktleUMiLGVbZS5LZXlEPTM0XT0iS2V5RCIsZVtlLktleUU9MzVdPSJLZXlFIixlW2UuS2V5Rj0zNl09IktleUYiLGVbZS5LZXlHPTM3XT0iS2V5RyIsZVtlLktleUg9MzhdPSJLZXlIIixlW2UuS2V5ST0zOV09IktleUkiLGVbZS5LZXlKPTQwXT0iS2V5SiIsZVtlLktleUs9NDFdPSJLZXlLIixlW2UuS2V5TD00Ml09IktleUwiLGVbZS5LZXlNPTQzXT0iS2V5TSIsZVtlLktleU49NDRdPSJLZXlOIixlW2UuS2V5Tz00NV09IktleU8iLGVbZS5LZXlQPTQ2XT0iS2V5UCIsZVtlLktleVE9NDddPSJLZXlRIixlW2UuS2V5Uj00OF09IktleVIiLGVbZS5LZXlTPTQ5XT0iS2V5UyIsZVtlLktleVQ9NTBdPSJLZXlUIixlW2UuS2V5VT01MV09IktleVUiLGVbZS5LZXlWPTUyXT0iS2V5ViIsZVtlLktleVc9NTNdPSJLZXlXIixlW2UuS2V5WD01NF09IktleVgiLGVbZS5LZXlZPTU1XT0iS2V5WSIsZVtlLktleVo9NTZdPSJLZXlaIixlW2UuTWV0YT01N109Ik1ldGEiLGVbZS5Db250ZXh0TWVudT01OF09IkNvbnRleHRNZW51IixlW2UuRjE9NTldPSJGMSIsZVtlLkYyPTYwXT0iRjIiLGVbZS5GMz02MV09IkYzIixlW2UuRjQ9NjJdPSJGNCIsZVtlLkY1PTYzXT0iRjUiLGVbZS5GNj02NF09IkY2IixlW2UuRjc9NjVdPSJGNyIsZVtlLkY4PTY2XT0iRjgiLGVbZS5GOT02N109IkY5IixlW2UuRjEwPTY4XT0iRjEwIixlW2UuRjExPTY5XT0iRjExIixlW2UuRjEyPTcwXT0iRjEyIixlW2UuRjEzPTcxXT0iRjEzIixlW2UuRjE0PTcyXT0iRjE0IixlW2UuRjE1PTczXT0iRjE1IixlW2UuRjE2PTc0XT0iRjE2IixlW2UuRjE3PTc1XT0iRjE3IixlW2UuRjE4PTc2XT0iRjE4IixlW2UuRjE5PTc3XT0iRjE5IixlW2UuRjIwPTc4XT0iRjIwIixlW2UuRjIxPTc5XT0iRjIxIixlW2UuRjIyPTgwXT0iRjIyIixlW2UuRjIzPTgxXT0iRjIzIixlW2UuRjI0PTgyXT0iRjI0IixlW2UuTnVtTG9jaz04M109Ik51bUxvY2siLGVbZS5TY3JvbGxMb2NrPTg0XT0iU2Nyb2xsTG9jayIsZVtlLlNlbWljb2xvbj04NV09IlNlbWljb2xvbiIsZVtlLkVxdWFsPTg2XT0iRXF1YWwiLGVbZS5Db21tYT04N109IkNvbW1hIixlW2UuTWludXM9ODhdPSJNaW51cyIsZVtlLlBlcmlvZD04OV09IlBlcmlvZCIsZVtlLlNsYXNoPTkwXT0iU2xhc2giLGVbZS5CYWNrcXVvdGU9OTFdPSJCYWNrcXVvdGUiLGVbZS5CcmFja2V0TGVmdD05Ml09IkJyYWNrZXRMZWZ0IixlW2UuQmFja3NsYXNoPTkzXT0iQmFja3NsYXNoIixlW2UuQnJhY2tldFJpZ2h0PTk0XT0iQnJhY2tldFJpZ2h0IixlW2UuUXVvdGU9OTVdPSJRdW90ZSIsZVtlLk9FTV84PTk2XT0iT0VNXzgiLGVbZS5JbnRsQmFja3NsYXNoPTk3XT0iSW50bEJhY2tzbGFzaCIsZVtlLk51bXBhZDA9OThdPSJOdW1wYWQwIixlW2UuTnVtcGFkMT05OV09Ik51bXBhZDEiLGVbZS5OdW1wYWQyPTEwMF09Ik51bXBhZDIiLGVbZS5OdW1wYWQzPTEwMV09Ik51bXBhZDMiLGVbZS5OdW1wYWQ0PTEwMl09Ik51bXBhZDQiLGVbZS5OdW1wYWQ1PTEwM109Ik51bXBhZDUiLGVbZS5OdW1wYWQ2PTEwNF09Ik51bXBhZDYiLGVbZS5OdW1wYWQ3PTEwNV09Ik51bXBhZDciLGVbZS5OdW1wYWQ4PTEwNl09Ik51bXBhZDgiLGVbZS5OdW1wYWQ5PTEwN109Ik51bXBhZDkiLGVbZS5OdW1wYWRNdWx0aXBseT0xMDhdPSJOdW1wYWRNdWx0aXBseSIsZVtlLk51bXBhZEFkZD0xMDldPSJOdW1wYWRBZGQiLGVbZS5OVU1QQURfU0VQQVJBVE9SPTExMF09Ik5VTVBBRF9TRVBBUkFUT1IiLGVbZS5OdW1wYWRTdWJ0cmFjdD0xMTFdPSJOdW1wYWRTdWJ0cmFjdCIsZVtlLk51bXBhZERlY2ltYWw9MTEyXT0iTnVtcGFkRGVjaW1hbCIsZVtlLk51bXBhZERpdmlkZT0xMTNdPSJOdW1wYWREaXZpZGUiLGVbZS5LRVlfSU5fQ09NUE9TSVRJT049MTE0XT0iS0VZX0lOX0NPTVBPU0lUSU9OIixlW2UuQUJOVF9DMT0xMTVdPSJBQk5UX0MxIixlW2UuQUJOVF9DMj0xMTZdPSJBQk5UX0MyIixlW2UuQXVkaW9Wb2x1bWVNdXRlPTExN109IkF1ZGlvVm9sdW1lTXV0ZSIsZVtlLkF1ZGlvVm9sdW1lVXA9MTE4XT0iQXVkaW9Wb2x1bWVVcCIsZVtlLkF1ZGlvVm9sdW1lRG93bj0xMTldPSJBdWRpb1ZvbHVtZURvd24iLGVbZS5Ccm93c2VyU2VhcmNoPTEyMF09IkJyb3dzZXJTZWFyY2giLGVbZS5Ccm93c2VySG9tZT0xMjFdPSJCcm93c2VySG9tZSIsZVtlLkJyb3dzZXJCYWNrPTEyMl09IkJyb3dzZXJCYWNrIixlW2UuQnJvd3NlckZvcndhcmQ9MTIzXT0iQnJvd3NlckZvcndhcmQiLGVbZS5NZWRpYVRyYWNrTmV4dD0xMjRdPSJNZWRpYVRyYWNrTmV4dCIsZVtlLk1lZGlhVHJhY2tQcmV2aW91cz0xMjVdPSJNZWRpYVRyYWNrUHJldmlvdXMiLGVbZS5NZWRpYVN0b3A9MTI2XT0iTWVkaWFTdG9wIixlW2UuTWVkaWFQbGF5UGF1c2U9MTI3XT0iTWVkaWFQbGF5UGF1c2UiLGVbZS5MYXVuY2hNZWRpYVBsYXllcj0xMjhdPSJMYXVuY2hNZWRpYVBsYXllciIsZVtlLkxhdW5jaE1haWw9MTI5XT0iTGF1bmNoTWFpbCIsZVtlLkxhdW5jaEFwcDI9MTMwXT0iTGF1bmNoQXBwMiIsZVtlLkNsZWFyPTEzMV09IkNsZWFyIixlW2UuTUFYX1ZBTFVFPTEzMl09Ik1BWF9WQUxVRSJ9KShtcnx8KG1yPXt9KSk7dmFyIGdyOyhmdW5jdGlvbihlKXtlW2UuSGludD0xXT0iSGludCIsZVtlLkluZm89Ml09IkluZm8iLGVbZS5XYXJuaW5nPTRdPSJXYXJuaW5nIixlW2UuRXJyb3I9OF09IkVycm9yIn0pKGdyfHwoZ3I9e30pKTt2YXIgcHI7KGZ1bmN0aW9uKGUpe2VbZS5Vbm5lY2Vzc2FyeT0xXT0iVW5uZWNlc3NhcnkiLGVbZS5EZXByZWNhdGVkPTJdPSJEZXByZWNhdGVkIn0pKHByfHwocHI9e30pKTt2YXIgaHM7KGZ1bmN0aW9uKGUpe2VbZS5JbmxpbmU9MV09IklubGluZSIsZVtlLkd1dHRlcj0yXT0iR3V0dGVyIn0pKGhzfHwoaHM9e30pKTt2YXIgZHM7KGZ1bmN0aW9uKGUpe2VbZS5Ob3JtYWw9MV09Ik5vcm1hbCIsZVtlLlVuZGVybGluZWQ9Ml09IlVuZGVybGluZWQifSkoZHN8fChkcz17fSkpO3ZhciBtczsoZnVuY3Rpb24oZSl7ZVtlLlVOS05PV049MF09IlVOS05PV04iLGVbZS5URVhUQVJFQT0xXT0iVEVYVEFSRUEiLGVbZS5HVVRURVJfR0xZUEhfTUFSR0lOPTJdPSJHVVRURVJfR0xZUEhfTUFSR0lOIixlW2UuR1VUVEVSX0xJTkVfTlVNQkVSUz0zXT0iR1VUVEVSX0xJTkVfTlVNQkVSUyIsZVtlLkdVVFRFUl9MSU5FX0RFQ09SQVRJT05TPTRdPSJHVVRURVJfTElORV9ERUNPUkFUSU9OUyIsZVtlLkdVVFRFUl9WSUVXX1pPTkU9NV09IkdVVFRFUl9WSUVXX1pPTkUiLGVbZS5DT05URU5UX1RFWFQ9Nl09IkNPTlRFTlRfVEVYVCIsZVtlLkNPTlRFTlRfRU1QVFk9N109IkNPTlRFTlRfRU1QVFkiLGVbZS5DT05URU5UX1ZJRVdfWk9ORT04XT0iQ09OVEVOVF9WSUVXX1pPTkUiLGVbZS5DT05URU5UX1dJREdFVD05XT0iQ09OVEVOVF9XSURHRVQiLGVbZS5PVkVSVklFV19SVUxFUj0xMF09Ik9WRVJWSUVXX1JVTEVSIixlW2UuU0NST0xMQkFSPTExXT0iU0NST0xMQkFSIixlW2UuT1ZFUkxBWV9XSURHRVQ9MTJdPSJPVkVSTEFZX1dJREdFVCIsZVtlLk9VVFNJREVfRURJVE9SPTEzXT0iT1VUU0lERV9FRElUT1IifSkobXN8fChtcz17fSkpO3ZhciBnczsoZnVuY3Rpb24oZSl7ZVtlLkFJR2VuZXJhdGVkPTFdPSJBSUdlbmVyYXRlZCJ9KShnc3x8KGdzPXt9KSk7dmFyIHBzOyhmdW5jdGlvbihlKXtlW2UuSW52b2tlPTBdPSJJbnZva2UiLGVbZS5BdXRvbWF0aWM9MV09IkF1dG9tYXRpYyJ9KShwc3x8KHBzPXt9KSk7dmFyIGJzOyhmdW5jdGlvbihlKXtlW2UuVE9QX1JJR0hUX0NPUk5FUj0wXT0iVE9QX1JJR0hUX0NPUk5FUiIsZVtlLkJPVFRPTV9SSUdIVF9DT1JORVI9MV09IkJPVFRPTV9SSUdIVF9DT1JORVIiLGVbZS5UT1BfQ0VOVEVSPTJdPSJUT1BfQ0VOVEVSIn0pKGJzfHwoYnM9e30pKTt2YXIgdnM7KGZ1bmN0aW9uKGUpe2VbZS5MZWZ0PTFdPSJMZWZ0IixlW2UuQ2VudGVyPTJdPSJDZW50ZXIiLGVbZS5SaWdodD00XT0iUmlnaHQiLGVbZS5GdWxsPTddPSJGdWxsIn0pKHZzfHwodnM9e30pKTt2YXIgeHM7KGZ1bmN0aW9uKGUpe2VbZS5Xb3JkPTBdPSJXb3JkIixlW2UuTGluZT0xXT0iTGluZSIsZVtlLlN1Z2dlc3Q9Ml09IlN1Z2dlc3QifSkoeHN8fCh4cz17fSkpO3ZhciB5czsoZnVuY3Rpb24oZSl7ZVtlLkxlZnQ9MF09IkxlZnQiLGVbZS5SaWdodD0xXT0iUmlnaHQiLGVbZS5Ob25lPTJdPSJOb25lIixlW2UuTGVmdE9mSW5qZWN0ZWRUZXh0PTNdPSJMZWZ0T2ZJbmplY3RlZFRleHQiLGVbZS5SaWdodE9mSW5qZWN0ZWRUZXh0PTRdPSJSaWdodE9mSW5qZWN0ZWRUZXh0In0pKHlzfHwoeXM9e30pKTt2YXIgd3M7KGZ1bmN0aW9uKGUpe2VbZS5PZmY9MF09Ik9mZiIsZVtlLk9uPTFdPSJPbiIsZVtlLlJlbGF0aXZlPTJdPSJSZWxhdGl2ZSIsZVtlLkludGVydmFsPTNdPSJJbnRlcnZhbCIsZVtlLkN1c3RvbT00XT0iQ3VzdG9tIn0pKHdzfHwod3M9e30pKTt2YXIgX3M7KGZ1bmN0aW9uKGUpe2VbZS5Ob25lPTBdPSJOb25lIixlW2UuVGV4dD0xXT0iVGV4dCIsZVtlLkJsb2Nrcz0yXT0iQmxvY2tzIn0pKF9zfHwoX3M9e30pKTt2YXIgTHM7KGZ1bmN0aW9uKGUpe2VbZS5TbW9vdGg9MF09IlNtb290aCIsZVtlLkltbWVkaWF0ZT0xXT0iSW1tZWRpYXRlIn0pKExzfHwoTHM9e30pKTt2YXIgTnM7KGZ1bmN0aW9uKGUpe2VbZS5BdXRvPTFdPSJBdXRvIixlW2UuSGlkZGVuPTJdPSJIaWRkZW4iLGVbZS5WaXNpYmxlPTNdPSJWaXNpYmxlIn0pKE5zfHwoTnM9e30pKTt2YXIgYnI7KGZ1bmN0aW9uKGUpe2VbZS5MVFI9MF09IkxUUiIsZVtlLlJUTD0xXT0iUlRMIn0pKGJyfHwoYnI9e30pKTt2YXIgU3M7KGZ1bmN0aW9uKGUpe2UuT2ZmPSJvZmYiLGUuT25Db2RlPSJvbkNvZGUiLGUuT249Im9uIn0pKFNzfHwoU3M9e30pKTt2YXIgQXM7KGZ1bmN0aW9uKGUpe2VbZS5JbnZva2U9MV09Ikludm9rZSIsZVtlLlRyaWdnZXJDaGFyYWN0ZXI9Ml09IlRyaWdnZXJDaGFyYWN0ZXIiLGVbZS5Db250ZW50Q2hhbmdlPTNdPSJDb250ZW50Q2hhbmdlIn0pKEFzfHwoQXM9e30pKTt2YXIga3M7KGZ1bmN0aW9uKGUpe2VbZS5GaWxlPTBdPSJGaWxlIixlW2UuTW9kdWxlPTFdPSJNb2R1bGUiLGVbZS5OYW1lc3BhY2U9Ml09Ik5hbWVzcGFjZSIsZVtlLlBhY2thZ2U9M109IlBhY2thZ2UiLGVbZS5DbGFzcz00XT0iQ2xhc3MiLGVbZS5NZXRob2Q9NV09Ik1ldGhvZCIsZVtlLlByb3BlcnR5PTZdPSJQcm9wZXJ0eSIsZVtlLkZpZWxkPTddPSJGaWVsZCIsZVtlLkNvbnN0cnVjdG9yPThdPSJDb25zdHJ1Y3RvciIsZVtlLkVudW09OV09IkVudW0iLGVbZS5JbnRlcmZhY2U9MTBdPSJJbnRlcmZhY2UiLGVbZS5GdW5jdGlvbj0xMV09IkZ1bmN0aW9uIixlW2UuVmFyaWFibGU9MTJdPSJWYXJpYWJsZSIsZVtlLkNvbnN0YW50PTEzXT0iQ29uc3RhbnQiLGVbZS5TdHJpbmc9MTRdPSJTdHJpbmciLGVbZS5OdW1iZXI9MTVdPSJOdW1iZXIiLGVbZS5Cb29sZWFuPTE2XT0iQm9vbGVhbiIsZVtlLkFycmF5PTE3XT0iQXJyYXkiLGVbZS5PYmplY3Q9MThdPSJPYmplY3QiLGVbZS5LZXk9MTldPSJLZXkiLGVbZS5OdWxsPTIwXT0iTnVsbCIsZVtlLkVudW1NZW1iZXI9MjFdPSJFbnVtTWVtYmVyIixlW2UuU3RydWN0PTIyXT0iU3RydWN0IixlW2UuRXZlbnQ9MjNdPSJFdmVudCIsZVtlLk9wZXJhdG9yPTI0XT0iT3BlcmF0b3IiLGVbZS5UeXBlUGFyYW1ldGVyPTI1XT0iVHlwZVBhcmFtZXRlciJ9KShrc3x8KGtzPXt9KSk7dmFyIFJzOyhmdW5jdGlvbihlKXtlW2UuRGVwcmVjYXRlZD0xXT0iRGVwcmVjYXRlZCJ9KShSc3x8KFJzPXt9KSk7dmFyIEVzOyhmdW5jdGlvbihlKXtlW2UuSGlkZGVuPTBdPSJIaWRkZW4iLGVbZS5CbGluaz0xXT0iQmxpbmsiLGVbZS5TbW9vdGg9Ml09IlNtb290aCIsZVtlLlBoYXNlPTNdPSJQaGFzZSIsZVtlLkV4cGFuZD00XT0iRXhwYW5kIixlW2UuU29saWQ9NV09IlNvbGlkIn0pKEVzfHwoRXM9e30pKTt2YXIgTXM7KGZ1bmN0aW9uKGUpe2VbZS5MaW5lPTFdPSJMaW5lIixlW2UuQmxvY2s9Ml09IkJsb2NrIixlW2UuVW5kZXJsaW5lPTNdPSJVbmRlcmxpbmUiLGVbZS5MaW5lVGhpbj00XT0iTGluZVRoaW4iLGVbZS5CbG9ja091dGxpbmU9NV09IkJsb2NrT3V0bGluZSIsZVtlLlVuZGVybGluZVRoaW49Nl09IlVuZGVybGluZVRoaW4ifSkoTXN8fChNcz17fSkpO3ZhciBDczsoZnVuY3Rpb24oZSl7ZVtlLkFsd2F5c0dyb3dzV2hlblR5cGluZ0F0RWRnZXM9MF09IkFsd2F5c0dyb3dzV2hlblR5cGluZ0F0RWRnZXMiLGVbZS5OZXZlckdyb3dzV2hlblR5cGluZ0F0RWRnZXM9MV09Ik5ldmVyR3Jvd3NXaGVuVHlwaW5nQXRFZGdlcyIsZVtlLkdyb3dzT25seVdoZW5UeXBpbmdCZWZvcmU9Ml09Ikdyb3dzT25seVdoZW5UeXBpbmdCZWZvcmUiLGVbZS5Hcm93c09ubHlXaGVuVHlwaW5nQWZ0ZXI9M109Ikdyb3dzT25seVdoZW5UeXBpbmdBZnRlciJ9KShDc3x8KENzPXt9KSk7dmFyIFRzOyhmdW5jdGlvbihlKXtlW2UuTm9uZT0wXT0iTm9uZSIsZVtlLlNhbWU9MV09IlNhbWUiLGVbZS5JbmRlbnQ9Ml09IkluZGVudCIsZVtlLkRlZXBJbmRlbnQ9M109IkRlZXBJbmRlbnQifSkoVHN8fChUcz17fSkpO2NvbnN0IFZ0PWNsYXNzIFZ0e3N0YXRpYyBjaG9yZCh0LG4pe3JldHVybiBkdSh0LG4pfX07VnQuQ3RybENtZD0yMDQ4LFZ0LlNoaWZ0PTEwMjQsVnQuQWx0PTUxMixWdC5XaW5DdHJsPTI1NjtsZXQgdnI9VnQ7ZnVuY3Rpb24geHUoKXtyZXR1cm57ZWRpdG9yOnZvaWQgMCxsYW5ndWFnZXM6dm9pZCAwLENhbmNlbGxhdGlvblRva2VuU291cmNlOnV1LEVtaXR0ZXI6X2UsS2V5Q29kZTptcixLZXlNb2Q6dnIsUG9zaXRpb246ZWUsUmFuZ2U6eixTZWxlY3Rpb246dmUsU2VsZWN0aW9uRGlyZWN0aW9uOmJyLE1hcmtlclNldmVyaXR5OmdyLE1hcmtlclRhZzpwcixVcmk6SWUsVG9rZW46dnV9fWNvbnN0IHJuPWNsYXNzIHJue3N0YXRpYyBnZXRDaGFubmVsKHQpe3JldHVybiB0LmdldENoYW5uZWwocm4uQ0hBTk5FTF9OQU1FKX1zdGF0aWMgc2V0Q2hhbm5lbCh0LG4pe3Quc2V0Q2hhbm5lbChybi5DSEFOTkVMX05BTUUsbil9fTtybi5DSEFOTkVMX05BTUU9ImVkaXRvcldvcmtlckhvc3QiO2xldCB4cj1ybjt2YXIgUHM7Y2xhc3MgeXV7Y29uc3RydWN0b3IoKXt0aGlzW1BzXT0iTGlua2VkTWFwIix0aGlzLl9tYXA9bmV3IE1hcCx0aGlzLl9oZWFkPXZvaWQgMCx0aGlzLl90YWlsPXZvaWQgMCx0aGlzLl9zaXplPTAsdGhpcy5fc3RhdGU9MH1jbGVhcigpe3RoaXMuX21hcC5jbGVhcigpLHRoaXMuX2hlYWQ9dm9pZCAwLHRoaXMuX3RhaWw9dm9pZCAwLHRoaXMuX3NpemU9MCx0aGlzLl9zdGF0ZSsrfWlzRW1wdHkoKXtyZXR1cm4hdGhpcy5faGVhZCYmIXRoaXMuX3RhaWx9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5fc2l6ZX1nZXQgZmlyc3QoKXt2YXIgdDtyZXR1cm4odD10aGlzLl9oZWFkKT09bnVsbD92b2lkIDA6dC52YWx1ZX1nZXQgbGFzdCgpe3ZhciB0O3JldHVybih0PXRoaXMuX3RhaWwpPT1udWxsP3ZvaWQgMDp0LnZhbHVlfWhhcyh0KXtyZXR1cm4gdGhpcy5fbWFwLmhhcyh0KX1nZXQodCxuPTApe2NvbnN0IHI9dGhpcy5fbWFwLmdldCh0KTtpZihyKXJldHVybiBuIT09MCYmdGhpcy50b3VjaChyLG4pLHIudmFsdWV9c2V0KHQsbixyPTApe2xldCBpPXRoaXMuX21hcC5nZXQodCk7aWYoaSlpLnZhbHVlPW4sciE9PTAmJnRoaXMudG91Y2goaSxyKTtlbHNle3N3aXRjaChpPXtrZXk6dCx2YWx1ZTpuLG5leHQ6dm9pZCAwLHByZXZpb3VzOnZvaWQgMH0scil7Y2FzZSAwOnRoaXMuYWRkSXRlbUxhc3QoaSk7YnJlYWs7Y2FzZSAxOnRoaXMuYWRkSXRlbUZpcnN0KGkpO2JyZWFrO2Nhc2UgMjp0aGlzLmFkZEl0ZW1MYXN0KGkpO2JyZWFrO2RlZmF1bHQ6dGhpcy5hZGRJdGVtTGFzdChpKTticmVha310aGlzLl9tYXAuc2V0KHQsaSksdGhpcy5fc2l6ZSsrfXJldHVybiB0aGlzfWRlbGV0ZSh0KXtyZXR1cm4hIXRoaXMucmVtb3ZlKHQpfXJlbW92ZSh0KXtjb25zdCBuPXRoaXMuX21hcC5nZXQodCk7aWYobilyZXR1cm4gdGhpcy5fbWFwLmRlbGV0ZSh0KSx0aGlzLnJlbW92ZUl0ZW0obiksdGhpcy5fc2l6ZS0tLG4udmFsdWV9c2hpZnQoKXtpZighdGhpcy5faGVhZCYmIXRoaXMuX3RhaWwpcmV0dXJuO2lmKCF0aGlzLl9oZWFkfHwhdGhpcy5fdGFpbCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbGlzdCIpO2NvbnN0IHQ9dGhpcy5faGVhZDtyZXR1cm4gdGhpcy5fbWFwLmRlbGV0ZSh0LmtleSksdGhpcy5yZW1vdmVJdGVtKHQpLHRoaXMuX3NpemUtLSx0LnZhbHVlfWZvckVhY2godCxuKXtjb25zdCByPXRoaXMuX3N0YXRlO2xldCBpPXRoaXMuX2hlYWQ7Zm9yKDtpOyl7aWYobj90LmJpbmQobikoaS52YWx1ZSxpLmtleSx0aGlzKTp0KGkudmFsdWUsaS5rZXksdGhpcyksdGhpcy5fc3RhdGUhPT1yKXRocm93IG5ldyBFcnJvcigiTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLiIpO2k9aS5uZXh0fX1rZXlzKCl7Y29uc3QgdD10aGlzLG49dGhpcy5fc3RhdGU7bGV0IHI9dGhpcy5faGVhZDtjb25zdCBpPXtbU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBpfSxuZXh0KCl7aWYodC5fc3RhdGUhPT1uKXRocm93IG5ldyBFcnJvcigiTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLiIpO2lmKHIpe2NvbnN0IHM9e3ZhbHVlOnIua2V5LGRvbmU6ITF9O3JldHVybiByPXIubmV4dCxzfWVsc2UgcmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX19O3JldHVybiBpfXZhbHVlcygpe2NvbnN0IHQ9dGhpcyxuPXRoaXMuX3N0YXRlO2xldCByPXRoaXMuX2hlYWQ7Y29uc3QgaT17W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gaX0sbmV4dCgpe2lmKHQuX3N0YXRlIT09bil0aHJvdyBuZXcgRXJyb3IoIkxpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi4iKTtpZihyKXtjb25zdCBzPXt2YWx1ZTpyLnZhbHVlLGRvbmU6ITF9O3JldHVybiByPXIubmV4dCxzfWVsc2UgcmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX19O3JldHVybiBpfWVudHJpZXMoKXtjb25zdCB0PXRoaXMsbj10aGlzLl9zdGF0ZTtsZXQgcj10aGlzLl9oZWFkO2NvbnN0IGk9e1tTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIGl9LG5leHQoKXtpZih0Ll9zdGF0ZSE9PW4pdGhyb3cgbmV3IEVycm9yKCJMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uIik7aWYocil7Y29uc3Qgcz17dmFsdWU6W3Iua2V5LHIudmFsdWVdLGRvbmU6ITF9O3JldHVybiByPXIubmV4dCxzfWVsc2UgcmV0dXJue3ZhbHVlOnZvaWQgMCxkb25lOiEwfX19O3JldHVybiBpfVsoUHM9U3ltYm9sLnRvU3RyaW5nVGFnLFN5bWJvbC5pdGVyYXRvcildKCl7cmV0dXJuIHRoaXMuZW50cmllcygpfXRyaW1PbGQodCl7aWYodD49dGhpcy5zaXplKXJldHVybjtpZih0PT09MCl7dGhpcy5jbGVhcigpO3JldHVybn1sZXQgbj10aGlzLl9oZWFkLHI9dGhpcy5zaXplO2Zvcig7biYmcj50Oyl0aGlzLl9tYXAuZGVsZXRlKG4ua2V5KSxuPW4ubmV4dCxyLS07dGhpcy5faGVhZD1uLHRoaXMuX3NpemU9cixuJiYobi5wcmV2aW91cz12b2lkIDApLHRoaXMuX3N0YXRlKyt9dHJpbU5ldyh0KXtpZih0Pj10aGlzLnNpemUpcmV0dXJuO2lmKHQ9PT0wKXt0aGlzLmNsZWFyKCk7cmV0dXJufWxldCBuPXRoaXMuX3RhaWwscj10aGlzLnNpemU7Zm9yKDtuJiZyPnQ7KXRoaXMuX21hcC5kZWxldGUobi5rZXkpLG49bi5wcmV2aW91cyxyLS07dGhpcy5fdGFpbD1uLHRoaXMuX3NpemU9cixuJiYobi5uZXh0PXZvaWQgMCksdGhpcy5fc3RhdGUrK31hZGRJdGVtRmlyc3QodCl7aWYoIXRoaXMuX2hlYWQmJiF0aGlzLl90YWlsKXRoaXMuX3RhaWw9dDtlbHNlIGlmKHRoaXMuX2hlYWQpdC5uZXh0PXRoaXMuX2hlYWQsdGhpcy5faGVhZC5wcmV2aW91cz10O2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTt0aGlzLl9oZWFkPXQsdGhpcy5fc3RhdGUrK31hZGRJdGVtTGFzdCh0KXtpZighdGhpcy5faGVhZCYmIXRoaXMuX3RhaWwpdGhpcy5faGVhZD10O2Vsc2UgaWYodGhpcy5fdGFpbCl0LnByZXZpb3VzPXRoaXMuX3RhaWwsdGhpcy5fdGFpbC5uZXh0PXQ7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbGlzdCIpO3RoaXMuX3RhaWw9dCx0aGlzLl9zdGF0ZSsrfXJlbW92ZUl0ZW0odCl7aWYodD09PXRoaXMuX2hlYWQmJnQ9PT10aGlzLl90YWlsKXRoaXMuX2hlYWQ9dm9pZCAwLHRoaXMuX3RhaWw9dm9pZCAwO2Vsc2UgaWYodD09PXRoaXMuX2hlYWQpe2lmKCF0Lm5leHQpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTt0Lm5leHQucHJldmlvdXM9dm9pZCAwLHRoaXMuX2hlYWQ9dC5uZXh0fWVsc2UgaWYodD09PXRoaXMuX3RhaWwpe2lmKCF0LnByZXZpb3VzKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7dC5wcmV2aW91cy5uZXh0PXZvaWQgMCx0aGlzLl90YWlsPXQucHJldmlvdXN9ZWxzZXtjb25zdCBuPXQubmV4dCxyPXQucHJldmlvdXM7aWYoIW58fCFyKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7bi5wcmV2aW91cz1yLHIubmV4dD1ufXQubmV4dD12b2lkIDAsdC5wcmV2aW91cz12b2lkIDAsdGhpcy5fc3RhdGUrK310b3VjaCh0LG4pe2lmKCF0aGlzLl9oZWFkfHwhdGhpcy5fdGFpbCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbGlzdCIpO2lmKCEobiE9PTEmJm4hPT0yKSl7aWYobj09PTEpe2lmKHQ9PT10aGlzLl9oZWFkKXJldHVybjtjb25zdCByPXQubmV4dCxpPXQucHJldmlvdXM7dD09PXRoaXMuX3RhaWw/KGkubmV4dD12b2lkIDAsdGhpcy5fdGFpbD1pKTooci5wcmV2aW91cz1pLGkubmV4dD1yKSx0LnByZXZpb3VzPXZvaWQgMCx0Lm5leHQ9dGhpcy5faGVhZCx0aGlzLl9oZWFkLnByZXZpb3VzPXQsdGhpcy5faGVhZD10LHRoaXMuX3N0YXRlKyt9ZWxzZSBpZihuPT09Mil7aWYodD09PXRoaXMuX3RhaWwpcmV0dXJuO2NvbnN0IHI9dC5uZXh0LGk9dC5wcmV2aW91czt0PT09dGhpcy5faGVhZD8oci5wcmV2aW91cz12b2lkIDAsdGhpcy5faGVhZD1yKTooci5wcmV2aW91cz1pLGkubmV4dD1yKSx0Lm5leHQ9dm9pZCAwLHQucHJldmlvdXM9dGhpcy5fdGFpbCx0aGlzLl90YWlsLm5leHQ9dCx0aGlzLl90YWlsPXQsdGhpcy5fc3RhdGUrK319fXRvSlNPTigpe2NvbnN0IHQ9W107cmV0dXJuIHRoaXMuZm9yRWFjaCgobixyKT0+e3QucHVzaChbcixuXSl9KSx0fWZyb21KU09OKHQpe3RoaXMuY2xlYXIoKTtmb3IoY29uc3RbbixyXW9mIHQpdGhpcy5zZXQobixyKX19Y2xhc3Mgd3UgZXh0ZW5kcyB5dXtjb25zdHJ1Y3Rvcih0LG49MSl7c3VwZXIoKSx0aGlzLl9saW1pdD10LHRoaXMuX3JhdGlvPU1hdGgubWluKE1hdGgubWF4KDAsbiksMSl9Z2V0IGxpbWl0KCl7cmV0dXJuIHRoaXMuX2xpbWl0fXNldCBsaW1pdCh0KXt0aGlzLl9saW1pdD10LHRoaXMuY2hlY2tUcmltKCl9Z2V0KHQsbj0yKXtyZXR1cm4gc3VwZXIuZ2V0KHQsbil9cGVlayh0KXtyZXR1cm4gc3VwZXIuZ2V0KHQsMCl9c2V0KHQsbil7cmV0dXJuIHN1cGVyLnNldCh0LG4sMiksdGhpc31jaGVja1RyaW0oKXt0aGlzLnNpemU+dGhpcy5fbGltaXQmJnRoaXMudHJpbShNYXRoLnJvdW5kKHRoaXMuX2xpbWl0KnRoaXMuX3JhdGlvKSl9fWNsYXNzIF91IGV4dGVuZHMgd3V7Y29uc3RydWN0b3IodCxuPTEpe3N1cGVyKHQsbil9dHJpbSh0KXt0aGlzLnRyaW1PbGQodCl9c2V0KHQsbil7cmV0dXJuIHN1cGVyLnNldCh0LG4pLHRoaXMuY2hlY2tUcmltKCksdGhpc319Y2xhc3MgTHV7Y29uc3RydWN0b3IoKXt0aGlzLm1hcD1uZXcgTWFwfWFkZCh0LG4pe2xldCByPXRoaXMubWFwLmdldCh0KTtyfHwocj1uZXcgU2V0LHRoaXMubWFwLnNldCh0LHIpKSxyLmFkZChuKX1kZWxldGUodCxuKXtjb25zdCByPXRoaXMubWFwLmdldCh0KTtyJiYoci5kZWxldGUobiksci5zaXplPT09MCYmdGhpcy5tYXAuZGVsZXRlKHQpKX1mb3JFYWNoKHQsbil7Y29uc3Qgcj10aGlzLm1hcC5nZXQodCk7ciYmci5mb3JFYWNoKG4pfWdldCh0KXtjb25zdCBuPXRoaXMubWFwLmdldCh0KTtyZXR1cm4gbnx8bmV3IFNldH19bmV3IF91KDEwKTtmdW5jdGlvbiBOdShlKXtsZXQgdD1bXTtmb3IoO09iamVjdC5wcm90b3R5cGUhPT1lOyl0PXQuY29uY2F0KE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKGUpKSxlPU9iamVjdC5nZXRQcm90b3R5cGVPZihlKTtyZXR1cm4gdH1mdW5jdGlvbiBJcyhlKXtjb25zdCB0PVtdO2Zvcihjb25zdCBuIG9mIE51KGUpKXR5cGVvZiBlW25dPT0iZnVuY3Rpb24iJiZ0LnB1c2gobik7cmV0dXJuIHR9ZnVuY3Rpb24gU3UoZSx0KXtjb25zdCBuPWk9PmZ1bmN0aW9uKCl7Y29uc3Qgcz1BcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsMCk7cmV0dXJuIHQoaSxzKX0scj17fTtmb3IoY29uc3QgaSBvZiBlKXJbaV09bihpKTtyZXR1cm4gcn12YXIgRnM7KGZ1bmN0aW9uKGUpe2VbZS5MZWZ0PTFdPSJMZWZ0IixlW2UuQ2VudGVyPTJdPSJDZW50ZXIiLGVbZS5SaWdodD00XT0iUmlnaHQiLGVbZS5GdWxsPTddPSJGdWxsIn0pKEZzfHwoRnM9e30pKTt2YXIgVnM7KGZ1bmN0aW9uKGUpe2VbZS5MZWZ0PTFdPSJMZWZ0IixlW2UuQ2VudGVyPTJdPSJDZW50ZXIiLGVbZS5SaWdodD0zXT0iUmlnaHQifSkoVnN8fChWcz17fSkpO3ZhciBEczsoZnVuY3Rpb24oZSl7ZVtlLkJvdGg9MF09IkJvdGgiLGVbZS5SaWdodD0xXT0iUmlnaHQiLGVbZS5MZWZ0PTJdPSJMZWZ0IixlW2UuTm9uZT0zXT0iTm9uZSJ9KShEc3x8KERzPXt9KSk7ZnVuY3Rpb24gQXUoZSx0LG4scixpKXtpZihyPT09MClyZXR1cm4hMDtjb25zdCBzPXQuY2hhckNvZGVBdChyLTEpO2lmKGUuZ2V0KHMpIT09MHx8cz09PTEzfHxzPT09MTApcmV0dXJuITA7aWYoaT4wKXtjb25zdCBhPXQuY2hhckNvZGVBdChyKTtpZihlLmdldChhKSE9PTApcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24ga3UoZSx0LG4scixpKXtpZihyK2k9PT1uKXJldHVybiEwO2NvbnN0IHM9dC5jaGFyQ29kZUF0KHIraSk7aWYoZS5nZXQocykhPT0wfHxzPT09MTN8fHM9PT0xMClyZXR1cm4hMDtpZihpPjApe2NvbnN0IGE9dC5jaGFyQ29kZUF0KHIraS0xKTtpZihlLmdldChhKSE9PTApcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gUnUoZSx0LG4scixpKXtyZXR1cm4gQXUoZSx0LG4scixpKSYma3UoZSx0LG4scixpKX1jbGFzcyBFdXtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuX3dvcmRTZXBhcmF0b3JzPXQsdGhpcy5fc2VhcmNoUmVnZXg9bix0aGlzLl9wcmV2TWF0Y2hTdGFydEluZGV4PS0xLHRoaXMuX3ByZXZNYXRjaExlbmd0aD0wfXJlc2V0KHQpe3RoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleD10LHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXg9LTEsdGhpcy5fcHJldk1hdGNoTGVuZ3RoPTB9bmV4dCh0KXtjb25zdCBuPXQubGVuZ3RoO2xldCByO2Rve2lmKHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXgrdGhpcy5fcHJldk1hdGNoTGVuZ3RoPT09bnx8KHI9dGhpcy5fc2VhcmNoUmVnZXguZXhlYyh0KSwhcikpcmV0dXJuIG51bGw7Y29uc3QgaT1yLmluZGV4LHM9clswXS5sZW5ndGg7aWYoaT09PXRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXgmJnM9PT10aGlzLl9wcmV2TWF0Y2hMZW5ndGgpe2lmKHM9PT0wKXtMbCh0LG4sdGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4KT42NTUzNT90aGlzLl9zZWFyY2hSZWdleC5sYXN0SW5kZXgrPTI6dGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4Kz0xO2NvbnRpbnVlfXJldHVybiBudWxsfWlmKHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXg9aSx0aGlzLl9wcmV2TWF0Y2hMZW5ndGg9cywhdGhpcy5fd29yZFNlcGFyYXRvcnN8fFJ1KHRoaXMuX3dvcmRTZXBhcmF0b3JzLHQsbixpLHMpKXJldHVybiByfXdoaWxlKHIpO3JldHVybiBudWxsfX1mdW5jdGlvbiBNdShlLHQ9IlVucmVhY2hhYmxlIil7dGhyb3cgbmV3IEVycm9yKHQpfWZ1bmN0aW9uIHZuKGUpe2lmKCFlKCkpe2RlYnVnZ2VyO2UoKSxUZShuZXcgYmUoIkFzc2VydGlvbiBGYWlsZWQiKSl9fWZ1bmN0aW9uIE9zKGUsdCl7bGV0IG49MDtmb3IoO248ZS5sZW5ndGgtMTspe2NvbnN0IHI9ZVtuXSxpPWVbbisxXTtpZighdChyLGkpKXJldHVybiExO24rK31yZXR1cm4hMH1jb25zdCBDdT0iYH4hQCMkJV4mKigpLT0rW3tdfVxcfDs6J1wiLC48Pi8/IjtmdW5jdGlvbiBUdShlPSIiKXtsZXQgdD0iKC0/XFxkKlxcLlxcZFxcdyopfChbXiI7Zm9yKGNvbnN0IG4gb2YgQ3UpZS5pbmRleE9mKG4pPj0wfHwodCs9IlxcIituKTtyZXR1cm4gdCs9Ilxcc10rKSIsbmV3IFJlZ0V4cCh0LCJnIil9Y29uc3QgJHM9VHUoKTtmdW5jdGlvbiBVcyhlKXtsZXQgdD0kcztpZihlJiZlIGluc3RhbmNlb2YgUmVnRXhwKWlmKGUuZ2xvYmFsKXQ9ZTtlbHNle2xldCBuPSJnIjtlLmlnbm9yZUNhc2UmJihuKz0iaSIpLGUubXVsdGlsaW5lJiYobis9Im0iKSxlLnVuaWNvZGUmJihuKz0idSIpLHQ9bmV3IFJlZ0V4cChlLnNvdXJjZSxuKX1yZXR1cm4gdC5sYXN0SW5kZXg9MCx0fWNvbnN0IEJzPW5ldyBZbztCcy51bnNoaWZ0KHttYXhMZW46MWUzLHdpbmRvd1NpemU6MTUsdGltZUJ1ZGdldDoxNTB9KTtmdW5jdGlvbiB5cihlLHQsbixyLGkpe2lmKHQ9VXModCksaXx8KGk9YW4uZmlyc3QoQnMpKSxuLmxlbmd0aD5pLm1heExlbil7bGV0IHU9ZS1pLm1heExlbi8yO3JldHVybiB1PDA/dT0wOnIrPXUsbj1uLnN1YnN0cmluZyh1LGUraS5tYXhMZW4vMikseXIoZSx0LG4scixpKX1jb25zdCBzPURhdGUubm93KCksYT1lLTEtcjtsZXQgbD0tMSxvPW51bGw7Zm9yKGxldCB1PTE7IShEYXRlLm5vdygpLXM+PWkudGltZUJ1ZGdldCk7dSsrKXtjb25zdCBoPWEtaS53aW5kb3dTaXplKnU7dC5sYXN0SW5kZXg9TWF0aC5tYXgoMCxoKTtjb25zdCBmPVB1KHQsbixhLGwpO2lmKCFmJiZvfHwobz1mLGg8PTApKWJyZWFrO2w9aH1pZihvKXtjb25zdCB1PXt3b3JkOm9bMF0sc3RhcnRDb2x1bW46cisxK28uaW5kZXgsZW5kQ29sdW1uOnIrMStvLmluZGV4K29bMF0ubGVuZ3RofTtyZXR1cm4gdC5sYXN0SW5kZXg9MCx1fXJldHVybiBudWxsfWZ1bmN0aW9uIFB1KGUsdCxuLHIpe2xldCBpO2Zvcig7aT1lLmV4ZWModCk7KXtjb25zdCBzPWkuaW5kZXh8fDA7aWYoczw9biYmZS5sYXN0SW5kZXg+PW4pcmV0dXJuIGk7aWYocj4wJiZzPnIpcmV0dXJuIG51bGx9cmV0dXJuIG51bGx9Y2xhc3MgSXV7c3RhdGljIGNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0cyh0LG4scil7Y29uc3QgaT1yP3Iuc3RhcnRMaW5lTnVtYmVyOjEscz1yP3IuZW5kTGluZU51bWJlcjp0LmdldExpbmVDb3VudCgpLGE9bmV3IHFzKG4pLGw9YS5nZXRDYW5kaWRhdGVDb2RlUG9pbnRzKCk7bGV0IG87bD09PSJhbGxOb25CYXNpY0FzY2lpIj9vPW5ldyBSZWdFeHAoIlteXFx0XFxuXFxyXFx4MjAtXFx4N0VdIiwiZyIpOm89bmV3IFJlZ0V4cChgJHtGdShBcnJheS5mcm9tKGwpKX1gLCJnIik7Y29uc3QgdT1uZXcgRXUobnVsbCxvKSxoPVtdO2xldCBmPSExLGQsbT0wLGc9MCxwPTA7ZTpmb3IobGV0IHg9aSx3PXM7eDw9dzt4Kyspe2NvbnN0IEw9dC5nZXRMaW5lQ29udGVudCh4KSx2PUwubGVuZ3RoO3UucmVzZXQoMCk7ZG8gaWYoZD11Lm5leHQoTCksZCl7bGV0IHk9ZC5pbmRleCxiPWQuaW5kZXgrZFswXS5sZW5ndGg7aWYoeT4wKXtjb25zdCBGPUwuY2hhckNvZGVBdCh5LTEpO3RyKEYpJiZ5LS19aWYoYisxPHYpe2NvbnN0IEY9TC5jaGFyQ29kZUF0KGItMSk7dHIoRikmJmIrK31jb25zdCBfPUwuc3Vic3RyaW5nKHksYik7bGV0IEE9eXIoeSsxLCRzLEwsMCk7QSYmQS5lbmRDb2x1bW48PXkrMSYmKEE9bnVsbCk7Y29uc3QgQz1hLnNob3VsZEhpZ2hsaWdodE5vbkJhc2ljQVNDSUkoXyxBP0Eud29yZDpudWxsKTtpZihDIT09MCl7aWYoQz09PTM/bSsrOkM9PT0yP2crKzpDPT09MT9wKys6TXUoKSxoLmxlbmd0aD49MWUzKXtmPSEwO2JyZWFrIGV9aC5wdXNoKG5ldyB6KHgseSsxLHgsYisxKSl9fXdoaWxlKGQpfXJldHVybntyYW5nZXM6aCxoYXNNb3JlOmYsYW1iaWd1b3VzQ2hhcmFjdGVyQ291bnQ6bSxpbnZpc2libGVDaGFyYWN0ZXJDb3VudDpnLG5vbkJhc2ljQXNjaWlDaGFyYWN0ZXJDb3VudDpwfX1zdGF0aWMgY29tcHV0ZVVuaWNvZGVIaWdobGlnaHRSZWFzb24odCxuKXtjb25zdCByPW5ldyBxcyhuKTtzd2l0Y2goci5zaG91bGRIaWdobGlnaHROb25CYXNpY0FTQ0lJKHQsbnVsbCkpe2Nhc2UgMDpyZXR1cm4gbnVsbDtjYXNlIDI6cmV0dXJue2tpbmQ6MX07Y2FzZSAzOntjb25zdCBzPXQuY29kZVBvaW50QXQoMCksYT1yLmFtYmlndW91c0NoYXJhY3RlcnMuZ2V0UHJpbWFyeUNvbmZ1c2FibGUocyksbD1CdC5nZXRMb2NhbGVzKCkuZmlsdGVyKG89PiFCdC5nZXRJbnN0YW5jZShuZXcgU2V0KFsuLi5uLmFsbG93ZWRMb2NhbGVzLG9dKSkuaXNBbWJpZ3VvdXMocykpO3JldHVybntraW5kOjAsY29uZnVzYWJsZVdpdGg6U3RyaW5nLmZyb21Db2RlUG9pbnQoYSksbm90QW1iaWd1b3VzSW5Mb2NhbGVzOmx9fWNhc2UgMTpyZXR1cm57a2luZDoyfX19fWZ1bmN0aW9uIEZ1KGUsdCl7cmV0dXJuYFske2JsKGUubWFwKHI9PlN0cmluZy5mcm9tQ29kZVBvaW50KHIpKS5qb2luKCIiKSl9XWB9Y2xhc3MgcXN7Y29uc3RydWN0b3IodCl7dGhpcy5vcHRpb25zPXQsdGhpcy5hbGxvd2VkQ29kZVBvaW50cz1uZXcgU2V0KHQuYWxsb3dlZENvZGVQb2ludHMpLHRoaXMuYW1iaWd1b3VzQ2hhcmFjdGVycz1CdC5nZXRJbnN0YW5jZShuZXcgU2V0KHQuYWxsb3dlZExvY2FsZXMpKX1nZXRDYW5kaWRhdGVDb2RlUG9pbnRzKCl7aWYodGhpcy5vcHRpb25zLm5vbkJhc2ljQVNDSUkpcmV0dXJuImFsbE5vbkJhc2ljQXNjaWkiO2NvbnN0IHQ9bmV3IFNldDtpZih0aGlzLm9wdGlvbnMuaW52aXNpYmxlQ2hhcmFjdGVycylmb3IoY29uc3QgbiBvZiBxdC5jb2RlUG9pbnRzKWpzKFN0cmluZy5mcm9tQ29kZVBvaW50KG4pKXx8dC5hZGQobik7aWYodGhpcy5vcHRpb25zLmFtYmlndW91c0NoYXJhY3RlcnMpZm9yKGNvbnN0IG4gb2YgdGhpcy5hbWJpZ3VvdXNDaGFyYWN0ZXJzLmdldENvbmZ1c2FibGVDb2RlUG9pbnRzKCkpdC5hZGQobik7Zm9yKGNvbnN0IG4gb2YgdGhpcy5hbGxvd2VkQ29kZVBvaW50cyl0LmRlbGV0ZShuKTtyZXR1cm4gdH1zaG91bGRIaWdobGlnaHROb25CYXNpY0FTQ0lJKHQsbil7Y29uc3Qgcj10LmNvZGVQb2ludEF0KDApO2lmKHRoaXMuYWxsb3dlZENvZGVQb2ludHMuaGFzKHIpKXJldHVybiAwO2lmKHRoaXMub3B0aW9ucy5ub25CYXNpY0FTQ0lJKXJldHVybiAxO2xldCBpPSExLHM9ITE7aWYobilmb3IoY29uc3QgYSBvZiBuKXtjb25zdCBsPWEuY29kZVBvaW50QXQoMCksbz1TbChhKTtpPWl8fG8sIW8mJiF0aGlzLmFtYmlndW91c0NoYXJhY3RlcnMuaXNBbWJpZ3VvdXMobCkmJiFxdC5pc0ludmlzaWJsZUNoYXJhY3RlcihsKSYmKHM9ITApfXJldHVybiFpJiZzPzA6dGhpcy5vcHRpb25zLmludmlzaWJsZUNoYXJhY3RlcnMmJiFqcyh0KSYmcXQuaXNJbnZpc2libGVDaGFyYWN0ZXIocik/Mjp0aGlzLm9wdGlvbnMuYW1iaWd1b3VzQ2hhcmFjdGVycyYmdGhpcy5hbWJpZ3VvdXNDaGFyYWN0ZXJzLmlzQW1iaWd1b3VzKHIpPzM6MH19ZnVuY3Rpb24ganMoZSl7cmV0dXJuIGU9PT0iICJ8fGU9PT1gCmB8fGU9PT0iCSJ9Y2xhc3MgeG57Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuY2hhbmdlcz10LHRoaXMubW92ZXM9bix0aGlzLmhpdFRpbWVvdXQ9cn19Y2xhc3MgVnV7Y29uc3RydWN0b3IodCxuKXt0aGlzLmxpbmVSYW5nZU1hcHBpbmc9dCx0aGlzLmNoYW5nZXM9bn19Y2xhc3MgV3tzdGF0aWMgYWRkUmFuZ2UodCxuKXtsZXQgcj0wO2Zvcig7cjxuLmxlbmd0aCYmbltyXS5lbmRFeGNsdXNpdmU8dC5zdGFydDspcisrO2xldCBpPXI7Zm9yKDtpPG4ubGVuZ3RoJiZuW2ldLnN0YXJ0PD10LmVuZEV4Y2x1c2l2ZTspaSsrO2lmKHI9PT1pKW4uc3BsaWNlKHIsMCx0KTtlbHNle2NvbnN0IHM9TWF0aC5taW4odC5zdGFydCxuW3JdLnN0YXJ0KSxhPU1hdGgubWF4KHQuZW5kRXhjbHVzaXZlLG5baS0xXS5lbmRFeGNsdXNpdmUpO24uc3BsaWNlKHIsaS1yLG5ldyBXKHMsYSkpfX1zdGF0aWMgdHJ5Q3JlYXRlKHQsbil7aWYoISh0Pm4pKXJldHVybiBuZXcgVyh0LG4pfXN0YXRpYyBvZkxlbmd0aCh0KXtyZXR1cm4gbmV3IFcoMCx0KX1zdGF0aWMgb2ZTdGFydEFuZExlbmd0aCh0LG4pe3JldHVybiBuZXcgVyh0LHQrbil9Y29uc3RydWN0b3IodCxuKXtpZih0aGlzLnN0YXJ0PXQsdGhpcy5lbmRFeGNsdXNpdmU9bix0Pm4pdGhyb3cgbmV3IGJlKGBJbnZhbGlkIHJhbmdlOiAke3RoaXMudG9TdHJpbmcoKX1gKX1nZXQgaXNFbXB0eSgpe3JldHVybiB0aGlzLnN0YXJ0PT09dGhpcy5lbmRFeGNsdXNpdmV9ZGVsdGEodCl7cmV0dXJuIG5ldyBXKHRoaXMuc3RhcnQrdCx0aGlzLmVuZEV4Y2x1c2l2ZSt0KX1kZWx0YVN0YXJ0KHQpe3JldHVybiBuZXcgVyh0aGlzLnN0YXJ0K3QsdGhpcy5lbmRFeGNsdXNpdmUpfWRlbHRhRW5kKHQpe3JldHVybiBuZXcgVyh0aGlzLnN0YXJ0LHRoaXMuZW5kRXhjbHVzaXZlK3QpfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5lbmRFeGNsdXNpdmUtdGhpcy5zdGFydH10b1N0cmluZygpe3JldHVybmBbJHt0aGlzLnN0YXJ0fSwgJHt0aGlzLmVuZEV4Y2x1c2l2ZX0pYH1jb250YWlucyh0KXtyZXR1cm4gdGhpcy5zdGFydDw9dCYmdDx0aGlzLmVuZEV4Y2x1c2l2ZX1qb2luKHQpe3JldHVybiBuZXcgVyhNYXRoLm1pbih0aGlzLnN0YXJ0LHQuc3RhcnQpLE1hdGgubWF4KHRoaXMuZW5kRXhjbHVzaXZlLHQuZW5kRXhjbHVzaXZlKSl9aW50ZXJzZWN0KHQpe2NvbnN0IG49TWF0aC5tYXgodGhpcy5zdGFydCx0LnN0YXJ0KSxyPU1hdGgubWluKHRoaXMuZW5kRXhjbHVzaXZlLHQuZW5kRXhjbHVzaXZlKTtpZihuPD1yKXJldHVybiBuZXcgVyhuLHIpfWludGVyc2VjdHModCl7Y29uc3Qgbj1NYXRoLm1heCh0aGlzLnN0YXJ0LHQuc3RhcnQpLHI9TWF0aC5taW4odGhpcy5lbmRFeGNsdXNpdmUsdC5lbmRFeGNsdXNpdmUpO3JldHVybiBuPHJ9aXNCZWZvcmUodCl7cmV0dXJuIHRoaXMuZW5kRXhjbHVzaXZlPD10LnN0YXJ0fWlzQWZ0ZXIodCl7cmV0dXJuIHRoaXMuc3RhcnQ+PXQuZW5kRXhjbHVzaXZlfXNsaWNlKHQpe3JldHVybiB0LnNsaWNlKHRoaXMuc3RhcnQsdGhpcy5lbmRFeGNsdXNpdmUpfXN1YnN0cmluZyh0KXtyZXR1cm4gdC5zdWJzdHJpbmcodGhpcy5zdGFydCx0aGlzLmVuZEV4Y2x1c2l2ZSl9Y2xpcCh0KXtpZih0aGlzLmlzRW1wdHkpdGhyb3cgbmV3IGJlKGBJbnZhbGlkIGNsaXBwaW5nIHJhbmdlOiAke3RoaXMudG9TdHJpbmcoKX1gKTtyZXR1cm4gTWF0aC5tYXgodGhpcy5zdGFydCxNYXRoLm1pbih0aGlzLmVuZEV4Y2x1c2l2ZS0xLHQpKX1jbGlwQ3ljbGljKHQpe2lmKHRoaXMuaXNFbXB0eSl0aHJvdyBuZXcgYmUoYEludmFsaWQgY2xpcHBpbmcgcmFuZ2U6ICR7dGhpcy50b1N0cmluZygpfWApO3JldHVybiB0PHRoaXMuc3RhcnQ/dGhpcy5lbmRFeGNsdXNpdmUtKHRoaXMuc3RhcnQtdCkldGhpcy5sZW5ndGg6dD49dGhpcy5lbmRFeGNsdXNpdmU/dGhpcy5zdGFydCsodC10aGlzLnN0YXJ0KSV0aGlzLmxlbmd0aDp0fWZvckVhY2godCl7Zm9yKGxldCBuPXRoaXMuc3RhcnQ7bjx0aGlzLmVuZEV4Y2x1c2l2ZTtuKyspdChuKX19ZnVuY3Rpb24gd3QoZSx0KXtjb25zdCBuPVd0KGUsdCk7cmV0dXJuIG49PT0tMT92b2lkIDA6ZVtuXX1mdW5jdGlvbiBXdChlLHQsbj0wLHI9ZS5sZW5ndGgpe2xldCBpPW4scz1yO2Zvcig7aTxzOyl7Y29uc3QgYT1NYXRoLmZsb29yKChpK3MpLzIpO3QoZVthXSk/aT1hKzE6cz1hfXJldHVybiBpLTF9ZnVuY3Rpb24gRHUoZSx0KXtjb25zdCBuPXdyKGUsdCk7cmV0dXJuIG49PT1lLmxlbmd0aD92b2lkIDA6ZVtuXX1mdW5jdGlvbiB3cihlLHQsbj0wLHI9ZS5sZW5ndGgpe2xldCBpPW4scz1yO2Zvcig7aTxzOyl7Y29uc3QgYT1NYXRoLmZsb29yKChpK3MpLzIpO3QoZVthXSk/cz1hOmk9YSsxfXJldHVybiBpfWNvbnN0ICRuPWNsYXNzICRue2NvbnN0cnVjdG9yKHQpe3RoaXMuX2FycmF5PXQsdGhpcy5fZmluZExhc3RNb25vdG9ub3VzTGFzdElkeD0wfWZpbmRMYXN0TW9ub3Rvbm91cyh0KXtpZigkbi5hc3NlcnRJbnZhcmlhbnRzKXtpZih0aGlzLl9wcmV2RmluZExhc3RQcmVkaWNhdGUpe2Zvcihjb25zdCByIG9mIHRoaXMuX2FycmF5KWlmKHRoaXMuX3ByZXZGaW5kTGFzdFByZWRpY2F0ZShyKSYmIXQocikpdGhyb3cgbmV3IEVycm9yKCJNb25vdG9ub3VzQXJyYXk6IGN1cnJlbnQgcHJlZGljYXRlIG11c3QgYmUgd2Vha2VyIHRoYW4gKG9yIGVxdWFsIHRvKSB0aGUgcHJldmlvdXMgcHJlZGljYXRlLiIpfXRoaXMuX3ByZXZGaW5kTGFzdFByZWRpY2F0ZT10fWNvbnN0IG49V3QodGhpcy5fYXJyYXksdCx0aGlzLl9maW5kTGFzdE1vbm90b25vdXNMYXN0SWR4KTtyZXR1cm4gdGhpcy5fZmluZExhc3RNb25vdG9ub3VzTGFzdElkeD1uKzEsbj09PS0xP3ZvaWQgMDp0aGlzLl9hcnJheVtuXX19OyRuLmFzc2VydEludmFyaWFudHM9ITE7bGV0IHluPSRuO2NsYXNzIFV7c3RhdGljIGZyb21SYW5nZUluY2x1c2l2ZSh0KXtyZXR1cm4gbmV3IFUodC5zdGFydExpbmVOdW1iZXIsdC5lbmRMaW5lTnVtYmVyKzEpfXN0YXRpYyBqb2luTWFueSh0KXtpZih0Lmxlbmd0aD09PTApcmV0dXJuW107bGV0IG49bmV3IEZlKHRbMF0uc2xpY2UoKSk7Zm9yKGxldCByPTE7cjx0Lmxlbmd0aDtyKyspbj1uLmdldFVuaW9uKG5ldyBGZSh0W3JdLnNsaWNlKCkpKTtyZXR1cm4gbi5yYW5nZXN9c3RhdGljIGpvaW4odCl7aWYodC5sZW5ndGg9PT0wKXRocm93IG5ldyBiZSgibGluZVJhbmdlcyBjYW5ub3QgYmUgZW1wdHkiKTtsZXQgbj10WzBdLnN0YXJ0TGluZU51bWJlcixyPXRbMF0uZW5kTGluZU51bWJlckV4Y2x1c2l2ZTtmb3IobGV0IGk9MTtpPHQubGVuZ3RoO2krKyluPU1hdGgubWluKG4sdFtpXS5zdGFydExpbmVOdW1iZXIpLHI9TWF0aC5tYXgocix0W2ldLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpO3JldHVybiBuZXcgVShuLHIpfXN0YXRpYyBvZkxlbmd0aCh0LG4pe3JldHVybiBuZXcgVSh0LHQrbil9c3RhdGljIGRlc2VyaWFsaXplKHQpe3JldHVybiBuZXcgVSh0WzBdLHRbMV0pfWNvbnN0cnVjdG9yKHQsbil7aWYodD5uKXRocm93IG5ldyBiZShgc3RhcnRMaW5lTnVtYmVyICR7dH0gY2Fubm90IGJlIGFmdGVyIGVuZExpbmVOdW1iZXJFeGNsdXNpdmUgJHtufWApO3RoaXMuc3RhcnRMaW5lTnVtYmVyPXQsdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPW59Y29udGFpbnModCl7cmV0dXJuIHRoaXMuc3RhcnRMaW5lTnVtYmVyPD10JiZ0PHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1nZXQgaXNFbXB0eSgpe3JldHVybiB0aGlzLnN0YXJ0TGluZU51bWJlcj09PXRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1kZWx0YSh0KXtyZXR1cm4gbmV3IFUodGhpcy5zdGFydExpbmVOdW1iZXIrdCx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUrdCl9ZGVsdGFMZW5ndGgodCl7cmV0dXJuIG5ldyBVKHRoaXMuc3RhcnRMaW5lTnVtYmVyLHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSt0KX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS10aGlzLnN0YXJ0TGluZU51bWJlcn1qb2luKHQpe3JldHVybiBuZXcgVShNYXRoLm1pbih0aGlzLnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0TGluZU51bWJlciksTWF0aC5tYXgodGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkpfXRvU3RyaW5nKCl7cmV0dXJuYFske3RoaXMuc3RhcnRMaW5lTnVtYmVyfSwke3RoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX0pYH1pbnRlcnNlY3QodCl7Y29uc3Qgbj1NYXRoLm1heCh0aGlzLnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0TGluZU51bWJlcikscj1NYXRoLm1pbih0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsdC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKTtpZihuPD1yKXJldHVybiBuZXcgVShuLHIpfWludGVyc2VjdHNTdHJpY3QodCl7cmV0dXJuIHRoaXMuc3RhcnRMaW5lTnVtYmVyPHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSYmdC5zdGFydExpbmVOdW1iZXI8dGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlfW92ZXJsYXBPclRvdWNoKHQpe3JldHVybiB0aGlzLnN0YXJ0TGluZU51bWJlcjw9dC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlJiZ0LnN0YXJ0TGluZU51bWJlcjw9dGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlfWVxdWFscyh0KXtyZXR1cm4gdGhpcy5zdGFydExpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPT09dC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlfXRvSW5jbHVzaXZlUmFuZ2UoKXtyZXR1cm4gdGhpcy5pc0VtcHR5P251bGw6bmV3IHoodGhpcy5zdGFydExpbmVOdW1iZXIsMSx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUil9dG9FeGNsdXNpdmVSYW5nZSgpe3JldHVybiBuZXcgeih0aGlzLnN0YXJ0TGluZU51bWJlciwxLHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSwxKX1tYXBUb0xpbmVBcnJheSh0KXtjb25zdCBuPVtdO2ZvcihsZXQgcj10aGlzLnN0YXJ0TGluZU51bWJlcjtyPHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTtyKyspbi5wdXNoKHQocikpO3JldHVybiBufWZvckVhY2godCl7Zm9yKGxldCBuPXRoaXMuc3RhcnRMaW5lTnVtYmVyO248dGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlO24rKyl0KG4pfXNlcmlhbGl6ZSgpe3JldHVyblt0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmVdfWluY2x1ZGVzKHQpe3JldHVybiB0aGlzLnN0YXJ0TGluZU51bWJlcjw9dCYmdDx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmV9dG9PZmZzZXRSYW5nZSgpe3JldHVybiBuZXcgVyh0aGlzLnN0YXJ0TGluZU51bWJlci0xLHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xKX19Y2xhc3MgRmV7Y29uc3RydWN0b3IodD1bXSl7dGhpcy5fbm9ybWFsaXplZFJhbmdlcz10fWdldCByYW5nZXMoKXtyZXR1cm4gdGhpcy5fbm9ybWFsaXplZFJhbmdlc31hZGRSYW5nZSh0KXtpZih0Lmxlbmd0aD09PTApcmV0dXJuO2NvbnN0IG49d3IodGhpcy5fbm9ybWFsaXplZFJhbmdlcyxpPT5pLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU+PXQuc3RhcnRMaW5lTnVtYmVyKSxyPVd0KHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMsaT0+aS5zdGFydExpbmVOdW1iZXI8PXQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkrMTtpZihuPT09cil0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLnNwbGljZShuLDAsdCk7ZWxzZSBpZihuPT09ci0xKXtjb25zdCBpPXRoaXMuX25vcm1hbGl6ZWRSYW5nZXNbbl07dGhpcy5fbm9ybWFsaXplZFJhbmdlc1tuXT1pLmpvaW4odCl9ZWxzZXtjb25zdCBpPXRoaXMuX25vcm1hbGl6ZWRSYW5nZXNbbl0uam9pbih0aGlzLl9ub3JtYWxpemVkUmFuZ2VzW3ItMV0pLmpvaW4odCk7dGhpcy5fbm9ybWFsaXplZFJhbmdlcy5zcGxpY2UobixyLW4saSl9fWNvbnRhaW5zKHQpe2NvbnN0IG49d3QodGhpcy5fbm9ybWFsaXplZFJhbmdlcyxyPT5yLnN0YXJ0TGluZU51bWJlcjw9dCk7cmV0dXJuISFuJiZuLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU+dH1pbnRlcnNlY3RzKHQpe2NvbnN0IG49d3QodGhpcy5fbm9ybWFsaXplZFJhbmdlcyxyPT5yLnN0YXJ0TGluZU51bWJlcjx0LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpO3JldHVybiEhbiYmbi5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPnQuc3RhcnRMaW5lTnVtYmVyfWdldFVuaW9uKHQpe2lmKHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoPT09MClyZXR1cm4gdDtpZih0Ll9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aD09PTApcmV0dXJuIHRoaXM7Y29uc3Qgbj1bXTtsZXQgcj0wLGk9MCxzPW51bGw7Zm9yKDtyPHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RofHxpPHQuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoOyl7bGV0IGE9bnVsbDtpZihyPHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoJiZpPHQuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoKXtjb25zdCBsPXRoaXMuX25vcm1hbGl6ZWRSYW5nZXNbcl0sbz10Ll9ub3JtYWxpemVkUmFuZ2VzW2ldO2wuc3RhcnRMaW5lTnVtYmVyPG8uc3RhcnRMaW5lTnVtYmVyPyhhPWwscisrKTooYT1vLGkrKyl9ZWxzZSByPHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoPyhhPXRoaXMuX25vcm1hbGl6ZWRSYW5nZXNbcl0scisrKTooYT10Ll9ub3JtYWxpemVkUmFuZ2VzW2ldLGkrKyk7cz09PW51bGw/cz1hOnMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT49YS5zdGFydExpbmVOdW1iZXI/cz1uZXcgVShzLnN0YXJ0TGluZU51bWJlcixNYXRoLm1heChzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsYS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKSk6KG4ucHVzaChzKSxzPWEpfXJldHVybiBzIT09bnVsbCYmbi5wdXNoKHMpLG5ldyBGZShuKX1zdWJ0cmFjdEZyb20odCl7Y29uc3Qgbj13cih0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLGE9PmEuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT49dC5zdGFydExpbmVOdW1iZXIpLHI9V3QodGhpcy5fbm9ybWFsaXplZFJhbmdlcyxhPT5hLnN0YXJ0TGluZU51bWJlcjw9dC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKSsxO2lmKG49PT1yKXJldHVybiBuZXcgRmUoW3RdKTtjb25zdCBpPVtdO2xldCBzPXQuc3RhcnRMaW5lTnVtYmVyO2ZvcihsZXQgYT1uO2E8cjthKyspe2NvbnN0IGw9dGhpcy5fbm9ybWFsaXplZFJhbmdlc1thXTtsLnN0YXJ0TGluZU51bWJlcj5zJiZpLnB1c2gobmV3IFUocyxsLnN0YXJ0TGluZU51bWJlcikpLHM9bC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlfXJldHVybiBzPHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSYmaS5wdXNoKG5ldyBVKHMsdC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKSksbmV3IEZlKGkpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMubWFwKHQ9PnQudG9TdHJpbmcoKSkuam9pbigiLCAiKX1nZXRJbnRlcnNlY3Rpb24odCl7Y29uc3Qgbj1bXTtsZXQgcj0wLGk9MDtmb3IoO3I8dGhpcy5fbm9ybWFsaXplZFJhbmdlcy5sZW5ndGgmJmk8dC5fbm9ybWFsaXplZFJhbmdlcy5sZW5ndGg7KXtjb25zdCBzPXRoaXMuX25vcm1hbGl6ZWRSYW5nZXNbcl0sYT10Ll9ub3JtYWxpemVkUmFuZ2VzW2ldLGw9cy5pbnRlcnNlY3QoYSk7bCYmIWwuaXNFbXB0eSYmbi5wdXNoKGwpLHMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTxhLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU/cisrOmkrK31yZXR1cm4gbmV3IEZlKG4pfWdldFdpdGhEZWx0YSh0KXtyZXR1cm4gbmV3IEZlKHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMubWFwKG49Pm4uZGVsdGEodCkpKX19Y29uc3QgcnQ9Y2xhc3MgcnR7c3RhdGljIGJldHdlZW5Qb3NpdGlvbnModCxuKXtyZXR1cm4gdC5saW5lTnVtYmVyPT09bi5saW5lTnVtYmVyP25ldyBydCgwLG4uY29sdW1uLXQuY29sdW1uKTpuZXcgcnQobi5saW5lTnVtYmVyLXQubGluZU51bWJlcixuLmNvbHVtbi0xKX1zdGF0aWMgb2ZSYW5nZSh0KXtyZXR1cm4gcnQuYmV0d2VlblBvc2l0aW9ucyh0LmdldFN0YXJ0UG9zaXRpb24oKSx0LmdldEVuZFBvc2l0aW9uKCkpfXN0YXRpYyBvZlRleHQodCl7bGV0IG49MCxyPTA7Zm9yKGNvbnN0IGkgb2YgdClpPT09YApgPyhuKysscj0wKTpyKys7cmV0dXJuIG5ldyBydChuLHIpfWNvbnN0cnVjdG9yKHQsbil7dGhpcy5saW5lQ291bnQ9dCx0aGlzLmNvbHVtbkNvdW50PW59aXNHcmVhdGVyVGhhbk9yRXF1YWxUbyh0KXtyZXR1cm4gdGhpcy5saW5lQ291bnQhPT10LmxpbmVDb3VudD90aGlzLmxpbmVDb3VudD50LmxpbmVDb3VudDp0aGlzLmNvbHVtbkNvdW50Pj10LmNvbHVtbkNvdW50fWNyZWF0ZVJhbmdlKHQpe3JldHVybiB0aGlzLmxpbmVDb3VudD09PTA/bmV3IHoodC5saW5lTnVtYmVyLHQuY29sdW1uLHQubGluZU51bWJlcix0LmNvbHVtbit0aGlzLmNvbHVtbkNvdW50KTpuZXcgeih0LmxpbmVOdW1iZXIsdC5jb2x1bW4sdC5saW5lTnVtYmVyK3RoaXMubGluZUNvdW50LHRoaXMuY29sdW1uQ291bnQrMSl9YWRkVG9Qb3NpdGlvbih0KXtyZXR1cm4gdGhpcy5saW5lQ291bnQ9PT0wP25ldyBlZSh0LmxpbmVOdW1iZXIsdC5jb2x1bW4rdGhpcy5jb2x1bW5Db3VudCk6bmV3IGVlKHQubGluZU51bWJlcit0aGlzLmxpbmVDb3VudCx0aGlzLmNvbHVtbkNvdW50KzEpfXRvU3RyaW5nKCl7cmV0dXJuYCR7dGhpcy5saW5lQ291bnR9LCR7dGhpcy5jb2x1bW5Db3VudH1gfX07cnQuemVybz1uZXcgcnQoMCwwKTtsZXQgV3M9cnQ7Y2xhc3MgT3V7Y29uc3RydWN0b3IodCxuKXt0aGlzLnJhbmdlPXQsdGhpcy50ZXh0PW59dG9TaW5nbGVFZGl0T3BlcmF0aW9uKCl7cmV0dXJue3JhbmdlOnRoaXMucmFuZ2UsdGV4dDp0aGlzLnRleHR9fX1jbGFzcyBMZXtzdGF0aWMgaW52ZXJzZSh0LG4scil7Y29uc3QgaT1bXTtsZXQgcz0xLGE9MTtmb3IoY29uc3QgbyBvZiB0KXtjb25zdCB1PW5ldyBMZShuZXcgVShzLG8ub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyKSxuZXcgVShhLG8ubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyKSk7dS5tb2RpZmllZC5pc0VtcHR5fHxpLnB1c2godSkscz1vLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsYT1vLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmV9Y29uc3QgbD1uZXcgTGUobmV3IFUocyxuKzEpLG5ldyBVKGEscisxKSk7cmV0dXJuIGwubW9kaWZpZWQuaXNFbXB0eXx8aS5wdXNoKGwpLGl9c3RhdGljIGNsaXAodCxuLHIpe2NvbnN0IGk9W107Zm9yKGNvbnN0IHMgb2YgdCl7Y29uc3QgYT1zLm9yaWdpbmFsLmludGVyc2VjdChuKSxsPXMubW9kaWZpZWQuaW50ZXJzZWN0KHIpO2EmJiFhLmlzRW1wdHkmJmwmJiFsLmlzRW1wdHkmJmkucHVzaChuZXcgTGUoYSxsKSl9cmV0dXJuIGl9Y29uc3RydWN0b3IodCxuKXt0aGlzLm9yaWdpbmFsPXQsdGhpcy5tb2RpZmllZD1ufXRvU3RyaW5nKCl7cmV0dXJuYHske3RoaXMub3JpZ2luYWwudG9TdHJpbmcoKX0tPiR7dGhpcy5tb2RpZmllZC50b1N0cmluZygpfX1gfWZsaXAoKXtyZXR1cm4gbmV3IExlKHRoaXMubW9kaWZpZWQsdGhpcy5vcmlnaW5hbCl9am9pbih0KXtyZXR1cm4gbmV3IExlKHRoaXMub3JpZ2luYWwuam9pbih0Lm9yaWdpbmFsKSx0aGlzLm1vZGlmaWVkLmpvaW4odC5tb2RpZmllZCkpfXRvUmFuZ2VNYXBwaW5nKCl7Y29uc3QgdD10aGlzLm9yaWdpbmFsLnRvSW5jbHVzaXZlUmFuZ2UoKSxuPXRoaXMubW9kaWZpZWQudG9JbmNsdXNpdmVSYW5nZSgpO2lmKHQmJm4pcmV0dXJuIG5ldyBSZSh0LG4pO2lmKHRoaXMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyPT09MXx8dGhpcy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXI9PT0xKXtpZighKHRoaXMubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyPT09MSYmdGhpcy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXI9PT0xKSl0aHJvdyBuZXcgYmUoIm5vdCBhIHZhbGlkIGRpZmYiKTtyZXR1cm4gbmV3IFJlKG5ldyB6KHRoaXMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLDEsdGhpcy5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLDEpLG5ldyB6KHRoaXMubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLDEsdGhpcy5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLDEpKX1lbHNlIHJldHVybiBuZXcgUmUobmV3IHoodGhpcy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUix0aGlzLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksbmV3IHoodGhpcy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUix0aGlzLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUikpfXRvUmFuZ2VNYXBwaW5nMih0LG4pe2lmKEhzKHRoaXMub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSx0KSYmSHModGhpcy5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLG4pKXJldHVybiBuZXcgUmUobmV3IHoodGhpcy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIsMSx0aGlzLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsMSksbmV3IHoodGhpcy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIsMSx0aGlzLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsMSkpO2lmKCF0aGlzLm9yaWdpbmFsLmlzRW1wdHkmJiF0aGlzLm1vZGlmaWVkLmlzRW1wdHkpcmV0dXJuIG5ldyBSZSh6LmZyb21Qb3NpdGlvbnMobmV3IGVlKHRoaXMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLDEpLF90KG5ldyBlZSh0aGlzLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksdCkpLHouZnJvbVBvc2l0aW9ucyhuZXcgZWUodGhpcy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIsMSksX3QobmV3IGVlKHRoaXMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSxuKSkpO2lmKHRoaXMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyPjEmJnRoaXMubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyPjEpcmV0dXJuIG5ldyBSZSh6LmZyb21Qb3NpdGlvbnMoX3QobmV3IGVlKHRoaXMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLTEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLHQpLF90KG5ldyBlZSh0aGlzLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksdCkpLHouZnJvbVBvc2l0aW9ucyhfdChuZXcgZWUodGhpcy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItMSxOdW1iZXIuTUFYX1NBRkVfSU5URUdFUiksbiksX3QobmV3IGVlKHRoaXMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSxuKSkpO3Rocm93IG5ldyBiZX19ZnVuY3Rpb24gX3QoZSx0KXtpZihlLmxpbmVOdW1iZXI8MSlyZXR1cm4gbmV3IGVlKDEsMSk7aWYoZS5saW5lTnVtYmVyPnQubGVuZ3RoKXJldHVybiBuZXcgZWUodC5sZW5ndGgsdFt0Lmxlbmd0aC0xXS5sZW5ndGgrMSk7Y29uc3Qgbj10W2UubGluZU51bWJlci0xXTtyZXR1cm4gZS5jb2x1bW4+bi5sZW5ndGgrMT9uZXcgZWUoZS5saW5lTnVtYmVyLG4ubGVuZ3RoKzEpOmV9ZnVuY3Rpb24gSHMoZSx0KXtyZXR1cm4gZT49MSYmZTw9dC5sZW5ndGh9Y2xhc3MgamUgZXh0ZW5kcyBMZXtzdGF0aWMgZnJvbVJhbmdlTWFwcGluZ3ModCl7Y29uc3Qgbj1VLmpvaW4odC5tYXAoaT0+VS5mcm9tUmFuZ2VJbmNsdXNpdmUoaS5vcmlnaW5hbFJhbmdlKSkpLHI9VS5qb2luKHQubWFwKGk9PlUuZnJvbVJhbmdlSW5jbHVzaXZlKGkubW9kaWZpZWRSYW5nZSkpKTtyZXR1cm4gbmV3IGplKG4scix0KX1jb25zdHJ1Y3Rvcih0LG4scil7c3VwZXIodCxuKSx0aGlzLmlubmVyQ2hhbmdlcz1yfWZsaXAoKXt2YXIgdDtyZXR1cm4gbmV3IGplKHRoaXMubW9kaWZpZWQsdGhpcy5vcmlnaW5hbCwodD10aGlzLmlubmVyQ2hhbmdlcyk9PW51bGw/dm9pZCAwOnQubWFwKG49Pm4uZmxpcCgpKSl9d2l0aElubmVyQ2hhbmdlc0Zyb21MaW5lUmFuZ2VzKCl7cmV0dXJuIG5ldyBqZSh0aGlzLm9yaWdpbmFsLHRoaXMubW9kaWZpZWQsW3RoaXMudG9SYW5nZU1hcHBpbmcoKV0pfX1jbGFzcyBSZXtzdGF0aWMgYXNzZXJ0U29ydGVkKHQpe2ZvcihsZXQgbj0xO248dC5sZW5ndGg7bisrKXtjb25zdCByPXRbbi0xXSxpPXRbbl07aWYoIShyLm9yaWdpbmFsUmFuZ2UuZ2V0RW5kUG9zaXRpb24oKS5pc0JlZm9yZU9yRXF1YWwoaS5vcmlnaW5hbFJhbmdlLmdldFN0YXJ0UG9zaXRpb24oKSkmJnIubW9kaWZpZWRSYW5nZS5nZXRFbmRQb3NpdGlvbigpLmlzQmVmb3JlT3JFcXVhbChpLm1vZGlmaWVkUmFuZ2UuZ2V0U3RhcnRQb3NpdGlvbigpKSkpdGhyb3cgbmV3IGJlKCJSYW5nZSBtYXBwaW5ncyBtdXN0IGJlIHNvcnRlZCIpfX1jb25zdHJ1Y3Rvcih0LG4pe3RoaXMub3JpZ2luYWxSYW5nZT10LHRoaXMubW9kaWZpZWRSYW5nZT1ufXRvU3RyaW5nKCl7cmV0dXJuYHske3RoaXMub3JpZ2luYWxSYW5nZS50b1N0cmluZygpfS0+JHt0aGlzLm1vZGlmaWVkUmFuZ2UudG9TdHJpbmcoKX19YH1mbGlwKCl7cmV0dXJuIG5ldyBSZSh0aGlzLm1vZGlmaWVkUmFuZ2UsdGhpcy5vcmlnaW5hbFJhbmdlKX10b1RleHRFZGl0KHQpe2NvbnN0IG49dC5nZXRWYWx1ZU9mUmFuZ2UodGhpcy5tb2RpZmllZFJhbmdlKTtyZXR1cm4gbmV3IE91KHRoaXMub3JpZ2luYWxSYW5nZSxuKX19Y29uc3QgJHU9MztjbGFzcyBVdXtjb21wdXRlRGlmZih0LG4scil7dmFyIG87Y29uc3Qgcz1uZXcganUodCxuLHttYXhDb21wdXRhdGlvblRpbWU6ci5tYXhDb21wdXRhdGlvblRpbWVNcyxzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZTpyLmlnbm9yZVRyaW1XaGl0ZXNwYWNlLHNob3VsZENvbXB1dGVDaGFyQ2hhbmdlczohMCxzaG91bGRNYWtlUHJldHR5RGlmZjohMCxzaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzOiEwfSkuY29tcHV0ZURpZmYoKSxhPVtdO2xldCBsPW51bGw7Zm9yKGNvbnN0IHUgb2Ygcy5jaGFuZ2VzKXtsZXQgaDt1Lm9yaWdpbmFsRW5kTGluZU51bWJlcj09PTA/aD1uZXcgVSh1Lm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyKzEsdS5vcmlnaW5hbFN0YXJ0TGluZU51bWJlcisxKTpoPW5ldyBVKHUub3JpZ2luYWxTdGFydExpbmVOdW1iZXIsdS5vcmlnaW5hbEVuZExpbmVOdW1iZXIrMSk7bGV0IGY7dS5tb2RpZmllZEVuZExpbmVOdW1iZXI9PT0wP2Y9bmV3IFUodS5tb2RpZmllZFN0YXJ0TGluZU51bWJlcisxLHUubW9kaWZpZWRTdGFydExpbmVOdW1iZXIrMSk6Zj1uZXcgVSh1Lm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyLHUubW9kaWZpZWRFbmRMaW5lTnVtYmVyKzEpO2xldCBkPW5ldyBqZShoLGYsKG89dS5jaGFyQ2hhbmdlcyk9PW51bGw/dm9pZCAwOm8ubWFwKG09Pm5ldyBSZShuZXcgeihtLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyLG0ub3JpZ2luYWxTdGFydENvbHVtbixtLm9yaWdpbmFsRW5kTGluZU51bWJlcixtLm9yaWdpbmFsRW5kQ29sdW1uKSxuZXcgeihtLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyLG0ubW9kaWZpZWRTdGFydENvbHVtbixtLm1vZGlmaWVkRW5kTGluZU51bWJlcixtLm1vZGlmaWVkRW5kQ29sdW1uKSkpKTtsJiYobC5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPT09ZC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXJ8fGwub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT09PWQub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyKSYmKGQ9bmV3IGplKGwub3JpZ2luYWwuam9pbihkLm9yaWdpbmFsKSxsLm1vZGlmaWVkLmpvaW4oZC5tb2RpZmllZCksbC5pbm5lckNoYW5nZXMmJmQuaW5uZXJDaGFuZ2VzP2wuaW5uZXJDaGFuZ2VzLmNvbmNhdChkLmlubmVyQ2hhbmdlcyk6dm9pZCAwKSxhLnBvcCgpKSxhLnB1c2goZCksbD1kfXJldHVybiB2bigoKT0+T3MoYSwodSxoKT0+aC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItdS5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPT09aC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItdS5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlJiZ1Lm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU8aC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXImJnUubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTxoLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcikpLG5ldyB4bihhLFtdLHMucXVpdEVhcmx5KX19ZnVuY3Rpb24genMoZSx0LG4scil7cmV0dXJuIG5ldyBaZShlLHQsbikuQ29tcHV0ZURpZmYocil9bGV0IEdzPWNsYXNze2NvbnN0cnVjdG9yKHQpe2NvbnN0IG49W10scj1bXTtmb3IobGV0IGk9MCxzPXQubGVuZ3RoO2k8cztpKyspbltpXT1fcih0W2ldLDEpLHJbaV09THIodFtpXSwxKTt0aGlzLmxpbmVzPXQsdGhpcy5fc3RhcnRDb2x1bW5zPW4sdGhpcy5fZW5kQ29sdW1ucz1yfWdldEVsZW1lbnRzKCl7Y29uc3QgdD1bXTtmb3IobGV0IG49MCxyPXRoaXMubGluZXMubGVuZ3RoO248cjtuKyspdFtuXT10aGlzLmxpbmVzW25dLnN1YnN0cmluZyh0aGlzLl9zdGFydENvbHVtbnNbbl0tMSx0aGlzLl9lbmRDb2x1bW5zW25dLTEpO3JldHVybiB0fWdldFN0cmljdEVsZW1lbnQodCl7cmV0dXJuIHRoaXMubGluZXNbdF19Z2V0U3RhcnRMaW5lTnVtYmVyKHQpe3JldHVybiB0KzF9Z2V0RW5kTGluZU51bWJlcih0KXtyZXR1cm4gdCsxfWNyZWF0ZUNoYXJTZXF1ZW5jZSh0LG4scil7Y29uc3QgaT1bXSxzPVtdLGE9W107bGV0IGw9MDtmb3IobGV0IG89bjtvPD1yO28rKyl7Y29uc3QgdT10aGlzLmxpbmVzW29dLGg9dD90aGlzLl9zdGFydENvbHVtbnNbb106MSxmPXQ/dGhpcy5fZW5kQ29sdW1uc1tvXTp1Lmxlbmd0aCsxO2ZvcihsZXQgZD1oO2Q8ZjtkKyspaVtsXT11LmNoYXJDb2RlQXQoZC0xKSxzW2xdPW8rMSxhW2xdPWQsbCsrOyF0JiZvPHImJihpW2xdPTEwLHNbbF09bysxLGFbbF09dS5sZW5ndGgrMSxsKyspfXJldHVybiBuZXcgQnUoaSxzLGEpfX07Y2xhc3MgQnV7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuX2NoYXJDb2Rlcz10LHRoaXMuX2xpbmVOdW1iZXJzPW4sdGhpcy5fY29sdW1ucz1yfXRvU3RyaW5nKCl7cmV0dXJuIlsiK3RoaXMuX2NoYXJDb2Rlcy5tYXAoKHQsbik9Pih0PT09MTA/IlxcbiI6U3RyaW5nLmZyb21DaGFyQ29kZSh0KSkrYC0oJHt0aGlzLl9saW5lTnVtYmVyc1tuXX0sJHt0aGlzLl9jb2x1bW5zW25dfSlgKS5qb2luKCIsICIpKyJdIn1fYXNzZXJ0SW5kZXgodCxuKXtpZih0PDB8fHQ+PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSWxsZWdhbCBpbmRleCIpfWdldEVsZW1lbnRzKCl7cmV0dXJuIHRoaXMuX2NoYXJDb2Rlc31nZXRTdGFydExpbmVOdW1iZXIodCl7cmV0dXJuIHQ+MCYmdD09PXRoaXMuX2xpbmVOdW1iZXJzLmxlbmd0aD90aGlzLmdldEVuZExpbmVOdW1iZXIodC0xKToodGhpcy5fYXNzZXJ0SW5kZXgodCx0aGlzLl9saW5lTnVtYmVycyksdGhpcy5fbGluZU51bWJlcnNbdF0pfWdldEVuZExpbmVOdW1iZXIodCl7cmV0dXJuIHQ9PT0tMT90aGlzLmdldFN0YXJ0TGluZU51bWJlcih0KzEpOih0aGlzLl9hc3NlcnRJbmRleCh0LHRoaXMuX2xpbmVOdW1iZXJzKSx0aGlzLl9jaGFyQ29kZXNbdF09PT0xMD90aGlzLl9saW5lTnVtYmVyc1t0XSsxOnRoaXMuX2xpbmVOdW1iZXJzW3RdKX1nZXRTdGFydENvbHVtbih0KXtyZXR1cm4gdD4wJiZ0PT09dGhpcy5fY29sdW1ucy5sZW5ndGg/dGhpcy5nZXRFbmRDb2x1bW4odC0xKToodGhpcy5fYXNzZXJ0SW5kZXgodCx0aGlzLl9jb2x1bW5zKSx0aGlzLl9jb2x1bW5zW3RdKX1nZXRFbmRDb2x1bW4odCl7cmV0dXJuIHQ9PT0tMT90aGlzLmdldFN0YXJ0Q29sdW1uKHQrMSk6KHRoaXMuX2Fzc2VydEluZGV4KHQsdGhpcy5fY29sdW1ucyksdGhpcy5fY2hhckNvZGVzW3RdPT09MTA/MTp0aGlzLl9jb2x1bW5zW3RdKzEpfX1jbGFzcyBMdHtjb25zdHJ1Y3Rvcih0LG4scixpLHMsYSxsLG8pe3RoaXMub3JpZ2luYWxTdGFydExpbmVOdW1iZXI9dCx0aGlzLm9yaWdpbmFsU3RhcnRDb2x1bW49bix0aGlzLm9yaWdpbmFsRW5kTGluZU51bWJlcj1yLHRoaXMub3JpZ2luYWxFbmRDb2x1bW49aSx0aGlzLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyPXMsdGhpcy5tb2RpZmllZFN0YXJ0Q29sdW1uPWEsdGhpcy5tb2RpZmllZEVuZExpbmVOdW1iZXI9bCx0aGlzLm1vZGlmaWVkRW5kQ29sdW1uPW99c3RhdGljIGNyZWF0ZUZyb21EaWZmQ2hhbmdlKHQsbixyKXtjb25zdCBpPW4uZ2V0U3RhcnRMaW5lTnVtYmVyKHQub3JpZ2luYWxTdGFydCkscz1uLmdldFN0YXJ0Q29sdW1uKHQub3JpZ2luYWxTdGFydCksYT1uLmdldEVuZExpbmVOdW1iZXIodC5vcmlnaW5hbFN0YXJ0K3Qub3JpZ2luYWxMZW5ndGgtMSksbD1uLmdldEVuZENvbHVtbih0Lm9yaWdpbmFsU3RhcnQrdC5vcmlnaW5hbExlbmd0aC0xKSxvPXIuZ2V0U3RhcnRMaW5lTnVtYmVyKHQubW9kaWZpZWRTdGFydCksdT1yLmdldFN0YXJ0Q29sdW1uKHQubW9kaWZpZWRTdGFydCksaD1yLmdldEVuZExpbmVOdW1iZXIodC5tb2RpZmllZFN0YXJ0K3QubW9kaWZpZWRMZW5ndGgtMSksZj1yLmdldEVuZENvbHVtbih0Lm1vZGlmaWVkU3RhcnQrdC5tb2RpZmllZExlbmd0aC0xKTtyZXR1cm4gbmV3IEx0KGkscyxhLGwsbyx1LGgsZil9fWZ1bmN0aW9uIHF1KGUpe2lmKGUubGVuZ3RoPD0xKXJldHVybiBlO2NvbnN0IHQ9W2VbMF1dO2xldCBuPXRbMF07Zm9yKGxldCByPTEsaT1lLmxlbmd0aDtyPGk7cisrKXtjb25zdCBzPWVbcl0sYT1zLm9yaWdpbmFsU3RhcnQtKG4ub3JpZ2luYWxTdGFydCtuLm9yaWdpbmFsTGVuZ3RoKSxsPXMubW9kaWZpZWRTdGFydC0obi5tb2RpZmllZFN0YXJ0K24ubW9kaWZpZWRMZW5ndGgpO01hdGgubWluKGEsbCk8JHU/KG4ub3JpZ2luYWxMZW5ndGg9cy5vcmlnaW5hbFN0YXJ0K3Mub3JpZ2luYWxMZW5ndGgtbi5vcmlnaW5hbFN0YXJ0LG4ubW9kaWZpZWRMZW5ndGg9cy5tb2RpZmllZFN0YXJ0K3MubW9kaWZpZWRMZW5ndGgtbi5tb2RpZmllZFN0YXJ0KToodC5wdXNoKHMpLG49cyl9cmV0dXJuIHR9Y2xhc3MgSHR7Y29uc3RydWN0b3IodCxuLHIsaSxzKXt0aGlzLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyPXQsdGhpcy5vcmlnaW5hbEVuZExpbmVOdW1iZXI9bix0aGlzLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyPXIsdGhpcy5tb2RpZmllZEVuZExpbmVOdW1iZXI9aSx0aGlzLmNoYXJDaGFuZ2VzPXN9c3RhdGljIGNyZWF0ZUZyb21EaWZmUmVzdWx0KHQsbixyLGkscyxhLGwpe2xldCBvLHUsaCxmLGQ7aWYobi5vcmlnaW5hbExlbmd0aD09PTA/KG89ci5nZXRTdGFydExpbmVOdW1iZXIobi5vcmlnaW5hbFN0YXJ0KS0xLHU9MCk6KG89ci5nZXRTdGFydExpbmVOdW1iZXIobi5vcmlnaW5hbFN0YXJ0KSx1PXIuZ2V0RW5kTGluZU51bWJlcihuLm9yaWdpbmFsU3RhcnQrbi5vcmlnaW5hbExlbmd0aC0xKSksbi5tb2RpZmllZExlbmd0aD09PTA/KGg9aS5nZXRTdGFydExpbmVOdW1iZXIobi5tb2RpZmllZFN0YXJ0KS0xLGY9MCk6KGg9aS5nZXRTdGFydExpbmVOdW1iZXIobi5tb2RpZmllZFN0YXJ0KSxmPWkuZ2V0RW5kTGluZU51bWJlcihuLm1vZGlmaWVkU3RhcnQrbi5tb2RpZmllZExlbmd0aC0xKSksYSYmbi5vcmlnaW5hbExlbmd0aD4wJiZuLm9yaWdpbmFsTGVuZ3RoPDIwJiZuLm1vZGlmaWVkTGVuZ3RoPjAmJm4ubW9kaWZpZWRMZW5ndGg8MjAmJnMoKSl7Y29uc3QgbT1yLmNyZWF0ZUNoYXJTZXF1ZW5jZSh0LG4ub3JpZ2luYWxTdGFydCxuLm9yaWdpbmFsU3RhcnQrbi5vcmlnaW5hbExlbmd0aC0xKSxnPWkuY3JlYXRlQ2hhclNlcXVlbmNlKHQsbi5tb2RpZmllZFN0YXJ0LG4ubW9kaWZpZWRTdGFydCtuLm1vZGlmaWVkTGVuZ3RoLTEpO2lmKG0uZ2V0RWxlbWVudHMoKS5sZW5ndGg+MCYmZy5nZXRFbGVtZW50cygpLmxlbmd0aD4wKXtsZXQgcD16cyhtLGcscywhMCkuY2hhbmdlcztsJiYocD1xdShwKSksZD1bXTtmb3IobGV0IHg9MCx3PXAubGVuZ3RoO3g8dzt4KyspZC5wdXNoKEx0LmNyZWF0ZUZyb21EaWZmQ2hhbmdlKHBbeF0sbSxnKSl9fXJldHVybiBuZXcgSHQobyx1LGgsZixkKX19Y2xhc3MganV7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzPXIuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzLHRoaXMuc2hvdWxkUG9zdFByb2Nlc3NDaGFyQ2hhbmdlcz1yLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMsdGhpcy5zaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZT1yLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLHRoaXMuc2hvdWxkTWFrZVByZXR0eURpZmY9ci5zaG91bGRNYWtlUHJldHR5RGlmZix0aGlzLm9yaWdpbmFsTGluZXM9dCx0aGlzLm1vZGlmaWVkTGluZXM9bix0aGlzLm9yaWdpbmFsPW5ldyBHcyh0KSx0aGlzLm1vZGlmaWVkPW5ldyBHcyhuKSx0aGlzLmNvbnRpbnVlTGluZURpZmY9SnMoci5tYXhDb21wdXRhdGlvblRpbWUpLHRoaXMuY29udGludWVDaGFyRGlmZj1KcyhyLm1heENvbXB1dGF0aW9uVGltZT09PTA/MDpNYXRoLm1pbihyLm1heENvbXB1dGF0aW9uVGltZSw1ZTMpKX1jb21wdXRlRGlmZigpe2lmKHRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoPT09MSYmdGhpcy5vcmlnaW5hbC5saW5lc1swXS5sZW5ndGg9PT0wKXJldHVybiB0aGlzLm1vZGlmaWVkLmxpbmVzLmxlbmd0aD09PTEmJnRoaXMubW9kaWZpZWQubGluZXNbMF0ubGVuZ3RoPT09MD97cXVpdEVhcmx5OiExLGNoYW5nZXM6W119OntxdWl0RWFybHk6ITEsY2hhbmdlczpbe29yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOjEsb3JpZ2luYWxFbmRMaW5lTnVtYmVyOjEsbW9kaWZpZWRTdGFydExpbmVOdW1iZXI6MSxtb2RpZmllZEVuZExpbmVOdW1iZXI6dGhpcy5tb2RpZmllZC5saW5lcy5sZW5ndGgsY2hhckNoYW5nZXM6dm9pZCAwfV19O2lmKHRoaXMubW9kaWZpZWQubGluZXMubGVuZ3RoPT09MSYmdGhpcy5tb2RpZmllZC5saW5lc1swXS5sZW5ndGg9PT0wKXJldHVybntxdWl0RWFybHk6ITEsY2hhbmdlczpbe29yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOjEsb3JpZ2luYWxFbmRMaW5lTnVtYmVyOnRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoLG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyOjEsbW9kaWZpZWRFbmRMaW5lTnVtYmVyOjEsY2hhckNoYW5nZXM6dm9pZCAwfV19O2NvbnN0IHQ9enModGhpcy5vcmlnaW5hbCx0aGlzLm1vZGlmaWVkLHRoaXMuY29udGludWVMaW5lRGlmZix0aGlzLnNob3VsZE1ha2VQcmV0dHlEaWZmKSxuPXQuY2hhbmdlcyxyPXQucXVpdEVhcmx5O2lmKHRoaXMuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2Upe2NvbnN0IGw9W107Zm9yKGxldCBvPTAsdT1uLmxlbmd0aDtvPHU7bysrKWwucHVzaChIdC5jcmVhdGVGcm9tRGlmZlJlc3VsdCh0aGlzLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLG5bb10sdGhpcy5vcmlnaW5hbCx0aGlzLm1vZGlmaWVkLHRoaXMuY29udGludWVDaGFyRGlmZix0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyx0aGlzLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMpKTtyZXR1cm57cXVpdEVhcmx5OnIsY2hhbmdlczpsfX1jb25zdCBpPVtdO2xldCBzPTAsYT0wO2ZvcihsZXQgbD0tMSxvPW4ubGVuZ3RoO2w8bztsKyspe2NvbnN0IHU9bCsxPG8/bltsKzFdOm51bGwsaD11P3Uub3JpZ2luYWxTdGFydDp0aGlzLm9yaWdpbmFsTGluZXMubGVuZ3RoLGY9dT91Lm1vZGlmaWVkU3RhcnQ6dGhpcy5tb2RpZmllZExpbmVzLmxlbmd0aDtmb3IoO3M8aCYmYTxmOyl7Y29uc3QgZD10aGlzLm9yaWdpbmFsTGluZXNbc10sbT10aGlzLm1vZGlmaWVkTGluZXNbYV07aWYoZCE9PW0pe3tsZXQgZz1fcihkLDEpLHA9X3IobSwxKTtmb3IoO2c+MSYmcD4xOyl7Y29uc3QgeD1kLmNoYXJDb2RlQXQoZy0yKSx3PW0uY2hhckNvZGVBdChwLTIpO2lmKHghPT13KWJyZWFrO2ctLSxwLS19KGc+MXx8cD4xKSYmdGhpcy5fcHVzaFRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZShpLHMrMSwxLGcsYSsxLDEscCl9e2xldCBnPUxyKGQsMSkscD1McihtLDEpO2NvbnN0IHg9ZC5sZW5ndGgrMSx3PW0ubGVuZ3RoKzE7Zm9yKDtnPHgmJnA8dzspe2NvbnN0IEw9ZC5jaGFyQ29kZUF0KGctMSksdj1kLmNoYXJDb2RlQXQocC0xKTtpZihMIT09dilicmVhaztnKysscCsrfShnPHh8fHA8dykmJnRoaXMuX3B1c2hUcmltV2hpdGVzcGFjZUNoYXJDaGFuZ2UoaSxzKzEsZyx4LGErMSxwLHcpfX1zKyssYSsrfXUmJihpLnB1c2goSHQuY3JlYXRlRnJvbURpZmZSZXN1bHQodGhpcy5zaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSx1LHRoaXMub3JpZ2luYWwsdGhpcy5tb2RpZmllZCx0aGlzLmNvbnRpbnVlQ2hhckRpZmYsdGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMsdGhpcy5zaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzKSkscys9dS5vcmlnaW5hbExlbmd0aCxhKz11Lm1vZGlmaWVkTGVuZ3RoKX1yZXR1cm57cXVpdEVhcmx5OnIsY2hhbmdlczppfX1fcHVzaFRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZSh0LG4scixpLHMsYSxsKXtpZih0aGlzLl9tZXJnZVRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZSh0LG4scixpLHMsYSxsKSlyZXR1cm47bGV0IG87dGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMmJihvPVtuZXcgTHQobixyLG4saSxzLGEscyxsKV0pLHQucHVzaChuZXcgSHQobixuLHMscyxvKSl9X21lcmdlVHJpbVdoaXRlc3BhY2VDaGFyQ2hhbmdlKHQsbixyLGkscyxhLGwpe2NvbnN0IG89dC5sZW5ndGg7aWYobz09PTApcmV0dXJuITE7Y29uc3QgdT10W28tMV07cmV0dXJuIHUub3JpZ2luYWxFbmRMaW5lTnVtYmVyPT09MHx8dS5tb2RpZmllZEVuZExpbmVOdW1iZXI9PT0wPyExOnUub3JpZ2luYWxFbmRMaW5lTnVtYmVyPT09biYmdS5tb2RpZmllZEVuZExpbmVOdW1iZXI9PT1zPyh0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyYmdS5jaGFyQ2hhbmdlcyYmdS5jaGFyQ2hhbmdlcy5wdXNoKG5ldyBMdChuLHIsbixpLHMsYSxzLGwpKSwhMCk6dS5vcmlnaW5hbEVuZExpbmVOdW1iZXIrMT09PW4mJnUubW9kaWZpZWRFbmRMaW5lTnVtYmVyKzE9PT1zPyh1Lm9yaWdpbmFsRW5kTGluZU51bWJlcj1uLHUubW9kaWZpZWRFbmRMaW5lTnVtYmVyPXMsdGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMmJnUuY2hhckNoYW5nZXMmJnUuY2hhckNoYW5nZXMucHVzaChuZXcgTHQobixyLG4saSxzLGEscyxsKSksITApOiExfX1mdW5jdGlvbiBfcihlLHQpe2NvbnN0IG49eGwoZSk7cmV0dXJuIG49PT0tMT90Om4rMX1mdW5jdGlvbiBMcihlLHQpe2NvbnN0IG49eWwoZSk7cmV0dXJuIG49PT0tMT90Om4rMn1mdW5jdGlvbiBKcyhlKXtpZihlPT09MClyZXR1cm4oKT0+ITA7Y29uc3QgdD1EYXRlLm5vdygpO3JldHVybigpPT5EYXRlLm5vdygpLXQ8ZX1mdW5jdGlvbiBXdShlLHQsbj0ocixpKT0+cj09PWkpe2lmKGU9PT10KXJldHVybiEwO2lmKCFlfHwhdHx8ZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IHI9MCxpPWUubGVuZ3RoO3I8aTtyKyspaWYoIW4oZVtyXSx0W3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbipIdShlLHQpe2xldCBuLHI7Zm9yKGNvbnN0IGkgb2YgZSlyIT09dm9pZCAwJiZ0KHIsaSk/bi5wdXNoKGkpOihuJiYoeWllbGQgbiksbj1baV0pLHI9aTtuJiYoeWllbGQgbil9ZnVuY3Rpb24genUoZSx0KXtmb3IobGV0IG49MDtuPD1lLmxlbmd0aDtuKyspdChuPT09MD92b2lkIDA6ZVtuLTFdLG49PT1lLmxlbmd0aD92b2lkIDA6ZVtuXSl9ZnVuY3Rpb24gR3UoZSx0KXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0KG49PT0wP3ZvaWQgMDplW24tMV0sZVtuXSxuKzE9PT1lLmxlbmd0aD92b2lkIDA6ZVtuKzFdKX1mdW5jdGlvbiBKdShlLHQpe2Zvcihjb25zdCBuIG9mIHQpZS5wdXNoKG4pfXZhciBOcjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChzKXtyZXR1cm4gczwwfWUuaXNMZXNzVGhhbj10O2Z1bmN0aW9uIG4ocyl7cmV0dXJuIHM8PTB9ZS5pc0xlc3NUaGFuT3JFcXVhbD1uO2Z1bmN0aW9uIHIocyl7cmV0dXJuIHM+MH1lLmlzR3JlYXRlclRoYW49cjtmdW5jdGlvbiBpKHMpe3JldHVybiBzPT09MH1lLmlzTmVpdGhlckxlc3NPckdyZWF0ZXJUaGFuPWksZS5ncmVhdGVyVGhhbj0xLGUubGVzc1RoYW49LTEsZS5uZWl0aGVyTGVzc09yR3JlYXRlclRoYW49MH0pKE5yfHwoTnI9e30pKTtmdW5jdGlvbiB3bihlLHQpe3JldHVybihuLHIpPT50KGUobiksZShyKSl9Y29uc3QgX249KGUsdCk9PmUtdDtmdW5jdGlvbiBYdShlKXtyZXR1cm4odCxuKT0+LWUodCxuKX1jb25zdCBEdD1jbGFzcyBEdHtjb25zdHJ1Y3Rvcih0KXt0aGlzLml0ZXJhdGU9dH10b0FycmF5KCl7Y29uc3QgdD1bXTtyZXR1cm4gdGhpcy5pdGVyYXRlKG49Pih0LnB1c2gobiksITApKSx0fWZpbHRlcih0KXtyZXR1cm4gbmV3IER0KG49PnRoaXMuaXRlcmF0ZShyPT50KHIpP24ocik6ITApKX1tYXAodCl7cmV0dXJuIG5ldyBEdChuPT50aGlzLml0ZXJhdGUocj0+bih0KHIpKSkpfWZpbmRMYXN0KHQpe2xldCBuO3JldHVybiB0aGlzLml0ZXJhdGUocj0+KHQocikmJihuPXIpLCEwKSksbn1maW5kTGFzdE1heEJ5KHQpe2xldCBuLHI9ITA7cmV0dXJuIHRoaXMuaXRlcmF0ZShpPT4oKHJ8fE5yLmlzR3JlYXRlclRoYW4odChpLG4pKSkmJihyPSExLG49aSksITApKSxufX07RHQuZW1wdHk9bmV3IER0KHQ9Pnt9KTtsZXQgWHM9RHQ7Y2xhc3MgV2V7c3RhdGljIHRyaXZpYWwodCxuKXtyZXR1cm4gbmV3IFdlKFtuZXcgWShXLm9mTGVuZ3RoKHQubGVuZ3RoKSxXLm9mTGVuZ3RoKG4ubGVuZ3RoKSldLCExKX1zdGF0aWMgdHJpdmlhbFRpbWVkT3V0KHQsbil7cmV0dXJuIG5ldyBXZShbbmV3IFkoVy5vZkxlbmd0aCh0Lmxlbmd0aCksVy5vZkxlbmd0aChuLmxlbmd0aCkpXSwhMCl9Y29uc3RydWN0b3IodCxuKXt0aGlzLmRpZmZzPXQsdGhpcy5oaXRUaW1lb3V0PW59fWNsYXNzIFl7c3RhdGljIGludmVydCh0LG4pe2NvbnN0IHI9W107cmV0dXJuIHp1KHQsKGkscyk9PntyLnB1c2goWS5mcm9tT2Zmc2V0UGFpcnMoaT9pLmdldEVuZEV4Y2x1c2l2ZXMoKTpIZS56ZXJvLHM/cy5nZXRTdGFydHMoKTpuZXcgSGUobiwoaT9pLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUtaS5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlOjApK24pKSl9KSxyfXN0YXRpYyBmcm9tT2Zmc2V0UGFpcnModCxuKXtyZXR1cm4gbmV3IFkobmV3IFcodC5vZmZzZXQxLG4ub2Zmc2V0MSksbmV3IFcodC5vZmZzZXQyLG4ub2Zmc2V0MikpfXN0YXRpYyBhc3NlcnRTb3J0ZWQodCl7bGV0IG47Zm9yKGNvbnN0IHIgb2YgdCl7aWYobiYmIShuLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmU8PXIuc2VxMVJhbmdlLnN0YXJ0JiZuLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmU8PXIuc2VxMlJhbmdlLnN0YXJ0KSl0aHJvdyBuZXcgYmUoIlNlcXVlbmNlIGRpZmZzIG11c3QgYmUgc29ydGVkIik7bj1yfX1jb25zdHJ1Y3Rvcih0LG4pe3RoaXMuc2VxMVJhbmdlPXQsdGhpcy5zZXEyUmFuZ2U9bn1zd2FwKCl7cmV0dXJuIG5ldyBZKHRoaXMuc2VxMlJhbmdlLHRoaXMuc2VxMVJhbmdlKX10b1N0cmluZygpe3JldHVybmAke3RoaXMuc2VxMVJhbmdlfSA8LT4gJHt0aGlzLnNlcTJSYW5nZX1gfWpvaW4odCl7cmV0dXJuIG5ldyBZKHRoaXMuc2VxMVJhbmdlLmpvaW4odC5zZXExUmFuZ2UpLHRoaXMuc2VxMlJhbmdlLmpvaW4odC5zZXEyUmFuZ2UpKX1kZWx0YSh0KXtyZXR1cm4gdD09PTA/dGhpczpuZXcgWSh0aGlzLnNlcTFSYW5nZS5kZWx0YSh0KSx0aGlzLnNlcTJSYW5nZS5kZWx0YSh0KSl9ZGVsdGFTdGFydCh0KXtyZXR1cm4gdD09PTA/dGhpczpuZXcgWSh0aGlzLnNlcTFSYW5nZS5kZWx0YVN0YXJ0KHQpLHRoaXMuc2VxMlJhbmdlLmRlbHRhU3RhcnQodCkpfWRlbHRhRW5kKHQpe3JldHVybiB0PT09MD90aGlzOm5ldyBZKHRoaXMuc2VxMVJhbmdlLmRlbHRhRW5kKHQpLHRoaXMuc2VxMlJhbmdlLmRlbHRhRW5kKHQpKX1pbnRlcnNlY3QodCl7Y29uc3Qgbj10aGlzLnNlcTFSYW5nZS5pbnRlcnNlY3QodC5zZXExUmFuZ2UpLHI9dGhpcy5zZXEyUmFuZ2UuaW50ZXJzZWN0KHQuc2VxMlJhbmdlKTtpZighKCFufHwhcikpcmV0dXJuIG5ldyBZKG4scil9Z2V0U3RhcnRzKCl7cmV0dXJuIG5ldyBIZSh0aGlzLnNlcTFSYW5nZS5zdGFydCx0aGlzLnNlcTJSYW5nZS5zdGFydCl9Z2V0RW5kRXhjbHVzaXZlcygpe3JldHVybiBuZXcgSGUodGhpcy5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlLHRoaXMuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZSl9fWNvbnN0IGN0PWNsYXNzIGN0e2NvbnN0cnVjdG9yKHQsbil7dGhpcy5vZmZzZXQxPXQsdGhpcy5vZmZzZXQyPW59dG9TdHJpbmcoKXtyZXR1cm5gJHt0aGlzLm9mZnNldDF9IDwtPiAke3RoaXMub2Zmc2V0Mn1gfWRlbHRhKHQpe3JldHVybiB0PT09MD90aGlzOm5ldyBjdCh0aGlzLm9mZnNldDErdCx0aGlzLm9mZnNldDIrdCl9ZXF1YWxzKHQpe3JldHVybiB0aGlzLm9mZnNldDE9PT10Lm9mZnNldDEmJnRoaXMub2Zmc2V0Mj09PXQub2Zmc2V0Mn19O2N0Lnplcm89bmV3IGN0KDAsMCksY3QubWF4PW5ldyBjdChOdW1iZXIuTUFYX1NBRkVfSU5URUdFUixOdW1iZXIuTUFYX1NBRkVfSU5URUdFUik7bGV0IEhlPWN0O2NvbnN0IFVuPWNsYXNzIFVue2lzVmFsaWQoKXtyZXR1cm4hMH19O1VuLmluc3RhbmNlPW5ldyBVbjtsZXQgenQ9VW47Y2xhc3MgUXV7Y29uc3RydWN0b3IodCl7aWYodGhpcy50aW1lb3V0PXQsdGhpcy5zdGFydFRpbWU9RGF0ZS5ub3coKSx0aGlzLnZhbGlkPSEwLHQ8PTApdGhyb3cgbmV3IGJlKCJ0aW1lb3V0IG11c3QgYmUgcG9zaXRpdmUiKX1pc1ZhbGlkKCl7aWYoIShEYXRlLm5vdygpLXRoaXMuc3RhcnRUaW1lPHRoaXMudGltZW91dCkmJnRoaXMudmFsaWQpe3RoaXMudmFsaWQ9ITE7ZGVidWdnZXJ9cmV0dXJuIHRoaXMudmFsaWR9fWNsYXNzIFNye2NvbnN0cnVjdG9yKHQsbil7dGhpcy53aWR0aD10LHRoaXMuaGVpZ2h0PW4sdGhpcy5hcnJheT1bXSx0aGlzLmFycmF5PW5ldyBBcnJheSh0Km4pfWdldCh0LG4pe3JldHVybiB0aGlzLmFycmF5W3Qrbip0aGlzLndpZHRoXX1zZXQodCxuLHIpe3RoaXMuYXJyYXlbdCtuKnRoaXMud2lkdGhdPXJ9fWZ1bmN0aW9uIEFyKGUpe3JldHVybiBlPT09MzJ8fGU9PT05fWNvbnN0IHNuPWNsYXNzIHNue3N0YXRpYyBnZXRLZXkodCl7bGV0IG49dGhpcy5jaHJLZXlzLmdldCh0KTtyZXR1cm4gbj09PXZvaWQgMCYmKG49dGhpcy5jaHJLZXlzLnNpemUsdGhpcy5jaHJLZXlzLnNldCh0LG4pKSxufWNvbnN0cnVjdG9yKHQsbixyKXt0aGlzLnJhbmdlPXQsdGhpcy5saW5lcz1uLHRoaXMuc291cmNlPXIsdGhpcy5oaXN0b2dyYW09W107bGV0IGk9MDtmb3IobGV0IHM9dC5zdGFydExpbmVOdW1iZXItMTtzPHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xO3MrKyl7Y29uc3QgYT1uW3NdO2ZvcihsZXQgbz0wO288YS5sZW5ndGg7bysrKXtpKys7Y29uc3QgdT1hW29dLGg9c24uZ2V0S2V5KHUpO3RoaXMuaGlzdG9ncmFtW2hdPSh0aGlzLmhpc3RvZ3JhbVtoXXx8MCkrMX1pKys7Y29uc3QgbD1zbi5nZXRLZXkoYApgKTt0aGlzLmhpc3RvZ3JhbVtsXT0odGhpcy5oaXN0b2dyYW1bbF18fDApKzF9dGhpcy50b3RhbENvdW50PWl9Y29tcHV0ZVNpbWlsYXJpdHkodCl7bGV0IG49MDtjb25zdCByPU1hdGgubWF4KHRoaXMuaGlzdG9ncmFtLmxlbmd0aCx0Lmhpc3RvZ3JhbS5sZW5ndGgpO2ZvcihsZXQgaT0wO2k8cjtpKyspbis9TWF0aC5hYnMoKHRoaXMuaGlzdG9ncmFtW2ldPz8wKS0odC5oaXN0b2dyYW1baV0/PzApKTtyZXR1cm4gMS1uLyh0aGlzLnRvdGFsQ291bnQrdC50b3RhbENvdW50KX19O3NuLmNocktleXM9bmV3IE1hcDtsZXQgTG49c247Y2xhc3MgWXV7Y29tcHV0ZSh0LG4scj16dC5pbnN0YW5jZSxpKXtpZih0Lmxlbmd0aD09PTB8fG4ubGVuZ3RoPT09MClyZXR1cm4gV2UudHJpdmlhbCh0LG4pO2NvbnN0IHM9bmV3IFNyKHQubGVuZ3RoLG4ubGVuZ3RoKSxhPW5ldyBTcih0Lmxlbmd0aCxuLmxlbmd0aCksbD1uZXcgU3IodC5sZW5ndGgsbi5sZW5ndGgpO2ZvcihsZXQgZz0wO2c8dC5sZW5ndGg7ZysrKWZvcihsZXQgcD0wO3A8bi5sZW5ndGg7cCsrKXtpZighci5pc1ZhbGlkKCkpcmV0dXJuIFdlLnRyaXZpYWxUaW1lZE91dCh0LG4pO2NvbnN0IHg9Zz09PTA/MDpzLmdldChnLTEscCksdz1wPT09MD8wOnMuZ2V0KGcscC0xKTtsZXQgTDt0LmdldEVsZW1lbnQoZyk9PT1uLmdldEVsZW1lbnQocCk/KGc9PT0wfHxwPT09MD9MPTA6TD1zLmdldChnLTEscC0xKSxnPjAmJnA+MCYmYS5nZXQoZy0xLHAtMSk9PT0zJiYoTCs9bC5nZXQoZy0xLHAtMSkpLEwrPWk/aShnLHApOjEpOkw9LTE7Y29uc3Qgdj1NYXRoLm1heCh4LHcsTCk7aWYodj09PUwpe2NvbnN0IHk9Zz4wJiZwPjA/bC5nZXQoZy0xLHAtMSk6MDtsLnNldChnLHAseSsxKSxhLnNldChnLHAsMyl9ZWxzZSB2PT09eD8obC5zZXQoZyxwLDApLGEuc2V0KGcscCwxKSk6dj09PXcmJihsLnNldChnLHAsMCksYS5zZXQoZyxwLDIpKTtzLnNldChnLHAsdil9Y29uc3Qgbz1bXTtsZXQgdT10Lmxlbmd0aCxoPW4ubGVuZ3RoO2Z1bmN0aW9uIGYoZyxwKXsoZysxIT09dXx8cCsxIT09aCkmJm8ucHVzaChuZXcgWShuZXcgVyhnKzEsdSksbmV3IFcocCsxLGgpKSksdT1nLGg9cH1sZXQgZD10Lmxlbmd0aC0xLG09bi5sZW5ndGgtMTtmb3IoO2Q+PTAmJm0+PTA7KWEuZ2V0KGQsbSk9PT0zPyhmKGQsbSksZC0tLG0tLSk6YS5nZXQoZCxtKT09PTE/ZC0tOm0tLTtyZXR1cm4gZigtMSwtMSksby5yZXZlcnNlKCksbmV3IFdlKG8sITEpfX1jbGFzcyBRc3tjb21wdXRlKHQsbixyPXp0Lmluc3RhbmNlKXtpZih0Lmxlbmd0aD09PTB8fG4ubGVuZ3RoPT09MClyZXR1cm4gV2UudHJpdmlhbCh0LG4pO2NvbnN0IGk9dCxzPW47ZnVuY3Rpb24gYShwLHgpe2Zvcig7cDxpLmxlbmd0aCYmeDxzLmxlbmd0aCYmaS5nZXRFbGVtZW50KHApPT09cy5nZXRFbGVtZW50KHgpOylwKysseCsrO3JldHVybiBwfWxldCBsPTA7Y29uc3Qgbz1uZXcgWnU7by5zZXQoMCxhKDAsMCkpO2NvbnN0IHU9bmV3IEt1O3Uuc2V0KDAsby5nZXQoMCk9PT0wP251bGw6bmV3IFlzKG51bGwsMCwwLG8uZ2V0KDApKSk7bGV0IGg9MDtlOmZvcig7Oyl7aWYobCsrLCFyLmlzVmFsaWQoKSlyZXR1cm4gV2UudHJpdmlhbFRpbWVkT3V0KGkscyk7Y29uc3QgcD0tTWF0aC5taW4obCxzLmxlbmd0aCtsJTIpLHg9TWF0aC5taW4obCxpLmxlbmd0aCtsJTIpO2ZvcihoPXA7aDw9eDtoKz0yKXtjb25zdCB3PWg9PT14Py0xOm8uZ2V0KGgrMSksTD1oPT09cD8tMTpvLmdldChoLTEpKzEsdj1NYXRoLm1pbihNYXRoLm1heCh3LEwpLGkubGVuZ3RoKSx5PXYtaDtpZih2PmkubGVuZ3RofHx5PnMubGVuZ3RoKWNvbnRpbnVlO2NvbnN0IGI9YSh2LHkpO28uc2V0KGgsYik7Y29uc3QgXz12PT09dz91LmdldChoKzEpOnUuZ2V0KGgtMSk7aWYodS5zZXQoaCxiIT09dj9uZXcgWXMoXyx2LHksYi12KTpfKSxvLmdldChoKT09PWkubGVuZ3RoJiZvLmdldChoKS1oPT09cy5sZW5ndGgpYnJlYWsgZX19bGV0IGY9dS5nZXQoaCk7Y29uc3QgZD1bXTtsZXQgbT1pLmxlbmd0aCxnPXMubGVuZ3RoO2Zvcig7Oyl7Y29uc3QgcD1mP2YueCtmLmxlbmd0aDowLHg9Zj9mLnkrZi5sZW5ndGg6MDtpZigocCE9PW18fHghPT1nKSYmZC5wdXNoKG5ldyBZKG5ldyBXKHAsbSksbmV3IFcoeCxnKSkpLCFmKWJyZWFrO209Zi54LGc9Zi55LGY9Zi5wcmV2fXJldHVybiBkLnJldmVyc2UoKSxuZXcgV2UoZCwhMSl9fWNsYXNzIFlze2NvbnN0cnVjdG9yKHQsbixyLGkpe3RoaXMucHJldj10LHRoaXMueD1uLHRoaXMueT1yLHRoaXMubGVuZ3RoPWl9fWNsYXNzIFp1e2NvbnN0cnVjdG9yKCl7dGhpcy5wb3NpdGl2ZUFycj1uZXcgSW50MzJBcnJheSgxMCksdGhpcy5uZWdhdGl2ZUFycj1uZXcgSW50MzJBcnJheSgxMCl9Z2V0KHQpe3JldHVybiB0PDA/KHQ9LXQtMSx0aGlzLm5lZ2F0aXZlQXJyW3RdKTp0aGlzLnBvc2l0aXZlQXJyW3RdfXNldCh0LG4pe2lmKHQ8MCl7aWYodD0tdC0xLHQ+PXRoaXMubmVnYXRpdmVBcnIubGVuZ3RoKXtjb25zdCByPXRoaXMubmVnYXRpdmVBcnI7dGhpcy5uZWdhdGl2ZUFycj1uZXcgSW50MzJBcnJheShyLmxlbmd0aCoyKSx0aGlzLm5lZ2F0aXZlQXJyLnNldChyKX10aGlzLm5lZ2F0aXZlQXJyW3RdPW59ZWxzZXtpZih0Pj10aGlzLnBvc2l0aXZlQXJyLmxlbmd0aCl7Y29uc3Qgcj10aGlzLnBvc2l0aXZlQXJyO3RoaXMucG9zaXRpdmVBcnI9bmV3IEludDMyQXJyYXkoci5sZW5ndGgqMiksdGhpcy5wb3NpdGl2ZUFyci5zZXQocil9dGhpcy5wb3NpdGl2ZUFyclt0XT1ufX19Y2xhc3MgS3V7Y29uc3RydWN0b3IoKXt0aGlzLnBvc2l0aXZlQXJyPVtdLHRoaXMubmVnYXRpdmVBcnI9W119Z2V0KHQpe3JldHVybiB0PDA/KHQ9LXQtMSx0aGlzLm5lZ2F0aXZlQXJyW3RdKTp0aGlzLnBvc2l0aXZlQXJyW3RdfXNldCh0LG4pe3Q8MD8odD0tdC0xLHRoaXMubmVnYXRpdmVBcnJbdF09bik6dGhpcy5wb3NpdGl2ZUFyclt0XT1ufX1jbGFzcyBObntjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy5saW5lcz10LHRoaXMucmFuZ2U9bix0aGlzLmNvbnNpZGVyV2hpdGVzcGFjZUNoYW5nZXM9cix0aGlzLmVsZW1lbnRzPVtdLHRoaXMuZmlyc3RFbGVtZW50T2Zmc2V0QnlMaW5lSWR4PVtdLHRoaXMubGluZVN0YXJ0T2Zmc2V0cz1bXSx0aGlzLnRyaW1tZWRXc0xlbmd0aHNCeUxpbmVJZHg9W10sdGhpcy5maXJzdEVsZW1lbnRPZmZzZXRCeUxpbmVJZHgucHVzaCgwKTtmb3IobGV0IGk9dGhpcy5yYW5nZS5zdGFydExpbmVOdW1iZXI7aTw9dGhpcy5yYW5nZS5lbmRMaW5lTnVtYmVyO2krKyl7bGV0IHM9dFtpLTFdLGE9MDtpPT09dGhpcy5yYW5nZS5zdGFydExpbmVOdW1iZXImJnRoaXMucmFuZ2Uuc3RhcnRDb2x1bW4+MSYmKGE9dGhpcy5yYW5nZS5zdGFydENvbHVtbi0xLHM9cy5zdWJzdHJpbmcoYSkpLHRoaXMubGluZVN0YXJ0T2Zmc2V0cy5wdXNoKGEpO2xldCBsPTA7aWYoIXIpe2NvbnN0IHU9cy50cmltU3RhcnQoKTtsPXMubGVuZ3RoLXUubGVuZ3RoLHM9dS50cmltRW5kKCl9dGhpcy50cmltbWVkV3NMZW5ndGhzQnlMaW5lSWR4LnB1c2gobCk7Y29uc3Qgbz1pPT09dGhpcy5yYW5nZS5lbmRMaW5lTnVtYmVyP01hdGgubWluKHRoaXMucmFuZ2UuZW5kQ29sdW1uLTEtYS1sLHMubGVuZ3RoKTpzLmxlbmd0aDtmb3IobGV0IHU9MDt1PG87dSsrKXRoaXMuZWxlbWVudHMucHVzaChzLmNoYXJDb2RlQXQodSkpO2k8dGhpcy5yYW5nZS5lbmRMaW5lTnVtYmVyJiYodGhpcy5lbGVtZW50cy5wdXNoKDEwKSx0aGlzLmZpcnN0RWxlbWVudE9mZnNldEJ5TGluZUlkeC5wdXNoKHRoaXMuZWxlbWVudHMubGVuZ3RoKSl9fXRvU3RyaW5nKCl7cmV0dXJuYFNsaWNlOiAiJHt0aGlzLnRleHR9ImB9Z2V0IHRleHQoKXtyZXR1cm4gdGhpcy5nZXRUZXh0KG5ldyBXKDAsdGhpcy5sZW5ndGgpKX1nZXRUZXh0KHQpe3JldHVybiB0aGlzLmVsZW1lbnRzLnNsaWNlKHQuc3RhcnQsdC5lbmRFeGNsdXNpdmUpLm1hcChuPT5TdHJpbmcuZnJvbUNoYXJDb2RlKG4pKS5qb2luKCIiKX1nZXRFbGVtZW50KHQpe3JldHVybiB0aGlzLmVsZW1lbnRzW3RdfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5sZW5ndGh9Z2V0Qm91bmRhcnlTY29yZSh0KXtjb25zdCBuPUtzKHQ+MD90aGlzLmVsZW1lbnRzW3QtMV06LTEpLHI9S3ModDx0aGlzLmVsZW1lbnRzLmxlbmd0aD90aGlzLmVsZW1lbnRzW3RdOi0xKTtpZihuPT09NyYmcj09PTgpcmV0dXJuIDA7aWYobj09PTgpcmV0dXJuIDE1MDtsZXQgaT0wO3JldHVybiBuIT09ciYmKGkrPTEwLG49PT0wJiZyPT09MSYmKGkrPTEpKSxpKz1acyhuKSxpKz1acyhyKSxpfXRyYW5zbGF0ZU9mZnNldCh0LG49InJpZ2h0Iil7Y29uc3Qgcj1XdCh0aGlzLmZpcnN0RWxlbWVudE9mZnNldEJ5TGluZUlkeCxzPT5zPD10KSxpPXQtdGhpcy5maXJzdEVsZW1lbnRPZmZzZXRCeUxpbmVJZHhbcl07cmV0dXJuIG5ldyBlZSh0aGlzLnJhbmdlLnN0YXJ0TGluZU51bWJlcityLDErdGhpcy5saW5lU3RhcnRPZmZzZXRzW3JdK2krKGk9PT0wJiZuPT09ImxlZnQiPzA6dGhpcy50cmltbWVkV3NMZW5ndGhzQnlMaW5lSWR4W3JdKSl9dHJhbnNsYXRlUmFuZ2UodCl7Y29uc3Qgbj10aGlzLnRyYW5zbGF0ZU9mZnNldCh0LnN0YXJ0LCJyaWdodCIpLHI9dGhpcy50cmFuc2xhdGVPZmZzZXQodC5lbmRFeGNsdXNpdmUsImxlZnQiKTtyZXR1cm4gci5pc0JlZm9yZShuKT96LmZyb21Qb3NpdGlvbnMocixyKTp6LmZyb21Qb3NpdGlvbnMobixyKX1maW5kV29yZENvbnRhaW5pbmcodCl7aWYodDwwfHx0Pj10aGlzLmVsZW1lbnRzLmxlbmd0aHx8IWtyKHRoaXMuZWxlbWVudHNbdF0pKXJldHVybjtsZXQgbj10O2Zvcig7bj4wJiZrcih0aGlzLmVsZW1lbnRzW24tMV0pOyluLS07bGV0IHI9dDtmb3IoO3I8dGhpcy5lbGVtZW50cy5sZW5ndGgmJmtyKHRoaXMuZWxlbWVudHNbcl0pOylyKys7cmV0dXJuIG5ldyBXKG4scil9Y291bnRMaW5lc0luKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9mZnNldCh0LmVuZEV4Y2x1c2l2ZSkubGluZU51bWJlci10aGlzLnRyYW5zbGF0ZU9mZnNldCh0LnN0YXJ0KS5saW5lTnVtYmVyfWlzU3Ryb25nbHlFcXVhbCh0LG4pe3JldHVybiB0aGlzLmVsZW1lbnRzW3RdPT09dGhpcy5lbGVtZW50c1tuXX1leHRlbmRUb0Z1bGxMaW5lcyh0KXtjb25zdCBuPXd0KHRoaXMuZmlyc3RFbGVtZW50T2Zmc2V0QnlMaW5lSWR4LGk9Pmk8PXQuc3RhcnQpPz8wLHI9RHUodGhpcy5maXJzdEVsZW1lbnRPZmZzZXRCeUxpbmVJZHgsaT0+dC5lbmRFeGNsdXNpdmU8PWkpPz90aGlzLmVsZW1lbnRzLmxlbmd0aDtyZXR1cm4gbmV3IFcobixyKX19ZnVuY3Rpb24ga3IoZSl7cmV0dXJuIGU+PTk3JiZlPD0xMjJ8fGU+PTY1JiZlPD05MHx8ZT49NDgmJmU8PTU3fWNvbnN0IGVjPXswOjAsMTowLDI6MCwzOjEwLDQ6Miw1OjMwLDY6Myw3OjEwLDg6MTB9O2Z1bmN0aW9uIFpzKGUpe3JldHVybiBlY1tlXX1mdW5jdGlvbiBLcyhlKXtyZXR1cm4gZT09PTEwPzg6ZT09PTEzPzc6QXIoZSk/NjplPj05NyYmZTw9MTIyPzA6ZT49NjUmJmU8PTkwPzE6ZT49NDgmJmU8PTU3PzI6ZT09PS0xPzM6ZT09PTQ0fHxlPT09NTk/NTo0fWZ1bmN0aW9uIHRjKGUsdCxuLHIsaSxzKXtsZXR7bW92ZXM6YSxleGNsdWRlZENoYW5nZXM6bH09cmMoZSx0LG4scyk7aWYoIXMuaXNWYWxpZCgpKXJldHVybltdO2NvbnN0IG89ZS5maWx0ZXIoaD0+IWwuaGFzKGgpKSx1PWljKG8scixpLHQsbixzKTtyZXR1cm4gSnUoYSx1KSxhPXNjKGEpLGE9YS5maWx0ZXIoaD0+e2NvbnN0IGY9aC5vcmlnaW5hbC50b09mZnNldFJhbmdlKCkuc2xpY2UodCkubWFwKG09Pm0udHJpbSgpKTtyZXR1cm4gZi5qb2luKGAKYCkubGVuZ3RoPj0xNSYmbmMoZixtPT5tLmxlbmd0aD49Mik+PTJ9KSxhPWFjKGUsYSksYX1mdW5jdGlvbiBuYyhlLHQpe2xldCBuPTA7Zm9yKGNvbnN0IHIgb2YgZSl0KHIpJiZuKys7cmV0dXJuIG59ZnVuY3Rpb24gcmMoZSx0LG4scil7Y29uc3QgaT1bXSxzPWUuZmlsdGVyKG89Pm8ubW9kaWZpZWQuaXNFbXB0eSYmby5vcmlnaW5hbC5sZW5ndGg+PTMpLm1hcChvPT5uZXcgTG4oby5vcmlnaW5hbCx0LG8pKSxhPW5ldyBTZXQoZS5maWx0ZXIobz0+by5vcmlnaW5hbC5pc0VtcHR5JiZvLm1vZGlmaWVkLmxlbmd0aD49MykubWFwKG89Pm5ldyBMbihvLm1vZGlmaWVkLG4sbykpKSxsPW5ldyBTZXQ7Zm9yKGNvbnN0IG8gb2Ygcyl7bGV0IHU9LTEsaDtmb3IoY29uc3QgZiBvZiBhKXtjb25zdCBkPW8uY29tcHV0ZVNpbWlsYXJpdHkoZik7ZD51JiYodT1kLGg9Zil9aWYodT4uOSYmaCYmKGEuZGVsZXRlKGgpLGkucHVzaChuZXcgTGUoby5yYW5nZSxoLnJhbmdlKSksbC5hZGQoby5zb3VyY2UpLGwuYWRkKGguc291cmNlKSksIXIuaXNWYWxpZCgpKXJldHVybnttb3ZlczppLGV4Y2x1ZGVkQ2hhbmdlczpsfX1yZXR1cm57bW92ZXM6aSxleGNsdWRlZENoYW5nZXM6bH19ZnVuY3Rpb24gaWMoZSx0LG4scixpLHMpe2NvbnN0IGE9W10sbD1uZXcgTHU7Zm9yKGNvbnN0IGQgb2YgZSlmb3IobGV0IG09ZC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXI7bTxkLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMjttKyspe2NvbnN0IGc9YCR7dFttLTFdfToke3RbbSsxLTFdfToke3RbbSsyLTFdfWA7bC5hZGQoZyx7cmFuZ2U6bmV3IFUobSxtKzMpfSl9Y29uc3Qgbz1bXTtlLnNvcnQod24oZD0+ZC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIsX24pKTtmb3IoY29uc3QgZCBvZiBlKXtsZXQgbT1bXTtmb3IobGV0IGc9ZC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXI7ZzxkLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMjtnKyspe2NvbnN0IHA9YCR7bltnLTFdfToke25bZysxLTFdfToke25bZysyLTFdfWAseD1uZXcgVShnLGcrMyksdz1bXTtsLmZvckVhY2gocCwoe3JhbmdlOkx9KT0+e2Zvcihjb25zdCB5IG9mIG0paWYoeS5vcmlnaW5hbExpbmVSYW5nZS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKzE9PT1MLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUmJnkubW9kaWZpZWRMaW5lUmFuZ2UuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSsxPT09eC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKXt5Lm9yaWdpbmFsTGluZVJhbmdlPW5ldyBVKHkub3JpZ2luYWxMaW5lUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLEwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkseS5tb2RpZmllZExpbmVSYW5nZT1uZXcgVSh5Lm1vZGlmaWVkTGluZVJhbmdlLnN0YXJ0TGluZU51bWJlcix4LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpLHcucHVzaCh5KTtyZXR1cm59Y29uc3Qgdj17bW9kaWZpZWRMaW5lUmFuZ2U6eCxvcmlnaW5hbExpbmVSYW5nZTpMfTtvLnB1c2godiksdy5wdXNoKHYpfSksbT13fWlmKCFzLmlzVmFsaWQoKSlyZXR1cm5bXX1vLnNvcnQoWHUod24oZD0+ZC5tb2RpZmllZExpbmVSYW5nZS5sZW5ndGgsX24pKSk7Y29uc3QgdT1uZXcgRmUsaD1uZXcgRmU7Zm9yKGNvbnN0IGQgb2Ygbyl7Y29uc3QgbT1kLm1vZGlmaWVkTGluZVJhbmdlLnN0YXJ0TGluZU51bWJlci1kLm9yaWdpbmFsTGluZVJhbmdlLnN0YXJ0TGluZU51bWJlcixnPXUuc3VidHJhY3RGcm9tKGQubW9kaWZpZWRMaW5lUmFuZ2UpLHA9aC5zdWJ0cmFjdEZyb20oZC5vcmlnaW5hbExpbmVSYW5nZSkuZ2V0V2l0aERlbHRhKG0pLHg9Zy5nZXRJbnRlcnNlY3Rpb24ocCk7Zm9yKGNvbnN0IHcgb2YgeC5yYW5nZXMpe2lmKHcubGVuZ3RoPDMpY29udGludWU7Y29uc3QgTD13LHY9dy5kZWx0YSgtbSk7YS5wdXNoKG5ldyBMZSh2LEwpKSx1LmFkZFJhbmdlKEwpLGguYWRkUmFuZ2Uodil9fWEuc29ydCh3bihkPT5kLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcixfbikpO2NvbnN0IGY9bmV3IHluKGUpO2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKXtjb25zdCBtPWFbZF0sZz1mLmZpbmRMYXN0TW9ub3Rvbm91cyhfPT5fLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcjw9bS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIpLHA9d3QoZSxfPT5fLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcjw9bS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIpLHg9TWF0aC5tYXgobS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItZy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIsbS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItcC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIpLHc9Zi5maW5kTGFzdE1vbm90b25vdXMoXz0+Xy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXI8bS5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKSxMPXd0KGUsXz0+Xy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXI8bS5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKSx2PU1hdGgubWF4KHcub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS1tLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsTC5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLW0ubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSk7bGV0IHk7Zm9yKHk9MDt5PHg7eSsrKXtjb25zdCBfPW0ub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLXktMSxBPW0ubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLXktMTtpZihfPnIubGVuZ3RofHxBPmkubGVuZ3RofHx1LmNvbnRhaW5zKEEpfHxoLmNvbnRhaW5zKF8pfHwhZWEocltfLTFdLGlbQS0xXSxzKSlicmVha315PjAmJihoLmFkZFJhbmdlKG5ldyBVKG0ub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLXksbS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIpKSx1LmFkZFJhbmdlKG5ldyBVKG0ubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLXksbS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIpKSk7bGV0IGI7Zm9yKGI9MDtiPHY7YisrKXtjb25zdCBfPW0ub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZStiLEE9bS5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlK2I7aWYoXz5yLmxlbmd0aHx8QT5pLmxlbmd0aHx8dS5jb250YWlucyhBKXx8aC5jb250YWlucyhfKXx8IWVhKHJbXy0xXSxpW0EtMV0scykpYnJlYWt9Yj4wJiYoaC5hZGRSYW5nZShuZXcgVShtLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsbS5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlK2IpKSx1LmFkZFJhbmdlKG5ldyBVKG0ubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxtLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUrYikpKSwoeT4wfHxiPjApJiYoYVtkXT1uZXcgTGUobmV3IFUobS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIteSxtLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUrYiksbmV3IFUobS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIteSxtLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUrYikpKX1yZXR1cm4gYX1mdW5jdGlvbiBlYShlLHQsbil7aWYoZS50cmltKCk9PT10LnRyaW0oKSlyZXR1cm4hMDtpZihlLmxlbmd0aD4zMDAmJnQubGVuZ3RoPjMwMClyZXR1cm4hMTtjb25zdCBpPW5ldyBRcygpLmNvbXB1dGUobmV3IE5uKFtlXSxuZXcgeigxLDEsMSxlLmxlbmd0aCksITEpLG5ldyBObihbdF0sbmV3IHooMSwxLDEsdC5sZW5ndGgpLCExKSxuKTtsZXQgcz0wO2NvbnN0IGE9WS5pbnZlcnQoaS5kaWZmcyxlLmxlbmd0aCk7Zm9yKGNvbnN0IGggb2YgYSloLnNlcTFSYW5nZS5mb3JFYWNoKGY9PntBcihlLmNoYXJDb2RlQXQoZikpfHxzKyt9KTtmdW5jdGlvbiBsKGgpe2xldCBmPTA7Zm9yKGxldCBkPTA7ZDxlLmxlbmd0aDtkKyspQXIoaC5jaGFyQ29kZUF0KGQpKXx8ZisrO3JldHVybiBmfWNvbnN0IG89bChlLmxlbmd0aD50Lmxlbmd0aD9lOnQpO3JldHVybiBzL28+LjYmJm8+MTB9ZnVuY3Rpb24gc2MoZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiBlO2Uuc29ydCh3bihuPT5uLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcixfbikpO2NvbnN0IHQ9W2VbMF1dO2ZvcihsZXQgbj0xO248ZS5sZW5ndGg7bisrKXtjb25zdCByPXRbdC5sZW5ndGgtMV0saT1lW25dLHM9aS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItci5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLGE9aS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItci5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlO2lmKHM+PTAmJmE+PTAmJnMrYTw9Mil7dFt0Lmxlbmd0aC0xXT1yLmpvaW4oaSk7Y29udGludWV9dC5wdXNoKGkpfXJldHVybiB0fWZ1bmN0aW9uIGFjKGUsdCl7Y29uc3Qgbj1uZXcgeW4oZSk7cmV0dXJuIHQ9dC5maWx0ZXIocj0+e2NvbnN0IGk9bi5maW5kTGFzdE1vbm90b25vdXMobD0+bC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXI8ci5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKXx8bmV3IExlKG5ldyBVKDEsMSksbmV3IFUoMSwxKSkscz13dChlLGw9PmwubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyPHIubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSk7cmV0dXJuIGkhPT1zfSksdH1mdW5jdGlvbiB0YShlLHQsbil7bGV0IHI9bjtyZXR1cm4gcj1uYShlLHQscikscj1uYShlLHQscikscj1vYyhlLHQscikscn1mdW5jdGlvbiBuYShlLHQsbil7aWYobi5sZW5ndGg9PT0wKXJldHVybiBuO2NvbnN0IHI9W107ci5wdXNoKG5bMF0pO2ZvcihsZXQgcz0xO3M8bi5sZW5ndGg7cysrKXtjb25zdCBhPXJbci5sZW5ndGgtMV07bGV0IGw9bltzXTtpZihsLnNlcTFSYW5nZS5pc0VtcHR5fHxsLnNlcTJSYW5nZS5pc0VtcHR5KXtjb25zdCBvPWwuc2VxMVJhbmdlLnN0YXJ0LWEuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZTtsZXQgdTtmb3IodT0xO3U8PW8mJiEoZS5nZXRFbGVtZW50KGwuc2VxMVJhbmdlLnN0YXJ0LXUpIT09ZS5nZXRFbGVtZW50KGwuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZS11KXx8dC5nZXRFbGVtZW50KGwuc2VxMlJhbmdlLnN0YXJ0LXUpIT09dC5nZXRFbGVtZW50KGwuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZS11KSk7dSsrKTtpZih1LS0sdT09PW8pe3Jbci5sZW5ndGgtMV09bmV3IFkobmV3IFcoYS5zZXExUmFuZ2Uuc3RhcnQsbC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlLW8pLG5ldyBXKGEuc2VxMlJhbmdlLnN0YXJ0LGwuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZS1vKSk7Y29udGludWV9bD1sLmRlbHRhKC11KX1yLnB1c2gobCl9Y29uc3QgaT1bXTtmb3IobGV0IHM9MDtzPHIubGVuZ3RoLTE7cysrKXtjb25zdCBhPXJbcysxXTtsZXQgbD1yW3NdO2lmKGwuc2VxMVJhbmdlLmlzRW1wdHl8fGwuc2VxMlJhbmdlLmlzRW1wdHkpe2NvbnN0IG89YS5zZXExUmFuZ2Uuc3RhcnQtbC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlO2xldCB1O2Zvcih1PTA7dTxvJiYhKCFlLmlzU3Ryb25nbHlFcXVhbChsLnNlcTFSYW5nZS5zdGFydCt1LGwuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSt1KXx8IXQuaXNTdHJvbmdseUVxdWFsKGwuc2VxMlJhbmdlLnN0YXJ0K3UsbC5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlK3UpKTt1KyspO2lmKHU9PT1vKXtyW3MrMV09bmV3IFkobmV3IFcobC5zZXExUmFuZ2Uuc3RhcnQrbyxhLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUpLG5ldyBXKGwuc2VxMlJhbmdlLnN0YXJ0K28sYS5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlKSk7Y29udGludWV9dT4wJiYobD1sLmRlbHRhKHUpKX1pLnB1c2gobCl9cmV0dXJuIHIubGVuZ3RoPjAmJmkucHVzaChyW3IubGVuZ3RoLTFdKSxpfWZ1bmN0aW9uIG9jKGUsdCxuKXtpZighZS5nZXRCb3VuZGFyeVNjb3JlfHwhdC5nZXRCb3VuZGFyeVNjb3JlKXJldHVybiBuO2ZvcihsZXQgcj0wO3I8bi5sZW5ndGg7cisrKXtjb25zdCBpPXI+MD9uW3ItMV06dm9pZCAwLHM9bltyXSxhPXIrMTxuLmxlbmd0aD9uW3IrMV06dm9pZCAwLGw9bmV3IFcoaT9pLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUrMTowLGE/YS5zZXExUmFuZ2Uuc3RhcnQtMTplLmxlbmd0aCksbz1uZXcgVyhpP2kuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZSsxOjAsYT9hLnNlcTJSYW5nZS5zdGFydC0xOnQubGVuZ3RoKTtzLnNlcTFSYW5nZS5pc0VtcHR5P25bcl09cmEocyxlLHQsbCxvKTpzLnNlcTJSYW5nZS5pc0VtcHR5JiYobltyXT1yYShzLnN3YXAoKSx0LGUsbyxsKS5zd2FwKCkpfXJldHVybiBufWZ1bmN0aW9uIHJhKGUsdCxuLHIsaSl7bGV0IGE9MTtmb3IoO2Uuc2VxMVJhbmdlLnN0YXJ0LWE+PXIuc3RhcnQmJmUuc2VxMlJhbmdlLnN0YXJ0LWE+PWkuc3RhcnQmJm4uaXNTdHJvbmdseUVxdWFsKGUuc2VxMlJhbmdlLnN0YXJ0LWEsZS5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlLWEpJiZhPDEwMDspYSsrO2EtLTtsZXQgbD0wO2Zvcig7ZS5zZXExUmFuZ2Uuc3RhcnQrbDxyLmVuZEV4Y2x1c2l2ZSYmZS5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlK2w8aS5lbmRFeGNsdXNpdmUmJm4uaXNTdHJvbmdseUVxdWFsKGUuc2VxMlJhbmdlLnN0YXJ0K2wsZS5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlK2wpJiZsPDEwMDspbCsrO2lmKGE9PT0wJiZsPT09MClyZXR1cm4gZTtsZXQgbz0wLHU9LTE7Zm9yKGxldCBoPS1hO2g8PWw7aCsrKXtjb25zdCBmPWUuc2VxMlJhbmdlLnN0YXJ0K2gsZD1lLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUraCxtPWUuc2VxMVJhbmdlLnN0YXJ0K2gsZz10LmdldEJvdW5kYXJ5U2NvcmUobSkrbi5nZXRCb3VuZGFyeVNjb3JlKGYpK24uZ2V0Qm91bmRhcnlTY29yZShkKTtnPnUmJih1PWcsbz1oKX1yZXR1cm4gZS5kZWx0YShvKX1mdW5jdGlvbiBsYyhlLHQsbil7Y29uc3Qgcj1bXTtmb3IoY29uc3QgaSBvZiBuKXtjb25zdCBzPXJbci5sZW5ndGgtMV07aWYoIXMpe3IucHVzaChpKTtjb250aW51ZX1pLnNlcTFSYW5nZS5zdGFydC1zLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmU8PTJ8fGkuc2VxMlJhbmdlLnN0YXJ0LXMuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZTw9Mj9yW3IubGVuZ3RoLTFdPW5ldyBZKHMuc2VxMVJhbmdlLmpvaW4oaS5zZXExUmFuZ2UpLHMuc2VxMlJhbmdlLmpvaW4oaS5zZXEyUmFuZ2UpKTpyLnB1c2goaSl9cmV0dXJuIHJ9ZnVuY3Rpb24gdWMoZSx0LG4pe2NvbnN0IHI9WS5pbnZlcnQobixlLmxlbmd0aCksaT1bXTtsZXQgcz1uZXcgSGUoMCwwKTtmdW5jdGlvbiBhKG8sdSl7aWYoby5vZmZzZXQxPHMub2Zmc2V0MXx8by5vZmZzZXQyPHMub2Zmc2V0MilyZXR1cm47Y29uc3QgaD1lLmZpbmRXb3JkQ29udGFpbmluZyhvLm9mZnNldDEpLGY9dC5maW5kV29yZENvbnRhaW5pbmcoby5vZmZzZXQyKTtpZighaHx8IWYpcmV0dXJuO2xldCBkPW5ldyBZKGgsZik7Y29uc3QgbT1kLmludGVyc2VjdCh1KTtsZXQgZz1tLnNlcTFSYW5nZS5sZW5ndGgscD1tLnNlcTJSYW5nZS5sZW5ndGg7Zm9yKDtyLmxlbmd0aD4wOyl7Y29uc3QgeD1yWzBdO2lmKCEoeC5zZXExUmFuZ2UuaW50ZXJzZWN0cyhkLnNlcTFSYW5nZSl8fHguc2VxMlJhbmdlLmludGVyc2VjdHMoZC5zZXEyUmFuZ2UpKSlicmVhaztjb25zdCBMPWUuZmluZFdvcmRDb250YWluaW5nKHguc2VxMVJhbmdlLnN0YXJ0KSx2PXQuZmluZFdvcmRDb250YWluaW5nKHguc2VxMlJhbmdlLnN0YXJ0KSx5PW5ldyBZKEwsdiksYj15LmludGVyc2VjdCh4KTtpZihnKz1iLnNlcTFSYW5nZS5sZW5ndGgscCs9Yi5zZXEyUmFuZ2UubGVuZ3RoLGQ9ZC5qb2luKHkpLGQuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZT49eC5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlKXIuc2hpZnQoKTtlbHNlIGJyZWFrfWcrcDwoZC5zZXExUmFuZ2UubGVuZ3RoK2Quc2VxMlJhbmdlLmxlbmd0aCkqMi8zJiZpLnB1c2goZCkscz1kLmdldEVuZEV4Y2x1c2l2ZXMoKX1mb3IoO3IubGVuZ3RoPjA7KXtjb25zdCBvPXIuc2hpZnQoKTtvLnNlcTFSYW5nZS5pc0VtcHR5fHwoYShvLmdldFN0YXJ0cygpLG8pLGEoby5nZXRFbmRFeGNsdXNpdmVzKCkuZGVsdGEoLTEpLG8pKX1yZXR1cm4gY2MobixpKX1mdW5jdGlvbiBjYyhlLHQpe2NvbnN0IG49W107Zm9yKDtlLmxlbmd0aD4wfHx0Lmxlbmd0aD4wOyl7Y29uc3Qgcj1lWzBdLGk9dFswXTtsZXQgcztyJiYoIWl8fHIuc2VxMVJhbmdlLnN0YXJ0PGkuc2VxMVJhbmdlLnN0YXJ0KT9zPWUuc2hpZnQoKTpzPXQuc2hpZnQoKSxuLmxlbmd0aD4wJiZuW24ubGVuZ3RoLTFdLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmU+PXMuc2VxMVJhbmdlLnN0YXJ0P25bbi5sZW5ndGgtMV09bltuLmxlbmd0aC0xXS5qb2luKHMpOm4ucHVzaChzKX1yZXR1cm4gbn1mdW5jdGlvbiBmYyhlLHQsbil7bGV0IHI9bjtpZihyLmxlbmd0aD09PTApcmV0dXJuIHI7bGV0IGk9MCxzO2Rve3M9ITE7Y29uc3QgYT1bclswXV07Zm9yKGxldCBsPTE7bDxyLmxlbmd0aDtsKyspe2xldCBoPWZ1bmN0aW9uKGQsbSl7Y29uc3QgZz1uZXcgVyh1LnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUsby5zZXExUmFuZ2Uuc3RhcnQpO3JldHVybiBlLmdldFRleHQoZykucmVwbGFjZSgvXHMvZywiIikubGVuZ3RoPD00JiYoZC5zZXExUmFuZ2UubGVuZ3RoK2Quc2VxMlJhbmdlLmxlbmd0aD41fHxtLnNlcTFSYW5nZS5sZW5ndGgrbS5zZXEyUmFuZ2UubGVuZ3RoPjUpfTtjb25zdCBvPXJbbF0sdT1hW2EubGVuZ3RoLTFdO2godSxvKT8ocz0hMCxhW2EubGVuZ3RoLTFdPWFbYS5sZW5ndGgtMV0uam9pbihvKSk6YS5wdXNoKG8pfXI9YX13aGlsZShpKys8MTAmJnMpO3JldHVybiByfWZ1bmN0aW9uIGhjKGUsdCxuKXtsZXQgcj1uO2lmKHIubGVuZ3RoPT09MClyZXR1cm4gcjtsZXQgaT0wLHM7ZG97cz0hMTtjb25zdCBsPVtyWzBdXTtmb3IobGV0IG89MTtvPHIubGVuZ3RoO28rKyl7bGV0IGY9ZnVuY3Rpb24obSxnKXtjb25zdCBwPW5ldyBXKGguc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSx1LnNlcTFSYW5nZS5zdGFydCk7aWYoZS5jb3VudExpbmVzSW4ocCk+NXx8cC5sZW5ndGg+NTAwKXJldHVybiExO2NvbnN0IHc9ZS5nZXRUZXh0KHApLnRyaW0oKTtpZih3Lmxlbmd0aD4yMHx8dy5zcGxpdCgvXHJcbnxccnxcbi8pLmxlbmd0aD4xKXJldHVybiExO2NvbnN0IEw9ZS5jb3VudExpbmVzSW4obS5zZXExUmFuZ2UpLHY9bS5zZXExUmFuZ2UubGVuZ3RoLHk9dC5jb3VudExpbmVzSW4obS5zZXEyUmFuZ2UpLGI9bS5zZXEyUmFuZ2UubGVuZ3RoLF89ZS5jb3VudExpbmVzSW4oZy5zZXExUmFuZ2UpLEE9Zy5zZXExUmFuZ2UubGVuZ3RoLEM9dC5jb3VudExpbmVzSW4oZy5zZXEyUmFuZ2UpLEY9Zy5zZXEyUmFuZ2UubGVuZ3RoLE89Mio0MCs1MDtmdW5jdGlvbiBNKE4pe3JldHVybiBNYXRoLm1pbihOLE8pfXJldHVybiBNYXRoLnBvdyhNYXRoLnBvdyhNKEwqNDArdiksMS41KStNYXRoLnBvdyhNKHkqNDArYiksMS41KSwxLjUpK01hdGgucG93KE1hdGgucG93KE0oXyo0MCtBKSwxLjUpK01hdGgucG93KE0oQyo0MCtGKSwxLjUpLDEuNSk+KE8qKjEuNSkqKjEuNSoxLjN9O2NvbnN0IHU9cltvXSxoPWxbbC5sZW5ndGgtMV07ZihoLHUpPyhzPSEwLGxbbC5sZW5ndGgtMV09bFtsLmxlbmd0aC0xXS5qb2luKHUpKTpsLnB1c2godSl9cj1sfXdoaWxlKGkrKzwxMCYmcyk7Y29uc3QgYT1bXTtyZXR1cm4gR3UociwobCxvLHUpPT57bGV0IGg9bztmdW5jdGlvbiBmKHcpe3JldHVybiB3Lmxlbmd0aD4wJiZ3LnRyaW0oKS5sZW5ndGg8PTMmJm8uc2VxMVJhbmdlLmxlbmd0aCtvLnNlcTJSYW5nZS5sZW5ndGg+MTAwfWNvbnN0IGQ9ZS5leHRlbmRUb0Z1bGxMaW5lcyhvLnNlcTFSYW5nZSksbT1lLmdldFRleHQobmV3IFcoZC5zdGFydCxvLnNlcTFSYW5nZS5zdGFydCkpO2YobSkmJihoPWguZGVsdGFTdGFydCgtbS5sZW5ndGgpKTtjb25zdCBnPWUuZ2V0VGV4dChuZXcgVyhvLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUsZC5lbmRFeGNsdXNpdmUpKTtmKGcpJiYoaD1oLmRlbHRhRW5kKGcubGVuZ3RoKSk7Y29uc3QgcD1ZLmZyb21PZmZzZXRQYWlycyhsP2wuZ2V0RW5kRXhjbHVzaXZlcygpOkhlLnplcm8sdT91LmdldFN0YXJ0cygpOkhlLm1heCkseD1oLmludGVyc2VjdChwKTthLmxlbmd0aD4wJiZ4LmdldFN0YXJ0cygpLmVxdWFscyhhW2EubGVuZ3RoLTFdLmdldEVuZEV4Y2x1c2l2ZXMoKSk/YVthLmxlbmd0aC0xXT1hW2EubGVuZ3RoLTFdLmpvaW4oeCk6YS5wdXNoKHgpfSksYX1jbGFzcyBpYXtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMudHJpbW1lZEhhc2g9dCx0aGlzLmxpbmVzPW59Z2V0RWxlbWVudCh0KXtyZXR1cm4gdGhpcy50cmltbWVkSGFzaFt0XX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMudHJpbW1lZEhhc2gubGVuZ3RofWdldEJvdW5kYXJ5U2NvcmUodCl7Y29uc3Qgbj10PT09MD8wOnNhKHRoaXMubGluZXNbdC0xXSkscj10PT09dGhpcy5saW5lcy5sZW5ndGg/MDpzYSh0aGlzLmxpbmVzW3RdKTtyZXR1cm4gMWUzLShuK3IpfWdldFRleHQodCl7cmV0dXJuIHRoaXMubGluZXMuc2xpY2UodC5zdGFydCx0LmVuZEV4Y2x1c2l2ZSkuam9pbihgCmApfWlzU3Ryb25nbHlFcXVhbCh0LG4pe3JldHVybiB0aGlzLmxpbmVzW3RdPT09dGhpcy5saW5lc1tuXX19ZnVuY3Rpb24gc2EoZSl7bGV0IHQ9MDtmb3IoO3Q8ZS5sZW5ndGgmJihlLmNoYXJDb2RlQXQodCk9PT0zMnx8ZS5jaGFyQ29kZUF0KHQpPT09OSk7KXQrKztyZXR1cm4gdH1jbGFzcyBkY3tjb25zdHJ1Y3Rvcigpe3RoaXMuZHluYW1pY1Byb2dyYW1taW5nRGlmZmluZz1uZXcgWXUsdGhpcy5teWVyc0RpZmZpbmdBbGdvcml0aG09bmV3IFFzfWNvbXB1dGVEaWZmKHQsbixyKXtpZih0Lmxlbmd0aDw9MSYmV3UodCxuLChiLF8pPT5iPT09XykpcmV0dXJuIG5ldyB4bihbXSxbXSwhMSk7aWYodC5sZW5ndGg9PT0xJiZ0WzBdLmxlbmd0aD09PTB8fG4ubGVuZ3RoPT09MSYmblswXS5sZW5ndGg9PT0wKXJldHVybiBuZXcgeG4oW25ldyBqZShuZXcgVSgxLHQubGVuZ3RoKzEpLG5ldyBVKDEsbi5sZW5ndGgrMSksW25ldyBSZShuZXcgeigxLDEsdC5sZW5ndGgsdFt0Lmxlbmd0aC0xXS5sZW5ndGgrMSksbmV3IHooMSwxLG4ubGVuZ3RoLG5bbi5sZW5ndGgtMV0ubGVuZ3RoKzEpKV0pXSxbXSwhMSk7Y29uc3QgaT1yLm1heENvbXB1dGF0aW9uVGltZU1zPT09MD96dC5pbnN0YW5jZTpuZXcgUXUoci5tYXhDb21wdXRhdGlvblRpbWVNcykscz0hci5pZ25vcmVUcmltV2hpdGVzcGFjZSxhPW5ldyBNYXA7ZnVuY3Rpb24gbChiKXtsZXQgXz1hLmdldChiKTtyZXR1cm4gXz09PXZvaWQgMCYmKF89YS5zaXplLGEuc2V0KGIsXykpLF99Y29uc3Qgbz10Lm1hcChiPT5sKGIudHJpbSgpKSksdT1uLm1hcChiPT5sKGIudHJpbSgpKSksaD1uZXcgaWEobyx0KSxmPW5ldyBpYSh1LG4pLGQ9aC5sZW5ndGgrZi5sZW5ndGg8MTcwMD90aGlzLmR5bmFtaWNQcm9ncmFtbWluZ0RpZmZpbmcuY29tcHV0ZShoLGYsaSwoYixfKT0+dFtiXT09PW5bX10/bltfXS5sZW5ndGg9PT0wPy4xOjErTWF0aC5sb2coMStuW19dLmxlbmd0aCk6Ljk5KTp0aGlzLm15ZXJzRGlmZmluZ0FsZ29yaXRobS5jb21wdXRlKGgsZixpKTtsZXQgbT1kLmRpZmZzLGc9ZC5oaXRUaW1lb3V0O209dGEoaCxmLG0pLG09ZmMoaCxmLG0pO2NvbnN0IHA9W10seD1iPT57aWYocylmb3IobGV0IF89MDtfPGI7XysrKXtjb25zdCBBPXcrXyxDPUwrXztpZih0W0FdIT09bltDXSl7Y29uc3QgRj10aGlzLnJlZmluZURpZmYodCxuLG5ldyBZKG5ldyBXKEEsQSsxKSxuZXcgVyhDLEMrMSkpLGkscyk7Zm9yKGNvbnN0IE8gb2YgRi5tYXBwaW5ncylwLnB1c2goTyk7Ri5oaXRUaW1lb3V0JiYoZz0hMCl9fX07bGV0IHc9MCxMPTA7Zm9yKGNvbnN0IGIgb2YgbSl7dm4oKCk9PmIuc2VxMVJhbmdlLnN0YXJ0LXc9PT1iLnNlcTJSYW5nZS5zdGFydC1MKTtjb25zdCBfPWIuc2VxMVJhbmdlLnN0YXJ0LXc7eChfKSx3PWIuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSxMPWIuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZTtjb25zdCBBPXRoaXMucmVmaW5lRGlmZih0LG4sYixpLHMpO0EuaGl0VGltZW91dCYmKGc9ITApO2Zvcihjb25zdCBDIG9mIEEubWFwcGluZ3MpcC5wdXNoKEMpfXgodC5sZW5ndGgtdyk7Y29uc3Qgdj1hYShwLHQsbik7bGV0IHk9W107cmV0dXJuIHIuY29tcHV0ZU1vdmVzJiYoeT10aGlzLmNvbXB1dGVNb3Zlcyh2LHQsbixvLHUsaSxzKSksdm4oKCk9PntmdW5jdGlvbiBiKEEsQyl7aWYoQS5saW5lTnVtYmVyPDF8fEEubGluZU51bWJlcj5DLmxlbmd0aClyZXR1cm4hMTtjb25zdCBGPUNbQS5saW5lTnVtYmVyLTFdO3JldHVybiEoQS5jb2x1bW48MXx8QS5jb2x1bW4+Ri5sZW5ndGgrMSl9ZnVuY3Rpb24gXyhBLEMpe3JldHVybiEoQS5zdGFydExpbmVOdW1iZXI8MXx8QS5zdGFydExpbmVOdW1iZXI+Qy5sZW5ndGgrMXx8QS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPDF8fEEuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT5DLmxlbmd0aCsxKX1mb3IoY29uc3QgQSBvZiB2KXtpZighQS5pbm5lckNoYW5nZXMpcmV0dXJuITE7Zm9yKGNvbnN0IEMgb2YgQS5pbm5lckNoYW5nZXMpaWYoIShiKEMubW9kaWZpZWRSYW5nZS5nZXRTdGFydFBvc2l0aW9uKCksbikmJmIoQy5tb2RpZmllZFJhbmdlLmdldEVuZFBvc2l0aW9uKCksbikmJmIoQy5vcmlnaW5hbFJhbmdlLmdldFN0YXJ0UG9zaXRpb24oKSx0KSYmYihDLm9yaWdpbmFsUmFuZ2UuZ2V0RW5kUG9zaXRpb24oKSx0KSkpcmV0dXJuITE7aWYoIV8oQS5tb2RpZmllZCxuKXx8IV8oQS5vcmlnaW5hbCx0KSlyZXR1cm4hMX1yZXR1cm4hMH0pLG5ldyB4bih2LHksZyl9Y29tcHV0ZU1vdmVzKHQsbixyLGkscyxhLGwpe3JldHVybiB0Yyh0LG4scixpLHMsYSkubWFwKGg9Pntjb25zdCBmPXRoaXMucmVmaW5lRGlmZihuLHIsbmV3IFkoaC5vcmlnaW5hbC50b09mZnNldFJhbmdlKCksaC5tb2RpZmllZC50b09mZnNldFJhbmdlKCkpLGEsbCksZD1hYShmLm1hcHBpbmdzLG4sciwhMCk7cmV0dXJuIG5ldyBWdShoLGQpfSl9cmVmaW5lRGlmZih0LG4scixpLHMpe2NvbnN0IGw9Z2MocikudG9SYW5nZU1hcHBpbmcyKHQsbiksbz1uZXcgTm4odCxsLm9yaWdpbmFsUmFuZ2UscyksdT1uZXcgTm4obixsLm1vZGlmaWVkUmFuZ2UscyksaD1vLmxlbmd0aCt1Lmxlbmd0aDw1MDA/dGhpcy5keW5hbWljUHJvZ3JhbW1pbmdEaWZmaW5nLmNvbXB1dGUobyx1LGkpOnRoaXMubXllcnNEaWZmaW5nQWxnb3JpdGhtLmNvbXB1dGUobyx1LGkpO2xldCBmPWguZGlmZnM7cmV0dXJuIGY9dGEobyx1LGYpLGY9dWMobyx1LGYpLGY9bGMobyx1LGYpLGY9aGMobyx1LGYpLHttYXBwaW5nczpmLm1hcChtPT5uZXcgUmUoby50cmFuc2xhdGVSYW5nZShtLnNlcTFSYW5nZSksdS50cmFuc2xhdGVSYW5nZShtLnNlcTJSYW5nZSkpKSxoaXRUaW1lb3V0OmguaGl0VGltZW91dH19fWZ1bmN0aW9uIGFhKGUsdCxuLHI9ITEpe2NvbnN0IGk9W107Zm9yKGNvbnN0IHMgb2YgSHUoZS5tYXAoYT0+bWMoYSx0LG4pKSwoYSxsKT0+YS5vcmlnaW5hbC5vdmVybGFwT3JUb3VjaChsLm9yaWdpbmFsKXx8YS5tb2RpZmllZC5vdmVybGFwT3JUb3VjaChsLm1vZGlmaWVkKSkpe2NvbnN0IGE9c1swXSxsPXNbcy5sZW5ndGgtMV07aS5wdXNoKG5ldyBqZShhLm9yaWdpbmFsLmpvaW4obC5vcmlnaW5hbCksYS5tb2RpZmllZC5qb2luKGwubW9kaWZpZWQpLHMubWFwKG89Pm8uaW5uZXJDaGFuZ2VzWzBdKSkpfXJldHVybiB2bigoKT0+IXImJmkubGVuZ3RoPjAmJihpWzBdLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlciE9PWlbMF0ub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyfHxuLmxlbmd0aC1pW2kubGVuZ3RoLTFdLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUhPT10Lmxlbmd0aC1pW2kubGVuZ3RoLTFdLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpPyExOk9zKGksKHMsYSk9PmEub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLXMub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT09PWEubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLXMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSYmcy5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPGEub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyJiZzLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU8YS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIpKSxpfWZ1bmN0aW9uIG1jKGUsdCxuKXtsZXQgcj0wLGk9MDtlLm1vZGlmaWVkUmFuZ2UuZW5kQ29sdW1uPT09MSYmZS5vcmlnaW5hbFJhbmdlLmVuZENvbHVtbj09PTEmJmUub3JpZ2luYWxSYW5nZS5zdGFydExpbmVOdW1iZXIrcjw9ZS5vcmlnaW5hbFJhbmdlLmVuZExpbmVOdW1iZXImJmUubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXIrcjw9ZS5tb2RpZmllZFJhbmdlLmVuZExpbmVOdW1iZXImJihpPS0xKSxlLm1vZGlmaWVkUmFuZ2Uuc3RhcnRDb2x1bW4tMT49bltlLm1vZGlmaWVkUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLTFdLmxlbmd0aCYmZS5vcmlnaW5hbFJhbmdlLnN0YXJ0Q29sdW1uLTE+PXRbZS5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlci0xXS5sZW5ndGgmJmUub3JpZ2luYWxSYW5nZS5zdGFydExpbmVOdW1iZXI8PWUub3JpZ2luYWxSYW5nZS5lbmRMaW5lTnVtYmVyK2kmJmUubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXI8PWUubW9kaWZpZWRSYW5nZS5lbmRMaW5lTnVtYmVyK2kmJihyPTEpO2NvbnN0IHM9bmV3IFUoZS5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlcityLGUub3JpZ2luYWxSYW5nZS5lbmRMaW5lTnVtYmVyKzEraSksYT1uZXcgVShlLm1vZGlmaWVkUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyK3IsZS5tb2RpZmllZFJhbmdlLmVuZExpbmVOdW1iZXIrMStpKTtyZXR1cm4gbmV3IGplKHMsYSxbZV0pfWZ1bmN0aW9uIGdjKGUpe3JldHVybiBuZXcgTGUobmV3IFUoZS5zZXExUmFuZ2Uuc3RhcnQrMSxlLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUrMSksbmV3IFUoZS5zZXEyUmFuZ2Uuc3RhcnQrMSxlLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUrMSkpfWNvbnN0IG9hPXtnZXRMZWdhY3k6KCk9Pm5ldyBVdSxnZXREZWZhdWx0OigpPT5uZXcgZGN9O2Z1bmN0aW9uIEtlKGUsdCl7Y29uc3Qgbj1NYXRoLnBvdygxMCx0KTtyZXR1cm4gTWF0aC5yb3VuZChlKm4pL259Y2xhc3MgYWV7Y29uc3RydWN0b3IodCxuLHIsaT0xKXt0aGlzLl9yZ2JhQnJhbmQ9dm9pZCAwLHRoaXMucj1NYXRoLm1pbigyNTUsTWF0aC5tYXgoMCx0KSl8MCx0aGlzLmc9TWF0aC5taW4oMjU1LE1hdGgubWF4KDAsbikpfDAsdGhpcy5iPU1hdGgubWluKDI1NSxNYXRoLm1heCgwLHIpKXwwLHRoaXMuYT1LZShNYXRoLm1heChNYXRoLm1pbigxLGkpLDApLDMpfXN0YXRpYyBlcXVhbHModCxuKXtyZXR1cm4gdC5yPT09bi5yJiZ0Lmc9PT1uLmcmJnQuYj09PW4uYiYmdC5hPT09bi5hfX1jbGFzcyBOZXtjb25zdHJ1Y3Rvcih0LG4scixpKXt0aGlzLl9oc2xhQnJhbmQ9dm9pZCAwLHRoaXMuaD1NYXRoLm1heChNYXRoLm1pbigzNjAsdCksMCl8MCx0aGlzLnM9S2UoTWF0aC5tYXgoTWF0aC5taW4oMSxuKSwwKSwzKSx0aGlzLmw9S2UoTWF0aC5tYXgoTWF0aC5taW4oMSxyKSwwKSwzKSx0aGlzLmE9S2UoTWF0aC5tYXgoTWF0aC5taW4oMSxpKSwwKSwzKX1zdGF0aWMgZXF1YWxzKHQsbil7cmV0dXJuIHQuaD09PW4uaCYmdC5zPT09bi5zJiZ0Lmw9PT1uLmwmJnQuYT09PW4uYX1zdGF0aWMgZnJvbVJHQkEodCl7Y29uc3Qgbj10LnIvMjU1LHI9dC5nLzI1NSxpPXQuYi8yNTUscz10LmEsYT1NYXRoLm1heChuLHIsaSksbD1NYXRoLm1pbihuLHIsaSk7bGV0IG89MCx1PTA7Y29uc3QgaD0obCthKS8yLGY9YS1sO2lmKGY+MCl7c3dpdGNoKHU9TWF0aC5taW4oaDw9LjU/Zi8oMipoKTpmLygyLTIqaCksMSksYSl7Y2FzZSBuOm89KHItaSkvZisocjxpPzY6MCk7YnJlYWs7Y2FzZSByOm89KGktbikvZisyO2JyZWFrO2Nhc2UgaTpvPShuLXIpL2YrNDticmVha31vKj02MCxvPU1hdGgucm91bmQobyl9cmV0dXJuIG5ldyBOZShvLHUsaCxzKX1zdGF0aWMgX2h1ZTJyZ2IodCxuLHIpe3JldHVybiByPDAmJihyKz0xKSxyPjEmJihyLT0xKSxyPDEvNj90KyhuLXQpKjYqcjpyPDEvMj9uOnI8Mi8zP3QrKG4tdCkqKDIvMy1yKSo2OnR9c3RhdGljIHRvUkdCQSh0KXtjb25zdCBuPXQuaC8zNjAse3M6cixsOmksYTpzfT10O2xldCBhLGwsbztpZihyPT09MClhPWw9bz1pO2Vsc2V7Y29uc3QgdT1pPC41P2kqKDErcik6aStyLWkqcixoPTIqaS11O2E9TmUuX2h1ZTJyZ2IoaCx1LG4rMS8zKSxsPU5lLl9odWUycmdiKGgsdSxuKSxvPU5lLl9odWUycmdiKGgsdSxuLTEvMyl9cmV0dXJuIG5ldyBhZShNYXRoLnJvdW5kKGEqMjU1KSxNYXRoLnJvdW5kKGwqMjU1KSxNYXRoLnJvdW5kKG8qMjU1KSxzKX19Y2xhc3MgTnR7Y29uc3RydWN0b3IodCxuLHIsaSl7dGhpcy5faHN2YUJyYW5kPXZvaWQgMCx0aGlzLmg9TWF0aC5tYXgoTWF0aC5taW4oMzYwLHQpLDApfDAsdGhpcy5zPUtlKE1hdGgubWF4KE1hdGgubWluKDEsbiksMCksMyksdGhpcy52PUtlKE1hdGgubWF4KE1hdGgubWluKDEsciksMCksMyksdGhpcy5hPUtlKE1hdGgubWF4KE1hdGgubWluKDEsaSksMCksMyl9c3RhdGljIGVxdWFscyh0LG4pe3JldHVybiB0Lmg9PT1uLmgmJnQucz09PW4ucyYmdC52PT09bi52JiZ0LmE9PT1uLmF9c3RhdGljIGZyb21SR0JBKHQpe2NvbnN0IG49dC5yLzI1NSxyPXQuZy8yNTUsaT10LmIvMjU1LHM9TWF0aC5tYXgobixyLGkpLGE9TWF0aC5taW4obixyLGkpLGw9cy1hLG89cz09PTA/MDpsL3M7bGV0IHU7cmV0dXJuIGw9PT0wP3U9MDpzPT09bj91PSgoci1pKS9sJTYrNiklNjpzPT09cj91PShpLW4pL2wrMjp1PShuLXIpL2wrNCxuZXcgTnQoTWF0aC5yb3VuZCh1KjYwKSxvLHMsdC5hKX1zdGF0aWMgdG9SR0JBKHQpe2NvbnN0e2g6bixzOnIsdjppLGE6c309dCxhPWkqcixsPWEqKDEtTWF0aC5hYnMobi82MCUyLTEpKSxvPWktYTtsZXRbdSxoLGZdPVswLDAsMF07cmV0dXJuIG48NjA/KHU9YSxoPWwpOm48MTIwPyh1PWwsaD1hKTpuPDE4MD8oaD1hLGY9bCk6bjwyNDA/KGg9bCxmPWEpOm48MzAwPyh1PWwsZj1hKTpuPD0zNjAmJih1PWEsZj1sKSx1PU1hdGgucm91bmQoKHUrbykqMjU1KSxoPU1hdGgucm91bmQoKGgrbykqMjU1KSxmPU1hdGgucm91bmQoKGYrbykqMjU1KSxuZXcgYWUodSxoLGYscyl9fWxldCBTbj0oRz1jbGFzc3tzdGF0aWMgZnJvbUhleCh0KXtyZXR1cm4gRy5Gb3JtYXQuQ1NTLnBhcnNlSGV4KHQpfHxHLnJlZH1zdGF0aWMgZXF1YWxzKHQsbil7cmV0dXJuIXQmJiFuPyEwOiF0fHwhbj8hMTp0LmVxdWFscyhuKX1nZXQgaHNsYSgpe3JldHVybiB0aGlzLl9oc2xhP3RoaXMuX2hzbGE6TmUuZnJvbVJHQkEodGhpcy5yZ2JhKX1nZXQgaHN2YSgpe3JldHVybiB0aGlzLl9oc3ZhP3RoaXMuX2hzdmE6TnQuZnJvbVJHQkEodGhpcy5yZ2JhKX1jb25zdHJ1Y3Rvcih0KXtpZih0KWlmKHQgaW5zdGFuY2VvZiBhZSl0aGlzLnJnYmE9dDtlbHNlIGlmKHQgaW5zdGFuY2VvZiBOZSl0aGlzLl9oc2xhPXQsdGhpcy5yZ2JhPU5lLnRvUkdCQSh0KTtlbHNlIGlmKHQgaW5zdGFuY2VvZiBOdCl0aGlzLl9oc3ZhPXQsdGhpcy5yZ2JhPU50LnRvUkdCQSh0KTtlbHNlIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2xvciBjdG9yIGFyZ3VtZW50Iik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNvbG9yIG5lZWRzIGEgdmFsdWUiKX1lcXVhbHModCl7cmV0dXJuISF0JiZhZS5lcXVhbHModGhpcy5yZ2JhLHQucmdiYSkmJk5lLmVxdWFscyh0aGlzLmhzbGEsdC5oc2xhKSYmTnQuZXF1YWxzKHRoaXMuaHN2YSx0LmhzdmEpfWdldFJlbGF0aXZlTHVtaW5hbmNlKCl7Y29uc3QgdD1HLl9yZWxhdGl2ZUx1bWluYW5jZUZvckNvbXBvbmVudCh0aGlzLnJnYmEuciksbj1HLl9yZWxhdGl2ZUx1bWluYW5jZUZvckNvbXBvbmVudCh0aGlzLnJnYmEuZykscj1HLl9yZWxhdGl2ZUx1bWluYW5jZUZvckNvbXBvbmVudCh0aGlzLnJnYmEuYiksaT0uMjEyNip0Ky43MTUyKm4rLjA3MjIqcjtyZXR1cm4gS2UoaSw0KX1zdGF0aWMgX3JlbGF0aXZlTHVtaW5hbmNlRm9yQ29tcG9uZW50KHQpe2NvbnN0IG49dC8yNTU7cmV0dXJuIG48PS4wMzkyOD9uLzEyLjkyOk1hdGgucG93KChuKy4wNTUpLzEuMDU1LDIuNCl9aXNMaWdodGVyKCl7cmV0dXJuKHRoaXMucmdiYS5yKjI5OSt0aGlzLnJnYmEuZyo1ODcrdGhpcy5yZ2JhLmIqMTE0KS8xZTM+PTEyOH1pc0xpZ2h0ZXJUaGFuKHQpe2NvbnN0IG49dGhpcy5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLHI9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiBuPnJ9aXNEYXJrZXJUaGFuKHQpe2NvbnN0IG49dGhpcy5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLHI9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiBuPHJ9bGlnaHRlbih0KXtyZXR1cm4gbmV3IEcobmV3IE5lKHRoaXMuaHNsYS5oLHRoaXMuaHNsYS5zLHRoaXMuaHNsYS5sK3RoaXMuaHNsYS5sKnQsdGhpcy5oc2xhLmEpKX1kYXJrZW4odCl7cmV0dXJuIG5ldyBHKG5ldyBOZSh0aGlzLmhzbGEuaCx0aGlzLmhzbGEucyx0aGlzLmhzbGEubC10aGlzLmhzbGEubCp0LHRoaXMuaHNsYS5hKSl9dHJhbnNwYXJlbnQodCl7Y29uc3R7cjpuLGc6cixiOmksYTpzfT10aGlzLnJnYmE7cmV0dXJuIG5ldyBHKG5ldyBhZShuLHIsaSxzKnQpKX1pc1RyYW5zcGFyZW50KCl7cmV0dXJuIHRoaXMucmdiYS5hPT09MH1pc09wYXF1ZSgpe3JldHVybiB0aGlzLnJnYmEuYT09PTF9b3Bwb3NpdGUoKXtyZXR1cm4gbmV3IEcobmV3IGFlKDI1NS10aGlzLnJnYmEuciwyNTUtdGhpcy5yZ2JhLmcsMjU1LXRoaXMucmdiYS5iLHRoaXMucmdiYS5hKSl9bWFrZU9wYXF1ZSh0KXtpZih0aGlzLmlzT3BhcXVlKCl8fHQucmdiYS5hIT09MSlyZXR1cm4gdGhpcztjb25zdHtyOm4sZzpyLGI6aSxhOnN9PXRoaXMucmdiYTtyZXR1cm4gbmV3IEcobmV3IGFlKHQucmdiYS5yLXMqKHQucmdiYS5yLW4pLHQucmdiYS5nLXMqKHQucmdiYS5nLXIpLHQucmdiYS5iLXMqKHQucmdiYS5iLWkpLDEpKX10b1N0cmluZygpe3JldHVybiB0aGlzLl90b1N0cmluZ3x8KHRoaXMuX3RvU3RyaW5nPUcuRm9ybWF0LkNTUy5mb3JtYXQodGhpcykpLHRoaXMuX3RvU3RyaW5nfXN0YXRpYyBnZXRMaWdodGVyQ29sb3IodCxuLHIpe2lmKHQuaXNMaWdodGVyVGhhbihuKSlyZXR1cm4gdDtyPXJ8fC41O2NvbnN0IGk9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLHM9bi5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiByPXIqKHMtaSkvcyx0LmxpZ2h0ZW4ocil9c3RhdGljIGdldERhcmtlckNvbG9yKHQsbixyKXtpZih0LmlzRGFya2VyVGhhbihuKSlyZXR1cm4gdDtyPXJ8fC41O2NvbnN0IGk9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLHM9bi5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiByPXIqKGktcykvaSx0LmRhcmtlbihyKX19LEcud2hpdGU9bmV3IEcobmV3IGFlKDI1NSwyNTUsMjU1LDEpKSxHLmJsYWNrPW5ldyBHKG5ldyBhZSgwLDAsMCwxKSksRy5yZWQ9bmV3IEcobmV3IGFlKDI1NSwwLDAsMSkpLEcuYmx1ZT1uZXcgRyhuZXcgYWUoMCwwLDI1NSwxKSksRy5ncmVlbj1uZXcgRyhuZXcgYWUoMCwyNTUsMCwxKSksRy5jeWFuPW5ldyBHKG5ldyBhZSgwLDI1NSwyNTUsMSkpLEcubGlnaHRncmV5PW5ldyBHKG5ldyBhZSgyMTEsMjExLDIxMSwxKSksRy50cmFuc3BhcmVudD1uZXcgRyhuZXcgYWUoMCwwLDAsMCkpLEcpOyhmdW5jdGlvbihlKXsoZnVuY3Rpb24odCl7KGZ1bmN0aW9uKG4pe2Z1bmN0aW9uIHIobSl7cmV0dXJuIG0ucmdiYS5hPT09MT9gcmdiKCR7bS5yZ2JhLnJ9LCAke20ucmdiYS5nfSwgJHttLnJnYmEuYn0pYDplLkZvcm1hdC5DU1MuZm9ybWF0UkdCQShtKX1uLmZvcm1hdFJHQj1yO2Z1bmN0aW9uIGkobSl7cmV0dXJuYHJnYmEoJHttLnJnYmEucn0sICR7bS5yZ2JhLmd9LCAke20ucmdiYS5ifSwgJHsrbS5yZ2JhLmEudG9GaXhlZCgyKX0pYH1uLmZvcm1hdFJHQkE9aTtmdW5jdGlvbiBzKG0pe3JldHVybiBtLmhzbGEuYT09PTE/YGhzbCgke20uaHNsYS5ofSwgJHsobS5oc2xhLnMqMTAwKS50b0ZpeGVkKDIpfSUsICR7KG0uaHNsYS5sKjEwMCkudG9GaXhlZCgyKX0lKWA6ZS5Gb3JtYXQuQ1NTLmZvcm1hdEhTTEEobSl9bi5mb3JtYXRIU0w9cztmdW5jdGlvbiBhKG0pe3JldHVybmBoc2xhKCR7bS5oc2xhLmh9LCAkeyhtLmhzbGEucyoxMDApLnRvRml4ZWQoMil9JSwgJHsobS5oc2xhLmwqMTAwKS50b0ZpeGVkKDIpfSUsICR7bS5oc2xhLmEudG9GaXhlZCgyKX0pYH1uLmZvcm1hdEhTTEE9YTtmdW5jdGlvbiBsKG0pe2NvbnN0IGc9bS50b1N0cmluZygxNik7cmV0dXJuIGcubGVuZ3RoIT09Mj8iMCIrZzpnfWZ1bmN0aW9uIG8obSl7cmV0dXJuYCMke2wobS5yZ2JhLnIpfSR7bChtLnJnYmEuZyl9JHtsKG0ucmdiYS5iKX1gfW4uZm9ybWF0SGV4PW87ZnVuY3Rpb24gdShtLGc9ITEpe3JldHVybiBnJiZtLnJnYmEuYT09PTE/ZS5Gb3JtYXQuQ1NTLmZvcm1hdEhleChtKTpgIyR7bChtLnJnYmEucil9JHtsKG0ucmdiYS5nKX0ke2wobS5yZ2JhLmIpfSR7bChNYXRoLnJvdW5kKG0ucmdiYS5hKjI1NSkpfWB9bi5mb3JtYXRIZXhBPXU7ZnVuY3Rpb24gaChtKXtyZXR1cm4gbS5pc09wYXF1ZSgpP2UuRm9ybWF0LkNTUy5mb3JtYXRIZXgobSk6ZS5Gb3JtYXQuQ1NTLmZvcm1hdFJHQkEobSl9bi5mb3JtYXQ9aDtmdW5jdGlvbiBmKG0pe2NvbnN0IGc9bS5sZW5ndGg7aWYoZz09PTB8fG0uY2hhckNvZGVBdCgwKSE9PTM1KXJldHVybiBudWxsO2lmKGc9PT03KXtjb25zdCBwPTE2KmQobS5jaGFyQ29kZUF0KDEpKStkKG0uY2hhckNvZGVBdCgyKSkseD0xNipkKG0uY2hhckNvZGVBdCgzKSkrZChtLmNoYXJDb2RlQXQoNCkpLHc9MTYqZChtLmNoYXJDb2RlQXQoNSkpK2QobS5jaGFyQ29kZUF0KDYpKTtyZXR1cm4gbmV3IGUobmV3IGFlKHAseCx3LDEpKX1pZihnPT09OSl7Y29uc3QgcD0xNipkKG0uY2hhckNvZGVBdCgxKSkrZChtLmNoYXJDb2RlQXQoMikpLHg9MTYqZChtLmNoYXJDb2RlQXQoMykpK2QobS5jaGFyQ29kZUF0KDQpKSx3PTE2KmQobS5jaGFyQ29kZUF0KDUpKStkKG0uY2hhckNvZGVBdCg2KSksTD0xNipkKG0uY2hhckNvZGVBdCg3KSkrZChtLmNoYXJDb2RlQXQoOCkpO3JldHVybiBuZXcgZShuZXcgYWUocCx4LHcsTC8yNTUpKX1pZihnPT09NCl7Y29uc3QgcD1kKG0uY2hhckNvZGVBdCgxKSkseD1kKG0uY2hhckNvZGVBdCgyKSksdz1kKG0uY2hhckNvZGVBdCgzKSk7cmV0dXJuIG5ldyBlKG5ldyBhZSgxNipwK3AsMTYqeCt4LDE2KncrdykpfWlmKGc9PT01KXtjb25zdCBwPWQobS5jaGFyQ29kZUF0KDEpKSx4PWQobS5jaGFyQ29kZUF0KDIpKSx3PWQobS5jaGFyQ29kZUF0KDMpKSxMPWQobS5jaGFyQ29kZUF0KDQpKTtyZXR1cm4gbmV3IGUobmV3IGFlKDE2KnArcCwxNip4K3gsMTYqdyt3LCgxNipMK0wpLzI1NSkpfXJldHVybiBudWxsfW4ucGFyc2VIZXg9ZjtmdW5jdGlvbiBkKG0pe3N3aXRjaChtKXtjYXNlIDQ4OnJldHVybiAwO2Nhc2UgNDk6cmV0dXJuIDE7Y2FzZSA1MDpyZXR1cm4gMjtjYXNlIDUxOnJldHVybiAzO2Nhc2UgNTI6cmV0dXJuIDQ7Y2FzZSA1MzpyZXR1cm4gNTtjYXNlIDU0OnJldHVybiA2O2Nhc2UgNTU6cmV0dXJuIDc7Y2FzZSA1NjpyZXR1cm4gODtjYXNlIDU3OnJldHVybiA5O2Nhc2UgOTc6cmV0dXJuIDEwO2Nhc2UgNjU6cmV0dXJuIDEwO2Nhc2UgOTg6cmV0dXJuIDExO2Nhc2UgNjY6cmV0dXJuIDExO2Nhc2UgOTk6cmV0dXJuIDEyO2Nhc2UgNjc6cmV0dXJuIDEyO2Nhc2UgMTAwOnJldHVybiAxMztjYXNlIDY4OnJldHVybiAxMztjYXNlIDEwMTpyZXR1cm4gMTQ7Y2FzZSA2OTpyZXR1cm4gMTQ7Y2FzZSAxMDI6cmV0dXJuIDE1O2Nhc2UgNzA6cmV0dXJuIDE1fXJldHVybiAwfX0pKHQuQ1NTfHwodC5DU1M9e30pKX0pKGUuRm9ybWF0fHwoZS5Gb3JtYXQ9e30pKX0pKFNufHwoU249e30pKTtmdW5jdGlvbiBsYShlKXtjb25zdCB0PVtdO2Zvcihjb25zdCBuIG9mIGUpe2NvbnN0IHI9TnVtYmVyKG4pOyhyfHxyPT09MCYmbi5yZXBsYWNlKC9ccy9nLCIiKSE9PSIiKSYmdC5wdXNoKHIpfXJldHVybiB0fWZ1bmN0aW9uIFJyKGUsdCxuLHIpe3JldHVybntyZWQ6ZS8yNTUsYmx1ZTpuLzI1NSxncmVlbjp0LzI1NSxhbHBoYTpyfX1mdW5jdGlvbiBHdChlLHQpe2NvbnN0IG49dC5pbmRleCxyPXRbMF0ubGVuZ3RoO2lmKCFuKXJldHVybjtjb25zdCBpPWUucG9zaXRpb25BdChuKTtyZXR1cm57c3RhcnRMaW5lTnVtYmVyOmkubGluZU51bWJlcixzdGFydENvbHVtbjppLmNvbHVtbixlbmRMaW5lTnVtYmVyOmkubGluZU51bWJlcixlbmRDb2x1bW46aS5jb2x1bW4rcn19ZnVuY3Rpb24gcGMoZSx0KXtpZighZSlyZXR1cm47Y29uc3Qgbj1Tbi5Gb3JtYXQuQ1NTLnBhcnNlSGV4KHQpO2lmKG4pcmV0dXJue3JhbmdlOmUsY29sb3I6UnIobi5yZ2JhLnIsbi5yZ2JhLmcsbi5yZ2JhLmIsbi5yZ2JhLmEpfX1mdW5jdGlvbiB1YShlLHQsbil7aWYoIWV8fHQubGVuZ3RoIT09MSlyZXR1cm47Y29uc3QgaT10WzBdLnZhbHVlcygpLHM9bGEoaSk7cmV0dXJue3JhbmdlOmUsY29sb3I6UnIoc1swXSxzWzFdLHNbMl0sbj9zWzNdOjEpfX1mdW5jdGlvbiBjYShlLHQsbil7aWYoIWV8fHQubGVuZ3RoIT09MSlyZXR1cm47Y29uc3QgaT10WzBdLnZhbHVlcygpLHM9bGEoaSksYT1uZXcgU24obmV3IE5lKHNbMF0sc1sxXS8xMDAsc1syXS8xMDAsbj9zWzNdOjEpKTtyZXR1cm57cmFuZ2U6ZSxjb2xvcjpScihhLnJnYmEucixhLnJnYmEuZyxhLnJnYmEuYixhLnJnYmEuYSl9fWZ1bmN0aW9uIEp0KGUsdCl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIj9bLi4uZS5tYXRjaEFsbCh0KV06ZS5maW5kTWF0Y2hlcyh0KX1mdW5jdGlvbiBiYyhlKXtjb25zdCB0PVtdLHI9SnQoZSwvXGIocmdifHJnYmF8aHNsfGhzbGEpKFwoWzAtOVxzLC5cJV0qXCkpfCgjKShbQS1GYS1mMC05XXszfSlcYnwoIykoW0EtRmEtZjAtOV17NH0pXGJ8KCMpKFtBLUZhLWYwLTldezZ9KVxifCgjKShbQS1GYS1mMC05XXs4fSlcYi9nbSk7aWYoci5sZW5ndGg+MClmb3IoY29uc3QgaSBvZiByKXtjb25zdCBzPWkuZmlsdGVyKHU9PnUhPT12b2lkIDApLGE9c1sxXSxsPXNbMl07aWYoIWwpY29udGludWU7bGV0IG87aWYoYT09PSJyZ2IiKXtjb25zdCB1PS9eXChccyooMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlccyosXHMqKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXHMqLFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxzKlwpJC9nbTtvPXVhKEd0KGUsaSksSnQobCx1KSwhMSl9ZWxzZSBpZihhPT09InJnYmEiKXtjb25zdCB1PS9eXChccyooMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlccyosXHMqKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXHMqLFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxzKixccyooMFsuXVswLTldK3xbLl1bMC05XSt8WzAxXVsuXXxbMDFdKVxzKlwpJC9nbTtvPXVhKEd0KGUsaSksSnQobCx1KSwhMCl9ZWxzZSBpZihhPT09ImhzbCIpe2NvbnN0IHU9L15cKFxzKigzNlswXXwzWzAtNV1bMC05XXxbMTJdWzAtOV1bMC05XXxbMS05XT9bMC05XSlccyosXHMqKDEwMHxcZHsxLDJ9Wy5dXGQqfFxkezEsMn0pJVxzKixccyooMTAwfFxkezEsMn1bLl1cZCp8XGR7MSwyfSklXHMqXCkkL2dtO289Y2EoR3QoZSxpKSxKdChsLHUpLCExKX1lbHNlIGlmKGE9PT0iaHNsYSIpe2NvbnN0IHU9L15cKFxzKigzNlswXXwzWzAtNV1bMC05XXxbMTJdWzAtOV1bMC05XXxbMS05XT9bMC05XSlccyosXHMqKDEwMHxcZHsxLDJ9Wy5dXGQqfFxkezEsMn0pJVxzKixccyooMTAwfFxkezEsMn1bLl1cZCp8XGR7MSwyfSklXHMqLFxzKigwWy5dWzAtOV0rfFsuXVswLTldK3xbMDFdWy5dfFswMV0pXHMqXCkkL2dtO289Y2EoR3QoZSxpKSxKdChsLHUpLCEwKX1lbHNlIGE9PT0iIyImJihvPXBjKEd0KGUsaSksYStsKSk7byYmdC5wdXNoKG8pfXJldHVybiB0fWZ1bmN0aW9uIHZjKGUpe3JldHVybiFlfHx0eXBlb2YgZS5nZXRWYWx1ZSE9ImZ1bmN0aW9uInx8dHlwZW9mIGUucG9zaXRpb25BdCE9ImZ1bmN0aW9uIj9bXTpiYyhlKX1jb25zdCBmYT1uZXcgUmVnRXhwKCJcXGJNQVJLOlxccyooLiopJCIsImQiKSx4Yz0vXi0rfC0rJC9nO2Z1bmN0aW9uIHljKGUsdCl7dmFyIHI7bGV0IG49W107aWYodC5maW5kUmVnaW9uU2VjdGlvbkhlYWRlcnMmJigocj10LmZvbGRpbmdSdWxlcykhPW51bGwmJnIubWFya2Vycykpe2NvbnN0IGk9d2MoZSx0KTtuPW4uY29uY2F0KGkpfWlmKHQuZmluZE1hcmtTZWN0aW9uSGVhZGVycyl7Y29uc3QgaT1fYyhlKTtuPW4uY29uY2F0KGkpfXJldHVybiBufWZ1bmN0aW9uIHdjKGUsdCl7Y29uc3Qgbj1bXSxyPWUuZ2V0TGluZUNvdW50KCk7Zm9yKGxldCBpPTE7aTw9cjtpKyspe2NvbnN0IHM9ZS5nZXRMaW5lQ29udGVudChpKSxhPXMubWF0Y2godC5mb2xkaW5nUnVsZXMubWFya2Vycy5zdGFydCk7aWYoYSl7Y29uc3QgbD17c3RhcnRMaW5lTnVtYmVyOmksc3RhcnRDb2x1bW46YVswXS5sZW5ndGgrMSxlbmRMaW5lTnVtYmVyOmksZW5kQ29sdW1uOnMubGVuZ3RoKzF9O2lmKGwuZW5kQ29sdW1uPmwuc3RhcnRDb2x1bW4pe2NvbnN0IG89e3JhbmdlOmwsLi4uaGEocy5zdWJzdHJpbmcoYVswXS5sZW5ndGgpKSxzaG91bGRCZUluQ29tbWVudHM6ITF9OyhvLnRleHR8fG8uaGFzU2VwYXJhdG9yTGluZSkmJm4ucHVzaChvKX19fXJldHVybiBufWZ1bmN0aW9uIF9jKGUpe2NvbnN0IHQ9W10sbj1lLmdldExpbmVDb3VudCgpO2ZvcihsZXQgcj0xO3I8PW47cisrKXtjb25zdCBpPWUuZ2V0TGluZUNvbnRlbnQocik7TGMoaSxyLHQpfXJldHVybiB0fWZ1bmN0aW9uIExjKGUsdCxuKXtmYS5sYXN0SW5kZXg9MDtjb25zdCByPWZhLmV4ZWMoZSk7aWYocil7Y29uc3QgaT1yLmluZGljZXNbMV1bMF0rMSxzPXIuaW5kaWNlc1sxXVsxXSsxLGE9e3N0YXJ0TGluZU51bWJlcjp0LHN0YXJ0Q29sdW1uOmksZW5kTGluZU51bWJlcjp0LGVuZENvbHVtbjpzfTtpZihhLmVuZENvbHVtbj5hLnN0YXJ0Q29sdW1uKXtjb25zdCBsPXtyYW5nZTphLC4uLmhhKHJbMV0pLHNob3VsZEJlSW5Db21tZW50czohMH07KGwudGV4dHx8bC5oYXNTZXBhcmF0b3JMaW5lKSYmbi5wdXNoKGwpfX19ZnVuY3Rpb24gaGEoZSl7ZT1lLnRyaW0oKTtjb25zdCB0PWUuc3RhcnRzV2l0aCgiLSIpO3JldHVybiBlPWUucmVwbGFjZSh4YywiIikse3RleHQ6ZSxoYXNTZXBhcmF0b3JMaW5lOnR9fXZhciBkYTsoZnVuY3Rpb24oZSl7YXN5bmMgZnVuY3Rpb24gdChyKXtsZXQgaTtjb25zdCBzPWF3YWl0IFByb21pc2UuYWxsKHIubWFwKGE9PmEudGhlbihsPT5sLGw9PntpfHwoaT1sKX0pKSk7aWYodHlwZW9mIGk8InUiKXRocm93IGk7cmV0dXJuIHN9ZS5zZXR0bGVkPXQ7ZnVuY3Rpb24gbihyKXtyZXR1cm4gbmV3IFByb21pc2UoYXN5bmMoaSxzKT0+e3RyeXthd2FpdCByKGkscyl9Y2F0Y2goYSl7cyhhKX19KX1lLndpdGhBc3luY0JvZHk9bn0pKGRhfHwoZGE9e30pKTtjb25zdCBnZT1jbGFzcyBnZXtzdGF0aWMgZnJvbUFycmF5KHQpe3JldHVybiBuZXcgZ2Uobj0+e24uZW1pdE1hbnkodCl9KX1zdGF0aWMgZnJvbVByb21pc2UodCl7cmV0dXJuIG5ldyBnZShhc3luYyBuPT57bi5lbWl0TWFueShhd2FpdCB0KX0pfXN0YXRpYyBmcm9tUHJvbWlzZXModCl7cmV0dXJuIG5ldyBnZShhc3luYyBuPT57YXdhaXQgUHJvbWlzZS5hbGwodC5tYXAoYXN5bmMgcj0+bi5lbWl0T25lKGF3YWl0IHIpKSl9KX1zdGF0aWMgbWVyZ2UodCl7cmV0dXJuIG5ldyBnZShhc3luYyBuPT57YXdhaXQgUHJvbWlzZS5hbGwodC5tYXAoYXN5bmMgcj0+e2ZvciBhd2FpdChjb25zdCBpIG9mIHIpbi5lbWl0T25lKGkpfSkpfSl9Y29uc3RydWN0b3IodCxuKXt0aGlzLl9zdGF0ZT0wLHRoaXMuX3Jlc3VsdHM9W10sdGhpcy5fZXJyb3I9bnVsbCx0aGlzLl9vblJldHVybj1uLHRoaXMuX29uU3RhdGVDaGFuZ2VkPW5ldyBfZSxxdWV1ZU1pY3JvdGFzayhhc3luYygpPT57Y29uc3Qgcj17ZW1pdE9uZTppPT50aGlzLmVtaXRPbmUoaSksZW1pdE1hbnk6aT0+dGhpcy5lbWl0TWFueShpKSxyZWplY3Q6aT0+dGhpcy5yZWplY3QoaSl9O3RyeXthd2FpdCBQcm9taXNlLnJlc29sdmUodChyKSksdGhpcy5yZXNvbHZlKCl9Y2F0Y2goaSl7dGhpcy5yZWplY3QoaSl9ZmluYWxseXtyLmVtaXRPbmU9dm9pZCAwLHIuZW1pdE1hbnk9dm9pZCAwLHIucmVqZWN0PXZvaWQgMH19KX1bU3ltYm9sLmFzeW5jSXRlcmF0b3JdKCl7bGV0IHQ9MDtyZXR1cm57bmV4dDphc3luYygpPT57ZG97aWYodGhpcy5fc3RhdGU9PT0yKXRocm93IHRoaXMuX2Vycm9yO2lmKHQ8dGhpcy5fcmVzdWx0cy5sZW5ndGgpcmV0dXJue2RvbmU6ITEsdmFsdWU6dGhpcy5fcmVzdWx0c1t0KytdfTtpZih0aGlzLl9zdGF0ZT09PTEpcmV0dXJue2RvbmU6ITAsdmFsdWU6dm9pZCAwfTthd2FpdCB1bi50b1Byb21pc2UodGhpcy5fb25TdGF0ZUNoYW5nZWQuZXZlbnQpfXdoaWxlKCEwKX0scmV0dXJuOmFzeW5jKCk9Pnt2YXIgbjtyZXR1cm4obj10aGlzLl9vblJldHVybik9PW51bGx8fG4uY2FsbCh0aGlzKSx7ZG9uZTohMCx2YWx1ZTp2b2lkIDB9fX19c3RhdGljIG1hcCh0LG4pe3JldHVybiBuZXcgZ2UoYXN5bmMgcj0+e2ZvciBhd2FpdChjb25zdCBpIG9mIHQpci5lbWl0T25lKG4oaSkpfSl9bWFwKHQpe3JldHVybiBnZS5tYXAodGhpcyx0KX1zdGF0aWMgZmlsdGVyKHQsbil7cmV0dXJuIG5ldyBnZShhc3luYyByPT57Zm9yIGF3YWl0KGNvbnN0IGkgb2YgdCluKGkpJiZyLmVtaXRPbmUoaSl9KX1maWx0ZXIodCl7cmV0dXJuIGdlLmZpbHRlcih0aGlzLHQpfXN0YXRpYyBjb2FsZXNjZSh0KXtyZXR1cm4gZ2UuZmlsdGVyKHQsbj0+ISFuKX1jb2FsZXNjZSgpe3JldHVybiBnZS5jb2FsZXNjZSh0aGlzKX1zdGF0aWMgYXN5bmMgdG9Qcm9taXNlKHQpe2NvbnN0IG49W107Zm9yIGF3YWl0KGNvbnN0IHIgb2YgdCluLnB1c2gocik7cmV0dXJuIG59dG9Qcm9taXNlKCl7cmV0dXJuIGdlLnRvUHJvbWlzZSh0aGlzKX1lbWl0T25lKHQpe3RoaXMuX3N0YXRlPT09MCYmKHRoaXMuX3Jlc3VsdHMucHVzaCh0KSx0aGlzLl9vblN0YXRlQ2hhbmdlZC5maXJlKCkpfWVtaXRNYW55KHQpe3RoaXMuX3N0YXRlPT09MCYmKHRoaXMuX3Jlc3VsdHM9dGhpcy5fcmVzdWx0cy5jb25jYXQodCksdGhpcy5fb25TdGF0ZUNoYW5nZWQuZmlyZSgpKX1yZXNvbHZlKCl7dGhpcy5fc3RhdGU9PT0wJiYodGhpcy5fc3RhdGU9MSx0aGlzLl9vblN0YXRlQ2hhbmdlZC5maXJlKCkpfXJlamVjdCh0KXt0aGlzLl9zdGF0ZT09PTAmJih0aGlzLl9zdGF0ZT0yLHRoaXMuX2Vycm9yPXQsdGhpcy5fb25TdGF0ZUNoYW5nZWQuZmlyZSgpKX19O2dlLkVNUFRZPWdlLmZyb21BcnJheShbXSk7bGV0IG1hPWdlO2NsYXNzIE5je2NvbnN0cnVjdG9yKHQpe3RoaXMudmFsdWVzPXQsdGhpcy5wcmVmaXhTdW09bmV3IFVpbnQzMkFycmF5KHQubGVuZ3RoKSx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXg9bmV3IEludDMyQXJyYXkoMSksdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPS0xfWluc2VydFZhbHVlcyh0LG4pe3Q9eXQodCk7Y29uc3Qgcj10aGlzLnZhbHVlcyxpPXRoaXMucHJlZml4U3VtLHM9bi5sZW5ndGg7cmV0dXJuIHM9PT0wPyExOih0aGlzLnZhbHVlcz1uZXcgVWludDMyQXJyYXkoci5sZW5ndGgrcyksdGhpcy52YWx1ZXMuc2V0KHIuc3ViYXJyYXkoMCx0KSwwKSx0aGlzLnZhbHVlcy5zZXQoci5zdWJhcnJheSh0KSx0K3MpLHRoaXMudmFsdWVzLnNldChuLHQpLHQtMTx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0mJih0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF09dC0xKSx0aGlzLnByZWZpeFN1bT1uZXcgVWludDMyQXJyYXkodGhpcy52YWx1ZXMubGVuZ3RoKSx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0+PTAmJnRoaXMucHJlZml4U3VtLnNldChpLnN1YmFycmF5KDAsdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKzEpKSwhMCl9c2V0VmFsdWUodCxuKXtyZXR1cm4gdD15dCh0KSxuPXl0KG4pLHRoaXMudmFsdWVzW3RdPT09bj8hMToodGhpcy52YWx1ZXNbdF09bix0LTE8dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdJiYodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPXQtMSksITApfXJlbW92ZVZhbHVlcyh0LG4pe3Q9eXQodCksbj15dChuKTtjb25zdCByPXRoaXMudmFsdWVzLGk9dGhpcy5wcmVmaXhTdW07aWYodD49ci5sZW5ndGgpcmV0dXJuITE7Y29uc3Qgcz1yLmxlbmd0aC10O3JldHVybiBuPj1zJiYobj1zKSxuPT09MD8hMToodGhpcy52YWx1ZXM9bmV3IFVpbnQzMkFycmF5KHIubGVuZ3RoLW4pLHRoaXMudmFsdWVzLnNldChyLnN1YmFycmF5KDAsdCksMCksdGhpcy52YWx1ZXMuc2V0KHIuc3ViYXJyYXkodCtuKSx0KSx0aGlzLnByZWZpeFN1bT1uZXcgVWludDMyQXJyYXkodGhpcy52YWx1ZXMubGVuZ3RoKSx0LTE8dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdJiYodGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPXQtMSksdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPj0wJiZ0aGlzLnByZWZpeFN1bS5zZXQoaS5zdWJhcnJheSgwLHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSsxKSksITApfWdldFRvdGFsU3VtKCl7cmV0dXJuIHRoaXMudmFsdWVzLmxlbmd0aD09PTA/MDp0aGlzLl9nZXRQcmVmaXhTdW0odGhpcy52YWx1ZXMubGVuZ3RoLTEpfWdldFByZWZpeFN1bSh0KXtyZXR1cm4gdDwwPzA6KHQ9eXQodCksdGhpcy5fZ2V0UHJlZml4U3VtKHQpKX1fZ2V0UHJlZml4U3VtKHQpe2lmKHQ8PXRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSlyZXR1cm4gdGhpcy5wcmVmaXhTdW1bdF07bGV0IG49dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKzE7bj09PTAmJih0aGlzLnByZWZpeFN1bVswXT10aGlzLnZhbHVlc1swXSxuKyspLHQ+PXRoaXMudmFsdWVzLmxlbmd0aCYmKHQ9dGhpcy52YWx1ZXMubGVuZ3RoLTEpO2ZvcihsZXQgcj1uO3I8PXQ7cisrKXRoaXMucHJlZml4U3VtW3JdPXRoaXMucHJlZml4U3VtW3ItMV0rdGhpcy52YWx1ZXNbcl07cmV0dXJuIHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXT1NYXRoLm1heCh0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0sdCksdGhpcy5wcmVmaXhTdW1bdF19Z2V0SW5kZXhPZih0KXt0PU1hdGguZmxvb3IodCksdGhpcy5nZXRUb3RhbFN1bSgpO2xldCBuPTAscj10aGlzLnZhbHVlcy5sZW5ndGgtMSxpPTAscz0wLGE9MDtmb3IoO248PXI7KWlmKGk9bisoci1uKS8yfDAscz10aGlzLnByZWZpeFN1bVtpXSxhPXMtdGhpcy52YWx1ZXNbaV0sdDxhKXI9aS0xO2Vsc2UgaWYodD49cyluPWkrMTtlbHNlIGJyZWFrO3JldHVybiBuZXcgU2MoaSx0LWEpfX1jbGFzcyBTY3tjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuaW5kZXg9dCx0aGlzLnJlbWFpbmRlcj1uLHRoaXMuX3ByZWZpeFN1bUluZGV4T2ZSZXN1bHRCcmFuZD12b2lkIDAsdGhpcy5pbmRleD10LHRoaXMucmVtYWluZGVyPW59fWNsYXNzIEFje2NvbnN0cnVjdG9yKHQsbixyLGkpe3RoaXMuX3VyaT10LHRoaXMuX2xpbmVzPW4sdGhpcy5fZW9sPXIsdGhpcy5fdmVyc2lvbklkPWksdGhpcy5fbGluZVN0YXJ0cz1udWxsLHRoaXMuX2NhY2hlZFRleHRWYWx1ZT1udWxsfWRpc3Bvc2UoKXt0aGlzLl9saW5lcy5sZW5ndGg9MH1nZXQgdmVyc2lvbigpe3JldHVybiB0aGlzLl92ZXJzaW9uSWR9Z2V0VGV4dCgpe3JldHVybiB0aGlzLl9jYWNoZWRUZXh0VmFsdWU9PT1udWxsJiYodGhpcy5fY2FjaGVkVGV4dFZhbHVlPXRoaXMuX2xpbmVzLmpvaW4odGhpcy5fZW9sKSksdGhpcy5fY2FjaGVkVGV4dFZhbHVlfW9uRXZlbnRzKHQpe3QuZW9sJiZ0LmVvbCE9PXRoaXMuX2VvbCYmKHRoaXMuX2VvbD10LmVvbCx0aGlzLl9saW5lU3RhcnRzPW51bGwpO2NvbnN0IG49dC5jaGFuZ2VzO2Zvcihjb25zdCByIG9mIG4pdGhpcy5fYWNjZXB0RGVsZXRlUmFuZ2Uoci5yYW5nZSksdGhpcy5fYWNjZXB0SW5zZXJ0VGV4dChuZXcgZWUoci5yYW5nZS5zdGFydExpbmVOdW1iZXIsci5yYW5nZS5zdGFydENvbHVtbiksci50ZXh0KTt0aGlzLl92ZXJzaW9uSWQ9dC52ZXJzaW9uSWQsdGhpcy5fY2FjaGVkVGV4dFZhbHVlPW51bGx9X2Vuc3VyZUxpbmVTdGFydHMoKXtpZighdGhpcy5fbGluZVN0YXJ0cyl7Y29uc3QgdD10aGlzLl9lb2wubGVuZ3RoLG49dGhpcy5fbGluZXMubGVuZ3RoLHI9bmV3IFVpbnQzMkFycmF5KG4pO2ZvcihsZXQgaT0wO2k8bjtpKyspcltpXT10aGlzLl9saW5lc1tpXS5sZW5ndGgrdDt0aGlzLl9saW5lU3RhcnRzPW5ldyBOYyhyKX19X3NldExpbmVUZXh0KHQsbil7dGhpcy5fbGluZXNbdF09bix0aGlzLl9saW5lU3RhcnRzJiZ0aGlzLl9saW5lU3RhcnRzLnNldFZhbHVlKHQsdGhpcy5fbGluZXNbdF0ubGVuZ3RoK3RoaXMuX2VvbC5sZW5ndGgpfV9hY2NlcHREZWxldGVSYW5nZSh0KXtpZih0LnN0YXJ0TGluZU51bWJlcj09PXQuZW5kTGluZU51bWJlcil7aWYodC5zdGFydENvbHVtbj09PXQuZW5kQ29sdW1uKXJldHVybjt0aGlzLl9zZXRMaW5lVGV4dCh0LnN0YXJ0TGluZU51bWJlci0xLHRoaXMuX2xpbmVzW3Quc3RhcnRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZygwLHQuc3RhcnRDb2x1bW4tMSkrdGhpcy5fbGluZXNbdC5zdGFydExpbmVOdW1iZXItMV0uc3Vic3RyaW5nKHQuZW5kQ29sdW1uLTEpKTtyZXR1cm59dGhpcy5fc2V0TGluZVRleHQodC5zdGFydExpbmVOdW1iZXItMSx0aGlzLl9saW5lc1t0LnN0YXJ0TGluZU51bWJlci0xXS5zdWJzdHJpbmcoMCx0LnN0YXJ0Q29sdW1uLTEpK3RoaXMuX2xpbmVzW3QuZW5kTGluZU51bWJlci0xXS5zdWJzdHJpbmcodC5lbmRDb2x1bW4tMSkpLHRoaXMuX2xpbmVzLnNwbGljZSh0LnN0YXJ0TGluZU51bWJlcix0LmVuZExpbmVOdW1iZXItdC5zdGFydExpbmVOdW1iZXIpLHRoaXMuX2xpbmVTdGFydHMmJnRoaXMuX2xpbmVTdGFydHMucmVtb3ZlVmFsdWVzKHQuc3RhcnRMaW5lTnVtYmVyLHQuZW5kTGluZU51bWJlci10LnN0YXJ0TGluZU51bWJlcil9X2FjY2VwdEluc2VydFRleHQodCxuKXtpZihuLmxlbmd0aD09PTApcmV0dXJuO2NvbnN0IHI9dmwobik7aWYoci5sZW5ndGg9PT0xKXt0aGlzLl9zZXRMaW5lVGV4dCh0LmxpbmVOdW1iZXItMSx0aGlzLl9saW5lc1t0LmxpbmVOdW1iZXItMV0uc3Vic3RyaW5nKDAsdC5jb2x1bW4tMSkrclswXSt0aGlzLl9saW5lc1t0LmxpbmVOdW1iZXItMV0uc3Vic3RyaW5nKHQuY29sdW1uLTEpKTtyZXR1cm59cltyLmxlbmd0aC0xXSs9dGhpcy5fbGluZXNbdC5saW5lTnVtYmVyLTFdLnN1YnN0cmluZyh0LmNvbHVtbi0xKSx0aGlzLl9zZXRMaW5lVGV4dCh0LmxpbmVOdW1iZXItMSx0aGlzLl9saW5lc1t0LmxpbmVOdW1iZXItMV0uc3Vic3RyaW5nKDAsdC5jb2x1bW4tMSkrclswXSk7Y29uc3QgaT1uZXcgVWludDMyQXJyYXkoci5sZW5ndGgtMSk7Zm9yKGxldCBzPTE7czxyLmxlbmd0aDtzKyspdGhpcy5fbGluZXMuc3BsaWNlKHQubGluZU51bWJlcitzLTEsMCxyW3NdKSxpW3MtMV09cltzXS5sZW5ndGgrdGhpcy5fZW9sLmxlbmd0aDt0aGlzLl9saW5lU3RhcnRzJiZ0aGlzLl9saW5lU3RhcnRzLmluc2VydFZhbHVlcyh0LmxpbmVOdW1iZXIsaSl9fWNsYXNzIGtje2NvbnN0cnVjdG9yKCl7dGhpcy5fbW9kZWxzPU9iamVjdC5jcmVhdGUobnVsbCl9Z2V0TW9kZWwodCl7cmV0dXJuIHRoaXMuX21vZGVsc1t0XX1nZXRNb2RlbHMoKXtjb25zdCB0PVtdO3JldHVybiBPYmplY3Qua2V5cyh0aGlzLl9tb2RlbHMpLmZvckVhY2gobj0+dC5wdXNoKHRoaXMuX21vZGVsc1tuXSkpLHR9JGFjY2VwdE5ld01vZGVsKHQpe3RoaXMuX21vZGVsc1t0LnVybF09bmV3IFJjKEllLnBhcnNlKHQudXJsKSx0LmxpbmVzLHQuRU9MLHQudmVyc2lvbklkKX0kYWNjZXB0TW9kZWxDaGFuZ2VkKHQsbil7aWYoIXRoaXMuX21vZGVsc1t0XSlyZXR1cm47dGhpcy5fbW9kZWxzW3RdLm9uRXZlbnRzKG4pfSRhY2NlcHRSZW1vdmVkTW9kZWwodCl7dGhpcy5fbW9kZWxzW3RdJiZkZWxldGUgdGhpcy5fbW9kZWxzW3RdfX1jbGFzcyBSYyBleHRlbmRzIEFje2dldCB1cmkoKXtyZXR1cm4gdGhpcy5fdXJpfWdldCBlb2woKXtyZXR1cm4gdGhpcy5fZW9sfWdldFZhbHVlKCl7cmV0dXJuIHRoaXMuZ2V0VGV4dCgpfWZpbmRNYXRjaGVzKHQpe2NvbnN0IG49W107Zm9yKGxldCByPTA7cjx0aGlzLl9saW5lcy5sZW5ndGg7cisrKXtjb25zdCBpPXRoaXMuX2xpbmVzW3JdLHM9dGhpcy5vZmZzZXRBdChuZXcgZWUocisxLDEpKSxhPWkubWF0Y2hBbGwodCk7Zm9yKGNvbnN0IGwgb2YgYSkobC5pbmRleHx8bC5pbmRleD09PTApJiYobC5pbmRleD1sLmluZGV4K3MpLG4ucHVzaChsKX1yZXR1cm4gbn1nZXRMaW5lc0NvbnRlbnQoKXtyZXR1cm4gdGhpcy5fbGluZXMuc2xpY2UoMCl9Z2V0TGluZUNvdW50KCl7cmV0dXJuIHRoaXMuX2xpbmVzLmxlbmd0aH1nZXRMaW5lQ29udGVudCh0KXtyZXR1cm4gdGhpcy5fbGluZXNbdC0xXX1nZXRXb3JkQXRQb3NpdGlvbih0LG4pe2NvbnN0IHI9eXIodC5jb2x1bW4sVXMobiksdGhpcy5fbGluZXNbdC5saW5lTnVtYmVyLTFdLDApO3JldHVybiByP25ldyB6KHQubGluZU51bWJlcixyLnN0YXJ0Q29sdW1uLHQubGluZU51bWJlcixyLmVuZENvbHVtbik6bnVsbH13b3Jkcyh0KXtjb25zdCBuPXRoaXMuX2xpbmVzLHI9dGhpcy5fd29yZGVuaXplLmJpbmQodGhpcyk7bGV0IGk9MCxzPSIiLGE9MCxsPVtdO3JldHVybnsqW1N5bWJvbC5pdGVyYXRvcl0oKXtmb3IoOzspaWYoYTxsLmxlbmd0aCl7Y29uc3Qgbz1zLnN1YnN0cmluZyhsW2FdLnN0YXJ0LGxbYV0uZW5kKTthKz0xLHlpZWxkIG99ZWxzZSBpZihpPG4ubGVuZ3RoKXM9bltpXSxsPXIocyx0KSxhPTAsaSs9MTtlbHNlIGJyZWFrfX19Z2V0TGluZVdvcmRzKHQsbil7Y29uc3Qgcj10aGlzLl9saW5lc1t0LTFdLGk9dGhpcy5fd29yZGVuaXplKHIsbikscz1bXTtmb3IoY29uc3QgYSBvZiBpKXMucHVzaCh7d29yZDpyLnN1YnN0cmluZyhhLnN0YXJ0LGEuZW5kKSxzdGFydENvbHVtbjphLnN0YXJ0KzEsZW5kQ29sdW1uOmEuZW5kKzF9KTtyZXR1cm4gc31fd29yZGVuaXplKHQsbil7Y29uc3Qgcj1bXTtsZXQgaTtmb3Iobi5sYXN0SW5kZXg9MDsoaT1uLmV4ZWModCkpJiZpWzBdLmxlbmd0aCE9PTA7KXIucHVzaCh7c3RhcnQ6aS5pbmRleCxlbmQ6aS5pbmRleCtpWzBdLmxlbmd0aH0pO3JldHVybiByfWdldFZhbHVlSW5SYW5nZSh0KXtpZih0PXRoaXMuX3ZhbGlkYXRlUmFuZ2UodCksdC5zdGFydExpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXIpcmV0dXJuIHRoaXMuX2xpbmVzW3Quc3RhcnRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZyh0LnN0YXJ0Q29sdW1uLTEsdC5lbmRDb2x1bW4tMSk7Y29uc3Qgbj10aGlzLl9lb2wscj10LnN0YXJ0TGluZU51bWJlci0xLGk9dC5lbmRMaW5lTnVtYmVyLTEscz1bXTtzLnB1c2godGhpcy5fbGluZXNbcl0uc3Vic3RyaW5nKHQuc3RhcnRDb2x1bW4tMSkpO2ZvcihsZXQgYT1yKzE7YTxpO2ErKylzLnB1c2godGhpcy5fbGluZXNbYV0pO3JldHVybiBzLnB1c2godGhpcy5fbGluZXNbaV0uc3Vic3RyaW5nKDAsdC5lbmRDb2x1bW4tMSkpLHMuam9pbihuKX1vZmZzZXRBdCh0KXtyZXR1cm4gdD10aGlzLl92YWxpZGF0ZVBvc2l0aW9uKHQpLHRoaXMuX2Vuc3VyZUxpbmVTdGFydHMoKSx0aGlzLl9saW5lU3RhcnRzLmdldFByZWZpeFN1bSh0LmxpbmVOdW1iZXItMikrKHQuY29sdW1uLTEpfXBvc2l0aW9uQXQodCl7dD1NYXRoLmZsb29yKHQpLHQ9TWF0aC5tYXgoMCx0KSx0aGlzLl9lbnN1cmVMaW5lU3RhcnRzKCk7Y29uc3Qgbj10aGlzLl9saW5lU3RhcnRzLmdldEluZGV4T2YodCkscj10aGlzLl9saW5lc1tuLmluZGV4XS5sZW5ndGg7cmV0dXJue2xpbmVOdW1iZXI6MStuLmluZGV4LGNvbHVtbjoxK01hdGgubWluKG4ucmVtYWluZGVyLHIpfX1fdmFsaWRhdGVSYW5nZSh0KXtjb25zdCBuPXRoaXMuX3ZhbGlkYXRlUG9zaXRpb24oe2xpbmVOdW1iZXI6dC5zdGFydExpbmVOdW1iZXIsY29sdW1uOnQuc3RhcnRDb2x1bW59KSxyPXRoaXMuX3ZhbGlkYXRlUG9zaXRpb24oe2xpbmVOdW1iZXI6dC5lbmRMaW5lTnVtYmVyLGNvbHVtbjp0LmVuZENvbHVtbn0pO3JldHVybiBuLmxpbmVOdW1iZXIhPT10LnN0YXJ0TGluZU51bWJlcnx8bi5jb2x1bW4hPT10LnN0YXJ0Q29sdW1ufHxyLmxpbmVOdW1iZXIhPT10LmVuZExpbmVOdW1iZXJ8fHIuY29sdW1uIT09dC5lbmRDb2x1bW4/e3N0YXJ0TGluZU51bWJlcjpuLmxpbmVOdW1iZXIsc3RhcnRDb2x1bW46bi5jb2x1bW4sZW5kTGluZU51bWJlcjpyLmxpbmVOdW1iZXIsZW5kQ29sdW1uOnIuY29sdW1ufTp0fV92YWxpZGF0ZVBvc2l0aW9uKHQpe2lmKCFlZS5pc0lQb3NpdGlvbih0KSl0aHJvdyBuZXcgRXJyb3IoImJhZCBwb3NpdGlvbiIpO2xldHtsaW5lTnVtYmVyOm4sY29sdW1uOnJ9PXQsaT0hMTtpZihuPDEpbj0xLHI9MSxpPSEwO2Vsc2UgaWYobj50aGlzLl9saW5lcy5sZW5ndGgpbj10aGlzLl9saW5lcy5sZW5ndGgscj10aGlzLl9saW5lc1tuLTFdLmxlbmd0aCsxLGk9ITA7ZWxzZXtjb25zdCBzPXRoaXMuX2xpbmVzW24tMV0ubGVuZ3RoKzE7cjwxPyhyPTEsaT0hMCk6cj5zJiYocj1zLGk9ITApfXJldHVybiBpP3tsaW5lTnVtYmVyOm4sY29sdW1uOnJ9OnR9fWNvbnN0IEJuPWNsYXNzIEJue2NvbnN0cnVjdG9yKCl7dGhpcy5fd29ya2VyVGV4dE1vZGVsU3luY1NlcnZlcj1uZXcga2N9ZGlzcG9zZSgpe31fZ2V0TW9kZWwodCl7cmV0dXJuIHRoaXMuX3dvcmtlclRleHRNb2RlbFN5bmNTZXJ2ZXIuZ2V0TW9kZWwodCl9X2dldE1vZGVscygpe3JldHVybiB0aGlzLl93b3JrZXJUZXh0TW9kZWxTeW5jU2VydmVyLmdldE1vZGVscygpfSRhY2NlcHROZXdNb2RlbCh0KXt0aGlzLl93b3JrZXJUZXh0TW9kZWxTeW5jU2VydmVyLiRhY2NlcHROZXdNb2RlbCh0KX0kYWNjZXB0TW9kZWxDaGFuZ2VkKHQsbil7dGhpcy5fd29ya2VyVGV4dE1vZGVsU3luY1NlcnZlci4kYWNjZXB0TW9kZWxDaGFuZ2VkKHQsbil9JGFjY2VwdFJlbW92ZWRNb2RlbCh0KXt0aGlzLl93b3JrZXJUZXh0TW9kZWxTeW5jU2VydmVyLiRhY2NlcHRSZW1vdmVkTW9kZWwodCl9YXN5bmMgJGNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0cyh0LG4scil7Y29uc3QgaT10aGlzLl9nZXRNb2RlbCh0KTtyZXR1cm4gaT9JdS5jb21wdXRlVW5pY29kZUhpZ2hsaWdodHMoaSxuLHIpOntyYW5nZXM6W10saGFzTW9yZTohMSxhbWJpZ3VvdXNDaGFyYWN0ZXJDb3VudDowLGludmlzaWJsZUNoYXJhY3RlckNvdW50OjAsbm9uQmFzaWNBc2NpaUNoYXJhY3RlckNvdW50OjB9fWFzeW5jICRmaW5kU2VjdGlvbkhlYWRlcnModCxuKXtjb25zdCByPXRoaXMuX2dldE1vZGVsKHQpO3JldHVybiByP3ljKHIsbik6W119YXN5bmMgJGNvbXB1dGVEaWZmKHQsbixyLGkpe2NvbnN0IHM9dGhpcy5fZ2V0TW9kZWwodCksYT10aGlzLl9nZXRNb2RlbChuKTtyZXR1cm4hc3x8IWE/bnVsbDpBbi5jb21wdXRlRGlmZihzLGEscixpKX1zdGF0aWMgY29tcHV0ZURpZmYodCxuLHIsaSl7Y29uc3Qgcz1pPT09ImFkdmFuY2VkIj9vYS5nZXREZWZhdWx0KCk6b2EuZ2V0TGVnYWN5KCksYT10LmdldExpbmVzQ29udGVudCgpLGw9bi5nZXRMaW5lc0NvbnRlbnQoKSxvPXMuY29tcHV0ZURpZmYoYSxsLHIpLHU9by5jaGFuZ2VzLmxlbmd0aD4wPyExOnRoaXMuX21vZGVsc0FyZUlkZW50aWNhbCh0LG4pO2Z1bmN0aW9uIGgoZil7cmV0dXJuIGYubWFwKGQ9Pnt2YXIgbTtyZXR1cm5bZC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIsZC5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLGQubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLGQubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSwobT1kLmlubmVyQ2hhbmdlcyk9PW51bGw/dm9pZCAwOm0ubWFwKGc9PltnLm9yaWdpbmFsUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLGcub3JpZ2luYWxSYW5nZS5zdGFydENvbHVtbixnLm9yaWdpbmFsUmFuZ2UuZW5kTGluZU51bWJlcixnLm9yaWdpbmFsUmFuZ2UuZW5kQ29sdW1uLGcubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXIsZy5tb2RpZmllZFJhbmdlLnN0YXJ0Q29sdW1uLGcubW9kaWZpZWRSYW5nZS5lbmRMaW5lTnVtYmVyLGcubW9kaWZpZWRSYW5nZS5lbmRDb2x1bW5dKV19KX1yZXR1cm57aWRlbnRpY2FsOnUscXVpdEVhcmx5Om8uaGl0VGltZW91dCxjaGFuZ2VzOmgoby5jaGFuZ2VzKSxtb3ZlczpvLm1vdmVzLm1hcChmPT5bZi5saW5lUmFuZ2VNYXBwaW5nLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcixmLmxpbmVSYW5nZU1hcHBpbmcub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxmLmxpbmVSYW5nZU1hcHBpbmcubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLGYubGluZVJhbmdlTWFwcGluZy5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLGgoZi5jaGFuZ2VzKV0pfX1zdGF0aWMgX21vZGVsc0FyZUlkZW50aWNhbCh0LG4pe2NvbnN0IHI9dC5nZXRMaW5lQ291bnQoKSxpPW4uZ2V0TGluZUNvdW50KCk7aWYociE9PWkpcmV0dXJuITE7Zm9yKGxldCBzPTE7czw9cjtzKyspe2NvbnN0IGE9dC5nZXRMaW5lQ29udGVudChzKSxsPW4uZ2V0TGluZUNvbnRlbnQocyk7aWYoYSE9PWwpcmV0dXJuITF9cmV0dXJuITB9YXN5bmMgJGNvbXB1dGVNb3JlTWluaW1hbEVkaXRzKHQsbixyKXtjb25zdCBpPXRoaXMuX2dldE1vZGVsKHQpO2lmKCFpKXJldHVybiBuO2NvbnN0IHM9W107bGV0IGE7bj1uLnNsaWNlKDApLnNvcnQoKG8sdSk9PntpZihvLnJhbmdlJiZ1LnJhbmdlKXJldHVybiB6LmNvbXBhcmVSYW5nZXNVc2luZ1N0YXJ0cyhvLnJhbmdlLHUucmFuZ2UpO2NvbnN0IGg9by5yYW5nZT8wOjEsZj11LnJhbmdlPzA6MTtyZXR1cm4gaC1mfSk7bGV0IGw9MDtmb3IobGV0IG89MTtvPG4ubGVuZ3RoO28rKyl6LmdldEVuZFBvc2l0aW9uKG5bbF0ucmFuZ2UpLmVxdWFscyh6LmdldFN0YXJ0UG9zaXRpb24obltvXS5yYW5nZSkpPyhuW2xdLnJhbmdlPXouZnJvbVBvc2l0aW9ucyh6LmdldFN0YXJ0UG9zaXRpb24obltsXS5yYW5nZSksei5nZXRFbmRQb3NpdGlvbihuW29dLnJhbmdlKSksbltsXS50ZXh0Kz1uW29dLnRleHQpOihsKyssbltsXT1uW29dKTtuLmxlbmd0aD1sKzE7Zm9yKGxldHtyYW5nZTpvLHRleHQ6dSxlb2w6aH1vZiBuKXtpZih0eXBlb2YgaD09Im51bWJlciImJihhPWgpLHouaXNFbXB0eShvKSYmIXUpY29udGludWU7Y29uc3QgZj1pLmdldFZhbHVlSW5SYW5nZShvKTtpZih1PXUucmVwbGFjZSgvXHJcbnxcbnxcci9nLGkuZW9sKSxmPT09dSljb250aW51ZTtpZihNYXRoLm1heCh1Lmxlbmd0aCxmLmxlbmd0aCk+QW4uX2RpZmZMaW1pdCl7cy5wdXNoKHtyYW5nZTpvLHRleHQ6dX0pO2NvbnRpbnVlfWNvbnN0IGQ9cnUoZix1LHIpLG09aS5vZmZzZXRBdCh6LmxpZnQobykuZ2V0U3RhcnRQb3NpdGlvbigpKTtmb3IoY29uc3QgZyBvZiBkKXtjb25zdCBwPWkucG9zaXRpb25BdChtK2cub3JpZ2luYWxTdGFydCkseD1pLnBvc2l0aW9uQXQobStnLm9yaWdpbmFsU3RhcnQrZy5vcmlnaW5hbExlbmd0aCksdz17dGV4dDp1LnN1YnN0cihnLm1vZGlmaWVkU3RhcnQsZy5tb2RpZmllZExlbmd0aCkscmFuZ2U6e3N0YXJ0TGluZU51bWJlcjpwLmxpbmVOdW1iZXIsc3RhcnRDb2x1bW46cC5jb2x1bW4sZW5kTGluZU51bWJlcjp4LmxpbmVOdW1iZXIsZW5kQ29sdW1uOnguY29sdW1ufX07aS5nZXRWYWx1ZUluUmFuZ2Uody5yYW5nZSkhPT13LnRleHQmJnMucHVzaCh3KX19cmV0dXJuIHR5cGVvZiBhPT0ibnVtYmVyIiYmcy5wdXNoKHtlb2w6YSx0ZXh0OiIiLHJhbmdlOntzdGFydExpbmVOdW1iZXI6MCxzdGFydENvbHVtbjowLGVuZExpbmVOdW1iZXI6MCxlbmRDb2x1bW46MH19KSxzfWFzeW5jICRjb21wdXRlTGlua3ModCl7Y29uc3Qgbj10aGlzLl9nZXRNb2RlbCh0KTtyZXR1cm4gbj9sdShuKTpudWxsfWFzeW5jICRjb21wdXRlRGVmYXVsdERvY3VtZW50Q29sb3JzKHQpe2NvbnN0IG49dGhpcy5fZ2V0TW9kZWwodCk7cmV0dXJuIG4/dmMobik6bnVsbH1hc3luYyAkdGV4dHVhbFN1Z2dlc3QodCxuLHIsaSl7Y29uc3Qgcz1uZXcgbG4sYT1uZXcgUmVnRXhwKHIsaSksbD1uZXcgU2V0O2U6Zm9yKGNvbnN0IG8gb2YgdCl7Y29uc3QgdT10aGlzLl9nZXRNb2RlbChvKTtpZih1KXtmb3IoY29uc3QgaCBvZiB1LndvcmRzKGEpKWlmKCEoaD09PW58fCFpc05hTihOdW1iZXIoaCkpKSYmKGwuYWRkKGgpLGwuc2l6ZT5Bbi5fc3VnZ2VzdGlvbnNMaW1pdCkpYnJlYWsgZX19cmV0dXJue3dvcmRzOkFycmF5LmZyb20obCksZHVyYXRpb246cy5lbGFwc2VkKCl9fWFzeW5jICRjb21wdXRlV29yZFJhbmdlcyh0LG4scixpKXtjb25zdCBzPXRoaXMuX2dldE1vZGVsKHQpO2lmKCFzKXJldHVybiBPYmplY3QuY3JlYXRlKG51bGwpO2NvbnN0IGE9bmV3IFJlZ0V4cChyLGkpLGw9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IG89bi5zdGFydExpbmVOdW1iZXI7bzxuLmVuZExpbmVOdW1iZXI7bysrKXtjb25zdCB1PXMuZ2V0TGluZVdvcmRzKG8sYSk7Zm9yKGNvbnN0IGggb2YgdSl7aWYoIWlzTmFOKE51bWJlcihoLndvcmQpKSljb250aW51ZTtsZXQgZj1sW2gud29yZF07Znx8KGY9W10sbFtoLndvcmRdPWYpLGYucHVzaCh7c3RhcnRMaW5lTnVtYmVyOm8sc3RhcnRDb2x1bW46aC5zdGFydENvbHVtbixlbmRMaW5lTnVtYmVyOm8sZW5kQ29sdW1uOmguZW5kQ29sdW1ufSl9fXJldHVybiBsfWFzeW5jICRuYXZpZ2F0ZVZhbHVlU2V0KHQsbixyLGkscyl7Y29uc3QgYT10aGlzLl9nZXRNb2RlbCh0KTtpZighYSlyZXR1cm4gbnVsbDtjb25zdCBsPW5ldyBSZWdFeHAoaSxzKTtuLnN0YXJ0Q29sdW1uPT09bi5lbmRDb2x1bW4mJihuPXtzdGFydExpbmVOdW1iZXI6bi5zdGFydExpbmVOdW1iZXIsc3RhcnRDb2x1bW46bi5zdGFydENvbHVtbixlbmRMaW5lTnVtYmVyOm4uZW5kTGluZU51bWJlcixlbmRDb2x1bW46bi5lbmRDb2x1bW4rMX0pO2NvbnN0IG89YS5nZXRWYWx1ZUluUmFuZ2UobiksdT1hLmdldFdvcmRBdFBvc2l0aW9uKHtsaW5lTnVtYmVyOm4uc3RhcnRMaW5lTnVtYmVyLGNvbHVtbjpuLnN0YXJ0Q29sdW1ufSxsKTtpZighdSlyZXR1cm4gbnVsbDtjb25zdCBoPWEuZ2V0VmFsdWVJblJhbmdlKHUpO3JldHVybiBjci5JTlNUQU5DRS5uYXZpZ2F0ZVZhbHVlU2V0KG4sbyx1LGgscil9fTtCbi5fZGlmZkxpbWl0PTFlNSxCbi5fc3VnZ2VzdGlvbnNMaW1pdD0xZTQ7bGV0IEVyPUJuO2NsYXNzIEFuIGV4dGVuZHMgRXJ7Y29uc3RydWN0b3IodCxuKXtzdXBlcigpLHRoaXMuX2hvc3Q9dCx0aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeT1uLHRoaXMuX2ZvcmVpZ25Nb2R1bGU9bnVsbH1hc3luYyAkcGluZygpe3JldHVybiJwb25nIn0kbG9hZEZvcmVpZ25Nb2R1bGUodCxuLHIpe2NvbnN0IGE9e2hvc3Q6U3UociwobCxvKT0+dGhpcy5faG9zdC4kZmhyKGwsbykpLGdldE1pcnJvck1vZGVsczooKT0+dGhpcy5fZ2V0TW9kZWxzKCl9O3JldHVybiB0aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeT8odGhpcy5fZm9yZWlnbk1vZHVsZT10aGlzLl9mb3JlaWduTW9kdWxlRmFjdG9yeShhLG4pLFByb21pc2UucmVzb2x2ZShJcyh0aGlzLl9mb3JlaWduTW9kdWxlKSkpOm5ldyBQcm9taXNlKChsLG8pPT57Y29uc3QgdT1oPT57dGhpcy5fZm9yZWlnbk1vZHVsZT1oLmNyZWF0ZShhLG4pLGwoSXModGhpcy5fZm9yZWlnbk1vZHVsZSkpfTtpbXBvcnQoYCR7eWkuYXNCcm93c2VyVXJpKGAke3R9LmpzYCkudG9TdHJpbmcoITApfWApLnRoZW4odSkuY2F0Y2gobyl9KX0kZm1yKHQsbil7aWYoIXRoaXMuX2ZvcmVpZ25Nb2R1bGV8fHR5cGVvZiB0aGlzLl9mb3JlaWduTW9kdWxlW3RdIT0iZnVuY3Rpb24iKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoIk1pc3NpbmcgcmVxdWVzdEhhbmRsZXIgb3IgbWV0aG9kOiAiK3QpKTt0cnl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9mb3JlaWduTW9kdWxlW3RdLmFwcGx5KHRoaXMuX2ZvcmVpZ25Nb2R1bGUsbikpfWNhdGNoKHIpe3JldHVybiBQcm9taXNlLnJlamVjdChyKX19fXR5cGVvZiBpbXBvcnRTY3JpcHRzPT0iZnVuY3Rpb24iJiYoZ2xvYmFsVGhpcy5tb25hY289eHUoKSk7bGV0IE1yPSExO2Z1bmN0aW9uIGdhKGUpe2lmKE1yKXJldHVybjtNcj0hMDtjb25zdCB0PW5ldyB0dShuPT57Z2xvYmFsVGhpcy5wb3N0TWVzc2FnZShuKX0sbj0+bmV3IEFuKHhyLmdldENoYW5uZWwobiksZSkpO2dsb2JhbFRoaXMub25tZXNzYWdlPW49Pnt0Lm9ubWVzc2FnZShuLmRhdGEpfX1nbG9iYWxUaGlzLm9ubWVzc2FnZT1lPT57TXJ8fGdhKG51bGwpfTsvKiEtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogKiBDb3B5cmlnaHQgKGMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KICogVmVyc2lvbjogMC41Mi4yKDQwNDU0NWJkZWQxZGY2ZmZhNDFlYTBhZjRlOGRkYjIxOTAxOGM2YzEpCiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZQogKiBodHRwczovL2dpdGh1Yi5jb20vbWljcm9zb2Z0L21vbmFjby1lZGl0b3IvYmxvYi9tYWluL0xJQ0VOU0UudHh0CiAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qL2Z1bmN0aW9uIENyKGUsdD0hMSl7Y29uc3Qgbj1lLmxlbmd0aDtsZXQgcj0wLGk9IiIscz0wLGE9MTYsbD0wLG89MCx1PTAsaD0wLGY9MDtmdW5jdGlvbiBkKHYseSl7bGV0IGI9MCxfPTA7Zm9yKDtiPHY7KXtsZXQgQT1lLmNoYXJDb2RlQXQocik7aWYoQT49NDgmJkE8PTU3KV89XyoxNitBLTQ4O2Vsc2UgaWYoQT49NjUmJkE8PTcwKV89XyoxNitBLTY1KzEwO2Vsc2UgaWYoQT49OTcmJkE8PTEwMilfPV8qMTYrQS05NysxMDtlbHNlIGJyZWFrO3IrKyxiKyt9cmV0dXJuIGI8diYmKF89LTEpLF99ZnVuY3Rpb24gbSh2KXtyPXYsaT0iIixzPTAsYT0xNixmPTB9ZnVuY3Rpb24gZygpe2xldCB2PXI7aWYoZS5jaGFyQ29kZUF0KHIpPT09NDgpcisrO2Vsc2UgZm9yKHIrKztyPGUubGVuZ3RoJiZTdChlLmNoYXJDb2RlQXQocikpOylyKys7aWYocjxlLmxlbmd0aCYmZS5jaGFyQ29kZUF0KHIpPT09NDYpaWYocisrLHI8ZS5sZW5ndGgmJlN0KGUuY2hhckNvZGVBdChyKSkpZm9yKHIrKztyPGUubGVuZ3RoJiZTdChlLmNoYXJDb2RlQXQocikpOylyKys7ZWxzZSByZXR1cm4gZj0zLGUuc3Vic3RyaW5nKHYscik7bGV0IHk9cjtpZihyPGUubGVuZ3RoJiYoZS5jaGFyQ29kZUF0KHIpPT09Njl8fGUuY2hhckNvZGVBdChyKT09PTEwMSkpaWYocisrLChyPGUubGVuZ3RoJiZlLmNoYXJDb2RlQXQocik9PT00M3x8ZS5jaGFyQ29kZUF0KHIpPT09NDUpJiZyKysscjxlLmxlbmd0aCYmU3QoZS5jaGFyQ29kZUF0KHIpKSl7Zm9yKHIrKztyPGUubGVuZ3RoJiZTdChlLmNoYXJDb2RlQXQocikpOylyKys7eT1yfWVsc2UgZj0zO3JldHVybiBlLnN1YnN0cmluZyh2LHkpfWZ1bmN0aW9uIHAoKXtsZXQgdj0iIix5PXI7Zm9yKDs7KXtpZihyPj1uKXt2Kz1lLnN1YnN0cmluZyh5LHIpLGY9MjticmVha31jb25zdCBiPWUuY2hhckNvZGVBdChyKTtpZihiPT09MzQpe3YrPWUuc3Vic3RyaW5nKHkscikscisrO2JyZWFrfWlmKGI9PT05Mil7aWYodis9ZS5zdWJzdHJpbmcoeSxyKSxyKysscj49bil7Zj0yO2JyZWFrfXN3aXRjaChlLmNoYXJDb2RlQXQocisrKSl7Y2FzZSAzNDp2Kz0nIic7YnJlYWs7Y2FzZSA5Mjp2Kz0iXFwiO2JyZWFrO2Nhc2UgNDc6dis9Ii8iO2JyZWFrO2Nhc2UgOTg6dis9IlxiIjticmVhaztjYXNlIDEwMjp2Kz0iXGYiO2JyZWFrO2Nhc2UgMTEwOnYrPWAKYDticmVhaztjYXNlIDExNDp2Kz0iXHIiO2JyZWFrO2Nhc2UgMTE2OnYrPSIJIjticmVhaztjYXNlIDExNzpjb25zdCBBPWQoNCk7QT49MD92Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKEEpOmY9NDticmVhaztkZWZhdWx0OmY9NX15PXI7Y29udGludWV9aWYoYj49MCYmYjw9MzEpaWYoWHQoYikpe3YrPWUuc3Vic3RyaW5nKHksciksZj0yO2JyZWFrfWVsc2UgZj02O3IrK31yZXR1cm4gdn1mdW5jdGlvbiB4KCl7aWYoaT0iIixmPTAscz1yLG89bCxoPXUscj49bilyZXR1cm4gcz1uLGE9MTc7bGV0IHY9ZS5jaGFyQ29kZUF0KHIpO2lmKFRyKHYpKXtkbyByKyssaSs9U3RyaW5nLmZyb21DaGFyQ29kZSh2KSx2PWUuY2hhckNvZGVBdChyKTt3aGlsZShUcih2KSk7cmV0dXJuIGE9MTV9aWYoWHQodikpcmV0dXJuIHIrKyxpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHYpLHY9PT0xMyYmZS5jaGFyQ29kZUF0KHIpPT09MTAmJihyKyssaSs9YApgKSxsKyssdT1yLGE9MTQ7c3dpdGNoKHYpe2Nhc2UgMTIzOnJldHVybiByKyssYT0xO2Nhc2UgMTI1OnJldHVybiByKyssYT0yO2Nhc2UgOTE6cmV0dXJuIHIrKyxhPTM7Y2FzZSA5MzpyZXR1cm4gcisrLGE9NDtjYXNlIDU4OnJldHVybiByKyssYT02O2Nhc2UgNDQ6cmV0dXJuIHIrKyxhPTU7Y2FzZSAzNDpyZXR1cm4gcisrLGk9cCgpLGE9MTA7Y2FzZSA0Nzpjb25zdCB5PXItMTtpZihlLmNoYXJDb2RlQXQocisxKT09PTQ3KXtmb3Iocis9MjtyPG4mJiFYdChlLmNoYXJDb2RlQXQocikpOylyKys7cmV0dXJuIGk9ZS5zdWJzdHJpbmcoeSxyKSxhPTEyfWlmKGUuY2hhckNvZGVBdChyKzEpPT09NDIpe3IrPTI7Y29uc3QgYj1uLTE7bGV0IF89ITE7Zm9yKDtyPGI7KXtjb25zdCBBPWUuY2hhckNvZGVBdChyKTtpZihBPT09NDImJmUuY2hhckNvZGVBdChyKzEpPT09NDcpe3IrPTIsXz0hMDticmVha31yKyssWHQoQSkmJihBPT09MTMmJmUuY2hhckNvZGVBdChyKT09PTEwJiZyKyssbCsrLHU9cil9cmV0dXJuIF98fChyKyssZj0xKSxpPWUuc3Vic3RyaW5nKHksciksYT0xM31yZXR1cm4gaSs9U3RyaW5nLmZyb21DaGFyQ29kZSh2KSxyKyssYT0xNjtjYXNlIDQ1OmlmKGkrPVN0cmluZy5mcm9tQ2hhckNvZGUodikscisrLHI9PT1ufHwhU3QoZS5jaGFyQ29kZUF0KHIpKSlyZXR1cm4gYT0xNjtjYXNlIDQ4OmNhc2UgNDk6Y2FzZSA1MDpjYXNlIDUxOmNhc2UgNTI6Y2FzZSA1MzpjYXNlIDU0OmNhc2UgNTU6Y2FzZSA1NjpjYXNlIDU3OnJldHVybiBpKz1nKCksYT0xMTtkZWZhdWx0OmZvcig7cjxuJiZ3KHYpOylyKyssdj1lLmNoYXJDb2RlQXQocik7aWYocyE9PXIpe3N3aXRjaChpPWUuc3Vic3RyaW5nKHMsciksaSl7Y2FzZSJ0cnVlIjpyZXR1cm4gYT04O2Nhc2UiZmFsc2UiOnJldHVybiBhPTk7Y2FzZSJudWxsIjpyZXR1cm4gYT03fXJldHVybiBhPTE2fXJldHVybiBpKz1TdHJpbmcuZnJvbUNoYXJDb2RlKHYpLHIrKyxhPTE2fX1mdW5jdGlvbiB3KHYpe2lmKFRyKHYpfHxYdCh2KSlyZXR1cm4hMTtzd2l0Y2godil7Y2FzZSAxMjU6Y2FzZSA5MzpjYXNlIDEyMzpjYXNlIDkxOmNhc2UgMzQ6Y2FzZSA1ODpjYXNlIDQ0OmNhc2UgNDc6cmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gTCgpe2xldCB2O2RvIHY9eCgpO3doaWxlKHY+PTEyJiZ2PD0xNSk7cmV0dXJuIHZ9cmV0dXJue3NldFBvc2l0aW9uOm0sZ2V0UG9zaXRpb246KCk9PnIsc2Nhbjp0P0w6eCxnZXRUb2tlbjooKT0+YSxnZXRUb2tlblZhbHVlOigpPT5pLGdldFRva2VuT2Zmc2V0OigpPT5zLGdldFRva2VuTGVuZ3RoOigpPT5yLXMsZ2V0VG9rZW5TdGFydExpbmU6KCk9Pm8sZ2V0VG9rZW5TdGFydENoYXJhY3RlcjooKT0+cy1oLGdldFRva2VuRXJyb3I6KCk9PmZ9fWZ1bmN0aW9uIFRyKGUpe3JldHVybiBlPT09MzJ8fGU9PT05fWZ1bmN0aW9uIFh0KGUpe3JldHVybiBlPT09MTB8fGU9PT0xM31mdW5jdGlvbiBTdChlKXtyZXR1cm4gZT49NDgmJmU8PTU3fXZhciBwYTsoZnVuY3Rpb24oZSl7ZVtlLmxpbmVGZWVkPTEwXT0ibGluZUZlZWQiLGVbZS5jYXJyaWFnZVJldHVybj0xM109ImNhcnJpYWdlUmV0dXJuIixlW2Uuc3BhY2U9MzJdPSJzcGFjZSIsZVtlLl8wPTQ4XT0iXzAiLGVbZS5fMT00OV09Il8xIixlW2UuXzI9NTBdPSJfMiIsZVtlLl8zPTUxXT0iXzMiLGVbZS5fND01Ml09Il80IixlW2UuXzU9NTNdPSJfNSIsZVtlLl82PTU0XT0iXzYiLGVbZS5fNz01NV09Il83IixlW2UuXzg9NTZdPSJfOCIsZVtlLl85PTU3XT0iXzkiLGVbZS5hPTk3XT0iYSIsZVtlLmI9OThdPSJiIixlW2UuYz05OV09ImMiLGVbZS5kPTEwMF09ImQiLGVbZS5lPTEwMV09ImUiLGVbZS5mPTEwMl09ImYiLGVbZS5nPTEwM109ImciLGVbZS5oPTEwNF09ImgiLGVbZS5pPTEwNV09ImkiLGVbZS5qPTEwNl09ImoiLGVbZS5rPTEwN109ImsiLGVbZS5sPTEwOF09ImwiLGVbZS5tPTEwOV09Im0iLGVbZS5uPTExMF09Im4iLGVbZS5vPTExMV09Im8iLGVbZS5wPTExMl09InAiLGVbZS5xPTExM109InEiLGVbZS5yPTExNF09InIiLGVbZS5zPTExNV09InMiLGVbZS50PTExNl09InQiLGVbZS51PTExN109InUiLGVbZS52PTExOF09InYiLGVbZS53PTExOV09InciLGVbZS54PTEyMF09IngiLGVbZS55PTEyMV09InkiLGVbZS56PTEyMl09InoiLGVbZS5BPTY1XT0iQSIsZVtlLkI9NjZdPSJCIixlW2UuQz02N109IkMiLGVbZS5EPTY4XT0iRCIsZVtlLkU9NjldPSJFIixlW2UuRj03MF09IkYiLGVbZS5HPTcxXT0iRyIsZVtlLkg9NzJdPSJIIixlW2UuST03M109IkkiLGVbZS5KPTc0XT0iSiIsZVtlLks9NzVdPSJLIixlW2UuTD03Nl09IkwiLGVbZS5NPTc3XT0iTSIsZVtlLk49NzhdPSJOIixlW2UuTz03OV09Ik8iLGVbZS5QPTgwXT0iUCIsZVtlLlE9ODFdPSJRIixlW2UuUj04Ml09IlIiLGVbZS5TPTgzXT0iUyIsZVtlLlQ9ODRdPSJUIixlW2UuVT04NV09IlUiLGVbZS5WPTg2XT0iViIsZVtlLlc9ODddPSJXIixlW2UuWD04OF09IlgiLGVbZS5ZPTg5XT0iWSIsZVtlLlo9OTBdPSJaIixlW2UuYXN0ZXJpc2s9NDJdPSJhc3RlcmlzayIsZVtlLmJhY2tzbGFzaD05Ml09ImJhY2tzbGFzaCIsZVtlLmNsb3NlQnJhY2U9MTI1XT0iY2xvc2VCcmFjZSIsZVtlLmNsb3NlQnJhY2tldD05M109ImNsb3NlQnJhY2tldCIsZVtlLmNvbG9uPTU4XT0iY29sb24iLGVbZS5jb21tYT00NF09ImNvbW1hIixlW2UuZG90PTQ2XT0iZG90IixlW2UuZG91YmxlUXVvdGU9MzRdPSJkb3VibGVRdW90ZSIsZVtlLm1pbnVzPTQ1XT0ibWludXMiLGVbZS5vcGVuQnJhY2U9MTIzXT0ib3BlbkJyYWNlIixlW2Uub3BlbkJyYWNrZXQ9OTFdPSJvcGVuQnJhY2tldCIsZVtlLnBsdXM9NDNdPSJwbHVzIixlW2Uuc2xhc2g9NDddPSJzbGFzaCIsZVtlLmZvcm1GZWVkPTEyXT0iZm9ybUZlZWQiLGVbZS50YWI9OV09InRhYiJ9KShwYXx8KHBhPXt9KSk7dmFyIFNlPW5ldyBBcnJheSgyMCkuZmlsbCgwKS5tYXAoKGUsdCk9PiIgIi5yZXBlYXQodCkpLEF0PTIwMCxiYT17IiAiOnsiXG4iOm5ldyBBcnJheShBdCkuZmlsbCgwKS5tYXAoKGUsdCk9PmAKYCsiICIucmVwZWF0KHQpKSwiXHIiOm5ldyBBcnJheShBdCkuZmlsbCgwKS5tYXAoKGUsdCk9PiJcciIrIiAiLnJlcGVhdCh0KSksIlxyXG4iOm5ldyBBcnJheShBdCkuZmlsbCgwKS5tYXAoKGUsdCk9PmBccgpgKyIgIi5yZXBlYXQodCkpfSwiCSI6eyJcbiI6bmV3IEFycmF5KEF0KS5maWxsKDApLm1hcCgoZSx0KT0+YApgKyIJIi5yZXBlYXQodCkpLCJcciI6bmV3IEFycmF5KEF0KS5maWxsKDApLm1hcCgoZSx0KT0+IlxyIisiCSIucmVwZWF0KHQpKSwiXHJcbiI6bmV3IEFycmF5KEF0KS5maWxsKDApLm1hcCgoZSx0KT0+YFxyCmArIgkiLnJlcGVhdCh0KSl9fSxFYz1bYApgLCJcciIsYFxyCmBdO2Z1bmN0aW9uIE1jKGUsdCxuKXtsZXQgcixpLHMsYSxsO2lmKHQpe2ZvcihhPXQub2Zmc2V0LGw9YSt0Lmxlbmd0aCxzPWE7cz4wJiYhdmEoZSxzLTEpOylzLS07bGV0IGI9bDtmb3IoO2I8ZS5sZW5ndGgmJiF2YShlLGIpOyliKys7aT1lLnN1YnN0cmluZyhzLGIpLHI9Q2MoaSxuKX1lbHNlIGk9ZSxyPTAscz0wLGE9MCxsPWUubGVuZ3RoO2NvbnN0IG89VGMobixlKSx1PUVjLmluY2x1ZGVzKG8pO2xldCBoPTAsZj0wLGQ7bi5pbnNlcnRTcGFjZXM/ZD1TZVtuLnRhYlNpemV8fDRdPz9rdChTZVsxXSxuLnRhYlNpemV8fDQpOmQ9IgkiO2NvbnN0IG09ZD09PSIJIj8iCSI6IiAiO2xldCBnPUNyKGksITEpLHA9ITE7ZnVuY3Rpb24geCgpe2lmKGg+MSlyZXR1cm4ga3QobyxoKStrdChkLHIrZik7Y29uc3QgYj1kLmxlbmd0aCoocitmKTtyZXR1cm4hdXx8Yj5iYVttXVtvXS5sZW5ndGg/bytrdChkLHIrZik6Yjw9MD9vOmJhW21dW29dW2JdfWZ1bmN0aW9uIHcoKXtsZXQgYj1nLnNjYW4oKTtmb3IoaD0wO2I9PT0xNXx8Yj09PTE0OyliPT09MTQmJm4ua2VlcExpbmVzP2grPTE6Yj09PTE0JiYoaD0xKSxiPWcuc2NhbigpO3JldHVybiBwPWI9PT0xNnx8Zy5nZXRUb2tlbkVycm9yKCkhPT0wLGJ9Y29uc3QgTD1bXTtmdW5jdGlvbiB2KGIsXyxBKXshcCYmKCF0fHxfPGwmJkE+YSkmJmUuc3Vic3RyaW5nKF8sQSkhPT1iJiZMLnB1c2goe29mZnNldDpfLGxlbmd0aDpBLV8sY29udGVudDpifSl9bGV0IHk9dygpO2lmKG4ua2VlcExpbmVzJiZoPjAmJnYoa3QobyxoKSwwLDApLHkhPT0xNyl7bGV0IGI9Zy5nZXRUb2tlbk9mZnNldCgpK3MsXz1kLmxlbmd0aCpyPDIwJiZuLmluc2VydFNwYWNlcz9TZVtkLmxlbmd0aCpyXTprdChkLHIpO3YoXyxzLGIpfWZvcig7eSE9PTE3Oyl7bGV0IGI9Zy5nZXRUb2tlbk9mZnNldCgpK2cuZ2V0VG9rZW5MZW5ndGgoKStzLF89dygpLEE9IiIsQz0hMTtmb3IoO2g9PT0wJiYoXz09PTEyfHxfPT09MTMpOyl7bGV0IE89Zy5nZXRUb2tlbk9mZnNldCgpK3M7dihTZVsxXSxiLE8pLGI9Zy5nZXRUb2tlbk9mZnNldCgpK2cuZ2V0VG9rZW5MZW5ndGgoKStzLEM9Xz09PTEyLEE9Qz94KCk6IiIsXz13KCl9aWYoXz09PTIpeSE9PTEmJmYtLSxuLmtlZXBMaW5lcyYmaD4wfHwhbi5rZWVwTGluZXMmJnkhPT0xP0E9eCgpOm4ua2VlcExpbmVzJiYoQT1TZVsxXSk7ZWxzZSBpZihfPT09NCl5IT09MyYmZi0tLG4ua2VlcExpbmVzJiZoPjB8fCFuLmtlZXBMaW5lcyYmeSE9PTM/QT14KCk6bi5rZWVwTGluZXMmJihBPVNlWzFdKTtlbHNle3N3aXRjaCh5KXtjYXNlIDM6Y2FzZSAxOmYrKyxuLmtlZXBMaW5lcyYmaD4wfHwhbi5rZWVwTGluZXM/QT14KCk6QT1TZVsxXTticmVhaztjYXNlIDU6bi5rZWVwTGluZXMmJmg+MHx8IW4ua2VlcExpbmVzP0E9eCgpOkE9U2VbMV07YnJlYWs7Y2FzZSAxMjpBPXgoKTticmVhaztjYXNlIDEzOmg+MD9BPXgoKTpDfHwoQT1TZVsxXSk7YnJlYWs7Y2FzZSA2Om4ua2VlcExpbmVzJiZoPjA/QT14KCk6Q3x8KEE9U2VbMV0pO2JyZWFrO2Nhc2UgMTA6bi5rZWVwTGluZXMmJmg+MD9BPXgoKTpfPT09NiYmIUMmJihBPSIiKTticmVhaztjYXNlIDc6Y2FzZSA4OmNhc2UgOTpjYXNlIDExOmNhc2UgMjpjYXNlIDQ6bi5rZWVwTGluZXMmJmg+MD9BPXgoKTooXz09PTEyfHxfPT09MTMpJiYhQz9BPVNlWzFdOl8hPT01JiZfIT09MTcmJihwPSEwKTticmVhaztjYXNlIDE2OnA9ITA7YnJlYWt9aD4wJiYoXz09PTEyfHxfPT09MTMpJiYoQT14KCkpfV89PT0xNyYmKG4ua2VlcExpbmVzJiZoPjA/QT14KCk6QT1uLmluc2VydEZpbmFsTmV3bGluZT9vOiIiKTtjb25zdCBGPWcuZ2V0VG9rZW5PZmZzZXQoKStzO3YoQSxiLEYpLHk9X31yZXR1cm4gTH1mdW5jdGlvbiBrdChlLHQpe2xldCBuPSIiO2ZvcihsZXQgcj0wO3I8dDtyKyspbis9ZTtyZXR1cm4gbn1mdW5jdGlvbiBDYyhlLHQpe2xldCBuPTAscj0wO2NvbnN0IGk9dC50YWJTaXplfHw0O2Zvcig7bjxlLmxlbmd0aDspe2xldCBzPWUuY2hhckF0KG4pO2lmKHM9PT1TZVsxXSlyKys7ZWxzZSBpZihzPT09IgkiKXIrPWk7ZWxzZSBicmVhaztuKyt9cmV0dXJuIE1hdGguZmxvb3Ioci9pKX1mdW5jdGlvbiBUYyhlLHQpe2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtjb25zdCByPXQuY2hhckF0KG4pO2lmKHI9PT0iXHIiKXJldHVybiBuKzE8dC5sZW5ndGgmJnQuY2hhckF0KG4rMSk9PT1gCmA/YFxyCmA6IlxyIjtpZihyPT09YApgKXJldHVybmAKYH1yZXR1cm4gZSYmZS5lb2x8fGAKYH1mdW5jdGlvbiB2YShlLHQpe3JldHVybmBccgpgLmluZGV4T2YoZS5jaGFyQXQodCkpIT09LTF9dmFyIGtuOyhmdW5jdGlvbihlKXtlLkRFRkFVTFQ9e2FsbG93VHJhaWxpbmdDb21tYTohMX19KShrbnx8KGtuPXt9KSk7ZnVuY3Rpb24gUGMoZSx0PVtdLG49a24uREVGQVVMVCl7bGV0IHI9bnVsbCxpPVtdO2NvbnN0IHM9W107ZnVuY3Rpb24gYShvKXtBcnJheS5pc0FycmF5KGkpP2kucHVzaChvKTpyIT09bnVsbCYmKGlbcl09byl9cmV0dXJuIEZjKGUse29uT2JqZWN0QmVnaW46KCk9Pntjb25zdCBvPXt9O2Eobykscy5wdXNoKGkpLGk9byxyPW51bGx9LG9uT2JqZWN0UHJvcGVydHk6bz0+e3I9b30sb25PYmplY3RFbmQ6KCk9PntpPXMucG9wKCl9LG9uQXJyYXlCZWdpbjooKT0+e2NvbnN0IG89W107YShvKSxzLnB1c2goaSksaT1vLHI9bnVsbH0sb25BcnJheUVuZDooKT0+e2k9cy5wb3AoKX0sb25MaXRlcmFsVmFsdWU6YSxvbkVycm9yOihvLHUsaCk9Pnt0LnB1c2goe2Vycm9yOm8sb2Zmc2V0OnUsbGVuZ3RoOmh9KX19LG4pLGlbMF19ZnVuY3Rpb24geGEoZSl7aWYoIWUucGFyZW50fHwhZS5wYXJlbnQuY2hpbGRyZW4pcmV0dXJuW107Y29uc3QgdD14YShlLnBhcmVudCk7aWYoZS5wYXJlbnQudHlwZT09PSJwcm9wZXJ0eSIpe2NvbnN0IG49ZS5wYXJlbnQuY2hpbGRyZW5bMF0udmFsdWU7dC5wdXNoKG4pfWVsc2UgaWYoZS5wYXJlbnQudHlwZT09PSJhcnJheSIpe2NvbnN0IG49ZS5wYXJlbnQuY2hpbGRyZW4uaW5kZXhPZihlKTtuIT09LTEmJnQucHVzaChuKX1yZXR1cm4gdH1mdW5jdGlvbiBQcihlKXtzd2l0Y2goZS50eXBlKXtjYXNlImFycmF5IjpyZXR1cm4gZS5jaGlsZHJlbi5tYXAoUHIpO2Nhc2Uib2JqZWN0Ijpjb25zdCB0PU9iamVjdC5jcmVhdGUobnVsbCk7Zm9yKGxldCBuIG9mIGUuY2hpbGRyZW4pe2NvbnN0IHI9bi5jaGlsZHJlblsxXTtyJiYodFtuLmNoaWxkcmVuWzBdLnZhbHVlXT1QcihyKSl9cmV0dXJuIHQ7Y2FzZSJudWxsIjpjYXNlInN0cmluZyI6Y2FzZSJudW1iZXIiOmNhc2UiYm9vbGVhbiI6cmV0dXJuIGUudmFsdWU7ZGVmYXVsdDpyZXR1cm59fWZ1bmN0aW9uIEljKGUsdCxuPSExKXtyZXR1cm4gdD49ZS5vZmZzZXQmJnQ8ZS5vZmZzZXQrZS5sZW5ndGh8fG4mJnQ9PT1lLm9mZnNldCtlLmxlbmd0aH1mdW5jdGlvbiB5YShlLHQsbj0hMSl7aWYoSWMoZSx0LG4pKXtjb25zdCByPWUuY2hpbGRyZW47aWYoQXJyYXkuaXNBcnJheShyKSlmb3IobGV0IGk9MDtpPHIubGVuZ3RoJiZyW2ldLm9mZnNldDw9dDtpKyspe2NvbnN0IHM9eWEocltpXSx0LG4pO2lmKHMpcmV0dXJuIHN9cmV0dXJuIGV9fWZ1bmN0aW9uIEZjKGUsdCxuPWtuLkRFRkFVTFQpe2NvbnN0IHI9Q3IoZSwhMSksaT1bXTtmdW5jdGlvbiBzKE4pe3JldHVybiBOPygpPT5OKHIuZ2V0VG9rZW5PZmZzZXQoKSxyLmdldFRva2VuTGVuZ3RoKCksci5nZXRUb2tlblN0YXJ0TGluZSgpLHIuZ2V0VG9rZW5TdGFydENoYXJhY3RlcigpKTooKT0+ITB9ZnVuY3Rpb24gYShOKXtyZXR1cm4gTj8oKT0+TihyLmdldFRva2VuT2Zmc2V0KCksci5nZXRUb2tlbkxlbmd0aCgpLHIuZ2V0VG9rZW5TdGFydExpbmUoKSxyLmdldFRva2VuU3RhcnRDaGFyYWN0ZXIoKSwoKT0+aS5zbGljZSgpKTooKT0+ITB9ZnVuY3Rpb24gbChOKXtyZXR1cm4gTj9rPT5OKGssci5nZXRUb2tlbk9mZnNldCgpLHIuZ2V0VG9rZW5MZW5ndGgoKSxyLmdldFRva2VuU3RhcnRMaW5lKCksci5nZXRUb2tlblN0YXJ0Q2hhcmFjdGVyKCkpOigpPT4hMH1mdW5jdGlvbiBvKE4pe3JldHVybiBOP2s9Pk4oayxyLmdldFRva2VuT2Zmc2V0KCksci5nZXRUb2tlbkxlbmd0aCgpLHIuZ2V0VG9rZW5TdGFydExpbmUoKSxyLmdldFRva2VuU3RhcnRDaGFyYWN0ZXIoKSwoKT0+aS5zbGljZSgpKTooKT0+ITB9Y29uc3QgdT1hKHQub25PYmplY3RCZWdpbiksaD1vKHQub25PYmplY3RQcm9wZXJ0eSksZj1zKHQub25PYmplY3RFbmQpLGQ9YSh0Lm9uQXJyYXlCZWdpbiksbT1zKHQub25BcnJheUVuZCksZz1vKHQub25MaXRlcmFsVmFsdWUpLHA9bCh0Lm9uU2VwYXJhdG9yKSx4PXModC5vbkNvbW1lbnQpLHc9bCh0Lm9uRXJyb3IpLEw9biYmbi5kaXNhbGxvd0NvbW1lbnRzLHY9biYmbi5hbGxvd1RyYWlsaW5nQ29tbWE7ZnVuY3Rpb24geSgpe2Zvcig7Oyl7Y29uc3QgTj1yLnNjYW4oKTtzd2l0Y2goci5nZXRUb2tlbkVycm9yKCkpe2Nhc2UgNDpiKDE0KTticmVhaztjYXNlIDU6YigxNSk7YnJlYWs7Y2FzZSAzOmIoMTMpO2JyZWFrO2Nhc2UgMTpMfHxiKDExKTticmVhaztjYXNlIDI6YigxMik7YnJlYWs7Y2FzZSA2OmIoMTYpO2JyZWFrfXN3aXRjaChOKXtjYXNlIDEyOmNhc2UgMTM6TD9iKDEwKTp4KCk7YnJlYWs7Y2FzZSAxNjpiKDEpO2JyZWFrO2Nhc2UgMTU6Y2FzZSAxNDpicmVhaztkZWZhdWx0OnJldHVybiBOfX19ZnVuY3Rpb24gYihOLGs9W10sUj1bXSl7aWYodyhOKSxrLmxlbmd0aCtSLmxlbmd0aD4wKXtsZXQgST1yLmdldFRva2VuKCk7Zm9yKDtJIT09MTc7KXtpZihrLmluZGV4T2YoSSkhPT0tMSl7eSgpO2JyZWFrfWVsc2UgaWYoUi5pbmRleE9mKEkpIT09LTEpYnJlYWs7ST15KCl9fX1mdW5jdGlvbiBfKE4pe2NvbnN0IGs9ci5nZXRUb2tlblZhbHVlKCk7cmV0dXJuIE4/ZyhrKTooaChrKSxpLnB1c2goaykpLHkoKSwhMH1mdW5jdGlvbiBBKCl7c3dpdGNoKHIuZ2V0VG9rZW4oKSl7Y2FzZSAxMTpjb25zdCBOPXIuZ2V0VG9rZW5WYWx1ZSgpO2xldCBrPU51bWJlcihOKTtpc05hTihrKSYmKGIoMiksaz0wKSxnKGspO2JyZWFrO2Nhc2UgNzpnKG51bGwpO2JyZWFrO2Nhc2UgODpnKCEwKTticmVhaztjYXNlIDk6ZyghMSk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4hMX1yZXR1cm4geSgpLCEwfWZ1bmN0aW9uIEMoKXtyZXR1cm4gci5nZXRUb2tlbigpIT09MTA/KGIoMyxbXSxbMiw1XSksITEpOihfKCExKSxyLmdldFRva2VuKCk9PT02PyhwKCI6IikseSgpLE0oKXx8Yig0LFtdLFsyLDVdKSk6Yig1LFtdLFsyLDVdKSxpLnBvcCgpLCEwKX1mdW5jdGlvbiBGKCl7dSgpLHkoKTtsZXQgTj0hMTtmb3IoO3IuZ2V0VG9rZW4oKSE9PTImJnIuZ2V0VG9rZW4oKSE9PTE3Oyl7aWYoci5nZXRUb2tlbigpPT09NSl7aWYoTnx8Yig0LFtdLFtdKSxwKCIsIikseSgpLHIuZ2V0VG9rZW4oKT09PTImJnYpYnJlYWt9ZWxzZSBOJiZiKDYsW10sW10pO0MoKXx8Yig0LFtdLFsyLDVdKSxOPSEwfXJldHVybiBmKCksci5nZXRUb2tlbigpIT09Mj9iKDcsWzJdLFtdKTp5KCksITB9ZnVuY3Rpb24gTygpe2QoKSx5KCk7bGV0IE49ITAsaz0hMTtmb3IoO3IuZ2V0VG9rZW4oKSE9PTQmJnIuZ2V0VG9rZW4oKSE9PTE3Oyl7aWYoci5nZXRUb2tlbigpPT09NSl7aWYoa3x8Yig0LFtdLFtdKSxwKCIsIikseSgpLHIuZ2V0VG9rZW4oKT09PTQmJnYpYnJlYWt9ZWxzZSBrJiZiKDYsW10sW10pO04/KGkucHVzaCgwKSxOPSExKTppW2kubGVuZ3RoLTFdKyssTSgpfHxiKDQsW10sWzQsNV0pLGs9ITB9cmV0dXJuIG0oKSxOfHxpLnBvcCgpLHIuZ2V0VG9rZW4oKSE9PTQ/Yig4LFs0XSxbXSk6eSgpLCEwfWZ1bmN0aW9uIE0oKXtzd2l0Y2goci5nZXRUb2tlbigpKXtjYXNlIDM6cmV0dXJuIE8oKTtjYXNlIDE6cmV0dXJuIEYoKTtjYXNlIDEwOnJldHVybiBfKCEwKTtkZWZhdWx0OnJldHVybiBBKCl9fXJldHVybiB5KCksci5nZXRUb2tlbigpPT09MTc/bi5hbGxvd0VtcHR5Q29udGVudD8hMDooYig0LFtdLFtdKSwhMSk6TSgpPyhyLmdldFRva2VuKCkhPT0xNyYmYig5LFtdLFtdKSwhMCk6KGIoNCxbXSxbXSksITEpfXZhciBhdD1Dcix3YTsoZnVuY3Rpb24oZSl7ZVtlLk5vbmU9MF09Ik5vbmUiLGVbZS5VbmV4cGVjdGVkRW5kT2ZDb21tZW50PTFdPSJVbmV4cGVjdGVkRW5kT2ZDb21tZW50IixlW2UuVW5leHBlY3RlZEVuZE9mU3RyaW5nPTJdPSJVbmV4cGVjdGVkRW5kT2ZTdHJpbmciLGVbZS5VbmV4cGVjdGVkRW5kT2ZOdW1iZXI9M109IlVuZXhwZWN0ZWRFbmRPZk51bWJlciIsZVtlLkludmFsaWRVbmljb2RlPTRdPSJJbnZhbGlkVW5pY29kZSIsZVtlLkludmFsaWRFc2NhcGVDaGFyYWN0ZXI9NV09IkludmFsaWRFc2NhcGVDaGFyYWN0ZXIiLGVbZS5JbnZhbGlkQ2hhcmFjdGVyPTZdPSJJbnZhbGlkQ2hhcmFjdGVyIn0pKHdhfHwod2E9e30pKTt2YXIgX2E7KGZ1bmN0aW9uKGUpe2VbZS5PcGVuQnJhY2VUb2tlbj0xXT0iT3BlbkJyYWNlVG9rZW4iLGVbZS5DbG9zZUJyYWNlVG9rZW49Ml09IkNsb3NlQnJhY2VUb2tlbiIsZVtlLk9wZW5CcmFja2V0VG9rZW49M109Ik9wZW5CcmFja2V0VG9rZW4iLGVbZS5DbG9zZUJyYWNrZXRUb2tlbj00XT0iQ2xvc2VCcmFja2V0VG9rZW4iLGVbZS5Db21tYVRva2VuPTVdPSJDb21tYVRva2VuIixlW2UuQ29sb25Ub2tlbj02XT0iQ29sb25Ub2tlbiIsZVtlLk51bGxLZXl3b3JkPTddPSJOdWxsS2V5d29yZCIsZVtlLlRydWVLZXl3b3JkPThdPSJUcnVlS2V5d29yZCIsZVtlLkZhbHNlS2V5d29yZD05XT0iRmFsc2VLZXl3b3JkIixlW2UuU3RyaW5nTGl0ZXJhbD0xMF09IlN0cmluZ0xpdGVyYWwiLGVbZS5OdW1lcmljTGl0ZXJhbD0xMV09Ik51bWVyaWNMaXRlcmFsIixlW2UuTGluZUNvbW1lbnRUcml2aWE9MTJdPSJMaW5lQ29tbWVudFRyaXZpYSIsZVtlLkJsb2NrQ29tbWVudFRyaXZpYT0xM109IkJsb2NrQ29tbWVudFRyaXZpYSIsZVtlLkxpbmVCcmVha1RyaXZpYT0xNF09IkxpbmVCcmVha1RyaXZpYSIsZVtlLlRyaXZpYT0xNV09IlRyaXZpYSIsZVtlLlVua25vd249MTZdPSJVbmtub3duIixlW2UuRU9GPTE3XT0iRU9GIn0pKF9hfHwoX2E9e30pKTt2YXIgVmM9UGMsRGM9eWEsT2M9eGEsJGM9UHIsTGE7KGZ1bmN0aW9uKGUpe2VbZS5JbnZhbGlkU3ltYm9sPTFdPSJJbnZhbGlkU3ltYm9sIixlW2UuSW52YWxpZE51bWJlckZvcm1hdD0yXT0iSW52YWxpZE51bWJlckZvcm1hdCIsZVtlLlByb3BlcnR5TmFtZUV4cGVjdGVkPTNdPSJQcm9wZXJ0eU5hbWVFeHBlY3RlZCIsZVtlLlZhbHVlRXhwZWN0ZWQ9NF09IlZhbHVlRXhwZWN0ZWQiLGVbZS5Db2xvbkV4cGVjdGVkPTVdPSJDb2xvbkV4cGVjdGVkIixlW2UuQ29tbWFFeHBlY3RlZD02XT0iQ29tbWFFeHBlY3RlZCIsZVtlLkNsb3NlQnJhY2VFeHBlY3RlZD03XT0iQ2xvc2VCcmFjZUV4cGVjdGVkIixlW2UuQ2xvc2VCcmFja2V0RXhwZWN0ZWQ9OF09IkNsb3NlQnJhY2tldEV4cGVjdGVkIixlW2UuRW5kT2ZGaWxlRXhwZWN0ZWQ9OV09IkVuZE9mRmlsZUV4cGVjdGVkIixlW2UuSW52YWxpZENvbW1lbnRUb2tlbj0xMF09IkludmFsaWRDb21tZW50VG9rZW4iLGVbZS5VbmV4cGVjdGVkRW5kT2ZDb21tZW50PTExXT0iVW5leHBlY3RlZEVuZE9mQ29tbWVudCIsZVtlLlVuZXhwZWN0ZWRFbmRPZlN0cmluZz0xMl09IlVuZXhwZWN0ZWRFbmRPZlN0cmluZyIsZVtlLlVuZXhwZWN0ZWRFbmRPZk51bWJlcj0xM109IlVuZXhwZWN0ZWRFbmRPZk51bWJlciIsZVtlLkludmFsaWRVbmljb2RlPTE0XT0iSW52YWxpZFVuaWNvZGUiLGVbZS5JbnZhbGlkRXNjYXBlQ2hhcmFjdGVyPTE1XT0iSW52YWxpZEVzY2FwZUNoYXJhY3RlciIsZVtlLkludmFsaWRDaGFyYWN0ZXI9MTZdPSJJbnZhbGlkQ2hhcmFjdGVyIn0pKExhfHwoTGE9e30pKTtmdW5jdGlvbiBVYyhlLHQsbil7cmV0dXJuIE1jKGUsdCxuKX1mdW5jdGlvbiBSdChlLHQpe2lmKGU9PT10KXJldHVybiEwO2lmKGU9PW51bGx8fHQ9PT1udWxsfHx0PT09dm9pZCAwfHx0eXBlb2YgZSE9dHlwZW9mIHR8fHR5cGVvZiBlIT0ib2JqZWN0Inx8QXJyYXkuaXNBcnJheShlKSE9PUFycmF5LmlzQXJyYXkodCkpcmV0dXJuITE7bGV0IG4scjtpZihBcnJheS5pc0FycmF5KGUpKXtpZihlLmxlbmd0aCE9PXQubGVuZ3RoKXJldHVybiExO2ZvcihuPTA7bjxlLmxlbmd0aDtuKyspaWYoIVJ0KGVbbl0sdFtuXSkpcmV0dXJuITF9ZWxzZXtjb25zdCBpPVtdO2ZvcihyIGluIGUpaS5wdXNoKHIpO2kuc29ydCgpO2NvbnN0IHM9W107Zm9yKHIgaW4gdClzLnB1c2gocik7aWYocy5zb3J0KCksIVJ0KGkscykpcmV0dXJuITE7Zm9yKG49MDtuPGkubGVuZ3RoO24rKylpZighUnQoZVtpW25dXSx0W2lbbl1dKSlyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBoZShlKXtyZXR1cm4gdHlwZW9mIGU9PSJudW1iZXIifWZ1bmN0aW9uIEVlKGUpe3JldHVybiB0eXBlb2YgZTwidSJ9ZnVuY3Rpb24gVmUoZSl7cmV0dXJuIHR5cGVvZiBlPT0iYm9vbGVhbiJ9ZnVuY3Rpb24gTmEoZSl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nIn1mdW5jdGlvbiBldChlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiZlIT09bnVsbCYmIUFycmF5LmlzQXJyYXkoZSl9ZnVuY3Rpb24gQmMoZSx0KXtpZihlLmxlbmd0aDx0Lmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IG49MDtuPHQubGVuZ3RoO24rKylpZihlW25dIT09dFtuXSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbiBRdChlLHQpe2NvbnN0IG49ZS5sZW5ndGgtdC5sZW5ndGg7cmV0dXJuIG4+MD9lLmxhc3RJbmRleE9mKHQpPT09bjpuPT09MD9lPT09dDohMX1mdW5jdGlvbiBSbihlKXtsZXQgdD0iIjtCYyhlLCIoP2kpIikmJihlPWUuc3Vic3RyaW5nKDQpLHQ9ImkiKTt0cnl7cmV0dXJuIG5ldyBSZWdFeHAoZSx0KyJ1Iil9Y2F0Y2h7dHJ5e3JldHVybiBuZXcgUmVnRXhwKGUsdCl9Y2F0Y2h7cmV0dXJufX19ZnVuY3Rpb24gU2EoZSl7bGV0IHQ9MDtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7dCsrO2NvbnN0IHI9ZS5jaGFyQ29kZUF0KG4pOzU1Mjk2PD1yJiZyPD01NjMxOSYmbisrfXJldHVybiB0fXZhciBBYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtyZXR1cm4gdHlwZW9mIG49PSJzdHJpbmcifWUuaXM9dH0pKEFhfHwoQWE9e30pKTt2YXIgSXI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7cmV0dXJuIHR5cGVvZiBuPT0ic3RyaW5nIn1lLmlzPXR9KShJcnx8KElyPXt9KSk7dmFyIGthOyhmdW5jdGlvbihlKXtlLk1JTl9WQUxVRT0tMjE0NzQ4MzY0OCxlLk1BWF9WQUxVRT0yMTQ3NDgzNjQ3O2Z1bmN0aW9uIHQobil7cmV0dXJuIHR5cGVvZiBuPT0ibnVtYmVyIiYmZS5NSU5fVkFMVUU8PW4mJm48PWUuTUFYX1ZBTFVFfWUuaXM9dH0pKGthfHwoa2E9e30pKTt2YXIgRW47KGZ1bmN0aW9uKGUpe2UuTUlOX1ZBTFVFPTAsZS5NQVhfVkFMVUU9MjE0NzQ4MzY0NztmdW5jdGlvbiB0KG4pe3JldHVybiB0eXBlb2Ygbj09Im51bWJlciImJmUuTUlOX1ZBTFVFPD1uJiZuPD1lLk1BWF9WQUxVRX1lLmlzPXR9KShFbnx8KEVuPXt9KSk7dmFyIFo7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpKXtyZXR1cm4gcj09PU51bWJlci5NQVhfVkFMVUUmJihyPUVuLk1BWF9WQUxVRSksaT09PU51bWJlci5NQVhfVkFMVUUmJihpPUVuLk1BWF9WQUxVRSkse2xpbmU6cixjaGFyYWN0ZXI6aX19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmUy51aW50ZWdlcihpLmxpbmUpJiZTLnVpbnRlZ2VyKGkuY2hhcmFjdGVyKX1lLmlzPW59KShafHwoWj17fSkpO3ZhciBxOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSxzLGEpe2lmKFMudWludGVnZXIocikmJlMudWludGVnZXIoaSkmJlMudWludGVnZXIocykmJlMudWludGVnZXIoYSkpcmV0dXJue3N0YXJ0OlouY3JlYXRlKHIsaSksZW5kOlouY3JlYXRlKHMsYSl9O2lmKFouaXMocikmJlouaXMoaSkpcmV0dXJue3N0YXJ0OnIsZW5kOml9O3Rocm93IG5ldyBFcnJvcihgUmFuZ2UjY3JlYXRlIGNhbGxlZCB3aXRoIGludmFsaWQgYXJndW1lbnRzWyR7cn0sICR7aX0sICR7c30sICR7YX1dYCl9ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmWi5pcyhpLnN0YXJ0KSYmWi5pcyhpLmVuZCl9ZS5pcz1ufSkocXx8KHE9e30pKTt2YXIgRXQ7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpKXtyZXR1cm57dXJpOnIscmFuZ2U6aX19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmcS5pcyhpLnJhbmdlKSYmKFMuc3RyaW5nKGkudXJpKXx8Uy51bmRlZmluZWQoaS51cmkpKX1lLmlzPW59KShFdHx8KEV0PXt9KSk7dmFyIFJhOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSxzLGEpe3JldHVybnt0YXJnZXRVcmk6cix0YXJnZXRSYW5nZTppLHRhcmdldFNlbGVjdGlvblJhbmdlOnMsb3JpZ2luU2VsZWN0aW9uUmFuZ2U6YX19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmcS5pcyhpLnRhcmdldFJhbmdlKSYmUy5zdHJpbmcoaS50YXJnZXRVcmkpJiZxLmlzKGkudGFyZ2V0U2VsZWN0aW9uUmFuZ2UpJiYocS5pcyhpLm9yaWdpblNlbGVjdGlvblJhbmdlKXx8Uy51bmRlZmluZWQoaS5vcmlnaW5TZWxlY3Rpb25SYW5nZSkpfWUuaXM9bn0pKFJhfHwoUmE9e30pKTt2YXIgRnI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpLHMsYSl7cmV0dXJue3JlZDpyLGdyZWVuOmksYmx1ZTpzLGFscGhhOmF9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmUy5udW1iZXJSYW5nZShpLnJlZCwwLDEpJiZTLm51bWJlclJhbmdlKGkuZ3JlZW4sMCwxKSYmUy5udW1iZXJSYW5nZShpLmJsdWUsMCwxKSYmUy5udW1iZXJSYW5nZShpLmFscGhhLDAsMSl9ZS5pcz1ufSkoRnJ8fChGcj17fSkpO3ZhciBFYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkpe3JldHVybntyYW5nZTpyLGNvbG9yOml9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmcS5pcyhpLnJhbmdlKSYmRnIuaXMoaS5jb2xvcil9ZS5pcz1ufSkoRWF8fChFYT17fSkpO3ZhciBNYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyl7cmV0dXJue2xhYmVsOnIsdGV4dEVkaXQ6aSxhZGRpdGlvbmFsVGV4dEVkaXRzOnN9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmUy5zdHJpbmcoaS5sYWJlbCkmJihTLnVuZGVmaW5lZChpLnRleHRFZGl0KXx8RGUuaXMoaSkpJiYoUy51bmRlZmluZWQoaS5hZGRpdGlvbmFsVGV4dEVkaXRzKXx8Uy50eXBlZEFycmF5KGkuYWRkaXRpb25hbFRleHRFZGl0cyxEZS5pcykpfWUuaXM9bn0pKE1hfHwoTWE9e30pKTt2YXIgWXQ7KGZ1bmN0aW9uKGUpe2UuQ29tbWVudD0iY29tbWVudCIsZS5JbXBvcnRzPSJpbXBvcnRzIixlLlJlZ2lvbj0icmVnaW9uIn0pKFl0fHwoWXQ9e30pKTt2YXIgQ2E7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpLHMsYSxsLG8pe2NvbnN0IHU9e3N0YXJ0TGluZTpyLGVuZExpbmU6aX07cmV0dXJuIFMuZGVmaW5lZChzKSYmKHUuc3RhcnRDaGFyYWN0ZXI9cyksUy5kZWZpbmVkKGEpJiYodS5lbmRDaGFyYWN0ZXI9YSksUy5kZWZpbmVkKGwpJiYodS5raW5kPWwpLFMuZGVmaW5lZChvKSYmKHUuY29sbGFwc2VkVGV4dD1vKSx1fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmUy51aW50ZWdlcihpLnN0YXJ0TGluZSkmJlMudWludGVnZXIoaS5zdGFydExpbmUpJiYoUy51bmRlZmluZWQoaS5zdGFydENoYXJhY3Rlcil8fFMudWludGVnZXIoaS5zdGFydENoYXJhY3RlcikpJiYoUy51bmRlZmluZWQoaS5lbmRDaGFyYWN0ZXIpfHxTLnVpbnRlZ2VyKGkuZW5kQ2hhcmFjdGVyKSkmJihTLnVuZGVmaW5lZChpLmtpbmQpfHxTLnN0cmluZyhpLmtpbmQpKX1lLmlzPW59KShDYXx8KENhPXt9KSk7dmFyIFZyOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSl7cmV0dXJue2xvY2F0aW9uOnIsbWVzc2FnZTppfX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gUy5kZWZpbmVkKGkpJiZFdC5pcyhpLmxvY2F0aW9uKSYmUy5zdHJpbmcoaS5tZXNzYWdlKX1lLmlzPW59KShWcnx8KFZyPXt9KSk7dmFyIHhlOyhmdW5jdGlvbihlKXtlLkVycm9yPTEsZS5XYXJuaW5nPTIsZS5JbmZvcm1hdGlvbj0zLGUuSGludD00fSkoeGV8fCh4ZT17fSkpO3ZhciBUYTsoZnVuY3Rpb24oZSl7ZS5Vbm5lY2Vzc2FyeT0xLGUuRGVwcmVjYXRlZD0yfSkoVGF8fChUYT17fSkpO3ZhciBQYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtjb25zdCByPW47cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChyKSYmUy5zdHJpbmcoci5ocmVmKX1lLmlzPXR9KShQYXx8KFBhPXt9KSk7dmFyIHplOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSxzLGEsbCxvKXtsZXQgdT17cmFuZ2U6cixtZXNzYWdlOml9O3JldHVybiBTLmRlZmluZWQocykmJih1LnNldmVyaXR5PXMpLFMuZGVmaW5lZChhKSYmKHUuY29kZT1hKSxTLmRlZmluZWQobCkmJih1LnNvdXJjZT1sKSxTLmRlZmluZWQobykmJih1LnJlbGF0ZWRJbmZvcm1hdGlvbj1vKSx1fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXt2YXIgaTtsZXQgcz1yO3JldHVybiBTLmRlZmluZWQocykmJnEuaXMocy5yYW5nZSkmJlMuc3RyaW5nKHMubWVzc2FnZSkmJihTLm51bWJlcihzLnNldmVyaXR5KXx8Uy51bmRlZmluZWQocy5zZXZlcml0eSkpJiYoUy5pbnRlZ2VyKHMuY29kZSl8fFMuc3RyaW5nKHMuY29kZSl8fFMudW5kZWZpbmVkKHMuY29kZSkpJiYoUy51bmRlZmluZWQocy5jb2RlRGVzY3JpcHRpb24pfHxTLnN0cmluZygoaT1zLmNvZGVEZXNjcmlwdGlvbik9PT1udWxsfHxpPT09dm9pZCAwP3ZvaWQgMDppLmhyZWYpKSYmKFMuc3RyaW5nKHMuc291cmNlKXx8Uy51bmRlZmluZWQocy5zb3VyY2UpKSYmKFMudW5kZWZpbmVkKHMucmVsYXRlZEluZm9ybWF0aW9uKXx8Uy50eXBlZEFycmF5KHMucmVsYXRlZEluZm9ybWF0aW9uLFZyLmlzKSl9ZS5pcz1ufSkoemV8fCh6ZT17fSkpO3ZhciBNdDsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGksLi4ucyl7bGV0IGE9e3RpdGxlOnIsY29tbWFuZDppfTtyZXR1cm4gUy5kZWZpbmVkKHMpJiZzLmxlbmd0aD4wJiYoYS5hcmd1bWVudHM9cyksYX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gUy5kZWZpbmVkKGkpJiZTLnN0cmluZyhpLnRpdGxlKSYmUy5zdHJpbmcoaS5jb21tYW5kKX1lLmlzPW59KShNdHx8KE10PXt9KSk7dmFyIERlOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHMsYSl7cmV0dXJue3JhbmdlOnMsbmV3VGV4dDphfX1lLnJlcGxhY2U9dDtmdW5jdGlvbiBuKHMsYSl7cmV0dXJue3JhbmdlOntzdGFydDpzLGVuZDpzfSxuZXdUZXh0OmF9fWUuaW5zZXJ0PW47ZnVuY3Rpb24gcihzKXtyZXR1cm57cmFuZ2U6cyxuZXdUZXh0OiIifX1lLmRlbD1yO2Z1bmN0aW9uIGkocyl7Y29uc3QgYT1zO3JldHVybiBTLm9iamVjdExpdGVyYWwoYSkmJlMuc3RyaW5nKGEubmV3VGV4dCkmJnEuaXMoYS5yYW5nZSl9ZS5pcz1pfSkoRGV8fChEZT17fSkpO3ZhciBEcjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyl7Y29uc3QgYT17bGFiZWw6cn07cmV0dXJuIGkhPT12b2lkIDAmJihhLm5lZWRzQ29uZmlybWF0aW9uPWkpLHMhPT12b2lkIDAmJihhLmRlc2NyaXB0aW9uPXMpLGF9ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IGk9cjtyZXR1cm4gUy5vYmplY3RMaXRlcmFsKGkpJiZTLnN0cmluZyhpLmxhYmVsKSYmKFMuYm9vbGVhbihpLm5lZWRzQ29uZmlybWF0aW9uKXx8aS5uZWVkc0NvbmZpcm1hdGlvbj09PXZvaWQgMCkmJihTLnN0cmluZyhpLmRlc2NyaXB0aW9uKXx8aS5kZXNjcmlwdGlvbj09PXZvaWQgMCl9ZS5pcz1ufSkoRHJ8fChEcj17fSkpO3ZhciBDdDsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtjb25zdCByPW47cmV0dXJuIFMuc3RyaW5nKHIpfWUuaXM9dH0pKEN0fHwoQ3Q9e30pKTt2YXIgSWE7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocyxhLGwpe3JldHVybntyYW5nZTpzLG5ld1RleHQ6YSxhbm5vdGF0aW9uSWQ6bH19ZS5yZXBsYWNlPXQ7ZnVuY3Rpb24gbihzLGEsbCl7cmV0dXJue3JhbmdlOntzdGFydDpzLGVuZDpzfSxuZXdUZXh0OmEsYW5ub3RhdGlvbklkOmx9fWUuaW5zZXJ0PW47ZnVuY3Rpb24gcihzLGEpe3JldHVybntyYW5nZTpzLG5ld1RleHQ6IiIsYW5ub3RhdGlvbklkOmF9fWUuZGVsPXI7ZnVuY3Rpb24gaShzKXtjb25zdCBhPXM7cmV0dXJuIERlLmlzKGEpJiYoRHIuaXMoYS5hbm5vdGF0aW9uSWQpfHxDdC5pcyhhLmFubm90YXRpb25JZCkpfWUuaXM9aX0pKElhfHwoSWE9e30pKTt2YXIgT3I7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpKXtyZXR1cm57dGV4dERvY3VtZW50OnIsZWRpdHM6aX19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMuZGVmaW5lZChpKSYmanIuaXMoaS50ZXh0RG9jdW1lbnQpJiZBcnJheS5pc0FycmF5KGkuZWRpdHMpfWUuaXM9bn0pKE9yfHwoT3I9e30pKTt2YXIgJHI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpLHMpe2xldCBhPXtraW5kOiJjcmVhdGUiLHVyaTpyfTtyZXR1cm4gaSE9PXZvaWQgMCYmKGkub3ZlcndyaXRlIT09dm9pZCAwfHxpLmlnbm9yZUlmRXhpc3RzIT09dm9pZCAwKSYmKGEub3B0aW9ucz1pKSxzIT09dm9pZCAwJiYoYS5hbm5vdGF0aW9uSWQ9cyksYX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gaSYmaS5raW5kPT09ImNyZWF0ZSImJlMuc3RyaW5nKGkudXJpKSYmKGkub3B0aW9ucz09PXZvaWQgMHx8KGkub3B0aW9ucy5vdmVyd3JpdGU9PT12b2lkIDB8fFMuYm9vbGVhbihpLm9wdGlvbnMub3ZlcndyaXRlKSkmJihpLm9wdGlvbnMuaWdub3JlSWZFeGlzdHM9PT12b2lkIDB8fFMuYm9vbGVhbihpLm9wdGlvbnMuaWdub3JlSWZFeGlzdHMpKSkmJihpLmFubm90YXRpb25JZD09PXZvaWQgMHx8Q3QuaXMoaS5hbm5vdGF0aW9uSWQpKX1lLmlzPW59KSgkcnx8KCRyPXt9KSk7dmFyIFVyOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSxzLGEpe2xldCBsPXtraW5kOiJyZW5hbWUiLG9sZFVyaTpyLG5ld1VyaTppfTtyZXR1cm4gcyE9PXZvaWQgMCYmKHMub3ZlcndyaXRlIT09dm9pZCAwfHxzLmlnbm9yZUlmRXhpc3RzIT09dm9pZCAwKSYmKGwub3B0aW9ucz1zKSxhIT09dm9pZCAwJiYobC5hbm5vdGF0aW9uSWQ9YSksbH1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gaSYmaS5raW5kPT09InJlbmFtZSImJlMuc3RyaW5nKGkub2xkVXJpKSYmUy5zdHJpbmcoaS5uZXdVcmkpJiYoaS5vcHRpb25zPT09dm9pZCAwfHwoaS5vcHRpb25zLm92ZXJ3cml0ZT09PXZvaWQgMHx8Uy5ib29sZWFuKGkub3B0aW9ucy5vdmVyd3JpdGUpKSYmKGkub3B0aW9ucy5pZ25vcmVJZkV4aXN0cz09PXZvaWQgMHx8Uy5ib29sZWFuKGkub3B0aW9ucy5pZ25vcmVJZkV4aXN0cykpKSYmKGkuYW5ub3RhdGlvbklkPT09dm9pZCAwfHxDdC5pcyhpLmFubm90YXRpb25JZCkpfWUuaXM9bn0pKFVyfHwoVXI9e30pKTt2YXIgQnI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpLHMpe2xldCBhPXtraW5kOiJkZWxldGUiLHVyaTpyfTtyZXR1cm4gaSE9PXZvaWQgMCYmKGkucmVjdXJzaXZlIT09dm9pZCAwfHxpLmlnbm9yZUlmTm90RXhpc3RzIT09dm9pZCAwKSYmKGEub3B0aW9ucz1pKSxzIT09dm9pZCAwJiYoYS5hbm5vdGF0aW9uSWQ9cyksYX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gaSYmaS5raW5kPT09ImRlbGV0ZSImJlMuc3RyaW5nKGkudXJpKSYmKGkub3B0aW9ucz09PXZvaWQgMHx8KGkub3B0aW9ucy5yZWN1cnNpdmU9PT12b2lkIDB8fFMuYm9vbGVhbihpLm9wdGlvbnMucmVjdXJzaXZlKSkmJihpLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHM9PT12b2lkIDB8fFMuYm9vbGVhbihpLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMpKSkmJihpLmFubm90YXRpb25JZD09PXZvaWQgMHx8Q3QuaXMoaS5hbm5vdGF0aW9uSWQpKX1lLmlzPW59KShCcnx8KEJyPXt9KSk7dmFyIHFyOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe2xldCByPW47cmV0dXJuIHImJihyLmNoYW5nZXMhPT12b2lkIDB8fHIuZG9jdW1lbnRDaGFuZ2VzIT09dm9pZCAwKSYmKHIuZG9jdW1lbnRDaGFuZ2VzPT09dm9pZCAwfHxyLmRvY3VtZW50Q2hhbmdlcy5ldmVyeShpPT5TLnN0cmluZyhpLmtpbmQpPyRyLmlzKGkpfHxVci5pcyhpKXx8QnIuaXMoaSk6T3IuaXMoaSkpKX1lLmlzPXR9KShxcnx8KHFyPXt9KSk7dmFyIEZhOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe3JldHVybnt1cmk6cn19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMuZGVmaW5lZChpKSYmUy5zdHJpbmcoaS51cmkpfWUuaXM9bn0pKEZhfHwoRmE9e30pKTt2YXIgVmE7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpKXtyZXR1cm57dXJpOnIsdmVyc2lvbjppfX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gUy5kZWZpbmVkKGkpJiZTLnN0cmluZyhpLnVyaSkmJlMuaW50ZWdlcihpLnZlcnNpb24pfWUuaXM9bn0pKFZhfHwoVmE9e30pKTt2YXIganI7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpKXtyZXR1cm57dXJpOnIsdmVyc2lvbjppfX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gUy5kZWZpbmVkKGkpJiZTLnN0cmluZyhpLnVyaSkmJihpLnZlcnNpb249PT1udWxsfHxTLmludGVnZXIoaS52ZXJzaW9uKSl9ZS5pcz1ufSkoanJ8fChqcj17fSkpO3ZhciBEYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyxhKXtyZXR1cm57dXJpOnIsbGFuZ3VhZ2VJZDppLHZlcnNpb246cyx0ZXh0OmF9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtsZXQgaT1yO3JldHVybiBTLmRlZmluZWQoaSkmJlMuc3RyaW5nKGkudXJpKSYmUy5zdHJpbmcoaS5sYW5ndWFnZUlkKSYmUy5pbnRlZ2VyKGkudmVyc2lvbikmJlMuc3RyaW5nKGkudGV4dCl9ZS5pcz1ufSkoRGF8fChEYT17fSkpO3ZhciBvdDsoZnVuY3Rpb24oZSl7ZS5QbGFpblRleHQ9InBsYWludGV4dCIsZS5NYXJrZG93bj0ibWFya2Rvd24iO2Z1bmN0aW9uIHQobil7Y29uc3Qgcj1uO3JldHVybiByPT09ZS5QbGFpblRleHR8fHI9PT1lLk1hcmtkb3dufWUuaXM9dH0pKG90fHwob3Q9e30pKTt2YXIgWnQ7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7Y29uc3Qgcj1uO3JldHVybiBTLm9iamVjdExpdGVyYWwobikmJm90LmlzKHIua2luZCkmJlMuc3RyaW5nKHIudmFsdWUpfWUuaXM9dH0pKFp0fHwoWnQ9e30pKTt2YXIgeWU7KGZ1bmN0aW9uKGUpe2UuVGV4dD0xLGUuTWV0aG9kPTIsZS5GdW5jdGlvbj0zLGUuQ29uc3RydWN0b3I9NCxlLkZpZWxkPTUsZS5WYXJpYWJsZT02LGUuQ2xhc3M9NyxlLkludGVyZmFjZT04LGUuTW9kdWxlPTksZS5Qcm9wZXJ0eT0xMCxlLlVuaXQ9MTEsZS5WYWx1ZT0xMixlLkVudW09MTMsZS5LZXl3b3JkPTE0LGUuU25pcHBldD0xNSxlLkNvbG9yPTE2LGUuRmlsZT0xNyxlLlJlZmVyZW5jZT0xOCxlLkZvbGRlcj0xOSxlLkVudW1NZW1iZXI9MjAsZS5Db25zdGFudD0yMSxlLlN0cnVjdD0yMixlLkV2ZW50PTIzLGUuT3BlcmF0b3I9MjQsZS5UeXBlUGFyYW1ldGVyPTI1fSkoeWV8fCh5ZT17fSkpO3ZhciBpZTsoZnVuY3Rpb24oZSl7ZS5QbGFpblRleHQ9MSxlLlNuaXBwZXQ9Mn0pKGllfHwoaWU9e30pKTt2YXIgT2E7KGZ1bmN0aW9uKGUpe2UuRGVwcmVjYXRlZD0xfSkoT2F8fChPYT17fSkpO3ZhciAkYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyl7cmV0dXJue25ld1RleHQ6cixpbnNlcnQ6aSxyZXBsYWNlOnN9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIGkmJlMuc3RyaW5nKGkubmV3VGV4dCkmJnEuaXMoaS5pbnNlcnQpJiZxLmlzKGkucmVwbGFjZSl9ZS5pcz1ufSkoJGF8fCgkYT17fSkpO3ZhciBVYTsoZnVuY3Rpb24oZSl7ZS5hc0lzPTEsZS5hZGp1c3RJbmRlbnRhdGlvbj0yfSkoVWF8fChVYT17fSkpO3ZhciBCYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtjb25zdCByPW47cmV0dXJuIHImJihTLnN0cmluZyhyLmRldGFpbCl8fHIuZGV0YWlsPT09dm9pZCAwKSYmKFMuc3RyaW5nKHIuZGVzY3JpcHRpb24pfHxyLmRlc2NyaXB0aW9uPT09dm9pZCAwKX1lLmlzPXR9KShCYXx8KEJhPXt9KSk7dmFyIFdyOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3JldHVybntsYWJlbDpufX1lLmNyZWF0ZT10fSkoV3J8fChXcj17fSkpO3ZhciBxYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuLHIpe3JldHVybntpdGVtczpufHxbXSxpc0luY29tcGxldGU6ISFyfX1lLmNyZWF0ZT10fSkocWF8fChxYT17fSkpO3ZhciBNbjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyKXtyZXR1cm4gci5yZXBsYWNlKC9bXFxgKl97fVtcXSgpIytcLS4hXS9nLCJcXCQmIil9ZS5mcm9tUGxhaW5UZXh0PXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIFMuc3RyaW5nKGkpfHxTLm9iamVjdExpdGVyYWwoaSkmJlMuc3RyaW5nKGkubGFuZ3VhZ2UpJiZTLnN0cmluZyhpLnZhbHVlKX1lLmlzPW59KShNbnx8KE1uPXt9KSk7dmFyIGphOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe2xldCByPW47cmV0dXJuISFyJiZTLm9iamVjdExpdGVyYWwocikmJihadC5pcyhyLmNvbnRlbnRzKXx8TW4uaXMoci5jb250ZW50cyl8fFMudHlwZWRBcnJheShyLmNvbnRlbnRzLE1uLmlzKSkmJihuLnJhbmdlPT09dm9pZCAwfHxxLmlzKG4ucmFuZ2UpKX1lLmlzPXR9KShqYXx8KGphPXt9KSk7dmFyIFdhOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4scil7cmV0dXJuIHI/e2xhYmVsOm4sZG9jdW1lbnRhdGlvbjpyfTp7bGFiZWw6bn19ZS5jcmVhdGU9dH0pKFdhfHwoV2E9e30pKTt2YXIgSGE7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobixyLC4uLmkpe2xldCBzPXtsYWJlbDpufTtyZXR1cm4gUy5kZWZpbmVkKHIpJiYocy5kb2N1bWVudGF0aW9uPXIpLFMuZGVmaW5lZChpKT9zLnBhcmFtZXRlcnM9aTpzLnBhcmFtZXRlcnM9W10sc31lLmNyZWF0ZT10fSkoSGF8fChIYT17fSkpO3ZhciB6YTsoZnVuY3Rpb24oZSl7ZS5UZXh0PTEsZS5SZWFkPTIsZS5Xcml0ZT0zfSkoemF8fCh6YT17fSkpO3ZhciBHYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuLHIpe2xldCBpPXtyYW5nZTpufTtyZXR1cm4gUy5udW1iZXIocikmJihpLmtpbmQ9ciksaX1lLmNyZWF0ZT10fSkoR2F8fChHYT17fSkpO3ZhciBPZTsoZnVuY3Rpb24oZSl7ZS5GaWxlPTEsZS5Nb2R1bGU9MixlLk5hbWVzcGFjZT0zLGUuUGFja2FnZT00LGUuQ2xhc3M9NSxlLk1ldGhvZD02LGUuUHJvcGVydHk9NyxlLkZpZWxkPTgsZS5Db25zdHJ1Y3Rvcj05LGUuRW51bT0xMCxlLkludGVyZmFjZT0xMSxlLkZ1bmN0aW9uPTEyLGUuVmFyaWFibGU9MTMsZS5Db25zdGFudD0xNCxlLlN0cmluZz0xNSxlLk51bWJlcj0xNixlLkJvb2xlYW49MTcsZS5BcnJheT0xOCxlLk9iamVjdD0xOSxlLktleT0yMCxlLk51bGw9MjEsZS5FbnVtTWVtYmVyPTIyLGUuU3RydWN0PTIzLGUuRXZlbnQ9MjQsZS5PcGVyYXRvcj0yNSxlLlR5cGVQYXJhbWV0ZXI9MjZ9KShPZXx8KE9lPXt9KSk7dmFyIEphOyhmdW5jdGlvbihlKXtlLkRlcHJlY2F0ZWQ9MX0pKEphfHwoSmE9e30pKTt2YXIgWGE7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobixyLGkscyxhKXtsZXQgbD17bmFtZTpuLGtpbmQ6cixsb2NhdGlvbjp7dXJpOnMscmFuZ2U6aX19O3JldHVybiBhJiYobC5jb250YWluZXJOYW1lPWEpLGx9ZS5jcmVhdGU9dH0pKFhhfHwoWGE9e30pKTt2YXIgUWE7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobixyLGkscyl7cmV0dXJuIHMhPT12b2lkIDA/e25hbWU6bixraW5kOnIsbG9jYXRpb246e3VyaTppLHJhbmdlOnN9fTp7bmFtZTpuLGtpbmQ6cixsb2NhdGlvbjp7dXJpOml9fX1lLmNyZWF0ZT10fSkoUWF8fChRYT17fSkpO3ZhciBZYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyxhLGwsbyl7bGV0IHU9e25hbWU6cixkZXRhaWw6aSxraW5kOnMscmFuZ2U6YSxzZWxlY3Rpb25SYW5nZTpsfTtyZXR1cm4gbyE9PXZvaWQgMCYmKHUuY2hpbGRyZW49byksdX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7bGV0IGk9cjtyZXR1cm4gaSYmUy5zdHJpbmcoaS5uYW1lKSYmUy5udW1iZXIoaS5raW5kKSYmcS5pcyhpLnJhbmdlKSYmcS5pcyhpLnNlbGVjdGlvblJhbmdlKSYmKGkuZGV0YWlsPT09dm9pZCAwfHxTLnN0cmluZyhpLmRldGFpbCkpJiYoaS5kZXByZWNhdGVkPT09dm9pZCAwfHxTLmJvb2xlYW4oaS5kZXByZWNhdGVkKSkmJihpLmNoaWxkcmVuPT09dm9pZCAwfHxBcnJheS5pc0FycmF5KGkuY2hpbGRyZW4pKSYmKGkudGFncz09PXZvaWQgMHx8QXJyYXkuaXNBcnJheShpLnRhZ3MpKX1lLmlzPW59KShZYXx8KFlhPXt9KSk7dmFyIFphOyhmdW5jdGlvbihlKXtlLkVtcHR5PSIiLGUuUXVpY2tGaXg9InF1aWNrZml4IixlLlJlZmFjdG9yPSJyZWZhY3RvciIsZS5SZWZhY3RvckV4dHJhY3Q9InJlZmFjdG9yLmV4dHJhY3QiLGUuUmVmYWN0b3JJbmxpbmU9InJlZmFjdG9yLmlubGluZSIsZS5SZWZhY3RvclJld3JpdGU9InJlZmFjdG9yLnJld3JpdGUiLGUuU291cmNlPSJzb3VyY2UiLGUuU291cmNlT3JnYW5pemVJbXBvcnRzPSJzb3VyY2Uub3JnYW5pemVJbXBvcnRzIixlLlNvdXJjZUZpeEFsbD0ic291cmNlLmZpeEFsbCJ9KShaYXx8KFphPXt9KSk7dmFyIENuOyhmdW5jdGlvbihlKXtlLkludm9rZWQ9MSxlLkF1dG9tYXRpYz0yfSkoQ258fChDbj17fSkpO3ZhciBLYTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyl7bGV0IGE9e2RpYWdub3N0aWNzOnJ9O3JldHVybiBpIT1udWxsJiYoYS5vbmx5PWkpLHMhPW51bGwmJihhLnRyaWdnZXJLaW5kPXMpLGF9ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMuZGVmaW5lZChpKSYmUy50eXBlZEFycmF5KGkuZGlhZ25vc3RpY3MsemUuaXMpJiYoaS5vbmx5PT09dm9pZCAwfHxTLnR5cGVkQXJyYXkoaS5vbmx5LFMuc3RyaW5nKSkmJihpLnRyaWdnZXJLaW5kPT09dm9pZCAwfHxpLnRyaWdnZXJLaW5kPT09Q24uSW52b2tlZHx8aS50cmlnZ2VyS2luZD09PUNuLkF1dG9tYXRpYyl9ZS5pcz1ufSkoS2F8fChLYT17fSkpO3ZhciBlbzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyl7bGV0IGE9e3RpdGxlOnJ9LGw9ITA7cmV0dXJuIHR5cGVvZiBpPT0ic3RyaW5nIj8obD0hMSxhLmtpbmQ9aSk6TXQuaXMoaSk/YS5jb21tYW5kPWk6YS5lZGl0PWksbCYmcyE9PXZvaWQgMCYmKGEua2luZD1zKSxhfWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtsZXQgaT1yO3JldHVybiBpJiZTLnN0cmluZyhpLnRpdGxlKSYmKGkuZGlhZ25vc3RpY3M9PT12b2lkIDB8fFMudHlwZWRBcnJheShpLmRpYWdub3N0aWNzLHplLmlzKSkmJihpLmtpbmQ9PT12b2lkIDB8fFMuc3RyaW5nKGkua2luZCkpJiYoaS5lZGl0IT09dm9pZCAwfHxpLmNvbW1hbmQhPT12b2lkIDApJiYoaS5jb21tYW5kPT09dm9pZCAwfHxNdC5pcyhpLmNvbW1hbmQpKSYmKGkuaXNQcmVmZXJyZWQ9PT12b2lkIDB8fFMuYm9vbGVhbihpLmlzUHJlZmVycmVkKSkmJihpLmVkaXQ9PT12b2lkIDB8fHFyLmlzKGkuZWRpdCkpfWUuaXM9bn0pKGVvfHwoZW89e30pKTt2YXIgdG87KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpKXtsZXQgcz17cmFuZ2U6cn07cmV0dXJuIFMuZGVmaW5lZChpKSYmKHMuZGF0YT1pKSxzfWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtsZXQgaT1yO3JldHVybiBTLmRlZmluZWQoaSkmJnEuaXMoaS5yYW5nZSkmJihTLnVuZGVmaW5lZChpLmNvbW1hbmQpfHxNdC5pcyhpLmNvbW1hbmQpKX1lLmlzPW59KSh0b3x8KHRvPXt9KSk7dmFyIG5vOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSl7cmV0dXJue3RhYlNpemU6cixpbnNlcnRTcGFjZXM6aX19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMuZGVmaW5lZChpKSYmUy51aW50ZWdlcihpLnRhYlNpemUpJiZTLmJvb2xlYW4oaS5pbnNlcnRTcGFjZXMpfWUuaXM9bn0pKG5vfHwobm89e30pKTt2YXIgcm87KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixpLHMpe3JldHVybntyYW5nZTpyLHRhcmdldDppLGRhdGE6c319ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2xldCBpPXI7cmV0dXJuIFMuZGVmaW5lZChpKSYmcS5pcyhpLnJhbmdlKSYmKFMudW5kZWZpbmVkKGkudGFyZ2V0KXx8Uy5zdHJpbmcoaS50YXJnZXQpKX1lLmlzPW59KShyb3x8KHJvPXt9KSk7dmFyIFRuOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSl7cmV0dXJue3JhbmdlOnIscGFyZW50Oml9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtsZXQgaT1yO3JldHVybiBTLm9iamVjdExpdGVyYWwoaSkmJnEuaXMoaS5yYW5nZSkmJihpLnBhcmVudD09PXZvaWQgMHx8ZS5pcyhpLnBhcmVudCkpfWUuaXM9bn0pKFRufHwoVG49e30pKTt2YXIgaW87KGZ1bmN0aW9uKGUpe2UubmFtZXNwYWNlPSJuYW1lc3BhY2UiLGUudHlwZT0idHlwZSIsZS5jbGFzcz0iY2xhc3MiLGUuZW51bT0iZW51bSIsZS5pbnRlcmZhY2U9ImludGVyZmFjZSIsZS5zdHJ1Y3Q9InN0cnVjdCIsZS50eXBlUGFyYW1ldGVyPSJ0eXBlUGFyYW1ldGVyIixlLnBhcmFtZXRlcj0icGFyYW1ldGVyIixlLnZhcmlhYmxlPSJ2YXJpYWJsZSIsZS5wcm9wZXJ0eT0icHJvcGVydHkiLGUuZW51bU1lbWJlcj0iZW51bU1lbWJlciIsZS5ldmVudD0iZXZlbnQiLGUuZnVuY3Rpb249ImZ1bmN0aW9uIixlLm1ldGhvZD0ibWV0aG9kIixlLm1hY3JvPSJtYWNybyIsZS5rZXl3b3JkPSJrZXl3b3JkIixlLm1vZGlmaWVyPSJtb2RpZmllciIsZS5jb21tZW50PSJjb21tZW50IixlLnN0cmluZz0ic3RyaW5nIixlLm51bWJlcj0ibnVtYmVyIixlLnJlZ2V4cD0icmVnZXhwIixlLm9wZXJhdG9yPSJvcGVyYXRvciIsZS5kZWNvcmF0b3I9ImRlY29yYXRvciJ9KShpb3x8KGlvPXt9KSk7dmFyIHNvOyhmdW5jdGlvbihlKXtlLmRlY2xhcmF0aW9uPSJkZWNsYXJhdGlvbiIsZS5kZWZpbml0aW9uPSJkZWZpbml0aW9uIixlLnJlYWRvbmx5PSJyZWFkb25seSIsZS5zdGF0aWM9InN0YXRpYyIsZS5kZXByZWNhdGVkPSJkZXByZWNhdGVkIixlLmFic3RyYWN0PSJhYnN0cmFjdCIsZS5hc3luYz0iYXN5bmMiLGUubW9kaWZpY2F0aW9uPSJtb2RpZmljYXRpb24iLGUuZG9jdW1lbnRhdGlvbj0iZG9jdW1lbnRhdGlvbiIsZS5kZWZhdWx0TGlicmFyeT0iZGVmYXVsdExpYnJhcnkifSkoc298fChzbz17fSkpO3ZhciBhbzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtjb25zdCByPW47cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChyKSYmKHIucmVzdWx0SWQ9PT12b2lkIDB8fHR5cGVvZiByLnJlc3VsdElkPT0ic3RyaW5nIikmJkFycmF5LmlzQXJyYXkoci5kYXRhKSYmKHIuZGF0YS5sZW5ndGg9PT0wfHx0eXBlb2Ygci5kYXRhWzBdPT0ibnVtYmVyIil9ZS5pcz10fSkoYW98fChhbz17fSkpO3ZhciBvbzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkpe3JldHVybntyYW5nZTpyLHRleHQ6aX19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IGk9cjtyZXR1cm4gaSE9bnVsbCYmcS5pcyhpLnJhbmdlKSYmUy5zdHJpbmcoaS50ZXh0KX1lLmlzPW59KShvb3x8KG9vPXt9KSk7dmFyIGxvOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIsaSxzKXtyZXR1cm57cmFuZ2U6cix2YXJpYWJsZU5hbWU6aSxjYXNlU2Vuc2l0aXZlTG9va3VwOnN9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIGkhPW51bGwmJnEuaXMoaS5yYW5nZSkmJlMuYm9vbGVhbihpLmNhc2VTZW5zaXRpdmVMb29rdXApJiYoUy5zdHJpbmcoaS52YXJpYWJsZU5hbWUpfHxpLnZhcmlhYmxlTmFtZT09PXZvaWQgMCl9ZS5pcz1ufSkobG98fChsbz17fSkpO3ZhciB1bzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkpe3JldHVybntyYW5nZTpyLGV4cHJlc3Npb246aX19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IGk9cjtyZXR1cm4gaSE9bnVsbCYmcS5pcyhpLnJhbmdlKSYmKFMuc3RyaW5nKGkuZXhwcmVzc2lvbil8fGkuZXhwcmVzc2lvbj09PXZvaWQgMCl9ZS5pcz1ufSkodW98fCh1bz17fSkpO3ZhciBjbzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkpe3JldHVybntmcmFtZUlkOnIsc3RvcHBlZExvY2F0aW9uOml9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIFMuZGVmaW5lZChpKSYmcS5pcyhyLnN0b3BwZWRMb2NhdGlvbil9ZS5pcz1ufSkoY298fChjbz17fSkpO3ZhciBIcjsoZnVuY3Rpb24oZSl7ZS5UeXBlPTEsZS5QYXJhbWV0ZXI9MjtmdW5jdGlvbiB0KG4pe3JldHVybiBuPT09MXx8bj09PTJ9ZS5pcz10fSkoSHJ8fChIcj17fSkpO3ZhciB6cjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyKXtyZXR1cm57dmFsdWU6cn19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IGk9cjtyZXR1cm4gUy5vYmplY3RMaXRlcmFsKGkpJiYoaS50b29sdGlwPT09dm9pZCAwfHxTLnN0cmluZyhpLnRvb2x0aXApfHxadC5pcyhpLnRvb2x0aXApKSYmKGkubG9jYXRpb249PT12b2lkIDB8fEV0LmlzKGkubG9jYXRpb24pKSYmKGkuY29tbWFuZD09PXZvaWQgMHx8TXQuaXMoaS5jb21tYW5kKSl9ZS5pcz1ufSkoenJ8fCh6cj17fSkpO3ZhciBmbzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLGkscyl7Y29uc3QgYT17cG9zaXRpb246cixsYWJlbDppfTtyZXR1cm4gcyE9PXZvaWQgMCYmKGEua2luZD1zKSxhfWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBpPXI7cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChpKSYmWi5pcyhpLnBvc2l0aW9uKSYmKFMuc3RyaW5nKGkubGFiZWwpfHxTLnR5cGVkQXJyYXkoaS5sYWJlbCx6ci5pcykpJiYoaS5raW5kPT09dm9pZCAwfHxIci5pcyhpLmtpbmQpKSYmaS50ZXh0RWRpdHM9PT12b2lkIDB8fFMudHlwZWRBcnJheShpLnRleHRFZGl0cyxEZS5pcykmJihpLnRvb2x0aXA9PT12b2lkIDB8fFMuc3RyaW5nKGkudG9vbHRpcCl8fFp0LmlzKGkudG9vbHRpcCkpJiYoaS5wYWRkaW5nTGVmdD09PXZvaWQgMHx8Uy5ib29sZWFuKGkucGFkZGluZ0xlZnQpKSYmKGkucGFkZGluZ1JpZ2h0PT09dm9pZCAwfHxTLmJvb2xlYW4oaS5wYWRkaW5nUmlnaHQpKX1lLmlzPW59KShmb3x8KGZvPXt9KSk7dmFyIGhvOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3JldHVybntraW5kOiJzbmlwcGV0Iix2YWx1ZTpufX1lLmNyZWF0ZVNuaXBwZXQ9dH0pKGhvfHwoaG89e30pKTt2YXIgbW87KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobixyLGkscyl7cmV0dXJue2luc2VydFRleHQ6bixmaWx0ZXJUZXh0OnIscmFuZ2U6aSxjb21tYW5kOnN9fWUuY3JlYXRlPXR9KShtb3x8KG1vPXt9KSk7dmFyIGdvOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3JldHVybntpdGVtczpufX1lLmNyZWF0ZT10fSkoZ298fChnbz17fSkpO3ZhciBwbzsoZnVuY3Rpb24oZSl7ZS5JbnZva2VkPTAsZS5BdXRvbWF0aWM9MX0pKHBvfHwocG89e30pKTt2YXIgYm87KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobixyKXtyZXR1cm57cmFuZ2U6bix0ZXh0OnJ9fWUuY3JlYXRlPXR9KShib3x8KGJvPXt9KSk7dmFyIHZvOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4scil7cmV0dXJue3RyaWdnZXJLaW5kOm4sc2VsZWN0ZWRDb21wbGV0aW9uSW5mbzpyfX1lLmNyZWF0ZT10fSkodm98fCh2bz17fSkpO3ZhciB4bzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtjb25zdCByPW47cmV0dXJuIFMub2JqZWN0TGl0ZXJhbChyKSYmSXIuaXMoci51cmkpJiZTLnN0cmluZyhyLm5hbWUpfWUuaXM9dH0pKHhvfHwoeG89e30pKTt2YXIgeW87KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocyxhLGwsbyl7cmV0dXJuIG5ldyBxYyhzLGEsbCxvKX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocyl7bGV0IGE9cztyZXR1cm4hIShTLmRlZmluZWQoYSkmJlMuc3RyaW5nKGEudXJpKSYmKFMudW5kZWZpbmVkKGEubGFuZ3VhZ2VJZCl8fFMuc3RyaW5nKGEubGFuZ3VhZ2VJZCkpJiZTLnVpbnRlZ2VyKGEubGluZUNvdW50KSYmUy5mdW5jKGEuZ2V0VGV4dCkmJlMuZnVuYyhhLnBvc2l0aW9uQXQpJiZTLmZ1bmMoYS5vZmZzZXRBdCkpfWUuaXM9bjtmdW5jdGlvbiByKHMsYSl7bGV0IGw9cy5nZXRUZXh0KCksbz1pKGEsKGgsZik9PntsZXQgZD1oLnJhbmdlLnN0YXJ0LmxpbmUtZi5yYW5nZS5zdGFydC5saW5lO3JldHVybiBkPT09MD9oLnJhbmdlLnN0YXJ0LmNoYXJhY3Rlci1mLnJhbmdlLnN0YXJ0LmNoYXJhY3RlcjpkfSksdT1sLmxlbmd0aDtmb3IobGV0IGg9by5sZW5ndGgtMTtoPj0wO2gtLSl7bGV0IGY9b1toXSxkPXMub2Zmc2V0QXQoZi5yYW5nZS5zdGFydCksbT1zLm9mZnNldEF0KGYucmFuZ2UuZW5kKTtpZihtPD11KWw9bC5zdWJzdHJpbmcoMCxkKStmLm5ld1RleHQrbC5zdWJzdHJpbmcobSxsLmxlbmd0aCk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIk92ZXJsYXBwaW5nIGVkaXQiKTt1PWR9cmV0dXJuIGx9ZS5hcHBseUVkaXRzPXI7ZnVuY3Rpb24gaShzLGEpe2lmKHMubGVuZ3RoPD0xKXJldHVybiBzO2NvbnN0IGw9cy5sZW5ndGgvMnwwLG89cy5zbGljZSgwLGwpLHU9cy5zbGljZShsKTtpKG8sYSksaSh1LGEpO2xldCBoPTAsZj0wLGQ9MDtmb3IoO2g8by5sZW5ndGgmJmY8dS5sZW5ndGg7KWEob1toXSx1W2ZdKTw9MD9zW2QrK109b1toKytdOnNbZCsrXT11W2YrK107Zm9yKDtoPG8ubGVuZ3RoOylzW2QrK109b1toKytdO2Zvcig7Zjx1Lmxlbmd0aDspc1tkKytdPXVbZisrXTtyZXR1cm4gc319KSh5b3x8KHlvPXt9KSk7dmFyIHFjPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuLHIpe3RoaXMuX3VyaT1lLHRoaXMuX2xhbmd1YWdlSWQ9dCx0aGlzLl92ZXJzaW9uPW4sdGhpcy5fY29udGVudD1yLHRoaXMuX2xpbmVPZmZzZXRzPXZvaWQgMH1nZXQgdXJpKCl7cmV0dXJuIHRoaXMuX3VyaX1nZXQgbGFuZ3VhZ2VJZCgpe3JldHVybiB0aGlzLl9sYW5ndWFnZUlkfWdldCB2ZXJzaW9uKCl7cmV0dXJuIHRoaXMuX3ZlcnNpb259Z2V0VGV4dChlKXtpZihlKXtsZXQgdD10aGlzLm9mZnNldEF0KGUuc3RhcnQpLG49dGhpcy5vZmZzZXRBdChlLmVuZCk7cmV0dXJuIHRoaXMuX2NvbnRlbnQuc3Vic3RyaW5nKHQsbil9cmV0dXJuIHRoaXMuX2NvbnRlbnR9dXBkYXRlKGUsdCl7dGhpcy5fY29udGVudD1lLnRleHQsdGhpcy5fdmVyc2lvbj10LHRoaXMuX2xpbmVPZmZzZXRzPXZvaWQgMH1nZXRMaW5lT2Zmc2V0cygpe2lmKHRoaXMuX2xpbmVPZmZzZXRzPT09dm9pZCAwKXtsZXQgZT1bXSx0PXRoaXMuX2NvbnRlbnQsbj0hMDtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKyl7biYmKGUucHVzaChyKSxuPSExKTtsZXQgaT10LmNoYXJBdChyKTtuPWk9PT0iXHIifHxpPT09YApgLGk9PT0iXHIiJiZyKzE8dC5sZW5ndGgmJnQuY2hhckF0KHIrMSk9PT1gCmAmJnIrK31uJiZ0Lmxlbmd0aD4wJiZlLnB1c2godC5sZW5ndGgpLHRoaXMuX2xpbmVPZmZzZXRzPWV9cmV0dXJuIHRoaXMuX2xpbmVPZmZzZXRzfXBvc2l0aW9uQXQoZSl7ZT1NYXRoLm1heChNYXRoLm1pbihlLHRoaXMuX2NvbnRlbnQubGVuZ3RoKSwwKTtsZXQgdD10aGlzLmdldExpbmVPZmZzZXRzKCksbj0wLHI9dC5sZW5ndGg7aWYocj09PTApcmV0dXJuIFouY3JlYXRlKDAsZSk7Zm9yKDtuPHI7KXtsZXQgcz1NYXRoLmZsb29yKChuK3IpLzIpO3Rbc10+ZT9yPXM6bj1zKzF9bGV0IGk9bi0xO3JldHVybiBaLmNyZWF0ZShpLGUtdFtpXSl9b2Zmc2V0QXQoZSl7bGV0IHQ9dGhpcy5nZXRMaW5lT2Zmc2V0cygpO2lmKGUubGluZT49dC5sZW5ndGgpcmV0dXJuIHRoaXMuX2NvbnRlbnQubGVuZ3RoO2lmKGUubGluZTwwKXJldHVybiAwO2xldCBuPXRbZS5saW5lXSxyPWUubGluZSsxPHQubGVuZ3RoP3RbZS5saW5lKzFdOnRoaXMuX2NvbnRlbnQubGVuZ3RoO3JldHVybiBNYXRoLm1heChNYXRoLm1pbihuK2UuY2hhcmFjdGVyLHIpLG4pfWdldCBsaW5lQ291bnQoKXtyZXR1cm4gdGhpcy5nZXRMaW5lT2Zmc2V0cygpLmxlbmd0aH19LFM7KGZ1bmN0aW9uKGUpe2NvbnN0IHQ9T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZztmdW5jdGlvbiBuKG0pe3JldHVybiB0eXBlb2YgbTwidSJ9ZS5kZWZpbmVkPW47ZnVuY3Rpb24gcihtKXtyZXR1cm4gdHlwZW9mIG0+InUifWUudW5kZWZpbmVkPXI7ZnVuY3Rpb24gaShtKXtyZXR1cm4gbT09PSEwfHxtPT09ITF9ZS5ib29sZWFuPWk7ZnVuY3Rpb24gcyhtKXtyZXR1cm4gdC5jYWxsKG0pPT09IltvYmplY3QgU3RyaW5nXSJ9ZS5zdHJpbmc9cztmdW5jdGlvbiBhKG0pe3JldHVybiB0LmNhbGwobSk9PT0iW29iamVjdCBOdW1iZXJdIn1lLm51bWJlcj1hO2Z1bmN0aW9uIGwobSxnLHApe3JldHVybiB0LmNhbGwobSk9PT0iW29iamVjdCBOdW1iZXJdIiYmZzw9bSYmbTw9cH1lLm51bWJlclJhbmdlPWw7ZnVuY3Rpb24gbyhtKXtyZXR1cm4gdC5jYWxsKG0pPT09IltvYmplY3QgTnVtYmVyXSImJi0yMTQ3NDgzNjQ4PD1tJiZtPD0yMTQ3NDgzNjQ3fWUuaW50ZWdlcj1vO2Z1bmN0aW9uIHUobSl7cmV0dXJuIHQuY2FsbChtKT09PSJbb2JqZWN0IE51bWJlcl0iJiYwPD1tJiZtPD0yMTQ3NDgzNjQ3fWUudWludGVnZXI9dTtmdW5jdGlvbiBoKG0pe3JldHVybiB0LmNhbGwobSk9PT0iW29iamVjdCBGdW5jdGlvbl0ifWUuZnVuYz1oO2Z1bmN0aW9uIGYobSl7cmV0dXJuIG0hPT1udWxsJiZ0eXBlb2YgbT09Im9iamVjdCJ9ZS5vYmplY3RMaXRlcmFsPWY7ZnVuY3Rpb24gZChtLGcpe3JldHVybiBBcnJheS5pc0FycmF5KG0pJiZtLmV2ZXJ5KGcpfWUudHlwZWRBcnJheT1kfSkoU3x8KFM9e30pKTt2YXIgd289Y2xhc3MgaWl7Y29uc3RydWN0b3IodCxuLHIsaSl7dGhpcy5fdXJpPXQsdGhpcy5fbGFuZ3VhZ2VJZD1uLHRoaXMuX3ZlcnNpb249cix0aGlzLl9jb250ZW50PWksdGhpcy5fbGluZU9mZnNldHM9dm9pZCAwfWdldCB1cmkoKXtyZXR1cm4gdGhpcy5fdXJpfWdldCBsYW5ndWFnZUlkKCl7cmV0dXJuIHRoaXMuX2xhbmd1YWdlSWR9Z2V0IHZlcnNpb24oKXtyZXR1cm4gdGhpcy5fdmVyc2lvbn1nZXRUZXh0KHQpe2lmKHQpe2NvbnN0IG49dGhpcy5vZmZzZXRBdCh0LnN0YXJ0KSxyPXRoaXMub2Zmc2V0QXQodC5lbmQpO3JldHVybiB0aGlzLl9jb250ZW50LnN1YnN0cmluZyhuLHIpfXJldHVybiB0aGlzLl9jb250ZW50fXVwZGF0ZSh0LG4pe2ZvcihsZXQgciBvZiB0KWlmKGlpLmlzSW5jcmVtZW50YWwocikpe2NvbnN0IGk9TG8oci5yYW5nZSkscz10aGlzLm9mZnNldEF0KGkuc3RhcnQpLGE9dGhpcy5vZmZzZXRBdChpLmVuZCk7dGhpcy5fY29udGVudD10aGlzLl9jb250ZW50LnN1YnN0cmluZygwLHMpK3IudGV4dCt0aGlzLl9jb250ZW50LnN1YnN0cmluZyhhLHRoaXMuX2NvbnRlbnQubGVuZ3RoKTtjb25zdCBsPU1hdGgubWF4KGkuc3RhcnQubGluZSwwKSxvPU1hdGgubWF4KGkuZW5kLmxpbmUsMCk7bGV0IHU9dGhpcy5fbGluZU9mZnNldHM7Y29uc3QgaD1fbyhyLnRleHQsITEscyk7aWYoby1sPT09aC5sZW5ndGgpZm9yKGxldCBkPTAsbT1oLmxlbmd0aDtkPG07ZCsrKXVbZCtsKzFdPWhbZF07ZWxzZSBoLmxlbmd0aDwxZTQ/dS5zcGxpY2UobCsxLG8tbCwuLi5oKTp0aGlzLl9saW5lT2Zmc2V0cz11PXUuc2xpY2UoMCxsKzEpLmNvbmNhdChoLHUuc2xpY2UobysxKSk7Y29uc3QgZj1yLnRleHQubGVuZ3RoLShhLXMpO2lmKGYhPT0wKWZvcihsZXQgZD1sKzEraC5sZW5ndGgsbT11Lmxlbmd0aDtkPG07ZCsrKXVbZF09dVtkXStmfWVsc2UgaWYoaWkuaXNGdWxsKHIpKXRoaXMuX2NvbnRlbnQ9ci50ZXh0LHRoaXMuX2xpbmVPZmZzZXRzPXZvaWQgMDtlbHNlIHRocm93IG5ldyBFcnJvcigiVW5rbm93biBjaGFuZ2UgZXZlbnQgcmVjZWl2ZWQiKTt0aGlzLl92ZXJzaW9uPW59Z2V0TGluZU9mZnNldHMoKXtyZXR1cm4gdGhpcy5fbGluZU9mZnNldHM9PT12b2lkIDAmJih0aGlzLl9saW5lT2Zmc2V0cz1fbyh0aGlzLl9jb250ZW50LCEwKSksdGhpcy5fbGluZU9mZnNldHN9cG9zaXRpb25BdCh0KXt0PU1hdGgubWF4KE1hdGgubWluKHQsdGhpcy5fY29udGVudC5sZW5ndGgpLDApO2xldCBuPXRoaXMuZ2V0TGluZU9mZnNldHMoKSxyPTAsaT1uLmxlbmd0aDtpZihpPT09MClyZXR1cm57bGluZTowLGNoYXJhY3Rlcjp0fTtmb3IoO3I8aTspe2xldCBhPU1hdGguZmxvb3IoKHIraSkvMik7blthXT50P2k9YTpyPWErMX1sZXQgcz1yLTE7cmV0dXJue2xpbmU6cyxjaGFyYWN0ZXI6dC1uW3NdfX1vZmZzZXRBdCh0KXtsZXQgbj10aGlzLmdldExpbmVPZmZzZXRzKCk7aWYodC5saW5lPj1uLmxlbmd0aClyZXR1cm4gdGhpcy5fY29udGVudC5sZW5ndGg7aWYodC5saW5lPDApcmV0dXJuIDA7bGV0IHI9blt0LmxpbmVdLGk9dC5saW5lKzE8bi5sZW5ndGg/blt0LmxpbmUrMV06dGhpcy5fY29udGVudC5sZW5ndGg7cmV0dXJuIE1hdGgubWF4KE1hdGgubWluKHIrdC5jaGFyYWN0ZXIsaSkscil9Z2V0IGxpbmVDb3VudCgpe3JldHVybiB0aGlzLmdldExpbmVPZmZzZXRzKCkubGVuZ3RofXN0YXRpYyBpc0luY3JlbWVudGFsKHQpe2xldCBuPXQ7cmV0dXJuIG4hPW51bGwmJnR5cGVvZiBuLnRleHQ9PSJzdHJpbmciJiZuLnJhbmdlIT09dm9pZCAwJiYobi5yYW5nZUxlbmd0aD09PXZvaWQgMHx8dHlwZW9mIG4ucmFuZ2VMZW5ndGg9PSJudW1iZXIiKX1zdGF0aWMgaXNGdWxsKHQpe2xldCBuPXQ7cmV0dXJuIG4hPW51bGwmJnR5cGVvZiBuLnRleHQ9PSJzdHJpbmciJiZuLnJhbmdlPT09dm9pZCAwJiZuLnJhbmdlTGVuZ3RoPT09dm9pZCAwfX0sTWU7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoaSxzLGEsbCl7cmV0dXJuIG5ldyB3byhpLHMsYSxsKX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4oaSxzLGEpe2lmKGkgaW5zdGFuY2VvZiB3bylyZXR1cm4gaS51cGRhdGUocyxhKSxpO3Rocm93IG5ldyBFcnJvcigiVGV4dERvY3VtZW50LnVwZGF0ZTogZG9jdW1lbnQgbXVzdCBiZSBjcmVhdGVkIGJ5IFRleHREb2N1bWVudC5jcmVhdGUiKX1lLnVwZGF0ZT1uO2Z1bmN0aW9uIHIoaSxzKXtsZXQgYT1pLmdldFRleHQoKSxsPUdyKHMubWFwKGpjKSwoaCxmKT0+e2xldCBkPWgucmFuZ2Uuc3RhcnQubGluZS1mLnJhbmdlLnN0YXJ0LmxpbmU7cmV0dXJuIGQ9PT0wP2gucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyLWYucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyOmR9KSxvPTA7Y29uc3QgdT1bXTtmb3IoY29uc3QgaCBvZiBsKXtsZXQgZj1pLm9mZnNldEF0KGgucmFuZ2Uuc3RhcnQpO2lmKGY8byl0aHJvdyBuZXcgRXJyb3IoIk92ZXJsYXBwaW5nIGVkaXQiKTtmPm8mJnUucHVzaChhLnN1YnN0cmluZyhvLGYpKSxoLm5ld1RleHQubGVuZ3RoJiZ1LnB1c2goaC5uZXdUZXh0KSxvPWkub2Zmc2V0QXQoaC5yYW5nZS5lbmQpfXJldHVybiB1LnB1c2goYS5zdWJzdHIobykpLHUuam9pbigiIil9ZS5hcHBseUVkaXRzPXJ9KShNZXx8KE1lPXt9KSk7ZnVuY3Rpb24gR3IoZSx0KXtpZihlLmxlbmd0aDw9MSlyZXR1cm4gZTtjb25zdCBuPWUubGVuZ3RoLzJ8MCxyPWUuc2xpY2UoMCxuKSxpPWUuc2xpY2Uobik7R3Iocix0KSxHcihpLHQpO2xldCBzPTAsYT0wLGw9MDtmb3IoO3M8ci5sZW5ndGgmJmE8aS5sZW5ndGg7KXQocltzXSxpW2FdKTw9MD9lW2wrK109cltzKytdOmVbbCsrXT1pW2ErK107Zm9yKDtzPHIubGVuZ3RoOyllW2wrK109cltzKytdO2Zvcig7YTxpLmxlbmd0aDspZVtsKytdPWlbYSsrXTtyZXR1cm4gZX1mdW5jdGlvbiBfbyhlLHQsbj0wKXtjb25zdCByPXQ/W25dOltdO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7aSsrKXtsZXQgcz1lLmNoYXJDb2RlQXQoaSk7KHM9PT0xM3x8cz09PTEwKSYmKHM9PT0xMyYmaSsxPGUubGVuZ3RoJiZlLmNoYXJDb2RlQXQoaSsxKT09PTEwJiZpKyssci5wdXNoKG4raSsxKSl9cmV0dXJuIHJ9ZnVuY3Rpb24gTG8oZSl7Y29uc3QgdD1lLnN0YXJ0LG49ZS5lbmQ7cmV0dXJuIHQubGluZT5uLmxpbmV8fHQubGluZT09PW4ubGluZSYmdC5jaGFyYWN0ZXI+bi5jaGFyYWN0ZXI/e3N0YXJ0Om4sZW5kOnR9OmV9ZnVuY3Rpb24gamMoZSl7Y29uc3QgdD1MbyhlLnJhbmdlKTtyZXR1cm4gdCE9PWUucmFuZ2U/e25ld1RleHQ6ZS5uZXdUZXh0LHJhbmdlOnR9OmV9dmFyIEg7KGZ1bmN0aW9uKGUpe2VbZS5VbmRlZmluZWQ9MF09IlVuZGVmaW5lZCIsZVtlLkVudW1WYWx1ZU1pc21hdGNoPTFdPSJFbnVtVmFsdWVNaXNtYXRjaCIsZVtlLkRlcHJlY2F0ZWQ9Ml09IkRlcHJlY2F0ZWQiLGVbZS5VbmV4cGVjdGVkRW5kT2ZDb21tZW50PTI1N109IlVuZXhwZWN0ZWRFbmRPZkNvbW1lbnQiLGVbZS5VbmV4cGVjdGVkRW5kT2ZTdHJpbmc9MjU4XT0iVW5leHBlY3RlZEVuZE9mU3RyaW5nIixlW2UuVW5leHBlY3RlZEVuZE9mTnVtYmVyPTI1OV09IlVuZXhwZWN0ZWRFbmRPZk51bWJlciIsZVtlLkludmFsaWRVbmljb2RlPTI2MF09IkludmFsaWRVbmljb2RlIixlW2UuSW52YWxpZEVzY2FwZUNoYXJhY3Rlcj0yNjFdPSJJbnZhbGlkRXNjYXBlQ2hhcmFjdGVyIixlW2UuSW52YWxpZENoYXJhY3Rlcj0yNjJdPSJJbnZhbGlkQ2hhcmFjdGVyIixlW2UuUHJvcGVydHlFeHBlY3RlZD01MTNdPSJQcm9wZXJ0eUV4cGVjdGVkIixlW2UuQ29tbWFFeHBlY3RlZD01MTRdPSJDb21tYUV4cGVjdGVkIixlW2UuQ29sb25FeHBlY3RlZD01MTVdPSJDb2xvbkV4cGVjdGVkIixlW2UuVmFsdWVFeHBlY3RlZD01MTZdPSJWYWx1ZUV4cGVjdGVkIixlW2UuQ29tbWFPckNsb3NlQmFja2V0RXhwZWN0ZWQ9NTE3XT0iQ29tbWFPckNsb3NlQmFja2V0RXhwZWN0ZWQiLGVbZS5Db21tYU9yQ2xvc2VCcmFjZUV4cGVjdGVkPTUxOF09IkNvbW1hT3JDbG9zZUJyYWNlRXhwZWN0ZWQiLGVbZS5UcmFpbGluZ0NvbW1hPTUxOV09IlRyYWlsaW5nQ29tbWEiLGVbZS5EdXBsaWNhdGVLZXk9NTIwXT0iRHVwbGljYXRlS2V5IixlW2UuQ29tbWVudE5vdFBlcm1pdHRlZD01MjFdPSJDb21tZW50Tm90UGVybWl0dGVkIixlW2UuUHJvcGVydHlLZXlzTXVzdEJlRG91YmxlcXVvdGVkPTUyOF09IlByb3BlcnR5S2V5c011c3RCZURvdWJsZXF1b3RlZCIsZVtlLlNjaGVtYVJlc29sdmVFcnJvcj03NjhdPSJTY2hlbWFSZXNvbHZlRXJyb3IiLGVbZS5TY2hlbWFVbnN1cHBvcnRlZEZlYXR1cmU9NzY5XT0iU2NoZW1hVW5zdXBwb3J0ZWRGZWF0dXJlIn0pKEh8fChIPXt9KSk7dmFyIENlOyhmdW5jdGlvbihlKXtlW2UudjM9M109InYzIixlW2UudjQ9NF09InY0IixlW2UudjY9Nl09InY2IixlW2Uudjc9N109InY3IixlW2UudjIwMTlfMDk9MTldPSJ2MjAxOV8wOSIsZVtlLnYyMDIwXzEyPTIwXT0idjIwMjBfMTIifSkoQ2V8fChDZT17fSkpO3ZhciBKcjsoZnVuY3Rpb24oZSl7ZS5MQVRFU1Q9e3RleHREb2N1bWVudDp7Y29tcGxldGlvbjp7Y29tcGxldGlvbkl0ZW06e2RvY3VtZW50YXRpb25Gb3JtYXQ6W290Lk1hcmtkb3duLG90LlBsYWluVGV4dF0sY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6ITAsbGFiZWxEZXRhaWxzU3VwcG9ydDohMH19fX19KShKcnx8KEpyPXt9KSk7ZnVuY3Rpb24gRSguLi5lKXtjb25zdCB0PWVbMF07bGV0IG4scixpO2lmKHR5cGVvZiB0PT0ic3RyaW5nIiluPXQscj10LGUuc3BsaWNlKDAsMSksaT0hZXx8dHlwZW9mIGVbMF0hPSJvYmplY3QiP2U6ZVswXTtlbHNlIGlmKHQgaW5zdGFuY2VvZiBBcnJheSl7Y29uc3Qgcz1lLnNsaWNlKDEpO2lmKHQubGVuZ3RoIT09cy5sZW5ndGgrMSl0aHJvdyBuZXcgRXJyb3IoImV4cGVjdGVkIGEgc3RyaW5nIGFzIHRoZSBmaXJzdCBhcmd1bWVudCB0byBsMTBuLnQiKTtsZXQgYT10WzBdO2ZvcihsZXQgbD0xO2w8dC5sZW5ndGg7bCsrKWErPWB7JHtsLTF9fWArdFtsXTtyZXR1cm4gRShhLC4uLnMpfWVsc2Ugcj10Lm1lc3NhZ2Usbj1yLHQuY29tbWVudCYmdC5jb21tZW50Lmxlbmd0aD4wJiYobis9YC8ke0FycmF5LmlzQXJyYXkodC5jb21tZW50KT90LmNvbW1lbnQuam9pbigiIik6dC5jb21tZW50fWApLGk9dC5hcmdzPz97fTtyZXR1cm4gSGMocixpKX12YXIgV2M9L3soW159XSspfS9nO2Z1bmN0aW9uIEhjKGUsdCl7cmV0dXJuIE9iamVjdC5rZXlzKHQpLmxlbmd0aD09PTA/ZTplLnJlcGxhY2UoV2MsKG4scik9PnRbcl0/P24pfXZhciB6Yz17ImNvbG9yLWhleCI6e2Vycm9yTWVzc2FnZTpFKCJJbnZhbGlkIGNvbG9yIGZvcm1hdC4gVXNlICNSR0IsICNSR0JBLCAjUlJHR0JCIG9yICNSUkdHQkJBQS4iKSxwYXR0ZXJuOi9eIyhbMC05QS1GYS1mXXszLDR9fChbMC05QS1GYS1mXXsyfSl7Myw0fSkkL30sImRhdGUtdGltZSI6e2Vycm9yTWVzc2FnZTpFKCJTdHJpbmcgaXMgbm90IGEgUkZDMzMzOSBkYXRlLXRpbWUuIikscGF0dGVybjovXihcZHs0fSktKDBbMS05XXwxWzAtMl0pLSgwWzEtOV18WzEyXVswLTldfDNbMDFdKVQoWzAxXVswLTldfDJbMC0zXSk6KFswLTVdWzAtOV0pOihbMC01XVswLTldfDYwKShcLlswLTldKyk/KFp8KFwrfC0pKFswMV1bMC05XXwyWzAtM10pOihbMC01XVswLTldKSkkL2l9LGRhdGU6e2Vycm9yTWVzc2FnZTpFKCJTdHJpbmcgaXMgbm90IGEgUkZDMzMzOSBkYXRlLiIpLHBhdHRlcm46L14oXGR7NH0pLSgwWzEtOV18MVswLTJdKS0oMFsxLTldfFsxMl1bMC05XXwzWzAxXSkkL2l9LHRpbWU6e2Vycm9yTWVzc2FnZTpFKCJTdHJpbmcgaXMgbm90IGEgUkZDMzMzOSB0aW1lLiIpLHBhdHRlcm46L14oWzAxXVswLTldfDJbMC0zXSk6KFswLTVdWzAtOV0pOihbMC01XVswLTldfDYwKShcLlswLTldKyk/KFp8KFwrfC0pKFswMV1bMC05XXwyWzAtM10pOihbMC01XVswLTldKSkkL2l9LGVtYWlsOntlcnJvck1lc3NhZ2U6RSgiU3RyaW5nIGlzIG5vdCBhbiBlLW1haWwgYWRkcmVzcy4iKSxwYXR0ZXJuOi9eKChbXjw+KClcW1xdXFwuLDs6XHNAIl0rKFwuW148PigpXFtcXVxcLiw7OlxzQCJdKykqKXwoIi4rIikpQCgoXFtbMC05XXsxLDN9XC5bMC05XXsxLDN9XC5bMC05XXsxLDN9XC5bMC05XXsxLDN9XSl8KChbYS16QS1aMC05LV0rXC4pK1thLXpBLVpdezIsfSkpJC99LGhvc3RuYW1lOntlcnJvck1lc3NhZ2U6RSgiU3RyaW5nIGlzIG5vdCBhIGhvc3RuYW1lLiIpLHBhdHRlcm46L14oPz0uezEsMjUzfVwuPyQpW2EtejAtOV0oPzpbYS16MC05LV17MCw2MX1bYS16MC05XSk/KD86XC5bYS16MC05XSg/OlstMC05YS16XXswLDYxfVswLTlhLXpdKT8pKlwuPyQvaX0saXB2NDp7ZXJyb3JNZXNzYWdlOkUoIlN0cmluZyBpcyBub3QgYW4gSVB2NCBhZGRyZXNzLiIpLHBhdHRlcm46L14oPzooPzoyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKVwuKXszfSg/OjI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpJC99LGlwdjY6e2Vycm9yTWVzc2FnZTpFKCJTdHJpbmcgaXMgbm90IGFuIElQdjYgYWRkcmVzcy4iKSxwYXR0ZXJuOi9eKCgoWzAtOWEtZl17MSw0fTopezd9KFswLTlhLWZdezEsNH18OikpfCgoWzAtOWEtZl17MSw0fTopezZ9KDpbMC05YS1mXXsxLDR9fCgoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KXw6KSl8KChbMC05YS1mXXsxLDR9Oil7NX0oKCg6WzAtOWEtZl17MSw0fSl7MSwyfSl8OigoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KXw6KSl8KChbMC05YS1mXXsxLDR9Oil7NH0oKCg6WzAtOWEtZl17MSw0fSl7MSwzfSl8KCg6WzAtOWEtZl17MSw0fSk/OigoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KSl8OikpfCgoWzAtOWEtZl17MSw0fTopezN9KCgoOlswLTlhLWZdezEsNH0pezEsNH0pfCgoOlswLTlhLWZdezEsNH0pezAsMn06KCgyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKShcLigyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKSl7M30pKXw6KSl8KChbMC05YS1mXXsxLDR9Oil7Mn0oKCg6WzAtOWEtZl17MSw0fSl7MSw1fSl8KCg6WzAtOWEtZl17MSw0fSl7MCwzfTooKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKFwuKDI1WzAtNV18MlswLTRdXGR8MVxkXGR8WzEtOV0/XGQpKXszfSkpfDopKXwoKFswLTlhLWZdezEsNH06KXsxfSgoKDpbMC05YS1mXXsxLDR9KXsxLDZ9KXwoKDpbMC05YS1mXXsxLDR9KXswLDR9OigoMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkoXC4oMjVbMC01XXwyWzAtNF1cZHwxXGRcZHxbMS05XT9cZCkpezN9KSl8OikpfCg6KCgoOlswLTlhLWZdezEsNH0pezEsN30pfCgoOlswLTlhLWZdezEsNH0pezAsNX06KCgyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKShcLigyNVswLTVdfDJbMC00XVxkfDFcZFxkfFsxLTldP1xkKSl7M30pKXw6KSkpJC9pfX0sbHQ9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG49MCl7dGhpcy5vZmZzZXQ9dCx0aGlzLmxlbmd0aD1uLHRoaXMucGFyZW50PWV9Z2V0IGNoaWxkcmVuKCl7cmV0dXJuW119dG9TdHJpbmcoKXtyZXR1cm4idHlwZTogIit0aGlzLnR5cGUrIiAoIit0aGlzLm9mZnNldCsiLyIrdGhpcy5sZW5ndGgrIikiKyh0aGlzLnBhcmVudD8iIHBhcmVudDogeyIrdGhpcy5wYXJlbnQudG9TdHJpbmcoKSsifSI6IiIpfX0sR2M9Y2xhc3MgZXh0ZW5kcyBsdHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksdGhpcy50eXBlPSJudWxsIix0aGlzLnZhbHVlPW51bGx9fSxObz1jbGFzcyBleHRlbmRzIGx0e2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihlLG4pLHRoaXMudHlwZT0iYm9vbGVhbiIsdGhpcy52YWx1ZT10fX0sSmM9Y2xhc3MgZXh0ZW5kcyBsdHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksdGhpcy50eXBlPSJhcnJheSIsdGhpcy5pdGVtcz1bXX1nZXQgY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5pdGVtc319LFhjPWNsYXNzIGV4dGVuZHMgbHR7Y29uc3RydWN0b3IoZSx0KXtzdXBlcihlLHQpLHRoaXMudHlwZT0ibnVtYmVyIix0aGlzLmlzSW50ZWdlcj0hMCx0aGlzLnZhbHVlPU51bWJlci5OYU59fSxYcj1jbGFzcyBleHRlbmRzIGx0e2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihlLHQsbiksdGhpcy50eXBlPSJzdHJpbmciLHRoaXMudmFsdWU9IiJ9fSxRYz1jbGFzcyBleHRlbmRzIGx0e2NvbnN0cnVjdG9yKGUsdCxuKXtzdXBlcihlLHQpLHRoaXMudHlwZT0icHJvcGVydHkiLHRoaXMuY29sb25PZmZzZXQ9LTEsdGhpcy5rZXlOb2RlPW59Z2V0IGNoaWxkcmVuKCl7cmV0dXJuIHRoaXMudmFsdWVOb2RlP1t0aGlzLmtleU5vZGUsdGhpcy52YWx1ZU5vZGVdOlt0aGlzLmtleU5vZGVdfX0sWWM9Y2xhc3MgZXh0ZW5kcyBsdHtjb25zdHJ1Y3RvcihlLHQpe3N1cGVyKGUsdCksdGhpcy50eXBlPSJvYmplY3QiLHRoaXMucHJvcGVydGllcz1bXX1nZXQgY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5wcm9wZXJ0aWVzfX07ZnVuY3Rpb24gd2UoZSl7cmV0dXJuIFZlKGUpP2U/e306e25vdDp7fX06ZX12YXIgU287KGZ1bmN0aW9uKGUpe2VbZS5LZXk9MF09IktleSIsZVtlLkVudW09MV09IkVudW0ifSkoU298fChTbz17fSkpO3ZhciBaYz17Imh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDMvc2NoZW1hIyI6Q2UudjMsImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyI6Q2UudjQsImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDYvc2NoZW1hIyI6Q2UudjYsImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hIyI6Q2UudjcsImh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMTktMDkvc2NoZW1hIjpDZS52MjAxOV8wOSwiaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQvMjAyMC0xMi9zY2hlbWEiOkNlLnYyMDIwXzEyfSxBbz1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLnNjaGVtYURyYWZ0PWV9fSxLYz1jbGFzcyB6b3tjb25zdHJ1Y3Rvcih0PS0xLG4pe3RoaXMuZm9jdXNPZmZzZXQ9dCx0aGlzLmV4Y2x1ZGU9bix0aGlzLnNjaGVtYXM9W119YWRkKHQpe3RoaXMuc2NoZW1hcy5wdXNoKHQpfW1lcmdlKHQpe0FycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHRoaXMuc2NoZW1hcyx0LnNjaGVtYXMpfWluY2x1ZGUodCl7cmV0dXJuKHRoaXMuZm9jdXNPZmZzZXQ9PT0tMXx8a28odCx0aGlzLmZvY3VzT2Zmc2V0KSkmJnQhPT10aGlzLmV4Y2x1ZGV9bmV3U3ViKCl7cmV0dXJuIG5ldyB6bygtMSx0aGlzLmV4Y2x1ZGUpfX0sS3Q9Y2xhc3N7Y29uc3RydWN0b3IoKXt9Z2V0IHNjaGVtYXMoKXtyZXR1cm5bXX1hZGQoZSl7fW1lcmdlKGUpe31pbmNsdWRlKGUpe3JldHVybiEwfW5ld1N1Yigpe3JldHVybiB0aGlzfX07S3QuaW5zdGFuY2U9bmV3IEt0O3ZhciBkZT1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMucHJvYmxlbXM9W10sdGhpcy5wcm9wZXJ0aWVzTWF0Y2hlcz0wLHRoaXMucHJvY2Vzc2VkUHJvcGVydGllcz1uZXcgU2V0LHRoaXMucHJvcGVydGllc1ZhbHVlTWF0Y2hlcz0wLHRoaXMucHJpbWFyeVZhbHVlTWF0Y2hlcz0wLHRoaXMuZW51bVZhbHVlTWF0Y2g9ITEsdGhpcy5lbnVtVmFsdWVzPXZvaWQgMH1oYXNQcm9ibGVtcygpe3JldHVybiEhdGhpcy5wcm9ibGVtcy5sZW5ndGh9bWVyZ2UoZSl7dGhpcy5wcm9ibGVtcz10aGlzLnByb2JsZW1zLmNvbmNhdChlLnByb2JsZW1zKSx0aGlzLnByb3BlcnRpZXNNYXRjaGVzKz1lLnByb3BlcnRpZXNNYXRjaGVzLHRoaXMucHJvcGVydGllc1ZhbHVlTWF0Y2hlcys9ZS5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzLHRoaXMubWVyZ2VQcm9jZXNzZWRQcm9wZXJ0aWVzKGUpfW1lcmdlRW51bVZhbHVlcyhlKXtpZighdGhpcy5lbnVtVmFsdWVNYXRjaCYmIWUuZW51bVZhbHVlTWF0Y2gmJnRoaXMuZW51bVZhbHVlcyYmZS5lbnVtVmFsdWVzKXt0aGlzLmVudW1WYWx1ZXM9dGhpcy5lbnVtVmFsdWVzLmNvbmNhdChlLmVudW1WYWx1ZXMpO2Zvcihjb25zdCB0IG9mIHRoaXMucHJvYmxlbXMpdC5jb2RlPT09SC5FbnVtVmFsdWVNaXNtYXRjaCYmKHQubWVzc2FnZT1FKCJWYWx1ZSBpcyBub3QgYWNjZXB0ZWQuIFZhbGlkIHZhbHVlczogezB9LiIsdGhpcy5lbnVtVmFsdWVzLm1hcChuPT5KU09OLnN0cmluZ2lmeShuKSkuam9pbigiLCAiKSkpfX1tZXJnZVByb3BlcnR5TWF0Y2goZSl7dGhpcy5wcm9ibGVtcz10aGlzLnByb2JsZW1zLmNvbmNhdChlLnByb2JsZW1zKSx0aGlzLnByb3BlcnRpZXNNYXRjaGVzKyssKGUuZW51bVZhbHVlTWF0Y2h8fCFlLmhhc1Byb2JsZW1zKCkmJmUucHJvcGVydGllc01hdGNoZXMpJiZ0aGlzLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMrKyxlLmVudW1WYWx1ZU1hdGNoJiZlLmVudW1WYWx1ZXMmJmUuZW51bVZhbHVlcy5sZW5ndGg9PT0xJiZ0aGlzLnByaW1hcnlWYWx1ZU1hdGNoZXMrK31tZXJnZVByb2Nlc3NlZFByb3BlcnRpZXMoZSl7ZS5wcm9jZXNzZWRQcm9wZXJ0aWVzLmZvckVhY2godD0+dGhpcy5wcm9jZXNzZWRQcm9wZXJ0aWVzLmFkZCh0KSl9Y29tcGFyZShlKXtjb25zdCB0PXRoaXMuaGFzUHJvYmxlbXMoKTtyZXR1cm4gdCE9PWUuaGFzUHJvYmxlbXMoKT90Py0xOjE6dGhpcy5lbnVtVmFsdWVNYXRjaCE9PWUuZW51bVZhbHVlTWF0Y2g/ZS5lbnVtVmFsdWVNYXRjaD8tMToxOnRoaXMucHJpbWFyeVZhbHVlTWF0Y2hlcyE9PWUucHJpbWFyeVZhbHVlTWF0Y2hlcz90aGlzLnByaW1hcnlWYWx1ZU1hdGNoZXMtZS5wcmltYXJ5VmFsdWVNYXRjaGVzOnRoaXMucHJvcGVydGllc1ZhbHVlTWF0Y2hlcyE9PWUucHJvcGVydGllc1ZhbHVlTWF0Y2hlcz90aGlzLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMtZS5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzOnRoaXMucHJvcGVydGllc01hdGNoZXMtZS5wcm9wZXJ0aWVzTWF0Y2hlc319O2Z1bmN0aW9uIGUxKGUsdD1bXSl7cmV0dXJuIG5ldyBSbyhlLHQsW10pfWZ1bmN0aW9uIHV0KGUpe3JldHVybiAkYyhlKX1mdW5jdGlvbiBRcihlKXtyZXR1cm4gT2MoZSl9ZnVuY3Rpb24ga28oZSx0LG49ITEpe3JldHVybiB0Pj1lLm9mZnNldCYmdDxlLm9mZnNldCtlLmxlbmd0aHx8biYmdD09PWUub2Zmc2V0K2UubGVuZ3RofXZhciBSbz1jbGFzc3tjb25zdHJ1Y3RvcihlLHQ9W10sbj1bXSl7dGhpcy5yb290PWUsdGhpcy5zeW50YXhFcnJvcnM9dCx0aGlzLmNvbW1lbnRzPW59Z2V0Tm9kZUZyb21PZmZzZXQoZSx0PSExKXtpZih0aGlzLnJvb3QpcmV0dXJuIERjKHRoaXMucm9vdCxlLHQpfXZpc2l0KGUpe2lmKHRoaXMucm9vdCl7Y29uc3QgdD1uPT57bGV0IHI9ZShuKTtjb25zdCBpPW4uY2hpbGRyZW47aWYoQXJyYXkuaXNBcnJheShpKSlmb3IobGV0IHM9MDtzPGkubGVuZ3RoJiZyO3MrKylyPXQoaVtzXSk7cmV0dXJuIHJ9O3QodGhpcy5yb290KX19dmFsaWRhdGUoZSx0LG49eGUuV2FybmluZyxyKXtpZih0aGlzLnJvb3QmJnQpe2NvbnN0IGk9bmV3IGRlO3JldHVybiBsZSh0aGlzLnJvb3QsdCxpLEt0Lmluc3RhbmNlLG5ldyBBbyhyPz9Fbyh0KSkpLGkucHJvYmxlbXMubWFwKHM9Pntjb25zdCBhPXEuY3JlYXRlKGUucG9zaXRpb25BdChzLmxvY2F0aW9uLm9mZnNldCksZS5wb3NpdGlvbkF0KHMubG9jYXRpb24ub2Zmc2V0K3MubG9jYXRpb24ubGVuZ3RoKSk7cmV0dXJuIHplLmNyZWF0ZShhLHMubWVzc2FnZSxzLnNldmVyaXR5Pz9uLHMuY29kZSl9KX19Z2V0TWF0Y2hpbmdTY2hlbWFzKGUsdD0tMSxuKXtpZih0aGlzLnJvb3QmJmUpe2NvbnN0IHI9bmV3IEtjKHQsbiksaT1FbyhlKSxzPW5ldyBBbyhpKTtyZXR1cm4gbGUodGhpcy5yb290LGUsbmV3IGRlLHIscyksci5zY2hlbWFzfXJldHVybltdfX07ZnVuY3Rpb24gRW8oZSx0PUNlLnYyMDIwXzEyKXtsZXQgbj1lLiRzY2hlbWE7cmV0dXJuIG4/WmNbbl0/P3Q6dH1mdW5jdGlvbiBsZShlLHQsbixyLGkpe2lmKCFlfHwhci5pbmNsdWRlKGUpKXJldHVybjtpZihlLnR5cGU9PT0icHJvcGVydHkiKXJldHVybiBsZShlLnZhbHVlTm9kZSx0LG4scixpKTtjb25zdCBzPWU7c3dpdGNoKGEoKSxzLnR5cGUpe2Nhc2Uib2JqZWN0IjpoKHMpO2JyZWFrO2Nhc2UiYXJyYXkiOnUocyk7YnJlYWs7Y2FzZSJzdHJpbmciOm8ocyk7YnJlYWs7Y2FzZSJudW1iZXIiOmwocyk7YnJlYWt9ci5hZGQoe25vZGU6cyxzY2hlbWE6dH0pO2Z1bmN0aW9uIGEoKXt2YXIgTDtmdW5jdGlvbiBmKHYpe3JldHVybiBzLnR5cGU9PT12fHx2PT09ImludGVnZXIiJiZzLnR5cGU9PT0ibnVtYmVyIiYmcy5pc0ludGVnZXJ9aWYoQXJyYXkuaXNBcnJheSh0LnR5cGUpP3QudHlwZS5zb21lKGYpfHxuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6cy5vZmZzZXQsbGVuZ3RoOnMubGVuZ3RofSxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxFKCJJbmNvcnJlY3QgdHlwZS4gRXhwZWN0ZWQgb25lIG9mIHswfS4iLHQudHlwZS5qb2luKCIsICIpKX0pOnQudHlwZSYmKGYodC50eXBlKXx8bi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OnMub2Zmc2V0LGxlbmd0aDpzLmxlbmd0aH0sbWVzc2FnZTp0LmVycm9yTWVzc2FnZXx8RSgnSW5jb3JyZWN0IHR5cGUuIEV4cGVjdGVkICJ7MH0iLicsdC50eXBlKX0pKSxBcnJheS5pc0FycmF5KHQuYWxsT2YpKWZvcihjb25zdCB2IG9mIHQuYWxsT2Ype2NvbnN0IHk9bmV3IGRlLGI9ci5uZXdTdWIoKTtsZShzLHdlKHYpLHksYixpKSxuLm1lcmdlKHkpLHIubWVyZ2UoYil9Y29uc3QgZD13ZSh0Lm5vdCk7aWYoZCl7Y29uc3Qgdj1uZXcgZGUseT1yLm5ld1N1YigpO2xlKHMsZCx2LHksaSksdi5oYXNQcm9ibGVtcygpfHxuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6cy5vZmZzZXQsbGVuZ3RoOnMubGVuZ3RofSxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxFKCJNYXRjaGVzIGEgc2NoZW1hIHRoYXQgaXMgbm90IGFsbG93ZWQuIil9KTtmb3IoY29uc3QgYiBvZiB5LnNjaGVtYXMpYi5pbnZlcnRlZD0hYi5pbnZlcnRlZCxyLmFkZChiKX1jb25zdCBtPSh2LHkpPT57Y29uc3QgYj1bXTtsZXQgXztmb3IoY29uc3QgQSBvZiB2KXtjb25zdCBDPXdlKEEpLEY9bmV3IGRlLE89ci5uZXdTdWIoKTtpZihsZShzLEMsRixPLGkpLEYuaGFzUHJvYmxlbXMoKXx8Yi5wdXNoKEMpLCFfKV89e3NjaGVtYTpDLHZhbGlkYXRpb25SZXN1bHQ6RixtYXRjaGluZ1NjaGVtYXM6T307ZWxzZSBpZigheSYmIUYuaGFzUHJvYmxlbXMoKSYmIV8udmFsaWRhdGlvblJlc3VsdC5oYXNQcm9ibGVtcygpKV8ubWF0Y2hpbmdTY2hlbWFzLm1lcmdlKE8pLF8udmFsaWRhdGlvblJlc3VsdC5wcm9wZXJ0aWVzTWF0Y2hlcys9Ri5wcm9wZXJ0aWVzTWF0Y2hlcyxfLnZhbGlkYXRpb25SZXN1bHQucHJvcGVydGllc1ZhbHVlTWF0Y2hlcys9Ri5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzLF8udmFsaWRhdGlvblJlc3VsdC5tZXJnZVByb2Nlc3NlZFByb3BlcnRpZXMoRik7ZWxzZXtjb25zdCBNPUYuY29tcGFyZShfLnZhbGlkYXRpb25SZXN1bHQpO00+MD9fPXtzY2hlbWE6Qyx2YWxpZGF0aW9uUmVzdWx0OkYsbWF0Y2hpbmdTY2hlbWFzOk99Ok09PT0wJiYoXy5tYXRjaGluZ1NjaGVtYXMubWVyZ2UoTyksXy52YWxpZGF0aW9uUmVzdWx0Lm1lcmdlRW51bVZhbHVlcyhGKSl9fXJldHVybiBiLmxlbmd0aD4xJiZ5JiZuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6cy5vZmZzZXQsbGVuZ3RoOjF9LG1lc3NhZ2U6RSgiTWF0Y2hlcyBtdWx0aXBsZSBzY2hlbWFzIHdoZW4gb25seSBvbmUgbXVzdCB2YWxpZGF0ZS4iKX0pLF8mJihuLm1lcmdlKF8udmFsaWRhdGlvblJlc3VsdCksci5tZXJnZShfLm1hdGNoaW5nU2NoZW1hcykpLGIubGVuZ3RofTtBcnJheS5pc0FycmF5KHQuYW55T2YpJiZtKHQuYW55T2YsITEpLEFycmF5LmlzQXJyYXkodC5vbmVPZikmJm0odC5vbmVPZiwhMCk7Y29uc3QgZz12PT57Y29uc3QgeT1uZXcgZGUsYj1yLm5ld1N1YigpO2xlKHMsd2UodikseSxiLGkpLG4ubWVyZ2UoeSksci5tZXJnZShiKX0scD0odix5LGIpPT57Y29uc3QgXz13ZSh2KSxBPW5ldyBkZSxDPXIubmV3U3ViKCk7bGUocyxfLEEsQyxpKSxyLm1lcmdlKEMpLG4ubWVyZ2VQcm9jZXNzZWRQcm9wZXJ0aWVzKEEpLEEuaGFzUHJvYmxlbXMoKT9iJiZnKGIpOnkmJmcoeSl9LHg9d2UodC5pZik7aWYoeCYmcCh4LHdlKHQudGhlbiksd2UodC5lbHNlKSksQXJyYXkuaXNBcnJheSh0LmVudW0pKXtjb25zdCB2PXV0KHMpO2xldCB5PSExO2Zvcihjb25zdCBiIG9mIHQuZW51bSlpZihSdCh2LGIpKXt5PSEwO2JyZWFrfW4uZW51bVZhbHVlcz10LmVudW0sbi5lbnVtVmFsdWVNYXRjaD15LHl8fG4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpzLm9mZnNldCxsZW5ndGg6cy5sZW5ndGh9LGNvZGU6SC5FbnVtVmFsdWVNaXNtYXRjaCxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxFKCJWYWx1ZSBpcyBub3QgYWNjZXB0ZWQuIFZhbGlkIHZhbHVlczogezB9LiIsdC5lbnVtLm1hcChiPT5KU09OLnN0cmluZ2lmeShiKSkuam9pbigiLCAiKSl9KX1pZihFZSh0LmNvbnN0KSl7Y29uc3Qgdj11dChzKTtSdCh2LHQuY29uc3QpP24uZW51bVZhbHVlTWF0Y2g9ITA6KG4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpzLm9mZnNldCxsZW5ndGg6cy5sZW5ndGh9LGNvZGU6SC5FbnVtVmFsdWVNaXNtYXRjaCxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxFKCJWYWx1ZSBtdXN0IGJlIHswfS4iLEpTT04uc3RyaW5naWZ5KHQuY29uc3QpKX0pLG4uZW51bVZhbHVlTWF0Y2g9ITEpLG4uZW51bVZhbHVlcz1bdC5jb25zdF19bGV0IHc9dC5kZXByZWNhdGlvbk1lc3NhZ2U7aWYod3x8dC5kZXByZWNhdGVkKXt3PXd8fEUoIlZhbHVlIGlzIGRlcHJlY2F0ZWQiKTtsZXQgdj0oKEw9cy5wYXJlbnQpPT1udWxsP3ZvaWQgMDpMLnR5cGUpPT09InByb3BlcnR5Ij9zLnBhcmVudDpzO24ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDp2Lm9mZnNldCxsZW5ndGg6di5sZW5ndGh9LHNldmVyaXR5OnhlLldhcm5pbmcsbWVzc2FnZTp3LGNvZGU6SC5EZXByZWNhdGVkfSl9fWZ1bmN0aW9uIGwoZil7Y29uc3QgZD1mLnZhbHVlO2Z1bmN0aW9uIG0oeSl7dmFyIF87Y29uc3QgYj0vXigtP1xkKykoPzpcLihcZCspKT8oPzplKFstK11cZCspKT8kLy5leGVjKHkudG9TdHJpbmcoKSk7cmV0dXJuIGImJnt2YWx1ZTpOdW1iZXIoYlsxXSsoYlsyXXx8IiIpKSxtdWx0aXBsaWVyOigoKF89YlsyXSk9PW51bGw/dm9pZCAwOl8ubGVuZ3RoKXx8MCktKHBhcnNlSW50KGJbM10pfHwwKX19aWYoaGUodC5tdWx0aXBsZU9mKSl7bGV0IHk9LTE7aWYoTnVtYmVyLmlzSW50ZWdlcih0Lm11bHRpcGxlT2YpKXk9ZCV0Lm11bHRpcGxlT2Y7ZWxzZXtsZXQgYj1tKHQubXVsdGlwbGVPZiksXz1tKGQpO2lmKGImJl8pe2NvbnN0IEE9MTAqKk1hdGguYWJzKF8ubXVsdGlwbGllci1iLm11bHRpcGxpZXIpO18ubXVsdGlwbGllcjxiLm11bHRpcGxpZXI/Xy52YWx1ZSo9QTpiLnZhbHVlKj1BLHk9Xy52YWx1ZSViLnZhbHVlfX15IT09MCYmbi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmYub2Zmc2V0LGxlbmd0aDpmLmxlbmd0aH0sbWVzc2FnZTpFKCJWYWx1ZSBpcyBub3QgZGl2aXNpYmxlIGJ5IHswfS4iLHQubXVsdGlwbGVPZil9KX1mdW5jdGlvbiBnKHksYil7aWYoaGUoYikpcmV0dXJuIGI7aWYoVmUoYikmJmIpcmV0dXJuIHl9ZnVuY3Rpb24gcCh5LGIpe2lmKCFWZShiKXx8IWIpcmV0dXJuIHl9Y29uc3QgeD1nKHQubWluaW11bSx0LmV4Y2x1c2l2ZU1pbmltdW0pO2hlKHgpJiZkPD14JiZuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOkUoIlZhbHVlIGlzIGJlbG93IHRoZSBleGNsdXNpdmUgbWluaW11bSBvZiB7MH0uIix4KX0pO2NvbnN0IHc9Zyh0Lm1heGltdW0sdC5leGNsdXNpdmVNYXhpbXVtKTtoZSh3KSYmZD49dyYmbi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmYub2Zmc2V0LGxlbmd0aDpmLmxlbmd0aH0sbWVzc2FnZTpFKCJWYWx1ZSBpcyBhYm92ZSB0aGUgZXhjbHVzaXZlIG1heGltdW0gb2YgezB9LiIsdyl9KTtjb25zdCBMPXAodC5taW5pbXVtLHQuZXhjbHVzaXZlTWluaW11bSk7aGUoTCkmJmQ8TCYmbi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmYub2Zmc2V0LGxlbmd0aDpmLmxlbmd0aH0sbWVzc2FnZTpFKCJWYWx1ZSBpcyBiZWxvdyB0aGUgbWluaW11bSBvZiB7MH0uIixMKX0pO2NvbnN0IHY9cCh0Lm1heGltdW0sdC5leGNsdXNpdmVNYXhpbXVtKTtoZSh2KSYmZD52JiZuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOkUoIlZhbHVlIGlzIGFib3ZlIHRoZSBtYXhpbXVtIG9mIHswfS4iLHYpfSl9ZnVuY3Rpb24gbyhmKXtpZihoZSh0Lm1pbkxlbmd0aCkmJlNhKGYudmFsdWUpPHQubWluTGVuZ3RoJiZuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOkUoIlN0cmluZyBpcyBzaG9ydGVyIHRoYW4gdGhlIG1pbmltdW0gbGVuZ3RoIG9mIHswfS4iLHQubWluTGVuZ3RoKX0pLGhlKHQubWF4TGVuZ3RoKSYmU2EoZi52YWx1ZSk+dC5tYXhMZW5ndGgmJm4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpmLm9mZnNldCxsZW5ndGg6Zi5sZW5ndGh9LG1lc3NhZ2U6RSgiU3RyaW5nIGlzIGxvbmdlciB0aGFuIHRoZSBtYXhpbXVtIGxlbmd0aCBvZiB7MH0uIix0Lm1heExlbmd0aCl9KSxOYSh0LnBhdHRlcm4pKXtjb25zdCBkPVJuKHQucGF0dGVybik7ZCE9bnVsbCYmZC50ZXN0KGYudmFsdWUpfHxuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOnQucGF0dGVybkVycm9yTWVzc2FnZXx8dC5lcnJvck1lc3NhZ2V8fEUoJ1N0cmluZyBkb2VzIG5vdCBtYXRjaCB0aGUgcGF0dGVybiBvZiAiezB9Ii4nLHQucGF0dGVybil9KX1pZih0LmZvcm1hdClzd2l0Y2godC5mb3JtYXQpe2Nhc2UidXJpIjpjYXNlInVyaS1yZWZlcmVuY2UiOntsZXQgbTtpZighZi52YWx1ZSltPUUoIlVSSSBleHBlY3RlZC4iKTtlbHNle2NvbnN0IGc9L14oKFteOi8/I10rPyk6KT8oXC9cLyhbXi8/I10qKSk/KFtePyNdKikoXD8oW14jXSopKT8oIyguKikpPy8uZXhlYyhmLnZhbHVlKTtnPyFnWzJdJiZ0LmZvcm1hdD09PSJ1cmkiJiYobT1FKCJVUkkgd2l0aCBhIHNjaGVtZSBpcyBleHBlY3RlZC4iKSk6bT1FKCJVUkkgaXMgZXhwZWN0ZWQuIil9bSYmbi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmYub2Zmc2V0LGxlbmd0aDpmLmxlbmd0aH0sbWVzc2FnZTp0LnBhdHRlcm5FcnJvck1lc3NhZ2V8fHQuZXJyb3JNZXNzYWdlfHxFKCJTdHJpbmcgaXMgbm90IGEgVVJJOiB7MH0iLG0pfSl9YnJlYWs7Y2FzZSJjb2xvci1oZXgiOmNhc2UiZGF0ZS10aW1lIjpjYXNlImRhdGUiOmNhc2UidGltZSI6Y2FzZSJlbWFpbCI6Y2FzZSJob3N0bmFtZSI6Y2FzZSJpcHY0IjpjYXNlImlwdjYiOmNvbnN0IGQ9emNbdC5mb3JtYXRdOyghZi52YWx1ZXx8IWQucGF0dGVybi5leGVjKGYudmFsdWUpKSYmbi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmYub2Zmc2V0LGxlbmd0aDpmLmxlbmd0aH0sbWVzc2FnZTp0LnBhdHRlcm5FcnJvck1lc3NhZ2V8fHQuZXJyb3JNZXNzYWdlfHxkLmVycm9yTWVzc2FnZX0pfX1mdW5jdGlvbiB1KGYpe2xldCBkLG07aS5zY2hlbWFEcmFmdD49Q2UudjIwMjBfMTI/KGQ9dC5wcmVmaXhJdGVtcyxtPUFycmF5LmlzQXJyYXkodC5pdGVtcyk/dm9pZCAwOnQuaXRlbXMpOihkPUFycmF5LmlzQXJyYXkodC5pdGVtcyk/dC5pdGVtczp2b2lkIDAsbT1BcnJheS5pc0FycmF5KHQuaXRlbXMpP3QuYWRkaXRpb25hbEl0ZW1zOnQuaXRlbXMpO2xldCBnPTA7aWYoZCE9PXZvaWQgMCl7Y29uc3Qgdz1NYXRoLm1pbihkLmxlbmd0aCxmLml0ZW1zLmxlbmd0aCk7Zm9yKDtnPHc7ZysrKXtjb25zdCBMPWRbZ10sdj13ZShMKSx5PW5ldyBkZSxiPWYuaXRlbXNbZ107YiYmKGxlKGIsdix5LHIsaSksbi5tZXJnZVByb3BlcnR5TWF0Y2goeSkpLG4ucHJvY2Vzc2VkUHJvcGVydGllcy5hZGQoU3RyaW5nKGcpKX19aWYobSE9PXZvaWQgMCYmZzxmLml0ZW1zLmxlbmd0aClpZih0eXBlb2YgbT09ImJvb2xlYW4iKWZvcihtPT09ITEmJm4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpmLm9mZnNldCxsZW5ndGg6Zi5sZW5ndGh9LG1lc3NhZ2U6RSgiQXJyYXkgaGFzIHRvbyBtYW55IGl0ZW1zIGFjY29yZGluZyB0byBzY2hlbWEuIEV4cGVjdGVkIHswfSBvciBmZXdlci4iLGcpfSk7ZzxmLml0ZW1zLmxlbmd0aDtnKyspbi5wcm9jZXNzZWRQcm9wZXJ0aWVzLmFkZChTdHJpbmcoZykpLG4ucHJvcGVydGllc1ZhbHVlTWF0Y2hlcysrO2Vsc2UgZm9yKDtnPGYuaXRlbXMubGVuZ3RoO2crKyl7Y29uc3Qgdz1uZXcgZGU7bGUoZi5pdGVtc1tnXSxtLHcscixpKSxuLm1lcmdlUHJvcGVydHlNYXRjaCh3KSxuLnByb2Nlc3NlZFByb3BlcnRpZXMuYWRkKFN0cmluZyhnKSl9Y29uc3QgcD13ZSh0LmNvbnRhaW5zKTtpZihwKXtsZXQgdz0wO2ZvcihsZXQgTD0wO0w8Zi5pdGVtcy5sZW5ndGg7TCsrKXtjb25zdCB2PWYuaXRlbXNbTF0seT1uZXcgZGU7bGUodixwLHksS3QuaW5zdGFuY2UsaSkseS5oYXNQcm9ibGVtcygpfHwodysrLGkuc2NoZW1hRHJhZnQ+PUNlLnYyMDIwXzEyJiZuLnByb2Nlc3NlZFByb3BlcnRpZXMuYWRkKFN0cmluZyhMKSkpfXc9PT0wJiYhaGUodC5taW5Db250YWlucykmJm4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpmLm9mZnNldCxsZW5ndGg6Zi5sZW5ndGh9LG1lc3NhZ2U6dC5lcnJvck1lc3NhZ2V8fEUoIkFycmF5IGRvZXMgbm90IGNvbnRhaW4gcmVxdWlyZWQgaXRlbS4iKX0pLGhlKHQubWluQ29udGFpbnMpJiZ3PHQubWluQ29udGFpbnMmJm4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpmLm9mZnNldCxsZW5ndGg6Zi5sZW5ndGh9LG1lc3NhZ2U6dC5lcnJvck1lc3NhZ2V8fEUoIkFycmF5IGhhcyB0b28gZmV3IGl0ZW1zIHRoYXQgbWF0Y2ggdGhlIGNvbnRhaW5zIGNvbnRyYWludC4gRXhwZWN0ZWQgezB9IG9yIG1vcmUuIix0Lm1pbkNvbnRhaW5zKX0pLGhlKHQubWF4Q29udGFpbnMpJiZ3PnQubWF4Q29udGFpbnMmJm4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpmLm9mZnNldCxsZW5ndGg6Zi5sZW5ndGh9LG1lc3NhZ2U6dC5lcnJvck1lc3NhZ2V8fEUoIkFycmF5IGhhcyB0b28gbWFueSBpdGVtcyB0aGF0IG1hdGNoIHRoZSBjb250YWlucyBjb250cmFpbnQuIEV4cGVjdGVkIHswfSBvciBsZXNzLiIsdC5tYXhDb250YWlucyl9KX1jb25zdCB4PXQudW5ldmFsdWF0ZWRJdGVtcztpZih4IT09dm9pZCAwKWZvcihsZXQgdz0wO3c8Zi5pdGVtcy5sZW5ndGg7dysrKXtpZighbi5wcm9jZXNzZWRQcm9wZXJ0aWVzLmhhcyhTdHJpbmcodykpKWlmKHg9PT0hMSluLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOkUoIkl0ZW0gZG9lcyBub3QgbWF0Y2ggYW55IHZhbGlkYXRpb24gcnVsZSBmcm9tIHRoZSBhcnJheS4iKX0pO2Vsc2V7Y29uc3QgTD1uZXcgZGU7bGUoZi5pdGVtc1t3XSx0LnVuZXZhbHVhdGVkSXRlbXMsTCxyLGkpLG4ubWVyZ2VQcm9wZXJ0eU1hdGNoKEwpfW4ucHJvY2Vzc2VkUHJvcGVydGllcy5hZGQoU3RyaW5nKHcpKSxuLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMrK31pZihoZSh0Lm1pbkl0ZW1zKSYmZi5pdGVtcy5sZW5ndGg8dC5taW5JdGVtcyYmbi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmYub2Zmc2V0LGxlbmd0aDpmLmxlbmd0aH0sbWVzc2FnZTpFKCJBcnJheSBoYXMgdG9vIGZldyBpdGVtcy4gRXhwZWN0ZWQgezB9IG9yIG1vcmUuIix0Lm1pbkl0ZW1zKX0pLGhlKHQubWF4SXRlbXMpJiZmLml0ZW1zLmxlbmd0aD50Lm1heEl0ZW1zJiZuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOkUoIkFycmF5IGhhcyB0b28gbWFueSBpdGVtcy4gRXhwZWN0ZWQgezB9IG9yIGZld2VyLiIsdC5tYXhJdGVtcyl9KSx0LnVuaXF1ZUl0ZW1zPT09ITApe2xldCB3PWZ1bmN0aW9uKCl7Zm9yKGxldCB2PTA7djxMLmxlbmd0aC0xO3YrKyl7Y29uc3QgeT1MW3ZdO2ZvcihsZXQgYj12KzE7YjxMLmxlbmd0aDtiKyspaWYoUnQoeSxMW2JdKSlyZXR1cm4hMH1yZXR1cm4hMX07Y29uc3QgTD11dChmKTt3KCkmJm4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpmLm9mZnNldCxsZW5ndGg6Zi5sZW5ndGh9LG1lc3NhZ2U6RSgiQXJyYXkgaGFzIGR1cGxpY2F0ZSBpdGVtcy4iKX0pfX1mdW5jdGlvbiBoKGYpe2NvbnN0IGQ9T2JqZWN0LmNyZWF0ZShudWxsKSxtPW5ldyBTZXQ7Zm9yKGNvbnN0IHYgb2YgZi5wcm9wZXJ0aWVzKXtjb25zdCB5PXYua2V5Tm9kZS52YWx1ZTtkW3ldPXYudmFsdWVOb2RlLG0uYWRkKHkpfWlmKEFycmF5LmlzQXJyYXkodC5yZXF1aXJlZCkpe2Zvcihjb25zdCB2IG9mIHQucmVxdWlyZWQpaWYoIWRbdl0pe2NvbnN0IHk9Zi5wYXJlbnQmJmYucGFyZW50LnR5cGU9PT0icHJvcGVydHkiJiZmLnBhcmVudC5rZXlOb2RlLGI9eT97b2Zmc2V0Onkub2Zmc2V0LGxlbmd0aDp5Lmxlbmd0aH06e29mZnNldDpmLm9mZnNldCxsZW5ndGg6MX07bi5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjpiLG1lc3NhZ2U6RSgnTWlzc2luZyBwcm9wZXJ0eSAiezB9Ii4nLHYpfSl9fWNvbnN0IGc9dj0+e20uZGVsZXRlKHYpLG4ucHJvY2Vzc2VkUHJvcGVydGllcy5hZGQodil9O2lmKHQucHJvcGVydGllcylmb3IoY29uc3QgdiBvZiBPYmplY3Qua2V5cyh0LnByb3BlcnRpZXMpKXtnKHYpO2NvbnN0IHk9dC5wcm9wZXJ0aWVzW3ZdLGI9ZFt2XTtpZihiKWlmKFZlKHkpKWlmKHkpbi5wcm9wZXJ0aWVzTWF0Y2hlcysrLG4ucHJvcGVydGllc1ZhbHVlTWF0Y2hlcysrO2Vsc2V7Y29uc3QgXz1iLnBhcmVudDtuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Xy5rZXlOb2RlLm9mZnNldCxsZW5ndGg6Xy5rZXlOb2RlLmxlbmd0aH0sbWVzc2FnZTp0LmVycm9yTWVzc2FnZXx8RSgiUHJvcGVydHkgezB9IGlzIG5vdCBhbGxvd2VkLiIsdil9KX1lbHNle2NvbnN0IF89bmV3IGRlO2xlKGIseSxfLHIsaSksbi5tZXJnZVByb3BlcnR5TWF0Y2goXyl9fWlmKHQucGF0dGVyblByb3BlcnRpZXMpZm9yKGNvbnN0IHYgb2YgT2JqZWN0LmtleXModC5wYXR0ZXJuUHJvcGVydGllcykpe2NvbnN0IHk9Um4odik7aWYoeSl7Y29uc3QgYj1bXTtmb3IoY29uc3QgXyBvZiBtKWlmKHkudGVzdChfKSl7Yi5wdXNoKF8pO2NvbnN0IEE9ZFtfXTtpZihBKXtjb25zdCBDPXQucGF0dGVyblByb3BlcnRpZXNbdl07aWYoVmUoQykpaWYoQyluLnByb3BlcnRpZXNNYXRjaGVzKyssbi5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzKys7ZWxzZXtjb25zdCBGPUEucGFyZW50O24ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpGLmtleU5vZGUub2Zmc2V0LGxlbmd0aDpGLmtleU5vZGUubGVuZ3RofSxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxFKCJQcm9wZXJ0eSB7MH0gaXMgbm90IGFsbG93ZWQuIixfKX0pfWVsc2V7Y29uc3QgRj1uZXcgZGU7bGUoQSxDLEYscixpKSxuLm1lcmdlUHJvcGVydHlNYXRjaChGKX19fWIuZm9yRWFjaChnKX19Y29uc3QgcD10LmFkZGl0aW9uYWxQcm9wZXJ0aWVzO2lmKHAhPT12b2lkIDApZm9yKGNvbnN0IHYgb2YgbSl7Zyh2KTtjb25zdCB5PWRbdl07aWYoeSl7aWYocD09PSExKXtjb25zdCBiPXkucGFyZW50O24ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpiLmtleU5vZGUub2Zmc2V0LGxlbmd0aDpiLmtleU5vZGUubGVuZ3RofSxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxFKCJQcm9wZXJ0eSB7MH0gaXMgbm90IGFsbG93ZWQuIix2KX0pfWVsc2UgaWYocCE9PSEwKXtjb25zdCBiPW5ldyBkZTtsZSh5LHAsYixyLGkpLG4ubWVyZ2VQcm9wZXJ0eU1hdGNoKGIpfX19Y29uc3QgeD10LnVuZXZhbHVhdGVkUHJvcGVydGllcztpZih4IT09dm9pZCAwKXtjb25zdCB2PVtdO2Zvcihjb25zdCB5IG9mIG0paWYoIW4ucHJvY2Vzc2VkUHJvcGVydGllcy5oYXMoeSkpe3YucHVzaCh5KTtjb25zdCBiPWRbeV07aWYoYil7aWYoeD09PSExKXtjb25zdCBfPWIucGFyZW50O24ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpfLmtleU5vZGUub2Zmc2V0LGxlbmd0aDpfLmtleU5vZGUubGVuZ3RofSxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxFKCJQcm9wZXJ0eSB7MH0gaXMgbm90IGFsbG93ZWQuIix5KX0pfWVsc2UgaWYoeCE9PSEwKXtjb25zdCBfPW5ldyBkZTtsZShiLHgsXyxyLGkpLG4ubWVyZ2VQcm9wZXJ0eU1hdGNoKF8pfX19di5mb3JFYWNoKGcpfWlmKGhlKHQubWF4UHJvcGVydGllcykmJmYucHJvcGVydGllcy5sZW5ndGg+dC5tYXhQcm9wZXJ0aWVzJiZuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOkUoIk9iamVjdCBoYXMgbW9yZSBwcm9wZXJ0aWVzIHRoYW4gbGltaXQgb2YgezB9LiIsdC5tYXhQcm9wZXJ0aWVzKX0pLGhlKHQubWluUHJvcGVydGllcykmJmYucHJvcGVydGllcy5sZW5ndGg8dC5taW5Qcm9wZXJ0aWVzJiZuLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6Zi5vZmZzZXQsbGVuZ3RoOmYubGVuZ3RofSxtZXNzYWdlOkUoIk9iamVjdCBoYXMgZmV3ZXIgcHJvcGVydGllcyB0aGFuIHRoZSByZXF1aXJlZCBudW1iZXIgb2YgezB9Iix0Lm1pblByb3BlcnRpZXMpfSksdC5kZXBlbmRlbnRSZXF1aXJlZClmb3IoY29uc3QgdiBpbiB0LmRlcGVuZGVudFJlcXVpcmVkKXtjb25zdCB5PWRbdl0sYj10LmRlcGVuZGVudFJlcXVpcmVkW3ZdO3kmJkFycmF5LmlzQXJyYXkoYikmJkwodixiKX1pZih0LmRlcGVuZGVudFNjaGVtYXMpZm9yKGNvbnN0IHYgaW4gdC5kZXBlbmRlbnRTY2hlbWFzKXtjb25zdCB5PWRbdl0sYj10LmRlcGVuZGVudFNjaGVtYXNbdl07eSYmZXQoYikmJkwodixiKX1pZih0LmRlcGVuZGVuY2llcylmb3IoY29uc3QgdiBpbiB0LmRlcGVuZGVuY2llcylkW3ZdJiZMKHYsdC5kZXBlbmRlbmNpZXNbdl0pO2NvbnN0IHc9d2UodC5wcm9wZXJ0eU5hbWVzKTtpZih3KWZvcihjb25zdCB2IG9mIGYucHJvcGVydGllcyl7Y29uc3QgeT12LmtleU5vZGU7eSYmbGUoeSx3LG4sS3QuaW5zdGFuY2UsaSl9ZnVuY3Rpb24gTCh2LHkpe2lmKEFycmF5LmlzQXJyYXkoeSkpZm9yKGNvbnN0IGIgb2YgeSlkW2JdP24ucHJvcGVydGllc1ZhbHVlTWF0Y2hlcysrOm4ucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpmLm9mZnNldCxsZW5ndGg6Zi5sZW5ndGh9LG1lc3NhZ2U6RSgiT2JqZWN0IGlzIG1pc3NpbmcgcHJvcGVydHkgezB9IHJlcXVpcmVkIGJ5IHByb3BlcnR5IHsxfS4iLGIsdil9KTtlbHNle2NvbnN0IGI9d2UoeSk7aWYoYil7Y29uc3QgXz1uZXcgZGU7bGUoZixiLF8scixpKSxuLm1lcmdlUHJvcGVydHlNYXRjaChfKX19fX19ZnVuY3Rpb24gdDEoZSx0KXtjb25zdCBuPVtdO2xldCByPS0xO2NvbnN0IGk9ZS5nZXRUZXh0KCkscz1hdChpLCExKSxhPXQmJnQuY29sbGVjdENvbW1lbnRzP1tdOnZvaWQgMDtmdW5jdGlvbiBsKCl7Zm9yKDs7KXtjb25zdCBfPXMuc2NhbigpO3N3aXRjaChoKCksXyl7Y2FzZSAxMjpjYXNlIDEzOkFycmF5LmlzQXJyYXkoYSkmJmEucHVzaChxLmNyZWF0ZShlLnBvc2l0aW9uQXQocy5nZXRUb2tlbk9mZnNldCgpKSxlLnBvc2l0aW9uQXQocy5nZXRUb2tlbk9mZnNldCgpK3MuZ2V0VG9rZW5MZW5ndGgoKSkpKTticmVhaztjYXNlIDE1OmNhc2UgMTQ6YnJlYWs7ZGVmYXVsdDpyZXR1cm4gX319fWZ1bmN0aW9uIG8oXyxBLEMsRixPPXhlLkVycm9yKXtpZihuLmxlbmd0aD09PTB8fEMhPT1yKXtjb25zdCBNPXEuY3JlYXRlKGUucG9zaXRpb25BdChDKSxlLnBvc2l0aW9uQXQoRikpO24ucHVzaCh6ZS5jcmVhdGUoTSxfLE8sQSxlLmxhbmd1YWdlSWQpKSxyPUN9fWZ1bmN0aW9uIHUoXyxBLEM9dm9pZCAwLEY9W10sTz1bXSl7bGV0IE09cy5nZXRUb2tlbk9mZnNldCgpLE49cy5nZXRUb2tlbk9mZnNldCgpK3MuZ2V0VG9rZW5MZW5ndGgoKTtpZihNPT09TiYmTT4wKXtmb3IoTS0tO00+MCYmL1xzLy50ZXN0KGkuY2hhckF0KE0pKTspTS0tO049TSsxfWlmKG8oXyxBLE0sTiksQyYmZihDLCExKSxGLmxlbmd0aCtPLmxlbmd0aD4wKXtsZXQgaz1zLmdldFRva2VuKCk7Zm9yKDtrIT09MTc7KXtpZihGLmluZGV4T2YoaykhPT0tMSl7bCgpO2JyZWFrfWVsc2UgaWYoTy5pbmRleE9mKGspIT09LTEpYnJlYWs7az1sKCl9fXJldHVybiBDfWZ1bmN0aW9uIGgoKXtzd2l0Y2gocy5nZXRUb2tlbkVycm9yKCkpe2Nhc2UgNDpyZXR1cm4gdShFKCJJbnZhbGlkIHVuaWNvZGUgc2VxdWVuY2UgaW4gc3RyaW5nLiIpLEguSW52YWxpZFVuaWNvZGUpLCEwO2Nhc2UgNTpyZXR1cm4gdShFKCJJbnZhbGlkIGVzY2FwZSBjaGFyYWN0ZXIgaW4gc3RyaW5nLiIpLEguSW52YWxpZEVzY2FwZUNoYXJhY3RlciksITA7Y2FzZSAzOnJldHVybiB1KEUoIlVuZXhwZWN0ZWQgZW5kIG9mIG51bWJlci4iKSxILlVuZXhwZWN0ZWRFbmRPZk51bWJlciksITA7Y2FzZSAxOnJldHVybiB1KEUoIlVuZXhwZWN0ZWQgZW5kIG9mIGNvbW1lbnQuIiksSC5VbmV4cGVjdGVkRW5kT2ZDb21tZW50KSwhMDtjYXNlIDI6cmV0dXJuIHUoRSgiVW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nLiIpLEguVW5leHBlY3RlZEVuZE9mU3RyaW5nKSwhMDtjYXNlIDY6cmV0dXJuIHUoRSgiSW52YWxpZCBjaGFyYWN0ZXJzIGluIHN0cmluZy4gQ29udHJvbCBjaGFyYWN0ZXJzIG11c3QgYmUgZXNjYXBlZC4iKSxILkludmFsaWRDaGFyYWN0ZXIpLCEwfXJldHVybiExfWZ1bmN0aW9uIGYoXyxBKXtyZXR1cm4gXy5sZW5ndGg9cy5nZXRUb2tlbk9mZnNldCgpK3MuZ2V0VG9rZW5MZW5ndGgoKS1fLm9mZnNldCxBJiZsKCksX31mdW5jdGlvbiBkKF8pe2lmKHMuZ2V0VG9rZW4oKSE9PTMpcmV0dXJuO2NvbnN0IEE9bmV3IEpjKF8scy5nZXRUb2tlbk9mZnNldCgpKTtsKCk7bGV0IEM9ITE7Zm9yKDtzLmdldFRva2VuKCkhPT00JiZzLmdldFRva2VuKCkhPT0xNzspe2lmKHMuZ2V0VG9rZW4oKT09PTUpe0N8fHUoRSgiVmFsdWUgZXhwZWN0ZWQiKSxILlZhbHVlRXhwZWN0ZWQpO2NvbnN0IE89cy5nZXRUb2tlbk9mZnNldCgpO2lmKGwoKSxzLmdldFRva2VuKCk9PT00KXtDJiZvKEUoIlRyYWlsaW5nIGNvbW1hIiksSC5UcmFpbGluZ0NvbW1hLE8sTysxKTtjb250aW51ZX19ZWxzZSBDJiZ1KEUoIkV4cGVjdGVkIGNvbW1hIiksSC5Db21tYUV4cGVjdGVkKTtjb25zdCBGPXYoQSk7Rj9BLml0ZW1zLnB1c2goRik6dShFKCJWYWx1ZSBleHBlY3RlZCIpLEguVmFsdWVFeHBlY3RlZCx2b2lkIDAsW10sWzQsNV0pLEM9ITB9cmV0dXJuIHMuZ2V0VG9rZW4oKSE9PTQ/dShFKCJFeHBlY3RlZCBjb21tYSBvciBjbG9zaW5nIGJyYWNrZXQiKSxILkNvbW1hT3JDbG9zZUJhY2tldEV4cGVjdGVkLEEpOmYoQSwhMCl9Y29uc3QgbT1uZXcgWHIodm9pZCAwLDAsMCk7ZnVuY3Rpb24gZyhfLEEpe2NvbnN0IEM9bmV3IFFjKF8scy5nZXRUb2tlbk9mZnNldCgpLG0pO2xldCBGPXgoQyk7aWYoIUYpaWYocy5nZXRUb2tlbigpPT09MTYpe3UoRSgiUHJvcGVydHkga2V5cyBtdXN0IGJlIGRvdWJsZXF1b3RlZCIpLEguUHJvcGVydHlLZXlzTXVzdEJlRG91YmxlcXVvdGVkKTtjb25zdCBNPW5ldyBYcihDLHMuZ2V0VG9rZW5PZmZzZXQoKSxzLmdldFRva2VuTGVuZ3RoKCkpO00udmFsdWU9cy5nZXRUb2tlblZhbHVlKCksRj1NLGwoKX1lbHNlIHJldHVybjtpZihDLmtleU5vZGU9RixGLnZhbHVlIT09Ii8vIil7Y29uc3QgTT1BW0YudmFsdWVdO00/KG8oRSgiRHVwbGljYXRlIG9iamVjdCBrZXkiKSxILkR1cGxpY2F0ZUtleSxDLmtleU5vZGUub2Zmc2V0LEMua2V5Tm9kZS5vZmZzZXQrQy5rZXlOb2RlLmxlbmd0aCx4ZS5XYXJuaW5nKSxldChNKSYmbyhFKCJEdXBsaWNhdGUgb2JqZWN0IGtleSIpLEguRHVwbGljYXRlS2V5LE0ua2V5Tm9kZS5vZmZzZXQsTS5rZXlOb2RlLm9mZnNldCtNLmtleU5vZGUubGVuZ3RoLHhlLldhcm5pbmcpLEFbRi52YWx1ZV09ITApOkFbRi52YWx1ZV09Q31pZihzLmdldFRva2VuKCk9PT02KUMuY29sb25PZmZzZXQ9cy5nZXRUb2tlbk9mZnNldCgpLGwoKTtlbHNlIGlmKHUoRSgiQ29sb24gZXhwZWN0ZWQiKSxILkNvbG9uRXhwZWN0ZWQpLHMuZ2V0VG9rZW4oKT09PTEwJiZlLnBvc2l0aW9uQXQoRi5vZmZzZXQrRi5sZW5ndGgpLmxpbmU8ZS5wb3NpdGlvbkF0KHMuZ2V0VG9rZW5PZmZzZXQoKSkubGluZSlyZXR1cm4gQy5sZW5ndGg9Ri5sZW5ndGgsQztjb25zdCBPPXYoQyk7cmV0dXJuIE8/KEMudmFsdWVOb2RlPU8sQy5sZW5ndGg9Ty5vZmZzZXQrTy5sZW5ndGgtQy5vZmZzZXQsQyk6dShFKCJWYWx1ZSBleHBlY3RlZCIpLEguVmFsdWVFeHBlY3RlZCxDLFtdLFsyLDVdKX1mdW5jdGlvbiBwKF8pe2lmKHMuZ2V0VG9rZW4oKSE9PTEpcmV0dXJuO2NvbnN0IEE9bmV3IFljKF8scy5nZXRUb2tlbk9mZnNldCgpKSxDPU9iamVjdC5jcmVhdGUobnVsbCk7bCgpO2xldCBGPSExO2Zvcig7cy5nZXRUb2tlbigpIT09MiYmcy5nZXRUb2tlbigpIT09MTc7KXtpZihzLmdldFRva2VuKCk9PT01KXtGfHx1KEUoIlByb3BlcnR5IGV4cGVjdGVkIiksSC5Qcm9wZXJ0eUV4cGVjdGVkKTtjb25zdCBNPXMuZ2V0VG9rZW5PZmZzZXQoKTtpZihsKCkscy5nZXRUb2tlbigpPT09Mil7RiYmbyhFKCJUcmFpbGluZyBjb21tYSIpLEguVHJhaWxpbmdDb21tYSxNLE0rMSk7Y29udGludWV9fWVsc2UgRiYmdShFKCJFeHBlY3RlZCBjb21tYSIpLEguQ29tbWFFeHBlY3RlZCk7Y29uc3QgTz1nKEEsQyk7Tz9BLnByb3BlcnRpZXMucHVzaChPKTp1KEUoIlByb3BlcnR5IGV4cGVjdGVkIiksSC5Qcm9wZXJ0eUV4cGVjdGVkLHZvaWQgMCxbXSxbMiw1XSksRj0hMH1yZXR1cm4gcy5nZXRUb2tlbigpIT09Mj91KEUoIkV4cGVjdGVkIGNvbW1hIG9yIGNsb3NpbmcgYnJhY2UiKSxILkNvbW1hT3JDbG9zZUJyYWNlRXhwZWN0ZWQsQSk6ZihBLCEwKX1mdW5jdGlvbiB4KF8pe2lmKHMuZ2V0VG9rZW4oKSE9PTEwKXJldHVybjtjb25zdCBBPW5ldyBYcihfLHMuZ2V0VG9rZW5PZmZzZXQoKSk7cmV0dXJuIEEudmFsdWU9cy5nZXRUb2tlblZhbHVlKCksZihBLCEwKX1mdW5jdGlvbiB3KF8pe2lmKHMuZ2V0VG9rZW4oKSE9PTExKXJldHVybjtjb25zdCBBPW5ldyBYYyhfLHMuZ2V0VG9rZW5PZmZzZXQoKSk7aWYocy5nZXRUb2tlbkVycm9yKCk9PT0wKXtjb25zdCBDPXMuZ2V0VG9rZW5WYWx1ZSgpO3RyeXtjb25zdCBGPUpTT04ucGFyc2UoQyk7aWYoIWhlKEYpKXJldHVybiB1KEUoIkludmFsaWQgbnVtYmVyIGZvcm1hdC4iKSxILlVuZGVmaW5lZCxBKTtBLnZhbHVlPUZ9Y2F0Y2h7cmV0dXJuIHUoRSgiSW52YWxpZCBudW1iZXIgZm9ybWF0LiIpLEguVW5kZWZpbmVkLEEpfUEuaXNJbnRlZ2VyPUMuaW5kZXhPZigiLiIpPT09LTF9cmV0dXJuIGYoQSwhMCl9ZnVuY3Rpb24gTChfKXtzd2l0Y2gocy5nZXRUb2tlbigpKXtjYXNlIDc6cmV0dXJuIGYobmV3IEdjKF8scy5nZXRUb2tlbk9mZnNldCgpKSwhMCk7Y2FzZSA4OnJldHVybiBmKG5ldyBObyhfLCEwLHMuZ2V0VG9rZW5PZmZzZXQoKSksITApO2Nhc2UgOTpyZXR1cm4gZihuZXcgTm8oXywhMSxzLmdldFRva2VuT2Zmc2V0KCkpLCEwKTtkZWZhdWx0OnJldHVybn19ZnVuY3Rpb24gdihfKXtyZXR1cm4gZChfKXx8cChfKXx8eChfKXx8dyhfKXx8TChfKX1sZXQgeTtyZXR1cm4gbCgpIT09MTcmJih5PXYoeSkseT9zLmdldFRva2VuKCkhPT0xNyYmdShFKCJFbmQgb2YgZmlsZSBleHBlY3RlZC4iKSxILlVuZGVmaW5lZCk6dShFKCJFeHBlY3RlZCBhIEpTT04gb2JqZWN0LCBhcnJheSBvciBsaXRlcmFsLiIpLEguVW5kZWZpbmVkKSksbmV3IFJvKHksbixhKX1mdW5jdGlvbiBZcihlLHQsbil7aWYoZSE9PW51bGwmJnR5cGVvZiBlPT0ib2JqZWN0Iil7Y29uc3Qgcj10KyIJIjtpZihBcnJheS5pc0FycmF5KGUpKXtpZihlLmxlbmd0aD09PTApcmV0dXJuIltdIjtsZXQgaT1gWwpgO2ZvcihsZXQgcz0wO3M8ZS5sZW5ndGg7cysrKWkrPXIrWXIoZVtzXSxyLG4pLHM8ZS5sZW5ndGgtMSYmKGkrPSIsIiksaSs9YApgO3JldHVybiBpKz10KyJdIixpfWVsc2V7Y29uc3QgaT1PYmplY3Qua2V5cyhlKTtpZihpLmxlbmd0aD09PTApcmV0dXJuInt9IjtsZXQgcz1gewpgO2ZvcihsZXQgYT0wO2E8aS5sZW5ndGg7YSsrKXtjb25zdCBsPWlbYV07cys9citKU09OLnN0cmluZ2lmeShsKSsiOiAiK1lyKGVbbF0scixuKSxhPGkubGVuZ3RoLTEmJihzKz0iLCIpLHMrPWAKYH1yZXR1cm4gcys9dCsifSIsc319cmV0dXJuIG4oZSl9dmFyIG4xPWNsYXNze2NvbnN0cnVjdG9yKGUsdD1bXSxuPVByb21pc2Uscj17fSl7dGhpcy5zY2hlbWFTZXJ2aWNlPWUsdGhpcy5jb250cmlidXRpb25zPXQsdGhpcy5wcm9taXNlQ29uc3RydWN0b3I9bix0aGlzLmNsaWVudENhcGFiaWxpdGllcz1yfWRvUmVzb2x2ZShlKXtmb3IobGV0IHQ9dGhpcy5jb250cmlidXRpb25zLmxlbmd0aC0xO3Q+PTA7dC0tKXtjb25zdCBuPXRoaXMuY29udHJpYnV0aW9uc1t0XS5yZXNvbHZlQ29tcGxldGlvbjtpZihuKXtjb25zdCByPW4oZSk7aWYocilyZXR1cm4gcn19cmV0dXJuIHRoaXMucHJvbWlzZUNvbnN0cnVjdG9yLnJlc29sdmUoZSl9ZG9Db21wbGV0ZShlLHQsbil7Y29uc3Qgcj17aXRlbXM6W10saXNJbmNvbXBsZXRlOiExfSxpPWUuZ2V0VGV4dCgpLHM9ZS5vZmZzZXRBdCh0KTtsZXQgYT1uLmdldE5vZGVGcm9tT2Zmc2V0KHMsITApO2lmKHRoaXMuaXNJbkNvbW1lbnQoZSxhP2Eub2Zmc2V0OjAscykpcmV0dXJuIFByb21pc2UucmVzb2x2ZShyKTtpZihhJiZzPT09YS5vZmZzZXQrYS5sZW5ndGgmJnM+MCl7Y29uc3QgZj1pW3MtMV07KGEudHlwZT09PSJvYmplY3QiJiZmPT09In0ifHxhLnR5cGU9PT0iYXJyYXkiJiZmPT09Il0iKSYmKGE9YS5wYXJlbnQpfWNvbnN0IGw9dGhpcy5nZXRDdXJyZW50V29yZChlLHMpO2xldCBvO2lmKGEmJihhLnR5cGU9PT0ic3RyaW5nInx8YS50eXBlPT09Im51bWJlciJ8fGEudHlwZT09PSJib29sZWFuInx8YS50eXBlPT09Im51bGwiKSlvPXEuY3JlYXRlKGUucG9zaXRpb25BdChhLm9mZnNldCksZS5wb3NpdGlvbkF0KGEub2Zmc2V0K2EubGVuZ3RoKSk7ZWxzZXtsZXQgZj1zLWwubGVuZ3RoO2Y+MCYmaVtmLTFdPT09JyInJiZmLS0sbz1xLmNyZWF0ZShlLnBvc2l0aW9uQXQoZiksdCl9Y29uc3QgdT1uZXcgTWFwLGg9e2FkZDpmPT57bGV0IGQ9Zi5sYWJlbDtjb25zdCBtPXUuZ2V0KGQpO2lmKG0pbS5kb2N1bWVudGF0aW9ufHwobS5kb2N1bWVudGF0aW9uPWYuZG9jdW1lbnRhdGlvbiksbS5kZXRhaWx8fChtLmRldGFpbD1mLmRldGFpbCksbS5sYWJlbERldGFpbHN8fChtLmxhYmVsRGV0YWlscz1mLmxhYmVsRGV0YWlscyk7ZWxzZXtpZihkPWQucmVwbGFjZSgvW1xuXS9nLCLihrUiKSxkLmxlbmd0aD42MCl7Y29uc3QgZz1kLnN1YnN0cigwLDU3KS50cmltKCkrIi4uLiI7dS5oYXMoZyl8fChkPWcpfWYudGV4dEVkaXQ9RGUucmVwbGFjZShvLGYuaW5zZXJ0VGV4dCksZi5sYWJlbD1kLHUuc2V0KGQsZiksci5pdGVtcy5wdXNoKGYpfX0sc2V0QXNJbmNvbXBsZXRlOigpPT57ci5pc0luY29tcGxldGU9ITB9LGVycm9yOmY9Pntjb25zb2xlLmVycm9yKGYpfSxnZXROdW1iZXJPZlByb3Bvc2FsczooKT0+ci5pdGVtcy5sZW5ndGh9O3JldHVybiB0aGlzLnNjaGVtYVNlcnZpY2UuZ2V0U2NoZW1hRm9yUmVzb3VyY2UoZS51cmksbikudGhlbihmPT57Y29uc3QgZD1bXTtsZXQgbT0hMCxnPSIiLHA7aWYoYSYmYS50eXBlPT09InN0cmluZyIpe2NvbnN0IHc9YS5wYXJlbnQ7dyYmdy50eXBlPT09InByb3BlcnR5IiYmdy5rZXlOb2RlPT09YSYmKG09IXcudmFsdWVOb2RlLHA9dyxnPWkuc3Vic3RyKGEub2Zmc2V0KzEsYS5sZW5ndGgtMiksdyYmKGE9dy5wYXJlbnQpKX1pZihhJiZhLnR5cGU9PT0ib2JqZWN0Iil7aWYoYS5vZmZzZXQ9PT1zKXJldHVybiByO2EucHJvcGVydGllcy5mb3JFYWNoKHk9PnsoIXB8fHAhPT15KSYmdS5zZXQoeS5rZXlOb2RlLnZhbHVlLFdyLmNyZWF0ZSgiX18iKSl9KTtsZXQgTD0iIjttJiYoTD10aGlzLmV2YWx1YXRlU2VwYXJhdG9yQWZ0ZXIoZSxlLm9mZnNldEF0KG8uZW5kKSkpLGY/dGhpcy5nZXRQcm9wZXJ0eUNvbXBsZXRpb25zKGYsbixhLG0sTCxoKTp0aGlzLmdldFNjaGVtYUxlc3NQcm9wZXJ0eUNvbXBsZXRpb25zKG4sYSxnLGgpO2NvbnN0IHY9UXIoYSk7dGhpcy5jb250cmlidXRpb25zLmZvckVhY2goeT0+e2NvbnN0IGI9eS5jb2xsZWN0UHJvcGVydHlDb21wbGV0aW9ucyhlLnVyaSx2LGwsbSxMPT09IiIsaCk7YiYmZC5wdXNoKGIpfSksIWYmJmwubGVuZ3RoPjAmJmkuY2hhckF0KHMtbC5sZW5ndGgtMSkhPT0nIicmJihoLmFkZCh7a2luZDp5ZS5Qcm9wZXJ0eSxsYWJlbDp0aGlzLmdldExhYmVsRm9yVmFsdWUobCksaW5zZXJ0VGV4dDp0aGlzLmdldEluc2VydFRleHRGb3JQcm9wZXJ0eShsLHZvaWQgMCwhMSxMKSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjoiIn0pLGguc2V0QXNJbmNvbXBsZXRlKCkpfWNvbnN0IHg9e307cmV0dXJuIGY/dGhpcy5nZXRWYWx1ZUNvbXBsZXRpb25zKGYsbixhLHMsZSxoLHgpOnRoaXMuZ2V0U2NoZW1hTGVzc1ZhbHVlQ29tcGxldGlvbnMobixhLHMsZSxoKSx0aGlzLmNvbnRyaWJ1dGlvbnMubGVuZ3RoPjAmJnRoaXMuZ2V0Q29udHJpYnV0ZWRWYWx1ZUNvbXBsZXRpb25zKG4sYSxzLGUsaCxkKSx0aGlzLnByb21pc2VDb25zdHJ1Y3Rvci5hbGwoZCkudGhlbigoKT0+e2lmKGguZ2V0TnVtYmVyT2ZQcm9wb3NhbHMoKT09PTApe2xldCB3PXM7YSYmKGEudHlwZT09PSJzdHJpbmcifHxhLnR5cGU9PT0ibnVtYmVyInx8YS50eXBlPT09ImJvb2xlYW4ifHxhLnR5cGU9PT0ibnVsbCIpJiYodz1hLm9mZnNldCthLmxlbmd0aCk7Y29uc3QgTD10aGlzLmV2YWx1YXRlU2VwYXJhdG9yQWZ0ZXIoZSx3KTt0aGlzLmFkZEZpbGxlclZhbHVlQ29tcGxldGlvbnMoeCxMLGgpfXJldHVybiByfSl9KX1nZXRQcm9wZXJ0eUNvbXBsZXRpb25zKGUsdCxuLHIsaSxzKXt0LmdldE1hdGNoaW5nU2NoZW1hcyhlLnNjaGVtYSxuLm9mZnNldCkuZm9yRWFjaChsPT57aWYobC5ub2RlPT09biYmIWwuaW52ZXJ0ZWQpe2NvbnN0IG89bC5zY2hlbWEucHJvcGVydGllcztvJiZPYmplY3Qua2V5cyhvKS5mb3JFYWNoKGg9Pntjb25zdCBmPW9baF07aWYodHlwZW9mIGY9PSJvYmplY3QiJiYhZi5kZXByZWNhdGlvbk1lc3NhZ2UmJiFmLmRvTm90U3VnZ2VzdCl7Y29uc3QgZD17a2luZDp5ZS5Qcm9wZXJ0eSxsYWJlbDpoLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yUHJvcGVydHkoaCxmLHIsaSksaW5zZXJ0VGV4dEZvcm1hdDppZS5TbmlwcGV0LGZpbHRlclRleHQ6dGhpcy5nZXRGaWx0ZXJUZXh0Rm9yVmFsdWUoaCksZG9jdW1lbnRhdGlvbjp0aGlzLmZyb21NYXJrdXAoZi5tYXJrZG93bkRlc2NyaXB0aW9uKXx8Zi5kZXNjcmlwdGlvbnx8IiJ9O2Yuc3VnZ2VzdFNvcnRUZXh0IT09dm9pZCAwJiYoZC5zb3J0VGV4dD1mLnN1Z2dlc3RTb3J0VGV4dCksZC5pbnNlcnRUZXh0JiZRdChkLmluc2VydFRleHQsYCQxJHtpfWApJiYoZC5jb21tYW5kPXt0aXRsZToiU3VnZ2VzdCIsY29tbWFuZDoiZWRpdG9yLmFjdGlvbi50cmlnZ2VyU3VnZ2VzdCJ9KSxzLmFkZChkKX19KTtjb25zdCB1PWwuc2NoZW1hLnByb3BlcnR5TmFtZXM7aWYodHlwZW9mIHU9PSJvYmplY3QiJiYhdS5kZXByZWNhdGlvbk1lc3NhZ2UmJiF1LmRvTm90U3VnZ2VzdCl7Y29uc3QgaD0oZixkPXZvaWQgMCk9Pntjb25zdCBtPXtraW5kOnllLlByb3BlcnR5LGxhYmVsOmYsaW5zZXJ0VGV4dDp0aGlzLmdldEluc2VydFRleHRGb3JQcm9wZXJ0eShmLHZvaWQgMCxyLGkpLGluc2VydFRleHRGb3JtYXQ6aWUuU25pcHBldCxmaWx0ZXJUZXh0OnRoaXMuZ2V0RmlsdGVyVGV4dEZvclZhbHVlKGYpLGRvY3VtZW50YXRpb246ZHx8dGhpcy5mcm9tTWFya3VwKHUubWFya2Rvd25EZXNjcmlwdGlvbil8fHUuZGVzY3JpcHRpb258fCIifTt1LnN1Z2dlc3RTb3J0VGV4dCE9PXZvaWQgMCYmKG0uc29ydFRleHQ9dS5zdWdnZXN0U29ydFRleHQpLG0uaW5zZXJ0VGV4dCYmUXQobS5pbnNlcnRUZXh0LGAkMSR7aX1gKSYmKG0uY29tbWFuZD17dGl0bGU6IlN1Z2dlc3QiLGNvbW1hbmQ6ImVkaXRvci5hY3Rpb24udHJpZ2dlclN1Z2dlc3QifSkscy5hZGQobSl9O2lmKHUuZW51bSlmb3IobGV0IGY9MDtmPHUuZW51bS5sZW5ndGg7ZisrKXtsZXQgZDt1Lm1hcmtkb3duRW51bURlc2NyaXB0aW9ucyYmZjx1Lm1hcmtkb3duRW51bURlc2NyaXB0aW9ucy5sZW5ndGg/ZD10aGlzLmZyb21NYXJrdXAodS5tYXJrZG93bkVudW1EZXNjcmlwdGlvbnNbZl0pOnUuZW51bURlc2NyaXB0aW9ucyYmZjx1LmVudW1EZXNjcmlwdGlvbnMubGVuZ3RoJiYoZD11LmVudW1EZXNjcmlwdGlvbnNbZl0pLGgodS5lbnVtW2ZdLGQpfXUuY29uc3QmJmgodS5jb25zdCl9fX0pfWdldFNjaGVtYUxlc3NQcm9wZXJ0eUNvbXBsZXRpb25zKGUsdCxuLHIpe2NvbnN0IGk9cz0+e3MucHJvcGVydGllcy5mb3JFYWNoKGE9Pntjb25zdCBsPWEua2V5Tm9kZS52YWx1ZTtyLmFkZCh7a2luZDp5ZS5Qcm9wZXJ0eSxsYWJlbDpsLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUobCwiIiksaW5zZXJ0VGV4dEZvcm1hdDppZS5TbmlwcGV0LGZpbHRlclRleHQ6dGhpcy5nZXRGaWx0ZXJUZXh0Rm9yVmFsdWUobCksZG9jdW1lbnRhdGlvbjoiIn0pfSl9O2lmKHQucGFyZW50KWlmKHQucGFyZW50LnR5cGU9PT0icHJvcGVydHkiKXtjb25zdCBzPXQucGFyZW50LmtleU5vZGUudmFsdWU7ZS52aXNpdChhPT4oYS50eXBlPT09InByb3BlcnR5IiYmYSE9PXQucGFyZW50JiZhLmtleU5vZGUudmFsdWU9PT1zJiZhLnZhbHVlTm9kZSYmYS52YWx1ZU5vZGUudHlwZT09PSJvYmplY3QiJiZpKGEudmFsdWVOb2RlKSwhMCkpfWVsc2UgdC5wYXJlbnQudHlwZT09PSJhcnJheSImJnQucGFyZW50Lml0ZW1zLmZvckVhY2gocz0+e3MudHlwZT09PSJvYmplY3QiJiZzIT09dCYmaShzKX0pO2Vsc2UgdC50eXBlPT09Im9iamVjdCImJnIuYWRkKHtraW5kOnllLlByb3BlcnR5LGxhYmVsOiIkc2NoZW1hIixpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclByb3BlcnR5KCIkc2NoZW1hIix2b2lkIDAsITAsIiIpLGluc2VydFRleHRGb3JtYXQ6aWUuU25pcHBldCxkb2N1bWVudGF0aW9uOiIiLGZpbHRlclRleHQ6dGhpcy5nZXRGaWx0ZXJUZXh0Rm9yVmFsdWUoIiRzY2hlbWEiKX0pfWdldFNjaGVtYUxlc3NWYWx1ZUNvbXBsZXRpb25zKGUsdCxuLHIsaSl7bGV0IHM9bjtpZih0JiYodC50eXBlPT09InN0cmluZyJ8fHQudHlwZT09PSJudW1iZXIifHx0LnR5cGU9PT0iYm9vbGVhbiJ8fHQudHlwZT09PSJudWxsIikmJihzPXQub2Zmc2V0K3QubGVuZ3RoLHQ9dC5wYXJlbnQpLCF0KXtpLmFkZCh7a2luZDp0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKCJvYmplY3QiKSxsYWJlbDoiRW1wdHkgb2JqZWN0IixpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKHt9LCIiKSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjoiIn0pLGkuYWRkKHtraW5kOnRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoImFycmF5IiksbGFiZWw6IkVtcHR5IGFycmF5IixpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKFtdLCIiKSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjoiIn0pO3JldHVybn1jb25zdCBhPXRoaXMuZXZhbHVhdGVTZXBhcmF0b3JBZnRlcihyLHMpLGw9bz0+e28ucGFyZW50JiYha28oby5wYXJlbnQsbiwhMCkmJmkuYWRkKHtraW5kOnRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoby50eXBlKSxsYWJlbDp0aGlzLmdldExhYmVsVGV4dEZvck1hdGNoaW5nTm9kZShvLHIpLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yTWF0Y2hpbmdOb2RlKG8scixhKSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjoiIn0pLG8udHlwZT09PSJib29sZWFuIiYmdGhpcy5hZGRCb29sZWFuVmFsdWVDb21wbGV0aW9uKCFvLnZhbHVlLGEsaSl9O2lmKHQudHlwZT09PSJwcm9wZXJ0eSImJm4+KHQuY29sb25PZmZzZXR8fDApKXtjb25zdCBvPXQudmFsdWVOb2RlO2lmKG8mJihuPm8ub2Zmc2V0K28ubGVuZ3RofHxvLnR5cGU9PT0ib2JqZWN0Inx8by50eXBlPT09ImFycmF5IikpcmV0dXJuO2NvbnN0IHU9dC5rZXlOb2RlLnZhbHVlO2UudmlzaXQoaD0+KGgudHlwZT09PSJwcm9wZXJ0eSImJmgua2V5Tm9kZS52YWx1ZT09PXUmJmgudmFsdWVOb2RlJiZsKGgudmFsdWVOb2RlKSwhMCkpLHU9PT0iJHNjaGVtYSImJnQucGFyZW50JiYhdC5wYXJlbnQucGFyZW50JiZ0aGlzLmFkZERvbGxhclNjaGVtYUNvbXBsZXRpb25zKGEsaSl9aWYodC50eXBlPT09ImFycmF5IilpZih0LnBhcmVudCYmdC5wYXJlbnQudHlwZT09PSJwcm9wZXJ0eSIpe2NvbnN0IG89dC5wYXJlbnQua2V5Tm9kZS52YWx1ZTtlLnZpc2l0KHU9Pih1LnR5cGU9PT0icHJvcGVydHkiJiZ1LmtleU5vZGUudmFsdWU9PT1vJiZ1LnZhbHVlTm9kZSYmdS52YWx1ZU5vZGUudHlwZT09PSJhcnJheSImJnUudmFsdWVOb2RlLml0ZW1zLmZvckVhY2gobCksITApKX1lbHNlIHQuaXRlbXMuZm9yRWFjaChsKX1nZXRWYWx1ZUNvbXBsZXRpb25zKGUsdCxuLHIsaSxzLGEpe2xldCBsPXIsbyx1O2lmKG4mJihuLnR5cGU9PT0ic3RyaW5nInx8bi50eXBlPT09Im51bWJlciJ8fG4udHlwZT09PSJib29sZWFuInx8bi50eXBlPT09Im51bGwiKSYmKGw9bi5vZmZzZXQrbi5sZW5ndGgsdT1uLG49bi5wYXJlbnQpLCFuKXt0aGlzLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMoZS5zY2hlbWEsIiIscyxhKTtyZXR1cm59aWYobi50eXBlPT09InByb3BlcnR5IiYmcj4obi5jb2xvbk9mZnNldHx8MCkpe2NvbnN0IGg9bi52YWx1ZU5vZGU7aWYoaCYmcj5oLm9mZnNldCtoLmxlbmd0aClyZXR1cm47bz1uLmtleU5vZGUudmFsdWUsbj1uLnBhcmVudH1pZihuJiYobyE9PXZvaWQgMHx8bi50eXBlPT09ImFycmF5Iikpe2NvbnN0IGg9dGhpcy5ldmFsdWF0ZVNlcGFyYXRvckFmdGVyKGksbCksZj10LmdldE1hdGNoaW5nU2NoZW1hcyhlLnNjaGVtYSxuLm9mZnNldCx1KTtmb3IoY29uc3QgZCBvZiBmKWlmKGQubm9kZT09PW4mJiFkLmludmVydGVkJiZkLnNjaGVtYSl7aWYobi50eXBlPT09ImFycmF5IiYmZC5zY2hlbWEuaXRlbXMpe2xldCBtPXM7aWYoZC5zY2hlbWEudW5pcXVlSXRlbXMpe2NvbnN0IGc9bmV3IFNldDtuLmNoaWxkcmVuLmZvckVhY2gocD0+e3AudHlwZSE9PSJhcnJheSImJnAudHlwZSE9PSJvYmplY3QiJiZnLmFkZCh0aGlzLmdldExhYmVsRm9yVmFsdWUodXQocCkpKX0pLG09ey4uLnMsYWRkKHApe2cuaGFzKHAubGFiZWwpfHxzLmFkZChwKX19fWlmKEFycmF5LmlzQXJyYXkoZC5zY2hlbWEuaXRlbXMpKXtjb25zdCBnPXRoaXMuZmluZEl0ZW1BdE9mZnNldChuLGkscik7ZzxkLnNjaGVtYS5pdGVtcy5sZW5ndGgmJnRoaXMuYWRkU2NoZW1hVmFsdWVDb21wbGV0aW9ucyhkLnNjaGVtYS5pdGVtc1tnXSxoLG0sYSl9ZWxzZSB0aGlzLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMoZC5zY2hlbWEuaXRlbXMsaCxtLGEpfWlmKG8hPT12b2lkIDApe2xldCBtPSExO2lmKGQuc2NoZW1hLnByb3BlcnRpZXMpe2NvbnN0IGc9ZC5zY2hlbWEucHJvcGVydGllc1tvXTtnJiYobT0hMCx0aGlzLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMoZyxoLHMsYSkpfWlmKGQuc2NoZW1hLnBhdHRlcm5Qcm9wZXJ0aWVzJiYhbSlmb3IoY29uc3QgZyBvZiBPYmplY3Qua2V5cyhkLnNjaGVtYS5wYXR0ZXJuUHJvcGVydGllcykpe2NvbnN0IHA9Um4oZyk7aWYocCE9bnVsbCYmcC50ZXN0KG8pKXttPSEwO2NvbnN0IHg9ZC5zY2hlbWEucGF0dGVyblByb3BlcnRpZXNbZ107dGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKHgsaCxzLGEpfX1pZihkLnNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyYmIW0pe2NvbnN0IGc9ZC5zY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXM7dGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKGcsaCxzLGEpfX19bz09PSIkc2NoZW1hIiYmIW4ucGFyZW50JiZ0aGlzLmFkZERvbGxhclNjaGVtYUNvbXBsZXRpb25zKGgscyksYS5ib29sZWFuJiYodGhpcy5hZGRCb29sZWFuVmFsdWVDb21wbGV0aW9uKCEwLGgscyksdGhpcy5hZGRCb29sZWFuVmFsdWVDb21wbGV0aW9uKCExLGgscykpLGEubnVsbCYmdGhpcy5hZGROdWxsVmFsdWVDb21wbGV0aW9uKGgscyl9fWdldENvbnRyaWJ1dGVkVmFsdWVDb21wbGV0aW9ucyhlLHQsbixyLGkscyl7aWYoIXQpdGhpcy5jb250cmlidXRpb25zLmZvckVhY2goYT0+e2NvbnN0IGw9YS5jb2xsZWN0RGVmYXVsdENvbXBsZXRpb25zKHIudXJpLGkpO2wmJnMucHVzaChsKX0pO2Vsc2UgaWYoKHQudHlwZT09PSJzdHJpbmcifHx0LnR5cGU9PT0ibnVtYmVyInx8dC50eXBlPT09ImJvb2xlYW4ifHx0LnR5cGU9PT0ibnVsbCIpJiYodD10LnBhcmVudCksdCYmdC50eXBlPT09InByb3BlcnR5IiYmbj4odC5jb2xvbk9mZnNldHx8MCkpe2NvbnN0IGE9dC5rZXlOb2RlLnZhbHVlLGw9dC52YWx1ZU5vZGU7aWYoKCFsfHxuPD1sLm9mZnNldCtsLmxlbmd0aCkmJnQucGFyZW50KXtjb25zdCBvPVFyKHQucGFyZW50KTt0aGlzLmNvbnRyaWJ1dGlvbnMuZm9yRWFjaCh1PT57Y29uc3QgaD11LmNvbGxlY3RWYWx1ZUNvbXBsZXRpb25zKHIudXJpLG8sYSxpKTtoJiZzLnB1c2goaCl9KX19fWFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMoZSx0LG4scil7dHlwZW9mIGU9PSJvYmplY3QiJiYodGhpcy5hZGRFbnVtVmFsdWVDb21wbGV0aW9ucyhlLHQsbiksdGhpcy5hZGREZWZhdWx0VmFsdWVDb21wbGV0aW9ucyhlLHQsbiksdGhpcy5jb2xsZWN0VHlwZXMoZSxyKSxBcnJheS5pc0FycmF5KGUuYWxsT2YpJiZlLmFsbE9mLmZvckVhY2goaT0+dGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKGksdCxuLHIpKSxBcnJheS5pc0FycmF5KGUuYW55T2YpJiZlLmFueU9mLmZvckVhY2goaT0+dGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKGksdCxuLHIpKSxBcnJheS5pc0FycmF5KGUub25lT2YpJiZlLm9uZU9mLmZvckVhY2goaT0+dGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKGksdCxuLHIpKSl9YWRkRGVmYXVsdFZhbHVlQ29tcGxldGlvbnMoZSx0LG4scj0wKXtsZXQgaT0hMTtpZihFZShlLmRlZmF1bHQpKXtsZXQgcz1lLnR5cGUsYT1lLmRlZmF1bHQ7Zm9yKGxldCBvPXI7bz4wO28tLSlhPVthXSxzPSJhcnJheSI7Y29uc3QgbD17a2luZDp0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKHMpLGxhYmVsOnRoaXMuZ2V0TGFiZWxGb3JWYWx1ZShhKSxpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKGEsdCksaW5zZXJ0VGV4dEZvcm1hdDppZS5TbmlwcGV0fTt0aGlzLmRvZXNTdXBwb3J0c0xhYmVsRGV0YWlscygpP2wubGFiZWxEZXRhaWxzPXtkZXNjcmlwdGlvbjpFKCJEZWZhdWx0IHZhbHVlIil9OmwuZGV0YWlsPUUoIkRlZmF1bHQgdmFsdWUiKSxuLmFkZChsKSxpPSEwfUFycmF5LmlzQXJyYXkoZS5leGFtcGxlcykmJmUuZXhhbXBsZXMuZm9yRWFjaChzPT57bGV0IGE9ZS50eXBlLGw9cztmb3IobGV0IG89cjtvPjA7by0tKWw9W2xdLGE9ImFycmF5IjtuLmFkZCh7a2luZDp0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKGEpLGxhYmVsOnRoaXMuZ2V0TGFiZWxGb3JWYWx1ZShsKSxpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKGwsdCksaW5zZXJ0VGV4dEZvcm1hdDppZS5TbmlwcGV0fSksaT0hMH0pLEFycmF5LmlzQXJyYXkoZS5kZWZhdWx0U25pcHBldHMpJiZlLmRlZmF1bHRTbmlwcGV0cy5mb3JFYWNoKHM9PntsZXQgYT1lLnR5cGUsbD1zLmJvZHksbz1zLmxhYmVsLHUsaDtpZihFZShsKSl7ZS50eXBlO2ZvcihsZXQgZj1yO2Y+MDtmLS0pbD1bbF07dT10aGlzLmdldEluc2VydFRleHRGb3JTbmlwcGV0VmFsdWUobCx0KSxoPXRoaXMuZ2V0RmlsdGVyVGV4dEZvclNuaXBwZXRWYWx1ZShsKSxvPW98fHRoaXMuZ2V0TGFiZWxGb3JTbmlwcGV0VmFsdWUobCl9ZWxzZSBpZih0eXBlb2Ygcy5ib2R5VGV4dD09InN0cmluZyIpe2xldCBmPSIiLGQ9IiIsbT0iIjtmb3IobGV0IGc9cjtnPjA7Zy0tKWY9ZittK2BbCmAsZD1kK2AKYCttKyJdIixtKz0iCSIsYT0iYXJyYXkiO3U9ZittK3MuYm9keVRleHQuc3BsaXQoYApgKS5qb2luKGAKYCttKStkK3Qsbz1vfHx1LGg9dS5yZXBsYWNlKC9bXG5dL2csIiIpfWVsc2UgcmV0dXJuO24uYWRkKHtraW5kOnRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoYSksbGFiZWw6byxkb2N1bWVudGF0aW9uOnRoaXMuZnJvbU1hcmt1cChzLm1hcmtkb3duRGVzY3JpcHRpb24pfHxzLmRlc2NyaXB0aW9uLGluc2VydFRleHQ6dSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZmlsdGVyVGV4dDpofSksaT0hMH0pLCFpJiZ0eXBlb2YgZS5pdGVtcz09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGUuaXRlbXMpJiZyPDUmJnRoaXMuYWRkRGVmYXVsdFZhbHVlQ29tcGxldGlvbnMoZS5pdGVtcyx0LG4scisxKX1hZGRFbnVtVmFsdWVDb21wbGV0aW9ucyhlLHQsbil7aWYoRWUoZS5jb25zdCkmJm4uYWRkKHtraW5kOnRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoZS50eXBlKSxsYWJlbDp0aGlzLmdldExhYmVsRm9yVmFsdWUoZS5jb25zdCksaW5zZXJ0VGV4dDp0aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZShlLmNvbnN0LHQpLGluc2VydFRleHRGb3JtYXQ6aWUuU25pcHBldCxkb2N1bWVudGF0aW9uOnRoaXMuZnJvbU1hcmt1cChlLm1hcmtkb3duRGVzY3JpcHRpb24pfHxlLmRlc2NyaXB0aW9ufSksQXJyYXkuaXNBcnJheShlLmVudW0pKWZvcihsZXQgcj0wLGk9ZS5lbnVtLmxlbmd0aDtyPGk7cisrKXtjb25zdCBzPWUuZW51bVtyXTtsZXQgYT10aGlzLmZyb21NYXJrdXAoZS5tYXJrZG93bkRlc2NyaXB0aW9uKXx8ZS5kZXNjcmlwdGlvbjtlLm1hcmtkb3duRW51bURlc2NyaXB0aW9ucyYmcjxlLm1hcmtkb3duRW51bURlc2NyaXB0aW9ucy5sZW5ndGgmJnRoaXMuZG9lc1N1cHBvcnRNYXJrZG93bigpP2E9dGhpcy5mcm9tTWFya3VwKGUubWFya2Rvd25FbnVtRGVzY3JpcHRpb25zW3JdKTplLmVudW1EZXNjcmlwdGlvbnMmJnI8ZS5lbnVtRGVzY3JpcHRpb25zLmxlbmd0aCYmKGE9ZS5lbnVtRGVzY3JpcHRpb25zW3JdKSxuLmFkZCh7a2luZDp0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKGUudHlwZSksbGFiZWw6dGhpcy5nZXRMYWJlbEZvclZhbHVlKHMpLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUocyx0KSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjphfSl9fWNvbGxlY3RUeXBlcyhlLHQpe2lmKEFycmF5LmlzQXJyYXkoZS5lbnVtKXx8RWUoZS5jb25zdCkpcmV0dXJuO2NvbnN0IG49ZS50eXBlO0FycmF5LmlzQXJyYXkobik/bi5mb3JFYWNoKHI9PnRbcl09ITApOm4mJih0W25dPSEwKX1hZGRGaWxsZXJWYWx1ZUNvbXBsZXRpb25zKGUsdCxuKXtlLm9iamVjdCYmbi5hZGQoe2tpbmQ6dGhpcy5nZXRTdWdnZXN0aW9uS2luZCgib2JqZWN0IiksbGFiZWw6Int9IixpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvckd1ZXNzZWRWYWx1ZSh7fSx0KSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZGV0YWlsOkUoIk5ldyBvYmplY3QiKSxkb2N1bWVudGF0aW9uOiIifSksZS5hcnJheSYmbi5hZGQoe2tpbmQ6dGhpcy5nZXRTdWdnZXN0aW9uS2luZCgiYXJyYXkiKSxsYWJlbDoiW10iLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yR3Vlc3NlZFZhbHVlKFtdLHQpLGluc2VydFRleHRGb3JtYXQ6aWUuU25pcHBldCxkZXRhaWw6RSgiTmV3IGFycmF5IiksZG9jdW1lbnRhdGlvbjoiIn0pfWFkZEJvb2xlYW5WYWx1ZUNvbXBsZXRpb24oZSx0LG4pe24uYWRkKHtraW5kOnRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoImJvb2xlYW4iKSxsYWJlbDplPyJ0cnVlIjoiZmFsc2UiLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoZSx0KSxpbnNlcnRUZXh0Rm9ybWF0OmllLlNuaXBwZXQsZG9jdW1lbnRhdGlvbjoiIn0pfWFkZE51bGxWYWx1ZUNvbXBsZXRpb24oZSx0KXt0LmFkZCh7a2luZDp0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKCJudWxsIiksbGFiZWw6Im51bGwiLGluc2VydFRleHQ6Im51bGwiK2UsaW5zZXJ0VGV4dEZvcm1hdDppZS5TbmlwcGV0LGRvY3VtZW50YXRpb246IiJ9KX1hZGREb2xsYXJTY2hlbWFDb21wbGV0aW9ucyhlLHQpe3RoaXMuc2NoZW1hU2VydmljZS5nZXRSZWdpc3RlcmVkU2NoZW1hSWRzKHI9PnI9PT0iaHR0cCJ8fHI9PT0iaHR0cHMiKS5mb3JFYWNoKHI9PntyLnN0YXJ0c1dpdGgoImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtIikmJihyPXIrIiMiKSx0LmFkZCh7a2luZDp5ZS5Nb2R1bGUsbGFiZWw6dGhpcy5nZXRMYWJlbEZvclZhbHVlKHIpLGZpbHRlclRleHQ6dGhpcy5nZXRGaWx0ZXJUZXh0Rm9yVmFsdWUociksaW5zZXJ0VGV4dDp0aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZShyLGUpLGluc2VydFRleHRGb3JtYXQ6aWUuU25pcHBldCxkb2N1bWVudGF0aW9uOiIifSl9KX1nZXRMYWJlbEZvclZhbHVlKGUpe3JldHVybiBKU09OLnN0cmluZ2lmeShlKX1nZXRWYWx1ZUZyb21MYWJlbChlKXtyZXR1cm4gSlNPTi5wYXJzZShlKX1nZXRGaWx0ZXJUZXh0Rm9yVmFsdWUoZSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpfWdldEZpbHRlclRleHRGb3JTbmlwcGV0VmFsdWUoZSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpLnJlcGxhY2UoL1wkXHtcZCs6KFtefV0rKVx9fFwkXGQrL2csIiQxIil9Z2V0TGFiZWxGb3JTbmlwcGV0VmFsdWUoZSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpLnJlcGxhY2UoL1wkXHtcZCs6KFtefV0rKVx9fFwkXGQrL2csIiQxIil9Z2V0SW5zZXJ0VGV4dEZvclBsYWluVGV4dChlKXtyZXR1cm4gZS5yZXBsYWNlKC9bXFxcJFx9XS9nLCJcXCQmIil9Z2V0SW5zZXJ0VGV4dEZvclZhbHVlKGUsdCl7Y29uc3Qgbj1KU09OLnN0cmluZ2lmeShlLG51bGwsIgkiKTtyZXR1cm4gbj09PSJ7fSI/InskMX0iK3Q6bj09PSJbXSI/IlskMV0iK3Q6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yUGxhaW5UZXh0KG4rdCl9Z2V0SW5zZXJ0VGV4dEZvclNuaXBwZXRWYWx1ZShlLHQpe3JldHVybiBZcihlLCIiLHI9PnR5cGVvZiByPT0ic3RyaW5nIiYmclswXT09PSJeIj9yLnN1YnN0cigxKTpKU09OLnN0cmluZ2lmeShyKSkrdH1nZXRJbnNlcnRUZXh0Rm9yR3Vlc3NlZFZhbHVlKGUsdCl7c3dpdGNoKHR5cGVvZiBlKXtjYXNlIm9iamVjdCI6cmV0dXJuIGU9PT1udWxsPyIkezE6bnVsbH0iK3Q6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoZSx0KTtjYXNlInN0cmluZyI6bGV0IG49SlNPTi5zdHJpbmdpZnkoZSk7cmV0dXJuIG49bi5zdWJzdHIoMSxuLmxlbmd0aC0yKSxuPXRoaXMuZ2V0SW5zZXJ0VGV4dEZvclBsYWluVGV4dChuKSwnIiR7MTonK24rJ30iJyt0O2Nhc2UibnVtYmVyIjpjYXNlImJvb2xlYW4iOnJldHVybiIkezE6IitKU09OLnN0cmluZ2lmeShlKSsifSIrdH1yZXR1cm4gdGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoZSx0KX1nZXRTdWdnZXN0aW9uS2luZChlKXtpZihBcnJheS5pc0FycmF5KGUpKXtjb25zdCB0PWU7ZT10Lmxlbmd0aD4wP3RbMF06dm9pZCAwfWlmKCFlKXJldHVybiB5ZS5WYWx1ZTtzd2l0Y2goZSl7Y2FzZSJzdHJpbmciOnJldHVybiB5ZS5WYWx1ZTtjYXNlIm9iamVjdCI6cmV0dXJuIHllLk1vZHVsZTtjYXNlInByb3BlcnR5IjpyZXR1cm4geWUuUHJvcGVydHk7ZGVmYXVsdDpyZXR1cm4geWUuVmFsdWV9fWdldExhYmVsVGV4dEZvck1hdGNoaW5nTm9kZShlLHQpe3N3aXRjaChlLnR5cGUpe2Nhc2UiYXJyYXkiOnJldHVybiJbXSI7Y2FzZSJvYmplY3QiOnJldHVybiJ7fSI7ZGVmYXVsdDpyZXR1cm4gdC5nZXRUZXh0KCkuc3Vic3RyKGUub2Zmc2V0LGUubGVuZ3RoKX19Z2V0SW5zZXJ0VGV4dEZvck1hdGNoaW5nTm9kZShlLHQsbil7c3dpdGNoKGUudHlwZSl7Y2FzZSJhcnJheSI6cmV0dXJuIHRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKFtdLG4pO2Nhc2Uib2JqZWN0IjpyZXR1cm4gdGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoe30sbik7ZGVmYXVsdDpjb25zdCByPXQuZ2V0VGV4dCgpLnN1YnN0cihlLm9mZnNldCxlLmxlbmd0aCkrbjtyZXR1cm4gdGhpcy5nZXRJbnNlcnRUZXh0Rm9yUGxhaW5UZXh0KHIpfX1nZXRJbnNlcnRUZXh0Rm9yUHJvcGVydHkoZSx0LG4scil7Y29uc3QgaT10aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZShlLCIiKTtpZighbilyZXR1cm4gaTtjb25zdCBzPWkrIjogIjtsZXQgYSxsPTA7aWYodCl7aWYoQXJyYXkuaXNBcnJheSh0LmRlZmF1bHRTbmlwcGV0cykpe2lmKHQuZGVmYXVsdFNuaXBwZXRzLmxlbmd0aD09PTEpe2NvbnN0IG89dC5kZWZhdWx0U25pcHBldHNbMF0uYm9keTtFZShvKSYmKGE9dGhpcy5nZXRJbnNlcnRUZXh0Rm9yU25pcHBldFZhbHVlKG8sIiIpKX1sKz10LmRlZmF1bHRTbmlwcGV0cy5sZW5ndGh9aWYodC5lbnVtJiYoIWEmJnQuZW51bS5sZW5ndGg9PT0xJiYoYT10aGlzLmdldEluc2VydFRleHRGb3JHdWVzc2VkVmFsdWUodC5lbnVtWzBdLCIiKSksbCs9dC5lbnVtLmxlbmd0aCksRWUodC5jb25zdCkmJihhfHwoYT10aGlzLmdldEluc2VydFRleHRGb3JHdWVzc2VkVmFsdWUodC5jb25zdCwiIikpLGwrKyksRWUodC5kZWZhdWx0KSYmKGF8fChhPXRoaXMuZ2V0SW5zZXJ0VGV4dEZvckd1ZXNzZWRWYWx1ZSh0LmRlZmF1bHQsIiIpKSxsKyspLEFycmF5LmlzQXJyYXkodC5leGFtcGxlcykmJnQuZXhhbXBsZXMubGVuZ3RoJiYoYXx8KGE9dGhpcy5nZXRJbnNlcnRUZXh0Rm9yR3Vlc3NlZFZhbHVlKHQuZXhhbXBsZXNbMF0sIiIpKSxsKz10LmV4YW1wbGVzLmxlbmd0aCksbD09PTApe2xldCBvPUFycmF5LmlzQXJyYXkodC50eXBlKT90LnR5cGVbMF06dC50eXBlO3N3aXRjaChvfHwodC5wcm9wZXJ0aWVzP289Im9iamVjdCI6dC5pdGVtcyYmKG89ImFycmF5IikpLG8pe2Nhc2UiYm9vbGVhbiI6YT0iJDEiO2JyZWFrO2Nhc2Uic3RyaW5nIjphPSciJDEiJzticmVhaztjYXNlIm9iamVjdCI6YT0ieyQxfSI7YnJlYWs7Y2FzZSJhcnJheSI6YT0iWyQxXSI7YnJlYWs7Y2FzZSJudW1iZXIiOmNhc2UiaW50ZWdlciI6YT0iJHsxOjB9IjticmVhaztjYXNlIm51bGwiOmE9IiR7MTpudWxsfSI7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gaX19fXJldHVybighYXx8bD4xKSYmKGE9IiQxIikscythK3J9Z2V0Q3VycmVudFdvcmQoZSx0KXtsZXQgbj10LTE7Y29uc3Qgcj1lLmdldFRleHQoKTtmb3IoO24+PTAmJmAgCQpcclx2Ijp7WyxdfWAuaW5kZXhPZihyLmNoYXJBdChuKSk9PT0tMTspbi0tO3JldHVybiByLnN1YnN0cmluZyhuKzEsdCl9ZXZhbHVhdGVTZXBhcmF0b3JBZnRlcihlLHQpe2NvbnN0IG49YXQoZS5nZXRUZXh0KCksITApO3N3aXRjaChuLnNldFBvc2l0aW9uKHQpLG4uc2NhbigpKXtjYXNlIDU6Y2FzZSAyOmNhc2UgNDpjYXNlIDE3OnJldHVybiIiO2RlZmF1bHQ6cmV0dXJuIiwifX1maW5kSXRlbUF0T2Zmc2V0KGUsdCxuKXtjb25zdCByPWF0KHQuZ2V0VGV4dCgpLCEwKSxpPWUuaXRlbXM7Zm9yKGxldCBzPWkubGVuZ3RoLTE7cz49MDtzLS0pe2NvbnN0IGE9aVtzXTtpZihuPmEub2Zmc2V0K2EubGVuZ3RoKXJldHVybiByLnNldFBvc2l0aW9uKGEub2Zmc2V0K2EubGVuZ3RoKSxyLnNjYW4oKT09PTUmJm4+PXIuZ2V0VG9rZW5PZmZzZXQoKStyLmdldFRva2VuTGVuZ3RoKCk/cysxOnM7aWYobj49YS5vZmZzZXQpcmV0dXJuIHN9cmV0dXJuIDB9aXNJbkNvbW1lbnQoZSx0LG4pe2NvbnN0IHI9YXQoZS5nZXRUZXh0KCksITEpO3Iuc2V0UG9zaXRpb24odCk7bGV0IGk9ci5zY2FuKCk7Zm9yKDtpIT09MTcmJnIuZ2V0VG9rZW5PZmZzZXQoKStyLmdldFRva2VuTGVuZ3RoKCk8bjspaT1yLnNjYW4oKTtyZXR1cm4oaT09PTEyfHxpPT09MTMpJiZyLmdldFRva2VuT2Zmc2V0KCk8PW59ZnJvbU1hcmt1cChlKXtpZihlJiZ0aGlzLmRvZXNTdXBwb3J0TWFya2Rvd24oKSlyZXR1cm57a2luZDpvdC5NYXJrZG93bix2YWx1ZTplfX1kb2VzU3VwcG9ydE1hcmtkb3duKCl7dmFyIGUsdCxuO2lmKCFFZSh0aGlzLnN1cHBvcnRzTWFya2Rvd24pKXtjb25zdCByPShuPSh0PShlPXRoaXMuY2xpZW50Q2FwYWJpbGl0aWVzLnRleHREb2N1bWVudCk9PW51bGw/dm9pZCAwOmUuY29tcGxldGlvbik9PW51bGw/dm9pZCAwOnQuY29tcGxldGlvbkl0ZW0pPT1udWxsP3ZvaWQgMDpuLmRvY3VtZW50YXRpb25Gb3JtYXQ7dGhpcy5zdXBwb3J0c01hcmtkb3duPUFycmF5LmlzQXJyYXkocikmJnIuaW5kZXhPZihvdC5NYXJrZG93bikhPT0tMX1yZXR1cm4gdGhpcy5zdXBwb3J0c01hcmtkb3dufWRvZXNTdXBwb3J0c0NvbW1pdENoYXJhY3RlcnMoKXt2YXIgZSx0LG47cmV0dXJuIEVlKHRoaXMuc3VwcG9ydHNDb21taXRDaGFyYWN0ZXJzKXx8KHRoaXMubGFiZWxEZXRhaWxzU3VwcG9ydD0obj0odD0oZT10aGlzLmNsaWVudENhcGFiaWxpdGllcy50ZXh0RG9jdW1lbnQpPT1udWxsP3ZvaWQgMDplLmNvbXBsZXRpb24pPT1udWxsP3ZvaWQgMDp0LmNvbXBsZXRpb25JdGVtKT09bnVsbD92b2lkIDA6bi5jb21taXRDaGFyYWN0ZXJzU3VwcG9ydCksdGhpcy5zdXBwb3J0c0NvbW1pdENoYXJhY3RlcnN9ZG9lc1N1cHBvcnRzTGFiZWxEZXRhaWxzKCl7dmFyIGUsdCxuO3JldHVybiBFZSh0aGlzLmxhYmVsRGV0YWlsc1N1cHBvcnQpfHwodGhpcy5sYWJlbERldGFpbHNTdXBwb3J0PShuPSh0PShlPXRoaXMuY2xpZW50Q2FwYWJpbGl0aWVzLnRleHREb2N1bWVudCk9PW51bGw/dm9pZCAwOmUuY29tcGxldGlvbik9PW51bGw/dm9pZCAwOnQuY29tcGxldGlvbkl0ZW0pPT1udWxsP3ZvaWQgMDpuLmxhYmVsRGV0YWlsc1N1cHBvcnQpLHRoaXMubGFiZWxEZXRhaWxzU3VwcG9ydH19LHIxPWNsYXNze2NvbnN0cnVjdG9yKGUsdD1bXSxuKXt0aGlzLnNjaGVtYVNlcnZpY2U9ZSx0aGlzLmNvbnRyaWJ1dGlvbnM9dCx0aGlzLnByb21pc2U9bnx8UHJvbWlzZX1kb0hvdmVyKGUsdCxuKXtjb25zdCByPWUub2Zmc2V0QXQodCk7bGV0IGk9bi5nZXROb2RlRnJvbU9mZnNldChyKTtpZighaXx8KGkudHlwZT09PSJvYmplY3QifHxpLnR5cGU9PT0iYXJyYXkiKSYmcj5pLm9mZnNldCsxJiZyPGkub2Zmc2V0K2kubGVuZ3RoLTEpcmV0dXJuIHRoaXMucHJvbWlzZS5yZXNvbHZlKG51bGwpO2NvbnN0IHM9aTtpZihpLnR5cGU9PT0ic3RyaW5nIil7Y29uc3QgdT1pLnBhcmVudDtpZih1JiZ1LnR5cGU9PT0icHJvcGVydHkiJiZ1LmtleU5vZGU9PT1pJiYoaT11LnZhbHVlTm9kZSwhaSkpcmV0dXJuIHRoaXMucHJvbWlzZS5yZXNvbHZlKG51bGwpfWNvbnN0IGE9cS5jcmVhdGUoZS5wb3NpdGlvbkF0KHMub2Zmc2V0KSxlLnBvc2l0aW9uQXQocy5vZmZzZXQrcy5sZW5ndGgpKSxsPXU9Pih7Y29udGVudHM6dSxyYW5nZTphfSksbz1RcihpKTtmb3IobGV0IHU9dGhpcy5jb250cmlidXRpb25zLmxlbmd0aC0xO3U+PTA7dS0tKXtjb25zdCBmPXRoaXMuY29udHJpYnV0aW9uc1t1XS5nZXRJbmZvQ29udHJpYnV0aW9uKGUudXJpLG8pO2lmKGYpcmV0dXJuIGYudGhlbihkPT5sKGQpKX1yZXR1cm4gdGhpcy5zY2hlbWFTZXJ2aWNlLmdldFNjaGVtYUZvclJlc291cmNlKGUudXJpLG4pLnRoZW4odT0+e2lmKHUmJmkpe2NvbnN0IGg9bi5nZXRNYXRjaGluZ1NjaGVtYXModS5zY2hlbWEsaS5vZmZzZXQpO2xldCBmLGQsbSxnO2guZXZlcnkoeD0+e2lmKHgubm9kZT09PWkmJiF4LmludmVydGVkJiZ4LnNjaGVtYSYmKGY9Znx8eC5zY2hlbWEudGl0bGUsZD1kfHx4LnNjaGVtYS5tYXJrZG93bkRlc2NyaXB0aW9ufHxacih4LnNjaGVtYS5kZXNjcmlwdGlvbikseC5zY2hlbWEuZW51bSkpe2NvbnN0IHc9eC5zY2hlbWEuZW51bS5pbmRleE9mKHV0KGkpKTt4LnNjaGVtYS5tYXJrZG93bkVudW1EZXNjcmlwdGlvbnM/bT14LnNjaGVtYS5tYXJrZG93bkVudW1EZXNjcmlwdGlvbnNbd106eC5zY2hlbWEuZW51bURlc2NyaXB0aW9ucyYmKG09WnIoeC5zY2hlbWEuZW51bURlc2NyaXB0aW9uc1t3XSkpLG0mJihnPXguc2NoZW1hLmVudW1bd10sdHlwZW9mIGchPSJzdHJpbmciJiYoZz1KU09OLnN0cmluZ2lmeShnKSkpfXJldHVybiEwfSk7bGV0IHA9IiI7cmV0dXJuIGYmJihwPVpyKGYpKSxkJiYocC5sZW5ndGg+MCYmKHArPWAKCmApLHArPWQpLG0mJihwLmxlbmd0aD4wJiYocCs9YAoKYCkscCs9YFxgJHtpMShnKX1cYDogJHttfWApLGwoW3BdKX1yZXR1cm4gbnVsbH0pfX07ZnVuY3Rpb24gWnIoZSl7aWYoZSlyZXR1cm4gZS5yZXBsYWNlKC8oW15cblxyXSkoXHI/XG4pKFteXG5ccl0pL2dtLGAkMQoKJDNgKS5yZXBsYWNlKC9bXFxgKl97fVtcXSgpIytcLS4hXS9nLCJcXCQmIil9ZnVuY3Rpb24gaTEoZSl7cmV0dXJuIGUuaW5kZXhPZigiYCIpIT09LTE/ImBgICIrZSsiIGBgIjplfXZhciBzMT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuanNvblNjaGVtYVNlcnZpY2U9ZSx0aGlzLnByb21pc2U9dCx0aGlzLnZhbGlkYXRpb25FbmFibGVkPSEwfWNvbmZpZ3VyZShlKXtlJiYodGhpcy52YWxpZGF0aW9uRW5hYmxlZD1lLnZhbGlkYXRlIT09ITEsdGhpcy5jb21tZW50U2V2ZXJpdHk9ZS5hbGxvd0NvbW1lbnRzP3ZvaWQgMDp4ZS5FcnJvcil9ZG9WYWxpZGF0aW9uKGUsdCxuLHIpe2lmKCF0aGlzLnZhbGlkYXRpb25FbmFibGVkKXJldHVybiB0aGlzLnByb21pc2UucmVzb2x2ZShbXSk7Y29uc3QgaT1bXSxzPXt9LGE9bz0+e2NvbnN0IHU9by5yYW5nZS5zdGFydC5saW5lKyIgIitvLnJhbmdlLnN0YXJ0LmNoYXJhY3RlcisiICIrby5tZXNzYWdlO3NbdV18fChzW3VdPSEwLGkucHVzaChvKSl9LGw9bz0+e2xldCB1PW4hPW51bGwmJm4udHJhaWxpbmdDb21tYXM/UG4obi50cmFpbGluZ0NvbW1hcyk6eGUuRXJyb3IsaD1uIT1udWxsJiZuLmNvbW1lbnRzP1BuKG4uY29tbWVudHMpOnRoaXMuY29tbWVudFNldmVyaXR5LGY9biE9bnVsbCYmbi5zY2hlbWFWYWxpZGF0aW9uP1BuKG4uc2NoZW1hVmFsaWRhdGlvbik6eGUuV2FybmluZyxkPW4hPW51bGwmJm4uc2NoZW1hUmVxdWVzdD9QbihuLnNjaGVtYVJlcXVlc3QpOnhlLldhcm5pbmc7aWYobyl7Y29uc3QgbT0oZyxwKT0+e2lmKHQucm9vdCYmZCl7Y29uc3QgeD10LnJvb3Qsdz14LnR5cGU9PT0ib2JqZWN0Ij94LnByb3BlcnRpZXNbMF06dm9pZCAwO2lmKHcmJncua2V5Tm9kZS52YWx1ZT09PSIkc2NoZW1hIil7Y29uc3QgTD13LnZhbHVlTm9kZXx8dyx2PXEuY3JlYXRlKGUucG9zaXRpb25BdChMLm9mZnNldCksZS5wb3NpdGlvbkF0KEwub2Zmc2V0K0wubGVuZ3RoKSk7YSh6ZS5jcmVhdGUodixnLGQscCkpfWVsc2V7Y29uc3QgTD1xLmNyZWF0ZShlLnBvc2l0aW9uQXQoeC5vZmZzZXQpLGUucG9zaXRpb25BdCh4Lm9mZnNldCsxKSk7YSh6ZS5jcmVhdGUoTCxnLGQscCkpfX19O2lmKG8uZXJyb3JzLmxlbmd0aCltKG8uZXJyb3JzWzBdLEguU2NoZW1hUmVzb2x2ZUVycm9yKTtlbHNlIGlmKGYpe2Zvcihjb25zdCBwIG9mIG8ud2FybmluZ3MpbShwLEguU2NoZW1hVW5zdXBwb3J0ZWRGZWF0dXJlKTtjb25zdCBnPXQudmFsaWRhdGUoZSxvLnNjaGVtYSxmLG49PW51bGw/dm9pZCAwOm4uc2NoZW1hRHJhZnQpO2cmJmcuZm9yRWFjaChhKX1NbyhvLnNjaGVtYSkmJihoPXZvaWQgMCksQ28oby5zY2hlbWEpJiYodT12b2lkIDApfWZvcihjb25zdCBtIG9mIHQuc3ludGF4RXJyb3JzKXtpZihtLmNvZGU9PT1ILlRyYWlsaW5nQ29tbWEpe2lmKHR5cGVvZiB1IT0ibnVtYmVyIiljb250aW51ZTttLnNldmVyaXR5PXV9YShtKX1pZih0eXBlb2YgaD09Im51bWJlciIpe2NvbnN0IG09RSgiQ29tbWVudHMgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gSlNPTi4iKTt0LmNvbW1lbnRzLmZvckVhY2goZz0+e2EoemUuY3JlYXRlKGcsbSxoLEguQ29tbWVudE5vdFBlcm1pdHRlZCkpfSl9cmV0dXJuIGl9O2lmKHIpe2NvbnN0IG89ci5pZHx8InNjaGVtYXNlcnZpY2U6Ly91bnRpdGxlZC8iK2ExKys7cmV0dXJuIHRoaXMuanNvblNjaGVtYVNlcnZpY2UucmVnaXN0ZXJFeHRlcm5hbFNjaGVtYSh7dXJpOm8sc2NoZW1hOnJ9KS5nZXRSZXNvbHZlZFNjaGVtYSgpLnRoZW4oaD0+bChoKSl9cmV0dXJuIHRoaXMuanNvblNjaGVtYVNlcnZpY2UuZ2V0U2NoZW1hRm9yUmVzb3VyY2UoZS51cmksdCkudGhlbihvPT5sKG8pKX1nZXRMYW5ndWFnZVN0YXR1cyhlLHQpe3JldHVybntzY2hlbWFzOnRoaXMuanNvblNjaGVtYVNlcnZpY2UuZ2V0U2NoZW1hVVJJc0ZvclJlc291cmNlKGUudXJpLHQpfX19LGExPTA7ZnVuY3Rpb24gTW8oZSl7aWYoZSYmdHlwZW9mIGU9PSJvYmplY3QiKXtpZihWZShlLmFsbG93Q29tbWVudHMpKXJldHVybiBlLmFsbG93Q29tbWVudHM7aWYoZS5hbGxPZilmb3IoY29uc3QgdCBvZiBlLmFsbE9mKXtjb25zdCBuPU1vKHQpO2lmKFZlKG4pKXJldHVybiBufX19ZnVuY3Rpb24gQ28oZSl7aWYoZSYmdHlwZW9mIGU9PSJvYmplY3QiKXtpZihWZShlLmFsbG93VHJhaWxpbmdDb21tYXMpKXJldHVybiBlLmFsbG93VHJhaWxpbmdDb21tYXM7Y29uc3QgdD1lO2lmKFZlKHQuYWxsb3dzVHJhaWxpbmdDb21tYXMpKXJldHVybiB0LmFsbG93c1RyYWlsaW5nQ29tbWFzO2lmKGUuYWxsT2YpZm9yKGNvbnN0IG4gb2YgZS5hbGxPZil7Y29uc3Qgcj1DbyhuKTtpZihWZShyKSlyZXR1cm4gcn19fWZ1bmN0aW9uIFBuKGUpe3N3aXRjaChlKXtjYXNlImVycm9yIjpyZXR1cm4geGUuRXJyb3I7Y2FzZSJ3YXJuaW5nIjpyZXR1cm4geGUuV2FybmluZztjYXNlImlnbm9yZSI6cmV0dXJufX12YXIgVG89NDgsbzE9NTcsbDE9NjUsSW49OTcsdTE9MTAyO2Z1bmN0aW9uIHRlKGUpe3JldHVybiBlPFRvPzA6ZTw9bzE/ZS1UbzooZTxJbiYmKGUrPUluLWwxKSxlPj1JbiYmZTw9dTE/ZS1JbisxMDowKX1mdW5jdGlvbiBjMShlKXtpZihlWzBdPT09IiMiKXN3aXRjaChlLmxlbmd0aCl7Y2FzZSA0OnJldHVybntyZWQ6dGUoZS5jaGFyQ29kZUF0KDEpKSoxNy8yNTUsZ3JlZW46dGUoZS5jaGFyQ29kZUF0KDIpKSoxNy8yNTUsYmx1ZTp0ZShlLmNoYXJDb2RlQXQoMykpKjE3LzI1NSxhbHBoYToxfTtjYXNlIDU6cmV0dXJue3JlZDp0ZShlLmNoYXJDb2RlQXQoMSkpKjE3LzI1NSxncmVlbjp0ZShlLmNoYXJDb2RlQXQoMikpKjE3LzI1NSxibHVlOnRlKGUuY2hhckNvZGVBdCgzKSkqMTcvMjU1LGFscGhhOnRlKGUuY2hhckNvZGVBdCg0KSkqMTcvMjU1fTtjYXNlIDc6cmV0dXJue3JlZDoodGUoZS5jaGFyQ29kZUF0KDEpKSoxNit0ZShlLmNoYXJDb2RlQXQoMikpKS8yNTUsZ3JlZW46KHRlKGUuY2hhckNvZGVBdCgzKSkqMTYrdGUoZS5jaGFyQ29kZUF0KDQpKSkvMjU1LGJsdWU6KHRlKGUuY2hhckNvZGVBdCg1KSkqMTYrdGUoZS5jaGFyQ29kZUF0KDYpKSkvMjU1LGFscGhhOjF9O2Nhc2UgOTpyZXR1cm57cmVkOih0ZShlLmNoYXJDb2RlQXQoMSkpKjE2K3RlKGUuY2hhckNvZGVBdCgyKSkpLzI1NSxncmVlbjoodGUoZS5jaGFyQ29kZUF0KDMpKSoxNit0ZShlLmNoYXJDb2RlQXQoNCkpKS8yNTUsYmx1ZToodGUoZS5jaGFyQ29kZUF0KDUpKSoxNit0ZShlLmNoYXJDb2RlQXQoNikpKS8yNTUsYWxwaGE6KHRlKGUuY2hhckNvZGVBdCg3KSkqMTYrdGUoZS5jaGFyQ29kZUF0KDgpKSkvMjU1fX19dmFyIGYxPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMuc2NoZW1hU2VydmljZT1lfWZpbmREb2N1bWVudFN5bWJvbHMoZSx0LG49e3Jlc3VsdExpbWl0Ok51bWJlci5NQVhfVkFMVUV9KXtjb25zdCByPXQucm9vdDtpZighcilyZXR1cm5bXTtsZXQgaT1uLnJlc3VsdExpbWl0fHxOdW1iZXIuTUFYX1ZBTFVFO2NvbnN0IHM9ZS51cmk7aWYoKHM9PT0idnNjb2RlOi8vZGVmYXVsdHNldHRpbmdzL2tleWJpbmRpbmdzLmpzb24ifHxRdChzLnRvTG93ZXJDYXNlKCksIi91c2VyL2tleWJpbmRpbmdzLmpzb24iKSkmJnIudHlwZT09PSJhcnJheSIpe2NvbnN0IGY9W107Zm9yKGNvbnN0IGQgb2Ygci5pdGVtcylpZihkLnR5cGU9PT0ib2JqZWN0Iil7Zm9yKGNvbnN0IG0gb2YgZC5wcm9wZXJ0aWVzKWlmKG0ua2V5Tm9kZS52YWx1ZT09PSJrZXkiJiZtLnZhbHVlTm9kZSl7Y29uc3QgZz1FdC5jcmVhdGUoZS51cmksdHQoZSxkKSk7aWYoZi5wdXNoKHtuYW1lOlBvKG0udmFsdWVOb2RlKSxraW5kOk9lLkZ1bmN0aW9uLGxvY2F0aW9uOmd9KSxpLS0saTw9MClyZXR1cm4gbiYmbi5vblJlc3VsdExpbWl0RXhjZWVkZWQmJm4ub25SZXN1bHRMaW1pdEV4Y2VlZGVkKHMpLGZ9fXJldHVybiBmfWNvbnN0IGE9W3tub2RlOnIsY29udGFpbmVyTmFtZToiIn1dO2xldCBsPTAsbz0hMTtjb25zdCB1PVtdLGg9KGYsZCk9PntmLnR5cGU9PT0iYXJyYXkiP2YuaXRlbXMuZm9yRWFjaChtPT57bSYmYS5wdXNoKHtub2RlOm0sY29udGFpbmVyTmFtZTpkfSl9KTpmLnR5cGU9PT0ib2JqZWN0IiYmZi5wcm9wZXJ0aWVzLmZvckVhY2gobT0+e2NvbnN0IGc9bS52YWx1ZU5vZGU7aWYoZylpZihpPjApe2ktLTtjb25zdCBwPUV0LmNyZWF0ZShlLnVyaSx0dChlLG0pKSx4PWQ/ZCsiLiIrbS5rZXlOb2RlLnZhbHVlOm0ua2V5Tm9kZS52YWx1ZTt1LnB1c2goe25hbWU6dGhpcy5nZXRLZXlMYWJlbChtKSxraW5kOnRoaXMuZ2V0U3ltYm9sS2luZChnLnR5cGUpLGxvY2F0aW9uOnAsY29udGFpbmVyTmFtZTpkfSksYS5wdXNoKHtub2RlOmcsY29udGFpbmVyTmFtZTp4fSl9ZWxzZSBvPSEwfSl9O2Zvcig7bDxhLmxlbmd0aDspe2NvbnN0IGY9YVtsKytdO2goZi5ub2RlLGYuY29udGFpbmVyTmFtZSl9cmV0dXJuIG8mJm4mJm4ub25SZXN1bHRMaW1pdEV4Y2VlZGVkJiZuLm9uUmVzdWx0TGltaXRFeGNlZWRlZChzKSx1fWZpbmREb2N1bWVudFN5bWJvbHMyKGUsdCxuPXtyZXN1bHRMaW1pdDpOdW1iZXIuTUFYX1ZBTFVFfSl7Y29uc3Qgcj10LnJvb3Q7aWYoIXIpcmV0dXJuW107bGV0IGk9bi5yZXN1bHRMaW1pdHx8TnVtYmVyLk1BWF9WQUxVRTtjb25zdCBzPWUudXJpO2lmKChzPT09InZzY29kZTovL2RlZmF1bHRzZXR0aW5ncy9rZXliaW5kaW5ncy5qc29uInx8UXQocy50b0xvd2VyQ2FzZSgpLCIvdXNlci9rZXliaW5kaW5ncy5qc29uIikpJiZyLnR5cGU9PT0iYXJyYXkiKXtjb25zdCBmPVtdO2Zvcihjb25zdCBkIG9mIHIuaXRlbXMpaWYoZC50eXBlPT09Im9iamVjdCIpe2Zvcihjb25zdCBtIG9mIGQucHJvcGVydGllcylpZihtLmtleU5vZGUudmFsdWU9PT0ia2V5IiYmbS52YWx1ZU5vZGUpe2NvbnN0IGc9dHQoZSxkKSxwPXR0KGUsbS5rZXlOb2RlKTtpZihmLnB1c2goe25hbWU6UG8obS52YWx1ZU5vZGUpLGtpbmQ6T2UuRnVuY3Rpb24scmFuZ2U6ZyxzZWxlY3Rpb25SYW5nZTpwfSksaS0tLGk8PTApcmV0dXJuIG4mJm4ub25SZXN1bHRMaW1pdEV4Y2VlZGVkJiZuLm9uUmVzdWx0TGltaXRFeGNlZWRlZChzKSxmfX1yZXR1cm4gZn1jb25zdCBhPVtdLGw9W3tub2RlOnIscmVzdWx0OmF9XTtsZXQgbz0wLHU9ITE7Y29uc3QgaD0oZixkKT0+e2YudHlwZT09PSJhcnJheSI/Zi5pdGVtcy5mb3JFYWNoKChtLGcpPT57aWYobSlpZihpPjApe2ktLTtjb25zdCBwPXR0KGUsbSkseD1wLEw9e25hbWU6U3RyaW5nKGcpLGtpbmQ6dGhpcy5nZXRTeW1ib2xLaW5kKG0udHlwZSkscmFuZ2U6cCxzZWxlY3Rpb25SYW5nZTp4LGNoaWxkcmVuOltdfTtkLnB1c2goTCksbC5wdXNoKHtyZXN1bHQ6TC5jaGlsZHJlbixub2RlOm19KX1lbHNlIHU9ITB9KTpmLnR5cGU9PT0ib2JqZWN0IiYmZi5wcm9wZXJ0aWVzLmZvckVhY2gobT0+e2NvbnN0IGc9bS52YWx1ZU5vZGU7aWYoZylpZihpPjApe2ktLTtjb25zdCBwPXR0KGUsbSkseD10dChlLG0ua2V5Tm9kZSksdz1bXSxMPXtuYW1lOnRoaXMuZ2V0S2V5TGFiZWwobSksa2luZDp0aGlzLmdldFN5bWJvbEtpbmQoZy50eXBlKSxyYW5nZTpwLHNlbGVjdGlvblJhbmdlOngsY2hpbGRyZW46dyxkZXRhaWw6dGhpcy5nZXREZXRhaWwoZyl9O2QucHVzaChMKSxsLnB1c2goe3Jlc3VsdDp3LG5vZGU6Z30pfWVsc2UgdT0hMH0pfTtmb3IoO288bC5sZW5ndGg7KXtjb25zdCBmPWxbbysrXTtoKGYubm9kZSxmLnJlc3VsdCl9cmV0dXJuIHUmJm4mJm4ub25SZXN1bHRMaW1pdEV4Y2VlZGVkJiZuLm9uUmVzdWx0TGltaXRFeGNlZWRlZChzKSxhfWdldFN5bWJvbEtpbmQoZSl7c3dpdGNoKGUpe2Nhc2Uib2JqZWN0IjpyZXR1cm4gT2UuTW9kdWxlO2Nhc2Uic3RyaW5nIjpyZXR1cm4gT2UuU3RyaW5nO2Nhc2UibnVtYmVyIjpyZXR1cm4gT2UuTnVtYmVyO2Nhc2UiYXJyYXkiOnJldHVybiBPZS5BcnJheTtjYXNlImJvb2xlYW4iOnJldHVybiBPZS5Cb29sZWFuO2RlZmF1bHQ6cmV0dXJuIE9lLlZhcmlhYmxlfX1nZXRLZXlMYWJlbChlKXtsZXQgdD1lLmtleU5vZGUudmFsdWU7cmV0dXJuIHQmJih0PXQucmVwbGFjZSgvW1xuXS9nLCLihrUiKSksdCYmdC50cmltKCk/dDpgIiR7dH0iYH1nZXREZXRhaWwoZSl7aWYoZSl7aWYoZS50eXBlPT09ImJvb2xlYW4ifHxlLnR5cGU9PT0ibnVtYmVyInx8ZS50eXBlPT09Im51bGwifHxlLnR5cGU9PT0ic3RyaW5nIilyZXR1cm4gU3RyaW5nKGUudmFsdWUpO2lmKGUudHlwZT09PSJhcnJheSIpcmV0dXJuIGUuY2hpbGRyZW4ubGVuZ3RoP3ZvaWQgMDoiW10iO2lmKGUudHlwZT09PSJvYmplY3QiKXJldHVybiBlLmNoaWxkcmVuLmxlbmd0aD92b2lkIDA6Int9In19ZmluZERvY3VtZW50Q29sb3JzKGUsdCxuKXtyZXR1cm4gdGhpcy5zY2hlbWFTZXJ2aWNlLmdldFNjaGVtYUZvclJlc291cmNlKGUudXJpLHQpLnRoZW4ocj0+e2NvbnN0IGk9W107aWYocil7bGV0IHM9biYmdHlwZW9mIG4ucmVzdWx0TGltaXQ9PSJudW1iZXIiP24ucmVzdWx0TGltaXQ6TnVtYmVyLk1BWF9WQUxVRTtjb25zdCBhPXQuZ2V0TWF0Y2hpbmdTY2hlbWFzKHIuc2NoZW1hKSxsPXt9O2Zvcihjb25zdCBvIG9mIGEpaWYoIW8uaW52ZXJ0ZWQmJm8uc2NoZW1hJiYoby5zY2hlbWEuZm9ybWF0PT09ImNvbG9yInx8by5zY2hlbWEuZm9ybWF0PT09ImNvbG9yLWhleCIpJiZvLm5vZGUmJm8ubm9kZS50eXBlPT09InN0cmluZyIpe2NvbnN0IHU9U3RyaW5nKG8ubm9kZS5vZmZzZXQpO2lmKCFsW3VdKXtjb25zdCBoPWMxKHV0KG8ubm9kZSkpO2lmKGgpe2NvbnN0IGY9dHQoZSxvLm5vZGUpO2kucHVzaCh7Y29sb3I6aCxyYW5nZTpmfSl9aWYobFt1XT0hMCxzLS0sczw9MClyZXR1cm4gbiYmbi5vblJlc3VsdExpbWl0RXhjZWVkZWQmJm4ub25SZXN1bHRMaW1pdEV4Y2VlZGVkKGUudXJpKSxpfX19cmV0dXJuIGl9KX1nZXRDb2xvclByZXNlbnRhdGlvbnMoZSx0LG4scil7Y29uc3QgaT1bXSxzPU1hdGgucm91bmQobi5yZWQqMjU1KSxhPU1hdGgucm91bmQobi5ncmVlbioyNTUpLGw9TWF0aC5yb3VuZChuLmJsdWUqMjU1KTtmdW5jdGlvbiBvKGgpe2NvbnN0IGY9aC50b1N0cmluZygxNik7cmV0dXJuIGYubGVuZ3RoIT09Mj8iMCIrZjpmfWxldCB1O3JldHVybiBuLmFscGhhPT09MT91PWAjJHtvKHMpfSR7byhhKX0ke28obCl9YDp1PWAjJHtvKHMpfSR7byhhKX0ke28obCl9JHtvKE1hdGgucm91bmQobi5hbHBoYSoyNTUpKX1gLGkucHVzaCh7bGFiZWw6dSx0ZXh0RWRpdDpEZS5yZXBsYWNlKHIsSlNPTi5zdHJpbmdpZnkodSkpfSksaX19O2Z1bmN0aW9uIHR0KGUsdCl7cmV0dXJuIHEuY3JlYXRlKGUucG9zaXRpb25BdCh0Lm9mZnNldCksZS5wb3NpdGlvbkF0KHQub2Zmc2V0K3QubGVuZ3RoKSl9ZnVuY3Rpb24gUG8oZSl7cmV0dXJuIHV0KGUpfHxFKCI8ZW1wdHk+Iil9dmFyIEtyPXtzY2hlbWFBc3NvY2lhdGlvbnM6W10sc2NoZW1hczp7Imh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyI6eyRzY2hlbWE6Imh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDQvc2NoZW1hIyIsZGVmaW5pdGlvbnM6e3NjaGVtYUFycmF5Ont0eXBlOiJhcnJheSIsbWluSXRlbXM6MSxpdGVtczp7JHJlZjoiIyJ9fSxwb3NpdGl2ZUludGVnZXI6e3R5cGU6ImludGVnZXIiLG1pbmltdW06MH0scG9zaXRpdmVJbnRlZ2VyRGVmYXVsdDA6e2FsbE9mOlt7JHJlZjoiIy9kZWZpbml0aW9ucy9wb3NpdGl2ZUludGVnZXIifSx7ZGVmYXVsdDowfV19LHNpbXBsZVR5cGVzOnt0eXBlOiJzdHJpbmciLGVudW06WyJhcnJheSIsImJvb2xlYW4iLCJpbnRlZ2VyIiwibnVsbCIsIm51bWJlciIsIm9iamVjdCIsInN0cmluZyJdfSxzdHJpbmdBcnJheTp7dHlwZToiYXJyYXkiLGl0ZW1zOnt0eXBlOiJzdHJpbmcifSxtaW5JdGVtczoxLHVuaXF1ZUl0ZW1zOiEwfX0sdHlwZToib2JqZWN0Iixwcm9wZXJ0aWVzOntpZDp7dHlwZToic3RyaW5nIixmb3JtYXQ6InVyaSJ9LCRzY2hlbWE6e3R5cGU6InN0cmluZyIsZm9ybWF0OiJ1cmkifSx0aXRsZTp7dHlwZToic3RyaW5nIn0sZGVzY3JpcHRpb246e3R5cGU6InN0cmluZyJ9LGRlZmF1bHQ6e30sbXVsdGlwbGVPZjp7dHlwZToibnVtYmVyIixtaW5pbXVtOjAsZXhjbHVzaXZlTWluaW11bTohMH0sbWF4aW11bTp7dHlwZToibnVtYmVyIn0sZXhjbHVzaXZlTWF4aW11bTp7dHlwZToiYm9vbGVhbiIsZGVmYXVsdDohMX0sbWluaW11bTp7dHlwZToibnVtYmVyIn0sZXhjbHVzaXZlTWluaW11bTp7dHlwZToiYm9vbGVhbiIsZGVmYXVsdDohMX0sbWF4TGVuZ3RoOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvcG9zaXRpdmVJbnRlZ2VyIn1dfSxtaW5MZW5ndGg6e2FsbE9mOlt7JHJlZjoiIy9kZWZpbml0aW9ucy9wb3NpdGl2ZUludGVnZXJEZWZhdWx0MCJ9XX0scGF0dGVybjp7dHlwZToic3RyaW5nIixmb3JtYXQ6InJlZ2V4In0sYWRkaXRpb25hbEl0ZW1zOnthbnlPZjpbe3R5cGU6ImJvb2xlYW4ifSx7JHJlZjoiIyJ9XSxkZWZhdWx0Ont9fSxpdGVtczp7YW55T2Y6W3skcmVmOiIjIn0seyRyZWY6IiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkifV0sZGVmYXVsdDp7fX0sbWF4SXRlbXM6e2FsbE9mOlt7JHJlZjoiIy9kZWZpbml0aW9ucy9wb3NpdGl2ZUludGVnZXIifV19LG1pbkl0ZW1zOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvcG9zaXRpdmVJbnRlZ2VyRGVmYXVsdDAifV19LHVuaXF1ZUl0ZW1zOnt0eXBlOiJib29sZWFuIixkZWZhdWx0OiExfSxtYXhQcm9wZXJ0aWVzOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvcG9zaXRpdmVJbnRlZ2VyIn1dfSxtaW5Qcm9wZXJ0aWVzOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvcG9zaXRpdmVJbnRlZ2VyRGVmYXVsdDAifV19LHJlcXVpcmVkOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvc3RyaW5nQXJyYXkifV19LGFkZGl0aW9uYWxQcm9wZXJ0aWVzOnthbnlPZjpbe3R5cGU6ImJvb2xlYW4ifSx7JHJlZjoiIyJ9XSxkZWZhdWx0Ont9fSxkZWZpbml0aW9uczp7dHlwZToib2JqZWN0IixhZGRpdGlvbmFsUHJvcGVydGllczp7JHJlZjoiIyJ9LGRlZmF1bHQ6e319LHByb3BlcnRpZXM6e3R5cGU6Im9iamVjdCIsYWRkaXRpb25hbFByb3BlcnRpZXM6eyRyZWY6IiMifSxkZWZhdWx0Ont9fSxwYXR0ZXJuUHJvcGVydGllczp7dHlwZToib2JqZWN0IixhZGRpdGlvbmFsUHJvcGVydGllczp7JHJlZjoiIyJ9LGRlZmF1bHQ6e319LGRlcGVuZGVuY2llczp7dHlwZToib2JqZWN0IixhZGRpdGlvbmFsUHJvcGVydGllczp7YW55T2Y6W3skcmVmOiIjIn0seyRyZWY6IiMvZGVmaW5pdGlvbnMvc3RyaW5nQXJyYXkifV19fSxlbnVtOnt0eXBlOiJhcnJheSIsbWluSXRlbXM6MSx1bmlxdWVJdGVtczohMH0sdHlwZTp7YW55T2Y6W3skcmVmOiIjL2RlZmluaXRpb25zL3NpbXBsZVR5cGVzIn0se3R5cGU6ImFycmF5IixpdGVtczp7JHJlZjoiIy9kZWZpbml0aW9ucy9zaW1wbGVUeXBlcyJ9LG1pbkl0ZW1zOjEsdW5pcXVlSXRlbXM6ITB9XX0sZm9ybWF0OnthbnlPZjpbe3R5cGU6InN0cmluZyIsZW51bTpbImRhdGUtdGltZSIsInVyaSIsImVtYWlsIiwiaG9zdG5hbWUiLCJpcHY0IiwiaXB2NiIsInJlZ2V4Il19LHt0eXBlOiJzdHJpbmcifV19LGFsbE9mOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkifV19LGFueU9mOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkifV19LG9uZU9mOnthbGxPZjpbeyRyZWY6IiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkifV19LG5vdDp7YWxsT2Y6W3skcmVmOiIjIn1dfX0sZGVwZW5kZW5jaWVzOntleGNsdXNpdmVNYXhpbXVtOlsibWF4aW11bSJdLGV4Y2x1c2l2ZU1pbmltdW06WyJtaW5pbXVtIl19LGRlZmF1bHQ6e319LCJodHRwOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LTA3L3NjaGVtYSMiOntkZWZpbml0aW9uczp7c2NoZW1hQXJyYXk6e3R5cGU6ImFycmF5IixtaW5JdGVtczoxLGl0ZW1zOnskcmVmOiIjIn19LG5vbk5lZ2F0aXZlSW50ZWdlcjp7dHlwZToiaW50ZWdlciIsbWluaW11bTowfSxub25OZWdhdGl2ZUludGVnZXJEZWZhdWx0MDp7YWxsT2Y6W3skcmVmOiIjL2RlZmluaXRpb25zL25vbk5lZ2F0aXZlSW50ZWdlciJ9LHtkZWZhdWx0OjB9XX0sc2ltcGxlVHlwZXM6e2VudW06WyJhcnJheSIsImJvb2xlYW4iLCJpbnRlZ2VyIiwibnVsbCIsIm51bWJlciIsIm9iamVjdCIsInN0cmluZyJdfSxzdHJpbmdBcnJheTp7dHlwZToiYXJyYXkiLGl0ZW1zOnt0eXBlOiJzdHJpbmcifSx1bmlxdWVJdGVtczohMCxkZWZhdWx0OltdfX0sdHlwZTpbIm9iamVjdCIsImJvb2xlYW4iXSxwcm9wZXJ0aWVzOnskaWQ6e3R5cGU6InN0cmluZyIsZm9ybWF0OiJ1cmktcmVmZXJlbmNlIn0sJHNjaGVtYTp7dHlwZToic3RyaW5nIixmb3JtYXQ6InVyaSJ9LCRyZWY6e3R5cGU6InN0cmluZyIsZm9ybWF0OiJ1cmktcmVmZXJlbmNlIn0sJGNvbW1lbnQ6e3R5cGU6InN0cmluZyJ9LHRpdGxlOnt0eXBlOiJzdHJpbmcifSxkZXNjcmlwdGlvbjp7dHlwZToic3RyaW5nIn0sZGVmYXVsdDohMCxyZWFkT25seTp7dHlwZToiYm9vbGVhbiIsZGVmYXVsdDohMX0sZXhhbXBsZXM6e3R5cGU6ImFycmF5IixpdGVtczohMH0sbXVsdGlwbGVPZjp7dHlwZToibnVtYmVyIixleGNsdXNpdmVNaW5pbXVtOjB9LG1heGltdW06e3R5cGU6Im51bWJlciJ9LGV4Y2x1c2l2ZU1heGltdW06e3R5cGU6Im51bWJlciJ9LG1pbmltdW06e3R5cGU6Im51bWJlciJ9LGV4Y2x1c2l2ZU1pbmltdW06e3R5cGU6Im51bWJlciJ9LG1heExlbmd0aDp7JHJlZjoiIy9kZWZpbml0aW9ucy9ub25OZWdhdGl2ZUludGVnZXIifSxtaW5MZW5ndGg6eyRyZWY6IiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyRGVmYXVsdDAifSxwYXR0ZXJuOnt0eXBlOiJzdHJpbmciLGZvcm1hdDoicmVnZXgifSxhZGRpdGlvbmFsSXRlbXM6eyRyZWY6IiMifSxpdGVtczp7YW55T2Y6W3skcmVmOiIjIn0seyRyZWY6IiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkifV0sZGVmYXVsdDohMH0sbWF4SXRlbXM6eyRyZWY6IiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyIn0sbWluSXRlbXM6eyRyZWY6IiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyRGVmYXVsdDAifSx1bmlxdWVJdGVtczp7dHlwZToiYm9vbGVhbiIsZGVmYXVsdDohMX0sY29udGFpbnM6eyRyZWY6IiMifSxtYXhQcm9wZXJ0aWVzOnskcmVmOiIjL2RlZmluaXRpb25zL25vbk5lZ2F0aXZlSW50ZWdlciJ9LG1pblByb3BlcnRpZXM6eyRyZWY6IiMvZGVmaW5pdGlvbnMvbm9uTmVnYXRpdmVJbnRlZ2VyRGVmYXVsdDAifSxyZXF1aXJlZDp7JHJlZjoiIy9kZWZpbml0aW9ucy9zdHJpbmdBcnJheSJ9LGFkZGl0aW9uYWxQcm9wZXJ0aWVzOnskcmVmOiIjIn0sZGVmaW5pdGlvbnM6e3R5cGU6Im9iamVjdCIsYWRkaXRpb25hbFByb3BlcnRpZXM6eyRyZWY6IiMifSxkZWZhdWx0Ont9fSxwcm9wZXJ0aWVzOnt0eXBlOiJvYmplY3QiLGFkZGl0aW9uYWxQcm9wZXJ0aWVzOnskcmVmOiIjIn0sZGVmYXVsdDp7fX0scGF0dGVyblByb3BlcnRpZXM6e3R5cGU6Im9iamVjdCIsYWRkaXRpb25hbFByb3BlcnRpZXM6eyRyZWY6IiMifSxwcm9wZXJ0eU5hbWVzOntmb3JtYXQ6InJlZ2V4In0sZGVmYXVsdDp7fX0sZGVwZW5kZW5jaWVzOnt0eXBlOiJvYmplY3QiLGFkZGl0aW9uYWxQcm9wZXJ0aWVzOnthbnlPZjpbeyRyZWY6IiMifSx7JHJlZjoiIy9kZWZpbml0aW9ucy9zdHJpbmdBcnJheSJ9XX19LHByb3BlcnR5TmFtZXM6eyRyZWY6IiMifSxjb25zdDohMCxlbnVtOnt0eXBlOiJhcnJheSIsaXRlbXM6ITAsbWluSXRlbXM6MSx1bmlxdWVJdGVtczohMH0sdHlwZTp7YW55T2Y6W3skcmVmOiIjL2RlZmluaXRpb25zL3NpbXBsZVR5cGVzIn0se3R5cGU6ImFycmF5IixpdGVtczp7JHJlZjoiIy9kZWZpbml0aW9ucy9zaW1wbGVUeXBlcyJ9LG1pbkl0ZW1zOjEsdW5pcXVlSXRlbXM6ITB9XX0sZm9ybWF0Ont0eXBlOiJzdHJpbmcifSxjb250ZW50TWVkaWFUeXBlOnt0eXBlOiJzdHJpbmcifSxjb250ZW50RW5jb2Rpbmc6e3R5cGU6InN0cmluZyJ9LGlmOnskcmVmOiIjIn0sdGhlbjp7JHJlZjoiIyJ9LGVsc2U6eyRyZWY6IiMifSxhbGxPZjp7JHJlZjoiIy9kZWZpbml0aW9ucy9zY2hlbWFBcnJheSJ9LGFueU9mOnskcmVmOiIjL2RlZmluaXRpb25zL3NjaGVtYUFycmF5In0sb25lT2Y6eyRyZWY6IiMvZGVmaW5pdGlvbnMvc2NoZW1hQXJyYXkifSxub3Q6eyRyZWY6IiMifX0sZGVmYXVsdDohMH19fSxoMT17aWQ6RSgiQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHNjaGVtYS4iKSwkc2NoZW1hOkUoIlRoZSBzY2hlbWEgdG8gdmVyaWZ5IHRoaXMgZG9jdW1lbnQgYWdhaW5zdC4iKSx0aXRsZTpFKCJBIGRlc2NyaXB0aXZlIHRpdGxlIG9mIHRoZSBlbGVtZW50LiIpLGRlc2NyaXB0aW9uOkUoIkEgbG9uZyBkZXNjcmlwdGlvbiBvZiB0aGUgZWxlbWVudC4gVXNlZCBpbiBob3ZlciBtZW51cyBhbmQgc3VnZ2VzdGlvbnMuIiksZGVmYXVsdDpFKCJBIGRlZmF1bHQgdmFsdWUuIFVzZWQgYnkgc3VnZ2VzdGlvbnMuIiksbXVsdGlwbGVPZjpFKCJBIG51bWJlciB0aGF0IHNob3VsZCBjbGVhbmx5IGRpdmlkZSB0aGUgY3VycmVudCB2YWx1ZSAoaS5lLiBoYXZlIG5vIHJlbWFpbmRlcikuIiksbWF4aW11bTpFKCJUaGUgbWF4aW11bSBudW1lcmljYWwgdmFsdWUsIGluY2x1c2l2ZSBieSBkZWZhdWx0LiIpLGV4Y2x1c2l2ZU1heGltdW06RSgiTWFrZXMgdGhlIG1heGltdW0gcHJvcGVydHkgZXhjbHVzaXZlLiIpLG1pbmltdW06RSgiVGhlIG1pbmltdW0gbnVtZXJpY2FsIHZhbHVlLCBpbmNsdXNpdmUgYnkgZGVmYXVsdC4iKSxleGNsdXNpdmVNaW5pbXVtOkUoIk1ha2VzIHRoZSBtaW5pbXVtIHByb3BlcnR5IGV4Y2x1c2l2ZS4iKSxtYXhMZW5ndGg6RSgiVGhlIG1heGltdW0gbGVuZ3RoIG9mIGEgc3RyaW5nLiIpLG1pbkxlbmd0aDpFKCJUaGUgbWluaW11bSBsZW5ndGggb2YgYSBzdHJpbmcuIikscGF0dGVybjpFKCJBIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCB0aGUgc3RyaW5nIGFnYWluc3QuIEl0IGlzIG5vdCBpbXBsaWNpdGx5IGFuY2hvcmVkLiIpLGFkZGl0aW9uYWxJdGVtczpFKCJGb3IgYXJyYXlzLCBvbmx5IHdoZW4gaXRlbXMgaXMgc2V0IGFzIGFuIGFycmF5LiBJZiBpdCBpcyBhIHNjaGVtYSwgdGhlbiB0aGlzIHNjaGVtYSB2YWxpZGF0ZXMgaXRlbXMgYWZ0ZXIgdGhlIG9uZXMgc3BlY2lmaWVkIGJ5IHRoZSBpdGVtcyBhcnJheS4gSWYgaXQgaXMgZmFsc2UsIHRoZW4gYWRkaXRpb25hbCBpdGVtcyB3aWxsIGNhdXNlIHZhbGlkYXRpb24gdG8gZmFpbC4iKSxpdGVtczpFKCJGb3IgYXJyYXlzLiBDYW4gZWl0aGVyIGJlIGEgc2NoZW1hIHRvIHZhbGlkYXRlIGV2ZXJ5IGVsZW1lbnQgYWdhaW5zdCBvciBhbiBhcnJheSBvZiBzY2hlbWFzIHRvIHZhbGlkYXRlIGVhY2ggaXRlbSBhZ2FpbnN0IGluIG9yZGVyICh0aGUgZmlyc3Qgc2NoZW1hIHdpbGwgdmFsaWRhdGUgdGhlIGZpcnN0IGVsZW1lbnQsIHRoZSBzZWNvbmQgc2NoZW1hIHdpbGwgdmFsaWRhdGUgdGhlIHNlY29uZCBlbGVtZW50LCBhbmQgc28gb24uIiksbWF4SXRlbXM6RSgiVGhlIG1heGltdW0gbnVtYmVyIG9mIGl0ZW1zIHRoYXQgY2FuIGJlIGluc2lkZSBhbiBhcnJheS4gSW5jbHVzaXZlLiIpLG1pbkl0ZW1zOkUoIlRoZSBtaW5pbXVtIG51bWJlciBvZiBpdGVtcyB0aGF0IGNhbiBiZSBpbnNpZGUgYW4gYXJyYXkuIEluY2x1c2l2ZS4iKSx1bmlxdWVJdGVtczpFKCJJZiBhbGwgb2YgdGhlIGl0ZW1zIGluIHRoZSBhcnJheSBtdXN0IGJlIHVuaXF1ZS4gRGVmYXVsdHMgdG8gZmFsc2UuIiksbWF4UHJvcGVydGllczpFKCJUaGUgbWF4aW11bSBudW1iZXIgb2YgcHJvcGVydGllcyBhbiBvYmplY3QgY2FuIGhhdmUuIEluY2x1c2l2ZS4iKSxtaW5Qcm9wZXJ0aWVzOkUoIlRoZSBtaW5pbXVtIG51bWJlciBvZiBwcm9wZXJ0aWVzIGFuIG9iamVjdCBjYW4gaGF2ZS4gSW5jbHVzaXZlLiIpLHJlcXVpcmVkOkUoIkFuIGFycmF5IG9mIHN0cmluZ3MgdGhhdCBsaXN0cyB0aGUgbmFtZXMgb2YgYWxsIHByb3BlcnRpZXMgcmVxdWlyZWQgb24gdGhpcyBvYmplY3QuIiksYWRkaXRpb25hbFByb3BlcnRpZXM6RSgiRWl0aGVyIGEgc2NoZW1hIG9yIGEgYm9vbGVhbi4gSWYgYSBzY2hlbWEsIHRoZW4gdXNlZCB0byB2YWxpZGF0ZSBhbGwgcHJvcGVydGllcyBub3QgbWF0Y2hlZCBieSAncHJvcGVydGllcycgb3IgJ3BhdHRlcm5Qcm9wZXJ0aWVzJy4gSWYgZmFsc2UsIHRoZW4gYW55IHByb3BlcnRpZXMgbm90IG1hdGNoZWQgYnkgZWl0aGVyIHdpbGwgY2F1c2UgdGhpcyBzY2hlbWEgdG8gZmFpbC4iKSxkZWZpbml0aW9uczpFKCJOb3QgdXNlZCBmb3IgdmFsaWRhdGlvbi4gUGxhY2Ugc3Vic2NoZW1hcyBoZXJlIHRoYXQgeW91IHdpc2ggdG8gcmVmZXJlbmNlIGlubGluZSB3aXRoICRyZWYuIikscHJvcGVydGllczpFKCJBIG1hcCBvZiBwcm9wZXJ0eSBuYW1lcyB0byBzY2hlbWFzIGZvciBlYWNoIHByb3BlcnR5LiIpLHBhdHRlcm5Qcm9wZXJ0aWVzOkUoIkEgbWFwIG9mIHJlZ3VsYXIgZXhwcmVzc2lvbnMgb24gcHJvcGVydHkgbmFtZXMgdG8gc2NoZW1hcyBmb3IgbWF0Y2hpbmcgcHJvcGVydGllcy4iKSxkZXBlbmRlbmNpZXM6RSgiQSBtYXAgb2YgcHJvcGVydHkgbmFtZXMgdG8gZWl0aGVyIGFuIGFycmF5IG9mIHByb3BlcnR5IG5hbWVzIG9yIGEgc2NoZW1hLiBBbiBhcnJheSBvZiBwcm9wZXJ0eSBuYW1lcyBtZWFucyB0aGUgcHJvcGVydHkgbmFtZWQgaW4gdGhlIGtleSBkZXBlbmRzIG9uIHRoZSBwcm9wZXJ0aWVzIGluIHRoZSBhcnJheSBiZWluZyBwcmVzZW50IGluIHRoZSBvYmplY3QgaW4gb3JkZXIgdG8gYmUgdmFsaWQuIElmIHRoZSB2YWx1ZSBpcyBhIHNjaGVtYSwgdGhlbiB0aGUgc2NoZW1hIGlzIG9ubHkgYXBwbGllZCB0byB0aGUgb2JqZWN0IGlmIHRoZSBwcm9wZXJ0eSBpbiB0aGUga2V5IGV4aXN0cyBvbiB0aGUgb2JqZWN0LiIpLGVudW06RSgiVGhlIHNldCBvZiBsaXRlcmFsIHZhbHVlcyB0aGF0IGFyZSB2YWxpZC4iKSx0eXBlOkUoIkVpdGhlciBhIHN0cmluZyBvZiBvbmUgb2YgdGhlIGJhc2ljIHNjaGVtYSB0eXBlcyAobnVtYmVyLCBpbnRlZ2VyLCBudWxsLCBhcnJheSwgb2JqZWN0LCBib29sZWFuLCBzdHJpbmcpIG9yIGFuIGFycmF5IG9mIHN0cmluZ3Mgc3BlY2lmeWluZyBhIHN1YnNldCBvZiB0aG9zZSB0eXBlcy4iKSxmb3JtYXQ6RSgiRGVzY3JpYmVzIHRoZSBmb3JtYXQgZXhwZWN0ZWQgZm9yIHRoZSB2YWx1ZS4iKSxhbGxPZjpFKCJBbiBhcnJheSBvZiBzY2hlbWFzLCBhbGwgb2Ygd2hpY2ggbXVzdCBtYXRjaC4iKSxhbnlPZjpFKCJBbiBhcnJheSBvZiBzY2hlbWFzLCB3aGVyZSBhdCBsZWFzdCBvbmUgbXVzdCBtYXRjaC4iKSxvbmVPZjpFKCJBbiBhcnJheSBvZiBzY2hlbWFzLCBleGFjdGx5IG9uZSBvZiB3aGljaCBtdXN0IG1hdGNoLiIpLG5vdDpFKCJBIHNjaGVtYSB3aGljaCBtdXN0IG5vdCBtYXRjaC4iKSwkaWQ6RSgiQSB1bmlxdWUgaWRlbnRpZmllciBmb3IgdGhlIHNjaGVtYS4iKSwkcmVmOkUoIlJlZmVyZW5jZSBhIGRlZmluaXRpb24gaG9zdGVkIG9uIGFueSBsb2NhdGlvbi4iKSwkY29tbWVudDpFKCJDb21tZW50cyBmcm9tIHNjaGVtYSBhdXRob3JzIHRvIHJlYWRlcnMgb3IgbWFpbnRhaW5lcnMgb2YgdGhlIHNjaGVtYS4iKSxyZWFkT25seTpFKCJJbmRpY2F0ZXMgdGhhdCB0aGUgdmFsdWUgb2YgdGhlIGluc3RhbmNlIGlzIG1hbmFnZWQgZXhjbHVzaXZlbHkgYnkgdGhlIG93bmluZyBhdXRob3JpdHkuIiksZXhhbXBsZXM6RSgiU2FtcGxlIEpTT04gdmFsdWVzIGFzc29jaWF0ZWQgd2l0aCBhIHBhcnRpY3VsYXIgc2NoZW1hLCBmb3IgdGhlIHB1cnBvc2Ugb2YgaWxsdXN0cmF0aW5nIHVzYWdlLiIpLGNvbnRhaW5zOkUoJ0FuIGFycmF5IGluc3RhbmNlIGlzIHZhbGlkIGFnYWluc3QgImNvbnRhaW5zIiBpZiBhdCBsZWFzdCBvbmUgb2YgaXRzIGVsZW1lbnRzIGlzIHZhbGlkIGFnYWluc3QgdGhlIGdpdmVuIHNjaGVtYS4nKSxwcm9wZXJ0eU5hbWVzOkUoIklmIHRoZSBpbnN0YW5jZSBpcyBhbiBvYmplY3QsIHRoaXMga2V5d29yZCB2YWxpZGF0ZXMgaWYgZXZlcnkgcHJvcGVydHkgbmFtZSBpbiB0aGUgaW5zdGFuY2UgdmFsaWRhdGVzIGFnYWluc3QgdGhlIHByb3ZpZGVkIHNjaGVtYS4iKSxjb25zdDpFKCJBbiBpbnN0YW5jZSB2YWxpZGF0ZXMgc3VjY2Vzc2Z1bGx5IGFnYWluc3QgdGhpcyBrZXl3b3JkIGlmIGl0cyB2YWx1ZSBpcyBlcXVhbCB0byB0aGUgdmFsdWUgb2YgdGhlIGtleXdvcmQuIiksY29udGVudE1lZGlhVHlwZTpFKCJEZXNjcmliZXMgdGhlIG1lZGlhIHR5cGUgb2YgYSBzdHJpbmcgcHJvcGVydHkuIiksY29udGVudEVuY29kaW5nOkUoIkRlc2NyaWJlcyB0aGUgY29udGVudCBlbmNvZGluZyBvZiBhIHN0cmluZyBwcm9wZXJ0eS4iKSxpZjpFKCdUaGUgdmFsaWRhdGlvbiBvdXRjb21lIG9mIHRoZSAiaWYiIHN1YnNjaGVtYSBjb250cm9scyB3aGljaCBvZiB0aGUgInRoZW4iIG9yICJlbHNlIiBrZXl3b3JkcyBhcmUgZXZhbHVhdGVkLicpLHRoZW46RSgnVGhlICJpZiIgc3Vic2NoZW1hIGlzIHVzZWQgZm9yIHZhbGlkYXRpb24gd2hlbiB0aGUgImlmIiBzdWJzY2hlbWEgc3VjY2VlZHMuJyksZWxzZTpFKCdUaGUgImVsc2UiIHN1YnNjaGVtYSBpcyB1c2VkIGZvciB2YWxpZGF0aW9uIHdoZW4gdGhlICJpZiIgc3Vic2NoZW1hIGZhaWxzLicpfTtmb3IoY29uc3QgZSBpbiBLci5zY2hlbWFzKXtjb25zdCB0PUtyLnNjaGVtYXNbZV07Zm9yKGNvbnN0IG4gaW4gdC5wcm9wZXJ0aWVzKXtsZXQgcj10LnByb3BlcnRpZXNbbl07dHlwZW9mIHI9PSJib29sZWFuIiYmKHI9dC5wcm9wZXJ0aWVzW25dPXt9KTtjb25zdCBpPWgxW25dO2kmJihyLmRlc2NyaXB0aW9uPWkpfX12YXIgSW87KCgpPT57dmFyIGU9ezQ3MDppPT57ZnVuY3Rpb24gcyhvKXtpZih0eXBlb2YgbyE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiUGF0aCBtdXN0IGJlIGEgc3RyaW5nLiBSZWNlaXZlZCAiK0pTT04uc3RyaW5naWZ5KG8pKX1mdW5jdGlvbiBhKG8sdSl7Zm9yKHZhciBoLGY9IiIsZD0wLG09LTEsZz0wLHA9MDtwPD1vLmxlbmd0aDsrK3Ape2lmKHA8by5sZW5ndGgpaD1vLmNoYXJDb2RlQXQocCk7ZWxzZXtpZihoPT09NDcpYnJlYWs7aD00N31pZihoPT09NDcpe2lmKCEobT09PXAtMXx8Zz09PTEpKWlmKG0hPT1wLTEmJmc9PT0yKXtpZihmLmxlbmd0aDwyfHxkIT09Mnx8Zi5jaGFyQ29kZUF0KGYubGVuZ3RoLTEpIT09NDZ8fGYuY2hhckNvZGVBdChmLmxlbmd0aC0yKSE9PTQ2KXtpZihmLmxlbmd0aD4yKXt2YXIgeD1mLmxhc3RJbmRleE9mKCIvIik7aWYoeCE9PWYubGVuZ3RoLTEpe3g9PT0tMT8oZj0iIixkPTApOmQ9KGY9Zi5zbGljZSgwLHgpKS5sZW5ndGgtMS1mLmxhc3RJbmRleE9mKCIvIiksbT1wLGc9MDtjb250aW51ZX19ZWxzZSBpZihmLmxlbmd0aD09PTJ8fGYubGVuZ3RoPT09MSl7Zj0iIixkPTAsbT1wLGc9MDtjb250aW51ZX19dSYmKGYubGVuZ3RoPjA/Zis9Ii8uLiI6Zj0iLi4iLGQ9Mil9ZWxzZSBmLmxlbmd0aD4wP2YrPSIvIitvLnNsaWNlKG0rMSxwKTpmPW8uc2xpY2UobSsxLHApLGQ9cC1tLTE7bT1wLGc9MH1lbHNlIGg9PT00NiYmZyE9PS0xPysrZzpnPS0xfXJldHVybiBmfXZhciBsPXtyZXNvbHZlOmZ1bmN0aW9uKCl7Zm9yKHZhciBvLHU9IiIsaD0hMSxmPWFyZ3VtZW50cy5sZW5ndGgtMTtmPj0tMSYmIWg7Zi0tKXt2YXIgZDtmPj0wP2Q9YXJndW1lbnRzW2ZdOihvPT09dm9pZCAwJiYobz1wcm9jZXNzLmN3ZCgpKSxkPW8pLHMoZCksZC5sZW5ndGghPT0wJiYodT1kKyIvIit1LGg9ZC5jaGFyQ29kZUF0KDApPT09NDcpfXJldHVybiB1PWEodSwhaCksaD91Lmxlbmd0aD4wPyIvIit1OiIvIjp1Lmxlbmd0aD4wP3U6Ii4ifSxub3JtYWxpemU6ZnVuY3Rpb24obyl7aWYocyhvKSxvLmxlbmd0aD09PTApcmV0dXJuIi4iO3ZhciB1PW8uY2hhckNvZGVBdCgwKT09PTQ3LGg9by5jaGFyQ29kZUF0KG8ubGVuZ3RoLTEpPT09NDc7cmV0dXJuKG89YShvLCF1KSkubGVuZ3RoIT09MHx8dXx8KG89Ii4iKSxvLmxlbmd0aD4wJiZoJiYobys9Ii8iKSx1PyIvIitvOm99LGlzQWJzb2x1dGU6ZnVuY3Rpb24obyl7cmV0dXJuIHMobyksby5sZW5ndGg+MCYmby5jaGFyQ29kZUF0KDApPT09NDd9LGpvaW46ZnVuY3Rpb24oKXtpZihhcmd1bWVudHMubGVuZ3RoPT09MClyZXR1cm4iLiI7Zm9yKHZhciBvLHU9MDt1PGFyZ3VtZW50cy5sZW5ndGg7Kyt1KXt2YXIgaD1hcmd1bWVudHNbdV07cyhoKSxoLmxlbmd0aD4wJiYobz09PXZvaWQgMD9vPWg6bys9Ii8iK2gpfXJldHVybiBvPT09dm9pZCAwPyIuIjpsLm5vcm1hbGl6ZShvKX0scmVsYXRpdmU6ZnVuY3Rpb24obyx1KXtpZihzKG8pLHModSksbz09PXV8fChvPWwucmVzb2x2ZShvKSk9PT0odT1sLnJlc29sdmUodSkpKXJldHVybiIiO2Zvcih2YXIgaD0xO2g8by5sZW5ndGgmJm8uY2hhckNvZGVBdChoKT09PTQ3OysraCk7Zm9yKHZhciBmPW8ubGVuZ3RoLGQ9Zi1oLG09MTttPHUubGVuZ3RoJiZ1LmNoYXJDb2RlQXQobSk9PT00NzsrK20pO2Zvcih2YXIgZz11Lmxlbmd0aC1tLHA9ZDxnP2Q6Zyx4PS0xLHc9MDt3PD1wOysrdyl7aWYodz09PXApe2lmKGc+cCl7aWYodS5jaGFyQ29kZUF0KG0rdyk9PT00NylyZXR1cm4gdS5zbGljZShtK3crMSk7aWYodz09PTApcmV0dXJuIHUuc2xpY2UobSt3KX1lbHNlIGQ+cCYmKG8uY2hhckNvZGVBdChoK3cpPT09NDc/eD13Onc9PT0wJiYoeD0wKSk7YnJlYWt9dmFyIEw9by5jaGFyQ29kZUF0KGgrdyk7aWYoTCE9PXUuY2hhckNvZGVBdChtK3cpKWJyZWFrO0w9PT00NyYmKHg9dyl9dmFyIHY9IiI7Zm9yKHc9aCt4KzE7dzw9ZjsrK3cpdyE9PWYmJm8uY2hhckNvZGVBdCh3KSE9PTQ3fHwodi5sZW5ndGg9PT0wP3YrPSIuLiI6dis9Ii8uLiIpO3JldHVybiB2Lmxlbmd0aD4wP3YrdS5zbGljZShtK3gpOihtKz14LHUuY2hhckNvZGVBdChtKT09PTQ3JiYrK20sdS5zbGljZShtKSl9LF9tYWtlTG9uZzpmdW5jdGlvbihvKXtyZXR1cm4gb30sZGlybmFtZTpmdW5jdGlvbihvKXtpZihzKG8pLG8ubGVuZ3RoPT09MClyZXR1cm4iLiI7Zm9yKHZhciB1PW8uY2hhckNvZGVBdCgwKSxoPXU9PT00NyxmPS0xLGQ9ITAsbT1vLmxlbmd0aC0xO20+PTE7LS1tKWlmKCh1PW8uY2hhckNvZGVBdChtKSk9PT00Nyl7aWYoIWQpe2Y9bTticmVha319ZWxzZSBkPSExO3JldHVybiBmPT09LTE/aD8iLyI6Ii4iOmgmJmY9PT0xPyIvLyI6by5zbGljZSgwLGYpfSxiYXNlbmFtZTpmdW5jdGlvbihvLHUpe2lmKHUhPT12b2lkIDAmJnR5cGVvZiB1IT0ic3RyaW5nIil0aHJvdyBuZXcgVHlwZUVycm9yKCciZXh0IiBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJyk7cyhvKTt2YXIgaCxmPTAsZD0tMSxtPSEwO2lmKHUhPT12b2lkIDAmJnUubGVuZ3RoPjAmJnUubGVuZ3RoPD1vLmxlbmd0aCl7aWYodS5sZW5ndGg9PT1vLmxlbmd0aCYmdT09PW8pcmV0dXJuIiI7dmFyIGc9dS5sZW5ndGgtMSxwPS0xO2ZvcihoPW8ubGVuZ3RoLTE7aD49MDstLWgpe3ZhciB4PW8uY2hhckNvZGVBdChoKTtpZih4PT09NDcpe2lmKCFtKXtmPWgrMTticmVha319ZWxzZSBwPT09LTEmJihtPSExLHA9aCsxKSxnPj0wJiYoeD09PXUuY2hhckNvZGVBdChnKT8tLWc9PS0xJiYoZD1oKTooZz0tMSxkPXApKX1yZXR1cm4gZj09PWQ/ZD1wOmQ9PT0tMSYmKGQ9by5sZW5ndGgpLG8uc2xpY2UoZixkKX1mb3IoaD1vLmxlbmd0aC0xO2g+PTA7LS1oKWlmKG8uY2hhckNvZGVBdChoKT09PTQ3KXtpZighbSl7Zj1oKzE7YnJlYWt9fWVsc2UgZD09PS0xJiYobT0hMSxkPWgrMSk7cmV0dXJuIGQ9PT0tMT8iIjpvLnNsaWNlKGYsZCl9LGV4dG5hbWU6ZnVuY3Rpb24obyl7cyhvKTtmb3IodmFyIHU9LTEsaD0wLGY9LTEsZD0hMCxtPTAsZz1vLmxlbmd0aC0xO2c+PTA7LS1nKXt2YXIgcD1vLmNoYXJDb2RlQXQoZyk7aWYocCE9PTQ3KWY9PT0tMSYmKGQ9ITEsZj1nKzEpLHA9PT00Nj91PT09LTE/dT1nOm0hPT0xJiYobT0xKTp1IT09LTEmJihtPS0xKTtlbHNlIGlmKCFkKXtoPWcrMTticmVha319cmV0dXJuIHU9PT0tMXx8Zj09PS0xfHxtPT09MHx8bT09PTEmJnU9PT1mLTEmJnU9PT1oKzE/IiI6by5zbGljZSh1LGYpfSxmb3JtYXQ6ZnVuY3Rpb24obyl7aWYobz09PW51bGx8fHR5cGVvZiBvIT0ib2JqZWN0Iil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgInBhdGhPYmplY3QiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2Ygbyk7cmV0dXJuIGZ1bmN0aW9uKHUsaCl7dmFyIGY9aC5kaXJ8fGgucm9vdCxkPWguYmFzZXx8KGgubmFtZXx8IiIpKyhoLmV4dHx8IiIpO3JldHVybiBmP2Y9PT1oLnJvb3Q/ZitkOmYrIi8iK2Q6ZH0oMCxvKX0scGFyc2U6ZnVuY3Rpb24obyl7cyhvKTt2YXIgdT17cm9vdDoiIixkaXI6IiIsYmFzZToiIixleHQ6IiIsbmFtZToiIn07aWYoby5sZW5ndGg9PT0wKXJldHVybiB1O3ZhciBoLGY9by5jaGFyQ29kZUF0KDApLGQ9Zj09PTQ3O2Q/KHUucm9vdD0iLyIsaD0xKTpoPTA7Zm9yKHZhciBtPS0xLGc9MCxwPS0xLHg9ITAsdz1vLmxlbmd0aC0xLEw9MDt3Pj1oOy0tdylpZigoZj1vLmNoYXJDb2RlQXQodykpIT09NDcpcD09PS0xJiYoeD0hMSxwPXcrMSksZj09PTQ2P209PT0tMT9tPXc6TCE9PTEmJihMPTEpOm0hPT0tMSYmKEw9LTEpO2Vsc2UgaWYoIXgpe2c9dysxO2JyZWFrfXJldHVybiBtPT09LTF8fHA9PT0tMXx8TD09PTB8fEw9PT0xJiZtPT09cC0xJiZtPT09ZysxP3AhPT0tMSYmKHUuYmFzZT11Lm5hbWU9Zz09PTAmJmQ/by5zbGljZSgxLHApOm8uc2xpY2UoZyxwKSk6KGc9PT0wJiZkPyh1Lm5hbWU9by5zbGljZSgxLG0pLHUuYmFzZT1vLnNsaWNlKDEscCkpOih1Lm5hbWU9by5zbGljZShnLG0pLHUuYmFzZT1vLnNsaWNlKGcscCkpLHUuZXh0PW8uc2xpY2UobSxwKSksZz4wP3UuZGlyPW8uc2xpY2UoMCxnLTEpOmQmJih1LmRpcj0iLyIpLHV9LHNlcDoiLyIsZGVsaW1pdGVyOiI6Iix3aW4zMjpudWxsLHBvc2l4Om51bGx9O2wucG9zaXg9bCxpLmV4cG9ydHM9bH19LHQ9e307ZnVuY3Rpb24gbihpKXt2YXIgcz10W2ldO2lmKHMhPT12b2lkIDApcmV0dXJuIHMuZXhwb3J0czt2YXIgYT10W2ldPXtleHBvcnRzOnt9fTtyZXR1cm4gZVtpXShhLGEuZXhwb3J0cyxuKSxhLmV4cG9ydHN9bi5kPShpLHMpPT57Zm9yKHZhciBhIGluIHMpbi5vKHMsYSkmJiFuLm8oaSxhKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGksYSx7ZW51bWVyYWJsZTohMCxnZXQ6c1thXX0pfSxuLm89KGkscyk9Pk9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChpLHMpLG4ucj1pPT57dHlwZW9mIFN5bWJvbDwidSImJlN5bWJvbC50b1N0cmluZ1RhZyYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGksU3ltYm9sLnRvU3RyaW5nVGFnLHt2YWx1ZToiTW9kdWxlIn0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eShpLCJfX2VzTW9kdWxlIix7dmFsdWU6ITB9KX07dmFyIHI9e307KCgpPT57bGV0IGk7bi5yKHIpLG4uZChyLHtVUkk6KCk9PmQsVXRpbHM6KCk9Pk99KSx0eXBlb2YgcHJvY2Vzcz09Im9iamVjdCI/aT1wcm9jZXNzLnBsYXRmb3JtPT09IndpbjMyIjp0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmKGk9bmF2aWdhdG9yLnVzZXJBZ2VudC5pbmRleE9mKCJXaW5kb3dzIik+PTApO2NvbnN0IHM9L15cd1tcd1xkKy4tXSokLyxhPS9eXC8vLGw9L15cL1wvLztmdW5jdGlvbiBvKE0sTil7aWYoIU0uc2NoZW1lJiZOKXRocm93IG5ldyBFcnJvcihgW1VyaUVycm9yXTogU2NoZW1lIGlzIG1pc3Npbmc6IHtzY2hlbWU6ICIiLCBhdXRob3JpdHk6ICIke00uYXV0aG9yaXR5fSIsIHBhdGg6ICIke00ucGF0aH0iLCBxdWVyeTogIiR7TS5xdWVyeX0iLCBmcmFnbWVudDogIiR7TS5mcmFnbWVudH0ifWApO2lmKE0uc2NoZW1lJiYhcy50ZXN0KE0uc2NoZW1lKSl0aHJvdyBuZXcgRXJyb3IoIltVcmlFcnJvcl06IFNjaGVtZSBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMuIik7aWYoTS5wYXRoKXtpZihNLmF1dGhvcml0eSl7aWYoIWEudGVzdChNLnBhdGgpKXRocm93IG5ldyBFcnJvcignW1VyaUVycm9yXTogSWYgYSBVUkkgY29udGFpbnMgYW4gYXV0aG9yaXR5IGNvbXBvbmVudCwgdGhlbiB0aGUgcGF0aCBjb21wb25lbnQgbXVzdCBlaXRoZXIgYmUgZW1wdHkgb3IgYmVnaW4gd2l0aCBhIHNsYXNoICgiLyIpIGNoYXJhY3RlcicpfWVsc2UgaWYobC50ZXN0KE0ucGF0aCkpdGhyb3cgbmV3IEVycm9yKCdbVXJpRXJyb3JdOiBJZiBhIFVSSSBkb2VzIG5vdCBjb250YWluIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY2Fubm90IGJlZ2luIHdpdGggdHdvIHNsYXNoIGNoYXJhY3RlcnMgKCIvLyIpJyl9fWNvbnN0IHU9IiIsaD0iLyIsZj0vXigoW146Lz8jXSs/KTopPyhcL1wvKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/LztjbGFzcyBke2NvbnN0cnVjdG9yKE4sayxSLEksVCxQPSExKXtpdCh0aGlzLCJzY2hlbWUiKTtpdCh0aGlzLCJhdXRob3JpdHkiKTtpdCh0aGlzLCJwYXRoIik7aXQodGhpcywicXVlcnkiKTtpdCh0aGlzLCJmcmFnbWVudCIpO3R5cGVvZiBOPT0ib2JqZWN0Ij8odGhpcy5zY2hlbWU9Ti5zY2hlbWV8fHUsdGhpcy5hdXRob3JpdHk9Ti5hdXRob3JpdHl8fHUsdGhpcy5wYXRoPU4ucGF0aHx8dSx0aGlzLnF1ZXJ5PU4ucXVlcnl8fHUsdGhpcy5mcmFnbWVudD1OLmZyYWdtZW50fHx1KToodGhpcy5zY2hlbWU9ZnVuY3Rpb24oRCwkKXtyZXR1cm4gRHx8JD9EOiJmaWxlIn0oTixQKSx0aGlzLmF1dGhvcml0eT1rfHx1LHRoaXMucGF0aD1mdW5jdGlvbihELCQpe3N3aXRjaChEKXtjYXNlImh0dHBzIjpjYXNlImh0dHAiOmNhc2UiZmlsZSI6JD8kWzBdIT09aCYmKCQ9aCskKTokPWh9cmV0dXJuICR9KHRoaXMuc2NoZW1lLFJ8fHUpLHRoaXMucXVlcnk9SXx8dSx0aGlzLmZyYWdtZW50PVR8fHUsbyh0aGlzLFApKX1zdGF0aWMgaXNVcmkoTil7cmV0dXJuIE4gaW5zdGFuY2VvZiBkfHwhIU4mJnR5cGVvZiBOLmF1dGhvcml0eT09InN0cmluZyImJnR5cGVvZiBOLmZyYWdtZW50PT0ic3RyaW5nIiYmdHlwZW9mIE4ucGF0aD09InN0cmluZyImJnR5cGVvZiBOLnF1ZXJ5PT0ic3RyaW5nIiYmdHlwZW9mIE4uc2NoZW1lPT0ic3RyaW5nIiYmdHlwZW9mIE4uZnNQYXRoPT0ic3RyaW5nIiYmdHlwZW9mIE4ud2l0aD09ImZ1bmN0aW9uIiYmdHlwZW9mIE4udG9TdHJpbmc9PSJmdW5jdGlvbiJ9Z2V0IGZzUGF0aCgpe3JldHVybiBMKHRoaXMpfXdpdGgoTil7aWYoIU4pcmV0dXJuIHRoaXM7bGV0e3NjaGVtZTprLGF1dGhvcml0eTpSLHBhdGg6SSxxdWVyeTpULGZyYWdtZW50OlB9PU47cmV0dXJuIGs9PT12b2lkIDA/az10aGlzLnNjaGVtZTprPT09bnVsbCYmKGs9dSksUj09PXZvaWQgMD9SPXRoaXMuYXV0aG9yaXR5OlI9PT1udWxsJiYoUj11KSxJPT09dm9pZCAwP0k9dGhpcy5wYXRoOkk9PT1udWxsJiYoST11KSxUPT09dm9pZCAwP1Q9dGhpcy5xdWVyeTpUPT09bnVsbCYmKFQ9dSksUD09PXZvaWQgMD9QPXRoaXMuZnJhZ21lbnQ6UD09PW51bGwmJihQPXUpLGs9PT10aGlzLnNjaGVtZSYmUj09PXRoaXMuYXV0aG9yaXR5JiZJPT09dGhpcy5wYXRoJiZUPT09dGhpcy5xdWVyeSYmUD09PXRoaXMuZnJhZ21lbnQ/dGhpczpuZXcgZyhrLFIsSSxULFApfXN0YXRpYyBwYXJzZShOLGs9ITEpe2NvbnN0IFI9Zi5leGVjKE4pO3JldHVybiBSP25ldyBnKFJbMl18fHUsXyhSWzRdfHx1KSxfKFJbNV18fHUpLF8oUls3XXx8dSksXyhSWzldfHx1KSxrKTpuZXcgZyh1LHUsdSx1LHUpfXN0YXRpYyBmaWxlKE4pe2xldCBrPXU7aWYoaSYmKE49Ti5yZXBsYWNlKC9cXC9nLGgpKSxOWzBdPT09aCYmTlsxXT09PWgpe2NvbnN0IFI9Ti5pbmRleE9mKGgsMik7Uj09PS0xPyhrPU4uc3Vic3RyaW5nKDIpLE49aCk6KGs9Ti5zdWJzdHJpbmcoMixSKSxOPU4uc3Vic3RyaW5nKFIpfHxoKX1yZXR1cm4gbmV3IGcoImZpbGUiLGssTix1LHUpfXN0YXRpYyBmcm9tKE4pe2NvbnN0IGs9bmV3IGcoTi5zY2hlbWUsTi5hdXRob3JpdHksTi5wYXRoLE4ucXVlcnksTi5mcmFnbWVudCk7cmV0dXJuIG8oaywhMCksa310b1N0cmluZyhOPSExKXtyZXR1cm4gdih0aGlzLE4pfXRvSlNPTigpe3JldHVybiB0aGlzfXN0YXRpYyByZXZpdmUoTil7aWYoTil7aWYoTiBpbnN0YW5jZW9mIGQpcmV0dXJuIE47e2NvbnN0IGs9bmV3IGcoTik7cmV0dXJuIGsuX2Zvcm1hdHRlZD1OLmV4dGVybmFsLGsuX2ZzUGF0aD1OLl9zZXA9PT1tP04uZnNQYXRoOm51bGwsa319cmV0dXJuIE59fWNvbnN0IG09aT8xOnZvaWQgMDtjbGFzcyBnIGV4dGVuZHMgZHtjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7aXQodGhpcywiX2Zvcm1hdHRlZCIsbnVsbCk7aXQodGhpcywiX2ZzUGF0aCIsbnVsbCl9Z2V0IGZzUGF0aCgpe3JldHVybiB0aGlzLl9mc1BhdGh8fCh0aGlzLl9mc1BhdGg9TCh0aGlzKSksdGhpcy5fZnNQYXRofXRvU3RyaW5nKGs9ITEpe3JldHVybiBrP3YodGhpcywhMCk6KHRoaXMuX2Zvcm1hdHRlZHx8KHRoaXMuX2Zvcm1hdHRlZD12KHRoaXMsITEpKSx0aGlzLl9mb3JtYXR0ZWQpfXRvSlNPTigpe2NvbnN0IGs9eyRtaWQ6MX07cmV0dXJuIHRoaXMuX2ZzUGF0aCYmKGsuZnNQYXRoPXRoaXMuX2ZzUGF0aCxrLl9zZXA9bSksdGhpcy5fZm9ybWF0dGVkJiYoay5leHRlcm5hbD10aGlzLl9mb3JtYXR0ZWQpLHRoaXMucGF0aCYmKGsucGF0aD10aGlzLnBhdGgpLHRoaXMuc2NoZW1lJiYoay5zY2hlbWU9dGhpcy5zY2hlbWUpLHRoaXMuYXV0aG9yaXR5JiYoay5hdXRob3JpdHk9dGhpcy5hdXRob3JpdHkpLHRoaXMucXVlcnkmJihrLnF1ZXJ5PXRoaXMucXVlcnkpLHRoaXMuZnJhZ21lbnQmJihrLmZyYWdtZW50PXRoaXMuZnJhZ21lbnQpLGt9fWNvbnN0IHA9ezU4OiIlM0EiLDQ3OiIlMkYiLDYzOiIlM0YiLDM1OiIlMjMiLDkxOiIlNUIiLDkzOiIlNUQiLDY0OiIlNDAiLDMzOiIlMjEiLDM2OiIlMjQiLDM4OiIlMjYiLDM5OiIlMjciLDQwOiIlMjgiLDQxOiIlMjkiLDQyOiIlMkEiLDQzOiIlMkIiLDQ0OiIlMkMiLDU5OiIlM0IiLDYxOiIlM0QiLDMyOiIlMjAifTtmdW5jdGlvbiB4KE0sTixrKXtsZXQgUixJPS0xO2ZvcihsZXQgVD0wO1Q8TS5sZW5ndGg7VCsrKXtjb25zdCBQPU0uY2hhckNvZGVBdChUKTtpZihQPj05NyYmUDw9MTIyfHxQPj02NSYmUDw9OTB8fFA+PTQ4JiZQPD01N3x8UD09PTQ1fHxQPT09NDZ8fFA9PT05NXx8UD09PTEyNnx8TiYmUD09PTQ3fHxrJiZQPT09OTF8fGsmJlA9PT05M3x8ayYmUD09PTU4KUkhPT0tMSYmKFIrPWVuY29kZVVSSUNvbXBvbmVudChNLnN1YnN0cmluZyhJLFQpKSxJPS0xKSxSIT09dm9pZCAwJiYoUis9TS5jaGFyQXQoVCkpO2Vsc2V7Uj09PXZvaWQgMCYmKFI9TS5zdWJzdHIoMCxUKSk7Y29uc3QgRD1wW1BdO0QhPT12b2lkIDA/KEkhPT0tMSYmKFIrPWVuY29kZVVSSUNvbXBvbmVudChNLnN1YnN0cmluZyhJLFQpKSxJPS0xKSxSKz1EKTpJPT09LTEmJihJPVQpfX1yZXR1cm4gSSE9PS0xJiYoUis9ZW5jb2RlVVJJQ29tcG9uZW50KE0uc3Vic3RyaW5nKEkpKSksUiE9PXZvaWQgMD9SOk19ZnVuY3Rpb24gdyhNKXtsZXQgTjtmb3IobGV0IGs9MDtrPE0ubGVuZ3RoO2srKyl7Y29uc3QgUj1NLmNoYXJDb2RlQXQoayk7Uj09PTM1fHxSPT09NjM/KE49PT12b2lkIDAmJihOPU0uc3Vic3RyKDAsaykpLE4rPXBbUl0pOk4hPT12b2lkIDAmJihOKz1NW2tdKX1yZXR1cm4gTiE9PXZvaWQgMD9OOk19ZnVuY3Rpb24gTChNLE4pe2xldCBrO3JldHVybiBrPU0uYXV0aG9yaXR5JiZNLnBhdGgubGVuZ3RoPjEmJk0uc2NoZW1lPT09ImZpbGUiP2AvLyR7TS5hdXRob3JpdHl9JHtNLnBhdGh9YDpNLnBhdGguY2hhckNvZGVBdCgwKT09PTQ3JiYoTS5wYXRoLmNoYXJDb2RlQXQoMSk+PTY1JiZNLnBhdGguY2hhckNvZGVBdCgxKTw9OTB8fE0ucGF0aC5jaGFyQ29kZUF0KDEpPj05NyYmTS5wYXRoLmNoYXJDb2RlQXQoMSk8PTEyMikmJk0ucGF0aC5jaGFyQ29kZUF0KDIpPT09NTg/TS5wYXRoWzFdLnRvTG93ZXJDYXNlKCkrTS5wYXRoLnN1YnN0cigyKTpNLnBhdGgsaSYmKGs9ay5yZXBsYWNlKC9cLy9nLCJcXCIpKSxrfWZ1bmN0aW9uIHYoTSxOKXtjb25zdCBrPU4/dzp4O2xldCBSPSIiLHtzY2hlbWU6SSxhdXRob3JpdHk6VCxwYXRoOlAscXVlcnk6RCxmcmFnbWVudDokfT1NO2lmKEkmJihSKz1JLFIrPSI6IiksKFR8fEk9PT0iZmlsZSIpJiYoUis9aCxSKz1oKSxUKXtsZXQgaj1ULmluZGV4T2YoIkAiKTtpZihqIT09LTEpe2NvbnN0IG5lPVQuc3Vic3RyKDAsaik7VD1ULnN1YnN0cihqKzEpLGo9bmUubGFzdEluZGV4T2YoIjoiKSxqPT09LTE/Uis9ayhuZSwhMSwhMSk6KFIrPWsobmUuc3Vic3RyKDAsaiksITEsITEpLFIrPSI6IixSKz1rKG5lLnN1YnN0cihqKzEpLCExLCEwKSksUis9IkAifVQ9VC50b0xvd2VyQ2FzZSgpLGo9VC5sYXN0SW5kZXhPZigiOiIpLGo9PT0tMT9SKz1rKFQsITEsITApOihSKz1rKFQuc3Vic3RyKDAsaiksITEsITApLFIrPVQuc3Vic3RyKGopKX1pZihQKXtpZihQLmxlbmd0aD49MyYmUC5jaGFyQ29kZUF0KDApPT09NDcmJlAuY2hhckNvZGVBdCgyKT09PTU4KXtjb25zdCBqPVAuY2hhckNvZGVBdCgxKTtqPj02NSYmajw9OTAmJihQPWAvJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGorMzIpfToke1Auc3Vic3RyKDMpfWApfWVsc2UgaWYoUC5sZW5ndGg+PTImJlAuY2hhckNvZGVBdCgxKT09PTU4KXtjb25zdCBqPVAuY2hhckNvZGVBdCgwKTtqPj02NSYmajw9OTAmJihQPWAke1N0cmluZy5mcm9tQ2hhckNvZGUoaiszMil9OiR7UC5zdWJzdHIoMil9YCl9Uis9ayhQLCEwLCExKX1yZXR1cm4gRCYmKFIrPSI/IixSKz1rKEQsITEsITEpKSwkJiYoUis9IiMiLFIrPU4/JDp4KCQsITEsITEpKSxSfWZ1bmN0aW9uIHkoTSl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoTSl9Y2F0Y2h7cmV0dXJuIE0ubGVuZ3RoPjM/TS5zdWJzdHIoMCwzKSt5KE0uc3Vic3RyKDMpKTpNfX1jb25zdCBiPS8oJVswLTlBLVphLXpdWzAtOUEtWmEtel0pKy9nO2Z1bmN0aW9uIF8oTSl7cmV0dXJuIE0ubWF0Y2goYik/TS5yZXBsYWNlKGIsTj0+eShOKSk6TX12YXIgQT1uKDQ3MCk7Y29uc3QgQz1BLnBvc2l4fHxBLEY9Ii8iO3ZhciBPOyhmdW5jdGlvbihNKXtNLmpvaW5QYXRoPWZ1bmN0aW9uKE4sLi4uayl7cmV0dXJuIE4ud2l0aCh7cGF0aDpDLmpvaW4oTi5wYXRoLC4uLmspfSl9LE0ucmVzb2x2ZVBhdGg9ZnVuY3Rpb24oTiwuLi5rKXtsZXQgUj1OLnBhdGgsST0hMTtSWzBdIT09RiYmKFI9RitSLEk9ITApO2xldCBUPUMucmVzb2x2ZShSLC4uLmspO3JldHVybiBJJiZUWzBdPT09RiYmIU4uYXV0aG9yaXR5JiYoVD1ULnN1YnN0cmluZygxKSksTi53aXRoKHtwYXRoOlR9KX0sTS5kaXJuYW1lPWZ1bmN0aW9uKE4pe2lmKE4ucGF0aC5sZW5ndGg9PT0wfHxOLnBhdGg9PT1GKXJldHVybiBOO2xldCBrPUMuZGlybmFtZShOLnBhdGgpO3JldHVybiBrLmxlbmd0aD09PTEmJmsuY2hhckNvZGVBdCgwKT09PTQ2JiYoaz0iIiksTi53aXRoKHtwYXRoOmt9KX0sTS5iYXNlbmFtZT1mdW5jdGlvbihOKXtyZXR1cm4gQy5iYXNlbmFtZShOLnBhdGgpfSxNLmV4dG5hbWU9ZnVuY3Rpb24oTil7cmV0dXJuIEMuZXh0bmFtZShOLnBhdGgpfX0pKE98fChPPXt9KSl9KSgpLElvPXJ9KSgpO3ZhcntVUkk6VHQsVXRpbHM6SjF9PUlvO2Z1bmN0aW9uIGQxKGUsdCl7aWYodHlwZW9mIGUhPSJzdHJpbmciKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgc3RyaW5nIik7Y29uc3Qgbj1TdHJpbmcoZSk7bGV0IHI9IiI7Y29uc3QgaT0hIXQscz0hIXQ7bGV0IGE9ITE7Y29uc3QgbD10JiZ0eXBlb2YgdC5mbGFncz09InN0cmluZyI/dC5mbGFnczoiIjtsZXQgbztmb3IobGV0IHU9MCxoPW4ubGVuZ3RoO3U8aDt1Kyspc3dpdGNoKG89blt1XSxvKXtjYXNlIi8iOmNhc2UiJCI6Y2FzZSJeIjpjYXNlIisiOmNhc2UiLiI6Y2FzZSIoIjpjYXNlIikiOmNhc2UiPSI6Y2FzZSIhIjpjYXNlInwiOnIrPSJcXCIrbzticmVhaztjYXNlIj8iOmlmKGkpe3IrPSIuIjticmVha31jYXNlIlsiOmNhc2UiXSI6aWYoaSl7cis9bzticmVha31jYXNlInsiOmlmKGkpe2E9ITAscis9IigiO2JyZWFrfWNhc2UifSI6aWYoaSl7YT0hMSxyKz0iKSI7YnJlYWt9Y2FzZSIsIjppZihhKXtyKz0ifCI7YnJlYWt9cis9IlxcIitvO2JyZWFrO2Nhc2UiKiI6Y29uc3QgZj1uW3UtMV07bGV0IGQ9MTtmb3IoO25bdSsxXT09PSIqIjspZCsrLHUrKztjb25zdCBtPW5bdSsxXTtzP2Q+MSYmKGY9PT0iLyJ8fGY9PT12b2lkIDB8fGY9PT0ieyJ8fGY9PT0iLCIpJiYobT09PSIvInx8bT09PXZvaWQgMHx8bT09PSIsInx8bT09PSJ9Iik/KG09PT0iLyI/dSsrOmY9PT0iLyImJnIuZW5kc1dpdGgoIlxcLyIpJiYocj1yLnN1YnN0cigwLHIubGVuZ3RoLTIpKSxyKz0iKCg/OlteL10qKD86L3wkKSkqKSIpOnIrPSIoW14vXSopIjpyKz0iLioiO2JyZWFrO2RlZmF1bHQ6cis9b31yZXR1cm4oIWx8fCF+bC5pbmRleE9mKCJnIikpJiYocj0iXiIrcisiJCIpLG5ldyBSZWdFeHAocixsKX12YXIgbTE9IiEiLGcxPSIvIixwMT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbil7dGhpcy5mb2xkZXJVcmk9dCx0aGlzLnVyaXM9bix0aGlzLmdsb2JXcmFwcGVycz1bXTt0cnl7Zm9yKGxldCByIG9mIGUpe2NvbnN0IGk9clswXSE9PW0xO2l8fChyPXIuc3Vic3RyaW5nKDEpKSxyLmxlbmd0aD4wJiYoclswXT09PWcxJiYocj1yLnN1YnN0cmluZygxKSksdGhpcy5nbG9iV3JhcHBlcnMucHVzaCh7cmVnZXhwOmQxKCIqKi8iK3Ise2V4dGVuZGVkOiEwLGdsb2JzdGFyOiEwfSksaW5jbHVkZTppfSkpfXQmJih0PVZvKHQpLHQuZW5kc1dpdGgoIi8iKXx8KHQ9dCsiLyIpLHRoaXMuZm9sZGVyVXJpPXQpfWNhdGNoe3RoaXMuZ2xvYldyYXBwZXJzLmxlbmd0aD0wLHRoaXMudXJpcz1bXX19bWF0Y2hlc1BhdHRlcm4oZSl7aWYodGhpcy5mb2xkZXJVcmkmJiFlLnN0YXJ0c1dpdGgodGhpcy5mb2xkZXJVcmkpKXJldHVybiExO2xldCB0PSExO2Zvcihjb25zdHtyZWdleHA6bixpbmNsdWRlOnJ9b2YgdGhpcy5nbG9iV3JhcHBlcnMpbi50ZXN0KGUpJiYodD1yKTtyZXR1cm4gdH1nZXRVUklzKCl7cmV0dXJuIHRoaXMudXJpc319LGIxPWNsYXNze2NvbnN0cnVjdG9yKGUsdCxuKXt0aGlzLnNlcnZpY2U9ZSx0aGlzLnVyaT10LHRoaXMuZGVwZW5kZW5jaWVzPW5ldyBTZXQsdGhpcy5hbmNob3JzPXZvaWQgMCxuJiYodGhpcy51bnJlc29sdmVkU2NoZW1hPXRoaXMuc2VydmljZS5wcm9taXNlLnJlc29sdmUobmV3IGVuKG4pKSl9Z2V0VW5yZXNvbHZlZFNjaGVtYSgpe3JldHVybiB0aGlzLnVucmVzb2x2ZWRTY2hlbWF8fCh0aGlzLnVucmVzb2x2ZWRTY2hlbWE9dGhpcy5zZXJ2aWNlLmxvYWRTY2hlbWEodGhpcy51cmkpKSx0aGlzLnVucmVzb2x2ZWRTY2hlbWF9Z2V0UmVzb2x2ZWRTY2hlbWEoKXtyZXR1cm4gdGhpcy5yZXNvbHZlZFNjaGVtYXx8KHRoaXMucmVzb2x2ZWRTY2hlbWE9dGhpcy5nZXRVbnJlc29sdmVkU2NoZW1hKCkudGhlbihlPT50aGlzLnNlcnZpY2UucmVzb2x2ZVNjaGVtYUNvbnRlbnQoZSx0aGlzKSkpLHRoaXMucmVzb2x2ZWRTY2hlbWF9Y2xlYXJTY2hlbWEoKXtjb25zdCBlPSEhdGhpcy51bnJlc29sdmVkU2NoZW1hO3JldHVybiB0aGlzLnJlc29sdmVkU2NoZW1hPXZvaWQgMCx0aGlzLnVucmVzb2x2ZWRTY2hlbWE9dm9pZCAwLHRoaXMuZGVwZW5kZW5jaWVzLmNsZWFyKCksdGhpcy5hbmNob3JzPXZvaWQgMCxlfX0sZW49Y2xhc3N7Y29uc3RydWN0b3IoZSx0PVtdKXt0aGlzLnNjaGVtYT1lLHRoaXMuZXJyb3JzPXR9fSxGbz1jbGFzc3tjb25zdHJ1Y3RvcihlLHQ9W10sbj1bXSxyKXt0aGlzLnNjaGVtYT1lLHRoaXMuZXJyb3JzPXQsdGhpcy53YXJuaW5ncz1uLHRoaXMuc2NoZW1hRHJhZnQ9cn1nZXRTZWN0aW9uKGUpe2NvbnN0IHQ9dGhpcy5nZXRTZWN0aW9uUmVjdXJzaXZlKGUsdGhpcy5zY2hlbWEpO2lmKHQpcmV0dXJuIHdlKHQpfWdldFNlY3Rpb25SZWN1cnNpdmUoZSx0KXtpZighdHx8dHlwZW9mIHQ9PSJib29sZWFuInx8ZS5sZW5ndGg9PT0wKXJldHVybiB0O2NvbnN0IG49ZS5zaGlmdCgpO2lmKHQucHJvcGVydGllcyYmdHlwZW9mIHQucHJvcGVydGllc1tuXSlyZXR1cm4gdGhpcy5nZXRTZWN0aW9uUmVjdXJzaXZlKGUsdC5wcm9wZXJ0aWVzW25dKTtpZih0LnBhdHRlcm5Qcm9wZXJ0aWVzKWZvcihjb25zdCByIG9mIE9iamVjdC5rZXlzKHQucGF0dGVyblByb3BlcnRpZXMpKXtjb25zdCBpPVJuKHIpO2lmKGkhPW51bGwmJmkudGVzdChuKSlyZXR1cm4gdGhpcy5nZXRTZWN0aW9uUmVjdXJzaXZlKGUsdC5wYXR0ZXJuUHJvcGVydGllc1tyXSl9ZWxzZXtpZih0eXBlb2YgdC5hZGRpdGlvbmFsUHJvcGVydGllcz09Im9iamVjdCIpcmV0dXJuIHRoaXMuZ2V0U2VjdGlvblJlY3Vyc2l2ZShlLHQuYWRkaXRpb25hbFByb3BlcnRpZXMpO2lmKG4ubWF0Y2goIlswLTldKyIpKXtpZihBcnJheS5pc0FycmF5KHQuaXRlbXMpKXtjb25zdCByPXBhcnNlSW50KG4sMTApO2lmKCFpc05hTihyKSYmdC5pdGVtc1tyXSlyZXR1cm4gdGhpcy5nZXRTZWN0aW9uUmVjdXJzaXZlKGUsdC5pdGVtc1tyXSl9ZWxzZSBpZih0Lml0ZW1zKXJldHVybiB0aGlzLmdldFNlY3Rpb25SZWN1cnNpdmUoZSx0Lml0ZW1zKX19fX0sdjE9Y2xhc3N7Y29uc3RydWN0b3IoZSx0LG4pe3RoaXMuY29udGV4dFNlcnZpY2U9dCx0aGlzLnJlcXVlc3RTZXJ2aWNlPWUsdGhpcy5wcm9taXNlQ29uc3RydWN0b3I9bnx8UHJvbWlzZSx0aGlzLmNhbGxPbkRpc3Bvc2U9W10sdGhpcy5jb250cmlidXRpb25TY2hlbWFzPXt9LHRoaXMuY29udHJpYnV0aW9uQXNzb2NpYXRpb25zPVtdLHRoaXMuc2NoZW1hc0J5SWQ9e30sdGhpcy5maWxlUGF0dGVybkFzc29jaWF0aW9ucz1bXSx0aGlzLnJlZ2lzdGVyZWRTY2hlbWFzSWRzPXt9fWdldFJlZ2lzdGVyZWRTY2hlbWFJZHMoZSl7cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMucmVnaXN0ZXJlZFNjaGVtYXNJZHMpLmZpbHRlcih0PT57Y29uc3Qgbj1UdC5wYXJzZSh0KS5zY2hlbWU7cmV0dXJuIG4hPT0ic2NoZW1hc2VydmljZSImJighZXx8ZShuKSl9KX1nZXQgcHJvbWlzZSgpe3JldHVybiB0aGlzLnByb21pc2VDb25zdHJ1Y3Rvcn1kaXNwb3NlKCl7Zm9yKDt0aGlzLmNhbGxPbkRpc3Bvc2UubGVuZ3RoPjA7KXRoaXMuY2FsbE9uRGlzcG9zZS5wb3AoKSgpfW9uUmVzb3VyY2VDaGFuZ2UoZSl7dGhpcy5jYWNoZWRTY2hlbWFGb3JSZXNvdXJjZT12b2lkIDA7bGV0IHQ9ITE7ZT1udChlKTtjb25zdCBuPVtlXSxyPU9iamVjdC5rZXlzKHRoaXMuc2NoZW1hc0J5SWQpLm1hcChpPT50aGlzLnNjaGVtYXNCeUlkW2ldKTtmb3IoO24ubGVuZ3RoOyl7Y29uc3QgaT1uLnBvcCgpO2ZvcihsZXQgcz0wO3M8ci5sZW5ndGg7cysrKXtjb25zdCBhPXJbc107YSYmKGEudXJpPT09aXx8YS5kZXBlbmRlbmNpZXMuaGFzKGkpKSYmKGEudXJpIT09aSYmbi5wdXNoKGEudXJpKSxhLmNsZWFyU2NoZW1hKCkmJih0PSEwKSxyW3NdPXZvaWQgMCl9fXJldHVybiB0fXNldFNjaGVtYUNvbnRyaWJ1dGlvbnMoZSl7aWYoZS5zY2hlbWFzKXtjb25zdCB0PWUuc2NoZW1hcztmb3IoY29uc3QgbiBpbiB0KXtjb25zdCByPW50KG4pO3RoaXMuY29udHJpYnV0aW9uU2NoZW1hc1tyXT10aGlzLmFkZFNjaGVtYUhhbmRsZShyLHRbbl0pfX1pZihBcnJheS5pc0FycmF5KGUuc2NoZW1hQXNzb2NpYXRpb25zKSl7Y29uc3QgdD1lLnNjaGVtYUFzc29jaWF0aW9ucztmb3IobGV0IG4gb2YgdCl7Y29uc3Qgcj1uLnVyaXMubWFwKG50KSxpPXRoaXMuYWRkRmlsZVBhdHRlcm5Bc3NvY2lhdGlvbihuLnBhdHRlcm4sbi5mb2xkZXJVcmkscik7dGhpcy5jb250cmlidXRpb25Bc3NvY2lhdGlvbnMucHVzaChpKX19fWFkZFNjaGVtYUhhbmRsZShlLHQpe2NvbnN0IG49bmV3IGIxKHRoaXMsZSx0KTtyZXR1cm4gdGhpcy5zY2hlbWFzQnlJZFtlXT1uLG59Z2V0T3JBZGRTY2hlbWFIYW5kbGUoZSx0KXtyZXR1cm4gdGhpcy5zY2hlbWFzQnlJZFtlXXx8dGhpcy5hZGRTY2hlbWFIYW5kbGUoZSx0KX1hZGRGaWxlUGF0dGVybkFzc29jaWF0aW9uKGUsdCxuKXtjb25zdCByPW5ldyBwMShlLHQsbik7cmV0dXJuIHRoaXMuZmlsZVBhdHRlcm5Bc3NvY2lhdGlvbnMucHVzaChyKSxyfXJlZ2lzdGVyRXh0ZXJuYWxTY2hlbWEoZSl7Y29uc3QgdD1udChlLnVyaSk7cmV0dXJuIHRoaXMucmVnaXN0ZXJlZFNjaGVtYXNJZHNbdF09ITAsdGhpcy5jYWNoZWRTY2hlbWFGb3JSZXNvdXJjZT12b2lkIDAsZS5maWxlTWF0Y2gmJmUuZmlsZU1hdGNoLmxlbmd0aCYmdGhpcy5hZGRGaWxlUGF0dGVybkFzc29jaWF0aW9uKGUuZmlsZU1hdGNoLGUuZm9sZGVyVXJpLFt0XSksZS5zY2hlbWE/dGhpcy5hZGRTY2hlbWFIYW5kbGUodCxlLnNjaGVtYSk6dGhpcy5nZXRPckFkZFNjaGVtYUhhbmRsZSh0KX1jbGVhckV4dGVybmFsU2NoZW1hcygpe3RoaXMuc2NoZW1hc0J5SWQ9e30sdGhpcy5maWxlUGF0dGVybkFzc29jaWF0aW9ucz1bXSx0aGlzLnJlZ2lzdGVyZWRTY2hlbWFzSWRzPXt9LHRoaXMuY2FjaGVkU2NoZW1hRm9yUmVzb3VyY2U9dm9pZCAwO2Zvcihjb25zdCBlIGluIHRoaXMuY29udHJpYnV0aW9uU2NoZW1hcyl0aGlzLnNjaGVtYXNCeUlkW2VdPXRoaXMuY29udHJpYnV0aW9uU2NoZW1hc1tlXSx0aGlzLnJlZ2lzdGVyZWRTY2hlbWFzSWRzW2VdPSEwO2Zvcihjb25zdCBlIG9mIHRoaXMuY29udHJpYnV0aW9uQXNzb2NpYXRpb25zKXRoaXMuZmlsZVBhdHRlcm5Bc3NvY2lhdGlvbnMucHVzaChlKX1nZXRSZXNvbHZlZFNjaGVtYShlKXtjb25zdCB0PW50KGUpLG49dGhpcy5zY2hlbWFzQnlJZFt0XTtyZXR1cm4gbj9uLmdldFJlc29sdmVkU2NoZW1hKCk6dGhpcy5wcm9taXNlLnJlc29sdmUodm9pZCAwKX1sb2FkU2NoZW1hKGUpe2lmKCF0aGlzLnJlcXVlc3RTZXJ2aWNlKXtjb25zdCB0PUUoIlVuYWJsZSB0byBsb2FkIHNjaGVtYSBmcm9tICd7MH0nLiBObyBzY2hlbWEgcmVxdWVzdCBzZXJ2aWNlIGF2YWlsYWJsZSIsdG4oZSkpO3JldHVybiB0aGlzLnByb21pc2UucmVzb2x2ZShuZXcgZW4oe30sW3RdKSl9cmV0dXJuIGUuc3RhcnRzV2l0aCgiaHR0cDovL2pzb24tc2NoZW1hLm9yZy8iKSYmKGU9Imh0dHBzIitlLnN1YnN0cmluZyg0KSksdGhpcy5yZXF1ZXN0U2VydmljZShlKS50aGVuKHQ9PntpZighdCl7Y29uc3Qgcz1FKCJVbmFibGUgdG8gbG9hZCBzY2hlbWEgZnJvbSAnezB9JzogTm8gY29udGVudC4iLHRuKGUpKTtyZXR1cm4gbmV3IGVuKHt9LFtzXSl9Y29uc3Qgbj1bXTt0LmNoYXJDb2RlQXQoMCk9PT02NTI3OSYmKG4ucHVzaChFKCJQcm9ibGVtIHJlYWRpbmcgY29udGVudCBmcm9tICd7MH0nOiBVVEYtOCB3aXRoIEJPTSBkZXRlY3RlZCwgb25seSBVVEYgOCBpcyBhbGxvd2VkLiIsdG4oZSkpKSx0PXQudHJpbVN0YXJ0KCkpO2xldCByPXt9O2NvbnN0IGk9W107cmV0dXJuIHI9VmModCxpKSxpLmxlbmd0aCYmbi5wdXNoKEUoIlVuYWJsZSB0byBwYXJzZSBjb250ZW50IGZyb20gJ3swfSc6IFBhcnNlIGVycm9yIGF0IG9mZnNldCB7MX0uIix0bihlKSxpWzBdLm9mZnNldCkpLG5ldyBlbihyLG4pfSx0PT57bGV0IG49dC50b1N0cmluZygpO2NvbnN0IHI9dC50b1N0cmluZygpLnNwbGl0KCJFcnJvcjogIik7cmV0dXJuIHIubGVuZ3RoPjEmJihuPXJbMV0pLFF0KG4sIi4iKSYmKG49bi5zdWJzdHIoMCxuLmxlbmd0aC0xKSksbmV3IGVuKHt9LFtFKCJVbmFibGUgdG8gbG9hZCBzY2hlbWEgZnJvbSAnezB9JzogezF9LiIsdG4oZSksbildKX0pfXJlc29sdmVTY2hlbWFDb250ZW50KGUsdCl7Y29uc3Qgbj1lLmVycm9ycy5zbGljZSgwKSxyPWUuc2NoZW1hO2xldCBpPXIuJHNjaGVtYT9udChyLiRzY2hlbWEpOnZvaWQgMDtpZihpPT09Imh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDMvc2NoZW1hIilyZXR1cm4gdGhpcy5wcm9taXNlLnJlc29sdmUobmV3IEZvKHt9LFtFKCJEcmFmdC0wMyBzY2hlbWFzIGFyZSBub3Qgc3VwcG9ydGVkLiIpXSxbXSxpKSk7bGV0IHM9bmV3IFNldDtjb25zdCBhPXRoaXMuY29udGV4dFNlcnZpY2UsbD0oZyxwKT0+e3A9ZGVjb2RlVVJJQ29tcG9uZW50KHApO2xldCB4PWc7cmV0dXJuIHBbMF09PT0iLyImJihwPXAuc3Vic3RyaW5nKDEpKSxwLnNwbGl0KCIvIikuc29tZSh3PT4odz13LnJlcGxhY2UoL34xL2csIi8iKS5yZXBsYWNlKC9+MC9nLCJ+IikseD14W3ddLCF4KSkseH0sbz0oZyxwLHgpPT4ocC5hbmNob3JzfHwocC5hbmNob3JzPW0oZykpLHAuYW5jaG9ycy5nZXQoeCkpLHU9KGcscCk9Pntmb3IoY29uc3QgeCBpbiBwKXAuaGFzT3duUHJvcGVydHkoeCkmJnghPT0iaWQiJiZ4IT09IiRpZCImJihnW3hdPXBbeF0pfSxoPShnLHAseCx3KT0+e2xldCBMO3c9PT12b2lkIDB8fHcubGVuZ3RoPT09MD9MPXA6dy5jaGFyQXQoMCk9PT0iLyI/TD1sKHAsdyk6TD1vKHAseCx3KSxMP3UoZyxMKTpuLnB1c2goRSgiJHJlZiAnezB9JyBpbiAnezF9JyBjYW4gbm90IGJlIHJlc29sdmVkLiIsd3x8IiIseC51cmkpKX0sZj0oZyxwLHgsdyk9PnthJiYhL15bQS1aYS16XVtBLVphLXowLTkrXC0uK10qOlwvXC8uKi8udGVzdChwKSYmKHA9YS5yZXNvbHZlUmVsYXRpdmVQYXRoKHAsdy51cmkpKSxwPW50KHApO2NvbnN0IEw9dGhpcy5nZXRPckFkZFNjaGVtYUhhbmRsZShwKTtyZXR1cm4gTC5nZXRVbnJlc29sdmVkU2NoZW1hKCkudGhlbih2PT57aWYody5kZXBlbmRlbmNpZXMuYWRkKHApLHYuZXJyb3JzLmxlbmd0aCl7Y29uc3QgeT14P3ArIiMiK3g6cDtuLnB1c2goRSgiUHJvYmxlbXMgbG9hZGluZyByZWZlcmVuY2UgJ3swfSc6IHsxfSIseSx2LmVycm9yc1swXSkpfXJldHVybiBoKGcsdi5zY2hlbWEsTCx4KSxkKGcsdi5zY2hlbWEsTCl9KX0sZD0oZyxwLHgpPT57Y29uc3Qgdz1bXTtyZXR1cm4gdGhpcy50cmF2ZXJzZU5vZGVzKGcsTD0+e2NvbnN0IHY9bmV3IFNldDtmb3IoO0wuJHJlZjspe2NvbnN0IHk9TC4kcmVmLGI9eS5zcGxpdCgiIyIsMik7aWYoZGVsZXRlIEwuJHJlZixiWzBdLmxlbmd0aD4wKXt3LnB1c2goZihMLGJbMF0sYlsxXSx4KSk7cmV0dXJufWVsc2UgaWYoIXYuaGFzKHkpKXtjb25zdCBfPWJbMV07aChMLHAseCxfKSx2LmFkZCh5KX19TC4kcmVjdXJzaXZlUmVmJiZzLmFkZCgiJHJlY3Vyc2l2ZVJlZiIpLEwuJGR5bmFtaWNSZWYmJnMuYWRkKCIkZHluYW1pY1JlZiIpfSksdGhpcy5wcm9taXNlLmFsbCh3KX0sbT1nPT57Y29uc3QgcD1uZXcgTWFwO3JldHVybiB0aGlzLnRyYXZlcnNlTm9kZXMoZyx4PT57Y29uc3Qgdz14LiRpZHx8eC5pZCxMPU5hKHcpJiZ3LmNoYXJBdCgwKT09PSIjIj93LnN1YnN0cmluZygxKTp4LiRhbmNob3I7TCYmKHAuaGFzKEwpP24ucHVzaChFKCJEdXBsaWNhdGUgYW5jaG9yIGRlY2xhcmF0aW9uOiAnezB9JyIsTCkpOnAuc2V0KEwseCkpLHguJHJlY3Vyc2l2ZUFuY2hvciYmcy5hZGQoIiRyZWN1cnNpdmVBbmNob3IiKSx4LiRkeW5hbWljQW5jaG9yJiZzLmFkZCgiJGR5bmFtaWNBbmNob3IiKX0pLHB9O3JldHVybiBkKHIscix0KS50aGVuKGc9PntsZXQgcD1bXTtyZXR1cm4gcy5zaXplJiZwLnB1c2goRSgiVGhlIHNjaGVtYSB1c2VzIG1ldGEtc2NoZW1hIGZlYXR1cmVzICh7MH0pIHRoYXQgYXJlIG5vdCB5ZXQgc3VwcG9ydGVkIGJ5IHRoZSB2YWxpZGF0b3IuIixBcnJheS5mcm9tKHMua2V5cygpKS5qb2luKCIsICIpKSksbmV3IEZvKHIsbixwLGkpfSl9dHJhdmVyc2VOb2RlcyhlLHQpe2lmKCFlfHx0eXBlb2YgZSE9Im9iamVjdCIpcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtjb25zdCBuPW5ldyBTZXQscj0oLi4udSk9Pntmb3IoY29uc3QgaCBvZiB1KWV0KGgpJiZsLnB1c2goaCl9LGk9KC4uLnUpPT57Zm9yKGNvbnN0IGggb2YgdSlpZihldChoKSlmb3IoY29uc3QgZiBpbiBoKXtjb25zdCBtPWhbZl07ZXQobSkmJmwucHVzaChtKX19LHM9KC4uLnUpPT57Zm9yKGNvbnN0IGggb2YgdSlpZihBcnJheS5pc0FycmF5KGgpKWZvcihjb25zdCBmIG9mIGgpZXQoZikmJmwucHVzaChmKX0sYT11PT57aWYoQXJyYXkuaXNBcnJheSh1KSlmb3IoY29uc3QgaCBvZiB1KWV0KGgpJiZsLnB1c2goaCk7ZWxzZSBldCh1KSYmbC5wdXNoKHUpfSxsPVtlXTtsZXQgbz1sLnBvcCgpO2Zvcig7bzspbi5oYXMobyl8fChuLmFkZChvKSx0KG8pLHIoby5hZGRpdGlvbmFsSXRlbXMsby5hZGRpdGlvbmFsUHJvcGVydGllcyxvLm5vdCxvLmNvbnRhaW5zLG8ucHJvcGVydHlOYW1lcyxvLmlmLG8udGhlbixvLmVsc2Usby51bmV2YWx1YXRlZEl0ZW1zLG8udW5ldmFsdWF0ZWRQcm9wZXJ0aWVzKSxpKG8uZGVmaW5pdGlvbnMsby4kZGVmcyxvLnByb3BlcnRpZXMsby5wYXR0ZXJuUHJvcGVydGllcyxvLmRlcGVuZGVuY2llcyxvLmRlcGVuZGVudFNjaGVtYXMpLHMoby5hbnlPZixvLmFsbE9mLG8ub25lT2Ysby5wcmVmaXhJdGVtcyksYShvLml0ZW1zKSksbz1sLnBvcCgpfWdldFNjaGVtYUZyb21Qcm9wZXJ0eShlLHQpe3ZhciBuLHI7aWYoKChuPXQucm9vdCk9PW51bGw/dm9pZCAwOm4udHlwZSk9PT0ib2JqZWN0Iil7Zm9yKGNvbnN0IGkgb2YgdC5yb290LnByb3BlcnRpZXMpaWYoaS5rZXlOb2RlLnZhbHVlPT09IiRzY2hlbWEiJiYoKHI9aS52YWx1ZU5vZGUpPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09InN0cmluZyIpe2xldCBzPWkudmFsdWVOb2RlLnZhbHVlO3JldHVybiB0aGlzLmNvbnRleHRTZXJ2aWNlJiYhL15cd1tcd1xkKy4tXSo6Ly50ZXN0KHMpJiYocz10aGlzLmNvbnRleHRTZXJ2aWNlLnJlc29sdmVSZWxhdGl2ZVBhdGgocyxlKSksc319fWdldEFzc29jaWF0ZWRTY2hlbWFzKGUpe2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKSxuPVtdLHI9Vm8oZSk7Zm9yKGNvbnN0IGkgb2YgdGhpcy5maWxlUGF0dGVybkFzc29jaWF0aW9ucylpZihpLm1hdGNoZXNQYXR0ZXJuKHIpKWZvcihjb25zdCBzIG9mIGkuZ2V0VVJJcygpKXRbc118fChuLnB1c2gocyksdFtzXT0hMCk7cmV0dXJuIG59Z2V0U2NoZW1hVVJJc0ZvclJlc291cmNlKGUsdCl7bGV0IG49dCYmdGhpcy5nZXRTY2hlbWFGcm9tUHJvcGVydHkoZSx0KTtyZXR1cm4gbj9bbl06dGhpcy5nZXRBc3NvY2lhdGVkU2NoZW1hcyhlKX1nZXRTY2hlbWFGb3JSZXNvdXJjZShlLHQpe2lmKHQpe2xldCBpPXRoaXMuZ2V0U2NoZW1hRnJvbVByb3BlcnR5KGUsdCk7aWYoaSl7Y29uc3Qgcz1udChpKTtyZXR1cm4gdGhpcy5nZXRPckFkZFNjaGVtYUhhbmRsZShzKS5nZXRSZXNvbHZlZFNjaGVtYSgpfX1pZih0aGlzLmNhY2hlZFNjaGVtYUZvclJlc291cmNlJiZ0aGlzLmNhY2hlZFNjaGVtYUZvclJlc291cmNlLnJlc291cmNlPT09ZSlyZXR1cm4gdGhpcy5jYWNoZWRTY2hlbWFGb3JSZXNvdXJjZS5yZXNvbHZlZFNjaGVtYTtjb25zdCBuPXRoaXMuZ2V0QXNzb2NpYXRlZFNjaGVtYXMoZSkscj1uLmxlbmd0aD4wP3RoaXMuY3JlYXRlQ29tYmluZWRTY2hlbWEoZSxuKS5nZXRSZXNvbHZlZFNjaGVtYSgpOnRoaXMucHJvbWlzZS5yZXNvbHZlKHZvaWQgMCk7cmV0dXJuIHRoaXMuY2FjaGVkU2NoZW1hRm9yUmVzb3VyY2U9e3Jlc291cmNlOmUscmVzb2x2ZWRTY2hlbWE6cn0scn1jcmVhdGVDb21iaW5lZFNjaGVtYShlLHQpe2lmKHQubGVuZ3RoPT09MSlyZXR1cm4gdGhpcy5nZXRPckFkZFNjaGVtYUhhbmRsZSh0WzBdKTt7Y29uc3Qgbj0ic2NoZW1hc2VydmljZTovL2NvbWJpbmVkU2NoZW1hLyIrZW5jb2RlVVJJQ29tcG9uZW50KGUpLHI9e2FsbE9mOnQubWFwKGk9Pih7JHJlZjppfSkpfTtyZXR1cm4gdGhpcy5hZGRTY2hlbWFIYW5kbGUobixyKX19Z2V0TWF0Y2hpbmdTY2hlbWFzKGUsdCxuKXtpZihuKXtjb25zdCByPW4uaWR8fCJzY2hlbWFzZXJ2aWNlOi8vdW50aXRsZWQvbWF0Y2hpbmdTY2hlbWFzLyIreDErKztyZXR1cm4gdGhpcy5hZGRTY2hlbWFIYW5kbGUocixuKS5nZXRSZXNvbHZlZFNjaGVtYSgpLnRoZW4ocz0+dC5nZXRNYXRjaGluZ1NjaGVtYXMocy5zY2hlbWEpLmZpbHRlcihhPT4hYS5pbnZlcnRlZCkpfXJldHVybiB0aGlzLmdldFNjaGVtYUZvclJlc291cmNlKGUudXJpLHQpLnRoZW4ocj0+cj90LmdldE1hdGNoaW5nU2NoZW1hcyhyLnNjaGVtYSkuZmlsdGVyKGk9PiFpLmludmVydGVkKTpbXSl9fSx4MT0wO2Z1bmN0aW9uIG50KGUpe3RyeXtyZXR1cm4gVHQucGFyc2UoZSkudG9TdHJpbmcoITApfWNhdGNoe3JldHVybiBlfX1mdW5jdGlvbiBWbyhlKXt0cnl7cmV0dXJuIFR0LnBhcnNlKGUpLndpdGgoe2ZyYWdtZW50Om51bGwscXVlcnk6bnVsbH0pLnRvU3RyaW5nKCEwKX1jYXRjaHtyZXR1cm4gZX19ZnVuY3Rpb24gdG4oZSl7dHJ5e2NvbnN0IHQ9VHQucGFyc2UoZSk7aWYodC5zY2hlbWU9PT0iZmlsZSIpcmV0dXJuIHQuZnNQYXRofWNhdGNoe31yZXR1cm4gZX1mdW5jdGlvbiB5MShlLHQpe2NvbnN0IG49W10scj1bXSxpPVtdO2xldCBzPS0xO2NvbnN0IGE9YXQoZS5nZXRUZXh0KCksITEpO2xldCBsPWEuc2NhbigpO2Z1bmN0aW9uIG8oZyl7bi5wdXNoKGcpLHIucHVzaChpLmxlbmd0aCl9Zm9yKDtsIT09MTc7KXtzd2l0Y2gobCl7Y2FzZSAxOmNhc2UgMzp7Y29uc3QgZz1lLnBvc2l0aW9uQXQoYS5nZXRUb2tlbk9mZnNldCgpKS5saW5lLHA9e3N0YXJ0TGluZTpnLGVuZExpbmU6ZyxraW5kOmw9PT0xPyJvYmplY3QiOiJhcnJheSJ9O2kucHVzaChwKTticmVha31jYXNlIDI6Y2FzZSA0Ontjb25zdCBnPWw9PT0yPyJvYmplY3QiOiJhcnJheSI7aWYoaS5sZW5ndGg+MCYmaVtpLmxlbmd0aC0xXS5raW5kPT09Zyl7Y29uc3QgcD1pLnBvcCgpLHg9ZS5wb3NpdGlvbkF0KGEuZ2V0VG9rZW5PZmZzZXQoKSkubGluZTtwJiZ4PnAuc3RhcnRMaW5lKzEmJnMhPT1wLnN0YXJ0TGluZSYmKHAuZW5kTGluZT14LTEsbyhwKSxzPXAuc3RhcnRMaW5lKX1icmVha31jYXNlIDEzOntjb25zdCBnPWUucG9zaXRpb25BdChhLmdldFRva2VuT2Zmc2V0KCkpLmxpbmUscD1lLnBvc2l0aW9uQXQoYS5nZXRUb2tlbk9mZnNldCgpK2EuZ2V0VG9rZW5MZW5ndGgoKSkubGluZTthLmdldFRva2VuRXJyb3IoKT09PTEmJmcrMTxlLmxpbmVDb3VudD9hLnNldFBvc2l0aW9uKGUub2Zmc2V0QXQoWi5jcmVhdGUoZysxLDApKSk6ZzxwJiYobyh7c3RhcnRMaW5lOmcsZW5kTGluZTpwLGtpbmQ6WXQuQ29tbWVudH0pLHM9Zyk7YnJlYWt9Y2FzZSAxMjp7Y29uc3QgcD1lLmdldFRleHQoKS5zdWJzdHIoYS5nZXRUb2tlbk9mZnNldCgpLGEuZ2V0VG9rZW5MZW5ndGgoKSkubWF0Y2goL15cL1wvXHMqIyhyZWdpb25cYil8KGVuZHJlZ2lvblxiKS8pO2lmKHApe2NvbnN0IHg9ZS5wb3NpdGlvbkF0KGEuZ2V0VG9rZW5PZmZzZXQoKSkubGluZTtpZihwWzFdKXtjb25zdCB3PXtzdGFydExpbmU6eCxlbmRMaW5lOngsa2luZDpZdC5SZWdpb259O2kucHVzaCh3KX1lbHNle2xldCB3PWkubGVuZ3RoLTE7Zm9yKDt3Pj0wJiZpW3ddLmtpbmQhPT1ZdC5SZWdpb247KXctLTtpZih3Pj0wKXtjb25zdCBMPWlbd107aS5sZW5ndGg9dyx4Pkwuc3RhcnRMaW5lJiZzIT09TC5zdGFydExpbmUmJihMLmVuZExpbmU9eCxvKEwpLHM9TC5zdGFydExpbmUpfX19YnJlYWt9fWw9YS5zY2FuKCl9Y29uc3QgdT10JiZ0LnJhbmdlTGltaXQ7aWYodHlwZW9mIHUhPSJudW1iZXIifHxuLmxlbmd0aDw9dSlyZXR1cm4gbjt0JiZ0Lm9uUmFuZ2VMaW1pdEV4Y2VlZGVkJiZ0Lm9uUmFuZ2VMaW1pdEV4Y2VlZGVkKGUudXJpKTtjb25zdCBoPVtdO2ZvcihsZXQgZyBvZiByKWc8MzAmJihoW2ddPShoW2ddfHwwKSsxKTtsZXQgZj0wLGQ9MDtmb3IobGV0IGc9MDtnPGgubGVuZ3RoO2crKyl7Y29uc3QgcD1oW2ddO2lmKHApe2lmKHArZj51KXtkPWc7YnJlYWt9Zis9cH19Y29uc3QgbT1bXTtmb3IobGV0IGc9MDtnPG4ubGVuZ3RoO2crKyl7Y29uc3QgcD1yW2ddO3R5cGVvZiBwPT0ibnVtYmVyIiYmKHA8ZHx8cD09PWQmJmYrKzx1KSYmbS5wdXNoKG5bZ10pfXJldHVybiBtfWZ1bmN0aW9uIHcxKGUsdCxuKXtmdW5jdGlvbiByKGwpe2xldCBvPWUub2Zmc2V0QXQobCksdT1uLmdldE5vZGVGcm9tT2Zmc2V0KG8sITApO2NvbnN0IGg9W107Zm9yKDt1Oyl7c3dpdGNoKHUudHlwZSl7Y2FzZSJzdHJpbmciOmNhc2Uib2JqZWN0IjpjYXNlImFycmF5Ijpjb25zdCBkPXUub2Zmc2V0KzEsbT11Lm9mZnNldCt1Lmxlbmd0aC0xO2Q8bSYmbz49ZCYmbzw9bSYmaC5wdXNoKGkoZCxtKSksaC5wdXNoKGkodS5vZmZzZXQsdS5vZmZzZXQrdS5sZW5ndGgpKTticmVhaztjYXNlIm51bWJlciI6Y2FzZSJib29sZWFuIjpjYXNlIm51bGwiOmNhc2UicHJvcGVydHkiOmgucHVzaChpKHUub2Zmc2V0LHUub2Zmc2V0K3UubGVuZ3RoKSk7YnJlYWt9aWYodS50eXBlPT09InByb3BlcnR5Inx8dS5wYXJlbnQmJnUucGFyZW50LnR5cGU9PT0iYXJyYXkiKXtjb25zdCBkPWEodS5vZmZzZXQrdS5sZW5ndGgsNSk7ZCE9PS0xJiZoLnB1c2goaSh1Lm9mZnNldCxkKSl9dT11LnBhcmVudH1sZXQgZjtmb3IobGV0IGQ9aC5sZW5ndGgtMTtkPj0wO2QtLSlmPVRuLmNyZWF0ZShoW2RdLGYpO3JldHVybiBmfHwoZj1Ubi5jcmVhdGUocS5jcmVhdGUobCxsKSkpLGZ9ZnVuY3Rpb24gaShsLG8pe3JldHVybiBxLmNyZWF0ZShlLnBvc2l0aW9uQXQobCksZS5wb3NpdGlvbkF0KG8pKX1jb25zdCBzPWF0KGUuZ2V0VGV4dCgpLCEwKTtmdW5jdGlvbiBhKGwsbyl7cmV0dXJuIHMuc2V0UG9zaXRpb24obCkscy5zY2FuKCk9PT1vP3MuZ2V0VG9rZW5PZmZzZXQoKStzLmdldFRva2VuTGVuZ3RoKCk6LTF9cmV0dXJuIHQubWFwKHIpfWZ1bmN0aW9uIGVpKGUsdCxuKXtsZXQgcjtpZihuKXtjb25zdCBzPWUub2Zmc2V0QXQobi5zdGFydCksYT1lLm9mZnNldEF0KG4uZW5kKS1zO3I9e29mZnNldDpzLGxlbmd0aDphfX1jb25zdCBpPXt0YWJTaXplOnQ/dC50YWJTaXplOjQsaW5zZXJ0U3BhY2VzOih0PT1udWxsP3ZvaWQgMDp0Lmluc2VydFNwYWNlcyk9PT0hMCxpbnNlcnRGaW5hbE5ld2xpbmU6KHQ9PW51bGw/dm9pZCAwOnQuaW5zZXJ0RmluYWxOZXdsaW5lKT09PSEwLGVvbDpgCmAsa2VlcExpbmVzOih0PT1udWxsP3ZvaWQgMDp0LmtlZXBMaW5lcyk9PT0hMH07cmV0dXJuIFVjKGUuZ2V0VGV4dCgpLHIsaSkubWFwKHM9PkRlLnJlcGxhY2UocS5jcmVhdGUoZS5wb3NpdGlvbkF0KHMub2Zmc2V0KSxlLnBvc2l0aW9uQXQocy5vZmZzZXQrcy5sZW5ndGgpKSxzLmNvbnRlbnQpKX12YXIgc2U7KGZ1bmN0aW9uKGUpe2VbZS5PYmplY3Q9MF09Ik9iamVjdCIsZVtlLkFycmF5PTFdPSJBcnJheSJ9KShzZXx8KHNlPXt9KSk7dmFyIEZuPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5wcm9wZXJ0eU5hbWU9ZT8/IiIsdGhpcy5iZWdpbm5pbmdMaW5lTnVtYmVyPXQsdGhpcy5jaGlsZHJlblByb3BlcnRpZXM9W10sdGhpcy5sYXN0UHJvcGVydHk9ITEsdGhpcy5ub0tleU5hbWU9ITF9YWRkQ2hpbGRQcm9wZXJ0eShlKXtpZihlLnBhcmVudD10aGlzLHRoaXMuY2hpbGRyZW5Qcm9wZXJ0aWVzLmxlbmd0aD4wKXtsZXQgdD0wO2Uubm9LZXlOYW1lP3Q9dGhpcy5jaGlsZHJlblByb3BlcnRpZXMubGVuZ3RoOnQ9TDEodGhpcy5jaGlsZHJlblByb3BlcnRpZXMsZSxfMSksdDwwJiYodD10Ki0xLTEpLHRoaXMuY2hpbGRyZW5Qcm9wZXJ0aWVzLnNwbGljZSh0LDAsZSl9ZWxzZSB0aGlzLmNoaWxkcmVuUHJvcGVydGllcy5wdXNoKGUpO3JldHVybiBlfX07ZnVuY3Rpb24gXzEoZSx0KXtjb25zdCBuPWUucHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKCkscj10LnByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpO3JldHVybiBuPHI/LTE6bj5yPzE6MH1mdW5jdGlvbiBMMShlLHQsbil7Y29uc3Qgcj10LnByb3BlcnR5TmFtZS50b0xvd2VyQ2FzZSgpLGk9ZVswXS5wcm9wZXJ0eU5hbWUudG9Mb3dlckNhc2UoKSxzPWVbZS5sZW5ndGgtMV0ucHJvcGVydHlOYW1lLnRvTG93ZXJDYXNlKCk7aWYocjxpKXJldHVybiAwO2lmKHI+cylyZXR1cm4gZS5sZW5ndGg7bGV0IGE9MCxsPWUubGVuZ3RoLTE7Zm9yKDthPD1sOyl7bGV0IG89bCthPj4xLHU9bih0LGVbb10pO2lmKHU+MClhPW8rMTtlbHNlIGlmKHU8MClsPW8tMTtlbHNlIHJldHVybiBvfXJldHVybi1hLTF9ZnVuY3Rpb24gTjEoZSx0KXtjb25zdCBuPXsuLi50LGtlZXBMaW5lczohMX0scj1NZS5hcHBseUVkaXRzKGUsZWkoZSxuLHZvaWQgMCkpLGk9TWUuY3JlYXRlKCJ0ZXN0Oi8vdGVzdC5qc29uIiwianNvbiIsMCxyKSxzPVMxKGkpLGE9QTEoaSxzKSxsPWVpKGEsbix2b2lkIDApLG89TWUuYXBwbHlFZGl0cyhhLGwpO3JldHVybltEZS5yZXBsYWNlKHEuY3JlYXRlKFouY3JlYXRlKDAsMCksZS5wb3NpdGlvbkF0KGUuZ2V0VGV4dCgpLmxlbmd0aCkpLG8pXX1mdW5jdGlvbiBTMShlKXtjb25zdCB0PWUuZ2V0VGV4dCgpLG49YXQodCwhMSk7bGV0IHI9bmV3IEZuLGk9cixzPXIsYT1yLGwsbz0wLHU9MCxoLGYsZD0tMSxtPS0xLGc9MCxwPTAseD1bXSx3PSExLEw9ITE7Zm9yKDsobD1uLnNjYW4oKSkhPT0xNzspe2lmKHc9PT0hMCYmbCE9PTE0JiZsIT09MTUmJmwhPT0xMiYmbCE9PTEzJiZzLmVuZExpbmVOdW1iZXI9PT12b2lkIDApe2xldCB2PW4uZ2V0VG9rZW5TdGFydExpbmUoKTtmPT09Mnx8Zj09PTQ/YS5lbmRMaW5lTnVtYmVyPXYtMTpzLmVuZExpbmVOdW1iZXI9di0xLGc9dix3PSExfWlmKEw9PT0hMCYmbCE9PTE0JiZsIT09MTUmJmwhPT0xMiYmbCE9PTEzJiYoZz1uLmdldFRva2VuU3RhcnRMaW5lKCksTD0hMSksbi5nZXRUb2tlblN0YXJ0TGluZSgpIT09byl7Zm9yKGxldCB2PW87djxuLmdldFRva2VuU3RhcnRMaW5lKCk7disrKXtjb25zdCB5PWUuZ2V0VGV4dChxLmNyZWF0ZShaLmNyZWF0ZSh2LDApLFouY3JlYXRlKHYrMSwwKSkpLmxlbmd0aDt1PXUreX1vPW4uZ2V0VG9rZW5TdGFydExpbmUoKX1zd2l0Y2gobCl7Y2FzZSAxMDp7aWYoaD09PXZvaWQgMHx8aD09PTF8fGg9PT01JiZ4W3gubGVuZ3RoLTFdPT09c2UuT2JqZWN0KXtjb25zdCB2PW5ldyBGbihuLmdldFRva2VuVmFsdWUoKSxnKTthPXMscz1pLmFkZENoaWxkUHJvcGVydHkodil9YnJlYWt9Y2FzZSAzOntpZihyLmJlZ2lubmluZ0xpbmVOdW1iZXI9PT12b2lkIDAmJihyLmJlZ2lubmluZ0xpbmVOdW1iZXI9bi5nZXRUb2tlblN0YXJ0TGluZSgpKSx4W3gubGVuZ3RoLTFdPT09c2UuT2JqZWN0KWk9cztlbHNlIGlmKHhbeC5sZW5ndGgtMV09PT1zZS5BcnJheSl7Y29uc3Qgdj1uZXcgRm4obi5nZXRUb2tlblZhbHVlKCksZyk7di5ub0tleU5hbWU9ITAsYT1zLHM9aS5hZGRDaGlsZFByb3BlcnR5KHYpLGk9c314LnB1c2goc2UuQXJyYXkpLHMudHlwZT1zZS5BcnJheSxnPW4uZ2V0VG9rZW5TdGFydExpbmUoKSxnKys7YnJlYWt9Y2FzZSAxOntpZihyLmJlZ2lubmluZ0xpbmVOdW1iZXI9PT12b2lkIDApci5iZWdpbm5pbmdMaW5lTnVtYmVyPW4uZ2V0VG9rZW5TdGFydExpbmUoKTtlbHNlIGlmKHhbeC5sZW5ndGgtMV09PT1zZS5BcnJheSl7Y29uc3Qgdj1uZXcgRm4obi5nZXRUb2tlblZhbHVlKCksZyk7di5ub0tleU5hbWU9ITAsYT1zLHM9aS5hZGRDaGlsZFByb3BlcnR5KHYpfXMudHlwZT1zZS5PYmplY3QseC5wdXNoKHNlLk9iamVjdCksaT1zLGc9bi5nZXRUb2tlblN0YXJ0TGluZSgpLGcrKzticmVha31jYXNlIDQ6e3A9bi5nZXRUb2tlblN0YXJ0TGluZSgpLHgucG9wKCkscy5lbmRMaW5lTnVtYmVyPT09dm9pZCAwJiYoaD09PTJ8fGg9PT00KSYmKHMuZW5kTGluZU51bWJlcj1wLTEscy5sYXN0UHJvcGVydHk9ITAscy5saW5lV2hlcmVUb0FkZENvbW1hPWQscy5pbmRleFdoZXJlVG9BZGRDb21hPW0sYT1zLHM9cz9zLnBhcmVudDp2b2lkIDAsaT1zKSxyLmVuZExpbmVOdW1iZXI9cCxnPXArMTticmVha31jYXNlIDI6e3A9bi5nZXRUb2tlblN0YXJ0TGluZSgpLHgucG9wKCksaCE9PTEmJihzLmVuZExpbmVOdW1iZXI9PT12b2lkIDAmJihzLmVuZExpbmVOdW1iZXI9cC0xLHMubGFzdFByb3BlcnR5PSEwLHMubGluZVdoZXJlVG9BZGRDb21tYT1kLHMuaW5kZXhXaGVyZVRvQWRkQ29tYT1tKSxhPXMscz1zP3MucGFyZW50OnZvaWQgMCxpPXMpLHIuZW5kTGluZU51bWJlcj1uLmdldFRva2VuU3RhcnRMaW5lKCksZz1wKzE7YnJlYWt9Y2FzZSA1OntwPW4uZ2V0VG9rZW5TdGFydExpbmUoKSxzLmVuZExpbmVOdW1iZXI9PT12b2lkIDAmJih4W3gubGVuZ3RoLTFdPT09c2UuT2JqZWN0fHx4W3gubGVuZ3RoLTFdPT09c2UuQXJyYXkmJihoPT09Mnx8aD09PTQpKSYmKHMuZW5kTGluZU51bWJlcj1wLHMuY29tbWFJbmRleD1uLmdldFRva2VuT2Zmc2V0KCktdSxzLmNvbW1hTGluZT1wKSwoaD09PTJ8fGg9PT00KSYmKGE9cyxzPXM/cy5wYXJlbnQ6dm9pZCAwLGk9cyksZz1wKzE7YnJlYWt9Y2FzZSAxMzp7aD09PTUmJmQ9PT1uLmdldFRva2VuU3RhcnRMaW5lKCkmJih4W3gubGVuZ3RoLTFdPT09c2UuQXJyYXkmJihmPT09Mnx8Zj09PTQpfHx4W3gubGVuZ3RoLTFdPT09c2UuT2JqZWN0KSYmKHhbeC5sZW5ndGgtMV09PT1zZS5BcnJheSYmKGY9PT0yfHxmPT09NCl8fHhbeC5sZW5ndGgtMV09PT1zZS5PYmplY3QpJiYocy5lbmRMaW5lTnVtYmVyPXZvaWQgMCx3PSEwKSwoaD09PTF8fGg9PT0zKSYmZD09PW4uZ2V0VG9rZW5TdGFydExpbmUoKSYmKEw9ITApO2JyZWFrfX1sIT09MTQmJmwhPT0xMyYmbCE9PTEyJiZsIT09MTUmJihmPWgsaD1sLGQ9bi5nZXRUb2tlblN0YXJ0TGluZSgpLG09bi5nZXRUb2tlbk9mZnNldCgpK24uZ2V0VG9rZW5MZW5ndGgoKS11KX1yZXR1cm4gcn1mdW5jdGlvbiBBMShlLHQpe2lmKHQuY2hpbGRyZW5Qcm9wZXJ0aWVzLmxlbmd0aD09PTApcmV0dXJuIGU7Y29uc3Qgbj1NZS5jcmVhdGUoInRlc3Q6Ly90ZXN0Lmpzb24iLCJqc29uIiwwLGUuZ2V0VGV4dCgpKSxyPVtdO2ZvcihEbyhyLHQsdC5iZWdpbm5pbmdMaW5lTnVtYmVyKTtyLmxlbmd0aD4wOyl7Y29uc3QgaT1yLnNoaWZ0KCkscz1pLnByb3BlcnR5VHJlZUFycmF5O2xldCBhPWkuYmVnaW5uaW5nTGluZU51bWJlcjtmb3IobGV0IGw9MDtsPHMubGVuZ3RoO2wrKyl7Y29uc3Qgbz1zW2xdLHU9cS5jcmVhdGUoWi5jcmVhdGUoby5iZWdpbm5pbmdMaW5lTnVtYmVyLDApLFouY3JlYXRlKG8uZW5kTGluZU51bWJlcisxLDApKSxoPWUuZ2V0VGV4dCh1KSxmPU1lLmNyZWF0ZSgidGVzdDovL3Rlc3QuanNvbiIsImpzb24iLDAsaCk7aWYoby5sYXN0UHJvcGVydHk9PT0hMCYmbCE9PXMubGVuZ3RoLTEpe2NvbnN0IGc9by5saW5lV2hlcmVUb0FkZENvbW1hLW8uYmVnaW5uaW5nTGluZU51bWJlcixwPW8uaW5kZXhXaGVyZVRvQWRkQ29tYSx4PXtyYW5nZTpxLmNyZWF0ZShaLmNyZWF0ZShnLHApLFouY3JlYXRlKGcscCkpLHRleHQ6IiwifTtNZS51cGRhdGUoZixbeF0sMSl9ZWxzZSBpZihvLmxhc3RQcm9wZXJ0eT09PSExJiZsPT09cy5sZW5ndGgtMSl7Y29uc3QgZz1vLmNvbW1hSW5kZXgseD1vLmNvbW1hTGluZS1vLmJlZ2lubmluZ0xpbmVOdW1iZXIsdz17cmFuZ2U6cS5jcmVhdGUoWi5jcmVhdGUoeCxnKSxaLmNyZWF0ZSh4LGcrMSkpLHRleHQ6IiJ9O01lLnVwZGF0ZShmLFt3XSwxKX1jb25zdCBkPW8uZW5kTGluZU51bWJlci1vLmJlZ2lubmluZ0xpbmVOdW1iZXIrMSxtPXtyYW5nZTpxLmNyZWF0ZShaLmNyZWF0ZShhLDApLFouY3JlYXRlKGErZCwwKSksdGV4dDpmLmdldFRleHQoKX07TWUudXBkYXRlKG4sW21dLDEpLERvKHIsbyxhKSxhPWErZH19cmV0dXJuIG59ZnVuY3Rpb24gRG8oZSx0LG4pe2lmKHQuY2hpbGRyZW5Qcm9wZXJ0aWVzLmxlbmd0aCE9PTApaWYodC50eXBlPT09c2UuT2JqZWN0KXtsZXQgcj0xLzA7Zm9yKGNvbnN0IHMgb2YgdC5jaGlsZHJlblByb3BlcnRpZXMpcy5iZWdpbm5pbmdMaW5lTnVtYmVyPHImJihyPXMuYmVnaW5uaW5nTGluZU51bWJlcik7Y29uc3QgaT1yLXQuYmVnaW5uaW5nTGluZU51bWJlcjtuPW4raSxlLnB1c2gobmV3ICRvKG4sdC5jaGlsZHJlblByb3BlcnRpZXMpKX1lbHNlIHQudHlwZT09PXNlLkFycmF5JiZPbyhlLHQsbil9ZnVuY3Rpb24gT28oZSx0LG4pe2Zvcihjb25zdCByIG9mIHQuY2hpbGRyZW5Qcm9wZXJ0aWVzKXtpZihyLnR5cGU9PT1zZS5PYmplY3Qpe2xldCBpPTEvMDtmb3IoY29uc3QgYSBvZiByLmNoaWxkcmVuUHJvcGVydGllcylhLmJlZ2lubmluZ0xpbmVOdW1iZXI8aSYmKGk9YS5iZWdpbm5pbmdMaW5lTnVtYmVyKTtjb25zdCBzPWktci5iZWdpbm5pbmdMaW5lTnVtYmVyO2UucHVzaChuZXcgJG8obityLmJlZ2lubmluZ0xpbmVOdW1iZXItdC5iZWdpbm5pbmdMaW5lTnVtYmVyK3Msci5jaGlsZHJlblByb3BlcnRpZXMpKX1yLnR5cGU9PT1zZS5BcnJheSYmT28oZSxyLG4rci5iZWdpbm5pbmdMaW5lTnVtYmVyLXQuYmVnaW5uaW5nTGluZU51bWJlcil9fXZhciAkbz1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuYmVnaW5uaW5nTGluZU51bWJlcj1lLHRoaXMucHJvcGVydHlUcmVlQXJyYXk9dH19O2Z1bmN0aW9uIGsxKGUsdCl7Y29uc3Qgbj1bXTtyZXR1cm4gdC52aXNpdChyPT57dmFyIGk7aWYoci50eXBlPT09InByb3BlcnR5IiYmci5rZXlOb2RlLnZhbHVlPT09IiRyZWYiJiYoKGk9ci52YWx1ZU5vZGUpPT1udWxsP3ZvaWQgMDppLnR5cGUpPT09InN0cmluZyIpe2NvbnN0IHM9ci52YWx1ZU5vZGUudmFsdWUsYT1FMSh0LHMpO2lmKGEpe2NvbnN0IGw9ZS5wb3NpdGlvbkF0KGEub2Zmc2V0KTtuLnB1c2goe3RhcmdldDpgJHtlLnVyaX0jJHtsLmxpbmUrMX0sJHtsLmNoYXJhY3RlcisxfWAscmFuZ2U6UjEoZSxyLnZhbHVlTm9kZSl9KX19cmV0dXJuITB9KSxQcm9taXNlLnJlc29sdmUobil9ZnVuY3Rpb24gUjEoZSx0KXtyZXR1cm4gcS5jcmVhdGUoZS5wb3NpdGlvbkF0KHQub2Zmc2V0KzEpLGUucG9zaXRpb25BdCh0Lm9mZnNldCt0Lmxlbmd0aC0xKSl9ZnVuY3Rpb24gRTEoZSx0KXtjb25zdCBuPU0xKHQpO3JldHVybiBuP3RpKG4sZS5yb290KTpudWxsfWZ1bmN0aW9uIHRpKGUsdCl7aWYoIXQpcmV0dXJuIG51bGw7aWYoZS5sZW5ndGg9PT0wKXJldHVybiB0O2NvbnN0IG49ZS5zaGlmdCgpO2lmKHQmJnQudHlwZT09PSJvYmplY3QiKXtjb25zdCByPXQucHJvcGVydGllcy5maW5kKGk9Pmkua2V5Tm9kZS52YWx1ZT09PW4pO3JldHVybiByP3RpKGUsci52YWx1ZU5vZGUpOm51bGx9ZWxzZSBpZih0JiZ0LnR5cGU9PT0iYXJyYXkiJiZuLm1hdGNoKC9eKDB8WzEtOV1bMC05XSopJC8pKXtjb25zdCByPU51bWJlci5wYXJzZUludChuKSxpPXQuaXRlbXNbcl07cmV0dXJuIGk/dGkoZSxpKTpudWxsfXJldHVybiBudWxsfWZ1bmN0aW9uIE0xKGUpe3JldHVybiBlPT09IiMiP1tdOmVbMF0hPT0iIyJ8fGVbMV0hPT0iLyI/bnVsbDplLnN1YnN0cmluZygyKS5zcGxpdCgvXC8vKS5tYXAoQzEpfWZ1bmN0aW9uIEMxKGUpe3JldHVybiBlLnJlcGxhY2UoL34xL2csIi8iKS5yZXBsYWNlKC9+MC9nLCJ+Iil9ZnVuY3Rpb24gVDEoZSl7Y29uc3QgdD1lLnByb21pc2VDb25zdHJ1Y3Rvcnx8UHJvbWlzZSxuPW5ldyB2MShlLnNjaGVtYVJlcXVlc3RTZXJ2aWNlLGUud29ya3NwYWNlQ29udGV4dCx0KTtuLnNldFNjaGVtYUNvbnRyaWJ1dGlvbnMoS3IpO2NvbnN0IHI9bmV3IG4xKG4sZS5jb250cmlidXRpb25zLHQsZS5jbGllbnRDYXBhYmlsaXRpZXMpLGk9bmV3IHIxKG4sZS5jb250cmlidXRpb25zLHQpLHM9bmV3IGYxKG4pLGE9bmV3IHMxKG4sdCk7cmV0dXJue2NvbmZpZ3VyZTpsPT57dmFyIG87bi5jbGVhckV4dGVybmFsU2NoZW1hcygpLChvPWwuc2NoZW1hcyk9PW51bGx8fG8uZm9yRWFjaChuLnJlZ2lzdGVyRXh0ZXJuYWxTY2hlbWEuYmluZChuKSksYS5jb25maWd1cmUobCl9LHJlc2V0U2NoZW1hOmw9Pm4ub25SZXNvdXJjZUNoYW5nZShsKSxkb1ZhbGlkYXRpb246YS5kb1ZhbGlkYXRpb24uYmluZChhKSxnZXRMYW5ndWFnZVN0YXR1czphLmdldExhbmd1YWdlU3RhdHVzLmJpbmQoYSkscGFyc2VKU09ORG9jdW1lbnQ6bD0+dDEobCx7Y29sbGVjdENvbW1lbnRzOiEwfSksbmV3SlNPTkRvY3VtZW50OihsLG8pPT5lMShsLG8pLGdldE1hdGNoaW5nU2NoZW1hczpuLmdldE1hdGNoaW5nU2NoZW1hcy5iaW5kKG4pLGRvUmVzb2x2ZTpyLmRvUmVzb2x2ZS5iaW5kKHIpLGRvQ29tcGxldGU6ci5kb0NvbXBsZXRlLmJpbmQociksZmluZERvY3VtZW50U3ltYm9sczpzLmZpbmREb2N1bWVudFN5bWJvbHMuYmluZChzKSxmaW5kRG9jdW1lbnRTeW1ib2xzMjpzLmZpbmREb2N1bWVudFN5bWJvbHMyLmJpbmQocyksZmluZERvY3VtZW50Q29sb3JzOnMuZmluZERvY3VtZW50Q29sb3JzLmJpbmQocyksZ2V0Q29sb3JQcmVzZW50YXRpb25zOnMuZ2V0Q29sb3JQcmVzZW50YXRpb25zLmJpbmQocyksZG9Ib3ZlcjppLmRvSG92ZXIuYmluZChpKSxnZXRGb2xkaW5nUmFuZ2VzOnkxLGdldFNlbGVjdGlvblJhbmdlczp3MSxmaW5kRGVmaW5pdGlvbjooKT0+UHJvbWlzZS5yZXNvbHZlKFtdKSxmaW5kTGlua3M6azEsZm9ybWF0OihsLG8sdSk9PmVpKGwsdSxvKSxzb3J0OihsLG8pPT5OMShsLG8pfX12YXIgVW87dHlwZW9mIGZldGNoPCJ1IiYmKFVvPWZ1bmN0aW9uKGUpe3JldHVybiBmZXRjaChlKS50aGVuKHQ9PnQudGV4dCgpKX0pO3ZhciBQMT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuX2N0eD1lLHRoaXMuX2xhbmd1YWdlU2V0dGluZ3M9dC5sYW5ndWFnZVNldHRpbmdzLHRoaXMuX2xhbmd1YWdlSWQ9dC5sYW5ndWFnZUlkLHRoaXMuX2xhbmd1YWdlU2VydmljZT1UMSh7d29ya3NwYWNlQ29udGV4dDp7cmVzb2x2ZVJlbGF0aXZlUGF0aDoobixyKT0+e2NvbnN0IGk9ci5zdWJzdHIoMCxyLmxhc3RJbmRleE9mKCIvIikrMSk7cmV0dXJuIFYxKGksbil9fSxzY2hlbWFSZXF1ZXN0U2VydmljZTp0LmVuYWJsZVNjaGVtYVJlcXVlc3Q/VW86dm9pZCAwLGNsaWVudENhcGFiaWxpdGllczpKci5MQVRFU1R9KSx0aGlzLl9sYW5ndWFnZVNlcnZpY2UuY29uZmlndXJlKHRoaXMuX2xhbmd1YWdlU2V0dGluZ3MpfWFzeW5jIGRvVmFsaWRhdGlvbihlKXtsZXQgdD10aGlzLl9nZXRUZXh0RG9jdW1lbnQoZSk7aWYodCl7bGV0IG49dGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLnBhcnNlSlNPTkRvY3VtZW50KHQpO3JldHVybiB0aGlzLl9sYW5ndWFnZVNlcnZpY2UuZG9WYWxpZGF0aW9uKHQsbix0aGlzLl9sYW5ndWFnZVNldHRpbmdzKX1yZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKX1hc3luYyBkb0NvbXBsZXRlKGUsdCl7bGV0IG49dGhpcy5fZ2V0VGV4dERvY3VtZW50KGUpO2lmKCFuKXJldHVybiBudWxsO2xldCByPXRoaXMuX2xhbmd1YWdlU2VydmljZS5wYXJzZUpTT05Eb2N1bWVudChuKTtyZXR1cm4gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmRvQ29tcGxldGUobix0LHIpfWFzeW5jIGRvUmVzb2x2ZShlKXtyZXR1cm4gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmRvUmVzb2x2ZShlKX1hc3luYyBkb0hvdmVyKGUsdCl7bGV0IG49dGhpcy5fZ2V0VGV4dERvY3VtZW50KGUpO2lmKCFuKXJldHVybiBudWxsO2xldCByPXRoaXMuX2xhbmd1YWdlU2VydmljZS5wYXJzZUpTT05Eb2N1bWVudChuKTtyZXR1cm4gdGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmRvSG92ZXIobix0LHIpfWFzeW5jIGZvcm1hdChlLHQsbil7bGV0IHI9dGhpcy5fZ2V0VGV4dERvY3VtZW50KGUpO2lmKCFyKXJldHVybltdO2xldCBpPXRoaXMuX2xhbmd1YWdlU2VydmljZS5mb3JtYXQocix0LG4pO3JldHVybiBQcm9taXNlLnJlc29sdmUoaSl9YXN5bmMgcmVzZXRTY2hlbWEoZSl7cmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzLl9sYW5ndWFnZVNlcnZpY2UucmVzZXRTY2hlbWEoZSkpfWFzeW5jIGZpbmREb2N1bWVudFN5bWJvbHMoZSl7bGV0IHQ9dGhpcy5fZ2V0VGV4dERvY3VtZW50KGUpO2lmKCF0KXJldHVybltdO2xldCBuPXRoaXMuX2xhbmd1YWdlU2VydmljZS5wYXJzZUpTT05Eb2N1bWVudCh0KSxyPXRoaXMuX2xhbmd1YWdlU2VydmljZS5maW5kRG9jdW1lbnRTeW1ib2xzMih0LG4pO3JldHVybiBQcm9taXNlLnJlc29sdmUocil9YXN5bmMgZmluZERvY3VtZW50Q29sb3JzKGUpe2xldCB0PXRoaXMuX2dldFRleHREb2N1bWVudChlKTtpZighdClyZXR1cm5bXTtsZXQgbj10aGlzLl9sYW5ndWFnZVNlcnZpY2UucGFyc2VKU09ORG9jdW1lbnQodCkscj10aGlzLl9sYW5ndWFnZVNlcnZpY2UuZmluZERvY3VtZW50Q29sb3JzKHQsbik7cmV0dXJuIFByb21pc2UucmVzb2x2ZShyKX1hc3luYyBnZXRDb2xvclByZXNlbnRhdGlvbnMoZSx0LG4pe2xldCByPXRoaXMuX2dldFRleHREb2N1bWVudChlKTtpZighcilyZXR1cm5bXTtsZXQgaT10aGlzLl9sYW5ndWFnZVNlcnZpY2UucGFyc2VKU09ORG9jdW1lbnQocikscz10aGlzLl9sYW5ndWFnZVNlcnZpY2UuZ2V0Q29sb3JQcmVzZW50YXRpb25zKHIsaSx0LG4pO3JldHVybiBQcm9taXNlLnJlc29sdmUocyl9YXN5bmMgZ2V0Rm9sZGluZ1JhbmdlcyhlLHQpe2xldCBuPXRoaXMuX2dldFRleHREb2N1bWVudChlKTtpZighbilyZXR1cm5bXTtsZXQgcj10aGlzLl9sYW5ndWFnZVNlcnZpY2UuZ2V0Rm9sZGluZ1JhbmdlcyhuLHQpO3JldHVybiBQcm9taXNlLnJlc29sdmUocil9YXN5bmMgZ2V0U2VsZWN0aW9uUmFuZ2VzKGUsdCl7bGV0IG49dGhpcy5fZ2V0VGV4dERvY3VtZW50KGUpO2lmKCFuKXJldHVybltdO2xldCByPXRoaXMuX2xhbmd1YWdlU2VydmljZS5wYXJzZUpTT05Eb2N1bWVudChuKSxpPXRoaXMuX2xhbmd1YWdlU2VydmljZS5nZXRTZWxlY3Rpb25SYW5nZXMobix0LHIpO3JldHVybiBQcm9taXNlLnJlc29sdmUoaSl9YXN5bmMgcGFyc2VKU09ORG9jdW1lbnQoZSl7bGV0IHQ9dGhpcy5fZ2V0VGV4dERvY3VtZW50KGUpO2lmKCF0KXJldHVybiBudWxsO2xldCBuPXRoaXMuX2xhbmd1YWdlU2VydmljZS5wYXJzZUpTT05Eb2N1bWVudCh0KTtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG4pfWFzeW5jIGdldE1hdGNoaW5nU2NoZW1hcyhlKXtsZXQgdD10aGlzLl9nZXRUZXh0RG9jdW1lbnQoZSk7aWYoIXQpcmV0dXJuW107bGV0IG49dGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLnBhcnNlSlNPTkRvY3VtZW50KHQpO3JldHVybiBQcm9taXNlLnJlc29sdmUodGhpcy5fbGFuZ3VhZ2VTZXJ2aWNlLmdldE1hdGNoaW5nU2NoZW1hcyh0LG4pKX1fZ2V0VGV4dERvY3VtZW50KGUpe2xldCB0PXRoaXMuX2N0eC5nZXRNaXJyb3JNb2RlbHMoKTtmb3IobGV0IG4gb2YgdClpZihuLnVyaS50b1N0cmluZygpPT09ZSlyZXR1cm4gTWUuY3JlYXRlKGUsdGhpcy5fbGFuZ3VhZ2VJZCxuLnZlcnNpb24sbi5nZXRWYWx1ZSgpKTtyZXR1cm4gbnVsbH19LEkxPTQ3LG5pPTQ2O2Z1bmN0aW9uIEYxKGUpe3JldHVybiBlLmNoYXJDb2RlQXQoMCk9PT1JMX1mdW5jdGlvbiBWMShlLHQpe2lmKEYxKHQpKXtjb25zdCBuPVR0LnBhcnNlKGUpLHI9dC5zcGxpdCgiLyIpO3JldHVybiBuLndpdGgoe3BhdGg6Qm8ocil9KS50b1N0cmluZygpfXJldHVybiBEMShlLHQpfWZ1bmN0aW9uIEJvKGUpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IHIgb2YgZSlyLmxlbmd0aD09PTB8fHIubGVuZ3RoPT09MSYmci5jaGFyQ29kZUF0KDApPT09bml8fChyLmxlbmd0aD09PTImJnIuY2hhckNvZGVBdCgwKT09PW5pJiZyLmNoYXJDb2RlQXQoMSk9PT1uaT90LnBvcCgpOnQucHVzaChyKSk7ZS5sZW5ndGg+MSYmZVtlLmxlbmd0aC0xXS5sZW5ndGg9PT0wJiZ0LnB1c2goIiIpO2xldCBuPXQuam9pbigiLyIpO3JldHVybiBlWzBdLmxlbmd0aD09PTAmJihuPSIvIituKSxufWZ1bmN0aW9uIEQxKGUsLi4udCl7Y29uc3Qgbj1UdC5wYXJzZShlKSxyPW4ucGF0aC5zcGxpdCgiLyIpO2ZvcihsZXQgaSBvZiB0KXIucHVzaCguLi5pLnNwbGl0KCIvIikpO3JldHVybiBuLndpdGgoe3BhdGg6Qm8ocil9KS50b1N0cmluZygpfXNlbGYub25tZXNzYWdlPSgpPT57Z2EoKGUsdCk9Pm5ldyBQMShlLHQpKX19KSgpOwo=", KNe = (s) => Uint8Array.from(atob(s), (e) => e.charCodeAt(0)), qB = typeof self < "u" && self.Blob && new Blob([KNe(y8)], { type: "text/javascript;charset=utf-8" }); -function QNe(s) { +var jRe = { 975(s) { + function e(n) { + if (typeof n != "string") throw new TypeError("Path must be a string. Received " + JSON.stringify(n)); + } + function t(n, o) { + for (var l, r = "", c = 0, d = -1, a = 0, h = 0; h <= n.length; ++h) { + if (h < n.length) l = n.charCodeAt(h); + else { + if (l === 47) break; + l = 47; + } + if (l === 47) { + if (!(d === h - 1 || a === 1)) if (d !== h - 1 && a === 2) { + if (r.length < 2 || c !== 2 || r.charCodeAt(r.length - 1) !== 46 || r.charCodeAt(r.length - 2) !== 46) { + if (r.length > 2) { + var u = r.lastIndexOf("/"); + if (u !== r.length - 1) { + u === -1 ? (r = "", c = 0) : c = (r = r.slice(0, u)).length - 1 - r.lastIndexOf("/"), d = h, a = 0; + continue; + } + } else if (r.length === 2 || r.length === 1) { + r = "", c = 0, d = h, a = 0; + continue; + } + } + o && (r.length > 0 ? r += "/.." : r = "..", c = 2); + } else r.length > 0 ? r += "/" + n.slice(d + 1, h) : r = n.slice(d + 1, h), c = h - d - 1; + d = h, a = 0; + } else l === 46 && a !== -1 ? ++a : a = -1; + } + return r; + } + var i = { resolve: function() { + for (var n, o = "", l = !1, r = arguments.length - 1; r >= -1 && !l; r--) { + var c; + r >= 0 ? c = arguments[r] : (n === void 0 && (n = process.cwd()), c = n), e(c), c.length !== 0 && (o = c + "/" + o, l = c.charCodeAt(0) === 47); + } + return o = t(o, !l), l ? o.length > 0 ? "/" + o : "/" : o.length > 0 ? o : "."; + }, normalize: function(n) { + if (e(n), n.length === 0) return "."; + var o = n.charCodeAt(0) === 47, l = n.charCodeAt(n.length - 1) === 47; + return (n = t(n, !o)).length !== 0 || o || (n = "."), n.length > 0 && l && (n += "/"), o ? "/" + n : n; + }, isAbsolute: function(n) { + return e(n), n.length > 0 && n.charCodeAt(0) === 47; + }, join: function() { + if (arguments.length === 0) return "."; + for (var n, o = 0; o < arguments.length; ++o) { + var l = arguments[o]; + e(l), l.length > 0 && (n === void 0 ? n = l : n += "/" + l); + } + return n === void 0 ? "." : i.normalize(n); + }, relative: function(n, o) { + if (e(n), e(o), n === o || (n = i.resolve(n)) === (o = i.resolve(o))) return ""; + for (var l = 1; l < n.length && n.charCodeAt(l) === 47; ++l) ; + for (var r = n.length, c = r - l, d = 1; d < o.length && o.charCodeAt(d) === 47; ++d) ; + for (var a = o.length - d, h = c < a ? c : a, u = -1, m = 0; m <= h; ++m) { + if (m === h) { + if (a > h) { + if (o.charCodeAt(d + m) === 47) return o.slice(d + m + 1); + if (m === 0) return o.slice(d + m); + } else c > h && (n.charCodeAt(l + m) === 47 ? u = m : m === 0 && (u = 0)); + break; + } + var b = n.charCodeAt(l + m); + if (b !== o.charCodeAt(d + m)) break; + b === 47 && (u = m); + } + var g = ""; + for (m = l + u + 1; m <= r; ++m) m !== r && n.charCodeAt(m) !== 47 || (g.length === 0 ? g += ".." : g += "/.."); + return g.length > 0 ? g + o.slice(d + u) : (d += u, o.charCodeAt(d) === 47 && ++d, o.slice(d)); + }, _makeLong: function(n) { + return n; + }, dirname: function(n) { + if (e(n), n.length === 0) return "."; + for (var o = n.charCodeAt(0), l = o === 47, r = -1, c = !0, d = n.length - 1; d >= 1; --d) if ((o = n.charCodeAt(d)) === 47) { + if (!c) { + r = d; + break; + } + } else c = !1; + return r === -1 ? l ? "/" : "." : l && r === 1 ? "//" : n.slice(0, r); + }, basename: function(n, o) { + if (o !== void 0 && typeof o != "string") throw new TypeError('"ext" argument must be a string'); + e(n); + var l, r = 0, c = -1, d = !0; + if (o !== void 0 && o.length > 0 && o.length <= n.length) { + if (o.length === n.length && o === n) return ""; + var a = o.length - 1, h = -1; + for (l = n.length - 1; l >= 0; --l) { + var u = n.charCodeAt(l); + if (u === 47) { + if (!d) { + r = l + 1; + break; + } + } else h === -1 && (d = !1, h = l + 1), a >= 0 && (u === o.charCodeAt(a) ? --a === -1 && (c = l) : (a = -1, c = h)); + } + return r === c ? c = h : c === -1 && (c = n.length), n.slice(r, c); + } + for (l = n.length - 1; l >= 0; --l) if (n.charCodeAt(l) === 47) { + if (!d) { + r = l + 1; + break; + } + } else c === -1 && (d = !1, c = l + 1); + return c === -1 ? "" : n.slice(r, c); + }, extname: function(n) { + e(n); + for (var o = -1, l = 0, r = -1, c = !0, d = 0, a = n.length - 1; a >= 0; --a) { + var h = n.charCodeAt(a); + if (h !== 47) r === -1 && (c = !1, r = a + 1), h === 46 ? o === -1 ? o = a : d !== 1 && (d = 1) : o !== -1 && (d = -1); + else if (!c) { + l = a + 1; + break; + } + } + return o === -1 || r === -1 || d === 0 || d === 1 && o === r - 1 && o === l + 1 ? "" : n.slice(o, r); + }, format: function(n) { + if (n === null || typeof n != "object") throw new TypeError('The "pathObject" argument must be of type Object. Received type ' + typeof n); + return function(o, l) { + var r = l.dir || l.root, c = l.base || (l.name || "") + (l.ext || ""); + return r ? r === l.root ? r + c : r + "/" + c : c; + }(0, n); + }, parse: function(n) { + e(n); + var o = { root: "", dir: "", base: "", ext: "", name: "" }; + if (n.length === 0) return o; + var l, r = n.charCodeAt(0), c = r === 47; + c ? (o.root = "/", l = 1) : l = 0; + for (var d = -1, a = 0, h = -1, u = !0, m = n.length - 1, b = 0; m >= l; --m) if ((r = n.charCodeAt(m)) !== 47) h === -1 && (u = !1, h = m + 1), r === 46 ? d === -1 ? d = m : b !== 1 && (b = 1) : d !== -1 && (b = -1); + else if (!u) { + a = m + 1; + break; + } + return d === -1 || h === -1 || b === 0 || b === 1 && d === h - 1 && d === a + 1 ? h !== -1 && (o.base = o.name = a === 0 && c ? n.slice(1, h) : n.slice(a, h)) : (a === 0 && c ? (o.name = n.slice(1, d), o.base = n.slice(1, h)) : (o.name = n.slice(a, d), o.base = n.slice(a, h)), o.ext = n.slice(d, h)), a > 0 ? o.dir = n.slice(0, a - 1) : c && (o.dir = "/"), o; + }, sep: "/", delimiter: ":", win32: null, posix: null }; + i.posix = i, s.exports = i; +} }, LU = {}; +function rg(s) { + var e = LU[s]; + if (e !== void 0) return e.exports; + var t = LU[s] = { exports: {} }; + return jRe[s](t, t.exports, rg), t.exports; +} +let fG; +rg.d = (s, e) => { + for (var t in e) rg.o(e, t) && !rg.o(s, t) && Object.defineProperty(s, t, { enumerable: !0, get: e[t] }); +}, rg.o = (s, e) => Object.prototype.hasOwnProperty.call(s, e), typeof process == "object" ? fG = process.platform === "win32" : typeof navigator == "object" && (fG = navigator.userAgent.indexOf("Windows") >= 0); +const qRe = /^\w[\w\d+.-]*$/, $Re = /^\//, eNe = /^\/\//; +function IU(s, e) { + if (!s.scheme && e) throw new Error(`[UriError]: Scheme is missing: {scheme: "", authority: "${s.authority}", path: "${s.path}", query: "${s.query}", fragment: "${s.fragment}"}`); + if (s.scheme && !qRe.test(s.scheme)) throw new Error("[UriError]: Scheme contains illegal characters."); + if (s.path) { + if (s.authority) { + if (!$Re.test(s.path)) throw new Error('[UriError]: If a URI contains an authority component, then the path component must either be empty or begin with a slash ("/") character'); + } else if (eNe.test(s.path)) throw new Error('[UriError]: If a URI does not contain an authority component, then the path cannot begin with two slash characters ("//")'); + } +} +const Ni = "", pr = "/", tNe = /^(([^:/?#]+?):)?(\/\/([^/?#]*))?([^?#]*)(\?([^#]*))?(#(.*))?/; +class ml { + constructor(e, t, i, n, o, l = !1) { + qt(this, "scheme"); + qt(this, "authority"); + qt(this, "path"); + qt(this, "query"); + qt(this, "fragment"); + typeof e == "object" ? (this.scheme = e.scheme || Ni, this.authority = e.authority || Ni, this.path = e.path || Ni, this.query = e.query || Ni, this.fragment = e.fragment || Ni) : (this.scheme = /* @__PURE__ */ function(r, c) { + return r || c ? r : "file"; + }(e, l), this.authority = t || Ni, this.path = function(r, c) { + switch (r) { + case "https": + case "http": + case "file": + c ? c[0] !== pr && (c = pr + c) : c = pr; + } + return c; + }(this.scheme, i || Ni), this.query = n || Ni, this.fragment = o || Ni, IU(this, l)); + } + static isUri(e) { + return e instanceof ml || !!e && typeof e.authority == "string" && typeof e.fragment == "string" && typeof e.path == "string" && typeof e.query == "string" && typeof e.scheme == "string" && typeof e.fsPath == "string" && typeof e.with == "function" && typeof e.toString == "function"; + } + get fsPath() { + return n6(this); + } + with(e) { + if (!e) return this; + let { scheme: t, authority: i, path: n, query: o, fragment: l } = e; + return t === void 0 ? t = this.scheme : t === null && (t = Ni), i === void 0 ? i = this.authority : i === null && (i = Ni), n === void 0 ? n = this.path : n === null && (n = Ni), o === void 0 ? o = this.query : o === null && (o = Ni), l === void 0 ? l = this.fragment : l === null && (l = Ni), t === this.scheme && i === this.authority && n === this.path && o === this.query && l === this.fragment ? this : new xp(t, i, n, o, l); + } + static parse(e, t = !1) { + const i = tNe.exec(e); + return i ? new xp(i[2] || Ni, WX(i[4] || Ni), WX(i[5] || Ni), WX(i[7] || Ni), WX(i[9] || Ni), t) : new xp(Ni, Ni, Ni, Ni, Ni); + } + static file(e) { + let t = Ni; + if (fG && (e = e.replace(/\\/g, pr)), e[0] === pr && e[1] === pr) { + const i = e.indexOf(pr, 2); + i === -1 ? (t = e.substring(2), e = pr) : (t = e.substring(2, i), e = e.substring(i) || pr); + } + return new xp("file", t, e, Ni, Ni); + } + static from(e) { + const t = new xp(e.scheme, e.authority, e.path, e.query, e.fragment); + return IU(t, !0), t; + } + toString(e = !1) { + return Bk(this, e); + } + toJSON() { + return this; + } + static revive(e) { + if (e) { + if (e instanceof ml) return e; + { + const t = new xp(e); + return t._formatted = e.external, t._fsPath = e._sep === t6 ? e.fsPath : null, t; + } + } + return e; + } +} +const t6 = fG ? 1 : void 0; +class xp extends ml { + constructor() { + super(...arguments); + qt(this, "_formatted", null); + qt(this, "_fsPath", null); + } + get fsPath() { + return this._fsPath || (this._fsPath = n6(this)), this._fsPath; + } + toString(t = !1) { + return t ? Bk(this, !0) : (this._formatted || (this._formatted = Bk(this, !1)), this._formatted); + } + toJSON() { + const t = { $mid: 1 }; + return this._fsPath && (t.fsPath = this._fsPath, t._sep = t6), this._formatted && (t.external = this._formatted), this.path && (t.path = this.path), this.scheme && (t.scheme = this.scheme), this.authority && (t.authority = this.authority), this.query && (t.query = this.query), this.fragment && (t.fragment = this.fragment), t; + } +} +const i6 = { 58: "%3A", 47: "%2F", 63: "%3F", 35: "%23", 91: "%5B", 93: "%5D", 64: "%40", 33: "%21", 36: "%24", 38: "%26", 39: "%27", 40: "%28", 41: "%29", 42: "%2A", 43: "%2B", 44: "%2C", 59: "%3B", 61: "%3D", 32: "%20" }; +function SU(s, e, t) { + let i, n = -1; + for (let o = 0; o < s.length; o++) { + const l = s.charCodeAt(o); + if (l >= 97 && l <= 122 || l >= 65 && l <= 90 || l >= 48 && l <= 57 || l === 45 || l === 46 || l === 95 || l === 126 || e && l === 47 || t && l === 91 || t && l === 93 || t && l === 58) n !== -1 && (i += encodeURIComponent(s.substring(n, o)), n = -1), i !== void 0 && (i += s.charAt(o)); + else { + i === void 0 && (i = s.substr(0, o)); + const r = i6[l]; + r !== void 0 ? (n !== -1 && (i += encodeURIComponent(s.substring(n, o)), n = -1), i += r) : n === -1 && (n = o); + } + } + return n !== -1 && (i += encodeURIComponent(s.substring(n))), i !== void 0 ? i : s; +} +function iNe(s) { + let e; + for (let t = 0; t < s.length; t++) { + const i = s.charCodeAt(t); + i === 35 || i === 63 ? (e === void 0 && (e = s.substr(0, t)), e += i6[i]) : e !== void 0 && (e += s[t]); + } + return e !== void 0 ? e : s; +} +function n6(s, e) { + let t; + return t = s.authority && s.path.length > 1 && s.scheme === "file" ? `//${s.authority}${s.path}` : s.path.charCodeAt(0) === 47 && (s.path.charCodeAt(1) >= 65 && s.path.charCodeAt(1) <= 90 || s.path.charCodeAt(1) >= 97 && s.path.charCodeAt(1) <= 122) && s.path.charCodeAt(2) === 58 ? s.path[1].toLowerCase() + s.path.substr(2) : s.path, fG && (t = t.replace(/\//g, "\\")), t; +} +function Bk(s, e) { + const t = e ? iNe : SU; + let i = "", { scheme: n, authority: o, path: l, query: r, fragment: c } = s; + if (n && (i += n, i += ":"), (o || n === "file") && (i += pr, i += pr), o) { + let d = o.indexOf("@"); + if (d !== -1) { + const a = o.substr(0, d); + o = o.substr(d + 1), d = a.lastIndexOf(":"), d === -1 ? i += t(a, !1, !1) : (i += t(a.substr(0, d), !1, !1), i += ":", i += t(a.substr(d + 1), !1, !0)), i += "@"; + } + o = o.toLowerCase(), d = o.lastIndexOf(":"), d === -1 ? i += t(o, !1, !0) : (i += t(o.substr(0, d), !1, !0), i += o.substr(d)); + } + if (l) { + if (l.length >= 3 && l.charCodeAt(0) === 47 && l.charCodeAt(2) === 58) { + const d = l.charCodeAt(1); + d >= 65 && d <= 90 && (l = `/${String.fromCharCode(d + 32)}:${l.substr(3)}`); + } else if (l.length >= 2 && l.charCodeAt(1) === 58) { + const d = l.charCodeAt(0); + d >= 65 && d <= 90 && (l = `${String.fromCharCode(d + 32)}:${l.substr(2)}`); + } + i += t(l, !0, !1); + } + return r && (i += "?", i += t(r, !1, !1)), c && (i += "#", i += e ? c : SU(c, !1, !1)), i; +} +function s6(s) { + try { + return decodeURIComponent(s); + } catch { + return s.length > 3 ? s.substr(0, 3) + s6(s.substr(3)) : s; + } +} +const xU = /(%[0-9A-Za-z][0-9A-Za-z])+/g; +function WX(s) { + return s.match(xU) ? s.replace(xU, (e) => s6(e)) : s; +} +var CU = rg(975); +const af = CU.posix || CU, GX = "/"; +var RU; +(function(s) { + s.joinPath = function(e, ...t) { + return e.with({ path: af.join(e.path, ...t) }); + }, s.resolvePath = function(e, ...t) { + let i = e.path, n = !1; + i[0] !== GX && (i = GX + i, n = !0); + let o = af.resolve(i, ...t); + return n && o[0] === GX && !e.authority && (o = o.substring(1)), e.with({ path: o }); + }, s.dirname = function(e) { + if (e.path.length === 0 || e.path === GX) return e; + let t = af.dirname(e.path); + return t.length === 1 && t.charCodeAt(0) === 46 && (t = ""), e.with({ path: t }); + }, s.basename = function(e) { + return af.basename(e.path); + }, s.extname = function(e) { + return af.extname(e.path); + }; +})(RU || (RU = {})); +function nNe(s) { + return s === 4 ? 1 : s === 3 ? 2 : s === 2 ? 4 : 8; +} +function sNe(s) { + return s; +} +function oNe(s) { + return { + start: { line: s.startLineNumber - 1, character: s.startColumn - 1 }, + end: { line: s.endLineNumber - 1, character: s.endColumn - 1 } + }; +} +function vn(s) { + return { + startLineNumber: s.start.line + 1, + startColumn: s.start.character + 1, + endLineNumber: s.end.line + 1, + endColumn: s.end.character + 1 + }; +} +function lNe(s) { + return { + ...vn(s.location.range), + message: s.message, + resource: ml.parse(s.location.uri) + }; +} +function o6(s) { + const e = { + ...vn(s.range), + message: s.message, + severity: s.severity ? nNe(s.severity) : 8 + }; + return s.code != null && (e.code = s.codeDescription == null ? String(s.code) : { value: String(s.code), target: ml.parse(s.codeDescription.href) }), s.relatedInformation && (e.relatedInformation = s.relatedInformation.map(lNe)), s.tags && (e.tags = s.tags.map(sNe)), s.source != null && (e.source = s.source), e; +} +function _k(s) { + return { + range: vn(s.range), + text: s.newText + }; +} +function rNe(s) { + var e; + const t = { + label: s.label, + needsConfirmation: (e = s.needsConfirmation) !== null && e !== void 0 ? e : !1 + }; + return s.description != null && (t.description = s.description), t; +} +function cNe(s) { + const e = {}; + return s.ignoreIfExists != null && (e.ignoreIfExists = s.ignoreIfExists), s.ignoreIfNotExists != null && (e.ignoreIfNotExists = s.ignoreIfNotExists), s.overwrite != null && (e.overwrite = s.overwrite), s.recursive != null && (e.recursive = s.recursive), e; +} +function dNe(s) { + const e = s.kind === "create" ? { newResource: ml.parse(s.uri) } : s.kind === "delete" ? { oldResource: ml.parse(s.uri) } : { + oldResource: ml.parse(s.oldUri), + newResource: ml.parse(s.newUri) + }; + return s.options && (e.options = cNe(s.options)), e; +} +function NU(s, e, t, i) { + const n = { + resource: ml.parse(e), + versionId: i, + textEdit: _k(s) + }; + if ("annotationId" in s) { + const o = t == null ? void 0 : t[s.annotationId]; + o && (n.metadata = rNe(o)); + } + return n; +} +function l6(s) { + var e; + const t = []; + if (s.changes) + for (const [i, n] of Object.entries(s.changes)) + for (const o of n) + t.push(NU(o, i, s.changeAnnotations)); + if (s.documentChanges) + for (const i of s.documentChanges) { + if (!("textDocument" in i)) { + t.push(dNe(i)); + continue; + } + for (const n of i.edits) + t.push(NU(n, i.textDocument.uri, s.changeAnnotations, (e = i.textDocument.version) !== null && e !== void 0 ? e : void 0)); + } + return { + edits: t + }; +} +function aNe(s) { + const e = { + title: s.title, + isPreferred: s.isPreferred + }; + return s.diagnostics && (e.diagnostics = s.diagnostics.map(o6)), s.disabled && (e.disabled = s.disabled.reason), s.edit && (e.edit = l6(s.edit)), s.isPreferred != null && (e.isPreferred = s.isPreferred), s.kind && (e.kind = s.kind), e; +} +function r6(s) { + const e = { + title: s.title, + id: s.command + }; + return s.arguments && (e.arguments = s.arguments), e; +} +function hNe(s) { + const e = { + range: vn(s.range) + }; + return s.command && (e.command = r6(s.command)), e; +} +function uNe(s) { + return s === 1 ? 18 : s === 2 ? 0 : s === 3 ? 1 : s === 4 ? 2 : s === 5 ? 3 : s === 6 ? 4 : s === 7 ? 5 : s === 8 ? 7 : s === 9 ? 8 : s === 10 ? 9 : s === 11 ? 12 : s === 12 ? 13 : s === 13 ? 15 : s === 14 ? 17 : s === 15 ? 27 : s === 16 ? 19 : s === 17 ? 20 : s === 18 ? 21 : s === 19 ? 23 : s === 20 ? 16 : s === 21 ? 14 : s === 22 ? 6 : s === 23 ? 10 : s === 24 ? 11 : 24; +} +function mNe(s) { + return s; +} +function c6(s) { + return { + value: s.value + }; +} +function bNe(s) { + return { + range: vn(s.range), + text: s.newText + }; +} +function pNe(s) { + return "range" in s ? vn(s.range) : "insert" in s && "replace" in s ? { + insert: vn(s.insert), + replace: vn(s.replace) + } : vn(s); +} +function gNe(s, e) { + var t, i, n, o, l; + const r = (t = e.itemDefaults) !== null && t !== void 0 ? t : {}, c = (i = s.textEdit) !== null && i !== void 0 ? i : r.editRange, d = (n = s.commitCharacters) !== null && n !== void 0 ? n : r.commitCharacters, a = (o = s.insertTextFormat) !== null && o !== void 0 ? o : r.insertTextFormat, h = (l = s.insertTextMode) !== null && l !== void 0 ? l : r.insertTextMode; + let u = s.insertText, m; + c ? (m = pNe(c), "newText" in c && (u = c.newText)) : m = { ...e.range }; + const b = { + insertText: u ?? s.label, + kind: s.kind == null ? 18 : uNe(s.kind), + label: s.label, + range: m + }; + return s.additionalTextEdits && (b.additionalTextEdits = s.additionalTextEdits.map(bNe)), s.command && (b.command = r6(s.command)), d && (b.commitCharacters = d), s.detail != null && (b.detail = s.detail), typeof s.documentation == "string" ? b.documentation = s.documentation : s.documentation && (b.documentation = c6(s.documentation)), s.filterText != null && (b.filterText = s.filterText), a === 2 ? b.insertTextRules = 4 : h === 2 && (b.insertTextRules = 1), s.preselect != null && (b.preselect = s.preselect), s.sortText != null && (b.sortText = s.sortText), s.tags && (b.tags = s.tags.map(mNe)), b; +} +function ZNe(s, e) { + return { + incomplete: !!s.isIncomplete, + suggestions: s.items.map((t) => gNe(t, { range: e.range, itemDefaults: s.itemDefaults })) + }; +} +function fNe(s) { + return s === 1 ? 0 : s === 2 ? 1 : s === 3 ? 2 : s === 4 ? 3 : s === 5 ? 4 : s === 6 ? 5 : s === 7 ? 6 : s === 8 ? 7 : s === 9 ? 8 : s === 10 ? 9 : s === 11 ? 10 : s === 12 ? 11 : s === 13 ? 12 : s === 14 ? 13 : s === 15 ? 14 : s === 16 ? 15 : s === 17 ? 16 : s === 18 ? 17 : s === 19 ? 18 : s === 20 ? 19 : s === 21 ? 20 : s === 22 ? 21 : s === 23 ? 22 : s === 24 ? 23 : s === 25 ? 24 : 25; +} +function yNe(s) { + return s; +} +function d6(s) { + var e, t, i; + const n = { + detail: (e = s.detail) !== null && e !== void 0 ? e : "", + kind: fNe(s.kind), + name: s.name, + range: vn(s.range), + selectionRange: vn(s.selectionRange), + tags: (i = (t = s.tags) === null || t === void 0 ? void 0 : t.map(yNe)) !== null && i !== void 0 ? i : [] + }; + return s.children && (n.children = s.children.map(d6)), n; +} +function WNe(s) { + const e = { + start: s.startLine + 1, + end: s.endLine + 1 + }; + return s.kind != null && (e.kind = { value: s.kind }), e; +} +function GNe(s) { + return { + insertSpaces: s.insertSpaces, + tabSize: s.tabSize + }; +} +function wU(s) { + return typeof s == "string" ? { value: s } : { value: `\`\`\`${s.language} +${s.value} +\`\`\`` }; +} +function XNe(s) { + return typeof s == "string" || "language" in s ? [wU(s)] : Array.isArray(s) ? s.map(wU) : [c6(s)]; +} +function VNe(s) { + const e = { + contents: XNe(s.contents) + }; + return s.range && (e.range = vn(s.range)), e; +} +function Lu(s) { + return { character: s.column - 1, line: s.lineNumber - 1 }; +} +function LNe(s) { + const e = { + range: vn(s.range) + }; + return s.tooltip != null && (e.tooltip = s.tooltip), s.target != null && (e.url = ml.parse(s.target)), e; +} +function INe(s) { + const e = { + range: vn(s.targetRange), + targetSelectionRange: vn(s.targetSelectionRange), + uri: ml.parse(s.targetUri) + }; + return s.originSelectionRange && (e.originSelectionRange = vn(s.originSelectionRange)), e; +} +function SNe(s) { + const e = []; + let t = s; + for (; t; ) + e.push({ + range: vn(t.range) + }), t = t.parent; + return e; +} +function xNe(s, e, t) { + const i = /* @__PURE__ */ new Map(), n = (u) => Array.isArray(e) ? e.includes(u) : e === u, o = async (u) => { + const m = u.getVersionId(), b = await t.provideMarkerData(u); + !u.isDisposed() && m === u.getVersionId() && n(u.getLanguageId()) && s.editor.setModelMarkers(u, t.owner, b ?? []); + }, l = (u) => { + if (!n(u.getLanguageId())) + return; + let m; + const b = u.onDidChangeContent(() => { + clearTimeout(m), m = setTimeout(() => { + o(u); + }, 500); + }); + i.set(u, { + dispose() { + clearTimeout(m), b.dispose(); + } + }), o(u); + }, r = (u) => { + s.editor.setModelMarkers(u, t.owner, []); + const m = i.get(u); + m && (m.dispose(), i.delete(u)); + }; + function c(u, m = u.getLanguageId()) { + t.doReset && n(m) && t.doReset(u); + } + const d = s.editor.onDidCreateModel(l), a = s.editor.onWillDisposeModel((u) => { + r(u), c(u); + }), h = s.editor.onDidChangeModelLanguage(({ model: u, oldLanguage: m }) => { + r(u), l(u), c(u, m); + }); + for (const u of s.editor.getModels()) + l(u); + return { + dispose() { + for (const u of i.keys()) + r(u); + d.dispose(), a.dispose(), h.dispose(); + }, + async revalidate() { + await Promise.all(s.editor.getModels().map(o)); + } + }; +} +function CNe(s, e) { + let { createData: t, interval: i = 3e4, label: n, moduleId: o, stopWhenIdleFor: l = 12e4 } = e, r, c = 0, d = !1; + const a = () => { + r && (r.dispose(), r = void 0); + }, h = setInterval(() => { + if (!r) + return; + Date.now() - c > l && a(); + }, i); + return { + dispose() { + d = !0, clearInterval(h), a(); + }, + getWorker(...u) { + if (d) + throw new Error("Worker manager has been disposed"); + return c = Date.now(), r || (r = s.editor.createWebWorker({ + createData: t, + label: n, + moduleId: o + })), r.withSyncedResources(u); + }, + updateCreateData(u) { + t = u, a(); + } + }; +} +function TU(s, e) { + return { + ...e, + ...s, + format: { + ...e.format, + ...s.format + } + }; +} +function hf(s) { + let e; + return { + get() { + return e; + }, + toggle(t) { + t ? e ?? (e = s()) : (e == null || e.dispose(), e = void 0); + } + }; +} +function RNe(s, e = {}) { + let t = TU(e, { + codeLens: !1, + completion: !0, + customTags: [], + disableAdditionalProperties: !1, + disableDefaultProperties: !1, + enableSchemaRequest: !1, + flowMapping: "allow", + flowSequence: "allow", + format: { + bracketSpacing: !0, + enable: !0, + printWidth: 80, + proseWrap: "preserve", + singleQuote: !1, + trailingComma: !0 + }, + hover: !0, + hoverAnchor: !0, + indentation: " ", + isKubernetes: !1, + keyOrdering: !1, + parentSkeletonSelectedFirst: !1, + schemas: [], + validate: !0, + yamlVersion: "1.2" + }); + s.languages.register({ + id: "yaml", + extensions: [".yaml", ".yml"], + aliases: ["YAML", "yaml", "YML", "yml"], + mimetypes: ["application/x-yaml"] + }); + const i = CNe(s, { + label: "yaml", + moduleId: "monaco-yaml/yaml.worker", + createData: t + }), n = /* @__PURE__ */ new WeakMap(), o = hf( + () => s.languages.registerCodeLensProvider("yaml", { + async provideCodeLenses(u) { + const b = await (await i.getWorker(u.uri)).getCodeLens(String(u.uri)); + if (b) + return { + lenses: b.map(hNe), + dispose() { + } + }; + } + }) + ), l = hf( + () => s.languages.registerCompletionItemProvider("yaml", { + triggerCharacters: [" ", ":"], + async provideCompletionItems(u, m) { + const b = u.getWordUntilPosition(m), Z = await (await i.getWorker(u.uri)).doComplete(String(u.uri), Lu(m)); + if (Z) + return ZNe(Z, { + range: { + startLineNumber: m.lineNumber, + startColumn: b.startColumn, + endLineNumber: m.lineNumber, + endColumn: b.endColumn + } + }); + } + }) + ), r = hf( + () => s.languages.registerDocumentFormattingEditProvider("yaml", { + displayName: "yaml", + async provideDocumentFormattingEdits(u) { + const b = await (await i.getWorker(u.uri)).format(String(u.uri)); + return b == null ? void 0 : b.map(_k); + } + }) + ), c = hf( + () => s.languages.registerHoverProvider("yaml", { + async provideHover(u, m) { + const g = await (await i.getWorker(u.uri)).doHover(String(u.uri), Lu(m)); + if (g) + return VNe(g); + } + }) + ), d = hf( + () => xNe(s, "yaml", { + owner: "yaml", + async provideMarkerData(u) { + const b = await (await i.getWorker(u.uri)).doValidation(String(u.uri)); + return n.set(u, b), b == null ? void 0 : b.map(o6); + }, + async doReset(u) { + await (await i.getWorker(u.uri)).resetSchema(String(u.uri)); + } + }) + ); + function a() { + var u; + o.toggle(t.codeLens), l.toggle(t.completion), r.toggle((u = t.format) == null ? void 0 : u.enable), c.toggle(t.hover), d.toggle(t.validate); + } + a(); + const h = [ + i, + s.languages.registerDefinitionProvider("yaml", { + async provideDefinition(u, m) { + const g = await (await i.getWorker(u.uri)).doDefinition(String(u.uri), Lu(m)); + return g == null ? void 0 : g.map(INe); + } + }), + s.languages.registerDocumentSymbolProvider("yaml", { + displayName: "yaml", + async provideDocumentSymbols(u) { + const b = await (await i.getWorker(u.uri)).findDocumentSymbols(String(u.uri)); + return b == null ? void 0 : b.map(d6); + } + }), + s.languages.registerLinkProvider("yaml", { + async provideLinks(u) { + const b = await (await i.getWorker(u.uri)).findLinks(String(u.uri)); + if (b) + return { + links: b.map(LNe) + }; + } + }), + s.languages.registerCodeActionProvider("yaml", { + async provideCodeActions(u, m, b) { + var f; + const Z = await (await i.getWorker(u.uri)).getCodeAction(String(u.uri), oNe(m), { + diagnostics: ((f = n.get(u)) == null ? void 0 : f.filter((y) => m.intersectRanges(vn(y.range)))) || [], + only: b.only ? [b.only] : void 0, + triggerKind: b.trigger + }); + if (Z) + return { + actions: Z.map(aNe), + dispose() { + } + }; + } + }), + s.languages.registerFoldingRangeProvider("yaml", { + async provideFoldingRanges(u) { + const b = await (await i.getWorker(u.uri)).getFoldingRanges(String(u.uri)); + return b == null ? void 0 : b.map(WNe); + } + }), + s.languages.setLanguageConfiguration("yaml", { + comments: { + lineComment: "#" + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ] + }), + s.languages.registerOnTypeFormattingEditProvider("yaml", { + autoFormatTriggerCharacters: [` +`], + async provideOnTypeFormattingEdits(u, m, b, g) { + const f = await (await i.getWorker(u.uri)).doDocumentOnTypeFormatting( + String(u.uri), + Lu(m), + b, + GNe(g) + ); + return f == null ? void 0 : f.map(_k); + } + }), + s.languages.registerRenameProvider("yaml", { + async provideRenameEdits(u, m, b) { + const Z = await (await i.getWorker(u.uri)).doRename(String(u.uri), Lu(m), b); + if (Z) + return l6(Z); + }, + async resolveRenameLocation(u, m) { + const g = await (await i.getWorker(u.uri)).prepareRename(String(u.uri), Lu(m)); + if (g) + return { range: vn(g), text: "" }; + } + }), + s.languages.registerSelectionRangeProvider("yaml", { + async provideSelectionRanges(u, m) { + const g = await (await i.getWorker(u.uri)).getSelectionRanges( + String(u.uri), + m.map(Lu) + ); + return g == null ? void 0 : g.map(SNe); + } + }) + ]; + return { + dispose() { + var u, m, b, g, Z; + (u = o.get()) == null || u.dispose(), (m = l.get()) == null || m.dispose(), (b = r.get()) == null || b.dispose(), (g = c.get()) == null || g.dispose(), (Z = d.get()) == null || Z.dispose(); + for (const f of h) + f.dispose(); + }, + async update(u) { + var m; + t = TU(u, t), i.updateCreateData(t), a(), await ((m = d.get()) == null ? void 0 : m.revalidate()); + }, + getOptions() { + return t; + } + }; +} +const a6 = "dmFyIFRqPU9iamVjdC5kZWZpbmVQcm9wZXJ0eTt2YXIgcEM9TGU9Pnt0aHJvdyBUeXBlRXJyb3IoTGUpfTt2YXIgTmo9KExlLF9lLE1lKT0+X2UgaW4gTGU/VGooTGUsX2Use2VudW1lcmFibGU6ITAsY29uZmlndXJhYmxlOiEwLHdyaXRhYmxlOiEwLHZhbHVlOk1lfSk6TGVbX2VdPU1lO3ZhciBXZT0oTGUsX2UsTWUpPT5OaihMZSx0eXBlb2YgX2UhPSJzeW1ib2wiP19lKyIiOl9lLE1lKSxRbT0oTGUsX2UsTWUpPT5fZS5oYXMoTGUpfHxwQygiQ2Fubm90ICIrTWUpO3ZhciBvZT0oTGUsX2UsTWUpPT4oUW0oTGUsX2UsInJlYWQgZnJvbSBwcml2YXRlIGZpZWxkIiksTWU/TWUuY2FsbChMZSk6X2UuZ2V0KExlKSksYnQ9KExlLF9lLE1lKT0+X2UuaGFzKExlKT9wQygiQ2Fubm90IGFkZCB0aGUgc2FtZSBwcml2YXRlIG1lbWJlciBtb3JlIHRoYW4gb25jZSIpOl9lIGluc3RhbmNlb2YgV2Vha1NldD9fZS5hZGQoTGUpOl9lLnNldChMZSxNZSksSm49KExlLF9lLE1lLFpvKT0+KFFtKExlLF9lLCJ3cml0ZSB0byBwcml2YXRlIGZpZWxkIiksWm8/Wm8uY2FsbChMZSxNZSk6X2Uuc2V0KExlLE1lKSxNZSksem49KExlLF9lLE1lKT0+KFFtKExlLF9lLCJhY2Nlc3MgcHJpdmF0ZSBtZXRob2QiKSxNZSk7KGZ1bmN0aW9uKCl7InVzZSBzdHJpY3QiO3ZhciBadyxlQyx0QyxuQywkdCxtZSx2dSxyQyxGdSxKcixHbyxLbyxGaSxBdSxlMSxzQyxObixkZixEQyxpQyx3dSx6cixYbyxZbyxBaSxDdSx0MSxvQyxHcixuMSx5ZixhQztjbGFzcyBMZXtjb25zdHJ1Y3Rvcigpe3RoaXMubGlzdGVuZXJzPVtdLHRoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcj1mdW5jdGlvbih0KXtzZXRUaW1lb3V0KCgpPT57dGhyb3cgdC5zdGFjaz9TaS5pc0Vycm9yTm9UZWxlbWV0cnkodCk/bmV3IFNpKHQubWVzc2FnZStgCgpgK3Quc3RhY2spOm5ldyBFcnJvcih0Lm1lc3NhZ2UrYAoKYCt0LnN0YWNrKTp0fSwwKX19ZW1pdCh0KXt0aGlzLmxpc3RlbmVycy5mb3JFYWNoKG49PntuKHQpfSl9b25VbmV4cGVjdGVkRXJyb3IodCl7dGhpcy51bmV4cGVjdGVkRXJyb3JIYW5kbGVyKHQpLHRoaXMuZW1pdCh0KX1vblVuZXhwZWN0ZWRFeHRlcm5hbEVycm9yKHQpe3RoaXMudW5leHBlY3RlZEVycm9ySGFuZGxlcih0KX19Y29uc3QgX2U9bmV3IExlO2Z1bmN0aW9uIE1lKGUpe3ZDKGUpfHxfZS5vblVuZXhwZWN0ZWRFcnJvcihlKX1mdW5jdGlvbiBabyhlKXtpZihlIGluc3RhbmNlb2YgRXJyb3Ipe2NvbnN0e25hbWU6dCxtZXNzYWdlOm59PWUscj1lLnN0YWNrdHJhY2V8fGUuc3RhY2s7cmV0dXJueyRpc0Vycm9yOiEwLG5hbWU6dCxtZXNzYWdlOm4sc3RhY2s6cixub1RlbGVtZXRyeTpTaS5pc0Vycm9yTm9UZWxlbWV0cnkoZSl9fXJldHVybiBlfWNvbnN0IERmPSJDYW5jZWxlZCI7ZnVuY3Rpb24gdkMoZSl7cmV0dXJuIGUgaW5zdGFuY2VvZiBGQz8hMDplIGluc3RhbmNlb2YgRXJyb3ImJmUubmFtZT09PURmJiZlLm1lc3NhZ2U9PT1EZn1jbGFzcyBGQyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKCl7c3VwZXIoRGYpLHRoaXMubmFtZT10aGlzLm1lc3NhZ2V9fWNsYXNzIFNpIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy5uYW1lPSJDb2RlRXhwZWN0ZWRFcnJvciJ9c3RhdGljIGZyb21FcnJvcih0KXtpZih0IGluc3RhbmNlb2YgU2kpcmV0dXJuIHQ7Y29uc3Qgbj1uZXcgU2k7cmV0dXJuIG4ubWVzc2FnZT10Lm1lc3NhZ2Usbi5zdGFjaz10LnN0YWNrLG59c3RhdGljIGlzRXJyb3JOb1RlbGVtZXRyeSh0KXtyZXR1cm4gdC5uYW1lPT09IkNvZGVFeHBlY3RlZEVycm9yIn19Y2xhc3MgenQgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0KXtzdXBlcih0fHwiQW4gdW5leHBlY3RlZCBidWcgb2NjdXJyZWQuIiksT2JqZWN0LnNldFByb3RvdHlwZU9mKHRoaXMsenQucHJvdG90eXBlKX19ZnVuY3Rpb24gQUMoZSx0KXtjb25zdCBuPXRoaXM7bGV0IHI9ITEscztyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcnx8KHI9ITAscz1lLmFwcGx5KG4sYXJndW1lbnRzKSksc319dmFyIGt1OyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KEYpe3JldHVybiBGJiZ0eXBlb2YgRj09Im9iamVjdCImJnR5cGVvZiBGW1N5bWJvbC5pdGVyYXRvcl09PSJmdW5jdGlvbiJ9ZS5pcz10O2NvbnN0IG49T2JqZWN0LmZyZWV6ZShbXSk7ZnVuY3Rpb24gcigpe3JldHVybiBufWUuZW1wdHk9cjtmdW5jdGlvbipzKEYpe3lpZWxkIEZ9ZS5zaW5nbGU9cztmdW5jdGlvbiBpKEYpe3JldHVybiB0KEYpP0Y6cyhGKX1lLndyYXA9aTtmdW5jdGlvbiBvKEYpe3JldHVybiBGfHxufWUuZnJvbT1vO2Z1bmN0aW9uKmEoRil7Zm9yKGxldCB2PUYubGVuZ3RoLTE7dj49MDt2LS0peWllbGQgRlt2XX1lLnJldmVyc2U9YTtmdW5jdGlvbiB1KEYpe3JldHVybiFGfHxGW1N5bWJvbC5pdGVyYXRvcl0oKS5uZXh0KCkuZG9uZT09PSEwfWUuaXNFbXB0eT11O2Z1bmN0aW9uIGwoRil7cmV0dXJuIEZbU3ltYm9sLml0ZXJhdG9yXSgpLm5leHQoKS52YWx1ZX1lLmZpcnN0PWw7ZnVuY3Rpb24gZihGLHYpe2xldCBDPTA7Zm9yKGNvbnN0IEEgb2YgRilpZih2KEEsQysrKSlyZXR1cm4hMDtyZXR1cm4hMX1lLnNvbWU9ZjtmdW5jdGlvbiBjKEYsdil7Zm9yKGNvbnN0IEMgb2YgRilpZih2KEMpKXJldHVybiBDfWUuZmluZD1jO2Z1bmN0aW9uKnAoRix2KXtmb3IoY29uc3QgQyBvZiBGKXYoQykmJih5aWVsZCBDKX1lLmZpbHRlcj1wO2Z1bmN0aW9uKmgoRix2KXtsZXQgQz0wO2Zvcihjb25zdCBBIG9mIEYpeWllbGQgdihBLEMrKyl9ZS5tYXA9aDtmdW5jdGlvbipkKEYsdil7bGV0IEM9MDtmb3IoY29uc3QgQSBvZiBGKXlpZWxkKnYoQSxDKyspfWUuZmxhdE1hcD1kO2Z1bmN0aW9uKm0oLi4uRil7Zm9yKGNvbnN0IHYgb2YgRil5aWVsZCp2fWUuY29uY2F0PW07ZnVuY3Rpb24gZyhGLHYsQyl7bGV0IEE9Qztmb3IoY29uc3QgdyBvZiBGKUE9dihBLHcpO3JldHVybiBBfWUucmVkdWNlPWc7ZnVuY3Rpb24qRChGLHYsQz1GLmxlbmd0aCl7Zm9yKHY8MCYmKHYrPUYubGVuZ3RoKSxDPDA/Qys9Ri5sZW5ndGg6Qz5GLmxlbmd0aCYmKEM9Ri5sZW5ndGgpO3Y8Qzt2KyspeWllbGQgRlt2XX1lLnNsaWNlPUQ7ZnVuY3Rpb24gYihGLHY9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZKXtjb25zdCBDPVtdO2lmKHY9PT0wKXJldHVybltDLEZdO2NvbnN0IEE9RltTeW1ib2wuaXRlcmF0b3JdKCk7Zm9yKGxldCB3PTA7dzx2O3crKyl7Y29uc3QgVD1BLm5leHQoKTtpZihULmRvbmUpcmV0dXJuW0MsZS5lbXB0eSgpXTtDLnB1c2goVC52YWx1ZSl9cmV0dXJuW0Mse1tTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIEF9fV19ZS5jb25zdW1lPWI7YXN5bmMgZnVuY3Rpb24gRShGKXtjb25zdCB2PVtdO2ZvciBhd2FpdChjb25zdCBDIG9mIEYpdi5wdXNoKEMpO3JldHVybiBQcm9taXNlLnJlc29sdmUodil9ZS5hc3luY1RvQXJyYXk9RX0pKGt1fHwoa3U9e30pKTtmdW5jdGlvbiBMaihlKXtyZXR1cm4gZX1mdW5jdGlvbiAkaihlLHQpe31mdW5jdGlvbiByMShlKXtpZihrdS5pcyhlKSl7Y29uc3QgdD1bXTtmb3IoY29uc3QgbiBvZiBlKWlmKG4pdHJ5e24uZGlzcG9zZSgpfWNhdGNoKHIpe3QucHVzaChyKX1pZih0Lmxlbmd0aD09PTEpdGhyb3cgdFswXTtpZih0Lmxlbmd0aD4xKXRocm93IG5ldyBBZ2dyZWdhdGVFcnJvcih0LCJFbmNvdW50ZXJlZCBlcnJvcnMgd2hpbGUgZGlzcG9zaW5nIG9mIHN0b3JlIik7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSk/W106ZX1lbHNlIGlmKGUpcmV0dXJuIGUuZGlzcG9zZSgpLGV9ZnVuY3Rpb24gd0MoLi4uZSl7cmV0dXJuIFR1KCgpPT5yMShlKSl9ZnVuY3Rpb24gVHUoZSl7cmV0dXJue2Rpc3Bvc2U6QUMoKCk9PntlKCl9KX19Y29uc3QgdWY9Y2xhc3MgdWZ7Y29uc3RydWN0b3IoKXt0aGlzLl90b0Rpc3Bvc2U9bmV3IFNldCx0aGlzLl9pc0Rpc3Bvc2VkPSExfWRpc3Bvc2UoKXt0aGlzLl9pc0Rpc3Bvc2VkfHwodGhpcy5faXNEaXNwb3NlZD0hMCx0aGlzLmNsZWFyKCkpfWdldCBpc0Rpc3Bvc2VkKCl7cmV0dXJuIHRoaXMuX2lzRGlzcG9zZWR9Y2xlYXIoKXtpZih0aGlzLl90b0Rpc3Bvc2Uuc2l6ZSE9PTApdHJ5e3IxKHRoaXMuX3RvRGlzcG9zZSl9ZmluYWxseXt0aGlzLl90b0Rpc3Bvc2UuY2xlYXIoKX19YWRkKHQpe2lmKCF0KXJldHVybiB0O2lmKHQ9PT10aGlzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIGEgZGlzcG9zYWJsZSBvbiBpdHNlbGYhIik7cmV0dXJuIHRoaXMuX2lzRGlzcG9zZWQ/dWYuRElTQUJMRV9ESVNQT1NFRF9XQVJOSU5HfHxjb25zb2xlLndhcm4obmV3IEVycm9yKCJUcnlpbmcgdG8gYWRkIGEgZGlzcG9zYWJsZSB0byBhIERpc3Bvc2FibGVTdG9yZSB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gZGlzcG9zZWQgb2YuIFRoZSBhZGRlZCBvYmplY3Qgd2lsbCBiZSBsZWFrZWQhIikuc3RhY2spOnRoaXMuX3RvRGlzcG9zZS5hZGQodCksdH1kZWxldGVBbmRMZWFrKHQpe3QmJnRoaXMuX3RvRGlzcG9zZS5oYXModCkmJnRoaXMuX3RvRGlzcG9zZS5kZWxldGUodCl9fTt1Zi5ESVNBQkxFX0RJU1BPU0VEX1dBUk5JTkc9ITE7bGV0IGVhPXVmO2NvbnN0IFltPWNsYXNzIFlte2NvbnN0cnVjdG9yKCl7dGhpcy5fc3RvcmU9bmV3IGVhLHRoaXMuX3N0b3JlfWRpc3Bvc2UoKXt0aGlzLl9zdG9yZS5kaXNwb3NlKCl9X3JlZ2lzdGVyKHQpe2lmKHQ9PT10aGlzKXRocm93IG5ldyBFcnJvcigiQ2Fubm90IHJlZ2lzdGVyIGEgZGlzcG9zYWJsZSBvbiBpdHNlbGYhIik7cmV0dXJuIHRoaXMuX3N0b3JlLmFkZCh0KX19O1ltLk5vbmU9T2JqZWN0LmZyZWV6ZSh7ZGlzcG9zZSgpe319KTtsZXQgeGk9WW07Y29uc3QgcW89Y2xhc3MgcW97Y29uc3RydWN0b3IodCl7dGhpcy5lbGVtZW50PXQsdGhpcy5uZXh0PXFvLlVuZGVmaW5lZCx0aGlzLnByZXY9cW8uVW5kZWZpbmVkfX07cW8uVW5kZWZpbmVkPW5ldyBxbyh2b2lkIDApO2xldCAkZT1xbztjbGFzcyBDQ3tjb25zdHJ1Y3Rvcigpe3RoaXMuX2ZpcnN0PSRlLlVuZGVmaW5lZCx0aGlzLl9sYXN0PSRlLlVuZGVmaW5lZCx0aGlzLl9zaXplPTB9Z2V0IHNpemUoKXtyZXR1cm4gdGhpcy5fc2l6ZX1pc0VtcHR5KCl7cmV0dXJuIHRoaXMuX2ZpcnN0PT09JGUuVW5kZWZpbmVkfWNsZWFyKCl7bGV0IHQ9dGhpcy5fZmlyc3Q7Zm9yKDt0IT09JGUuVW5kZWZpbmVkOyl7Y29uc3Qgbj10Lm5leHQ7dC5wcmV2PSRlLlVuZGVmaW5lZCx0Lm5leHQ9JGUuVW5kZWZpbmVkLHQ9bn10aGlzLl9maXJzdD0kZS5VbmRlZmluZWQsdGhpcy5fbGFzdD0kZS5VbmRlZmluZWQsdGhpcy5fc2l6ZT0wfXVuc2hpZnQodCl7cmV0dXJuIHRoaXMuX2luc2VydCh0LCExKX1wdXNoKHQpe3JldHVybiB0aGlzLl9pbnNlcnQodCwhMCl9X2luc2VydCh0LG4pe2NvbnN0IHI9bmV3ICRlKHQpO2lmKHRoaXMuX2ZpcnN0PT09JGUuVW5kZWZpbmVkKXRoaXMuX2ZpcnN0PXIsdGhpcy5fbGFzdD1yO2Vsc2UgaWYobil7Y29uc3QgaT10aGlzLl9sYXN0O3RoaXMuX2xhc3Q9cixyLnByZXY9aSxpLm5leHQ9cn1lbHNle2NvbnN0IGk9dGhpcy5fZmlyc3Q7dGhpcy5fZmlyc3Q9cixyLm5leHQ9aSxpLnByZXY9cn10aGlzLl9zaXplKz0xO2xldCBzPSExO3JldHVybigpPT57c3x8KHM9ITAsdGhpcy5fcmVtb3ZlKHIpKX19c2hpZnQoKXtpZih0aGlzLl9maXJzdCE9PSRlLlVuZGVmaW5lZCl7Y29uc3QgdD10aGlzLl9maXJzdC5lbGVtZW50O3JldHVybiB0aGlzLl9yZW1vdmUodGhpcy5fZmlyc3QpLHR9fXBvcCgpe2lmKHRoaXMuX2xhc3QhPT0kZS5VbmRlZmluZWQpe2NvbnN0IHQ9dGhpcy5fbGFzdC5lbGVtZW50O3JldHVybiB0aGlzLl9yZW1vdmUodGhpcy5fbGFzdCksdH19X3JlbW92ZSh0KXtpZih0LnByZXYhPT0kZS5VbmRlZmluZWQmJnQubmV4dCE9PSRlLlVuZGVmaW5lZCl7Y29uc3Qgbj10LnByZXY7bi5uZXh0PXQubmV4dCx0Lm5leHQucHJldj1ufWVsc2UgdC5wcmV2PT09JGUuVW5kZWZpbmVkJiZ0Lm5leHQ9PT0kZS5VbmRlZmluZWQ/KHRoaXMuX2ZpcnN0PSRlLlVuZGVmaW5lZCx0aGlzLl9sYXN0PSRlLlVuZGVmaW5lZCk6dC5uZXh0PT09JGUuVW5kZWZpbmVkPyh0aGlzLl9sYXN0PXRoaXMuX2xhc3QucHJldix0aGlzLl9sYXN0Lm5leHQ9JGUuVW5kZWZpbmVkKTp0LnByZXY9PT0kZS5VbmRlZmluZWQmJih0aGlzLl9maXJzdD10aGlzLl9maXJzdC5uZXh0LHRoaXMuX2ZpcnN0LnByZXY9JGUuVW5kZWZpbmVkKTt0aGlzLl9zaXplLT0xfSpbU3ltYm9sLml0ZXJhdG9yXSgpe2xldCB0PXRoaXMuX2ZpcnN0O2Zvcig7dCE9PSRlLlVuZGVmaW5lZDspeWllbGQgdC5lbGVtZW50LHQ9dC5uZXh0fX1jb25zdCBTQz1nbG9iYWxUaGlzLnBlcmZvcm1hbmNlJiZ0eXBlb2YgZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZS5ub3c9PSJmdW5jdGlvbiI7Y2xhc3MgTnV7c3RhdGljIGNyZWF0ZSh0KXtyZXR1cm4gbmV3IE51KHQpfWNvbnN0cnVjdG9yKHQpe3RoaXMuX25vdz1TQyYmdD09PSExP0RhdGUubm93Omdsb2JhbFRoaXMucGVyZm9ybWFuY2Uubm93LmJpbmQoZ2xvYmFsVGhpcy5wZXJmb3JtYW5jZSksdGhpcy5fc3RhcnRUaW1lPXRoaXMuX25vdygpLHRoaXMuX3N0b3BUaW1lPS0xfXN0b3AoKXt0aGlzLl9zdG9wVGltZT10aGlzLl9ub3coKX1yZXNldCgpe3RoaXMuX3N0YXJ0VGltZT10aGlzLl9ub3coKSx0aGlzLl9zdG9wVGltZT0tMX1lbGFwc2VkKCl7cmV0dXJuIHRoaXMuX3N0b3BUaW1lIT09LTE/dGhpcy5fc3RvcFRpbWUtdGhpcy5fc3RhcnRUaW1lOnRoaXMuX25vdygpLXRoaXMuX3N0YXJ0VGltZX19dmFyIEx1OyhmdW5jdGlvbihlKXtlLk5vbmU9KCk9PnhpLk5vbmU7ZnVuY3Rpb24gdChTLGspe3JldHVybiBwKFMsKCk9Pnt9LDAsdm9pZCAwLCEwLHZvaWQgMCxrKX1lLmRlZmVyPXQ7ZnVuY3Rpb24gbihTKXtyZXR1cm4oayxJPW51bGwsTSk9PntsZXQgaj0hMSxVO3JldHVybiBVPVMoVj0+e2lmKCFqKXJldHVybiBVP1UuZGlzcG9zZSgpOmo9ITAsay5jYWxsKEksVil9LG51bGwsTSksaiYmVS5kaXNwb3NlKCksVX19ZS5vbmNlPW47ZnVuY3Rpb24gcihTLGspe3JldHVybiBlLm9uY2UoZS5maWx0ZXIoUyxrKSl9ZS5vbmNlSWY9cjtmdW5jdGlvbiBzKFMsayxJKXtyZXR1cm4gZigoTSxqPW51bGwsVSk9PlMoVj0+TS5jYWxsKGosayhWKSksbnVsbCxVKSxJKX1lLm1hcD1zO2Z1bmN0aW9uIGkoUyxrLEkpe3JldHVybiBmKChNLGo9bnVsbCxVKT0+UyhWPT57ayhWKSxNLmNhbGwoaixWKX0sbnVsbCxVKSxJKX1lLmZvckVhY2g9aTtmdW5jdGlvbiBvKFMsayxJKXtyZXR1cm4gZigoTSxqPW51bGwsVSk9PlMoVj0+ayhWKSYmTS5jYWxsKGosViksbnVsbCxVKSxJKX1lLmZpbHRlcj1vO2Z1bmN0aW9uIGEoUyl7cmV0dXJuIFN9ZS5zaWduYWw9YTtmdW5jdGlvbiB1KC4uLlMpe3JldHVybihrLEk9bnVsbCxNKT0+e2NvbnN0IGo9d0MoLi4uUy5tYXAoVT0+VShWPT5rLmNhbGwoSSxWKSkpKTtyZXR1cm4gYyhqLE0pfX1lLmFueT11O2Z1bmN0aW9uIGwoUyxrLEksTSl7bGV0IGo9STtyZXR1cm4gcyhTLFU9PihqPWsoaixVKSxqKSxNKX1lLnJlZHVjZT1sO2Z1bmN0aW9uIGYoUyxrKXtsZXQgSTtjb25zdCBNPXtvbldpbGxBZGRGaXJzdExpc3RlbmVyKCl7ST1TKGouZmlyZSxqKX0sb25EaWRSZW1vdmVMYXN0TGlzdGVuZXIoKXtJPT1udWxsfHxJLmRpc3Bvc2UoKX19LGo9bmV3IGxuKE0pO3JldHVybiBrPT1udWxsfHxrLmFkZChqKSxqLmV2ZW50fWZ1bmN0aW9uIGMoUyxrKXtyZXR1cm4gayBpbnN0YW5jZW9mIEFycmF5P2sucHVzaChTKTprJiZrLmFkZChTKSxTfWZ1bmN0aW9uIHAoUyxrLEk9MTAwLE09ITEsaj0hMSxVLFYpe2xldCBuZSxOZSxXLHRlPTAscGU7Y29uc3QgX3Q9e2xlYWtXYXJuaW5nVGhyZXNob2xkOlUsb25XaWxsQWRkRmlyc3RMaXN0ZW5lcigpe25lPVMoeXQ9Pnt0ZSsrLE5lPWsoTmUseXQpLE0mJiFXJiYoUGUuZmlyZShOZSksTmU9dm9pZCAwKSxwZT0oKT0+e2NvbnN0IER0PU5lO05lPXZvaWQgMCxXPXZvaWQgMCwoIU18fHRlPjEpJiZQZS5maXJlKER0KSx0ZT0wfSx0eXBlb2YgST09Im51bWJlciI/KGNsZWFyVGltZW91dChXKSxXPXNldFRpbWVvdXQocGUsSSkpOlc9PT12b2lkIDAmJihXPTAscXVldWVNaWNyb3Rhc2socGUpKX0pfSxvbldpbGxSZW1vdmVMaXN0ZW5lcigpe2omJnRlPjAmJihwZT09bnVsbHx8cGUoKSl9LG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyKCl7cGU9dm9pZCAwLG5lLmRpc3Bvc2UoKX19LFBlPW5ldyBsbihfdCk7cmV0dXJuIFY9PW51bGx8fFYuYWRkKFBlKSxQZS5ldmVudH1lLmRlYm91bmNlPXA7ZnVuY3Rpb24gaChTLGs9MCxJKXtyZXR1cm4gZS5kZWJvdW5jZShTLChNLGopPT5NPyhNLnB1c2goaiksTSk6W2pdLGssdm9pZCAwLCEwLHZvaWQgMCxJKX1lLmFjY3VtdWxhdGU9aDtmdW5jdGlvbiBkKFMsaz0oTSxqKT0+TT09PWosSSl7bGV0IE09ITAsajtyZXR1cm4gbyhTLFU9Pntjb25zdCBWPU18fCFrKFUsaik7cmV0dXJuIE09ITEsaj1VLFZ9LEkpfWUubGF0Y2g9ZDtmdW5jdGlvbiBtKFMsayxJKXtyZXR1cm5bZS5maWx0ZXIoUyxrLEkpLGUuZmlsdGVyKFMsTT0+IWsoTSksSSldfWUuc3BsaXQ9bTtmdW5jdGlvbiBnKFMsaz0hMSxJPVtdLE0pe2xldCBqPUkuc2xpY2UoKSxVPVMoTmU9PntqP2oucHVzaChOZSk6bmUuZmlyZShOZSl9KTtNJiZNLmFkZChVKTtjb25zdCBWPSgpPT57aj09bnVsbHx8ai5mb3JFYWNoKE5lPT5uZS5maXJlKE5lKSksaj1udWxsfSxuZT1uZXcgbG4oe29uV2lsbEFkZEZpcnN0TGlzdGVuZXIoKXtVfHwoVT1TKE5lPT5uZS5maXJlKE5lKSksTSYmTS5hZGQoVSkpfSxvbkRpZEFkZEZpcnN0TGlzdGVuZXIoKXtqJiYoaz9zZXRUaW1lb3V0KFYpOlYoKSl9LG9uRGlkUmVtb3ZlTGFzdExpc3RlbmVyKCl7VSYmVS5kaXNwb3NlKCksVT1udWxsfX0pO3JldHVybiBNJiZNLmFkZChuZSksbmUuZXZlbnR9ZS5idWZmZXI9ZztmdW5jdGlvbiBEKFMsayl7cmV0dXJuKE0saixVKT0+e2NvbnN0IFY9ayhuZXcgRSk7cmV0dXJuIFMoZnVuY3Rpb24obmUpe2NvbnN0IE5lPVYuZXZhbHVhdGUobmUpO05lIT09YiYmTS5jYWxsKGosTmUpfSx2b2lkIDAsVSl9fWUuY2hhaW49RDtjb25zdCBiPVN5bWJvbCgiSGFsdENoYWluYWJsZSIpO2NsYXNzIEV7Y29uc3RydWN0b3IoKXt0aGlzLnN0ZXBzPVtdfW1hcChrKXtyZXR1cm4gdGhpcy5zdGVwcy5wdXNoKGspLHRoaXN9Zm9yRWFjaChrKXtyZXR1cm4gdGhpcy5zdGVwcy5wdXNoKEk9PihrKEkpLEkpKSx0aGlzfWZpbHRlcihrKXtyZXR1cm4gdGhpcy5zdGVwcy5wdXNoKEk9PmsoSSk/STpiKSx0aGlzfXJlZHVjZShrLEkpe2xldCBNPUk7cmV0dXJuIHRoaXMuc3RlcHMucHVzaChqPT4oTT1rKE0saiksTSkpLHRoaXN9bGF0Y2goaz0oSSxNKT0+ST09PU0pe2xldCBJPSEwLE07cmV0dXJuIHRoaXMuc3RlcHMucHVzaChqPT57Y29uc3QgVT1JfHwhayhqLE0pO3JldHVybiBJPSExLE09aixVP2o6Yn0pLHRoaXN9ZXZhbHVhdGUoayl7Zm9yKGNvbnN0IEkgb2YgdGhpcy5zdGVwcylpZihrPUkoayksaz09PWIpYnJlYWs7cmV0dXJuIGt9fWZ1bmN0aW9uIEYoUyxrLEk9TT0+TSl7Y29uc3QgTT0oLi4ubmUpPT5WLmZpcmUoSSguLi5uZSkpLGo9KCk9PlMub24oayxNKSxVPSgpPT5TLnJlbW92ZUxpc3RlbmVyKGssTSksVj1uZXcgbG4oe29uV2lsbEFkZEZpcnN0TGlzdGVuZXI6aixvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcjpVfSk7cmV0dXJuIFYuZXZlbnR9ZS5mcm9tTm9kZUV2ZW50RW1pdHRlcj1GO2Z1bmN0aW9uIHYoUyxrLEk9TT0+TSl7Y29uc3QgTT0oLi4ubmUpPT5WLmZpcmUoSSguLi5uZSkpLGo9KCk9PlMuYWRkRXZlbnRMaXN0ZW5lcihrLE0pLFU9KCk9PlMucmVtb3ZlRXZlbnRMaXN0ZW5lcihrLE0pLFY9bmV3IGxuKHtvbldpbGxBZGRGaXJzdExpc3RlbmVyOmosb25EaWRSZW1vdmVMYXN0TGlzdGVuZXI6VX0pO3JldHVybiBWLmV2ZW50fWUuZnJvbURPTUV2ZW50RW1pdHRlcj12O2Z1bmN0aW9uIEMoUyl7cmV0dXJuIG5ldyBQcm9taXNlKGs9Pm4oUykoaykpfWUudG9Qcm9taXNlPUM7ZnVuY3Rpb24gQShTKXtjb25zdCBrPW5ldyBsbjtyZXR1cm4gUy50aGVuKEk9PntrLmZpcmUoSSl9LCgpPT57ay5maXJlKHZvaWQgMCl9KS5maW5hbGx5KCgpPT57ay5kaXNwb3NlKCl9KSxrLmV2ZW50fWUuZnJvbVByb21pc2U9QTtmdW5jdGlvbiB3KFMsayl7cmV0dXJuIFMoST0+ay5maXJlKEkpKX1lLmZvcndhcmQ9dztmdW5jdGlvbiBUKFMsayxJKXtyZXR1cm4gayhJKSxTKE09PmsoTSkpfWUucnVuQW5kU3Vic2NyaWJlPVQ7Y2xhc3MgTntjb25zdHJ1Y3RvcihrLEkpe3RoaXMuX29ic2VydmFibGU9ayx0aGlzLl9jb3VudGVyPTAsdGhpcy5faGFzQ2hhbmdlZD0hMTtjb25zdCBNPXtvbldpbGxBZGRGaXJzdExpc3RlbmVyOigpPT57ay5hZGRPYnNlcnZlcih0aGlzKSx0aGlzLl9vYnNlcnZhYmxlLnJlcG9ydENoYW5nZXMoKX0sb25EaWRSZW1vdmVMYXN0TGlzdGVuZXI6KCk9PntrLnJlbW92ZU9ic2VydmVyKHRoaXMpfX07dGhpcy5lbWl0dGVyPW5ldyBsbihNKSxJJiZJLmFkZCh0aGlzLmVtaXR0ZXIpfWJlZ2luVXBkYXRlKGspe3RoaXMuX2NvdW50ZXIrK31oYW5kbGVQb3NzaWJsZUNoYW5nZShrKXt9aGFuZGxlQ2hhbmdlKGssSSl7dGhpcy5faGFzQ2hhbmdlZD0hMH1lbmRVcGRhdGUoayl7dGhpcy5fY291bnRlci0tLHRoaXMuX2NvdW50ZXI9PT0wJiYodGhpcy5fb2JzZXJ2YWJsZS5yZXBvcnRDaGFuZ2VzKCksdGhpcy5faGFzQ2hhbmdlZCYmKHRoaXMuX2hhc0NoYW5nZWQ9ITEsdGhpcy5lbWl0dGVyLmZpcmUodGhpcy5fb2JzZXJ2YWJsZS5nZXQoKSkpKX19ZnVuY3Rpb24geChTLGspe3JldHVybiBuZXcgTihTLGspLmVtaXR0ZXIuZXZlbnR9ZS5mcm9tT2JzZXJ2YWJsZT14O2Z1bmN0aW9uIEwoUyl7cmV0dXJuKGssSSxNKT0+e2xldCBqPTAsVT0hMTtjb25zdCBWPXtiZWdpblVwZGF0ZSgpe2orK30sZW5kVXBkYXRlKCl7ai0tLGo9PT0wJiYoUy5yZXBvcnRDaGFuZ2VzKCksVSYmKFU9ITEsay5jYWxsKEkpKSl9LGhhbmRsZVBvc3NpYmxlQ2hhbmdlKCl7fSxoYW5kbGVDaGFuZ2UoKXtVPSEwfX07Uy5hZGRPYnNlcnZlcihWKSxTLnJlcG9ydENoYW5nZXMoKTtjb25zdCBuZT17ZGlzcG9zZSgpe1MucmVtb3ZlT2JzZXJ2ZXIoVil9fTtyZXR1cm4gTSBpbnN0YW5jZW9mIGVhP00uYWRkKG5lKTpBcnJheS5pc0FycmF5KE0pJiZNLnB1c2gobmUpLG5lfX1lLmZyb21PYnNlcnZhYmxlTGlnaHQ9TH0pKEx1fHwoTHU9e30pKTtjb25zdCBXbz1jbGFzcyBXb3tjb25zdHJ1Y3Rvcih0KXt0aGlzLmxpc3RlbmVyQ291bnQ9MCx0aGlzLmludm9jYXRpb25Db3VudD0wLHRoaXMuZWxhcHNlZE92ZXJhbGw9MCx0aGlzLmR1cmF0aW9ucz1bXSx0aGlzLm5hbWU9YCR7dH1fJHtXby5faWRQb29sKyt9YCxXby5hbGwuYWRkKHRoaXMpfXN0YXJ0KHQpe3RoaXMuX3N0b3BXYXRjaD1uZXcgTnUsdGhpcy5saXN0ZW5lckNvdW50PXR9c3RvcCgpe2lmKHRoaXMuX3N0b3BXYXRjaCl7Y29uc3QgdD10aGlzLl9zdG9wV2F0Y2guZWxhcHNlZCgpO3RoaXMuZHVyYXRpb25zLnB1c2godCksdGhpcy5lbGFwc2VkT3ZlcmFsbCs9dCx0aGlzLmludm9jYXRpb25Db3VudCs9MSx0aGlzLl9zdG9wV2F0Y2g9dm9pZCAwfX19O1dvLmFsbD1uZXcgU2V0LFdvLl9pZFBvb2w9MDtsZXQgYmY9V28seEM9LTE7Y29uc3QgbGY9Y2xhc3MgbGZ7Y29uc3RydWN0b3IodCxuLHI9KGxmLl9pZFBvb2wrKykudG9TdHJpbmcoMTYpLnBhZFN0YXJ0KDMsIjAiKSl7dGhpcy5fZXJyb3JIYW5kbGVyPXQsdGhpcy50aHJlc2hvbGQ9bix0aGlzLm5hbWU9cix0aGlzLl93YXJuQ291bnRkb3duPTB9ZGlzcG9zZSgpe3ZhciB0Oyh0PXRoaXMuX3N0YWNrcyk9PW51bGx8fHQuY2xlYXIoKX1jaGVjayh0LG4pe2NvbnN0IHI9dGhpcy50aHJlc2hvbGQ7aWYocjw9MHx8bjxyKXJldHVybjt0aGlzLl9zdGFja3N8fCh0aGlzLl9zdGFja3M9bmV3IE1hcCk7Y29uc3Qgcz10aGlzLl9zdGFja3MuZ2V0KHQudmFsdWUpfHwwO2lmKHRoaXMuX3N0YWNrcy5zZXQodC52YWx1ZSxzKzEpLHRoaXMuX3dhcm5Db3VudGRvd24tPTEsdGhpcy5fd2FybkNvdW50ZG93bjw9MCl7dGhpcy5fd2FybkNvdW50ZG93bj1yKi41O2NvbnN0W2ksb109dGhpcy5nZXRNb3N0RnJlcXVlbnRTdGFjaygpLGE9YFske3RoaXMubmFtZX1dIHBvdGVudGlhbCBsaXN0ZW5lciBMRUFLIGRldGVjdGVkLCBoYXZpbmcgJHtufSBsaXN0ZW5lcnMgYWxyZWFkeS4gTU9TVCBmcmVxdWVudCBsaXN0ZW5lciAoJHtvfSk6YDtjb25zb2xlLndhcm4oYSksY29uc29sZS53YXJuKGkpO2NvbnN0IHU9bmV3IGtDKGEsaSk7dGhpcy5fZXJyb3JIYW5kbGVyKHUpfXJldHVybigpPT57Y29uc3QgaT10aGlzLl9zdGFja3MuZ2V0KHQudmFsdWUpfHwwO3RoaXMuX3N0YWNrcy5zZXQodC52YWx1ZSxpLTEpfX1nZXRNb3N0RnJlcXVlbnRTdGFjaygpe2lmKCF0aGlzLl9zdGFja3MpcmV0dXJuO2xldCB0LG49MDtmb3IoY29uc3RbcixzXW9mIHRoaXMuX3N0YWNrcykoIXR8fG48cykmJih0PVtyLHNdLG49cyk7cmV0dXJuIHR9fTtsZi5faWRQb29sPTE7bGV0IEVmPWxmO2NsYXNzIHZme3N0YXRpYyBjcmVhdGUoKXtjb25zdCB0PW5ldyBFcnJvcjtyZXR1cm4gbmV3IHZmKHQuc3RhY2s/PyIiKX1jb25zdHJ1Y3Rvcih0KXt0aGlzLnZhbHVlPXR9cHJpbnQoKXtjb25zb2xlLndhcm4odGhpcy52YWx1ZS5zcGxpdChgCmApLnNsaWNlKDIpLmpvaW4oYApgKSl9fWNsYXNzIGtDIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxuKXtzdXBlcih0KSx0aGlzLm5hbWU9Ikxpc3RlbmVyTGVha0Vycm9yIix0aGlzLnN0YWNrPW59fWNsYXNzIFRDIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxuKXtzdXBlcih0KSx0aGlzLm5hbWU9Ikxpc3RlbmVyUmVmdXNhbEVycm9yIix0aGlzLnN0YWNrPW59fWNsYXNzIEZme2NvbnN0cnVjdG9yKHQpe3RoaXMudmFsdWU9dH19Y29uc3QgTkM9MjtjbGFzcyBsbntjb25zdHJ1Y3Rvcih0KXt2YXIgbixyLHMsaTt0aGlzLl9zaXplPTAsdGhpcy5fb3B0aW9ucz10LHRoaXMuX2xlYWthZ2VNb249KG49dGhpcy5fb3B0aW9ucykhPW51bGwmJm4ubGVha1dhcm5pbmdUaHJlc2hvbGQ/bmV3IEVmKCh0PT1udWxsP3ZvaWQgMDp0Lm9uTGlzdGVuZXJFcnJvcik/P01lLCgocj10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6ci5sZWFrV2FybmluZ1RocmVzaG9sZCk/P3hDKTp2b2lkIDAsdGhpcy5fcGVyZk1vbj0ocz10aGlzLl9vcHRpb25zKSE9bnVsbCYmcy5fcHJvZk5hbWU/bmV3IGJmKHRoaXMuX29wdGlvbnMuX3Byb2ZOYW1lKTp2b2lkIDAsdGhpcy5fZGVsaXZlcnlRdWV1ZT0oaT10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6aS5kZWxpdmVyeVF1ZXVlfWRpc3Bvc2UoKXt2YXIgdCxuLHIsczt0aGlzLl9kaXNwb3NlZHx8KHRoaXMuX2Rpc3Bvc2VkPSEwLCgodD10aGlzLl9kZWxpdmVyeVF1ZXVlKT09bnVsbD92b2lkIDA6dC5jdXJyZW50KT09PXRoaXMmJnRoaXMuX2RlbGl2ZXJ5UXVldWUucmVzZXQoKSx0aGlzLl9saXN0ZW5lcnMmJih0aGlzLl9saXN0ZW5lcnM9dm9pZCAwLHRoaXMuX3NpemU9MCksKHI9KG49dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOm4ub25EaWRSZW1vdmVMYXN0TGlzdGVuZXIpPT1udWxsfHxyLmNhbGwobiksKHM9dGhpcy5fbGVha2FnZU1vbik9PW51bGx8fHMuZGlzcG9zZSgpKX1nZXQgZXZlbnQoKXtyZXR1cm4gdGhpcy5fZXZlbnQ/Pyh0aGlzLl9ldmVudD0odCxuLHIpPT57dmFyIGEsdSxsLGYsYztpZih0aGlzLl9sZWFrYWdlTW9uJiZ0aGlzLl9zaXplPnRoaXMuX2xlYWthZ2VNb24udGhyZXNob2xkKioyKXtjb25zdCBwPWBbJHt0aGlzLl9sZWFrYWdlTW9uLm5hbWV9XSBSRUZVU0VTIHRvIGFjY2VwdCBuZXcgbGlzdGVuZXJzIGJlY2F1c2UgaXQgZXhjZWVkZWQgaXRzIHRocmVzaG9sZCBieSBmYXIgKCR7dGhpcy5fc2l6ZX0gdnMgJHt0aGlzLl9sZWFrYWdlTW9uLnRocmVzaG9sZH0pYDtjb25zb2xlLndhcm4ocCk7Y29uc3QgaD10aGlzLl9sZWFrYWdlTW9uLmdldE1vc3RGcmVxdWVudFN0YWNrKCk/P1siVU5LTk9XTiBzdGFjayIsLTFdLGQ9bmV3IFRDKGAke3B9LiBISU5UOiBTdGFjayBzaG93cyBtb3N0IGZyZXF1ZW50IGxpc3RlbmVyICgke2hbMV19LXRpbWVzKWAsaFswXSk7cmV0dXJuKCgoYT10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6YS5vbkxpc3RlbmVyRXJyb3IpfHxNZSkoZCkseGkuTm9uZX1pZih0aGlzLl9kaXNwb3NlZClyZXR1cm4geGkuTm9uZTtuJiYodD10LmJpbmQobikpO2NvbnN0IHM9bmV3IEZmKHQpO2xldCBpO3RoaXMuX2xlYWthZ2VNb24mJnRoaXMuX3NpemU+PU1hdGguY2VpbCh0aGlzLl9sZWFrYWdlTW9uLnRocmVzaG9sZCouMikmJihzLnN0YWNrPXZmLmNyZWF0ZSgpLGk9dGhpcy5fbGVha2FnZU1vbi5jaGVjayhzLnN0YWNrLHRoaXMuX3NpemUrMSkpLHRoaXMuX2xpc3RlbmVycz90aGlzLl9saXN0ZW5lcnMgaW5zdGFuY2VvZiBGZj8odGhpcy5fZGVsaXZlcnlRdWV1ZT8/KHRoaXMuX2RlbGl2ZXJ5UXVldWU9bmV3IExDKSx0aGlzLl9saXN0ZW5lcnM9W3RoaXMuX2xpc3RlbmVycyxzXSk6dGhpcy5fbGlzdGVuZXJzLnB1c2gocyk6KChsPSh1PXRoaXMuX29wdGlvbnMpPT1udWxsP3ZvaWQgMDp1Lm9uV2lsbEFkZEZpcnN0TGlzdGVuZXIpPT1udWxsfHxsLmNhbGwodSx0aGlzKSx0aGlzLl9saXN0ZW5lcnM9cywoYz0oZj10aGlzLl9vcHRpb25zKT09bnVsbD92b2lkIDA6Zi5vbkRpZEFkZEZpcnN0TGlzdGVuZXIpPT1udWxsfHxjLmNhbGwoZix0aGlzKSksdGhpcy5fc2l6ZSsrO2NvbnN0IG89VHUoKCk9PntpPT1udWxsfHxpKCksdGhpcy5fcmVtb3ZlTGlzdGVuZXIocyl9KTtyZXR1cm4gciBpbnN0YW5jZW9mIGVhP3IuYWRkKG8pOkFycmF5LmlzQXJyYXkocikmJnIucHVzaChvKSxvfSksdGhpcy5fZXZlbnR9X3JlbW92ZUxpc3RlbmVyKHQpe3ZhciBpLG8sYSx1O2lmKChvPShpPXRoaXMuX29wdGlvbnMpPT1udWxsP3ZvaWQgMDppLm9uV2lsbFJlbW92ZUxpc3RlbmVyKT09bnVsbHx8by5jYWxsKGksdGhpcyksIXRoaXMuX2xpc3RlbmVycylyZXR1cm47aWYodGhpcy5fc2l6ZT09PTEpe3RoaXMuX2xpc3RlbmVycz12b2lkIDAsKHU9KGE9dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOmEub25EaWRSZW1vdmVMYXN0TGlzdGVuZXIpPT1udWxsfHx1LmNhbGwoYSx0aGlzKSx0aGlzLl9zaXplPTA7cmV0dXJufWNvbnN0IG49dGhpcy5fbGlzdGVuZXJzLHI9bi5pbmRleE9mKHQpO2lmKHI9PT0tMSl0aHJvdyBjb25zb2xlLmxvZygiZGlzcG9zZWQ/Iix0aGlzLl9kaXNwb3NlZCksY29uc29sZS5sb2coInNpemU/Iix0aGlzLl9zaXplKSxjb25zb2xlLmxvZygiYXJyPyIsSlNPTi5zdHJpbmdpZnkodGhpcy5fbGlzdGVuZXJzKSksbmV3IEVycm9yKCJBdHRlbXB0ZWQgdG8gZGlzcG9zZSB1bmtub3duIGxpc3RlbmVyIik7dGhpcy5fc2l6ZS0tLG5bcl09dm9pZCAwO2NvbnN0IHM9dGhpcy5fZGVsaXZlcnlRdWV1ZS5jdXJyZW50PT09dGhpcztpZih0aGlzLl9zaXplKk5DPD1uLmxlbmd0aCl7bGV0IGw9MDtmb3IobGV0IGY9MDtmPG4ubGVuZ3RoO2YrKyluW2ZdP25bbCsrXT1uW2ZdOnMmJih0aGlzLl9kZWxpdmVyeVF1ZXVlLmVuZC0tLGw8dGhpcy5fZGVsaXZlcnlRdWV1ZS5pJiZ0aGlzLl9kZWxpdmVyeVF1ZXVlLmktLSk7bi5sZW5ndGg9bH19X2RlbGl2ZXIodCxuKXt2YXIgcztpZighdClyZXR1cm47Y29uc3Qgcj0oKHM9dGhpcy5fb3B0aW9ucyk9PW51bGw/dm9pZCAwOnMub25MaXN0ZW5lckVycm9yKXx8TWU7aWYoIXIpe3QudmFsdWUobik7cmV0dXJufXRyeXt0LnZhbHVlKG4pfWNhdGNoKGkpe3IoaSl9fV9kZWxpdmVyUXVldWUodCl7Y29uc3Qgbj10LmN1cnJlbnQuX2xpc3RlbmVycztmb3IoO3QuaTx0LmVuZDspdGhpcy5fZGVsaXZlcihuW3QuaSsrXSx0LnZhbHVlKTt0LnJlc2V0KCl9ZmlyZSh0KXt2YXIgbixyLHMsaTtpZigobj10aGlzLl9kZWxpdmVyeVF1ZXVlKSE9bnVsbCYmbi5jdXJyZW50JiYodGhpcy5fZGVsaXZlclF1ZXVlKHRoaXMuX2RlbGl2ZXJ5UXVldWUpLChyPXRoaXMuX3BlcmZNb24pPT1udWxsfHxyLnN0b3AoKSksKHM9dGhpcy5fcGVyZk1vbik9PW51bGx8fHMuc3RhcnQodGhpcy5fc2l6ZSksdGhpcy5fbGlzdGVuZXJzKWlmKHRoaXMuX2xpc3RlbmVycyBpbnN0YW5jZW9mIEZmKXRoaXMuX2RlbGl2ZXIodGhpcy5fbGlzdGVuZXJzLHQpO2Vsc2V7Y29uc3Qgbz10aGlzLl9kZWxpdmVyeVF1ZXVlO28uZW5xdWV1ZSh0aGlzLHQsdGhpcy5fbGlzdGVuZXJzLmxlbmd0aCksdGhpcy5fZGVsaXZlclF1ZXVlKG8pfShpPXRoaXMuX3BlcmZNb24pPT1udWxsfHxpLnN0b3AoKX1oYXNMaXN0ZW5lcnMoKXtyZXR1cm4gdGhpcy5fc2l6ZT4wfX1jbGFzcyBMQ3tjb25zdHJ1Y3Rvcigpe3RoaXMuaT0tMSx0aGlzLmVuZD0wfWVucXVldWUodCxuLHIpe3RoaXMuaT0wLHRoaXMuZW5kPXIsdGhpcy5jdXJyZW50PXQsdGhpcy52YWx1ZT1ufXJlc2V0KCl7dGhpcy5pPXRoaXMuZW5kLHRoaXMuY3VycmVudD12b2lkIDAsdGhpcy52YWx1ZT12b2lkIDB9fWZ1bmN0aW9uICRDKCl7cmV0dXJuIGdsb2JhbFRoaXMuX1ZTQ09ERV9OTFNfTUVTU0FHRVN9ZnVuY3Rpb24gczEoKXtyZXR1cm4gZ2xvYmFsVGhpcy5fVlNDT0RFX05MU19MQU5HVUFHRX1jb25zdCBCQz1zMSgpPT09InBzZXVkbyJ8fHR5cGVvZiBkb2N1bWVudDwidSImJmRvY3VtZW50LmxvY2F0aW9uJiZkb2N1bWVudC5sb2NhdGlvbi5oYXNoLmluZGV4T2YoInBzZXVkbz10cnVlIik+PTA7ZnVuY3Rpb24gaTEoZSx0KXtsZXQgbjtyZXR1cm4gdC5sZW5ndGg9PT0wP249ZTpuPWUucmVwbGFjZSgvXHsoXGQrKVx9L2csKHIscyk9Pntjb25zdCBpPXNbMF0sbz10W2ldO2xldCBhPXI7cmV0dXJuIHR5cGVvZiBvPT0ic3RyaW5nIj9hPW86KHR5cGVvZiBvPT0ibnVtYmVyInx8dHlwZW9mIG89PSJib29sZWFuInx8bz09PXZvaWQgMHx8bz09PW51bGwpJiYoYT1TdHJpbmcobykpLGF9KSxCQyYmKG49Iu+8uyIrbi5yZXBsYWNlKC9bYW91ZWldL2csIiQmJCYiKSsi77y9Iiksbn1mdW5jdGlvbiBrZShlLHQsLi4ubil7cmV0dXJuIGkxKHR5cGVvZiBlPT0ibnVtYmVyIj9fQyhlLHQpOnQsbil9ZnVuY3Rpb24gX0MoZSx0KXt2YXIgcjtjb25zdCBuPShyPSRDKCkpPT1udWxsP3ZvaWQgMDpyW2VdO2lmKHR5cGVvZiBuIT0ic3RyaW5nIil7aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0O3Rocm93IG5ldyBFcnJvcihgISEhIE5MUyBNSVNTSU5HOiAke2V9ICEhIWApfXJldHVybiBufWNvbnN0IGtpPSJlbiI7bGV0IEFmPSExLHdmPSExLENmPSExLG8xPSExLFNmPSExLCR1LHhmPWtpLGExPWtpLElDLEJuO2NvbnN0IGdyPWdsb2JhbFRoaXM7bGV0IHB0O3R5cGVvZiBnci52c2NvZGU8InUiJiZ0eXBlb2YgZ3IudnNjb2RlLnByb2Nlc3M8InUiP3B0PWdyLnZzY29kZS5wcm9jZXNzOnR5cGVvZiBwcm9jZXNzPCJ1IiYmdHlwZW9mKChadz1wcm9jZXNzPT1udWxsP3ZvaWQgMDpwcm9jZXNzLnZlcnNpb25zKT09bnVsbD92b2lkIDA6Wncubm9kZSk9PSJzdHJpbmciJiYocHQ9cHJvY2Vzcyk7Y29uc3QgUEM9dHlwZW9mKChlQz1wdD09bnVsbD92b2lkIDA6cHQudmVyc2lvbnMpPT1udWxsP3ZvaWQgMDplQy5lbGVjdHJvbik9PSJzdHJpbmciJiYocHQ9PW51bGw/dm9pZCAwOnB0LnR5cGUpPT09InJlbmRlcmVyIjtpZih0eXBlb2YgcHQ9PSJvYmplY3QiKXtBZj1wdC5wbGF0Zm9ybT09PSJ3aW4zMiIsd2Y9cHQucGxhdGZvcm09PT0iZGFyd2luIixDZj1wdC5wbGF0Zm9ybT09PSJsaW51eCIsQ2YmJnB0LmVudi5TTkFQJiZwdC5lbnYuU05BUF9SRVZJU0lPTixwdC5lbnYuQ0l8fHB0LmVudi5CVUlMRF9BUlRJRkFDVFNUQUdJTkdESVJFQ1RPUlksJHU9a2kseGY9a2k7Y29uc3QgZT1wdC5lbnYuVlNDT0RFX05MU19DT05GSUc7aWYoZSl0cnl7Y29uc3QgdD1KU09OLnBhcnNlKGUpOyR1PXQudXNlckxvY2FsZSxhMT10Lm9zTG9jYWxlLHhmPXQucmVzb2x2ZWRMYW5ndWFnZXx8a2ksSUM9KHRDPXQubGFuZ3VhZ2VQYWNrKT09bnVsbD92b2lkIDA6dEMudHJhbnNsYXRpb25zQ29uZmlnRmlsZX1jYXRjaHt9bzE9ITB9ZWxzZSB0eXBlb2YgbmF2aWdhdG9yPT0ib2JqZWN0IiYmIVBDPyhCbj1uYXZpZ2F0b3IudXNlckFnZW50LEFmPUJuLmluZGV4T2YoIldpbmRvd3MiKT49MCx3Zj1Cbi5pbmRleE9mKCJNYWNpbnRvc2giKT49MCwoQm4uaW5kZXhPZigiTWFjaW50b3NoIik+PTB8fEJuLmluZGV4T2YoImlQYWQiKT49MHx8Qm4uaW5kZXhPZigiaVBob25lIik+PTApJiZuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMmJm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cz4wLENmPUJuLmluZGV4T2YoIkxpbnV4Iik+PTAsKEJuPT1udWxsP3ZvaWQgMDpCbi5pbmRleE9mKCJNb2JpIikpPj0wLFNmPSEwLHhmPXMxKCl8fGtpLCR1PW5hdmlnYXRvci5sYW5ndWFnZS50b0xvd2VyQ2FzZSgpLGExPSR1KTpjb25zb2xlLmVycm9yKCJVbmFibGUgdG8gcmVzb2x2ZSBwbGF0Zm9ybS4iKTtjb25zdCB0YT1BZixNQz13ZixPQz1vMSxSQz1TZixqQz1TZiYmdHlwZW9mIGdyLmltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiI/Z3Iub3JpZ2luOnZvaWQgMCxHbj1CbixWQz10eXBlb2YgZ3IucG9zdE1lc3NhZ2U9PSJmdW5jdGlvbiImJiFnci5pbXBvcnRTY3JpcHRzOygoKT0+e2lmKFZDKXtjb25zdCBlPVtdO2dyLmFkZEV2ZW50TGlzdGVuZXIoIm1lc3NhZ2UiLG49PntpZihuLmRhdGEmJm4uZGF0YS52c2NvZGVTY2hlZHVsZUFzeW5jV29yaylmb3IobGV0IHI9MCxzPWUubGVuZ3RoO3I8cztyKyspe2NvbnN0IGk9ZVtyXTtpZihpLmlkPT09bi5kYXRhLnZzY29kZVNjaGVkdWxlQXN5bmNXb3JrKXtlLnNwbGljZShyLDEpLGkuY2FsbGJhY2soKTtyZXR1cm59fX0pO2xldCB0PTA7cmV0dXJuIG49Pntjb25zdCByPSsrdDtlLnB1c2goe2lkOnIsY2FsbGJhY2s6bn0pLGdyLnBvc3RNZXNzYWdlKHt2c2NvZGVTY2hlZHVsZUFzeW5jV29yazpyfSwiKiIpfX1yZXR1cm4gZT0+c2V0VGltZW91dChlKX0pKCk7Y29uc3QgVUM9ISEoR24mJkduLmluZGV4T2YoIkNocm9tZSIpPj0wKTtHbiYmR24uaW5kZXhPZigiRmlyZWZveCIpPj0wLCFVQyYmR24mJkduLmluZGV4T2YoIlNhZmFyaSIpPj0wLEduJiZHbi5pbmRleE9mKCJFZGcvIik+PTAsR24mJkduLmluZGV4T2YoIkFuZHJvaWQiKT49MDtmdW5jdGlvbiBxQyhlKXtyZXR1cm4gZX1jbGFzcyBXQ3tjb25zdHJ1Y3Rvcih0LG4pe3RoaXMubGFzdENhY2hlPXZvaWQgMCx0aGlzLmxhc3RBcmdLZXk9dm9pZCAwLHR5cGVvZiB0PT0iZnVuY3Rpb24iPyh0aGlzLl9mbj10LHRoaXMuX2NvbXB1dGVLZXk9cUMpOih0aGlzLl9mbj1uLHRoaXMuX2NvbXB1dGVLZXk9dC5nZXRDYWNoZUtleSl9Z2V0KHQpe2NvbnN0IG49dGhpcy5fY29tcHV0ZUtleSh0KTtyZXR1cm4gdGhpcy5sYXN0QXJnS2V5IT09biYmKHRoaXMubGFzdEFyZ0tleT1uLHRoaXMubGFzdENhY2hlPXRoaXMuX2ZuKHQpKSx0aGlzLmxhc3RDYWNoZX19Y2xhc3MgdTF7Y29uc3RydWN0b3IodCl7dGhpcy5leGVjdXRvcj10LHRoaXMuX2RpZFJ1bj0hMX1nZXQgdmFsdWUoKXtpZighdGhpcy5fZGlkUnVuKXRyeXt0aGlzLl92YWx1ZT10aGlzLmV4ZWN1dG9yKCl9Y2F0Y2godCl7dGhpcy5fZXJyb3I9dH1maW5hbGx5e3RoaXMuX2RpZFJ1bj0hMH1pZih0aGlzLl9lcnJvcil0aHJvdyB0aGlzLl9lcnJvcjtyZXR1cm4gdGhpcy5fdmFsdWV9Z2V0IHJhd1ZhbHVlKCl7cmV0dXJuIHRoaXMuX3ZhbHVlfX1mdW5jdGlvbiBIQyhlKXtyZXR1cm4gZS5yZXBsYWNlKC9bXFxce1x9XCpcK1w/XHxcXlwkXC5cW1xdXChcKV0vZywiXFwkJiIpfWZ1bmN0aW9uIEpDKGUpe3JldHVybiBlLnNwbGl0KC9cclxufFxyfFxuLyl9ZnVuY3Rpb24gekMoZSl7Zm9yKGxldCB0PTAsbj1lLmxlbmd0aDt0PG47dCsrKXtjb25zdCByPWUuY2hhckNvZGVBdCh0KTtpZihyIT09MzImJnIhPT05KXJldHVybiB0fXJldHVybi0xfWZ1bmN0aW9uIEdDKGUsdD1lLmxlbmd0aC0xKXtmb3IobGV0IG49dDtuPj0wO24tLSl7Y29uc3Qgcj1lLmNoYXJDb2RlQXQobik7aWYociE9PTMyJiZyIT09OSlyZXR1cm4gbn1yZXR1cm4tMX1mdW5jdGlvbiBsMShlKXtyZXR1cm4gZT49NjUmJmU8PTkwfWZ1bmN0aW9uIGtmKGUpe3JldHVybiA1NTI5Njw9ZSYmZTw9NTYzMTl9ZnVuY3Rpb24gS0MoZSl7cmV0dXJuIDU2MzIwPD1lJiZlPD01NzM0M31mdW5jdGlvbiBYQyhlLHQpe3JldHVybihlLTU1Mjk2PDwxMCkrKHQtNTYzMjApKzY1NTM2fWZ1bmN0aW9uIFlDKGUsdCxuKXtjb25zdCByPWUuY2hhckNvZGVBdChuKTtpZihrZihyKSYmbisxPHQpe2NvbnN0IHM9ZS5jaGFyQ29kZUF0KG4rMSk7aWYoS0MocykpcmV0dXJuIFhDKHIscyl9cmV0dXJuIHJ9Y29uc3QgUUM9L15bXHRcblxyXHgyMC1ceDdFXSokLztmdW5jdGlvbiBaQyhlKXtyZXR1cm4gUUMudGVzdChlKX1jb25zdCBtcj1jbGFzcyBtcntzdGF0aWMgZ2V0SW5zdGFuY2UodCl7cmV0dXJuIG1yLmNhY2hlLmdldChBcnJheS5mcm9tKHQpKX1zdGF0aWMgZ2V0TG9jYWxlcygpe3JldHVybiBtci5fbG9jYWxlcy52YWx1ZX1jb25zdHJ1Y3Rvcih0KXt0aGlzLmNvbmZ1c2FibGVEaWN0aW9uYXJ5PXR9aXNBbWJpZ3VvdXModCl7cmV0dXJuIHRoaXMuY29uZnVzYWJsZURpY3Rpb25hcnkuaGFzKHQpfWdldFByaW1hcnlDb25mdXNhYmxlKHQpe3JldHVybiB0aGlzLmNvbmZ1c2FibGVEaWN0aW9uYXJ5LmdldCh0KX1nZXRDb25mdXNhYmxlQ29kZVBvaW50cygpe3JldHVybiBuZXcgU2V0KHRoaXMuY29uZnVzYWJsZURpY3Rpb25hcnkua2V5cygpKX19O21yLmFtYmlndW91c0NoYXJhY3RlckRhdGE9bmV3IHUxKCgpPT5KU09OLnBhcnNlKCd7Il9jb21tb24iOls4MjMyLDMyLDgyMzMsMzIsNTc2MCwzMiw4MTkyLDMyLDgxOTMsMzIsODE5NCwzMiw4MTk1LDMyLDgxOTYsMzIsODE5NywzMiw4MTk4LDMyLDgyMDAsMzIsODIwMSwzMiw4MjAyLDMyLDgyODcsMzIsODE5OSwzMiw4MjM5LDMyLDIwNDIsOTUsNjUxMDEsOTUsNjUxMDIsOTUsNjUxMDMsOTUsODIwOCw0NSw4MjA5LDQ1LDgyMTAsNDUsNjUxMTIsNDUsMTc0OCw0NSw4MjU5LDQ1LDcyNyw0NSw4NzIyLDQ1LDEwMTM0LDQ1LDExNDUwLDQ1LDE1NDksNDQsMTY0Myw0NCw4MjE4LDQ0LDE4NCw0NCw0MjIzMyw0NCw4OTQsNTksMjMwNyw1OCwyNjkxLDU4LDE0MTcsNTgsMTc5NSw1OCwxNzk2LDU4LDU4NjgsNTgsNjUwNzIsNTgsNjE0Nyw1OCw2MTUzLDU4LDgyODIsNTgsMTQ3NSw1OCw3NjAsNTgsNDI4ODksNTgsODc1OCw1OCw3MjAsNTgsNDIyMzcsNTgsNDUxLDMzLDExNjAxLDMzLDY2MCw2Myw1NzcsNjMsMjQyOSw2Myw1MDM4LDYzLDQyNzMxLDYzLDExOTE0OSw0Niw4MjI4LDQ2LDE3OTMsNDYsMTc5NCw0Niw0MjUxMCw0Niw2ODE3Niw0NiwxNjMyLDQ2LDE3NzYsNDYsNDIyMzIsNDYsMTM3Myw5Niw2NTI4Nyw5Niw4MjE5LDk2LDgyNDIsOTYsMTM3MCw5NiwxNTIzLDk2LDgxNzUsOTYsNjUzNDQsOTYsOTAwLDk2LDgxODksOTYsODEyNSw5Niw4MTI3LDk2LDgxOTAsOTYsNjk3LDk2LDg4NCw5Niw3MTIsOTYsNzE0LDk2LDcxNSw5Niw3NTYsOTYsNjk5LDk2LDcwMSw5Niw3MDAsOTYsNzAyLDk2LDQyODkyLDk2LDE0OTcsOTYsMjAzNiw5NiwyMDM3LDk2LDUxOTQsOTYsNTgzNiw5Niw5NDAzMyw5Niw5NDAzNCw5Niw2NTMzOSw5MSwxMDA4OCw0MCwxMDA5OCw0MCwxMjMwOCw0MCw2NDgzMCw0MCw2NTM0MSw5MywxMDA4OSw0MSwxMDA5OSw0MSwxMjMwOSw0MSw2NDgzMSw0MSwxMDEwMCwxMjMsMTE5MDYwLDEyMywxMDEwMSwxMjUsNjUzNDIsOTQsODI3MCw0MiwxNjQ1LDQyLDg3MjcsNDIsNjYzMzUsNDIsNTk0MSw0Nyw4MjU3LDQ3LDg3MjUsNDcsODI2MCw0Nyw5NTg1LDQ3LDEwMTg3LDQ3LDEwNzQ0LDQ3LDExOTM1NCw0NywxMjc1NSw0NywxMjMzOSw0NywxMTQ2Miw0NywyMDAzMSw0NywxMjAzNSw0Nyw2NTM0MCw5Miw2NTEyOCw5Miw4NzI2LDkyLDEwMTg5LDkyLDEwNzQxLDkyLDEwNzQ1LDkyLDExOTMxMSw5MiwxMTkzNTUsOTIsMTI3NTYsOTIsMjAwMjIsOTIsMTIwMzQsOTIsNDI4NzIsMzgsNzA4LDk0LDcxMCw5NCw1ODY5LDQzLDEwMTMzLDQzLDY2MjAzLDQzLDgyNDksNjAsMTAwOTQsNjAsNzA2LDYwLDExOTM1MCw2MCw1MTc2LDYwLDU4MTAsNjAsNTEyMCw2MSwxMTg0MCw2MSwxMjQ0OCw2MSw0MjIzOSw2MSw4MjUwLDYyLDEwMDk1LDYyLDcwNyw2MiwxMTkzNTEsNjIsNTE3MSw2Miw5NDAxNSw2Miw4Mjc1LDEyNiw3MzIsMTI2LDgxMjgsMTI2LDg3NjQsMTI2LDY1MzcyLDEyNCw2NTI5Myw0NSwxMjA3ODQsNTAsMTIwNzk0LDUwLDEyMDgwNCw1MCwxMjA4MTQsNTAsMTIwODI0LDUwLDEzMDAzNCw1MCw0Mjg0Miw1MCw0MjMsNTAsMTAwMCw1MCw0MjU2NCw1MCw1MzExLDUwLDQyNzM1LDUwLDExOTMwMiw1MSwxMjA3ODUsNTEsMTIwNzk1LDUxLDEyMDgwNSw1MSwxMjA4MTUsNTEsMTIwODI1LDUxLDEzMDAzNSw1MSw0MjkyMyw1MSw1NDAsNTEsNDM5LDUxLDQyODU4LDUxLDExNDY4LDUxLDEyNDgsNTEsOTQwMTEsNTEsNzE4ODIsNTEsMTIwNzg2LDUyLDEyMDc5Niw1MiwxMjA4MDYsNTIsMTIwODE2LDUyLDEyMDgyNiw1MiwxMzAwMzYsNTIsNTA3MCw1Miw3MTg1NSw1MiwxMjA3ODcsNTMsMTIwNzk3LDUzLDEyMDgwNyw1MywxMjA4MTcsNTMsMTIwODI3LDUzLDEzMDAzNyw1Myw0NDQsNTMsNzE4NjcsNTMsMTIwNzg4LDU0LDEyMDc5OCw1NCwxMjA4MDgsNTQsMTIwODE4LDU0LDEyMDgyOCw1NCwxMzAwMzgsNTQsMTE0NzQsNTQsNTEwMiw1NCw3MTg5Myw1NCwxMTkzMTQsNTUsMTIwNzg5LDU1LDEyMDc5OSw1NSwxMjA4MDksNTUsMTIwODE5LDU1LDEyMDgyOSw1NSwxMzAwMzksNTUsNjY3NzAsNTUsNzE4NzgsNTUsMjgxOSw1NiwyNTM4LDU2LDI2NjYsNTYsMTI1MTMxLDU2LDEyMDc5MCw1NiwxMjA4MDAsNTYsMTIwODEwLDU2LDEyMDgyMCw1NiwxMjA4MzAsNTYsMTMwMDQwLDU2LDU0Nyw1Niw1NDYsNTYsNjYzMzAsNTYsMjY2Myw1NywyOTIwLDU3LDI1NDEsNTcsMzQzNyw1NywxMjA3OTEsNTcsMTIwODAxLDU3LDEyMDgxMSw1NywxMjA4MjEsNTcsMTIwODMxLDU3LDEzMDA0MSw1Nyw0Mjg2Miw1NywxMTQ2Niw1Nyw3MTg4NCw1Nyw3MTg1Miw1Nyw3MTg5NCw1Nyw5MDgyLDk3LDY1MzQ1LDk3LDExOTgzNCw5NywxMTk4ODYsOTcsMTE5OTM4LDk3LDExOTk5MCw5NywxMjAwNDIsOTcsMTIwMDk0LDk3LDEyMDE0Niw5NywxMjAxOTgsOTcsMTIwMjUwLDk3LDEyMDMwMiw5NywxMjAzNTQsOTcsMTIwNDA2LDk3LDEyMDQ1OCw5Nyw1OTMsOTcsOTQ1LDk3LDEyMDUxNCw5NywxMjA1NzIsOTcsMTIwNjMwLDk3LDEyMDY4OCw5NywxMjA3NDYsOTcsNjUzMTMsNjUsMTE5ODA4LDY1LDExOTg2MCw2NSwxMTk5MTIsNjUsMTE5OTY0LDY1LDEyMDAxNiw2NSwxMjAwNjgsNjUsMTIwMTIwLDY1LDEyMDE3Miw2NSwxMjAyMjQsNjUsMTIwMjc2LDY1LDEyMDMyOCw2NSwxMjAzODAsNjUsMTIwNDMyLDY1LDkxMyw2NSwxMjA0ODgsNjUsMTIwNTQ2LDY1LDEyMDYwNCw2NSwxMjA2NjIsNjUsMTIwNzIwLDY1LDUwMzQsNjUsNTU3Myw2NSw0MjIyMiw2NSw5NDAxNiw2NSw2NjIwOCw2NSwxMTk4MzUsOTgsMTE5ODg3LDk4LDExOTkzOSw5OCwxMTk5OTEsOTgsMTIwMDQzLDk4LDEyMDA5NSw5OCwxMjAxNDcsOTgsMTIwMTk5LDk4LDEyMDI1MSw5OCwxMjAzMDMsOTgsMTIwMzU1LDk4LDEyMDQwNyw5OCwxMjA0NTksOTgsMzg4LDk4LDUwNzEsOTgsNTIzNCw5OCw1NTUxLDk4LDY1MzE0LDY2LDg0OTIsNjYsMTE5ODA5LDY2LDExOTg2MSw2NiwxMTk5MTMsNjYsMTIwMDE3LDY2LDEyMDA2OSw2NiwxMjAxMjEsNjYsMTIwMTczLDY2LDEyMDIyNSw2NiwxMjAyNzcsNjYsMTIwMzI5LDY2LDEyMDM4MSw2NiwxMjA0MzMsNjYsNDI5MzIsNjYsOTE0LDY2LDEyMDQ4OSw2NiwxMjA1NDcsNjYsMTIwNjA1LDY2LDEyMDY2Myw2NiwxMjA3MjEsNjYsNTEwOCw2Niw1NjIzLDY2LDQyMTkyLDY2LDY2MTc4LDY2LDY2MjA5LDY2LDY2MzA1LDY2LDY1MzQ3LDk5LDg1NzMsOTksMTE5ODM2LDk5LDExOTg4OCw5OSwxMTk5NDAsOTksMTE5OTkyLDk5LDEyMDA0NCw5OSwxMjAwOTYsOTksMTIwMTQ4LDk5LDEyMDIwMCw5OSwxMjAyNTIsOTksMTIwMzA0LDk5LDEyMDM1Niw5OSwxMjA0MDgsOTksMTIwNDYwLDk5LDc0MjgsOTksMTAxMCw5OSwxMTQyOSw5OSw0Mzk1MSw5OSw2NjYyMSw5OSwxMjg4NDQsNjcsNzE5MjIsNjcsNzE5MTMsNjcsNjUzMTUsNjcsODU1Nyw2Nyw4NDUwLDY3LDg0OTMsNjcsMTE5ODEwLDY3LDExOTg2Miw2NywxMTk5MTQsNjcsMTE5OTY2LDY3LDEyMDAxOCw2NywxMjAxNzQsNjcsMTIwMjI2LDY3LDEyMDI3OCw2NywxMjAzMzAsNjcsMTIwMzgyLDY3LDEyMDQzNCw2NywxMDE3LDY3LDExNDI4LDY3LDUwODcsNjcsNDIyMDIsNjcsNjYyMTAsNjcsNjYzMDYsNjcsNjY1ODEsNjcsNjY4NDQsNjcsODU3NCwxMDAsODUxOCwxMDAsMTE5ODM3LDEwMCwxMTk4ODksMTAwLDExOTk0MSwxMDAsMTE5OTkzLDEwMCwxMjAwNDUsMTAwLDEyMDA5NywxMDAsMTIwMTQ5LDEwMCwxMjAyMDEsMTAwLDEyMDI1MywxMDAsMTIwMzA1LDEwMCwxMjAzNTcsMTAwLDEyMDQwOSwxMDAsMTIwNDYxLDEwMCwxMjgxLDEwMCw1MDk1LDEwMCw1MjMxLDEwMCw0MjE5NCwxMDAsODU1OCw2OCw4NTE3LDY4LDExOTgxMSw2OCwxMTk4NjMsNjgsMTE5OTE1LDY4LDExOTk2Nyw2OCwxMjAwMTksNjgsMTIwMDcxLDY4LDEyMDEyMyw2OCwxMjAxNzUsNjgsMTIwMjI3LDY4LDEyMDI3OSw2OCwxMjAzMzEsNjgsMTIwMzgzLDY4LDEyMDQzNSw2OCw1MDI0LDY4LDU1OTgsNjgsNTYxMCw2OCw0MjE5NSw2OCw4NDk0LDEwMSw2NTM0OSwxMDEsODQ5NSwxMDEsODUxOSwxMDEsMTE5ODM4LDEwMSwxMTk4OTAsMTAxLDExOTk0MiwxMDEsMTIwMDQ2LDEwMSwxMjAwOTgsMTAxLDEyMDE1MCwxMDEsMTIwMjAyLDEwMSwxMjAyNTQsMTAxLDEyMDMwNiwxMDEsMTIwMzU4LDEwMSwxMjA0MTAsMTAxLDEyMDQ2MiwxMDEsNDM4MjYsMTAxLDEyMTMsMTAxLDg5NTksNjksNjUzMTcsNjksODQ5Niw2OSwxMTk4MTIsNjksMTE5ODY0LDY5LDExOTkxNiw2OSwxMjAwMjAsNjksMTIwMDcyLDY5LDEyMDEyNCw2OSwxMjAxNzYsNjksMTIwMjI4LDY5LDEyMDI4MCw2OSwxMjAzMzIsNjksMTIwMzg0LDY5LDEyMDQzNiw2OSw5MTcsNjksMTIwNDkyLDY5LDEyMDU1MCw2OSwxMjA2MDgsNjksMTIwNjY2LDY5LDEyMDcyNCw2OSwxMTU3Nyw2OSw1MDM2LDY5LDQyMjI0LDY5LDcxODQ2LDY5LDcxODU0LDY5LDY2MTgyLDY5LDExOTgzOSwxMDIsMTE5ODkxLDEwMiwxMTk5NDMsMTAyLDExOTk5NSwxMDIsMTIwMDQ3LDEwMiwxMjAwOTksMTAyLDEyMDE1MSwxMDIsMTIwMjAzLDEwMiwxMjAyNTUsMTAyLDEyMDMwNywxMDIsMTIwMzU5LDEwMiwxMjA0MTEsMTAyLDEyMDQ2MywxMDIsNDM4MjksMTAyLDQyOTA1LDEwMiwzODMsMTAyLDc4MzcsMTAyLDE0MTIsMTAyLDExOTMxNSw3MCw4NDk3LDcwLDExOTgxMyw3MCwxMTk4NjUsNzAsMTE5OTE3LDcwLDEyMDAyMSw3MCwxMjAwNzMsNzAsMTIwMTI1LDcwLDEyMDE3Nyw3MCwxMjAyMjksNzAsMTIwMjgxLDcwLDEyMDMzMyw3MCwxMjAzODUsNzAsMTIwNDM3LDcwLDQyOTA0LDcwLDk4OCw3MCwxMjA3NzgsNzAsNTU1Niw3MCw0MjIwNSw3MCw3MTg3NCw3MCw3MTg0Miw3MCw2NjE4Myw3MCw2NjIxMyw3MCw2Njg1Myw3MCw2NTM1MSwxMDMsODQ1OCwxMDMsMTE5ODQwLDEwMywxMTk4OTIsMTAzLDExOTk0NCwxMDMsMTIwMDQ4LDEwMywxMjAxMDAsMTAzLDEyMDE1MiwxMDMsMTIwMjA0LDEwMywxMjAyNTYsMTAzLDEyMDMwOCwxMDMsMTIwMzYwLDEwMywxMjA0MTIsMTAzLDEyMDQ2NCwxMDMsNjA5LDEwMyw3NTU1LDEwMywzOTcsMTAzLDE0MDksMTAzLDExOTgxNCw3MSwxMTk4NjYsNzEsMTE5OTE4LDcxLDExOTk3MCw3MSwxMjAwMjIsNzEsMTIwMDc0LDcxLDEyMDEyNiw3MSwxMjAxNzgsNzEsMTIwMjMwLDcxLDEyMDI4Miw3MSwxMjAzMzQsNzEsMTIwMzg2LDcxLDEyMDQzOCw3MSwxMjkyLDcxLDUwNTYsNzEsNTEwNyw3MSw0MjE5OCw3MSw2NTM1MiwxMDQsODQ2MiwxMDQsMTE5ODQxLDEwNCwxMTk5NDUsMTA0LDExOTk5NywxMDQsMTIwMDQ5LDEwNCwxMjAxMDEsMTA0LDEyMDE1MywxMDQsMTIwMjA1LDEwNCwxMjAyNTcsMTA0LDEyMDMwOSwxMDQsMTIwMzYxLDEwNCwxMjA0MTMsMTA0LDEyMDQ2NSwxMDQsMTIxMSwxMDQsMTM5MiwxMDQsNTA1OCwxMDQsNjUzMjAsNzIsODQ1OSw3Miw4NDYwLDcyLDg0NjEsNzIsMTE5ODE1LDcyLDExOTg2Nyw3MiwxMTk5MTksNzIsMTIwMDIzLDcyLDEyMDE3OSw3MiwxMjAyMzEsNzIsMTIwMjgzLDcyLDEyMDMzNSw3MiwxMjAzODcsNzIsMTIwNDM5LDcyLDkxOSw3MiwxMjA0OTQsNzIsMTIwNTUyLDcyLDEyMDYxMCw3MiwxMjA2NjgsNzIsMTIwNzI2LDcyLDExNDA2LDcyLDUwNTEsNzIsNTUwMCw3Miw0MjIxNSw3Miw2NjI1NSw3Miw3MzEsMTA1LDkwNzUsMTA1LDY1MzUzLDEwNSw4NTYwLDEwNSw4NTA1LDEwNSw4NTIwLDEwNSwxMTk4NDIsMTA1LDExOTg5NCwxMDUsMTE5OTQ2LDEwNSwxMTk5OTgsMTA1LDEyMDA1MCwxMDUsMTIwMTAyLDEwNSwxMjAxNTQsMTA1LDEyMDIwNiwxMDUsMTIwMjU4LDEwNSwxMjAzMTAsMTA1LDEyMDM2MiwxMDUsMTIwNDE0LDEwNSwxMjA0NjYsMTA1LDEyMDQ4NCwxMDUsNjE4LDEwNSw2MTcsMTA1LDk1MywxMDUsODEyNiwxMDUsODkwLDEwNSwxMjA1MjIsMTA1LDEyMDU4MCwxMDUsMTIwNjM4LDEwNSwxMjA2OTYsMTA1LDEyMDc1NCwxMDUsMTExMCwxMDUsNDI1NjcsMTA1LDEyMzEsMTA1LDQzODkzLDEwNSw1MDI5LDEwNSw3MTg3NSwxMDUsNjUzNTQsMTA2LDg1MjEsMTA2LDExOTg0MywxMDYsMTE5ODk1LDEwNiwxMTk5NDcsMTA2LDExOTk5OSwxMDYsMTIwMDUxLDEwNiwxMjAxMDMsMTA2LDEyMDE1NSwxMDYsMTIwMjA3LDEwNiwxMjAyNTksMTA2LDEyMDMxMSwxMDYsMTIwMzYzLDEwNiwxMjA0MTUsMTA2LDEyMDQ2NywxMDYsMTAxMSwxMDYsMTExMiwxMDYsNjUzMjIsNzQsMTE5ODE3LDc0LDExOTg2OSw3NCwxMTk5MjEsNzQsMTE5OTczLDc0LDEyMDAyNSw3NCwxMjAwNzcsNzQsMTIwMTI5LDc0LDEyMDE4MSw3NCwxMjAyMzMsNzQsMTIwMjg1LDc0LDEyMDMzNyw3NCwxMjAzODksNzQsMTIwNDQxLDc0LDQyOTMwLDc0LDg5NSw3NCwxMDMyLDc0LDUwMzUsNzQsNTI2MSw3NCw0MjIwMSw3NCwxMTk4NDQsMTA3LDExOTg5NiwxMDcsMTE5OTQ4LDEwNywxMjAwMDAsMTA3LDEyMDA1MiwxMDcsMTIwMTA0LDEwNywxMjAxNTYsMTA3LDEyMDIwOCwxMDcsMTIwMjYwLDEwNywxMjAzMTIsMTA3LDEyMDM2NCwxMDcsMTIwNDE2LDEwNywxMjA0NjgsMTA3LDg0OTAsNzUsNjUzMjMsNzUsMTE5ODE4LDc1LDExOTg3MCw3NSwxMTk5MjIsNzUsMTE5OTc0LDc1LDEyMDAyNiw3NSwxMjAwNzgsNzUsMTIwMTMwLDc1LDEyMDE4Miw3NSwxMjAyMzQsNzUsMTIwMjg2LDc1LDEyMDMzOCw3NSwxMjAzOTAsNzUsMTIwNDQyLDc1LDkyMiw3NSwxMjA0OTcsNzUsMTIwNTU1LDc1LDEyMDYxMyw3NSwxMjA2NzEsNzUsMTIwNzI5LDc1LDExNDEyLDc1LDUwOTQsNzUsNTg0NSw3NSw0MjE5OSw3NSw2Njg0MCw3NSwxNDcyLDEwOCw4NzM5LDczLDkyMTMsNzMsNjU1MTIsNzMsMTYzMywxMDgsMTc3Nyw3Myw2NjMzNiwxMDgsMTI1MTI3LDEwOCwxMjA3ODMsNzMsMTIwNzkzLDczLDEyMDgwMyw3MywxMjA4MTMsNzMsMTIwODIzLDczLDEzMDAzMyw3Myw2NTMyMSw3Myw4NTQ0LDczLDg0NjQsNzMsODQ2NSw3MywxMTk4MTYsNzMsMTE5ODY4LDczLDExOTkyMCw3MywxMjAwMjQsNzMsMTIwMTI4LDczLDEyMDE4MCw3MywxMjAyMzIsNzMsMTIwMjg0LDczLDEyMDMzNiw3MywxMjAzODgsNzMsMTIwNDQwLDczLDY1MzU2LDEwOCw4NTcyLDczLDg0NjcsMTA4LDExOTg0NSwxMDgsMTE5ODk3LDEwOCwxMTk5NDksMTA4LDEyMDAwMSwxMDgsMTIwMDUzLDEwOCwxMjAxMDUsNzMsMTIwMTU3LDczLDEyMDIwOSw3MywxMjAyNjEsNzMsMTIwMzEzLDczLDEyMDM2NSw3MywxMjA0MTcsNzMsMTIwNDY5LDczLDQ0OCw3MywxMjA0OTYsNzMsMTIwNTU0LDczLDEyMDYxMiw3MywxMjA2NzAsNzMsMTIwNzI4LDczLDExNDEwLDczLDEwMzAsNzMsMTIxNiw3MywxNDkzLDEwOCwxNTAzLDEwOCwxNTc1LDEwOCwxMjY0NjQsMTA4LDEyNjU5MiwxMDgsNjUxNjYsMTA4LDY1MTY1LDEwOCwxOTk0LDEwOCwxMTU5OSw3Myw1ODI1LDczLDQyMjI2LDczLDkzOTkyLDczLDY2MTg2LDEyNCw2NjMxMywxMjQsMTE5MzM4LDc2LDg1NTYsNzYsODQ2Niw3NiwxMTk4MTksNzYsMTE5ODcxLDc2LDExOTkyMyw3NiwxMjAwMjcsNzYsMTIwMDc5LDc2LDEyMDEzMSw3NiwxMjAxODMsNzYsMTIwMjM1LDc2LDEyMDI4Nyw3NiwxMjAzMzksNzYsMTIwMzkxLDc2LDEyMDQ0Myw3NiwxMTQ3Miw3Niw1MDg2LDc2LDUyOTAsNzYsNDIyMDksNzYsOTM5NzQsNzYsNzE4NDMsNzYsNzE4NTgsNzYsNjY1ODcsNzYsNjY4NTQsNzYsNjUzMjUsNzcsODU1OSw3Nyw4NDk5LDc3LDExOTgyMCw3NywxMTk4NzIsNzcsMTE5OTI0LDc3LDEyMDAyOCw3NywxMjAwODAsNzcsMTIwMTMyLDc3LDEyMDE4NCw3NywxMjAyMzYsNzcsMTIwMjg4LDc3LDEyMDM0MCw3NywxMjAzOTIsNzcsMTIwNDQ0LDc3LDkyNCw3NywxMjA0OTksNzcsMTIwNTU3LDc3LDEyMDYxNSw3NywxMjA2NzMsNzcsMTIwNzMxLDc3LDEwMTgsNzcsMTE0MTYsNzcsNTA0Nyw3Nyw1NjE2LDc3LDU4NDYsNzcsNDIyMDcsNzcsNjYyMjQsNzcsNjYzMjEsNzcsMTE5ODQ3LDExMCwxMTk4OTksMTEwLDExOTk1MSwxMTAsMTIwMDAzLDExMCwxMjAwNTUsMTEwLDEyMDEwNywxMTAsMTIwMTU5LDExMCwxMjAyMTEsMTEwLDEyMDI2MywxMTAsMTIwMzE1LDExMCwxMjAzNjcsMTEwLDEyMDQxOSwxMTAsMTIwNDcxLDExMCwxNDAwLDExMCwxNDA0LDExMCw2NTMyNiw3OCw4NDY5LDc4LDExOTgyMSw3OCwxMTk4NzMsNzgsMTE5OTI1LDc4LDExOTk3Nyw3OCwxMjAwMjksNzgsMTIwMDgxLDc4LDEyMDE4NSw3OCwxMjAyMzcsNzgsMTIwMjg5LDc4LDEyMDM0MSw3OCwxMjAzOTMsNzgsMTIwNDQ1LDc4LDkyNSw3OCwxMjA1MDAsNzgsMTIwNTU4LDc4LDEyMDYxNiw3OCwxMjA2NzQsNzgsMTIwNzMyLDc4LDExNDE4LDc4LDQyMjA4LDc4LDY2ODM1LDc4LDMwNzQsMTExLDMyMDIsMTExLDMzMzAsMTExLDM0NTgsMTExLDI0MDYsMTExLDI2NjIsMTExLDI3OTAsMTExLDMwNDYsMTExLDMxNzQsMTExLDMzMDIsMTExLDM0MzAsMTExLDM2NjQsMTExLDM3OTIsMTExLDQxNjAsMTExLDE2MzcsMTExLDE3ODEsMTExLDY1MzU5LDExMSw4NTAwLDExMSwxMTk4NDgsMTExLDExOTkwMCwxMTEsMTE5OTUyLDExMSwxMjAwNTYsMTExLDEyMDEwOCwxMTEsMTIwMTYwLDExMSwxMjAyMTIsMTExLDEyMDI2NCwxMTEsMTIwMzE2LDExMSwxMjAzNjgsMTExLDEyMDQyMCwxMTEsMTIwNDcyLDExMSw3NDM5LDExMSw3NDQxLDExMSw0MzgzNywxMTEsOTU5LDExMSwxMjA1MjgsMTExLDEyMDU4NiwxMTEsMTIwNjQ0LDExMSwxMjA3MDIsMTExLDEyMDc2MCwxMTEsOTYzLDExMSwxMjA1MzIsMTExLDEyMDU5MCwxMTEsMTIwNjQ4LDExMSwxMjA3MDYsMTExLDEyMDc2NCwxMTEsMTE0MjMsMTExLDQzNTEsMTExLDE0MTMsMTExLDE1MDUsMTExLDE2MDcsMTExLDEyNjUwMCwxMTEsMTI2NTY0LDExMSwxMjY1OTYsMTExLDY1MjU5LDExMSw2NTI2MCwxMTEsNjUyNTgsMTExLDY1MjU3LDExMSwxNzI2LDExMSw2NDQyOCwxMTEsNjQ0MjksMTExLDY0NDI3LDExMSw2NDQyNiwxMTEsMTcyOSwxMTEsNjQ0MjQsMTExLDY0NDI1LDExMSw2NDQyMywxMTEsNjQ0MjIsMTExLDE3NDksMTExLDMzNjAsMTExLDQxMjUsMTExLDY2Nzk0LDExMSw3MTg4MCwxMTEsNzE4OTUsMTExLDY2NjA0LDExMSwxOTg0LDc5LDI1MzQsNzksMjkxOCw3OSwxMjI5NSw3OSw3MDg2NCw3OSw3MTkwNCw3OSwxMjA3ODIsNzksMTIwNzkyLDc5LDEyMDgwMiw3OSwxMjA4MTIsNzksMTIwODIyLDc5LDEzMDAzMiw3OSw2NTMyNyw3OSwxMTk4MjIsNzksMTE5ODc0LDc5LDExOTkyNiw3OSwxMTk5NzgsNzksMTIwMDMwLDc5LDEyMDA4Miw3OSwxMjAxMzQsNzksMTIwMTg2LDc5LDEyMDIzOCw3OSwxMjAyOTAsNzksMTIwMzQyLDc5LDEyMDM5NCw3OSwxMjA0NDYsNzksOTI3LDc5LDEyMDUwMiw3OSwxMjA1NjAsNzksMTIwNjE4LDc5LDEyMDY3Niw3OSwxMjA3MzQsNzksMTE0MjIsNzksMTM2NSw3OSwxMTYwNCw3OSw0ODE2LDc5LDI4NDgsNzksNjY3NTQsNzksNDIyMjcsNzksNzE4NjEsNzksNjYxOTQsNzksNjYyMTksNzksNjY1NjQsNzksNjY4MzgsNzksOTA3NiwxMTIsNjUzNjAsMTEyLDExOTg0OSwxMTIsMTE5OTAxLDExMiwxMTk5NTMsMTEyLDEyMDAwNSwxMTIsMTIwMDU3LDExMiwxMjAxMDksMTEyLDEyMDE2MSwxMTIsMTIwMjEzLDExMiwxMjAyNjUsMTEyLDEyMDMxNywxMTIsMTIwMzY5LDExMiwxMjA0MjEsMTEyLDEyMDQ3MywxMTIsOTYxLDExMiwxMjA1MzAsMTEyLDEyMDU0NCwxMTIsMTIwNTg4LDExMiwxMjA2MDIsMTEyLDEyMDY0NiwxMTIsMTIwNjYwLDExMiwxMjA3MDQsMTEyLDEyMDcxOCwxMTIsMTIwNzYyLDExMiwxMjA3NzYsMTEyLDExNDI3LDExMiw2NTMyOCw4MCw4NDczLDgwLDExOTgyMyw4MCwxMTk4NzUsODAsMTE5OTI3LDgwLDExOTk3OSw4MCwxMjAwMzEsODAsMTIwMDgzLDgwLDEyMDE4Nyw4MCwxMjAyMzksODAsMTIwMjkxLDgwLDEyMDM0Myw4MCwxMjAzOTUsODAsMTIwNDQ3LDgwLDkyOSw4MCwxMjA1MDQsODAsMTIwNTYyLDgwLDEyMDYyMCw4MCwxMjA2NzgsODAsMTIwNzM2LDgwLDExNDI2LDgwLDUwOTAsODAsNTIyOSw4MCw0MjE5Myw4MCw2NjE5Nyw4MCwxMTk4NTAsMTEzLDExOTkwMiwxMTMsMTE5OTU0LDExMywxMjAwMDYsMTEzLDEyMDA1OCwxMTMsMTIwMTEwLDExMywxMjAxNjIsMTEzLDEyMDIxNCwxMTMsMTIwMjY2LDExMywxMjAzMTgsMTEzLDEyMDM3MCwxMTMsMTIwNDIyLDExMywxMjA0NzQsMTEzLDEzMDcsMTEzLDEzNzksMTEzLDEzODIsMTEzLDg0NzQsODEsMTE5ODI0LDgxLDExOTg3Niw4MSwxMTk5MjgsODEsMTE5OTgwLDgxLDEyMDAzMiw4MSwxMjAwODQsODEsMTIwMTg4LDgxLDEyMDI0MCw4MSwxMjAyOTIsODEsMTIwMzQ0LDgxLDEyMDM5Niw4MSwxMjA0NDgsODEsMTE2MDUsODEsMTE5ODUxLDExNCwxMTk5MDMsMTE0LDExOTk1NSwxMTQsMTIwMDA3LDExNCwxMjAwNTksMTE0LDEyMDExMSwxMTQsMTIwMTYzLDExNCwxMjAyMTUsMTE0LDEyMDI2NywxMTQsMTIwMzE5LDExNCwxMjAzNzEsMTE0LDEyMDQyMywxMTQsMTIwNDc1LDExNCw0Mzg0NywxMTQsNDM4NDgsMTE0LDc0NjIsMTE0LDExMzk3LDExNCw0MzkwNSwxMTQsMTE5MzE4LDgyLDg0NzUsODIsODQ3Niw4Miw4NDc3LDgyLDExOTgyNSw4MiwxMTk4NzcsODIsMTE5OTI5LDgyLDEyMDAzMyw4MiwxMjAxODksODIsMTIwMjQxLDgyLDEyMDI5Myw4MiwxMjAzNDUsODIsMTIwMzk3LDgyLDEyMDQ0OSw4Miw0MjIsODIsNTAyNSw4Miw1MDc0LDgyLDY2NzQwLDgyLDU1MTEsODIsNDIyMTEsODIsOTQwMDUsODIsNjUzNjMsMTE1LDExOTg1MiwxMTUsMTE5OTA0LDExNSwxMTk5NTYsMTE1LDEyMDAwOCwxMTUsMTIwMDYwLDExNSwxMjAxMTIsMTE1LDEyMDE2NCwxMTUsMTIwMjE2LDExNSwxMjAyNjgsMTE1LDEyMDMyMCwxMTUsMTIwMzcyLDExNSwxMjA0MjQsMTE1LDEyMDQ3NiwxMTUsNDI4MDEsMTE1LDQ0NSwxMTUsMTEwOSwxMTUsNDM5NDYsMTE1LDcxODczLDExNSw2NjYzMiwxMTUsNjUzMzEsODMsMTE5ODI2LDgzLDExOTg3OCw4MywxMTk5MzAsODMsMTE5OTgyLDgzLDEyMDAzNCw4MywxMjAwODYsODMsMTIwMTM4LDgzLDEyMDE5MCw4MywxMjAyNDIsODMsMTIwMjk0LDgzLDEyMDM0Niw4MywxMjAzOTgsODMsMTIwNDUwLDgzLDEwMjksODMsMTM1OSw4Myw1MDc3LDgzLDUwODIsODMsNDIyMTAsODMsOTQwMTAsODMsNjYxOTgsODMsNjY1OTIsODMsMTE5ODUzLDExNiwxMTk5MDUsMTE2LDExOTk1NywxMTYsMTIwMDA5LDExNiwxMjAwNjEsMTE2LDEyMDExMywxMTYsMTIwMTY1LDExNiwxMjAyMTcsMTE2LDEyMDI2OSwxMTYsMTIwMzIxLDExNiwxMjAzNzMsMTE2LDEyMDQyNSwxMTYsMTIwNDc3LDExNiw4ODY4LDg0LDEwMjAxLDg0LDEyODg3Miw4NCw2NTMzMiw4NCwxMTk4MjcsODQsMTE5ODc5LDg0LDExOTkzMSw4NCwxMTk5ODMsODQsMTIwMDM1LDg0LDEyMDA4Nyw4NCwxMjAxMzksODQsMTIwMTkxLDg0LDEyMDI0Myw4NCwxMjAyOTUsODQsMTIwMzQ3LDg0LDEyMDM5OSw4NCwxMjA0NTEsODQsOTMyLDg0LDEyMDUwNyw4NCwxMjA1NjUsODQsMTIwNjIzLDg0LDEyMDY4MSw4NCwxMjA3MzksODQsMTE0MzAsODQsNTAyNiw4NCw0MjE5Niw4NCw5Mzk2Miw4NCw3MTg2OCw4NCw2NjE5OSw4NCw2NjIyNSw4NCw2NjMyNSw4NCwxMTk4NTQsMTE3LDExOTkwNiwxMTcsMTE5OTU4LDExNywxMjAwMTAsMTE3LDEyMDA2MiwxMTcsMTIwMTE0LDExNywxMjAxNjYsMTE3LDEyMDIxOCwxMTcsMTIwMjcwLDExNywxMjAzMjIsMTE3LDEyMDM3NCwxMTcsMTIwNDI2LDExNywxMjA0NzgsMTE3LDQyOTExLDExNyw3NDUyLDExNyw0Mzg1NCwxMTcsNDM4NTgsMTE3LDY1MSwxMTcsOTY1LDExNywxMjA1MzQsMTE3LDEyMDU5MiwxMTcsMTIwNjUwLDExNywxMjA3MDgsMTE3LDEyMDc2NiwxMTcsMTQwNSwxMTcsNjY4MDYsMTE3LDcxODk2LDExNyw4NzQ2LDg1LDg4OTksODUsMTE5ODI4LDg1LDExOTg4MCw4NSwxMTk5MzIsODUsMTE5OTg0LDg1LDEyMDAzNiw4NSwxMjAwODgsODUsMTIwMTQwLDg1LDEyMDE5Miw4NSwxMjAyNDQsODUsMTIwMjk2LDg1LDEyMDM0OCw4NSwxMjA0MDAsODUsMTIwNDUyLDg1LDEzNTcsODUsNDYwOCw4NSw2Njc2Niw4NSw1MTk2LDg1LDQyMjI4LDg1LDk0MDE4LDg1LDcxODY0LDg1LDg3NDQsMTE4LDg4OTcsMTE4LDY1MzY2LDExOCw4NTY0LDExOCwxMTk4NTUsMTE4LDExOTkwNywxMTgsMTE5OTU5LDExOCwxMjAwMTEsMTE4LDEyMDA2MywxMTgsMTIwMTE1LDExOCwxMjAxNjcsMTE4LDEyMDIxOSwxMTgsMTIwMjcxLDExOCwxMjAzMjMsMTE4LDEyMDM3NSwxMTgsMTIwNDI3LDExOCwxMjA0NzksMTE4LDc0NTYsMTE4LDk1NywxMTgsMTIwNTI2LDExOCwxMjA1ODQsMTE4LDEyMDY0MiwxMTgsMTIwNzAwLDExOCwxMjA3NTgsMTE4LDExNDEsMTE4LDE0OTYsMTE4LDcxNDMwLDExOCw0Mzk0NSwxMTgsNzE4NzIsMTE4LDExOTMwOSw4NiwxNjM5LDg2LDE3ODMsODYsODU0OCw4NiwxMTk4MjksODYsMTE5ODgxLDg2LDExOTkzMyw4NiwxMTk5ODUsODYsMTIwMDM3LDg2LDEyMDA4OSw4NiwxMjAxNDEsODYsMTIwMTkzLDg2LDEyMDI0NSw4NiwxMjAyOTcsODYsMTIwMzQ5LDg2LDEyMDQwMSw4NiwxMjA0NTMsODYsMTE0MCw4NiwxMTU3Niw4Niw1MDgxLDg2LDUxNjcsODYsNDI3MTksODYsNDIyMTQsODYsOTM5NjAsODYsNzE4NDAsODYsNjY4NDUsODYsNjIzLDExOSwxMTk4NTYsMTE5LDExOTkwOCwxMTksMTE5OTYwLDExOSwxMjAwMTIsMTE5LDEyMDA2NCwxMTksMTIwMTE2LDExOSwxMjAxNjgsMTE5LDEyMDIyMCwxMTksMTIwMjcyLDExOSwxMjAzMjQsMTE5LDEyMDM3NiwxMTksMTIwNDI4LDExOSwxMjA0ODAsMTE5LDc0NTcsMTE5LDExMjEsMTE5LDEzMDksMTE5LDEzNzcsMTE5LDcxNDM0LDExOSw3MTQzOCwxMTksNzE0MzksMTE5LDQzOTA3LDExOSw3MTkxOSw4Nyw3MTkxMCw4NywxMTk4MzAsODcsMTE5ODgyLDg3LDExOTkzNCw4NywxMTk5ODYsODcsMTIwMDM4LDg3LDEyMDA5MCw4NywxMjAxNDIsODcsMTIwMTk0LDg3LDEyMDI0Niw4NywxMjAyOTgsODcsMTIwMzUwLDg3LDEyMDQwMiw4NywxMjA0NTQsODcsMTMwOCw4Nyw1MDQzLDg3LDUwNzYsODcsNDIyMTgsODcsNTc0MiwxMjAsMTA1MzksMTIwLDEwNTQwLDEyMCwxMDc5OSwxMjAsNjUzNjgsMTIwLDg1NjksMTIwLDExOTg1NywxMjAsMTE5OTA5LDEyMCwxMTk5NjEsMTIwLDEyMDAxMywxMjAsMTIwMDY1LDEyMCwxMjAxMTcsMTIwLDEyMDE2OSwxMjAsMTIwMjIxLDEyMCwxMjAyNzMsMTIwLDEyMDMyNSwxMjAsMTIwMzc3LDEyMCwxMjA0MjksMTIwLDEyMDQ4MSwxMjAsNTQ0MSwxMjAsNTUwMSwxMjAsNTc0MSw4OCw5NTg3LDg4LDY2MzM4LDg4LDcxOTE2LDg4LDY1MzM2LDg4LDg1NTMsODgsMTE5ODMxLDg4LDExOTg4Myw4OCwxMTk5MzUsODgsMTE5OTg3LDg4LDEyMDAzOSw4OCwxMjAwOTEsODgsMTIwMTQzLDg4LDEyMDE5NSw4OCwxMjAyNDcsODgsMTIwMjk5LDg4LDEyMDM1MSw4OCwxMjA0MDMsODgsMTIwNDU1LDg4LDQyOTMxLDg4LDkzNSw4OCwxMjA1MTAsODgsMTIwNTY4LDg4LDEyMDYyNiw4OCwxMjA2ODQsODgsMTIwNzQyLDg4LDExNDM2LDg4LDExNjEzLDg4LDU4MTUsODgsNDIyMTksODgsNjYxOTIsODgsNjYyMjgsODgsNjYzMjcsODgsNjY4NTUsODgsNjExLDEyMSw3NTY0LDEyMSw2NTM2OSwxMjEsMTE5ODU4LDEyMSwxMTk5MTAsMTIxLDExOTk2MiwxMjEsMTIwMDE0LDEyMSwxMjAwNjYsMTIxLDEyMDExOCwxMjEsMTIwMTcwLDEyMSwxMjAyMjIsMTIxLDEyMDI3NCwxMjEsMTIwMzI2LDEyMSwxMjAzNzgsMTIxLDEyMDQzMCwxMjEsMTIwNDgyLDEyMSw2NTUsMTIxLDc5MzUsMTIxLDQzODY2LDEyMSw5NDcsMTIxLDg1MDksMTIxLDEyMDUxNiwxMjEsMTIwNTc0LDEyMSwxMjA2MzIsMTIxLDEyMDY5MCwxMjEsMTIwNzQ4LDEyMSwxMTk5LDEyMSw0MzI3LDEyMSw3MTkwMCwxMjEsNjUzMzcsODksMTE5ODMyLDg5LDExOTg4NCw4OSwxMTk5MzYsODksMTE5OTg4LDg5LDEyMDA0MCw4OSwxMjAwOTIsODksMTIwMTQ0LDg5LDEyMDE5Niw4OSwxMjAyNDgsODksMTIwMzAwLDg5LDEyMDM1Miw4OSwxMjA0MDQsODksMTIwNDU2LDg5LDkzMyw4OSw5NzgsODksMTIwNTA4LDg5LDEyMDU2Niw4OSwxMjA2MjQsODksMTIwNjgyLDg5LDEyMDc0MCw4OSwxMTQzMiw4OSwxMTk4LDg5LDUwMzMsODksNTA1Myw4OSw0MjIyMCw4OSw5NDAxOSw4OSw3MTg0NCw4OSw2NjIyNiw4OSwxMTk4NTksMTIyLDExOTkxMSwxMjIsMTE5OTYzLDEyMiwxMjAwMTUsMTIyLDEyMDA2NywxMjIsMTIwMTE5LDEyMiwxMjAxNzEsMTIyLDEyMDIyMywxMjIsMTIwMjc1LDEyMiwxMjAzMjcsMTIyLDEyMDM3OSwxMjIsMTIwNDMxLDEyMiwxMjA0ODMsMTIyLDc0NTgsMTIyLDQzOTIzLDEyMiw3MTg3NiwxMjIsNjYyOTMsOTAsNzE5MDksOTAsNjUzMzgsOTAsODQ4NCw5MCw4NDg4LDkwLDExOTgzMyw5MCwxMTk4ODUsOTAsMTE5OTM3LDkwLDExOTk4OSw5MCwxMjAwNDEsOTAsMTIwMTk3LDkwLDEyMDI0OSw5MCwxMjAzMDEsOTAsMTIwMzUzLDkwLDEyMDQwNSw5MCwxMjA0NTcsOTAsOTE4LDkwLDEyMDQ5Myw5MCwxMjA1NTEsOTAsMTIwNjA5LDkwLDEyMDY2Nyw5MCwxMjA3MjUsOTAsNTA1OSw5MCw0MjIwNCw5MCw3MTg0OSw5MCw2NTI4MiwzNCw2NTI4NCwzNiw2NTI4NSwzNyw2NTI4NiwzOCw2NTI5MCw0Miw2NTI5MSw0Myw2NTI5NCw0Niw2NTI5NSw0Nyw2NTI5Niw0OCw2NTI5Nyw0OSw2NTI5OCw1MCw2NTI5OSw1MSw2NTMwMCw1Miw2NTMwMSw1Myw2NTMwMiw1NCw2NTMwMyw1NSw2NTMwNCw1Niw2NTMwNSw1Nyw2NTMwOCw2MCw2NTMwOSw2MSw2NTMxMCw2Miw2NTMxMiw2NCw2NTMxNiw2OCw2NTMxOCw3MCw2NTMxOSw3MSw2NTMyNCw3Niw2NTMyOSw4MSw2NTMzMCw4Miw2NTMzMyw4NSw2NTMzNCw4Niw2NTMzNSw4Nyw2NTM0Myw5NSw2NTM0Niw5OCw2NTM0OCwxMDAsNjUzNTAsMTAyLDY1MzU1LDEwNyw2NTM1NywxMDksNjUzNTgsMTEwLDY1MzYxLDExMyw2NTM2MiwxMTQsNjUzNjQsMTE2LDY1MzY1LDExNyw2NTM2NywxMTksNjUzNzAsMTIyLDY1MzcxLDEyMyw2NTM3MywxMjUsMTE5ODQ2LDEwOV0sIl9kZWZhdWx0IjpbMTYwLDMyLDgyMTEsNDUsNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sImNzIjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyMTYsOTYsODIxNyw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLCJkZSI6WzY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTI0OTQsNDcsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwiZXMiOls4MjExLDQ1LDY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSwxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwiZnIiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjQ1LDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwiaXQiOlsxNjAsMzIsODIxMSw0NSw2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTI4OCw0MCw2NTI4OSw0MSw2NTI5Miw0NCw2NTMwNyw1OSw2NTMxMSw2M10sImphIjpbODIxMSw0NSw2NTMwNiw1OCw2NTI4MSwzMyw4MjE2LDk2LDgyMTcsOTYsODI0NSw5NiwxODAsOTYsMTA0Nyw1MSwxMDczLDU0LDEwNzIsOTcsMTA0MCw2NSwxMDY4LDk4LDEwNDIsNjYsMTA4OSw5OSwxMDU3LDY3LDEwNzcsMTAxLDEwNDUsNjksMTA1Myw3MiwzMDUsMTA1LDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyOTIsNDQsNjUzMDcsNTldLCJrbyI6WzgyMTEsNDUsNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwicGwiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwicHQtQlIiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwicXBzLXBsb2MiOlsxNjAsMzIsODIxMSw0NSw2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1MjgzLDM1LDY1Mjg4LDQwLDY1Mjg5LDQxLDY1MjkyLDQ0LDY1MzA3LDU5LDY1MzExLDYzXSwicnUiOls2NTM3NCwxMjYsNjUzMDYsNTgsNjUyODEsMzMsODIxNiw5Niw4MjE3LDk2LDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDMwNSwxMDUsOTIxLDczLDEwMDksMTEyLDIxNSwxMjAsNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLCJ0ciI6WzE2MCwzMiw4MjExLDQ1LDY1Mzc0LDEyNiw2NTMwNiw1OCw2NTI4MSwzMyw4MjQ1LDk2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDEwNTAsNzUsOTIxLDczLDEwNTIsNzcsMTA4NiwxMTEsMTA1NCw3OSwxMDA5LDExMiwxMDg4LDExMiwxMDU2LDgwLDEwNzUsMTE0LDEwNTgsODQsMjE1LDEyMCwxMDkzLDEyMCwxMDYxLDg4LDEwOTEsMTIxLDEwNTksODksNjUyODMsMzUsNjUyODgsNDAsNjUyODksNDEsNjUyOTIsNDQsNjUzMDcsNTksNjUzMTEsNjNdLCJ6aC1oYW5zIjpbNjUzNzQsMTI2LDY1MzA2LDU4LDY1MjgxLDMzLDgyNDUsOTYsMTgwLDk2LDEyNDk0LDQ3LDEwNDcsNTEsMTA3Myw1NCwxMDcyLDk3LDEwNDAsNjUsMTA2OCw5OCwxMDQyLDY2LDEwODksOTksMTA1Nyw2NywxMDc3LDEwMSwxMDQ1LDY5LDEwNTMsNzIsMzA1LDEwNSwxMDUwLDc1LDkyMSw3MywxMDUyLDc3LDEwODYsMTExLDEwNTQsNzksMTAwOSwxMTIsMTA4OCwxMTIsMTA1Niw4MCwxMDc1LDExNCwxMDU4LDg0LDIxNSwxMjAsMTA5MywxMjAsMTA2MSw4OCwxMDkxLDEyMSwxMDU5LDg5LDY1Mjg4LDQwLDY1Mjg5LDQxXSwiemgtaGFudCI6WzgyMTEsNDUsNjUzNzQsMTI2LDE4MCw5NiwxMjQ5NCw0NywxMDQ3LDUxLDEwNzMsNTQsMTA3Miw5NywxMDQwLDY1LDEwNjgsOTgsMTA0Miw2NiwxMDg5LDk5LDEwNTcsNjcsMTA3NywxMDEsMTA0NSw2OSwxMDUzLDcyLDMwNSwxMDUsMTA1MCw3NSw5MjEsNzMsMTA1Miw3NywxMDg2LDExMSwxMDU0LDc5LDEwMDksMTEyLDEwODgsMTEyLDEwNTYsODAsMTA3NSwxMTQsMTA1OCw4NCwyMTUsMTIwLDEwOTMsMTIwLDEwNjEsODgsMTA5MSwxMjEsMTA1OSw4OSw2NTI4MywzNSw2NTMwNyw1OV19JykpLG1yLmNhY2hlPW5ldyBXQyh7Z2V0Q2FjaGVLZXk6SlNPTi5zdHJpbmdpZnl9LHQ9PntmdW5jdGlvbiBuKGYpe2NvbnN0IGM9bmV3IE1hcDtmb3IobGV0IHA9MDtwPGYubGVuZ3RoO3ArPTIpYy5zZXQoZltwXSxmW3ArMV0pO3JldHVybiBjfWZ1bmN0aW9uIHIoZixjKXtjb25zdCBwPW5ldyBNYXAoZik7Zm9yKGNvbnN0W2gsZF1vZiBjKXAuc2V0KGgsZCk7cmV0dXJuIHB9ZnVuY3Rpb24gcyhmLGMpe2lmKCFmKXJldHVybiBjO2NvbnN0IHA9bmV3IE1hcDtmb3IoY29uc3RbaCxkXW9mIGYpYy5oYXMoaCkmJnAuc2V0KGgsZCk7cmV0dXJuIHB9Y29uc3QgaT1tci5hbWJpZ3VvdXNDaGFyYWN0ZXJEYXRhLnZhbHVlO2xldCBvPXQuZmlsdGVyKGY9PiFmLnN0YXJ0c1dpdGgoIl8iKSYmZiBpbiBpKTtvLmxlbmd0aD09PTAmJihvPVsiX2RlZmF1bHQiXSk7bGV0IGE7Zm9yKGNvbnN0IGYgb2Ygbyl7Y29uc3QgYz1uKGlbZl0pO2E9cyhhLGMpfWNvbnN0IHU9bihpLl9jb21tb24pLGw9cih1LGEpO3JldHVybiBuZXcgbXIobCl9KSxtci5fbG9jYWxlcz1uZXcgdTEoKCk9Pk9iamVjdC5rZXlzKG1yLmFtYmlndW91c0NoYXJhY3RlckRhdGEudmFsdWUpLmZpbHRlcih0PT4hdC5zdGFydHNXaXRoKCJfIikpKTtsZXQgbmE9bXI7Y29uc3QgSG89Y2xhc3MgSG97c3RhdGljIGdldFJhd0RhdGEoKXtyZXR1cm4gSlNPTi5wYXJzZSgiWzksMTAsMTEsMTIsMTMsMzIsMTI3LDE2MCwxNzMsODQ3LDE1NjQsNDQ0Nyw0NDQ4LDYwNjgsNjA2OSw2MTU1LDYxNTYsNjE1Nyw2MTU4LDczNTUsNzM1Niw4MTkyLDgxOTMsODE5NCw4MTk1LDgxOTYsODE5Nyw4MTk4LDgxOTksODIwMCw4MjAxLDgyMDIsODIwMyw4MjA0LDgyMDUsODIwNiw4MjA3LDgyMzQsODIzNSw4MjM2LDgyMzcsODIzOCw4MjM5LDgyODcsODI4OCw4Mjg5LDgyOTAsODI5MSw4MjkyLDgyOTMsODI5NCw4Mjk1LDgyOTYsODI5Nyw4Mjk4LDgyOTksODMwMCw4MzAxLDgzMDIsODMwMywxMDI0MCwxMjI4OCwxMjY0NCw2NTAyNCw2NTAyNSw2NTAyNiw2NTAyNyw2NTAyOCw2NTAyOSw2NTAzMCw2NTAzMSw2NTAzMiw2NTAzMyw2NTAzNCw2NTAzNSw2NTAzNiw2NTAzNyw2NTAzOCw2NTAzOSw2NTI3OSw2NTQ0MCw2NTUyMCw2NTUyMSw2NTUyMiw2NTUyMyw2NTUyNCw2NTUyNSw2NTUyNiw2NTUyNyw2NTUyOCw2NTUzMiw3ODg0NCwxMTkxNTUsMTE5MTU2LDExOTE1NywxMTkxNTgsMTE5MTU5LDExOTE2MCwxMTkxNjEsMTE5MTYyLDkxNzUwNCw5MTc1MDUsOTE3NTA2LDkxNzUwNyw5MTc1MDgsOTE3NTA5LDkxNzUxMCw5MTc1MTEsOTE3NTEyLDkxNzUxMyw5MTc1MTQsOTE3NTE1LDkxNzUxNiw5MTc1MTcsOTE3NTE4LDkxNzUxOSw5MTc1MjAsOTE3NTIxLDkxNzUyMiw5MTc1MjMsOTE3NTI0LDkxNzUyNSw5MTc1MjYsOTE3NTI3LDkxNzUyOCw5MTc1MjksOTE3NTMwLDkxNzUzMSw5MTc1MzIsOTE3NTMzLDkxNzUzNCw5MTc1MzUsOTE3NTM2LDkxNzUzNyw5MTc1MzgsOTE3NTM5LDkxNzU0MCw5MTc1NDEsOTE3NTQyLDkxNzU0Myw5MTc1NDQsOTE3NTQ1LDkxNzU0Niw5MTc1NDcsOTE3NTQ4LDkxNzU0OSw5MTc1NTAsOTE3NTUxLDkxNzU1Miw5MTc1NTMsOTE3NTU0LDkxNzU1NSw5MTc1NTYsOTE3NTU3LDkxNzU1OCw5MTc1NTksOTE3NTYwLDkxNzU2MSw5MTc1NjIsOTE3NTYzLDkxNzU2NCw5MTc1NjUsOTE3NTY2LDkxNzU2Nyw5MTc1NjgsOTE3NTY5LDkxNzU3MCw5MTc1NzEsOTE3NTcyLDkxNzU3Myw5MTc1NzQsOTE3NTc1LDkxNzU3Niw5MTc1NzcsOTE3NTc4LDkxNzU3OSw5MTc1ODAsOTE3NTgxLDkxNzU4Miw5MTc1ODMsOTE3NTg0LDkxNzU4NSw5MTc1ODYsOTE3NTg3LDkxNzU4OCw5MTc1ODksOTE3NTkwLDkxNzU5MSw5MTc1OTIsOTE3NTkzLDkxNzU5NCw5MTc1OTUsOTE3NTk2LDkxNzU5Nyw5MTc1OTgsOTE3NTk5LDkxNzYwMCw5MTc2MDEsOTE3NjAyLDkxNzYwMyw5MTc2MDQsOTE3NjA1LDkxNzYwNiw5MTc2MDcsOTE3NjA4LDkxNzYwOSw5MTc2MTAsOTE3NjExLDkxNzYxMiw5MTc2MTMsOTE3NjE0LDkxNzYxNSw5MTc2MTYsOTE3NjE3LDkxNzYxOCw5MTc2MTksOTE3NjIwLDkxNzYyMSw5MTc2MjIsOTE3NjIzLDkxNzYyNCw5MTc2MjUsOTE3NjI2LDkxNzYyNyw5MTc2MjgsOTE3NjI5LDkxNzYzMCw5MTc2MzEsOTE3NzYwLDkxNzc2MSw5MTc3NjIsOTE3NzYzLDkxNzc2NCw5MTc3NjUsOTE3NzY2LDkxNzc2Nyw5MTc3NjgsOTE3NzY5LDkxNzc3MCw5MTc3NzEsOTE3NzcyLDkxNzc3Myw5MTc3NzQsOTE3Nzc1LDkxNzc3Niw5MTc3NzcsOTE3Nzc4LDkxNzc3OSw5MTc3ODAsOTE3NzgxLDkxNzc4Miw5MTc3ODMsOTE3Nzg0LDkxNzc4NSw5MTc3ODYsOTE3Nzg3LDkxNzc4OCw5MTc3ODksOTE3NzkwLDkxNzc5MSw5MTc3OTIsOTE3NzkzLDkxNzc5NCw5MTc3OTUsOTE3Nzk2LDkxNzc5Nyw5MTc3OTgsOTE3Nzk5LDkxNzgwMCw5MTc4MDEsOTE3ODAyLDkxNzgwMyw5MTc4MDQsOTE3ODA1LDkxNzgwNiw5MTc4MDcsOTE3ODA4LDkxNzgwOSw5MTc4MTAsOTE3ODExLDkxNzgxMiw5MTc4MTMsOTE3ODE0LDkxNzgxNSw5MTc4MTYsOTE3ODE3LDkxNzgxOCw5MTc4MTksOTE3ODIwLDkxNzgyMSw5MTc4MjIsOTE3ODIzLDkxNzgyNCw5MTc4MjUsOTE3ODI2LDkxNzgyNyw5MTc4MjgsOTE3ODI5LDkxNzgzMCw5MTc4MzEsOTE3ODMyLDkxNzgzMyw5MTc4MzQsOTE3ODM1LDkxNzgzNiw5MTc4MzcsOTE3ODM4LDkxNzgzOSw5MTc4NDAsOTE3ODQxLDkxNzg0Miw5MTc4NDMsOTE3ODQ0LDkxNzg0NSw5MTc4NDYsOTE3ODQ3LDkxNzg0OCw5MTc4NDksOTE3ODUwLDkxNzg1MSw5MTc4NTIsOTE3ODUzLDkxNzg1NCw5MTc4NTUsOTE3ODU2LDkxNzg1Nyw5MTc4NTgsOTE3ODU5LDkxNzg2MCw5MTc4NjEsOTE3ODYyLDkxNzg2Myw5MTc4NjQsOTE3ODY1LDkxNzg2Niw5MTc4NjcsOTE3ODY4LDkxNzg2OSw5MTc4NzAsOTE3ODcxLDkxNzg3Miw5MTc4NzMsOTE3ODc0LDkxNzg3NSw5MTc4NzYsOTE3ODc3LDkxNzg3OCw5MTc4NzksOTE3ODgwLDkxNzg4MSw5MTc4ODIsOTE3ODgzLDkxNzg4NCw5MTc4ODUsOTE3ODg2LDkxNzg4Nyw5MTc4ODgsOTE3ODg5LDkxNzg5MCw5MTc4OTEsOTE3ODkyLDkxNzg5Myw5MTc4OTQsOTE3ODk1LDkxNzg5Niw5MTc4OTcsOTE3ODk4LDkxNzg5OSw5MTc5MDAsOTE3OTAxLDkxNzkwMiw5MTc5MDMsOTE3OTA0LDkxNzkwNSw5MTc5MDYsOTE3OTA3LDkxNzkwOCw5MTc5MDksOTE3OTEwLDkxNzkxMSw5MTc5MTIsOTE3OTEzLDkxNzkxNCw5MTc5MTUsOTE3OTE2LDkxNzkxNyw5MTc5MTgsOTE3OTE5LDkxNzkyMCw5MTc5MjEsOTE3OTIyLDkxNzkyMyw5MTc5MjQsOTE3OTI1LDkxNzkyNiw5MTc5MjcsOTE3OTI4LDkxNzkyOSw5MTc5MzAsOTE3OTMxLDkxNzkzMiw5MTc5MzMsOTE3OTM0LDkxNzkzNSw5MTc5MzYsOTE3OTM3LDkxNzkzOCw5MTc5MzksOTE3OTQwLDkxNzk0MSw5MTc5NDIsOTE3OTQzLDkxNzk0NCw5MTc5NDUsOTE3OTQ2LDkxNzk0Nyw5MTc5NDgsOTE3OTQ5LDkxNzk1MCw5MTc5NTEsOTE3OTUyLDkxNzk1Myw5MTc5NTQsOTE3OTU1LDkxNzk1Niw5MTc5NTcsOTE3OTU4LDkxNzk1OSw5MTc5NjAsOTE3OTYxLDkxNzk2Miw5MTc5NjMsOTE3OTY0LDkxNzk2NSw5MTc5NjYsOTE3OTY3LDkxNzk2OCw5MTc5NjksOTE3OTcwLDkxNzk3MSw5MTc5NzIsOTE3OTczLDkxNzk3NCw5MTc5NzUsOTE3OTc2LDkxNzk3Nyw5MTc5NzgsOTE3OTc5LDkxNzk4MCw5MTc5ODEsOTE3OTgyLDkxNzk4Myw5MTc5ODQsOTE3OTg1LDkxNzk4Niw5MTc5ODcsOTE3OTg4LDkxNzk4OSw5MTc5OTAsOTE3OTkxLDkxNzk5Miw5MTc5OTMsOTE3OTk0LDkxNzk5NSw5MTc5OTYsOTE3OTk3LDkxNzk5OCw5MTc5OTldIil9c3RhdGljIGdldERhdGEoKXtyZXR1cm4gdGhpcy5fZGF0YXx8KHRoaXMuX2RhdGE9bmV3IFNldChIby5nZXRSYXdEYXRhKCkpKSx0aGlzLl9kYXRhfXN0YXRpYyBpc0ludmlzaWJsZUNoYXJhY3Rlcih0KXtyZXR1cm4gSG8uZ2V0RGF0YSgpLmhhcyh0KX1zdGF0aWMgZ2V0IGNvZGVQb2ludHMoKXtyZXR1cm4gSG8uZ2V0RGF0YSgpfX07SG8uX2RhdGE9dm9pZCAwO2xldCByYT1IbyxUaTtjb25zdCBUZj1nbG9iYWxUaGlzLnZzY29kZTtpZih0eXBlb2YgVGY8InUiJiZ0eXBlb2YgVGYucHJvY2VzczwidSIpe2NvbnN0IGU9VGYucHJvY2VzcztUaT17Z2V0IHBsYXRmb3JtKCl7cmV0dXJuIGUucGxhdGZvcm19LGdldCBhcmNoKCl7cmV0dXJuIGUuYXJjaH0sZ2V0IGVudigpe3JldHVybiBlLmVudn0sY3dkKCl7cmV0dXJuIGUuY3dkKCl9fX1lbHNlIHR5cGVvZiBwcm9jZXNzPCJ1IiYmdHlwZW9mKChuQz1wcm9jZXNzPT1udWxsP3ZvaWQgMDpwcm9jZXNzLnZlcnNpb25zKT09bnVsbD92b2lkIDA6bkMubm9kZSk9PSJzdHJpbmciP1RpPXtnZXQgcGxhdGZvcm0oKXtyZXR1cm4gcHJvY2Vzcy5wbGF0Zm9ybX0sZ2V0IGFyY2goKXtyZXR1cm4gcHJvY2Vzcy5hcmNofSxnZXQgZW52KCl7cmV0dXJuIHByb2Nlc3MuZW52fSxjd2QoKXtyZXR1cm4gcHJvY2Vzcy5lbnYuVlNDT0RFX0NXRHx8cHJvY2Vzcy5jd2QoKX19OlRpPXtnZXQgcGxhdGZvcm0oKXtyZXR1cm4gdGE/IndpbjMyIjpNQz8iZGFyd2luIjoibGludXgifSxnZXQgYXJjaCgpe30sZ2V0IGVudigpe3JldHVybnt9fSxjd2QoKXtyZXR1cm4iLyJ9fTtjb25zdCBCdT1UaS5jd2QsZTg9VGkuZW52LHQ4PVRpLnBsYXRmb3JtLG44PTY1LHI4PTk3LHM4PTkwLGk4PTEyMixacj00NixhdD00NyxJdD05Mixlcz01OCxvOD02MztjbGFzcyBjMSBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQsbixyKXtsZXQgczt0eXBlb2Ygbj09InN0cmluZyImJm4uaW5kZXhPZigibm90ICIpPT09MD8ocz0ibXVzdCBub3QgYmUiLG49bi5yZXBsYWNlKC9ebm90IC8sIiIpKTpzPSJtdXN0IGJlIjtjb25zdCBpPXQuaW5kZXhPZigiLiIpIT09LTE/InByb3BlcnR5IjoiYXJndW1lbnQiO2xldCBvPWBUaGUgIiR7dH0iICR7aX0gJHtzfSBvZiB0eXBlICR7bn1gO28rPWAuIFJlY2VpdmVkIHR5cGUgJHt0eXBlb2Ygcn1gLHN1cGVyKG8pLHRoaXMuY29kZT0iRVJSX0lOVkFMSURfQVJHX1RZUEUifX1mdW5jdGlvbiBhOChlLHQpe2lmKGU9PT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpdGhyb3cgbmV3IGMxKHQsIk9iamVjdCIsZSl9ZnVuY3Rpb24gSGUoZSx0KXtpZih0eXBlb2YgZSE9InN0cmluZyIpdGhyb3cgbmV3IGMxKHQsInN0cmluZyIsZSl9Y29uc3QgeXI9dDg9PT0id2luMzIiO2Z1bmN0aW9uIGFlKGUpe3JldHVybiBlPT09YXR8fGU9PT1JdH1mdW5jdGlvbiBOZihlKXtyZXR1cm4gZT09PWF0fWZ1bmN0aW9uIHRzKGUpe3JldHVybiBlPj1uOCYmZTw9czh8fGU+PXI4JiZlPD1pOH1mdW5jdGlvbiBfdShlLHQsbixyKXtsZXQgcz0iIixpPTAsbz0tMSxhPTAsdT0wO2ZvcihsZXQgbD0wO2w8PWUubGVuZ3RoOysrbCl7aWYobDxlLmxlbmd0aCl1PWUuY2hhckNvZGVBdChsKTtlbHNle2lmKHIodSkpYnJlYWs7dT1hdH1pZihyKHUpKXtpZighKG89PT1sLTF8fGE9PT0xKSlpZihhPT09Mil7aWYocy5sZW5ndGg8Mnx8aSE9PTJ8fHMuY2hhckNvZGVBdChzLmxlbmd0aC0xKSE9PVpyfHxzLmNoYXJDb2RlQXQocy5sZW5ndGgtMikhPT1acil7aWYocy5sZW5ndGg+Mil7Y29uc3QgZj1zLmxhc3RJbmRleE9mKG4pO2Y9PT0tMT8ocz0iIixpPTApOihzPXMuc2xpY2UoMCxmKSxpPXMubGVuZ3RoLTEtcy5sYXN0SW5kZXhPZihuKSksbz1sLGE9MDtjb250aW51ZX1lbHNlIGlmKHMubGVuZ3RoIT09MCl7cz0iIixpPTAsbz1sLGE9MDtjb250aW51ZX19dCYmKHMrPXMubGVuZ3RoPjA/YCR7bn0uLmA6Ii4uIixpPTIpfWVsc2Ugcy5sZW5ndGg+MD9zKz1gJHtufSR7ZS5zbGljZShvKzEsbCl9YDpzPWUuc2xpY2UobysxLGwpLGk9bC1vLTE7bz1sLGE9MH1lbHNlIHU9PT1aciYmYSE9PS0xPysrYTphPS0xfXJldHVybiBzfWZ1bmN0aW9uIHU4KGUpe3JldHVybiBlP2Ake2VbMF09PT0iLiI/IiI6Ii4ifSR7ZX1gOiIifWZ1bmN0aW9uIGYxKGUsdCl7YTgodCwicGF0aE9iamVjdCIpO2NvbnN0IG49dC5kaXJ8fHQucm9vdCxyPXQuYmFzZXx8YCR7dC5uYW1lfHwiIn0ke3U4KHQuZXh0KX1gO3JldHVybiBuP249PT10LnJvb3Q/YCR7bn0ke3J9YDpgJHtufSR7ZX0ke3J9YDpyfWNvbnN0IEV0PXtyZXNvbHZlKC4uLmUpe2xldCB0PSIiLG49IiIscj0hMTtmb3IobGV0IHM9ZS5sZW5ndGgtMTtzPj0tMTtzLS0pe2xldCBpO2lmKHM+PTApe2lmKGk9ZVtzXSxIZShpLGBwYXRoc1ske3N9XWApLGkubGVuZ3RoPT09MCljb250aW51ZX1lbHNlIHQubGVuZ3RoPT09MD9pPUJ1KCk6KGk9ZThbYD0ke3R9YF18fEJ1KCksKGk9PT12b2lkIDB8fGkuc2xpY2UoMCwyKS50b0xvd2VyQ2FzZSgpIT09dC50b0xvd2VyQ2FzZSgpJiZpLmNoYXJDb2RlQXQoMik9PT1JdCkmJihpPWAke3R9XFxgKSk7Y29uc3Qgbz1pLmxlbmd0aDtsZXQgYT0wLHU9IiIsbD0hMTtjb25zdCBmPWkuY2hhckNvZGVBdCgwKTtpZihvPT09MSlhZShmKSYmKGE9MSxsPSEwKTtlbHNlIGlmKGFlKGYpKWlmKGw9ITAsYWUoaS5jaGFyQ29kZUF0KDEpKSl7bGV0IGM9MixwPWM7Zm9yKDtjPG8mJiFhZShpLmNoYXJDb2RlQXQoYykpOyljKys7aWYoYzxvJiZjIT09cCl7Y29uc3QgaD1pLnNsaWNlKHAsYyk7Zm9yKHA9YztjPG8mJmFlKGkuY2hhckNvZGVBdChjKSk7KWMrKztpZihjPG8mJmMhPT1wKXtmb3IocD1jO2M8byYmIWFlKGkuY2hhckNvZGVBdChjKSk7KWMrKzsoYz09PW98fGMhPT1wKSYmKHU9YFxcXFwke2h9XFwke2kuc2xpY2UocCxjKX1gLGE9Yyl9fX1lbHNlIGE9MTtlbHNlIHRzKGYpJiZpLmNoYXJDb2RlQXQoMSk9PT1lcyYmKHU9aS5zbGljZSgwLDIpLGE9MixvPjImJmFlKGkuY2hhckNvZGVBdCgyKSkmJihsPSEwLGE9MykpO2lmKHUubGVuZ3RoPjApaWYodC5sZW5ndGg+MCl7aWYodS50b0xvd2VyQ2FzZSgpIT09dC50b0xvd2VyQ2FzZSgpKWNvbnRpbnVlfWVsc2UgdD11O2lmKHIpe2lmKHQubGVuZ3RoPjApYnJlYWt9ZWxzZSBpZihuPWAke2kuc2xpY2UoYSl9XFwke259YCxyPWwsbCYmdC5sZW5ndGg+MClicmVha31yZXR1cm4gbj1fdShuLCFyLCJcXCIsYWUpLHI/YCR7dH1cXCR7bn1gOmAke3R9JHtufWB8fCIuIn0sbm9ybWFsaXplKGUpe0hlKGUsInBhdGgiKTtjb25zdCB0PWUubGVuZ3RoO2lmKHQ9PT0wKXJldHVybiIuIjtsZXQgbj0wLHIscz0hMTtjb25zdCBpPWUuY2hhckNvZGVBdCgwKTtpZih0PT09MSlyZXR1cm4gTmYoaSk/IlxcIjplO2lmKGFlKGkpKWlmKHM9ITAsYWUoZS5jaGFyQ29kZUF0KDEpKSl7bGV0IGE9Mix1PWE7Zm9yKDthPHQmJiFhZShlLmNoYXJDb2RlQXQoYSkpOylhKys7aWYoYTx0JiZhIT09dSl7Y29uc3QgbD1lLnNsaWNlKHUsYSk7Zm9yKHU9YTthPHQmJmFlKGUuY2hhckNvZGVBdChhKSk7KWErKztpZihhPHQmJmEhPT11KXtmb3IodT1hO2E8dCYmIWFlKGUuY2hhckNvZGVBdChhKSk7KWErKztpZihhPT09dClyZXR1cm5gXFxcXCR7bH1cXCR7ZS5zbGljZSh1KX1cXGA7YSE9PXUmJihyPWBcXFxcJHtsfVxcJHtlLnNsaWNlKHUsYSl9YCxuPWEpfX19ZWxzZSBuPTE7ZWxzZSB0cyhpKSYmZS5jaGFyQ29kZUF0KDEpPT09ZXMmJihyPWUuc2xpY2UoMCwyKSxuPTIsdD4yJiZhZShlLmNoYXJDb2RlQXQoMikpJiYocz0hMCxuPTMpKTtsZXQgbz1uPHQ/X3UoZS5zbGljZShuKSwhcywiXFwiLGFlKToiIjtyZXR1cm4gby5sZW5ndGg9PT0wJiYhcyYmKG89Ii4iKSxvLmxlbmd0aD4wJiZhZShlLmNoYXJDb2RlQXQodC0xKSkmJihvKz0iXFwiKSxyPT09dm9pZCAwP3M/YFxcJHtvfWA6bzpzP2Ake3J9XFwke299YDpgJHtyfSR7b31gfSxpc0Fic29sdXRlKGUpe0hlKGUsInBhdGgiKTtjb25zdCB0PWUubGVuZ3RoO2lmKHQ9PT0wKXJldHVybiExO2NvbnN0IG49ZS5jaGFyQ29kZUF0KDApO3JldHVybiBhZShuKXx8dD4yJiZ0cyhuKSYmZS5jaGFyQ29kZUF0KDEpPT09ZXMmJmFlKGUuY2hhckNvZGVBdCgyKSl9LGpvaW4oLi4uZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiIuIjtsZXQgdCxuO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7KytpKXtjb25zdCBvPWVbaV07SGUobywicGF0aCIpLG8ubGVuZ3RoPjAmJih0PT09dm9pZCAwP3Q9bj1vOnQrPWBcXCR7b31gKX1pZih0PT09dm9pZCAwKXJldHVybiIuIjtsZXQgcj0hMCxzPTA7aWYodHlwZW9mIG49PSJzdHJpbmciJiZhZShuLmNoYXJDb2RlQXQoMCkpKXsrK3M7Y29uc3QgaT1uLmxlbmd0aDtpPjEmJmFlKG4uY2hhckNvZGVBdCgxKSkmJigrK3MsaT4yJiYoYWUobi5jaGFyQ29kZUF0KDIpKT8rK3M6cj0hMSkpfWlmKHIpe2Zvcig7czx0Lmxlbmd0aCYmYWUodC5jaGFyQ29kZUF0KHMpKTspcysrO3M+PTImJih0PWBcXCR7dC5zbGljZShzKX1gKX1yZXR1cm4gRXQubm9ybWFsaXplKHQpfSxyZWxhdGl2ZShlLHQpe2lmKEhlKGUsImZyb20iKSxIZSh0LCJ0byIpLGU9PT10KXJldHVybiIiO2NvbnN0IG49RXQucmVzb2x2ZShlKSxyPUV0LnJlc29sdmUodCk7aWYobj09PXJ8fChlPW4udG9Mb3dlckNhc2UoKSx0PXIudG9Mb3dlckNhc2UoKSxlPT09dCkpcmV0dXJuIiI7bGV0IHM9MDtmb3IoO3M8ZS5sZW5ndGgmJmUuY2hhckNvZGVBdChzKT09PUl0OylzKys7bGV0IGk9ZS5sZW5ndGg7Zm9yKDtpLTE+cyYmZS5jaGFyQ29kZUF0KGktMSk9PT1JdDspaS0tO2NvbnN0IG89aS1zO2xldCBhPTA7Zm9yKDthPHQubGVuZ3RoJiZ0LmNoYXJDb2RlQXQoYSk9PT1JdDspYSsrO2xldCB1PXQubGVuZ3RoO2Zvcig7dS0xPmEmJnQuY2hhckNvZGVBdCh1LTEpPT09SXQ7KXUtLTtjb25zdCBsPXUtYSxmPW88bD9vOmw7bGV0IGM9LTEscD0wO2Zvcig7cDxmO3ArKyl7Y29uc3QgZD1lLmNoYXJDb2RlQXQocytwKTtpZihkIT09dC5jaGFyQ29kZUF0KGErcCkpYnJlYWs7ZD09PUl0JiYoYz1wKX1pZihwIT09Zil7aWYoYz09PS0xKXJldHVybiByfWVsc2V7aWYobD5mKXtpZih0LmNoYXJDb2RlQXQoYStwKT09PUl0KXJldHVybiByLnNsaWNlKGErcCsxKTtpZihwPT09MilyZXR1cm4gci5zbGljZShhK3ApfW8+ZiYmKGUuY2hhckNvZGVBdChzK3ApPT09SXQ/Yz1wOnA9PT0yJiYoYz0zKSksYz09PS0xJiYoYz0wKX1sZXQgaD0iIjtmb3IocD1zK2MrMTtwPD1pOysrcCkocD09PWl8fGUuY2hhckNvZGVBdChwKT09PUl0KSYmKGgrPWgubGVuZ3RoPT09MD8iLi4iOiJcXC4uIik7cmV0dXJuIGErPWMsaC5sZW5ndGg+MD9gJHtofSR7ci5zbGljZShhLHUpfWA6KHIuY2hhckNvZGVBdChhKT09PUl0JiYrK2Esci5zbGljZShhLHUpKX0sdG9OYW1lc3BhY2VkUGF0aChlKXtpZih0eXBlb2YgZSE9InN0cmluZyJ8fGUubGVuZ3RoPT09MClyZXR1cm4gZTtjb25zdCB0PUV0LnJlc29sdmUoZSk7aWYodC5sZW5ndGg8PTIpcmV0dXJuIGU7aWYodC5jaGFyQ29kZUF0KDApPT09SXQpe2lmKHQuY2hhckNvZGVBdCgxKT09PUl0KXtjb25zdCBuPXQuY2hhckNvZGVBdCgyKTtpZihuIT09bzgmJm4hPT1acilyZXR1cm5gXFxcXD9cXFVOQ1xcJHt0LnNsaWNlKDIpfWB9fWVsc2UgaWYodHModC5jaGFyQ29kZUF0KDApKSYmdC5jaGFyQ29kZUF0KDEpPT09ZXMmJnQuY2hhckNvZGVBdCgyKT09PUl0KXJldHVybmBcXFxcP1xcJHt0fWA7cmV0dXJuIGV9LGRpcm5hbWUoZSl7SGUoZSwicGF0aCIpO2NvbnN0IHQ9ZS5sZW5ndGg7aWYodD09PTApcmV0dXJuIi4iO2xldCBuPS0xLHI9MDtjb25zdCBzPWUuY2hhckNvZGVBdCgwKTtpZih0PT09MSlyZXR1cm4gYWUocyk/ZToiLiI7aWYoYWUocykpe2lmKG49cj0xLGFlKGUuY2hhckNvZGVBdCgxKSkpe2xldCBhPTIsdT1hO2Zvcig7YTx0JiYhYWUoZS5jaGFyQ29kZUF0KGEpKTspYSsrO2lmKGE8dCYmYSE9PXUpe2Zvcih1PWE7YTx0JiZhZShlLmNoYXJDb2RlQXQoYSkpOylhKys7aWYoYTx0JiZhIT09dSl7Zm9yKHU9YTthPHQmJiFhZShlLmNoYXJDb2RlQXQoYSkpOylhKys7aWYoYT09PXQpcmV0dXJuIGU7YSE9PXUmJihuPXI9YSsxKX19fX1lbHNlIHRzKHMpJiZlLmNoYXJDb2RlQXQoMSk9PT1lcyYmKG49dD4yJiZhZShlLmNoYXJDb2RlQXQoMikpPzM6MixyPW4pO2xldCBpPS0xLG89ITA7Zm9yKGxldCBhPXQtMTthPj1yOy0tYSlpZihhZShlLmNoYXJDb2RlQXQoYSkpKXtpZighbyl7aT1hO2JyZWFrfX1lbHNlIG89ITE7aWYoaT09PS0xKXtpZihuPT09LTEpcmV0dXJuIi4iO2k9bn1yZXR1cm4gZS5zbGljZSgwLGkpfSxiYXNlbmFtZShlLHQpe3QhPT12b2lkIDAmJkhlKHQsInN1ZmZpeCIpLEhlKGUsInBhdGgiKTtsZXQgbj0wLHI9LTEscz0hMCxpO2lmKGUubGVuZ3RoPj0yJiZ0cyhlLmNoYXJDb2RlQXQoMCkpJiZlLmNoYXJDb2RlQXQoMSk9PT1lcyYmKG49MiksdCE9PXZvaWQgMCYmdC5sZW5ndGg+MCYmdC5sZW5ndGg8PWUubGVuZ3RoKXtpZih0PT09ZSlyZXR1cm4iIjtsZXQgbz10Lmxlbmd0aC0xLGE9LTE7Zm9yKGk9ZS5sZW5ndGgtMTtpPj1uOy0taSl7Y29uc3QgdT1lLmNoYXJDb2RlQXQoaSk7aWYoYWUodSkpe2lmKCFzKXtuPWkrMTticmVha319ZWxzZSBhPT09LTEmJihzPSExLGE9aSsxKSxvPj0wJiYodT09PXQuY2hhckNvZGVBdChvKT8tLW89PT0tMSYmKHI9aSk6KG89LTEscj1hKSl9cmV0dXJuIG49PT1yP3I9YTpyPT09LTEmJihyPWUubGVuZ3RoKSxlLnNsaWNlKG4scil9Zm9yKGk9ZS5sZW5ndGgtMTtpPj1uOy0taSlpZihhZShlLmNoYXJDb2RlQXQoaSkpKXtpZighcyl7bj1pKzE7YnJlYWt9fWVsc2Ugcj09PS0xJiYocz0hMSxyPWkrMSk7cmV0dXJuIHI9PT0tMT8iIjplLnNsaWNlKG4scil9LGV4dG5hbWUoZSl7SGUoZSwicGF0aCIpO2xldCB0PTAsbj0tMSxyPTAscz0tMSxpPSEwLG89MDtlLmxlbmd0aD49MiYmZS5jaGFyQ29kZUF0KDEpPT09ZXMmJnRzKGUuY2hhckNvZGVBdCgwKSkmJih0PXI9Mik7Zm9yKGxldCBhPWUubGVuZ3RoLTE7YT49dDstLWEpe2NvbnN0IHU9ZS5jaGFyQ29kZUF0KGEpO2lmKGFlKHUpKXtpZighaSl7cj1hKzE7YnJlYWt9Y29udGludWV9cz09PS0xJiYoaT0hMSxzPWErMSksdT09PVpyP249PT0tMT9uPWE6byE9PTEmJihvPTEpOm4hPT0tMSYmKG89LTEpfXJldHVybiBuPT09LTF8fHM9PT0tMXx8bz09PTB8fG89PT0xJiZuPT09cy0xJiZuPT09cisxPyIiOmUuc2xpY2UobixzKX0sZm9ybWF0OmYxLmJpbmQobnVsbCwiXFwiKSxwYXJzZShlKXtIZShlLCJwYXRoIik7Y29uc3QgdD17cm9vdDoiIixkaXI6IiIsYmFzZToiIixleHQ6IiIsbmFtZToiIn07aWYoZS5sZW5ndGg9PT0wKXJldHVybiB0O2NvbnN0IG49ZS5sZW5ndGg7bGV0IHI9MCxzPWUuY2hhckNvZGVBdCgwKTtpZihuPT09MSlyZXR1cm4gYWUocyk/KHQucm9vdD10LmRpcj1lLHQpOih0LmJhc2U9dC5uYW1lPWUsdCk7aWYoYWUocykpe2lmKHI9MSxhZShlLmNoYXJDb2RlQXQoMSkpKXtsZXQgYz0yLHA9Yztmb3IoO2M8biYmIWFlKGUuY2hhckNvZGVBdChjKSk7KWMrKztpZihjPG4mJmMhPT1wKXtmb3IocD1jO2M8biYmYWUoZS5jaGFyQ29kZUF0KGMpKTspYysrO2lmKGM8biYmYyE9PXApe2ZvcihwPWM7YzxuJiYhYWUoZS5jaGFyQ29kZUF0KGMpKTspYysrO2M9PT1uP3I9YzpjIT09cCYmKHI9YysxKX19fX1lbHNlIGlmKHRzKHMpJiZlLmNoYXJDb2RlQXQoMSk9PT1lcyl7aWYobjw9MilyZXR1cm4gdC5yb290PXQuZGlyPWUsdDtpZihyPTIsYWUoZS5jaGFyQ29kZUF0KDIpKSl7aWYobj09PTMpcmV0dXJuIHQucm9vdD10LmRpcj1lLHQ7cj0zfX1yPjAmJih0LnJvb3Q9ZS5zbGljZSgwLHIpKTtsZXQgaT0tMSxvPXIsYT0tMSx1PSEwLGw9ZS5sZW5ndGgtMSxmPTA7Zm9yKDtsPj1yOy0tbCl7aWYocz1lLmNoYXJDb2RlQXQobCksYWUocykpe2lmKCF1KXtvPWwrMTticmVha31jb250aW51ZX1hPT09LTEmJih1PSExLGE9bCsxKSxzPT09WnI/aT09PS0xP2k9bDpmIT09MSYmKGY9MSk6aSE9PS0xJiYoZj0tMSl9cmV0dXJuIGEhPT0tMSYmKGk9PT0tMXx8Zj09PTB8fGY9PT0xJiZpPT09YS0xJiZpPT09bysxP3QuYmFzZT10Lm5hbWU9ZS5zbGljZShvLGEpOih0Lm5hbWU9ZS5zbGljZShvLGkpLHQuYmFzZT1lLnNsaWNlKG8sYSksdC5leHQ9ZS5zbGljZShpLGEpKSksbz4wJiZvIT09cj90LmRpcj1lLnNsaWNlKDAsby0xKTp0LmRpcj10LnJvb3QsdH0sc2VwOiJcXCIsZGVsaW1pdGVyOiI7Iix3aW4zMjpudWxsLHBvc2l4Om51bGx9LGw4PSgoKT0+e2lmKHlyKXtjb25zdCBlPS9cXC9nO3JldHVybigpPT57Y29uc3QgdD1CdSgpLnJlcGxhY2UoZSwiLyIpO3JldHVybiB0LnNsaWNlKHQuaW5kZXhPZigiLyIpKX19cmV0dXJuKCk9PkJ1KCl9KSgpLHZ0PXtyZXNvbHZlKC4uLmUpe2xldCB0PSIiLG49ITE7Zm9yKGxldCByPWUubGVuZ3RoLTE7cj49LTEmJiFuO3ItLSl7Y29uc3Qgcz1yPj0wP2Vbcl06bDgoKTtIZShzLGBwYXRoc1ske3J9XWApLHMubGVuZ3RoIT09MCYmKHQ9YCR7c30vJHt0fWAsbj1zLmNoYXJDb2RlQXQoMCk9PT1hdCl9cmV0dXJuIHQ9X3UodCwhbiwiLyIsTmYpLG4/YC8ke3R9YDp0Lmxlbmd0aD4wP3Q6Ii4ifSxub3JtYWxpemUoZSl7aWYoSGUoZSwicGF0aCIpLGUubGVuZ3RoPT09MClyZXR1cm4iLiI7Y29uc3QgdD1lLmNoYXJDb2RlQXQoMCk9PT1hdCxuPWUuY2hhckNvZGVBdChlLmxlbmd0aC0xKT09PWF0O3JldHVybiBlPV91KGUsIXQsIi8iLE5mKSxlLmxlbmd0aD09PTA/dD8iLyI6bj8iLi8iOiIuIjoobiYmKGUrPSIvIiksdD9gLyR7ZX1gOmUpfSxpc0Fic29sdXRlKGUpe3JldHVybiBIZShlLCJwYXRoIiksZS5sZW5ndGg+MCYmZS5jaGFyQ29kZUF0KDApPT09YXR9LGpvaW4oLi4uZSl7aWYoZS5sZW5ndGg9PT0wKXJldHVybiIuIjtsZXQgdDtmb3IobGV0IG49MDtuPGUubGVuZ3RoOysrbil7Y29uc3Qgcj1lW25dO0hlKHIsInBhdGgiKSxyLmxlbmd0aD4wJiYodD09PXZvaWQgMD90PXI6dCs9YC8ke3J9YCl9cmV0dXJuIHQ9PT12b2lkIDA/Ii4iOnZ0Lm5vcm1hbGl6ZSh0KX0scmVsYXRpdmUoZSx0KXtpZihIZShlLCJmcm9tIiksSGUodCwidG8iKSxlPT09dHx8KGU9dnQucmVzb2x2ZShlKSx0PXZ0LnJlc29sdmUodCksZT09PXQpKXJldHVybiIiO2NvbnN0IG49MSxyPWUubGVuZ3RoLHM9ci1uLGk9MSxvPXQubGVuZ3RoLWksYT1zPG8/czpvO2xldCB1PS0xLGw9MDtmb3IoO2w8YTtsKyspe2NvbnN0IGM9ZS5jaGFyQ29kZUF0KG4rbCk7aWYoYyE9PXQuY2hhckNvZGVBdChpK2wpKWJyZWFrO2M9PT1hdCYmKHU9bCl9aWYobD09PWEpaWYobz5hKXtpZih0LmNoYXJDb2RlQXQoaStsKT09PWF0KXJldHVybiB0LnNsaWNlKGkrbCsxKTtpZihsPT09MClyZXR1cm4gdC5zbGljZShpK2wpfWVsc2Ugcz5hJiYoZS5jaGFyQ29kZUF0KG4rbCk9PT1hdD91PWw6bD09PTAmJih1PTApKTtsZXQgZj0iIjtmb3IobD1uK3UrMTtsPD1yOysrbCkobD09PXJ8fGUuY2hhckNvZGVBdChsKT09PWF0KSYmKGYrPWYubGVuZ3RoPT09MD8iLi4iOiIvLi4iKTtyZXR1cm5gJHtmfSR7dC5zbGljZShpK3UpfWB9LHRvTmFtZXNwYWNlZFBhdGgoZSl7cmV0dXJuIGV9LGRpcm5hbWUoZSl7aWYoSGUoZSwicGF0aCIpLGUubGVuZ3RoPT09MClyZXR1cm4iLiI7Y29uc3QgdD1lLmNoYXJDb2RlQXQoMCk9PT1hdDtsZXQgbj0tMSxyPSEwO2ZvcihsZXQgcz1lLmxlbmd0aC0xO3M+PTE7LS1zKWlmKGUuY2hhckNvZGVBdChzKT09PWF0KXtpZighcil7bj1zO2JyZWFrfX1lbHNlIHI9ITE7cmV0dXJuIG49PT0tMT90PyIvIjoiLiI6dCYmbj09PTE/Ii8vIjplLnNsaWNlKDAsbil9LGJhc2VuYW1lKGUsdCl7dCE9PXZvaWQgMCYmSGUodCwiZXh0IiksSGUoZSwicGF0aCIpO2xldCBuPTAscj0tMSxzPSEwLGk7aWYodCE9PXZvaWQgMCYmdC5sZW5ndGg+MCYmdC5sZW5ndGg8PWUubGVuZ3RoKXtpZih0PT09ZSlyZXR1cm4iIjtsZXQgbz10Lmxlbmd0aC0xLGE9LTE7Zm9yKGk9ZS5sZW5ndGgtMTtpPj0wOy0taSl7Y29uc3QgdT1lLmNoYXJDb2RlQXQoaSk7aWYodT09PWF0KXtpZighcyl7bj1pKzE7YnJlYWt9fWVsc2UgYT09PS0xJiYocz0hMSxhPWkrMSksbz49MCYmKHU9PT10LmNoYXJDb2RlQXQobyk/LS1vPT09LTEmJihyPWkpOihvPS0xLHI9YSkpfXJldHVybiBuPT09cj9yPWE6cj09PS0xJiYocj1lLmxlbmd0aCksZS5zbGljZShuLHIpfWZvcihpPWUubGVuZ3RoLTE7aT49MDstLWkpaWYoZS5jaGFyQ29kZUF0KGkpPT09YXQpe2lmKCFzKXtuPWkrMTticmVha319ZWxzZSByPT09LTEmJihzPSExLHI9aSsxKTtyZXR1cm4gcj09PS0xPyIiOmUuc2xpY2UobixyKX0sZXh0bmFtZShlKXtIZShlLCJwYXRoIik7bGV0IHQ9LTEsbj0wLHI9LTEscz0hMCxpPTA7Zm9yKGxldCBvPWUubGVuZ3RoLTE7bz49MDstLW8pe2NvbnN0IGE9ZS5jaGFyQ29kZUF0KG8pO2lmKGE9PT1hdCl7aWYoIXMpe249bysxO2JyZWFrfWNvbnRpbnVlfXI9PT0tMSYmKHM9ITEscj1vKzEpLGE9PT1acj90PT09LTE/dD1vOmkhPT0xJiYoaT0xKTp0IT09LTEmJihpPS0xKX1yZXR1cm4gdD09PS0xfHxyPT09LTF8fGk9PT0wfHxpPT09MSYmdD09PXItMSYmdD09PW4rMT8iIjplLnNsaWNlKHQscil9LGZvcm1hdDpmMS5iaW5kKG51bGwsIi8iKSxwYXJzZShlKXtIZShlLCJwYXRoIik7Y29uc3QgdD17cm9vdDoiIixkaXI6IiIsYmFzZToiIixleHQ6IiIsbmFtZToiIn07aWYoZS5sZW5ndGg9PT0wKXJldHVybiB0O2NvbnN0IG49ZS5jaGFyQ29kZUF0KDApPT09YXQ7bGV0IHI7bj8odC5yb290PSIvIixyPTEpOnI9MDtsZXQgcz0tMSxpPTAsbz0tMSxhPSEwLHU9ZS5sZW5ndGgtMSxsPTA7Zm9yKDt1Pj1yOy0tdSl7Y29uc3QgZj1lLmNoYXJDb2RlQXQodSk7aWYoZj09PWF0KXtpZighYSl7aT11KzE7YnJlYWt9Y29udGludWV9bz09PS0xJiYoYT0hMSxvPXUrMSksZj09PVpyP3M9PT0tMT9zPXU6bCE9PTEmJihsPTEpOnMhPT0tMSYmKGw9LTEpfWlmKG8hPT0tMSl7Y29uc3QgZj1pPT09MCYmbj8xOmk7cz09PS0xfHxsPT09MHx8bD09PTEmJnM9PT1vLTEmJnM9PT1pKzE/dC5iYXNlPXQubmFtZT1lLnNsaWNlKGYsbyk6KHQubmFtZT1lLnNsaWNlKGYscyksdC5iYXNlPWUuc2xpY2UoZixvKSx0LmV4dD1lLnNsaWNlKHMsbykpfXJldHVybiBpPjA/dC5kaXI9ZS5zbGljZSgwLGktMSk6biYmKHQuZGlyPSIvIiksdH0sc2VwOiIvIixkZWxpbWl0ZXI6IjoiLHdpbjMyOm51bGwscG9zaXg6bnVsbH07dnQud2luMzI9RXQud2luMzI9RXQsdnQucG9zaXg9RXQucG9zaXg9dnQseXI/RXQubm9ybWFsaXplOnZ0Lm5vcm1hbGl6ZTtjb25zdCBjOD15cj9FdC5qb2luOnZ0LmpvaW47eXI/RXQucmVzb2x2ZTp2dC5yZXNvbHZlLHlyP0V0LnJlbGF0aXZlOnZ0LnJlbGF0aXZlLHlyP0V0LmRpcm5hbWU6dnQuZGlybmFtZSx5cj9FdC5iYXNlbmFtZTp2dC5iYXNlbmFtZSx5cj9FdC5leHRuYW1lOnZ0LmV4dG5hbWUseXI/RXQuc2VwOnZ0LnNlcDtjb25zdCBmOD0vXlx3W1x3XGQrLi1dKiQvLHA4PS9eXC8vLGg4PS9eXC9cLy87ZnVuY3Rpb24gZDgoZSx0KXtpZighZS5zY2hlbWUmJnQpdGhyb3cgbmV3IEVycm9yKGBbVXJpRXJyb3JdOiBTY2hlbWUgaXMgbWlzc2luZzoge3NjaGVtZTogIiIsIGF1dGhvcml0eTogIiR7ZS5hdXRob3JpdHl9IiwgcGF0aDogIiR7ZS5wYXRofSIsIHF1ZXJ5OiAiJHtlLnF1ZXJ5fSIsIGZyYWdtZW50OiAiJHtlLmZyYWdtZW50fSJ9YCk7aWYoZS5zY2hlbWUmJiFmOC50ZXN0KGUuc2NoZW1lKSl0aHJvdyBuZXcgRXJyb3IoIltVcmlFcnJvcl06IFNjaGVtZSBjb250YWlucyBpbGxlZ2FsIGNoYXJhY3RlcnMuIik7aWYoZS5wYXRoKXtpZihlLmF1dGhvcml0eSl7aWYoIXA4LnRlc3QoZS5wYXRoKSl0aHJvdyBuZXcgRXJyb3IoJ1tVcmlFcnJvcl06IElmIGEgVVJJIGNvbnRhaW5zIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY29tcG9uZW50IG11c3QgZWl0aGVyIGJlIGVtcHR5IG9yIGJlZ2luIHdpdGggYSBzbGFzaCAoIi8iKSBjaGFyYWN0ZXInKX1lbHNlIGlmKGg4LnRlc3QoZS5wYXRoKSl0aHJvdyBuZXcgRXJyb3IoJ1tVcmlFcnJvcl06IElmIGEgVVJJIGRvZXMgbm90IGNvbnRhaW4gYW4gYXV0aG9yaXR5IGNvbXBvbmVudCwgdGhlbiB0aGUgcGF0aCBjYW5ub3QgYmVnaW4gd2l0aCB0d28gc2xhc2ggY2hhcmFjdGVycyAoIi8vIiknKX19ZnVuY3Rpb24gbTgoZSx0KXtyZXR1cm4hZSYmIXQ/ImZpbGUiOmV9ZnVuY3Rpb24gZzgoZSx0KXtzd2l0Y2goZSl7Y2FzZSJodHRwcyI6Y2FzZSJodHRwIjpjYXNlImZpbGUiOnQ/dFswXSE9PV9uJiYodD1fbit0KTp0PV9uO2JyZWFrfXJldHVybiB0fWNvbnN0IHdlPSIiLF9uPSIvIix5OD0vXigoW146Lz8jXSs/KTopPyhcL1wvKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/LztsZXQgS249Y2xhc3MgZ2Z7c3RhdGljIGlzVXJpKHQpe3JldHVybiB0IGluc3RhbmNlb2YgZ2Y/ITA6dD90eXBlb2YgdC5hdXRob3JpdHk9PSJzdHJpbmciJiZ0eXBlb2YgdC5mcmFnbWVudD09InN0cmluZyImJnR5cGVvZiB0LnBhdGg9PSJzdHJpbmciJiZ0eXBlb2YgdC5xdWVyeT09InN0cmluZyImJnR5cGVvZiB0LnNjaGVtZT09InN0cmluZyImJnR5cGVvZiB0LmZzUGF0aD09InN0cmluZyImJnR5cGVvZiB0LndpdGg9PSJmdW5jdGlvbiImJnR5cGVvZiB0LnRvU3RyaW5nPT0iZnVuY3Rpb24iOiExfWNvbnN0cnVjdG9yKHQsbixyLHMsaSxvPSExKXt0eXBlb2YgdD09Im9iamVjdCI/KHRoaXMuc2NoZW1lPXQuc2NoZW1lfHx3ZSx0aGlzLmF1dGhvcml0eT10LmF1dGhvcml0eXx8d2UsdGhpcy5wYXRoPXQucGF0aHx8d2UsdGhpcy5xdWVyeT10LnF1ZXJ5fHx3ZSx0aGlzLmZyYWdtZW50PXQuZnJhZ21lbnR8fHdlKToodGhpcy5zY2hlbWU9bTgodCxvKSx0aGlzLmF1dGhvcml0eT1ufHx3ZSx0aGlzLnBhdGg9ZzgodGhpcy5zY2hlbWUscnx8d2UpLHRoaXMucXVlcnk9c3x8d2UsdGhpcy5mcmFnbWVudD1pfHx3ZSxkOCh0aGlzLG8pKX1nZXQgZnNQYXRoKCl7cmV0dXJuIExmKHRoaXMsITEpfXdpdGgodCl7aWYoIXQpcmV0dXJuIHRoaXM7bGV0e3NjaGVtZTpuLGF1dGhvcml0eTpyLHBhdGg6cyxxdWVyeTppLGZyYWdtZW50Om99PXQ7cmV0dXJuIG49PT12b2lkIDA/bj10aGlzLnNjaGVtZTpuPT09bnVsbCYmKG49d2UpLHI9PT12b2lkIDA/cj10aGlzLmF1dGhvcml0eTpyPT09bnVsbCYmKHI9d2UpLHM9PT12b2lkIDA/cz10aGlzLnBhdGg6cz09PW51bGwmJihzPXdlKSxpPT09dm9pZCAwP2k9dGhpcy5xdWVyeTppPT09bnVsbCYmKGk9d2UpLG89PT12b2lkIDA/bz10aGlzLmZyYWdtZW50Om89PT1udWxsJiYobz13ZSksbj09PXRoaXMuc2NoZW1lJiZyPT09dGhpcy5hdXRob3JpdHkmJnM9PT10aGlzLnBhdGgmJmk9PT10aGlzLnF1ZXJ5JiZvPT09dGhpcy5mcmFnbWVudD90aGlzOm5ldyBOaShuLHIscyxpLG8pfXN0YXRpYyBwYXJzZSh0LG49ITEpe2NvbnN0IHI9eTguZXhlYyh0KTtyZXR1cm4gcj9uZXcgTmkoclsyXXx8d2UsSXUocls0XXx8d2UpLEl1KHJbNV18fHdlKSxJdShyWzddfHx3ZSksSXUocls5XXx8d2UpLG4pOm5ldyBOaSh3ZSx3ZSx3ZSx3ZSx3ZSl9c3RhdGljIGZpbGUodCl7bGV0IG49d2U7aWYodGEmJih0PXQucmVwbGFjZSgvXFwvZyxfbikpLHRbMF09PT1fbiYmdFsxXT09PV9uKXtjb25zdCByPXQuaW5kZXhPZihfbiwyKTtyPT09LTE/KG49dC5zdWJzdHJpbmcoMiksdD1fbik6KG49dC5zdWJzdHJpbmcoMixyKSx0PXQuc3Vic3RyaW5nKHIpfHxfbil9cmV0dXJuIG5ldyBOaSgiZmlsZSIsbix0LHdlLHdlKX1zdGF0aWMgZnJvbSh0LG4pe3JldHVybiBuZXcgTmkodC5zY2hlbWUsdC5hdXRob3JpdHksdC5wYXRoLHQucXVlcnksdC5mcmFnbWVudCxuKX1zdGF0aWMgam9pblBhdGgodCwuLi5uKXtpZighdC5wYXRoKXRocm93IG5ldyBFcnJvcigiW1VyaUVycm9yXTogY2Fubm90IGNhbGwgam9pblBhdGggb24gVVJJIHdpdGhvdXQgcGF0aCIpO2xldCByO3JldHVybiB0YSYmdC5zY2hlbWU9PT0iZmlsZSI/cj1nZi5maWxlKEV0LmpvaW4oTGYodCwhMCksLi4ubikpLnBhdGg6cj12dC5qb2luKHQucGF0aCwuLi5uKSx0LndpdGgoe3BhdGg6cn0pfXRvU3RyaW5nKHQ9ITEpe3JldHVybiAkZih0aGlzLHQpfXRvSlNPTigpe3JldHVybiB0aGlzfXN0YXRpYyByZXZpdmUodCl7aWYodCl7aWYodCBpbnN0YW5jZW9mIGdmKXJldHVybiB0O3tjb25zdCBuPW5ldyBOaSh0KTtyZXR1cm4gbi5fZm9ybWF0dGVkPXQuZXh0ZXJuYWw/P251bGwsbi5fZnNQYXRoPXQuX3NlcD09PXAxP3QuZnNQYXRoPz9udWxsOm51bGwsbn19ZWxzZSByZXR1cm4gdH19O2NvbnN0IHAxPXRhPzE6dm9pZCAwO2NsYXNzIE5pIGV4dGVuZHMgS257Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpLHRoaXMuX2Zvcm1hdHRlZD1udWxsLHRoaXMuX2ZzUGF0aD1udWxsfWdldCBmc1BhdGgoKXtyZXR1cm4gdGhpcy5fZnNQYXRofHwodGhpcy5fZnNQYXRoPUxmKHRoaXMsITEpKSx0aGlzLl9mc1BhdGh9dG9TdHJpbmcodD0hMSl7cmV0dXJuIHQ/JGYodGhpcywhMCk6KHRoaXMuX2Zvcm1hdHRlZHx8KHRoaXMuX2Zvcm1hdHRlZD0kZih0aGlzLCExKSksdGhpcy5fZm9ybWF0dGVkKX10b0pTT04oKXtjb25zdCB0PXskbWlkOjF9O3JldHVybiB0aGlzLl9mc1BhdGgmJih0LmZzUGF0aD10aGlzLl9mc1BhdGgsdC5fc2VwPXAxKSx0aGlzLl9mb3JtYXR0ZWQmJih0LmV4dGVybmFsPXRoaXMuX2Zvcm1hdHRlZCksdGhpcy5wYXRoJiYodC5wYXRoPXRoaXMucGF0aCksdGhpcy5zY2hlbWUmJih0LnNjaGVtZT10aGlzLnNjaGVtZSksdGhpcy5hdXRob3JpdHkmJih0LmF1dGhvcml0eT10aGlzLmF1dGhvcml0eSksdGhpcy5xdWVyeSYmKHQucXVlcnk9dGhpcy5xdWVyeSksdGhpcy5mcmFnbWVudCYmKHQuZnJhZ21lbnQ9dGhpcy5mcmFnbWVudCksdH19Y29uc3QgaDE9ezU4OiIlM0EiLDQ3OiIlMkYiLDYzOiIlM0YiLDM1OiIlMjMiLDkxOiIlNUIiLDkzOiIlNUQiLDY0OiIlNDAiLDMzOiIlMjEiLDM2OiIlMjQiLDM4OiIlMjYiLDM5OiIlMjciLDQwOiIlMjgiLDQxOiIlMjkiLDQyOiIlMkEiLDQzOiIlMkIiLDQ0OiIlMkMiLDU5OiIlM0IiLDYxOiIlM0QiLDMyOiIlMjAifTtmdW5jdGlvbiBkMShlLHQsbil7bGV0IHIscz0tMTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoO2krKyl7Y29uc3Qgbz1lLmNoYXJDb2RlQXQoaSk7aWYobz49OTcmJm88PTEyMnx8bz49NjUmJm88PTkwfHxvPj00OCYmbzw9NTd8fG89PT00NXx8bz09PTQ2fHxvPT09OTV8fG89PT0xMjZ8fHQmJm89PT00N3x8biYmbz09PTkxfHxuJiZvPT09OTN8fG4mJm89PT01OClzIT09LTEmJihyKz1lbmNvZGVVUklDb21wb25lbnQoZS5zdWJzdHJpbmcocyxpKSkscz0tMSksciE9PXZvaWQgMCYmKHIrPWUuY2hhckF0KGkpKTtlbHNle3I9PT12b2lkIDAmJihyPWUuc3Vic3RyKDAsaSkpO2NvbnN0IGE9aDFbb107YSE9PXZvaWQgMD8ocyE9PS0xJiYocis9ZW5jb2RlVVJJQ29tcG9uZW50KGUuc3Vic3RyaW5nKHMsaSkpLHM9LTEpLHIrPWEpOnM9PT0tMSYmKHM9aSl9fXJldHVybiBzIT09LTEmJihyKz1lbmNvZGVVUklDb21wb25lbnQoZS5zdWJzdHJpbmcocykpKSxyIT09dm9pZCAwP3I6ZX1mdW5jdGlvbiBEOChlKXtsZXQgdDtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl7Y29uc3Qgcj1lLmNoYXJDb2RlQXQobik7cj09PTM1fHxyPT09NjM/KHQ9PT12b2lkIDAmJih0PWUuc3Vic3RyKDAsbikpLHQrPWgxW3JdKTp0IT09dm9pZCAwJiYodCs9ZVtuXSl9cmV0dXJuIHQhPT12b2lkIDA/dDplfWZ1bmN0aW9uIExmKGUsdCl7bGV0IG47cmV0dXJuIGUuYXV0aG9yaXR5JiZlLnBhdGgubGVuZ3RoPjEmJmUuc2NoZW1lPT09ImZpbGUiP249YC8vJHtlLmF1dGhvcml0eX0ke2UucGF0aH1gOmUucGF0aC5jaGFyQ29kZUF0KDApPT09NDcmJihlLnBhdGguY2hhckNvZGVBdCgxKT49NjUmJmUucGF0aC5jaGFyQ29kZUF0KDEpPD05MHx8ZS5wYXRoLmNoYXJDb2RlQXQoMSk+PTk3JiZlLnBhdGguY2hhckNvZGVBdCgxKTw9MTIyKSYmZS5wYXRoLmNoYXJDb2RlQXQoMik9PT01OD90P249ZS5wYXRoLnN1YnN0cigxKTpuPWUucGF0aFsxXS50b0xvd2VyQ2FzZSgpK2UucGF0aC5zdWJzdHIoMik6bj1lLnBhdGgsdGEmJihuPW4ucmVwbGFjZSgvXC8vZywiXFwiKSksbn1mdW5jdGlvbiAkZihlLHQpe2NvbnN0IG49dD9EODpkMTtsZXQgcj0iIix7c2NoZW1lOnMsYXV0aG9yaXR5OmkscGF0aDpvLHF1ZXJ5OmEsZnJhZ21lbnQ6dX09ZTtpZihzJiYocis9cyxyKz0iOiIpLChpfHxzPT09ImZpbGUiKSYmKHIrPV9uLHIrPV9uKSxpKXtsZXQgbD1pLmluZGV4T2YoIkAiKTtpZihsIT09LTEpe2NvbnN0IGY9aS5zdWJzdHIoMCxsKTtpPWkuc3Vic3RyKGwrMSksbD1mLmxhc3RJbmRleE9mKCI6IiksbD09PS0xP3IrPW4oZiwhMSwhMSk6KHIrPW4oZi5zdWJzdHIoMCxsKSwhMSwhMSkscis9IjoiLHIrPW4oZi5zdWJzdHIobCsxKSwhMSwhMCkpLHIrPSJAIn1pPWkudG9Mb3dlckNhc2UoKSxsPWkubGFzdEluZGV4T2YoIjoiKSxsPT09LTE/cis9bihpLCExLCEwKToocis9bihpLnN1YnN0cigwLGwpLCExLCEwKSxyKz1pLnN1YnN0cihsKSl9aWYobyl7aWYoby5sZW5ndGg+PTMmJm8uY2hhckNvZGVBdCgwKT09PTQ3JiZvLmNoYXJDb2RlQXQoMik9PT01OCl7Y29uc3QgbD1vLmNoYXJDb2RlQXQoMSk7bD49NjUmJmw8PTkwJiYobz1gLyR7U3RyaW5nLmZyb21DaGFyQ29kZShsKzMyKX06JHtvLnN1YnN0cigzKX1gKX1lbHNlIGlmKG8ubGVuZ3RoPj0yJiZvLmNoYXJDb2RlQXQoMSk9PT01OCl7Y29uc3QgbD1vLmNoYXJDb2RlQXQoMCk7bD49NjUmJmw8PTkwJiYobz1gJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGwrMzIpfToke28uc3Vic3RyKDIpfWApfXIrPW4obywhMCwhMSl9cmV0dXJuIGEmJihyKz0iPyIscis9bihhLCExLCExKSksdSYmKHIrPSIjIixyKz10P3U6ZDEodSwhMSwhMSkpLHJ9ZnVuY3Rpb24gbTEoZSl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2h7cmV0dXJuIGUubGVuZ3RoPjM/ZS5zdWJzdHIoMCwzKSttMShlLnN1YnN0cigzKSk6ZX19Y29uc3QgZzE9LyglWzAtOUEtWmEtel1bMC05QS1aYS16XSkrL2c7ZnVuY3Rpb24gSXUoZSl7cmV0dXJuIGUubWF0Y2goZzEpP2UucmVwbGFjZShnMSx0PT5tMSh0KSk6ZX12YXIgbnM7KGZ1bmN0aW9uKGUpe2UuaW5NZW1vcnk9ImlubWVtb3J5IixlLnZzY29kZT0idnNjb2RlIixlLmludGVybmFsPSJwcml2YXRlIixlLndhbGtUaHJvdWdoPSJ3YWxrVGhyb3VnaCIsZS53YWxrVGhyb3VnaFNuaXBwZXQ9IndhbGtUaHJvdWdoU25pcHBldCIsZS5odHRwPSJodHRwIixlLmh0dHBzPSJodHRwcyIsZS5maWxlPSJmaWxlIixlLm1haWx0bz0ibWFpbHRvIixlLnVudGl0bGVkPSJ1bnRpdGxlZCIsZS5kYXRhPSJkYXRhIixlLmNvbW1hbmQ9ImNvbW1hbmQiLGUudnNjb2RlUmVtb3RlPSJ2c2NvZGUtcmVtb3RlIixlLnZzY29kZVJlbW90ZVJlc291cmNlPSJ2c2NvZGUtcmVtb3RlLXJlc291cmNlIixlLnZzY29kZU1hbmFnZWRSZW1vdGVSZXNvdXJjZT0idnNjb2RlLW1hbmFnZWQtcmVtb3RlLXJlc291cmNlIixlLnZzY29kZVVzZXJEYXRhPSJ2c2NvZGUtdXNlcmRhdGEiLGUudnNjb2RlQ3VzdG9tRWRpdG9yPSJ2c2NvZGUtY3VzdG9tLWVkaXRvciIsZS52c2NvZGVOb3RlYm9va0NlbGw9InZzY29kZS1ub3RlYm9vay1jZWxsIixlLnZzY29kZU5vdGVib29rQ2VsbE1ldGFkYXRhPSJ2c2NvZGUtbm90ZWJvb2stY2VsbC1tZXRhZGF0YSIsZS52c2NvZGVOb3RlYm9va0NlbGxNZXRhZGF0YURpZmY9InZzY29kZS1ub3RlYm9vay1jZWxsLW1ldGFkYXRhLWRpZmYiLGUudnNjb2RlTm90ZWJvb2tDZWxsT3V0cHV0PSJ2c2NvZGUtbm90ZWJvb2stY2VsbC1vdXRwdXQiLGUudnNjb2RlTm90ZWJvb2tDZWxsT3V0cHV0RGlmZj0idnNjb2RlLW5vdGVib29rLWNlbGwtb3V0cHV0LWRpZmYiLGUudnNjb2RlTm90ZWJvb2tNZXRhZGF0YT0idnNjb2RlLW5vdGVib29rLW1ldGFkYXRhIixlLnZzY29kZUludGVyYWN0aXZlSW5wdXQ9InZzY29kZS1pbnRlcmFjdGl2ZS1pbnB1dCIsZS52c2NvZGVTZXR0aW5ncz0idnNjb2RlLXNldHRpbmdzIixlLnZzY29kZVdvcmtzcGFjZVRydXN0PSJ2c2NvZGUtd29ya3NwYWNlLXRydXN0IixlLnZzY29kZVRlcm1pbmFsPSJ2c2NvZGUtdGVybWluYWwiLGUudnNjb2RlQ2hhdENvZGVCbG9jaz0idnNjb2RlLWNoYXQtY29kZS1ibG9jayIsZS52c2NvZGVDaGF0Q29kZUNvbXBhcmVCbG9jaz0idnNjb2RlLWNoYXQtY29kZS1jb21wYXJlLWJsb2NrIixlLnZzY29kZUNoYXRTZXNzc2lvbj0idnNjb2RlLWNoYXQtZWRpdG9yIixlLndlYnZpZXdQYW5lbD0id2Vidmlldy1wYW5lbCIsZS52c2NvZGVXZWJ2aWV3PSJ2c2NvZGUtd2VidmlldyIsZS5leHRlbnNpb249ImV4dGVuc2lvbiIsZS52c2NvZGVGaWxlUmVzb3VyY2U9InZzY29kZS1maWxlIixlLnRtcD0idG1wIixlLnZzbHM9InZzbHMiLGUudnNjb2RlU291cmNlQ29udHJvbD0idnNjb2RlLXNjbSIsZS5jb21tZW50c0lucHV0PSJjb21tZW50IixlLmNvZGVTZXR0aW5nPSJjb2RlLXNldHRpbmciLGUub3V0cHV0Q2hhbm5lbD0ib3V0cHV0In0pKG5zfHwobnM9e30pKTtjb25zdCBiOD0idGtuIjtjbGFzcyBFOHtjb25zdHJ1Y3Rvcigpe3RoaXMuX2hvc3RzPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fcG9ydHM9T2JqZWN0LmNyZWF0ZShudWxsKSx0aGlzLl9jb25uZWN0aW9uVG9rZW5zPU9iamVjdC5jcmVhdGUobnVsbCksdGhpcy5fcHJlZmVycmVkV2ViU2NoZW1hPSJodHRwIix0aGlzLl9kZWxlZ2F0ZT1udWxsLHRoaXMuX3NlcnZlclJvb3RQYXRoPSIvIn1zZXRQcmVmZXJyZWRXZWJTY2hlbWEodCl7dGhpcy5fcHJlZmVycmVkV2ViU2NoZW1hPXR9Z2V0IF9yZW1vdGVSZXNvdXJjZXNQYXRoKCl7cmV0dXJuIHZ0LmpvaW4odGhpcy5fc2VydmVyUm9vdFBhdGgsbnMudnNjb2RlUmVtb3RlUmVzb3VyY2UpfXJld3JpdGUodCl7aWYodGhpcy5fZGVsZWdhdGUpdHJ5e3JldHVybiB0aGlzLl9kZWxlZ2F0ZSh0KX1jYXRjaChhKXtyZXR1cm4gTWUoYSksdH1jb25zdCBuPXQuYXV0aG9yaXR5O2xldCByPXRoaXMuX2hvc3RzW25dO3ImJnIuaW5kZXhPZigiOiIpIT09LTEmJnIuaW5kZXhPZigiWyIpPT09LTEmJihyPWBbJHtyfV1gKTtjb25zdCBzPXRoaXMuX3BvcnRzW25dLGk9dGhpcy5fY29ubmVjdGlvblRva2Vuc1tuXTtsZXQgbz1gcGF0aD0ke2VuY29kZVVSSUNvbXBvbmVudCh0LnBhdGgpfWA7cmV0dXJuIHR5cGVvZiBpPT0ic3RyaW5nIiYmKG8rPWAmJHtiOH09JHtlbmNvZGVVUklDb21wb25lbnQoaSl9YCksS24uZnJvbSh7c2NoZW1lOlJDP3RoaXMuX3ByZWZlcnJlZFdlYlNjaGVtYTpucy52c2NvZGVSZW1vdGVSZXNvdXJjZSxhdXRob3JpdHk6YCR7cn06JHtzfWAscGF0aDp0aGlzLl9yZW1vdGVSZXNvdXJjZXNQYXRoLHF1ZXJ5Om99KX19Y29uc3Qgdjg9bmV3IEU4LEY4PSJ2c2NvZGUtYXBwIixEdT1jbGFzcyBEdXthc0Jyb3dzZXJVcmkodCl7Y29uc3Qgbj10aGlzLnRvVXJpKHQpO3JldHVybiB0aGlzLnVyaVRvQnJvd3NlclVyaShuKX11cmlUb0Jyb3dzZXJVcmkodCl7cmV0dXJuIHQuc2NoZW1lPT09bnMudnNjb2RlUmVtb3RlP3Y4LnJld3JpdGUodCk6dC5zY2hlbWU9PT1ucy5maWxlJiYoT0N8fGpDPT09YCR7bnMudnNjb2RlRmlsZVJlc291cmNlfTovLyR7RHUuRkFMTEJBQ0tfQVVUSE9SSVRZfWApP3Qud2l0aCh7c2NoZW1lOm5zLnZzY29kZUZpbGVSZXNvdXJjZSxhdXRob3JpdHk6dC5hdXRob3JpdHl8fER1LkZBTExCQUNLX0FVVEhPUklUWSxxdWVyeTpudWxsLGZyYWdtZW50Om51bGx9KTp0fXRvVXJpKHQsbil7aWYoS24uaXNVcmkodCkpcmV0dXJuIHQ7aWYoZ2xvYmFsVGhpcy5fVlNDT0RFX0ZJTEVfUk9PVCl7Y29uc3Qgcj1nbG9iYWxUaGlzLl9WU0NPREVfRklMRV9ST09UO2lmKC9eXHdbXHdcZCsuLV0qOlwvXC8vLnRlc3QocikpcmV0dXJuIEtuLmpvaW5QYXRoKEtuLnBhcnNlKHIsITApLHQpO2NvbnN0IHM9Yzgocix0KTtyZXR1cm4gS24uZmlsZShzKX1yZXR1cm4gS24ucGFyc2Uobi50b1VybCh0KSl9fTtEdS5GQUxMQkFDS19BVVRIT1JJVFk9Rjg7bGV0IEJmPUR1O2NvbnN0IHkxPW5ldyBCZjt2YXIgRDE7KGZ1bmN0aW9uKGUpe2NvbnN0IHQ9bmV3IE1hcChbWyIxIix7IkNyb3NzLU9yaWdpbi1PcGVuZXItUG9saWN5Ijoic2FtZS1vcmlnaW4ifV0sWyIyIix7IkNyb3NzLU9yaWdpbi1FbWJlZGRlci1Qb2xpY3kiOiJyZXF1aXJlLWNvcnAifV0sWyIzIix7IkNyb3NzLU9yaWdpbi1PcGVuZXItUG9saWN5Ijoic2FtZS1vcmlnaW4iLCJDcm9zcy1PcmlnaW4tRW1iZWRkZXItUG9saWN5IjoicmVxdWlyZS1jb3JwIn1dXSk7ZS5Db29wQW5kQ29lcD1PYmplY3QuZnJlZXplKHQuZ2V0KCIzIikpO2NvbnN0IG49InZzY29kZS1jb2kiO2Z1bmN0aW9uIHIoaSl7bGV0IG87dHlwZW9mIGk9PSJzdHJpbmciP289bmV3IFVSTChpKS5zZWFyY2hQYXJhbXM6aSBpbnN0YW5jZW9mIFVSTD9vPWkuc2VhcmNoUGFyYW1zOktuLmlzVXJpKGkpJiYobz1uZXcgVVJMKGkudG9TdHJpbmcoITApKS5zZWFyY2hQYXJhbXMpO2NvbnN0IGE9bz09bnVsbD92b2lkIDA6by5nZXQobik7aWYoYSlyZXR1cm4gdC5nZXQoYSl9ZS5nZXRIZWFkZXJzRnJvbVF1ZXJ5PXI7ZnVuY3Rpb24gcyhpLG8sYSl7aWYoIWdsb2JhbFRoaXMuY3Jvc3NPcmlnaW5Jc29sYXRlZClyZXR1cm47Y29uc3QgdT1vJiZhPyIzIjphPyIyIjoiMSI7aSBpbnN0YW5jZW9mIFVSTFNlYXJjaFBhcmFtcz9pLnNldChuLHUpOmlbbl09dX1lLmFkZFNlYXJjaFBhcmFtPXN9KShEMXx8KEQxPXt9KSk7Y29uc3QgX2Y9ImRlZmF1bHQiLEE4PSIkaW5pdGlhbGl6ZSI7Y2xhc3Mgdzh7Y29uc3RydWN0b3IodCxuLHIscyxpKXt0aGlzLnZzV29ya2VyPXQsdGhpcy5yZXE9bix0aGlzLmNoYW5uZWw9cix0aGlzLm1ldGhvZD1zLHRoaXMuYXJncz1pLHRoaXMudHlwZT0wfX1jbGFzcyBiMXtjb25zdHJ1Y3Rvcih0LG4scixzKXt0aGlzLnZzV29ya2VyPXQsdGhpcy5zZXE9bix0aGlzLnJlcz1yLHRoaXMuZXJyPXMsdGhpcy50eXBlPTF9fWNsYXNzIEM4e2NvbnN0cnVjdG9yKHQsbixyLHMsaSl7dGhpcy52c1dvcmtlcj10LHRoaXMucmVxPW4sdGhpcy5jaGFubmVsPXIsdGhpcy5ldmVudE5hbWU9cyx0aGlzLmFyZz1pLHRoaXMudHlwZT0yfX1jbGFzcyBTOHtjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy52c1dvcmtlcj10LHRoaXMucmVxPW4sdGhpcy5ldmVudD1yLHRoaXMudHlwZT0zfX1jbGFzcyB4OHtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMudnNXb3JrZXI9dCx0aGlzLnJlcT1uLHRoaXMudHlwZT00fX1jbGFzcyBrOHtjb25zdHJ1Y3Rvcih0KXt0aGlzLl93b3JrZXJJZD0tMSx0aGlzLl9oYW5kbGVyPXQsdGhpcy5fbGFzdFNlbnRSZXE9MCx0aGlzLl9wZW5kaW5nUmVwbGllcz1PYmplY3QuY3JlYXRlKG51bGwpLHRoaXMuX3BlbmRpbmdFbWl0dGVycz1uZXcgTWFwLHRoaXMuX3BlbmRpbmdFdmVudHM9bmV3IE1hcH1zZXRXb3JrZXJJZCh0KXt0aGlzLl93b3JrZXJJZD10fXNlbmRNZXNzYWdlKHQsbixyKXtjb25zdCBzPVN0cmluZygrK3RoaXMuX2xhc3RTZW50UmVxKTtyZXR1cm4gbmV3IFByb21pc2UoKGksbyk9Pnt0aGlzLl9wZW5kaW5nUmVwbGllc1tzXT17cmVzb2x2ZTppLHJlamVjdDpvfSx0aGlzLl9zZW5kKG5ldyB3OCh0aGlzLl93b3JrZXJJZCxzLHQsbixyKSl9KX1saXN0ZW4odCxuLHIpe2xldCBzPW51bGw7Y29uc3QgaT1uZXcgbG4oe29uV2lsbEFkZEZpcnN0TGlzdGVuZXI6KCk9PntzPVN0cmluZygrK3RoaXMuX2xhc3RTZW50UmVxKSx0aGlzLl9wZW5kaW5nRW1pdHRlcnMuc2V0KHMsaSksdGhpcy5fc2VuZChuZXcgQzgodGhpcy5fd29ya2VySWQscyx0LG4scikpfSxvbkRpZFJlbW92ZUxhc3RMaXN0ZW5lcjooKT0+e3RoaXMuX3BlbmRpbmdFbWl0dGVycy5kZWxldGUocyksdGhpcy5fc2VuZChuZXcgeDgodGhpcy5fd29ya2VySWQscykpLHM9bnVsbH19KTtyZXR1cm4gaS5ldmVudH1oYW5kbGVNZXNzYWdlKHQpeyF0fHwhdC52c1dvcmtlcnx8dGhpcy5fd29ya2VySWQhPT0tMSYmdC52c1dvcmtlciE9PXRoaXMuX3dvcmtlcklkfHx0aGlzLl9oYW5kbGVNZXNzYWdlKHQpfWNyZWF0ZVByb3h5VG9SZW1vdGVDaGFubmVsKHQsbil7Y29uc3Qgcj17Z2V0OihzLGkpPT4odHlwZW9mIGk9PSJzdHJpbmciJiYhc1tpXSYmKHYxKGkpP3NbaV09bz0+dGhpcy5saXN0ZW4odCxpLG8pOkUxKGkpP3NbaV09dGhpcy5saXN0ZW4odCxpLHZvaWQgMCk6aS5jaGFyQ29kZUF0KDApPT09MzYmJihzW2ldPWFzeW5jKC4uLm8pPT4oYXdhaXQobj09bnVsbD92b2lkIDA6bigpKSx0aGlzLnNlbmRNZXNzYWdlKHQsaSxvKSkpKSxzW2ldKX07cmV0dXJuIG5ldyBQcm94eShPYmplY3QuY3JlYXRlKG51bGwpLHIpfV9oYW5kbGVNZXNzYWdlKHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UgMTpyZXR1cm4gdGhpcy5faGFuZGxlUmVwbHlNZXNzYWdlKHQpO2Nhc2UgMDpyZXR1cm4gdGhpcy5faGFuZGxlUmVxdWVzdE1lc3NhZ2UodCk7Y2FzZSAyOnJldHVybiB0aGlzLl9oYW5kbGVTdWJzY3JpYmVFdmVudE1lc3NhZ2UodCk7Y2FzZSAzOnJldHVybiB0aGlzLl9oYW5kbGVFdmVudE1lc3NhZ2UodCk7Y2FzZSA0OnJldHVybiB0aGlzLl9oYW5kbGVVbnN1YnNjcmliZUV2ZW50TWVzc2FnZSh0KX19X2hhbmRsZVJlcGx5TWVzc2FnZSh0KXtpZighdGhpcy5fcGVuZGluZ1JlcGxpZXNbdC5zZXFdKXtjb25zb2xlLndhcm4oIkdvdCByZXBseSB0byB1bmtub3duIHNlcSIpO3JldHVybn1jb25zdCBuPXRoaXMuX3BlbmRpbmdSZXBsaWVzW3Quc2VxXTtpZihkZWxldGUgdGhpcy5fcGVuZGluZ1JlcGxpZXNbdC5zZXFdLHQuZXJyKXtsZXQgcj10LmVycjt0LmVyci4kaXNFcnJvciYmKHI9bmV3IEVycm9yLHIubmFtZT10LmVyci5uYW1lLHIubWVzc2FnZT10LmVyci5tZXNzYWdlLHIuc3RhY2s9dC5lcnIuc3RhY2spLG4ucmVqZWN0KHIpO3JldHVybn1uLnJlc29sdmUodC5yZXMpfV9oYW5kbGVSZXF1ZXN0TWVzc2FnZSh0KXtjb25zdCBuPXQucmVxO3RoaXMuX2hhbmRsZXIuaGFuZGxlTWVzc2FnZSh0LmNoYW5uZWwsdC5tZXRob2QsdC5hcmdzKS50aGVuKHM9Pnt0aGlzLl9zZW5kKG5ldyBiMSh0aGlzLl93b3JrZXJJZCxuLHMsdm9pZCAwKSl9LHM9PntzLmRldGFpbCBpbnN0YW5jZW9mIEVycm9yJiYocy5kZXRhaWw9Wm8ocy5kZXRhaWwpKSx0aGlzLl9zZW5kKG5ldyBiMSh0aGlzLl93b3JrZXJJZCxuLHZvaWQgMCxabyhzKSkpfSl9X2hhbmRsZVN1YnNjcmliZUV2ZW50TWVzc2FnZSh0KXtjb25zdCBuPXQucmVxLHI9dGhpcy5faGFuZGxlci5oYW5kbGVFdmVudCh0LmNoYW5uZWwsdC5ldmVudE5hbWUsdC5hcmcpKHM9Pnt0aGlzLl9zZW5kKG5ldyBTOCh0aGlzLl93b3JrZXJJZCxuLHMpKX0pO3RoaXMuX3BlbmRpbmdFdmVudHMuc2V0KG4scil9X2hhbmRsZUV2ZW50TWVzc2FnZSh0KXtpZighdGhpcy5fcGVuZGluZ0VtaXR0ZXJzLmhhcyh0LnJlcSkpe2NvbnNvbGUud2FybigiR290IGV2ZW50IGZvciB1bmtub3duIHJlcSIpO3JldHVybn10aGlzLl9wZW5kaW5nRW1pdHRlcnMuZ2V0KHQucmVxKS5maXJlKHQuZXZlbnQpfV9oYW5kbGVVbnN1YnNjcmliZUV2ZW50TWVzc2FnZSh0KXtpZighdGhpcy5fcGVuZGluZ0V2ZW50cy5oYXModC5yZXEpKXtjb25zb2xlLndhcm4oIkdvdCB1bnN1YnNjcmliZSBmb3IgdW5rbm93biByZXEiKTtyZXR1cm59dGhpcy5fcGVuZGluZ0V2ZW50cy5nZXQodC5yZXEpLmRpc3Bvc2UoKSx0aGlzLl9wZW5kaW5nRXZlbnRzLmRlbGV0ZSh0LnJlcSl9X3NlbmQodCl7Y29uc3Qgbj1bXTtpZih0LnR5cGU9PT0wKWZvcihsZXQgcj0wO3I8dC5hcmdzLmxlbmd0aDtyKyspdC5hcmdzW3JdaW5zdGFuY2VvZiBBcnJheUJ1ZmZlciYmbi5wdXNoKHQuYXJnc1tyXSk7ZWxzZSB0LnR5cGU9PT0xJiZ0LnJlcyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyJiZuLnB1c2godC5yZXMpO3RoaXMuX2hhbmRsZXIuc2VuZE1lc3NhZ2UodCxuKX19ZnVuY3Rpb24gRTEoZSl7cmV0dXJuIGVbMF09PT0ibyImJmVbMV09PT0ibiImJmwxKGUuY2hhckNvZGVBdCgyKSl9ZnVuY3Rpb24gdjEoZSl7cmV0dXJuL15vbkR5bmFtaWMvLnRlc3QoZSkmJmwxKGUuY2hhckNvZGVBdCg5KSl9Y2xhc3MgVDh7Y29uc3RydWN0b3IodCxuKXt0aGlzLl9sb2NhbENoYW5uZWxzPW5ldyBNYXAsdGhpcy5fcmVtb3RlQ2hhbm5lbHM9bmV3IE1hcCx0aGlzLl9yZXF1ZXN0SGFuZGxlckZhY3Rvcnk9bix0aGlzLl9yZXF1ZXN0SGFuZGxlcj1udWxsLHRoaXMuX3Byb3RvY29sPW5ldyBrOCh7c2VuZE1lc3NhZ2U6KHIscyk9Pnt0KHIscyl9LGhhbmRsZU1lc3NhZ2U6KHIscyxpKT0+dGhpcy5faGFuZGxlTWVzc2FnZShyLHMsaSksaGFuZGxlRXZlbnQ6KHIscyxpKT0+dGhpcy5faGFuZGxlRXZlbnQocixzLGkpfSl9b25tZXNzYWdlKHQpe3RoaXMuX3Byb3RvY29sLmhhbmRsZU1lc3NhZ2UodCl9X2hhbmRsZU1lc3NhZ2UodCxuLHIpe2lmKHQ9PT1fZiYmbj09PUE4KXJldHVybiB0aGlzLmluaXRpYWxpemUoclswXSxyWzFdLHJbMl0pO2NvbnN0IHM9dD09PV9mP3RoaXMuX3JlcXVlc3RIYW5kbGVyOnRoaXMuX2xvY2FsQ2hhbm5lbHMuZ2V0KHQpO2lmKCFzKXJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoYE1pc3NpbmcgY2hhbm5lbCAke3R9IG9uIHdvcmtlciB0aHJlYWRgKSk7aWYodHlwZW9mIHNbbl0hPSJmdW5jdGlvbiIpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcihgTWlzc2luZyBtZXRob2QgJHtufSBvbiB3b3JrZXIgdGhyZWFkIGNoYW5uZWwgJHt0fWApKTt0cnl7cmV0dXJuIFByb21pc2UucmVzb2x2ZShzW25dLmFwcGx5KHMscikpfWNhdGNoKGkpe3JldHVybiBQcm9taXNlLnJlamVjdChpKX19X2hhbmRsZUV2ZW50KHQsbixyKXtjb25zdCBzPXQ9PT1fZj90aGlzLl9yZXF1ZXN0SGFuZGxlcjp0aGlzLl9sb2NhbENoYW5uZWxzLmdldCh0KTtpZighcyl0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgY2hhbm5lbCAke3R9IG9uIHdvcmtlciB0aHJlYWRgKTtpZih2MShuKSl7Y29uc3QgaT1zW25dLmNhbGwocyxyKTtpZih0eXBlb2YgaSE9ImZ1bmN0aW9uIil0aHJvdyBuZXcgRXJyb3IoYE1pc3NpbmcgZHluYW1pYyBldmVudCAke259IG9uIHJlcXVlc3QgaGFuZGxlci5gKTtyZXR1cm4gaX1pZihFMShuKSl7Y29uc3QgaT1zW25dO2lmKHR5cGVvZiBpIT0iZnVuY3Rpb24iKXRocm93IG5ldyBFcnJvcihgTWlzc2luZyBldmVudCAke259IG9uIHJlcXVlc3QgaGFuZGxlci5gKTtyZXR1cm4gaX10aHJvdyBuZXcgRXJyb3IoYE1hbGZvcm1lZCBldmVudCBuYW1lICR7bn1gKX1nZXRDaGFubmVsKHQpe2lmKCF0aGlzLl9yZW1vdGVDaGFubmVscy5oYXModCkpe2NvbnN0IG49dGhpcy5fcHJvdG9jb2wuY3JlYXRlUHJveHlUb1JlbW90ZUNoYW5uZWwodCk7dGhpcy5fcmVtb3RlQ2hhbm5lbHMuc2V0KHQsbil9cmV0dXJuIHRoaXMuX3JlbW90ZUNoYW5uZWxzLmdldCh0KX1hc3luYyBpbml0aWFsaXplKHQsbixyKXtpZih0aGlzLl9wcm90b2NvbC5zZXRXb3JrZXJJZCh0KSx0aGlzLl9yZXF1ZXN0SGFuZGxlckZhY3Rvcnkpe3RoaXMuX3JlcXVlc3RIYW5kbGVyPXRoaXMuX3JlcXVlc3RIYW5kbGVyRmFjdG9yeSh0aGlzKTtyZXR1cm59cmV0dXJuIG4mJih0eXBlb2Ygbi5iYXNlVXJsPCJ1IiYmZGVsZXRlIG4uYmFzZVVybCx0eXBlb2Ygbi5wYXRoczwidSImJnR5cGVvZiBuLnBhdGhzLnZzPCJ1IiYmZGVsZXRlIG4ucGF0aHMudnMsdHlwZW9mIG4udHJ1c3RlZFR5cGVzUG9saWN5PCJ1IiYmZGVsZXRlIG4udHJ1c3RlZFR5cGVzUG9saWN5LG4uY2F0Y2hFcnJvcj0hMCxnbG9iYWxUaGlzLnJlcXVpcmUuY29uZmlnKG4pKSxpbXBvcnQoYCR7eTEuYXNCcm93c2VyVXJpKGAke3J9LmpzYCkudG9TdHJpbmcoITApfWApLnRoZW4oaT0+e2lmKHRoaXMuX3JlcXVlc3RIYW5kbGVyPWkuY3JlYXRlKHRoaXMpLCF0aGlzLl9yZXF1ZXN0SGFuZGxlcil0aHJvdyBuZXcgRXJyb3IoIk5vIFJlcXVlc3RIYW5kbGVyISIpfSl9fWNsYXNzIHJze2NvbnN0cnVjdG9yKHQsbixyLHMpe3RoaXMub3JpZ2luYWxTdGFydD10LHRoaXMub3JpZ2luYWxMZW5ndGg9bix0aGlzLm1vZGlmaWVkU3RhcnQ9cix0aGlzLm1vZGlmaWVkTGVuZ3RoPXN9Z2V0T3JpZ2luYWxFbmQoKXtyZXR1cm4gdGhpcy5vcmlnaW5hbFN0YXJ0K3RoaXMub3JpZ2luYWxMZW5ndGh9Z2V0TW9kaWZpZWRFbmQoKXtyZXR1cm4gdGhpcy5tb2RpZmllZFN0YXJ0K3RoaXMubW9kaWZpZWRMZW5ndGh9fWZ1bmN0aW9uIEYxKGUsdCl7cmV0dXJuKHQ8PDUpLXQrZXwwfWZ1bmN0aW9uIE44KGUsdCl7dD1GMSgxNDk0MTcsdCk7Zm9yKGxldCBuPTAscj1lLmxlbmd0aDtuPHI7bisrKXQ9RjEoZS5jaGFyQ29kZUF0KG4pLHQpO3JldHVybiB0fWNsYXNzIEExe2NvbnN0cnVjdG9yKHQpe3RoaXMuc291cmNlPXR9Z2V0RWxlbWVudHMoKXtjb25zdCB0PXRoaXMuc291cmNlLG49bmV3IEludDMyQXJyYXkodC5sZW5ndGgpO2ZvcihsZXQgcj0wLHM9dC5sZW5ndGg7cjxzO3IrKyluW3JdPXQuY2hhckNvZGVBdChyKTtyZXR1cm4gbn19ZnVuY3Rpb24gTDgoZSx0LG4pe3JldHVybiBuZXcgc3MobmV3IEExKGUpLG5ldyBBMSh0KSkuQ29tcHV0ZURpZmYobikuY2hhbmdlc31jbGFzcyBMaXtzdGF0aWMgQXNzZXJ0KHQsbil7aWYoIXQpdGhyb3cgbmV3IEVycm9yKG4pfX1jbGFzcyAkaXtzdGF0aWMgQ29weSh0LG4scixzLGkpe2ZvcihsZXQgbz0wO288aTtvKyspcltzK29dPXRbbitvXX1zdGF0aWMgQ29weTIodCxuLHIscyxpKXtmb3IobGV0IG89MDtvPGk7bysrKXJbcytvXT10W24rb119fWNsYXNzIHcxe2NvbnN0cnVjdG9yKCl7dGhpcy5tX2NoYW5nZXM9W10sdGhpcy5tX29yaWdpbmFsU3RhcnQ9MTA3Mzc0MTgyNCx0aGlzLm1fbW9kaWZpZWRTdGFydD0xMDczNzQxODI0LHRoaXMubV9vcmlnaW5hbENvdW50PTAsdGhpcy5tX21vZGlmaWVkQ291bnQ9MH1NYXJrTmV4dENoYW5nZSgpeyh0aGlzLm1fb3JpZ2luYWxDb3VudD4wfHx0aGlzLm1fbW9kaWZpZWRDb3VudD4wKSYmdGhpcy5tX2NoYW5nZXMucHVzaChuZXcgcnModGhpcy5tX29yaWdpbmFsU3RhcnQsdGhpcy5tX29yaWdpbmFsQ291bnQsdGhpcy5tX21vZGlmaWVkU3RhcnQsdGhpcy5tX21vZGlmaWVkQ291bnQpKSx0aGlzLm1fb3JpZ2luYWxDb3VudD0wLHRoaXMubV9tb2RpZmllZENvdW50PTAsdGhpcy5tX29yaWdpbmFsU3RhcnQ9MTA3Mzc0MTgyNCx0aGlzLm1fbW9kaWZpZWRTdGFydD0xMDczNzQxODI0fUFkZE9yaWdpbmFsRWxlbWVudCh0LG4pe3RoaXMubV9vcmlnaW5hbFN0YXJ0PU1hdGgubWluKHRoaXMubV9vcmlnaW5hbFN0YXJ0LHQpLHRoaXMubV9tb2RpZmllZFN0YXJ0PU1hdGgubWluKHRoaXMubV9tb2RpZmllZFN0YXJ0LG4pLHRoaXMubV9vcmlnaW5hbENvdW50Kyt9QWRkTW9kaWZpZWRFbGVtZW50KHQsbil7dGhpcy5tX29yaWdpbmFsU3RhcnQ9TWF0aC5taW4odGhpcy5tX29yaWdpbmFsU3RhcnQsdCksdGhpcy5tX21vZGlmaWVkU3RhcnQ9TWF0aC5taW4odGhpcy5tX21vZGlmaWVkU3RhcnQsbiksdGhpcy5tX21vZGlmaWVkQ291bnQrK31nZXRDaGFuZ2VzKCl7cmV0dXJuKHRoaXMubV9vcmlnaW5hbENvdW50PjB8fHRoaXMubV9tb2RpZmllZENvdW50PjApJiZ0aGlzLk1hcmtOZXh0Q2hhbmdlKCksdGhpcy5tX2NoYW5nZXN9Z2V0UmV2ZXJzZUNoYW5nZXMoKXtyZXR1cm4odGhpcy5tX29yaWdpbmFsQ291bnQ+MHx8dGhpcy5tX21vZGlmaWVkQ291bnQ+MCkmJnRoaXMuTWFya05leHRDaGFuZ2UoKSx0aGlzLm1fY2hhbmdlcy5yZXZlcnNlKCksdGhpcy5tX2NoYW5nZXN9fWNsYXNzIHNze2NvbnN0cnVjdG9yKHQsbixyPW51bGwpe3RoaXMuQ29udGludWVQcm9jZXNzaW5nUHJlZGljYXRlPXIsdGhpcy5fb3JpZ2luYWxTZXF1ZW5jZT10LHRoaXMuX21vZGlmaWVkU2VxdWVuY2U9bjtjb25zdFtzLGksb109c3MuX2dldEVsZW1lbnRzKHQpLFthLHUsbF09c3MuX2dldEVsZW1lbnRzKG4pO3RoaXMuX2hhc1N0cmluZ3M9byYmbCx0aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzPXMsdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaD1pLHRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHM9YSx0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoPXUsdGhpcy5tX2ZvcndhcmRIaXN0b3J5PVtdLHRoaXMubV9yZXZlcnNlSGlzdG9yeT1bXX1zdGF0aWMgX2lzU3RyaW5nQXJyYXkodCl7cmV0dXJuIHQubGVuZ3RoPjAmJnR5cGVvZiB0WzBdPT0ic3RyaW5nIn1zdGF0aWMgX2dldEVsZW1lbnRzKHQpe2NvbnN0IG49dC5nZXRFbGVtZW50cygpO2lmKHNzLl9pc1N0cmluZ0FycmF5KG4pKXtjb25zdCByPW5ldyBJbnQzMkFycmF5KG4ubGVuZ3RoKTtmb3IobGV0IHM9MCxpPW4ubGVuZ3RoO3M8aTtzKyspcltzXT1OOChuW3NdLDApO3JldHVybltuLHIsITBdfXJldHVybiBuIGluc3RhbmNlb2YgSW50MzJBcnJheT9bW10sbiwhMV06W1tdLG5ldyBJbnQzMkFycmF5KG4pLCExXX1FbGVtZW50c0FyZUVxdWFsKHQsbil7cmV0dXJuIHRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2hbdF0hPT10aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoW25dPyExOnRoaXMuX2hhc1N0cmluZ3M/dGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1t0XT09PXRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHNbbl06ITB9RWxlbWVudHNBcmVTdHJpY3RFcXVhbCh0LG4pe2lmKCF0aGlzLkVsZW1lbnRzQXJlRXF1YWwodCxuKSlyZXR1cm4hMTtjb25zdCByPXNzLl9nZXRTdHJpY3RFbGVtZW50KHRoaXMuX29yaWdpbmFsU2VxdWVuY2UsdCkscz1zcy5fZ2V0U3RyaWN0RWxlbWVudCh0aGlzLl9tb2RpZmllZFNlcXVlbmNlLG4pO3JldHVybiByPT09c31zdGF0aWMgX2dldFN0cmljdEVsZW1lbnQodCxuKXtyZXR1cm4gdHlwZW9mIHQuZ2V0U3RyaWN0RWxlbWVudD09ImZ1bmN0aW9uIj90LmdldFN0cmljdEVsZW1lbnQobik6bnVsbH1PcmlnaW5hbEVsZW1lbnRzQXJlRXF1YWwodCxuKXtyZXR1cm4gdGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaFt0XSE9PXRoaXMuX29yaWdpbmFsRWxlbWVudHNPckhhc2hbbl0/ITE6dGhpcy5faGFzU3RyaW5ncz90aGlzLl9vcmlnaW5hbFN0cmluZ0VsZW1lbnRzW3RdPT09dGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1tuXTohMH1Nb2RpZmllZEVsZW1lbnRzQXJlRXF1YWwodCxuKXtyZXR1cm4gdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaFt0XSE9PXRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2hbbl0/ITE6dGhpcy5faGFzU3RyaW5ncz90aGlzLl9tb2RpZmllZFN0cmluZ0VsZW1lbnRzW3RdPT09dGhpcy5fbW9kaWZpZWRTdHJpbmdFbGVtZW50c1tuXTohMH1Db21wdXRlRGlmZih0KXtyZXR1cm4gdGhpcy5fQ29tcHV0ZURpZmYoMCx0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoLmxlbmd0aC0xLDAsdGhpcy5fbW9kaWZpZWRFbGVtZW50c09ySGFzaC5sZW5ndGgtMSx0KX1fQ29tcHV0ZURpZmYodCxuLHIscyxpKXtjb25zdCBvPVshMV07bGV0IGE9dGhpcy5Db21wdXRlRGlmZlJlY3Vyc2l2ZSh0LG4scixzLG8pO3JldHVybiBpJiYoYT10aGlzLlByZXR0aWZ5Q2hhbmdlcyhhKSkse3F1aXRFYXJseTpvWzBdLGNoYW5nZXM6YX19Q29tcHV0ZURpZmZSZWN1cnNpdmUodCxuLHIscyxpKXtmb3IoaVswXT0hMTt0PD1uJiZyPD1zJiZ0aGlzLkVsZW1lbnRzQXJlRXF1YWwodCxyKTspdCsrLHIrKztmb3IoO24+PXQmJnM+PXImJnRoaXMuRWxlbWVudHNBcmVFcXVhbChuLHMpOyluLS0scy0tO2lmKHQ+bnx8cj5zKXtsZXQgYztyZXR1cm4gcjw9cz8oTGkuQXNzZXJ0KHQ9PT1uKzEsIm9yaWdpbmFsU3RhcnQgc2hvdWxkIG9ubHkgYmUgb25lIG1vcmUgdGhhbiBvcmlnaW5hbEVuZCIpLGM9W25ldyBycyh0LDAscixzLXIrMSldKTp0PD1uPyhMaS5Bc3NlcnQocj09PXMrMSwibW9kaWZpZWRTdGFydCBzaG91bGQgb25seSBiZSBvbmUgbW9yZSB0aGFuIG1vZGlmaWVkRW5kIiksYz1bbmV3IHJzKHQsbi10KzEsciwwKV0pOihMaS5Bc3NlcnQodD09PW4rMSwib3JpZ2luYWxTdGFydCBzaG91bGQgb25seSBiZSBvbmUgbW9yZSB0aGFuIG9yaWdpbmFsRW5kIiksTGkuQXNzZXJ0KHI9PT1zKzEsIm1vZGlmaWVkU3RhcnQgc2hvdWxkIG9ubHkgYmUgb25lIG1vcmUgdGhhbiBtb2RpZmllZEVuZCIpLGM9W10pLGN9Y29uc3Qgbz1bMF0sYT1bMF0sdT10aGlzLkNvbXB1dGVSZWN1cnNpb25Qb2ludCh0LG4scixzLG8sYSxpKSxsPW9bMF0sZj1hWzBdO2lmKHUhPT1udWxsKXJldHVybiB1O2lmKCFpWzBdKXtjb25zdCBjPXRoaXMuQ29tcHV0ZURpZmZSZWN1cnNpdmUodCxsLHIsZixpKTtsZXQgcD1bXTtyZXR1cm4gaVswXT9wPVtuZXcgcnMobCsxLG4tKGwrMSkrMSxmKzEscy0oZisxKSsxKV06cD10aGlzLkNvbXB1dGVEaWZmUmVjdXJzaXZlKGwrMSxuLGYrMSxzLGkpLHRoaXMuQ29uY2F0ZW5hdGVDaGFuZ2VzKGMscCl9cmV0dXJuW25ldyBycyh0LG4tdCsxLHIscy1yKzEpXX1XQUxLVFJBQ0UodCxuLHIscyxpLG8sYSx1LGwsZixjLHAsaCxkLG0sZyxELGIpe2xldCBFPW51bGwsRj1udWxsLHY9bmV3IHcxLEM9bixBPXIsdz1oWzBdLWdbMF0tcyxUPS0xMDczNzQxODI0LE49dGhpcy5tX2ZvcndhcmRIaXN0b3J5Lmxlbmd0aC0xO2Rve2NvbnN0IHg9dyt0O3g9PT1DfHx4PEEmJmxbeC0xXTxsW3grMV0/KGM9bFt4KzFdLGQ9Yy13LXMsYzxUJiZ2Lk1hcmtOZXh0Q2hhbmdlKCksVD1jLHYuQWRkTW9kaWZpZWRFbGVtZW50KGMrMSxkKSx3PXgrMS10KTooYz1sW3gtMV0rMSxkPWMtdy1zLGM8VCYmdi5NYXJrTmV4dENoYW5nZSgpLFQ9Yy0xLHYuQWRkT3JpZ2luYWxFbGVtZW50KGMsZCsxKSx3PXgtMS10KSxOPj0wJiYobD10aGlzLm1fZm9yd2FyZEhpc3RvcnlbTl0sdD1sWzBdLEM9MSxBPWwubGVuZ3RoLTEpfXdoaWxlKC0tTj49LTEpO2lmKEU9di5nZXRSZXZlcnNlQ2hhbmdlcygpLGJbMF0pe2xldCB4PWhbMF0rMSxMPWdbMF0rMTtpZihFIT09bnVsbCYmRS5sZW5ndGg+MCl7Y29uc3QgUz1FW0UubGVuZ3RoLTFdO3g9TWF0aC5tYXgoeCxTLmdldE9yaWdpbmFsRW5kKCkpLEw9TWF0aC5tYXgoTCxTLmdldE1vZGlmaWVkRW5kKCkpfUY9W25ldyBycyh4LHAteCsxLEwsbS1MKzEpXX1lbHNle3Y9bmV3IHcxLEM9byxBPWEsdz1oWzBdLWdbMF0tdSxUPTEwNzM3NDE4MjQsTj1EP3RoaXMubV9yZXZlcnNlSGlzdG9yeS5sZW5ndGgtMTp0aGlzLm1fcmV2ZXJzZUhpc3RvcnkubGVuZ3RoLTI7ZG97Y29uc3QgeD13K2k7eD09PUN8fHg8QSYmZlt4LTFdPj1mW3grMV0/KGM9Zlt4KzFdLTEsZD1jLXctdSxjPlQmJnYuTWFya05leHRDaGFuZ2UoKSxUPWMrMSx2LkFkZE9yaWdpbmFsRWxlbWVudChjKzEsZCsxKSx3PXgrMS1pKTooYz1mW3gtMV0sZD1jLXctdSxjPlQmJnYuTWFya05leHRDaGFuZ2UoKSxUPWMsdi5BZGRNb2RpZmllZEVsZW1lbnQoYysxLGQrMSksdz14LTEtaSksTj49MCYmKGY9dGhpcy5tX3JldmVyc2VIaXN0b3J5W05dLGk9ZlswXSxDPTEsQT1mLmxlbmd0aC0xKX13aGlsZSgtLU4+PS0xKTtGPXYuZ2V0Q2hhbmdlcygpfXJldHVybiB0aGlzLkNvbmNhdGVuYXRlQ2hhbmdlcyhFLEYpfUNvbXB1dGVSZWN1cnNpb25Qb2ludCh0LG4scixzLGksbyxhKXtsZXQgdT0wLGw9MCxmPTAsYz0wLHA9MCxoPTA7dC0tLHItLSxpWzBdPTAsb1swXT0wLHRoaXMubV9mb3J3YXJkSGlzdG9yeT1bXSx0aGlzLm1fcmV2ZXJzZUhpc3Rvcnk9W107Y29uc3QgZD1uLXQrKHMtciksbT1kKzEsZz1uZXcgSW50MzJBcnJheShtKSxEPW5ldyBJbnQzMkFycmF5KG0pLGI9cy1yLEU9bi10LEY9dC1yLHY9bi1zLEE9KEUtYiklMj09PTA7Z1tiXT10LERbRV09bixhWzBdPSExO2ZvcihsZXQgdz0xO3c8PWQvMisxO3crKyl7bGV0IFQ9MCxOPTA7Zj10aGlzLkNsaXBEaWFnb25hbEJvdW5kKGItdyx3LGIsbSksYz10aGlzLkNsaXBEaWFnb25hbEJvdW5kKGIrdyx3LGIsbSk7Zm9yKGxldCBMPWY7TDw9YztMKz0yKXtMPT09Znx8TDxjJiZnW0wtMV08Z1tMKzFdP3U9Z1tMKzFdOnU9Z1tMLTFdKzEsbD11LShMLWIpLUY7Y29uc3QgUz11O2Zvcig7dTxuJiZsPHMmJnRoaXMuRWxlbWVudHNBcmVFcXVhbCh1KzEsbCsxKTspdSsrLGwrKztpZihnW0xdPXUsdStsPlQrTiYmKFQ9dSxOPWwpLCFBJiZNYXRoLmFicyhMLUUpPD13LTEmJnU+PURbTF0pcmV0dXJuIGlbMF09dSxvWzBdPWwsUzw9RFtMXSYmdzw9MTQ0OD90aGlzLldBTEtUUkFDRShiLGYsYyxGLEUscCxoLHYsZyxELHUsbixpLGwscyxvLEEsYSk6bnVsbH1jb25zdCB4PShULXQrKE4tciktdykvMjtpZih0aGlzLkNvbnRpbnVlUHJvY2Vzc2luZ1ByZWRpY2F0ZSE9PW51bGwmJiF0aGlzLkNvbnRpbnVlUHJvY2Vzc2luZ1ByZWRpY2F0ZShULHgpKXJldHVybiBhWzBdPSEwLGlbMF09VCxvWzBdPU4seD4wJiZ3PD0xNDQ4P3RoaXMuV0FMS1RSQUNFKGIsZixjLEYsRSxwLGgsdixnLEQsdSxuLGksbCxzLG8sQSxhKToodCsrLHIrKyxbbmV3IHJzKHQsbi10KzEscixzLXIrMSldKTtwPXRoaXMuQ2xpcERpYWdvbmFsQm91bmQoRS13LHcsRSxtKSxoPXRoaXMuQ2xpcERpYWdvbmFsQm91bmQoRSt3LHcsRSxtKTtmb3IobGV0IEw9cDtMPD1oO0wrPTIpe0w9PT1wfHxMPGgmJkRbTC0xXT49RFtMKzFdP3U9RFtMKzFdLTE6dT1EW0wtMV0sbD11LShMLUUpLXY7Y29uc3QgUz11O2Zvcig7dT50JiZsPnImJnRoaXMuRWxlbWVudHNBcmVFcXVhbCh1LGwpOyl1LS0sbC0tO2lmKERbTF09dSxBJiZNYXRoLmFicyhMLWIpPD13JiZ1PD1nW0xdKXJldHVybiBpWzBdPXUsb1swXT1sLFM+PWdbTF0mJnc8PTE0NDg/dGhpcy5XQUxLVFJBQ0UoYixmLGMsRixFLHAsaCx2LGcsRCx1LG4saSxsLHMsbyxBLGEpOm51bGx9aWYodzw9MTQ0Nyl7bGV0IEw9bmV3IEludDMyQXJyYXkoYy1mKzIpO0xbMF09Yi1mKzEsJGkuQ29weTIoZyxmLEwsMSxjLWYrMSksdGhpcy5tX2ZvcndhcmRIaXN0b3J5LnB1c2goTCksTD1uZXcgSW50MzJBcnJheShoLXArMiksTFswXT1FLXArMSwkaS5Db3B5MihELHAsTCwxLGgtcCsxKSx0aGlzLm1fcmV2ZXJzZUhpc3RvcnkucHVzaChMKX19cmV0dXJuIHRoaXMuV0FMS1RSQUNFKGIsZixjLEYsRSxwLGgsdixnLEQsdSxuLGksbCxzLG8sQSxhKX1QcmV0dGlmeUNoYW5nZXModCl7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspe2NvbnN0IHI9dFtuXSxzPW48dC5sZW5ndGgtMT90W24rMV0ub3JpZ2luYWxTdGFydDp0aGlzLl9vcmlnaW5hbEVsZW1lbnRzT3JIYXNoLmxlbmd0aCxpPW48dC5sZW5ndGgtMT90W24rMV0ubW9kaWZpZWRTdGFydDp0aGlzLl9tb2RpZmllZEVsZW1lbnRzT3JIYXNoLmxlbmd0aCxvPXIub3JpZ2luYWxMZW5ndGg+MCxhPXIubW9kaWZpZWRMZW5ndGg+MDtmb3IoO3Iub3JpZ2luYWxTdGFydCtyLm9yaWdpbmFsTGVuZ3RoPHMmJnIubW9kaWZpZWRTdGFydCtyLm1vZGlmaWVkTGVuZ3RoPGkmJighb3x8dGhpcy5PcmlnaW5hbEVsZW1lbnRzQXJlRXF1YWwoci5vcmlnaW5hbFN0YXJ0LHIub3JpZ2luYWxTdGFydCtyLm9yaWdpbmFsTGVuZ3RoKSkmJighYXx8dGhpcy5Nb2RpZmllZEVsZW1lbnRzQXJlRXF1YWwoci5tb2RpZmllZFN0YXJ0LHIubW9kaWZpZWRTdGFydCtyLm1vZGlmaWVkTGVuZ3RoKSk7KXtjb25zdCBsPXRoaXMuRWxlbWVudHNBcmVTdHJpY3RFcXVhbChyLm9yaWdpbmFsU3RhcnQsci5tb2RpZmllZFN0YXJ0KTtpZih0aGlzLkVsZW1lbnRzQXJlU3RyaWN0RXF1YWwoci5vcmlnaW5hbFN0YXJ0K3Iub3JpZ2luYWxMZW5ndGgsci5tb2RpZmllZFN0YXJ0K3IubW9kaWZpZWRMZW5ndGgpJiYhbClicmVhaztyLm9yaWdpbmFsU3RhcnQrKyxyLm1vZGlmaWVkU3RhcnQrK31jb25zdCB1PVtudWxsXTtpZihuPHQubGVuZ3RoLTEmJnRoaXMuQ2hhbmdlc092ZXJsYXAodFtuXSx0W24rMV0sdSkpe3Rbbl09dVswXSx0LnNwbGljZShuKzEsMSksbi0tO2NvbnRpbnVlfX1mb3IobGV0IG49dC5sZW5ndGgtMTtuPj0wO24tLSl7Y29uc3Qgcj10W25dO2xldCBzPTAsaT0wO2lmKG4+MCl7Y29uc3QgYz10W24tMV07cz1jLm9yaWdpbmFsU3RhcnQrYy5vcmlnaW5hbExlbmd0aCxpPWMubW9kaWZpZWRTdGFydCtjLm1vZGlmaWVkTGVuZ3RofWNvbnN0IG89ci5vcmlnaW5hbExlbmd0aD4wLGE9ci5tb2RpZmllZExlbmd0aD4wO2xldCB1PTAsbD10aGlzLl9ib3VuZGFyeVNjb3JlKHIub3JpZ2luYWxTdGFydCxyLm9yaWdpbmFsTGVuZ3RoLHIubW9kaWZpZWRTdGFydCxyLm1vZGlmaWVkTGVuZ3RoKTtmb3IobGV0IGM9MTs7YysrKXtjb25zdCBwPXIub3JpZ2luYWxTdGFydC1jLGg9ci5tb2RpZmllZFN0YXJ0LWM7aWYocDxzfHxoPGl8fG8mJiF0aGlzLk9yaWdpbmFsRWxlbWVudHNBcmVFcXVhbChwLHArci5vcmlnaW5hbExlbmd0aCl8fGEmJiF0aGlzLk1vZGlmaWVkRWxlbWVudHNBcmVFcXVhbChoLGgrci5tb2RpZmllZExlbmd0aCkpYnJlYWs7Y29uc3QgbT0ocD09PXMmJmg9PT1pPzU6MCkrdGhpcy5fYm91bmRhcnlTY29yZShwLHIub3JpZ2luYWxMZW5ndGgsaCxyLm1vZGlmaWVkTGVuZ3RoKTttPmwmJihsPW0sdT1jKX1yLm9yaWdpbmFsU3RhcnQtPXUsci5tb2RpZmllZFN0YXJ0LT11O2NvbnN0IGY9W251bGxdO2lmKG4+MCYmdGhpcy5DaGFuZ2VzT3ZlcmxhcCh0W24tMV0sdFtuXSxmKSl7dFtuLTFdPWZbMF0sdC5zcGxpY2UobiwxKSxuKys7Y29udGludWV9fWlmKHRoaXMuX2hhc1N0cmluZ3MpZm9yKGxldCBuPTEscj10Lmxlbmd0aDtuPHI7bisrKXtjb25zdCBzPXRbbi0xXSxpPXRbbl0sbz1pLm9yaWdpbmFsU3RhcnQtcy5vcmlnaW5hbFN0YXJ0LXMub3JpZ2luYWxMZW5ndGgsYT1zLm9yaWdpbmFsU3RhcnQsdT1pLm9yaWdpbmFsU3RhcnQraS5vcmlnaW5hbExlbmd0aCxsPXUtYSxmPXMubW9kaWZpZWRTdGFydCxjPWkubW9kaWZpZWRTdGFydCtpLm1vZGlmaWVkTGVuZ3RoLHA9Yy1mO2lmKG88NSYmbDwyMCYmcDwyMCl7Y29uc3QgaD10aGlzLl9maW5kQmV0dGVyQ29udGlndW91c1NlcXVlbmNlKGEsbCxmLHAsbyk7aWYoaCl7Y29uc3RbZCxtXT1oOyhkIT09cy5vcmlnaW5hbFN0YXJ0K3Mub3JpZ2luYWxMZW5ndGh8fG0hPT1zLm1vZGlmaWVkU3RhcnQrcy5tb2RpZmllZExlbmd0aCkmJihzLm9yaWdpbmFsTGVuZ3RoPWQtcy5vcmlnaW5hbFN0YXJ0LHMubW9kaWZpZWRMZW5ndGg9bS1zLm1vZGlmaWVkU3RhcnQsaS5vcmlnaW5hbFN0YXJ0PWQrbyxpLm1vZGlmaWVkU3RhcnQ9bStvLGkub3JpZ2luYWxMZW5ndGg9dS1pLm9yaWdpbmFsU3RhcnQsaS5tb2RpZmllZExlbmd0aD1jLWkubW9kaWZpZWRTdGFydCl9fX1yZXR1cm4gdH1fZmluZEJldHRlckNvbnRpZ3VvdXNTZXF1ZW5jZSh0LG4scixzLGkpe2lmKG48aXx8czxpKXJldHVybiBudWxsO2NvbnN0IG89dCtuLWkrMSxhPXIrcy1pKzE7bGV0IHU9MCxsPTAsZj0wO2ZvcihsZXQgYz10O2M8bztjKyspZm9yKGxldCBwPXI7cDxhO3ArKyl7Y29uc3QgaD10aGlzLl9jb250aWd1b3VzU2VxdWVuY2VTY29yZShjLHAsaSk7aD4wJiZoPnUmJih1PWgsbD1jLGY9cCl9cmV0dXJuIHU+MD9bbCxmXTpudWxsfV9jb250aWd1b3VzU2VxdWVuY2VTY29yZSh0LG4scil7bGV0IHM9MDtmb3IobGV0IGk9MDtpPHI7aSsrKXtpZighdGhpcy5FbGVtZW50c0FyZUVxdWFsKHQraSxuK2kpKXJldHVybiAwO3MrPXRoaXMuX29yaWdpbmFsU3RyaW5nRWxlbWVudHNbdCtpXS5sZW5ndGh9cmV0dXJuIHN9X09yaWdpbmFsSXNCb3VuZGFyeSh0KXtyZXR1cm4gdDw9MHx8dD49dGhpcy5fb3JpZ2luYWxFbGVtZW50c09ySGFzaC5sZW5ndGgtMT8hMDp0aGlzLl9oYXNTdHJpbmdzJiYvXlxzKiQvLnRlc3QodGhpcy5fb3JpZ2luYWxTdHJpbmdFbGVtZW50c1t0XSl9X09yaWdpbmFsUmVnaW9uSXNCb3VuZGFyeSh0LG4pe2lmKHRoaXMuX09yaWdpbmFsSXNCb3VuZGFyeSh0KXx8dGhpcy5fT3JpZ2luYWxJc0JvdW5kYXJ5KHQtMSkpcmV0dXJuITA7aWYobj4wKXtjb25zdCByPXQrbjtpZih0aGlzLl9PcmlnaW5hbElzQm91bmRhcnkoci0xKXx8dGhpcy5fT3JpZ2luYWxJc0JvdW5kYXJ5KHIpKXJldHVybiEwfXJldHVybiExfV9Nb2RpZmllZElzQm91bmRhcnkodCl7cmV0dXJuIHQ8PTB8fHQ+PXRoaXMuX21vZGlmaWVkRWxlbWVudHNPckhhc2gubGVuZ3RoLTE/ITA6dGhpcy5faGFzU3RyaW5ncyYmL15ccyokLy50ZXN0KHRoaXMuX21vZGlmaWVkU3RyaW5nRWxlbWVudHNbdF0pfV9Nb2RpZmllZFJlZ2lvbklzQm91bmRhcnkodCxuKXtpZih0aGlzLl9Nb2RpZmllZElzQm91bmRhcnkodCl8fHRoaXMuX01vZGlmaWVkSXNCb3VuZGFyeSh0LTEpKXJldHVybiEwO2lmKG4+MCl7Y29uc3Qgcj10K247aWYodGhpcy5fTW9kaWZpZWRJc0JvdW5kYXJ5KHItMSl8fHRoaXMuX01vZGlmaWVkSXNCb3VuZGFyeShyKSlyZXR1cm4hMH1yZXR1cm4hMX1fYm91bmRhcnlTY29yZSh0LG4scixzKXtjb25zdCBpPXRoaXMuX09yaWdpbmFsUmVnaW9uSXNCb3VuZGFyeSh0LG4pPzE6MCxvPXRoaXMuX01vZGlmaWVkUmVnaW9uSXNCb3VuZGFyeShyLHMpPzE6MDtyZXR1cm4gaStvfUNvbmNhdGVuYXRlQ2hhbmdlcyh0LG4pe2NvbnN0IHI9W107aWYodC5sZW5ndGg9PT0wfHxuLmxlbmd0aD09PTApcmV0dXJuIG4ubGVuZ3RoPjA/bjp0O2lmKHRoaXMuQ2hhbmdlc092ZXJsYXAodFt0Lmxlbmd0aC0xXSxuWzBdLHIpKXtjb25zdCBzPW5ldyBBcnJheSh0Lmxlbmd0aCtuLmxlbmd0aC0xKTtyZXR1cm4gJGkuQ29weSh0LDAscywwLHQubGVuZ3RoLTEpLHNbdC5sZW5ndGgtMV09clswXSwkaS5Db3B5KG4sMSxzLHQubGVuZ3RoLG4ubGVuZ3RoLTEpLHN9ZWxzZXtjb25zdCBzPW5ldyBBcnJheSh0Lmxlbmd0aCtuLmxlbmd0aCk7cmV0dXJuICRpLkNvcHkodCwwLHMsMCx0Lmxlbmd0aCksJGkuQ29weShuLDAscyx0Lmxlbmd0aCxuLmxlbmd0aCksc319Q2hhbmdlc092ZXJsYXAodCxuLHIpe2lmKExpLkFzc2VydCh0Lm9yaWdpbmFsU3RhcnQ8PW4ub3JpZ2luYWxTdGFydCwiTGVmdCBjaGFuZ2UgaXMgbm90IGxlc3MgdGhhbiBvciBlcXVhbCB0byByaWdodCBjaGFuZ2UiKSxMaS5Bc3NlcnQodC5tb2RpZmllZFN0YXJ0PD1uLm1vZGlmaWVkU3RhcnQsIkxlZnQgY2hhbmdlIGlzIG5vdCBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gcmlnaHQgY2hhbmdlIiksdC5vcmlnaW5hbFN0YXJ0K3Qub3JpZ2luYWxMZW5ndGg+PW4ub3JpZ2luYWxTdGFydHx8dC5tb2RpZmllZFN0YXJ0K3QubW9kaWZpZWRMZW5ndGg+PW4ubW9kaWZpZWRTdGFydCl7Y29uc3Qgcz10Lm9yaWdpbmFsU3RhcnQ7bGV0IGk9dC5vcmlnaW5hbExlbmd0aDtjb25zdCBvPXQubW9kaWZpZWRTdGFydDtsZXQgYT10Lm1vZGlmaWVkTGVuZ3RoO3JldHVybiB0Lm9yaWdpbmFsU3RhcnQrdC5vcmlnaW5hbExlbmd0aD49bi5vcmlnaW5hbFN0YXJ0JiYoaT1uLm9yaWdpbmFsU3RhcnQrbi5vcmlnaW5hbExlbmd0aC10Lm9yaWdpbmFsU3RhcnQpLHQubW9kaWZpZWRTdGFydCt0Lm1vZGlmaWVkTGVuZ3RoPj1uLm1vZGlmaWVkU3RhcnQmJihhPW4ubW9kaWZpZWRTdGFydCtuLm1vZGlmaWVkTGVuZ3RoLXQubW9kaWZpZWRTdGFydCksclswXT1uZXcgcnMocyxpLG8sYSksITB9ZWxzZSByZXR1cm4gclswXT1udWxsLCExfUNsaXBEaWFnb25hbEJvdW5kKHQsbixyLHMpe2lmKHQ+PTAmJnQ8cylyZXR1cm4gdDtjb25zdCBpPXIsbz1zLXItMSxhPW4lMj09PTA7aWYodDwwKXtjb25zdCB1PWklMj09PTA7cmV0dXJuIGE9PT11PzA6MX1lbHNle2NvbnN0IHU9byUyPT09MDtyZXR1cm4gYT09PXU/cy0xOnMtMn19fWxldCBKZT1jbGFzcyBDaXtjb25zdHJ1Y3Rvcih0LG4pe3RoaXMubGluZU51bWJlcj10LHRoaXMuY29sdW1uPW59d2l0aCh0PXRoaXMubGluZU51bWJlcixuPXRoaXMuY29sdW1uKXtyZXR1cm4gdD09PXRoaXMubGluZU51bWJlciYmbj09PXRoaXMuY29sdW1uP3RoaXM6bmV3IENpKHQsbil9ZGVsdGEodD0wLG49MCl7cmV0dXJuIHRoaXMud2l0aCh0aGlzLmxpbmVOdW1iZXIrdCx0aGlzLmNvbHVtbituKX1lcXVhbHModCl7cmV0dXJuIENpLmVxdWFscyh0aGlzLHQpfXN0YXRpYyBlcXVhbHModCxuKXtyZXR1cm4hdCYmIW4/ITA6ISF0JiYhIW4mJnQubGluZU51bWJlcj09PW4ubGluZU51bWJlciYmdC5jb2x1bW49PT1uLmNvbHVtbn1pc0JlZm9yZSh0KXtyZXR1cm4gQ2kuaXNCZWZvcmUodGhpcyx0KX1zdGF0aWMgaXNCZWZvcmUodCxuKXtyZXR1cm4gdC5saW5lTnVtYmVyPG4ubGluZU51bWJlcj8hMDpuLmxpbmVOdW1iZXI8dC5saW5lTnVtYmVyPyExOnQuY29sdW1uPG4uY29sdW1ufWlzQmVmb3JlT3JFcXVhbCh0KXtyZXR1cm4gQ2kuaXNCZWZvcmVPckVxdWFsKHRoaXMsdCl9c3RhdGljIGlzQmVmb3JlT3JFcXVhbCh0LG4pe3JldHVybiB0LmxpbmVOdW1iZXI8bi5saW5lTnVtYmVyPyEwOm4ubGluZU51bWJlcjx0LmxpbmVOdW1iZXI/ITE6dC5jb2x1bW48PW4uY29sdW1ufXN0YXRpYyBjb21wYXJlKHQsbil7Y29uc3Qgcj10LmxpbmVOdW1iZXJ8MCxzPW4ubGluZU51bWJlcnwwO2lmKHI9PT1zKXtjb25zdCBpPXQuY29sdW1ufDAsbz1uLmNvbHVtbnwwO3JldHVybiBpLW99cmV0dXJuIHItc31jbG9uZSgpe3JldHVybiBuZXcgQ2kodGhpcy5saW5lTnVtYmVyLHRoaXMuY29sdW1uKX10b1N0cmluZygpe3JldHVybiIoIit0aGlzLmxpbmVOdW1iZXIrIiwiK3RoaXMuY29sdW1uKyIpIn1zdGF0aWMgbGlmdCh0KXtyZXR1cm4gbmV3IENpKHQubGluZU51bWJlcix0LmNvbHVtbil9c3RhdGljIGlzSVBvc2l0aW9uKHQpe3JldHVybiB0JiZ0eXBlb2YgdC5saW5lTnVtYmVyPT0ibnVtYmVyIiYmdHlwZW9mIHQuY29sdW1uPT0ibnVtYmVyIn10b0pTT04oKXtyZXR1cm57bGluZU51bWJlcjp0aGlzLmxpbmVOdW1iZXIsY29sdW1uOnRoaXMuY29sdW1ufX19LGhlPWNsYXNzIFFle2NvbnN0cnVjdG9yKHQsbixyLHMpe3Q+cnx8dD09PXImJm4+cz8odGhpcy5zdGFydExpbmVOdW1iZXI9cix0aGlzLnN0YXJ0Q29sdW1uPXMsdGhpcy5lbmRMaW5lTnVtYmVyPXQsdGhpcy5lbmRDb2x1bW49bik6KHRoaXMuc3RhcnRMaW5lTnVtYmVyPXQsdGhpcy5zdGFydENvbHVtbj1uLHRoaXMuZW5kTGluZU51bWJlcj1yLHRoaXMuZW5kQ29sdW1uPXMpfWlzRW1wdHkoKXtyZXR1cm4gUWUuaXNFbXB0eSh0aGlzKX1zdGF0aWMgaXNFbXB0eSh0KXtyZXR1cm4gdC5zdGFydExpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXImJnQuc3RhcnRDb2x1bW49PT10LmVuZENvbHVtbn1jb250YWluc1Bvc2l0aW9uKHQpe3JldHVybiBRZS5jb250YWluc1Bvc2l0aW9uKHRoaXMsdCl9c3RhdGljIGNvbnRhaW5zUG9zaXRpb24odCxuKXtyZXR1cm4hKG4ubGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5saW5lTnVtYmVyPnQuZW5kTGluZU51bWJlcnx8bi5saW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXImJm4uY29sdW1uPHQuc3RhcnRDb2x1bW58fG4ubGluZU51bWJlcj09PXQuZW5kTGluZU51bWJlciYmbi5jb2x1bW4+dC5lbmRDb2x1bW4pfXN0YXRpYyBzdHJpY3RDb250YWluc1Bvc2l0aW9uKHQsbil7cmV0dXJuIShuLmxpbmVOdW1iZXI8dC5zdGFydExpbmVOdW1iZXJ8fG4ubGluZU51bWJlcj50LmVuZExpbmVOdW1iZXJ8fG4ubGluZU51bWJlcj09PXQuc3RhcnRMaW5lTnVtYmVyJiZuLmNvbHVtbjw9dC5zdGFydENvbHVtbnx8bi5saW5lTnVtYmVyPT09dC5lbmRMaW5lTnVtYmVyJiZuLmNvbHVtbj49dC5lbmRDb2x1bW4pfWNvbnRhaW5zUmFuZ2UodCl7cmV0dXJuIFFlLmNvbnRhaW5zUmFuZ2UodGhpcyx0KX1zdGF0aWMgY29udGFpbnNSYW5nZSh0LG4pe3JldHVybiEobi5zdGFydExpbmVOdW1iZXI8dC5zdGFydExpbmVOdW1iZXJ8fG4uZW5kTGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5zdGFydExpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyfHxuLmVuZExpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyfHxuLnN0YXJ0TGluZU51bWJlcj09PXQuc3RhcnRMaW5lTnVtYmVyJiZuLnN0YXJ0Q29sdW1uPHQuc3RhcnRDb2x1bW58fG4uZW5kTGluZU51bWJlcj09PXQuZW5kTGluZU51bWJlciYmbi5lbmRDb2x1bW4+dC5lbmRDb2x1bW4pfXN0cmljdENvbnRhaW5zUmFuZ2UodCl7cmV0dXJuIFFlLnN0cmljdENvbnRhaW5zUmFuZ2UodGhpcyx0KX1zdGF0aWMgc3RyaWN0Q29udGFpbnNSYW5nZSh0LG4pe3JldHVybiEobi5zdGFydExpbmVOdW1iZXI8dC5zdGFydExpbmVOdW1iZXJ8fG4uZW5kTGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5zdGFydExpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyfHxuLmVuZExpbmVOdW1iZXI+dC5lbmRMaW5lTnVtYmVyfHxuLnN0YXJ0TGluZU51bWJlcj09PXQuc3RhcnRMaW5lTnVtYmVyJiZuLnN0YXJ0Q29sdW1uPD10LnN0YXJ0Q29sdW1ufHxuLmVuZExpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXImJm4uZW5kQ29sdW1uPj10LmVuZENvbHVtbil9cGx1c1JhbmdlKHQpe3JldHVybiBRZS5wbHVzUmFuZ2UodGhpcyx0KX1zdGF0aWMgcGx1c1JhbmdlKHQsbil7bGV0IHIscyxpLG87cmV0dXJuIG4uc3RhcnRMaW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyPyhyPW4uc3RhcnRMaW5lTnVtYmVyLHM9bi5zdGFydENvbHVtbik6bi5zdGFydExpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlcj8ocj1uLnN0YXJ0TGluZU51bWJlcixzPU1hdGgubWluKG4uc3RhcnRDb2x1bW4sdC5zdGFydENvbHVtbikpOihyPXQuc3RhcnRMaW5lTnVtYmVyLHM9dC5zdGFydENvbHVtbiksbi5lbmRMaW5lTnVtYmVyPnQuZW5kTGluZU51bWJlcj8oaT1uLmVuZExpbmVOdW1iZXIsbz1uLmVuZENvbHVtbik6bi5lbmRMaW5lTnVtYmVyPT09dC5lbmRMaW5lTnVtYmVyPyhpPW4uZW5kTGluZU51bWJlcixvPU1hdGgubWF4KG4uZW5kQ29sdW1uLHQuZW5kQ29sdW1uKSk6KGk9dC5lbmRMaW5lTnVtYmVyLG89dC5lbmRDb2x1bW4pLG5ldyBRZShyLHMsaSxvKX1pbnRlcnNlY3RSYW5nZXModCl7cmV0dXJuIFFlLmludGVyc2VjdFJhbmdlcyh0aGlzLHQpfXN0YXRpYyBpbnRlcnNlY3RSYW5nZXModCxuKXtsZXQgcj10LnN0YXJ0TGluZU51bWJlcixzPXQuc3RhcnRDb2x1bW4saT10LmVuZExpbmVOdW1iZXIsbz10LmVuZENvbHVtbjtjb25zdCBhPW4uc3RhcnRMaW5lTnVtYmVyLHU9bi5zdGFydENvbHVtbixsPW4uZW5kTGluZU51bWJlcixmPW4uZW5kQ29sdW1uO3JldHVybiByPGE/KHI9YSxzPXUpOnI9PT1hJiYocz1NYXRoLm1heChzLHUpKSxpPmw/KGk9bCxvPWYpOmk9PT1sJiYobz1NYXRoLm1pbihvLGYpKSxyPml8fHI9PT1pJiZzPm8/bnVsbDpuZXcgUWUocixzLGksbyl9ZXF1YWxzUmFuZ2UodCl7cmV0dXJuIFFlLmVxdWFsc1JhbmdlKHRoaXMsdCl9c3RhdGljIGVxdWFsc1JhbmdlKHQsbil7cmV0dXJuIXQmJiFuPyEwOiEhdCYmISFuJiZ0LnN0YXJ0TGluZU51bWJlcj09PW4uc3RhcnRMaW5lTnVtYmVyJiZ0LnN0YXJ0Q29sdW1uPT09bi5zdGFydENvbHVtbiYmdC5lbmRMaW5lTnVtYmVyPT09bi5lbmRMaW5lTnVtYmVyJiZ0LmVuZENvbHVtbj09PW4uZW5kQ29sdW1ufWdldEVuZFBvc2l0aW9uKCl7cmV0dXJuIFFlLmdldEVuZFBvc2l0aW9uKHRoaXMpfXN0YXRpYyBnZXRFbmRQb3NpdGlvbih0KXtyZXR1cm4gbmV3IEplKHQuZW5kTGluZU51bWJlcix0LmVuZENvbHVtbil9Z2V0U3RhcnRQb3NpdGlvbigpe3JldHVybiBRZS5nZXRTdGFydFBvc2l0aW9uKHRoaXMpfXN0YXRpYyBnZXRTdGFydFBvc2l0aW9uKHQpe3JldHVybiBuZXcgSmUodC5zdGFydExpbmVOdW1iZXIsdC5zdGFydENvbHVtbil9dG9TdHJpbmcoKXtyZXR1cm4iWyIrdGhpcy5zdGFydExpbmVOdW1iZXIrIiwiK3RoaXMuc3RhcnRDb2x1bW4rIiAtPiAiK3RoaXMuZW5kTGluZU51bWJlcisiLCIrdGhpcy5lbmRDb2x1bW4rIl0ifXNldEVuZFBvc2l0aW9uKHQsbil7cmV0dXJuIG5ldyBRZSh0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLnN0YXJ0Q29sdW1uLHQsbil9c2V0U3RhcnRQb3NpdGlvbih0LG4pe3JldHVybiBuZXcgUWUodCxuLHRoaXMuZW5kTGluZU51bWJlcix0aGlzLmVuZENvbHVtbil9Y29sbGFwc2VUb1N0YXJ0KCl7cmV0dXJuIFFlLmNvbGxhcHNlVG9TdGFydCh0aGlzKX1zdGF0aWMgY29sbGFwc2VUb1N0YXJ0KHQpe3JldHVybiBuZXcgUWUodC5zdGFydExpbmVOdW1iZXIsdC5zdGFydENvbHVtbix0LnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0Q29sdW1uKX1jb2xsYXBzZVRvRW5kKCl7cmV0dXJuIFFlLmNvbGxhcHNlVG9FbmQodGhpcyl9c3RhdGljIGNvbGxhcHNlVG9FbmQodCl7cmV0dXJuIG5ldyBRZSh0LmVuZExpbmVOdW1iZXIsdC5lbmRDb2x1bW4sdC5lbmRMaW5lTnVtYmVyLHQuZW5kQ29sdW1uKX1kZWx0YSh0KXtyZXR1cm4gbmV3IFFlKHRoaXMuc3RhcnRMaW5lTnVtYmVyK3QsdGhpcy5zdGFydENvbHVtbix0aGlzLmVuZExpbmVOdW1iZXIrdCx0aGlzLmVuZENvbHVtbil9c3RhdGljIGZyb21Qb3NpdGlvbnModCxuPXQpe3JldHVybiBuZXcgUWUodC5saW5lTnVtYmVyLHQuY29sdW1uLG4ubGluZU51bWJlcixuLmNvbHVtbil9c3RhdGljIGxpZnQodCl7cmV0dXJuIHQ/bmV3IFFlKHQuc3RhcnRMaW5lTnVtYmVyLHQuc3RhcnRDb2x1bW4sdC5lbmRMaW5lTnVtYmVyLHQuZW5kQ29sdW1uKTpudWxsfXN0YXRpYyBpc0lSYW5nZSh0KXtyZXR1cm4gdCYmdHlwZW9mIHQuc3RhcnRMaW5lTnVtYmVyPT0ibnVtYmVyIiYmdHlwZW9mIHQuc3RhcnRDb2x1bW49PSJudW1iZXIiJiZ0eXBlb2YgdC5lbmRMaW5lTnVtYmVyPT0ibnVtYmVyIiYmdHlwZW9mIHQuZW5kQ29sdW1uPT0ibnVtYmVyIn1zdGF0aWMgYXJlSW50ZXJzZWN0aW5nT3JUb3VjaGluZyh0LG4pe3JldHVybiEodC5lbmRMaW5lTnVtYmVyPG4uc3RhcnRMaW5lTnVtYmVyfHx0LmVuZExpbmVOdW1iZXI9PT1uLnN0YXJ0TGluZU51bWJlciYmdC5lbmRDb2x1bW48bi5zdGFydENvbHVtbnx8bi5lbmRMaW5lTnVtYmVyPHQuc3RhcnRMaW5lTnVtYmVyfHxuLmVuZExpbmVOdW1iZXI9PT10LnN0YXJ0TGluZU51bWJlciYmbi5lbmRDb2x1bW48dC5zdGFydENvbHVtbil9c3RhdGljIGFyZUludGVyc2VjdGluZyh0LG4pe3JldHVybiEodC5lbmRMaW5lTnVtYmVyPG4uc3RhcnRMaW5lTnVtYmVyfHx0LmVuZExpbmVOdW1iZXI9PT1uLnN0YXJ0TGluZU51bWJlciYmdC5lbmRDb2x1bW48PW4uc3RhcnRDb2x1bW58fG4uZW5kTGluZU51bWJlcjx0LnN0YXJ0TGluZU51bWJlcnx8bi5lbmRMaW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXImJm4uZW5kQ29sdW1uPD10LnN0YXJ0Q29sdW1uKX1zdGF0aWMgY29tcGFyZVJhbmdlc1VzaW5nU3RhcnRzKHQsbil7aWYodCYmbil7Y29uc3QgaT10LnN0YXJ0TGluZU51bWJlcnwwLG89bi5zdGFydExpbmVOdW1iZXJ8MDtpZihpPT09byl7Y29uc3QgYT10LnN0YXJ0Q29sdW1ufDAsdT1uLnN0YXJ0Q29sdW1ufDA7aWYoYT09PXUpe2NvbnN0IGw9dC5lbmRMaW5lTnVtYmVyfDAsZj1uLmVuZExpbmVOdW1iZXJ8MDtpZihsPT09Zil7Y29uc3QgYz10LmVuZENvbHVtbnwwLHA9bi5lbmRDb2x1bW58MDtyZXR1cm4gYy1wfXJldHVybiBsLWZ9cmV0dXJuIGEtdX1yZXR1cm4gaS1vfXJldHVybih0PzE6MCktKG4/MTowKX1zdGF0aWMgY29tcGFyZVJhbmdlc1VzaW5nRW5kcyh0LG4pe3JldHVybiB0LmVuZExpbmVOdW1iZXI9PT1uLmVuZExpbmVOdW1iZXI/dC5lbmRDb2x1bW49PT1uLmVuZENvbHVtbj90LnN0YXJ0TGluZU51bWJlcj09PW4uc3RhcnRMaW5lTnVtYmVyP3Quc3RhcnRDb2x1bW4tbi5zdGFydENvbHVtbjp0LnN0YXJ0TGluZU51bWJlci1uLnN0YXJ0TGluZU51bWJlcjp0LmVuZENvbHVtbi1uLmVuZENvbHVtbjp0LmVuZExpbmVOdW1iZXItbi5lbmRMaW5lTnVtYmVyfXN0YXRpYyBzcGFuc011bHRpcGxlTGluZXModCl7cmV0dXJuIHQuZW5kTGluZU51bWJlcj50LnN0YXJ0TGluZU51bWJlcn10b0pTT04oKXtyZXR1cm4gdGhpc319O2Z1bmN0aW9uIEMxKGUpe3JldHVybiBlPDA/MDplPjI1NT8yNTU6ZXwwfWZ1bmN0aW9uIEJpKGUpe3JldHVybiBlPDA/MDplPjQyOTQ5NjcyOTU/NDI5NDk2NzI5NTplfDB9Y2xhc3MgSWZ7Y29uc3RydWN0b3IodCl7Y29uc3Qgbj1DMSh0KTt0aGlzLl9kZWZhdWx0VmFsdWU9bix0aGlzLl9hc2NpaU1hcD1JZi5fY3JlYXRlQXNjaWlNYXAobiksdGhpcy5fbWFwPW5ldyBNYXB9c3RhdGljIF9jcmVhdGVBc2NpaU1hcCh0KXtjb25zdCBuPW5ldyBVaW50OEFycmF5KDI1Nik7cmV0dXJuIG4uZmlsbCh0KSxufXNldCh0LG4pe2NvbnN0IHI9QzEobik7dD49MCYmdDwyNTY/dGhpcy5fYXNjaWlNYXBbdF09cjp0aGlzLl9tYXAuc2V0KHQscil9Z2V0KHQpe3JldHVybiB0Pj0wJiZ0PDI1Nj90aGlzLl9hc2NpaU1hcFt0XTp0aGlzLl9tYXAuZ2V0KHQpfHx0aGlzLl9kZWZhdWx0VmFsdWV9Y2xlYXIoKXt0aGlzLl9hc2NpaU1hcC5maWxsKHRoaXMuX2RlZmF1bHRWYWx1ZSksdGhpcy5fbWFwLmNsZWFyKCl9fWNsYXNzICQ4e2NvbnN0cnVjdG9yKHQsbixyKXtjb25zdCBzPW5ldyBVaW50OEFycmF5KHQqbik7Zm9yKGxldCBpPTAsbz10Km47aTxvO2krKylzW2ldPXI7dGhpcy5fZGF0YT1zLHRoaXMucm93cz10LHRoaXMuY29scz1ufWdldCh0LG4pe3JldHVybiB0aGlzLl9kYXRhW3QqdGhpcy5jb2xzK25dfXNldCh0LG4scil7dGhpcy5fZGF0YVt0KnRoaXMuY29scytuXT1yfX1jbGFzcyBCOHtjb25zdHJ1Y3Rvcih0KXtsZXQgbj0wLHI9MDtmb3IobGV0IGk9MCxvPXQubGVuZ3RoO2k8bztpKyspe2NvbnN0W2EsdSxsXT10W2ldO3U+biYmKG49dSksYT5yJiYocj1hKSxsPnImJihyPWwpfW4rKyxyKys7Y29uc3Qgcz1uZXcgJDgocixuLDApO2ZvcihsZXQgaT0wLG89dC5sZW5ndGg7aTxvO2krKyl7Y29uc3RbYSx1LGxdPXRbaV07cy5zZXQoYSx1LGwpfXRoaXMuX3N0YXRlcz1zLHRoaXMuX21heENoYXJDb2RlPW59bmV4dFN0YXRlKHQsbil7cmV0dXJuIG48MHx8bj49dGhpcy5fbWF4Q2hhckNvZGU/MDp0aGlzLl9zdGF0ZXMuZ2V0KHQsbil9fWxldCBQZj1udWxsO2Z1bmN0aW9uIF84KCl7cmV0dXJuIFBmPT09bnVsbCYmKFBmPW5ldyBCOChbWzEsMTA0LDJdLFsxLDcyLDJdLFsxLDEwMiw2XSxbMSw3MCw2XSxbMiwxMTYsM10sWzIsODQsM10sWzMsMTE2LDRdLFszLDg0LDRdLFs0LDExMiw1XSxbNCw4MCw1XSxbNSwxMTUsOV0sWzUsODMsOV0sWzUsNTgsMTBdLFs2LDEwNSw3XSxbNiw3Myw3XSxbNywxMDgsOF0sWzcsNzYsOF0sWzgsMTAxLDldLFs4LDY5LDldLFs5LDU4LDEwXSxbMTAsNDcsMTFdLFsxMSw0NywxMl1dKSksUGZ9bGV0IHNhPW51bGw7ZnVuY3Rpb24gSTgoKXtpZihzYT09PW51bGwpe3NhPW5ldyBJZigwKTtjb25zdCBlPWAgCTw+JyLjgIHjgILvvaHvvaTvvIzvvI7vvJrvvJvigJjjgIjjgIzjgI7jgJTvvIjvvLvvvZvvvaLvvaPvvZ3vvL3vvInjgJXjgI/jgI3jgInigJnvvYDvvZ7igKZgO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKXNhLnNldChlLmNoYXJDb2RlQXQobiksMSk7Y29uc3QgdD0iLiw7OiI7Zm9yKGxldCBuPTA7bjx0Lmxlbmd0aDtuKyspc2Euc2V0KHQuY2hhckNvZGVBdChuKSwyKX1yZXR1cm4gc2F9Y2xhc3MgUHV7c3RhdGljIF9jcmVhdGVMaW5rKHQsbixyLHMsaSl7bGV0IG89aS0xO2Rve2NvbnN0IGE9bi5jaGFyQ29kZUF0KG8pO2lmKHQuZ2V0KGEpIT09MilicmVhaztvLS19d2hpbGUobz5zKTtpZihzPjApe2NvbnN0IGE9bi5jaGFyQ29kZUF0KHMtMSksdT1uLmNoYXJDb2RlQXQobyk7KGE9PT00MCYmdT09PTQxfHxhPT09OTEmJnU9PT05M3x8YT09PTEyMyYmdT09PTEyNSkmJm8tLX1yZXR1cm57cmFuZ2U6e3N0YXJ0TGluZU51bWJlcjpyLHN0YXJ0Q29sdW1uOnMrMSxlbmRMaW5lTnVtYmVyOnIsZW5kQ29sdW1uOm8rMn0sdXJsOm4uc3Vic3RyaW5nKHMsbysxKX19c3RhdGljIGNvbXB1dGVMaW5rcyh0LG49XzgoKSl7Y29uc3Qgcj1JOCgpLHM9W107Zm9yKGxldCBpPTEsbz10LmdldExpbmVDb3VudCgpO2k8PW87aSsrKXtjb25zdCBhPXQuZ2V0TGluZUNvbnRlbnQoaSksdT1hLmxlbmd0aDtsZXQgbD0wLGY9MCxjPTAscD0xLGg9ITEsZD0hMSxtPSExLGc9ITE7Zm9yKDtsPHU7KXtsZXQgRD0hMTtjb25zdCBiPWEuY2hhckNvZGVBdChsKTtpZihwPT09MTMpe2xldCBFO3N3aXRjaChiKXtjYXNlIDQwOmg9ITAsRT0wO2JyZWFrO2Nhc2UgNDE6RT1oPzA6MTticmVhaztjYXNlIDkxOm09ITAsZD0hMCxFPTA7YnJlYWs7Y2FzZSA5MzptPSExLEU9ZD8wOjE7YnJlYWs7Y2FzZSAxMjM6Zz0hMCxFPTA7YnJlYWs7Y2FzZSAxMjU6RT1nPzA6MTticmVhaztjYXNlIDM5OmNhc2UgMzQ6Y2FzZSA5NjpjPT09Yj9FPTE6Yz09PTM5fHxjPT09MzR8fGM9PT05Nj9FPTA6RT0xO2JyZWFrO2Nhc2UgNDI6RT1jPT09NDI/MTowO2JyZWFrO2Nhc2UgMTI0OkU9Yz09PTEyND8xOjA7YnJlYWs7Y2FzZSAzMjpFPW0/MDoxO2JyZWFrO2RlZmF1bHQ6RT1yLmdldChiKX1FPT09MSYmKHMucHVzaChQdS5fY3JlYXRlTGluayhyLGEsaSxmLGwpKSxEPSEwKX1lbHNlIGlmKHA9PT0xMil7bGV0IEU7Yj09PTkxPyhkPSEwLEU9MCk6RT1yLmdldChiKSxFPT09MT9EPSEwOnA9MTN9ZWxzZSBwPW4ubmV4dFN0YXRlKHAsYikscD09PTAmJihEPSEwKTtEJiYocD0xLGg9ITEsZD0hMSxnPSExLGY9bCsxLGM9YiksbCsrfXA9PT0xMyYmcy5wdXNoKFB1Ll9jcmVhdGVMaW5rKHIsYSxpLGYsdSkpfXJldHVybiBzfX1mdW5jdGlvbiBQOChlKXtyZXR1cm4hZXx8dHlwZW9mIGUuZ2V0TGluZUNvdW50IT0iZnVuY3Rpb24ifHx0eXBlb2YgZS5nZXRMaW5lQ29udGVudCE9ImZ1bmN0aW9uIj9bXTpQdS5jb21wdXRlTGlua3MoZSl9Y29uc3QgY2Y9Y2xhc3MgY2Z7Y29uc3RydWN0b3IoKXt0aGlzLl9kZWZhdWx0VmFsdWVTZXQ9W1sidHJ1ZSIsImZhbHNlIl0sWyJUcnVlIiwiRmFsc2UiXSxbIlByaXZhdGUiLCJQdWJsaWMiLCJGcmllbmQiLCJSZWFkT25seSIsIlBhcnRpYWwiLCJQcm90ZWN0ZWQiLCJXcml0ZU9ubHkiXSxbInB1YmxpYyIsInByb3RlY3RlZCIsInByaXZhdGUiXV19bmF2aWdhdGVWYWx1ZVNldCh0LG4scixzLGkpe2lmKHQmJm4pe2NvbnN0IG89dGhpcy5kb05hdmlnYXRlVmFsdWVTZXQobixpKTtpZihvKXJldHVybntyYW5nZTp0LHZhbHVlOm99fWlmKHImJnMpe2NvbnN0IG89dGhpcy5kb05hdmlnYXRlVmFsdWVTZXQocyxpKTtpZihvKXJldHVybntyYW5nZTpyLHZhbHVlOm99fXJldHVybiBudWxsfWRvTmF2aWdhdGVWYWx1ZVNldCh0LG4pe2NvbnN0IHI9dGhpcy5udW1iZXJSZXBsYWNlKHQsbik7cmV0dXJuIHIhPT1udWxsP3I6dGhpcy50ZXh0UmVwbGFjZSh0LG4pfW51bWJlclJlcGxhY2UodCxuKXtjb25zdCByPU1hdGgucG93KDEwLHQubGVuZ3RoLSh0Lmxhc3RJbmRleE9mKCIuIikrMSkpO2xldCBzPU51bWJlcih0KTtjb25zdCBpPXBhcnNlRmxvYXQodCk7cmV0dXJuIWlzTmFOKHMpJiYhaXNOYU4oaSkmJnM9PT1pP3M9PT0wJiYhbj9udWxsOihzPU1hdGguZmxvb3IocypyKSxzKz1uP3I6LXIsU3RyaW5nKHMvcikpOm51bGx9dGV4dFJlcGxhY2UodCxuKXtyZXR1cm4gdGhpcy52YWx1ZVNldHNSZXBsYWNlKHRoaXMuX2RlZmF1bHRWYWx1ZVNldCx0LG4pfXZhbHVlU2V0c1JlcGxhY2UodCxuLHIpe2xldCBzPW51bGw7Zm9yKGxldCBpPTAsbz10Lmxlbmd0aDtzPT09bnVsbCYmaTxvO2krKylzPXRoaXMudmFsdWVTZXRSZXBsYWNlKHRbaV0sbixyKTtyZXR1cm4gc312YWx1ZVNldFJlcGxhY2UodCxuLHIpe2xldCBzPXQuaW5kZXhPZihuKTtyZXR1cm4gcz49MD8ocys9cj8xOi0xLHM8MD9zPXQubGVuZ3RoLTE6cyU9dC5sZW5ndGgsdFtzXSk6bnVsbH19O2NmLklOU1RBTkNFPW5ldyBjZjtsZXQgTWY9Y2Y7Y29uc3QgUzE9T2JqZWN0LmZyZWV6ZShmdW5jdGlvbihlLHQpe2NvbnN0IG49c2V0VGltZW91dChlLmJpbmQodCksMCk7cmV0dXJue2Rpc3Bvc2UoKXtjbGVhclRpbWVvdXQobil9fX0pO3ZhciBNdTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtyZXR1cm4gbj09PWUuTm9uZXx8bj09PWUuQ2FuY2VsbGVkfHxuIGluc3RhbmNlb2YgT3U/ITA6IW58fHR5cGVvZiBuIT0ib2JqZWN0Ij8hMTp0eXBlb2Ygbi5pc0NhbmNlbGxhdGlvblJlcXVlc3RlZD09ImJvb2xlYW4iJiZ0eXBlb2Ygbi5vbkNhbmNlbGxhdGlvblJlcXVlc3RlZD09ImZ1bmN0aW9uIn1lLmlzQ2FuY2VsbGF0aW9uVG9rZW49dCxlLk5vbmU9T2JqZWN0LmZyZWV6ZSh7aXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6ITEsb25DYW5jZWxsYXRpb25SZXF1ZXN0ZWQ6THUuTm9uZX0pLGUuQ2FuY2VsbGVkPU9iamVjdC5mcmVlemUoe2lzQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOiEwLG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkOlMxfSl9KShNdXx8KE11PXt9KSk7Y2xhc3MgT3V7Y29uc3RydWN0b3IoKXt0aGlzLl9pc0NhbmNlbGxlZD0hMSx0aGlzLl9lbWl0dGVyPW51bGx9Y2FuY2VsKCl7dGhpcy5faXNDYW5jZWxsZWR8fCh0aGlzLl9pc0NhbmNlbGxlZD0hMCx0aGlzLl9lbWl0dGVyJiYodGhpcy5fZW1pdHRlci5maXJlKHZvaWQgMCksdGhpcy5kaXNwb3NlKCkpKX1nZXQgaXNDYW5jZWxsYXRpb25SZXF1ZXN0ZWQoKXtyZXR1cm4gdGhpcy5faXNDYW5jZWxsZWR9Z2V0IG9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKCl7cmV0dXJuIHRoaXMuX2lzQ2FuY2VsbGVkP1MxOih0aGlzLl9lbWl0dGVyfHwodGhpcy5fZW1pdHRlcj1uZXcgbG4pLHRoaXMuX2VtaXR0ZXIuZXZlbnQpfWRpc3Bvc2UoKXt0aGlzLl9lbWl0dGVyJiYodGhpcy5fZW1pdHRlci5kaXNwb3NlKCksdGhpcy5fZW1pdHRlcj1udWxsKX19Y2xhc3MgTTh7Y29uc3RydWN0b3IodCl7dGhpcy5fdG9rZW49dm9pZCAwLHRoaXMuX3BhcmVudExpc3RlbmVyPXZvaWQgMCx0aGlzLl9wYXJlbnRMaXN0ZW5lcj10JiZ0Lm9uQ2FuY2VsbGF0aW9uUmVxdWVzdGVkKHRoaXMuY2FuY2VsLHRoaXMpfWdldCB0b2tlbigpe3JldHVybiB0aGlzLl90b2tlbnx8KHRoaXMuX3Rva2VuPW5ldyBPdSksdGhpcy5fdG9rZW59Y2FuY2VsKCl7dGhpcy5fdG9rZW4/dGhpcy5fdG9rZW4gaW5zdGFuY2VvZiBPdSYmdGhpcy5fdG9rZW4uY2FuY2VsKCk6dGhpcy5fdG9rZW49TXUuQ2FuY2VsbGVkfWRpc3Bvc2UodD0hMSl7dmFyIG47dCYmdGhpcy5jYW5jZWwoKSwobj10aGlzLl9wYXJlbnRMaXN0ZW5lcik9PW51bGx8fG4uZGlzcG9zZSgpLHRoaXMuX3Rva2VuP3RoaXMuX3Rva2VuIGluc3RhbmNlb2YgT3UmJnRoaXMuX3Rva2VuLmRpc3Bvc2UoKTp0aGlzLl90b2tlbj1NdS5Ob25lfX1jbGFzcyBPZntjb25zdHJ1Y3Rvcigpe3RoaXMuX2tleUNvZGVUb1N0cj1bXSx0aGlzLl9zdHJUb0tleUNvZGU9T2JqZWN0LmNyZWF0ZShudWxsKX1kZWZpbmUodCxuKXt0aGlzLl9rZXlDb2RlVG9TdHJbdF09bix0aGlzLl9zdHJUb0tleUNvZGVbbi50b0xvd2VyQ2FzZSgpXT10fWtleUNvZGVUb1N0cih0KXtyZXR1cm4gdGhpcy5fa2V5Q29kZVRvU3RyW3RdfXN0clRvS2V5Q29kZSh0KXtyZXR1cm4gdGhpcy5fc3RyVG9LZXlDb2RlW3QudG9Mb3dlckNhc2UoKV18fDB9fWNvbnN0IFJ1PW5ldyBPZixSZj1uZXcgT2YsamY9bmV3IE9mLE84PW5ldyBBcnJheSgyMzApLFI4PU9iamVjdC5jcmVhdGUobnVsbCksajg9T2JqZWN0LmNyZWF0ZShudWxsKTsoZnVuY3Rpb24oKXtjb25zdCBlPSIiLHQ9W1sxLDAsIk5vbmUiLDAsInVua25vd24iLDAsIlZLX1VOS05PV04iLGUsZV0sWzEsMSwiSHlwZXIiLDAsZSwwLGUsZSxlXSxbMSwyLCJTdXBlciIsMCxlLDAsZSxlLGVdLFsxLDMsIkZuIiwwLGUsMCxlLGUsZV0sWzEsNCwiRm5Mb2NrIiwwLGUsMCxlLGUsZV0sWzEsNSwiU3VzcGVuZCIsMCxlLDAsZSxlLGVdLFsxLDYsIlJlc3VtZSIsMCxlLDAsZSxlLGVdLFsxLDcsIlR1cmJvIiwwLGUsMCxlLGUsZV0sWzEsOCwiU2xlZXAiLDAsZSwwLCJWS19TTEVFUCIsZSxlXSxbMSw5LCJXYWtlVXAiLDAsZSwwLGUsZSxlXSxbMCwxMCwiS2V5QSIsMzEsIkEiLDY1LCJWS19BIixlLGVdLFswLDExLCJLZXlCIiwzMiwiQiIsNjYsIlZLX0IiLGUsZV0sWzAsMTIsIktleUMiLDMzLCJDIiw2NywiVktfQyIsZSxlXSxbMCwxMywiS2V5RCIsMzQsIkQiLDY4LCJWS19EIixlLGVdLFswLDE0LCJLZXlFIiwzNSwiRSIsNjksIlZLX0UiLGUsZV0sWzAsMTUsIktleUYiLDM2LCJGIiw3MCwiVktfRiIsZSxlXSxbMCwxNiwiS2V5RyIsMzcsIkciLDcxLCJWS19HIixlLGVdLFswLDE3LCJLZXlIIiwzOCwiSCIsNzIsIlZLX0giLGUsZV0sWzAsMTgsIktleUkiLDM5LCJJIiw3MywiVktfSSIsZSxlXSxbMCwxOSwiS2V5SiIsNDAsIkoiLDc0LCJWS19KIixlLGVdLFswLDIwLCJLZXlLIiw0MSwiSyIsNzUsIlZLX0siLGUsZV0sWzAsMjEsIktleUwiLDQyLCJMIiw3NiwiVktfTCIsZSxlXSxbMCwyMiwiS2V5TSIsNDMsIk0iLDc3LCJWS19NIixlLGVdLFswLDIzLCJLZXlOIiw0NCwiTiIsNzgsIlZLX04iLGUsZV0sWzAsMjQsIktleU8iLDQ1LCJPIiw3OSwiVktfTyIsZSxlXSxbMCwyNSwiS2V5UCIsNDYsIlAiLDgwLCJWS19QIixlLGVdLFswLDI2LCJLZXlRIiw0NywiUSIsODEsIlZLX1EiLGUsZV0sWzAsMjcsIktleVIiLDQ4LCJSIiw4MiwiVktfUiIsZSxlXSxbMCwyOCwiS2V5UyIsNDksIlMiLDgzLCJWS19TIixlLGVdLFswLDI5LCJLZXlUIiw1MCwiVCIsODQsIlZLX1QiLGUsZV0sWzAsMzAsIktleVUiLDUxLCJVIiw4NSwiVktfVSIsZSxlXSxbMCwzMSwiS2V5ViIsNTIsIlYiLDg2LCJWS19WIixlLGVdLFswLDMyLCJLZXlXIiw1MywiVyIsODcsIlZLX1ciLGUsZV0sWzAsMzMsIktleVgiLDU0LCJYIiw4OCwiVktfWCIsZSxlXSxbMCwzNCwiS2V5WSIsNTUsIlkiLDg5LCJWS19ZIixlLGVdLFswLDM1LCJLZXlaIiw1NiwiWiIsOTAsIlZLX1oiLGUsZV0sWzAsMzYsIkRpZ2l0MSIsMjIsIjEiLDQ5LCJWS18xIixlLGVdLFswLDM3LCJEaWdpdDIiLDIzLCIyIiw1MCwiVktfMiIsZSxlXSxbMCwzOCwiRGlnaXQzIiwyNCwiMyIsNTEsIlZLXzMiLGUsZV0sWzAsMzksIkRpZ2l0NCIsMjUsIjQiLDUyLCJWS180IixlLGVdLFswLDQwLCJEaWdpdDUiLDI2LCI1Iiw1MywiVktfNSIsZSxlXSxbMCw0MSwiRGlnaXQ2IiwyNywiNiIsNTQsIlZLXzYiLGUsZV0sWzAsNDIsIkRpZ2l0NyIsMjgsIjciLDU1LCJWS183IixlLGVdLFswLDQzLCJEaWdpdDgiLDI5LCI4Iiw1NiwiVktfOCIsZSxlXSxbMCw0NCwiRGlnaXQ5IiwzMCwiOSIsNTcsIlZLXzkiLGUsZV0sWzAsNDUsIkRpZ2l0MCIsMjEsIjAiLDQ4LCJWS18wIixlLGVdLFsxLDQ2LCJFbnRlciIsMywiRW50ZXIiLDEzLCJWS19SRVRVUk4iLGUsZV0sWzEsNDcsIkVzY2FwZSIsOSwiRXNjYXBlIiwyNywiVktfRVNDQVBFIixlLGVdLFsxLDQ4LCJCYWNrc3BhY2UiLDEsIkJhY2tzcGFjZSIsOCwiVktfQkFDSyIsZSxlXSxbMSw0OSwiVGFiIiwyLCJUYWIiLDksIlZLX1RBQiIsZSxlXSxbMSw1MCwiU3BhY2UiLDEwLCJTcGFjZSIsMzIsIlZLX1NQQUNFIixlLGVdLFswLDUxLCJNaW51cyIsODgsIi0iLDE4OSwiVktfT0VNX01JTlVTIiwiLSIsIk9FTV9NSU5VUyJdLFswLDUyLCJFcXVhbCIsODYsIj0iLDE4NywiVktfT0VNX1BMVVMiLCI9IiwiT0VNX1BMVVMiXSxbMCw1MywiQnJhY2tldExlZnQiLDkyLCJbIiwyMTksIlZLX09FTV80IiwiWyIsIk9FTV80Il0sWzAsNTQsIkJyYWNrZXRSaWdodCIsOTQsIl0iLDIyMSwiVktfT0VNXzYiLCJdIiwiT0VNXzYiXSxbMCw1NSwiQmFja3NsYXNoIiw5MywiXFwiLDIyMCwiVktfT0VNXzUiLCJcXCIsIk9FTV81Il0sWzAsNTYsIkludGxIYXNoIiwwLGUsMCxlLGUsZV0sWzAsNTcsIlNlbWljb2xvbiIsODUsIjsiLDE4NiwiVktfT0VNXzEiLCI7IiwiT0VNXzEiXSxbMCw1OCwiUXVvdGUiLDk1LCInIiwyMjIsIlZLX09FTV83IiwiJyIsIk9FTV83Il0sWzAsNTksIkJhY2txdW90ZSIsOTEsImAiLDE5MiwiVktfT0VNXzMiLCJgIiwiT0VNXzMiXSxbMCw2MCwiQ29tbWEiLDg3LCIsIiwxODgsIlZLX09FTV9DT01NQSIsIiwiLCJPRU1fQ09NTUEiXSxbMCw2MSwiUGVyaW9kIiw4OSwiLiIsMTkwLCJWS19PRU1fUEVSSU9EIiwiLiIsIk9FTV9QRVJJT0QiXSxbMCw2MiwiU2xhc2giLDkwLCIvIiwxOTEsIlZLX09FTV8yIiwiLyIsIk9FTV8yIl0sWzEsNjMsIkNhcHNMb2NrIiw4LCJDYXBzTG9jayIsMjAsIlZLX0NBUElUQUwiLGUsZV0sWzEsNjQsIkYxIiw1OSwiRjEiLDExMiwiVktfRjEiLGUsZV0sWzEsNjUsIkYyIiw2MCwiRjIiLDExMywiVktfRjIiLGUsZV0sWzEsNjYsIkYzIiw2MSwiRjMiLDExNCwiVktfRjMiLGUsZV0sWzEsNjcsIkY0Iiw2MiwiRjQiLDExNSwiVktfRjQiLGUsZV0sWzEsNjgsIkY1Iiw2MywiRjUiLDExNiwiVktfRjUiLGUsZV0sWzEsNjksIkY2Iiw2NCwiRjYiLDExNywiVktfRjYiLGUsZV0sWzEsNzAsIkY3Iiw2NSwiRjciLDExOCwiVktfRjciLGUsZV0sWzEsNzEsIkY4Iiw2NiwiRjgiLDExOSwiVktfRjgiLGUsZV0sWzEsNzIsIkY5Iiw2NywiRjkiLDEyMCwiVktfRjkiLGUsZV0sWzEsNzMsIkYxMCIsNjgsIkYxMCIsMTIxLCJWS19GMTAiLGUsZV0sWzEsNzQsIkYxMSIsNjksIkYxMSIsMTIyLCJWS19GMTEiLGUsZV0sWzEsNzUsIkYxMiIsNzAsIkYxMiIsMTIzLCJWS19GMTIiLGUsZV0sWzEsNzYsIlByaW50U2NyZWVuIiwwLGUsMCxlLGUsZV0sWzEsNzcsIlNjcm9sbExvY2siLDg0LCJTY3JvbGxMb2NrIiwxNDUsIlZLX1NDUk9MTCIsZSxlXSxbMSw3OCwiUGF1c2UiLDcsIlBhdXNlQnJlYWsiLDE5LCJWS19QQVVTRSIsZSxlXSxbMSw3OSwiSW5zZXJ0IiwxOSwiSW5zZXJ0Iiw0NSwiVktfSU5TRVJUIixlLGVdLFsxLDgwLCJIb21lIiwxNCwiSG9tZSIsMzYsIlZLX0hPTUUiLGUsZV0sWzEsODEsIlBhZ2VVcCIsMTEsIlBhZ2VVcCIsMzMsIlZLX1BSSU9SIixlLGVdLFsxLDgyLCJEZWxldGUiLDIwLCJEZWxldGUiLDQ2LCJWS19ERUxFVEUiLGUsZV0sWzEsODMsIkVuZCIsMTMsIkVuZCIsMzUsIlZLX0VORCIsZSxlXSxbMSw4NCwiUGFnZURvd24iLDEyLCJQYWdlRG93biIsMzQsIlZLX05FWFQiLGUsZV0sWzEsODUsIkFycm93UmlnaHQiLDE3LCJSaWdodEFycm93IiwzOSwiVktfUklHSFQiLCJSaWdodCIsZV0sWzEsODYsIkFycm93TGVmdCIsMTUsIkxlZnRBcnJvdyIsMzcsIlZLX0xFRlQiLCJMZWZ0IixlXSxbMSw4NywiQXJyb3dEb3duIiwxOCwiRG93bkFycm93Iiw0MCwiVktfRE9XTiIsIkRvd24iLGVdLFsxLDg4LCJBcnJvd1VwIiwxNiwiVXBBcnJvdyIsMzgsIlZLX1VQIiwiVXAiLGVdLFsxLDg5LCJOdW1Mb2NrIiw4MywiTnVtTG9jayIsMTQ0LCJWS19OVU1MT0NLIixlLGVdLFsxLDkwLCJOdW1wYWREaXZpZGUiLDExMywiTnVtUGFkX0RpdmlkZSIsMTExLCJWS19ESVZJREUiLGUsZV0sWzEsOTEsIk51bXBhZE11bHRpcGx5IiwxMDgsIk51bVBhZF9NdWx0aXBseSIsMTA2LCJWS19NVUxUSVBMWSIsZSxlXSxbMSw5MiwiTnVtcGFkU3VidHJhY3QiLDExMSwiTnVtUGFkX1N1YnRyYWN0IiwxMDksIlZLX1NVQlRSQUNUIixlLGVdLFsxLDkzLCJOdW1wYWRBZGQiLDEwOSwiTnVtUGFkX0FkZCIsMTA3LCJWS19BREQiLGUsZV0sWzEsOTQsIk51bXBhZEVudGVyIiwzLGUsMCxlLGUsZV0sWzEsOTUsIk51bXBhZDEiLDk5LCJOdW1QYWQxIiw5NywiVktfTlVNUEFEMSIsZSxlXSxbMSw5NiwiTnVtcGFkMiIsMTAwLCJOdW1QYWQyIiw5OCwiVktfTlVNUEFEMiIsZSxlXSxbMSw5NywiTnVtcGFkMyIsMTAxLCJOdW1QYWQzIiw5OSwiVktfTlVNUEFEMyIsZSxlXSxbMSw5OCwiTnVtcGFkNCIsMTAyLCJOdW1QYWQ0IiwxMDAsIlZLX05VTVBBRDQiLGUsZV0sWzEsOTksIk51bXBhZDUiLDEwMywiTnVtUGFkNSIsMTAxLCJWS19OVU1QQUQ1IixlLGVdLFsxLDEwMCwiTnVtcGFkNiIsMTA0LCJOdW1QYWQ2IiwxMDIsIlZLX05VTVBBRDYiLGUsZV0sWzEsMTAxLCJOdW1wYWQ3IiwxMDUsIk51bVBhZDciLDEwMywiVktfTlVNUEFENyIsZSxlXSxbMSwxMDIsIk51bXBhZDgiLDEwNiwiTnVtUGFkOCIsMTA0LCJWS19OVU1QQUQ4IixlLGVdLFsxLDEwMywiTnVtcGFkOSIsMTA3LCJOdW1QYWQ5IiwxMDUsIlZLX05VTVBBRDkiLGUsZV0sWzEsMTA0LCJOdW1wYWQwIiw5OCwiTnVtUGFkMCIsOTYsIlZLX05VTVBBRDAiLGUsZV0sWzEsMTA1LCJOdW1wYWREZWNpbWFsIiwxMTIsIk51bVBhZF9EZWNpbWFsIiwxMTAsIlZLX0RFQ0lNQUwiLGUsZV0sWzAsMTA2LCJJbnRsQmFja3NsYXNoIiw5NywiT0VNXzEwMiIsMjI2LCJWS19PRU1fMTAyIixlLGVdLFsxLDEwNywiQ29udGV4dE1lbnUiLDU4LCJDb250ZXh0TWVudSIsOTMsZSxlLGVdLFsxLDEwOCwiUG93ZXIiLDAsZSwwLGUsZSxlXSxbMSwxMDksIk51bXBhZEVxdWFsIiwwLGUsMCxlLGUsZV0sWzEsMTEwLCJGMTMiLDcxLCJGMTMiLDEyNCwiVktfRjEzIixlLGVdLFsxLDExMSwiRjE0Iiw3MiwiRjE0IiwxMjUsIlZLX0YxNCIsZSxlXSxbMSwxMTIsIkYxNSIsNzMsIkYxNSIsMTI2LCJWS19GMTUiLGUsZV0sWzEsMTEzLCJGMTYiLDc0LCJGMTYiLDEyNywiVktfRjE2IixlLGVdLFsxLDExNCwiRjE3Iiw3NSwiRjE3IiwxMjgsIlZLX0YxNyIsZSxlXSxbMSwxMTUsIkYxOCIsNzYsIkYxOCIsMTI5LCJWS19GMTgiLGUsZV0sWzEsMTE2LCJGMTkiLDc3LCJGMTkiLDEzMCwiVktfRjE5IixlLGVdLFsxLDExNywiRjIwIiw3OCwiRjIwIiwxMzEsIlZLX0YyMCIsZSxlXSxbMSwxMTgsIkYyMSIsNzksIkYyMSIsMTMyLCJWS19GMjEiLGUsZV0sWzEsMTE5LCJGMjIiLDgwLCJGMjIiLDEzMywiVktfRjIyIixlLGVdLFsxLDEyMCwiRjIzIiw4MSwiRjIzIiwxMzQsIlZLX0YyMyIsZSxlXSxbMSwxMjEsIkYyNCIsODIsIkYyNCIsMTM1LCJWS19GMjQiLGUsZV0sWzEsMTIyLCJPcGVuIiwwLGUsMCxlLGUsZV0sWzEsMTIzLCJIZWxwIiwwLGUsMCxlLGUsZV0sWzEsMTI0LCJTZWxlY3QiLDAsZSwwLGUsZSxlXSxbMSwxMjUsIkFnYWluIiwwLGUsMCxlLGUsZV0sWzEsMTI2LCJVbmRvIiwwLGUsMCxlLGUsZV0sWzEsMTI3LCJDdXQiLDAsZSwwLGUsZSxlXSxbMSwxMjgsIkNvcHkiLDAsZSwwLGUsZSxlXSxbMSwxMjksIlBhc3RlIiwwLGUsMCxlLGUsZV0sWzEsMTMwLCJGaW5kIiwwLGUsMCxlLGUsZV0sWzEsMTMxLCJBdWRpb1ZvbHVtZU11dGUiLDExNywiQXVkaW9Wb2x1bWVNdXRlIiwxNzMsIlZLX1ZPTFVNRV9NVVRFIixlLGVdLFsxLDEzMiwiQXVkaW9Wb2x1bWVVcCIsMTE4LCJBdWRpb1ZvbHVtZVVwIiwxNzUsIlZLX1ZPTFVNRV9VUCIsZSxlXSxbMSwxMzMsIkF1ZGlvVm9sdW1lRG93biIsMTE5LCJBdWRpb1ZvbHVtZURvd24iLDE3NCwiVktfVk9MVU1FX0RPV04iLGUsZV0sWzEsMTM0LCJOdW1wYWRDb21tYSIsMTEwLCJOdW1QYWRfU2VwYXJhdG9yIiwxMDgsIlZLX1NFUEFSQVRPUiIsZSxlXSxbMCwxMzUsIkludGxSbyIsMTE1LCJBQk5UX0MxIiwxOTMsIlZLX0FCTlRfQzEiLGUsZV0sWzEsMTM2LCJLYW5hTW9kZSIsMCxlLDAsZSxlLGVdLFswLDEzNywiSW50bFllbiIsMCxlLDAsZSxlLGVdLFsxLDEzOCwiQ29udmVydCIsMCxlLDAsZSxlLGVdLFsxLDEzOSwiTm9uQ29udmVydCIsMCxlLDAsZSxlLGVdLFsxLDE0MCwiTGFuZzEiLDAsZSwwLGUsZSxlXSxbMSwxNDEsIkxhbmcyIiwwLGUsMCxlLGUsZV0sWzEsMTQyLCJMYW5nMyIsMCxlLDAsZSxlLGVdLFsxLDE0MywiTGFuZzQiLDAsZSwwLGUsZSxlXSxbMSwxNDQsIkxhbmc1IiwwLGUsMCxlLGUsZV0sWzEsMTQ1LCJBYm9ydCIsMCxlLDAsZSxlLGVdLFsxLDE0NiwiUHJvcHMiLDAsZSwwLGUsZSxlXSxbMSwxNDcsIk51bXBhZFBhcmVuTGVmdCIsMCxlLDAsZSxlLGVdLFsxLDE0OCwiTnVtcGFkUGFyZW5SaWdodCIsMCxlLDAsZSxlLGVdLFsxLDE0OSwiTnVtcGFkQmFja3NwYWNlIiwwLGUsMCxlLGUsZV0sWzEsMTUwLCJOdW1wYWRNZW1vcnlTdG9yZSIsMCxlLDAsZSxlLGVdLFsxLDE1MSwiTnVtcGFkTWVtb3J5UmVjYWxsIiwwLGUsMCxlLGUsZV0sWzEsMTUyLCJOdW1wYWRNZW1vcnlDbGVhciIsMCxlLDAsZSxlLGVdLFsxLDE1MywiTnVtcGFkTWVtb3J5QWRkIiwwLGUsMCxlLGUsZV0sWzEsMTU0LCJOdW1wYWRNZW1vcnlTdWJ0cmFjdCIsMCxlLDAsZSxlLGVdLFsxLDE1NSwiTnVtcGFkQ2xlYXIiLDEzMSwiQ2xlYXIiLDEyLCJWS19DTEVBUiIsZSxlXSxbMSwxNTYsIk51bXBhZENsZWFyRW50cnkiLDAsZSwwLGUsZSxlXSxbMSwwLGUsNSwiQ3RybCIsMTcsIlZLX0NPTlRST0wiLGUsZV0sWzEsMCxlLDQsIlNoaWZ0IiwxNiwiVktfU0hJRlQiLGUsZV0sWzEsMCxlLDYsIkFsdCIsMTgsIlZLX01FTlUiLGUsZV0sWzEsMCxlLDU3LCJNZXRhIiw5MSwiVktfQ09NTUFORCIsZSxlXSxbMSwxNTcsIkNvbnRyb2xMZWZ0Iiw1LGUsMCwiVktfTENPTlRST0wiLGUsZV0sWzEsMTU4LCJTaGlmdExlZnQiLDQsZSwwLCJWS19MU0hJRlQiLGUsZV0sWzEsMTU5LCJBbHRMZWZ0Iiw2LGUsMCwiVktfTE1FTlUiLGUsZV0sWzEsMTYwLCJNZXRhTGVmdCIsNTcsZSwwLCJWS19MV0lOIixlLGVdLFsxLDE2MSwiQ29udHJvbFJpZ2h0Iiw1LGUsMCwiVktfUkNPTlRST0wiLGUsZV0sWzEsMTYyLCJTaGlmdFJpZ2h0Iiw0LGUsMCwiVktfUlNISUZUIixlLGVdLFsxLDE2MywiQWx0UmlnaHQiLDYsZSwwLCJWS19STUVOVSIsZSxlXSxbMSwxNjQsIk1ldGFSaWdodCIsNTcsZSwwLCJWS19SV0lOIixlLGVdLFsxLDE2NSwiQnJpZ2h0bmVzc1VwIiwwLGUsMCxlLGUsZV0sWzEsMTY2LCJCcmlnaHRuZXNzRG93biIsMCxlLDAsZSxlLGVdLFsxLDE2NywiTWVkaWFQbGF5IiwwLGUsMCxlLGUsZV0sWzEsMTY4LCJNZWRpYVJlY29yZCIsMCxlLDAsZSxlLGVdLFsxLDE2OSwiTWVkaWFGYXN0Rm9yd2FyZCIsMCxlLDAsZSxlLGVdLFsxLDE3MCwiTWVkaWFSZXdpbmQiLDAsZSwwLGUsZSxlXSxbMSwxNzEsIk1lZGlhVHJhY2tOZXh0IiwxMjQsIk1lZGlhVHJhY2tOZXh0IiwxNzYsIlZLX01FRElBX05FWFRfVFJBQ0siLGUsZV0sWzEsMTcyLCJNZWRpYVRyYWNrUHJldmlvdXMiLDEyNSwiTWVkaWFUcmFja1ByZXZpb3VzIiwxNzcsIlZLX01FRElBX1BSRVZfVFJBQ0siLGUsZV0sWzEsMTczLCJNZWRpYVN0b3AiLDEyNiwiTWVkaWFTdG9wIiwxNzgsIlZLX01FRElBX1NUT1AiLGUsZV0sWzEsMTc0LCJFamVjdCIsMCxlLDAsZSxlLGVdLFsxLDE3NSwiTWVkaWFQbGF5UGF1c2UiLDEyNywiTWVkaWFQbGF5UGF1c2UiLDE3OSwiVktfTUVESUFfUExBWV9QQVVTRSIsZSxlXSxbMSwxNzYsIk1lZGlhU2VsZWN0IiwxMjgsIkxhdW5jaE1lZGlhUGxheWVyIiwxODEsIlZLX01FRElBX0xBVU5DSF9NRURJQV9TRUxFQ1QiLGUsZV0sWzEsMTc3LCJMYXVuY2hNYWlsIiwxMjksIkxhdW5jaE1haWwiLDE4MCwiVktfTUVESUFfTEFVTkNIX01BSUwiLGUsZV0sWzEsMTc4LCJMYXVuY2hBcHAyIiwxMzAsIkxhdW5jaEFwcDIiLDE4MywiVktfTUVESUFfTEFVTkNIX0FQUDIiLGUsZV0sWzEsMTc5LCJMYXVuY2hBcHAxIiwwLGUsMCwiVktfTUVESUFfTEFVTkNIX0FQUDEiLGUsZV0sWzEsMTgwLCJTZWxlY3RUYXNrIiwwLGUsMCxlLGUsZV0sWzEsMTgxLCJMYXVuY2hTY3JlZW5TYXZlciIsMCxlLDAsZSxlLGVdLFsxLDE4MiwiQnJvd3NlclNlYXJjaCIsMTIwLCJCcm93c2VyU2VhcmNoIiwxNzAsIlZLX0JST1dTRVJfU0VBUkNIIixlLGVdLFsxLDE4MywiQnJvd3NlckhvbWUiLDEyMSwiQnJvd3NlckhvbWUiLDE3MiwiVktfQlJPV1NFUl9IT01FIixlLGVdLFsxLDE4NCwiQnJvd3NlckJhY2siLDEyMiwiQnJvd3NlckJhY2siLDE2NiwiVktfQlJPV1NFUl9CQUNLIixlLGVdLFsxLDE4NSwiQnJvd3NlckZvcndhcmQiLDEyMywiQnJvd3NlckZvcndhcmQiLDE2NywiVktfQlJPV1NFUl9GT1JXQVJEIixlLGVdLFsxLDE4NiwiQnJvd3NlclN0b3AiLDAsZSwwLCJWS19CUk9XU0VSX1NUT1AiLGUsZV0sWzEsMTg3LCJCcm93c2VyUmVmcmVzaCIsMCxlLDAsIlZLX0JST1dTRVJfUkVGUkVTSCIsZSxlXSxbMSwxODgsIkJyb3dzZXJGYXZvcml0ZXMiLDAsZSwwLCJWS19CUk9XU0VSX0ZBVk9SSVRFUyIsZSxlXSxbMSwxODksIlpvb21Ub2dnbGUiLDAsZSwwLGUsZSxlXSxbMSwxOTAsIk1haWxSZXBseSIsMCxlLDAsZSxlLGVdLFsxLDE5MSwiTWFpbEZvcndhcmQiLDAsZSwwLGUsZSxlXSxbMSwxOTIsIk1haWxTZW5kIiwwLGUsMCxlLGUsZV0sWzEsMCxlLDExNCwiS2V5SW5Db21wb3NpdGlvbiIsMjI5LGUsZSxlXSxbMSwwLGUsMTE2LCJBQk5UX0MyIiwxOTQsIlZLX0FCTlRfQzIiLGUsZV0sWzEsMCxlLDk2LCJPRU1fOCIsMjIzLCJWS19PRU1fOCIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0tBTkEiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19IQU5HVUwiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19KVU5KQSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0ZJTkFMIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfSEFOSkEiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19LQU5KSSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0NPTlZFUlQiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19OT05DT05WRVJUIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfQUNDRVBUIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfTU9ERUNIQU5HRSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX1NFTEVDVCIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX1BSSU5UIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfRVhFQ1VURSIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX1NOQVBTSE9UIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfSEVMUCIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0FQUFMiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19QUk9DRVNTS0VZIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfUEFDS0VUIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfREJFX1NCQ1NDSEFSIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfREJFX0RCQ1NDSEFSIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfQVRUTiIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX0NSU0VMIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfRVhTRUwiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19FUkVPRiIsZSxlXSxbMSwwLGUsMCxlLDAsIlZLX1BMQVkiLGUsZV0sWzEsMCxlLDAsZSwwLCJWS19aT09NIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfTk9OQU1FIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfUEExIixlLGVdLFsxLDAsZSwwLGUsMCwiVktfT0VNX0NMRUFSIixlLGVdXSxuPVtdLHI9W107Zm9yKGNvbnN0IHMgb2YgdCl7Y29uc3RbaSxvLGEsdSxsLGYsYyxwLGhdPXM7aWYocltvXXx8KHJbb109ITAsUjhbYV09byxqOFthLnRvTG93ZXJDYXNlKCldPW8pLCFuW3VdKXtpZihuW3VdPSEwLCFsKXRocm93IG5ldyBFcnJvcihgU3RyaW5nIHJlcHJlc2VudGF0aW9uIG1pc3NpbmcgZm9yIGtleSBjb2RlICR7dX0gYXJvdW5kIHNjYW4gY29kZSAke2F9YCk7UnUuZGVmaW5lKHUsbCksUmYuZGVmaW5lKHUscHx8bCksamYuZGVmaW5lKHUsaHx8cHx8bCl9ZiYmKE84W2ZdPXUpfX0pKCk7dmFyIHgxOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGEpe3JldHVybiBSdS5rZXlDb2RlVG9TdHIoYSl9ZS50b1N0cmluZz10O2Z1bmN0aW9uIG4oYSl7cmV0dXJuIFJ1LnN0clRvS2V5Q29kZShhKX1lLmZyb21TdHJpbmc9bjtmdW5jdGlvbiByKGEpe3JldHVybiBSZi5rZXlDb2RlVG9TdHIoYSl9ZS50b1VzZXJTZXR0aW5nc1VTPXI7ZnVuY3Rpb24gcyhhKXtyZXR1cm4gamYua2V5Q29kZVRvU3RyKGEpfWUudG9Vc2VyU2V0dGluZ3NHZW5lcmFsPXM7ZnVuY3Rpb24gaShhKXtyZXR1cm4gUmYuc3RyVG9LZXlDb2RlKGEpfHxqZi5zdHJUb0tleUNvZGUoYSl9ZS5mcm9tVXNlclNldHRpbmdzPWk7ZnVuY3Rpb24gbyhhKXtpZihhPj05OCYmYTw9MTEzKXJldHVybiBudWxsO3N3aXRjaChhKXtjYXNlIDE2OnJldHVybiJVcCI7Y2FzZSAxODpyZXR1cm4iRG93biI7Y2FzZSAxNTpyZXR1cm4iTGVmdCI7Y2FzZSAxNzpyZXR1cm4iUmlnaHQifXJldHVybiBSdS5rZXlDb2RlVG9TdHIoYSl9ZS50b0VsZWN0cm9uQWNjZWxlcmF0b3I9b30pKHgxfHwoeDE9e30pKTtmdW5jdGlvbiBWOChlLHQpe2NvbnN0IG49KHQmNjU1MzUpPDwxNj4+PjA7cmV0dXJuKGV8bik+Pj4wfWNsYXNzIEd0IGV4dGVuZHMgaGV7Y29uc3RydWN0b3IodCxuLHIscyl7c3VwZXIodCxuLHIscyksdGhpcy5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXI9dCx0aGlzLnNlbGVjdGlvblN0YXJ0Q29sdW1uPW4sdGhpcy5wb3NpdGlvbkxpbmVOdW1iZXI9cix0aGlzLnBvc2l0aW9uQ29sdW1uPXN9dG9TdHJpbmcoKXtyZXR1cm4iWyIrdGhpcy5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXIrIiwiK3RoaXMuc2VsZWN0aW9uU3RhcnRDb2x1bW4rIiAtPiAiK3RoaXMucG9zaXRpb25MaW5lTnVtYmVyKyIsIit0aGlzLnBvc2l0aW9uQ29sdW1uKyJdIn1lcXVhbHNTZWxlY3Rpb24odCl7cmV0dXJuIEd0LnNlbGVjdGlvbnNFcXVhbCh0aGlzLHQpfXN0YXRpYyBzZWxlY3Rpb25zRXF1YWwodCxuKXtyZXR1cm4gdC5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXI9PT1uLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlciYmdC5zZWxlY3Rpb25TdGFydENvbHVtbj09PW4uc2VsZWN0aW9uU3RhcnRDb2x1bW4mJnQucG9zaXRpb25MaW5lTnVtYmVyPT09bi5wb3NpdGlvbkxpbmVOdW1iZXImJnQucG9zaXRpb25Db2x1bW49PT1uLnBvc2l0aW9uQ29sdW1ufWdldERpcmVjdGlvbigpe3JldHVybiB0aGlzLnNlbGVjdGlvblN0YXJ0TGluZU51bWJlcj09PXRoaXMuc3RhcnRMaW5lTnVtYmVyJiZ0aGlzLnNlbGVjdGlvblN0YXJ0Q29sdW1uPT09dGhpcy5zdGFydENvbHVtbj8wOjF9c2V0RW5kUG9zaXRpb24odCxuKXtyZXR1cm4gdGhpcy5nZXREaXJlY3Rpb24oKT09PTA/bmV3IEd0KHRoaXMuc3RhcnRMaW5lTnVtYmVyLHRoaXMuc3RhcnRDb2x1bW4sdCxuKTpuZXcgR3QodCxuLHRoaXMuc3RhcnRMaW5lTnVtYmVyLHRoaXMuc3RhcnRDb2x1bW4pfWdldFBvc2l0aW9uKCl7cmV0dXJuIG5ldyBKZSh0aGlzLnBvc2l0aW9uTGluZU51bWJlcix0aGlzLnBvc2l0aW9uQ29sdW1uKX1nZXRTZWxlY3Rpb25TdGFydCgpe3JldHVybiBuZXcgSmUodGhpcy5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXIsdGhpcy5zZWxlY3Rpb25TdGFydENvbHVtbil9c2V0U3RhcnRQb3NpdGlvbih0LG4pe3JldHVybiB0aGlzLmdldERpcmVjdGlvbigpPT09MD9uZXcgR3QodCxuLHRoaXMuZW5kTGluZU51bWJlcix0aGlzLmVuZENvbHVtbik6bmV3IEd0KHRoaXMuZW5kTGluZU51bWJlcix0aGlzLmVuZENvbHVtbix0LG4pfXN0YXRpYyBmcm9tUG9zaXRpb25zKHQsbj10KXtyZXR1cm4gbmV3IEd0KHQubGluZU51bWJlcix0LmNvbHVtbixuLmxpbmVOdW1iZXIsbi5jb2x1bW4pfXN0YXRpYyBmcm9tUmFuZ2UodCxuKXtyZXR1cm4gbj09PTA/bmV3IEd0KHQuc3RhcnRMaW5lTnVtYmVyLHQuc3RhcnRDb2x1bW4sdC5lbmRMaW5lTnVtYmVyLHQuZW5kQ29sdW1uKTpuZXcgR3QodC5lbmRMaW5lTnVtYmVyLHQuZW5kQ29sdW1uLHQuc3RhcnRMaW5lTnVtYmVyLHQuc3RhcnRDb2x1bW4pfXN0YXRpYyBsaWZ0U2VsZWN0aW9uKHQpe3JldHVybiBuZXcgR3QodC5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXIsdC5zZWxlY3Rpb25TdGFydENvbHVtbix0LnBvc2l0aW9uTGluZU51bWJlcix0LnBvc2l0aW9uQ29sdW1uKX1zdGF0aWMgc2VsZWN0aW9uc0FyckVxdWFsKHQsbil7aWYodCYmIW58fCF0JiZuKXJldHVybiExO2lmKCF0JiYhbilyZXR1cm4hMDtpZih0Lmxlbmd0aCE9PW4ubGVuZ3RoKXJldHVybiExO2ZvcihsZXQgcj0wLHM9dC5sZW5ndGg7cjxzO3IrKylpZighdGhpcy5zZWxlY3Rpb25zRXF1YWwodFtyXSxuW3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1zdGF0aWMgaXNJU2VsZWN0aW9uKHQpe3JldHVybiB0JiZ0eXBlb2YgdC5zZWxlY3Rpb25TdGFydExpbmVOdW1iZXI9PSJudW1iZXIiJiZ0eXBlb2YgdC5zZWxlY3Rpb25TdGFydENvbHVtbj09Im51bWJlciImJnR5cGVvZiB0LnBvc2l0aW9uTGluZU51bWJlcj09Im51bWJlciImJnR5cGVvZiB0LnBvc2l0aW9uQ29sdW1uPT0ibnVtYmVyIn1zdGF0aWMgY3JlYXRlV2l0aERpcmVjdGlvbih0LG4scixzLGkpe3JldHVybiBpPT09MD9uZXcgR3QodCxuLHIscyk6bmV3IEd0KHIscyx0LG4pfX1mdW5jdGlvbiBVOChlKXtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmcifWNvbnN0IGsxPU9iamVjdC5jcmVhdGUobnVsbCk7ZnVuY3Rpb24geShlLHQpe2lmKFU4KHQpKXtjb25zdCBuPWsxW3RdO2lmKG49PT12b2lkIDApdGhyb3cgbmV3IEVycm9yKGAke2V9IHJlZmVyZW5jZXMgYW4gdW5rbm93biBjb2RpY29uOiAke3R9YCk7dD1ufXJldHVybiBrMVtlXT10LHtpZDplfX1jb25zdCBxOD17YWRkOnkoImFkZCIsNmU0KSxwbHVzOnkoInBsdXMiLDZlNCksZ2lzdE5ldzp5KCJnaXN0LW5ldyIsNmU0KSxyZXBvQ3JlYXRlOnkoInJlcG8tY3JlYXRlIiw2ZTQpLGxpZ2h0YnVsYjp5KCJsaWdodGJ1bGIiLDYwMDAxKSxsaWdodEJ1bGI6eSgibGlnaHQtYnVsYiIsNjAwMDEpLHJlcG86eSgicmVwbyIsNjAwMDIpLHJlcG9EZWxldGU6eSgicmVwby1kZWxldGUiLDYwMDAyKSxnaXN0Rm9yazp5KCJnaXN0LWZvcmsiLDYwMDAzKSxyZXBvRm9ya2VkOnkoInJlcG8tZm9ya2VkIiw2MDAwMyksZ2l0UHVsbFJlcXVlc3Q6eSgiZ2l0LXB1bGwtcmVxdWVzdCIsNjAwMDQpLGdpdFB1bGxSZXF1ZXN0QWJhbmRvbmVkOnkoImdpdC1wdWxsLXJlcXVlc3QtYWJhbmRvbmVkIiw2MDAwNCkscmVjb3JkS2V5czp5KCJyZWNvcmQta2V5cyIsNjAwMDUpLGtleWJvYXJkOnkoImtleWJvYXJkIiw2MDAwNSksdGFnOnkoInRhZyIsNjAwMDYpLGdpdFB1bGxSZXF1ZXN0TGFiZWw6eSgiZ2l0LXB1bGwtcmVxdWVzdC1sYWJlbCIsNjAwMDYpLHRhZ0FkZDp5KCJ0YWctYWRkIiw2MDAwNiksdGFnUmVtb3ZlOnkoInRhZy1yZW1vdmUiLDYwMDA2KSxwZXJzb246eSgicGVyc29uIiw2MDAwNykscGVyc29uRm9sbG93OnkoInBlcnNvbi1mb2xsb3ciLDYwMDA3KSxwZXJzb25PdXRsaW5lOnkoInBlcnNvbi1vdXRsaW5lIiw2MDAwNykscGVyc29uRmlsbGVkOnkoInBlcnNvbi1maWxsZWQiLDYwMDA3KSxnaXRCcmFuY2g6eSgiZ2l0LWJyYW5jaCIsNjAwMDgpLGdpdEJyYW5jaENyZWF0ZTp5KCJnaXQtYnJhbmNoLWNyZWF0ZSIsNjAwMDgpLGdpdEJyYW5jaERlbGV0ZTp5KCJnaXQtYnJhbmNoLWRlbGV0ZSIsNjAwMDgpLHNvdXJjZUNvbnRyb2w6eSgic291cmNlLWNvbnRyb2wiLDYwMDA4KSxtaXJyb3I6eSgibWlycm9yIiw2MDAwOSksbWlycm9yUHVibGljOnkoIm1pcnJvci1wdWJsaWMiLDYwMDA5KSxzdGFyOnkoInN0YXIiLDYwMDEwKSxzdGFyQWRkOnkoInN0YXItYWRkIiw2MDAxMCksc3RhckRlbGV0ZTp5KCJzdGFyLWRlbGV0ZSIsNjAwMTApLHN0YXJFbXB0eTp5KCJzdGFyLWVtcHR5Iiw2MDAxMCksY29tbWVudDp5KCJjb21tZW50Iiw2MDAxMSksY29tbWVudEFkZDp5KCJjb21tZW50LWFkZCIsNjAwMTEpLGFsZXJ0OnkoImFsZXJ0Iiw2MDAxMiksd2FybmluZzp5KCJ3YXJuaW5nIiw2MDAxMiksc2VhcmNoOnkoInNlYXJjaCIsNjAwMTMpLHNlYXJjaFNhdmU6eSgic2VhcmNoLXNhdmUiLDYwMDEzKSxsb2dPdXQ6eSgibG9nLW91dCIsNjAwMTQpLHNpZ25PdXQ6eSgic2lnbi1vdXQiLDYwMDE0KSxsb2dJbjp5KCJsb2ctaW4iLDYwMDE1KSxzaWduSW46eSgic2lnbi1pbiIsNjAwMTUpLGV5ZTp5KCJleWUiLDYwMDE2KSxleWVVbndhdGNoOnkoImV5ZS11bndhdGNoIiw2MDAxNiksZXllV2F0Y2g6eSgiZXllLXdhdGNoIiw2MDAxNiksY2lyY2xlRmlsbGVkOnkoImNpcmNsZS1maWxsZWQiLDYwMDE3KSxwcmltaXRpdmVEb3Q6eSgicHJpbWl0aXZlLWRvdCIsNjAwMTcpLGNsb3NlRGlydHk6eSgiY2xvc2UtZGlydHkiLDYwMDE3KSxkZWJ1Z0JyZWFrcG9pbnQ6eSgiZGVidWctYnJlYWtwb2ludCIsNjAwMTcpLGRlYnVnQnJlYWtwb2ludERpc2FibGVkOnkoImRlYnVnLWJyZWFrcG9pbnQtZGlzYWJsZWQiLDYwMDE3KSxkZWJ1Z0hpbnQ6eSgiZGVidWctaGludCIsNjAwMTcpLHRlcm1pbmFsRGVjb3JhdGlvblN1Y2Nlc3M6eSgidGVybWluYWwtZGVjb3JhdGlvbi1zdWNjZXNzIiw2MDAxNykscHJpbWl0aXZlU3F1YXJlOnkoInByaW1pdGl2ZS1zcXVhcmUiLDYwMDE4KSxlZGl0OnkoImVkaXQiLDYwMDE5KSxwZW5jaWw6eSgicGVuY2lsIiw2MDAxOSksaW5mbzp5KCJpbmZvIiw2MDAyMCksaXNzdWVPcGVuZWQ6eSgiaXNzdWUtb3BlbmVkIiw2MDAyMCksZ2lzdFByaXZhdGU6eSgiZ2lzdC1wcml2YXRlIiw2MDAyMSksZ2l0Rm9ya1ByaXZhdGU6eSgiZ2l0LWZvcmstcHJpdmF0ZSIsNjAwMjEpLGxvY2s6eSgibG9jayIsNjAwMjEpLG1pcnJvclByaXZhdGU6eSgibWlycm9yLXByaXZhdGUiLDYwMDIxKSxjbG9zZTp5KCJjbG9zZSIsNjAwMjIpLHJlbW92ZUNsb3NlOnkoInJlbW92ZS1jbG9zZSIsNjAwMjIpLHg6eSgieCIsNjAwMjIpLHJlcG9TeW5jOnkoInJlcG8tc3luYyIsNjAwMjMpLHN5bmM6eSgic3luYyIsNjAwMjMpLGNsb25lOnkoImNsb25lIiw2MDAyNCksZGVza3RvcERvd25sb2FkOnkoImRlc2t0b3AtZG93bmxvYWQiLDYwMDI0KSxiZWFrZXI6eSgiYmVha2VyIiw2MDAyNSksbWljcm9zY29wZTp5KCJtaWNyb3Njb3BlIiw2MDAyNSksdm06eSgidm0iLDYwMDI2KSxkZXZpY2VEZXNrdG9wOnkoImRldmljZS1kZXNrdG9wIiw2MDAyNiksZmlsZTp5KCJmaWxlIiw2MDAyNyksZmlsZVRleHQ6eSgiZmlsZS10ZXh0Iiw2MDAyNyksbW9yZTp5KCJtb3JlIiw2MDAyOCksZWxsaXBzaXM6eSgiZWxsaXBzaXMiLDYwMDI4KSxrZWJhYkhvcml6b250YWw6eSgia2ViYWItaG9yaXpvbnRhbCIsNjAwMjgpLG1haWxSZXBseTp5KCJtYWlsLXJlcGx5Iiw2MDAyOSkscmVwbHk6eSgicmVwbHkiLDYwMDI5KSxvcmdhbml6YXRpb246eSgib3JnYW5pemF0aW9uIiw2MDAzMCksb3JnYW5pemF0aW9uRmlsbGVkOnkoIm9yZ2FuaXphdGlvbi1maWxsZWQiLDYwMDMwKSxvcmdhbml6YXRpb25PdXRsaW5lOnkoIm9yZ2FuaXphdGlvbi1vdXRsaW5lIiw2MDAzMCksbmV3RmlsZTp5KCJuZXctZmlsZSIsNjAwMzEpLGZpbGVBZGQ6eSgiZmlsZS1hZGQiLDYwMDMxKSxuZXdGb2xkZXI6eSgibmV3LWZvbGRlciIsNjAwMzIpLGZpbGVEaXJlY3RvcnlDcmVhdGU6eSgiZmlsZS1kaXJlY3RvcnktY3JlYXRlIiw2MDAzMiksdHJhc2g6eSgidHJhc2giLDYwMDMzKSx0cmFzaGNhbjp5KCJ0cmFzaGNhbiIsNjAwMzMpLGhpc3Rvcnk6eSgiaGlzdG9yeSIsNjAwMzQpLGNsb2NrOnkoImNsb2NrIiw2MDAzNCksZm9sZGVyOnkoImZvbGRlciIsNjAwMzUpLGZpbGVEaXJlY3Rvcnk6eSgiZmlsZS1kaXJlY3RvcnkiLDYwMDM1KSxzeW1ib2xGb2xkZXI6eSgic3ltYm9sLWZvbGRlciIsNjAwMzUpLGxvZ29HaXRodWI6eSgibG9nby1naXRodWIiLDYwMDM2KSxtYXJrR2l0aHViOnkoIm1hcmstZ2l0aHViIiw2MDAzNiksZ2l0aHViOnkoImdpdGh1YiIsNjAwMzYpLHRlcm1pbmFsOnkoInRlcm1pbmFsIiw2MDAzNyksY29uc29sZTp5KCJjb25zb2xlIiw2MDAzNykscmVwbDp5KCJyZXBsIiw2MDAzNyksemFwOnkoInphcCIsNjAwMzgpLHN5bWJvbEV2ZW50OnkoInN5bWJvbC1ldmVudCIsNjAwMzgpLGVycm9yOnkoImVycm9yIiw2MDAzOSksc3RvcDp5KCJzdG9wIiw2MDAzOSksdmFyaWFibGU6eSgidmFyaWFibGUiLDYwMDQwKSxzeW1ib2xWYXJpYWJsZTp5KCJzeW1ib2wtdmFyaWFibGUiLDYwMDQwKSxhcnJheTp5KCJhcnJheSIsNjAwNDIpLHN5bWJvbEFycmF5OnkoInN5bWJvbC1hcnJheSIsNjAwNDIpLHN5bWJvbE1vZHVsZTp5KCJzeW1ib2wtbW9kdWxlIiw2MDA0Myksc3ltYm9sUGFja2FnZTp5KCJzeW1ib2wtcGFja2FnZSIsNjAwNDMpLHN5bWJvbE5hbWVzcGFjZTp5KCJzeW1ib2wtbmFtZXNwYWNlIiw2MDA0Myksc3ltYm9sT2JqZWN0OnkoInN5bWJvbC1vYmplY3QiLDYwMDQzKSxzeW1ib2xNZXRob2Q6eSgic3ltYm9sLW1ldGhvZCIsNjAwNDQpLHN5bWJvbEZ1bmN0aW9uOnkoInN5bWJvbC1mdW5jdGlvbiIsNjAwNDQpLHN5bWJvbENvbnN0cnVjdG9yOnkoInN5bWJvbC1jb25zdHJ1Y3RvciIsNjAwNDQpLHN5bWJvbEJvb2xlYW46eSgic3ltYm9sLWJvb2xlYW4iLDYwMDQ3KSxzeW1ib2xOdWxsOnkoInN5bWJvbC1udWxsIiw2MDA0Nyksc3ltYm9sTnVtZXJpYzp5KCJzeW1ib2wtbnVtZXJpYyIsNjAwNDgpLHN5bWJvbE51bWJlcjp5KCJzeW1ib2wtbnVtYmVyIiw2MDA0OCksc3ltYm9sU3RydWN0dXJlOnkoInN5bWJvbC1zdHJ1Y3R1cmUiLDYwMDQ5KSxzeW1ib2xTdHJ1Y3Q6eSgic3ltYm9sLXN0cnVjdCIsNjAwNDkpLHN5bWJvbFBhcmFtZXRlcjp5KCJzeW1ib2wtcGFyYW1ldGVyIiw2MDA1MCksc3ltYm9sVHlwZVBhcmFtZXRlcjp5KCJzeW1ib2wtdHlwZS1wYXJhbWV0ZXIiLDYwMDUwKSxzeW1ib2xLZXk6eSgic3ltYm9sLWtleSIsNjAwNTEpLHN5bWJvbFRleHQ6eSgic3ltYm9sLXRleHQiLDYwMDUxKSxzeW1ib2xSZWZlcmVuY2U6eSgic3ltYm9sLXJlZmVyZW5jZSIsNjAwNTIpLGdvVG9GaWxlOnkoImdvLXRvLWZpbGUiLDYwMDUyKSxzeW1ib2xFbnVtOnkoInN5bWJvbC1lbnVtIiw2MDA1Myksc3ltYm9sVmFsdWU6eSgic3ltYm9sLXZhbHVlIiw2MDA1Myksc3ltYm9sUnVsZXI6eSgic3ltYm9sLXJ1bGVyIiw2MDA1NCksc3ltYm9sVW5pdDp5KCJzeW1ib2wtdW5pdCIsNjAwNTQpLGFjdGl2YXRlQnJlYWtwb2ludHM6eSgiYWN0aXZhdGUtYnJlYWtwb2ludHMiLDYwMDU1KSxhcmNoaXZlOnkoImFyY2hpdmUiLDYwMDU2KSxhcnJvd0JvdGg6eSgiYXJyb3ctYm90aCIsNjAwNTcpLGFycm93RG93bjp5KCJhcnJvdy1kb3duIiw2MDA1OCksYXJyb3dMZWZ0OnkoImFycm93LWxlZnQiLDYwMDU5KSxhcnJvd1JpZ2h0OnkoImFycm93LXJpZ2h0Iiw2MDA2MCksYXJyb3dTbWFsbERvd246eSgiYXJyb3ctc21hbGwtZG93biIsNjAwNjEpLGFycm93U21hbGxMZWZ0OnkoImFycm93LXNtYWxsLWxlZnQiLDYwMDYyKSxhcnJvd1NtYWxsUmlnaHQ6eSgiYXJyb3ctc21hbGwtcmlnaHQiLDYwMDYzKSxhcnJvd1NtYWxsVXA6eSgiYXJyb3ctc21hbGwtdXAiLDYwMDY0KSxhcnJvd1VwOnkoImFycm93LXVwIiw2MDA2NSksYmVsbDp5KCJiZWxsIiw2MDA2NiksYm9sZDp5KCJib2xkIiw2MDA2NyksYm9vazp5KCJib29rIiw2MDA2OCksYm9va21hcms6eSgiYm9va21hcmsiLDYwMDY5KSxkZWJ1Z0JyZWFrcG9pbnRDb25kaXRpb25hbFVudmVyaWZpZWQ6eSgiZGVidWctYnJlYWtwb2ludC1jb25kaXRpb25hbC11bnZlcmlmaWVkIiw2MDA3MCksZGVidWdCcmVha3BvaW50Q29uZGl0aW9uYWw6eSgiZGVidWctYnJlYWtwb2ludC1jb25kaXRpb25hbCIsNjAwNzEpLGRlYnVnQnJlYWtwb2ludENvbmRpdGlvbmFsRGlzYWJsZWQ6eSgiZGVidWctYnJlYWtwb2ludC1jb25kaXRpb25hbC1kaXNhYmxlZCIsNjAwNzEpLGRlYnVnQnJlYWtwb2ludERhdGFVbnZlcmlmaWVkOnkoImRlYnVnLWJyZWFrcG9pbnQtZGF0YS11bnZlcmlmaWVkIiw2MDA3MiksZGVidWdCcmVha3BvaW50RGF0YTp5KCJkZWJ1Zy1icmVha3BvaW50LWRhdGEiLDYwMDczKSxkZWJ1Z0JyZWFrcG9pbnREYXRhRGlzYWJsZWQ6eSgiZGVidWctYnJlYWtwb2ludC1kYXRhLWRpc2FibGVkIiw2MDA3MyksZGVidWdCcmVha3BvaW50TG9nVW52ZXJpZmllZDp5KCJkZWJ1Zy1icmVha3BvaW50LWxvZy11bnZlcmlmaWVkIiw2MDA3NCksZGVidWdCcmVha3BvaW50TG9nOnkoImRlYnVnLWJyZWFrcG9pbnQtbG9nIiw2MDA3NSksZGVidWdCcmVha3BvaW50TG9nRGlzYWJsZWQ6eSgiZGVidWctYnJlYWtwb2ludC1sb2ctZGlzYWJsZWQiLDYwMDc1KSxicmllZmNhc2U6eSgiYnJpZWZjYXNlIiw2MDA3NiksYnJvYWRjYXN0OnkoImJyb2FkY2FzdCIsNjAwNzcpLGJyb3dzZXI6eSgiYnJvd3NlciIsNjAwNzgpLGJ1Zzp5KCJidWciLDYwMDc5KSxjYWxlbmRhcjp5KCJjYWxlbmRhciIsNjAwODApLGNhc2VTZW5zaXRpdmU6eSgiY2FzZS1zZW5zaXRpdmUiLDYwMDgxKSxjaGVjazp5KCJjaGVjayIsNjAwODIpLGNoZWNrbGlzdDp5KCJjaGVja2xpc3QiLDYwMDgzKSxjaGV2cm9uRG93bjp5KCJjaGV2cm9uLWRvd24iLDYwMDg0KSxjaGV2cm9uTGVmdDp5KCJjaGV2cm9uLWxlZnQiLDYwMDg1KSxjaGV2cm9uUmlnaHQ6eSgiY2hldnJvbi1yaWdodCIsNjAwODYpLGNoZXZyb25VcDp5KCJjaGV2cm9uLXVwIiw2MDA4NyksY2hyb21lQ2xvc2U6eSgiY2hyb21lLWNsb3NlIiw2MDA4OCksY2hyb21lTWF4aW1pemU6eSgiY2hyb21lLW1heGltaXplIiw2MDA4OSksY2hyb21lTWluaW1pemU6eSgiY2hyb21lLW1pbmltaXplIiw2MDA5MCksY2hyb21lUmVzdG9yZTp5KCJjaHJvbWUtcmVzdG9yZSIsNjAwOTEpLGNpcmNsZU91dGxpbmU6eSgiY2lyY2xlLW91dGxpbmUiLDYwMDkyKSxjaXJjbGU6eSgiY2lyY2xlIiw2MDA5MiksZGVidWdCcmVha3BvaW50VW52ZXJpZmllZDp5KCJkZWJ1Zy1icmVha3BvaW50LXVudmVyaWZpZWQiLDYwMDkyKSx0ZXJtaW5hbERlY29yYXRpb25JbmNvbXBsZXRlOnkoInRlcm1pbmFsLWRlY29yYXRpb24taW5jb21wbGV0ZSIsNjAwOTIpLGNpcmNsZVNsYXNoOnkoImNpcmNsZS1zbGFzaCIsNjAwOTMpLGNpcmN1aXRCb2FyZDp5KCJjaXJjdWl0LWJvYXJkIiw2MDA5NCksY2xlYXJBbGw6eSgiY2xlYXItYWxsIiw2MDA5NSksY2xpcHB5OnkoImNsaXBweSIsNjAwOTYpLGNsb3NlQWxsOnkoImNsb3NlLWFsbCIsNjAwOTcpLGNsb3VkRG93bmxvYWQ6eSgiY2xvdWQtZG93bmxvYWQiLDYwMDk4KSxjbG91ZFVwbG9hZDp5KCJjbG91ZC11cGxvYWQiLDYwMDk5KSxjb2RlOnkoImNvZGUiLDYwMTAwKSxjb2xsYXBzZUFsbDp5KCJjb2xsYXBzZS1hbGwiLDYwMTAxKSxjb2xvck1vZGU6eSgiY29sb3ItbW9kZSIsNjAxMDIpLGNvbW1lbnREaXNjdXNzaW9uOnkoImNvbW1lbnQtZGlzY3Vzc2lvbiIsNjAxMDMpLGNyZWRpdENhcmQ6eSgiY3JlZGl0LWNhcmQiLDYwMTA1KSxkYXNoOnkoImRhc2giLDYwMTA4KSxkYXNoYm9hcmQ6eSgiZGFzaGJvYXJkIiw2MDEwOSksZGF0YWJhc2U6eSgiZGF0YWJhc2UiLDYwMTEwKSxkZWJ1Z0NvbnRpbnVlOnkoImRlYnVnLWNvbnRpbnVlIiw2MDExMSksZGVidWdEaXNjb25uZWN0OnkoImRlYnVnLWRpc2Nvbm5lY3QiLDYwMTEyKSxkZWJ1Z1BhdXNlOnkoImRlYnVnLXBhdXNlIiw2MDExMyksZGVidWdSZXN0YXJ0OnkoImRlYnVnLXJlc3RhcnQiLDYwMTE0KSxkZWJ1Z1N0YXJ0OnkoImRlYnVnLXN0YXJ0Iiw2MDExNSksZGVidWdTdGVwSW50bzp5KCJkZWJ1Zy1zdGVwLWludG8iLDYwMTE2KSxkZWJ1Z1N0ZXBPdXQ6eSgiZGVidWctc3RlcC1vdXQiLDYwMTE3KSxkZWJ1Z1N0ZXBPdmVyOnkoImRlYnVnLXN0ZXAtb3ZlciIsNjAxMTgpLGRlYnVnU3RvcDp5KCJkZWJ1Zy1zdG9wIiw2MDExOSksZGVidWc6eSgiZGVidWciLDYwMTIwKSxkZXZpY2VDYW1lcmFWaWRlbzp5KCJkZXZpY2UtY2FtZXJhLXZpZGVvIiw2MDEyMSksZGV2aWNlQ2FtZXJhOnkoImRldmljZS1jYW1lcmEiLDYwMTIyKSxkZXZpY2VNb2JpbGU6eSgiZGV2aWNlLW1vYmlsZSIsNjAxMjMpLGRpZmZBZGRlZDp5KCJkaWZmLWFkZGVkIiw2MDEyNCksZGlmZklnbm9yZWQ6eSgiZGlmZi1pZ25vcmVkIiw2MDEyNSksZGlmZk1vZGlmaWVkOnkoImRpZmYtbW9kaWZpZWQiLDYwMTI2KSxkaWZmUmVtb3ZlZDp5KCJkaWZmLXJlbW92ZWQiLDYwMTI3KSxkaWZmUmVuYW1lZDp5KCJkaWZmLXJlbmFtZWQiLDYwMTI4KSxkaWZmOnkoImRpZmYiLDYwMTI5KSxkaWZmU2lkZWJ5c2lkZTp5KCJkaWZmLXNpZGVieXNpZGUiLDYwMTI5KSxkaXNjYXJkOnkoImRpc2NhcmQiLDYwMTMwKSxlZGl0b3JMYXlvdXQ6eSgiZWRpdG9yLWxheW91dCIsNjAxMzEpLGVtcHR5V2luZG93OnkoImVtcHR5LXdpbmRvdyIsNjAxMzIpLGV4Y2x1ZGU6eSgiZXhjbHVkZSIsNjAxMzMpLGV4dGVuc2lvbnM6eSgiZXh0ZW5zaW9ucyIsNjAxMzQpLGV5ZUNsb3NlZDp5KCJleWUtY2xvc2VkIiw2MDEzNSksZmlsZUJpbmFyeTp5KCJmaWxlLWJpbmFyeSIsNjAxMzYpLGZpbGVDb2RlOnkoImZpbGUtY29kZSIsNjAxMzcpLGZpbGVNZWRpYTp5KCJmaWxlLW1lZGlhIiw2MDEzOCksZmlsZVBkZjp5KCJmaWxlLXBkZiIsNjAxMzkpLGZpbGVTdWJtb2R1bGU6eSgiZmlsZS1zdWJtb2R1bGUiLDYwMTQwKSxmaWxlU3ltbGlua0RpcmVjdG9yeTp5KCJmaWxlLXN5bWxpbmstZGlyZWN0b3J5Iiw2MDE0MSksZmlsZVN5bWxpbmtGaWxlOnkoImZpbGUtc3ltbGluay1maWxlIiw2MDE0MiksZmlsZVppcDp5KCJmaWxlLXppcCIsNjAxNDMpLGZpbGVzOnkoImZpbGVzIiw2MDE0NCksZmlsdGVyOnkoImZpbHRlciIsNjAxNDUpLGZsYW1lOnkoImZsYW1lIiw2MDE0NiksZm9sZERvd246eSgiZm9sZC1kb3duIiw2MDE0NyksZm9sZFVwOnkoImZvbGQtdXAiLDYwMTQ4KSxmb2xkOnkoImZvbGQiLDYwMTQ5KSxmb2xkZXJBY3RpdmU6eSgiZm9sZGVyLWFjdGl2ZSIsNjAxNTApLGZvbGRlck9wZW5lZDp5KCJmb2xkZXItb3BlbmVkIiw2MDE1MSksZ2Vhcjp5KCJnZWFyIiw2MDE1MiksZ2lmdDp5KCJnaWZ0Iiw2MDE1MyksZ2lzdFNlY3JldDp5KCJnaXN0LXNlY3JldCIsNjAxNTQpLGdpc3Q6eSgiZ2lzdCIsNjAxNTUpLGdpdENvbW1pdDp5KCJnaXQtY29tbWl0Iiw2MDE1NiksZ2l0Q29tcGFyZTp5KCJnaXQtY29tcGFyZSIsNjAxNTcpLGNvbXBhcmVDaGFuZ2VzOnkoImNvbXBhcmUtY2hhbmdlcyIsNjAxNTcpLGdpdE1lcmdlOnkoImdpdC1tZXJnZSIsNjAxNTgpLGdpdGh1YkFjdGlvbjp5KCJnaXRodWItYWN0aW9uIiw2MDE1OSksZ2l0aHViQWx0OnkoImdpdGh1Yi1hbHQiLDYwMTYwKSxnbG9iZTp5KCJnbG9iZSIsNjAxNjEpLGdyYWJiZXI6eSgiZ3JhYmJlciIsNjAxNjIpLGdyYXBoOnkoImdyYXBoIiw2MDE2MyksZ3JpcHBlcjp5KCJncmlwcGVyIiw2MDE2NCksaGVhcnQ6eSgiaGVhcnQiLDYwMTY1KSxob21lOnkoImhvbWUiLDYwMTY2KSxob3Jpem9udGFsUnVsZTp5KCJob3Jpem9udGFsLXJ1bGUiLDYwMTY3KSxodWJvdDp5KCJodWJvdCIsNjAxNjgpLGluYm94OnkoImluYm94Iiw2MDE2OSksaXNzdWVSZW9wZW5lZDp5KCJpc3N1ZS1yZW9wZW5lZCIsNjAxNzEpLGlzc3Vlczp5KCJpc3N1ZXMiLDYwMTcyKSxpdGFsaWM6eSgiaXRhbGljIiw2MDE3MyksamVyc2V5OnkoImplcnNleSIsNjAxNzQpLGpzb246eSgianNvbiIsNjAxNzUpLGtlYmFiVmVydGljYWw6eSgia2ViYWItdmVydGljYWwiLDYwMTc2KSxrZXk6eSgia2V5Iiw2MDE3NyksbGF3OnkoImxhdyIsNjAxNzgpLGxpZ2h0YnVsYkF1dG9maXg6eSgibGlnaHRidWxiLWF1dG9maXgiLDYwMTc5KSxsaW5rRXh0ZXJuYWw6eSgibGluay1leHRlcm5hbCIsNjAxODApLGxpbms6eSgibGluayIsNjAxODEpLGxpc3RPcmRlcmVkOnkoImxpc3Qtb3JkZXJlZCIsNjAxODIpLGxpc3RVbm9yZGVyZWQ6eSgibGlzdC11bm9yZGVyZWQiLDYwMTgzKSxsaXZlU2hhcmU6eSgibGl2ZS1zaGFyZSIsNjAxODQpLGxvYWRpbmc6eSgibG9hZGluZyIsNjAxODUpLGxvY2F0aW9uOnkoImxvY2F0aW9uIiw2MDE4NiksbWFpbFJlYWQ6eSgibWFpbC1yZWFkIiw2MDE4NyksbWFpbDp5KCJtYWlsIiw2MDE4OCksbWFya2Rvd246eSgibWFya2Rvd24iLDYwMTg5KSxtZWdhcGhvbmU6eSgibWVnYXBob25lIiw2MDE5MCksbWVudGlvbjp5KCJtZW50aW9uIiw2MDE5MSksbWlsZXN0b25lOnkoIm1pbGVzdG9uZSIsNjAxOTIpLGdpdFB1bGxSZXF1ZXN0TWlsZXN0b25lOnkoImdpdC1wdWxsLXJlcXVlc3QtbWlsZXN0b25lIiw2MDE5MiksbW9ydGFyQm9hcmQ6eSgibW9ydGFyLWJvYXJkIiw2MDE5MyksbW92ZTp5KCJtb3ZlIiw2MDE5NCksbXVsdGlwbGVXaW5kb3dzOnkoIm11bHRpcGxlLXdpbmRvd3MiLDYwMTk1KSxtdXRlOnkoIm11dGUiLDYwMTk2KSxub05ld2xpbmU6eSgibm8tbmV3bGluZSIsNjAxOTcpLG5vdGU6eSgibm90ZSIsNjAxOTgpLG9jdG9mYWNlOnkoIm9jdG9mYWNlIiw2MDE5OSksb3BlblByZXZpZXc6eSgib3Blbi1wcmV2aWV3Iiw2MDIwMCkscGFja2FnZTp5KCJwYWNrYWdlIiw2MDIwMSkscGFpbnRjYW46eSgicGFpbnRjYW4iLDYwMjAyKSxwaW46eSgicGluIiw2MDIwMykscGxheTp5KCJwbGF5Iiw2MDIwNCkscnVuOnkoInJ1biIsNjAyMDQpLHBsdWc6eSgicGx1ZyIsNjAyMDUpLHByZXNlcnZlQ2FzZTp5KCJwcmVzZXJ2ZS1jYXNlIiw2MDIwNikscHJldmlldzp5KCJwcmV2aWV3Iiw2MDIwNykscHJvamVjdDp5KCJwcm9qZWN0Iiw2MDIwOCkscHVsc2U6eSgicHVsc2UiLDYwMjA5KSxxdWVzdGlvbjp5KCJxdWVzdGlvbiIsNjAyMTApLHF1b3RlOnkoInF1b3RlIiw2MDIxMSkscmFkaW9Ub3dlcjp5KCJyYWRpby10b3dlciIsNjAyMTIpLHJlYWN0aW9uczp5KCJyZWFjdGlvbnMiLDYwMjEzKSxyZWZlcmVuY2VzOnkoInJlZmVyZW5jZXMiLDYwMjE0KSxyZWZyZXNoOnkoInJlZnJlc2giLDYwMjE1KSxyZWdleDp5KCJyZWdleCIsNjAyMTYpLHJlbW90ZUV4cGxvcmVyOnkoInJlbW90ZS1leHBsb3JlciIsNjAyMTcpLHJlbW90ZTp5KCJyZW1vdGUiLDYwMjE4KSxyZW1vdmU6eSgicmVtb3ZlIiw2MDIxOSkscmVwbGFjZUFsbDp5KCJyZXBsYWNlLWFsbCIsNjAyMjApLHJlcGxhY2U6eSgicmVwbGFjZSIsNjAyMjEpLHJlcG9DbG9uZTp5KCJyZXBvLWNsb25lIiw2MDIyMikscmVwb0ZvcmNlUHVzaDp5KCJyZXBvLWZvcmNlLXB1c2giLDYwMjIzKSxyZXBvUHVsbDp5KCJyZXBvLXB1bGwiLDYwMjI0KSxyZXBvUHVzaDp5KCJyZXBvLXB1c2giLDYwMjI1KSxyZXBvcnQ6eSgicmVwb3J0Iiw2MDIyNikscmVxdWVzdENoYW5nZXM6eSgicmVxdWVzdC1jaGFuZ2VzIiw2MDIyNykscm9ja2V0OnkoInJvY2tldCIsNjAyMjgpLHJvb3RGb2xkZXJPcGVuZWQ6eSgicm9vdC1mb2xkZXItb3BlbmVkIiw2MDIyOSkscm9vdEZvbGRlcjp5KCJyb290LWZvbGRlciIsNjAyMzApLHJzczp5KCJyc3MiLDYwMjMxKSxydWJ5OnkoInJ1YnkiLDYwMjMyKSxzYXZlQWxsOnkoInNhdmUtYWxsIiw2MDIzMyksc2F2ZUFzOnkoInNhdmUtYXMiLDYwMjM0KSxzYXZlOnkoInNhdmUiLDYwMjM1KSxzY3JlZW5GdWxsOnkoInNjcmVlbi1mdWxsIiw2MDIzNiksc2NyZWVuTm9ybWFsOnkoInNjcmVlbi1ub3JtYWwiLDYwMjM3KSxzZWFyY2hTdG9wOnkoInNlYXJjaC1zdG9wIiw2MDIzOCksc2VydmVyOnkoInNlcnZlciIsNjAyNDApLHNldHRpbmdzR2Vhcjp5KCJzZXR0aW5ncy1nZWFyIiw2MDI0MSksc2V0dGluZ3M6eSgic2V0dGluZ3MiLDYwMjQyKSxzaGllbGQ6eSgic2hpZWxkIiw2MDI0Myksc21pbGV5OnkoInNtaWxleSIsNjAyNDQpLHNvcnRQcmVjZWRlbmNlOnkoInNvcnQtcHJlY2VkZW5jZSIsNjAyNDUpLHNwbGl0SG9yaXpvbnRhbDp5KCJzcGxpdC1ob3Jpem9udGFsIiw2MDI0Niksc3BsaXRWZXJ0aWNhbDp5KCJzcGxpdC12ZXJ0aWNhbCIsNjAyNDcpLHNxdWlycmVsOnkoInNxdWlycmVsIiw2MDI0OCksc3RhckZ1bGw6eSgic3Rhci1mdWxsIiw2MDI0OSksc3RhckhhbGY6eSgic3Rhci1oYWxmIiw2MDI1MCksc3ltYm9sQ2xhc3M6eSgic3ltYm9sLWNsYXNzIiw2MDI1MSksc3ltYm9sQ29sb3I6eSgic3ltYm9sLWNvbG9yIiw2MDI1Miksc3ltYm9sQ29uc3RhbnQ6eSgic3ltYm9sLWNvbnN0YW50Iiw2MDI1Myksc3ltYm9sRW51bU1lbWJlcjp5KCJzeW1ib2wtZW51bS1tZW1iZXIiLDYwMjU0KSxzeW1ib2xGaWVsZDp5KCJzeW1ib2wtZmllbGQiLDYwMjU1KSxzeW1ib2xGaWxlOnkoInN5bWJvbC1maWxlIiw2MDI1Niksc3ltYm9sSW50ZXJmYWNlOnkoInN5bWJvbC1pbnRlcmZhY2UiLDYwMjU3KSxzeW1ib2xLZXl3b3JkOnkoInN5bWJvbC1rZXl3b3JkIiw2MDI1OCksc3ltYm9sTWlzYzp5KCJzeW1ib2wtbWlzYyIsNjAyNTkpLHN5bWJvbE9wZXJhdG9yOnkoInN5bWJvbC1vcGVyYXRvciIsNjAyNjApLHN5bWJvbFByb3BlcnR5OnkoInN5bWJvbC1wcm9wZXJ0eSIsNjAyNjEpLHdyZW5jaDp5KCJ3cmVuY2giLDYwMjYxKSx3cmVuY2hTdWJhY3Rpb246eSgid3JlbmNoLXN1YmFjdGlvbiIsNjAyNjEpLHN5bWJvbFNuaXBwZXQ6eSgic3ltYm9sLXNuaXBwZXQiLDYwMjYyKSx0YXNrbGlzdDp5KCJ0YXNrbGlzdCIsNjAyNjMpLHRlbGVzY29wZTp5KCJ0ZWxlc2NvcGUiLDYwMjY0KSx0ZXh0U2l6ZTp5KCJ0ZXh0LXNpemUiLDYwMjY1KSx0aHJlZUJhcnM6eSgidGhyZWUtYmFycyIsNjAyNjYpLHRodW1ic2Rvd246eSgidGh1bWJzZG93biIsNjAyNjcpLHRodW1ic3VwOnkoInRodW1ic3VwIiw2MDI2OCksdG9vbHM6eSgidG9vbHMiLDYwMjY5KSx0cmlhbmdsZURvd246eSgidHJpYW5nbGUtZG93biIsNjAyNzApLHRyaWFuZ2xlTGVmdDp5KCJ0cmlhbmdsZS1sZWZ0Iiw2MDI3MSksdHJpYW5nbGVSaWdodDp5KCJ0cmlhbmdsZS1yaWdodCIsNjAyNzIpLHRyaWFuZ2xlVXA6eSgidHJpYW5nbGUtdXAiLDYwMjczKSx0d2l0dGVyOnkoInR3aXR0ZXIiLDYwMjc0KSx1bmZvbGQ6eSgidW5mb2xkIiw2MDI3NSksdW5sb2NrOnkoInVubG9jayIsNjAyNzYpLHVubXV0ZTp5KCJ1bm11dGUiLDYwMjc3KSx1bnZlcmlmaWVkOnkoInVudmVyaWZpZWQiLDYwMjc4KSx2ZXJpZmllZDp5KCJ2ZXJpZmllZCIsNjAyNzkpLHZlcnNpb25zOnkoInZlcnNpb25zIiw2MDI4MCksdm1BY3RpdmU6eSgidm0tYWN0aXZlIiw2MDI4MSksdm1PdXRsaW5lOnkoInZtLW91dGxpbmUiLDYwMjgyKSx2bVJ1bm5pbmc6eSgidm0tcnVubmluZyIsNjAyODMpLHdhdGNoOnkoIndhdGNoIiw2MDI4NCksd2hpdGVzcGFjZTp5KCJ3aGl0ZXNwYWNlIiw2MDI4NSksd2hvbGVXb3JkOnkoIndob2xlLXdvcmQiLDYwMjg2KSx3aW5kb3c6eSgid2luZG93Iiw2MDI4Nyksd29yZFdyYXA6eSgid29yZC13cmFwIiw2MDI4OCksem9vbUluOnkoInpvb20taW4iLDYwMjg5KSx6b29tT3V0OnkoInpvb20tb3V0Iiw2MDI5MCksbGlzdEZpbHRlcjp5KCJsaXN0LWZpbHRlciIsNjAyOTEpLGxpc3RGbGF0OnkoImxpc3QtZmxhdCIsNjAyOTIpLGxpc3RTZWxlY3Rpb246eSgibGlzdC1zZWxlY3Rpb24iLDYwMjkzKSxzZWxlY3Rpb246eSgic2VsZWN0aW9uIiw2MDI5MyksbGlzdFRyZWU6eSgibGlzdC10cmVlIiw2MDI5NCksZGVidWdCcmVha3BvaW50RnVuY3Rpb25VbnZlcmlmaWVkOnkoImRlYnVnLWJyZWFrcG9pbnQtZnVuY3Rpb24tdW52ZXJpZmllZCIsNjAyOTUpLGRlYnVnQnJlYWtwb2ludEZ1bmN0aW9uOnkoImRlYnVnLWJyZWFrcG9pbnQtZnVuY3Rpb24iLDYwMjk2KSxkZWJ1Z0JyZWFrcG9pbnRGdW5jdGlvbkRpc2FibGVkOnkoImRlYnVnLWJyZWFrcG9pbnQtZnVuY3Rpb24tZGlzYWJsZWQiLDYwMjk2KSxkZWJ1Z1N0YWNrZnJhbWVBY3RpdmU6eSgiZGVidWctc3RhY2tmcmFtZS1hY3RpdmUiLDYwMjk3KSxjaXJjbGVTbWFsbEZpbGxlZDp5KCJjaXJjbGUtc21hbGwtZmlsbGVkIiw2MDI5OCksZGVidWdTdGFja2ZyYW1lRG90OnkoImRlYnVnLXN0YWNrZnJhbWUtZG90Iiw2MDI5OCksdGVybWluYWxEZWNvcmF0aW9uTWFyazp5KCJ0ZXJtaW5hbC1kZWNvcmF0aW9uLW1hcmsiLDYwMjk4KSxkZWJ1Z1N0YWNrZnJhbWU6eSgiZGVidWctc3RhY2tmcmFtZSIsNjAyOTkpLGRlYnVnU3RhY2tmcmFtZUZvY3VzZWQ6eSgiZGVidWctc3RhY2tmcmFtZS1mb2N1c2VkIiw2MDI5OSksZGVidWdCcmVha3BvaW50VW5zdXBwb3J0ZWQ6eSgiZGVidWctYnJlYWtwb2ludC11bnN1cHBvcnRlZCIsNjAzMDApLHN5bWJvbFN0cmluZzp5KCJzeW1ib2wtc3RyaW5nIiw2MDMwMSksZGVidWdSZXZlcnNlQ29udGludWU6eSgiZGVidWctcmV2ZXJzZS1jb250aW51ZSIsNjAzMDIpLGRlYnVnU3RlcEJhY2s6eSgiZGVidWctc3RlcC1iYWNrIiw2MDMwMyksZGVidWdSZXN0YXJ0RnJhbWU6eSgiZGVidWctcmVzdGFydC1mcmFtZSIsNjAzMDQpLGRlYnVnQWx0OnkoImRlYnVnLWFsdCIsNjAzMDUpLGNhbGxJbmNvbWluZzp5KCJjYWxsLWluY29taW5nIiw2MDMwNiksY2FsbE91dGdvaW5nOnkoImNhbGwtb3V0Z29pbmciLDYwMzA3KSxtZW51OnkoIm1lbnUiLDYwMzA4KSxleHBhbmRBbGw6eSgiZXhwYW5kLWFsbCIsNjAzMDkpLGZlZWRiYWNrOnkoImZlZWRiYWNrIiw2MDMxMCksZ2l0UHVsbFJlcXVlc3RSZXZpZXdlcjp5KCJnaXQtcHVsbC1yZXF1ZXN0LXJldmlld2VyIiw2MDMxMCksZ3JvdXBCeVJlZlR5cGU6eSgiZ3JvdXAtYnktcmVmLXR5cGUiLDYwMzExKSx1bmdyb3VwQnlSZWZUeXBlOnkoInVuZ3JvdXAtYnktcmVmLXR5cGUiLDYwMzEyKSxhY2NvdW50OnkoImFjY291bnQiLDYwMzEzKSxnaXRQdWxsUmVxdWVzdEFzc2lnbmVlOnkoImdpdC1wdWxsLXJlcXVlc3QtYXNzaWduZWUiLDYwMzEzKSxiZWxsRG90OnkoImJlbGwtZG90Iiw2MDMxNCksZGVidWdDb25zb2xlOnkoImRlYnVnLWNvbnNvbGUiLDYwMzE1KSxsaWJyYXJ5OnkoImxpYnJhcnkiLDYwMzE2KSxvdXRwdXQ6eSgib3V0cHV0Iiw2MDMxNykscnVuQWxsOnkoInJ1bi1hbGwiLDYwMzE4KSxzeW5jSWdub3JlZDp5KCJzeW5jLWlnbm9yZWQiLDYwMzE5KSxwaW5uZWQ6eSgicGlubmVkIiw2MDMyMCksZ2l0aHViSW52ZXJ0ZWQ6eSgiZ2l0aHViLWludmVydGVkIiw2MDMyMSksc2VydmVyUHJvY2Vzczp5KCJzZXJ2ZXItcHJvY2VzcyIsNjAzMjIpLHNlcnZlckVudmlyb25tZW50OnkoInNlcnZlci1lbnZpcm9ubWVudCIsNjAzMjMpLHBhc3M6eSgicGFzcyIsNjAzMjQpLGlzc3VlQ2xvc2VkOnkoImlzc3VlLWNsb3NlZCIsNjAzMjQpLHN0b3BDaXJjbGU6eSgic3RvcC1jaXJjbGUiLDYwMzI1KSxwbGF5Q2lyY2xlOnkoInBsYXktY2lyY2xlIiw2MDMyNikscmVjb3JkOnkoInJlY29yZCIsNjAzMjcpLGRlYnVnQWx0U21hbGw6eSgiZGVidWctYWx0LXNtYWxsIiw2MDMyOCksdm1Db25uZWN0OnkoInZtLWNvbm5lY3QiLDYwMzI5KSxjbG91ZDp5KCJjbG91ZCIsNjAzMzApLG1lcmdlOnkoIm1lcmdlIiw2MDMzMSksZXhwb3J0OnkoImV4cG9ydCIsNjAzMzIpLGdyYXBoTGVmdDp5KCJncmFwaC1sZWZ0Iiw2MDMzMyksbWFnbmV0OnkoIm1hZ25ldCIsNjAzMzQpLG5vdGVib29rOnkoIm5vdGVib29rIiw2MDMzNSkscmVkbzp5KCJyZWRvIiw2MDMzNiksY2hlY2tBbGw6eSgiY2hlY2stYWxsIiw2MDMzNykscGlubmVkRGlydHk6eSgicGlubmVkLWRpcnR5Iiw2MDMzOCkscGFzc0ZpbGxlZDp5KCJwYXNzLWZpbGxlZCIsNjAzMzkpLGNpcmNsZUxhcmdlRmlsbGVkOnkoImNpcmNsZS1sYXJnZS1maWxsZWQiLDYwMzQwKSxjaXJjbGVMYXJnZTp5KCJjaXJjbGUtbGFyZ2UiLDYwMzQxKSxjaXJjbGVMYXJnZU91dGxpbmU6eSgiY2lyY2xlLWxhcmdlLW91dGxpbmUiLDYwMzQxKSxjb21iaW5lOnkoImNvbWJpbmUiLDYwMzQyKSxnYXRoZXI6eSgiZ2F0aGVyIiw2MDM0MiksdGFibGU6eSgidGFibGUiLDYwMzQzKSx2YXJpYWJsZUdyb3VwOnkoInZhcmlhYmxlLWdyb3VwIiw2MDM0NCksdHlwZUhpZXJhcmNoeTp5KCJ0eXBlLWhpZXJhcmNoeSIsNjAzNDUpLHR5cGVIaWVyYXJjaHlTdWI6eSgidHlwZS1oaWVyYXJjaHktc3ViIiw2MDM0NiksdHlwZUhpZXJhcmNoeVN1cGVyOnkoInR5cGUtaGllcmFyY2h5LXN1cGVyIiw2MDM0NyksZ2l0UHVsbFJlcXVlc3RDcmVhdGU6eSgiZ2l0LXB1bGwtcmVxdWVzdC1jcmVhdGUiLDYwMzQ4KSxydW5BYm92ZTp5KCJydW4tYWJvdmUiLDYwMzQ5KSxydW5CZWxvdzp5KCJydW4tYmVsb3ciLDYwMzUwKSxub3RlYm9va1RlbXBsYXRlOnkoIm5vdGVib29rLXRlbXBsYXRlIiw2MDM1MSksZGVidWdSZXJ1bjp5KCJkZWJ1Zy1yZXJ1biIsNjAzNTIpLHdvcmtzcGFjZVRydXN0ZWQ6eSgid29ya3NwYWNlLXRydXN0ZWQiLDYwMzUzKSx3b3Jrc3BhY2VVbnRydXN0ZWQ6eSgid29ya3NwYWNlLXVudHJ1c3RlZCIsNjAzNTQpLHdvcmtzcGFjZVVua25vd246eSgid29ya3NwYWNlLXVua25vd24iLDYwMzU1KSx0ZXJtaW5hbENtZDp5KCJ0ZXJtaW5hbC1jbWQiLDYwMzU2KSx0ZXJtaW5hbERlYmlhbjp5KCJ0ZXJtaW5hbC1kZWJpYW4iLDYwMzU3KSx0ZXJtaW5hbExpbnV4OnkoInRlcm1pbmFsLWxpbnV4Iiw2MDM1OCksdGVybWluYWxQb3dlcnNoZWxsOnkoInRlcm1pbmFsLXBvd2Vyc2hlbGwiLDYwMzU5KSx0ZXJtaW5hbFRtdXg6eSgidGVybWluYWwtdG11eCIsNjAzNjApLHRlcm1pbmFsVWJ1bnR1OnkoInRlcm1pbmFsLXVidW50dSIsNjAzNjEpLHRlcm1pbmFsQmFzaDp5KCJ0ZXJtaW5hbC1iYXNoIiw2MDM2MiksYXJyb3dTd2FwOnkoImFycm93LXN3YXAiLDYwMzYzKSxjb3B5OnkoImNvcHkiLDYwMzY0KSxwZXJzb25BZGQ6eSgicGVyc29uLWFkZCIsNjAzNjUpLGZpbHRlckZpbGxlZDp5KCJmaWx0ZXItZmlsbGVkIiw2MDM2Niksd2FuZDp5KCJ3YW5kIiw2MDM2NyksZGVidWdMaW5lQnlMaW5lOnkoImRlYnVnLWxpbmUtYnktbGluZSIsNjAzNjgpLGluc3BlY3Q6eSgiaW5zcGVjdCIsNjAzNjkpLGxheWVyczp5KCJsYXllcnMiLDYwMzcwKSxsYXllcnNEb3Q6eSgibGF5ZXJzLWRvdCIsNjAzNzEpLGxheWVyc0FjdGl2ZTp5KCJsYXllcnMtYWN0aXZlIiw2MDM3MiksY29tcGFzczp5KCJjb21wYXNzIiw2MDM3MyksY29tcGFzc0RvdDp5KCJjb21wYXNzLWRvdCIsNjAzNzQpLGNvbXBhc3NBY3RpdmU6eSgiY29tcGFzcy1hY3RpdmUiLDYwMzc1KSxhenVyZTp5KCJhenVyZSIsNjAzNzYpLGlzc3VlRHJhZnQ6eSgiaXNzdWUtZHJhZnQiLDYwMzc3KSxnaXRQdWxsUmVxdWVzdENsb3NlZDp5KCJnaXQtcHVsbC1yZXF1ZXN0LWNsb3NlZCIsNjAzNzgpLGdpdFB1bGxSZXF1ZXN0RHJhZnQ6eSgiZ2l0LXB1bGwtcmVxdWVzdC1kcmFmdCIsNjAzNzkpLGRlYnVnQWxsOnkoImRlYnVnLWFsbCIsNjAzODApLGRlYnVnQ292ZXJhZ2U6eSgiZGVidWctY292ZXJhZ2UiLDYwMzgxKSxydW5FcnJvcnM6eSgicnVuLWVycm9ycyIsNjAzODIpLGZvbGRlckxpYnJhcnk6eSgiZm9sZGVyLWxpYnJhcnkiLDYwMzgzKSxkZWJ1Z0NvbnRpbnVlU21hbGw6eSgiZGVidWctY29udGludWUtc21hbGwiLDYwMzg0KSxiZWFrZXJTdG9wOnkoImJlYWtlci1zdG9wIiw2MDM4NSksZ3JhcGhMaW5lOnkoImdyYXBoLWxpbmUiLDYwMzg2KSxncmFwaFNjYXR0ZXI6eSgiZ3JhcGgtc2NhdHRlciIsNjAzODcpLHBpZUNoYXJ0OnkoInBpZS1jaGFydCIsNjAzODgpLGJyYWNrZXQ6eSgiYnJhY2tldCIsNjAxNzUpLGJyYWNrZXREb3Q6eSgiYnJhY2tldC1kb3QiLDYwMzg5KSxicmFja2V0RXJyb3I6eSgiYnJhY2tldC1lcnJvciIsNjAzOTApLGxvY2tTbWFsbDp5KCJsb2NrLXNtYWxsIiw2MDM5MSksYXp1cmVEZXZvcHM6eSgiYXp1cmUtZGV2b3BzIiw2MDM5MiksdmVyaWZpZWRGaWxsZWQ6eSgidmVyaWZpZWQtZmlsbGVkIiw2MDM5MyksbmV3bGluZTp5KCJuZXdsaW5lIiw2MDM5NCksbGF5b3V0OnkoImxheW91dCIsNjAzOTUpLGxheW91dEFjdGl2aXR5YmFyTGVmdDp5KCJsYXlvdXQtYWN0aXZpdHliYXItbGVmdCIsNjAzOTYpLGxheW91dEFjdGl2aXR5YmFyUmlnaHQ6eSgibGF5b3V0LWFjdGl2aXR5YmFyLXJpZ2h0Iiw2MDM5NyksbGF5b3V0UGFuZWxMZWZ0OnkoImxheW91dC1wYW5lbC1sZWZ0Iiw2MDM5OCksbGF5b3V0UGFuZWxDZW50ZXI6eSgibGF5b3V0LXBhbmVsLWNlbnRlciIsNjAzOTkpLGxheW91dFBhbmVsSnVzdGlmeTp5KCJsYXlvdXQtcGFuZWwtanVzdGlmeSIsNjA0MDApLGxheW91dFBhbmVsUmlnaHQ6eSgibGF5b3V0LXBhbmVsLXJpZ2h0Iiw2MDQwMSksbGF5b3V0UGFuZWw6eSgibGF5b3V0LXBhbmVsIiw2MDQwMiksbGF5b3V0U2lkZWJhckxlZnQ6eSgibGF5b3V0LXNpZGViYXItbGVmdCIsNjA0MDMpLGxheW91dFNpZGViYXJSaWdodDp5KCJsYXlvdXQtc2lkZWJhci1yaWdodCIsNjA0MDQpLGxheW91dFN0YXR1c2Jhcjp5KCJsYXlvdXQtc3RhdHVzYmFyIiw2MDQwNSksbGF5b3V0TWVudWJhcjp5KCJsYXlvdXQtbWVudWJhciIsNjA0MDYpLGxheW91dENlbnRlcmVkOnkoImxheW91dC1jZW50ZXJlZCIsNjA0MDcpLHRhcmdldDp5KCJ0YXJnZXQiLDYwNDA4KSxpbmRlbnQ6eSgiaW5kZW50Iiw2MDQwOSkscmVjb3JkU21hbGw6eSgicmVjb3JkLXNtYWxsIiw2MDQxMCksZXJyb3JTbWFsbDp5KCJlcnJvci1zbWFsbCIsNjA0MTEpLHRlcm1pbmFsRGVjb3JhdGlvbkVycm9yOnkoInRlcm1pbmFsLWRlY29yYXRpb24tZXJyb3IiLDYwNDExKSxhcnJvd0NpcmNsZURvd246eSgiYXJyb3ctY2lyY2xlLWRvd24iLDYwNDEyKSxhcnJvd0NpcmNsZUxlZnQ6eSgiYXJyb3ctY2lyY2xlLWxlZnQiLDYwNDEzKSxhcnJvd0NpcmNsZVJpZ2h0OnkoImFycm93LWNpcmNsZS1yaWdodCIsNjA0MTQpLGFycm93Q2lyY2xlVXA6eSgiYXJyb3ctY2lyY2xlLXVwIiw2MDQxNSksbGF5b3V0U2lkZWJhclJpZ2h0T2ZmOnkoImxheW91dC1zaWRlYmFyLXJpZ2h0LW9mZiIsNjA0MTYpLGxheW91dFBhbmVsT2ZmOnkoImxheW91dC1wYW5lbC1vZmYiLDYwNDE3KSxsYXlvdXRTaWRlYmFyTGVmdE9mZjp5KCJsYXlvdXQtc2lkZWJhci1sZWZ0LW9mZiIsNjA0MTgpLGJsYW5rOnkoImJsYW5rIiw2MDQxOSksaGVhcnRGaWxsZWQ6eSgiaGVhcnQtZmlsbGVkIiw2MDQyMCksbWFwOnkoIm1hcCIsNjA0MjEpLG1hcEhvcml6b250YWw6eSgibWFwLWhvcml6b250YWwiLDYwNDIxKSxmb2xkSG9yaXpvbnRhbDp5KCJmb2xkLWhvcml6b250YWwiLDYwNDIxKSxtYXBGaWxsZWQ6eSgibWFwLWZpbGxlZCIsNjA0MjIpLG1hcEhvcml6b250YWxGaWxsZWQ6eSgibWFwLWhvcml6b250YWwtZmlsbGVkIiw2MDQyMiksZm9sZEhvcml6b250YWxGaWxsZWQ6eSgiZm9sZC1ob3Jpem9udGFsLWZpbGxlZCIsNjA0MjIpLGNpcmNsZVNtYWxsOnkoImNpcmNsZS1zbWFsbCIsNjA0MjMpLGJlbGxTbGFzaDp5KCJiZWxsLXNsYXNoIiw2MDQyNCksYmVsbFNsYXNoRG90OnkoImJlbGwtc2xhc2gtZG90Iiw2MDQyNSksY29tbWVudFVucmVzb2x2ZWQ6eSgiY29tbWVudC11bnJlc29sdmVkIiw2MDQyNiksZ2l0UHVsbFJlcXVlc3RHb1RvQ2hhbmdlczp5KCJnaXQtcHVsbC1yZXF1ZXN0LWdvLXRvLWNoYW5nZXMiLDYwNDI3KSxnaXRQdWxsUmVxdWVzdE5ld0NoYW5nZXM6eSgiZ2l0LXB1bGwtcmVxdWVzdC1uZXctY2hhbmdlcyIsNjA0MjgpLHNlYXJjaEZ1enp5OnkoInNlYXJjaC1mdXp6eSIsNjA0MjkpLGNvbW1lbnREcmFmdDp5KCJjb21tZW50LWRyYWZ0Iiw2MDQzMCksc2VuZDp5KCJzZW5kIiw2MDQzMSksc3BhcmtsZTp5KCJzcGFya2xlIiw2MDQzMiksaW5zZXJ0OnkoImluc2VydCIsNjA0MzMpLG1pYzp5KCJtaWMiLDYwNDM0KSx0aHVtYnNkb3duRmlsbGVkOnkoInRodW1ic2Rvd24tZmlsbGVkIiw2MDQzNSksdGh1bWJzdXBGaWxsZWQ6eSgidGh1bWJzdXAtZmlsbGVkIiw2MDQzNiksY29mZmVlOnkoImNvZmZlZSIsNjA0MzcpLHNuYWtlOnkoInNuYWtlIiw2MDQzOCksZ2FtZTp5KCJnYW1lIiw2MDQzOSksdnI6eSgidnIiLDYwNDQwKSxjaGlwOnkoImNoaXAiLDYwNDQxKSxwaWFubzp5KCJwaWFubyIsNjA0NDIpLG11c2ljOnkoIm11c2ljIiw2MDQ0MyksbWljRmlsbGVkOnkoIm1pYy1maWxsZWQiLDYwNDQ0KSxyZXBvRmV0Y2g6eSgicmVwby1mZXRjaCIsNjA0NDUpLGNvcGlsb3Q6eSgiY29waWxvdCIsNjA0NDYpLGxpZ2h0YnVsYlNwYXJrbGU6eSgibGlnaHRidWxiLXNwYXJrbGUiLDYwNDQ3KSxyb2JvdDp5KCJyb2JvdCIsNjA0NDgpLHNwYXJrbGVGaWxsZWQ6eSgic3BhcmtsZS1maWxsZWQiLDYwNDQ5KSxkaWZmU2luZ2xlOnkoImRpZmYtc2luZ2xlIiw2MDQ1MCksZGlmZk11bHRpcGxlOnkoImRpZmYtbXVsdGlwbGUiLDYwNDUxKSxzdXJyb3VuZFdpdGg6eSgic3Vycm91bmQtd2l0aCIsNjA0NTIpLHNoYXJlOnkoInNoYXJlIiw2MDQ1MyksZ2l0U3Rhc2g6eSgiZ2l0LXN0YXNoIiw2MDQ1NCksZ2l0U3Rhc2hBcHBseTp5KCJnaXQtc3Rhc2gtYXBwbHkiLDYwNDU1KSxnaXRTdGFzaFBvcDp5KCJnaXQtc3Rhc2gtcG9wIiw2MDQ1NiksdnNjb2RlOnkoInZzY29kZSIsNjA0NTcpLHZzY29kZUluc2lkZXJzOnkoInZzY29kZS1pbnNpZGVycyIsNjA0NTgpLGNvZGVPc3M6eSgiY29kZS1vc3MiLDYwNDU5KSxydW5Db3ZlcmFnZTp5KCJydW4tY292ZXJhZ2UiLDYwNDYwKSxydW5BbGxDb3ZlcmFnZTp5KCJydW4tYWxsLWNvdmVyYWdlIiw2MDQ2MSksY292ZXJhZ2U6eSgiY292ZXJhZ2UiLDYwNDYyKSxnaXRodWJQcm9qZWN0OnkoImdpdGh1Yi1wcm9qZWN0Iiw2MDQ2MyksbWFwVmVydGljYWw6eSgibWFwLXZlcnRpY2FsIiw2MDQ2NCksZm9sZFZlcnRpY2FsOnkoImZvbGQtdmVydGljYWwiLDYwNDY0KSxtYXBWZXJ0aWNhbEZpbGxlZDp5KCJtYXAtdmVydGljYWwtZmlsbGVkIiw2MDQ2NSksZm9sZFZlcnRpY2FsRmlsbGVkOnkoImZvbGQtdmVydGljYWwtZmlsbGVkIiw2MDQ2NSksZ29Ub1NlYXJjaDp5KCJnby10by1zZWFyY2giLDYwNDY2KSxwZXJjZW50YWdlOnkoInBlcmNlbnRhZ2UiLDYwNDY3KSxzb3J0UGVyY2VudGFnZTp5KCJzb3J0LXBlcmNlbnRhZ2UiLDYwNDY3KSxhdHRhY2g6eSgiYXR0YWNoIiw2MDQ2OCl9LFc4PXtkaWFsb2dFcnJvcjp5KCJkaWFsb2ctZXJyb3IiLCJlcnJvciIpLGRpYWxvZ1dhcm5pbmc6eSgiZGlhbG9nLXdhcm5pbmciLCJ3YXJuaW5nIiksZGlhbG9nSW5mbzp5KCJkaWFsb2ctaW5mbyIsImluZm8iKSxkaWFsb2dDbG9zZTp5KCJkaWFsb2ctY2xvc2UiLCJjbG9zZSIpLHRyZWVJdGVtRXhwYW5kZWQ6eSgidHJlZS1pdGVtLWV4cGFuZGVkIiwiY2hldnJvbi1kb3duIiksdHJlZUZpbHRlck9uVHlwZU9uOnkoInRyZWUtZmlsdGVyLW9uLXR5cGUtb24iLCJsaXN0LWZpbHRlciIpLHRyZWVGaWx0ZXJPblR5cGVPZmY6eSgidHJlZS1maWx0ZXItb24tdHlwZS1vZmYiLCJsaXN0LXNlbGVjdGlvbiIpLHRyZWVGaWx0ZXJDbGVhcjp5KCJ0cmVlLWZpbHRlci1jbGVhciIsImNsb3NlIiksdHJlZUl0ZW1Mb2FkaW5nOnkoInRyZWUtaXRlbS1sb2FkaW5nIiwibG9hZGluZyIpLG1lbnVTZWxlY3Rpb246eSgibWVudS1zZWxlY3Rpb24iLCJjaGVjayIpLG1lbnVTdWJtZW51OnkoIm1lbnUtc3VibWVudSIsImNoZXZyb24tcmlnaHQiKSxtZW51QmFyTW9yZTp5KCJtZW51YmFyLW1vcmUiLCJtb3JlIiksc2Nyb2xsYmFyQnV0dG9uTGVmdDp5KCJzY3JvbGxiYXItYnV0dG9uLWxlZnQiLCJ0cmlhbmdsZS1sZWZ0Iiksc2Nyb2xsYmFyQnV0dG9uUmlnaHQ6eSgic2Nyb2xsYmFyLWJ1dHRvbi1yaWdodCIsInRyaWFuZ2xlLXJpZ2h0Iiksc2Nyb2xsYmFyQnV0dG9uVXA6eSgic2Nyb2xsYmFyLWJ1dHRvbi11cCIsInRyaWFuZ2xlLXVwIiksc2Nyb2xsYmFyQnV0dG9uRG93bjp5KCJzY3JvbGxiYXItYnV0dG9uLWRvd24iLCJ0cmlhbmdsZS1kb3duIiksdG9vbEJhck1vcmU6eSgidG9vbGJhci1tb3JlIiwibW9yZSIpLHF1aWNrSW5wdXRCYWNrOnkoInF1aWNrLWlucHV0LWJhY2siLCJhcnJvdy1sZWZ0IiksZHJvcERvd25CdXR0b246eSgiZHJvcC1kb3duLWJ1dHRvbiIsNjAwODQpLHN5bWJvbEN1c3RvbUNvbG9yOnkoInN5bWJvbC1jdXN0b21jb2xvciIsNjAyNTIpLGV4cG9ydEljb246eSgiZXhwb3J0Iiw2MDMzMiksd29ya3NwYWNlVW5zcGVjaWZpZWQ6eSgid29ya3NwYWNlLXVuc3BlY2lmaWVkIiw2MDM1NSksbmV3TGluZTp5KCJuZXdsaW5lIiw2MDM5NCksdGh1bWJzRG93bkZpbGxlZDp5KCJ0aHVtYnNkb3duLWZpbGxlZCIsNjA0MzUpLHRodW1ic1VwRmlsbGVkOnkoInRodW1ic3VwLWZpbGxlZCIsNjA0MzYpLGdpdEZldGNoOnkoImdpdC1mZXRjaCIsNjA0NDUpLGxpZ2h0YnVsYlNwYXJrbGVBdXRvZml4OnkoImxpZ2h0YnVsYi1zcGFya2xlLWF1dG9maXgiLDYwNDQ3KSxkZWJ1Z0JyZWFrcG9pbnRQZW5kaW5nOnkoImRlYnVnLWJyZWFrcG9pbnQtcGVuZGluZyIsNjAzNzcpfSxHPXsuLi5xOCwuLi5XOH07Y2xhc3MgVDF7Y29uc3RydWN0b3IoKXt0aGlzLl90b2tlbml6YXRpb25TdXBwb3J0cz1uZXcgTWFwLHRoaXMuX2ZhY3Rvcmllcz1uZXcgTWFwLHRoaXMuX29uRGlkQ2hhbmdlPW5ldyBsbix0aGlzLm9uRGlkQ2hhbmdlPXRoaXMuX29uRGlkQ2hhbmdlLmV2ZW50LHRoaXMuX2NvbG9yTWFwPW51bGx9aGFuZGxlQ2hhbmdlKHQpe3RoaXMuX29uRGlkQ2hhbmdlLmZpcmUoe2NoYW5nZWRMYW5ndWFnZXM6dCxjaGFuZ2VkQ29sb3JNYXA6ITF9KX1yZWdpc3Rlcih0LG4pe3JldHVybiB0aGlzLl90b2tlbml6YXRpb25TdXBwb3J0cy5zZXQodCxuKSx0aGlzLmhhbmRsZUNoYW5nZShbdF0pLFR1KCgpPT57dGhpcy5fdG9rZW5pemF0aW9uU3VwcG9ydHMuZ2V0KHQpPT09biYmKHRoaXMuX3Rva2VuaXphdGlvblN1cHBvcnRzLmRlbGV0ZSh0KSx0aGlzLmhhbmRsZUNoYW5nZShbdF0pKX0pfWdldCh0KXtyZXR1cm4gdGhpcy5fdG9rZW5pemF0aW9uU3VwcG9ydHMuZ2V0KHQpfHxudWxsfXJlZ2lzdGVyRmFjdG9yeSh0LG4pe3ZhciBzOyhzPXRoaXMuX2ZhY3Rvcmllcy5nZXQodCkpPT1udWxsfHxzLmRpc3Bvc2UoKTtjb25zdCByPW5ldyBIOCh0aGlzLHQsbik7cmV0dXJuIHRoaXMuX2ZhY3Rvcmllcy5zZXQodCxyKSxUdSgoKT0+e2NvbnN0IGk9dGhpcy5fZmFjdG9yaWVzLmdldCh0KTshaXx8aSE9PXJ8fCh0aGlzLl9mYWN0b3JpZXMuZGVsZXRlKHQpLGkuZGlzcG9zZSgpKX0pfWFzeW5jIGdldE9yQ3JlYXRlKHQpe2NvbnN0IG49dGhpcy5nZXQodCk7aWYobilyZXR1cm4gbjtjb25zdCByPXRoaXMuX2ZhY3Rvcmllcy5nZXQodCk7cmV0dXJuIXJ8fHIuaXNSZXNvbHZlZD9udWxsOihhd2FpdCByLnJlc29sdmUoKSx0aGlzLmdldCh0KSl9aXNSZXNvbHZlZCh0KXtpZih0aGlzLmdldCh0KSlyZXR1cm4hMDtjb25zdCByPXRoaXMuX2ZhY3Rvcmllcy5nZXQodCk7cmV0dXJuISEoIXJ8fHIuaXNSZXNvbHZlZCl9c2V0Q29sb3JNYXAodCl7dGhpcy5fY29sb3JNYXA9dCx0aGlzLl9vbkRpZENoYW5nZS5maXJlKHtjaGFuZ2VkTGFuZ3VhZ2VzOkFycmF5LmZyb20odGhpcy5fdG9rZW5pemF0aW9uU3VwcG9ydHMua2V5cygpKSxjaGFuZ2VkQ29sb3JNYXA6ITB9KX1nZXRDb2xvck1hcCgpe3JldHVybiB0aGlzLl9jb2xvck1hcH1nZXREZWZhdWx0QmFja2dyb3VuZCgpe3JldHVybiB0aGlzLl9jb2xvck1hcCYmdGhpcy5fY29sb3JNYXAubGVuZ3RoPjI/dGhpcy5fY29sb3JNYXBbMl06bnVsbH19Y2xhc3MgSDggZXh0ZW5kcyB4aXtnZXQgaXNSZXNvbHZlZCgpe3JldHVybiB0aGlzLl9pc1Jlc29sdmVkfWNvbnN0cnVjdG9yKHQsbixyKXtzdXBlcigpLHRoaXMuX3JlZ2lzdHJ5PXQsdGhpcy5fbGFuZ3VhZ2VJZD1uLHRoaXMuX2ZhY3Rvcnk9cix0aGlzLl9pc0Rpc3Bvc2VkPSExLHRoaXMuX3Jlc29sdmVQcm9taXNlPW51bGwsdGhpcy5faXNSZXNvbHZlZD0hMX1kaXNwb3NlKCl7dGhpcy5faXNEaXNwb3NlZD0hMCxzdXBlci5kaXNwb3NlKCl9YXN5bmMgcmVzb2x2ZSgpe3JldHVybiB0aGlzLl9yZXNvbHZlUHJvbWlzZXx8KHRoaXMuX3Jlc29sdmVQcm9taXNlPXRoaXMuX2NyZWF0ZSgpKSx0aGlzLl9yZXNvbHZlUHJvbWlzZX1hc3luYyBfY3JlYXRlKCl7Y29uc3QgdD1hd2FpdCB0aGlzLl9mYWN0b3J5LnRva2VuaXphdGlvblN1cHBvcnQ7dGhpcy5faXNSZXNvbHZlZD0hMCx0JiYhdGhpcy5faXNEaXNwb3NlZCYmdGhpcy5fcmVnaXN0ZXIodGhpcy5fcmVnaXN0cnkucmVnaXN0ZXIodGhpcy5fbGFuZ3VhZ2VJZCx0KSl9fWNsYXNzIEo4e2NvbnN0cnVjdG9yKHQsbixyKXt0aGlzLm9mZnNldD10LHRoaXMudHlwZT1uLHRoaXMubGFuZ3VhZ2U9cix0aGlzLl90b2tlbkJyYW5kPXZvaWQgMH10b1N0cmluZygpe3JldHVybiIoIit0aGlzLm9mZnNldCsiLCAiK3RoaXMudHlwZSsiKSJ9fXZhciBOMTsoZnVuY3Rpb24oZSl7ZVtlLkluY3JlYXNlPTBdPSJJbmNyZWFzZSIsZVtlLkRlY3JlYXNlPTFdPSJEZWNyZWFzZSJ9KShOMXx8KE4xPXt9KSk7dmFyIEwxOyhmdW5jdGlvbihlKXtjb25zdCB0PW5ldyBNYXA7dC5zZXQoMCxHLnN5bWJvbE1ldGhvZCksdC5zZXQoMSxHLnN5bWJvbEZ1bmN0aW9uKSx0LnNldCgyLEcuc3ltYm9sQ29uc3RydWN0b3IpLHQuc2V0KDMsRy5zeW1ib2xGaWVsZCksdC5zZXQoNCxHLnN5bWJvbFZhcmlhYmxlKSx0LnNldCg1LEcuc3ltYm9sQ2xhc3MpLHQuc2V0KDYsRy5zeW1ib2xTdHJ1Y3QpLHQuc2V0KDcsRy5zeW1ib2xJbnRlcmZhY2UpLHQuc2V0KDgsRy5zeW1ib2xNb2R1bGUpLHQuc2V0KDksRy5zeW1ib2xQcm9wZXJ0eSksdC5zZXQoMTAsRy5zeW1ib2xFdmVudCksdC5zZXQoMTEsRy5zeW1ib2xPcGVyYXRvciksdC5zZXQoMTIsRy5zeW1ib2xVbml0KSx0LnNldCgxMyxHLnN5bWJvbFZhbHVlKSx0LnNldCgxNSxHLnN5bWJvbEVudW0pLHQuc2V0KDE0LEcuc3ltYm9sQ29uc3RhbnQpLHQuc2V0KDE1LEcuc3ltYm9sRW51bSksdC5zZXQoMTYsRy5zeW1ib2xFbnVtTWVtYmVyKSx0LnNldCgxNyxHLnN5bWJvbEtleXdvcmQpLHQuc2V0KDI3LEcuc3ltYm9sU25pcHBldCksdC5zZXQoMTgsRy5zeW1ib2xUZXh0KSx0LnNldCgxOSxHLnN5bWJvbENvbG9yKSx0LnNldCgyMCxHLnN5bWJvbEZpbGUpLHQuc2V0KDIxLEcuc3ltYm9sUmVmZXJlbmNlKSx0LnNldCgyMixHLnN5bWJvbEN1c3RvbUNvbG9yKSx0LnNldCgyMyxHLnN5bWJvbEZvbGRlciksdC5zZXQoMjQsRy5zeW1ib2xUeXBlUGFyYW1ldGVyKSx0LnNldCgyNSxHLmFjY291bnQpLHQuc2V0KDI2LEcuaXNzdWVzKTtmdW5jdGlvbiBuKGkpe2xldCBvPXQuZ2V0KGkpO3JldHVybiBvfHwoY29uc29sZS5pbmZvKCJObyBjb2RpY29uIGZvdW5kIGZvciBDb21wbGV0aW9uSXRlbUtpbmQgIitpKSxvPUcuc3ltYm9sUHJvcGVydHkpLG99ZS50b0ljb249bjtjb25zdCByPW5ldyBNYXA7ci5zZXQoIm1ldGhvZCIsMCksci5zZXQoImZ1bmN0aW9uIiwxKSxyLnNldCgiY29uc3RydWN0b3IiLDIpLHIuc2V0KCJmaWVsZCIsMyksci5zZXQoInZhcmlhYmxlIiw0KSxyLnNldCgiY2xhc3MiLDUpLHIuc2V0KCJzdHJ1Y3QiLDYpLHIuc2V0KCJpbnRlcmZhY2UiLDcpLHIuc2V0KCJtb2R1bGUiLDgpLHIuc2V0KCJwcm9wZXJ0eSIsOSksci5zZXQoImV2ZW50IiwxMCksci5zZXQoIm9wZXJhdG9yIiwxMSksci5zZXQoInVuaXQiLDEyKSxyLnNldCgidmFsdWUiLDEzKSxyLnNldCgiY29uc3RhbnQiLDE0KSxyLnNldCgiZW51bSIsMTUpLHIuc2V0KCJlbnVtLW1lbWJlciIsMTYpLHIuc2V0KCJlbnVtTWVtYmVyIiwxNiksci5zZXQoImtleXdvcmQiLDE3KSxyLnNldCgic25pcHBldCIsMjcpLHIuc2V0KCJ0ZXh0IiwxOCksci5zZXQoImNvbG9yIiwxOSksci5zZXQoImZpbGUiLDIwKSxyLnNldCgicmVmZXJlbmNlIiwyMSksci5zZXQoImN1c3RvbWNvbG9yIiwyMiksci5zZXQoImZvbGRlciIsMjMpLHIuc2V0KCJ0eXBlLXBhcmFtZXRlciIsMjQpLHIuc2V0KCJ0eXBlUGFyYW1ldGVyIiwyNCksci5zZXQoImFjY291bnQiLDI1KSxyLnNldCgiaXNzdWUiLDI2KTtmdW5jdGlvbiBzKGksbyl7bGV0IGE9ci5nZXQoaSk7cmV0dXJuIHR5cGVvZiBhPiJ1IiYmIW8mJihhPTkpLGF9ZS5mcm9tU3RyaW5nPXN9KShMMXx8KEwxPXt9KSk7dmFyICQxOyhmdW5jdGlvbihlKXtlW2UuQXV0b21hdGljPTBdPSJBdXRvbWF0aWMiLGVbZS5FeHBsaWNpdD0xXT0iRXhwbGljaXQifSkoJDF8fCgkMT17fSkpO3ZhciBCMTsoZnVuY3Rpb24oZSl7ZVtlLkF1dG9tYXRpYz0wXT0iQXV0b21hdGljIixlW2UuUGFzdGVBcz0xXT0iUGFzdGVBcyJ9KShCMXx8KEIxPXt9KSk7dmFyIF8xOyhmdW5jdGlvbihlKXtlW2UuSW52b2tlPTFdPSJJbnZva2UiLGVbZS5UcmlnZ2VyQ2hhcmFjdGVyPTJdPSJUcmlnZ2VyQ2hhcmFjdGVyIixlW2UuQ29udGVudENoYW5nZT0zXT0iQ29udGVudENoYW5nZSJ9KShfMXx8KF8xPXt9KSk7dmFyIEkxOyhmdW5jdGlvbihlKXtlW2UuVGV4dD0wXT0iVGV4dCIsZVtlLlJlYWQ9MV09IlJlYWQiLGVbZS5Xcml0ZT0yXT0iV3JpdGUifSkoSTF8fChJMT17fSkpLGtlKCJBcnJheSIsImFycmF5Iiksa2UoIkJvb2xlYW4iLCJib29sZWFuIiksa2UoIkNsYXNzIiwiY2xhc3MiKSxrZSgiQ29uc3RhbnQiLCJjb25zdGFudCIpLGtlKCJDb25zdHJ1Y3RvciIsImNvbnN0cnVjdG9yIiksa2UoIkVudW0iLCJlbnVtZXJhdGlvbiIpLGtlKCJFbnVtTWVtYmVyIiwiZW51bWVyYXRpb24gbWVtYmVyIiksa2UoIkV2ZW50IiwiZXZlbnQiKSxrZSgiRmllbGQiLCJmaWVsZCIpLGtlKCJGaWxlIiwiZmlsZSIpLGtlKCJGdW5jdGlvbiIsImZ1bmN0aW9uIiksa2UoIkludGVyZmFjZSIsImludGVyZmFjZSIpLGtlKCJLZXkiLCJrZXkiKSxrZSgiTWV0aG9kIiwibWV0aG9kIiksa2UoIk1vZHVsZSIsIm1vZHVsZSIpLGtlKCJOYW1lc3BhY2UiLCJuYW1lc3BhY2UiKSxrZSgiTnVsbCIsIm51bGwiKSxrZSgiTnVtYmVyIiwibnVtYmVyIiksa2UoIk9iamVjdCIsIm9iamVjdCIpLGtlKCJPcGVyYXRvciIsIm9wZXJhdG9yIiksa2UoIlBhY2thZ2UiLCJwYWNrYWdlIiksa2UoIlByb3BlcnR5IiwicHJvcGVydHkiKSxrZSgiU3RyaW5nIiwic3RyaW5nIiksa2UoIlN0cnVjdCIsInN0cnVjdCIpLGtlKCJUeXBlUGFyYW1ldGVyIiwidHlwZSBwYXJhbWV0ZXIiKSxrZSgiVmFyaWFibGUiLCJ2YXJpYWJsZSIpO3ZhciBQMTsoZnVuY3Rpb24oZSl7Y29uc3QgdD1uZXcgTWFwO3Quc2V0KDAsRy5zeW1ib2xGaWxlKSx0LnNldCgxLEcuc3ltYm9sTW9kdWxlKSx0LnNldCgyLEcuc3ltYm9sTmFtZXNwYWNlKSx0LnNldCgzLEcuc3ltYm9sUGFja2FnZSksdC5zZXQoNCxHLnN5bWJvbENsYXNzKSx0LnNldCg1LEcuc3ltYm9sTWV0aG9kKSx0LnNldCg2LEcuc3ltYm9sUHJvcGVydHkpLHQuc2V0KDcsRy5zeW1ib2xGaWVsZCksdC5zZXQoOCxHLnN5bWJvbENvbnN0cnVjdG9yKSx0LnNldCg5LEcuc3ltYm9sRW51bSksdC5zZXQoMTAsRy5zeW1ib2xJbnRlcmZhY2UpLHQuc2V0KDExLEcuc3ltYm9sRnVuY3Rpb24pLHQuc2V0KDEyLEcuc3ltYm9sVmFyaWFibGUpLHQuc2V0KDEzLEcuc3ltYm9sQ29uc3RhbnQpLHQuc2V0KDE0LEcuc3ltYm9sU3RyaW5nKSx0LnNldCgxNSxHLnN5bWJvbE51bWJlciksdC5zZXQoMTYsRy5zeW1ib2xCb29sZWFuKSx0LnNldCgxNyxHLnN5bWJvbEFycmF5KSx0LnNldCgxOCxHLnN5bWJvbE9iamVjdCksdC5zZXQoMTksRy5zeW1ib2xLZXkpLHQuc2V0KDIwLEcuc3ltYm9sTnVsbCksdC5zZXQoMjEsRy5zeW1ib2xFbnVtTWVtYmVyKSx0LnNldCgyMixHLnN5bWJvbFN0cnVjdCksdC5zZXQoMjMsRy5zeW1ib2xFdmVudCksdC5zZXQoMjQsRy5zeW1ib2xPcGVyYXRvciksdC5zZXQoMjUsRy5zeW1ib2xUeXBlUGFyYW1ldGVyKTtmdW5jdGlvbiBuKHIpe2xldCBzPXQuZ2V0KHIpO3JldHVybiBzfHwoY29uc29sZS5pbmZvKCJObyBjb2RpY29uIGZvdW5kIGZvciBTeW1ib2xLaW5kICIrcikscz1HLnN5bWJvbFByb3BlcnR5KSxzfWUudG9JY29uPW59KShQMXx8KFAxPXt9KSk7bGV0IElqPSgkdD1jbGFzc3tzdGF0aWMgZnJvbVZhbHVlKHQpe3N3aXRjaCh0KXtjYXNlImNvbW1lbnQiOnJldHVybiAkdC5Db21tZW50O2Nhc2UiaW1wb3J0cyI6cmV0dXJuICR0LkltcG9ydHM7Y2FzZSJyZWdpb24iOnJldHVybiAkdC5SZWdpb259cmV0dXJuIG5ldyAkdCh0KX1jb25zdHJ1Y3Rvcih0KXt0aGlzLnZhbHVlPXR9fSwkdC5Db21tZW50PW5ldyAkdCgiY29tbWVudCIpLCR0LkltcG9ydHM9bmV3ICR0KCJpbXBvcnRzIiksJHQuUmVnaW9uPW5ldyAkdCgicmVnaW9uIiksJHQpO3ZhciBNMTsoZnVuY3Rpb24oZSl7ZVtlLkFJR2VuZXJhdGVkPTFdPSJBSUdlbmVyYXRlZCJ9KShNMXx8KE0xPXt9KSk7dmFyIE8xOyhmdW5jdGlvbihlKXtlW2UuSW52b2tlPTBdPSJJbnZva2UiLGVbZS5BdXRvbWF0aWM9MV09IkF1dG9tYXRpYyJ9KShPMXx8KE8xPXt9KSk7dmFyIFIxOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3JldHVybiFufHx0eXBlb2YgbiE9Im9iamVjdCI/ITE6dHlwZW9mIG4uaWQ9PSJzdHJpbmciJiZ0eXBlb2Ygbi50aXRsZT09InN0cmluZyJ9ZS5pcz10fSkoUjF8fChSMT17fSkpO3ZhciBqMTsoZnVuY3Rpb24oZSl7ZVtlLlR5cGU9MV09IlR5cGUiLGVbZS5QYXJhbWV0ZXI9Ml09IlBhcmFtZXRlciJ9KShqMXx8KGoxPXt9KSksbmV3IFQxLG5ldyBUMTt2YXIgVjE7KGZ1bmN0aW9uKGUpe2VbZS5JbnZva2U9MF09Ikludm9rZSIsZVtlLkF1dG9tYXRpYz0xXT0iQXV0b21hdGljIn0pKFYxfHwoVjE9e30pKTt2YXIgVTE7KGZ1bmN0aW9uKGUpe2VbZS5Vbmtub3duPTBdPSJVbmtub3duIixlW2UuRGlzYWJsZWQ9MV09IkRpc2FibGVkIixlW2UuRW5hYmxlZD0yXT0iRW5hYmxlZCJ9KShVMXx8KFUxPXt9KSk7dmFyIHExOyhmdW5jdGlvbihlKXtlW2UuSW52b2tlPTFdPSJJbnZva2UiLGVbZS5BdXRvPTJdPSJBdXRvIn0pKHExfHwocTE9e30pKTt2YXIgVzE7KGZ1bmN0aW9uKGUpe2VbZS5Ob25lPTBdPSJOb25lIixlW2UuS2VlcFdoaXRlc3BhY2U9MV09IktlZXBXaGl0ZXNwYWNlIixlW2UuSW5zZXJ0QXNTbmlwcGV0PTRdPSJJbnNlcnRBc1NuaXBwZXQifSkoVzF8fChXMT17fSkpO3ZhciBIMTsoZnVuY3Rpb24oZSl7ZVtlLk1ldGhvZD0wXT0iTWV0aG9kIixlW2UuRnVuY3Rpb249MV09IkZ1bmN0aW9uIixlW2UuQ29uc3RydWN0b3I9Ml09IkNvbnN0cnVjdG9yIixlW2UuRmllbGQ9M109IkZpZWxkIixlW2UuVmFyaWFibGU9NF09IlZhcmlhYmxlIixlW2UuQ2xhc3M9NV09IkNsYXNzIixlW2UuU3RydWN0PTZdPSJTdHJ1Y3QiLGVbZS5JbnRlcmZhY2U9N109IkludGVyZmFjZSIsZVtlLk1vZHVsZT04XT0iTW9kdWxlIixlW2UuUHJvcGVydHk9OV09IlByb3BlcnR5IixlW2UuRXZlbnQ9MTBdPSJFdmVudCIsZVtlLk9wZXJhdG9yPTExXT0iT3BlcmF0b3IiLGVbZS5Vbml0PTEyXT0iVW5pdCIsZVtlLlZhbHVlPTEzXT0iVmFsdWUiLGVbZS5Db25zdGFudD0xNF09IkNvbnN0YW50IixlW2UuRW51bT0xNV09IkVudW0iLGVbZS5FbnVtTWVtYmVyPTE2XT0iRW51bU1lbWJlciIsZVtlLktleXdvcmQ9MTddPSJLZXl3b3JkIixlW2UuVGV4dD0xOF09IlRleHQiLGVbZS5Db2xvcj0xOV09IkNvbG9yIixlW2UuRmlsZT0yMF09IkZpbGUiLGVbZS5SZWZlcmVuY2U9MjFdPSJSZWZlcmVuY2UiLGVbZS5DdXN0b21jb2xvcj0yMl09IkN1c3RvbWNvbG9yIixlW2UuRm9sZGVyPTIzXT0iRm9sZGVyIixlW2UuVHlwZVBhcmFtZXRlcj0yNF09IlR5cGVQYXJhbWV0ZXIiLGVbZS5Vc2VyPTI1XT0iVXNlciIsZVtlLklzc3VlPTI2XT0iSXNzdWUiLGVbZS5TbmlwcGV0PTI3XT0iU25pcHBldCJ9KShIMXx8KEgxPXt9KSk7dmFyIEoxOyhmdW5jdGlvbihlKXtlW2UuRGVwcmVjYXRlZD0xXT0iRGVwcmVjYXRlZCJ9KShKMXx8KEoxPXt9KSk7dmFyIHoxOyhmdW5jdGlvbihlKXtlW2UuSW52b2tlPTBdPSJJbnZva2UiLGVbZS5UcmlnZ2VyQ2hhcmFjdGVyPTFdPSJUcmlnZ2VyQ2hhcmFjdGVyIixlW2UuVHJpZ2dlckZvckluY29tcGxldGVDb21wbGV0aW9ucz0yXT0iVHJpZ2dlckZvckluY29tcGxldGVDb21wbGV0aW9ucyJ9KSh6MXx8KHoxPXt9KSk7dmFyIEcxOyhmdW5jdGlvbihlKXtlW2UuRVhBQ1Q9MF09IkVYQUNUIixlW2UuQUJPVkU9MV09IkFCT1ZFIixlW2UuQkVMT1c9Ml09IkJFTE9XIn0pKEcxfHwoRzE9e30pKTt2YXIgSzE7KGZ1bmN0aW9uKGUpe2VbZS5Ob3RTZXQ9MF09Ik5vdFNldCIsZVtlLkNvbnRlbnRGbHVzaD0xXT0iQ29udGVudEZsdXNoIixlW2UuUmVjb3ZlckZyb21NYXJrZXJzPTJdPSJSZWNvdmVyRnJvbU1hcmtlcnMiLGVbZS5FeHBsaWNpdD0zXT0iRXhwbGljaXQiLGVbZS5QYXN0ZT00XT0iUGFzdGUiLGVbZS5VbmRvPTVdPSJVbmRvIixlW2UuUmVkbz02XT0iUmVkbyJ9KShLMXx8KEsxPXt9KSk7dmFyIFgxOyhmdW5jdGlvbihlKXtlW2UuTEY9MV09IkxGIixlW2UuQ1JMRj0yXT0iQ1JMRiJ9KShYMXx8KFgxPXt9KSk7dmFyIFkxOyhmdW5jdGlvbihlKXtlW2UuVGV4dD0wXT0iVGV4dCIsZVtlLlJlYWQ9MV09IlJlYWQiLGVbZS5Xcml0ZT0yXT0iV3JpdGUifSkoWTF8fChZMT17fSkpO3ZhciBRMTsoZnVuY3Rpb24oZSl7ZVtlLk5vbmU9MF09Ik5vbmUiLGVbZS5LZWVwPTFdPSJLZWVwIixlW2UuQnJhY2tldHM9Ml09IkJyYWNrZXRzIixlW2UuQWR2YW5jZWQ9M109IkFkdmFuY2VkIixlW2UuRnVsbD00XT0iRnVsbCJ9KShRMXx8KFExPXt9KSk7dmFyIFoxOyhmdW5jdGlvbihlKXtlW2UuYWNjZXB0U3VnZ2VzdGlvbk9uQ29tbWl0Q2hhcmFjdGVyPTBdPSJhY2NlcHRTdWdnZXN0aW9uT25Db21taXRDaGFyYWN0ZXIiLGVbZS5hY2NlcHRTdWdnZXN0aW9uT25FbnRlcj0xXT0iYWNjZXB0U3VnZ2VzdGlvbk9uRW50ZXIiLGVbZS5hY2Nlc3NpYmlsaXR5U3VwcG9ydD0yXT0iYWNjZXNzaWJpbGl0eVN1cHBvcnQiLGVbZS5hY2Nlc3NpYmlsaXR5UGFnZVNpemU9M109ImFjY2Vzc2liaWxpdHlQYWdlU2l6ZSIsZVtlLmFyaWFMYWJlbD00XT0iYXJpYUxhYmVsIixlW2UuYXJpYVJlcXVpcmVkPTVdPSJhcmlhUmVxdWlyZWQiLGVbZS5hdXRvQ2xvc2luZ0JyYWNrZXRzPTZdPSJhdXRvQ2xvc2luZ0JyYWNrZXRzIixlW2UuYXV0b0Nsb3NpbmdDb21tZW50cz03XT0iYXV0b0Nsb3NpbmdDb21tZW50cyIsZVtlLnNjcmVlblJlYWRlckFubm91bmNlSW5saW5lU3VnZ2VzdGlvbj04XT0ic2NyZWVuUmVhZGVyQW5ub3VuY2VJbmxpbmVTdWdnZXN0aW9uIixlW2UuYXV0b0Nsb3NpbmdEZWxldGU9OV09ImF1dG9DbG9zaW5nRGVsZXRlIixlW2UuYXV0b0Nsb3NpbmdPdmVydHlwZT0xMF09ImF1dG9DbG9zaW5nT3ZlcnR5cGUiLGVbZS5hdXRvQ2xvc2luZ1F1b3Rlcz0xMV09ImF1dG9DbG9zaW5nUXVvdGVzIixlW2UuYXV0b0luZGVudD0xMl09ImF1dG9JbmRlbnQiLGVbZS5hdXRvbWF0aWNMYXlvdXQ9MTNdPSJhdXRvbWF0aWNMYXlvdXQiLGVbZS5hdXRvU3Vycm91bmQ9MTRdPSJhdXRvU3Vycm91bmQiLGVbZS5icmFja2V0UGFpckNvbG9yaXphdGlvbj0xNV09ImJyYWNrZXRQYWlyQ29sb3JpemF0aW9uIixlW2UuZ3VpZGVzPTE2XT0iZ3VpZGVzIixlW2UuY29kZUxlbnM9MTddPSJjb2RlTGVucyIsZVtlLmNvZGVMZW5zRm9udEZhbWlseT0xOF09ImNvZGVMZW5zRm9udEZhbWlseSIsZVtlLmNvZGVMZW5zRm9udFNpemU9MTldPSJjb2RlTGVuc0ZvbnRTaXplIixlW2UuY29sb3JEZWNvcmF0b3JzPTIwXT0iY29sb3JEZWNvcmF0b3JzIixlW2UuY29sb3JEZWNvcmF0b3JzTGltaXQ9MjFdPSJjb2xvckRlY29yYXRvcnNMaW1pdCIsZVtlLmNvbHVtblNlbGVjdGlvbj0yMl09ImNvbHVtblNlbGVjdGlvbiIsZVtlLmNvbW1lbnRzPTIzXT0iY29tbWVudHMiLGVbZS5jb250ZXh0bWVudT0yNF09ImNvbnRleHRtZW51IixlW2UuY29weVdpdGhTeW50YXhIaWdobGlnaHRpbmc9MjVdPSJjb3B5V2l0aFN5bnRheEhpZ2hsaWdodGluZyIsZVtlLmN1cnNvckJsaW5raW5nPTI2XT0iY3Vyc29yQmxpbmtpbmciLGVbZS5jdXJzb3JTbW9vdGhDYXJldEFuaW1hdGlvbj0yN109ImN1cnNvclNtb290aENhcmV0QW5pbWF0aW9uIixlW2UuY3Vyc29yU3R5bGU9MjhdPSJjdXJzb3JTdHlsZSIsZVtlLmN1cnNvclN1cnJvdW5kaW5nTGluZXM9MjldPSJjdXJzb3JTdXJyb3VuZGluZ0xpbmVzIixlW2UuY3Vyc29yU3Vycm91bmRpbmdMaW5lc1N0eWxlPTMwXT0iY3Vyc29yU3Vycm91bmRpbmdMaW5lc1N0eWxlIixlW2UuY3Vyc29yV2lkdGg9MzFdPSJjdXJzb3JXaWR0aCIsZVtlLmRpc2FibGVMYXllckhpbnRpbmc9MzJdPSJkaXNhYmxlTGF5ZXJIaW50aW5nIixlW2UuZGlzYWJsZU1vbm9zcGFjZU9wdGltaXphdGlvbnM9MzNdPSJkaXNhYmxlTW9ub3NwYWNlT3B0aW1pemF0aW9ucyIsZVtlLmRvbVJlYWRPbmx5PTM0XT0iZG9tUmVhZE9ubHkiLGVbZS5kcmFnQW5kRHJvcD0zNV09ImRyYWdBbmREcm9wIixlW2UuZHJvcEludG9FZGl0b3I9MzZdPSJkcm9wSW50b0VkaXRvciIsZVtlLmVtcHR5U2VsZWN0aW9uQ2xpcGJvYXJkPTM3XT0iZW1wdHlTZWxlY3Rpb25DbGlwYm9hcmQiLGVbZS5leHBlcmltZW50YWxXaGl0ZXNwYWNlUmVuZGVyaW5nPTM4XT0iZXhwZXJpbWVudGFsV2hpdGVzcGFjZVJlbmRlcmluZyIsZVtlLmV4dHJhRWRpdG9yQ2xhc3NOYW1lPTM5XT0iZXh0cmFFZGl0b3JDbGFzc05hbWUiLGVbZS5mYXN0U2Nyb2xsU2Vuc2l0aXZpdHk9NDBdPSJmYXN0U2Nyb2xsU2Vuc2l0aXZpdHkiLGVbZS5maW5kPTQxXT0iZmluZCIsZVtlLmZpeGVkT3ZlcmZsb3dXaWRnZXRzPTQyXT0iZml4ZWRPdmVyZmxvd1dpZGdldHMiLGVbZS5mb2xkaW5nPTQzXT0iZm9sZGluZyIsZVtlLmZvbGRpbmdTdHJhdGVneT00NF09ImZvbGRpbmdTdHJhdGVneSIsZVtlLmZvbGRpbmdIaWdobGlnaHQ9NDVdPSJmb2xkaW5nSGlnaGxpZ2h0IixlW2UuZm9sZGluZ0ltcG9ydHNCeURlZmF1bHQ9NDZdPSJmb2xkaW5nSW1wb3J0c0J5RGVmYXVsdCIsZVtlLmZvbGRpbmdNYXhpbXVtUmVnaW9ucz00N109ImZvbGRpbmdNYXhpbXVtUmVnaW9ucyIsZVtlLnVuZm9sZE9uQ2xpY2tBZnRlckVuZE9mTGluZT00OF09InVuZm9sZE9uQ2xpY2tBZnRlckVuZE9mTGluZSIsZVtlLmZvbnRGYW1pbHk9NDldPSJmb250RmFtaWx5IixlW2UuZm9udEluZm89NTBdPSJmb250SW5mbyIsZVtlLmZvbnRMaWdhdHVyZXM9NTFdPSJmb250TGlnYXR1cmVzIixlW2UuZm9udFNpemU9NTJdPSJmb250U2l6ZSIsZVtlLmZvbnRXZWlnaHQ9NTNdPSJmb250V2VpZ2h0IixlW2UuZm9udFZhcmlhdGlvbnM9NTRdPSJmb250VmFyaWF0aW9ucyIsZVtlLmZvcm1hdE9uUGFzdGU9NTVdPSJmb3JtYXRPblBhc3RlIixlW2UuZm9ybWF0T25UeXBlPTU2XT0iZm9ybWF0T25UeXBlIixlW2UuZ2x5cGhNYXJnaW49NTddPSJnbHlwaE1hcmdpbiIsZVtlLmdvdG9Mb2NhdGlvbj01OF09ImdvdG9Mb2NhdGlvbiIsZVtlLmhpZGVDdXJzb3JJbk92ZXJ2aWV3UnVsZXI9NTldPSJoaWRlQ3Vyc29ySW5PdmVydmlld1J1bGVyIixlW2UuaG92ZXI9NjBdPSJob3ZlciIsZVtlLmluRGlmZkVkaXRvcj02MV09ImluRGlmZkVkaXRvciIsZVtlLmlubGluZVN1Z2dlc3Q9NjJdPSJpbmxpbmVTdWdnZXN0IixlW2UuaW5saW5lRWRpdD02M109ImlubGluZUVkaXQiLGVbZS5sZXR0ZXJTcGFjaW5nPTY0XT0ibGV0dGVyU3BhY2luZyIsZVtlLmxpZ2h0YnVsYj02NV09ImxpZ2h0YnVsYiIsZVtlLmxpbmVEZWNvcmF0aW9uc1dpZHRoPTY2XT0ibGluZURlY29yYXRpb25zV2lkdGgiLGVbZS5saW5lSGVpZ2h0PTY3XT0ibGluZUhlaWdodCIsZVtlLmxpbmVOdW1iZXJzPTY4XT0ibGluZU51bWJlcnMiLGVbZS5saW5lTnVtYmVyc01pbkNoYXJzPTY5XT0ibGluZU51bWJlcnNNaW5DaGFycyIsZVtlLmxpbmtlZEVkaXRpbmc9NzBdPSJsaW5rZWRFZGl0aW5nIixlW2UubGlua3M9NzFdPSJsaW5rcyIsZVtlLm1hdGNoQnJhY2tldHM9NzJdPSJtYXRjaEJyYWNrZXRzIixlW2UubWluaW1hcD03M109Im1pbmltYXAiLGVbZS5tb3VzZVN0eWxlPTc0XT0ibW91c2VTdHlsZSIsZVtlLm1vdXNlV2hlZWxTY3JvbGxTZW5zaXRpdml0eT03NV09Im1vdXNlV2hlZWxTY3JvbGxTZW5zaXRpdml0eSIsZVtlLm1vdXNlV2hlZWxab29tPTc2XT0ibW91c2VXaGVlbFpvb20iLGVbZS5tdWx0aUN1cnNvck1lcmdlT3ZlcmxhcHBpbmc9NzddPSJtdWx0aUN1cnNvck1lcmdlT3ZlcmxhcHBpbmciLGVbZS5tdWx0aUN1cnNvck1vZGlmaWVyPTc4XT0ibXVsdGlDdXJzb3JNb2RpZmllciIsZVtlLm11bHRpQ3Vyc29yUGFzdGU9NzldPSJtdWx0aUN1cnNvclBhc3RlIixlW2UubXVsdGlDdXJzb3JMaW1pdD04MF09Im11bHRpQ3Vyc29yTGltaXQiLGVbZS5vY2N1cnJlbmNlc0hpZ2hsaWdodD04MV09Im9jY3VycmVuY2VzSGlnaGxpZ2h0IixlW2Uub3ZlcnZpZXdSdWxlckJvcmRlcj04Ml09Im92ZXJ2aWV3UnVsZXJCb3JkZXIiLGVbZS5vdmVydmlld1J1bGVyTGFuZXM9ODNdPSJvdmVydmlld1J1bGVyTGFuZXMiLGVbZS5wYWRkaW5nPTg0XT0icGFkZGluZyIsZVtlLnBhc3RlQXM9ODVdPSJwYXN0ZUFzIixlW2UucGFyYW1ldGVySGludHM9ODZdPSJwYXJhbWV0ZXJIaW50cyIsZVtlLnBlZWtXaWRnZXREZWZhdWx0Rm9jdXM9ODddPSJwZWVrV2lkZ2V0RGVmYXVsdEZvY3VzIixlW2UucGxhY2Vob2xkZXI9ODhdPSJwbGFjZWhvbGRlciIsZVtlLmRlZmluaXRpb25MaW5rT3BlbnNJblBlZWs9ODldPSJkZWZpbml0aW9uTGlua09wZW5zSW5QZWVrIixlW2UucXVpY2tTdWdnZXN0aW9ucz05MF09InF1aWNrU3VnZ2VzdGlvbnMiLGVbZS5xdWlja1N1Z2dlc3Rpb25zRGVsYXk9OTFdPSJxdWlja1N1Z2dlc3Rpb25zRGVsYXkiLGVbZS5yZWFkT25seT05Ml09InJlYWRPbmx5IixlW2UucmVhZE9ubHlNZXNzYWdlPTkzXT0icmVhZE9ubHlNZXNzYWdlIixlW2UucmVuYW1lT25UeXBlPTk0XT0icmVuYW1lT25UeXBlIixlW2UucmVuZGVyQ29udHJvbENoYXJhY3RlcnM9OTVdPSJyZW5kZXJDb250cm9sQ2hhcmFjdGVycyIsZVtlLnJlbmRlckZpbmFsTmV3bGluZT05Nl09InJlbmRlckZpbmFsTmV3bGluZSIsZVtlLnJlbmRlckxpbmVIaWdobGlnaHQ9OTddPSJyZW5kZXJMaW5lSGlnaGxpZ2h0IixlW2UucmVuZGVyTGluZUhpZ2hsaWdodE9ubHlXaGVuRm9jdXM9OThdPSJyZW5kZXJMaW5lSGlnaGxpZ2h0T25seVdoZW5Gb2N1cyIsZVtlLnJlbmRlclZhbGlkYXRpb25EZWNvcmF0aW9ucz05OV09InJlbmRlclZhbGlkYXRpb25EZWNvcmF0aW9ucyIsZVtlLnJlbmRlcldoaXRlc3BhY2U9MTAwXT0icmVuZGVyV2hpdGVzcGFjZSIsZVtlLnJldmVhbEhvcml6b250YWxSaWdodFBhZGRpbmc9MTAxXT0icmV2ZWFsSG9yaXpvbnRhbFJpZ2h0UGFkZGluZyIsZVtlLnJvdW5kZWRTZWxlY3Rpb249MTAyXT0icm91bmRlZFNlbGVjdGlvbiIsZVtlLnJ1bGVycz0xMDNdPSJydWxlcnMiLGVbZS5zY3JvbGxiYXI9MTA0XT0ic2Nyb2xsYmFyIixlW2Uuc2Nyb2xsQmV5b25kTGFzdENvbHVtbj0xMDVdPSJzY3JvbGxCZXlvbmRMYXN0Q29sdW1uIixlW2Uuc2Nyb2xsQmV5b25kTGFzdExpbmU9MTA2XT0ic2Nyb2xsQmV5b25kTGFzdExpbmUiLGVbZS5zY3JvbGxQcmVkb21pbmFudEF4aXM9MTA3XT0ic2Nyb2xsUHJlZG9taW5hbnRBeGlzIixlW2Uuc2VsZWN0aW9uQ2xpcGJvYXJkPTEwOF09InNlbGVjdGlvbkNsaXBib2FyZCIsZVtlLnNlbGVjdGlvbkhpZ2hsaWdodD0xMDldPSJzZWxlY3Rpb25IaWdobGlnaHQiLGVbZS5zZWxlY3RPbkxpbmVOdW1iZXJzPTExMF09InNlbGVjdE9uTGluZU51bWJlcnMiLGVbZS5zaG93Rm9sZGluZ0NvbnRyb2xzPTExMV09InNob3dGb2xkaW5nQ29udHJvbHMiLGVbZS5zaG93VW51c2VkPTExMl09InNob3dVbnVzZWQiLGVbZS5zbmlwcGV0U3VnZ2VzdGlvbnM9MTEzXT0ic25pcHBldFN1Z2dlc3Rpb25zIixlW2Uuc21hcnRTZWxlY3Q9MTE0XT0ic21hcnRTZWxlY3QiLGVbZS5zbW9vdGhTY3JvbGxpbmc9MTE1XT0ic21vb3RoU2Nyb2xsaW5nIixlW2Uuc3RpY2t5U2Nyb2xsPTExNl09InN0aWNreVNjcm9sbCIsZVtlLnN0aWNreVRhYlN0b3BzPTExN109InN0aWNreVRhYlN0b3BzIixlW2Uuc3RvcFJlbmRlcmluZ0xpbmVBZnRlcj0xMThdPSJzdG9wUmVuZGVyaW5nTGluZUFmdGVyIixlW2Uuc3VnZ2VzdD0xMTldPSJzdWdnZXN0IixlW2Uuc3VnZ2VzdEZvbnRTaXplPTEyMF09InN1Z2dlc3RGb250U2l6ZSIsZVtlLnN1Z2dlc3RMaW5lSGVpZ2h0PTEyMV09InN1Z2dlc3RMaW5lSGVpZ2h0IixlW2Uuc3VnZ2VzdE9uVHJpZ2dlckNoYXJhY3RlcnM9MTIyXT0ic3VnZ2VzdE9uVHJpZ2dlckNoYXJhY3RlcnMiLGVbZS5zdWdnZXN0U2VsZWN0aW9uPTEyM109InN1Z2dlc3RTZWxlY3Rpb24iLGVbZS50YWJDb21wbGV0aW9uPTEyNF09InRhYkNvbXBsZXRpb24iLGVbZS50YWJJbmRleD0xMjVdPSJ0YWJJbmRleCIsZVtlLnVuaWNvZGVIaWdobGlnaHRpbmc9MTI2XT0idW5pY29kZUhpZ2hsaWdodGluZyIsZVtlLnVudXN1YWxMaW5lVGVybWluYXRvcnM9MTI3XT0idW51c3VhbExpbmVUZXJtaW5hdG9ycyIsZVtlLnVzZVNoYWRvd0RPTT0xMjhdPSJ1c2VTaGFkb3dET00iLGVbZS51c2VUYWJTdG9wcz0xMjldPSJ1c2VUYWJTdG9wcyIsZVtlLndvcmRCcmVhaz0xMzBdPSJ3b3JkQnJlYWsiLGVbZS53b3JkU2VnbWVudGVyTG9jYWxlcz0xMzFdPSJ3b3JkU2VnbWVudGVyTG9jYWxlcyIsZVtlLndvcmRTZXBhcmF0b3JzPTEzMl09IndvcmRTZXBhcmF0b3JzIixlW2Uud29yZFdyYXA9MTMzXT0id29yZFdyYXAiLGVbZS53b3JkV3JhcEJyZWFrQWZ0ZXJDaGFyYWN0ZXJzPTEzNF09IndvcmRXcmFwQnJlYWtBZnRlckNoYXJhY3RlcnMiLGVbZS53b3JkV3JhcEJyZWFrQmVmb3JlQ2hhcmFjdGVycz0xMzVdPSJ3b3JkV3JhcEJyZWFrQmVmb3JlQ2hhcmFjdGVycyIsZVtlLndvcmRXcmFwQ29sdW1uPTEzNl09IndvcmRXcmFwQ29sdW1uIixlW2Uud29yZFdyYXBPdmVycmlkZTE9MTM3XT0id29yZFdyYXBPdmVycmlkZTEiLGVbZS53b3JkV3JhcE92ZXJyaWRlMj0xMzhdPSJ3b3JkV3JhcE92ZXJyaWRlMiIsZVtlLndyYXBwaW5nSW5kZW50PTEzOV09IndyYXBwaW5nSW5kZW50IixlW2Uud3JhcHBpbmdTdHJhdGVneT0xNDBdPSJ3cmFwcGluZ1N0cmF0ZWd5IixlW2Uuc2hvd0RlcHJlY2F0ZWQ9MTQxXT0ic2hvd0RlcHJlY2F0ZWQiLGVbZS5pbmxheUhpbnRzPTE0Ml09ImlubGF5SGludHMiLGVbZS5lZGl0b3JDbGFzc05hbWU9MTQzXT0iZWRpdG9yQ2xhc3NOYW1lIixlW2UucGl4ZWxSYXRpbz0xNDRdPSJwaXhlbFJhdGlvIixlW2UudGFiRm9jdXNNb2RlPTE0NV09InRhYkZvY3VzTW9kZSIsZVtlLmxheW91dEluZm89MTQ2XT0ibGF5b3V0SW5mbyIsZVtlLndyYXBwaW5nSW5mbz0xNDddPSJ3cmFwcGluZ0luZm8iLGVbZS5kZWZhdWx0Q29sb3JEZWNvcmF0b3JzPTE0OF09ImRlZmF1bHRDb2xvckRlY29yYXRvcnMiLGVbZS5jb2xvckRlY29yYXRvcnNBY3RpdmF0ZWRPbj0xNDldPSJjb2xvckRlY29yYXRvcnNBY3RpdmF0ZWRPbiIsZVtlLmlubGluZUNvbXBsZXRpb25zQWNjZXNzaWJpbGl0eVZlcmJvc2U9MTUwXT0iaW5saW5lQ29tcGxldGlvbnNBY2Nlc3NpYmlsaXR5VmVyYm9zZSJ9KShaMXx8KFoxPXt9KSk7dmFyIGUwOyhmdW5jdGlvbihlKXtlW2UuVGV4dERlZmluZWQ9MF09IlRleHREZWZpbmVkIixlW2UuTEY9MV09IkxGIixlW2UuQ1JMRj0yXT0iQ1JMRiJ9KShlMHx8KGUwPXt9KSk7dmFyIHQwOyhmdW5jdGlvbihlKXtlW2UuTEY9MF09IkxGIixlW2UuQ1JMRj0xXT0iQ1JMRiJ9KSh0MHx8KHQwPXt9KSk7dmFyIG4wOyhmdW5jdGlvbihlKXtlW2UuTGVmdD0xXT0iTGVmdCIsZVtlLkNlbnRlcj0yXT0iQ2VudGVyIixlW2UuUmlnaHQ9M109IlJpZ2h0In0pKG4wfHwobjA9e30pKTt2YXIgcjA7KGZ1bmN0aW9uKGUpe2VbZS5JbmNyZWFzZT0wXT0iSW5jcmVhc2UiLGVbZS5EZWNyZWFzZT0xXT0iRGVjcmVhc2UifSkocjB8fChyMD17fSkpO3ZhciBzMDsoZnVuY3Rpb24oZSl7ZVtlLk5vbmU9MF09Ik5vbmUiLGVbZS5JbmRlbnQ9MV09IkluZGVudCIsZVtlLkluZGVudE91dGRlbnQ9Ml09IkluZGVudE91dGRlbnQiLGVbZS5PdXRkZW50PTNdPSJPdXRkZW50In0pKHMwfHwoczA9e30pKTt2YXIgaTA7KGZ1bmN0aW9uKGUpe2VbZS5Cb3RoPTBdPSJCb3RoIixlW2UuUmlnaHQ9MV09IlJpZ2h0IixlW2UuTGVmdD0yXT0iTGVmdCIsZVtlLk5vbmU9M109Ik5vbmUifSkoaTB8fChpMD17fSkpO3ZhciBvMDsoZnVuY3Rpb24oZSl7ZVtlLlR5cGU9MV09IlR5cGUiLGVbZS5QYXJhbWV0ZXI9Ml09IlBhcmFtZXRlciJ9KShvMHx8KG8wPXt9KSk7dmFyIGEwOyhmdW5jdGlvbihlKXtlW2UuQXV0b21hdGljPTBdPSJBdXRvbWF0aWMiLGVbZS5FeHBsaWNpdD0xXT0iRXhwbGljaXQifSkoYTB8fChhMD17fSkpO3ZhciB1MDsoZnVuY3Rpb24oZSl7ZVtlLkludm9rZT0wXT0iSW52b2tlIixlW2UuQXV0b21hdGljPTFdPSJBdXRvbWF0aWMifSkodTB8fCh1MD17fSkpO3ZhciBWZjsoZnVuY3Rpb24oZSl7ZVtlLkRlcGVuZHNPbktiTGF5b3V0PS0xXT0iRGVwZW5kc09uS2JMYXlvdXQiLGVbZS5Vbmtub3duPTBdPSJVbmtub3duIixlW2UuQmFja3NwYWNlPTFdPSJCYWNrc3BhY2UiLGVbZS5UYWI9Ml09IlRhYiIsZVtlLkVudGVyPTNdPSJFbnRlciIsZVtlLlNoaWZ0PTRdPSJTaGlmdCIsZVtlLkN0cmw9NV09IkN0cmwiLGVbZS5BbHQ9Nl09IkFsdCIsZVtlLlBhdXNlQnJlYWs9N109IlBhdXNlQnJlYWsiLGVbZS5DYXBzTG9jaz04XT0iQ2Fwc0xvY2siLGVbZS5Fc2NhcGU9OV09IkVzY2FwZSIsZVtlLlNwYWNlPTEwXT0iU3BhY2UiLGVbZS5QYWdlVXA9MTFdPSJQYWdlVXAiLGVbZS5QYWdlRG93bj0xMl09IlBhZ2VEb3duIixlW2UuRW5kPTEzXT0iRW5kIixlW2UuSG9tZT0xNF09IkhvbWUiLGVbZS5MZWZ0QXJyb3c9MTVdPSJMZWZ0QXJyb3ciLGVbZS5VcEFycm93PTE2XT0iVXBBcnJvdyIsZVtlLlJpZ2h0QXJyb3c9MTddPSJSaWdodEFycm93IixlW2UuRG93bkFycm93PTE4XT0iRG93bkFycm93IixlW2UuSW5zZXJ0PTE5XT0iSW5zZXJ0IixlW2UuRGVsZXRlPTIwXT0iRGVsZXRlIixlW2UuRGlnaXQwPTIxXT0iRGlnaXQwIixlW2UuRGlnaXQxPTIyXT0iRGlnaXQxIixlW2UuRGlnaXQyPTIzXT0iRGlnaXQyIixlW2UuRGlnaXQzPTI0XT0iRGlnaXQzIixlW2UuRGlnaXQ0PTI1XT0iRGlnaXQ0IixlW2UuRGlnaXQ1PTI2XT0iRGlnaXQ1IixlW2UuRGlnaXQ2PTI3XT0iRGlnaXQ2IixlW2UuRGlnaXQ3PTI4XT0iRGlnaXQ3IixlW2UuRGlnaXQ4PTI5XT0iRGlnaXQ4IixlW2UuRGlnaXQ5PTMwXT0iRGlnaXQ5IixlW2UuS2V5QT0zMV09IktleUEiLGVbZS5LZXlCPTMyXT0iS2V5QiIsZVtlLktleUM9MzNdPSJLZXlDIixlW2UuS2V5RD0zNF09IktleUQiLGVbZS5LZXlFPTM1XT0iS2V5RSIsZVtlLktleUY9MzZdPSJLZXlGIixlW2UuS2V5Rz0zN109IktleUciLGVbZS5LZXlIPTM4XT0iS2V5SCIsZVtlLktleUk9MzldPSJLZXlJIixlW2UuS2V5Sj00MF09IktleUoiLGVbZS5LZXlLPTQxXT0iS2V5SyIsZVtlLktleUw9NDJdPSJLZXlMIixlW2UuS2V5TT00M109IktleU0iLGVbZS5LZXlOPTQ0XT0iS2V5TiIsZVtlLktleU89NDVdPSJLZXlPIixlW2UuS2V5UD00Nl09IktleVAiLGVbZS5LZXlRPTQ3XT0iS2V5USIsZVtlLktleVI9NDhdPSJLZXlSIixlW2UuS2V5Uz00OV09IktleVMiLGVbZS5LZXlUPTUwXT0iS2V5VCIsZVtlLktleVU9NTFdPSJLZXlVIixlW2UuS2V5Vj01Ml09IktleVYiLGVbZS5LZXlXPTUzXT0iS2V5VyIsZVtlLktleVg9NTRdPSJLZXlYIixlW2UuS2V5WT01NV09IktleVkiLGVbZS5LZXlaPTU2XT0iS2V5WiIsZVtlLk1ldGE9NTddPSJNZXRhIixlW2UuQ29udGV4dE1lbnU9NThdPSJDb250ZXh0TWVudSIsZVtlLkYxPTU5XT0iRjEiLGVbZS5GMj02MF09IkYyIixlW2UuRjM9NjFdPSJGMyIsZVtlLkY0PTYyXT0iRjQiLGVbZS5GNT02M109IkY1IixlW2UuRjY9NjRdPSJGNiIsZVtlLkY3PTY1XT0iRjciLGVbZS5GOD02Nl09IkY4IixlW2UuRjk9NjddPSJGOSIsZVtlLkYxMD02OF09IkYxMCIsZVtlLkYxMT02OV09IkYxMSIsZVtlLkYxMj03MF09IkYxMiIsZVtlLkYxMz03MV09IkYxMyIsZVtlLkYxND03Ml09IkYxNCIsZVtlLkYxNT03M109IkYxNSIsZVtlLkYxNj03NF09IkYxNiIsZVtlLkYxNz03NV09IkYxNyIsZVtlLkYxOD03Nl09IkYxOCIsZVtlLkYxOT03N109IkYxOSIsZVtlLkYyMD03OF09IkYyMCIsZVtlLkYyMT03OV09IkYyMSIsZVtlLkYyMj04MF09IkYyMiIsZVtlLkYyMz04MV09IkYyMyIsZVtlLkYyND04Ml09IkYyNCIsZVtlLk51bUxvY2s9ODNdPSJOdW1Mb2NrIixlW2UuU2Nyb2xsTG9jaz04NF09IlNjcm9sbExvY2siLGVbZS5TZW1pY29sb249ODVdPSJTZW1pY29sb24iLGVbZS5FcXVhbD04Nl09IkVxdWFsIixlW2UuQ29tbWE9ODddPSJDb21tYSIsZVtlLk1pbnVzPTg4XT0iTWludXMiLGVbZS5QZXJpb2Q9ODldPSJQZXJpb2QiLGVbZS5TbGFzaD05MF09IlNsYXNoIixlW2UuQmFja3F1b3RlPTkxXT0iQmFja3F1b3RlIixlW2UuQnJhY2tldExlZnQ9OTJdPSJCcmFja2V0TGVmdCIsZVtlLkJhY2tzbGFzaD05M109IkJhY2tzbGFzaCIsZVtlLkJyYWNrZXRSaWdodD05NF09IkJyYWNrZXRSaWdodCIsZVtlLlF1b3RlPTk1XT0iUXVvdGUiLGVbZS5PRU1fOD05Nl09Ik9FTV84IixlW2UuSW50bEJhY2tzbGFzaD05N109IkludGxCYWNrc2xhc2giLGVbZS5OdW1wYWQwPTk4XT0iTnVtcGFkMCIsZVtlLk51bXBhZDE9OTldPSJOdW1wYWQxIixlW2UuTnVtcGFkMj0xMDBdPSJOdW1wYWQyIixlW2UuTnVtcGFkMz0xMDFdPSJOdW1wYWQzIixlW2UuTnVtcGFkND0xMDJdPSJOdW1wYWQ0IixlW2UuTnVtcGFkNT0xMDNdPSJOdW1wYWQ1IixlW2UuTnVtcGFkNj0xMDRdPSJOdW1wYWQ2IixlW2UuTnVtcGFkNz0xMDVdPSJOdW1wYWQ3IixlW2UuTnVtcGFkOD0xMDZdPSJOdW1wYWQ4IixlW2UuTnVtcGFkOT0xMDddPSJOdW1wYWQ5IixlW2UuTnVtcGFkTXVsdGlwbHk9MTA4XT0iTnVtcGFkTXVsdGlwbHkiLGVbZS5OdW1wYWRBZGQ9MTA5XT0iTnVtcGFkQWRkIixlW2UuTlVNUEFEX1NFUEFSQVRPUj0xMTBdPSJOVU1QQURfU0VQQVJBVE9SIixlW2UuTnVtcGFkU3VidHJhY3Q9MTExXT0iTnVtcGFkU3VidHJhY3QiLGVbZS5OdW1wYWREZWNpbWFsPTExMl09Ik51bXBhZERlY2ltYWwiLGVbZS5OdW1wYWREaXZpZGU9MTEzXT0iTnVtcGFkRGl2aWRlIixlW2UuS0VZX0lOX0NPTVBPU0lUSU9OPTExNF09IktFWV9JTl9DT01QT1NJVElPTiIsZVtlLkFCTlRfQzE9MTE1XT0iQUJOVF9DMSIsZVtlLkFCTlRfQzI9MTE2XT0iQUJOVF9DMiIsZVtlLkF1ZGlvVm9sdW1lTXV0ZT0xMTddPSJBdWRpb1ZvbHVtZU11dGUiLGVbZS5BdWRpb1ZvbHVtZVVwPTExOF09IkF1ZGlvVm9sdW1lVXAiLGVbZS5BdWRpb1ZvbHVtZURvd249MTE5XT0iQXVkaW9Wb2x1bWVEb3duIixlW2UuQnJvd3NlclNlYXJjaD0xMjBdPSJCcm93c2VyU2VhcmNoIixlW2UuQnJvd3NlckhvbWU9MTIxXT0iQnJvd3NlckhvbWUiLGVbZS5Ccm93c2VyQmFjaz0xMjJdPSJCcm93c2VyQmFjayIsZVtlLkJyb3dzZXJGb3J3YXJkPTEyM109IkJyb3dzZXJGb3J3YXJkIixlW2UuTWVkaWFUcmFja05leHQ9MTI0XT0iTWVkaWFUcmFja05leHQiLGVbZS5NZWRpYVRyYWNrUHJldmlvdXM9MTI1XT0iTWVkaWFUcmFja1ByZXZpb3VzIixlW2UuTWVkaWFTdG9wPTEyNl09Ik1lZGlhU3RvcCIsZVtlLk1lZGlhUGxheVBhdXNlPTEyN109Ik1lZGlhUGxheVBhdXNlIixlW2UuTGF1bmNoTWVkaWFQbGF5ZXI9MTI4XT0iTGF1bmNoTWVkaWFQbGF5ZXIiLGVbZS5MYXVuY2hNYWlsPTEyOV09IkxhdW5jaE1haWwiLGVbZS5MYXVuY2hBcHAyPTEzMF09IkxhdW5jaEFwcDIiLGVbZS5DbGVhcj0xMzFdPSJDbGVhciIsZVtlLk1BWF9WQUxVRT0xMzJdPSJNQVhfVkFMVUUifSkoVmZ8fChWZj17fSkpO3ZhciBVZjsoZnVuY3Rpb24oZSl7ZVtlLkhpbnQ9MV09IkhpbnQiLGVbZS5JbmZvPTJdPSJJbmZvIixlW2UuV2FybmluZz00XT0iV2FybmluZyIsZVtlLkVycm9yPThdPSJFcnJvciJ9KShVZnx8KFVmPXt9KSk7dmFyIHFmOyhmdW5jdGlvbihlKXtlW2UuVW5uZWNlc3Nhcnk9MV09IlVubmVjZXNzYXJ5IixlW2UuRGVwcmVjYXRlZD0yXT0iRGVwcmVjYXRlZCJ9KShxZnx8KHFmPXt9KSk7dmFyIGwwOyhmdW5jdGlvbihlKXtlW2UuSW5saW5lPTFdPSJJbmxpbmUiLGVbZS5HdXR0ZXI9Ml09Ikd1dHRlciJ9KShsMHx8KGwwPXt9KSk7dmFyIGMwOyhmdW5jdGlvbihlKXtlW2UuTm9ybWFsPTFdPSJOb3JtYWwiLGVbZS5VbmRlcmxpbmVkPTJdPSJVbmRlcmxpbmVkIn0pKGMwfHwoYzA9e30pKTt2YXIgZjA7KGZ1bmN0aW9uKGUpe2VbZS5VTktOT1dOPTBdPSJVTktOT1dOIixlW2UuVEVYVEFSRUE9MV09IlRFWFRBUkVBIixlW2UuR1VUVEVSX0dMWVBIX01BUkdJTj0yXT0iR1VUVEVSX0dMWVBIX01BUkdJTiIsZVtlLkdVVFRFUl9MSU5FX05VTUJFUlM9M109IkdVVFRFUl9MSU5FX05VTUJFUlMiLGVbZS5HVVRURVJfTElORV9ERUNPUkFUSU9OUz00XT0iR1VUVEVSX0xJTkVfREVDT1JBVElPTlMiLGVbZS5HVVRURVJfVklFV19aT05FPTVdPSJHVVRURVJfVklFV19aT05FIixlW2UuQ09OVEVOVF9URVhUPTZdPSJDT05URU5UX1RFWFQiLGVbZS5DT05URU5UX0VNUFRZPTddPSJDT05URU5UX0VNUFRZIixlW2UuQ09OVEVOVF9WSUVXX1pPTkU9OF09IkNPTlRFTlRfVklFV19aT05FIixlW2UuQ09OVEVOVF9XSURHRVQ9OV09IkNPTlRFTlRfV0lER0VUIixlW2UuT1ZFUlZJRVdfUlVMRVI9MTBdPSJPVkVSVklFV19SVUxFUiIsZVtlLlNDUk9MTEJBUj0xMV09IlNDUk9MTEJBUiIsZVtlLk9WRVJMQVlfV0lER0VUPTEyXT0iT1ZFUkxBWV9XSURHRVQiLGVbZS5PVVRTSURFX0VESVRPUj0xM109Ik9VVFNJREVfRURJVE9SIn0pKGYwfHwoZjA9e30pKTt2YXIgcDA7KGZ1bmN0aW9uKGUpe2VbZS5BSUdlbmVyYXRlZD0xXT0iQUlHZW5lcmF0ZWQifSkocDB8fChwMD17fSkpO3ZhciBoMDsoZnVuY3Rpb24oZSl7ZVtlLkludm9rZT0wXT0iSW52b2tlIixlW2UuQXV0b21hdGljPTFdPSJBdXRvbWF0aWMifSkoaDB8fChoMD17fSkpO3ZhciBkMDsoZnVuY3Rpb24oZSl7ZVtlLlRPUF9SSUdIVF9DT1JORVI9MF09IlRPUF9SSUdIVF9DT1JORVIiLGVbZS5CT1RUT01fUklHSFRfQ09STkVSPTFdPSJCT1RUT01fUklHSFRfQ09STkVSIixlW2UuVE9QX0NFTlRFUj0yXT0iVE9QX0NFTlRFUiJ9KShkMHx8KGQwPXt9KSk7dmFyIG0wOyhmdW5jdGlvbihlKXtlW2UuTGVmdD0xXT0iTGVmdCIsZVtlLkNlbnRlcj0yXT0iQ2VudGVyIixlW2UuUmlnaHQ9NF09IlJpZ2h0IixlW2UuRnVsbD03XT0iRnVsbCJ9KShtMHx8KG0wPXt9KSk7dmFyIGcwOyhmdW5jdGlvbihlKXtlW2UuV29yZD0wXT0iV29yZCIsZVtlLkxpbmU9MV09IkxpbmUiLGVbZS5TdWdnZXN0PTJdPSJTdWdnZXN0In0pKGcwfHwoZzA9e30pKTt2YXIgeTA7KGZ1bmN0aW9uKGUpe2VbZS5MZWZ0PTBdPSJMZWZ0IixlW2UuUmlnaHQ9MV09IlJpZ2h0IixlW2UuTm9uZT0yXT0iTm9uZSIsZVtlLkxlZnRPZkluamVjdGVkVGV4dD0zXT0iTGVmdE9mSW5qZWN0ZWRUZXh0IixlW2UuUmlnaHRPZkluamVjdGVkVGV4dD00XT0iUmlnaHRPZkluamVjdGVkVGV4dCJ9KSh5MHx8KHkwPXt9KSk7dmFyIEQwOyhmdW5jdGlvbihlKXtlW2UuT2ZmPTBdPSJPZmYiLGVbZS5Pbj0xXT0iT24iLGVbZS5SZWxhdGl2ZT0yXT0iUmVsYXRpdmUiLGVbZS5JbnRlcnZhbD0zXT0iSW50ZXJ2YWwiLGVbZS5DdXN0b209NF09IkN1c3RvbSJ9KShEMHx8KEQwPXt9KSk7dmFyIGIwOyhmdW5jdGlvbihlKXtlW2UuTm9uZT0wXT0iTm9uZSIsZVtlLlRleHQ9MV09IlRleHQiLGVbZS5CbG9ja3M9Ml09IkJsb2NrcyJ9KShiMHx8KGIwPXt9KSk7dmFyIEUwOyhmdW5jdGlvbihlKXtlW2UuU21vb3RoPTBdPSJTbW9vdGgiLGVbZS5JbW1lZGlhdGU9MV09IkltbWVkaWF0ZSJ9KShFMHx8KEUwPXt9KSk7dmFyIHYwOyhmdW5jdGlvbihlKXtlW2UuQXV0bz0xXT0iQXV0byIsZVtlLkhpZGRlbj0yXT0iSGlkZGVuIixlW2UuVmlzaWJsZT0zXT0iVmlzaWJsZSJ9KSh2MHx8KHYwPXt9KSk7dmFyIFdmOyhmdW5jdGlvbihlKXtlW2UuTFRSPTBdPSJMVFIiLGVbZS5SVEw9MV09IlJUTCJ9KShXZnx8KFdmPXt9KSk7dmFyIEYwOyhmdW5jdGlvbihlKXtlLk9mZj0ib2ZmIixlLk9uQ29kZT0ib25Db2RlIixlLk9uPSJvbiJ9KShGMHx8KEYwPXt9KSk7dmFyIEEwOyhmdW5jdGlvbihlKXtlW2UuSW52b2tlPTFdPSJJbnZva2UiLGVbZS5UcmlnZ2VyQ2hhcmFjdGVyPTJdPSJUcmlnZ2VyQ2hhcmFjdGVyIixlW2UuQ29udGVudENoYW5nZT0zXT0iQ29udGVudENoYW5nZSJ9KShBMHx8KEEwPXt9KSk7dmFyIHcwOyhmdW5jdGlvbihlKXtlW2UuRmlsZT0wXT0iRmlsZSIsZVtlLk1vZHVsZT0xXT0iTW9kdWxlIixlW2UuTmFtZXNwYWNlPTJdPSJOYW1lc3BhY2UiLGVbZS5QYWNrYWdlPTNdPSJQYWNrYWdlIixlW2UuQ2xhc3M9NF09IkNsYXNzIixlW2UuTWV0aG9kPTVdPSJNZXRob2QiLGVbZS5Qcm9wZXJ0eT02XT0iUHJvcGVydHkiLGVbZS5GaWVsZD03XT0iRmllbGQiLGVbZS5Db25zdHJ1Y3Rvcj04XT0iQ29uc3RydWN0b3IiLGVbZS5FbnVtPTldPSJFbnVtIixlW2UuSW50ZXJmYWNlPTEwXT0iSW50ZXJmYWNlIixlW2UuRnVuY3Rpb249MTFdPSJGdW5jdGlvbiIsZVtlLlZhcmlhYmxlPTEyXT0iVmFyaWFibGUiLGVbZS5Db25zdGFudD0xM109IkNvbnN0YW50IixlW2UuU3RyaW5nPTE0XT0iU3RyaW5nIixlW2UuTnVtYmVyPTE1XT0iTnVtYmVyIixlW2UuQm9vbGVhbj0xNl09IkJvb2xlYW4iLGVbZS5BcnJheT0xN109IkFycmF5IixlW2UuT2JqZWN0PTE4XT0iT2JqZWN0IixlW2UuS2V5PTE5XT0iS2V5IixlW2UuTnVsbD0yMF09Ik51bGwiLGVbZS5FbnVtTWVtYmVyPTIxXT0iRW51bU1lbWJlciIsZVtlLlN0cnVjdD0yMl09IlN0cnVjdCIsZVtlLkV2ZW50PTIzXT0iRXZlbnQiLGVbZS5PcGVyYXRvcj0yNF09Ik9wZXJhdG9yIixlW2UuVHlwZVBhcmFtZXRlcj0yNV09IlR5cGVQYXJhbWV0ZXIifSkodzB8fCh3MD17fSkpO3ZhciBDMDsoZnVuY3Rpb24oZSl7ZVtlLkRlcHJlY2F0ZWQ9MV09IkRlcHJlY2F0ZWQifSkoQzB8fChDMD17fSkpO3ZhciBTMDsoZnVuY3Rpb24oZSl7ZVtlLkhpZGRlbj0wXT0iSGlkZGVuIixlW2UuQmxpbms9MV09IkJsaW5rIixlW2UuU21vb3RoPTJdPSJTbW9vdGgiLGVbZS5QaGFzZT0zXT0iUGhhc2UiLGVbZS5FeHBhbmQ9NF09IkV4cGFuZCIsZVtlLlNvbGlkPTVdPSJTb2xpZCJ9KShTMHx8KFMwPXt9KSk7dmFyIHgwOyhmdW5jdGlvbihlKXtlW2UuTGluZT0xXT0iTGluZSIsZVtlLkJsb2NrPTJdPSJCbG9jayIsZVtlLlVuZGVybGluZT0zXT0iVW5kZXJsaW5lIixlW2UuTGluZVRoaW49NF09IkxpbmVUaGluIixlW2UuQmxvY2tPdXRsaW5lPTVdPSJCbG9ja091dGxpbmUiLGVbZS5VbmRlcmxpbmVUaGluPTZdPSJVbmRlcmxpbmVUaGluIn0pKHgwfHwoeDA9e30pKTt2YXIgazA7KGZ1bmN0aW9uKGUpe2VbZS5BbHdheXNHcm93c1doZW5UeXBpbmdBdEVkZ2VzPTBdPSJBbHdheXNHcm93c1doZW5UeXBpbmdBdEVkZ2VzIixlW2UuTmV2ZXJHcm93c1doZW5UeXBpbmdBdEVkZ2VzPTFdPSJOZXZlckdyb3dzV2hlblR5cGluZ0F0RWRnZXMiLGVbZS5Hcm93c09ubHlXaGVuVHlwaW5nQmVmb3JlPTJdPSJHcm93c09ubHlXaGVuVHlwaW5nQmVmb3JlIixlW2UuR3Jvd3NPbmx5V2hlblR5cGluZ0FmdGVyPTNdPSJHcm93c09ubHlXaGVuVHlwaW5nQWZ0ZXIifSkoazB8fChrMD17fSkpO3ZhciBUMDsoZnVuY3Rpb24oZSl7ZVtlLk5vbmU9MF09Ik5vbmUiLGVbZS5TYW1lPTFdPSJTYW1lIixlW2UuSW5kZW50PTJdPSJJbmRlbnQiLGVbZS5EZWVwSW5kZW50PTNdPSJEZWVwSW5kZW50In0pKFQwfHwoVDA9e30pKTtjb25zdCBKbz1jbGFzcyBKb3tzdGF0aWMgY2hvcmQodCxuKXtyZXR1cm4gVjgodCxuKX19O0pvLkN0cmxDbWQ9MjA0OCxKby5TaGlmdD0xMDI0LEpvLkFsdD01MTIsSm8uV2luQ3RybD0yNTY7bGV0IEhmPUpvO2Z1bmN0aW9uIHo4KCl7cmV0dXJue2VkaXRvcjp2b2lkIDAsbGFuZ3VhZ2VzOnZvaWQgMCxDYW5jZWxsYXRpb25Ub2tlblNvdXJjZTpNOCxFbWl0dGVyOmxuLEtleUNvZGU6VmYsS2V5TW9kOkhmLFBvc2l0aW9uOkplLFJhbmdlOmhlLFNlbGVjdGlvbjpHdCxTZWxlY3Rpb25EaXJlY3Rpb246V2YsTWFya2VyU2V2ZXJpdHk6VWYsTWFya2VyVGFnOnFmLFVyaTpLbixUb2tlbjpKOH19Y29uc3QgYnU9Y2xhc3MgYnV7c3RhdGljIGdldENoYW5uZWwodCl7cmV0dXJuIHQuZ2V0Q2hhbm5lbChidS5DSEFOTkVMX05BTUUpfXN0YXRpYyBzZXRDaGFubmVsKHQsbil7dC5zZXRDaGFubmVsKGJ1LkNIQU5ORUxfTkFNRSxuKX19O2J1LkNIQU5ORUxfTkFNRT0iZWRpdG9yV29ya2VySG9zdCI7bGV0IEpmPWJ1O3ZhciBOMDtjbGFzcyBHOHtjb25zdHJ1Y3Rvcigpe3RoaXNbTjBdPSJMaW5rZWRNYXAiLHRoaXMuX21hcD1uZXcgTWFwLHRoaXMuX2hlYWQ9dm9pZCAwLHRoaXMuX3RhaWw9dm9pZCAwLHRoaXMuX3NpemU9MCx0aGlzLl9zdGF0ZT0wfWNsZWFyKCl7dGhpcy5fbWFwLmNsZWFyKCksdGhpcy5faGVhZD12b2lkIDAsdGhpcy5fdGFpbD12b2lkIDAsdGhpcy5fc2l6ZT0wLHRoaXMuX3N0YXRlKyt9aXNFbXB0eSgpe3JldHVybiF0aGlzLl9oZWFkJiYhdGhpcy5fdGFpbH1nZXQgc2l6ZSgpe3JldHVybiB0aGlzLl9zaXplfWdldCBmaXJzdCgpe3ZhciB0O3JldHVybih0PXRoaXMuX2hlYWQpPT1udWxsP3ZvaWQgMDp0LnZhbHVlfWdldCBsYXN0KCl7dmFyIHQ7cmV0dXJuKHQ9dGhpcy5fdGFpbCk9PW51bGw/dm9pZCAwOnQudmFsdWV9aGFzKHQpe3JldHVybiB0aGlzLl9tYXAuaGFzKHQpfWdldCh0LG49MCl7Y29uc3Qgcj10aGlzLl9tYXAuZ2V0KHQpO2lmKHIpcmV0dXJuIG4hPT0wJiZ0aGlzLnRvdWNoKHIsbiksci52YWx1ZX1zZXQodCxuLHI9MCl7bGV0IHM9dGhpcy5fbWFwLmdldCh0KTtpZihzKXMudmFsdWU9bixyIT09MCYmdGhpcy50b3VjaChzLHIpO2Vsc2V7c3dpdGNoKHM9e2tleTp0LHZhbHVlOm4sbmV4dDp2b2lkIDAscHJldmlvdXM6dm9pZCAwfSxyKXtjYXNlIDA6dGhpcy5hZGRJdGVtTGFzdChzKTticmVhaztjYXNlIDE6dGhpcy5hZGRJdGVtRmlyc3Qocyk7YnJlYWs7Y2FzZSAyOnRoaXMuYWRkSXRlbUxhc3Qocyk7YnJlYWs7ZGVmYXVsdDp0aGlzLmFkZEl0ZW1MYXN0KHMpO2JyZWFrfXRoaXMuX21hcC5zZXQodCxzKSx0aGlzLl9zaXplKyt9cmV0dXJuIHRoaXN9ZGVsZXRlKHQpe3JldHVybiEhdGhpcy5yZW1vdmUodCl9cmVtb3ZlKHQpe2NvbnN0IG49dGhpcy5fbWFwLmdldCh0KTtpZihuKXJldHVybiB0aGlzLl9tYXAuZGVsZXRlKHQpLHRoaXMucmVtb3ZlSXRlbShuKSx0aGlzLl9zaXplLS0sbi52YWx1ZX1zaGlmdCgpe2lmKCF0aGlzLl9oZWFkJiYhdGhpcy5fdGFpbClyZXR1cm47aWYoIXRoaXMuX2hlYWR8fCF0aGlzLl90YWlsKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7Y29uc3QgdD10aGlzLl9oZWFkO3JldHVybiB0aGlzLl9tYXAuZGVsZXRlKHQua2V5KSx0aGlzLnJlbW92ZUl0ZW0odCksdGhpcy5fc2l6ZS0tLHQudmFsdWV9Zm9yRWFjaCh0LG4pe2NvbnN0IHI9dGhpcy5fc3RhdGU7bGV0IHM9dGhpcy5faGVhZDtmb3IoO3M7KXtpZihuP3QuYmluZChuKShzLnZhbHVlLHMua2V5LHRoaXMpOnQocy52YWx1ZSxzLmtleSx0aGlzKSx0aGlzLl9zdGF0ZSE9PXIpdGhyb3cgbmV3IEVycm9yKCJMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uIik7cz1zLm5leHR9fWtleXMoKXtjb25zdCB0PXRoaXMsbj10aGlzLl9zdGF0ZTtsZXQgcj10aGlzLl9oZWFkO2NvbnN0IHM9e1tTeW1ib2wuaXRlcmF0b3JdKCl7cmV0dXJuIHN9LG5leHQoKXtpZih0Ll9zdGF0ZSE9PW4pdGhyb3cgbmV3IEVycm9yKCJMaW5rZWRNYXAgZ290IG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24uIik7aWYocil7Y29uc3QgaT17dmFsdWU6ci5rZXksZG9uZTohMX07cmV0dXJuIHI9ci5uZXh0LGl9ZWxzZSByZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fX07cmV0dXJuIHN9dmFsdWVzKCl7Y29uc3QgdD10aGlzLG49dGhpcy5fc3RhdGU7bGV0IHI9dGhpcy5faGVhZDtjb25zdCBzPXtbU3ltYm9sLml0ZXJhdG9yXSgpe3JldHVybiBzfSxuZXh0KCl7aWYodC5fc3RhdGUhPT1uKXRocm93IG5ldyBFcnJvcigiTGlua2VkTWFwIGdvdCBtb2RpZmllZCBkdXJpbmcgaXRlcmF0aW9uLiIpO2lmKHIpe2NvbnN0IGk9e3ZhbHVlOnIudmFsdWUsZG9uZTohMX07cmV0dXJuIHI9ci5uZXh0LGl9ZWxzZSByZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fX07cmV0dXJuIHN9ZW50cmllcygpe2NvbnN0IHQ9dGhpcyxuPXRoaXMuX3N0YXRlO2xldCByPXRoaXMuX2hlYWQ7Y29uc3Qgcz17W1N5bWJvbC5pdGVyYXRvcl0oKXtyZXR1cm4gc30sbmV4dCgpe2lmKHQuX3N0YXRlIT09bil0aHJvdyBuZXcgRXJyb3IoIkxpbmtlZE1hcCBnb3QgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi4iKTtpZihyKXtjb25zdCBpPXt2YWx1ZTpbci5rZXksci52YWx1ZV0sZG9uZTohMX07cmV0dXJuIHI9ci5uZXh0LGl9ZWxzZSByZXR1cm57dmFsdWU6dm9pZCAwLGRvbmU6ITB9fX07cmV0dXJuIHN9WyhOMD1TeW1ib2wudG9TdHJpbmdUYWcsU3ltYm9sLml0ZXJhdG9yKV0oKXtyZXR1cm4gdGhpcy5lbnRyaWVzKCl9dHJpbU9sZCh0KXtpZih0Pj10aGlzLnNpemUpcmV0dXJuO2lmKHQ9PT0wKXt0aGlzLmNsZWFyKCk7cmV0dXJufWxldCBuPXRoaXMuX2hlYWQscj10aGlzLnNpemU7Zm9yKDtuJiZyPnQ7KXRoaXMuX21hcC5kZWxldGUobi5rZXkpLG49bi5uZXh0LHItLTt0aGlzLl9oZWFkPW4sdGhpcy5fc2l6ZT1yLG4mJihuLnByZXZpb3VzPXZvaWQgMCksdGhpcy5fc3RhdGUrK310cmltTmV3KHQpe2lmKHQ+PXRoaXMuc2l6ZSlyZXR1cm47aWYodD09PTApe3RoaXMuY2xlYXIoKTtyZXR1cm59bGV0IG49dGhpcy5fdGFpbCxyPXRoaXMuc2l6ZTtmb3IoO24mJnI+dDspdGhpcy5fbWFwLmRlbGV0ZShuLmtleSksbj1uLnByZXZpb3VzLHItLTt0aGlzLl90YWlsPW4sdGhpcy5fc2l6ZT1yLG4mJihuLm5leHQ9dm9pZCAwKSx0aGlzLl9zdGF0ZSsrfWFkZEl0ZW1GaXJzdCh0KXtpZighdGhpcy5faGVhZCYmIXRoaXMuX3RhaWwpdGhpcy5fdGFpbD10O2Vsc2UgaWYodGhpcy5faGVhZCl0Lm5leHQ9dGhpcy5faGVhZCx0aGlzLl9oZWFkLnByZXZpb3VzPXQ7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbGlzdCIpO3RoaXMuX2hlYWQ9dCx0aGlzLl9zdGF0ZSsrfWFkZEl0ZW1MYXN0KHQpe2lmKCF0aGlzLl9oZWFkJiYhdGhpcy5fdGFpbCl0aGlzLl9oZWFkPXQ7ZWxzZSBpZih0aGlzLl90YWlsKXQucHJldmlvdXM9dGhpcy5fdGFpbCx0aGlzLl90YWlsLm5leHQ9dDtlbHNlIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7dGhpcy5fdGFpbD10LHRoaXMuX3N0YXRlKyt9cmVtb3ZlSXRlbSh0KXtpZih0PT09dGhpcy5faGVhZCYmdD09PXRoaXMuX3RhaWwpdGhpcy5faGVhZD12b2lkIDAsdGhpcy5fdGFpbD12b2lkIDA7ZWxzZSBpZih0PT09dGhpcy5faGVhZCl7aWYoIXQubmV4dCl0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgbGlzdCIpO3QubmV4dC5wcmV2aW91cz12b2lkIDAsdGhpcy5faGVhZD10Lm5leHR9ZWxzZSBpZih0PT09dGhpcy5fdGFpbCl7aWYoIXQucHJldmlvdXMpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTt0LnByZXZpb3VzLm5leHQ9dm9pZCAwLHRoaXMuX3RhaWw9dC5wcmV2aW91c31lbHNle2NvbnN0IG49dC5uZXh0LHI9dC5wcmV2aW91cztpZighbnx8IXIpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGxpc3QiKTtuLnByZXZpb3VzPXIsci5uZXh0PW59dC5uZXh0PXZvaWQgMCx0LnByZXZpb3VzPXZvaWQgMCx0aGlzLl9zdGF0ZSsrfXRvdWNoKHQsbil7aWYoIXRoaXMuX2hlYWR8fCF0aGlzLl90YWlsKXRocm93IG5ldyBFcnJvcigiSW52YWxpZCBsaXN0Iik7aWYoIShuIT09MSYmbiE9PTIpKXtpZihuPT09MSl7aWYodD09PXRoaXMuX2hlYWQpcmV0dXJuO2NvbnN0IHI9dC5uZXh0LHM9dC5wcmV2aW91czt0PT09dGhpcy5fdGFpbD8ocy5uZXh0PXZvaWQgMCx0aGlzLl90YWlsPXMpOihyLnByZXZpb3VzPXMscy5uZXh0PXIpLHQucHJldmlvdXM9dm9pZCAwLHQubmV4dD10aGlzLl9oZWFkLHRoaXMuX2hlYWQucHJldmlvdXM9dCx0aGlzLl9oZWFkPXQsdGhpcy5fc3RhdGUrK31lbHNlIGlmKG49PT0yKXtpZih0PT09dGhpcy5fdGFpbClyZXR1cm47Y29uc3Qgcj10Lm5leHQscz10LnByZXZpb3VzO3Q9PT10aGlzLl9oZWFkPyhyLnByZXZpb3VzPXZvaWQgMCx0aGlzLl9oZWFkPXIpOihyLnByZXZpb3VzPXMscy5uZXh0PXIpLHQubmV4dD12b2lkIDAsdC5wcmV2aW91cz10aGlzLl90YWlsLHRoaXMuX3RhaWwubmV4dD10LHRoaXMuX3RhaWw9dCx0aGlzLl9zdGF0ZSsrfX19dG9KU09OKCl7Y29uc3QgdD1bXTtyZXR1cm4gdGhpcy5mb3JFYWNoKChuLHIpPT57dC5wdXNoKFtyLG5dKX0pLHR9ZnJvbUpTT04odCl7dGhpcy5jbGVhcigpO2Zvcihjb25zdFtuLHJdb2YgdCl0aGlzLnNldChuLHIpfX1jbGFzcyBLOCBleHRlbmRzIEc4e2NvbnN0cnVjdG9yKHQsbj0xKXtzdXBlcigpLHRoaXMuX2xpbWl0PXQsdGhpcy5fcmF0aW89TWF0aC5taW4oTWF0aC5tYXgoMCxuKSwxKX1nZXQgbGltaXQoKXtyZXR1cm4gdGhpcy5fbGltaXR9c2V0IGxpbWl0KHQpe3RoaXMuX2xpbWl0PXQsdGhpcy5jaGVja1RyaW0oKX1nZXQodCxuPTIpe3JldHVybiBzdXBlci5nZXQodCxuKX1wZWVrKHQpe3JldHVybiBzdXBlci5nZXQodCwwKX1zZXQodCxuKXtyZXR1cm4gc3VwZXIuc2V0KHQsbiwyKSx0aGlzfWNoZWNrVHJpbSgpe3RoaXMuc2l6ZT50aGlzLl9saW1pdCYmdGhpcy50cmltKE1hdGgucm91bmQodGhpcy5fbGltaXQqdGhpcy5fcmF0aW8pKX19Y2xhc3MgWDggZXh0ZW5kcyBLOHtjb25zdHJ1Y3Rvcih0LG49MSl7c3VwZXIodCxuKX10cmltKHQpe3RoaXMudHJpbU9sZCh0KX1zZXQodCxuKXtyZXR1cm4gc3VwZXIuc2V0KHQsbiksdGhpcy5jaGVja1RyaW0oKSx0aGlzfX1jbGFzcyBZOHtjb25zdHJ1Y3Rvcigpe3RoaXMubWFwPW5ldyBNYXB9YWRkKHQsbil7bGV0IHI9dGhpcy5tYXAuZ2V0KHQpO3J8fChyPW5ldyBTZXQsdGhpcy5tYXAuc2V0KHQscikpLHIuYWRkKG4pfWRlbGV0ZSh0LG4pe2NvbnN0IHI9dGhpcy5tYXAuZ2V0KHQpO3ImJihyLmRlbGV0ZShuKSxyLnNpemU9PT0wJiZ0aGlzLm1hcC5kZWxldGUodCkpfWZvckVhY2godCxuKXtjb25zdCByPXRoaXMubWFwLmdldCh0KTtyJiZyLmZvckVhY2gobil9Z2V0KHQpe2NvbnN0IG49dGhpcy5tYXAuZ2V0KHQpO3JldHVybiBufHxuZXcgU2V0fX1uZXcgWDgoMTApO2Z1bmN0aW9uIFE4KGUpe2xldCB0PVtdO2Zvcig7T2JqZWN0LnByb3RvdHlwZSE9PWU7KXQ9dC5jb25jYXQoT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXMoZSkpLGU9T2JqZWN0LmdldFByb3RvdHlwZU9mKGUpO3JldHVybiB0fWZ1bmN0aW9uIEwwKGUpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IG4gb2YgUTgoZSkpdHlwZW9mIGVbbl09PSJmdW5jdGlvbiImJnQucHVzaChuKTtyZXR1cm4gdH1mdW5jdGlvbiBaOChlLHQpe2NvbnN0IG49cz0+ZnVuY3Rpb24oKXtjb25zdCBpPUFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm4gdChzLGkpfSxyPXt9O2Zvcihjb25zdCBzIG9mIGUpcltzXT1uKHMpO3JldHVybiByfXZhciAkMDsoZnVuY3Rpb24oZSl7ZVtlLkxlZnQ9MV09IkxlZnQiLGVbZS5DZW50ZXI9Ml09IkNlbnRlciIsZVtlLlJpZ2h0PTRdPSJSaWdodCIsZVtlLkZ1bGw9N109IkZ1bGwifSkoJDB8fCgkMD17fSkpO3ZhciBCMDsoZnVuY3Rpb24oZSl7ZVtlLkxlZnQ9MV09IkxlZnQiLGVbZS5DZW50ZXI9Ml09IkNlbnRlciIsZVtlLlJpZ2h0PTNdPSJSaWdodCJ9KShCMHx8KEIwPXt9KSk7dmFyIF8wOyhmdW5jdGlvbihlKXtlW2UuQm90aD0wXT0iQm90aCIsZVtlLlJpZ2h0PTFdPSJSaWdodCIsZVtlLkxlZnQ9Ml09IkxlZnQiLGVbZS5Ob25lPTNdPSJOb25lIn0pKF8wfHwoXzA9e30pKTtmdW5jdGlvbiBlUyhlLHQsbixyLHMpe2lmKHI9PT0wKXJldHVybiEwO2NvbnN0IGk9dC5jaGFyQ29kZUF0KHItMSk7aWYoZS5nZXQoaSkhPT0wfHxpPT09MTN8fGk9PT0xMClyZXR1cm4hMDtpZihzPjApe2NvbnN0IG89dC5jaGFyQ29kZUF0KHIpO2lmKGUuZ2V0KG8pIT09MClyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiB0UyhlLHQsbixyLHMpe2lmKHIrcz09PW4pcmV0dXJuITA7Y29uc3QgaT10LmNoYXJDb2RlQXQocitzKTtpZihlLmdldChpKSE9PTB8fGk9PT0xM3x8aT09PTEwKXJldHVybiEwO2lmKHM+MCl7Y29uc3Qgbz10LmNoYXJDb2RlQXQocitzLTEpO2lmKGUuZ2V0KG8pIT09MClyZXR1cm4hMH1yZXR1cm4hMX1mdW5jdGlvbiBuUyhlLHQsbixyLHMpe3JldHVybiBlUyhlLHQsbixyLHMpJiZ0UyhlLHQsbixyLHMpfWNsYXNzIHJTe2NvbnN0cnVjdG9yKHQsbil7dGhpcy5fd29yZFNlcGFyYXRvcnM9dCx0aGlzLl9zZWFyY2hSZWdleD1uLHRoaXMuX3ByZXZNYXRjaFN0YXJ0SW5kZXg9LTEsdGhpcy5fcHJldk1hdGNoTGVuZ3RoPTB9cmVzZXQodCl7dGhpcy5fc2VhcmNoUmVnZXgubGFzdEluZGV4PXQsdGhpcy5fcHJldk1hdGNoU3RhcnRJbmRleD0tMSx0aGlzLl9wcmV2TWF0Y2hMZW5ndGg9MH1uZXh0KHQpe2NvbnN0IG49dC5sZW5ndGg7bGV0IHI7ZG97aWYodGhpcy5fcHJldk1hdGNoU3RhcnRJbmRleCt0aGlzLl9wcmV2TWF0Y2hMZW5ndGg9PT1ufHwocj10aGlzLl9zZWFyY2hSZWdleC5leGVjKHQpLCFyKSlyZXR1cm4gbnVsbDtjb25zdCBzPXIuaW5kZXgsaT1yWzBdLmxlbmd0aDtpZihzPT09dGhpcy5fcHJldk1hdGNoU3RhcnRJbmRleCYmaT09PXRoaXMuX3ByZXZNYXRjaExlbmd0aCl7aWYoaT09PTApe1lDKHQsbix0aGlzLl9zZWFyY2hSZWdleC5sYXN0SW5kZXgpPjY1NTM1P3RoaXMuX3NlYXJjaFJlZ2V4Lmxhc3RJbmRleCs9Mjp0aGlzLl9zZWFyY2hSZWdleC5sYXN0SW5kZXgrPTE7Y29udGludWV9cmV0dXJuIG51bGx9aWYodGhpcy5fcHJldk1hdGNoU3RhcnRJbmRleD1zLHRoaXMuX3ByZXZNYXRjaExlbmd0aD1pLCF0aGlzLl93b3JkU2VwYXJhdG9yc3x8blModGhpcy5fd29yZFNlcGFyYXRvcnMsdCxuLHMsaSkpcmV0dXJuIHJ9d2hpbGUocik7cmV0dXJuIG51bGx9fWZ1bmN0aW9uIHNTKGUsdD0iVW5yZWFjaGFibGUiKXt0aHJvdyBuZXcgRXJyb3IodCl9ZnVuY3Rpb24ganUoZSl7aWYoIWUoKSl7ZGVidWdnZXI7ZSgpLE1lKG5ldyB6dCgiQXNzZXJ0aW9uIEZhaWxlZCIpKX19ZnVuY3Rpb24gSTAoZSx0KXtsZXQgbj0wO2Zvcig7bjxlLmxlbmd0aC0xOyl7Y29uc3Qgcj1lW25dLHM9ZVtuKzFdO2lmKCF0KHIscykpcmV0dXJuITE7bisrfXJldHVybiEwfWNvbnN0IGlTPSJgfiFAIyQlXiYqKCktPStbe119XFx8OzonXCIsLjw+Lz8iO2Z1bmN0aW9uIG9TKGU9IiIpe2xldCB0PSIoLT9cXGQqXFwuXFxkXFx3Kil8KFteIjtmb3IoY29uc3QgbiBvZiBpUyllLmluZGV4T2Yobik+PTB8fCh0Kz0iXFwiK24pO3JldHVybiB0Kz0iXFxzXSspIixuZXcgUmVnRXhwKHQsImciKX1jb25zdCBQMD1vUygpO2Z1bmN0aW9uIE0wKGUpe2xldCB0PVAwO2lmKGUmJmUgaW5zdGFuY2VvZiBSZWdFeHApaWYoZS5nbG9iYWwpdD1lO2Vsc2V7bGV0IG49ImciO2UuaWdub3JlQ2FzZSYmKG4rPSJpIiksZS5tdWx0aWxpbmUmJihuKz0ibSIpLGUudW5pY29kZSYmKG4rPSJ1IiksdD1uZXcgUmVnRXhwKGUuc291cmNlLG4pfXJldHVybiB0Lmxhc3RJbmRleD0wLHR9Y29uc3QgTzA9bmV3IENDO08wLnVuc2hpZnQoe21heExlbjoxZTMsd2luZG93U2l6ZToxNSx0aW1lQnVkZ2V0OjE1MH0pO2Z1bmN0aW9uIHpmKGUsdCxuLHIscyl7aWYodD1NMCh0KSxzfHwocz1rdS5maXJzdChPMCkpLG4ubGVuZ3RoPnMubWF4TGVuKXtsZXQgbD1lLXMubWF4TGVuLzI7cmV0dXJuIGw8MD9sPTA6cis9bCxuPW4uc3Vic3RyaW5nKGwsZStzLm1heExlbi8yKSx6ZihlLHQsbixyLHMpfWNvbnN0IGk9RGF0ZS5ub3coKSxvPWUtMS1yO2xldCBhPS0xLHU9bnVsbDtmb3IobGV0IGw9MTshKERhdGUubm93KCktaT49cy50aW1lQnVkZ2V0KTtsKyspe2NvbnN0IGY9by1zLndpbmRvd1NpemUqbDt0Lmxhc3RJbmRleD1NYXRoLm1heCgwLGYpO2NvbnN0IGM9YVModCxuLG8sYSk7aWYoIWMmJnV8fCh1PWMsZjw9MCkpYnJlYWs7YT1mfWlmKHUpe2NvbnN0IGw9e3dvcmQ6dVswXSxzdGFydENvbHVtbjpyKzErdS5pbmRleCxlbmRDb2x1bW46cisxK3UuaW5kZXgrdVswXS5sZW5ndGh9O3JldHVybiB0Lmxhc3RJbmRleD0wLGx9cmV0dXJuIG51bGx9ZnVuY3Rpb24gYVMoZSx0LG4scil7bGV0IHM7Zm9yKDtzPWUuZXhlYyh0KTspe2NvbnN0IGk9cy5pbmRleHx8MDtpZihpPD1uJiZlLmxhc3RJbmRleD49bilyZXR1cm4gcztpZihyPjAmJmk+cilyZXR1cm4gbnVsbH1yZXR1cm4gbnVsbH1jbGFzcyB1U3tzdGF0aWMgY29tcHV0ZVVuaWNvZGVIaWdobGlnaHRzKHQsbixyKXtjb25zdCBzPXI/ci5zdGFydExpbmVOdW1iZXI6MSxpPXI/ci5lbmRMaW5lTnVtYmVyOnQuZ2V0TGluZUNvdW50KCksbz1uZXcgUjAobiksYT1vLmdldENhbmRpZGF0ZUNvZGVQb2ludHMoKTtsZXQgdTthPT09ImFsbE5vbkJhc2ljQXNjaWkiP3U9bmV3IFJlZ0V4cCgiW15cXHRcXG5cXHJcXHgyMC1cXHg3RV0iLCJnIik6dT1uZXcgUmVnRXhwKGAke2xTKEFycmF5LmZyb20oYSkpfWAsImciKTtjb25zdCBsPW5ldyByUyhudWxsLHUpLGY9W107bGV0IGM9ITEscCxoPTAsZD0wLG09MDtlOmZvcihsZXQgZz1zLEQ9aTtnPD1EO2crKyl7Y29uc3QgYj10LmdldExpbmVDb250ZW50KGcpLEU9Yi5sZW5ndGg7bC5yZXNldCgwKTtkbyBpZihwPWwubmV4dChiKSxwKXtsZXQgRj1wLmluZGV4LHY9cC5pbmRleCtwWzBdLmxlbmd0aDtpZihGPjApe2NvbnN0IFQ9Yi5jaGFyQ29kZUF0KEYtMSk7a2YoVCkmJkYtLX1pZih2KzE8RSl7Y29uc3QgVD1iLmNoYXJDb2RlQXQodi0xKTtrZihUKSYmdisrfWNvbnN0IEM9Yi5zdWJzdHJpbmcoRix2KTtsZXQgQT16ZihGKzEsUDAsYiwwKTtBJiZBLmVuZENvbHVtbjw9RisxJiYoQT1udWxsKTtjb25zdCB3PW8uc2hvdWxkSGlnaGxpZ2h0Tm9uQmFzaWNBU0NJSShDLEE/QS53b3JkOm51bGwpO2lmKHchPT0wKXtpZih3PT09Mz9oKys6dz09PTI/ZCsrOnc9PT0xP20rKzpzUygpLGYubGVuZ3RoPj0xZTMpe2M9ITA7YnJlYWsgZX1mLnB1c2gobmV3IGhlKGcsRisxLGcsdisxKSl9fXdoaWxlKHApfXJldHVybntyYW5nZXM6ZixoYXNNb3JlOmMsYW1iaWd1b3VzQ2hhcmFjdGVyQ291bnQ6aCxpbnZpc2libGVDaGFyYWN0ZXJDb3VudDpkLG5vbkJhc2ljQXNjaWlDaGFyYWN0ZXJDb3VudDptfX1zdGF0aWMgY29tcHV0ZVVuaWNvZGVIaWdobGlnaHRSZWFzb24odCxuKXtjb25zdCByPW5ldyBSMChuKTtzd2l0Y2goci5zaG91bGRIaWdobGlnaHROb25CYXNpY0FTQ0lJKHQsbnVsbCkpe2Nhc2UgMDpyZXR1cm4gbnVsbDtjYXNlIDI6cmV0dXJue2tpbmQ6MX07Y2FzZSAzOntjb25zdCBpPXQuY29kZVBvaW50QXQoMCksbz1yLmFtYmlndW91c0NoYXJhY3RlcnMuZ2V0UHJpbWFyeUNvbmZ1c2FibGUoaSksYT1uYS5nZXRMb2NhbGVzKCkuZmlsdGVyKHU9PiFuYS5nZXRJbnN0YW5jZShuZXcgU2V0KFsuLi5uLmFsbG93ZWRMb2NhbGVzLHVdKSkuaXNBbWJpZ3VvdXMoaSkpO3JldHVybntraW5kOjAsY29uZnVzYWJsZVdpdGg6U3RyaW5nLmZyb21Db2RlUG9pbnQobyksbm90QW1iaWd1b3VzSW5Mb2NhbGVzOmF9fWNhc2UgMTpyZXR1cm57a2luZDoyfX19fWZ1bmN0aW9uIGxTKGUsdCl7cmV0dXJuYFske0hDKGUubWFwKHI9PlN0cmluZy5mcm9tQ29kZVBvaW50KHIpKS5qb2luKCIiKSl9XWB9Y2xhc3MgUjB7Y29uc3RydWN0b3IodCl7dGhpcy5vcHRpb25zPXQsdGhpcy5hbGxvd2VkQ29kZVBvaW50cz1uZXcgU2V0KHQuYWxsb3dlZENvZGVQb2ludHMpLHRoaXMuYW1iaWd1b3VzQ2hhcmFjdGVycz1uYS5nZXRJbnN0YW5jZShuZXcgU2V0KHQuYWxsb3dlZExvY2FsZXMpKX1nZXRDYW5kaWRhdGVDb2RlUG9pbnRzKCl7aWYodGhpcy5vcHRpb25zLm5vbkJhc2ljQVNDSUkpcmV0dXJuImFsbE5vbkJhc2ljQXNjaWkiO2NvbnN0IHQ9bmV3IFNldDtpZih0aGlzLm9wdGlvbnMuaW52aXNpYmxlQ2hhcmFjdGVycylmb3IoY29uc3QgbiBvZiByYS5jb2RlUG9pbnRzKWowKFN0cmluZy5mcm9tQ29kZVBvaW50KG4pKXx8dC5hZGQobik7aWYodGhpcy5vcHRpb25zLmFtYmlndW91c0NoYXJhY3RlcnMpZm9yKGNvbnN0IG4gb2YgdGhpcy5hbWJpZ3VvdXNDaGFyYWN0ZXJzLmdldENvbmZ1c2FibGVDb2RlUG9pbnRzKCkpdC5hZGQobik7Zm9yKGNvbnN0IG4gb2YgdGhpcy5hbGxvd2VkQ29kZVBvaW50cyl0LmRlbGV0ZShuKTtyZXR1cm4gdH1zaG91bGRIaWdobGlnaHROb25CYXNpY0FTQ0lJKHQsbil7Y29uc3Qgcj10LmNvZGVQb2ludEF0KDApO2lmKHRoaXMuYWxsb3dlZENvZGVQb2ludHMuaGFzKHIpKXJldHVybiAwO2lmKHRoaXMub3B0aW9ucy5ub25CYXNpY0FTQ0lJKXJldHVybiAxO2xldCBzPSExLGk9ITE7aWYobilmb3IoY29uc3QgbyBvZiBuKXtjb25zdCBhPW8uY29kZVBvaW50QXQoMCksdT1aQyhvKTtzPXN8fHUsIXUmJiF0aGlzLmFtYmlndW91c0NoYXJhY3RlcnMuaXNBbWJpZ3VvdXMoYSkmJiFyYS5pc0ludmlzaWJsZUNoYXJhY3RlcihhKSYmKGk9ITApfXJldHVybiFzJiZpPzA6dGhpcy5vcHRpb25zLmludmlzaWJsZUNoYXJhY3RlcnMmJiFqMCh0KSYmcmEuaXNJbnZpc2libGVDaGFyYWN0ZXIocik/Mjp0aGlzLm9wdGlvbnMuYW1iaWd1b3VzQ2hhcmFjdGVycyYmdGhpcy5hbWJpZ3VvdXNDaGFyYWN0ZXJzLmlzQW1iaWd1b3VzKHIpPzM6MH19ZnVuY3Rpb24gajAoZSl7cmV0dXJuIGU9PT0iICJ8fGU9PT1gCmB8fGU9PT0iCSJ9Y2xhc3MgVnV7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuY2hhbmdlcz10LHRoaXMubW92ZXM9bix0aGlzLmhpdFRpbWVvdXQ9cn19Y2xhc3MgY1N7Y29uc3RydWN0b3IodCxuKXt0aGlzLmxpbmVSYW5nZU1hcHBpbmc9dCx0aGlzLmNoYW5nZXM9bn19Y2xhc3MgbGV7c3RhdGljIGFkZFJhbmdlKHQsbil7bGV0IHI9MDtmb3IoO3I8bi5sZW5ndGgmJm5bcl0uZW5kRXhjbHVzaXZlPHQuc3RhcnQ7KXIrKztsZXQgcz1yO2Zvcig7czxuLmxlbmd0aCYmbltzXS5zdGFydDw9dC5lbmRFeGNsdXNpdmU7KXMrKztpZihyPT09cyluLnNwbGljZShyLDAsdCk7ZWxzZXtjb25zdCBpPU1hdGgubWluKHQuc3RhcnQsbltyXS5zdGFydCksbz1NYXRoLm1heCh0LmVuZEV4Y2x1c2l2ZSxuW3MtMV0uZW5kRXhjbHVzaXZlKTtuLnNwbGljZShyLHMtcixuZXcgbGUoaSxvKSl9fXN0YXRpYyB0cnlDcmVhdGUodCxuKXtpZighKHQ+bikpcmV0dXJuIG5ldyBsZSh0LG4pfXN0YXRpYyBvZkxlbmd0aCh0KXtyZXR1cm4gbmV3IGxlKDAsdCl9c3RhdGljIG9mU3RhcnRBbmRMZW5ndGgodCxuKXtyZXR1cm4gbmV3IGxlKHQsdCtuKX1jb25zdHJ1Y3Rvcih0LG4pe2lmKHRoaXMuc3RhcnQ9dCx0aGlzLmVuZEV4Y2x1c2l2ZT1uLHQ+bil0aHJvdyBuZXcgenQoYEludmFsaWQgcmFuZ2U6ICR7dGhpcy50b1N0cmluZygpfWApfWdldCBpc0VtcHR5KCl7cmV0dXJuIHRoaXMuc3RhcnQ9PT10aGlzLmVuZEV4Y2x1c2l2ZX1kZWx0YSh0KXtyZXR1cm4gbmV3IGxlKHRoaXMuc3RhcnQrdCx0aGlzLmVuZEV4Y2x1c2l2ZSt0KX1kZWx0YVN0YXJ0KHQpe3JldHVybiBuZXcgbGUodGhpcy5zdGFydCt0LHRoaXMuZW5kRXhjbHVzaXZlKX1kZWx0YUVuZCh0KXtyZXR1cm4gbmV3IGxlKHRoaXMuc3RhcnQsdGhpcy5lbmRFeGNsdXNpdmUrdCl9Z2V0IGxlbmd0aCgpe3JldHVybiB0aGlzLmVuZEV4Y2x1c2l2ZS10aGlzLnN0YXJ0fXRvU3RyaW5nKCl7cmV0dXJuYFske3RoaXMuc3RhcnR9LCAke3RoaXMuZW5kRXhjbHVzaXZlfSlgfWNvbnRhaW5zKHQpe3JldHVybiB0aGlzLnN0YXJ0PD10JiZ0PHRoaXMuZW5kRXhjbHVzaXZlfWpvaW4odCl7cmV0dXJuIG5ldyBsZShNYXRoLm1pbih0aGlzLnN0YXJ0LHQuc3RhcnQpLE1hdGgubWF4KHRoaXMuZW5kRXhjbHVzaXZlLHQuZW5kRXhjbHVzaXZlKSl9aW50ZXJzZWN0KHQpe2NvbnN0IG49TWF0aC5tYXgodGhpcy5zdGFydCx0LnN0YXJ0KSxyPU1hdGgubWluKHRoaXMuZW5kRXhjbHVzaXZlLHQuZW5kRXhjbHVzaXZlKTtpZihuPD1yKXJldHVybiBuZXcgbGUobixyKX1pbnRlcnNlY3RzKHQpe2NvbnN0IG49TWF0aC5tYXgodGhpcy5zdGFydCx0LnN0YXJ0KSxyPU1hdGgubWluKHRoaXMuZW5kRXhjbHVzaXZlLHQuZW5kRXhjbHVzaXZlKTtyZXR1cm4gbjxyfWlzQmVmb3JlKHQpe3JldHVybiB0aGlzLmVuZEV4Y2x1c2l2ZTw9dC5zdGFydH1pc0FmdGVyKHQpe3JldHVybiB0aGlzLnN0YXJ0Pj10LmVuZEV4Y2x1c2l2ZX1zbGljZSh0KXtyZXR1cm4gdC5zbGljZSh0aGlzLnN0YXJ0LHRoaXMuZW5kRXhjbHVzaXZlKX1zdWJzdHJpbmcodCl7cmV0dXJuIHQuc3Vic3RyaW5nKHRoaXMuc3RhcnQsdGhpcy5lbmRFeGNsdXNpdmUpfWNsaXAodCl7aWYodGhpcy5pc0VtcHR5KXRocm93IG5ldyB6dChgSW52YWxpZCBjbGlwcGluZyByYW5nZTogJHt0aGlzLnRvU3RyaW5nKCl9YCk7cmV0dXJuIE1hdGgubWF4KHRoaXMuc3RhcnQsTWF0aC5taW4odGhpcy5lbmRFeGNsdXNpdmUtMSx0KSl9Y2xpcEN5Y2xpYyh0KXtpZih0aGlzLmlzRW1wdHkpdGhyb3cgbmV3IHp0KGBJbnZhbGlkIGNsaXBwaW5nIHJhbmdlOiAke3RoaXMudG9TdHJpbmcoKX1gKTtyZXR1cm4gdDx0aGlzLnN0YXJ0P3RoaXMuZW5kRXhjbHVzaXZlLSh0aGlzLnN0YXJ0LXQpJXRoaXMubGVuZ3RoOnQ+PXRoaXMuZW5kRXhjbHVzaXZlP3RoaXMuc3RhcnQrKHQtdGhpcy5zdGFydCkldGhpcy5sZW5ndGg6dH1mb3JFYWNoKHQpe2ZvcihsZXQgbj10aGlzLnN0YXJ0O248dGhpcy5lbmRFeGNsdXNpdmU7bisrKXQobil9fWZ1bmN0aW9uIF9pKGUsdCl7Y29uc3Qgbj1pYShlLHQpO3JldHVybiBuPT09LTE/dm9pZCAwOmVbbl19ZnVuY3Rpb24gaWEoZSx0LG49MCxyPWUubGVuZ3RoKXtsZXQgcz1uLGk9cjtmb3IoO3M8aTspe2NvbnN0IG89TWF0aC5mbG9vcigocytpKS8yKTt0KGVbb10pP3M9bysxOmk9b31yZXR1cm4gcy0xfWZ1bmN0aW9uIGZTKGUsdCl7Y29uc3Qgbj1HZihlLHQpO3JldHVybiBuPT09ZS5sZW5ndGg/dm9pZCAwOmVbbl19ZnVuY3Rpb24gR2YoZSx0LG49MCxyPWUubGVuZ3RoKXtsZXQgcz1uLGk9cjtmb3IoO3M8aTspe2NvbnN0IG89TWF0aC5mbG9vcigocytpKS8yKTt0KGVbb10pP2k9bzpzPW8rMX1yZXR1cm4gc31jb25zdCBmZj1jbGFzcyBmZntjb25zdHJ1Y3Rvcih0KXt0aGlzLl9hcnJheT10LHRoaXMuX2ZpbmRMYXN0TW9ub3Rvbm91c0xhc3RJZHg9MH1maW5kTGFzdE1vbm90b25vdXModCl7aWYoZmYuYXNzZXJ0SW52YXJpYW50cyl7aWYodGhpcy5fcHJldkZpbmRMYXN0UHJlZGljYXRlKXtmb3IoY29uc3QgciBvZiB0aGlzLl9hcnJheSlpZih0aGlzLl9wcmV2RmluZExhc3RQcmVkaWNhdGUocikmJiF0KHIpKXRocm93IG5ldyBFcnJvcigiTW9ub3Rvbm91c0FycmF5OiBjdXJyZW50IHByZWRpY2F0ZSBtdXN0IGJlIHdlYWtlciB0aGFuIChvciBlcXVhbCB0bykgdGhlIHByZXZpb3VzIHByZWRpY2F0ZS4iKX10aGlzLl9wcmV2RmluZExhc3RQcmVkaWNhdGU9dH1jb25zdCBuPWlhKHRoaXMuX2FycmF5LHQsdGhpcy5fZmluZExhc3RNb25vdG9ub3VzTGFzdElkeCk7cmV0dXJuIHRoaXMuX2ZpbmRMYXN0TW9ub3Rvbm91c0xhc3RJZHg9bisxLG49PT0tMT92b2lkIDA6dGhpcy5fYXJyYXlbbl19fTtmZi5hc3NlcnRJbnZhcmlhbnRzPSExO2xldCBVdT1mZjtjbGFzcyBpZXtzdGF0aWMgZnJvbVJhbmdlSW5jbHVzaXZlKHQpe3JldHVybiBuZXcgaWUodC5zdGFydExpbmVOdW1iZXIsdC5lbmRMaW5lTnVtYmVyKzEpfXN0YXRpYyBqb2luTWFueSh0KXtpZih0Lmxlbmd0aD09PTApcmV0dXJuW107bGV0IG49bmV3IFhuKHRbMF0uc2xpY2UoKSk7Zm9yKGxldCByPTE7cjx0Lmxlbmd0aDtyKyspbj1uLmdldFVuaW9uKG5ldyBYbih0W3JdLnNsaWNlKCkpKTtyZXR1cm4gbi5yYW5nZXN9c3RhdGljIGpvaW4odCl7aWYodC5sZW5ndGg9PT0wKXRocm93IG5ldyB6dCgibGluZVJhbmdlcyBjYW5ub3QgYmUgZW1wdHkiKTtsZXQgbj10WzBdLnN0YXJ0TGluZU51bWJlcixyPXRbMF0uZW5kTGluZU51bWJlckV4Y2x1c2l2ZTtmb3IobGV0IHM9MTtzPHQubGVuZ3RoO3MrKyluPU1hdGgubWluKG4sdFtzXS5zdGFydExpbmVOdW1iZXIpLHI9TWF0aC5tYXgocix0W3NdLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpO3JldHVybiBuZXcgaWUobixyKX1zdGF0aWMgb2ZMZW5ndGgodCxuKXtyZXR1cm4gbmV3IGllKHQsdCtuKX1zdGF0aWMgZGVzZXJpYWxpemUodCl7cmV0dXJuIG5ldyBpZSh0WzBdLHRbMV0pfWNvbnN0cnVjdG9yKHQsbil7aWYodD5uKXRocm93IG5ldyB6dChgc3RhcnRMaW5lTnVtYmVyICR7dH0gY2Fubm90IGJlIGFmdGVyIGVuZExpbmVOdW1iZXJFeGNsdXNpdmUgJHtufWApO3RoaXMuc3RhcnRMaW5lTnVtYmVyPXQsdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPW59Y29udGFpbnModCl7cmV0dXJuIHRoaXMuc3RhcnRMaW5lTnVtYmVyPD10JiZ0PHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1nZXQgaXNFbXB0eSgpe3JldHVybiB0aGlzLnN0YXJ0TGluZU51bWJlcj09PXRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1kZWx0YSh0KXtyZXR1cm4gbmV3IGllKHRoaXMuc3RhcnRMaW5lTnVtYmVyK3QsdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlK3QpfWRlbHRhTGVuZ3RoKHQpe3JldHVybiBuZXcgaWUodGhpcy5zdGFydExpbmVOdW1iZXIsdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlK3QpfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLXRoaXMuc3RhcnRMaW5lTnVtYmVyfWpvaW4odCl7cmV0dXJuIG5ldyBpZShNYXRoLm1pbih0aGlzLnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0TGluZU51bWJlciksTWF0aC5tYXgodGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkpfXRvU3RyaW5nKCl7cmV0dXJuYFske3RoaXMuc3RhcnRMaW5lTnVtYmVyfSwke3RoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX0pYH1pbnRlcnNlY3QodCl7Y29uc3Qgbj1NYXRoLm1heCh0aGlzLnN0YXJ0TGluZU51bWJlcix0LnN0YXJ0TGluZU51bWJlcikscj1NYXRoLm1pbih0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsdC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKTtpZihuPD1yKXJldHVybiBuZXcgaWUobixyKX1pbnRlcnNlY3RzU3RyaWN0KHQpe3JldHVybiB0aGlzLnN0YXJ0TGluZU51bWJlcjx0LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUmJnQuc3RhcnRMaW5lTnVtYmVyPHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1vdmVybGFwT3JUb3VjaCh0KXtyZXR1cm4gdGhpcy5zdGFydExpbmVOdW1iZXI8PXQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSYmdC5zdGFydExpbmVOdW1iZXI8PXRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1lcXVhbHModCl7cmV0dXJuIHRoaXMuc3RhcnRMaW5lTnVtYmVyPT09dC5zdGFydExpbmVOdW1iZXImJnRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT09PXQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX10b0luY2x1c2l2ZVJhbmdlKCl7cmV0dXJuIHRoaXMuaXNFbXB0eT9udWxsOm5ldyBoZSh0aGlzLnN0YXJ0TGluZU51bWJlciwxLHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKX10b0V4Y2x1c2l2ZVJhbmdlKCl7cmV0dXJuIG5ldyBoZSh0aGlzLnN0YXJ0TGluZU51bWJlciwxLHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSwxKX1tYXBUb0xpbmVBcnJheSh0KXtjb25zdCBuPVtdO2ZvcihsZXQgcj10aGlzLnN0YXJ0TGluZU51bWJlcjtyPHRoaXMuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTtyKyspbi5wdXNoKHQocikpO3JldHVybiBufWZvckVhY2godCl7Zm9yKGxldCBuPXRoaXMuc3RhcnRMaW5lTnVtYmVyO248dGhpcy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlO24rKyl0KG4pfXNlcmlhbGl6ZSgpe3JldHVyblt0aGlzLnN0YXJ0TGluZU51bWJlcix0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmVdfWluY2x1ZGVzKHQpe3JldHVybiB0aGlzLnN0YXJ0TGluZU51bWJlcjw9dCYmdDx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmV9dG9PZmZzZXRSYW5nZSgpe3JldHVybiBuZXcgbGUodGhpcy5zdGFydExpbmVOdW1iZXItMSx0aGlzLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtMSl9fWNsYXNzIFhue2NvbnN0cnVjdG9yKHQ9W10pe3RoaXMuX25vcm1hbGl6ZWRSYW5nZXM9dH1nZXQgcmFuZ2VzKCl7cmV0dXJuIHRoaXMuX25vcm1hbGl6ZWRSYW5nZXN9YWRkUmFuZ2UodCl7aWYodC5sZW5ndGg9PT0wKXJldHVybjtjb25zdCBuPUdmKHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMscz0+cy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPj10LnN0YXJ0TGluZU51bWJlcikscj1pYSh0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLHM9PnMuc3RhcnRMaW5lTnVtYmVyPD10LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpKzE7aWYobj09PXIpdGhpcy5fbm9ybWFsaXplZFJhbmdlcy5zcGxpY2UobiwwLHQpO2Vsc2UgaWYobj09PXItMSl7Y29uc3Qgcz10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW25dO3RoaXMuX25vcm1hbGl6ZWRSYW5nZXNbbl09cy5qb2luKHQpfWVsc2V7Y29uc3Qgcz10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW25dLmpvaW4odGhpcy5fbm9ybWFsaXplZFJhbmdlc1tyLTFdKS5qb2luKHQpO3RoaXMuX25vcm1hbGl6ZWRSYW5nZXMuc3BsaWNlKG4sci1uLHMpfX1jb250YWlucyh0KXtjb25zdCBuPV9pKHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMscj0+ci5zdGFydExpbmVOdW1iZXI8PXQpO3JldHVybiEhbiYmbi5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPnR9aW50ZXJzZWN0cyh0KXtjb25zdCBuPV9pKHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMscj0+ci5zdGFydExpbmVOdW1iZXI8dC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKTtyZXR1cm4hIW4mJm4uZW5kTGluZU51bWJlckV4Y2x1c2l2ZT50LnN0YXJ0TGluZU51bWJlcn1nZXRVbmlvbih0KXtpZih0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aD09PTApcmV0dXJuIHQ7aWYodC5fbm9ybWFsaXplZFJhbmdlcy5sZW5ndGg9PT0wKXJldHVybiB0aGlzO2NvbnN0IG49W107bGV0IHI9MCxzPTAsaT1udWxsO2Zvcig7cjx0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aHx8czx0Ll9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aDspe2xldCBvPW51bGw7aWYocjx0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aCYmczx0Ll9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aCl7Y29uc3QgYT10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW3JdLHU9dC5fbm9ybWFsaXplZFJhbmdlc1tzXTthLnN0YXJ0TGluZU51bWJlcjx1LnN0YXJ0TGluZU51bWJlcj8obz1hLHIrKyk6KG89dSxzKyspfWVsc2Ugcjx0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLmxlbmd0aD8obz10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW3JdLHIrKyk6KG89dC5fbm9ybWFsaXplZFJhbmdlc1tzXSxzKyspO2k9PT1udWxsP2k9bzppLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU+PW8uc3RhcnRMaW5lTnVtYmVyP2k9bmV3IGllKGkuc3RhcnRMaW5lTnVtYmVyLE1hdGgubWF4KGkuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxvLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpKToobi5wdXNoKGkpLGk9byl9cmV0dXJuIGkhPT1udWxsJiZuLnB1c2goaSksbmV3IFhuKG4pfXN1YnRyYWN0RnJvbSh0KXtjb25zdCBuPUdmKHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMsbz0+by5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPj10LnN0YXJ0TGluZU51bWJlcikscj1pYSh0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLG89Pm8uc3RhcnRMaW5lTnVtYmVyPD10LmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpKzE7aWYobj09PXIpcmV0dXJuIG5ldyBYbihbdF0pO2NvbnN0IHM9W107bGV0IGk9dC5zdGFydExpbmVOdW1iZXI7Zm9yKGxldCBvPW47bzxyO28rKyl7Y29uc3QgYT10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW29dO2Euc3RhcnRMaW5lTnVtYmVyPmkmJnMucHVzaChuZXcgaWUoaSxhLnN0YXJ0TGluZU51bWJlcikpLGk9YS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlfXJldHVybiBpPHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSYmcy5wdXNoKG5ldyBpZShpLHQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSkpLG5ldyBYbihzKX10b1N0cmluZygpe3JldHVybiB0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLm1hcCh0PT50LnRvU3RyaW5nKCkpLmpvaW4oIiwgIil9Z2V0SW50ZXJzZWN0aW9uKHQpe2NvbnN0IG49W107bGV0IHI9MCxzPTA7Zm9yKDtyPHRoaXMuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoJiZzPHQuX25vcm1hbGl6ZWRSYW5nZXMubGVuZ3RoOyl7Y29uc3QgaT10aGlzLl9ub3JtYWxpemVkUmFuZ2VzW3JdLG89dC5fbm9ybWFsaXplZFJhbmdlc1tzXSxhPWkuaW50ZXJzZWN0KG8pO2EmJiFhLmlzRW1wdHkmJm4ucHVzaChhKSxpLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU8by5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlP3IrKzpzKyt9cmV0dXJuIG5ldyBYbihuKX1nZXRXaXRoRGVsdGEodCl7cmV0dXJuIG5ldyBYbih0aGlzLl9ub3JtYWxpemVkUmFuZ2VzLm1hcChuPT5uLmRlbHRhKHQpKSl9fWNvbnN0IEJzPWNsYXNzIEJze3N0YXRpYyBiZXR3ZWVuUG9zaXRpb25zKHQsbil7cmV0dXJuIHQubGluZU51bWJlcj09PW4ubGluZU51bWJlcj9uZXcgQnMoMCxuLmNvbHVtbi10LmNvbHVtbik6bmV3IEJzKG4ubGluZU51bWJlci10LmxpbmVOdW1iZXIsbi5jb2x1bW4tMSl9c3RhdGljIG9mUmFuZ2UodCl7cmV0dXJuIEJzLmJldHdlZW5Qb3NpdGlvbnModC5nZXRTdGFydFBvc2l0aW9uKCksdC5nZXRFbmRQb3NpdGlvbigpKX1zdGF0aWMgb2ZUZXh0KHQpe2xldCBuPTAscj0wO2Zvcihjb25zdCBzIG9mIHQpcz09PWAKYD8obisrLHI9MCk6cisrO3JldHVybiBuZXcgQnMobixyKX1jb25zdHJ1Y3Rvcih0LG4pe3RoaXMubGluZUNvdW50PXQsdGhpcy5jb2x1bW5Db3VudD1ufWlzR3JlYXRlclRoYW5PckVxdWFsVG8odCl7cmV0dXJuIHRoaXMubGluZUNvdW50IT09dC5saW5lQ291bnQ/dGhpcy5saW5lQ291bnQ+dC5saW5lQ291bnQ6dGhpcy5jb2x1bW5Db3VudD49dC5jb2x1bW5Db3VudH1jcmVhdGVSYW5nZSh0KXtyZXR1cm4gdGhpcy5saW5lQ291bnQ9PT0wP25ldyBoZSh0LmxpbmVOdW1iZXIsdC5jb2x1bW4sdC5saW5lTnVtYmVyLHQuY29sdW1uK3RoaXMuY29sdW1uQ291bnQpOm5ldyBoZSh0LmxpbmVOdW1iZXIsdC5jb2x1bW4sdC5saW5lTnVtYmVyK3RoaXMubGluZUNvdW50LHRoaXMuY29sdW1uQ291bnQrMSl9YWRkVG9Qb3NpdGlvbih0KXtyZXR1cm4gdGhpcy5saW5lQ291bnQ9PT0wP25ldyBKZSh0LmxpbmVOdW1iZXIsdC5jb2x1bW4rdGhpcy5jb2x1bW5Db3VudCk6bmV3IEplKHQubGluZU51bWJlcit0aGlzLmxpbmVDb3VudCx0aGlzLmNvbHVtbkNvdW50KzEpfXRvU3RyaW5nKCl7cmV0dXJuYCR7dGhpcy5saW5lQ291bnR9LCR7dGhpcy5jb2x1bW5Db3VudH1gfX07QnMuemVybz1uZXcgQnMoMCwwKTtsZXQgVjA9QnM7Y2xhc3MgcFN7Y29uc3RydWN0b3IodCxuKXt0aGlzLnJhbmdlPXQsdGhpcy50ZXh0PW59dG9TaW5nbGVFZGl0T3BlcmF0aW9uKCl7cmV0dXJue3JhbmdlOnRoaXMucmFuZ2UsdGV4dDp0aGlzLnRleHR9fX1jbGFzcyBjbntzdGF0aWMgaW52ZXJzZSh0LG4scil7Y29uc3Qgcz1bXTtsZXQgaT0xLG89MTtmb3IoY29uc3QgdSBvZiB0KXtjb25zdCBsPW5ldyBjbihuZXcgaWUoaSx1Lm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlciksbmV3IGllKG8sdS5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIpKTtsLm1vZGlmaWVkLmlzRW1wdHl8fHMucHVzaChsKSxpPXUub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxvPXUubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZX1jb25zdCBhPW5ldyBjbihuZXcgaWUoaSxuKzEpLG5ldyBpZShvLHIrMSkpO3JldHVybiBhLm1vZGlmaWVkLmlzRW1wdHl8fHMucHVzaChhKSxzfXN0YXRpYyBjbGlwKHQsbixyKXtjb25zdCBzPVtdO2Zvcihjb25zdCBpIG9mIHQpe2NvbnN0IG89aS5vcmlnaW5hbC5pbnRlcnNlY3QobiksYT1pLm1vZGlmaWVkLmludGVyc2VjdChyKTtvJiYhby5pc0VtcHR5JiZhJiYhYS5pc0VtcHR5JiZzLnB1c2gobmV3IGNuKG8sYSkpfXJldHVybiBzfWNvbnN0cnVjdG9yKHQsbil7dGhpcy5vcmlnaW5hbD10LHRoaXMubW9kaWZpZWQ9bn10b1N0cmluZygpe3JldHVybmB7JHt0aGlzLm9yaWdpbmFsLnRvU3RyaW5nKCl9LT4ke3RoaXMubW9kaWZpZWQudG9TdHJpbmcoKX19YH1mbGlwKCl7cmV0dXJuIG5ldyBjbih0aGlzLm1vZGlmaWVkLHRoaXMub3JpZ2luYWwpfWpvaW4odCl7cmV0dXJuIG5ldyBjbih0aGlzLm9yaWdpbmFsLmpvaW4odC5vcmlnaW5hbCksdGhpcy5tb2RpZmllZC5qb2luKHQubW9kaWZpZWQpKX10b1JhbmdlTWFwcGluZygpe2NvbnN0IHQ9dGhpcy5vcmlnaW5hbC50b0luY2x1c2l2ZVJhbmdlKCksbj10aGlzLm1vZGlmaWVkLnRvSW5jbHVzaXZlUmFuZ2UoKTtpZih0JiZuKXJldHVybiBuZXcgSW4odCxuKTtpZih0aGlzLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcj09PTF8fHRoaXMubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyPT09MSl7aWYoISh0aGlzLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcj09PTEmJnRoaXMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyPT09MSkpdGhyb3cgbmV3IHp0KCJub3QgYSB2YWxpZCBkaWZmIik7cmV0dXJuIG5ldyBJbihuZXcgaGUodGhpcy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIsMSx0aGlzLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsMSksbmV3IGhlKHRoaXMubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLDEsdGhpcy5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLDEpKX1lbHNlIHJldHVybiBuZXcgSW4obmV3IGhlKHRoaXMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLTEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsdGhpcy5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLTEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLG5ldyBoZSh0aGlzLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlci0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLHRoaXMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSl9dG9SYW5nZU1hcHBpbmcyKHQsbil7aWYoVTAodGhpcy5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLHQpJiZVMCh0aGlzLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsbikpcmV0dXJuIG5ldyBJbihuZXcgaGUodGhpcy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIsMSx0aGlzLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsMSksbmV3IGhlKHRoaXMubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLDEsdGhpcy5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLDEpKTtpZighdGhpcy5vcmlnaW5hbC5pc0VtcHR5JiYhdGhpcy5tb2RpZmllZC5pc0VtcHR5KXJldHVybiBuZXcgSW4oaGUuZnJvbVBvc2l0aW9ucyhuZXcgSmUodGhpcy5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIsMSksSWkobmV3IEplKHRoaXMub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSx0KSksaGUuZnJvbVBvc2l0aW9ucyhuZXcgSmUodGhpcy5tb2RpZmllZC5zdGFydExpbmVOdW1iZXIsMSksSWkobmV3IEplKHRoaXMubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSxuKSkpO2lmKHRoaXMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyPjEmJnRoaXMubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyPjEpcmV0dXJuIG5ldyBJbihoZS5mcm9tUG9zaXRpb25zKElpKG5ldyBKZSh0aGlzLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlci0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSx0KSxJaShuZXcgSmUodGhpcy5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLTEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLHQpKSxoZS5mcm9tUG9zaXRpb25zKElpKG5ldyBKZSh0aGlzLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlci0xLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKSxuKSxJaShuZXcgSmUodGhpcy5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLTEsTnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIpLG4pKSk7dGhyb3cgbmV3IHp0fX1mdW5jdGlvbiBJaShlLHQpe2lmKGUubGluZU51bWJlcjwxKXJldHVybiBuZXcgSmUoMSwxKTtpZihlLmxpbmVOdW1iZXI+dC5sZW5ndGgpcmV0dXJuIG5ldyBKZSh0Lmxlbmd0aCx0W3QubGVuZ3RoLTFdLmxlbmd0aCsxKTtjb25zdCBuPXRbZS5saW5lTnVtYmVyLTFdO3JldHVybiBlLmNvbHVtbj5uLmxlbmd0aCsxP25ldyBKZShlLmxpbmVOdW1iZXIsbi5sZW5ndGgrMSk6ZX1mdW5jdGlvbiBVMChlLHQpe3JldHVybiBlPj0xJiZlPD10Lmxlbmd0aH1jbGFzcyBEciBleHRlbmRzIGNue3N0YXRpYyBmcm9tUmFuZ2VNYXBwaW5ncyh0KXtjb25zdCBuPWllLmpvaW4odC5tYXAocz0+aWUuZnJvbVJhbmdlSW5jbHVzaXZlKHMub3JpZ2luYWxSYW5nZSkpKSxyPWllLmpvaW4odC5tYXAocz0+aWUuZnJvbVJhbmdlSW5jbHVzaXZlKHMubW9kaWZpZWRSYW5nZSkpKTtyZXR1cm4gbmV3IERyKG4scix0KX1jb25zdHJ1Y3Rvcih0LG4scil7c3VwZXIodCxuKSx0aGlzLmlubmVyQ2hhbmdlcz1yfWZsaXAoKXt2YXIgdDtyZXR1cm4gbmV3IERyKHRoaXMubW9kaWZpZWQsdGhpcy5vcmlnaW5hbCwodD10aGlzLmlubmVyQ2hhbmdlcyk9PW51bGw/dm9pZCAwOnQubWFwKG49Pm4uZmxpcCgpKSl9d2l0aElubmVyQ2hhbmdlc0Zyb21MaW5lUmFuZ2VzKCl7cmV0dXJuIG5ldyBEcih0aGlzLm9yaWdpbmFsLHRoaXMubW9kaWZpZWQsW3RoaXMudG9SYW5nZU1hcHBpbmcoKV0pfX1jbGFzcyBJbntzdGF0aWMgYXNzZXJ0U29ydGVkKHQpe2ZvcihsZXQgbj0xO248dC5sZW5ndGg7bisrKXtjb25zdCByPXRbbi0xXSxzPXRbbl07aWYoIShyLm9yaWdpbmFsUmFuZ2UuZ2V0RW5kUG9zaXRpb24oKS5pc0JlZm9yZU9yRXF1YWwocy5vcmlnaW5hbFJhbmdlLmdldFN0YXJ0UG9zaXRpb24oKSkmJnIubW9kaWZpZWRSYW5nZS5nZXRFbmRQb3NpdGlvbigpLmlzQmVmb3JlT3JFcXVhbChzLm1vZGlmaWVkUmFuZ2UuZ2V0U3RhcnRQb3NpdGlvbigpKSkpdGhyb3cgbmV3IHp0KCJSYW5nZSBtYXBwaW5ncyBtdXN0IGJlIHNvcnRlZCIpfX1jb25zdHJ1Y3Rvcih0LG4pe3RoaXMub3JpZ2luYWxSYW5nZT10LHRoaXMubW9kaWZpZWRSYW5nZT1ufXRvU3RyaW5nKCl7cmV0dXJuYHske3RoaXMub3JpZ2luYWxSYW5nZS50b1N0cmluZygpfS0+JHt0aGlzLm1vZGlmaWVkUmFuZ2UudG9TdHJpbmcoKX19YH1mbGlwKCl7cmV0dXJuIG5ldyBJbih0aGlzLm1vZGlmaWVkUmFuZ2UsdGhpcy5vcmlnaW5hbFJhbmdlKX10b1RleHRFZGl0KHQpe2NvbnN0IG49dC5nZXRWYWx1ZU9mUmFuZ2UodGhpcy5tb2RpZmllZFJhbmdlKTtyZXR1cm4gbmV3IHBTKHRoaXMub3JpZ2luYWxSYW5nZSxuKX19Y29uc3QgaFM9MztjbGFzcyBkU3tjb21wdXRlRGlmZih0LG4scil7dmFyIHU7Y29uc3QgaT1uZXcgeVModCxuLHttYXhDb21wdXRhdGlvblRpbWU6ci5tYXhDb21wdXRhdGlvblRpbWVNcyxzaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZTpyLmlnbm9yZVRyaW1XaGl0ZXNwYWNlLHNob3VsZENvbXB1dGVDaGFyQ2hhbmdlczohMCxzaG91bGRNYWtlUHJldHR5RGlmZjohMCxzaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzOiEwfSkuY29tcHV0ZURpZmYoKSxvPVtdO2xldCBhPW51bGw7Zm9yKGNvbnN0IGwgb2YgaS5jaGFuZ2VzKXtsZXQgZjtsLm9yaWdpbmFsRW5kTGluZU51bWJlcj09PTA/Zj1uZXcgaWUobC5vcmlnaW5hbFN0YXJ0TGluZU51bWJlcisxLGwub3JpZ2luYWxTdGFydExpbmVOdW1iZXIrMSk6Zj1uZXcgaWUobC5vcmlnaW5hbFN0YXJ0TGluZU51bWJlcixsLm9yaWdpbmFsRW5kTGluZU51bWJlcisxKTtsZXQgYztsLm1vZGlmaWVkRW5kTGluZU51bWJlcj09PTA/Yz1uZXcgaWUobC5tb2RpZmllZFN0YXJ0TGluZU51bWJlcisxLGwubW9kaWZpZWRTdGFydExpbmVOdW1iZXIrMSk6Yz1uZXcgaWUobC5tb2RpZmllZFN0YXJ0TGluZU51bWJlcixsLm1vZGlmaWVkRW5kTGluZU51bWJlcisxKTtsZXQgcD1uZXcgRHIoZixjLCh1PWwuY2hhckNoYW5nZXMpPT1udWxsP3ZvaWQgMDp1Lm1hcChoPT5uZXcgSW4obmV3IGhlKGgub3JpZ2luYWxTdGFydExpbmVOdW1iZXIsaC5vcmlnaW5hbFN0YXJ0Q29sdW1uLGgub3JpZ2luYWxFbmRMaW5lTnVtYmVyLGgub3JpZ2luYWxFbmRDb2x1bW4pLG5ldyBoZShoLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyLGgubW9kaWZpZWRTdGFydENvbHVtbixoLm1vZGlmaWVkRW5kTGluZU51bWJlcixoLm1vZGlmaWVkRW5kQ29sdW1uKSkpKTthJiYoYS5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPT09cC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXJ8fGEub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZT09PXAub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyKSYmKHA9bmV3IERyKGEub3JpZ2luYWwuam9pbihwLm9yaWdpbmFsKSxhLm1vZGlmaWVkLmpvaW4ocC5tb2RpZmllZCksYS5pbm5lckNoYW5nZXMmJnAuaW5uZXJDaGFuZ2VzP2EuaW5uZXJDaGFuZ2VzLmNvbmNhdChwLmlubmVyQ2hhbmdlcyk6dm9pZCAwKSxvLnBvcCgpKSxvLnB1c2gocCksYT1wfXJldHVybiBqdSgoKT0+STAobywobCxmKT0+Zi5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItbC5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPT09Zi5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItbC5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlJiZsLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU8Zi5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXImJmwubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTxmLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcikpLG5ldyBWdShvLFtdLGkucXVpdEVhcmx5KX19ZnVuY3Rpb24gcTAoZSx0LG4scil7cmV0dXJuIG5ldyBzcyhlLHQsbikuQ29tcHV0ZURpZmYocil9bGV0IFcwPWNsYXNze2NvbnN0cnVjdG9yKHQpe2NvbnN0IG49W10scj1bXTtmb3IobGV0IHM9MCxpPXQubGVuZ3RoO3M8aTtzKyspbltzXT1LZih0W3NdLDEpLHJbc109WGYodFtzXSwxKTt0aGlzLmxpbmVzPXQsdGhpcy5fc3RhcnRDb2x1bW5zPW4sdGhpcy5fZW5kQ29sdW1ucz1yfWdldEVsZW1lbnRzKCl7Y29uc3QgdD1bXTtmb3IobGV0IG49MCxyPXRoaXMubGluZXMubGVuZ3RoO248cjtuKyspdFtuXT10aGlzLmxpbmVzW25dLnN1YnN0cmluZyh0aGlzLl9zdGFydENvbHVtbnNbbl0tMSx0aGlzLl9lbmRDb2x1bW5zW25dLTEpO3JldHVybiB0fWdldFN0cmljdEVsZW1lbnQodCl7cmV0dXJuIHRoaXMubGluZXNbdF19Z2V0U3RhcnRMaW5lTnVtYmVyKHQpe3JldHVybiB0KzF9Z2V0RW5kTGluZU51bWJlcih0KXtyZXR1cm4gdCsxfWNyZWF0ZUNoYXJTZXF1ZW5jZSh0LG4scil7Y29uc3Qgcz1bXSxpPVtdLG89W107bGV0IGE9MDtmb3IobGV0IHU9bjt1PD1yO3UrKyl7Y29uc3QgbD10aGlzLmxpbmVzW3VdLGY9dD90aGlzLl9zdGFydENvbHVtbnNbdV06MSxjPXQ/dGhpcy5fZW5kQ29sdW1uc1t1XTpsLmxlbmd0aCsxO2ZvcihsZXQgcD1mO3A8YztwKyspc1thXT1sLmNoYXJDb2RlQXQocC0xKSxpW2FdPXUrMSxvW2FdPXAsYSsrOyF0JiZ1PHImJihzW2FdPTEwLGlbYV09dSsxLG9bYV09bC5sZW5ndGgrMSxhKyspfXJldHVybiBuZXcgbVMocyxpLG8pfX07Y2xhc3MgbVN7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuX2NoYXJDb2Rlcz10LHRoaXMuX2xpbmVOdW1iZXJzPW4sdGhpcy5fY29sdW1ucz1yfXRvU3RyaW5nKCl7cmV0dXJuIlsiK3RoaXMuX2NoYXJDb2Rlcy5tYXAoKHQsbik9Pih0PT09MTA/IlxcbiI6U3RyaW5nLmZyb21DaGFyQ29kZSh0KSkrYC0oJHt0aGlzLl9saW5lTnVtYmVyc1tuXX0sJHt0aGlzLl9jb2x1bW5zW25dfSlgKS5qb2luKCIsICIpKyJdIn1fYXNzZXJ0SW5kZXgodCxuKXtpZih0PDB8fHQ+PW4ubGVuZ3RoKXRocm93IG5ldyBFcnJvcigiSWxsZWdhbCBpbmRleCIpfWdldEVsZW1lbnRzKCl7cmV0dXJuIHRoaXMuX2NoYXJDb2Rlc31nZXRTdGFydExpbmVOdW1iZXIodCl7cmV0dXJuIHQ+MCYmdD09PXRoaXMuX2xpbmVOdW1iZXJzLmxlbmd0aD90aGlzLmdldEVuZExpbmVOdW1iZXIodC0xKToodGhpcy5fYXNzZXJ0SW5kZXgodCx0aGlzLl9saW5lTnVtYmVycyksdGhpcy5fbGluZU51bWJlcnNbdF0pfWdldEVuZExpbmVOdW1iZXIodCl7cmV0dXJuIHQ9PT0tMT90aGlzLmdldFN0YXJ0TGluZU51bWJlcih0KzEpOih0aGlzLl9hc3NlcnRJbmRleCh0LHRoaXMuX2xpbmVOdW1iZXJzKSx0aGlzLl9jaGFyQ29kZXNbdF09PT0xMD90aGlzLl9saW5lTnVtYmVyc1t0XSsxOnRoaXMuX2xpbmVOdW1iZXJzW3RdKX1nZXRTdGFydENvbHVtbih0KXtyZXR1cm4gdD4wJiZ0PT09dGhpcy5fY29sdW1ucy5sZW5ndGg/dGhpcy5nZXRFbmRDb2x1bW4odC0xKToodGhpcy5fYXNzZXJ0SW5kZXgodCx0aGlzLl9jb2x1bW5zKSx0aGlzLl9jb2x1bW5zW3RdKX1nZXRFbmRDb2x1bW4odCl7cmV0dXJuIHQ9PT0tMT90aGlzLmdldFN0YXJ0Q29sdW1uKHQrMSk6KHRoaXMuX2Fzc2VydEluZGV4KHQsdGhpcy5fY29sdW1ucyksdGhpcy5fY2hhckNvZGVzW3RdPT09MTA/MTp0aGlzLl9jb2x1bW5zW3RdKzEpfX1jbGFzcyBQaXtjb25zdHJ1Y3Rvcih0LG4scixzLGksbyxhLHUpe3RoaXMub3JpZ2luYWxTdGFydExpbmVOdW1iZXI9dCx0aGlzLm9yaWdpbmFsU3RhcnRDb2x1bW49bix0aGlzLm9yaWdpbmFsRW5kTGluZU51bWJlcj1yLHRoaXMub3JpZ2luYWxFbmRDb2x1bW49cyx0aGlzLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyPWksdGhpcy5tb2RpZmllZFN0YXJ0Q29sdW1uPW8sdGhpcy5tb2RpZmllZEVuZExpbmVOdW1iZXI9YSx0aGlzLm1vZGlmaWVkRW5kQ29sdW1uPXV9c3RhdGljIGNyZWF0ZUZyb21EaWZmQ2hhbmdlKHQsbixyKXtjb25zdCBzPW4uZ2V0U3RhcnRMaW5lTnVtYmVyKHQub3JpZ2luYWxTdGFydCksaT1uLmdldFN0YXJ0Q29sdW1uKHQub3JpZ2luYWxTdGFydCksbz1uLmdldEVuZExpbmVOdW1iZXIodC5vcmlnaW5hbFN0YXJ0K3Qub3JpZ2luYWxMZW5ndGgtMSksYT1uLmdldEVuZENvbHVtbih0Lm9yaWdpbmFsU3RhcnQrdC5vcmlnaW5hbExlbmd0aC0xKSx1PXIuZ2V0U3RhcnRMaW5lTnVtYmVyKHQubW9kaWZpZWRTdGFydCksbD1yLmdldFN0YXJ0Q29sdW1uKHQubW9kaWZpZWRTdGFydCksZj1yLmdldEVuZExpbmVOdW1iZXIodC5tb2RpZmllZFN0YXJ0K3QubW9kaWZpZWRMZW5ndGgtMSksYz1yLmdldEVuZENvbHVtbih0Lm1vZGlmaWVkU3RhcnQrdC5tb2RpZmllZExlbmd0aC0xKTtyZXR1cm4gbmV3IFBpKHMsaSxvLGEsdSxsLGYsYyl9fWZ1bmN0aW9uIGdTKGUpe2lmKGUubGVuZ3RoPD0xKXJldHVybiBlO2NvbnN0IHQ9W2VbMF1dO2xldCBuPXRbMF07Zm9yKGxldCByPTEscz1lLmxlbmd0aDtyPHM7cisrKXtjb25zdCBpPWVbcl0sbz1pLm9yaWdpbmFsU3RhcnQtKG4ub3JpZ2luYWxTdGFydCtuLm9yaWdpbmFsTGVuZ3RoKSxhPWkubW9kaWZpZWRTdGFydC0obi5tb2RpZmllZFN0YXJ0K24ubW9kaWZpZWRMZW5ndGgpO01hdGgubWluKG8sYSk8aFM/KG4ub3JpZ2luYWxMZW5ndGg9aS5vcmlnaW5hbFN0YXJ0K2kub3JpZ2luYWxMZW5ndGgtbi5vcmlnaW5hbFN0YXJ0LG4ubW9kaWZpZWRMZW5ndGg9aS5tb2RpZmllZFN0YXJ0K2kubW9kaWZpZWRMZW5ndGgtbi5tb2RpZmllZFN0YXJ0KToodC5wdXNoKGkpLG49aSl9cmV0dXJuIHR9Y2xhc3Mgb2F7Y29uc3RydWN0b3IodCxuLHIscyxpKXt0aGlzLm9yaWdpbmFsU3RhcnRMaW5lTnVtYmVyPXQsdGhpcy5vcmlnaW5hbEVuZExpbmVOdW1iZXI9bix0aGlzLm1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyPXIsdGhpcy5tb2RpZmllZEVuZExpbmVOdW1iZXI9cyx0aGlzLmNoYXJDaGFuZ2VzPWl9c3RhdGljIGNyZWF0ZUZyb21EaWZmUmVzdWx0KHQsbixyLHMsaSxvLGEpe2xldCB1LGwsZixjLHA7aWYobi5vcmlnaW5hbExlbmd0aD09PTA/KHU9ci5nZXRTdGFydExpbmVOdW1iZXIobi5vcmlnaW5hbFN0YXJ0KS0xLGw9MCk6KHU9ci5nZXRTdGFydExpbmVOdW1iZXIobi5vcmlnaW5hbFN0YXJ0KSxsPXIuZ2V0RW5kTGluZU51bWJlcihuLm9yaWdpbmFsU3RhcnQrbi5vcmlnaW5hbExlbmd0aC0xKSksbi5tb2RpZmllZExlbmd0aD09PTA/KGY9cy5nZXRTdGFydExpbmVOdW1iZXIobi5tb2RpZmllZFN0YXJ0KS0xLGM9MCk6KGY9cy5nZXRTdGFydExpbmVOdW1iZXIobi5tb2RpZmllZFN0YXJ0KSxjPXMuZ2V0RW5kTGluZU51bWJlcihuLm1vZGlmaWVkU3RhcnQrbi5tb2RpZmllZExlbmd0aC0xKSksbyYmbi5vcmlnaW5hbExlbmd0aD4wJiZuLm9yaWdpbmFsTGVuZ3RoPDIwJiZuLm1vZGlmaWVkTGVuZ3RoPjAmJm4ubW9kaWZpZWRMZW5ndGg8MjAmJmkoKSl7Y29uc3QgaD1yLmNyZWF0ZUNoYXJTZXF1ZW5jZSh0LG4ub3JpZ2luYWxTdGFydCxuLm9yaWdpbmFsU3RhcnQrbi5vcmlnaW5hbExlbmd0aC0xKSxkPXMuY3JlYXRlQ2hhclNlcXVlbmNlKHQsbi5tb2RpZmllZFN0YXJ0LG4ubW9kaWZpZWRTdGFydCtuLm1vZGlmaWVkTGVuZ3RoLTEpO2lmKGguZ2V0RWxlbWVudHMoKS5sZW5ndGg+MCYmZC5nZXRFbGVtZW50cygpLmxlbmd0aD4wKXtsZXQgbT1xMChoLGQsaSwhMCkuY2hhbmdlczthJiYobT1nUyhtKSkscD1bXTtmb3IobGV0IGc9MCxEPW0ubGVuZ3RoO2c8RDtnKyspcC5wdXNoKFBpLmNyZWF0ZUZyb21EaWZmQ2hhbmdlKG1bZ10saCxkKSl9fXJldHVybiBuZXcgb2EodSxsLGYsYyxwKX19Y2xhc3MgeVN7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzPXIuc2hvdWxkQ29tcHV0ZUNoYXJDaGFuZ2VzLHRoaXMuc2hvdWxkUG9zdFByb2Nlc3NDaGFyQ2hhbmdlcz1yLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMsdGhpcy5zaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZT1yLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLHRoaXMuc2hvdWxkTWFrZVByZXR0eURpZmY9ci5zaG91bGRNYWtlUHJldHR5RGlmZix0aGlzLm9yaWdpbmFsTGluZXM9dCx0aGlzLm1vZGlmaWVkTGluZXM9bix0aGlzLm9yaWdpbmFsPW5ldyBXMCh0KSx0aGlzLm1vZGlmaWVkPW5ldyBXMChuKSx0aGlzLmNvbnRpbnVlTGluZURpZmY9SDAoci5tYXhDb21wdXRhdGlvblRpbWUpLHRoaXMuY29udGludWVDaGFyRGlmZj1IMChyLm1heENvbXB1dGF0aW9uVGltZT09PTA/MDpNYXRoLm1pbihyLm1heENvbXB1dGF0aW9uVGltZSw1ZTMpKX1jb21wdXRlRGlmZigpe2lmKHRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoPT09MSYmdGhpcy5vcmlnaW5hbC5saW5lc1swXS5sZW5ndGg9PT0wKXJldHVybiB0aGlzLm1vZGlmaWVkLmxpbmVzLmxlbmd0aD09PTEmJnRoaXMubW9kaWZpZWQubGluZXNbMF0ubGVuZ3RoPT09MD97cXVpdEVhcmx5OiExLGNoYW5nZXM6W119OntxdWl0RWFybHk6ITEsY2hhbmdlczpbe29yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOjEsb3JpZ2luYWxFbmRMaW5lTnVtYmVyOjEsbW9kaWZpZWRTdGFydExpbmVOdW1iZXI6MSxtb2RpZmllZEVuZExpbmVOdW1iZXI6dGhpcy5tb2RpZmllZC5saW5lcy5sZW5ndGgsY2hhckNoYW5nZXM6dm9pZCAwfV19O2lmKHRoaXMubW9kaWZpZWQubGluZXMubGVuZ3RoPT09MSYmdGhpcy5tb2RpZmllZC5saW5lc1swXS5sZW5ndGg9PT0wKXJldHVybntxdWl0RWFybHk6ITEsY2hhbmdlczpbe29yaWdpbmFsU3RhcnRMaW5lTnVtYmVyOjEsb3JpZ2luYWxFbmRMaW5lTnVtYmVyOnRoaXMub3JpZ2luYWwubGluZXMubGVuZ3RoLG1vZGlmaWVkU3RhcnRMaW5lTnVtYmVyOjEsbW9kaWZpZWRFbmRMaW5lTnVtYmVyOjEsY2hhckNoYW5nZXM6dm9pZCAwfV19O2NvbnN0IHQ9cTAodGhpcy5vcmlnaW5hbCx0aGlzLm1vZGlmaWVkLHRoaXMuY29udGludWVMaW5lRGlmZix0aGlzLnNob3VsZE1ha2VQcmV0dHlEaWZmKSxuPXQuY2hhbmdlcyxyPXQucXVpdEVhcmx5O2lmKHRoaXMuc2hvdWxkSWdub3JlVHJpbVdoaXRlc3BhY2Upe2NvbnN0IGE9W107Zm9yKGxldCB1PTAsbD1uLmxlbmd0aDt1PGw7dSsrKWEucHVzaChvYS5jcmVhdGVGcm9tRGlmZlJlc3VsdCh0aGlzLnNob3VsZElnbm9yZVRyaW1XaGl0ZXNwYWNlLG5bdV0sdGhpcy5vcmlnaW5hbCx0aGlzLm1vZGlmaWVkLHRoaXMuY29udGludWVDaGFyRGlmZix0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyx0aGlzLnNob3VsZFBvc3RQcm9jZXNzQ2hhckNoYW5nZXMpKTtyZXR1cm57cXVpdEVhcmx5OnIsY2hhbmdlczphfX1jb25zdCBzPVtdO2xldCBpPTAsbz0wO2ZvcihsZXQgYT0tMSx1PW4ubGVuZ3RoO2E8dTthKyspe2NvbnN0IGw9YSsxPHU/blthKzFdOm51bGwsZj1sP2wub3JpZ2luYWxTdGFydDp0aGlzLm9yaWdpbmFsTGluZXMubGVuZ3RoLGM9bD9sLm1vZGlmaWVkU3RhcnQ6dGhpcy5tb2RpZmllZExpbmVzLmxlbmd0aDtmb3IoO2k8ZiYmbzxjOyl7Y29uc3QgcD10aGlzLm9yaWdpbmFsTGluZXNbaV0saD10aGlzLm1vZGlmaWVkTGluZXNbb107aWYocCE9PWgpe3tsZXQgZD1LZihwLDEpLG09S2YoaCwxKTtmb3IoO2Q+MSYmbT4xOyl7Y29uc3QgZz1wLmNoYXJDb2RlQXQoZC0yKSxEPWguY2hhckNvZGVBdChtLTIpO2lmKGchPT1EKWJyZWFrO2QtLSxtLS19KGQ+MXx8bT4xKSYmdGhpcy5fcHVzaFRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZShzLGkrMSwxLGQsbysxLDEsbSl9e2xldCBkPVhmKHAsMSksbT1YZihoLDEpO2NvbnN0IGc9cC5sZW5ndGgrMSxEPWgubGVuZ3RoKzE7Zm9yKDtkPGcmJm08RDspe2NvbnN0IGI9cC5jaGFyQ29kZUF0KGQtMSksRT1wLmNoYXJDb2RlQXQobS0xKTtpZihiIT09RSlicmVhaztkKyssbSsrfShkPGd8fG08RCkmJnRoaXMuX3B1c2hUcmltV2hpdGVzcGFjZUNoYXJDaGFuZ2UocyxpKzEsZCxnLG8rMSxtLEQpfX1pKyssbysrfWwmJihzLnB1c2gob2EuY3JlYXRlRnJvbURpZmZSZXN1bHQodGhpcy5zaG91bGRJZ25vcmVUcmltV2hpdGVzcGFjZSxsLHRoaXMub3JpZ2luYWwsdGhpcy5tb2RpZmllZCx0aGlzLmNvbnRpbnVlQ2hhckRpZmYsdGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMsdGhpcy5zaG91bGRQb3N0UHJvY2Vzc0NoYXJDaGFuZ2VzKSksaSs9bC5vcmlnaW5hbExlbmd0aCxvKz1sLm1vZGlmaWVkTGVuZ3RoKX1yZXR1cm57cXVpdEVhcmx5OnIsY2hhbmdlczpzfX1fcHVzaFRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZSh0LG4scixzLGksbyxhKXtpZih0aGlzLl9tZXJnZVRyaW1XaGl0ZXNwYWNlQ2hhckNoYW5nZSh0LG4scixzLGksbyxhKSlyZXR1cm47bGV0IHU7dGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMmJih1PVtuZXcgUGkobixyLG4scyxpLG8saSxhKV0pLHQucHVzaChuZXcgb2EobixuLGksaSx1KSl9X21lcmdlVHJpbVdoaXRlc3BhY2VDaGFyQ2hhbmdlKHQsbixyLHMsaSxvLGEpe2NvbnN0IHU9dC5sZW5ndGg7aWYodT09PTApcmV0dXJuITE7Y29uc3QgbD10W3UtMV07cmV0dXJuIGwub3JpZ2luYWxFbmRMaW5lTnVtYmVyPT09MHx8bC5tb2RpZmllZEVuZExpbmVOdW1iZXI9PT0wPyExOmwub3JpZ2luYWxFbmRMaW5lTnVtYmVyPT09biYmbC5tb2RpZmllZEVuZExpbmVOdW1iZXI9PT1pPyh0aGlzLnNob3VsZENvbXB1dGVDaGFyQ2hhbmdlcyYmbC5jaGFyQ2hhbmdlcyYmbC5jaGFyQ2hhbmdlcy5wdXNoKG5ldyBQaShuLHIsbixzLGksbyxpLGEpKSwhMCk6bC5vcmlnaW5hbEVuZExpbmVOdW1iZXIrMT09PW4mJmwubW9kaWZpZWRFbmRMaW5lTnVtYmVyKzE9PT1pPyhsLm9yaWdpbmFsRW5kTGluZU51bWJlcj1uLGwubW9kaWZpZWRFbmRMaW5lTnVtYmVyPWksdGhpcy5zaG91bGRDb21wdXRlQ2hhckNoYW5nZXMmJmwuY2hhckNoYW5nZXMmJmwuY2hhckNoYW5nZXMucHVzaChuZXcgUGkobixyLG4scyxpLG8saSxhKSksITApOiExfX1mdW5jdGlvbiBLZihlLHQpe2NvbnN0IG49ekMoZSk7cmV0dXJuIG49PT0tMT90Om4rMX1mdW5jdGlvbiBYZihlLHQpe2NvbnN0IG49R0MoZSk7cmV0dXJuIG49PT0tMT90Om4rMn1mdW5jdGlvbiBIMChlKXtpZihlPT09MClyZXR1cm4oKT0+ITA7Y29uc3QgdD1EYXRlLm5vdygpO3JldHVybigpPT5EYXRlLm5vdygpLXQ8ZX1mdW5jdGlvbiBEUyhlLHQsbj0ocixzKT0+cj09PXMpe2lmKGU9PT10KXJldHVybiEwO2lmKCFlfHwhdHx8ZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3IobGV0IHI9MCxzPWUubGVuZ3RoO3I8cztyKyspaWYoIW4oZVtyXSx0W3JdKSlyZXR1cm4hMTtyZXR1cm4hMH1mdW5jdGlvbipiUyhlLHQpe2xldCBuLHI7Zm9yKGNvbnN0IHMgb2YgZSlyIT09dm9pZCAwJiZ0KHIscyk/bi5wdXNoKHMpOihuJiYoeWllbGQgbiksbj1bc10pLHI9cztuJiYoeWllbGQgbil9ZnVuY3Rpb24gRVMoZSx0KXtmb3IobGV0IG49MDtuPD1lLmxlbmd0aDtuKyspdChuPT09MD92b2lkIDA6ZVtuLTFdLG49PT1lLmxlbmd0aD92b2lkIDA6ZVtuXSl9ZnVuY3Rpb24gdlMoZSx0KXtmb3IobGV0IG49MDtuPGUubGVuZ3RoO24rKyl0KG49PT0wP3ZvaWQgMDplW24tMV0sZVtuXSxuKzE9PT1lLmxlbmd0aD92b2lkIDA6ZVtuKzFdKX1mdW5jdGlvbiBGUyhlLHQpe2Zvcihjb25zdCBuIG9mIHQpZS5wdXNoKG4pfXZhciBZZjsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChpKXtyZXR1cm4gaTwwfWUuaXNMZXNzVGhhbj10O2Z1bmN0aW9uIG4oaSl7cmV0dXJuIGk8PTB9ZS5pc0xlc3NUaGFuT3JFcXVhbD1uO2Z1bmN0aW9uIHIoaSl7cmV0dXJuIGk+MH1lLmlzR3JlYXRlclRoYW49cjtmdW5jdGlvbiBzKGkpe3JldHVybiBpPT09MH1lLmlzTmVpdGhlckxlc3NPckdyZWF0ZXJUaGFuPXMsZS5ncmVhdGVyVGhhbj0xLGUubGVzc1RoYW49LTEsZS5uZWl0aGVyTGVzc09yR3JlYXRlclRoYW49MH0pKFlmfHwoWWY9e30pKTtmdW5jdGlvbiBxdShlLHQpe3JldHVybihuLHIpPT50KGUobiksZShyKSl9Y29uc3QgV3U9KGUsdCk9PmUtdDtmdW5jdGlvbiBBUyhlKXtyZXR1cm4odCxuKT0+LWUodCxuKX1jb25zdCB6bz1jbGFzcyB6b3tjb25zdHJ1Y3Rvcih0KXt0aGlzLml0ZXJhdGU9dH10b0FycmF5KCl7Y29uc3QgdD1bXTtyZXR1cm4gdGhpcy5pdGVyYXRlKG49Pih0LnB1c2gobiksITApKSx0fWZpbHRlcih0KXtyZXR1cm4gbmV3IHpvKG49PnRoaXMuaXRlcmF0ZShyPT50KHIpP24ocik6ITApKX1tYXAodCl7cmV0dXJuIG5ldyB6byhuPT50aGlzLml0ZXJhdGUocj0+bih0KHIpKSkpfWZpbmRMYXN0KHQpe2xldCBuO3JldHVybiB0aGlzLml0ZXJhdGUocj0+KHQocikmJihuPXIpLCEwKSksbn1maW5kTGFzdE1heEJ5KHQpe2xldCBuLHI9ITA7cmV0dXJuIHRoaXMuaXRlcmF0ZShzPT4oKHJ8fFlmLmlzR3JlYXRlclRoYW4odChzLG4pKSkmJihyPSExLG49cyksITApKSxufX07em8uZW1wdHk9bmV3IHpvKHQ9Pnt9KTtsZXQgSjA9em87Y2xhc3MgYnJ7c3RhdGljIHRyaXZpYWwodCxuKXtyZXR1cm4gbmV3IGJyKFtuZXcgT2UobGUub2ZMZW5ndGgodC5sZW5ndGgpLGxlLm9mTGVuZ3RoKG4ubGVuZ3RoKSldLCExKX1zdGF0aWMgdHJpdmlhbFRpbWVkT3V0KHQsbil7cmV0dXJuIG5ldyBicihbbmV3IE9lKGxlLm9mTGVuZ3RoKHQubGVuZ3RoKSxsZS5vZkxlbmd0aChuLmxlbmd0aCkpXSwhMCl9Y29uc3RydWN0b3IodCxuKXt0aGlzLmRpZmZzPXQsdGhpcy5oaXRUaW1lb3V0PW59fWNsYXNzIE9le3N0YXRpYyBpbnZlcnQodCxuKXtjb25zdCByPVtdO3JldHVybiBFUyh0LChzLGkpPT57ci5wdXNoKE9lLmZyb21PZmZzZXRQYWlycyhzP3MuZ2V0RW5kRXhjbHVzaXZlcygpOkVyLnplcm8saT9pLmdldFN0YXJ0cygpOm5ldyBFcihuLChzP3Muc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZS1zLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmU6MCkrbikpKX0pLHJ9c3RhdGljIGZyb21PZmZzZXRQYWlycyh0LG4pe3JldHVybiBuZXcgT2UobmV3IGxlKHQub2Zmc2V0MSxuLm9mZnNldDEpLG5ldyBsZSh0Lm9mZnNldDIsbi5vZmZzZXQyKSl9c3RhdGljIGFzc2VydFNvcnRlZCh0KXtsZXQgbjtmb3IoY29uc3QgciBvZiB0KXtpZihuJiYhKG4uc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZTw9ci5zZXExUmFuZ2Uuc3RhcnQmJm4uc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZTw9ci5zZXEyUmFuZ2Uuc3RhcnQpKXRocm93IG5ldyB6dCgiU2VxdWVuY2UgZGlmZnMgbXVzdCBiZSBzb3J0ZWQiKTtuPXJ9fWNvbnN0cnVjdG9yKHQsbil7dGhpcy5zZXExUmFuZ2U9dCx0aGlzLnNlcTJSYW5nZT1ufXN3YXAoKXtyZXR1cm4gbmV3IE9lKHRoaXMuc2VxMlJhbmdlLHRoaXMuc2VxMVJhbmdlKX10b1N0cmluZygpe3JldHVybmAke3RoaXMuc2VxMVJhbmdlfSA8LT4gJHt0aGlzLnNlcTJSYW5nZX1gfWpvaW4odCl7cmV0dXJuIG5ldyBPZSh0aGlzLnNlcTFSYW5nZS5qb2luKHQuc2VxMVJhbmdlKSx0aGlzLnNlcTJSYW5nZS5qb2luKHQuc2VxMlJhbmdlKSl9ZGVsdGEodCl7cmV0dXJuIHQ9PT0wP3RoaXM6bmV3IE9lKHRoaXMuc2VxMVJhbmdlLmRlbHRhKHQpLHRoaXMuc2VxMlJhbmdlLmRlbHRhKHQpKX1kZWx0YVN0YXJ0KHQpe3JldHVybiB0PT09MD90aGlzOm5ldyBPZSh0aGlzLnNlcTFSYW5nZS5kZWx0YVN0YXJ0KHQpLHRoaXMuc2VxMlJhbmdlLmRlbHRhU3RhcnQodCkpfWRlbHRhRW5kKHQpe3JldHVybiB0PT09MD90aGlzOm5ldyBPZSh0aGlzLnNlcTFSYW5nZS5kZWx0YUVuZCh0KSx0aGlzLnNlcTJSYW5nZS5kZWx0YUVuZCh0KSl9aW50ZXJzZWN0KHQpe2NvbnN0IG49dGhpcy5zZXExUmFuZ2UuaW50ZXJzZWN0KHQuc2VxMVJhbmdlKSxyPXRoaXMuc2VxMlJhbmdlLmludGVyc2VjdCh0LnNlcTJSYW5nZSk7aWYoISghbnx8IXIpKXJldHVybiBuZXcgT2UobixyKX1nZXRTdGFydHMoKXtyZXR1cm4gbmV3IEVyKHRoaXMuc2VxMVJhbmdlLnN0YXJ0LHRoaXMuc2VxMlJhbmdlLnN0YXJ0KX1nZXRFbmRFeGNsdXNpdmVzKCl7cmV0dXJuIG5ldyBFcih0aGlzLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUsdGhpcy5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlKX19Y29uc3Qgdmk9Y2xhc3Mgdml7Y29uc3RydWN0b3IodCxuKXt0aGlzLm9mZnNldDE9dCx0aGlzLm9mZnNldDI9bn10b1N0cmluZygpe3JldHVybmAke3RoaXMub2Zmc2V0MX0gPC0+ICR7dGhpcy5vZmZzZXQyfWB9ZGVsdGEodCl7cmV0dXJuIHQ9PT0wP3RoaXM6bmV3IHZpKHRoaXMub2Zmc2V0MSt0LHRoaXMub2Zmc2V0Mit0KX1lcXVhbHModCl7cmV0dXJuIHRoaXMub2Zmc2V0MT09PXQub2Zmc2V0MSYmdGhpcy5vZmZzZXQyPT09dC5vZmZzZXQyfX07dmkuemVybz1uZXcgdmkoMCwwKSx2aS5tYXg9bmV3IHZpKE51bWJlci5NQVhfU0FGRV9JTlRFR0VSLE51bWJlci5NQVhfU0FGRV9JTlRFR0VSKTtsZXQgRXI9dmk7Y29uc3QgcGY9Y2xhc3MgcGZ7aXNWYWxpZCgpe3JldHVybiEwfX07cGYuaW5zdGFuY2U9bmV3IHBmO2xldCBhYT1wZjtjbGFzcyB3U3tjb25zdHJ1Y3Rvcih0KXtpZih0aGlzLnRpbWVvdXQ9dCx0aGlzLnN0YXJ0VGltZT1EYXRlLm5vdygpLHRoaXMudmFsaWQ9ITAsdDw9MCl0aHJvdyBuZXcgenQoInRpbWVvdXQgbXVzdCBiZSBwb3NpdGl2ZSIpfWlzVmFsaWQoKXtpZighKERhdGUubm93KCktdGhpcy5zdGFydFRpbWU8dGhpcy50aW1lb3V0KSYmdGhpcy52YWxpZCl7dGhpcy52YWxpZD0hMTtkZWJ1Z2dlcn1yZXR1cm4gdGhpcy52YWxpZH19Y2xhc3MgUWZ7Y29uc3RydWN0b3IodCxuKXt0aGlzLndpZHRoPXQsdGhpcy5oZWlnaHQ9bix0aGlzLmFycmF5PVtdLHRoaXMuYXJyYXk9bmV3IEFycmF5KHQqbil9Z2V0KHQsbil7cmV0dXJuIHRoaXMuYXJyYXlbdCtuKnRoaXMud2lkdGhdfXNldCh0LG4scil7dGhpcy5hcnJheVt0K24qdGhpcy53aWR0aF09cn19ZnVuY3Rpb24gWmYoZSl7cmV0dXJuIGU9PT0zMnx8ZT09PTl9Y29uc3QgRXU9Y2xhc3MgRXV7c3RhdGljIGdldEtleSh0KXtsZXQgbj10aGlzLmNocktleXMuZ2V0KHQpO3JldHVybiBuPT09dm9pZCAwJiYobj10aGlzLmNocktleXMuc2l6ZSx0aGlzLmNocktleXMuc2V0KHQsbikpLG59Y29uc3RydWN0b3IodCxuLHIpe3RoaXMucmFuZ2U9dCx0aGlzLmxpbmVzPW4sdGhpcy5zb3VyY2U9cix0aGlzLmhpc3RvZ3JhbT1bXTtsZXQgcz0wO2ZvcihsZXQgaT10LnN0YXJ0TGluZU51bWJlci0xO2k8dC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLTE7aSsrKXtjb25zdCBvPW5baV07Zm9yKGxldCB1PTA7dTxvLmxlbmd0aDt1Kyspe3MrKztjb25zdCBsPW9bdV0sZj1FdS5nZXRLZXkobCk7dGhpcy5oaXN0b2dyYW1bZl09KHRoaXMuaGlzdG9ncmFtW2ZdfHwwKSsxfXMrKztjb25zdCBhPUV1LmdldEtleShgCmApO3RoaXMuaGlzdG9ncmFtW2FdPSh0aGlzLmhpc3RvZ3JhbVthXXx8MCkrMX10aGlzLnRvdGFsQ291bnQ9c31jb21wdXRlU2ltaWxhcml0eSh0KXtsZXQgbj0wO2NvbnN0IHI9TWF0aC5tYXgodGhpcy5oaXN0b2dyYW0ubGVuZ3RoLHQuaGlzdG9ncmFtLmxlbmd0aCk7Zm9yKGxldCBzPTA7czxyO3MrKyluKz1NYXRoLmFicygodGhpcy5oaXN0b2dyYW1bc10/PzApLSh0Lmhpc3RvZ3JhbVtzXT8/MCkpO3JldHVybiAxLW4vKHRoaXMudG90YWxDb3VudCt0LnRvdGFsQ291bnQpfX07RXUuY2hyS2V5cz1uZXcgTWFwO2xldCBIdT1FdTtjbGFzcyBDU3tjb21wdXRlKHQsbixyPWFhLmluc3RhbmNlLHMpe2lmKHQubGVuZ3RoPT09MHx8bi5sZW5ndGg9PT0wKXJldHVybiBici50cml2aWFsKHQsbik7Y29uc3QgaT1uZXcgUWYodC5sZW5ndGgsbi5sZW5ndGgpLG89bmV3IFFmKHQubGVuZ3RoLG4ubGVuZ3RoKSxhPW5ldyBRZih0Lmxlbmd0aCxuLmxlbmd0aCk7Zm9yKGxldCBkPTA7ZDx0Lmxlbmd0aDtkKyspZm9yKGxldCBtPTA7bTxuLmxlbmd0aDttKyspe2lmKCFyLmlzVmFsaWQoKSlyZXR1cm4gYnIudHJpdmlhbFRpbWVkT3V0KHQsbik7Y29uc3QgZz1kPT09MD8wOmkuZ2V0KGQtMSxtKSxEPW09PT0wPzA6aS5nZXQoZCxtLTEpO2xldCBiO3QuZ2V0RWxlbWVudChkKT09PW4uZ2V0RWxlbWVudChtKT8oZD09PTB8fG09PT0wP2I9MDpiPWkuZ2V0KGQtMSxtLTEpLGQ+MCYmbT4wJiZvLmdldChkLTEsbS0xKT09PTMmJihiKz1hLmdldChkLTEsbS0xKSksYis9cz9zKGQsbSk6MSk6Yj0tMTtjb25zdCBFPU1hdGgubWF4KGcsRCxiKTtpZihFPT09Yil7Y29uc3QgRj1kPjAmJm0+MD9hLmdldChkLTEsbS0xKTowO2Euc2V0KGQsbSxGKzEpLG8uc2V0KGQsbSwzKX1lbHNlIEU9PT1nPyhhLnNldChkLG0sMCksby5zZXQoZCxtLDEpKTpFPT09RCYmKGEuc2V0KGQsbSwwKSxvLnNldChkLG0sMikpO2kuc2V0KGQsbSxFKX1jb25zdCB1PVtdO2xldCBsPXQubGVuZ3RoLGY9bi5sZW5ndGg7ZnVuY3Rpb24gYyhkLG0peyhkKzEhPT1sfHxtKzEhPT1mKSYmdS5wdXNoKG5ldyBPZShuZXcgbGUoZCsxLGwpLG5ldyBsZShtKzEsZikpKSxsPWQsZj1tfWxldCBwPXQubGVuZ3RoLTEsaD1uLmxlbmd0aC0xO2Zvcig7cD49MCYmaD49MDspby5nZXQocCxoKT09PTM/KGMocCxoKSxwLS0saC0tKTpvLmdldChwLGgpPT09MT9wLS06aC0tO3JldHVybiBjKC0xLC0xKSx1LnJldmVyc2UoKSxuZXcgYnIodSwhMSl9fWNsYXNzIHowe2NvbXB1dGUodCxuLHI9YWEuaW5zdGFuY2Upe2lmKHQubGVuZ3RoPT09MHx8bi5sZW5ndGg9PT0wKXJldHVybiBici50cml2aWFsKHQsbik7Y29uc3Qgcz10LGk9bjtmdW5jdGlvbiBvKG0sZyl7Zm9yKDttPHMubGVuZ3RoJiZnPGkubGVuZ3RoJiZzLmdldEVsZW1lbnQobSk9PT1pLmdldEVsZW1lbnQoZyk7KW0rKyxnKys7cmV0dXJuIG19bGV0IGE9MDtjb25zdCB1PW5ldyBTUzt1LnNldCgwLG8oMCwwKSk7Y29uc3QgbD1uZXcgeFM7bC5zZXQoMCx1LmdldCgwKT09PTA/bnVsbDpuZXcgRzAobnVsbCwwLDAsdS5nZXQoMCkpKTtsZXQgZj0wO2U6Zm9yKDs7KXtpZihhKyssIXIuaXNWYWxpZCgpKXJldHVybiBici50cml2aWFsVGltZWRPdXQocyxpKTtjb25zdCBtPS1NYXRoLm1pbihhLGkubGVuZ3RoK2ElMiksZz1NYXRoLm1pbihhLHMubGVuZ3RoK2ElMik7Zm9yKGY9bTtmPD1nO2YrPTIpe2NvbnN0IEQ9Zj09PWc/LTE6dS5nZXQoZisxKSxiPWY9PT1tPy0xOnUuZ2V0KGYtMSkrMSxFPU1hdGgubWluKE1hdGgubWF4KEQsYikscy5sZW5ndGgpLEY9RS1mO2lmKEU+cy5sZW5ndGh8fEY+aS5sZW5ndGgpY29udGludWU7Y29uc3Qgdj1vKEUsRik7dS5zZXQoZix2KTtjb25zdCBDPUU9PT1EP2wuZ2V0KGYrMSk6bC5nZXQoZi0xKTtpZihsLnNldChmLHYhPT1FP25ldyBHMChDLEUsRix2LUUpOkMpLHUuZ2V0KGYpPT09cy5sZW5ndGgmJnUuZ2V0KGYpLWY9PT1pLmxlbmd0aClicmVhayBlfX1sZXQgYz1sLmdldChmKTtjb25zdCBwPVtdO2xldCBoPXMubGVuZ3RoLGQ9aS5sZW5ndGg7Zm9yKDs7KXtjb25zdCBtPWM/Yy54K2MubGVuZ3RoOjAsZz1jP2MueStjLmxlbmd0aDowO2lmKChtIT09aHx8ZyE9PWQpJiZwLnB1c2gobmV3IE9lKG5ldyBsZShtLGgpLG5ldyBsZShnLGQpKSksIWMpYnJlYWs7aD1jLngsZD1jLnksYz1jLnByZXZ9cmV0dXJuIHAucmV2ZXJzZSgpLG5ldyBicihwLCExKX19Y2xhc3MgRzB7Y29uc3RydWN0b3IodCxuLHIscyl7dGhpcy5wcmV2PXQsdGhpcy54PW4sdGhpcy55PXIsdGhpcy5sZW5ndGg9c319Y2xhc3MgU1N7Y29uc3RydWN0b3IoKXt0aGlzLnBvc2l0aXZlQXJyPW5ldyBJbnQzMkFycmF5KDEwKSx0aGlzLm5lZ2F0aXZlQXJyPW5ldyBJbnQzMkFycmF5KDEwKX1nZXQodCl7cmV0dXJuIHQ8MD8odD0tdC0xLHRoaXMubmVnYXRpdmVBcnJbdF0pOnRoaXMucG9zaXRpdmVBcnJbdF19c2V0KHQsbil7aWYodDwwKXtpZih0PS10LTEsdD49dGhpcy5uZWdhdGl2ZUFyci5sZW5ndGgpe2NvbnN0IHI9dGhpcy5uZWdhdGl2ZUFycjt0aGlzLm5lZ2F0aXZlQXJyPW5ldyBJbnQzMkFycmF5KHIubGVuZ3RoKjIpLHRoaXMubmVnYXRpdmVBcnIuc2V0KHIpfXRoaXMubmVnYXRpdmVBcnJbdF09bn1lbHNle2lmKHQ+PXRoaXMucG9zaXRpdmVBcnIubGVuZ3RoKXtjb25zdCByPXRoaXMucG9zaXRpdmVBcnI7dGhpcy5wb3NpdGl2ZUFycj1uZXcgSW50MzJBcnJheShyLmxlbmd0aCoyKSx0aGlzLnBvc2l0aXZlQXJyLnNldChyKX10aGlzLnBvc2l0aXZlQXJyW3RdPW59fX1jbGFzcyB4U3tjb25zdHJ1Y3Rvcigpe3RoaXMucG9zaXRpdmVBcnI9W10sdGhpcy5uZWdhdGl2ZUFycj1bXX1nZXQodCl7cmV0dXJuIHQ8MD8odD0tdC0xLHRoaXMubmVnYXRpdmVBcnJbdF0pOnRoaXMucG9zaXRpdmVBcnJbdF19c2V0KHQsbil7dDwwPyh0PS10LTEsdGhpcy5uZWdhdGl2ZUFyclt0XT1uKTp0aGlzLnBvc2l0aXZlQXJyW3RdPW59fWNsYXNzIEp1e2NvbnN0cnVjdG9yKHQsbixyKXt0aGlzLmxpbmVzPXQsdGhpcy5yYW5nZT1uLHRoaXMuY29uc2lkZXJXaGl0ZXNwYWNlQ2hhbmdlcz1yLHRoaXMuZWxlbWVudHM9W10sdGhpcy5maXJzdEVsZW1lbnRPZmZzZXRCeUxpbmVJZHg9W10sdGhpcy5saW5lU3RhcnRPZmZzZXRzPVtdLHRoaXMudHJpbW1lZFdzTGVuZ3Roc0J5TGluZUlkeD1bXSx0aGlzLmZpcnN0RWxlbWVudE9mZnNldEJ5TGluZUlkeC5wdXNoKDApO2ZvcihsZXQgcz10aGlzLnJhbmdlLnN0YXJ0TGluZU51bWJlcjtzPD10aGlzLnJhbmdlLmVuZExpbmVOdW1iZXI7cysrKXtsZXQgaT10W3MtMV0sbz0wO3M9PT10aGlzLnJhbmdlLnN0YXJ0TGluZU51bWJlciYmdGhpcy5yYW5nZS5zdGFydENvbHVtbj4xJiYobz10aGlzLnJhbmdlLnN0YXJ0Q29sdW1uLTEsaT1pLnN1YnN0cmluZyhvKSksdGhpcy5saW5lU3RhcnRPZmZzZXRzLnB1c2gobyk7bGV0IGE9MDtpZighcil7Y29uc3QgbD1pLnRyaW1TdGFydCgpO2E9aS5sZW5ndGgtbC5sZW5ndGgsaT1sLnRyaW1FbmQoKX10aGlzLnRyaW1tZWRXc0xlbmd0aHNCeUxpbmVJZHgucHVzaChhKTtjb25zdCB1PXM9PT10aGlzLnJhbmdlLmVuZExpbmVOdW1iZXI/TWF0aC5taW4odGhpcy5yYW5nZS5lbmRDb2x1bW4tMS1vLWEsaS5sZW5ndGgpOmkubGVuZ3RoO2ZvcihsZXQgbD0wO2w8dTtsKyspdGhpcy5lbGVtZW50cy5wdXNoKGkuY2hhckNvZGVBdChsKSk7czx0aGlzLnJhbmdlLmVuZExpbmVOdW1iZXImJih0aGlzLmVsZW1lbnRzLnB1c2goMTApLHRoaXMuZmlyc3RFbGVtZW50T2Zmc2V0QnlMaW5lSWR4LnB1c2godGhpcy5lbGVtZW50cy5sZW5ndGgpKX19dG9TdHJpbmcoKXtyZXR1cm5gU2xpY2U6ICIke3RoaXMudGV4dH0iYH1nZXQgdGV4dCgpe3JldHVybiB0aGlzLmdldFRleHQobmV3IGxlKDAsdGhpcy5sZW5ndGgpKX1nZXRUZXh0KHQpe3JldHVybiB0aGlzLmVsZW1lbnRzLnNsaWNlKHQuc3RhcnQsdC5lbmRFeGNsdXNpdmUpLm1hcChuPT5TdHJpbmcuZnJvbUNoYXJDb2RlKG4pKS5qb2luKCIiKX1nZXRFbGVtZW50KHQpe3JldHVybiB0aGlzLmVsZW1lbnRzW3RdfWdldCBsZW5ndGgoKXtyZXR1cm4gdGhpcy5lbGVtZW50cy5sZW5ndGh9Z2V0Qm91bmRhcnlTY29yZSh0KXtjb25zdCBuPVgwKHQ+MD90aGlzLmVsZW1lbnRzW3QtMV06LTEpLHI9WDAodDx0aGlzLmVsZW1lbnRzLmxlbmd0aD90aGlzLmVsZW1lbnRzW3RdOi0xKTtpZihuPT09NyYmcj09PTgpcmV0dXJuIDA7aWYobj09PTgpcmV0dXJuIDE1MDtsZXQgcz0wO3JldHVybiBuIT09ciYmKHMrPTEwLG49PT0wJiZyPT09MSYmKHMrPTEpKSxzKz1LMChuKSxzKz1LMChyKSxzfXRyYW5zbGF0ZU9mZnNldCh0LG49InJpZ2h0Iil7Y29uc3Qgcj1pYSh0aGlzLmZpcnN0RWxlbWVudE9mZnNldEJ5TGluZUlkeCxpPT5pPD10KSxzPXQtdGhpcy5maXJzdEVsZW1lbnRPZmZzZXRCeUxpbmVJZHhbcl07cmV0dXJuIG5ldyBKZSh0aGlzLnJhbmdlLnN0YXJ0TGluZU51bWJlcityLDErdGhpcy5saW5lU3RhcnRPZmZzZXRzW3JdK3MrKHM9PT0wJiZuPT09ImxlZnQiPzA6dGhpcy50cmltbWVkV3NMZW5ndGhzQnlMaW5lSWR4W3JdKSl9dHJhbnNsYXRlUmFuZ2UodCl7Y29uc3Qgbj10aGlzLnRyYW5zbGF0ZU9mZnNldCh0LnN0YXJ0LCJyaWdodCIpLHI9dGhpcy50cmFuc2xhdGVPZmZzZXQodC5lbmRFeGNsdXNpdmUsImxlZnQiKTtyZXR1cm4gci5pc0JlZm9yZShuKT9oZS5mcm9tUG9zaXRpb25zKHIscik6aGUuZnJvbVBvc2l0aW9ucyhuLHIpfWZpbmRXb3JkQ29udGFpbmluZyh0KXtpZih0PDB8fHQ+PXRoaXMuZWxlbWVudHMubGVuZ3RofHwhZXAodGhpcy5lbGVtZW50c1t0XSkpcmV0dXJuO2xldCBuPXQ7Zm9yKDtuPjAmJmVwKHRoaXMuZWxlbWVudHNbbi0xXSk7KW4tLTtsZXQgcj10O2Zvcig7cjx0aGlzLmVsZW1lbnRzLmxlbmd0aCYmZXAodGhpcy5lbGVtZW50c1tyXSk7KXIrKztyZXR1cm4gbmV3IGxlKG4scil9Y291bnRMaW5lc0luKHQpe3JldHVybiB0aGlzLnRyYW5zbGF0ZU9mZnNldCh0LmVuZEV4Y2x1c2l2ZSkubGluZU51bWJlci10aGlzLnRyYW5zbGF0ZU9mZnNldCh0LnN0YXJ0KS5saW5lTnVtYmVyfWlzU3Ryb25nbHlFcXVhbCh0LG4pe3JldHVybiB0aGlzLmVsZW1lbnRzW3RdPT09dGhpcy5lbGVtZW50c1tuXX1leHRlbmRUb0Z1bGxMaW5lcyh0KXtjb25zdCBuPV9pKHRoaXMuZmlyc3RFbGVtZW50T2Zmc2V0QnlMaW5lSWR4LHM9PnM8PXQuc3RhcnQpPz8wLHI9ZlModGhpcy5maXJzdEVsZW1lbnRPZmZzZXRCeUxpbmVJZHgscz0+dC5lbmRFeGNsdXNpdmU8PXMpPz90aGlzLmVsZW1lbnRzLmxlbmd0aDtyZXR1cm4gbmV3IGxlKG4scil9fWZ1bmN0aW9uIGVwKGUpe3JldHVybiBlPj05NyYmZTw9MTIyfHxlPj02NSYmZTw9OTB8fGU+PTQ4JiZlPD01N31jb25zdCBrUz17MDowLDE6MCwyOjAsMzoxMCw0OjIsNTozMCw2OjMsNzoxMCw4OjEwfTtmdW5jdGlvbiBLMChlKXtyZXR1cm4ga1NbZV19ZnVuY3Rpb24gWDAoZSl7cmV0dXJuIGU9PT0xMD84OmU9PT0xMz83OlpmKGUpPzY6ZT49OTcmJmU8PTEyMj8wOmU+PTY1JiZlPD05MD8xOmU+PTQ4JiZlPD01Nz8yOmU9PT0tMT8zOmU9PT00NHx8ZT09PTU5PzU6NH1mdW5jdGlvbiBUUyhlLHQsbixyLHMsaSl7bGV0e21vdmVzOm8sZXhjbHVkZWRDaGFuZ2VzOmF9PUxTKGUsdCxuLGkpO2lmKCFpLmlzVmFsaWQoKSlyZXR1cm5bXTtjb25zdCB1PWUuZmlsdGVyKGY9PiFhLmhhcyhmKSksbD0kUyh1LHIscyx0LG4saSk7cmV0dXJuIEZTKG8sbCksbz1CUyhvKSxvPW8uZmlsdGVyKGY9Pntjb25zdCBjPWYub3JpZ2luYWwudG9PZmZzZXRSYW5nZSgpLnNsaWNlKHQpLm1hcChoPT5oLnRyaW0oKSk7cmV0dXJuIGMuam9pbihgCmApLmxlbmd0aD49MTUmJk5TKGMsaD0+aC5sZW5ndGg+PTIpPj0yfSksbz1fUyhlLG8pLG99ZnVuY3Rpb24gTlMoZSx0KXtsZXQgbj0wO2Zvcihjb25zdCByIG9mIGUpdChyKSYmbisrO3JldHVybiBufWZ1bmN0aW9uIExTKGUsdCxuLHIpe2NvbnN0IHM9W10saT1lLmZpbHRlcih1PT51Lm1vZGlmaWVkLmlzRW1wdHkmJnUub3JpZ2luYWwubGVuZ3RoPj0zKS5tYXAodT0+bmV3IEh1KHUub3JpZ2luYWwsdCx1KSksbz1uZXcgU2V0KGUuZmlsdGVyKHU9PnUub3JpZ2luYWwuaXNFbXB0eSYmdS5tb2RpZmllZC5sZW5ndGg+PTMpLm1hcCh1PT5uZXcgSHUodS5tb2RpZmllZCxuLHUpKSksYT1uZXcgU2V0O2Zvcihjb25zdCB1IG9mIGkpe2xldCBsPS0xLGY7Zm9yKGNvbnN0IGMgb2Ygbyl7Y29uc3QgcD11LmNvbXB1dGVTaW1pbGFyaXR5KGMpO3A+bCYmKGw9cCxmPWMpfWlmKGw+LjkmJmYmJihvLmRlbGV0ZShmKSxzLnB1c2gobmV3IGNuKHUucmFuZ2UsZi5yYW5nZSkpLGEuYWRkKHUuc291cmNlKSxhLmFkZChmLnNvdXJjZSkpLCFyLmlzVmFsaWQoKSlyZXR1cm57bW92ZXM6cyxleGNsdWRlZENoYW5nZXM6YX19cmV0dXJue21vdmVzOnMsZXhjbHVkZWRDaGFuZ2VzOmF9fWZ1bmN0aW9uICRTKGUsdCxuLHIscyxpKXtjb25zdCBvPVtdLGE9bmV3IFk4O2Zvcihjb25zdCBwIG9mIGUpZm9yKGxldCBoPXAub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyO2g8cC5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLTI7aCsrKXtjb25zdCBkPWAke3RbaC0xXX06JHt0W2grMS0xXX06JHt0W2grMi0xXX1gO2EuYWRkKGQse3JhbmdlOm5ldyBpZShoLGgrMyl9KX1jb25zdCB1PVtdO2Uuc29ydChxdShwPT5wLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcixXdSkpO2Zvcihjb25zdCBwIG9mIGUpe2xldCBoPVtdO2ZvcihsZXQgZD1wLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcjtkPHAubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZS0yO2QrKyl7Y29uc3QgbT1gJHtuW2QtMV19OiR7bltkKzEtMV19OiR7bltkKzItMV19YCxnPW5ldyBpZShkLGQrMyksRD1bXTthLmZvckVhY2gobSwoe3JhbmdlOmJ9KT0+e2Zvcihjb25zdCBGIG9mIGgpaWYoRi5vcmlnaW5hbExpbmVSYW5nZS5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKzE9PT1iLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUmJkYubW9kaWZpZWRMaW5lUmFuZ2UuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSsxPT09Zy5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKXtGLm9yaWdpbmFsTGluZVJhbmdlPW5ldyBpZShGLm9yaWdpbmFsTGluZVJhbmdlLnN0YXJ0TGluZU51bWJlcixiLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpLEYubW9kaWZpZWRMaW5lUmFuZ2U9bmV3IGllKEYubW9kaWZpZWRMaW5lUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLGcuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSksRC5wdXNoKEYpO3JldHVybn1jb25zdCBFPXttb2RpZmllZExpbmVSYW5nZTpnLG9yaWdpbmFsTGluZVJhbmdlOmJ9O3UucHVzaChFKSxELnB1c2goRSl9KSxoPUR9aWYoIWkuaXNWYWxpZCgpKXJldHVybltdfXUuc29ydChBUyhxdShwPT5wLm1vZGlmaWVkTGluZVJhbmdlLmxlbmd0aCxXdSkpKTtjb25zdCBsPW5ldyBYbixmPW5ldyBYbjtmb3IoY29uc3QgcCBvZiB1KXtjb25zdCBoPXAubW9kaWZpZWRMaW5lUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLXAub3JpZ2luYWxMaW5lUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLGQ9bC5zdWJ0cmFjdEZyb20ocC5tb2RpZmllZExpbmVSYW5nZSksbT1mLnN1YnRyYWN0RnJvbShwLm9yaWdpbmFsTGluZVJhbmdlKS5nZXRXaXRoRGVsdGEoaCksZz1kLmdldEludGVyc2VjdGlvbihtKTtmb3IoY29uc3QgRCBvZiBnLnJhbmdlcyl7aWYoRC5sZW5ndGg8Myljb250aW51ZTtjb25zdCBiPUQsRT1ELmRlbHRhKC1oKTtvLnB1c2gobmV3IGNuKEUsYikpLGwuYWRkUmFuZ2UoYiksZi5hZGRSYW5nZShFKX19by5zb3J0KHF1KHA9PnAub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLFd1KSk7Y29uc3QgYz1uZXcgVXUoZSk7Zm9yKGxldCBwPTA7cDxvLmxlbmd0aDtwKyspe2NvbnN0IGg9b1twXSxkPWMuZmluZExhc3RNb25vdG9ub3VzKEM9PkMub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyPD1oLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlciksbT1faShlLEM9PkMubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyPD1oLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlciksZz1NYXRoLm1heChoLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlci1kLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcixoLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlci1tLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlciksRD1jLmZpbmRMYXN0TW9ub3Rvbm91cyhDPT5DLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcjxoLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpLGI9X2koZSxDPT5DLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcjxoLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpLEU9TWF0aC5tYXgoRC5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLWgub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxiLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUtaC5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlKTtsZXQgRjtmb3IoRj0wO0Y8ZztGKyspe2NvbnN0IEM9aC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItRi0xLEE9aC5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItRi0xO2lmKEM+ci5sZW5ndGh8fEE+cy5sZW5ndGh8fGwuY29udGFpbnMoQSl8fGYuY29udGFpbnMoQyl8fCFZMChyW0MtMV0sc1tBLTFdLGkpKWJyZWFrfUY+MCYmKGYuYWRkUmFuZ2UobmV3IGllKGgub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLUYsaC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIpKSxsLmFkZFJhbmdlKG5ldyBpZShoLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlci1GLGgubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyKSkpO2xldCB2O2Zvcih2PTA7djxFO3YrKyl7Y29uc3QgQz1oLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUrdixBPWgubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSt2O2lmKEM+ci5sZW5ndGh8fEE+cy5sZW5ndGh8fGwuY29udGFpbnMoQSl8fGYuY29udGFpbnMoQyl8fCFZMChyW0MtMV0sc1tBLTFdLGkpKWJyZWFrfXY+MCYmKGYuYWRkUmFuZ2UobmV3IGllKGgub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxoLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUrdikpLGwuYWRkUmFuZ2UobmV3IGllKGgubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxoLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUrdikpKSwoRj4wfHx2PjApJiYob1twXT1uZXcgY24obmV3IGllKGgub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLUYsaC5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlK3YpLG5ldyBpZShoLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlci1GLGgubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSt2KSkpfXJldHVybiBvfWZ1bmN0aW9uIFkwKGUsdCxuKXtpZihlLnRyaW0oKT09PXQudHJpbSgpKXJldHVybiEwO2lmKGUubGVuZ3RoPjMwMCYmdC5sZW5ndGg+MzAwKXJldHVybiExO2NvbnN0IHM9bmV3IHowKCkuY29tcHV0ZShuZXcgSnUoW2VdLG5ldyBoZSgxLDEsMSxlLmxlbmd0aCksITEpLG5ldyBKdShbdF0sbmV3IGhlKDEsMSwxLHQubGVuZ3RoKSwhMSksbik7bGV0IGk9MDtjb25zdCBvPU9lLmludmVydChzLmRpZmZzLGUubGVuZ3RoKTtmb3IoY29uc3QgZiBvZiBvKWYuc2VxMVJhbmdlLmZvckVhY2goYz0+e1pmKGUuY2hhckNvZGVBdChjKSl8fGkrK30pO2Z1bmN0aW9uIGEoZil7bGV0IGM9MDtmb3IobGV0IHA9MDtwPGUubGVuZ3RoO3ArKylaZihmLmNoYXJDb2RlQXQocCkpfHxjKys7cmV0dXJuIGN9Y29uc3QgdT1hKGUubGVuZ3RoPnQubGVuZ3RoP2U6dCk7cmV0dXJuIGkvdT4uNiYmdT4xMH1mdW5jdGlvbiBCUyhlKXtpZihlLmxlbmd0aD09PTApcmV0dXJuIGU7ZS5zb3J0KHF1KG49Pm4ub3JpZ2luYWwuc3RhcnRMaW5lTnVtYmVyLFd1KSk7Y29uc3QgdD1bZVswXV07Zm9yKGxldCBuPTE7bjxlLmxlbmd0aDtuKyspe2NvbnN0IHI9dFt0Lmxlbmd0aC0xXSxzPWVbbl0saT1zLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlci1yLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUsbz1zLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlci1yLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU7aWYoaT49MCYmbz49MCYmaStvPD0yKXt0W3QubGVuZ3RoLTFdPXIuam9pbihzKTtjb250aW51ZX10LnB1c2gocyl9cmV0dXJuIHR9ZnVuY3Rpb24gX1MoZSx0KXtjb25zdCBuPW5ldyBVdShlKTtyZXR1cm4gdD10LmZpbHRlcihyPT57Y29uc3Qgcz1uLmZpbmRMYXN0TW9ub3Rvbm91cyhhPT5hLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcjxyLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpfHxuZXcgY24obmV3IGllKDEsMSksbmV3IGllKDEsMSkpLGk9X2koZSxhPT5hLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcjxyLm1vZGlmaWVkLmVuZExpbmVOdW1iZXJFeGNsdXNpdmUpO3JldHVybiBzIT09aX0pLHR9ZnVuY3Rpb24gUTAoZSx0LG4pe2xldCByPW47cmV0dXJuIHI9WjAoZSx0LHIpLHI9WjAoZSx0LHIpLHI9SVMoZSx0LHIpLHJ9ZnVuY3Rpb24gWjAoZSx0LG4pe2lmKG4ubGVuZ3RoPT09MClyZXR1cm4gbjtjb25zdCByPVtdO3IucHVzaChuWzBdKTtmb3IobGV0IGk9MTtpPG4ubGVuZ3RoO2krKyl7Y29uc3Qgbz1yW3IubGVuZ3RoLTFdO2xldCBhPW5baV07aWYoYS5zZXExUmFuZ2UuaXNFbXB0eXx8YS5zZXEyUmFuZ2UuaXNFbXB0eSl7Y29uc3QgdT1hLnNlcTFSYW5nZS5zdGFydC1vLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmU7bGV0IGw7Zm9yKGw9MTtsPD11JiYhKGUuZ2V0RWxlbWVudChhLnNlcTFSYW5nZS5zdGFydC1sKSE9PWUuZ2V0RWxlbWVudChhLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUtbCl8fHQuZ2V0RWxlbWVudChhLnNlcTJSYW5nZS5zdGFydC1sKSE9PXQuZ2V0RWxlbWVudChhLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUtbCkpO2wrKyk7aWYobC0tLGw9PT11KXtyW3IubGVuZ3RoLTFdPW5ldyBPZShuZXcgbGUoby5zZXExUmFuZ2Uuc3RhcnQsYS5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlLXUpLG5ldyBsZShvLnNlcTJSYW5nZS5zdGFydCxhLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUtdSkpO2NvbnRpbnVlfWE9YS5kZWx0YSgtbCl9ci5wdXNoKGEpfWNvbnN0IHM9W107Zm9yKGxldCBpPTA7aTxyLmxlbmd0aC0xO2krKyl7Y29uc3Qgbz1yW2krMV07bGV0IGE9cltpXTtpZihhLnNlcTFSYW5nZS5pc0VtcHR5fHxhLnNlcTJSYW5nZS5pc0VtcHR5KXtjb25zdCB1PW8uc2VxMVJhbmdlLnN0YXJ0LWEuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZTtsZXQgbDtmb3IobD0wO2w8dSYmISghZS5pc1N0cm9uZ2x5RXF1YWwoYS5zZXExUmFuZ2Uuc3RhcnQrbCxhLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUrbCl8fCF0LmlzU3Ryb25nbHlFcXVhbChhLnNlcTJSYW5nZS5zdGFydCtsLGEuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZStsKSk7bCsrKTtpZihsPT09dSl7cltpKzFdPW5ldyBPZShuZXcgbGUoYS5zZXExUmFuZ2Uuc3RhcnQrdSxvLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUpLG5ldyBsZShhLnNlcTJSYW5nZS5zdGFydCt1LG8uc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZSkpO2NvbnRpbnVlfWw+MCYmKGE9YS5kZWx0YShsKSl9cy5wdXNoKGEpfXJldHVybiByLmxlbmd0aD4wJiZzLnB1c2gocltyLmxlbmd0aC0xXSksc31mdW5jdGlvbiBJUyhlLHQsbil7aWYoIWUuZ2V0Qm91bmRhcnlTY29yZXx8IXQuZ2V0Qm91bmRhcnlTY29yZSlyZXR1cm4gbjtmb3IobGV0IHI9MDtyPG4ubGVuZ3RoO3IrKyl7Y29uc3Qgcz1yPjA/bltyLTFdOnZvaWQgMCxpPW5bcl0sbz1yKzE8bi5sZW5ndGg/bltyKzFdOnZvaWQgMCxhPW5ldyBsZShzP3Muc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSsxOjAsbz9vLnNlcTFSYW5nZS5zdGFydC0xOmUubGVuZ3RoKSx1PW5ldyBsZShzP3Muc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZSsxOjAsbz9vLnNlcTJSYW5nZS5zdGFydC0xOnQubGVuZ3RoKTtpLnNlcTFSYW5nZS5pc0VtcHR5P25bcl09ZWcoaSxlLHQsYSx1KTppLnNlcTJSYW5nZS5pc0VtcHR5JiYobltyXT1lZyhpLnN3YXAoKSx0LGUsdSxhKS5zd2FwKCkpfXJldHVybiBufWZ1bmN0aW9uIGVnKGUsdCxuLHIscyl7bGV0IG89MTtmb3IoO2Uuc2VxMVJhbmdlLnN0YXJ0LW8+PXIuc3RhcnQmJmUuc2VxMlJhbmdlLnN0YXJ0LW8+PXMuc3RhcnQmJm4uaXNTdHJvbmdseUVxdWFsKGUuc2VxMlJhbmdlLnN0YXJ0LW8sZS5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlLW8pJiZvPDEwMDspbysrO28tLTtsZXQgYT0wO2Zvcig7ZS5zZXExUmFuZ2Uuc3RhcnQrYTxyLmVuZEV4Y2x1c2l2ZSYmZS5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlK2E8cy5lbmRFeGNsdXNpdmUmJm4uaXNTdHJvbmdseUVxdWFsKGUuc2VxMlJhbmdlLnN0YXJ0K2EsZS5zZXEyUmFuZ2UuZW5kRXhjbHVzaXZlK2EpJiZhPDEwMDspYSsrO2lmKG89PT0wJiZhPT09MClyZXR1cm4gZTtsZXQgdT0wLGw9LTE7Zm9yKGxldCBmPS1vO2Y8PWE7ZisrKXtjb25zdCBjPWUuc2VxMlJhbmdlLnN0YXJ0K2YscD1lLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUrZixoPWUuc2VxMVJhbmdlLnN0YXJ0K2YsZD10LmdldEJvdW5kYXJ5U2NvcmUoaCkrbi5nZXRCb3VuZGFyeVNjb3JlKGMpK24uZ2V0Qm91bmRhcnlTY29yZShwKTtkPmwmJihsPWQsdT1mKX1yZXR1cm4gZS5kZWx0YSh1KX1mdW5jdGlvbiBQUyhlLHQsbil7Y29uc3Qgcj1bXTtmb3IoY29uc3QgcyBvZiBuKXtjb25zdCBpPXJbci5sZW5ndGgtMV07aWYoIWkpe3IucHVzaChzKTtjb250aW51ZX1zLnNlcTFSYW5nZS5zdGFydC1pLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmU8PTJ8fHMuc2VxMlJhbmdlLnN0YXJ0LWkuc2VxMlJhbmdlLmVuZEV4Y2x1c2l2ZTw9Mj9yW3IubGVuZ3RoLTFdPW5ldyBPZShpLnNlcTFSYW5nZS5qb2luKHMuc2VxMVJhbmdlKSxpLnNlcTJSYW5nZS5qb2luKHMuc2VxMlJhbmdlKSk6ci5wdXNoKHMpfXJldHVybiByfWZ1bmN0aW9uIE1TKGUsdCxuKXtjb25zdCByPU9lLmludmVydChuLGUubGVuZ3RoKSxzPVtdO2xldCBpPW5ldyBFcigwLDApO2Z1bmN0aW9uIG8odSxsKXtpZih1Lm9mZnNldDE8aS5vZmZzZXQxfHx1Lm9mZnNldDI8aS5vZmZzZXQyKXJldHVybjtjb25zdCBmPWUuZmluZFdvcmRDb250YWluaW5nKHUub2Zmc2V0MSksYz10LmZpbmRXb3JkQ29udGFpbmluZyh1Lm9mZnNldDIpO2lmKCFmfHwhYylyZXR1cm47bGV0IHA9bmV3IE9lKGYsYyk7Y29uc3QgaD1wLmludGVyc2VjdChsKTtsZXQgZD1oLnNlcTFSYW5nZS5sZW5ndGgsbT1oLnNlcTJSYW5nZS5sZW5ndGg7Zm9yKDtyLmxlbmd0aD4wOyl7Y29uc3QgZz1yWzBdO2lmKCEoZy5zZXExUmFuZ2UuaW50ZXJzZWN0cyhwLnNlcTFSYW5nZSl8fGcuc2VxMlJhbmdlLmludGVyc2VjdHMocC5zZXEyUmFuZ2UpKSlicmVhaztjb25zdCBiPWUuZmluZFdvcmRDb250YWluaW5nKGcuc2VxMVJhbmdlLnN0YXJ0KSxFPXQuZmluZFdvcmRDb250YWluaW5nKGcuc2VxMlJhbmdlLnN0YXJ0KSxGPW5ldyBPZShiLEUpLHY9Ri5pbnRlcnNlY3QoZyk7aWYoZCs9di5zZXExUmFuZ2UubGVuZ3RoLG0rPXYuc2VxMlJhbmdlLmxlbmd0aCxwPXAuam9pbihGKSxwLnNlcTFSYW5nZS5lbmRFeGNsdXNpdmU+PWcuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSlyLnNoaWZ0KCk7ZWxzZSBicmVha31kK208KHAuc2VxMVJhbmdlLmxlbmd0aCtwLnNlcTJSYW5nZS5sZW5ndGgpKjIvMyYmcy5wdXNoKHApLGk9cC5nZXRFbmRFeGNsdXNpdmVzKCl9Zm9yKDtyLmxlbmd0aD4wOyl7Y29uc3QgdT1yLnNoaWZ0KCk7dS5zZXExUmFuZ2UuaXNFbXB0eXx8KG8odS5nZXRTdGFydHMoKSx1KSxvKHUuZ2V0RW5kRXhjbHVzaXZlcygpLmRlbHRhKC0xKSx1KSl9cmV0dXJuIE9TKG4scyl9ZnVuY3Rpb24gT1MoZSx0KXtjb25zdCBuPVtdO2Zvcig7ZS5sZW5ndGg+MHx8dC5sZW5ndGg+MDspe2NvbnN0IHI9ZVswXSxzPXRbMF07bGV0IGk7ciYmKCFzfHxyLnNlcTFSYW5nZS5zdGFydDxzLnNlcTFSYW5nZS5zdGFydCk/aT1lLnNoaWZ0KCk6aT10LnNoaWZ0KCksbi5sZW5ndGg+MCYmbltuLmxlbmd0aC0xXS5zZXExUmFuZ2UuZW5kRXhjbHVzaXZlPj1pLnNlcTFSYW5nZS5zdGFydD9uW24ubGVuZ3RoLTFdPW5bbi5sZW5ndGgtMV0uam9pbihpKTpuLnB1c2goaSl9cmV0dXJuIG59ZnVuY3Rpb24gUlMoZSx0LG4pe2xldCByPW47aWYoci5sZW5ndGg9PT0wKXJldHVybiByO2xldCBzPTAsaTtkb3tpPSExO2NvbnN0IG89W3JbMF1dO2ZvcihsZXQgYT0xO2E8ci5sZW5ndGg7YSsrKXtsZXQgZj1mdW5jdGlvbihwLGgpe2NvbnN0IGQ9bmV3IGxlKGwuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSx1LnNlcTFSYW5nZS5zdGFydCk7cmV0dXJuIGUuZ2V0VGV4dChkKS5yZXBsYWNlKC9ccy9nLCIiKS5sZW5ndGg8PTQmJihwLnNlcTFSYW5nZS5sZW5ndGgrcC5zZXEyUmFuZ2UubGVuZ3RoPjV8fGguc2VxMVJhbmdlLmxlbmd0aCtoLnNlcTJSYW5nZS5sZW5ndGg+NSl9O2NvbnN0IHU9clthXSxsPW9bby5sZW5ndGgtMV07ZihsLHUpPyhpPSEwLG9bby5sZW5ndGgtMV09b1tvLmxlbmd0aC0xXS5qb2luKHUpKTpvLnB1c2godSl9cj1vfXdoaWxlKHMrKzwxMCYmaSk7cmV0dXJuIHJ9ZnVuY3Rpb24galMoZSx0LG4pe2xldCByPW47aWYoci5sZW5ndGg9PT0wKXJldHVybiByO2xldCBzPTAsaTtkb3tpPSExO2NvbnN0IGE9W3JbMF1dO2ZvcihsZXQgdT0xO3U8ci5sZW5ndGg7dSsrKXtsZXQgYz1mdW5jdGlvbihoLGQpe2NvbnN0IG09bmV3IGxlKGYuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSxsLnNlcTFSYW5nZS5zdGFydCk7aWYoZS5jb3VudExpbmVzSW4obSk+NXx8bS5sZW5ndGg+NTAwKXJldHVybiExO2NvbnN0IEQ9ZS5nZXRUZXh0KG0pLnRyaW0oKTtpZihELmxlbmd0aD4yMHx8RC5zcGxpdCgvXHJcbnxccnxcbi8pLmxlbmd0aD4xKXJldHVybiExO2NvbnN0IGI9ZS5jb3VudExpbmVzSW4oaC5zZXExUmFuZ2UpLEU9aC5zZXExUmFuZ2UubGVuZ3RoLEY9dC5jb3VudExpbmVzSW4oaC5zZXEyUmFuZ2UpLHY9aC5zZXEyUmFuZ2UubGVuZ3RoLEM9ZS5jb3VudExpbmVzSW4oZC5zZXExUmFuZ2UpLEE9ZC5zZXExUmFuZ2UubGVuZ3RoLHc9dC5jb3VudExpbmVzSW4oZC5zZXEyUmFuZ2UpLFQ9ZC5zZXEyUmFuZ2UubGVuZ3RoLE49Mio0MCs1MDtmdW5jdGlvbiB4KEwpe3JldHVybiBNYXRoLm1pbihMLE4pfXJldHVybiBNYXRoLnBvdyhNYXRoLnBvdyh4KGIqNDArRSksMS41KStNYXRoLnBvdyh4KEYqNDArdiksMS41KSwxLjUpK01hdGgucG93KE1hdGgucG93KHgoQyo0MCtBKSwxLjUpK01hdGgucG93KHgodyo0MCtUKSwxLjUpLDEuNSk+KE4qKjEuNSkqKjEuNSoxLjN9O2NvbnN0IGw9clt1XSxmPWFbYS5sZW5ndGgtMV07YyhmLGwpPyhpPSEwLGFbYS5sZW5ndGgtMV09YVthLmxlbmd0aC0xXS5qb2luKGwpKTphLnB1c2gobCl9cj1hfXdoaWxlKHMrKzwxMCYmaSk7Y29uc3Qgbz1bXTtyZXR1cm4gdlMociwoYSx1LGwpPT57bGV0IGY9dTtmdW5jdGlvbiBjKEQpe3JldHVybiBELmxlbmd0aD4wJiZELnRyaW0oKS5sZW5ndGg8PTMmJnUuc2VxMVJhbmdlLmxlbmd0aCt1LnNlcTJSYW5nZS5sZW5ndGg+MTAwfWNvbnN0IHA9ZS5leHRlbmRUb0Z1bGxMaW5lcyh1LnNlcTFSYW5nZSksaD1lLmdldFRleHQobmV3IGxlKHAuc3RhcnQsdS5zZXExUmFuZ2Uuc3RhcnQpKTtjKGgpJiYoZj1mLmRlbHRhU3RhcnQoLWgubGVuZ3RoKSk7Y29uc3QgZD1lLmdldFRleHQobmV3IGxlKHUuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSxwLmVuZEV4Y2x1c2l2ZSkpO2MoZCkmJihmPWYuZGVsdGFFbmQoZC5sZW5ndGgpKTtjb25zdCBtPU9lLmZyb21PZmZzZXRQYWlycyhhP2EuZ2V0RW5kRXhjbHVzaXZlcygpOkVyLnplcm8sbD9sLmdldFN0YXJ0cygpOkVyLm1heCksZz1mLmludGVyc2VjdChtKTtvLmxlbmd0aD4wJiZnLmdldFN0YXJ0cygpLmVxdWFscyhvW28ubGVuZ3RoLTFdLmdldEVuZEV4Y2x1c2l2ZXMoKSk/b1tvLmxlbmd0aC0xXT1vW28ubGVuZ3RoLTFdLmpvaW4oZyk6by5wdXNoKGcpfSksb31jbGFzcyB0Z3tjb25zdHJ1Y3Rvcih0LG4pe3RoaXMudHJpbW1lZEhhc2g9dCx0aGlzLmxpbmVzPW59Z2V0RWxlbWVudCh0KXtyZXR1cm4gdGhpcy50cmltbWVkSGFzaFt0XX1nZXQgbGVuZ3RoKCl7cmV0dXJuIHRoaXMudHJpbW1lZEhhc2gubGVuZ3RofWdldEJvdW5kYXJ5U2NvcmUodCl7Y29uc3Qgbj10PT09MD8wOm5nKHRoaXMubGluZXNbdC0xXSkscj10PT09dGhpcy5saW5lcy5sZW5ndGg/MDpuZyh0aGlzLmxpbmVzW3RdKTtyZXR1cm4gMWUzLShuK3IpfWdldFRleHQodCl7cmV0dXJuIHRoaXMubGluZXMuc2xpY2UodC5zdGFydCx0LmVuZEV4Y2x1c2l2ZSkuam9pbihgCmApfWlzU3Ryb25nbHlFcXVhbCh0LG4pe3JldHVybiB0aGlzLmxpbmVzW3RdPT09dGhpcy5saW5lc1tuXX19ZnVuY3Rpb24gbmcoZSl7bGV0IHQ9MDtmb3IoO3Q8ZS5sZW5ndGgmJihlLmNoYXJDb2RlQXQodCk9PT0zMnx8ZS5jaGFyQ29kZUF0KHQpPT09OSk7KXQrKztyZXR1cm4gdH1jbGFzcyBWU3tjb25zdHJ1Y3Rvcigpe3RoaXMuZHluYW1pY1Byb2dyYW1taW5nRGlmZmluZz1uZXcgQ1MsdGhpcy5teWVyc0RpZmZpbmdBbGdvcml0aG09bmV3IHowfWNvbXB1dGVEaWZmKHQsbixyKXtpZih0Lmxlbmd0aDw9MSYmRFModCxuLCh2LEMpPT52PT09QykpcmV0dXJuIG5ldyBWdShbXSxbXSwhMSk7aWYodC5sZW5ndGg9PT0xJiZ0WzBdLmxlbmd0aD09PTB8fG4ubGVuZ3RoPT09MSYmblswXS5sZW5ndGg9PT0wKXJldHVybiBuZXcgVnUoW25ldyBEcihuZXcgaWUoMSx0Lmxlbmd0aCsxKSxuZXcgaWUoMSxuLmxlbmd0aCsxKSxbbmV3IEluKG5ldyBoZSgxLDEsdC5sZW5ndGgsdFt0Lmxlbmd0aC0xXS5sZW5ndGgrMSksbmV3IGhlKDEsMSxuLmxlbmd0aCxuW24ubGVuZ3RoLTFdLmxlbmd0aCsxKSldKV0sW10sITEpO2NvbnN0IHM9ci5tYXhDb21wdXRhdGlvblRpbWVNcz09PTA/YWEuaW5zdGFuY2U6bmV3IHdTKHIubWF4Q29tcHV0YXRpb25UaW1lTXMpLGk9IXIuaWdub3JlVHJpbVdoaXRlc3BhY2Usbz1uZXcgTWFwO2Z1bmN0aW9uIGEodil7bGV0IEM9by5nZXQodik7cmV0dXJuIEM9PT12b2lkIDAmJihDPW8uc2l6ZSxvLnNldCh2LEMpKSxDfWNvbnN0IHU9dC5tYXAodj0+YSh2LnRyaW0oKSkpLGw9bi5tYXAodj0+YSh2LnRyaW0oKSkpLGY9bmV3IHRnKHUsdCksYz1uZXcgdGcobCxuKSxwPWYubGVuZ3RoK2MubGVuZ3RoPDE3MDA/dGhpcy5keW5hbWljUHJvZ3JhbW1pbmdEaWZmaW5nLmNvbXB1dGUoZixjLHMsKHYsQyk9PnRbdl09PT1uW0NdP25bQ10ubGVuZ3RoPT09MD8uMToxK01hdGgubG9nKDErbltDXS5sZW5ndGgpOi45OSk6dGhpcy5teWVyc0RpZmZpbmdBbGdvcml0aG0uY29tcHV0ZShmLGMscyk7bGV0IGg9cC5kaWZmcyxkPXAuaGl0VGltZW91dDtoPVEwKGYsYyxoKSxoPVJTKGYsYyxoKTtjb25zdCBtPVtdLGc9dj0+e2lmKGkpZm9yKGxldCBDPTA7Qzx2O0MrKyl7Y29uc3QgQT1EK0Msdz1iK0M7aWYodFtBXSE9PW5bd10pe2NvbnN0IFQ9dGhpcy5yZWZpbmVEaWZmKHQsbixuZXcgT2UobmV3IGxlKEEsQSsxKSxuZXcgbGUodyx3KzEpKSxzLGkpO2Zvcihjb25zdCBOIG9mIFQubWFwcGluZ3MpbS5wdXNoKE4pO1QuaGl0VGltZW91dCYmKGQ9ITApfX19O2xldCBEPTAsYj0wO2Zvcihjb25zdCB2IG9mIGgpe2p1KCgpPT52LnNlcTFSYW5nZS5zdGFydC1EPT09di5zZXEyUmFuZ2Uuc3RhcnQtYik7Y29uc3QgQz12LnNlcTFSYW5nZS5zdGFydC1EO2coQyksRD12LnNlcTFSYW5nZS5lbmRFeGNsdXNpdmUsYj12LnNlcTJSYW5nZS5lbmRFeGNsdXNpdmU7Y29uc3QgQT10aGlzLnJlZmluZURpZmYodCxuLHYscyxpKTtBLmhpdFRpbWVvdXQmJihkPSEwKTtmb3IoY29uc3QgdyBvZiBBLm1hcHBpbmdzKW0ucHVzaCh3KX1nKHQubGVuZ3RoLUQpO2NvbnN0IEU9cmcobSx0LG4pO2xldCBGPVtdO3JldHVybiByLmNvbXB1dGVNb3ZlcyYmKEY9dGhpcy5jb21wdXRlTW92ZXMoRSx0LG4sdSxsLHMsaSkpLGp1KCgpPT57ZnVuY3Rpb24gdihBLHcpe2lmKEEubGluZU51bWJlcjwxfHxBLmxpbmVOdW1iZXI+dy5sZW5ndGgpcmV0dXJuITE7Y29uc3QgVD13W0EubGluZU51bWJlci0xXTtyZXR1cm4hKEEuY29sdW1uPDF8fEEuY29sdW1uPlQubGVuZ3RoKzEpfWZ1bmN0aW9uIEMoQSx3KXtyZXR1cm4hKEEuc3RhcnRMaW5lTnVtYmVyPDF8fEEuc3RhcnRMaW5lTnVtYmVyPncubGVuZ3RoKzF8fEEuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTwxfHxBLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU+dy5sZW5ndGgrMSl9Zm9yKGNvbnN0IEEgb2YgRSl7aWYoIUEuaW5uZXJDaGFuZ2VzKXJldHVybiExO2Zvcihjb25zdCB3IG9mIEEuaW5uZXJDaGFuZ2VzKWlmKCEodih3Lm1vZGlmaWVkUmFuZ2UuZ2V0U3RhcnRQb3NpdGlvbigpLG4pJiZ2KHcubW9kaWZpZWRSYW5nZS5nZXRFbmRQb3NpdGlvbigpLG4pJiZ2KHcub3JpZ2luYWxSYW5nZS5nZXRTdGFydFBvc2l0aW9uKCksdCkmJnYody5vcmlnaW5hbFJhbmdlLmdldEVuZFBvc2l0aW9uKCksdCkpKXJldHVybiExO2lmKCFDKEEubW9kaWZpZWQsbil8fCFDKEEub3JpZ2luYWwsdCkpcmV0dXJuITF9cmV0dXJuITB9KSxuZXcgVnUoRSxGLGQpfWNvbXB1dGVNb3Zlcyh0LG4scixzLGksbyxhKXtyZXR1cm4gVFModCxuLHIscyxpLG8pLm1hcChmPT57Y29uc3QgYz10aGlzLnJlZmluZURpZmYobixyLG5ldyBPZShmLm9yaWdpbmFsLnRvT2Zmc2V0UmFuZ2UoKSxmLm1vZGlmaWVkLnRvT2Zmc2V0UmFuZ2UoKSksbyxhKSxwPXJnKGMubWFwcGluZ3MsbixyLCEwKTtyZXR1cm4gbmV3IGNTKGYscCl9KX1yZWZpbmVEaWZmKHQsbixyLHMsaSl7Y29uc3QgYT1xUyhyKS50b1JhbmdlTWFwcGluZzIodCxuKSx1PW5ldyBKdSh0LGEub3JpZ2luYWxSYW5nZSxpKSxsPW5ldyBKdShuLGEubW9kaWZpZWRSYW5nZSxpKSxmPXUubGVuZ3RoK2wubGVuZ3RoPDUwMD90aGlzLmR5bmFtaWNQcm9ncmFtbWluZ0RpZmZpbmcuY29tcHV0ZSh1LGwscyk6dGhpcy5teWVyc0RpZmZpbmdBbGdvcml0aG0uY29tcHV0ZSh1LGwscyk7bGV0IGM9Zi5kaWZmcztyZXR1cm4gYz1RMCh1LGwsYyksYz1NUyh1LGwsYyksYz1QUyh1LGwsYyksYz1qUyh1LGwsYykse21hcHBpbmdzOmMubWFwKGg9Pm5ldyBJbih1LnRyYW5zbGF0ZVJhbmdlKGguc2VxMVJhbmdlKSxsLnRyYW5zbGF0ZVJhbmdlKGguc2VxMlJhbmdlKSkpLGhpdFRpbWVvdXQ6Zi5oaXRUaW1lb3V0fX19ZnVuY3Rpb24gcmcoZSx0LG4scj0hMSl7Y29uc3Qgcz1bXTtmb3IoY29uc3QgaSBvZiBiUyhlLm1hcChvPT5VUyhvLHQsbikpLChvLGEpPT5vLm9yaWdpbmFsLm92ZXJsYXBPclRvdWNoKGEub3JpZ2luYWwpfHxvLm1vZGlmaWVkLm92ZXJsYXBPclRvdWNoKGEubW9kaWZpZWQpKSl7Y29uc3Qgbz1pWzBdLGE9aVtpLmxlbmd0aC0xXTtzLnB1c2gobmV3IERyKG8ub3JpZ2luYWwuam9pbihhLm9yaWdpbmFsKSxvLm1vZGlmaWVkLmpvaW4oYS5tb2RpZmllZCksaS5tYXAodT0+dS5pbm5lckNoYW5nZXNbMF0pKSl9cmV0dXJuIGp1KCgpPT4hciYmcy5sZW5ndGg+MCYmKHNbMF0ubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyIT09c1swXS5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXJ8fG4ubGVuZ3RoLXNbcy5sZW5ndGgtMV0ubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSE9PXQubGVuZ3RoLXNbcy5sZW5ndGgtMV0ub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSk/ITE6STAocywoaSxvKT0+by5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXItaS5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlPT09by5tb2RpZmllZC5zdGFydExpbmVOdW1iZXItaS5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlJiZpLm9yaWdpbmFsLmVuZExpbmVOdW1iZXJFeGNsdXNpdmU8by5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXImJmkubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZTxvLm1vZGlmaWVkLnN0YXJ0TGluZU51bWJlcikpLHN9ZnVuY3Rpb24gVVMoZSx0LG4pe2xldCByPTAscz0wO2UubW9kaWZpZWRSYW5nZS5lbmRDb2x1bW49PT0xJiZlLm9yaWdpbmFsUmFuZ2UuZW5kQ29sdW1uPT09MSYmZS5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlcityPD1lLm9yaWdpbmFsUmFuZ2UuZW5kTGluZU51bWJlciYmZS5tb2RpZmllZFJhbmdlLnN0YXJ0TGluZU51bWJlcityPD1lLm1vZGlmaWVkUmFuZ2UuZW5kTGluZU51bWJlciYmKHM9LTEpLGUubW9kaWZpZWRSYW5nZS5zdGFydENvbHVtbi0xPj1uW2UubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXItMV0ubGVuZ3RoJiZlLm9yaWdpbmFsUmFuZ2Uuc3RhcnRDb2x1bW4tMT49dFtlLm9yaWdpbmFsUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLTFdLmxlbmd0aCYmZS5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlcjw9ZS5vcmlnaW5hbFJhbmdlLmVuZExpbmVOdW1iZXIrcyYmZS5tb2RpZmllZFJhbmdlLnN0YXJ0TGluZU51bWJlcjw9ZS5tb2RpZmllZFJhbmdlLmVuZExpbmVOdW1iZXIrcyYmKHI9MSk7Y29uc3QgaT1uZXcgaWUoZS5vcmlnaW5hbFJhbmdlLnN0YXJ0TGluZU51bWJlcityLGUub3JpZ2luYWxSYW5nZS5lbmRMaW5lTnVtYmVyKzErcyksbz1uZXcgaWUoZS5tb2RpZmllZFJhbmdlLnN0YXJ0TGluZU51bWJlcityLGUubW9kaWZpZWRSYW5nZS5lbmRMaW5lTnVtYmVyKzErcyk7cmV0dXJuIG5ldyBEcihpLG8sW2VdKX1mdW5jdGlvbiBxUyhlKXtyZXR1cm4gbmV3IGNuKG5ldyBpZShlLnNlcTFSYW5nZS5zdGFydCsxLGUuc2VxMVJhbmdlLmVuZEV4Y2x1c2l2ZSsxKSxuZXcgaWUoZS5zZXEyUmFuZ2Uuc3RhcnQrMSxlLnNlcTJSYW5nZS5lbmRFeGNsdXNpdmUrMSkpfWNvbnN0IHNnPXtnZXRMZWdhY3k6KCk9Pm5ldyBkUyxnZXREZWZhdWx0OigpPT5uZXcgVlN9O2Z1bmN0aW9uIGlzKGUsdCl7Y29uc3Qgbj1NYXRoLnBvdygxMCx0KTtyZXR1cm4gTWF0aC5yb3VuZChlKm4pL259Y2xhc3MgbnR7Y29uc3RydWN0b3IodCxuLHIscz0xKXt0aGlzLl9yZ2JhQnJhbmQ9dm9pZCAwLHRoaXMucj1NYXRoLm1pbigyNTUsTWF0aC5tYXgoMCx0KSl8MCx0aGlzLmc9TWF0aC5taW4oMjU1LE1hdGgubWF4KDAsbikpfDAsdGhpcy5iPU1hdGgubWluKDI1NSxNYXRoLm1heCgwLHIpKXwwLHRoaXMuYT1pcyhNYXRoLm1heChNYXRoLm1pbigxLHMpLDApLDMpfXN0YXRpYyBlcXVhbHModCxuKXtyZXR1cm4gdC5yPT09bi5yJiZ0Lmc9PT1uLmcmJnQuYj09PW4uYiYmdC5hPT09bi5hfX1jbGFzcyBmbntjb25zdHJ1Y3Rvcih0LG4scixzKXt0aGlzLl9oc2xhQnJhbmQ9dm9pZCAwLHRoaXMuaD1NYXRoLm1heChNYXRoLm1pbigzNjAsdCksMCl8MCx0aGlzLnM9aXMoTWF0aC5tYXgoTWF0aC5taW4oMSxuKSwwKSwzKSx0aGlzLmw9aXMoTWF0aC5tYXgoTWF0aC5taW4oMSxyKSwwKSwzKSx0aGlzLmE9aXMoTWF0aC5tYXgoTWF0aC5taW4oMSxzKSwwKSwzKX1zdGF0aWMgZXF1YWxzKHQsbil7cmV0dXJuIHQuaD09PW4uaCYmdC5zPT09bi5zJiZ0Lmw9PT1uLmwmJnQuYT09PW4uYX1zdGF0aWMgZnJvbVJHQkEodCl7Y29uc3Qgbj10LnIvMjU1LHI9dC5nLzI1NSxzPXQuYi8yNTUsaT10LmEsbz1NYXRoLm1heChuLHIscyksYT1NYXRoLm1pbihuLHIscyk7bGV0IHU9MCxsPTA7Y29uc3QgZj0oYStvKS8yLGM9by1hO2lmKGM+MCl7c3dpdGNoKGw9TWF0aC5taW4oZjw9LjU/Yy8oMipmKTpjLygyLTIqZiksMSksbyl7Y2FzZSBuOnU9KHItcykvYysocjxzPzY6MCk7YnJlYWs7Y2FzZSByOnU9KHMtbikvYysyO2JyZWFrO2Nhc2Ugczp1PShuLXIpL2MrNDticmVha311Kj02MCx1PU1hdGgucm91bmQodSl9cmV0dXJuIG5ldyBmbih1LGwsZixpKX1zdGF0aWMgX2h1ZTJyZ2IodCxuLHIpe3JldHVybiByPDAmJihyKz0xKSxyPjEmJihyLT0xKSxyPDEvNj90KyhuLXQpKjYqcjpyPDEvMj9uOnI8Mi8zP3QrKG4tdCkqKDIvMy1yKSo2OnR9c3RhdGljIHRvUkdCQSh0KXtjb25zdCBuPXQuaC8zNjAse3M6cixsOnMsYTppfT10O2xldCBvLGEsdTtpZihyPT09MClvPWE9dT1zO2Vsc2V7Y29uc3QgbD1zPC41P3MqKDErcik6cytyLXMqcixmPTIqcy1sO289Zm4uX2h1ZTJyZ2IoZixsLG4rMS8zKSxhPWZuLl9odWUycmdiKGYsbCxuKSx1PWZuLl9odWUycmdiKGYsbCxuLTEvMyl9cmV0dXJuIG5ldyBudChNYXRoLnJvdW5kKG8qMjU1KSxNYXRoLnJvdW5kKGEqMjU1KSxNYXRoLnJvdW5kKHUqMjU1KSxpKX19Y2xhc3MgTWl7Y29uc3RydWN0b3IodCxuLHIscyl7dGhpcy5faHN2YUJyYW5kPXZvaWQgMCx0aGlzLmg9TWF0aC5tYXgoTWF0aC5taW4oMzYwLHQpLDApfDAsdGhpcy5zPWlzKE1hdGgubWF4KE1hdGgubWluKDEsbiksMCksMyksdGhpcy52PWlzKE1hdGgubWF4KE1hdGgubWluKDEsciksMCksMyksdGhpcy5hPWlzKE1hdGgubWF4KE1hdGgubWluKDEscyksMCksMyl9c3RhdGljIGVxdWFscyh0LG4pe3JldHVybiB0Lmg9PT1uLmgmJnQucz09PW4ucyYmdC52PT09bi52JiZ0LmE9PT1uLmF9c3RhdGljIGZyb21SR0JBKHQpe2NvbnN0IG49dC5yLzI1NSxyPXQuZy8yNTUscz10LmIvMjU1LGk9TWF0aC5tYXgobixyLHMpLG89TWF0aC5taW4obixyLHMpLGE9aS1vLHU9aT09PTA/MDphL2k7bGV0IGw7cmV0dXJuIGE9PT0wP2w9MDppPT09bj9sPSgoci1zKS9hJTYrNiklNjppPT09cj9sPShzLW4pL2ErMjpsPShuLXIpL2ErNCxuZXcgTWkoTWF0aC5yb3VuZChsKjYwKSx1LGksdC5hKX1zdGF0aWMgdG9SR0JBKHQpe2NvbnN0e2g6bixzOnIsdjpzLGE6aX09dCxvPXMqcixhPW8qKDEtTWF0aC5hYnMobi82MCUyLTEpKSx1PXMtbztsZXRbbCxmLGNdPVswLDAsMF07cmV0dXJuIG48NjA/KGw9byxmPWEpOm48MTIwPyhsPWEsZj1vKTpuPDE4MD8oZj1vLGM9YSk6bjwyNDA/KGY9YSxjPW8pOm48MzAwPyhsPWEsYz1vKTpuPD0zNjAmJihsPW8sYz1hKSxsPU1hdGgucm91bmQoKGwrdSkqMjU1KSxmPU1hdGgucm91bmQoKGYrdSkqMjU1KSxjPU1hdGgucm91bmQoKGMrdSkqMjU1KSxuZXcgbnQobCxmLGMsaSl9fWxldCB6dT0obWU9Y2xhc3N7c3RhdGljIGZyb21IZXgodCl7cmV0dXJuIG1lLkZvcm1hdC5DU1MucGFyc2VIZXgodCl8fG1lLnJlZH1zdGF0aWMgZXF1YWxzKHQsbil7cmV0dXJuIXQmJiFuPyEwOiF0fHwhbj8hMTp0LmVxdWFscyhuKX1nZXQgaHNsYSgpe3JldHVybiB0aGlzLl9oc2xhP3RoaXMuX2hzbGE6Zm4uZnJvbVJHQkEodGhpcy5yZ2JhKX1nZXQgaHN2YSgpe3JldHVybiB0aGlzLl9oc3ZhP3RoaXMuX2hzdmE6TWkuZnJvbVJHQkEodGhpcy5yZ2JhKX1jb25zdHJ1Y3Rvcih0KXtpZih0KWlmKHQgaW5zdGFuY2VvZiBudCl0aGlzLnJnYmE9dDtlbHNlIGlmKHQgaW5zdGFuY2VvZiBmbil0aGlzLl9oc2xhPXQsdGhpcy5yZ2JhPWZuLnRvUkdCQSh0KTtlbHNlIGlmKHQgaW5zdGFuY2VvZiBNaSl0aGlzLl9oc3ZhPXQsdGhpcy5yZ2JhPU1pLnRvUkdCQSh0KTtlbHNlIHRocm93IG5ldyBFcnJvcigiSW52YWxpZCBjb2xvciBjdG9yIGFyZ3VtZW50Iik7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIkNvbG9yIG5lZWRzIGEgdmFsdWUiKX1lcXVhbHModCl7cmV0dXJuISF0JiZudC5lcXVhbHModGhpcy5yZ2JhLHQucmdiYSkmJmZuLmVxdWFscyh0aGlzLmhzbGEsdC5oc2xhKSYmTWkuZXF1YWxzKHRoaXMuaHN2YSx0LmhzdmEpfWdldFJlbGF0aXZlTHVtaW5hbmNlKCl7Y29uc3QgdD1tZS5fcmVsYXRpdmVMdW1pbmFuY2VGb3JDb21wb25lbnQodGhpcy5yZ2JhLnIpLG49bWUuX3JlbGF0aXZlTHVtaW5hbmNlRm9yQ29tcG9uZW50KHRoaXMucmdiYS5nKSxyPW1lLl9yZWxhdGl2ZUx1bWluYW5jZUZvckNvbXBvbmVudCh0aGlzLnJnYmEuYikscz0uMjEyNip0Ky43MTUyKm4rLjA3MjIqcjtyZXR1cm4gaXMocyw0KX1zdGF0aWMgX3JlbGF0aXZlTHVtaW5hbmNlRm9yQ29tcG9uZW50KHQpe2NvbnN0IG49dC8yNTU7cmV0dXJuIG48PS4wMzkyOD9uLzEyLjkyOk1hdGgucG93KChuKy4wNTUpLzEuMDU1LDIuNCl9aXNMaWdodGVyKCl7cmV0dXJuKHRoaXMucmdiYS5yKjI5OSt0aGlzLnJnYmEuZyo1ODcrdGhpcy5yZ2JhLmIqMTE0KS8xZTM+PTEyOH1pc0xpZ2h0ZXJUaGFuKHQpe2NvbnN0IG49dGhpcy5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLHI9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiBuPnJ9aXNEYXJrZXJUaGFuKHQpe2NvbnN0IG49dGhpcy5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLHI9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiBuPHJ9bGlnaHRlbih0KXtyZXR1cm4gbmV3IG1lKG5ldyBmbih0aGlzLmhzbGEuaCx0aGlzLmhzbGEucyx0aGlzLmhzbGEubCt0aGlzLmhzbGEubCp0LHRoaXMuaHNsYS5hKSl9ZGFya2VuKHQpe3JldHVybiBuZXcgbWUobmV3IGZuKHRoaXMuaHNsYS5oLHRoaXMuaHNsYS5zLHRoaXMuaHNsYS5sLXRoaXMuaHNsYS5sKnQsdGhpcy5oc2xhLmEpKX10cmFuc3BhcmVudCh0KXtjb25zdHtyOm4sZzpyLGI6cyxhOml9PXRoaXMucmdiYTtyZXR1cm4gbmV3IG1lKG5ldyBudChuLHIscyxpKnQpKX1pc1RyYW5zcGFyZW50KCl7cmV0dXJuIHRoaXMucmdiYS5hPT09MH1pc09wYXF1ZSgpe3JldHVybiB0aGlzLnJnYmEuYT09PTF9b3Bwb3NpdGUoKXtyZXR1cm4gbmV3IG1lKG5ldyBudCgyNTUtdGhpcy5yZ2JhLnIsMjU1LXRoaXMucmdiYS5nLDI1NS10aGlzLnJnYmEuYix0aGlzLnJnYmEuYSkpfW1ha2VPcGFxdWUodCl7aWYodGhpcy5pc09wYXF1ZSgpfHx0LnJnYmEuYSE9PTEpcmV0dXJuIHRoaXM7Y29uc3R7cjpuLGc6cixiOnMsYTppfT10aGlzLnJnYmE7cmV0dXJuIG5ldyBtZShuZXcgbnQodC5yZ2JhLnItaSoodC5yZ2JhLnItbiksdC5yZ2JhLmctaSoodC5yZ2JhLmctciksdC5yZ2JhLmItaSoodC5yZ2JhLmItcyksMSkpfXRvU3RyaW5nKCl7cmV0dXJuIHRoaXMuX3RvU3RyaW5nfHwodGhpcy5fdG9TdHJpbmc9bWUuRm9ybWF0LkNTUy5mb3JtYXQodGhpcykpLHRoaXMuX3RvU3RyaW5nfXN0YXRpYyBnZXRMaWdodGVyQ29sb3IodCxuLHIpe2lmKHQuaXNMaWdodGVyVGhhbihuKSlyZXR1cm4gdDtyPXJ8fC41O2NvbnN0IHM9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLGk9bi5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiByPXIqKGktcykvaSx0LmxpZ2h0ZW4ocil9c3RhdGljIGdldERhcmtlckNvbG9yKHQsbixyKXtpZih0LmlzRGFya2VyVGhhbihuKSlyZXR1cm4gdDtyPXJ8fC41O2NvbnN0IHM9dC5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpLGk9bi5nZXRSZWxhdGl2ZUx1bWluYW5jZSgpO3JldHVybiByPXIqKHMtaSkvcyx0LmRhcmtlbihyKX19LG1lLndoaXRlPW5ldyBtZShuZXcgbnQoMjU1LDI1NSwyNTUsMSkpLG1lLmJsYWNrPW5ldyBtZShuZXcgbnQoMCwwLDAsMSkpLG1lLnJlZD1uZXcgbWUobmV3IG50KDI1NSwwLDAsMSkpLG1lLmJsdWU9bmV3IG1lKG5ldyBudCgwLDAsMjU1LDEpKSxtZS5ncmVlbj1uZXcgbWUobmV3IG50KDAsMjU1LDAsMSkpLG1lLmN5YW49bmV3IG1lKG5ldyBudCgwLDI1NSwyNTUsMSkpLG1lLmxpZ2h0Z3JleT1uZXcgbWUobmV3IG50KDIxMSwyMTEsMjExLDEpKSxtZS50cmFuc3BhcmVudD1uZXcgbWUobmV3IG50KDAsMCwwLDApKSxtZSk7KGZ1bmN0aW9uKGUpeyhmdW5jdGlvbih0KXsoZnVuY3Rpb24obil7ZnVuY3Rpb24gcihoKXtyZXR1cm4gaC5yZ2JhLmE9PT0xP2ByZ2IoJHtoLnJnYmEucn0sICR7aC5yZ2JhLmd9LCAke2gucmdiYS5ifSlgOmUuRm9ybWF0LkNTUy5mb3JtYXRSR0JBKGgpfW4uZm9ybWF0UkdCPXI7ZnVuY3Rpb24gcyhoKXtyZXR1cm5gcmdiYSgke2gucmdiYS5yfSwgJHtoLnJnYmEuZ30sICR7aC5yZ2JhLmJ9LCAkeytoLnJnYmEuYS50b0ZpeGVkKDIpfSlgfW4uZm9ybWF0UkdCQT1zO2Z1bmN0aW9uIGkoaCl7cmV0dXJuIGguaHNsYS5hPT09MT9gaHNsKCR7aC5oc2xhLmh9LCAkeyhoLmhzbGEucyoxMDApLnRvRml4ZWQoMil9JSwgJHsoaC5oc2xhLmwqMTAwKS50b0ZpeGVkKDIpfSUpYDplLkZvcm1hdC5DU1MuZm9ybWF0SFNMQShoKX1uLmZvcm1hdEhTTD1pO2Z1bmN0aW9uIG8oaCl7cmV0dXJuYGhzbGEoJHtoLmhzbGEuaH0sICR7KGguaHNsYS5zKjEwMCkudG9GaXhlZCgyKX0lLCAkeyhoLmhzbGEubCoxMDApLnRvRml4ZWQoMil9JSwgJHtoLmhzbGEuYS50b0ZpeGVkKDIpfSlgfW4uZm9ybWF0SFNMQT1vO2Z1bmN0aW9uIGEoaCl7Y29uc3QgZD1oLnRvU3RyaW5nKDE2KTtyZXR1cm4gZC5sZW5ndGghPT0yPyIwIitkOmR9ZnVuY3Rpb24gdShoKXtyZXR1cm5gIyR7YShoLnJnYmEucil9JHthKGgucmdiYS5nKX0ke2EoaC5yZ2JhLmIpfWB9bi5mb3JtYXRIZXg9dTtmdW5jdGlvbiBsKGgsZD0hMSl7cmV0dXJuIGQmJmgucmdiYS5hPT09MT9lLkZvcm1hdC5DU1MuZm9ybWF0SGV4KGgpOmAjJHthKGgucmdiYS5yKX0ke2EoaC5yZ2JhLmcpfSR7YShoLnJnYmEuYil9JHthKE1hdGgucm91bmQoaC5yZ2JhLmEqMjU1KSl9YH1uLmZvcm1hdEhleEE9bDtmdW5jdGlvbiBmKGgpe3JldHVybiBoLmlzT3BhcXVlKCk/ZS5Gb3JtYXQuQ1NTLmZvcm1hdEhleChoKTplLkZvcm1hdC5DU1MuZm9ybWF0UkdCQShoKX1uLmZvcm1hdD1mO2Z1bmN0aW9uIGMoaCl7Y29uc3QgZD1oLmxlbmd0aDtpZihkPT09MHx8aC5jaGFyQ29kZUF0KDApIT09MzUpcmV0dXJuIG51bGw7aWYoZD09PTcpe2NvbnN0IG09MTYqcChoLmNoYXJDb2RlQXQoMSkpK3AoaC5jaGFyQ29kZUF0KDIpKSxnPTE2KnAoaC5jaGFyQ29kZUF0KDMpKStwKGguY2hhckNvZGVBdCg0KSksRD0xNipwKGguY2hhckNvZGVBdCg1KSkrcChoLmNoYXJDb2RlQXQoNikpO3JldHVybiBuZXcgZShuZXcgbnQobSxnLEQsMSkpfWlmKGQ9PT05KXtjb25zdCBtPTE2KnAoaC5jaGFyQ29kZUF0KDEpKStwKGguY2hhckNvZGVBdCgyKSksZz0xNipwKGguY2hhckNvZGVBdCgzKSkrcChoLmNoYXJDb2RlQXQoNCkpLEQ9MTYqcChoLmNoYXJDb2RlQXQoNSkpK3AoaC5jaGFyQ29kZUF0KDYpKSxiPTE2KnAoaC5jaGFyQ29kZUF0KDcpKStwKGguY2hhckNvZGVBdCg4KSk7cmV0dXJuIG5ldyBlKG5ldyBudChtLGcsRCxiLzI1NSkpfWlmKGQ9PT00KXtjb25zdCBtPXAoaC5jaGFyQ29kZUF0KDEpKSxnPXAoaC5jaGFyQ29kZUF0KDIpKSxEPXAoaC5jaGFyQ29kZUF0KDMpKTtyZXR1cm4gbmV3IGUobmV3IG50KDE2Km0rbSwxNipnK2csMTYqRCtEKSl9aWYoZD09PTUpe2NvbnN0IG09cChoLmNoYXJDb2RlQXQoMSkpLGc9cChoLmNoYXJDb2RlQXQoMikpLEQ9cChoLmNoYXJDb2RlQXQoMykpLGI9cChoLmNoYXJDb2RlQXQoNCkpO3JldHVybiBuZXcgZShuZXcgbnQoMTYqbSttLDE2KmcrZywxNipEK0QsKDE2KmIrYikvMjU1KSl9cmV0dXJuIG51bGx9bi5wYXJzZUhleD1jO2Z1bmN0aW9uIHAoaCl7c3dpdGNoKGgpe2Nhc2UgNDg6cmV0dXJuIDA7Y2FzZSA0OTpyZXR1cm4gMTtjYXNlIDUwOnJldHVybiAyO2Nhc2UgNTE6cmV0dXJuIDM7Y2FzZSA1MjpyZXR1cm4gNDtjYXNlIDUzOnJldHVybiA1O2Nhc2UgNTQ6cmV0dXJuIDY7Y2FzZSA1NTpyZXR1cm4gNztjYXNlIDU2OnJldHVybiA4O2Nhc2UgNTc6cmV0dXJuIDk7Y2FzZSA5NzpyZXR1cm4gMTA7Y2FzZSA2NTpyZXR1cm4gMTA7Y2FzZSA5ODpyZXR1cm4gMTE7Y2FzZSA2NjpyZXR1cm4gMTE7Y2FzZSA5OTpyZXR1cm4gMTI7Y2FzZSA2NzpyZXR1cm4gMTI7Y2FzZSAxMDA6cmV0dXJuIDEzO2Nhc2UgNjg6cmV0dXJuIDEzO2Nhc2UgMTAxOnJldHVybiAxNDtjYXNlIDY5OnJldHVybiAxNDtjYXNlIDEwMjpyZXR1cm4gMTU7Y2FzZSA3MDpyZXR1cm4gMTV9cmV0dXJuIDB9fSkodC5DU1N8fCh0LkNTUz17fSkpfSkoZS5Gb3JtYXR8fChlLkZvcm1hdD17fSkpfSkoenV8fCh6dT17fSkpO2Z1bmN0aW9uIGlnKGUpe2NvbnN0IHQ9W107Zm9yKGNvbnN0IG4gb2YgZSl7Y29uc3Qgcj1OdW1iZXIobik7KHJ8fHI9PT0wJiZuLnJlcGxhY2UoL1xzL2csIiIpIT09IiIpJiZ0LnB1c2gocil9cmV0dXJuIHR9ZnVuY3Rpb24gdHAoZSx0LG4scil7cmV0dXJue3JlZDplLzI1NSxibHVlOm4vMjU1LGdyZWVuOnQvMjU1LGFscGhhOnJ9fWZ1bmN0aW9uIHVhKGUsdCl7Y29uc3Qgbj10LmluZGV4LHI9dFswXS5sZW5ndGg7aWYoIW4pcmV0dXJuO2NvbnN0IHM9ZS5wb3NpdGlvbkF0KG4pO3JldHVybntzdGFydExpbmVOdW1iZXI6cy5saW5lTnVtYmVyLHN0YXJ0Q29sdW1uOnMuY29sdW1uLGVuZExpbmVOdW1iZXI6cy5saW5lTnVtYmVyLGVuZENvbHVtbjpzLmNvbHVtbityfX1mdW5jdGlvbiBXUyhlLHQpe2lmKCFlKXJldHVybjtjb25zdCBuPXp1LkZvcm1hdC5DU1MucGFyc2VIZXgodCk7aWYobilyZXR1cm57cmFuZ2U6ZSxjb2xvcjp0cChuLnJnYmEucixuLnJnYmEuZyxuLnJnYmEuYixuLnJnYmEuYSl9fWZ1bmN0aW9uIG9nKGUsdCxuKXtpZighZXx8dC5sZW5ndGghPT0xKXJldHVybjtjb25zdCBzPXRbMF0udmFsdWVzKCksaT1pZyhzKTtyZXR1cm57cmFuZ2U6ZSxjb2xvcjp0cChpWzBdLGlbMV0saVsyXSxuP2lbM106MSl9fWZ1bmN0aW9uIGFnKGUsdCxuKXtpZighZXx8dC5sZW5ndGghPT0xKXJldHVybjtjb25zdCBzPXRbMF0udmFsdWVzKCksaT1pZyhzKSxvPW5ldyB6dShuZXcgZm4oaVswXSxpWzFdLzEwMCxpWzJdLzEwMCxuP2lbM106MSkpO3JldHVybntyYW5nZTplLGNvbG9yOnRwKG8ucmdiYS5yLG8ucmdiYS5nLG8ucmdiYS5iLG8ucmdiYS5hKX19ZnVuY3Rpb24gbGEoZSx0KXtyZXR1cm4gdHlwZW9mIGU9PSJzdHJpbmciP1suLi5lLm1hdGNoQWxsKHQpXTplLmZpbmRNYXRjaGVzKHQpfWZ1bmN0aW9uIEhTKGUpe2NvbnN0IHQ9W10scj1sYShlLC9cYihyZ2J8cmdiYXxoc2x8aHNsYSkoXChbMC05XHMsLlwlXSpcKSl8KCMpKFtBLUZhLWYwLTldezN9KVxifCgjKShbQS1GYS1mMC05XXs0fSlcYnwoIykoW0EtRmEtZjAtOV17Nn0pXGJ8KCMpKFtBLUZhLWYwLTldezh9KVxiL2dtKTtpZihyLmxlbmd0aD4wKWZvcihjb25zdCBzIG9mIHIpe2NvbnN0IGk9cy5maWx0ZXIobD0+bCE9PXZvaWQgMCksbz1pWzFdLGE9aVsyXTtpZighYSljb250aW51ZTtsZXQgdTtpZihvPT09InJnYiIpe2NvbnN0IGw9L15cKFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxzKixccyooMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlccyosXHMqKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXHMqXCkkL2dtO3U9b2codWEoZSxzKSxsYShhLGwpLCExKX1lbHNlIGlmKG89PT0icmdiYSIpe2NvbnN0IGw9L15cKFxzKigyNVswLTVdfDJbMC00XVswLTldfDFbMC05XXsyfXxbMS05XVswLTldfFswLTldKVxzKixccyooMjVbMC01XXwyWzAtNF1bMC05XXwxWzAtOV17Mn18WzEtOV1bMC05XXxbMC05XSlccyosXHMqKDI1WzAtNV18MlswLTRdWzAtOV18MVswLTldezJ9fFsxLTldWzAtOV18WzAtOV0pXHMqLFxzKigwWy5dWzAtOV0rfFsuXVswLTldK3xbMDFdWy5dfFswMV0pXHMqXCkkL2dtO3U9b2codWEoZSxzKSxsYShhLGwpLCEwKX1lbHNlIGlmKG89PT0iaHNsIil7Y29uc3QgbD0vXlwoXHMqKDM2WzBdfDNbMC01XVswLTldfFsxMl1bMC05XVswLTldfFsxLTldP1swLTldKVxzKixccyooMTAwfFxkezEsMn1bLl1cZCp8XGR7MSwyfSklXHMqLFxzKigxMDB8XGR7MSwyfVsuXVxkKnxcZHsxLDJ9KSVccypcKSQvZ207dT1hZyh1YShlLHMpLGxhKGEsbCksITEpfWVsc2UgaWYobz09PSJoc2xhIil7Y29uc3QgbD0vXlwoXHMqKDM2WzBdfDNbMC01XVswLTldfFsxMl1bMC05XVswLTldfFsxLTldP1swLTldKVxzKixccyooMTAwfFxkezEsMn1bLl1cZCp8XGR7MSwyfSklXHMqLFxzKigxMDB8XGR7MSwyfVsuXVxkKnxcZHsxLDJ9KSVccyosXHMqKDBbLl1bMC05XSt8Wy5dWzAtOV0rfFswMV1bLl18WzAxXSlccypcKSQvZ207dT1hZyh1YShlLHMpLGxhKGEsbCksITApfWVsc2Ugbz09PSIjIiYmKHU9V1ModWEoZSxzKSxvK2EpKTt1JiZ0LnB1c2godSl9cmV0dXJuIHR9ZnVuY3Rpb24gSlMoZSl7cmV0dXJuIWV8fHR5cGVvZiBlLmdldFZhbHVlIT0iZnVuY3Rpb24ifHx0eXBlb2YgZS5wb3NpdGlvbkF0IT0iZnVuY3Rpb24iP1tdOkhTKGUpfWNvbnN0IHVnPW5ldyBSZWdFeHAoIlxcYk1BUks6XFxzKiguKikkIiwiZCIpLHpTPS9eLSt8LSskL2c7ZnVuY3Rpb24gR1MoZSx0KXt2YXIgcjtsZXQgbj1bXTtpZih0LmZpbmRSZWdpb25TZWN0aW9uSGVhZGVycyYmKChyPXQuZm9sZGluZ1J1bGVzKSE9bnVsbCYmci5tYXJrZXJzKSl7Y29uc3Qgcz1LUyhlLHQpO249bi5jb25jYXQocyl9aWYodC5maW5kTWFya1NlY3Rpb25IZWFkZXJzKXtjb25zdCBzPVhTKGUpO249bi5jb25jYXQocyl9cmV0dXJuIG59ZnVuY3Rpb24gS1MoZSx0KXtjb25zdCBuPVtdLHI9ZS5nZXRMaW5lQ291bnQoKTtmb3IobGV0IHM9MTtzPD1yO3MrKyl7Y29uc3QgaT1lLmdldExpbmVDb250ZW50KHMpLG89aS5tYXRjaCh0LmZvbGRpbmdSdWxlcy5tYXJrZXJzLnN0YXJ0KTtpZihvKXtjb25zdCBhPXtzdGFydExpbmVOdW1iZXI6cyxzdGFydENvbHVtbjpvWzBdLmxlbmd0aCsxLGVuZExpbmVOdW1iZXI6cyxlbmRDb2x1bW46aS5sZW5ndGgrMX07aWYoYS5lbmRDb2x1bW4+YS5zdGFydENvbHVtbil7Y29uc3QgdT17cmFuZ2U6YSwuLi5sZyhpLnN1YnN0cmluZyhvWzBdLmxlbmd0aCkpLHNob3VsZEJlSW5Db21tZW50czohMX07KHUudGV4dHx8dS5oYXNTZXBhcmF0b3JMaW5lKSYmbi5wdXNoKHUpfX19cmV0dXJuIG59ZnVuY3Rpb24gWFMoZSl7Y29uc3QgdD1bXSxuPWUuZ2V0TGluZUNvdW50KCk7Zm9yKGxldCByPTE7cjw9bjtyKyspe2NvbnN0IHM9ZS5nZXRMaW5lQ29udGVudChyKTtZUyhzLHIsdCl9cmV0dXJuIHR9ZnVuY3Rpb24gWVMoZSx0LG4pe3VnLmxhc3RJbmRleD0wO2NvbnN0IHI9dWcuZXhlYyhlKTtpZihyKXtjb25zdCBzPXIuaW5kaWNlc1sxXVswXSsxLGk9ci5pbmRpY2VzWzFdWzFdKzEsbz17c3RhcnRMaW5lTnVtYmVyOnQsc3RhcnRDb2x1bW46cyxlbmRMaW5lTnVtYmVyOnQsZW5kQ29sdW1uOml9O2lmKG8uZW5kQ29sdW1uPm8uc3RhcnRDb2x1bW4pe2NvbnN0IGE9e3JhbmdlOm8sLi4ubGcoclsxXSksc2hvdWxkQmVJbkNvbW1lbnRzOiEwfTsoYS50ZXh0fHxhLmhhc1NlcGFyYXRvckxpbmUpJiZuLnB1c2goYSl9fX1mdW5jdGlvbiBsZyhlKXtlPWUudHJpbSgpO2NvbnN0IHQ9ZS5zdGFydHNXaXRoKCItIik7cmV0dXJuIGU9ZS5yZXBsYWNlKHpTLCIiKSx7dGV4dDplLGhhc1NlcGFyYXRvckxpbmU6dH19dmFyIGNnOyhmdW5jdGlvbihlKXthc3luYyBmdW5jdGlvbiB0KHIpe2xldCBzO2NvbnN0IGk9YXdhaXQgUHJvbWlzZS5hbGwoci5tYXAobz0+by50aGVuKGE9PmEsYT0+e3N8fChzPWEpfSkpKTtpZih0eXBlb2YgczwidSIpdGhyb3cgcztyZXR1cm4gaX1lLnNldHRsZWQ9dDtmdW5jdGlvbiBuKHIpe3JldHVybiBuZXcgUHJvbWlzZShhc3luYyhzLGkpPT57dHJ5e2F3YWl0IHIocyxpKX1jYXRjaChvKXtpKG8pfX0pfWUud2l0aEFzeW5jQm9keT1ufSkoY2d8fChjZz17fSkpO2NvbnN0IEJ0PWNsYXNzIEJ0e3N0YXRpYyBmcm9tQXJyYXkodCl7cmV0dXJuIG5ldyBCdChuPT57bi5lbWl0TWFueSh0KX0pfXN0YXRpYyBmcm9tUHJvbWlzZSh0KXtyZXR1cm4gbmV3IEJ0KGFzeW5jIG49PntuLmVtaXRNYW55KGF3YWl0IHQpfSl9c3RhdGljIGZyb21Qcm9taXNlcyh0KXtyZXR1cm4gbmV3IEJ0KGFzeW5jIG49Pnthd2FpdCBQcm9taXNlLmFsbCh0Lm1hcChhc3luYyByPT5uLmVtaXRPbmUoYXdhaXQgcikpKX0pfXN0YXRpYyBtZXJnZSh0KXtyZXR1cm4gbmV3IEJ0KGFzeW5jIG49Pnthd2FpdCBQcm9taXNlLmFsbCh0Lm1hcChhc3luYyByPT57Zm9yIGF3YWl0KGNvbnN0IHMgb2YgciluLmVtaXRPbmUocyl9KSl9KX1jb25zdHJ1Y3Rvcih0LG4pe3RoaXMuX3N0YXRlPTAsdGhpcy5fcmVzdWx0cz1bXSx0aGlzLl9lcnJvcj1udWxsLHRoaXMuX29uUmV0dXJuPW4sdGhpcy5fb25TdGF0ZUNoYW5nZWQ9bmV3IGxuLHF1ZXVlTWljcm90YXNrKGFzeW5jKCk9Pntjb25zdCByPXtlbWl0T25lOnM9PnRoaXMuZW1pdE9uZShzKSxlbWl0TWFueTpzPT50aGlzLmVtaXRNYW55KHMpLHJlamVjdDpzPT50aGlzLnJlamVjdChzKX07dHJ5e2F3YWl0IFByb21pc2UucmVzb2x2ZSh0KHIpKSx0aGlzLnJlc29sdmUoKX1jYXRjaChzKXt0aGlzLnJlamVjdChzKX1maW5hbGx5e3IuZW1pdE9uZT12b2lkIDAsci5lbWl0TWFueT12b2lkIDAsci5yZWplY3Q9dm9pZCAwfX0pfVtTeW1ib2wuYXN5bmNJdGVyYXRvcl0oKXtsZXQgdD0wO3JldHVybntuZXh0OmFzeW5jKCk9Pntkb3tpZih0aGlzLl9zdGF0ZT09PTIpdGhyb3cgdGhpcy5fZXJyb3I7aWYodDx0aGlzLl9yZXN1bHRzLmxlbmd0aClyZXR1cm57ZG9uZTohMSx2YWx1ZTp0aGlzLl9yZXN1bHRzW3QrK119O2lmKHRoaXMuX3N0YXRlPT09MSlyZXR1cm57ZG9uZTohMCx2YWx1ZTp2b2lkIDB9O2F3YWl0IEx1LnRvUHJvbWlzZSh0aGlzLl9vblN0YXRlQ2hhbmdlZC5ldmVudCl9d2hpbGUoITApfSxyZXR1cm46YXN5bmMoKT0+e3ZhciBuO3JldHVybihuPXRoaXMuX29uUmV0dXJuKT09bnVsbHx8bi5jYWxsKHRoaXMpLHtkb25lOiEwLHZhbHVlOnZvaWQgMH19fX1zdGF0aWMgbWFwKHQsbil7cmV0dXJuIG5ldyBCdChhc3luYyByPT57Zm9yIGF3YWl0KGNvbnN0IHMgb2YgdClyLmVtaXRPbmUobihzKSl9KX1tYXAodCl7cmV0dXJuIEJ0Lm1hcCh0aGlzLHQpfXN0YXRpYyBmaWx0ZXIodCxuKXtyZXR1cm4gbmV3IEJ0KGFzeW5jIHI9Pntmb3IgYXdhaXQoY29uc3QgcyBvZiB0KW4ocykmJnIuZW1pdE9uZShzKX0pfWZpbHRlcih0KXtyZXR1cm4gQnQuZmlsdGVyKHRoaXMsdCl9c3RhdGljIGNvYWxlc2NlKHQpe3JldHVybiBCdC5maWx0ZXIodCxuPT4hIW4pfWNvYWxlc2NlKCl7cmV0dXJuIEJ0LmNvYWxlc2NlKHRoaXMpfXN0YXRpYyBhc3luYyB0b1Byb21pc2UodCl7Y29uc3Qgbj1bXTtmb3IgYXdhaXQoY29uc3QgciBvZiB0KW4ucHVzaChyKTtyZXR1cm4gbn10b1Byb21pc2UoKXtyZXR1cm4gQnQudG9Qcm9taXNlKHRoaXMpfWVtaXRPbmUodCl7dGhpcy5fc3RhdGU9PT0wJiYodGhpcy5fcmVzdWx0cy5wdXNoKHQpLHRoaXMuX29uU3RhdGVDaGFuZ2VkLmZpcmUoKSl9ZW1pdE1hbnkodCl7dGhpcy5fc3RhdGU9PT0wJiYodGhpcy5fcmVzdWx0cz10aGlzLl9yZXN1bHRzLmNvbmNhdCh0KSx0aGlzLl9vblN0YXRlQ2hhbmdlZC5maXJlKCkpfXJlc29sdmUoKXt0aGlzLl9zdGF0ZT09PTAmJih0aGlzLl9zdGF0ZT0xLHRoaXMuX29uU3RhdGVDaGFuZ2VkLmZpcmUoKSl9cmVqZWN0KHQpe3RoaXMuX3N0YXRlPT09MCYmKHRoaXMuX3N0YXRlPTIsdGhpcy5fZXJyb3I9dCx0aGlzLl9vblN0YXRlQ2hhbmdlZC5maXJlKCkpfX07QnQuRU1QVFk9QnQuZnJvbUFycmF5KFtdKTtsZXQgZmc9QnQ7Y2xhc3MgUVN7Y29uc3RydWN0b3IodCl7dGhpcy52YWx1ZXM9dCx0aGlzLnByZWZpeFN1bT1uZXcgVWludDMyQXJyYXkodC5sZW5ndGgpLHRoaXMucHJlZml4U3VtVmFsaWRJbmRleD1uZXcgSW50MzJBcnJheSgxKSx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF09LTF9aW5zZXJ0VmFsdWVzKHQsbil7dD1CaSh0KTtjb25zdCByPXRoaXMudmFsdWVzLHM9dGhpcy5wcmVmaXhTdW0saT1uLmxlbmd0aDtyZXR1cm4gaT09PTA/ITE6KHRoaXMudmFsdWVzPW5ldyBVaW50MzJBcnJheShyLmxlbmd0aCtpKSx0aGlzLnZhbHVlcy5zZXQoci5zdWJhcnJheSgwLHQpLDApLHRoaXMudmFsdWVzLnNldChyLnN1YmFycmF5KHQpLHQraSksdGhpcy52YWx1ZXMuc2V0KG4sdCksdC0xPHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSYmKHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXT10LTEpLHRoaXMucHJlZml4U3VtPW5ldyBVaW50MzJBcnJheSh0aGlzLnZhbHVlcy5sZW5ndGgpLHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXT49MCYmdGhpcy5wcmVmaXhTdW0uc2V0KHMuc3ViYXJyYXkoMCx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0rMSkpLCEwKX1zZXRWYWx1ZSh0LG4pe3JldHVybiB0PUJpKHQpLG49QmkobiksdGhpcy52YWx1ZXNbdF09PT1uPyExOih0aGlzLnZhbHVlc1t0XT1uLHQtMTx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0mJih0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF09dC0xKSwhMCl9cmVtb3ZlVmFsdWVzKHQsbil7dD1CaSh0KSxuPUJpKG4pO2NvbnN0IHI9dGhpcy52YWx1ZXMscz10aGlzLnByZWZpeFN1bTtpZih0Pj1yLmxlbmd0aClyZXR1cm4hMTtjb25zdCBpPXIubGVuZ3RoLXQ7cmV0dXJuIG4+PWkmJihuPWkpLG49PT0wPyExOih0aGlzLnZhbHVlcz1uZXcgVWludDMyQXJyYXkoci5sZW5ndGgtbiksdGhpcy52YWx1ZXMuc2V0KHIuc3ViYXJyYXkoMCx0KSwwKSx0aGlzLnZhbHVlcy5zZXQoci5zdWJhcnJheSh0K24pLHQpLHRoaXMucHJlZml4U3VtPW5ldyBVaW50MzJBcnJheSh0aGlzLnZhbHVlcy5sZW5ndGgpLHQtMTx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0mJih0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF09dC0xKSx0aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0+PTAmJnRoaXMucHJlZml4U3VtLnNldChzLnN1YmFycmF5KDAsdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKzEpKSwhMCl9Z2V0VG90YWxTdW0oKXtyZXR1cm4gdGhpcy52YWx1ZXMubGVuZ3RoPT09MD8wOnRoaXMuX2dldFByZWZpeFN1bSh0aGlzLnZhbHVlcy5sZW5ndGgtMSl9Z2V0UHJlZml4U3VtKHQpe3JldHVybiB0PDA/MDoodD1CaSh0KSx0aGlzLl9nZXRQcmVmaXhTdW0odCkpfV9nZXRQcmVmaXhTdW0odCl7aWYodDw9dGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdKXJldHVybiB0aGlzLnByZWZpeFN1bVt0XTtsZXQgbj10aGlzLnByZWZpeFN1bVZhbGlkSW5kZXhbMF0rMTtuPT09MCYmKHRoaXMucHJlZml4U3VtWzBdPXRoaXMudmFsdWVzWzBdLG4rKyksdD49dGhpcy52YWx1ZXMubGVuZ3RoJiYodD10aGlzLnZhbHVlcy5sZW5ndGgtMSk7Zm9yKGxldCByPW47cjw9dDtyKyspdGhpcy5wcmVmaXhTdW1bcl09dGhpcy5wcmVmaXhTdW1bci0xXSt0aGlzLnZhbHVlc1tyXTtyZXR1cm4gdGhpcy5wcmVmaXhTdW1WYWxpZEluZGV4WzBdPU1hdGgubWF4KHRoaXMucHJlZml4U3VtVmFsaWRJbmRleFswXSx0KSx0aGlzLnByZWZpeFN1bVt0XX1nZXRJbmRleE9mKHQpe3Q9TWF0aC5mbG9vcih0KSx0aGlzLmdldFRvdGFsU3VtKCk7bGV0IG49MCxyPXRoaXMudmFsdWVzLmxlbmd0aC0xLHM9MCxpPTAsbz0wO2Zvcig7bjw9cjspaWYocz1uKyhyLW4pLzJ8MCxpPXRoaXMucHJlZml4U3VtW3NdLG89aS10aGlzLnZhbHVlc1tzXSx0PG8pcj1zLTE7ZWxzZSBpZih0Pj1pKW49cysxO2Vsc2UgYnJlYWs7cmV0dXJuIG5ldyBaUyhzLHQtbyl9fWNsYXNzIFpTe2NvbnN0cnVjdG9yKHQsbil7dGhpcy5pbmRleD10LHRoaXMucmVtYWluZGVyPW4sdGhpcy5fcHJlZml4U3VtSW5kZXhPZlJlc3VsdEJyYW5kPXZvaWQgMCx0aGlzLmluZGV4PXQsdGhpcy5yZW1haW5kZXI9bn19Y2xhc3MgZTl7Y29uc3RydWN0b3IodCxuLHIscyl7dGhpcy5fdXJpPXQsdGhpcy5fbGluZXM9bix0aGlzLl9lb2w9cix0aGlzLl92ZXJzaW9uSWQ9cyx0aGlzLl9saW5lU3RhcnRzPW51bGwsdGhpcy5fY2FjaGVkVGV4dFZhbHVlPW51bGx9ZGlzcG9zZSgpe3RoaXMuX2xpbmVzLmxlbmd0aD0wfWdldCB2ZXJzaW9uKCl7cmV0dXJuIHRoaXMuX3ZlcnNpb25JZH1nZXRUZXh0KCl7cmV0dXJuIHRoaXMuX2NhY2hlZFRleHRWYWx1ZT09PW51bGwmJih0aGlzLl9jYWNoZWRUZXh0VmFsdWU9dGhpcy5fbGluZXMuam9pbih0aGlzLl9lb2wpKSx0aGlzLl9jYWNoZWRUZXh0VmFsdWV9b25FdmVudHModCl7dC5lb2wmJnQuZW9sIT09dGhpcy5fZW9sJiYodGhpcy5fZW9sPXQuZW9sLHRoaXMuX2xpbmVTdGFydHM9bnVsbCk7Y29uc3Qgbj10LmNoYW5nZXM7Zm9yKGNvbnN0IHIgb2Ygbil0aGlzLl9hY2NlcHREZWxldGVSYW5nZShyLnJhbmdlKSx0aGlzLl9hY2NlcHRJbnNlcnRUZXh0KG5ldyBKZShyLnJhbmdlLnN0YXJ0TGluZU51bWJlcixyLnJhbmdlLnN0YXJ0Q29sdW1uKSxyLnRleHQpO3RoaXMuX3ZlcnNpb25JZD10LnZlcnNpb25JZCx0aGlzLl9jYWNoZWRUZXh0VmFsdWU9bnVsbH1fZW5zdXJlTGluZVN0YXJ0cygpe2lmKCF0aGlzLl9saW5lU3RhcnRzKXtjb25zdCB0PXRoaXMuX2VvbC5sZW5ndGgsbj10aGlzLl9saW5lcy5sZW5ndGgscj1uZXcgVWludDMyQXJyYXkobik7Zm9yKGxldCBzPTA7czxuO3MrKylyW3NdPXRoaXMuX2xpbmVzW3NdLmxlbmd0aCt0O3RoaXMuX2xpbmVTdGFydHM9bmV3IFFTKHIpfX1fc2V0TGluZVRleHQodCxuKXt0aGlzLl9saW5lc1t0XT1uLHRoaXMuX2xpbmVTdGFydHMmJnRoaXMuX2xpbmVTdGFydHMuc2V0VmFsdWUodCx0aGlzLl9saW5lc1t0XS5sZW5ndGgrdGhpcy5fZW9sLmxlbmd0aCl9X2FjY2VwdERlbGV0ZVJhbmdlKHQpe2lmKHQuc3RhcnRMaW5lTnVtYmVyPT09dC5lbmRMaW5lTnVtYmVyKXtpZih0LnN0YXJ0Q29sdW1uPT09dC5lbmRDb2x1bW4pcmV0dXJuO3RoaXMuX3NldExpbmVUZXh0KHQuc3RhcnRMaW5lTnVtYmVyLTEsdGhpcy5fbGluZXNbdC5zdGFydExpbmVOdW1iZXItMV0uc3Vic3RyaW5nKDAsdC5zdGFydENvbHVtbi0xKSt0aGlzLl9saW5lc1t0LnN0YXJ0TGluZU51bWJlci0xXS5zdWJzdHJpbmcodC5lbmRDb2x1bW4tMSkpO3JldHVybn10aGlzLl9zZXRMaW5lVGV4dCh0LnN0YXJ0TGluZU51bWJlci0xLHRoaXMuX2xpbmVzW3Quc3RhcnRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZygwLHQuc3RhcnRDb2x1bW4tMSkrdGhpcy5fbGluZXNbdC5lbmRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZyh0LmVuZENvbHVtbi0xKSksdGhpcy5fbGluZXMuc3BsaWNlKHQuc3RhcnRMaW5lTnVtYmVyLHQuZW5kTGluZU51bWJlci10LnN0YXJ0TGluZU51bWJlciksdGhpcy5fbGluZVN0YXJ0cyYmdGhpcy5fbGluZVN0YXJ0cy5yZW1vdmVWYWx1ZXModC5zdGFydExpbmVOdW1iZXIsdC5lbmRMaW5lTnVtYmVyLXQuc3RhcnRMaW5lTnVtYmVyKX1fYWNjZXB0SW5zZXJ0VGV4dCh0LG4pe2lmKG4ubGVuZ3RoPT09MClyZXR1cm47Y29uc3Qgcj1KQyhuKTtpZihyLmxlbmd0aD09PTEpe3RoaXMuX3NldExpbmVUZXh0KHQubGluZU51bWJlci0xLHRoaXMuX2xpbmVzW3QubGluZU51bWJlci0xXS5zdWJzdHJpbmcoMCx0LmNvbHVtbi0xKStyWzBdK3RoaXMuX2xpbmVzW3QubGluZU51bWJlci0xXS5zdWJzdHJpbmcodC5jb2x1bW4tMSkpO3JldHVybn1yW3IubGVuZ3RoLTFdKz10aGlzLl9saW5lc1t0LmxpbmVOdW1iZXItMV0uc3Vic3RyaW5nKHQuY29sdW1uLTEpLHRoaXMuX3NldExpbmVUZXh0KHQubGluZU51bWJlci0xLHRoaXMuX2xpbmVzW3QubGluZU51bWJlci0xXS5zdWJzdHJpbmcoMCx0LmNvbHVtbi0xKStyWzBdKTtjb25zdCBzPW5ldyBVaW50MzJBcnJheShyLmxlbmd0aC0xKTtmb3IobGV0IGk9MTtpPHIubGVuZ3RoO2krKyl0aGlzLl9saW5lcy5zcGxpY2UodC5saW5lTnVtYmVyK2ktMSwwLHJbaV0pLHNbaS0xXT1yW2ldLmxlbmd0aCt0aGlzLl9lb2wubGVuZ3RoO3RoaXMuX2xpbmVTdGFydHMmJnRoaXMuX2xpbmVTdGFydHMuaW5zZXJ0VmFsdWVzKHQubGluZU51bWJlcixzKX19Y2xhc3MgdDl7Y29uc3RydWN0b3IoKXt0aGlzLl9tb2RlbHM9T2JqZWN0LmNyZWF0ZShudWxsKX1nZXRNb2RlbCh0KXtyZXR1cm4gdGhpcy5fbW9kZWxzW3RdfWdldE1vZGVscygpe2NvbnN0IHQ9W107cmV0dXJuIE9iamVjdC5rZXlzKHRoaXMuX21vZGVscykuZm9yRWFjaChuPT50LnB1c2godGhpcy5fbW9kZWxzW25dKSksdH0kYWNjZXB0TmV3TW9kZWwodCl7dGhpcy5fbW9kZWxzW3QudXJsXT1uZXcgbjkoS24ucGFyc2UodC51cmwpLHQubGluZXMsdC5FT0wsdC52ZXJzaW9uSWQpfSRhY2NlcHRNb2RlbENoYW5nZWQodCxuKXtpZighdGhpcy5fbW9kZWxzW3RdKXJldHVybjt0aGlzLl9tb2RlbHNbdF0ub25FdmVudHMobil9JGFjY2VwdFJlbW92ZWRNb2RlbCh0KXt0aGlzLl9tb2RlbHNbdF0mJmRlbGV0ZSB0aGlzLl9tb2RlbHNbdF19fWNsYXNzIG45IGV4dGVuZHMgZTl7Z2V0IHVyaSgpe3JldHVybiB0aGlzLl91cml9Z2V0IGVvbCgpe3JldHVybiB0aGlzLl9lb2x9Z2V0VmFsdWUoKXtyZXR1cm4gdGhpcy5nZXRUZXh0KCl9ZmluZE1hdGNoZXModCl7Y29uc3Qgbj1bXTtmb3IobGV0IHI9MDtyPHRoaXMuX2xpbmVzLmxlbmd0aDtyKyspe2NvbnN0IHM9dGhpcy5fbGluZXNbcl0saT10aGlzLm9mZnNldEF0KG5ldyBKZShyKzEsMSkpLG89cy5tYXRjaEFsbCh0KTtmb3IoY29uc3QgYSBvZiBvKShhLmluZGV4fHxhLmluZGV4PT09MCkmJihhLmluZGV4PWEuaW5kZXgraSksbi5wdXNoKGEpfXJldHVybiBufWdldExpbmVzQ29udGVudCgpe3JldHVybiB0aGlzLl9saW5lcy5zbGljZSgwKX1nZXRMaW5lQ291bnQoKXtyZXR1cm4gdGhpcy5fbGluZXMubGVuZ3RofWdldExpbmVDb250ZW50KHQpe3JldHVybiB0aGlzLl9saW5lc1t0LTFdfWdldFdvcmRBdFBvc2l0aW9uKHQsbil7Y29uc3Qgcj16Zih0LmNvbHVtbixNMChuKSx0aGlzLl9saW5lc1t0LmxpbmVOdW1iZXItMV0sMCk7cmV0dXJuIHI/bmV3IGhlKHQubGluZU51bWJlcixyLnN0YXJ0Q29sdW1uLHQubGluZU51bWJlcixyLmVuZENvbHVtbik6bnVsbH13b3Jkcyh0KXtjb25zdCBuPXRoaXMuX2xpbmVzLHI9dGhpcy5fd29yZGVuaXplLmJpbmQodGhpcyk7bGV0IHM9MCxpPSIiLG89MCxhPVtdO3JldHVybnsqW1N5bWJvbC5pdGVyYXRvcl0oKXtmb3IoOzspaWYobzxhLmxlbmd0aCl7Y29uc3QgdT1pLnN1YnN0cmluZyhhW29dLnN0YXJ0LGFbb10uZW5kKTtvKz0xLHlpZWxkIHV9ZWxzZSBpZihzPG4ubGVuZ3RoKWk9bltzXSxhPXIoaSx0KSxvPTAscys9MTtlbHNlIGJyZWFrfX19Z2V0TGluZVdvcmRzKHQsbil7Y29uc3Qgcj10aGlzLl9saW5lc1t0LTFdLHM9dGhpcy5fd29yZGVuaXplKHIsbiksaT1bXTtmb3IoY29uc3QgbyBvZiBzKWkucHVzaCh7d29yZDpyLnN1YnN0cmluZyhvLnN0YXJ0LG8uZW5kKSxzdGFydENvbHVtbjpvLnN0YXJ0KzEsZW5kQ29sdW1uOm8uZW5kKzF9KTtyZXR1cm4gaX1fd29yZGVuaXplKHQsbil7Y29uc3Qgcj1bXTtsZXQgcztmb3Iobi5sYXN0SW5kZXg9MDsocz1uLmV4ZWModCkpJiZzWzBdLmxlbmd0aCE9PTA7KXIucHVzaCh7c3RhcnQ6cy5pbmRleCxlbmQ6cy5pbmRleCtzWzBdLmxlbmd0aH0pO3JldHVybiByfWdldFZhbHVlSW5SYW5nZSh0KXtpZih0PXRoaXMuX3ZhbGlkYXRlUmFuZ2UodCksdC5zdGFydExpbmVOdW1iZXI9PT10LmVuZExpbmVOdW1iZXIpcmV0dXJuIHRoaXMuX2xpbmVzW3Quc3RhcnRMaW5lTnVtYmVyLTFdLnN1YnN0cmluZyh0LnN0YXJ0Q29sdW1uLTEsdC5lbmRDb2x1bW4tMSk7Y29uc3Qgbj10aGlzLl9lb2wscj10LnN0YXJ0TGluZU51bWJlci0xLHM9dC5lbmRMaW5lTnVtYmVyLTEsaT1bXTtpLnB1c2godGhpcy5fbGluZXNbcl0uc3Vic3RyaW5nKHQuc3RhcnRDb2x1bW4tMSkpO2ZvcihsZXQgbz1yKzE7bzxzO28rKylpLnB1c2godGhpcy5fbGluZXNbb10pO3JldHVybiBpLnB1c2godGhpcy5fbGluZXNbc10uc3Vic3RyaW5nKDAsdC5lbmRDb2x1bW4tMSkpLGkuam9pbihuKX1vZmZzZXRBdCh0KXtyZXR1cm4gdD10aGlzLl92YWxpZGF0ZVBvc2l0aW9uKHQpLHRoaXMuX2Vuc3VyZUxpbmVTdGFydHMoKSx0aGlzLl9saW5lU3RhcnRzLmdldFByZWZpeFN1bSh0LmxpbmVOdW1iZXItMikrKHQuY29sdW1uLTEpfXBvc2l0aW9uQXQodCl7dD1NYXRoLmZsb29yKHQpLHQ9TWF0aC5tYXgoMCx0KSx0aGlzLl9lbnN1cmVMaW5lU3RhcnRzKCk7Y29uc3Qgbj10aGlzLl9saW5lU3RhcnRzLmdldEluZGV4T2YodCkscj10aGlzLl9saW5lc1tuLmluZGV4XS5sZW5ndGg7cmV0dXJue2xpbmVOdW1iZXI6MStuLmluZGV4LGNvbHVtbjoxK01hdGgubWluKG4ucmVtYWluZGVyLHIpfX1fdmFsaWRhdGVSYW5nZSh0KXtjb25zdCBuPXRoaXMuX3ZhbGlkYXRlUG9zaXRpb24oe2xpbmVOdW1iZXI6dC5zdGFydExpbmVOdW1iZXIsY29sdW1uOnQuc3RhcnRDb2x1bW59KSxyPXRoaXMuX3ZhbGlkYXRlUG9zaXRpb24oe2xpbmVOdW1iZXI6dC5lbmRMaW5lTnVtYmVyLGNvbHVtbjp0LmVuZENvbHVtbn0pO3JldHVybiBuLmxpbmVOdW1iZXIhPT10LnN0YXJ0TGluZU51bWJlcnx8bi5jb2x1bW4hPT10LnN0YXJ0Q29sdW1ufHxyLmxpbmVOdW1iZXIhPT10LmVuZExpbmVOdW1iZXJ8fHIuY29sdW1uIT09dC5lbmRDb2x1bW4/e3N0YXJ0TGluZU51bWJlcjpuLmxpbmVOdW1iZXIsc3RhcnRDb2x1bW46bi5jb2x1bW4sZW5kTGluZU51bWJlcjpyLmxpbmVOdW1iZXIsZW5kQ29sdW1uOnIuY29sdW1ufTp0fV92YWxpZGF0ZVBvc2l0aW9uKHQpe2lmKCFKZS5pc0lQb3NpdGlvbih0KSl0aHJvdyBuZXcgRXJyb3IoImJhZCBwb3NpdGlvbiIpO2xldHtsaW5lTnVtYmVyOm4sY29sdW1uOnJ9PXQscz0hMTtpZihuPDEpbj0xLHI9MSxzPSEwO2Vsc2UgaWYobj50aGlzLl9saW5lcy5sZW5ndGgpbj10aGlzLl9saW5lcy5sZW5ndGgscj10aGlzLl9saW5lc1tuLTFdLmxlbmd0aCsxLHM9ITA7ZWxzZXtjb25zdCBpPXRoaXMuX2xpbmVzW24tMV0ubGVuZ3RoKzE7cjwxPyhyPTEscz0hMCk6cj5pJiYocj1pLHM9ITApfXJldHVybiBzP3tsaW5lTnVtYmVyOm4sY29sdW1uOnJ9OnR9fWNvbnN0IGhmPWNsYXNzIGhme2NvbnN0cnVjdG9yKCl7dGhpcy5fd29ya2VyVGV4dE1vZGVsU3luY1NlcnZlcj1uZXcgdDl9ZGlzcG9zZSgpe31fZ2V0TW9kZWwodCl7cmV0dXJuIHRoaXMuX3dvcmtlclRleHRNb2RlbFN5bmNTZXJ2ZXIuZ2V0TW9kZWwodCl9X2dldE1vZGVscygpe3JldHVybiB0aGlzLl93b3JrZXJUZXh0TW9kZWxTeW5jU2VydmVyLmdldE1vZGVscygpfSRhY2NlcHROZXdNb2RlbCh0KXt0aGlzLl93b3JrZXJUZXh0TW9kZWxTeW5jU2VydmVyLiRhY2NlcHROZXdNb2RlbCh0KX0kYWNjZXB0TW9kZWxDaGFuZ2VkKHQsbil7dGhpcy5fd29ya2VyVGV4dE1vZGVsU3luY1NlcnZlci4kYWNjZXB0TW9kZWxDaGFuZ2VkKHQsbil9JGFjY2VwdFJlbW92ZWRNb2RlbCh0KXt0aGlzLl93b3JrZXJUZXh0TW9kZWxTeW5jU2VydmVyLiRhY2NlcHRSZW1vdmVkTW9kZWwodCl9YXN5bmMgJGNvbXB1dGVVbmljb2RlSGlnaGxpZ2h0cyh0LG4scil7Y29uc3Qgcz10aGlzLl9nZXRNb2RlbCh0KTtyZXR1cm4gcz91Uy5jb21wdXRlVW5pY29kZUhpZ2hsaWdodHMocyxuLHIpOntyYW5nZXM6W10saGFzTW9yZTohMSxhbWJpZ3VvdXNDaGFyYWN0ZXJDb3VudDowLGludmlzaWJsZUNoYXJhY3RlckNvdW50OjAsbm9uQmFzaWNBc2NpaUNoYXJhY3RlckNvdW50OjB9fWFzeW5jICRmaW5kU2VjdGlvbkhlYWRlcnModCxuKXtjb25zdCByPXRoaXMuX2dldE1vZGVsKHQpO3JldHVybiByP0dTKHIsbik6W119YXN5bmMgJGNvbXB1dGVEaWZmKHQsbixyLHMpe2NvbnN0IGk9dGhpcy5fZ2V0TW9kZWwodCksbz10aGlzLl9nZXRNb2RlbChuKTtyZXR1cm4haXx8IW8/bnVsbDpHdS5jb21wdXRlRGlmZihpLG8scixzKX1zdGF0aWMgY29tcHV0ZURpZmYodCxuLHIscyl7Y29uc3QgaT1zPT09ImFkdmFuY2VkIj9zZy5nZXREZWZhdWx0KCk6c2cuZ2V0TGVnYWN5KCksbz10LmdldExpbmVzQ29udGVudCgpLGE9bi5nZXRMaW5lc0NvbnRlbnQoKSx1PWkuY29tcHV0ZURpZmYobyxhLHIpLGw9dS5jaGFuZ2VzLmxlbmd0aD4wPyExOnRoaXMuX21vZGVsc0FyZUlkZW50aWNhbCh0LG4pO2Z1bmN0aW9uIGYoYyl7cmV0dXJuIGMubWFwKHA9Pnt2YXIgaDtyZXR1cm5bcC5vcmlnaW5hbC5zdGFydExpbmVOdW1iZXIscC5vcmlnaW5hbC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLHAubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLHAubW9kaWZpZWQuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSwoaD1wLmlubmVyQ2hhbmdlcyk9PW51bGw/dm9pZCAwOmgubWFwKGQ9PltkLm9yaWdpbmFsUmFuZ2Uuc3RhcnRMaW5lTnVtYmVyLGQub3JpZ2luYWxSYW5nZS5zdGFydENvbHVtbixkLm9yaWdpbmFsUmFuZ2UuZW5kTGluZU51bWJlcixkLm9yaWdpbmFsUmFuZ2UuZW5kQ29sdW1uLGQubW9kaWZpZWRSYW5nZS5zdGFydExpbmVOdW1iZXIsZC5tb2RpZmllZFJhbmdlLnN0YXJ0Q29sdW1uLGQubW9kaWZpZWRSYW5nZS5lbmRMaW5lTnVtYmVyLGQubW9kaWZpZWRSYW5nZS5lbmRDb2x1bW5dKV19KX1yZXR1cm57aWRlbnRpY2FsOmwscXVpdEVhcmx5OnUuaGl0VGltZW91dCxjaGFuZ2VzOmYodS5jaGFuZ2VzKSxtb3Zlczp1Lm1vdmVzLm1hcChjPT5bYy5saW5lUmFuZ2VNYXBwaW5nLm9yaWdpbmFsLnN0YXJ0TGluZU51bWJlcixjLmxpbmVSYW5nZU1hcHBpbmcub3JpZ2luYWwuZW5kTGluZU51bWJlckV4Y2x1c2l2ZSxjLmxpbmVSYW5nZU1hcHBpbmcubW9kaWZpZWQuc3RhcnRMaW5lTnVtYmVyLGMubGluZVJhbmdlTWFwcGluZy5tb2RpZmllZC5lbmRMaW5lTnVtYmVyRXhjbHVzaXZlLGYoYy5jaGFuZ2VzKV0pfX1zdGF0aWMgX21vZGVsc0FyZUlkZW50aWNhbCh0LG4pe2NvbnN0IHI9dC5nZXRMaW5lQ291bnQoKSxzPW4uZ2V0TGluZUNvdW50KCk7aWYociE9PXMpcmV0dXJuITE7Zm9yKGxldCBpPTE7aTw9cjtpKyspe2NvbnN0IG89dC5nZXRMaW5lQ29udGVudChpKSxhPW4uZ2V0TGluZUNvbnRlbnQoaSk7aWYobyE9PWEpcmV0dXJuITF9cmV0dXJuITB9YXN5bmMgJGNvbXB1dGVNb3JlTWluaW1hbEVkaXRzKHQsbixyKXtjb25zdCBzPXRoaXMuX2dldE1vZGVsKHQpO2lmKCFzKXJldHVybiBuO2NvbnN0IGk9W107bGV0IG87bj1uLnNsaWNlKDApLnNvcnQoKHUsbCk9PntpZih1LnJhbmdlJiZsLnJhbmdlKXJldHVybiBoZS5jb21wYXJlUmFuZ2VzVXNpbmdTdGFydHModS5yYW5nZSxsLnJhbmdlKTtjb25zdCBmPXUucmFuZ2U/MDoxLGM9bC5yYW5nZT8wOjE7cmV0dXJuIGYtY30pO2xldCBhPTA7Zm9yKGxldCB1PTE7dTxuLmxlbmd0aDt1KyspaGUuZ2V0RW5kUG9zaXRpb24oblthXS5yYW5nZSkuZXF1YWxzKGhlLmdldFN0YXJ0UG9zaXRpb24oblt1XS5yYW5nZSkpPyhuW2FdLnJhbmdlPWhlLmZyb21Qb3NpdGlvbnMoaGUuZ2V0U3RhcnRQb3NpdGlvbihuW2FdLnJhbmdlKSxoZS5nZXRFbmRQb3NpdGlvbihuW3VdLnJhbmdlKSksblthXS50ZXh0Kz1uW3VdLnRleHQpOihhKyssblthXT1uW3VdKTtuLmxlbmd0aD1hKzE7Zm9yKGxldHtyYW5nZTp1LHRleHQ6bCxlb2w6Zn1vZiBuKXtpZih0eXBlb2YgZj09Im51bWJlciImJihvPWYpLGhlLmlzRW1wdHkodSkmJiFsKWNvbnRpbnVlO2NvbnN0IGM9cy5nZXRWYWx1ZUluUmFuZ2UodSk7aWYobD1sLnJlcGxhY2UoL1xyXG58XG58XHIvZyxzLmVvbCksYz09PWwpY29udGludWU7aWYoTWF0aC5tYXgobC5sZW5ndGgsYy5sZW5ndGgpPkd1Ll9kaWZmTGltaXQpe2kucHVzaCh7cmFuZ2U6dSx0ZXh0Omx9KTtjb250aW51ZX1jb25zdCBwPUw4KGMsbCxyKSxoPXMub2Zmc2V0QXQoaGUubGlmdCh1KS5nZXRTdGFydFBvc2l0aW9uKCkpO2Zvcihjb25zdCBkIG9mIHApe2NvbnN0IG09cy5wb3NpdGlvbkF0KGgrZC5vcmlnaW5hbFN0YXJ0KSxnPXMucG9zaXRpb25BdChoK2Qub3JpZ2luYWxTdGFydCtkLm9yaWdpbmFsTGVuZ3RoKSxEPXt0ZXh0Omwuc3Vic3RyKGQubW9kaWZpZWRTdGFydCxkLm1vZGlmaWVkTGVuZ3RoKSxyYW5nZTp7c3RhcnRMaW5lTnVtYmVyOm0ubGluZU51bWJlcixzdGFydENvbHVtbjptLmNvbHVtbixlbmRMaW5lTnVtYmVyOmcubGluZU51bWJlcixlbmRDb2x1bW46Zy5jb2x1bW59fTtzLmdldFZhbHVlSW5SYW5nZShELnJhbmdlKSE9PUQudGV4dCYmaS5wdXNoKEQpfX1yZXR1cm4gdHlwZW9mIG89PSJudW1iZXIiJiZpLnB1c2goe2VvbDpvLHRleHQ6IiIscmFuZ2U6e3N0YXJ0TGluZU51bWJlcjowLHN0YXJ0Q29sdW1uOjAsZW5kTGluZU51bWJlcjowLGVuZENvbHVtbjowfX0pLGl9YXN5bmMgJGNvbXB1dGVMaW5rcyh0KXtjb25zdCBuPXRoaXMuX2dldE1vZGVsKHQpO3JldHVybiBuP1A4KG4pOm51bGx9YXN5bmMgJGNvbXB1dGVEZWZhdWx0RG9jdW1lbnRDb2xvcnModCl7Y29uc3Qgbj10aGlzLl9nZXRNb2RlbCh0KTtyZXR1cm4gbj9KUyhuKTpudWxsfWFzeW5jICR0ZXh0dWFsU3VnZ2VzdCh0LG4scixzKXtjb25zdCBpPW5ldyBOdSxvPW5ldyBSZWdFeHAocixzKSxhPW5ldyBTZXQ7ZTpmb3IoY29uc3QgdSBvZiB0KXtjb25zdCBsPXRoaXMuX2dldE1vZGVsKHUpO2lmKGwpe2Zvcihjb25zdCBmIG9mIGwud29yZHMobykpaWYoIShmPT09bnx8IWlzTmFOKE51bWJlcihmKSkpJiYoYS5hZGQoZiksYS5zaXplPkd1Ll9zdWdnZXN0aW9uc0xpbWl0KSlicmVhayBlfX1yZXR1cm57d29yZHM6QXJyYXkuZnJvbShhKSxkdXJhdGlvbjppLmVsYXBzZWQoKX19YXN5bmMgJGNvbXB1dGVXb3JkUmFuZ2VzKHQsbixyLHMpe2NvbnN0IGk9dGhpcy5fZ2V0TW9kZWwodCk7aWYoIWkpcmV0dXJuIE9iamVjdC5jcmVhdGUobnVsbCk7Y29uc3Qgbz1uZXcgUmVnRXhwKHIscyksYT1PYmplY3QuY3JlYXRlKG51bGwpO2ZvcihsZXQgdT1uLnN0YXJ0TGluZU51bWJlcjt1PG4uZW5kTGluZU51bWJlcjt1Kyspe2NvbnN0IGw9aS5nZXRMaW5lV29yZHModSxvKTtmb3IoY29uc3QgZiBvZiBsKXtpZighaXNOYU4oTnVtYmVyKGYud29yZCkpKWNvbnRpbnVlO2xldCBjPWFbZi53b3JkXTtjfHwoYz1bXSxhW2Yud29yZF09YyksYy5wdXNoKHtzdGFydExpbmVOdW1iZXI6dSxzdGFydENvbHVtbjpmLnN0YXJ0Q29sdW1uLGVuZExpbmVOdW1iZXI6dSxlbmRDb2x1bW46Zi5lbmRDb2x1bW59KX19cmV0dXJuIGF9YXN5bmMgJG5hdmlnYXRlVmFsdWVTZXQodCxuLHIscyxpKXtjb25zdCBvPXRoaXMuX2dldE1vZGVsKHQpO2lmKCFvKXJldHVybiBudWxsO2NvbnN0IGE9bmV3IFJlZ0V4cChzLGkpO24uc3RhcnRDb2x1bW49PT1uLmVuZENvbHVtbiYmKG49e3N0YXJ0TGluZU51bWJlcjpuLnN0YXJ0TGluZU51bWJlcixzdGFydENvbHVtbjpuLnN0YXJ0Q29sdW1uLGVuZExpbmVOdW1iZXI6bi5lbmRMaW5lTnVtYmVyLGVuZENvbHVtbjpuLmVuZENvbHVtbisxfSk7Y29uc3QgdT1vLmdldFZhbHVlSW5SYW5nZShuKSxsPW8uZ2V0V29yZEF0UG9zaXRpb24oe2xpbmVOdW1iZXI6bi5zdGFydExpbmVOdW1iZXIsY29sdW1uOm4uc3RhcnRDb2x1bW59LGEpO2lmKCFsKXJldHVybiBudWxsO2NvbnN0IGY9by5nZXRWYWx1ZUluUmFuZ2UobCk7cmV0dXJuIE1mLklOU1RBTkNFLm5hdmlnYXRlVmFsdWVTZXQobix1LGwsZixyKX19O2hmLl9kaWZmTGltaXQ9MWU1LGhmLl9zdWdnZXN0aW9uc0xpbWl0PTFlNDtsZXQgbnA9aGY7Y2xhc3MgR3UgZXh0ZW5kcyBucHtjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKCksdGhpcy5faG9zdD10LHRoaXMuX2ZvcmVpZ25Nb2R1bGVGYWN0b3J5PW4sdGhpcy5fZm9yZWlnbk1vZHVsZT1udWxsfWFzeW5jICRwaW5nKCl7cmV0dXJuInBvbmcifSRsb2FkRm9yZWlnbk1vZHVsZSh0LG4scil7Y29uc3Qgbz17aG9zdDpaOChyLChhLHUpPT50aGlzLl9ob3N0LiRmaHIoYSx1KSksZ2V0TWlycm9yTW9kZWxzOigpPT50aGlzLl9nZXRNb2RlbHMoKX07cmV0dXJuIHRoaXMuX2ZvcmVpZ25Nb2R1bGVGYWN0b3J5Pyh0aGlzLl9mb3JlaWduTW9kdWxlPXRoaXMuX2ZvcmVpZ25Nb2R1bGVGYWN0b3J5KG8sbiksUHJvbWlzZS5yZXNvbHZlKEwwKHRoaXMuX2ZvcmVpZ25Nb2R1bGUpKSk6bmV3IFByb21pc2UoKGEsdSk9Pntjb25zdCBsPWY9Pnt0aGlzLl9mb3JlaWduTW9kdWxlPWYuY3JlYXRlKG8sbiksYShMMCh0aGlzLl9mb3JlaWduTW9kdWxlKSl9O2ltcG9ydChgJHt5MS5hc0Jyb3dzZXJVcmkoYCR7dH0uanNgKS50b1N0cmluZyghMCl9YCkudGhlbihsKS5jYXRjaCh1KX0pfSRmbXIodCxuKXtpZighdGhpcy5fZm9yZWlnbk1vZHVsZXx8dHlwZW9mIHRoaXMuX2ZvcmVpZ25Nb2R1bGVbdF0hPSJmdW5jdGlvbiIpcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcigiTWlzc2luZyByZXF1ZXN0SGFuZGxlciBvciBtZXRob2Q6ICIrdCkpO3RyeXtyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMuX2ZvcmVpZ25Nb2R1bGVbdF0uYXBwbHkodGhpcy5fZm9yZWlnbk1vZHVsZSxuKSl9Y2F0Y2gocil7cmV0dXJuIFByb21pc2UucmVqZWN0KHIpfX19dHlwZW9mIGltcG9ydFNjcmlwdHM9PSJmdW5jdGlvbiImJihnbG9iYWxUaGlzLm1vbmFjbz16OCgpKTtsZXQgcnA9ITE7ZnVuY3Rpb24gcGcoZSl7aWYocnApcmV0dXJuO3JwPSEwO2NvbnN0IHQ9bmV3IFQ4KG49PntnbG9iYWxUaGlzLnBvc3RNZXNzYWdlKG4pfSxuPT5uZXcgR3UoSmYuZ2V0Q2hhbm5lbChuKSxlKSk7Z2xvYmFsVGhpcy5vbm1lc3NhZ2U9bj0+e3Qub25tZXNzYWdlKG4uZGF0YSl9fWdsb2JhbFRoaXMub25tZXNzYWdlPWU9PntycHx8cGcobnVsbCl9O2Z1bmN0aW9uIHI5KGUpe3NlbGYub25tZXNzYWdlPSgpPT57cGcoKHQsbik9Pk9iamVjdC5jcmVhdGUoZSh0LG4pKSl9fWxldCBoZz1jbGFzcyBabXtjb25zdHJ1Y3Rvcih0LG4scixzKXt0aGlzLl91cmk9dCx0aGlzLl9sYW5ndWFnZUlkPW4sdGhpcy5fdmVyc2lvbj1yLHRoaXMuX2NvbnRlbnQ9cyx0aGlzLl9saW5lT2Zmc2V0cz12b2lkIDB9Z2V0IHVyaSgpe3JldHVybiB0aGlzLl91cml9Z2V0IGxhbmd1YWdlSWQoKXtyZXR1cm4gdGhpcy5fbGFuZ3VhZ2VJZH1nZXQgdmVyc2lvbigpe3JldHVybiB0aGlzLl92ZXJzaW9ufWdldFRleHQodCl7aWYodCl7Y29uc3Qgbj10aGlzLm9mZnNldEF0KHQuc3RhcnQpLHI9dGhpcy5vZmZzZXRBdCh0LmVuZCk7cmV0dXJuIHRoaXMuX2NvbnRlbnQuc3Vic3RyaW5nKG4scil9cmV0dXJuIHRoaXMuX2NvbnRlbnR9dXBkYXRlKHQsbil7Zm9yKGNvbnN0IHIgb2YgdClpZihabS5pc0luY3JlbWVudGFsKHIpKXtjb25zdCBzPWdnKHIucmFuZ2UpLGk9dGhpcy5vZmZzZXRBdChzLnN0YXJ0KSxvPXRoaXMub2Zmc2V0QXQocy5lbmQpO3RoaXMuX2NvbnRlbnQ9dGhpcy5fY29udGVudC5zdWJzdHJpbmcoMCxpKStyLnRleHQrdGhpcy5fY29udGVudC5zdWJzdHJpbmcobyx0aGlzLl9jb250ZW50Lmxlbmd0aCk7Y29uc3QgYT1NYXRoLm1heChzLnN0YXJ0LmxpbmUsMCksdT1NYXRoLm1heChzLmVuZC5saW5lLDApO2xldCBsPXRoaXMuX2xpbmVPZmZzZXRzO2NvbnN0IGY9ZGcoci50ZXh0LCExLGkpO2lmKHUtYT09PWYubGVuZ3RoKWZvcihsZXQgcD0wLGg9Zi5sZW5ndGg7cDxoO3ArKylsW3ArYSsxXT1mW3BdO2Vsc2UgZi5sZW5ndGg8MWU0P2wuc3BsaWNlKGErMSx1LWEsLi4uZik6dGhpcy5fbGluZU9mZnNldHM9bD1sLnNsaWNlKDAsYSsxKS5jb25jYXQoZixsLnNsaWNlKHUrMSkpO2NvbnN0IGM9ci50ZXh0Lmxlbmd0aC0oby1pKTtpZihjIT09MClmb3IobGV0IHA9YSsxK2YubGVuZ3RoLGg9bC5sZW5ndGg7cDxoO3ArKylsW3BdPWxbcF0rY31lbHNlIGlmKFptLmlzRnVsbChyKSl0aGlzLl9jb250ZW50PXIudGV4dCx0aGlzLl9saW5lT2Zmc2V0cz12b2lkIDA7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlVua25vd24gY2hhbmdlIGV2ZW50IHJlY2VpdmVkIik7dGhpcy5fdmVyc2lvbj1ufWdldExpbmVPZmZzZXRzKCl7cmV0dXJuIHRoaXMuX2xpbmVPZmZzZXRzPT09dm9pZCAwJiYodGhpcy5fbGluZU9mZnNldHM9ZGcodGhpcy5fY29udGVudCwhMCkpLHRoaXMuX2xpbmVPZmZzZXRzfXBvc2l0aW9uQXQodCl7dD1NYXRoLm1heChNYXRoLm1pbih0LHRoaXMuX2NvbnRlbnQubGVuZ3RoKSwwKTtjb25zdCBuPXRoaXMuZ2V0TGluZU9mZnNldHMoKTtsZXQgcj0wLHM9bi5sZW5ndGg7aWYocz09PTApcmV0dXJue2xpbmU6MCxjaGFyYWN0ZXI6dH07Zm9yKDtyPHM7KXtjb25zdCBvPU1hdGguZmxvb3IoKHIrcykvMik7bltvXT50P3M9bzpyPW8rMX1jb25zdCBpPXItMTtyZXR1cm4gdD10aGlzLmVuc3VyZUJlZm9yZUVPTCh0LG5baV0pLHtsaW5lOmksY2hhcmFjdGVyOnQtbltpXX19b2Zmc2V0QXQodCl7Y29uc3Qgbj10aGlzLmdldExpbmVPZmZzZXRzKCk7aWYodC5saW5lPj1uLmxlbmd0aClyZXR1cm4gdGhpcy5fY29udGVudC5sZW5ndGg7aWYodC5saW5lPDApcmV0dXJuIDA7Y29uc3Qgcj1uW3QubGluZV07aWYodC5jaGFyYWN0ZXI8PTApcmV0dXJuIHI7Y29uc3Qgcz10LmxpbmUrMTxuLmxlbmd0aD9uW3QubGluZSsxXTp0aGlzLl9jb250ZW50Lmxlbmd0aCxpPU1hdGgubWluKHIrdC5jaGFyYWN0ZXIscyk7cmV0dXJuIHRoaXMuZW5zdXJlQmVmb3JlRU9MKGkscil9Z2V0TGluZVJhbmdlKHQpe2NvbnN0IG49dGhpcy5nZXRMaW5lT2Zmc2V0cygpO2lmKHQ+PW4ubGVuZ3RoKXtjb25zdCBvPW4ubGVuZ3RoLTE7cmV0dXJue3N0YXJ0OntsaW5lOm8sY2hhcmFjdGVyOjB9LGVuZDp7bGluZTpvLGNoYXJhY3Rlcjp0aGlzLl9jb250ZW50Lmxlbmd0aC1uW29dfX19ZWxzZSBpZih0PDApcmV0dXJue3N0YXJ0OntsaW5lOjAsY2hhcmFjdGVyOjB9LGVuZDp7bGluZTowLGNoYXJhY3RlcjowfX07Y29uc3Qgcj1uW3RdLHM9dCsxPG4ubGVuZ3RoP25bdCsxXTp0aGlzLl9jb250ZW50Lmxlbmd0aCxpPXRoaXMuZW5zdXJlQmVmb3JlRU9MKHMscik7cmV0dXJue3N0YXJ0OntsaW5lOnQsY2hhcmFjdGVyOjB9LGVuZDp7bGluZTp0LGNoYXJhY3RlcjppLXJ9fX1nZXRFT0xDaGFyYWN0ZXJzKHQpe2NvbnN0IG49dGhpcy5nZXRMaW5lT2Zmc2V0cygpO2lmKHQ+PW4ubGVuZ3RoKXJldHVybiIiO2lmKHQ8MClyZXR1cm4iIjtjb25zdCByPXQrMTxuLmxlbmd0aD9uW3QrMV06dGhpcy5fY29udGVudC5sZW5ndGgscz10aGlzLmVuc3VyZUJlZm9yZUVPTChyLG5bdF0pO3JldHVybiB0aGlzLl9jb250ZW50LnN1YnN0cmluZyhzLHIpfWVuc3VyZUJlZm9yZUVPTCh0LG4pe2Zvcig7dD5uJiZtZyh0aGlzLl9jb250ZW50LmNoYXJDb2RlQXQodC0xKSk7KXQtLTtyZXR1cm4gdH1nZXQgbGluZUNvdW50KCl7cmV0dXJuIHRoaXMuZ2V0TGluZU9mZnNldHMoKS5sZW5ndGh9c3RhdGljIGlzSW5jcmVtZW50YWwodCl7Y29uc3Qgbj10O3JldHVybiBuIT1udWxsJiZ0eXBlb2Ygbi50ZXh0PT0ic3RyaW5nIiYmbi5yYW5nZSE9PXZvaWQgMCYmKG4ucmFuZ2VMZW5ndGg9PT12b2lkIDB8fHR5cGVvZiBuLnJhbmdlTGVuZ3RoPT0ibnVtYmVyIil9c3RhdGljIGlzRnVsbCh0KXtjb25zdCBuPXQ7cmV0dXJuIG4hPW51bGwmJnR5cGVvZiBuLnRleHQ9PSJzdHJpbmciJiZuLnJhbmdlPT09dm9pZCAwJiZuLnJhbmdlTGVuZ3RoPT09dm9pZCAwfX07dmFyIHNwOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHMsaSxvLGEpe3JldHVybiBuZXcgaGcocyxpLG8sYSl9ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHMsaSxvKXtpZihzIGluc3RhbmNlb2YgaGcpcmV0dXJuIHMudXBkYXRlKGksbyksczt0aHJvdyBuZXcgRXJyb3IoIlRleHREb2N1bWVudC51cGRhdGU6IGRvY3VtZW50IG11c3QgYmUgY3JlYXRlZCBieSBUZXh0RG9jdW1lbnQuY3JlYXRlIil9ZS51cGRhdGU9bjtmdW5jdGlvbiByKHMsaSl7Y29uc3Qgbz1zLmdldFRleHQoKSxhPWlwKGkubWFwKHM5KSwoZixjKT0+e2NvbnN0IHA9Zi5yYW5nZS5zdGFydC5saW5lLWMucmFuZ2Uuc3RhcnQubGluZTtyZXR1cm4gcD09PTA/Zi5yYW5nZS5zdGFydC5jaGFyYWN0ZXItYy5yYW5nZS5zdGFydC5jaGFyYWN0ZXI6cH0pO2xldCB1PTA7Y29uc3QgbD1bXTtmb3IoY29uc3QgZiBvZiBhKXtjb25zdCBjPXMub2Zmc2V0QXQoZi5yYW5nZS5zdGFydCk7aWYoYzx1KXRocm93IG5ldyBFcnJvcigiT3ZlcmxhcHBpbmcgZWRpdCIpO2M+dSYmbC5wdXNoKG8uc3Vic3RyaW5nKHUsYykpLGYubmV3VGV4dC5sZW5ndGgmJmwucHVzaChmLm5ld1RleHQpLHU9cy5vZmZzZXRBdChmLnJhbmdlLmVuZCl9cmV0dXJuIGwucHVzaChvLnN1YnN0cih1KSksbC5qb2luKCIiKX1lLmFwcGx5RWRpdHM9cn0pKHNwfHwoc3A9e30pKTtmdW5jdGlvbiBpcChlLHQpe2lmKGUubGVuZ3RoPD0xKXJldHVybiBlO2NvbnN0IG49ZS5sZW5ndGgvMnwwLHI9ZS5zbGljZSgwLG4pLHM9ZS5zbGljZShuKTtpcChyLHQpLGlwKHMsdCk7bGV0IGk9MCxvPTAsYT0wO2Zvcig7aTxyLmxlbmd0aCYmbzxzLmxlbmd0aDspdChyW2ldLHNbb10pPD0wP2VbYSsrXT1yW2krK106ZVthKytdPXNbbysrXTtmb3IoO2k8ci5sZW5ndGg7KWVbYSsrXT1yW2krK107Zm9yKDtvPHMubGVuZ3RoOyllW2ErK109c1tvKytdO3JldHVybiBlfWZ1bmN0aW9uIGRnKGUsdCxuPTApe2NvbnN0IHI9dD9bbl06W107Zm9yKGxldCBzPTA7czxlLmxlbmd0aDtzKyspe2NvbnN0IGk9ZS5jaGFyQ29kZUF0KHMpO21nKGkpJiYoaT09PTEzJiZzKzE8ZS5sZW5ndGgmJmUuY2hhckNvZGVBdChzKzEpPT09MTAmJnMrKyxyLnB1c2gobitzKzEpKX1yZXR1cm4gcn1mdW5jdGlvbiBtZyhlKXtyZXR1cm4gZT09PTEzfHxlPT09MTB9ZnVuY3Rpb24gZ2coZSl7Y29uc3QgdD1lLnN0YXJ0LG49ZS5lbmQ7cmV0dXJuIHQubGluZT5uLmxpbmV8fHQubGluZT09PW4ubGluZSYmdC5jaGFyYWN0ZXI+bi5jaGFyYWN0ZXI/e3N0YXJ0Om4sZW5kOnR9OmV9ZnVuY3Rpb24gczkoZSl7Y29uc3QgdD1nZyhlLnJhbmdlKTtyZXR1cm4gdCE9PWUucmFuZ2U/e25ld1RleHQ6ZS5uZXdUZXh0LHJhbmdlOnR9OmV9ZnVuY3Rpb24gaTkoZSx0PSExKXtjb25zdCBuPWUubGVuZ3RoO2xldCByPTAscz0iIixpPTAsbz0xNixhPTAsdT0wLGw9MCxmPTAsYz0wO2Z1bmN0aW9uIHAoRSxGKXtsZXQgdj0wLEM9MDtmb3IoO3Y8RTspe2xldCBBPWUuY2hhckNvZGVBdChyKTtpZihBPj00OCYmQTw9NTcpQz1DKjE2K0EtNDg7ZWxzZSBpZihBPj02NSYmQTw9NzApQz1DKjE2K0EtNjUrMTA7ZWxzZSBpZihBPj05NyYmQTw9MTAyKUM9QyoxNitBLTk3KzEwO2Vsc2UgYnJlYWs7cisrLHYrK31yZXR1cm4gdjxFJiYoQz0tMSksQ31mdW5jdGlvbiBoKEUpe3I9RSxzPSIiLGk9MCxvPTE2LGM9MH1mdW5jdGlvbiBkKCl7bGV0IEU9cjtpZihlLmNoYXJDb2RlQXQocik9PT00OClyKys7ZWxzZSBmb3IocisrO3I8ZS5sZW5ndGgmJk9pKGUuY2hhckNvZGVBdChyKSk7KXIrKztpZihyPGUubGVuZ3RoJiZlLmNoYXJDb2RlQXQocik9PT00NilpZihyKysscjxlLmxlbmd0aCYmT2koZS5jaGFyQ29kZUF0KHIpKSlmb3IocisrO3I8ZS5sZW5ndGgmJk9pKGUuY2hhckNvZGVBdChyKSk7KXIrKztlbHNlIHJldHVybiBjPTMsZS5zdWJzdHJpbmcoRSxyKTtsZXQgRj1yO2lmKHI8ZS5sZW5ndGgmJihlLmNoYXJDb2RlQXQocik9PT02OXx8ZS5jaGFyQ29kZUF0KHIpPT09MTAxKSlpZihyKyssKHI8ZS5sZW5ndGgmJmUuY2hhckNvZGVBdChyKT09PTQzfHxlLmNoYXJDb2RlQXQocik9PT00NSkmJnIrKyxyPGUubGVuZ3RoJiZPaShlLmNoYXJDb2RlQXQocikpKXtmb3IocisrO3I8ZS5sZW5ndGgmJk9pKGUuY2hhckNvZGVBdChyKSk7KXIrKztGPXJ9ZWxzZSBjPTM7cmV0dXJuIGUuc3Vic3RyaW5nKEUsRil9ZnVuY3Rpb24gbSgpe2xldCBFPSIiLEY9cjtmb3IoOzspe2lmKHI+PW4pe0UrPWUuc3Vic3RyaW5nKEYsciksYz0yO2JyZWFrfWNvbnN0IHY9ZS5jaGFyQ29kZUF0KHIpO2lmKHY9PT0zNCl7RSs9ZS5zdWJzdHJpbmcoRixyKSxyKys7YnJlYWt9aWYodj09PTkyKXtpZihFKz1lLnN1YnN0cmluZyhGLHIpLHIrKyxyPj1uKXtjPTI7YnJlYWt9c3dpdGNoKGUuY2hhckNvZGVBdChyKyspKXtjYXNlIDM0OkUrPSciJzticmVhaztjYXNlIDkyOkUrPSJcXCI7YnJlYWs7Y2FzZSA0NzpFKz0iLyI7YnJlYWs7Y2FzZSA5ODpFKz0iXGIiO2JyZWFrO2Nhc2UgMTAyOkUrPSJcZiI7YnJlYWs7Y2FzZSAxMTA6RSs9YApgO2JyZWFrO2Nhc2UgMTE0OkUrPSJcciI7YnJlYWs7Y2FzZSAxMTY6RSs9IgkiO2JyZWFrO2Nhc2UgMTE3OmNvbnN0IEE9cCg0KTtBPj0wP0UrPVN0cmluZy5mcm9tQ2hhckNvZGUoQSk6Yz00O2JyZWFrO2RlZmF1bHQ6Yz01fUY9cjtjb250aW51ZX1pZih2Pj0wJiZ2PD0zMSlpZihjYSh2KSl7RSs9ZS5zdWJzdHJpbmcoRixyKSxjPTI7YnJlYWt9ZWxzZSBjPTY7cisrfXJldHVybiBFfWZ1bmN0aW9uIGcoKXtpZihzPSIiLGM9MCxpPXIsdT1hLGY9bCxyPj1uKXJldHVybiBpPW4sbz0xNztsZXQgRT1lLmNoYXJDb2RlQXQocik7aWYob3AoRSkpe2RvIHIrKyxzKz1TdHJpbmcuZnJvbUNoYXJDb2RlKEUpLEU9ZS5jaGFyQ29kZUF0KHIpO3doaWxlKG9wKEUpKTtyZXR1cm4gbz0xNX1pZihjYShFKSlyZXR1cm4gcisrLHMrPVN0cmluZy5mcm9tQ2hhckNvZGUoRSksRT09PTEzJiZlLmNoYXJDb2RlQXQocik9PT0xMCYmKHIrKyxzKz1gCmApLGErKyxsPXIsbz0xNDtzd2l0Y2goRSl7Y2FzZSAxMjM6cmV0dXJuIHIrKyxvPTE7Y2FzZSAxMjU6cmV0dXJuIHIrKyxvPTI7Y2FzZSA5MTpyZXR1cm4gcisrLG89MztjYXNlIDkzOnJldHVybiByKyssbz00O2Nhc2UgNTg6cmV0dXJuIHIrKyxvPTY7Y2FzZSA0NDpyZXR1cm4gcisrLG89NTtjYXNlIDM0OnJldHVybiByKysscz1tKCksbz0xMDtjYXNlIDQ3OmNvbnN0IEY9ci0xO2lmKGUuY2hhckNvZGVBdChyKzEpPT09NDcpe2ZvcihyKz0yO3I8biYmIWNhKGUuY2hhckNvZGVBdChyKSk7KXIrKztyZXR1cm4gcz1lLnN1YnN0cmluZyhGLHIpLG89MTJ9aWYoZS5jaGFyQ29kZUF0KHIrMSk9PT00Mil7cis9Mjtjb25zdCB2PW4tMTtsZXQgQz0hMTtmb3IoO3I8djspe2NvbnN0IEE9ZS5jaGFyQ29kZUF0KHIpO2lmKEE9PT00MiYmZS5jaGFyQ29kZUF0KHIrMSk9PT00Nyl7cis9MixDPSEwO2JyZWFrfXIrKyxjYShBKSYmKEE9PT0xMyYmZS5jaGFyQ29kZUF0KHIpPT09MTAmJnIrKyxhKyssbD1yKX1yZXR1cm4gQ3x8KHIrKyxjPTEpLHM9ZS5zdWJzdHJpbmcoRixyKSxvPTEzfXJldHVybiBzKz1TdHJpbmcuZnJvbUNoYXJDb2RlKEUpLHIrKyxvPTE2O2Nhc2UgNDU6aWYocys9U3RyaW5nLmZyb21DaGFyQ29kZShFKSxyKysscj09PW58fCFPaShlLmNoYXJDb2RlQXQocikpKXJldHVybiBvPTE2O2Nhc2UgNDg6Y2FzZSA0OTpjYXNlIDUwOmNhc2UgNTE6Y2FzZSA1MjpjYXNlIDUzOmNhc2UgNTQ6Y2FzZSA1NTpjYXNlIDU2OmNhc2UgNTc6cmV0dXJuIHMrPWQoKSxvPTExO2RlZmF1bHQ6Zm9yKDtyPG4mJkQoRSk7KXIrKyxFPWUuY2hhckNvZGVBdChyKTtpZihpIT09cil7c3dpdGNoKHM9ZS5zdWJzdHJpbmcoaSxyKSxzKXtjYXNlInRydWUiOnJldHVybiBvPTg7Y2FzZSJmYWxzZSI6cmV0dXJuIG89OTtjYXNlIm51bGwiOnJldHVybiBvPTd9cmV0dXJuIG89MTZ9cmV0dXJuIHMrPVN0cmluZy5mcm9tQ2hhckNvZGUoRSkscisrLG89MTZ9fWZ1bmN0aW9uIEQoRSl7aWYob3AoRSl8fGNhKEUpKXJldHVybiExO3N3aXRjaChFKXtjYXNlIDEyNTpjYXNlIDkzOmNhc2UgMTIzOmNhc2UgOTE6Y2FzZSAzNDpjYXNlIDU4OmNhc2UgNDQ6Y2FzZSA0NzpyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBiKCl7bGV0IEU7ZG8gRT1nKCk7d2hpbGUoRT49MTImJkU8PTE1KTtyZXR1cm4gRX1yZXR1cm57c2V0UG9zaXRpb246aCxnZXRQb3NpdGlvbjooKT0+cixzY2FuOnQ/YjpnLGdldFRva2VuOigpPT5vLGdldFRva2VuVmFsdWU6KCk9PnMsZ2V0VG9rZW5PZmZzZXQ6KCk9PmksZ2V0VG9rZW5MZW5ndGg6KCk9PnItaSxnZXRUb2tlblN0YXJ0TGluZTooKT0+dSxnZXRUb2tlblN0YXJ0Q2hhcmFjdGVyOigpPT5pLWYsZ2V0VG9rZW5FcnJvcjooKT0+Y319ZnVuY3Rpb24gb3AoZSl7cmV0dXJuIGU9PT0zMnx8ZT09PTl9ZnVuY3Rpb24gY2EoZSl7cmV0dXJuIGU9PT0xMHx8ZT09PTEzfWZ1bmN0aW9uIE9pKGUpe3JldHVybiBlPj00OCYmZTw9NTd9dmFyIHlnOyhmdW5jdGlvbihlKXtlW2UubGluZUZlZWQ9MTBdPSJsaW5lRmVlZCIsZVtlLmNhcnJpYWdlUmV0dXJuPTEzXT0iY2FycmlhZ2VSZXR1cm4iLGVbZS5zcGFjZT0zMl09InNwYWNlIixlW2UuXzA9NDhdPSJfMCIsZVtlLl8xPTQ5XT0iXzEiLGVbZS5fMj01MF09Il8yIixlW2UuXzM9NTFdPSJfMyIsZVtlLl80PTUyXT0iXzQiLGVbZS5fNT01M109Il81IixlW2UuXzY9NTRdPSJfNiIsZVtlLl83PTU1XT0iXzciLGVbZS5fOD01Nl09Il84IixlW2UuXzk9NTddPSJfOSIsZVtlLmE9OTddPSJhIixlW2UuYj05OF09ImIiLGVbZS5jPTk5XT0iYyIsZVtlLmQ9MTAwXT0iZCIsZVtlLmU9MTAxXT0iZSIsZVtlLmY9MTAyXT0iZiIsZVtlLmc9MTAzXT0iZyIsZVtlLmg9MTA0XT0iaCIsZVtlLmk9MTA1XT0iaSIsZVtlLmo9MTA2XT0iaiIsZVtlLms9MTA3XT0iayIsZVtlLmw9MTA4XT0ibCIsZVtlLm09MTA5XT0ibSIsZVtlLm49MTEwXT0ibiIsZVtlLm89MTExXT0ibyIsZVtlLnA9MTEyXT0icCIsZVtlLnE9MTEzXT0icSIsZVtlLnI9MTE0XT0iciIsZVtlLnM9MTE1XT0icyIsZVtlLnQ9MTE2XT0idCIsZVtlLnU9MTE3XT0idSIsZVtlLnY9MTE4XT0idiIsZVtlLnc9MTE5XT0idyIsZVtlLng9MTIwXT0ieCIsZVtlLnk9MTIxXT0ieSIsZVtlLno9MTIyXT0ieiIsZVtlLkE9NjVdPSJBIixlW2UuQj02Nl09IkIiLGVbZS5DPTY3XT0iQyIsZVtlLkQ9NjhdPSJEIixlW2UuRT02OV09IkUiLGVbZS5GPTcwXT0iRiIsZVtlLkc9NzFdPSJHIixlW2UuSD03Ml09IkgiLGVbZS5JPTczXT0iSSIsZVtlLko9NzRdPSJKIixlW2UuSz03NV09IksiLGVbZS5MPTc2XT0iTCIsZVtlLk09NzddPSJNIixlW2UuTj03OF09Ik4iLGVbZS5PPTc5XT0iTyIsZVtlLlA9ODBdPSJQIixlW2UuUT04MV09IlEiLGVbZS5SPTgyXT0iUiIsZVtlLlM9ODNdPSJTIixlW2UuVD04NF09IlQiLGVbZS5VPTg1XT0iVSIsZVtlLlY9ODZdPSJWIixlW2UuVz04N109IlciLGVbZS5YPTg4XT0iWCIsZVtlLlk9ODldPSJZIixlW2UuWj05MF09IloiLGVbZS5hc3Rlcmlzaz00Ml09ImFzdGVyaXNrIixlW2UuYmFja3NsYXNoPTkyXT0iYmFja3NsYXNoIixlW2UuY2xvc2VCcmFjZT0xMjVdPSJjbG9zZUJyYWNlIixlW2UuY2xvc2VCcmFja2V0PTkzXT0iY2xvc2VCcmFja2V0IixlW2UuY29sb249NThdPSJjb2xvbiIsZVtlLmNvbW1hPTQ0XT0iY29tbWEiLGVbZS5kb3Q9NDZdPSJkb3QiLGVbZS5kb3VibGVRdW90ZT0zNF09ImRvdWJsZVF1b3RlIixlW2UubWludXM9NDVdPSJtaW51cyIsZVtlLm9wZW5CcmFjZT0xMjNdPSJvcGVuQnJhY2UiLGVbZS5vcGVuQnJhY2tldD05MV09Im9wZW5CcmFja2V0IixlW2UucGx1cz00M109InBsdXMiLGVbZS5zbGFzaD00N109InNsYXNoIixlW2UuZm9ybUZlZWQ9MTJdPSJmb3JtRmVlZCIsZVtlLnRhYj05XT0idGFiIn0pKHlnfHwoeWc9e30pKSxuZXcgQXJyYXkoMjApLmZpbGwoMCkubWFwKChlLHQpPT4iICIucmVwZWF0KHQpKTtjb25zdCBSaT0yMDA7bmV3IEFycmF5KFJpKS5maWxsKDApLm1hcCgoZSx0KT0+YApgKyIgIi5yZXBlYXQodCkpLG5ldyBBcnJheShSaSkuZmlsbCgwKS5tYXAoKGUsdCk9PiJcciIrIiAiLnJlcGVhdCh0KSksbmV3IEFycmF5KFJpKS5maWxsKDApLm1hcCgoZSx0KT0+YFxyCmArIiAiLnJlcGVhdCh0KSksbmV3IEFycmF5KFJpKS5maWxsKDApLm1hcCgoZSx0KT0+YApgKyIJIi5yZXBlYXQodCkpLG5ldyBBcnJheShSaSkuZmlsbCgwKS5tYXAoKGUsdCk9PiJcciIrIgkiLnJlcGVhdCh0KSksbmV3IEFycmF5KFJpKS5maWxsKDApLm1hcCgoZSx0KT0+YFxyCmArIgkiLnJlcGVhdCh0KSk7dmFyIEt1OyhmdW5jdGlvbihlKXtlLkRFRkFVTFQ9e2FsbG93VHJhaWxpbmdDb21tYTohMX19KShLdXx8KEt1PXt9KSk7ZnVuY3Rpb24gbzkoZSx0PVtdLG49S3UuREVGQVVMVCl7bGV0IHI9bnVsbCxzPVtdO2NvbnN0IGk9W107ZnVuY3Rpb24gbyh1KXtBcnJheS5pc0FycmF5KHMpP3MucHVzaCh1KTpyIT09bnVsbCYmKHNbcl09dSl9cmV0dXJuIGE5KGUse29uT2JqZWN0QmVnaW46KCk9Pntjb25zdCB1PXt9O28odSksaS5wdXNoKHMpLHM9dSxyPW51bGx9LG9uT2JqZWN0UHJvcGVydHk6dT0+e3I9dX0sb25PYmplY3RFbmQ6KCk9PntzPWkucG9wKCl9LG9uQXJyYXlCZWdpbjooKT0+e2NvbnN0IHU9W107byh1KSxpLnB1c2gocykscz11LHI9bnVsbH0sb25BcnJheUVuZDooKT0+e3M9aS5wb3AoKX0sb25MaXRlcmFsVmFsdWU6byxvbkVycm9yOih1LGwsZik9Pnt0LnB1c2goe2Vycm9yOnUsb2Zmc2V0OmwsbGVuZ3RoOmZ9KX19LG4pLHNbMF19ZnVuY3Rpb24gYXAoZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSJhcnJheSI6cmV0dXJuIGUuY2hpbGRyZW4ubWFwKGFwKTtjYXNlIm9iamVjdCI6Y29uc3QgdD1PYmplY3QuY3JlYXRlKG51bGwpO2ZvcihsZXQgbiBvZiBlLmNoaWxkcmVuKXtjb25zdCByPW4uY2hpbGRyZW5bMV07ciYmKHRbbi5jaGlsZHJlblswXS52YWx1ZV09YXAocikpfXJldHVybiB0O2Nhc2UibnVsbCI6Y2FzZSJzdHJpbmciOmNhc2UibnVtYmVyIjpjYXNlImJvb2xlYW4iOnJldHVybiBlLnZhbHVlO2RlZmF1bHQ6cmV0dXJufX1mdW5jdGlvbiBhOShlLHQsbj1LdS5ERUZBVUxUKXtjb25zdCByPWk5KGUsITEpLHM9W107bGV0IGk9MDtmdW5jdGlvbiBvKGspe3JldHVybiBrPygpPT5pPT09MCYmayhyLmdldFRva2VuT2Zmc2V0KCksci5nZXRUb2tlbkxlbmd0aCgpLHIuZ2V0VG9rZW5TdGFydExpbmUoKSxyLmdldFRva2VuU3RhcnRDaGFyYWN0ZXIoKSk6KCk9PiEwfWZ1bmN0aW9uIGEoayl7cmV0dXJuIGs/ST0+aT09PTAmJmsoSSxyLmdldFRva2VuT2Zmc2V0KCksci5nZXRUb2tlbkxlbmd0aCgpLHIuZ2V0VG9rZW5TdGFydExpbmUoKSxyLmdldFRva2VuU3RhcnRDaGFyYWN0ZXIoKSk6KCk9PiEwfWZ1bmN0aW9uIHUoayl7cmV0dXJuIGs/ST0+aT09PTAmJmsoSSxyLmdldFRva2VuT2Zmc2V0KCksci5nZXRUb2tlbkxlbmd0aCgpLHIuZ2V0VG9rZW5TdGFydExpbmUoKSxyLmdldFRva2VuU3RhcnRDaGFyYWN0ZXIoKSwoKT0+cy5zbGljZSgpKTooKT0+ITB9ZnVuY3Rpb24gbChrKXtyZXR1cm4gaz8oKT0+e2k+MD9pKys6ayhyLmdldFRva2VuT2Zmc2V0KCksci5nZXRUb2tlbkxlbmd0aCgpLHIuZ2V0VG9rZW5TdGFydExpbmUoKSxyLmdldFRva2VuU3RhcnRDaGFyYWN0ZXIoKSwoKT0+cy5zbGljZSgpKT09PSExJiYoaT0xKX06KCk9PiEwfWZ1bmN0aW9uIGYoayl7cmV0dXJuIGs/KCk9PntpPjAmJmktLSxpPT09MCYmayhyLmdldFRva2VuT2Zmc2V0KCksci5nZXRUb2tlbkxlbmd0aCgpLHIuZ2V0VG9rZW5TdGFydExpbmUoKSxyLmdldFRva2VuU3RhcnRDaGFyYWN0ZXIoKSl9OigpPT4hMH1jb25zdCBjPWwodC5vbk9iamVjdEJlZ2luKSxwPXUodC5vbk9iamVjdFByb3BlcnR5KSxoPWYodC5vbk9iamVjdEVuZCksZD1sKHQub25BcnJheUJlZ2luKSxtPWYodC5vbkFycmF5RW5kKSxnPXUodC5vbkxpdGVyYWxWYWx1ZSksRD1hKHQub25TZXBhcmF0b3IpLGI9byh0Lm9uQ29tbWVudCksRT1hKHQub25FcnJvciksRj1uJiZuLmRpc2FsbG93Q29tbWVudHMsdj1uJiZuLmFsbG93VHJhaWxpbmdDb21tYTtmdW5jdGlvbiBDKCl7Zm9yKDs7KXtjb25zdCBrPXIuc2NhbigpO3N3aXRjaChyLmdldFRva2VuRXJyb3IoKSl7Y2FzZSA0OkEoMTQpO2JyZWFrO2Nhc2UgNTpBKDE1KTticmVhaztjYXNlIDM6QSgxMyk7YnJlYWs7Y2FzZSAxOkZ8fEEoMTEpO2JyZWFrO2Nhc2UgMjpBKDEyKTticmVhaztjYXNlIDY6QSgxNik7YnJlYWt9c3dpdGNoKGspe2Nhc2UgMTI6Y2FzZSAxMzpGP0EoMTApOmIoKTticmVhaztjYXNlIDE2OkEoMSk7YnJlYWs7Y2FzZSAxNTpjYXNlIDE0OmJyZWFrO2RlZmF1bHQ6cmV0dXJuIGt9fX1mdW5jdGlvbiBBKGssST1bXSxNPVtdKXtpZihFKGspLEkubGVuZ3RoK00ubGVuZ3RoPjApe2xldCBqPXIuZ2V0VG9rZW4oKTtmb3IoO2ohPT0xNzspe2lmKEkuaW5kZXhPZihqKSE9PS0xKXtDKCk7YnJlYWt9ZWxzZSBpZihNLmluZGV4T2YoaikhPT0tMSlicmVhaztqPUMoKX19fWZ1bmN0aW9uIHcoayl7Y29uc3QgST1yLmdldFRva2VuVmFsdWUoKTtyZXR1cm4gaz9nKEkpOihwKEkpLHMucHVzaChJKSksQygpLCEwfWZ1bmN0aW9uIFQoKXtzd2l0Y2goci5nZXRUb2tlbigpKXtjYXNlIDExOmNvbnN0IGs9ci5nZXRUb2tlblZhbHVlKCk7bGV0IEk9TnVtYmVyKGspO2lzTmFOKEkpJiYoQSgyKSxJPTApLGcoSSk7YnJlYWs7Y2FzZSA3OmcobnVsbCk7YnJlYWs7Y2FzZSA4OmcoITApO2JyZWFrO2Nhc2UgOTpnKCExKTticmVhaztkZWZhdWx0OnJldHVybiExfXJldHVybiBDKCksITB9ZnVuY3Rpb24gTigpe3JldHVybiByLmdldFRva2VuKCkhPT0xMD8oQSgzLFtdLFsyLDVdKSwhMSk6KHcoITEpLHIuZ2V0VG9rZW4oKT09PTY/KEQoIjoiKSxDKCksUygpfHxBKDQsW10sWzIsNV0pKTpBKDUsW10sWzIsNV0pLHMucG9wKCksITApfWZ1bmN0aW9uIHgoKXtjKCksQygpO2xldCBrPSExO2Zvcig7ci5nZXRUb2tlbigpIT09MiYmci5nZXRUb2tlbigpIT09MTc7KXtpZihyLmdldFRva2VuKCk9PT01KXtpZihrfHxBKDQsW10sW10pLEQoIiwiKSxDKCksci5nZXRUb2tlbigpPT09MiYmdilicmVha31lbHNlIGsmJkEoNixbXSxbXSk7TigpfHxBKDQsW10sWzIsNV0pLGs9ITB9cmV0dXJuIGgoKSxyLmdldFRva2VuKCkhPT0yP0EoNyxbMl0sW10pOkMoKSwhMH1mdW5jdGlvbiBMKCl7ZCgpLEMoKTtsZXQgaz0hMCxJPSExO2Zvcig7ci5nZXRUb2tlbigpIT09NCYmci5nZXRUb2tlbigpIT09MTc7KXtpZihyLmdldFRva2VuKCk9PT01KXtpZihJfHxBKDQsW10sW10pLEQoIiwiKSxDKCksci5nZXRUb2tlbigpPT09NCYmdilicmVha31lbHNlIEkmJkEoNixbXSxbXSk7az8ocy5wdXNoKDApLGs9ITEpOnNbcy5sZW5ndGgtMV0rKyxTKCl8fEEoNCxbXSxbNCw1XSksST0hMH1yZXR1cm4gbSgpLGt8fHMucG9wKCksci5nZXRUb2tlbigpIT09ND9BKDgsWzRdLFtdKTpDKCksITB9ZnVuY3Rpb24gUygpe3N3aXRjaChyLmdldFRva2VuKCkpe2Nhc2UgMzpyZXR1cm4gTCgpO2Nhc2UgMTpyZXR1cm4geCgpO2Nhc2UgMTA6cmV0dXJuIHcoITApO2RlZmF1bHQ6cmV0dXJuIFQoKX19cmV0dXJuIEMoKSxyLmdldFRva2VuKCk9PT0xNz9uLmFsbG93RW1wdHlDb250ZW50PyEwOihBKDQsW10sW10pLCExKTpTKCk/KHIuZ2V0VG9rZW4oKSE9PTE3JiZBKDksW10sW10pLCEwKTooQSg0LFtdLFtdKSwhMSl9dmFyIERnOyhmdW5jdGlvbihlKXtlW2UuTm9uZT0wXT0iTm9uZSIsZVtlLlVuZXhwZWN0ZWRFbmRPZkNvbW1lbnQ9MV09IlVuZXhwZWN0ZWRFbmRPZkNvbW1lbnQiLGVbZS5VbmV4cGVjdGVkRW5kT2ZTdHJpbmc9Ml09IlVuZXhwZWN0ZWRFbmRPZlN0cmluZyIsZVtlLlVuZXhwZWN0ZWRFbmRPZk51bWJlcj0zXT0iVW5leHBlY3RlZEVuZE9mTnVtYmVyIixlW2UuSW52YWxpZFVuaWNvZGU9NF09IkludmFsaWRVbmljb2RlIixlW2UuSW52YWxpZEVzY2FwZUNoYXJhY3Rlcj01XT0iSW52YWxpZEVzY2FwZUNoYXJhY3RlciIsZVtlLkludmFsaWRDaGFyYWN0ZXI9Nl09IkludmFsaWRDaGFyYWN0ZXIifSkoRGd8fChEZz17fSkpO3ZhciBiZzsoZnVuY3Rpb24oZSl7ZVtlLk9wZW5CcmFjZVRva2VuPTFdPSJPcGVuQnJhY2VUb2tlbiIsZVtlLkNsb3NlQnJhY2VUb2tlbj0yXT0iQ2xvc2VCcmFjZVRva2VuIixlW2UuT3BlbkJyYWNrZXRUb2tlbj0zXT0iT3BlbkJyYWNrZXRUb2tlbiIsZVtlLkNsb3NlQnJhY2tldFRva2VuPTRdPSJDbG9zZUJyYWNrZXRUb2tlbiIsZVtlLkNvbW1hVG9rZW49NV09IkNvbW1hVG9rZW4iLGVbZS5Db2xvblRva2VuPTZdPSJDb2xvblRva2VuIixlW2UuTnVsbEtleXdvcmQ9N109Ik51bGxLZXl3b3JkIixlW2UuVHJ1ZUtleXdvcmQ9OF09IlRydWVLZXl3b3JkIixlW2UuRmFsc2VLZXl3b3JkPTldPSJGYWxzZUtleXdvcmQiLGVbZS5TdHJpbmdMaXRlcmFsPTEwXT0iU3RyaW5nTGl0ZXJhbCIsZVtlLk51bWVyaWNMaXRlcmFsPTExXT0iTnVtZXJpY0xpdGVyYWwiLGVbZS5MaW5lQ29tbWVudFRyaXZpYT0xMl09IkxpbmVDb21tZW50VHJpdmlhIixlW2UuQmxvY2tDb21tZW50VHJpdmlhPTEzXT0iQmxvY2tDb21tZW50VHJpdmlhIixlW2UuTGluZUJyZWFrVHJpdmlhPTE0XT0iTGluZUJyZWFrVHJpdmlhIixlW2UuVHJpdmlhPTE1XT0iVHJpdmlhIixlW2UuVW5rbm93bj0xNl09IlVua25vd24iLGVbZS5FT0Y9MTddPSJFT0YifSkoYmd8fChiZz17fSkpO2NvbnN0IEVnPW85LHU5PWFwO3ZhciB2ZzsoZnVuY3Rpb24oZSl7ZVtlLkludmFsaWRTeW1ib2w9MV09IkludmFsaWRTeW1ib2wiLGVbZS5JbnZhbGlkTnVtYmVyRm9ybWF0PTJdPSJJbnZhbGlkTnVtYmVyRm9ybWF0IixlW2UuUHJvcGVydHlOYW1lRXhwZWN0ZWQ9M109IlByb3BlcnR5TmFtZUV4cGVjdGVkIixlW2UuVmFsdWVFeHBlY3RlZD00XT0iVmFsdWVFeHBlY3RlZCIsZVtlLkNvbG9uRXhwZWN0ZWQ9NV09IkNvbG9uRXhwZWN0ZWQiLGVbZS5Db21tYUV4cGVjdGVkPTZdPSJDb21tYUV4cGVjdGVkIixlW2UuQ2xvc2VCcmFjZUV4cGVjdGVkPTddPSJDbG9zZUJyYWNlRXhwZWN0ZWQiLGVbZS5DbG9zZUJyYWNrZXRFeHBlY3RlZD04XT0iQ2xvc2VCcmFja2V0RXhwZWN0ZWQiLGVbZS5FbmRPZkZpbGVFeHBlY3RlZD05XT0iRW5kT2ZGaWxlRXhwZWN0ZWQiLGVbZS5JbnZhbGlkQ29tbWVudFRva2VuPTEwXT0iSW52YWxpZENvbW1lbnRUb2tlbiIsZVtlLlVuZXhwZWN0ZWRFbmRPZkNvbW1lbnQ9MTFdPSJVbmV4cGVjdGVkRW5kT2ZDb21tZW50IixlW2UuVW5leHBlY3RlZEVuZE9mU3RyaW5nPTEyXT0iVW5leHBlY3RlZEVuZE9mU3RyaW5nIixlW2UuVW5leHBlY3RlZEVuZE9mTnVtYmVyPTEzXT0iVW5leHBlY3RlZEVuZE9mTnVtYmVyIixlW2UuSW52YWxpZFVuaWNvZGU9MTRdPSJJbnZhbGlkVW5pY29kZSIsZVtlLkludmFsaWRFc2NhcGVDaGFyYWN0ZXI9MTVdPSJJbnZhbGlkRXNjYXBlQ2hhcmFjdGVyIixlW2UuSW52YWxpZENoYXJhY3Rlcj0xNl09IkludmFsaWRDaGFyYWN0ZXIifSkodmd8fCh2Zz17fSkpO3ZhciBsOT17OTc1KGUpe2Z1bmN0aW9uIHQocyl7aWYodHlwZW9mIHMhPSJzdHJpbmciKXRocm93IG5ldyBUeXBlRXJyb3IoIlBhdGggbXVzdCBiZSBhIHN0cmluZy4gUmVjZWl2ZWQgIitKU09OLnN0cmluZ2lmeShzKSl9ZnVuY3Rpb24gbihzLGkpe2Zvcih2YXIgbyxhPSIiLHU9MCxsPS0xLGY9MCxjPTA7Yzw9cy5sZW5ndGg7KytjKXtpZihjPHMubGVuZ3RoKW89cy5jaGFyQ29kZUF0KGMpO2Vsc2V7aWYobz09PTQ3KWJyZWFrO289NDd9aWYobz09PTQ3KXtpZighKGw9PT1jLTF8fGY9PT0xKSlpZihsIT09Yy0xJiZmPT09Mil7aWYoYS5sZW5ndGg8Mnx8dSE9PTJ8fGEuY2hhckNvZGVBdChhLmxlbmd0aC0xKSE9PTQ2fHxhLmNoYXJDb2RlQXQoYS5sZW5ndGgtMikhPT00Nil7aWYoYS5sZW5ndGg+Mil7dmFyIHA9YS5sYXN0SW5kZXhPZigiLyIpO2lmKHAhPT1hLmxlbmd0aC0xKXtwPT09LTE/KGE9IiIsdT0wKTp1PShhPWEuc2xpY2UoMCxwKSkubGVuZ3RoLTEtYS5sYXN0SW5kZXhPZigiLyIpLGw9YyxmPTA7Y29udGludWV9fWVsc2UgaWYoYS5sZW5ndGg9PT0yfHxhLmxlbmd0aD09PTEpe2E9IiIsdT0wLGw9YyxmPTA7Y29udGludWV9fWkmJihhLmxlbmd0aD4wP2ErPSIvLi4iOmE9Ii4uIix1PTIpfWVsc2UgYS5sZW5ndGg+MD9hKz0iLyIrcy5zbGljZShsKzEsYyk6YT1zLnNsaWNlKGwrMSxjKSx1PWMtbC0xO2w9YyxmPTB9ZWxzZSBvPT09NDYmJmYhPT0tMT8rK2Y6Zj0tMX1yZXR1cm4gYX12YXIgcj17cmVzb2x2ZTpmdW5jdGlvbigpe2Zvcih2YXIgcyxpPSIiLG89ITEsYT1hcmd1bWVudHMubGVuZ3RoLTE7YT49LTEmJiFvO2EtLSl7dmFyIHU7YT49MD91PWFyZ3VtZW50c1thXToocz09PXZvaWQgMCYmKHM9cHJvY2Vzcy5jd2QoKSksdT1zKSx0KHUpLHUubGVuZ3RoIT09MCYmKGk9dSsiLyIraSxvPXUuY2hhckNvZGVBdCgwKT09PTQ3KX1yZXR1cm4gaT1uKGksIW8pLG8/aS5sZW5ndGg+MD8iLyIraToiLyI6aS5sZW5ndGg+MD9pOiIuIn0sbm9ybWFsaXplOmZ1bmN0aW9uKHMpe2lmKHQocykscy5sZW5ndGg9PT0wKXJldHVybiIuIjt2YXIgaT1zLmNoYXJDb2RlQXQoMCk9PT00NyxvPXMuY2hhckNvZGVBdChzLmxlbmd0aC0xKT09PTQ3O3JldHVybihzPW4ocywhaSkpLmxlbmd0aCE9PTB8fGl8fChzPSIuIikscy5sZW5ndGg+MCYmbyYmKHMrPSIvIiksaT8iLyIrczpzfSxpc0Fic29sdXRlOmZ1bmN0aW9uKHMpe3JldHVybiB0KHMpLHMubGVuZ3RoPjAmJnMuY2hhckNvZGVBdCgwKT09PTQ3fSxqb2luOmZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApcmV0dXJuIi4iO2Zvcih2YXIgcyxpPTA7aTxhcmd1bWVudHMubGVuZ3RoOysraSl7dmFyIG89YXJndW1lbnRzW2ldO3Qobyksby5sZW5ndGg+MCYmKHM9PT12b2lkIDA/cz1vOnMrPSIvIitvKX1yZXR1cm4gcz09PXZvaWQgMD8iLiI6ci5ub3JtYWxpemUocyl9LHJlbGF0aXZlOmZ1bmN0aW9uKHMsaSl7aWYodChzKSx0KGkpLHM9PT1pfHwocz1yLnJlc29sdmUocykpPT09KGk9ci5yZXNvbHZlKGkpKSlyZXR1cm4iIjtmb3IodmFyIG89MTtvPHMubGVuZ3RoJiZzLmNoYXJDb2RlQXQobyk9PT00NzsrK28pO2Zvcih2YXIgYT1zLmxlbmd0aCx1PWEtbyxsPTE7bDxpLmxlbmd0aCYmaS5jaGFyQ29kZUF0KGwpPT09NDc7KytsKTtmb3IodmFyIGY9aS5sZW5ndGgtbCxjPXU8Zj91OmYscD0tMSxoPTA7aDw9YzsrK2gpe2lmKGg9PT1jKXtpZihmPmMpe2lmKGkuY2hhckNvZGVBdChsK2gpPT09NDcpcmV0dXJuIGkuc2xpY2UobCtoKzEpO2lmKGg9PT0wKXJldHVybiBpLnNsaWNlKGwraCl9ZWxzZSB1PmMmJihzLmNoYXJDb2RlQXQobytoKT09PTQ3P3A9aDpoPT09MCYmKHA9MCkpO2JyZWFrfXZhciBkPXMuY2hhckNvZGVBdChvK2gpO2lmKGQhPT1pLmNoYXJDb2RlQXQobCtoKSlicmVhaztkPT09NDcmJihwPWgpfXZhciBtPSIiO2ZvcihoPW8rcCsxO2g8PWE7KytoKWghPT1hJiZzLmNoYXJDb2RlQXQoaCkhPT00N3x8KG0ubGVuZ3RoPT09MD9tKz0iLi4iOm0rPSIvLi4iKTtyZXR1cm4gbS5sZW5ndGg+MD9tK2kuc2xpY2UobCtwKToobCs9cCxpLmNoYXJDb2RlQXQobCk9PT00NyYmKytsLGkuc2xpY2UobCkpfSxfbWFrZUxvbmc6ZnVuY3Rpb24ocyl7cmV0dXJuIHN9LGRpcm5hbWU6ZnVuY3Rpb24ocyl7aWYodChzKSxzLmxlbmd0aD09PTApcmV0dXJuIi4iO2Zvcih2YXIgaT1zLmNoYXJDb2RlQXQoMCksbz1pPT09NDcsYT0tMSx1PSEwLGw9cy5sZW5ndGgtMTtsPj0xOy0tbClpZigoaT1zLmNoYXJDb2RlQXQobCkpPT09NDcpe2lmKCF1KXthPWw7YnJlYWt9fWVsc2UgdT0hMTtyZXR1cm4gYT09PS0xP28/Ii8iOiIuIjpvJiZhPT09MT8iLy8iOnMuc2xpY2UoMCxhKX0sYmFzZW5hbWU6ZnVuY3Rpb24ocyxpKXtpZihpIT09dm9pZCAwJiZ0eXBlb2YgaSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcignImV4dCIgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZycpO3Qocyk7dmFyIG8sYT0wLHU9LTEsbD0hMDtpZihpIT09dm9pZCAwJiZpLmxlbmd0aD4wJiZpLmxlbmd0aDw9cy5sZW5ndGgpe2lmKGkubGVuZ3RoPT09cy5sZW5ndGgmJmk9PT1zKXJldHVybiIiO3ZhciBmPWkubGVuZ3RoLTEsYz0tMTtmb3Iobz1zLmxlbmd0aC0xO28+PTA7LS1vKXt2YXIgcD1zLmNoYXJDb2RlQXQobyk7aWYocD09PTQ3KXtpZighbCl7YT1vKzE7YnJlYWt9fWVsc2UgYz09PS0xJiYobD0hMSxjPW8rMSksZj49MCYmKHA9PT1pLmNoYXJDb2RlQXQoZik/LS1mPT09LTEmJih1PW8pOihmPS0xLHU9YykpfXJldHVybiBhPT09dT91PWM6dT09PS0xJiYodT1zLmxlbmd0aCkscy5zbGljZShhLHUpfWZvcihvPXMubGVuZ3RoLTE7bz49MDstLW8paWYocy5jaGFyQ29kZUF0KG8pPT09NDcpe2lmKCFsKXthPW8rMTticmVha319ZWxzZSB1PT09LTEmJihsPSExLHU9bysxKTtyZXR1cm4gdT09PS0xPyIiOnMuc2xpY2UoYSx1KX0sZXh0bmFtZTpmdW5jdGlvbihzKXt0KHMpO2Zvcih2YXIgaT0tMSxvPTAsYT0tMSx1PSEwLGw9MCxmPXMubGVuZ3RoLTE7Zj49MDstLWYpe3ZhciBjPXMuY2hhckNvZGVBdChmKTtpZihjIT09NDcpYT09PS0xJiYodT0hMSxhPWYrMSksYz09PTQ2P2k9PT0tMT9pPWY6bCE9PTEmJihsPTEpOmkhPT0tMSYmKGw9LTEpO2Vsc2UgaWYoIXUpe289ZisxO2JyZWFrfX1yZXR1cm4gaT09PS0xfHxhPT09LTF8fGw9PT0wfHxsPT09MSYmaT09PWEtMSYmaT09PW8rMT8iIjpzLnNsaWNlKGksYSl9LGZvcm1hdDpmdW5jdGlvbihzKXtpZihzPT09bnVsbHx8dHlwZW9mIHMhPSJvYmplY3QiKXRocm93IG5ldyBUeXBlRXJyb3IoJ1RoZSAicGF0aE9iamVjdCIgYXJndW1lbnQgbXVzdCBiZSBvZiB0eXBlIE9iamVjdC4gUmVjZWl2ZWQgdHlwZSAnK3R5cGVvZiBzKTtyZXR1cm4gZnVuY3Rpb24oaSxvKXt2YXIgYT1vLmRpcnx8by5yb290LHU9by5iYXNlfHwoby5uYW1lfHwiIikrKG8uZXh0fHwiIik7cmV0dXJuIGE/YT09PW8ucm9vdD9hK3U6YSsiLyIrdTp1fSgwLHMpfSxwYXJzZTpmdW5jdGlvbihzKXt0KHMpO3ZhciBpPXtyb290OiIiLGRpcjoiIixiYXNlOiIiLGV4dDoiIixuYW1lOiIifTtpZihzLmxlbmd0aD09PTApcmV0dXJuIGk7dmFyIG8sYT1zLmNoYXJDb2RlQXQoMCksdT1hPT09NDc7dT8oaS5yb290PSIvIixvPTEpOm89MDtmb3IodmFyIGw9LTEsZj0wLGM9LTEscD0hMCxoPXMubGVuZ3RoLTEsZD0wO2g+PW87LS1oKWlmKChhPXMuY2hhckNvZGVBdChoKSkhPT00NyljPT09LTEmJihwPSExLGM9aCsxKSxhPT09NDY/bD09PS0xP2w9aDpkIT09MSYmKGQ9MSk6bCE9PS0xJiYoZD0tMSk7ZWxzZSBpZighcCl7Zj1oKzE7YnJlYWt9cmV0dXJuIGw9PT0tMXx8Yz09PS0xfHxkPT09MHx8ZD09PTEmJmw9PT1jLTEmJmw9PT1mKzE/YyE9PS0xJiYoaS5iYXNlPWkubmFtZT1mPT09MCYmdT9zLnNsaWNlKDEsYyk6cy5zbGljZShmLGMpKTooZj09PTAmJnU/KGkubmFtZT1zLnNsaWNlKDEsbCksaS5iYXNlPXMuc2xpY2UoMSxjKSk6KGkubmFtZT1zLnNsaWNlKGYsbCksaS5iYXNlPXMuc2xpY2UoZixjKSksaS5leHQ9cy5zbGljZShsLGMpKSxmPjA/aS5kaXI9cy5zbGljZSgwLGYtMSk6dSYmKGkuZGlyPSIvIiksaX0sc2VwOiIvIixkZWxpbWl0ZXI6IjoiLHdpbjMyOm51bGwscG9zaXg6bnVsbH07ci5wb3NpeD1yLGUuZXhwb3J0cz1yfX0sRmc9e307ZnVuY3Rpb24gamkoZSl7dmFyIHQ9RmdbZV07aWYodCE9PXZvaWQgMClyZXR1cm4gdC5leHBvcnRzO3ZhciBuPUZnW2VdPXtleHBvcnRzOnt9fTtyZXR1cm4gbDlbZV0obixuLmV4cG9ydHMsamkpLG4uZXhwb3J0c31sZXQgZmE7amkuZD0oZSx0KT0+e2Zvcih2YXIgbiBpbiB0KWppLm8odCxuKSYmIWppLm8oZSxuKSYmT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsbix7ZW51bWVyYWJsZTohMCxnZXQ6dFtuXX0pfSxqaS5vPShlLHQpPT5PYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoZSx0KSx0eXBlb2YgcHJvY2Vzcz09Im9iamVjdCI/ZmE9cHJvY2Vzcy5wbGF0Zm9ybT09PSJ3aW4zMiI6dHlwZW9mIG5hdmlnYXRvcj09Im9iamVjdCImJihmYT1uYXZpZ2F0b3IudXNlckFnZW50LmluZGV4T2YoIldpbmRvd3MiKT49MCk7Y29uc3QgYzk9L15cd1tcd1xkKy4tXSokLyxmOT0vXlwvLyxwOT0vXlwvXC8vO2Z1bmN0aW9uIEFnKGUsdCl7aWYoIWUuc2NoZW1lJiZ0KXRocm93IG5ldyBFcnJvcihgW1VyaUVycm9yXTogU2NoZW1lIGlzIG1pc3Npbmc6IHtzY2hlbWU6ICIiLCBhdXRob3JpdHk6ICIke2UuYXV0aG9yaXR5fSIsIHBhdGg6ICIke2UucGF0aH0iLCBxdWVyeTogIiR7ZS5xdWVyeX0iLCBmcmFnbWVudDogIiR7ZS5mcmFnbWVudH0ifWApO2lmKGUuc2NoZW1lJiYhYzkudGVzdChlLnNjaGVtZSkpdGhyb3cgbmV3IEVycm9yKCJbVXJpRXJyb3JdOiBTY2hlbWUgY29udGFpbnMgaWxsZWdhbCBjaGFyYWN0ZXJzLiIpO2lmKGUucGF0aCl7aWYoZS5hdXRob3JpdHkpe2lmKCFmOS50ZXN0KGUucGF0aCkpdGhyb3cgbmV3IEVycm9yKCdbVXJpRXJyb3JdOiBJZiBhIFVSSSBjb250YWlucyBhbiBhdXRob3JpdHkgY29tcG9uZW50LCB0aGVuIHRoZSBwYXRoIGNvbXBvbmVudCBtdXN0IGVpdGhlciBiZSBlbXB0eSBvciBiZWdpbiB3aXRoIGEgc2xhc2ggKCIvIikgY2hhcmFjdGVyJyl9ZWxzZSBpZihwOS50ZXN0KGUucGF0aCkpdGhyb3cgbmV3IEVycm9yKCdbVXJpRXJyb3JdOiBJZiBhIFVSSSBkb2VzIG5vdCBjb250YWluIGFuIGF1dGhvcml0eSBjb21wb25lbnQsIHRoZW4gdGhlIHBhdGggY2Fubm90IGJlZ2luIHdpdGggdHdvIHNsYXNoIGNoYXJhY3RlcnMgKCIvLyIpJyl9fWNvbnN0IENlPSIiLFBuPSIvIixoOT0vXigoW146Lz8jXSs/KTopPyhcL1wvKFteLz8jXSopKT8oW14/I10qKShcPyhbXiNdKikpPygjKC4qKSk/LztjbGFzcyBydHtjb25zdHJ1Y3Rvcih0LG4scixzLGksbz0hMSl7V2UodGhpcywic2NoZW1lIik7V2UodGhpcywiYXV0aG9yaXR5Iik7V2UodGhpcywicGF0aCIpO1dlKHRoaXMsInF1ZXJ5Iik7V2UodGhpcywiZnJhZ21lbnQiKTt0eXBlb2YgdD09Im9iamVjdCI/KHRoaXMuc2NoZW1lPXQuc2NoZW1lfHxDZSx0aGlzLmF1dGhvcml0eT10LmF1dGhvcml0eXx8Q2UsdGhpcy5wYXRoPXQucGF0aHx8Q2UsdGhpcy5xdWVyeT10LnF1ZXJ5fHxDZSx0aGlzLmZyYWdtZW50PXQuZnJhZ21lbnR8fENlKToodGhpcy5zY2hlbWU9ZnVuY3Rpb24oYSx1KXtyZXR1cm4gYXx8dT9hOiJmaWxlIn0odCxvKSx0aGlzLmF1dGhvcml0eT1ufHxDZSx0aGlzLnBhdGg9ZnVuY3Rpb24oYSx1KXtzd2l0Y2goYSl7Y2FzZSJodHRwcyI6Y2FzZSJodHRwIjpjYXNlImZpbGUiOnU/dVswXSE9PVBuJiYodT1Qbit1KTp1PVBufXJldHVybiB1fSh0aGlzLnNjaGVtZSxyfHxDZSksdGhpcy5xdWVyeT1zfHxDZSx0aGlzLmZyYWdtZW50PWl8fENlLEFnKHRoaXMsbykpfXN0YXRpYyBpc1VyaSh0KXtyZXR1cm4gdCBpbnN0YW5jZW9mIHJ0fHwhIXQmJnR5cGVvZiB0LmF1dGhvcml0eT09InN0cmluZyImJnR5cGVvZiB0LmZyYWdtZW50PT0ic3RyaW5nIiYmdHlwZW9mIHQucGF0aD09InN0cmluZyImJnR5cGVvZiB0LnF1ZXJ5PT0ic3RyaW5nIiYmdHlwZW9mIHQuc2NoZW1lPT0ic3RyaW5nIiYmdHlwZW9mIHQuZnNQYXRoPT0ic3RyaW5nIiYmdHlwZW9mIHQud2l0aD09ImZ1bmN0aW9uIiYmdHlwZW9mIHQudG9TdHJpbmc9PSJmdW5jdGlvbiJ9Z2V0IGZzUGF0aCgpe3JldHVybiB4Zyh0aGlzKX13aXRoKHQpe2lmKCF0KXJldHVybiB0aGlzO2xldHtzY2hlbWU6bixhdXRob3JpdHk6cixwYXRoOnMscXVlcnk6aSxmcmFnbWVudDpvfT10O3JldHVybiBuPT09dm9pZCAwP249dGhpcy5zY2hlbWU6bj09PW51bGwmJihuPUNlKSxyPT09dm9pZCAwP3I9dGhpcy5hdXRob3JpdHk6cj09PW51bGwmJihyPUNlKSxzPT09dm9pZCAwP3M9dGhpcy5wYXRoOnM9PT1udWxsJiYocz1DZSksaT09PXZvaWQgMD9pPXRoaXMucXVlcnk6aT09PW51bGwmJihpPUNlKSxvPT09dm9pZCAwP289dGhpcy5mcmFnbWVudDpvPT09bnVsbCYmKG89Q2UpLG49PT10aGlzLnNjaGVtZSYmcj09PXRoaXMuYXV0aG9yaXR5JiZzPT09dGhpcy5wYXRoJiZpPT09dGhpcy5xdWVyeSYmbz09PXRoaXMuZnJhZ21lbnQ/dGhpczpuZXcgVmkobixyLHMsaSxvKX1zdGF0aWMgcGFyc2UodCxuPSExKXtjb25zdCByPWg5LmV4ZWModCk7cmV0dXJuIHI/bmV3IFZpKHJbMl18fENlLFh1KHJbNF18fENlKSxYdShyWzVdfHxDZSksWHUocls3XXx8Q2UpLFh1KHJbOV18fENlKSxuKTpuZXcgVmkoQ2UsQ2UsQ2UsQ2UsQ2UpfXN0YXRpYyBmaWxlKHQpe2xldCBuPUNlO2lmKGZhJiYodD10LnJlcGxhY2UoL1xcL2csUG4pKSx0WzBdPT09UG4mJnRbMV09PT1Qbil7Y29uc3Qgcj10LmluZGV4T2YoUG4sMik7cj09PS0xPyhuPXQuc3Vic3RyaW5nKDIpLHQ9UG4pOihuPXQuc3Vic3RyaW5nKDIsciksdD10LnN1YnN0cmluZyhyKXx8UG4pfXJldHVybiBuZXcgVmkoImZpbGUiLG4sdCxDZSxDZSl9c3RhdGljIGZyb20odCl7Y29uc3Qgbj1uZXcgVmkodC5zY2hlbWUsdC5hdXRob3JpdHksdC5wYXRoLHQucXVlcnksdC5mcmFnbWVudCk7cmV0dXJuIEFnKG4sITApLG59dG9TdHJpbmcodD0hMSl7cmV0dXJuIHVwKHRoaXMsdCl9dG9KU09OKCl7cmV0dXJuIHRoaXN9c3RhdGljIHJldml2ZSh0KXtpZih0KXtpZih0IGluc3RhbmNlb2YgcnQpcmV0dXJuIHQ7e2NvbnN0IG49bmV3IFZpKHQpO3JldHVybiBuLl9mb3JtYXR0ZWQ9dC5leHRlcm5hbCxuLl9mc1BhdGg9dC5fc2VwPT09d2c/dC5mc1BhdGg6bnVsbCxufX1yZXR1cm4gdH19Y29uc3Qgd2c9ZmE/MTp2b2lkIDA7bGV0IFZpPWNsYXNzIGV4dGVuZHMgcnR7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO1dlKHRoaXMsIl9mb3JtYXR0ZWQiLG51bGwpO1dlKHRoaXMsIl9mc1BhdGgiLG51bGwpfWdldCBmc1BhdGgoKXtyZXR1cm4gdGhpcy5fZnNQYXRofHwodGhpcy5fZnNQYXRoPXhnKHRoaXMpKSx0aGlzLl9mc1BhdGh9dG9TdHJpbmcobj0hMSl7cmV0dXJuIG4/dXAodGhpcywhMCk6KHRoaXMuX2Zvcm1hdHRlZHx8KHRoaXMuX2Zvcm1hdHRlZD11cCh0aGlzLCExKSksdGhpcy5fZm9ybWF0dGVkKX10b0pTT04oKXtjb25zdCBuPXskbWlkOjF9O3JldHVybiB0aGlzLl9mc1BhdGgmJihuLmZzUGF0aD10aGlzLl9mc1BhdGgsbi5fc2VwPXdnKSx0aGlzLl9mb3JtYXR0ZWQmJihuLmV4dGVybmFsPXRoaXMuX2Zvcm1hdHRlZCksdGhpcy5wYXRoJiYobi5wYXRoPXRoaXMucGF0aCksdGhpcy5zY2hlbWUmJihuLnNjaGVtZT10aGlzLnNjaGVtZSksdGhpcy5hdXRob3JpdHkmJihuLmF1dGhvcml0eT10aGlzLmF1dGhvcml0eSksdGhpcy5xdWVyeSYmKG4ucXVlcnk9dGhpcy5xdWVyeSksdGhpcy5mcmFnbWVudCYmKG4uZnJhZ21lbnQ9dGhpcy5mcmFnbWVudCksbn19O2NvbnN0IENnPXs1ODoiJTNBIiw0NzoiJTJGIiw2MzoiJTNGIiwzNToiJTIzIiw5MToiJTVCIiw5MzoiJTVEIiw2NDoiJTQwIiwzMzoiJTIxIiwzNjoiJTI0IiwzODoiJTI2IiwzOToiJTI3Iiw0MDoiJTI4Iiw0MToiJTI5Iiw0MjoiJTJBIiw0MzoiJTJCIiw0NDoiJTJDIiw1OToiJTNCIiw2MToiJTNEIiwzMjoiJTIwIn07ZnVuY3Rpb24gU2coZSx0LG4pe2xldCByLHM9LTE7Zm9yKGxldCBpPTA7aTxlLmxlbmd0aDtpKyspe2NvbnN0IG89ZS5jaGFyQ29kZUF0KGkpO2lmKG8+PTk3JiZvPD0xMjJ8fG8+PTY1JiZvPD05MHx8bz49NDgmJm88PTU3fHxvPT09NDV8fG89PT00Nnx8bz09PTk1fHxvPT09MTI2fHx0JiZvPT09NDd8fG4mJm89PT05MXx8biYmbz09PTkzfHxuJiZvPT09NTgpcyE9PS0xJiYocis9ZW5jb2RlVVJJQ29tcG9uZW50KGUuc3Vic3RyaW5nKHMsaSkpLHM9LTEpLHIhPT12b2lkIDAmJihyKz1lLmNoYXJBdChpKSk7ZWxzZXtyPT09dm9pZCAwJiYocj1lLnN1YnN0cigwLGkpKTtjb25zdCBhPUNnW29dO2EhPT12b2lkIDA/KHMhPT0tMSYmKHIrPWVuY29kZVVSSUNvbXBvbmVudChlLnN1YnN0cmluZyhzLGkpKSxzPS0xKSxyKz1hKTpzPT09LTEmJihzPWkpfX1yZXR1cm4gcyE9PS0xJiYocis9ZW5jb2RlVVJJQ29tcG9uZW50KGUuc3Vic3RyaW5nKHMpKSksciE9PXZvaWQgMD9yOmV9ZnVuY3Rpb24gZDkoZSl7bGV0IHQ7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDtuKyspe2NvbnN0IHI9ZS5jaGFyQ29kZUF0KG4pO3I9PT0zNXx8cj09PTYzPyh0PT09dm9pZCAwJiYodD1lLnN1YnN0cigwLG4pKSx0Kz1DZ1tyXSk6dCE9PXZvaWQgMCYmKHQrPWVbbl0pfXJldHVybiB0IT09dm9pZCAwP3Q6ZX1mdW5jdGlvbiB4ZyhlLHQpe2xldCBuO3JldHVybiBuPWUuYXV0aG9yaXR5JiZlLnBhdGgubGVuZ3RoPjEmJmUuc2NoZW1lPT09ImZpbGUiP2AvLyR7ZS5hdXRob3JpdHl9JHtlLnBhdGh9YDplLnBhdGguY2hhckNvZGVBdCgwKT09PTQ3JiYoZS5wYXRoLmNoYXJDb2RlQXQoMSk+PTY1JiZlLnBhdGguY2hhckNvZGVBdCgxKTw9OTB8fGUucGF0aC5jaGFyQ29kZUF0KDEpPj05NyYmZS5wYXRoLmNoYXJDb2RlQXQoMSk8PTEyMikmJmUucGF0aC5jaGFyQ29kZUF0KDIpPT09NTg/ZS5wYXRoWzFdLnRvTG93ZXJDYXNlKCkrZS5wYXRoLnN1YnN0cigyKTplLnBhdGgsZmEmJihuPW4ucmVwbGFjZSgvXC8vZywiXFwiKSksbn1mdW5jdGlvbiB1cChlLHQpe2NvbnN0IG49dD9kOTpTZztsZXQgcj0iIix7c2NoZW1lOnMsYXV0aG9yaXR5OmkscGF0aDpvLHF1ZXJ5OmEsZnJhZ21lbnQ6dX09ZTtpZihzJiYocis9cyxyKz0iOiIpLChpfHxzPT09ImZpbGUiKSYmKHIrPVBuLHIrPVBuKSxpKXtsZXQgbD1pLmluZGV4T2YoIkAiKTtpZihsIT09LTEpe2NvbnN0IGY9aS5zdWJzdHIoMCxsKTtpPWkuc3Vic3RyKGwrMSksbD1mLmxhc3RJbmRleE9mKCI6IiksbD09PS0xP3IrPW4oZiwhMSwhMSk6KHIrPW4oZi5zdWJzdHIoMCxsKSwhMSwhMSkscis9IjoiLHIrPW4oZi5zdWJzdHIobCsxKSwhMSwhMCkpLHIrPSJAIn1pPWkudG9Mb3dlckNhc2UoKSxsPWkubGFzdEluZGV4T2YoIjoiKSxsPT09LTE/cis9bihpLCExLCEwKToocis9bihpLnN1YnN0cigwLGwpLCExLCEwKSxyKz1pLnN1YnN0cihsKSl9aWYobyl7aWYoby5sZW5ndGg+PTMmJm8uY2hhckNvZGVBdCgwKT09PTQ3JiZvLmNoYXJDb2RlQXQoMik9PT01OCl7Y29uc3QgbD1vLmNoYXJDb2RlQXQoMSk7bD49NjUmJmw8PTkwJiYobz1gLyR7U3RyaW5nLmZyb21DaGFyQ29kZShsKzMyKX06JHtvLnN1YnN0cigzKX1gKX1lbHNlIGlmKG8ubGVuZ3RoPj0yJiZvLmNoYXJDb2RlQXQoMSk9PT01OCl7Y29uc3QgbD1vLmNoYXJDb2RlQXQoMCk7bD49NjUmJmw8PTkwJiYobz1gJHtTdHJpbmcuZnJvbUNoYXJDb2RlKGwrMzIpfToke28uc3Vic3RyKDIpfWApfXIrPW4obywhMCwhMSl9cmV0dXJuIGEmJihyKz0iPyIscis9bihhLCExLCExKSksdSYmKHIrPSIjIixyKz10P3U6U2codSwhMSwhMSkpLHJ9ZnVuY3Rpb24ga2coZSl7dHJ5e3JldHVybiBkZWNvZGVVUklDb21wb25lbnQoZSl9Y2F0Y2h7cmV0dXJuIGUubGVuZ3RoPjM/ZS5zdWJzdHIoMCwzKStrZyhlLnN1YnN0cigzKSk6ZX19Y29uc3QgVGc9LyglWzAtOUEtWmEtel1bMC05QS1aYS16XSkrL2c7ZnVuY3Rpb24gWHUoZSl7cmV0dXJuIGUubWF0Y2goVGcpP2UucmVwbGFjZShUZyx0PT5rZyh0KSk6ZX12YXIgTmc9amkoOTc1KTtjb25zdCBwYT1OZy5wb3NpeHx8TmcsWXU9Ii8iO3ZhciBMZzsoZnVuY3Rpb24oZSl7ZS5qb2luUGF0aD1mdW5jdGlvbih0LC4uLm4pe3JldHVybiB0LndpdGgoe3BhdGg6cGEuam9pbih0LnBhdGgsLi4ubil9KX0sZS5yZXNvbHZlUGF0aD1mdW5jdGlvbih0LC4uLm4pe2xldCByPXQucGF0aCxzPSExO3JbMF0hPT1ZdSYmKHI9WXUrcixzPSEwKTtsZXQgaT1wYS5yZXNvbHZlKHIsLi4ubik7cmV0dXJuIHMmJmlbMF09PT1ZdSYmIXQuYXV0aG9yaXR5JiYoaT1pLnN1YnN0cmluZygxKSksdC53aXRoKHtwYXRoOml9KX0sZS5kaXJuYW1lPWZ1bmN0aW9uKHQpe2lmKHQucGF0aC5sZW5ndGg9PT0wfHx0LnBhdGg9PT1ZdSlyZXR1cm4gdDtsZXQgbj1wYS5kaXJuYW1lKHQucGF0aCk7cmV0dXJuIG4ubGVuZ3RoPT09MSYmbi5jaGFyQ29kZUF0KDApPT09NDYmJihuPSIiKSx0LndpdGgoe3BhdGg6bn0pfSxlLmJhc2VuYW1lPWZ1bmN0aW9uKHQpe3JldHVybiBwYS5iYXNlbmFtZSh0LnBhdGgpfSxlLmV4dG5hbWU9ZnVuY3Rpb24odCl7cmV0dXJuIHBhLmV4dG5hbWUodC5wYXRoKX19KShMZ3x8KExnPXt9KSk7dmFyICRnOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3JldHVybiB0eXBlb2Ygbj09InN0cmluZyJ9ZS5pcz10fSkoJGd8fCgkZz17fSkpO3ZhciBscDsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtyZXR1cm4gdHlwZW9mIG49PSJzdHJpbmcifWUuaXM9dH0pKGxwfHwobHA9e30pKTt2YXIgQmc7KGZ1bmN0aW9uKGUpe2UuTUlOX1ZBTFVFPS0yMTQ3NDgzNjQ4LGUuTUFYX1ZBTFVFPTIxNDc0ODM2NDc7ZnVuY3Rpb24gdChuKXtyZXR1cm4gdHlwZW9mIG49PSJudW1iZXIiJiZlLk1JTl9WQUxVRTw9biYmbjw9ZS5NQVhfVkFMVUV9ZS5pcz10fSkoQmd8fChCZz17fSkpO3ZhciBRdTsoZnVuY3Rpb24oZSl7ZS5NSU5fVkFMVUU9MCxlLk1BWF9WQUxVRT0yMTQ3NDgzNjQ3O2Z1bmN0aW9uIHQobil7cmV0dXJuIHR5cGVvZiBuPT0ibnVtYmVyIiYmZS5NSU5fVkFMVUU8PW4mJm48PWUuTUFYX1ZBTFVFfWUuaXM9dH0pKFF1fHwoUXU9e30pKTt2YXIgdXQ7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixzKXtyZXR1cm4gcj09PU51bWJlci5NQVhfVkFMVUUmJihyPVF1Lk1BWF9WQUxVRSkscz09PU51bWJlci5NQVhfVkFMVUUmJihzPVF1Lk1BWF9WQUxVRSkse2xpbmU6cixjaGFyYWN0ZXI6c319ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IHM9cjtyZXR1cm4gQi5vYmplY3RMaXRlcmFsKHMpJiZCLnVpbnRlZ2VyKHMubGluZSkmJkIudWludGVnZXIocy5jaGFyYWN0ZXIpfWUuaXM9bn0pKHV0fHwodXQ9e30pKTt2YXIgWTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLHMsaSxvKXtpZihCLnVpbnRlZ2VyKHIpJiZCLnVpbnRlZ2VyKHMpJiZCLnVpbnRlZ2VyKGkpJiZCLnVpbnRlZ2VyKG8pKXJldHVybntzdGFydDp1dC5jcmVhdGUocixzKSxlbmQ6dXQuY3JlYXRlKGksbyl9O2lmKHV0LmlzKHIpJiZ1dC5pcyhzKSlyZXR1cm57c3RhcnQ6cixlbmQ6c307dGhyb3cgbmV3IEVycm9yKGBSYW5nZSNjcmVhdGUgY2FsbGVkIHdpdGggaW52YWxpZCBhcmd1bWVudHNbJHtyfSwgJHtzfSwgJHtpfSwgJHtvfV1gKX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBCLm9iamVjdExpdGVyYWwocykmJnV0LmlzKHMuc3RhcnQpJiZ1dC5pcyhzLmVuZCl9ZS5pcz1ufSkoWXx8KFk9e30pKTt2YXIgVWk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixzKXtyZXR1cm57dXJpOnIscmFuZ2U6c319ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IHM9cjtyZXR1cm4gQi5vYmplY3RMaXRlcmFsKHMpJiZZLmlzKHMucmFuZ2UpJiYoQi5zdHJpbmcocy51cmkpfHxCLnVuZGVmaW5lZChzLnVyaSkpfWUuaXM9bn0pKFVpfHwoVWk9e30pKTt2YXIgY3A7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixzLGksbyl7cmV0dXJue3RhcmdldFVyaTpyLHRhcmdldFJhbmdlOnMsdGFyZ2V0U2VsZWN0aW9uUmFuZ2U6aSxvcmlnaW5TZWxlY3Rpb25SYW5nZTpvfX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBCLm9iamVjdExpdGVyYWwocykmJlkuaXMocy50YXJnZXRSYW5nZSkmJkIuc3RyaW5nKHMudGFyZ2V0VXJpKSYmWS5pcyhzLnRhcmdldFNlbGVjdGlvblJhbmdlKSYmKFkuaXMocy5vcmlnaW5TZWxlY3Rpb25SYW5nZSl8fEIudW5kZWZpbmVkKHMub3JpZ2luU2VsZWN0aW9uUmFuZ2UpKX1lLmlzPW59KShjcHx8KGNwPXt9KSk7dmFyIGZwOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIscyxpLG8pe3JldHVybntyZWQ6cixncmVlbjpzLGJsdWU6aSxhbHBoYTpvfX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBCLm9iamVjdExpdGVyYWwocykmJkIubnVtYmVyUmFuZ2Uocy5yZWQsMCwxKSYmQi5udW1iZXJSYW5nZShzLmdyZWVuLDAsMSkmJkIubnVtYmVyUmFuZ2Uocy5ibHVlLDAsMSkmJkIubnVtYmVyUmFuZ2Uocy5hbHBoYSwwLDEpfWUuaXM9bn0pKGZwfHwoZnA9e30pKTt2YXIgX2c7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixzKXtyZXR1cm57cmFuZ2U6cixjb2xvcjpzfX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBCLm9iamVjdExpdGVyYWwocykmJlkuaXMocy5yYW5nZSkmJmZwLmlzKHMuY29sb3IpfWUuaXM9bn0pKF9nfHwoX2c9e30pKTt2YXIgSWc7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixzLGkpe3JldHVybntsYWJlbDpyLHRleHRFZGl0OnMsYWRkaXRpb25hbFRleHRFZGl0czppfX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBCLm9iamVjdExpdGVyYWwocykmJkIuc3RyaW5nKHMubGFiZWwpJiYoQi51bmRlZmluZWQocy50ZXh0RWRpdCl8fERlLmlzKHMpKSYmKEIudW5kZWZpbmVkKHMuYWRkaXRpb25hbFRleHRFZGl0cyl8fEIudHlwZWRBcnJheShzLmFkZGl0aW9uYWxUZXh0RWRpdHMsRGUuaXMpKX1lLmlzPW59KShJZ3x8KElnPXt9KSk7dmFyIFBnOyhmdW5jdGlvbihlKXtlLkNvbW1lbnQ9ImNvbW1lbnQiLGUuSW1wb3J0cz0iaW1wb3J0cyIsZS5SZWdpb249InJlZ2lvbiJ9KShQZ3x8KFBnPXt9KSk7dmFyIHBwOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIscyxpLG8sYSx1KXtjb25zdCBsPXtzdGFydExpbmU6cixlbmRMaW5lOnN9O3JldHVybiBCLmRlZmluZWQoaSkmJihsLnN0YXJ0Q2hhcmFjdGVyPWkpLEIuZGVmaW5lZChvKSYmKGwuZW5kQ2hhcmFjdGVyPW8pLEIuZGVmaW5lZChhKSYmKGwua2luZD1hKSxCLmRlZmluZWQodSkmJihsLmNvbGxhcHNlZFRleHQ9dSksbH1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBCLm9iamVjdExpdGVyYWwocykmJkIudWludGVnZXIocy5zdGFydExpbmUpJiZCLnVpbnRlZ2VyKHMuc3RhcnRMaW5lKSYmKEIudW5kZWZpbmVkKHMuc3RhcnRDaGFyYWN0ZXIpfHxCLnVpbnRlZ2VyKHMuc3RhcnRDaGFyYWN0ZXIpKSYmKEIudW5kZWZpbmVkKHMuZW5kQ2hhcmFjdGVyKXx8Qi51aW50ZWdlcihzLmVuZENoYXJhY3RlcikpJiYoQi51bmRlZmluZWQocy5raW5kKXx8Qi5zdHJpbmcocy5raW5kKSl9ZS5pcz1ufSkocHB8fChwcD17fSkpO3ZhciBocDsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLHMpe3JldHVybntsb2NhdGlvbjpyLG1lc3NhZ2U6c319ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IHM9cjtyZXR1cm4gQi5kZWZpbmVkKHMpJiZVaS5pcyhzLmxvY2F0aW9uKSYmQi5zdHJpbmcocy5tZXNzYWdlKX1lLmlzPW59KShocHx8KGhwPXt9KSk7dmFyIFE7KGZ1bmN0aW9uKGUpe2UuRXJyb3I9MSxlLldhcm5pbmc9MixlLkluZm9ybWF0aW9uPTMsZS5IaW50PTR9KShRfHwoUT17fSkpO3ZhciBadTsoZnVuY3Rpb24oZSl7ZS5Vbm5lY2Vzc2FyeT0xLGUuRGVwcmVjYXRlZD0yfSkoWnV8fChadT17fSkpO3ZhciBNZzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtjb25zdCByPW47cmV0dXJuIEIub2JqZWN0TGl0ZXJhbChyKSYmQi5zdHJpbmcoci5ocmVmKX1lLmlzPXR9KShNZ3x8KE1nPXt9KSk7dmFyIFB0OyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGksbyxhLHUsbCxmKXtjb25zdCBjPXtyYW5nZTppLG1lc3NhZ2U6b307cmV0dXJuIEIuZGVmaW5lZChhKSYmKGMuc2V2ZXJpdHk9YSksQi5kZWZpbmVkKHUpJiYoYy5jb2RlPXUpLEIuZGVmaW5lZChsKSYmKGMuc291cmNlPWwpLEIuZGVmaW5lZChmKSYmKGMucmVsYXRlZEluZm9ybWF0aW9uPWYpLGN9ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKGkpe3ZhciBvO2NvbnN0IGE9aTtyZXR1cm4gQi5kZWZpbmVkKGEpJiZZLmlzKGEucmFuZ2UpJiYoQi5zdHJpbmcoYS5tZXNzYWdlKXx8UnMuaXMoYS5tZXNzYWdlKSkmJihCLm51bWJlcihhLnNldmVyaXR5KXx8Qi51bmRlZmluZWQoYS5zZXZlcml0eSkpJiYoQi5pbnRlZ2VyKGEuY29kZSl8fEIuc3RyaW5nKGEuY29kZSl8fEIudW5kZWZpbmVkKGEuY29kZSkpJiYoQi51bmRlZmluZWQoYS5jb2RlRGVzY3JpcHRpb24pfHxCLnN0cmluZygobz1hLmNvZGVEZXNjcmlwdGlvbik9PT1udWxsfHxvPT09dm9pZCAwP3ZvaWQgMDpvLmhyZWYpKSYmKEIuc3RyaW5nKGEuc291cmNlKXx8Qi51bmRlZmluZWQoYS5zb3VyY2UpKSYmKEIudW5kZWZpbmVkKGEucmVsYXRlZEluZm9ybWF0aW9uKXx8Qi50eXBlZEFycmF5KGEucmVsYXRlZEluZm9ybWF0aW9uLGhwLmlzKSl9ZS5pcz1uO2Z1bmN0aW9uIHIoaSl7cmV0dXJuIEIuc3RyaW5nKGkubWVzc2FnZSl9ZS5pczNfMTc9cjtmdW5jdGlvbiBzKGkpe2lmKEIuc3RyaW5nKGkubWVzc2FnZSkpcmV0dXJuIGkubWVzc2FnZTtpZihScy5pcyhpLm1lc3NhZ2UpKXJldHVybiBpLm1lc3NhZ2UudmFsdWU7dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIG1lc3NhZ2UgdHlwZSAke3R5cGVvZiBpLm1lc3NhZ2V9YCl9ZS5nZXRNZXNzYWdlU3RyaW5nPXN9KShQdHx8KFB0PXt9KSk7dmFyIE1zOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIscywuLi5pKXtjb25zdCBvPXt0aXRsZTpyLGNvbW1hbmQ6c307cmV0dXJuIEIuZGVmaW5lZChpKSYmaS5sZW5ndGg+MCYmKG8uYXJndW1lbnRzPWkpLG99ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IHM9cjtyZXR1cm4gQi5kZWZpbmVkKHMpJiZCLnN0cmluZyhzLnRpdGxlKSYmKHMudG9vbHRpcD09PXZvaWQgMHx8Qi5zdHJpbmcocy50b29sdGlwKSkmJkIuc3RyaW5nKHMuY29tbWFuZCl9ZS5pcz1ufSkoTXN8fChNcz17fSkpO3ZhciBEZTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChpLG8pe3JldHVybntyYW5nZTppLG5ld1RleHQ6b319ZS5yZXBsYWNlPXQ7ZnVuY3Rpb24gbihpLG8pe3JldHVybntyYW5nZTp7c3RhcnQ6aSxlbmQ6aX0sbmV3VGV4dDpvfX1lLmluc2VydD1uO2Z1bmN0aW9uIHIoaSl7cmV0dXJue3JhbmdlOmksbmV3VGV4dDoiIn19ZS5kZWw9cjtmdW5jdGlvbiBzKGkpe2NvbnN0IG89aTtyZXR1cm4gQi5vYmplY3RMaXRlcmFsKG8pJiZCLnN0cmluZyhvLm5ld1RleHQpJiZZLmlzKG8ucmFuZ2UpfWUuaXM9c30pKERlfHwoRGU9e30pKTt2YXIgZWw7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixzLGkpe2NvbnN0IG89e2xhYmVsOnJ9O3JldHVybiBzIT09dm9pZCAwJiYoby5uZWVkc0NvbmZpcm1hdGlvbj1zKSxpIT09dm9pZCAwJiYoby5kZXNjcmlwdGlvbj1pKSxvfWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBzPXI7cmV0dXJuIEIub2JqZWN0TGl0ZXJhbChzKSYmQi5zdHJpbmcocy5sYWJlbCkmJihCLmJvb2xlYW4ocy5uZWVkc0NvbmZpcm1hdGlvbil8fHMubmVlZHNDb25maXJtYXRpb249PT12b2lkIDApJiYoQi5zdHJpbmcocy5kZXNjcmlwdGlvbil8fHMuZGVzY3JpcHRpb249PT12b2lkIDApfWUuaXM9bn0pKGVsfHwoZWw9e30pKTt2YXIgT3M7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7Y29uc3Qgcj1uO3JldHVybiBCLnN0cmluZyhyKX1lLmlzPXR9KShPc3x8KE9zPXt9KSk7dmFyIE9nOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KGksbyxhKXtyZXR1cm57cmFuZ2U6aSxuZXdUZXh0Om8sYW5ub3RhdGlvbklkOmF9fWUucmVwbGFjZT10O2Z1bmN0aW9uIG4oaSxvLGEpe3JldHVybntyYW5nZTp7c3RhcnQ6aSxlbmQ6aX0sbmV3VGV4dDpvLGFubm90YXRpb25JZDphfX1lLmluc2VydD1uO2Z1bmN0aW9uIHIoaSxvKXtyZXR1cm57cmFuZ2U6aSxuZXdUZXh0OiIiLGFubm90YXRpb25JZDpvfX1lLmRlbD1yO2Z1bmN0aW9uIHMoaSl7Y29uc3Qgbz1pO3JldHVybiBEZS5pcyhvKSYmKGVsLmlzKG8uYW5ub3RhdGlvbklkKXx8T3MuaXMoby5hbm5vdGF0aW9uSWQpKX1lLmlzPXN9KShPZ3x8KE9nPXt9KSk7dmFyIGRwOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIscyl7cmV0dXJue3RleHREb2N1bWVudDpyLGVkaXRzOnN9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBzPXI7cmV0dXJuIEIuZGVmaW5lZChzKSYmYnAuaXMocy50ZXh0RG9jdW1lbnQpJiZBcnJheS5pc0FycmF5KHMuZWRpdHMpfWUuaXM9bn0pKGRwfHwoZHA9e30pKTt2YXIgbXA7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixzLGkpe2NvbnN0IG89e2tpbmQ6ImNyZWF0ZSIsdXJpOnJ9O3JldHVybiBzIT09dm9pZCAwJiYocy5vdmVyd3JpdGUhPT12b2lkIDB8fHMuaWdub3JlSWZFeGlzdHMhPT12b2lkIDApJiYoby5vcHRpb25zPXMpLGkhPT12b2lkIDAmJihvLmFubm90YXRpb25JZD1pKSxvfWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBzPXI7cmV0dXJuIHMmJnMua2luZD09PSJjcmVhdGUiJiZCLnN0cmluZyhzLnVyaSkmJihzLm9wdGlvbnM9PT12b2lkIDB8fChzLm9wdGlvbnMub3ZlcndyaXRlPT09dm9pZCAwfHxCLmJvb2xlYW4ocy5vcHRpb25zLm92ZXJ3cml0ZSkpJiYocy5vcHRpb25zLmlnbm9yZUlmRXhpc3RzPT09dm9pZCAwfHxCLmJvb2xlYW4ocy5vcHRpb25zLmlnbm9yZUlmRXhpc3RzKSkpJiYocy5hbm5vdGF0aW9uSWQ9PT12b2lkIDB8fE9zLmlzKHMuYW5ub3RhdGlvbklkKSl9ZS5pcz1ufSkobXB8fChtcD17fSkpO3ZhciBncDsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLHMsaSxvKXtjb25zdCBhPXtraW5kOiJyZW5hbWUiLG9sZFVyaTpyLG5ld1VyaTpzfTtyZXR1cm4gaSE9PXZvaWQgMCYmKGkub3ZlcndyaXRlIT09dm9pZCAwfHxpLmlnbm9yZUlmRXhpc3RzIT09dm9pZCAwKSYmKGEub3B0aW9ucz1pKSxvIT09dm9pZCAwJiYoYS5hbm5vdGF0aW9uSWQ9byksYX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBzJiZzLmtpbmQ9PT0icmVuYW1lIiYmQi5zdHJpbmcocy5vbGRVcmkpJiZCLnN0cmluZyhzLm5ld1VyaSkmJihzLm9wdGlvbnM9PT12b2lkIDB8fChzLm9wdGlvbnMub3ZlcndyaXRlPT09dm9pZCAwfHxCLmJvb2xlYW4ocy5vcHRpb25zLm92ZXJ3cml0ZSkpJiYocy5vcHRpb25zLmlnbm9yZUlmRXhpc3RzPT09dm9pZCAwfHxCLmJvb2xlYW4ocy5vcHRpb25zLmlnbm9yZUlmRXhpc3RzKSkpJiYocy5hbm5vdGF0aW9uSWQ9PT12b2lkIDB8fE9zLmlzKHMuYW5ub3RhdGlvbklkKSl9ZS5pcz1ufSkoZ3B8fChncD17fSkpO3ZhciB5cDsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLHMsaSl7Y29uc3Qgbz17a2luZDoiZGVsZXRlIix1cmk6cn07cmV0dXJuIHMhPT12b2lkIDAmJihzLnJlY3Vyc2l2ZSE9PXZvaWQgMHx8cy5pZ25vcmVJZk5vdEV4aXN0cyE9PXZvaWQgMCkmJihvLm9wdGlvbnM9cyksaSE9PXZvaWQgMCYmKG8uYW5ub3RhdGlvbklkPWkpLG99ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IHM9cjtyZXR1cm4gcyYmcy5raW5kPT09ImRlbGV0ZSImJkIuc3RyaW5nKHMudXJpKSYmKHMub3B0aW9ucz09PXZvaWQgMHx8KHMub3B0aW9ucy5yZWN1cnNpdmU9PT12b2lkIDB8fEIuYm9vbGVhbihzLm9wdGlvbnMucmVjdXJzaXZlKSkmJihzLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHM9PT12b2lkIDB8fEIuYm9vbGVhbihzLm9wdGlvbnMuaWdub3JlSWZOb3RFeGlzdHMpKSkmJihzLmFubm90YXRpb25JZD09PXZvaWQgMHx8T3MuaXMocy5hbm5vdGF0aW9uSWQpKX1lLmlzPW59KSh5cHx8KHlwPXt9KSk7dmFyIERwOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe2NvbnN0IHI9bjtyZXR1cm4gciYmKHIuY2hhbmdlcyE9PXZvaWQgMHx8ci5kb2N1bWVudENoYW5nZXMhPT12b2lkIDApJiYoci5kb2N1bWVudENoYW5nZXM9PT12b2lkIDB8fHIuZG9jdW1lbnRDaGFuZ2VzLmV2ZXJ5KHM9PkIuc3RyaW5nKHMua2luZCk/bXAuaXMocyl8fGdwLmlzKHMpfHx5cC5pcyhzKTpkcC5pcyhzKSkpfWUuaXM9dH0pKERwfHwoRHA9e30pKTt2YXIgUmc7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7Y29uc3Qgcj1uO3JldHVybiBCLm9iamVjdExpdGVyYWwocikmJlkuaXMoci5yYW5nZSkmJnhwLmlzU25pcHBldChyLnNuaXBwZXQpJiYoci5hbm5vdGF0aW9uSWQ9PT12b2lkIDB8fGVsLmlzKHIuYW5ub3RhdGlvbklkKXx8T3MuaXMoci5hbm5vdGF0aW9uSWQpKX1lLmlzPXR9KShSZ3x8KFJnPXt9KSk7dmFyIGpnOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe3JldHVybnt1cmk6cn19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IHM9cjtyZXR1cm4gQi5kZWZpbmVkKHMpJiZCLnN0cmluZyhzLnVyaSl9ZS5pcz1ufSkoamd8fChqZz17fSkpO3ZhciBWZzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLHMpe3JldHVybnt1cmk6cix2ZXJzaW9uOnN9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBzPXI7cmV0dXJuIEIuZGVmaW5lZChzKSYmQi5zdHJpbmcocy51cmkpJiZCLmludGVnZXIocy52ZXJzaW9uKX1lLmlzPW59KShWZ3x8KFZnPXt9KSk7dmFyIGJwOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIscyl7cmV0dXJue3VyaTpyLHZlcnNpb246c319ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IHM9cjtyZXR1cm4gQi5kZWZpbmVkKHMpJiZCLnN0cmluZyhzLnVyaSkmJihzLnZlcnNpb249PT1udWxsfHxCLmludGVnZXIocy52ZXJzaW9uKSl9ZS5pcz1ufSkoYnB8fChicD17fSkpO3ZhciBVZzsoZnVuY3Rpb24oZSl7ZS5BQkFQPSJhYmFwIixlLldpbmRvd3NCYXQ9ImJhdCIsZS5CaWJUZVg9ImJpYnRleCIsZS5DbG9qdXJlPSJjbG9qdXJlIixlLkNvZmZlZXNjcmlwdD0iY29mZmVlc2NyaXB0IixlLkM9ImMiLGUuQ1BQPSJjcHAiLGUuQ1NoYXJwPSJjc2hhcnAiLGUuQ1NTPSJjc3MiLGUuRD0iZCIsZS5EZWxwaGk9InBhc2NhbCIsZS5EaWZmPSJkaWZmIixlLkRhcnQ9ImRhcnQiLGUuRG9ja2VyZmlsZT0iZG9ja2VyZmlsZSIsZS5FbGl4aXI9ImVsaXhpciIsZS5Fcmxhbmc9ImVybGFuZyIsZS5GU2hhcnA9ImZzaGFycCIsZS5HaXRDb21taXQ9ImdpdC1jb21taXQiLGUuR2l0UmViYXNlPSJnaXQtcmViYXNlIixlLkdvPSJnbyIsZS5Hcm9vdnk9Imdyb292eSIsZS5IYW5kbGViYXJzPSJoYW5kbGViYXJzIixlLkhhc2tlbGw9Imhhc2tlbGwiLGUuSFRNTD0iaHRtbCIsZS5Jbmk9ImluaSIsZS5KYXZhPSJqYXZhIixlLkphdmFTY3JpcHQ9ImphdmFzY3JpcHQiLGUuSmF2YVNjcmlwdFJlYWN0PSJqYXZhc2NyaXB0cmVhY3QiLGUuSlNPTj0ianNvbiIsZS5MYVRlWD0ibGF0ZXgiLGUuTGVzcz0ibGVzcyIsZS5MdWE9Imx1YSIsZS5NYWtlZmlsZT0ibWFrZWZpbGUiLGUuTWFya2Rvd249Im1hcmtkb3duIixlLk9iamVjdGl2ZUM9Im9iamVjdGl2ZS1jIixlLk9iamVjdGl2ZUNQUD0ib2JqZWN0aXZlLWNwcCIsZS5QYXNjYWw9InBhc2NhbCIsZS5QZXJsPSJwZXJsIixlLlBlcmw2PSJwZXJsNiIsZS5QSFA9InBocCIsZS5QbGFpbnRleHQ9InBsYWludGV4dCIsZS5Qb3dlcnNoZWxsPSJwb3dlcnNoZWxsIixlLlB1Zz0iamFkZSIsZS5QeXRob249InB5dGhvbiIsZS5SPSJyIixlLlJhem9yPSJyYXpvciIsZS5SdWJ5PSJydWJ5IixlLlJ1c3Q9InJ1c3QiLGUuU0NTUz0ic2NzcyIsZS5TQVNTPSJzYXNzIixlLlNjYWxhPSJzY2FsYSIsZS5TaGFkZXJMYWI9InNoYWRlcmxhYiIsZS5TaGVsbFNjcmlwdD0ic2hlbGxzY3JpcHQiLGUuU1FMPSJzcWwiLGUuU3dpZnQ9InN3aWZ0IixlLlR5cGVTY3JpcHQ9InR5cGVzY3JpcHQiLGUuVHlwZVNjcmlwdFJlYWN0PSJ0eXBlc2NyaXB0cmVhY3QiLGUuVGVYPSJ0ZXgiLGUuVmlzdWFsQmFzaWM9InZiIixlLlhNTD0ieG1sIixlLlhTTD0ieHNsIixlLllBTUw9InlhbWwifSkoVWd8fChVZz17fSkpO3ZhciBxZzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLHMsaSxvKXtyZXR1cm57dXJpOnIsbGFuZ3VhZ2VJZDpzLHZlcnNpb246aSx0ZXh0Om99fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBzPXI7cmV0dXJuIEIuZGVmaW5lZChzKSYmQi5zdHJpbmcocy51cmkpJiZCLnN0cmluZyhzLmxhbmd1YWdlSWQpJiZCLmludGVnZXIocy52ZXJzaW9uKSYmQi5zdHJpbmcocy50ZXh0KX1lLmlzPW59KShxZ3x8KHFnPXt9KSk7dmFyIHZyOyhmdW5jdGlvbihlKXtlLlBsYWluVGV4dD0icGxhaW50ZXh0IixlLk1hcmtkb3duPSJtYXJrZG93biI7ZnVuY3Rpb24gdChuKXtjb25zdCByPW47cmV0dXJuIHI9PT1lLlBsYWluVGV4dHx8cj09PWUuTWFya2Rvd259ZS5pcz10fSkodnJ8fCh2cj17fSkpO3ZhciBSczsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtjb25zdCByPW47cmV0dXJuIEIub2JqZWN0TGl0ZXJhbChuKSYmdnIuaXMoci5raW5kKSYmQi5zdHJpbmcoci52YWx1ZSl9ZS5pcz10fSkoUnN8fChScz17fSkpO3ZhciBNdDsoZnVuY3Rpb24oZSl7ZS5UZXh0PTEsZS5NZXRob2Q9MixlLkZ1bmN0aW9uPTMsZS5Db25zdHJ1Y3Rvcj00LGUuRmllbGQ9NSxlLlZhcmlhYmxlPTYsZS5DbGFzcz03LGUuSW50ZXJmYWNlPTgsZS5Nb2R1bGU9OSxlLlByb3BlcnR5PTEwLGUuVW5pdD0xMSxlLlZhbHVlPTEyLGUuRW51bT0xMyxlLktleXdvcmQ9MTQsZS5TbmlwcGV0PTE1LGUuQ29sb3I9MTYsZS5GaWxlPTE3LGUuUmVmZXJlbmNlPTE4LGUuRm9sZGVyPTE5LGUuRW51bU1lbWJlcj0yMCxlLkNvbnN0YW50PTIxLGUuU3RydWN0PTIyLGUuRXZlbnQ9MjMsZS5PcGVyYXRvcj0yNCxlLlR5cGVQYXJhbWV0ZXI9MjV9KShNdHx8KE10PXt9KSk7dmFyIGx0OyhmdW5jdGlvbihlKXtlLlBsYWluVGV4dD0xLGUuU25pcHBldD0yfSkobHR8fChsdD17fSkpO3ZhciBXZzsoZnVuY3Rpb24oZSl7ZS5EZXByZWNhdGVkPTF9KShXZ3x8KFdnPXt9KSk7dmFyIEhnOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIscyxpKXtyZXR1cm57bmV3VGV4dDpyLGluc2VydDpzLHJlcGxhY2U6aX19ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IHM9cjtyZXR1cm4gcyYmQi5zdHJpbmcocy5uZXdUZXh0KSYmWS5pcyhzLmluc2VydCkmJlkuaXMocy5yZXBsYWNlKX1lLmlzPW59KShIZ3x8KEhnPXt9KSk7dmFyIEVwOyhmdW5jdGlvbihlKXtlLmFzSXM9MSxlLmFkanVzdEluZGVudGF0aW9uPTJ9KShFcHx8KEVwPXt9KSk7dmFyIEpnOyhmdW5jdGlvbihlKXtlLlJlcGxhY2U9MSxlLk1lcmdlPTJ9KShKZ3x8KEpnPXt9KSk7dmFyIHpnOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe2NvbnN0IHI9bjtyZXR1cm4gciYmKEIuc3RyaW5nKHIuZGV0YWlsKXx8ci5kZXRhaWw9PT12b2lkIDApJiYoQi5zdHJpbmcoci5kZXNjcmlwdGlvbil8fHIuZGVzY3JpcHRpb249PT12b2lkIDApfWUuaXM9dH0pKHpnfHwoemc9e30pKTt2YXIgdnA7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7cmV0dXJue2xhYmVsOm59fWUuY3JlYXRlPXR9KSh2cHx8KHZwPXt9KSk7dmFyIEZwOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4scil7cmV0dXJue2l0ZW1zOm58fFtdLGlzSW5jb21wbGV0ZTohIXJ9fWUuY3JlYXRlPXR9KShGcHx8KEZwPXt9KSk7dmFyIHRsOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIpe3JldHVybiByLnJlcGxhY2UoL1tcXGAqX3t9W1xdKCkjK1wtLiFdL2csIlxcJCYiKX1lLmZyb21QbGFpblRleHQ9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IHM9cjtyZXR1cm4gQi5zdHJpbmcocyl8fEIub2JqZWN0TGl0ZXJhbChzKSYmQi5zdHJpbmcocy5sYW5ndWFnZSkmJkIuc3RyaW5nKHMudmFsdWUpfWUuaXM9bn0pKHRsfHwodGw9e30pKTt2YXIgR2c7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7Y29uc3Qgcj1uO3JldHVybiEhciYmQi5vYmplY3RMaXRlcmFsKHIpJiYoUnMuaXMoci5jb250ZW50cyl8fHRsLmlzKHIuY29udGVudHMpfHxCLnR5cGVkQXJyYXkoci5jb250ZW50cyx0bC5pcykpJiYobi5yYW5nZT09PXZvaWQgMHx8WS5pcyhuLnJhbmdlKSl9ZS5pcz10fSkoR2d8fChHZz17fSkpO3ZhciBLZzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuLHIpe3JldHVybiByP3tsYWJlbDpuLGRvY3VtZW50YXRpb246cn06e2xhYmVsOm59fWUuY3JlYXRlPXR9KShLZ3x8KEtnPXt9KSk7dmFyIFhnOyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4sciwuLi5zKXtjb25zdCBpPXtsYWJlbDpufTtyZXR1cm4gQi5kZWZpbmVkKHIpJiYoaS5kb2N1bWVudGF0aW9uPXIpLEIuZGVmaW5lZChzKT9pLnBhcmFtZXRlcnM9czppLnBhcmFtZXRlcnM9W10saX1lLmNyZWF0ZT10fSkoWGd8fChYZz17fSkpO3ZhciBZZzsoZnVuY3Rpb24oZSl7ZS5UZXh0PTEsZS5SZWFkPTIsZS5Xcml0ZT0zfSkoWWd8fChZZz17fSkpO3ZhciBRZzsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuLHIpe2NvbnN0IHM9e3JhbmdlOm59O3JldHVybiBCLm51bWJlcihyKSYmKHMua2luZD1yKSxzfWUuY3JlYXRlPXR9KShRZ3x8KFFnPXt9KSk7dmFyIFluOyhmdW5jdGlvbihlKXtlLkZpbGU9MSxlLk1vZHVsZT0yLGUuTmFtZXNwYWNlPTMsZS5QYWNrYWdlPTQsZS5DbGFzcz01LGUuTWV0aG9kPTYsZS5Qcm9wZXJ0eT03LGUuRmllbGQ9OCxlLkNvbnN0cnVjdG9yPTksZS5FbnVtPTEwLGUuSW50ZXJmYWNlPTExLGUuRnVuY3Rpb249MTIsZS5WYXJpYWJsZT0xMyxlLkNvbnN0YW50PTE0LGUuU3RyaW5nPTE1LGUuTnVtYmVyPTE2LGUuQm9vbGVhbj0xNyxlLkFycmF5PTE4LGUuT2JqZWN0PTE5LGUuS2V5PTIwLGUuTnVsbD0yMSxlLkVudW1NZW1iZXI9MjIsZS5TdHJ1Y3Q9MjMsZS5FdmVudD0yNCxlLk9wZXJhdG9yPTI1LGUuVHlwZVBhcmFtZXRlcj0yNn0pKFlufHwoWW49e30pKTt2YXIgWmc7KGZ1bmN0aW9uKGUpe2UuRGVwcmVjYXRlZD0xfSkoWmd8fChaZz17fSkpO3ZhciBleTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuLHIscyxpLG8pe2NvbnN0IGE9e25hbWU6bixraW5kOnIsbG9jYXRpb246e3VyaTppLHJhbmdlOnN9fTtyZXR1cm4gbyYmKGEuY29udGFpbmVyTmFtZT1vKSxhfWUuY3JlYXRlPXR9KShleXx8KGV5PXt9KSk7dmFyIHR5OyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4scixzLGkpe3JldHVybiBpIT09dm9pZCAwP3tuYW1lOm4sa2luZDpyLGxvY2F0aW9uOnt1cmk6cyxyYW5nZTppfX06e25hbWU6bixraW5kOnIsbG9jYXRpb246e3VyaTpzfX19ZS5jcmVhdGU9dH0pKHR5fHwodHk9e30pKTt2YXIgbnk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixzLGksbyxhLHUpe2NvbnN0IGw9e25hbWU6cixkZXRhaWw6cyxraW5kOmkscmFuZ2U6byxzZWxlY3Rpb25SYW5nZTphfTtyZXR1cm4gdSE9PXZvaWQgMCYmKGwuY2hpbGRyZW49dSksbH1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBzJiZCLnN0cmluZyhzLm5hbWUpJiZCLm51bWJlcihzLmtpbmQpJiZZLmlzKHMucmFuZ2UpJiZZLmlzKHMuc2VsZWN0aW9uUmFuZ2UpJiYocy5kZXRhaWw9PT12b2lkIDB8fEIuc3RyaW5nKHMuZGV0YWlsKSkmJihzLmRlcHJlY2F0ZWQ9PT12b2lkIDB8fEIuYm9vbGVhbihzLmRlcHJlY2F0ZWQpKSYmKHMuY2hpbGRyZW49PT12b2lkIDB8fEFycmF5LmlzQXJyYXkocy5jaGlsZHJlbikpJiYocy50YWdzPT09dm9pZCAwfHxBcnJheS5pc0FycmF5KHMudGFncykpfWUuaXM9bn0pKG55fHwobnk9e30pKTt2YXIgTW47KGZ1bmN0aW9uKGUpe2UuRW1wdHk9IiIsZS5RdWlja0ZpeD0icXVpY2tmaXgiLGUuUmVmYWN0b3I9InJlZmFjdG9yIixlLlJlZmFjdG9yRXh0cmFjdD0icmVmYWN0b3IuZXh0cmFjdCIsZS5SZWZhY3RvcklubGluZT0icmVmYWN0b3IuaW5saW5lIixlLlJlZmFjdG9yTW92ZT0icmVmYWN0b3IubW92ZSIsZS5SZWZhY3RvclJld3JpdGU9InJlZmFjdG9yLnJld3JpdGUiLGUuU291cmNlPSJzb3VyY2UiLGUuU291cmNlT3JnYW5pemVJbXBvcnRzPSJzb3VyY2Uub3JnYW5pemVJbXBvcnRzIixlLlNvdXJjZUZpeEFsbD0ic291cmNlLmZpeEFsbCIsZS5Ob3RlYm9vaz0ibm90ZWJvb2sifSkoTW58fChNbj17fSkpO3ZhciBubDsoZnVuY3Rpb24oZSl7ZS5JbnZva2VkPTEsZS5BdXRvbWF0aWM9Mn0pKG5sfHwobmw9e30pKTt2YXIgcnk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixzLGkpe2NvbnN0IG89e2RpYWdub3N0aWNzOnJ9O3JldHVybiBzIT1udWxsJiYoby5vbmx5PXMpLGkhPW51bGwmJihvLnRyaWdnZXJLaW5kPWkpLG99ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IHM9cjtyZXR1cm4gQi5kZWZpbmVkKHMpJiZCLnR5cGVkQXJyYXkocy5kaWFnbm9zdGljcyxQdC5pcykmJihzLm9ubHk9PT12b2lkIDB8fEIudHlwZWRBcnJheShzLm9ubHksQi5zdHJpbmcpKSYmKHMudHJpZ2dlcktpbmQ9PT12b2lkIDB8fHMudHJpZ2dlcktpbmQ9PT1ubC5JbnZva2VkfHxzLnRyaWdnZXJLaW5kPT09bmwuQXV0b21hdGljKX1lLmlzPW59KShyeXx8KHJ5PXt9KSk7dmFyIEFwOyhmdW5jdGlvbihlKXtlLkxMTUdlbmVyYXRlZD0xO2Z1bmN0aW9uIHQobil7cmV0dXJuIEIuZGVmaW5lZChuKSYmbj09PWUuTExNR2VuZXJhdGVkfWUuaXM9dH0pKEFwfHwoQXA9e30pKTt2YXIgcG47KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixzLGkpe2NvbnN0IG89e3RpdGxlOnJ9O2xldCBhPSEwO3JldHVybiB0eXBlb2Ygcz09InN0cmluZyI/KGE9ITEsby5raW5kPXMpOk1zLmlzKHMpP28uY29tbWFuZD1zOm8uZWRpdD1zLGEmJmkhPT12b2lkIDAmJihvLmtpbmQ9aSksb31lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBzJiZCLnN0cmluZyhzLnRpdGxlKSYmKHMuZGlhZ25vc3RpY3M9PT12b2lkIDB8fEIudHlwZWRBcnJheShzLmRpYWdub3N0aWNzLFB0LmlzKSkmJihzLmtpbmQ9PT12b2lkIDB8fEIuc3RyaW5nKHMua2luZCkpJiYocy5lZGl0IT09dm9pZCAwfHxzLmNvbW1hbmQhPT12b2lkIDApJiYocy5jb21tYW5kPT09dm9pZCAwfHxNcy5pcyhzLmNvbW1hbmQpKSYmKHMuaXNQcmVmZXJyZWQ9PT12b2lkIDB8fEIuYm9vbGVhbihzLmlzUHJlZmVycmVkKSkmJihzLmVkaXQ9PT12b2lkIDB8fERwLmlzKHMuZWRpdCkpJiYocy50YWdzPT09dm9pZCAwfHxCLnR5cGVkQXJyYXkocy50YWdzLEFwLmlzKSl9ZS5pcz1ufSkocG58fChwbj17fSkpO3ZhciB3cDsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLHMpe2NvbnN0IGk9e3JhbmdlOnJ9O3JldHVybiBCLmRlZmluZWQocykmJihpLmRhdGE9cyksaX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBCLmRlZmluZWQocykmJlkuaXMocy5yYW5nZSkmJihCLnVuZGVmaW5lZChzLmNvbW1hbmQpfHxNcy5pcyhzLmNvbW1hbmQpKX1lLmlzPW59KSh3cHx8KHdwPXt9KSk7dmFyIHN5OyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KHIscyl7cmV0dXJue3RhYlNpemU6cixpbnNlcnRTcGFjZXM6c319ZS5jcmVhdGU9dDtmdW5jdGlvbiBuKHIpe2NvbnN0IHM9cjtyZXR1cm4gQi5kZWZpbmVkKHMpJiZCLnVpbnRlZ2VyKHMudGFiU2l6ZSkmJkIuYm9vbGVhbihzLmluc2VydFNwYWNlcyl9ZS5pcz1ufSkoc3l8fChzeT17fSkpO3ZhciBpeTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLHMsaSl7cmV0dXJue3JhbmdlOnIsdGFyZ2V0OnMsZGF0YTppfX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBCLmRlZmluZWQocykmJlkuaXMocy5yYW5nZSkmJihCLnVuZGVmaW5lZChzLnRhcmdldCl8fEIuc3RyaW5nKHMudGFyZ2V0KSl9ZS5pcz1ufSkoaXl8fChpeT17fSkpO3ZhciBybDsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLHMpe3JldHVybntyYW5nZTpyLHBhcmVudDpzfX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBCLm9iamVjdExpdGVyYWwocykmJlkuaXMocy5yYW5nZSkmJihzLnBhcmVudD09PXZvaWQgMHx8ZS5pcyhzLnBhcmVudCkpfWUuaXM9bn0pKHJsfHwocmw9e30pKTt2YXIgb3k7KGZ1bmN0aW9uKGUpe2UubmFtZXNwYWNlPSJuYW1lc3BhY2UiLGUudHlwZT0idHlwZSIsZS5jbGFzcz0iY2xhc3MiLGUuZW51bT0iZW51bSIsZS5pbnRlcmZhY2U9ImludGVyZmFjZSIsZS5zdHJ1Y3Q9InN0cnVjdCIsZS50eXBlUGFyYW1ldGVyPSJ0eXBlUGFyYW1ldGVyIixlLnBhcmFtZXRlcj0icGFyYW1ldGVyIixlLnZhcmlhYmxlPSJ2YXJpYWJsZSIsZS5wcm9wZXJ0eT0icHJvcGVydHkiLGUuZW51bU1lbWJlcj0iZW51bU1lbWJlciIsZS5ldmVudD0iZXZlbnQiLGUuZnVuY3Rpb249ImZ1bmN0aW9uIixlLm1ldGhvZD0ibWV0aG9kIixlLm1hY3JvPSJtYWNybyIsZS5rZXl3b3JkPSJrZXl3b3JkIixlLm1vZGlmaWVyPSJtb2RpZmllciIsZS5jb21tZW50PSJjb21tZW50IixlLnN0cmluZz0ic3RyaW5nIixlLm51bWJlcj0ibnVtYmVyIixlLnJlZ2V4cD0icmVnZXhwIixlLm9wZXJhdG9yPSJvcGVyYXRvciIsZS5kZWNvcmF0b3I9ImRlY29yYXRvciIsZS5sYWJlbD0ibGFiZWwifSkob3l8fChveT17fSkpO3ZhciBheTsoZnVuY3Rpb24oZSl7ZS5kZWNsYXJhdGlvbj0iZGVjbGFyYXRpb24iLGUuZGVmaW5pdGlvbj0iZGVmaW5pdGlvbiIsZS5yZWFkb25seT0icmVhZG9ubHkiLGUuc3RhdGljPSJzdGF0aWMiLGUuZGVwcmVjYXRlZD0iZGVwcmVjYXRlZCIsZS5hYnN0cmFjdD0iYWJzdHJhY3QiLGUuYXN5bmM9ImFzeW5jIixlLm1vZGlmaWNhdGlvbj0ibW9kaWZpY2F0aW9uIixlLmRvY3VtZW50YXRpb249ImRvY3VtZW50YXRpb24iLGUuZGVmYXVsdExpYnJhcnk9ImRlZmF1bHRMaWJyYXJ5In0pKGF5fHwoYXk9e30pKTt2YXIgdXk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobil7Y29uc3Qgcj1uO3JldHVybiBCLm9iamVjdExpdGVyYWwocikmJihyLnJlc3VsdElkPT09dm9pZCAwfHx0eXBlb2Ygci5yZXN1bHRJZD09InN0cmluZyIpJiZBcnJheS5pc0FycmF5KHIuZGF0YSkmJihyLmRhdGEubGVuZ3RoPT09MHx8dHlwZW9mIHIuZGF0YVswXT09Im51bWJlciIpfWUuaXM9dH0pKHV5fHwodXk9e30pKTt2YXIgbHk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixzKXtyZXR1cm57cmFuZ2U6cix0ZXh0OnN9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBzPXI7cmV0dXJuIHMhPW51bGwmJlkuaXMocy5yYW5nZSkmJkIuc3RyaW5nKHMudGV4dCl9ZS5pcz1ufSkobHl8fChseT17fSkpO3ZhciBjeTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChyLHMsaSl7cmV0dXJue3JhbmdlOnIsdmFyaWFibGVOYW1lOnMsY2FzZVNlbnNpdGl2ZUxvb2t1cDppfX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBzIT1udWxsJiZZLmlzKHMucmFuZ2UpJiZCLmJvb2xlYW4ocy5jYXNlU2Vuc2l0aXZlTG9va3VwKSYmKEIuc3RyaW5nKHMudmFyaWFibGVOYW1lKXx8cy52YXJpYWJsZU5hbWU9PT12b2lkIDApfWUuaXM9bn0pKGN5fHwoY3k9e30pKTt2YXIgZnk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixzKXtyZXR1cm57cmFuZ2U6cixleHByZXNzaW9uOnN9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBzPXI7cmV0dXJuIHMhPW51bGwmJlkuaXMocy5yYW5nZSkmJihCLnN0cmluZyhzLmV4cHJlc3Npb24pfHxzLmV4cHJlc3Npb249PT12b2lkIDApfWUuaXM9bn0pKGZ5fHwoZnk9e30pKTt2YXIgcHk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixzKXtyZXR1cm57ZnJhbWVJZDpyLHN0b3BwZWRMb2NhdGlvbjpzfX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBCLmRlZmluZWQocykmJlkuaXMoci5zdG9wcGVkTG9jYXRpb24pfWUuaXM9bn0pKHB5fHwocHk9e30pKTt2YXIgQ3A7KGZ1bmN0aW9uKGUpe2UuVHlwZT0xLGUuUGFyYW1ldGVyPTI7ZnVuY3Rpb24gdChuKXtyZXR1cm4gbj09PTF8fG49PT0yfWUuaXM9dH0pKENwfHwoQ3A9e30pKTt2YXIgU3A7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocil7cmV0dXJue3ZhbHVlOnJ9fWUuY3JlYXRlPXQ7ZnVuY3Rpb24gbihyKXtjb25zdCBzPXI7cmV0dXJuIEIub2JqZWN0TGl0ZXJhbChzKSYmKHMudG9vbHRpcD09PXZvaWQgMHx8Qi5zdHJpbmcocy50b29sdGlwKXx8UnMuaXMocy50b29sdGlwKSkmJihzLmxvY2F0aW9uPT09dm9pZCAwfHxVaS5pcyhzLmxvY2F0aW9uKSkmJihzLmNvbW1hbmQ9PT12b2lkIDB8fE1zLmlzKHMuY29tbWFuZCkpfWUuaXM9bn0pKFNwfHwoU3A9e30pKTt2YXIgaHk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocixzLGkpe2NvbnN0IG89e3Bvc2l0aW9uOnIsbGFiZWw6c307cmV0dXJuIGkhPT12b2lkIDAmJihvLmtpbmQ9aSksb31lLmNyZWF0ZT10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBCLm9iamVjdExpdGVyYWwocykmJnV0LmlzKHMucG9zaXRpb24pJiYoQi5zdHJpbmcocy5sYWJlbCl8fEIudHlwZWRBcnJheShzLmxhYmVsLFNwLmlzKSkmJihzLmtpbmQ9PT12b2lkIDB8fENwLmlzKHMua2luZCkpJiZzLnRleHRFZGl0cz09PXZvaWQgMHx8Qi50eXBlZEFycmF5KHMudGV4dEVkaXRzLERlLmlzKSYmKHMudG9vbHRpcD09PXZvaWQgMHx8Qi5zdHJpbmcocy50b29sdGlwKXx8UnMuaXMocy50b29sdGlwKSkmJihzLnBhZGRpbmdMZWZ0PT09dm9pZCAwfHxCLmJvb2xlYW4ocy5wYWRkaW5nTGVmdCkpJiYocy5wYWRkaW5nUmlnaHQ9PT12b2lkIDB8fEIuYm9vbGVhbihzLnBhZGRpbmdSaWdodCkpfWUuaXM9bn0pKGh5fHwoaHk9e30pKTt2YXIgeHA7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQocil7cmV0dXJue2tpbmQ6InNuaXBwZXQiLHZhbHVlOnJ9fWUuY3JlYXRlU25pcHBldD10O2Z1bmN0aW9uIG4ocil7Y29uc3Qgcz1yO3JldHVybiBCLm9iamVjdExpdGVyYWwocykmJnMua2luZD09PSJzbmlwcGV0IiYmQi5zdHJpbmcocy52YWx1ZSl9ZS5pc1NuaXBwZXQ9bn0pKHhwfHwoeHA9e30pKTt2YXIgZHk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobixyLHMsaSl7cmV0dXJue2luc2VydFRleHQ6bixmaWx0ZXJUZXh0OnIscmFuZ2U6cyxjb21tYW5kOml9fWUuY3JlYXRlPXR9KShkeXx8KGR5PXt9KSk7dmFyIG15OyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4pe3JldHVybntpdGVtczpufX1lLmNyZWF0ZT10fSkobXl8fChteT17fSkpO3ZhciBneTsoZnVuY3Rpb24oZSl7ZS5JbnZva2VkPTEsZS5BdXRvbWF0aWM9Mn0pKGd5fHwoZ3k9e30pKTt2YXIgeXk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQobixyKXtyZXR1cm57cmFuZ2U6bix0ZXh0OnJ9fWUuY3JlYXRlPXR9KSh5eXx8KHl5PXt9KSk7dmFyIER5OyhmdW5jdGlvbihlKXtmdW5jdGlvbiB0KG4scil7cmV0dXJue3RyaWdnZXJLaW5kOm4sc2VsZWN0ZWRDb21wbGV0aW9uSW5mbzpyfX1lLmNyZWF0ZT10fSkoRHl8fChEeT17fSkpO3ZhciBieTsoZnVuY3Rpb24oZSl7ZnVuY3Rpb24gdChuKXtjb25zdCByPW47cmV0dXJuIEIub2JqZWN0TGl0ZXJhbChyKSYmbHAuaXMoci51cmkpJiZCLnN0cmluZyhyLm5hbWUpfWUuaXM9dH0pKGJ5fHwoYnk9e30pKTt2YXIgRXk7KGZ1bmN0aW9uKGUpe2Z1bmN0aW9uIHQoaSxvLGEsdSl7cmV0dXJuIG5ldyBtOShpLG8sYSx1KX1lLmNyZWF0ZT10O2Z1bmN0aW9uIG4oaSl7Y29uc3Qgbz1pO3JldHVybiEhKEIuZGVmaW5lZChvKSYmQi5zdHJpbmcoby51cmkpJiYoQi51bmRlZmluZWQoby5sYW5ndWFnZUlkKXx8Qi5zdHJpbmcoby5sYW5ndWFnZUlkKSkmJkIudWludGVnZXIoby5saW5lQ291bnQpJiZCLmZ1bmMoby5nZXRUZXh0KSYmQi5mdW5jKG8ucG9zaXRpb25BdCkmJkIuZnVuYyhvLm9mZnNldEF0KSl9ZS5pcz1uO2Z1bmN0aW9uIHIoaSxvKXtsZXQgYT1pLmdldFRleHQoKTtjb25zdCB1PXMobywoZixjKT0+e2NvbnN0IHA9Zi5yYW5nZS5zdGFydC5saW5lLWMucmFuZ2Uuc3RhcnQubGluZTtyZXR1cm4gcD09PTA/Zi5yYW5nZS5zdGFydC5jaGFyYWN0ZXItYy5yYW5nZS5zdGFydC5jaGFyYWN0ZXI6cH0pO2xldCBsPWEubGVuZ3RoO2ZvcihsZXQgZj11Lmxlbmd0aC0xO2Y+PTA7Zi0tKXtjb25zdCBjPXVbZl0scD1pLm9mZnNldEF0KGMucmFuZ2Uuc3RhcnQpLGg9aS5vZmZzZXRBdChjLnJhbmdlLmVuZCk7aWYoaDw9bClhPWEuc3Vic3RyaW5nKDAscCkrYy5uZXdUZXh0K2Euc3Vic3RyaW5nKGgsYS5sZW5ndGgpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKCJPdmVybGFwcGluZyBlZGl0Iik7bD1wfXJldHVybiBhfWUuYXBwbHlFZGl0cz1yO2Z1bmN0aW9uIHMoaSxvKXtpZihpLmxlbmd0aDw9MSlyZXR1cm4gaTtjb25zdCBhPWkubGVuZ3RoLzJ8MCx1PWkuc2xpY2UoMCxhKSxsPWkuc2xpY2UoYSk7cyh1LG8pLHMobCxvKTtsZXQgZj0wLGM9MCxwPTA7Zm9yKDtmPHUubGVuZ3RoJiZjPGwubGVuZ3RoOylvKHVbZl0sbFtjXSk8PTA/aVtwKytdPXVbZisrXTppW3ArK109bFtjKytdO2Zvcig7Zjx1Lmxlbmd0aDspaVtwKytdPXVbZisrXTtmb3IoO2M8bC5sZW5ndGg7KWlbcCsrXT1sW2MrK107cmV0dXJuIGl9fSkoRXl8fChFeT17fSkpO2NsYXNzIG05e2NvbnN0cnVjdG9yKHQsbixyLHMpe3RoaXMuX3VyaT10LHRoaXMuX2xhbmd1YWdlSWQ9bix0aGlzLl92ZXJzaW9uPXIsdGhpcy5fY29udGVudD1zLHRoaXMuX2xpbmVPZmZzZXRzPXZvaWQgMH1nZXQgdXJpKCl7cmV0dXJuIHRoaXMuX3VyaX1nZXQgbGFuZ3VhZ2VJZCgpe3JldHVybiB0aGlzLl9sYW5ndWFnZUlkfWdldCB2ZXJzaW9uKCl7cmV0dXJuIHRoaXMuX3ZlcnNpb259Z2V0VGV4dCh0KXtpZih0KXtjb25zdCBuPXRoaXMub2Zmc2V0QXQodC5zdGFydCkscj10aGlzLm9mZnNldEF0KHQuZW5kKTtyZXR1cm4gdGhpcy5fY29udGVudC5zdWJzdHJpbmcobixyKX1yZXR1cm4gdGhpcy5fY29udGVudH11cGRhdGUodCxuKXt0aGlzLl9jb250ZW50PXQudGV4dCx0aGlzLl92ZXJzaW9uPW4sdGhpcy5fbGluZU9mZnNldHM9dm9pZCAwfWdldExpbmVPZmZzZXRzKCl7aWYodGhpcy5fbGluZU9mZnNldHM9PT12b2lkIDApe2NvbnN0IHQ9W10sbj10aGlzLl9jb250ZW50O2xldCByPSEwO2ZvcihsZXQgcz0wO3M8bi5sZW5ndGg7cysrKXtyJiYodC5wdXNoKHMpLHI9ITEpO2NvbnN0IGk9bi5jaGFyQXQocyk7cj1pPT09IlxyInx8aT09PWAKYCxpPT09IlxyIiYmcysxPG4ubGVuZ3RoJiZuLmNoYXJBdChzKzEpPT09YApgJiZzKyt9ciYmbi5sZW5ndGg+MCYmdC5wdXNoKG4ubGVuZ3RoKSx0aGlzLl9saW5lT2Zmc2V0cz10fXJldHVybiB0aGlzLl9saW5lT2Zmc2V0c31wb3NpdGlvbkF0KHQpe3Q9TWF0aC5tYXgoTWF0aC5taW4odCx0aGlzLl9jb250ZW50Lmxlbmd0aCksMCk7Y29uc3Qgbj10aGlzLmdldExpbmVPZmZzZXRzKCk7bGV0IHI9MCxzPW4ubGVuZ3RoO2lmKHM9PT0wKXJldHVybiB1dC5jcmVhdGUoMCx0KTtmb3IoO3I8czspe2NvbnN0IG89TWF0aC5mbG9vcigocitzKS8yKTtuW29dPnQ/cz1vOnI9bysxfWNvbnN0IGk9ci0xO3JldHVybiB1dC5jcmVhdGUoaSx0LW5baV0pfW9mZnNldEF0KHQpe2NvbnN0IG49dGhpcy5nZXRMaW5lT2Zmc2V0cygpO2lmKHQubGluZT49bi5sZW5ndGgpcmV0dXJuIHRoaXMuX2NvbnRlbnQubGVuZ3RoO2lmKHQubGluZTwwKXJldHVybiAwO2NvbnN0IHI9blt0LmxpbmVdLHM9dC5saW5lKzE8bi5sZW5ndGg/blt0LmxpbmUrMV06dGhpcy5fY29udGVudC5sZW5ndGg7cmV0dXJuIE1hdGgubWF4KE1hdGgubWluKHIrdC5jaGFyYWN0ZXIscykscil9Z2V0IGxpbmVDb3VudCgpe3JldHVybiB0aGlzLmdldExpbmVPZmZzZXRzKCkubGVuZ3RofX12YXIgQjsoZnVuY3Rpb24oZSl7Y29uc3QgdD1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO2Z1bmN0aW9uIG4oaCl7cmV0dXJuIHR5cGVvZiBoPCJ1In1lLmRlZmluZWQ9bjtmdW5jdGlvbiByKGgpe3JldHVybiB0eXBlb2YgaD4idSJ9ZS51bmRlZmluZWQ9cjtmdW5jdGlvbiBzKGgpe3JldHVybiBoPT09ITB8fGg9PT0hMX1lLmJvb2xlYW49cztmdW5jdGlvbiBpKGgpe3JldHVybiB0LmNhbGwoaCk9PT0iW29iamVjdCBTdHJpbmddIn1lLnN0cmluZz1pO2Z1bmN0aW9uIG8oaCl7cmV0dXJuIHQuY2FsbChoKT09PSJbb2JqZWN0IE51bWJlcl0ifWUubnVtYmVyPW87ZnVuY3Rpb24gYShoLGQsbSl7cmV0dXJuIHQuY2FsbChoKT09PSJbb2JqZWN0IE51bWJlcl0iJiZkPD1oJiZoPD1tfWUubnVtYmVyUmFuZ2U9YTtmdW5jdGlvbiB1KGgpe3JldHVybiB0LmNhbGwoaCk9PT0iW29iamVjdCBOdW1iZXJdIiYmLTIxNDc0ODM2NDg8PWgmJmg8PTIxNDc0ODM2NDd9ZS5pbnRlZ2VyPXU7ZnVuY3Rpb24gbChoKXtyZXR1cm4gdC5jYWxsKGgpPT09IltvYmplY3QgTnVtYmVyXSImJjA8PWgmJmg8PTIxNDc0ODM2NDd9ZS51aW50ZWdlcj1sO2Z1bmN0aW9uIGYoaCl7cmV0dXJuIHQuY2FsbChoKT09PSJbb2JqZWN0IEZ1bmN0aW9uXSJ9ZS5mdW5jPWY7ZnVuY3Rpb24gYyhoKXtyZXR1cm4gaCE9PW51bGwmJnR5cGVvZiBoPT0ib2JqZWN0In1lLm9iamVjdExpdGVyYWw9YztmdW5jdGlvbiBwKGgsZCl7cmV0dXJuIEFycmF5LmlzQXJyYXkoaCkmJmguZXZlcnkoZCl9ZS50eXBlZEFycmF5PXB9KShCfHwoQj17fSkpO2Z1bmN0aW9uIEooLi4uZSl7Y29uc3QgdD1lWzBdO2xldCBuLHIscztpZih0eXBlb2YgdD09InN0cmluZyIpbj10LHI9dCxlLnNwbGljZSgwLDEpLHM9IWV8fHR5cGVvZiBlWzBdIT0ib2JqZWN0Ij9lOmVbMF07ZWxzZSBpZih0IGluc3RhbmNlb2YgQXJyYXkpe2NvbnN0IGk9ZS5zbGljZSgxKTtpZih0Lmxlbmd0aCE9PWkubGVuZ3RoKzEpdGhyb3cgbmV3IEVycm9yKCJleHBlY3RlZCBhIHN0cmluZyBhcyB0aGUgZmlyc3QgYXJndW1lbnQgdG8gbDEwbi50Iik7bGV0IG89dFswXTtmb3IobGV0IGE9MTthPHQubGVuZ3RoO2ErKylvKz1geyR7YS0xfX1gK3RbYV07cmV0dXJuIEoobywuLi5pKX1lbHNlIHI9dC5tZXNzYWdlLG49cix0LmNvbW1lbnQmJnQuY29tbWVudC5sZW5ndGg+MCYmKG4rPWAvJHtBcnJheS5pc0FycmF5KHQuY29tbWVudCk/dC5jb21tZW50LmpvaW4oIiIpOnQuY29tbWVudH1gKSxzPXQuYXJncz8/e307cmV0dXJuIHk5KHIscyl9dmFyIGc5PS97KFtefV0rKX0vZztmdW5jdGlvbiB5OShlLHQpe3JldHVybiBPYmplY3Qua2V5cyh0KS5sZW5ndGg9PT0wP2U6ZS5yZXBsYWNlKGc5LChuLHIpPT50W3JdPz9uKX1mdW5jdGlvbiBRbihlKXtpZih0eXBlb2YgZSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiUGF0aCBtdXN0IGJlIGEgc3RyaW5nLiBSZWNlaXZlZCAiK0pTT04uc3RyaW5naWZ5KGUpKX1mdW5jdGlvbiB2eShlLHQpe2Zvcih2YXIgbj0iIixyPTAscz0tMSxpPTAsbyxhPTA7YTw9ZS5sZW5ndGg7KythKXtpZihhPGUubGVuZ3RoKW89ZS5jaGFyQ29kZUF0KGEpO2Vsc2V7aWYobz09PTQ3KWJyZWFrO289NDd9aWYobz09PTQ3KXtpZighKHM9PT1hLTF8fGk9PT0xKSlpZihzIT09YS0xJiZpPT09Mil7aWYobi5sZW5ndGg8Mnx8ciE9PTJ8fG4uY2hhckNvZGVBdChuLmxlbmd0aC0xKSE9PTQ2fHxuLmNoYXJDb2RlQXQobi5sZW5ndGgtMikhPT00Nil7aWYobi5sZW5ndGg+Mil7dmFyIHU9bi5sYXN0SW5kZXhPZigiLyIpO2lmKHUhPT1uLmxlbmd0aC0xKXt1PT09LTE/KG49IiIscj0wKToobj1uLnNsaWNlKDAsdSkscj1uLmxlbmd0aC0xLW4ubGFzdEluZGV4T2YoIi8iKSkscz1hLGk9MDtjb250aW51ZX19ZWxzZSBpZihuLmxlbmd0aD09PTJ8fG4ubGVuZ3RoPT09MSl7bj0iIixyPTAscz1hLGk9MDtjb250aW51ZX19dCYmKG4ubGVuZ3RoPjA/bis9Ii8uLiI6bj0iLi4iLHI9Mil9ZWxzZSBuLmxlbmd0aD4wP24rPSIvIitlLnNsaWNlKHMrMSxhKTpuPWUuc2xpY2UocysxLGEpLHI9YS1zLTE7cz1hLGk9MH1lbHNlIG89PT00NiYmaSE9PS0xPysraTppPS0xfXJldHVybiBufWZ1bmN0aW9uIEQ5KGUsdCl7dmFyIG49dC5kaXJ8fHQucm9vdCxyPXQuYmFzZXx8KHQubmFtZXx8IiIpKyh0LmV4dHx8IiIpO3JldHVybiBuP249PT10LnJvb3Q/bityOm4rZStyOnJ9dmFyIHFpPXtyZXNvbHZlOmZ1bmN0aW9uKCl7Zm9yKHZhciB0PSIiLG49ITEscixzPWFyZ3VtZW50cy5sZW5ndGgtMTtzPj0tMSYmIW47cy0tKXt2YXIgaTtzPj0wP2k9YXJndW1lbnRzW3NdOihyPT09dm9pZCAwJiYocj1wcm9jZXNzLmN3ZCgpKSxpPXIpLFFuKGkpLGkubGVuZ3RoIT09MCYmKHQ9aSsiLyIrdCxuPWkuY2hhckNvZGVBdCgwKT09PTQ3KX1yZXR1cm4gdD12eSh0LCFuKSxuP3QubGVuZ3RoPjA/Ii8iK3Q6Ii8iOnQubGVuZ3RoPjA/dDoiLiJ9LG5vcm1hbGl6ZTpmdW5jdGlvbih0KXtpZihRbih0KSx0Lmxlbmd0aD09PTApcmV0dXJuIi4iO3ZhciBuPXQuY2hhckNvZGVBdCgwKT09PTQ3LHI9dC5jaGFyQ29kZUF0KHQubGVuZ3RoLTEpPT09NDc7cmV0dXJuIHQ9dnkodCwhbiksdC5sZW5ndGg9PT0wJiYhbiYmKHQ9Ii4iKSx0Lmxlbmd0aD4wJiZyJiYodCs9Ii8iKSxuPyIvIit0OnR9LGlzQWJzb2x1dGU6ZnVuY3Rpb24odCl7cmV0dXJuIFFuKHQpLHQubGVuZ3RoPjAmJnQuY2hhckNvZGVBdCgwKT09PTQ3fSxqb2luOmZ1bmN0aW9uKCl7aWYoYXJndW1lbnRzLmxlbmd0aD09PTApcmV0dXJuIi4iO2Zvcih2YXIgdCxuPTA7bjxhcmd1bWVudHMubGVuZ3RoOysrbil7dmFyIHI9YXJndW1lbnRzW25dO1FuKHIpLHIubGVuZ3RoPjAmJih0PT09dm9pZCAwP3Q9cjp0Kz0iLyIrcil9cmV0dXJuIHQ9PT12b2lkIDA/Ii4iOnFpLm5vcm1hbGl6ZSh0KX0scmVsYXRpdmU6ZnVuY3Rpb24odCxuKXtpZihRbih0KSxRbihuKSx0PT09bnx8KHQ9cWkucmVzb2x2ZSh0KSxuPXFpLnJlc29sdmUobiksdD09PW4pKXJldHVybiIiO2Zvcih2YXIgcj0xO3I8dC5sZW5ndGgmJnQuY2hhckNvZGVBdChyKT09PTQ3Oysrcik7Zm9yKHZhciBzPXQubGVuZ3RoLGk9cy1yLG89MTtvPG4ubGVuZ3RoJiZuLmNoYXJDb2RlQXQobyk9PT00NzsrK28pO2Zvcih2YXIgYT1uLmxlbmd0aCx1PWEtbyxsPWk8dT9pOnUsZj0tMSxjPTA7Yzw9bDsrK2Mpe2lmKGM9PT1sKXtpZih1Pmwpe2lmKG4uY2hhckNvZGVBdChvK2MpPT09NDcpcmV0dXJuIG4uc2xpY2UobytjKzEpO2lmKGM9PT0wKXJldHVybiBuLnNsaWNlKG8rYyl9ZWxzZSBpPmwmJih0LmNoYXJDb2RlQXQocitjKT09PTQ3P2Y9YzpjPT09MCYmKGY9MCkpO2JyZWFrfXZhciBwPXQuY2hhckNvZGVBdChyK2MpLGg9bi5jaGFyQ29kZUF0KG8rYyk7aWYocCE9PWgpYnJlYWs7cD09PTQ3JiYoZj1jKX12YXIgZD0iIjtmb3IoYz1yK2YrMTtjPD1zOysrYykoYz09PXN8fHQuY2hhckNvZGVBdChjKT09PTQ3KSYmKGQubGVuZ3RoPT09MD9kKz0iLi4iOmQrPSIvLi4iKTtyZXR1cm4gZC5sZW5ndGg+MD9kK24uc2xpY2UobytmKToobys9ZixuLmNoYXJDb2RlQXQobyk9PT00NyYmKytvLG4uc2xpY2UobykpfSxfbWFrZUxvbmc6ZnVuY3Rpb24odCl7cmV0dXJuIHR9LGRpcm5hbWU6ZnVuY3Rpb24odCl7aWYoUW4odCksdC5sZW5ndGg9PT0wKXJldHVybiIuIjtmb3IodmFyIG49dC5jaGFyQ29kZUF0KDApLHI9bj09PTQ3LHM9LTEsaT0hMCxvPXQubGVuZ3RoLTE7bz49MTstLW8paWYobj10LmNoYXJDb2RlQXQobyksbj09PTQ3KXtpZighaSl7cz1vO2JyZWFrfX1lbHNlIGk9ITE7cmV0dXJuIHM9PT0tMT9yPyIvIjoiLiI6ciYmcz09PTE/Ii8vIjp0LnNsaWNlKDAscyl9LGJhc2VuYW1lOmZ1bmN0aW9uKHQsbil7aWYobiE9PXZvaWQgMCYmdHlwZW9mIG4hPSJzdHJpbmciKXRocm93IG5ldyBUeXBlRXJyb3IoJyJleHQiIGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnKTtRbih0KTt2YXIgcj0wLHM9LTEsaT0hMCxvO2lmKG4hPT12b2lkIDAmJm4ubGVuZ3RoPjAmJm4ubGVuZ3RoPD10Lmxlbmd0aCl7aWYobi5sZW5ndGg9PT10Lmxlbmd0aCYmbj09PXQpcmV0dXJuIiI7dmFyIGE9bi5sZW5ndGgtMSx1PS0xO2ZvcihvPXQubGVuZ3RoLTE7bz49MDstLW8pe3ZhciBsPXQuY2hhckNvZGVBdChvKTtpZihsPT09NDcpe2lmKCFpKXtyPW8rMTticmVha319ZWxzZSB1PT09LTEmJihpPSExLHU9bysxKSxhPj0wJiYobD09PW4uY2hhckNvZGVBdChhKT8tLWE9PT0tMSYmKHM9byk6KGE9LTEscz11KSl9cmV0dXJuIHI9PT1zP3M9dTpzPT09LTEmJihzPXQubGVuZ3RoKSx0LnNsaWNlKHIscyl9ZWxzZXtmb3Iobz10Lmxlbmd0aC0xO28+PTA7LS1vKWlmKHQuY2hhckNvZGVBdChvKT09PTQ3KXtpZighaSl7cj1vKzE7YnJlYWt9fWVsc2Ugcz09PS0xJiYoaT0hMSxzPW8rMSk7cmV0dXJuIHM9PT0tMT8iIjp0LnNsaWNlKHIscyl9fSxleHRuYW1lOmZ1bmN0aW9uKHQpe1FuKHQpO2Zvcih2YXIgbj0tMSxyPTAscz0tMSxpPSEwLG89MCxhPXQubGVuZ3RoLTE7YT49MDstLWEpe3ZhciB1PXQuY2hhckNvZGVBdChhKTtpZih1PT09NDcpe2lmKCFpKXtyPWErMTticmVha31jb250aW51ZX1zPT09LTEmJihpPSExLHM9YSsxKSx1PT09NDY/bj09PS0xP249YTpvIT09MSYmKG89MSk6biE9PS0xJiYobz0tMSl9cmV0dXJuIG49PT0tMXx8cz09PS0xfHxvPT09MHx8bz09PTEmJm49PT1zLTEmJm49PT1yKzE/IiI6dC5zbGljZShuLHMpfSxmb3JtYXQ6ZnVuY3Rpb24odCl7aWYodD09PW51bGx8fHR5cGVvZiB0IT0ib2JqZWN0Iil0aHJvdyBuZXcgVHlwZUVycm9yKCdUaGUgInBhdGhPYmplY3QiIGFyZ3VtZW50IG11c3QgYmUgb2YgdHlwZSBPYmplY3QuIFJlY2VpdmVkIHR5cGUgJyt0eXBlb2YgdCk7cmV0dXJuIEQ5KCIvIix0KX0scGFyc2U6ZnVuY3Rpb24odCl7UW4odCk7dmFyIG49e3Jvb3Q6IiIsZGlyOiIiLGJhc2U6IiIsZXh0OiIiLG5hbWU6IiJ9O2lmKHQubGVuZ3RoPT09MClyZXR1cm4gbjt2YXIgcj10LmNoYXJDb2RlQXQoMCkscz1yPT09NDcsaTtzPyhuLnJvb3Q9Ii8iLGk9MSk6aT0wO2Zvcih2YXIgbz0tMSxhPTAsdT0tMSxsPSEwLGY9dC5sZW5ndGgtMSxjPTA7Zj49aTstLWYpe2lmKHI9dC5jaGFyQ29kZUF0KGYpLHI9PT00Nyl7aWYoIWwpe2E9ZisxO2JyZWFrfWNvbnRpbnVlfXU9PT0tMSYmKGw9ITEsdT1mKzEpLHI9PT00Nj9vPT09LTE/bz1mOmMhPT0xJiYoYz0xKTpvIT09LTEmJihjPS0xKX1yZXR1cm4gbz09PS0xfHx1PT09LTF8fGM9PT0wfHxjPT09MSYmbz09PXUtMSYmbz09PWErMT91IT09LTEmJihhPT09MCYmcz9uLmJhc2U9bi5uYW1lPXQuc2xpY2UoMSx1KTpuLmJhc2U9bi5uYW1lPXQuc2xpY2UoYSx1KSk6KGE9PT0wJiZzPyhuLm5hbWU9dC5zbGljZSgxLG8pLG4uYmFzZT10LnNsaWNlKDEsdSkpOihuLm5hbWU9dC5zbGljZShhLG8pLG4uYmFzZT10LnNsaWNlKGEsdSkpLG4uZXh0PXQuc2xpY2Uobyx1KSksYT4wP24uZGlyPXQuc2xpY2UoMCxhLTEpOnMmJihuLmRpcj0iLyIpLG59LHNlcDoiLyIsZGVsaW1pdGVyOiI6Iix3aW4zMjpudWxsLHBvc2l4Om51bGx9O3FpLnBvc2l4PXFpO3ZhciBabj1xaTtjb25zdCBrcD1TeW1ib2wuZm9yKCJ5YW1sLmFsaWFzIiksVHA9U3ltYm9sLmZvcigieWFtbC5kb2N1bWVudCIpLG9zPVN5bWJvbC5mb3IoInlhbWwubWFwIiksRnk9U3ltYm9sLmZvcigieWFtbC5wYWlyIiksZXI9U3ltYm9sLmZvcigieWFtbC5zY2FsYXIiKSxXaT1TeW1ib2wuZm9yKCJ5YW1sLnNlcSIpLGhuPVN5bWJvbC5mb3IoInlhbWwubm9kZS50eXBlIiksT3Q9ZT0+ISFlJiZ0eXBlb2YgZT09Im9iamVjdCImJmVbaG5dPT09a3AsSGk9ZT0+ISFlJiZ0eXBlb2YgZT09Im9iamVjdCImJmVbaG5dPT09VHAsemU9ZT0+ISFlJiZ0eXBlb2YgZT09Im9iamVjdCImJmVbaG5dPT09b3MseWU9ZT0+ISFlJiZ0eXBlb2YgZT09Im9iamVjdCImJmVbaG5dPT09RnksWj1lPT4hIWUmJnR5cGVvZiBlPT0ib2JqZWN0IiYmZVtobl09PT1lcixSZT1lPT4hIWUmJnR5cGVvZiBlPT0ib2JqZWN0IiYmZVtobl09PT1XaTtmdW5jdGlvbiBJZShlKXtpZihlJiZ0eXBlb2YgZT09Im9iamVjdCIpc3dpdGNoKGVbaG5dKXtjYXNlIG9zOmNhc2UgV2k6cmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gZ2UoZSl7aWYoZSYmdHlwZW9mIGU9PSJvYmplY3QiKXN3aXRjaChlW2huXSl7Y2FzZSBrcDpjYXNlIG9zOmNhc2UgZXI6Y2FzZSBXaTpyZXR1cm4hMH1yZXR1cm4hMX1jb25zdCBBeT1lPT4oWihlKXx8SWUoZSkpJiYhIWUuYW5jaG9yLGpzPVN5bWJvbCgiYnJlYWsgdmlzaXQiKSxiOT1TeW1ib2woInNraXAgY2hpbGRyZW4iKSxoYT1TeW1ib2woInJlbW92ZSBub2RlIik7ZnVuY3Rpb24gYmUoZSx0KXtjb25zdCBuPUU5KHQpO0hpKGUpP0ppKG51bGwsZS5jb250ZW50cyxuLE9iamVjdC5mcmVlemUoW2VdKSk9PT1oYSYmKGUuY29udGVudHM9bnVsbCk6SmkobnVsbCxlLG4sT2JqZWN0LmZyZWV6ZShbXSkpfWJlLkJSRUFLPWpzLGJlLlNLSVA9YjksYmUuUkVNT1ZFPWhhO2Z1bmN0aW9uIEppKGUsdCxuLHIpe2NvbnN0IHM9djkoZSx0LG4scik7aWYoZ2Uocyl8fHllKHMpKXJldHVybiBGOShlLHIscyksSmkoZSxzLG4scik7aWYodHlwZW9mIHMhPSJzeW1ib2wiKXtpZihJZSh0KSl7cj1PYmplY3QuZnJlZXplKHIuY29uY2F0KHQpKTtmb3IobGV0IGk9MDtpPHQuaXRlbXMubGVuZ3RoOysraSl7Y29uc3Qgbz1KaShpLHQuaXRlbXNbaV0sbixyKTtpZih0eXBlb2Ygbz09Im51bWJlciIpaT1vLTE7ZWxzZXtpZihvPT09anMpcmV0dXJuIGpzO289PT1oYSYmKHQuaXRlbXMuc3BsaWNlKGksMSksaS09MSl9fX1lbHNlIGlmKHllKHQpKXtyPU9iamVjdC5mcmVlemUoci5jb25jYXQodCkpO2NvbnN0IGk9SmkoImtleSIsdC5rZXksbixyKTtpZihpPT09anMpcmV0dXJuIGpzO2k9PT1oYSYmKHQua2V5PW51bGwpO2NvbnN0IG89SmkoInZhbHVlIix0LnZhbHVlLG4scik7aWYobz09PWpzKXJldHVybiBqcztvPT09aGEmJih0LnZhbHVlPW51bGwpfX1yZXR1cm4gc31mdW5jdGlvbiBFOShlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiYoZS5Db2xsZWN0aW9ufHxlLk5vZGV8fGUuVmFsdWUpP09iamVjdC5hc3NpZ24oe0FsaWFzOmUuTm9kZSxNYXA6ZS5Ob2RlLFNjYWxhcjplLk5vZGUsU2VxOmUuTm9kZX0sZS5WYWx1ZSYme01hcDplLlZhbHVlLFNjYWxhcjplLlZhbHVlLFNlcTplLlZhbHVlfSxlLkNvbGxlY3Rpb24mJntNYXA6ZS5Db2xsZWN0aW9uLFNlcTplLkNvbGxlY3Rpb259LGUpOmV9ZnVuY3Rpb24gdjkoZSx0LG4scil7dmFyIHMsaSxvLGEsdTtpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIilyZXR1cm4gbihlLHQscik7aWYoemUodCkpcmV0dXJuKHM9bi5NYXApPT1udWxsP3ZvaWQgMDpzLmNhbGwobixlLHQscik7aWYoUmUodCkpcmV0dXJuKGk9bi5TZXEpPT1udWxsP3ZvaWQgMDppLmNhbGwobixlLHQscik7aWYoeWUodCkpcmV0dXJuKG89bi5QYWlyKT09bnVsbD92b2lkIDA6by5jYWxsKG4sZSx0LHIpO2lmKFoodCkpcmV0dXJuKGE9bi5TY2FsYXIpPT1udWxsP3ZvaWQgMDphLmNhbGwobixlLHQscik7aWYoT3QodCkpcmV0dXJuKHU9bi5BbGlhcyk9PW51bGw/dm9pZCAwOnUuY2FsbChuLGUsdCxyKX1mdW5jdGlvbiBGOShlLHQsbil7Y29uc3Qgcj10W3QubGVuZ3RoLTFdO2lmKEllKHIpKXIuaXRlbXNbZV09bjtlbHNlIGlmKHllKHIpKWU9PT0ia2V5Ij9yLmtleT1uOnIudmFsdWU9bjtlbHNlIGlmKEhpKHIpKXIuY29udGVudHM9bjtlbHNle2NvbnN0IHM9T3Qocik/ImFsaWFzIjoic2NhbGFyIjt0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXBsYWNlIG5vZGUgd2l0aCAke3N9IHBhcmVudGApfX1jb25zdCBBOT17IiEiOiIlMjEiLCIsIjoiJTJDIiwiWyI6IiU1QiIsIl0iOiIlNUQiLCJ7IjoiJTdCIiwifSI6IiU3RCJ9LHc5PWU9PmUucmVwbGFjZSgvWyEsW1xde31dL2csdD0+QTlbdF0pO2NsYXNzIEN0e2NvbnN0cnVjdG9yKHQsbil7dGhpcy5kb2NTdGFydD1udWxsLHRoaXMuZG9jRW5kPSExLHRoaXMueWFtbD1PYmplY3QuYXNzaWduKHt9LEN0LmRlZmF1bHRZYW1sLHQpLHRoaXMudGFncz1PYmplY3QuYXNzaWduKHt9LEN0LmRlZmF1bHRUYWdzLG4pfWNsb25lKCl7Y29uc3QgdD1uZXcgQ3QodGhpcy55YW1sLHRoaXMudGFncyk7cmV0dXJuIHQuZG9jU3RhcnQ9dGhpcy5kb2NTdGFydCx0fWF0RG9jdW1lbnQoKXtjb25zdCB0PW5ldyBDdCh0aGlzLnlhbWwsdGhpcy50YWdzKTtzd2l0Y2godGhpcy55YW1sLnZlcnNpb24pe2Nhc2UiMS4xIjp0aGlzLmF0TmV4dERvY3VtZW50PSEwO2JyZWFrO2Nhc2UiMS4yIjp0aGlzLmF0TmV4dERvY3VtZW50PSExLHRoaXMueWFtbD17ZXhwbGljaXQ6Q3QuZGVmYXVsdFlhbWwuZXhwbGljaXQsdmVyc2lvbjoiMS4yIn0sdGhpcy50YWdzPU9iamVjdC5hc3NpZ24oe30sQ3QuZGVmYXVsdFRhZ3MpO2JyZWFrfXJldHVybiB0fWFkZCh0LG4pe3RoaXMuYXROZXh0RG9jdW1lbnQmJih0aGlzLnlhbWw9e2V4cGxpY2l0OkN0LmRlZmF1bHRZYW1sLmV4cGxpY2l0LHZlcnNpb246IjEuMSJ9LHRoaXMudGFncz1PYmplY3QuYXNzaWduKHt9LEN0LmRlZmF1bHRUYWdzKSx0aGlzLmF0TmV4dERvY3VtZW50PSExKTtjb25zdCByPXQudHJpbSgpLnNwbGl0KC9bIFx0XSsvKSxzPXIuc2hpZnQoKTtzd2l0Y2gocyl7Y2FzZSIlVEFHIjp7aWYoci5sZW5ndGghPT0yJiYobigwLCIlVEFHIGRpcmVjdGl2ZSBzaG91bGQgY29udGFpbiBleGFjdGx5IHR3byBwYXJ0cyIpLHIubGVuZ3RoPDIpKXJldHVybiExO2NvbnN0W2ksb109cjtyZXR1cm4gdGhpcy50YWdzW2ldPW8sITB9Y2FzZSIlWUFNTCI6e2lmKHRoaXMueWFtbC5leHBsaWNpdD0hMCxyLmxlbmd0aCE9PTEpcmV0dXJuIG4oMCwiJVlBTUwgZGlyZWN0aXZlIHNob3VsZCBjb250YWluIGV4YWN0bHkgb25lIHBhcnQiKSwhMTtjb25zdFtpXT1yO2lmKGk9PT0iMS4xInx8aT09PSIxLjIiKXJldHVybiB0aGlzLnlhbWwudmVyc2lvbj1pLCEwO3tjb25zdCBvPS9eXGQrXC5cZCskLy50ZXN0KGkpO3JldHVybiBuKDYsYFVuc3VwcG9ydGVkIFlBTUwgdmVyc2lvbiAke2l9YCxvKSwhMX19ZGVmYXVsdDpyZXR1cm4gbigwLGBVbmtub3duIGRpcmVjdGl2ZSAke3N9YCwhMCksITF9fXRhZ05hbWUodCxuKXtpZih0PT09IiEiKXJldHVybiIhIjtpZih0WzBdIT09IiEiKXJldHVybiBuKGBOb3QgYSB2YWxpZCB0YWc6ICR7dH1gKSxudWxsO2lmKHRbMV09PT0iPCIpe2NvbnN0IG89dC5zbGljZSgyLC0xKTtyZXR1cm4gbz09PSIhInx8bz09PSIhISI/KG4oYFZlcmJhdGltIHRhZ3MgYXJlbid0IHJlc29sdmVkLCBzbyAke3R9IGlzIGludmFsaWQuYCksbnVsbCk6KHRbdC5sZW5ndGgtMV0hPT0iPiImJm4oIlZlcmJhdGltIHRhZ3MgbXVzdCBlbmQgd2l0aCBhID4iKSxvKX1jb25zdFsscixzXT10Lm1hdGNoKC9eKC4qISkoW14hXSopJC9zKTtzfHxuKGBUaGUgJHt0fSB0YWcgaGFzIG5vIHN1ZmZpeGApO2NvbnN0IGk9dGhpcy50YWdzW3JdO2lmKGkpdHJ5e3JldHVybiBpK2RlY29kZVVSSUNvbXBvbmVudChzKX1jYXRjaChvKXtyZXR1cm4gbihTdHJpbmcobykpLG51bGx9cmV0dXJuIHI9PT0iISI/dDoobihgQ291bGQgbm90IHJlc29sdmUgdGFnOiAke3R9YCksbnVsbCl9dGFnU3RyaW5nKHQpe2Zvcihjb25zdFtuLHJdb2YgT2JqZWN0LmVudHJpZXModGhpcy50YWdzKSlpZih0LnN0YXJ0c1dpdGgocikpcmV0dXJuIG4rdzkodC5zdWJzdHJpbmcoci5sZW5ndGgpKTtyZXR1cm4gdFswXT09PSIhIj90OmAhPCR7dH0+YH10b1N0cmluZyh0KXtjb25zdCBuPXRoaXMueWFtbC5leHBsaWNpdD9bYCVZQU1MICR7dGhpcy55YW1sLnZlcnNpb258fCIxLjIifWBdOltdLHI9T2JqZWN0LmVudHJpZXModGhpcy50YWdzKTtsZXQgcztpZih0JiZyLmxlbmd0aD4wJiZnZSh0LmNvbnRlbnRzKSl7Y29uc3QgaT17fTtiZSh0LmNvbnRlbnRzLChvLGEpPT57Z2UoYSkmJmEudGFnJiYoaVthLnRhZ109ITApfSkscz1PYmplY3Qua2V5cyhpKX1lbHNlIHM9W107Zm9yKGNvbnN0W2ksb11vZiByKWk9PT0iISEiJiZvPT09InRhZzp5YW1sLm9yZywyMDAyOiJ8fCghdHx8cy5zb21lKGE9PmEuc3RhcnRzV2l0aChvKSkpJiZuLnB1c2goYCVUQUcgJHtpfSAke299YCk7cmV0dXJuIG4uam9pbihgCmApfX1DdC5kZWZhdWx0WWFtbD17ZXhwbGljaXQ6ITEsdmVyc2lvbjoiMS4yIn0sQ3QuZGVmYXVsdFRhZ3M9eyIhISI6InRhZzp5YW1sLm9yZywyMDAyOiJ9O2Z1bmN0aW9uIHd5KGUpe2lmKC9bXHgwMC1ceDE5XHMsW1xde31dLy50ZXN0KGUpKXtjb25zdCBuPWBBbmNob3IgbXVzdCBub3QgY29udGFpbiB3aGl0ZXNwYWNlIG9yIGNvbnRyb2wgY2hhcmFjdGVyczogJHtKU09OLnN0cmluZ2lmeShlKX1gO3Rocm93IG5ldyBFcnJvcihuKX1yZXR1cm4hMH1mdW5jdGlvbiBDeShlKXtjb25zdCB0PW5ldyBTZXQ7cmV0dXJuIGJlKGUse1ZhbHVlKG4scil7ci5hbmNob3ImJnQuYWRkKHIuYW5jaG9yKX19KSx0fWZ1bmN0aW9uIFN5KGUsdCl7Zm9yKGxldCBuPTE7Oysrbil7Y29uc3Qgcj1gJHtlfSR7bn1gO2lmKCF0LmhhcyhyKSlyZXR1cm4gcn19ZnVuY3Rpb24gQzkoZSx0KXtjb25zdCBuPVtdLHI9bmV3IE1hcDtsZXQgcz1udWxsO3JldHVybntvbkFuY2hvcjppPT57bi5wdXNoKGkpLHM/PyhzPUN5KGUpKTtjb25zdCBvPVN5KHQscyk7cmV0dXJuIHMuYWRkKG8pLG99LHNldEFuY2hvcnM6KCk9Pntmb3IoY29uc3QgaSBvZiBuKXtjb25zdCBvPXIuZ2V0KGkpO2lmKHR5cGVvZiBvPT0ib2JqZWN0IiYmby5hbmNob3ImJihaKG8ubm9kZSl8fEllKG8ubm9kZSkpKW8ubm9kZS5hbmNob3I9by5hbmNob3I7ZWxzZXtjb25zdCBhPW5ldyBFcnJvcigiRmFpbGVkIHRvIHJlc29sdmUgcmVwZWF0ZWQgb2JqZWN0ICh0aGlzIHNob3VsZCBub3QgaGFwcGVuKSIpO3Rocm93IGEuc291cmNlPWksYX19fSxzb3VyY2VPYmplY3RzOnJ9fWZ1bmN0aW9uIHppKGUsdCxuLHIpe2lmKHImJnR5cGVvZiByPT0ib2JqZWN0IilpZihBcnJheS5pc0FycmF5KHIpKWZvcihsZXQgcz0wLGk9ci5sZW5ndGg7czxpOysrcyl7Y29uc3Qgbz1yW3NdLGE9emkoZSxyLFN0cmluZyhzKSxvKTthPT09dm9pZCAwP2RlbGV0ZSByW3NdOmEhPT1vJiYocltzXT1hKX1lbHNlIGlmKHIgaW5zdGFuY2VvZiBNYXApZm9yKGNvbnN0IHMgb2YgQXJyYXkuZnJvbShyLmtleXMoKSkpe2NvbnN0IGk9ci5nZXQocyksbz16aShlLHIscyxpKTtvPT09dm9pZCAwP3IuZGVsZXRlKHMpOm8hPT1pJiZyLnNldChzLG8pfWVsc2UgaWYociBpbnN0YW5jZW9mIFNldClmb3IoY29uc3QgcyBvZiBBcnJheS5mcm9tKHIpKXtjb25zdCBpPXppKGUscixzLHMpO2k9PT12b2lkIDA/ci5kZWxldGUocyk6aSE9PXMmJihyLmRlbGV0ZShzKSxyLmFkZChpKSl9ZWxzZSBmb3IoY29uc3RbcyxpXW9mIE9iamVjdC5lbnRyaWVzKHIpKXtjb25zdCBvPXppKGUscixzLGkpO289PT12b2lkIDA/ZGVsZXRlIHJbc106byE9PWkmJihyW3NdPW8pfXJldHVybiBlLmNhbGwodCxuLHIpfWZ1bmN0aW9uIGRuKGUsdCxuKXtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBlLm1hcCgocixzKT0+ZG4ocixTdHJpbmcocyksbikpO2lmKGUmJnR5cGVvZiBlLnRvSlNPTj09ImZ1bmN0aW9uIil7aWYoIW58fCFBeShlKSlyZXR1cm4gZS50b0pTT04odCxuKTtjb25zdCByPXthbGlhc0NvdW50OjAsY291bnQ6MSxyZXM6dm9pZCAwfTtuLmFuY2hvcnMuc2V0KGUsciksbi5vbkNyZWF0ZT1pPT57ci5yZXM9aSxkZWxldGUgbi5vbkNyZWF0ZX07Y29uc3Qgcz1lLnRvSlNPTih0LG4pO3JldHVybiBuLm9uQ3JlYXRlJiZuLm9uQ3JlYXRlKHMpLHN9cmV0dXJuIHR5cGVvZiBlPT0iYmlnaW50IiYmIShuIT1udWxsJiZuLmtlZXApP051bWJlcihlKTplfWNsYXNzIE5we2NvbnN0cnVjdG9yKHQpe09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGhuLHt2YWx1ZTp0fSl9Y2xvbmUoKXtjb25zdCB0PU9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHRoaXMpKTtyZXR1cm4gdGhpcy5yYW5nZSYmKHQucmFuZ2U9dGhpcy5yYW5nZS5zbGljZSgpKSx0fXRvSlModCx7bWFwQXNNYXA6bixtYXhBbGlhc0NvdW50OnIsb25BbmNob3I6cyxyZXZpdmVyOml9PXt9KXtpZighSGkodCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQSBkb2N1bWVudCBhcmd1bWVudCBpcyByZXF1aXJlZCIpO2NvbnN0IG89e2FuY2hvcnM6bmV3IE1hcCxkb2M6dCxrZWVwOiEwLG1hcEFzTWFwOm49PT0hMCxtYXBLZXlXYXJuZWQ6ITEsbWF4QWxpYXNDb3VudDp0eXBlb2Ygcj09Im51bWJlciI/cjoxMDB9LGE9ZG4odGhpcywiIixvKTtpZih0eXBlb2Ygcz09ImZ1bmN0aW9uIilmb3IoY29uc3R7Y291bnQ6dSxyZXM6bH1vZiBvLmFuY2hvcnMudmFsdWVzKCkpcyhsLHUpO3JldHVybiB0eXBlb2YgaT09ImZ1bmN0aW9uIj96aShpLHsiIjphfSwiIixhKTphfX1jbGFzcyBMcCBleHRlbmRzIE5we2NvbnN0cnVjdG9yKHQpe3N1cGVyKGtwKSx0aGlzLnNvdXJjZT10LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ0YWciLHtzZXQoKXt0aHJvdyBuZXcgRXJyb3IoIkFsaWFzIG5vZGVzIGNhbm5vdCBoYXZlIHRhZ3MiKX19KX1yZXNvbHZlKHQsbil7aWYoKG49PW51bGw/dm9pZCAwOm4ubWF4QWxpYXNDb3VudCk9PT0wKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigiQWxpYXMgcmVzb2x1dGlvbiBpcyBkaXNhYmxlZCIpO2xldCByO24hPW51bGwmJm4uYWxpYXNSZXNvbHZlQ2FjaGU/cj1uLmFsaWFzUmVzb2x2ZUNhY2hlOihyPVtdLGJlKHQse05vZGU6KGksbyk9PnsoT3Qobyl8fEF5KG8pKSYmci5wdXNoKG8pfX0pLG4mJihuLmFsaWFzUmVzb2x2ZUNhY2hlPXIpKTtsZXQgcztmb3IoY29uc3QgaSBvZiByKXtpZihpPT09dGhpcylicmVhaztpLmFuY2hvcj09PXRoaXMuc291cmNlJiYocz1pKX1pZihzJiZuKXtjb25zdHthbmNob3JzOmksZG9jOm8sbWF4QWxpYXNDb3VudDphfT1uO2xldCB1PWkuZ2V0KHMpO2lmKHV8fChkbihzLG51bGwsbiksdT1pLmdldChzKSksKHU9PW51bGw/dm9pZCAwOnUucmVzKT09PXZvaWQgMCl7Y29uc3QgbD0iVGhpcyBzaG91bGQgbm90IGhhcHBlbjogQWxpYXMgYW5jaG9yIHdhcyBub3QgcmVzb2x2ZWQ/Ijt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IobCl9aWYoYT49MCYmKHUuY291bnQrPTEsdS5hbGlhc0NvdW50PT09MCYmKHUuYWxpYXNDb3VudD1zbChvLHMsaSkpLHUuY291bnQqdS5hbGlhc0NvdW50PmEpKXtjb25zdCBsPSJFeGNlc3NpdmUgYWxpYXMgY291bnQgaW5kaWNhdGVzIGEgcmVzb3VyY2UgZXhoYXVzdGlvbiBhdHRhY2siO3Rocm93IG5ldyBSZWZlcmVuY2VFcnJvcihsKX19cmV0dXJuIHN9dG9KU09OKHQsbil7aWYoIW4pcmV0dXJue3NvdXJjZTp0aGlzLnNvdXJjZX07Y29uc3Qgcj10aGlzLnJlc29sdmUobi5kb2Msbik7aWYoIXIpe2NvbnN0IHM9YFVucmVzb2x2ZWQgYWxpYXMgKHRoZSBhbmNob3IgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBhbGlhcyk6ICR7dGhpcy5zb3VyY2V9YDt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3Iocyl9cmV0dXJuIG4uYW5jaG9ycy5nZXQocikucmVzfXRvU3RyaW5nKHQsbixyKXtjb25zdCBzPWAqJHt0aGlzLnNvdXJjZX1gO2lmKHQpe2lmKHd5KHRoaXMuc291cmNlKSx0Lm9wdGlvbnMudmVyaWZ5QWxpYXNPcmRlciYmIXQuYW5jaG9ycy5oYXModGhpcy5zb3VyY2UpKXtjb25zdCBpPWBVbnJlc29sdmVkIGFsaWFzICh0aGUgYW5jaG9yIG11c3QgYmUgc2V0IGJlZm9yZSB0aGUgYWxpYXMpOiAke3RoaXMuc291cmNlfWA7dGhyb3cgbmV3IEVycm9yKGkpfWlmKHQuaW1wbGljaXRLZXkpcmV0dXJuYCR7c30gYH1yZXR1cm4gc319ZnVuY3Rpb24gc2woZSx0LG4pe2lmKE90KHQpKXtjb25zdCByPXQucmVzb2x2ZShlKSxzPW4mJnImJm4uZ2V0KHIpO3JldHVybiBzP3MuY291bnQqcy5hbGlhc0NvdW50OjB9ZWxzZSBpZihJZSh0KSl7bGV0IHI9MDtmb3IoY29uc3QgcyBvZiB0Lml0ZW1zKXtjb25zdCBpPXNsKGUscyxuKTtpPnImJihyPWkpfXJldHVybiByfWVsc2UgaWYoeWUodCkpe2NvbnN0IHI9c2woZSx0LmtleSxuKSxzPXNsKGUsdC52YWx1ZSxuKTtyZXR1cm4gTWF0aC5tYXgocixzKX1yZXR1cm4gMX1jb25zdCB4eT1lPT4hZXx8dHlwZW9mIGUhPSJmdW5jdGlvbiImJnR5cGVvZiBlIT0ib2JqZWN0IjtjbGFzcyBzZSBleHRlbmRzIE5we2NvbnN0cnVjdG9yKHQpe3N1cGVyKGVyKSx0aGlzLnZhbHVlPXR9dG9KU09OKHQsbil7cmV0dXJuIG4hPW51bGwmJm4ua2VlcD90aGlzLnZhbHVlOmRuKHRoaXMudmFsdWUsdCxuKX10b1N0cmluZygpe3JldHVybiBTdHJpbmcodGhpcy52YWx1ZSl9fXNlLkJMT0NLX0ZPTERFRD0iQkxPQ0tfRk9MREVEIixzZS5CTE9DS19MSVRFUkFMPSJCTE9DS19MSVRFUkFMIixzZS5QTEFJTj0iUExBSU4iLHNlLlFVT1RFX0RPVUJMRT0iUVVPVEVfRE9VQkxFIixzZS5RVU9URV9TSU5HTEU9IlFVT1RFX1NJTkdMRSI7Y29uc3QgUzk9InRhZzp5YW1sLm9yZywyMDAyOiI7ZnVuY3Rpb24geDkoZSx0LG4pe2lmKHQpe2NvbnN0IHI9bi5maWx0ZXIoaT0+aS50YWc9PT10KSxzPXIuZmluZChpPT4haS5mb3JtYXQpPz9yWzBdO2lmKCFzKXRocm93IG5ldyBFcnJvcihgVGFnICR7dH0gbm90IGZvdW5kYCk7cmV0dXJuIHN9cmV0dXJuIG4uZmluZChyPT57dmFyIHM7cmV0dXJuKChzPXIuaWRlbnRpZnkpPT1udWxsP3ZvaWQgMDpzLmNhbGwocixlKSkmJiFyLmZvcm1hdH0pfWZ1bmN0aW9uIGRhKGUsdCxuKXt2YXIgYyxwLGg7aWYoSGkoZSkmJihlPWUuY29udGVudHMpLGdlKGUpKXJldHVybiBlO2lmKHllKGUpKXtjb25zdCBkPShwPShjPW4uc2NoZW1hW29zXSkuY3JlYXRlTm9kZSk9PW51bGw/dm9pZCAwOnAuY2FsbChjLG4uc2NoZW1hLG51bGwsbik7cmV0dXJuIGQuaXRlbXMucHVzaChlKSxkfShlIGluc3RhbmNlb2YgU3RyaW5nfHxlIGluc3RhbmNlb2YgTnVtYmVyfHxlIGluc3RhbmNlb2YgQm9vbGVhbnx8dHlwZW9mIEJpZ0ludDwidSImJmUgaW5zdGFuY2VvZiBCaWdJbnQpJiYoZT1lLnZhbHVlT2YoKSk7Y29uc3R7YWxpYXNEdXBsaWNhdGVPYmplY3RzOnIsb25BbmNob3I6cyxvblRhZ09iajppLHNjaGVtYTpvLHNvdXJjZU9iamVjdHM6YX09bjtsZXQgdTtpZihyJiZlJiZ0eXBlb2YgZT09Im9iamVjdCIpe2lmKHU9YS5nZXQoZSksdSlyZXR1cm4gdS5hbmNob3I/Pyh1LmFuY2hvcj1zKGUpKSxuZXcgTHAodS5hbmNob3IpO3U9e2FuY2hvcjpudWxsLG5vZGU6bnVsbH0sYS5zZXQoZSx1KX10IT1udWxsJiZ0LnN0YXJ0c1dpdGgoIiEhIikmJih0PVM5K3Quc2xpY2UoMikpO2xldCBsPXg5KGUsdCxvLnRhZ3MpO2lmKCFsKXtpZihlJiZ0eXBlb2YgZS50b0pTT049PSJmdW5jdGlvbiImJihlPWUudG9KU09OKCkpLCFlfHx0eXBlb2YgZSE9Im9iamVjdCIpe2NvbnN0IGQ9bmV3IHNlKGUpO3JldHVybiB1JiYodS5ub2RlPWQpLGR9bD1lIGluc3RhbmNlb2YgTWFwP29bb3NdOlN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSk/b1tXaV06b1tvc119aSYmKGkobCksZGVsZXRlIG4ub25UYWdPYmopO2NvbnN0IGY9bCE9bnVsbCYmbC5jcmVhdGVOb2RlP2wuY3JlYXRlTm9kZShuLnNjaGVtYSxlLG4pOnR5cGVvZigoaD1sPT1udWxsP3ZvaWQgMDpsLm5vZGVDbGFzcyk9PW51bGw/dm9pZCAwOmguZnJvbSk9PSJmdW5jdGlvbiI/bC5ub2RlQ2xhc3MuZnJvbShuLnNjaGVtYSxlLG4pOm5ldyBzZShlKTtyZXR1cm4gdD9mLnRhZz10OmwuZGVmYXVsdHx8KGYudGFnPWwudGFnKSx1JiYodS5ub2RlPWYpLGZ9ZnVuY3Rpb24gaWwoZSx0LG4pe2xldCByPW47Zm9yKGxldCBzPXQubGVuZ3RoLTE7cz49MDstLXMpe2NvbnN0IGk9dFtzXTtpZih0eXBlb2YgaT09Im51bWJlciImJk51bWJlci5pc0ludGVnZXIoaSkmJmk+PTApe2NvbnN0IG89W107b1tpXT1yLHI9b31lbHNlIHI9bmV3IE1hcChbW2kscl1dKX1yZXR1cm4gZGEocix2b2lkIDAse2FsaWFzRHVwbGljYXRlT2JqZWN0czohMSxrZWVwVW5kZWZpbmVkOiExLG9uQW5jaG9yOigpPT57dGhyb3cgbmV3IEVycm9yKCJUaGlzIHNob3VsZCBub3QgaGFwcGVuLCBwbGVhc2UgcmVwb3J0IGEgYnVnLiIpfSxzY2hlbWE6ZSxzb3VyY2VPYmplY3RzOm5ldyBNYXB9KX1jb25zdCBtYT1lPT5lPT1udWxsfHx0eXBlb2YgZT09Im9iamVjdCImJiEhZVtTeW1ib2wuaXRlcmF0b3JdKCkubmV4dCgpLmRvbmU7Y2xhc3Mga3kgZXh0ZW5kcyBOcHtjb25zdHJ1Y3Rvcih0LG4pe3N1cGVyKHQpLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJzY2hlbWEiLHt2YWx1ZTpuLGNvbmZpZ3VyYWJsZTohMCxlbnVtZXJhYmxlOiExLHdyaXRhYmxlOiEwfSl9Y2xvbmUodCl7Y29uc3Qgbj1PYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0aGlzKSk7cmV0dXJuIHQmJihuLnNjaGVtYT10KSxuLml0ZW1zPW4uaXRlbXMubWFwKHI9PmdlKHIpfHx5ZShyKT9yLmNsb25lKHQpOnIpLHRoaXMucmFuZ2UmJihuLnJhbmdlPXRoaXMucmFuZ2Uuc2xpY2UoKSksbn1hZGRJbih0LG4pe2lmKG1hKHQpKXRoaXMuYWRkKG4pO2Vsc2V7Y29uc3RbciwuLi5zXT10LGk9dGhpcy5nZXQociwhMCk7aWYoSWUoaSkpaS5hZGRJbihzLG4pO2Vsc2UgaWYoaT09PXZvaWQgMCYmdGhpcy5zY2hlbWEpdGhpcy5zZXQocixpbCh0aGlzLnNjaGVtYSxzLG4pKTtlbHNlIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgWUFNTCBjb2xsZWN0aW9uIGF0ICR7cn0uIFJlbWFpbmluZyBwYXRoOiAke3N9YCl9fWRlbGV0ZUluKHQpe2NvbnN0W24sLi4ucl09dDtpZihyLmxlbmd0aD09PTApcmV0dXJuIHRoaXMuZGVsZXRlKG4pO2NvbnN0IHM9dGhpcy5nZXQobiwhMCk7aWYoSWUocykpcmV0dXJuIHMuZGVsZXRlSW4ocik7dGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBZQU1MIGNvbGxlY3Rpb24gYXQgJHtufS4gUmVtYWluaW5nIHBhdGg6ICR7cn1gKX1nZXRJbih0LG4pe2NvbnN0W3IsLi4uc109dCxpPXRoaXMuZ2V0KHIsITApO3JldHVybiBzLmxlbmd0aD09PTA/IW4mJlooaSk/aS52YWx1ZTppOkllKGkpP2kuZ2V0SW4ocyxuKTp2b2lkIDB9aGFzQWxsTnVsbFZhbHVlcyh0KXtyZXR1cm4gdGhpcy5pdGVtcy5ldmVyeShuPT57aWYoIXllKG4pKXJldHVybiExO2NvbnN0IHI9bi52YWx1ZTtyZXR1cm4gcj09bnVsbHx8dCYmWihyKSYmci52YWx1ZT09bnVsbCYmIXIuY29tbWVudEJlZm9yZSYmIXIuY29tbWVudCYmIXIudGFnfSl9aGFzSW4odCl7Y29uc3RbbiwuLi5yXT10O2lmKHIubGVuZ3RoPT09MClyZXR1cm4gdGhpcy5oYXMobik7Y29uc3Qgcz10aGlzLmdldChuLCEwKTtyZXR1cm4gSWUocyk/cy5oYXNJbihyKTohMX1zZXRJbih0LG4pe2NvbnN0W3IsLi4uc109dDtpZihzLmxlbmd0aD09PTApdGhpcy5zZXQocixuKTtlbHNle2NvbnN0IGk9dGhpcy5nZXQociwhMCk7aWYoSWUoaSkpaS5zZXRJbihzLG4pO2Vsc2UgaWYoaT09PXZvaWQgMCYmdGhpcy5zY2hlbWEpdGhpcy5zZXQocixpbCh0aGlzLnNjaGVtYSxzLG4pKTtlbHNlIHRocm93IG5ldyBFcnJvcihgRXhwZWN0ZWQgWUFNTCBjb2xsZWN0aW9uIGF0ICR7cn0uIFJlbWFpbmluZyBwYXRoOiAke3N9YCl9fX1jb25zdCBrOT1lPT5lLnJlcGxhY2UoL14oPyEkKSg/OiAkKT8vZ20sIiMiKTtmdW5jdGlvbiBGcihlLHQpe3JldHVybi9eXG4rJC8udGVzdChlKT9lLnN1YnN0cmluZygxKTp0P2UucmVwbGFjZSgvXig/ISAqJCkvZ20sdCk6ZX1jb25zdCBWcz0oZSx0LG4pPT5lLmVuZHNXaXRoKGAKYCk/RnIobix0KTpuLmluY2x1ZGVzKGAKYCk/YApgK0ZyKG4sdCk6KGUuZW5kc1dpdGgoIiAiKT8iIjoiICIpK24sVHk9ImZsb3ciLCRwPSJibG9jayIsb2w9InF1b3RlZCI7ZnVuY3Rpb24gYWwoZSx0LG49ImZsb3ciLHtpbmRlbnRBdFN0YXJ0OnIsbGluZVdpZHRoOnM9ODAsbWluQ29udGVudFdpZHRoOmk9MjAsb25Gb2xkOm8sb25PdmVyZmxvdzphfT17fSl7aWYoIXN8fHM8MClyZXR1cm4gZTtzPGkmJihpPTApO2NvbnN0IHU9TWF0aC5tYXgoMStpLDErcy10Lmxlbmd0aCk7aWYoZS5sZW5ndGg8PXUpcmV0dXJuIGU7Y29uc3QgbD1bXSxmPXt9O2xldCBjPXMtdC5sZW5ndGg7dHlwZW9mIHI9PSJudW1iZXIiJiYocj5zLU1hdGgubWF4KDIsaSk/bC5wdXNoKDApOmM9cy1yKTtsZXQgcCxoLGQ9ITEsbT0tMSxnPS0xLEQ9LTE7bj09PSRwJiYobT1OeShlLG0sdC5sZW5ndGgpLG0hPT0tMSYmKGM9bSt1KSk7Zm9yKGxldCBFO0U9ZVttKz0xXTspe2lmKG49PT1vbCYmRT09PSJcXCIpe3N3aXRjaChnPW0sZVttKzFdKXtjYXNlIngiOm0rPTM7YnJlYWs7Y2FzZSJ1IjptKz01O2JyZWFrO2Nhc2UiVSI6bSs9OTticmVhaztkZWZhdWx0Om0rPTF9RD1tfWlmKEU9PT1gCmApbj09PSRwJiYobT1OeShlLG0sdC5sZW5ndGgpKSxjPW0rdC5sZW5ndGgrdSxwPXZvaWQgMDtlbHNle2lmKEU9PT0iICImJmgmJmghPT0iICImJmghPT1gCmAmJmghPT0iCSIpe2NvbnN0IEY9ZVttKzFdO0YmJkYhPT0iICImJkYhPT1gCmAmJkYhPT0iCSImJihwPW0pfWlmKG0+PWMpaWYocClsLnB1c2gocCksYz1wK3UscD12b2lkIDA7ZWxzZSBpZihuPT09b2wpe2Zvcig7aD09PSIgInx8aD09PSIJIjspaD1FLEU9ZVttKz0xXSxkPSEwO2NvbnN0IEY9bT5EKzE/bS0yOmctMTtpZihmW0ZdKXJldHVybiBlO2wucHVzaChGKSxmW0ZdPSEwLGM9Rit1LHA9dm9pZCAwfWVsc2UgZD0hMH1oPUV9aWYoZCYmYSYmYSgpLGwubGVuZ3RoPT09MClyZXR1cm4gZTtvJiZvKCk7bGV0IGI9ZS5zbGljZSgwLGxbMF0pO2ZvcihsZXQgRT0wO0U8bC5sZW5ndGg7KytFKXtjb25zdCBGPWxbRV0sdj1sW0UrMV18fGUubGVuZ3RoO0Y9PT0wP2I9YAoke3R9JHtlLnNsaWNlKDAsdil9YDoobj09PW9sJiZmW0ZdJiYoYis9YCR7ZVtGXX1cXGApLGIrPWAKJHt0fSR7ZS5zbGljZShGKzEsdil9YCl9cmV0dXJuIGJ9ZnVuY3Rpb24gTnkoZSx0LG4pe2xldCByPXQscz10KzEsaT1lW3NdO2Zvcig7aT09PSIgInx8aT09PSIJIjspaWYodDxzK24paT1lWysrdF07ZWxzZXtkbyBpPWVbKyt0XTt3aGlsZShpJiZpIT09YApgKTtyPXQscz10KzEsaT1lW3NdfXJldHVybiByfWNvbnN0IHVsPShlLHQpPT4oe2luZGVudEF0U3RhcnQ6dD9lLmluZGVudC5sZW5ndGg6ZS5pbmRlbnRBdFN0YXJ0LGxpbmVXaWR0aDplLm9wdGlvbnMubGluZVdpZHRoLG1pbkNvbnRlbnRXaWR0aDplLm9wdGlvbnMubWluQ29udGVudFdpZHRofSksbGw9ZT0+L14oJXwtLS18XC5cLlwuKS9tLnRlc3QoZSk7ZnVuY3Rpb24gVDkoZSx0LG4pe2lmKCF0fHx0PDApcmV0dXJuITE7Y29uc3Qgcj10LW4scz1lLmxlbmd0aDtpZihzPD1yKXJldHVybiExO2ZvcihsZXQgaT0wLG89MDtpPHM7KytpKWlmKGVbaV09PT1gCmApe2lmKGktbz5yKXJldHVybiEwO2lmKG89aSsxLHMtbzw9cilyZXR1cm4hMX1yZXR1cm4hMH1mdW5jdGlvbiBnYShlLHQpe2NvbnN0IG49SlNPTi5zdHJpbmdpZnkoZSk7aWYodC5vcHRpb25zLmRvdWJsZVF1b3RlZEFzSlNPTilyZXR1cm4gbjtjb25zdHtpbXBsaWNpdEtleTpyfT10LHM9dC5vcHRpb25zLmRvdWJsZVF1b3RlZE1pbk11bHRpTGluZUxlbmd0aCxpPXQuaW5kZW50fHwobGwoZSk/IiAgIjoiIik7bGV0IG89IiIsYT0wO2ZvcihsZXQgdT0wLGw9blt1XTtsO2w9blsrK3VdKWlmKGw9PT0iICImJm5bdSsxXT09PSJcXCImJm5bdSsyXT09PSJuIiYmKG8rPW4uc2xpY2UoYSx1KSsiXFwgIix1Kz0xLGE9dSxsPSJcXCIpLGw9PT0iXFwiKXN3aXRjaChuW3UrMV0pe2Nhc2UidSI6e28rPW4uc2xpY2UoYSx1KTtjb25zdCBmPW4uc3Vic3RyKHUrMiw0KTtzd2l0Y2goZil7Y2FzZSIwMDAwIjpvKz0iXFwwIjticmVhaztjYXNlIjAwMDciOm8rPSJcXGEiO2JyZWFrO2Nhc2UiMDAwYiI6bys9IlxcdiI7YnJlYWs7Y2FzZSIwMDFiIjpvKz0iXFxlIjticmVhaztjYXNlIjAwODUiOm8rPSJcXE4iO2JyZWFrO2Nhc2UiMDBhMCI6bys9IlxcXyI7YnJlYWs7Y2FzZSIyMDI4IjpvKz0iXFxMIjticmVhaztjYXNlIjIwMjkiOm8rPSJcXFAiO2JyZWFrO2RlZmF1bHQ6Zi5zdWJzdHIoMCwyKT09PSIwMCI/bys9IlxceCIrZi5zdWJzdHIoMik6bys9bi5zdWJzdHIodSw2KX11Kz01LGE9dSsxfWJyZWFrO2Nhc2UibiI6aWYocnx8blt1KzJdPT09JyInfHxuLmxlbmd0aDxzKXUrPTE7ZWxzZXtmb3Iobys9bi5zbGljZShhLHUpK2AKCmA7blt1KzJdPT09IlxcIiYmblt1KzNdPT09Im4iJiZuW3UrNF0hPT0nIic7KW8rPWAKYCx1Kz0yO28rPWksblt1KzJdPT09IiAiJiYobys9IlxcIiksdSs9MSxhPXUrMX1icmVhaztkZWZhdWx0OnUrPTF9cmV0dXJuIG89YT9vK24uc2xpY2UoYSk6bixyP286YWwobyxpLG9sLHVsKHQsITEpKX1mdW5jdGlvbiBCcChlLHQpe2lmKHQub3B0aW9ucy5zaW5nbGVRdW90ZT09PSExfHx0LmltcGxpY2l0S2V5JiZlLmluY2x1ZGVzKGAKYCl8fC9bIFx0XVxufFxuWyBcdF0vLnRlc3QoZSkpcmV0dXJuIGdhKGUsdCk7Y29uc3Qgbj10LmluZGVudHx8KGxsKGUpPyIgICI6IiIpLHI9IiciK2UucmVwbGFjZSgvJy9nLCInJyIpLnJlcGxhY2UoL1xuKy9nLGAkJgoke259YCkrIiciO3JldHVybiB0LmltcGxpY2l0S2V5P3I6YWwocixuLFR5LHVsKHQsITEpKX1mdW5jdGlvbiBHaShlLHQpe2NvbnN0e3NpbmdsZVF1b3RlOm59PXQub3B0aW9ucztsZXQgcjtpZihuPT09ITEpcj1nYTtlbHNle2NvbnN0IHM9ZS5pbmNsdWRlcygnIicpLGk9ZS5pbmNsdWRlcygiJyIpO3MmJiFpP3I9QnA6aSYmIXM/cj1nYTpyPW4/QnA6Z2F9cmV0dXJuIHIoZSx0KX1sZXQgX3A7dHJ5e19wPW5ldyBSZWdFeHAoYChefCg/PCEKKSkKKyg/IQp8JClgLCJnIil9Y2F0Y2h7X3A9L1xuKyg/IVxufCQpL2d9ZnVuY3Rpb24gY2woe2NvbW1lbnQ6ZSx0eXBlOnQsdmFsdWU6bn0scixzLGkpe2NvbnN0e2Jsb2NrUXVvdGU6byxjb21tZW50U3RyaW5nOmEsbGluZVdpZHRoOnV9PXIub3B0aW9ucztpZighb3x8L1xuW1x0IF0rJC8udGVzdChuKSlyZXR1cm4gR2kobixyKTtjb25zdCBsPXIuaW5kZW50fHwoci5mb3JjZUJsb2NrSW5kZW50fHxsbChuKT8iICAiOiIiKSxmPW89PT0ibGl0ZXJhbCI/ITA6bz09PSJmb2xkZWQifHx0PT09c2UuQkxPQ0tfRk9MREVEPyExOnQ9PT1zZS5CTE9DS19MSVRFUkFMPyEwOiFUOShuLHUsbC5sZW5ndGgpO2lmKCFuKXJldHVybiBmP2B8CmA6YD4KYDtsZXQgYyxwO2ZvcihwPW4ubGVuZ3RoO3A+MDstLXApe2NvbnN0IHY9bltwLTFdO2lmKHYhPT1gCmAmJnYhPT0iCSImJnYhPT0iICIpYnJlYWt9bGV0IGg9bi5zdWJzdHJpbmcocCk7Y29uc3QgZD1oLmluZGV4T2YoYApgKTtkPT09LTE/Yz0iLSI6bj09PWh8fGQhPT1oLmxlbmd0aC0xPyhjPSIrIixpJiZpKCkpOmM9IiIsaCYmKG49bi5zbGljZSgwLC1oLmxlbmd0aCksaFtoLmxlbmd0aC0xXT09PWAKYCYmKGg9aC5zbGljZSgwLC0xKSksaD1oLnJlcGxhY2UoX3AsYCQmJHtsfWApKTtsZXQgbT0hMSxnLEQ9LTE7Zm9yKGc9MDtnPG4ubGVuZ3RoOysrZyl7Y29uc3Qgdj1uW2ddO2lmKHY9PT0iICIpbT0hMDtlbHNlIGlmKHY9PT1gCmApRD1nO2Vsc2UgYnJlYWt9bGV0IGI9bi5zdWJzdHJpbmcoMCxEPGc/RCsxOmcpO2ImJihuPW4uc3Vic3RyaW5nKGIubGVuZ3RoKSxiPWIucmVwbGFjZSgvXG4rL2csYCQmJHtsfWApKTtsZXQgRj0obT9sPyIyIjoiMSI6IiIpK2M7aWYoZSYmKEYrPSIgIithKGUucmVwbGFjZSgvID9bXHJcbl0rL2csIiAiKSkscyYmcygpKSwhZil7Y29uc3Qgdj1uLnJlcGxhY2UoL1xuKy9nLGAKJCZgKS5yZXBsYWNlKC8oPzpefFxuKShbXHQgXS4qKSg/OihbXG5cdCBdKilcbig/IVtcblx0IF0pKT8vZywiJDEkMiIpLnJlcGxhY2UoL1xuKy9nLGAkJiR7bH1gKTtsZXQgQz0hMTtjb25zdCBBPXVsKHIsITApO28hPT0iZm9sZGVkIiYmdCE9PXNlLkJMT0NLX0ZPTERFRCYmKEEub25PdmVyZmxvdz0oKT0+e0M9ITB9KTtjb25zdCB3PWFsKGAke2J9JHt2fSR7aH1gLGwsJHAsQSk7aWYoIUMpcmV0dXJuYD4ke0Z9CiR7bH0ke3d9YH1yZXR1cm4gbj1uLnJlcGxhY2UoL1xuKy9nLGAkJiR7bH1gKSxgfCR7Rn0KJHtsfSR7Yn0ke259JHtofWB9ZnVuY3Rpb24gTjkoZSx0LG4scil7Y29uc3R7dHlwZTpzLHZhbHVlOml9PWUse2FjdHVhbFN0cmluZzpvLGltcGxpY2l0S2V5OmEsaW5kZW50OnUsaW5kZW50U3RlcDpsLGluRmxvdzpmfT10O2lmKGEmJmkuaW5jbHVkZXMoYApgKXx8ZiYmL1tbXF17fSxdLy50ZXN0KGkpKXJldHVybiBHaShpLHQpO2lmKC9eW1xuXHQgLFtcXXt9IyYqIXw+JyIlQGBdfF5bPy1dJHxeWz8tXVsgXHRdfFtcbjpdWyBcdF18WyBcdF1cbnxbXG5cdCBdI3xbXG5cdCA6XSQvLnRlc3QoaSkpcmV0dXJuIGF8fGZ8fCFpLmluY2x1ZGVzKGAKYCk/R2koaSx0KTpjbChlLHQsbixyKTtpZighYSYmIWYmJnMhPT1zZS5QTEFJTiYmaS5pbmNsdWRlcyhgCmApKXJldHVybiBjbChlLHQsbixyKTtpZihsbChpKSl7aWYodT09PSIiKXJldHVybiB0LmZvcmNlQmxvY2tJbmRlbnQ9ITAsY2woZSx0LG4scik7aWYoYSYmdT09PWwpcmV0dXJuIEdpKGksdCl9Y29uc3QgYz1pLnJlcGxhY2UoL1xuKy9nLGAkJgoke3V9YCk7aWYobyl7Y29uc3QgcD1tPT57dmFyIGc7cmV0dXJuIG0uZGVmYXVsdCYmbS50YWchPT0idGFnOnlhbWwub3JnLDIwMDI6c3RyIiYmKChnPW0udGVzdCk9PW51bGw/dm9pZCAwOmcudGVzdChjKSl9LHtjb21wYXQ6aCx0YWdzOmR9PXQuZG9jLnNjaGVtYTtpZihkLnNvbWUocCl8fGghPW51bGwmJmguc29tZShwKSlyZXR1cm4gR2koaSx0KX1yZXR1cm4gYT9jOmFsKGMsdSxUeSx1bCh0LCExKSl9ZnVuY3Rpb24gSXAoZSx0LG4scil7Y29uc3R7aW1wbGljaXRLZXk6cyxpbkZsb3c6aX09dCxvPXR5cGVvZiBlLnZhbHVlPT0ic3RyaW5nIj9lOk9iamVjdC5hc3NpZ24oe30sZSx7dmFsdWU6U3RyaW5nKGUudmFsdWUpfSk7bGV0e3R5cGU6YX09ZTthIT09c2UuUVVPVEVfRE9VQkxFJiYvW1x4MDAtXHgwOFx4MGItXHgxZlx4N2YtXHg5Zlx1e0Q4MDB9LVx1e0RGRkZ9XS91LnRlc3Qoby52YWx1ZSkmJihhPXNlLlFVT1RFX0RPVUJMRSk7Y29uc3QgdT1mPT57c3dpdGNoKGYpe2Nhc2Ugc2UuQkxPQ0tfRk9MREVEOmNhc2Ugc2UuQkxPQ0tfTElURVJBTDpyZXR1cm4gc3x8aT9HaShvLnZhbHVlLHQpOmNsKG8sdCxuLHIpO2Nhc2Ugc2UuUVVPVEVfRE9VQkxFOnJldHVybiBnYShvLnZhbHVlLHQpO2Nhc2Ugc2UuUVVPVEVfU0lOR0xFOnJldHVybiBCcChvLnZhbHVlLHQpO2Nhc2Ugc2UuUExBSU46cmV0dXJuIE45KG8sdCxuLHIpO2RlZmF1bHQ6cmV0dXJuIG51bGx9fTtsZXQgbD11KGEpO2lmKGw9PT1udWxsKXtjb25zdHtkZWZhdWx0S2V5VHlwZTpmLGRlZmF1bHRTdHJpbmdUeXBlOmN9PXQub3B0aW9ucyxwPXMmJmZ8fGM7aWYobD11KHApLGw9PT1udWxsKXRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGVmYXVsdCBzdHJpbmcgdHlwZSAke3B9YCl9cmV0dXJuIGx9ZnVuY3Rpb24gTHkoZSx0KXtjb25zdCBuPU9iamVjdC5hc3NpZ24oe2Jsb2NrUXVvdGU6ITAsY29tbWVudFN0cmluZzprOSxkZWZhdWx0S2V5VHlwZTpudWxsLGRlZmF1bHRTdHJpbmdUeXBlOiJQTEFJTiIsZGlyZWN0aXZlczpudWxsLGRvdWJsZVF1b3RlZEFzSlNPTjohMSxkb3VibGVRdW90ZWRNaW5NdWx0aUxpbmVMZW5ndGg6NDAsZmFsc2VTdHI6ImZhbHNlIixmbG93Q29sbGVjdGlvblBhZGRpbmc6ITAsaW5kZW50U2VxOiEwLGxpbmVXaWR0aDo4MCxtaW5Db250ZW50V2lkdGg6MjAsbnVsbFN0cjoibnVsbCIsc2ltcGxlS2V5czohMSxzaW5nbGVRdW90ZTpudWxsLHRyYWlsaW5nQ29tbWE6ITEsdHJ1ZVN0cjoidHJ1ZSIsdmVyaWZ5QWxpYXNPcmRlcjohMH0sZS5zY2hlbWEudG9TdHJpbmdPcHRpb25zLHQpO2xldCByO3N3aXRjaChuLmNvbGxlY3Rpb25TdHlsZSl7Y2FzZSJibG9jayI6cj0hMTticmVhaztjYXNlImZsb3ciOnI9ITA7YnJlYWs7ZGVmYXVsdDpyPW51bGx9cmV0dXJue2FuY2hvcnM6bmV3IFNldCxkb2M6ZSxmbG93Q29sbGVjdGlvblBhZGRpbmc6bi5mbG93Q29sbGVjdGlvblBhZGRpbmc/IiAiOiIiLGluZGVudDoiIixpbmRlbnRTdGVwOnR5cGVvZiBuLmluZGVudD09Im51bWJlciI/IiAiLnJlcGVhdChuLmluZGVudCk6IiAgIixpbkZsb3c6cixvcHRpb25zOm59fWZ1bmN0aW9uIEw5KGUsdCl7dmFyIHM7aWYodC50YWcpe2NvbnN0IGk9ZS5maWx0ZXIobz0+by50YWc9PT10LnRhZyk7aWYoaS5sZW5ndGg+MClyZXR1cm4gaS5maW5kKG89Pm8uZm9ybWF0PT09dC5mb3JtYXQpPz9pWzBdfWxldCBuLHI7aWYoWih0KSl7cj10LnZhbHVlO2xldCBpPWUuZmlsdGVyKG89Pnt2YXIgYTtyZXR1cm4oYT1vLmlkZW50aWZ5KT09bnVsbD92b2lkIDA6YS5jYWxsKG8scil9KTtpZihpLmxlbmd0aD4xKXtjb25zdCBvPWkuZmlsdGVyKGE9PmEudGVzdCk7by5sZW5ndGg+MCYmKGk9byl9bj1pLmZpbmQobz0+by5mb3JtYXQ9PT10LmZvcm1hdCk/P2kuZmluZChvPT4hby5mb3JtYXQpfWVsc2Ugcj10LG49ZS5maW5kKGk9Pmkubm9kZUNsYXNzJiZyIGluc3RhbmNlb2YgaS5ub2RlQ2xhc3MpO2lmKCFuKXtjb25zdCBpPSgocz1yPT1udWxsP3ZvaWQgMDpyLmNvbnN0cnVjdG9yKT09bnVsbD92b2lkIDA6cy5uYW1lKT8/KHI9PT1udWxsPyJudWxsIjp0eXBlb2Ygcik7dGhyb3cgbmV3IEVycm9yKGBUYWcgbm90IHJlc29sdmVkIGZvciAke2l9IHZhbHVlYCl9cmV0dXJuIG59ZnVuY3Rpb24gJDkoZSx0LHthbmNob3JzOm4sZG9jOnJ9KXtpZighci5kaXJlY3RpdmVzKXJldHVybiIiO2NvbnN0IHM9W10saT0oWihlKXx8SWUoZSkpJiZlLmFuY2hvcjtpJiZ3eShpKSYmKG4uYWRkKGkpLHMucHVzaChgJiR7aX1gKSk7Y29uc3Qgbz1lLnRhZz8/KHQuZGVmYXVsdD9udWxsOnQudGFnKTtyZXR1cm4gbyYmcy5wdXNoKHIuZGlyZWN0aXZlcy50YWdTdHJpbmcobykpLHMuam9pbigiICIpfWZ1bmN0aW9uIEtpKGUsdCxuLHIpe3ZhciB1O2lmKHllKGUpKXJldHVybiBlLnRvU3RyaW5nKHQsbixyKTtpZihPdChlKSl7aWYodC5kb2MuZGlyZWN0aXZlcylyZXR1cm4gZS50b1N0cmluZyh0KTtpZigodT10LnJlc29sdmVkQWxpYXNlcykhPW51bGwmJnUuaGFzKGUpKXRocm93IG5ldyBUeXBlRXJyb3IoIkNhbm5vdCBzdHJpbmdpZnkgY2lyY3VsYXIgc3RydWN0dXJlIHdpdGhvdXQgYWxpYXMgbm9kZXMiKTt0LnJlc29sdmVkQWxpYXNlcz90LnJlc29sdmVkQWxpYXNlcy5hZGQoZSk6dC5yZXNvbHZlZEFsaWFzZXM9bmV3IFNldChbZV0pLGU9ZS5yZXNvbHZlKHQuZG9jKX1sZXQgcztjb25zdCBpPWdlKGUpP2U6dC5kb2MuY3JlYXRlTm9kZShlLHtvblRhZ09iajpsPT5zPWx9KTtzPz8ocz1MOSh0LmRvYy5zY2hlbWEudGFncyxpKSk7Y29uc3Qgbz0kOShpLHMsdCk7by5sZW5ndGg+MCYmKHQuaW5kZW50QXRTdGFydD0odC5pbmRlbnRBdFN0YXJ0Pz8wKStvLmxlbmd0aCsxKTtjb25zdCBhPXR5cGVvZiBzLnN0cmluZ2lmeT09ImZ1bmN0aW9uIj9zLnN0cmluZ2lmeShpLHQsbixyKTpaKGkpP0lwKGksdCxuLHIpOmkudG9TdHJpbmcodCxuLHIpO3JldHVybiBvP1ooaSl8fGFbMF09PT0ieyJ8fGFbMF09PT0iWyI/YCR7b30gJHthfWA6YCR7b30KJHt0LmluZGVudH0ke2F9YDphfWZ1bmN0aW9uIEI5KHtrZXk6ZSx2YWx1ZTp0fSxuLHIscyl7Y29uc3R7YWxsTnVsbFZhbHVlczppLGRvYzpvLGluZGVudDphLGluZGVudFN0ZXA6dSxvcHRpb25zOntjb21tZW50U3RyaW5nOmwsaW5kZW50U2VxOmYsc2ltcGxlS2V5czpjfX09bjtsZXQgcD1nZShlKSYmZS5jb21tZW50fHxudWxsO2lmKGMpe2lmKHApdGhyb3cgbmV3IEVycm9yKCJXaXRoIHNpbXBsZSBrZXlzLCBrZXkgbm9kZXMgY2Fubm90IGhhdmUgY29tbWVudHMiKTtpZihJZShlKXx8IWdlKGUpJiZ0eXBlb2YgZT09Im9iamVjdCIpe2NvbnN0IEE9IldpdGggc2ltcGxlIGtleXMsIGNvbGxlY3Rpb24gY2Fubm90IGJlIHVzZWQgYXMgYSBrZXkgdmFsdWUiO3Rocm93IG5ldyBFcnJvcihBKX19bGV0IGg9IWMmJighZXx8cCYmdD09bnVsbCYmIW4uaW5GbG93fHxJZShlKXx8KFooZSk/ZS50eXBlPT09c2UuQkxPQ0tfRk9MREVEfHxlLnR5cGU9PT1zZS5CTE9DS19MSVRFUkFMOnR5cGVvZiBlPT0ib2JqZWN0IikpO249T2JqZWN0LmFzc2lnbih7fSxuLHthbGxOdWxsVmFsdWVzOiExLGltcGxpY2l0S2V5OiFoJiYoY3x8IWkpLGluZGVudDphK3V9KTtsZXQgZD0hMSxtPSExLGc9S2koZSxuLCgpPT5kPSEwLCgpPT5tPSEwKTtpZighaCYmIW4uaW5GbG93JiZnLmxlbmd0aD4xMDI0KXtpZihjKXRocm93IG5ldyBFcnJvcigiV2l0aCBzaW1wbGUga2V5cywgc2luZ2xlIGxpbmUgc2NhbGFyIG11c3Qgbm90IHNwYW4gbW9yZSB0aGFuIDEwMjQgY2hhcmFjdGVycyIpO2g9ITB9aWYobi5pbkZsb3cpe2lmKGl8fHQ9PW51bGwpcmV0dXJuIGQmJnImJnIoKSxnPT09IiI/Ij8iOmg/YD8gJHtnfWA6Z31lbHNlIGlmKGkmJiFjfHx0PT1udWxsJiZoKXJldHVybiBnPWA/ICR7Z31gLHAmJiFkP2crPVZzKGcsbi5pbmRlbnQsbChwKSk6bSYmcyYmcygpLGc7ZCYmKHA9bnVsbCksaD8ocCYmKGcrPVZzKGcsbi5pbmRlbnQsbChwKSkpLGc9YD8gJHtnfQoke2F9OmApOihnPWAke2d9OmAscCYmKGcrPVZzKGcsbi5pbmRlbnQsbChwKSkpKTtsZXQgRCxiLEU7Z2UodCk/KEQ9ISF0LnNwYWNlQmVmb3JlLGI9dC5jb21tZW50QmVmb3JlLEU9dC5jb21tZW50KTooRD0hMSxiPW51bGwsRT1udWxsLHQmJnR5cGVvZiB0PT0ib2JqZWN0IiYmKHQ9by5jcmVhdGVOb2RlKHQpKSksbi5pbXBsaWNpdEtleT0hMSwhaCYmIXAmJloodCkmJihuLmluZGVudEF0U3RhcnQ9Zy5sZW5ndGgrMSksbT0hMSwhZiYmdS5sZW5ndGg+PTImJiFuLmluRmxvdyYmIWgmJlJlKHQpJiYhdC5mbG93JiYhdC50YWcmJiF0LmFuY2hvciYmKG4uaW5kZW50PW4uaW5kZW50LnN1YnN0cmluZygyKSk7bGV0IEY9ITE7Y29uc3Qgdj1LaSh0LG4sKCk9PkY9ITAsKCk9Pm09ITApO2xldCBDPSIgIjtpZihwfHxEfHxiKXtpZihDPUQ/YApgOiIiLGIpe2NvbnN0IEE9bChiKTtDKz1gCiR7RnIoQSxuLmluZGVudCl9YH12PT09IiImJiFuLmluRmxvdz9DPT09YApgJiZFJiYoQz1gCgpgKTpDKz1gCiR7bi5pbmRlbnR9YH1lbHNlIGlmKCFoJiZJZSh0KSl7Y29uc3QgQT12WzBdLHc9di5pbmRleE9mKGAKYCksVD13IT09LTEsTj1uLmluRmxvdz8/dC5mbG93Pz90Lml0ZW1zLmxlbmd0aD09PTA7aWYoVHx8IU4pe2xldCB4PSExO2lmKFQmJihBPT09IiYifHxBPT09IiEiKSl7bGV0IEw9di5pbmRleE9mKCIgIik7QT09PSImIiYmTCE9PS0xJiZMPHcmJnZbTCsxXT09PSIhIiYmKEw9di5pbmRleE9mKCIgIixMKzEpKSwoTD09PS0xfHx3PEwpJiYoeD0hMCl9eHx8KEM9YAoke24uaW5kZW50fWApfX1lbHNlKHY9PT0iInx8dlswXT09PWAKYCkmJihDPSIiKTtyZXR1cm4gZys9Qyt2LG4uaW5GbG93P0YmJnImJnIoKTpFJiYhRj9nKz1WcyhnLG4uaW5kZW50LGwoRSkpOm0mJnMmJnMoKSxnfWZ1bmN0aW9uICR5KGUsdCl7KGU9PT0iZGVidWcifHxlPT09Indhcm4iKSYmY29uc29sZS53YXJuKHQpfWNvbnN0IGZsPSI8PCIsQXI9e2lkZW50aWZ5OmU9PmU9PT1mbHx8dHlwZW9mIGU9PSJzeW1ib2wiJiZlLmRlc2NyaXB0aW9uPT09ZmwsZGVmYXVsdDoia2V5Iix0YWc6InRhZzp5YW1sLm9yZywyMDAyOm1lcmdlIix0ZXN0Oi9ePDwkLyxyZXNvbHZlOigpPT5PYmplY3QuYXNzaWduKG5ldyBzZShTeW1ib2woZmwpKSx7YWRkVG9KU01hcDpCeX0pLHN0cmluZ2lmeTooKT0+Zmx9LF85PShlLHQpPT4oQXIuaWRlbnRpZnkodCl8fFoodCkmJighdC50eXBlfHx0LnR5cGU9PT1zZS5QTEFJTikmJkFyLmlkZW50aWZ5KHQudmFsdWUpKSYmKGU9PW51bGw/dm9pZCAwOmUuZG9jLnNjaGVtYS50YWdzLnNvbWUobj0+bi50YWc9PT1Bci50YWcmJm4uZGVmYXVsdCkpO2Z1bmN0aW9uIEJ5KGUsdCxuKXtjb25zdCByPV95KGUsbik7aWYoUmUocikpZm9yKGNvbnN0IHMgb2Ygci5pdGVtcylQcChlLHQscyk7ZWxzZSBpZihBcnJheS5pc0FycmF5KHIpKWZvcihjb25zdCBzIG9mIHIpUHAoZSx0LHMpO2Vsc2UgUHAoZSx0LHIpfWZ1bmN0aW9uIFBwKGUsdCxuKXtjb25zdCByPV95KGUsbik7aWYoIXplKHIpKXRocm93IG5ldyBFcnJvcigiTWVyZ2Ugc291cmNlcyBtdXN0IGJlIG1hcHMgb3IgbWFwIGFsaWFzZXMiKTtjb25zdCBzPXIudG9KU09OKG51bGwsZSxNYXApO2Zvcihjb25zdFtpLG9db2Ygcyl0IGluc3RhbmNlb2YgTWFwP3QuaGFzKGkpfHx0LnNldChpLG8pOnQgaW5zdGFuY2VvZiBTZXQ/dC5hZGQoaSk6T2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHQsaSl8fE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkse3ZhbHVlOm8sd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTtyZXR1cm4gdH1mdW5jdGlvbiBfeShlLHQpe3JldHVybiBlJiZPdCh0KT90LnJlc29sdmUoZS5kb2MsZSk6dH1mdW5jdGlvbiBJeShlLHQse2tleTpuLHZhbHVlOnJ9KXtpZihnZShuKSYmbi5hZGRUb0pTTWFwKW4uYWRkVG9KU01hcChlLHQscik7ZWxzZSBpZihfOShlLG4pKUJ5KGUsdCxyKTtlbHNle2NvbnN0IHM9ZG4obiwiIixlKTtpZih0IGluc3RhbmNlb2YgTWFwKXQuc2V0KHMsZG4ocixzLGUpKTtlbHNlIGlmKHQgaW5zdGFuY2VvZiBTZXQpdC5hZGQocyk7ZWxzZXtjb25zdCBpPUk5KG4scyxlKSxvPWRuKHIsaSxlKTtpIGluIHQ/T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSx7dmFsdWU6byx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pOnRbaV09b319cmV0dXJuIHR9ZnVuY3Rpb24gSTkoZSx0LG4pe2lmKHQ9PT1udWxsKXJldHVybiIiO2lmKHR5cGVvZiB0IT0ib2JqZWN0IilyZXR1cm4gU3RyaW5nKHQpO2lmKGdlKGUpJiYobiE9bnVsbCYmbi5kb2MpKXtjb25zdCByPUx5KG4uZG9jLHt9KTtyLmFuY2hvcnM9bmV3IFNldDtmb3IoY29uc3QgaSBvZiBuLmFuY2hvcnMua2V5cygpKXIuYW5jaG9ycy5hZGQoaS5hbmNob3IpO3IuaW5GbG93PSEwLHIuaW5TdHJpbmdpZnlLZXk9ITA7Y29uc3Qgcz1lLnRvU3RyaW5nKHIpO2lmKCFuLm1hcEtleVdhcm5lZCl7bGV0IGk9SlNPTi5zdHJpbmdpZnkocyk7aS5sZW5ndGg+NDAmJihpPWkuc3Vic3RyaW5nKDAsMzYpKycuLi4iJyksJHkobi5kb2Mub3B0aW9ucy5sb2dMZXZlbCxgS2V5cyB3aXRoIGNvbGxlY3Rpb24gdmFsdWVzIHdpbGwgYmUgc3RyaW5naWZpZWQgZHVlIHRvIEpTIE9iamVjdCByZXN0cmljdGlvbnM6ICR7aX0uIFNldCBtYXBBc01hcDogdHJ1ZSB0byB1c2Ugb2JqZWN0IGtleXMuYCksbi5tYXBLZXlXYXJuZWQ9ITB9cmV0dXJuIHN9cmV0dXJuIEpTT04uc3RyaW5naWZ5KHQpfWZ1bmN0aW9uIE1wKGUsdCxuKXtjb25zdCByPWRhKGUsdm9pZCAwLG4pLHM9ZGEodCx2b2lkIDAsbik7cmV0dXJuIG5ldyBTdChyLHMpfWNsYXNzIFN0e2NvbnN0cnVjdG9yKHQsbj1udWxsKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxobix7dmFsdWU6Rnl9KSx0aGlzLmtleT10LHRoaXMudmFsdWU9bn1jbG9uZSh0KXtsZXR7a2V5Om4sdmFsdWU6cn09dGhpcztyZXR1cm4gZ2UobikmJihuPW4uY2xvbmUodCkpLGdlKHIpJiYocj1yLmNsb25lKHQpKSxuZXcgU3QobixyKX10b0pTT04odCxuKXtjb25zdCByPW4hPW51bGwmJm4ubWFwQXNNYXA/bmV3IE1hcDp7fTtyZXR1cm4gSXkobixyLHRoaXMpfXRvU3RyaW5nKHQsbixyKXtyZXR1cm4gdCE9bnVsbCYmdC5kb2M/QjkodGhpcyx0LG4scik6SlNPTi5zdHJpbmdpZnkodGhpcyl9fWZ1bmN0aW9uIFB5KGUsdCxuKXtyZXR1cm4odC5pbkZsb3c/P2UuZmxvdz9NOTpQOSkoZSx0LG4pfWZ1bmN0aW9uIFA5KHtjb21tZW50OmUsaXRlbXM6dH0sbix7YmxvY2tJdGVtUHJlZml4OnIsZmxvd0NoYXJzOnMsaXRlbUluZGVudDppLG9uQ2hvbXBLZWVwOm8sb25Db21tZW50OmF9KXtjb25zdHtpbmRlbnQ6dSxvcHRpb25zOntjb21tZW50U3RyaW5nOmx9fT1uLGY9T2JqZWN0LmFzc2lnbih7fSxuLHtpbmRlbnQ6aSx0eXBlOm51bGx9KTtsZXQgYz0hMTtjb25zdCBwPVtdO2ZvcihsZXQgZD0wO2Q8dC5sZW5ndGg7KytkKXtjb25zdCBtPXRbZF07bGV0IGc9bnVsbDtpZihnZShtKSkhYyYmbS5zcGFjZUJlZm9yZSYmcC5wdXNoKCIiKSxwbChuLHAsbS5jb21tZW50QmVmb3JlLGMpLG0uY29tbWVudCYmKGc9bS5jb21tZW50KTtlbHNlIGlmKHllKG0pKXtjb25zdCBiPWdlKG0ua2V5KT9tLmtleTpudWxsO2ImJighYyYmYi5zcGFjZUJlZm9yZSYmcC5wdXNoKCIiKSxwbChuLHAsYi5jb21tZW50QmVmb3JlLGMpKX1jPSExO2xldCBEPUtpKG0sZiwoKT0+Zz1udWxsLCgpPT5jPSEwKTtnJiYoRCs9VnMoRCxpLGwoZykpKSxjJiZnJiYoYz0hMSkscC5wdXNoKHIrRCl9bGV0IGg7aWYocC5sZW5ndGg9PT0wKWg9cy5zdGFydCtzLmVuZDtlbHNle2g9cFswXTtmb3IobGV0IGQ9MTtkPHAubGVuZ3RoOysrZCl7Y29uc3QgbT1wW2RdO2grPW0/YAoke3V9JHttfWA6YApgfX1yZXR1cm4gZT8oaCs9YApgK0ZyKGwoZSksdSksYSYmYSgpKTpjJiZvJiZvKCksaH1mdW5jdGlvbiBNOSh7aXRlbXM6ZX0sdCx7Zmxvd0NoYXJzOm4saXRlbUluZGVudDpyfSl7Y29uc3R7aW5kZW50OnMsaW5kZW50U3RlcDppLGZsb3dDb2xsZWN0aW9uUGFkZGluZzpvLG9wdGlvbnM6e2NvbW1lbnRTdHJpbmc6YX19PXQ7cis9aTtjb25zdCB1PU9iamVjdC5hc3NpZ24oe30sdCx7aW5kZW50OnIsaW5GbG93OiEwLHR5cGU6bnVsbH0pO2xldCBsPSExLGY9MDtjb25zdCBjPVtdO2ZvcihsZXQgZD0wO2Q8ZS5sZW5ndGg7KytkKXtjb25zdCBtPWVbZF07bGV0IGc9bnVsbDtpZihnZShtKSltLnNwYWNlQmVmb3JlJiZjLnB1c2goIiIpLHBsKHQsYyxtLmNvbW1lbnRCZWZvcmUsITEpLG0uY29tbWVudCYmKGc9bS5jb21tZW50KTtlbHNlIGlmKHllKG0pKXtjb25zdCBiPWdlKG0ua2V5KT9tLmtleTpudWxsO2ImJihiLnNwYWNlQmVmb3JlJiZjLnB1c2goIiIpLHBsKHQsYyxiLmNvbW1lbnRCZWZvcmUsITEpLGIuY29tbWVudCYmKGw9ITApKTtjb25zdCBFPWdlKG0udmFsdWUpP20udmFsdWU6bnVsbDtFPyhFLmNvbW1lbnQmJihnPUUuY29tbWVudCksRS5jb21tZW50QmVmb3JlJiYobD0hMCkpOm0udmFsdWU9PW51bGwmJihiIT1udWxsJiZiLmNvbW1lbnQpJiYoZz1iLmNvbW1lbnQpfWcmJihsPSEwKTtsZXQgRD1LaShtLHUsKCk9Pmc9bnVsbCk7bHx8KGw9Yy5sZW5ndGg+Znx8RC5pbmNsdWRlcyhgCmApKSxkPGUubGVuZ3RoLTE/RCs9IiwiOnQub3B0aW9ucy50cmFpbGluZ0NvbW1hJiYodC5vcHRpb25zLmxpbmVXaWR0aD4wJiYobHx8KGw9Yy5yZWR1Y2UoKGIsRSk9PmIrRS5sZW5ndGgrMiwyKSsoRC5sZW5ndGgrMik+dC5vcHRpb25zLmxpbmVXaWR0aCkpLGwmJihEKz0iLCIpKSxnJiYoRCs9VnMoRCxyLGEoZykpKSxjLnB1c2goRCksZj1jLmxlbmd0aH1jb25zdHtzdGFydDpwLGVuZDpofT1uO2lmKGMubGVuZ3RoPT09MClyZXR1cm4gcCtoO2lmKCFsKXtjb25zdCBkPWMucmVkdWNlKChtLGcpPT5tK2cubGVuZ3RoKzIsMik7bD10Lm9wdGlvbnMubGluZVdpZHRoPjAmJmQ+dC5vcHRpb25zLmxpbmVXaWR0aH1pZihsKXtsZXQgZD1wO2Zvcihjb25zdCBtIG9mIGMpZCs9bT9gCiR7aX0ke3N9JHttfWA6YApgO3JldHVybmAke2R9CiR7c30ke2h9YH1lbHNlIHJldHVybmAke3B9JHtvfSR7Yy5qb2luKCIgIil9JHtvfSR7aH1gfWZ1bmN0aW9uIHBsKHtpbmRlbnQ6ZSxvcHRpb25zOntjb21tZW50U3RyaW5nOnR9fSxuLHIscyl7aWYociYmcyYmKHI9ci5yZXBsYWNlKC9eXG4rLywiIikpLHIpe2NvbnN0IGk9RnIodChyKSxlKTtuLnB1c2goaS50cmltU3RhcnQoKSl9fWZ1bmN0aW9uIFVzKGUsdCl7Y29uc3Qgbj1aKHQpP3QudmFsdWU6dDtmb3IoY29uc3QgciBvZiBlKWlmKHllKHIpJiYoci5rZXk9PT10fHxyLmtleT09PW58fFooci5rZXkpJiZyLmtleS52YWx1ZT09PW4pKXJldHVybiByfWNsYXNzIG1uIGV4dGVuZHMga3l7c3RhdGljIGdldCB0YWdOYW1lKCl7cmV0dXJuInRhZzp5YW1sLm9yZywyMDAyOm1hcCJ9Y29uc3RydWN0b3IodCl7c3VwZXIob3MsdCksdGhpcy5pdGVtcz1bXX1zdGF0aWMgZnJvbSh0LG4scil7Y29uc3R7a2VlcFVuZGVmaW5lZDpzLHJlcGxhY2VyOml9PXIsbz1uZXcgdGhpcyh0KSxhPSh1LGwpPT57aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpbD1pLmNhbGwobix1LGwpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShpKSYmIWkuaW5jbHVkZXModSkpcmV0dXJuOyhsIT09dm9pZCAwfHxzKSYmby5pdGVtcy5wdXNoKE1wKHUsbCxyKSl9O2lmKG4gaW5zdGFuY2VvZiBNYXApZm9yKGNvbnN0W3UsbF1vZiBuKWEodSxsKTtlbHNlIGlmKG4mJnR5cGVvZiBuPT0ib2JqZWN0Iilmb3IoY29uc3QgdSBvZiBPYmplY3Qua2V5cyhuKSlhKHUsblt1XSk7cmV0dXJuIHR5cGVvZiB0LnNvcnRNYXBFbnRyaWVzPT0iZnVuY3Rpb24iJiZvLml0ZW1zLnNvcnQodC5zb3J0TWFwRW50cmllcyksb31hZGQodCxuKXt2YXIgbztsZXQgcjt5ZSh0KT9yPXQ6IXR8fHR5cGVvZiB0IT0ib2JqZWN0Inx8ISgia2V5ImluIHQpP3I9bmV3IFN0KHQsdD09bnVsbD92b2lkIDA6dC52YWx1ZSk6cj1uZXcgU3QodC5rZXksdC52YWx1ZSk7Y29uc3Qgcz1Vcyh0aGlzLml0ZW1zLHIua2V5KSxpPShvPXRoaXMuc2NoZW1hKT09bnVsbD92b2lkIDA6by5zb3J0TWFwRW50cmllcztpZihzKXtpZighbil0aHJvdyBuZXcgRXJyb3IoYEtleSAke3Iua2V5fSBhbHJlYWR5IHNldGApO1oocy52YWx1ZSkmJnh5KHIudmFsdWUpP3MudmFsdWUudmFsdWU9ci52YWx1ZTpzLnZhbHVlPXIudmFsdWV9ZWxzZSBpZihpKXtjb25zdCBhPXRoaXMuaXRlbXMuZmluZEluZGV4KHU9Pmkocix1KTwwKTthPT09LTE/dGhpcy5pdGVtcy5wdXNoKHIpOnRoaXMuaXRlbXMuc3BsaWNlKGEsMCxyKX1lbHNlIHRoaXMuaXRlbXMucHVzaChyKX1kZWxldGUodCl7Y29uc3Qgbj1Vcyh0aGlzLml0ZW1zLHQpO3JldHVybiBuP3RoaXMuaXRlbXMuc3BsaWNlKHRoaXMuaXRlbXMuaW5kZXhPZihuKSwxKS5sZW5ndGg+MDohMX1nZXQodCxuKXtjb25zdCByPVVzKHRoaXMuaXRlbXMsdCkscz1yPT1udWxsP3ZvaWQgMDpyLnZhbHVlO3JldHVybighbiYmWihzKT9zLnZhbHVlOnMpPz92b2lkIDB9aGFzKHQpe3JldHVybiEhVXModGhpcy5pdGVtcyx0KX1zZXQodCxuKXt0aGlzLmFkZChuZXcgU3QodCxuKSwhMCl9dG9KU09OKHQsbixyKXtjb25zdCBzPXI/bmV3IHI6biE9bnVsbCYmbi5tYXBBc01hcD9uZXcgTWFwOnt9O24hPW51bGwmJm4ub25DcmVhdGUmJm4ub25DcmVhdGUocyk7Zm9yKGNvbnN0IGkgb2YgdGhpcy5pdGVtcylJeShuLHMsaSk7cmV0dXJuIHN9dG9TdHJpbmcodCxuLHIpe2lmKCF0KXJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtmb3IoY29uc3QgcyBvZiB0aGlzLml0ZW1zKWlmKCF5ZShzKSl0aHJvdyBuZXcgRXJyb3IoYE1hcCBpdGVtcyBtdXN0IGFsbCBiZSBwYWlyczsgZm91bmQgJHtKU09OLnN0cmluZ2lmeShzKX0gaW5zdGVhZGApO3JldHVybiF0LmFsbE51bGxWYWx1ZXMmJnRoaXMuaGFzQWxsTnVsbFZhbHVlcyghMSkmJih0PU9iamVjdC5hc3NpZ24oe30sdCx7YWxsTnVsbFZhbHVlczohMH0pKSxQeSh0aGlzLHQse2Jsb2NrSXRlbVByZWZpeDoiIixmbG93Q2hhcnM6e3N0YXJ0OiJ7IixlbmQ6In0ifSxpdGVtSW5kZW50OnQuaW5kZW50fHwiIixvbkNob21wS2VlcDpyLG9uQ29tbWVudDpufSl9fWNvbnN0IFhpPXtjb2xsZWN0aW9uOiJtYXAiLGRlZmF1bHQ6ITAsbm9kZUNsYXNzOm1uLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6bWFwIixyZXNvbHZlKGUsdCl7cmV0dXJuIHplKGUpfHx0KCJFeHBlY3RlZCBhIG1hcHBpbmcgZm9yIHRoaXMgdGFnIiksZX0sY3JlYXRlTm9kZTooZSx0LG4pPT5tbi5mcm9tKGUsdCxuKX07Y2xhc3MgcXMgZXh0ZW5kcyBreXtzdGF0aWMgZ2V0IHRhZ05hbWUoKXtyZXR1cm4idGFnOnlhbWwub3JnLDIwMDI6c2VxIn1jb25zdHJ1Y3Rvcih0KXtzdXBlcihXaSx0KSx0aGlzLml0ZW1zPVtdfWFkZCh0KXt0aGlzLml0ZW1zLnB1c2godCl9ZGVsZXRlKHQpe2NvbnN0IG49aGwodCk7cmV0dXJuIHR5cGVvZiBuIT0ibnVtYmVyIj8hMTp0aGlzLml0ZW1zLnNwbGljZShuLDEpLmxlbmd0aD4wfWdldCh0LG4pe2NvbnN0IHI9aGwodCk7aWYodHlwZW9mIHIhPSJudW1iZXIiKXJldHVybjtjb25zdCBzPXRoaXMuaXRlbXNbcl07cmV0dXJuIW4mJloocyk/cy52YWx1ZTpzfWhhcyh0KXtjb25zdCBuPWhsKHQpO3JldHVybiB0eXBlb2Ygbj09Im51bWJlciImJm48dGhpcy5pdGVtcy5sZW5ndGh9c2V0KHQsbil7Y29uc3Qgcj1obCh0KTtpZih0eXBlb2YgciE9Im51bWJlciIpdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBhIHZhbGlkIGluZGV4LCBub3QgJHt0fS5gKTtjb25zdCBzPXRoaXMuaXRlbXNbcl07WihzKSYmeHkobik/cy52YWx1ZT1uOnRoaXMuaXRlbXNbcl09bn10b0pTT04odCxuKXtjb25zdCByPVtdO24hPW51bGwmJm4ub25DcmVhdGUmJm4ub25DcmVhdGUocik7bGV0IHM9MDtmb3IoY29uc3QgaSBvZiB0aGlzLml0ZW1zKXIucHVzaChkbihpLFN0cmluZyhzKyspLG4pKTtyZXR1cm4gcn10b1N0cmluZyh0LG4scil7cmV0dXJuIHQ/UHkodGhpcyx0LHtibG9ja0l0ZW1QcmVmaXg6Ii0gIixmbG93Q2hhcnM6e3N0YXJ0OiJbIixlbmQ6Il0ifSxpdGVtSW5kZW50Oih0LmluZGVudHx8IiIpKyIgICIsb25DaG9tcEtlZXA6cixvbkNvbW1lbnQ6bn0pOkpTT04uc3RyaW5naWZ5KHRoaXMpfXN0YXRpYyBmcm9tKHQsbixyKXtjb25zdHtyZXBsYWNlcjpzfT1yLGk9bmV3IHRoaXModCk7aWYobiYmU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChuKSl7bGV0IG89MDtmb3IobGV0IGEgb2Ygbil7aWYodHlwZW9mIHM9PSJmdW5jdGlvbiIpe2NvbnN0IHU9biBpbnN0YW5jZW9mIFNldD9hOlN0cmluZyhvKyspO2E9cy5jYWxsKG4sdSxhKX1pLml0ZW1zLnB1c2goZGEoYSx2b2lkIDAscikpfX1yZXR1cm4gaX19ZnVuY3Rpb24gaGwoZSl7bGV0IHQ9WihlKT9lLnZhbHVlOmU7cmV0dXJuIHQmJnR5cGVvZiB0PT0ic3RyaW5nIiYmKHQ9TnVtYmVyKHQpKSx0eXBlb2YgdD09Im51bWJlciImJk51bWJlci5pc0ludGVnZXIodCkmJnQ+PTA/dDpudWxsfWNvbnN0IFlpPXtjb2xsZWN0aW9uOiJzZXEiLGRlZmF1bHQ6ITAsbm9kZUNsYXNzOnFzLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6c2VxIixyZXNvbHZlKGUsdCl7cmV0dXJuIFJlKGUpfHx0KCJFeHBlY3RlZCBhIHNlcXVlbmNlIGZvciB0aGlzIHRhZyIpLGV9LGNyZWF0ZU5vZGU6KGUsdCxuKT0+cXMuZnJvbShlLHQsbil9LGRsPXtpZGVudGlmeTplPT50eXBlb2YgZT09InN0cmluZyIsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOnN0ciIscmVzb2x2ZTplPT5lLHN0cmluZ2lmeShlLHQsbixyKXtyZXR1cm4gdD1PYmplY3QuYXNzaWduKHthY3R1YWxTdHJpbmc6ITB9LHQpLElwKGUsdCxuLHIpfX0sbWw9e2lkZW50aWZ5OmU9PmU9PW51bGwsY3JlYXRlTm9kZTooKT0+bmV3IHNlKG51bGwpLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjpudWxsIix0ZXN0Oi9eKD86fnxbTm5ddWxsfE5VTEwpPyQvLHJlc29sdmU6KCk9Pm5ldyBzZShudWxsKSxzdHJpbmdpZnk6KHtzb3VyY2U6ZX0sdCk9PnR5cGVvZiBlPT0ic3RyaW5nIiYmbWwudGVzdC50ZXN0KGUpP2U6dC5vcHRpb25zLm51bGxTdHJ9LE9wPXtpZGVudGlmeTplPT50eXBlb2YgZT09ImJvb2xlYW4iLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjpib29sIix0ZXN0Oi9eKD86W1R0XXJ1ZXxUUlVFfFtGZl1hbHNlfEZBTFNFKSQvLHJlc29sdmU6ZT0+bmV3IHNlKGVbMF09PT0idCJ8fGVbMF09PT0iVCIpLHN0cmluZ2lmeSh7c291cmNlOmUsdmFsdWU6dH0sbil7aWYoZSYmT3AudGVzdC50ZXN0KGUpKXtjb25zdCByPWVbMF09PT0idCJ8fGVbMF09PT0iVCI7aWYodD09PXIpcmV0dXJuIGV9cmV0dXJuIHQ/bi5vcHRpb25zLnRydWVTdHI6bi5vcHRpb25zLmZhbHNlU3RyfX07ZnVuY3Rpb24gT24oe2Zvcm1hdDplLG1pbkZyYWN0aW9uRGlnaXRzOnQsdGFnOm4sdmFsdWU6cn0pe2lmKHR5cGVvZiByPT0iYmlnaW50IilyZXR1cm4gU3RyaW5nKHIpO2NvbnN0IHM9dHlwZW9mIHI9PSJudW1iZXIiP3I6TnVtYmVyKHIpO2lmKCFpc0Zpbml0ZShzKSlyZXR1cm4gaXNOYU4ocyk/Ii5uYW4iOnM8MD8iLS5pbmYiOiIuaW5mIjtsZXQgaT1PYmplY3QuaXMociwtMCk/Ii0wIjpKU09OLnN0cmluZ2lmeShyKTtpZighZSYmdCYmKCFufHxuPT09InRhZzp5YW1sLm9yZywyMDAyOmZsb2F0IikmJi9eLT9cZC8udGVzdChpKSYmIWkuaW5jbHVkZXMoImUiKSl7bGV0IG89aS5pbmRleE9mKCIuIik7bzwwJiYobz1pLmxlbmd0aCxpKz0iLiIpO2xldCBhPXQtKGkubGVuZ3RoLW8tMSk7Zm9yKDthLS0gPjA7KWkrPSIwIn1yZXR1cm4gaX1jb25zdCBNeT17aWRlbnRpZnk6ZT0+dHlwZW9mIGU9PSJudW1iZXIiLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCIsdGVzdDovXig/OlstK10/XC4oPzppbmZ8SW5mfElORil8XC5uYW58XC5OYU58XC5OQU4pJC8scmVzb2x2ZTplPT5lLnNsaWNlKC0zKS50b0xvd2VyQ2FzZSgpPT09Im5hbiI/TmFOOmVbMF09PT0iLSI/TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOk51bWJlci5QT1NJVElWRV9JTkZJTklUWSxzdHJpbmdpZnk6T259LE95PXtpZGVudGlmeTplPT50eXBlb2YgZT09Im51bWJlciIsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmZsb2F0Iixmb3JtYXQ6IkVYUCIsdGVzdDovXlstK10/KD86XC5bMC05XSt8WzAtOV0rKD86XC5bMC05XSopPylbZUVdWy0rXT9bMC05XSskLyxyZXNvbHZlOmU9PnBhcnNlRmxvYXQoZSksc3RyaW5naWZ5KGUpe2NvbnN0IHQ9TnVtYmVyKGUudmFsdWUpO3JldHVybiBpc0Zpbml0ZSh0KT90LnRvRXhwb25lbnRpYWwoKTpPbihlKX19LFJ5PXtpZGVudGlmeTplPT50eXBlb2YgZT09Im51bWJlciIsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmZsb2F0Iix0ZXN0Oi9eWy0rXT8oPzpcLlswLTldK3xbMC05XStcLlswLTldKikkLyxyZXNvbHZlKGUpe2NvbnN0IHQ9bmV3IHNlKHBhcnNlRmxvYXQoZSkpLG49ZS5pbmRleE9mKCIuIik7cmV0dXJuIG4hPT0tMSYmZVtlLmxlbmd0aC0xXT09PSIwIiYmKHQubWluRnJhY3Rpb25EaWdpdHM9ZS5sZW5ndGgtbi0xKSx0fSxzdHJpbmdpZnk6T259LGdsPWU9PnR5cGVvZiBlPT0iYmlnaW50Inx8TnVtYmVyLmlzSW50ZWdlcihlKSxScD0oZSx0LG4se2ludEFzQmlnSW50OnJ9KT0+cj9CaWdJbnQoZSk6cGFyc2VJbnQoZS5zdWJzdHJpbmcodCksbik7ZnVuY3Rpb24gankoZSx0LG4pe2NvbnN0e3ZhbHVlOnJ9PWU7cmV0dXJuIGdsKHIpJiZyPj0wP24rci50b1N0cmluZyh0KTpPbihlKX1jb25zdCBWeT17aWRlbnRpZnk6ZT0+Z2woZSkmJmU+PTAsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmludCIsZm9ybWF0OiJPQ1QiLHRlc3Q6L14wb1swLTddKyQvLHJlc29sdmU6KGUsdCxuKT0+UnAoZSwyLDgsbiksc3RyaW5naWZ5OmU9Pmp5KGUsOCwiMG8iKX0sVXk9e2lkZW50aWZ5OmdsLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjppbnQiLHRlc3Q6L15bLStdP1swLTldKyQvLHJlc29sdmU6KGUsdCxuKT0+UnAoZSwwLDEwLG4pLHN0cmluZ2lmeTpPbn0scXk9e2lkZW50aWZ5OmU9PmdsKGUpJiZlPj0wLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjppbnQiLGZvcm1hdDoiSEVYIix0ZXN0Oi9eMHhbMC05YS1mQS1GXSskLyxyZXNvbHZlOihlLHQsbik9PlJwKGUsMiwxNixuKSxzdHJpbmdpZnk6ZT0+ankoZSwxNiwiMHgiKX0sTzk9W1hpLFlpLGRsLG1sLE9wLFZ5LFV5LHF5LE15LE95LFJ5XTtmdW5jdGlvbiBXeShlKXtyZXR1cm4gdHlwZW9mIGU9PSJiaWdpbnQifHxOdW1iZXIuaXNJbnRlZ2VyKGUpfWNvbnN0IHlsPSh7dmFsdWU6ZX0pPT5KU09OLnN0cmluZ2lmeShlKSxSOT1be2lkZW50aWZ5OmU9PnR5cGVvZiBlPT0ic3RyaW5nIixkZWZhdWx0OiEwLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6c3RyIixyZXNvbHZlOmU9PmUsc3RyaW5naWZ5OnlsfSx7aWRlbnRpZnk6ZT0+ZT09bnVsbCxjcmVhdGVOb2RlOigpPT5uZXcgc2UobnVsbCksZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOm51bGwiLHRlc3Q6L15udWxsJC8scmVzb2x2ZTooKT0+bnVsbCxzdHJpbmdpZnk6eWx9LHtpZGVudGlmeTplPT50eXBlb2YgZT09ImJvb2xlYW4iLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjpib29sIix0ZXN0Oi9edHJ1ZSR8XmZhbHNlJC8scmVzb2x2ZTplPT5lPT09InRydWUiLHN0cmluZ2lmeTp5bH0se2lkZW50aWZ5Old5LGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjppbnQiLHRlc3Q6L14tPyg/OjB8WzEtOV1bMC05XSopJC8scmVzb2x2ZTooZSx0LHtpbnRBc0JpZ0ludDpufSk9Pm4/QmlnSW50KGUpOnBhcnNlSW50KGUsMTApLHN0cmluZ2lmeTooe3ZhbHVlOmV9KT0+V3koZSk/ZS50b1N0cmluZygpOkpTT04uc3RyaW5naWZ5KGUpfSx7aWRlbnRpZnk6ZT0+dHlwZW9mIGU9PSJudW1iZXIiLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCIsdGVzdDovXi0/KD86MHxbMS05XVswLTldKikoPzpcLlswLTldKik/KD86W2VFXVstK10/WzAtOV0rKT8kLyxyZXNvbHZlOmU9PnBhcnNlRmxvYXQoZSksc3RyaW5naWZ5OnlsfV0sajk9e2RlZmF1bHQ6ITAsdGFnOiIiLHRlc3Q6L14vLHJlc29sdmUoZSx0KXtyZXR1cm4gdChgVW5yZXNvbHZlZCBwbGFpbiBzY2FsYXIgJHtKU09OLnN0cmluZ2lmeShlKX1gKSxlfX0sVjk9W1hpLFlpXS5jb25jYXQoUjksajkpLGpwPXtpZGVudGlmeTplPT5lIGluc3RhbmNlb2YgVWludDhBcnJheSxkZWZhdWx0OiExLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6YmluYXJ5IixyZXNvbHZlKGUsdCl7aWYodHlwZW9mIGF0b2I9PSJmdW5jdGlvbiIpe2NvbnN0IG49YXRvYihlLnJlcGxhY2UoL1tcblxyXS9nLCIiKSkscj1uZXcgVWludDhBcnJheShuLmxlbmd0aCk7Zm9yKGxldCBzPTA7czxuLmxlbmd0aDsrK3MpcltzXT1uLmNoYXJDb2RlQXQocyk7cmV0dXJuIHJ9ZWxzZSByZXR1cm4gdCgiVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IHJlYWRpbmcgYmluYXJ5IHRhZ3M7IGVpdGhlciBCdWZmZXIgb3IgYXRvYiBpcyByZXF1aXJlZCIpLGV9LHN0cmluZ2lmeSh7Y29tbWVudDplLHR5cGU6dCx2YWx1ZTpufSxyLHMsaSl7aWYoIW4pcmV0dXJuIiI7Y29uc3Qgbz1uO2xldCBhO2lmKHR5cGVvZiBidG9hPT0iZnVuY3Rpb24iKXtsZXQgdT0iIjtmb3IobGV0IGw9MDtsPG8ubGVuZ3RoOysrbCl1Kz1TdHJpbmcuZnJvbUNoYXJDb2RlKG9bbF0pO2E9YnRvYSh1KX1lbHNlIHRocm93IG5ldyBFcnJvcigiVGhpcyBlbnZpcm9ubWVudCBkb2VzIG5vdCBzdXBwb3J0IHdyaXRpbmcgYmluYXJ5IHRhZ3M7IGVpdGhlciBCdWZmZXIgb3IgYnRvYSBpcyByZXF1aXJlZCIpO2lmKHQ/Pyh0PXNlLkJMT0NLX0xJVEVSQUwpLHQhPT1zZS5RVU9URV9ET1VCTEUpe2NvbnN0IHU9TWF0aC5tYXgoci5vcHRpb25zLmxpbmVXaWR0aC1yLmluZGVudC5sZW5ndGgsci5vcHRpb25zLm1pbkNvbnRlbnRXaWR0aCksbD1NYXRoLmNlaWwoYS5sZW5ndGgvdSksZj1uZXcgQXJyYXkobCk7Zm9yKGxldCBjPTAscD0wO2M8bDsrK2MscCs9dSlmW2NdPWEuc3Vic3RyKHAsdSk7YT1mLmpvaW4odD09PXNlLkJMT0NLX0xJVEVSQUw/YApgOiIgIil9cmV0dXJuIElwKHtjb21tZW50OmUsdHlwZTp0LHZhbHVlOmF9LHIscyxpKX19O2Z1bmN0aW9uIEh5KGUsdCl7aWYoUmUoZSkpZm9yKGxldCBuPTA7bjxlLml0ZW1zLmxlbmd0aDsrK24pe2xldCByPWUuaXRlbXNbbl07aWYoIXllKHIpKXtpZih6ZShyKSl7ci5pdGVtcy5sZW5ndGg+MSYmdCgiRWFjaCBwYWlyIG11c3QgaGF2ZSBpdHMgb3duIHNlcXVlbmNlIGluZGljYXRvciIpO2NvbnN0IHM9ci5pdGVtc1swXXx8bmV3IFN0KG5ldyBzZShudWxsKSk7aWYoci5jb21tZW50QmVmb3JlJiYocy5rZXkuY29tbWVudEJlZm9yZT1zLmtleS5jb21tZW50QmVmb3JlP2Ake3IuY29tbWVudEJlZm9yZX0KJHtzLmtleS5jb21tZW50QmVmb3JlfWA6ci5jb21tZW50QmVmb3JlKSxyLmNvbW1lbnQpe2NvbnN0IGk9cy52YWx1ZT8/cy5rZXk7aS5jb21tZW50PWkuY29tbWVudD9gJHtyLmNvbW1lbnR9CiR7aS5jb21tZW50fWA6ci5jb21tZW50fXI9c31lLml0ZW1zW25dPXllKHIpP3I6bmV3IFN0KHIpfX1lbHNlIHQoIkV4cGVjdGVkIGEgc2VxdWVuY2UgZm9yIHRoaXMgdGFnIik7cmV0dXJuIGV9ZnVuY3Rpb24gSnkoZSx0LG4pe2NvbnN0e3JlcGxhY2VyOnJ9PW4scz1uZXcgcXMoZSk7cy50YWc9InRhZzp5YW1sLm9yZywyMDAyOnBhaXJzIjtsZXQgaT0wO2lmKHQmJlN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpZm9yKGxldCBvIG9mIHQpe3R5cGVvZiByPT0iZnVuY3Rpb24iJiYobz1yLmNhbGwodCxTdHJpbmcoaSsrKSxvKSk7bGV0IGEsdTtpZihBcnJheS5pc0FycmF5KG8pKWlmKG8ubGVuZ3RoPT09MilhPW9bMF0sdT1vWzFdO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgW2tleSwgdmFsdWVdIHR1cGxlOiAke299YCk7ZWxzZSBpZihvJiZvIGluc3RhbmNlb2YgT2JqZWN0KXtjb25zdCBsPU9iamVjdC5rZXlzKG8pO2lmKGwubGVuZ3RoPT09MSlhPWxbMF0sdT1vW2FdO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgdHVwbGUgd2l0aCBvbmUga2V5LCBub3QgJHtsLmxlbmd0aH0ga2V5c2ApfWVsc2UgYT1vO3MuaXRlbXMucHVzaChNcChhLHUsbikpfXJldHVybiBzfWNvbnN0IFZwPXtjb2xsZWN0aW9uOiJzZXEiLGRlZmF1bHQ6ITEsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjpwYWlycyIscmVzb2x2ZTpIeSxjcmVhdGVOb2RlOkp5fTtjbGFzcyBRaSBleHRlbmRzIHFze2NvbnN0cnVjdG9yKCl7c3VwZXIoKSx0aGlzLmFkZD1tbi5wcm90b3R5cGUuYWRkLmJpbmQodGhpcyksdGhpcy5kZWxldGU9bW4ucHJvdG90eXBlLmRlbGV0ZS5iaW5kKHRoaXMpLHRoaXMuZ2V0PW1uLnByb3RvdHlwZS5nZXQuYmluZCh0aGlzKSx0aGlzLmhhcz1tbi5wcm90b3R5cGUuaGFzLmJpbmQodGhpcyksdGhpcy5zZXQ9bW4ucHJvdG90eXBlLnNldC5iaW5kKHRoaXMpLHRoaXMudGFnPVFpLnRhZ310b0pTT04odCxuKXtpZighbilyZXR1cm4gc3VwZXIudG9KU09OKHQpO2NvbnN0IHI9bmV3IE1hcDtuIT1udWxsJiZuLm9uQ3JlYXRlJiZuLm9uQ3JlYXRlKHIpO2Zvcihjb25zdCBzIG9mIHRoaXMuaXRlbXMpe2xldCBpLG87aWYoeWUocyk/KGk9ZG4ocy5rZXksIiIsbiksbz1kbihzLnZhbHVlLGksbikpOmk9ZG4ocywiIixuKSxyLmhhcyhpKSl0aHJvdyBuZXcgRXJyb3IoIk9yZGVyZWQgbWFwcyBtdXN0IG5vdCBpbmNsdWRlIGR1cGxpY2F0ZSBrZXlzIik7ci5zZXQoaSxvKX1yZXR1cm4gcn1zdGF0aWMgZnJvbSh0LG4scil7Y29uc3Qgcz1KeSh0LG4sciksaT1uZXcgdGhpcztyZXR1cm4gaS5pdGVtcz1zLml0ZW1zLGl9fVFpLnRhZz0idGFnOnlhbWwub3JnLDIwMDI6b21hcCI7Y29uc3QgVXA9e2NvbGxlY3Rpb246InNlcSIsaWRlbnRpZnk6ZT0+ZSBpbnN0YW5jZW9mIE1hcCxub2RlQ2xhc3M6UWksZGVmYXVsdDohMSx0YWc6InRhZzp5YW1sLm9yZywyMDAyOm9tYXAiLHJlc29sdmUoZSx0KXtjb25zdCBuPUh5KGUsdCkscj1bXTtmb3IoY29uc3R7a2V5OnN9b2Ygbi5pdGVtcylaKHMpJiYoci5pbmNsdWRlcyhzLnZhbHVlKT90KGBPcmRlcmVkIG1hcHMgbXVzdCBub3QgaW5jbHVkZSBkdXBsaWNhdGUga2V5czogJHtzLnZhbHVlfWApOnIucHVzaChzLnZhbHVlKSk7cmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IFFpLG4pfSxjcmVhdGVOb2RlOihlLHQsbik9PlFpLmZyb20oZSx0LG4pfTtmdW5jdGlvbiB6eSh7dmFsdWU6ZSxzb3VyY2U6dH0sbil7cmV0dXJuIHQmJihlP0d5Okt5KS50ZXN0LnRlc3QodCk/dDplP24ub3B0aW9ucy50cnVlU3RyOm4ub3B0aW9ucy5mYWxzZVN0cn1jb25zdCBHeT17aWRlbnRpZnk6ZT0+ZT09PSEwLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjpib29sIix0ZXN0Oi9eKD86WXx5fFtZeV1lc3xZRVN8W1R0XXJ1ZXxUUlVFfFtPb11ufE9OKSQvLHJlc29sdmU6KCk9Pm5ldyBzZSghMCksc3RyaW5naWZ5Onp5fSxLeT17aWRlbnRpZnk6ZT0+ZT09PSExLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjpib29sIix0ZXN0Oi9eKD86TnxufFtObl1vfE5PfFtGZl1hbHNlfEZBTFNFfFtPb11mZnxPRkYpJC8scmVzb2x2ZTooKT0+bmV3IHNlKCExKSxzdHJpbmdpZnk6enl9LFU5PXtpZGVudGlmeTplPT50eXBlb2YgZT09Im51bWJlciIsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmZsb2F0Iix0ZXN0Oi9eKD86Wy0rXT9cLig/OmluZnxJbmZ8SU5GKXxcLm5hbnxcLk5hTnxcLk5BTikkLyxyZXNvbHZlOmU9PmUuc2xpY2UoLTMpLnRvTG93ZXJDYXNlKCk9PT0ibmFuIj9OYU46ZVswXT09PSItIj9OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLHN0cmluZ2lmeTpPbn0scTk9e2lkZW50aWZ5OmU9PnR5cGVvZiBlPT0ibnVtYmVyIixkZWZhdWx0OiEwLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQiLGZvcm1hdDoiRVhQIix0ZXN0Oi9eWy0rXT8oPzpbMC05XVswLTlfXSopPyg/OlwuWzAtOV9dKik/W2VFXVstK10/WzAtOV0rJC8scmVzb2x2ZTplPT5wYXJzZUZsb2F0KGUucmVwbGFjZSgvXy9nLCIiKSksc3RyaW5naWZ5KGUpe2NvbnN0IHQ9TnVtYmVyKGUudmFsdWUpO3JldHVybiBpc0Zpbml0ZSh0KT90LnRvRXhwb25lbnRpYWwoKTpPbihlKX19LFc5PXtpZGVudGlmeTplPT50eXBlb2YgZT09Im51bWJlciIsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmZsb2F0Iix0ZXN0Oi9eWy0rXT8oPzpbMC05XVswLTlfXSopP1wuWzAtOV9dKiQvLHJlc29sdmUoZSl7Y29uc3QgdD1uZXcgc2UocGFyc2VGbG9hdChlLnJlcGxhY2UoL18vZywiIikpKSxuPWUuaW5kZXhPZigiLiIpO2lmKG4hPT0tMSl7Y29uc3Qgcj1lLnN1YnN0cmluZyhuKzEpLnJlcGxhY2UoL18vZywiIik7cltyLmxlbmd0aC0xXT09PSIwIiYmKHQubWluRnJhY3Rpb25EaWdpdHM9ci5sZW5ndGgpfXJldHVybiB0fSxzdHJpbmdpZnk6T259LHlhPWU9PnR5cGVvZiBlPT0iYmlnaW50Inx8TnVtYmVyLmlzSW50ZWdlcihlKTtmdW5jdGlvbiBEbChlLHQsbix7aW50QXNCaWdJbnQ6cn0pe2NvbnN0IHM9ZVswXTtpZigocz09PSItInx8cz09PSIrIikmJih0Kz0xKSxlPWUuc3Vic3RyaW5nKHQpLnJlcGxhY2UoL18vZywiIikscil7c3dpdGNoKG4pe2Nhc2UgMjplPWAwYiR7ZX1gO2JyZWFrO2Nhc2UgODplPWAwbyR7ZX1gO2JyZWFrO2Nhc2UgMTY6ZT1gMHgke2V9YDticmVha31jb25zdCBvPUJpZ0ludChlKTtyZXR1cm4gcz09PSItIj9CaWdJbnQoLTEpKm86b31jb25zdCBpPXBhcnNlSW50KGUsbik7cmV0dXJuIHM9PT0iLSI/LTEqaTppfWZ1bmN0aW9uIHFwKGUsdCxuKXtjb25zdHt2YWx1ZTpyfT1lO2lmKHlhKHIpKXtjb25zdCBzPXIudG9TdHJpbmcodCk7cmV0dXJuIHI8MD8iLSIrbitzLnN1YnN0cigxKTpuK3N9cmV0dXJuIE9uKGUpfWNvbnN0IEg5PXtpZGVudGlmeTp5YSxkZWZhdWx0OiEwLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6aW50Iixmb3JtYXQ6IkJJTiIsdGVzdDovXlstK10/MGJbMC0xX10rJC8scmVzb2x2ZTooZSx0LG4pPT5EbChlLDIsMixuKSxzdHJpbmdpZnk6ZT0+cXAoZSwyLCIwYiIpfSxKOT17aWRlbnRpZnk6eWEsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmludCIsZm9ybWF0OiJPQ1QiLHRlc3Q6L15bLStdPzBbMC03X10rJC8scmVzb2x2ZTooZSx0LG4pPT5EbChlLDEsOCxuKSxzdHJpbmdpZnk6ZT0+cXAoZSw4LCIwIil9LHo5PXtpZGVudGlmeTp5YSxkZWZhdWx0OiEwLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6aW50Iix0ZXN0Oi9eWy0rXT9bMC05XVswLTlfXSokLyxyZXNvbHZlOihlLHQsbik9PkRsKGUsMCwxMCxuKSxzdHJpbmdpZnk6T259LEc5PXtpZGVudGlmeTp5YSxkZWZhdWx0OiEwLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6aW50Iixmb3JtYXQ6IkhFWCIsdGVzdDovXlstK10/MHhbMC05YS1mQS1GX10rJC8scmVzb2x2ZTooZSx0LG4pPT5EbChlLDIsMTYsbiksc3RyaW5naWZ5OmU9PnFwKGUsMTYsIjB4Iil9O2NsYXNzIFppIGV4dGVuZHMgbW57Y29uc3RydWN0b3IodCl7c3VwZXIodCksdGhpcy50YWc9WmkudGFnfWFkZCh0KXtsZXQgbjt5ZSh0KT9uPXQ6dCYmdHlwZW9mIHQ9PSJvYmplY3QiJiYia2V5ImluIHQmJiJ2YWx1ZSJpbiB0JiZ0LnZhbHVlPT09bnVsbD9uPW5ldyBTdCh0LmtleSxudWxsKTpuPW5ldyBTdCh0LG51bGwpLFVzKHRoaXMuaXRlbXMsbi5rZXkpfHx0aGlzLml0ZW1zLnB1c2gobil9Z2V0KHQsbil7Y29uc3Qgcj1Vcyh0aGlzLml0ZW1zLHQpO3JldHVybiFuJiZ5ZShyKT9aKHIua2V5KT9yLmtleS52YWx1ZTpyLmtleTpyfXNldCh0LG4pe2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBib29sZWFuIHZhbHVlIGZvciBzZXQoa2V5LCB2YWx1ZSkgaW4gYSBZQU1MIHNldCwgbm90ICR7dHlwZW9mIG59YCk7Y29uc3Qgcj1Vcyh0aGlzLml0ZW1zLHQpO3ImJiFuP3RoaXMuaXRlbXMuc3BsaWNlKHRoaXMuaXRlbXMuaW5kZXhPZihyKSwxKTohciYmbiYmdGhpcy5pdGVtcy5wdXNoKG5ldyBTdCh0KSl9dG9KU09OKHQsbil7cmV0dXJuIHN1cGVyLnRvSlNPTih0LG4sU2V0KX10b1N0cmluZyh0LG4scil7aWYoIXQpcmV0dXJuIEpTT04uc3RyaW5naWZ5KHRoaXMpO2lmKHRoaXMuaGFzQWxsTnVsbFZhbHVlcyghMCkpcmV0dXJuIHN1cGVyLnRvU3RyaW5nKE9iamVjdC5hc3NpZ24oe30sdCx7YWxsTnVsbFZhbHVlczohMH0pLG4scik7dGhyb3cgbmV3IEVycm9yKCJTZXQgaXRlbXMgbXVzdCBhbGwgaGF2ZSBudWxsIHZhbHVlcyIpfXN0YXRpYyBmcm9tKHQsbixyKXtjb25zdHtyZXBsYWNlcjpzfT1yLGk9bmV3IHRoaXModCk7aWYobiYmU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdChuKSlmb3IobGV0IG8gb2Ygbil0eXBlb2Ygcz09ImZ1bmN0aW9uIiYmKG89cy5jYWxsKG4sbyxvKSksaS5pdGVtcy5wdXNoKE1wKG8sbnVsbCxyKSk7cmV0dXJuIGl9fVppLnRhZz0idGFnOnlhbWwub3JnLDIwMDI6c2V0Ijtjb25zdCBXcD17Y29sbGVjdGlvbjoibWFwIixpZGVudGlmeTplPT5lIGluc3RhbmNlb2YgU2V0LG5vZGVDbGFzczpaaSxkZWZhdWx0OiExLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6c2V0IixjcmVhdGVOb2RlOihlLHQsbik9PlppLmZyb20oZSx0LG4pLHJlc29sdmUoZSx0KXtpZih6ZShlKSl7aWYoZS5oYXNBbGxOdWxsVmFsdWVzKCEwKSlyZXR1cm4gT2JqZWN0LmFzc2lnbihuZXcgWmksZSk7dCgiU2V0IGl0ZW1zIG11c3QgYWxsIGhhdmUgbnVsbCB2YWx1ZXMiKX1lbHNlIHQoIkV4cGVjdGVkIGEgbWFwcGluZyBmb3IgdGhpcyB0YWciKTtyZXR1cm4gZX19O2Z1bmN0aW9uIEhwKGUsdCl7Y29uc3Qgbj1lWzBdLHI9bj09PSItInx8bj09PSIrIj9lLnN1YnN0cmluZygxKTplLHM9bz0+dD9CaWdJbnQobyk6TnVtYmVyKG8pLGk9ci5yZXBsYWNlKC9fL2csIiIpLnNwbGl0KCI6IikucmVkdWNlKChvLGEpPT5vKnMoNjApK3MoYSkscygwKSk7cmV0dXJuIG49PT0iLSI/cygtMSkqaTppfWZ1bmN0aW9uIFh5KGUpe2xldHt2YWx1ZTp0fT1lLG49bz0+bztpZih0eXBlb2YgdD09ImJpZ2ludCIpbj1vPT5CaWdJbnQobyk7ZWxzZSBpZihpc05hTih0KXx8IWlzRmluaXRlKHQpKXJldHVybiBPbihlKTtsZXQgcj0iIjt0PDAmJihyPSItIix0Kj1uKC0xKSk7Y29uc3Qgcz1uKDYwKSxpPVt0JXNdO3JldHVybiB0PDYwP2kudW5zaGlmdCgwKToodD0odC1pWzBdKS9zLGkudW5zaGlmdCh0JXMpLHQ+PTYwJiYodD0odC1pWzBdKS9zLGkudW5zaGlmdCh0KSkpLHIraS5tYXAobz0+U3RyaW5nKG8pLnBhZFN0YXJ0KDIsIjAiKSkuam9pbigiOiIpLnJlcGxhY2UoLzAwMDAwMFxkKiQvLCIiKX1jb25zdCBZeT17aWRlbnRpZnk6ZT0+dHlwZW9mIGU9PSJiaWdpbnQifHxOdW1iZXIuaXNJbnRlZ2VyKGUpLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjppbnQiLGZvcm1hdDoiVElNRSIsdGVzdDovXlstK10/WzAtOV1bMC05X10qKD86OlswLTVdP1swLTldKSskLyxyZXNvbHZlOihlLHQse2ludEFzQmlnSW50Om59KT0+SHAoZSxuKSxzdHJpbmdpZnk6WHl9LFF5PXtpZGVudGlmeTplPT50eXBlb2YgZT09Im51bWJlciIsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmZsb2F0Iixmb3JtYXQ6IlRJTUUiLHRlc3Q6L15bLStdP1swLTldWzAtOV9dKig/OjpbMC01XT9bMC05XSkrXC5bMC05X10qJC8scmVzb2x2ZTplPT5IcChlLCExKSxzdHJpbmdpZnk6WHl9LGJsPXtpZGVudGlmeTplPT5lIGluc3RhbmNlb2YgRGF0ZSxkZWZhdWx0OiEwLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wIix0ZXN0OlJlZ0V4cCgiXihbMC05XXs0fSktKFswLTldezEsMn0pLShbMC05XXsxLDJ9KSg/Oig/OnR8VHxbIFxcdF0rKShbMC05XXsxLDJ9KTooWzAtOV17MSwyfSk6KFswLTldezEsMn0oXFwuWzAtOV0rKT8pKD86WyBcXHRdKihafFstK11bMDEyXT9bMC05XSg/OjpbMC05XXsyfSk/KSk/KT8kIikscmVzb2x2ZShlKXtjb25zdCB0PWUubWF0Y2goYmwudGVzdCk7aWYoIXQpdGhyb3cgbmV3IEVycm9yKCIhIXRpbWVzdGFtcCBleHBlY3RzIGEgZGF0ZSwgc3RhcnRpbmcgd2l0aCB5eXl5LW1tLWRkIik7Y29uc3RbLG4scixzLGksbyxhXT10Lm1hcChOdW1iZXIpLHU9dFs3XT9OdW1iZXIoKHRbN10rIjAwIikuc3Vic3RyKDEsMykpOjA7bGV0IGw9RGF0ZS5VVEMobixyLTEscyxpfHwwLG98fDAsYXx8MCx1KTtjb25zdCBmPXRbOF07aWYoZiYmZiE9PSJaIil7bGV0IGM9SHAoZiwhMSk7TWF0aC5hYnMoYyk8MzAmJihjKj02MCksbC09NmU0KmN9cmV0dXJuIG5ldyBEYXRlKGwpfSxzdHJpbmdpZnk6KHt2YWx1ZTplfSk9PihlPT1udWxsP3ZvaWQgMDplLnRvSVNPU3RyaW5nKCkucmVwbGFjZSgvKFQwMDowMDowMCk/XC4wMDBaJC8sIiIpKT8/IiJ9LFp5PVtYaSxZaSxkbCxtbCxHeSxLeSxIOSxKOSx6OSxHOSxVOSxxOSxXOSxqcCxBcixVcCxWcCxXcCxZeSxReSxibF0sZUQ9bmV3IE1hcChbWyJjb3JlIixPOV0sWyJmYWlsc2FmZSIsW1hpLFlpLGRsXV0sWyJqc29uIixWOV0sWyJ5YW1sMTEiLFp5XSxbInlhbWwtMS4xIixaeV1dKSx0RD17YmluYXJ5OmpwLGJvb2w6T3AsZmxvYXQ6UnksZmxvYXRFeHA6T3ksZmxvYXROYU46TXksZmxvYXRUaW1lOlF5LGludDpVeSxpbnRIZXg6cXksaW50T2N0OlZ5LGludFRpbWU6WXksbWFwOlhpLG1lcmdlOkFyLG51bGw6bWwsb21hcDpVcCxwYWlyczpWcCxzZXE6WWksc2V0OldwLHRpbWVzdGFtcDpibH0sSzk9eyJ0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnkiOmpwLCJ0YWc6eWFtbC5vcmcsMjAwMjptZXJnZSI6QXIsInRhZzp5YW1sLm9yZywyMDAyOm9tYXAiOlVwLCJ0YWc6eWFtbC5vcmcsMjAwMjpwYWlycyI6VnAsInRhZzp5YW1sLm9yZywyMDAyOnNldCI6V3AsInRhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCI6Ymx9O2Z1bmN0aW9uIEpwKGUsdCxuKXtjb25zdCByPWVELmdldCh0KTtpZihyJiYhZSlyZXR1cm4gbiYmIXIuaW5jbHVkZXMoQXIpP3IuY29uY2F0KEFyKTpyLnNsaWNlKCk7bGV0IHM9cjtpZighcylpZihBcnJheS5pc0FycmF5KGUpKXM9W107ZWxzZXtjb25zdCBpPUFycmF5LmZyb20oZUQua2V5cygpKS5maWx0ZXIobz0+byE9PSJ5YW1sMTEiKS5tYXAobz0+SlNPTi5zdHJpbmdpZnkobykpLmpvaW4oIiwgIik7dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIHNjaGVtYSAiJHt0fSI7IHVzZSBvbmUgb2YgJHtpfSBvciBkZWZpbmUgY3VzdG9tVGFncyBhcnJheWApfWlmKEFycmF5LmlzQXJyYXkoZSkpZm9yKGNvbnN0IGkgb2YgZSlzPXMuY29uY2F0KGkpO2Vsc2UgdHlwZW9mIGU9PSJmdW5jdGlvbiImJihzPWUocy5zbGljZSgpKSk7cmV0dXJuIG4mJihzPXMuY29uY2F0KEFyKSkscy5yZWR1Y2UoKGksbyk9Pntjb25zdCBhPXR5cGVvZiBvPT0ic3RyaW5nIj90RFtvXTpvO2lmKCFhKXtjb25zdCB1PUpTT04uc3RyaW5naWZ5KG8pLGw9T2JqZWN0LmtleXModEQpLm1hcChmPT5KU09OLnN0cmluZ2lmeShmKSkuam9pbigiLCAiKTt0aHJvdyBuZXcgRXJyb3IoYFVua25vd24gY3VzdG9tIHRhZyAke3V9OyB1c2Ugb25lIG9mICR7bH1gKX1yZXR1cm4gaS5pbmNsdWRlcyhhKXx8aS5wdXNoKGEpLGl9LFtdKX1jb25zdCBYOT0oZSx0KT0+ZS5rZXk8dC5rZXk/LTE6ZS5rZXk+dC5rZXk/MTowO2NsYXNzIHpwe2NvbnN0cnVjdG9yKHtjb21wYXQ6dCxjdXN0b21UYWdzOm4sbWVyZ2U6cixyZXNvbHZlS25vd25UYWdzOnMsc2NoZW1hOmksc29ydE1hcEVudHJpZXM6byx0b1N0cmluZ0RlZmF1bHRzOmF9KXt0aGlzLmNvbXBhdD1BcnJheS5pc0FycmF5KHQpP0pwKHQsImNvbXBhdCIpOnQ/SnAobnVsbCx0KTpudWxsLHRoaXMubmFtZT10eXBlb2YgaT09InN0cmluZyImJml8fCJjb3JlIix0aGlzLmtub3duVGFncz1zP0s5Ont9LHRoaXMudGFncz1KcChuLHRoaXMubmFtZSxyKSx0aGlzLnRvU3RyaW5nT3B0aW9ucz1hPz9udWxsLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLG9zLHt2YWx1ZTpYaX0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLGVyLHt2YWx1ZTpkbH0pLE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLFdpLHt2YWx1ZTpZaX0pLHRoaXMuc29ydE1hcEVudHJpZXM9dHlwZW9mIG89PSJmdW5jdGlvbiI/bzpvPT09ITA/WDk6bnVsbH1jbG9uZSgpe2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZSh6cC5wcm90b3R5cGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModGhpcykpO3JldHVybiB0LnRhZ3M9dGhpcy50YWdzLnNsaWNlKCksdH19ZnVuY3Rpb24gWTkoZSx0KXt2YXIgdTtjb25zdCBuPVtdO2xldCByPXQuZGlyZWN0aXZlcz09PSEwO2lmKHQuZGlyZWN0aXZlcyE9PSExJiZlLmRpcmVjdGl2ZXMpe2NvbnN0IGw9ZS5kaXJlY3RpdmVzLnRvU3RyaW5nKGUpO2w/KG4ucHVzaChsKSxyPSEwKTplLmRpcmVjdGl2ZXMuZG9jU3RhcnQmJihyPSEwKX1yJiZuLnB1c2goIi0tLSIpO2NvbnN0IHM9THkoZSx0KSx7Y29tbWVudFN0cmluZzppfT1zLm9wdGlvbnM7aWYoZS5jb21tZW50QmVmb3JlKXtuLmxlbmd0aCE9PTEmJm4udW5zaGlmdCgiIik7Y29uc3QgbD1pKGUuY29tbWVudEJlZm9yZSk7bi51bnNoaWZ0KEZyKGwsIiIpKX1sZXQgbz0hMSxhPW51bGw7aWYoZS5jb250ZW50cyl7aWYoZ2UoZS5jb250ZW50cykpe2lmKGUuY29udGVudHMuc3BhY2VCZWZvcmUmJnImJm4ucHVzaCgiIiksZS5jb250ZW50cy5jb21tZW50QmVmb3JlKXtjb25zdCBjPWkoZS5jb250ZW50cy5jb21tZW50QmVmb3JlKTtuLnB1c2goRnIoYywiIikpfXMuZm9yY2VCbG9ja0luZGVudD0hIWUuY29tbWVudCxhPWUuY29udGVudHMuY29tbWVudH1jb25zdCBsPWE/dm9pZCAwOigpPT5vPSEwO2xldCBmPUtpKGUuY29udGVudHMscywoKT0+YT1udWxsLGwpO2EmJihmKz1WcyhmLCIiLGkoYSkpKSwoZlswXT09PSJ8Inx8ZlswXT09PSI+IikmJm5bbi5sZW5ndGgtMV09PT0iLS0tIj9uW24ubGVuZ3RoLTFdPWAtLS0gJHtmfWA6bi5wdXNoKGYpfWVsc2Ugbi5wdXNoKEtpKGUuY29udGVudHMscykpO2lmKCh1PWUuZGlyZWN0aXZlcykhPW51bGwmJnUuZG9jRW5kKWlmKGUuY29tbWVudCl7Y29uc3QgbD1pKGUuY29tbWVudCk7bC5pbmNsdWRlcyhgCmApPyhuLnB1c2goIi4uLiIpLG4ucHVzaChGcihsLCIiKSkpOm4ucHVzaChgLi4uICR7bH1gKX1lbHNlIG4ucHVzaCgiLi4uIik7ZWxzZXtsZXQgbD1lLmNvbW1lbnQ7bCYmbyYmKGw9bC5yZXBsYWNlKC9eXG4rLywiIikpLGwmJigoIW98fGEpJiZuW24ubGVuZ3RoLTFdIT09IiImJm4ucHVzaCgiIiksbi5wdXNoKEZyKGkobCksIiIpKSl9cmV0dXJuIG4uam9pbihgCmApK2AKYH1jbGFzcyBEYXtjb25zdHJ1Y3Rvcih0LG4scil7dGhpcy5jb21tZW50QmVmb3JlPW51bGwsdGhpcy5jb21tZW50PW51bGwsdGhpcy5lcnJvcnM9W10sdGhpcy53YXJuaW5ncz1bXSxPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxobix7dmFsdWU6VHB9KTtsZXQgcz1udWxsO3R5cGVvZiBuPT0iZnVuY3Rpb24ifHxBcnJheS5pc0FycmF5KG4pP3M9bjpyPT09dm9pZCAwJiZuJiYocj1uLG49dm9pZCAwKTtjb25zdCBpPU9iamVjdC5hc3NpZ24oe2ludEFzQmlnSW50OiExLGtlZXBTb3VyY2VUb2tlbnM6ITEsbG9nTGV2ZWw6Indhcm4iLHByZXR0eUVycm9yczohMCxzdHJpY3Q6ITAsc3RyaW5nS2V5czohMSx1bmlxdWVLZXlzOiEwLHZlcnNpb246IjEuMiJ9LHIpO3RoaXMub3B0aW9ucz1pO2xldHt2ZXJzaW9uOm99PWk7ciE9bnVsbCYmci5fZGlyZWN0aXZlcz8odGhpcy5kaXJlY3RpdmVzPXIuX2RpcmVjdGl2ZXMuYXREb2N1bWVudCgpLHRoaXMuZGlyZWN0aXZlcy55YW1sLmV4cGxpY2l0JiYobz10aGlzLmRpcmVjdGl2ZXMueWFtbC52ZXJzaW9uKSk6dGhpcy5kaXJlY3RpdmVzPW5ldyBDdCh7dmVyc2lvbjpvfSksdGhpcy5zZXRTY2hlbWEobyxyKSx0aGlzLmNvbnRlbnRzPXQ9PT12b2lkIDA/bnVsbDp0aGlzLmNyZWF0ZU5vZGUodCxzLHIpfWNsb25lKCl7Y29uc3QgdD1PYmplY3QuY3JlYXRlKERhLnByb3RvdHlwZSx7W2huXTp7dmFsdWU6VHB9fSk7cmV0dXJuIHQuY29tbWVudEJlZm9yZT10aGlzLmNvbW1lbnRCZWZvcmUsdC5jb21tZW50PXRoaXMuY29tbWVudCx0LmVycm9ycz10aGlzLmVycm9ycy5zbGljZSgpLHQud2FybmluZ3M9dGhpcy53YXJuaW5ncy5zbGljZSgpLHQub3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LHRoaXMub3B0aW9ucyksdGhpcy5kaXJlY3RpdmVzJiYodC5kaXJlY3RpdmVzPXRoaXMuZGlyZWN0aXZlcy5jbG9uZSgpKSx0LnNjaGVtYT10aGlzLnNjaGVtYS5jbG9uZSgpLHQuY29udGVudHM9Z2UodGhpcy5jb250ZW50cyk/dGhpcy5jb250ZW50cy5jbG9uZSh0LnNjaGVtYSk6dGhpcy5jb250ZW50cyx0aGlzLnJhbmdlJiYodC5yYW5nZT10aGlzLnJhbmdlLnNsaWNlKCkpLHR9YWRkKHQpe2VvKHRoaXMuY29udGVudHMpJiZ0aGlzLmNvbnRlbnRzLmFkZCh0KX1hZGRJbih0LG4pe2VvKHRoaXMuY29udGVudHMpJiZ0aGlzLmNvbnRlbnRzLmFkZEluKHQsbil9Y3JlYXRlQWxpYXModCxuKXtpZighdC5hbmNob3Ipe2NvbnN0IHI9Q3kodGhpcyk7dC5hbmNob3I9IW58fHIuaGFzKG4pP1N5KG58fCJhIixyKTpufXJldHVybiBuZXcgTHAodC5hbmNob3IpfWNyZWF0ZU5vZGUodCxuLHIpe2xldCBzO2lmKHR5cGVvZiBuPT0iZnVuY3Rpb24iKXQ9bi5jYWxsKHsiIjp0fSwiIix0KSxzPW47ZWxzZSBpZihBcnJheS5pc0FycmF5KG4pKXtjb25zdCBnPWI9PnR5cGVvZiBiPT0ibnVtYmVyInx8YiBpbnN0YW5jZW9mIFN0cmluZ3x8YiBpbnN0YW5jZW9mIE51bWJlcixEPW4uZmlsdGVyKGcpLm1hcChTdHJpbmcpO0QubGVuZ3RoPjAmJihuPW4uY29uY2F0KEQpKSxzPW59ZWxzZSByPT09dm9pZCAwJiZuJiYocj1uLG49dm9pZCAwKTtjb25zdHthbGlhc0R1cGxpY2F0ZU9iamVjdHM6aSxhbmNob3JQcmVmaXg6byxmbG93OmEsa2VlcFVuZGVmaW5lZDp1LG9uVGFnT2JqOmwsdGFnOmZ9PXI/P3t9LHtvbkFuY2hvcjpjLHNldEFuY2hvcnM6cCxzb3VyY2VPYmplY3RzOmh9PUM5KHRoaXMsb3x8ImEiKSxkPXthbGlhc0R1cGxpY2F0ZU9iamVjdHM6aT8/ITAsa2VlcFVuZGVmaW5lZDp1Pz8hMSxvbkFuY2hvcjpjLG9uVGFnT2JqOmwscmVwbGFjZXI6cyxzY2hlbWE6dGhpcy5zY2hlbWEsc291cmNlT2JqZWN0czpofSxtPWRhKHQsZixkKTtyZXR1cm4gYSYmSWUobSkmJihtLmZsb3c9ITApLHAoKSxtfWNyZWF0ZVBhaXIodCxuLHI9e30pe2NvbnN0IHM9dGhpcy5jcmVhdGVOb2RlKHQsbnVsbCxyKSxpPXRoaXMuY3JlYXRlTm9kZShuLG51bGwscik7cmV0dXJuIG5ldyBTdChzLGkpfWRlbGV0ZSh0KXtyZXR1cm4gZW8odGhpcy5jb250ZW50cyk/dGhpcy5jb250ZW50cy5kZWxldGUodCk6ITF9ZGVsZXRlSW4odCl7cmV0dXJuIG1hKHQpP3RoaXMuY29udGVudHM9PW51bGw/ITE6KHRoaXMuY29udGVudHM9bnVsbCwhMCk6ZW8odGhpcy5jb250ZW50cyk/dGhpcy5jb250ZW50cy5kZWxldGVJbih0KTohMX1nZXQodCxuKXtyZXR1cm4gSWUodGhpcy5jb250ZW50cyk/dGhpcy5jb250ZW50cy5nZXQodCxuKTp2b2lkIDB9Z2V0SW4odCxuKXtyZXR1cm4gbWEodCk/IW4mJloodGhpcy5jb250ZW50cyk/dGhpcy5jb250ZW50cy52YWx1ZTp0aGlzLmNvbnRlbnRzOkllKHRoaXMuY29udGVudHMpP3RoaXMuY29udGVudHMuZ2V0SW4odCxuKTp2b2lkIDB9aGFzKHQpe3JldHVybiBJZSh0aGlzLmNvbnRlbnRzKT90aGlzLmNvbnRlbnRzLmhhcyh0KTohMX1oYXNJbih0KXtyZXR1cm4gbWEodCk/dGhpcy5jb250ZW50cyE9PXZvaWQgMDpJZSh0aGlzLmNvbnRlbnRzKT90aGlzLmNvbnRlbnRzLmhhc0luKHQpOiExfXNldCh0LG4pe3RoaXMuY29udGVudHM9PW51bGw/dGhpcy5jb250ZW50cz1pbCh0aGlzLnNjaGVtYSxbdF0sbik6ZW8odGhpcy5jb250ZW50cykmJnRoaXMuY29udGVudHMuc2V0KHQsbil9c2V0SW4odCxuKXttYSh0KT90aGlzLmNvbnRlbnRzPW46dGhpcy5jb250ZW50cz09bnVsbD90aGlzLmNvbnRlbnRzPWlsKHRoaXMuc2NoZW1hLEFycmF5LmZyb20odCksbik6ZW8odGhpcy5jb250ZW50cykmJnRoaXMuY29udGVudHMuc2V0SW4odCxuKX1zZXRTY2hlbWEodCxuPXt9KXt0eXBlb2YgdD09Im51bWJlciImJih0PVN0cmluZyh0KSk7bGV0IHI7c3dpdGNoKHQpe2Nhc2UiMS4xIjp0aGlzLmRpcmVjdGl2ZXM/dGhpcy5kaXJlY3RpdmVzLnlhbWwudmVyc2lvbj0iMS4xIjp0aGlzLmRpcmVjdGl2ZXM9bmV3IEN0KHt2ZXJzaW9uOiIxLjEifSkscj17cmVzb2x2ZUtub3duVGFnczohMSxzY2hlbWE6InlhbWwtMS4xIn07YnJlYWs7Y2FzZSIxLjIiOmNhc2UibmV4dCI6dGhpcy5kaXJlY3RpdmVzP3RoaXMuZGlyZWN0aXZlcy55YW1sLnZlcnNpb249dDp0aGlzLmRpcmVjdGl2ZXM9bmV3IEN0KHt2ZXJzaW9uOnR9KSxyPXtyZXNvbHZlS25vd25UYWdzOiEwLHNjaGVtYToiY29yZSJ9O2JyZWFrO2Nhc2UgbnVsbDp0aGlzLmRpcmVjdGl2ZXMmJmRlbGV0ZSB0aGlzLmRpcmVjdGl2ZXMscj1udWxsO2JyZWFrO2RlZmF1bHQ6e2NvbnN0IHM9SlNPTi5zdHJpbmdpZnkodCk7dGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAnMS4xJywgJzEuMicgb3IgbnVsbCBhcyBmaXJzdCBhcmd1bWVudCwgYnV0IGZvdW5kOiAke3N9YCl9fWlmKG4uc2NoZW1hIGluc3RhbmNlb2YgT2JqZWN0KXRoaXMuc2NoZW1hPW4uc2NoZW1hO2Vsc2UgaWYocil0aGlzLnNjaGVtYT1uZXcgenAoT2JqZWN0LmFzc2lnbihyLG4pKTtlbHNlIHRocm93IG5ldyBFcnJvcigiV2l0aCBhIG51bGwgWUFNTCB2ZXJzaW9uLCB0aGUgeyBzY2hlbWE6IFNjaGVtYSB9IG9wdGlvbiBpcyByZXF1aXJlZCIpfXRvSlMoe2pzb246dCxqc29uQXJnOm4sbWFwQXNNYXA6cixtYXhBbGlhc0NvdW50OnMsb25BbmNob3I6aSxyZXZpdmVyOm99PXt9KXtjb25zdCBhPXthbmNob3JzOm5ldyBNYXAsZG9jOnRoaXMsa2VlcDohdCxtYXBBc01hcDpyPT09ITAsbWFwS2V5V2FybmVkOiExLG1heEFsaWFzQ291bnQ6dHlwZW9mIHM9PSJudW1iZXIiP3M6MTAwfSx1PWRuKHRoaXMuY29udGVudHMsbj8/IiIsYSk7aWYodHlwZW9mIGk9PSJmdW5jdGlvbiIpZm9yKGNvbnN0e2NvdW50OmwscmVzOmZ9b2YgYS5hbmNob3JzLnZhbHVlcygpKWkoZixsKTtyZXR1cm4gdHlwZW9mIG89PSJmdW5jdGlvbiI/emkobyx7IiI6dX0sIiIsdSk6dX10b0pTT04odCxuKXtyZXR1cm4gdGhpcy50b0pTKHtqc29uOiEwLGpzb25Bcmc6dCxtYXBBc01hcDohMSxvbkFuY2hvcjpufSl9dG9TdHJpbmcodD17fSl7aWYodGhpcy5lcnJvcnMubGVuZ3RoPjApdGhyb3cgbmV3IEVycm9yKCJEb2N1bWVudCB3aXRoIGVycm9ycyBjYW5ub3QgYmUgc3RyaW5naWZpZWQiKTtpZigiaW5kZW50ImluIHQmJighTnVtYmVyLmlzSW50ZWdlcih0LmluZGVudCl8fE51bWJlcih0LmluZGVudCk8PTApKXtjb25zdCBuPUpTT04uc3RyaW5naWZ5KHQuaW5kZW50KTt0aHJvdyBuZXcgRXJyb3IoYCJpbmRlbnQiIG9wdGlvbiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgbm90ICR7bn1gKX1yZXR1cm4gWTkodGhpcyx0KX19ZnVuY3Rpb24gZW8oZSl7aWYoSWUoZSkpcmV0dXJuITA7dGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBhIFlBTUwgY29sbGVjdGlvbiBhcyBkb2N1bWVudCBjb250ZW50cyIpfWNsYXNzIG5EIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxuLHIscyl7c3VwZXIoKSx0aGlzLm5hbWU9dCx0aGlzLmNvZGU9cix0aGlzLm1lc3NhZ2U9cyx0aGlzLnBvcz1ufX1jbGFzcyBiYSBleHRlbmRzIG5Ee2NvbnN0cnVjdG9yKHQsbixyKXtzdXBlcigiWUFNTFBhcnNlRXJyb3IiLHQsbixyKX19Y2xhc3MgUTkgZXh0ZW5kcyBuRHtjb25zdHJ1Y3Rvcih0LG4scil7c3VwZXIoIllBTUxXYXJuaW5nIix0LG4scil9fWNvbnN0IHJEPShlLHQpPT5uPT57aWYobi5wb3NbMF09PT0tMSlyZXR1cm47bi5saW5lUG9zPW4ucG9zLm1hcChhPT50LmxpbmVQb3MoYSkpO2NvbnN0e2xpbmU6cixjb2w6c309bi5saW5lUG9zWzBdO24ubWVzc2FnZSs9YCBhdCBsaW5lICR7cn0sIGNvbHVtbiAke3N9YDtsZXQgaT1zLTEsbz1lLnN1YnN0cmluZyh0LmxpbmVTdGFydHNbci0xXSx0LmxpbmVTdGFydHNbcl0pLnJlcGxhY2UoL1tcblxyXSskLywiIik7aWYoaT49NjAmJm8ubGVuZ3RoPjgwKXtjb25zdCBhPU1hdGgubWluKGktMzksby5sZW5ndGgtNzkpO289IuKApiIrby5zdWJzdHJpbmcoYSksaS09YS0xfWlmKG8ubGVuZ3RoPjgwJiYobz1vLnN1YnN0cmluZygwLDc5KSsi4oCmIikscj4xJiYvXiAqJC8udGVzdChvLnN1YnN0cmluZygwLGkpKSl7bGV0IGE9ZS5zdWJzdHJpbmcodC5saW5lU3RhcnRzW3ItMl0sdC5saW5lU3RhcnRzW3ItMV0pO2EubGVuZ3RoPjgwJiYoYT1hLnN1YnN0cmluZygwLDc5KStg4oCmCmApLG89YStvfWlmKC9bXiBdLy50ZXN0KG8pKXtsZXQgYT0xO2NvbnN0IHU9bi5saW5lUG9zWzFdOyh1PT1udWxsP3ZvaWQgMDp1LmxpbmUpPT09ciYmdS5jb2w+cyYmKGE9TWF0aC5tYXgoMSxNYXRoLm1pbih1LmNvbC1zLDgwLWkpKSk7Y29uc3QgbD0iICIucmVwZWF0KGkpKyJeIi5yZXBlYXQoYSk7bi5tZXNzYWdlKz1gOgoKJHtvfQoke2x9CmB9fTtmdW5jdGlvbiB0byhlLHtmbG93OnQsaW5kaWNhdG9yOm4sbmV4dDpyLG9mZnNldDpzLG9uRXJyb3I6aSxwYXJlbnRJbmRlbnQ6byxzdGFydE9uTmV3bGluZTphfSl7bGV0IHU9ITEsbD1hLGY9YSxjPSIiLHA9IiIsaD0hMSxkPSExLG09bnVsbCxnPW51bGwsRD1udWxsLGI9bnVsbCxFPW51bGwsRj1udWxsLHY9bnVsbDtmb3IoY29uc3QgdyBvZiBlKXN3aXRjaChkJiYody50eXBlIT09InNwYWNlIiYmdy50eXBlIT09Im5ld2xpbmUiJiZ3LnR5cGUhPT0iY29tbWEiJiZpKHcub2Zmc2V0LCJNSVNTSU5HX0NIQVIiLCJUYWdzIGFuZCBhbmNob3JzIG11c3QgYmUgc2VwYXJhdGVkIGZyb20gdGhlIG5leHQgdG9rZW4gYnkgd2hpdGUgc3BhY2UiKSxkPSExKSxtJiYobCYmdy50eXBlIT09ImNvbW1lbnQiJiZ3LnR5cGUhPT0ibmV3bGluZSImJmkobSwiVEFCX0FTX0lOREVOVCIsIlRhYnMgYXJlIG5vdCBhbGxvd2VkIGFzIGluZGVudGF0aW9uIiksbT1udWxsKSx3LnR5cGUpe2Nhc2Uic3BhY2UiOiF0JiYobiE9PSJkb2Mtc3RhcnQifHwocj09bnVsbD92b2lkIDA6ci50eXBlKSE9PSJmbG93LWNvbGxlY3Rpb24iKSYmdy5zb3VyY2UuaW5jbHVkZXMoIgkiKSYmKG09dyksZj0hMDticmVhaztjYXNlImNvbW1lbnQiOntmfHxpKHcsIk1JU1NJTkdfQ0hBUiIsIkNvbW1lbnRzIG11c3QgYmUgc2VwYXJhdGVkIGZyb20gb3RoZXIgdG9rZW5zIGJ5IHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMiKTtjb25zdCBUPXcuc291cmNlLnN1YnN0cmluZygxKXx8IiAiO2M/Yys9cCtUOmM9VCxwPSIiLGw9ITE7YnJlYWt9Y2FzZSJuZXdsaW5lIjpsP2M/Yys9dy5zb3VyY2U6KCFGfHxuIT09InNlcS1pdGVtLWluZCIpJiYodT0hMCk6cCs9dy5zb3VyY2UsbD0hMCxoPSEwLChnfHxEKSYmKGI9dyksZj0hMDticmVhaztjYXNlImFuY2hvciI6ZyYmaSh3LCJNVUxUSVBMRV9BTkNIT1JTIiwiQSBub2RlIGNhbiBoYXZlIGF0IG1vc3Qgb25lIGFuY2hvciIpLHcuc291cmNlLmVuZHNXaXRoKCI6IikmJmkody5vZmZzZXQrdy5zb3VyY2UubGVuZ3RoLTEsIkJBRF9BTElBUyIsIkFuY2hvciBlbmRpbmcgaW4gOiBpcyBhbWJpZ3VvdXMiLCEwKSxnPXcsdj8/KHY9dy5vZmZzZXQpLGw9ITEsZj0hMSxkPSEwO2JyZWFrO2Nhc2UidGFnIjp7RCYmaSh3LCJNVUxUSVBMRV9UQUdTIiwiQSBub2RlIGNhbiBoYXZlIGF0IG1vc3Qgb25lIHRhZyIpLEQ9dyx2Pz8odj13Lm9mZnNldCksbD0hMSxmPSExLGQ9ITA7YnJlYWt9Y2FzZSBuOihnfHxEKSYmaSh3LCJCQURfUFJPUF9PUkRFUiIsYEFuY2hvcnMgYW5kIHRhZ3MgbXVzdCBiZSBhZnRlciB0aGUgJHt3LnNvdXJjZX0gaW5kaWNhdG9yYCksRiYmaSh3LCJVTkVYUEVDVEVEX1RPS0VOIixgVW5leHBlY3RlZCAke3cuc291cmNlfSBpbiAke3Q/PyJjb2xsZWN0aW9uIn1gKSxGPXcsbD1uPT09InNlcS1pdGVtLWluZCJ8fG49PT0iZXhwbGljaXQta2V5LWluZCIsZj0hMTticmVhaztjYXNlImNvbW1hIjppZih0KXtFJiZpKHcsIlVORVhQRUNURURfVE9LRU4iLGBVbmV4cGVjdGVkICwgaW4gJHt0fWApLEU9dyxsPSExLGY9ITE7YnJlYWt9ZGVmYXVsdDppKHcsIlVORVhQRUNURURfVE9LRU4iLGBVbmV4cGVjdGVkICR7dy50eXBlfSB0b2tlbmApLGw9ITEsZj0hMX1jb25zdCBDPWVbZS5sZW5ndGgtMV0sQT1DP0Mub2Zmc2V0K0Muc291cmNlLmxlbmd0aDpzO3JldHVybiBkJiZyJiZyLnR5cGUhPT0ic3BhY2UiJiZyLnR5cGUhPT0ibmV3bGluZSImJnIudHlwZSE9PSJjb21tYSImJihyLnR5cGUhPT0ic2NhbGFyInx8ci5zb3VyY2UhPT0iIikmJmkoci5vZmZzZXQsIk1JU1NJTkdfQ0hBUiIsIlRhZ3MgYW5kIGFuY2hvcnMgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSB0aGUgbmV4dCB0b2tlbiBieSB3aGl0ZSBzcGFjZSIpLG0mJihsJiZtLmluZGVudDw9b3x8KHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0iYmxvY2stbWFwInx8KHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0iYmxvY2stc2VxIikmJmkobSwiVEFCX0FTX0lOREVOVCIsIlRhYnMgYXJlIG5vdCBhbGxvd2VkIGFzIGluZGVudGF0aW9uIikse2NvbW1hOkUsZm91bmQ6RixzcGFjZUJlZm9yZTp1LGNvbW1lbnQ6YyxoYXNOZXdsaW5lOmgsYW5jaG9yOmcsdGFnOkQsbmV3bGluZUFmdGVyUHJvcDpiLGVuZDpBLHN0YXJ0OnY/P0F9fWZ1bmN0aW9uIEVhKGUpe2lmKCFlKXJldHVybiBudWxsO3N3aXRjaChlLnR5cGUpe2Nhc2UiYWxpYXMiOmNhc2Uic2NhbGFyIjpjYXNlImRvdWJsZS1xdW90ZWQtc2NhbGFyIjpjYXNlInNpbmdsZS1xdW90ZWQtc2NhbGFyIjppZihlLnNvdXJjZS5pbmNsdWRlcyhgCmApKXJldHVybiEwO2lmKGUuZW5kKXtmb3IoY29uc3QgdCBvZiBlLmVuZClpZih0LnR5cGU9PT0ibmV3bGluZSIpcmV0dXJuITB9cmV0dXJuITE7Y2FzZSJmbG93LWNvbGxlY3Rpb24iOmZvcihjb25zdCB0IG9mIGUuaXRlbXMpe2Zvcihjb25zdCBuIG9mIHQuc3RhcnQpaWYobi50eXBlPT09Im5ld2xpbmUiKXJldHVybiEwO2lmKHQuc2VwKXtmb3IoY29uc3QgbiBvZiB0LnNlcClpZihuLnR5cGU9PT0ibmV3bGluZSIpcmV0dXJuITB9aWYoRWEodC5rZXkpfHxFYSh0LnZhbHVlKSlyZXR1cm4hMH1yZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX1mdW5jdGlvbiBHcChlLHQsbil7aWYoKHQ9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iZmxvdy1jb2xsZWN0aW9uIil7Y29uc3Qgcj10LmVuZFswXTtyLmluZGVudD09PWUmJihyLnNvdXJjZT09PSJdInx8ci5zb3VyY2U9PT0ifSIpJiZFYSh0KSYmbihyLCJCQURfSU5ERU5UIiwiRmxvdyBlbmQgaW5kaWNhdG9yIHNob3VsZCBiZSBtb3JlIGluZGVudGVkIHRoYW4gcGFyZW50IiwhMCl9fWZ1bmN0aW9uIHNEKGUsdCxuKXtjb25zdHt1bmlxdWVLZXlzOnJ9PWUub3B0aW9ucztpZihyPT09ITEpcmV0dXJuITE7Y29uc3Qgcz10eXBlb2Ygcj09ImZ1bmN0aW9uIj9yOihpLG8pPT5pPT09b3x8WihpKSYmWihvKSYmaS52YWx1ZT09PW8udmFsdWU7cmV0dXJuIHQuc29tZShpPT5zKGkua2V5LG4pKX1jb25zdCBpRD0iQWxsIG1hcHBpbmcgaXRlbXMgbXVzdCBzdGFydCBhdCB0aGUgc2FtZSBjb2x1bW4iO2Z1bmN0aW9uIFo5KHtjb21wb3NlTm9kZTplLGNvbXBvc2VFbXB0eU5vZGU6dH0sbixyLHMsaSl7dmFyIGY7Y29uc3Qgbz0oaT09bnVsbD92b2lkIDA6aS5ub2RlQ2xhc3MpPz9tbixhPW5ldyBvKG4uc2NoZW1hKTtuLmF0Um9vdCYmKG4uYXRSb290PSExKTtsZXQgdT1yLm9mZnNldCxsPW51bGw7Zm9yKGNvbnN0IGMgb2Ygci5pdGVtcyl7Y29uc3R7c3RhcnQ6cCxrZXk6aCxzZXA6ZCx2YWx1ZTptfT1jLGc9dG8ocCx7aW5kaWNhdG9yOiJleHBsaWNpdC1rZXktaW5kIixuZXh0Omg/PyhkPT1udWxsP3ZvaWQgMDpkWzBdKSxvZmZzZXQ6dSxvbkVycm9yOnMscGFyZW50SW5kZW50OnIuaW5kZW50LHN0YXJ0T25OZXdsaW5lOiEwfSksRD0hZy5mb3VuZDtpZihEKXtpZihoJiYoaC50eXBlPT09ImJsb2NrLXNlcSI/cyh1LCJCTE9DS19BU19JTVBMSUNJVF9LRVkiLCJBIGJsb2NrIHNlcXVlbmNlIG1heSBub3QgYmUgdXNlZCBhcyBhbiBpbXBsaWNpdCBtYXAga2V5Iik6ImluZGVudCJpbiBoJiZoLmluZGVudCE9PXIuaW5kZW50JiZzKHUsIkJBRF9JTkRFTlQiLGlEKSksIWcuYW5jaG9yJiYhZy50YWcmJiFkKXtsPWcuZW5kLGcuY29tbWVudCYmKGEuY29tbWVudD9hLmNvbW1lbnQrPWAKYCtnLmNvbW1lbnQ6YS5jb21tZW50PWcuY29tbWVudCk7Y29udGludWV9KGcubmV3bGluZUFmdGVyUHJvcHx8RWEoaCkpJiZzKGg/P3BbcC5sZW5ndGgtMV0sIk1VTFRJTElORV9JTVBMSUNJVF9LRVkiLCJJbXBsaWNpdCBrZXlzIG5lZWQgdG8gYmUgb24gYSBzaW5nbGUgbGluZSIpfWVsc2UoKGY9Zy5mb3VuZCk9PW51bGw/dm9pZCAwOmYuaW5kZW50KSE9PXIuaW5kZW50JiZzKHUsIkJBRF9JTkRFTlQiLGlEKTtuLmF0S2V5PSEwO2NvbnN0IGI9Zy5lbmQsRT1oP2UobixoLGcscyk6dChuLGIscCxudWxsLGcscyk7bi5zY2hlbWEuY29tcGF0JiZHcChyLmluZGVudCxoLHMpLG4uYXRLZXk9ITEsc0QobixhLml0ZW1zLEUpJiZzKGIsIkRVUExJQ0FURV9LRVkiLCJNYXAga2V5cyBtdXN0IGJlIHVuaXF1ZSIpO2NvbnN0IEY9dG8oZD8/W10se2luZGljYXRvcjoibWFwLXZhbHVlLWluZCIsbmV4dDptLG9mZnNldDpFLnJhbmdlWzJdLG9uRXJyb3I6cyxwYXJlbnRJbmRlbnQ6ci5pbmRlbnQsc3RhcnRPbk5ld2xpbmU6IWh8fGgudHlwZT09PSJibG9jay1zY2FsYXIifSk7aWYodT1GLmVuZCxGLmZvdW5kKXtEJiYoKG09PW51bGw/dm9pZCAwOm0udHlwZSk9PT0iYmxvY2stbWFwIiYmIUYuaGFzTmV3bGluZSYmcyh1LCJCTE9DS19BU19JTVBMSUNJVF9LRVkiLCJOZXN0ZWQgbWFwcGluZ3MgYXJlIG5vdCBhbGxvd2VkIGluIGNvbXBhY3QgbWFwcGluZ3MiKSxuLm9wdGlvbnMuc3RyaWN0JiZnLnN0YXJ0PEYuZm91bmQub2Zmc2V0LTEwMjQmJnMoRS5yYW5nZSwiS0VZX09WRVJfMTAyNF9DSEFSUyIsIlRoZSA6IGluZGljYXRvciBtdXN0IGJlIGF0IG1vc3QgMTAyNCBjaGFycyBhZnRlciB0aGUgc3RhcnQgb2YgYW4gaW1wbGljaXQgYmxvY2sgbWFwcGluZyBrZXkiKSk7Y29uc3Qgdj1tP2UobixtLEYscyk6dChuLHUsZCxudWxsLEYscyk7bi5zY2hlbWEuY29tcGF0JiZHcChyLmluZGVudCxtLHMpLHU9di5yYW5nZVsyXTtjb25zdCBDPW5ldyBTdChFLHYpO24ub3B0aW9ucy5rZWVwU291cmNlVG9rZW5zJiYoQy5zcmNUb2tlbj1jKSxhLml0ZW1zLnB1c2goQyl9ZWxzZXtEJiZzKEUucmFuZ2UsIk1JU1NJTkdfQ0hBUiIsIkltcGxpY2l0IG1hcCBrZXlzIG5lZWQgdG8gYmUgZm9sbG93ZWQgYnkgbWFwIHZhbHVlcyIpLEYuY29tbWVudCYmKEUuY29tbWVudD9FLmNvbW1lbnQrPWAKYCtGLmNvbW1lbnQ6RS5jb21tZW50PUYuY29tbWVudCk7Y29uc3Qgdj1uZXcgU3QoRSk7bi5vcHRpb25zLmtlZXBTb3VyY2VUb2tlbnMmJih2LnNyY1Rva2VuPWMpLGEuaXRlbXMucHVzaCh2KX19cmV0dXJuIGwmJmw8dSYmcyhsLCJJTVBPU1NJQkxFIiwiTWFwIGNvbW1lbnQgd2l0aCB0cmFpbGluZyBjb250ZW50IiksYS5yYW5nZT1bci5vZmZzZXQsdSxsPz91XSxhfWZ1bmN0aW9uIGV4KHtjb21wb3NlTm9kZTplLGNvbXBvc2VFbXB0eU5vZGU6dH0sbixyLHMsaSl7Y29uc3Qgbz0oaT09bnVsbD92b2lkIDA6aS5ub2RlQ2xhc3MpPz9xcyxhPW5ldyBvKG4uc2NoZW1hKTtuLmF0Um9vdCYmKG4uYXRSb290PSExKSxuLmF0S2V5JiYobi5hdEtleT0hMSk7bGV0IHU9ci5vZmZzZXQsbD1udWxsO2Zvcihjb25zdHtzdGFydDpmLHZhbHVlOmN9b2Ygci5pdGVtcyl7Y29uc3QgcD10byhmLHtpbmRpY2F0b3I6InNlcS1pdGVtLWluZCIsbmV4dDpjLG9mZnNldDp1LG9uRXJyb3I6cyxwYXJlbnRJbmRlbnQ6ci5pbmRlbnQsc3RhcnRPbk5ld2xpbmU6ITB9KTtpZighcC5mb3VuZClpZihwLmFuY2hvcnx8cC50YWd8fGMpKGM9PW51bGw/dm9pZCAwOmMudHlwZSk9PT0iYmxvY2stc2VxIj9zKHAuZW5kLCJCQURfSU5ERU5UIiwiQWxsIHNlcXVlbmNlIGl0ZW1zIG11c3Qgc3RhcnQgYXQgdGhlIHNhbWUgY29sdW1uIik6cyh1LCJNSVNTSU5HX0NIQVIiLCJTZXF1ZW5jZSBpdGVtIHdpdGhvdXQgLSBpbmRpY2F0b3IiKTtlbHNle2w9cC5lbmQscC5jb21tZW50JiYoYS5jb21tZW50PXAuY29tbWVudCk7Y29udGludWV9Y29uc3QgaD1jP2UobixjLHAscyk6dChuLHAuZW5kLGYsbnVsbCxwLHMpO24uc2NoZW1hLmNvbXBhdCYmR3Aoci5pbmRlbnQsYyxzKSx1PWgucmFuZ2VbMl0sYS5pdGVtcy5wdXNoKGgpfXJldHVybiBhLnJhbmdlPVtyLm9mZnNldCx1LGw/P3VdLGF9ZnVuY3Rpb24gdmEoZSx0LG4scil7bGV0IHM9IiI7aWYoZSl7bGV0IGk9ITEsbz0iIjtmb3IoY29uc3QgYSBvZiBlKXtjb25zdHtzb3VyY2U6dSx0eXBlOmx9PWE7c3dpdGNoKGwpe2Nhc2Uic3BhY2UiOmk9ITA7YnJlYWs7Y2FzZSJjb21tZW50Ijp7biYmIWkmJnIoYSwiTUlTU0lOR19DSEFSIiwiQ29tbWVudHMgbXVzdCBiZSBzZXBhcmF0ZWQgZnJvbSBvdGhlciB0b2tlbnMgYnkgd2hpdGUgc3BhY2UgY2hhcmFjdGVycyIpO2NvbnN0IGY9dS5zdWJzdHJpbmcoMSl8fCIgIjtzP3MrPW8rZjpzPWYsbz0iIjticmVha31jYXNlIm5ld2xpbmUiOnMmJihvKz11KSxpPSEwO2JyZWFrO2RlZmF1bHQ6cihhLCJVTkVYUEVDVEVEX1RPS0VOIixgVW5leHBlY3RlZCAke2x9IGF0IG5vZGUgZW5kYCl9dCs9dS5sZW5ndGh9fXJldHVybntjb21tZW50OnMsb2Zmc2V0OnR9fWNvbnN0IEtwPSJCbG9jayBjb2xsZWN0aW9ucyBhcmUgbm90IGFsbG93ZWQgd2l0aGluIGZsb3cgY29sbGVjdGlvbnMiLFhwPWU9PmUmJihlLnR5cGU9PT0iYmxvY2stbWFwInx8ZS50eXBlPT09ImJsb2NrLXNlcSIpO2Z1bmN0aW9uIHR4KHtjb21wb3NlTm9kZTplLGNvbXBvc2VFbXB0eU5vZGU6dH0sbixyLHMsaSl7dmFyIGc7Y29uc3Qgbz1yLnN0YXJ0LnNvdXJjZT09PSJ7IixhPW8/ImZsb3cgbWFwIjoiZmxvdyBzZXF1ZW5jZSIsdT0oaT09bnVsbD92b2lkIDA6aS5ub2RlQ2xhc3MpPz8obz9tbjpxcyksbD1uZXcgdShuLnNjaGVtYSk7bC5mbG93PSEwO2NvbnN0IGY9bi5hdFJvb3Q7ZiYmKG4uYXRSb290PSExKSxuLmF0S2V5JiYobi5hdEtleT0hMSk7bGV0IGM9ci5vZmZzZXQrci5zdGFydC5zb3VyY2UubGVuZ3RoO2ZvcihsZXQgRD0wO0Q8ci5pdGVtcy5sZW5ndGg7KytEKXtjb25zdCBiPXIuaXRlbXNbRF0se3N0YXJ0OkUsa2V5OkYsc2VwOnYsdmFsdWU6Q309YixBPXRvKEUse2Zsb3c6YSxpbmRpY2F0b3I6ImV4cGxpY2l0LWtleS1pbmQiLG5leHQ6Rj8/KHY9PW51bGw/dm9pZCAwOnZbMF0pLG9mZnNldDpjLG9uRXJyb3I6cyxwYXJlbnRJbmRlbnQ6ci5pbmRlbnQsc3RhcnRPbk5ld2xpbmU6ITF9KTtpZighQS5mb3VuZCl7aWYoIUEuYW5jaG9yJiYhQS50YWcmJiF2JiYhQyl7RD09PTAmJkEuY29tbWE/cyhBLmNvbW1hLCJVTkVYUEVDVEVEX1RPS0VOIixgVW5leHBlY3RlZCAsIGluICR7YX1gKTpEPHIuaXRlbXMubGVuZ3RoLTEmJnMoQS5zdGFydCwiVU5FWFBFQ1RFRF9UT0tFTiIsYFVuZXhwZWN0ZWQgZW1wdHkgaXRlbSBpbiAke2F9YCksQS5jb21tZW50JiYobC5jb21tZW50P2wuY29tbWVudCs9YApgK0EuY29tbWVudDpsLmNvbW1lbnQ9QS5jb21tZW50KSxjPUEuZW5kO2NvbnRpbnVlfSFvJiZuLm9wdGlvbnMuc3RyaWN0JiZFYShGKSYmcyhGLCJNVUxUSUxJTkVfSU1QTElDSVRfS0VZIiwiSW1wbGljaXQga2V5cyBvZiBmbG93IHNlcXVlbmNlIHBhaXJzIG5lZWQgdG8gYmUgb24gYSBzaW5nbGUgbGluZSIpfWlmKEQ9PT0wKUEuY29tbWEmJnMoQS5jb21tYSwiVU5FWFBFQ1RFRF9UT0tFTiIsYFVuZXhwZWN0ZWQgLCBpbiAke2F9YCk7ZWxzZSBpZihBLmNvbW1hfHxzKEEuc3RhcnQsIk1JU1NJTkdfQ0hBUiIsYE1pc3NpbmcgLCBiZXR3ZWVuICR7YX0gaXRlbXNgKSxBLmNvbW1lbnQpe2xldCB3PSIiO2U6Zm9yKGNvbnN0IFQgb2YgRSlzd2l0Y2goVC50eXBlKXtjYXNlImNvbW1hIjpjYXNlInNwYWNlIjpicmVhaztjYXNlImNvbW1lbnQiOnc9VC5zb3VyY2Uuc3Vic3RyaW5nKDEpO2JyZWFrIGU7ZGVmYXVsdDpicmVhayBlfWlmKHcpe2xldCBUPWwuaXRlbXNbbC5pdGVtcy5sZW5ndGgtMV07eWUoVCkmJihUPVQudmFsdWU/P1Qua2V5KSxULmNvbW1lbnQ/VC5jb21tZW50Kz1gCmArdzpULmNvbW1lbnQ9dyxBLmNvbW1lbnQ9QS5jb21tZW50LnN1YnN0cmluZyh3Lmxlbmd0aCsxKX19aWYoIW8mJiF2JiYhQS5mb3VuZCl7Y29uc3Qgdz1DP2UobixDLEEscyk6dChuLEEuZW5kLHYsbnVsbCxBLHMpO2wuaXRlbXMucHVzaCh3KSxjPXcucmFuZ2VbMl0sWHAoQykmJnMody5yYW5nZSwiQkxPQ0tfSU5fRkxPVyIsS3ApfWVsc2V7bi5hdEtleT0hMDtjb25zdCB3PUEuZW5kLFQ9Rj9lKG4sRixBLHMpOnQobix3LEUsbnVsbCxBLHMpO1hwKEYpJiZzKFQucmFuZ2UsIkJMT0NLX0lOX0ZMT1ciLEtwKSxuLmF0S2V5PSExO2NvbnN0IE49dG8odj8/W10se2Zsb3c6YSxpbmRpY2F0b3I6Im1hcC12YWx1ZS1pbmQiLG5leHQ6QyxvZmZzZXQ6VC5yYW5nZVsyXSxvbkVycm9yOnMscGFyZW50SW5kZW50OnIuaW5kZW50LHN0YXJ0T25OZXdsaW5lOiExfSk7aWYoTi5mb3VuZCl7aWYoIW8mJiFBLmZvdW5kJiZuLm9wdGlvbnMuc3RyaWN0KXtpZih2KWZvcihjb25zdCBTIG9mIHYpe2lmKFM9PT1OLmZvdW5kKWJyZWFrO2lmKFMudHlwZT09PSJuZXdsaW5lIil7cyhTLCJNVUxUSUxJTkVfSU1QTElDSVRfS0VZIiwiSW1wbGljaXQga2V5cyBvZiBmbG93IHNlcXVlbmNlIHBhaXJzIG5lZWQgdG8gYmUgb24gYSBzaW5nbGUgbGluZSIpO2JyZWFrfX1BLnN0YXJ0PE4uZm91bmQub2Zmc2V0LTEwMjQmJnMoTi5mb3VuZCwiS0VZX09WRVJfMTAyNF9DSEFSUyIsIlRoZSA6IGluZGljYXRvciBtdXN0IGJlIGF0IG1vc3QgMTAyNCBjaGFycyBhZnRlciB0aGUgc3RhcnQgb2YgYW4gaW1wbGljaXQgZmxvdyBzZXF1ZW5jZSBrZXkiKX19ZWxzZSBDJiYoInNvdXJjZSJpbiBDJiYoKGc9Qy5zb3VyY2UpPT1udWxsP3ZvaWQgMDpnWzBdKT09PSI6Ij9zKEMsIk1JU1NJTkdfQ0hBUiIsYE1pc3Npbmcgc3BhY2UgYWZ0ZXIgOiBpbiAke2F9YCk6cyhOLnN0YXJ0LCJNSVNTSU5HX0NIQVIiLGBNaXNzaW5nICwgb3IgOiBiZXR3ZWVuICR7YX0gaXRlbXNgKSk7Y29uc3QgeD1DP2UobixDLE4scyk6Ti5mb3VuZD90KG4sTi5lbmQsdixudWxsLE4scyk6bnVsbDt4P1hwKEMpJiZzKHgucmFuZ2UsIkJMT0NLX0lOX0ZMT1ciLEtwKTpOLmNvbW1lbnQmJihULmNvbW1lbnQ/VC5jb21tZW50Kz1gCmArTi5jb21tZW50OlQuY29tbWVudD1OLmNvbW1lbnQpO2NvbnN0IEw9bmV3IFN0KFQseCk7aWYobi5vcHRpb25zLmtlZXBTb3VyY2VUb2tlbnMmJihMLnNyY1Rva2VuPWIpLG8pe2NvbnN0IFM9bDtzRChuLFMuaXRlbXMsVCkmJnModywiRFVQTElDQVRFX0tFWSIsIk1hcCBrZXlzIG11c3QgYmUgdW5pcXVlIiksUy5pdGVtcy5wdXNoKEwpfWVsc2V7Y29uc3QgUz1uZXcgbW4obi5zY2hlbWEpO1MuZmxvdz0hMCxTLml0ZW1zLnB1c2goTCk7Y29uc3Qgaz0oeD8/VCkucmFuZ2U7Uy5yYW5nZT1bVC5yYW5nZVswXSxrWzFdLGtbMl1dLGwuaXRlbXMucHVzaChTKX1jPXg/eC5yYW5nZVsyXTpOLmVuZH19Y29uc3QgcD1vPyJ9IjoiXSIsW2gsLi4uZF09ci5lbmQ7bGV0IG09YztpZigoaD09bnVsbD92b2lkIDA6aC5zb3VyY2UpPT09cCltPWgub2Zmc2V0K2guc291cmNlLmxlbmd0aDtlbHNle2NvbnN0IEQ9YVswXS50b1VwcGVyQ2FzZSgpK2Euc3Vic3RyaW5nKDEpLGI9Zj9gJHtEfSBtdXN0IGVuZCB3aXRoIGEgJHtwfWA6YCR7RH0gaW4gYmxvY2sgY29sbGVjdGlvbiBtdXN0IGJlIHN1ZmZpY2llbnRseSBpbmRlbnRlZCBhbmQgZW5kIHdpdGggYSAke3B9YDtzKGMsZj8iTUlTU0lOR19DSEFSIjoiQkFEX0lOREVOVCIsYiksaCYmaC5zb3VyY2UubGVuZ3RoIT09MSYmZC51bnNoaWZ0KGgpfWlmKGQubGVuZ3RoPjApe2NvbnN0IEQ9dmEoZCxtLG4ub3B0aW9ucy5zdHJpY3Qscyk7RC5jb21tZW50JiYobC5jb21tZW50P2wuY29tbWVudCs9YApgK0QuY29tbWVudDpsLmNvbW1lbnQ9RC5jb21tZW50KSxsLnJhbmdlPVtyLm9mZnNldCxtLEQub2Zmc2V0XX1lbHNlIGwucmFuZ2U9W3Iub2Zmc2V0LG0sbV07cmV0dXJuIGx9ZnVuY3Rpb24gWXAoZSx0LG4scixzLGkpe2NvbnN0IG89bi50eXBlPT09ImJsb2NrLW1hcCI/WjkoZSx0LG4scixpKTpuLnR5cGU9PT0iYmxvY2stc2VxIj9leChlLHQsbixyLGkpOnR4KGUsdCxuLHIsaSksYT1vLmNvbnN0cnVjdG9yO3JldHVybiBzPT09IiEifHxzPT09YS50YWdOYW1lPyhvLnRhZz1hLnRhZ05hbWUsbyk6KHMmJihvLnRhZz1zKSxvKX1mdW5jdGlvbiBueChlLHQsbixyLHMpe3ZhciBwO2NvbnN0IGk9ci50YWcsbz1pP3QuZGlyZWN0aXZlcy50YWdOYW1lKGkuc291cmNlLGg9PnMoaSwiVEFHX1JFU09MVkVfRkFJTEVEIixoKSk6bnVsbDtpZihuLnR5cGU9PT0iYmxvY2stc2VxIil7Y29uc3R7YW5jaG9yOmgsbmV3bGluZUFmdGVyUHJvcDpkfT1yLG09aCYmaT9oLm9mZnNldD5pLm9mZnNldD9oOmk6aD8/aTttJiYoIWR8fGQub2Zmc2V0PG0ub2Zmc2V0KSYmcyhtLCJNSVNTSU5HX0NIQVIiLCJNaXNzaW5nIG5ld2xpbmUgYWZ0ZXIgYmxvY2sgc2VxdWVuY2UgcHJvcHMiKX1jb25zdCBhPW4udHlwZT09PSJibG9jay1tYXAiPyJtYXAiOm4udHlwZT09PSJibG9jay1zZXEiPyJzZXEiOm4uc3RhcnQuc291cmNlPT09InsiPyJtYXAiOiJzZXEiO2lmKCFpfHwhb3x8bz09PSIhInx8bz09PW1uLnRhZ05hbWUmJmE9PT0ibWFwInx8bz09PXFzLnRhZ05hbWUmJmE9PT0ic2VxIilyZXR1cm4gWXAoZSx0LG4scyxvKTtsZXQgdT10LnNjaGVtYS50YWdzLmZpbmQoaD0+aC50YWc9PT1vJiZoLmNvbGxlY3Rpb249PT1hKTtpZighdSl7Y29uc3QgaD10LnNjaGVtYS5rbm93blRhZ3Nbb107aWYoKGg9PW51bGw/dm9pZCAwOmguY29sbGVjdGlvbik9PT1hKXQuc2NoZW1hLnRhZ3MucHVzaChPYmplY3QuYXNzaWduKHt9LGgse2RlZmF1bHQ6ITF9KSksdT1oO2Vsc2UgcmV0dXJuIGg/cyhpLCJCQURfQ09MTEVDVElPTl9UWVBFIixgJHtoLnRhZ30gdXNlZCBmb3IgJHthfSBjb2xsZWN0aW9uLCBidXQgZXhwZWN0cyAke2guY29sbGVjdGlvbj8/InNjYWxhciJ9YCwhMCk6cyhpLCJUQUdfUkVTT0xWRV9GQUlMRUQiLGBVbnJlc29sdmVkIHRhZzogJHtvfWAsITApLFlwKGUsdCxuLHMsbyl9Y29uc3QgbD1ZcChlLHQsbixzLG8sdSksZj0oKHA9dS5yZXNvbHZlKT09bnVsbD92b2lkIDA6cC5jYWxsKHUsbCxoPT5zKGksIlRBR19SRVNPTFZFX0ZBSUxFRCIsaCksdC5vcHRpb25zKSk/P2wsYz1nZShmKT9mOm5ldyBzZShmKTtyZXR1cm4gYy5yYW5nZT1sLnJhbmdlLGMudGFnPW8sdSE9bnVsbCYmdS5mb3JtYXQmJihjLmZvcm1hdD11LmZvcm1hdCksY31mdW5jdGlvbiByeChlLHQsbil7Y29uc3Qgcj10Lm9mZnNldCxzPXN4KHQsZS5vcHRpb25zLnN0cmljdCxuKTtpZighcylyZXR1cm57dmFsdWU6IiIsdHlwZTpudWxsLGNvbW1lbnQ6IiIscmFuZ2U6W3IscixyXX07Y29uc3QgaT1zLm1vZGU9PT0iPiI/c2UuQkxPQ0tfRk9MREVEOnNlLkJMT0NLX0xJVEVSQUwsbz10LnNvdXJjZT9peCh0LnNvdXJjZSk6W107bGV0IGE9by5sZW5ndGg7Zm9yKGxldCBtPW8ubGVuZ3RoLTE7bT49MDstLW0pe2NvbnN0IGc9b1ttXVsxXTtpZihnPT09IiJ8fGc9PT0iXHIiKWE9bTtlbHNlIGJyZWFrfWlmKGE9PT0wKXtjb25zdCBtPXMuY2hvbXA9PT0iKyImJm8ubGVuZ3RoPjA/YApgLnJlcGVhdChNYXRoLm1heCgxLG8ubGVuZ3RoLTEpKToiIjtsZXQgZz1yK3MubGVuZ3RoO3JldHVybiB0LnNvdXJjZSYmKGcrPXQuc291cmNlLmxlbmd0aCkse3ZhbHVlOm0sdHlwZTppLGNvbW1lbnQ6cy5jb21tZW50LHJhbmdlOltyLGcsZ119fWxldCB1PXQuaW5kZW50K3MuaW5kZW50LGw9dC5vZmZzZXQrcy5sZW5ndGgsZj0wO2ZvcihsZXQgbT0wO208YTsrK20pe2NvbnN0W2csRF09b1ttXTtpZihEPT09IiJ8fEQ9PT0iXHIiKXMuaW5kZW50PT09MCYmZy5sZW5ndGg+dSYmKHU9Zy5sZW5ndGgpO2Vsc2V7Zy5sZW5ndGg8dSYmbihsK2cubGVuZ3RoLCJNSVNTSU5HX0NIQVIiLCJCbG9jayBzY2FsYXJzIHdpdGggbW9yZS1pbmRlbnRlZCBsZWFkaW5nIGVtcHR5IGxpbmVzIG11c3QgdXNlIGFuIGV4cGxpY2l0IGluZGVudGF0aW9uIGluZGljYXRvciIpLHMuaW5kZW50PT09MCYmKHU9Zy5sZW5ndGgpLGY9bSx1PT09MCYmIWUuYXRSb290JiZuKGwsIkJBRF9JTkRFTlQiLCJCbG9jayBzY2FsYXIgdmFsdWVzIGluIGNvbGxlY3Rpb25zIG11c3QgYmUgaW5kZW50ZWQiKTticmVha31sKz1nLmxlbmd0aCtELmxlbmd0aCsxfWZvcihsZXQgbT1vLmxlbmd0aC0xO20+PWE7LS1tKW9bbV1bMF0ubGVuZ3RoPnUmJihhPW0rMSk7bGV0IGM9IiIscD0iIixoPSExO2ZvcihsZXQgbT0wO208ZjsrK20pYys9b1ttXVswXS5zbGljZSh1KStgCmA7Zm9yKGxldCBtPWY7bTxhOysrbSl7bGV0W2csRF09b1ttXTtsKz1nLmxlbmd0aCtELmxlbmd0aCsxO2NvbnN0IGI9RFtELmxlbmd0aC0xXT09PSJcciI7aWYoYiYmKEQ9RC5zbGljZSgwLC0xKSksRCYmZy5sZW5ndGg8dSl7Y29uc3QgRj1gQmxvY2sgc2NhbGFyIGxpbmVzIG11c3Qgbm90IGJlIGxlc3MgaW5kZW50ZWQgdGhhbiB0aGVpciAke3MuaW5kZW50PyJleHBsaWNpdCBpbmRlbnRhdGlvbiBpbmRpY2F0b3IiOiJmaXJzdCBsaW5lIn1gO24obC1ELmxlbmd0aC0oYj8yOjEpLCJCQURfSU5ERU5UIixGKSxnPSIifWk9PT1zZS5CTE9DS19MSVRFUkFMPyhjKz1wK2cuc2xpY2UodSkrRCxwPWAKYCk6Zy5sZW5ndGg+dXx8RFswXT09PSIJIj8ocD09PSIgIj9wPWAKYDohaCYmcD09PWAKYCYmKHA9YAoKYCksYys9cCtnLnNsaWNlKHUpK0QscD1gCmAsaD0hMCk6RD09PSIiP3A9PT1gCmA/Yys9YApgOnA9YApgOihjKz1wK0QscD0iICIsaD0hMSl9c3dpdGNoKHMuY2hvbXApe2Nhc2UiLSI6YnJlYWs7Y2FzZSIrIjpmb3IobGV0IG09YTttPG8ubGVuZ3RoOysrbSljKz1gCmArb1ttXVswXS5zbGljZSh1KTtjW2MubGVuZ3RoLTFdIT09YApgJiYoYys9YApgKTticmVhaztkZWZhdWx0OmMrPWAKYH1jb25zdCBkPXIrcy5sZW5ndGgrdC5zb3VyY2UubGVuZ3RoO3JldHVybnt2YWx1ZTpjLHR5cGU6aSxjb21tZW50OnMuY29tbWVudCxyYW5nZTpbcixkLGRdfX1mdW5jdGlvbiBzeCh7b2Zmc2V0OmUscHJvcHM6dH0sbixyKXtpZih0WzBdLnR5cGUhPT0iYmxvY2stc2NhbGFyLWhlYWRlciIpcmV0dXJuIHIodFswXSwiSU1QT1NTSUJMRSIsIkJsb2NrIHNjYWxhciBoZWFkZXIgbm90IGZvdW5kIiksbnVsbDtjb25zdHtzb3VyY2U6c309dFswXSxpPXNbMF07bGV0IG89MCxhPSIiLHU9LTE7Zm9yKGxldCBwPTE7cDxzLmxlbmd0aDsrK3Ape2NvbnN0IGg9c1twXTtpZighYSYmKGg9PT0iLSJ8fGg9PT0iKyIpKWE9aDtlbHNle2NvbnN0IGQ9TnVtYmVyKGgpOyFvJiZkP289ZDp1PT09LTEmJih1PWUrcCl9fXUhPT0tMSYmcih1LCJVTkVYUEVDVEVEX1RPS0VOIixgQmxvY2sgc2NhbGFyIGhlYWRlciBpbmNsdWRlcyBleHRyYSBjaGFyYWN0ZXJzOiAke3N9YCk7bGV0IGw9ITEsZj0iIixjPXMubGVuZ3RoO2ZvcihsZXQgcD0xO3A8dC5sZW5ndGg7KytwKXtjb25zdCBoPXRbcF07c3dpdGNoKGgudHlwZSl7Y2FzZSJzcGFjZSI6bD0hMDtjYXNlIm5ld2xpbmUiOmMrPWguc291cmNlLmxlbmd0aDticmVhaztjYXNlImNvbW1lbnQiOm4mJiFsJiZyKGgsIk1JU1NJTkdfQ0hBUiIsIkNvbW1lbnRzIG11c3QgYmUgc2VwYXJhdGVkIGZyb20gb3RoZXIgdG9rZW5zIGJ5IHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMiKSxjKz1oLnNvdXJjZS5sZW5ndGgsZj1oLnNvdXJjZS5zdWJzdHJpbmcoMSk7YnJlYWs7Y2FzZSJlcnJvciI6cihoLCJVTkVYUEVDVEVEX1RPS0VOIixoLm1lc3NhZ2UpLGMrPWguc291cmNlLmxlbmd0aDticmVhaztkZWZhdWx0Ontjb25zdCBkPWBVbmV4cGVjdGVkIHRva2VuIGluIGJsb2NrIHNjYWxhciBoZWFkZXI6ICR7aC50eXBlfWA7cihoLCJVTkVYUEVDVEVEX1RPS0VOIixkKTtjb25zdCBtPWguc291cmNlO20mJnR5cGVvZiBtPT0ic3RyaW5nIiYmKGMrPW0ubGVuZ3RoKX19fXJldHVybnttb2RlOmksaW5kZW50Om8sY2hvbXA6YSxjb21tZW50OmYsbGVuZ3RoOmN9fWZ1bmN0aW9uIGl4KGUpe2NvbnN0IHQ9ZS5zcGxpdCgvXG4oICopLyksbj10WzBdLHI9bi5tYXRjaCgvXiggKikvKSxpPVtyIT1udWxsJiZyWzFdP1tyWzFdLG4uc2xpY2UoclsxXS5sZW5ndGgpXTpbIiIsbl1dO2ZvcihsZXQgbz0xO288dC5sZW5ndGg7bys9MilpLnB1c2goW3Rbb10sdFtvKzFdXSk7cmV0dXJuIGl9ZnVuY3Rpb24gb3goZSx0LG4pe2NvbnN0e29mZnNldDpyLHR5cGU6cyxzb3VyY2U6aSxlbmQ6b309ZTtsZXQgYSx1O2NvbnN0IGw9KHAsaCxkKT0+bihyK3AsaCxkKTtzd2l0Y2gocyl7Y2FzZSJzY2FsYXIiOmE9c2UuUExBSU4sdT1heChpLGwpO2JyZWFrO2Nhc2Uic2luZ2xlLXF1b3RlZC1zY2FsYXIiOmE9c2UuUVVPVEVfU0lOR0xFLHU9dXgoaSxsKTticmVhaztjYXNlImRvdWJsZS1xdW90ZWQtc2NhbGFyIjphPXNlLlFVT1RFX0RPVUJMRSx1PWx4KGksbCk7YnJlYWs7ZGVmYXVsdDpyZXR1cm4gbihlLCJVTkVYUEVDVEVEX1RPS0VOIixgRXhwZWN0ZWQgYSBmbG93IHNjYWxhciB2YWx1ZSwgYnV0IGZvdW5kOiAke3N9YCkse3ZhbHVlOiIiLHR5cGU6bnVsbCxjb21tZW50OiIiLHJhbmdlOltyLHIraS5sZW5ndGgscitpLmxlbmd0aF19fWNvbnN0IGY9citpLmxlbmd0aCxjPXZhKG8sZix0LG4pO3JldHVybnt2YWx1ZTp1LHR5cGU6YSxjb21tZW50OmMuY29tbWVudCxyYW5nZTpbcixmLGMub2Zmc2V0XX19ZnVuY3Rpb24gYXgoZSx0KXtsZXQgbj0iIjtzd2l0Y2goZVswXSl7Y2FzZSIJIjpuPSJhIHRhYiBjaGFyYWN0ZXIiO2JyZWFrO2Nhc2UiLCI6bj0iZmxvdyBpbmRpY2F0b3IgY2hhcmFjdGVyICwiO2JyZWFrO2Nhc2UiJSI6bj0iZGlyZWN0aXZlIGluZGljYXRvciBjaGFyYWN0ZXIgJSI7YnJlYWs7Y2FzZSJ8IjpjYXNlIj4iOntuPWBibG9jayBzY2FsYXIgaW5kaWNhdG9yICR7ZVswXX1gO2JyZWFrfWNhc2UiQCI6Y2FzZSJgIjp7bj1gcmVzZXJ2ZWQgY2hhcmFjdGVyICR7ZVswXX1gO2JyZWFrfX1yZXR1cm4gbiYmdCgwLCJCQURfU0NBTEFSX1NUQVJUIixgUGxhaW4gdmFsdWUgY2Fubm90IHN0YXJ0IHdpdGggJHtufWApLG9EKGUpfWZ1bmN0aW9uIHV4KGUsdCl7cmV0dXJuKGVbZS5sZW5ndGgtMV0hPT0iJyJ8fGUubGVuZ3RoPT09MSkmJnQoZS5sZW5ndGgsIk1JU1NJTkdfQ0hBUiIsIk1pc3NpbmcgY2xvc2luZyAncXVvdGUiKSxvRChlLnNsaWNlKDEsLTEpKS5yZXBsYWNlKC8nJy9nLCInIil9ZnVuY3Rpb24gb0QoZSl7Y29uc3QgdD0vKC4qPylccj9cbi9zeTtsZXQgbj10LmV4ZWMoZSk7aWYoIW4pcmV0dXJuIGU7bGV0IHIsczt0cnl7cj1uZXcgUmVnRXhwKCIoPzwhWyAJXSlbIAldKyQiKSxzPW5ldyBSZWdFeHAoIl5bIAldK3woPzwhWyAJXSlbIAldKyQiLCJnIil9Y2F0Y2h7cj0vWyBcdF0rJC8scz0vXlsgXHRdK3xbIFx0XSskL2d9bGV0IGk9blsxXS5yZXBsYWNlKHIsIiIpLG89IiAiLGE9dC5sYXN0SW5kZXg7Zm9yKDtuPXQuZXhlYyhlKTspe2NvbnN0IGw9blsxXS5yZXBsYWNlKHMsIiIpO2w9PT0iIj9vPT09YApgP2krPW86bz1gCmA6KGkrPW8rbCxvPSIgIiksYT10Lmxhc3RJbmRleH1jb25zdCB1PS9bIFx0XSooLiopL3N5O3JldHVybiB1Lmxhc3RJbmRleD1hLG49dS5leGVjKGUpLGkrbysoKG49PW51bGw/dm9pZCAwOm5bMV0pPz8iIil9ZnVuY3Rpb24gbHgoZSx0KXtsZXQgbj0iIjtmb3IobGV0IHI9MTtyPGUubGVuZ3RoLTE7KytyKXtjb25zdCBzPWVbcl07aWYoIShzPT09IlxyIiYmZVtyKzFdPT09YApgKSlpZihzPT09YApgKXtjb25zdHtmb2xkOmksb2Zmc2V0Om99PWN4KGUscik7bis9aSxyPW99ZWxzZSBpZihzPT09IlxcIil7bGV0IGk9ZVsrK3JdO2NvbnN0IG89ZnhbaV07aWYobyluKz1vO2Vsc2UgaWYoaT09PWAKYClmb3IoaT1lW3IrMV07aT09PSIgInx8aT09PSIJIjspaT1lWysrcisxXTtlbHNlIGlmKGk9PT0iXHIiJiZlW3IrMV09PT1gCmApZm9yKGk9ZVsrK3IrMV07aT09PSIgInx8aT09PSIJIjspaT1lWysrcisxXTtlbHNlIGlmKGk9PT0ieCJ8fGk9PT0idSJ8fGk9PT0iVSIpe2NvbnN0IGE9aT09PSJ4Ij8yOmk9PT0idSI/NDo4O24rPXB4KGUscisxLGEsdCkscis9YX1lbHNle2NvbnN0IGE9ZS5zdWJzdHIoci0xLDIpO3Qoci0xLCJCQURfRFFfRVNDQVBFIixgSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgJHthfWApLG4rPWF9fWVsc2UgaWYocz09PSIgInx8cz09PSIJIil7Y29uc3QgaT1yO2xldCBvPWVbcisxXTtmb3IoO289PT0iICJ8fG89PT0iCSI7KW89ZVsrK3IrMV07byE9PWAKYCYmIShvPT09IlxyIiYmZVtyKzJdPT09YApgKSYmKG4rPXI+aT9lLnNsaWNlKGkscisxKTpzKX1lbHNlIG4rPXN9cmV0dXJuKGVbZS5sZW5ndGgtMV0hPT0nIid8fGUubGVuZ3RoPT09MSkmJnQoZS5sZW5ndGgsIk1JU1NJTkdfQ0hBUiIsJ01pc3NpbmcgY2xvc2luZyAicXVvdGUnKSxufWZ1bmN0aW9uIGN4KGUsdCl7bGV0IG49IiIscj1lW3QrMV07Zm9yKDsocj09PSIgInx8cj09PSIJInx8cj09PWAKYHx8cj09PSJcciIpJiYhKHI9PT0iXHIiJiZlW3QrMl0hPT1gCmApOylyPT09YApgJiYobis9YApgKSx0Kz0xLHI9ZVt0KzFdO3JldHVybiBufHwobj0iICIpLHtmb2xkOm4sb2Zmc2V0OnR9fWNvbnN0IGZ4PXswOiJcMCIsYToiXHgwNyIsYjoiXGIiLGU6Ilx4MUIiLGY6IlxmIixuOmAKYCxyOiJcciIsdDoiCSIsdjoiXHYiLE46IsKFIixfOiLCoCIsTDoiXHUyMDI4IixQOiJcdTIwMjkiLCIgIjoiICIsJyInOiciJywiLyI6Ii8iLCJcXCI6IlxcIiwiCSI6IgkifTtmdW5jdGlvbiBweChlLHQsbixyKXtjb25zdCBzPWUuc3Vic3RyKHQsbiksbz1zLmxlbmd0aD09PW4mJi9eWzAtOWEtZkEtRl0rJC8udGVzdChzKT9wYXJzZUludChzLDE2KTpOYU47dHJ5e3JldHVybiBTdHJpbmcuZnJvbUNvZGVQb2ludChvKX1jYXRjaHtjb25zdCBhPWUuc3Vic3RyKHQtMixuKzIpO3JldHVybiByKHQtMiwiQkFEX0RRX0VTQ0FQRSIsYEludmFsaWQgZXNjYXBlIHNlcXVlbmNlICR7YX1gKSxhfX1mdW5jdGlvbiBhRChlLHQsbixyKXtjb25zdHt2YWx1ZTpzLHR5cGU6aSxjb21tZW50Om8scmFuZ2U6YX09dC50eXBlPT09ImJsb2NrLXNjYWxhciI/cngoZSx0LHIpOm94KHQsZS5vcHRpb25zLnN0cmljdCxyKSx1PW4/ZS5kaXJlY3RpdmVzLnRhZ05hbWUobi5zb3VyY2UsYz0+cihuLCJUQUdfUkVTT0xWRV9GQUlMRUQiLGMpKTpudWxsO2xldCBsO2Uub3B0aW9ucy5zdHJpbmdLZXlzJiZlLmF0S2V5P2w9ZS5zY2hlbWFbZXJdOnU/bD1oeChlLnNjaGVtYSxzLHUsbixyKTp0LnR5cGU9PT0ic2NhbGFyIj9sPWR4KGUscyx0LHIpOmw9ZS5zY2hlbWFbZXJdO2xldCBmO3RyeXtjb25zdCBjPWwucmVzb2x2ZShzLHA9PnIobj8/dCwiVEFHX1JFU09MVkVfRkFJTEVEIixwKSxlLm9wdGlvbnMpO2Y9WihjKT9jOm5ldyBzZShjKX1jYXRjaChjKXtjb25zdCBwPWMgaW5zdGFuY2VvZiBFcnJvcj9jLm1lc3NhZ2U6U3RyaW5nKGMpO3Iobj8/dCwiVEFHX1JFU09MVkVfRkFJTEVEIixwKSxmPW5ldyBzZShzKX1yZXR1cm4gZi5yYW5nZT1hLGYuc291cmNlPXMsaSYmKGYudHlwZT1pKSx1JiYoZi50YWc9dSksbC5mb3JtYXQmJihmLmZvcm1hdD1sLmZvcm1hdCksbyYmKGYuY29tbWVudD1vKSxmfWZ1bmN0aW9uIGh4KGUsdCxuLHIscyl7dmFyIGE7aWYobj09PSIhIilyZXR1cm4gZVtlcl07Y29uc3QgaT1bXTtmb3IoY29uc3QgdSBvZiBlLnRhZ3MpaWYoIXUuY29sbGVjdGlvbiYmdS50YWc9PT1uKWlmKHUuZGVmYXVsdCYmdS50ZXN0KWkucHVzaCh1KTtlbHNlIHJldHVybiB1O2Zvcihjb25zdCB1IG9mIGkpaWYoKGE9dS50ZXN0KSE9bnVsbCYmYS50ZXN0KHQpKXJldHVybiB1O2NvbnN0IG89ZS5rbm93blRhZ3Nbbl07cmV0dXJuIG8mJiFvLmNvbGxlY3Rpb24/KGUudGFncy5wdXNoKE9iamVjdC5hc3NpZ24oe30sbyx7ZGVmYXVsdDohMSx0ZXN0OnZvaWQgMH0pKSxvKToocyhyLCJUQUdfUkVTT0xWRV9GQUlMRUQiLGBVbnJlc29sdmVkIHRhZzogJHtufWAsbiE9PSJ0YWc6eWFtbC5vcmcsMjAwMjpzdHIiKSxlW2VyXSl9ZnVuY3Rpb24gZHgoe2F0S2V5OmUsZGlyZWN0aXZlczp0LHNjaGVtYTpufSxyLHMsaSl7Y29uc3Qgbz1uLnRhZ3MuZmluZChhPT57dmFyIHU7cmV0dXJuKGEuZGVmYXVsdD09PSEwfHxlJiZhLmRlZmF1bHQ9PT0ia2V5IikmJigodT1hLnRlc3QpPT1udWxsP3ZvaWQgMDp1LnRlc3QocikpfSl8fG5bZXJdO2lmKG4uY29tcGF0KXtjb25zdCBhPW4uY29tcGF0LmZpbmQodT0+e3ZhciBsO3JldHVybiB1LmRlZmF1bHQmJigobD11LnRlc3QpPT1udWxsP3ZvaWQgMDpsLnRlc3QocikpfSk/P25bZXJdO2lmKG8udGFnIT09YS50YWcpe2NvbnN0IHU9dC50YWdTdHJpbmcoby50YWcpLGw9dC50YWdTdHJpbmcoYS50YWcpLGY9YFZhbHVlIG1heSBiZSBwYXJzZWQgYXMgZWl0aGVyICR7dX0gb3IgJHtsfWA7aShzLCJUQUdfUkVTT0xWRV9GQUlMRUQiLGYsITApfX1yZXR1cm4gb31mdW5jdGlvbiBteChlLHQsbil7aWYodCl7bj8/KG49dC5sZW5ndGgpO2ZvcihsZXQgcj1uLTE7cj49MDstLXIpe2xldCBzPXRbcl07c3dpdGNoKHMudHlwZSl7Y2FzZSJzcGFjZSI6Y2FzZSJjb21tZW50IjpjYXNlIm5ld2xpbmUiOmUtPXMuc291cmNlLmxlbmd0aDtjb250aW51ZX1mb3Iocz10Wysrcl07KHM9PW51bGw/dm9pZCAwOnMudHlwZSk9PT0ic3BhY2UiOyllKz1zLnNvdXJjZS5sZW5ndGgscz10Wysrcl07YnJlYWt9fXJldHVybiBlfWNvbnN0IGd4PXtjb21wb3NlTm9kZTp1RCxjb21wb3NlRW1wdHlOb2RlOlFwfTtmdW5jdGlvbiB1RChlLHQsbixyKXtjb25zdCBzPWUuYXRLZXkse3NwYWNlQmVmb3JlOmksY29tbWVudDpvLGFuY2hvcjphLHRhZzp1fT1uO2xldCBsLGY9ITA7c3dpdGNoKHQudHlwZSl7Y2FzZSJhbGlhcyI6bD15eChlLHQsciksKGF8fHUpJiZyKHQsIkFMSUFTX1BST1BTIiwiQW4gYWxpYXMgbm9kZSBtdXN0IG5vdCBzcGVjaWZ5IGFueSBwcm9wZXJ0aWVzIik7YnJlYWs7Y2FzZSJzY2FsYXIiOmNhc2Uic2luZ2xlLXF1b3RlZC1zY2FsYXIiOmNhc2UiZG91YmxlLXF1b3RlZC1zY2FsYXIiOmNhc2UiYmxvY2stc2NhbGFyIjpsPWFEKGUsdCx1LHIpLGEmJihsLmFuY2hvcj1hLnNvdXJjZS5zdWJzdHJpbmcoMSkpO2JyZWFrO2Nhc2UiYmxvY2stbWFwIjpjYXNlImJsb2NrLXNlcSI6Y2FzZSJmbG93LWNvbGxlY3Rpb24iOnRyeXtsPW54KGd4LGUsdCxuLHIpLGEmJihsLmFuY2hvcj1hLnNvdXJjZS5zdWJzdHJpbmcoMSkpfWNhdGNoKGMpe2NvbnN0IHA9YyBpbnN0YW5jZW9mIEVycm9yP2MubWVzc2FnZTpTdHJpbmcoYyk7cih0LCJSRVNPVVJDRV9FWEhBVVNUSU9OIixwKX1icmVhaztkZWZhdWx0Ontjb25zdCBjPXQudHlwZT09PSJlcnJvciI/dC5tZXNzYWdlOmBVbnN1cHBvcnRlZCB0b2tlbiAodHlwZTogJHt0LnR5cGV9KWA7cih0LCJVTkVYUEVDVEVEX1RPS0VOIixjKSxmPSExfX1yZXR1cm4gbD8/KGw9UXAoZSx0Lm9mZnNldCx2b2lkIDAsbnVsbCxuLHIpKSxhJiZsLmFuY2hvcj09PSIiJiZyKGEsIkJBRF9BTElBUyIsIkFuY2hvciBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIikscyYmZS5vcHRpb25zLnN0cmluZ0tleXMmJighWihsKXx8dHlwZW9mIGwudmFsdWUhPSJzdHJpbmcifHxsLnRhZyYmbC50YWchPT0idGFnOnlhbWwub3JnLDIwMDI6c3RyIikmJnIodT8/dCwiTk9OX1NUUklOR19LRVkiLCJXaXRoIHN0cmluZ0tleXMsIGFsbCBrZXlzIG11c3QgYmUgc3RyaW5ncyIpLGkmJihsLnNwYWNlQmVmb3JlPSEwKSxvJiYodC50eXBlPT09InNjYWxhciImJnQuc291cmNlPT09IiI/bC5jb21tZW50PW86bC5jb21tZW50QmVmb3JlPW8pLGUub3B0aW9ucy5rZWVwU291cmNlVG9rZW5zJiZmJiYobC5zcmNUb2tlbj10KSxsfWZ1bmN0aW9uIFFwKGUsdCxuLHIse3NwYWNlQmVmb3JlOnMsY29tbWVudDppLGFuY2hvcjpvLHRhZzphLGVuZDp1fSxsKXtjb25zdCBmPXt0eXBlOiJzY2FsYXIiLG9mZnNldDpteCh0LG4sciksaW5kZW50Oi0xLHNvdXJjZToiIn0sYz1hRChlLGYsYSxsKTtyZXR1cm4gbyYmKGMuYW5jaG9yPW8uc291cmNlLnN1YnN0cmluZygxKSxjLmFuY2hvcj09PSIiJiZsKG8sIkJBRF9BTElBUyIsIkFuY2hvciBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIikpLHMmJihjLnNwYWNlQmVmb3JlPSEwKSxpJiYoYy5jb21tZW50PWksYy5yYW5nZVsyXT11KSxjfWZ1bmN0aW9uIHl4KHtvcHRpb25zOmV9LHtvZmZzZXQ6dCxzb3VyY2U6bixlbmQ6cn0scyl7Y29uc3QgaT1uZXcgTHAobi5zdWJzdHJpbmcoMSkpO2kuc291cmNlPT09IiImJnModCwiQkFEX0FMSUFTIiwiQWxpYXMgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZyIpLGkuc291cmNlLmVuZHNXaXRoKCI6IikmJnModCtuLmxlbmd0aC0xLCJCQURfQUxJQVMiLCJBbGlhcyBlbmRpbmcgaW4gOiBpcyBhbWJpZ3VvdXMiLCEwKTtjb25zdCBvPXQrbi5sZW5ndGgsYT12YShyLG8sZS5zdHJpY3Qscyk7cmV0dXJuIGkucmFuZ2U9W3QsbyxhLm9mZnNldF0sYS5jb21tZW50JiYoaS5jb21tZW50PWEuY29tbWVudCksaX1mdW5jdGlvbiBEeChlLHQse29mZnNldDpuLHN0YXJ0OnIsdmFsdWU6cyxlbmQ6aX0sbyl7Y29uc3QgYT1PYmplY3QuYXNzaWduKHtfZGlyZWN0aXZlczp0fSxlKSx1PW5ldyBEYSh2b2lkIDAsYSksbD17YXRLZXk6ITEsYXRSb290OiEwLGRpcmVjdGl2ZXM6dS5kaXJlY3RpdmVzLG9wdGlvbnM6dS5vcHRpb25zLHNjaGVtYTp1LnNjaGVtYX0sZj10byhyLHtpbmRpY2F0b3I6ImRvYy1zdGFydCIsbmV4dDpzPz8oaT09bnVsbD92b2lkIDA6aVswXSksb2Zmc2V0Om4sb25FcnJvcjpvLHBhcmVudEluZGVudDowLHN0YXJ0T25OZXdsaW5lOiEwfSk7Zi5mb3VuZCYmKHUuZGlyZWN0aXZlcy5kb2NTdGFydD0hMCxzJiYocy50eXBlPT09ImJsb2NrLW1hcCJ8fHMudHlwZT09PSJibG9jay1zZXEiKSYmIWYuaGFzTmV3bGluZSYmbyhmLmVuZCwiTUlTU0lOR19DSEFSIiwiQmxvY2sgY29sbGVjdGlvbiBjYW5ub3Qgc3RhcnQgb24gc2FtZSBsaW5lIHdpdGggZGlyZWN0aXZlcy1lbmQgbWFya2VyIikpLHUuY29udGVudHM9cz91RChsLHMsZixvKTpRcChsLGYuZW5kLHIsbnVsbCxmLG8pO2NvbnN0IGM9dS5jb250ZW50cy5yYW5nZVsyXSxwPXZhKGksYywhMSxvKTtyZXR1cm4gcC5jb21tZW50JiYodS5jb21tZW50PXAuY29tbWVudCksdS5yYW5nZT1bbixjLHAub2Zmc2V0XSx1fWZ1bmN0aW9uIEZhKGUpe2lmKHR5cGVvZiBlPT0ibnVtYmVyIilyZXR1cm5bZSxlKzFdO2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGUubGVuZ3RoPT09Mj9lOltlWzBdLGVbMV1dO2NvbnN0e29mZnNldDp0LHNvdXJjZTpufT1lO3JldHVyblt0LHQrKHR5cGVvZiBuPT0ic3RyaW5nIj9uLmxlbmd0aDoxKV19ZnVuY3Rpb24gbEQoZSl7dmFyIHM7bGV0IHQ9IiIsbj0hMSxyPSExO2ZvcihsZXQgaT0wO2k8ZS5sZW5ndGg7KytpKXtjb25zdCBvPWVbaV07c3dpdGNoKG9bMF0pe2Nhc2UiIyI6dCs9KHQ9PT0iIj8iIjpyP2AKCmA6YApgKSsoby5zdWJzdHJpbmcoMSl8fCIgIiksbj0hMCxyPSExO2JyZWFrO2Nhc2UiJSI6KChzPWVbaSsxXSk9PW51bGw/dm9pZCAwOnNbMF0pIT09IiMiJiYoaSs9MSksbj0hMTticmVhaztkZWZhdWx0Om58fChyPSEwKSxuPSExfX1yZXR1cm57Y29tbWVudDp0LGFmdGVyRW1wdHlMaW5lOnJ9fWNsYXNzIGNEe2NvbnN0cnVjdG9yKHQ9e30pe3RoaXMuZG9jPW51bGwsdGhpcy5hdERpcmVjdGl2ZXM9ITEsdGhpcy5wcmVsdWRlPVtdLHRoaXMuZXJyb3JzPVtdLHRoaXMud2FybmluZ3M9W10sdGhpcy5vbkVycm9yPShuLHIscyxpKT0+e2NvbnN0IG89RmEobik7aT90aGlzLndhcm5pbmdzLnB1c2gobmV3IFE5KG8scixzKSk6dGhpcy5lcnJvcnMucHVzaChuZXcgYmEobyxyLHMpKX0sdGhpcy5kaXJlY3RpdmVzPW5ldyBDdCh7dmVyc2lvbjp0LnZlcnNpb258fCIxLjIifSksdGhpcy5vcHRpb25zPXR9ZGVjb3JhdGUodCxuKXtjb25zdHtjb21tZW50OnIsYWZ0ZXJFbXB0eUxpbmU6c309bEQodGhpcy5wcmVsdWRlKTtpZihyKXtjb25zdCBpPXQuY29udGVudHM7aWYobil0LmNvbW1lbnQ9dC5jb21tZW50P2Ake3QuY29tbWVudH0KJHtyfWA6cjtlbHNlIGlmKHN8fHQuZGlyZWN0aXZlcy5kb2NTdGFydHx8IWkpdC5jb21tZW50QmVmb3JlPXI7ZWxzZSBpZihJZShpKSYmIWkuZmxvdyYmaS5pdGVtcy5sZW5ndGg+MCl7bGV0IG89aS5pdGVtc1swXTt5ZShvKSYmKG89by5rZXkpO2NvbnN0IGE9by5jb21tZW50QmVmb3JlO28uY29tbWVudEJlZm9yZT1hP2Ake3J9CiR7YX1gOnJ9ZWxzZXtjb25zdCBvPWkuY29tbWVudEJlZm9yZTtpLmNvbW1lbnRCZWZvcmU9bz9gJHtyfQoke299YDpyfX1pZihuKXtmb3IobGV0IGk9MDtpPHRoaXMuZXJyb3JzLmxlbmd0aDsrK2kpdC5lcnJvcnMucHVzaCh0aGlzLmVycm9yc1tpXSk7Zm9yKGxldCBpPTA7aTx0aGlzLndhcm5pbmdzLmxlbmd0aDsrK2kpdC53YXJuaW5ncy5wdXNoKHRoaXMud2FybmluZ3NbaV0pfWVsc2UgdC5lcnJvcnM9dGhpcy5lcnJvcnMsdC53YXJuaW5ncz10aGlzLndhcm5pbmdzO3RoaXMucHJlbHVkZT1bXSx0aGlzLmVycm9ycz1bXSx0aGlzLndhcm5pbmdzPVtdfXN0cmVhbUluZm8oKXtyZXR1cm57Y29tbWVudDpsRCh0aGlzLnByZWx1ZGUpLmNvbW1lbnQsZGlyZWN0aXZlczp0aGlzLmRpcmVjdGl2ZXMsZXJyb3JzOnRoaXMuZXJyb3JzLHdhcm5pbmdzOnRoaXMud2FybmluZ3N9fSpjb21wb3NlKHQsbj0hMSxyPS0xKXtmb3IoY29uc3QgcyBvZiB0KXlpZWxkKnRoaXMubmV4dChzKTt5aWVsZCp0aGlzLmVuZChuLHIpfSpuZXh0KHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UiZGlyZWN0aXZlIjp0aGlzLmRpcmVjdGl2ZXMuYWRkKHQuc291cmNlLChuLHIscyk9Pntjb25zdCBpPUZhKHQpO2lbMF0rPW4sdGhpcy5vbkVycm9yKGksIkJBRF9ESVJFQ1RJVkUiLHIscyl9KSx0aGlzLnByZWx1ZGUucHVzaCh0LnNvdXJjZSksdGhpcy5hdERpcmVjdGl2ZXM9ITA7YnJlYWs7Y2FzZSJkb2N1bWVudCI6e2NvbnN0IG49RHgodGhpcy5vcHRpb25zLHRoaXMuZGlyZWN0aXZlcyx0LHRoaXMub25FcnJvcik7dGhpcy5hdERpcmVjdGl2ZXMmJiFuLmRpcmVjdGl2ZXMuZG9jU3RhcnQmJnRoaXMub25FcnJvcih0LCJNSVNTSU5HX0NIQVIiLCJNaXNzaW5nIGRpcmVjdGl2ZXMtZW5kL2RvYy1zdGFydCBpbmRpY2F0b3IgbGluZSIpLHRoaXMuZGVjb3JhdGUobiwhMSksdGhpcy5kb2MmJih5aWVsZCB0aGlzLmRvYyksdGhpcy5kb2M9bix0aGlzLmF0RGlyZWN0aXZlcz0hMTticmVha31jYXNlImJ5dGUtb3JkZXItbWFyayI6Y2FzZSJzcGFjZSI6YnJlYWs7Y2FzZSJjb21tZW50IjpjYXNlIm5ld2xpbmUiOnRoaXMucHJlbHVkZS5wdXNoKHQuc291cmNlKTticmVhaztjYXNlImVycm9yIjp7Y29uc3Qgbj10LnNvdXJjZT9gJHt0Lm1lc3NhZ2V9OiAke0pTT04uc3RyaW5naWZ5KHQuc291cmNlKX1gOnQubWVzc2FnZSxyPW5ldyBiYShGYSh0KSwiVU5FWFBFQ1RFRF9UT0tFTiIsbik7dGhpcy5hdERpcmVjdGl2ZXN8fCF0aGlzLmRvYz90aGlzLmVycm9ycy5wdXNoKHIpOnRoaXMuZG9jLmVycm9ycy5wdXNoKHIpO2JyZWFrfWNhc2UiZG9jLWVuZCI6e2lmKCF0aGlzLmRvYyl7Y29uc3Qgcj0iVW5leHBlY3RlZCBkb2MtZW5kIHdpdGhvdXQgcHJlY2VkaW5nIGRvY3VtZW50Ijt0aGlzLmVycm9ycy5wdXNoKG5ldyBiYShGYSh0KSwiVU5FWFBFQ1RFRF9UT0tFTiIscikpO2JyZWFrfXRoaXMuZG9jLmRpcmVjdGl2ZXMuZG9jRW5kPSEwO2NvbnN0IG49dmEodC5lbmQsdC5vZmZzZXQrdC5zb3VyY2UubGVuZ3RoLHRoaXMuZG9jLm9wdGlvbnMuc3RyaWN0LHRoaXMub25FcnJvcik7aWYodGhpcy5kZWNvcmF0ZSh0aGlzLmRvYywhMCksbi5jb21tZW50KXtjb25zdCByPXRoaXMuZG9jLmNvbW1lbnQ7dGhpcy5kb2MuY29tbWVudD1yP2Ake3J9CiR7bi5jb21tZW50fWA6bi5jb21tZW50fXRoaXMuZG9jLnJhbmdlWzJdPW4ub2Zmc2V0O2JyZWFrfWRlZmF1bHQ6dGhpcy5lcnJvcnMucHVzaChuZXcgYmEoRmEodCksIlVORVhQRUNURURfVE9LRU4iLGBVbnN1cHBvcnRlZCB0b2tlbiAke3QudHlwZX1gKSl9fSplbmQodD0hMSxuPS0xKXtpZih0aGlzLmRvYyl0aGlzLmRlY29yYXRlKHRoaXMuZG9jLCEwKSx5aWVsZCB0aGlzLmRvYyx0aGlzLmRvYz1udWxsO2Vsc2UgaWYodCl7Y29uc3Qgcj1PYmplY3QuYXNzaWduKHtfZGlyZWN0aXZlczp0aGlzLmRpcmVjdGl2ZXN9LHRoaXMub3B0aW9ucykscz1uZXcgRGEodm9pZCAwLHIpO3RoaXMuYXREaXJlY3RpdmVzJiZ0aGlzLm9uRXJyb3IobiwiTUlTU0lOR19DSEFSIiwiTWlzc2luZyBkaXJlY3RpdmVzLWVuZCBpbmRpY2F0b3IgbGluZSIpLHMucmFuZ2U9WzAsbixuXSx0aGlzLmRlY29yYXRlKHMsITEpLHlpZWxkIHN9fX1jb25zdCBFbD1lPT4idHlwZSJpbiBlP3ZsKGUpOkZsKGUpO2Z1bmN0aW9uIHZsKGUpe3N3aXRjaChlLnR5cGUpe2Nhc2UiYmxvY2stc2NhbGFyIjp7bGV0IHQ9IiI7Zm9yKGNvbnN0IG4gb2YgZS5wcm9wcyl0Kz12bChuKTtyZXR1cm4gdCtlLnNvdXJjZX1jYXNlImJsb2NrLW1hcCI6Y2FzZSJibG9jay1zZXEiOntsZXQgdD0iIjtmb3IoY29uc3QgbiBvZiBlLml0ZW1zKXQrPUZsKG4pO3JldHVybiB0fWNhc2UiZmxvdy1jb2xsZWN0aW9uIjp7bGV0IHQ9ZS5zdGFydC5zb3VyY2U7Zm9yKGNvbnN0IG4gb2YgZS5pdGVtcyl0Kz1GbChuKTtmb3IoY29uc3QgbiBvZiBlLmVuZCl0Kz1uLnNvdXJjZTtyZXR1cm4gdH1jYXNlImRvY3VtZW50Ijp7bGV0IHQ9RmwoZSk7aWYoZS5lbmQpZm9yKGNvbnN0IG4gb2YgZS5lbmQpdCs9bi5zb3VyY2U7cmV0dXJuIHR9ZGVmYXVsdDp7bGV0IHQ9ZS5zb3VyY2U7aWYoImVuZCJpbiBlJiZlLmVuZClmb3IoY29uc3QgbiBvZiBlLmVuZCl0Kz1uLnNvdXJjZTtyZXR1cm4gdH19fWZ1bmN0aW9uIEZsKHtzdGFydDplLGtleTp0LHNlcDpuLHZhbHVlOnJ9KXtsZXQgcz0iIjtmb3IoY29uc3QgaSBvZiBlKXMrPWkuc291cmNlO2lmKHQmJihzKz12bCh0KSksbilmb3IoY29uc3QgaSBvZiBuKXMrPWkuc291cmNlO3JldHVybiByJiYocys9dmwocikpLHN9Y29uc3QgWnA9U3ltYm9sKCJicmVhayB2aXNpdCIpLGJ4PVN5bWJvbCgic2tpcCBjaGlsZHJlbiIpLGZEPVN5bWJvbCgicmVtb3ZlIGl0ZW0iKTtmdW5jdGlvbiBXcyhlLHQpeyJ0eXBlImluIGUmJmUudHlwZT09PSJkb2N1bWVudCImJihlPXtzdGFydDplLnN0YXJ0LHZhbHVlOmUudmFsdWV9KSxwRChPYmplY3QuZnJlZXplKFtdKSxlLHQpfVdzLkJSRUFLPVpwLFdzLlNLSVA9YngsV3MuUkVNT1ZFPWZELFdzLml0ZW1BdFBhdGg9KGUsdCk9PntsZXQgbj1lO2Zvcihjb25zdFtyLHNdb2YgdCl7Y29uc3QgaT1uPT1udWxsP3ZvaWQgMDpuW3JdO2lmKGkmJiJpdGVtcyJpbiBpKW49aS5pdGVtc1tzXTtlbHNlIHJldHVybn1yZXR1cm4gbn0sV3MucGFyZW50Q29sbGVjdGlvbj0oZSx0KT0+e2NvbnN0IG49V3MuaXRlbUF0UGF0aChlLHQuc2xpY2UoMCwtMSkpLHI9dFt0Lmxlbmd0aC0xXVswXSxzPW49PW51bGw/dm9pZCAwOm5bcl07aWYocyYmIml0ZW1zImluIHMpcmV0dXJuIHM7dGhyb3cgbmV3IEVycm9yKCJQYXJlbnQgY29sbGVjdGlvbiBub3QgZm91bmQiKX07ZnVuY3Rpb24gcEQoZSx0LG4pe2xldCByPW4odCxlKTtpZih0eXBlb2Ygcj09InN5bWJvbCIpcmV0dXJuIHI7Zm9yKGNvbnN0IHMgb2ZbImtleSIsInZhbHVlIl0pe2NvbnN0IGk9dFtzXTtpZihpJiYiaXRlbXMiaW4gaSl7Zm9yKGxldCBvPTA7bzxpLml0ZW1zLmxlbmd0aDsrK28pe2NvbnN0IGE9cEQoT2JqZWN0LmZyZWV6ZShlLmNvbmNhdChbW3Msb11dKSksaS5pdGVtc1tvXSxuKTtpZih0eXBlb2YgYT09Im51bWJlciIpbz1hLTE7ZWxzZXtpZihhPT09WnApcmV0dXJuIFpwO2E9PT1mRCYmKGkuaXRlbXMuc3BsaWNlKG8sMSksby09MSl9fXR5cGVvZiByPT0iZnVuY3Rpb24iJiZzPT09ImtleSImJihyPXIodCxlKSl9fXJldHVybiB0eXBlb2Ygcj09ImZ1bmN0aW9uIj9yKHQsZSk6cn1jb25zdCBoRD0iXHVGRUZGIixkRD0iAiIsbUQ9IhgiLGVoPSIfIixnRD1lPT4hIWUmJiJpdGVtcyJpbiBlLHRoPWU9PiEhZSYmKGUudHlwZT09PSJzY2FsYXIifHxlLnR5cGU9PT0ic2luZ2xlLXF1b3RlZC1zY2FsYXIifHxlLnR5cGU9PT0iZG91YmxlLXF1b3RlZC1zY2FsYXIifHxlLnR5cGU9PT0iYmxvY2stc2NhbGFyIik7ZnVuY3Rpb24gRXgoZSl7c3dpdGNoKGUpe2Nhc2UgaEQ6cmV0dXJuImJ5dGUtb3JkZXItbWFyayI7Y2FzZSBkRDpyZXR1cm4iZG9jLW1vZGUiO2Nhc2UgbUQ6cmV0dXJuImZsb3ctZXJyb3ItZW5kIjtjYXNlIGVoOnJldHVybiJzY2FsYXIiO2Nhc2UiLS0tIjpyZXR1cm4iZG9jLXN0YXJ0IjtjYXNlIi4uLiI6cmV0dXJuImRvYy1lbmQiO2Nhc2UiIjpjYXNlYApgOmNhc2VgXHIKYDpyZXR1cm4ibmV3bGluZSI7Y2FzZSItIjpyZXR1cm4ic2VxLWl0ZW0taW5kIjtjYXNlIj8iOnJldHVybiJleHBsaWNpdC1rZXktaW5kIjtjYXNlIjoiOnJldHVybiJtYXAtdmFsdWUtaW5kIjtjYXNlInsiOnJldHVybiJmbG93LW1hcC1zdGFydCI7Y2FzZSJ9IjpyZXR1cm4iZmxvdy1tYXAtZW5kIjtjYXNlIlsiOnJldHVybiJmbG93LXNlcS1zdGFydCI7Y2FzZSJdIjpyZXR1cm4iZmxvdy1zZXEtZW5kIjtjYXNlIiwiOnJldHVybiJjb21tYSJ9c3dpdGNoKGVbMF0pe2Nhc2UiICI6Y2FzZSIJIjpyZXR1cm4ic3BhY2UiO2Nhc2UiIyI6cmV0dXJuImNvbW1lbnQiO2Nhc2UiJSI6cmV0dXJuImRpcmVjdGl2ZS1saW5lIjtjYXNlIioiOnJldHVybiJhbGlhcyI7Y2FzZSImIjpyZXR1cm4iYW5jaG9yIjtjYXNlIiEiOnJldHVybiJ0YWciO2Nhc2UiJyI6cmV0dXJuInNpbmdsZS1xdW90ZWQtc2NhbGFyIjtjYXNlJyInOnJldHVybiJkb3VibGUtcXVvdGVkLXNjYWxhciI7Y2FzZSJ8IjpjYXNlIj4iOnJldHVybiJibG9jay1zY2FsYXItaGVhZGVyIn1yZXR1cm4gbnVsbH1mdW5jdGlvbiBSbihlKXtzd2l0Y2goZSl7Y2FzZSB2b2lkIDA6Y2FzZSIgIjpjYXNlYApgOmNhc2UiXHIiOmNhc2UiCSI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX19Y29uc3QgeUQ9bmV3IFNldCgiMDEyMzQ1Njc4OUFCQ0RFRmFiY2RlZiIpLHZ4PW5ldyBTZXQoIjAxMjM0NTY3ODlBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6LSM7Lz86QCY9KyRfLiF+KicoKSIpLEFsPW5ldyBTZXQoIixbXXt9IiksRng9bmV3IFNldChgICxbXXt9ClxyCWApLG5oPWU9PiFlfHxGeC5oYXMoZSk7Y2xhc3MgQXh7Y29uc3RydWN0b3IoKXt0aGlzLmF0RW5kPSExLHRoaXMuYmxvY2tTY2FsYXJJbmRlbnQ9LTEsdGhpcy5ibG9ja1NjYWxhcktlZXA9ITEsdGhpcy5idWZmZXI9IiIsdGhpcy5mbG93S2V5PSExLHRoaXMuZmxvd0xldmVsPTAsdGhpcy5pbmRlbnROZXh0PTAsdGhpcy5pbmRlbnRWYWx1ZT0wLHRoaXMubGluZUVuZFBvcz1udWxsLHRoaXMubmV4dD1udWxsLHRoaXMucG9zPTB9KmxleCh0LG49ITEpe2lmKHQpe2lmKHR5cGVvZiB0IT0ic3RyaW5nIil0aHJvdyBUeXBlRXJyb3IoInNvdXJjZSBpcyBub3QgYSBzdHJpbmciKTt0aGlzLmJ1ZmZlcj10aGlzLmJ1ZmZlcj90aGlzLmJ1ZmZlcit0OnQsdGhpcy5saW5lRW5kUG9zPW51bGx9dGhpcy5hdEVuZD0hbjtsZXQgcj10aGlzLm5leHQ/PyJzdHJlYW0iO2Zvcig7ciYmKG58fHRoaXMuaGFzQ2hhcnMoMSkpOylyPXlpZWxkKnRoaXMucGFyc2VOZXh0KHIpfWF0TGluZUVuZCgpe2xldCB0PXRoaXMucG9zLG49dGhpcy5idWZmZXJbdF07Zm9yKDtuPT09IiAifHxuPT09IgkiOyluPXRoaXMuYnVmZmVyWysrdF07cmV0dXJuIW58fG49PT0iIyJ8fG49PT1gCmA/ITA6bj09PSJcciI/dGhpcy5idWZmZXJbdCsxXT09PWAKYDohMX1jaGFyQXQodCl7cmV0dXJuIHRoaXMuYnVmZmVyW3RoaXMucG9zK3RdfWNvbnRpbnVlU2NhbGFyKHQpe2xldCBuPXRoaXMuYnVmZmVyW3RdO2lmKHRoaXMuaW5kZW50TmV4dD4wKXtsZXQgcj0wO2Zvcig7bj09PSIgIjspbj10aGlzLmJ1ZmZlclsrK3IrdF07aWYobj09PSJcciIpe2NvbnN0IHM9dGhpcy5idWZmZXJbcit0KzFdO2lmKHM9PT1gCmB8fCFzJiYhdGhpcy5hdEVuZClyZXR1cm4gdCtyKzF9cmV0dXJuIG49PT1gCmB8fHI+PXRoaXMuaW5kZW50TmV4dHx8IW4mJiF0aGlzLmF0RW5kP3QrcjotMX1pZihuPT09Ii0ifHxuPT09Ii4iKXtjb25zdCByPXRoaXMuYnVmZmVyLnN1YnN0cih0LDMpO2lmKChyPT09Ii0tLSJ8fHI9PT0iLi4uIikmJlJuKHRoaXMuYnVmZmVyW3QrM10pKXJldHVybi0xfXJldHVybiB0fWdldExpbmUoKXtsZXQgdD10aGlzLmxpbmVFbmRQb3M7cmV0dXJuKHR5cGVvZiB0IT0ibnVtYmVyInx8dCE9PS0xJiZ0PHRoaXMucG9zKSYmKHQ9dGhpcy5idWZmZXIuaW5kZXhPZihgCmAsdGhpcy5wb3MpLHRoaXMubGluZUVuZFBvcz10KSx0PT09LTE/dGhpcy5hdEVuZD90aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MpOm51bGw6KHRoaXMuYnVmZmVyW3QtMV09PT0iXHIiJiYodC09MSksdGhpcy5idWZmZXIuc3Vic3RyaW5nKHRoaXMucG9zLHQpKX1oYXNDaGFycyh0KXtyZXR1cm4gdGhpcy5wb3MrdDw9dGhpcy5idWZmZXIubGVuZ3RofXNldE5leHQodCl7cmV0dXJuIHRoaXMuYnVmZmVyPXRoaXMuYnVmZmVyLnN1YnN0cmluZyh0aGlzLnBvcyksdGhpcy5wb3M9MCx0aGlzLmxpbmVFbmRQb3M9bnVsbCx0aGlzLm5leHQ9dCxudWxsfXBlZWsodCl7cmV0dXJuIHRoaXMuYnVmZmVyLnN1YnN0cih0aGlzLnBvcyx0KX0qcGFyc2VOZXh0KHQpe3N3aXRjaCh0KXtjYXNlInN0cmVhbSI6cmV0dXJuIHlpZWxkKnRoaXMucGFyc2VTdHJlYW0oKTtjYXNlImxpbmUtc3RhcnQiOnJldHVybiB5aWVsZCp0aGlzLnBhcnNlTGluZVN0YXJ0KCk7Y2FzZSJibG9jay1zdGFydCI6cmV0dXJuIHlpZWxkKnRoaXMucGFyc2VCbG9ja1N0YXJ0KCk7Y2FzZSJkb2MiOnJldHVybiB5aWVsZCp0aGlzLnBhcnNlRG9jdW1lbnQoKTtjYXNlImZsb3ciOnJldHVybiB5aWVsZCp0aGlzLnBhcnNlRmxvd0NvbGxlY3Rpb24oKTtjYXNlInF1b3RlZC1zY2FsYXIiOnJldHVybiB5aWVsZCp0aGlzLnBhcnNlUXVvdGVkU2NhbGFyKCk7Y2FzZSJibG9jay1zY2FsYXIiOnJldHVybiB5aWVsZCp0aGlzLnBhcnNlQmxvY2tTY2FsYXIoKTtjYXNlInBsYWluLXNjYWxhciI6cmV0dXJuIHlpZWxkKnRoaXMucGFyc2VQbGFpblNjYWxhcigpfX0qcGFyc2VTdHJlYW0oKXtsZXQgdD10aGlzLmdldExpbmUoKTtpZih0PT09bnVsbClyZXR1cm4gdGhpcy5zZXROZXh0KCJzdHJlYW0iKTtpZih0WzBdPT09aEQmJih5aWVsZCp0aGlzLnB1c2hDb3VudCgxKSx0PXQuc3Vic3RyaW5nKDEpKSx0WzBdPT09IiUiKXtsZXQgbj10Lmxlbmd0aCxyPXQuaW5kZXhPZigiIyIpO2Zvcig7ciE9PS0xOyl7Y29uc3QgaT10W3ItMV07aWYoaT09PSIgInx8aT09PSIJIil7bj1yLTE7YnJlYWt9ZWxzZSByPXQuaW5kZXhPZigiIyIscisxKX1mb3IoOzspe2NvbnN0IGk9dFtuLTFdO2lmKGk9PT0iICJ8fGk9PT0iCSIpbi09MTtlbHNlIGJyZWFrfWNvbnN0IHM9KHlpZWxkKnRoaXMucHVzaENvdW50KG4pKSsoeWllbGQqdGhpcy5wdXNoU3BhY2VzKCEwKSk7cmV0dXJuIHlpZWxkKnRoaXMucHVzaENvdW50KHQubGVuZ3RoLXMpLHRoaXMucHVzaE5ld2xpbmUoKSwic3RyZWFtIn1pZih0aGlzLmF0TGluZUVuZCgpKXtjb25zdCBuPXlpZWxkKnRoaXMucHVzaFNwYWNlcyghMCk7cmV0dXJuIHlpZWxkKnRoaXMucHVzaENvdW50KHQubGVuZ3RoLW4pLHlpZWxkKnRoaXMucHVzaE5ld2xpbmUoKSwic3RyZWFtIn1yZXR1cm4geWllbGQgZEQseWllbGQqdGhpcy5wYXJzZUxpbmVTdGFydCgpfSpwYXJzZUxpbmVTdGFydCgpe2NvbnN0IHQ9dGhpcy5jaGFyQXQoMCk7aWYoIXQmJiF0aGlzLmF0RW5kKXJldHVybiB0aGlzLnNldE5leHQoImxpbmUtc3RhcnQiKTtpZih0PT09Ii0ifHx0PT09Ii4iKXtpZighdGhpcy5hdEVuZCYmIXRoaXMuaGFzQ2hhcnMoNCkpcmV0dXJuIHRoaXMuc2V0TmV4dCgibGluZS1zdGFydCIpO2NvbnN0IG49dGhpcy5wZWVrKDMpO2lmKChuPT09Ii0tLSJ8fG49PT0iLi4uIikmJlJuKHRoaXMuY2hhckF0KDMpKSlyZXR1cm4geWllbGQqdGhpcy5wdXNoQ291bnQoMyksdGhpcy5pbmRlbnRWYWx1ZT0wLHRoaXMuaW5kZW50TmV4dD0wLG49PT0iLS0tIj8iZG9jIjoic3RyZWFtIn1yZXR1cm4gdGhpcy5pbmRlbnRWYWx1ZT15aWVsZCp0aGlzLnB1c2hTcGFjZXMoITEpLHRoaXMuaW5kZW50TmV4dD50aGlzLmluZGVudFZhbHVlJiYhUm4odGhpcy5jaGFyQXQoMSkpJiYodGhpcy5pbmRlbnROZXh0PXRoaXMuaW5kZW50VmFsdWUpLHlpZWxkKnRoaXMucGFyc2VCbG9ja1N0YXJ0KCl9KnBhcnNlQmxvY2tTdGFydCgpe2NvbnN0W3Qsbl09dGhpcy5wZWVrKDIpO2lmKCFuJiYhdGhpcy5hdEVuZClyZXR1cm4gdGhpcy5zZXROZXh0KCJibG9jay1zdGFydCIpO2lmKCh0PT09Ii0ifHx0PT09Ij8ifHx0PT09IjoiKSYmUm4obikpe2NvbnN0IHI9KHlpZWxkKnRoaXMucHVzaENvdW50KDEpKSsoeWllbGQqdGhpcy5wdXNoU3BhY2VzKCEwKSk7cmV0dXJuIHRoaXMuaW5kZW50TmV4dD10aGlzLmluZGVudFZhbHVlKzEsdGhpcy5pbmRlbnRWYWx1ZSs9ciwiYmxvY2stc3RhcnQifXJldHVybiJkb2MifSpwYXJzZURvY3VtZW50KCl7eWllbGQqdGhpcy5wdXNoU3BhY2VzKCEwKTtjb25zdCB0PXRoaXMuZ2V0TGluZSgpO2lmKHQ9PT1udWxsKXJldHVybiB0aGlzLnNldE5leHQoImRvYyIpO2xldCBuPXlpZWxkKnRoaXMucHVzaEluZGljYXRvcnMoKTtzd2l0Y2godFtuXSl7Y2FzZSIjIjp5aWVsZCp0aGlzLnB1c2hDb3VudCh0Lmxlbmd0aC1uKTtjYXNlIHZvaWQgMDpyZXR1cm4geWllbGQqdGhpcy5wdXNoTmV3bGluZSgpLHlpZWxkKnRoaXMucGFyc2VMaW5lU3RhcnQoKTtjYXNlInsiOmNhc2UiWyI6cmV0dXJuIHlpZWxkKnRoaXMucHVzaENvdW50KDEpLHRoaXMuZmxvd0tleT0hMSx0aGlzLmZsb3dMZXZlbD0xLCJmbG93IjtjYXNlIn0iOmNhc2UiXSI6cmV0dXJuIHlpZWxkKnRoaXMucHVzaENvdW50KDEpLCJkb2MiO2Nhc2UiKiI6cmV0dXJuIHlpZWxkKnRoaXMucHVzaFVudGlsKG5oKSwiZG9jIjtjYXNlJyInOmNhc2UiJyI6cmV0dXJuIHlpZWxkKnRoaXMucGFyc2VRdW90ZWRTY2FsYXIoKTtjYXNlInwiOmNhc2UiPiI6cmV0dXJuIG4rPXlpZWxkKnRoaXMucGFyc2VCbG9ja1NjYWxhckhlYWRlcigpLG4rPXlpZWxkKnRoaXMucHVzaFNwYWNlcyghMCkseWllbGQqdGhpcy5wdXNoQ291bnQodC5sZW5ndGgtbikseWllbGQqdGhpcy5wdXNoTmV3bGluZSgpLHlpZWxkKnRoaXMucGFyc2VCbG9ja1NjYWxhcigpO2RlZmF1bHQ6cmV0dXJuIHlpZWxkKnRoaXMucGFyc2VQbGFpblNjYWxhcigpfX0qcGFyc2VGbG93Q29sbGVjdGlvbigpe2xldCB0LG4scj0tMTtkbyB0PXlpZWxkKnRoaXMucHVzaE5ld2xpbmUoKSx0PjA/KG49eWllbGQqdGhpcy5wdXNoU3BhY2VzKCExKSx0aGlzLmluZGVudFZhbHVlPXI9bik6bj0wLG4rPXlpZWxkKnRoaXMucHVzaFNwYWNlcyghMCk7d2hpbGUodCtuPjApO2NvbnN0IHM9dGhpcy5nZXRMaW5lKCk7aWYocz09PW51bGwpcmV0dXJuIHRoaXMuc2V0TmV4dCgiZmxvdyIpO2lmKChyIT09LTEmJnI8dGhpcy5pbmRlbnROZXh0JiZzWzBdIT09IiMifHxyPT09MCYmKHMuc3RhcnRzV2l0aCgiLS0tIil8fHMuc3RhcnRzV2l0aCgiLi4uIikpJiZSbihzWzNdKSkmJiEocj09PXRoaXMuaW5kZW50TmV4dC0xJiZ0aGlzLmZsb3dMZXZlbD09PTEmJihzWzBdPT09Il0ifHxzWzBdPT09In0iKSkpcmV0dXJuIHRoaXMuZmxvd0xldmVsPTAseWllbGQgbUQseWllbGQqdGhpcy5wYXJzZUxpbmVTdGFydCgpO2xldCBpPTA7Zm9yKDtzW2ldPT09IiwiOylpKz15aWVsZCp0aGlzLnB1c2hDb3VudCgxKSxpKz15aWVsZCp0aGlzLnB1c2hTcGFjZXMoITApLHRoaXMuZmxvd0tleT0hMTtzd2l0Y2goaSs9eWllbGQqdGhpcy5wdXNoSW5kaWNhdG9ycygpLHNbaV0pe2Nhc2Ugdm9pZCAwOnJldHVybiJmbG93IjtjYXNlIiMiOnJldHVybiB5aWVsZCp0aGlzLnB1c2hDb3VudChzLmxlbmd0aC1pKSwiZmxvdyI7Y2FzZSJ7IjpjYXNlIlsiOnJldHVybiB5aWVsZCp0aGlzLnB1c2hDb3VudCgxKSx0aGlzLmZsb3dLZXk9ITEsdGhpcy5mbG93TGV2ZWwrPTEsImZsb3ciO2Nhc2UifSI6Y2FzZSJdIjpyZXR1cm4geWllbGQqdGhpcy5wdXNoQ291bnQoMSksdGhpcy5mbG93S2V5PSEwLHRoaXMuZmxvd0xldmVsLT0xLHRoaXMuZmxvd0xldmVsPyJmbG93IjoiZG9jIjtjYXNlIioiOnJldHVybiB5aWVsZCp0aGlzLnB1c2hVbnRpbChuaCksImZsb3ciO2Nhc2UnIic6Y2FzZSInIjpyZXR1cm4gdGhpcy5mbG93S2V5PSEwLHlpZWxkKnRoaXMucGFyc2VRdW90ZWRTY2FsYXIoKTtjYXNlIjoiOntjb25zdCBvPXRoaXMuY2hhckF0KDEpO2lmKHRoaXMuZmxvd0tleXx8Um4obyl8fG89PT0iLCIpcmV0dXJuIHRoaXMuZmxvd0tleT0hMSx5aWVsZCp0aGlzLnB1c2hDb3VudCgxKSx5aWVsZCp0aGlzLnB1c2hTcGFjZXMoITApLCJmbG93In1kZWZhdWx0OnJldHVybiB0aGlzLmZsb3dLZXk9ITEseWllbGQqdGhpcy5wYXJzZVBsYWluU2NhbGFyKCl9fSpwYXJzZVF1b3RlZFNjYWxhcigpe2NvbnN0IHQ9dGhpcy5jaGFyQXQoMCk7bGV0IG49dGhpcy5idWZmZXIuaW5kZXhPZih0LHRoaXMucG9zKzEpO2lmKHQ9PT0iJyIpZm9yKDtuIT09LTEmJnRoaXMuYnVmZmVyW24rMV09PT0iJyI7KW49dGhpcy5idWZmZXIuaW5kZXhPZigiJyIsbisyKTtlbHNlIGZvcig7biE9PS0xOyl7bGV0IGk9MDtmb3IoO3RoaXMuYnVmZmVyW24tMS1pXT09PSJcXCI7KWkrPTE7aWYoaSUyPT09MClicmVhaztuPXRoaXMuYnVmZmVyLmluZGV4T2YoJyInLG4rMSl9Y29uc3Qgcj10aGlzLmJ1ZmZlci5zdWJzdHJpbmcoMCxuKTtsZXQgcz1yLmluZGV4T2YoYApgLHRoaXMucG9zKTtpZihzIT09LTEpe2Zvcig7cyE9PS0xOyl7Y29uc3QgaT10aGlzLmNvbnRpbnVlU2NhbGFyKHMrMSk7aWYoaT09PS0xKWJyZWFrO3M9ci5pbmRleE9mKGAKYCxpKX1zIT09LTEmJihuPXMtKHJbcy0xXT09PSJcciI/MjoxKSl9aWYobj09PS0xKXtpZighdGhpcy5hdEVuZClyZXR1cm4gdGhpcy5zZXROZXh0KCJxdW90ZWQtc2NhbGFyIik7bj10aGlzLmJ1ZmZlci5sZW5ndGh9cmV0dXJuIHlpZWxkKnRoaXMucHVzaFRvSW5kZXgobisxLCExKSx0aGlzLmZsb3dMZXZlbD8iZmxvdyI6ImRvYyJ9KnBhcnNlQmxvY2tTY2FsYXJIZWFkZXIoKXt0aGlzLmJsb2NrU2NhbGFySW5kZW50PS0xLHRoaXMuYmxvY2tTY2FsYXJLZWVwPSExO2xldCB0PXRoaXMucG9zO2Zvcig7Oyl7Y29uc3Qgbj10aGlzLmJ1ZmZlclsrK3RdO2lmKG49PT0iKyIpdGhpcy5ibG9ja1NjYWxhcktlZXA9ITA7ZWxzZSBpZihuPiIwIiYmbjw9IjkiKXRoaXMuYmxvY2tTY2FsYXJJbmRlbnQ9TnVtYmVyKG4pLTE7ZWxzZSBpZihuIT09Ii0iKWJyZWFrfXJldHVybiB5aWVsZCp0aGlzLnB1c2hVbnRpbChuPT5SbihuKXx8bj09PSIjIil9KnBhcnNlQmxvY2tTY2FsYXIoKXtsZXQgdD10aGlzLnBvcy0xLG49MCxyO2U6Zm9yKGxldCBpPXRoaXMucG9zO3I9dGhpcy5idWZmZXJbaV07KytpKXN3aXRjaChyKXtjYXNlIiAiOm4rPTE7YnJlYWs7Y2FzZWAKYDp0PWksbj0wO2JyZWFrO2Nhc2UiXHIiOntjb25zdCBvPXRoaXMuYnVmZmVyW2krMV07aWYoIW8mJiF0aGlzLmF0RW5kKXJldHVybiB0aGlzLnNldE5leHQoImJsb2NrLXNjYWxhciIpO2lmKG89PT1gCmApYnJlYWt9ZGVmYXVsdDpicmVhayBlfWlmKCFyJiYhdGhpcy5hdEVuZClyZXR1cm4gdGhpcy5zZXROZXh0KCJibG9jay1zY2FsYXIiKTtpZihuPj10aGlzLmluZGVudE5leHQpe3RoaXMuYmxvY2tTY2FsYXJJbmRlbnQ9PT0tMT90aGlzLmluZGVudE5leHQ9bjp0aGlzLmluZGVudE5leHQ9dGhpcy5ibG9ja1NjYWxhckluZGVudCsodGhpcy5pbmRlbnROZXh0PT09MD8xOnRoaXMuaW5kZW50TmV4dCk7ZG97Y29uc3QgaT10aGlzLmNvbnRpbnVlU2NhbGFyKHQrMSk7aWYoaT09PS0xKWJyZWFrO3Q9dGhpcy5idWZmZXIuaW5kZXhPZihgCmAsaSl9d2hpbGUodCE9PS0xKTtpZih0PT09LTEpe2lmKCF0aGlzLmF0RW5kKXJldHVybiB0aGlzLnNldE5leHQoImJsb2NrLXNjYWxhciIpO3Q9dGhpcy5idWZmZXIubGVuZ3RofX1sZXQgcz10KzE7Zm9yKHI9dGhpcy5idWZmZXJbc107cj09PSIgIjspcj10aGlzLmJ1ZmZlclsrK3NdO2lmKHI9PT0iCSIpe2Zvcig7cj09PSIJInx8cj09PSIgInx8cj09PSJcciJ8fHI9PT1gCmA7KXI9dGhpcy5idWZmZXJbKytzXTt0PXMtMX1lbHNlIGlmKCF0aGlzLmJsb2NrU2NhbGFyS2VlcClkb3tsZXQgaT10LTEsbz10aGlzLmJ1ZmZlcltpXTtvPT09IlxyIiYmKG89dGhpcy5idWZmZXJbLS1pXSk7Y29uc3QgYT1pO2Zvcig7bz09PSIgIjspbz10aGlzLmJ1ZmZlclstLWldO2lmKG89PT1gCmAmJmk+PXRoaXMucG9zJiZpKzErbj5hKXQ9aTtlbHNlIGJyZWFrfXdoaWxlKCEwKTtyZXR1cm4geWllbGQgZWgseWllbGQqdGhpcy5wdXNoVG9JbmRleCh0KzEsITApLHlpZWxkKnRoaXMucGFyc2VMaW5lU3RhcnQoKX0qcGFyc2VQbGFpblNjYWxhcigpe2NvbnN0IHQ9dGhpcy5mbG93TGV2ZWw+MDtsZXQgbj10aGlzLnBvcy0xLHI9dGhpcy5wb3MtMSxzO2Zvcig7cz10aGlzLmJ1ZmZlclsrK3JdOylpZihzPT09IjoiKXtjb25zdCBpPXRoaXMuYnVmZmVyW3IrMV07aWYoUm4oaSl8fHQmJkFsLmhhcyhpKSlicmVhaztuPXJ9ZWxzZSBpZihSbihzKSl7bGV0IGk9dGhpcy5idWZmZXJbcisxXTtpZihzPT09IlxyIiYmKGk9PT1gCmA/KHIrPTEscz1gCmAsaT10aGlzLmJ1ZmZlcltyKzFdKTpuPXIpLGk9PT0iIyJ8fHQmJkFsLmhhcyhpKSlicmVhaztpZihzPT09YApgKXtjb25zdCBvPXRoaXMuY29udGludWVTY2FsYXIocisxKTtpZihvPT09LTEpYnJlYWs7cj1NYXRoLm1heChyLG8tMil9fWVsc2V7aWYodCYmQWwuaGFzKHMpKWJyZWFrO249cn1yZXR1cm4hcyYmIXRoaXMuYXRFbmQ/dGhpcy5zZXROZXh0KCJwbGFpbi1zY2FsYXIiKTooeWllbGQgZWgseWllbGQqdGhpcy5wdXNoVG9JbmRleChuKzEsITApLHQ/ImZsb3ciOiJkb2MiKX0qcHVzaENvdW50KHQpe3JldHVybiB0PjA/KHlpZWxkIHRoaXMuYnVmZmVyLnN1YnN0cih0aGlzLnBvcyx0KSx0aGlzLnBvcys9dCx0KTowfSpwdXNoVG9JbmRleCh0LG4pe2NvbnN0IHI9dGhpcy5idWZmZXIuc2xpY2UodGhpcy5wb3MsdCk7cmV0dXJuIHI/KHlpZWxkIHIsdGhpcy5wb3MrPXIubGVuZ3RoLHIubGVuZ3RoKToobiYmKHlpZWxkIiIpLDApfSpwdXNoSW5kaWNhdG9ycygpe2xldCB0PTA7ZTpmb3IoOzspe3N3aXRjaCh0aGlzLmNoYXJBdCgwKSl7Y2FzZSIhIjp0Kz15aWVsZCp0aGlzLnB1c2hUYWcoKSx0Kz15aWVsZCp0aGlzLnB1c2hTcGFjZXMoITApO2NvbnRpbnVlIGU7Y2FzZSImIjp0Kz15aWVsZCp0aGlzLnB1c2hVbnRpbChuaCksdCs9eWllbGQqdGhpcy5wdXNoU3BhY2VzKCEwKTtjb250aW51ZSBlO2Nhc2UiLSI6Y2FzZSI/IjpjYXNlIjoiOntjb25zdCBuPXRoaXMuZmxvd0xldmVsPjAscj10aGlzLmNoYXJBdCgxKTtpZihSbihyKXx8biYmQWwuaGFzKHIpKXtuP3RoaXMuZmxvd0tleSYmKHRoaXMuZmxvd0tleT0hMSk6dGhpcy5pbmRlbnROZXh0PXRoaXMuaW5kZW50VmFsdWUrMSx0Kz15aWVsZCp0aGlzLnB1c2hDb3VudCgxKSx0Kz15aWVsZCp0aGlzLnB1c2hTcGFjZXMoITApO2NvbnRpbnVlIGV9fX1icmVhayBlfXJldHVybiB0fSpwdXNoVGFnKCl7aWYodGhpcy5jaGFyQXQoMSk9PT0iPCIpe2xldCB0PXRoaXMucG9zKzIsbj10aGlzLmJ1ZmZlclt0XTtmb3IoOyFSbihuKSYmbiE9PSI+Ijspbj10aGlzLmJ1ZmZlclsrK3RdO3JldHVybiB5aWVsZCp0aGlzLnB1c2hUb0luZGV4KG49PT0iPiI/dCsxOnQsITEpfWVsc2V7bGV0IHQ9dGhpcy5wb3MrMSxuPXRoaXMuYnVmZmVyW3RdO2Zvcig7bjspaWYodnguaGFzKG4pKW49dGhpcy5idWZmZXJbKyt0XTtlbHNlIGlmKG49PT0iJSImJnlELmhhcyh0aGlzLmJ1ZmZlclt0KzFdKSYmeUQuaGFzKHRoaXMuYnVmZmVyW3QrMl0pKW49dGhpcy5idWZmZXJbdCs9M107ZWxzZSBicmVhaztyZXR1cm4geWllbGQqdGhpcy5wdXNoVG9JbmRleCh0LCExKX19KnB1c2hOZXdsaW5lKCl7Y29uc3QgdD10aGlzLmJ1ZmZlclt0aGlzLnBvc107cmV0dXJuIHQ9PT1gCmA/eWllbGQqdGhpcy5wdXNoQ291bnQoMSk6dD09PSJcciImJnRoaXMuY2hhckF0KDEpPT09YApgP3lpZWxkKnRoaXMucHVzaENvdW50KDIpOjB9KnB1c2hTcGFjZXModCl7bGV0IG49dGhpcy5wb3MtMSxyO2RvIHI9dGhpcy5idWZmZXJbKytuXTt3aGlsZShyPT09IiAifHx0JiZyPT09IgkiKTtjb25zdCBzPW4tdGhpcy5wb3M7cmV0dXJuIHM+MCYmKHlpZWxkIHRoaXMuYnVmZmVyLnN1YnN0cih0aGlzLnBvcyxzKSx0aGlzLnBvcz1uKSxzfSpwdXNoVW50aWwodCl7bGV0IG49dGhpcy5wb3Mscj10aGlzLmJ1ZmZlcltuXTtmb3IoOyF0KHIpOylyPXRoaXMuYnVmZmVyWysrbl07cmV0dXJuIHlpZWxkKnRoaXMucHVzaFRvSW5kZXgobiwhMSl9fWNsYXNzIEREe2NvbnN0cnVjdG9yKCl7dGhpcy5saW5lU3RhcnRzPVtdLHRoaXMuYWRkTmV3TGluZT10PT50aGlzLmxpbmVTdGFydHMucHVzaCh0KSx0aGlzLmxpbmVQb3M9dD0+e2xldCBuPTAscj10aGlzLmxpbmVTdGFydHMubGVuZ3RoO2Zvcig7bjxyOyl7Y29uc3QgaT1uK3I+PjE7dGhpcy5saW5lU3RhcnRzW2ldPHQ/bj1pKzE6cj1pfWlmKHRoaXMubGluZVN0YXJ0c1tuXT09PXQpcmV0dXJue2xpbmU6bisxLGNvbDoxfTtpZihuPT09MClyZXR1cm57bGluZTowLGNvbDp0fTtjb25zdCBzPXRoaXMubGluZVN0YXJ0c1tuLTFdO3JldHVybntsaW5lOm4sY29sOnQtcysxfX19fWZ1bmN0aW9uIGFzKGUsdCl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDsrK24paWYoZVtuXS50eXBlPT09dClyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBiRChlKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdClzd2l0Y2goZVt0XS50eXBlKXtjYXNlInNwYWNlIjpjYXNlImNvbW1lbnQiOmNhc2UibmV3bGluZSI6YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdH1yZXR1cm4tMX1mdW5jdGlvbiBFRChlKXtzd2l0Y2goZT09bnVsbD92b2lkIDA6ZS50eXBlKXtjYXNlImFsaWFzIjpjYXNlInNjYWxhciI6Y2FzZSJzaW5nbGUtcXVvdGVkLXNjYWxhciI6Y2FzZSJkb3VibGUtcXVvdGVkLXNjYWxhciI6Y2FzZSJmbG93LWNvbGxlY3Rpb24iOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIHdsKGUpe3N3aXRjaChlLnR5cGUpe2Nhc2UiZG9jdW1lbnQiOnJldHVybiBlLnN0YXJ0O2Nhc2UiYmxvY2stbWFwIjp7Y29uc3QgdD1lLml0ZW1zW2UuaXRlbXMubGVuZ3RoLTFdO3JldHVybiB0LnNlcD8/dC5zdGFydH1jYXNlImJsb2NrLXNlcSI6cmV0dXJuIGUuaXRlbXNbZS5pdGVtcy5sZW5ndGgtMV0uc3RhcnQ7ZGVmYXVsdDpyZXR1cm5bXX19ZnVuY3Rpb24gbm8oZSl7dmFyIG47aWYoZS5sZW5ndGg9PT0wKXJldHVybltdO2xldCB0PWUubGVuZ3RoO2U6Zm9yKDstLXQ+PTA7KXN3aXRjaChlW3RdLnR5cGUpe2Nhc2UiZG9jLXN0YXJ0IjpjYXNlImV4cGxpY2l0LWtleS1pbmQiOmNhc2UibWFwLXZhbHVlLWluZCI6Y2FzZSJzZXEtaXRlbS1pbmQiOmNhc2UibmV3bGluZSI6YnJlYWsgZX1mb3IoOygobj1lWysrdF0pPT1udWxsP3ZvaWQgMDpuLnR5cGUpPT09InNwYWNlIjspO3JldHVybiBlLnNwbGljZSh0LGUubGVuZ3RoKX1mdW5jdGlvbiBDbChlLHQpe2lmKHQubGVuZ3RoPDFlNSlBcnJheS5wcm90b3R5cGUucHVzaC5hcHBseShlLHQpO2Vsc2UgZm9yKGxldCBuPTA7bjx0Lmxlbmd0aDsrK24pZS5wdXNoKHRbbl0pfWZ1bmN0aW9uIHZEKGUpe2lmKGUuc3RhcnQudHlwZT09PSJmbG93LXNlcS1zdGFydCIpZm9yKGNvbnN0IHQgb2YgZS5pdGVtcyl0LnNlcCYmIXQudmFsdWUmJiFhcyh0LnN0YXJ0LCJleHBsaWNpdC1rZXktaW5kIikmJiFhcyh0LnNlcCwibWFwLXZhbHVlLWluZCIpJiYodC5rZXkmJih0LnZhbHVlPXQua2V5KSxkZWxldGUgdC5rZXksRUQodC52YWx1ZSk/dC52YWx1ZS5lbmQ/Q2wodC52YWx1ZS5lbmQsdC5zZXApOnQudmFsdWUuZW5kPXQuc2VwOkNsKHQuc3RhcnQsdC5zZXApLGRlbGV0ZSB0LnNlcCl9Y2xhc3Mgcmh7Y29uc3RydWN0b3IodCl7dGhpcy5hdE5ld0xpbmU9ITAsdGhpcy5hdFNjYWxhcj0hMSx0aGlzLmluZGVudD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5vbktleUxpbmU9ITEsdGhpcy5zdGFjaz1bXSx0aGlzLnNvdXJjZT0iIix0aGlzLnR5cGU9IiIsdGhpcy5sZXhlcj1uZXcgQXgsdGhpcy5vbk5ld0xpbmU9dH0qcGFyc2UodCxuPSExKXt0aGlzLm9uTmV3TGluZSYmdGhpcy5vZmZzZXQ9PT0wJiZ0aGlzLm9uTmV3TGluZSgwKTtmb3IoY29uc3QgciBvZiB0aGlzLmxleGVyLmxleCh0LG4pKXlpZWxkKnRoaXMubmV4dChyKTtufHwoeWllbGQqdGhpcy5lbmQoKSl9Km5leHQodCl7aWYodGhpcy5zb3VyY2U9dCx0aGlzLmF0U2NhbGFyKXt0aGlzLmF0U2NhbGFyPSExLHlpZWxkKnRoaXMuc3RlcCgpLHRoaXMub2Zmc2V0Kz10Lmxlbmd0aDtyZXR1cm59Y29uc3Qgbj1FeCh0KTtpZihuKWlmKG49PT0ic2NhbGFyIil0aGlzLmF0TmV3TGluZT0hMSx0aGlzLmF0U2NhbGFyPSEwLHRoaXMudHlwZT0ic2NhbGFyIjtlbHNle3N3aXRjaCh0aGlzLnR5cGU9bix5aWVsZCp0aGlzLnN0ZXAoKSxuKXtjYXNlIm5ld2xpbmUiOnRoaXMuYXROZXdMaW5lPSEwLHRoaXMuaW5kZW50PTAsdGhpcy5vbk5ld0xpbmUmJnRoaXMub25OZXdMaW5lKHRoaXMub2Zmc2V0K3QubGVuZ3RoKTticmVhaztjYXNlInNwYWNlIjp0aGlzLmF0TmV3TGluZSYmdFswXT09PSIgIiYmKHRoaXMuaW5kZW50Kz10Lmxlbmd0aCk7YnJlYWs7Y2FzZSJleHBsaWNpdC1rZXktaW5kIjpjYXNlIm1hcC12YWx1ZS1pbmQiOmNhc2Uic2VxLWl0ZW0taW5kIjp0aGlzLmF0TmV3TGluZSYmKHRoaXMuaW5kZW50Kz10Lmxlbmd0aCk7YnJlYWs7Y2FzZSJkb2MtbW9kZSI6Y2FzZSJmbG93LWVycm9yLWVuZCI6cmV0dXJuO2RlZmF1bHQ6dGhpcy5hdE5ld0xpbmU9ITF9dGhpcy5vZmZzZXQrPXQubGVuZ3RofWVsc2V7Y29uc3Qgcj1gTm90IGEgWUFNTCB0b2tlbjogJHt0fWA7eWllbGQqdGhpcy5wb3Aoe3R5cGU6ImVycm9yIixvZmZzZXQ6dGhpcy5vZmZzZXQsbWVzc2FnZTpyLHNvdXJjZTp0fSksdGhpcy5vZmZzZXQrPXQubGVuZ3RofX0qZW5kKCl7Zm9yKDt0aGlzLnN0YWNrLmxlbmd0aD4wOyl5aWVsZCp0aGlzLnBvcCgpfWdldCBzb3VyY2VUb2tlbigpe3JldHVybnt0eXBlOnRoaXMudHlwZSxvZmZzZXQ6dGhpcy5vZmZzZXQsaW5kZW50OnRoaXMuaW5kZW50LHNvdXJjZTp0aGlzLnNvdXJjZX19KnN0ZXAoKXtjb25zdCB0PXRoaXMucGVlaygxKTtpZih0aGlzLnR5cGU9PT0iZG9jLWVuZCImJih0PT1udWxsP3ZvaWQgMDp0LnR5cGUpIT09ImRvYy1lbmQiKXtmb3IoO3RoaXMuc3RhY2subGVuZ3RoPjA7KXlpZWxkKnRoaXMucG9wKCk7dGhpcy5zdGFjay5wdXNoKHt0eXBlOiJkb2MtZW5kIixvZmZzZXQ6dGhpcy5vZmZzZXQsc291cmNlOnRoaXMuc291cmNlfSk7cmV0dXJufWlmKCF0KXJldHVybiB5aWVsZCp0aGlzLnN0cmVhbSgpO3N3aXRjaCh0LnR5cGUpe2Nhc2UiZG9jdW1lbnQiOnJldHVybiB5aWVsZCp0aGlzLmRvY3VtZW50KHQpO2Nhc2UiYWxpYXMiOmNhc2Uic2NhbGFyIjpjYXNlInNpbmdsZS1xdW90ZWQtc2NhbGFyIjpjYXNlImRvdWJsZS1xdW90ZWQtc2NhbGFyIjpyZXR1cm4geWllbGQqdGhpcy5zY2FsYXIodCk7Y2FzZSJibG9jay1zY2FsYXIiOnJldHVybiB5aWVsZCp0aGlzLmJsb2NrU2NhbGFyKHQpO2Nhc2UiYmxvY2stbWFwIjpyZXR1cm4geWllbGQqdGhpcy5ibG9ja01hcCh0KTtjYXNlImJsb2NrLXNlcSI6cmV0dXJuIHlpZWxkKnRoaXMuYmxvY2tTZXF1ZW5jZSh0KTtjYXNlImZsb3ctY29sbGVjdGlvbiI6cmV0dXJuIHlpZWxkKnRoaXMuZmxvd0NvbGxlY3Rpb24odCk7Y2FzZSJkb2MtZW5kIjpyZXR1cm4geWllbGQqdGhpcy5kb2N1bWVudEVuZCh0KX15aWVsZCp0aGlzLnBvcCgpfXBlZWsodCl7cmV0dXJuIHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtdF19KnBvcCh0KXtjb25zdCBuPXQ/P3RoaXMuc3RhY2sucG9wKCk7aWYoIW4peWllbGR7dHlwZToiZXJyb3IiLG9mZnNldDp0aGlzLm9mZnNldCxzb3VyY2U6IiIsbWVzc2FnZToiVHJpZWQgdG8gcG9wIGFuIGVtcHR5IHN0YWNrIn07ZWxzZSBpZih0aGlzLnN0YWNrLmxlbmd0aD09PTApeWllbGQgbjtlbHNle2NvbnN0IHI9dGhpcy5wZWVrKDEpO3N3aXRjaChuLnR5cGU9PT0iYmxvY2stc2NhbGFyIj9uLmluZGVudD0iaW5kZW50ImluIHI/ci5pbmRlbnQ6MDpuLnR5cGU9PT0iZmxvdy1jb2xsZWN0aW9uIiYmci50eXBlPT09ImRvY3VtZW50IiYmKG4uaW5kZW50PTApLG4udHlwZT09PSJmbG93LWNvbGxlY3Rpb24iJiZ2RChuKSxyLnR5cGUpe2Nhc2UiZG9jdW1lbnQiOnIudmFsdWU9bjticmVhaztjYXNlImJsb2NrLXNjYWxhciI6ci5wcm9wcy5wdXNoKG4pO2JyZWFrO2Nhc2UiYmxvY2stbWFwIjp7Y29uc3Qgcz1yLml0ZW1zW3IuaXRlbXMubGVuZ3RoLTFdO2lmKHMudmFsdWUpe3IuaXRlbXMucHVzaCh7c3RhcnQ6W10sa2V5Om4sc2VwOltdfSksdGhpcy5vbktleUxpbmU9ITA7cmV0dXJufWVsc2UgaWYocy5zZXApcy52YWx1ZT1uO2Vsc2V7T2JqZWN0LmFzc2lnbihzLHtrZXk6bixzZXA6W119KSx0aGlzLm9uS2V5TGluZT0hcy5leHBsaWNpdEtleTtyZXR1cm59YnJlYWt9Y2FzZSJibG9jay1zZXEiOntjb25zdCBzPXIuaXRlbXNbci5pdGVtcy5sZW5ndGgtMV07cy52YWx1ZT9yLml0ZW1zLnB1c2goe3N0YXJ0OltdLHZhbHVlOm59KTpzLnZhbHVlPW47YnJlYWt9Y2FzZSJmbG93LWNvbGxlY3Rpb24iOntjb25zdCBzPXIuaXRlbXNbci5pdGVtcy5sZW5ndGgtMV07IXN8fHMudmFsdWU/ci5pdGVtcy5wdXNoKHtzdGFydDpbXSxrZXk6bixzZXA6W119KTpzLnNlcD9zLnZhbHVlPW46T2JqZWN0LmFzc2lnbihzLHtrZXk6bixzZXA6W119KTtyZXR1cm59ZGVmYXVsdDp5aWVsZCp0aGlzLnBvcCgpLHlpZWxkKnRoaXMucG9wKG4pfWlmKChyLnR5cGU9PT0iZG9jdW1lbnQifHxyLnR5cGU9PT0iYmxvY2stbWFwInx8ci50eXBlPT09ImJsb2NrLXNlcSIpJiYobi50eXBlPT09ImJsb2NrLW1hcCJ8fG4udHlwZT09PSJibG9jay1zZXEiKSl7Y29uc3Qgcz1uLml0ZW1zW24uaXRlbXMubGVuZ3RoLTFdO3MmJiFzLnNlcCYmIXMudmFsdWUmJnMuc3RhcnQubGVuZ3RoPjAmJmJEKHMuc3RhcnQpPT09LTEmJihuLmluZGVudD09PTB8fHMuc3RhcnQuZXZlcnkoaT0+aS50eXBlIT09ImNvbW1lbnQifHxpLmluZGVudDxuLmluZGVudCkpJiYoci50eXBlPT09ImRvY3VtZW50Ij9yLmVuZD1zLnN0YXJ0OnIuaXRlbXMucHVzaCh7c3RhcnQ6cy5zdGFydH0pLG4uaXRlbXMuc3BsaWNlKC0xLDEpKX19fSpzdHJlYW0oKXtzd2l0Y2godGhpcy50eXBlKXtjYXNlImRpcmVjdGl2ZS1saW5lIjp5aWVsZHt0eXBlOiJkaXJlY3RpdmUiLG9mZnNldDp0aGlzLm9mZnNldCxzb3VyY2U6dGhpcy5zb3VyY2V9O3JldHVybjtjYXNlImJ5dGUtb3JkZXItbWFyayI6Y2FzZSJzcGFjZSI6Y2FzZSJjb21tZW50IjpjYXNlIm5ld2xpbmUiOnlpZWxkIHRoaXMuc291cmNlVG9rZW47cmV0dXJuO2Nhc2UiZG9jLW1vZGUiOmNhc2UiZG9jLXN0YXJ0Ijp7Y29uc3QgdD17dHlwZToiZG9jdW1lbnQiLG9mZnNldDp0aGlzLm9mZnNldCxzdGFydDpbXX07dGhpcy50eXBlPT09ImRvYy1zdGFydCImJnQuc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKSx0aGlzLnN0YWNrLnB1c2godCk7cmV0dXJufX15aWVsZHt0eXBlOiJlcnJvciIsb2Zmc2V0OnRoaXMub2Zmc2V0LG1lc3NhZ2U6YFVuZXhwZWN0ZWQgJHt0aGlzLnR5cGV9IHRva2VuIGluIFlBTUwgc3RyZWFtYCxzb3VyY2U6dGhpcy5zb3VyY2V9fSpkb2N1bWVudCh0KXtpZih0LnZhbHVlKXJldHVybiB5aWVsZCp0aGlzLmxpbmVFbmQodCk7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJkb2Mtc3RhcnQiOntiRCh0LnN0YXJ0KSE9PS0xPyh5aWVsZCp0aGlzLnBvcCgpLHlpZWxkKnRoaXMuc3RlcCgpKTp0LnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7cmV0dXJufWNhc2UiYW5jaG9yIjpjYXNlInRhZyI6Y2FzZSJzcGFjZSI6Y2FzZSJjb21tZW50IjpjYXNlIm5ld2xpbmUiOnQuc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtyZXR1cm59Y29uc3Qgbj10aGlzLnN0YXJ0QmxvY2tWYWx1ZSh0KTtuP3RoaXMuc3RhY2sucHVzaChuKTp5aWVsZHt0eXBlOiJlcnJvciIsb2Zmc2V0OnRoaXMub2Zmc2V0LG1lc3NhZ2U6YFVuZXhwZWN0ZWQgJHt0aGlzLnR5cGV9IHRva2VuIGluIFlBTUwgZG9jdW1lbnRgLHNvdXJjZTp0aGlzLnNvdXJjZX19KnNjYWxhcih0KXtpZih0aGlzLnR5cGU9PT0ibWFwLXZhbHVlLWluZCIpe2NvbnN0IG49d2wodGhpcy5wZWVrKDIpKSxyPW5vKG4pO2xldCBzO3QuZW5kPyhzPXQuZW5kLHMucHVzaCh0aGlzLnNvdXJjZVRva2VuKSxkZWxldGUgdC5lbmQpOnM9W3RoaXMuc291cmNlVG9rZW5dO2NvbnN0IGk9e3R5cGU6ImJsb2NrLW1hcCIsb2Zmc2V0OnQub2Zmc2V0LGluZGVudDp0LmluZGVudCxpdGVtczpbe3N0YXJ0OnIsa2V5OnQsc2VwOnN9XX07dGhpcy5vbktleUxpbmU9ITAsdGhpcy5zdGFja1t0aGlzLnN0YWNrLmxlbmd0aC0xXT1pfWVsc2UgeWllbGQqdGhpcy5saW5lRW5kKHQpfSpibG9ja1NjYWxhcih0KXtzd2l0Y2godGhpcy50eXBlKXtjYXNlInNwYWNlIjpjYXNlImNvbW1lbnQiOmNhc2UibmV3bGluZSI6dC5wcm9wcy5wdXNoKHRoaXMuc291cmNlVG9rZW4pO3JldHVybjtjYXNlInNjYWxhciI6aWYodC5zb3VyY2U9dGhpcy5zb3VyY2UsdGhpcy5hdE5ld0xpbmU9ITAsdGhpcy5pbmRlbnQ9MCx0aGlzLm9uTmV3TGluZSl7bGV0IG49dGhpcy5zb3VyY2UuaW5kZXhPZihgCmApKzE7Zm9yKDtuIT09MDspdGhpcy5vbk5ld0xpbmUodGhpcy5vZmZzZXQrbiksbj10aGlzLnNvdXJjZS5pbmRleE9mKGAKYCxuKSsxfXlpZWxkKnRoaXMucG9wKCk7YnJlYWs7ZGVmYXVsdDp5aWVsZCp0aGlzLnBvcCgpLHlpZWxkKnRoaXMuc3RlcCgpfX0qYmxvY2tNYXAodCl7dmFyIHI7Y29uc3Qgbj10Lml0ZW1zW3QuaXRlbXMubGVuZ3RoLTFdO3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UibmV3bGluZSI6aWYodGhpcy5vbktleUxpbmU9ITEsbi52YWx1ZSl7Y29uc3Qgcz0iZW5kImluIG4udmFsdWU/bi52YWx1ZS5lbmQ6dm9pZCAwLGk9QXJyYXkuaXNBcnJheShzKT9zW3MubGVuZ3RoLTFdOnZvaWQgMDsoaT09bnVsbD92b2lkIDA6aS50eXBlKT09PSJjb21tZW50Ij9zPT1udWxsfHxzLnB1c2godGhpcy5zb3VyY2VUb2tlbik6dC5pdGVtcy5wdXNoKHtzdGFydDpbdGhpcy5zb3VyY2VUb2tlbl19KX1lbHNlIG4uc2VwP24uc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik6bi5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO3JldHVybjtjYXNlInNwYWNlIjpjYXNlImNvbW1lbnQiOmlmKG4udmFsdWUpdC5pdGVtcy5wdXNoKHtzdGFydDpbdGhpcy5zb3VyY2VUb2tlbl19KTtlbHNlIGlmKG4uc2VwKW4uc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7ZWxzZXtpZih0aGlzLmF0SW5kZW50ZWRDb21tZW50KG4uc3RhcnQsdC5pbmRlbnQpKXtjb25zdCBzPXQuaXRlbXNbdC5pdGVtcy5sZW5ndGgtMl0saT0ocj1zPT1udWxsP3ZvaWQgMDpzLnZhbHVlKT09bnVsbD92b2lkIDA6ci5lbmQ7aWYoQXJyYXkuaXNBcnJheShpKSl7Q2woaSxuLnN0YXJ0KSxpLnB1c2godGhpcy5zb3VyY2VUb2tlbiksdC5pdGVtcy5wb3AoKTtyZXR1cm59fW4uc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKX1yZXR1cm59aWYodGhpcy5pbmRlbnQ+PXQuaW5kZW50KXtjb25zdCBzPSF0aGlzLm9uS2V5TGluZSYmdGhpcy5pbmRlbnQ9PT10LmluZGVudCxpPXMmJihuLnNlcHx8bi5leHBsaWNpdEtleSkmJnRoaXMudHlwZSE9PSJzZXEtaXRlbS1pbmQiO2xldCBvPVtdO2lmKGkmJm4uc2VwJiYhbi52YWx1ZSl7Y29uc3QgYT1bXTtmb3IobGV0IHU9MDt1PG4uc2VwLmxlbmd0aDsrK3Upe2NvbnN0IGw9bi5zZXBbdV07c3dpdGNoKGwudHlwZSl7Y2FzZSJuZXdsaW5lIjphLnB1c2godSk7YnJlYWs7Y2FzZSJzcGFjZSI6YnJlYWs7Y2FzZSJjb21tZW50IjpsLmluZGVudD50LmluZGVudCYmKGEubGVuZ3RoPTApO2JyZWFrO2RlZmF1bHQ6YS5sZW5ndGg9MH19YS5sZW5ndGg+PTImJihvPW4uc2VwLnNwbGljZShhWzFdKSl9c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJhbmNob3IiOmNhc2UidGFnIjppfHxuLnZhbHVlPyhvLnB1c2godGhpcy5zb3VyY2VUb2tlbiksdC5pdGVtcy5wdXNoKHtzdGFydDpvfSksdGhpcy5vbktleUxpbmU9ITApOm4uc2VwP24uc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik6bi5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO3JldHVybjtjYXNlImV4cGxpY2l0LWtleS1pbmQiOiFuLnNlcCYmIW4uZXhwbGljaXRLZXk/KG4uc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKSxuLmV4cGxpY2l0S2V5PSEwKTppfHxuLnZhbHVlPyhvLnB1c2godGhpcy5zb3VyY2VUb2tlbiksdC5pdGVtcy5wdXNoKHtzdGFydDpvLGV4cGxpY2l0S2V5OiEwfSkpOnRoaXMuc3RhY2sucHVzaCh7dHlwZToiYmxvY2stbWFwIixvZmZzZXQ6dGhpcy5vZmZzZXQsaW5kZW50OnRoaXMuaW5kZW50LGl0ZW1zOlt7c3RhcnQ6W3RoaXMuc291cmNlVG9rZW5dLGV4cGxpY2l0S2V5OiEwfV19KSx0aGlzLm9uS2V5TGluZT0hMDtyZXR1cm47Y2FzZSJtYXAtdmFsdWUtaW5kIjppZihuLmV4cGxpY2l0S2V5KWlmKG4uc2VwKWlmKG4udmFsdWUpdC5pdGVtcy5wdXNoKHtzdGFydDpbXSxrZXk6bnVsbCxzZXA6W3RoaXMuc291cmNlVG9rZW5dfSk7ZWxzZSBpZihhcyhuLnNlcCwibWFwLXZhbHVlLWluZCIpKXRoaXMuc3RhY2sucHVzaCh7dHlwZToiYmxvY2stbWFwIixvZmZzZXQ6dGhpcy5vZmZzZXQsaW5kZW50OnRoaXMuaW5kZW50LGl0ZW1zOlt7c3RhcnQ6byxrZXk6bnVsbCxzZXA6W3RoaXMuc291cmNlVG9rZW5dfV19KTtlbHNlIGlmKEVEKG4ua2V5KSYmIWFzKG4uc2VwLCJuZXdsaW5lIikpe2NvbnN0IGE9bm8obi5zdGFydCksdT1uLmtleSxsPW4uc2VwO2wucHVzaCh0aGlzLnNvdXJjZVRva2VuKSxkZWxldGUgbi5rZXksZGVsZXRlIG4uc2VwLHRoaXMuc3RhY2sucHVzaCh7dHlwZToiYmxvY2stbWFwIixvZmZzZXQ6dGhpcy5vZmZzZXQsaW5kZW50OnRoaXMuaW5kZW50LGl0ZW1zOlt7c3RhcnQ6YSxrZXk6dSxzZXA6bH1dfSl9ZWxzZSBvLmxlbmd0aD4wP24uc2VwPW4uc2VwLmNvbmNhdChvLHRoaXMuc291cmNlVG9rZW4pOm4uc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik7ZWxzZSBpZihhcyhuLnN0YXJ0LCJuZXdsaW5lIikpT2JqZWN0LmFzc2lnbihuLHtrZXk6bnVsbCxzZXA6W3RoaXMuc291cmNlVG9rZW5dfSk7ZWxzZXtjb25zdCBhPW5vKG4uc3RhcnQpO3RoaXMuc3RhY2sucHVzaCh7dHlwZToiYmxvY2stbWFwIixvZmZzZXQ6dGhpcy5vZmZzZXQsaW5kZW50OnRoaXMuaW5kZW50LGl0ZW1zOlt7c3RhcnQ6YSxrZXk6bnVsbCxzZXA6W3RoaXMuc291cmNlVG9rZW5dfV19KX1lbHNlIG4uc2VwP24udmFsdWV8fGk/dC5pdGVtcy5wdXNoKHtzdGFydDpvLGtleTpudWxsLHNlcDpbdGhpcy5zb3VyY2VUb2tlbl19KTphcyhuLnNlcCwibWFwLXZhbHVlLWluZCIpP3RoaXMuc3RhY2sucHVzaCh7dHlwZToiYmxvY2stbWFwIixvZmZzZXQ6dGhpcy5vZmZzZXQsaW5kZW50OnRoaXMuaW5kZW50LGl0ZW1zOlt7c3RhcnQ6W10sa2V5Om51bGwsc2VwOlt0aGlzLnNvdXJjZVRva2VuXX1dfSk6bi5zZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTpPYmplY3QuYXNzaWduKG4se2tleTpudWxsLHNlcDpbdGhpcy5zb3VyY2VUb2tlbl19KTt0aGlzLm9uS2V5TGluZT0hMDtyZXR1cm47Y2FzZSJhbGlhcyI6Y2FzZSJzY2FsYXIiOmNhc2Uic2luZ2xlLXF1b3RlZC1zY2FsYXIiOmNhc2UiZG91YmxlLXF1b3RlZC1zY2FsYXIiOntjb25zdCBhPXRoaXMuZmxvd1NjYWxhcih0aGlzLnR5cGUpO2l8fG4udmFsdWU/KHQuaXRlbXMucHVzaCh7c3RhcnQ6byxrZXk6YSxzZXA6W119KSx0aGlzLm9uS2V5TGluZT0hMCk6bi5zZXA/dGhpcy5zdGFjay5wdXNoKGEpOihPYmplY3QuYXNzaWduKG4se2tleTphLHNlcDpbXX0pLHRoaXMub25LZXlMaW5lPSEwKTtyZXR1cm59ZGVmYXVsdDp7Y29uc3QgYT10aGlzLnN0YXJ0QmxvY2tWYWx1ZSh0KTtpZihhKXtpZihhLnR5cGU9PT0iYmxvY2stc2VxIil7aWYoIW4uZXhwbGljaXRLZXkmJm4uc2VwJiYhYXMobi5zZXAsIm5ld2xpbmUiKSl7eWllbGQqdGhpcy5wb3Aoe3R5cGU6ImVycm9yIixvZmZzZXQ6dGhpcy5vZmZzZXQsbWVzc2FnZToiVW5leHBlY3RlZCBibG9jay1zZXEtaW5kIG9uIHNhbWUgbGluZSB3aXRoIGtleSIsc291cmNlOnRoaXMuc291cmNlfSk7cmV0dXJufX1lbHNlIHMmJnQuaXRlbXMucHVzaCh7c3RhcnQ6b30pO3RoaXMuc3RhY2sucHVzaChhKTtyZXR1cm59fX19eWllbGQqdGhpcy5wb3AoKSx5aWVsZCp0aGlzLnN0ZXAoKX0qYmxvY2tTZXF1ZW5jZSh0KXt2YXIgcjtjb25zdCBuPXQuaXRlbXNbdC5pdGVtcy5sZW5ndGgtMV07c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJuZXdsaW5lIjppZihuLnZhbHVlKXtjb25zdCBzPSJlbmQiaW4gbi52YWx1ZT9uLnZhbHVlLmVuZDp2b2lkIDAsaT1BcnJheS5pc0FycmF5KHMpP3Nbcy5sZW5ndGgtMV06dm9pZCAwOyhpPT1udWxsP3ZvaWQgMDppLnR5cGUpPT09ImNvbW1lbnQiP3M9PW51bGx8fHMucHVzaCh0aGlzLnNvdXJjZVRva2VuKTp0Lml0ZW1zLnB1c2goe3N0YXJ0Olt0aGlzLnNvdXJjZVRva2VuXX0pfWVsc2Ugbi5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO3JldHVybjtjYXNlInNwYWNlIjpjYXNlImNvbW1lbnQiOmlmKG4udmFsdWUpdC5pdGVtcy5wdXNoKHtzdGFydDpbdGhpcy5zb3VyY2VUb2tlbl19KTtlbHNle2lmKHRoaXMuYXRJbmRlbnRlZENvbW1lbnQobi5zdGFydCx0LmluZGVudCkpe2NvbnN0IHM9dC5pdGVtc1t0Lml0ZW1zLmxlbmd0aC0yXSxpPShyPXM9PW51bGw/dm9pZCAwOnMudmFsdWUpPT1udWxsP3ZvaWQgMDpyLmVuZDtpZihBcnJheS5pc0FycmF5KGkpKXtDbChpLG4uc3RhcnQpLGkucHVzaCh0aGlzLnNvdXJjZVRva2VuKSx0Lml0ZW1zLnBvcCgpO3JldHVybn19bi5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pfXJldHVybjtjYXNlImFuY2hvciI6Y2FzZSJ0YWciOmlmKG4udmFsdWV8fHRoaXMuaW5kZW50PD10LmluZGVudClicmVhaztuLnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7cmV0dXJuO2Nhc2Uic2VxLWl0ZW0taW5kIjppZih0aGlzLmluZGVudCE9PXQuaW5kZW50KWJyZWFrO24udmFsdWV8fGFzKG4uc3RhcnQsInNlcS1pdGVtLWluZCIpP3QuaXRlbXMucHVzaCh7c3RhcnQ6W3RoaXMuc291cmNlVG9rZW5dfSk6bi5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO3JldHVybn1pZih0aGlzLmluZGVudD50LmluZGVudCl7Y29uc3Qgcz10aGlzLnN0YXJ0QmxvY2tWYWx1ZSh0KTtpZihzKXt0aGlzLnN0YWNrLnB1c2gocyk7cmV0dXJufX15aWVsZCp0aGlzLnBvcCgpLHlpZWxkKnRoaXMuc3RlcCgpfSpmbG93Q29sbGVjdGlvbih0KXtjb25zdCBuPXQuaXRlbXNbdC5pdGVtcy5sZW5ndGgtMV07aWYodGhpcy50eXBlPT09ImZsb3ctZXJyb3ItZW5kIil7bGV0IHI7ZG8geWllbGQqdGhpcy5wb3AoKSxyPXRoaXMucGVlaygxKTt3aGlsZSgocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJmbG93LWNvbGxlY3Rpb24iKX1lbHNlIGlmKHQuZW5kLmxlbmd0aD09PTApe3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UiY29tbWEiOmNhc2UiZXhwbGljaXQta2V5LWluZCI6IW58fG4uc2VwP3QuaXRlbXMucHVzaCh7c3RhcnQ6W3RoaXMuc291cmNlVG9rZW5dfSk6bi5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO3JldHVybjtjYXNlIm1hcC12YWx1ZS1pbmQiOiFufHxuLnZhbHVlP3QuaXRlbXMucHVzaCh7c3RhcnQ6W10sa2V5Om51bGwsc2VwOlt0aGlzLnNvdXJjZVRva2VuXX0pOm4uc2VwP24uc2VwLnB1c2godGhpcy5zb3VyY2VUb2tlbik6T2JqZWN0LmFzc2lnbihuLHtrZXk6bnVsbCxzZXA6W3RoaXMuc291cmNlVG9rZW5dfSk7cmV0dXJuO2Nhc2Uic3BhY2UiOmNhc2UiY29tbWVudCI6Y2FzZSJuZXdsaW5lIjpjYXNlImFuY2hvciI6Y2FzZSJ0YWciOiFufHxuLnZhbHVlP3QuaXRlbXMucHVzaCh7c3RhcnQ6W3RoaXMuc291cmNlVG9rZW5dfSk6bi5zZXA/bi5zZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTpuLnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7cmV0dXJuO2Nhc2UiYWxpYXMiOmNhc2Uic2NhbGFyIjpjYXNlInNpbmdsZS1xdW90ZWQtc2NhbGFyIjpjYXNlImRvdWJsZS1xdW90ZWQtc2NhbGFyIjp7Y29uc3Qgcz10aGlzLmZsb3dTY2FsYXIodGhpcy50eXBlKTshbnx8bi52YWx1ZT90Lml0ZW1zLnB1c2goe3N0YXJ0OltdLGtleTpzLHNlcDpbXX0pOm4uc2VwP3RoaXMuc3RhY2sucHVzaChzKTpPYmplY3QuYXNzaWduKG4se2tleTpzLHNlcDpbXX0pO3JldHVybn1jYXNlImZsb3ctbWFwLWVuZCI6Y2FzZSJmbG93LXNlcS1lbmQiOnQuZW5kLnB1c2godGhpcy5zb3VyY2VUb2tlbik7cmV0dXJufWNvbnN0IHI9dGhpcy5zdGFydEJsb2NrVmFsdWUodCk7cj90aGlzLnN0YWNrLnB1c2gocik6KHlpZWxkKnRoaXMucG9wKCkseWllbGQqdGhpcy5zdGVwKCkpfWVsc2V7Y29uc3Qgcj10aGlzLnBlZWsoMik7aWYoci50eXBlPT09ImJsb2NrLW1hcCImJih0aGlzLnR5cGU9PT0ibWFwLXZhbHVlLWluZCImJnIuaW5kZW50PT09dC5pbmRlbnR8fHRoaXMudHlwZT09PSJuZXdsaW5lIiYmIXIuaXRlbXNbci5pdGVtcy5sZW5ndGgtMV0uc2VwKSl5aWVsZCp0aGlzLnBvcCgpLHlpZWxkKnRoaXMuc3RlcCgpO2Vsc2UgaWYodGhpcy50eXBlPT09Im1hcC12YWx1ZS1pbmQiJiZyLnR5cGUhPT0iZmxvdy1jb2xsZWN0aW9uIil7Y29uc3Qgcz13bChyKSxpPW5vKHMpO3ZEKHQpO2NvbnN0IG89dC5lbmQuc3BsaWNlKDEsdC5lbmQubGVuZ3RoKTtvLnB1c2godGhpcy5zb3VyY2VUb2tlbik7Y29uc3QgYT17dHlwZToiYmxvY2stbWFwIixvZmZzZXQ6dC5vZmZzZXQsaW5kZW50OnQuaW5kZW50LGl0ZW1zOlt7c3RhcnQ6aSxrZXk6dCxzZXA6b31dfTt0aGlzLm9uS2V5TGluZT0hMCx0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLTFdPWF9ZWxzZSB5aWVsZCp0aGlzLmxpbmVFbmQodCl9fWZsb3dTY2FsYXIodCl7aWYodGhpcy5vbk5ld0xpbmUpe2xldCBuPXRoaXMuc291cmNlLmluZGV4T2YoYApgKSsxO2Zvcig7biE9PTA7KXRoaXMub25OZXdMaW5lKHRoaXMub2Zmc2V0K24pLG49dGhpcy5zb3VyY2UuaW5kZXhPZihgCmAsbikrMX1yZXR1cm57dHlwZTp0LG9mZnNldDp0aGlzLm9mZnNldCxpbmRlbnQ6dGhpcy5pbmRlbnQsc291cmNlOnRoaXMuc291cmNlfX1zdGFydEJsb2NrVmFsdWUodCl7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJhbGlhcyI6Y2FzZSJzY2FsYXIiOmNhc2Uic2luZ2xlLXF1b3RlZC1zY2FsYXIiOmNhc2UiZG91YmxlLXF1b3RlZC1zY2FsYXIiOnJldHVybiB0aGlzLmZsb3dTY2FsYXIodGhpcy50eXBlKTtjYXNlImJsb2NrLXNjYWxhci1oZWFkZXIiOnJldHVybnt0eXBlOiJibG9jay1zY2FsYXIiLG9mZnNldDp0aGlzLm9mZnNldCxpbmRlbnQ6dGhpcy5pbmRlbnQscHJvcHM6W3RoaXMuc291cmNlVG9rZW5dLHNvdXJjZToiIn07Y2FzZSJmbG93LW1hcC1zdGFydCI6Y2FzZSJmbG93LXNlcS1zdGFydCI6cmV0dXJue3R5cGU6ImZsb3ctY29sbGVjdGlvbiIsb2Zmc2V0OnRoaXMub2Zmc2V0LGluZGVudDp0aGlzLmluZGVudCxzdGFydDp0aGlzLnNvdXJjZVRva2VuLGl0ZW1zOltdLGVuZDpbXX07Y2FzZSJzZXEtaXRlbS1pbmQiOnJldHVybnt0eXBlOiJibG9jay1zZXEiLG9mZnNldDp0aGlzLm9mZnNldCxpbmRlbnQ6dGhpcy5pbmRlbnQsaXRlbXM6W3tzdGFydDpbdGhpcy5zb3VyY2VUb2tlbl19XX07Y2FzZSJleHBsaWNpdC1rZXktaW5kIjp7dGhpcy5vbktleUxpbmU9ITA7Y29uc3Qgbj13bCh0KSxyPW5vKG4pO3JldHVybiByLnB1c2godGhpcy5zb3VyY2VUb2tlbikse3R5cGU6ImJsb2NrLW1hcCIsb2Zmc2V0OnRoaXMub2Zmc2V0LGluZGVudDp0aGlzLmluZGVudCxpdGVtczpbe3N0YXJ0OnIsZXhwbGljaXRLZXk6ITB9XX19Y2FzZSJtYXAtdmFsdWUtaW5kIjp7dGhpcy5vbktleUxpbmU9ITA7Y29uc3Qgbj13bCh0KSxyPW5vKG4pO3JldHVybnt0eXBlOiJibG9jay1tYXAiLG9mZnNldDp0aGlzLm9mZnNldCxpbmRlbnQ6dGhpcy5pbmRlbnQsaXRlbXM6W3tzdGFydDpyLGtleTpudWxsLHNlcDpbdGhpcy5zb3VyY2VUb2tlbl19XX19fXJldHVybiBudWxsfWF0SW5kZW50ZWRDb21tZW50KHQsbil7cmV0dXJuIHRoaXMudHlwZSE9PSJjb21tZW50Inx8dGhpcy5pbmRlbnQ8PW4/ITE6dC5ldmVyeShyPT5yLnR5cGU9PT0ibmV3bGluZSJ8fHIudHlwZT09PSJzcGFjZSIpfSpkb2N1bWVudEVuZCh0KXt0aGlzLnR5cGUhPT0iZG9jLW1vZGUiJiYodC5lbmQ/dC5lbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTp0LmVuZD1bdGhpcy5zb3VyY2VUb2tlbl0sdGhpcy50eXBlPT09Im5ld2xpbmUiJiYoeWllbGQqdGhpcy5wb3AoKSkpfSpsaW5lRW5kKHQpe3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UiY29tbWEiOmNhc2UiZG9jLXN0YXJ0IjpjYXNlImRvYy1lbmQiOmNhc2UiZmxvdy1zZXEtZW5kIjpjYXNlImZsb3ctbWFwLWVuZCI6Y2FzZSJtYXAtdmFsdWUtaW5kIjp5aWVsZCp0aGlzLnBvcCgpLHlpZWxkKnRoaXMuc3RlcCgpO2JyZWFrO2Nhc2UibmV3bGluZSI6dGhpcy5vbktleUxpbmU9ITE7Y2FzZSJzcGFjZSI6Y2FzZSJjb21tZW50IjpkZWZhdWx0OnQuZW5kP3QuZW5kLnB1c2godGhpcy5zb3VyY2VUb2tlbik6dC5lbmQ9W3RoaXMuc291cmNlVG9rZW5dLHRoaXMudHlwZT09PSJuZXdsaW5lIiYmKHlpZWxkKnRoaXMucG9wKCkpfX19ZnVuY3Rpb24gd3goZSl7Y29uc3QgdD1lLnByZXR0eUVycm9ycyE9PSExO3JldHVybntsaW5lQ291bnRlcjplLmxpbmVDb3VudGVyfHx0JiZuZXcgRER8fG51bGwscHJldHR5RXJyb3JzOnR9fWZ1bmN0aW9uIEN4KGUsdD17fSl7Y29uc3R7bGluZUNvdW50ZXI6bixwcmV0dHlFcnJvcnM6cn09d3godCkscz1uZXcgcmgobj09bnVsbD92b2lkIDA6bi5hZGROZXdMaW5lKSxpPW5ldyBjRCh0KTtsZXQgbz1udWxsO2Zvcihjb25zdCBhIG9mIGkuY29tcG9zZShzLnBhcnNlKGUpLCEwLGUubGVuZ3RoKSlpZighbylvPWE7ZWxzZSBpZihvLm9wdGlvbnMubG9nTGV2ZWwhPT0ic2lsZW50Iil7by5lcnJvcnMucHVzaChuZXcgYmEoYS5yYW5nZS5zbGljZSgwLDIpLCJNVUxUSVBMRV9ET0NTIiwiU291cmNlIGNvbnRhaW5zIG11bHRpcGxlIGRvY3VtZW50czsgcGxlYXNlIHVzZSBZQU1MLnBhcnNlQWxsRG9jdW1lbnRzKCkiKSk7YnJlYWt9cmV0dXJuIHImJm4mJihvLmVycm9ycy5mb3JFYWNoKHJEKGUsbikpLG8ud2FybmluZ3MuZm9yRWFjaChyRChlLG4pKSksb31mdW5jdGlvbiBTeChlLHQsbil7bGV0IHI7Y29uc3Qgcz1DeChlLG4pO2lmKCFzKXJldHVybiBudWxsO2lmKHMud2FybmluZ3MuZm9yRWFjaChpPT4keShzLm9wdGlvbnMubG9nTGV2ZWwsaSkpLHMuZXJyb3JzLmxlbmd0aD4wKXtpZihzLm9wdGlvbnMubG9nTGV2ZWwhPT0ic2lsZW50Iil0aHJvdyBzLmVycm9yc1swXTtzLmVycm9ycz1bXX1yZXR1cm4gcy50b0pTKE9iamVjdC5hc3NpZ24oe3Jldml2ZXI6cn0sbikpfWZ1bmN0aW9uIEZEKGUsdCxuKXtsZXQgcj1udWxsO2lmKEFycmF5LmlzQXJyYXkodCk/cj10Om49PT12b2lkIDAmJnQmJihuPXQpLHR5cGVvZiBuPT0ic3RyaW5nIiYmKG49bi5sZW5ndGgpLHR5cGVvZiBuPT0ibnVtYmVyIil7Y29uc3Qgcz1NYXRoLnJvdW5kKG4pO249czwxP3ZvaWQgMDpzPjg/e2luZGVudDo4fTp7aW5kZW50OnN9fWlmKGU9PT12b2lkIDApe2NvbnN0e2tlZXBVbmRlZmluZWQ6c309bj8/dD8/e307aWYoIXMpcmV0dXJufXJldHVybiBIaShlKSYmIXI/ZS50b1N0cmluZyhuKTpuZXcgRGEoZSxyLG4pLnRvU3RyaW5nKG4pfXZhciB4eD1PYmplY3QuZGVmaW5lUHJvcGVydHksU2w9KGUsdCk9Pntmb3IodmFyIG4gaW4gdCl4eChlLG4se2dldDp0W25dLGVudW1lcmFibGU6ITB9KX0sQUQ9e307U2woQUQse19fcGFyc2VQcmV0dGllcllhbWxDb25maWc6KCk9PkZiLGxhbmd1YWdlczooKT0+ZTIsb3B0aW9uczooKT0+dDIscGFyc2VyczooKT0+RGgscHJpbnRlcnM6KCk9PnZifSk7dmFyIHdEPShlLHQpPT4obixyLC4uLnMpPT5ufDEmJnI9PW51bGw/dm9pZCAwOih0LmNhbGwocik/P3JbZV0pLmFwcGx5KHIscyk7ZnVuY3Rpb24ga3goZSl7cmV0dXJuIHRoaXNbZTwwP3RoaXMubGVuZ3RoK2U6ZV19dmFyIFR4PXdEKCJhdCIsZnVuY3Rpb24oKXtpZihBcnJheS5pc0FycmF5KHRoaXMpfHx0eXBlb2YgdGhpcz09InN0cmluZyIpcmV0dXJuIGt4fSksZ249VHgsTng9U3RyaW5nLnByb3RvdHlwZS5yZXBsYWNlQWxsPz9mdW5jdGlvbihlLHQpe3JldHVybiBlLmdsb2JhbD90aGlzLnJlcGxhY2UoZSx0KTp0aGlzLnNwbGl0KGUpLmpvaW4odCl9LEx4PXdEKCJyZXBsYWNlQWxsIixmdW5jdGlvbigpe2lmKHR5cGVvZiB0aGlzPT0ic3RyaW5nIilyZXR1cm4gTnh9KSxzaD1MeCwkeD0oKT0+e30sQng9JHgsQ0Q9InN0cmluZyIsU0Q9ImFycmF5Iix4RD0iY3Vyc29yIixrRD0iaW5kZW50IixpaD0iYWxpZ24iLFREPSJ0cmltIixvaD0iZ3JvdXAiLGFoPSJmaWxsIix1aD0iaWYtYnJlYWsiLE5EPSJpbmRlbnQtaWYtYnJlYWsiLGxoPSJsaW5lLXN1ZmZpeCIsTEQ9ImxpbmUtc3VmZml4LWJvdW5kYXJ5Iixybz0ibGluZSIsJEQ9ImxhYmVsIixjaD0iYnJlYWstcGFyZW50IixCRD1uZXcgU2V0KFt4RCxrRCxpaCxURCxvaCxhaCx1aCxORCxsaCxMRCxybywkRCxjaF0pO2Z1bmN0aW9uIF9EKGUsdCxuKXtpZighZS5oYXModCkpe2xldCByPW4odCk7ZS5zZXQodCxyKX1yZXR1cm4gZS5nZXQodCl9ZnVuY3Rpb24gX3goZSl7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiBDRDtpZihBcnJheS5pc0FycmF5KGUpKXJldHVybiBTRDtpZighZSlyZXR1cm47bGV0e3R5cGU6dH09ZTtpZihCRC5oYXModCkpcmV0dXJuIHR9dmFyIElEPV94LEl4PWU9Pm5ldyBJbnRsLkxpc3RGb3JtYXQoImVuLVVTIix7dHlwZToiZGlzanVuY3Rpb24ifSkuZm9ybWF0KGUpO2Z1bmN0aW9uIFB4KGUpe2xldCB0PWU9PT1udWxsPyJudWxsIjp0eXBlb2YgZTtpZih0IT09InN0cmluZyImJnQhPT0ib2JqZWN0IilyZXR1cm5gVW5leHBlY3RlZCBkb2MgJyR7dH0nLCAKRXhwZWN0ZWQgaXQgdG8gYmUgJ3N0cmluZycgb3IgJ29iamVjdCcuYDtpZihJRChlKSl0aHJvdyBuZXcgRXJyb3IoImRvYyBpcyB2YWxpZC4iKTtsZXQgbj1PYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwoZSk7aWYobiE9PSJbb2JqZWN0IE9iamVjdF0iKXJldHVybmBVbmV4cGVjdGVkIGRvYyAnJHtufScuYDtsZXQgcj1JeChbLi4uQkRdLm1hcChzPT5gJyR7c30nYCkpO3JldHVybmBVbmV4cGVjdGVkIGRvYy50eXBlICcke2UudHlwZX0nLgpFeHBlY3RlZCBpdCB0byBiZSAke3J9LmB9dmFyIE14PWNsYXNzIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3Iobil7c3VwZXIoUHgobikpO1dlKHRoaXMsIm5hbWUiLCJJbnZhbGlkRG9jRXJyb3IiKTt0aGlzLmRvYz1ufX0sT3g9TXg7ZnVuY3Rpb24gUngoZSx0KXtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJuIHQoZSk7bGV0IG49bmV3IE1hcDtyZXR1cm4gcihlKTtmdW5jdGlvbiByKGkpe3JldHVybiBfRChuLGkscyl9ZnVuY3Rpb24gcyhpKXtzd2l0Y2goSUQoaSkpe2Nhc2UgU0Q6cmV0dXJuIHQoaS5tYXAocikpO2Nhc2UgYWg6cmV0dXJuIHQoey4uLmkscGFydHM6aS5wYXJ0cy5tYXAocil9KTtjYXNlIHVoOnJldHVybiB0KHsuLi5pLGJyZWFrQ29udGVudHM6cihpLmJyZWFrQ29udGVudHMpLGZsYXRDb250ZW50czpyKGkuZmxhdENvbnRlbnRzKX0pO2Nhc2Ugb2g6e2xldHtleHBhbmRlZFN0YXRlczpvLGNvbnRlbnRzOmF9PWk7cmV0dXJuIG8/KG89by5tYXAociksYT1vWzBdKTphPXIoYSksdCh7Li4uaSxjb250ZW50czphLGV4cGFuZGVkU3RhdGVzOm99KX1jYXNlIGloOmNhc2Uga0Q6Y2FzZSBORDpjYXNlICREOmNhc2UgbGg6cmV0dXJuIHQoey4uLmksY29udGVudHM6cihpLmNvbnRlbnRzKX0pO2Nhc2UgQ0Q6Y2FzZSB4RDpjYXNlIFREOmNhc2UgTEQ6Y2FzZSBybzpjYXNlIGNoOnJldHVybiB0KGkpO2RlZmF1bHQ6dGhyb3cgbmV3IE94KGkpfX19ZnVuY3Rpb24gangoZSx0PWhoKXtyZXR1cm4gUngoZSxuPT50eXBlb2Ygbj09InN0cmluZyI/UnQodCxuLnNwbGl0KGAKYCkpOm4pfXZhciBWeD1CeDtmdW5jdGlvbiB4bChlLHQpe3JldHVybnt0eXBlOmloLGNvbnRlbnRzOnQsbjplfX1mdW5jdGlvbiBQRChlKXtyZXR1cm4geGwoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLGUpfWZ1bmN0aW9uIFV4KGUpe3JldHVybiB4bCh7dHlwZToicm9vdCJ9LGUpfWZ1bmN0aW9uIHF4KGUpe3JldHVybiB4bCgtMSxlKX12YXIgZmg9e3R5cGU6Y2h9O2Z1bmN0aW9uIE1EKGUpe3JldHVybnt0eXBlOmFoLHBhcnRzOmV9fWZ1bmN0aW9uIGtsKGUsdD17fSl7cmV0dXJuIFZ4KHQuZXhwYW5kZWRTdGF0ZXMpLHt0eXBlOm9oLGlkOnQuaWQsY29udGVudHM6ZSxicmVhazohIXQuc2hvdWxkQnJlYWssZXhwYW5kZWRTdGF0ZXM6dC5leHBhbmRlZFN0YXRlc319ZnVuY3Rpb24gT0QoZSx0KXtyZXR1cm4ga2woZVswXSx7Li4udCxleHBhbmRlZFN0YXRlczplfSl9ZnVuY3Rpb24gcGgoZSx0PSIiLG49e30pe3JldHVybnt0eXBlOnVoLGJyZWFrQ29udGVudHM6ZSxmbGF0Q29udGVudHM6dCxncm91cElkOm4uZ3JvdXBJZH19ZnVuY3Rpb24gUnQoZSx0KXtsZXQgbj1bXTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKylyIT09MCYmbi5wdXNoKGUpLG4ucHVzaCh0W3JdKTtyZXR1cm4gbn12YXIgQWE9e3R5cGU6cm99LFJEPXt0eXBlOnJvLHNvZnQ6ITB9LFd4PXt0eXBlOnJvLGhhcmQ6ITB9LGRlPVtXeCxmaF0sSHg9e3R5cGU6cm8saGFyZDohMCxsaXRlcmFsOiEwfSxoaD1bSHgsZmhdO2Z1bmN0aW9uIEp4KGUpe3JldHVybnt0eXBlOmxoLGNvbnRlbnRzOmV9fWZ1bmN0aW9uIHp4KGUpe3JldHVybih0LG4scik9PntpZihuPT09ITEpcmV0dXJuITE7bGV0IHM9ISEociE9bnVsbCYmci5iYWNrd2FyZHMpLHtsZW5ndGg6aX09dCxvPW47Zm9yKDtvPj0wJiZvPGk7KXtsZXQgYT10LmNoYXJBdChvKTtpZihlIGluc3RhbmNlb2YgUmVnRXhwKXtpZighZS50ZXN0KGEpKXJldHVybiBvfWVsc2UgaWYoIWUuaW5jbHVkZXMoYSkpcmV0dXJuIG87cz9vLS06bysrfXJldHVybiBvPT09LTF8fG89PT1pP286ITF9fXZhciBqRD16eCgiIAkiKSxWRD1lPT5lPT09YApgfHxlPT09IlxyInx8ZT09PSJcdTIwMjgifHxlPT09Ilx1MjAyOSI7ZnVuY3Rpb24gR3goZSx0LG4pe2lmKHQ9PT0hMSlyZXR1cm4hMTtsZXQgcj0hIShuIT1udWxsJiZuLmJhY2t3YXJkcykscz1lLmNoYXJBdCh0KTtpZihyKXtpZihlLmNoYXJBdCh0LTEpPT09IlxyIiYmcz09PWAKYClyZXR1cm4gdC0yO2lmKFZEKHMpKXJldHVybiB0LTF9ZWxzZXtpZihzPT09IlxyIiYmZS5jaGFyQXQodCsxKT09PWAKYClyZXR1cm4gdCsyO2lmKFZEKHMpKXJldHVybiB0KzF9cmV0dXJuIHR9dmFyIFVEPUd4O2Z1bmN0aW9uIEt4KGUsdCl7bGV0IG49dC0xO249akQoZSxuLHtiYWNrd2FyZHM6ITB9KSxuPVVEKGUsbix7YmFja3dhcmRzOiEwfSksbj1qRChlLG4se2JhY2t3YXJkczohMH0pO2xldCByPVVEKGUsbix7YmFja3dhcmRzOiEwfSk7cmV0dXJuIG4hPT1yfXZhciBxRD1LeCxYeD1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKG4scixzPSJ0eXBlIil7c3VwZXIoYFVuZXhwZWN0ZWQgJHtyfSBub2RlICR7c306ICR7SlNPTi5zdHJpbmdpZnkobltzXSl9LmApO1dlKHRoaXMsIm5hbWUiLCJVbmV4cGVjdGVkTm9kZUVycm9yIik7dGhpcy5ub2RlPW59fSxZeD1YeDtmdW5jdGlvbiBXRChlLHQpe2xldHtub2RlOm59PWU7aWYobi50eXBlPT09InJvb3QiJiZ0LmZpbGVwYXRoJiYvKD86Wy9cXF18XilcLig/OnByZXR0aWVyfHN0eWxlbGludHxsaW50c3RhZ2VkKXJjJC8udGVzdCh0LmZpbGVwYXRoKSlyZXR1cm4gYXN5bmMgcj0+e2xldCBzPWF3YWl0IHIodC5vcmlnaW5hbFRleHQse3BhcnNlcjoianNvbiJ9KTtyZXR1cm4gcz9bcyxkZV06dm9pZCAwfX1XRC5nZXRWaXNpdG9yS2V5cz0oKT0+W107dmFyIFF4PVdELHdhPW51bGw7ZnVuY3Rpb24gQ2EoZSl7aWYod2EhPT1udWxsJiZ0eXBlb2Ygd2EucHJvcGVydHkpe2xldCB0PXdhO3JldHVybiB3YT1DYS5wcm90b3R5cGU9bnVsbCx0fXJldHVybiB3YT1DYS5wcm90b3R5cGU9ZT8/T2JqZWN0LmNyZWF0ZShudWxsKSxuZXcgQ2F9dmFyIFp4PTEwO2ZvcihsZXQgZT0wO2U8PVp4O2UrKylDYSgpO2Z1bmN0aW9uIGU3KGUpe3JldHVybiBDYShlKX1mdW5jdGlvbiB0NyhlLHQ9InR5cGUiKXtlNyhlKTtmdW5jdGlvbiBuKHIpe2xldCBzPXJbdF0saT1lW3NdO2lmKCFBcnJheS5pc0FycmF5KGkpKXRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBNaXNzaW5nIHZpc2l0b3Iga2V5cyBmb3IgJyR7c30nLmApLHtub2RlOnJ9KTtyZXR1cm4gaX1yZXR1cm4gbn12YXIgbjc9dDcsamU9W1siY2hpbGRyZW4iLCJhbmNob3IiLCJ0YWciLCJpbmRpY2F0b3JDb21tZW50IiwibGVhZGluZ0NvbW1lbnRzIiwibWlkZGxlQ29tbWVudHMiLCJ0cmFpbGluZ0NvbW1lbnQiLCJlbmRDb21tZW50cyJdLFsiYW5jaG9yIiwidGFnIiwiaW5kaWNhdG9yQ29tbWVudCIsImxlYWRpbmdDb21tZW50cyIsIm1pZGRsZUNvbW1lbnRzIiwidHJhaWxpbmdDb21tZW50IiwiZW5kQ29tbWVudHMiXSxbImtleSIsInZhbHVlIiwiY2hpbGRyZW4iLCJhbmNob3IiLCJ0YWciLCJpbmRpY2F0b3JDb21tZW50IiwibGVhZGluZ0NvbW1lbnRzIiwibWlkZGxlQ29tbWVudHMiLCJ0cmFpbGluZ0NvbW1lbnQiLCJlbmRDb21tZW50cyJdLFsiY29udGVudCIsImNoaWxkcmVuIiwiYW5jaG9yIiwidGFnIiwiaW5kaWNhdG9yQ29tbWVudCIsImxlYWRpbmdDb21tZW50cyIsIm1pZGRsZUNvbW1lbnRzIiwidHJhaWxpbmdDb21tZW50IiwiZW5kQ29tbWVudHMiXSxbImluZGljYXRvckNvbW1lbnQiLCJsZWFkaW5nQ29tbWVudHMiLCJtaWRkbGVDb21tZW50cyIsInRyYWlsaW5nQ29tbWVudCIsImVuZENvbW1lbnRzIl1dLHI3PXtyb290OmplWzBdLGRvY3VtZW50OlsiaGVhZCIsImJvZHkiLCJjaGlsZHJlbiIsImFuY2hvciIsInRhZyIsImluZGljYXRvckNvbW1lbnQiLCJsZWFkaW5nQ29tbWVudHMiLCJtaWRkbGVDb21tZW50cyIsInRyYWlsaW5nQ29tbWVudCIsImVuZENvbW1lbnRzIl0sZG9jdW1lbnRIZWFkOmplWzBdLGRvY3VtZW50Qm9keTpqZVswXSxkaXJlY3RpdmU6amVbMV0sYWxpYXM6amVbMV0sYmxvY2tMaXRlcmFsOmplWzFdLGJsb2NrRm9sZGVkOmplWzBdLHBsYWluOmplWzBdLHF1b3RlU2luZ2xlOmplWzFdLHF1b3RlRG91YmxlOmplWzFdLG1hcHBpbmc6amVbMF0sbWFwcGluZ0l0ZW06amVbMl0sbWFwcGluZ0tleTpqZVszXSxtYXBwaW5nVmFsdWU6amVbM10sc2VxdWVuY2U6amVbMF0sc2VxdWVuY2VJdGVtOmplWzNdLGZsb3dNYXBwaW5nOmplWzBdLGZsb3dNYXBwaW5nSXRlbTpqZVsyXSxmbG93U2VxdWVuY2U6amVbMF0sZmxvd1NlcXVlbmNlSXRlbTpqZVszXSxjb21tZW50OmplWzFdLHRhZzpqZVs0XSxhbmNob3I6amVbNF19LHM3PW43KHI3KSxpNz1zNyxkaD1lPT5lLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCxvNz1lPT5lLnBvc2l0aW9uLmVuZC5vZmZzZXQsYTc9ImZvcm1hdCIsdTc9L15ccyojW15cU1xuXSpAKD86bm9mb3JtYXR8bm9wcmV0dGllcilccyo/KD86XG58JCkvLGw3PS9eXHMqI1teXFNcbl0qQCg/OmZvcm1hdHxwcmV0dGllcilccyo/KD86XG58JCkvLGM3PS9eXHMqQCg/OmZvcm1hdHxwcmV0dGllcilccyokLyxmNz1lPT5jNy50ZXN0KGUpLHA3PWU9Pmw3LnRlc3QoZSksaDc9ZT0+dTcudGVzdChlKSxkNz1lPT5gIyBAJHthN30KCiR7ZX1gO2Z1bmN0aW9uIEhEKGUsdCl7c3dpdGNoKGUudHlwZSl7Y2FzZSJjb21tZW50IjppZihmNyhlLnZhbHVlKSlyZXR1cm4gbnVsbDticmVhaztjYXNlInF1b3RlRG91YmxlIjpjYXNlInF1b3RlU2luZ2xlIjp0LnR5cGU9InF1b3RlIjticmVhaztjYXNlImRvY3VtZW50Ijp0LmRpcmVjdGl2ZXNFbmRNYXJrZXJ8fGRlbGV0ZSB0LmRpcmVjdGl2ZXNFbmRNYXJrZXIsdC5kb2N1bWVudEVuZE1hcmtlcnx8ZGVsZXRlIHQuZG9jdW1lbnRFbmRNYXJrZXI7YnJlYWs7Y2FzZSJibG9ja0xpdGVyYWwiOmNhc2UiYmxvY2tGb2xkZWQiOmUuY2hvbXBpbmc9PT0ia2VlcCI/dC52YWx1ZT1lLnZhbHVlLnNwbGl0KGAKYCkubWFwKG49Pm4ucmVwbGFjZSgvWyBcdF0rJC8sIiIpKS5qb2luKGAKYCk6KGUuY2hvbXBpbmc9PT0iY2xpcCJ8fGUuY2hvbXBpbmc9PT0ic3RyaXAiKSYmKHQudmFsdWU9ZS52YWx1ZS50cmltRW5kKCkpO2JyZWFrfX1IRC5pZ25vcmVkUHJvcGVydGllcz1uZXcgU2V0KFsicG9zaXRpb24iXSk7ZnVuY3Rpb24gbTcoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPjB9dmFyIFNhPW03O2Z1bmN0aW9uIHRyKGUsdCl7cmV0dXJuIHR5cGVvZihlPT1udWxsP3ZvaWQgMDplLnR5cGUpPT0ic3RyaW5nIiYmdC5pbmNsdWRlcyhlLnR5cGUpfWZ1bmN0aW9uIEpEKGUsdCxuKXtyZXR1cm4gdCgiY2hpbGRyZW4iaW4gZT97Li4uZSxjaGlsZHJlbjplLmNoaWxkcmVuLm1hcChyPT5KRChyLHQsZSkpfTplLG4pfWZ1bmN0aW9uIHhhKGUsdCxuKXtPYmplY3QuZGVmaW5lUHJvcGVydHkoZSx0LHtnZXQ6bixlbnVtZXJhYmxlOiExfSl9ZnVuY3Rpb24gZzcoZSx0KXtsZXQgbj0wLHI9dC5sZW5ndGg7Zm9yKGxldCBzPWUucG9zaXRpb24uZW5kLm9mZnNldC0xO3M8cjtzKyspe2xldCBpPXRbc107aWYoaT09PWAKYCYmbisrLG49PT0xJiYvXFMvLnRlc3QoaSkpcmV0dXJuITE7aWYobj09PTIpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gekQoZSl7bGV0e25vZGU6dH09ZTtzd2l0Y2godC50eXBlKXtjYXNlInRhZyI6Y2FzZSJhbmNob3IiOmNhc2UiY29tbWVudCI6cmV0dXJuITF9bGV0IG49ZS5zdGFjay5sZW5ndGg7Zm9yKGxldCByPTE7cjxuO3IrKyl7bGV0IHM9ZS5zdGFja1tyXSxpPWUuc3RhY2tbci0xXTtpZihBcnJheS5pc0FycmF5KGkpJiZ0eXBlb2Ygcz09Im51bWJlciImJnMhPT1pLmxlbmd0aC0xKXJldHVybiExfXJldHVybiEwfWZ1bmN0aW9uIG1oKGUpe3JldHVybiBTYShlLmNoaWxkcmVuKT9taChnbigwLGUuY2hpbGRyZW4sLTEpKTplfWZ1bmN0aW9uIEdEKGUpe3JldHVybiBlLnZhbHVlLnRyaW0oKT09PSJwcmV0dGllci1pZ25vcmUifWZ1bmN0aW9uIHk3KGUpe2xldHtub2RlOnR9PWU7aWYodC50eXBlPT09ImRvY3VtZW50Qm9keSIpe2xldCBuPWUucGFyZW50LmhlYWQ7cmV0dXJuIHluKG4pJiZHRChnbigwLG4uZW5kQ29tbWVudHMsLTEpKX1yZXR1cm4gdXModCkmJkdEKGduKDAsdC5sZWFkaW5nQ29tbWVudHMsLTEpKX1mdW5jdGlvbiBUbChlKXtyZXR1cm4hU2EoZS5jaGlsZHJlbikmJiFENyhlKX1mdW5jdGlvbiBENyhlKXtyZXR1cm4gdXMoZSl8fHNvKGUpfHxLRChlKXx8am4oZSl8fHluKGUpfWZ1bmN0aW9uIHVzKGUpe3JldHVybiBTYShlPT1udWxsP3ZvaWQgMDplLmxlYWRpbmdDb21tZW50cyl9ZnVuY3Rpb24gc28oZSl7cmV0dXJuIFNhKGU9PW51bGw/dm9pZCAwOmUubWlkZGxlQ29tbWVudHMpfWZ1bmN0aW9uIEtEKGUpe3JldHVybiBlPT1udWxsP3ZvaWQgMDplLmluZGljYXRvckNvbW1lbnR9ZnVuY3Rpb24gam4oZSl7cmV0dXJuIGU9PW51bGw/dm9pZCAwOmUudHJhaWxpbmdDb21tZW50fWZ1bmN0aW9uIHluKGUpe3JldHVybiBTYShlPT1udWxsP3ZvaWQgMDplLmVuZENvbW1lbnRzKX1mdW5jdGlvbiBYRChlKXtyZXR1cm4gZT9lLnNwbGl0KG5ldyBSZWdFeHAoIig/PCFefCApICg/ISB8JCkiKSk6W119ZnVuY3Rpb24gYjcoZSx0LG4pe2xldCByPXQuc3BsaXQoYApgKS5tYXAoKGksbyxhKT0+bz09PTAmJm89PT1hLmxlbmd0aC0xP2k6byE9PTAmJm8hPT1hLmxlbmd0aC0xP2kudHJpbSgpOm89PT0wP2kudHJpbUVuZCgpOmkudHJpbVN0YXJ0KCkpO2lmKG4ucHJvc2VXcmFwPT09InByZXNlcnZlIilyZXR1cm4gci5tYXAoaT0+aT9baV06W10pO2xldCBzPVtdO2ZvcihsZXRbaSxvXW9mIHIuZW50cmllcygpKXtsZXQgYT1YRChvKTtpPjAmJnJbaS0xXS5sZW5ndGg+MCYmYS5sZW5ndGg+MCYmIShlPT09InF1b3RlRG91YmxlIiYmZ24oMCxnbigwLHMsLTEpLC0xKS5lbmRzV2l0aCgiXFwiKSk/c1tzLmxlbmd0aC0xXT1bLi4uZ24oMCxzLC0xKSwuLi5hXTpzLnB1c2goYSl9cmV0dXJuIG4ucHJvc2VXcmFwPT09Im5ldmVyIj9zLm1hcChpPT5baS5qb2luKCIgIildKTpzfWZ1bmN0aW9uIEU3KGUse3BhcmVudEluZGVudDp0LGlzTGFzdERlc2NlbmRhbnQ6bixvcHRpb25zOnJ9KXtsZXQgcz1lLnBvc2l0aW9uLnN0YXJ0LmxpbmU9PT1lLnBvc2l0aW9uLmVuZC5saW5lPyIiOnIub3JpZ2luYWxUZXh0LnNsaWNlKGUucG9zaXRpb24uc3RhcnQub2Zmc2V0LGUucG9zaXRpb24uZW5kLm9mZnNldCkubWF0Y2goL15bXlxuXSpcbiguKikkL3MpWzFdO2lmKHM9PT0iIilyZXR1cm5bXTtsZXQgaTtpZihlLmluZGVudD09PW51bGwpe2xldCBsPXMubWF0Y2goL14oPzxsZWFkaW5nU3BhY2U+ICopW15cblxyIF0vbSk7aT1sP2wuZ3JvdXBzLmxlYWRpbmdTcGFjZS5sZW5ndGg6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZfWVsc2UgaT1lLmluZGVudC0xK3Q7bGV0IG89cy5zcGxpdChgCmApLm1hcChsPT5sLnNsaWNlKGkpKTtpZihyLnByb3NlV3JhcD09PSJwcmVzZXJ2ZSJ8fGUudHlwZT09PSJibG9ja0xpdGVyYWwiKXJldHVybiB1KG8ubWFwKGw9Pmw/W2xdOltdKSk7bGV0IGE9W107Zm9yKGxldFtsLGZdb2Ygby5lbnRyaWVzKCkpe2xldCBjPVhEKGYpO2w+MCYmYy5sZW5ndGg+MCYmb1tsLTFdLmxlbmd0aD4wJiYhL15ccy8udGVzdChjWzBdKSYmIS9eXHN8XHMkLy50ZXN0KGduKDAsYSwtMSkpP2FbYS5sZW5ndGgtMV09Wy4uLmduKDAsYSwtMSksLi4uY106YS5wdXNoKGMpfXJldHVybiBhPWEubWFwKGw9PntsZXQgZj1bXTtmb3IobGV0IGMgb2YgbClmLmxlbmd0aD4wJiYvXHMkLy50ZXN0KGduKDAsZiwtMSkpP2ZbZi5sZW5ndGgtMV0rPSIgIitjOmYucHVzaChjKTtyZXR1cm4gZn0pLHIucHJvc2VXcmFwPT09Im5ldmVyIiYmKGE9YS5tYXAobD0+W2wuam9pbigiICIpXSkpLHUoYSk7ZnVuY3Rpb24gdShsKXtpZihlLmNob21waW5nPT09ImtlZXAiKXJldHVybiBzLmVuZHNXaXRoKGAKYCkmJmduKDAsbCwtMSkubGVuZ3RoPT09MD9sLnNsaWNlKDAsLTEpOmw7bGV0IGY9MDtmb3IobGV0IGM9bC5sZW5ndGgtMTtjPj0wJiZsW2NdLmV2ZXJ5KHA9PnAucmVwbGFjZSgvWyBcdF0rJC8sIiIpPT09IiIpO2MtLSlmKys7cmV0dXJuIGY9PT0wP2w6Zj49MiYmIW4/bC5zbGljZSgwLC0oZi0xKSk6bC5zbGljZSgwLC1mKX19ZnVuY3Rpb24gZ2goZSl7aWYoIWUpcmV0dXJuITA7c3dpdGNoKGUudHlwZSl7Y2FzZSJwbGFpbiI6Y2FzZSJxdW90ZURvdWJsZSI6Y2FzZSJxdW90ZVNpbmdsZSI6Y2FzZSJhbGlhcyI6Y2FzZSJmbG93TWFwcGluZyI6Y2FzZSJmbG93U2VxdWVuY2UiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fXZhciB2Nz1uZXcgV2Vha01hcDtmdW5jdGlvbiBZRChlLHQpe2xldHtub2RlOm4scm9vdDpyfT1lLHM9X0QodjcsciwoKT0+bmV3IFNldCk7cmV0dXJuIXMuaGFzKG4ucG9zaXRpb24uZW5kLm9mZnNldCkmJihzLmFkZChuLnBvc2l0aW9uLmVuZC5vZmZzZXQpLGc3KG4sdCkmJiFRRChlLnBhcmVudCkpP1JEOiIifWZ1bmN0aW9uIFFEKGUpe3JldHVybiB5bihlKSYmIXRyKGUsWyJkb2N1bWVudEhlYWQiLCJkb2N1bWVudEJvZHkiLCJmbG93TWFwcGluZyIsImZsb3dTZXF1ZW5jZSJdKX1mdW5jdGlvbiBEbihlLHQpe3JldHVybiB4bCgiICIucmVwZWF0KGUpLHQpfWZ1bmN0aW9uIEY3KGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9ZS5hbmNlc3RvcnMuZmlsdGVyKGw9PmwudHlwZT09PSJzZXF1ZW5jZSJ8fGwudHlwZT09PSJtYXBwaW5nIikubGVuZ3RoLGk9ekQoZSksbz1bci50eXBlPT09ImJsb2NrRm9sZGVkIj8iPiI6InwiXTtyLmluZGVudCE9PW51bGwmJm8ucHVzaChyLmluZGVudC50b1N0cmluZygpKSxyLmNob21waW5nIT09ImNsaXAiJiZvLnB1c2goci5jaG9tcGluZz09PSJrZWVwIj8iKyI6Ii0iKSxLRChyKSYmby5wdXNoKCIgIixuKCJpbmRpY2F0b3JDb21tZW50IikpO2xldCBhPUU3KHIse3BhcmVudEluZGVudDpzLGlzTGFzdERlc2NlbmRhbnQ6aSxvcHRpb25zOnR9KSx1PVtdO2ZvcihsZXRbbCxmXW9mIGEuZW50cmllcygpKWw9PT0wJiZ1LnB1c2goZGUpLHUucHVzaChNRChSdChBYSxmKSkpLGwhPT1hLmxlbmd0aC0xP3UucHVzaChmLmxlbmd0aD09PTA/ZGU6VXgoaGgpKTpyLmNob21waW5nPT09ImtlZXAiJiZpJiZ1LnB1c2goUEQoZi5sZW5ndGg9PT0wP2RlOmhoKSk7cmV0dXJuIHIuaW5kZW50PT09bnVsbD9vLnB1c2gocXgoRG4odC50YWJXaWR0aCx1KSkpOm8ucHVzaChQRChEbihyLmluZGVudC0xK3MsdSkpKSxvfXZhciBBNz1GNztmdW5jdGlvbiBaRChlLHQsbil7bGV0e25vZGU6cn09ZSxzPXIudHlwZT09PSJmbG93TWFwcGluZyIsaT1zPyJ7IjoiWyIsbz1zPyJ9IjoiXSIsYT1SRDtzJiZyLmNoaWxkcmVuLmxlbmd0aD4wJiZ0LmJyYWNrZXRTcGFjaW5nJiYoYT1BYSk7bGV0IHU9Z24oMCxyLmNoaWxkcmVuLC0xKSxsPSh1PT1udWxsP3ZvaWQgMDp1LnR5cGUpPT09ImZsb3dNYXBwaW5nSXRlbSImJlRsKHUua2V5KSYmVGwodS52YWx1ZSk7cmV0dXJuW2ksRG4odC50YWJXaWR0aCxbYSx3NyhlLHQsbiksdC50cmFpbGluZ0NvbW1hPT09Im5vbmUiPyIiOnBoKCIsIikseW4ocik/W2RlLFJ0KGRlLGUubWFwKG4sImVuZENvbW1lbnRzIikpXToiIl0pLGw/IiI6YSxvXX1mdW5jdGlvbiB3NyhlLHQsbil7cmV0dXJuIGUubWFwKCh7aXNMYXN0OnIsbm9kZTpzLG5leHQ6aX0pPT5bbigpLHI/IiI6WyIsIixBYSxzLnBvc2l0aW9uLnN0YXJ0LmxpbmUhPT1pLnBvc2l0aW9uLnN0YXJ0LmxpbmU/WUQoZSx0Lm9yaWdpbmFsVGV4dCk6IiJdXSwiY2hpbGRyZW4iKX1mdW5jdGlvbiBDNyhlLHQsbil7dmFyIEQ7bGV0e25vZGU6cixwYXJlbnQ6c309ZSx7a2V5OmksdmFsdWU6b309cixhPVRsKGkpLHU9VGwobyk7aWYoYSYmdSlyZXR1cm4iOiAiO2xldCBsPW4oImtleSIpLGY9Uzcocik/IiAiOiIiO2lmKHUpcmV0dXJuIHIudHlwZT09PSJmbG93TWFwcGluZ0l0ZW0iJiZzLnR5cGU9PT0iZmxvd01hcHBpbmciP2w6ci50eXBlPT09Im1hcHBpbmdJdGVtIiYmTmwoaS5jb250ZW50LHQpJiYham4oaS5jb250ZW50KSYmKChEPXMudGFnKT09bnVsbD92b2lkIDA6RC52YWx1ZSkhPT0idGFnOnlhbWwub3JnLDIwMDI6c2V0Ij9bbCxmLCI6Il06WyI/ICIsRG4oMixsKV07bGV0IGM9bigidmFsdWUiKTtpZihhKXJldHVyblsiOiAiLERuKDIsYyldO2lmKHVzKG8pfHwhZ2goaS5jb250ZW50KSlyZXR1cm5bIj8gIixEbigyLGwpLGRlLC4uLmUubWFwKCgpPT5bbigpLGRlXSwidmFsdWUiLCJsZWFkaW5nQ29tbWVudHMiKSwiOiAiLERuKDIsYyldO2lmKHg3KGkuY29udGVudCkmJiF1cyhpLmNvbnRlbnQpJiYhc28oaS5jb250ZW50KSYmIWpuKGkuY29udGVudCkmJiF5bihpKSYmIXVzKG8uY29udGVudCkmJiFzbyhvLmNvbnRlbnQpJiYheW4obykmJk5sKG8uY29udGVudCx0KSYmTmwoaS5jb250ZW50LHQpKXJldHVybltsLGYsIjogIixjXTtsZXQgcD1TeW1ib2woIm1hcHBpbmdLZXkiKSxoPWtsKFtwaCgiPyAiKSxrbChEbigyLGwpLHtpZDpwfSldKSxkPVtkZSwiOiAiLERuKDIsYyldLG09W2YsIjoiXTt5bihvKSYmby5jb250ZW50JiZ0cihvLmNvbnRlbnQsWyJmbG93TWFwcGluZyIsImZsb3dTZXF1ZW5jZSJdKSYmby5jb250ZW50LmNoaWxkcmVuLmxlbmd0aD09PTA/bS5wdXNoKCIgIik6dXMoby5jb250ZW50KXx8eW4obykmJm8uY29udGVudCYmIXRyKG8uY29udGVudCxbIm1hcHBpbmciLCJzZXF1ZW5jZSJdKXx8cy50eXBlPT09Im1hcHBpbmciJiZqbihpLmNvbnRlbnQpJiZnaChvLmNvbnRlbnQpfHx0cihvLmNvbnRlbnQsWyJtYXBwaW5nIiwic2VxdWVuY2UiXSkmJm8uY29udGVudC50YWc9PT1udWxsJiZvLmNvbnRlbnQuYW5jaG9yPT09bnVsbD9tLnB1c2goZGUpOm8uY29udGVudD9tLnB1c2goQWEpOmpuKG8pJiZtLnB1c2goIiAiKSxtLnB1c2goYyk7bGV0IGc9RG4odC50YWJXaWR0aCxtKTtyZXR1cm4gTmwoaS5jb250ZW50LHQpJiYhdXMoaS5jb250ZW50KSYmIXNvKGkuY29udGVudCkmJiFqbihpLmNvbnRlbnQpJiYheW4oaSk/T0QoW1tsLGddXSk6T0QoW1toLHBoKGQsZyx7Z3JvdXBJZDpwfSldXSl9ZnVuY3Rpb24gTmwoZSx0KXtpZighZSlyZXR1cm4hMDtzd2l0Y2goZS50eXBlKXtjYXNlInBsYWluIjpjYXNlInF1b3RlU2luZ2xlIjpjYXNlInF1b3RlRG91YmxlIjpicmVhaztjYXNlImFsaWFzIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfWlmKHQucHJvc2VXcmFwPT09InByZXNlcnZlIilyZXR1cm4gZS5wb3NpdGlvbi5zdGFydC5saW5lPT09ZS5wb3NpdGlvbi5lbmQubGluZTtpZigvXFwkL20udGVzdCh0Lm9yaWdpbmFsVGV4dC5zbGljZShlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCxlLnBvc2l0aW9uLmVuZC5vZmZzZXQpKSlyZXR1cm4hMTtzd2l0Y2godC5wcm9zZVdyYXApe2Nhc2UibmV2ZXIiOnJldHVybiFlLnZhbHVlLmluY2x1ZGVzKGAKYCk7Y2FzZSJhbHdheXMiOnJldHVybiEvW1xuIF0vLnRlc3QoZS52YWx1ZSk7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gUzcoZSl7dmFyIHQ7cmV0dXJuKCh0PWUua2V5LmNvbnRlbnQpPT1udWxsP3ZvaWQgMDp0LnR5cGUpPT09ImFsaWFzIn1mdW5jdGlvbiB4NyhlKXtpZighZSlyZXR1cm4hMDtzd2l0Y2goZS50eXBlKXtjYXNlInBsYWluIjpjYXNlInF1b3RlRG91YmxlIjpjYXNlInF1b3RlU2luZ2xlIjpyZXR1cm4gZS5wb3NpdGlvbi5zdGFydC5saW5lPT09ZS5wb3NpdGlvbi5lbmQubGluZTtjYXNlImFsaWFzIjpyZXR1cm4hMDtkZWZhdWx0OnJldHVybiExfX12YXIgazc9Qzc7ZnVuY3Rpb24gVDcoZSl7cmV0dXJuIEpEKGUsTjcpfWZ1bmN0aW9uIE43KGUpe3N3aXRjaChlLnR5cGUpe2Nhc2UiZG9jdW1lbnQiOnhhKGUsImhlYWQiLCgpPT5lLmNoaWxkcmVuWzBdKSx4YShlLCJib2R5IiwoKT0+ZS5jaGlsZHJlblsxXSk7YnJlYWs7Y2FzZSJkb2N1bWVudEJvZHkiOmNhc2Uic2VxdWVuY2VJdGVtIjpjYXNlImZsb3dTZXF1ZW5jZUl0ZW0iOmNhc2UibWFwcGluZ0tleSI6Y2FzZSJtYXBwaW5nVmFsdWUiOnhhKGUsImNvbnRlbnQiLCgpPT5lLmNoaWxkcmVuWzBdKTticmVhaztjYXNlIm1hcHBpbmdJdGVtIjpjYXNlImZsb3dNYXBwaW5nSXRlbSI6eGEoZSwia2V5IiwoKT0+ZS5jaGlsZHJlblswXSkseGEoZSwidmFsdWUiLCgpPT5lLmNoaWxkcmVuWzFdKTticmVha31yZXR1cm4gZX12YXIgTDc9VDc7ZnVuY3Rpb24gJDcoZSx0LG4pe2xldHtub2RlOnJ9PWUscz1bXTtyLnR5cGUhPT0ibWFwcGluZ1ZhbHVlIiYmdXMocikmJnMucHVzaChbUnQoZGUsZS5tYXAobiwibGVhZGluZ0NvbW1lbnRzIikpLGRlXSk7bGV0e3RhZzppLGFuY2hvcjpvfT1yO2kmJnMucHVzaChuKCJ0YWciKSksaSYmbyYmcy5wdXNoKCIgIiksbyYmcy5wdXNoKG4oImFuY2hvciIpKTtsZXQgYT0iIjtyZXR1cm4gdHIocixbIm1hcHBpbmciLCJzZXF1ZW5jZSIsImNvbW1lbnQiLCJkaXJlY3RpdmUiLCJtYXBwaW5nSXRlbSIsInNlcXVlbmNlSXRlbSJdKSYmIXpEKGUpJiYoYT1ZRChlLHQub3JpZ2luYWxUZXh0KSksKGl8fG8pJiYodHIocixbInNlcXVlbmNlIiwibWFwcGluZyJdKSYmIXNvKHIpP3MucHVzaChkZSk6cy5wdXNoKCIgIikpLHNvKHIpJiZzLnB1c2goW3IubWlkZGxlQ29tbWVudHMubGVuZ3RoPT09MT8iIjpkZSxSdChkZSxlLm1hcChuLCJtaWRkbGVDb21tZW50cyIpKSxkZV0pLHk3KGUpP3MucHVzaChqeCh0Lm9yaWdpbmFsVGV4dC5zbGljZShyLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCxyLnBvc2l0aW9uLmVuZC5vZmZzZXQpLnRyaW1FbmQoKSkpOnMucHVzaChrbChCNyhlLHQsbikpKSxqbihyKSYmIXRyKHIsWyJkb2N1bWVudCIsImRvY3VtZW50SGVhZCJdKSYmcy5wdXNoKEp4KFtyLnR5cGU9PT0ibWFwcGluZ1ZhbHVlIiYmIXIuY29udGVudD8iIjoiICIsZS5wYXJlbnQudHlwZT09PSJtYXBwaW5nS2V5IiYmZS5nZXRQYXJlbnROb2RlKDIpLnR5cGU9PT0ibWFwcGluZyImJmdoKHIpPyIiOmZoLG4oInRyYWlsaW5nQ29tbWVudCIpXSkpLFFEKHIpJiZzLnB1c2goRG4oci50eXBlPT09InNlcXVlbmNlSXRlbSI/MjowLFtkZSxSdChkZSxlLm1hcCgoe25vZGU6dX0pPT5bcUQodC5vcmlnaW5hbFRleHQsZGgodSkpP2RlOiIiLG4oKV0sImVuZENvbW1lbnRzIikpXSkpLHMucHVzaChhKSxzfWZ1bmN0aW9uIEI3KGUsdCxuKXtsZXR7bm9kZTpyfT1lO3N3aXRjaChyLnR5cGUpe2Nhc2Uicm9vdCI6e2xldCBzPW1oKHIpLGk9ISh0cihzLFsiYmxvY2tMaXRlcmFsIiwiYmxvY2tGb2xkZWQiXSkmJnMuY2hvbXBpbmc9PT0ia2VlcCIpLG89W107cmV0dXJuIGUuZWFjaCgoe25vZGU6YSxpc0ZpcnN0OnV9KT0+e3V8fG8ucHVzaChkZSksby5wdXNoKG4oKSksSTcoZSkmJihpJiZvLnB1c2goZGUpLG8ucHVzaCgiLi4uIiksam4oYSkmJm8ucHVzaCgiICIsbigidHJhaWxpbmdDb21tZW50IikpKX0sImNoaWxkcmVuIiksaSYmby5wdXNoKGRlKSxvfWNhc2UiZG9jdW1lbnQiOntsZXQgcz1bXTtyZXR1cm4gUDcoZSkmJigoci5oZWFkLmNoaWxkcmVuLmxlbmd0aD4wfHxyLmhlYWQuZW5kQ29tbWVudHMubGVuZ3RoPjApJiZzLnB1c2gobigiaGVhZCIpKSxqbihyLmhlYWQpP3MucHVzaChbIi0tLSIsIiAiLG4oWyJoZWFkIiwidHJhaWxpbmdDb21tZW50Il0pXSk6cy5wdXNoKCItLS0iKSksXzcocikmJnMucHVzaChuKCJib2R5IikpLFJ0KGRlLHMpfWNhc2UiZG9jdW1lbnRIZWFkIjpyZXR1cm4gUnQoZGUsWy4uLmUubWFwKG4sImNoaWxkcmVuIiksLi4uZS5tYXAobiwiZW5kQ29tbWVudHMiKV0pO2Nhc2UiZG9jdW1lbnRCb2R5Ijp7bGV0e2NoaWxkcmVuOnMsZW5kQ29tbWVudHM6aX09cixvPSIiO2lmKHMubGVuZ3RoPjAmJmkubGVuZ3RoPjApe2xldCBhPW1oKHIpO2lmKHRyKGEsWyJibG9ja0ZvbGRlZCIsImJsb2NrTGl0ZXJhbCJdKSlhLmNob21waW5nIT09ImtlZXAiJiYobz1bZGUsZGVdKTtlbHNle2xldCB1PWduKDAscywtMSk7bz10cih1LFsibWFwcGluZyJdKSYmcUQodC5vcmlnaW5hbFRleHQsZGgoaVswXSkpP1tkZSxkZV06ZGV9fXJldHVybltSdChkZSxlLm1hcChuLCJjaGlsZHJlbiIpKSxvLFJ0KGRlLGUubWFwKG4sImVuZENvbW1lbnRzIikpXX1jYXNlImRpcmVjdGl2ZSI6cmV0dXJuWyIlIixSdCgiICIsW3IubmFtZSwuLi5yLnBhcmFtZXRlcnNdKV07Y2FzZSJjb21tZW50IjpyZXR1cm5bIiMiLHIudmFsdWVdO2Nhc2UiYWxpYXMiOnJldHVyblsiKiIsci52YWx1ZV07Y2FzZSJ0YWciOnJldHVybiB0Lm9yaWdpbmFsVGV4dC5zbGljZShyLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCxyLnBvc2l0aW9uLmVuZC5vZmZzZXQpO2Nhc2UiYW5jaG9yIjpyZXR1cm5bIiYiLHIudmFsdWVdO2Nhc2UicGxhaW4iOnJldHVybiBrYShyLnR5cGUsdC5vcmlnaW5hbFRleHQuc2xpY2Uoci5wb3NpdGlvbi5zdGFydC5vZmZzZXQsci5wb3NpdGlvbi5lbmQub2Zmc2V0KSx0KTtjYXNlInF1b3RlRG91YmxlIjpjYXNlInF1b3RlU2luZ2xlIjp7bGV0IHM9dC5vcmlnaW5hbFRleHQuc2xpY2Uoci5wb3NpdGlvbi5zdGFydC5vZmZzZXQrMSxyLnBvc2l0aW9uLmVuZC5vZmZzZXQtMSk7aWYoci50eXBlPT09InF1b3RlU2luZ2xlIiYmcy5pbmNsdWRlcygiXFwiKXx8ci50eXBlPT09InF1b3RlRG91YmxlIiYmL1xcW14iXS8udGVzdChzKSl7bGV0IG89ci50eXBlPT09InF1b3RlRG91YmxlIj8nIic6IiciO3JldHVybltvLGthKHIudHlwZSxzLHQpLG9dfWlmKHMuaW5jbHVkZXMoJyInKSlyZXR1cm5bIiciLGthKHIudHlwZSxyLnR5cGU9PT0icXVvdGVEb3VibGUiP3NoKDAsc2goMCxzLCdcXCInLCciJyksIiciLCInIi5yZXBlYXQoMikpOnMsdCksIiciXTtpZihzLmluY2x1ZGVzKCInIikpcmV0dXJuWyciJyxrYShyLnR5cGUsci50eXBlPT09InF1b3RlU2luZ2xlIj9zaCgwLHMsIicnIiwiJyIpOnMsdCksJyInXTtsZXQgaT10LnNpbmdsZVF1b3RlPyInIjonIic7cmV0dXJuW2ksa2Eoci50eXBlLHMsdCksaV19Y2FzZSJibG9ja0ZvbGRlZCI6Y2FzZSJibG9ja0xpdGVyYWwiOnJldHVybiBBNyhlLHQsbik7Y2FzZSJtYXBwaW5nIjpjYXNlInNlcXVlbmNlIjpyZXR1cm4gUnQoZGUsZS5tYXAobiwiY2hpbGRyZW4iKSk7Y2FzZSJzZXF1ZW5jZUl0ZW0iOnJldHVyblsiLSAiLERuKDIsci5jb250ZW50P24oImNvbnRlbnQiKToiIildO2Nhc2UibWFwcGluZ0tleSI6Y2FzZSJtYXBwaW5nVmFsdWUiOnJldHVybiByLmNvbnRlbnQ/bigiY29udGVudCIpOiIiO2Nhc2UibWFwcGluZ0l0ZW0iOmNhc2UiZmxvd01hcHBpbmdJdGVtIjpyZXR1cm4gazcoZSx0LG4pO2Nhc2UiZmxvd01hcHBpbmciOnJldHVybiBaRChlLHQsbik7Y2FzZSJmbG93U2VxdWVuY2UiOnJldHVybiBaRChlLHQsbik7Y2FzZSJmbG93U2VxdWVuY2VJdGVtIjpyZXR1cm4gbigiY29udGVudCIpO2RlZmF1bHQ6dGhyb3cgbmV3IFl4KHIsIllBTUwiKX19ZnVuY3Rpb24gXzcoZSl7cmV0dXJuIGUuYm9keS5jaGlsZHJlbi5sZW5ndGg+MHx8eW4oZS5ib2R5KX1mdW5jdGlvbiBJNyhlKXtsZXQgdD1lLm5vZGU7aWYodC5kb2N1bWVudEVuZE1hcmtlcnx8am4odCkpcmV0dXJuITA7aWYoZS5pc0xhc3QpcmV0dXJuITE7bGV0IG49ZS5uZXh0O3JldHVybiBuLmhlYWQuY2hpbGRyZW4ubGVuZ3RoPjB8fHluKG4uaGVhZCl9ZnVuY3Rpb24gUDcoZSl7bGV0IHQ9ZS5ub2RlO3JldHVybiB0LmRpcmVjdGl2ZXNFbmRNYXJrZXJ8fHQuaGVhZC5jaGlsZHJlbi5sZW5ndGg+MHx8eW4odC5oZWFkKXx8am4odC5oZWFkKX1mdW5jdGlvbiBrYShlLHQsbil7bGV0IHI9YjcoZSx0LG4pO3JldHVybiBSdChkZSxyLm1hcChzPT5NRChSdChBYSxzKSkpKX12YXIgTTc9e3ByZXByb2Nlc3M6TDcsZW1iZWQ6UXgscHJpbnQ6JDcsbWFzc2FnZUFzdE5vZGU6SEQsaW5zZXJ0UHJhZ21hOmQ3LGdldFZpc2l0b3JLZXlzOmk3fSxPNz1NNyxlMj1be25hbWU6IllBTUwiLHR5cGU6ImRhdGEiLGFjZU1vZGU6InlhbWwiLGV4dGVuc2lvbnM6WyIueW1sIiwiLm1pciIsIi5yZWVrIiwiLnJ2aXoiLCIuc3VibGltZS1zeW50YXgiLCIuc3ludGF4IiwiLnlhbWwiLCIueWFtbC10bWxhbmd1YWdlIiwiLnlhbWwuc2VkIiwiLnltbC5teXNxbCJdLGZpbGVuYW1lczpbIi5jbGFuZy1mb3JtYXQiLCIuY2xhbmctdGlkeSIsIi5jbGFuZ2QiLCIuZ2VtcmMiLCJDSVRBVElPTi5jZmYiLCJnbGlkZS5sb2NrIiwicGl4aS5sb2NrIiwiLnByZXR0aWVycmMiLCIuc3R5bGVsaW50cmMiLCIubGludHN0YWdlZHJjIl0sdG1TY29wZToic291cmNlLnlhbWwiLGFsaWFzZXM6WyJ5bWwiXSxjb2RlbWlycm9yTW9kZToieWFtbCIsY29kZW1pcnJvck1pbWVUeXBlOiJ0ZXh0L3gteWFtbCIscGFyc2VyczpbInlhbWwiXSx2c2NvZGVMYW5ndWFnZUlkczpbInlhbWwiLCJhbnNpYmxlIiwiZG9ja2VyY29tcG9zZSIsImdpdGh1Yi1hY3Rpb25zLXdvcmtmbG93IiwiaG9tZS1hc3Npc3RhbnQiXSxsaW5ndWlzdExhbmd1YWdlSWQ6NDA3fV0seWg9e2JyYWNrZXRTcGFjaW5nOntjYXRlZ29yeToiQ29tbW9uIix0eXBlOiJib29sZWFuIixkZWZhdWx0OiEwLGRlc2NyaXB0aW9uOiJQcmludCBzcGFjZXMgYmV0d2VlbiBicmFja2V0cy4iLG9wcG9zaXRlRGVzY3JpcHRpb246IkRvIG5vdCBwcmludCBzcGFjZXMgYmV0d2VlbiBicmFja2V0cy4ifSxzaW5nbGVRdW90ZTp7Y2F0ZWdvcnk6IkNvbW1vbiIsdHlwZToiYm9vbGVhbiIsZGVmYXVsdDohMSxkZXNjcmlwdGlvbjoiVXNlIHNpbmdsZSBxdW90ZXMgaW5zdGVhZCBvZiBkb3VibGUgcXVvdGVzLiJ9LHByb3NlV3JhcDp7Y2F0ZWdvcnk6IkNvbW1vbiIsdHlwZToiY2hvaWNlIixkZWZhdWx0OiJwcmVzZXJ2ZSIsZGVzY3JpcHRpb246IkhvdyB0byB3cmFwIHByb3NlLiIsY2hvaWNlczpbe3ZhbHVlOiJhbHdheXMiLGRlc2NyaXB0aW9uOiJXcmFwIHByb3NlIGlmIGl0IGV4Y2VlZHMgdGhlIHByaW50IHdpZHRoLiJ9LHt2YWx1ZToibmV2ZXIiLGRlc2NyaXB0aW9uOiJEbyBub3Qgd3JhcCBwcm9zZS4ifSx7dmFsdWU6InByZXNlcnZlIixkZXNjcmlwdGlvbjoiV3JhcCBwcm9zZSBhcy1pcy4ifV19fSxSNz17YnJhY2tldFNwYWNpbmc6eWguYnJhY2tldFNwYWNpbmcsc2luZ2xlUXVvdGU6eWguc2luZ2xlUXVvdGUscHJvc2VXcmFwOnloLnByb3NlV3JhcH0sdDI9UjcsRGg9e307U2woRGgse3lhbWw6KCk9PnVrfSk7dmFyIG4yPWNsYXNzIGV4dGVuZHMgU3ludGF4RXJyb3J7Y29uc3RydWN0b3IobixyKXtzdXBlcihyLm1lc3NhZ2Use2NhdXNlOnJ9KTtXZSh0aGlzLCJuYW1lIiwiWUFNTFN5bnRheEVycm9yIik7V2UodGhpcywiY29kZSIpO1dlKHRoaXMsInNvdXJjZSIpO1dlKHRoaXMsInBvc2l0aW9uIik7dGhpcy5jYXVzZT8/KHRoaXMuY2F1c2U9ciksdGhpcy5jb2RlPXIuY29kZSx0aGlzLnNvdXJjZT1uLnRleHQsdGhpcy5wb3NpdGlvbj1uLnRyYW5zZm9ybVJhbmdlKHIucG9zKX19O2Z1bmN0aW9uIEt0KGUsdD1udWxsKXsiY2hpbGRyZW4iaW4gZSYmZS5jaGlsZHJlbi5mb3JFYWNoKG49Pkt0KG4sZSkpLCJhbmNob3IiaW4gZSYmZS5hbmNob3ImJkt0KGUuYW5jaG9yLGUpLCJ0YWciaW4gZSYmZS50YWcmJkt0KGUudGFnLGUpLCJsZWFkaW5nQ29tbWVudHMiaW4gZSYmZS5sZWFkaW5nQ29tbWVudHMuZm9yRWFjaChuPT5LdChuLGUpKSwibWlkZGxlQ29tbWVudHMiaW4gZSYmZS5taWRkbGVDb21tZW50cy5mb3JFYWNoKG49Pkt0KG4sZSkpLCJpbmRpY2F0b3JDb21tZW50ImluIGUmJmUuaW5kaWNhdG9yQ29tbWVudCYmS3QoZS5pbmRpY2F0b3JDb21tZW50LGUpLCJ0cmFpbGluZ0NvbW1lbnQiaW4gZSYmZS50cmFpbGluZ0NvbW1lbnQmJkt0KGUudHJhaWxpbmdDb21tZW50LGUpLCJlbmRDb21tZW50cyJpbiBlJiZlLmVuZENvbW1lbnRzLmZvckVhY2gobj0+S3QobixlKSksT2JqZWN0LmRlZmluZVByb3BlcnR5KGUsIl9wYXJlbnQiLHt2YWx1ZTp0LGVudW1lcmFibGU6ITF9KX1mdW5jdGlvbiBUYShlKXtyZXR1cm5gJHtlLmxpbmV9OiR7ZS5jb2x1bW59YH1mdW5jdGlvbiBqNyhlKXtLdChlKTtsZXQgdD1WNyhlKSxuPWUuY2hpbGRyZW4uc2xpY2UoKTtlLmNvbW1lbnRzLmZpbHRlcihyPT4hci5fcGFyZW50KS5mb3JFYWNoKHI9Pntmb3IoO24ubGVuZ3RoPjEmJnIucG9zaXRpb24uc3RhcnQubGluZT5uWzBdLnBvc2l0aW9uLmVuZC5saW5lOyluLnNoaWZ0KCk7VTcocix0LG5bMF0pfSl9ZnVuY3Rpb24gVjcoZSl7bGV0IHQ9QXJyYXkuZnJvbShuZXcgQXJyYXkoZS5wb3NpdGlvbi5lbmQubGluZSksKCk9Pih7fSkpO2ZvcihsZXQgbiBvZiBlLmNvbW1lbnRzKXRbbi5wb3NpdGlvbi5zdGFydC5saW5lLTFdLmNvbW1lbnQ9bjtyZXR1cm4gcjIodCxlKSx0fWZ1bmN0aW9uIHIyKGUsdCl7aWYodC5wb3NpdGlvbi5zdGFydC5vZmZzZXQhPT10LnBvc2l0aW9uLmVuZC5vZmZzZXQpe2lmKCJsZWFkaW5nQ29tbWVudHMiaW4gdCl7bGV0e3N0YXJ0Om59PXQucG9zaXRpb24se2xlYWRpbmdBdHRhY2hhYmxlTm9kZTpyfT1lW24ubGluZS0xXTsoIXJ8fG4uY29sdW1uPHIucG9zaXRpb24uc3RhcnQuY29sdW1uKSYmKGVbbi5saW5lLTFdLmxlYWRpbmdBdHRhY2hhYmxlTm9kZT10KX1pZigidHJhaWxpbmdDb21tZW50ImluIHQmJnQucG9zaXRpb24uZW5kLmNvbHVtbj4xJiZ0LnR5cGUhPT0iZG9jdW1lbnQiJiZ0LnR5cGUhPT0iZG9jdW1lbnRIZWFkIil7bGV0e2VuZDpufT10LnBvc2l0aW9uLHt0cmFpbGluZ0F0dGFjaGFibGVOb2RlOnJ9PWVbbi5saW5lLTFdOyghcnx8bi5jb2x1bW4+PXIucG9zaXRpb24uZW5kLmNvbHVtbikmJihlW24ubGluZS0xXS50cmFpbGluZ0F0dGFjaGFibGVOb2RlPXQpfWlmKHQudHlwZSE9PSJyb290IiYmdC50eXBlIT09ImRvY3VtZW50IiYmdC50eXBlIT09ImRvY3VtZW50SGVhZCImJnQudHlwZSE9PSJkb2N1bWVudEJvZHkiKXtsZXR7c3RhcnQ6bixlbmQ6cn09dC5wb3NpdGlvbixzPVtyLmxpbmVdLmNvbmNhdChuLmxpbmU9PT1yLmxpbmU/W106bi5saW5lKTtmb3IobGV0IGkgb2Ygcyl7bGV0IG89ZVtpLTFdLnRyYWlsaW5nTm9kZTsoIW98fHIuY29sdW1uPj1vLnBvc2l0aW9uLmVuZC5jb2x1bW4pJiYoZVtpLTFdLnRyYWlsaW5nTm9kZT10KX19ImNoaWxkcmVuImluIHQmJnQuY2hpbGRyZW4uZm9yRWFjaChuPT57cjIoZSxuKX0pfX1mdW5jdGlvbiBVNyhlLHQsbil7bGV0IHI9ZS5wb3NpdGlvbi5zdGFydC5saW5lLHt0cmFpbGluZ0F0dGFjaGFibGVOb2RlOnN9PXRbci0xXTtpZihzKXtpZihzLnRyYWlsaW5nQ29tbWVudCl0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgbXVsdGlwbGUgdHJhaWxpbmcgY29tbWVudCBhdCAke1RhKGUucG9zaXRpb24uc3RhcnQpfWApO0t0KGUscykscy50cmFpbGluZ0NvbW1lbnQ9ZTtyZXR1cm59Zm9yKGxldCBvPXI7bz49bi5wb3NpdGlvbi5zdGFydC5saW5lO28tLSl7bGV0e3RyYWlsaW5nTm9kZTphfT10W28tMV0sdTtpZihhKXU9YTtlbHNlIGlmKG8hPT1yJiZ0W28tMV0uY29tbWVudCl1PXRbby0xXS5jb21tZW50Ll9wYXJlbnQ7ZWxzZSBjb250aW51ZTtpZigodS50eXBlPT09InNlcXVlbmNlInx8dS50eXBlPT09Im1hcHBpbmciKSYmKHU9dS5jaGlsZHJlblswXSksdS50eXBlPT09Im1hcHBpbmdJdGVtIil7bGV0W2wsZl09dS5jaGlsZHJlbjt1PXMyKGwpP2w6Zn1mb3IoOzspe2lmKHE3KHUsZSkpe0t0KGUsdSksdS5lbmRDb21tZW50cy5wdXNoKGUpO3JldHVybn1pZighdS5fcGFyZW50KWJyZWFrO3U9dS5fcGFyZW50fWJyZWFrfWZvcihsZXQgbz1yKzE7bzw9bi5wb3NpdGlvbi5lbmQubGluZTtvKyspe2xldHtsZWFkaW5nQXR0YWNoYWJsZU5vZGU6YX09dFtvLTFdO2lmKGEpe0t0KGUsYSksYS5sZWFkaW5nQ29tbWVudHMucHVzaChlKTtyZXR1cm59fWxldCBpPW4uY2hpbGRyZW5bMV07S3QoZSxpKSxpLmVuZENvbW1lbnRzLnB1c2goZSl9ZnVuY3Rpb24gcTcoZSx0KXtpZihlLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldDx0LnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCYmZS5wb3NpdGlvbi5lbmQub2Zmc2V0PnQucG9zaXRpb24uZW5kLm9mZnNldClzd2l0Y2goZS50eXBlKXtjYXNlImZsb3dNYXBwaW5nIjpjYXNlImZsb3dTZXF1ZW5jZSI6cmV0dXJuIGUuY2hpbGRyZW4ubGVuZ3RoPT09MHx8dC5wb3NpdGlvbi5zdGFydC5saW5lPmUuY2hpbGRyZW5bZS5jaGlsZHJlbi5sZW5ndGgtMV0ucG9zaXRpb24uZW5kLmxpbmV9aWYodC5wb3NpdGlvbi5lbmQub2Zmc2V0PGUucG9zaXRpb24uZW5kLm9mZnNldClyZXR1cm4hMTtzd2l0Y2goZS50eXBlKXtjYXNlInNlcXVlbmNlSXRlbSI6cmV0dXJuIHQucG9zaXRpb24uc3RhcnQuY29sdW1uPmUucG9zaXRpb24uc3RhcnQuY29sdW1uO2Nhc2UibWFwcGluZ0tleSI6Y2FzZSJtYXBwaW5nVmFsdWUiOnJldHVybiB0LnBvc2l0aW9uLnN0YXJ0LmNvbHVtbj5lLl9wYXJlbnQucG9zaXRpb24uc3RhcnQuY29sdW1uJiYoZS5jaGlsZHJlbi5sZW5ndGg9PT0wfHxlLmNoaWxkcmVuLmxlbmd0aD09PTEmJmUuY2hpbGRyZW5bMF0udHlwZSE9PSJibG9ja0ZvbGRlZCImJmUuY2hpbGRyZW5bMF0udHlwZSE9PSJibG9ja0xpdGVyYWwiKSYmKGUudHlwZT09PSJtYXBwaW5nVmFsdWUifHxzMihlKSk7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gczIoZSl7cmV0dXJuIGUucG9zaXRpb24uc3RhcnQhPT1lLnBvc2l0aW9uLmVuZCYmKGUuY2hpbGRyZW4ubGVuZ3RoPT09MHx8ZS5wb3NpdGlvbi5zdGFydC5vZmZzZXQhPT1lLmNoaWxkcmVuWzBdLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCl9ZnVuY3Rpb24gVzcoZSx0LG4pe3JldHVybnt0eXBlOiJyb290Iixwb3NpdGlvbjplLGNoaWxkcmVuOnQsY29tbWVudHM6bn19ZnVuY3Rpb24gSHMoZSx0KXtyZXR1cm57c3RhcnQ6ZSxlbmQ6dH19ZnVuY3Rpb24gSDcoZSl7cmV0dXJue3N0YXJ0OmUsZW5kOmV9fWZ1bmN0aW9uIEo3KGUsdCl7cmV0dXJue3R5cGU6ImNvbW1lbnQiLHBvc2l0aW9uOnQudHJhbnNmb3JtUmFuZ2UoW2Uub2Zmc2V0LGUub2Zmc2V0K2Uuc291cmNlLmxlbmd0aF0pLHZhbHVlOmUuc291cmNlLnNsaWNlKDEpfX1mdW5jdGlvbiB6NyhlLHQpe3JldHVybnt0eXBlOiJhbmNob3IiLHBvc2l0aW9uOmUsdmFsdWU6dH19ZnVuY3Rpb24gRzcoZSx0LG4pe3JldHVybnthbmNob3I6dCx0YWc6ZSxtaWRkbGVDb21tZW50czpufX1mdW5jdGlvbiBLNyhlLHQpe3JldHVybnt0eXBlOiJ0YWciLHBvc2l0aW9uOmUsdmFsdWU6dH19ZnVuY3Rpb24gWDcoZSx0LG4pe2xldCByPVtdLHM9bnVsbCxpPW51bGwsbz1udWxsO2ZvcihsZXQgYSBvZiB0KXtsZXQgdT1bYS5vZmZzZXQsYS5vZmZzZXQrYS5zb3VyY2UubGVuZ3RoXTtzd2l0Y2goYS50eXBlKXtjYXNlInRhZyI6e3M/PyhzPXUpO2xldCBsPWUudGFnPz9hLnNvdXJjZS5zbGljZShhLnNvdXJjZS5zdGFydHNXaXRoKCIhISIpPzI6MSk7bD09PSIhIiYmKGw9InRhZzp5YW1sLm9yZywyMDAyOnN0ciIpLGk9Szcobi50cmFuc2Zvcm1SYW5nZSh1KSxsKX1icmVhaztjYXNlImFuY2hvciI6cz8/KHM9dSksbz16NyhuLnRyYW5zZm9ybVJhbmdlKHUpLGUuYW5jaG9yKTticmVhaztjYXNlImNvbW1lbnQiOntsZXQgbD1uLnRyYW5zZm9ybUNvbW1lbnQoYSk7cyYmc1swXTw9dVswXSYmdVsxXTw9ZS5yYW5nZVswXSYmci5wdXNoKGwpO2JyZWFrfWRlZmF1bHQ6dGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIGNvbnRlbnQgcHJvcGVydHkgdG9rZW4gdHlwZTogJHthLnR5cGV9YCl9fXJldHVybiBHNyhpLG8scil9ZnVuY3Rpb24gWTcoZSx0LG4pe3JldHVybnt0eXBlOiJhbGlhcyIscG9zaXRpb246ZSxsZWFkaW5nQ29tbWVudHM6W10sdHJhaWxpbmdDb21tZW50Om51bGwsLi4udCx2YWx1ZTpufX1mdW5jdGlvbipuciguLi5lKXtmb3IobGV0IHQgb2YgZSlpZih0KWZvcihsZXQgbiBvZiB0KVE3KG4pfHwoeWllbGQgbil9ZnVuY3Rpb24gUTcoZSl7cmV0dXJuIGUudHlwZT09PSJzcGFjZSJ8fGUudHlwZT09PSJuZXdsaW5lIn1mdW5jdGlvbiBOYShlKXtyZXR1cm4gZS50eXBlPT09ImNvbW1lbnQifHxlLnR5cGU9PT0idGFnInx8ZS50eXBlPT09ImFuY2hvciJ9ZnVuY3Rpb24gWHQoZSx0KXtsZXQgbj1bXTtmb3IobGV0IHIgb2YgbnIoZSkpci50eXBlPT09ImNvbW1lbnQiP3QudHJhbnNmb3JtQ29tbWVudChyKTpuLnB1c2gocik7cmV0dXJuIG59ZnVuY3Rpb24gWjcoZSx0LG4pe2xldCByPWUuc3JjVG9rZW47Zm9yKGxldCBzIG9mIFh0KHIuZW5kLHQpKXRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB0b2tlbiB0eXBlIGluIGFsaWFzIGVuZDogJHtzLnR5cGV9YCk7cmV0dXJuIFk3KHQudHJhbnNmb3JtUmFuZ2UoZS5yYW5nZSksdC50cmFuc2Zvcm1Db250ZW50UHJvcGVydGllcyhlLG4udG9rZW5zKSxlLnNvdXJjZSl9ZnVuY3Rpb24gZTMoZSl7cmV0dXJuey4uLmUsdHlwZToiYmxvY2tGb2xkZWQifX1mdW5jdGlvbiB0MyhlLHQsbixyLHMsaSl7cmV0dXJue3R5cGU6ImJsb2NrVmFsdWUiLHBvc2l0aW9uOmUsbGVhZGluZ0NvbW1lbnRzOltdLC4uLnQsY2hvbXBpbmc6bixpbmRlbnQ6cix2YWx1ZTpzLGluZGljYXRvckNvbW1lbnQ6aX19ZnVuY3Rpb24gaTIoZSx0LG4scil7bGV0IHM9bnVsbCxpPW51bGw7Zm9yKGxldCBhIG9mIG5yKHQucHJvcHMpKWlmKGEudHlwZT09PSJjb21tZW50IilpPW4udHJhbnNmb3JtQ29tbWVudChhKTtlbHNlIGlmKGEudHlwZT09PSJibG9jay1zY2FsYXItaGVhZGVyIilzPWE7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgdG9rZW4gdHlwZSBpbiBibG9jayB2YWx1ZSBlbmQ6ICR7YS50eXBlfWApO2lmKCFzKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgYmxvY2sgc2NhbGFyIGhlYWRlciB0b2tlbiIpO2xldCBvPW4zKHMuc291cmNlKTtyZXR1cm4gdDMobi50cmFuc2Zvcm1SYW5nZShlLnJhbmdlKSxuLnRyYW5zZm9ybUNvbnRlbnRQcm9wZXJ0aWVzKGUsci50b2tlbnMpLG8uY2hvbXBpbmcsby5pbmRlbnQsZS5zb3VyY2UsaSl9ZnVuY3Rpb24gbjMoZSl7bGV0IHQ9LyhbKy1dPykoXGQqKShbKy1dPykkL3UuZXhlYyhlKSxuPW51bGwscj0iY2xpcCI7aWYodCl7bj10WzJdP051bWJlcih0WzJdKTpudWxsO2xldCBzPXRbM118fHRbMV07cj1zPT09IisiPyJrZWVwIjpzPT09Ii0iPyJzdHJpcCI6ImNsaXAifXJldHVybntjaG9tcGluZzpyLGluZGVudDpufX1mdW5jdGlvbiByMyhlLHQsbil7bGV0IHI9ZS5zcmNUb2tlbjtpZighcnx8ci50eXBlIT09ImJsb2NrLXNjYWxhciIpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBibG9jayBzY2FsYXIgc3JjVG9rZW4iKTtyZXR1cm4gZTMoaTIoZSxyLHQsbikpfWZ1bmN0aW9uIHMzKGUpe3JldHVybnsuLi5lLHR5cGU6ImJsb2NrTGl0ZXJhbCJ9fWZ1bmN0aW9uIGkzKGUsdCxuKXtsZXQgcj1lLnNyY1Rva2VuO2lmKCFyfHxyLnR5cGUhPT0iYmxvY2stc2NhbGFyIil0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGJsb2NrIHNjYWxhciBzcmNUb2tlbiIpO3JldHVybiBzMyhpMihlLHIsdCxuKSl9ZnVuY3Rpb24gbzIoZSx0LG4pe3JldHVybnt0eXBlOiJmbG93Q29sbGVjdGlvbiIscG9zaXRpb246ZSxsZWFkaW5nQ29tbWVudHM6W10sdHJhaWxpbmdDb21tZW50Om51bGwsZW5kQ29tbWVudHM6W10sLi4udCxjaGlsZHJlbjpufX1mdW5jdGlvbiBvMyhlLHQsbil7cmV0dXJuey4uLm8yKGUsdCxuKSx0eXBlOiJmbG93TWFwcGluZyJ9fWZ1bmN0aW9uIGJoKGUsdCxuKXtyZXR1cm57dHlwZToiZmxvd01hcHBpbmdJdGVtIixwb3NpdGlvbjplLGxlYWRpbmdDb21tZW50czpbXSxjaGlsZHJlbjpbdCxuXX19ZnVuY3Rpb24gYTMoZSx0KXtyZXR1cm57dHlwZToibWFwcGluZ0tleSIscG9zaXRpb246ZSx0cmFpbGluZ0NvbW1lbnQ6bnVsbCxlbmRDb21tZW50czpbXSxjaGlsZHJlbjp0P1t0XTpbXX19ZnVuY3Rpb24gYTIoZSx0KXtyZXR1cm57dHlwZToibWFwcGluZ1ZhbHVlIixwb3NpdGlvbjplLGxlYWRpbmdDb21tZW50czpbXSx0cmFpbGluZ0NvbW1lbnQ6bnVsbCxlbmRDb21tZW50czpbXSxjaGlsZHJlbjp0P1t0XTpbXX19ZnVuY3Rpb24gTGEoZSx0LG4scil7dmFyIHM7bGV0IGk9W10sbz1udWxsO2ZvcihsZXQgaCBvZiBucih0LnN0YXJ0KSl7aWYoTmEoaCkpe2kucHVzaChoKTtjb250aW51ZX1pZihoLnR5cGU9PT0iZXhwbGljaXQta2V5LWluZCIpe289aDtjb250aW51ZX1pZihoLnR5cGUhPT0iY29tbWEiKXRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB0b2tlbiB0eXBlIGluIGNvbGxlY3Rpb24gaXRlbSBzdGFydDogJHtoLnR5cGV9YCl9bGV0IGE9W10sdT1udWxsO2ZvcihsZXQgaCBvZiBucih0LnNlcCkpe2lmKE5hKGgpKXthLnB1c2goaCk7Y29udGludWV9aWYoaC50eXBlPT09Im1hcC12YWx1ZS1pbmQiKXt1PWg7Y29udGludWV9dGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHRva2VuIHR5cGUgaW4gY29sbGVjdGlvbiBpdGVtIHNlcDogJHtoLnR5cGV9YCl9bGV0IGw9KG89PW51bGw/dm9pZCAwOm8ub2Zmc2V0KT8/KChzPXQua2V5KT09PW51bGx8fHM9PT12b2lkIDA/dm9pZCAwOnMub2Zmc2V0KT8/KHU9PW51bGw/dm9pZCAwOnUub2Zmc2V0KT8/dC52YWx1ZS5vZmZzZXQsZj1bbCx0LmtleT9lLmtleS5yYW5nZVsxXTpvP28ub2Zmc2V0K28uc291cmNlLmxlbmd0aDpsXSxjPW51bGw7aWYoZS52YWx1ZSl7dmFyIHA7bGV0IGg9KHU9PW51bGw/dm9pZCAwOnUub2Zmc2V0KT8/KChwPXQudmFsdWUpPT09bnVsbHx8cD09PXZvaWQgMD92b2lkIDA6cC5vZmZzZXQpPz9lLnZhbHVlLnJhbmdlWzBdO2M9W2gsdC52YWx1ZT9lLnZhbHVlLnJhbmdlWzFdOnU/dS5vZmZzZXQrdS5zb3VyY2UubGVuZ3RoOmhdfXJldHVybiB1MyhlLG4scix7cmFuZ2U6Zixwcm9wczp7dG9rZW5zOml9fSx7cmFuZ2U6Yyxwcm9wczp7dG9rZW5zOmF9fSl9ZnVuY3Rpb24gdTMoZSx0LG4scixzKXtsZXQgaT1udWxsO3poKGUua2V5LHIucHJvcHMpP1h0KHIucHJvcHMudG9rZW5zLHQpOmk9dC50cmFuc2Zvcm1Ob2RlKGUua2V5LHIucHJvcHMpO2xldCBvPW51bGw7emgoZS52YWx1ZSxzLnByb3BzKT9YdChzLnByb3BzLnRva2Vucyx0KTpvPXQudHJhbnNmb3JtTm9kZShlLnZhbHVlLHMucHJvcHMpO2xldCBhPWEzKHQudHJhbnNmb3JtUmFuZ2UoW3IucmFuZ2U/ci5yYW5nZVswXTppLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCxpP2kucG9zaXRpb24uZW5kLm9mZnNldDpyLnJhbmdlWzFdXSksaSksdT1vfHxzLnJhbmdlP2EyKHQudHJhbnNmb3JtUmFuZ2UoW3MucmFuZ2U/cy5yYW5nZVswXTpvLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldCxvP28ucG9zaXRpb24uZW5kLm9mZnNldDpzLnJhbmdlWzBdKzFdKSxvKTpudWxsO3JldHVybiBuKEhzKGEucG9zaXRpb24uc3RhcnQsdT91LnBvc2l0aW9uLmVuZDphLnBvc2l0aW9uLmVuZCksYSx1fHxhMihINyhhLnBvc2l0aW9uLmVuZCksbnVsbCkpfWZ1bmN0aW9uIGwzKGUsdCxuKXtsZXQgcj1lLnNyY1Rva2VuO2lmKCFyfHxyLnR5cGUhPT0iZmxvdy1jb2xsZWN0aW9uIil0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGZsb3ctY29sbGVjdGlvbiBDU1Qgbm9kZSBmb3IgZmxvdyBtYXAiKTtsZXQgcz1lLml0ZW1zLm1hcCgobyxhKT0+e2xldCB1PXIuaXRlbXNbYV07cmV0dXJuIExhKG8sdSx0LGJoKX0pO2lmKGUuaXRlbXMubGVuZ3RoPHIuaXRlbXMubGVuZ3RoKWZvcihsZXQgbz1lLml0ZW1zLmxlbmd0aDtvPHIuaXRlbXMubGVuZ3RoO28rKyl7bGV0IGE9ci5pdGVtc1tvXTtmb3IobGV0IHUgb2YgWHQoYS5zdGFydCx0KSlpZih1LnR5cGUhPT0iY29tbWEiKXRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB0b2tlbiB0eXBlIGluIGNvbGxlY3Rpb24gaXRlbSBzdGFydDogJHt1LnR5cGV9YCl9bGV0IGk9bnVsbDtmb3IobGV0IG8gb2YgWHQoci5lbmQsdCkpe2lmKG8udHlwZT09PSJmbG93LW1hcC1lbmQiKXtpPW87Y29udGludWV9dGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHRva2VuIHR5cGUgaW4gZmxvdyBtYXAgZW5kOiAke28udHlwZX1gKX1pZighaSl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGZsb3ctbWFwLWVuZCB0b2tlbiIpO3JldHVybiBvMyh0LnRyYW5zZm9ybVJhbmdlKFtyLnN0YXJ0Lm9mZnNldCxpLm9mZnNldCtpLnNvdXJjZS5sZW5ndGhdKSx0LnRyYW5zZm9ybUNvbnRlbnRQcm9wZXJ0aWVzKGUsbi50b2tlbnMpLHMpfWZ1bmN0aW9uIGMzKGUsdCxuKXtyZXR1cm57Li4ubzIoZSx0LG4pLHR5cGU6ImZsb3dTZXF1ZW5jZSJ9fWZ1bmN0aW9uIGYzKGUsdCl7cmV0dXJue3R5cGU6ImZsb3dTZXF1ZW5jZUl0ZW0iLHBvc2l0aW9uOmUsY2hpbGRyZW46W3RdfX1mdW5jdGlvbiBpbyhlKXtyZXR1cm4gZVtlLmxlbmd0aC0xXX12YXIgdTI9e307U2wodTIse0FsaWFzOigpPT4kbCxDU1Q6KCk9PnJiLENvbXBvc2VyOigpPT5abCxEb2N1bWVudDooKT0+WWwsTGV4ZXI6KCk9PmxiLExpbmVDb3VudGVyOigpPT5KaCxQYWlyOigpPT5WdCxQYXJzZXI6KCk9PnVjLFNjYWxhcjooKT0+cmUsU2NoZW1hOigpPT56MixZQU1MRXJyb3I6KCk9Pk1oLFlBTUxNYXA6KCk9Pll0LFlBTUxQYXJzZUVycm9yOigpPT5ZcyxZQU1MU2VxOigpPT5wcyxZQU1MV2FybmluZzooKT0+RzIsaXNBbGlhczooKT0+Y3MsaXNDb2xsZWN0aW9uOigpPT5WZSxpc0RvY3VtZW50OigpPT5Kcyxpc01hcDooKT0+ZnMsaXNOb2RlOigpPT5VZSxpc1BhaXI6KCk9PlRlLGlzU2NhbGFyOigpPT5FZSxpc1NlcTooKT0+enMscGFyc2U6KCk9Pnk2LHBhcnNlQWxsRG9jdW1lbnRzOigpPT5nNixwYXJzZURvY3VtZW50OigpPT5kYixzdHJpbmdpZnk6KCk9PkQ2LHZpc2l0OigpPT5Hcyx2aXNpdEFzeW5jOigpPT5MbH0pO3ZhciBFaD1TeW1ib2wuZm9yKCJ5YW1sLmFsaWFzIiksdmg9U3ltYm9sLmZvcigieWFtbC5kb2N1bWVudCIpLGxzPVN5bWJvbC5mb3IoInlhbWwubWFwIiksbDI9U3ltYm9sLmZvcigieWFtbC5wYWlyIikscnI9U3ltYm9sLmZvcigieWFtbC5zY2FsYXIiKSxvbz1TeW1ib2wuZm9yKCJ5YW1sLnNlcSIpLGJuPVN5bWJvbC5mb3IoInlhbWwubm9kZS50eXBlIiksY3M9ZT0+ISFlJiZ0eXBlb2YgZT09Im9iamVjdCImJmVbYm5dPT09RWgsSnM9ZT0+ISFlJiZ0eXBlb2YgZT09Im9iamVjdCImJmVbYm5dPT09dmgsZnM9ZT0+ISFlJiZ0eXBlb2YgZT09Im9iamVjdCImJmVbYm5dPT09bHMsVGU9ZT0+ISFlJiZ0eXBlb2YgZT09Im9iamVjdCImJmVbYm5dPT09bDIsRWU9ZT0+ISFlJiZ0eXBlb2YgZT09Im9iamVjdCImJmVbYm5dPT09cnIsenM9ZT0+ISFlJiZ0eXBlb2YgZT09Im9iamVjdCImJmVbYm5dPT09b287ZnVuY3Rpb24gVmUoZSl7aWYoZSYmdHlwZW9mIGU9PSJvYmplY3QiKXN3aXRjaChlW2JuXSl7Y2FzZSBsczpjYXNlIG9vOnJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFVlKGUpe2lmKGUmJnR5cGVvZiBlPT0ib2JqZWN0Iilzd2l0Y2goZVtibl0pe2Nhc2UgRWg6Y2FzZSBsczpjYXNlIHJyOmNhc2Ugb286cmV0dXJuITB9cmV0dXJuITF9dmFyIGMyPWU9PihFZShlKXx8VmUoZSkpJiYhIWUuYW5jaG9yLGp0PVN5bWJvbCgiYnJlYWsgdmlzaXQiKSxmMj1TeW1ib2woInNraXAgY2hpbGRyZW4iKSxzcj1TeW1ib2woInJlbW92ZSBub2RlIik7ZnVuY3Rpb24gR3MoZSx0KXtsZXQgbj1wMih0KTtKcyhlKT9hbyhudWxsLGUuY29udGVudHMsbixPYmplY3QuZnJlZXplKFtlXSkpPT09c3ImJihlLmNvbnRlbnRzPW51bGwpOmFvKG51bGwsZSxuLE9iamVjdC5mcmVlemUoW10pKX1Hcy5CUkVBSz1qdCxHcy5TS0lQPWYyLEdzLlJFTU9WRT1zcjtmdW5jdGlvbiBhbyhlLHQsbixyKXtsZXQgcz1oMihlLHQsbixyKTtpZihVZShzKXx8VGUocykpcmV0dXJuIGQyKGUscixzKSxhbyhlLHMsbixyKTtpZih0eXBlb2YgcyE9InN5bWJvbCIpe2lmKFZlKHQpKXtyPU9iamVjdC5mcmVlemUoci5jb25jYXQodCkpO2ZvcihsZXQgaT0wO2k8dC5pdGVtcy5sZW5ndGg7KytpKXtsZXQgbz1hbyhpLHQuaXRlbXNbaV0sbixyKTtpZih0eXBlb2Ygbz09Im51bWJlciIpaT1vLTE7ZWxzZXtpZihvPT09anQpcmV0dXJuIGp0O289PT1zciYmKHQuaXRlbXMuc3BsaWNlKGksMSksaS09MSl9fX1lbHNlIGlmKFRlKHQpKXtyPU9iamVjdC5mcmVlemUoci5jb25jYXQodCkpO2xldCBpPWFvKCJrZXkiLHQua2V5LG4scik7aWYoaT09PWp0KXJldHVybiBqdDtpPT09c3ImJih0LmtleT1udWxsKTtsZXQgbz1hbygidmFsdWUiLHQudmFsdWUsbixyKTtpZihvPT09anQpcmV0dXJuIGp0O289PT1zciYmKHQudmFsdWU9bnVsbCl9fXJldHVybiBzfWFzeW5jIGZ1bmN0aW9uIExsKGUsdCl7bGV0IG49cDIodCk7SnMoZSk/YXdhaXQgdW8obnVsbCxlLmNvbnRlbnRzLG4sT2JqZWN0LmZyZWV6ZShbZV0pKT09PXNyJiYoZS5jb250ZW50cz1udWxsKTphd2FpdCB1byhudWxsLGUsbixPYmplY3QuZnJlZXplKFtdKSl9TGwuQlJFQUs9anQsTGwuU0tJUD1mMixMbC5SRU1PVkU9c3I7YXN5bmMgZnVuY3Rpb24gdW8oZSx0LG4scil7bGV0IHM9YXdhaXQgaDIoZSx0LG4scik7aWYoVWUocyl8fFRlKHMpKXJldHVybiBkMihlLHIscyksdW8oZSxzLG4scik7aWYodHlwZW9mIHMhPSJzeW1ib2wiKXtpZihWZSh0KSl7cj1PYmplY3QuZnJlZXplKHIuY29uY2F0KHQpKTtmb3IobGV0IGk9MDtpPHQuaXRlbXMubGVuZ3RoOysraSl7bGV0IG89YXdhaXQgdW8oaSx0Lml0ZW1zW2ldLG4scik7aWYodHlwZW9mIG89PSJudW1iZXIiKWk9by0xO2Vsc2V7aWYobz09PWp0KXJldHVybiBqdDtvPT09c3ImJih0Lml0ZW1zLnNwbGljZShpLDEpLGktPTEpfX19ZWxzZSBpZihUZSh0KSl7cj1PYmplY3QuZnJlZXplKHIuY29uY2F0KHQpKTtsZXQgaT1hd2FpdCB1bygia2V5Iix0LmtleSxuLHIpO2lmKGk9PT1qdClyZXR1cm4ganQ7aT09PXNyJiYodC5rZXk9bnVsbCk7bGV0IG89YXdhaXQgdW8oInZhbHVlIix0LnZhbHVlLG4scik7aWYobz09PWp0KXJldHVybiBqdDtvPT09c3ImJih0LnZhbHVlPW51bGwpfX1yZXR1cm4gc31mdW5jdGlvbiBwMihlKXtyZXR1cm4gdHlwZW9mIGU9PSJvYmplY3QiJiYoZS5Db2xsZWN0aW9ufHxlLk5vZGV8fGUuVmFsdWUpP09iamVjdC5hc3NpZ24oe0FsaWFzOmUuTm9kZSxNYXA6ZS5Ob2RlLFNjYWxhcjplLk5vZGUsU2VxOmUuTm9kZX0sZS5WYWx1ZSYme01hcDplLlZhbHVlLFNjYWxhcjplLlZhbHVlLFNlcTplLlZhbHVlfSxlLkNvbGxlY3Rpb24mJntNYXA6ZS5Db2xsZWN0aW9uLFNlcTplLkNvbGxlY3Rpb259LGUpOmV9ZnVuY3Rpb24gaDIoZSx0LG4scil7dmFyIHMsaSxvLGEsdTtpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIilyZXR1cm4gbihlLHQscik7aWYoZnModCkpcmV0dXJuKHM9bi5NYXApPT1udWxsP3ZvaWQgMDpzLmNhbGwobixlLHQscik7aWYoenModCkpcmV0dXJuKGk9bi5TZXEpPT1udWxsP3ZvaWQgMDppLmNhbGwobixlLHQscik7aWYoVGUodCkpcmV0dXJuKG89bi5QYWlyKT09bnVsbD92b2lkIDA6by5jYWxsKG4sZSx0LHIpO2lmKEVlKHQpKXJldHVybihhPW4uU2NhbGFyKT09bnVsbD92b2lkIDA6YS5jYWxsKG4sZSx0LHIpO2lmKGNzKHQpKXJldHVybih1PW4uQWxpYXMpPT1udWxsP3ZvaWQgMDp1LmNhbGwobixlLHQscil9ZnVuY3Rpb24gZDIoZSx0LG4pe2xldCByPXRbdC5sZW5ndGgtMV07aWYoVmUocikpci5pdGVtc1tlXT1uO2Vsc2UgaWYoVGUocikpZT09PSJrZXkiP3Iua2V5PW46ci52YWx1ZT1uO2Vsc2UgaWYoSnMocikpci5jb250ZW50cz1uO2Vsc2V7bGV0IHM9Y3Mocik/ImFsaWFzIjoic2NhbGFyIjt0aHJvdyBuZXcgRXJyb3IoYENhbm5vdCByZXBsYWNlIG5vZGUgd2l0aCAke3N9IHBhcmVudGApfX12YXIgcDM9eyIhIjoiJTIxIiwiLCI6IiUyQyIsIlsiOiIlNUIiLCJdIjoiJTVEIiwieyI6IiU3QiIsIn0iOiIlN0QifSxoMz1lPT5lLnJlcGxhY2UoL1shLFtcXXt9XS9nLHQ9PnAzW3RdKSxsbz1jbGFzcyBRcntjb25zdHJ1Y3Rvcih0LG4pe3RoaXMuZG9jU3RhcnQ9bnVsbCx0aGlzLmRvY0VuZD0hMSx0aGlzLnlhbWw9T2JqZWN0LmFzc2lnbih7fSxRci5kZWZhdWx0WWFtbCx0KSx0aGlzLnRhZ3M9T2JqZWN0LmFzc2lnbih7fSxRci5kZWZhdWx0VGFncyxuKX1jbG9uZSgpe2xldCB0PW5ldyBRcih0aGlzLnlhbWwsdGhpcy50YWdzKTtyZXR1cm4gdC5kb2NTdGFydD10aGlzLmRvY1N0YXJ0LHR9YXREb2N1bWVudCgpe2xldCB0PW5ldyBRcih0aGlzLnlhbWwsdGhpcy50YWdzKTtzd2l0Y2godGhpcy55YW1sLnZlcnNpb24pe2Nhc2UiMS4xIjp0aGlzLmF0TmV4dERvY3VtZW50PSEwO2JyZWFrO2Nhc2UiMS4yIjp0aGlzLmF0TmV4dERvY3VtZW50PSExLHRoaXMueWFtbD17ZXhwbGljaXQ6UXIuZGVmYXVsdFlhbWwuZXhwbGljaXQsdmVyc2lvbjoiMS4yIn0sdGhpcy50YWdzPU9iamVjdC5hc3NpZ24oe30sUXIuZGVmYXVsdFRhZ3MpO2JyZWFrfXJldHVybiB0fWFkZCh0LG4pe3RoaXMuYXROZXh0RG9jdW1lbnQmJih0aGlzLnlhbWw9e2V4cGxpY2l0OlFyLmRlZmF1bHRZYW1sLmV4cGxpY2l0LHZlcnNpb246IjEuMSJ9LHRoaXMudGFncz1PYmplY3QuYXNzaWduKHt9LFFyLmRlZmF1bHRUYWdzKSx0aGlzLmF0TmV4dERvY3VtZW50PSExKTtsZXQgcj10LnRyaW0oKS5zcGxpdCgvWyBcdF0rLykscz1yLnNoaWZ0KCk7c3dpdGNoKHMpe2Nhc2UiJVRBRyI6e2lmKHIubGVuZ3RoIT09MiYmKG4oMCwiJVRBRyBkaXJlY3RpdmUgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSB0d28gcGFydHMiKSxyLmxlbmd0aDwyKSlyZXR1cm4hMTtsZXRbaSxvXT1yO3JldHVybiB0aGlzLnRhZ3NbaV09bywhMH1jYXNlIiVZQU1MIjp7aWYodGhpcy55YW1sLmV4cGxpY2l0PSEwLHIubGVuZ3RoIT09MSlyZXR1cm4gbigwLCIlWUFNTCBkaXJlY3RpdmUgc2hvdWxkIGNvbnRhaW4gZXhhY3RseSBvbmUgcGFydCIpLCExO2xldFtpXT1yO2lmKGk9PT0iMS4xInx8aT09PSIxLjIiKXJldHVybiB0aGlzLnlhbWwudmVyc2lvbj1pLCEwO3tsZXQgbz0vXlxkK1wuXGQrJC8udGVzdChpKTtyZXR1cm4gbig2LGBVbnN1cHBvcnRlZCBZQU1MIHZlcnNpb24gJHtpfWAsbyksITF9fWRlZmF1bHQ6cmV0dXJuIG4oMCxgVW5rbm93biBkaXJlY3RpdmUgJHtzfWAsITApLCExfX10YWdOYW1lKHQsbil7aWYodD09PSIhIilyZXR1cm4iISI7aWYodFswXSE9PSIhIilyZXR1cm4gbihgTm90IGEgdmFsaWQgdGFnOiAke3R9YCksbnVsbDtpZih0WzFdPT09IjwiKXtsZXQgbz10LnNsaWNlKDIsLTEpO3JldHVybiBvPT09IiEifHxvPT09IiEhIj8obihgVmVyYmF0aW0gdGFncyBhcmVuJ3QgcmVzb2x2ZWQsIHNvICR7dH0gaXMgaW52YWxpZC5gKSxudWxsKToodFt0Lmxlbmd0aC0xXSE9PSI+IiYmbigiVmVyYmF0aW0gdGFncyBtdXN0IGVuZCB3aXRoIGEgPiIpLG8pfWxldFsscixzXT10Lm1hdGNoKC9eKC4qISkoW14hXSopJC9zKTtzfHxuKGBUaGUgJHt0fSB0YWcgaGFzIG5vIHN1ZmZpeGApO2xldCBpPXRoaXMudGFnc1tyXTtpZihpKXRyeXtyZXR1cm4gaStkZWNvZGVVUklDb21wb25lbnQocyl9Y2F0Y2gobyl7cmV0dXJuIG4oU3RyaW5nKG8pKSxudWxsfXJldHVybiByPT09IiEiP3Q6KG4oYENvdWxkIG5vdCByZXNvbHZlIHRhZzogJHt0fWApLG51bGwpfXRhZ1N0cmluZyh0KXtmb3IobGV0W24scl1vZiBPYmplY3QuZW50cmllcyh0aGlzLnRhZ3MpKWlmKHQuc3RhcnRzV2l0aChyKSlyZXR1cm4gbitoMyh0LnN1YnN0cmluZyhyLmxlbmd0aCkpO3JldHVybiB0WzBdPT09IiEiP3Q6YCE8JHt0fT5gfXRvU3RyaW5nKHQpe2xldCBuPXRoaXMueWFtbC5leHBsaWNpdD9bYCVZQU1MICR7dGhpcy55YW1sLnZlcnNpb258fCIxLjIifWBdOltdLHI9T2JqZWN0LmVudHJpZXModGhpcy50YWdzKSxzO2lmKHQmJnIubGVuZ3RoPjAmJlVlKHQuY29udGVudHMpKXtsZXQgaT17fTtHcyh0LmNvbnRlbnRzLChvLGEpPT57VWUoYSkmJmEudGFnJiYoaVthLnRhZ109ITApfSkscz1PYmplY3Qua2V5cyhpKX1lbHNlIHM9W107Zm9yKGxldFtpLG9db2YgcilpPT09IiEhIiYmbz09PSJ0YWc6eWFtbC5vcmcsMjAwMjoifHwoIXR8fHMuc29tZShhPT5hLnN0YXJ0c1dpdGgobykpKSYmbi5wdXNoKGAlVEFHICR7aX0gJHtvfWApO3JldHVybiBuLmpvaW4oYApgKX19O2xvLmRlZmF1bHRZYW1sPXtleHBsaWNpdDohMSx2ZXJzaW9uOiIxLjIifSxsby5kZWZhdWx0VGFncz17IiEhIjoidGFnOnlhbWwub3JnLDIwMDI6In07ZnVuY3Rpb24gbTIoZSl7aWYoL1tceDAwLVx4MTlccyxbXF17fV0vLnRlc3QoZSkpe2xldCB0PWBBbmNob3IgbXVzdCBub3QgY29udGFpbiB3aGl0ZXNwYWNlIG9yIGNvbnRyb2wgY2hhcmFjdGVyczogJHtKU09OLnN0cmluZ2lmeShlKX1gO3Rocm93IG5ldyBFcnJvcih0KX1yZXR1cm4hMH1mdW5jdGlvbiBnMihlKXtsZXQgdD1uZXcgU2V0O3JldHVybiBHcyhlLHtWYWx1ZShuLHIpe3IuYW5jaG9yJiZ0LmFkZChyLmFuY2hvcil9fSksdH1mdW5jdGlvbiB5MihlLHQpe2ZvcihsZXQgbj0xOzsrK24pe2xldCByPWAke2V9JHtufWA7aWYoIXQuaGFzKHIpKXJldHVybiByfX1mdW5jdGlvbiBkMyhlLHQpe2xldCBuPVtdLHI9bmV3IE1hcCxzPW51bGw7cmV0dXJue29uQW5jaG9yOmk9PntuLnB1c2goaSkscz8/KHM9ZzIoZSkpO2xldCBvPXkyKHQscyk7cmV0dXJuIHMuYWRkKG8pLG99LHNldEFuY2hvcnM6KCk9Pntmb3IobGV0IGkgb2Ygbil7bGV0IG89ci5nZXQoaSk7aWYodHlwZW9mIG89PSJvYmplY3QiJiZvLmFuY2hvciYmKEVlKG8ubm9kZSl8fFZlKG8ubm9kZSkpKW8ubm9kZS5hbmNob3I9by5hbmNob3I7ZWxzZXtsZXQgYT1uZXcgRXJyb3IoIkZhaWxlZCB0byByZXNvbHZlIHJlcGVhdGVkIG9iamVjdCAodGhpcyBzaG91bGQgbm90IGhhcHBlbikiKTt0aHJvdyBhLnNvdXJjZT1pLGF9fX0sc291cmNlT2JqZWN0czpyfX1mdW5jdGlvbiBjbyhlLHQsbixyKXtpZihyJiZ0eXBlb2Ygcj09Im9iamVjdCIpaWYoQXJyYXkuaXNBcnJheShyKSlmb3IobGV0IHM9MCxpPXIubGVuZ3RoO3M8aTsrK3Mpe2xldCBvPXJbc10sYT1jbyhlLHIsU3RyaW5nKHMpLG8pO2E9PT12b2lkIDA/ZGVsZXRlIHJbc106YSE9PW8mJihyW3NdPWEpfWVsc2UgaWYociBpbnN0YW5jZW9mIE1hcClmb3IobGV0IHMgb2YgQXJyYXkuZnJvbShyLmtleXMoKSkpe2xldCBpPXIuZ2V0KHMpLG89Y28oZSxyLHMsaSk7bz09PXZvaWQgMD9yLmRlbGV0ZShzKTpvIT09aSYmci5zZXQocyxvKX1lbHNlIGlmKHIgaW5zdGFuY2VvZiBTZXQpZm9yKGxldCBzIG9mIEFycmF5LmZyb20ocikpe2xldCBpPWNvKGUscixzLHMpO2k9PT12b2lkIDA/ci5kZWxldGUocyk6aSE9PXMmJihyLmRlbGV0ZShzKSxyLmFkZChpKSl9ZWxzZSBmb3IobGV0W3MsaV1vZiBPYmplY3QuZW50cmllcyhyKSl7bGV0IG89Y28oZSxyLHMsaSk7bz09PXZvaWQgMD9kZWxldGUgcltzXTpvIT09aSYmKHJbc109byl9cmV0dXJuIGUuY2FsbCh0LG4scil9ZnVuY3Rpb24gRW4oZSx0LG4pe2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGUubWFwKChyLHMpPT5FbihyLFN0cmluZyhzKSxuKSk7aWYoZSYmdHlwZW9mIGUudG9KU09OPT0iZnVuY3Rpb24iKXtpZighbnx8IWMyKGUpKXJldHVybiBlLnRvSlNPTih0LG4pO2xldCByPXthbGlhc0NvdW50OjAsY291bnQ6MSxyZXM6dm9pZCAwfTtuLmFuY2hvcnMuc2V0KGUsciksbi5vbkNyZWF0ZT1pPT57ci5yZXM9aSxkZWxldGUgbi5vbkNyZWF0ZX07bGV0IHM9ZS50b0pTT04odCxuKTtyZXR1cm4gbi5vbkNyZWF0ZSYmbi5vbkNyZWF0ZShzKSxzfXJldHVybiB0eXBlb2YgZT09ImJpZ2ludCImJiEobiE9bnVsbCYmbi5rZWVwKT9OdW1iZXIoZSk6ZX12YXIgRmg9Y2xhc3N7Y29uc3RydWN0b3IodCl7T2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsYm4se3ZhbHVlOnR9KX1jbG9uZSgpe2xldCB0PU9iamVjdC5jcmVhdGUoT2JqZWN0LmdldFByb3RvdHlwZU9mKHRoaXMpLE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3JzKHRoaXMpKTtyZXR1cm4gdGhpcy5yYW5nZSYmKHQucmFuZ2U9dGhpcy5yYW5nZS5zbGljZSgpKSx0fXRvSlModCx7bWFwQXNNYXA6bixtYXhBbGlhc0NvdW50OnIsb25BbmNob3I6cyxyZXZpdmVyOml9PXt9KXtpZighSnModCkpdGhyb3cgbmV3IFR5cGVFcnJvcigiQSBkb2N1bWVudCBhcmd1bWVudCBpcyByZXF1aXJlZCIpO2xldCBvPXthbmNob3JzOm5ldyBNYXAsZG9jOnQsa2VlcDohMCxtYXBBc01hcDpuPT09ITAsbWFwS2V5V2FybmVkOiExLG1heEFsaWFzQ291bnQ6dHlwZW9mIHI9PSJudW1iZXIiP3I6MTAwfSxhPUVuKHRoaXMsIiIsbyk7aWYodHlwZW9mIHM9PSJmdW5jdGlvbiIpZm9yKGxldHtjb3VudDp1LHJlczpsfW9mIG8uYW5jaG9ycy52YWx1ZXMoKSlzKGwsdSk7cmV0dXJuIHR5cGVvZiBpPT0iZnVuY3Rpb24iP2NvKGkseyIiOmF9LCIiLGEpOmF9fSwkbD1jbGFzcyBleHRlbmRzIEZoe2NvbnN0cnVjdG9yKHQpe3N1cGVyKEVoKSx0aGlzLnNvdXJjZT10LE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0aGlzLCJ0YWciLHtzZXQoKXt0aHJvdyBuZXcgRXJyb3IoIkFsaWFzIG5vZGVzIGNhbm5vdCBoYXZlIHRhZ3MiKX19KX1yZXNvbHZlKHQsbil7aWYoKG49PW51bGw/dm9pZCAwOm4ubWF4QWxpYXNDb3VudCk9PT0wKXRocm93IG5ldyBSZWZlcmVuY2VFcnJvcigiQWxpYXMgcmVzb2x1dGlvbiBpcyBkaXNhYmxlZCIpO2xldCByO24hPW51bGwmJm4uYWxpYXNSZXNvbHZlQ2FjaGU/cj1uLmFsaWFzUmVzb2x2ZUNhY2hlOihyPVtdLEdzKHQse05vZGU6KGksbyk9PnsoY3Mobyl8fGMyKG8pKSYmci5wdXNoKG8pfX0pLG4mJihuLmFsaWFzUmVzb2x2ZUNhY2hlPXIpKTtsZXQgcztmb3IobGV0IGkgb2Ygcil7aWYoaT09PXRoaXMpYnJlYWs7aS5hbmNob3I9PT10aGlzLnNvdXJjZSYmKHM9aSl9cmV0dXJuIHN9dG9KU09OKHQsbil7aWYoIW4pcmV0dXJue3NvdXJjZTp0aGlzLnNvdXJjZX07bGV0e2FuY2hvcnM6cixkb2M6cyxtYXhBbGlhc0NvdW50Oml9PW4sbz10aGlzLnJlc29sdmUocyxuKTtpZighbyl7bGV0IHU9YFVucmVzb2x2ZWQgYWxpYXMgKHRoZSBhbmNob3IgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBhbGlhcyk6ICR7dGhpcy5zb3VyY2V9YDt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IodSl9bGV0IGE9ci5nZXQobyk7aWYoYXx8KEVuKG8sbnVsbCxuKSxhPXIuZ2V0KG8pKSwoYT09bnVsbD92b2lkIDA6YS5yZXMpPT09dm9pZCAwKXtsZXQgdT0iVGhpcyBzaG91bGQgbm90IGhhcHBlbjogQWxpYXMgYW5jaG9yIHdhcyBub3QgcmVzb2x2ZWQ/Ijt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IodSl9aWYoaT49MCYmKGEuY291bnQrPTEsYS5hbGlhc0NvdW50PT09MCYmKGEuYWxpYXNDb3VudD1CbChzLG8scikpLGEuY291bnQqYS5hbGlhc0NvdW50PmkpKXtsZXQgdT0iRXhjZXNzaXZlIGFsaWFzIGNvdW50IGluZGljYXRlcyBhIHJlc291cmNlIGV4aGF1c3Rpb24gYXR0YWNrIjt0aHJvdyBuZXcgUmVmZXJlbmNlRXJyb3IodSl9cmV0dXJuIGEucmVzfXRvU3RyaW5nKHQsbixyKXtsZXQgcz1gKiR7dGhpcy5zb3VyY2V9YDtpZih0KXtpZihtMih0aGlzLnNvdXJjZSksdC5vcHRpb25zLnZlcmlmeUFsaWFzT3JkZXImJiF0LmFuY2hvcnMuaGFzKHRoaXMuc291cmNlKSl7bGV0IGk9YFVucmVzb2x2ZWQgYWxpYXMgKHRoZSBhbmNob3IgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBhbGlhcyk6ICR7dGhpcy5zb3VyY2V9YDt0aHJvdyBuZXcgRXJyb3IoaSl9aWYodC5pbXBsaWNpdEtleSlyZXR1cm5gJHtzfSBgfXJldHVybiBzfX07ZnVuY3Rpb24gQmwoZSx0LG4pe2lmKGNzKHQpKXtsZXQgcj10LnJlc29sdmUoZSkscz1uJiZyJiZuLmdldChyKTtyZXR1cm4gcz9zLmNvdW50KnMuYWxpYXNDb3VudDowfWVsc2UgaWYoVmUodCkpe2xldCByPTA7Zm9yKGxldCBzIG9mIHQuaXRlbXMpe2xldCBpPUJsKGUscyxuKTtpPnImJihyPWkpfXJldHVybiByfWVsc2UgaWYoVGUodCkpe2xldCByPUJsKGUsdC5rZXksbikscz1CbChlLHQudmFsdWUsbik7cmV0dXJuIE1hdGgubWF4KHIscyl9cmV0dXJuIDF9dmFyIEQyPWU9PiFlfHx0eXBlb2YgZSE9ImZ1bmN0aW9uIiYmdHlwZW9mIGUhPSJvYmplY3QiLHJlPWNsYXNzIGV4dGVuZHMgRmh7Y29uc3RydWN0b3IodCl7c3VwZXIocnIpLHRoaXMudmFsdWU9dH10b0pTT04odCxuKXtyZXR1cm4gbiE9bnVsbCYmbi5rZWVwP3RoaXMudmFsdWU6RW4odGhpcy52YWx1ZSx0LG4pfXRvU3RyaW5nKCl7cmV0dXJuIFN0cmluZyh0aGlzLnZhbHVlKX19O3JlLkJMT0NLX0ZPTERFRD0iQkxPQ0tfRk9MREVEIixyZS5CTE9DS19MSVRFUkFMPSJCTE9DS19MSVRFUkFMIixyZS5QTEFJTj0iUExBSU4iLHJlLlFVT1RFX0RPVUJMRT0iUVVPVEVfRE9VQkxFIixyZS5RVU9URV9TSU5HTEU9IlFVT1RFX1NJTkdMRSI7dmFyIG0zPSJ0YWc6eWFtbC5vcmcsMjAwMjoiO2Z1bmN0aW9uIGczKGUsdCxuKXtpZih0KXtsZXQgcj1uLmZpbHRlcihpPT5pLnRhZz09PXQpLHM9ci5maW5kKGk9PiFpLmZvcm1hdCk/P3JbMF07aWYoIXMpdGhyb3cgbmV3IEVycm9yKGBUYWcgJHt0fSBub3QgZm91bmRgKTtyZXR1cm4gc31yZXR1cm4gbi5maW5kKHI9Pnt2YXIgcztyZXR1cm4oKHM9ci5pZGVudGlmeSk9PW51bGw/dm9pZCAwOnMuY2FsbChyLGUpKSYmIXIuZm9ybWF0fSl9ZnVuY3Rpb24gJGEoZSx0LG4pe3ZhciBjLHAsaDtpZihKcyhlKSYmKGU9ZS5jb250ZW50cyksVWUoZSkpcmV0dXJuIGU7aWYoVGUoZSkpe2xldCBkPShwPShjPW4uc2NoZW1hW2xzXSkuY3JlYXRlTm9kZSk9PW51bGw/dm9pZCAwOnAuY2FsbChjLG4uc2NoZW1hLG51bGwsbik7cmV0dXJuIGQuaXRlbXMucHVzaChlKSxkfShlIGluc3RhbmNlb2YgU3RyaW5nfHxlIGluc3RhbmNlb2YgTnVtYmVyfHxlIGluc3RhbmNlb2YgQm9vbGVhbnx8dHlwZW9mIEJpZ0ludDwidSImJmUgaW5zdGFuY2VvZiBCaWdJbnQpJiYoZT1lLnZhbHVlT2YoKSk7bGV0e2FsaWFzRHVwbGljYXRlT2JqZWN0czpyLG9uQW5jaG9yOnMsb25UYWdPYmo6aSxzY2hlbWE6byxzb3VyY2VPYmplY3RzOmF9PW4sdTtpZihyJiZlJiZ0eXBlb2YgZT09Im9iamVjdCIpe2lmKHU9YS5nZXQoZSksdSlyZXR1cm4gdS5hbmNob3I/Pyh1LmFuY2hvcj1zKGUpKSxuZXcgJGwodS5hbmNob3IpO3U9e2FuY2hvcjpudWxsLG5vZGU6bnVsbH0sYS5zZXQoZSx1KX10IT1udWxsJiZ0LnN0YXJ0c1dpdGgoIiEhIikmJih0PW0zK3Quc2xpY2UoMikpO2xldCBsPWczKGUsdCxvLnRhZ3MpO2lmKCFsKXtpZihlJiZ0eXBlb2YgZS50b0pTT049PSJmdW5jdGlvbiImJihlPWUudG9KU09OKCkpLCFlfHx0eXBlb2YgZSE9Im9iamVjdCIpe2xldCBkPW5ldyByZShlKTtyZXR1cm4gdSYmKHUubm9kZT1kKSxkfWw9ZSBpbnN0YW5jZW9mIE1hcD9vW2xzXTpTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KGUpP29bb29dOm9bbHNdfWkmJihpKGwpLGRlbGV0ZSBuLm9uVGFnT2JqKTtsZXQgZj1sIT1udWxsJiZsLmNyZWF0ZU5vZGU/bC5jcmVhdGVOb2RlKG4uc2NoZW1hLGUsbik6dHlwZW9mKChoPWw9PW51bGw/dm9pZCAwOmwubm9kZUNsYXNzKT09bnVsbD92b2lkIDA6aC5mcm9tKT09ImZ1bmN0aW9uIj9sLm5vZGVDbGFzcy5mcm9tKG4uc2NoZW1hLGUsbik6bmV3IHJlKGUpO3JldHVybiB0P2YudGFnPXQ6bC5kZWZhdWx0fHwoZi50YWc9bC50YWcpLHUmJih1Lm5vZGU9ZiksZn1mdW5jdGlvbiBfbChlLHQsbil7bGV0IHI9bjtmb3IobGV0IHM9dC5sZW5ndGgtMTtzPj0wOy0tcyl7bGV0IGk9dFtzXTtpZih0eXBlb2YgaT09Im51bWJlciImJk51bWJlci5pc0ludGVnZXIoaSkmJmk+PTApe2xldCBvPVtdO29baV09cixyPW99ZWxzZSByPW5ldyBNYXAoW1tpLHJdXSl9cmV0dXJuICRhKHIsdm9pZCAwLHthbGlhc0R1cGxpY2F0ZU9iamVjdHM6ITEsa2VlcFVuZGVmaW5lZDohMSxvbkFuY2hvcjooKT0+e3Rocm93IG5ldyBFcnJvcigiVGhpcyBzaG91bGQgbm90IGhhcHBlbiwgcGxlYXNlIHJlcG9ydCBhIGJ1Zy4iKX0sc2NoZW1hOmUsc291cmNlT2JqZWN0czpuZXcgTWFwfSl9dmFyIEJhPWU9PmU9PW51bGx8fHR5cGVvZiBlPT0ib2JqZWN0IiYmISFlW1N5bWJvbC5pdGVyYXRvcl0oKS5uZXh0KCkuZG9uZSxiMj1jbGFzcyBleHRlbmRzIEZoe2NvbnN0cnVjdG9yKHQsbil7c3VwZXIodCksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsInNjaGVtYSIse3ZhbHVlOm4sY29uZmlndXJhYmxlOiEwLGVudW1lcmFibGU6ITEsd3JpdGFibGU6ITB9KX1jbG9uZSh0KXtsZXQgbj1PYmplY3QuY3JlYXRlKE9iamVjdC5nZXRQcm90b3R5cGVPZih0aGlzKSxPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9ycyh0aGlzKSk7cmV0dXJuIHQmJihuLnNjaGVtYT10KSxuLml0ZW1zPW4uaXRlbXMubWFwKHI9PlVlKHIpfHxUZShyKT9yLmNsb25lKHQpOnIpLHRoaXMucmFuZ2UmJihuLnJhbmdlPXRoaXMucmFuZ2Uuc2xpY2UoKSksbn1hZGRJbih0LG4pe2lmKEJhKHQpKXRoaXMuYWRkKG4pO2Vsc2V7bGV0W3IsLi4uc109dCxpPXRoaXMuZ2V0KHIsITApO2lmKFZlKGkpKWkuYWRkSW4ocyxuKTtlbHNlIGlmKGk9PT12b2lkIDAmJnRoaXMuc2NoZW1hKXRoaXMuc2V0KHIsX2wodGhpcy5zY2hlbWEscyxuKSk7ZWxzZSB0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIFlBTUwgY29sbGVjdGlvbiBhdCAke3J9LiBSZW1haW5pbmcgcGF0aDogJHtzfWApfX1kZWxldGVJbih0KXtsZXRbbiwuLi5yXT10O2lmKHIubGVuZ3RoPT09MClyZXR1cm4gdGhpcy5kZWxldGUobik7bGV0IHM9dGhpcy5nZXQobiwhMCk7aWYoVmUocykpcmV0dXJuIHMuZGVsZXRlSW4ocik7dGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBZQU1MIGNvbGxlY3Rpb24gYXQgJHtufS4gUmVtYWluaW5nIHBhdGg6ICR7cn1gKX1nZXRJbih0LG4pe2xldFtyLC4uLnNdPXQsaT10aGlzLmdldChyLCEwKTtyZXR1cm4gcy5sZW5ndGg9PT0wPyFuJiZFZShpKT9pLnZhbHVlOmk6VmUoaSk/aS5nZXRJbihzLG4pOnZvaWQgMH1oYXNBbGxOdWxsVmFsdWVzKHQpe3JldHVybiB0aGlzLml0ZW1zLmV2ZXJ5KG49PntpZighVGUobikpcmV0dXJuITE7bGV0IHI9bi52YWx1ZTtyZXR1cm4gcj09bnVsbHx8dCYmRWUocikmJnIudmFsdWU9PW51bGwmJiFyLmNvbW1lbnRCZWZvcmUmJiFyLmNvbW1lbnQmJiFyLnRhZ30pfWhhc0luKHQpe2xldFtuLC4uLnJdPXQ7aWYoci5sZW5ndGg9PT0wKXJldHVybiB0aGlzLmhhcyhuKTtsZXQgcz10aGlzLmdldChuLCEwKTtyZXR1cm4gVmUocyk/cy5oYXNJbihyKTohMX1zZXRJbih0LG4pe2xldFtyLC4uLnNdPXQ7aWYocy5sZW5ndGg9PT0wKXRoaXMuc2V0KHIsbik7ZWxzZXtsZXQgaT10aGlzLmdldChyLCEwKTtpZihWZShpKSlpLnNldEluKHMsbik7ZWxzZSBpZihpPT09dm9pZCAwJiZ0aGlzLnNjaGVtYSl0aGlzLnNldChyLF9sKHRoaXMuc2NoZW1hLHMsbikpO2Vsc2UgdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBZQU1MIGNvbGxlY3Rpb24gYXQgJHtyfS4gUmVtYWluaW5nIHBhdGg6ICR7c31gKX19fSx5Mz1lPT5lLnJlcGxhY2UoL14oPyEkKSg/OiAkKT8vZ20sIiMiKTtmdW5jdGlvbiB3cihlLHQpe3JldHVybi9eXG4rJC8udGVzdChlKT9lLnN1YnN0cmluZygxKTp0P2UucmVwbGFjZSgvXig/ISAqJCkvZ20sdCk6ZX12YXIgS3M9KGUsdCxuKT0+ZS5lbmRzV2l0aChgCmApP3dyKG4sdCk6bi5pbmNsdWRlcyhgCmApP2AKYCt3cihuLHQpOihlLmVuZHNXaXRoKCIgIik/IiI6IiAiKStuLEUyPSJmbG93IixBaD0iYmxvY2siLElsPSJxdW90ZWQiO2Z1bmN0aW9uIFBsKGUsdCxuPSJmbG93Iix7aW5kZW50QXRTdGFydDpyLGxpbmVXaWR0aDpzPTgwLG1pbkNvbnRlbnRXaWR0aDppPTIwLG9uRm9sZDpvLG9uT3ZlcmZsb3c6YX09e30pe2lmKCFzfHxzPDApcmV0dXJuIGU7czxpJiYoaT0wKTtsZXQgdT1NYXRoLm1heCgxK2ksMStzLXQubGVuZ3RoKTtpZihlLmxlbmd0aDw9dSlyZXR1cm4gZTtsZXQgbD1bXSxmPXt9LGM9cy10Lmxlbmd0aDt0eXBlb2Ygcj09Im51bWJlciImJihyPnMtTWF0aC5tYXgoMixpKT9sLnB1c2goMCk6Yz1zLXIpO2xldCBwLGgsZD0hMSxtPS0xLGc9LTEsRD0tMTtuPT09QWgmJihtPXYyKGUsbSx0Lmxlbmd0aCksbSE9PS0xJiYoYz1tK3UpKTtmb3IobGV0IEU7RT1lW20rPTFdOyl7aWYobj09PUlsJiZFPT09IlxcIil7c3dpdGNoKGc9bSxlW20rMV0pe2Nhc2UieCI6bSs9MzticmVhaztjYXNlInUiOm0rPTU7YnJlYWs7Y2FzZSJVIjptKz05O2JyZWFrO2RlZmF1bHQ6bSs9MX1EPW19aWYoRT09PWAKYCluPT09QWgmJihtPXYyKGUsbSx0Lmxlbmd0aCkpLGM9bSt0Lmxlbmd0aCt1LHA9dm9pZCAwO2Vsc2V7aWYoRT09PSIgIiYmaCYmaCE9PSIgIiYmaCE9PWAKYCYmaCE9PSIJIil7bGV0IEY9ZVttKzFdO0YmJkYhPT0iICImJkYhPT1gCmAmJkYhPT0iCSImJihwPW0pfWlmKG0+PWMpaWYocClsLnB1c2gocCksYz1wK3UscD12b2lkIDA7ZWxzZSBpZihuPT09SWwpe2Zvcig7aD09PSIgInx8aD09PSIJIjspaD1FLEU9ZVttKz0xXSxkPSEwO2xldCBGPW0+RCsxP20tMjpnLTE7aWYoZltGXSlyZXR1cm4gZTtsLnB1c2goRiksZltGXT0hMCxjPUYrdSxwPXZvaWQgMH1lbHNlIGQ9ITB9aD1FfWlmKGQmJmEmJmEoKSxsLmxlbmd0aD09PTApcmV0dXJuIGU7byYmbygpO2xldCBiPWUuc2xpY2UoMCxsWzBdKTtmb3IobGV0IEU9MDtFPGwubGVuZ3RoOysrRSl7bGV0IEY9bFtFXSx2PWxbRSsxXXx8ZS5sZW5ndGg7Rj09PTA/Yj1gCiR7dH0ke2Uuc2xpY2UoMCx2KX1gOihuPT09SWwmJmZbRl0mJihiKz1gJHtlW0ZdfVxcYCksYis9YAoke3R9JHtlLnNsaWNlKEYrMSx2KX1gKX1yZXR1cm4gYn1mdW5jdGlvbiB2MihlLHQsbil7bGV0IHI9dCxzPXQrMSxpPWVbc107Zm9yKDtpPT09IiAifHxpPT09IgkiOylpZih0PHMrbilpPWVbKyt0XTtlbHNle2RvIGk9ZVsrK3RdO3doaWxlKGkmJmkhPT1gCmApO3I9dCxzPXQrMSxpPWVbc119cmV0dXJuIHJ9dmFyIE1sPShlLHQpPT4oe2luZGVudEF0U3RhcnQ6dD9lLmluZGVudC5sZW5ndGg6ZS5pbmRlbnRBdFN0YXJ0LGxpbmVXaWR0aDplLm9wdGlvbnMubGluZVdpZHRoLG1pbkNvbnRlbnRXaWR0aDplLm9wdGlvbnMubWluQ29udGVudFdpZHRofSksT2w9ZT0+L14oJXwtLS18XC5cLlwuKS9tLnRlc3QoZSk7ZnVuY3Rpb24gRDMoZSx0LG4pe2lmKCF0fHx0PDApcmV0dXJuITE7bGV0IHI9dC1uLHM9ZS5sZW5ndGg7aWYoczw9cilyZXR1cm4hMTtmb3IobGV0IGk9MCxvPTA7aTxzOysraSlpZihlW2ldPT09YApgKXtpZihpLW8+cilyZXR1cm4hMDtpZihvPWkrMSxzLW88PXIpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gX2EoZSx0KXtsZXQgbj1KU09OLnN0cmluZ2lmeShlKTtpZih0Lm9wdGlvbnMuZG91YmxlUXVvdGVkQXNKU09OKXJldHVybiBuO2xldHtpbXBsaWNpdEtleTpyfT10LHM9dC5vcHRpb25zLmRvdWJsZVF1b3RlZE1pbk11bHRpTGluZUxlbmd0aCxpPXQuaW5kZW50fHwoT2woZSk/IiAgIjoiIiksbz0iIixhPTA7Zm9yKGxldCB1PTAsbD1uW3VdO2w7bD1uWysrdV0paWYobD09PSIgIiYmblt1KzFdPT09IlxcIiYmblt1KzJdPT09Im4iJiYobys9bi5zbGljZShhLHUpKyJcXCAiLHUrPTEsYT11LGw9IlxcIiksbD09PSJcXCIpc3dpdGNoKG5bdSsxXSl7Y2FzZSJ1Ijp7bys9bi5zbGljZShhLHUpO2xldCBmPW4uc3Vic3RyKHUrMiw0KTtzd2l0Y2goZil7Y2FzZSIwMDAwIjpvKz0iXFwwIjticmVhaztjYXNlIjAwMDciOm8rPSJcXGEiO2JyZWFrO2Nhc2UiMDAwYiI6bys9IlxcdiI7YnJlYWs7Y2FzZSIwMDFiIjpvKz0iXFxlIjticmVhaztjYXNlIjAwODUiOm8rPSJcXE4iO2JyZWFrO2Nhc2UiMDBhMCI6bys9IlxcXyI7YnJlYWs7Y2FzZSIyMDI4IjpvKz0iXFxMIjticmVhaztjYXNlIjIwMjkiOm8rPSJcXFAiO2JyZWFrO2RlZmF1bHQ6Zi5zdWJzdHIoMCwyKT09PSIwMCI/bys9IlxceCIrZi5zdWJzdHIoMik6bys9bi5zdWJzdHIodSw2KX11Kz01LGE9dSsxfWJyZWFrO2Nhc2UibiI6aWYocnx8blt1KzJdPT09JyInfHxuLmxlbmd0aDxzKXUrPTE7ZWxzZXtmb3Iobys9bi5zbGljZShhLHUpK2AKCmA7blt1KzJdPT09IlxcIiYmblt1KzNdPT09Im4iJiZuW3UrNF0hPT0nIic7KW8rPWAKYCx1Kz0yO28rPWksblt1KzJdPT09IiAiJiYobys9IlxcIiksdSs9MSxhPXUrMX1icmVhaztkZWZhdWx0OnUrPTF9cmV0dXJuIG89YT9vK24uc2xpY2UoYSk6bixyP286UGwobyxpLElsLE1sKHQsITEpKX1mdW5jdGlvbiB3aChlLHQpe2lmKHQub3B0aW9ucy5zaW5nbGVRdW90ZT09PSExfHx0LmltcGxpY2l0S2V5JiZlLmluY2x1ZGVzKGAKYCl8fC9bIFx0XVxufFxuWyBcdF0vLnRlc3QoZSkpcmV0dXJuIF9hKGUsdCk7bGV0IG49dC5pbmRlbnR8fChPbChlKT8iICAiOiIiKSxyPSInIitlLnJlcGxhY2UoLycvZywiJyciKS5yZXBsYWNlKC9cbisvZyxgJCYKJHtufWApKyInIjtyZXR1cm4gdC5pbXBsaWNpdEtleT9yOlBsKHIsbixFMixNbCh0LCExKSl9ZnVuY3Rpb24gZm8oZSx0KXtsZXR7c2luZ2xlUXVvdGU6bn09dC5vcHRpb25zLHI7aWYobj09PSExKXI9X2E7ZWxzZXtsZXQgcz1lLmluY2x1ZGVzKCciJyksaT1lLmluY2x1ZGVzKCInIik7cyYmIWk/cj13aDppJiYhcz9yPV9hOnI9bj93aDpfYX1yZXR1cm4gcihlLHQpfXZhciBDaDt0cnl7Q2g9bmV3IFJlZ0V4cChgKF58KD88IQopKQorKD8hCnwkKWAsImciKX1jYXRjaHtDaD0vXG4rKD8hXG58JCkvZ31mdW5jdGlvbiBSbCh7Y29tbWVudDplLHR5cGU6dCx2YWx1ZTpufSxyLHMsaSl7bGV0e2Jsb2NrUXVvdGU6byxjb21tZW50U3RyaW5nOmEsbGluZVdpZHRoOnV9PXIub3B0aW9ucztpZighb3x8L1xuW1x0IF0rJC8udGVzdChuKSlyZXR1cm4gZm8obixyKTtsZXQgbD1yLmluZGVudHx8KHIuZm9yY2VCbG9ja0luZGVudHx8T2wobik/IiAgIjoiIiksZj1vPT09ImxpdGVyYWwiPyEwOm89PT0iZm9sZGVkInx8dD09PXJlLkJMT0NLX0ZPTERFRD8hMTp0PT09cmUuQkxPQ0tfTElURVJBTD8hMDohRDMobix1LGwubGVuZ3RoKTtpZighbilyZXR1cm4gZj9gfApgOmA+CmA7bGV0IGMscDtmb3IocD1uLmxlbmd0aDtwPjA7LS1wKXtsZXQgRj1uW3AtMV07aWYoRiE9PWAKYCYmRiE9PSIJIiYmRiE9PSIgIilicmVha31sZXQgaD1uLnN1YnN0cmluZyhwKSxkPWguaW5kZXhPZihgCmApO2Q9PT0tMT9jPSItIjpuPT09aHx8ZCE9PWgubGVuZ3RoLTE/KGM9IisiLGkmJmkoKSk6Yz0iIixoJiYobj1uLnNsaWNlKDAsLWgubGVuZ3RoKSxoW2gubGVuZ3RoLTFdPT09YApgJiYoaD1oLnNsaWNlKDAsLTEpKSxoPWgucmVwbGFjZShDaCxgJCYke2x9YCkpO2xldCBtPSExLGcsRD0tMTtmb3IoZz0wO2c8bi5sZW5ndGg7KytnKXtsZXQgRj1uW2ddO2lmKEY9PT0iICIpbT0hMDtlbHNlIGlmKEY9PT1gCmApRD1nO2Vsc2UgYnJlYWt9bGV0IGI9bi5zdWJzdHJpbmcoMCxEPGc/RCsxOmcpO2ImJihuPW4uc3Vic3RyaW5nKGIubGVuZ3RoKSxiPWIucmVwbGFjZSgvXG4rL2csYCQmJHtsfWApKTtsZXQgRT0obT9sPyIyIjoiMSI6IiIpK2M7aWYoZSYmKEUrPSIgIithKGUucmVwbGFjZSgvID9bXHJcbl0rL2csIiAiKSkscyYmcygpKSwhZil7bGV0IEY9bi5yZXBsYWNlKC9cbisvZyxgCiQmYCkucmVwbGFjZSgvKD86XnxcbikoW1x0IF0uKikoPzooW1xuXHQgXSopXG4oPyFbXG5cdCBdKSk/L2csIiQxJDIiKS5yZXBsYWNlKC9cbisvZyxgJCYke2x9YCksdj0hMSxDPU1sKHIsITApO28hPT0iZm9sZGVkIiYmdCE9PXJlLkJMT0NLX0ZPTERFRCYmKEMub25PdmVyZmxvdz0oKT0+e3Y9ITB9KTtsZXQgQT1QbChgJHtifSR7Rn0ke2h9YCxsLEFoLEMpO2lmKCF2KXJldHVybmA+JHtFfQoke2x9JHtBfWB9cmV0dXJuIG49bi5yZXBsYWNlKC9cbisvZyxgJCYke2x9YCksYHwke0V9CiR7bH0ke2J9JHtufSR7aH1gfWZ1bmN0aW9uIGIzKGUsdCxuLHIpe2xldHt0eXBlOnMsdmFsdWU6aX09ZSx7YWN0dWFsU3RyaW5nOm8saW1wbGljaXRLZXk6YSxpbmRlbnQ6dSxpbmRlbnRTdGVwOmwsaW5GbG93OmZ9PXQ7aWYoYSYmaS5pbmNsdWRlcyhgCmApfHxmJiYvW1tcXXt9LF0vLnRlc3QoaSkpcmV0dXJuIGZvKGksdCk7aWYoL15bXG5cdCAsW1xde30jJiohfD4nIiVAYF18Xls/LV0kfF5bPy1dWyBcdF18W1xuOl1bIFx0XXxbIFx0XVxufFtcblx0IF0jfFtcblx0IDpdJC8udGVzdChpKSlyZXR1cm4gYXx8Znx8IWkuaW5jbHVkZXMoYApgKT9mbyhpLHQpOlJsKGUsdCxuLHIpO2lmKCFhJiYhZiYmcyE9PXJlLlBMQUlOJiZpLmluY2x1ZGVzKGAKYCkpcmV0dXJuIFJsKGUsdCxuLHIpO2lmKE9sKGkpKXtpZih1PT09IiIpcmV0dXJuIHQuZm9yY2VCbG9ja0luZGVudD0hMCxSbChlLHQsbixyKTtpZihhJiZ1PT09bClyZXR1cm4gZm8oaSx0KX1sZXQgYz1pLnJlcGxhY2UoL1xuKy9nLGAkJgoke3V9YCk7aWYobyl7bGV0IHA9bT0+e3ZhciBnO3JldHVybiBtLmRlZmF1bHQmJm0udGFnIT09InRhZzp5YW1sLm9yZywyMDAyOnN0ciImJigoZz1tLnRlc3QpPT1udWxsP3ZvaWQgMDpnLnRlc3QoYykpfSx7Y29tcGF0OmgsdGFnczpkfT10LmRvYy5zY2hlbWE7aWYoZC5zb21lKHApfHxoIT1udWxsJiZoLnNvbWUocCkpcmV0dXJuIGZvKGksdCl9cmV0dXJuIGE/YzpQbChjLHUsRTIsTWwodCwhMSkpfWZ1bmN0aW9uIElhKGUsdCxuLHIpe2xldHtpbXBsaWNpdEtleTpzLGluRmxvdzppfT10LG89dHlwZW9mIGUudmFsdWU9PSJzdHJpbmciP2U6T2JqZWN0LmFzc2lnbih7fSxlLHt2YWx1ZTpTdHJpbmcoZS52YWx1ZSl9KSx7dHlwZTphfT1lO2EhPT1yZS5RVU9URV9ET1VCTEUmJi9bXHgwMC1ceDA4XHgwYi1ceDFmXHg3Zi1ceDlmXHV7RDgwMH0tXHV7REZGRn1dL3UudGVzdChvLnZhbHVlKSYmKGE9cmUuUVVPVEVfRE9VQkxFKTtsZXQgdT1mPT57c3dpdGNoKGYpe2Nhc2UgcmUuQkxPQ0tfRk9MREVEOmNhc2UgcmUuQkxPQ0tfTElURVJBTDpyZXR1cm4gc3x8aT9mbyhvLnZhbHVlLHQpOlJsKG8sdCxuLHIpO2Nhc2UgcmUuUVVPVEVfRE9VQkxFOnJldHVybiBfYShvLnZhbHVlLHQpO2Nhc2UgcmUuUVVPVEVfU0lOR0xFOnJldHVybiB3aChvLnZhbHVlLHQpO2Nhc2UgcmUuUExBSU46cmV0dXJuIGIzKG8sdCxuLHIpO2RlZmF1bHQ6cmV0dXJuIG51bGx9fSxsPXUoYSk7aWYobD09PW51bGwpe2xldHtkZWZhdWx0S2V5VHlwZTpmLGRlZmF1bHRTdHJpbmdUeXBlOmN9PXQub3B0aW9ucyxwPXMmJmZ8fGM7aWYobD11KHApLGw9PT1udWxsKXRocm93IG5ldyBFcnJvcihgVW5zdXBwb3J0ZWQgZGVmYXVsdCBzdHJpbmcgdHlwZSAke3B9YCl9cmV0dXJuIGx9ZnVuY3Rpb24gRjIoZSx0KXtsZXQgbj1PYmplY3QuYXNzaWduKHtibG9ja1F1b3RlOiEwLGNvbW1lbnRTdHJpbmc6eTMsZGVmYXVsdEtleVR5cGU6bnVsbCxkZWZhdWx0U3RyaW5nVHlwZToiUExBSU4iLGRpcmVjdGl2ZXM6bnVsbCxkb3VibGVRdW90ZWRBc0pTT046ITEsZG91YmxlUXVvdGVkTWluTXVsdGlMaW5lTGVuZ3RoOjQwLGZhbHNlU3RyOiJmYWxzZSIsZmxvd0NvbGxlY3Rpb25QYWRkaW5nOiEwLGluZGVudFNlcTohMCxsaW5lV2lkdGg6ODAsbWluQ29udGVudFdpZHRoOjIwLG51bGxTdHI6Im51bGwiLHNpbXBsZUtleXM6ITEsc2luZ2xlUXVvdGU6bnVsbCx0cmFpbGluZ0NvbW1hOiExLHRydWVTdHI6InRydWUiLHZlcmlmeUFsaWFzT3JkZXI6ITB9LGUuc2NoZW1hLnRvU3RyaW5nT3B0aW9ucyx0KSxyO3N3aXRjaChuLmNvbGxlY3Rpb25TdHlsZSl7Y2FzZSJibG9jayI6cj0hMTticmVhaztjYXNlImZsb3ciOnI9ITA7YnJlYWs7ZGVmYXVsdDpyPW51bGx9cmV0dXJue2FuY2hvcnM6bmV3IFNldCxkb2M6ZSxmbG93Q29sbGVjdGlvblBhZGRpbmc6bi5mbG93Q29sbGVjdGlvblBhZGRpbmc/IiAiOiIiLGluZGVudDoiIixpbmRlbnRTdGVwOnR5cGVvZiBuLmluZGVudD09Im51bWJlciI/IiAiLnJlcGVhdChuLmluZGVudCk6IiAgIixpbkZsb3c6cixvcHRpb25zOm59fWZ1bmN0aW9uIEUzKGUsdCl7dmFyIHM7aWYodC50YWcpe2xldCBpPWUuZmlsdGVyKG89Pm8udGFnPT09dC50YWcpO2lmKGkubGVuZ3RoPjApcmV0dXJuIGkuZmluZChvPT5vLmZvcm1hdD09PXQuZm9ybWF0KT8/aVswXX1sZXQgbixyO2lmKEVlKHQpKXtyPXQudmFsdWU7bGV0IGk9ZS5maWx0ZXIobz0+e3ZhciBhO3JldHVybihhPW8uaWRlbnRpZnkpPT1udWxsP3ZvaWQgMDphLmNhbGwobyxyKX0pO2lmKGkubGVuZ3RoPjEpe2xldCBvPWkuZmlsdGVyKGE9PmEudGVzdCk7by5sZW5ndGg+MCYmKGk9byl9bj1pLmZpbmQobz0+by5mb3JtYXQ9PT10LmZvcm1hdCk/P2kuZmluZChvPT4hby5mb3JtYXQpfWVsc2Ugcj10LG49ZS5maW5kKGk9Pmkubm9kZUNsYXNzJiZyIGluc3RhbmNlb2YgaS5ub2RlQ2xhc3MpO2lmKCFuKXtsZXQgaT0oKHM9cj09bnVsbD92b2lkIDA6ci5jb25zdHJ1Y3Rvcik9PW51bGw/dm9pZCAwOnMubmFtZSk/PyhyPT09bnVsbD8ibnVsbCI6dHlwZW9mIHIpO3Rocm93IG5ldyBFcnJvcihgVGFnIG5vdCByZXNvbHZlZCBmb3IgJHtpfSB2YWx1ZWApfXJldHVybiBufWZ1bmN0aW9uIHYzKGUsdCx7YW5jaG9yczpuLGRvYzpyfSl7aWYoIXIuZGlyZWN0aXZlcylyZXR1cm4iIjtsZXQgcz1bXSxpPShFZShlKXx8VmUoZSkpJiZlLmFuY2hvcjtpJiZtMihpKSYmKG4uYWRkKGkpLHMucHVzaChgJiR7aX1gKSk7bGV0IG89ZS50YWc/Pyh0LmRlZmF1bHQ/bnVsbDp0LnRhZyk7cmV0dXJuIG8mJnMucHVzaChyLmRpcmVjdGl2ZXMudGFnU3RyaW5nKG8pKSxzLmpvaW4oIiAiKX1mdW5jdGlvbiBwbyhlLHQsbixyKXt2YXIgdTtpZihUZShlKSlyZXR1cm4gZS50b1N0cmluZyh0LG4scik7aWYoY3MoZSkpe2lmKHQuZG9jLmRpcmVjdGl2ZXMpcmV0dXJuIGUudG9TdHJpbmcodCk7aWYoKHU9dC5yZXNvbHZlZEFsaWFzZXMpIT1udWxsJiZ1LmhhcyhlKSl0aHJvdyBuZXcgVHlwZUVycm9yKCJDYW5ub3Qgc3RyaW5naWZ5IGNpcmN1bGFyIHN0cnVjdHVyZSB3aXRob3V0IGFsaWFzIG5vZGVzIik7dC5yZXNvbHZlZEFsaWFzZXM/dC5yZXNvbHZlZEFsaWFzZXMuYWRkKGUpOnQucmVzb2x2ZWRBbGlhc2VzPW5ldyBTZXQoW2VdKSxlPWUucmVzb2x2ZSh0LmRvYyl9bGV0IHMsaT1VZShlKT9lOnQuZG9jLmNyZWF0ZU5vZGUoZSx7b25UYWdPYmo6bD0+cz1sfSk7cz8/KHM9RTModC5kb2Muc2NoZW1hLnRhZ3MsaSkpO2xldCBvPXYzKGkscyx0KTtvLmxlbmd0aD4wJiYodC5pbmRlbnRBdFN0YXJ0PSh0LmluZGVudEF0U3RhcnQ/PzApK28ubGVuZ3RoKzEpO2xldCBhPXR5cGVvZiBzLnN0cmluZ2lmeT09ImZ1bmN0aW9uIj9zLnN0cmluZ2lmeShpLHQsbixyKTpFZShpKT9JYShpLHQsbixyKTppLnRvU3RyaW5nKHQsbixyKTtyZXR1cm4gbz9FZShpKXx8YVswXT09PSJ7Inx8YVswXT09PSJbIj9gJHtvfSAke2F9YDpgJHtvfQoke3QuaW5kZW50fSR7YX1gOmF9ZnVuY3Rpb24gRjMoe2tleTplLHZhbHVlOnR9LG4scixzKXtsZXR7YWxsTnVsbFZhbHVlczppLGRvYzpvLGluZGVudDphLGluZGVudFN0ZXA6dSxvcHRpb25zOntjb21tZW50U3RyaW5nOmwsaW5kZW50U2VxOmYsc2ltcGxlS2V5czpjfX09bixwPVVlKGUpJiZlLmNvbW1lbnR8fG51bGw7aWYoYyl7aWYocCl0aHJvdyBuZXcgRXJyb3IoIldpdGggc2ltcGxlIGtleXMsIGtleSBub2RlcyBjYW5ub3QgaGF2ZSBjb21tZW50cyIpO2lmKFZlKGUpfHwhVWUoZSkmJnR5cGVvZiBlPT0ib2JqZWN0Iil7bGV0IEE9IldpdGggc2ltcGxlIGtleXMsIGNvbGxlY3Rpb24gY2Fubm90IGJlIHVzZWQgYXMgYSBrZXkgdmFsdWUiO3Rocm93IG5ldyBFcnJvcihBKX19bGV0IGg9IWMmJighZXx8cCYmdD09bnVsbCYmIW4uaW5GbG93fHxWZShlKXx8KEVlKGUpP2UudHlwZT09PXJlLkJMT0NLX0ZPTERFRHx8ZS50eXBlPT09cmUuQkxPQ0tfTElURVJBTDp0eXBlb2YgZT09Im9iamVjdCIpKTtuPU9iamVjdC5hc3NpZ24oe30sbix7YWxsTnVsbFZhbHVlczohMSxpbXBsaWNpdEtleTohaCYmKGN8fCFpKSxpbmRlbnQ6YSt1fSk7bGV0IGQ9ITEsbT0hMSxnPXBvKGUsbiwoKT0+ZD0hMCwoKT0+bT0hMCk7aWYoIWgmJiFuLmluRmxvdyYmZy5sZW5ndGg+MTAyNCl7aWYoYyl0aHJvdyBuZXcgRXJyb3IoIldpdGggc2ltcGxlIGtleXMsIHNpbmdsZSBsaW5lIHNjYWxhciBtdXN0IG5vdCBzcGFuIG1vcmUgdGhhbiAxMDI0IGNoYXJhY3RlcnMiKTtoPSEwfWlmKG4uaW5GbG93KXtpZihpfHx0PT1udWxsKXJldHVybiBkJiZyJiZyKCksZz09PSIiPyI/IjpoP2A/ICR7Z31gOmd9ZWxzZSBpZihpJiYhY3x8dD09bnVsbCYmaClyZXR1cm4gZz1gPyAke2d9YCxwJiYhZD9nKz1LcyhnLG4uaW5kZW50LGwocCkpOm0mJnMmJnMoKSxnO2QmJihwPW51bGwpLGg/KHAmJihnKz1LcyhnLG4uaW5kZW50LGwocCkpKSxnPWA/ICR7Z30KJHthfTpgKTooZz1gJHtnfTpgLHAmJihnKz1LcyhnLG4uaW5kZW50LGwocCkpKSk7bGV0IEQsYixFO1VlKHQpPyhEPSEhdC5zcGFjZUJlZm9yZSxiPXQuY29tbWVudEJlZm9yZSxFPXQuY29tbWVudCk6KEQ9ITEsYj1udWxsLEU9bnVsbCx0JiZ0eXBlb2YgdD09Im9iamVjdCImJih0PW8uY3JlYXRlTm9kZSh0KSkpLG4uaW1wbGljaXRLZXk9ITEsIWgmJiFwJiZFZSh0KSYmKG4uaW5kZW50QXRTdGFydD1nLmxlbmd0aCsxKSxtPSExLCFmJiZ1Lmxlbmd0aD49MiYmIW4uaW5GbG93JiYhaCYmenModCkmJiF0LmZsb3cmJiF0LnRhZyYmIXQuYW5jaG9yJiYobi5pbmRlbnQ9bi5pbmRlbnQuc3Vic3RyaW5nKDIpKTtsZXQgRj0hMSx2PXBvKHQsbiwoKT0+Rj0hMCwoKT0+bT0hMCksQz0iICI7aWYocHx8RHx8Yil7aWYoQz1EP2AKYDoiIixiKXtsZXQgQT1sKGIpO0MrPWAKJHt3cihBLG4uaW5kZW50KX1gfXY9PT0iIiYmIW4uaW5GbG93P0M9PT1gCmAmJkUmJihDPWAKCmApOkMrPWAKJHtuLmluZGVudH1gfWVsc2UgaWYoIWgmJlZlKHQpKXtsZXQgQT12WzBdLHc9di5pbmRleE9mKGAKYCksVD13IT09LTEsTj1uLmluRmxvdz8/dC5mbG93Pz90Lml0ZW1zLmxlbmd0aD09PTA7aWYoVHx8IU4pe2xldCB4PSExO2lmKFQmJihBPT09IiYifHxBPT09IiEiKSl7bGV0IEw9di5pbmRleE9mKCIgIik7QT09PSImIiYmTCE9PS0xJiZMPHcmJnZbTCsxXT09PSIhIiYmKEw9di5pbmRleE9mKCIgIixMKzEpKSwoTD09PS0xfHx3PEwpJiYoeD0hMCl9eHx8KEM9YAoke24uaW5kZW50fWApfX1lbHNlKHY9PT0iInx8dlswXT09PWAKYCkmJihDPSIiKTtyZXR1cm4gZys9Qyt2LG4uaW5GbG93P0YmJnImJnIoKTpFJiYhRj9nKz1LcyhnLG4uaW5kZW50LGwoRSkpOm0mJnMmJnMoKSxnfWZ1bmN0aW9uIEEyKGUsdCl7KGU9PT0iZGVidWcifHxlPT09Indhcm4iKSYmY29uc29sZS53YXJuKHQpfXZhciBqbD0iPDwiLENyPXtpZGVudGlmeTplPT5lPT09amx8fHR5cGVvZiBlPT0ic3ltYm9sIiYmZS5kZXNjcmlwdGlvbj09PWpsLGRlZmF1bHQ6ImtleSIsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjptZXJnZSIsdGVzdDovXjw8JC8scmVzb2x2ZTooKT0+T2JqZWN0LmFzc2lnbihuZXcgcmUoU3ltYm9sKGpsKSkse2FkZFRvSlNNYXA6dzJ9KSxzdHJpbmdpZnk6KCk9PmpsfSxBMz0oZSx0KT0+KENyLmlkZW50aWZ5KHQpfHxFZSh0KSYmKCF0LnR5cGV8fHQudHlwZT09PXJlLlBMQUlOKSYmQ3IuaWRlbnRpZnkodC52YWx1ZSkpJiYoZT09bnVsbD92b2lkIDA6ZS5kb2Muc2NoZW1hLnRhZ3Muc29tZShuPT5uLnRhZz09PUNyLnRhZyYmbi5kZWZhdWx0KSk7ZnVuY3Rpb24gdzIoZSx0LG4pe2xldCByPUMyKGUsbik7aWYoenMocikpZm9yKGxldCBzIG9mIHIuaXRlbXMpU2goZSx0LHMpO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShyKSlmb3IobGV0IHMgb2YgcilTaChlLHQscyk7ZWxzZSBTaChlLHQscil9ZnVuY3Rpb24gU2goZSx0LG4pe2xldCByPUMyKGUsbik7aWYoIWZzKHIpKXRocm93IG5ldyBFcnJvcigiTWVyZ2Ugc291cmNlcyBtdXN0IGJlIG1hcHMgb3IgbWFwIGFsaWFzZXMiKTtsZXQgcz1yLnRvSlNPTihudWxsLGUsTWFwKTtmb3IobGV0W2ksb11vZiBzKXQgaW5zdGFuY2VvZiBNYXA/dC5oYXMoaSl8fHQuc2V0KGksbyk6dCBpbnN0YW5jZW9mIFNldD90LmFkZChpKTpPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodCxpKXx8T2JqZWN0LmRlZmluZVByb3BlcnR5KHQsaSx7dmFsdWU6byx3cml0YWJsZTohMCxlbnVtZXJhYmxlOiEwLGNvbmZpZ3VyYWJsZTohMH0pO3JldHVybiB0fWZ1bmN0aW9uIEMyKGUsdCl7cmV0dXJuIGUmJmNzKHQpP3QucmVzb2x2ZShlLmRvYyxlKTp0fWZ1bmN0aW9uIFMyKGUsdCx7a2V5Om4sdmFsdWU6cn0pe2lmKFVlKG4pJiZuLmFkZFRvSlNNYXApbi5hZGRUb0pTTWFwKGUsdCxyKTtlbHNlIGlmKEEzKGUsbikpdzIoZSx0LHIpO2Vsc2V7bGV0IHM9RW4obiwiIixlKTtpZih0IGluc3RhbmNlb2YgTWFwKXQuc2V0KHMsRW4ocixzLGUpKTtlbHNlIGlmKHQgaW5zdGFuY2VvZiBTZXQpdC5hZGQocyk7ZWxzZXtsZXQgaT13MyhuLHMsZSksbz1FbihyLGksZSk7aSBpbiB0P09iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LGkse3ZhbHVlOm8sd3JpdGFibGU6ITAsZW51bWVyYWJsZTohMCxjb25maWd1cmFibGU6ITB9KTp0W2ldPW99fXJldHVybiB0fWZ1bmN0aW9uIHczKGUsdCxuKXtpZih0PT09bnVsbClyZXR1cm4iIjtpZih0eXBlb2YgdCE9Im9iamVjdCIpcmV0dXJuIFN0cmluZyh0KTtpZihVZShlKSYmKG4hPW51bGwmJm4uZG9jKSl7bGV0IHI9RjIobi5kb2Mse30pO3IuYW5jaG9ycz1uZXcgU2V0O2ZvcihsZXQgaSBvZiBuLmFuY2hvcnMua2V5cygpKXIuYW5jaG9ycy5hZGQoaS5hbmNob3IpO3IuaW5GbG93PSEwLHIuaW5TdHJpbmdpZnlLZXk9ITA7bGV0IHM9ZS50b1N0cmluZyhyKTtpZighbi5tYXBLZXlXYXJuZWQpe2xldCBpPUpTT04uc3RyaW5naWZ5KHMpO2kubGVuZ3RoPjQwJiYoaT1pLnN1YnN0cmluZygwLDM2KSsnLi4uIicpLEEyKG4uZG9jLm9wdGlvbnMubG9nTGV2ZWwsYEtleXMgd2l0aCBjb2xsZWN0aW9uIHZhbHVlcyB3aWxsIGJlIHN0cmluZ2lmaWVkIGR1ZSB0byBKUyBPYmplY3QgcmVzdHJpY3Rpb25zOiAke2l9LiBTZXQgbWFwQXNNYXA6IHRydWUgdG8gdXNlIG9iamVjdCBrZXlzLmApLG4ubWFwS2V5V2FybmVkPSEwfXJldHVybiBzfXJldHVybiBKU09OLnN0cmluZ2lmeSh0KX1mdW5jdGlvbiB4aChlLHQsbil7bGV0IHI9JGEoZSx2b2lkIDAsbikscz0kYSh0LHZvaWQgMCxuKTtyZXR1cm4gbmV3IFZ0KHIscyl9dmFyIFZ0PWNsYXNzIGhDe2NvbnN0cnVjdG9yKHQsbj1udWxsKXtPYmplY3QuZGVmaW5lUHJvcGVydHkodGhpcyxibix7dmFsdWU6bDJ9KSx0aGlzLmtleT10LHRoaXMudmFsdWU9bn1jbG9uZSh0KXtsZXR7a2V5Om4sdmFsdWU6cn09dGhpcztyZXR1cm4gVWUobikmJihuPW4uY2xvbmUodCkpLFVlKHIpJiYocj1yLmNsb25lKHQpKSxuZXcgaEMobixyKX10b0pTT04odCxuKXtsZXQgcj1uIT1udWxsJiZuLm1hcEFzTWFwP25ldyBNYXA6e307cmV0dXJuIFMyKG4scix0aGlzKX10b1N0cmluZyh0LG4scil7cmV0dXJuIHQhPW51bGwmJnQuZG9jP0YzKHRoaXMsdCxuLHIpOkpTT04uc3RyaW5naWZ5KHRoaXMpfX07ZnVuY3Rpb24geDIoZSx0LG4pe3JldHVybih0LmluRmxvdz8/ZS5mbG93P1MzOkMzKShlLHQsbil9ZnVuY3Rpb24gQzMoe2NvbW1lbnQ6ZSxpdGVtczp0fSxuLHtibG9ja0l0ZW1QcmVmaXg6cixmbG93Q2hhcnM6cyxpdGVtSW5kZW50Omksb25DaG9tcEtlZXA6byxvbkNvbW1lbnQ6YX0pe2xldHtpbmRlbnQ6dSxvcHRpb25zOntjb21tZW50U3RyaW5nOmx9fT1uLGY9T2JqZWN0LmFzc2lnbih7fSxuLHtpbmRlbnQ6aSx0eXBlOm51bGx9KSxjPSExLHA9W107Zm9yKGxldCBkPTA7ZDx0Lmxlbmd0aDsrK2Qpe2xldCBtPXRbZF0sZz1udWxsO2lmKFVlKG0pKSFjJiZtLnNwYWNlQmVmb3JlJiZwLnB1c2goIiIpLFZsKG4scCxtLmNvbW1lbnRCZWZvcmUsYyksbS5jb21tZW50JiYoZz1tLmNvbW1lbnQpO2Vsc2UgaWYoVGUobSkpe2xldCBiPVVlKG0ua2V5KT9tLmtleTpudWxsO2ImJighYyYmYi5zcGFjZUJlZm9yZSYmcC5wdXNoKCIiKSxWbChuLHAsYi5jb21tZW50QmVmb3JlLGMpKX1jPSExO2xldCBEPXBvKG0sZiwoKT0+Zz1udWxsLCgpPT5jPSEwKTtnJiYoRCs9S3MoRCxpLGwoZykpKSxjJiZnJiYoYz0hMSkscC5wdXNoKHIrRCl9bGV0IGg7aWYocC5sZW5ndGg9PT0wKWg9cy5zdGFydCtzLmVuZDtlbHNle2g9cFswXTtmb3IobGV0IGQ9MTtkPHAubGVuZ3RoOysrZCl7bGV0IG09cFtkXTtoKz1tP2AKJHt1fSR7bX1gOmAKYH19cmV0dXJuIGU/KGgrPWAKYCt3cihsKGUpLHUpLGEmJmEoKSk6YyYmbyYmbygpLGh9ZnVuY3Rpb24gUzMoe2l0ZW1zOmV9LHQse2Zsb3dDaGFyczpuLGl0ZW1JbmRlbnQ6cn0pe2xldHtpbmRlbnQ6cyxpbmRlbnRTdGVwOmksZmxvd0NvbGxlY3Rpb25QYWRkaW5nOm8sb3B0aW9uczp7Y29tbWVudFN0cmluZzphfX09dDtyKz1pO2xldCB1PU9iamVjdC5hc3NpZ24oe30sdCx7aW5kZW50OnIsaW5GbG93OiEwLHR5cGU6bnVsbH0pLGw9ITEsZj0wLGM9W107Zm9yKGxldCBkPTA7ZDxlLmxlbmd0aDsrK2Qpe2xldCBtPWVbZF0sZz1udWxsO2lmKFVlKG0pKW0uc3BhY2VCZWZvcmUmJmMucHVzaCgiIiksVmwodCxjLG0uY29tbWVudEJlZm9yZSwhMSksbS5jb21tZW50JiYoZz1tLmNvbW1lbnQpO2Vsc2UgaWYoVGUobSkpe2xldCBiPVVlKG0ua2V5KT9tLmtleTpudWxsO2ImJihiLnNwYWNlQmVmb3JlJiZjLnB1c2goIiIpLFZsKHQsYyxiLmNvbW1lbnRCZWZvcmUsITEpLGIuY29tbWVudCYmKGw9ITApKTtsZXQgRT1VZShtLnZhbHVlKT9tLnZhbHVlOm51bGw7RT8oRS5jb21tZW50JiYoZz1FLmNvbW1lbnQpLEUuY29tbWVudEJlZm9yZSYmKGw9ITApKTptLnZhbHVlPT1udWxsJiYoYiE9bnVsbCYmYi5jb21tZW50KSYmKGc9Yi5jb21tZW50KX1nJiYobD0hMCk7bGV0IEQ9cG8obSx1LCgpPT5nPW51bGwpO2x8fChsPWMubGVuZ3RoPmZ8fEQuaW5jbHVkZXMoYApgKSksZDxlLmxlbmd0aC0xP0QrPSIsIjp0Lm9wdGlvbnMudHJhaWxpbmdDb21tYSYmKHQub3B0aW9ucy5saW5lV2lkdGg+MCYmKGx8fChsPWMucmVkdWNlKChiLEUpPT5iK0UubGVuZ3RoKzIsMikrKEQubGVuZ3RoKzIpPnQub3B0aW9ucy5saW5lV2lkdGgpKSxsJiYoRCs9IiwiKSksZyYmKEQrPUtzKEQscixhKGcpKSksYy5wdXNoKEQpLGY9Yy5sZW5ndGh9bGV0e3N0YXJ0OnAsZW5kOmh9PW47aWYoYy5sZW5ndGg9PT0wKXJldHVybiBwK2g7aWYoIWwpe2xldCBkPWMucmVkdWNlKChtLGcpPT5tK2cubGVuZ3RoKzIsMik7bD10Lm9wdGlvbnMubGluZVdpZHRoPjAmJmQ+dC5vcHRpb25zLmxpbmVXaWR0aH1pZihsKXtsZXQgZD1wO2ZvcihsZXQgbSBvZiBjKWQrPW0/YAoke2l9JHtzfSR7bX1gOmAKYDtyZXR1cm5gJHtkfQoke3N9JHtofWB9ZWxzZSByZXR1cm5gJHtwfSR7b30ke2Muam9pbigiICIpfSR7b30ke2h9YH1mdW5jdGlvbiBWbCh7aW5kZW50OmUsb3B0aW9uczp7Y29tbWVudFN0cmluZzp0fX0sbixyLHMpe2lmKHImJnMmJihyPXIucmVwbGFjZSgvXlxuKy8sIiIpKSxyKXtsZXQgaT13cih0KHIpLGUpO24ucHVzaChpLnRyaW1TdGFydCgpKX19ZnVuY3Rpb24gWHMoZSx0KXtsZXQgbj1FZSh0KT90LnZhbHVlOnQ7Zm9yKGxldCByIG9mIGUpaWYoVGUocikmJihyLmtleT09PXR8fHIua2V5PT09bnx8RWUoci5rZXkpJiZyLmtleS52YWx1ZT09PW4pKXJldHVybiByfXZhciBZdD1jbGFzcyBleHRlbmRzIGIye3N0YXRpYyBnZXQgdGFnTmFtZSgpe3JldHVybiJ0YWc6eWFtbC5vcmcsMjAwMjptYXAifWNvbnN0cnVjdG9yKHQpe3N1cGVyKGxzLHQpLHRoaXMuaXRlbXM9W119c3RhdGljIGZyb20odCxuLHIpe2xldHtrZWVwVW5kZWZpbmVkOnMscmVwbGFjZXI6aX09cixvPW5ldyB0aGlzKHQpLGE9KHUsbCk9PntpZih0eXBlb2YgaT09ImZ1bmN0aW9uIilsPWkuY2FsbChuLHUsbCk7ZWxzZSBpZihBcnJheS5pc0FycmF5KGkpJiYhaS5pbmNsdWRlcyh1KSlyZXR1cm47KGwhPT12b2lkIDB8fHMpJiZvLml0ZW1zLnB1c2goeGgodSxsLHIpKX07aWYobiBpbnN0YW5jZW9mIE1hcClmb3IobGV0W3UsbF1vZiBuKWEodSxsKTtlbHNlIGlmKG4mJnR5cGVvZiBuPT0ib2JqZWN0Iilmb3IobGV0IHUgb2YgT2JqZWN0LmtleXMobikpYSh1LG5bdV0pO3JldHVybiB0eXBlb2YgdC5zb3J0TWFwRW50cmllcz09ImZ1bmN0aW9uIiYmby5pdGVtcy5zb3J0KHQuc29ydE1hcEVudHJpZXMpLG99YWRkKHQsbil7dmFyIG87bGV0IHI7VGUodCk/cj10OiF0fHx0eXBlb2YgdCE9Im9iamVjdCJ8fCEoImtleSJpbiB0KT9yPW5ldyBWdCh0LHQ9PW51bGw/dm9pZCAwOnQudmFsdWUpOnI9bmV3IFZ0KHQua2V5LHQudmFsdWUpO2xldCBzPVhzKHRoaXMuaXRlbXMsci5rZXkpLGk9KG89dGhpcy5zY2hlbWEpPT1udWxsP3ZvaWQgMDpvLnNvcnRNYXBFbnRyaWVzO2lmKHMpe2lmKCFuKXRocm93IG5ldyBFcnJvcihgS2V5ICR7ci5rZXl9IGFscmVhZHkgc2V0YCk7RWUocy52YWx1ZSkmJkQyKHIudmFsdWUpP3MudmFsdWUudmFsdWU9ci52YWx1ZTpzLnZhbHVlPXIudmFsdWV9ZWxzZSBpZihpKXtsZXQgYT10aGlzLml0ZW1zLmZpbmRJbmRleCh1PT5pKHIsdSk8MCk7YT09PS0xP3RoaXMuaXRlbXMucHVzaChyKTp0aGlzLml0ZW1zLnNwbGljZShhLDAscil9ZWxzZSB0aGlzLml0ZW1zLnB1c2gocil9ZGVsZXRlKHQpe2xldCBuPVhzKHRoaXMuaXRlbXMsdCk7cmV0dXJuIG4/dGhpcy5pdGVtcy5zcGxpY2UodGhpcy5pdGVtcy5pbmRleE9mKG4pLDEpLmxlbmd0aD4wOiExfWdldCh0LG4pe3ZhciBzO2xldCByPShzPVhzKHRoaXMuaXRlbXMsdCkpPT1udWxsP3ZvaWQgMDpzLnZhbHVlO3JldHVybighbiYmRWUocik/ci52YWx1ZTpyKT8/dm9pZCAwfWhhcyh0KXtyZXR1cm4hIVhzKHRoaXMuaXRlbXMsdCl9c2V0KHQsbil7dGhpcy5hZGQobmV3IFZ0KHQsbiksITApfXRvSlNPTih0LG4scil7bGV0IHM9cj9uZXcgcjpuIT1udWxsJiZuLm1hcEFzTWFwP25ldyBNYXA6e307biE9bnVsbCYmbi5vbkNyZWF0ZSYmbi5vbkNyZWF0ZShzKTtmb3IobGV0IGkgb2YgdGhpcy5pdGVtcylTMihuLHMsaSk7cmV0dXJuIHN9dG9TdHJpbmcodCxuLHIpe2lmKCF0KXJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtmb3IobGV0IHMgb2YgdGhpcy5pdGVtcylpZighVGUocykpdGhyb3cgbmV3IEVycm9yKGBNYXAgaXRlbXMgbXVzdCBhbGwgYmUgcGFpcnM7IGZvdW5kICR7SlNPTi5zdHJpbmdpZnkocyl9IGluc3RlYWRgKTtyZXR1cm4hdC5hbGxOdWxsVmFsdWVzJiZ0aGlzLmhhc0FsbE51bGxWYWx1ZXMoITEpJiYodD1PYmplY3QuYXNzaWduKHt9LHQse2FsbE51bGxWYWx1ZXM6ITB9KSkseDIodGhpcyx0LHtibG9ja0l0ZW1QcmVmaXg6IiIsZmxvd0NoYXJzOntzdGFydDoieyIsZW5kOiJ9In0saXRlbUluZGVudDp0LmluZGVudHx8IiIsb25DaG9tcEtlZXA6cixvbkNvbW1lbnQ6bn0pfX0saG89e2NvbGxlY3Rpb246Im1hcCIsZGVmYXVsdDohMCxub2RlQ2xhc3M6WXQsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjptYXAiLHJlc29sdmUoZSx0KXtyZXR1cm4gZnMoZSl8fHQoIkV4cGVjdGVkIGEgbWFwcGluZyBmb3IgdGhpcyB0YWciKSxlfSxjcmVhdGVOb2RlOihlLHQsbik9Pll0LmZyb20oZSx0LG4pfSxwcz1jbGFzcyBleHRlbmRzIGIye3N0YXRpYyBnZXQgdGFnTmFtZSgpe3JldHVybiJ0YWc6eWFtbC5vcmcsMjAwMjpzZXEifWNvbnN0cnVjdG9yKGUpe3N1cGVyKG9vLGUpLHRoaXMuaXRlbXM9W119YWRkKGUpe3RoaXMuaXRlbXMucHVzaChlKX1kZWxldGUoZSl7bGV0IHQ9VWwoZSk7cmV0dXJuIHR5cGVvZiB0IT0ibnVtYmVyIj8hMTp0aGlzLml0ZW1zLnNwbGljZSh0LDEpLmxlbmd0aD4wfWdldChlLHQpe2xldCBuPVVsKGUpO2lmKHR5cGVvZiBuIT0ibnVtYmVyIilyZXR1cm47bGV0IHI9dGhpcy5pdGVtc1tuXTtyZXR1cm4hdCYmRWUocik/ci52YWx1ZTpyfWhhcyhlKXtsZXQgdD1VbChlKTtyZXR1cm4gdHlwZW9mIHQ9PSJudW1iZXIiJiZ0PHRoaXMuaXRlbXMubGVuZ3RofXNldChlLHQpe2xldCBuPVVsKGUpO2lmKHR5cGVvZiBuIT0ibnVtYmVyIil0aHJvdyBuZXcgRXJyb3IoYEV4cGVjdGVkIGEgdmFsaWQgaW5kZXgsIG5vdCAke2V9LmApO2xldCByPXRoaXMuaXRlbXNbbl07RWUocikmJkQyKHQpP3IudmFsdWU9dDp0aGlzLml0ZW1zW25dPXR9dG9KU09OKGUsdCl7bGV0IG49W107dCE9bnVsbCYmdC5vbkNyZWF0ZSYmdC5vbkNyZWF0ZShuKTtsZXQgcj0wO2ZvcihsZXQgcyBvZiB0aGlzLml0ZW1zKW4ucHVzaChFbihzLFN0cmluZyhyKyspLHQpKTtyZXR1cm4gbn10b1N0cmluZyhlLHQsbil7cmV0dXJuIGU/eDIodGhpcyxlLHtibG9ja0l0ZW1QcmVmaXg6Ii0gIixmbG93Q2hhcnM6e3N0YXJ0OiJbIixlbmQ6Il0ifSxpdGVtSW5kZW50OihlLmluZGVudHx8IiIpKyIgICIsb25DaG9tcEtlZXA6bixvbkNvbW1lbnQ6dH0pOkpTT04uc3RyaW5naWZ5KHRoaXMpfXN0YXRpYyBmcm9tKGUsdCxuKXtsZXR7cmVwbGFjZXI6cn09bixzPW5ldyB0aGlzKGUpO2lmKHQmJlN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QodCkpe2xldCBpPTA7Zm9yKGxldCBvIG9mIHQpe2lmKHR5cGVvZiByPT0iZnVuY3Rpb24iKXtsZXQgYT10IGluc3RhbmNlb2YgU2V0P286U3RyaW5nKGkrKyk7bz1yLmNhbGwodCxhLG8pfXMuaXRlbXMucHVzaCgkYShvLHZvaWQgMCxuKSl9fXJldHVybiBzfX07ZnVuY3Rpb24gVWwoZSl7bGV0IHQ9RWUoZSk/ZS52YWx1ZTplO3JldHVybiB0JiZ0eXBlb2YgdD09InN0cmluZyImJih0PU51bWJlcih0KSksdHlwZW9mIHQ9PSJudW1iZXIiJiZOdW1iZXIuaXNJbnRlZ2VyKHQpJiZ0Pj0wP3Q6bnVsbH12YXIgbW89e2NvbGxlY3Rpb246InNlcSIsZGVmYXVsdDohMCxub2RlQ2xhc3M6cHMsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjpzZXEiLHJlc29sdmUoZSx0KXtyZXR1cm4genMoZSl8fHQoIkV4cGVjdGVkIGEgc2VxdWVuY2UgZm9yIHRoaXMgdGFnIiksZX0sY3JlYXRlTm9kZTooZSx0LG4pPT5wcy5mcm9tKGUsdCxuKX0scWw9e2lkZW50aWZ5OmU9PnR5cGVvZiBlPT0ic3RyaW5nIixkZWZhdWx0OiEwLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6c3RyIixyZXNvbHZlOmU9PmUsc3RyaW5naWZ5KGUsdCxuLHIpe3JldHVybiB0PU9iamVjdC5hc3NpZ24oe2FjdHVhbFN0cmluZzohMH0sdCksSWEoZSx0LG4scil9fSxXbD17aWRlbnRpZnk6ZT0+ZT09bnVsbCxjcmVhdGVOb2RlOigpPT5uZXcgcmUobnVsbCksZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOm51bGwiLHRlc3Q6L14oPzp+fFtObl11bGx8TlVMTCk/JC8scmVzb2x2ZTooKT0+bmV3IHJlKG51bGwpLHN0cmluZ2lmeTooe3NvdXJjZTplfSx0KT0+dHlwZW9mIGU9PSJzdHJpbmciJiZXbC50ZXN0LnRlc3QoZSk/ZTp0Lm9wdGlvbnMubnVsbFN0cn0sa2g9e2lkZW50aWZ5OmU9PnR5cGVvZiBlPT0iYm9vbGVhbiIsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmJvb2wiLHRlc3Q6L14oPzpbVHRdcnVlfFRSVUV8W0ZmXWFsc2V8RkFMU0UpJC8scmVzb2x2ZTplPT5uZXcgcmUoZVswXT09PSJ0Inx8ZVswXT09PSJUIiksc3RyaW5naWZ5KHtzb3VyY2U6ZSx2YWx1ZTp0fSxuKXtpZihlJiZraC50ZXN0LnRlc3QoZSkpe2xldCByPWVbMF09PT0idCJ8fGVbMF09PT0iVCI7aWYodD09PXIpcmV0dXJuIGV9cmV0dXJuIHQ/bi5vcHRpb25zLnRydWVTdHI6bi5vcHRpb25zLmZhbHNlU3RyfX07ZnVuY3Rpb24gVm4oe2Zvcm1hdDplLG1pbkZyYWN0aW9uRGlnaXRzOnQsdGFnOm4sdmFsdWU6cn0pe2lmKHR5cGVvZiByPT0iYmlnaW50IilyZXR1cm4gU3RyaW5nKHIpO2xldCBzPXR5cGVvZiByPT0ibnVtYmVyIj9yOk51bWJlcihyKTtpZighaXNGaW5pdGUocykpcmV0dXJuIGlzTmFOKHMpPyIubmFuIjpzPDA/Ii0uaW5mIjoiLmluZiI7bGV0IGk9T2JqZWN0LmlzKHIsLTApPyItMCI6SlNPTi5zdHJpbmdpZnkocik7aWYoIWUmJnQmJighbnx8bj09PSJ0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCIpJiYvXi0/XGQvLnRlc3QoaSkmJiFpLmluY2x1ZGVzKCJlIikpe2xldCBvPWkuaW5kZXhPZigiLiIpO288MCYmKG89aS5sZW5ndGgsaSs9Ii4iKTtsZXQgYT10LShpLmxlbmd0aC1vLTEpO2Zvcig7YS0tID4wOylpKz0iMCJ9cmV0dXJuIGl9dmFyIGsyPXtpZGVudGlmeTplPT50eXBlb2YgZT09Im51bWJlciIsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmZsb2F0Iix0ZXN0Oi9eKD86Wy0rXT9cLig/OmluZnxJbmZ8SU5GKXxcLm5hbnxcLk5hTnxcLk5BTikkLyxyZXNvbHZlOmU9PmUuc2xpY2UoLTMpLnRvTG93ZXJDYXNlKCk9PT0ibmFuIj9OYU46ZVswXT09PSItIj9OdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFk6TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLHN0cmluZ2lmeTpWbn0sVDI9e2lkZW50aWZ5OmU9PnR5cGVvZiBlPT0ibnVtYmVyIixkZWZhdWx0OiEwLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQiLGZvcm1hdDoiRVhQIix0ZXN0Oi9eWy0rXT8oPzpcLlswLTldK3xbMC05XSsoPzpcLlswLTldKik/KVtlRV1bLStdP1swLTldKyQvLHJlc29sdmU6ZT0+cGFyc2VGbG9hdChlKSxzdHJpbmdpZnkoZSl7bGV0IHQ9TnVtYmVyKGUudmFsdWUpO3JldHVybiBpc0Zpbml0ZSh0KT90LnRvRXhwb25lbnRpYWwoKTpWbihlKX19LE4yPXtpZGVudGlmeTplPT50eXBlb2YgZT09Im51bWJlciIsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmZsb2F0Iix0ZXN0Oi9eWy0rXT8oPzpcLlswLTldK3xbMC05XStcLlswLTldKikkLyxyZXNvbHZlKGUpe2xldCB0PW5ldyByZShwYXJzZUZsb2F0KGUpKSxuPWUuaW5kZXhPZigiLiIpO3JldHVybiBuIT09LTEmJmVbZS5sZW5ndGgtMV09PT0iMCImJih0Lm1pbkZyYWN0aW9uRGlnaXRzPWUubGVuZ3RoLW4tMSksdH0sc3RyaW5naWZ5OlZufSxIbD1lPT50eXBlb2YgZT09ImJpZ2ludCJ8fE51bWJlci5pc0ludGVnZXIoZSksVGg9KGUsdCxuLHtpbnRBc0JpZ0ludDpyfSk9PnI/QmlnSW50KGUpOnBhcnNlSW50KGUuc3Vic3RyaW5nKHQpLG4pO2Z1bmN0aW9uIEwyKGUsdCxuKXtsZXR7dmFsdWU6cn09ZTtyZXR1cm4gSGwocikmJnI+PTA/bityLnRvU3RyaW5nKHQpOlZuKGUpfXZhciAkMj17aWRlbnRpZnk6ZT0+SGwoZSkmJmU+PTAsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmludCIsZm9ybWF0OiJPQ1QiLHRlc3Q6L14wb1swLTddKyQvLHJlc29sdmU6KGUsdCxuKT0+VGgoZSwyLDgsbiksc3RyaW5naWZ5OmU9PkwyKGUsOCwiMG8iKX0sQjI9e2lkZW50aWZ5OkhsLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjppbnQiLHRlc3Q6L15bLStdP1swLTldKyQvLHJlc29sdmU6KGUsdCxuKT0+VGgoZSwwLDEwLG4pLHN0cmluZ2lmeTpWbn0sXzI9e2lkZW50aWZ5OmU9PkhsKGUpJiZlPj0wLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjppbnQiLGZvcm1hdDoiSEVYIix0ZXN0Oi9eMHhbMC05YS1mQS1GXSskLyxyZXNvbHZlOihlLHQsbik9PlRoKGUsMiwxNixuKSxzdHJpbmdpZnk6ZT0+TDIoZSwxNiwiMHgiKX0seDM9W2hvLG1vLHFsLFdsLGtoLCQyLEIyLF8yLGsyLFQyLE4yXTtmdW5jdGlvbiBJMihlKXtyZXR1cm4gdHlwZW9mIGU9PSJiaWdpbnQifHxOdW1iZXIuaXNJbnRlZ2VyKGUpfXZhciBKbD0oe3ZhbHVlOmV9KT0+SlNPTi5zdHJpbmdpZnkoZSksazM9W3tpZGVudGlmeTplPT50eXBlb2YgZT09InN0cmluZyIsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOnN0ciIscmVzb2x2ZTplPT5lLHN0cmluZ2lmeTpKbH0se2lkZW50aWZ5OmU9PmU9PW51bGwsY3JlYXRlTm9kZTooKT0+bmV3IHJlKG51bGwpLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjpudWxsIix0ZXN0Oi9ebnVsbCQvLHJlc29sdmU6KCk9Pm51bGwsc3RyaW5naWZ5OkpsfSx7aWRlbnRpZnk6ZT0+dHlwZW9mIGU9PSJib29sZWFuIixkZWZhdWx0OiEwLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6Ym9vbCIsdGVzdDovXnRydWUkfF5mYWxzZSQvLHJlc29sdmU6ZT0+ZT09PSJ0cnVlIixzdHJpbmdpZnk6Smx9LHtpZGVudGlmeTpJMixkZWZhdWx0OiEwLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6aW50Iix0ZXN0Oi9eLT8oPzowfFsxLTldWzAtOV0qKSQvLHJlc29sdmU6KGUsdCx7aW50QXNCaWdJbnQ6bn0pPT5uP0JpZ0ludChlKTpwYXJzZUludChlLDEwKSxzdHJpbmdpZnk6KHt2YWx1ZTplfSk9PkkyKGUpP2UudG9TdHJpbmcoKTpKU09OLnN0cmluZ2lmeShlKX0se2lkZW50aWZ5OmU9PnR5cGVvZiBlPT0ibnVtYmVyIixkZWZhdWx0OiEwLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQiLHRlc3Q6L14tPyg/OjB8WzEtOV1bMC05XSopKD86XC5bMC05XSopPyg/OltlRV1bLStdP1swLTldKyk/JC8scmVzb2x2ZTplPT5wYXJzZUZsb2F0KGUpLHN0cmluZ2lmeTpKbH1dLFQzPXtkZWZhdWx0OiEwLHRhZzoiIix0ZXN0Oi9eLyxyZXNvbHZlKGUsdCl7cmV0dXJuIHQoYFVucmVzb2x2ZWQgcGxhaW4gc2NhbGFyICR7SlNPTi5zdHJpbmdpZnkoZSl9YCksZX19LE4zPVtobyxtb10uY29uY2F0KGszLFQzKSxOaD17aWRlbnRpZnk6ZT0+ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXksZGVmYXVsdDohMSx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmJpbmFyeSIscmVzb2x2ZShlLHQpe2lmKHR5cGVvZiBhdG9iPT0iZnVuY3Rpb24iKXtsZXQgbj1hdG9iKGUucmVwbGFjZSgvW1xuXHJdL2csIiIpKSxyPW5ldyBVaW50OEFycmF5KG4ubGVuZ3RoKTtmb3IobGV0IHM9MDtzPG4ubGVuZ3RoOysrcylyW3NdPW4uY2hhckNvZGVBdChzKTtyZXR1cm4gcn1lbHNlIHJldHVybiBlfSxzdHJpbmdpZnkoe2NvbW1lbnQ6ZSx0eXBlOnQsdmFsdWU6bn0scixzLGkpe2lmKCFuKXJldHVybiIiO2xldCBvPW4sYTtpZih0eXBlb2YgYnRvYT09ImZ1bmN0aW9uIil7bGV0IHU9IiI7Zm9yKGxldCBsPTA7bDxvLmxlbmd0aDsrK2wpdSs9U3RyaW5nLmZyb21DaGFyQ29kZShvW2xdKTthPWJ0b2EodSl9ZWxzZSB0aHJvdyBuZXcgRXJyb3IoIlRoaXMgZW52aXJvbm1lbnQgZG9lcyBub3Qgc3VwcG9ydCB3cml0aW5nIGJpbmFyeSB0YWdzOyBlaXRoZXIgQnVmZmVyIG9yIGJ0b2EgaXMgcmVxdWlyZWQiKTtpZih0Pz8odD1yZS5CTE9DS19MSVRFUkFMKSx0IT09cmUuUVVPVEVfRE9VQkxFKXtsZXQgdT1NYXRoLm1heChyLm9wdGlvbnMubGluZVdpZHRoLXIuaW5kZW50Lmxlbmd0aCxyLm9wdGlvbnMubWluQ29udGVudFdpZHRoKSxsPU1hdGguY2VpbChhLmxlbmd0aC91KSxmPW5ldyBBcnJheShsKTtmb3IobGV0IGM9MCxwPTA7YzxsOysrYyxwKz11KWZbY109YS5zdWJzdHIocCx1KTthPWYuam9pbih0PT09cmUuQkxPQ0tfTElURVJBTD9gCmA6IiAiKX1yZXR1cm4gSWEoe2NvbW1lbnQ6ZSx0eXBlOnQsdmFsdWU6YX0scixzLGkpfX07ZnVuY3Rpb24gUDIoZSx0KXtpZih6cyhlKSlmb3IobGV0IG49MDtuPGUuaXRlbXMubGVuZ3RoOysrbil7bGV0IHI9ZS5pdGVtc1tuXTtpZighVGUocikpe2lmKGZzKHIpKXtyLml0ZW1zLmxlbmd0aD4xJiZ0KCJFYWNoIHBhaXIgbXVzdCBoYXZlIGl0cyBvd24gc2VxdWVuY2UgaW5kaWNhdG9yIik7bGV0IHM9ci5pdGVtc1swXXx8bmV3IFZ0KG5ldyByZShudWxsKSk7aWYoci5jb21tZW50QmVmb3JlJiYocy5rZXkuY29tbWVudEJlZm9yZT1zLmtleS5jb21tZW50QmVmb3JlP2Ake3IuY29tbWVudEJlZm9yZX0KJHtzLmtleS5jb21tZW50QmVmb3JlfWA6ci5jb21tZW50QmVmb3JlKSxyLmNvbW1lbnQpe2xldCBpPXMudmFsdWU/P3Mua2V5O2kuY29tbWVudD1pLmNvbW1lbnQ/YCR7ci5jb21tZW50fQoke2kuY29tbWVudH1gOnIuY29tbWVudH1yPXN9ZS5pdGVtc1tuXT1UZShyKT9yOm5ldyBWdChyKX19ZWxzZSB0KCJFeHBlY3RlZCBhIHNlcXVlbmNlIGZvciB0aGlzIHRhZyIpO3JldHVybiBlfWZ1bmN0aW9uIE0yKGUsdCxuKXtsZXR7cmVwbGFjZXI6cn09bixzPW5ldyBwcyhlKTtzLnRhZz0idGFnOnlhbWwub3JnLDIwMDI6cGFpcnMiO2xldCBpPTA7aWYodCYmU3ltYm9sLml0ZXJhdG9yIGluIE9iamVjdCh0KSlmb3IobGV0IG8gb2YgdCl7dHlwZW9mIHI9PSJmdW5jdGlvbiImJihvPXIuY2FsbCh0LFN0cmluZyhpKyspLG8pKTtsZXQgYSx1O2lmKEFycmF5LmlzQXJyYXkobykpaWYoby5sZW5ndGg9PT0yKWE9b1swXSx1PW9bMV07ZWxzZSB0aHJvdyBuZXcgVHlwZUVycm9yKGBFeHBlY3RlZCBba2V5LCB2YWx1ZV0gdHVwbGU6ICR7b31gKTtlbHNlIGlmKG8mJm8gaW5zdGFuY2VvZiBPYmplY3Qpe2xldCBsPU9iamVjdC5rZXlzKG8pO2lmKGwubGVuZ3RoPT09MSlhPWxbMF0sdT1vW2FdO2Vsc2UgdGhyb3cgbmV3IFR5cGVFcnJvcihgRXhwZWN0ZWQgdHVwbGUgd2l0aCBvbmUga2V5LCBub3QgJHtsLmxlbmd0aH0ga2V5c2ApfWVsc2UgYT1vO3MuaXRlbXMucHVzaCh4aChhLHUsbikpfXJldHVybiBzfXZhciBMaD17Y29sbGVjdGlvbjoic2VxIixkZWZhdWx0OiExLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6cGFpcnMiLHJlc29sdmU6UDIsY3JlYXRlTm9kZTpNMn0semw9Y2xhc3MgZEMgZXh0ZW5kcyBwc3tjb25zdHJ1Y3Rvcigpe3N1cGVyKCksdGhpcy5hZGQ9WXQucHJvdG90eXBlLmFkZC5iaW5kKHRoaXMpLHRoaXMuZGVsZXRlPVl0LnByb3RvdHlwZS5kZWxldGUuYmluZCh0aGlzKSx0aGlzLmdldD1ZdC5wcm90b3R5cGUuZ2V0LmJpbmQodGhpcyksdGhpcy5oYXM9WXQucHJvdG90eXBlLmhhcy5iaW5kKHRoaXMpLHRoaXMuc2V0PVl0LnByb3RvdHlwZS5zZXQuYmluZCh0aGlzKSx0aGlzLnRhZz1kQy50YWd9dG9KU09OKHQsbil7aWYoIW4pcmV0dXJuIHN1cGVyLnRvSlNPTih0KTtsZXQgcj1uZXcgTWFwO24hPW51bGwmJm4ub25DcmVhdGUmJm4ub25DcmVhdGUocik7Zm9yKGxldCBzIG9mIHRoaXMuaXRlbXMpe2xldCBpLG87aWYoVGUocyk/KGk9RW4ocy5rZXksIiIsbiksbz1FbihzLnZhbHVlLGksbikpOmk9RW4ocywiIixuKSxyLmhhcyhpKSl0aHJvdyBuZXcgRXJyb3IoIk9yZGVyZWQgbWFwcyBtdXN0IG5vdCBpbmNsdWRlIGR1cGxpY2F0ZSBrZXlzIik7ci5zZXQoaSxvKX1yZXR1cm4gcn1zdGF0aWMgZnJvbSh0LG4scil7bGV0IHM9TTIodCxuLHIpLGk9bmV3IHRoaXM7cmV0dXJuIGkuaXRlbXM9cy5pdGVtcyxpfX07emwudGFnPSJ0YWc6eWFtbC5vcmcsMjAwMjpvbWFwIjt2YXIgJGg9e2NvbGxlY3Rpb246InNlcSIsaWRlbnRpZnk6ZT0+ZSBpbnN0YW5jZW9mIE1hcCxub2RlQ2xhc3M6emwsZGVmYXVsdDohMSx0YWc6InRhZzp5YW1sLm9yZywyMDAyOm9tYXAiLHJlc29sdmUoZSx0KXtsZXQgbj1QMihlLHQpLHI9W107Zm9yKGxldHtrZXk6c31vZiBuLml0ZW1zKUVlKHMpJiYoci5pbmNsdWRlcyhzLnZhbHVlKT90KGBPcmRlcmVkIG1hcHMgbXVzdCBub3QgaW5jbHVkZSBkdXBsaWNhdGUga2V5czogJHtzLnZhbHVlfWApOnIucHVzaChzLnZhbHVlKSk7cmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IHpsLG4pfSxjcmVhdGVOb2RlOihlLHQsbik9PnpsLmZyb20oZSx0LG4pfTtmdW5jdGlvbiBPMih7dmFsdWU6ZSxzb3VyY2U6dH0sbil7cmV0dXJuIHQmJihlP1IyOmoyKS50ZXN0LnRlc3QodCk/dDplP24ub3B0aW9ucy50cnVlU3RyOm4ub3B0aW9ucy5mYWxzZVN0cn12YXIgUjI9e2lkZW50aWZ5OmU9PmU9PT0hMCxkZWZhdWx0OiEwLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6Ym9vbCIsdGVzdDovXig/Oll8eXxbWXldZXN8WUVTfFtUdF1ydWV8VFJVRXxbT29dbnxPTikkLyxyZXNvbHZlOigpPT5uZXcgcmUoITApLHN0cmluZ2lmeTpPMn0sajI9e2lkZW50aWZ5OmU9PmU9PT0hMSxkZWZhdWx0OiEwLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6Ym9vbCIsdGVzdDovXig/Ok58bnxbTm5db3xOT3xbRmZdYWxzZXxGQUxTRXxbT29dZmZ8T0ZGKSQvLHJlc29sdmU6KCk9Pm5ldyByZSghMSksc3RyaW5naWZ5Ok8yfSxMMz17aWRlbnRpZnk6ZT0+dHlwZW9mIGU9PSJudW1iZXIiLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCIsdGVzdDovXig/OlstK10/XC4oPzppbmZ8SW5mfElORil8XC5uYW58XC5OYU58XC5OQU4pJC8scmVzb2x2ZTplPT5lLnNsaWNlKC0zKS50b0xvd2VyQ2FzZSgpPT09Im5hbiI/TmFOOmVbMF09PT0iLSI/TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZOk51bWJlci5QT1NJVElWRV9JTkZJTklUWSxzdHJpbmdpZnk6Vm59LCQzPXtpZGVudGlmeTplPT50eXBlb2YgZT09Im51bWJlciIsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmZsb2F0Iixmb3JtYXQ6IkVYUCIsdGVzdDovXlstK10/KD86WzAtOV1bMC05X10qKT8oPzpcLlswLTlfXSopP1tlRV1bLStdP1swLTldKyQvLHJlc29sdmU6ZT0+cGFyc2VGbG9hdChlLnJlcGxhY2UoL18vZywiIikpLHN0cmluZ2lmeShlKXtsZXQgdD1OdW1iZXIoZS52YWx1ZSk7cmV0dXJuIGlzRmluaXRlKHQpP3QudG9FeHBvbmVudGlhbCgpOlZuKGUpfX0sQjM9e2lkZW50aWZ5OmU9PnR5cGVvZiBlPT0ibnVtYmVyIixkZWZhdWx0OiEwLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6ZmxvYXQiLHRlc3Q6L15bLStdPyg/OlswLTldWzAtOV9dKik/XC5bMC05X10qJC8scmVzb2x2ZShlKXtsZXQgdD1uZXcgcmUocGFyc2VGbG9hdChlLnJlcGxhY2UoL18vZywiIikpKSxuPWUuaW5kZXhPZigiLiIpO2lmKG4hPT0tMSl7bGV0IHI9ZS5zdWJzdHJpbmcobisxKS5yZXBsYWNlKC9fL2csIiIpO3Jbci5sZW5ndGgtMV09PT0iMCImJih0Lm1pbkZyYWN0aW9uRGlnaXRzPXIubGVuZ3RoKX1yZXR1cm4gdH0sc3RyaW5naWZ5OlZufSxQYT1lPT50eXBlb2YgZT09ImJpZ2ludCJ8fE51bWJlci5pc0ludGVnZXIoZSk7ZnVuY3Rpb24gR2woZSx0LG4se2ludEFzQmlnSW50OnJ9KXtsZXQgcz1lWzBdO2lmKChzPT09Ii0ifHxzPT09IisiKSYmKHQrPTEpLGU9ZS5zdWJzdHJpbmcodCkucmVwbGFjZSgvXy9nLCIiKSxyKXtzd2l0Y2gobil7Y2FzZSAyOmU9YDBiJHtlfWA7YnJlYWs7Y2FzZSA4OmU9YDBvJHtlfWA7YnJlYWs7Y2FzZSAxNjplPWAweCR7ZX1gO2JyZWFrfWxldCBvPUJpZ0ludChlKTtyZXR1cm4gcz09PSItIj9CaWdJbnQoLTEpKm86b31sZXQgaT1wYXJzZUludChlLG4pO3JldHVybiBzPT09Ii0iPy0xKmk6aX1mdW5jdGlvbiBCaChlLHQsbil7bGV0e3ZhbHVlOnJ9PWU7aWYoUGEocikpe2xldCBzPXIudG9TdHJpbmcodCk7cmV0dXJuIHI8MD8iLSIrbitzLnN1YnN0cigxKTpuK3N9cmV0dXJuIFZuKGUpfXZhciBfMz17aWRlbnRpZnk6UGEsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmludCIsZm9ybWF0OiJCSU4iLHRlc3Q6L15bLStdPzBiWzAtMV9dKyQvLHJlc29sdmU6KGUsdCxuKT0+R2woZSwyLDIsbiksc3RyaW5naWZ5OmU9PkJoKGUsMiwiMGIiKX0sSTM9e2lkZW50aWZ5OlBhLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjppbnQiLGZvcm1hdDoiT0NUIix0ZXN0Oi9eWy0rXT8wWzAtN19dKyQvLHJlc29sdmU6KGUsdCxuKT0+R2woZSwxLDgsbiksc3RyaW5naWZ5OmU9PkJoKGUsOCwiMCIpfSxQMz17aWRlbnRpZnk6UGEsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmludCIsdGVzdDovXlstK10/WzAtOV1bMC05X10qJC8scmVzb2x2ZTooZSx0LG4pPT5HbChlLDAsMTAsbiksc3RyaW5naWZ5OlZufSxNMz17aWRlbnRpZnk6UGEsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOmludCIsZm9ybWF0OiJIRVgiLHRlc3Q6L15bLStdPzB4WzAtOWEtZkEtRl9dKyQvLHJlc29sdmU6KGUsdCxuKT0+R2woZSwyLDE2LG4pLHN0cmluZ2lmeTplPT5CaChlLDE2LCIweCIpfSxLbD1jbGFzcyBtQyBleHRlbmRzIFl0e2NvbnN0cnVjdG9yKHQpe3N1cGVyKHQpLHRoaXMudGFnPW1DLnRhZ31hZGQodCl7bGV0IG47VGUodCk/bj10OnQmJnR5cGVvZiB0PT0ib2JqZWN0IiYmImtleSJpbiB0JiYidmFsdWUiaW4gdCYmdC52YWx1ZT09PW51bGw/bj1uZXcgVnQodC5rZXksbnVsbCk6bj1uZXcgVnQodCxudWxsKSxYcyh0aGlzLml0ZW1zLG4ua2V5KXx8dGhpcy5pdGVtcy5wdXNoKG4pfWdldCh0LG4pe2xldCByPVhzKHRoaXMuaXRlbXMsdCk7cmV0dXJuIW4mJlRlKHIpP0VlKHIua2V5KT9yLmtleS52YWx1ZTpyLmtleTpyfXNldCh0LG4pe2lmKHR5cGVvZiBuIT0iYm9vbGVhbiIpdGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCBib29sZWFuIHZhbHVlIGZvciBzZXQoa2V5LCB2YWx1ZSkgaW4gYSBZQU1MIHNldCwgbm90ICR7dHlwZW9mIG59YCk7bGV0IHI9WHModGhpcy5pdGVtcyx0KTtyJiYhbj90aGlzLml0ZW1zLnNwbGljZSh0aGlzLml0ZW1zLmluZGV4T2YociksMSk6IXImJm4mJnRoaXMuaXRlbXMucHVzaChuZXcgVnQodCkpfXRvSlNPTih0LG4pe3JldHVybiBzdXBlci50b0pTT04odCxuLFNldCl9dG9TdHJpbmcodCxuLHIpe2lmKCF0KXJldHVybiBKU09OLnN0cmluZ2lmeSh0aGlzKTtpZih0aGlzLmhhc0FsbE51bGxWYWx1ZXMoITApKXJldHVybiBzdXBlci50b1N0cmluZyhPYmplY3QuYXNzaWduKHt9LHQse2FsbE51bGxWYWx1ZXM6ITB9KSxuLHIpO3Rocm93IG5ldyBFcnJvcigiU2V0IGl0ZW1zIG11c3QgYWxsIGhhdmUgbnVsbCB2YWx1ZXMiKX1zdGF0aWMgZnJvbSh0LG4scil7bGV0e3JlcGxhY2VyOnN9PXIsaT1uZXcgdGhpcyh0KTtpZihuJiZTeW1ib2wuaXRlcmF0b3IgaW4gT2JqZWN0KG4pKWZvcihsZXQgbyBvZiBuKXR5cGVvZiBzPT0iZnVuY3Rpb24iJiYobz1zLmNhbGwobixvLG8pKSxpLml0ZW1zLnB1c2goeGgobyxudWxsLHIpKTtyZXR1cm4gaX19O0tsLnRhZz0idGFnOnlhbWwub3JnLDIwMDI6c2V0Ijt2YXIgX2g9e2NvbGxlY3Rpb246Im1hcCIsaWRlbnRpZnk6ZT0+ZSBpbnN0YW5jZW9mIFNldCxub2RlQ2xhc3M6S2wsZGVmYXVsdDohMSx0YWc6InRhZzp5YW1sLm9yZywyMDAyOnNldCIsY3JlYXRlTm9kZTooZSx0LG4pPT5LbC5mcm9tKGUsdCxuKSxyZXNvbHZlKGUsdCl7aWYoZnMoZSkpe2lmKGUuaGFzQWxsTnVsbFZhbHVlcyghMCkpcmV0dXJuIE9iamVjdC5hc3NpZ24obmV3IEtsLGUpO3QoIlNldCBpdGVtcyBtdXN0IGFsbCBoYXZlIG51bGwgdmFsdWVzIil9ZWxzZSB0KCJFeHBlY3RlZCBhIG1hcHBpbmcgZm9yIHRoaXMgdGFnIik7cmV0dXJuIGV9fTtmdW5jdGlvbiBJaChlLHQpe2xldCBuPWVbMF0scj1uPT09Ii0ifHxuPT09IisiP2Uuc3Vic3RyaW5nKDEpOmUscz1vPT50P0JpZ0ludChvKTpOdW1iZXIobyksaT1yLnJlcGxhY2UoL18vZywiIikuc3BsaXQoIjoiKS5yZWR1Y2UoKG8sYSk9Pm8qcyg2MCkrcyhhKSxzKDApKTtyZXR1cm4gbj09PSItIj9zKC0xKSppOml9ZnVuY3Rpb24gVjIoZSl7bGV0e3ZhbHVlOnR9PWUsbj1vPT5vO2lmKHR5cGVvZiB0PT0iYmlnaW50IiluPW89PkJpZ0ludChvKTtlbHNlIGlmKGlzTmFOKHQpfHwhaXNGaW5pdGUodCkpcmV0dXJuIFZuKGUpO2xldCByPSIiO3Q8MCYmKHI9Ii0iLHQqPW4oLTEpKTtsZXQgcz1uKDYwKSxpPVt0JXNdO3JldHVybiB0PDYwP2kudW5zaGlmdCgwKToodD0odC1pWzBdKS9zLGkudW5zaGlmdCh0JXMpLHQ+PTYwJiYodD0odC1pWzBdKS9zLGkudW5zaGlmdCh0KSkpLHIraS5tYXAobz0+U3RyaW5nKG8pLnBhZFN0YXJ0KDIsIjAiKSkuam9pbigiOiIpLnJlcGxhY2UoLzAwMDAwMFxkKiQvLCIiKX12YXIgVTI9e2lkZW50aWZ5OmU9PnR5cGVvZiBlPT0iYmlnaW50Inx8TnVtYmVyLmlzSW50ZWdlcihlKSxkZWZhdWx0OiEwLHRhZzoidGFnOnlhbWwub3JnLDIwMDI6aW50Iixmb3JtYXQ6IlRJTUUiLHRlc3Q6L15bLStdP1swLTldWzAtOV9dKig/OjpbMC01XT9bMC05XSkrJC8scmVzb2x2ZTooZSx0LHtpbnRBc0JpZ0ludDpufSk9PkloKGUsbiksc3RyaW5naWZ5OlYyfSxxMj17aWRlbnRpZnk6ZT0+dHlwZW9mIGU9PSJudW1iZXIiLGRlZmF1bHQ6ITAsdGFnOiJ0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCIsZm9ybWF0OiJUSU1FIix0ZXN0Oi9eWy0rXT9bMC05XVswLTlfXSooPzo6WzAtNV0/WzAtOV0pK1wuWzAtOV9dKiQvLHJlc29sdmU6ZT0+SWgoZSwhMSksc3RyaW5naWZ5OlYyfSxYbD17aWRlbnRpZnk6ZT0+ZSBpbnN0YW5jZW9mIERhdGUsZGVmYXVsdDohMCx0YWc6InRhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCIsdGVzdDpSZWdFeHAoIl4oWzAtOV17NH0pLShbMC05XXsxLDJ9KS0oWzAtOV17MSwyfSkoPzooPzp0fFR8WyBcXHRdKykoWzAtOV17MSwyfSk6KFswLTldezEsMn0pOihbMC05XXsxLDJ9KFxcLlswLTldKyk/KSg/OlsgXFx0XSooWnxbLStdWzAxMl0/WzAtOV0oPzo6WzAtOV17Mn0pPykpPyk/JCIpLHJlc29sdmUoZSl7bGV0IHQ9ZS5tYXRjaChYbC50ZXN0KTtpZighdCl0aHJvdyBuZXcgRXJyb3IoIiEhdGltZXN0YW1wIGV4cGVjdHMgYSBkYXRlLCBzdGFydGluZyB3aXRoIHl5eXktbW0tZGQiKTtsZXRbLG4scixzLGksbyxhXT10Lm1hcChOdW1iZXIpLHU9dFs3XT9OdW1iZXIoKHRbN10rIjAwIikuc3Vic3RyKDEsMykpOjAsbD1EYXRlLlVUQyhuLHItMSxzLGl8fDAsb3x8MCxhfHwwLHUpLGY9dFs4XTtpZihmJiZmIT09IloiKXtsZXQgYz1JaChmLCExKTtNYXRoLmFicyhjKTwzMCYmKGMqPTYwKSxsLT02ZTQqY31yZXR1cm4gbmV3IERhdGUobCl9LHN0cmluZ2lmeTooe3ZhbHVlOmV9KT0+KGU9PW51bGw/dm9pZCAwOmUudG9JU09TdHJpbmcoKS5yZXBsYWNlKC8oVDAwOjAwOjAwKT9cLjAwMFokLywiIikpPz8iIn0sVzI9W2hvLG1vLHFsLFdsLFIyLGoyLF8zLEkzLFAzLE0zLEwzLCQzLEIzLE5oLENyLCRoLExoLF9oLFUyLHEyLFhsXSxIMj1uZXcgTWFwKFtbImNvcmUiLHgzXSxbImZhaWxzYWZlIixbaG8sbW8scWxdXSxbImpzb24iLE4zXSxbInlhbWwxMSIsVzJdLFsieWFtbC0xLjEiLFcyXV0pLEoyPXtiaW5hcnk6TmgsYm9vbDpraCxmbG9hdDpOMixmbG9hdEV4cDpUMixmbG9hdE5hTjprMixmbG9hdFRpbWU6cTIsaW50OkIyLGludEhleDpfMixpbnRPY3Q6JDIsaW50VGltZTpVMixtYXA6aG8sbWVyZ2U6Q3IsbnVsbDpXbCxvbWFwOiRoLHBhaXJzOkxoLHNlcTptbyxzZXQ6X2gsdGltZXN0YW1wOlhsfSxPMz17InRhZzp5YW1sLm9yZywyMDAyOmJpbmFyeSI6TmgsInRhZzp5YW1sLm9yZywyMDAyOm1lcmdlIjpDciwidGFnOnlhbWwub3JnLDIwMDI6b21hcCI6JGgsInRhZzp5YW1sLm9yZywyMDAyOnBhaXJzIjpMaCwidGFnOnlhbWwub3JnLDIwMDI6c2V0IjpfaCwidGFnOnlhbWwub3JnLDIwMDI6dGltZXN0YW1wIjpYbH07ZnVuY3Rpb24gUGgoZSx0LG4pe2xldCByPUgyLmdldCh0KTtpZihyJiYhZSlyZXR1cm4gbiYmIXIuaW5jbHVkZXMoQ3IpP3IuY29uY2F0KENyKTpyLnNsaWNlKCk7bGV0IHM9cjtpZighcylpZihBcnJheS5pc0FycmF5KGUpKXM9W107ZWxzZXtsZXQgaT1BcnJheS5mcm9tKEgyLmtleXMoKSkuZmlsdGVyKG89Pm8hPT0ieWFtbDExIikubWFwKG89PkpTT04uc3RyaW5naWZ5KG8pKS5qb2luKCIsICIpO3Rocm93IG5ldyBFcnJvcihgVW5rbm93biBzY2hlbWEgIiR7dH0iOyB1c2Ugb25lIG9mICR7aX0gb3IgZGVmaW5lIGN1c3RvbVRhZ3MgYXJyYXlgKX1pZihBcnJheS5pc0FycmF5KGUpKWZvcihsZXQgaSBvZiBlKXM9cy5jb25jYXQoaSk7ZWxzZSB0eXBlb2YgZT09ImZ1bmN0aW9uIiYmKHM9ZShzLnNsaWNlKCkpKTtyZXR1cm4gbiYmKHM9cy5jb25jYXQoQ3IpKSxzLnJlZHVjZSgoaSxvKT0+e2xldCBhPXR5cGVvZiBvPT0ic3RyaW5nIj9KMltvXTpvO2lmKCFhKXtsZXQgdT1KU09OLnN0cmluZ2lmeShvKSxsPU9iamVjdC5rZXlzKEoyKS5tYXAoZj0+SlNPTi5zdHJpbmdpZnkoZikpLmpvaW4oIiwgIik7dGhyb3cgbmV3IEVycm9yKGBVbmtub3duIGN1c3RvbSB0YWcgJHt1fTsgdXNlIG9uZSBvZiAke2x9YCl9cmV0dXJuIGkuaW5jbHVkZXMoYSl8fGkucHVzaChhKSxpfSxbXSl9dmFyIFIzPShlLHQpPT5lLmtleTx0LmtleT8tMTplLmtleT50LmtleT8xOjAsejI9Y2xhc3MgZ0N7Y29uc3RydWN0b3Ioe2NvbXBhdDp0LGN1c3RvbVRhZ3M6bixtZXJnZTpyLHJlc29sdmVLbm93blRhZ3M6cyxzY2hlbWE6aSxzb3J0TWFwRW50cmllczpvLHRvU3RyaW5nRGVmYXVsdHM6YX0pe3RoaXMuY29tcGF0PUFycmF5LmlzQXJyYXkodCk/UGgodCwiY29tcGF0Iik6dD9QaChudWxsLHQpOm51bGwsdGhpcy5uYW1lPXR5cGVvZiBpPT0ic3RyaW5nIiYmaXx8ImNvcmUiLHRoaXMua25vd25UYWdzPXM/TzM6e30sdGhpcy50YWdzPVBoKG4sdGhpcy5uYW1lLHIpLHRoaXMudG9TdHJpbmdPcHRpb25zPWE/P251bGwsT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsbHMse3ZhbHVlOmhvfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMscnIse3ZhbHVlOnFsfSksT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsb28se3ZhbHVlOm1vfSksdGhpcy5zb3J0TWFwRW50cmllcz10eXBlb2Ygbz09ImZ1bmN0aW9uIj9vOm89PT0hMD9SMzpudWxsfWNsb25lKCl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShnQy5wcm90b3R5cGUsT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcnModGhpcykpO3JldHVybiB0LnRhZ3M9dGhpcy50YWdzLnNsaWNlKCksdH19O2Z1bmN0aW9uIGozKGUsdCl7dmFyIHU7bGV0IG49W10scj10LmRpcmVjdGl2ZXM9PT0hMDtpZih0LmRpcmVjdGl2ZXMhPT0hMSYmZS5kaXJlY3RpdmVzKXtsZXQgbD1lLmRpcmVjdGl2ZXMudG9TdHJpbmcoZSk7bD8obi5wdXNoKGwpLHI9ITApOmUuZGlyZWN0aXZlcy5kb2NTdGFydCYmKHI9ITApfXImJm4ucHVzaCgiLS0tIik7bGV0IHM9RjIoZSx0KSx7Y29tbWVudFN0cmluZzppfT1zLm9wdGlvbnM7aWYoZS5jb21tZW50QmVmb3JlKXtuLmxlbmd0aCE9PTEmJm4udW5zaGlmdCgiIik7bGV0IGw9aShlLmNvbW1lbnRCZWZvcmUpO24udW5zaGlmdCh3cihsLCIiKSl9bGV0IG89ITEsYT1udWxsO2lmKGUuY29udGVudHMpe2lmKFVlKGUuY29udGVudHMpKXtpZihlLmNvbnRlbnRzLnNwYWNlQmVmb3JlJiZyJiZuLnB1c2goIiIpLGUuY29udGVudHMuY29tbWVudEJlZm9yZSl7bGV0IGM9aShlLmNvbnRlbnRzLmNvbW1lbnRCZWZvcmUpO24ucHVzaCh3cihjLCIiKSl9cy5mb3JjZUJsb2NrSW5kZW50PSEhZS5jb21tZW50LGE9ZS5jb250ZW50cy5jb21tZW50fWxldCBsPWE/dm9pZCAwOigpPT5vPSEwLGY9cG8oZS5jb250ZW50cyxzLCgpPT5hPW51bGwsbCk7YSYmKGYrPUtzKGYsIiIsaShhKSkpLChmWzBdPT09InwifHxmWzBdPT09Ij4iKSYmbltuLmxlbmd0aC0xXT09PSItLS0iP25bbi5sZW5ndGgtMV09YC0tLSAke2Z9YDpuLnB1c2goZil9ZWxzZSBuLnB1c2gocG8oZS5jb250ZW50cyxzKSk7aWYoKHU9ZS5kaXJlY3RpdmVzKSE9bnVsbCYmdS5kb2NFbmQpaWYoZS5jb21tZW50KXtsZXQgbD1pKGUuY29tbWVudCk7bC5pbmNsdWRlcyhgCmApPyhuLnB1c2goIi4uLiIpLG4ucHVzaCh3cihsLCIiKSkpOm4ucHVzaChgLi4uICR7bH1gKX1lbHNlIG4ucHVzaCgiLi4uIik7ZWxzZXtsZXQgbD1lLmNvbW1lbnQ7bCYmbyYmKGw9bC5yZXBsYWNlKC9eXG4rLywiIikpLGwmJigoIW98fGEpJiZuW24ubGVuZ3RoLTFdIT09IiImJm4ucHVzaCgiIiksbi5wdXNoKHdyKGkobCksIiIpKSl9cmV0dXJuIG4uam9pbihgCmApK2AKYH12YXIgWWw9Y2xhc3MgeUN7Y29uc3RydWN0b3IodCxuLHIpe3RoaXMuY29tbWVudEJlZm9yZT1udWxsLHRoaXMuY29tbWVudD1udWxsLHRoaXMuZXJyb3JzPVtdLHRoaXMud2FybmluZ3M9W10sT2JqZWN0LmRlZmluZVByb3BlcnR5KHRoaXMsYm4se3ZhbHVlOnZofSk7bGV0IHM9bnVsbDt0eXBlb2Ygbj09ImZ1bmN0aW9uInx8QXJyYXkuaXNBcnJheShuKT9zPW46cj09PXZvaWQgMCYmbiYmKHI9bixuPXZvaWQgMCk7bGV0IGk9T2JqZWN0LmFzc2lnbih7aW50QXNCaWdJbnQ6ITEsa2VlcFNvdXJjZVRva2VuczohMSxsb2dMZXZlbDoid2FybiIscHJldHR5RXJyb3JzOiEwLHN0cmljdDohMCxzdHJpbmdLZXlzOiExLHVuaXF1ZUtleXM6ITAsdmVyc2lvbjoiMS4yIn0scik7dGhpcy5vcHRpb25zPWk7bGV0e3ZlcnNpb246b309aTtyIT1udWxsJiZyLl9kaXJlY3RpdmVzPyh0aGlzLmRpcmVjdGl2ZXM9ci5fZGlyZWN0aXZlcy5hdERvY3VtZW50KCksdGhpcy5kaXJlY3RpdmVzLnlhbWwuZXhwbGljaXQmJihvPXRoaXMuZGlyZWN0aXZlcy55YW1sLnZlcnNpb24pKTp0aGlzLmRpcmVjdGl2ZXM9bmV3IGxvKHt2ZXJzaW9uOm99KSx0aGlzLnNldFNjaGVtYShvLHIpLHRoaXMuY29udGVudHM9dD09PXZvaWQgMD9udWxsOnRoaXMuY3JlYXRlTm9kZSh0LHMscil9Y2xvbmUoKXtsZXQgdD1PYmplY3QuY3JlYXRlKHlDLnByb3RvdHlwZSx7W2JuXTp7dmFsdWU6dmh9fSk7cmV0dXJuIHQuY29tbWVudEJlZm9yZT10aGlzLmNvbW1lbnRCZWZvcmUsdC5jb21tZW50PXRoaXMuY29tbWVudCx0LmVycm9ycz10aGlzLmVycm9ycy5zbGljZSgpLHQud2FybmluZ3M9dGhpcy53YXJuaW5ncy5zbGljZSgpLHQub3B0aW9ucz1PYmplY3QuYXNzaWduKHt9LHRoaXMub3B0aW9ucyksdGhpcy5kaXJlY3RpdmVzJiYodC5kaXJlY3RpdmVzPXRoaXMuZGlyZWN0aXZlcy5jbG9uZSgpKSx0LnNjaGVtYT10aGlzLnNjaGVtYS5jbG9uZSgpLHQuY29udGVudHM9VWUodGhpcy5jb250ZW50cyk/dGhpcy5jb250ZW50cy5jbG9uZSh0LnNjaGVtYSk6dGhpcy5jb250ZW50cyx0aGlzLnJhbmdlJiYodC5yYW5nZT10aGlzLnJhbmdlLnNsaWNlKCkpLHR9YWRkKHQpe2dvKHRoaXMuY29udGVudHMpJiZ0aGlzLmNvbnRlbnRzLmFkZCh0KX1hZGRJbih0LG4pe2dvKHRoaXMuY29udGVudHMpJiZ0aGlzLmNvbnRlbnRzLmFkZEluKHQsbil9Y3JlYXRlQWxpYXModCxuKXtpZighdC5hbmNob3Ipe2xldCByPWcyKHRoaXMpO3QuYW5jaG9yPSFufHxyLmhhcyhuKT95MihufHwiYSIscik6bn1yZXR1cm4gbmV3ICRsKHQuYW5jaG9yKX1jcmVhdGVOb2RlKHQsbixyKXtsZXQgcztpZih0eXBlb2Ygbj09ImZ1bmN0aW9uIil0PW4uY2FsbCh7IiI6dH0sIiIsdCkscz1uO2Vsc2UgaWYoQXJyYXkuaXNBcnJheShuKSl7bGV0IGc9Yj0+dHlwZW9mIGI9PSJudW1iZXIifHxiIGluc3RhbmNlb2YgU3RyaW5nfHxiIGluc3RhbmNlb2YgTnVtYmVyLEQ9bi5maWx0ZXIoZykubWFwKFN0cmluZyk7RC5sZW5ndGg+MCYmKG49bi5jb25jYXQoRCkpLHM9bn1lbHNlIHI9PT12b2lkIDAmJm4mJihyPW4sbj12b2lkIDApO2xldHthbGlhc0R1cGxpY2F0ZU9iamVjdHM6aSxhbmNob3JQcmVmaXg6byxmbG93OmEsa2VlcFVuZGVmaW5lZDp1LG9uVGFnT2JqOmwsdGFnOmZ9PXI/P3t9LHtvbkFuY2hvcjpjLHNldEFuY2hvcnM6cCxzb3VyY2VPYmplY3RzOmh9PWQzKHRoaXMsb3x8ImEiKSxkPXthbGlhc0R1cGxpY2F0ZU9iamVjdHM6aT8/ITAsa2VlcFVuZGVmaW5lZDp1Pz8hMSxvbkFuY2hvcjpjLG9uVGFnT2JqOmwscmVwbGFjZXI6cyxzY2hlbWE6dGhpcy5zY2hlbWEsc291cmNlT2JqZWN0czpofSxtPSRhKHQsZixkKTtyZXR1cm4gYSYmVmUobSkmJihtLmZsb3c9ITApLHAoKSxtfWNyZWF0ZVBhaXIodCxuLHI9e30pe2xldCBzPXRoaXMuY3JlYXRlTm9kZSh0LG51bGwsciksaT10aGlzLmNyZWF0ZU5vZGUobixudWxsLHIpO3JldHVybiBuZXcgVnQocyxpKX1kZWxldGUodCl7cmV0dXJuIGdvKHRoaXMuY29udGVudHMpP3RoaXMuY29udGVudHMuZGVsZXRlKHQpOiExfWRlbGV0ZUluKHQpe3JldHVybiBCYSh0KT90aGlzLmNvbnRlbnRzPT1udWxsPyExOih0aGlzLmNvbnRlbnRzPW51bGwsITApOmdvKHRoaXMuY29udGVudHMpP3RoaXMuY29udGVudHMuZGVsZXRlSW4odCk6ITF9Z2V0KHQsbil7cmV0dXJuIFZlKHRoaXMuY29udGVudHMpP3RoaXMuY29udGVudHMuZ2V0KHQsbik6dm9pZCAwfWdldEluKHQsbil7cmV0dXJuIEJhKHQpPyFuJiZFZSh0aGlzLmNvbnRlbnRzKT90aGlzLmNvbnRlbnRzLnZhbHVlOnRoaXMuY29udGVudHM6VmUodGhpcy5jb250ZW50cyk/dGhpcy5jb250ZW50cy5nZXRJbih0LG4pOnZvaWQgMH1oYXModCl7cmV0dXJuIFZlKHRoaXMuY29udGVudHMpP3RoaXMuY29udGVudHMuaGFzKHQpOiExfWhhc0luKHQpe3JldHVybiBCYSh0KT90aGlzLmNvbnRlbnRzIT09dm9pZCAwOlZlKHRoaXMuY29udGVudHMpP3RoaXMuY29udGVudHMuaGFzSW4odCk6ITF9c2V0KHQsbil7dGhpcy5jb250ZW50cz09bnVsbD90aGlzLmNvbnRlbnRzPV9sKHRoaXMuc2NoZW1hLFt0XSxuKTpnbyh0aGlzLmNvbnRlbnRzKSYmdGhpcy5jb250ZW50cy5zZXQodCxuKX1zZXRJbih0LG4pe0JhKHQpP3RoaXMuY29udGVudHM9bjp0aGlzLmNvbnRlbnRzPT1udWxsP3RoaXMuY29udGVudHM9X2wodGhpcy5zY2hlbWEsQXJyYXkuZnJvbSh0KSxuKTpnbyh0aGlzLmNvbnRlbnRzKSYmdGhpcy5jb250ZW50cy5zZXRJbih0LG4pfXNldFNjaGVtYSh0LG49e30pe3R5cGVvZiB0PT0ibnVtYmVyIiYmKHQ9U3RyaW5nKHQpKTtsZXQgcjtzd2l0Y2godCl7Y2FzZSIxLjEiOnRoaXMuZGlyZWN0aXZlcz90aGlzLmRpcmVjdGl2ZXMueWFtbC52ZXJzaW9uPSIxLjEiOnRoaXMuZGlyZWN0aXZlcz1uZXcgbG8oe3ZlcnNpb246IjEuMSJ9KSxyPXtyZXNvbHZlS25vd25UYWdzOiExLHNjaGVtYToieWFtbC0xLjEifTticmVhaztjYXNlIjEuMiI6Y2FzZSJuZXh0Ijp0aGlzLmRpcmVjdGl2ZXM/dGhpcy5kaXJlY3RpdmVzLnlhbWwudmVyc2lvbj10OnRoaXMuZGlyZWN0aXZlcz1uZXcgbG8oe3ZlcnNpb246dH0pLHI9e3Jlc29sdmVLbm93blRhZ3M6ITAsc2NoZW1hOiJjb3JlIn07YnJlYWs7Y2FzZSBudWxsOnRoaXMuZGlyZWN0aXZlcyYmZGVsZXRlIHRoaXMuZGlyZWN0aXZlcyxyPW51bGw7YnJlYWs7ZGVmYXVsdDp7bGV0IHM9SlNPTi5zdHJpbmdpZnkodCk7dGhyb3cgbmV3IEVycm9yKGBFeHBlY3RlZCAnMS4xJywgJzEuMicgb3IgbnVsbCBhcyBmaXJzdCBhcmd1bWVudCwgYnV0IGZvdW5kOiAke3N9YCl9fWlmKG4uc2NoZW1hIGluc3RhbmNlb2YgT2JqZWN0KXRoaXMuc2NoZW1hPW4uc2NoZW1hO2Vsc2UgaWYocil0aGlzLnNjaGVtYT1uZXcgejIoT2JqZWN0LmFzc2lnbihyLG4pKTtlbHNlIHRocm93IG5ldyBFcnJvcigiV2l0aCBhIG51bGwgWUFNTCB2ZXJzaW9uLCB0aGUgeyBzY2hlbWE6IFNjaGVtYSB9IG9wdGlvbiBpcyByZXF1aXJlZCIpfXRvSlMoe2pzb246dCxqc29uQXJnOm4sbWFwQXNNYXA6cixtYXhBbGlhc0NvdW50OnMsb25BbmNob3I6aSxyZXZpdmVyOm99PXt9KXtsZXQgYT17YW5jaG9yczpuZXcgTWFwLGRvYzp0aGlzLGtlZXA6IXQsbWFwQXNNYXA6cj09PSEwLG1hcEtleVdhcm5lZDohMSxtYXhBbGlhc0NvdW50OnR5cGVvZiBzPT0ibnVtYmVyIj9zOjEwMH0sdT1Fbih0aGlzLmNvbnRlbnRzLG4/PyIiLGEpO2lmKHR5cGVvZiBpPT0iZnVuY3Rpb24iKWZvcihsZXR7Y291bnQ6bCxyZXM6Zn1vZiBhLmFuY2hvcnMudmFsdWVzKCkpaShmLGwpO3JldHVybiB0eXBlb2Ygbz09ImZ1bmN0aW9uIj9jbyhvLHsiIjp1fSwiIix1KTp1fXRvSlNPTih0LG4pe3JldHVybiB0aGlzLnRvSlMoe2pzb246ITAsanNvbkFyZzp0LG1hcEFzTWFwOiExLG9uQW5jaG9yOm59KX10b1N0cmluZyh0PXt9KXtpZih0aGlzLmVycm9ycy5sZW5ndGg+MCl0aHJvdyBuZXcgRXJyb3IoIkRvY3VtZW50IHdpdGggZXJyb3JzIGNhbm5vdCBiZSBzdHJpbmdpZmllZCIpO2lmKCJpbmRlbnQiaW4gdCYmKCFOdW1iZXIuaXNJbnRlZ2VyKHQuaW5kZW50KXx8TnVtYmVyKHQuaW5kZW50KTw9MCkpe2xldCBuPUpTT04uc3RyaW5naWZ5KHQuaW5kZW50KTt0aHJvdyBuZXcgRXJyb3IoYCJpbmRlbnQiIG9wdGlvbiBtdXN0IGJlIGEgcG9zaXRpdmUgaW50ZWdlciwgbm90ICR7bn1gKX1yZXR1cm4gajModGhpcyx0KX19O2Z1bmN0aW9uIGdvKGUpe2lmKFZlKGUpKXJldHVybiEwO3Rocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgYSBZQU1MIGNvbGxlY3Rpb24gYXMgZG9jdW1lbnQgY29udGVudHMiKX12YXIgTWg9Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcih0LG4scixzKXtzdXBlcigpLHRoaXMubmFtZT10LHRoaXMuY29kZT1yLHRoaXMubWVzc2FnZT1zLHRoaXMucG9zPW59fSxZcz1jbGFzcyBleHRlbmRzIE1oe2NvbnN0cnVjdG9yKHQsbixyKXtzdXBlcigiWUFNTFBhcnNlRXJyb3IiLHQsbixyKX19LEcyPWNsYXNzIGV4dGVuZHMgTWh7Y29uc3RydWN0b3IodCxuLHIpe3N1cGVyKCJZQU1MV2FybmluZyIsdCxuLHIpfX0sUWw9KGUsdCk9Pm49PntpZihuLnBvc1swXT09PS0xKXJldHVybjtuLmxpbmVQb3M9bi5wb3MubWFwKGE9PnQubGluZVBvcyhhKSk7bGV0e2xpbmU6cixjb2w6c309bi5saW5lUG9zWzBdO24ubWVzc2FnZSs9YCBhdCBsaW5lICR7cn0sIGNvbHVtbiAke3N9YDtsZXQgaT1zLTEsbz1lLnN1YnN0cmluZyh0LmxpbmVTdGFydHNbci0xXSx0LmxpbmVTdGFydHNbcl0pLnJlcGxhY2UoL1tcblxyXSskLywiIik7aWYoaT49NjAmJm8ubGVuZ3RoPjgwKXtsZXQgYT1NYXRoLm1pbihpLTM5LG8ubGVuZ3RoLTc5KTtvPSLigKYiK28uc3Vic3RyaW5nKGEpLGktPWEtMX1pZihvLmxlbmd0aD44MCYmKG89by5zdWJzdHJpbmcoMCw3OSkrIuKApiIpLHI+MSYmL14gKiQvLnRlc3Qoby5zdWJzdHJpbmcoMCxpKSkpe2xldCBhPWUuc3Vic3RyaW5nKHQubGluZVN0YXJ0c1tyLTJdLHQubGluZVN0YXJ0c1tyLTFdKTthLmxlbmd0aD44MCYmKGE9YS5zdWJzdHJpbmcoMCw3OSkrYOKApgpgKSxvPWErb31pZigvW14gXS8udGVzdChvKSl7bGV0IGE9MSx1PW4ubGluZVBvc1sxXTsodT09bnVsbD92b2lkIDA6dS5saW5lKT09PXImJnUuY29sPnMmJihhPU1hdGgubWF4KDEsTWF0aC5taW4odS5jb2wtcyw4MC1pKSkpO2xldCBsPSIgIi5yZXBlYXQoaSkrIl4iLnJlcGVhdChhKTtuLm1lc3NhZ2UrPWA6Cgoke299CiR7bH0KYH19O2Z1bmN0aW9uIHlvKGUse2Zsb3c6dCxpbmRpY2F0b3I6bixuZXh0OnIsb2Zmc2V0OnMsb25FcnJvcjppLHBhcmVudEluZGVudDpvLHN0YXJ0T25OZXdsaW5lOmF9KXtsZXQgdT0hMSxsPWEsZj1hLGM9IiIscD0iIixoPSExLGQ9ITEsbT1udWxsLGc9bnVsbCxEPW51bGwsYj1udWxsLEU9bnVsbCxGPW51bGwsdj1udWxsO2ZvcihsZXQgdyBvZiBlKXN3aXRjaChkJiYody50eXBlIT09InNwYWNlIiYmdy50eXBlIT09Im5ld2xpbmUiJiZ3LnR5cGUhPT0iY29tbWEiJiZpKHcub2Zmc2V0LCJNSVNTSU5HX0NIQVIiLCJUYWdzIGFuZCBhbmNob3JzIG11c3QgYmUgc2VwYXJhdGVkIGZyb20gdGhlIG5leHQgdG9rZW4gYnkgd2hpdGUgc3BhY2UiKSxkPSExKSxtJiYobCYmdy50eXBlIT09ImNvbW1lbnQiJiZ3LnR5cGUhPT0ibmV3bGluZSImJmkobSwiVEFCX0FTX0lOREVOVCIsIlRhYnMgYXJlIG5vdCBhbGxvd2VkIGFzIGluZGVudGF0aW9uIiksbT1udWxsKSx3LnR5cGUpe2Nhc2Uic3BhY2UiOiF0JiYobiE9PSJkb2Mtc3RhcnQifHwocj09bnVsbD92b2lkIDA6ci50eXBlKSE9PSJmbG93LWNvbGxlY3Rpb24iKSYmdy5zb3VyY2UuaW5jbHVkZXMoIgkiKSYmKG09dyksZj0hMDticmVhaztjYXNlImNvbW1lbnQiOntmfHxpKHcsIk1JU1NJTkdfQ0hBUiIsIkNvbW1lbnRzIG11c3QgYmUgc2VwYXJhdGVkIGZyb20gb3RoZXIgdG9rZW5zIGJ5IHdoaXRlIHNwYWNlIGNoYXJhY3RlcnMiKTtsZXQgVD13LnNvdXJjZS5zdWJzdHJpbmcoMSl8fCIgIjtjP2MrPXArVDpjPVQscD0iIixsPSExO2JyZWFrfWNhc2UibmV3bGluZSI6bD9jP2MrPXcuc291cmNlOighRnx8biE9PSJzZXEtaXRlbS1pbmQiKSYmKHU9ITApOnArPXcuc291cmNlLGw9ITAsaD0hMCwoZ3x8RCkmJihiPXcpLGY9ITA7YnJlYWs7Y2FzZSJhbmNob3IiOmcmJmkodywiTVVMVElQTEVfQU5DSE9SUyIsIkEgbm9kZSBjYW4gaGF2ZSBhdCBtb3N0IG9uZSBhbmNob3IiKSx3LnNvdXJjZS5lbmRzV2l0aCgiOiIpJiZpKHcub2Zmc2V0K3cuc291cmNlLmxlbmd0aC0xLCJCQURfQUxJQVMiLCJBbmNob3IgZW5kaW5nIGluIDogaXMgYW1iaWd1b3VzIiwhMCksZz13LHY/Pyh2PXcub2Zmc2V0KSxsPSExLGY9ITEsZD0hMDticmVhaztjYXNlInRhZyI6e0QmJmkodywiTVVMVElQTEVfVEFHUyIsIkEgbm9kZSBjYW4gaGF2ZSBhdCBtb3N0IG9uZSB0YWciKSxEPXcsdj8/KHY9dy5vZmZzZXQpLGw9ITEsZj0hMSxkPSEwO2JyZWFrfWNhc2UgbjooZ3x8RCkmJmkodywiQkFEX1BST1BfT1JERVIiLGBBbmNob3JzIGFuZCB0YWdzIG11c3QgYmUgYWZ0ZXIgdGhlICR7dy5zb3VyY2V9IGluZGljYXRvcmApLEYmJmkodywiVU5FWFBFQ1RFRF9UT0tFTiIsYFVuZXhwZWN0ZWQgJHt3LnNvdXJjZX0gaW4gJHt0Pz8iY29sbGVjdGlvbiJ9YCksRj13LGw9bj09PSJzZXEtaXRlbS1pbmQifHxuPT09ImV4cGxpY2l0LWtleS1pbmQiLGY9ITE7YnJlYWs7Y2FzZSJjb21tYSI6aWYodCl7RSYmaSh3LCJVTkVYUEVDVEVEX1RPS0VOIixgVW5leHBlY3RlZCAsIGluICR7dH1gKSxFPXcsbD0hMSxmPSExO2JyZWFrfWRlZmF1bHQ6aSh3LCJVTkVYUEVDVEVEX1RPS0VOIixgVW5leHBlY3RlZCAke3cudHlwZX0gdG9rZW5gKSxsPSExLGY9ITF9bGV0IEM9ZVtlLmxlbmd0aC0xXSxBPUM/Qy5vZmZzZXQrQy5zb3VyY2UubGVuZ3RoOnM7cmV0dXJuIGQmJnImJnIudHlwZSE9PSJzcGFjZSImJnIudHlwZSE9PSJuZXdsaW5lIiYmci50eXBlIT09ImNvbW1hIiYmKHIudHlwZSE9PSJzY2FsYXIifHxyLnNvdXJjZSE9PSIiKSYmaShyLm9mZnNldCwiTUlTU0lOR19DSEFSIiwiVGFncyBhbmQgYW5jaG9ycyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIHRoZSBuZXh0IHRva2VuIGJ5IHdoaXRlIHNwYWNlIiksbSYmKGwmJm0uaW5kZW50PD1vfHwocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJibG9jay1tYXAifHwocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJibG9jay1zZXEiKSYmaShtLCJUQUJfQVNfSU5ERU5UIiwiVGFicyBhcmUgbm90IGFsbG93ZWQgYXMgaW5kZW50YXRpb24iKSx7Y29tbWE6RSxmb3VuZDpGLHNwYWNlQmVmb3JlOnUsY29tbWVudDpjLGhhc05ld2xpbmU6aCxhbmNob3I6Zyx0YWc6RCxuZXdsaW5lQWZ0ZXJQcm9wOmIsZW5kOkEsc3RhcnQ6dj8/QX19ZnVuY3Rpb24gTWEoZSl7aWYoIWUpcmV0dXJuIG51bGw7c3dpdGNoKGUudHlwZSl7Y2FzZSJhbGlhcyI6Y2FzZSJzY2FsYXIiOmNhc2UiZG91YmxlLXF1b3RlZC1zY2FsYXIiOmNhc2Uic2luZ2xlLXF1b3RlZC1zY2FsYXIiOmlmKGUuc291cmNlLmluY2x1ZGVzKGAKYCkpcmV0dXJuITA7aWYoZS5lbmQpe2ZvcihsZXQgdCBvZiBlLmVuZClpZih0LnR5cGU9PT0ibmV3bGluZSIpcmV0dXJuITB9cmV0dXJuITE7Y2FzZSJmbG93LWNvbGxlY3Rpb24iOmZvcihsZXQgdCBvZiBlLml0ZW1zKXtmb3IobGV0IG4gb2YgdC5zdGFydClpZihuLnR5cGU9PT0ibmV3bGluZSIpcmV0dXJuITA7aWYodC5zZXApe2ZvcihsZXQgbiBvZiB0LnNlcClpZihuLnR5cGU9PT0ibmV3bGluZSIpcmV0dXJuITB9aWYoTWEodC5rZXkpfHxNYSh0LnZhbHVlKSlyZXR1cm4hMH1yZXR1cm4hMTtkZWZhdWx0OnJldHVybiEwfX1mdW5jdGlvbiBPaChlLHQsbil7aWYoKHQ9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iZmxvdy1jb2xsZWN0aW9uIil7bGV0IHI9dC5lbmRbMF07ci5pbmRlbnQ9PT1lJiYoci5zb3VyY2U9PT0iXSJ8fHIuc291cmNlPT09In0iKSYmTWEodCkmJm4ociwiQkFEX0lOREVOVCIsIkZsb3cgZW5kIGluZGljYXRvciBzaG91bGQgYmUgbW9yZSBpbmRlbnRlZCB0aGFuIHBhcmVudCIsITApfX1mdW5jdGlvbiBLMihlLHQsbil7bGV0e3VuaXF1ZUtleXM6cn09ZS5vcHRpb25zO2lmKHI9PT0hMSlyZXR1cm4hMTtsZXQgcz10eXBlb2Ygcj09ImZ1bmN0aW9uIj9yOihpLG8pPT5pPT09b3x8RWUoaSkmJkVlKG8pJiZpLnZhbHVlPT09by52YWx1ZTtyZXR1cm4gdC5zb21lKGk9PnMoaS5rZXksbikpfXZhciBYMj0iQWxsIG1hcHBpbmcgaXRlbXMgbXVzdCBzdGFydCBhdCB0aGUgc2FtZSBjb2x1bW4iO2Z1bmN0aW9uIFYzKHtjb21wb3NlTm9kZTplLGNvbXBvc2VFbXB0eU5vZGU6dH0sbixyLHMsaSl7dmFyIGY7bGV0IG89KGk9PW51bGw/dm9pZCAwOmkubm9kZUNsYXNzKT8/WXQsYT1uZXcgbyhuLnNjaGVtYSk7bi5hdFJvb3QmJihuLmF0Um9vdD0hMSk7bGV0IHU9ci5vZmZzZXQsbD1udWxsO2ZvcihsZXQgYyBvZiByLml0ZW1zKXtsZXR7c3RhcnQ6cCxrZXk6aCxzZXA6ZCx2YWx1ZTptfT1jLGc9eW8ocCx7aW5kaWNhdG9yOiJleHBsaWNpdC1rZXktaW5kIixuZXh0Omg/PyhkPT1udWxsP3ZvaWQgMDpkWzBdKSxvZmZzZXQ6dSxvbkVycm9yOnMscGFyZW50SW5kZW50OnIuaW5kZW50LHN0YXJ0T25OZXdsaW5lOiEwfSksRD0hZy5mb3VuZDtpZihEKXtpZihoJiYoaC50eXBlPT09ImJsb2NrLXNlcSI/cyh1LCJCTE9DS19BU19JTVBMSUNJVF9LRVkiLCJBIGJsb2NrIHNlcXVlbmNlIG1heSBub3QgYmUgdXNlZCBhcyBhbiBpbXBsaWNpdCBtYXAga2V5Iik6ImluZGVudCJpbiBoJiZoLmluZGVudCE9PXIuaW5kZW50JiZzKHUsIkJBRF9JTkRFTlQiLFgyKSksIWcuYW5jaG9yJiYhZy50YWcmJiFkKXtsPWcuZW5kLGcuY29tbWVudCYmKGEuY29tbWVudD9hLmNvbW1lbnQrPWAKYCtnLmNvbW1lbnQ6YS5jb21tZW50PWcuY29tbWVudCk7Y29udGludWV9KGcubmV3bGluZUFmdGVyUHJvcHx8TWEoaCkpJiZzKGg/P3BbcC5sZW5ndGgtMV0sIk1VTFRJTElORV9JTVBMSUNJVF9LRVkiLCJJbXBsaWNpdCBrZXlzIG5lZWQgdG8gYmUgb24gYSBzaW5nbGUgbGluZSIpfWVsc2UoKGY9Zy5mb3VuZCk9PW51bGw/dm9pZCAwOmYuaW5kZW50KSE9PXIuaW5kZW50JiZzKHUsIkJBRF9JTkRFTlQiLFgyKTtuLmF0S2V5PSEwO2xldCBiPWcuZW5kLEU9aD9lKG4saCxnLHMpOnQobixiLHAsbnVsbCxnLHMpO24uc2NoZW1hLmNvbXBhdCYmT2goci5pbmRlbnQsaCxzKSxuLmF0S2V5PSExLEsyKG4sYS5pdGVtcyxFKSYmcyhiLCJEVVBMSUNBVEVfS0VZIiwiTWFwIGtleXMgbXVzdCBiZSB1bmlxdWUiKTtsZXQgRj15byhkPz9bXSx7aW5kaWNhdG9yOiJtYXAtdmFsdWUtaW5kIixuZXh0Om0sb2Zmc2V0OkUucmFuZ2VbMl0sb25FcnJvcjpzLHBhcmVudEluZGVudDpyLmluZGVudCxzdGFydE9uTmV3bGluZTohaHx8aC50eXBlPT09ImJsb2NrLXNjYWxhciJ9KTtpZih1PUYuZW5kLEYuZm91bmQpe0QmJigobT09bnVsbD92b2lkIDA6bS50eXBlKT09PSJibG9jay1tYXAiJiYhRi5oYXNOZXdsaW5lJiZzKHUsIkJMT0NLX0FTX0lNUExJQ0lUX0tFWSIsIk5lc3RlZCBtYXBwaW5ncyBhcmUgbm90IGFsbG93ZWQgaW4gY29tcGFjdCBtYXBwaW5ncyIpLG4ub3B0aW9ucy5zdHJpY3QmJmcuc3RhcnQ8Ri5mb3VuZC5vZmZzZXQtMTAyNCYmcyhFLnJhbmdlLCJLRVlfT1ZFUl8xMDI0X0NIQVJTIiwiVGhlIDogaW5kaWNhdG9yIG11c3QgYmUgYXQgbW9zdCAxMDI0IGNoYXJzIGFmdGVyIHRoZSBzdGFydCBvZiBhbiBpbXBsaWNpdCBibG9jayBtYXBwaW5nIGtleSIpKTtsZXQgdj1tP2UobixtLEYscyk6dChuLHUsZCxudWxsLEYscyk7bi5zY2hlbWEuY29tcGF0JiZPaChyLmluZGVudCxtLHMpLHU9di5yYW5nZVsyXTtsZXQgQz1uZXcgVnQoRSx2KTtuLm9wdGlvbnMua2VlcFNvdXJjZVRva2VucyYmKEMuc3JjVG9rZW49YyksYS5pdGVtcy5wdXNoKEMpfWVsc2V7RCYmcyhFLnJhbmdlLCJNSVNTSU5HX0NIQVIiLCJJbXBsaWNpdCBtYXAga2V5cyBuZWVkIHRvIGJlIGZvbGxvd2VkIGJ5IG1hcCB2YWx1ZXMiKSxGLmNvbW1lbnQmJihFLmNvbW1lbnQ/RS5jb21tZW50Kz1gCmArRi5jb21tZW50OkUuY29tbWVudD1GLmNvbW1lbnQpO2xldCB2PW5ldyBWdChFKTtuLm9wdGlvbnMua2VlcFNvdXJjZVRva2VucyYmKHYuc3JjVG9rZW49YyksYS5pdGVtcy5wdXNoKHYpfX1yZXR1cm4gbCYmbDx1JiZzKGwsIklNUE9TU0lCTEUiLCJNYXAgY29tbWVudCB3aXRoIHRyYWlsaW5nIGNvbnRlbnQiKSxhLnJhbmdlPVtyLm9mZnNldCx1LGw/P3VdLGF9ZnVuY3Rpb24gVTMoe2NvbXBvc2VOb2RlOmUsY29tcG9zZUVtcHR5Tm9kZTp0fSxuLHIscyxpKXtsZXQgbz0oaT09bnVsbD92b2lkIDA6aS5ub2RlQ2xhc3MpPz9wcyxhPW5ldyBvKG4uc2NoZW1hKTtuLmF0Um9vdCYmKG4uYXRSb290PSExKSxuLmF0S2V5JiYobi5hdEtleT0hMSk7bGV0IHU9ci5vZmZzZXQsbD1udWxsO2ZvcihsZXR7c3RhcnQ6Zix2YWx1ZTpjfW9mIHIuaXRlbXMpe2xldCBwPXlvKGYse2luZGljYXRvcjoic2VxLWl0ZW0taW5kIixuZXh0OmMsb2Zmc2V0OnUsb25FcnJvcjpzLHBhcmVudEluZGVudDpyLmluZGVudCxzdGFydE9uTmV3bGluZTohMH0pO2lmKCFwLmZvdW5kKWlmKHAuYW5jaG9yfHxwLnRhZ3x8YykoYz09bnVsbD92b2lkIDA6Yy50eXBlKT09PSJibG9jay1zZXEiP3MocC5lbmQsIkJBRF9JTkRFTlQiLCJBbGwgc2VxdWVuY2UgaXRlbXMgbXVzdCBzdGFydCBhdCB0aGUgc2FtZSBjb2x1bW4iKTpzKHUsIk1JU1NJTkdfQ0hBUiIsIlNlcXVlbmNlIGl0ZW0gd2l0aG91dCAtIGluZGljYXRvciIpO2Vsc2V7bD1wLmVuZCxwLmNvbW1lbnQmJihhLmNvbW1lbnQ9cC5jb21tZW50KTtjb250aW51ZX1sZXQgaD1jP2UobixjLHAscyk6dChuLHAuZW5kLGYsbnVsbCxwLHMpO24uc2NoZW1hLmNvbXBhdCYmT2goci5pbmRlbnQsYyxzKSx1PWgucmFuZ2VbMl0sYS5pdGVtcy5wdXNoKGgpfXJldHVybiBhLnJhbmdlPVtyLm9mZnNldCx1LGw/P3VdLGF9ZnVuY3Rpb24gT2EoZSx0LG4scil7bGV0IHM9IiI7aWYoZSl7bGV0IGk9ITEsbz0iIjtmb3IobGV0IGEgb2YgZSl7bGV0e3NvdXJjZTp1LHR5cGU6bH09YTtzd2l0Y2gobCl7Y2FzZSJzcGFjZSI6aT0hMDticmVhaztjYXNlImNvbW1lbnQiOntuJiYhaSYmcihhLCJNSVNTSU5HX0NIQVIiLCJDb21tZW50cyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIG90aGVyIHRva2VucyBieSB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzIik7bGV0IGY9dS5zdWJzdHJpbmcoMSl8fCIgIjtzP3MrPW8rZjpzPWYsbz0iIjticmVha31jYXNlIm5ld2xpbmUiOnMmJihvKz11KSxpPSEwO2JyZWFrO2RlZmF1bHQ6cihhLCJVTkVYUEVDVEVEX1RPS0VOIixgVW5leHBlY3RlZCAke2x9IGF0IG5vZGUgZW5kYCl9dCs9dS5sZW5ndGh9fXJldHVybntjb21tZW50OnMsb2Zmc2V0OnR9fXZhciBSaD0iQmxvY2sgY29sbGVjdGlvbnMgYXJlIG5vdCBhbGxvd2VkIHdpdGhpbiBmbG93IGNvbGxlY3Rpb25zIixqaD1lPT5lJiYoZS50eXBlPT09ImJsb2NrLW1hcCJ8fGUudHlwZT09PSJibG9jay1zZXEiKTtmdW5jdGlvbiBxMyh7Y29tcG9zZU5vZGU6ZSxjb21wb3NlRW1wdHlOb2RlOnR9LG4scixzLGkpe3ZhciBnO2xldCBvPXIuc3RhcnQuc291cmNlPT09InsiLGE9bz8iZmxvdyBtYXAiOiJmbG93IHNlcXVlbmNlIix1PShpPT1udWxsP3ZvaWQgMDppLm5vZGVDbGFzcyk/PyhvP1l0OnBzKSxsPW5ldyB1KG4uc2NoZW1hKTtsLmZsb3c9ITA7bGV0IGY9bi5hdFJvb3Q7ZiYmKG4uYXRSb290PSExKSxuLmF0S2V5JiYobi5hdEtleT0hMSk7bGV0IGM9ci5vZmZzZXQrci5zdGFydC5zb3VyY2UubGVuZ3RoO2ZvcihsZXQgRD0wO0Q8ci5pdGVtcy5sZW5ndGg7KytEKXtsZXQgYj1yLml0ZW1zW0RdLHtzdGFydDpFLGtleTpGLHNlcDp2LHZhbHVlOkN9PWIsQT15byhFLHtmbG93OmEsaW5kaWNhdG9yOiJleHBsaWNpdC1rZXktaW5kIixuZXh0OkY/Pyh2PT1udWxsP3ZvaWQgMDp2WzBdKSxvZmZzZXQ6YyxvbkVycm9yOnMscGFyZW50SW5kZW50OnIuaW5kZW50LHN0YXJ0T25OZXdsaW5lOiExfSk7aWYoIUEuZm91bmQpe2lmKCFBLmFuY2hvciYmIUEudGFnJiYhdiYmIUMpe0Q9PT0wJiZBLmNvbW1hP3MoQS5jb21tYSwiVU5FWFBFQ1RFRF9UT0tFTiIsYFVuZXhwZWN0ZWQgLCBpbiAke2F9YCk6RDxyLml0ZW1zLmxlbmd0aC0xJiZzKEEuc3RhcnQsIlVORVhQRUNURURfVE9LRU4iLGBVbmV4cGVjdGVkIGVtcHR5IGl0ZW0gaW4gJHthfWApLEEuY29tbWVudCYmKGwuY29tbWVudD9sLmNvbW1lbnQrPWAKYCtBLmNvbW1lbnQ6bC5jb21tZW50PUEuY29tbWVudCksYz1BLmVuZDtjb250aW51ZX0hbyYmbi5vcHRpb25zLnN0cmljdCYmTWEoRikmJnMoRiwiTVVMVElMSU5FX0lNUExJQ0lUX0tFWSIsIkltcGxpY2l0IGtleXMgb2YgZmxvdyBzZXF1ZW5jZSBwYWlycyBuZWVkIHRvIGJlIG9uIGEgc2luZ2xlIGxpbmUiKX1pZihEPT09MClBLmNvbW1hJiZzKEEuY29tbWEsIlVORVhQRUNURURfVE9LRU4iLGBVbmV4cGVjdGVkICwgaW4gJHthfWApO2Vsc2UgaWYoQS5jb21tYXx8cyhBLnN0YXJ0LCJNSVNTSU5HX0NIQVIiLGBNaXNzaW5nICwgYmV0d2VlbiAke2F9IGl0ZW1zYCksQS5jb21tZW50KXtsZXQgdz0iIjtlOmZvcihsZXQgVCBvZiBFKXN3aXRjaChULnR5cGUpe2Nhc2UiY29tbWEiOmNhc2Uic3BhY2UiOmJyZWFrO2Nhc2UiY29tbWVudCI6dz1ULnNvdXJjZS5zdWJzdHJpbmcoMSk7YnJlYWsgZTtkZWZhdWx0OmJyZWFrIGV9aWYodyl7bGV0IFQ9bC5pdGVtc1tsLml0ZW1zLmxlbmd0aC0xXTtUZShUKSYmKFQ9VC52YWx1ZT8/VC5rZXkpLFQuY29tbWVudD9ULmNvbW1lbnQrPWAKYCt3OlQuY29tbWVudD13LEEuY29tbWVudD1BLmNvbW1lbnQuc3Vic3RyaW5nKHcubGVuZ3RoKzEpfX1pZighbyYmIXYmJiFBLmZvdW5kKXtsZXQgdz1DP2UobixDLEEscyk6dChuLEEuZW5kLHYsbnVsbCxBLHMpO2wuaXRlbXMucHVzaCh3KSxjPXcucmFuZ2VbMl0samgoQykmJnMody5yYW5nZSwiQkxPQ0tfSU5fRkxPVyIsUmgpfWVsc2V7bi5hdEtleT0hMDtsZXQgdz1BLmVuZCxUPUY/ZShuLEYsQSxzKTp0KG4sdyxFLG51bGwsQSxzKTtqaChGKSYmcyhULnJhbmdlLCJCTE9DS19JTl9GTE9XIixSaCksbi5hdEtleT0hMTtsZXQgTj15byh2Pz9bXSx7ZmxvdzphLGluZGljYXRvcjoibWFwLXZhbHVlLWluZCIsbmV4dDpDLG9mZnNldDpULnJhbmdlWzJdLG9uRXJyb3I6cyxwYXJlbnRJbmRlbnQ6ci5pbmRlbnQsc3RhcnRPbk5ld2xpbmU6ITF9KTtpZihOLmZvdW5kKXtpZighbyYmIUEuZm91bmQmJm4ub3B0aW9ucy5zdHJpY3Qpe2lmKHYpZm9yKGxldCBTIG9mIHYpe2lmKFM9PT1OLmZvdW5kKWJyZWFrO2lmKFMudHlwZT09PSJuZXdsaW5lIil7cyhTLCJNVUxUSUxJTkVfSU1QTElDSVRfS0VZIiwiSW1wbGljaXQga2V5cyBvZiBmbG93IHNlcXVlbmNlIHBhaXJzIG5lZWQgdG8gYmUgb24gYSBzaW5nbGUgbGluZSIpO2JyZWFrfX1BLnN0YXJ0PE4uZm91bmQub2Zmc2V0LTEwMjQmJnMoTi5mb3VuZCwiS0VZX09WRVJfMTAyNF9DSEFSUyIsIlRoZSA6IGluZGljYXRvciBtdXN0IGJlIGF0IG1vc3QgMTAyNCBjaGFycyBhZnRlciB0aGUgc3RhcnQgb2YgYW4gaW1wbGljaXQgZmxvdyBzZXF1ZW5jZSBrZXkiKX19ZWxzZSBDJiYoInNvdXJjZSJpbiBDJiYoKGc9Qy5zb3VyY2UpPT1udWxsP3ZvaWQgMDpnWzBdKT09PSI6Ij9zKEMsIk1JU1NJTkdfQ0hBUiIsYE1pc3Npbmcgc3BhY2UgYWZ0ZXIgOiBpbiAke2F9YCk6cyhOLnN0YXJ0LCJNSVNTSU5HX0NIQVIiLGBNaXNzaW5nICwgb3IgOiBiZXR3ZWVuICR7YX0gaXRlbXNgKSk7bGV0IHg9Qz9lKG4sQyxOLHMpOk4uZm91bmQ/dChuLE4uZW5kLHYsbnVsbCxOLHMpOm51bGw7eD9qaChDKSYmcyh4LnJhbmdlLCJCTE9DS19JTl9GTE9XIixSaCk6Ti5jb21tZW50JiYoVC5jb21tZW50P1QuY29tbWVudCs9YApgK04uY29tbWVudDpULmNvbW1lbnQ9Ti5jb21tZW50KTtsZXQgTD1uZXcgVnQoVCx4KTtpZihuLm9wdGlvbnMua2VlcFNvdXJjZVRva2VucyYmKEwuc3JjVG9rZW49Yiksbyl7bGV0IFM9bDtLMihuLFMuaXRlbXMsVCkmJnModywiRFVQTElDQVRFX0tFWSIsIk1hcCBrZXlzIG11c3QgYmUgdW5pcXVlIiksUy5pdGVtcy5wdXNoKEwpfWVsc2V7bGV0IFM9bmV3IFl0KG4uc2NoZW1hKTtTLmZsb3c9ITAsUy5pdGVtcy5wdXNoKEwpO2xldCBrPSh4Pz9UKS5yYW5nZTtTLnJhbmdlPVtULnJhbmdlWzBdLGtbMV0sa1syXV0sbC5pdGVtcy5wdXNoKFMpfWM9eD94LnJhbmdlWzJdOk4uZW5kfX1sZXQgcD1vPyJ9IjoiXSIsW2gsLi4uZF09ci5lbmQsbT1jO2lmKChoPT1udWxsP3ZvaWQgMDpoLnNvdXJjZSk9PT1wKW09aC5vZmZzZXQraC5zb3VyY2UubGVuZ3RoO2Vsc2V7bGV0IEQ9YVswXS50b1VwcGVyQ2FzZSgpK2Euc3Vic3RyaW5nKDEpLGI9Zj9gJHtEfSBtdXN0IGVuZCB3aXRoIGEgJHtwfWA6YCR7RH0gaW4gYmxvY2sgY29sbGVjdGlvbiBtdXN0IGJlIHN1ZmZpY2llbnRseSBpbmRlbnRlZCBhbmQgZW5kIHdpdGggYSAke3B9YDtzKGMsZj8iTUlTU0lOR19DSEFSIjoiQkFEX0lOREVOVCIsYiksaCYmaC5zb3VyY2UubGVuZ3RoIT09MSYmZC51bnNoaWZ0KGgpfWlmKGQubGVuZ3RoPjApe2xldCBEPU9hKGQsbSxuLm9wdGlvbnMuc3RyaWN0LHMpO0QuY29tbWVudCYmKGwuY29tbWVudD9sLmNvbW1lbnQrPWAKYCtELmNvbW1lbnQ6bC5jb21tZW50PUQuY29tbWVudCksbC5yYW5nZT1bci5vZmZzZXQsbSxELm9mZnNldF19ZWxzZSBsLnJhbmdlPVtyLm9mZnNldCxtLG1dO3JldHVybiBsfWZ1bmN0aW9uIFZoKGUsdCxuLHIscyxpKXtsZXQgbz1uLnR5cGU9PT0iYmxvY2stbWFwIj9WMyhlLHQsbixyLGkpOm4udHlwZT09PSJibG9jay1zZXEiP1UzKGUsdCxuLHIsaSk6cTMoZSx0LG4scixpKSxhPW8uY29uc3RydWN0b3I7cmV0dXJuIHM9PT0iISJ8fHM9PT1hLnRhZ05hbWU/KG8udGFnPWEudGFnTmFtZSxvKToocyYmKG8udGFnPXMpLG8pfWZ1bmN0aW9uIFczKGUsdCxuLHIscyl7dmFyIHA7bGV0IGk9ci50YWcsbz1pP3QuZGlyZWN0aXZlcy50YWdOYW1lKGkuc291cmNlLGg9PnMoaSwiVEFHX1JFU09MVkVfRkFJTEVEIixoKSk6bnVsbDtpZihuLnR5cGU9PT0iYmxvY2stc2VxIil7bGV0e2FuY2hvcjpoLG5ld2xpbmVBZnRlclByb3A6ZH09cixtPWgmJmk/aC5vZmZzZXQ+aS5vZmZzZXQ/aDppOmg/P2k7bSYmKCFkfHxkLm9mZnNldDxtLm9mZnNldCkmJnMobSwiTUlTU0lOR19DSEFSIiwiTWlzc2luZyBuZXdsaW5lIGFmdGVyIGJsb2NrIHNlcXVlbmNlIHByb3BzIil9bGV0IGE9bi50eXBlPT09ImJsb2NrLW1hcCI/Im1hcCI6bi50eXBlPT09ImJsb2NrLXNlcSI/InNlcSI6bi5zdGFydC5zb3VyY2U9PT0ieyI/Im1hcCI6InNlcSI7aWYoIWl8fCFvfHxvPT09IiEifHxvPT09WXQudGFnTmFtZSYmYT09PSJtYXAifHxvPT09cHMudGFnTmFtZSYmYT09PSJzZXEiKXJldHVybiBWaChlLHQsbixzLG8pO2xldCB1PXQuc2NoZW1hLnRhZ3MuZmluZChoPT5oLnRhZz09PW8mJmguY29sbGVjdGlvbj09PWEpO2lmKCF1KXtsZXQgaD10LnNjaGVtYS5rbm93blRhZ3Nbb107aWYoKGg9PW51bGw/dm9pZCAwOmguY29sbGVjdGlvbik9PT1hKXQuc2NoZW1hLnRhZ3MucHVzaChPYmplY3QuYXNzaWduKHt9LGgse2RlZmF1bHQ6ITF9KSksdT1oO2Vsc2UgcmV0dXJuIGg/cyhpLCJCQURfQ09MTEVDVElPTl9UWVBFIixgJHtoLnRhZ30gdXNlZCBmb3IgJHthfSBjb2xsZWN0aW9uLCBidXQgZXhwZWN0cyAke2guY29sbGVjdGlvbj8/InNjYWxhciJ9YCwhMCk6cyhpLCJUQUdfUkVTT0xWRV9GQUlMRUQiLGBVbnJlc29sdmVkIHRhZzogJHtvfWAsITApLFZoKGUsdCxuLHMsbyl9bGV0IGw9VmgoZSx0LG4scyxvLHUpLGY9KChwPXUucmVzb2x2ZSk9PW51bGw/dm9pZCAwOnAuY2FsbCh1LGwsaD0+cyhpLCJUQUdfUkVTT0xWRV9GQUlMRUQiLGgpLHQub3B0aW9ucykpPz9sLGM9VWUoZik/ZjpuZXcgcmUoZik7cmV0dXJuIGMucmFuZ2U9bC5yYW5nZSxjLnRhZz1vLHUhPW51bGwmJnUuZm9ybWF0JiYoYy5mb3JtYXQ9dS5mb3JtYXQpLGN9ZnVuY3Rpb24gWTIoZSx0LG4pe2xldCByPXQub2Zmc2V0LHM9SDModCxlLm9wdGlvbnMuc3RyaWN0LG4pO2lmKCFzKXJldHVybnt2YWx1ZToiIix0eXBlOm51bGwsY29tbWVudDoiIixyYW5nZTpbcixyLHJdfTtsZXQgaT1zLm1vZGU9PT0iPiI/cmUuQkxPQ0tfRk9MREVEOnJlLkJMT0NLX0xJVEVSQUwsbz10LnNvdXJjZT9KMyh0LnNvdXJjZSk6W10sYT1vLmxlbmd0aDtmb3IobGV0IG09by5sZW5ndGgtMTttPj0wOy0tbSl7bGV0IGc9b1ttXVsxXTtpZihnPT09IiJ8fGc9PT0iXHIiKWE9bTtlbHNlIGJyZWFrfWlmKGE9PT0wKXtsZXQgbT1zLmNob21wPT09IisiJiZvLmxlbmd0aD4wP2AKYC5yZXBlYXQoTWF0aC5tYXgoMSxvLmxlbmd0aC0xKSk6IiIsZz1yK3MubGVuZ3RoO3JldHVybiB0LnNvdXJjZSYmKGcrPXQuc291cmNlLmxlbmd0aCkse3ZhbHVlOm0sdHlwZTppLGNvbW1lbnQ6cy5jb21tZW50LHJhbmdlOltyLGcsZ119fWxldCB1PXQuaW5kZW50K3MuaW5kZW50LGw9dC5vZmZzZXQrcy5sZW5ndGgsZj0wO2ZvcihsZXQgbT0wO208YTsrK20pe2xldFtnLERdPW9bbV07aWYoRD09PSIifHxEPT09IlxyIilzLmluZGVudD09PTAmJmcubGVuZ3RoPnUmJih1PWcubGVuZ3RoKTtlbHNle2cubGVuZ3RoPHUmJm4obCtnLmxlbmd0aCwiTUlTU0lOR19DSEFSIiwiQmxvY2sgc2NhbGFycyB3aXRoIG1vcmUtaW5kZW50ZWQgbGVhZGluZyBlbXB0eSBsaW5lcyBtdXN0IHVzZSBhbiBleHBsaWNpdCBpbmRlbnRhdGlvbiBpbmRpY2F0b3IiKSxzLmluZGVudD09PTAmJih1PWcubGVuZ3RoKSxmPW0sdT09PTAmJiFlLmF0Um9vdCYmbihsLCJCQURfSU5ERU5UIiwiQmxvY2sgc2NhbGFyIHZhbHVlcyBpbiBjb2xsZWN0aW9ucyBtdXN0IGJlIGluZGVudGVkIik7YnJlYWt9bCs9Zy5sZW5ndGgrRC5sZW5ndGgrMX1mb3IobGV0IG09by5sZW5ndGgtMTttPj1hOy0tbSlvW21dWzBdLmxlbmd0aD51JiYoYT1tKzEpO2xldCBjPSIiLHA9IiIsaD0hMTtmb3IobGV0IG09MDttPGY7KyttKWMrPW9bbV1bMF0uc2xpY2UodSkrYApgO2ZvcihsZXQgbT1mO208YTsrK20pe2xldFtnLERdPW9bbV07bCs9Zy5sZW5ndGgrRC5sZW5ndGgrMTtsZXQgYj1EW0QubGVuZ3RoLTFdPT09IlxyIjtpZihiJiYoRD1ELnNsaWNlKDAsLTEpKSxEJiZnLmxlbmd0aDx1KXtsZXQgRT1gQmxvY2sgc2NhbGFyIGxpbmVzIG11c3Qgbm90IGJlIGxlc3MgaW5kZW50ZWQgdGhhbiB0aGVpciAke3MuaW5kZW50PyJleHBsaWNpdCBpbmRlbnRhdGlvbiBpbmRpY2F0b3IiOiJmaXJzdCBsaW5lIn1gO24obC1ELmxlbmd0aC0oYj8yOjEpLCJCQURfSU5ERU5UIixFKSxnPSIifWk9PT1yZS5CTE9DS19MSVRFUkFMPyhjKz1wK2cuc2xpY2UodSkrRCxwPWAKYCk6Zy5sZW5ndGg+dXx8RFswXT09PSIJIj8ocD09PSIgIj9wPWAKYDohaCYmcD09PWAKYCYmKHA9YAoKYCksYys9cCtnLnNsaWNlKHUpK0QscD1gCmAsaD0hMCk6RD09PSIiP3A9PT1gCmA/Yys9YApgOnA9YApgOihjKz1wK0QscD0iICIsaD0hMSl9c3dpdGNoKHMuY2hvbXApe2Nhc2UiLSI6YnJlYWs7Y2FzZSIrIjpmb3IobGV0IG09YTttPG8ubGVuZ3RoOysrbSljKz1gCmArb1ttXVswXS5zbGljZSh1KTtjW2MubGVuZ3RoLTFdIT09YApgJiYoYys9YApgKTticmVhaztkZWZhdWx0OmMrPWAKYH1sZXQgZD1yK3MubGVuZ3RoK3Quc291cmNlLmxlbmd0aDtyZXR1cm57dmFsdWU6Yyx0eXBlOmksY29tbWVudDpzLmNvbW1lbnQscmFuZ2U6W3IsZCxkXX19ZnVuY3Rpb24gSDMoe29mZnNldDplLHByb3BzOnR9LG4scil7aWYodFswXS50eXBlIT09ImJsb2NrLXNjYWxhci1oZWFkZXIiKXJldHVybiByKHRbMF0sIklNUE9TU0lCTEUiLCJCbG9jayBzY2FsYXIgaGVhZGVyIG5vdCBmb3VuZCIpLG51bGw7bGV0e3NvdXJjZTpzfT10WzBdLGk9c1swXSxvPTAsYT0iIix1PS0xO2ZvcihsZXQgcD0xO3A8cy5sZW5ndGg7KytwKXtsZXQgaD1zW3BdO2lmKCFhJiYoaD09PSItInx8aD09PSIrIikpYT1oO2Vsc2V7bGV0IGQ9TnVtYmVyKGgpOyFvJiZkP289ZDp1PT09LTEmJih1PWUrcCl9fXUhPT0tMSYmcih1LCJVTkVYUEVDVEVEX1RPS0VOIixgQmxvY2sgc2NhbGFyIGhlYWRlciBpbmNsdWRlcyBleHRyYSBjaGFyYWN0ZXJzOiAke3N9YCk7bGV0IGw9ITEsZj0iIixjPXMubGVuZ3RoO2ZvcihsZXQgcD0xO3A8dC5sZW5ndGg7KytwKXtsZXQgaD10W3BdO3N3aXRjaChoLnR5cGUpe2Nhc2Uic3BhY2UiOmw9ITA7Y2FzZSJuZXdsaW5lIjpjKz1oLnNvdXJjZS5sZW5ndGg7YnJlYWs7Y2FzZSJjb21tZW50IjpuJiYhbCYmcihoLCJNSVNTSU5HX0NIQVIiLCJDb21tZW50cyBtdXN0IGJlIHNlcGFyYXRlZCBmcm9tIG90aGVyIHRva2VucyBieSB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzIiksYys9aC5zb3VyY2UubGVuZ3RoLGY9aC5zb3VyY2Uuc3Vic3RyaW5nKDEpO2JyZWFrO2Nhc2UiZXJyb3IiOnIoaCwiVU5FWFBFQ1RFRF9UT0tFTiIsaC5tZXNzYWdlKSxjKz1oLnNvdXJjZS5sZW5ndGg7YnJlYWs7ZGVmYXVsdDp7bGV0IGQ9YFVuZXhwZWN0ZWQgdG9rZW4gaW4gYmxvY2sgc2NhbGFyIGhlYWRlcjogJHtoLnR5cGV9YDtyKGgsIlVORVhQRUNURURfVE9LRU4iLGQpO2xldCBtPWguc291cmNlO20mJnR5cGVvZiBtPT0ic3RyaW5nIiYmKGMrPW0ubGVuZ3RoKX19fXJldHVybnttb2RlOmksaW5kZW50Om8sY2hvbXA6YSxjb21tZW50OmYsbGVuZ3RoOmN9fWZ1bmN0aW9uIEozKGUpe2xldCB0PWUuc3BsaXQoL1xuKCAqKS8pLG49dFswXSxyPW4ubWF0Y2goL14oICopLykscz1bciE9bnVsbCYmclsxXT9bclsxXSxuLnNsaWNlKHJbMV0ubGVuZ3RoKV06WyIiLG5dXTtmb3IobGV0IGk9MTtpPHQubGVuZ3RoO2krPTIpcy5wdXNoKFt0W2ldLHRbaSsxXV0pO3JldHVybiBzfWZ1bmN0aW9uIFEyKGUsdCxuKXtsZXR7b2Zmc2V0OnIsdHlwZTpzLHNvdXJjZTppLGVuZDpvfT1lLGEsdSxsPShwLGgsZCk9Pm4ocitwLGgsZCk7c3dpdGNoKHMpe2Nhc2Uic2NhbGFyIjphPXJlLlBMQUlOLHU9ejMoaSxsKTticmVhaztjYXNlInNpbmdsZS1xdW90ZWQtc2NhbGFyIjphPXJlLlFVT1RFX1NJTkdMRSx1PUczKGksbCk7YnJlYWs7Y2FzZSJkb3VibGUtcXVvdGVkLXNjYWxhciI6YT1yZS5RVU9URV9ET1VCTEUsdT1LMyhpLGwpO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIG4oZSwiVU5FWFBFQ1RFRF9UT0tFTiIsYEV4cGVjdGVkIGEgZmxvdyBzY2FsYXIgdmFsdWUsIGJ1dCBmb3VuZDogJHtzfWApLHt2YWx1ZToiIix0eXBlOm51bGwsY29tbWVudDoiIixyYW5nZTpbcixyK2kubGVuZ3RoLHIraS5sZW5ndGhdfX1sZXQgZj1yK2kubGVuZ3RoLGM9T2EobyxmLHQsbik7cmV0dXJue3ZhbHVlOnUsdHlwZTphLGNvbW1lbnQ6Yy5jb21tZW50LHJhbmdlOltyLGYsYy5vZmZzZXRdfX1mdW5jdGlvbiB6MyhlLHQpe2xldCBuPSIiO3N3aXRjaChlWzBdKXtjYXNlIgkiOm49ImEgdGFiIGNoYXJhY3RlciI7YnJlYWs7Y2FzZSIsIjpuPSJmbG93IGluZGljYXRvciBjaGFyYWN0ZXIgLCI7YnJlYWs7Y2FzZSIlIjpuPSJkaXJlY3RpdmUgaW5kaWNhdG9yIGNoYXJhY3RlciAlIjticmVhaztjYXNlInwiOmNhc2UiPiI6e249YGJsb2NrIHNjYWxhciBpbmRpY2F0b3IgJHtlWzBdfWA7YnJlYWt9Y2FzZSJAIjpjYXNlImAiOntuPWByZXNlcnZlZCBjaGFyYWN0ZXIgJHtlWzBdfWA7YnJlYWt9fXJldHVybiBuJiZ0KDAsIkJBRF9TQ0FMQVJfU1RBUlQiLGBQbGFpbiB2YWx1ZSBjYW5ub3Qgc3RhcnQgd2l0aCAke259YCksWjIoZSl9ZnVuY3Rpb24gRzMoZSx0KXtyZXR1cm4oZVtlLmxlbmd0aC0xXSE9PSInInx8ZS5sZW5ndGg9PT0xKSYmdChlLmxlbmd0aCwiTUlTU0lOR19DSEFSIiwiTWlzc2luZyBjbG9zaW5nICdxdW90ZSIpLFoyKGUuc2xpY2UoMSwtMSkpLnJlcGxhY2UoLycnL2csIiciKX1mdW5jdGlvbiBaMihlKXtsZXQgdCxuO3RyeXt0PW5ldyBSZWdFeHAoYCguKj8pKD88IVsgCV0pWyAJXSpccj8KYCwic3kiKSxuPW5ldyBSZWdFeHAoYFsgCV0qKC4qPykoPzooPzwhWyAJXSlbIAldKik/XHI/CmAsInN5Iil9Y2F0Y2h7dD0vKC4qPylbIFx0XSpccj9cbi9zeSxuPS9bIFx0XSooLio/KVsgXHRdKlxyP1xuL3N5fWxldCByPXQuZXhlYyhlKTtpZighcilyZXR1cm4gZTtsZXQgcz1yWzFdLGk9IiAiLG89dC5sYXN0SW5kZXg7Zm9yKG4ubGFzdEluZGV4PW87cj1uLmV4ZWMoZSk7KXJbMV09PT0iIj9pPT09YApgP3MrPWk6aT1gCmA6KHMrPWkrclsxXSxpPSIgIiksbz1uLmxhc3RJbmRleDtsZXQgYT0vWyBcdF0qKC4qKS9zeTtyZXR1cm4gYS5sYXN0SW5kZXg9byxyPWEuZXhlYyhlKSxzK2krKChyPT1udWxsP3ZvaWQgMDpyWzFdKT8/IiIpfWZ1bmN0aW9uIEszKGUsdCl7bGV0IG49IiI7Zm9yKGxldCByPTE7cjxlLmxlbmd0aC0xOysrcil7bGV0IHM9ZVtyXTtpZighKHM9PT0iXHIiJiZlW3IrMV09PT1gCmApKWlmKHM9PT1gCmApe2xldHtmb2xkOmksb2Zmc2V0Om99PVgzKGUscik7bis9aSxyPW99ZWxzZSBpZihzPT09IlxcIil7bGV0IGk9ZVsrK3JdLG89WTNbaV07aWYobyluKz1vO2Vsc2UgaWYoaT09PWAKYClmb3IoaT1lW3IrMV07aT09PSIgInx8aT09PSIJIjspaT1lWysrcisxXTtlbHNlIGlmKGk9PT0iXHIiJiZlW3IrMV09PT1gCmApZm9yKGk9ZVsrK3IrMV07aT09PSIgInx8aT09PSIJIjspaT1lWysrcisxXTtlbHNlIGlmKGk9PT0ieCJ8fGk9PT0idSJ8fGk9PT0iVSIpe2xldCBhPWk9PT0ieCI/MjppPT09InUiPzQ6ODtuKz1RMyhlLHIrMSxhLHQpLHIrPWF9ZWxzZXtsZXQgYT1lLnN1YnN0cihyLTEsMik7dChyLTEsIkJBRF9EUV9FU0NBUEUiLGBJbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSAke2F9YCksbis9YX19ZWxzZSBpZihzPT09IiAifHxzPT09IgkiKXtsZXQgaT1yLG89ZVtyKzFdO2Zvcig7bz09PSIgInx8bz09PSIJIjspbz1lWysrcisxXTtvIT09YApgJiYhKG89PT0iXHIiJiZlW3IrMl09PT1gCmApJiYobis9cj5pP2Uuc2xpY2UoaSxyKzEpOnMpfWVsc2Ugbis9c31yZXR1cm4oZVtlLmxlbmd0aC0xXSE9PSciJ3x8ZS5sZW5ndGg9PT0xKSYmdChlLmxlbmd0aCwiTUlTU0lOR19DSEFSIiwnTWlzc2luZyBjbG9zaW5nICJxdW90ZScpLG59ZnVuY3Rpb24gWDMoZSx0KXtsZXQgbj0iIixyPWVbdCsxXTtmb3IoOyhyPT09IiAifHxyPT09IgkifHxyPT09YApgfHxyPT09IlxyIikmJiEocj09PSJcciImJmVbdCsyXSE9PWAKYCk7KXI9PT1gCmAmJihuKz1gCmApLHQrPTEscj1lW3QrMV07cmV0dXJuIG58fChuPSIgIikse2ZvbGQ6bixvZmZzZXQ6dH19dmFyIFkzPXswOiJcMCIsYToiXHgwNyIsYjoiXGIiLGU6Ilx4MUIiLGY6IlxmIixuOmAKYCxyOiJcciIsdDoiCSIsdjoiXHYiLE46IsKFIixfOiLCoCIsTDoiXHUyMDI4IixQOiJcdTIwMjkiLCIgIjoiICIsJyInOiciJywiLyI6Ii8iLCJcXCI6IlxcIiwiCSI6IgkifTtmdW5jdGlvbiBRMyhlLHQsbixyKXtsZXQgcz1lLnN1YnN0cih0LG4pLGk9cy5sZW5ndGg9PT1uJiYvXlswLTlhLWZBLUZdKyQvLnRlc3Qocyk/cGFyc2VJbnQocywxNik6TmFOO3RyeXtyZXR1cm4gU3RyaW5nLmZyb21Db2RlUG9pbnQoaSl9Y2F0Y2h7bGV0IG89ZS5zdWJzdHIodC0yLG4rMik7cmV0dXJuIHIodC0yLCJCQURfRFFfRVNDQVBFIixgSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgJHtvfWApLG99fWZ1bmN0aW9uIGViKGUsdCxuLHIpe2xldHt2YWx1ZTpzLHR5cGU6aSxjb21tZW50Om8scmFuZ2U6YX09dC50eXBlPT09ImJsb2NrLXNjYWxhciI/WTIoZSx0LHIpOlEyKHQsZS5vcHRpb25zLnN0cmljdCxyKSx1PW4/ZS5kaXJlY3RpdmVzLnRhZ05hbWUobi5zb3VyY2UsYz0+cihuLCJUQUdfUkVTT0xWRV9GQUlMRUQiLGMpKTpudWxsLGw7ZS5vcHRpb25zLnN0cmluZ0tleXMmJmUuYXRLZXk/bD1lLnNjaGVtYVtycl06dT9sPVozKGUuc2NoZW1hLHMsdSxuLHIpOnQudHlwZT09PSJzY2FsYXIiP2w9ZTYoZSxzLHQscik6bD1lLnNjaGVtYVtycl07bGV0IGY7dHJ5e2xldCBjPWwucmVzb2x2ZShzLHA9PnIobj8/dCwiVEFHX1JFU09MVkVfRkFJTEVEIixwKSxlLm9wdGlvbnMpO2Y9RWUoYyk/YzpuZXcgcmUoYyl9Y2F0Y2goYyl7bGV0IHA9YyBpbnN0YW5jZW9mIEVycm9yP2MubWVzc2FnZTpTdHJpbmcoYyk7cihuPz90LCJUQUdfUkVTT0xWRV9GQUlMRUQiLHApLGY9bmV3IHJlKHMpfXJldHVybiBmLnJhbmdlPWEsZi5zb3VyY2U9cyxpJiYoZi50eXBlPWkpLHUmJihmLnRhZz11KSxsLmZvcm1hdCYmKGYuZm9ybWF0PWwuZm9ybWF0KSxvJiYoZi5jb21tZW50PW8pLGZ9ZnVuY3Rpb24gWjMoZSx0LG4scixzKXt2YXIgYTtpZihuPT09IiEiKXJldHVybiBlW3JyXTtsZXQgaT1bXTtmb3IobGV0IHUgb2YgZS50YWdzKWlmKCF1LmNvbGxlY3Rpb24mJnUudGFnPT09bilpZih1LmRlZmF1bHQmJnUudGVzdClpLnB1c2godSk7ZWxzZSByZXR1cm4gdTtmb3IobGV0IHUgb2YgaSlpZigoYT11LnRlc3QpIT1udWxsJiZhLnRlc3QodCkpcmV0dXJuIHU7bGV0IG89ZS5rbm93blRhZ3Nbbl07cmV0dXJuIG8mJiFvLmNvbGxlY3Rpb24/KGUudGFncy5wdXNoKE9iamVjdC5hc3NpZ24oe30sbyx7ZGVmYXVsdDohMSx0ZXN0OnZvaWQgMH0pKSxvKToocyhyLCJUQUdfUkVTT0xWRV9GQUlMRUQiLGBVbnJlc29sdmVkIHRhZzogJHtufWAsbiE9PSJ0YWc6eWFtbC5vcmcsMjAwMjpzdHIiKSxlW3JyXSl9ZnVuY3Rpb24gZTYoe2F0S2V5OmUsZGlyZWN0aXZlczp0LHNjaGVtYTpufSxyLHMsaSl7bGV0IG89bi50YWdzLmZpbmQoYT0+e3ZhciB1O3JldHVybihhLmRlZmF1bHQ9PT0hMHx8ZSYmYS5kZWZhdWx0PT09ImtleSIpJiYoKHU9YS50ZXN0KT09bnVsbD92b2lkIDA6dS50ZXN0KHIpKX0pfHxuW3JyXTtpZihuLmNvbXBhdCl7bGV0IGE9bi5jb21wYXQuZmluZCh1PT57dmFyIGw7cmV0dXJuIHUuZGVmYXVsdCYmKChsPXUudGVzdCk9PW51bGw/dm9pZCAwOmwudGVzdChyKSl9KT8/bltycl07aWYoby50YWchPT1hLnRhZyl7bGV0IHU9dC50YWdTdHJpbmcoby50YWcpLGw9dC50YWdTdHJpbmcoYS50YWcpLGY9YFZhbHVlIG1heSBiZSBwYXJzZWQgYXMgZWl0aGVyICR7dX0gb3IgJHtsfWA7aShzLCJUQUdfUkVTT0xWRV9GQUlMRUQiLGYsITApfX1yZXR1cm4gb31mdW5jdGlvbiB0NihlLHQsbil7aWYodCl7bj8/KG49dC5sZW5ndGgpO2ZvcihsZXQgcj1uLTE7cj49MDstLXIpe2xldCBzPXRbcl07c3dpdGNoKHMudHlwZSl7Y2FzZSJzcGFjZSI6Y2FzZSJjb21tZW50IjpjYXNlIm5ld2xpbmUiOmUtPXMuc291cmNlLmxlbmd0aDtjb250aW51ZX1mb3Iocz10Wysrcl07KHM9PW51bGw/dm9pZCAwOnMudHlwZSk9PT0ic3BhY2UiOyllKz1zLnNvdXJjZS5sZW5ndGgscz10Wysrcl07YnJlYWt9fXJldHVybiBlfXZhciBuNj17Y29tcG9zZU5vZGU6dGIsY29tcG9zZUVtcHR5Tm9kZTpVaH07ZnVuY3Rpb24gdGIoZSx0LG4scil7bGV0IHM9ZS5hdEtleSx7c3BhY2VCZWZvcmU6aSxjb21tZW50Om8sYW5jaG9yOmEsdGFnOnV9PW4sbCxmPSEwO3N3aXRjaCh0LnR5cGUpe2Nhc2UiYWxpYXMiOmw9cjYoZSx0LHIpLChhfHx1KSYmcih0LCJBTElBU19QUk9QUyIsIkFuIGFsaWFzIG5vZGUgbXVzdCBub3Qgc3BlY2lmeSBhbnkgcHJvcGVydGllcyIpO2JyZWFrO2Nhc2Uic2NhbGFyIjpjYXNlInNpbmdsZS1xdW90ZWQtc2NhbGFyIjpjYXNlImRvdWJsZS1xdW90ZWQtc2NhbGFyIjpjYXNlImJsb2NrLXNjYWxhciI6bD1lYihlLHQsdSxyKSxhJiYobC5hbmNob3I9YS5zb3VyY2Uuc3Vic3RyaW5nKDEpKTticmVhaztjYXNlImJsb2NrLW1hcCI6Y2FzZSJibG9jay1zZXEiOmNhc2UiZmxvdy1jb2xsZWN0aW9uIjp0cnl7bD1XMyhuNixlLHQsbixyKSxhJiYobC5hbmNob3I9YS5zb3VyY2Uuc3Vic3RyaW5nKDEpKX1jYXRjaChjKXtsZXQgcD1jIGluc3RhbmNlb2YgRXJyb3I/Yy5tZXNzYWdlOlN0cmluZyhjKTtyKHQsIlJFU09VUkNFX0VYSEFVU1RJT04iLHApfWJyZWFrO2RlZmF1bHQ6e2xldCBjPXQudHlwZT09PSJlcnJvciI/dC5tZXNzYWdlOmBVbnN1cHBvcnRlZCB0b2tlbiAodHlwZTogJHt0LnR5cGV9KWA7cih0LCJVTkVYUEVDVEVEX1RPS0VOIixjKSxmPSExfX1yZXR1cm4gbD8/KGw9VWgoZSx0Lm9mZnNldCx2b2lkIDAsbnVsbCxuLHIpKSxhJiZsLmFuY2hvcj09PSIiJiZyKGEsIkJBRF9BTElBUyIsIkFuY2hvciBjYW5ub3QgYmUgYW4gZW1wdHkgc3RyaW5nIikscyYmZS5vcHRpb25zLnN0cmluZ0tleXMmJighRWUobCl8fHR5cGVvZiBsLnZhbHVlIT0ic3RyaW5nInx8bC50YWcmJmwudGFnIT09InRhZzp5YW1sLm9yZywyMDAyOnN0ciIpJiZyKHU/P3QsIk5PTl9TVFJJTkdfS0VZIiwiV2l0aCBzdHJpbmdLZXlzLCBhbGwga2V5cyBtdXN0IGJlIHN0cmluZ3MiKSxpJiYobC5zcGFjZUJlZm9yZT0hMCksbyYmKHQudHlwZT09PSJzY2FsYXIiJiZ0LnNvdXJjZT09PSIiP2wuY29tbWVudD1vOmwuY29tbWVudEJlZm9yZT1vKSxlLm9wdGlvbnMua2VlcFNvdXJjZVRva2VucyYmZiYmKGwuc3JjVG9rZW49dCksbH1mdW5jdGlvbiBVaChlLHQsbixyLHtzcGFjZUJlZm9yZTpzLGNvbW1lbnQ6aSxhbmNob3I6byx0YWc6YSxlbmQ6dX0sbCl7bGV0IGY9e3R5cGU6InNjYWxhciIsb2Zmc2V0OnQ2KHQsbixyKSxpbmRlbnQ6LTEsc291cmNlOiIifSxjPWViKGUsZixhLGwpO3JldHVybiBvJiYoYy5hbmNob3I9by5zb3VyY2Uuc3Vic3RyaW5nKDEpLGMuYW5jaG9yPT09IiImJmwobywiQkFEX0FMSUFTIiwiQW5jaG9yIGNhbm5vdCBiZSBhbiBlbXB0eSBzdHJpbmciKSkscyYmKGMuc3BhY2VCZWZvcmU9ITApLGkmJihjLmNvbW1lbnQ9aSxjLnJhbmdlWzJdPXUpLGN9ZnVuY3Rpb24gcjYoe29wdGlvbnM6ZX0se29mZnNldDp0LHNvdXJjZTpuLGVuZDpyfSxzKXtsZXQgaT1uZXcgJGwobi5zdWJzdHJpbmcoMSkpO2kuc291cmNlPT09IiImJnModCwiQkFEX0FMSUFTIiwiQWxpYXMgY2Fubm90IGJlIGFuIGVtcHR5IHN0cmluZyIpLGkuc291cmNlLmVuZHNXaXRoKCI6IikmJnModCtuLmxlbmd0aC0xLCJCQURfQUxJQVMiLCJBbGlhcyBlbmRpbmcgaW4gOiBpcyBhbWJpZ3VvdXMiLCEwKTtsZXQgbz10K24ubGVuZ3RoLGE9T2EocixvLGUuc3RyaWN0LHMpO3JldHVybiBpLnJhbmdlPVt0LG8sYS5vZmZzZXRdLGEuY29tbWVudCYmKGkuY29tbWVudD1hLmNvbW1lbnQpLGl9ZnVuY3Rpb24gczYoZSx0LHtvZmZzZXQ6bixzdGFydDpyLHZhbHVlOnMsZW5kOml9LG8pe2xldCBhPU9iamVjdC5hc3NpZ24oe19kaXJlY3RpdmVzOnR9LGUpLHU9bmV3IFlsKHZvaWQgMCxhKSxsPXthdEtleTohMSxhdFJvb3Q6ITAsZGlyZWN0aXZlczp1LmRpcmVjdGl2ZXMsb3B0aW9uczp1Lm9wdGlvbnMsc2NoZW1hOnUuc2NoZW1hfSxmPXlvKHIse2luZGljYXRvcjoiZG9jLXN0YXJ0IixuZXh0OnM/PyhpPT1udWxsP3ZvaWQgMDppWzBdKSxvZmZzZXQ6bixvbkVycm9yOm8scGFyZW50SW5kZW50OjAsc3RhcnRPbk5ld2xpbmU6ITB9KTtmLmZvdW5kJiYodS5kaXJlY3RpdmVzLmRvY1N0YXJ0PSEwLHMmJihzLnR5cGU9PT0iYmxvY2stbWFwInx8cy50eXBlPT09ImJsb2NrLXNlcSIpJiYhZi5oYXNOZXdsaW5lJiZvKGYuZW5kLCJNSVNTSU5HX0NIQVIiLCJCbG9jayBjb2xsZWN0aW9uIGNhbm5vdCBzdGFydCBvbiBzYW1lIGxpbmUgd2l0aCBkaXJlY3RpdmVzLWVuZCBtYXJrZXIiKSksdS5jb250ZW50cz1zP3RiKGwscyxmLG8pOlVoKGwsZi5lbmQscixudWxsLGYsbyk7bGV0IGM9dS5jb250ZW50cy5yYW5nZVsyXSxwPU9hKGksYywhMSxvKTtyZXR1cm4gcC5jb21tZW50JiYodS5jb21tZW50PXAuY29tbWVudCksdS5yYW5nZT1bbixjLHAub2Zmc2V0XSx1fWZ1bmN0aW9uIFJhKGUpe2lmKHR5cGVvZiBlPT0ibnVtYmVyIilyZXR1cm5bZSxlKzFdO2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGUubGVuZ3RoPT09Mj9lOltlWzBdLGVbMV1dO2xldHtvZmZzZXQ6dCxzb3VyY2U6bn09ZTtyZXR1cm5bdCx0Kyh0eXBlb2Ygbj09InN0cmluZyI/bi5sZW5ndGg6MSldfWZ1bmN0aW9uIG5iKGUpe3ZhciBzO2xldCB0PSIiLG49ITEscj0hMTtmb3IobGV0IGk9MDtpPGUubGVuZ3RoOysraSl7bGV0IG89ZVtpXTtzd2l0Y2gob1swXSl7Y2FzZSIjIjp0Kz0odD09PSIiPyIiOnI/YAoKYDpgCmApKyhvLnN1YnN0cmluZygxKXx8IiAiKSxuPSEwLHI9ITE7YnJlYWs7Y2FzZSIlIjooKHM9ZVtpKzFdKT09bnVsbD92b2lkIDA6c1swXSkhPT0iIyImJihpKz0xKSxuPSExO2JyZWFrO2RlZmF1bHQ6bnx8KHI9ITApLG49ITF9fXJldHVybntjb21tZW50OnQsYWZ0ZXJFbXB0eUxpbmU6cn19dmFyIFpsPWNsYXNze2NvbnN0cnVjdG9yKHQ9e30pe3RoaXMuZG9jPW51bGwsdGhpcy5hdERpcmVjdGl2ZXM9ITEsdGhpcy5wcmVsdWRlPVtdLHRoaXMuZXJyb3JzPVtdLHRoaXMud2FybmluZ3M9W10sdGhpcy5vbkVycm9yPShuLHIscyxpKT0+e2xldCBvPVJhKG4pO2k/dGhpcy53YXJuaW5ncy5wdXNoKG5ldyBHMihvLHIscykpOnRoaXMuZXJyb3JzLnB1c2gobmV3IFlzKG8scixzKSl9LHRoaXMuZGlyZWN0aXZlcz1uZXcgbG8oe3ZlcnNpb246dC52ZXJzaW9ufHwiMS4yIn0pLHRoaXMub3B0aW9ucz10fWRlY29yYXRlKHQsbil7bGV0e2NvbW1lbnQ6cixhZnRlckVtcHR5TGluZTpzfT1uYih0aGlzLnByZWx1ZGUpO2lmKHIpe2xldCBpPXQuY29udGVudHM7aWYobil0LmNvbW1lbnQ9dC5jb21tZW50P2Ake3QuY29tbWVudH0KJHtyfWA6cjtlbHNlIGlmKHN8fHQuZGlyZWN0aXZlcy5kb2NTdGFydHx8IWkpdC5jb21tZW50QmVmb3JlPXI7ZWxzZSBpZihWZShpKSYmIWkuZmxvdyYmaS5pdGVtcy5sZW5ndGg+MCl7bGV0IG89aS5pdGVtc1swXTtUZShvKSYmKG89by5rZXkpO2xldCBhPW8uY29tbWVudEJlZm9yZTtvLmNvbW1lbnRCZWZvcmU9YT9gJHtyfQoke2F9YDpyfWVsc2V7bGV0IG89aS5jb21tZW50QmVmb3JlO2kuY29tbWVudEJlZm9yZT1vP2Ake3J9CiR7b31gOnJ9fWlmKG4pe2ZvcihsZXQgaT0wO2k8dGhpcy5lcnJvcnMubGVuZ3RoOysraSl0LmVycm9ycy5wdXNoKHRoaXMuZXJyb3JzW2ldKTtmb3IobGV0IGk9MDtpPHRoaXMud2FybmluZ3MubGVuZ3RoOysraSl0Lndhcm5pbmdzLnB1c2godGhpcy53YXJuaW5nc1tpXSl9ZWxzZSB0LmVycm9ycz10aGlzLmVycm9ycyx0Lndhcm5pbmdzPXRoaXMud2FybmluZ3M7dGhpcy5wcmVsdWRlPVtdLHRoaXMuZXJyb3JzPVtdLHRoaXMud2FybmluZ3M9W119c3RyZWFtSW5mbygpe3JldHVybntjb21tZW50Om5iKHRoaXMucHJlbHVkZSkuY29tbWVudCxkaXJlY3RpdmVzOnRoaXMuZGlyZWN0aXZlcyxlcnJvcnM6dGhpcy5lcnJvcnMsd2FybmluZ3M6dGhpcy53YXJuaW5nc319KmNvbXBvc2UodCxuPSExLHI9LTEpe2ZvcihsZXQgcyBvZiB0KXlpZWxkKnRoaXMubmV4dChzKTt5aWVsZCp0aGlzLmVuZChuLHIpfSpuZXh0KHQpe3N3aXRjaCh0LnR5cGUpe2Nhc2UiZGlyZWN0aXZlIjp0aGlzLmRpcmVjdGl2ZXMuYWRkKHQuc291cmNlLChuLHIscyk9PntsZXQgaT1SYSh0KTtpWzBdKz1uLHRoaXMub25FcnJvcihpLCJCQURfRElSRUNUSVZFIixyLHMpfSksdGhpcy5wcmVsdWRlLnB1c2godC5zb3VyY2UpLHRoaXMuYXREaXJlY3RpdmVzPSEwO2JyZWFrO2Nhc2UiZG9jdW1lbnQiOntsZXQgbj1zNih0aGlzLm9wdGlvbnMsdGhpcy5kaXJlY3RpdmVzLHQsdGhpcy5vbkVycm9yKTt0aGlzLmF0RGlyZWN0aXZlcyYmIW4uZGlyZWN0aXZlcy5kb2NTdGFydCYmdGhpcy5vbkVycm9yKHQsIk1JU1NJTkdfQ0hBUiIsIk1pc3NpbmcgZGlyZWN0aXZlcy1lbmQvZG9jLXN0YXJ0IGluZGljYXRvciBsaW5lIiksdGhpcy5kZWNvcmF0ZShuLCExKSx0aGlzLmRvYyYmKHlpZWxkIHRoaXMuZG9jKSx0aGlzLmRvYz1uLHRoaXMuYXREaXJlY3RpdmVzPSExO2JyZWFrfWNhc2UiYnl0ZS1vcmRlci1tYXJrIjpjYXNlInNwYWNlIjpicmVhaztjYXNlImNvbW1lbnQiOmNhc2UibmV3bGluZSI6dGhpcy5wcmVsdWRlLnB1c2godC5zb3VyY2UpO2JyZWFrO2Nhc2UiZXJyb3IiOntsZXQgbj10LnNvdXJjZT9gJHt0Lm1lc3NhZ2V9OiAke0pTT04uc3RyaW5naWZ5KHQuc291cmNlKX1gOnQubWVzc2FnZSxyPW5ldyBZcyhSYSh0KSwiVU5FWFBFQ1RFRF9UT0tFTiIsbik7dGhpcy5hdERpcmVjdGl2ZXN8fCF0aGlzLmRvYz90aGlzLmVycm9ycy5wdXNoKHIpOnRoaXMuZG9jLmVycm9ycy5wdXNoKHIpO2JyZWFrfWNhc2UiZG9jLWVuZCI6e2lmKCF0aGlzLmRvYyl7bGV0IHI9IlVuZXhwZWN0ZWQgZG9jLWVuZCB3aXRob3V0IHByZWNlZGluZyBkb2N1bWVudCI7dGhpcy5lcnJvcnMucHVzaChuZXcgWXMoUmEodCksIlVORVhQRUNURURfVE9LRU4iLHIpKTticmVha310aGlzLmRvYy5kaXJlY3RpdmVzLmRvY0VuZD0hMDtsZXQgbj1PYSh0LmVuZCx0Lm9mZnNldCt0LnNvdXJjZS5sZW5ndGgsdGhpcy5kb2Mub3B0aW9ucy5zdHJpY3QsdGhpcy5vbkVycm9yKTtpZih0aGlzLmRlY29yYXRlKHRoaXMuZG9jLCEwKSxuLmNvbW1lbnQpe2xldCByPXRoaXMuZG9jLmNvbW1lbnQ7dGhpcy5kb2MuY29tbWVudD1yP2Ake3J9CiR7bi5jb21tZW50fWA6bi5jb21tZW50fXRoaXMuZG9jLnJhbmdlWzJdPW4ub2Zmc2V0O2JyZWFrfWRlZmF1bHQ6dGhpcy5lcnJvcnMucHVzaChuZXcgWXMoUmEodCksIlVORVhQRUNURURfVE9LRU4iLGBVbnN1cHBvcnRlZCB0b2tlbiAke3QudHlwZX1gKSl9fSplbmQodD0hMSxuPS0xKXtpZih0aGlzLmRvYyl0aGlzLmRlY29yYXRlKHRoaXMuZG9jLCEwKSx5aWVsZCB0aGlzLmRvYyx0aGlzLmRvYz1udWxsO2Vsc2UgaWYodCl7bGV0IHI9T2JqZWN0LmFzc2lnbih7X2RpcmVjdGl2ZXM6dGhpcy5kaXJlY3RpdmVzfSx0aGlzLm9wdGlvbnMpLHM9bmV3IFlsKHZvaWQgMCxyKTt0aGlzLmF0RGlyZWN0aXZlcyYmdGhpcy5vbkVycm9yKG4sIk1JU1NJTkdfQ0hBUiIsIk1pc3NpbmcgZGlyZWN0aXZlcy1lbmQgaW5kaWNhdG9yIGxpbmUiKSxzLnJhbmdlPVswLG4sbl0sdGhpcy5kZWNvcmF0ZShzLCExKSx5aWVsZCBzfX19LHJiPXt9O1NsKHJiLHtCT006KCk9Pm5jLERPQ1VNRU5UOigpPT5yYyxGTE9XX0VORDooKT0+c2MsU0NBTEFSOigpPT5qYSxjcmVhdGVTY2FsYXJUb2tlbjooKT0+bzYsaXNDb2xsZWN0aW9uOigpPT5mNixpc1NjYWxhcjooKT0+cDYscHJldHR5VG9rZW46KCk9Pmg2LHJlc29sdmVBc1NjYWxhcjooKT0+aTYsc2V0U2NhbGFyVmFsdWU6KCk9PmE2LHN0cmluZ2lmeTooKT0+bDYsdG9rZW5UeXBlOigpPT5hYix2aXNpdDooKT0+UXN9KTtmdW5jdGlvbiBpNihlLHQ9ITAsbil7aWYoZSl7bGV0IHI9KHMsaSxvKT0+e2xldCBhPXR5cGVvZiBzPT0ibnVtYmVyIj9zOkFycmF5LmlzQXJyYXkocyk/c1swXTpzLm9mZnNldDtpZihuKW4oYSxpLG8pO2Vsc2UgdGhyb3cgbmV3IFlzKFthLGErMV0saSxvKX07c3dpdGNoKGUudHlwZSl7Y2FzZSJzY2FsYXIiOmNhc2Uic2luZ2xlLXF1b3RlZC1zY2FsYXIiOmNhc2UiZG91YmxlLXF1b3RlZC1zY2FsYXIiOnJldHVybiBRMihlLHQscik7Y2FzZSJibG9jay1zY2FsYXIiOnJldHVybiBZMih7b3B0aW9uczp7c3RyaWN0OnR9fSxlLHIpfX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBvNihlLHQpe2xldHtpbXBsaWNpdEtleTpuPSExLGluZGVudDpyLGluRmxvdzpzPSExLG9mZnNldDppPS0xLHR5cGU6bz0iUExBSU4ifT10LGE9SWEoe3R5cGU6byx2YWx1ZTplfSx7aW1wbGljaXRLZXk6bixpbmRlbnQ6cj4wPyIgIi5yZXBlYXQocik6IiIsaW5GbG93OnMsb3B0aW9uczp7YmxvY2tRdW90ZTohMCxsaW5lV2lkdGg6LTF9fSksdT10LmVuZD8/W3t0eXBlOiJuZXdsaW5lIixvZmZzZXQ6LTEsaW5kZW50OnIsc291cmNlOmAKYH1dO3N3aXRjaChhWzBdKXtjYXNlInwiOmNhc2UiPiI6e2xldCBsPWEuaW5kZXhPZihgCmApLGY9YS5zdWJzdHJpbmcoMCxsKSxjPWEuc3Vic3RyaW5nKGwrMSkrYApgLHA9W3t0eXBlOiJibG9jay1zY2FsYXItaGVhZGVyIixvZmZzZXQ6aSxpbmRlbnQ6cixzb3VyY2U6Zn1dO3JldHVybiBzYihwLHUpfHxwLnB1c2goe3R5cGU6Im5ld2xpbmUiLG9mZnNldDotMSxpbmRlbnQ6cixzb3VyY2U6YApgfSkse3R5cGU6ImJsb2NrLXNjYWxhciIsb2Zmc2V0OmksaW5kZW50OnIscHJvcHM6cCxzb3VyY2U6Y319Y2FzZSciJzpyZXR1cm57dHlwZToiZG91YmxlLXF1b3RlZC1zY2FsYXIiLG9mZnNldDppLGluZGVudDpyLHNvdXJjZTphLGVuZDp1fTtjYXNlIiciOnJldHVybnt0eXBlOiJzaW5nbGUtcXVvdGVkLXNjYWxhciIsb2Zmc2V0OmksaW5kZW50OnIsc291cmNlOmEsZW5kOnV9O2RlZmF1bHQ6cmV0dXJue3R5cGU6InNjYWxhciIsb2Zmc2V0OmksaW5kZW50OnIsc291cmNlOmEsZW5kOnV9fX1mdW5jdGlvbiBhNihlLHQsbj17fSl7bGV0e2FmdGVyS2V5OnI9ITEsaW1wbGljaXRLZXk6cz0hMSxpbkZsb3c6aT0hMSx0eXBlOm99PW4sYT0iaW5kZW50ImluIGU/ZS5pbmRlbnQ6bnVsbDtpZihyJiZ0eXBlb2YgYT09Im51bWJlciImJihhKz0yKSwhbylzd2l0Y2goZS50eXBlKXtjYXNlInNpbmdsZS1xdW90ZWQtc2NhbGFyIjpvPSJRVU9URV9TSU5HTEUiO2JyZWFrO2Nhc2UiZG91YmxlLXF1b3RlZC1zY2FsYXIiOm89IlFVT1RFX0RPVUJMRSI7YnJlYWs7Y2FzZSJibG9jay1zY2FsYXIiOntsZXQgbD1lLnByb3BzWzBdO2lmKGwudHlwZSE9PSJibG9jay1zY2FsYXItaGVhZGVyIil0aHJvdyBuZXcgRXJyb3IoIkludmFsaWQgYmxvY2sgc2NhbGFyIGhlYWRlciIpO289bC5zb3VyY2VbMF09PT0iPiI/IkJMT0NLX0ZPTERFRCI6IkJMT0NLX0xJVEVSQUwiO2JyZWFrfWRlZmF1bHQ6bz0iUExBSU4ifWxldCB1PUlhKHt0eXBlOm8sdmFsdWU6dH0se2ltcGxpY2l0S2V5OnN8fGE9PT1udWxsLGluZGVudDphIT09bnVsbCYmYT4wPyIgIi5yZXBlYXQoYSk6IiIsaW5GbG93Omksb3B0aW9uczp7YmxvY2tRdW90ZTohMCxsaW5lV2lkdGg6LTF9fSk7c3dpdGNoKHVbMF0pe2Nhc2UifCI6Y2FzZSI+Ijp1NihlLHUpO2JyZWFrO2Nhc2UnIic6cWgoZSx1LCJkb3VibGUtcXVvdGVkLXNjYWxhciIpO2JyZWFrO2Nhc2UiJyI6cWgoZSx1LCJzaW5nbGUtcXVvdGVkLXNjYWxhciIpO2JyZWFrO2RlZmF1bHQ6cWgoZSx1LCJzY2FsYXIiKX19ZnVuY3Rpb24gdTYoZSx0KXtsZXQgbj10LmluZGV4T2YoYApgKSxyPXQuc3Vic3RyaW5nKDAsbikscz10LnN1YnN0cmluZyhuKzEpK2AKYDtpZihlLnR5cGU9PT0iYmxvY2stc2NhbGFyIil7bGV0IGk9ZS5wcm9wc1swXTtpZihpLnR5cGUhPT0iYmxvY2stc2NhbGFyLWhlYWRlciIpdGhyb3cgbmV3IEVycm9yKCJJbnZhbGlkIGJsb2NrIHNjYWxhciBoZWFkZXIiKTtpLnNvdXJjZT1yLGUuc291cmNlPXN9ZWxzZXtsZXR7b2Zmc2V0Oml9PWUsbz0iaW5kZW50ImluIGU/ZS5pbmRlbnQ6LTEsYT1be3R5cGU6ImJsb2NrLXNjYWxhci1oZWFkZXIiLG9mZnNldDppLGluZGVudDpvLHNvdXJjZTpyfV07c2IoYSwiZW5kImluIGU/ZS5lbmQ6dm9pZCAwKXx8YS5wdXNoKHt0eXBlOiJuZXdsaW5lIixvZmZzZXQ6LTEsaW5kZW50Om8sc291cmNlOmAKYH0pO2ZvcihsZXQgdSBvZiBPYmplY3Qua2V5cyhlKSl1IT09InR5cGUiJiZ1IT09Im9mZnNldCImJmRlbGV0ZSBlW3VdO09iamVjdC5hc3NpZ24oZSx7dHlwZToiYmxvY2stc2NhbGFyIixpbmRlbnQ6byxwcm9wczphLHNvdXJjZTpzfSl9fWZ1bmN0aW9uIHNiKGUsdCl7aWYodClmb3IobGV0IG4gb2YgdClzd2l0Y2gobi50eXBlKXtjYXNlInNwYWNlIjpjYXNlImNvbW1lbnQiOmUucHVzaChuKTticmVhaztjYXNlIm5ld2xpbmUiOnJldHVybiBlLnB1c2gobiksITB9cmV0dXJuITF9ZnVuY3Rpb24gcWgoZSx0LG4pe3N3aXRjaChlLnR5cGUpe2Nhc2Uic2NhbGFyIjpjYXNlImRvdWJsZS1xdW90ZWQtc2NhbGFyIjpjYXNlInNpbmdsZS1xdW90ZWQtc2NhbGFyIjplLnR5cGU9bixlLnNvdXJjZT10O2JyZWFrO2Nhc2UiYmxvY2stc2NhbGFyIjp7bGV0IHI9ZS5wcm9wcy5zbGljZSgxKSxzPXQubGVuZ3RoO2UucHJvcHNbMF0udHlwZT09PSJibG9jay1zY2FsYXItaGVhZGVyIiYmKHMtPWUucHJvcHNbMF0uc291cmNlLmxlbmd0aCk7Zm9yKGxldCBpIG9mIHIpaS5vZmZzZXQrPXM7ZGVsZXRlIGUucHJvcHMsT2JqZWN0LmFzc2lnbihlLHt0eXBlOm4sc291cmNlOnQsZW5kOnJ9KTticmVha31jYXNlImJsb2NrLW1hcCI6Y2FzZSJibG9jay1zZXEiOntsZXQgcj17dHlwZToibmV3bGluZSIsb2Zmc2V0OmUub2Zmc2V0K3QubGVuZ3RoLGluZGVudDplLmluZGVudCxzb3VyY2U6YApgfTtkZWxldGUgZS5pdGVtcyxPYmplY3QuYXNzaWduKGUse3R5cGU6bixzb3VyY2U6dCxlbmQ6W3JdfSk7YnJlYWt9ZGVmYXVsdDp7bGV0IHI9ImluZGVudCJpbiBlP2UuaW5kZW50Oi0xLHM9ImVuZCJpbiBlJiZBcnJheS5pc0FycmF5KGUuZW5kKT9lLmVuZC5maWx0ZXIoaT0+aS50eXBlPT09InNwYWNlInx8aS50eXBlPT09ImNvbW1lbnQifHxpLnR5cGU9PT0ibmV3bGluZSIpOltdO2ZvcihsZXQgaSBvZiBPYmplY3Qua2V5cyhlKSlpIT09InR5cGUiJiZpIT09Im9mZnNldCImJmRlbGV0ZSBlW2ldO09iamVjdC5hc3NpZ24oZSx7dHlwZTpuLGluZGVudDpyLHNvdXJjZTp0LGVuZDpzfSl9fX12YXIgbDY9ZT0+InR5cGUiaW4gZT9lYyhlKTp0YyhlKTtmdW5jdGlvbiBlYyhlKXtzd2l0Y2goZS50eXBlKXtjYXNlImJsb2NrLXNjYWxhciI6e2xldCB0PSIiO2ZvcihsZXQgbiBvZiBlLnByb3BzKXQrPWVjKG4pO3JldHVybiB0K2Uuc291cmNlfWNhc2UiYmxvY2stbWFwIjpjYXNlImJsb2NrLXNlcSI6e2xldCB0PSIiO2ZvcihsZXQgbiBvZiBlLml0ZW1zKXQrPXRjKG4pO3JldHVybiB0fWNhc2UiZmxvdy1jb2xsZWN0aW9uIjp7bGV0IHQ9ZS5zdGFydC5zb3VyY2U7Zm9yKGxldCBuIG9mIGUuaXRlbXMpdCs9dGMobik7Zm9yKGxldCBuIG9mIGUuZW5kKXQrPW4uc291cmNlO3JldHVybiB0fWNhc2UiZG9jdW1lbnQiOntsZXQgdD10YyhlKTtpZihlLmVuZClmb3IobGV0IG4gb2YgZS5lbmQpdCs9bi5zb3VyY2U7cmV0dXJuIHR9ZGVmYXVsdDp7bGV0IHQ9ZS5zb3VyY2U7aWYoImVuZCJpbiBlJiZlLmVuZClmb3IobGV0IG4gb2YgZS5lbmQpdCs9bi5zb3VyY2U7cmV0dXJuIHR9fX1mdW5jdGlvbiB0Yyh7c3RhcnQ6ZSxrZXk6dCxzZXA6bix2YWx1ZTpyfSl7bGV0IHM9IiI7Zm9yKGxldCBpIG9mIGUpcys9aS5zb3VyY2U7aWYodCYmKHMrPWVjKHQpKSxuKWZvcihsZXQgaSBvZiBuKXMrPWkuc291cmNlO3JldHVybiByJiYocys9ZWMocikpLHN9dmFyIFdoPVN5bWJvbCgiYnJlYWsgdmlzaXQiKSxjNj1TeW1ib2woInNraXAgY2hpbGRyZW4iKSxpYj1TeW1ib2woInJlbW92ZSBpdGVtIik7ZnVuY3Rpb24gUXMoZSx0KXsidHlwZSJpbiBlJiZlLnR5cGU9PT0iZG9jdW1lbnQiJiYoZT17c3RhcnQ6ZS5zdGFydCx2YWx1ZTplLnZhbHVlfSksb2IoT2JqZWN0LmZyZWV6ZShbXSksZSx0KX1Rcy5CUkVBSz1XaCxRcy5TS0lQPWM2LFFzLlJFTU9WRT1pYixRcy5pdGVtQXRQYXRoPShlLHQpPT57bGV0IG49ZTtmb3IobGV0W3Isc11vZiB0KXtsZXQgaT1uPT1udWxsP3ZvaWQgMDpuW3JdO2lmKGkmJiJpdGVtcyJpbiBpKW49aS5pdGVtc1tzXTtlbHNlIHJldHVybn1yZXR1cm4gbn0sUXMucGFyZW50Q29sbGVjdGlvbj0oZSx0KT0+e2xldCBuPVFzLml0ZW1BdFBhdGgoZSx0LnNsaWNlKDAsLTEpKSxyPXRbdC5sZW5ndGgtMV1bMF0scz1uPT1udWxsP3ZvaWQgMDpuW3JdO2lmKHMmJiJpdGVtcyJpbiBzKXJldHVybiBzO3Rocm93IG5ldyBFcnJvcigiUGFyZW50IGNvbGxlY3Rpb24gbm90IGZvdW5kIil9O2Z1bmN0aW9uIG9iKGUsdCxuKXtsZXQgcj1uKHQsZSk7aWYodHlwZW9mIHI9PSJzeW1ib2wiKXJldHVybiByO2ZvcihsZXQgcyBvZlsia2V5IiwidmFsdWUiXSl7bGV0IGk9dFtzXTtpZihpJiYiaXRlbXMiaW4gaSl7Zm9yKGxldCBvPTA7bzxpLml0ZW1zLmxlbmd0aDsrK28pe2xldCBhPW9iKE9iamVjdC5mcmVlemUoZS5jb25jYXQoW1tzLG9dXSkpLGkuaXRlbXNbb10sbik7aWYodHlwZW9mIGE9PSJudW1iZXIiKW89YS0xO2Vsc2V7aWYoYT09PVdoKXJldHVybiBXaDthPT09aWImJihpLml0ZW1zLnNwbGljZShvLDEpLG8tPTEpfX10eXBlb2Ygcj09ImZ1bmN0aW9uIiYmcz09PSJrZXkiJiYocj1yKHQsZSkpfX1yZXR1cm4gdHlwZW9mIHI9PSJmdW5jdGlvbiI/cih0LGUpOnJ9dmFyIG5jPSJcdUZFRkYiLHJjPSICIixzYz0iGCIsamE9Ih8iLGY2PWU9PiEhZSYmIml0ZW1zImluIGUscDY9ZT0+ISFlJiYoZS50eXBlPT09InNjYWxhciJ8fGUudHlwZT09PSJzaW5nbGUtcXVvdGVkLXNjYWxhciJ8fGUudHlwZT09PSJkb3VibGUtcXVvdGVkLXNjYWxhciJ8fGUudHlwZT09PSJibG9jay1zY2FsYXIiKTtmdW5jdGlvbiBoNihlKXtzd2l0Y2goZSl7Y2FzZSBuYzpyZXR1cm4iPEJPTT4iO2Nhc2UgcmM6cmV0dXJuIjxET0M+IjtjYXNlIHNjOnJldHVybiI8RkxPV19FTkQ+IjtjYXNlIGphOnJldHVybiI8U0NBTEFSPiI7ZGVmYXVsdDpyZXR1cm4gSlNPTi5zdHJpbmdpZnkoZSl9fWZ1bmN0aW9uIGFiKGUpe3N3aXRjaChlKXtjYXNlIG5jOnJldHVybiJieXRlLW9yZGVyLW1hcmsiO2Nhc2UgcmM6cmV0dXJuImRvYy1tb2RlIjtjYXNlIHNjOnJldHVybiJmbG93LWVycm9yLWVuZCI7Y2FzZSBqYTpyZXR1cm4ic2NhbGFyIjtjYXNlIi0tLSI6cmV0dXJuImRvYy1zdGFydCI7Y2FzZSIuLi4iOnJldHVybiJkb2MtZW5kIjtjYXNlIiI6Y2FzZWAKYDpjYXNlYFxyCmA6cmV0dXJuIm5ld2xpbmUiO2Nhc2UiLSI6cmV0dXJuInNlcS1pdGVtLWluZCI7Y2FzZSI/IjpyZXR1cm4iZXhwbGljaXQta2V5LWluZCI7Y2FzZSI6IjpyZXR1cm4ibWFwLXZhbHVlLWluZCI7Y2FzZSJ7IjpyZXR1cm4iZmxvdy1tYXAtc3RhcnQiO2Nhc2UifSI6cmV0dXJuImZsb3ctbWFwLWVuZCI7Y2FzZSJbIjpyZXR1cm4iZmxvdy1zZXEtc3RhcnQiO2Nhc2UiXSI6cmV0dXJuImZsb3ctc2VxLWVuZCI7Y2FzZSIsIjpyZXR1cm4iY29tbWEifXN3aXRjaChlWzBdKXtjYXNlIiAiOmNhc2UiCSI6cmV0dXJuInNwYWNlIjtjYXNlIiMiOnJldHVybiJjb21tZW50IjtjYXNlIiUiOnJldHVybiJkaXJlY3RpdmUtbGluZSI7Y2FzZSIqIjpyZXR1cm4iYWxpYXMiO2Nhc2UiJiI6cmV0dXJuImFuY2hvciI7Y2FzZSIhIjpyZXR1cm4idGFnIjtjYXNlIiciOnJldHVybiJzaW5nbGUtcXVvdGVkLXNjYWxhciI7Y2FzZSciJzpyZXR1cm4iZG91YmxlLXF1b3RlZC1zY2FsYXIiO2Nhc2UifCI6Y2FzZSI+IjpyZXR1cm4iYmxvY2stc2NhbGFyLWhlYWRlciJ9cmV0dXJuIG51bGx9ZnVuY3Rpb24gVW4oZSl7c3dpdGNoKGUpe2Nhc2Ugdm9pZCAwOmNhc2UiICI6Y2FzZWAKYDpjYXNlIlxyIjpjYXNlIgkiOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fXZhciB1Yj1uZXcgU2V0KCIwMTIzNDU2Nzg5QUJDREVGYWJjZGVmIiksZDY9bmV3IFNldCgiMDEyMzQ1Njc4OUFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXotIzsvPzpAJj0rJF8uIX4qJygpIiksaWM9bmV3IFNldCgiLFtde30iKSxtNj1uZXcgU2V0KGAgLFtde30KXHIJYCksSGg9ZT0+IWV8fG02LmhhcyhlKSxsYj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuYXRFbmQ9ITEsdGhpcy5ibG9ja1NjYWxhckluZGVudD0tMSx0aGlzLmJsb2NrU2NhbGFyS2VlcD0hMSx0aGlzLmJ1ZmZlcj0iIix0aGlzLmZsb3dLZXk9ITEsdGhpcy5mbG93TGV2ZWw9MCx0aGlzLmluZGVudE5leHQ9MCx0aGlzLmluZGVudFZhbHVlPTAsdGhpcy5saW5lRW5kUG9zPW51bGwsdGhpcy5uZXh0PW51bGwsdGhpcy5wb3M9MH0qbGV4KHQsbj0hMSl7aWYodCl7aWYodHlwZW9mIHQhPSJzdHJpbmciKXRocm93IFR5cGVFcnJvcigic291cmNlIGlzIG5vdCBhIHN0cmluZyIpO3RoaXMuYnVmZmVyPXRoaXMuYnVmZmVyP3RoaXMuYnVmZmVyK3Q6dCx0aGlzLmxpbmVFbmRQb3M9bnVsbH10aGlzLmF0RW5kPSFuO2xldCByPXRoaXMubmV4dD8/InN0cmVhbSI7Zm9yKDtyJiYobnx8dGhpcy5oYXNDaGFycygxKSk7KXI9eWllbGQqdGhpcy5wYXJzZU5leHQocil9YXRMaW5lRW5kKCl7bGV0IHQ9dGhpcy5wb3Msbj10aGlzLmJ1ZmZlclt0XTtmb3IoO249PT0iICJ8fG49PT0iCSI7KW49dGhpcy5idWZmZXJbKyt0XTtyZXR1cm4hbnx8bj09PSIjInx8bj09PWAKYD8hMDpuPT09IlxyIj90aGlzLmJ1ZmZlclt0KzFdPT09YApgOiExfWNoYXJBdCh0KXtyZXR1cm4gdGhpcy5idWZmZXJbdGhpcy5wb3MrdF19Y29udGludWVTY2FsYXIodCl7bGV0IG49dGhpcy5idWZmZXJbdF07aWYodGhpcy5pbmRlbnROZXh0PjApe2xldCByPTA7Zm9yKDtuPT09IiAiOyluPXRoaXMuYnVmZmVyWysrcit0XTtpZihuPT09IlxyIil7bGV0IHM9dGhpcy5idWZmZXJbcit0KzFdO2lmKHM9PT1gCmB8fCFzJiYhdGhpcy5hdEVuZClyZXR1cm4gdCtyKzF9cmV0dXJuIG49PT1gCmB8fHI+PXRoaXMuaW5kZW50TmV4dHx8IW4mJiF0aGlzLmF0RW5kP3QrcjotMX1pZihuPT09Ii0ifHxuPT09Ii4iKXtsZXQgcj10aGlzLmJ1ZmZlci5zdWJzdHIodCwzKTtpZigocj09PSItLS0ifHxyPT09Ii4uLiIpJiZVbih0aGlzLmJ1ZmZlclt0KzNdKSlyZXR1cm4tMX1yZXR1cm4gdH1nZXRMaW5lKCl7bGV0IHQ9dGhpcy5saW5lRW5kUG9zO3JldHVybih0eXBlb2YgdCE9Im51bWJlciJ8fHQhPT0tMSYmdDx0aGlzLnBvcykmJih0PXRoaXMuYnVmZmVyLmluZGV4T2YoYApgLHRoaXMucG9zKSx0aGlzLmxpbmVFbmRQb3M9dCksdD09PS0xP3RoaXMuYXRFbmQ/dGhpcy5idWZmZXIuc3Vic3RyaW5nKHRoaXMucG9zKTpudWxsOih0aGlzLmJ1ZmZlclt0LTFdPT09IlxyIiYmKHQtPTEpLHRoaXMuYnVmZmVyLnN1YnN0cmluZyh0aGlzLnBvcyx0KSl9aGFzQ2hhcnModCl7cmV0dXJuIHRoaXMucG9zK3Q8PXRoaXMuYnVmZmVyLmxlbmd0aH1zZXROZXh0KHQpe3JldHVybiB0aGlzLmJ1ZmZlcj10aGlzLmJ1ZmZlci5zdWJzdHJpbmcodGhpcy5wb3MpLHRoaXMucG9zPTAsdGhpcy5saW5lRW5kUG9zPW51bGwsdGhpcy5uZXh0PXQsbnVsbH1wZWVrKHQpe3JldHVybiB0aGlzLmJ1ZmZlci5zdWJzdHIodGhpcy5wb3MsdCl9KnBhcnNlTmV4dCh0KXtzd2l0Y2godCl7Y2FzZSJzdHJlYW0iOnJldHVybiB5aWVsZCp0aGlzLnBhcnNlU3RyZWFtKCk7Y2FzZSJsaW5lLXN0YXJ0IjpyZXR1cm4geWllbGQqdGhpcy5wYXJzZUxpbmVTdGFydCgpO2Nhc2UiYmxvY2stc3RhcnQiOnJldHVybiB5aWVsZCp0aGlzLnBhcnNlQmxvY2tTdGFydCgpO2Nhc2UiZG9jIjpyZXR1cm4geWllbGQqdGhpcy5wYXJzZURvY3VtZW50KCk7Y2FzZSJmbG93IjpyZXR1cm4geWllbGQqdGhpcy5wYXJzZUZsb3dDb2xsZWN0aW9uKCk7Y2FzZSJxdW90ZWQtc2NhbGFyIjpyZXR1cm4geWllbGQqdGhpcy5wYXJzZVF1b3RlZFNjYWxhcigpO2Nhc2UiYmxvY2stc2NhbGFyIjpyZXR1cm4geWllbGQqdGhpcy5wYXJzZUJsb2NrU2NhbGFyKCk7Y2FzZSJwbGFpbi1zY2FsYXIiOnJldHVybiB5aWVsZCp0aGlzLnBhcnNlUGxhaW5TY2FsYXIoKX19KnBhcnNlU3RyZWFtKCl7bGV0IHQ9dGhpcy5nZXRMaW5lKCk7aWYodD09PW51bGwpcmV0dXJuIHRoaXMuc2V0TmV4dCgic3RyZWFtIik7aWYodFswXT09PW5jJiYoeWllbGQqdGhpcy5wdXNoQ291bnQoMSksdD10LnN1YnN0cmluZygxKSksdFswXT09PSIlIil7bGV0IG49dC5sZW5ndGgscj10LmluZGV4T2YoIiMiKTtmb3IoO3IhPT0tMTspe2xldCBpPXRbci0xXTtpZihpPT09IiAifHxpPT09IgkiKXtuPXItMTticmVha31lbHNlIHI9dC5pbmRleE9mKCIjIixyKzEpfWZvcig7Oyl7bGV0IGk9dFtuLTFdO2lmKGk9PT0iICJ8fGk9PT0iCSIpbi09MTtlbHNlIGJyZWFrfWxldCBzPSh5aWVsZCp0aGlzLnB1c2hDb3VudChuKSkrKHlpZWxkKnRoaXMucHVzaFNwYWNlcyghMCkpO3JldHVybiB5aWVsZCp0aGlzLnB1c2hDb3VudCh0Lmxlbmd0aC1zKSx0aGlzLnB1c2hOZXdsaW5lKCksInN0cmVhbSJ9aWYodGhpcy5hdExpbmVFbmQoKSl7bGV0IG49eWllbGQqdGhpcy5wdXNoU3BhY2VzKCEwKTtyZXR1cm4geWllbGQqdGhpcy5wdXNoQ291bnQodC5sZW5ndGgtbikseWllbGQqdGhpcy5wdXNoTmV3bGluZSgpLCJzdHJlYW0ifXJldHVybiB5aWVsZCByYyx5aWVsZCp0aGlzLnBhcnNlTGluZVN0YXJ0KCl9KnBhcnNlTGluZVN0YXJ0KCl7bGV0IHQ9dGhpcy5jaGFyQXQoMCk7aWYoIXQmJiF0aGlzLmF0RW5kKXJldHVybiB0aGlzLnNldE5leHQoImxpbmUtc3RhcnQiKTtpZih0PT09Ii0ifHx0PT09Ii4iKXtpZighdGhpcy5hdEVuZCYmIXRoaXMuaGFzQ2hhcnMoNCkpcmV0dXJuIHRoaXMuc2V0TmV4dCgibGluZS1zdGFydCIpO2xldCBuPXRoaXMucGVlaygzKTtpZigobj09PSItLS0ifHxuPT09Ii4uLiIpJiZVbih0aGlzLmNoYXJBdCgzKSkpcmV0dXJuIHlpZWxkKnRoaXMucHVzaENvdW50KDMpLHRoaXMuaW5kZW50VmFsdWU9MCx0aGlzLmluZGVudE5leHQ9MCxuPT09Ii0tLSI/ImRvYyI6InN0cmVhbSJ9cmV0dXJuIHRoaXMuaW5kZW50VmFsdWU9eWllbGQqdGhpcy5wdXNoU3BhY2VzKCExKSx0aGlzLmluZGVudE5leHQ+dGhpcy5pbmRlbnRWYWx1ZSYmIVVuKHRoaXMuY2hhckF0KDEpKSYmKHRoaXMuaW5kZW50TmV4dD10aGlzLmluZGVudFZhbHVlKSx5aWVsZCp0aGlzLnBhcnNlQmxvY2tTdGFydCgpfSpwYXJzZUJsb2NrU3RhcnQoKXtsZXRbdCxuXT10aGlzLnBlZWsoMik7aWYoIW4mJiF0aGlzLmF0RW5kKXJldHVybiB0aGlzLnNldE5leHQoImJsb2NrLXN0YXJ0Iik7aWYoKHQ9PT0iLSJ8fHQ9PT0iPyJ8fHQ9PT0iOiIpJiZVbihuKSl7bGV0IHI9KHlpZWxkKnRoaXMucHVzaENvdW50KDEpKSsoeWllbGQqdGhpcy5wdXNoU3BhY2VzKCEwKSk7cmV0dXJuIHRoaXMuaW5kZW50TmV4dD10aGlzLmluZGVudFZhbHVlKzEsdGhpcy5pbmRlbnRWYWx1ZSs9ciwiYmxvY2stc3RhcnQifXJldHVybiJkb2MifSpwYXJzZURvY3VtZW50KCl7eWllbGQqdGhpcy5wdXNoU3BhY2VzKCEwKTtsZXQgdD10aGlzLmdldExpbmUoKTtpZih0PT09bnVsbClyZXR1cm4gdGhpcy5zZXROZXh0KCJkb2MiKTtsZXQgbj15aWVsZCp0aGlzLnB1c2hJbmRpY2F0b3JzKCk7c3dpdGNoKHRbbl0pe2Nhc2UiIyI6eWllbGQqdGhpcy5wdXNoQ291bnQodC5sZW5ndGgtbik7Y2FzZSB2b2lkIDA6cmV0dXJuIHlpZWxkKnRoaXMucHVzaE5ld2xpbmUoKSx5aWVsZCp0aGlzLnBhcnNlTGluZVN0YXJ0KCk7Y2FzZSJ7IjpjYXNlIlsiOnJldHVybiB5aWVsZCp0aGlzLnB1c2hDb3VudCgxKSx0aGlzLmZsb3dLZXk9ITEsdGhpcy5mbG93TGV2ZWw9MSwiZmxvdyI7Y2FzZSJ9IjpjYXNlIl0iOnJldHVybiB5aWVsZCp0aGlzLnB1c2hDb3VudCgxKSwiZG9jIjtjYXNlIioiOnJldHVybiB5aWVsZCp0aGlzLnB1c2hVbnRpbChIaCksImRvYyI7Y2FzZSciJzpjYXNlIiciOnJldHVybiB5aWVsZCp0aGlzLnBhcnNlUXVvdGVkU2NhbGFyKCk7Y2FzZSJ8IjpjYXNlIj4iOnJldHVybiBuKz15aWVsZCp0aGlzLnBhcnNlQmxvY2tTY2FsYXJIZWFkZXIoKSxuKz15aWVsZCp0aGlzLnB1c2hTcGFjZXMoITApLHlpZWxkKnRoaXMucHVzaENvdW50KHQubGVuZ3RoLW4pLHlpZWxkKnRoaXMucHVzaE5ld2xpbmUoKSx5aWVsZCp0aGlzLnBhcnNlQmxvY2tTY2FsYXIoKTtkZWZhdWx0OnJldHVybiB5aWVsZCp0aGlzLnBhcnNlUGxhaW5TY2FsYXIoKX19KnBhcnNlRmxvd0NvbGxlY3Rpb24oKXtsZXQgdCxuLHI9LTE7ZG8gdD15aWVsZCp0aGlzLnB1c2hOZXdsaW5lKCksdD4wPyhuPXlpZWxkKnRoaXMucHVzaFNwYWNlcyghMSksdGhpcy5pbmRlbnRWYWx1ZT1yPW4pOm49MCxuKz15aWVsZCp0aGlzLnB1c2hTcGFjZXMoITApO3doaWxlKHQrbj4wKTtsZXQgcz10aGlzLmdldExpbmUoKTtpZihzPT09bnVsbClyZXR1cm4gdGhpcy5zZXROZXh0KCJmbG93Iik7aWYoKHIhPT0tMSYmcjx0aGlzLmluZGVudE5leHQmJnNbMF0hPT0iIyJ8fHI9PT0wJiYocy5zdGFydHNXaXRoKCItLS0iKXx8cy5zdGFydHNXaXRoKCIuLi4iKSkmJlVuKHNbM10pKSYmIShyPT09dGhpcy5pbmRlbnROZXh0LTEmJnRoaXMuZmxvd0xldmVsPT09MSYmKHNbMF09PT0iXSJ8fHNbMF09PT0ifSIpKSlyZXR1cm4gdGhpcy5mbG93TGV2ZWw9MCx5aWVsZCBzYyx5aWVsZCp0aGlzLnBhcnNlTGluZVN0YXJ0KCk7bGV0IGk9MDtmb3IoO3NbaV09PT0iLCI7KWkrPXlpZWxkKnRoaXMucHVzaENvdW50KDEpLGkrPXlpZWxkKnRoaXMucHVzaFNwYWNlcyghMCksdGhpcy5mbG93S2V5PSExO3N3aXRjaChpKz15aWVsZCp0aGlzLnB1c2hJbmRpY2F0b3JzKCksc1tpXSl7Y2FzZSB2b2lkIDA6cmV0dXJuImZsb3ciO2Nhc2UiIyI6cmV0dXJuIHlpZWxkKnRoaXMucHVzaENvdW50KHMubGVuZ3RoLWkpLCJmbG93IjtjYXNlInsiOmNhc2UiWyI6cmV0dXJuIHlpZWxkKnRoaXMucHVzaENvdW50KDEpLHRoaXMuZmxvd0tleT0hMSx0aGlzLmZsb3dMZXZlbCs9MSwiZmxvdyI7Y2FzZSJ9IjpjYXNlIl0iOnJldHVybiB5aWVsZCp0aGlzLnB1c2hDb3VudCgxKSx0aGlzLmZsb3dLZXk9ITAsdGhpcy5mbG93TGV2ZWwtPTEsdGhpcy5mbG93TGV2ZWw/ImZsb3ciOiJkb2MiO2Nhc2UiKiI6cmV0dXJuIHlpZWxkKnRoaXMucHVzaFVudGlsKEhoKSwiZmxvdyI7Y2FzZSciJzpjYXNlIiciOnJldHVybiB0aGlzLmZsb3dLZXk9ITAseWllbGQqdGhpcy5wYXJzZVF1b3RlZFNjYWxhcigpO2Nhc2UiOiI6e2xldCBvPXRoaXMuY2hhckF0KDEpO2lmKHRoaXMuZmxvd0tleXx8VW4obyl8fG89PT0iLCIpcmV0dXJuIHRoaXMuZmxvd0tleT0hMSx5aWVsZCp0aGlzLnB1c2hDb3VudCgxKSx5aWVsZCp0aGlzLnB1c2hTcGFjZXMoITApLCJmbG93In1kZWZhdWx0OnJldHVybiB0aGlzLmZsb3dLZXk9ITEseWllbGQqdGhpcy5wYXJzZVBsYWluU2NhbGFyKCl9fSpwYXJzZVF1b3RlZFNjYWxhcigpe2xldCB0PXRoaXMuY2hhckF0KDApLG49dGhpcy5idWZmZXIuaW5kZXhPZih0LHRoaXMucG9zKzEpO2lmKHQ9PT0iJyIpZm9yKDtuIT09LTEmJnRoaXMuYnVmZmVyW24rMV09PT0iJyI7KW49dGhpcy5idWZmZXIuaW5kZXhPZigiJyIsbisyKTtlbHNlIGZvcig7biE9PS0xOyl7bGV0IGk9MDtmb3IoO3RoaXMuYnVmZmVyW24tMS1pXT09PSJcXCI7KWkrPTE7aWYoaSUyPT09MClicmVhaztuPXRoaXMuYnVmZmVyLmluZGV4T2YoJyInLG4rMSl9bGV0IHI9dGhpcy5idWZmZXIuc3Vic3RyaW5nKDAsbikscz1yLmluZGV4T2YoYApgLHRoaXMucG9zKTtpZihzIT09LTEpe2Zvcig7cyE9PS0xOyl7bGV0IGk9dGhpcy5jb250aW51ZVNjYWxhcihzKzEpO2lmKGk9PT0tMSlicmVhaztzPXIuaW5kZXhPZihgCmAsaSl9cyE9PS0xJiYobj1zLShyW3MtMV09PT0iXHIiPzI6MSkpfWlmKG49PT0tMSl7aWYoIXRoaXMuYXRFbmQpcmV0dXJuIHRoaXMuc2V0TmV4dCgicXVvdGVkLXNjYWxhciIpO249dGhpcy5idWZmZXIubGVuZ3RofXJldHVybiB5aWVsZCp0aGlzLnB1c2hUb0luZGV4KG4rMSwhMSksdGhpcy5mbG93TGV2ZWw/ImZsb3ciOiJkb2MifSpwYXJzZUJsb2NrU2NhbGFySGVhZGVyKCl7dGhpcy5ibG9ja1NjYWxhckluZGVudD0tMSx0aGlzLmJsb2NrU2NhbGFyS2VlcD0hMTtsZXQgdD10aGlzLnBvcztmb3IoOzspe2xldCBuPXRoaXMuYnVmZmVyWysrdF07aWYobj09PSIrIil0aGlzLmJsb2NrU2NhbGFyS2VlcD0hMDtlbHNlIGlmKG4+IjAiJiZuPD0iOSIpdGhpcy5ibG9ja1NjYWxhckluZGVudD1OdW1iZXIobiktMTtlbHNlIGlmKG4hPT0iLSIpYnJlYWt9cmV0dXJuIHlpZWxkKnRoaXMucHVzaFVudGlsKG49PlVuKG4pfHxuPT09IiMiKX0qcGFyc2VCbG9ja1NjYWxhcigpe2xldCB0PXRoaXMucG9zLTEsbj0wLHI7ZTpmb3IobGV0IGk9dGhpcy5wb3M7cj10aGlzLmJ1ZmZlcltpXTsrK2kpc3dpdGNoKHIpe2Nhc2UiICI6bis9MTticmVhaztjYXNlYApgOnQ9aSxuPTA7YnJlYWs7Y2FzZSJcciI6e2xldCBvPXRoaXMuYnVmZmVyW2krMV07aWYoIW8mJiF0aGlzLmF0RW5kKXJldHVybiB0aGlzLnNldE5leHQoImJsb2NrLXNjYWxhciIpO2lmKG89PT1gCmApYnJlYWt9ZGVmYXVsdDpicmVhayBlfWlmKCFyJiYhdGhpcy5hdEVuZClyZXR1cm4gdGhpcy5zZXROZXh0KCJibG9jay1zY2FsYXIiKTtpZihuPj10aGlzLmluZGVudE5leHQpe3RoaXMuYmxvY2tTY2FsYXJJbmRlbnQ9PT0tMT90aGlzLmluZGVudE5leHQ9bjp0aGlzLmluZGVudE5leHQ9dGhpcy5ibG9ja1NjYWxhckluZGVudCsodGhpcy5pbmRlbnROZXh0PT09MD8xOnRoaXMuaW5kZW50TmV4dCk7ZG97bGV0IGk9dGhpcy5jb250aW51ZVNjYWxhcih0KzEpO2lmKGk9PT0tMSlicmVhazt0PXRoaXMuYnVmZmVyLmluZGV4T2YoYApgLGkpfXdoaWxlKHQhPT0tMSk7aWYodD09PS0xKXtpZighdGhpcy5hdEVuZClyZXR1cm4gdGhpcy5zZXROZXh0KCJibG9jay1zY2FsYXIiKTt0PXRoaXMuYnVmZmVyLmxlbmd0aH19bGV0IHM9dCsxO2ZvcihyPXRoaXMuYnVmZmVyW3NdO3I9PT0iICI7KXI9dGhpcy5idWZmZXJbKytzXTtpZihyPT09IgkiKXtmb3IoO3I9PT0iCSJ8fHI9PT0iICJ8fHI9PT0iXHIifHxyPT09YApgOylyPXRoaXMuYnVmZmVyWysrc107dD1zLTF9ZWxzZSBpZighdGhpcy5ibG9ja1NjYWxhcktlZXApZG97bGV0IGk9dC0xLG89dGhpcy5idWZmZXJbaV07bz09PSJcciImJihvPXRoaXMuYnVmZmVyWy0taV0pO2xldCBhPWk7Zm9yKDtvPT09IiAiOylvPXRoaXMuYnVmZmVyWy0taV07aWYobz09PWAKYCYmaT49dGhpcy5wb3MmJmkrMStuPmEpdD1pO2Vsc2UgYnJlYWt9d2hpbGUoITApO3JldHVybiB5aWVsZCBqYSx5aWVsZCp0aGlzLnB1c2hUb0luZGV4KHQrMSwhMCkseWllbGQqdGhpcy5wYXJzZUxpbmVTdGFydCgpfSpwYXJzZVBsYWluU2NhbGFyKCl7bGV0IHQ9dGhpcy5mbG93TGV2ZWw+MCxuPXRoaXMucG9zLTEscj10aGlzLnBvcy0xLHM7Zm9yKDtzPXRoaXMuYnVmZmVyWysrcl07KWlmKHM9PT0iOiIpe2xldCBpPXRoaXMuYnVmZmVyW3IrMV07aWYoVW4oaSl8fHQmJmljLmhhcyhpKSlicmVhaztuPXJ9ZWxzZSBpZihVbihzKSl7bGV0IGk9dGhpcy5idWZmZXJbcisxXTtpZihzPT09IlxyIiYmKGk9PT1gCmA/KHIrPTEscz1gCmAsaT10aGlzLmJ1ZmZlcltyKzFdKTpuPXIpLGk9PT0iIyJ8fHQmJmljLmhhcyhpKSlicmVhaztpZihzPT09YApgKXtsZXQgbz10aGlzLmNvbnRpbnVlU2NhbGFyKHIrMSk7aWYobz09PS0xKWJyZWFrO3I9TWF0aC5tYXgocixvLTIpfX1lbHNle2lmKHQmJmljLmhhcyhzKSlicmVhaztuPXJ9cmV0dXJuIXMmJiF0aGlzLmF0RW5kP3RoaXMuc2V0TmV4dCgicGxhaW4tc2NhbGFyIik6KHlpZWxkIGphLHlpZWxkKnRoaXMucHVzaFRvSW5kZXgobisxLCEwKSx0PyJmbG93IjoiZG9jIil9KnB1c2hDb3VudCh0KXtyZXR1cm4gdD4wPyh5aWVsZCB0aGlzLmJ1ZmZlci5zdWJzdHIodGhpcy5wb3MsdCksdGhpcy5wb3MrPXQsdCk6MH0qcHVzaFRvSW5kZXgodCxuKXtsZXQgcj10aGlzLmJ1ZmZlci5zbGljZSh0aGlzLnBvcyx0KTtyZXR1cm4gcj8oeWllbGQgcix0aGlzLnBvcys9ci5sZW5ndGgsci5sZW5ndGgpOihuJiYoeWllbGQiIiksMCl9KnB1c2hJbmRpY2F0b3JzKCl7bGV0IHQ9MDtlOmZvcig7Oyl7c3dpdGNoKHRoaXMuY2hhckF0KDApKXtjYXNlIiEiOnQrPXlpZWxkKnRoaXMucHVzaFRhZygpLHQrPXlpZWxkKnRoaXMucHVzaFNwYWNlcyghMCk7Y29udGludWUgZTtjYXNlIiYiOnQrPXlpZWxkKnRoaXMucHVzaFVudGlsKEhoKSx0Kz15aWVsZCp0aGlzLnB1c2hTcGFjZXMoITApO2NvbnRpbnVlIGU7Y2FzZSItIjpjYXNlIj8iOmNhc2UiOiI6e2xldCBuPXRoaXMuZmxvd0xldmVsPjAscj10aGlzLmNoYXJBdCgxKTtpZihVbihyKXx8biYmaWMuaGFzKHIpKXtuP3RoaXMuZmxvd0tleSYmKHRoaXMuZmxvd0tleT0hMSk6dGhpcy5pbmRlbnROZXh0PXRoaXMuaW5kZW50VmFsdWUrMSx0Kz15aWVsZCp0aGlzLnB1c2hDb3VudCgxKSx0Kz15aWVsZCp0aGlzLnB1c2hTcGFjZXMoITApO2NvbnRpbnVlIGV9fX1icmVhayBlfXJldHVybiB0fSpwdXNoVGFnKCl7aWYodGhpcy5jaGFyQXQoMSk9PT0iPCIpe2xldCB0PXRoaXMucG9zKzIsbj10aGlzLmJ1ZmZlclt0XTtmb3IoOyFVbihuKSYmbiE9PSI+Ijspbj10aGlzLmJ1ZmZlclsrK3RdO3JldHVybiB5aWVsZCp0aGlzLnB1c2hUb0luZGV4KG49PT0iPiI/dCsxOnQsITEpfWVsc2V7bGV0IHQ9dGhpcy5wb3MrMSxuPXRoaXMuYnVmZmVyW3RdO2Zvcig7bjspaWYoZDYuaGFzKG4pKW49dGhpcy5idWZmZXJbKyt0XTtlbHNlIGlmKG49PT0iJSImJnViLmhhcyh0aGlzLmJ1ZmZlclt0KzFdKSYmdWIuaGFzKHRoaXMuYnVmZmVyW3QrMl0pKW49dGhpcy5idWZmZXJbdCs9M107ZWxzZSBicmVhaztyZXR1cm4geWllbGQqdGhpcy5wdXNoVG9JbmRleCh0LCExKX19KnB1c2hOZXdsaW5lKCl7bGV0IHQ9dGhpcy5idWZmZXJbdGhpcy5wb3NdO3JldHVybiB0PT09YApgP3lpZWxkKnRoaXMucHVzaENvdW50KDEpOnQ9PT0iXHIiJiZ0aGlzLmNoYXJBdCgxKT09PWAKYD95aWVsZCp0aGlzLnB1c2hDb3VudCgyKTowfSpwdXNoU3BhY2VzKHQpe2xldCBuPXRoaXMucG9zLTEscjtkbyByPXRoaXMuYnVmZmVyWysrbl07d2hpbGUocj09PSIgInx8dCYmcj09PSIJIik7bGV0IHM9bi10aGlzLnBvcztyZXR1cm4gcz4wJiYoeWllbGQgdGhpcy5idWZmZXIuc3Vic3RyKHRoaXMucG9zLHMpLHRoaXMucG9zPW4pLHN9KnB1c2hVbnRpbCh0KXtsZXQgbj10aGlzLnBvcyxyPXRoaXMuYnVmZmVyW25dO2Zvcig7IXQocik7KXI9dGhpcy5idWZmZXJbKytuXTtyZXR1cm4geWllbGQqdGhpcy5wdXNoVG9JbmRleChuLCExKX19LEpoPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5saW5lU3RhcnRzPVtdLHRoaXMuYWRkTmV3TGluZT10PT50aGlzLmxpbmVTdGFydHMucHVzaCh0KSx0aGlzLmxpbmVQb3M9dD0+e2xldCBuPTAscj10aGlzLmxpbmVTdGFydHMubGVuZ3RoO2Zvcig7bjxyOyl7bGV0IGk9bityPj4xO3RoaXMubGluZVN0YXJ0c1tpXTx0P249aSsxOnI9aX1pZih0aGlzLmxpbmVTdGFydHNbbl09PT10KXJldHVybntsaW5lOm4rMSxjb2w6MX07aWYobj09PTApcmV0dXJue2xpbmU6MCxjb2w6dH07bGV0IHM9dGhpcy5saW5lU3RhcnRzW24tMV07cmV0dXJue2xpbmU6bixjb2w6dC1zKzF9fX19O2Z1bmN0aW9uIGhzKGUsdCl7Zm9yKGxldCBuPTA7bjxlLmxlbmd0aDsrK24paWYoZVtuXS50eXBlPT09dClyZXR1cm4hMDtyZXR1cm4hMX1mdW5jdGlvbiBjYihlKXtmb3IobGV0IHQ9MDt0PGUubGVuZ3RoOysrdClzd2l0Y2goZVt0XS50eXBlKXtjYXNlInNwYWNlIjpjYXNlImNvbW1lbnQiOmNhc2UibmV3bGluZSI6YnJlYWs7ZGVmYXVsdDpyZXR1cm4gdH1yZXR1cm4tMX1mdW5jdGlvbiBmYihlKXtzd2l0Y2goZT09bnVsbD92b2lkIDA6ZS50eXBlKXtjYXNlImFsaWFzIjpjYXNlInNjYWxhciI6Y2FzZSJzaW5nbGUtcXVvdGVkLXNjYWxhciI6Y2FzZSJkb3VibGUtcXVvdGVkLXNjYWxhciI6Y2FzZSJmbG93LWNvbGxlY3Rpb24iOnJldHVybiEwO2RlZmF1bHQ6cmV0dXJuITF9fWZ1bmN0aW9uIG9jKGUpe3N3aXRjaChlLnR5cGUpe2Nhc2UiZG9jdW1lbnQiOnJldHVybiBlLnN0YXJ0O2Nhc2UiYmxvY2stbWFwIjp7bGV0IHQ9ZS5pdGVtc1tlLml0ZW1zLmxlbmd0aC0xXTtyZXR1cm4gdC5zZXA/P3Quc3RhcnR9Y2FzZSJibG9jay1zZXEiOnJldHVybiBlLml0ZW1zW2UuaXRlbXMubGVuZ3RoLTFdLnN0YXJ0O2RlZmF1bHQ6cmV0dXJuW119fWZ1bmN0aW9uIERvKGUpe3ZhciBuO2lmKGUubGVuZ3RoPT09MClyZXR1cm5bXTtsZXQgdD1lLmxlbmd0aDtlOmZvcig7LS10Pj0wOylzd2l0Y2goZVt0XS50eXBlKXtjYXNlImRvYy1zdGFydCI6Y2FzZSJleHBsaWNpdC1rZXktaW5kIjpjYXNlIm1hcC12YWx1ZS1pbmQiOmNhc2Uic2VxLWl0ZW0taW5kIjpjYXNlIm5ld2xpbmUiOmJyZWFrIGV9Zm9yKDsoKG49ZVsrK3RdKT09bnVsbD92b2lkIDA6bi50eXBlKT09PSJzcGFjZSI7KTtyZXR1cm4gZS5zcGxpY2UodCxlLmxlbmd0aCl9ZnVuY3Rpb24gYWMoZSx0KXtpZih0Lmxlbmd0aDwxZTUpQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZSx0KTtlbHNlIGZvcihsZXQgbj0wO248dC5sZW5ndGg7KytuKWUucHVzaCh0W25dKX1mdW5jdGlvbiBwYihlKXtpZihlLnN0YXJ0LnR5cGU9PT0iZmxvdy1zZXEtc3RhcnQiKWZvcihsZXQgdCBvZiBlLml0ZW1zKXQuc2VwJiYhdC52YWx1ZSYmIWhzKHQuc3RhcnQsImV4cGxpY2l0LWtleS1pbmQiKSYmIWhzKHQuc2VwLCJtYXAtdmFsdWUtaW5kIikmJih0LmtleSYmKHQudmFsdWU9dC5rZXkpLGRlbGV0ZSB0LmtleSxmYih0LnZhbHVlKT90LnZhbHVlLmVuZD9hYyh0LnZhbHVlLmVuZCx0LnNlcCk6dC52YWx1ZS5lbmQ9dC5zZXA6YWModC5zdGFydCx0LnNlcCksZGVsZXRlIHQuc2VwKX12YXIgdWM9Y2xhc3N7Y29uc3RydWN0b3IodCl7dGhpcy5hdE5ld0xpbmU9ITAsdGhpcy5hdFNjYWxhcj0hMSx0aGlzLmluZGVudD0wLHRoaXMub2Zmc2V0PTAsdGhpcy5vbktleUxpbmU9ITEsdGhpcy5zdGFjaz1bXSx0aGlzLnNvdXJjZT0iIix0aGlzLnR5cGU9IiIsdGhpcy5sZXhlcj1uZXcgbGIsdGhpcy5vbk5ld0xpbmU9dH0qcGFyc2UodCxuPSExKXt0aGlzLm9uTmV3TGluZSYmdGhpcy5vZmZzZXQ9PT0wJiZ0aGlzLm9uTmV3TGluZSgwKTtmb3IobGV0IHIgb2YgdGhpcy5sZXhlci5sZXgodCxuKSl5aWVsZCp0aGlzLm5leHQocik7bnx8KHlpZWxkKnRoaXMuZW5kKCkpfSpuZXh0KHQpe2lmKHRoaXMuc291cmNlPXQsdGhpcy5hdFNjYWxhcil7dGhpcy5hdFNjYWxhcj0hMSx5aWVsZCp0aGlzLnN0ZXAoKSx0aGlzLm9mZnNldCs9dC5sZW5ndGg7cmV0dXJufWxldCBuPWFiKHQpO2lmKG4paWYobj09PSJzY2FsYXIiKXRoaXMuYXROZXdMaW5lPSExLHRoaXMuYXRTY2FsYXI9ITAsdGhpcy50eXBlPSJzY2FsYXIiO2Vsc2V7c3dpdGNoKHRoaXMudHlwZT1uLHlpZWxkKnRoaXMuc3RlcCgpLG4pe2Nhc2UibmV3bGluZSI6dGhpcy5hdE5ld0xpbmU9ITAsdGhpcy5pbmRlbnQ9MCx0aGlzLm9uTmV3TGluZSYmdGhpcy5vbk5ld0xpbmUodGhpcy5vZmZzZXQrdC5sZW5ndGgpO2JyZWFrO2Nhc2Uic3BhY2UiOnRoaXMuYXROZXdMaW5lJiZ0WzBdPT09IiAiJiYodGhpcy5pbmRlbnQrPXQubGVuZ3RoKTticmVhaztjYXNlImV4cGxpY2l0LWtleS1pbmQiOmNhc2UibWFwLXZhbHVlLWluZCI6Y2FzZSJzZXEtaXRlbS1pbmQiOnRoaXMuYXROZXdMaW5lJiYodGhpcy5pbmRlbnQrPXQubGVuZ3RoKTticmVhaztjYXNlImRvYy1tb2RlIjpjYXNlImZsb3ctZXJyb3ItZW5kIjpyZXR1cm47ZGVmYXVsdDp0aGlzLmF0TmV3TGluZT0hMX10aGlzLm9mZnNldCs9dC5sZW5ndGh9ZWxzZXtsZXQgcj1gTm90IGEgWUFNTCB0b2tlbjogJHt0fWA7eWllbGQqdGhpcy5wb3Aoe3R5cGU6ImVycm9yIixvZmZzZXQ6dGhpcy5vZmZzZXQsbWVzc2FnZTpyLHNvdXJjZTp0fSksdGhpcy5vZmZzZXQrPXQubGVuZ3RofX0qZW5kKCl7Zm9yKDt0aGlzLnN0YWNrLmxlbmd0aD4wOyl5aWVsZCp0aGlzLnBvcCgpfWdldCBzb3VyY2VUb2tlbigpe3JldHVybnt0eXBlOnRoaXMudHlwZSxvZmZzZXQ6dGhpcy5vZmZzZXQsaW5kZW50OnRoaXMuaW5kZW50LHNvdXJjZTp0aGlzLnNvdXJjZX19KnN0ZXAoKXtsZXQgdD10aGlzLnBlZWsoMSk7aWYodGhpcy50eXBlPT09ImRvYy1lbmQiJiYodD09bnVsbD92b2lkIDA6dC50eXBlKSE9PSJkb2MtZW5kIil7Zm9yKDt0aGlzLnN0YWNrLmxlbmd0aD4wOyl5aWVsZCp0aGlzLnBvcCgpO3RoaXMuc3RhY2sucHVzaCh7dHlwZToiZG9jLWVuZCIsb2Zmc2V0OnRoaXMub2Zmc2V0LHNvdXJjZTp0aGlzLnNvdXJjZX0pO3JldHVybn1pZighdClyZXR1cm4geWllbGQqdGhpcy5zdHJlYW0oKTtzd2l0Y2godC50eXBlKXtjYXNlImRvY3VtZW50IjpyZXR1cm4geWllbGQqdGhpcy5kb2N1bWVudCh0KTtjYXNlImFsaWFzIjpjYXNlInNjYWxhciI6Y2FzZSJzaW5nbGUtcXVvdGVkLXNjYWxhciI6Y2FzZSJkb3VibGUtcXVvdGVkLXNjYWxhciI6cmV0dXJuIHlpZWxkKnRoaXMuc2NhbGFyKHQpO2Nhc2UiYmxvY2stc2NhbGFyIjpyZXR1cm4geWllbGQqdGhpcy5ibG9ja1NjYWxhcih0KTtjYXNlImJsb2NrLW1hcCI6cmV0dXJuIHlpZWxkKnRoaXMuYmxvY2tNYXAodCk7Y2FzZSJibG9jay1zZXEiOnJldHVybiB5aWVsZCp0aGlzLmJsb2NrU2VxdWVuY2UodCk7Y2FzZSJmbG93LWNvbGxlY3Rpb24iOnJldHVybiB5aWVsZCp0aGlzLmZsb3dDb2xsZWN0aW9uKHQpO2Nhc2UiZG9jLWVuZCI6cmV0dXJuIHlpZWxkKnRoaXMuZG9jdW1lbnRFbmQodCl9eWllbGQqdGhpcy5wb3AoKX1wZWVrKHQpe3JldHVybiB0aGlzLnN0YWNrW3RoaXMuc3RhY2subGVuZ3RoLXRdfSpwb3AodCl7bGV0IG49dD8/dGhpcy5zdGFjay5wb3AoKTtpZighbil5aWVsZHt0eXBlOiJlcnJvciIsb2Zmc2V0OnRoaXMub2Zmc2V0LHNvdXJjZToiIixtZXNzYWdlOiJUcmllZCB0byBwb3AgYW4gZW1wdHkgc3RhY2sifTtlbHNlIGlmKHRoaXMuc3RhY2subGVuZ3RoPT09MCl5aWVsZCBuO2Vsc2V7bGV0IHI9dGhpcy5wZWVrKDEpO3N3aXRjaChuLnR5cGU9PT0iYmxvY2stc2NhbGFyIj9uLmluZGVudD0iaW5kZW50ImluIHI/ci5pbmRlbnQ6MDpuLnR5cGU9PT0iZmxvdy1jb2xsZWN0aW9uIiYmci50eXBlPT09ImRvY3VtZW50IiYmKG4uaW5kZW50PTApLG4udHlwZT09PSJmbG93LWNvbGxlY3Rpb24iJiZwYihuKSxyLnR5cGUpe2Nhc2UiZG9jdW1lbnQiOnIudmFsdWU9bjticmVhaztjYXNlImJsb2NrLXNjYWxhciI6ci5wcm9wcy5wdXNoKG4pO2JyZWFrO2Nhc2UiYmxvY2stbWFwIjp7bGV0IHM9ci5pdGVtc1tyLml0ZW1zLmxlbmd0aC0xXTtpZihzLnZhbHVlKXtyLml0ZW1zLnB1c2goe3N0YXJ0OltdLGtleTpuLHNlcDpbXX0pLHRoaXMub25LZXlMaW5lPSEwO3JldHVybn1lbHNlIGlmKHMuc2VwKXMudmFsdWU9bjtlbHNle09iamVjdC5hc3NpZ24ocyx7a2V5Om4sc2VwOltdfSksdGhpcy5vbktleUxpbmU9IXMuZXhwbGljaXRLZXk7cmV0dXJufWJyZWFrfWNhc2UiYmxvY2stc2VxIjp7bGV0IHM9ci5pdGVtc1tyLml0ZW1zLmxlbmd0aC0xXTtzLnZhbHVlP3IuaXRlbXMucHVzaCh7c3RhcnQ6W10sdmFsdWU6bn0pOnMudmFsdWU9bjticmVha31jYXNlImZsb3ctY29sbGVjdGlvbiI6e2xldCBzPXIuaXRlbXNbci5pdGVtcy5sZW5ndGgtMV07IXN8fHMudmFsdWU/ci5pdGVtcy5wdXNoKHtzdGFydDpbXSxrZXk6bixzZXA6W119KTpzLnNlcD9zLnZhbHVlPW46T2JqZWN0LmFzc2lnbihzLHtrZXk6bixzZXA6W119KTtyZXR1cm59ZGVmYXVsdDp5aWVsZCp0aGlzLnBvcCgpLHlpZWxkKnRoaXMucG9wKG4pfWlmKChyLnR5cGU9PT0iZG9jdW1lbnQifHxyLnR5cGU9PT0iYmxvY2stbWFwInx8ci50eXBlPT09ImJsb2NrLXNlcSIpJiYobi50eXBlPT09ImJsb2NrLW1hcCJ8fG4udHlwZT09PSJibG9jay1zZXEiKSl7bGV0IHM9bi5pdGVtc1tuLml0ZW1zLmxlbmd0aC0xXTtzJiYhcy5zZXAmJiFzLnZhbHVlJiZzLnN0YXJ0Lmxlbmd0aD4wJiZjYihzLnN0YXJ0KT09PS0xJiYobi5pbmRlbnQ9PT0wfHxzLnN0YXJ0LmV2ZXJ5KGk9PmkudHlwZSE9PSJjb21tZW50Inx8aS5pbmRlbnQ8bi5pbmRlbnQpKSYmKHIudHlwZT09PSJkb2N1bWVudCI/ci5lbmQ9cy5zdGFydDpyLml0ZW1zLnB1c2goe3N0YXJ0OnMuc3RhcnR9KSxuLml0ZW1zLnNwbGljZSgtMSwxKSl9fX0qc3RyZWFtKCl7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJkaXJlY3RpdmUtbGluZSI6eWllbGR7dHlwZToiZGlyZWN0aXZlIixvZmZzZXQ6dGhpcy5vZmZzZXQsc291cmNlOnRoaXMuc291cmNlfTtyZXR1cm47Y2FzZSJieXRlLW9yZGVyLW1hcmsiOmNhc2Uic3BhY2UiOmNhc2UiY29tbWVudCI6Y2FzZSJuZXdsaW5lIjp5aWVsZCB0aGlzLnNvdXJjZVRva2VuO3JldHVybjtjYXNlImRvYy1tb2RlIjpjYXNlImRvYy1zdGFydCI6e2xldCB0PXt0eXBlOiJkb2N1bWVudCIsb2Zmc2V0OnRoaXMub2Zmc2V0LHN0YXJ0OltdfTt0aGlzLnR5cGU9PT0iZG9jLXN0YXJ0IiYmdC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pLHRoaXMuc3RhY2sucHVzaCh0KTtyZXR1cm59fXlpZWxke3R5cGU6ImVycm9yIixvZmZzZXQ6dGhpcy5vZmZzZXQsbWVzc2FnZTpgVW5leHBlY3RlZCAke3RoaXMudHlwZX0gdG9rZW4gaW4gWUFNTCBzdHJlYW1gLHNvdXJjZTp0aGlzLnNvdXJjZX19KmRvY3VtZW50KHQpe2lmKHQudmFsdWUpcmV0dXJuIHlpZWxkKnRoaXMubGluZUVuZCh0KTtzd2l0Y2godGhpcy50eXBlKXtjYXNlImRvYy1zdGFydCI6e2NiKHQuc3RhcnQpIT09LTE/KHlpZWxkKnRoaXMucG9wKCkseWllbGQqdGhpcy5zdGVwKCkpOnQuc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtyZXR1cm59Y2FzZSJhbmNob3IiOmNhc2UidGFnIjpjYXNlInNwYWNlIjpjYXNlImNvbW1lbnQiOmNhc2UibmV3bGluZSI6dC5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO3JldHVybn1sZXQgbj10aGlzLnN0YXJ0QmxvY2tWYWx1ZSh0KTtuP3RoaXMuc3RhY2sucHVzaChuKTp5aWVsZHt0eXBlOiJlcnJvciIsb2Zmc2V0OnRoaXMub2Zmc2V0LG1lc3NhZ2U6YFVuZXhwZWN0ZWQgJHt0aGlzLnR5cGV9IHRva2VuIGluIFlBTUwgZG9jdW1lbnRgLHNvdXJjZTp0aGlzLnNvdXJjZX19KnNjYWxhcih0KXtpZih0aGlzLnR5cGU9PT0ibWFwLXZhbHVlLWluZCIpe2xldCBuPW9jKHRoaXMucGVlaygyKSkscj1EbyhuKSxzO3QuZW5kPyhzPXQuZW5kLHMucHVzaCh0aGlzLnNvdXJjZVRva2VuKSxkZWxldGUgdC5lbmQpOnM9W3RoaXMuc291cmNlVG9rZW5dO2xldCBpPXt0eXBlOiJibG9jay1tYXAiLG9mZnNldDp0Lm9mZnNldCxpbmRlbnQ6dC5pbmRlbnQsaXRlbXM6W3tzdGFydDpyLGtleTp0LHNlcDpzfV19O3RoaXMub25LZXlMaW5lPSEwLHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV09aX1lbHNlIHlpZWxkKnRoaXMubGluZUVuZCh0KX0qYmxvY2tTY2FsYXIodCl7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJzcGFjZSI6Y2FzZSJjb21tZW50IjpjYXNlIm5ld2xpbmUiOnQucHJvcHMucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtyZXR1cm47Y2FzZSJzY2FsYXIiOmlmKHQuc291cmNlPXRoaXMuc291cmNlLHRoaXMuYXROZXdMaW5lPSEwLHRoaXMuaW5kZW50PTAsdGhpcy5vbk5ld0xpbmUpe2xldCBuPXRoaXMuc291cmNlLmluZGV4T2YoYApgKSsxO2Zvcig7biE9PTA7KXRoaXMub25OZXdMaW5lKHRoaXMub2Zmc2V0K24pLG49dGhpcy5zb3VyY2UuaW5kZXhPZihgCmAsbikrMX15aWVsZCp0aGlzLnBvcCgpO2JyZWFrO2RlZmF1bHQ6eWllbGQqdGhpcy5wb3AoKSx5aWVsZCp0aGlzLnN0ZXAoKX19KmJsb2NrTWFwKHQpe3ZhciByLHMsaTtsZXQgbj10Lml0ZW1zW3QuaXRlbXMubGVuZ3RoLTFdO3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UibmV3bGluZSI6aWYodGhpcy5vbktleUxpbmU9ITEsbi52YWx1ZSl7bGV0IG89ImVuZCJpbiBuLnZhbHVlP24udmFsdWUuZW5kOnZvaWQgMDsoKHI9QXJyYXkuaXNBcnJheShvKT9vW28ubGVuZ3RoLTFdOnZvaWQgMCk9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0iY29tbWVudCI/bz09bnVsbHx8by5wdXNoKHRoaXMuc291cmNlVG9rZW4pOnQuaXRlbXMucHVzaCh7c3RhcnQ6W3RoaXMuc291cmNlVG9rZW5dfSl9ZWxzZSBuLnNlcD9uLnNlcC5wdXNoKHRoaXMuc291cmNlVG9rZW4pOm4uc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtyZXR1cm47Y2FzZSJzcGFjZSI6Y2FzZSJjb21tZW50IjppZihuLnZhbHVlKXQuaXRlbXMucHVzaCh7c3RhcnQ6W3RoaXMuc291cmNlVG9rZW5dfSk7ZWxzZSBpZihuLnNlcCluLnNlcC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO2Vsc2V7aWYodGhpcy5hdEluZGVudGVkQ29tbWVudChuLnN0YXJ0LHQuaW5kZW50KSl7bGV0IG89KGk9KHM9dC5pdGVtc1t0Lml0ZW1zLmxlbmd0aC0yXSk9PW51bGw/dm9pZCAwOnMudmFsdWUpPT1udWxsP3ZvaWQgMDppLmVuZDtpZihBcnJheS5pc0FycmF5KG8pKXthYyhvLG4uc3RhcnQpLG8ucHVzaCh0aGlzLnNvdXJjZVRva2VuKSx0Lml0ZW1zLnBvcCgpO3JldHVybn19bi5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pfXJldHVybn1pZih0aGlzLmluZGVudD49dC5pbmRlbnQpe2xldCBvPSF0aGlzLm9uS2V5TGluZSYmdGhpcy5pbmRlbnQ9PT10LmluZGVudCxhPW8mJihuLnNlcHx8bi5leHBsaWNpdEtleSkmJnRoaXMudHlwZSE9PSJzZXEtaXRlbS1pbmQiLHU9W107aWYoYSYmbi5zZXAmJiFuLnZhbHVlKXtsZXQgbD1bXTtmb3IobGV0IGY9MDtmPG4uc2VwLmxlbmd0aDsrK2Ype2xldCBjPW4uc2VwW2ZdO3N3aXRjaChjLnR5cGUpe2Nhc2UibmV3bGluZSI6bC5wdXNoKGYpO2JyZWFrO2Nhc2Uic3BhY2UiOmJyZWFrO2Nhc2UiY29tbWVudCI6Yy5pbmRlbnQ+dC5pbmRlbnQmJihsLmxlbmd0aD0wKTticmVhaztkZWZhdWx0OmwubGVuZ3RoPTB9fWwubGVuZ3RoPj0yJiYodT1uLnNlcC5zcGxpY2UobFsxXSkpfXN3aXRjaCh0aGlzLnR5cGUpe2Nhc2UiYW5jaG9yIjpjYXNlInRhZyI6YXx8bi52YWx1ZT8odS5wdXNoKHRoaXMuc291cmNlVG9rZW4pLHQuaXRlbXMucHVzaCh7c3RhcnQ6dX0pLHRoaXMub25LZXlMaW5lPSEwKTpuLnNlcD9uLnNlcC5wdXNoKHRoaXMuc291cmNlVG9rZW4pOm4uc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtyZXR1cm47Y2FzZSJleHBsaWNpdC1rZXktaW5kIjohbi5zZXAmJiFuLmV4cGxpY2l0S2V5PyhuLnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbiksbi5leHBsaWNpdEtleT0hMCk6YXx8bi52YWx1ZT8odS5wdXNoKHRoaXMuc291cmNlVG9rZW4pLHQuaXRlbXMucHVzaCh7c3RhcnQ6dSxleHBsaWNpdEtleTohMH0pKTp0aGlzLnN0YWNrLnB1c2goe3R5cGU6ImJsb2NrLW1hcCIsb2Zmc2V0OnRoaXMub2Zmc2V0LGluZGVudDp0aGlzLmluZGVudCxpdGVtczpbe3N0YXJ0Olt0aGlzLnNvdXJjZVRva2VuXSxleHBsaWNpdEtleTohMH1dfSksdGhpcy5vbktleUxpbmU9ITA7cmV0dXJuO2Nhc2UibWFwLXZhbHVlLWluZCI6aWYobi5leHBsaWNpdEtleSlpZihuLnNlcClpZihuLnZhbHVlKXQuaXRlbXMucHVzaCh7c3RhcnQ6W10sa2V5Om51bGwsc2VwOlt0aGlzLnNvdXJjZVRva2VuXX0pO2Vsc2UgaWYoaHMobi5zZXAsIm1hcC12YWx1ZS1pbmQiKSl0aGlzLnN0YWNrLnB1c2goe3R5cGU6ImJsb2NrLW1hcCIsb2Zmc2V0OnRoaXMub2Zmc2V0LGluZGVudDp0aGlzLmluZGVudCxpdGVtczpbe3N0YXJ0OnUsa2V5Om51bGwsc2VwOlt0aGlzLnNvdXJjZVRva2VuXX1dfSk7ZWxzZSBpZihmYihuLmtleSkmJiFocyhuLnNlcCwibmV3bGluZSIpKXtsZXQgbD1EbyhuLnN0YXJ0KSxmPW4ua2V5LGM9bi5zZXA7Yy5wdXNoKHRoaXMuc291cmNlVG9rZW4pLGRlbGV0ZSBuLmtleSxkZWxldGUgbi5zZXAsdGhpcy5zdGFjay5wdXNoKHt0eXBlOiJibG9jay1tYXAiLG9mZnNldDp0aGlzLm9mZnNldCxpbmRlbnQ6dGhpcy5pbmRlbnQsaXRlbXM6W3tzdGFydDpsLGtleTpmLHNlcDpjfV19KX1lbHNlIHUubGVuZ3RoPjA/bi5zZXA9bi5zZXAuY29uY2F0KHUsdGhpcy5zb3VyY2VUb2tlbik6bi5zZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtlbHNlIGlmKGhzKG4uc3RhcnQsIm5ld2xpbmUiKSlPYmplY3QuYXNzaWduKG4se2tleTpudWxsLHNlcDpbdGhpcy5zb3VyY2VUb2tlbl19KTtlbHNle2xldCBsPURvKG4uc3RhcnQpO3RoaXMuc3RhY2sucHVzaCh7dHlwZToiYmxvY2stbWFwIixvZmZzZXQ6dGhpcy5vZmZzZXQsaW5kZW50OnRoaXMuaW5kZW50LGl0ZW1zOlt7c3RhcnQ6bCxrZXk6bnVsbCxzZXA6W3RoaXMuc291cmNlVG9rZW5dfV19KX1lbHNlIG4uc2VwP24udmFsdWV8fGE/dC5pdGVtcy5wdXNoKHtzdGFydDp1LGtleTpudWxsLHNlcDpbdGhpcy5zb3VyY2VUb2tlbl19KTpocyhuLnNlcCwibWFwLXZhbHVlLWluZCIpP3RoaXMuc3RhY2sucHVzaCh7dHlwZToiYmxvY2stbWFwIixvZmZzZXQ6dGhpcy5vZmZzZXQsaW5kZW50OnRoaXMuaW5kZW50LGl0ZW1zOlt7c3RhcnQ6W10sa2V5Om51bGwsc2VwOlt0aGlzLnNvdXJjZVRva2VuXX1dfSk6bi5zZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTpPYmplY3QuYXNzaWduKG4se2tleTpudWxsLHNlcDpbdGhpcy5zb3VyY2VUb2tlbl19KTt0aGlzLm9uS2V5TGluZT0hMDtyZXR1cm47Y2FzZSJhbGlhcyI6Y2FzZSJzY2FsYXIiOmNhc2Uic2luZ2xlLXF1b3RlZC1zY2FsYXIiOmNhc2UiZG91YmxlLXF1b3RlZC1zY2FsYXIiOntsZXQgbD10aGlzLmZsb3dTY2FsYXIodGhpcy50eXBlKTthfHxuLnZhbHVlPyh0Lml0ZW1zLnB1c2goe3N0YXJ0OnUsa2V5Omwsc2VwOltdfSksdGhpcy5vbktleUxpbmU9ITApOm4uc2VwP3RoaXMuc3RhY2sucHVzaChsKTooT2JqZWN0LmFzc2lnbihuLHtrZXk6bCxzZXA6W119KSx0aGlzLm9uS2V5TGluZT0hMCk7cmV0dXJufWRlZmF1bHQ6e2xldCBsPXRoaXMuc3RhcnRCbG9ja1ZhbHVlKHQpO2lmKGwpe2lmKGwudHlwZT09PSJibG9jay1zZXEiKXtpZighbi5leHBsaWNpdEtleSYmbi5zZXAmJiFocyhuLnNlcCwibmV3bGluZSIpKXt5aWVsZCp0aGlzLnBvcCh7dHlwZToiZXJyb3IiLG9mZnNldDp0aGlzLm9mZnNldCxtZXNzYWdlOiJVbmV4cGVjdGVkIGJsb2NrLXNlcS1pbmQgb24gc2FtZSBsaW5lIHdpdGgga2V5Iixzb3VyY2U6dGhpcy5zb3VyY2V9KTtyZXR1cm59fWVsc2UgbyYmdC5pdGVtcy5wdXNoKHtzdGFydDp1fSk7dGhpcy5zdGFjay5wdXNoKGwpO3JldHVybn19fX15aWVsZCp0aGlzLnBvcCgpLHlpZWxkKnRoaXMuc3RlcCgpfSpibG9ja1NlcXVlbmNlKHQpe3ZhciByLHMsaTtsZXQgbj10Lml0ZW1zW3QuaXRlbXMubGVuZ3RoLTFdO3N3aXRjaCh0aGlzLnR5cGUpe2Nhc2UibmV3bGluZSI6aWYobi52YWx1ZSl7bGV0IG89ImVuZCJpbiBuLnZhbHVlP24udmFsdWUuZW5kOnZvaWQgMDsoKHI9QXJyYXkuaXNBcnJheShvKT9vW28ubGVuZ3RoLTFdOnZvaWQgMCk9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0iY29tbWVudCI/bz09bnVsbHx8by5wdXNoKHRoaXMuc291cmNlVG9rZW4pOnQuaXRlbXMucHVzaCh7c3RhcnQ6W3RoaXMuc291cmNlVG9rZW5dfSl9ZWxzZSBuLnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7cmV0dXJuO2Nhc2Uic3BhY2UiOmNhc2UiY29tbWVudCI6aWYobi52YWx1ZSl0Lml0ZW1zLnB1c2goe3N0YXJ0Olt0aGlzLnNvdXJjZVRva2VuXX0pO2Vsc2V7aWYodGhpcy5hdEluZGVudGVkQ29tbWVudChuLnN0YXJ0LHQuaW5kZW50KSl7bGV0IG89KGk9KHM9dC5pdGVtc1t0Lml0ZW1zLmxlbmd0aC0yXSk9PW51bGw/dm9pZCAwOnMudmFsdWUpPT1udWxsP3ZvaWQgMDppLmVuZDtpZihBcnJheS5pc0FycmF5KG8pKXthYyhvLG4uc3RhcnQpLG8ucHVzaCh0aGlzLnNvdXJjZVRva2VuKSx0Lml0ZW1zLnBvcCgpO3JldHVybn19bi5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pfXJldHVybjtjYXNlImFuY2hvciI6Y2FzZSJ0YWciOmlmKG4udmFsdWV8fHRoaXMuaW5kZW50PD10LmluZGVudClicmVhaztuLnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7cmV0dXJuO2Nhc2Uic2VxLWl0ZW0taW5kIjppZih0aGlzLmluZGVudCE9PXQuaW5kZW50KWJyZWFrO24udmFsdWV8fGhzKG4uc3RhcnQsInNlcS1pdGVtLWluZCIpP3QuaXRlbXMucHVzaCh7c3RhcnQ6W3RoaXMuc291cmNlVG9rZW5dfSk6bi5zdGFydC5wdXNoKHRoaXMuc291cmNlVG9rZW4pO3JldHVybn1pZih0aGlzLmluZGVudD50LmluZGVudCl7bGV0IG89dGhpcy5zdGFydEJsb2NrVmFsdWUodCk7aWYobyl7dGhpcy5zdGFjay5wdXNoKG8pO3JldHVybn19eWllbGQqdGhpcy5wb3AoKSx5aWVsZCp0aGlzLnN0ZXAoKX0qZmxvd0NvbGxlY3Rpb24odCl7bGV0IG49dC5pdGVtc1t0Lml0ZW1zLmxlbmd0aC0xXTtpZih0aGlzLnR5cGU9PT0iZmxvdy1lcnJvci1lbmQiKXtsZXQgcjtkbyB5aWVsZCp0aGlzLnBvcCgpLHI9dGhpcy5wZWVrKDEpO3doaWxlKChyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09ImZsb3ctY29sbGVjdGlvbiIpfWVsc2UgaWYodC5lbmQubGVuZ3RoPT09MCl7c3dpdGNoKHRoaXMudHlwZSl7Y2FzZSJjb21tYSI6Y2FzZSJleHBsaWNpdC1rZXktaW5kIjohbnx8bi5zZXA/dC5pdGVtcy5wdXNoKHtzdGFydDpbdGhpcy5zb3VyY2VUb2tlbl19KTpuLnN0YXJ0LnB1c2godGhpcy5zb3VyY2VUb2tlbik7cmV0dXJuO2Nhc2UibWFwLXZhbHVlLWluZCI6IW58fG4udmFsdWU/dC5pdGVtcy5wdXNoKHtzdGFydDpbXSxrZXk6bnVsbCxzZXA6W3RoaXMuc291cmNlVG9rZW5dfSk6bi5zZXA/bi5zZXAucHVzaCh0aGlzLnNvdXJjZVRva2VuKTpPYmplY3QuYXNzaWduKG4se2tleTpudWxsLHNlcDpbdGhpcy5zb3VyY2VUb2tlbl19KTtyZXR1cm47Y2FzZSJzcGFjZSI6Y2FzZSJjb21tZW50IjpjYXNlIm5ld2xpbmUiOmNhc2UiYW5jaG9yIjpjYXNlInRhZyI6IW58fG4udmFsdWU/dC5pdGVtcy5wdXNoKHtzdGFydDpbdGhpcy5zb3VyY2VUb2tlbl19KTpuLnNlcD9uLnNlcC5wdXNoKHRoaXMuc291cmNlVG9rZW4pOm4uc3RhcnQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTtyZXR1cm47Y2FzZSJhbGlhcyI6Y2FzZSJzY2FsYXIiOmNhc2Uic2luZ2xlLXF1b3RlZC1zY2FsYXIiOmNhc2UiZG91YmxlLXF1b3RlZC1zY2FsYXIiOntsZXQgcz10aGlzLmZsb3dTY2FsYXIodGhpcy50eXBlKTshbnx8bi52YWx1ZT90Lml0ZW1zLnB1c2goe3N0YXJ0OltdLGtleTpzLHNlcDpbXX0pOm4uc2VwP3RoaXMuc3RhY2sucHVzaChzKTpPYmplY3QuYXNzaWduKG4se2tleTpzLHNlcDpbXX0pO3JldHVybn1jYXNlImZsb3ctbWFwLWVuZCI6Y2FzZSJmbG93LXNlcS1lbmQiOnQuZW5kLnB1c2godGhpcy5zb3VyY2VUb2tlbik7cmV0dXJufWxldCByPXRoaXMuc3RhcnRCbG9ja1ZhbHVlKHQpO3I/dGhpcy5zdGFjay5wdXNoKHIpOih5aWVsZCp0aGlzLnBvcCgpLHlpZWxkKnRoaXMuc3RlcCgpKX1lbHNle2xldCByPXRoaXMucGVlaygyKTtpZihyLnR5cGU9PT0iYmxvY2stbWFwIiYmKHRoaXMudHlwZT09PSJtYXAtdmFsdWUtaW5kIiYmci5pbmRlbnQ9PT10LmluZGVudHx8dGhpcy50eXBlPT09Im5ld2xpbmUiJiYhci5pdGVtc1tyLml0ZW1zLmxlbmd0aC0xXS5zZXApKXlpZWxkKnRoaXMucG9wKCkseWllbGQqdGhpcy5zdGVwKCk7ZWxzZSBpZih0aGlzLnR5cGU9PT0ibWFwLXZhbHVlLWluZCImJnIudHlwZSE9PSJmbG93LWNvbGxlY3Rpb24iKXtsZXQgcz1vYyhyKSxpPURvKHMpO3BiKHQpO2xldCBvPXQuZW5kLnNwbGljZSgxLHQuZW5kLmxlbmd0aCk7by5wdXNoKHRoaXMuc291cmNlVG9rZW4pO2xldCBhPXt0eXBlOiJibG9jay1tYXAiLG9mZnNldDp0Lm9mZnNldCxpbmRlbnQ6dC5pbmRlbnQsaXRlbXM6W3tzdGFydDppLGtleTp0LHNlcDpvfV19O3RoaXMub25LZXlMaW5lPSEwLHRoaXMuc3RhY2tbdGhpcy5zdGFjay5sZW5ndGgtMV09YX1lbHNlIHlpZWxkKnRoaXMubGluZUVuZCh0KX19Zmxvd1NjYWxhcih0KXtpZih0aGlzLm9uTmV3TGluZSl7bGV0IG49dGhpcy5zb3VyY2UuaW5kZXhPZihgCmApKzE7Zm9yKDtuIT09MDspdGhpcy5vbk5ld0xpbmUodGhpcy5vZmZzZXQrbiksbj10aGlzLnNvdXJjZS5pbmRleE9mKGAKYCxuKSsxfXJldHVybnt0eXBlOnQsb2Zmc2V0OnRoaXMub2Zmc2V0LGluZGVudDp0aGlzLmluZGVudCxzb3VyY2U6dGhpcy5zb3VyY2V9fXN0YXJ0QmxvY2tWYWx1ZSh0KXtzd2l0Y2godGhpcy50eXBlKXtjYXNlImFsaWFzIjpjYXNlInNjYWxhciI6Y2FzZSJzaW5nbGUtcXVvdGVkLXNjYWxhciI6Y2FzZSJkb3VibGUtcXVvdGVkLXNjYWxhciI6cmV0dXJuIHRoaXMuZmxvd1NjYWxhcih0aGlzLnR5cGUpO2Nhc2UiYmxvY2stc2NhbGFyLWhlYWRlciI6cmV0dXJue3R5cGU6ImJsb2NrLXNjYWxhciIsb2Zmc2V0OnRoaXMub2Zmc2V0LGluZGVudDp0aGlzLmluZGVudCxwcm9wczpbdGhpcy5zb3VyY2VUb2tlbl0sc291cmNlOiIifTtjYXNlImZsb3ctbWFwLXN0YXJ0IjpjYXNlImZsb3ctc2VxLXN0YXJ0IjpyZXR1cm57dHlwZToiZmxvdy1jb2xsZWN0aW9uIixvZmZzZXQ6dGhpcy5vZmZzZXQsaW5kZW50OnRoaXMuaW5kZW50LHN0YXJ0OnRoaXMuc291cmNlVG9rZW4saXRlbXM6W10sZW5kOltdfTtjYXNlInNlcS1pdGVtLWluZCI6cmV0dXJue3R5cGU6ImJsb2NrLXNlcSIsb2Zmc2V0OnRoaXMub2Zmc2V0LGluZGVudDp0aGlzLmluZGVudCxpdGVtczpbe3N0YXJ0Olt0aGlzLnNvdXJjZVRva2VuXX1dfTtjYXNlImV4cGxpY2l0LWtleS1pbmQiOnt0aGlzLm9uS2V5TGluZT0hMDtsZXQgbj1vYyh0KSxyPURvKG4pO3JldHVybiByLnB1c2godGhpcy5zb3VyY2VUb2tlbikse3R5cGU6ImJsb2NrLW1hcCIsb2Zmc2V0OnRoaXMub2Zmc2V0LGluZGVudDp0aGlzLmluZGVudCxpdGVtczpbe3N0YXJ0OnIsZXhwbGljaXRLZXk6ITB9XX19Y2FzZSJtYXAtdmFsdWUtaW5kIjp7dGhpcy5vbktleUxpbmU9ITA7bGV0IG49b2ModCkscj1EbyhuKTtyZXR1cm57dHlwZToiYmxvY2stbWFwIixvZmZzZXQ6dGhpcy5vZmZzZXQsaW5kZW50OnRoaXMuaW5kZW50LGl0ZW1zOlt7c3RhcnQ6cixrZXk6bnVsbCxzZXA6W3RoaXMuc291cmNlVG9rZW5dfV19fX1yZXR1cm4gbnVsbH1hdEluZGVudGVkQ29tbWVudCh0LG4pe3JldHVybiB0aGlzLnR5cGUhPT0iY29tbWVudCJ8fHRoaXMuaW5kZW50PD1uPyExOnQuZXZlcnkocj0+ci50eXBlPT09Im5ld2xpbmUifHxyLnR5cGU9PT0ic3BhY2UiKX0qZG9jdW1lbnRFbmQodCl7dGhpcy50eXBlIT09ImRvYy1tb2RlIiYmKHQuZW5kP3QuZW5kLnB1c2godGhpcy5zb3VyY2VUb2tlbik6dC5lbmQ9W3RoaXMuc291cmNlVG9rZW5dLHRoaXMudHlwZT09PSJuZXdsaW5lIiYmKHlpZWxkKnRoaXMucG9wKCkpKX0qbGluZUVuZCh0KXtzd2l0Y2godGhpcy50eXBlKXtjYXNlImNvbW1hIjpjYXNlImRvYy1zdGFydCI6Y2FzZSJkb2MtZW5kIjpjYXNlImZsb3ctc2VxLWVuZCI6Y2FzZSJmbG93LW1hcC1lbmQiOmNhc2UibWFwLXZhbHVlLWluZCI6eWllbGQqdGhpcy5wb3AoKSx5aWVsZCp0aGlzLnN0ZXAoKTticmVhaztjYXNlIm5ld2xpbmUiOnRoaXMub25LZXlMaW5lPSExO2RlZmF1bHQ6dC5lbmQ/dC5lbmQucHVzaCh0aGlzLnNvdXJjZVRva2VuKTp0LmVuZD1bdGhpcy5zb3VyY2VUb2tlbl0sdGhpcy50eXBlPT09Im5ld2xpbmUiJiYoeWllbGQqdGhpcy5wb3AoKSl9fX07ZnVuY3Rpb24gaGIoZSl7bGV0IHQ9ZS5wcmV0dHlFcnJvcnMhPT0hMTtyZXR1cm57bGluZUNvdW50ZXI6ZS5saW5lQ291bnRlcnx8dCYmbmV3IEpofHxudWxsLHByZXR0eUVycm9yczp0fX1mdW5jdGlvbiBnNihlLHQ9e30pe2xldHtsaW5lQ291bnRlcjpuLHByZXR0eUVycm9yczpyfT1oYih0KSxzPW5ldyB1YyhuPT1udWxsP3ZvaWQgMDpuLmFkZE5ld0xpbmUpLGk9bmV3IFpsKHQpLG89QXJyYXkuZnJvbShpLmNvbXBvc2Uocy5wYXJzZShlKSkpO2lmKHImJm4pZm9yKGxldCBhIG9mIG8pYS5lcnJvcnMuZm9yRWFjaChRbChlLG4pKSxhLndhcm5pbmdzLmZvckVhY2goUWwoZSxuKSk7cmV0dXJuIG8ubGVuZ3RoPjA/bzpPYmplY3QuYXNzaWduKFtdLHtlbXB0eTohMH0saS5zdHJlYW1JbmZvKCkpfWZ1bmN0aW9uIGRiKGUsdD17fSl7bGV0e2xpbmVDb3VudGVyOm4scHJldHR5RXJyb3JzOnJ9PWhiKHQpLHM9bmV3IHVjKG49PW51bGw/dm9pZCAwOm4uYWRkTmV3TGluZSksaT1uZXcgWmwodCksbz1udWxsO2ZvcihsZXQgYSBvZiBpLmNvbXBvc2Uocy5wYXJzZShlKSwhMCxlLmxlbmd0aCkpaWYoIW8pbz1hO2Vsc2UgaWYoby5vcHRpb25zLmxvZ0xldmVsIT09InNpbGVudCIpe28uZXJyb3JzLnB1c2gobmV3IFlzKGEucmFuZ2Uuc2xpY2UoMCwyKSwiTVVMVElQTEVfRE9DUyIsIlNvdXJjZSBjb250YWlucyBtdWx0aXBsZSBkb2N1bWVudHM7IHBsZWFzZSB1c2UgWUFNTC5wYXJzZUFsbERvY3VtZW50cygpIikpO2JyZWFrfXJldHVybiByJiZuJiYoby5lcnJvcnMuZm9yRWFjaChRbChlLG4pKSxvLndhcm5pbmdzLmZvckVhY2goUWwoZSxuKSkpLG99ZnVuY3Rpb24geTYoZSx0LG4pe2xldCByO3R5cGVvZiB0PT0iZnVuY3Rpb24iP3I9dDpuPT09dm9pZCAwJiZ0JiZ0eXBlb2YgdD09Im9iamVjdCImJihuPXQpO2xldCBzPWRiKGUsbik7aWYoIXMpcmV0dXJuIG51bGw7aWYocy53YXJuaW5ncy5mb3JFYWNoKGk9PkEyKHMub3B0aW9ucy5sb2dMZXZlbCxpKSkscy5lcnJvcnMubGVuZ3RoPjApe2lmKHMub3B0aW9ucy5sb2dMZXZlbCE9PSJzaWxlbnQiKXRocm93IHMuZXJyb3JzWzBdO3MuZXJyb3JzPVtdfXJldHVybiBzLnRvSlMoT2JqZWN0LmFzc2lnbih7cmV2aXZlcjpyfSxuKSl9ZnVuY3Rpb24gRDYoZSx0LG4pe2xldCByPW51bGw7aWYodHlwZW9mIHQ9PSJmdW5jdGlvbiJ8fEFycmF5LmlzQXJyYXkodCk/cj10Om49PT12b2lkIDAmJnQmJihuPXQpLHR5cGVvZiBuPT0ic3RyaW5nIiYmKG49bi5sZW5ndGgpLHR5cGVvZiBuPT0ibnVtYmVyIil7bGV0IHM9TWF0aC5yb3VuZChuKTtuPXM8MT92b2lkIDA6cz44P3tpbmRlbnQ6OH06e2luZGVudDpzfX1pZihlPT09dm9pZCAwKXtsZXR7a2VlcFVuZGVmaW5lZDpzfT1uPz90Pz97fTtpZighcylyZXR1cm59cmV0dXJuIEpzKGUpJiYhcj9lLnRvU3RyaW5nKG4pOm5ldyBZbChlLHIsbikudG9TdHJpbmcobil9dmFyIGI2PXUyO2Z1bmN0aW9uIEU2KGUsdCxuKXtsZXQgcj1lLnNyY1Rva2VuO2lmKCFyfHxyLnR5cGUhPT0iZmxvdy1jb2xsZWN0aW9uIil0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGZsb3ctY29sbGVjdGlvbiBDU1Qgbm9kZSBmb3IgZmxvdyBzZXF1ZW5jZSIpO2xldCBzPWUuaXRlbXMubWFwKChvLGEpPT57bGV0IHU9ci5pdGVtc1thXTtpZih2NihvLHUpKXJldHVybiBMYShpbyhvLml0ZW1zKSx1LHQsYmgpO2lmKFRlKG8pKXJldHVybiBMYShvLHUsdCxiaCk7e2xldCBsPVtdO2ZvcihsZXQgYyBvZiBucih1LnN0YXJ0KSl7aWYoTmEoYykpe2wucHVzaChjKTtjb250aW51ZX1pZihjLnR5cGUhPT0iY29tbWEiKXRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB0b2tlbiB0eXBlIGluIHNlcXVlbmNlIGl0ZW0gc3RhcnQ6ICR7Yy50eXBlfWApfWxldCBmPXQudHJhbnNmb3JtTm9kZShvLHt0b2tlbnM6bH0pO3JldHVybiBmMyhIcyhmLnBvc2l0aW9uLnN0YXJ0LGYucG9zaXRpb24uZW5kKSxmKX19KTtpZihlLml0ZW1zLmxlbmd0aDxyLml0ZW1zLmxlbmd0aClmb3IobGV0IG89ZS5pdGVtcy5sZW5ndGg7bzxyLml0ZW1zLmxlbmd0aDtvKyspe2xldCBhPXIuaXRlbXNbb107Zm9yKGxldCB1IG9mIFh0KGEuc3RhcnQsdCkpaWYodS50eXBlIT09ImNvbW1hIil0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgdG9rZW4gdHlwZSBpbiBjb2xsZWN0aW9uIGl0ZW0gc3RhcnQ6ICR7dS50eXBlfWApfWxldCBpPW51bGw7Zm9yKGxldCBvIG9mIG5yKHIuZW5kKSl7aWYoby50eXBlPT09ImNvbW1lbnQiKXt0LnRyYW5zZm9ybUNvbW1lbnQobyk7Y29udGludWV9aWYoby50eXBlPT09ImZsb3ctc2VxLWVuZCIpe2k9bztjb250aW51ZX10aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgdG9rZW4gdHlwZSBpbiBmbG93IHNlcSBlbmQ6ICR7by50eXBlfWApfWlmKCFpKXRocm93IG5ldyBFcnJvcigiRXhwZWN0ZWQgZmxvdy1zZXEtZW5kIHRva2VuIik7cmV0dXJuIGMzKHQudHJhbnNmb3JtUmFuZ2UoW3Iuc3RhcnQub2Zmc2V0LGkub2Zmc2V0K2kuc291cmNlLmxlbmd0aF0pLHQudHJhbnNmb3JtQ29udGVudFByb3BlcnRpZXMoZSxuLnRva2Vucykscyl9ZnVuY3Rpb24gdjYoZSx0KXtyZXR1cm4gZS5zcmNUb2tlbnx8IWZzKGUpfHxlLml0ZW1zLmxlbmd0aCE9PTE/ITE6ZS5pdGVtc1swXS5zcmNUb2tlbj09PXR9ZnVuY3Rpb24gbWIoZSx0LG4pe3JldHVybnt0eXBlOiJtYXBwaW5nIixwb3NpdGlvbjplLGxlYWRpbmdDb21tZW50czpbXSwuLi50LGNoaWxkcmVuOm59fWZ1bmN0aW9uIGdiKGUsdCxuKXtyZXR1cm57dHlwZToibWFwcGluZ0l0ZW0iLHBvc2l0aW9uOmUsbGVhZGluZ0NvbW1lbnRzOltdLGNoaWxkcmVuOlt0LG5dfX1mdW5jdGlvbiBGNihlLHQsbil7bGV0IHI9ZS5zcmNUb2tlbjtpZighcnx8ci50eXBlIT09ImJsb2NrLW1hcCIpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBibG9jayBtYXBwaW5nIHNyY1Rva2VuIik7bGV0IHM9ZS5pdGVtcy5tYXAoKGksbyk9PntsZXQgYT1yLml0ZW1zW29dO3JldHVybiBMYShpLGEsdCxnYil9KTtpZihlLml0ZW1zLmxlbmd0aDxyLml0ZW1zLmxlbmd0aClmb3IobGV0IGk9ZS5pdGVtcy5sZW5ndGg7aTxyLml0ZW1zLmxlbmd0aDtpKyspe2xldCBvPXIuaXRlbXNbaV07Zm9yKGxldCBhIG9mIFh0KG8uc3RhcnQsdCkpdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHRva2VuIHR5cGUgaW4gY29sbGVjdGlvbiBpdGVtIHN0YXJ0OiAke2EudHlwZX1gKX1yZXR1cm4gbWIoSHMoc1swXS5wb3NpdGlvbi5zdGFydCxpbyhzKS5wb3NpdGlvbi5lbmQpLHQudHJhbnNmb3JtQ29udGVudFByb3BlcnRpZXMoZSxuLnRva2Vucykscyl9ZnVuY3Rpb24geWIoZSx0LG4pe3JldHVybnt0eXBlOiJwbGFpbiIscG9zaXRpb246ZSxsZWFkaW5nQ29tbWVudHM6W10sdHJhaWxpbmdDb21tZW50Om51bGwsLi4udCx2YWx1ZTpufX1mdW5jdGlvbiBBNihlLHQsbil7Zm9yKGxldCByPXQ7cj49MDtyLS0paWYobi50ZXN0KGVbcl0pKXJldHVybiByO3JldHVybi0xfWZ1bmN0aW9uIHc2KGUsdCxuKXtpZihlLnJhbmdlWzBdPT09ZS5yYW5nZVsxXSl7bGV0IHM9QTYodC50ZXh0LGUucmFuZ2VbMF0tMSwvXFMvdSkrMTtyZXR1cm4geWIodC50cmFuc2Zvcm1SYW5nZShbcyxzXSksdC50cmFuc2Zvcm1Db250ZW50UHJvcGVydGllcyhlLG4udG9rZW5zKSwiIil9bGV0IHI9ZS5zcmNUb2tlbjtpZighcnx8ci50eXBlIT09InNjYWxhciIpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBwbGFpbiBzY2FsYXIgc3JjVG9rZW4iKTtmb3IobGV0IHMgb2YgWHQoci5lbmQsdCkpdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHRva2VuIHR5cGUgaW4gcGxhaW4gc2NhbGFyIGVuZDogJHtzLnR5cGV9YCk7cmV0dXJuIHliKHQudHJhbnNmb3JtUmFuZ2UoZS5yYW5nZSksdC50cmFuc2Zvcm1Db250ZW50UHJvcGVydGllcyhlLG4udG9rZW5zKSxlLnNvdXJjZSl9ZnVuY3Rpb24gQzYoZSl7cmV0dXJuey4uLmUsdHlwZToicXVvdGVEb3VibGUifX1mdW5jdGlvbiBTNihlLHQsbil7cmV0dXJue3R5cGU6InF1b3RlVmFsdWUiLHBvc2l0aW9uOmUsLi4udCxsZWFkaW5nQ29tbWVudHM6W10sdHJhaWxpbmdDb21tZW50Om51bGwsdmFsdWU6bn19ZnVuY3Rpb24gRGIoZSx0LG4scil7Zm9yKGxldCBzIG9mIFh0KHQuZW5kLG4pKXRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB0b2tlbiB0eXBlIGluIHF1b3RlIHZhbHVlIGVuZDogJHtzLnR5cGV9YCk7cmV0dXJuIFM2KG4udHJhbnNmb3JtUmFuZ2UoZS5yYW5nZSksbi50cmFuc2Zvcm1Db250ZW50UHJvcGVydGllcyhlLHIudG9rZW5zKSxlLnNvdXJjZSl9ZnVuY3Rpb24geDYoZSx0LG4pe2xldCByPWUuc3JjVG9rZW47aWYoIXJ8fHIudHlwZSE9PSJkb3VibGUtcXVvdGVkLXNjYWxhciIpdGhyb3cgbmV3IEVycm9yKCJFeHBlY3RlZCBkb3VibGUtcXVvdGVkIHNjYWxhciBzcmNUb2tlbiIpO3JldHVybiBDNihEYihlLHIsdCxuKSl9ZnVuY3Rpb24gazYoZSl7cmV0dXJuey4uLmUsdHlwZToicXVvdGVTaW5nbGUifX1mdW5jdGlvbiBUNihlLHQsbil7bGV0IHI9ZS5zcmNUb2tlbjtpZighcnx8ci50eXBlIT09InNpbmdsZS1xdW90ZWQtc2NhbGFyIil0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIHNpbmdsZS1xdW90ZWQgc2NhbGFyIHNyY1Rva2VuIik7cmV0dXJuIGs2KERiKGUscix0LG4pKX1mdW5jdGlvbiBONihlLHQsbil7cmV0dXJue3R5cGU6InNlcXVlbmNlIixwb3NpdGlvbjplLGxlYWRpbmdDb21tZW50czpbXSxlbmRDb21tZW50czpbXSwuLi50LGNoaWxkcmVuOm59fWZ1bmN0aW9uIEw2KGUsdCl7cmV0dXJue3R5cGU6InNlcXVlbmNlSXRlbSIscG9zaXRpb246ZSxsZWFkaW5nQ29tbWVudHM6W10sdHJhaWxpbmdDb21tZW50Om51bGwsZW5kQ29tbWVudHM6W10sY2hpbGRyZW46dD9bdF06W119fWZ1bmN0aW9uICQ2KGUsdCxuKXtsZXQgcj1lLnNyY1Rva2VuO2lmKCFyfHxyLnR5cGUhPT0iYmxvY2stc2VxIil0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGJsb2NrIHNlcXVlbmNlIHNyY1Rva2VuIik7bGV0IHM9ZS5pdGVtcy5tYXAoKGksbyk9PntsZXQgYT1yLml0ZW1zW29dLHU9W10sbD1udWxsO2ZvcihsZXQgYyBvZiBucihhLnN0YXJ0KSl7aWYoTmEoYykpe3UucHVzaChjKTtjb250aW51ZX1pZihjLnR5cGU9PT0ic2VxLWl0ZW0taW5kIil7bD1jO2NvbnRpbnVlfXRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB0b2tlbiB0eXBlIGluIHNlcXVlbmNlIGl0ZW0gc3RhcnQ6ICR7Yy50eXBlfWApfWxldCBmPUI2KGksdCx7dG9rZW5zOnV9KTtyZXR1cm4gTDYoSHMobD90LnRyYW5zZm9ybU9mZnNldChsLm9mZnNldCk6Zi5wb3NpdGlvbi5zdGFydCwoZj09bnVsbD92b2lkIDA6Zi5wb3NpdGlvbi5lbmQpPz90LnRyYW5zZm9ybU9mZnNldChsLm9mZnNldCtsLnNvdXJjZS5sZW5ndGgpKSxmKX0pO2lmKGUuaXRlbXMubGVuZ3RoPHIuaXRlbXMubGVuZ3RoKWZvcihsZXQgaT1lLml0ZW1zLmxlbmd0aDtpPHIuaXRlbXMubGVuZ3RoO2krKyl7bGV0IG89ci5pdGVtc1tpXTtmb3IobGV0IGEgb2YgWHQoby5zdGFydCx0KSl0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgdG9rZW4gdHlwZSBpbiBjb2xsZWN0aW9uIGl0ZW0gc3RhcnQ6ICR7YS50eXBlfWApfXJldHVybiBONihIcyhzWzBdLnBvc2l0aW9uLnN0YXJ0LGlvKHMpLnBvc2l0aW9uLmVuZCksdC50cmFuc2Zvcm1Db250ZW50UHJvcGVydGllcyhlLG4udG9rZW5zKSxzKX1mdW5jdGlvbiBCNihlLHQsbil7aWYoIVRlKGUpKXJldHVybiB6aChlLG4pPyhYdChuLnRva2Vucyx0KSxudWxsKTp0LnRyYW5zZm9ybU5vZGUoZSxuKTtsZXQgcj1lLnNyY1Rva2VuLHM9TGEoZSxyLHQsZ2IpO3JldHVybiBtYihzLnBvc2l0aW9uLHQudHJhbnNmb3JtQ29udGVudFByb3BlcnRpZXMoZS5rZXksbi50b2tlbnMpLFtzXSl9ZnVuY3Rpb24gXzYoZSx0LG4pe2lmKGU9PW51bGwpcmV0dXJuIG51bGw7aWYoY3MoZSkpcmV0dXJuIFo3KGUsdCxuKTtpZihmcyhlKSlyZXR1cm4gZS5mbG93P2wzKGUsdCxuKTpGNihlLHQsbik7aWYoenMoZSkpcmV0dXJuIGUuZmxvdz9FNihlLHQsbik6JDYoZSx0LG4pO2lmKEVlKGUpKXtzd2l0Y2goZS50eXBlKXtjYXNlIkJMT0NLX0ZPTERFRCI6cmV0dXJuIHIzKGUsdCxuKTtjYXNlIkJMT0NLX0xJVEVSQUwiOnJldHVybiBpMyhlLHQsbik7Y2FzZSJQTEFJTiI6cmV0dXJuIHc2KGUsdCxuKTtjYXNlIlFVT1RFX0RPVUJMRSI6cmV0dXJuIHg2KGUsdCxuKTtjYXNlIlFVT1RFX1NJTkdMRSI6cmV0dXJuIFQ2KGUsdCxuKX10aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgc2NhbGFyIHR5cGU6ICR7ZS50eXBlfWApfXRocm93IG5ldyBFcnJvcigiVW5leHBlY3RlZCB1bmtub3duIG5vZGUgdHlwZSIpfWZ1bmN0aW9uIHpoKGUsdCl7cmV0dXJuIWV8fGUucmFuZ2VbMF09PT1lLnJhbmdlWzFdJiZ0LnRva2Vucy5ldmVyeShuPT5uLnR5cGU9PT0iY29tbWVudCIpfXZhciBJNj0ockM9Y2xhc3N7Y29uc3RydWN0b3IodCxuKXtXZSh0aGlzLCJ0ZXh0Iik7V2UodGhpcywiY29tbWVudHMiLFtdKTtidCh0aGlzLHZ1KTt0aGlzLnRleHQ9dCxKbih0aGlzLHZ1LG4pfXRyYW5zZm9ybU9mZnNldCh0KXtsZXR7bGluZTpuLGNvbDpyfT1vZSh0aGlzLHZ1KS5saW5lUG9zKHQpO3JldHVybntsaW5lOm4sY29sdW1uOnIsb2Zmc2V0OnR9fXRyYW5zZm9ybVJhbmdlKHQpe2xldFtuLHJdPXQubWFwKHM9PnRoaXMudHJhbnNmb3JtT2Zmc2V0KHMpKTtyZXR1cm4gSHMobixyKX10cmFuc2Zvcm1Ob2RlKHQsbil7cmV0dXJuIF82KHQsdGhpcyxuKX10cmFuc2Zvcm1Db21tZW50KHQpe2xldCBuPUo3KHQsdGhpcyk7cmV0dXJuIHRoaXMuY29tbWVudHMucHVzaChuKSxufXRyYW5zZm9ybUNvbnRlbnRQcm9wZXJ0aWVzKHQsbil7cmV0dXJuIFg3KHQsbix0aGlzKX19LHZ1PW5ldyBXZWFrTWFwLHJDKSxQNj1JNjtmdW5jdGlvbiBNNihlLHQsbixyLHMsaSl7cmV0dXJue3R5cGU6ImRvY3VtZW50Iixwb3NpdGlvbjplLHRyYWlsaW5nQ29tbWVudDppLGRpcmVjdGl2ZXNFbmRNYXJrZXI6dCxkb2N1bWVudEVuZE1hcmtlcjpuLGNoaWxkcmVuOltyLHNdfX1mdW5jdGlvbiBPNihlLHQsbil7cmV0dXJue3R5cGU6ImRvY3VtZW50Qm9keSIscG9zaXRpb246ZSxlbmRDb21tZW50czpuLGNoaWxkcmVuOnQ/W3RdOltdfX1mdW5jdGlvbiBSNihlLHQsbil7Zm9yKGxldCByPXQ7cjxlLmxlbmd0aDtyKyspaWYobi50ZXN0KGVbcl0pKXJldHVybiByO3JldHVybiBudWxsfWZ1bmN0aW9uIGo2KGUsdCxuLHIscyxpLG8pe2xldHtkb2N1bWVudFRyYWlsaW5nQ29tbWVudDphLGVuZENvbW1lbnRzOnUscHJvcFRva2VuczpsfT1WNih0LG4scyxpLG8pLGY9ci5jb250ZW50cyYmKHIuY29udGVudHMucmFuZ2VbMF08ci5jb250ZW50cy5yYW5nZVsxXXx8bC5zb21lKGQ9PmQudHlwZT09PSJ0YWcifHxkLnR5cGU9PT0iYW5jaG9yIikpLGM9Zj9vLnRyYW5zZm9ybU5vZGUoci5jb250ZW50cyx7dG9rZW5zOmx9KTpudWxsO2lmKCFmKWZvcihsZXQgZCBvZiBYdChsLG8pKXRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB0b2tlbiB0eXBlIGluIGVtcHR5IGRvY3VtZW50IGJvZHk6ICR7ZC50eXBlfWApO2xldHtwb3NpdGlvbjpwLGRvY3VtZW50RW5kUG9pbnQ6aH09VTYoZSxyLGMsaSxvKTtyZXR1cm57ZG9jdW1lbnRCb2R5Ok82KHAsYyx1KSxkb2N1bWVudEVuZFBvaW50OmgsZG9jdW1lbnRUcmFpbGluZ0NvbW1lbnQ6YX19ZnVuY3Rpb24gVjYoZSx0LG4scixzKXtsZXQgaT1bXSxvPVtdLGE9W107Zm9yKGxldCBsIG9mIGUpe2lmKE5hKGwpKXthLnB1c2gobCk7Y29udGludWV9dGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHRva2VuIHR5cGU6ICR7bC50eXBlfWApfWZvcihsZXQgbCBvZiBYdChuLHMpKXRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB0b2tlbiB0eXBlOiAke2wudHlwZX1gKTtsZXQgdT1yP3MudHJhbnNmb3JtT2Zmc2V0KHIub2Zmc2V0KTpudWxsO2lmKHQpZm9yKGxldCBsIG9mIG5yKHQuZW5kLHI9PW51bGw/dm9pZCAwOnIuZW5kKSl7aWYobC50eXBlPT09ImNvbW1lbnQiKXtsZXQgZj1zLnRyYW5zZm9ybUNvbW1lbnQobCk7dT91LmxpbmU9PT1mLnBvc2l0aW9uLnN0YXJ0LmxpbmU/by5wdXNoKGYpOmYucG9zaXRpb24uc3RhcnQubGluZTx1LmxpbmUmJmkucHVzaChmKTppLnB1c2goZik7Y29udGludWV9dGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIHRva2VuIHR5cGU6ICR7bC50eXBlfWApfWlmKG8ubGVuZ3RoPjEpdGhyb3cgbmV3IEVycm9yKGBVbmV4cGVjdGVkIG11bHRpcGxlIGRvY3VtZW50IHRyYWlsaW5nIGNvbW1lbnRzIGF0ICR7VGEob1sxXS5wb3NpdGlvbi5zdGFydCl9YCk7cmV0dXJue3Byb3BUb2tlbnM6YSxlbmRDb21tZW50czppLGRvY3VtZW50VHJhaWxpbmdDb21tZW50OmlvKG8pfHxudWxsfX1mdW5jdGlvbiBVNihlLHQsbixyLHMpe2xldCBpPXI/TWF0aC5tYXgoMCxyLm9mZnNldC0xKTpSNihzLnRleHQsdC5yYW5nZVsyXSwvXFMvdSk/P3MudGV4dC5sZW5ndGg7cy50ZXh0W2ktMV09PT0iXHIiJiZpLS07bGV0IG89biE9PW51bGw/bi5wb3NpdGlvbi5zdGFydC5vZmZzZXQ6aTtpZihlKXtsZXQgdT1lLm9mZnNldCtlLnNvdXJjZS5sZW5ndGgrMTtvPHUmJnU8PWkmJihvPXUpfWxldCBhPXMudHJhbnNmb3JtUmFuZ2UoW28saV0pO3JldHVybntwb3NpdGlvbjphLGRvY3VtZW50RW5kUG9pbnQ6cj9zLnRyYW5zZm9ybU9mZnNldChyLm9mZnNldCtyLnNvdXJjZS5sZW5ndGgpOmEuZW5kfX1mdW5jdGlvbiBxNihlLHQsbixyKXtyZXR1cm57dHlwZToiZG9jdW1lbnRIZWFkIixwb3NpdGlvbjplLGVuZENvbW1lbnRzOm4sdHJhaWxpbmdDb21tZW50OnIsY2hpbGRyZW46dH19ZnVuY3Rpb24gVzYoZSx0LG4pe3JldHVybnt0eXBlOiJkaXJlY3RpdmUiLHBvc2l0aW9uOmUsbGVhZGluZ0NvbW1lbnRzOltdLHRyYWlsaW5nQ29tbWVudDpudWxsLG5hbWU6dCxwYXJhbWV0ZXJzOm59fWZ1bmN0aW9uIEg2KGUsdCl7bGV0IG49ZS5zb3VyY2UudHJpbSgpLnNwbGl0KC9bXHQgXSsvKSxyPW4uc2hpZnQoKS5yZXBsYWNlKC9eJS8sIiIpO3JldHVybiBXNih0LnRyYW5zZm9ybVJhbmdlKFtlLm9mZnNldCxlLm9mZnNldCtlLnNvdXJjZS5sZW5ndGhdKSxyLG4pfWZ1bmN0aW9uIEo2KGUsdCxuLHIpe2xldHtkaXJlY3RpdmVzOnMsZW5kQ29tbWVudENhbmRpZGF0ZXM6aX09ejYoZSxyKSxvPVtdLGE9bnVsbDtpZih0KXtmb3IobGV0IGYgb2YgbnIodC5zdGFydCkpaWYoby5wdXNoKGYpLCFhJiZmLnR5cGU9PT0iZG9jLXN0YXJ0Iil7Zm9yKGxldCBjIG9mIG8paWYoYy50eXBlPT09ImNvbW1lbnQiKXtsZXQgcD1yLnRyYW5zZm9ybUNvbW1lbnQoYyk7aS5wdXNoKHApfW89W10sYT1mfX1sZXQgdT1HNihzLG4sYSxyKSxsPW51bGw7aWYoYSYmby5sZW5ndGg+MCl7bGV0IGY9b1swXTtmLnR5cGU9PT0iY29tbWVudCImJnIudHJhbnNmb3JtT2Zmc2V0KGYub2Zmc2V0KS5saW5lPT09dS5lbmQubGluZSYmKGw9ci50cmFuc2Zvcm1Db21tZW50KGYpLG8uc2hpZnQoKSl9cmV0dXJue2RvY3VtZW50SGVhZDpxNih1LHMsYT9pOltdLGwpLGRvY1N0YXJ0OmEsdG9rZW5zQmVmb3JlQm9keTpvfX1mdW5jdGlvbiB6NihlLHQpe2xldCBuPVtdLHI9W10scz1udWxsO2ZvcihsZXQgaSBvZiBlKWlmKGkudHlwZT09PSJjb21tZW50Iil7bGV0IG89dC50cmFuc2Zvcm1Db21tZW50KGkpO3MmJnMucG9zaXRpb24uZW5kLmxpbmU9PT1vLnBvc2l0aW9uLnN0YXJ0LmxpbmUmJiFzLnRyYWlsaW5nQ29tbWVudD8ocy50cmFpbGluZ0NvbW1lbnQ9byxzLnBvc2l0aW9uLmVuZD1vLnBvc2l0aW9uLmVuZCk6ci5wdXNoKG8pfWVsc2V7bGV0IG89SDYoaSx0KTtuLnB1c2gobykscz1vLHI9W119cmV0dXJue2RpcmVjdGl2ZXM6bixlbmRDb21tZW50Q2FuZGlkYXRlczpyfX1mdW5jdGlvbiBHNihlLHQsbixyKXtsZXQgcz1uP1tuLm9mZnNldCxuLm9mZnNldCtuLnNvdXJjZS5sZW5ndGhdOnQuY29udGVudHM/W3QuY29udGVudHMucmFuZ2VbMF0sdC5jb250ZW50cy5yYW5nZVswXV06W3QucmFuZ2VbMF0sdC5yYW5nZVswXV07cmV0dXJuIGUubGVuZ3RoIT09MCYmKHNbMF09ZVswXS5wb3NpdGlvbi5zdGFydC5vZmZzZXQpLHIudHJhbnNmb3JtUmFuZ2Uocyl9ZnVuY3Rpb24gSzYoZSx0KXtsZXR7ZG9jdW1lbnRIZWFkOm4sdG9rZW5zQmVmb3JlQm9keTpyLGRvY1N0YXJ0OnN9PUo2KGUudG9rZW5zQmVmb3JlQm9keSxlLmNzdE5vZGUsZS5ub2RlLHQpLHtkb2N1bWVudEJvZHk6aSxkb2N1bWVudEVuZFBvaW50Om8sZG9jdW1lbnRUcmFpbGluZ0NvbW1lbnQ6YX09ajYocyxyLGUuY3N0Tm9kZSxlLm5vZGUsZS50b2tlbnNBZnRlckJvZHksZS5kb2N1bWVudEVuZCx0KTtyZXR1cm4gTTYoSHMobi5wb3NpdGlvbi5zdGFydCxvKSwhIXMsISFlLmRvY3VtZW50RW5kLG4saSxhKX1mdW5jdGlvbiBYNihlLHQsbil7aWYoZS5sZW5ndGg9PT0wKXJldHVybltdO2xldCByPVtdLHM9W10saT1bXSxvPW51bGwsYT11PT57bGV0IGw9e3Rva2Vuc0JlZm9yZUJvZHk6Wy4uLmksLi4uc10sY3N0Tm9kZTp1LG5vZGU6ZVtyLmxlbmd0aF0sdG9rZW5zQWZ0ZXJCb2R5OltdLGRvY3VtZW50RW5kOm51bGx9O3JldHVybiByLnB1c2gobCksaS5sZW5ndGg9MCxzLmxlbmd0aD0wLGx9O2ZvcihsZXQgdSBvZiBucih0KSl7aWYodS50eXBlPT09ImRvY3VtZW50Iil7aWYoci5sZW5ndGg+PWUubGVuZ3RoKXRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCAnZG9jdW1lbnQnIHRva2VuIGF0ICR7VGEobi50cmFuc2Zvcm1PZmZzZXQodS5vZmZzZXQpKX1gKTtvPWEodSk7Y29udGludWV9aWYodS50eXBlPT09ImNvbW1lbnQiKXtzLnB1c2godSk7Y29udGludWV9aWYodS50eXBlPT09ImRpcmVjdGl2ZSIpe2kucHVzaCguLi5zLHUpLHMubGVuZ3RoPTA7Y29udGludWV9aWYodS50eXBlPT09ImRvYy1lbmQiKXtpZighb3x8by5kb2N1bWVudEVuZCl0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgJ2RvYy1lbmQnIHRva2VuIGF0ICR7VGEobi50cmFuc2Zvcm1PZmZzZXQodS5vZmZzZXQpKX1gKTtvLnRva2Vuc0FmdGVyQm9keT1bLi4uc10scy5sZW5ndGg9MCxvLmRvY3VtZW50RW5kPXU7Y29udGludWV9fWlmKGkubGVuZ3RoPjApe2xldFt1XT1pO3Rocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCAnJHt1LnR5cGV9JyB0b2tlbiBhdCAke1RhKG4udHJhbnNmb3JtT2Zmc2V0KHUub2Zmc2V0KSl9YCl9cmV0dXJuIHMubGVuZ3RoPjAmJihvfHwobz1hKG51bGwpKSxzLmxlbmd0aD4wJiYoby50b2tlbnNBZnRlckJvZHkucHVzaCguLi5zKSxzLmxlbmd0aD0wKSksci5tYXAodT0+SzYodSxuKSl9ZnVuY3Rpb24gYmIoZSx0LG4scil7bGV0IHM9dChlKTtyZXR1cm4gaT0+e3IocyxpKSYmbihlLHM9aSl9fWZ1bmN0aW9uIEViKGUpe2lmKGU9PT1udWxsfHwhKCJjaGlsZHJlbiJpbiBlKSlyZXR1cm47bGV0IHQ9ZS5jaGlsZHJlbjtpZih0LmZvckVhY2goRWIpLGUudHlwZT09PSJkb2N1bWVudCIpe2xldFtpLG9dPWUuY2hpbGRyZW47aS5wb3NpdGlvbi5zdGFydC5vZmZzZXQ9PT1pLnBvc2l0aW9uLmVuZC5vZmZzZXQ/aS5wb3NpdGlvbi5zdGFydD1pLnBvc2l0aW9uLmVuZD1vLnBvc2l0aW9uLnN0YXJ0Om8ucG9zaXRpb24uc3RhcnQub2Zmc2V0PT09by5wb3NpdGlvbi5lbmQub2Zmc2V0JiYoby5wb3NpdGlvbi5zdGFydD1vLnBvc2l0aW9uLmVuZD1pLnBvc2l0aW9uLmVuZCl9bGV0IG49YmIoZS5wb3NpdGlvbixZNixRNix0aykscj1iYihlLnBvc2l0aW9uLFo2LGVrLG5rKTsiZW5kQ29tbWVudHMiaW4gZSYmZS5lbmRDb21tZW50cy5sZW5ndGghPT0wJiYobihlLmVuZENvbW1lbnRzWzBdLnBvc2l0aW9uLnN0YXJ0KSxyKGlvKGUuZW5kQ29tbWVudHMpLnBvc2l0aW9uLmVuZCkpO2xldCBzPXQuZmlsdGVyKGk9PmkhPT1udWxsKTtpZihzLmxlbmd0aCE9PTApe2xldCBpPXNbMF0sbz1pbyhzKTtuKGkucG9zaXRpb24uc3RhcnQpLHIoby5wb3NpdGlvbi5lbmQpLCJsZWFkaW5nQ29tbWVudHMiaW4gaSYmaS5sZWFkaW5nQ29tbWVudHMubGVuZ3RoIT09MCYmbihpLmxlYWRpbmdDb21tZW50c1swXS5wb3NpdGlvbi5zdGFydCksInRhZyJpbiBpJiZpLnRhZyYmbihpLnRhZy5wb3NpdGlvbi5zdGFydCksImFuY2hvciJpbiBpJiZpLmFuY2hvciYmbihpLmFuY2hvci5wb3NpdGlvbi5zdGFydCksInRyYWlsaW5nQ29tbWVudCJpbiBvJiZvLnRyYWlsaW5nQ29tbWVudCYmcihvLnRyYWlsaW5nQ29tbWVudC5wb3NpdGlvbi5lbmQpfX1mdW5jdGlvbiBZNihlKXtyZXR1cm4gZS5zdGFydH1mdW5jdGlvbiBRNihlLHQpe2Uuc3RhcnQ9dH1mdW5jdGlvbiBaNihlKXtyZXR1cm4gZS5lbmR9ZnVuY3Rpb24gZWsoZSx0KXtlLmVuZD10fWZ1bmN0aW9uIHRrKGUsdCl7cmV0dXJuIHQub2Zmc2V0PGUub2Zmc2V0fWZ1bmN0aW9uIG5rKGUsdCl7cmV0dXJuIHQub2Zmc2V0PmUub2Zmc2V0fWZ1bmN0aW9uIHJrKGUsdCl7bGV0IG49bmV3IEpoLHI9bmV3IFA2KGUsbikscz1uZXcgdWMobi5hZGROZXdMaW5lKSxpPW5ldyBabCh7a2VlcFNvdXJjZVRva2VuczohMCx1bmlxdWVLZXlzOnQ9PW51bGw/dm9pZCAwOnQudW5pcXVlS2V5cyxsaW5lQ291bnRlcjpuLG1lcmdlOiEwfSksbz1bXSxhPVsuLi5zLnBhcnNlKGUpXTtmb3IobGV0IGMgb2YgaS5jb21wb3NlKGEsITAsZS5sZW5ndGgpKXtsZXR7ZXJyb3JzOnB9PWM7aWYocC5sZW5ndGg+MCl0aHJvdyBuZXcgbjIocixwWzBdKTtvLnB1c2goYyl9bGV0IHU9WDYobyxhLHIpLGw9ci5jb21tZW50cy5zb3J0KChjLHApPT5jLnBvc2l0aW9uLnN0YXJ0Lm9mZnNldC1wLnBvc2l0aW9uLmVuZC5vZmZzZXQpLGY9Vzcoci50cmFuc2Zvcm1SYW5nZShbMCxlLmxlbmd0aF0pLHUsbCk7cmV0dXJuIGo3KGYpLEViKGYpLGZ9ZnVuY3Rpb24gc2soZSx0KXtsZXQgbj1uZXcgU3ludGF4RXJyb3IoZSsiICgiK3QubG9jLnN0YXJ0LmxpbmUrIjoiK3QubG9jLnN0YXJ0LmNvbHVtbisiKSIpO3JldHVybiBPYmplY3QuYXNzaWduKG4sdCl9dmFyIGlrPXNrLG9rPXt1bmlxdWVLZXlzOiExfTtmdW5jdGlvbiBhayhlKXtsZXQgdDt0cnl7dD1yayhlLG9rKX1jYXRjaChuKXt0aHJvdyBuIGluc3RhbmNlb2YgbjI/aWsobi5tZXNzYWdlLHtsb2M6bi5wb3NpdGlvbixjYXVzZTpufSk6bn1yZXR1cm4gZGVsZXRlIHQuY29tbWVudHMsdH12YXIgdWs9e2FzdEZvcm1hdDoieWFtbCIscGFyc2U6YWssaGFzUHJhZ21hOnA3LGhhc0lnbm9yZVByYWdtYTpoNyxsb2NTdGFydDpkaCxsb2NFbmQ6bzd9LHZiPXt5YW1sOk83fSxGYj1iNi5wYXJzZSxsaz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxfX3BhcnNlUHJldHRpZXJZYW1sQ29uZmlnOkZiLGRlZmF1bHQ6QUQsbGFuZ3VhZ2VzOmUyLG9wdGlvbnM6dDIscGFyc2VyczpEaCxwcmludGVyczp2Yn0pLGNrPU9iamVjdC5kZWZpbmVQcm9wZXJ0eSxHaD0oZSx0KT0+e2Zvcih2YXIgbiBpbiB0KWNrKGUsbix7Z2V0OnRbbl0sZW51bWVyYWJsZTohMH0pfSxBYj17fTtHaChBYix7bGFuZ3VhZ2VzOigpPT5qRixvcHRpb25zOigpPT5PRixwcmludGVyczooKT0+UkZ9KTt2YXIgZms9W3tuYW1lOiJKYXZhU2NyaXB0Iix0eXBlOiJwcm9ncmFtbWluZyIsYWNlTW9kZToiamF2YXNjcmlwdCIsZXh0ZW5zaW9uczpbIi5qcyIsIi5fanMiLCIuYm9uZXMiLCIuY2pzIiwiLmVzIiwiLmVzNiIsIi5ncyIsIi5qYWtlIiwiLmphdmFzY3JpcHQiLCIuanNiIiwiLmpzY2FkIiwiLmpzZmwiLCIuanNsaWIiLCIuanNtIiwiLmpzcHJlIiwiLmpzcyIsIi5tanMiLCIubmpzIiwiLnBhYyIsIi5zanMiLCIuc3NqcyIsIi54c2pzIiwiLnhzanNsaWIiLCIuc3RhcnQuZnJhZyIsIi5lbmQuZnJhZyIsIi53eHMiXSxmaWxlbmFtZXM6WyJKYWtlZmlsZSIsInN0YXJ0LmZyYWciLCJlbmQuZnJhZyJdLHRtU2NvcGU6InNvdXJjZS5qcyIsYWxpYXNlczpbImpzIiwibm9kZSJdLGNvZGVtaXJyb3JNb2RlOiJqYXZhc2NyaXB0Iixjb2RlbWlycm9yTWltZVR5cGU6InRleHQvamF2YXNjcmlwdCIsaW50ZXJwcmV0ZXJzOlsiYnVuIiwiY2hha3JhIiwiZDgiLCJkZW5vIiwiZ2pzIiwianMiLCJub2RlIiwibm9kZWpzIiwicWpzIiwicmhpbm8iLCJ2OCIsInY4LXNoZWxsIiwiengiXSxwYXJzZXJzOlsiYmFiZWwiLCJhY29ybiIsImVzcHJlZSIsIm1lcml5YWgiLCJiYWJlbC1mbG93IiwiYmFiZWwtdHMiLCJmbG93IiwidHlwZXNjcmlwdCJdLHZzY29kZUxhbmd1YWdlSWRzOlsiamF2YXNjcmlwdCIsIm1vbmdvIl0sbGluZ3Vpc3RMYW5ndWFnZUlkOjE4M30se25hbWU6IkZsb3ciLHR5cGU6InByb2dyYW1taW5nIixhY2VNb2RlOiJqYXZhc2NyaXB0IixleHRlbnNpb25zOlsiLmpzLmZsb3ciXSxmaWxlbmFtZXM6W10sdG1TY29wZToic291cmNlLmpzIixhbGlhc2VzOltdLGNvZGVtaXJyb3JNb2RlOiJqYXZhc2NyaXB0Iixjb2RlbWlycm9yTWltZVR5cGU6InRleHQvamF2YXNjcmlwdCIsaW50ZXJwcmV0ZXJzOlsiYnVuIiwiY2hha3JhIiwiZDgiLCJkZW5vIiwiZ2pzIiwianMiLCJub2RlIiwibm9kZWpzIiwicWpzIiwicmhpbm8iLCJ2OCIsInY4LXNoZWxsIl0scGFyc2VyczpbImZsb3ciLCJiYWJlbC1mbG93Il0sdnNjb2RlTGFuZ3VhZ2VJZHM6WyJqYXZhc2NyaXB0Il0sbGluZ3Vpc3RMYW5ndWFnZUlkOjE4M30se25hbWU6IkpTWCIsdHlwZToicHJvZ3JhbW1pbmciLGFjZU1vZGU6ImphdmFzY3JpcHQiLGV4dGVuc2lvbnM6WyIuanN4Il0sZmlsZW5hbWVzOnZvaWQgMCx0bVNjb3BlOiJzb3VyY2UuanMuanN4IixhbGlhc2VzOnZvaWQgMCxjb2RlbWlycm9yTW9kZToianN4Iixjb2RlbWlycm9yTWltZVR5cGU6InRleHQvanN4IixpbnRlcnByZXRlcnM6dm9pZCAwLHBhcnNlcnM6WyJiYWJlbCIsImJhYmVsLWZsb3ciLCJiYWJlbC10cyIsImZsb3ciLCJ0eXBlc2NyaXB0IiwiZXNwcmVlIiwibWVyaXlhaCJdLHZzY29kZUxhbmd1YWdlSWRzOlsiamF2YXNjcmlwdHJlYWN0Il0sZ3JvdXA6IkphdmFTY3JpcHQiLGxpbmd1aXN0TGFuZ3VhZ2VJZDoxODN9LHtuYW1lOiJUeXBlU2NyaXB0Iix0eXBlOiJwcm9ncmFtbWluZyIsYWNlTW9kZToidHlwZXNjcmlwdCIsZXh0ZW5zaW9uczpbIi50cyIsIi5jdHMiLCIubXRzIl0sdG1TY29wZToic291cmNlLnRzIixhbGlhc2VzOlsidHMiXSxjb2RlbWlycm9yTW9kZToiamF2YXNjcmlwdCIsY29kZW1pcnJvck1pbWVUeXBlOiJhcHBsaWNhdGlvbi90eXBlc2NyaXB0IixpbnRlcnByZXRlcnM6WyJidW4iLCJkZW5vIiwidHMtbm9kZSIsInRzeCJdLHBhcnNlcnM6WyJ0eXBlc2NyaXB0IiwiYmFiZWwtdHMiXSx2c2NvZGVMYW5ndWFnZUlkczpbInR5cGVzY3JpcHQiXSxsaW5ndWlzdExhbmd1YWdlSWQ6Mzc4fSx7bmFtZToiVFNYIix0eXBlOiJwcm9ncmFtbWluZyIsYWNlTW9kZToidHN4IixleHRlbnNpb25zOlsiLnRzeCJdLHRtU2NvcGU6InNvdXJjZS50c3giLGFsaWFzZXM6WyJ0eXBlc2NyaXB0cmVhY3QiXSxjb2RlbWlycm9yTW9kZToianN4Iixjb2RlbWlycm9yTWltZVR5cGU6InRleHQvdHlwZXNjcmlwdC1qc3giLGdyb3VwOiJUeXBlU2NyaXB0IixwYXJzZXJzOlsidHlwZXNjcmlwdCIsImJhYmVsLXRzIl0sdnNjb2RlTGFuZ3VhZ2VJZHM6WyJ0eXBlc2NyaXB0cmVhY3QiXSxsaW5ndWlzdExhbmd1YWdlSWQ6OTQ5MDE5MjR9XSx3Yj17fTtHaCh3Yix7ZXN0cmVlOigpPT5fRn0pO2Z1bmN0aW9uIHBrKGUpe3JldHVybiBBcnJheS5pc0FycmF5KGUpJiZlLmxlbmd0aD4wfXZhciBTZT1wayxoaz0oKT0+e30sZGs9aGs7ZnVuY3Rpb24gSyhlKXtsZXQgdD1uZXcgU2V0KGUpO3JldHVybiBuPT50LmhhcyhuPT1udWxsP3ZvaWQgMDpuLnR5cGUpfXZhciBLaD0oZSx0KT0+KG4sciwuLi5zKT0+bnwxJiZyPT1udWxsP3ZvaWQgMDoodC5jYWxsKHIpPz9yW2VdKS5hcHBseShyLHMpO2Z1bmN0aW9uIG1rKGUpe3JldHVybiB0aGlzW2U8MD90aGlzLmxlbmd0aCtlOmVdfXZhciBnaz1LaCgiYXQiLGZ1bmN0aW9uKCl7aWYoQXJyYXkuaXNBcnJheSh0aGlzKXx8dHlwZW9mIHRoaXM9PSJzdHJpbmciKXJldHVybiBta30pLGNlPWdrO2Z1bmN0aW9uIHZuKGUsdCxuKXtpZighZS5oYXModCkpe2xldCByPW4odCk7ZS5zZXQodCxyKX1yZXR1cm4gZS5nZXQodCl9ZnVuY3Rpb24geWsoZSl7bGV0IHQ9W107cmV0dXJuIGUudGhpcyYmdC5wdXNoKGUudGhpcyksdC5wdXNoKC4uLmUucGFyYW1zKSxlLnJlc3QmJnQucHVzaChlLnJlc3QpLHR9dmFyIERrPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIHh0KGUpe3JldHVybiB2bihEayxlLHlrKX1mdW5jdGlvbiBiayhlLHQpe2xldHtub2RlOm59PWUscj0wLHM9KCk9PnQoZSxyKyspO24udGhpcyYmZS5jYWxsKHMsInRoaXMiKSxlLmVhY2gocywicGFyYW1zIiksbi5yZXN0JiZlLmNhbGwocywicmVzdCIpfWZ1bmN0aW9uIEVrKGUpe3ZhciBuO2lmKGUucmVzdClyZXR1cm4hMDtsZXQgdD14dChlKTtyZXR1cm4oKG49Y2UoMCx0LC0xKSk9PW51bGw/dm9pZCAwOm4udHlwZSk9PT0iUmVzdEVsZW1lbnQifXZhciB2az1lPT4oZT09bnVsbD92b2lkIDA6ZS50eXBlKT09PSJUU0FzRXhwcmVzc2lvbiImJmUudHlwZUFubm90YXRpb24udHlwZT09PSJUU1R5cGVSZWZlcmVuY2UiJiZlLnR5cGVBbm5vdGF0aW9uLnR5cGVOYW1lLnR5cGU9PT0iSWRlbnRpZmllciImJmUudHlwZUFubm90YXRpb24udHlwZU5hbWUubmFtZT09PSJjb25zdCI7ZnVuY3Rpb24gWGgoe25vZGU6ZSxwYXJlbnQ6dH0pe3JldHVybihlPT1udWxsP3ZvaWQgMDplLnR5cGUpIT09IkVtcHR5U3RhdGVtZW50Ij8hMTp0LnR5cGU9PT0iSWZTdGF0ZW1lbnQiP3QuY29uc2VxdWVudD09PWV8fHQuYWx0ZXJuYXRlPT09ZTp0LnR5cGU9PT0iRG9XaGlsZVN0YXRlbWVudCJ8fHQudHlwZT09PSJGb3JJblN0YXRlbWVudCJ8fHQudHlwZT09PSJGb3JPZlN0YXRlbWVudCJ8fHQudHlwZT09PSJGb3JTdGF0ZW1lbnQifHx0LnR5cGU9PT0iTGFiZWxlZFN0YXRlbWVudCJ8fHQudHlwZT09PSJXaXRoU3RhdGVtZW50Inx8dC50eXBlPT09IldoaWxlU3RhdGVtZW50Ij90LmJvZHk9PT1lOiExfWZ1bmN0aW9uIGJvKGUpe3JldHVybiBlLm1ldGhvZCYmZS5raW5kPT09ImluaXQifHxlLmtpbmQ9PT0iZ2V0Inx8ZS5raW5kPT09InNldCJ9dmFyIENiPWU9Pk51bWJlci5pc1NhZmVJbnRlZ2VyKGUpJiZlPj0wO2Z1bmN0aW9uIGxjKGUpe3ZhciB0O3JldHVybigodD1lLnJhbmdlKT09bnVsbD92b2lkIDA6dFsxXSk/P2UuZW5kfWZ1bmN0aW9uIGVlKGUpe3ZhciByLHMsaTtsZXQgdD0oKHI9ZS5yYW5nZSk9PW51bGw/dm9pZCAwOnJbMF0pPz9lLnN0YXJ0LG49KGk9KChzPWUuZGVjbGFyYXRpb24pPT1udWxsP3ZvaWQgMDpzLmRlY29yYXRvcnMpPz9lLmRlY29yYXRvcnMpPT1udWxsP3ZvaWQgMDppWzBdO3JldHVybiBuP01hdGgubWluKGVlKG4pLHQpOnR9dmFyIEZrPTUsQWs9OCx3az04LFNiPWU9PnQ9PnQubGFiZWw/WCh0LmxhYmVsKTplZSh0KStlLENrPWU9PmUuX19jb250ZW50RW5kPz9sYyhlKSx4Yj1bIkV4cHJlc3Npb25TdGF0ZW1lbnQiLCJEaXJlY3RpdmUiLCJJbXBvcnREZWNsYXJhdGlvbiIsIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbiIsIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24iLCJFeHBvcnRBbGxEZWNsYXJhdGlvbiIsIlJldHVyblN0YXRlbWVudCIsIlRocm93U3RhdGVtZW50IiwiRG9XaGlsZVN0YXRlbWVudCJdLFNrPW5ldyBNYXAoW1siQnJlYWtTdGF0ZW1lbnQiLFNiKEZrKV0sWyJDb250aW51ZVN0YXRlbWVudCIsU2IoQWspXSxbIkRlYnVnZ2VyU3RhdGVtZW50IixlPT5lZShlKSt3a10sWyJWYXJpYWJsZURlY2xhcmF0aW9uIixlPT5YKGNlKDAsZS5kZWNsYXJhdGlvbnMsLTEpKV0sLi4ueGIubWFwKGU9PltlLENrXSldKSx4az1LKHhiKSxZaD1lPT57aWYoeGsoZSkmJmUuX19jb250ZW50RW5kKXJldHVybiEwO2xldHt0eXBlOnR9PWU7cmV0dXJuIHQ9PT0iQnJlYWtTdGF0ZW1lbnQifHx0PT09IkNvbnRpbnVlU3RhdGVtZW50Inx8dD09PSJEZWJ1Z2dlclN0YXRlbWVudCJ8fHQ9PT0iVmFyaWFibGVEZWNsYXJhdGlvbiI/ITA6dD09PSJJZlN0YXRlbWVudCI/WWgoZS5hbHRlcm5hdGU/P2UuY29uc2VxdWVudCk6dD09PSJGb3JJblN0YXRlbWVudCJ8fHQ9PT0iRm9yT2ZTdGF0ZW1lbnQifHx0PT09IkZvclN0YXRlbWVudCJ8fHQ9PT0iTGFiZWxlZFN0YXRlbWVudCJ8fHQ9PT0iV2l0aFN0YXRlbWVudCJ8fHQ9PT0iV2hpbGVTdGF0ZW1lbnQiP1loKGUuYm9keSk6ITF9O2Z1bmN0aW9uIFgoZSl7dmFyIG47bGV0e3R5cGU6dH09ZTtyZXR1cm4gdD09PSJJZlN0YXRlbWVudCI/WChlLmFsdGVybmF0ZT8/ZS5jb25zZXF1ZW50KTp0PT09IkZvckluU3RhdGVtZW50Inx8dD09PSJGb3JPZlN0YXRlbWVudCJ8fHQ9PT0iRm9yU3RhdGVtZW50Inx8dD09PSJMYWJlbGVkU3RhdGVtZW50Inx8dD09PSJXaXRoU3RhdGVtZW50Inx8dD09PSJXaGlsZVN0YXRlbWVudCI/WChlLmJvZHkpOigobj1Tay5nZXQodCkpPT1udWxsP3ZvaWQgMDpuKGUpKT8/bGMoZSl9ZnVuY3Rpb24gY2MoZSx0KXtsZXQgbj1lZShlKTtyZXR1cm4gQ2IobikmJm49PT1lZSh0KX1mdW5jdGlvbiBrayhlLHQpe2xldCBuPVgoZSk7cmV0dXJuIENiKG4pJiZuPT09WCh0KX1mdW5jdGlvbiBUayhlLHQpe3JldHVybiBjYyhlLHQpJiZrayhlLHQpfWZ1bmN0aW9uIFF0KGUpe3ZhciB0O3JldHVybigodD1lLmV4dHJhKT09bnVsbD92b2lkIDA6dC5yYXcpPz9lLnJhd31mdW5jdGlvbiBOayhlKXtyZXR1cm4gZS50eXBlPT09IkJpZ0ludExpdGVyYWwifHxlLnR5cGU9PT0iTGl0ZXJhbCImJiEhZS5iaWdpbnR9ZnVuY3Rpb24gTGsoZSl7cmV0dXJuIGUudHlwZT09PSJCb29sZWFuTGl0ZXJhbCJ8fGUudHlwZT09PSJMaXRlcmFsIiYmdHlwZW9mIGUudmFsdWU9PSJib29sZWFuIn1mdW5jdGlvbiBpcihlKXtyZXR1cm4gZS50eXBlPT09Ik51bWVyaWNMaXRlcmFsInx8ZS50eXBlPT09IkxpdGVyYWwiJiZ0eXBlb2YgZS52YWx1ZT09Im51bWJlciJ9ZnVuY3Rpb24ga2IoZSl7cmV0dXJuIGUudHlwZT09PSJSZWdFeHBMaXRlcmFsInx8ZS50eXBlPT09IkxpdGVyYWwiJiYhIWUucmVnZXh9ZnVuY3Rpb24gc3QoZSl7cmV0dXJuKGU9PW51bGw/dm9pZCAwOmUudHlwZSk9PT0iU3RyaW5nTGl0ZXJhbCJ8fChlPT1udWxsP3ZvaWQgMDplLnR5cGUpPT09IkxpdGVyYWwiJiZ0eXBlb2YgZS52YWx1ZT09InN0cmluZyJ9dmFyIHFuPUsoWyJUU0FzRXhwcmVzc2lvbiIsIlRTU2F0aXNmaWVzRXhwcmVzc2lvbiIsIkFzRXhwcmVzc2lvbiIsIkFzQ29uc3RFeHByZXNzaW9uIiwiU2F0aXNmaWVzRXhwcmVzc2lvbiJdKSwkaz1LKFsiU2F0aXNmaWVzRXhwcmVzc2lvbiIsIlRTU2F0aXNmaWVzRXhwcmVzc2lvbiJdKSxadD1LKFsiVFNVbmlvblR5cGUiLCJVbmlvblR5cGVBbm5vdGF0aW9uIl0pLFZhPUsoWyJUU0ludGVyc2VjdGlvblR5cGUiLCJJbnRlcnNlY3Rpb25UeXBlQW5ub3RhdGlvbiJdKSxRaD1LKFsiVHVwbGVUeXBlQW5ub3RhdGlvbiIsIlRTVHVwbGVUeXBlIl0pLGRzPUsoWyJUU0NvbmRpdGlvbmFsVHlwZSIsIkNvbmRpdGlvbmFsVHlwZUFubm90YXRpb24iXSksVGI9SyhbIlRTVHlwZUFsaWFzRGVjbGFyYXRpb24iLCJUeXBlQWxpYXMiXSksRW89SyhbIlJldHVyblN0YXRlbWVudCIsIlRocm93U3RhdGVtZW50Il0pLEJrPUsoWyJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24iLCJEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb24iLCJFeHBvcnROYW1lZERlY2xhcmF0aW9uIiwiRXhwb3J0QWxsRGVjbGFyYXRpb24iLCJEZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb24iXSksaHQ9SyhbIkFycmF5RXhwcmVzc2lvbiJdKSxXbj1LKFsiT2JqZWN0RXhwcmVzc2lvbiJdKSxaaD1LKFsiTGl0ZXJhbCIsIkJvb2xlYW5MaXRlcmFsIiwiQmlnSW50TGl0ZXJhbCIsIkRpcmVjdGl2ZUxpdGVyYWwiLCJOdWxsTGl0ZXJhbCIsIk51bWVyaWNMaXRlcmFsIiwiUmVnRXhwTGl0ZXJhbCIsIlN0cmluZ0xpdGVyYWwiXSksbXM9SyhbIk9iamVjdFR5cGVBbm5vdGF0aW9uIiwiVFNUeXBlTGl0ZXJhbCIsIlRTTWFwcGVkVHlwZSJdKSxVYT1LKFsiRnVuY3Rpb25FeHByZXNzaW9uIiwiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iXSksY3Q9SyhbIkpTWEVsZW1lbnQiLCJKU1hGcmFnbWVudCJdKSxTcj1LKFsiQmluYXJ5RXhwcmVzc2lvbiIsIkxvZ2ljYWxFeHByZXNzaW9uIiwiTkdQaXBlRXhwcmVzc2lvbiJdKSx2ZT1LKFsiQ2FsbEV4cHJlc3Npb24iLCJPcHRpb25hbENhbGxFeHByZXNzaW9uIl0pLHhlPUsoWyJNZW1iZXJFeHByZXNzaW9uIiwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uIl0pLHFhPUsoWyJDYWxsRXhwcmVzc2lvbiIsIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb24iLCJOZXdFeHByZXNzaW9uIl0pLHZvPUsoWyJDYWxsRXhwcmVzc2lvbiIsIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb24iLCJOZXdFeHByZXNzaW9uIiwiSW1wb3J0RXhwcmVzc2lvbiJdKSxacz1LKFsiQ2hhaW5FeHByZXNzaW9uIiwiVFNOb25OdWxsRXhwcmVzc2lvbiJdKSxfaz1LKFsiVFNBcnJheVR5cGUiLCJBcnJheVR5cGVBbm5vdGF0aW9uIl0pLElrPUsoWyJUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIiwiVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24iXSk7ZnVuY3Rpb24gZWQoZSl7aWYoZS50eXBlIT09IkltcG9ydFNwZWNpZmllciImJmUudHlwZSE9PSJFeHBvcnRTcGVjaWZpZXIiKXJldHVybiExO2xldHtsb2NhbDp0LFtlLnR5cGU9PT0iSW1wb3J0U3BlY2lmaWVyIj8iaW1wb3J0ZWQiOiJleHBvcnRlZCJdOm59PWU7cmV0dXJuIHQudHlwZSE9PW4udHlwZXx8IVRrKHQsbik/ITE6c3QodCk/dC52YWx1ZT09PW4udmFsdWUmJlF0KHQpPT09UXQobik6dC50eXBlPT09IklkZW50aWZpZXIiP3QubmFtZT09PW4ubmFtZTohMX12YXIgUGs9SyhbIkZpbGUiLCJUZW1wbGF0ZUVsZW1lbnQiLCJUU0VtcHR5Qm9keUZ1bmN0aW9uRXhwcmVzc2lvbiIsIkNoYWluRXhwcmVzc2lvbiJdKSxNaz0oZSxbdF0pPT4odD09bnVsbD92b2lkIDA6dC50eXBlKT09PSJDb21wb25lbnRQYXJhbWV0ZXIiJiZ0LnNob3J0aGFuZCYmdC5uYW1lPT09ZSYmdC5sb2NhbCE9PXQubmFtZXx8KHQ9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iTWF0Y2hPYmplY3RQYXR0ZXJuUHJvcGVydHkiJiZ0LnNob3J0aGFuZCYmdC5rZXk9PT1lfHwodD09bnVsbD92b2lkIDA6dC50eXBlKT09PSJPYmplY3RQcm9wZXJ0eSImJnQuc2hvcnRoYW5kJiZ0LmtleT09PWUmJnQudmFsdWUhPT10LmtleXx8KHQ9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iUHJvcGVydHkiJiZ0LnNob3J0aGFuZCYmdC5rZXk9PT1lJiYhYm8odCkmJnQudmFsdWUhPT10LmtleXx8KHQ9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iSW1wb3J0U3BlY2lmaWVyIiYmZWQodCkmJnQubG9jYWw9PT1lJiZ0LmxvY2FsIT09dC5pbXBvcnRlZHx8KHQ9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iRXhwb3J0U3BlY2lmaWVyIiYmZWQodCkmJnQuZXhwb3J0ZWQ9PT1lJiZ0LmxvY2FsIT09dC5leHBvcnRlZCxPaz0oZSxbdF0pPT4hIShlLnR5cGU9PT0iRnVuY3Rpb25FeHByZXNzaW9uIiYmdC50eXBlPT09Ik1ldGhvZERlZmluaXRpb24iJiZ0LnZhbHVlPT09ZSYmeHQoZSkubGVuZ3RoPT09MCYmIWUucmV0dXJuVHlwZSYmIVNlKGUudHlwZVBhcmFtZXRlcnMpJiZlLmJvZHkpLE5iPShlLFt0XSk9Pih0PT1udWxsP3ZvaWQgMDp0LnR5cGVBbm5vdGF0aW9uKT09PWUmJnZrKHQpLFJrPShlLFt0LC4uLm5dKT0+TmIoZSxbdF0pfHwodD09bnVsbD92b2lkIDA6dC50eXBlTmFtZSk9PT1lJiZOYih0LG4pO2Z1bmN0aW9uIGprKGUsdCl7cmV0dXJuIFBrKGUpfHxNayhlLHQpfHxPayhlLHQpPyExOmUudHlwZT09PSJFbXB0eVN0YXRlbWVudCI/WGgoe25vZGU6ZSxwYXJlbnQ6dFswXX0pOiEoUmsoZSx0KXx8ZS50eXBlPT09IlRTVHlwZUFubm90YXRpb24iJiZ0WzBdLnR5cGU9PT0iVFNQcm9wZXJ0eVNpZ25hdHVyZSIpfXZhciBWaz1qaztmdW5jdGlvbiBVayhlKXtsZXQgdD1lLnR5cGV8fGUua2luZHx8Iih1bmtub3duIHR5cGUpIixuPVN0cmluZyhlLm5hbWV8fGUuaWQmJih0eXBlb2YgZS5pZD09Im9iamVjdCI/ZS5pZC5uYW1lOmUuaWQpfHxlLmtleSYmKHR5cGVvZiBlLmtleT09Im9iamVjdCI/ZS5rZXkubmFtZTplLmtleSl8fGUudmFsdWUmJih0eXBlb2YgZS52YWx1ZT09Im9iamVjdCI/IiI6U3RyaW5nKGUudmFsdWUpKXx8ZS5vcGVyYXRvcnx8IiIpO3JldHVybiBuLmxlbmd0aD4yMCYmKG49bi5zbGljZSgwLDE5KSsi4oCmIiksdCsobj8iICIrbjoiIil9ZnVuY3Rpb24gdGQoZSx0KXsoZS5jb21tZW50cz8/KGUuY29tbWVudHM9W10pKS5wdXNoKHQpLHQucHJpbnRlZD0hMSx0Lm5vZGVEZXNjcmlwdGlvbj1VayhlKX1mdW5jdGlvbiBaZShlLHQpe3QubGVhZGluZz0hMCx0LnRyYWlsaW5nPSExLHRkKGUsdCl9ZnVuY3Rpb24gVXQoZSx0LG4pe3QubGVhZGluZz0hMSx0LnRyYWlsaW5nPSExLG4mJih0Lm1hcmtlcj1uKSx0ZChlLHQpfWZ1bmN0aW9uIEJlKGUsdCl7dC5sZWFkaW5nPSExLHQudHJhaWxpbmc9ITAsdGQoZSx0KX1mdW5jdGlvbiBuZChlKXtyZXR1cm4odCxuLHIpPT57aWYobj09PSExKXJldHVybiExO2xldCBzPSEhKHIhPW51bGwmJnIuYmFja3dhcmRzKSx7bGVuZ3RoOml9PXQsbz1uO2Zvcig7bz49MCYmbzxpOyl7bGV0IGE9dC5jaGFyQXQobyk7aWYoZSBpbnN0YW5jZW9mIFJlZ0V4cCl7aWYoIWUudGVzdChhKSlyZXR1cm4gb31lbHNlIGlmKCFlLmluY2x1ZGVzKGEpKXJldHVybiBvO3M/by0tOm8rK31yZXR1cm4gbz09PS0xfHxvPT09aT9vOiExfX12YXIgRm89bmQoIiAJIikscWs9bmQoIiw7IAkiKSxXaz1uZCgvW15cblxyXS8pO2Z1bmN0aW9uIEhrKGUsdCl7aWYodD09PSExKXJldHVybiExO2lmKGUuY2hhckF0KHQpPT09Ii8iJiZlLmNoYXJBdCh0KzEpPT09IioiKXtmb3IobGV0IG49dCsyO248ZS5sZW5ndGg7KytuKWlmKGUuY2hhckF0KG4pPT09IioiJiZlLmNoYXJBdChuKzEpPT09Ii8iKXJldHVybiBuKzJ9cmV0dXJuIHR9dmFyIHJkPUhrLExiPWU9PmU9PT1gCmB8fGU9PT0iXHIifHxlPT09Ilx1MjAyOCJ8fGU9PT0iXHUyMDI5IjtmdW5jdGlvbiBKayhlLHQsbil7aWYodD09PSExKXJldHVybiExO2xldCByPSEhKG4hPW51bGwmJm4uYmFja3dhcmRzKSxzPWUuY2hhckF0KHQpO2lmKHIpe2lmKGUuY2hhckF0KHQtMSk9PT0iXHIiJiZzPT09YApgKXJldHVybiB0LTI7aWYoTGIocykpcmV0dXJuIHQtMX1lbHNle2lmKHM9PT0iXHIiJiZlLmNoYXJBdCh0KzEpPT09YApgKXJldHVybiB0KzI7aWYoTGIocykpcmV0dXJuIHQrMX1yZXR1cm4gdH12YXIgQW89Sms7ZnVuY3Rpb24gemsoZSx0KXtyZXR1cm4gdD09PSExPyExOmUuY2hhckF0KHQpPT09Ii8iJiZlLmNoYXJBdCh0KzEpPT09Ii8iP1drKGUsdCk6dH12YXIgc2Q9ems7ZnVuY3Rpb24gR2soZSx0KXtsZXQgbj1udWxsLHI9dDtmb3IoO3IhPT1uOyluPXIscj1GbyhlLHIpLHI9cmQoZSxyKSxyPXNkKGUscikscj1BbyhlLHIpO3JldHVybiByfXZhciBmYz1HaztmdW5jdGlvbiBLayhlLHQpe2xldCBuPWZjKGUsdCk7cmV0dXJuIG49PT0hMT8iIjplLmNoYXJBdChuKX12YXIgb3I9S2s7ZnVuY3Rpb24gWGsoZSx0LG49e30pe2xldCByPUZvKGUsbi5iYWNrd2FyZHM/dC0xOnQsbikscz1BbyhlLHIsbik7cmV0dXJuIHIhPT1zfXZhciBpdD1YaztmdW5jdGlvbiBZayhlLHQsbil7Zm9yKGxldCByPXQ7cjxuOysrcilpZihlLmNoYXJBdChyKT09PWAKYClyZXR1cm4hMDtyZXR1cm4hMX12YXIgcXQ9WWssUWs9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gWmsoZSl7bGV0IHQ7cmV0dXJuIGUudHlwZT09PSJJbXBvcnRFeHByZXNzaW9uInx8ZS50eXBlPT09IlRTSW1wb3J0VHlwZSI/KHQ9W2Uuc291cmNlXSxlLm9wdGlvbnMmJnQucHVzaChlLm9wdGlvbnMpKTplLnR5cGU9PT0iVFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSI/dD1bZS5leHByZXNzaW9uXTp0PWUuYXJndW1lbnRzLHR9ZnVuY3Rpb24gRm4oZSl7cmV0dXJuIHZuKFFrLGUsWmspfWZ1bmN0aW9uIGlkKGUsdCl7bGV0e25vZGU6bn09ZTtuLnR5cGU9PT0iSW1wb3J0RXhwcmVzc2lvbiJ8fG4udHlwZT09PSJUU0ltcG9ydFR5cGUiPyhlLmNhbGwoKCk9PnQoZSwwKSwic291cmNlIiksbi5vcHRpb25zJiZlLmNhbGwoKCk9PnQoZSwxKSwib3B0aW9ucyIpKTpuLnR5cGU9PT0iVFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSI/ZS5jYWxsKCgpPT50KGUsMCksImV4cHJlc3Npb24iKTplLmVhY2godCwiYXJndW1lbnRzIil9ZnVuY3Rpb24gJGIoZSx0KXtpZihlLnR5cGU9PT0iSW1wb3J0RXhwcmVzc2lvbiJ8fGUudHlwZT09PSJUU0ltcG9ydFR5cGUiKXtpZih0PT09MHx8dD09PShlLm9wdGlvbnM/LTI6LTEpKXJldHVyblsic291cmNlIl07aWYoZS5vcHRpb25zJiYodD09PTF8fHQ9PT0tMSkpcmV0dXJuWyJvcHRpb25zIl07dGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgYXJndW1lbnQgaW5kZXgiKX1pZihlLnR5cGU9PT0iVFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSIpe2lmKHQ9PT0wfHx0PT09LTEpcmV0dXJuWyJleHByZXNzaW9uIl19ZWxzZSBpZih0PDAmJih0PWUuYXJndW1lbnRzLmxlbmd0aCt0KSx0Pj0wJiZ0PGUuYXJndW1lbnRzLmxlbmd0aClyZXR1cm5bImFyZ3VtZW50cyIsdF07dGhyb3cgbmV3IFJhbmdlRXJyb3IoIkludmFsaWQgYXJndW1lbnQgaW5kZXgiKX12YXIgZVQ9U3ltYm9sLmZvcigiY29tbWVudHMiKSx0VD1TdHJpbmcucHJvdG90eXBlLnJlcGxhY2VBbGw/P2Z1bmN0aW9uKGUsdCl7cmV0dXJuIGUuZ2xvYmFsP3RoaXMucmVwbGFjZShlLHQpOnRoaXMuc3BsaXQoZSkuam9pbih0KX0sblQ9S2goInJlcGxhY2VBbGwiLGZ1bmN0aW9uKCl7aWYodHlwZW9mIHRoaXM9PSJzdHJpbmciKXJldHVybiB0VH0pLGZ0PW5UO2Z1bmN0aW9uIHJUKGUpe3JldHVybiBmdCgwLGUsL1teXG5dL2csIiAiKX12YXIgc1Q9clQ7ZnVuY3Rpb24gaVQoZSx0KXtmb3IobGV0IG4gb2YgdCl7bGV0IHI9ZWUobikscz1YKG4pO2U9ZS5zbGljZSgwLHIpK3NUKGUuc2xpY2UocixzKSkrZS5zbGljZShzKX1yZXR1cm4gZX12YXIgb1Q9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gQW4oZSl7bGV0IHQ9ZVtlVF07cmV0dXJuIHZuKG9ULHQsbj0+aVQoZS5vcmlnaW5hbFRleHQsbikpfWZ1bmN0aW9uIEJiKGUsdCl7bGV0IG49WChlKS0xO2lmKHQub3JpZ2luYWxUZXh0W25dPT09IikiKXJldHVybiBufWZ1bmN0aW9uIGFUKGUsdCl7aWYoQmIoZSx0KT09PXZvaWQgMClyZXR1cm47bGV0IG49QW4odCkscj1YKGUudHlwZUFyZ3VtZW50cz8/ZS5jYWxsZWUpLHM9bi5pbmRleE9mKCIoIixyKTtpZihzIT09LTEpcmV0dXJuIHN9ZnVuY3Rpb24gdVQoZSx0LG4pe2xldCByPUJiKGUsbik7aWYocj09PXZvaWQgMHx8WCh0KT5yKXJldHVybiExO2xldCBzPWFUKGUsbik7cmV0dXJuIHM9PT12b2lkIDA/ITE6ZWUodCk+c312YXIgSG49SyhbIkJsb2NrIiwiQ29tbWVudEJsb2NrIiwiTXVsdGlMaW5lIl0pLGdzPUsoWyJMaW5lIiwiQ29tbWVudExpbmUiLCJTaW5nbGVMaW5lIiwiSGFzaGJhbmdDb21tZW50IiwiSFRNTE9wZW4iLCJIVE1MQ2xvc2UiLCJIYXNoYmFuZyIsIkludGVycHJldGVyRGlyZWN0aXZlIl0pO2Z1bmN0aW9uIHlzKGUpe3JldHVybihlPT1udWxsP3ZvaWQgMDplLnR5cGUpPT09Ik9iamVjdFByb3BlcnR5Inx8KGU9PW51bGw/dm9pZCAwOmUudHlwZSk9PT0iUHJvcGVydHkiJiYhYm8oZSl9ZnVuY3Rpb24gZWkoZSl7cmV0dXJuIGUudmFsdWUudHJpbSgpPT09InByZXR0aWVyLWlnbm9yZSImJiFlLnVuaWdub3JlfXZhciBsVD1uZXcgV2Vha01hcDtmdW5jdGlvbiBvZChlKXtyZXR1cm4gdm4obFQsZSx0PT5Ibih0KSYmdC52YWx1ZVswXT09PSIqIiYmL0AoPzp0eXBlfHNhdGlzZmllcylcYi8udGVzdCh0LnZhbHVlKSl9ZnVuY3Rpb24gYWQoe2NvbW1lbnQ6ZSxlbmNsb3NpbmdOb2RlOnQsZm9sbG93aW5nTm9kZTpuLG9wdGlvbnM6cn0pe2lmKCgodD09bnVsbD92b2lkIDA6dC50eXBlKT09PSJGb3JJblN0YXRlbWVudCJ8fCh0PT1udWxsP3ZvaWQgMDp0LnR5cGUpPT09IkZvck9mU3RhdGVtZW50Inx8KHQ9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iRm9yU3RhdGVtZW50IikmJm4mJm49PT10LmJvZHkpe2xldCBzPUFuKHIpLmxhc3RJbmRleE9mKCIpIixlZShuKSk7aWYoZWUoZSk+cylyZXR1cm4gWmUobixlKSwhMH1yZXR1cm4hMX12YXIgX2I9KGUsdCk9PkhuKGUpJiYhcXQodCxlZShlKSxYKGUpKSx1ZD0oZSx0KT0+Z3MoZSl8fF9iKGUsdCk7ZnVuY3Rpb24gbGQoZSx0KXtlLnR5cGU9PT0iQmxvY2tTdGF0ZW1lbnQiP1dhKGUsdCk6WmUoZSx0KX1mdW5jdGlvbiBXYShlLHQpe2xldCBuPShlLmJvZHl8fGUucHJvcGVydGllcykuZmluZCgoe3R5cGU6cn0pPT5yIT09IkVtcHR5U3RhdGVtZW50Iik7bj9aZShuLHQpOlV0KGUsdCl9ZnVuY3Rpb24gY2Qoe2NvbW1lbnQ6ZSxwcmVjZWRpbmdOb2RlOnQsZW5jbG9zaW5nTm9kZTpuLGZvbGxvd2luZ05vZGU6cix0ZXh0OnMsb3B0aW9uczppfSl7cmV0dXJuKG49PW51bGw/dm9pZCAwOm4udHlwZSkhPT0iSWZTdGF0ZW1lbnQifHwhcj8hMTpvcihzLFgoZSkpPT09IikiPyhCZSh0LGUpLCEwKTpyPT09bi5jb25zZXF1ZW50PyhaZShyLGUpLCEwKTp0PT09bi5jb25zZXF1ZW50JiZyPT09bi5hbHRlcm5hdGU/Y1Qoe2NvbW1lbnQ6ZSxwcmVjZWRpbmdOb2RlOnQsZW5jbG9zaW5nTm9kZTpuLGZvbGxvd2luZ05vZGU6cix0ZXh0OnMsb3B0aW9uczppfSk6ITF9ZnVuY3Rpb24gY1Qoe2NvbW1lbnQ6ZSxwcmVjZWRpbmdOb2RlOnQsZW5jbG9zaW5nTm9kZTpuLGZvbGxvd2luZ05vZGU6cix0ZXh0OnMsb3B0aW9uczppfSl7bGV0IG89QW4oaSkuaW5kZXhPZigiZWxzZSIsWChuLmNvbnNlcXVlbnQpKTtyZXR1cm4gZWUoZSk+PW8/KFplKHIsZSksITApOnQudHlwZSE9PSJCbG9ja1N0YXRlbWVudCImJnVkKGUscykmJiFxdChzLFgodCksZWUoZSkpPyhCZSh0LGUpLCEwKTooVXQobixlKSwhMCl9ZnVuY3Rpb24gZmQoe2NvbW1lbnQ6ZSxwcmVjZWRpbmdOb2RlOnQsZW5jbG9zaW5nTm9kZTpuLGZvbGxvd2luZ05vZGU6cix0ZXh0OnN9KXtyZXR1cm4obj09bnVsbD92b2lkIDA6bi50eXBlKT09PSJTd2l0Y2hTdGF0ZW1lbnQiJiZuLmNhc2VzLmxlbmd0aD09PTAmJiFyJiZ0PT09bi5kaXNjcmltaW5hbnQmJm9yKHMsWChlKSk9PT0ifSI/KFV0KG4sZSksITApOiExfWZ1bmN0aW9uIHBkKHtjb21tZW50OmUscHJlY2VkaW5nTm9kZTp0LGVuY2xvc2luZ05vZGU6bixmb2xsb3dpbmdOb2RlOnIsdGV4dDpzfSl7cmV0dXJuKChuPT1udWxsP3ZvaWQgMDpuLnR5cGUpPT09IldoaWxlU3RhdGVtZW50Inx8KG49PW51bGw/dm9pZCAwOm4udHlwZSk9PT0iV2l0aFN0YXRlbWVudCIpJiZyP29yKHMsWChlKSk9PT0iKSI/KEJlKHQsZSksITApOm4uYm9keT09PXI/KFplKHIsZSksITApOiExOiExfWZ1bmN0aW9uIEliKGUse2NvbW1lbnQ6dCx0ZXh0Om4sb3B0aW9uczpyfSl7aWYoWnQoZSkmJl9iKHQsbikmJiFlaSh0KSl7bGV0IHM9QW4ocikuc2xpY2UoWCh0KSxlZShlKSk7cmV0dXJuL15bIFx0XSokLy50ZXN0KHMpfXJldHVybiExfWZ1bmN0aW9uIFBiKGUsdCl7cmV0dXJuIFplKEliKGUsdCk/ZS50eXBlc1swXTplLHQuY29tbWVudCksITB9ZnVuY3Rpb24gZlQoZSl7cmV0dXJuW2hkLEdiLE9iLFdiLG1ULGNkLHBkLGZkLE1iLFJiLGFkLEZULEFULGRkLEpiLENULFZiLEhiLGdULCRULG1kLGdkLFhiXS5zb21lKHQ9PnQoZSkpfWZ1bmN0aW9uIHBUKGUpe3JldHVybltoZCxkVCxXYixPYixKYixjZCxwZCxmZCxNYixSYixhZCxIYix2VCx3VCxkZCx6YixOVCxMVCxCVCxtZCxQVCxLYixfVCxnZF0uc29tZSh0PT50KGUpKX1mdW5jdGlvbiBoVChlKXtyZXR1cm5baGQsR2IsY2QscGQsZmQsYWQsVmIsZGQsemIsbWQsYlQsRFQsa1QsS2IsZ2QsWGJdLnNvbWUodD0+dChlKSl9ZnVuY3Rpb24gZFQoe2NvbW1lbnQ6ZSxmb2xsb3dpbmdOb2RlOnR9KXtyZXR1cm4gdCYmb2QoZSk/KFplKHQsZSksITApOiExfWZ1bmN0aW9uIE1iKHtjb21tZW50OmUscHJlY2VkaW5nTm9kZTp0LGVuY2xvc2luZ05vZGU6bixmb2xsb3dpbmdOb2RlOnJ9KXtyZXR1cm4obj09bnVsbD92b2lkIDA6bi50eXBlKSE9PSJUcnlTdGF0ZW1lbnQiJiYobj09bnVsbD92b2lkIDA6bi50eXBlKSE9PSJDYXRjaENsYXVzZSJ8fCFyPyExOm4udHlwZT09PSJDYXRjaENsYXVzZSImJnQ/KEJlKHQsZSksITApOnIudHlwZT09PSJCbG9ja1N0YXRlbWVudCI/KFdhKHIsZSksITApOnIudHlwZT09PSJUcnlTdGF0ZW1lbnQiPyhsZChyLmZpbmFsaXplcixlKSwhMCk6ci50eXBlPT09IkNhdGNoQ2xhdXNlIj8obGQoci5ib2R5LGUpLCEwKTohMX1mdW5jdGlvbiBtVCh7Y29tbWVudDplLGVuY2xvc2luZ05vZGU6dCxmb2xsb3dpbmdOb2RlOm59KXtyZXR1cm4geGUodCkmJihuPT1udWxsP3ZvaWQgMDpuLnR5cGUpPT09IklkZW50aWZpZXIiPyhaZSh0LGUpLCEwKTohMX1mdW5jdGlvbiBnVCh7Y29tbWVudDplLGVuY2xvc2luZ05vZGU6dCxmb2xsb3dpbmdOb2RlOm4sb3B0aW9uczpyfSl7cmV0dXJuIXIuZXhwZXJpbWVudGFsVGVybmFyaWVzfHwhKCh0PT1udWxsP3ZvaWQgMDp0LnR5cGUpPT09IkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJ8fGRzKHQpKT8hMToobj09bnVsbD92b2lkIDA6bi50eXBlKT09PSJDb25kaXRpb25hbEV4cHJlc3Npb24ifHxkcyhuKT8oVXQodCxlKSwhMCk6ITF9ZnVuY3Rpb24gT2Ioe2NvbW1lbnQ6ZSxwcmVjZWRpbmdOb2RlOnQsZW5jbG9zaW5nTm9kZTpuLGZvbGxvd2luZ05vZGU6cix0ZXh0OnMsb3B0aW9uczppfSl7bGV0IG89dCYmIXF0KHMsWCh0KSxlZShlKSk7cmV0dXJuKCF0fHwhbykmJigobj09bnVsbD92b2lkIDA6bi50eXBlKT09PSJDb25kaXRpb25hbEV4cHJlc3Npb24ifHxkcyhuKSkmJnI/aS5leHBlcmltZW50YWxUZXJuYXJpZXMmJm4uYWx0ZXJuYXRlPT09ciYmIShIbihlKSYmIXF0KGkub3JpZ2luYWxUZXh0LGVlKGUpLFgoZSkpKT8oVXQobixlKSwhMCk6KFplKHIsZSksITApOiExfXZhciB5VD1LKFsiQ2xhc3NEZWNsYXJhdGlvbiIsIkNsYXNzRXhwcmVzc2lvbiIsIkRlY2xhcmVDbGFzcyIsIkRlY2xhcmVJbnRlcmZhY2UiLCJJbnRlcmZhY2VEZWNsYXJhdGlvbiIsIlRTSW50ZXJmYWNlRGVjbGFyYXRpb24iXSk7ZnVuY3Rpb24gUmIoe2NvbW1lbnQ6ZSxwcmVjZWRpbmdOb2RlOnQsZW5jbG9zaW5nTm9kZTpuLGZvbGxvd2luZ05vZGU6cn0pe2lmKHlUKG4pKXtsZXR7ZGVjb3JhdG9yczpzfT1uO2lmKFNlKHMpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKSE9PSJEZWNvcmF0b3IiKXJldHVybiBCZShjZSgwLHMsLTEpLGUpLCEwO2lmKG4uYm9keSYmcj09PW4uYm9keSlyZXR1cm4gV2Eobi5ib2R5LGUpLCEwO2lmKHIpe2xldHtzdXBlckNsYXNzOml9PW47aWYoaSYmcj09PWkmJnQmJih0PT09bi5pZHx8dD09PW4udHlwZVBhcmFtZXRlcnMpKXJldHVybiBCZSh0LGUpLCEwO2ZvcihsZXQgbyBvZlsiaW1wbGVtZW50cyIsImV4dGVuZHMiLCJtaXhpbnMiXSlpZihuW29dJiZyPT09bltvXVswXSlyZXR1cm4gdCYmKHQ9PT1uLmlkfHx0PT09bi50eXBlUGFyYW1ldGVyc3x8dD09PWkpP0JlKHQsZSk6VXQobixlLG8pLCEwfX1yZXR1cm4hMX12YXIgamI9SyhbIkNsYXNzTWV0aG9kIiwiQ2xhc3NQcm9wZXJ0eSIsIlByb3BlcnR5RGVmaW5pdGlvbiIsIlRTQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb24iLCJUU0Fic3RyYWN0TWV0aG9kRGVmaW5pdGlvbiIsIlRTRGVjbGFyZU1ldGhvZCIsIk1ldGhvZERlZmluaXRpb24iLCJDbGFzc0FjY2Vzc29yUHJvcGVydHkiLCJBY2Nlc3NvclByb3BlcnR5IiwiVFNBYnN0cmFjdEFjY2Vzc29yUHJvcGVydHkiLCJUU1BhcmFtZXRlclByb3BlcnR5Il0pO2Z1bmN0aW9uIFZiKHtwbGFjZW1lbnQ6ZSxjb21tZW50OnQscHJlY2VkaW5nTm9kZTpuLGVuY2xvc2luZ05vZGU6cixmb2xsb3dpbmdOb2RlOnMsdGV4dDppfSl7cmV0dXJuIHImJm4mJm9yKGksWCh0KSk9PT0iKCImJihyLnR5cGU9PT0iUHJvcGVydHkifHxyLnR5cGU9PT0iVFNEZWNsYXJlTWV0aG9kInx8ci50eXBlPT09IlRTQWJzdHJhY3RNZXRob2REZWZpbml0aW9uIikmJm4udHlwZT09PSJJZGVudGlmaWVyIiYmci5rZXk9PT1uJiZvcihpLFgobikpIT09IjoiPyhCZShuLHQpLCEwKTpqYihyKSYmIXMmJmU9PT0icmVtYWluaW5nIj8oQmUob3IoaSxYKHQpKT09PSIoIj9uOnIsdCksITApOihuPT1udWxsP3ZvaWQgMDpuLnR5cGUpPT09IkRlY29yYXRvciImJmpiKHIpJiYoZ3ModCl8fGU9PT0ib3duTGluZSIpPyhCZShuLHQpLCEwKTohMX12YXIgVWI9SyhbIkZ1bmN0aW9uRGVjbGFyYXRpb24iLCJGdW5jdGlvbkV4cHJlc3Npb24iLCJDbGFzc01ldGhvZCIsIk1ldGhvZERlZmluaXRpb24iLCJPYmplY3RNZXRob2QiXSk7ZnVuY3Rpb24gRFQoe2NvbW1lbnQ6ZSxwcmVjZWRpbmdOb2RlOnQsZW5jbG9zaW5nTm9kZTpuLHRleHQ6cn0pe3JldHVybiBvcihyLFgoZSkpIT09IigiPyExOnQmJlViKG4pPyhCZSh0LGUpLCEwKTohMX1mdW5jdGlvbiBiVCh7Y29tbWVudDplLGVuY2xvc2luZ05vZGU6dCx0ZXh0Om59KXtpZigodD09bnVsbD92b2lkIDA6dC50eXBlKSE9PSJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiIpcmV0dXJuITE7bGV0IHI9ZmMobixYKGUpKTtyZXR1cm4gciE9PSExJiZuLnNsaWNlKHIscisyKT09PSI9PiI/KFV0KHQsZSwiY29tbWVudEJlZm9yZUFycm93IiksITApOiExfWZ1bmN0aW9uIHFiKGUsdCxuKXtsZXQgcj1lZSh0KSxzPVgoZSk7aWYocj49cylyZXR1cm4hMTtsZXQgaT1YKHQpLG89ZWUoZSk7aWYoaTw9bylyZXR1cm4hMTtsZXQgYT1BbihuKTtyZXR1cm4gYS5zbGljZSgwLGVlKHQpKS50cmltRW5kKCkuZW5kc1dpdGgoIigiKSYmYS5zbGljZShYKHQpKS50cmltU3RhcnQoKS5zdGFydHNXaXRoKCIpIil9dmFyIEVUPUsoWyJDb21wb25lbnREZWNsYXJhdGlvbiIsIkRlY2xhcmVDb21wb25lbnQiLCJDb21wb25lbnRUeXBlQW5ub3RhdGlvbiJdKTtmdW5jdGlvbiBoZCh7Y29tbWVudDplLGVuY2xvc2luZ05vZGU6dCxvcHRpb25zOm59KXtpZighdClyZXR1cm4hMTtpZih2byh0KSYmRm4odCkubGVuZ3RoPT09MCYmcWIodCxlLG4pKXJldHVybiBVdCh0LGUpLCEwO2xldCByPVliKHQpfHxFVCh0KXx8dC50eXBlPT09Ikhvb2tUeXBlQW5ub3RhdGlvbiI/dDp0LnR5cGU9PT0iTWV0aG9kRGVmaW5pdGlvbiJ8fHQudHlwZT09PSJUU0Fic3RyYWN0TWV0aG9kRGVmaW5pdGlvbiJ8fHQudHlwZT09PSJQcm9wZXJ0eSImJmJvKHQpP3QudmFsdWU6dm9pZCAwO3JldHVybiByJiZ4dChyKS5sZW5ndGg9PT0wJiZxYihyLGUsbik/KFV0KHIsZSksITApOiExfWZ1bmN0aW9uIFdiKHtjb21tZW50OmUscHJlY2VkaW5nTm9kZTp0LGVuY2xvc2luZ05vZGU6bixmb2xsb3dpbmdOb2RlOnIsdGV4dDpzfSl7cmV0dXJuKHQ9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iRnVuY3Rpb25UeXBlUGFyYW0iJiYobj09bnVsbD92b2lkIDA6bi50eXBlKT09PSJGdW5jdGlvblR5cGVBbm5vdGF0aW9uIiYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSkhPT0iRnVuY3Rpb25UeXBlUGFyYW0ifHwodD09bnVsbD92b2lkIDA6dC50eXBlKT09PSJDb21wb25lbnRUeXBlUGFyYW1ldGVyIiYmKChuPT1udWxsP3ZvaWQgMDpuLnR5cGUpPT09IkRlY2xhcmVDb21wb25lbnQifHwobj09bnVsbD92b2lkIDA6bi50eXBlKT09PSJDb21wb25lbnRUeXBlQW5ub3RhdGlvbiIpJiYocj09bnVsbD92b2lkIDA6ci50eXBlKSE9PSJDb21wb25lbnRUeXBlUGFyYW1ldGVyInx8KCh0PT1udWxsP3ZvaWQgMDp0LnR5cGUpPT09IklkZW50aWZpZXIifHwodD09bnVsbD92b2lkIDA6dC50eXBlKT09PSJBc3NpZ25tZW50UGF0dGVybiJ8fCh0PT1udWxsP3ZvaWQgMDp0LnR5cGUpPT09Ik9iamVjdFBhdHRlcm4ifHwodD09bnVsbD92b2lkIDA6dC50eXBlKT09PSJBcnJheVBhdHRlcm4ifHwodD09bnVsbD92b2lkIDA6dC50eXBlKT09PSJSZXN0RWxlbWVudCJ8fCh0PT1udWxsP3ZvaWQgMDp0LnR5cGUpPT09IlRTUGFyYW1ldGVyUHJvcGVydHkiKSYmKFliKG4pfHwoKG49PW51bGw/dm9pZCAwOm4udHlwZSk9PT0iVFNBYnN0cmFjdE1ldGhvZERlZmluaXRpb24ifHwobj09bnVsbD92b2lkIDA6bi50eXBlKT09PSJNZXRob2REZWZpbml0aW9uIikmJm4udmFsdWUudHlwZT09PSJUU0VtcHR5Qm9keUZ1bmN0aW9uRXhwcmVzc2lvbiIpJiZvcihzLFgoZSkpPT09IikifHwoKHQ9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iQ29tcG9uZW50UGFyYW1ldGVyInx8KHQ9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iUmVzdEVsZW1lbnQiKSYmKChuPT1udWxsP3ZvaWQgMDpuLnR5cGUpPT09IkNvbXBvbmVudERlY2xhcmF0aW9uInx8KG49PW51bGw/dm9pZCAwOm4udHlwZSk9PT0iRGVjbGFyZUNvbXBvbmVudCIpJiZvcihzLFgoZSkpPT09IikiPyhCZSh0LGUpLCEwKTohSG4oZSkmJihyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09IkJsb2NrU3RhdGVtZW50IiYmVWIobikmJihuLnR5cGU9PT0iTWV0aG9kRGVmaW5pdGlvbiI/bi52YWx1ZS5ib2R5Om4uYm9keSk9PT1yJiZmYyhzLFgoZSkpPT09ZWUocik/KFdhKHIsZSksITApOiExfWZ1bmN0aW9uIEhiKHtjb21tZW50OmUsZW5jbG9zaW5nTm9kZTp0fSl7cmV0dXJuKHQ9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iTGFiZWxlZFN0YXRlbWVudCI/KFplKHQsZSksITApOiExfWZ1bmN0aW9uIHZUKHtjb21tZW50OmUscHJlY2VkaW5nTm9kZTp0LGVuY2xvc2luZ05vZGU6bixvcHRpb25zOnJ9KXtyZXR1cm4gcWEobikmJm4uY2FsbGVlPT09dCYmbi5hcmd1bWVudHMubGVuZ3RoPjAmJnVUKG4sZSxyKT8oWmUobi5hcmd1bWVudHNbMF0sZSksITApOiExfWZ1bmN0aW9uIEZUKHtjb21tZW50OmUscHJlY2VkaW5nTm9kZTp0LGVuY2xvc2luZ05vZGU6bixmb2xsb3dpbmdOb2RlOnJ9KXtyZXR1cm4gWnQobik/KGVpKGUpJiYoci5wcmV0dGllcklnbm9yZT0hMCxlLnVuaWdub3JlPSEwKSx0PyhCZSh0LGUpLCEwKTohMSk6KFp0KHIpJiZlaShlKSYmKHIudHlwZXNbMF0ucHJldHRpZXJJZ25vcmU9ITAsZS51bmlnbm9yZT0hMCksITEpfWZ1bmN0aW9uIEFUKHtjb21tZW50OmUscHJlY2VkaW5nTm9kZTp0LGVuY2xvc2luZ05vZGU6bixmb2xsb3dpbmdOb2RlOnJ9KXtyZXR1cm4gbiYmbi50eXBlPT09Ik1hdGNoT3JQYXR0ZXJuIj8oZWkoZSkmJihyLnByZXR0aWVySWdub3JlPSEwLGUudW5pZ25vcmU9ITApLHQ/KEJlKHQsZSksITApOiExKToociYmci50eXBlPT09Ik1hdGNoT3JQYXR0ZXJuIiYmZWkoZSkmJihyLnR5cGVzWzBdLnByZXR0aWVySWdub3JlPSEwLGUudW5pZ25vcmU9ITApLCExKX1mdW5jdGlvbiB3VCh7Y29tbWVudDplLGVuY2xvc2luZ05vZGU6dH0pe3JldHVybiB5cyh0KT8oWmUodCxlKSwhMCk6ITF9ZnVuY3Rpb24gZGQoe2NvbW1lbnQ6ZSxlbmNsb3NpbmdOb2RlOnQsYXN0Om4saXNMYXN0Q29tbWVudDpyfSl7dmFyIHM7cmV0dXJuKChzPW49PW51bGw/dm9pZCAwOm4uYm9keSk9PW51bGw/dm9pZCAwOnMubGVuZ3RoKT09PTA/KHI/VXQobixlKTpaZShuLGUpLCEwKToodD09bnVsbD92b2lkIDA6dC50eXBlKT09PSJQcm9ncmFtIiYmdC5ib2R5Lmxlbmd0aD09PTAmJiFTZSh0LmRpcmVjdGl2ZXMpPyhyP1V0KHQsZSk6WmUodCxlKSwhMCk6ITF9ZnVuY3Rpb24gSmIoe2NvbW1lbnQ6ZSxwcmVjZWRpbmdOb2RlOnQsZW5jbG9zaW5nTm9kZTpuLHRleHQ6cn0pe2lmKChuPT1udWxsP3ZvaWQgMDpuLnR5cGUpPT09IkltcG9ydFNwZWNpZmllciJ8fChuPT1udWxsP3ZvaWQgMDpuLnR5cGUpPT09IkV4cG9ydFNwZWNpZmllciIpcmV0dXJuIFplKG4sZSksITA7bGV0IHM9KHQ9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iSW1wb3J0U3BlY2lmaWVyIiYmKG49PW51bGw/dm9pZCAwOm4udHlwZSk9PT0iSW1wb3J0RGVjbGFyYXRpb24iLGk9KHQ9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iRXhwb3J0U3BlY2lmaWVyIiYmKG49PW51bGw/dm9pZCAwOm4udHlwZSk9PT0iRXhwb3J0TmFtZWREZWNsYXJhdGlvbiI7cmV0dXJuKHN8fGkpJiZpdChyLFgoZSkpPyhCZSh0LGUpLCEwKTohMX1mdW5jdGlvbiBDVCh7Y29tbWVudDplLGVuY2xvc2luZ05vZGU6dH0pe3JldHVybih0PT1udWxsP3ZvaWQgMDp0LnR5cGUpPT09IkFzc2lnbm1lbnRQYXR0ZXJuIj8oWmUodCxlKSwhMCk6ITF9dmFyIFNUPUsoWyJWYXJpYWJsZURlY2xhcmF0b3IiLCJBc3NpZ25tZW50RXhwcmVzc2lvbiIsIlR5cGVBbGlhcyIsIlRTVHlwZUFsaWFzRGVjbGFyYXRpb24iXSkseFQ9SyhbIk9iamVjdEV4cHJlc3Npb24iLCJBcnJheUV4cHJlc3Npb24iLCJUZW1wbGF0ZUxpdGVyYWwiLCJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24iLCJPYmplY3RUeXBlQW5ub3RhdGlvbiIsIlRTVHlwZUxpdGVyYWwiXSk7ZnVuY3Rpb24gemIoZSl7bGV0e2NvbW1lbnQ6dCxlbmNsb3NpbmdOb2RlOm4sZm9sbG93aW5nTm9kZTpyLG9wdGlvbnM6cyxwbGFjZW1lbnQ6aX09ZTtpZihTVChuKSYmciYmaT09PSJlbmRPZkxpbmUiJiYoeFQocil8fEhuKHQpKSlyZXR1cm4gUGIocixlKTtpZihUYihuKSYmcil7bGV0IG89bi5pZCxhPUFuKHMpLmluZGV4T2YoIj0iLFgobykpO2lmKGVlKHQpPj1hKXJldHVybiBQYihyLGUpfXJldHVybiExfWZ1bmN0aW9uIGtUKHtjb21tZW50OmUsZW5jbG9zaW5nTm9kZTp0LHByZWNlZGluZ05vZGU6bixmb2xsb3dpbmdOb2RlOnIsdGV4dDpzfSl7cmV0dXJuIXImJigodD09bnVsbD92b2lkIDA6dC50eXBlKT09PSJUU01ldGhvZFNpZ25hdHVyZSJ8fCh0PT1udWxsP3ZvaWQgMDp0LnR5cGUpPT09IlRTRGVjbGFyZUZ1bmN0aW9uInx8KHQ9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iVFNBYnN0cmFjdE1ldGhvZERlZmluaXRpb24iKSYmKCFufHxuIT09dC5yZXR1cm5UeXBlKSYmb3IocyxYKGUpKT09PSI7Ij8oQmUodCxlKSwhMCk6ITF9ZnVuY3Rpb24gR2Ioe2NvbW1lbnQ6ZSxlbmNsb3NpbmdOb2RlOnQsZm9sbG93aW5nTm9kZTpufSl7aWYoZWkoZSkmJih0PT1udWxsP3ZvaWQgMDp0LnR5cGUpPT09IlRTTWFwcGVkVHlwZSImJm49PT10LmtleSlyZXR1cm4gdC5wcmV0dGllcklnbm9yZT0hMCxlLnVuaWdub3JlPSEwLCEwfWZ1bmN0aW9uIFRUKGUsdCxuKXtsZXQgcj1BbihuKS5pbmRleE9mKCJbIixlZShlKSk7cmV0dXJuIFgodCk8cn1mdW5jdGlvbiBtZCh7Y29tbWVudDplLGVuY2xvc2luZ05vZGU6dCxvcHRpb25zOm59KXtpZigodD09bnVsbD92b2lkIDA6dC50eXBlKT09PSJUU01hcHBlZFR5cGUiJiZUVCh0LGUsbikpcmV0dXJuIFV0KHQsZSksITB9ZnVuY3Rpb24gTlQoe2NvbW1lbnQ6ZSxlbmNsb3NpbmdOb2RlOnQsZm9sbG93aW5nTm9kZTpufSl7cmV0dXJuIXR8fHQudHlwZSE9PSJTd2l0Y2hDYXNlInx8dC50ZXN0fHwhbnx8biE9PXQuY29uc2VxdWVudFswXT8hMToobi50eXBlPT09IkJsb2NrU3RhdGVtZW50IiYmZ3MoZSk/V2EobixlKTpVdCh0LGUpLCEwKX1mdW5jdGlvbiBMVCh7Y29tbWVudDplLHByZWNlZGluZ05vZGU6dCxlbmNsb3NpbmdOb2RlOm4sZm9sbG93aW5nTm9kZTpyfSl7cmV0dXJuIFp0KHQpJiYoX2sobikmJiFyfHxWYShuKXx8WnQobikpPyhCZShjZSgwLHQudHlwZXMsLTEpLGUpLCEwKTohMX1mdW5jdGlvbiAkVCh7Y29tbWVudDplLGVuY2xvc2luZ05vZGU6dCxwcmVjZWRpbmdOb2RlOm4sZm9sbG93aW5nTm9kZTpyfSl7aWYoKCh0PT1udWxsP3ZvaWQgMDp0LnR5cGUpPT09Ik9iamVjdFBhdHRlcm4ifHwodD09bnVsbD92b2lkIDA6dC50eXBlKT09PSJBcnJheVBhdHRlcm4iKSYmKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0iVFNUeXBlQW5ub3RhdGlvbiIpcmV0dXJuIG4/QmUobixlKTpVdCh0LGUpLCEwfWZ1bmN0aW9uIEJUKHtjb21tZW50OmUscHJlY2VkaW5nTm9kZTp0LGVuY2xvc2luZ05vZGU6bixmb2xsb3dpbmdOb2RlOnIsdGV4dDpzfSl7cmV0dXJuIXImJihuPT1udWxsP3ZvaWQgMDpuLnR5cGUpPT09IlVuYXJ5RXhwcmVzc2lvbiImJigodD09bnVsbD92b2lkIDA6dC50eXBlKT09PSJMb2dpY2FsRXhwcmVzc2lvbiJ8fCh0PT1udWxsP3ZvaWQgMDp0LnR5cGUpPT09IkJpbmFyeUV4cHJlc3Npb24iKSYmcXQocyxlZShuLmFyZ3VtZW50KSxlZSh0LnJpZ2h0KSkmJnVkKGUscykmJiFxdChzLGVlKHQucmlnaHQpLGVlKGUpKT8oQmUodC5yaWdodCxlKSwhMCk6ITF9ZnVuY3Rpb24gX1Qoe2VuY2xvc2luZ05vZGU6ZSxmb2xsb3dpbmdOb2RlOnQsY29tbWVudDpufSl7aWYoZSYmKGUudHlwZT09PSJUU1Byb3BlcnR5U2lnbmF0dXJlInx8ZS50eXBlPT09Ik9iamVjdFR5cGVQcm9wZXJ0eSIpJiYoWnQodCl8fFZhKHQpKSlyZXR1cm4gWmUodCxuKSwhMH1mdW5jdGlvbiBnZCh7ZW5jbG9zaW5nTm9kZTplLHByZWNlZGluZ05vZGU6dCxmb2xsb3dpbmdOb2RlOm4sY29tbWVudDpyLHRleHQ6c30pe2lmKHFuKGUpJiZ0PT09ZS5leHByZXNzaW9uJiYhdWQocixzKSlyZXR1cm4gbj9aZShuLHIpOkJlKGUsciksITB9ZnVuY3Rpb24gSVQoZSx0LG4pe2xldCByPUFuKG4pLmxhc3RJbmRleE9mKCI9PiIsZWUodC5ib2R5KSk7cmV0dXJuIFgoZSk8cn1mdW5jdGlvbiBQVCh7Y29tbWVudDplLGVuY2xvc2luZ05vZGU6dCxmb2xsb3dpbmdOb2RlOm4scHJlY2VkaW5nTm9kZTpyLG9wdGlvbnM6c30pe3JldHVybih0PT1udWxsP3ZvaWQgMDp0LnR5cGUpIT09IkFycm93RnVuY3Rpb25FeHByZXNzaW9uInx8IW58fCFyfHxJVChlLHQscyk/ITE6KGxkKG4sZSksITApfWZ1bmN0aW9uIEtiKHtjb21tZW50OmUsZW5jbG9zaW5nTm9kZTp0LHByZWNlZGluZ05vZGU6bixmb2xsb3dpbmdOb2RlOnJ9KXtpZighciYmdCYmbil7aWYodC50eXBlPT09IkV4cHJlc3Npb25TdGF0ZW1lbnQiJiZ0LmV4cHJlc3Npb249PT1uKXJldHVybiBCZSh0LGUpLCEwO2xldCBzPW4udHlwZT09PSJTZXF1ZW5jZUV4cHJlc3Npb24iLGk9bi50eXBlPT09IkFzc2lnbm1lbnRFeHByZXNzaW9uIjtpZigoc3x8aSkmJih0LnR5cGU9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iJiZ0LmJvZHk9PT1ufHx0LnR5cGU9PT0iVmFyaWFibGVEZWNsYXJhdG9yIiYmdC5pbml0PT09bnx8dC50eXBlPT09IlJldHVyblN0YXRlbWVudCImJnQuYXJndW1lbnQ9PT1ufHx0LnR5cGU9PT0iQXNzaWdubWVudEV4cHJlc3Npb24iJiZ0LnJpZ2h0PT09bikpcmV0dXJuIEJlKHM/Y2UoMCxuLmV4cHJlc3Npb25zLC0xKTpuLnJpZ2h0LGUpLCEwfXJldHVybiExfWZ1bmN0aW9uIFhiKGUpe2xldHtmb2xsb3dpbmdOb2RlOnQsY29tbWVudDpufT1lO3JldHVybiBJYih0LGUpPyhaZSh0LnR5cGVzWzBdLG4pLCEwKTohMX12YXIgWWI9SyhbIkFycm93RnVuY3Rpb25FeHByZXNzaW9uIiwiRnVuY3Rpb25FeHByZXNzaW9uIiwiRnVuY3Rpb25EZWNsYXJhdGlvbiIsIk9iamVjdE1ldGhvZCIsIkNsYXNzTWV0aG9kIiwiVFNEZWNsYXJlRnVuY3Rpb24iLCJUU0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbiIsIlRTQ29uc3RydWN0U2lnbmF0dXJlRGVjbGFyYXRpb24iLCJUU01ldGhvZFNpZ25hdHVyZSIsIlRTQ29uc3RydWN0b3JUeXBlIiwiVFNGdW5jdGlvblR5cGUiLCJUU0RlY2xhcmVNZXRob2QiLCJIb29rRGVjbGFyYXRpb24iXSksTVQ9e2VuZE9mTGluZTpwVCxvd25MaW5lOmZULHJlbWFpbmluZzpoVH0sT1Q9TVQ7ZnVuY3Rpb24gUlQoZSx7cGFyc2VyOnR9KXtpZih0PT09ImZsb3cifHx0PT09Imhlcm1lcyJ8fHQ9PT0iYmFiZWwtZmxvdyIpcmV0dXJuIGU9ZnQoMCxlLC9bXHMoXS9nLCIiKSxlPT09IiJ8fGU9PT0iLyoifHxlPT09Ii8qOjoifXZhciBqVD1SVCx6PXtMZWFkaW5nOjIsVHJhaWxpbmc6NCxEYW5nbGluZzo4LEJsb2NrOjE2LExpbmU6MzIsUHJldHRpZXJJZ25vcmU6NjQsRmlyc3Q6MTI4LExhc3Q6MjU2fSxRYj0oZSx0KT0+e2lmKHR5cGVvZiBlPT0iZnVuY3Rpb24iJiYodD1lLGU9MCksZXx8dClyZXR1cm4obixyLHMpPT4hKGUmei5MZWFkaW5nJiYhbi5sZWFkaW5nfHxlJnouVHJhaWxpbmcmJiFuLnRyYWlsaW5nfHxlJnouRGFuZ2xpbmcmJihuLmxlYWRpbmd8fG4udHJhaWxpbmcpfHxlJnouQmxvY2smJiFIbihuKXx8ZSZ6LkxpbmUmJiFncyhuKXx8ZSZ6LkZpcnN0JiZyIT09MHx8ZSZ6Lkxhc3QmJnIhPT1zLmxlbmd0aC0xfHxlJnouUHJldHRpZXJJZ25vcmUmJiFlaShuKXx8dCYmIXQobikpfTtmdW5jdGlvbiBxKGUsdCxuKXtpZighU2UoZT09bnVsbD92b2lkIDA6ZS5jb21tZW50cykpcmV0dXJuITE7bGV0IHI9UWIodCxuKTtyZXR1cm4gcj9lLmNvbW1lbnRzLnNvbWUocik6ITB9ZnVuY3Rpb24gZW4oZSx0LG4pe2lmKCFBcnJheS5pc0FycmF5KGU9PW51bGw/dm9pZCAwOmUuY29tbWVudHMpKXJldHVybltdO2xldCByPVFiKHQsbik7cmV0dXJuIHI/ZS5jb21tZW50cy5maWx0ZXIocik6ZS5jb21tZW50c31mdW5jdGlvbiBwYyhlKXtyZXR1cm4oZT09bnVsbD92b2lkIDA6ZS5wcmV0dGllcklnbm9yZSl8fHEoZSx6LlByZXR0aWVySWdub3JlKX1mdW5jdGlvbiBaYihlKXtsZXR7bm9kZTp0fT1lO3JldHVybih0LnR5cGU9PT0iRnVuY3Rpb25FeHByZXNzaW9uInx8dC50eXBlPT09IkFycm93RnVuY3Rpb25FeHByZXNzaW9uIikmJihlLmtleT09PSJjYWxsZWUiJiZ2ZShlLnBhcmVudCl8fGUua2V5PT09InRhZyImJmUucGFyZW50LnR5cGU9PT0iVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uIil9dmFyIFZUPW5ldyBNYXAoW1sifD4iXSxbIj8/Il0sWyJ8fCJdLFsiJiYiXSxbInwiXSxbIl4iXSxbIiYiXSxbIj09IiwiPT09IiwiIT0iLCIhPT0iXSxbIjwiLCI+IiwiPD0iLCI+PSIsImluIiwiaW5zdGFuY2VvZiJdLFsiPj4iLCI8PCIsIj4+PiJdLFsiKyIsIi0iXSxbIioiLCIvIiwiJSJdLFsiKioiXV0uZmxhdE1hcCgoZSx0KT0+ZS5tYXAobj0+W24sdF0pKSk7ZnVuY3Rpb24gaGMoZSl7cmV0dXJuIFZULmdldChlKX12YXIgZUU9eyI9PSI6ITAsIiE9IjohMCwiPT09IjohMCwiIT09IjohMH0sZGM9eyIqIjohMCwiLyI6ITAsIiUiOiEwfSx5ZD17Ij4+IjohMCwiPj4+IjohMCwiPDwiOiEwfTtmdW5jdGlvbiBEZChlLHQpe3JldHVybiEoaGModCkhPT1oYyhlKXx8ZT09PSIqKiJ8fGVFW2VdJiZlRVt0XXx8dD09PSIlIiYmZGNbZV18fGU9PT0iJSImJmRjW3RdfHx0IT09ZSYmZGNbdF0mJmRjW2VdfHx5ZFtlXSYmeWRbdF0pfWZ1bmN0aW9uIFVUKGUpe3JldHVybiEheWRbZV18fGU9PT0ifCJ8fGU9PT0iXiJ8fGU9PT0iJiJ9ZnVuY3Rpb24gcVQoZSl7cmV0dXJuIGUudHlwZT09PSJMb2dpY2FsRXhwcmVzc2lvbiImJmUub3BlcmF0b3I9PT0iPz8ifWZ1bmN0aW9uIGt0KGUsdCl7c3dpdGNoKGUudHlwZSl7Y2FzZSJCaW5hcnlFeHByZXNzaW9uIjpjYXNlIkxvZ2ljYWxFeHByZXNzaW9uIjpjYXNlIkFzc2lnbm1lbnRFeHByZXNzaW9uIjpjYXNlIk5HUGlwZUV4cHJlc3Npb24iOnJldHVybiBrdChlLmxlZnQsdCk7Y2FzZSJNZW1iZXJFeHByZXNzaW9uIjpjYXNlIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbiI6cmV0dXJuIGt0KGUub2JqZWN0LHQpO2Nhc2UiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uIjpyZXR1cm4gZS50YWcudHlwZT09PSJGdW5jdGlvbkV4cHJlc3Npb24iPyExOmt0KGUudGFnLHQpO2Nhc2UiQ2FsbEV4cHJlc3Npb24iOmNhc2UiT3B0aW9uYWxDYWxsRXhwcmVzc2lvbiI6cmV0dXJuIGUuY2FsbGVlLnR5cGU9PT0iRnVuY3Rpb25FeHByZXNzaW9uIj8hMTprdChlLmNhbGxlZSx0KTtjYXNlIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiI6cmV0dXJuIGt0KGUudGVzdCx0KTtjYXNlIlVwZGF0ZUV4cHJlc3Npb24iOnJldHVybiFlLnByZWZpeCYma3QoZS5hcmd1bWVudCx0KTtjYXNlIkJpbmRFeHByZXNzaW9uIjpyZXR1cm4gZS5vYmplY3QmJmt0KGUub2JqZWN0LHQpO2Nhc2UiU2VxdWVuY2VFeHByZXNzaW9uIjpyZXR1cm4ga3QoZS5leHByZXNzaW9uc1swXSx0KTtjYXNlIkNoYWluRXhwcmVzc2lvbiI6Y2FzZSJUU05vbk51bGxFeHByZXNzaW9uIjpjYXNlIlRTU2F0aXNmaWVzRXhwcmVzc2lvbiI6Y2FzZSJUU0FzRXhwcmVzc2lvbiI6Y2FzZSJBc0V4cHJlc3Npb24iOmNhc2UiQXNDb25zdEV4cHJlc3Npb24iOmNhc2UiU2F0aXNmaWVzRXhwcmVzc2lvbiI6cmV0dXJuIGt0KGUuZXhwcmVzc2lvbix0KTtkZWZhdWx0OnJldHVybiB0KGUpfX1mdW5jdGlvbiBXVChlKXtsZXR7a2V5OnQscGFyZW50Om59PWU7cmV0dXJuIHQ9PT0iZXhwcmVzc2lvbiImJm4udHlwZT09PSJUU05vbk51bGxFeHByZXNzaW9uInx8dD09PSJvYmplY3QiJiZuLnR5cGU9PT0iTWVtYmVyRXhwcmVzc2lvbiImJiFuLm9wdGlvbmFsfHx0PT09ImNhbGxlZSImJm4udHlwZT09PSJDYWxsRXhwcmVzc2lvbiImJiFuLm9wdGlvbmFsfHx0PT09ImNhbGxlZSImJm4udHlwZT09PSJOZXdFeHByZXNzaW9uInx8dD09PSJ0YWciJiZuLnR5cGU9PT0iVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uIn12YXIgdEU9ZT0+e3ZhciB0O3JldHVybih0PWUuZXh0cmEpPT1udWxsP3ZvaWQgMDp0LnBhcmVudGhlc2l6ZWR9LEhUPUsoWyJPcHRpb25hbENhbGxFeHByZXNzaW9uIiwiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uIl0pO2Z1bmN0aW9uIEpUKGUpe2xldHtub2RlOnR9PWUsbj10O2Zvcig7bi50eXBlPT09IlRTTm9uTnVsbEV4cHJlc3Npb24iOylpZihuPW4uZXhwcmVzc2lvbix0RShuKSlyZXR1cm4hMTtyZXR1cm4gSFQobik/dEUodCk/ITA6IShlLmtleT09PSJleHByZXNzaW9uIiYmZS5wYXJlbnQudHlwZT09PSJUU05vbk51bGxFeHByZXNzaW9uIik6ITF9ZnVuY3Rpb24gelQoZSl7cmV0dXJuKGUubm9kZS50eXBlPT09IkNoYWluRXhwcmVzc2lvbiJ8fEpUKGUpKSYmV1QoZSl9ZnVuY3Rpb24gR1QoZSl7dmFyIHMsaTtsZXR7bm9kZTp0fT1lO2lmKHQudHlwZSE9PSJJZGVudGlmaWVyIilyZXR1cm4hMTtpZigocz10LmV4dHJhKSE9bnVsbCYmcy5wYXJlbnRoZXNpemVkJiYvXlBSRVRUSUVSX0hUTUxfUExBQ0VIT0xERVJfXGQrX1xkK19JTl9KUyQvLnRlc3QodC5uYW1lKSlyZXR1cm4hMDtsZXR7a2V5Om4scGFyZW50OnJ9PWU7aWYobj09PSJsZWZ0IiYmKHQubmFtZT09PSJhc3luYyImJiFyLmF3YWl0fHx0Lm5hbWU9PT0ibGV0IikmJnIudHlwZT09PSJGb3JPZlN0YXRlbWVudCIpcmV0dXJuITA7aWYodC5uYW1lPT09ImxldCIpe2xldCBvPShpPWUuZmluZEFuY2VzdG9yKGE9PmEudHlwZT09PSJGb3JPZlN0YXRlbWVudCJ8fGEudHlwZT09PSJGb3JJblN0YXRlbWVudCIpKT09bnVsbD92b2lkIDA6aS5sZWZ0O2lmKG8mJmt0KG8sYT0+YT09PXQpKXJldHVybiEwfWlmKG49PT0ib2JqZWN0IiYmdC5uYW1lPT09ImxldCImJnIudHlwZT09PSJNZW1iZXJFeHByZXNzaW9uIiYmci5jb21wdXRlZCYmIXIub3B0aW9uYWwpe2xldCBvPWUuZmluZEFuY2VzdG9yKHU9PnUudHlwZT09PSJFeHByZXNzaW9uU3RhdGVtZW50Inx8dS50eXBlPT09IkZvclN0YXRlbWVudCJ8fHUudHlwZT09PSJGb3JJblN0YXRlbWVudCIpLGE9bz9vLnR5cGU9PT0iRXhwcmVzc2lvblN0YXRlbWVudCI/by5leHByZXNzaW9uOm8udHlwZT09PSJGb3JTdGF0ZW1lbnQiP28uaW5pdDpvLmxlZnQ6dm9pZCAwO2lmKGEmJmt0KGEsdT0+dT09PXQpKXJldHVybiEwfWlmKG49PT0iZXhwcmVzc2lvbiIpc3dpdGNoKHQubmFtZSl7Y2FzZSJhd2FpdCI6Y2FzZSJpbnRlcmZhY2UiOmNhc2UibW9kdWxlIjpjYXNlInVzaW5nIjpjYXNlInlpZWxkIjpjYXNlImxldCI6Y2FzZSJjb21wb25lbnQiOmNhc2UiaG9vayI6Y2FzZSJ0eXBlIjp7bGV0IG89ZS5maW5kQW5jZXN0b3IoYT0+IXFuKGEpKTtpZihvIT09ciYmby50eXBlPT09IkV4cHJlc3Npb25TdGF0ZW1lbnQiKXJldHVybiEwfX1yZXR1cm4hMX1mdW5jdGlvbiBLVChlKXtyZXR1cm4gZSE9PW51bGwmJnR5cGVvZiBlPT0ib2JqZWN0In12YXIgbkU9S1Q7ZnVuY3Rpb24qWFQoZSx0KXtsZXR7Z2V0VmlzaXRvcktleXM6bixmaWx0ZXI6cj0oKT0+ITB9PXQscz1pPT5uRShpKSYmcihpKTtmb3IobGV0IGkgb2YgbihlKSl7bGV0IG89ZVtpXTtpZihBcnJheS5pc0FycmF5KG8pKWZvcihsZXQgYSBvZiBvKXMoYSkmJih5aWVsZCBhKTtlbHNlIHMobykmJih5aWVsZCBvKX19ZnVuY3Rpb24qWVQoZSx0KXtsZXQgbj1bZV07Zm9yKGxldCByPTA7cjxuLmxlbmd0aDtyKyspe2xldCBzPW5bcl07Zm9yKGxldCBpIG9mIFhUKHMsdCkpeWllbGQgaSxuLnB1c2goaSl9fWZ1bmN0aW9uIFFUKGUse2dldFZpc2l0b3JLZXlzOnQscHJlZGljYXRlOm59KXtmb3IobGV0IHIgb2YgWVQoZSx7Z2V0VmlzaXRvcktleXM6dH0pKWlmKG4ocikpcmV0dXJuITA7cmV0dXJuITF9dmFyIEhhPW51bGw7ZnVuY3Rpb24gSmEoZSl7aWYoSGEhPT1udWxsJiZ0eXBlb2YgSGEucHJvcGVydHkpe2xldCB0PUhhO3JldHVybiBIYT1KYS5wcm90b3R5cGU9bnVsbCx0fXJldHVybiBIYT1KYS5wcm90b3R5cGU9ZT8/T2JqZWN0LmNyZWF0ZShudWxsKSxuZXcgSmF9dmFyIFpUPTEwO2ZvcihsZXQgZT0wO2U8PVpUO2UrKylKYSgpO2Z1bmN0aW9uIGU1KGUpe3JldHVybiBKYShlKX1mdW5jdGlvbiB0NShlLHQ9InR5cGUiKXtlNShlKTtmdW5jdGlvbiBuKHIpe2xldCBzPXJbdF0saT1lW3NdO2lmKCFBcnJheS5pc0FycmF5KGkpKXRocm93IE9iamVjdC5hc3NpZ24obmV3IEVycm9yKGBNaXNzaW5nIHZpc2l0b3Iga2V5cyBmb3IgJyR7c30nLmApLHtub2RlOnJ9KTtyZXR1cm4gaX1yZXR1cm4gbn12YXIgckU9dDUsJD1bWyJlbGVtZW50cyJdLFsibGVmdCIsInJpZ2h0Il0sWyJ2YWx1ZSJdLFsiZGlyZWN0aXZlcyIsImJvZHkiXSxbImxhYmVsIl0sWyJjYWxsZWUiLCJ0eXBlQXJndW1lbnRzIiwiYXJndW1lbnRzIl0sWyJ0ZXN0IiwiY29uc2VxdWVudCIsImFsdGVybmF0ZSJdLFsiYm9keSIsInRlc3QiXSxbImV4cHJlc3Npb24iXSxbImxlZnQiLCJyaWdodCIsImJvZHkiXSxbImlkIiwidHlwZVBhcmFtZXRlcnMiLCJwYXJhbXMiLCJwcmVkaWNhdGUiLCJyZXR1cm5UeXBlIiwiYm9keSJdLFsib2JqZWN0IiwicHJvcGVydHkiXSxbInByb3BlcnRpZXMiXSxbImRlY29yYXRvcnMiLCJrZXkiLCJ0eXBlUGFyYW1ldGVycyIsInBhcmFtcyIsInJldHVyblR5cGUiLCJib2R5Il0sWyJkZWNvcmF0b3JzIiwia2V5IiwidmFsdWUiXSxbImFyZ3VtZW50Il0sWyJleHByZXNzaW9ucyJdLFsiaWQiLCJpbml0Il0sWyJib2R5Il0sWyJkZWNvcmF0b3JzIiwiaWQiLCJ0eXBlUGFyYW1ldGVycyIsInN1cGVyQ2xhc3MiLCJzdXBlclR5cGVBcmd1bWVudHMiLCJtaXhpbnMiLCJpbXBsZW1lbnRzIiwiYm9keSJdLFsiZGVjbGFyYXRpb24iLCJzcGVjaWZpZXJzIiwic291cmNlIiwiYXR0cmlidXRlcyJdLFsibG9jYWwiXSxbImV4cG9ydGVkIl0sWyJkZWNvcmF0b3JzIiwidmFyaWFuY2UiLCJrZXkiLCJ0eXBlQW5ub3RhdGlvbiIsInZhbHVlIl0sWyJpZCJdLFsia2V5IiwidmFsdWUiXSxbImVsZW1lbnRUeXBlIl0sWyJpZCIsInR5cGVQYXJhbWV0ZXJzIl0sWyJpZCIsInR5cGVQYXJhbWV0ZXJzIiwiZXh0ZW5kcyIsImJvZHkiXSxbImlkIiwiYm9keSJdLFsidHlwZUFubm90YXRpb24iXSxbImlkIiwidHlwZVBhcmFtZXRlcnMiLCJyaWdodCJdLFsibmFtZSIsInR5cGVBbm5vdGF0aW9uIl0sWyJ0eXBlcyJdLFsicXVhbGlmaWNhdGlvbiIsImlkIl0sWyJlbGVtZW50VHlwZXMiXSxbImV4cHJlc3Npb24iLCJ0eXBlQW5ub3RhdGlvbiJdLFsicGFyYW1zIl0sWyJtZW1iZXJzIl0sWyJvYmplY3RUeXBlIiwiaW5kZXhUeXBlIl0sWyJkZWNvcmF0b3JzIiwia2V5IiwidHlwZUFubm90YXRpb24iLCJ2YWx1ZSJdLFsiaWQiLCJ0eXBlUGFyYW1ldGVycyIsInBhcmFtcyIsInJldHVyblR5cGUiLCJib2R5Il0sWyJrZXkiLCJ0eXBlUGFyYW1ldGVycyIsInBhcmFtcyIsInJldHVyblR5cGUiXSxbInR5cGVQYXJhbWV0ZXJzIiwicGFyYW1zIiwicmV0dXJuVHlwZSJdLFsicGFyYW1ldGVyTmFtZSIsInR5cGVBbm5vdGF0aW9uIl0sWyJjaGVja1R5cGUiLCJleHRlbmRzVHlwZSIsInRydWVUeXBlIiwiZmFsc2VUeXBlIl0sWyJ0eXBlUGFyYW1ldGVyIl0sWyJsaXRlcmFsIl0sWyJleHByZXNzaW9uIiwidHlwZUFyZ3VtZW50cyJdLFsiZGVjb3JhdG9ycyIsImtleSIsInR5cGVBbm5vdGF0aW9uIl0sWyJhcmd1bWVudCIsImNhc2VzIl0sWyJwYXR0ZXJuIiwiYm9keSIsImd1YXJkIl0sWyJwcm9wZXJ0aWVzIiwicmVzdCJdLFsibm9kZSJdXSxuNT17QXJyYXlFeHByZXNzaW9uOiRbMF0sQXNzaWdubWVudEV4cHJlc3Npb246JFsxXSxCaW5hcnlFeHByZXNzaW9uOiRbMV0sSW50ZXJwcmV0ZXJEaXJlY3RpdmU6W10sRGlyZWN0aXZlOiRbMl0sRGlyZWN0aXZlTGl0ZXJhbDpbXSxCbG9ja1N0YXRlbWVudDokWzNdLEJyZWFrU3RhdGVtZW50OiRbNF0sQ2FsbEV4cHJlc3Npb246JFs1XSxDYXRjaENsYXVzZTpbInBhcmFtIiwiYm9keSJdLENvbmRpdGlvbmFsRXhwcmVzc2lvbjokWzZdLENvbnRpbnVlU3RhdGVtZW50OiRbNF0sRGVidWdnZXJTdGF0ZW1lbnQ6W10sRG9XaGlsZVN0YXRlbWVudDokWzddLEVtcHR5U3RhdGVtZW50OltdLEV4cHJlc3Npb25TdGF0ZW1lbnQ6JFs4XSxGaWxlOlsicHJvZ3JhbSJdLEZvckluU3RhdGVtZW50OiRbOV0sRm9yU3RhdGVtZW50OlsiaW5pdCIsInRlc3QiLCJ1cGRhdGUiLCJib2R5Il0sRnVuY3Rpb25EZWNsYXJhdGlvbjokWzEwXSxGdW5jdGlvbkV4cHJlc3Npb246JFsxMF0sSWRlbnRpZmllcjpbInR5cGVBbm5vdGF0aW9uIiwiZGVjb3JhdG9ycyJdLElmU3RhdGVtZW50OiRbNl0sTGFiZWxlZFN0YXRlbWVudDpbImxhYmVsIiwiYm9keSJdLFN0cmluZ0xpdGVyYWw6W10sTnVtZXJpY0xpdGVyYWw6W10sTnVsbExpdGVyYWw6W10sQm9vbGVhbkxpdGVyYWw6W10sUmVnRXhwTGl0ZXJhbDpbXSxMb2dpY2FsRXhwcmVzc2lvbjokWzFdLE1lbWJlckV4cHJlc3Npb246JFsxMV0sTmV3RXhwcmVzc2lvbjokWzVdLFByb2dyYW06JFszXSxPYmplY3RFeHByZXNzaW9uOiRbMTJdLE9iamVjdE1ldGhvZDokWzEzXSxPYmplY3RQcm9wZXJ0eTokWzE0XSxSZXN0RWxlbWVudDpbImFyZ3VtZW50IiwidHlwZUFubm90YXRpb24iLCJkZWNvcmF0b3JzIl0sUmV0dXJuU3RhdGVtZW50OiRbMTVdLFNlcXVlbmNlRXhwcmVzc2lvbjokWzE2XSxQYXJlbnRoZXNpemVkRXhwcmVzc2lvbjokWzhdLFN3aXRjaENhc2U6WyJ0ZXN0IiwiY29uc2VxdWVudCJdLFN3aXRjaFN0YXRlbWVudDpbImRpc2NyaW1pbmFudCIsImNhc2VzIl0sVGhpc0V4cHJlc3Npb246W10sVGhyb3dTdGF0ZW1lbnQ6JFsxNV0sVHJ5U3RhdGVtZW50OlsiYmxvY2siLCJoYW5kbGVyIiwiZmluYWxpemVyIl0sVW5hcnlFeHByZXNzaW9uOiRbMTVdLFVwZGF0ZUV4cHJlc3Npb246JFsxNV0sVmFyaWFibGVEZWNsYXJhdGlvbjpbImRlY2xhcmF0aW9ucyJdLFZhcmlhYmxlRGVjbGFyYXRvcjokWzE3XSxXaGlsZVN0YXRlbWVudDokWzddLFdpdGhTdGF0ZW1lbnQ6WyJvYmplY3QiLCJib2R5Il0sQXNzaWdubWVudFBhdHRlcm46WyJsZWZ0IiwicmlnaHQiLCJkZWNvcmF0b3JzIiwidHlwZUFubm90YXRpb24iXSxBcnJheVBhdHRlcm46WyJlbGVtZW50cyIsInR5cGVBbm5vdGF0aW9uIiwiZGVjb3JhdG9ycyJdLEFycm93RnVuY3Rpb25FeHByZXNzaW9uOlsidHlwZVBhcmFtZXRlcnMiLCJwYXJhbXMiLCJwcmVkaWNhdGUiLCJyZXR1cm5UeXBlIiwiYm9keSJdLENsYXNzQm9keTokWzE4XSxDbGFzc0V4cHJlc3Npb246JFsxOV0sQ2xhc3NEZWNsYXJhdGlvbjokWzE5XSxFeHBvcnRBbGxEZWNsYXJhdGlvbjpbInNvdXJjZSIsImF0dHJpYnV0ZXMiLCJleHBvcnRlZCJdLEV4cG9ydERlZmF1bHREZWNsYXJhdGlvbjpbImRlY2xhcmF0aW9uIl0sRXhwb3J0TmFtZWREZWNsYXJhdGlvbjokWzIwXSxFeHBvcnRTcGVjaWZpZXI6WyJsb2NhbCIsImV4cG9ydGVkIl0sRm9yT2ZTdGF0ZW1lbnQ6JFs5XSxJbXBvcnREZWNsYXJhdGlvbjpbInNwZWNpZmllcnMiLCJzb3VyY2UiLCJhdHRyaWJ1dGVzIl0sSW1wb3J0RGVmYXVsdFNwZWNpZmllcjokWzIxXSxJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXI6JFsyMV0sSW1wb3J0U3BlY2lmaWVyOlsiaW1wb3J0ZWQiLCJsb2NhbCJdLE1ldGFQcm9wZXJ0eTpbIm1ldGEiLCJwcm9wZXJ0eSJdLENsYXNzTWV0aG9kOiRbMTNdLE9iamVjdFBhdHRlcm46WyJkZWNvcmF0b3JzIiwicHJvcGVydGllcyIsInR5cGVBbm5vdGF0aW9uIl0sU3ByZWFkRWxlbWVudDokWzE1XSxTdXBlcjpbXSxUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb246WyJ0YWciLCJ0eXBlQXJndW1lbnRzIiwicXVhc2kiXSxUZW1wbGF0ZUVsZW1lbnQ6W10sVGVtcGxhdGVMaXRlcmFsOlsicXVhc2lzIiwiZXhwcmVzc2lvbnMiXSxZaWVsZEV4cHJlc3Npb246JFsxNV0sQXdhaXRFeHByZXNzaW9uOiRbMTVdLEltcG9ydEV4cHJlc3Npb246WyJzb3VyY2UiLCJvcHRpb25zIl0sQmlnSW50TGl0ZXJhbDpbXSxFeHBvcnROYW1lc3BhY2VTcGVjaWZpZXI6JFsyMl0sT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uOiRbMTFdLE9wdGlvbmFsQ2FsbEV4cHJlc3Npb246JFs1XSxDbGFzc1Byb3BlcnR5OiRbMjNdLENsYXNzUHJpdmF0ZVByb3BlcnR5OiRbMjNdLENsYXNzUHJpdmF0ZU1ldGhvZDokWzEzXSxQcml2YXRlTmFtZTokWzI0XSxTdGF0aWNCbG9jazokWzE4XSxJbXBvcnRBdHRyaWJ1dGU6JFsyNV0sQW55VHlwZUFubm90YXRpb246W10sQXJyYXlUeXBlQW5ub3RhdGlvbjokWzI2XSxCb29sZWFuVHlwZUFubm90YXRpb246W10sQm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvbjpbXSxOdWxsTGl0ZXJhbFR5cGVBbm5vdGF0aW9uOltdLENsYXNzSW1wbGVtZW50czokWzI3XSxEZWNsYXJlQ2xhc3M6WyJpZCIsInR5cGVQYXJhbWV0ZXJzIiwiZXh0ZW5kcyIsIm1peGlucyIsImltcGxlbWVudHMiLCJib2R5Il0sRGVjbGFyZUZ1bmN0aW9uOlsiaWQiLCJwcmVkaWNhdGUiXSxEZWNsYXJlSW50ZXJmYWNlOiRbMjhdLERlY2xhcmVNb2R1bGU6JFsyOV0sRGVjbGFyZU1vZHVsZUV4cG9ydHM6JFszMF0sRGVjbGFyZVR5cGVBbGlhczokWzMxXSxEZWNsYXJlT3BhcXVlVHlwZTpbImlkIiwidHlwZVBhcmFtZXRlcnMiLCJzdXBlcnR5cGUiLCJsb3dlckJvdW5kIiwidXBwZXJCb3VuZCJdLERlY2xhcmVWYXJpYWJsZTpbImlkIiwiZGVjbGFyYXRpb25zIl0sRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uOiRbMjBdLERlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvbjpbInNvdXJjZSIsImF0dHJpYnV0ZXMiXSxEZWNsYXJlZFByZWRpY2F0ZTokWzJdLEV4aXN0c1R5cGVBbm5vdGF0aW9uOltdLEZ1bmN0aW9uVHlwZUFubm90YXRpb246WyJ0eXBlUGFyYW1ldGVycyIsInRoaXMiLCJwYXJhbXMiLCJyZXN0IiwicmV0dXJuVHlwZSJdLEZ1bmN0aW9uVHlwZVBhcmFtOiRbMzJdLEdlbmVyaWNUeXBlQW5ub3RhdGlvbjokWzI3XSxJbmZlcnJlZFByZWRpY2F0ZTpbXSxJbnRlcmZhY2VFeHRlbmRzOiRbMjddLEludGVyZmFjZURlY2xhcmF0aW9uOiRbMjhdLEludGVyZmFjZVR5cGVBbm5vdGF0aW9uOlsiZXh0ZW5kcyIsImJvZHkiXSxJbnRlcnNlY3Rpb25UeXBlQW5ub3RhdGlvbjokWzMzXSxNaXhlZFR5cGVBbm5vdGF0aW9uOltdLEVtcHR5VHlwZUFubm90YXRpb246W10sTnVsbGFibGVUeXBlQW5ub3RhdGlvbjokWzMwXSxOdW1iZXJMaXRlcmFsVHlwZUFubm90YXRpb246W10sQmlnSW50TGl0ZXJhbFR5cGVBbm5vdGF0aW9uOltdLE51bWJlclR5cGVBbm5vdGF0aW9uOltdLE9iamVjdFR5cGVBbm5vdGF0aW9uOlsicHJvcGVydGllcyIsImluZGV4ZXJzIiwiY2FsbFByb3BlcnRpZXMiLCJpbnRlcm5hbFNsb3RzIl0sT2JqZWN0VHlwZUludGVybmFsU2xvdDpbImlkIiwidmFsdWUiXSxPYmplY3RUeXBlQ2FsbFByb3BlcnR5OiRbMl0sT2JqZWN0VHlwZUluZGV4ZXI6WyJ2YXJpYW5jZSIsImlkIiwia2V5IiwidmFsdWUiXSxPYmplY3RUeXBlUHJvcGVydHk6WyJrZXkiLCJ2YWx1ZSIsInZhcmlhbmNlIl0sT2JqZWN0VHlwZVNwcmVhZFByb3BlcnR5OiRbMTVdLE9wYXF1ZVR5cGU6WyJpZCIsInR5cGVQYXJhbWV0ZXJzIiwic3VwZXJ0eXBlIiwiaW1wbHR5cGUiLCJsb3dlckJvdW5kIiwidXBwZXJCb3VuZCJdLFF1YWxpZmllZFR5cGVJZGVudGlmaWVyOiRbMzRdLFN0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvbjpbXSxTdHJpbmdUeXBlQW5ub3RhdGlvbjpbXSxTeW1ib2xUeXBlQW5ub3RhdGlvbjpbXSxUaGlzVHlwZUFubm90YXRpb246W10sVHVwbGVUeXBlQW5ub3RhdGlvbjokWzM1XSxUeXBlb2ZUeXBlQW5ub3RhdGlvbjpbImFyZ3VtZW50IiwidHlwZUFyZ3VtZW50cyJdLFR5cGVBbGlhczokWzMxXSxUeXBlQW5ub3RhdGlvbjokWzMwXSxUeXBlQ2FzdEV4cHJlc3Npb246JFszNl0sVHlwZVBhcmFtZXRlcjpbImJvdW5kIiwiZGVmYXVsdCIsInZhcmlhbmNlIl0sVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOiRbMzddLFR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uOiRbMzddLFVuaW9uVHlwZUFubm90YXRpb246JFszM10sVmFyaWFuY2U6W10sVm9pZFR5cGVBbm5vdGF0aW9uOltdLEVudW1EZWNsYXJhdGlvbjokWzI5XSxFbnVtQm9vbGVhbkJvZHk6JFszOF0sRW51bU51bWJlckJvZHk6JFszOF0sRW51bVN0cmluZ0JvZHk6JFszOF0sRW51bVN5bWJvbEJvZHk6JFszOF0sRW51bUJvb2xlYW5NZW1iZXI6JFsxN10sRW51bU51bWJlck1lbWJlcjokWzE3XSxFbnVtU3RyaW5nTWVtYmVyOiRbMTddLEVudW1EZWZhdWx0ZWRNZW1iZXI6JFsyNF0sSW5kZXhlZEFjY2Vzc1R5cGU6JFszOV0sT3B0aW9uYWxJbmRleGVkQWNjZXNzVHlwZTokWzM5XSxKU1hBdHRyaWJ1dGU6WyJuYW1lIiwidmFsdWUiXSxKU1hDbG9zaW5nRWxlbWVudDpbIm5hbWUiXSxKU1hFbGVtZW50Olsib3BlbmluZ0VsZW1lbnQiLCJjaGlsZHJlbiIsImNsb3NpbmdFbGVtZW50Il0sSlNYRW1wdHlFeHByZXNzaW9uOltdLEpTWEV4cHJlc3Npb25Db250YWluZXI6JFs4XSxKU1hTcHJlYWRDaGlsZDokWzhdLEpTWElkZW50aWZpZXI6W10sSlNYTWVtYmVyRXhwcmVzc2lvbjokWzExXSxKU1hOYW1lc3BhY2VkTmFtZTpbIm5hbWVzcGFjZSIsIm5hbWUiXSxKU1hPcGVuaW5nRWxlbWVudDpbIm5hbWUiLCJ0eXBlQXJndW1lbnRzIiwiYXR0cmlidXRlcyJdLEpTWFNwcmVhZEF0dHJpYnV0ZTokWzE1XSxKU1hUZXh0OltdLEpTWEZyYWdtZW50Olsib3BlbmluZ0ZyYWdtZW50IiwiY2hpbGRyZW4iLCJjbG9zaW5nRnJhZ21lbnQiXSxKU1hPcGVuaW5nRnJhZ21lbnQ6W10sSlNYQ2xvc2luZ0ZyYWdtZW50OltdLFBsYWNlaG9sZGVyOltdLFY4SW50cmluc2ljSWRlbnRpZmllcjpbXSxBcmd1bWVudFBsYWNlaG9sZGVyOltdLEJpbmRFeHByZXNzaW9uOlsib2JqZWN0IiwiY2FsbGVlIl0sQ2xhc3NBY2Nlc3NvclByb3BlcnR5OiRbNDBdLERlY29yYXRvcjokWzhdLERvRXhwcmVzc2lvbjokWzE4XSxFeHBvcnREZWZhdWx0U3BlY2lmaWVyOiRbMjJdLE1vZHVsZUV4cHJlc3Npb246JFsxOF0sVG9waWNSZWZlcmVuY2U6W10sVm9pZFBhdHRlcm46W10sVFNQYXJhbWV0ZXJQcm9wZXJ0eTpbInBhcmFtZXRlciIsImRlY29yYXRvcnMiXSxUU0RlY2xhcmVGdW5jdGlvbjokWzQxXSxUU0RlY2xhcmVNZXRob2Q6JFs0Ml0sVFNRdWFsaWZpZWROYW1lOiRbMV0sVFNDYWxsU2lnbmF0dXJlRGVjbGFyYXRpb246JFs0M10sVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbjokWzQzXSxUU1Byb3BlcnR5U2lnbmF0dXJlOlsia2V5IiwidHlwZUFubm90YXRpb24iXSxUU01ldGhvZFNpZ25hdHVyZTokWzQyXSxUU0luZGV4U2lnbmF0dXJlOlsicGFyYW1ldGVycyIsInR5cGVBbm5vdGF0aW9uIl0sVFNBbnlLZXl3b3JkOltdLFRTQm9vbGVhbktleXdvcmQ6W10sVFNCaWdJbnRLZXl3b3JkOltdLFRTSW50cmluc2ljS2V5d29yZDpbXSxUU05ldmVyS2V5d29yZDpbXSxUU051bGxLZXl3b3JkOltdLFRTTnVtYmVyS2V5d29yZDpbXSxUU09iamVjdEtleXdvcmQ6W10sVFNTdHJpbmdLZXl3b3JkOltdLFRTU3ltYm9sS2V5d29yZDpbXSxUU1VuZGVmaW5lZEtleXdvcmQ6W10sVFNVbmtub3duS2V5d29yZDpbXSxUU1ZvaWRLZXl3b3JkOltdLFRTVGhpc1R5cGU6W10sVFNGdW5jdGlvblR5cGU6JFs0M10sVFNDb25zdHJ1Y3RvclR5cGU6JFs0M10sVFNUeXBlUmVmZXJlbmNlOlsidHlwZU5hbWUiLCJ0eXBlQXJndW1lbnRzIl0sVFNUeXBlUHJlZGljYXRlOiRbNDRdLFRTVHlwZVF1ZXJ5OlsiZXhwck5hbWUiLCJ0eXBlQXJndW1lbnRzIl0sVFNUeXBlTGl0ZXJhbDokWzM4XSxUU0FycmF5VHlwZTokWzI2XSxUU1R1cGxlVHlwZTokWzM1XSxUU09wdGlvbmFsVHlwZTokWzMwXSxUU1Jlc3RUeXBlOiRbMzBdLFRTTmFtZWRUdXBsZU1lbWJlcjpbImxhYmVsIiwiZWxlbWVudFR5cGUiXSxUU1VuaW9uVHlwZTokWzMzXSxUU0ludGVyc2VjdGlvblR5cGU6JFszM10sVFNDb25kaXRpb25hbFR5cGU6JFs0NV0sVFNJbmZlclR5cGU6JFs0Nl0sVFNQYXJlbnRoZXNpemVkVHlwZTokWzMwXSxUU1R5cGVPcGVyYXRvcjokWzMwXSxUU0luZGV4ZWRBY2Nlc3NUeXBlOiRbMzldLFRTTWFwcGVkVHlwZTpbImtleSIsImNvbnN0cmFpbnQiLCJuYW1lVHlwZSIsInR5cGVBbm5vdGF0aW9uIl0sVFNUZW1wbGF0ZUxpdGVyYWxUeXBlOlsicXVhc2lzIiwidHlwZXMiXSxUU0xpdGVyYWxUeXBlOiRbNDddLFRTQ2xhc3NJbXBsZW1lbnRzOiRbNDhdLFRTSW50ZXJmYWNlSGVyaXRhZ2U6JFs0OF0sVFNJbnRlcmZhY2VEZWNsYXJhdGlvbjokWzI4XSxUU0ludGVyZmFjZUJvZHk6JFsxOF0sVFNUeXBlQWxpYXNEZWNsYXJhdGlvbjpbImlkIiwidHlwZVBhcmFtZXRlcnMiLCJ0eXBlQW5ub3RhdGlvbiJdLFRTSW5zdGFudGlhdGlvbkV4cHJlc3Npb246JFs0OF0sVFNBc0V4cHJlc3Npb246JFszNl0sVFNTYXRpc2ZpZXNFeHByZXNzaW9uOiRbMzZdLFRTVHlwZUFzc2VydGlvbjokWzM2XSxUU0VudW1Cb2R5OiRbMzhdLFRTRW51bURlY2xhcmF0aW9uOiRbMjldLFRTRW51bU1lbWJlcjpbImlkIiwiaW5pdGlhbGl6ZXIiXSxUU01vZHVsZURlY2xhcmF0aW9uOiRbMjldLFRTTW9kdWxlQmxvY2s6JFsxOF0sVFNJbXBvcnRUeXBlOlsic291cmNlIiwib3B0aW9ucyIsInF1YWxpZmllciIsInR5cGVBcmd1bWVudHMiXSxUU0ltcG9ydEVxdWFsc0RlY2xhcmF0aW9uOlsiaWQiLCJtb2R1bGVSZWZlcmVuY2UiXSxUU0V4dGVybmFsTW9kdWxlUmVmZXJlbmNlOiRbOF0sVFNOb25OdWxsRXhwcmVzc2lvbjokWzhdLFRTRXhwb3J0QXNzaWdubWVudDokWzhdLFRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb246JFsyNF0sVFNUeXBlQW5ub3RhdGlvbjokWzMwXSxUU1R5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uOiRbMzddLFRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uOiRbMzddLFRTVHlwZVBhcmFtZXRlcjpbIm5hbWUiLCJjb25zdHJhaW50IiwiZGVmYXVsdCJdLENoYWluRXhwcmVzc2lvbjokWzhdLExpdGVyYWw6W10sTWV0aG9kRGVmaW5pdGlvbjokWzE0XSxQcml2YXRlSWRlbnRpZmllcjpbXSxQcm9wZXJ0eTokWzI1XSxQcm9wZXJ0eURlZmluaXRpb246JFsyM10sQWNjZXNzb3JQcm9wZXJ0eTokWzQwXSxUU0Fic3RyYWN0QWNjZXNzb3JQcm9wZXJ0eTokWzQ5XSxUU0Fic3RyYWN0S2V5d29yZDpbXSxUU0Fic3RyYWN0TWV0aG9kRGVmaW5pdGlvbjokWzI1XSxUU0Fic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uOiRbNDldLFRTQXN5bmNLZXl3b3JkOltdLFRTRGVjbGFyZUtleXdvcmQ6W10sVFNFbXB0eUJvZHlGdW5jdGlvbkV4cHJlc3Npb246WyJpZCIsInR5cGVQYXJhbWV0ZXJzIiwicGFyYW1zIiwicmV0dXJuVHlwZSJdLFRTRXhwb3J0S2V5d29yZDpbXSxUU1ByaXZhdGVLZXl3b3JkOltdLFRTUHJvdGVjdGVkS2V5d29yZDpbXSxUU1B1YmxpY0tleXdvcmQ6W10sVFNSZWFkb25seUtleXdvcmQ6W10sVFNTdGF0aWNLZXl3b3JkOltdLEFzQ29uc3RFeHByZXNzaW9uOiRbOF0sQXNFeHByZXNzaW9uOiRbMzZdLEJpZ0ludFR5cGVBbm5vdGF0aW9uOltdLENvbXBvbmVudERlY2xhcmF0aW9uOlsiaWQiLCJwYXJhbXMiLCJib2R5IiwidHlwZVBhcmFtZXRlcnMiLCJyZW5kZXJzVHlwZSJdLENvbXBvbmVudFBhcmFtZXRlcjpbIm5hbWUiLCJsb2NhbCJdLENvbXBvbmVudFR5cGVBbm5vdGF0aW9uOlsicGFyYW1zIiwicmVzdCIsInR5cGVQYXJhbWV0ZXJzIiwicmVuZGVyc1R5cGUiXSxDb21wb25lbnRUeXBlUGFyYW1ldGVyOiRbMzJdLENvbmRpdGlvbmFsVHlwZUFubm90YXRpb246JFs0NV0sRGVjbGFyZUNvbXBvbmVudDpbImlkIiwicGFyYW1zIiwicmVzdCIsInR5cGVQYXJhbWV0ZXJzIiwicmVuZGVyc1R5cGUiXSxEZWNsYXJlRW51bTokWzI5XSxEZWNsYXJlSG9vazokWzI0XSxEZWNsYXJlTmFtZXNwYWNlOiRbMjldLEVudW1CaWdJbnRCb2R5OiRbMzhdLEVudW1CaWdJbnRNZW1iZXI6JFsxN10sRW51bUJvZHk6JFszOF0sSG9va0RlY2xhcmF0aW9uOiRbNDFdLEhvb2tUeXBlQW5ub3RhdGlvbjpbInBhcmFtcyIsInJldHVyblR5cGUiLCJyZXN0IiwidHlwZVBhcmFtZXRlcnMiXSxJbmZlclR5cGVBbm5vdGF0aW9uOiRbNDZdLEtleW9mVHlwZUFubm90YXRpb246JFsxNV0sTWF0Y2hBcnJheVBhdHRlcm46WyJlbGVtZW50cyIsInJlc3QiXSxNYXRjaEFzUGF0dGVybjpbInBhdHRlcm4iLCJ0YXJnZXQiXSxNYXRjaEJpbmRpbmdQYXR0ZXJuOiRbMjRdLE1hdGNoRXhwcmVzc2lvbjokWzUwXSxNYXRjaEV4cHJlc3Npb25DYXNlOiRbNTFdLE1hdGNoSWRlbnRpZmllclBhdHRlcm46JFsyNF0sTWF0Y2hJbnN0YW5jZU9iamVjdFBhdHRlcm46JFs1Ml0sTWF0Y2hJbnN0YW5jZVBhdHRlcm46WyJ0YXJnZXRDb25zdHJ1Y3RvciIsInByb3BlcnRpZXMiXSxNYXRjaExpdGVyYWxQYXR0ZXJuOiRbNDddLE1hdGNoTWVtYmVyUGF0dGVybjpbImJhc2UiLCJwcm9wZXJ0eSJdLE1hdGNoT2JqZWN0UGF0dGVybjokWzUyXSxNYXRjaE9iamVjdFBhdHRlcm5Qcm9wZXJ0eTpbImtleSIsInBhdHRlcm4iXSxNYXRjaE9yUGF0dGVybjpbInBhdHRlcm5zIl0sTWF0Y2hSZXN0UGF0dGVybjokWzE1XSxNYXRjaFN0YXRlbWVudDokWzUwXSxNYXRjaFN0YXRlbWVudENhc2U6JFs1MV0sTWF0Y2hVbmFyeVBhdHRlcm46JFsxNV0sTWF0Y2hXaWxkY2FyZFBhdHRlcm46W10sTmV2ZXJUeXBlQW5ub3RhdGlvbjpbXSxPYmplY3RUeXBlTWFwcGVkVHlwZVByb3BlcnR5Olsia2V5VHBhcmFtIiwicHJvcFR5cGUiLCJzb3VyY2VUeXBlIiwidmFyaWFuY2UiXSxRdWFsaWZpZWRUeXBlb2ZJZGVudGlmaWVyOiRbMzRdLFJlY29yZERlY2xhcmF0aW9uOlsiaWQiLCJ0eXBlUGFyYW1ldGVycyIsImltcGxlbWVudHMiLCJib2R5Il0sUmVjb3JkRGVjbGFyYXRpb25Cb2R5OiRbMF0sUmVjb3JkRGVjbGFyYXRpb25JbXBsZW1lbnRzOlsiaWQiLCJ0eXBlQXJndW1lbnRzIl0sUmVjb3JkRGVjbGFyYXRpb25Qcm9wZXJ0eTpbImtleSIsInR5cGVBbm5vdGF0aW9uIiwiZGVmYXVsdFZhbHVlIl0sUmVjb3JkRGVjbGFyYXRpb25TdGF0aWNQcm9wZXJ0eTpbImtleSIsInR5cGVBbm5vdGF0aW9uIiwidmFsdWUiXSxSZWNvcmRFeHByZXNzaW9uOlsicmVjb3JkQ29uc3RydWN0b3IiLCJ0eXBlQXJndW1lbnRzIiwicHJvcGVydGllcyJdLFJlY29yZEV4cHJlc3Npb25Qcm9wZXJ0aWVzOiRbMTJdLFNhdGlzZmllc0V4cHJlc3Npb246JFszNl0sVHVwbGVUeXBlTGFiZWxlZEVsZW1lbnQ6WyJsYWJlbCIsImVsZW1lbnRUeXBlIiwidmFyaWFuY2UiXSxUdXBsZVR5cGVTcHJlYWRFbGVtZW50OlsibGFiZWwiLCJ0eXBlQW5ub3RhdGlvbiJdLFR5cGVPcGVyYXRvcjokWzMwXSxUeXBlUHJlZGljYXRlOiRbNDRdLFVuZGVmaW5lZFR5cGVBbm5vdGF0aW9uOltdLFVua25vd25UeXBlQW5ub3RhdGlvbjpbXSxOR0NoYWluZWRFeHByZXNzaW9uOiRbMTZdLE5HRW1wdHlFeHByZXNzaW9uOltdLE5HUGlwZUV4cHJlc3Npb246WyJsZWZ0IiwicmlnaHQiLCJhcmd1bWVudHMiXSxOR01pY3Jvc3ludGF4OiRbMThdLE5HTWljcm9zeW50YXhBczpbImtleSIsImFsaWFzIl0sTkdNaWNyb3N5bnRheEV4cHJlc3Npb246WyJleHByZXNzaW9uIiwiYWxpYXMiXSxOR01pY3Jvc3ludGF4S2V5OltdLE5HTWljcm9zeW50YXhLZXllZEV4cHJlc3Npb246WyJrZXkiLCJleHByZXNzaW9uIl0sTkdNaWNyb3N5bnRheExldDokWzI1XSxOR1Jvb3Q6JFs1M10sSnNFeHByZXNzaW9uUm9vdDokWzUzXSxKc29uUm9vdDokWzUzXSxUU0pTRG9jQWxsVHlwZTpbXSxUU0pTRG9jVW5rbm93blR5cGU6W10sVFNKU0RvY051bGxhYmxlVHlwZTokWzMwXSxUU0pTRG9jTm9uTnVsbGFibGVUeXBlOiRbMzBdfSxyNT1yRShuNSksc0U9cjU7ZnVuY3Rpb24gYmQoZSx0KXtyZXR1cm4gdChlKXx8UVQoZSx7Z2V0VmlzaXRvcktleXM6c0UscHJlZGljYXRlOnR9KX1mdW5jdGlvbiBFZChlKXtyZXR1cm4gZS50eXBlPT09IkFzc2lnbm1lbnRFeHByZXNzaW9uInx8ZS50eXBlPT09IkJpbmFyeUV4cHJlc3Npb24ifHxlLnR5cGU9PT0iTG9naWNhbEV4cHJlc3Npb24ifHxlLnR5cGU9PT0iTkdQaXBlRXhwcmVzc2lvbiJ8fGUudHlwZT09PSJDb25kaXRpb25hbEV4cHJlc3Npb24ifHx2ZShlKXx8eGUoZSl8fGUudHlwZT09PSJTZXF1ZW5jZUV4cHJlc3Npb24ifHxlLnR5cGU9PT0iVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uInx8ZS50eXBlPT09IkJpbmRFeHByZXNzaW9uInx8ZS50eXBlPT09IlVwZGF0ZUV4cHJlc3Npb24iJiYhZS5wcmVmaXh8fHFuKGUpfHxacyhlKX1mdW5jdGlvbiBzNShlKXtyZXR1cm4gZS5leHByZXNzaW9ucz9lLmV4cHJlc3Npb25zWzBdOmUubGVmdD8/ZS50ZXN0Pz9lLmNhbGxlZT8/ZS5vYmplY3Q/P2UudGFnPz9lLmFyZ3VtZW50Pz9lLmV4cHJlc3Npb259ZnVuY3Rpb24gaUUoZSl7aWYoZS5leHByZXNzaW9ucylyZXR1cm5bImV4cHJlc3Npb25zIiwwXTtpZihlLmxlZnQpcmV0dXJuWyJsZWZ0Il07aWYoZS50ZXN0KXJldHVyblsidGVzdCJdO2lmKGUub2JqZWN0KXJldHVyblsib2JqZWN0Il07aWYoZS5jYWxsZWUpcmV0dXJuWyJjYWxsZWUiXTtpZihlLnRhZylyZXR1cm5bInRhZyJdO2lmKGUuYXJndW1lbnQpcmV0dXJuWyJhcmd1bWVudCJdO2lmKGUuZXhwcmVzc2lvbilyZXR1cm5bImV4cHJlc3Npb24iXTt0aHJvdyBuZXcgRXJyb3IoIlVuZXhwZWN0ZWQgbm9kZSBoYXMgbm8gbGVmdCBzaWRlLiIpfWZ1bmN0aW9uIHhyKGUsdCl7cmV0dXJuIGN0KHQpP3BjKHQpOnEodCx6LkxlYWRpbmcsbj0+aXQoZSxYKG4pKSl9ZnVuY3Rpb24gaTUoZSx0KXtpZih4cih0Lm9yaWdpbmFsVGV4dCxlKXx8cShlLHouTGVhZGluZyxuPT5xdCh0Lm9yaWdpbmFsVGV4dCxlZShuKSxYKG4pKSkmJiFjdChlKSlyZXR1cm4hMDtpZihFZChlKSl7bGV0IG49ZSxyO2Zvcig7cj1zNShuKTspaWYobj1yLHhyKHQub3JpZ2luYWxUZXh0LG4pKXJldHVybiEwfXJldHVybiExfXZhciBvNT1uZXcgV2Vha01hcDtmdW5jdGlvbiBvRShlLHQpe3JldHVybiB2bihvNSxlLG49Pmk1KG4sdCkpfWZ1bmN0aW9uIERzKGUpe2Zvcig7WnMoZSk7KWU9ZS5leHByZXNzaW9uO3JldHVybiBlfWZ1bmN0aW9uIGE1KGUsdCxuKXtsZXR7bm9kZTpyLGtleTpzLHBhcmVudDppfT1lO3N3aXRjaChpLnR5cGUpe2Nhc2UiUmV0dXJuU3RhdGVtZW50IjpjYXNlIlRocm93U3RhdGVtZW50IjppZih1NShlLHQpKXJldHVybiExO2JyZWFrO2Nhc2UiUGFyZW50aGVzaXplZEV4cHJlc3Npb24iOnJldHVybiExO2Nhc2UiQ2xhc3NEZWNsYXJhdGlvbiI6Y2FzZSJDbGFzc0V4cHJlc3Npb24iOmlmKHM9PT0ic3VwZXJDbGFzcyIpe2xldCBvPURzKHIpO2lmKG8udHlwZT09PSJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiJ8fG8udHlwZT09PSJBc3NpZ25tZW50RXhwcmVzc2lvbiJ8fG8udHlwZT09PSJBd2FpdEV4cHJlc3Npb24ifHxvLnR5cGU9PT0iQmluYXJ5RXhwcmVzc2lvbiJ8fG8udHlwZT09PSJDb25kaXRpb25hbEV4cHJlc3Npb24ifHxvLnR5cGU9PT0iTG9naWNhbEV4cHJlc3Npb24ifHxvLnR5cGU9PT0iTmV3RXhwcmVzc2lvbiJ8fG8udHlwZT09PSJPYmplY3RFeHByZXNzaW9uInx8by50eXBlPT09IlNlcXVlbmNlRXhwcmVzc2lvbiJ8fG8udHlwZT09PSJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24ifHxvLnR5cGU9PT0iVW5hcnlFeHByZXNzaW9uInx8by50eXBlPT09IlVwZGF0ZUV4cHJlc3Npb24ifHxvLnR5cGU9PT0iWWllbGRFeHByZXNzaW9uInx8by50eXBlPT09IkNsYXNzRXhwcmVzc2lvbiImJlNlKG8uZGVjb3JhdG9ycykpcmV0dXJuITB9YnJlYWs7Y2FzZSJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24iOmlmKGFFKGUsdCxuKSlyZXR1cm4hMDticmVhaztjYXNlIkRlY29yYXRvciI6aWYocz09PSJleHByZXNzaW9uIiYmIWw1KHIpKXJldHVybiEwO2JyZWFrO2Nhc2UiVHlwZUFubm90YXRpb24iOmlmKGUubWF0Y2godm9pZCAwLHZvaWQgMCwobyxhKT0+YT09PSJyZXR1cm5UeXBlIiYmby50eXBlPT09IkFycm93RnVuY3Rpb25FeHByZXNzaW9uIikmJiEoci50eXBlPT09Ik51bGxhYmxlVHlwZUFubm90YXRpb24iJiZlLmNhbGwoKCk9Pm4oZSx0KSwidHlwZUFubm90YXRpb24iKSkmJmM1KHIpKXJldHVybiEwO2JyZWFrO2Nhc2UiVmFyaWFibGVEZWNsYXJhdG9yIjppZihzPT09ImluaXQiJiZlLm1hdGNoKHZvaWQgMCx2b2lkIDAsKG8sYSk9PmE9PT0iZGVjbGFyYXRpb25zIiYmby50eXBlPT09IlZhcmlhYmxlRGVjbGFyYXRpb24iLChvLGEpPT5hPT09ImxlZnQiJiZvLnR5cGU9PT0iRm9ySW5TdGF0ZW1lbnQiKSlyZXR1cm4hMDticmVhaztjYXNlIlRTSW5zdGFudGlhdGlvbkV4cHJlc3Npb24iOmlmKHM9PT0iZXhwcmVzc2lvbiImJihyLnR5cGU9PT0iQXdhaXRFeHByZXNzaW9uInx8ci50eXBlPT09IllpZWxkRXhwcmVzc2lvbiIpKXJldHVybiEwO2JyZWFrfX1mdW5jdGlvbiB1NShlLHQpe2xldHtrZXk6bixwYXJlbnQ6cn09ZTtpZighKG49PT0iYXJndW1lbnQiJiZFbyhyKSkpcmV0dXJuITE7bGV0e25vZGU6c309ZTtyZXR1cm4hISgocy50eXBlPT09IlNlcXVlbmNlRXhwcmVzc2lvbiJ8fHMudHlwZT09PSJBc3NpZ25tZW50RXhwcmVzc2lvbiIpJiZvRShzLHQpKX1mdW5jdGlvbiBhRShlLHQsbil7bGV0e25vZGU6cixwYXJlbnQ6c309ZTtyZXR1cm4gci50eXBlPT09IkZ1bmN0aW9uRXhwcmVzc2lvbiJ8fHIudHlwZT09PSJDbGFzc0V4cHJlc3Npb24iP3MudHlwZT09PSJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24ifHwhbihlLHQpOiFFZChyKXx8cy50eXBlIT09IkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbiImJm4oZSx0KT8hMTplLmNhbGwoKCk9PmFFKGUsdCxuKSwuLi5pRShyKSl9ZnVuY3Rpb24gbDUoZSl7cmV0dXJuIGUudHlwZT09PSJDaGFpbkV4cHJlc3Npb24iJiYoZT1lLmV4cHJlc3Npb24pLHZkKGUpfHx2ZShlKSYmIWUub3B0aW9uYWwmJnZkKGUuY2FsbGVlKX1mdW5jdGlvbiB2ZChlKXtyZXR1cm4gZS50eXBlPT09IklkZW50aWZpZXIiPyEwOnhlKGUpPyFlLmNvbXB1dGVkJiYhZS5vcHRpb25hbCYmZS5wcm9wZXJ0eS50eXBlPT09IklkZW50aWZpZXIiJiZ2ZChlLm9iamVjdCk6ITF9ZnVuY3Rpb24gYzUoZSl7cmV0dXJuIGJkKGUsdD0+dC50eXBlPT09Ik9iamVjdFR5cGVBbm5vdGF0aW9uIiYmYmQodCxuPT5uLnR5cGU9PT0iRnVuY3Rpb25UeXBlQW5ub3RhdGlvbiIpKX1mdW5jdGlvbiB1RShlLHQpe3ZhciBvLGEsdSxsLGYsYztpZihlLmlzUm9vdClyZXR1cm4hMTtsZXR7bm9kZTpuLGtleTpyLHBhcmVudDpzfT1lO2lmKHQuX19pc0luSHRtbEludGVycG9sYXRpb24mJiF0LmJyYWNrZXRTcGFjaW5nJiZoNShuKSYmemEoZSkpcmV0dXJuITA7aWYoZjUobikpcmV0dXJuITE7aWYobi50eXBlPT09IklkZW50aWZpZXIiKXJldHVybiBHVChlKTtpZihuLnR5cGU9PT0iT2JqZWN0RXhwcmVzc2lvbiJ8fG4udHlwZT09PSJGdW5jdGlvbkV4cHJlc3Npb24ifHxuLnR5cGU9PT0iQ2xhc3NFeHByZXNzaW9uInx8bi50eXBlPT09IkRvRXhwcmVzc2lvbiIpe2xldCBwPShvPWUuZmluZEFuY2VzdG9yKGg9PmgudHlwZT09PSJFeHByZXNzaW9uU3RhdGVtZW50IikpPT1udWxsP3ZvaWQgMDpvLmV4cHJlc3Npb247aWYocCYma3QocCxoPT5oPT09bikpcmV0dXJuITB9aWYobi50eXBlPT09Ik9iamVjdEV4cHJlc3Npb24iKXtsZXQgcD0oYT1lLmZpbmRBbmNlc3RvcihoPT5oLnR5cGU9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iKSk9PW51bGw/dm9pZCAwOmEuYm9keTtpZihwJiZwLnR5cGUhPT0iU2VxdWVuY2VFeHByZXNzaW9uIiYmcC50eXBlIT09IkFzc2lnbm1lbnRFeHByZXNzaW9uIiYma3QocCxoPT5oPT09bikpcmV0dXJuITB9bGV0IGk9YTUoZSx0LHVFKTtpZih0eXBlb2YgaT09ImJvb2xlYW4iKXJldHVybiBpO3N3aXRjaChuLnR5cGUpe2Nhc2UiVXBkYXRlRXhwcmVzc2lvbiI6aWYocy50eXBlPT09IlVuYXJ5RXhwcmVzc2lvbiIpcmV0dXJuIG4ucHJlZml4JiYobi5vcGVyYXRvcj09PSIrKyImJnMub3BlcmF0b3I9PT0iKyJ8fG4ub3BlcmF0b3I9PT0iLS0iJiZzLm9wZXJhdG9yPT09Ii0iKTtjYXNlIlVuYXJ5RXhwcmVzc2lvbiI6c3dpdGNoKHMudHlwZSl7Y2FzZSJVbmFyeUV4cHJlc3Npb24iOnJldHVybiBuLm9wZXJhdG9yPT09cy5vcGVyYXRvciYmKG4ub3BlcmF0b3I9PT0iKyJ8fG4ub3BlcmF0b3I9PT0iLSIpO2Nhc2UiQmluZEV4cHJlc3Npb24iOnJldHVybiEwO2Nhc2UiTWVtYmVyRXhwcmVzc2lvbiI6Y2FzZSJPcHRpb25hbE1lbWJlckV4cHJlc3Npb24iOnJldHVybiByPT09Im9iamVjdCI7Y2FzZSJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24iOnJldHVybiEwO2Nhc2UiTmV3RXhwcmVzc2lvbiI6Y2FzZSJDYWxsRXhwcmVzc2lvbiI6Y2FzZSJPcHRpb25hbENhbGxFeHByZXNzaW9uIjpyZXR1cm4gcj09PSJjYWxsZWUiO2Nhc2UiQmluYXJ5RXhwcmVzc2lvbiI6cmV0dXJuIHI9PT0ibGVmdCImJm4udHlwZT09PSJVbmFyeUV4cHJlc3Npb24iJiYocy5vcGVyYXRvcj09PSJpbiJ8fHMub3BlcmF0b3I9PT0iaW5zdGFuY2VvZiIpPyEwOnI9PT0ibGVmdCImJnMub3BlcmF0b3I9PT0iKioiO2Nhc2UiVFNOb25OdWxsRXhwcmVzc2lvbiI6cmV0dXJuITA7ZGVmYXVsdDpyZXR1cm4hMX1jYXNlIkJpbmFyeUV4cHJlc3Npb24iOmlmKHMudHlwZT09PSJVcGRhdGVFeHByZXNzaW9uInx8bi5vcGVyYXRvcj09PSJpbiImJnA1KGUpKXJldHVybiEwO2lmKG4ub3BlcmF0b3I9PT0ifD4iJiYoKHU9bi5leHRyYSkhPW51bGwmJnUucGFyZW50aGVzaXplZCkpe2xldCBwPWUuZ3JhbmRwYXJlbnQ7aWYocC50eXBlPT09IkJpbmFyeUV4cHJlc3Npb24iJiZwLm9wZXJhdG9yPT09Inw+IilyZXR1cm4hMH1jYXNlIlRTVHlwZUFzc2VydGlvbiI6Y2FzZSJUU0FzRXhwcmVzc2lvbiI6Y2FzZSJUU1NhdGlzZmllc0V4cHJlc3Npb24iOmNhc2UiQXNFeHByZXNzaW9uIjpjYXNlIkFzQ29uc3RFeHByZXNzaW9uIjpjYXNlIlNhdGlzZmllc0V4cHJlc3Npb24iOmNhc2UiTG9naWNhbEV4cHJlc3Npb24iOnN3aXRjaChzLnR5cGUpe2Nhc2UiVFNBc0V4cHJlc3Npb24iOmNhc2UiVFNTYXRpc2ZpZXNFeHByZXNzaW9uIjpjYXNlIkFzRXhwcmVzc2lvbiI6Y2FzZSJBc0NvbnN0RXhwcmVzc2lvbiI6Y2FzZSJTYXRpc2ZpZXNFeHByZXNzaW9uIjpyZXR1cm4hcW4obik7Y2FzZSJDb25kaXRpb25hbEV4cHJlc3Npb24iOnJldHVybiBxbihuKXx8cVQobik7Y2FzZSJDYWxsRXhwcmVzc2lvbiI6Y2FzZSJOZXdFeHByZXNzaW9uIjpjYXNlIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb24iOnJldHVybiByPT09ImNhbGxlZSI7Y2FzZSJDbGFzc0V4cHJlc3Npb24iOmNhc2UiQ2xhc3NEZWNsYXJhdGlvbiI6cmV0dXJuIHI9PT0ic3VwZXJDbGFzcyI7Y2FzZSJUU1R5cGVBc3NlcnRpb24iOmNhc2UiVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uIjpjYXNlIkpTWFNwcmVhZEF0dHJpYnV0ZSI6Y2FzZSJTcHJlYWRFbGVtZW50IjpjYXNlIkJpbmRFeHByZXNzaW9uIjpjYXNlIkF3YWl0RXhwcmVzc2lvbiI6Y2FzZSJUU05vbk51bGxFeHByZXNzaW9uIjpjYXNlIlVwZGF0ZUV4cHJlc3Npb24iOnJldHVybiEwO2Nhc2UiVW5hcnlFeHByZXNzaW9uIjppZighcShuKSlyZXR1cm4hMDticmVhaztjYXNlIk1lbWJlckV4cHJlc3Npb24iOmNhc2UiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uIjpyZXR1cm4gcj09PSJvYmplY3QiO2Nhc2UiQXNzaWdubWVudEV4cHJlc3Npb24iOmNhc2UiQXNzaWdubWVudFBhdHRlcm4iOnJldHVybiByPT09ImxlZnQiJiYobi50eXBlPT09IlRTVHlwZUFzc2VydGlvbiJ8fHFuKG4pKTtjYXNlIkxvZ2ljYWxFeHByZXNzaW9uIjppZihuLnR5cGU9PT0iTG9naWNhbEV4cHJlc3Npb24iKXJldHVybiBzLm9wZXJhdG9yIT09bi5vcGVyYXRvcjtjYXNlIkJpbmFyeUV4cHJlc3Npb24iOntsZXR7b3BlcmF0b3I6cCx0eXBlOmh9PW47aWYoIXAmJmghPT0iVFNUeXBlQXNzZXJ0aW9uIilyZXR1cm4hMDtsZXQgZD1oYyhwKSxtPXMub3BlcmF0b3IsZz1oYyhtKTtyZXR1cm4hIShnPmR8fHI9PT0icmlnaHQiJiZnPT09ZHx8Zz09PWQmJiFEZChtLHApfHxnPGQmJnA9PT0iJSImJihtPT09IisifHxtPT09Ii0iKXx8VVQobSkpfWRlZmF1bHQ6cmV0dXJuITF9YnJlYWs7Y2FzZSJTZXF1ZW5jZUV4cHJlc3Npb24iOnJldHVybiBzLnR5cGUhPT0iRm9yU3RhdGVtZW50IjtjYXNlIllpZWxkRXhwcmVzc2lvbiI6aWYocy50eXBlPT09IkF3YWl0RXhwcmVzc2lvbiJ8fHMudHlwZT09PSJUU1R5cGVBc3NlcnRpb24iKXJldHVybiEwO2Nhc2UiQXdhaXRFeHByZXNzaW9uIjpzd2l0Y2gocy50eXBlKXtjYXNlIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiI6Y2FzZSJVbmFyeUV4cHJlc3Npb24iOmNhc2UiTG9naWNhbEV4cHJlc3Npb24iOmNhc2UiU3ByZWFkRWxlbWVudCI6Y2FzZSJUU0FzRXhwcmVzc2lvbiI6Y2FzZSJUU1NhdGlzZmllc0V4cHJlc3Npb24iOmNhc2UiVFNOb25OdWxsRXhwcmVzc2lvbiI6Y2FzZSJBc0V4cHJlc3Npb24iOmNhc2UiQXNDb25zdEV4cHJlc3Npb24iOmNhc2UiU2F0aXNmaWVzRXhwcmVzc2lvbiI6Y2FzZSJCaW5kRXhwcmVzc2lvbiI6cmV0dXJuITA7Y2FzZSJNZW1iZXJFeHByZXNzaW9uIjpjYXNlIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbiI6cmV0dXJuIHI9PT0ib2JqZWN0IjtjYXNlIk5ld0V4cHJlc3Npb24iOmNhc2UiQ2FsbEV4cHJlc3Npb24iOmNhc2UiT3B0aW9uYWxDYWxsRXhwcmVzc2lvbiI6cmV0dXJuIHI9PT0iY2FsbGVlIjtjYXNlIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiI6cmV0dXJuIHI9PT0idGVzdCI7Y2FzZSJCaW5hcnlFeHByZXNzaW9uIjpyZXR1cm4hKCFuLmFyZ3VtZW50JiZzLm9wZXJhdG9yPT09Inw+Iik7ZGVmYXVsdDpyZXR1cm4hMX1jYXNlIlRTRnVuY3Rpb25UeXBlIjppZihlLm1hdGNoKHA9PnAudHlwZT09PSJUU0Z1bmN0aW9uVHlwZSIsKHAsaCk9Pmg9PT0idHlwZUFubm90YXRpb24iJiZwLnR5cGU9PT0iVFNUeXBlQW5ub3RhdGlvbiIsKHAsaCk9Pmg9PT0icmV0dXJuVHlwZSImJnAudHlwZT09PSJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiIpKXJldHVybiEwO2Nhc2UiVFNDb25kaXRpb25hbFR5cGUiOmNhc2UiVFNDb25zdHJ1Y3RvclR5cGUiOmNhc2UiQ29uZGl0aW9uYWxUeXBlQW5ub3RhdGlvbiI6aWYocj09PSJleHRlbmRzVHlwZSImJmRzKG4pJiZzLnR5cGU9PT1uLnR5cGV8fHI9PT0iY29uc3RyYWludCImJm4udHlwZT09PSJUU0NvbmRpdGlvbmFsVHlwZSImJnMudHlwZT09PSJUU1R5cGVQYXJhbWV0ZXIifHxyPT09InR5cGVBbm5vdGF0aW9uIiYmbi50eXBlPT09IkNvbmRpdGlvbmFsVHlwZUFubm90YXRpb24iJiZzLnR5cGU9PT0iVHlwZUFubm90YXRpb24iJiZlLmdyYW5kcGFyZW50LnR5cGU9PT0iVHlwZVBhcmFtZXRlciImJmUuZ3JhbmRwYXJlbnQuYm91bmQ9PT1zJiZlLmdyYW5kcGFyZW50LnVzZXNFeHRlbmRzQm91bmR8fHI9PT0iY2hlY2tUeXBlIiYmZHMocykpcmV0dXJuITA7aWYocj09PSJleHRlbmRzVHlwZSImJnMudHlwZT09PSJUU0NvbmRpdGlvbmFsVHlwZSIpe2xldHt0eXBlQW5ub3RhdGlvbjpwfT1uLnJldHVyblR5cGV8fG4udHlwZUFubm90YXRpb247aWYocC50eXBlPT09IlRTVHlwZVByZWRpY2F0ZSImJnAudHlwZUFubm90YXRpb24mJihwPXAudHlwZUFubm90YXRpb24udHlwZUFubm90YXRpb24pLHAudHlwZT09PSJUU0luZmVyVHlwZSImJnAudHlwZVBhcmFtZXRlci5jb25zdHJhaW50KXJldHVybiEwfWNhc2UiVFNVbmlvblR5cGUiOmNhc2UiVFNJbnRlcnNlY3Rpb25UeXBlIjppZihadChzKXx8VmEocykpcmV0dXJuITA7Y2FzZSJUU0luZmVyVHlwZSI6aWYobi50eXBlPT09IlRTSW5mZXJUeXBlIil7aWYocy50eXBlPT09IlRTUmVzdFR5cGUiKXJldHVybiExO2lmKHI9PT0idHlwZXMiJiYocy50eXBlPT09IlRTVW5pb25UeXBlInx8cy50eXBlPT09IlRTSW50ZXJzZWN0aW9uVHlwZSIpJiZuLnR5cGVQYXJhbWV0ZXIudHlwZT09PSJUU1R5cGVQYXJhbWV0ZXIiJiZuLnR5cGVQYXJhbWV0ZXIuY29uc3RyYWludClyZXR1cm4hMH1jYXNlIlRTVHlwZU9wZXJhdG9yIjpyZXR1cm4gcy50eXBlPT09IlRTQXJyYXlUeXBlInx8cy50eXBlPT09IlRTT3B0aW9uYWxUeXBlInx8cy50eXBlPT09IlRTUmVzdFR5cGUifHxyPT09Im9iamVjdFR5cGUiJiZzLnR5cGU9PT0iVFNJbmRleGVkQWNjZXNzVHlwZSJ8fHMudHlwZT09PSJUU1R5cGVPcGVyYXRvciJ8fHMudHlwZT09PSJUU1R5cGVBbm5vdGF0aW9uIiYmZS5ncmFuZHBhcmVudC50eXBlLnN0YXJ0c1dpdGgoIlRTSlNEb2MiKTtjYXNlIlRTVHlwZVF1ZXJ5IjpyZXR1cm4gcj09PSJvYmplY3RUeXBlIiYmcy50eXBlPT09IlRTSW5kZXhlZEFjY2Vzc1R5cGUifHxyPT09ImVsZW1lbnRUeXBlIiYmcy50eXBlPT09IlRTQXJyYXlUeXBlIjtjYXNlIlR5cGVPcGVyYXRvciI6cmV0dXJuIHMudHlwZT09PSJBcnJheVR5cGVBbm5vdGF0aW9uInx8cy50eXBlPT09Ik51bGxhYmxlVHlwZUFubm90YXRpb24ifHxyPT09Im9iamVjdFR5cGUiJiYocy50eXBlPT09IkluZGV4ZWRBY2Nlc3NUeXBlInx8cy50eXBlPT09Ik9wdGlvbmFsSW5kZXhlZEFjY2Vzc1R5cGUiKXx8cy50eXBlPT09IlR5cGVPcGVyYXRvciI7Y2FzZSJUeXBlb2ZUeXBlQW5ub3RhdGlvbiI6Y2FzZSJLZXlvZlR5cGVBbm5vdGF0aW9uIjpyZXR1cm4gcj09PSJvYmplY3RUeXBlIiYmKHMudHlwZT09PSJJbmRleGVkQWNjZXNzVHlwZSJ8fHMudHlwZT09PSJPcHRpb25hbEluZGV4ZWRBY2Nlc3NUeXBlIil8fHI9PT0iZWxlbWVudFR5cGUiJiZzLnR5cGU9PT0iQXJyYXlUeXBlQW5ub3RhdGlvbiI7Y2FzZSJBcnJheVR5cGVBbm5vdGF0aW9uIjpyZXR1cm4gcy50eXBlPT09Ik51bGxhYmxlVHlwZUFubm90YXRpb24iO2Nhc2UiSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb24iOmNhc2UiVW5pb25UeXBlQW5ub3RhdGlvbiI6cmV0dXJuIHMudHlwZT09PSJUeXBlT3BlcmF0b3IifHxzLnR5cGU9PT0iS2V5b2ZUeXBlQW5ub3RhdGlvbiJ8fHMudHlwZT09PSJBcnJheVR5cGVBbm5vdGF0aW9uInx8cy50eXBlPT09Ik51bGxhYmxlVHlwZUFubm90YXRpb24ifHxzLnR5cGU9PT0iSW50ZXJzZWN0aW9uVHlwZUFubm90YXRpb24ifHxzLnR5cGU9PT0iVW5pb25UeXBlQW5ub3RhdGlvbiJ8fHI9PT0ib2JqZWN0VHlwZSImJihzLnR5cGU9PT0iSW5kZXhlZEFjY2Vzc1R5cGUifHxzLnR5cGU9PT0iT3B0aW9uYWxJbmRleGVkQWNjZXNzVHlwZSIpO2Nhc2UiSW5mZXJUeXBlQW5ub3RhdGlvbiI6Y2FzZSJOdWxsYWJsZVR5cGVBbm5vdGF0aW9uIjppZihzLnR5cGU9PT0iQXJyYXlUeXBlQW5ub3RhdGlvbiJ8fHI9PT0ib2JqZWN0VHlwZSImJihzLnR5cGU9PT0iSW5kZXhlZEFjY2Vzc1R5cGUifHxzLnR5cGU9PT0iT3B0aW9uYWxJbmRleGVkQWNjZXNzVHlwZSIpKXJldHVybiEwO2JyZWFrO2Nhc2UiQ29tcG9uZW50VHlwZUFubm90YXRpb24iOmNhc2UiRnVuY3Rpb25UeXBlQW5ub3RhdGlvbiI6e2lmKG4udHlwZT09PSJDb21wb25lbnRUeXBlQW5ub3RhdGlvbiImJihuLnJlbmRlcnNUeXBlPT09bnVsbHx8bi5yZW5kZXJzVHlwZT09PXZvaWQgMCkpcmV0dXJuITE7aWYoZS5tYXRjaCh2b2lkIDAsKGgsZCk9PmQ9PT0idHlwZUFubm90YXRpb24iJiZoLnR5cGU9PT0iVHlwZUFubm90YXRpb24iLChoLGQpPT5kPT09InJldHVyblR5cGUiJiZoLnR5cGU9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iKXx8ZS5tYXRjaCh2b2lkIDAsKGgsZCk9PmQ9PT0idHlwZUFubm90YXRpb24iJiZoLnR5cGU9PT0iTnVsbGFibGVUeXBlQW5ub3RhdGlvbiIsKGgsZCk9PmQ9PT0idHlwZUFubm90YXRpb24iJiZoLnR5cGU9PT0iVHlwZUFubm90YXRpb24iLChoLGQpPT5kPT09InJldHVyblR5cGUiJiZoLnR5cGU9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iKXx8ZS5tYXRjaCh2b2lkIDAsKGgsZCk9PmQ9PT0idHlwZUFubm90YXRpb24iJiZoLnR5cGU9PT0iVHlwZVByZWRpY2F0ZSIsKGgsZCk9PmQ9PT0idHlwZUFubm90YXRpb24iJiZoLnR5cGU9PT0iVHlwZUFubm90YXRpb24iLChoLGQpPT5kPT09InJldHVyblR5cGUiJiZoLnR5cGU9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iKSlyZXR1cm4hMDtsZXQgcD1zLnR5cGU9PT0iTnVsbGFibGVUeXBlQW5ub3RhdGlvbiI/ZS5ncmFuZHBhcmVudDpzO3JldHVybiBwLnR5cGU9PT0iVW5pb25UeXBlQW5ub3RhdGlvbiJ8fHAudHlwZT09PSJJbnRlcnNlY3Rpb25UeXBlQW5ub3RhdGlvbiJ8fHAudHlwZT09PSJBcnJheVR5cGVBbm5vdGF0aW9uInx8cj09PSJvYmplY3RUeXBlIiYmKHAudHlwZT09PSJJbmRleGVkQWNjZXNzVHlwZSJ8fHAudHlwZT09PSJPcHRpb25hbEluZGV4ZWRBY2Nlc3NUeXBlIil8fHI9PT0iY2hlY2tUeXBlIiYmcy50eXBlPT09IkNvbmRpdGlvbmFsVHlwZUFubm90YXRpb24ifHxyPT09ImV4dGVuZHNUeXBlIiYmcy50eXBlPT09IkNvbmRpdGlvbmFsVHlwZUFubm90YXRpb24iJiYoKGw9bi5yZXR1cm5UeXBlKT09bnVsbD92b2lkIDA6bC50eXBlKT09PSJJbmZlclR5cGVBbm5vdGF0aW9uIiYmbi5yZXR1cm5UeXBlLnR5cGVQYXJhbWV0ZXIuYm91bmR8fHAudHlwZT09PSJOdWxsYWJsZVR5cGVBbm5vdGF0aW9uInx8cy50eXBlPT09IkZ1bmN0aW9uVHlwZVBhcmFtIiYmcy5uYW1lPT09bnVsbCYmeHQobikuc29tZShoPT57dmFyIGQ7cmV0dXJuKChkPWgudHlwZUFubm90YXRpb24pPT1udWxsP3ZvaWQgMDpkLnR5cGUpPT09Ik51bGxhYmxlVHlwZUFubm90YXRpb24ifSl9Y2FzZSJPcHRpb25hbEluZGV4ZWRBY2Nlc3NUeXBlIjpyZXR1cm4gcj09PSJvYmplY3RUeXBlIiYmcy50eXBlPT09IkluZGV4ZWRBY2Nlc3NUeXBlIjtjYXNlIlN0cmluZ0xpdGVyYWwiOmNhc2UiTnVtZXJpY0xpdGVyYWwiOmNhc2UiTGl0ZXJhbCI6aWYodHlwZW9mIG4udmFsdWU9PSJzdHJpbmciJiZzLnR5cGU9PT0iRXhwcmVzc2lvblN0YXRlbWVudCImJnR5cGVvZiBzLmRpcmVjdGl2ZSE9InN0cmluZyIpe2xldCBwPWUuZ3JhbmRwYXJlbnQ7cmV0dXJuIHAudHlwZT09PSJQcm9ncmFtInx8cC50eXBlPT09IkJsb2NrU3RhdGVtZW50In1yZXR1cm4gcj09PSJvYmplY3QiJiZ4ZShzKSYmaXIobik7Y2FzZSJBc3NpZ25tZW50RXhwcmVzc2lvbiI6cmV0dXJuISgocj09PSJpbml0Inx8cj09PSJ1cGRhdGUiKSYmcy50eXBlPT09IkZvclN0YXRlbWVudCJ8fHI9PT0iZXhwcmVzc2lvbiImJm4ubGVmdC50eXBlIT09Ik9iamVjdFBhdHRlcm4iJiZzLnR5cGU9PT0iRXhwcmVzc2lvblN0YXRlbWVudCJ8fHI9PT0ia2V5IiYmcy50eXBlPT09IlRTUHJvcGVydHlTaWduYXR1cmUifHxzLnR5cGU9PT0iQXNzaWdubWVudEV4cHJlc3Npb24ifHxyPT09ImV4cHJlc3Npb25zIiYmcy50eXBlPT09IlNlcXVlbmNlRXhwcmVzc2lvbiImJmUubWF0Y2godm9pZCAwLHZvaWQgMCwocCxoKT0+KGg9PT0iaW5pdCJ8fGg9PT0idXBkYXRlIikmJnAudHlwZT09PSJGb3JTdGF0ZW1lbnQiKXx8cj09PSJ2YWx1ZSImJnMudHlwZT09PSJQcm9wZXJ0eSImJmUubWF0Y2godm9pZCAwLHZvaWQgMCwocCxoKT0+aD09PSJwcm9wZXJ0aWVzIiYmcC50eXBlPT09Ik9iamVjdFBhdHRlcm4iKXx8cy50eXBlPT09Ik5HQ2hhaW5lZEV4cHJlc3Npb24ifHxyPT09Im5vZGUiJiZzLnR5cGU9PT0iSnNFeHByZXNzaW9uUm9vdCIpO2Nhc2UiQ29uZGl0aW9uYWxFeHByZXNzaW9uIjpzd2l0Y2gocy50eXBlKXtjYXNlIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiI6Y2FzZSJVbmFyeUV4cHJlc3Npb24iOmNhc2UiU3ByZWFkRWxlbWVudCI6Y2FzZSJCaW5hcnlFeHByZXNzaW9uIjpjYXNlIkxvZ2ljYWxFeHByZXNzaW9uIjpjYXNlIk5HUGlwZUV4cHJlc3Npb24iOmNhc2UiQXdhaXRFeHByZXNzaW9uIjpjYXNlIkpTWFNwcmVhZEF0dHJpYnV0ZSI6Y2FzZSJUU1R5cGVBc3NlcnRpb24iOmNhc2UiVHlwZUNhc3RFeHByZXNzaW9uIjpjYXNlIlRTQXNFeHByZXNzaW9uIjpjYXNlIlRTU2F0aXNmaWVzRXhwcmVzc2lvbiI6Y2FzZSJBc0V4cHJlc3Npb24iOmNhc2UiQXNDb25zdEV4cHJlc3Npb24iOmNhc2UiU2F0aXNmaWVzRXhwcmVzc2lvbiI6Y2FzZSJUU05vbk51bGxFeHByZXNzaW9uIjpyZXR1cm4hMDtjYXNlIk5ld0V4cHJlc3Npb24iOmNhc2UiQ2FsbEV4cHJlc3Npb24iOmNhc2UiT3B0aW9uYWxDYWxsRXhwcmVzc2lvbiI6cmV0dXJuIHI9PT0iY2FsbGVlIjtjYXNlIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiI6cmV0dXJuIHQuZXhwZXJpbWVudGFsVGVybmFyaWVzPyExOnI9PT0idGVzdCI7Y2FzZSJNZW1iZXJFeHByZXNzaW9uIjpjYXNlIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbiI6cmV0dXJuIHI9PT0ib2JqZWN0IjtkZWZhdWx0OnJldHVybiExfWNhc2UiRnVuY3Rpb25FeHByZXNzaW9uIjpzd2l0Y2gocy50eXBlKXtjYXNlIk5ld0V4cHJlc3Npb24iOmNhc2UiQ2FsbEV4cHJlc3Npb24iOmNhc2UiT3B0aW9uYWxDYWxsRXhwcmVzc2lvbiI6cmV0dXJuIHI9PT0iY2FsbGVlIjtjYXNlIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiI6cmV0dXJuITA7Y2FzZSJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24iOnJldHVybiByPT09ImRlY2xhcmF0aW9uIjtkZWZhdWx0OnJldHVybiExfWNhc2UiQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iOnN3aXRjaChzLnR5cGUpe2Nhc2UiQmluYXJ5RXhwcmVzc2lvbiI6cmV0dXJuIHMub3BlcmF0b3IhPT0ifD4ifHwoKGY9bi5leHRyYSk9PW51bGw/dm9pZCAwOmYucGFyZW50aGVzaXplZCk7Y2FzZSJOZXdFeHByZXNzaW9uIjpjYXNlIkNhbGxFeHByZXNzaW9uIjpjYXNlIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb24iOnJldHVybiByPT09ImNhbGxlZSI7Y2FzZSJNZW1iZXJFeHByZXNzaW9uIjpjYXNlIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbiI6cmV0dXJuIHI9PT0ib2JqZWN0IjtjYXNlIlRTQXNFeHByZXNzaW9uIjpjYXNlIlRTU2F0aXNmaWVzRXhwcmVzc2lvbiI6Y2FzZSJBc0V4cHJlc3Npb24iOmNhc2UiQXNDb25zdEV4cHJlc3Npb24iOmNhc2UiU2F0aXNmaWVzRXhwcmVzc2lvbiI6Y2FzZSJUU05vbk51bGxFeHByZXNzaW9uIjpjYXNlIkJpbmRFeHByZXNzaW9uIjpjYXNlIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiI6Y2FzZSJVbmFyeUV4cHJlc3Npb24iOmNhc2UiTG9naWNhbEV4cHJlc3Npb24iOmNhc2UiQXdhaXRFeHByZXNzaW9uIjpjYXNlIlRTVHlwZUFzc2VydGlvbiI6Y2FzZSJNYXRjaEV4cHJlc3Npb25DYXNlIjpyZXR1cm4hMDtjYXNlIlRTSW5zdGFudGlhdGlvbkV4cHJlc3Npb24iOnJldHVybiByPT09ImV4cHJlc3Npb24iO2Nhc2UiQ29uZGl0aW9uYWxFeHByZXNzaW9uIjpyZXR1cm4gcj09PSJ0ZXN0IjtkZWZhdWx0OnJldHVybiExfWNhc2UiQ2xhc3NFeHByZXNzaW9uIjpzd2l0Y2gocy50eXBlKXtjYXNlIk5ld0V4cHJlc3Npb24iOnJldHVybiByPT09ImNhbGxlZSI7Y2FzZSJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24iOnJldHVybiByPT09ImRlY2xhcmF0aW9uIjtkZWZhdWx0OnJldHVybiExfWNhc2UiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uIjpjYXNlIk9wdGlvbmFsQ2FsbEV4cHJlc3Npb24iOmNhc2UiQ2hhaW5FeHByZXNzaW9uIjpjYXNlIlRTTm9uTnVsbEV4cHJlc3Npb24iOmlmKHpUKGUpKXJldHVybiEwO2Nhc2UiQ2FsbEV4cHJlc3Npb24iOmNhc2UiTWVtYmVyRXhwcmVzc2lvbiI6Y2FzZSJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24iOmNhc2UiSW1wb3J0RXhwcmVzc2lvbiI6aWYocj09PSJjYWxsZWUiJiYocy50eXBlPT09IkJpbmRFeHByZXNzaW9uInx8cy50eXBlPT09Ik5ld0V4cHJlc3Npb24iKSl7bGV0IHA9bjtmb3IoO3A7KXN3aXRjaChwLnR5cGUpe2Nhc2UiQ2FsbEV4cHJlc3Npb24iOmNhc2UiSW1wb3J0RXhwcmVzc2lvbiI6cmV0dXJuITA7Y2FzZSJNZW1iZXJFeHByZXNzaW9uIjpjYXNlIk9wdGlvbmFsTWVtYmVyRXhwcmVzc2lvbiI6Y2FzZSJCaW5kRXhwcmVzc2lvbiI6cD1wLm9iamVjdDticmVhaztjYXNlIlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiI6cD1wLnRhZzticmVhaztjYXNlIlRTTm9uTnVsbEV4cHJlc3Npb24iOnA9cC5leHByZXNzaW9uO2JyZWFrO2RlZmF1bHQ6cmV0dXJuITF9fXJldHVybiExO2Nhc2UiQmluZEV4cHJlc3Npb24iOnJldHVybiByPT09ImNhbGxlZSImJihzLnR5cGU9PT0iQmluZEV4cHJlc3Npb24ifHxzLnR5cGU9PT0iTmV3RXhwcmVzc2lvbiIpfHxyPT09Im9iamVjdCImJnhlKHMpO2Nhc2UiTkdQaXBlRXhwcmVzc2lvbiI6cmV0dXJuIShzLnR5cGU9PT0iTkdSb290Inx8cy50eXBlPT09Ik5HTWljcm9zeW50YXhFeHByZXNzaW9uInx8cy50eXBlPT09Ik9iamVjdFByb3BlcnR5IiYmISgoYz1uLmV4dHJhKSE9bnVsbCYmYy5wYXJlbnRoZXNpemVkKXx8aHQocyl8fHI9PT0iYXJndW1lbnRzIiYmdmUocyl8fHI9PT0icmlnaHQiJiZzLnR5cGU9PT0iTkdQaXBlRXhwcmVzc2lvbiJ8fHI9PT0icHJvcGVydHkiJiZzLnR5cGU9PT0iTWVtYmVyRXhwcmVzc2lvbiJ8fHMudHlwZT09PSJBc3NpZ25tZW50RXhwcmVzc2lvbiIpO2Nhc2UiSlNYRnJhZ21lbnQiOmNhc2UiSlNYRWxlbWVudCI6cmV0dXJuIHI9PT0iY2FsbGVlInx8cj09PSJsZWZ0IiYmcy50eXBlPT09IkJpbmFyeUV4cHJlc3Npb24iJiZzLm9wZXJhdG9yPT09IjwifHwhaHQocykmJnMudHlwZSE9PSJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiImJnMudHlwZSE9PSJBc3NpZ25tZW50RXhwcmVzc2lvbiImJnMudHlwZSE9PSJBc3NpZ25tZW50UGF0dGVybiImJnMudHlwZSE9PSJCaW5hcnlFeHByZXNzaW9uIiYmcy50eXBlIT09IkNvbmRpdGlvbmFsRXhwcmVzc2lvbiImJnMudHlwZSE9PSJFeHByZXNzaW9uU3RhdGVtZW50IiYmcy50eXBlIT09IkpzRXhwcmVzc2lvblJvb3QiJiZzLnR5cGUhPT0iSlNYQXR0cmlidXRlIiYmcy50eXBlIT09IkpTWEVsZW1lbnQiJiZzLnR5cGUhPT0iSlNYRXhwcmVzc2lvbkNvbnRhaW5lciImJnMudHlwZSE9PSJKU1hGcmFnbWVudCImJnMudHlwZSE9PSJMb2dpY2FsRXhwcmVzc2lvbiImJiFxYShzKSYmIXlzKHMpJiYhRW8ocykmJnMudHlwZSE9PSJUeXBlQ2FzdEV4cHJlc3Npb24iJiZzLnR5cGUhPT0iVmFyaWFibGVEZWNsYXJhdG9yIiYmcy50eXBlIT09IllpZWxkRXhwcmVzc2lvbiImJnMudHlwZSE9PSJNYXRjaEV4cHJlc3Npb25DYXNlIiYmIShyPT09ImRlY2xhcmF0aW9uIiYmcy50eXBlPT09IkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbiIpO2Nhc2UiVFNJbnN0YW50aWF0aW9uRXhwcmVzc2lvbiI6cmV0dXJuIHI9PT0ib2JqZWN0IiYmeGUocyk7Y2FzZSJNYXRjaE9yUGF0dGVybiI6cmV0dXJuIHMudHlwZT09PSJNYXRjaEFzUGF0dGVybiJ9cmV0dXJuITF9dmFyIGY1PUsoWyJCbG9ja1N0YXRlbWVudCIsIkJyZWFrU3RhdGVtZW50IiwiQ29tcG9uZW50RGVjbGFyYXRpb24iLCJDbGFzc0JvZHkiLCJDbGFzc0RlY2xhcmF0aW9uIiwiQ2xhc3NNZXRob2QiLCJDbGFzc1Byb3BlcnR5IiwiUHJvcGVydHlEZWZpbml0aW9uIiwiQ2xhc3NQcml2YXRlUHJvcGVydHkiLCJDb250aW51ZVN0YXRlbWVudCIsIkRlYnVnZ2VyU3RhdGVtZW50IiwiRGVjbGFyZUNvbXBvbmVudCIsIkRlY2xhcmVDbGFzcyIsIkRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvbiIsIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvbiIsIkRlY2xhcmVGdW5jdGlvbiIsIkRlY2xhcmVIb29rIiwiRGVjbGFyZUludGVyZmFjZSIsIkRlY2xhcmVNb2R1bGUiLCJEZWNsYXJlTW9kdWxlRXhwb3J0cyIsIkRlY2xhcmVOYW1lc3BhY2UiLCJEZWNsYXJlVmFyaWFibGUiLCJEZWNsYXJlRW51bSIsIkRvV2hpbGVTdGF0ZW1lbnQiLCJFbnVtRGVjbGFyYXRpb24iLCJFeHBvcnRBbGxEZWNsYXJhdGlvbiIsIkV4cG9ydERlZmF1bHREZWNsYXJhdGlvbiIsIkV4cG9ydE5hbWVkRGVjbGFyYXRpb24iLCJFeHByZXNzaW9uU3RhdGVtZW50IiwiRm9ySW5TdGF0ZW1lbnQiLCJGb3JPZlN0YXRlbWVudCIsIkZvclN0YXRlbWVudCIsIkZ1bmN0aW9uRGVjbGFyYXRpb24iLCJIb29rRGVjbGFyYXRpb24iLCJJZlN0YXRlbWVudCIsIkltcG9ydERlY2xhcmF0aW9uIiwiSW50ZXJmYWNlRGVjbGFyYXRpb24iLCJMYWJlbGVkU3RhdGVtZW50IiwiTWV0aG9kRGVmaW5pdGlvbiIsIlJldHVyblN0YXRlbWVudCIsIlN3aXRjaFN0YXRlbWVudCIsIlRocm93U3RhdGVtZW50IiwiVHJ5U3RhdGVtZW50IiwiVFNEZWNsYXJlRnVuY3Rpb24iLCJUU0VudW1EZWNsYXJhdGlvbiIsIlRTSW1wb3J0RXF1YWxzRGVjbGFyYXRpb24iLCJUU0ludGVyZmFjZURlY2xhcmF0aW9uIiwiVFNNb2R1bGVEZWNsYXJhdGlvbiIsIlRTTmFtZXNwYWNlRXhwb3J0RGVjbGFyYXRpb24iLCJUeXBlQWxpYXMiLCJWYXJpYWJsZURlY2xhcmF0aW9uIiwiV2hpbGVTdGF0ZW1lbnQiLCJXaXRoU3RhdGVtZW50Il0pO2Z1bmN0aW9uIHA1KGUpe2xldCB0PTAse25vZGU6bn09ZTtmb3IoO247KXtsZXQgcj1lLmdldFBhcmVudE5vZGUodCsrKTtpZigocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJGb3JTdGF0ZW1lbnQiJiZyLmluaXQ9PT1uKXJldHVybiEwO249cn1yZXR1cm4hMX1mdW5jdGlvbiBoNShlKXtyZXR1cm4gV24oZSl9ZnVuY3Rpb24gemEoZSl7bGV0e3BhcmVudDp0LGtleTpufT1lO3N3aXRjaCh0LnR5cGUpe2Nhc2UiTkdQaXBlRXhwcmVzc2lvbiI6aWYobj09PSJhcmd1bWVudHMiJiZlLmlzTGFzdClyZXR1cm4gZS5jYWxsUGFyZW50KHphKTticmVhaztjYXNlIk9iamVjdFByb3BlcnR5IjppZihuPT09InZhbHVlIilyZXR1cm4gZS5jYWxsUGFyZW50KCgpPT5lLmtleT09PSJwcm9wZXJ0aWVzIiYmZS5pc0xhc3QpO2JyZWFrO2Nhc2UiQmluYXJ5RXhwcmVzc2lvbiI6Y2FzZSJMb2dpY2FsRXhwcmVzc2lvbiI6aWYobj09PSJyaWdodCIpcmV0dXJuIGUuY2FsbFBhcmVudCh6YSk7YnJlYWs7Y2FzZSJDb25kaXRpb25hbEV4cHJlc3Npb24iOmlmKG49PT0iYWx0ZXJuYXRlIilyZXR1cm4gZS5jYWxsUGFyZW50KHphKTticmVhaztjYXNlIlVuYXJ5RXhwcmVzc2lvbiI6aWYodC5wcmVmaXgmJmUuY2FsbFBhcmVudCh6YSkpcmV0dXJuITA7YnJlYWt9cmV0dXJuITF9dmFyIHRuPXVFLHRpPSJzdHJpbmciLGtyPSJhcnJheSIsd289ImN1cnNvciIsbmk9ImluZGVudCIscmk9ImFsaWduIixzaT0idHJpbSIsd249Imdyb3VwIixicz0iZmlsbCIsYXI9ImlmLWJyZWFrIixpaT0iaW5kZW50LWlmLWJyZWFrIixvaT0ibGluZS1zdWZmaXgiLEVzPSJsaW5lLXN1ZmZpeC1ib3VuZGFyeSIsV3Q9ImxpbmUiLFRyPSJsYWJlbCIsTnI9ImJyZWFrLXBhcmVudCIsbEU9bmV3IFNldChbd28sbmkscmksc2ksd24sYnMsYXIsaWksb2ksRXMsV3QsVHIsTnJdKTtmdW5jdGlvbiBkNShlKXtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJuIHRpO2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuIGtyO2lmKCFlKXJldHVybjtsZXR7dHlwZTp0fT1lO2lmKGxFLmhhcyh0KSlyZXR1cm4gdH12YXIgdnM9ZDUsbTU9ZT0+bmV3IEludGwuTGlzdEZvcm1hdCgiZW4tVVMiLHt0eXBlOiJkaXNqdW5jdGlvbiJ9KS5mb3JtYXQoZSk7ZnVuY3Rpb24gZzUoZSl7bGV0IHQ9ZT09PW51bGw/Im51bGwiOnR5cGVvZiBlO2lmKHQhPT0ic3RyaW5nIiYmdCE9PSJvYmplY3QiKXJldHVybmBVbmV4cGVjdGVkIGRvYyAnJHt0fScsIApFeHBlY3RlZCBpdCB0byBiZSAnc3RyaW5nJyBvciAnb2JqZWN0Jy5gO2lmKHZzKGUpKXRocm93IG5ldyBFcnJvcigiZG9jIGlzIHZhbGlkLiIpO2xldCBuPU9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChlKTtpZihuIT09IltvYmplY3QgT2JqZWN0XSIpcmV0dXJuYFVuZXhwZWN0ZWQgZG9jICcke259Jy5gO2xldCByPW01KFsuLi5sRV0ubWFwKHM9PmAnJHtzfSdgKSk7cmV0dXJuYFVuZXhwZWN0ZWQgZG9jLnR5cGUgJyR7ZS50eXBlfScuCkV4cGVjdGVkIGl0IHRvIGJlICR7cn0uYH12YXIgeTU9Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3RvcihuKXtzdXBlcihnNShuKSk7V2UodGhpcywibmFtZSIsIkludmFsaWREb2NFcnJvciIpO3RoaXMuZG9jPW59fSxHYT15NSxjRT17fTtmdW5jdGlvbiBENShlLHQsbixyKXtsZXQgcz1bZV07Zm9yKDtzLmxlbmd0aD4wOyl7bGV0IGk9cy5wb3AoKTtpZihpPT09Y0Upe24ocy5wb3AoKSk7Y29udGludWV9biYmcy5wdXNoKGksY0UpO2xldCBvPXZzKGkpO2lmKCFvKXRocm93IG5ldyBHYShpKTtpZigodD09bnVsbD92b2lkIDA6dChpKSkhPT0hMSlzd2l0Y2gobyl7Y2FzZSBrcjpjYXNlIGJzOntsZXQgYT1vPT09a3I/aTppLnBhcnRzO2ZvcihsZXQgdT1hLmxlbmd0aCxsPXUtMTtsPj0wOy0tbClzLnB1c2goYVtsXSk7YnJlYWt9Y2FzZSBhcjpzLnB1c2goaS5mbGF0Q29udGVudHMsaS5icmVha0NvbnRlbnRzKTticmVhaztjYXNlIHduOmlmKHImJmkuZXhwYW5kZWRTdGF0ZXMpZm9yKGxldCBhPWkuZXhwYW5kZWRTdGF0ZXMubGVuZ3RoLHU9YS0xO3U+PTA7LS11KXMucHVzaChpLmV4cGFuZGVkU3RhdGVzW3VdKTtlbHNlIHMucHVzaChpLmNvbnRlbnRzKTticmVhaztjYXNlIHJpOmNhc2Ugbmk6Y2FzZSBpaTpjYXNlIFRyOmNhc2Ugb2k6cy5wdXNoKGkuY29udGVudHMpO2JyZWFrO2Nhc2UgdGk6Y2FzZSB3bzpjYXNlIHNpOmNhc2UgRXM6Y2FzZSBXdDpjYXNlIE5yOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3IEdhKGkpfX19dmFyIEZkPUQ1O2Z1bmN0aW9uIENvKGUsdCl7aWYodHlwZW9mIGU9PSJzdHJpbmciKXJldHVybiB0KGUpO2xldCBuPW5ldyBNYXA7cmV0dXJuIHIoZSk7ZnVuY3Rpb24gcihpKXtyZXR1cm4gdm4obixpLHMpfWZ1bmN0aW9uIHMoaSl7c3dpdGNoKHZzKGkpKXtjYXNlIGtyOnJldHVybiB0KGkubWFwKHIpKTtjYXNlIGJzOnJldHVybiB0KHsuLi5pLHBhcnRzOmkucGFydHMubWFwKHIpfSk7Y2FzZSBhcjpyZXR1cm4gdCh7Li4uaSxicmVha0NvbnRlbnRzOnIoaS5icmVha0NvbnRlbnRzKSxmbGF0Q29udGVudHM6cihpLmZsYXRDb250ZW50cyl9KTtjYXNlIHduOntsZXR7ZXhwYW5kZWRTdGF0ZXM6byxjb250ZW50czphfT1pO3JldHVybiBvPyhvPW8ubWFwKHIpLGE9b1swXSk6YT1yKGEpLHQoey4uLmksY29udGVudHM6YSxleHBhbmRlZFN0YXRlczpvfSl9Y2FzZSByaTpjYXNlIG5pOmNhc2UgaWk6Y2FzZSBUcjpjYXNlIG9pOnJldHVybiB0KHsuLi5pLGNvbnRlbnRzOnIoaS5jb250ZW50cyl9KTtjYXNlIHRpOmNhc2Ugd286Y2FzZSBzaTpjYXNlIEVzOmNhc2UgV3Q6Y2FzZSBOcjpyZXR1cm4gdChpKTtkZWZhdWx0OnRocm93IG5ldyBHYShpKX19fWZ1bmN0aW9uIGZFKGUsdCxuKXtsZXQgcj1uLHM9ITE7ZnVuY3Rpb24gaShvKXtpZihzKXJldHVybiExO2xldCBhPXQobyk7YSE9PXZvaWQgMCYmKHM9ITAscj1hKX1yZXR1cm4gRmQoZSxpKSxyfWZ1bmN0aW9uIGI1KGUpe2lmKGUudHlwZT09PXduJiZlLmJyZWFrfHxlLnR5cGU9PT1XdCYmZS5oYXJkfHxlLnR5cGU9PT1OcilyZXR1cm4hMH1mdW5jdGlvbiBUdChlKXtyZXR1cm4gZkUoZSxiNSwhMSl9ZnVuY3Rpb24gcEUoZSl7aWYoZS5sZW5ndGg+MCl7bGV0IHQ9Y2UoMCxlLC0xKTshdC5leHBhbmRlZFN0YXRlcyYmIXQuYnJlYWsmJih0LmJyZWFrPSJwcm9wYWdhdGVkIil9cmV0dXJuIG51bGx9ZnVuY3Rpb24gRTUoZSl7bGV0IHQ9bmV3IFNldCxuPVtdO2Z1bmN0aW9uIHIoaSl7aWYoaS50eXBlPT09TnImJnBFKG4pLGkudHlwZT09PXduKXtpZihuLnB1c2goaSksdC5oYXMoaSkpcmV0dXJuITE7dC5hZGQoaSl9fWZ1bmN0aW9uIHMoaSl7aS50eXBlPT09d24mJm4ucG9wKCkuYnJlYWsmJnBFKG4pfUZkKGUscixzLCEwKX1mdW5jdGlvbiB2NShlKXtyZXR1cm4gZS50eXBlPT09V3QmJiFlLmhhcmQ/ZS5zb2Z0PyIiOiIgIjplLnR5cGU9PT1hcj9lLmZsYXRDb250ZW50czplfWZ1bmN0aW9uIG1jKGUpe3JldHVybiBDbyhlLHY1KX1mdW5jdGlvbiBGNShlKXtzd2l0Y2godnMoZSkpe2Nhc2UgYnM6e2xldHtwYXJ0czp0fT1lO2lmKHQuZXZlcnkobj0+bj09PSIiKSlyZXR1cm4iIjtpZih0Lmxlbmd0aD09PTEpcmV0dXJuIHRbMF07YnJlYWt9Y2FzZSB3bjppZighZS5jb250ZW50cyYmIWUuaWQmJiFlLmJyZWFrJiYhZS5leHBhbmRlZFN0YXRlcylyZXR1cm4iIjtpZihlLmNvbnRlbnRzLnR5cGU9PT13biYmZS5jb250ZW50cy5pZD09PWUuaWQmJmUuY29udGVudHMuYnJlYWs9PT1lLmJyZWFrJiZlLmNvbnRlbnRzLmV4cGFuZGVkU3RhdGVzPT09ZS5leHBhbmRlZFN0YXRlcylyZXR1cm4gZS5jb250ZW50czticmVhaztjYXNlIHJpOmNhc2Ugbmk6Y2FzZSBpaTpjYXNlIG9pOmlmKCFlLmNvbnRlbnRzKXJldHVybiIiO2JyZWFrO2Nhc2UgYXI6aWYoIWUuZmxhdENvbnRlbnRzJiYhZS5icmVha0NvbnRlbnRzKXJldHVybiIiO2JyZWFrO2Nhc2Uga3I6e2xldCB0PVtdO2ZvcihsZXQgbiBvZiBlKXtpZighbiljb250aW51ZTtsZXRbciwuLi5zXT1BcnJheS5pc0FycmF5KG4pP246W25dO3R5cGVvZiByPT0ic3RyaW5nIiYmdHlwZW9mIGNlKDAsdCwtMSk9PSJzdHJpbmciP3RbdC5sZW5ndGgtMV0rPXI6dC5wdXNoKHIpLHQucHVzaCguLi5zKX1yZXR1cm4gdC5sZW5ndGg9PT0wPyIiOnQubGVuZ3RoPT09MT90WzBdOnR9Y2FzZSB0aTpjYXNlIHdvOmNhc2Ugc2k6Y2FzZSBFczpjYXNlIFd0OmNhc2UgVHI6Y2FzZSBOcjpicmVhaztkZWZhdWx0OnRocm93IG5ldyBHYShlKX1yZXR1cm4gZX1mdW5jdGlvbiBBZChlKXtyZXR1cm4gQ28oZSx0PT5GNSh0KSl9ZnVuY3Rpb24gYWkoZSx0PXdkKXtyZXR1cm4gQ28oZSxuPT50eXBlb2Ygbj09InN0cmluZyI/ZmUodCxuLnNwbGl0KGAKYCkpOm4pfWZ1bmN0aW9uIEE1KGUpe2lmKGUudHlwZT09PVd0KXJldHVybiEwfWZ1bmN0aW9uIHc1KGUpe3JldHVybiBmRShlLEE1LCExKX1mdW5jdGlvbiBoRShlLHQpe3JldHVybiBlLnR5cGU9PT1Ucj97Li4uZSxjb250ZW50czp0KGUuY29udGVudHMpfTp0KGUpfWZ1bmN0aW9uIEM1KGUpe2xldCB0PSEwO3JldHVybiBGZChlLG49Pntzd2l0Y2godnMobikpe2Nhc2UgdGk6aWYobj09PSIiKWJyZWFrO2Nhc2Ugc2k6Y2FzZSBFczpjYXNlIFd0OmNhc2UgTnI6cmV0dXJuIHQ9ITEsITF9fSksdH12YXIgUzU9ZGs7ZnVuY3Rpb24gTyhlKXtyZXR1cm57dHlwZTpuaSxjb250ZW50czplfX1mdW5jdGlvbiBubihlLHQpe3JldHVybnt0eXBlOnJpLGNvbnRlbnRzOnQsbjplfX1mdW5jdGlvbiB4NShlKXtyZXR1cm4gbm4oTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZLGUpfWZ1bmN0aW9uIGs1KGUpe3JldHVybiBubih7dHlwZToicm9vdCJ9LGUpfWZ1bmN0aW9uIGRFKGUpe3JldHVybiBubigtMSxlKX1mdW5jdGlvbiBUNShlLHQsbil7bGV0IHI9ZTtpZih0PjApe2ZvcihsZXQgcz0wO3M8TWF0aC5mbG9vcih0L24pOysrcylyPU8ocik7cj1ubih0JW4scikscj1ubihOdW1iZXIuTkVHQVRJVkVfSU5GSU5JVFkscil9cmV0dXJuIHJ9dmFyIExyPXt0eXBlOk5yfSxnYz17dHlwZTp3b307ZnVuY3Rpb24gbUUoZSl7cmV0dXJue3R5cGU6YnMscGFydHM6ZX19ZnVuY3Rpb24gXyhlLHQ9e30pe3JldHVybiBTNSh0LmV4cGFuZGVkU3RhdGVzKSx7dHlwZTp3bixpZDp0LmlkLGNvbnRlbnRzOmUsYnJlYWs6ISF0LnNob3VsZEJyZWFrLGV4cGFuZGVkU3RhdGVzOnQuZXhwYW5kZWRTdGF0ZXN9fWZ1bmN0aW9uIHVpKGUsdCl7cmV0dXJuIF8oZVswXSx7Li4udCxleHBhbmRlZFN0YXRlczplfSl9ZnVuY3Rpb24gdWUoZSx0PSIiLG49e30pe3JldHVybnt0eXBlOmFyLGJyZWFrQ29udGVudHM6ZSxmbGF0Q29udGVudHM6dCxncm91cElkOm4uZ3JvdXBJZH19ZnVuY3Rpb24gS2EoZSx0KXtyZXR1cm57dHlwZTppaSxjb250ZW50czplLGdyb3VwSWQ6dC5ncm91cElkLG5lZ2F0ZTp0Lm5lZ2F0ZX19ZnVuY3Rpb24gZmUoZSx0KXtsZXQgbj1bXTtmb3IobGV0IHI9MDtyPHQubGVuZ3RoO3IrKylyIT09MCYmbi5wdXNoKGUpLG4ucHVzaCh0W3JdKTtyZXR1cm4gbn1mdW5jdGlvbiBYYShlLHQpe3JldHVybiBlP3t0eXBlOlRyLGxhYmVsOmUsY29udGVudHM6dH06dH12YXIgSD17dHlwZTpXdH0sUD17dHlwZTpXdCxzb2Z0OiEwfSxnRT17dHlwZTpXdCxoYXJkOiEwfSxSPVtnRSxMcl0sTjU9e3R5cGU6V3QsaGFyZDohMCxsaXRlcmFsOiEwfSx3ZD1bTjUsTHJdO2Z1bmN0aW9uIHlFKGUpe3JldHVybnt0eXBlOm9pLGNvbnRlbnRzOmV9fXZhciBDbj17dHlwZTpFc30sTDU9ImNyIiwkNT0iY3JsZiIsQjU9IlxyIixfNT1gXHIKYCxJNT1gCmAsUDU9STU7ZnVuY3Rpb24gTTUoZSl7cmV0dXJuIGU9PT1MNT9CNTplPT09JDU/XzU6UDV9dmFyIE81PSgpPT4vWyMqMC05XVx1RkUwRj9cdTIwRTN8W1x4QTlceEFFXHUyMDNDXHUyMDQ5XHUyMTIyXHUyMTM5XHUyMTk0LVx1MjE5OVx1MjFBOVx1MjFBQVx1MjMxQVx1MjMxQlx1MjMyOFx1MjNDRlx1MjNFRC1cdTIzRUZcdTIzRjFcdTIzRjJcdTIzRjgtXHUyM0ZBXHUyNEMyXHUyNUFBXHUyNUFCXHUyNUI2XHUyNUMwXHUyNUZCXHUyNUZDXHUyNUZFXHUyNjAwLVx1MjYwNFx1MjYwRVx1MjYxMVx1MjYxNFx1MjYxNVx1MjYxOFx1MjYyMFx1MjYyMlx1MjYyM1x1MjYyNlx1MjYyQVx1MjYyRVx1MjYyRlx1MjYzOC1cdTI2M0FcdTI2NDBcdTI2NDJcdTI2NDgtXHUyNjUzXHUyNjVGXHUyNjYwXHUyNjYzXHUyNjY1XHUyNjY2XHUyNjY4XHUyNjdCXHUyNjdFXHUyNjdGXHUyNjkyXHUyNjk0LVx1MjY5N1x1MjY5OVx1MjY5Qlx1MjY5Q1x1MjZBMFx1MjZBN1x1MjZBQVx1MjZCMFx1MjZCMVx1MjZCRFx1MjZCRVx1MjZDNFx1MjZDOFx1MjZDRlx1MjZEMVx1MjZFOVx1MjZGMC1cdTI2RjVcdTI2RjdcdTI2RjhcdTI2RkFcdTI3MDJcdTI3MDhcdTI3MDlcdTI3MEZcdTI3MTJcdTI3MTRcdTI3MTZcdTI3MURcdTI3MjFcdTI3MzNcdTI3MzRcdTI3NDRcdTI3NDdcdTI3NTdcdTI3NjNcdTI3QTFcdTI5MzRcdTI5MzVcdTJCMDUtXHUyQjA3XHUyQjFCXHUyQjFDXHUyQjU1XHUzMDMwXHUzMDNEXHUzMjk3XHUzMjk5XVx1RkUwRj98W1x1MjYxRFx1MjcwQ1x1MjcwRF0oPzpcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVGRTBGKT98W1x1MjcwQVx1MjcwQl0oPzpcdUQ4M0NbXHVERkZCLVx1REZGRl0pP3xbXHUyM0U5LVx1MjNFQ1x1MjNGMFx1MjNGM1x1MjVGRFx1MjY5M1x1MjZBMVx1MjZBQlx1MjZDNVx1MjZDRVx1MjZENFx1MjZFQVx1MjZGRFx1MjcwNVx1MjcyOFx1Mjc0Q1x1Mjc0RVx1Mjc1My1cdTI3NTVcdTI3OTUtXHUyNzk3XHUyN0IwXHUyN0JGXHUyQjUwXXxcdTI2RDNcdUZFMEY/KD86XHUyMDBEXHVEODNEXHVEQ0E1KT98XHUyNkY5KD86XHVEODNDW1x1REZGQi1cdURGRkZdfFx1RkUwRik/KD86XHUyMDBEW1x1MjY0MFx1MjY0Ml1cdUZFMEY/KT98XHUyNzY0XHVGRTBGPyg/Olx1MjAwRCg/Olx1RDgzRFx1REQyNXxcdUQ4M0VcdURFNzkpKT98XHVEODNDKD86W1x1REMwNFx1REQ3MFx1REQ3MVx1REQ3RVx1REQ3Rlx1REUwMlx1REUzN1x1REYyMVx1REYyNC1cdURGMkNcdURGMzZcdURGN0RcdURGOTZcdURGOTdcdURGOTktXHVERjlCXHVERjlFXHVERjlGXHVERkNEXHVERkNFXHVERkQ0LVx1REZERlx1REZGNVx1REZGN11cdUZFMEY/fFtcdURGODVcdURGQzJcdURGQzddKD86XHVEODNDW1x1REZGQi1cdURGRkZdKT98W1x1REZDNFx1REZDQV0oPzpcdUQ4M0NbXHVERkZCLVx1REZGRl0pPyg/Olx1MjAwRFtcdTI2NDBcdTI2NDJdXHVGRTBGPyk/fFtcdURGQ0JcdURGQ0NdKD86XHVEODNDW1x1REZGQi1cdURGRkZdfFx1RkUwRik/KD86XHUyMDBEW1x1MjY0MFx1MjY0Ml1cdUZFMEY/KT98W1x1RENDRlx1REQ4RVx1REQ5MS1cdUREOUFcdURFMDFcdURFMUFcdURFMkZcdURFMzItXHVERTM2XHVERTM4LVx1REUzQVx1REU1MFx1REU1MVx1REYwMC1cdURGMjBcdURGMkQtXHVERjM1XHVERjM3LVx1REY0M1x1REY0NS1cdURGNEFcdURGNEMtXHVERjdDXHVERjdFLVx1REY4NFx1REY4Ni1cdURGOTNcdURGQTAtXHVERkMxXHVERkM1XHVERkM2XHVERkM4XHVERkM5XHVERkNGLVx1REZEM1x1REZFMC1cdURGRjBcdURGRjgtXHVERkZGXXxcdURERTZcdUQ4M0NbXHVEREU4LVx1RERFQ1x1RERFRVx1RERGMVx1RERGMlx1RERGNFx1RERGNi1cdURERkFcdURERkNcdURERkRcdURERkZdfFx1RERFN1x1RDgzQ1tcdURERTZcdURERTdcdURERTktXHVEREVGXHVEREYxLVx1RERGNFx1RERGNi1cdURERjlcdURERkJcdURERkNcdURERkVcdURERkZdfFx1RERFOFx1RDgzQ1tcdURERTZcdURERThcdURERTlcdURERUItXHVEREVFXHVEREYwLVx1RERGN1x1RERGQS1cdURERkZdfFx1RERFOVx1RDgzQ1tcdURERUFcdURERUNcdURERUZcdURERjBcdURERjJcdURERjRcdURERkZdfFx1RERFQVx1RDgzQ1tcdURERTZcdURERThcdURERUFcdURERUNcdURERURcdURERjctXHVEREZBXXxcdURERUJcdUQ4M0NbXHVEREVFLVx1RERGMFx1RERGMlx1RERGNFx1RERGN118XHVEREVDXHVEODNDW1x1RERFNlx1RERFN1x1RERFOS1cdURERUVcdURERjEtXHVEREYzXHVEREY1LVx1RERGQVx1RERGQ1x1RERGRV18XHVEREVEXHVEODNDW1x1RERGMFx1RERGMlx1RERGM1x1RERGN1x1RERGOVx1RERGQV18XHVEREVFXHVEODNDW1x1RERFOC1cdURERUFcdURERjEtXHVEREY0XHVEREY2LVx1RERGOV18XHVEREVGXHVEODNDW1x1RERFQVx1RERGMlx1RERGNFx1RERGNV18XHVEREYwXHVEODNDW1x1RERFQVx1RERFQy1cdURERUVcdURERjJcdURERjNcdURERjVcdURERjdcdURERkNcdURERkVcdURERkZdfFx1RERGMVx1RDgzQ1tcdURERTYtXHVEREU4XHVEREVFXHVEREYwXHVEREY3LVx1RERGQlx1RERGRV18XHVEREYyXHVEODNDW1x1RERFNlx1RERFOC1cdURERURcdURERjAtXHVEREZGXXxcdURERjNcdUQ4M0NbXHVEREU2XHVEREU4XHVEREVBLVx1RERFQ1x1RERFRVx1RERGMVx1RERGNFx1RERGNVx1RERGN1x1RERGQVx1RERGRl18XHVEREY0XHVEODNDXHVEREYyfFx1RERGNVx1RDgzQ1tcdURERTZcdURERUEtXHVEREVEXHVEREYwLVx1RERGM1x1RERGNy1cdURERjlcdURERkNcdURERkVdfFx1RERGNlx1RDgzQ1x1RERFNnxcdURERjdcdUQ4M0NbXHVEREVBXHVEREY0XHVEREY4XHVEREZBXHVEREZDXXxcdURERjhcdUQ4M0NbXHVEREU2LVx1RERFQVx1RERFQy1cdURERjRcdURERjctXHVEREY5XHVEREZCXHVEREZELVx1RERGRl18XHVEREY5XHVEODNDW1x1RERFNlx1RERFOFx1RERFOVx1RERFQi1cdURERURcdURERUYtXHVEREY0XHVEREY3XHVEREY5XHVEREZCXHVEREZDXHVEREZGXXxcdURERkFcdUQ4M0NbXHVEREU2XHVEREVDXHVEREYyXHVEREYzXHVEREY4XHVEREZFXHVEREZGXXxcdURERkJcdUQ4M0NbXHVEREU2XHVEREU4XHVEREVBXHVEREVDXHVEREVFXHVEREYzXHVEREZBXXxcdURERkNcdUQ4M0NbXHVEREVCXHVEREY4XXxcdURERkRcdUQ4M0NcdURERjB8XHVEREZFXHVEODNDW1x1RERFQVx1RERGOV18XHVEREZGXHVEODNDW1x1RERFNlx1RERGMlx1RERGQ118XHVERjQ0KD86XHUyMDBEXHVEODNEXHVERkVCKT98XHVERjRCKD86XHUyMDBEXHVEODNEXHVERkU5KT98XHVERkMzKD86XHVEODNDW1x1REZGQi1cdURGRkZdKT8oPzpcdTIwMEQoPzpbXHUyNjQwXHUyNjQyXVx1RkUwRj8oPzpcdTIwMERcdTI3QTFcdUZFMEY/KT98XHUyN0ExXHVGRTBGPykpP3xcdURGRjNcdUZFMEY/KD86XHUyMDBEKD86XHUyNkE3XHVGRTBGP3xcdUQ4M0NcdURGMDgpKT98XHVERkY0KD86XHUyMDBEXHUyNjIwXHVGRTBGP3xcdURCNDBcdURDNjdcdURCNDBcdURDNjJcdURCNDAoPzpcdURDNjVcdURCNDBcdURDNkVcdURCNDBcdURDNjd8XHVEQzczXHVEQjQwXHVEQzYzXHVEQjQwXHVEQzc0fFx1REM3N1x1REI0MFx1REM2Q1x1REI0MFx1REM3MylcdURCNDBcdURDN0YpPyl8XHVEODNEKD86W1x1REMzRlx1RENGRFx1REQ0OVx1REQ0QVx1REQ2Rlx1REQ3MFx1REQ3M1x1REQ3Ni1cdURENzlcdUREODdcdUREOEEtXHVERDhEXHVEREE1XHVEREE4XHVEREIxXHVEREIyXHVEREJDXHVEREMyLVx1RERDNFx1REREMS1cdURERDNcdUREREMtXHVERERFXHVEREUxXHVEREUzXHVEREU4XHVEREVGXHVEREYzXHVEREZBXHVERUNCXHVERUNELVx1REVDRlx1REVFMC1cdURFRTVcdURFRTlcdURFRjBcdURFRjNdXHVGRTBGP3xbXHVEQzQyXHVEQzQzXHVEQzQ2LVx1REM1MFx1REM2Nlx1REM2N1x1REM2Qi1cdURDNkRcdURDNzJcdURDNzQtXHVEQzc2XHVEQzc4XHVEQzdDXHVEQzgzXHVEQzg1XHVEQzhGXHVEQzkxXHVEQ0FBXHVERDdBXHVERDk1XHVERDk2XHVERTRDXHVERTRGXHVERUMwXHVERUNDXSg/Olx1RDgzQ1tcdURGRkItXHVERkZGXSk/fFtcdURDNkUtXHVEQzcxXHVEQzczXHVEQzc3XHVEQzgxXHVEQzgyXHVEQzg2XHVEQzg3XHVERTQ1LVx1REU0N1x1REU0Qlx1REU0RFx1REU0RVx1REVBM1x1REVCNFx1REVCNV0oPzpcdUQ4M0NbXHVERkZCLVx1REZGRl0pPyg/Olx1MjAwRFtcdTI2NDBcdTI2NDJdXHVGRTBGPyk/fFtcdURENzRcdUREOTBdKD86XHVEODNDW1x1REZGQi1cdURGRkZdfFx1RkUwRik/fFtcdURDMDAtXHVEQzA3XHVEQzA5LVx1REMxNFx1REMxNi1cdURDMjVcdURDMjctXHVEQzNBXHVEQzNDLVx1REMzRVx1REM0MFx1REM0NFx1REM0NVx1REM1MS1cdURDNjVcdURDNkFcdURDNzktXHVEQzdCXHVEQzdELVx1REM4MFx1REM4NFx1REM4OC1cdURDOEVcdURDOTBcdURDOTItXHVEQ0E5XHVEQ0FCLVx1RENGQ1x1RENGRi1cdUREM0RcdURENEItXHVERDRFXHVERDUwLVx1REQ2N1x1RERBNFx1RERGQi1cdURFMkRcdURFMkYtXHVERTM0XHVERTM3LVx1REU0MVx1REU0M1x1REU0NFx1REU0OC1cdURFNEFcdURFODAtXHVERUEyXHVERUE0LVx1REVCM1x1REVCNy1cdURFQkZcdURFQzEtXHVERUM1XHVERUQwLVx1REVEMlx1REVENS1cdURFRDhcdURFREMtXHVERURGXHVERUVCXHVERUVDXHVERUY0LVx1REVGQ1x1REZFMC1cdURGRUJcdURGRjBdfFx1REMwOCg/Olx1MjAwRFx1MkIxQik/fFx1REMxNSg/Olx1MjAwRFx1RDgzRVx1RERCQSk/fFx1REMyNig/Olx1MjAwRCg/Olx1MkIxQnxcdUQ4M0RcdUREMjUpKT98XHVEQzNCKD86XHUyMDBEXHUyNzQ0XHVGRTBGPyk/fFx1REM0MVx1RkUwRj8oPzpcdTIwMERcdUQ4M0RcdURERThcdUZFMEY/KT98XHVEQzY4KD86XHUyMDBEKD86W1x1MjY5NVx1MjY5Nlx1MjcwOF1cdUZFMEY/fFx1Mjc2NFx1RkUwRj9cdTIwMERcdUQ4M0QoPzpcdURDOEJcdTIwMERcdUQ4M0QpP1x1REM2OHxcdUQ4M0NbXHVERjNFXHVERjczXHVERjdDXHVERjkzXHVERkE0XHVERkE4XHVERkVCXHVERkVEXXxcdUQ4M0QoPzpbXHVEQzY4XHVEQzY5XVx1MjAwRFx1RDgzRCg/Olx1REM2Nig/Olx1MjAwRFx1RDgzRFx1REM2Nik/fFx1REM2Nyg/Olx1MjAwRFx1RDgzRFtcdURDNjZcdURDNjddKT8pfFtcdURDQkJcdURDQkNcdUREMjdcdUREMkNcdURFODBcdURFOTJdfFx1REM2Nig/Olx1MjAwRFx1RDgzRFx1REM2Nik/fFx1REM2Nyg/Olx1MjAwRFx1RDgzRFtcdURDNjZcdURDNjddKT8pfFx1RDgzRSg/OltcdUREQUZcdUREQkNcdUREQkRdKD86XHUyMDBEXHUyN0ExXHVGRTBGPyk/fFtcdUREQjAtXHVEREIzXSkpfFx1RDgzQyg/Olx1REZGQig/Olx1MjAwRCg/OltcdTI2OTVcdTI2OTZcdTI3MDhdXHVGRTBGP3xcdTI3NjRcdUZFMEY/XHUyMDBEXHVEODNEKD86XHVEQzhCXHUyMDBEXHVEODNEKT9cdURDNjhcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVEODNDW1x1REYzRVx1REY3M1x1REY3Q1x1REY5M1x1REZBNFx1REZBOFx1REZFQlx1REZFRF18XHVEODNEKD86W1x1RENCQlx1RENCQ1x1REQyN1x1REQyQ1x1REU4MFx1REU5Ml18XHVEQzMwXHUyMDBEXHVEODNEXHVEQzY4XHVEODNDW1x1REZGQy1cdURGRkZdKXxcdUQ4M0UoPzpbXHVERDFEXHVERUVGXVx1MjAwRFx1RDgzRFx1REM2OFx1RDgzQ1tcdURGRkMtXHVERkZGXXxbXHVEREFGXHVEREJDXHVEREJEXSg/Olx1MjAwRFx1MjdBMVx1RkUwRj8pP3xbXHVEREIwLVx1RERCM10pKSk/fFx1REZGQyg/Olx1MjAwRCg/OltcdTI2OTVcdTI2OTZcdTI3MDhdXHVGRTBGP3xcdTI3NjRcdUZFMEY/XHUyMDBEXHVEODNEKD86XHVEQzhCXHUyMDBEXHVEODNEKT9cdURDNjhcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVEODNDW1x1REYzRVx1REY3M1x1REY3Q1x1REY5M1x1REZBNFx1REZBOFx1REZFQlx1REZFRF18XHVEODNEKD86W1x1RENCQlx1RENCQ1x1REQyN1x1REQyQ1x1REU4MFx1REU5Ml18XHVEQzMwXHUyMDBEXHVEODNEXHVEQzY4XHVEODNDW1x1REZGQlx1REZGRC1cdURGRkZdKXxcdUQ4M0UoPzpbXHVERDFEXHVERUVGXVx1MjAwRFx1RDgzRFx1REM2OFx1RDgzQ1tcdURGRkJcdURGRkQtXHVERkZGXXxbXHVEREFGXHVEREJDXHVEREJEXSg/Olx1MjAwRFx1MjdBMVx1RkUwRj8pP3xbXHVEREIwLVx1RERCM10pKSk/fFx1REZGRCg/Olx1MjAwRCg/OltcdTI2OTVcdTI2OTZcdTI3MDhdXHVGRTBGP3xcdTI3NjRcdUZFMEY/XHUyMDBEXHVEODNEKD86XHVEQzhCXHUyMDBEXHVEODNEKT9cdURDNjhcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVEODNDW1x1REYzRVx1REY3M1x1REY3Q1x1REY5M1x1REZBNFx1REZBOFx1REZFQlx1REZFRF18XHVEODNEKD86W1x1RENCQlx1RENCQ1x1REQyN1x1REQyQ1x1REU4MFx1REU5Ml18XHVEQzMwXHUyMDBEXHVEODNEXHVEQzY4XHVEODNDW1x1REZGQlx1REZGQ1x1REZGRVx1REZGRl0pfFx1RDgzRSg/OltcdUREMURcdURFRUZdXHUyMDBEXHVEODNEXHVEQzY4XHVEODNDW1x1REZGQlx1REZGQ1x1REZGRVx1REZGRl18W1x1RERBRlx1RERCQ1x1RERCRF0oPzpcdTIwMERcdTI3QTFcdUZFMEY/KT98W1x1RERCMC1cdUREQjNdKSkpP3xcdURGRkUoPzpcdTIwMEQoPzpbXHUyNjk1XHUyNjk2XHUyNzA4XVx1RkUwRj98XHUyNzY0XHVGRTBGP1x1MjAwRFx1RDgzRCg/Olx1REM4Qlx1MjAwRFx1RDgzRCk/XHVEQzY4XHVEODNDW1x1REZGQi1cdURGRkZdfFx1RDgzQ1tcdURGM0VcdURGNzNcdURGN0NcdURGOTNcdURGQTRcdURGQThcdURGRUJcdURGRURdfFx1RDgzRCg/OltcdURDQkJcdURDQkNcdUREMjdcdUREMkNcdURFODBcdURFOTJdfFx1REMzMFx1MjAwRFx1RDgzRFx1REM2OFx1RDgzQ1tcdURGRkItXHVERkZEXHVERkZGXSl8XHVEODNFKD86W1x1REQxRFx1REVFRl1cdTIwMERcdUQ4M0RcdURDNjhcdUQ4M0NbXHVERkZCLVx1REZGRFx1REZGRl18W1x1RERBRlx1RERCQ1x1RERCRF0oPzpcdTIwMERcdTI3QTFcdUZFMEY/KT98W1x1RERCMC1cdUREQjNdKSkpP3xcdURGRkYoPzpcdTIwMEQoPzpbXHUyNjk1XHUyNjk2XHUyNzA4XVx1RkUwRj98XHUyNzY0XHVGRTBGP1x1MjAwRFx1RDgzRCg/Olx1REM4Qlx1MjAwRFx1RDgzRCk/XHVEQzY4XHVEODNDW1x1REZGQi1cdURGRkZdfFx1RDgzQ1tcdURGM0VcdURGNzNcdURGN0NcdURGOTNcdURGQTRcdURGQThcdURGRUJcdURGRURdfFx1RDgzRCg/OltcdURDQkJcdURDQkNcdUREMjdcdUREMkNcdURFODBcdURFOTJdfFx1REMzMFx1MjAwRFx1RDgzRFx1REM2OFx1RDgzQ1tcdURGRkItXHVERkZFXSl8XHVEODNFKD86W1x1REQxRFx1REVFRl1cdTIwMERcdUQ4M0RcdURDNjhcdUQ4M0NbXHVERkZCLVx1REZGRV18W1x1RERBRlx1RERCQ1x1RERCRF0oPzpcdTIwMERcdTI3QTFcdUZFMEY/KT98W1x1RERCMC1cdUREQjNdKSkpPykpP3xcdURDNjkoPzpcdTIwMEQoPzpbXHUyNjk1XHUyNjk2XHUyNzA4XVx1RkUwRj98XHUyNzY0XHVGRTBGP1x1MjAwRFx1RDgzRCg/Olx1REM4Qlx1MjAwRFx1RDgzRCk/W1x1REM2OFx1REM2OV18XHVEODNDW1x1REYzRVx1REY3M1x1REY3Q1x1REY5M1x1REZBNFx1REZBOFx1REZFQlx1REZFRF18XHVEODNEKD86W1x1RENCQlx1RENCQ1x1REQyN1x1REQyQ1x1REU4MFx1REU5Ml18XHVEQzY2KD86XHUyMDBEXHVEODNEXHVEQzY2KT98XHVEQzY3KD86XHUyMDBEXHVEODNEW1x1REM2Nlx1REM2N10pP3xcdURDNjlcdTIwMERcdUQ4M0QoPzpcdURDNjYoPzpcdTIwMERcdUQ4M0RcdURDNjYpP3xcdURDNjcoPzpcdTIwMERcdUQ4M0RbXHVEQzY2XHVEQzY3XSk/KSl8XHVEODNFKD86W1x1RERBRlx1RERCQ1x1RERCRF0oPzpcdTIwMERcdTI3QTFcdUZFMEY/KT98W1x1RERCMC1cdUREQjNdKSl8XHVEODNDKD86XHVERkZCKD86XHUyMDBEKD86W1x1MjY5NVx1MjY5Nlx1MjcwOF1cdUZFMEY/fFx1Mjc2NFx1RkUwRj9cdTIwMERcdUQ4M0QoPzpbXHVEQzY4XHVEQzY5XXxcdURDOEJcdTIwMERcdUQ4M0RbXHVEQzY4XHVEQzY5XSlcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVEODNDW1x1REYzRVx1REY3M1x1REY3Q1x1REY5M1x1REZBNFx1REZBOFx1REZFQlx1REZFRF18XHVEODNEKD86W1x1RENCQlx1RENCQ1x1REQyN1x1REQyQ1x1REU4MFx1REU5Ml18XHVEQzMwXHUyMDBEXHVEODNEXHVEQzY5XHVEODNDW1x1REZGQy1cdURGRkZdKXxcdUQ4M0UoPzpbXHVEREFGXHVEREJDXHVEREJEXSg/Olx1MjAwRFx1MjdBMVx1RkUwRj8pP3xbXHVEREIwLVx1RERCM118XHVERDFEXHUyMDBEXHVEODNEW1x1REM2OFx1REM2OV1cdUQ4M0NbXHVERkZDLVx1REZGRl18XHVERUVGXHUyMDBEXHVEODNEXHVEQzY5XHVEODNDW1x1REZGQy1cdURGRkZdKSkpP3xcdURGRkMoPzpcdTIwMEQoPzpbXHUyNjk1XHUyNjk2XHUyNzA4XVx1RkUwRj98XHUyNzY0XHVGRTBGP1x1MjAwRFx1RDgzRCg/OltcdURDNjhcdURDNjldfFx1REM4Qlx1MjAwRFx1RDgzRFtcdURDNjhcdURDNjldKVx1RDgzQ1tcdURGRkItXHVERkZGXXxcdUQ4M0NbXHVERjNFXHVERjczXHVERjdDXHVERjkzXHVERkE0XHVERkE4XHVERkVCXHVERkVEXXxcdUQ4M0QoPzpbXHVEQ0JCXHVEQ0JDXHVERDI3XHVERDJDXHVERTgwXHVERTkyXXxcdURDMzBcdTIwMERcdUQ4M0RcdURDNjlcdUQ4M0NbXHVERkZCXHVERkZELVx1REZGRl0pfFx1RDgzRSg/OltcdUREQUZcdUREQkNcdUREQkRdKD86XHUyMDBEXHUyN0ExXHVGRTBGPyk/fFtcdUREQjAtXHVEREIzXXxcdUREMURcdTIwMERcdUQ4M0RbXHVEQzY4XHVEQzY5XVx1RDgzQ1tcdURGRkJcdURGRkQtXHVERkZGXXxcdURFRUZcdTIwMERcdUQ4M0RcdURDNjlcdUQ4M0NbXHVERkZCXHVERkZELVx1REZGRl0pKSk/fFx1REZGRCg/Olx1MjAwRCg/OltcdTI2OTVcdTI2OTZcdTI3MDhdXHVGRTBGP3xcdTI3NjRcdUZFMEY/XHUyMDBEXHVEODNEKD86W1x1REM2OFx1REM2OV18XHVEQzhCXHUyMDBEXHVEODNEW1x1REM2OFx1REM2OV0pXHVEODNDW1x1REZGQi1cdURGRkZdfFx1RDgzQ1tcdURGM0VcdURGNzNcdURGN0NcdURGOTNcdURGQTRcdURGQThcdURGRUJcdURGRURdfFx1RDgzRCg/OltcdURDQkJcdURDQkNcdUREMjdcdUREMkNcdURFODBcdURFOTJdfFx1REMzMFx1MjAwRFx1RDgzRFx1REM2OVx1RDgzQ1tcdURGRkJcdURGRkNcdURGRkVcdURGRkZdKXxcdUQ4M0UoPzpbXHVEREFGXHVEREJDXHVEREJEXSg/Olx1MjAwRFx1MjdBMVx1RkUwRj8pP3xbXHVEREIwLVx1RERCM118XHVERDFEXHUyMDBEXHVEODNEW1x1REM2OFx1REM2OV1cdUQ4M0NbXHVERkZCXHVERkZDXHVERkZFXHVERkZGXXxcdURFRUZcdTIwMERcdUQ4M0RcdURDNjlcdUQ4M0NbXHVERkZCXHVERkZDXHVERkZFXHVERkZGXSkpKT98XHVERkZFKD86XHUyMDBEKD86W1x1MjY5NVx1MjY5Nlx1MjcwOF1cdUZFMEY/fFx1Mjc2NFx1RkUwRj9cdTIwMERcdUQ4M0QoPzpbXHVEQzY4XHVEQzY5XXxcdURDOEJcdTIwMERcdUQ4M0RbXHVEQzY4XHVEQzY5XSlcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVEODNDW1x1REYzRVx1REY3M1x1REY3Q1x1REY5M1x1REZBNFx1REZBOFx1REZFQlx1REZFRF18XHVEODNEKD86W1x1RENCQlx1RENCQ1x1REQyN1x1REQyQ1x1REU4MFx1REU5Ml18XHVEQzMwXHUyMDBEXHVEODNEXHVEQzY5XHVEODNDW1x1REZGQi1cdURGRkRcdURGRkZdKXxcdUQ4M0UoPzpbXHVEREFGXHVEREJDXHVEREJEXSg/Olx1MjAwRFx1MjdBMVx1RkUwRj8pP3xbXHVEREIwLVx1RERCM118XHVERDFEXHUyMDBEXHVEODNEW1x1REM2OFx1REM2OV1cdUQ4M0NbXHVERkZCLVx1REZGRFx1REZGRl18XHVERUVGXHUyMDBEXHVEODNEXHVEQzY5XHVEODNDW1x1REZGQi1cdURGRkRcdURGRkZdKSkpP3xcdURGRkYoPzpcdTIwMEQoPzpbXHUyNjk1XHUyNjk2XHUyNzA4XVx1RkUwRj98XHUyNzY0XHVGRTBGP1x1MjAwRFx1RDgzRCg/OltcdURDNjhcdURDNjldfFx1REM4Qlx1MjAwRFx1RDgzRFtcdURDNjhcdURDNjldKVx1RDgzQ1tcdURGRkItXHVERkZGXXxcdUQ4M0NbXHVERjNFXHVERjczXHVERjdDXHVERjkzXHVERkE0XHVERkE4XHVERkVCXHVERkVEXXxcdUQ4M0QoPzpbXHVEQ0JCXHVEQ0JDXHVERDI3XHVERDJDXHVERTgwXHVERTkyXXxcdURDMzBcdTIwMERcdUQ4M0RcdURDNjlcdUQ4M0NbXHVERkZCLVx1REZGRV0pfFx1RDgzRSg/OltcdUREQUZcdUREQkNcdUREQkRdKD86XHUyMDBEXHUyN0ExXHVGRTBGPyk/fFtcdUREQjAtXHVEREIzXXxcdUREMURcdTIwMERcdUQ4M0RbXHVEQzY4XHVEQzY5XVx1RDgzQ1tcdURGRkItXHVERkZFXXxcdURFRUZcdTIwMERcdUQ4M0RcdURDNjlcdUQ4M0NbXHVERkZCLVx1REZGRV0pKSk/KSk/fFx1REQ3NSg/Olx1RDgzQ1tcdURGRkItXHVERkZGXXxcdUZFMEYpPyg/Olx1MjAwRFtcdTI2NDBcdTI2NDJdXHVGRTBGPyk/fFx1REUyRSg/Olx1MjAwRFx1RDgzRFx1RENBOCk/fFx1REUzNSg/Olx1MjAwRFx1RDgzRFx1RENBQik/fFx1REUzNig/Olx1MjAwRFx1RDgzQ1x1REYyQlx1RkUwRj8pP3xcdURFNDIoPzpcdTIwMERbXHUyMTk0XHUyMTk1XVx1RkUwRj8pP3xcdURFQjYoPzpcdUQ4M0NbXHVERkZCLVx1REZGRl0pPyg/Olx1MjAwRCg/OltcdTI2NDBcdTI2NDJdXHVGRTBGPyg/Olx1MjAwRFx1MjdBMVx1RkUwRj8pP3xcdTI3QTFcdUZFMEY/KSk/KXxcdUQ4M0UoPzpbXHVERDBDXHVERDBGXHVERDE4LVx1REQxRlx1REQzMC1cdUREMzRcdUREMzZcdURENzdcdUREQjVcdUREQjZcdUREQkJcdURERDJcdURERDNcdURERDVcdURFQzMtXHVERUM1XHVERUYwXHVERUYyLVx1REVGOF0oPzpcdUQ4M0NbXHVERkZCLVx1REZGRl0pP3xbXHVERDI2XHVERDM1XHVERDM3LVx1REQzOVx1REQzQy1cdUREM0VcdUREQjhcdUREQjlcdUREQ0RcdUREQ0ZcdURERDRcdURERDYtXHVEREREXSg/Olx1RDgzQ1tcdURGRkItXHVERkZGXSk/KD86XHUyMDBEW1x1MjY0MFx1MjY0Ml1cdUZFMEY/KT98W1x1RERERVx1RERERl0oPzpcdTIwMERbXHUyNjQwXHUyNjQyXVx1RkUwRj8pP3xbXHVERDBEXHVERDBFXHVERDEwLVx1REQxN1x1REQyMC1cdUREMjVcdUREMjctXHVERDJGXHVERDNBXHVERDNGLVx1REQ0NVx1REQ0Ny1cdURENzZcdURENzgtXHVEREI0XHVEREI3XHVEREJBXHVEREJDLVx1RERDQ1x1REREMFx1RERFMC1cdURERkZcdURFNzAtXHVERTdDXHVERTgwLVx1REU4QVx1REU4RS1cdURFQzJcdURFQzZcdURFQzhcdURFQ0QtXHVERURDXHVERURGLVx1REVFQVx1REVFRl18XHVERENFKD86XHVEODNDW1x1REZGQi1cdURGRkZdKT8oPzpcdTIwMEQoPzpbXHUyNjQwXHUyNjQyXVx1RkUwRj8oPzpcdTIwMERcdTI3QTFcdUZFMEY/KT98XHUyN0ExXHVGRTBGPykpP3xcdURERDEoPzpcdTIwMEQoPzpbXHUyNjk1XHUyNjk2XHUyNzA4XVx1RkUwRj98XHVEODNDW1x1REYzRVx1REY3M1x1REY3Q1x1REY4NFx1REY5M1x1REZBNFx1REZBOFx1REZFQlx1REZFRF18XHVEODNEW1x1RENCQlx1RENCQ1x1REQyN1x1REQyQ1x1REU4MFx1REU5Ml18XHVEODNFKD86W1x1RERBRlx1RERCQ1x1RERCRF0oPzpcdTIwMERcdTI3QTFcdUZFMEY/KT98W1x1RERCMC1cdUREQjNcdURFNzBdfFx1REQxRFx1MjAwRFx1RDgzRVx1REREMXxcdURERDFcdTIwMERcdUQ4M0VcdURERDIoPzpcdTIwMERcdUQ4M0VcdURERDIpP3xcdURERDIoPzpcdTIwMERcdUQ4M0VcdURERDIpPykpfFx1RDgzQyg/Olx1REZGQig/Olx1MjAwRCg/OltcdTI2OTVcdTI2OTZcdTI3MDhdXHVGRTBGP3xcdTI3NjRcdUZFMEY/XHUyMDBEKD86XHVEODNEXHVEQzhCXHUyMDBEKT9cdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZDLVx1REZGRl18XHVEODNDW1x1REYzRVx1REY3M1x1REY3Q1x1REY4NFx1REY5M1x1REZBNFx1REZBOFx1REZFQlx1REZFRF18XHVEODNEKD86W1x1RENCQlx1RENCQ1x1REQyN1x1REQyQ1x1REU4MFx1REU5Ml18XHVEQzMwXHUyMDBEXHVEODNFXHVEREQxXHVEODNDW1x1REZGQy1cdURGRkZdKXxcdUQ4M0UoPzpbXHVEREFGXHVEREJDXHVEREJEXSg/Olx1MjAwRFx1MjdBMVx1RkUwRj8pP3xbXHVEREIwLVx1RERCM1x1REU3MF18XHVERDFEXHUyMDBEXHVEODNFXHVEREQxXHVEODNDW1x1REZGQi1cdURGRkZdfFx1REVFRlx1MjAwRFx1RDgzRVx1REREMVx1RDgzQ1tcdURGRkMtXHVERkZGXSkpKT98XHVERkZDKD86XHUyMDBEKD86W1x1MjY5NVx1MjY5Nlx1MjcwOF1cdUZFMEY/fFx1Mjc2NFx1RkUwRj9cdTIwMEQoPzpcdUQ4M0RcdURDOEJcdTIwMEQpP1x1RDgzRVx1REREMVx1RDgzQ1tcdURGRkJcdURGRkQtXHVERkZGXXxcdUQ4M0NbXHVERjNFXHVERjczXHVERjdDXHVERjg0XHVERjkzXHVERkE0XHVERkE4XHVERkVCXHVERkVEXXxcdUQ4M0QoPzpbXHVEQ0JCXHVEQ0JDXHVERDI3XHVERDJDXHVERTgwXHVERTkyXXxcdURDMzBcdTIwMERcdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZCXHVERkZELVx1REZGRl0pfFx1RDgzRSg/OltcdUREQUZcdUREQkNcdUREQkRdKD86XHUyMDBEXHUyN0ExXHVGRTBGPyk/fFtcdUREQjAtXHVEREIzXHVERTcwXXxcdUREMURcdTIwMERcdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVERUVGXHUyMDBEXHVEODNFXHVEREQxXHVEODNDW1x1REZGQlx1REZGRC1cdURGRkZdKSkpP3xcdURGRkQoPzpcdTIwMEQoPzpbXHUyNjk1XHUyNjk2XHUyNzA4XVx1RkUwRj98XHUyNzY0XHVGRTBGP1x1MjAwRCg/Olx1RDgzRFx1REM4Qlx1MjAwRCk/XHVEODNFXHVEREQxXHVEODNDW1x1REZGQlx1REZGQ1x1REZGRVx1REZGRl18XHVEODNDW1x1REYzRVx1REY3M1x1REY3Q1x1REY4NFx1REY5M1x1REZBNFx1REZBOFx1REZFQlx1REZFRF18XHVEODNEKD86W1x1RENCQlx1RENCQ1x1REQyN1x1REQyQ1x1REU4MFx1REU5Ml18XHVEQzMwXHUyMDBEXHVEODNFXHVEREQxXHVEODNDW1x1REZGQlx1REZGQ1x1REZGRVx1REZGRl0pfFx1RDgzRSg/OltcdUREQUZcdUREQkNcdUREQkRdKD86XHUyMDBEXHUyN0ExXHVGRTBGPyk/fFtcdUREQjAtXHVEREIzXHVERTcwXXxcdUREMURcdTIwMERcdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVERUVGXHUyMDBEXHVEODNFXHVEREQxXHVEODNDW1x1REZGQlx1REZGQ1x1REZGRVx1REZGRl0pKSk/fFx1REZGRSg/Olx1MjAwRCg/OltcdTI2OTVcdTI2OTZcdTI3MDhdXHVGRTBGP3xcdTI3NjRcdUZFMEY/XHUyMDBEKD86XHVEODNEXHVEQzhCXHUyMDBEKT9cdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZCLVx1REZGRFx1REZGRl18XHVEODNDW1x1REYzRVx1REY3M1x1REY3Q1x1REY4NFx1REY5M1x1REZBNFx1REZBOFx1REZFQlx1REZFRF18XHVEODNEKD86W1x1RENCQlx1RENCQ1x1REQyN1x1REQyQ1x1REU4MFx1REU5Ml18XHVEQzMwXHUyMDBEXHVEODNFXHVEREQxXHVEODNDW1x1REZGQi1cdURGRkRcdURGRkZdKXxcdUQ4M0UoPzpbXHVEREFGXHVEREJDXHVEREJEXSg/Olx1MjAwRFx1MjdBMVx1RkUwRj8pP3xbXHVEREIwLVx1RERCM1x1REU3MF18XHVERDFEXHUyMDBEXHVEODNFXHVEREQxXHVEODNDW1x1REZGQi1cdURGRkZdfFx1REVFRlx1MjAwRFx1RDgzRVx1REREMVx1RDgzQ1tcdURGRkItXHVERkZEXHVERkZGXSkpKT98XHVERkZGKD86XHUyMDBEKD86W1x1MjY5NVx1MjY5Nlx1MjcwOF1cdUZFMEY/fFx1Mjc2NFx1RkUwRj9cdTIwMEQoPzpcdUQ4M0RcdURDOEJcdTIwMEQpP1x1RDgzRVx1REREMVx1RDgzQ1tcdURGRkItXHVERkZFXXxcdUQ4M0NbXHVERjNFXHVERjczXHVERjdDXHVERjg0XHVERjkzXHVERkE0XHVERkE4XHVERkVCXHVERkVEXXxcdUQ4M0QoPzpbXHVEQ0JCXHVEQ0JDXHVERDI3XHVERDJDXHVERTgwXHVERTkyXXxcdURDMzBcdTIwMERcdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZCLVx1REZGRV0pfFx1RDgzRSg/OltcdUREQUZcdUREQkNcdUREQkRdKD86XHUyMDBEXHUyN0ExXHVGRTBGPyk/fFtcdUREQjAtXHVEREIzXHVERTcwXXxcdUREMURcdTIwMERcdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVERUVGXHUyMDBEXHVEODNFXHVEREQxXHVEODNDW1x1REZGQi1cdURGRkVdKSkpPykpP3xcdURFRjEoPzpcdUQ4M0MoPzpcdURGRkIoPzpcdTIwMERcdUQ4M0VcdURFRjJcdUQ4M0NbXHVERkZDLVx1REZGRl0pP3xcdURGRkMoPzpcdTIwMERcdUQ4M0VcdURFRjJcdUQ4M0NbXHVERkZCXHVERkZELVx1REZGRl0pP3xcdURGRkQoPzpcdTIwMERcdUQ4M0VcdURFRjJcdUQ4M0NbXHVERkZCXHVERkZDXHVERkZFXHVERkZGXSk/fFx1REZGRSg/Olx1MjAwRFx1RDgzRVx1REVGMlx1RDgzQ1tcdURGRkItXHVERkZEXHVERkZGXSk/fFx1REZGRig/Olx1MjAwRFx1RDgzRVx1REVGMlx1RDgzQ1tcdURGRkItXHVERkZFXSk/KSk/KS9nLFI1PTEyMjg4LGo1PTY1NTEwLFY1PVsxMjI4OCwxMjI4OCw2NTI4MSw2NTM3Niw2NTUwNCw2NTUxMF0sVTU9NDM1MixxNT0yNjIxNDEsREU9WzQzNTIsNDQ0Nyw4OTg2LDg5ODcsOTAwMSw5MDAyLDkxOTMsOTE5Niw5MjAwLDkyMDAsOTIwMyw5MjAzLDk3MjUsOTcyNiw5NzQ4LDk3NDksOTc3Niw5NzgzLDk4MDAsOTgxMSw5ODU1LDk4NTUsOTg2Niw5ODcxLDk4NzUsOTg3NSw5ODg5LDk4ODksOTg5OCw5ODk5LDk5MTcsOTkxOCw5OTI0LDk5MjUsOTkzNCw5OTM0LDk5NDAsOTk0MCw5OTYyLDk5NjIsOTk3MCw5OTcxLDk5NzMsOTk3Myw5OTc4LDk5NzgsOTk4MSw5OTgxLDk5ODksOTk4OSw5OTk0LDk5OTUsMTAwMjQsMTAwMjQsMTAwNjAsMTAwNjAsMTAwNjIsMTAwNjIsMTAwNjcsMTAwNjksMTAwNzEsMTAwNzEsMTAxMzMsMTAxMzUsMTAxNjAsMTAxNjAsMTAxNzUsMTAxNzUsMTEwMzUsMTEwMzYsMTEwODgsMTEwODgsMTEwOTMsMTEwOTMsMTE5MDQsMTE5MjksMTE5MzEsMTIwMTksMTIwMzIsMTIyNDUsMTIyNzIsMTIyODcsMTIyODksMTIzNTAsMTIzNTMsMTI0MzgsMTI0NDEsMTI1NDMsMTI1NDksMTI1OTEsMTI1OTMsMTI2ODYsMTI2ODgsMTI3NzMsMTI3ODMsMTI4MzAsMTI4MzIsMTI4NzEsMTI4ODAsNDIxMjQsNDIxMjgsNDIxODIsNDMzNjAsNDMzODgsNDQwMzIsNTUyMDMsNjM3NDQsNjQyNTUsNjUwNDAsNjUwNDksNjUwNzIsNjUxMDYsNjUxMDgsNjUxMjYsNjUxMjgsNjUxMzEsOTQxNzYsOTQxODAsOTQxOTIsOTQxOTgsOTQyMDgsMTAxNTg5LDEwMTYzMSwxMDE2NjIsMTAxNzYwLDEwMTg3NCwxMTA1NzYsMTEwNTc5LDExMDU4MSwxMTA1ODcsMTEwNTg5LDExMDU5MCwxMTA1OTIsMTEwODgyLDExMDg5OCwxMTA4OTgsMTEwOTI4LDExMDkzMCwxMTA5MzMsMTEwOTMzLDExMDk0OCwxMTA5NTEsMTEwOTYwLDExMTM1NSwxMTk1NTIsMTE5NjM4LDExOTY0OCwxMTk2NzAsMTI2OTgwLDEyNjk4MCwxMjcxODMsMTI3MTgzLDEyNzM3NCwxMjczNzQsMTI3Mzc3LDEyNzM4NiwxMjc0ODgsMTI3NDkwLDEyNzUwNCwxMjc1NDcsMTI3NTUyLDEyNzU2MCwxMjc1NjgsMTI3NTY5LDEyNzU4NCwxMjc1ODksMTI3NzQ0LDEyNzc3NiwxMjc3ODksMTI3Nzk3LDEyNzc5OSwxMjc4NjgsMTI3ODcwLDEyNzg5MSwxMjc5MDQsMTI3OTQ2LDEyNzk1MSwxMjc5NTUsMTI3OTY4LDEyNzk4NCwxMjc5ODgsMTI3OTg4LDEyNzk5MiwxMjgwNjIsMTI4MDY0LDEyODA2NCwxMjgwNjYsMTI4MjUyLDEyODI1NSwxMjgzMTcsMTI4MzMxLDEyODMzNCwxMjgzMzYsMTI4MzU5LDEyODM3OCwxMjgzNzgsMTI4NDA1LDEyODQwNiwxMjg0MjAsMTI4NDIwLDEyODUwNywxMjg1OTEsMTI4NjQwLDEyODcwOSwxMjg3MTYsMTI4NzE2LDEyODcyMCwxMjg3MjIsMTI4NzI1LDEyODcyOCwxMjg3MzIsMTI4NzM1LDEyODc0NywxMjg3NDgsMTI4NzU2LDEyODc2NCwxMjg5OTIsMTI5MDAzLDEyOTAwOCwxMjkwMDgsMTI5MjkyLDEyOTMzOCwxMjkzNDAsMTI5MzQ5LDEyOTM1MSwxMjk1MzUsMTI5NjQ4LDEyOTY2MCwxMjk2NjQsMTI5Njc0LDEyOTY3OCwxMjk3MzQsMTI5NzM2LDEyOTczNiwxMjk3NDEsMTI5NzU2LDEyOTc1OSwxMjk3NzAsMTI5Nzc1LDEyOTc4NCwxMzEwNzIsMTk2NjA1LDE5NjYwOCwyNjIxNDFdLGJFPShlLHQpPT57bGV0IG49MCxyPU1hdGguZmxvb3IoZS5sZW5ndGgvMiktMTtmb3IoO248PXI7KXtsZXQgcz1NYXRoLmZsb29yKChuK3IpLzIpLGk9cyoyO2lmKHQ8ZVtpXSlyPXMtMTtlbHNlIGlmKHQ+ZVtpKzFdKW49cysxO2Vsc2UgcmV0dXJuITB9cmV0dXJuITF9LEVFPTE5OTY4LFtXNSxINV09SjUoREUpO2Z1bmN0aW9uIEo1KGUpe2xldCB0PWVbMF0sbj1lWzFdO2ZvcihsZXQgcj0wO3I8ZS5sZW5ndGg7cis9Mil7bGV0IHM9ZVtyXSxpPWVbcisxXTtpZihFRT49cyYmRUU8PWkpcmV0dXJuW3MsaV07aS1zPm4tdCYmKHQ9cyxuPWkpfXJldHVyblt0LG5dfXZhciB6NT1lPT5lPFI1fHxlPmo1PyExOmJFKFY1LGUpLEc1PWU9PmU+PVc1JiZlPD1INT8hMDplPFU1fHxlPnE1PyExOmJFKERFLGUpLEs1PS9eKD86W1x4QTlceEFFXHUyMDNDXHUyMDQ5XHUyMTIyXHUyMTM5XHUyMTk0LVx1MjE5OVx1MjFBOVx1MjFBQVx1MjMyOFx1MjNDRlx1MjNFRC1cdTIzRUZcdTIzRjFcdTIzRjJcdTIzRjgtXHUyM0ZBXHUyNEMyXHUyNUFBXHUyNUFCXHUyNUI2XHUyNUMwXHUyNUZCXHUyNUZDXHUyNjAwLVx1MjYwNFx1MjYwRVx1MjYxMVx1MjYxOFx1MjYyMFx1MjYyMlx1MjYyM1x1MjYyNlx1MjYyQVx1MjYyRVx1MjYyRlx1MjYzOC1cdTI2M0FcdTI2NDBcdTI2NDJcdTI2NUZcdTI2NjBcdTI2NjNcdTI2NjVcdTI2NjZcdTI2NjhcdTI2N0JcdTI2N0VcdTI2OTJcdTI2OTQtXHUyNjk3XHUyNjk5XHUyNjlCXHUyNjlDXHUyNkEwXHUyNkE3XHUyNkIwXHUyNkIxXHUyNkM4XHUyNkNGXHUyNkQxXHUyNkQzXHUyNkU5XHUyNkYwXHUyNkYxXHUyNkY0XHUyNkY3XHUyNkY4XHUyNzAyXHUyNzA4XHUyNzA5XHUyNzBGXHUyNzEyXHUyNzE0XHUyNzE2XHUyNzFEXHUyNzIxXHUyNzMzXHUyNzM0XHUyNzQ0XHUyNzQ3XHUyNzYzXHUyNzY0XHUyN0ExXHUyOTM0XHUyOTM1XHUyQjA1LVx1MkIwN118XHVEODNDW1x1REQ3MFx1REQ3MVx1REQ3RVx1REQ3Rlx1REYyMVx1REYyNC1cdURGMkNcdURGMzZcdURGN0RcdURGOTZcdURGOTdcdURGOTktXHVERjlCXHVERjlFXHVERjlGXHVERkNEXHVERkNFXHVERkQ0LVx1REZERlx1REZGM1x1REZGNVx1REZGN118XHVEODNEW1x1REMzRlx1REM0MVx1RENGRFx1REQ0OVx1REQ0QVx1REQ2Rlx1REQ3MFx1REQ3M1x1REQ3Ni1cdURENzlcdUREODdcdUREOEEtXHVERDhEXHVEREE1XHVEREE4XHVEREIxXHVEREIyXHVEREJDXHVEREMyLVx1RERDNFx1REREMS1cdURERDNcdUREREMtXHVERERFXHVEREUxXHVEREUzXHVEREU4XHVEREVGXHVEREYzXHVEREZBXHVERUNCXHVERUNELVx1REVDRlx1REVFMC1cdURFRTVcdURFRTlcdURFRjBcdURFRjNdKSQvLFg1PWU9Pks1LnRlc3QoZSksWTU9L1teXHgyMC1ceDdGXS87ZnVuY3Rpb24gUTUoZSl7aWYoIWUpcmV0dXJuIDA7aWYoIVk1LnRlc3QoZSkpcmV0dXJuIGUubGVuZ3RoO2xldCB0PTA7ZT1lLnJlcGxhY2UoTzUoKSxuPT4odCs9WDUobik/MToyLCIiKSk7Zm9yKGxldCBuIG9mIGUpe2xldCByPW4uY29kZVBvaW50QXQoMCk7cjw9MzF8fHI+PTEyNyYmcjw9MTU5fHxyPj03NjgmJnI8PTg3OXx8cj49NjUwMjQmJnI8PTY1MDM5fHwodCs9ejUocil8fEc1KHIpPzI6MSl9cmV0dXJuIHR9dmFyIFNvPVE1LFo1PXt0eXBlOjB9LGVOPXt0eXBlOjF9LHZFPXt2YWx1ZToiIixsZW5ndGg6MCxxdWV1ZTpbXSxnZXQgcm9vdCgpe3JldHVybiB2RX19O2Z1bmN0aW9uIEZFKGUsdCxuKXtsZXQgcj10LnR5cGU9PT0xP2UucXVldWUuc2xpY2UoMCwtMSk6Wy4uLmUucXVldWUsdF0scz0iIixpPTAsbz0wLGE9MDtmb3IobGV0IGQgb2Ygcilzd2l0Y2goZC50eXBlKXtjYXNlIDA6ZigpLG4udXNlVGFicz91KDEpOmwobi50YWJXaWR0aCk7YnJlYWs7Y2FzZSAzOntsZXR7c3RyaW5nOm19PWQ7ZigpLHMrPW0saSs9bS5sZW5ndGg7YnJlYWt9Y2FzZSAyOntsZXR7d2lkdGg6bX09ZDtvKz0xLGErPW07YnJlYWt9ZGVmYXVsdDp0aHJvdyBuZXcgRXJyb3IoYFVuZXhwZWN0ZWQgaW5kZW50IGNvbW1lbnQgJyR7ZC50eXBlfScuYCl9cmV0dXJuIHAoKSx7Li4uZSx2YWx1ZTpzLGxlbmd0aDppLHF1ZXVlOnJ9O2Z1bmN0aW9uIHUoZCl7cys9IgkiLnJlcGVhdChkKSxpKz1uLnRhYldpZHRoKmR9ZnVuY3Rpb24gbChkKXtzKz0iICIucmVwZWF0KGQpLGkrPWR9ZnVuY3Rpb24gZigpe24udXNlVGFicz9jKCk6cCgpfWZ1bmN0aW9uIGMoKXtvPjAmJnUobyksaCgpfWZ1bmN0aW9uIHAoKXthPjAmJmwoYSksaCgpfWZ1bmN0aW9uIGgoKXtvPTAsYT0wfX1mdW5jdGlvbiB0TihlLHQsbil7aWYoIXQpcmV0dXJuIGU7aWYodC50eXBlPT09InJvb3QiKXJldHVybnsuLi5lLHJvb3Q6ZX07aWYodD09PU51bWJlci5ORUdBVElWRV9JTkZJTklUWSlyZXR1cm4gZS5yb290O2xldCByO3JldHVybiB0eXBlb2YgdD09Im51bWJlciI/dDwwP3I9ZU46cj17dHlwZToyLHdpZHRoOnR9OnI9e3R5cGU6MyxzdHJpbmc6dH0sRkUoZSxyLG4pfWZ1bmN0aW9uIG5OKGUsdCl7cmV0dXJuIEZFKGUsWjUsdCl9ZnVuY3Rpb24gck4oZSl7bGV0IHQ9MDtmb3IobGV0IG49ZS5sZW5ndGgtMTtuPj0wO24tLSl7bGV0IHI9ZVtuXTtpZihyPT09IiAifHxyPT09IgkiKXQrKztlbHNlIGJyZWFrfXJldHVybiB0fWZ1bmN0aW9uIEFFKGUpe2xldCB0PXJOKGUpO3JldHVybnt0ZXh0OnQ9PT0wP2U6ZS5zbGljZSgwLGUubGVuZ3RoLXQpLGNvdW50OnR9fXZhciBzTj0oc0M9Y2xhc3N7Y29uc3RydWN0b3IoKXtidCh0aGlzLEF1KTtidCh0aGlzLEZ1LFtdKTtidCh0aGlzLEpyLCIiKTtidCh0aGlzLEdvLDApO2J0KHRoaXMsS28sW10pO2J0KHRoaXMsRmksW10pfW1hcmtQb3NpdGlvbigpe2lmKG9lKHRoaXMsS28pLmxlbmd0aCtvZSh0aGlzLEZpKS5sZW5ndGg+PTIpdGhyb3cgbmV3IEVycm9yKCJUaGVyZSBhcmUgdG9vIG1hbnkgJ2N1cnNvcicgaW4gZG9jLiIpO29lKHRoaXMsRmkpLnB1c2gob2UodGhpcyxHbykrb2UodGhpcyxKcikubGVuZ3RoKX13cml0ZSh0KXtKbih0aGlzLEpyLG9lKHRoaXMsSnIpK3QpfXRyaW0oKXtsZXR7dGV4dDp0LGNvdW50Om59PUFFKG9lKHRoaXMsSnIpKTtyZXR1cm4gSm4odGhpcyxKcix0KSx6bih0aGlzLEF1LGUxKS5jYWxsKHRoaXMpLG59ZmluaXNoKCl7cmV0dXJuIHpuKHRoaXMsQXUsZTEpLmNhbGwodGhpcykse3RleHQ6b2UodGhpcyxGdSkuam9pbigiIikscG9zaXRpb25zOm9lKHRoaXMsS28pfX19LEZ1PW5ldyBXZWFrTWFwLEpyPW5ldyBXZWFrTWFwLEdvPW5ldyBXZWFrTWFwLEtvPW5ldyBXZWFrTWFwLEZpPW5ldyBXZWFrTWFwLEF1PW5ldyBXZWFrU2V0LGUxPWZ1bmN0aW9uKCl7bGV0IHQ9b2UodGhpcyxKcik7dCE9PSIiJiYob2UodGhpcyxGdSkucHVzaCh0KSxKbih0aGlzLEdvLG9lKHRoaXMsR28pK3QubGVuZ3RoKSxKbih0aGlzLEpyLCIiKSk7Zm9yKGxldCBuIG9mIG9lKHRoaXMsRmkpKW9lKHRoaXMsS28pLnB1c2goTWF0aC5taW4obixvZSh0aGlzLEdvKSkpO29lKHRoaXMsRmkpLmxlbmd0aD0wfSxzQyksaU49c04sU249U3ltYm9sKCJNT0RFX0JSRUFLIiksdXI9U3ltYm9sKCJNT0RFX0ZMQVQiKSxDZD1TeW1ib2woIkRPQ19GSUxMX1BSSU5URURfTEVOR1RIIik7ZnVuY3Rpb24geWMoZSx0LG4scixzLGkpe2lmKG49PT1OdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkpcmV0dXJuITA7bGV0IG89dC5sZW5ndGgsYT0hMSx1PVtlXSxsPSIiO2Zvcig7bj49MDspe2lmKHUubGVuZ3RoPT09MCl7aWYobz09PTApcmV0dXJuITA7dS5wdXNoKHRbLS1vXSk7Y29udGludWV9bGV0e21vZGU6Zixkb2M6Y309dS5wb3AoKSxwPXZzKGMpO3N3aXRjaChwKXtjYXNlIHRpOmMmJihhJiYobCs9IiAiLG4tPTEsYT0hMSksbCs9YyxuLT1TbyhjKSk7YnJlYWs7Y2FzZSBrcjpjYXNlIGJzOntsZXQgaD1wPT09a3I/YzpjLnBhcnRzLGQ9Y1tDZF0/PzA7Zm9yKGxldCBtPWgubGVuZ3RoLTE7bT49ZDttLS0pdS5wdXNoKHttb2RlOmYsZG9jOmhbbV19KTticmVha31jYXNlIG5pOmNhc2Ugcmk6Y2FzZSBpaTpjYXNlIFRyOnUucHVzaCh7bW9kZTpmLGRvYzpjLmNvbnRlbnRzfSk7YnJlYWs7Y2FzZSBzaTp7bGV0e3RleHQ6aCxjb3VudDpkfT1BRShsKTtsPWgsbis9ZDticmVha31jYXNlIHduOntpZihpJiZjLmJyZWFrKXJldHVybiExO2xldCBoPWMuYnJlYWs/U246ZixkPWMuZXhwYW5kZWRTdGF0ZXMmJmg9PT1Tbj9jZSgwLGMuZXhwYW5kZWRTdGF0ZXMsLTEpOmMuY29udGVudHM7dS5wdXNoKHttb2RlOmgsZG9jOmR9KTticmVha31jYXNlIGFyOntsZXQgaD0oYy5ncm91cElkP3NbYy5ncm91cElkXXx8dXI6Zik9PT1Tbj9jLmJyZWFrQ29udGVudHM6Yy5mbGF0Q29udGVudHM7aCYmdS5wdXNoKHttb2RlOmYsZG9jOmh9KTticmVha31jYXNlIFd0OmlmKGY9PT1Tbnx8Yy5oYXJkKXJldHVybiEwO2Muc29mdHx8KGE9ITApO2JyZWFrO2Nhc2Ugb2k6cj0hMDticmVhaztjYXNlIEVzOmlmKHIpcmV0dXJuITE7YnJlYWt9fXJldHVybiExfWZ1bmN0aW9uIHdFKGUsdCl7bGV0IG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPXQucHJpbnRXaWR0aCxzPU01KHQuZW5kT2ZMaW5lKSxpPTAsbz1be2luZGVudDp2RSxtb2RlOlNuLGRvYzplfV0sYT0hMSx1PVtdLGw9bmV3IGlOO2ZvcihFNShlKTtvLmxlbmd0aD4wOyl7bGV0e2luZGVudDpkLG1vZGU6bSxkb2M6Z309by5wb3AoKTtzd2l0Y2godnMoZykpe2Nhc2UgdGk6e2xldCBEPXMhPT1gCmA/ZnQoMCxnLGAKYCxzKTpnO0QmJihsLndyaXRlKEQpLG8ubGVuZ3RoPjAmJihpKz1TbyhEKSkpO2JyZWFrfWNhc2Uga3I6Zm9yKGxldCBEPWcubGVuZ3RoLTE7RD49MDtELS0pby5wdXNoKHtpbmRlbnQ6ZCxtb2RlOm0sZG9jOmdbRF19KTticmVhaztjYXNlIHdvOmwubWFya1Bvc2l0aW9uKCk7YnJlYWs7Y2FzZSBuaTpvLnB1c2goe2luZGVudDpuTihkLHQpLG1vZGU6bSxkb2M6Zy5jb250ZW50c30pO2JyZWFrO2Nhc2Ugcmk6by5wdXNoKHtpbmRlbnQ6dE4oZCxnLm4sdCksbW9kZTptLGRvYzpnLmNvbnRlbnRzfSk7YnJlYWs7Y2FzZSBzaTppLT1sLnRyaW0oKTticmVhaztjYXNlIHduOntsZXQgRD1mdW5jdGlvbigpe2lmKG09PT11ciYmIWEpcmV0dXJue2luZGVudDpkLG1vZGU6Zy5icmVhaz9Tbjp1cixkb2M6Zy5jb250ZW50c307YT0hMTtsZXQgYj1yLWksRT11Lmxlbmd0aD4wLEY9e2luZGVudDpkLG1vZGU6dXIsZG9jOmcuY29udGVudHN9O2lmKCFnLmJyZWFrJiZ5YyhGLG8sYixFLG4pKXJldHVybiBGO2lmKCFnLmV4cGFuZGVkU3RhdGVzKXJldHVybntpbmRlbnQ6ZCxtb2RlOlNuLGRvYzpnLmNvbnRlbnRzfTtpZighZy5icmVhaylmb3IobGV0IHY9MTt2PGcuZXhwYW5kZWRTdGF0ZXMubGVuZ3RoLTE7disrKXtsZXQgQz17aW5kZW50OmQsbW9kZTp1cixkb2M6Zy5leHBhbmRlZFN0YXRlc1t2XX07aWYoeWMoQyxvLGIsRSxuKSlyZXR1cm4gQ31yZXR1cm57aW5kZW50OmQsbW9kZTpTbixkb2M6Y2UoMCxnLmV4cGFuZGVkU3RhdGVzLC0xKX19KCk7by5wdXNoKEQpLGcuaWQmJihuW2cuaWRdPUQubW9kZSk7YnJlYWt9Y2FzZSBiczp7bGV0IEQ9ci1pLGI9Z1tDZF0/PzAse3BhcnRzOkV9PWcsRj1FLmxlbmd0aC1iO2lmKEY9PT0wKWJyZWFrO2xldCB2PUVbYiswXSxDPUVbYisxXSxBPXtpbmRlbnQ6ZCxtb2RlOnVyLGRvYzp2fSx3PXtpbmRlbnQ6ZCxtb2RlOlNuLGRvYzp2fSxUPXljKEEsW10sRCx1Lmxlbmd0aD4wLG4sITApO2lmKEY9PT0xKXtUP28ucHVzaChBKTpvLnB1c2godyk7YnJlYWt9bGV0IE49e2luZGVudDpkLG1vZGU6dXIsZG9jOkN9LHg9e2luZGVudDpkLG1vZGU6U24sZG9jOkN9O2lmKEY9PT0yKXtUP28ucHVzaChOLEEpOm8ucHVzaCh4LHcpO2JyZWFrfWxldCBMPUVbYisyXSxTPXtpbmRlbnQ6ZCxtb2RlOm0sZG9jOnsuLi5nLFtDZF06YisyfX0saz15Yyh7aW5kZW50OmQsbW9kZTp1cixkb2M6W3YsQyxMXX0sW10sRCx1Lmxlbmd0aD4wLG4sITApO28ucHVzaChTKSxrP28ucHVzaChOLEEpOlQ/by5wdXNoKHgsQSk6by5wdXNoKHgsdyk7YnJlYWt9Y2FzZSBhcjpjYXNlIGlpOntsZXQgRD1nLmdyb3VwSWQ/bltnLmdyb3VwSWRdOm07aWYoRD09PVNuKXtsZXQgYj1nLnR5cGU9PT1hcj9nLmJyZWFrQ29udGVudHM6Zy5uZWdhdGU/Zy5jb250ZW50czpPKGcuY29udGVudHMpO2ImJm8ucHVzaCh7aW5kZW50OmQsbW9kZTptLGRvYzpifSl9aWYoRD09PXVyKXtsZXQgYj1nLnR5cGU9PT1hcj9nLmZsYXRDb250ZW50czpnLm5lZ2F0ZT9PKGcuY29udGVudHMpOmcuY29udGVudHM7YiYmby5wdXNoKHtpbmRlbnQ6ZCxtb2RlOm0sZG9jOmJ9KX1icmVha31jYXNlIG9pOnUucHVzaCh7aW5kZW50OmQsbW9kZTptLGRvYzpnLmNvbnRlbnRzfSk7YnJlYWs7Y2FzZSBFczp1Lmxlbmd0aD4wJiZvLnB1c2goe2luZGVudDpkLG1vZGU6bSxkb2M6Z0V9KTticmVhaztjYXNlIFd0OnN3aXRjaChtKXtjYXNlIHVyOmlmKCFnLmhhcmQpe2cuc29mdHx8KGwud3JpdGUoIiAiKSxpKz0xKTticmVha31hPSEwO2Nhc2UgU246aWYodS5sZW5ndGg+MCl7by5wdXNoKHtpbmRlbnQ6ZCxtb2RlOm0sZG9jOmd9LC4uLnUucmV2ZXJzZSgpKSx1Lmxlbmd0aD0wO2JyZWFrfWcubGl0ZXJhbD8obC53cml0ZShzKSxpPTAsZC5yb290JiYoZC5yb290LnZhbHVlJiZsLndyaXRlKGQucm9vdC52YWx1ZSksaT1kLnJvb3QubGVuZ3RoKSk6KGwudHJpbSgpLGwud3JpdGUocytkLnZhbHVlKSxpPWQubGVuZ3RoKTticmVha31icmVhaztjYXNlIFRyOm8ucHVzaCh7aW5kZW50OmQsbW9kZTptLGRvYzpnLmNvbnRlbnRzfSk7YnJlYWs7Y2FzZSBOcjpicmVhaztkZWZhdWx0OnRocm93IG5ldyBHYShnKX1vLmxlbmd0aD09PTAmJnUubGVuZ3RoPjAmJihvLnB1c2goLi4udS5yZXZlcnNlKCkpLHUubGVuZ3RoPTApfWxldHt0ZXh0OmYscG9zaXRpb25zOmN9PWwuZmluaXNoKCk7aWYoYy5sZW5ndGghPT0yKXJldHVybntmb3JtYXR0ZWQ6Zn07bGV0W3AsaF09YztyZXR1cm57Zm9ybWF0dGVkOmYsY3Vyc29yTm9kZVN0YXJ0OnAsY3Vyc29yTm9kZVRleHQ6Zi5zbGljZShwLGgpfX12YXIgRGM9Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7V2UodGhpcywibmFtZSIsIkFyZ0V4cGFuc2lvbkJhaWxvdXQiKX19O2Z1bmN0aW9uIFNkKGUpe3JldHVybihlLnR5cGU9PT0iT2JqZWN0VHlwZVByb3BlcnR5Inx8ZS50eXBlPT09Ik9iamVjdFR5cGVJbnRlcm5hbFNsb3QiKSYmIWUuc3RhdGljJiYhZS5tZXRob2QmJmUua2luZCE9PSJnZXQiJiZlLmtpbmQhPT0ic2V0IiYmZS52YWx1ZS50eXBlPT09IkZ1bmN0aW9uVHlwZUFubm90YXRpb24ifWZ1bmN0aW9uIG9OKGUsdCl7bGV0IG49bnVsbCxyPXQ7Zm9yKDtyIT09bjspbj1yLHI9cWsoZSxyKSxyPXJkKGUscikscj1GbyhlLHIpO3JldHVybiByPXNkKGUscikscj1BbyhlLHIpLHIhPT0hMSYmaXQoZSxyKX12YXIgYmM9b04sbHI9KGUse29yaWdpbmFsVGV4dDp0fSk9PntsZXQgbj1YKGUpO2lmKGJjKHQsbikpcmV0dXJuITA7bGV0IHI9bGMoZSk7cmV0dXJuIHI9PT1uPyExOmJjKHQscil9LGFOPUsoWyJBbnlUeXBlQW5ub3RhdGlvbiIsIlRoaXNUeXBlQW5ub3RhdGlvbiIsIk51bWJlclR5cGVBbm5vdGF0aW9uIiwiVm9pZFR5cGVBbm5vdGF0aW9uIiwiQm9vbGVhblR5cGVBbm5vdGF0aW9uIiwiQmlnSW50VHlwZUFubm90YXRpb24iLCJTeW1ib2xUeXBlQW5ub3RhdGlvbiIsIlN0cmluZ1R5cGVBbm5vdGF0aW9uIiwiTmV2ZXJUeXBlQW5ub3RhdGlvbiIsIlVuZGVmaW5lZFR5cGVBbm5vdGF0aW9uIiwiVW5rbm93blR5cGVBbm5vdGF0aW9uIiwiRW1wdHlUeXBlQW5ub3RhdGlvbiIsIk1peGVkVHlwZUFubm90YXRpb24iXSksQ0U9YU4sdU49SyhbIlRTVGhpc1R5cGUiLCJOdWxsTGl0ZXJhbFR5cGVBbm5vdGF0aW9uIiwiQm9vbGVhbkxpdGVyYWxUeXBlQW5ub3RhdGlvbiIsIlN0cmluZ0xpdGVyYWxUeXBlQW5ub3RhdGlvbiIsIkJpZ0ludExpdGVyYWxUeXBlQW5ub3RhdGlvbiIsIk51bWJlckxpdGVyYWxUeXBlQW5ub3RhdGlvbiIsIlRTTGl0ZXJhbFR5cGUiLCJUU1RlbXBsYXRlTGl0ZXJhbFR5cGUiXSk7ZnVuY3Rpb24gbE4oe3R5cGU6ZX0pe3JldHVybiBlLnN0YXJ0c1dpdGgoIlRTIikmJmUuZW5kc1dpdGgoIktleXdvcmQiKX12YXIgU0U9bE47ZnVuY3Rpb24geGQoZSl7cmV0dXJuIFNFKGUpfHxDRShlKXx8dU4oZSl8fGUudHlwZT09PSJHZW5lcmljVHlwZUFubm90YXRpb24iJiYhZS50eXBlUGFyYW1ldGVyc3x8ZS50eXBlPT09IlRTVHlwZVJlZmVyZW5jZSImJiFlLnR5cGVBcmd1bWVudHN9ZnVuY3Rpb24gY04oZSl7cmV0dXJuKGUudHlwZT09PSJUeXBlQW5ub3RhdGlvbiJ8fGUudHlwZT09PSJUU1R5cGVBbm5vdGF0aW9uIikmJmUudHlwZUFubm90YXRpb24udHlwZT09PSJGdW5jdGlvblR5cGVBbm5vdGF0aW9uIiYmIWUuc3RhdGljJiYhY2MoZSxlLnR5cGVBbm5vdGF0aW9uKX1mdW5jdGlvbiBmTihlLHQpe2xldCBuPXQuc3BsaXQoIi4iKTtmb3IobGV0IHI9bi5sZW5ndGgtMTtyPj0wO3ItLSl7bGV0IHM9bltyXTtpZihyPT09MClyZXR1cm4gZS50eXBlPT09IklkZW50aWZpZXIiJiZlLm5hbWU9PT1zO2lmKHI9PT0xJiZlLnR5cGU9PT0iTWV0YVByb3BlcnR5IiYmZS5wcm9wZXJ0eS50eXBlPT09IklkZW50aWZpZXIiJiZlLnByb3BlcnR5Lm5hbWU9PT1zKXtlPWUubWV0YTtjb250aW51ZX1pZihlLnR5cGU9PT0iTWVtYmVyRXhwcmVzc2lvbiImJiFlLm9wdGlvbmFsJiYhZS5jb21wdXRlZCYmZS5wcm9wZXJ0eS50eXBlPT09IklkZW50aWZpZXIiJiZlLnByb3BlcnR5Lm5hbWU9PT1zKXtlPWUub2JqZWN0O2NvbnRpbnVlfXJldHVybiExfX1mdW5jdGlvbiBrZChlLHQpe3JldHVybiB0LnNvbWUobj0+Zk4oZSxuKSl9dmFyIHBOPVsiaXQiLCJpdC5vbmx5IiwiaXQuc2tpcCIsImRlc2NyaWJlIiwiZGVzY3JpYmUub25seSIsImRlc2NyaWJlLnNraXAiLCJ0ZXN0IiwidGVzdC5vbmx5IiwidGVzdC5za2lwIiwidGVzdC5maXhtZSIsInRlc3Quc3RlcCIsInRlc3QuZGVzY3JpYmUiLCJ0ZXN0LmRlc2NyaWJlLm9ubHkiLCJ0ZXN0LmRlc2NyaWJlLnNraXAiLCJ0ZXN0LmRlc2NyaWJlLmZpeG1lIiwidGVzdC5kZXNjcmliZS5wYXJhbGxlbCIsInRlc3QuZGVzY3JpYmUucGFyYWxsZWwub25seSIsInRlc3QuZGVzY3JpYmUuc2VyaWFsIiwidGVzdC5kZXNjcmliZS5zZXJpYWwub25seSIsInNraXAiLCJ4aXQiLCJ4ZGVzY3JpYmUiLCJ4dGVzdCIsImZpdCIsImZkZXNjcmliZSIsImZ0ZXN0Il07ZnVuY3Rpb24gaE4oZSl7cmV0dXJuIGtkKGUscE4pfWZ1bmN0aW9uIGROKGUpe3JldHVybiBlLnR5cGU9PT0iSWRlbnRpZmllciImJihlLm5hbWU9PT0iYmVmb3JlRWFjaCJ8fGUubmFtZT09PSJiZWZvcmVBbGwifHxlLm5hbWU9PT0iYWZ0ZXJFYWNoInx8ZS5uYW1lPT09ImFmdGVyQWxsIil9ZnVuY3Rpb24gVGQoZSl7cmV0dXJuIHZlKGUpJiZlLmNhbGxlZS50eXBlPT09IklkZW50aWZpZXIiJiZbImFzeW5jIiwiaW5qZWN0IiwiZmFrZUFzeW5jIiwid2FpdEZvckFzeW5jIl0uaW5jbHVkZXMoZS5jYWxsZWUubmFtZSl9ZnVuY3Rpb24gbU4oZSl7cmV0dXJuIGUudHlwZT09PSJGdW5jdGlvbkV4cHJlc3Npb24ifHxlLnR5cGU9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iJiZlLmJvZHkudHlwZT09PSJCbG9ja1N0YXRlbWVudCJ9ZnVuY3Rpb24gRWMoZSx0KXtpZigoZT09bnVsbD92b2lkIDA6ZS50eXBlKSE9PSJDYWxsRXhwcmVzc2lvbiJ8fGUub3B0aW9uYWwpcmV0dXJuITE7bGV0IG49Rm4oZSk7aWYobi5sZW5ndGg9PT0xKXtpZihUZChlKSYmRWModCkpcmV0dXJuIFVhKG5bMF0pO2lmKGROKGUuY2FsbGVlKSlyZXR1cm4gVGQoblswXSl9ZWxzZSBpZigobi5sZW5ndGg9PT0yfHxuLmxlbmd0aD09PTMpJiYoblswXS50eXBlPT09IlRlbXBsYXRlTGl0ZXJhbCJ8fHN0KG5bMF0pKSYmaE4oZS5jYWxsZWUpKXJldHVybiBuWzJdJiYhaXIoblsyXSk/ITE6KG4ubGVuZ3RoPT09Mj9VYShuWzFdKTptTihuWzFdKSYmeHQoblsxXSkubGVuZ3RoPD0xKXx8VGQoblsxXSk7cmV0dXJuITF9ZnVuY3Rpb24gZ04oZSx0KXtsZXQgbj10LTE7bj1GbyhlLG4se2JhY2t3YXJkczohMH0pLG49QW8oZSxuLHtiYWNrd2FyZHM6ITB9KSxuPUZvKGUsbix7YmFja3dhcmRzOiEwfSk7bGV0IHI9QW8oZSxuLHtiYWNrd2FyZHM6ITB9KTtyZXR1cm4gbiE9PXJ9dmFyIHhFPWdOLE5kPSgpPT4hMDtmdW5jdGlvbiBMZChlLHQpe2xldCBuPWUubm9kZTtyZXR1cm4gbi5wcmludGVkPSEwLHQucHJpbnRlci5wcmludENvbW1lbnQoZSx0KX1mdW5jdGlvbiB5TihlLHQpe3ZhciBsO2xldCBuPWUubm9kZSxyPVtMZChlLHQpXSx7cHJpbnRlcjpzLG9yaWdpbmFsVGV4dDppLGxvY1N0YXJ0Om8sbG9jRW5kOmF9PXQ7aWYoKGw9cy5pc0Jsb2NrQ29tbWVudCkhPW51bGwmJmwuY2FsbChzLG4pKXtsZXQgZj0iICI7aXQoaSxhKG4pKSYmKGl0KGksbyhuKSx7YmFja3dhcmRzOiEwfSk/Zj1SOmY9SCksci5wdXNoKGYpfWVsc2Ugci5wdXNoKFIpO2xldCB1PUFvKGksRm8oaSxhKG4pKSk7cmV0dXJuIHUhPT0hMSYmaXQoaSx1KSYmci5wdXNoKFIpLHJ9ZnVuY3Rpb24gRE4oZSx0LG4pe3ZhciBsO2xldCByPWUubm9kZSxzPUxkKGUsdCkse3ByaW50ZXI6aSxvcmlnaW5hbFRleHQ6byxsb2NTdGFydDphfT10LHU9KGw9aS5pc0Jsb2NrQ29tbWVudCk9PW51bGw/dm9pZCAwOmwuY2FsbChpLHIpO2lmKG4hPW51bGwmJm4uaGFzTGluZVN1ZmZpeCYmIShuIT1udWxsJiZuLmlzQmxvY2spfHxpdChvLGEocikse2JhY2t3YXJkczohMH0pKXtsZXQgZj14RShvLGEocikpO3JldHVybntkb2M6eUUoW1IsZj9SOiIiLHNdKSxpc0Jsb2NrOnUsaGFzTGluZVN1ZmZpeDohMH19cmV0dXJuIXV8fG4hPW51bGwmJm4uaGFzTGluZVN1ZmZpeD97ZG9jOlt5RShbIiAiLHNdKSxMcl0saXNCbG9jazp1LGhhc0xpbmVTdWZmaXg6ITB9Ontkb2M6WyIgIixzXSxpc0Jsb2NrOnUsaGFzTGluZVN1ZmZpeDohMX19ZnVuY3Rpb24gZXQoZSx0LG49e30pe3ZhciBsLGY7bGV0e2luZGVudDpyPSExLG1hcmtlcjpzLGZpbHRlcjppPU5kfT1uLG89bmV3IFNldCgoZj0obD1lLm5vZGUpPT1udWxsP3ZvaWQgMDpsLmNvbW1lbnRzKT09bnVsbD92b2lkIDA6Zi5maWx0ZXIoYz0+IShjLmxlYWRpbmd8fGMudHJhaWxpbmd8fGMubWFya2VyIT09c3x8IWkoYykpKSk7aWYoby5zaXplPT09MClyZXR1cm4iIjtsZXQgYT1lLm1hcCgoe25vZGU6Y30pPT5vLmhhcyhjKT9MZChlLHQpOiIiLCJjb21tZW50cyIpLmZpbHRlcihCb29sZWFuKSx1PWZlKFIsYSk7cmV0dXJuIHI/TyhbUix1XSk6dX1mdW5jdGlvbiAkZChlLHQsbil7dmFyIG8sYTtsZXQgcj10W1N5bWJvbC5mb3IoInByaW50ZWRDb21tZW50cyIpXSxzPShuPT1udWxsP3ZvaWQgMDpuLmZpbHRlcik/P05kLGk9bmV3IFNldCgoYT0obz1lLm5vZGUpPT1udWxsP3ZvaWQgMDpvLmNvbW1lbnRzKT09bnVsbD92b2lkIDA6YS5maWx0ZXIodT0+IShyIT1udWxsJiZyLmhhcyh1KSkmJnUubGVhZGluZyYmcyh1KSkpO3JldHVybiBpLnNpemU9PT0wPyIiOmUubWFwKCh7bm9kZTp1fSk9PmkuaGFzKHUpP3lOKGUsdCk6IiIsImNvbW1lbnRzIikuZmlsdGVyKEJvb2xlYW4pfWZ1bmN0aW9uIGtFKGUsdCxuKXt2YXIgZjtsZXQgcj0oZj1lLm5vZGUpPT1udWxsP3ZvaWQgMDpmLmNvbW1lbnRzLHM9bmV3IFNldChyPT1udWxsP3ZvaWQgMDpyLmZpbHRlcihjPT5jLnRyYWlsaW5nKSksaT10W1N5bWJvbC5mb3IoInByaW50ZWRDb21tZW50cyIpXSxvPShuPT1udWxsP3ZvaWQgMDpuLmZpbHRlcik/P05kLGE9bmV3IFNldChyPT1udWxsP3ZvaWQgMDpyLmZpbHRlcihjPT5zLmhhcyhjKSYmIShpIT1udWxsJiZpLmhhcyhjKSkmJm8oYykpKTtpZihhLnNpemU9PT0wKXJldHVybiIiO2xldCB1PVtdLGw7cmV0dXJuIGUuZWFjaCgoe25vZGU6Y30pPT57cy5oYXMoYykmJihsPUROKGUsdCxsKSxhLmhhcyhjKSYmdS5wdXNoKGwuZG9jKSl9LCJjb21tZW50cyIpLHV9ZnVuY3Rpb24gVEUoZSx0LG4pe3JldHVybntsZWFkaW5nOiRkKGUsdCxuKSx0cmFpbGluZzprRShlLHQsbil9fWZ1bmN0aW9uIEZ0KGUsdCxuLHIpe2xldCBzPSRkKGUsbixyKSxpPWtFKGUsbixyKTtyZXR1cm4gc3x8aT9oRSh0LG89PltzLG8saV0pOnR9ZnVuY3Rpb24gTkUoZSx0PSJlczUiKXtyZXR1cm4gZS50cmFpbGluZ0NvbW1hPT09ImVzNSImJnQ9PT0iZXM1Inx8ZS50cmFpbGluZ0NvbW1hPT09ImFsbCImJih0PT09ImFsbCJ8fHQ9PT0iZXM1Iil9ZnVuY3Rpb24gTnQoZSl7bGV0e25vZGU6dH09ZTtyZXR1cm4hdC5vcHRpb25hbHx8dC50eXBlPT09IklkZW50aWZpZXIiJiZ0PT09ZS5wYXJlbnQua2V5PyIiOnZlKHQpfHx4ZSh0KSYmdC5jb21wdXRlZHx8dC50eXBlPT09Ik9wdGlvbmFsSW5kZXhlZEFjY2Vzc1R5cGUiPyI/LiI6Ij8ifWZ1bmN0aW9uIExFKGUpe3JldHVybiBlLm5vZGUuZGVmaW5pdGV8fGUubWF0Y2godm9pZCAwLCh0LG4pPT5uPT09ImlkIiYmdC50eXBlPT09IlZhcmlhYmxlRGVjbGFyYXRvciImJnQuZGVmaW5pdGUpPyIhIjoiIn12YXIgYk49SyhbIkRlY2xhcmVDbGFzcyIsIkRlY2xhcmVDb21wb25lbnQiLCJEZWNsYXJlRnVuY3Rpb24iLCJEZWNsYXJlSG9vayIsIkRlY2xhcmVWYXJpYWJsZSIsIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvbiIsIkRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvbiIsIkRlY2xhcmVPcGFxdWVUeXBlIiwiRGVjbGFyZVR5cGVBbGlhcyIsIkRlY2xhcmVFbnVtIiwiRGVjbGFyZUludGVyZmFjZSJdKSxFTj1lPT57bGV0e25vZGU6dH09ZTtyZXR1cm4gYk4odCk/ZS5wYXJlbnQudHlwZSE9PSJEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb24iJiYhdC5pbXBsaWNpdERlY2xhcmU6dC5kZWNsYXJlfTtmdW5jdGlvbiBybihlKXtyZXR1cm4gRU4oZSk/ImRlY2xhcmUgIjoiIn12YXIgdk49SyhbIlRTQWJzdHJhY3RNZXRob2REZWZpbml0aW9uIiwiVFNBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbiIsIlRTQWJzdHJhY3RBY2Nlc3NvclByb3BlcnR5Il0pO2Z1bmN0aW9uIHZjKHtub2RlOmV9KXtyZXR1cm4gZS5hYnN0cmFjdHx8dk4oZSk/ImFic3RyYWN0ICI6IiJ9ZnVuY3Rpb24gRmMoZSl7cmV0dXJuIGUuYWNjZXNzaWJpbGl0eT9lLmFjY2Vzc2liaWxpdHkrIiAiOiIifXZhciAkRT1lPT5lLnR5cGU9PT0iVW5hcnlFeHByZXNzaW9uIiYmZS5vcGVyYXRvcj09PSIhIjtmdW5jdGlvbiBGTihlKXtyZXR1cm4gcShlKXx8ISRFKGUpPyExOihlPWUuYXJndW1lbnQsZT0kRShlKT9lLmFyZ3VtZW50OmUsZS50eXBlPT09IkxvZ2ljYWxFeHByZXNzaW9uIil9ZnVuY3Rpb24gQmQoZSx0LG4pe2xldHtub2RlOnJ9PWUscz1yLnR5cGU9PT0iV2l0aFN0YXRlbWVudCI/Im9iamVjdCI6InRlc3QiLGk9bihzKTtyZXR1cm4gRk4ocltzXSk/aTpfKFtPKFtQLGldKSxQXSl9ZnVuY3Rpb24gQWMoZSx0LG4pe2xldHtub2RlOnJ9PWU7cmV0dXJuIHEocix6LkRhbmdsaW5nLG4pP1tPKFtQLGV0KGUsdCx7ZmlsdGVyOm59KV0pLHEocix6LkRhbmdsaW5nfHouTGluZSxuKT9SOlBdOiIifWZ1bmN0aW9uIEZzKGUsdD0iZXM1Iil7cmV0dXJuIE5FKGUsdCk/dWUoIiwiKToiIn1mdW5jdGlvbiBxZShlKXtyZXR1cm4gZS5zZW1pPyI7IjoiIn12YXIgQU49ZT0+ZS5tYXJrIT09ImNvbW1lbnRCZWZvcmVBcnJvdyI7ZnVuY3Rpb24gbGkoZSx0LG4scixzKXtsZXQgaT1lLm5vZGUsbz14dChpKSxhPXMmJmkudHlwZVBhcmFtZXRlcnM/bigidHlwZVBhcmFtZXRlcnMiKToiIjtpZihvLmxlbmd0aD09PTApcmV0dXJuW2EsIigiLEFjKGUsdCxBTiksIikiXTtsZXR7cGFyZW50OnV9PWUsbD1FYyh1KSxmPUJFKGkpLGM9W107aWYoYmsoZSwoaCxkKT0+e2xldCBtPWQ9PT1vLmxlbmd0aC0xO20mJmkucmVzdCYmYy5wdXNoKCIuLi4iKSxjLnB1c2gobigpKSwhbSYmKGMucHVzaCgiLCIpLGx8fGY/Yy5wdXNoKCIgIik6bHIob1tkXSx0KT9jLnB1c2goUixSKTpjLnB1c2goSCkpfSksciYmIUNOKGUpKXtpZihUdChhKXx8VHQoYykpdGhyb3cgbmV3IERjO3JldHVybiBfKFttYyhhKSwiKCIsbWMoYyksIikiXSl9bGV0IHA9by5ldmVyeShoPT4hU2UoaC5kZWNvcmF0b3JzKSk7cmV0dXJuIGYmJnA/W2EsIigiLC4uLmMsIikiXTpsP1thLCIoIiwuLi5jLCIpIl06KFNkKHUpfHxjTih1KXx8dS50eXBlPT09IlR5cGVBbGlhcyJ8fHUudHlwZT09PSJVbmlvblR5cGVBbm5vdGF0aW9uInx8dS50eXBlPT09IkludGVyc2VjdGlvblR5cGVBbm5vdGF0aW9uInx8dS50eXBlPT09IkZ1bmN0aW9uVHlwZUFubm90YXRpb24iJiZ1LnJldHVyblR5cGU9PT1pKSYmby5sZW5ndGg9PT0xJiZvWzBdLm5hbWU9PT1udWxsJiZpLnRoaXMhPT1vWzBdJiZvWzBdLnR5cGVBbm5vdGF0aW9uJiZpLnR5cGVQYXJhbWV0ZXJzPT09bnVsbCYmeGQob1swXS50eXBlQW5ub3RhdGlvbikmJiFpLnJlc3Q/dC5hcnJvd1BhcmVucz09PSJhbHdheXMifHxpLnR5cGU9PT0iSG9va1R5cGVBbm5vdGF0aW9uIj9bIigiLC4uLmMsIikiXTpjOlthLCIoIixPKFtQLC4uLmNdKSwhRWsoaSkmJmUucm9vdC50eXBlIT09Ik5HUm9vdCI/RnModCwiYWxsIik6IiIsUCwiKSJdfWZ1bmN0aW9uIEJFKGUpe2lmKCFlKXJldHVybiExO2xldCB0PXh0KGUpO2lmKHQubGVuZ3RoIT09MSlyZXR1cm4hMTtsZXRbbl09dDtyZXR1cm4hcShuKSYmKG4udHlwZT09PSJPYmplY3RQYXR0ZXJuInx8bi50eXBlPT09IkFycmF5UGF0dGVybiJ8fG4udHlwZT09PSJJZGVudGlmaWVyIiYmbi50eXBlQW5ub3RhdGlvbiYmKG4udHlwZUFubm90YXRpb24udHlwZT09PSJUeXBlQW5ub3RhdGlvbiJ8fG4udHlwZUFubm90YXRpb24udHlwZT09PSJUU1R5cGVBbm5vdGF0aW9uIikmJm1zKG4udHlwZUFubm90YXRpb24udHlwZUFubm90YXRpb24pfHxuLnR5cGU9PT0iRnVuY3Rpb25UeXBlUGFyYW0iJiZtcyhuLnR5cGVBbm5vdGF0aW9uKSYmbiE9PWUucmVzdHx8bi50eXBlPT09IkFzc2lnbm1lbnRQYXR0ZXJuIiYmKG4ubGVmdC50eXBlPT09Ik9iamVjdFBhdHRlcm4ifHxuLmxlZnQudHlwZT09PSJBcnJheVBhdHRlcm4iKSYmKG4ucmlnaHQudHlwZT09PSJJZGVudGlmaWVyInx8V24obi5yaWdodCkmJm4ucmlnaHQucHJvcGVydGllcy5sZW5ndGg9PT0wfHxodChuLnJpZ2h0KSYmbi5yaWdodC5lbGVtZW50cy5sZW5ndGg9PT0wKSl9ZnVuY3Rpb24gd04oZSl7bGV0IHQ7cmV0dXJuIGUucmV0dXJuVHlwZT8odD1lLnJldHVyblR5cGUsdC50eXBlQW5ub3RhdGlvbiYmKHQ9dC50eXBlQW5ub3RhdGlvbikpOmUudHlwZUFubm90YXRpb24mJih0PWUudHlwZUFubm90YXRpb24pLHR9ZnVuY3Rpb24gWWEoZSx0KXt2YXIgcztsZXQgbj13TihlKTtpZighbilyZXR1cm4hMTtsZXQgcj0ocz1lLnR5cGVQYXJhbWV0ZXJzKT09bnVsbD92b2lkIDA6cy5wYXJhbXM7aWYocil7aWYoci5sZW5ndGg+MSlyZXR1cm4hMTtpZihyLmxlbmd0aD09PTEpe2xldCBpPXJbMF07aWYoaS5jb25zdHJhaW50fHxpLmRlZmF1bHQpcmV0dXJuITF9fXJldHVybiB4dChlKS5sZW5ndGg9PT0xJiYobXMobil8fFR0KHQpKX1mdW5jdGlvbiBDTihlKXtyZXR1cm4gZS5tYXRjaCh0PT50LnR5cGU9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iJiZ0LmJvZHkudHlwZT09PSJCbG9ja1N0YXRlbWVudCIsKHQsbik9PntpZih0LnR5cGU9PT0iQ2FsbEV4cHJlc3Npb24iJiZuPT09ImFyZ3VtZW50cyImJnQuYXJndW1lbnRzLmxlbmd0aD09PTEmJnQuY2FsbGVlLnR5cGU9PT0iQ2FsbEV4cHJlc3Npb24iKXtsZXQgcj10LmNhbGxlZS5jYWxsZWU7cmV0dXJuIHIudHlwZT09PSJJZGVudGlmaWVyInx8ci50eXBlPT09Ik1lbWJlckV4cHJlc3Npb24iJiYhci5jb21wdXRlZCYmci5vYmplY3QudHlwZT09PSJJZGVudGlmaWVyIiYmci5wcm9wZXJ0eS50eXBlPT09IklkZW50aWZpZXIifXJldHVybiExfSwodCxuKT0+dC50eXBlPT09IlZhcmlhYmxlRGVjbGFyYXRvciImJm49PT0iaW5pdCJ8fHQudHlwZT09PSJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24iJiZuPT09ImRlY2xhcmF0aW9uInx8dC50eXBlPT09IlRTRXhwb3J0QXNzaWdubWVudCImJm49PT0iZXhwcmVzc2lvbiJ8fHQudHlwZT09PSJBc3NpZ25tZW50RXhwcmVzc2lvbiImJm49PT0icmlnaHQiJiZ0LmxlZnQudHlwZT09PSJNZW1iZXJFeHByZXNzaW9uIiYmdC5sZWZ0Lm9iamVjdC50eXBlPT09IklkZW50aWZpZXIiJiZ0LmxlZnQub2JqZWN0Lm5hbWU9PT0ibW9kdWxlIiYmdC5sZWZ0LnByb3BlcnR5LnR5cGU9PT0iSWRlbnRpZmllciImJnQubGVmdC5wcm9wZXJ0eS5uYW1lPT09ImV4cG9ydHMiLHQ9PnQudHlwZSE9PSJWYXJpYWJsZURlY2xhcmF0aW9uInx8dC5raW5kPT09ImNvbnN0IiYmdC5kZWNsYXJhdGlvbnMubGVuZ3RoPT09MSl9ZnVuY3Rpb24gU04oZSl7bGV0IHQ9eHQoZSk7cmV0dXJuIHQubGVuZ3RoPjEmJnQuc29tZShuPT5uLnR5cGU9PT0iVFNQYXJhbWV0ZXJQcm9wZXJ0eSIpfWZ1bmN0aW9uIFFhKGUsdCl7cmV0dXJuKHQ9PT0icGFyYW1zInx8dD09PSJ0aGlzInx8dD09PSJyZXN0IikmJkJFKGUpfXZhciB4Tj0vXltcJEEtWl9hLXpceEFBXHhCNVx4QkFceEMwLVx4RDZceEQ4LVx4RjZceEY4LVx1MDJDMVx1MDJDNi1cdTAyRDFcdTAyRTAtXHUwMkU0XHUwMkVDXHUwMkVFXHUwMzcwLVx1MDM3NFx1MDM3Nlx1MDM3N1x1MDM3QS1cdTAzN0RcdTAzN0ZcdTAzODZcdTAzODgtXHUwMzhBXHUwMzhDXHUwMzhFLVx1MDNBMVx1MDNBMy1cdTAzRjVcdTAzRjctXHUwNDgxXHUwNDhBLVx1MDUyRlx1MDUzMS1cdTA1NTZcdTA1NTlcdTA1NjEtXHUwNTg3XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MjAtXHUwNjRBXHUwNjZFXHUwNjZGXHUwNjcxLVx1MDZEM1x1MDZENVx1MDZFNVx1MDZFNlx1MDZFRVx1MDZFRlx1MDZGQS1cdTA2RkNcdTA2RkZcdTA3MTBcdTA3MTItXHUwNzJGXHUwNzRELVx1MDdBNVx1MDdCMVx1MDdDQS1cdTA3RUFcdTA3RjRcdTA3RjVcdTA3RkFcdTA4MDAtXHUwODE1XHUwODFBXHUwODI0XHUwODI4XHUwODQwLVx1MDg1OFx1MDhBMC1cdTA4QjRcdTA4QjYtXHUwOEJEXHUwOTA0LVx1MDkzOVx1MDkzRFx1MDk1MFx1MDk1OC1cdTA5NjFcdTA5NzEtXHUwOTgwXHUwOTg1LVx1MDk4Q1x1MDk4Rlx1MDk5MFx1MDk5My1cdTA5QThcdTA5QUEtXHUwOUIwXHUwOUIyXHUwOUI2LVx1MDlCOVx1MDlCRFx1MDlDRVx1MDlEQ1x1MDlERFx1MDlERi1cdTA5RTFcdTA5RjBcdTA5RjFcdTBBMDUtXHUwQTBBXHUwQTBGXHUwQTEwXHUwQTEzLVx1MEEyOFx1MEEyQS1cdTBBMzBcdTBBMzJcdTBBMzNcdTBBMzVcdTBBMzZcdTBBMzhcdTBBMzlcdTBBNTktXHUwQTVDXHUwQTVFXHUwQTcyLVx1MEE3NFx1MEE4NS1cdTBBOERcdTBBOEYtXHUwQTkxXHUwQTkzLVx1MEFBOFx1MEFBQS1cdTBBQjBcdTBBQjJcdTBBQjNcdTBBQjUtXHUwQUI5XHUwQUJEXHUwQUQwXHUwQUUwXHUwQUUxXHUwQUY5XHUwQjA1LVx1MEIwQ1x1MEIwRlx1MEIxMFx1MEIxMy1cdTBCMjhcdTBCMkEtXHUwQjMwXHUwQjMyXHUwQjMzXHUwQjM1LVx1MEIzOVx1MEIzRFx1MEI1Q1x1MEI1RFx1MEI1Ri1cdTBCNjFcdTBCNzFcdTBCODNcdTBCODUtXHUwQjhBXHUwQjhFLVx1MEI5MFx1MEI5Mi1cdTBCOTVcdTBCOTlcdTBCOUFcdTBCOUNcdTBCOUVcdTBCOUZcdTBCQTNcdTBCQTRcdTBCQTgtXHUwQkFBXHUwQkFFLVx1MEJCOVx1MEJEMFx1MEMwNS1cdTBDMENcdTBDMEUtXHUwQzEwXHUwQzEyLVx1MEMyOFx1MEMyQS1cdTBDMzlcdTBDM0RcdTBDNTgtXHUwQzVBXHUwQzYwXHUwQzYxXHUwQzgwXHUwQzg1LVx1MEM4Q1x1MEM4RS1cdTBDOTBcdTBDOTItXHUwQ0E4XHUwQ0FBLVx1MENCM1x1MENCNS1cdTBDQjlcdTBDQkRcdTBDREVcdTBDRTBcdTBDRTFcdTBDRjFcdTBDRjJcdTBEMDUtXHUwRDBDXHUwRDBFLVx1MEQxMFx1MEQxMi1cdTBEM0FcdTBEM0RcdTBENEVcdTBENTQtXHUwRDU2XHUwRDVGLVx1MEQ2MVx1MEQ3QS1cdTBEN0ZcdTBEODUtXHUwRDk2XHUwRDlBLVx1MERCMVx1MERCMy1cdTBEQkJcdTBEQkRcdTBEQzAtXHUwREM2XHUwRTAxLVx1MEUzMFx1MEUzMlx1MEUzM1x1MEU0MC1cdTBFNDZcdTBFODFcdTBFODJcdTBFODRcdTBFODdcdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUFcdTBFQUJcdTBFQUQtXHUwRUIwXHUwRUIyXHUwRUIzXHUwRUJEXHUwRUMwLVx1MEVDNFx1MEVDNlx1MEVEQy1cdTBFREZcdTBGMDBcdTBGNDAtXHUwRjQ3XHUwRjQ5LVx1MEY2Q1x1MEY4OC1cdTBGOENcdTEwMDAtXHUxMDJBXHUxMDNGXHUxMDUwLVx1MTA1NVx1MTA1QS1cdTEwNURcdTEwNjFcdTEwNjVcdTEwNjZcdTEwNkUtXHUxMDcwXHUxMDc1LVx1MTA4MVx1MTA4RVx1MTBBMC1cdTEwQzVcdTEwQzdcdTEwQ0RcdTEwRDAtXHUxMEZBXHUxMEZDLVx1MTI0OFx1MTI0QS1cdTEyNERcdTEyNTAtXHUxMjU2XHUxMjU4XHUxMjVBLVx1MTI1RFx1MTI2MC1cdTEyODhcdTEyOEEtXHUxMjhEXHUxMjkwLVx1MTJCMFx1MTJCMi1cdTEyQjVcdTEyQjgtXHUxMkJFXHUxMkMwXHUxMkMyLVx1MTJDNVx1MTJDOC1cdTEyRDZcdTEyRDgtXHUxMzEwXHUxMzEyLVx1MTMxNVx1MTMxOC1cdTEzNUFcdTEzODAtXHUxMzhGXHUxM0EwLVx1MTNGNVx1MTNGOC1cdTEzRkRcdTE0MDEtXHUxNjZDXHUxNjZGLVx1MTY3Rlx1MTY4MS1cdTE2OUFcdTE2QTAtXHUxNkVBXHUxNkVFLVx1MTZGOFx1MTcwMC1cdTE3MENcdTE3MEUtXHUxNzExXHUxNzIwLVx1MTczMVx1MTc0MC1cdTE3NTFcdTE3NjAtXHUxNzZDXHUxNzZFLVx1MTc3MFx1MTc4MC1cdTE3QjNcdTE3RDdcdTE3RENcdTE4MjAtXHUxODc3XHUxODgwLVx1MTg4NFx1MTg4Ny1cdTE4QThcdTE4QUFcdTE4QjAtXHUxOEY1XHUxOTAwLVx1MTkxRVx1MTk1MC1cdTE5NkRcdTE5NzAtXHUxOTc0XHUxOTgwLVx1MTlBQlx1MTlCMC1cdTE5QzlcdTFBMDAtXHUxQTE2XHUxQTIwLVx1MUE1NFx1MUFBN1x1MUIwNS1cdTFCMzNcdTFCNDUtXHUxQjRCXHUxQjgzLVx1MUJBMFx1MUJBRVx1MUJBRlx1MUJCQS1cdTFCRTVcdTFDMDAtXHUxQzIzXHUxQzRELVx1MUM0Rlx1MUM1QS1cdTFDN0RcdTFDODAtXHUxQzg4XHUxQ0U5LVx1MUNFQ1x1MUNFRS1cdTFDRjFcdTFDRjVcdTFDRjZcdTFEMDAtXHUxREJGXHUxRTAwLVx1MUYxNVx1MUYxOC1cdTFGMURcdTFGMjAtXHUxRjQ1XHUxRjQ4LVx1MUY0RFx1MUY1MC1cdTFGNTdcdTFGNTlcdTFGNUJcdTFGNURcdTFGNUYtXHUxRjdEXHUxRjgwLVx1MUZCNFx1MUZCNi1cdTFGQkNcdTFGQkVcdTFGQzItXHUxRkM0XHUxRkM2LVx1MUZDQ1x1MUZEMC1cdTFGRDNcdTFGRDYtXHUxRkRCXHUxRkUwLVx1MUZFQ1x1MUZGMi1cdTFGRjRcdTFGRjYtXHUxRkZDXHUyMDcxXHUyMDdGXHUyMDkwLVx1MjA5Q1x1MjEwMlx1MjEwN1x1MjEwQS1cdTIxMTNcdTIxMTVcdTIxMTktXHUyMTFEXHUyMTI0XHUyMTI2XHUyMTI4XHUyMTJBLVx1MjEyRFx1MjEyRi1cdTIxMzlcdTIxM0MtXHUyMTNGXHUyMTQ1LVx1MjE0OVx1MjE0RVx1MjE2MC1cdTIxODhcdTJDMDAtXHUyQzJFXHUyQzMwLVx1MkM1RVx1MkM2MC1cdTJDRTRcdTJDRUItXHUyQ0VFXHUyQ0YyXHUyQ0YzXHUyRDAwLVx1MkQyNVx1MkQyN1x1MkQyRFx1MkQzMC1cdTJENjdcdTJENkZcdTJEODAtXHUyRDk2XHUyREEwLVx1MkRBNlx1MkRBOC1cdTJEQUVcdTJEQjAtXHUyREI2XHUyREI4LVx1MkRCRVx1MkRDMC1cdTJEQzZcdTJEQzgtXHUyRENFXHUyREQwLVx1MkRENlx1MkREOC1cdTJEREVcdTJFMkZcdTMwMDUtXHUzMDA3XHUzMDIxLVx1MzAyOVx1MzAzMS1cdTMwMzVcdTMwMzgtXHUzMDNDXHUzMDQxLVx1MzA5Nlx1MzA5RC1cdTMwOUZcdTMwQTEtXHUzMEZBXHUzMEZDLVx1MzBGRlx1MzEwNS1cdTMxMkRcdTMxMzEtXHUzMThFXHUzMUEwLVx1MzFCQVx1MzFGMC1cdTMxRkZcdTM0MDAtXHU0REI1XHU0RTAwLVx1OUZENVx1QTAwMC1cdUE0OENcdUE0RDAtXHVBNEZEXHVBNTAwLVx1QTYwQ1x1QTYxMC1cdUE2MUZcdUE2MkFcdUE2MkJcdUE2NDAtXHVBNjZFXHVBNjdGLVx1QTY5RFx1QTZBMC1cdUE2RUZcdUE3MTctXHVBNzFGXHVBNzIyLVx1QTc4OFx1QTc4Qi1cdUE3QUVcdUE3QjAtXHVBN0I3XHVBN0Y3LVx1QTgwMVx1QTgwMy1cdUE4MDVcdUE4MDctXHVBODBBXHVBODBDLVx1QTgyMlx1QTg0MC1cdUE4NzNcdUE4ODItXHVBOEIzXHVBOEYyLVx1QThGN1x1QThGQlx1QThGRFx1QTkwQS1cdUE5MjVcdUE5MzAtXHVBOTQ2XHVBOTYwLVx1QTk3Q1x1QTk4NC1cdUE5QjJcdUE5Q0ZcdUE5RTAtXHVBOUU0XHVBOUU2LVx1QTlFRlx1QTlGQS1cdUE5RkVcdUFBMDAtXHVBQTI4XHVBQTQwLVx1QUE0Mlx1QUE0NC1cdUFBNEJcdUFBNjAtXHVBQTc2XHVBQTdBXHVBQTdFLVx1QUFBRlx1QUFCMVx1QUFCNVx1QUFCNlx1QUFCOS1cdUFBQkRcdUFBQzBcdUFBQzJcdUFBREItXHVBQUREXHVBQUUwLVx1QUFFQVx1QUFGMi1cdUFBRjRcdUFCMDEtXHVBQjA2XHVBQjA5LVx1QUIwRVx1QUIxMS1cdUFCMTZcdUFCMjAtXHVBQjI2XHVBQjI4LVx1QUIyRVx1QUIzMC1cdUFCNUFcdUFCNUMtXHVBQjY1XHVBQjcwLVx1QUJFMlx1QUMwMC1cdUQ3QTNcdUQ3QjAtXHVEN0M2XHVEN0NCLVx1RDdGQlx1RjkwMC1cdUZBNkRcdUZBNzAtXHVGQUQ5XHVGQjAwLVx1RkIwNlx1RkIxMy1cdUZCMTdcdUZCMURcdUZCMUYtXHVGQjI4XHVGQjJBLVx1RkIzNlx1RkIzOC1cdUZCM0NcdUZCM0VcdUZCNDBcdUZCNDFcdUZCNDNcdUZCNDRcdUZCNDYtXHVGQkIxXHVGQkQzLVx1RkQzRFx1RkQ1MC1cdUZEOEZcdUZEOTItXHVGREM3XHVGREYwLVx1RkRGQlx1RkU3MC1cdUZFNzRcdUZFNzYtXHVGRUZDXHVGRjIxLVx1RkYzQVx1RkY0MS1cdUZGNUFcdUZGNjYtXHVGRkJFXHVGRkMyLVx1RkZDN1x1RkZDQS1cdUZGQ0ZcdUZGRDItXHVGRkQ3XHVGRkRBLVx1RkZEQ11bXCQwLTlBLVpfYS16XHhBQVx4QjVceEJBXHhDMC1ceEQ2XHhEOC1ceEY2XHhGOC1cdTAyQzFcdTAyQzYtXHUwMkQxXHUwMkUwLVx1MDJFNFx1MDJFQ1x1MDJFRVx1MDMwMC1cdTAzNzRcdTAzNzZcdTAzNzdcdTAzN0EtXHUwMzdEXHUwMzdGXHUwMzg2XHUwMzg4LVx1MDM4QVx1MDM4Q1x1MDM4RS1cdTAzQTFcdTAzQTMtXHUwM0Y1XHUwM0Y3LVx1MDQ4MVx1MDQ4My1cdTA0ODdcdTA0OEEtXHUwNTJGXHUwNTMxLVx1MDU1Nlx1MDU1OVx1MDU2MS1cdTA1ODdcdTA1OTEtXHUwNUJEXHUwNUJGXHUwNUMxXHUwNUMyXHUwNUM0XHUwNUM1XHUwNUM3XHUwNUQwLVx1MDVFQVx1MDVGMC1cdTA1RjJcdTA2MTAtXHUwNjFBXHUwNjIwLVx1MDY2OVx1MDY2RS1cdTA2RDNcdTA2RDUtXHUwNkRDXHUwNkRGLVx1MDZFOFx1MDZFQS1cdTA2RkNcdTA2RkZcdTA3MTAtXHUwNzRBXHUwNzRELVx1MDdCMVx1MDdDMC1cdTA3RjVcdTA3RkFcdTA4MDAtXHUwODJEXHUwODQwLVx1MDg1Qlx1MDhBMC1cdTA4QjRcdTA4QjYtXHUwOEJEXHUwOEQ0LVx1MDhFMVx1MDhFMy1cdTA5NjNcdTA5NjYtXHUwOTZGXHUwOTcxLVx1MDk4M1x1MDk4NS1cdTA5OENcdTA5OEZcdTA5OTBcdTA5OTMtXHUwOUE4XHUwOUFBLVx1MDlCMFx1MDlCMlx1MDlCNi1cdTA5QjlcdTA5QkMtXHUwOUM0XHUwOUM3XHUwOUM4XHUwOUNCLVx1MDlDRVx1MDlEN1x1MDlEQ1x1MDlERFx1MDlERi1cdTA5RTNcdTA5RTYtXHUwOUYxXHUwQTAxLVx1MEEwM1x1MEEwNS1cdTBBMEFcdTBBMEZcdTBBMTBcdTBBMTMtXHUwQTI4XHUwQTJBLVx1MEEzMFx1MEEzMlx1MEEzM1x1MEEzNVx1MEEzNlx1MEEzOFx1MEEzOVx1MEEzQ1x1MEEzRS1cdTBBNDJcdTBBNDdcdTBBNDhcdTBBNEItXHUwQTREXHUwQTUxXHUwQTU5LVx1MEE1Q1x1MEE1RVx1MEE2Ni1cdTBBNzVcdTBBODEtXHUwQTgzXHUwQTg1LVx1MEE4RFx1MEE4Ri1cdTBBOTFcdTBBOTMtXHUwQUE4XHUwQUFBLVx1MEFCMFx1MEFCMlx1MEFCM1x1MEFCNS1cdTBBQjlcdTBBQkMtXHUwQUM1XHUwQUM3LVx1MEFDOVx1MEFDQi1cdTBBQ0RcdTBBRDBcdTBBRTAtXHUwQUUzXHUwQUU2LVx1MEFFRlx1MEFGOVx1MEIwMS1cdTBCMDNcdTBCMDUtXHUwQjBDXHUwQjBGXHUwQjEwXHUwQjEzLVx1MEIyOFx1MEIyQS1cdTBCMzBcdTBCMzJcdTBCMzNcdTBCMzUtXHUwQjM5XHUwQjNDLVx1MEI0NFx1MEI0N1x1MEI0OFx1MEI0Qi1cdTBCNERcdTBCNTZcdTBCNTdcdTBCNUNcdTBCNURcdTBCNUYtXHUwQjYzXHUwQjY2LVx1MEI2Rlx1MEI3MVx1MEI4Mlx1MEI4M1x1MEI4NS1cdTBCOEFcdTBCOEUtXHUwQjkwXHUwQjkyLVx1MEI5NVx1MEI5OVx1MEI5QVx1MEI5Q1x1MEI5RVx1MEI5Rlx1MEJBM1x1MEJBNFx1MEJBOC1cdTBCQUFcdTBCQUUtXHUwQkI5XHUwQkJFLVx1MEJDMlx1MEJDNi1cdTBCQzhcdTBCQ0EtXHUwQkNEXHUwQkQwXHUwQkQ3XHUwQkU2LVx1MEJFRlx1MEMwMC1cdTBDMDNcdTBDMDUtXHUwQzBDXHUwQzBFLVx1MEMxMFx1MEMxMi1cdTBDMjhcdTBDMkEtXHUwQzM5XHUwQzNELVx1MEM0NFx1MEM0Ni1cdTBDNDhcdTBDNEEtXHUwQzREXHUwQzU1XHUwQzU2XHUwQzU4LVx1MEM1QVx1MEM2MC1cdTBDNjNcdTBDNjYtXHUwQzZGXHUwQzgwLVx1MEM4M1x1MEM4NS1cdTBDOENcdTBDOEUtXHUwQzkwXHUwQzkyLVx1MENBOFx1MENBQS1cdTBDQjNcdTBDQjUtXHUwQ0I5XHUwQ0JDLVx1MENDNFx1MENDNi1cdTBDQzhcdTBDQ0EtXHUwQ0NEXHUwQ0Q1XHUwQ0Q2XHUwQ0RFXHUwQ0UwLVx1MENFM1x1MENFNi1cdTBDRUZcdTBDRjFcdTBDRjJcdTBEMDEtXHUwRDAzXHUwRDA1LVx1MEQwQ1x1MEQwRS1cdTBEMTBcdTBEMTItXHUwRDNBXHUwRDNELVx1MEQ0NFx1MEQ0Ni1cdTBENDhcdTBENEEtXHUwRDRFXHUwRDU0LVx1MEQ1N1x1MEQ1Ri1cdTBENjNcdTBENjYtXHUwRDZGXHUwRDdBLVx1MEQ3Rlx1MEQ4Mlx1MEQ4M1x1MEQ4NS1cdTBEOTZcdTBEOUEtXHUwREIxXHUwREIzLVx1MERCQlx1MERCRFx1MERDMC1cdTBEQzZcdTBEQ0FcdTBEQ0YtXHUwREQ0XHUwREQ2XHUwREQ4LVx1MERERlx1MERFNi1cdTBERUZcdTBERjJcdTBERjNcdTBFMDEtXHUwRTNBXHUwRTQwLVx1MEU0RVx1MEU1MC1cdTBFNTlcdTBFODFcdTBFODJcdTBFODRcdTBFODdcdTBFODhcdTBFOEFcdTBFOERcdTBFOTQtXHUwRTk3XHUwRTk5LVx1MEU5Rlx1MEVBMS1cdTBFQTNcdTBFQTVcdTBFQTdcdTBFQUFcdTBFQUJcdTBFQUQtXHUwRUI5XHUwRUJCLVx1MEVCRFx1MEVDMC1cdTBFQzRcdTBFQzZcdTBFQzgtXHUwRUNEXHUwRUQwLVx1MEVEOVx1MEVEQy1cdTBFREZcdTBGMDBcdTBGMThcdTBGMTlcdTBGMjAtXHUwRjI5XHUwRjM1XHUwRjM3XHUwRjM5XHUwRjNFLVx1MEY0N1x1MEY0OS1cdTBGNkNcdTBGNzEtXHUwRjg0XHUwRjg2LVx1MEY5N1x1MEY5OS1cdTBGQkNcdTBGQzZcdTEwMDAtXHUxMDQ5XHUxMDUwLVx1MTA5RFx1MTBBMC1cdTEwQzVcdTEwQzdcdTEwQ0RcdTEwRDAtXHUxMEZBXHUxMEZDLVx1MTI0OFx1MTI0QS1cdTEyNERcdTEyNTAtXHUxMjU2XHUxMjU4XHUxMjVBLVx1MTI1RFx1MTI2MC1cdTEyODhcdTEyOEEtXHUxMjhEXHUxMjkwLVx1MTJCMFx1MTJCMi1cdTEyQjVcdTEyQjgtXHUxMkJFXHUxMkMwXHUxMkMyLVx1MTJDNVx1MTJDOC1cdTEyRDZcdTEyRDgtXHUxMzEwXHUxMzEyLVx1MTMxNVx1MTMxOC1cdTEzNUFcdTEzNUQtXHUxMzVGXHUxMzgwLVx1MTM4Rlx1MTNBMC1cdTEzRjVcdTEzRjgtXHUxM0ZEXHUxNDAxLVx1MTY2Q1x1MTY2Ri1cdTE2N0ZcdTE2ODEtXHUxNjlBXHUxNkEwLVx1MTZFQVx1MTZFRS1cdTE2RjhcdTE3MDAtXHUxNzBDXHUxNzBFLVx1MTcxNFx1MTcyMC1cdTE3MzRcdTE3NDAtXHUxNzUzXHUxNzYwLVx1MTc2Q1x1MTc2RS1cdTE3NzBcdTE3NzJcdTE3NzNcdTE3ODAtXHUxN0QzXHUxN0Q3XHUxN0RDXHUxN0REXHUxN0UwLVx1MTdFOVx1MTgwQi1cdTE4MERcdTE4MTAtXHUxODE5XHUxODIwLVx1MTg3N1x1MTg4MC1cdTE4QUFcdTE4QjAtXHUxOEY1XHUxOTAwLVx1MTkxRVx1MTkyMC1cdTE5MkJcdTE5MzAtXHUxOTNCXHUxOTQ2LVx1MTk2RFx1MTk3MC1cdTE5NzRcdTE5ODAtXHUxOUFCXHUxOUIwLVx1MTlDOVx1MTlEMC1cdTE5RDlcdTFBMDAtXHUxQTFCXHUxQTIwLVx1MUE1RVx1MUE2MC1cdTFBN0NcdTFBN0YtXHUxQTg5XHUxQTkwLVx1MUE5OVx1MUFBN1x1MUFCMC1cdTFBQkRcdTFCMDAtXHUxQjRCXHUxQjUwLVx1MUI1OVx1MUI2Qi1cdTFCNzNcdTFCODAtXHUxQkYzXHUxQzAwLVx1MUMzN1x1MUM0MC1cdTFDNDlcdTFDNEQtXHUxQzdEXHUxQzgwLVx1MUM4OFx1MUNEMC1cdTFDRDJcdTFDRDQtXHUxQ0Y2XHUxQ0Y4XHUxQ0Y5XHUxRDAwLVx1MURGNVx1MURGQi1cdTFGMTVcdTFGMTgtXHUxRjFEXHUxRjIwLVx1MUY0NVx1MUY0OC1cdTFGNERcdTFGNTAtXHUxRjU3XHUxRjU5XHUxRjVCXHUxRjVEXHUxRjVGLVx1MUY3RFx1MUY4MC1cdTFGQjRcdTFGQjYtXHUxRkJDXHUxRkJFXHUxRkMyLVx1MUZDNFx1MUZDNi1cdTFGQ0NcdTFGRDAtXHUxRkQzXHUxRkQ2LVx1MUZEQlx1MUZFMC1cdTFGRUNcdTFGRjItXHUxRkY0XHUxRkY2LVx1MUZGQ1x1MjAwQ1x1MjAwRFx1MjAzRlx1MjA0MFx1MjA1NFx1MjA3MVx1MjA3Rlx1MjA5MC1cdTIwOUNcdTIwRDAtXHUyMERDXHUyMEUxXHUyMEU1LVx1MjBGMFx1MjEwMlx1MjEwN1x1MjEwQS1cdTIxMTNcdTIxMTVcdTIxMTktXHUyMTFEXHUyMTI0XHUyMTI2XHUyMTI4XHUyMTJBLVx1MjEyRFx1MjEyRi1cdTIxMzlcdTIxM0MtXHUyMTNGXHUyMTQ1LVx1MjE0OVx1MjE0RVx1MjE2MC1cdTIxODhcdTJDMDAtXHUyQzJFXHUyQzMwLVx1MkM1RVx1MkM2MC1cdTJDRTRcdTJDRUItXHUyQ0YzXHUyRDAwLVx1MkQyNVx1MkQyN1x1MkQyRFx1MkQzMC1cdTJENjdcdTJENkZcdTJEN0YtXHUyRDk2XHUyREEwLVx1MkRBNlx1MkRBOC1cdTJEQUVcdTJEQjAtXHUyREI2XHUyREI4LVx1MkRCRVx1MkRDMC1cdTJEQzZcdTJEQzgtXHUyRENFXHUyREQwLVx1MkRENlx1MkREOC1cdTJEREVcdTJERTAtXHUyREZGXHUyRTJGXHUzMDA1LVx1MzAwN1x1MzAyMS1cdTMwMkZcdTMwMzEtXHUzMDM1XHUzMDM4LVx1MzAzQ1x1MzA0MS1cdTMwOTZcdTMwOTlcdTMwOUFcdTMwOUQtXHUzMDlGXHUzMEExLVx1MzBGQVx1MzBGQy1cdTMwRkZcdTMxMDUtXHUzMTJEXHUzMTMxLVx1MzE4RVx1MzFBMC1cdTMxQkFcdTMxRjAtXHUzMUZGXHUzNDAwLVx1NERCNVx1NEUwMC1cdTlGRDVcdUEwMDAtXHVBNDhDXHVBNEQwLVx1QTRGRFx1QTUwMC1cdUE2MENcdUE2MTAtXHVBNjJCXHVBNjQwLVx1QTY2Rlx1QTY3NC1cdUE2N0RcdUE2N0YtXHVBNkYxXHVBNzE3LVx1QTcxRlx1QTcyMi1cdUE3ODhcdUE3OEItXHVBN0FFXHVBN0IwLVx1QTdCN1x1QTdGNy1cdUE4MjdcdUE4NDAtXHVBODczXHVBODgwLVx1QThDNVx1QThEMC1cdUE4RDlcdUE4RTAtXHVBOEY3XHVBOEZCXHVBOEZEXHVBOTAwLVx1QTkyRFx1QTkzMC1cdUE5NTNcdUE5NjAtXHVBOTdDXHVBOTgwLVx1QTlDMFx1QTlDRi1cdUE5RDlcdUE5RTAtXHVBOUZFXHVBQTAwLVx1QUEzNlx1QUE0MC1cdUFBNERcdUFBNTAtXHVBQTU5XHVBQTYwLVx1QUE3Nlx1QUE3QS1cdUFBQzJcdUFBREItXHVBQUREXHVBQUUwLVx1QUFFRlx1QUFGMi1cdUFBRjZcdUFCMDEtXHVBQjA2XHVBQjA5LVx1QUIwRVx1QUIxMS1cdUFCMTZcdUFCMjAtXHVBQjI2XHVBQjI4LVx1QUIyRVx1QUIzMC1cdUFCNUFcdUFCNUMtXHVBQjY1XHVBQjcwLVx1QUJFQVx1QUJFQ1x1QUJFRFx1QUJGMC1cdUFCRjlcdUFDMDAtXHVEN0EzXHVEN0IwLVx1RDdDNlx1RDdDQi1cdUQ3RkJcdUY5MDAtXHVGQTZEXHVGQTcwLVx1RkFEOVx1RkIwMC1cdUZCMDZcdUZCMTMtXHVGQjE3XHVGQjFELVx1RkIyOFx1RkIyQS1cdUZCMzZcdUZCMzgtXHVGQjNDXHVGQjNFXHVGQjQwXHVGQjQxXHVGQjQzXHVGQjQ0XHVGQjQ2LVx1RkJCMVx1RkJEMy1cdUZEM0RcdUZENTAtXHVGRDhGXHVGRDkyLVx1RkRDN1x1RkRGMC1cdUZERkJcdUZFMDAtXHVGRTBGXHVGRTIwLVx1RkUyRlx1RkUzM1x1RkUzNFx1RkU0RC1cdUZFNEZcdUZFNzAtXHVGRTc0XHVGRTc2LVx1RkVGQ1x1RkYxMC1cdUZGMTlcdUZGMjEtXHVGRjNBXHVGRjNGXHVGRjQxLVx1RkY1QVx1RkY2Ni1cdUZGQkVcdUZGQzItXHVGRkM3XHVGRkNBLVx1RkZDRlx1RkZEMi1cdUZGRDdcdUZGREEtXHVGRkRDXSokLyxrTj1lPT54Ti50ZXN0KGUpLFROPWtOO2Z1bmN0aW9uIE5OKGUpe3JldHVybiBlLmxlbmd0aD09PTE/ZTplLnRvTG93ZXJDYXNlKCkucmVwbGFjZSgvXihbKy1dP1tcZC5dK2UpKD86XCt8KC0pKT8wKig/PVxkKS8sIiQxJDIiKS5yZXBsYWNlKC9eKFsrLV0/W1xkLl0rKWVbKy1dPzArJC8sIiQxIikucmVwbGFjZSgvXihbKy1dKT9cLi8sIiQxMC4iKS5yZXBsYWNlKC8oXC5cZCs/KTArKD89ZXwkKS8sIiQxIikucmVwbGFjZSgvXC4oPz1lfCQpLywiIil9dmFyIFphPU5OLF9FPU9iamVjdC5mcmVlemUoe2NoYXJhY3RlcjoiJyIsY29kZVBvaW50OjM5fSksSUU9T2JqZWN0LmZyZWV6ZSh7Y2hhcmFjdGVyOiciJyxjb2RlUG9pbnQ6MzR9KSxMTj1PYmplY3QuZnJlZXplKHtwcmVmZXJyZWQ6X0UsYWx0ZXJuYXRlOklFfSksJE49T2JqZWN0LmZyZWV6ZSh7cHJlZmVycmVkOklFLGFsdGVybmF0ZTpfRX0pO2Z1bmN0aW9uIFBFKGUsdCl7bGV0e3ByZWZlcnJlZDpuLGFsdGVybmF0ZTpyfT10PT09ITB8fHQ9PT0iJyI/TE46JE4se2xlbmd0aDpzfT1lLGk9MCxvPTA7Zm9yKGxldCBhPTA7YTxzO2ErKyl7bGV0IHU9ZS5jaGFyQ29kZUF0KGEpO3U9PT1uLmNvZGVQb2ludD9pKys6dT09PXIuY29kZVBvaW50JiZvKyt9cmV0dXJuKGk+bz9yOm4pLmNoYXJhY3Rlcn12YXIgQk49L1xcKFsiJ1xcXSl8KFsiJ10pL2c7ZnVuY3Rpb24gX04oZSx0KXtsZXQgbj10PT09JyInPyInIjonIicscj1mdCgwLGUsQk4sKHMsaSxvKT0+aT9pPT09bj9uOnM6bz09PXQ/IlxcIitvOm8pO3JldHVybiB0K3IrdH12YXIgSU49X047ZnVuY3Rpb24gUE4oZSx0KXtsZXQgbj1lLnNsaWNlKDEsLTEpLHI7cmV0dXJuIHQucGFyc2VyPT09Impzb24ifHx0LnBhcnNlcj09PSJqc29uYyJ8fHQucGFyc2VyPT09Impzb24tc3RyaW5naWZ5Inx8dC5wYXJzZXI9PT0ianNvbjUiJiZ0LnF1b3RlUHJvcHM9PT0icHJlc2VydmUiJiYhdC5zaW5nbGVRdW90ZT9yPSciJzp0Ll9faXNJbkh0bWxBdHRyaWJ1dGU/cj0iJyI6cj1QRShuLHQuc2luZ2xlUXVvdGUpLGUuY2hhckF0KDApPT09cj9lOklOKG4scil9dmFyIGNpPVBOLE1FPWU9PmUudHlwZT09PSJUU0VudW1NZW1iZXIiLE9FPWU9Pk1FKGUpPyJpZCI6ImtleSIsZXU9ZT0+ZVtPRShlKV0sUkU9ZT0+IU1FKGUpJiZlLmNvbXB1dGVkO2Z1bmN0aW9uIGpFKGUpe3JldHVybi9eKD86XGQrfFxkK1wuXGQrKSQvLnRlc3QoZSl9dmFyIE1OPSh7cGFyc2VyOmV9KT0+ZT09PSJ0eXBlc2NyaXB0Inx8ZT09PSJiYWJlbC10cyJ8fGU9PT0ib3hjLXRzInx8ZT09PSJ5dWt1LXRzIjtmdW5jdGlvbiBPTihlLHQpe2xldCBuPWV1KGUpO2lmKG4udHlwZT09PSJJZGVudGlmaWVyIilyZXR1cm4hMDtpZighaXIobil8fE1OKHQpKXJldHVybiExO2xldCByPVphKFF0KG4pKTtyZXR1cm4gU3RyaW5nKG4udmFsdWUpPT09ciYmakUocil9ZnVuY3Rpb24gVkUoZSx0KXtsZXR7cGFyc2VyOm59PXQ7aWYobj09PSJqc29uInx8bj09PSJqc29uYyIpcmV0dXJuITE7bGV0IHI9ZXUoZSk7aWYoIXN0KHIpKXJldHVybiExO2xldHt2YWx1ZTpzfT1yO3JldHVybiBjaShRdChyKSx0KS5zbGljZSgxLC0xKSE9PXN8fGUudHlwZT09PSJUU01ldGhvZFNpZ25hdHVyZSImJnM9PT0ibmV3Ij8hMTohISghKG49PT0iYmFiZWwtdHMiJiZlLnR5cGU9PT0iQ2xhc3NQcm9wZXJ0eSJ8fChuPT09InR5cGVzY3JpcHQifHxuPT09Im94Yy10cyJ8fG49PT0ieXVrdS10cyIpJiZlLnR5cGU9PT0iUHJvcGVydHlEZWZpbml0aW9uIikmJlROKHMpfHwobj09PSJiYWJlbCJ8fG49PT0iYWNvcm4ifHxuPT09Im94YyJ8fG49PT0ieXVrdSJ8fG49PT0iZXNwcmVlInx8bj09PSJtZXJpeWFoInx8bj09PSJfX2JhYmVsX2VzdHJlZSIpJiZlLnR5cGUhPT0iSW1wb3J0QXR0cmlidXRlIiYmakUocykmJlN0cmluZyhOdW1iZXIocykpPT09cyl9dmFyIFJOPW5ldyBXZWFrTWFwO2Z1bmN0aW9uIFVFKGUsdCl7cmV0dXJuIHZuKFJOLGUucGFyZW50LCgpPT5lLnNpYmxpbmdzLnNvbWUobj0+e2lmKFJFKG4pKXJldHVybiExO2xldCByPWV1KG4pO3JldHVybiBzdChyKSYmIVZFKG4sdCl9KSl9ZnVuY3Rpb24gak4oZSx0KXtyZXR1cm4odC5wYXJzZXI9PT0ianNvbiJ8fHQucGFyc2VyPT09Impzb25jInx8dC5xdW90ZVByb3BzPT09ImNvbnNpc3RlbnQiJiZVRShlLHQpKSYmT04oZS5ub2RlLHQpfWZ1bmN0aW9uIFZOKGUsdCl7cmV0dXJuKHQucXVvdGVQcm9wcz09PSJhcy1uZWVkZWQifHx0LnF1b3RlUHJvcHM9PT0iY29uc2lzdGVudCImJiFVRShlLHQpKSYmVkUoZS5ub2RlLHQpfWZ1bmN0aW9uIEFzKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9T0Uocik7aWYoUkUocikpcmV0dXJuWyJbIixuKHMpLCJdIl07aWYoak4oZSx0KSl7bGV0IGk9ZXUociksbz1jaShKU09OLnN0cmluZ2lmeShpLnR5cGU9PT0iSWRlbnRpZmllciI/aS5uYW1lOlN0cmluZyhpLnZhbHVlKSksdCk7cmV0dXJuIGUuY2FsbCgoKT0+RnQoZSxvLHQpLHMpfWlmKFZOKGUsdCkpe2xldHt2YWx1ZTppfT1ldShyKSxvPS9eXGQvLnRlc3QoaSk/WmEoaSk6aTtyZXR1cm4gZS5jYWxsKCgpPT5GdChlLG8sdCkscyl9cmV0dXJuIG4ocyl9dmFyIFVOPUsoWyJWb2lkVHlwZUFubm90YXRpb24iLCJUU1ZvaWRLZXl3b3JkIiwiTnVsbExpdGVyYWxUeXBlQW5ub3RhdGlvbiIsIlRTTnVsbEtleXdvcmQiXSkscU49SyhbIk9iamVjdFR5cGVBbm5vdGF0aW9uIiwiVFNUeXBlTGl0ZXJhbCIsIkdlbmVyaWNUeXBlQW5ub3RhdGlvbiIsIlRTVHlwZVJlZmVyZW5jZSJdKTtmdW5jdGlvbiBxRShlKXtyZXR1cm4gZS5rZXk9PT0iZWxlbWVudFR5cGVzIiYmUWgoZS5wYXJlbnQpJiZlLnBhcmVudC5lbGVtZW50VHlwZXMubGVuZ3RoPjF9ZnVuY3Rpb24gd2MoZSl7bGV0e3R5cGVzOnR9PWU7aWYodC5zb21lKHI9PnEocikpKXJldHVybiExO2xldCBuPXQuZmluZChyPT5xTihyKSk7cmV0dXJuIG4/dC5ldmVyeShyPT5yPT09bnx8VU4ocikpOiExfWZ1bmN0aW9uIFdFKGUpe2xldHtrZXk6dCxub2RlOm4scGFyZW50OnJ9PWU7cmV0dXJuISh3YyhuKXx8dD09PSJ0eXBlcyImJlp0KHIpfHx0PT09InR5cGVzIiYmVmEocil8fHFFKGUpKX1mdW5jdGlvbiBIRShlLHQsbixyKXtsZXR7bm9kZTpzfT1lO2lmKHdjKHMpKXJldHVybiBmZSgiIHwgIixlLm1hcChuLCJ0eXBlcyIpKTtsZXQgaT1fKGUubWFwKCh7aXNGaXJzdDpvfSk9PntsZXQgYT1vP3VlKCJ8ICIpOltILCJ8ICJdLHU9bigpO3JldHVybiBxKGUubm9kZSx6LkxlYWRpbmcpP1thLG5uKDIsRnQoZSx1LHQpKV06W2EsRnQoZSxubigyLHUpLHQpXX0sInR5cGVzIikpO3JldHVybiBXRShlKSYmKGk9RnQoZSxpLHQpKSx0bihlLHQpP18oW08oW1AsaV0pLFBdKTpxRShlKT9fKFtPKFt1ZShbIigiLFBdKSxpXSksUCx1ZSgiKSIpXSk6KHI9PW51bGw/dm9pZCAwOnIuYXNzaWdubWVudExheW91dCk9PT0iYnJlYWstYWZ0ZXItb3BlcmF0b3IifHwhV04oZSk/aTpfKE8oW1AsaV0pKX1mdW5jdGlvbiBXTihlKXtsZXR7a2V5OnQscGFyZW50Om59PWU7cmV0dXJuISh0PT09InR5cGVBbm5vdGF0aW9uIiYmbi50eXBlPT09IlRTVHlwZUFzc2VydGlvbiJ8fHQ9PT0iZWxlbWVudFR5cGVzIiYmUWgobil8fCh0PT09InRydWVUeXBlInx8dD09PSJmYWxzZVR5cGUiKSYmZHMobil8fHQ9PT0icGFyYW1zIiYmSWsobil8fHQ9PT0idHlwZUFubm90YXRpb24iJiZuLnR5cGU9PT0iRnVuY3Rpb25UeXBlUGFyYW0iJiYhbi5uYW1lJiZlLmdyYW5kcGFyZW50LnRoaXMhPT1ufHxlLm1hdGNoKHZvaWQgMCwocixzKT0+cz09PSJ0eXBlQW5ub3RhdGlvbiImJnIudHlwZT09PSJGdW5jdGlvblR5cGVQYXJhbSIsKHIscyk9PnM9PT0icGFyYW1zIiYmci50eXBlPT09IkZ1bmN0aW9uVHlwZUFubm90YXRpb24iLChyLHMpPT5zPT09InZhbHVlIiYmci50eXBlPT09Ik9iamVjdFR5cGVQcm9wZXJ0eSImJlNkKHIpKSl9ZnVuY3Rpb24gSE4oZSl7cmV0dXJuIHhkKGUpfHxtcyhlKT8hMDpadChlKT93YyhlKTohMX12YXIgSk49bmV3IFdlYWtTZXQ7ZnVuY3Rpb24gZHQoZSx0LG49InR5cGVBbm5vdGF0aW9uIil7bGV0e25vZGU6e1tuXTpyfX09ZTtpZighcilyZXR1cm4iIjtsZXQgcz0hMTtpZihyLnR5cGU9PT0iVFNUeXBlQW5ub3RhdGlvbiJ8fHIudHlwZT09PSJUeXBlQW5ub3RhdGlvbiIpe2xldCBpPWUuY2FsbChKRSxuKTsoaT09PSI9PiJ8fGk9PT0iOiImJnEocix6LkxlYWRpbmcpKSYmKHM9ITApLEpOLmFkZChyKX1yZXR1cm4gcz9bIiAiLHQobildOnQobil9dmFyIEpFPWU9PmUubWF0Y2godD0+dC50eXBlPT09IlRTVHlwZUFubm90YXRpb24iLCh0LG4pPT4obj09PSJyZXR1cm5UeXBlInx8bj09PSJ0eXBlQW5ub3RhdGlvbiIpJiYodC50eXBlPT09IlRTRnVuY3Rpb25UeXBlInx8dC50eXBlPT09IlRTQ29uc3RydWN0b3JUeXBlIikpPyI9PiI6ZS5tYXRjaCh0PT50LnR5cGU9PT0iVFNUeXBlQW5ub3RhdGlvbiIsKHQsbik9Pm49PT0idHlwZUFubm90YXRpb24iJiYodC50eXBlPT09IlRTSlNEb2NOdWxsYWJsZVR5cGUifHx0LnR5cGU9PT0iVFNKU0RvY05vbk51bGxhYmxlVHlwZSJ8fHQudHlwZT09PSJUU1R5cGVQcmVkaWNhdGUiKSl8fGUubWF0Y2godD0+dC50eXBlPT09IlR5cGVBbm5vdGF0aW9uIiwodCxuKT0+bj09PSJ0eXBlQW5ub3RhdGlvbiImJnQudHlwZT09PSJJZGVudGlmaWVyIiwodCxuKT0+bj09PSJpZCImJnQudHlwZT09PSJEZWNsYXJlRnVuY3Rpb24iKXx8ZS5tYXRjaCh0PT50LnR5cGU9PT0iVHlwZUFubm90YXRpb24iLCh0LG4pPT5uPT09InR5cGVBbm5vdGF0aW9uIiYmdC50eXBlPT09IklkZW50aWZpZXIiLCh0LG4pPT5uPT09ImlkIiYmdC50eXBlPT09IkRlY2xhcmVIb29rIil8fGUubWF0Y2godD0+dC50eXBlPT09IlR5cGVBbm5vdGF0aW9uIiwodCxuKT0+bj09PSJib3VuZCImJnQudHlwZT09PSJUeXBlUGFyYW1ldGVyIiYmdC51c2VzRXh0ZW5kc0JvdW5kKT8iIjoiOiI7ZnVuY3Rpb24gekUoZSx0LG4pe2xldCByPUpFKGUpO3JldHVybiByP1tyLCIgIixuKCJ0eXBlQW5ub3RhdGlvbiIpXTpuKCJ0eXBlQW5ub3RhdGlvbiIpfXZhciB6Tj0oe25vZGU6ZSxrZXk6dCxwYXJlbnQ6bn0pPT50PT09InZhbHVlIiYmZS50eXBlPT09IkZ1bmN0aW9uRXhwcmVzc2lvbiImJihuLnR5cGU9PT0iT2JqZWN0TWV0aG9kInx8bi50eXBlPT09IkNsYXNzTWV0aG9kInx8bi50eXBlPT09IkNsYXNzUHJpdmF0ZU1ldGhvZCJ8fG4udHlwZT09PSJNZXRob2REZWZpbml0aW9uInx8bi50eXBlPT09IlRTQWJzdHJhY3RNZXRob2REZWZpbml0aW9uInx8bi50eXBlPT09IlRTRGVjbGFyZU1ldGhvZCJ8fG4udHlwZT09PSJQcm9wZXJ0eSImJmJvKG4pKTtmdW5jdGlvbiBfZChlLHQsbixyKXtpZih6TihlKSlyZXR1cm4gUGQoZSx0LG4pO2xldHtub2RlOnN9PWUsaT0hMTtpZihzLnR5cGU9PT0iRnVuY3Rpb25FeHByZXNzaW9uIiYmKHIhPW51bGwmJnIuZXhwYW5kTGFzdEFyZykpe2xldHtwYXJlbnQ6Zn09ZTt2ZShmKSYmKEZuKGYpLmxlbmd0aD4xfHx4dChzKS5ldmVyeShjPT5jLnR5cGU9PT0iSWRlbnRpZmllciImJiFjLnR5cGVBbm5vdGF0aW9uKSkmJihpPSEwKX1sZXQgbz1saShlLHQsbixpKSxhPU1kKGUsbiksdT1ZYShzLGEpLGw9cy50eXBlPT09Ikhvb2tEZWNsYXJhdGlvbiI/Imhvb2siOiJmdW5jdGlvbiI7cmV0dXJuW3JuKGUpLHMuYXN5bmM/ImFzeW5jICI6IiIsbCxzLmdlbmVyYXRvcj8iKiI6IiIsIiAiLHMuaWQ/bigiaWQiKToiIixuKCJ0eXBlUGFyYW1ldGVycyIpLF8oW3U/XyhvKTpvLGFdKSxzLmJvZHk/IiAiOiIiLG4oImJvZHkiKSxzLmRlY2xhcmV8fCFzLmJvZHk/cWUodCk6IiJdfWZ1bmN0aW9uIElkKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHtraW5kOnN9PXIsaT1yLnZhbHVlfHxyLG89W107cmV0dXJuIXN8fHM9PT0iaW5pdCJ8fHM9PT0ibWV0aG9kInx8cz09PSJjb25zdHJ1Y3RvciI/aS5hc3luYyYmby5wdXNoKCJhc3luYyAiKTpvLnB1c2gocywiICIpLGkuZ2VuZXJhdG9yJiZvLnB1c2goIioiKSxvLnB1c2goQXMoZSx0LG4pLHIub3B0aW9uYWw/Ij8iOiIiLHI9PT1pP1BkKGUsdCxuKTpuKCJ2YWx1ZSIpKSxvfWZ1bmN0aW9uIFBkKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9bGkoZSx0LG4pLGk9TWQoZSxuKSxvPVNOKHIpLGE9WWEocixpKSx1PVtuKCJ0eXBlUGFyYW1ldGVycyIpLF8oW28/XyhzLHtzaG91bGRCcmVhazohMH0pOmE/XyhzKTpzLGldKV07cmV0dXJuIHIuYm9keT91LnB1c2goIiAiLG4oImJvZHkiKSk6dS5wdXNoKHFlKHQpKSx1fWZ1bmN0aW9uIEdOKGUpe2xldCB0PXh0KGUpO3JldHVybiB0Lmxlbmd0aD09PTEmJiFlLnR5cGVQYXJhbWV0ZXJzJiYhcShlLHouRGFuZ2xpbmcpJiZ0WzBdLnR5cGU9PT0iSWRlbnRpZmllciImJiF0WzBdLnR5cGVBbm5vdGF0aW9uJiYhcSh0WzBdKSYmIXRbMF0ub3B0aW9uYWwmJiFlLnByZWRpY2F0ZSYmIWUucmV0dXJuVHlwZX1mdW5jdGlvbiBHRShlLHQpe2lmKHQuYXJyb3dQYXJlbnM9PT0iYWx3YXlzIilyZXR1cm4hMTtpZih0LmFycm93UGFyZW5zPT09ImF2b2lkIil7bGV0e25vZGU6bn09ZTtyZXR1cm4gR04obil9cmV0dXJuITF9ZnVuY3Rpb24gTWQoZSx0KXtsZXR7bm9kZTpufT1lLHI9W2R0KGUsdCwicmV0dXJuVHlwZSIpXTtyZXR1cm4gbi5wcmVkaWNhdGUmJnIucHVzaCh0KCJwcmVkaWNhdGUiKSkscn1mdW5jdGlvbiBPZChlLHQpe2lmKHQuc2VtaSlyZXR1cm4hMTtsZXR7bm9kZTpufT1lO2lmKG4udHlwZSE9PSJFeHByZXNzaW9uU3RhdGVtZW50Inx8WEUoZSx0KXx8UUUoZSx0KXx8WUUoZSx0KSlyZXR1cm4hMTtsZXR7a2V5OnIscGFyZW50OnN9PWU7cmV0dXJuISEoKHI9PT0iYm9keSImJihzLnR5cGU9PT0iUHJvZ3JhbSJ8fHMudHlwZT09PSJCbG9ja1N0YXRlbWVudCJ8fHMudHlwZT09PSJTdGF0aWNCbG9jayJ8fHMudHlwZT09PSJUU01vZHVsZUJsb2NrIil8fHI9PT0iY29uc2VxdWVudCImJnMudHlwZT09PSJTd2l0Y2hDYXNlIikmJmUuY2FsbCgoKT0+S0UoZSx0KSwiZXhwcmVzc2lvbiIpKX1mdW5jdGlvbiBLRShlLHQpe2xldHtub2RlOm59PWU7c3dpdGNoKG4udHlwZSl7Y2FzZSJQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiI6Y2FzZSJUeXBlQ2FzdEV4cHJlc3Npb24iOmNhc2UiVFNUeXBlQXNzZXJ0aW9uIjpjYXNlIkFycmF5RXhwcmVzc2lvbiI6Y2FzZSJBcnJheVBhdHRlcm4iOmNhc2UiVGVtcGxhdGVMaXRlcmFsIjpjYXNlIlRlbXBsYXRlRWxlbWVudCI6Y2FzZSJSZWdFeHBMaXRlcmFsIjpyZXR1cm4hMDtjYXNlIkFycm93RnVuY3Rpb25FeHByZXNzaW9uIjppZighR0UoZSx0KSlyZXR1cm4hMDticmVhaztjYXNlIlVuYXJ5RXhwcmVzc2lvbiI6e2xldHtwcmVmaXg6cixvcGVyYXRvcjpzfT1uO2lmKHImJihzPT09IisifHxzPT09Ii0iKSlyZXR1cm4hMDticmVha31jYXNlIkJpbmRFeHByZXNzaW9uIjppZighbi5vYmplY3QpcmV0dXJuITA7YnJlYWs7Y2FzZSJMaXRlcmFsIjppZihuLnJlZ2V4KXJldHVybiEwO2JyZWFrO2RlZmF1bHQ6aWYoY3QobikpcmV0dXJuITB9cmV0dXJuIHRuKGUsdCk/ITA6RWQobik/ZS5jYWxsKCgpPT5LRShlLHQpLC4uLmlFKG4pKTohMX12YXIgUmQ9KHtub2RlOmUscGFyZW50OnR9KT0+ZS50eXBlPT09IkV4cHJlc3Npb25TdGF0ZW1lbnQiJiZ0LnR5cGU9PT0iUHJvZ3JhbSImJnQuYm9keS5sZW5ndGg9PT0xJiYoQXJyYXkuaXNBcnJheSh0LmRpcmVjdGl2ZXMpJiZ0LmRpcmVjdGl2ZXMubGVuZ3RoPT09MHx8IXQuZGlyZWN0aXZlcyk7ZnVuY3Rpb24gWEUoZSx0KXtyZXR1cm4odC5wYXJlbnRQYXJzZXI9PT0ibWFya2Rvd24ifHx0LnBhcmVudFBhcnNlcj09PSJtZHgiKSYmUmQoZSkmJmN0KGUubm9kZS5leHByZXNzaW9uKX1mdW5jdGlvbiBZRShlLHQpe3JldHVybiB0Ll9faXNIdG1sSW5saW5lRXZlbnRIYW5kbGVyJiZSZChlKX1mdW5jdGlvbiBRRShlLHQpe3JldHVybih0LnBhcnNlcj09PSJfX3Z1ZV9ldmVudF9iaW5kaW5nInx8dC5wYXJzZXI9PT0iX192dWVfdHNfZXZlbnRfYmluZGluZyIpJiZSZChlKX1mdW5jdGlvbiBaRShlLHQpe2lmKCFPZChlLHQpKXJldHVybiExO2xldCBuPWNlKDAsZW4oZS5ub2RlLHouTGVhZGluZyksLTEpO3JldHVybiEhKG4mJm9kKG4pKX12YXIgS049SyhbIkNsYXNzRGVjbGFyYXRpb24iLCJDbGFzc0V4cHJlc3Npb24iLCJEZWNsYXJlQ2xhc3MiLCJEZWNsYXJlSW50ZXJmYWNlIiwiSW50ZXJmYWNlRGVjbGFyYXRpb24iLCJUU0ludGVyZmFjZURlY2xhcmF0aW9uIl0pO2Z1bmN0aW9uIFhOKGUsdCl7bGV0e2tleTpuLHBhcmVudDpyfT1lO2lmKG49PT0idHlwZXMiJiZadChyKXx8bj09PSJhcmd1bWVudCImJnIudHlwZT09PSJKU1hTcHJlYWRBdHRyaWJ1dGUifHxuPT09ImV4cHJlc3Npb24iJiZyLnR5cGU9PT0iSlNYU3ByZWFkQ2hpbGQifHxuPT09InN1cGVyQ2xhc3MiJiYoci50eXBlPT09IkNsYXNzRGVjbGFyYXRpb24ifHxyLnR5cGU9PT0iQ2xhc3NFeHByZXNzaW9uIil8fChuPT09ImlkInx8bj09PSJ0eXBlUGFyYW1ldGVycyIpJiZLTihyKXx8bj09PSJwYXR0ZXJucyImJnIudHlwZT09PSJNYXRjaE9yUGF0dGVybiJ8fFpiKGUpKXJldHVybiEwO2xldHtub2RlOnN9PWU7cmV0dXJuIHBjKHMpPyExOnMudHlwZT09PSJFeHByZXNzaW9uU3RhdGVtZW50Ij9aRShlLHQpOlp0KHMpP1dFKGUpOiEhY3Qocyl9dmFyIFlOPVhOO2Z1bmN0aW9uIFFOKGUsdCxuPTApe2xldCByPTA7Zm9yKGxldCBzPW47czxlLmxlbmd0aDsrK3MpZVtzXT09PSIJIj9yPXIrdC1yJXQ6cisrO3JldHVybiByfXZhciBaTj1RTjtmdW5jdGlvbiBlNChlLHQpe2xldCBuPWUubGFzdEluZGV4T2YoYApgKTtyZXR1cm4gbj09PS0xPzA6Wk4oZS5zbGljZShuKzEpLm1hdGNoKC9eW1x0IF0qLylbMF0sdCl9dmFyIHQ0PWU0O2Z1bmN0aW9uIGV2KGUsdCxuKXtpZihhNChlKSl7bGV0IGk9cjQoZSx0LG4pO2lmKGkpcmV0dXJuIGl9bGV0IHI9dHUoZSx0LG4pLHM9ZS5tYXAoKHtpc0xhc3Q6aSxpbmRleDpvfSk9PltuKCksaT8iIjpyW29dXSwicXVhc2lzIik7cmV0dXJuW0NuLCJgIiwuLi5zLCJgIl19ZnVuY3Rpb24gbjQoZSx0LG4pe2xldCByPW4oInF1YXNpIikse25vZGU6c309ZSxpPSIiLG89ZW4ocy5xdWFzaSx6LkxlYWRpbmcpWzBdO3JldHVybiBvJiYocXQodC5vcmlnaW5hbFRleHQsWChzLnR5cGVBcmd1bWVudHM/P3MudGFnKSxlZShvKSk/aT1QOmk9IiAiKSxYYShyLmxhYmVsJiZ7dGFnZ2VkOiEwLC4uLnIubGFiZWx9LFtuKCJ0YWciKSxuKCJ0eXBlQXJndW1lbnRzIiksaSxDbixyXSl9ZnVuY3Rpb24gcjQoZSx0LG4pe2xldHtub2RlOnJ9PWUscz1yLnF1YXNpc1swXS52YWx1ZS5yYXcudHJpbSgpLnNwbGl0KC9ccypcfFxzKi8pO2lmKHMubGVuZ3RoPjF8fHMuc29tZShpPT5pLmxlbmd0aD4wKSl7dC5fX2luSmVzdEVhY2g9ITA7bGV0IGk9dHUoZSx0LG4pO3QuX19pbkplc3RFYWNoPSExO2xldCBvPWkubWFwKGM9PndFKGMsey4uLnQscHJpbnRXaWR0aDpOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFksZW5kT2ZMaW5lOiJsZiJ9KS5mb3JtYXR0ZWQpLGE9W3toYXNMaW5lQnJlYWs6ITEsY2VsbHM6W119XTtmb3IobGV0IGM9MTtjPHIucXVhc2lzLmxlbmd0aDtjKyspe2xldCBwPWNlKDAsYSwtMSksaD1vW2MtMV07cC5jZWxscy5wdXNoKGgpLGguaW5jbHVkZXMoYApgKSYmKHAuaGFzTGluZUJyZWFrPSEwKSxyLnF1YXNpc1tjXS52YWx1ZS5yYXcuaW5jbHVkZXMoYApgKSYmYS5wdXNoKHtoYXNMaW5lQnJlYWs6ITEsY2VsbHM6W119KX1sZXQgdT1NYXRoLm1heChzLmxlbmd0aCwuLi5hLm1hcChjPT5jLmNlbGxzLmxlbmd0aCkpLGw9QXJyYXkuZnJvbSh7bGVuZ3RoOnV9LCgpPT4wKSxmPVt7Y2VsbHM6c30sLi4uYS5maWx0ZXIoYz0+Yy5jZWxscy5sZW5ndGg+MCldO2ZvcihsZXQgYyBvZiBmKWlmKCFjLmhhc0xpbmVCcmVhaylmb3IobGV0W3AsaF1vZiBjLmNlbGxzLmVudHJpZXMoKSlsW3BdPU1hdGgubWF4KGxbcF0sU28oaCkpO3JldHVybltDbiwiYCIsTyhbUixmZShSLGYubWFwKGM9PmZlKCIgfCAiLGMuY2VsbHMubWFwKChwLGgpPT5jLmhhc0xpbmVCcmVhaz9wOnArIiAiLnJlcGVhdChsW2hdLVNvKHApKSkpKSldKSxSLCJgIl19fXZhciBzND1uZXcgV2Vha01hcDtmdW5jdGlvbiBpNChlLHQpe2xldHtwYXJlbnQ6bixpbmRleDpyfT1lO3JldHVybiB2bihzNCxuLHM9PntsZXR7dGFiV2lkdGg6aX09dCxvPTA7cmV0dXJuIHMucXVhc2lzLm1hcChhPT57bGV0IHU9YS52YWx1ZS5yYXcsbD11LmluY2x1ZGVzKGAKYCk/dDQodSxpKTpvO3JldHVybiBvPWwse2luZGVudFNpemU6bCxwcmV2aW91c1F1YXNpVGV4dDp1fX0pfSlbcl19ZnVuY3Rpb24gbzQoZSx0LG4pe2xldHtub2RlOnIsaW5kZXg6c309ZSxpPW4oKSxvPWUucGFyZW50LHtxdWFzaXM6YX09byx1PVgoYVtzXSksbD1lZShhW3MrMV0pLGY9cXQodC5vcmlnaW5hbFRleHQsdSxsKTtpZighZil7bGV0IGg9d0UoaSx7Li4udCxwcmludFdpZHRoOk51bWJlci5QT1NJVElWRV9JTkZJTklUWX0pLmZvcm1hdHRlZDtoLmluY2x1ZGVzKGAKYCk/Zj0hMDppPWh9ZiYmKHEocil8fHIudHlwZT09PSJJZGVudGlmaWVyInx8eGUoRHMocikpfHxyLnR5cGU9PT0iQ29uZGl0aW9uYWxFeHByZXNzaW9uInx8ci50eXBlPT09IlNlcXVlbmNlRXhwcmVzc2lvbiJ8fHFuKHIpfHxTcihyKSkmJihpPVtPKFtQLGldKSxQXSk7bGV0e2luZGVudFNpemU6YyxwcmV2aW91c1F1YXNpVGV4dDpwfT1pNChlLHQpO3JldHVybiB0Ll9faW5KZXN0RWFjaCYmKGM9TWF0aC5tYXgoYyx0LnRhYldpZHRoKSksaT1jPT09MCYmcC5lbmRzV2l0aChgCmApP25uKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxpKTpUNShpLGMsdC50YWJXaWR0aCksXyhbIiR7IixpLENuLCJ9Il0pfWZ1bmN0aW9uIHR1KGUsdCxuKXtyZXR1cm4gZS5tYXAoKCk9Pm80KGUsdCxuKSxlLm5vZGUudHlwZT09PSJUU1RlbXBsYXRlTGl0ZXJhbFR5cGUiPyJ0eXBlcyI6ImV4cHJlc3Npb25zIil9ZnVuY3Rpb24gdHYoZSx0KXtyZXR1cm4gQ28oZSxuPT50eXBlb2Ygbj09InN0cmluZyI/dD9mdCgwLG4sLyhcXCopYC9nLCIkMSQxXFxgIik6bnYobik6bil9ZnVuY3Rpb24gbnYoZSl7cmV0dXJuIGZ0KDAsZSwvKFtcXGBdfFwkXHspL2csIlxcJDEiKX12YXIgcnY9L15bZnhdPyg/OmRlc2NyaWJlfGl0fHRlc3QpJC87ZnVuY3Rpb24gYTQoe25vZGU6ZSxwYXJlbnQ6dH0pe3JldHVybiBlLnR5cGU9PT0iVGVtcGxhdGVMaXRlcmFsIiYmdC50eXBlPT09IlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiImJnQucXVhc2k9PT1lJiZ0LnRhZy50eXBlPT09Ik1lbWJlckV4cHJlc3Npb24iJiZ0LnRhZy5wcm9wZXJ0eS50eXBlPT09IklkZW50aWZpZXIiJiZ0LnRhZy5wcm9wZXJ0eS5uYW1lPT09ImVhY2giJiYodC50YWcub2JqZWN0LnR5cGU9PT0iSWRlbnRpZmllciImJnJ2LnRlc3QodC50YWcub2JqZWN0Lm5hbWUpfHx0LnRhZy5vYmplY3QudHlwZT09PSJNZW1iZXJFeHByZXNzaW9uIiYmdC50YWcub2JqZWN0LnByb3BlcnR5LnR5cGU9PT0iSWRlbnRpZmllciImJih0LnRhZy5vYmplY3QucHJvcGVydHkubmFtZT09PSJvbmx5Inx8dC50YWcub2JqZWN0LnByb3BlcnR5Lm5hbWU9PT0ic2tpcCIpJiZ0LnRhZy5vYmplY3Qub2JqZWN0LnR5cGU9PT0iSWRlbnRpZmllciImJnJ2LnRlc3QodC50YWcub2JqZWN0Lm9iamVjdC5uYW1lKSl9dmFyIGpkPVsoZSx0KT0+dD09PSJwcm9wZXJ0aWVzIiYmZS50eXBlPT09Ik9iamVjdEV4cHJlc3Npb24iLChlLHQpPT50PT09ImFyZ3VtZW50cyImJmUudHlwZT09PSJDYWxsRXhwcmVzc2lvbiImJmUuY2FsbGVlLnR5cGU9PT0iSWRlbnRpZmllciImJmUuY2FsbGVlLm5hbWU9PT0iQ29tcG9uZW50IiwoZSx0KT0+dD09PSJleHByZXNzaW9uIiYmZS50eXBlPT09IkRlY29yYXRvciJdO2Z1bmN0aW9uIHU0KGUpe2xldCB0PXI9PnIudHlwZT09PSJUZW1wbGF0ZUxpdGVyYWwiLG49KHIscyk9PnlzKHIpJiYhci5jb21wdXRlZCYmci5rZXkudHlwZT09PSJJZGVudGlmaWVyIiYmci5rZXkubmFtZT09PSJzdHlsZXMiJiZzPT09InZhbHVlIjtyZXR1cm4gZS5tYXRjaCh0LChyLHMpPT5odChyKSYmcz09PSJlbGVtZW50cyIsbiwuLi5qZCl8fGUubWF0Y2godCxuLC4uLmpkKX1mdW5jdGlvbiBsNChlKXtyZXR1cm4gZS5tYXRjaCh0PT50LnR5cGU9PT0iVGVtcGxhdGVMaXRlcmFsIiwodCxuKT0+eXModCkmJiF0LmNvbXB1dGVkJiZ0LmtleS50eXBlPT09IklkZW50aWZpZXIiJiZ0LmtleS5uYW1lPT09InRlbXBsYXRlIiYmbj09PSJ2YWx1ZSIsLi4uamQpfWZ1bmN0aW9uIFZkKGUsdCl7cmV0dXJuIHEoZSx6LkJsb2NrfHouTGVhZGluZywoe3ZhbHVlOm59KT0+bj09PWAgJHt0fSBgKX1mdW5jdGlvbiBzdih7bm9kZTplLHBhcmVudDp0fSxuKXtyZXR1cm4gVmQoZSxuKXx8YzQodCkmJlZkKHQsbil8fHQudHlwZT09PSJFeHByZXNzaW9uU3RhdGVtZW50IiYmVmQodCxuKX1mdW5jdGlvbiBjNChlKXtyZXR1cm4gZS50eXBlPT09IkFzQ29uc3RFeHByZXNzaW9uInx8ZS50eXBlPT09IlRTQXNFeHByZXNzaW9uIiYmZS50eXBlQW5ub3RhdGlvbi50eXBlPT09IlRTVHlwZVJlZmVyZW5jZSImJmUudHlwZUFubm90YXRpb24udHlwZU5hbWUudHlwZT09PSJJZGVudGlmaWVyIiYmZS50eXBlQW5ub3RhdGlvbi50eXBlTmFtZS5uYW1lPT09ImNvbnN0In1hc3luYyBmdW5jdGlvbiBmNChlLHQsbixyKXtsZXR7bm9kZTpzfT1uLGk9IiI7Zm9yKGxldFtsLGZdb2Ygcy5xdWFzaXMuZW50cmllcygpKXtsZXR7cmF3OmN9PWYudmFsdWU7bD4wJiYoaSs9IkBwcmV0dGllci1wbGFjZWhvbGRlci0iKyhsLTEpKyItaWQiKSxpKz1jfWxldCBvPWF3YWl0IGUoaSx7cGFyc2VyOiJzY3NzIn0pLGE9dHUobixyLHQpLHU9cDQobyxhKTtpZighdSl0aHJvdyBuZXcgRXJyb3IoIkNvdWxkbid0IGluc2VydCBhbGwgdGhlIGV4cHJlc3Npb25zIik7cmV0dXJuWyJgIixPKFtSLHVdKSxQLCJgIl19ZnVuY3Rpb24gcDQoZSx0KXtpZighU2UodCkpcmV0dXJuIGU7bGV0IG49MCxyPUNvKEFkKGUpLHM9PnR5cGVvZiBzIT0ic3RyaW5nInx8IXMuaW5jbHVkZXMoIkBwcmV0dGllci1wbGFjZWhvbGRlciIpP3M6cy5zcGxpdCgvQHByZXR0aWVyLXBsYWNlaG9sZGVyLShcZCspLWlkLykubWFwKChpLG8pPT5vJTI9PT0wP2FpKGkpOihuKyssdFtpXSkpKTtyZXR1cm4gdC5sZW5ndGg9PT1uP3I6bnVsbH1mdW5jdGlvbiBoNChlKXtyZXR1cm4gZS5tYXRjaCh2b2lkIDAsKHQsbik9Pm49PT0icXVhc2kiJiZ0LnR5cGU9PT0iVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uIiYma2QodC50YWcsWyJjc3MiLCJjc3MuZ2xvYmFsIiwiY3NzLnJlc29sdmUiXSkpfHxlLm1hdGNoKHZvaWQgMCwodCxuKT0+bj09PSJleHByZXNzaW9uIiYmdC50eXBlPT09IkpTWEV4cHJlc3Npb25Db250YWluZXIiLCh0LG4pPT5uPT09ImNoaWxkcmVuIiYmdC50eXBlPT09IkpTWEVsZW1lbnQiJiZ0Lm9wZW5pbmdFbGVtZW50Lm5hbWUudHlwZT09PSJKU1hJZGVudGlmaWVyIiYmdC5vcGVuaW5nRWxlbWVudC5uYW1lLm5hbWU9PT0ic3R5bGUiJiZ0Lm9wZW5pbmdFbGVtZW50LmF0dHJpYnV0ZXMuc29tZShyPT5yLnR5cGU9PT0iSlNYQXR0cmlidXRlIiYmci5uYW1lLnR5cGU9PT0iSlNYSWRlbnRpZmllciImJnIubmFtZS5uYW1lPT09ImpzeCIpKX1mdW5jdGlvbiBDYyhlKXtyZXR1cm4gZS50eXBlPT09IklkZW50aWZpZXIiJiZlLm5hbWU9PT0ic3R5bGVkIn1mdW5jdGlvbiBpdihlKXtyZXR1cm4vXltBLVpdLy50ZXN0KGUub2JqZWN0Lm5hbWUpJiZlLnByb3BlcnR5Lm5hbWU9PT0iZXh0ZW5kIn1mdW5jdGlvbiBkNCh7cGFyZW50OmV9KXtpZighZXx8ZS50eXBlIT09IlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiIpcmV0dXJuITE7bGV0IHQ9ZS50YWcudHlwZT09PSJQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiI/ZS50YWcuZXhwcmVzc2lvbjplLnRhZztzd2l0Y2godC50eXBlKXtjYXNlIk1lbWJlckV4cHJlc3Npb24iOnJldHVybiBDYyh0Lm9iamVjdCl8fGl2KHQpO2Nhc2UiQ2FsbEV4cHJlc3Npb24iOnJldHVybiBDYyh0LmNhbGxlZSl8fHQuY2FsbGVlLnR5cGU9PT0iTWVtYmVyRXhwcmVzc2lvbiImJih0LmNhbGxlZS5vYmplY3QudHlwZT09PSJNZW1iZXJFeHByZXNzaW9uIiYmKENjKHQuY2FsbGVlLm9iamVjdC5vYmplY3QpfHxpdih0LmNhbGxlZS5vYmplY3QpKXx8dC5jYWxsZWUub2JqZWN0LnR5cGU9PT0iQ2FsbEV4cHJlc3Npb24iJiZDYyh0LmNhbGxlZS5vYmplY3QuY2FsbGVlKSk7Y2FzZSJJZGVudGlmaWVyIjpyZXR1cm4gdC5uYW1lPT09ImNzcyI7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gbTQoe3BhcmVudDplLGdyYW5kcGFyZW50OnR9KXtyZXR1cm4odD09bnVsbD92b2lkIDA6dC50eXBlKT09PSJKU1hBdHRyaWJ1dGUiJiZlLnR5cGU9PT0iSlNYRXhwcmVzc2lvbkNvbnRhaW5lciImJnQubmFtZS50eXBlPT09IkpTWElkZW50aWZpZXIiJiZ0Lm5hbWUubmFtZT09PSJjc3MifXZhciBnND1lPT5oNChlKXx8ZDQoZSl8fG00KGUpfHx1NChlKTthc3luYyBmdW5jdGlvbiB5NChlLHQsbixyKXtsZXR7bm9kZTpzfT1uLGk9cy5xdWFzaXMubGVuZ3RoLG89dHUobixyLHQpLGE9W107Zm9yKGxldCB1PTA7dTxpO3UrKyl7bGV0IGw9cy5xdWFzaXNbdV0sZj11PT09MCxjPXU9PT1pLTEscD1sLnZhbHVlLmNvb2tlZCxoPXAuc3BsaXQoYApgKSxkPWgubGVuZ3RoO2lmKCFjJiYvI1teXG5ccl0qJC8udGVzdChoW2QtMV0pKXJldHVybiBudWxsO2xldCBtPWQ+MiYmaFswXS50cmltKCk9PT0iIiYmaFsxXS50cmltKCk9PT0iIixnPWQ+MiYmaFtkLTFdLnRyaW0oKT09PSIiJiZoW2QtMl0udHJpbSgpPT09IiIsRD1oLmV2ZXJ5KEU9Pi9eXHMqKD86I1teXG5ccl0qKT8kLy50ZXN0KEUpKSxiO0Q/Yj1ENChoKTpiPWF3YWl0IGUocCx7cGFyc2VyOiJncmFwaHFsIn0pLGI/KGI9dHYoYiwhMSksIWYmJm0mJmEucHVzaCgiIiksYS5wdXNoKGIpLCFjJiZnJiZhLnB1c2goIiIpKTohZiYmIWMmJm0mJmEucHVzaCgiIiksY3x8YS5wdXNoKG9bdV0pfXJldHVyblsiYCIsTyhbUixmZShSLGEpXSksUiwiYCJdfWZ1bmN0aW9uIEQ0KGUpe2xldCB0PVtdLG49ITEscj1lLm1hcChzPT5zLnRyaW0oKSk7Zm9yKGxldFtzLGldb2Ygci5lbnRyaWVzKCkpaSE9PSIiJiYocltzLTFdPT09IiImJm4/dC5wdXNoKFtSLGldKTp0LnB1c2goaSksbj0hMCk7cmV0dXJuIHQubGVuZ3RoPT09MD9udWxsOmZlKFIsdCl9ZnVuY3Rpb24gYjQoe25vZGU6ZSxwYXJlbnQ6dH0pe3JldHVybiBzdih7bm9kZTplLHBhcmVudDp0fSwiR3JhcGhRTCIpfHx0JiYodC50eXBlPT09IlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiImJih0LnRhZy50eXBlPT09Ik1lbWJlckV4cHJlc3Npb24iJiZ0LnRhZy5vYmplY3QubmFtZT09PSJncmFwaHFsIiYmdC50YWcucHJvcGVydHkubmFtZT09PSJleHBlcmltZW50YWwifHx0LnRhZy50eXBlPT09IklkZW50aWZpZXIiJiYodC50YWcubmFtZT09PSJncWwifHx0LnRhZy5uYW1lPT09ImdyYXBocWwiKSl8fHQudHlwZT09PSJDYWxsRXhwcmVzc2lvbiImJnQuY2FsbGVlLnR5cGU9PT0iSWRlbnRpZmllciImJnQuY2FsbGVlLm5hbWU9PT0iZ3JhcGhxbCIpfXZhciBVZD0wO2FzeW5jIGZ1bmN0aW9uIG92KGUsdCxuLHIscyl7bGV0e25vZGU6aX09cixvPVVkO1VkPVVkKzE+Pj4wO2xldCBhPUQ9PmBQUkVUVElFUl9IVE1MX1BMQUNFSE9MREVSXyR7RH1fJHtvfV9JTl9KU2AsdT1pLnF1YXNpcy5tYXAoKEQsYixFKT0+Yj09PUUubGVuZ3RoLTE/RC52YWx1ZS5jb29rZWQ6RC52YWx1ZS5jb29rZWQrYShiKSkuam9pbigiIiksbD10dShyLHMsbiksZj1uZXcgUmVnRXhwKGEoIihcXGQrKSIpLCJnIiksYz0wLHA9YXdhaXQgdCh1LHtwYXJzZXI6ZSxfX29uSHRtbFJvb3QoRCl7Yz1ELmNoaWxkcmVuLmxlbmd0aH19KSxoPUNvKHAsRD0+e2lmKHR5cGVvZiBEIT0ic3RyaW5nIilyZXR1cm4gRDtsZXQgYj1bXSxFPUQuc3BsaXQoZik7Zm9yKGxldCBGPTA7RjxFLmxlbmd0aDtGKyspe2xldCB2PUVbRl07aWYoRiUyPT09MCl7diYmKHY9bnYodikscy5fX2VtYmVkZGVkSW5IdG1sJiYodj1mdCgwLHYsLzxcLyg/PXNjcmlwdFxiKS9naSwiPFxcLyIpKSxiLnB1c2godikpO2NvbnRpbnVlfWxldCBDPU51bWJlcih2KTtiLnB1c2gobFtDXSl9cmV0dXJuIGJ9KSxkPS9eXHMvLnRlc3QodSk/IiAiOiIiLG09L1xzJC8udGVzdCh1KT8iICI6IiIsZz1zLmh0bWxXaGl0ZXNwYWNlU2Vuc2l0aXZpdHk9PT0iaWdub3JlIj9SOmQmJm0/SDpudWxsO3JldHVybiBnP18oWyJgIixPKFtnLF8oaCldKSxnLCJgIl0pOlhhKHtodWc6ITF9LF8oWyJgIixkLGM+MT9PKF8oaCkpOl8oaCksbSwiYCJdKSl9ZnVuY3Rpb24gRTQoZSl7cmV0dXJuIHN2KGUsIkhUTUwiKXx8ZS5tYXRjaCh0PT50LnR5cGU9PT0iVGVtcGxhdGVMaXRlcmFsIiwodCxuKT0+dC50eXBlPT09IlRhZ2dlZFRlbXBsYXRlRXhwcmVzc2lvbiImJnQudGFnLnR5cGU9PT0iSWRlbnRpZmllciImJnQudGFnLm5hbWU9PT0iaHRtbCImJm49PT0icXVhc2kiKX12YXIgdjQ9b3YuYmluZCh2b2lkIDAsImh0bWwiKSxGND1vdi5iaW5kKHZvaWQgMCwiYW5ndWxhciIpO2FzeW5jIGZ1bmN0aW9uIEE0KGUsdCxuKXtsZXR7bm9kZTpyfT1uLHM9ZnQoMCxyLnF1YXNpc1swXS52YWx1ZS5yYXcsLygoPzpcXFxcKSopXFxgL2csKHUsbCk9PiJcXCIucmVwZWF0KGwubGVuZ3RoLzIpKyJgIiksaT13NChzKSxvPWkhPT0iIjtvJiYocz1mdCgwLHMsbmV3IFJlZ0V4cChgXiR7aX1gLCJnbSIpLCIiKSk7bGV0IGE9dHYoYXdhaXQgZShzLHtwYXJzZXI6Im1hcmtkb3duIixfX2luSnNUZW1wbGF0ZTohMH0pLCEwKTtyZXR1cm5bImAiLG8/TyhbUCxhXSk6W3dkLHg1KGEpXSxQLCJgIl19ZnVuY3Rpb24gdzQoZSl7bGV0IHQ9ZS5tYXRjaCgvXihbXlxTXG5dKilcUy9tKTtyZXR1cm4gdD09PW51bGw/IiI6dFsxXX1mdW5jdGlvbiBDNCh7bm9kZTplLHBhcmVudDp0fSl7cmV0dXJuKHQ9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uIiYmZS5xdWFzaXMubGVuZ3RoPT09MSYmdC50YWcudHlwZT09PSJJZGVudGlmaWVyIiYmKHQudGFnLm5hbWU9PT0ibWQifHx0LnRhZy5uYW1lPT09Im1hcmtkb3duIil9dmFyIFM0PVt7dGVzdDpnNCxwcmludDpmNH0se3Rlc3Q6YjQscHJpbnQ6eTR9LHt0ZXN0OkU0LHByaW50OnY0fSx7dGVzdDpsNCxwcmludDpGNH0se3Rlc3Q6QzQscHJpbnQ6QTR9XS5tYXAoKHt0ZXN0OmUscHJpbnQ6dH0pPT4oe3Rlc3Q6ZSxwcmludDprNCh0KX0pKTtmdW5jdGlvbiB4NChlKXtsZXR7bm9kZTp0fT1lO2lmKHQudHlwZSE9PSJUZW1wbGF0ZUxpdGVyYWwifHxUNCh0KSlyZXR1cm47bGV0IG49UzQuZmluZCgoe3Rlc3Q6cn0pPT5yKGUpKTtpZihuKXJldHVybiB0LnF1YXNpcy5sZW5ndGg9PT0xJiZ0LnF1YXNpc1swXS52YWx1ZS5yYXcudHJpbSgpPT09IiI/ImBgIjpuLnByaW50fWZ1bmN0aW9uIGs0KGUpe3JldHVybiBhc3luYyguLi50KT0+e2xldCBuPWF3YWl0IGUoLi4udCk7cmV0dXJuIG4mJlhhKHtlbWJlZDohMCwuLi5uLmxhYmVsfSxuKX19ZnVuY3Rpb24gVDQoe3F1YXNpczplfSl7cmV0dXJuIGUuc29tZSgoe3ZhbHVlOntjb29rZWQ6dH19KT0+dD09PW51bGwpfXZhciBOND14NDtmdW5jdGlvbiBMNChlLHQpe2UudHlwZT09PSJDaGFpbkV4cHJlc3Npb24iPyQ0KHQpOihlLnR5cGU9PT0iT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uInx8ZS50eXBlPT09Ik9wdGlvbmFsQ2FsbEV4cHJlc3Npb24iKSYmQjQodCl9ZnVuY3Rpb24gYXYoZSl7aWYoeGUoZSkpcmV0dXJuIm9iamVjdCI7aWYodmUoZSkpcmV0dXJuImNhbGxlZSI7aWYoWnMoZSkpcmV0dXJuImV4cHJlc3Npb24ifWZ1bmN0aW9uIFNjKGUpe2xldCB0PWF2KGUpO2lmKHQpcmV0dXJuIGVbdF19ZnVuY3Rpb24gJDQoZSl7Zm9yKGU9U2MoZSk7ZS50eXBlPT09Ik1lbWJlckV4cHJlc3Npb24ifHxlLnR5cGU9PT0iQ2FsbEV4cHJlc3Npb24ifHxlLnR5cGU9PT0iVFNOb25OdWxsRXhwcmVzc2lvbiI7ZT1TYyhlKSl7bGV0IHQ9YXYoZSksbj1lW3RdO24udHlwZT09PSJDaGFpbkV4cHJlc3Npb24iJiYoZVt0XT1uLmV4cHJlc3Npb24pfX1mdW5jdGlvbiBCNChlKXtmb3IoZT1TYyhlKTtlLnR5cGU9PT0iTWVtYmVyRXhwcmVzc2lvbiJ8fGUudHlwZT09PSJDYWxsRXhwcmVzc2lvbiI7ZT1TYyhlKSllLnR5cGU9YE9wdGlvbmFsJHtlLnR5cGV9YH1mdW5jdGlvbiB1dihlLHQsbil7bGV0IHI9dFtuXTsoc3Qocil8fGlyKHIpKSYmKGVbbl09U3RyaW5nKHIudmFsdWUpKSxyLnR5cGU9PT0iSWRlbnRpZmllciImJihlW25dPXIubmFtZSl9ZnVuY3Rpb24gXzQoZSx0KXsoZS50eXBlPT09IlByb3BlcnR5Inx8ZS50eXBlPT09Ik9iamVjdFByb3BlcnR5Inx8ZS50eXBlPT09Ik1ldGhvZERlZmluaXRpb24ifHxlLnR5cGU9PT0iQ2xhc3NQcm9wZXJ0eSJ8fGUudHlwZT09PSJDbGFzc01ldGhvZCJ8fGUudHlwZT09PSJQcm9wZXJ0eURlZmluaXRpb24ifHxlLnR5cGU9PT0iVFNEZWNsYXJlTWV0aG9kInx8ZS50eXBlPT09IlRTUHJvcGVydHlTaWduYXR1cmUifHxlLnR5cGU9PT0iVFNNZXRob2RTaWduYXR1cmUifHxlLnR5cGU9PT0iT2JqZWN0VHlwZVByb3BlcnR5Inx8ZS50eXBlPT09IkltcG9ydEF0dHJpYnV0ZSJ8fGUudHlwZT09PSJSZWNvcmREZWNsYXJhdGlvblByb3BlcnR5Inx8ZS50eXBlPT09IlJlY29yZERlY2xhcmF0aW9uU3RhdGljUHJvcGVydHkiKSYmIWUuY29tcHV0ZWQmJnV2KHQsZSwia2V5IiksZS50eXBlPT09IlRTRW51bU1lbWJlciImJnV2KHQsZSwiaWQiKX1mdW5jdGlvbiBJNChlLHQpe2UudHlwZT09PSJSZWdFeHBMaXRlcmFsIiYmKHQuZmxhZ3M9Wy4uLmUuZmxhZ3NdLnNvcnQoKS5qb2luKCIiKSksZS50eXBlPT09IkxpdGVyYWwiJiYicmVnZXgiaW4gZSYmKHQucmVnZXguZmxhZ3M9Wy4uLmUucmVnZXguZmxhZ3NdLnNvcnQoKS5qb2luKCIiKSl9dmFyIFA0PW5ldyBTZXQoWyJyYW5nZSIsInJhdyIsImNvbW1lbnRzIiwiZXh0cmEiLCJzdGFydCIsImVuZCIsImxvYyIsImVycm9ycyIsInRva2VucyIsInRyYWlsaW5nQ29tbWEiLCJkb2NibG9jayIsIl9fY29udGVudEVuZCJdKSx4bz1lPT57Zm9yKGxldCB0IG9mIGUucXVhc2lzKWRlbGV0ZSB0LnZhbHVlfTtmdW5jdGlvbiBsdihlLHQsbil7aWYoZS50eXBlPT09IlByb2dyYW0iJiZkZWxldGUgdC5zb3VyY2VUeXBlLEw0KGUsdCksXzQoZSx0KSxJNChlLHQpLChOayhlKXx8ZS50eXBlPT09IkJpZ0ludExpdGVyYWxUeXBlQW5ub3RhdGlvbiIpJiYiYmlnaW50ImluIGUmJih0LmJpZ2ludD1lLmJpZ2ludC50b0xvd2VyQ2FzZSgpKSxlLnR5cGU9PT0iRW1wdHlTdGF0ZW1lbnQiJiYhWGgoe25vZGU6ZSxwYXJlbnQ6bn0pfHxlLnR5cGU9PT0iSlNYVGV4dCJ8fGUudHlwZT09PSJKU1hFeHByZXNzaW9uQ29udGFpbmVyIiYmKGUuZXhwcmVzc2lvbi50eXBlPT09IkxpdGVyYWwifHxlLmV4cHJlc3Npb24udHlwZT09PSJTdHJpbmdMaXRlcmFsIikmJmUuZXhwcmVzc2lvbi52YWx1ZT09PSIgIilyZXR1cm4gbnVsbDtpZihlLnR5cGU9PT0iSlNYRWxlbWVudCImJmUub3BlbmluZ0VsZW1lbnQubmFtZS50eXBlPT09IkpTWElkZW50aWZpZXIiJiZlLm9wZW5pbmdFbGVtZW50Lm5hbWUubmFtZT09PSJzdHlsZSImJmUub3BlbmluZ0VsZW1lbnQuYXR0cmlidXRlcy5zb21lKHM9PnMudHlwZT09PSJKU1hBdHRyaWJ1dGUiJiZzLm5hbWUubmFtZT09PSJqc3giKSlmb3IobGV0e3R5cGU6cyxleHByZXNzaW9uOml9b2YgdC5jaGlsZHJlbilzPT09IkpTWEV4cHJlc3Npb25Db250YWluZXIiJiZpLnR5cGU9PT0iVGVtcGxhdGVMaXRlcmFsIiYmeG8oaSk7ZS50eXBlPT09IkpTWEF0dHJpYnV0ZSImJmUubmFtZS5uYW1lPT09ImNzcyImJmUudmFsdWUudHlwZT09PSJKU1hFeHByZXNzaW9uQ29udGFpbmVyIiYmZS52YWx1ZS5leHByZXNzaW9uLnR5cGU9PT0iVGVtcGxhdGVMaXRlcmFsIiYmeG8odC52YWx1ZS5leHByZXNzaW9uKSxlLnR5cGU9PT0iSlNYQXR0cmlidXRlIiYmc3QoZS52YWx1ZSkmJi9bIiddfCZxdW90O3wmYXBvczsvLnRlc3QoZS52YWx1ZS52YWx1ZSkmJih0LnZhbHVlLnZhbHVlPWZ0KDAsZS52YWx1ZS52YWx1ZSwvWyInXXwmcXVvdDt8JmFwb3M7L2csJyInKSk7bGV0IHI9ZS5leHByZXNzaW9ufHxlLmNhbGxlZTtpZihlLnR5cGU9PT0iRGVjb3JhdG9yIiYmci50eXBlPT09IkNhbGxFeHByZXNzaW9uIiYmci5jYWxsZWUubmFtZT09PSJDb21wb25lbnQiJiZyLmFyZ3VtZW50cy5sZW5ndGg9PT0xKXtsZXQgcz1lLmV4cHJlc3Npb24uYXJndW1lbnRzWzBdLnByb3BlcnRpZXM7Zm9yKGxldFtpLG9db2YgdC5leHByZXNzaW9uLmFyZ3VtZW50c1swXS5wcm9wZXJ0aWVzLmVudHJpZXMoKSlzd2l0Y2goc1tpXS5rZXkubmFtZSl7Y2FzZSJzdHlsZXMiOmh0KG8udmFsdWUpJiZ4byhvLnZhbHVlLmVsZW1lbnRzWzBdKTticmVhaztjYXNlInRlbXBsYXRlIjpvLnZhbHVlLnR5cGU9PT0iVGVtcGxhdGVMaXRlcmFsIiYmeG8oby52YWx1ZSk7YnJlYWt9fWUudHlwZT09PSJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24iJiYoZS50YWcudHlwZT09PSJNZW1iZXJFeHByZXNzaW9uInx8ZS50YWcudHlwZT09PSJJZGVudGlmaWVyIiYmKGUudGFnLm5hbWU9PT0iZ3FsInx8ZS50YWcubmFtZT09PSJncmFwaHFsInx8ZS50YWcubmFtZT09PSJjc3MifHxlLnRhZy5uYW1lPT09Im1kInx8ZS50YWcubmFtZT09PSJtYXJrZG93biJ8fGUudGFnLm5hbWU9PT0iaHRtbCIpfHxlLnRhZy50eXBlPT09IkNhbGxFeHByZXNzaW9uIikmJnhvKHQucXVhc2kpLChlLnR5cGU9PT0iQ2FsbEV4cHJlc3Npb24ifHxlLnR5cGU9PT0iTWVtYmVyRXhwcmVzc2lvbiIpJiYhZS5vcHRpb25hbCYmZGVsZXRlIHQub3B0aW9uYWwsZS50eXBlPT09IlRlbXBsYXRlTGl0ZXJhbCImJnhvKHQpfWx2Lmlnbm9yZWRQcm9wZXJ0aWVzPVA0O3ZhciBNND0vXCpcLyQvLE80PS9eXC9cKlwqPy8sY3Y9L15ccyooXC9cKlwqPygufFxyP1xuKSo/XCpcLykvLFI0PS8oXnxccyspXC9cLyhbXlxuXHJdKikvZyxmdj0vXihccj9cbikrLyxqND0vKD86Xnxccj9cbikgKihAW15cblxyXSo/KSAqXHI/XG4gKig/IVteXG5cckBdKlwvXC9bXl0qKShbXlxzQF1bXlxuXHJAXSs/KSAqXHI/XG4vZyxwdj0vKD86Xnxccj9cbikgKkAoXFMrKSAqKFteXG5ccl0qKS9nLFY0PS8oXHI/XG58XikgKlwqID8vZyxodj1bXTtmdW5jdGlvbiBVNChlKXtsZXQgdD1lLm1hdGNoKGN2KTtyZXR1cm4gdD90WzBdLnRyaW1TdGFydCgpOiIifWZ1bmN0aW9uIHE0KGUpe3ZhciBuO2xldCB0PShuPWUubWF0Y2goY3YpKT09bnVsbD92b2lkIDA6blswXTtyZXR1cm4gdD09bnVsbD9lOmUuc2xpY2UodC5sZW5ndGgpfWZ1bmN0aW9uIFc0KGUpe2U9ZnQoMCxlLnJlcGxhY2UoTzQsIiIpLnJlcGxhY2UoTTQsIiIpLFY0LCIkMSIpO2xldCB0PSIiO2Zvcig7dCE9PWU7KXQ9ZSxlPWZ0KDAsZSxqNCxgCiQxICQyCmApO2U9ZS5yZXBsYWNlKGZ2LCIiKS50cmltRW5kKCk7bGV0IG49T2JqZWN0LmNyZWF0ZShudWxsKSxyPWZ0KDAsZSxwdiwiIikucmVwbGFjZShmdiwiIikudHJpbUVuZCgpLHM7Zm9yKDtzPXB2LmV4ZWMoZSk7KXtsZXQgaT1mdCgwLHNbMl0sUjQsIiIpO2lmKHR5cGVvZiBuW3NbMV1dPT0ic3RyaW5nInx8QXJyYXkuaXNBcnJheShuW3NbMV1dKSl7bGV0IG89bltzWzFdXTtuW3NbMV1dPVsuLi5odiwuLi5BcnJheS5pc0FycmF5KG8pP286W29dLGldfWVsc2UgbltzWzFdXT1pfXJldHVybntjb21tZW50czpyLHByYWdtYXM6bn19ZnVuY3Rpb24gSDQoe2NvbW1lbnRzOmU9IiIscHJhZ21hczp0PXt9fSl7bGV0IG49T2JqZWN0LmtleXModCkscj1uLmZsYXRNYXAoaT0+ZHYoaSx0W2ldKSkubWFwKGk9PmAgKiAke2l9CmApLmpvaW4oIiIpO2lmKCFlKXtpZihuLmxlbmd0aD09PTApcmV0dXJuIiI7aWYobi5sZW5ndGg9PT0xJiYhQXJyYXkuaXNBcnJheSh0W25bMF1dKSl7bGV0IGk9dFtuWzBdXTtyZXR1cm5gLyoqICR7ZHYoblswXSxpKVswXX0gKi9gfX1sZXQgcz1lLnNwbGl0KGAKYCkubWFwKGk9PmAgKiAke2l9YCkuam9pbihgCmApK2AKYDtyZXR1cm5gLyoqCmArKGU/czoiIikrKGUmJm4ubGVuZ3RoPjA/YCAqCmA6IiIpK3IrIiAqLyJ9ZnVuY3Rpb24gZHYoZSx0KXtyZXR1cm5bLi4uaHYsLi4uQXJyYXkuaXNBcnJheSh0KT90Olt0XV0ubWFwKG49PmBAJHtlfSAke259YC50cmltKCkpfXZhciBKND0iZm9ybWF0IjtmdW5jdGlvbiB6NChlKXtpZighZS5zdGFydHNXaXRoKCIjISIpKXJldHVybiIiO2xldCB0PWUuaW5kZXhPZihgCmApO3JldHVybiB0PT09LTE/ZTplLnNsaWNlKDAsdCl9dmFyIEc0PXo0O2Z1bmN0aW9uIEs0KGUpe2xldCB0PUc0KGUpO3QmJihlPWUuc2xpY2UodC5sZW5ndGgrMSkpO2xldCBuPVU0KGUpLHtwcmFnbWFzOnIsY29tbWVudHM6c309VzQobik7cmV0dXJue3NoZWJhbmc6dCx0ZXh0OmUscHJhZ21hczpyLGNvbW1lbnRzOnN9fWZ1bmN0aW9uIFg0KGUpe2xldHtzaGViYW5nOnQsdGV4dDpuLHByYWdtYXM6cixjb21tZW50czpzfT1LNChlKSxpPXE0KG4pLG89SDQoe3ByYWdtYXM6e1tKNF06IiIsLi4ucn0sY29tbWVudHM6cy50cmltU3RhcnQoKX0pO3JldHVybih0P2Ake3R9CmA6IiIpK28rKGkuc3RhcnRzV2l0aChgCmApP2AKYDpgCgpgKStpfWZ1bmN0aW9uIFk0KGUpe2lmKCFIbihlKSlyZXR1cm5bXTtpZighZS52YWx1ZS5pbmNsdWRlcyhgCmApKXJldHVybltdO2xldCB0PVtdO2ZvcihsZXQgbiBvZmAqJHtlLnZhbHVlfSpgLnNwbGl0KGAKYCkpe2lmKG49bi50cmltU3RhcnQoKSwhbi5zdGFydHNXaXRoKCIqIikpcmV0dXJuW107dC5wdXNoKG4pfXJldHVybiB0fXZhciBRND1uZXcgV2Vha01hcDtmdW5jdGlvbiBtdihlKXtyZXR1cm4gdm4oUTQsZSxZNCl9ZnVuY3Rpb24gZ3YoZSl7cmV0dXJuIG12KGUpLmxlbmd0aD4wfWZ1bmN0aW9uIFo0KGUsdCl7bGV0IG49ZS5ub2RlO2lmKGdzKG4pKXJldHVybiB0Lm9yaWdpbmFsVGV4dC5zbGljZShlZShuKSxYKG4pKS50cmltRW5kKCk7aWYoZ3YobikpcmV0dXJuIGVMKG4pO2lmKEhuKG4pKXJldHVyblsiLyoiLGFpKG4udmFsdWUpLCIqLyJdO3Rocm93IG5ldyBFcnJvcigiTm90IGEgY29tbWVudDogIitKU09OLnN0cmluZ2lmeShuKSl9ZnVuY3Rpb24gZUwoZSl7bGV0IHQ9bXYoZSksbj1lLnZhbHVlWzBdPT09IioiJiZlLnZhbHVlWzFdIT09IioiO3JldHVyblsiLyIsdC5tYXAoKHIscyk9PntpZihzPT09MClyZXR1cm5bci50cmltRW5kKCksUl07aWYocz09PXQubGVuZ3RoLTEpcmV0dXJuWyIgIixyXTtsZXQgaT1yLnRyaW1FbmQoKSxvPVsiICIsaV07cmV0dXJuIG4mJmkhPT0iKiImJnIuZW5kc1dpdGgoIiAgIik/W28sIiAgIixrNSh3ZCldOltvLFJdfSksIi8iXX1mdW5jdGlvbiB0TChlKXtpZih0eXBlb2YgZSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBzdHJpbmciKTtyZXR1cm4gZS5yZXBsYWNlKC9bfFxce30oKVtcXV4kKyo/Ll0vZywiXFwkJiIpLnJlcGxhY2UoLy0vZywiXFx4MmQiKX12YXIgbkw9KGlDPWNsYXNze2NvbnN0cnVjdG9yKHQpe2J0KHRoaXMsZGYpO2J0KHRoaXMsTm4pO0puKHRoaXMsTm4sbmV3IFNldCh0KSl9Z2V0TGVhZGluZ1doaXRlc3BhY2VDb3VudCh0KXtsZXQgbj1vZSh0aGlzLE5uKSxyPTA7Zm9yKGxldCBzPTA7czx0Lmxlbmd0aCYmbi5oYXModC5jaGFyQXQocykpO3MrKylyKys7cmV0dXJuIHJ9Z2V0VHJhaWxpbmdXaGl0ZXNwYWNlQ291bnQodCl7bGV0IG49b2UodGhpcyxObikscj0wO2ZvcihsZXQgcz10Lmxlbmd0aC0xO3M+PTAmJm4uaGFzKHQuY2hhckF0KHMpKTtzLS0pcisrO3JldHVybiByfWdldExlYWRpbmdXaGl0ZXNwYWNlKHQpe2xldCBuPXRoaXMuZ2V0TGVhZGluZ1doaXRlc3BhY2VDb3VudCh0KTtyZXR1cm4gdC5zbGljZSgwLG4pfWdldFRyYWlsaW5nV2hpdGVzcGFjZSh0KXtsZXQgbj10aGlzLmdldFRyYWlsaW5nV2hpdGVzcGFjZUNvdW50KHQpO3JldHVybiB0LnNsaWNlKHQubGVuZ3RoLW4pfWhhc0xlYWRpbmdXaGl0ZXNwYWNlKHQpe3JldHVybiBvZSh0aGlzLE5uKS5oYXModC5jaGFyQXQoMCkpfWhhc1RyYWlsaW5nV2hpdGVzcGFjZSh0KXtyZXR1cm4gb2UodGhpcyxObikuaGFzKGNlKDAsdCwtMSkpfXRyaW1TdGFydCh0KXtsZXQgbj10aGlzLmdldExlYWRpbmdXaGl0ZXNwYWNlQ291bnQodCk7cmV0dXJuIHQuc2xpY2Uobil9dHJpbUVuZCh0KXtsZXQgbj10aGlzLmdldFRyYWlsaW5nV2hpdGVzcGFjZUNvdW50KHQpO3JldHVybiB0LnNsaWNlKDAsdC5sZW5ndGgtbil9dHJpbSh0KXtyZXR1cm4gdGhpcy50cmltRW5kKHRoaXMudHJpbVN0YXJ0KHQpKX1zcGxpdCh0LG49ITEpe2xldCByPWBbJHt0TChbLi4ub2UodGhpcyxObildLmpvaW4oIiIpKX1dK2Ascz1uZXcgUmVnRXhwKG4/YCgke3J9KWA6cik7cmV0dXJuIHQuc3BsaXQocyl9aGFzV2hpdGVzcGFjZUNoYXJhY3Rlcih0KXtsZXQgbj1vZSh0aGlzLE5uKTtyZXR1cm4gQXJyYXkucHJvdG90eXBlLnNvbWUuY2FsbCh0LHI9Pm4uaGFzKHIpKX1oYXNOb25XaGl0ZXNwYWNlQ2hhcmFjdGVyKHQpe2xldCBuPW9lKHRoaXMsTm4pO3JldHVybiBBcnJheS5wcm90b3R5cGUuc29tZS5jYWxsKHQscj0+IW4uaGFzKHIpKX1pc1doaXRlc3BhY2VPbmx5KHQpe2xldCBuPW9lKHRoaXMsTm4pO3JldHVybiBBcnJheS5wcm90b3R5cGUuZXZlcnkuY2FsbCh0LHI9Pm4uaGFzKHIpKX1kZWRlbnRTdHJpbmcodCl7bGV0IG49em4odGhpcyxkZixEQykuY2FsbCh0aGlzLHQpO3JldHVybiBuPT09MD90OnQuc3BsaXQoYApgKS5tYXAocj0+ci5zbGljZShuKSkuam9pbihgCmApfX0sTm49bmV3IFdlYWtNYXAsZGY9bmV3IFdlYWtTZXQsREM9ZnVuY3Rpb24odCl7bGV0IG49TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO2ZvcihsZXQgciBvZiB0LnNwbGl0KGAKYCkpe2lmKHIubGVuZ3RoPT09MCljb250aW51ZTtsZXQgcz10aGlzLmdldExlYWRpbmdXaGl0ZXNwYWNlQ291bnQocik7aWYocz09PTApcmV0dXJuIDA7ci5sZW5ndGghPT1zJiZzPG4mJihuPXMpfXJldHVybiBuPT09TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZPzA6bn0saUMpLHJMPW5MLHhjPW5ldyByTChgIApccglgKTtmdW5jdGlvbiBudShlKXtyZXR1cm4gZS50eXBlPT09IkpTWFRleHQiJiYoeGMuaGFzTm9uV2hpdGVzcGFjZUNoYXJhY3RlcihRdChlKSl8fCEvXG4vLnRlc3QoUXQoZSkpKX1mdW5jdGlvbiBzTChlKXtsZXR7bm9kZTp0LHBhcmVudDpufT1lO2lmKCFjdCh0KXx8IWN0KG4pKXJldHVybiExO2xldHtpbmRleDpyLHNpYmxpbmdzOnN9PWUsaTtmb3IobGV0IG89cjtvPjA7by0tKXtsZXQgYT1zW28tMV07aWYoIShhLnR5cGU9PT0iSlNYVGV4dCImJiFudShhKSkpe2k9YTticmVha319cmV0dXJuKGk9PW51bGw/dm9pZCAwOmkudHlwZSk9PT0iSlNYRXhwcmVzc2lvbkNvbnRhaW5lciImJmkuZXhwcmVzc2lvbi50eXBlPT09IkpTWEVtcHR5RXhwcmVzc2lvbiImJnBjKGkuZXhwcmVzc2lvbil9ZnVuY3Rpb24gaUwoZSl7cmV0dXJuIHBjKGUubm9kZSl8fHNMKGUpfXZhciBxZD1pTCxvTD1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKG4scixzPSJ0eXBlIil7c3VwZXIoYFVuZXhwZWN0ZWQgJHtyfSBub2RlICR7c306ICR7SlNPTi5zdHJpbmdpZnkobltzXSl9LmApO1dlKHRoaXMsIm5hbWUiLCJVbmV4cGVjdGVkTm9kZUVycm9yIik7dGhpcy5ub2RlPW59fSxrbz1vTDtmdW5jdGlvbiBhTChlKXtyZXR1cm4gZS50eXBlPT09IkNhbGxFeHByZXNzaW9uIiYmIWUub3B0aW9uYWwmJmUuYXJndW1lbnRzLmxlbmd0aD09PTEmJmUuY2FsbGVlLnR5cGU9PT0iSWRlbnRpZmllciImJmUuY2FsbGVlLm5hbWU9PT0iQm9vbGVhbiJ9dmFyIHVMPTA7ZnVuY3Rpb24geXYoZSx0LG4pe3ZhciBGO2xldHtub2RlOnIscGFyZW50OnMsZ3JhbmRwYXJlbnQ6aSxrZXk6b309ZSxhPW8hPT0iYm9keSImJihzLnR5cGU9PT0iSWZTdGF0ZW1lbnQifHxzLnR5cGU9PT0iV2hpbGVTdGF0ZW1lbnQifHxzLnR5cGU9PT0iU3dpdGNoU3RhdGVtZW50Inx8cy50eXBlPT09IkRvV2hpbGVTdGF0ZW1lbnQiKSx1PXIub3BlcmF0b3I9PT0ifD4iJiYoKEY9ZS5yb290LmV4dHJhKT09bnVsbD92b2lkIDA6Ri5fX2lzVXNpbmdIYWNrUGlwZWxpbmUpLGw9V2QoZSx0LG4sITEsYSk7aWYoYSlyZXR1cm4gbDtpZih1KXJldHVybiBfKGwpO2lmKG89PT0iY2FsbGVlIiYmcWEocyl8fHMudHlwZT09PSJVbmFyeUV4cHJlc3Npb24iJiYhcShyKXx8eGUocykmJiFzLmNvbXB1dGVkKXJldHVybiBfKFtPKFtQLC4uLmxdKSxQXSk7bGV0IGY9RW8ocyl8fHMudHlwZT09PSJKU1hFeHByZXNzaW9uQ29udGFpbmVyIiYmaS50eXBlPT09IkpTWEF0dHJpYnV0ZSJ8fHIub3BlcmF0b3IhPT0ifCImJnMudHlwZT09PSJKc0V4cHJlc3Npb25Sb290Inx8ci50eXBlIT09Ik5HUGlwZUV4cHJlc3Npb24iJiYocy50eXBlPT09Ik5HUm9vdCImJnQucGFyc2VyPT09Il9fbmdfYmluZGluZyJ8fHMudHlwZT09PSJOR01pY3Jvc3ludGF4RXhwcmVzc2lvbiImJmkudHlwZT09PSJOR01pY3Jvc3ludGF4IiYmaS5ib2R5Lmxlbmd0aD09PTEpfHxyPT09cy5ib2R5JiZzLnR5cGU9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ifHxyIT09cy5ib2R5JiZzLnR5cGU9PT0iRm9yU3RhdGVtZW50Inx8cy50eXBlPT09IkNvbmRpdGlvbmFsRXhwcmVzc2lvbiImJiFFbyhpKSYmIXFhKGkpfHxzLnR5cGU9PT0iVGVtcGxhdGVMaXRlcmFsInx8bz09PSJhcmd1bWVudCImJnMudHlwZT09PSJVbmFyeUV4cHJlc3Npb24ifHxvPT09ImFyZ3VtZW50cyImJmFMKHMpLGM9cy50eXBlPT09IkFzc2lnbm1lbnRFeHByZXNzaW9uInx8cy50eXBlPT09IlZhcmlhYmxlRGVjbGFyYXRvciJ8fHMudHlwZT09PSJDbGFzc1Byb3BlcnR5Inx8cy50eXBlPT09IlByb3BlcnR5RGVmaW5pdGlvbiJ8fHMudHlwZT09PSJUU0Fic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uInx8cy50eXBlPT09IkNsYXNzUHJpdmF0ZVByb3BlcnR5Inx8eXMocykscD1TcihyLmxlZnQpJiZEZChyLm9wZXJhdG9yLHIubGVmdC5vcGVyYXRvcik7aWYoZnx8cnUocikmJiFwfHwhcnUocikmJmMpcmV0dXJuIF8obCk7aWYobC5sZW5ndGg9PT0wKXJldHVybiIiO2xldCBoPWN0KHIucmlnaHQpLGQ9bC5maW5kSW5kZXgodj0+dHlwZW9mIHYhPSJzdHJpbmciJiYhQXJyYXkuaXNBcnJheSh2KSYmdi50eXBlPT09d24pLG09bC5zbGljZSgwLGQ9PT0tMT8xOmQrMSksZz1sLnNsaWNlKG0ubGVuZ3RoLGg/LTE6dm9pZCAwKSxEPVN5bWJvbCgibG9naWNhbENoYWluLSIrICsrdUwpLGI9XyhbLi4ubSxPKGcpXSx7aWQ6RH0pO2lmKCFoKXJldHVybiBiO2xldCBFPWNlKDAsbCwtMSk7cmV0dXJuIF8oW2IsS2EoRSx7Z3JvdXBJZDpEfSldKX1mdW5jdGlvbiBXZChlLHQsbixyLHMpe3ZhciBnO2xldHtub2RlOml9PWU7aWYoIVNyKGkpKXJldHVybltfKG4oKSldO2xldCBvPVtdO0RkKGkub3BlcmF0b3IsaS5sZWZ0Lm9wZXJhdG9yKT9vPWUuY2FsbCgoKT0+V2QoZSx0LG4sITAscyksImxlZnQiKTpvLnB1c2goXyhuKCJsZWZ0IikpKTtsZXQgYT1ydShpKSx1PWkucmlnaHQudHlwZT09PSJDaGFpbkV4cHJlc3Npb24iP2kucmlnaHQuZXhwcmVzc2lvbjppLnJpZ2h0LGw9KGkudHlwZT09PSJOR1BpcGVFeHByZXNzaW9uInx8aS5vcGVyYXRvcj09PSJ8PiJ8fGxMKGUsdCkpJiYheHIodC5vcmlnaW5hbFRleHQsdSksZj0hcSh1LHouTGVhZGluZyxvZCkmJnhyKHQub3JpZ2luYWxUZXh0LHUpLGM9aS50eXBlPT09Ik5HUGlwZUV4cHJlc3Npb24iPyJ8IjppLm9wZXJhdG9yLHA9aS50eXBlPT09Ik5HUGlwZUV4cHJlc3Npb24iJiZpLmFyZ3VtZW50cy5sZW5ndGg+MD9fKE8oW1AsIjogIixmZShbSCwiOiAiXSxlLm1hcCgoKT0+bm4oMixfKG4oKSkpLCJhcmd1bWVudHMiKSldKSk6IiIsaDtpZihhKWg9W2MseHIodC5vcmlnaW5hbFRleHQsdSk/TyhbSCxuKCJyaWdodCIpLHBdKTpbIiAiLG4oInJpZ2h0IikscF1dO2Vsc2V7bGV0IEQ9Yz09PSJ8PiImJigoZz1lLnJvb3QuZXh0cmEpIT1udWxsJiZnLl9faXNVc2luZ0hhY2tQaXBlbGluZSk/ZS5jYWxsKCgpPT5XZChlLHQsbiwhMCxzKSwicmlnaHQiKTpuKCJyaWdodCIpO2lmKHQuZXhwZXJpbWVudGFsT3BlcmF0b3JQb3NpdGlvbj09PSJzdGFydCIpe2xldCBiPSIiO2lmKGYpc3dpdGNoKHZzKEQpKXtjYXNlIGtyOmI9RFswXSxELnNoaWZ0KCk7YnJlYWs7Y2FzZSBUcjpiPUQuY29udGVudHNbMF0sRC5jb250ZW50cy5zaGlmdCgpO2JyZWFrfWg9W0gsYixjLCIgIixELHBdfWVsc2UgaD1bbD9IOiIiLGMsbD8iICI6SCxELHBdfWxldHtwYXJlbnQ6ZH09ZSxtPXEoaS5sZWZ0LHouVHJhaWxpbmd8ei5MaW5lKTtpZigobXx8IShzJiZpLnR5cGU9PT0iTG9naWNhbEV4cHJlc3Npb24iKSYmZC50eXBlIT09aS50eXBlJiZpLmxlZnQudHlwZSE9PWkudHlwZSYmaS5yaWdodC50eXBlIT09aS50eXBlKSYmKGg9XyhoLHtzaG91bGRCcmVhazptfSkpLHQuZXhwZXJpbWVudGFsT3BlcmF0b3JQb3NpdGlvbj09PSJzdGFydCI/by5wdXNoKGF8fGY/IiAiOiIiLGgpOm8ucHVzaChsPyIiOiIgIixoKSxyJiZxKGkpKXtsZXQgRD1BZChGdChlLG8sdCkpO3JldHVybiBELnR5cGU9PT1icz9ELnBhcnRzOkFycmF5LmlzQXJyYXkoRCk/RDpbRF19cmV0dXJuIG99ZnVuY3Rpb24gcnUoZSl7cmV0dXJuIGUudHlwZSE9PSJMb2dpY2FsRXhwcmVzc2lvbiI/ITE6ISEoV24oZS5yaWdodCkmJmUucmlnaHQucHJvcGVydGllcy5sZW5ndGg+MHx8aHQoZS5yaWdodCkmJmUucmlnaHQuZWxlbWVudHMubGVuZ3RoPjB8fGN0KGUucmlnaHQpKX12YXIgRHY9ZT0+ZS50eXBlPT09IkJpbmFyeUV4cHJlc3Npb24iJiZlLm9wZXJhdG9yPT09InwiO2Z1bmN0aW9uIGxMKGUsdCl7cmV0dXJuKHQucGFyc2VyPT09Il9fdnVlX2V4cHJlc3Npb24ifHx0LnBhcnNlcj09PSJfX3Z1ZV90c19leHByZXNzaW9uIikmJkR2KGUubm9kZSkmJiFlLmhhc0FuY2VzdG9yKG49PiFEdihuKSYmbi50eXBlIT09IkpzRXhwcmVzc2lvblJvb3QiKX1mdW5jdGlvbiBjTChlLHQsbil7bGV0e25vZGU6cn09ZTtpZihyLnR5cGUuc3RhcnRzV2l0aCgiTkciKSlzd2l0Y2goci50eXBlKXtjYXNlIk5HUm9vdCI6cmV0dXJuIG4oIm5vZGUiKTtjYXNlIk5HUGlwZUV4cHJlc3Npb24iOnJldHVybiB5dihlLHQsbik7Y2FzZSJOR0NoYWluZWRFeHByZXNzaW9uIjpyZXR1cm4gXyhmZShbIjsiLEhdLGUubWFwKCgpPT5oTChlKT9uKCk6WyIoIixuKCksIikiXSwiZXhwcmVzc2lvbnMiKSkpO2Nhc2UiTkdFbXB0eUV4cHJlc3Npb24iOnJldHVybiIiO2Nhc2UiTkdNaWNyb3N5bnRheCI6cmV0dXJuIGUubWFwKCgpPT5bZS5pc0ZpcnN0PyIiOmJ2KGUpPyIgIjpbIjsiLEhdLG4oKV0sImJvZHkiKTtjYXNlIk5HTWljcm9zeW50YXhLZXkiOnJldHVybi9eWyRfYS16XVtcdyRdKig/Oi1bJF9hLXpdW1x3JF0pKiQvaS50ZXN0KHIubmFtZSk/ci5uYW1lOkpTT04uc3RyaW5naWZ5KHIubmFtZSk7Y2FzZSJOR01pY3Jvc3ludGF4RXhwcmVzc2lvbiI6cmV0dXJuW24oImV4cHJlc3Npb24iKSxyLmFsaWFzPT09bnVsbD8iIjpbIiBhcyAiLG4oImFsaWFzIildXTtjYXNlIk5HTWljcm9zeW50YXhLZXllZEV4cHJlc3Npb24iOntsZXR7aW5kZXg6cyxwYXJlbnQ6aX09ZSxvPWJ2KGUpfHxmTChlKXx8KHM9PT0xJiYoci5rZXkubmFtZT09PSJ0aGVuInx8ci5rZXkubmFtZT09PSJlbHNlInx8ci5rZXkubmFtZT09PSJhcyIpfHxzPT09MiYmKHIua2V5Lm5hbWU9PT0iZWxzZSImJmkuYm9keVtzLTFdLnR5cGU9PT0iTkdNaWNyb3N5bnRheEtleWVkRXhwcmVzc2lvbiImJmkuYm9keVtzLTFdLmtleS5uYW1lPT09InRoZW4ifHxyLmtleS5uYW1lPT09InRyYWNrIikpJiZpLmJvZHlbMF0udHlwZT09PSJOR01pY3Jvc3ludGF4RXhwcmVzc2lvbiI7cmV0dXJuW24oImtleSIpLG8/IiAiOiI6ICIsbigiZXhwcmVzc2lvbiIpXX1jYXNlIk5HTWljcm9zeW50YXhMZXQiOnJldHVyblsibGV0ICIsbigia2V5Iiksci52YWx1ZT09PW51bGw/IiI6WyIgPSAiLG4oInZhbHVlIildXTtjYXNlIk5HTWljcm9zeW50YXhBcyI6cmV0dXJuW24oImtleSIpLCIgYXMgIixuKCJhbGlhcyIpXTtkZWZhdWx0OnRocm93IG5ldyBrbyhyLCJBbmd1bGFyIil9fWZ1bmN0aW9uIGJ2KHtub2RlOmUsaW5kZXg6dH0pe3JldHVybiBlLnR5cGU9PT0iTkdNaWNyb3N5bnRheEtleWVkRXhwcmVzc2lvbiImJmUua2V5Lm5hbWU9PT0ib2YiJiZ0PT09MX1mdW5jdGlvbiBmTChlKXtsZXR7bm9kZTp0fT1lO3JldHVybiBlLnBhcmVudC5ib2R5WzFdLmtleS5uYW1lPT09Im9mIiYmdC50eXBlPT09Ik5HTWljcm9zeW50YXhLZXllZEV4cHJlc3Npb24iJiZ0LmtleS5uYW1lPT09InRyYWNrIiYmdC5rZXkudHlwZT09PSJOR01pY3Jvc3ludGF4S2V5In12YXIgcEw9SyhbIkNhbGxFeHByZXNzaW9uIiwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvbiIsIkFzc2lnbm1lbnRFeHByZXNzaW9uIl0pO2Z1bmN0aW9uIGhMKHtub2RlOmV9KXtyZXR1cm4gYmQoZSxwTCl9ZnVuY3Rpb24gRXYoZSx0LG4pe2xldHtub2RlOnJ9PWU7cmV0dXJuIF8oW2ZlKEgsZS5tYXAobiwiZGVjb3JhdG9ycyIpKSxGdihyLHQpP1I6SF0pfWZ1bmN0aW9uIGRMKGUsdCxuKXtyZXR1cm4gQXYoZS5ub2RlKT9bZmUoUixlLm1hcChuLCJkZWNsYXJhdGlvbiIsImRlY29yYXRvcnMiKSksUl06IiJ9ZnVuY3Rpb24gdnYoZSx0LG4pe2xldHtub2RlOnIscGFyZW50OnN9PWUse2RlY29yYXRvcnM6aX09cjtpZighU2UoaSl8fEF2KHMpfHxxZChlKSlyZXR1cm4iIjtsZXQgbz1yLnR5cGU9PT0iQ2xhc3NFeHByZXNzaW9uInx8ci50eXBlPT09IkNsYXNzRGVjbGFyYXRpb24ifHxGdihyLHQpO3JldHVybltlLmtleT09PSJkZWNsYXJhdGlvbiImJkJrKHMpP1I6bz9McjoiIixmZShILGUubWFwKG4sImRlY29yYXRvcnMiKSksSF19ZnVuY3Rpb24gRnYoZSx0KXtyZXR1cm4gZS5kZWNvcmF0b3JzLnNvbWUobj0+aXQodC5vcmlnaW5hbFRleHQsWChuKSkpfWZ1bmN0aW9uIEF2KGUpe3ZhciBuO2lmKGUudHlwZSE9PSJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24iJiZlLnR5cGUhPT0iRXhwb3J0TmFtZWREZWNsYXJhdGlvbiImJmUudHlwZSE9PSJEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb24iKXJldHVybiExO2xldCB0PShuPWUuZGVjbGFyYXRpb24pPT1udWxsP3ZvaWQgMDpuLmRlY29yYXRvcnM7cmV0dXJuIFNlKHQpJiZjYyhlLHRbMF0pfWZ1bmN0aW9uIHd2KGUpe3JldHVybiBlLnR5cGU9PT0iVW5hcnlFeHByZXNzaW9uIiYmKGUub3BlcmF0b3I9PT0iKyJ8fGUub3BlcmF0b3I9PT0iLSIpJiZpcihlLmFyZ3VtZW50KX1mdW5jdGlvbiBIZChlLHQsbil7bGV0e25vZGU6cn09ZSxzPVtdLGk9UWgocik/ImVsZW1lbnRUeXBlcyI6ImVsZW1lbnRzIixvPXJbaV07aWYoby5sZW5ndGg9PT0wJiYhci5pbmV4YWN0KXMucHVzaChfKFsiWyIsQWMoZSx0KSwiXSJdKSk7ZWxzZXtsZXQgYT1jZSgwLG8sLTEpLHU9KGE9PW51bGw/dm9pZCAwOmEudHlwZSkhPT0iUmVzdEVsZW1lbnQiJiYhci5pbmV4YWN0LGw9YT09PW51bGwsZj1TeW1ib2woImFycmF5IiksYz0hdC5fX2luSmVzdEVhY2gmJm8ubGVuZ3RoPjEmJm8uZXZlcnkoKGQsbSxnKT0+e2lmKCFodChkKSYmIVduKGQpKXJldHVybiExO2xldCBEPWQ9PW51bGw/dm9pZCAwOmQudHlwZSxiPWdbbSsxXTtpZihiJiZEIT09Yi50eXBlKXJldHVybiExO2xldCBFPWh0KGQpPyJlbGVtZW50cyI6InByb3BlcnRpZXMiO3JldHVybiBkW0VdJiZkW0VdLmxlbmd0aD4xfSl8fHEocix6LkRhbmdsaW5nfHouTGluZSkscD1DdihyLHQpLGg9dT9sPyIsIjpORSh0KT9wP3VlKCIsIiwiIix7Z3JvdXBJZDpmfSk6dWUoIiwiKToiIjoiIjtzLnB1c2goXyhbIlsiLE8oW1AscD9nTChlLHQsbixoKTpbbUwoZSx0LG4saSxyLmluZXhhY3QpLGhdLGV0KGUsdCldKSxQLCJdIl0se3Nob3VsZEJyZWFrOmMsaWQ6Zn0pKX1yZXR1cm4gcy5wdXNoKE50KGUpLGR0KGUsbikpLHN9ZnVuY3Rpb24gQ3YoZSx0KXtyZXR1cm4gaHQoZSkmJmUuZWxlbWVudHMubGVuZ3RoPjAmJmUuZWxlbWVudHMuZXZlcnkobj0+biYmKGlyKG4pfHx3dihuKSYmIXEobi5hcmd1bWVudCkpJiYhcShuLHouVHJhaWxpbmd8ei5MaW5lLHI9PiFpdCh0Lm9yaWdpbmFsVGV4dCxlZShyKSx7YmFja3dhcmRzOiEwfSkpKX1mdW5jdGlvbiBTdih7bm9kZTplfSx7b3JpZ2luYWxUZXh0OnR9KXtsZXQgbj1YKGUpO2lmKG49PT1lZShlKSlyZXR1cm4hMTtsZXR7bGVuZ3RoOnJ9PXQ7Zm9yKDtuPHImJnRbbl0hPT0iLCI7KW49cmQodCxzZCh0LG4rMSkpO3JldHVybiBiYyh0LG4pfWZ1bmN0aW9uIG1MKGUsdCxuLHIscyl7bGV0IGk9W107cmV0dXJuIGUuZWFjaCgoe25vZGU6byxpc0xhc3Q6YX0pPT57aS5wdXNoKG8/XyhuKCkpOiIiKSwoIWF8fHMpJiZpLnB1c2goWyIsIixILG8mJlN2KGUsdCk/UDoiIl0pfSxyKSxzJiZpLnB1c2goIi4uLiIpLGl9ZnVuY3Rpb24gZ0woZSx0LG4scil7bGV0IHM9W107cmV0dXJuIGUuZWFjaCgoe2lzTGFzdDppLG5leHQ6b30pPT57cy5wdXNoKFtuKCksaT9yOiIsIl0pLGl8fHMucHVzaChTdihlLHQpP1tSLFJdOnEobyx6LkxlYWRpbmd8ei5MaW5lKT9SOkgpfSwiZWxlbWVudHMiKSxtRShzKX1mdW5jdGlvbiB4dihlKXtyZXR1cm4gZS5xdWFzaXMuc29tZSh0PT50LnZhbHVlLnJhdy5pbmNsdWRlcyhgCmApKX1mdW5jdGlvbiBrdihlLHQpe3JldHVybihlLnR5cGU9PT0iVGVtcGxhdGVMaXRlcmFsIiYmeHYoZSl8fGUudHlwZT09PSJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24iJiZ4dihlLnF1YXNpKSkmJiFpdCh0LGVlKGUpLHtiYWNrd2FyZHM6ITB9KX12YXIgeUw9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gVHYoZSl7cmV0dXJuIHZuKHlMLGUsdD0+dC50eXBlPT09IkNvbmRpdGlvbmFsRXhwcmVzc2lvbiImJiFrdCh0LG49Pm4udHlwZT09PSJPYmplY3RFeHByZXNzaW9uIikpfXZhciBETD1lPT5lLnR5cGU9PT0iU2VxdWVuY2VFeHByZXNzaW9uIjtmdW5jdGlvbiBiTChlLHQsbixyPXt9KXtsZXQgcz1bXSxpLG89W10sYT0hMSx1PSFyLmV4cGFuZExhc3RBcmcmJmUubm9kZS5ib2R5LnR5cGU9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iLGw7KGZ1bmN0aW9uIEQoKXtsZXR7bm9kZTpifT1lLEU9RUwoZSx0LG4scik7aWYocy5sZW5ndGg9PT0wKXMucHVzaChFKTtlbHNle2xldHtsZWFkaW5nOkYsdHJhaWxpbmc6dn09VEUoZSx0KTtzLnB1c2goW0YsRV0pLG8udW5zaGlmdCh2KX11JiYoYXx8KGE9Yi5yZXR1cm5UeXBlJiZ4dChiKS5sZW5ndGg+MHx8Yi50eXBlUGFyYW1ldGVyc3x8eHQoYikuc29tZShGPT5GLnR5cGUhPT0iSWRlbnRpZmllciIpKSksIXV8fGIuYm9keS50eXBlIT09IkFycm93RnVuY3Rpb25FeHByZXNzaW9uIj8oaT1uKCJib2R5IixyKSxsPWIuYm9keSk6ZS5jYWxsKEQsImJvZHkiKX0pKCk7bGV0IGY9IXhyKHQub3JpZ2luYWxUZXh0LGwpJiYoREwobCl8fHZMKGwsaSx0KXx8IWEmJlR2KGwpKSxjPWUua2V5PT09ImNhbGxlZSImJnZvKGUucGFyZW50KSxwPVN5bWJvbCgiYXJyb3ctY2hhaW4iKSxoPUZMKGUscix7c2lnbmF0dXJlRG9jczpzLHNob3VsZEJyZWFrOmF9KSxkPSExLG09ITEsZz0hMTtyZXR1cm4gdSYmKGN8fHIuYXNzaWdubWVudExheW91dCkmJihtPSEwLGc9IXEoZS5ub2RlLHouTGVhZGluZyZ6LkxpbmUpLGQ9ci5hc3NpZ25tZW50TGF5b3V0PT09ImNoYWluLXRhaWwtYXJyb3ctY2hhaW4ifHxjJiYhZiksaT1BTChlLHQscix7Ym9keURvYzppLGJvZHlDb21tZW50czpvLGZ1bmN0aW9uQm9keTpsLHNob3VsZFB1dEJvZHlPblNhbWVMaW5lOmZ9KSxfKFtfKG0/TyhbZz9QOiIiLGhdKTpoLHtzaG91bGRCcmVhazpkLGlkOnB9KSwiID0+Iix1P0thKGkse2dyb3VwSWQ6cH0pOl8oaSksdSYmYz91ZShQLCIiLHtncm91cElkOnB9KToiIl0pfWZ1bmN0aW9uIEVMKGUsdCxuLHIpe2xldHtub2RlOnN9PWUsaT1bXTtpZihzLmFzeW5jJiZpLnB1c2goImFzeW5jICIpLEdFKGUsdCkpaS5wdXNoKG4oWyJwYXJhbXMiLDBdKSk7ZWxzZXtsZXQgYT1yLmV4cGFuZExhc3RBcmd8fHIuZXhwYW5kRmlyc3RBcmcsdT1NZChlLG4pO2lmKGEpe2lmKFR0KHUpKXRocm93IG5ldyBEYzt1PV8obWModSkpfWkucHVzaChfKFtsaShlLHQsbixhLCEwKSx1XSkpfWxldCBvPWV0KGUsdCx7bWFya2VyOiJjb21tZW50QmVmb3JlQXJyb3cifSk7cmV0dXJuIG8mJmkucHVzaCgiICIsbyksaX1mdW5jdGlvbiB2TChlLHQsbil7dmFyIHIscztyZXR1cm4gaHQoZSl8fFduKGUpfHxlLnR5cGU9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ifHxlLnR5cGU9PT0iRG9FeHByZXNzaW9uInx8ZS50eXBlPT09IkJsb2NrU3RhdGVtZW50Inx8Y3QoZSl8fCgocj10LmxhYmVsKT09bnVsbD92b2lkIDA6ci5odWcpIT09ITEmJigoKHM9dC5sYWJlbCk9PW51bGw/dm9pZCAwOnMuZW1iZWQpfHxrdihlLG4ub3JpZ2luYWxUZXh0KSl9ZnVuY3Rpb24gRkwoZSx0LHtzaWduYXR1cmVEb2NzOm4sc2hvdWxkQnJlYWs6cn0pe2lmKG4ubGVuZ3RoPT09MSlyZXR1cm4gblswXTtsZXR7cGFyZW50OnMsa2V5Oml9PWU7cmV0dXJuIGkhPT0iY2FsbGVlIiYmdm8ocyl8fFNyKHMpP18oW25bMF0sIiA9PiIsTyhbSCxmZShbIiA9PiIsSF0sbi5zbGljZSgxKSldKV0se3Nob3VsZEJyZWFrOnJ9KTppPT09ImNhbGxlZSImJnZvKHMpfHx0LmFzc2lnbm1lbnRMYXlvdXQ/XyhmZShbIiA9PiIsSF0sbikse3Nob3VsZEJyZWFrOnJ9KTpfKE8oZmUoWyIgPT4iLEhdLG4pKSx7c2hvdWxkQnJlYWs6cn0pfWZ1bmN0aW9uIEFMKGUsdCxuLHtib2R5RG9jOnIsYm9keUNvbW1lbnRzOnMsZnVuY3Rpb25Cb2R5Omksc2hvdWxkUHV0Qm9keU9uU2FtZUxpbmU6b30pe2xldHtub2RlOmEscGFyZW50OnV9PWUsbD1uLmV4cGFuZExhc3RBcmc/RnModCwiYWxsIik6IiIsZj0obi5leHBhbmRMYXN0QXJnfHx1LnR5cGU9PT0iSlNYRXhwcmVzc2lvbkNvbnRhaW5lciIpJiYhcShhKT9QOiIiO3JldHVybiBvJiZUdihpKT9bIiAiLF8oW3VlKCIiLCIoIiksTyhbUCxyXSksdWUoIiIsIikiKSxsLGZdKSxzXTpvP1siICIscixzXTpbTyhbSCxyLHNdKSxsLGZdfXZhciB3TD0uMjU7ZnVuY3Rpb24gSmQoZSx0KXtsZXR7cHJpbnRXaWR0aDpufT10O2lmKHEoZSkpcmV0dXJuITE7bGV0IHI9bip3TDtpZihlLnR5cGU9PT0iVGhpc0V4cHJlc3Npb24ifHxlLnR5cGU9PT0iSWRlbnRpZmllciImJmUubmFtZS5sZW5ndGg8PXJ8fHd2KGUpJiYhcShlLmFyZ3VtZW50KSlyZXR1cm4hMDtsZXQgcz1lLnR5cGU9PT0iTGl0ZXJhbCImJiJyZWdleCJpbiBlJiZlLnJlZ2V4LnBhdHRlcm58fGUudHlwZT09PSJSZWdFeHBMaXRlcmFsIiYmZS5wYXR0ZXJuO3JldHVybiBzP3MubGVuZ3RoPD1yOnN0KGUpP2NpKFF0KGUpLHQpLmxlbmd0aDw9cjplLnR5cGU9PT0iVGVtcGxhdGVMaXRlcmFsIj9lLmV4cHJlc3Npb25zLmxlbmd0aD09PTAmJmUucXVhc2lzWzBdLnZhbHVlLnJhdy5sZW5ndGg8PXImJiFlLnF1YXNpc1swXS52YWx1ZS5yYXcuaW5jbHVkZXMoYApgKTplLnR5cGU9PT0iVW5hcnlFeHByZXNzaW9uIj9KZChlLmFyZ3VtZW50LHtwcmludFdpZHRoOm59KTplLnR5cGU9PT0iQ2FsbEV4cHJlc3Npb24iJiZlLmFyZ3VtZW50cy5sZW5ndGg9PT0wJiZlLmNhbGxlZS50eXBlPT09IklkZW50aWZpZXIiP2UuY2FsbGVlLm5hbWUubGVuZ3RoPD1yLTI6WmgoZSl9ZnVuY3Rpb24gVG8oZSl7cmV0dXJuIHhlKGUpfHxlLnR5cGU9PT0iQmluZEV4cHJlc3Npb24iJiYhIWUub2JqZWN0fWZ1bmN0aW9uIENMKGUpe2lmKGUubGVuZ3RoPD0xKXJldHVybiExO2xldCB0PTA7Zm9yKGxldCBuIG9mIGUpaWYoVWEobikpe2lmKHQrPTEsdD4xKXJldHVybiEwfWVsc2UgaWYobj1EcyhuKSx2ZShuKSl7Zm9yKGxldCByIG9mIEZuKG4pKWlmKFVhKHIpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIE52KGUpe2xldHtub2RlOnQscGFyZW50Om4sa2V5OnJ9PWU7cmV0dXJuIHI9PT0iY2FsbGVlIiYmdmUodCkmJnZlKG4pJiZuLmFyZ3VtZW50cy5sZW5ndGg+MCYmdC5hcmd1bWVudHMubGVuZ3RoPm4uYXJndW1lbnRzLmxlbmd0aH12YXIgU0w9bmV3IFNldChbIiEiLCItIiwiKyIsIn4iXSkseEw9SyhbIklkZW50aWZpZXIiLCJUaGlzRXhwcmVzc2lvbiIsIlN1cGVyIiwiUHJpdmF0ZU5hbWUiLCJQcml2YXRlSWRlbnRpZmllciJdKTtmdW5jdGlvbiBjcihlLHQ9Mil7aWYodDw9MClyZXR1cm4hMTtsZXQgbj1yPT5jcihyLHQtMSk7aWYoZT1EcyhlKSxrYihlKSlyZXR1cm4gU28oZS5wYXR0ZXJuPz9lLnJlZ2V4LnBhdHRlcm4pPD01O2lmKFpoKGUpfHx4TChlKXx8ZS50eXBlPT09IkFyZ3VtZW50UGxhY2Vob2xkZXIiKXJldHVybiEwO2lmKGUudHlwZT09PSJUZW1wbGF0ZUxpdGVyYWwiKXJldHVybiBlLnF1YXNpcy5ldmVyeShyPT4hci52YWx1ZS5yYXcuaW5jbHVkZXMoYApgKSkmJmUuZXhwcmVzc2lvbnMuZXZlcnkobik7aWYoV24oZSkpcmV0dXJuIGUucHJvcGVydGllcy5ldmVyeShyPT4hci5jb21wdXRlZCYmKHIuc2hvcnRoYW5kfHxyLnZhbHVlJiZuKHIudmFsdWUpKSk7aWYoaHQoZSkpcmV0dXJuIGUuZWxlbWVudHMuZXZlcnkocj0+cj09PW51bGx8fG4ocikpO2lmKHZvKGUpKXtpZihlLnR5cGU9PT0iSW1wb3J0RXhwcmVzc2lvbiJ8fGNyKGUuY2FsbGVlLHQpKXtsZXQgcj1GbihlKTtyZXR1cm4gci5sZW5ndGg8PXQmJnIuZXZlcnkobil9cmV0dXJuITF9cmV0dXJuIHhlKGUpP2NyKGUub2JqZWN0LHQpJiZjcihlLnByb3BlcnR5LHQpOmUudHlwZT09PSJVbmFyeUV4cHJlc3Npb24iJiZTTC5oYXMoZS5vcGVyYXRvcil8fGUudHlwZT09PSJVcGRhdGVFeHByZXNzaW9uIj9jcihlLmFyZ3VtZW50LHQpOiExfWZ1bmN0aW9uIGtMKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9Rm4ocik7aWYocy5sZW5ndGg9PT0wKXJldHVybiBfKFsiKCIsQWMoZSx0KSwiKSJdKTtsZXQgaT1zLmxlbmd0aC0xO2lmKExMKHMpKXtsZXQgYz1bIigiXTtyZXR1cm4gaWQoZSwocCxoKT0+e2MucHVzaChuKCkpLGghPT1pJiZjLnB1c2goIiwgIil9KSxjLnB1c2goIikiKSxjfWxldCBvPSExLGE9W107aWQoZSwoe25vZGU6Y30scCk9PntsZXQgaD1uKCk7cD09PWl8fChscihjLHQpPyhvPSEwLGg9W2gsIiwiLFIsUl0pOmg9W2gsIiwiLEhdKSxhLnB1c2goaCl9KTtsZXQgdT1lLnJvb3QudHlwZSE9PSJOR1Jvb3QiJiZyLnR5cGUhPT0iSW1wb3J0RXhwcmVzc2lvbiImJnIudHlwZSE9PSJUU0ltcG9ydFR5cGUiJiZyLnR5cGUhPT0iVFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSI/RnModCwiYWxsIik6IiI7ZnVuY3Rpb24gbCgpe3JldHVybiBfKFsiKCIsTyhbSCwuLi5hXSksdSxILCIpIl0se3Nob3VsZEJyZWFrOiEwfSl9aWYob3x8ZS5wYXJlbnQudHlwZSE9PSJEZWNvcmF0b3IiJiZDTChzKSlyZXR1cm4gbCgpO2lmKE5MKHMpKXtsZXQgYz1hLnNsaWNlKDEpO2lmKGMuc29tZShUdCkpcmV0dXJuIGwoKTtsZXQgcDt0cnl7cD1uKCRiKHIsMCkse2V4cGFuZEZpcnN0QXJnOiEwfSl9Y2F0Y2goaCl7aWYoaCBpbnN0YW5jZW9mIERjKXJldHVybiBsKCk7dGhyb3cgaH1yZXR1cm4gVHQocCk/W0xyLHVpKFtbIigiLF8ocCx7c2hvdWxkQnJlYWs6ITB9KSwiLCAiLC4uLmMsIikiXSxsKCldKV06dWkoW1siKCIscCwiLCAiLC4uLmMsIikiXSxbIigiLF8ocCx7c2hvdWxkQnJlYWs6ITB9KSwiLCAiLC4uLmMsIikiXSxsKCldKX1pZihUTChzLGEsdCkpe2xldCBjPWEuc2xpY2UoMCwtMSk7aWYoYy5zb21lKFR0KSlyZXR1cm4gbCgpO2xldCBwO3RyeXtwPW4oJGIociwtMSkse2V4cGFuZExhc3RBcmc6ITB9KX1jYXRjaChoKXtpZihoIGluc3RhbmNlb2YgRGMpcmV0dXJuIGwoKTt0aHJvdyBofXJldHVybiBUdChwKT9bTHIsdWkoW1siKCIsLi4uYyxfKHAse3Nob3VsZEJyZWFrOiEwfSksIikiXSxsKCldKV06dWkoW1siKCIsLi4uYyxwLCIpIl0sWyIoIiwuLi5jLF8ocCx7c2hvdWxkQnJlYWs6ITB9KSwiKSJdLGwoKV0pfWxldCBmPVsiKCIsTyhbUCwuLi5hXSksdSxQLCIpIl07cmV0dXJuIE52KGUpP2Y6XyhmLHtzaG91bGRCcmVhazphLnNvbWUoVHQpfHxvfSl9ZnVuY3Rpb24ga2MoZSx0PSExKXtpZihXbihlKSYmKGUucHJvcGVydGllcy5sZW5ndGg+MHx8cShlKSl8fGh0KGUpJiYoZS5lbGVtZW50cy5sZW5ndGg+MHx8cShlKSl8fChxbihlKXx8ZS50eXBlPT09IlRTVHlwZUFzc2VydGlvbiIpJiZrYyhlLmV4cHJlc3Npb24pfHxlLnR5cGU9PT0iRnVuY3Rpb25FeHByZXNzaW9uInx8ZS50eXBlPT09IkRvRXhwcmVzc2lvbiJ8fGUudHlwZT09PSJNb2R1bGVFeHByZXNzaW9uIilyZXR1cm4hMDtpZihlLnR5cGU9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iKXtsZXR7Ym9keTpufT1lO2lmKG4udHlwZT09PSJCbG9ja1N0YXRlbWVudCJ8fGN0KG4pfHxXbihuKXx8aHQobil8fG4udHlwZT09PSJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiImJmtjKG4sITApfHwhdCYmKG4udHlwZT09PSJDb25kaXRpb25hbEV4cHJlc3Npb24ifHx2ZShEcyhuKSkpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIFRMKGUsdCxuKXt2YXIgaSxvO2lmKGUubGVuZ3RoPT09MSl7bGV0IGE9Y2UoMCx0LC0xKTtpZigoaT1hLmxhYmVsKSE9bnVsbCYmaS5lbWJlZCYmKChvPWEubGFiZWwpPT1udWxsP3ZvaWQgMDpvLmh1ZykhPT0hMSlyZXR1cm4hMH1sZXQgcj1jZSgwLGUsLTEpLHM9Y2UoMCxlLC0yKTtyZXR1cm4hcShyLHouTGVhZGluZykmJiFxKHIsei5UcmFpbGluZykmJmtjKHIpJiYoIXN8fHMudHlwZSE9PXIudHlwZSkmJihlLmxlbmd0aCE9PTJ8fHMudHlwZSE9PSJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiJ8fCFodChyKSkmJiEoZS5sZW5ndGg+MSYmQ3YocixuKSl9ZnVuY3Rpb24gTkwoZSl7aWYoZS5sZW5ndGghPT0yKXJldHVybiExO2xldFt0LG5dPWU7cmV0dXJuIHQudHlwZT09PSJNb2R1bGVFeHByZXNzaW9uIiYmJEwobik/ITA6IXEodCkmJih0LnR5cGU9PT0iRnVuY3Rpb25FeHByZXNzaW9uInx8dC50eXBlPT09IkFycm93RnVuY3Rpb25FeHByZXNzaW9uIiYmdC5ib2R5LnR5cGU9PT0iQmxvY2tTdGF0ZW1lbnQiKSYmbi50eXBlIT09IkZ1bmN0aW9uRXhwcmVzc2lvbiImJm4udHlwZSE9PSJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiImJm4udHlwZSE9PSJDb25kaXRpb25hbEV4cHJlc3Npb24iJiZMdihuKSYmIWtjKG4pfWZ1bmN0aW9uIEx2KGUpe2lmKGUudHlwZT09PSJQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiIpcmV0dXJuIEx2KGUuZXhwcmVzc2lvbik7aWYocW4oZSl8fGUudHlwZT09PSJUeXBlQ2FzdEV4cHJlc3Npb24iKXtsZXR7dHlwZUFubm90YXRpb246dH09ZTtpZih0LnR5cGU9PT0iVHlwZUFubm90YXRpb24iJiYodD10LnR5cGVBbm5vdGF0aW9uKSx0LnR5cGU9PT0iVFNBcnJheVR5cGUiJiYodD10LmVsZW1lbnRUeXBlLHQudHlwZT09PSJUU0FycmF5VHlwZSImJih0PXQuZWxlbWVudFR5cGUpKSx0LnR5cGU9PT0iR2VuZXJpY1R5cGVBbm5vdGF0aW9uInx8dC50eXBlPT09IlRTVHlwZVJlZmVyZW5jZSIpe2xldCBuPXQudHlwZT09PSJHZW5lcmljVHlwZUFubm90YXRpb24iP3QudHlwZVBhcmFtZXRlcnM6dC50eXBlQXJndW1lbnRzOyhuPT1udWxsP3ZvaWQgMDpuLnBhcmFtcy5sZW5ndGgpPT09MSYmKHQ9bi5wYXJhbXNbMF0pfXJldHVybiB4ZCh0KSYmY3IoZS5leHByZXNzaW9uLDEpfXJldHVybiB2byhlKSYmRm4oZSkubGVuZ3RoPjE/ITE6U3IoZSk/Y3IoZS5sZWZ0LDEpJiZjcihlLnJpZ2h0LDEpOmtiKGUpfHxjcihlKX1mdW5jdGlvbiBMTChlKXtyZXR1cm4gZS5sZW5ndGg9PT0yPyR2KGUsMCk6ZS5sZW5ndGg9PT0zP2VbMF0udHlwZT09PSJJZGVudGlmaWVyIiYmJHYoZSwxKTohMX1mdW5jdGlvbiAkdihlLHQpe2xldCBuPWVbdF0scj1lW3QrMV07cmV0dXJuIG4udHlwZT09PSJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiImJnh0KG4pLmxlbmd0aD09PTAmJm4uYm9keS50eXBlPT09IkJsb2NrU3RhdGVtZW50IiYmci50eXBlPT09IkFycmF5RXhwcmVzc2lvbiImJmUuZXZlcnkocz0+IXEocykpfWZ1bmN0aW9uICRMKGUpe2lmKCEoZS50eXBlPT09Ik9iamVjdEV4cHJlc3Npb24iJiZlLnByb3BlcnRpZXMubGVuZ3RoPT09MSkpcmV0dXJuITE7bGV0W3RdPWUucHJvcGVydGllcztyZXR1cm4geXModCk/IXQuY29tcHV0ZWQmJih0LmtleS50eXBlPT09IklkZW50aWZpZXIiJiZ0LmtleS5uYW1lPT09InR5cGUifHxzdCh0LmtleSkmJnQua2V5LnZhbHVlPT09InR5cGUiKSYmc3QodC52YWx1ZSkmJnQudmFsdWUudmFsdWU9PT0ibW9kdWxlIjohMX12YXIgemQ9a0w7ZnVuY3Rpb24gQkwoZSx0LG4pe3JldHVybltuKCJvYmplY3QiKSxfKE8oW1AsQnYoZSx0LG4pXSkpXX1mdW5jdGlvbiBCdihlLHQsbil7cmV0dXJuWyI6OiIsbigiY2FsbGVlIildfXZhciBfTD1lPT52ZShlKSYmRm4oZSkubGVuZ3RoPjA7ZnVuY3Rpb24gSUwoZSl7bGV0e25vZGU6dCxhbmNlc3RvcnM6bn09ZTtmb3IobGV0IHIgb2Ygbil7aWYoISh4ZShyKSYmci5vYmplY3Q9PT10fHxyLnR5cGU9PT0iVFNOb25OdWxsRXhwcmVzc2lvbiImJnIuZXhwcmVzc2lvbj09PXQpKXJldHVybiByLnR5cGU9PT0iTmV3RXhwcmVzc2lvbiImJnIuY2FsbGVlPT09dDt0PXJ9cmV0dXJuITF9ZnVuY3Rpb24gUEwoZSx0LG4pe3ZhciBsO2xldCByPW4oIm9iamVjdCIpLHM9X3YoZSx0LG4pLHtub2RlOml9PWUsbz1lLmZpbmRBbmNlc3RvcihmPT4hKHhlKGYpfHxmLnR5cGU9PT0iVFNOb25OdWxsRXhwcmVzc2lvbiIpKSxhPWUuZmluZEFuY2VzdG9yKGY9PiFacyhmKSksdT1vLnR5cGU9PT0iQmluZEV4cHJlc3Npb24ifHxvLnR5cGU9PT0iQXNzaWdubWVudEV4cHJlc3Npb24iJiZvLmxlZnQudHlwZSE9PSJJZGVudGlmaWVyInx8SUwoZSl8fGkuY29tcHV0ZWR8fGkub2JqZWN0LnR5cGU9PT0iSWRlbnRpZmllciImJmkucHJvcGVydHkudHlwZT09PSJJZGVudGlmaWVyIiYmIXhlKGEpfHwoYS50eXBlPT09IkFzc2lnbm1lbnRFeHByZXNzaW9uInx8YS50eXBlPT09IlZhcmlhYmxlRGVjbGFyYXRvciIpJiYoX0woRHMoaS5vYmplY3QpKXx8KChsPXIubGFiZWwpPT1udWxsP3ZvaWQgMDpsLm1lbWJlckNoYWluKSk7cmV0dXJuIFhhKHIubGFiZWwsW3IsQ24sdT9zOl8oTyhbUCxzXSkpXSl9ZnVuY3Rpb24gX3YoZSx0LG4pe2xldCByPW4oInByb3BlcnR5Iikse25vZGU6c309ZSxpPU50KGUpO3JldHVybiBzLmNvbXB1dGVkPyFzLnByb3BlcnR5fHxpcihzLnByb3BlcnR5KT9baSwiWyIsciwiXSJdOl8oW2ksIlsiLE8oW1Ascl0pLFAsIl0iXSk6W2ksIi4iLHJdfWZ1bmN0aW9uIE1MKGUsdCxuKXtsZXQgcj0oZS5wYXJlbnQudHlwZT09PSJDaGFpbkV4cHJlc3Npb24iP2UuZ3JhbmRwYXJlbnQ6ZS5wYXJlbnQpLnR5cGU9PT0iRXhwcmVzc2lvblN0YXRlbWVudCIscz1bXTtmdW5jdGlvbiBpKFMpe2xldHtvcmlnaW5hbFRleHQ6a309dCxJPWZjKGssWChTKSk7cmV0dXJuIGsuY2hhckF0KEkpPT09IikiP0khPT0hMSYmYmMoayxJKzEpOmxyKFMsdCl9ZnVuY3Rpb24gbygpe2xldHtub2RlOlN9PWU7aWYodmUoUykmJihUbyhTLmNhbGxlZSl8fHZlKFMuY2FsbGVlKSkmJiF0bihlLHQpKXtsZXQgaz1pKFMpO3MudW5zaGlmdCh7bm9kZTpTLGhhc1RyYWlsaW5nRW1wdHlMaW5lOmsscHJpbnRlZDpbRnQoZSxbTnQoZSksbigidHlwZUFyZ3VtZW50cyIpLHpkKGUsdCxuKV0sdCksaz9SOiIiXX0pLGUuY2FsbChvLCJjYWxsZWUiKX1lbHNlIFRvKFMpJiYhdG4oZSx0KT8ocy51bnNoaWZ0KHtub2RlOlMscHJpbnRlZDpGdChlLHhlKFMpP192KGUsdCxuKTpCdihlLHQsbiksdCl9KSxlLmNhbGwobywib2JqZWN0IikpOlMudHlwZT09PSJDaGFpbkV4cHJlc3Npb24iJiYhdG4oZSx0KT9lLmNhbGwobywiZXhwcmVzc2lvbiIpOlMudHlwZT09PSJUU05vbk51bGxFeHByZXNzaW9uIiYmIXRuKGUsdCk/KHMudW5zaGlmdCh7bm9kZTpTLHByaW50ZWQ6RnQoZSwiISIsdCl9KSxlLmNhbGwobywiZXhwcmVzc2lvbiIpKTpzLnVuc2hpZnQoe25vZGU6UyxwcmludGVkOm4oKX0pfWxldHtub2RlOmF9PWU7cy51bnNoaWZ0KHtub2RlOmEscHJpbnRlZDpbTnQoZSksbigidHlwZUFyZ3VtZW50cyIpLHpkKGUsdCxuKV19KSxhLmNhbGxlZSYmZS5jYWxsKG8sImNhbGxlZSIpO2xldCB1PVtdLGw9W3NbMF1dLGY9MTtmb3IoO2Y8cy5sZW5ndGgmJihzW2ZdLm5vZGUudHlwZT09PSJUU05vbk51bGxFeHByZXNzaW9uInx8c1tmXS5ub2RlLnR5cGU9PT0iQ2hhaW5FeHByZXNzaW9uInx8dmUoc1tmXS5ub2RlKXx8eGUoc1tmXS5ub2RlKSYmc1tmXS5ub2RlLmNvbXB1dGVkJiZpcihzW2ZdLm5vZGUucHJvcGVydHkpKTsrK2YpbC5wdXNoKHNbZl0pO2lmKCF2ZShzWzBdLm5vZGUpKWZvcig7ZisxPHMubGVuZ3RoJiZUbyhzW2ZdLm5vZGUpJiZUbyhzW2YrMV0ubm9kZSk7KytmKWwucHVzaChzW2ZdKTt1LnB1c2gobCksbD1bXTtsZXQgYz0hMTtmb3IoO2Y8cy5sZW5ndGg7KytmKXtpZihjJiZUbyhzW2ZdLm5vZGUpKXtpZihzW2ZdLm5vZGUuY29tcHV0ZWQmJmlyKHNbZl0ubm9kZS5wcm9wZXJ0eSkpe2wucHVzaChzW2ZdKTtjb250aW51ZX11LnB1c2gobCksbD1bXSxjPSExfSh2ZShzW2ZdLm5vZGUpfHxzW2ZdLm5vZGUudHlwZT09PSJJbXBvcnRFeHByZXNzaW9uIikmJihjPSEwKSxsLnB1c2goc1tmXSkscShzW2ZdLm5vZGUsei5UcmFpbGluZykmJih1LnB1c2gobCksbD1bXSxjPSExKX1sLmxlbmd0aD4wJiZ1LnB1c2gobCk7ZnVuY3Rpb24gcChTKXtyZXR1cm4vXltBLVpdfF5bJF9dKyQvLnRlc3QoUyl9ZnVuY3Rpb24gaChTKXtyZXR1cm4gUy5sZW5ndGg8PXQudGFiV2lkdGh9ZnVuY3Rpb24gZChTKXt2YXIgTTtsZXQgaz0oTT1TWzFdWzBdKT09bnVsbD92b2lkIDA6TS5ub2RlLmNvbXB1dGVkO2lmKFNbMF0ubGVuZ3RoPT09MSl7bGV0IGo9U1swXVswXS5ub2RlO3JldHVybiBqLnR5cGU9PT0iVGhpc0V4cHJlc3Npb24ifHxqLnR5cGU9PT0iSWRlbnRpZmllciImJihwKGoubmFtZSl8fHImJmgoai5uYW1lKXx8ayl9bGV0IEk9Y2UoMCxTWzBdLC0xKS5ub2RlO3JldHVybiB4ZShJKSYmSS5wcm9wZXJ0eS50eXBlPT09IklkZW50aWZpZXIiJiYocChJLnByb3BlcnR5Lm5hbWUpfHxrKX1sZXQgbT11Lmxlbmd0aD49MiYmIXEodVsxXVswXS5ub2RlKSYmZCh1KTtmdW5jdGlvbiBnKFMpe3JldHVybiBTLm1hcChrPT5rLnByaW50ZWQpfWZ1bmN0aW9uIEQoUyl7cmV0dXJuIFMubGVuZ3RoPT09MD8iIjpPKFtSLGZlKFIsUy5tYXAoZykpXSl9bGV0IGI9dS5tYXAoZyksRT1iLEY9bT8zOjIsdj11LmZsYXQoKSxDPXYuc2xpY2UoMSwtMSkuc29tZShTPT5xKFMubm9kZSx6LkxlYWRpbmcpKXx8di5zbGljZSgwLC0xKS5zb21lKFM9PnEoUy5ub2RlLHouVHJhaWxpbmcpKXx8dVtGXSYmcSh1W0ZdWzBdLm5vZGUsei5MZWFkaW5nKTtpZih1Lmxlbmd0aDw9RiYmIUMmJnUuZXZlcnkoUz0+IWNlKDAsUywtMSkuaGFzVHJhaWxpbmdFbXB0eUxpbmUpKXJldHVybiBOdihlKT9FOl8oRSk7bGV0IEE9Y2UoMCx1W20/MTowXSwtMSkubm9kZSx3PSF2ZShBKSYmaShBKSxUPVtnKHVbMF0pLG0/dS5zbGljZSgxLDIpLm1hcChnKToiIix3P1I6IiIsRCh1LnNsaWNlKG0/MjoxKSldLE49cy5tYXAoKHtub2RlOlN9KT0+UykuZmlsdGVyKHZlKTtmdW5jdGlvbiB4KCl7bGV0IFM9Y2UoMCxjZSgwLHUsLTEpLC0xKS5ub2RlLGs9Y2UoMCxiLC0xKTtyZXR1cm4gdmUoUykmJlR0KGspJiZOLnNsaWNlKDAsLTEpLnNvbWUoST0+SS5hcmd1bWVudHMuc29tZShVYSkpfWxldCBMO3JldHVybiBDfHxOLmxlbmd0aD4yJiZOLnNvbWUoUz0+Uy5hcmd1bWVudHMuc29tZShrPT4hY3IoaykpKXx8Yi5zbGljZSgwLC0xKS5zb21lKFR0KXx8eCgpP0w9XyhUKTpMPVtUdChFKXx8dz9McjoiIix1aShbRSxUXSldLFhhKHttZW1iZXJDaGFpbjohMH0sTCl9dmFyIE9MPU1MO2Z1bmN0aW9uIFRjKGUsdCxuKXt2YXIgYztsZXR7bm9kZTpyfT1lLHM9ci50eXBlPT09Ik5ld0V4cHJlc3Npb24iLGk9TnQoZSksbz1GbihyKSxhPXIudHlwZSE9PSJUU0ltcG9ydFR5cGUiJiZyLnR5cGVBcmd1bWVudHM/W24oInR5cGVBcmd1bWVudHMiKSxDbl06IiIsdT1vLmxlbmd0aD09PTEmJmt2KG9bMF0sdC5vcmlnaW5hbFRleHQpO2lmKHV8fGpMKGUpfHxWTChlKXx8RWMocixlLnBhcmVudCkpe2xldCBwPVtdO2lmKGlkKGUsKCk9PntwLnB1c2gobigpKX0pLCEodSYmKChjPXBbMF0ubGFiZWwpIT1udWxsJiZjLmVtYmVkKSkpcmV0dXJuW0l2KGUsbiksaSxhLCIoIixmZSgiLCAiLHApLCIpIl19bGV0IGw9ci50eXBlPT09IkltcG9ydEV4cHJlc3Npb24ifHxyLnR5cGU9PT0iVFNJbXBvcnRUeXBlInx8ci50eXBlPT09IlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2UiO2lmKCFsJiYhcyYmVG8oci5jYWxsZWUpJiYhZS5jYWxsKCgpPT50bihlLHQpLCJjYWxsZWUiLC4uLnIuY2FsbGVlLnR5cGU9PT0iQ2hhaW5FeHByZXNzaW9uIj9bImV4cHJlc3Npb24iXTpbXSkpcmV0dXJuIE9MKGUsdCxuKTtsZXQgZj1bSXYoZSxuKSxpLGEsemQoZSx0LG4pXTtyZXR1cm4gbHx8dmUoci5jYWxsZWUpP18oZik6Zn1mdW5jdGlvbiBJdihlLHQpe2xldHtub2RlOm59PWU7cmV0dXJuIG4udHlwZT09PSJJbXBvcnRFeHByZXNzaW9uIj9gaW1wb3J0JHtuLnBoYXNlP2AuJHtuLnBoYXNlfWA6IiJ9YDpuLnR5cGU9PT0iVFNJbXBvcnRUeXBlIj8iaW1wb3J0IjpuLnR5cGU9PT0iVFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSI/InJlcXVpcmUiOltuLnR5cGU9PT0iTmV3RXhwcmVzc2lvbiI/Im5ldyAiOiIiLHQoImNhbGxlZSIpLENuXX12YXIgUkw9WyJyZXF1aXJlIiwicmVxdWlyZS5yZXNvbHZlIiwicmVxdWlyZS5yZXNvbHZlLnBhdGhzIiwiaW1wb3J0Lm1ldGEucmVzb2x2ZSJdO2Z1bmN0aW9uIGpMKGUpe2xldHtub2RlOnR9PWU7aWYoISh0LnR5cGU9PT0iSW1wb3J0RXhwcmVzc2lvbiJ8fHQudHlwZT09PSJUU0ltcG9ydFR5cGUifHx0LnR5cGU9PT0iVFNFeHRlcm5hbE1vZHVsZVJlZmVyZW5jZSJ8fHQudHlwZT09PSJDYWxsRXhwcmVzc2lvbiImJiF0Lm9wdGlvbmFsJiZrZCh0LmNhbGxlZSxSTCkpKXJldHVybiExO2xldCBuPUZuKHQpO3JldHVybiBuLmxlbmd0aD09PTEmJnN0KG5bMF0pJiYhcShuWzBdKX1mdW5jdGlvbiBWTChlKXtsZXR7bm9kZTp0fT1lO2lmKHQudHlwZSE9PSJDYWxsRXhwcmVzc2lvbiJ8fHQub3B0aW9uYWx8fHQuY2FsbGVlLnR5cGUhPT0iSWRlbnRpZmllciIpcmV0dXJuITE7bGV0IG49Rm4odCk7cmV0dXJuIHQuY2FsbGVlLm5hbWU9PT0icmVxdWlyZSI/KG4ubGVuZ3RoPT09MSYmc3QoblswXSl8fG4ubGVuZ3RoPjEpJiYhcShuWzBdKTp0LmNhbGxlZS5uYW1lPT09ImRlZmluZSImJmUucGFyZW50LnR5cGU9PT0iRXhwcmVzc2lvblN0YXRlbWVudCI/bi5sZW5ndGg9PT0xfHxuLmxlbmd0aD09PTImJm5bMF0udHlwZT09PSJBcnJheUV4cHJlc3Npb24ifHxuLmxlbmd0aD09PTMmJnN0KG5bMF0pJiZuWzFdLnR5cGU9PT0iQXJyYXlFeHByZXNzaW9uIjohMX1mdW5jdGlvbiBzdShlLHQsbixyLHMsaSl7bGV0IG89V0woZSx0LG4scixpKSxhPWk/bihpLHthc3NpZ25tZW50TGF5b3V0Om99KToiIjtzd2l0Y2gobyl7Y2FzZSJicmVhay1hZnRlci1vcGVyYXRvciI6cmV0dXJuIF8oW18ocikscyxfKE8oW0gsYV0pKV0pO2Nhc2UibmV2ZXItYnJlYWstYWZ0ZXItb3BlcmF0b3IiOnJldHVybiBfKFtfKHIpLHMsIiAiLGFdKTtjYXNlImZsdWlkIjp7bGV0IHU9U3ltYm9sKCJhc3NpZ25tZW50Iik7cmV0dXJuIF8oW18ocikscyxfKE8oSCkse2lkOnV9KSxDbixLYShhLHtncm91cElkOnV9KV0pfWNhc2UiYnJlYWstbGhzIjpyZXR1cm4gXyhbcixzLCIgIixfKGEpXSk7Y2FzZSJjaGFpbiI6cmV0dXJuW18ocikscyxILGFdO2Nhc2UiY2hhaW4tdGFpbCI6cmV0dXJuW18ocikscyxPKFtILGFdKV07Y2FzZSJjaGFpbi10YWlsLWFycm93LWNoYWluIjpyZXR1cm5bXyhyKSxzLGFdO2Nhc2Uib25seS1sZWZ0IjpyZXR1cm4gcn19ZnVuY3Rpb24gVUwoZSx0LG4pe2xldHtub2RlOnJ9PWU7cmV0dXJuIHN1KGUsdCxuLG4oImxlZnQiKSxbIiAiLHIub3BlcmF0b3JdLCJyaWdodCIpfWZ1bmN0aW9uIHFMKGUsdCxuKXtyZXR1cm4gc3UoZSx0LG4sbigiaWQiKSwiID0iLCJpbml0Iil9ZnVuY3Rpb24gV0woZSx0LG4scixzKXtsZXR7bm9kZTppfT1lLG89aVtzXTtpZighbylyZXR1cm4ib25seS1sZWZ0IjtsZXQgYT0hTmMobyk7aWYoZS5tYXRjaChOYyxQdixmPT4hYXx8Zi50eXBlIT09IkV4cHJlc3Npb25TdGF0ZW1lbnQiJiZmLnR5cGUhPT0iVmFyaWFibGVEZWNsYXJhdGlvbiIpKXJldHVybiBhP28udHlwZT09PSJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiImJm8uYm9keS50eXBlPT09IkFycm93RnVuY3Rpb25FeHByZXNzaW9uIj8iY2hhaW4tdGFpbC1hcnJvdy1jaGFpbiI6ImNoYWluLXRhaWwiOiJjaGFpbiI7aWYoIWEmJk5jKG8ucmlnaHQpfHxadChvKSYmIXdjKG8pfHx4cih0Lm9yaWdpbmFsVGV4dCxvKXx8cShvLHouTGVhZGluZyxndikpcmV0dXJuImJyZWFrLWFmdGVyLW9wZXJhdG9yIjtpZihpLnR5cGU9PT0iSW1wb3J0QXR0cmlidXRlInx8by50eXBlPT09IkNhbGxFeHByZXNzaW9uIiYmby5jYWxsZWUubmFtZT09PSJyZXF1aXJlInx8ZS5yb290LnR5cGU9PT0iSnNvblJvb3QiKXJldHVybiJuZXZlci1icmVhay1hZnRlci1vcGVyYXRvciI7bGV0IHU9dzUocik7aWYoSkwoaSl8fEtMKGkpfHxNdihpKSYmdSlyZXR1cm4iYnJlYWstbGhzIjtsZXQgbD1YTChpLHIsdCk7cmV0dXJuIGUuY2FsbCgoKT0+SEwoZSx0LG4sbCkscyk/ImJyZWFrLWFmdGVyLW9wZXJhdG9yIjp6TChpKT8iYnJlYWstbGhzIjohdSYmKGx8fG8udHlwZT09PSJUZW1wbGF0ZUxpdGVyYWwifHxvLnR5cGU9PT0iVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uInx8TGsobyl8fGlyKG8pfHxvLnR5cGU9PT0iQ2xhc3NFeHByZXNzaW9uIik/Im5ldmVyLWJyZWFrLWFmdGVyLW9wZXJhdG9yIjoiZmx1aWQifWZ1bmN0aW9uIEhMKGUsdCxuLHIpe2xldCBzPWUubm9kZTtpZihTcihzKSYmIXJ1KHMpKXJldHVybiEwO3N3aXRjaChzLnR5cGUpe2Nhc2UiU3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uIjpjYXNlIlNlcXVlbmNlRXhwcmVzc2lvbiI6cmV0dXJuITA7Y2FzZSJUU0NvbmRpdGlvbmFsVHlwZSI6Y2FzZSJDb25kaXRpb25hbFR5cGVBbm5vdGF0aW9uIjppZighdC5leHBlcmltZW50YWxUZXJuYXJpZXMmJiFRTChzKSlicmVhaztyZXR1cm4hMDtjYXNlIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiI6e2lmKCF0LmV4cGVyaW1lbnRhbFRlcm5hcmllcyl7bGV0e3Rlc3Q6bH09cztyZXR1cm4gU3IobCkmJiFydShsKX1sZXR7Y29uc2VxdWVudDphLGFsdGVybmF0ZTp1fT1zO3JldHVybiBhLnR5cGU9PT0iQ29uZGl0aW9uYWxFeHByZXNzaW9uInx8dS50eXBlPT09IkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJ9Y2FzZSJDbGFzc0V4cHJlc3Npb24iOnJldHVybiBTZShzLmRlY29yYXRvcnMpfWlmKHIpcmV0dXJuITE7bGV0IGk9cyxvPVtdO2Zvcig7OylpZihpLnR5cGU9PT0iVW5hcnlFeHByZXNzaW9uInx8aS50eXBlPT09IkF3YWl0RXhwcmVzc2lvbiJ8fGkudHlwZT09PSJZaWVsZEV4cHJlc3Npb24iJiZpLmFyZ3VtZW50IT09bnVsbClpPWkuYXJndW1lbnQsby5wdXNoKCJhcmd1bWVudCIpO2Vsc2UgaWYoaS50eXBlPT09IlRTTm9uTnVsbEV4cHJlc3Npb24iKWk9aS5leHByZXNzaW9uLG8ucHVzaCgiZXhwcmVzc2lvbiIpO2Vsc2UgYnJlYWs7cmV0dXJuISEoc3QoaSl8fGUuY2FsbCgoKT0+UnYoZSx0LG4pLC4uLm8pKX1mdW5jdGlvbiBKTChlKXtpZihQdihlKSl7bGV0IHQ9ZS5sZWZ0fHxlLmlkO3JldHVybiB0LnR5cGU9PT0iT2JqZWN0UGF0dGVybiImJnQucHJvcGVydGllcy5sZW5ndGg+MiYmdC5wcm9wZXJ0aWVzLnNvbWUobj0+e3ZhciByO3JldHVybiB5cyhuKSYmKCFuLnNob3J0aGFuZHx8KChyPW4udmFsdWUpPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09IkFzc2lnbm1lbnRQYXR0ZXJuIil9KX1yZXR1cm4hMX1mdW5jdGlvbiBOYyhlKXtyZXR1cm4gZS50eXBlPT09IkFzc2lnbm1lbnRFeHByZXNzaW9uIn1mdW5jdGlvbiBQdihlKXtyZXR1cm4gTmMoZSl8fGUudHlwZT09PSJWYXJpYWJsZURlY2xhcmF0b3IifWZ1bmN0aW9uIHpMKGUpe2xldCB0PUdMKGUpO2lmKFNlKHQpKXtsZXQgbj1lLnR5cGU9PT0iVFNUeXBlQWxpYXNEZWNsYXJhdGlvbiI/ImNvbnN0cmFpbnQiOiJib3VuZCI7aWYodC5sZW5ndGg+MSYmdC5zb21lKHI9PnJbbl18fHIuZGVmYXVsdCkpcmV0dXJuITB9cmV0dXJuITF9ZnVuY3Rpb24gR0woZSl7dmFyIHQ7aWYoVGIoZSkpcmV0dXJuKHQ9ZS50eXBlUGFyYW1ldGVycyk9PW51bGw/dm9pZCAwOnQucGFyYW1zfWZ1bmN0aW9uIEtMKGUpe2lmKGUudHlwZSE9PSJWYXJpYWJsZURlY2xhcmF0b3IiKXJldHVybiExO2xldHt0eXBlQW5ub3RhdGlvbjp0fT1lLmlkO2lmKCF0fHwhdC50eXBlQW5ub3RhdGlvbilyZXR1cm4hMTtsZXQgbj1Pdih0LnR5cGVBbm5vdGF0aW9uKTtyZXR1cm4gU2UobikmJm4ubGVuZ3RoPjEmJm4uc29tZShyPT5TZShPdihyKSl8fHIudHlwZT09PSJUU0NvbmRpdGlvbmFsVHlwZSIpfWZ1bmN0aW9uIE12KGUpe3ZhciB0O3JldHVybiBlLnR5cGU9PT0iVmFyaWFibGVEZWNsYXJhdG9yIiYmKCh0PWUuaW5pdCk9PW51bGw/dm9pZCAwOnQudHlwZSk9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ifWZ1bmN0aW9uIE92KGUpe2xldCB0O3N3aXRjaChlLnR5cGUpe2Nhc2UiR2VuZXJpY1R5cGVBbm5vdGF0aW9uIjp0PWUudHlwZVBhcmFtZXRlcnM7YnJlYWs7Y2FzZSJUU1R5cGVSZWZlcmVuY2UiOnQ9ZS50eXBlQXJndW1lbnRzO2JyZWFrfXJldHVybiB0PT1udWxsP3ZvaWQgMDp0LnBhcmFtc31mdW5jdGlvbiBSdihlLHQsbixyPSExKXt2YXIgbztsZXR7bm9kZTpzfT1lLGk9KCk9PlJ2KGUsdCxuLCEwKTtpZihacyhzKSlyZXR1cm4gZS5jYWxsKGksImV4cHJlc3Npb24iKTtpZih2ZShzKSl7aWYoKG89VGMoZSx0LG4pLmxhYmVsKSE9bnVsbCYmby5tZW1iZXJDaGFpbilyZXR1cm4hMTtsZXQgYT1GbihzKTtyZXR1cm4hKGEubGVuZ3RoPT09MHx8YS5sZW5ndGg9PT0xJiZKZChhWzBdLHQpKXx8WUwocyxuKT8hMTplLmNhbGwoaSwiY2FsbGVlIil9cmV0dXJuIHhlKHMpP2UuY2FsbChpLCJvYmplY3QiKTpyJiYocy50eXBlPT09IklkZW50aWZpZXIifHxzLnR5cGU9PT0iVGhpc0V4cHJlc3Npb24iKX1mdW5jdGlvbiBYTChlLHQsbil7cmV0dXJuIHlzKGUpPyh0PUFkKHQpLHR5cGVvZiB0PT0ic3RyaW5nIiYmU28odCk8bi50YWJXaWR0aCszKTohMX1mdW5jdGlvbiBZTChlLHQpe3ZhciByO2xldCBuPShyPWUudHlwZUFyZ3VtZW50cyk9PW51bGw/dm9pZCAwOnIucGFyYW1zO2lmKFNlKG4pKXtpZihuLmxlbmd0aD4xKXJldHVybiEwO2lmKG4ubGVuZ3RoPT09MSl7bGV0IHM9blswXTtpZihadChzKXx8VmEocyl8fHMudHlwZT09PSJUU1R5cGVMaXRlcmFsInx8cy50eXBlPT09Ik9iamVjdFR5cGVBbm5vdGF0aW9uIilyZXR1cm4hMH1pZihUdCh0KCJ0eXBlQXJndW1lbnRzIikpKXJldHVybiEwfXJldHVybiExfWZ1bmN0aW9uIGp2KGUpe3N3aXRjaChlLnR5cGUpe2Nhc2UiRnVuY3Rpb25UeXBlQW5ub3RhdGlvbiI6Y2FzZSJHZW5lcmljVHlwZUFubm90YXRpb24iOmNhc2UiVFNGdW5jdGlvblR5cGUiOnJldHVybiEhZS50eXBlUGFyYW1ldGVycztjYXNlIlRTVHlwZVJlZmVyZW5jZSI6cmV0dXJuISFlLnR5cGVBcmd1bWVudHM7ZGVmYXVsdDpyZXR1cm4hMX19ZnVuY3Rpb24gUUwoZSl7cmV0dXJuIGp2KGUuY2hlY2tUeXBlKXx8anYoZS5leHRlbmRzVHlwZSl9ZnVuY3Rpb24gWkwoZSx0LG4pe2xldHtub2RlOnJ9PWUscz1bImF3YWl0Il07aWYoci5hcmd1bWVudCl7cy5wdXNoKCIgIixuKCJhcmd1bWVudCIpKTtsZXR7cGFyZW50Oml9PWU7aWYodmUoaSkmJmkuY2FsbGVlPT09cnx8eGUoaSkmJmkub2JqZWN0PT09cil7cz1bTyhbUCwuLi5zXSksUF07bGV0IG89ZS5maW5kQW5jZXN0b3IoYT0+YS50eXBlPT09IkF3YWl0RXhwcmVzc2lvbiJ8fGEudHlwZT09PSJCbG9ja1N0YXRlbWVudCIpO2lmKChvPT1udWxsP3ZvaWQgMDpvLnR5cGUpIT09IkF3YWl0RXhwcmVzc2lvbiJ8fCFrdChvLmFyZ3VtZW50LGE9PmE9PT1yKSlyZXR1cm4gXyhzKX19cmV0dXJuIHN9dmFyIGUkPUFycmF5LnByb3RvdHlwZS5maW5kTGFzdD8/ZnVuY3Rpb24oZSl7Zm9yKGxldCB0PXRoaXMubGVuZ3RoLTE7dD49MDt0LS0pe2xldCBuPXRoaXNbdF07aWYoZShuLHQsdGhpcykpcmV0dXJuIG59fSx0JD1LaCgiZmluZExhc3QiLGZ1bmN0aW9uKCl7aWYoQXJyYXkuaXNBcnJheSh0aGlzKSlyZXR1cm4gZSR9KSxuJD10JDtmdW5jdGlvbiBHZChlLHQsbixyKXtsZXR7bm9kZTpzfT1lLGk9W10sbz1uJCgwLHNbcl0sYT0+YS50eXBlIT09IkVtcHR5U3RhdGVtZW50Iik7cmV0dXJuIGUuZWFjaCgoe25vZGU6YX0pPT57YS50eXBlIT09IkVtcHR5U3RhdGVtZW50IiYmKGkucHVzaChuKCkpLGEhPT1vJiYoaS5wdXNoKFIpLGxyKGEsdCkmJmkucHVzaChSKSkpfSxyKSxpfWZ1bmN0aW9uIFZ2KGUsdCxuKXtsZXQgcj1yJChlLHQsbikse25vZGU6cyxwYXJlbnQ6aX09ZTtpZihzLnR5cGU9PT0iUHJvZ3JhbSImJihpPT1udWxsP3ZvaWQgMDppLnR5cGUpIT09Ik1vZHVsZUV4cHJlc3Npb24iKXJldHVybiByP1tyLFJdOiIiO2xldCBvPVtdO2lmKHMudHlwZT09PSJTdGF0aWNCbG9jayImJm8ucHVzaCgic3RhdGljICIpLG8ucHVzaCgieyIpLHIpby5wdXNoKE8oW1Iscl0pLFIpO2Vsc2V7bGV0IGE9ZS5ncmFuZHBhcmVudDtpLnR5cGU9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24ifHxpLnR5cGU9PT0iRnVuY3Rpb25FeHByZXNzaW9uInx8aS50eXBlPT09IkZ1bmN0aW9uRGVjbGFyYXRpb24ifHxpLnR5cGU9PT0iQ29tcG9uZW50RGVjbGFyYXRpb24ifHxpLnR5cGU9PT0iSG9va0RlY2xhcmF0aW9uInx8aS50eXBlPT09Ik9iamVjdE1ldGhvZCJ8fGkudHlwZT09PSJDbGFzc01ldGhvZCJ8fGkudHlwZT09PSJDbGFzc1ByaXZhdGVNZXRob2QifHxpLnR5cGU9PT0iRm9yU3RhdGVtZW50Inx8aS50eXBlPT09IldoaWxlU3RhdGVtZW50Inx8aS50eXBlPT09IkRvV2hpbGVTdGF0ZW1lbnQifHxpLnR5cGU9PT0iRG9FeHByZXNzaW9uInx8aS50eXBlPT09Ik1vZHVsZUV4cHJlc3Npb24ifHxpLnR5cGU9PT0iQ2F0Y2hDbGF1c2UiJiYhYS5maW5hbGl6ZXJ8fGkudHlwZT09PSJUU01vZHVsZURlY2xhcmF0aW9uInx8aS50eXBlPT09IkRlY2xhcmVNb2R1bGUifHxpLnR5cGU9PT0iTWF0Y2hTdGF0ZW1lbnRDYXNlInx8cy50eXBlPT09IlN0YXRpY0Jsb2NrInx8by5wdXNoKFIpfXJldHVybiBvLnB1c2goIn0iKSxvfWZ1bmN0aW9uIHIkKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9U2Uoci5kaXJlY3RpdmVzKSxpPXIuYm9keS5zb21lKHU9PnUudHlwZSE9PSJFbXB0eVN0YXRlbWVudCIpLG89cShyLHouRGFuZ2xpbmcpO2lmKCFzJiYhaSYmIW8pcmV0dXJuIiI7bGV0IGE9W107cmV0dXJuIHMmJihhLnB1c2goR2QoZSx0LG4sImRpcmVjdGl2ZXMiKSksKGl8fG8pJiYoYS5wdXNoKFIpLGxyKGNlKDAsci5kaXJlY3RpdmVzLC0xKSx0KSYmYS5wdXNoKFIpKSksaSYmYS5wdXNoKEdkKGUsdCxuLCJib2R5IikpLG8mJmEucHVzaChldChlLHQpKSxhfWZ1bmN0aW9uIHMkKGUpe2xldCB0PW5ldyBXZWFrTWFwO3JldHVybiBuPT52bih0LG4sKCk9PlN5bWJvbChlKSl9dmFyIGkkPXMkLFV2PVsicHJvcGVydGllcyIsImluZGV4ZXJzIiwiY2FsbFByb3BlcnRpZXMiLCJpbnRlcm5hbFNsb3RzIl07ZnVuY3Rpb24gbyQoZSx0KXtsZXR7bm9kZTpufT1lO2lmKG4udHlwZT09PSJDbGFzc0JvZHkifHxuLnR5cGU9PT0iVFNJbnRlcmZhY2VCb2R5Iil7ZS5lYWNoKHQsImJvZHkiKTtyZXR1cm59aWYobi50eXBlPT09IlRTVHlwZUxpdGVyYWwiKXtlLmVhY2godCwibWVtYmVycyIpO3JldHVybn1pZihuLnR5cGU9PT0iUmVjb3JkRGVjbGFyYXRpb25Cb2R5Iil7ZS5lYWNoKHQsImVsZW1lbnRzIik7cmV0dXJufWlmKG4udHlwZT09PSJPYmplY3RUeXBlQW5ub3RhdGlvbiIpe2xldCByPVV2LmZsYXRNYXAocz0+ZS5tYXAoKHtub2RlOmksaW5kZXg6b30pPT4oe25vZGU6aSxsb2M6ZWUoaSksc2VsZWN0b3I6W3Msb119KSxzKSkuc29ydCgocyxpKT0+cy5sb2MtaS5sb2MpO2ZvcihsZXRbcyx7bm9kZTppLHNlbGVjdG9yOm99XW9mIHIuZW50cmllcygpKWUuY2FsbCgoKT0+e3ZhciBhO3JldHVybiB0KHtub2RlOmksbmV4dDooYT1yW3MrMV0pPT1udWxsP3ZvaWQgMDphLm5vZGUsaXNMYXN0OnM9PT1yLmxlbmd0aC0xfSl9LC4uLm8pfX1mdW5jdGlvbiBhJChlKXtpZihlLnR5cGU9PT0iT2JqZWN0VHlwZUFubm90YXRpb24iKXJldHVybiBVdi5zb21lKG49PlNlKGVbbl0pKTtsZXQgdD1lLnR5cGU9PT0iUmVjb3JkRGVjbGFyYXRpb25Cb2R5Ij9lLmVsZW1lbnRzOmUuYm9keTtyZXR1cm4gU2UodCl9ZnVuY3Rpb24gS2QoZSx0LG4pe2xldHtub2RlOnJ9PWUscz1bXSxpPXIudHlwZT09PSJPYmplY3RUeXBlQW5ub3RhdGlvbiIsbz1yLnR5cGU9PT0iUmVjb3JkRGVjbGFyYXRpb25Cb2R5IixhPSFxdihlKSx1PWE/SDpSLGw9cShyLHouRGFuZ2xpbmcpLFtmLGNdPWkmJnIuZXhhY3Q/WyJ7fCIsInx9Il06Int9IixwPSEwLGg7aWYobyQoZSwoe25vZGU6ZCxuZXh0Om0saXNMYXN0Omd9KT0+e2lmKGg/PyhoPWQpLHAmJihwPSExKSxzLnB1c2gobigpKSwhbyYmYSYmaSl7bGV0e3BhcmVudDpEfT1lO0QuaW5leGFjdHx8IWc/cy5wdXNoKCIsIik6cy5wdXNoKEZzKHQpKX1vJiZkLnR5cGUhPT0iTWV0aG9kRGVmaW5pdGlvbiImJnMucHVzaCgiLCIpLCFvJiYhYSYmKHUkKHtub2RlOmQsbmV4dDptfSx0KXx8SnYoe25vZGU6ZCxuZXh0Om19LHQpKSYmcy5wdXNoKCI7IiksZ3x8KHMucHVzaCh1KSxscihkLHQpJiZzLnB1c2goUikpfSksbCYmcy5wdXNoKGV0KGUsdCkpLHIudHlwZT09PSJPYmplY3RUeXBlQW5ub3RhdGlvbiImJnIuaW5leGFjdCl7cCYmKHA9ITEpO2xldCBkO3Eocix6LkRhbmdsaW5nKT9kPVtxKHIsei5MaW5lKXx8aXQodC5vcmlnaW5hbFRleHQsWChjZSgwLGVuKHIpLC0xKSkpP1I6SCwiLi4uIl06ZD1baD9IOiIiLCIuLi4iXSxzLnB1c2goZCl9aWYoYSl7bGV0IGQ9cShyLHouRGFuZ2xpbmd8ei5MaW5lKXx8dC5vYmplY3RXcmFwPT09InByZXNlcnZlIiYmaCYmcXQodC5vcmlnaW5hbFRleHQsZWUociksZWUoaCkpLG07aWYocy5sZW5ndGg9PT0wKW09ZitjO2Vsc2V7bGV0IGc9IXQuYnJhY2tldFNwYWNpbmd8fHAmJiFkP1A6SDttPVtmLE8oW2csLi4uc10pLGcsY119cmV0dXJuIGUubWF0Y2godm9pZCAwLChnLEQpPT5EPT09InR5cGVBbm5vdGF0aW9uIiwoZyxEKT0+RD09PSJ0eXBlQW5ub3RhdGlvbiIsUWEpfHxlLm1hdGNoKHZvaWQgMCwoZyxEKT0+Zy50eXBlPT09IkZ1bmN0aW9uVHlwZVBhcmFtIiYmRD09PSJ0eXBlQW5ub3RhdGlvbiIsUWEpP206XyhtLHtzaG91bGRCcmVhazpkfSl9cmV0dXJuW2Yscy5sZW5ndGg+MD9bTyhbUixzXSksUl06IiIsY119ZnVuY3Rpb24gcXYoZSl7bGV0e25vZGU6dH09ZTtpZih0LnR5cGU9PT0iT2JqZWN0VHlwZUFubm90YXRpb24iKXtsZXR7a2V5Om4scGFyZW50OnJ9PWU7cmV0dXJuIG49PT0iYm9keSImJihyLnR5cGU9PT0iSW50ZXJmYWNlRGVjbGFyYXRpb24ifHxyLnR5cGU9PT0iRGVjbGFyZUludGVyZmFjZSJ8fHIudHlwZT09PSJEZWNsYXJlQ2xhc3MiKX1yZXR1cm4gdC50eXBlPT09IkNsYXNzQm9keSJ8fHQudHlwZT09PSJUU0ludGVyZmFjZUJvZHkifHx0LnR5cGU9PT0iUmVjb3JkRGVjbGFyYXRpb25Cb2R5In1mdW5jdGlvbiAkcihlLHQpe2xldHtwYXJlbnQ6bn09ZTtyZXR1cm4gZS5jYWxsUGFyZW50KHF2KT9uLnR5cGU9PT0iT2JqZWN0VHlwZUFubm90YXRpb24iPyI7IjpxZSh0KTpuLnR5cGU9PT0iVFNUeXBlTGl0ZXJhbCI/ZS5pc0xhc3Q/dC5zZW1pP3VlKCI7Iik6IiI6dC5zZW1pfHxKdih7bm9kZTplLm5vZGUsbmV4dDplLm5leHR9LHQpPyI7Ijp1ZSgiIiwiOyIpOiIifXZhciBXdj1LKFsiQ2xhc3NQcm9wZXJ0eSIsIlByb3BlcnR5RGVmaW5pdGlvbiIsIkNsYXNzUHJpdmF0ZVByb3BlcnR5IiwiQ2xhc3NBY2Nlc3NvclByb3BlcnR5IiwiQWNjZXNzb3JQcm9wZXJ0eSIsIlRTQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb24iLCJUU0Fic3RyYWN0QWNjZXNzb3JQcm9wZXJ0eSJdKSxIdj1lPT57aWYoZS5jb21wdXRlZHx8ZS50eXBlQW5ub3RhdGlvbilyZXR1cm4hMTtsZXR7dHlwZTp0LG5hbWU6bn09ZS5rZXk7cmV0dXJuIHQ9PT0iSWRlbnRpZmllciImJihuPT09InN0YXRpYyJ8fG49PT0iZ2V0Inx8bj09PSJzZXQiKX07ZnVuY3Rpb24gdSQoe25vZGU6ZSxuZXh0OnR9LG4pe3ZhciByO2lmKG4uc2VtaXx8IVd2KGUpKXJldHVybiExO2lmKCFlLnZhbHVlJiZIdihlKSlyZXR1cm4hMDtpZighdHx8dC5zdGF0aWN8fHQuYWNjZXNzaWJpbGl0eXx8dC5yZWFkb25seSlyZXR1cm4hMTtpZighdC5jb21wdXRlZCl7bGV0IHM9KHI9dC5rZXkpPT1udWxsP3ZvaWQgMDpyLm5hbWU7aWYocz09PSJpbiJ8fHM9PT0iaW5zdGFuY2VvZiIpcmV0dXJuITB9aWYoV3YodCkmJiF0LnN0YXRpYyYmdC52YXJpYW5jZSYmIXQuZGVjbGFyZSlyZXR1cm4hMDtzd2l0Y2godC50eXBlKXtjYXNlIkNsYXNzUHJvcGVydHkiOmNhc2UiUHJvcGVydHlEZWZpbml0aW9uIjpjYXNlIlRTQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb24iOnJldHVybiB0LmNvbXB1dGVkO2Nhc2UiTWV0aG9kRGVmaW5pdGlvbiI6Y2FzZSJUU0Fic3RyYWN0TWV0aG9kRGVmaW5pdGlvbiI6Y2FzZSJDbGFzc01ldGhvZCI6Y2FzZSJDbGFzc1ByaXZhdGVNZXRob2QiOntpZigodC52YWx1ZT90LnZhbHVlLmFzeW5jOnQuYXN5bmMpfHx0LmtpbmQ9PT0iZ2V0Inx8dC5raW5kPT09InNldCIpcmV0dXJuITE7bGV0IHM9dC52YWx1ZT90LnZhbHVlLmdlbmVyYXRvcjp0LmdlbmVyYXRvcjtyZXR1cm4hISh0LmNvbXB1dGVkfHxzKX1jYXNlIlRTSW5kZXhTaWduYXR1cmUiOnJldHVybiEwfXJldHVybiExfXZhciBsJD1LKFsiVFNQcm9wZXJ0eVNpZ25hdHVyZSJdKTtmdW5jdGlvbiBKdih7bm9kZTplLG5leHQ6dH0sbil7cmV0dXJuIG4uc2VtaXx8IWwkKGUpPyExOkh2KGUpPyEwOnQmJnQudHlwZT09PSJUU0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbiI/IShlLnR5cGU9PT0iVFNQcm9wZXJ0eVNpZ25hdHVyZSImJmUudHlwZUFubm90YXRpb24pOiExfXZhciBjJD1pJCgiaGVyaXRhZ2VHcm91cCIpLGYkPUsoWyJUU0ludGVyZmFjZURlY2xhcmF0aW9uIiwiRGVjbGFyZUludGVyZmFjZSIsIkludGVyZmFjZURlY2xhcmF0aW9uIiwiSW50ZXJmYWNlVHlwZUFubm90YXRpb24iXSk7ZnVuY3Rpb24gWGQoZSx0LG4pe2xldCByPXAkKGUsdCxuKSx7bm9kZTpzfT1lO2lmKHMudHlwZT09PSJDbGFzc0V4cHJlc3Npb24iJiZTZShzLmRlY29yYXRvcnMpKXtsZXQgaT12dihlLHQsbik7cmV0dXJuIHRuKGUsdCk/W08oW1AsaSxyXSksUF06W2kscl19cmV0dXJuIHJ9ZnVuY3Rpb24gcCQoZSx0LG4pe2xldHtub2RlOnJ9PWUscz1mJChyKSxpPXIudHlwZT09PSJSZWNvcmREZWNsYXJhdGlvbiIsbz1zPyJpbnRlcmZhY2UiOmk/InJlY29yZCI6ImNsYXNzIixhPVtybihlKSx2YyhlKSxvXSx1PUd2KGUpLGw9W10sZj1bXTtpZihyLnR5cGUhPT0iSW50ZXJmYWNlVHlwZUFubm90YXRpb24iKXtyLmlkJiZsLnB1c2goIiAiKTtmb3IobGV0IHAgb2ZbImlkIiwidHlwZVBhcmFtZXRlcnMiXSlpZihyW3BdKXtsZXR7bGVhZGluZzpoLHRyYWlsaW5nOmR9PWUuY2FsbCgoKT0+VEUoZSx0KSxwKTtsLnB1c2goaCxuKHApLE8oZCkpfX1pZihyLnN1cGVyQ2xhc3Mpe2xldCBwPVttJChlLHQsbiksbigic3VwZXJUeXBlQXJndW1lbnRzIildLGg9ZS5jYWxsKCgpPT5bImV4dGVuZHMgIixGdChlLHAsdCldLCJzdXBlckNsYXNzIik7dT9mLnB1c2goSCxfKGgpKTpmLnB1c2goIiAiLGgpfWVsc2UgZi5wdXNoKFlkKGUsdCxuLCJleHRlbmRzIikpO2YucHVzaChZZChlLHQsbiwibWl4aW5zIiksWWQoZSx0LG4sImltcGxlbWVudHMiKSk7bGV0IGM7cmV0dXJuIHU/KGM9YyQociksYS5wdXNoKF8oWy4uLmwsTyhmKV0se2lkOmN9KSkpOmEucHVzaCguLi5sLC4uLmYpLCFzJiZ1JiZhJChyLmJvZHkpP2EucHVzaCh1ZShSLCIgIix7Z3JvdXBJZDpjfSkpOmEucHVzaCgiICIpLGEucHVzaChuKCJib2R5IikpLGF9ZnVuY3Rpb24genYoZSl7bGV0IHQ9ZS5zdXBlckNsYXNzPzE6MDtmb3IobGV0IG4gb2ZbImV4dGVuZHMiLCJtaXhpbnMiLCJpbXBsZW1lbnRzIl0paWYoQXJyYXkuaXNBcnJheShlW25dKSYmKHQrPWVbbl0ubGVuZ3RoKSx0PjEpcmV0dXJuITA7cmV0dXJuIHQ+MX1mdW5jdGlvbiBoJChlKXt2YXIgcixzLGk7bGV0e25vZGU6dH09ZTtpZihxKHQuaWQsei5UcmFpbGluZyl8fHEodC50eXBlUGFyYW1ldGVycyx6LlRyYWlsaW5nKXx8cSh0LnN1cGVyQ2xhc3MpfHx6dih0KSlyZXR1cm4hMDtpZih0LnN1cGVyQ2xhc3MpcmV0dXJuIGUucGFyZW50LnR5cGU9PT0iQXNzaWdubWVudEV4cHJlc3Npb24iPyExOiF0LnN1cGVyVHlwZUFyZ3VtZW50cyYmeGUoRHModC5zdXBlckNsYXNzKSk7bGV0IG49KChyPXQuZXh0ZW5kcyk9PW51bGw/dm9pZCAwOnJbMF0pPz8oKHM9dC5taXhpbnMpPT1udWxsP3ZvaWQgMDpzWzBdKT8/KChpPXQuaW1wbGVtZW50cyk9PW51bGw/dm9pZCAwOmlbMF0pO3JldHVybiBuP24udHlwZT09PSJJbnRlcmZhY2VFeHRlbmRzIiYmbi5pZC50eXBlPT09IlF1YWxpZmllZFR5cGVJZGVudGlmaWVyIiYmIW4udHlwZVBhcmFtZXRlcnN8fChuLnR5cGU9PT0iVFNDbGFzc0ltcGxlbWVudHMifHxuLnR5cGU9PT0iVFNJbnRlcmZhY2VIZXJpdGFnZSIpJiZ4ZShuLmV4cHJlc3Npb24pJiYhbi50eXBlQXJndW1lbnRzOiExfXZhciBkJD1uZXcgV2Vha01hcDtmdW5jdGlvbiBHdihlKXtyZXR1cm4gdm4oZCQsZS5ub2RlLCgpPT5oJChlKSl9ZnVuY3Rpb24gWWQoZSx0LG4scil7bGV0e25vZGU6c309ZTtpZighU2Uoc1tyXSkpcmV0dXJuIiI7bGV0IGk9ZXQoZSx0LHttYXJrZXI6cn0pLG89ZmUoWyIsIixIXSxlLm1hcChuLHIpKTtpZighenYocykpe2xldCBhPVtgJHtyfSBgLGksb107cmV0dXJuIEd2KGUpP1tILF8oYSldOlsiICIsYV19cmV0dXJuW0gsaSxpJiZSLHIsXyhPKFtILG9dKSldfWZ1bmN0aW9uIG0kKGUsdCxuKXtsZXQgcj1uKCJzdXBlckNsYXNzIikse3BhcmVudDpzfT1lO3JldHVybiBzLnR5cGU9PT0iQXNzaWdubWVudEV4cHJlc3Npb24iP18odWUoWyIoIixPKFtQLHJdKSxQLCIpIl0scikpOnJ9ZnVuY3Rpb24gS3YoZSx0LG4pe2xldHtub2RlOnJ9PWUscz1bXTtyZXR1cm4gU2Uoci5kZWNvcmF0b3JzKSYmcy5wdXNoKEV2KGUsdCxuKSkscy5wdXNoKEZjKHIpKSxyLnN0YXRpYyYmcy5wdXNoKCJzdGF0aWMgIikscy5wdXNoKHZjKGUpKSxyLm92ZXJyaWRlJiZzLnB1c2goIm92ZXJyaWRlICIpLHMucHVzaChJZChlLHQsbikpLHN9ZnVuY3Rpb24gWHYoZSx0LG4pe2xldHtub2RlOnJ9PWUscz1bXTtTZShyLmRlY29yYXRvcnMpJiZzLnB1c2goRXYoZSx0LG4pKSxzLnB1c2gocm4oZSksRmMocikpLHIuc3RhdGljJiZzLnB1c2goInN0YXRpYyAiKSxzLnB1c2godmMoZSkpLHIub3ZlcnJpZGUmJnMucHVzaCgib3ZlcnJpZGUgIiksci5yZWFkb25seSYmcy5wdXNoKCJyZWFkb25seSAiKSxyLnZhcmlhbmNlJiZzLnB1c2gobigidmFyaWFuY2UiKSksKHIudHlwZT09PSJDbGFzc0FjY2Vzc29yUHJvcGVydHkifHxyLnR5cGU9PT0iQWNjZXNzb3JQcm9wZXJ0eSJ8fHIudHlwZT09PSJUU0Fic3RyYWN0QWNjZXNzb3JQcm9wZXJ0eSIpJiZzLnB1c2goImFjY2Vzc29yICIpLHMucHVzaChBcyhlLHQsbiksTnQoZSksTEUoZSksZHQoZSxuKSk7bGV0IGk9ci50eXBlPT09IlRTQWJzdHJhY3RQcm9wZXJ0eURlZmluaXRpb24ifHxyLnR5cGU9PT0iVFNBYnN0cmFjdEFjY2Vzc29yUHJvcGVydHkiO3JldHVybltzdShlLHQsbixzLCIgPSIsaT92b2lkIDA6InZhbHVlIikscWUodCldfWZ1bmN0aW9uIGckKGUsdCl7bGV0IG49ZW4oZSx6LkxlYWRpbmcpO2lmKG4ubGVuZ3RoPT09MClyZXR1cm4hMTtsZXRbcl09bixzPXQub3JpZ2luYWxUZXh0LGk9ZWUocik7cmV0dXJuIHF0KHMsaSxYKHIpKXx8aXQocyxpLHtiYWNrd2FyZHM6ITB9KX1mdW5jdGlvbiBObyhlLHQsbixyPSJib2R5Iil7cmV0dXJuIGUuY2FsbCgoe25vZGU6c30pPT57bGV0IGk9bigpO2lmKHMudHlwZT09PSJFbXB0eVN0YXRlbWVudCIpcmV0dXJuIHEocyx6LkxlYWRpbmcpP1siICIsaV06aTtsZXQgbz1zLnR5cGU9PT0iQmxvY2tTdGF0ZW1lbnQiO3JldHVybiBnJChzLHQpP28/W1IsaV06TyhbUixpXSk6b3x8cy50eXBlPT09IklmU3RhdGVtZW50IiYmZS5wYXJlbnQudHlwZT09PSJJZlN0YXRlbWVudCImJmUua2V5PT09ImFsdGVybmF0ZSI/WyIgIixpXTpPKFtILGldKX0scil9dmFyIHkkPShlLHQsbik9Pk5vKGUsdCxuLCJjb25zZXF1ZW50IiksRCQ9KGUsdCxuKT0+Tm8oZSx0LG4sImFsdGVybmF0ZSIpO2Z1bmN0aW9uIGIkKGUsdCxuKXtyZXR1cm5bXyhbImRvIixObyhlLHQsbildKSxlLm5vZGUuYm9keS50eXBlPT09IkJsb2NrU3RhdGVtZW50Ij8iICI6Uiwid2hpbGUgKCIsQmQoZSx0LG4pLCIpIixxZSh0KV19dmFyIEUkPUsoWyJUU0FzRXhwcmVzc2lvbiIsIlRTVHlwZUFzc2VydGlvbiIsIlRTTm9uTnVsbEV4cHJlc3Npb24iLCJUU0luc3RhbnRpYXRpb25FeHByZXNzaW9uIiwiVFNTYXRpc2ZpZXNFeHByZXNzaW9uIl0pO2Z1bmN0aW9uIFl2KGUpe3JldHVybiBFJChlKT9ZdihlLmV4cHJlc3Npb24pOmV9dmFyIHYkPUsoWyJGdW5jdGlvbkV4cHJlc3Npb24iLCJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiJdKTtmdW5jdGlvbiBGJChlKXtyZXR1cm4gZS50eXBlPT09Ik1lbWJlckV4cHJlc3Npb24ifHxlLnR5cGU9PT0iT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uInx8ZS50eXBlPT09IklkZW50aWZpZXIiJiZlLm5hbWUhPT0idW5kZWZpbmVkIn1mdW5jdGlvbiBBJChlLHQpe2lmKFFFKGUsdCkpe2xldCBuPVl2KGUubm9kZS5leHByZXNzaW9uKTtyZXR1cm4gdiQobil8fEYkKG4pfXJldHVybiEoIXQuc2VtaXx8WEUoZSx0KXx8WUUoZSx0KSl9ZnVuY3Rpb24gdyQoZSx0LG4pe2xldCByPVtuKCJleHByZXNzaW9uIildO2lmKE9kKGUsdCkpe2lmKFpFKGUsdCkpe2xldHtub2RlOnN9PWUsaT1jZSgwLGVuKHMsei5MZWFkaW5nKSwtMSksbz0kZChlLHQse2ZpbHRlcjphPT5hPT09aX0pO3JldHVybiBGdChlLFsiOyIsbywuLi5yXSx0LHtmaWx0ZXI6YT0+YSE9PWl9KX1yLnVuc2hpZnQoIjsiKX1lbHNlIEEkKGUsdCkmJnIucHVzaCgiOyIpO3JldHVybiByfWZ1bmN0aW9uIEMkKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9Tm8oZSx0LG4pLGk9ZXQoZSx0KSxvPWk/W2ksUF06IiI7cmV0dXJuIXIuaW5pdCYmIXIudGVzdCYmIXIudXBkYXRlP1tvLF8oWyJmb3IgKDs7KSIsc10pXTpbbyxfKFsiZm9yICgiLF8oW08oW1AsbigiaW5pdCIpLCI7IixILG4oInRlc3QiKSwiOyIsci51cGRhdGU/W0gsbigidXBkYXRlIildOiIiXSksUF0pLCIpIixzXSldfWZ1bmN0aW9uIFMkKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9ci50eXBlPT09IkZvck9mU3RhdGVtZW50IjtyZXR1cm4gXyhbImZvciIscyYmci5hd2FpdD8iIGF3YWl0IjoiIiwiICgiLG4oImxlZnQiKSwiICIscz8ib2YiOiJpbiIsIiAiLG4oInJpZ2h0IiksIikiLE5vKGUsdCxuKV0pfWZ1bmN0aW9uIHgkKGUsdCxuKXtpZih0Ll9faXNWdWVCaW5kaW5nc3x8dC5fX2lzVnVlRm9yQmluZGluZ0xlZnQpe2xldCByPWUubWFwKG4sInByb2dyYW0iLCJib2R5IiwwLCJwYXJhbXMiKTtpZihyLmxlbmd0aD09PTEpcmV0dXJuIHJbMF07bGV0IHM9ZmUoWyIsIixIXSxyKTtyZXR1cm4gdC5fX2lzVnVlRm9yQmluZGluZ0xlZnQ/WyIoIixPKFtQLF8ocyldKSxQLCIpIl06c31pZih0Ll9faXNFbWJlZGRlZFR5cGVzY3JpcHRHZW5lcmljUGFyYW1ldGVycyl7bGV0IHI9ZS5tYXAobiwicHJvZ3JhbSIsImJvZHkiLDAsInR5cGVQYXJhbWV0ZXJzIiwicGFyYW1zIik7cmV0dXJuIGZlKFsiLCIsSF0scil9fXZhciBrJD0oZSx7b3JpZ2luYWxUZXh0OnR9KT0+eEUodCxlZShlKSk7ZnVuY3Rpb24gUXYoZSl7cmV0dXJuIGdzKGNlKDAsZW4oZSx6LkRhbmdsaW5nKSwtMSkpfWZ1bmN0aW9uIFQkKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9XyhbImlmICgiLEJkKGUsdCxuKSwiKSIseSQoZSx0LG4pXSk7aWYoIXIuYWx0ZXJuYXRlKXJldHVybiBzO2xldHtjb25zZXF1ZW50Oml9PXIsbz1pLnR5cGU9PT0iQmxvY2tTdGF0ZW1lbnQiLGE9W3NdLHU9bztvfHwoYS5wdXNoKFIpLHU9ITEpO2xldCBsPWVuKHIsei5EYW5nbGluZyk7aWYobC5sZW5ndGg+MCl7bGV0W2ZdPWw7ayQoZix0KT9hLnB1c2gobz9bUixSXTpSKTppdCh0Lm9yaWdpbmFsVGV4dCxlZShmKSx7YmFja3dhcmRzOiEwfSk/YS5wdXNoKG8/UjoiIik6YS5wdXNoKCIgIiksYS5wdXNoKGV0KGUsdCksUXYocil8fGl0KHQub3JpZ2luYWxUZXh0LFgoY2UoMCxsLC0xKSkpP1I6IiAiKSx1PSExfXJldHVybiBhLnB1c2godT8iICI6IiIsImVsc2UiLF8oRCQoZSx0LG4pKSksYX1mdW5jdGlvbiBOJChlLHQpe2xldHtub2RlOm59PWU7c3dpdGNoKG4udHlwZSl7Y2FzZSJSZWdFeHBMaXRlcmFsIjpyZXR1cm4gWnYobik7Y2FzZSJCaWdJbnRMaXRlcmFsIjpyZXR1cm4gUWQobi5leHRyYS5yYXcpO2Nhc2UiTnVtZXJpY0xpdGVyYWwiOnJldHVybiBaYShuLmV4dHJhLnJhdyk7Y2FzZSJTdHJpbmdMaXRlcmFsIjpyZXR1cm4gYWkoY2kobi5leHRyYS5yYXcsdCkpO2Nhc2UiTnVsbExpdGVyYWwiOnJldHVybiJudWxsIjtjYXNlIkJvb2xlYW5MaXRlcmFsIjpyZXR1cm4gU3RyaW5nKG4udmFsdWUpO2Nhc2UiRGlyZWN0aXZlTGl0ZXJhbCI6cmV0dXJuIGVGKG4uZXh0cmEucmF3LHQpO2Nhc2UiTGl0ZXJhbCI6e2lmKG4ucmVnZXgpcmV0dXJuIFp2KG4ucmVnZXgpO2lmKG4uYmlnaW50KXJldHVybiBRZChuLnJhdyk7bGV0e3ZhbHVlOnJ9PW47cmV0dXJuIHR5cGVvZiByPT0ibnVtYmVyIj9aYShuLnJhdyk6dHlwZW9mIHI9PSJzdHJpbmciP0wkKGUpP2VGKG4ucmF3LHQpOmFpKGNpKG4ucmF3LHQpKTpTdHJpbmcocil9fX1mdW5jdGlvbiBMJChlKXtpZihlLmtleSE9PSJleHByZXNzaW9uIilyZXR1cm47bGV0e3BhcmVudDp0fT1lO3JldHVybiB0LnR5cGU9PT0iRXhwcmVzc2lvblN0YXRlbWVudCImJnR5cGVvZiB0LmRpcmVjdGl2ZT09InN0cmluZyJ9ZnVuY3Rpb24gUWQoZSl7cmV0dXJuIGUudG9Mb3dlckNhc2UoKX1mdW5jdGlvbiBadih7cGF0dGVybjplLGZsYWdzOnR9KXtyZXR1cm4gdD1bLi4udF0uc29ydCgpLmpvaW4oIiIpLGAvJHtlfS8ke3R9YH12YXIgJCQ9InVzZSBzdHJpY3QiO2Z1bmN0aW9uIGVGKGUsdCl7bGV0IG49ZS5zbGljZSgxLC0xKTtpZihuPT09JCR8fCEobi5pbmNsdWRlcygnIicpfHxuLmluY2x1ZGVzKCInIikpKXtsZXQgcj10LnNpbmdsZVF1b3RlPyInIjonIic7cmV0dXJuIHIrbityfXJldHVybiBlfXZhciB0Rj1LKFsiSW1wb3J0RGVjbGFyYXRpb24iLCJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24iLCJFeHBvcnROYW1lZERlY2xhcmF0aW9uIiwiRXhwb3J0QWxsRGVjbGFyYXRpb24iLCJEZWNsYXJlRXhwb3J0RGVjbGFyYXRpb24iLCJEZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb24iXSksQiQ9SyhbIkVudW1Cb2R5IiwiRW51bUJvb2xlYW5Cb2R5IiwiRW51bU51bWJlckJvZHkiLCJFbnVtQmlnSW50Qm9keSIsIkVudW1TdHJpbmdCb2R5IiwiRW51bVN5bWJvbEJvZHkiXSk7ZnVuY3Rpb24gTG8oZSx0LG4pe3ZhciBnO2xldHtub2RlOnIscGFyZW50OnN9PWUsaT1CJChyKSxvPXIudHlwZT09PSJUU0VudW1Cb2R5Inx8aSxhPXRGKHIpLHU9aSYmci5oYXNVbmtub3duTWVtYmVycyxsPW8/Im1lbWJlcnMiOmE/ImF0dHJpYnV0ZXMiOiJwcm9wZXJ0aWVzIixmPXJbbF0sYz1vfHxyLnR5cGU9PT0iT2JqZWN0UGF0dGVybiImJnMudHlwZSE9PSJGdW5jdGlvbkRlY2xhcmF0aW9uIiYmcy50eXBlIT09IkZ1bmN0aW9uRXhwcmVzc2lvbiImJnMudHlwZSE9PSJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiImJnMudHlwZSE9PSJPYmplY3RNZXRob2QiJiZzLnR5cGUhPT0iQ2xhc3NNZXRob2QiJiZzLnR5cGUhPT0iQ2xhc3NQcml2YXRlTWV0aG9kIiYmcy50eXBlIT09IkFzc2lnbm1lbnRQYXR0ZXJuIiYmcy50eXBlIT09IkNhdGNoQ2xhdXNlIiYmci5wcm9wZXJ0aWVzLnNvbWUoRD0+RC52YWx1ZSYmKEQudmFsdWUudHlwZT09PSJPYmplY3RQYXR0ZXJuInx8RC52YWx1ZS50eXBlPT09IkFycmF5UGF0dGVybiIpKXx8ci50eXBlIT09Ik9iamVjdFBhdHRlcm4iJiZ0Lm9iamVjdFdyYXA9PT0icHJlc2VydmUiJiZmLmxlbmd0aD4wJiZfJChyLGZbMF0sdCkscD1bXSxoPWUubWFwKCh7bm9kZTpEfSk9PntsZXQgYj1bLi4ucCxuKCldO3JldHVybiBwPVsiLCIsSF0sbHIoRCx0KSYmcC5wdXNoKFIpLGJ9LGwpO2lmKHUpe2xldCBEO2lmKHEocix6LkRhbmdsaW5nKSl7bGV0IGI9cShyLHouTGluZSk7RD1bZXQoZSx0KSxifHxpdCh0Lm9yaWdpbmFsVGV4dCxYKGNlKDAsZW4ociksLTEpKSk/UjpILCIuLi4iXX1lbHNlIEQ9WyIuLi4iXTtoLnB1c2goWy4uLnAsLi4uRF0pfWxldCBkPSEodXx8KChnPWNlKDAsZiwtMSkpPT1udWxsP3ZvaWQgMDpnLnR5cGUpPT09IlJlc3RFbGVtZW50IiksbTtpZihoLmxlbmd0aD09PTApbT1fKFsieyIsQWMoZSx0KSwifSIsTnQoZSksZHQoZSxuKV0pO2Vsc2V7bGV0IEQ9dC5icmFja2V0U3BhY2luZz9IOlA7bT1bInsiLE8oW0QsLi4uaF0pLGQ/RnModCk6IiIsRCwifSIsTnQoZSksZHQoZSxuKV19cmV0dXJuIGUubWF0Y2goRD0+RC50eXBlPT09Ik9iamVjdFBhdHRlcm4iJiYhU2UoRC5kZWNvcmF0b3JzKSxRYSl8fG1zKHIpJiYoZS5tYXRjaCh2b2lkIDAsKEQsYik9PmI9PT0idHlwZUFubm90YXRpb24iLChELGIpPT5iPT09InR5cGVBbm5vdGF0aW9uIixRYSl8fGUubWF0Y2godm9pZCAwLChELGIpPT5ELnR5cGU9PT0iRnVuY3Rpb25UeXBlUGFyYW0iJiZiPT09InR5cGVBbm5vdGF0aW9uIixRYSkpfHwhYyYmZS5tYXRjaChEPT5ELnR5cGU9PT0iT2JqZWN0UGF0dGVybiIsRD0+RC50eXBlPT09IkFzc2lnbm1lbnRFeHByZXNzaW9uInx8RC50eXBlPT09IlZhcmlhYmxlRGVjbGFyYXRvciIpP206XyhtLHtzaG91bGRCcmVhazpjfSl9ZnVuY3Rpb24gXyQoZSx0LG4pe2xldCByPW4ub3JpZ2luYWxUZXh0LHM9ZWUodCksaT1lZShlKTtyZXR1cm4gdEYoZSkmJihpPUFuKG4pLmxhc3RJbmRleE9mKCJ7IixzKSkscXQocixpLHMpfWZ1bmN0aW9uIEkkKGUsdCxuKXtsZXR7bm9kZTpyfT1lO3JldHVyblsiaW1wb3J0IixyLnBoYXNlP2AgJHtyLnBoYXNlfWA6IiIsc0Yociksb0YoZSx0LG4pLGlGKGUsdCxuKSx1RihlLHQsbikscWUodCldfXZhciBuRj1lPT5lLnR5cGU9PT0iRXhwb3J0RGVmYXVsdERlY2xhcmF0aW9uInx8ZS50eXBlPT09IkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvbiImJmUuZGVmYXVsdDtmdW5jdGlvbiByRihlLHQsbil7bGV0e25vZGU6cn09ZSxzPVtkTChlLHQsbikscm4oZSksImV4cG9ydCIsbkYocik/IiBkZWZhdWx0IjoiIl0se2RlY2xhcmF0aW9uOmksZXhwb3J0ZWQ6b309cjtyZXR1cm4gcShyLHouRGFuZ2xpbmcpJiYocy5wdXNoKCIgIixldChlLHQpKSxRdihyKSYmcy5wdXNoKFIpKSxpP3MucHVzaCgiICIsbigiZGVjbGFyYXRpb24iKSk6KHMucHVzaChPJChyKSksci50eXBlPT09IkV4cG9ydEFsbERlY2xhcmF0aW9uInx8ci50eXBlPT09IkRlY2xhcmVFeHBvcnRBbGxEZWNsYXJhdGlvbiI/KHMucHVzaCgiICoiKSxvJiZzLnB1c2goIiBhcyAiLG4oImV4cG9ydGVkIikpKTpzLnB1c2gob0YoZSx0LG4pKSxzLnB1c2goaUYoZSx0LG4pLHVGKGUsdCxuKSkpLHMucHVzaChNJChyLHQpKSxzfXZhciBQJD1LKFsiQ2xhc3NEZWNsYXJhdGlvbiIsIkNvbXBvbmVudERlY2xhcmF0aW9uIiwiRnVuY3Rpb25EZWNsYXJhdGlvbiIsIlRTSW50ZXJmYWNlRGVjbGFyYXRpb24iLCJEZWNsYXJlQ2xhc3MiLCJEZWNsYXJlQ29tcG9uZW50IiwiRGVjbGFyZUZ1bmN0aW9uIiwiRGVjbGFyZUhvb2siLCJIb29rRGVjbGFyYXRpb24iLCJUU0RlY2xhcmVGdW5jdGlvbiIsIkVudW1EZWNsYXJhdGlvbiJdKTtmdW5jdGlvbiBNJChlLHQpe3JldHVybiFlLmRlY2xhcmF0aW9ufHxuRihlKSYmIVAkKGUuZGVjbGFyYXRpb24pP3FlKHQpOiIifWZ1bmN0aW9uIFpkKGUsdD0hMCl7cmV0dXJuIGUmJmUhPT0idmFsdWUiP2Ake3Q/IiAiOiIifSR7ZX0ke3Q/IiI6IiAifWA6IiJ9ZnVuY3Rpb24gc0YoZSx0KXtyZXR1cm4gWmQoZS5pbXBvcnRLaW5kLHQpfWZ1bmN0aW9uIE8kKGUpe3JldHVybiBaZChlLmV4cG9ydEtpbmQpfWZ1bmN0aW9uIGlGKGUsdCxuKXtsZXR7bm9kZTpyfT1lO3JldHVybiByLnNvdXJjZT9bYUYocix0KT8iIGZyb20iOiIiLCIgIixuKCJzb3VyY2UiKV06IiJ9ZnVuY3Rpb24gb0YoZSx0LG4pe2xldHtub2RlOnJ9PWU7aWYoIWFGKHIsdCkpcmV0dXJuIiI7bGV0IHM9WyIgIl07aWYoU2Uoci5zcGVjaWZpZXJzKSl7bGV0IGk9W10sbz1bXTtlLmVhY2goKCk9PntsZXQgYT1lLm5vZGUudHlwZTtpZihhPT09IkV4cG9ydE5hbWVzcGFjZVNwZWNpZmllciJ8fGE9PT0iRXhwb3J0RGVmYXVsdFNwZWNpZmllciJ8fGE9PT0iSW1wb3J0TmFtZXNwYWNlU3BlY2lmaWVyInx8YT09PSJJbXBvcnREZWZhdWx0U3BlY2lmaWVyIilpLnB1c2gobigpKTtlbHNlIGlmKGE9PT0iRXhwb3J0U3BlY2lmaWVyInx8YT09PSJJbXBvcnRTcGVjaWZpZXIiKW8ucHVzaChuKCkpO2Vsc2UgdGhyb3cgbmV3IGtvKHIsInNwZWNpZmllciIpfSwic3BlY2lmaWVycyIpLHMucHVzaChmZSgiLCAiLGkpKSxvLmxlbmd0aD4wJiYoaS5sZW5ndGg+MCYmcy5wdXNoKCIsICIpLG8ubGVuZ3RoPjF8fGkubGVuZ3RoPjB8fHIuc3BlY2lmaWVycy5zb21lKGE9PnEoYSkpP3MucHVzaChfKFsieyIsTyhbdC5icmFja2V0U3BhY2luZz9IOlAsZmUoWyIsIixIXSxvKV0pLEZzKHQpLHQuYnJhY2tldFNwYWNpbmc/SDpQLCJ9Il0pKTpzLnB1c2goWyJ7Iix0LmJyYWNrZXRTcGFjaW5nPyIgIjoiIiwuLi5vLHQuYnJhY2tldFNwYWNpbmc/IiAiOiIiLCJ9Il0pKX1lbHNlIHMucHVzaCgie30iKTtyZXR1cm4gc31mdW5jdGlvbiBhRihlLHQpe3JldHVybiBlLnR5cGUhPT0iSW1wb3J0RGVjbGFyYXRpb24ifHxTZShlLnNwZWNpZmllcnMpfHxlLmltcG9ydEtpbmQ9PT0idHlwZSI/ITA6QW4odCkuc2xpY2UoZWUoZSksZWUoZS5zb3VyY2UpKS50cmltRW5kKCkuZW5kc1dpdGgoImZyb20iKX1mdW5jdGlvbiBSJChlLHQpe3ZhciByO2xldCBuPUFuKHQpLnNsaWNlKFgoZS5zb3VyY2UpLChyPWUuYXR0cmlidXRlcykhPW51bGwmJnJbMF0/ZWUoZS5hdHRyaWJ1dGVzWzBdKTpYKGUpKS50cmltU3RhcnQoKTtyZXR1cm4gbi5zdGFydHNXaXRoKCJhc3NlcnQiKT8iYXNzZXJ0IjpuLnN0YXJ0c1dpdGgoIndpdGgiKXx8U2UoZS5hdHRyaWJ1dGVzKT8id2l0aCI6dm9pZCAwfXZhciBqJD1lPT57bGV0e2F0dHJpYnV0ZXM6dH09ZTtpZih0Lmxlbmd0aCE9PTEpcmV0dXJuITE7bGV0W25dPXQse3R5cGU6cixrZXk6cyx2YWx1ZTppfT1uO3JldHVybiByPT09IkltcG9ydEF0dHJpYnV0ZSImJihzLnR5cGU9PT0iSWRlbnRpZmllciImJnMubmFtZT09PSJ0eXBlInx8c3QocykmJnMudmFsdWU9PT0idHlwZSIpJiZzdChpKSYmIXEobikmJiFxKHMpJiYhcShpKX07ZnVuY3Rpb24gdUYoZSx0LG4pe2xldHtub2RlOnJ9PWU7aWYoIXIuc291cmNlKXJldHVybiIiO2xldCBzPVIkKHIsdCk7aWYoIXMpcmV0dXJuIiI7bGV0IGk9TG8oZSx0LG4pO3JldHVybiBqJChyKSYmKGk9bWMoaSkpLFtgICR7c30gYCxpXX1mdW5jdGlvbiBWJChlLHQsbil7bGV0e25vZGU6cn09ZSx7dHlwZTpzfT1yLGk9cy5zdGFydHNXaXRoKCJJbXBvcnQiKSxvPWk/ImltcG9ydGVkIjoibG9jYWwiLGE9aT8ibG9jYWwiOiJleHBvcnRlZCIsdT1yW29dLGw9clthXSxmPSIiLGM9IiI7cmV0dXJuIHM9PT0iRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyInx8cz09PSJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIiP2Y9IioiOnUmJihmPW4obykpLGwmJiFlZChyKSYmKGM9bihhKSksW1pkKHM9PT0iSW1wb3J0U3BlY2lmaWVyIj9yLmltcG9ydEtpbmQ6ci5leHBvcnRLaW5kLCExKSxmLGYmJmM/IiBhcyAiOiIiLGNdfWZ1bmN0aW9uIGVtKGUsdCxuKXtsZXR7bm9kZTpyfT1lO3JldHVybiByLnNob3J0aGFuZD9uKCJ2YWx1ZSIpOnN1KGUsdCxuLEFzKGUsdCxuKSwiOiIsInZhbHVlIil9ZnVuY3Rpb24gdG0oZSx0KXtyZXR1cm5bIi4uLiIsdCgiYXJndW1lbnQiKSxkdChlLHQpXX1mdW5jdGlvbiBVJChlLHQsbil7bGV0e25vZGU6cn09ZSxzPW4oKTtyZXR1cm4gb0Uocix0KT9bIigiLE8oW1Isc10pLFIsIikiXTpTcihyKXx8dC5leHBlcmltZW50YWxUZXJuYXJpZXMmJnIudHlwZT09PSJDb25kaXRpb25hbEV4cHJlc3Npb24iJiYoci5jb25zZXF1ZW50LnR5cGU9PT0iQ29uZGl0aW9uYWxFeHByZXNzaW9uInx8ci5hbHRlcm5hdGUudHlwZT09PSJDb25kaXRpb25hbEV4cHJlc3Npb24iKT9fKFt1ZSgiKCIpLE8oW1Asc10pLFAsdWUoIikiKV0pOnN9ZnVuY3Rpb24gbEYoZSx0LG4pe2xldHtub2RlOnJ9PWU7cmV0dXJuW3IudHlwZT09PSJUaHJvd1N0YXRlbWVudCI/InRocm93IjoicmV0dXJuIixyLmFyZ3VtZW50P1siICIsZS5jYWxsKCgpPT5VJChlLHQsbiksImFyZ3VtZW50IildOiIiLHFlKHQpXX1mdW5jdGlvbiBxJChlLHQpe2xldHtrZXk6bixwYXJlbnQ6cn09ZTtyZXR1cm4hIShuPT09ImFyZ3VtZW50IiYmRW8ocikmJnRuKGUsdCl8fG49PT0iYm9keSImJnIudHlwZT09PSJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiIpfWZ1bmN0aW9uIFckKGUsdCxuKXtsZXR7cGFyZW50OnJ9PWU7aWYoci50eXBlPT09IkV4cHJlc3Npb25TdGF0ZW1lbnQifHxyLnR5cGU9PT0iRm9yU3RhdGVtZW50Iil7bGV0IGk9W107cmV0dXJuIGUuZWFjaCgoe2lzRmlyc3Q6b30pPT57bz9pLnB1c2gobigpKTppLnB1c2goIiwiLE8oW0gsbigpXSkpfSwiZXhwcmVzc2lvbnMiKSxfKGkpfWxldCBzPWZlKFsiLCIsSF0sZS5tYXAobiwiZXhwcmVzc2lvbnMiKSk7cmV0dXJuIHEkKGUsdCk/Xyh1ZShbTyhbUCxzXSksUF0scykpOl8ocyl9ZnVuY3Rpb24gSCQoZSx0LG4pe3JldHVybltfKFsic3dpdGNoICgiLE8oW1AsbigiZGlzY3JpbWluYW50IildKSxQLCIpIl0pLCIgeyIsZS5ub2RlLmNhc2VzLmxlbmd0aD4wP08oW1IsZmUoUixlLm1hcCgoe25vZGU6cixpc0xhc3Q6c30pPT5bbigpLCFzJiZscihyLHQpP1I6IiJdLCJjYXNlcyIpKV0pOmV0KGUsdCx7aW5kZW50OiEwfSksUiwifSJdfWZ1bmN0aW9uIEokKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9W107ci50ZXN0P3MucHVzaCgiY2FzZSAiLG4oInRlc3QiKSwiOiIpOnMucHVzaCgiZGVmYXVsdDoiKSxxKHIsei5EYW5nbGluZykmJnMucHVzaCgiICIsZXQoZSx0KSk7bGV0IGk9ci5jb25zZXF1ZW50LmZpbHRlcihvPT5vLnR5cGUhPT0iRW1wdHlTdGF0ZW1lbnQiKTtpZihpLmxlbmd0aD4wKXtsZXQgbz1HZChlLHQsbiwiY29uc2VxdWVudCIpO3MucHVzaChpLmxlbmd0aD09PTEmJmlbMF0udHlwZT09PSJCbG9ja1N0YXRlbWVudCI/WyIgIixvXTpPKFtSLG9dKSl9cmV0dXJuIHN9ZnVuY3Rpb24gY0YoZSx0KXtsZXQgbj0wO2ZvcihsZXQgciBpbiBlKXtsZXQgcz1lW3JdO2lmKG5FKHMpJiZ0eXBlb2Ygcy50eXBlPT0ic3RyaW5nIiYmKG4rKyxuKz1jRihzLHQtbikpLG4+dClyZXR1cm4gbn1yZXR1cm4gbn1mdW5jdGlvbiBmRihlLHQ9NSl7cmV0dXJuIGNGKGUsdCk8PXR9ZnVuY3Rpb24geiQoZSl7bGV0IHQ9W2VdO2ZvcihsZXQgbj0wO248dC5sZW5ndGg7bisrKXtsZXQgcj10W25dO2ZvcihsZXQgcyBvZlsidGVzdCIsImNvbnNlcXVlbnQiLCJhbHRlcm5hdGUiXSl7bGV0IGk9cltzXTtpZihjdChpKSlyZXR1cm4hMDtpLnR5cGU9PT0iQ29uZGl0aW9uYWxFeHByZXNzaW9uIiYmdC5wdXNoKGkpfX1yZXR1cm4hMX1mdW5jdGlvbiBHJChlLHQsbil7bGV0e25vZGU6cn09ZSxzPXIudHlwZT09PSJDb25kaXRpb25hbEV4cHJlc3Npb24iLGk9cz8iYWx0ZXJuYXRlIjoiZmFsc2VUeXBlIix7cGFyZW50Om99PWUsYT1zP24oInRlc3QiKTpbbigiY2hlY2tUeXBlIiksIiAiLCJleHRlbmRzIiwiICIsbigiZXh0ZW5kc1R5cGUiKV07cmV0dXJuIG8udHlwZT09PXIudHlwZSYmb1tpXT09PXI/bm4oMixhKTphfXZhciBLJD1uZXcgTWFwKFtbIkFzc2lnbm1lbnRFeHByZXNzaW9uIiwicmlnaHQiXSxbIlZhcmlhYmxlRGVjbGFyYXRvciIsImluaXQiXSxbIlJldHVyblN0YXRlbWVudCIsImFyZ3VtZW50Il0sWyJUaHJvd1N0YXRlbWVudCIsImFyZ3VtZW50Il0sWyJVbmFyeUV4cHJlc3Npb24iLCJhcmd1bWVudCJdLFsiWWllbGRFeHByZXNzaW9uIiwiYXJndW1lbnQiXSxbIkF3YWl0RXhwcmVzc2lvbiIsImFyZ3VtZW50Il1dKTtmdW5jdGlvbiBYJChlKXtsZXR7bm9kZTp0fT1lO2lmKHQudHlwZSE9PSJDb25kaXRpb25hbEV4cHJlc3Npb24iKXJldHVybiExO2xldCBuLHI9dDtmb3IobGV0IHM9MDshbjtzKyspe2xldCBpPWUuZ2V0UGFyZW50Tm9kZShzKTtpZihacyhpKSYmaS5leHByZXNzaW9uPT09cnx8dmUoaSkmJmkuY2FsbGVlPT09cnx8eGUoaSkmJmkub2JqZWN0PT09cil7cj1pO2NvbnRpbnVlfWkudHlwZT09PSJOZXdFeHByZXNzaW9uIiYmaS5jYWxsZWU9PT1yfHxxbihpKSYmaS5leHByZXNzaW9uPT09cj8obj1lLmdldFBhcmVudE5vZGUocysxKSxyPWkpOm49aX1yZXR1cm4gcj09PXQ/ITE6bltLJC5nZXQobi50eXBlKV09PT1yfWZ1bmN0aW9uIFkkKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9ci50eXBlPT09IkNvbmRpdGlvbmFsRXhwcmVzc2lvbiIsaT1zPyJjb25zZXF1ZW50IjoidHJ1ZVR5cGUiLG89cz8iYWx0ZXJuYXRlIjoiZmFsc2VUeXBlIixhPXM/WyJ0ZXN0Il06WyJjaGVja1R5cGUiLCJleHRlbmRzVHlwZSJdLHU9cltpXSxsPXJbb10sZj1bXSxjPSExLHtwYXJlbnQ6cH09ZSxoPXAudHlwZT09PXIudHlwZSYmYS5zb21lKHc9PnBbd109PT1yKSxkPXAudHlwZT09PXIudHlwZSYmIWgsbSxnLEQ9MDtkbyBnPW18fHIsbT1lLmdldFBhcmVudE5vZGUoRCksRCsrO3doaWxlKG0mJm0udHlwZT09PXIudHlwZSYmYS5ldmVyeSh3PT5tW3ddIT09ZykpO2xldCBiPW18fHAsRT1nO2lmKHMmJihjdChyW2FbMF1dKXx8Y3QodSl8fGN0KGwpfHx6JChFKSkpe2M9ITAsZD0hMDtsZXQgdz1OPT5bdWUoIigiKSxPKFtQLE5dKSxQLHVlKCIpIildLFQ9Tj0+Ti50eXBlPT09Ik51bGxMaXRlcmFsInx8Ti50eXBlPT09IkxpdGVyYWwiJiZOLnZhbHVlPT09bnVsbHx8Ti50eXBlPT09IklkZW50aWZpZXIiJiZOLm5hbWU9PT0idW5kZWZpbmVkIjtmLnB1c2goIiA/ICIsVCh1KT9uKGkpOncobihpKSksIiA6ICIsbC50eXBlPT09ci50eXBlfHxUKGwpP24obyk6dyhuKG8pKSl9ZWxzZXtsZXQgdz1OPT50LnVzZVRhYnM/TyhuKE4pKTpubigyLG4oTikpLFQ9W0gsIj8gIix1LnR5cGU9PT1yLnR5cGU/dWUoIiIsIigiKToiIix3KGkpLHUudHlwZT09PXIudHlwZT91ZSgiIiwiKSIpOiIiLEgsIjogIix3KG8pXTtmLnB1c2gocC50eXBlIT09ci50eXBlfHxwW29dPT09cnx8aD9UOnQudXNlVGFicz9kRShPKFQpKTpubihNYXRoLm1heCgwLHQudGFiV2lkdGgtMiksVCkpfWxldCBGPXc9PnA9PT1iP18odyk6dyx2PSFjJiYoeGUocCl8fHAudHlwZT09PSJOR1BpcGVFeHByZXNzaW9uIiYmcC5sZWZ0PT09cikmJiFwLmNvbXB1dGVkLEM9WCQoZSksQT1GKFtHJChlLHQsbiksZD9mOk8oZikscyYmdiYmIUM/UDoiIl0pO3JldHVybiBofHxDP18oW08oW1AsQV0pLFBdKTpBfWZ1bmN0aW9uIFEkKGUsdCl7cmV0dXJuKHhlKHQpfHx0LnR5cGU9PT0iTkdQaXBlRXhwcmVzc2lvbiImJnQubGVmdD09PWUpJiYhdC5jb21wdXRlZH1mdW5jdGlvbiBaJChlLHQsbixyKXtyZXR1cm5bLi4uZS5tYXAocz0+ZW4ocykpLGVuKHQpLGVuKG4pXS5mbGF0KCkuc29tZShzPT5IbihzKSYmcXQoci5vcmlnaW5hbFRleHQsZWUocyksWChzKSkpfXZhciBlQj1uZXcgTWFwKFtbIkFzc2lnbm1lbnRFeHByZXNzaW9uIiwicmlnaHQiXSxbIlZhcmlhYmxlRGVjbGFyYXRvciIsImluaXQiXSxbIlJldHVyblN0YXRlbWVudCIsImFyZ3VtZW50Il0sWyJUaHJvd1N0YXRlbWVudCIsImFyZ3VtZW50Il0sWyJVbmFyeUV4cHJlc3Npb24iLCJhcmd1bWVudCJdLFsiWWllbGRFeHByZXNzaW9uIiwiYXJndW1lbnQiXSxbIkF3YWl0RXhwcmVzc2lvbiIsImFyZ3VtZW50Il1dKTtmdW5jdGlvbiB0QihlKXtsZXR7bm9kZTp0fT1lO2lmKHQudHlwZSE9PSJDb25kaXRpb25hbEV4cHJlc3Npb24iKXJldHVybiExO2xldCBuLHI9dDtmb3IobGV0IHM9MDshbjtzKyspe2xldCBpPWUuZ2V0UGFyZW50Tm9kZShzKTtpZihacyhpKSYmaS5leHByZXNzaW9uPT09cnx8dmUoaSkmJmkuY2FsbGVlPT09cnx8eGUoaSkmJmkub2JqZWN0PT09cil7cj1pO2NvbnRpbnVlfWkudHlwZT09PSJOZXdFeHByZXNzaW9uIiYmaS5jYWxsZWU9PT1yfHxxbihpKSYmaS5leHByZXNzaW9uPT09cj8obj1lLmdldFBhcmVudE5vZGUocysxKSxyPWkpOm49aX1yZXR1cm4gcj09PXQ/ITE6bltlQi5nZXQobi50eXBlKV09PT1yfXZhciBubT1lPT5bdWUoIigiKSxPKFtQLGVdKSxQLHVlKCIpIildO2Z1bmN0aW9uIHJtKGUsdCxuLHIpe2lmKCF0LmV4cGVyaW1lbnRhbFRlcm5hcmllcylyZXR1cm4gWSQoZSx0LG4pO2xldHtub2RlOnN9PWUsaT1zLnR5cGU9PT0iQ29uZGl0aW9uYWxFeHByZXNzaW9uIixvPWRzKHMpLGE9aT8iY29uc2VxdWVudCI6InRydWVUeXBlIix1PWk/ImFsdGVybmF0ZSI6ImZhbHNlVHlwZSIsbD1pP1sidGVzdCJdOlsiY2hlY2tUeXBlIiwiZXh0ZW5kc1R5cGUiXSxmPXNbYV0sYz1zW3VdLHA9bC5tYXAoJG49PnNbJG5dKSx7cGFyZW50Omh9PWUsZD1oLnR5cGU9PT1zLnR5cGUsbT1kJiZsLnNvbWUoJG49PmhbJG5dPT09cyksZz1kJiZoW3VdPT09cyxEPWYudHlwZT09PXMudHlwZSxiPWMudHlwZT09PXMudHlwZSxFPWJ8fGcsRj10LnRhYldpZHRoPjJ8fHQudXNlVGFicyx2LEMsQT0wO2RvIEM9dnx8cyx2PWUuZ2V0UGFyZW50Tm9kZShBKSxBKys7d2hpbGUodiYmdi50eXBlPT09cy50eXBlJiZsLmV2ZXJ5KCRuPT52WyRuXSE9PUMpKTtsZXQgdz12fHxoLFQ9ciYmci5hc3NpZ25tZW50TGF5b3V0JiZyLmFzc2lnbm1lbnRMYXlvdXQhPT0iYnJlYWstYWZ0ZXItb3BlcmF0b3IiJiYoaC50eXBlPT09IkFzc2lnbm1lbnRFeHByZXNzaW9uInx8aC50eXBlPT09IlZhcmlhYmxlRGVjbGFyYXRvciJ8fGgudHlwZT09PSJDbGFzc1Byb3BlcnR5Inx8aC50eXBlPT09IlByb3BlcnR5RGVmaW5pdGlvbiJ8fGgudHlwZT09PSJDbGFzc1ByaXZhdGVQcm9wZXJ0eSJ8fGgudHlwZT09PSJPYmplY3RQcm9wZXJ0eSJ8fGgudHlwZT09PSJQcm9wZXJ0eSIpLE49RW8oaCkmJiEoRHx8YikseD1pJiZ3LnR5cGU9PT0iSlNYRXhwcmVzc2lvbkNvbnRhaW5lciImJmUuZ3JhbmRwYXJlbnQudHlwZSE9PSJKU1hBdHRyaWJ1dGUiLEw9dEIoZSksUz1RJChzLGgpLGs9byYmdG4oZSx0KSxJPUY/dC51c2VUYWJzPyIJIjoiICIucmVwZWF0KHQudGFiV2lkdGgtMSk6IiIsTT1aJChwLGYsYyx0KXx8RHx8YixqPSFFJiYhZCYmIW8mJih4P2YudHlwZT09PSJOdWxsTGl0ZXJhbCJ8fGYudHlwZT09PSJMaXRlcmFsIiYmZi52YWx1ZT09PW51bGw6SmQoZix0KSYmZkYocy50ZXN0LDMpKSxVPUV8fGd8fG8mJiFkfHxkJiZpJiZmRihzLnRlc3QsMSl8fGosVj1bXTtxKHMudGVzdCx6LkRhbmdsaW5nKSYmZS5jYWxsKCgpPT57Vi5wdXNoKGV0KGUsdCkpfSwidGVzdCIpLHEocyx6LkRhbmdsaW5nKSYmVi5wdXNoKGV0KGUsdCkpO2xldCBuZT1TeW1ib2woInRlc3QiKSxOZT1TeW1ib2woImNvbnNlcXVlbnQiKSxXPVN5bWJvbCgidGVzdC1hbmQtY29uc2VxdWVudCIpLHRlPWk/W25tKG4oInRlc3QiKSkscy50ZXN0LnR5cGU9PT0iQ29uZGl0aW9uYWxFeHByZXNzaW9uIj9McjoiIl06W24oImNoZWNrVHlwZSIpLCIgIiwiZXh0ZW5kcyIsIiAiLGRzKHMuZXh0ZW5kc1R5cGUpfHxzLmV4dGVuZHNUeXBlLnR5cGU9PT0iVFNNYXBwZWRUeXBlIj9uKCJleHRlbmRzVHlwZSIpOl8obm0obigiZXh0ZW5kc1R5cGUiKSkpXSxwZT1fKFt0ZSwiID8iXSx7aWQ6bmV9KSxfdD1uKGEpLFBlPU8oW0R8fHgmJihjdChmKXx8ZHx8RSk/UjpILF90XSkseXQ9VT9fKFtwZSxFP1BlOnVlKFBlLF8oUGUse2lkOk5lfSkse2dyb3VwSWQ6bmV9KV0se2lkOld9KTpbcGUsUGVdLER0PW4odSksRmU9aj91ZShEdCxkRShubShEdCkpLHtncm91cElkOld9KTpEdCxMbj1beXQsVi5sZW5ndGg+MD9bTyhbUixWXSksUl06Yj9SOmo/dWUoSCwiICIse2dyb3VwSWQ6V30pOkgsIjoiLGJ8fCFGPyIgIjpVP3VlKEksdWUoRXx8aj8iICI6SSwiICIpLHtncm91cElkOld9KTp1ZShJLCIgIiksYj9GZTpfKFtPKEZlKSx4JiYhaj9QOiIiXSksUyYmIUw/UDoiIixNP0xyOiIiXTtyZXR1cm4gVCYmIU0/XyhPKFtQLF8oTG4pXSkpOlR8fE4/XyhPKExuKSk6THx8byYmbT9fKFtPKFtQLExuXSksaz9QOiIiXSk6aD09PXc/XyhMbik6TG59ZnVuY3Rpb24gbkIoZSx0LG4pe2xldHtub2RlOnJ9PWU7cmV0dXJuWyJ0cnkgIixuKCJibG9jayIpLHIuaGFuZGxlcj9bIiAiLG4oImhhbmRsZXIiKV06IiIsci5maW5hbGl6ZXI/WyIgZmluYWxseSAiLG4oImZpbmFsaXplciIpXToiIl19ZnVuY3Rpb24gckIoZSx0LG4pe2xldHtub2RlOnJ9PWU7aWYoci5wYXJhbSl7bGV0IHM9cShyLnBhcmFtLG89PiFIbihvKXx8by5sZWFkaW5nJiZpdCh0Lm9yaWdpbmFsVGV4dCxYKG8pKXx8by50cmFpbGluZyYmaXQodC5vcmlnaW5hbFRleHQsZWUobykse2JhY2t3YXJkczohMH0pKSxpPW4oInBhcmFtIik7cmV0dXJuWyJjYXRjaCAiLHM/WyIoIixPKFtQLGldKSxQLCIpICJdOlsiKCIsaSwiKSAiXSxuKCJib2R5IildfXJldHVyblsiY2F0Y2ggIixuKCJib2R5IildfWZ1bmN0aW9uIHBGKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9ZS5tYXAobiwiZGVjbGFyYXRpb25zIiksaT1lLmtleT09PSJpbml0IiYmZS5wYXJlbnQudHlwZT09PSJGb3JTdGF0ZW1lbnQifHxlLmtleT09PSJsZWZ0IiYmKGUucGFyZW50LnR5cGU9PT0iRm9ySW5TdGF0ZW1lbnQifHxlLnBhcmVudC50eXBlPT09IkZvck9mU3RhdGVtZW50Iiksbz1yLmRlY2xhcmF0aW9ucy5zb21lKHU9PnUuaW5pdCksYTtyZXR1cm4gcy5sZW5ndGg9PT0xJiYhcShyLmRlY2xhcmF0aW9uc1swXSk/YT1zWzBdOmE9TyhzWzBdKSxfKFtybihlKSxyLmtpbmQsYT9bIiAiLGFdOiIiLE8ocy5zbGljZSgxKS5tYXAodT0+WyIsIixvJiYhaT9SOkgsdV0pKSxpPyIiOnFlKHQpXSl9ZnVuY3Rpb24gc0IoZSx0LG4pe2xldHtub2RlOnJ9PWUscz1yLnR5cGU9PT0iV2l0aFN0YXRlbWVudCI/IndpdGgiOiJ3aGlsZSI7cmV0dXJuIF8oW3MsIiAoIixCZChlLHQsbiksIikiLE5vKGUsdCxuKV0pfWZ1bmN0aW9uIGlCKGUsdCxuLHIpe2xldHtub2RlOnN9PWU7aWYoWmgocykpcmV0dXJuIE4kKGUsdCk7c3dpdGNoKHMudHlwZSl7Y2FzZSJKc0V4cHJlc3Npb25Sb290IjpyZXR1cm4gbigibm9kZSIpO2Nhc2UiSnNvblJvb3QiOnJldHVybltldChlLHQpLG4oIm5vZGUiKSxSXTtjYXNlIkZpbGUiOnJldHVybiB4JChlLHQsbik/P24oInByb2dyYW0iKTtjYXNlIkV4cHJlc3Npb25TdGF0ZW1lbnQiOnJldHVybiB3JChlLHQsbik7Y2FzZSJDaGFpbkV4cHJlc3Npb24iOnJldHVybiBuKCJleHByZXNzaW9uIik7Y2FzZSJQYXJlbnRoZXNpemVkRXhwcmVzc2lvbiI6cmV0dXJuIXEocy5leHByZXNzaW9uKSYmKFduKHMuZXhwcmVzc2lvbil8fGh0KHMuZXhwcmVzc2lvbikpP1siKCIsbigiZXhwcmVzc2lvbiIpLCIpIl06XyhbIigiLE8oW1AsbigiZXhwcmVzc2lvbiIpXSksUCwiKSJdKTtjYXNlIkFzc2lnbm1lbnRFeHByZXNzaW9uIjpyZXR1cm4gVUwoZSx0LG4pO2Nhc2UiVmFyaWFibGVEZWNsYXJhdG9yIjpyZXR1cm4gcUwoZSx0LG4pO2Nhc2UiQmluYXJ5RXhwcmVzc2lvbiI6Y2FzZSJMb2dpY2FsRXhwcmVzc2lvbiI6cmV0dXJuIHl2KGUsdCxuKTtjYXNlIkFzc2lnbm1lbnRQYXR0ZXJuIjpyZXR1cm5bbigibGVmdCIpLCIgPSAiLG4oInJpZ2h0IildO2Nhc2UiT3B0aW9uYWxNZW1iZXJFeHByZXNzaW9uIjpjYXNlIk1lbWJlckV4cHJlc3Npb24iOnJldHVybiBQTChlLHQsbik7Y2FzZSJNZXRhUHJvcGVydHkiOnJldHVybltuKCJtZXRhIiksIi4iLG4oInByb3BlcnR5IildO2Nhc2UiQmluZEV4cHJlc3Npb24iOnJldHVybiBCTChlLHQsbik7Y2FzZSJJZGVudGlmaWVyIjpyZXR1cm5bcy5uYW1lLE50KGUpLExFKGUpLGR0KGUsbildO2Nhc2UiVjhJbnRyaW5zaWNJZGVudGlmaWVyIjpyZXR1cm5bIiUiLHMubmFtZV07Y2FzZSJTcHJlYWRFbGVtZW50IjpyZXR1cm4gdG0oZSxuKTtjYXNlIlJlc3RFbGVtZW50IjpyZXR1cm4gdG0oZSxuKTtjYXNlIkZ1bmN0aW9uRGVjbGFyYXRpb24iOmNhc2UiRnVuY3Rpb25FeHByZXNzaW9uIjpyZXR1cm4gX2QoZSx0LG4scik7Y2FzZSJBcnJvd0Z1bmN0aW9uRXhwcmVzc2lvbiI6cmV0dXJuIGJMKGUsdCxuLHIpO2Nhc2UiWWllbGRFeHByZXNzaW9uIjpyZXR1cm5bYHlpZWxkJHtzLmRlbGVnYXRlPyIqIjoiIn1gLHMuYXJndW1lbnQ/WyIgIixuKCJhcmd1bWVudCIpXToiIl07Y2FzZSJBd2FpdEV4cHJlc3Npb24iOnJldHVybiBaTChlLHQsbik7Y2FzZSJFeHBvcnREZWZhdWx0RGVjbGFyYXRpb24iOmNhc2UiRXhwb3J0TmFtZWREZWNsYXJhdGlvbiI6Y2FzZSJFeHBvcnRBbGxEZWNsYXJhdGlvbiI6cmV0dXJuIHJGKGUsdCxuKTtjYXNlIkltcG9ydERlY2xhcmF0aW9uIjpyZXR1cm4gSSQoZSx0LG4pO2Nhc2UiSW1wb3J0U3BlY2lmaWVyIjpjYXNlIkV4cG9ydFNwZWNpZmllciI6Y2FzZSJJbXBvcnROYW1lc3BhY2VTcGVjaWZpZXIiOmNhc2UiRXhwb3J0TmFtZXNwYWNlU3BlY2lmaWVyIjpjYXNlIkltcG9ydERlZmF1bHRTcGVjaWZpZXIiOmNhc2UiRXhwb3J0RGVmYXVsdFNwZWNpZmllciI6cmV0dXJuIFYkKGUsdCxuKTtjYXNlIkltcG9ydEF0dHJpYnV0ZSI6cmV0dXJuIGVtKGUsdCxuKTtjYXNlIlByb2dyYW0iOmNhc2UiQmxvY2tTdGF0ZW1lbnQiOmNhc2UiU3RhdGljQmxvY2siOnJldHVybiBWdihlLHQsbik7Y2FzZSJDbGFzc0JvZHkiOnJldHVybiBLZChlLHQsbik7Y2FzZSJUaHJvd1N0YXRlbWVudCI6cmV0dXJuIGxGKGUsdCxuKTtjYXNlIlJldHVyblN0YXRlbWVudCI6cmV0dXJuIGxGKGUsdCxuKTtjYXNlIk5ld0V4cHJlc3Npb24iOmNhc2UiSW1wb3J0RXhwcmVzc2lvbiI6Y2FzZSJPcHRpb25hbENhbGxFeHByZXNzaW9uIjpjYXNlIkNhbGxFeHByZXNzaW9uIjpyZXR1cm4gVGMoZSx0LG4pO2Nhc2UiT2JqZWN0RXhwcmVzc2lvbiI6Y2FzZSJPYmplY3RQYXR0ZXJuIjpyZXR1cm4gTG8oZSx0LG4pO2Nhc2UiUHJvcGVydHkiOnJldHVybiBibyhzKT9JZChlLHQsbik6ZW0oZSx0LG4pO2Nhc2UiT2JqZWN0UHJvcGVydHkiOnJldHVybiBlbShlLHQsbik7Y2FzZSJPYmplY3RNZXRob2QiOnJldHVybiBJZChlLHQsbik7Y2FzZSJEZWNvcmF0b3IiOnJldHVyblsiQCIsbigiZXhwcmVzc2lvbiIpXTtjYXNlIkFycmF5RXhwcmVzc2lvbiI6Y2FzZSJBcnJheVBhdHRlcm4iOnJldHVybiBIZChlLHQsbik7Y2FzZSJTZXF1ZW5jZUV4cHJlc3Npb24iOnJldHVybiBXJChlLHQsbik7Y2FzZSJUaGlzRXhwcmVzc2lvbiI6cmV0dXJuInRoaXMiO2Nhc2UiU3VwZXIiOnJldHVybiJzdXBlciI7Y2FzZSJEaXJlY3RpdmUiOnJldHVybltuKCJ2YWx1ZSIpLHFlKHQpXTtjYXNlIlVuYXJ5RXhwcmVzc2lvbiI6e2xldCBpPVtzLm9wZXJhdG9yXTsvW2Etel0kLy50ZXN0KHMub3BlcmF0b3IpJiZpLnB1c2goIiAiKTtsZXQgbz1uKCJhcmd1bWVudCIpO3JldHVybiBxKHMuYXJndW1lbnQpP2kucHVzaChfKFsiKCIsTyhbUCxvXSksUCwiKSJdKSk6aS5wdXNoKG8pLGl9Y2FzZSJVcGRhdGVFeHByZXNzaW9uIjpyZXR1cm5bcy5wcmVmaXg/cy5vcGVyYXRvcjoiIixuKCJhcmd1bWVudCIpLHMucHJlZml4PyIiOnMub3BlcmF0b3JdO2Nhc2UiQ29uZGl0aW9uYWxFeHByZXNzaW9uIjpyZXR1cm4gcm0oZSx0LG4scik7Y2FzZSJWYXJpYWJsZURlY2xhcmF0aW9uIjpyZXR1cm4gcEYoZSx0LG4pO2Nhc2UiSWZTdGF0ZW1lbnQiOnJldHVybiBUJChlLHQsbik7Y2FzZSJGb3JTdGF0ZW1lbnQiOnJldHVybiBDJChlLHQsbik7Y2FzZSJXaXRoU3RhdGVtZW50IjpjYXNlIldoaWxlU3RhdGVtZW50IjpyZXR1cm4gc0IoZSx0LG4pO2Nhc2UiRG9XaGlsZVN0YXRlbWVudCI6cmV0dXJuIGIkKGUsdCxuKTtjYXNlIkZvckluU3RhdGVtZW50IjpjYXNlIkZvck9mU3RhdGVtZW50IjpyZXR1cm4gUyQoZSx0LG4pO2Nhc2UiRG9FeHByZXNzaW9uIjpyZXR1cm5bcy5hc3luYz8iYXN5bmMgIjoiIiwiZG8gIixuKCJib2R5IildO2Nhc2UiQnJlYWtTdGF0ZW1lbnQiOmNhc2UiQ29udGludWVTdGF0ZW1lbnQiOnJldHVybltzLnR5cGU9PT0iQnJlYWtTdGF0ZW1lbnQiPyJicmVhayI6ImNvbnRpbnVlIixzLmxhYmVsP1siICIsbigibGFiZWwiKV06IiIscWUodCldO2Nhc2UiTGFiZWxlZFN0YXRlbWVudCI6cmV0dXJuW24oImxhYmVsIiksYDoke3MuYm9keS50eXBlPT09IkVtcHR5U3RhdGVtZW50IiYmIXEocy5ib2R5LHouTGVhZGluZyk/IiI6IiAifWAsbigiYm9keSIpXTtjYXNlIlRyeVN0YXRlbWVudCI6cmV0dXJuIG5CKGUsdCxuKTtjYXNlIkNhdGNoQ2xhdXNlIjpyZXR1cm4gckIoZSx0LG4pO2Nhc2UiU3dpdGNoU3RhdGVtZW50IjpyZXR1cm4gSCQoZSx0LG4pO2Nhc2UiU3dpdGNoQ2FzZSI6cmV0dXJuIEokKGUsdCxuKTtjYXNlIkRlYnVnZ2VyU3RhdGVtZW50IjpyZXR1cm5bImRlYnVnZ2VyIixxZSh0KV07Y2FzZSJDbGFzc0RlY2xhcmF0aW9uIjpjYXNlIkNsYXNzRXhwcmVzc2lvbiI6cmV0dXJuIFhkKGUsdCxuKTtjYXNlIkNsYXNzTWV0aG9kIjpjYXNlIkNsYXNzUHJpdmF0ZU1ldGhvZCI6Y2FzZSJNZXRob2REZWZpbml0aW9uIjpyZXR1cm4gS3YoZSx0LG4pO2Nhc2UiQ2xhc3NQcm9wZXJ0eSI6Y2FzZSJQcm9wZXJ0eURlZmluaXRpb24iOmNhc2UiQ2xhc3NQcml2YXRlUHJvcGVydHkiOmNhc2UiQ2xhc3NBY2Nlc3NvclByb3BlcnR5IjpjYXNlIkFjY2Vzc29yUHJvcGVydHkiOnJldHVybiBYdihlLHQsbik7Y2FzZSJUZW1wbGF0ZUVsZW1lbnQiOnJldHVybiBhaShzLnZhbHVlLnJhdyk7Y2FzZSJUZW1wbGF0ZUxpdGVyYWwiOnJldHVybiBldihlLHQsbik7Y2FzZSJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24iOnJldHVybiBuNChlLHQsbik7Y2FzZSJQcml2YXRlSWRlbnRpZmllciI6cmV0dXJuWyIjIixzLm5hbWVdO2Nhc2UiUHJpdmF0ZU5hbWUiOnJldHVyblsiIyIsbigiaWQiKV07Y2FzZSJUb3BpY1JlZmVyZW5jZSI6cmV0dXJuIiUiO2Nhc2UiQXJndW1lbnRQbGFjZWhvbGRlciI6cmV0dXJuIj8iO2Nhc2UiTW9kdWxlRXhwcmVzc2lvbiI6cmV0dXJuWyJtb2R1bGUgIixuKCJib2R5IildO2Nhc2UiVm9pZFBhdHRlcm4iOnJldHVybiJ2b2lkIjtjYXNlIkVtcHR5U3RhdGVtZW50IjppZihYaChlKSlyZXR1cm4iOyI7ZGVmYXVsdDp0aHJvdyBuZXcga28ocywiRVNUcmVlIil9fWZ1bmN0aW9uIGhGKGUpe3JldHVybltlKCJlbGVtZW50VHlwZSIpLCJbXSJdfWZ1bmN0aW9uIGRGKGUsdCxuKXtsZXR7cGFyZW50OnIsbm9kZTpzLGtleTppfT1lLG89cy50eXBlPT09IkFzQ29uc3RFeHByZXNzaW9uIj8iY29uc3QiOm4oInR5cGVBbm5vdGF0aW9uIiksYT1bbigiZXhwcmVzc2lvbiIpLCIgIiwkayhzKT8ic2F0aXNmaWVzIjoiYXMiLCIgIixvXTtyZXR1cm4gaT09PSJjYWxsZWUiJiZxYShyKXx8aT09PSJvYmplY3QiJiZ4ZShyKT9fKFtPKFtQLC4uLmFdKSxQXSk6YX1mdW5jdGlvbiBvQihlLHQsbil7bGV0e25vZGU6cn09ZSxzPVtybihlKSxyLmFzeW5jPyJhc3luYyAiOiIiLCJjb21wb25lbnQiXTtyLmlkJiZzLnB1c2goIiAiLG4oImlkIikpLHMucHVzaChuKCJ0eXBlUGFyYW1ldGVycyIpKTtsZXQgaT1saShlLHQsbik7cmV0dXJuIHIucmVuZGVyc1R5cGU/cy5wdXNoKF8oW2ksIiAiLG4oInJlbmRlcnNUeXBlIildKSk6cy5wdXNoKF8oW2ldKSksci5ib2R5JiZzLnB1c2goIiAiLG4oImJvZHkiKSksci50eXBlPT09IkRlY2xhcmVDb21wb25lbnQiJiZzLnB1c2gocWUodCkpLHN9ZnVuY3Rpb24gYUIoZSx0LG4pe2xldHtub2RlOnJ9PWU7cmV0dXJuIHIuc2hvcnRoYW5kP24oImxvY2FsIik6W24oIm5hbWUiKSwiIGFzICIsbigibG9jYWwiKV19ZnVuY3Rpb24gdUIoZSx0LG4pe2xldHtub2RlOnJ9PWUscz1bXTtyZXR1cm4gci5uYW1lJiZzLnB1c2gobigibmFtZSIpLHIub3B0aW9uYWw/Ij86ICI6IjogIikscy5wdXNoKG4oInR5cGVBbm5vdGF0aW9uIikpLHN9ZnVuY3Rpb24gbEIoZSx0LG4pe2xldHtub2RlOnJ9PWU7cmV0dXJuW3IuZXhwbGljaXRUeXBlP2BvZiAke3IuZXhwbGljaXRUeXBlfSBgOiIiLExvKGUsdCxuKV19ZnVuY3Rpb24gY0IoZSx0LG4pe2xldHtub2RlOnJ9PWU7cmV0dXJuW3IudHlwZT09PSJFbnVtU3ltYm9sQm9keSJ8fHIuZXhwbGljaXRUeXBlP2BvZiAke3IudHlwZS5zbGljZSg0LC00KS50b0xvd2VyQ2FzZSgpfSBgOiIiLExvKGUsdCxuKV19ZnVuY3Rpb24gbUYoZSx0LG4pe2xldHtub2RlOnJ9PWUscz1yLnR5cGU9PT0iVFNFbnVtTWVtYmVyIixpPXM/QXMoZSx0LG4pOm4oImlkIiksbz1zPyJpbml0aWFsaXplciI6ImluaXQiO3JldHVybiByW29dP1tpLCIgPSAiLG4obyldOml9ZnVuY3Rpb24gZ0YoZSx0KXtsZXR7bm9kZTpufT1lO3JldHVybltybihlKSxuLmNvbnN0PyJjb25zdCAiOiIiLCJlbnVtICIsdCgiaWQiKSwiICIsdCgiYm9keSIpXX1mdW5jdGlvbiB5RihlLHQsbil7bGV0e25vZGU6cn09ZSxzPVt2YyhlKV07KHIudHlwZT09PSJUU0NvbnN0cnVjdG9yVHlwZSJ8fHIudHlwZT09PSJUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uIikmJnMucHVzaCgibmV3ICIpO2xldCBpPWxpKGUsdCxuLCExLCEwKSxvPVtdO3JldHVybiByLnR5cGU9PT0iRnVuY3Rpb25UeXBlQW5ub3RhdGlvbiI/by5wdXNoKGZCKGUpPyIgPT4gIjoiOiAiLG4oInJldHVyblR5cGUiKSk6by5wdXNoKGR0KGUsbiwicmV0dXJuVHlwZSIpKSxZYShyLG8pJiYoaT1fKGkpKSxzLnB1c2goaSxvKSxbXyhzKSxyLnR5cGU9PT0iVFNDb25zdHJ1Y3RTaWduYXR1cmVEZWNsYXJhdGlvbiJ8fHIudHlwZT09PSJUU0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbiI/JHIoZSx0KToiIl19ZnVuY3Rpb24gZkIoZSl7dmFyIHI7bGV0e25vZGU6dCxwYXJlbnQ6bn09ZTtyZXR1cm4gdC50eXBlPT09IkZ1bmN0aW9uVHlwZUFubm90YXRpb24iJiYoU2Qobil8fCEoKG4udHlwZT09PSJPYmplY3RUeXBlUHJvcGVydHkifHxuLnR5cGU9PT0iT2JqZWN0VHlwZUludGVybmFsU2xvdCIpJiYhbi52YXJpYW5jZSYmIW4ub3B0aW9uYWwmJmNjKG4sdCl8fG4udHlwZT09PSJPYmplY3RUeXBlQ2FsbFByb3BlcnR5Inx8KChyPWUuZ2V0UGFyZW50Tm9kZSgyKSk9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0iRGVjbGFyZUZ1bmN0aW9uIikpfWZ1bmN0aW9uIHBCKGUsdCxuKXtyZXR1cm5bcm4oZSksImhvb2siLGUubm9kZS5pZD9bIiAiLG4oImlkIildOiIiLHFlKHQpXX1mdW5jdGlvbiBERihlKXt2YXIgbjtsZXR7bm9kZTp0fT1lO3JldHVybiB0LnR5cGU9PT0iSG9va1R5cGVBbm5vdGF0aW9uIiYmKChuPWUuZ2V0UGFyZW50Tm9kZSgyKSk9PW51bGw/dm9pZCAwOm4udHlwZSk9PT0iRGVjbGFyZUhvb2sifWZ1bmN0aW9uIGhCKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9bGkoZSx0LG4sITEsITApLGk9W0RGKGUpPyI6ICI6IiA9PiAiLG4oInJldHVyblR5cGUiKV07cmV0dXJuIF8oW0RGKGUpPyIiOiJob29rICIsWWEocixpKT9fKHMpOnMsaV0pfWZ1bmN0aW9uIGJGKGUsdCxuKXtyZXR1cm5bbigib2JqZWN0VHlwZSIpLE50KGUpLCJbIixuKCJpbmRleFR5cGUiKSwiXSJdfWZ1bmN0aW9uIEVGKGUsdCxuKXtyZXR1cm5bImluZmVyICIsbigidHlwZVBhcmFtZXRlciIpXX1mdW5jdGlvbiB2RihlLHQsbil7bGV0IHI9ITE7cmV0dXJuIF8oZS5tYXAoKHtpc0ZpcnN0OnMscHJldmlvdXM6aSxub2RlOm8saW5kZXg6YX0pPT57bGV0IHU9bigpO2lmKHMpcmV0dXJuIHU7bGV0IGw9bXMobyksZj1tcyhpKTtyZXR1cm4gZiYmbD9bIiAmICIscj9PKHUpOnVdOiFmJiYhbHx8eHIodC5vcmlnaW5hbFRleHQsbyk/dC5leHBlcmltZW50YWxPcGVyYXRvclBvc2l0aW9uPT09InN0YXJ0Ij9PKFtILCImICIsdV0pOk8oWyIgJiIsSCx1XSk6KGE+MSYmKHI9ITApLFsiICYgIixhPjE/Tyh1KTp1XSl9LCJ0eXBlcyIpKX1mdW5jdGlvbiBkQihlKXtzd2l0Y2goZSl7Y2FzZSBudWxsOnJldHVybiIiO2Nhc2UiUGx1c09wdGlvbmFsIjpyZXR1cm4iKz8iO2Nhc2UiTWludXNPcHRpb25hbCI6cmV0dXJuIi0/IjtjYXNlIk9wdGlvbmFsIjpyZXR1cm4iPyJ9fWZ1bmN0aW9uIG1CKGUsdCxuKXtsZXR7bm9kZTpyfT1lO3JldHVybltfKFtyLnZhcmlhbmNlP24oInZhcmlhbmNlIik6IiIsXyhbIlsiLE8oW1Asbigia2V5VHBhcmFtIiksIiBpbiAiLG4oInNvdXJjZVR5cGUiKV0pLFAsIl0iXSksZEIoci5vcHRpb25hbCksIjogIixuKCJwcm9wVHlwZSIpXSksJHIoZSx0KV19ZnVuY3Rpb24gRkYoZSx0KXtyZXR1cm4gZT09PSIrInx8ZT09PSItIj9lK3Q6dH1mdW5jdGlvbiBnQihlLHQsbil7bGV0e25vZGU6cn09ZSxzPSExO2lmKHQub2JqZWN0V3JhcD09PSJwcmVzZXJ2ZSIpe2xldCBhPUFuKHQpLHU9ZWUocikrMSxsPWEuc2xpY2UodSksZj11K2wuc2VhcmNoKC9cUy8pO3F0KHQub3JpZ2luYWxUZXh0LHUsZikmJihzPSEwKX1sZXQgaT1bXSxvPWVuKHIsei5EYW5nbGluZyk7aWYoby5sZW5ndGg+MCl7bGV0IGE9Y2UoMCxvLC0xKSx1PWV0KGUsdCk7aS5wdXNoKC4uLnUuc2xpY2UoMCwtMSksXyhbY2UoMCx1LC0xKSxncyhhKXx8aXQodC5vcmlnaW5hbFRleHQsWChhKSk/UjpIXSkpfXJldHVybiBfKFsieyIsTyhbdC5icmFja2V0U3BhY2luZz9IOlAsLi4uaSxyLnJlYWRvbmx5P1tGRihyLnJlYWRvbmx5LCJyZWFkb25seSIpLCIgIl06IiIsXyhbIlsiLE8oW1Asbigia2V5IiksIiBpbiAiLG4oImNvbnN0cmFpbnQiKSxyLm5hbWVUeXBlP1siIGFzICIsbigibmFtZVR5cGUiKV06IiJdKSxQLCJdIl0pLHIub3B0aW9uYWw/RkYoci5vcHRpb25hbCwiPyIpOiIiLHIudHlwZUFubm90YXRpb24/IjogIjoiIixuKCJ0eXBlQW5ub3RhdGlvbiIpLHQuc2VtaT91ZSgiOyIpOiIiXSksdC5icmFja2V0U3BhY2luZz9IOlAsIn0iXSx7c2hvdWxkQnJlYWs6c30pfWZ1bmN0aW9uIHlCKGUsdCxuKXtsZXR7bm9kZTpyfT1lO3JldHVybltfKFsibWF0Y2ggKCIsTyhbUCxuKCJhcmd1bWVudCIpXSksUCwiKSJdKSwiIHsiLHIuY2FzZXMubGVuZ3RoPjA/TyhbUixmZShSLGUubWFwKCh7bm9kZTpzLGlzTGFzdDppfSk9PltuKCksIWkmJmxyKHMsdCk/UjoiIl0sImNhc2VzIikpXSk6IiIsUiwifSJdfWZ1bmN0aW9uIERCKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9cShyLHouRGFuZ2xpbmcpP1siICIsZXQoZSx0KV06W10saT1yLnR5cGU9PT0iTWF0Y2hTdGF0ZW1lbnRDYXNlIj9bIiAiLG4oImJvZHkiKV06TyhbSCxuKCJib2R5IiksIiwiXSk7cmV0dXJuW24oInBhdHRlcm4iKSxyLmd1YXJkP18oW08oW0gsImlmICgiLG4oImd1YXJkIiksIikiXSldKToiIixfKFsiID0+IixzLGldKV19ZnVuY3Rpb24gYkIoZSx0LG4pe2xldHtub2RlOnJ9PWU7c3dpdGNoKHIudHlwZSl7Y2FzZSJNYXRjaE9yUGF0dGVybiI6cmV0dXJuIEFCKGUsdCxuKTtjYXNlIk1hdGNoQXNQYXR0ZXJuIjpyZXR1cm5bbigicGF0dGVybiIpLCIgYXMgIixuKCJ0YXJnZXQiKV07Y2FzZSJNYXRjaFdpbGRjYXJkUGF0dGVybiI6cmV0dXJuWyJfIl07Y2FzZSJNYXRjaExpdGVyYWxQYXR0ZXJuIjpyZXR1cm4gbigibGl0ZXJhbCIpO2Nhc2UiTWF0Y2hVbmFyeVBhdHRlcm4iOnJldHVybltyLm9wZXJhdG9yLG4oImFyZ3VtZW50IildO2Nhc2UiTWF0Y2hJZGVudGlmaWVyUGF0dGVybiI6cmV0dXJuIG4oImlkIik7Y2FzZSJNYXRjaE1lbWJlclBhdHRlcm4iOntsZXQgcz1yLnByb3BlcnR5LnR5cGU9PT0iSWRlbnRpZmllciI/WyIuIixuKCJwcm9wZXJ0eSIpXTpbIlsiLE8oW1AsbigicHJvcGVydHkiKV0pLFAsIl0iXTtyZXR1cm4gXyhbbigiYmFzZSIpLHNdKX1jYXNlIk1hdGNoQmluZGluZ1BhdHRlcm4iOnJldHVybltyLmtpbmQsIiAiLG4oImlkIildO2Nhc2UiTWF0Y2hPYmplY3RQYXR0ZXJuIjpjYXNlIk1hdGNoSW5zdGFuY2VPYmplY3RQYXR0ZXJuIjpyZXR1cm4gRUIoZSx0LG4pO2Nhc2UiTWF0Y2hJbnN0YW5jZVBhdHRlcm4iOnJldHVybiBfKFtuKCJ0YXJnZXRDb25zdHJ1Y3RvciIpLCIgIixuKCJwcm9wZXJ0aWVzIildKTtjYXNlIk1hdGNoQXJyYXlQYXR0ZXJuIjp7bGV0IHM9ZS5tYXAobiwiZWxlbWVudHMiKTtyZXR1cm4gci5yZXN0JiZzLnB1c2gobigicmVzdCIpKSxfKFsiWyIsTyhbUCxmZShbIiwiLEhdLHMpXSksci5yZXN0PyIiOnVlKCIsIiksUCwiXSJdKX1jYXNlIk1hdGNoT2JqZWN0UGF0dGVyblByb3BlcnR5IjpyZXR1cm4gci5zaG9ydGhhbmQ/bigicGF0dGVybiIpOl8oW24oImtleSIpLCI6IixPKFtILG4oInBhdHRlcm4iKV0pXSk7Y2FzZSJNYXRjaFJlc3RQYXR0ZXJuIjp7bGV0IHM9WyIuLi4iXTtyZXR1cm4gci5hcmd1bWVudCYmcy5wdXNoKG4oImFyZ3VtZW50IikpLHN9fX1mdW5jdGlvbiBFQihlLHQsbil7bGV0e25vZGU6cn09ZSxzPWUubWFwKG4sInByb3BlcnRpZXMiKTtyZXR1cm4gci5yZXN0JiZzLnB1c2gobigicmVzdCIpKSxfKFsieyIsTyhbUCxmZShbIiwiLEhdLHMpXSksci5yZXN0PyIiOnVlKCIsIiksUCwifSJdKX12YXIgQUY9SyhbIk1hdGNoV2lsZGNhcmRQYXR0ZXJuIiwiTWF0Y2hMaXRlcmFsUGF0dGVybiIsIk1hdGNoVW5hcnlQYXR0ZXJuIiwiTWF0Y2hJZGVudGlmaWVyUGF0dGVybiJdKTtmdW5jdGlvbiB2QihlKXtsZXR7cGF0dGVybnM6dH09ZTtpZih0LnNvbWUocj0+cShyKSkpcmV0dXJuITE7bGV0IG49dC5maW5kKHI9PnIudHlwZT09PSJNYXRjaE9iamVjdFBhdHRlcm4iKTtyZXR1cm4gbj90LmV2ZXJ5KHI9PnI9PT1ufHxBRihyKSk6ITF9ZnVuY3Rpb24gRkIoZSl7cmV0dXJuIEFGKGUpfHxlLnR5cGU9PT0iTWF0Y2hPYmplY3RQYXR0ZXJuIj8hMDplLnR5cGU9PT0iTWF0Y2hPclBhdHRlcm4iP3ZCKGUpOiExfWZ1bmN0aW9uIEFCKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHtwYXJlbnQ6c309ZSxpPXMudHlwZSE9PSJNYXRjaFN0YXRlbWVudENhc2UiJiZzLnR5cGUhPT0iTWF0Y2hFeHByZXNzaW9uQ2FzZSImJnMudHlwZSE9PSJNYXRjaEFycmF5UGF0dGVybiImJnMudHlwZSE9PSJNYXRjaE9iamVjdFBhdHRlcm5Qcm9wZXJ0eSImJiF4cih0Lm9yaWdpbmFsVGV4dCxyKSxvPUZCKHIpLGE9ZS5tYXAoKCk9PntsZXQgbD1uKCk7cmV0dXJuIG98fChsPW5uKDIsbCkpLEZ0KGUsbCx0KX0sInBhdHRlcm5zIik7aWYobylyZXR1cm4gZmUoIiB8ICIsYSk7bGV0IHU9W3VlKFsifCAiXSksZmUoW0gsInwgIl0sYSldO3JldHVybiB0bihlLHQpP18oW08oW3VlKFtQXSksdV0pLFBdKTpzLnR5cGU9PT0iTWF0Y2hBcnJheVBhdHRlcm4iJiZzLmVsZW1lbnRzLmxlbmd0aD4xP18oW08oW3VlKFsiKCIsUF0pLHVdKSxQLHVlKCIpIildKTpfKGk/Tyh1KTp1KX1mdW5jdGlvbiB3QihlLHQsbil7bGV0e25vZGU6cn09ZSxzPVtybihlKSwib3BhcXVlIHR5cGUgIixuKCJpZCIpLG4oInR5cGVQYXJhbWV0ZXJzIildO2lmKHIuc3VwZXJ0eXBlJiZzLnB1c2goIjogIixuKCJzdXBlcnR5cGUiKSksci5sb3dlckJvdW5kfHxyLnVwcGVyQm91bmQpe2xldCBpPVtdO3IubG93ZXJCb3VuZCYmaS5wdXNoKE8oW0gsInN1cGVyICIsbigibG93ZXJCb3VuZCIpXSkpLHIudXBwZXJCb3VuZCYmaS5wdXNoKE8oW0gsImV4dGVuZHMgIixuKCJ1cHBlckJvdW5kIildKSkscy5wdXNoKF8oaSkpfXJldHVybiByLmltcGx0eXBlJiZzLnB1c2goIiA9ICIsbigiaW1wbHR5cGUiKSkscy5wdXNoKHFlKHQpKSxzfWZ1bmN0aW9uIHdGKGUsdCxuKXtsZXR7bm9kZTpyfT1lO3JldHVyblsiLi4uIiwuLi5yLnR5cGU9PT0iVHVwbGVUeXBlU3ByZWFkRWxlbWVudCImJnIubGFiZWw/W24oImxhYmVsIiksIjogIl06W10sbigidHlwZUFubm90YXRpb24iKV19ZnVuY3Rpb24gQ0YoZSx0LG4pe2xldHtub2RlOnJ9PWU7cmV0dXJuW3IudmFyaWFuY2U/bigidmFyaWFuY2UiKToiIixuKCJsYWJlbCIpLHIub3B0aW9uYWw/Ij8iOiIiLCI6ICIsbigiZWxlbWVudFR5cGUiKV19ZnVuY3Rpb24gU0YoZSx0LG4pe2xldHtub2RlOnJ9PWUscz1bcm4oZSksInR5cGUgIixuKCJpZCIpLG4oInR5cGVQYXJhbWV0ZXJzIildLGk9ci50eXBlPT09IlRTVHlwZUFsaWFzRGVjbGFyYXRpb24iPyJ0eXBlQW5ub3RhdGlvbiI6InJpZ2h0IjtyZXR1cm5bc3UoZSx0LG4scywiID0iLGkpLHFlKHQpXX1mdW5jdGlvbiBDQihlLHQsbil7bGV0e25vZGU6cn09ZTtyZXR1cm4geHQocikubGVuZ3RoPT09MSYmci50eXBlLnN0YXJ0c1dpdGgoIlRTIikmJiFyW25dWzBdLmNvbnN0cmFpbnQmJmUucGFyZW50LnR5cGU9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iJiYhKHQuZmlsZXBhdGgmJi9cLnRzJC8udGVzdCh0LmZpbGVwYXRoKSl9ZnVuY3Rpb24gaXUoZSx0LG4scil7bGV0e25vZGU6c309ZSxpPXNbcl07aWYoIWkpcmV0dXJuIiI7aWYoIUFycmF5LmlzQXJyYXkoaSkpcmV0dXJuIG4ocik7bGV0IG89RWMoZS5ncmFuZHBhcmVudCksYT1lLm1hdGNoKGw9PiEobFtyXS5sZW5ndGg9PT0xJiZtcyhsW3JdWzBdKSksdm9pZCAwLChsLGYpPT5mPT09InR5cGVBbm5vdGF0aW9uIixsPT5sLnR5cGU9PT0iSWRlbnRpZmllciIsTXYpO2lmKGkubGVuZ3RoPT09MHx8IWEmJihvfHxpLmxlbmd0aD09PTEmJihpWzBdLnR5cGU9PT0iTnVsbGFibGVUeXBlQW5ub3RhdGlvbiJ8fEhOKGlbMF0pKSkmJiFpLnNvbWUobD0+e2xldCBmPWVuKGwsYz0+Yy5sZWFkaW5nfHxjLnRyYWlsaW5nKTtyZXR1cm4gZi5sZW5ndGg+MCYmKGYuc29tZShjPT5ncyhjKSl8fGl0KHQub3JpZ2luYWxUZXh0LFgoY2UoMCxmLC0xKSkpKX0pKXJldHVyblsiPCIsZmUoIiwgIixlLm1hcChuLHIpKSxTQihlLHQpLCI+Il07bGV0IHU9cy50eXBlPT09IlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24iPyIiOkNCKGUsdCxyKT8iLCI6RnModCk7cmV0dXJuIF8oWyI8IixPKFtQLGZlKFsiLCIsSF0sZS5tYXAobixyKSldKSx1LFAsIj4iXSl9ZnVuY3Rpb24gU0IoZSx0KXtsZXR7bm9kZTpufT1lO2lmKCFxKG4sei5EYW5nbGluZykpcmV0dXJuIiI7bGV0IHI9IXEobix6LkxpbmUpLHM9ZXQoZSx0LHtpbmRlbnQ6IXJ9KTtyZXR1cm4gcj9zOltzLFJdfWZ1bmN0aW9uIHhGKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9W3IuY29uc3Q/ImNvbnN0ICI6IiJdLGk9ci50eXBlPT09IlRTVHlwZVBhcmFtZXRlciI/bigibmFtZSIpOnIubmFtZTtpZihyLnZhcmlhbmNlJiZzLnB1c2gobigidmFyaWFuY2UiKSksci5pbiYmcy5wdXNoKCJpbiAiKSxyLm91dCYmcy5wdXNoKCJvdXQgIikscy5wdXNoKGkpLHIuYm91bmQmJihyLnVzZXNFeHRlbmRzQm91bmQmJnMucHVzaCgiIGV4dGVuZHMgIikscy5wdXNoKGR0KGUsbiwiYm91bmQiKSkpLHIuY29uc3RyYWludCl7bGV0IG89U3ltYm9sKCJjb25zdHJhaW50Iik7cy5wdXNoKCIgZXh0ZW5kcyIsXyhPKEgpLHtpZDpvfSksQ24sS2EobigiY29uc3RyYWludCIpLHtncm91cElkOm99KSl9aWYoci5kZWZhdWx0KXtsZXQgbz1TeW1ib2woImRlZmF1bHQiKTtzLnB1c2goIiA9IixfKE8oSCkse2lkOm99KSxDbixLYShuKCJkZWZhdWx0Iikse2dyb3VwSWQ6b30pKX1yZXR1cm4gXyhzKX1mdW5jdGlvbiBrRihlLHQpe2xldHtub2RlOm59PWU7cmV0dXJuW24udHlwZT09PSJUU1R5cGVQcmVkaWNhdGUiJiZuLmFzc2VydHM/ImFzc2VydHMgIjpuLnR5cGU9PT0iVHlwZVByZWRpY2F0ZSImJm4ua2luZD9gJHtuLmtpbmR9IGA6IiIsdCgicGFyYW1ldGVyTmFtZSIpLG4udHlwZUFubm90YXRpb24/WyIgaXMgIixkdChlLHQpXToiIl19ZnVuY3Rpb24gVEYoe25vZGU6ZX0sdCl7bGV0IG49ZS50eXBlPT09IlRTVHlwZVF1ZXJ5Ij8iZXhwck5hbWUiOiJhcmd1bWVudCI7cmV0dXJuWyJ0eXBlb2YgIix0KG4pLHQoInR5cGVBcmd1bWVudHMiKV19ZnVuY3Rpb24geEIoZSx0LG4scil7bGV0e25vZGU6c309ZTtpZihDRShzKSlyZXR1cm4gcy50eXBlLnNsaWNlKDAsLTE0KS50b0xvd2VyQ2FzZSgpO3N3aXRjaChzLnR5cGUpe2Nhc2UiQ29tcG9uZW50RGVjbGFyYXRpb24iOmNhc2UiRGVjbGFyZUNvbXBvbmVudCI6Y2FzZSJDb21wb25lbnRUeXBlQW5ub3RhdGlvbiI6cmV0dXJuIG9CKGUsdCxuKTtjYXNlIkNvbXBvbmVudFBhcmFtZXRlciI6cmV0dXJuIGFCKGUsdCxuKTtjYXNlIkNvbXBvbmVudFR5cGVQYXJhbWV0ZXIiOnJldHVybiB1QihlLHQsbik7Y2FzZSJIb29rRGVjbGFyYXRpb24iOnJldHVybiBfZChlLHQsbik7Y2FzZSJEZWNsYXJlSG9vayI6cmV0dXJuIHBCKGUsdCxuKTtjYXNlIkhvb2tUeXBlQW5ub3RhdGlvbiI6cmV0dXJuIGhCKGUsdCxuKTtjYXNlIkRlY2xhcmVGdW5jdGlvbiI6cmV0dXJuW3JuKGUpLCJmdW5jdGlvbiAiLG4oImlkIiksbigicHJlZGljYXRlIikscWUodCldO2Nhc2UiRGVjbGFyZU1vZHVsZSI6cmV0dXJuWyJkZWNsYXJlIG1vZHVsZSAiLG4oImlkIiksIiAiLG4oImJvZHkiKV07Y2FzZSJEZWNsYXJlTW9kdWxlRXhwb3J0cyI6cmV0dXJuWyJkZWNsYXJlIG1vZHVsZS5leHBvcnRzIixkdChlLG4pLHFlKHQpXTtjYXNlIkRlY2xhcmVOYW1lc3BhY2UiOnJldHVyblsiZGVjbGFyZSBuYW1lc3BhY2UgIixuKCJpZCIpLCIgIixuKCJib2R5IildO2Nhc2UiRGVjbGFyZVZhcmlhYmxlIjpyZXR1cm4gQXJyYXkuaXNBcnJheShzLmRlY2xhcmF0aW9ucyk/cEYoZSx0LG4pOltybihlKSxzLmtpbmQ/PyJ2YXIiLCIgIixuKCJpZCIpLHFlKHQpXTtjYXNlIkRlY2xhcmVFeHBvcnREZWNsYXJhdGlvbiI6Y2FzZSJEZWNsYXJlRXhwb3J0QWxsRGVjbGFyYXRpb24iOnJldHVybiByRihlLHQsbik7Y2FzZSJEZWNsYXJlT3BhcXVlVHlwZSI6Y2FzZSJPcGFxdWVUeXBlIjpyZXR1cm4gd0IoZSx0LG4pO2Nhc2UiRGVjbGFyZVR5cGVBbGlhcyI6Y2FzZSJUeXBlQWxpYXMiOnJldHVybiBTRihlLHQsbik7Y2FzZSJJbnRlcnNlY3Rpb25UeXBlQW5ub3RhdGlvbiI6cmV0dXJuIHZGKGUsdCxuKTtjYXNlIlVuaW9uVHlwZUFubm90YXRpb24iOnJldHVybiBIRShlLHQsbixyKTtjYXNlIkNvbmRpdGlvbmFsVHlwZUFubm90YXRpb24iOnJldHVybiBybShlLHQsbik7Y2FzZSJJbmZlclR5cGVBbm5vdGF0aW9uIjpyZXR1cm4gRUYoZSx0LG4pO2Nhc2UiRnVuY3Rpb25UeXBlQW5ub3RhdGlvbiI6cmV0dXJuIHlGKGUsdCxuKTtjYXNlIlR1cGxlVHlwZUFubm90YXRpb24iOnJldHVybiBIZChlLHQsbik7Y2FzZSJUdXBsZVR5cGVMYWJlbGVkRWxlbWVudCI6cmV0dXJuIENGKGUsdCxuKTtjYXNlIlR1cGxlVHlwZVNwcmVhZEVsZW1lbnQiOnJldHVybiB3RihlLHQsbik7Y2FzZSJHZW5lcmljVHlwZUFubm90YXRpb24iOnJldHVybltuKCJpZCIpLGl1KGUsdCxuLCJ0eXBlUGFyYW1ldGVycyIpXTtjYXNlIkluZGV4ZWRBY2Nlc3NUeXBlIjpjYXNlIk9wdGlvbmFsSW5kZXhlZEFjY2Vzc1R5cGUiOnJldHVybiBiRihlLHQsbik7Y2FzZSJUeXBlQW5ub3RhdGlvbiI6cmV0dXJuIHpFKGUsdCxuKTtjYXNlIlR5cGVQYXJhbWV0ZXIiOnJldHVybiB4RihlLHQsbik7Y2FzZSJUeXBlb2ZUeXBlQW5ub3RhdGlvbiI6cmV0dXJuIFRGKGUsbik7Y2FzZSJFeGlzdHNUeXBlQW5ub3RhdGlvbiI6cmV0dXJuIioiO2Nhc2UiQXJyYXlUeXBlQW5ub3RhdGlvbiI6cmV0dXJuIGhGKG4pO2Nhc2UiRGVjbGFyZUVudW0iOmNhc2UiRW51bURlY2xhcmF0aW9uIjpyZXR1cm4gZ0YoZSxuKTtjYXNlIkVudW1Cb2R5IjpyZXR1cm4gbEIoZSx0LG4pO2Nhc2UiRW51bUJvb2xlYW5Cb2R5IjpjYXNlIkVudW1OdW1iZXJCb2R5IjpjYXNlIkVudW1CaWdJbnRCb2R5IjpjYXNlIkVudW1TdHJpbmdCb2R5IjpjYXNlIkVudW1TeW1ib2xCb2R5IjpyZXR1cm4gY0IoZSx0LG4pO2Nhc2UiRW51bUJvb2xlYW5NZW1iZXIiOmNhc2UiRW51bU51bWJlck1lbWJlciI6Y2FzZSJFbnVtQmlnSW50TWVtYmVyIjpjYXNlIkVudW1TdHJpbmdNZW1iZXIiOmNhc2UiRW51bURlZmF1bHRlZE1lbWJlciI6cmV0dXJuIG1GKGUsdCxuKTtjYXNlIkZ1bmN0aW9uVHlwZVBhcmFtIjp7bGV0IGk9cy5uYW1lP24oIm5hbWUiKTplLnBhcmVudC50aGlzPT09cz8idGhpcyI6IiI7cmV0dXJuW2ksTnQoZSksaT8iOiAiOiIiLG4oInR5cGVBbm5vdGF0aW9uIildfWNhc2UiRGVjbGFyZUNsYXNzIjpjYXNlIkRlY2xhcmVJbnRlcmZhY2UiOmNhc2UiSW50ZXJmYWNlRGVjbGFyYXRpb24iOmNhc2UiSW50ZXJmYWNlVHlwZUFubm90YXRpb24iOmNhc2UiUmVjb3JkRGVjbGFyYXRpb24iOnJldHVybiBYZChlLHQsbik7Y2FzZSJPYmplY3RUeXBlQW5ub3RhdGlvbiI6Y2FzZSJSZWNvcmREZWNsYXJhdGlvbkJvZHkiOnJldHVybiBLZChlLHQsbik7Y2FzZSJDbGFzc0ltcGxlbWVudHMiOmNhc2UiSW50ZXJmYWNlRXh0ZW5kcyI6cmV0dXJuW24oImlkIiksbigidHlwZVBhcmFtZXRlcnMiKV07Y2FzZSJSZWNvcmREZWNsYXJhdGlvbkltcGxlbWVudHMiOnJldHVybltuKCJpZCIpLG4oInR5cGVBcmd1bWVudHMiKV07Y2FzZSJOdWxsYWJsZVR5cGVBbm5vdGF0aW9uIjpyZXR1cm5bIj8iLG4oInR5cGVBbm5vdGF0aW9uIildO2Nhc2UiVmFyaWFuY2UiOntsZXR7a2luZDppfT1zO3JldHVybiBpPT09InBsdXMiPyIrIjppPT09Im1pbnVzIj8iLSI6YCR7aX0gYH1jYXNlIktleW9mVHlwZUFubm90YXRpb24iOnJldHVyblsia2V5b2YgIixuKCJhcmd1bWVudCIpXTtjYXNlIk9iamVjdFR5cGVDYWxsUHJvcGVydHkiOnJldHVybltzLnN0YXRpYz8ic3RhdGljICI6IiIsbigidmFsdWUiKSwkcihlLHQpXTtjYXNlIk9iamVjdFR5cGVNYXBwZWRUeXBlUHJvcGVydHkiOnJldHVybiBtQihlLHQsbik7Y2FzZSJPYmplY3RUeXBlSW5kZXhlciI6cmV0dXJuW3Muc3RhdGljPyJzdGF0aWMgIjoiIixzLnZhcmlhbmNlP24oInZhcmlhbmNlIik6IiIsIlsiLG4oImlkIikscy5pZD8iOiAiOiIiLG4oImtleSIpLCJdOiAiLG4oInZhbHVlIiksJHIoZSx0KV07Y2FzZSJPYmplY3RUeXBlUHJvcGVydHkiOntsZXQgaT0iIjtyZXR1cm4gcy5wcm90bz9pPSJwcm90byAiOnMuc3RhdGljJiYoaT0ic3RhdGljICIpLFtpLHMua2luZCE9PSJpbml0Ij9zLmtpbmQrIiAiOiIiLHMudmFyaWFuY2U/bigidmFyaWFuY2UiKToiIixBcyhlLHQsbiksTnQoZSksYm8ocyk/IiI6IjogIixuKCJ2YWx1ZSIpLCRyKGUsdCldfWNhc2UiT2JqZWN0VHlwZUludGVybmFsU2xvdCI6cmV0dXJuW3Muc3RhdGljPyJzdGF0aWMgIjoiIiwiW1siLG4oImlkIiksIl1dIixOdChlKSxzLm1ldGhvZD8iIjoiOiAiLG4oInZhbHVlIiksJHIoZSx0KV07Y2FzZSJPYmplY3RUeXBlU3ByZWFkUHJvcGVydHkiOnJldHVybiB0bShlLG4pO2Nhc2UiUXVhbGlmaWVkVHlwZW9mSWRlbnRpZmllciI6Y2FzZSJRdWFsaWZpZWRUeXBlSWRlbnRpZmllciI6cmV0dXJuW24oInF1YWxpZmljYXRpb24iKSwiLiIsbigiaWQiKV07Y2FzZSJOdWxsTGl0ZXJhbFR5cGVBbm5vdGF0aW9uIjpyZXR1cm4ibnVsbCI7Y2FzZSJCb29sZWFuTGl0ZXJhbFR5cGVBbm5vdGF0aW9uIjpyZXR1cm4gU3RyaW5nKHMudmFsdWUpO2Nhc2UiU3RyaW5nTGl0ZXJhbFR5cGVBbm5vdGF0aW9uIjpyZXR1cm4gYWkoY2koUXQocyksdCkpO2Nhc2UiTnVtYmVyTGl0ZXJhbFR5cGVBbm5vdGF0aW9uIjpyZXR1cm4gWmEoUXQocykpO2Nhc2UiQmlnSW50TGl0ZXJhbFR5cGVBbm5vdGF0aW9uIjpyZXR1cm4gUWQoUXQocykpO2Nhc2UiVHlwZUNhc3RFeHByZXNzaW9uIjpyZXR1cm5bIigiLG4oImV4cHJlc3Npb24iKSxkdChlLG4pLCIpIl07Y2FzZSJUeXBlUHJlZGljYXRlIjpyZXR1cm4ga0YoZSxuKTtjYXNlIlR5cGVPcGVyYXRvciI6cmV0dXJuW3Mub3BlcmF0b3IsIiAiLG4oInR5cGVBbm5vdGF0aW9uIildO2Nhc2UiVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIjpjYXNlIlR5cGVQYXJhbWV0ZXJJbnN0YW50aWF0aW9uIjpyZXR1cm4gaXUoZSx0LG4sInBhcmFtcyIpO2Nhc2UiSW5mZXJyZWRQcmVkaWNhdGUiOmNhc2UiRGVjbGFyZWRQcmVkaWNhdGUiOnJldHVybltlLmtleT09PSJwcmVkaWNhdGUiJiZlLnBhcmVudC50eXBlIT09IkRlY2xhcmVGdW5jdGlvbiImJiFlLnBhcmVudC5yZXR1cm5UeXBlPyI6ICI6IiAiLCIlY2hlY2tzIiwuLi5zLnR5cGU9PT0iRGVjbGFyZWRQcmVkaWNhdGUiP1siKCIsbigidmFsdWUiKSwiKSJdOltdXTtjYXNlIkFzRXhwcmVzc2lvbiI6Y2FzZSJBc0NvbnN0RXhwcmVzc2lvbiI6Y2FzZSJTYXRpc2ZpZXNFeHByZXNzaW9uIjpyZXR1cm4gZEYoZSx0LG4pO2Nhc2UiTWF0Y2hFeHByZXNzaW9uIjpjYXNlIk1hdGNoU3RhdGVtZW50IjpyZXR1cm4geUIoZSx0LG4pO2Nhc2UiTWF0Y2hFeHByZXNzaW9uQ2FzZSI6Y2FzZSJNYXRjaFN0YXRlbWVudENhc2UiOnJldHVybiBEQihlLHQsbik7Y2FzZSJNYXRjaE9yUGF0dGVybiI6Y2FzZSJNYXRjaEFzUGF0dGVybiI6Y2FzZSJNYXRjaFdpbGRjYXJkUGF0dGVybiI6Y2FzZSJNYXRjaExpdGVyYWxQYXR0ZXJuIjpjYXNlIk1hdGNoVW5hcnlQYXR0ZXJuIjpjYXNlIk1hdGNoSWRlbnRpZmllclBhdHRlcm4iOmNhc2UiTWF0Y2hJbnN0YW5jZVBhdHRlcm4iOmNhc2UiTWF0Y2hJbnN0YW5jZU9iamVjdFBhdHRlcm4iOmNhc2UiTWF0Y2hNZW1iZXJQYXR0ZXJuIjpjYXNlIk1hdGNoQmluZGluZ1BhdHRlcm4iOmNhc2UiTWF0Y2hPYmplY3RQYXR0ZXJuIjpjYXNlIk1hdGNoT2JqZWN0UGF0dGVyblByb3BlcnR5IjpjYXNlIk1hdGNoUmVzdFBhdHRlcm4iOmNhc2UiTWF0Y2hBcnJheVBhdHRlcm4iOnJldHVybiBiQihlLHQsbik7Y2FzZSJSZWNvcmRFeHByZXNzaW9uIjpyZXR1cm5bbigicmVjb3JkQ29uc3RydWN0b3IiKSxuKCJ0eXBlQXJndW1lbnRzIiksIiAiLG4oInByb3BlcnRpZXMiKV07Y2FzZSJSZWNvcmRFeHByZXNzaW9uUHJvcGVydGllcyI6cmV0dXJuIExvKGUsdCxuKTtjYXNlIlJlY29yZERlY2xhcmF0aW9uUHJvcGVydHkiOmNhc2UiUmVjb3JkRGVjbGFyYXRpb25TdGF0aWNQcm9wZXJ0eSI6e2xldCBpPXMudHlwZT09PSJSZWNvcmREZWNsYXJhdGlvblN0YXRpY1Byb3BlcnR5IixvPWk/InZhbHVlIjoiZGVmYXVsdFZhbHVlIjtyZXR1cm5baT8ic3RhdGljICI6IiIsQXMoZSx0LG4pLGR0KGUsbiksc1tvXT9bIiA9ICIsbihvKV06IiJdfX19ZnVuY3Rpb24ga0IoZSx0KXtsZXR7bm9kZTpufT1lLHI9dC5vcmlnaW5hbFRleHQuc2xpY2UoZWUobiksWChuKSk7cmV0dXJuIHQuc2VtaSYmWWgobik/cis9IjsiOk9kKGUsdCkmJihyPWA7JHtyfWApLG4udHlwZT09PSJDbGFzc0V4cHJlc3Npb24iJiZTZShuLmRlY29yYXRvcnMpP1tPKFtQLHJdKSxQXTpyfXZhciBzbT1lPT5lPT09IiJ8fGU9PT1IfHxlPT09Unx8ZT09PVA7ZnVuY3Rpb24gVEIoZSx0LG4pe3ZhciBFLEYsdixDLEE7bGV0e25vZGU6cn09ZTtpZihyLnR5cGU9PT0iSlNYRWxlbWVudCImJkhCKHIpKXJldHVybltuKCJvcGVuaW5nRWxlbWVudCIpLG4oImNsb3NpbmdFbGVtZW50IildO2xldCBzPXIudHlwZT09PSJKU1hFbGVtZW50Ij9uKCJvcGVuaW5nRWxlbWVudCIpOm4oIm9wZW5pbmdGcmFnbWVudCIpLGk9ci50eXBlPT09IkpTWEVsZW1lbnQiP24oImNsb3NpbmdFbGVtZW50Iik6bigiY2xvc2luZ0ZyYWdtZW50Iik7aWYoci5jaGlsZHJlbi5sZW5ndGg9PT0xJiZyLmNoaWxkcmVuWzBdLnR5cGU9PT0iSlNYRXhwcmVzc2lvbkNvbnRhaW5lciImJihyLmNoaWxkcmVuWzBdLmV4cHJlc3Npb24udHlwZT09PSJUZW1wbGF0ZUxpdGVyYWwifHxyLmNoaWxkcmVuWzBdLmV4cHJlc3Npb24udHlwZT09PSJUYWdnZWRUZW1wbGF0ZUV4cHJlc3Npb24iKSlyZXR1cm5bcywuLi5lLm1hcChuLCJjaGlsZHJlbiIpLGldO3IuY2hpbGRyZW49ci5jaGlsZHJlbi5tYXAodz0+SkIodyk/e3R5cGU6IkpTWFRleHQiLHZhbHVlOiIgIixyYXc6IiAifTp3KTtsZXQgbz1yLmNoaWxkcmVuLnNvbWUoY3QpLGE9ci5jaGlsZHJlbi5maWx0ZXIodz0+dy50eXBlPT09IkpTWEV4cHJlc3Npb25Db250YWluZXIiKS5sZW5ndGg+MSx1PXIudHlwZT09PSJKU1hFbGVtZW50IiYmci5vcGVuaW5nRWxlbWVudC5hdHRyaWJ1dGVzLmxlbmd0aD4xLGw9VHQocyl8fG98fHV8fGEsZj1lLnBhcmVudC5yb290TWFya2VyPT09Im1keCIsYz10LnNpbmdsZVF1b3RlPyJ7JyAnfSI6J3siICJ9JyxwPWY/SDp1ZShbYyxQXSwiICIpLGg9KChGPShFPXIub3BlbmluZ0VsZW1lbnQpPT1udWxsP3ZvaWQgMDpFLm5hbWUpPT1udWxsP3ZvaWQgMDpGLm5hbWUpPT09ImZidCIsZD1OQihlLHQsbixwLGgpLG09ci5jaGlsZHJlbi5zb21lKHc9Pm51KHcpKTtmb3IobGV0IHc9ZC5sZW5ndGgtMjt3Pj0wO3ctLSl7bGV0IFQ9ZFt3XT09PSIiJiZkW3crMV09PT0iIixOPWRbd109PT1SJiZkW3crMV09PT0iIiYmZFt3KzJdPT09Uix4PShkW3ddPT09UHx8ZFt3XT09PVIpJiZkW3crMV09PT0iIiYmZFt3KzJdPT09cCxMPWRbd109PT1wJiZkW3crMV09PT0iIiYmKGRbdysyXT09PVB8fGRbdysyXT09PVIpLFM9ZFt3XT09PXAmJmRbdysxXT09PSIiJiZkW3crMl09PT1wLGs9ZFt3XT09PVAmJmRbdysxXT09PSIiJiZkW3crMl09PT1SfHxkW3ddPT09UiYmZFt3KzFdPT09IiImJmRbdysyXT09PVA7TiYmbXx8VHx8eHx8U3x8az9kLnNwbGljZSh3LDIpOkwmJmQuc3BsaWNlKHcrMSwyKX1mb3IoO2QubGVuZ3RoPjAmJnNtKGNlKDAsZCwtMSkpOylkLnBvcCgpO2Zvcig7ZC5sZW5ndGg+MSYmc20oZFswXSkmJnNtKGRbMV0pOylkLnNoaWZ0KCksZC5zaGlmdCgpO2xldCBnPVsiIl07Zm9yKGxldFt3LFRdb2YgZC5lbnRyaWVzKCkpe2lmKFQ9PT1wKXtpZih3PT09MSYmQzUoZFt3LTFdKSl7aWYoZC5sZW5ndGg9PT0yKXtnLnB1c2goW2cucG9wKCksY10pO2NvbnRpbnVlfWcucHVzaChbYyxSXSwiIik7Y29udGludWV9aWYodz09PWQubGVuZ3RoLTEpe2cucHVzaChbZy5wb3AoKSxjXSk7Y29udGludWV9aWYoZFt3LTFdPT09IiImJmRbdy0yXT09PVIpe2cucHVzaChbZy5wb3AoKSxjXSk7Y29udGludWV9fXclMj09PTA/Zy5wdXNoKFtnLnBvcCgpLFRdKTpnLnB1c2goVCwiIiksVHQoVCkmJihsPSEwKX1sZXQgRD1tP21FKGcpOl8oZyx7c2hvdWxkQnJlYWs6ITB9KTtpZigoKHY9dC5jdXJzb3JOb2RlKT09bnVsbD92b2lkIDA6di50eXBlKT09PSJKU1hUZXh0IiYmci5jaGlsZHJlbi5pbmNsdWRlcyh0LmN1cnNvck5vZGUpP0Q9W2djLEQsZ2NdOigoQz10Lm5vZGVCZWZvcmVDdXJzb3IpPT1udWxsP3ZvaWQgMDpDLnR5cGUpPT09IkpTWFRleHQiJiZyLmNoaWxkcmVuLmluY2x1ZGVzKHQubm9kZUJlZm9yZUN1cnNvcik/RD1bZ2MsRF06KChBPXQubm9kZUFmdGVyQ3Vyc29yKT09bnVsbD92b2lkIDA6QS50eXBlKT09PSJKU1hUZXh0IiYmci5jaGlsZHJlbi5pbmNsdWRlcyh0Lm5vZGVBZnRlckN1cnNvcikmJihEPVtELGdjXSksZilyZXR1cm4gRDtsZXQgYj1fKFtzLE8oW1IsRF0pLFIsaV0pO3JldHVybiBsP2I6dWkoW18oW3MsLi4uZCxpXSksYl0pfWZ1bmN0aW9uIE5CKGUsdCxuLHIscyl7bGV0IGk9IiIsbz1baV07ZnVuY3Rpb24gYShsKXtpPWwsby5wdXNoKFtvLnBvcCgpLGxdKX1mdW5jdGlvbiB1KGwpe2whPT0iIiYmKGk9bCxvLnB1c2gobCwiIikpfXJldHVybiBlLmVhY2goKHtub2RlOmwsbmV4dDpmfSk9PntpZihsLnR5cGU9PT0iSlNYVGV4dCIpe2xldCBjPVF0KGwpO2lmKG51KGwpKXtsZXQgcD14Yy5zcGxpdChjLCEwKTtwWzBdPT09IiImJihwLnNoaWZ0KCksL1xuLy50ZXN0KHBbMF0pP3UoTEYocyxwWzFdLGwsZikpOnUocikscC5zaGlmdCgpKTtsZXQgaDtpZihjZSgwLHAsLTEpPT09IiImJihwLnBvcCgpLGg9cC5wb3AoKSkscC5sZW5ndGg9PT0wKXJldHVybjtmb3IobGV0W2QsbV1vZiBwLmVudHJpZXMoKSlkJTI9PT0xP3UoSCk6YShtKTtoIT09dm9pZCAwPy9cbi8udGVzdChoKT91KExGKHMsaSxsLGYpKTp1KHIpOnUoTkYocyxpLGwsZikpfWVsc2UvXG4vLnRlc3QoYyk/Yy5tYXRjaCgvXG4vZykubGVuZ3RoPjEmJnUoUik6dShyKX1lbHNle2xldCBjPW4oKTtpZihhKGMpLGYmJm51KGYpKXtsZXQgcD14Yy50cmltKFF0KGYpKSxbaF09eGMuc3BsaXQocCk7dShORihzLGgsbCxmKSl9ZWxzZSB1KFIpfX0sImNoaWxkcmVuIiksb31mdW5jdGlvbiBORihlLHQsbixyKXtyZXR1cm4gZT8iIjpuLnR5cGU9PT0iSlNYRWxlbWVudCImJiFuLmNsb3NpbmdFbGVtZW50fHwocj09bnVsbD92b2lkIDA6ci50eXBlKT09PSJKU1hFbGVtZW50IiYmIXIuY2xvc2luZ0VsZW1lbnQ/dC5sZW5ndGg9PT0xP1A6UjpQfWZ1bmN0aW9uIExGKGUsdCxuLHIpe3JldHVybiBlP1I6dC5sZW5ndGg9PT0xP24udHlwZT09PSJKU1hFbGVtZW50IiYmIW4uY2xvc2luZ0VsZW1lbnR8fChyPT1udWxsP3ZvaWQgMDpyLnR5cGUpPT09IkpTWEVsZW1lbnQiJiYhci5jbG9zaW5nRWxlbWVudD9SOlA6Un12YXIgTEI9SyhbIkFycmF5RXhwcmVzc2lvbiIsIkpTWEF0dHJpYnV0ZSIsIkpTWEVsZW1lbnQiLCJKU1hFeHByZXNzaW9uQ29udGFpbmVyIiwiSlNYRnJhZ21lbnQiLCJFeHByZXNzaW9uU3RhdGVtZW50IiwiTmV3RXhwcmVzc2lvbiIsIkNhbGxFeHByZXNzaW9uIiwiT3B0aW9uYWxDYWxsRXhwcmVzc2lvbiIsIkNvbmRpdGlvbmFsRXhwcmVzc2lvbiIsIkpzRXhwcmVzc2lvblJvb3QiLCJNYXRjaEV4cHJlc3Npb25DYXNlIl0pO2Z1bmN0aW9uICRCKGUsdCxuKXtsZXR7cGFyZW50OnJ9PWU7aWYoTEIocikpcmV0dXJuIHQ7bGV0IHM9QkIoZSksaT10bihlLG4pO3JldHVybiBfKFtpPyIiOnVlKCIoIiksTyhbUCx0XSksUCxpPyIiOnVlKCIpIildLHtzaG91bGRCcmVhazpzfSl9ZnVuY3Rpb24gQkIoZSl7cmV0dXJuIGUubWF0Y2godm9pZCAwLCh0LG4pPT5uPT09ImJvZHkiJiZ0LnR5cGU9PT0iQXJyb3dGdW5jdGlvbkV4cHJlc3Npb24iLCh0LG4pPT5uPT09ImFyZ3VtZW50cyImJnZlKHQpKSYmKGUubWF0Y2godm9pZCAwLHZvaWQgMCx2b2lkIDAsKHQsbik9Pm49PT0iZXhwcmVzc2lvbiImJnQudHlwZT09PSJKU1hFeHByZXNzaW9uQ29udGFpbmVyIil8fGUubWF0Y2godm9pZCAwLHZvaWQgMCx2b2lkIDAsKHQsbik9Pm49PT0iZXhwcmVzc2lvbiImJnQudHlwZT09PSJDaGFpbkV4cHJlc3Npb24iLCh0LG4pPT5uPT09ImV4cHJlc3Npb24iJiZ0LnR5cGU9PT0iSlNYRXhwcmVzc2lvbkNvbnRhaW5lciIpKX1mdW5jdGlvbiBfQihlLHQsbil7bGV0e25vZGU6cn09ZSxzPVtuKCJuYW1lIildO2lmKHIudmFsdWUpe2xldCBpO2lmKHN0KHIudmFsdWUpKXtsZXQgbz1RdChyLnZhbHVlKSxhPWZ0KDAsZnQoMCxvLnNsaWNlKDEsLTEpLCImYXBvczsiLCInIiksIiZxdW90OyIsJyInKSx1PVBFKGEsdC5qc3hTaW5nbGVRdW90ZSk7YT11PT09JyInP2Z0KDAsYSwnIicsIiZxdW90OyIpOmZ0KDAsYSwiJyIsIiZhcG9zOyIpLGk9ZS5jYWxsKCgpPT5GdChlLGFpKHUrYSt1KSx0KSwidmFsdWUiKX1lbHNlIGk9bigidmFsdWUiKTtzLnB1c2goIj0iLGkpfXJldHVybiBzfWZ1bmN0aW9uIElCKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9KGksbyk9PmkudHlwZT09PSJKU1hFbXB0eUV4cHJlc3Npb24ifHwhcShpKSYmKGh0KGkpfHxXbihpKXx8aS50eXBlPT09IkFycm93RnVuY3Rpb25FeHByZXNzaW9uInx8aS50eXBlPT09IkF3YWl0RXhwcmVzc2lvbiImJihzKGkuYXJndW1lbnQsaSl8fGkuYXJndW1lbnQudHlwZT09PSJKU1hFbGVtZW50Iil8fHZlKERzKGkpKXx8aS50eXBlPT09IkZ1bmN0aW9uRXhwcmVzc2lvbiJ8fGkudHlwZT09PSJUZW1wbGF0ZUxpdGVyYWwifHxpLnR5cGU9PT0iVGFnZ2VkVGVtcGxhdGVFeHByZXNzaW9uInx8aS50eXBlPT09IkRvRXhwcmVzc2lvbiJ8fGN0KG8pJiYoaS50eXBlPT09IkNvbmRpdGlvbmFsRXhwcmVzc2lvbiJ8fFNyKGkpKSk7cmV0dXJuIHMoci5leHByZXNzaW9uLGUucGFyZW50KT9fKFsieyIsbigiZXhwcmVzc2lvbiIpLENuLCJ9Il0pOl8oWyJ7IixPKFtQLG4oImV4cHJlc3Npb24iKV0pLFAsQ24sIn0iXSl9ZnVuY3Rpb24gUEIoZSx0LG4pe3ZhciBhLHU7bGV0e25vZGU6cn09ZSxzPXEoci5uYW1lKXx8cShyLnR5cGVBcmd1bWVudHMpO2lmKHIuc2VsZkNsb3NpbmcmJnIuYXR0cmlidXRlcy5sZW5ndGg9PT0wJiYhcylyZXR1cm5bIjwiLG4oIm5hbWUiKSxuKCJ0eXBlQXJndW1lbnRzIiksIiAvPiJdO2lmKCgoYT1yLmF0dHJpYnV0ZXMpPT1udWxsP3ZvaWQgMDphLmxlbmd0aCk9PT0xJiZzdChyLmF0dHJpYnV0ZXNbMF0udmFsdWUpJiYhci5hdHRyaWJ1dGVzWzBdLnZhbHVlLnZhbHVlLmluY2x1ZGVzKGAKYCkmJiFzJiYhcShyLmF0dHJpYnV0ZXNbMF0pKXJldHVybiBfKFsiPCIsbigibmFtZSIpLG4oInR5cGVBcmd1bWVudHMiKSwiICIsLi4uZS5tYXAobiwiYXR0cmlidXRlcyIpLHIuc2VsZkNsb3Npbmc/IiAvPiI6Ij4iXSk7bGV0IGk9KHU9ci5hdHRyaWJ1dGVzKT09bnVsbD92b2lkIDA6dS5zb21lKGw9PnN0KGwudmFsdWUpJiZsLnZhbHVlLnZhbHVlLmluY2x1ZGVzKGAKYCkpLG89dC5zaW5nbGVBdHRyaWJ1dGVQZXJMaW5lJiZyLmF0dHJpYnV0ZXMubGVuZ3RoPjE/UjpIO3JldHVybiBfKFsiPCIsbigibmFtZSIpLG4oInR5cGVBcmd1bWVudHMiKSxPKGUubWFwKCh7aXNGaXJzdDpsLHByZXZpb3VzOmZ9KT0+W2w/bzpscihmLHQpP1tSLFJdOm8sbigpXSwiYXR0cmlidXRlcyIpKSwuLi5NQihyLHQscyldLHtzaG91bGRCcmVhazppfSl9ZnVuY3Rpb24gTUIoZSx0LG4pe3JldHVybiBlLnNlbGZDbG9zaW5nP1tILCIvPiJdOk9CKGUsdCxuKT9bIj4iXTpbUCwiPiJdfWZ1bmN0aW9uIE9CKGUsdCxuKXtsZXQgcj1lLmF0dHJpYnV0ZXMubGVuZ3RoPjAmJnEoY2UoMCxlLmF0dHJpYnV0ZXMsLTEpLHouVHJhaWxpbmcpO3JldHVybiBlLmF0dHJpYnV0ZXMubGVuZ3RoPT09MCYmIW58fCh0LmJyYWNrZXRTYW1lTGluZXx8dC5qc3hCcmFja2V0U2FtZUxpbmUpJiYoIW58fGUuYXR0cmlidXRlcy5sZW5ndGg+MCkmJiFyfWZ1bmN0aW9uIFJCKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9WyI8LyJdLGk9bigibmFtZSIpO3JldHVybiBxKHIubmFtZSx6LkxlYWRpbmd8ei5MaW5lKT9zLnB1c2goTyhbUixpXSksUik6cShyLm5hbWUsei5MZWFkaW5nfHouQmxvY2spP3MucHVzaCgiICIsaSk6cy5wdXNoKGkpLHMucHVzaCgiPiIpLHN9ZnVuY3Rpb24gakIoZSx0KXtsZXR7bm9kZTpufT1lLHI9cShuKSxzPXEobix6LkxpbmUpLGk9bi50eXBlPT09IkpTWE9wZW5pbmdGcmFnbWVudCI7cmV0dXJuW2k/IjwiOiI8LyIsTyhbcz9SOnImJiFpPyIgIjoiIixldChlLHQpXSkscz9SOiIiLCI+Il19ZnVuY3Rpb24gVkIoZSx0LG4pe2xldCByPUZ0KGUsVEIoZSx0LG4pLHQpO3JldHVybiAkQihlLHIsdCl9ZnVuY3Rpb24gVUIoZSx0KXtsZXR7bm9kZTpufT1lLHI9cShuLHouTGluZSk7cmV0dXJuW2V0KGUsdCx7aW5kZW50OnJ9KSxyP1I6IiJdfWZ1bmN0aW9uIHFCKGUsdCxuKXtsZXR7bm9kZTpyfT1lO3JldHVyblsieyIsZS5jYWxsKCh7bm9kZTpzfSk9PntsZXQgaT1bIi4uLiIsbigpXTtyZXR1cm4gcShzKT9bTyhbUCxGdChlLGksdCldKSxQXTppfSxyLnR5cGU9PT0iSlNYU3ByZWFkQXR0cmlidXRlIj8iYXJndW1lbnQiOiJleHByZXNzaW9uIiksIn0iXX1mdW5jdGlvbiBXQihlLHQsbil7bGV0e25vZGU6cn09ZTtpZihyLnR5cGUuc3RhcnRzV2l0aCgiSlNYIikpc3dpdGNoKHIudHlwZSl7Y2FzZSJKU1hBdHRyaWJ1dGUiOnJldHVybiBfQihlLHQsbik7Y2FzZSJKU1hJZGVudGlmaWVyIjpyZXR1cm4gci5uYW1lO2Nhc2UiSlNYTmFtZXNwYWNlZE5hbWUiOnJldHVybiBmZSgiOiIsW24oIm5hbWVzcGFjZSIpLG4oIm5hbWUiKV0pO2Nhc2UiSlNYTWVtYmVyRXhwcmVzc2lvbiI6cmV0dXJuIGZlKCIuIixbbigib2JqZWN0IiksbigicHJvcGVydHkiKV0pO2Nhc2UiSlNYU3ByZWFkQXR0cmlidXRlIjpjYXNlIkpTWFNwcmVhZENoaWxkIjpyZXR1cm4gcUIoZSx0LG4pO2Nhc2UiSlNYRXhwcmVzc2lvbkNvbnRhaW5lciI6cmV0dXJuIElCKGUsdCxuKTtjYXNlIkpTWEZyYWdtZW50IjpjYXNlIkpTWEVsZW1lbnQiOnJldHVybiBWQihlLHQsbik7Y2FzZSJKU1hPcGVuaW5nRWxlbWVudCI6cmV0dXJuIFBCKGUsdCxuKTtjYXNlIkpTWENsb3NpbmdFbGVtZW50IjpyZXR1cm4gUkIoZSx0LG4pO2Nhc2UiSlNYT3BlbmluZ0ZyYWdtZW50IjpjYXNlIkpTWENsb3NpbmdGcmFnbWVudCI6cmV0dXJuIGpCKGUsdCk7Y2FzZSJKU1hFbXB0eUV4cHJlc3Npb24iOnJldHVybiBVQihlLHQpO2Nhc2UiSlNYVGV4dCI6dGhyb3cgbmV3IEVycm9yKCJKU1hUZXh0IHNob3VsZCBiZSBoYW5kbGVkIGJ5IEpTWEVsZW1lbnQiKTtkZWZhdWx0OnRocm93IG5ldyBrbyhyLCJKU1giKX19ZnVuY3Rpb24gSEIoZSl7aWYoZS5jaGlsZHJlbi5sZW5ndGg9PT0wKXJldHVybiEwO2lmKGUuY2hpbGRyZW4ubGVuZ3RoPjEpcmV0dXJuITE7bGV0IHQ9ZS5jaGlsZHJlblswXTtyZXR1cm4gdC50eXBlPT09IkpTWFRleHQiJiYhbnUodCl9ZnVuY3Rpb24gSkIoZSl7cmV0dXJuIGUudHlwZT09PSJKU1hFeHByZXNzaW9uQ29udGFpbmVyIiYmc3QoZS5leHByZXNzaW9uKSYmZS5leHByZXNzaW9uLnZhbHVlPT09IiAiJiYhcShlLmV4cHJlc3Npb24pfWZ1bmN0aW9uIHpCKGUsdCxuKXtsZXR7bm9kZTpyfT1lLHM9ci5wYXJhbWV0ZXJzLmxlbmd0aD4xP0ZzKHQpOiIiLGk9XyhbTyhbUCxmZShbIiwgIixQXSxlLm1hcChuLCJwYXJhbWV0ZXJzIikpXSkscyxQXSk7cmV0dXJuW2Uua2V5PT09ImJvZHkiJiZlLnBhcmVudC50eXBlPT09IkNsYXNzQm9keSImJnIuc3RhdGljPyJzdGF0aWMgIjoiIixyLnJlYWRvbmx5PyJyZWFkb25seSAiOiIiLCJbIixyLnBhcmFtZXRlcnM/aToiIiwiXSIsZHQoZSxuKSwkcihlLHQpXX1mdW5jdGlvbiAkRihlLHQsbil7bGV0e25vZGU6cn09ZTtyZXR1cm5bci5wb3N0Zml4PyIiOm4sZHQoZSx0KSxyLnBvc3RmaXg/bjoiIl19ZnVuY3Rpb24gR0IoZSx0LG4pe2xldHtub2RlOnJ9PWUscz1bXSxpPXIua2luZCYmci5raW5kIT09Im1ldGhvZCI/YCR7ci5raW5kfSBgOiIiO3MucHVzaChGYyhyKSxpLEFzKGUsdCxuKSxOdChlKSk7bGV0IG89bGkoZSx0LG4sITEsITApLGE9ZHQoZSxuLCJyZXR1cm5UeXBlIiksdT1ZYShyLGEpO3JldHVybiBzLnB1c2godT9fKG8pOm8pLHIucmV0dXJuVHlwZSYmcy5wdXNoKF8oYSkpLFtfKHMpLCRyKGUsdCldfWZ1bmN0aW9uIEtCKGUsdCxuKXtsZXR7bm9kZTpyfT1lO3JldHVybltybihlKSxyLmtpbmQ9PT0iZ2xvYmFsIj8iIjpgJHtyLmtpbmR9IGAsbigiaWQiKSxyLmJvZHk/WyIgIixfKG4oImJvZHkiKSldOnFlKHQpXX1mdW5jdGlvbiBYQihlLHQsbil7bGV0e25vZGU6cn09ZSxzPSEoaHQoci5leHByZXNzaW9uKXx8V24oci5leHByZXNzaW9uKSksaT1fKFsiPCIsTyhbUCxuKCJ0eXBlQW5ub3RhdGlvbiIpXSksUCwiPiJdKSxvPVt1ZSgiKCIpLE8oW1AsbigiZXhwcmVzc2lvbiIpXSksUCx1ZSgiKSIpXTtyZXR1cm4gcz91aShbW2ksbigiZXhwcmVzc2lvbiIpXSxbaSxfKG8se3Nob3VsZEJyZWFrOiEwfSldLFtpLG4oImV4cHJlc3Npb24iKV1dKTpfKFtpLG4oImV4cHJlc3Npb24iKV0pfWZ1bmN0aW9uIFlCKGUsdCxuLHIpe2xldHtub2RlOnN9PWU7aWYocy50eXBlLnN0YXJ0c1dpdGgoIlRTIikpe2lmKFNFKHMpKXJldHVybiBzLnR5cGUuc2xpY2UoMiwtNykudG9Mb3dlckNhc2UoKTtzd2l0Y2gocy50eXBlKXtjYXNlIlRTVGhpc1R5cGUiOnJldHVybiJ0aGlzIjtjYXNlIlRTVHlwZUFzc2VydGlvbiI6cmV0dXJuIFhCKGUsdCxuKTtjYXNlIlRTRGVjbGFyZUZ1bmN0aW9uIjpyZXR1cm4gX2QoZSx0LG4pO2Nhc2UiVFNFeHBvcnRBc3NpZ25tZW50IjpyZXR1cm5bImV4cG9ydCA9ICIsbigiZXhwcmVzc2lvbiIpLHFlKHQpXTtjYXNlIlRTTW9kdWxlQmxvY2siOnJldHVybiBWdihlLHQsbik7Y2FzZSJUU0ludGVyZmFjZUJvZHkiOmNhc2UiVFNUeXBlTGl0ZXJhbCI6cmV0dXJuIEtkKGUsdCxuKTtjYXNlIlRTVHlwZUFsaWFzRGVjbGFyYXRpb24iOnJldHVybiBTRihlLHQsbik7Y2FzZSJUU1F1YWxpZmllZE5hbWUiOnJldHVybltuKCJsZWZ0IiksIi4iLG4oInJpZ2h0IildO2Nhc2UiVFNBYnN0cmFjdE1ldGhvZERlZmluaXRpb24iOmNhc2UiVFNEZWNsYXJlTWV0aG9kIjpyZXR1cm4gS3YoZSx0LG4pO2Nhc2UiVFNBYnN0cmFjdEFjY2Vzc29yUHJvcGVydHkiOmNhc2UiVFNBYnN0cmFjdFByb3BlcnR5RGVmaW5pdGlvbiI6cmV0dXJuIFh2KGUsdCxuKTtjYXNlIlRTSW50ZXJmYWNlSGVyaXRhZ2UiOmNhc2UiVFNDbGFzc0ltcGxlbWVudHMiOmNhc2UiVFNJbnN0YW50aWF0aW9uRXhwcmVzc2lvbiI6cmV0dXJuW24oImV4cHJlc3Npb24iKSxuKCJ0eXBlQXJndW1lbnRzIildO2Nhc2UiVFNUZW1wbGF0ZUxpdGVyYWxUeXBlIjpyZXR1cm4gZXYoZSx0LG4pO2Nhc2UiVFNOYW1lZFR1cGxlTWVtYmVyIjpyZXR1cm4gQ0YoZSx0LG4pO2Nhc2UiVFNSZXN0VHlwZSI6cmV0dXJuIHdGKGUsdCxuKTtjYXNlIlRTT3B0aW9uYWxUeXBlIjpyZXR1cm5bbigidHlwZUFubm90YXRpb24iKSwiPyJdO2Nhc2UiVFNJbnRlcmZhY2VEZWNsYXJhdGlvbiI6cmV0dXJuIFhkKGUsdCxuKTtjYXNlIlRTVHlwZVBhcmFtZXRlckRlY2xhcmF0aW9uIjpjYXNlIlRTVHlwZVBhcmFtZXRlckluc3RhbnRpYXRpb24iOnJldHVybiBpdShlLHQsbiwicGFyYW1zIik7Y2FzZSJUU1R5cGVQYXJhbWV0ZXIiOnJldHVybiB4RihlLHQsbik7Y2FzZSJUU0FzRXhwcmVzc2lvbiI6Y2FzZSJUU1NhdGlzZmllc0V4cHJlc3Npb24iOnJldHVybiBkRihlLHQsbik7Y2FzZSJUU0FycmF5VHlwZSI6cmV0dXJuIGhGKG4pO2Nhc2UiVFNQcm9wZXJ0eVNpZ25hdHVyZSI6cmV0dXJuW3MucmVhZG9ubHk/InJlYWRvbmx5ICI6IiIsQXMoZSx0LG4pLE50KGUpLGR0KGUsbiksJHIoZSx0KV07Y2FzZSJUU1BhcmFtZXRlclByb3BlcnR5IjpyZXR1cm5bRmMocykscy5zdGF0aWM/InN0YXRpYyAiOiIiLHMub3ZlcnJpZGU/Im92ZXJyaWRlICI6IiIscy5yZWFkb25seT8icmVhZG9ubHkgIjoiIixuKCJwYXJhbWV0ZXIiKV07Y2FzZSJUU1R5cGVRdWVyeSI6cmV0dXJuIFRGKGUsbik7Y2FzZSJUU0luZGV4U2lnbmF0dXJlIjpyZXR1cm4gekIoZSx0LG4pO2Nhc2UiVFNUeXBlUHJlZGljYXRlIjpyZXR1cm4ga0YoZSxuKTtjYXNlIlRTTm9uTnVsbEV4cHJlc3Npb24iOnJldHVybltuKCJleHByZXNzaW9uIiksIiEiXTtjYXNlIlRTSW1wb3J0VHlwZSI6cmV0dXJuW1RjKGUsdCxuKSxzLnF1YWxpZmllcj9bIi4iLG4oInF1YWxpZmllciIpXToiIixpdShlLHQsbiwidHlwZUFyZ3VtZW50cyIpXTtjYXNlIlRTTGl0ZXJhbFR5cGUiOnJldHVybiBuKCJsaXRlcmFsIik7Y2FzZSJUU0luZGV4ZWRBY2Nlc3NUeXBlIjpyZXR1cm4gYkYoZSx0LG4pO2Nhc2UiVFNUeXBlT3BlcmF0b3IiOnJldHVybltzLm9wZXJhdG9yLCIgIixuKCJ0eXBlQW5ub3RhdGlvbiIpXTtjYXNlIlRTTWFwcGVkVHlwZSI6cmV0dXJuIGdCKGUsdCxuKTtjYXNlIlRTTWV0aG9kU2lnbmF0dXJlIjpyZXR1cm4gR0IoZSx0LG4pO2Nhc2UiVFNOYW1lc3BhY2VFeHBvcnREZWNsYXJhdGlvbiI6cmV0dXJuWyJleHBvcnQgYXMgbmFtZXNwYWNlICIsbigiaWQiKSxxZSh0KV07Y2FzZSJUU0VudW1EZWNsYXJhdGlvbiI6cmV0dXJuIGdGKGUsbik7Y2FzZSJUU0VudW1Cb2R5IjpyZXR1cm4gTG8oZSx0LG4pO2Nhc2UiVFNFbnVtTWVtYmVyIjpyZXR1cm4gbUYoZSx0LG4pO2Nhc2UiVFNJbXBvcnRFcXVhbHNEZWNsYXJhdGlvbiI6cmV0dXJuWyJpbXBvcnQgIixzRihzLCExKSxuKCJpZCIpLCIgPSAiLG4oIm1vZHVsZVJlZmVyZW5jZSIpLHFlKHQpXTtjYXNlIlRTRXh0ZXJuYWxNb2R1bGVSZWZlcmVuY2UiOnJldHVybiBUYyhlLHQsbik7Y2FzZSJUU01vZHVsZURlY2xhcmF0aW9uIjpyZXR1cm4gS0IoZSx0LG4pO2Nhc2UiVFNDb25kaXRpb25hbFR5cGUiOnJldHVybiBybShlLHQsbik7Y2FzZSJUU0luZmVyVHlwZSI6cmV0dXJuIEVGKGUsdCxuKTtjYXNlIlRTSW50ZXJzZWN0aW9uVHlwZSI6cmV0dXJuIHZGKGUsdCxuKTtjYXNlIlRTVW5pb25UeXBlIjpyZXR1cm4gSEUoZSx0LG4scik7Y2FzZSJUU0Z1bmN0aW9uVHlwZSI6Y2FzZSJUU0NhbGxTaWduYXR1cmVEZWNsYXJhdGlvbiI6Y2FzZSJUU0NvbnN0cnVjdG9yVHlwZSI6Y2FzZSJUU0NvbnN0cnVjdFNpZ25hdHVyZURlY2xhcmF0aW9uIjpyZXR1cm4geUYoZSx0LG4pO2Nhc2UiVFNUdXBsZVR5cGUiOnJldHVybiBIZChlLHQsbik7Y2FzZSJUU1R5cGVSZWZlcmVuY2UiOnJldHVybltuKCJ0eXBlTmFtZSIpLGl1KGUsdCxuLCJ0eXBlQXJndW1lbnRzIildO2Nhc2UiVFNUeXBlQW5ub3RhdGlvbiI6cmV0dXJuIHpFKGUsdCxuKTtjYXNlIlRTRW1wdHlCb2R5RnVuY3Rpb25FeHByZXNzaW9uIjpyZXR1cm4gUGQoZSx0LG4pO2Nhc2UiVFNKU0RvY0FsbFR5cGUiOnJldHVybiIqIjtjYXNlIlRTSlNEb2NVbmtub3duVHlwZSI6cmV0dXJuIj8iO2Nhc2UiVFNKU0RvY051bGxhYmxlVHlwZSI6cmV0dXJuICRGKGUsbiwiPyIpO2Nhc2UiVFNKU0RvY05vbk51bGxhYmxlVHlwZSI6cmV0dXJuICRGKGUsbiwiISIpO2RlZmF1bHQ6dGhyb3cgbmV3IGtvKHMsIlR5cGVTY3JpcHQiKX19fWZ1bmN0aW9uIFFCKGUsdCxuLHIpe2ZvcihsZXQgcyBvZltjTCxXQix4QixZQixpQl0pe2xldCBpPXMoZSx0LG4scik7aWYoaSE9PXZvaWQgMClyZXR1cm4gaX19dmFyIFpCPUsoWyJDbGFzc01ldGhvZCIsIkNsYXNzUHJpdmF0ZU1ldGhvZCIsIkNsYXNzUHJvcGVydHkiLCJDbGFzc0FjY2Vzc29yUHJvcGVydHkiLCJBY2Nlc3NvclByb3BlcnR5IiwiVFNBYnN0cmFjdEFjY2Vzc29yUHJvcGVydHkiLCJQcm9wZXJ0eURlZmluaXRpb24iLCJUU0Fic3RyYWN0UHJvcGVydHlEZWZpbml0aW9uIiwiQ2xhc3NQcml2YXRlUHJvcGVydHkiLCJNZXRob2REZWZpbml0aW9uIiwiVFNBYnN0cmFjdE1ldGhvZERlZmluaXRpb24iLCJUU0RlY2xhcmVNZXRob2QiXSk7ZnVuY3Rpb24gQkYoZSx0LG4scil7dmFyIHU7ZS5pc1Jvb3QmJigodT10Ll9fb25IdG1sQmluZGluZ1Jvb3QpPT1udWxsfHx1LmNhbGwodCxlLm5vZGUsdCkpO2xldHtub2RlOnN9PWUsaT1xZChlKT9rQihlLHQpOlFCKGUsdCxuLHIpO2lmKCFpKXJldHVybiIiO2lmKFpCKHMpKXJldHVybiBpO2k9ZV8oZSx0LGkpO2xldCBvPXMudHlwZSE9PSJDbGFzc0V4cHJlc3Npb24iJiZTZShzLmRlY29yYXRvcnMpP3Z2KGUsdCxuKToiIixhPXRuKGUsdCk7cmV0dXJuIW8mJiFhP2k6aEUoaSxsPT5bYT8iKCI6IiIsbz9fKFtvLGxdKTpsLGE/IikiOiIiXSl9ZnVuY3Rpb24gZV8oZSx0LG4pe2xldHtub2RlOnJ9PWU7cmV0dXJuKHEocix6LkxlYWRpbmcpfHxxKHIsei5UcmFpbGluZykpJiZaYihlKT9bTyhbUCxGdChlLG4sdCldKSxQXTpufXZhciB0Xz17ZXhwZXJpbWVudGFsX2F2b2lkQXN0TXV0YXRpb246ITAsZXhwZXJpbWVudGFsX2xvY0ZvclJhbmdlRm9ybWF0Ontsb2NTdGFydDplZSxsb2NFbmQ6bGN9fSxfRj17ZmVhdHVyZXM6dF8sbWFzc2FnZUFzdE5vZGU6bHYsY2FuQXR0YWNoQ29tbWVudDpWayxoYW5kbGVDb21tZW50czpPVCxpc0dhcDpqVCx3aWxsUHJpbnRPd25Db21tZW50czpZTixlbWJlZDpONCxpbnNlcnRQcmFnbWE6WDQscHJpbnRDb21tZW50Olo0LHByaW50UHJldHRpZXJJZ25vcmVkOkJGLHByaW50OkJGLGdldFZpc2l0b3JLZXlzOnNFLGlzQmxvY2tDb21tZW50OkhuLGhhc1ByZXR0aWVySWdub3JlOnFkfSxuXz1be25hbWU6IkpTT04uc3RyaW5naWZ5Iix0eXBlOiJkYXRhIixhY2VNb2RlOiJqc29uIixleHRlbnNpb25zOlsiLmltcG9ydG1hcCJdLGZpbGVuYW1lczpbInBhY2thZ2UuanNvbiIsInBhY2thZ2UtbG9jay5qc29uIiwiY29tcG9zZXIuanNvbiJdLHRtU2NvcGU6InNvdXJjZS5qc29uIixhbGlhc2VzOlsiZ2VvanNvbiIsImpzb25sIiwic2FyaWYiLCJ0b3BvanNvbiJdLGNvZGVtaXJyb3JNb2RlOiJqYXZhc2NyaXB0Iixjb2RlbWlycm9yTWltZVR5cGU6ImFwcGxpY2F0aW9uL2pzb24iLHBhcnNlcnM6WyJqc29uLXN0cmluZ2lmeSJdLHZzY29kZUxhbmd1YWdlSWRzOlsianNvbiJdLGxpbmd1aXN0TGFuZ3VhZ2VJZDoxNzR9LHtuYW1lOiJKU09OIix0eXBlOiJkYXRhIixhY2VNb2RlOiJqc29uIixleHRlbnNpb25zOlsiLmpzb24iLCIuNERGb3JtIiwiLjREUHJvamVjdCIsIi5hdnNjIiwiLmdlb2pzb24iLCIuZ2x0ZiIsIi5oYXIiLCIuaWNlIiwiLkpTT04tdG1MYW5ndWFnZSIsIi5qc29uLmV4YW1wbGUiLCIubWNtZXRhIiwiLnNhcmlmIiwiLnNsbmxhdW5jaCIsIi50YWN0IiwiLnRmc3RhdGUiLCIudGZzdGF0ZS5iYWNrdXAiLCIudG9wb2pzb24iLCIud2ViYXBwIiwiLndlYm1hbmlmZXN0IiwiLnl5IiwiLnl5cCJdLGZpbGVuYW1lczpbIi5hbGwtY29udHJpYnV0b3JzcmMiLCIuYXJjY29uZmlnIiwiLmF1dG8tY2hhbmdlbG9nIiwiLmM4cmMiLCIuaHRtbGhpbnRyYyIsIi5pbWdib3Rjb25maWciLCIubnljcmMiLCIudGVybi1jb25maWciLCIudGVybi1wcm9qZWN0IiwiLndhdGNobWFuY29uZmlnIiwiLmJhYmVscmMiLCIuanNjc3JjIiwiLmpzaGludHJjIiwiLmpzbGludHJjIiwiLnN3Y3JjIl0sdG1TY29wZToic291cmNlLmpzb24iLGFsaWFzZXM6WyJnZW9qc29uIiwianNvbmwiLCJzYXJpZiIsInRvcG9qc29uIl0sY29kZW1pcnJvck1vZGU6ImphdmFzY3JpcHQiLGNvZGVtaXJyb3JNaW1lVHlwZToiYXBwbGljYXRpb24vanNvbiIscGFyc2VyczpbImpzb24iXSx2c2NvZGVMYW5ndWFnZUlkczpbImpzb24iXSxsaW5ndWlzdExhbmd1YWdlSWQ6MTc0fSx7bmFtZToiSlNPTiB3aXRoIENvbW1lbnRzIix0eXBlOiJkYXRhIixhY2VNb2RlOiJqYXZhc2NyaXB0IixleHRlbnNpb25zOlsiLmpzb25jIiwiLmNvZGUtc25pcHBldHMiLCIuY29kZS13b3Jrc3BhY2UiLCIuc3VibGltZS1idWlsZCIsIi5zdWJsaW1lLWNvbG9yLXNjaGVtZSIsIi5zdWJsaW1lLWNvbW1hbmRzIiwiLnN1YmxpbWUtY29tcGxldGlvbnMiLCIuc3VibGltZS1rZXltYXAiLCIuc3VibGltZS1tYWNybyIsIi5zdWJsaW1lLW1lbnUiLCIuc3VibGltZS1tb3VzZW1hcCIsIi5zdWJsaW1lLXByb2plY3QiLCIuc3VibGltZS1zZXR0aW5ncyIsIi5zdWJsaW1lLXRoZW1lIiwiLnN1YmxpbWUtd29ya3NwYWNlIiwiLnN1YmxpbWVfbWV0cmljcyIsIi5zdWJsaW1lX3Nlc3Npb24iXSxmaWxlbmFtZXM6W10sdG1TY29wZToic291cmNlLmpzb24uY29tbWVudHMiLGFsaWFzZXM6WyJqc29uYyJdLGNvZGVtaXJyb3JNb2RlOiJqYXZhc2NyaXB0Iixjb2RlbWlycm9yTWltZVR5cGU6InRleHQvamF2YXNjcmlwdCIsZ3JvdXA6IkpTT04iLHBhcnNlcnM6WyJqc29uYyJdLHZzY29kZUxhbmd1YWdlSWRzOlsianNvbmMiXSxsaW5ndWlzdExhbmd1YWdlSWQ6NDIzfSx7bmFtZToiSlNPTjUiLHR5cGU6ImRhdGEiLGFjZU1vZGU6Impzb241IixleHRlbnNpb25zOlsiLmpzb241Il0sdG1TY29wZToic291cmNlLmpzIixjb2RlbWlycm9yTW9kZToiamF2YXNjcmlwdCIsY29kZW1pcnJvck1pbWVUeXBlOiJhcHBsaWNhdGlvbi9qc29uIixwYXJzZXJzOlsianNvbjUiXSx2c2NvZGVMYW5ndWFnZUlkczpbImpzb241Il0sbGluZ3Vpc3RMYW5ndWFnZUlkOjE3NX1dLElGPXt9O0doKElGLHtlc3RyZWU6KCk9Pl9GLCJlc3RyZWUtanNvbiI6KCk9PnVffSk7dmFyIHJfPXtKc29uUm9vdDpbIm5vZGUiXSxBcnJheUV4cHJlc3Npb246WyJlbGVtZW50cyJdLE9iamVjdEV4cHJlc3Npb246WyJwcm9wZXJ0aWVzIl0sT2JqZWN0UHJvcGVydHk6WyJrZXkiLCJ2YWx1ZSJdLFVuYXJ5RXhwcmVzc2lvbjpbImFyZ3VtZW50Il0sTnVsbExpdGVyYWw6W10sQm9vbGVhbkxpdGVyYWw6W10sU3RyaW5nTGl0ZXJhbDpbXSxOdW1lcmljTGl0ZXJhbDpbXSxJZGVudGlmaWVyOltdLFRlbXBsYXRlTGl0ZXJhbDpbInF1YXNpcyJdLFRlbXBsYXRlRWxlbWVudDpbXX0sc189ckUocl8pLGlfPXNfO2Z1bmN0aW9uIGltKGUpe3JldHVybiBlLmV4dHJhLnJhd312YXIgb189bmV3IFNldChbInN0YXJ0IiwiZW5kIiwibG9jIiwiY29tbWVudHMiLCJsZWFkaW5nQ29tbWVudHMiLCJ0cmFpbGluZ0NvbW1lbnRzIiwiaW5uZXJDb21tZW50cyIsImVycm9ycyIsInJhbmdlIiwidG9rZW5zIl0pO2Z1bmN0aW9uIFBGKGUsdCl7dmFyIHI7bGV0e3R5cGU6bn09ZTtpZihuPT09Ik9iamVjdFByb3BlcnR5Iil7bGV0e2tleTpzfT1lO2lmKHMudHlwZT09PSJJZGVudGlmaWVyIil7bGV0e25hbWU6aX09czt0LmtleT17dHlwZToiU3RyaW5nTGl0ZXJhbCIsdmFsdWU6aSxleHRyYTp7cmF3VmFsdWU6aX19fWVsc2UgaWYocy50eXBlPT09Ik51bWVyaWNMaXRlcmFsIil7bGV0IGk9aW0ocyk7U3RyaW5nKE51bWJlcihpKSk9PT1pJiYodC5rZXk9e3R5cGU6IlN0cmluZ0xpdGVyYWwiLHZhbHVlOmksZXh0cmE6e3Jhd1ZhbHVlOml9fSl9fWlmKG49PT0iU3RyaW5nTGl0ZXJhbCImJmRlbGV0ZSB0LmV4dHJhLnJhdyxuPT09IlVuYXJ5RXhwcmVzc2lvbiImJmUub3BlcmF0b3I9PT0iKyIpcmV0dXJuIHQuYXJndW1lbnQ7aWYoKG49PT0iQXJyYXlFeHByZXNzaW9uInx8bj09PSJPYmplY3RFeHByZXNzaW9uIikmJih0LmV4dHJhPz8odC5leHRyYT17fSksKHI9ZS5leHRyYSkhPW51bGwmJnIudHJhaWxpbmdDb21tYSYmZGVsZXRlIHQuZXh0cmEudHJhaWxpbmdDb21tYSksbj09PSJBcnJheUV4cHJlc3Npb24iKXtmb3IobGV0W3MsaV1vZiBlLmVsZW1lbnRzLmVudHJpZXMoKSlpPT09bnVsbCYmdC5lbGVtZW50cy5zcGxpY2UocywwLHt0eXBlOiJOdWxsTGl0ZXJhbCJ9KTtyZXR1cm59aWYobj09PSJUZW1wbGF0ZUxpdGVyYWwiKXtsZXQgcz1lLnF1YXNpc1swXS52YWx1ZS5jb29rZWQ7cmV0dXJue3R5cGU6IlN0cmluZ0xpdGVyYWwiLHZhbHVlOnMsZXh0cmE6e3Jhd1ZhbHVlOnN9fX19UEYuaWdub3JlZFByb3BlcnRpZXM9b187ZnVuY3Rpb24gYV8oZSx0LG4pe2xldHtub2RlOnJ9PWU7c3dpdGNoKHIudHlwZSl7Y2FzZSJKc29uUm9vdCI6cmV0dXJuW24oIm5vZGUiKSxSXTtjYXNlIkFycmF5RXhwcmVzc2lvbiI6e2lmKHIuZWxlbWVudHMubGVuZ3RoPT09MClyZXR1cm4iW10iO2xldCBzPWUubWFwKCgpPT5lLm5vZGU9PT1udWxsPyJudWxsIjpuKCksImVsZW1lbnRzIik7cmV0dXJuWyJbIixPKFtSLGZlKFsiLCIsUl0scyldKSxSLCJdIl19Y2FzZSJPYmplY3RFeHByZXNzaW9uIjpyZXR1cm4gci5wcm9wZXJ0aWVzLmxlbmd0aD09PTA/Int9IjpbInsiLE8oW1IsZmUoWyIsIixSXSxlLm1hcChuLCJwcm9wZXJ0aWVzIikpXSksUiwifSJdO2Nhc2UiT2JqZWN0UHJvcGVydHkiOnJldHVybltuKCJrZXkiKSwiOiAiLG4oInZhbHVlIildO2Nhc2UiVW5hcnlFeHByZXNzaW9uIjpyZXR1cm5bci5vcGVyYXRvcj09PSIrIj8iIjpyLm9wZXJhdG9yLG4oImFyZ3VtZW50IildO2Nhc2UiTnVsbExpdGVyYWwiOnJldHVybiJudWxsIjtjYXNlIkJvb2xlYW5MaXRlcmFsIjpyZXR1cm4gci52YWx1ZT8idHJ1ZSI6ImZhbHNlIjtjYXNlIlN0cmluZ0xpdGVyYWwiOnJldHVybiBjaShpbShyKSx0KTtjYXNlIk51bWVyaWNMaXRlcmFsIjp7bGV0IHM9aW0ocik7cmV0dXJuIE1GKGUpJiZTdHJpbmcoTnVtYmVyKHMpKT09PXM/YCIke3N9ImA6c31jYXNlIklkZW50aWZpZXIiOnJldHVybiBNRihlKT9KU09OLnN0cmluZ2lmeShyLm5hbWUpOnIubmFtZTtjYXNlIlRlbXBsYXRlTGl0ZXJhbCI6cmV0dXJuIG4oWyJxdWFzaXMiLDBdKTtjYXNlIlRlbXBsYXRlRWxlbWVudCI6cmV0dXJuIEpTT04uc3RyaW5naWZ5KHIudmFsdWUuY29va2VkKTtkZWZhdWx0OnRocm93IG5ldyBrbyhyLCJKU09OIil9fWZ1bmN0aW9uIE1GKGUpe3JldHVybiBlLmtleT09PSJrZXkiJiZlLnBhcmVudC50eXBlPT09Ik9iamVjdFByb3BlcnR5In12YXIgdV89e21hc3NhZ2VBc3ROb2RlOlBGLHByaW50OmFfLGdldFZpc2l0b3JLZXlzOmlffSxvdT17YnJhY2tldFNwYWNpbmc6e2NhdGVnb3J5OiJDb21tb24iLHR5cGU6ImJvb2xlYW4iLGRlZmF1bHQ6ITAsZGVzY3JpcHRpb246IlByaW50IHNwYWNlcyBiZXR3ZWVuIGJyYWNrZXRzLiIsb3Bwb3NpdGVEZXNjcmlwdGlvbjoiRG8gbm90IHByaW50IHNwYWNlcyBiZXR3ZWVuIGJyYWNrZXRzLiJ9LG9iamVjdFdyYXA6e2NhdGVnb3J5OiJDb21tb24iLHR5cGU6ImNob2ljZSIsZGVmYXVsdDoicHJlc2VydmUiLGRlc2NyaXB0aW9uOiJIb3cgdG8gd3JhcCBvYmplY3QgbGl0ZXJhbHMuIixjaG9pY2VzOlt7dmFsdWU6InByZXNlcnZlIixkZXNjcmlwdGlvbjoiS2VlcCBhcyBtdWx0aS1saW5lLCBpZiB0aGVyZSBpcyBhIG5ld2xpbmUgYmV0d2VlbiB0aGUgb3BlbmluZyBicmFjZSBhbmQgZmlyc3QgcHJvcGVydHkuIn0se3ZhbHVlOiJjb2xsYXBzZSIsZGVzY3JpcHRpb246IkZpdCB0byBhIHNpbmdsZSBsaW5lIHdoZW4gcG9zc2libGUuIn1dfSxzaW5nbGVRdW90ZTp7Y2F0ZWdvcnk6IkNvbW1vbiIsdHlwZToiYm9vbGVhbiIsZGVmYXVsdDohMSxkZXNjcmlwdGlvbjoiVXNlIHNpbmdsZSBxdW90ZXMgaW5zdGVhZCBvZiBkb3VibGUgcXVvdGVzLiJ9LGJyYWNrZXRTYW1lTGluZTp7Y2F0ZWdvcnk6IkNvbW1vbiIsdHlwZToiYm9vbGVhbiIsZGVmYXVsdDohMSxkZXNjcmlwdGlvbjoiUHV0ID4gb2Ygb3BlbmluZyB0YWdzIG9uIHRoZSBsYXN0IGxpbmUgaW5zdGVhZCBvZiBvbiBhIG5ldyBsaW5lLiJ9LHNpbmdsZUF0dHJpYnV0ZVBlckxpbmU6e2NhdGVnb3J5OiJDb21tb24iLHR5cGU6ImJvb2xlYW4iLGRlZmF1bHQ6ITEsZGVzY3JpcHRpb246IkVuZm9yY2Ugc2luZ2xlIGF0dHJpYnV0ZSBwZXIgbGluZSBpbiBIVE1MLCBWdWUgYW5kIEpTWC4ifX0sd3M9IkphdmFTY3JpcHQiLGxfPXthcnJvd1BhcmVuczp7Y2F0ZWdvcnk6d3MsdHlwZToiY2hvaWNlIixkZWZhdWx0OiJhbHdheXMiLGRlc2NyaXB0aW9uOiJJbmNsdWRlIHBhcmVudGhlc2VzIGFyb3VuZCBhIHNvbGUgYXJyb3cgZnVuY3Rpb24gcGFyYW1ldGVyLiIsY2hvaWNlczpbe3ZhbHVlOiJhbHdheXMiLGRlc2NyaXB0aW9uOiJBbHdheXMgaW5jbHVkZSBwYXJlbnMuIEV4YW1wbGU6IGAoeCkgPT4geGAifSx7dmFsdWU6ImF2b2lkIixkZXNjcmlwdGlvbjoiT21pdCBwYXJlbnMgd2hlbiBwb3NzaWJsZS4gRXhhbXBsZTogYHggPT4geGAifV19LGJyYWNrZXRTYW1lTGluZTpvdS5icmFja2V0U2FtZUxpbmUsb2JqZWN0V3JhcDpvdS5vYmplY3RXcmFwLGJyYWNrZXRTcGFjaW5nOm91LmJyYWNrZXRTcGFjaW5nLGpzeEJyYWNrZXRTYW1lTGluZTp7Y2F0ZWdvcnk6d3MsdHlwZToiYm9vbGVhbiIsZGVzY3JpcHRpb246IlB1dCA+IG9uIHRoZSBsYXN0IGxpbmUgaW5zdGVhZCBvZiBhdCBhIG5ldyBsaW5lLiIsZGVwcmVjYXRlZDoiMi40LjAifSxzZW1pOntjYXRlZ29yeTp3cyx0eXBlOiJib29sZWFuIixkZWZhdWx0OiEwLGRlc2NyaXB0aW9uOiJQcmludCBzZW1pY29sb25zLiIsb3Bwb3NpdGVEZXNjcmlwdGlvbjoiRG8gbm90IHByaW50IHNlbWljb2xvbnMsIGV4Y2VwdCBhdCB0aGUgYmVnaW5uaW5nIG9mIGxpbmVzIHdoaWNoIG1heSBuZWVkIHRoZW0uIn0sZXhwZXJpbWVudGFsT3BlcmF0b3JQb3NpdGlvbjp7Y2F0ZWdvcnk6d3MsdHlwZToiY2hvaWNlIixkZWZhdWx0OiJlbmQiLGRlc2NyaXB0aW9uOiJXaGVyZSB0byBwcmludCBvcGVyYXRvcnMgd2hlbiBiaW5hcnkgZXhwcmVzc2lvbnMgd3JhcCBsaW5lcy4iLGNob2ljZXM6W3t2YWx1ZToic3RhcnQiLGRlc2NyaXB0aW9uOiJQcmludCBvcGVyYXRvcnMgYXQgdGhlIHN0YXJ0IG9mIG5ldyBsaW5lcy4ifSx7dmFsdWU6ImVuZCIsZGVzY3JpcHRpb246IlByaW50IG9wZXJhdG9ycyBhdCB0aGUgZW5kIG9mIHByZXZpb3VzIGxpbmVzLiJ9XX0sZXhwZXJpbWVudGFsVGVybmFyaWVzOntjYXRlZ29yeTp3cyx0eXBlOiJib29sZWFuIixkZWZhdWx0OiExLGRlc2NyaXB0aW9uOiJVc2UgY3VyaW91cyB0ZXJuYXJpZXMsIHdpdGggdGhlIHF1ZXN0aW9uIG1hcmsgYWZ0ZXIgdGhlIGNvbmRpdGlvbi4iLG9wcG9zaXRlRGVzY3JpcHRpb246IkRlZmF1bHQgYmVoYXZpb3Igb2YgdGVybmFyaWVzOyBrZWVwIHF1ZXN0aW9uIG1hcmtzIG9uIHRoZSBzYW1lIGxpbmUgYXMgdGhlIGNvbnNlcXVlbnQuIn0sc2luZ2xlUXVvdGU6b3Uuc2luZ2xlUXVvdGUsanN4U2luZ2xlUXVvdGU6e2NhdGVnb3J5OndzLHR5cGU6ImJvb2xlYW4iLGRlZmF1bHQ6ITEsZGVzY3JpcHRpb246IlVzZSBzaW5nbGUgcXVvdGVzIGluIEpTWC4ifSxxdW90ZVByb3BzOntjYXRlZ29yeTp3cyx0eXBlOiJjaG9pY2UiLGRlZmF1bHQ6ImFzLW5lZWRlZCIsZGVzY3JpcHRpb246IkNoYW5nZSB3aGVuIHByb3BlcnRpZXMgaW4gb2JqZWN0cyBhcmUgcXVvdGVkLiIsY2hvaWNlczpbe3ZhbHVlOiJhcy1uZWVkZWQiLGRlc2NyaXB0aW9uOiJPbmx5IGFkZCBxdW90ZXMgYXJvdW5kIG9iamVjdCBwcm9wZXJ0aWVzIHdoZXJlIHJlcXVpcmVkLiJ9LHt2YWx1ZToiY29uc2lzdGVudCIsZGVzY3JpcHRpb246IklmIGF0IGxlYXN0IG9uZSBwcm9wZXJ0eSBpbiBhbiBvYmplY3QgcmVxdWlyZXMgcXVvdGVzLCBxdW90ZSBhbGwgcHJvcGVydGllcy4ifSx7dmFsdWU6InByZXNlcnZlIixkZXNjcmlwdGlvbjoiUmVzcGVjdCB0aGUgaW5wdXQgdXNlIG9mIHF1b3RlcyBpbiBvYmplY3QgcHJvcGVydGllcy4ifV19LHRyYWlsaW5nQ29tbWE6e2NhdGVnb3J5OndzLHR5cGU6ImNob2ljZSIsZGVmYXVsdDoiYWxsIixkZXNjcmlwdGlvbjoiUHJpbnQgdHJhaWxpbmcgY29tbWFzIHdoZXJldmVyIHBvc3NpYmxlIHdoZW4gbXVsdGktbGluZS4iLGNob2ljZXM6W3t2YWx1ZToiYWxsIixkZXNjcmlwdGlvbjoiVHJhaWxpbmcgY29tbWFzIHdoZXJldmVyIHBvc3NpYmxlIChpbmNsdWRpbmcgZnVuY3Rpb24gYXJndW1lbnRzKS4ifSx7dmFsdWU6ImVzNSIsZGVzY3JpcHRpb246IlRyYWlsaW5nIGNvbW1hcyB3aGVyZSB2YWxpZCBpbiBFUzUgKG9iamVjdHMsIGFycmF5cywgZXRjLikifSx7dmFsdWU6Im5vbmUiLGRlc2NyaXB0aW9uOiJObyB0cmFpbGluZyBjb21tYXMuIn1dfSxzaW5nbGVBdHRyaWJ1dGVQZXJMaW5lOm91LnNpbmdsZUF0dHJpYnV0ZVBlckxpbmV9LE9GPWxfLFJGPXsuLi53YiwuLi5JRn0sakY9Wy4uLmZrLC4uLm5fXSxjXz1PYmplY3QuZnJlZXplKHtfX3Byb3RvX186bnVsbCxkZWZhdWx0OkFiLGxhbmd1YWdlczpqRixvcHRpb25zOk9GLHByaW50ZXJzOlJGfSksZl89T2JqZWN0LmRlZmluZVByb3BlcnR5LG9tPShlLHQpPT57Zm9yKHZhciBuIGluIHQpZl8oZSxuLHtnZXQ6dFtuXSxlbnVtZXJhYmxlOiEwfSl9LHBfPXt9O29tKHBfLHtfX2RlYnVnOigpPT5wTyxjaGVjazooKT0+Y08sZG9jOigpPT5mdyxmb3JtYXQ6KCk9PkltLGZvcm1hdFdpdGhDdXJzb3I6KCk9Pm13LGdldFN1cHBvcnRJbmZvOigpPT5mTyx1dGlsOigpPT5wdyx2ZXJzaW9uOigpPT5PTX0pO3ZhciBhdT0oZSx0KT0+KG4sciwuLi5zKT0+bnwxJiZyPT1udWxsP3ZvaWQgMDoodC5jYWxsKHIpPz9yW2VdKS5hcHBseShyLHMpLGhfPVN0cmluZy5wcm90b3R5cGUucmVwbGFjZUFsbD8/ZnVuY3Rpb24oZSx0KXtyZXR1cm4gZS5nbG9iYWw/dGhpcy5yZXBsYWNlKGUsdCk6dGhpcy5zcGxpdChlKS5qb2luKHQpfSxkXz1hdSgicmVwbGFjZUFsbCIsZnVuY3Rpb24oKXtpZih0eXBlb2YgdGhpcz09InN0cmluZyIpcmV0dXJuIGhffSksTGM9ZF8sbV89Y2xhc3N7ZGlmZihlLHQsbj17fSl7bGV0IHI7dHlwZW9mIG49PSJmdW5jdGlvbiI/KHI9bixuPXt9KToiY2FsbGJhY2siaW4gbiYmKHI9bi5jYWxsYmFjayk7bGV0IHM9dGhpcy5jYXN0SW5wdXQoZSxuKSxpPXRoaXMuY2FzdElucHV0KHQsbiksbz10aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUocyxuKSksYT10aGlzLnJlbW92ZUVtcHR5KHRoaXMudG9rZW5pemUoaSxuKSk7cmV0dXJuIHRoaXMuZGlmZldpdGhPcHRpb25zT2JqKG8sYSxuLHIpfWRpZmZXaXRoT3B0aW9uc09iaihlLHQsbixyKXt2YXIgcztsZXQgaT1EPT57aWYoRD10aGlzLnBvc3RQcm9jZXNzKEQsbikscil7c2V0VGltZW91dChmdW5jdGlvbigpe3IoRCl9LDApO3JldHVybn1lbHNlIHJldHVybiBEfSxvPXQubGVuZ3RoLGE9ZS5sZW5ndGgsdT0xLGw9bythO24ubWF4RWRpdExlbmd0aCE9bnVsbCYmKGw9TWF0aC5taW4obCxuLm1heEVkaXRMZW5ndGgpKTtsZXQgZj0ocz1uLnRpbWVvdXQpIT09bnVsbCYmcyE9PXZvaWQgMD9zOjEvMCxjPURhdGUubm93KCkrZixwPVt7b2xkUG9zOi0xLGxhc3RDb21wb25lbnQ6dm9pZCAwfV0saD10aGlzLmV4dHJhY3RDb21tb24ocFswXSx0LGUsMCxuKTtpZihwWzBdLm9sZFBvcysxPj1hJiZoKzE+PW8pcmV0dXJuIGkodGhpcy5idWlsZFZhbHVlcyhwWzBdLmxhc3RDb21wb25lbnQsdCxlKSk7bGV0IGQ9LTEvMCxtPTEvMCxnPSgpPT57Zm9yKGxldCBEPU1hdGgubWF4KGQsLXUpO0Q8PU1hdGgubWluKG0sdSk7RCs9Mil7bGV0IGIsRT1wW0QtMV0sRj1wW0QrMV07RSYmKHBbRC0xXT12b2lkIDApO2xldCB2PSExO2lmKEYpe2xldCBBPUYub2xkUG9zLUQ7dj1GJiYwPD1BJiZBPG99bGV0IEM9RSYmRS5vbGRQb3MrMTxhO2lmKCF2JiYhQyl7cFtEXT12b2lkIDA7Y29udGludWV9aWYoIUN8fHYmJkUub2xkUG9zPEYub2xkUG9zP2I9dGhpcy5hZGRUb1BhdGgoRiwhMCwhMSwwLG4pOmI9dGhpcy5hZGRUb1BhdGgoRSwhMSwhMCwxLG4pLGg9dGhpcy5leHRyYWN0Q29tbW9uKGIsdCxlLEQsbiksYi5vbGRQb3MrMT49YSYmaCsxPj1vKXJldHVybiBpKHRoaXMuYnVpbGRWYWx1ZXMoYi5sYXN0Q29tcG9uZW50LHQsZSkpfHwhMDtwW0RdPWIsYi5vbGRQb3MrMT49YSYmKG09TWF0aC5taW4obSxELTEpKSxoKzE+PW8mJihkPU1hdGgubWF4KGQsRCsxKSl9dSsrfTtpZihyKShmdW5jdGlvbiBEKCl7c2V0VGltZW91dChmdW5jdGlvbigpe2lmKHU+bHx8RGF0ZS5ub3coKT5jKXJldHVybiByKHZvaWQgMCk7ZygpfHxEKCl9LDApfSkoKTtlbHNlIGZvcig7dTw9bCYmRGF0ZS5ub3coKTw9Yzspe2xldCBEPWcoKTtpZihEKXJldHVybiBEfX1hZGRUb1BhdGgoZSx0LG4scixzKXtsZXQgaT1lLmxhc3RDb21wb25lbnQ7cmV0dXJuIGkmJiFzLm9uZUNoYW5nZVBlclRva2VuJiZpLmFkZGVkPT09dCYmaS5yZW1vdmVkPT09bj97b2xkUG9zOmUub2xkUG9zK3IsbGFzdENvbXBvbmVudDp7Y291bnQ6aS5jb3VudCsxLGFkZGVkOnQscmVtb3ZlZDpuLHByZXZpb3VzQ29tcG9uZW50OmkucHJldmlvdXNDb21wb25lbnR9fTp7b2xkUG9zOmUub2xkUG9zK3IsbGFzdENvbXBvbmVudDp7Y291bnQ6MSxhZGRlZDp0LHJlbW92ZWQ6bixwcmV2aW91c0NvbXBvbmVudDppfX19ZXh0cmFjdENvbW1vbihlLHQsbixyLHMpe2xldCBpPXQubGVuZ3RoLG89bi5sZW5ndGgsYT1lLm9sZFBvcyx1PWEtcixsPTA7Zm9yKDt1KzE8aSYmYSsxPG8mJnRoaXMuZXF1YWxzKG5bYSsxXSx0W3UrMV0scyk7KXUrKyxhKyssbCsrLHMub25lQ2hhbmdlUGVyVG9rZW4mJihlLmxhc3RDb21wb25lbnQ9e2NvdW50OjEscHJldmlvdXNDb21wb25lbnQ6ZS5sYXN0Q29tcG9uZW50LGFkZGVkOiExLHJlbW92ZWQ6ITF9KTtyZXR1cm4gbCYmIXMub25lQ2hhbmdlUGVyVG9rZW4mJihlLmxhc3RDb21wb25lbnQ9e2NvdW50OmwscHJldmlvdXNDb21wb25lbnQ6ZS5sYXN0Q29tcG9uZW50LGFkZGVkOiExLHJlbW92ZWQ6ITF9KSxlLm9sZFBvcz1hLHV9ZXF1YWxzKGUsdCxuKXtyZXR1cm4gbi5jb21wYXJhdG9yP24uY29tcGFyYXRvcihlLHQpOmU9PT10fHwhIW4uaWdub3JlQ2FzZSYmZS50b0xvd2VyQ2FzZSgpPT09dC50b0xvd2VyQ2FzZSgpfXJlbW92ZUVtcHR5KGUpe2xldCB0PVtdO2ZvcihsZXQgbj0wO248ZS5sZW5ndGg7bisrKWVbbl0mJnQucHVzaChlW25dKTtyZXR1cm4gdH1jYXN0SW5wdXQoZSx0KXtyZXR1cm4gZX10b2tlbml6ZShlLHQpe3JldHVybiBBcnJheS5mcm9tKGUpfWpvaW4oZSl7cmV0dXJuIGUuam9pbigiIil9cG9zdFByb2Nlc3MoZSx0KXtyZXR1cm4gZX1nZXQgdXNlTG9uZ2VzdFRva2VuKCl7cmV0dXJuITF9YnVpbGRWYWx1ZXMoZSx0LG4pe2xldCByPVtdLHM7Zm9yKDtlOylyLnB1c2goZSkscz1lLnByZXZpb3VzQ29tcG9uZW50LGRlbGV0ZSBlLnByZXZpb3VzQ29tcG9uZW50LGU9cztyLnJldmVyc2UoKTtsZXQgaT1yLmxlbmd0aCxvPTAsYT0wLHU9MDtmb3IoO288aTtvKyspe2xldCBsPXJbb107aWYobC5yZW1vdmVkKWwudmFsdWU9dGhpcy5qb2luKG4uc2xpY2UodSx1K2wuY291bnQpKSx1Kz1sLmNvdW50O2Vsc2V7aWYoIWwuYWRkZWQmJnRoaXMudXNlTG9uZ2VzdFRva2VuKXtsZXQgZj10LnNsaWNlKGEsYStsLmNvdW50KTtmPWYubWFwKGZ1bmN0aW9uKGMscCl7bGV0IGg9blt1K3BdO3JldHVybiBoLmxlbmd0aD5jLmxlbmd0aD9oOmN9KSxsLnZhbHVlPXRoaXMuam9pbihmKX1lbHNlIGwudmFsdWU9dGhpcy5qb2luKHQuc2xpY2UoYSxhK2wuY291bnQpKTthKz1sLmNvdW50LGwuYWRkZWR8fCh1Kz1sLmNvdW50KX19cmV0dXJuIHJ9fSxnXz1jbGFzcyBleHRlbmRzIG1fe3Rva2VuaXplKGUpe3JldHVybiBlLnNsaWNlKCl9am9pbihlKXtyZXR1cm4gZX1yZW1vdmVFbXB0eShlKXtyZXR1cm4gZX19LHlfPW5ldyBnXztmdW5jdGlvbiBEXyhlLHQsbil7cmV0dXJuIHlfLmRpZmYoZSx0LG4pfXZhciBiXz0oKT0+e30sRV89Yl8sVkY9ImNyIixVRj0iY3JsZiIsdl89ImxmIixGXz12XyxhbT0iXHIiLHFGPWBccgpgLCRjPWAKYCxBXz0kYztmdW5jdGlvbiB3XyhlKXtsZXQgdD1lLmluZGV4T2YoYW0pO3JldHVybiB0IT09LTE/ZS5jaGFyQXQodCsxKT09PSRjP1VGOlZGOkZffWZ1bmN0aW9uIHVtKGUpe3JldHVybiBlPT09VkY/YW06ZT09PVVGP3FGOkFffXZhciBDXz1uZXcgTWFwKFtbJGMsL1xuL2ddLFthbSwvXHIvZ10sW3FGLC9cclxuL2ddXSk7ZnVuY3Rpb24gV0YoZSx0KXt2YXIgcjtsZXQgbj1DXy5nZXQodCk7cmV0dXJuKChyPWUubWF0Y2gobikpPT1udWxsP3ZvaWQgMDpyLmxlbmd0aCk/PzB9dmFyIFNfPS9cclxuPy9nO2Z1bmN0aW9uIHhfKGUpe3JldHVybiBMYygwLGUsU18sJGMpfXZhciBCYz1TeW1ib2wuZm9yKCJjb21tZW50cyIpO2Z1bmN0aW9uIGtfKGUpe3JldHVybiB0aGlzW2U8MD90aGlzLmxlbmd0aCtlOmVdfXZhciBUXz1hdSgiYXQiLGZ1bmN0aW9uKCl7aWYoQXJyYXkuaXNBcnJheSh0aGlzKXx8dHlwZW9mIHRoaXM9PSJzdHJpbmciKXJldHVybiBrX30pLG10PVRfLGZpPSJzdHJpbmciLEJyPSJhcnJheSIsQ3M9ImN1cnNvciIsX3I9ImluZGVudCIsSXI9ImFsaWduIixQcj0idHJpbSIsSHQ9Imdyb3VwIixmcj0iZmlsbCIsc249ImlmLWJyZWFrIixNcj0iaW5kZW50LWlmLWJyZWFrIixPcj0ibGluZS1zdWZmaXgiLFJyPSJsaW5lLXN1ZmZpeC1ib3VuZGFyeSIsZ3Q9ImxpbmUiLHByPSJsYWJlbCIseG49ImJyZWFrLXBhcmVudCIsSEY9bmV3IFNldChbQ3MsX3IsSXIsUHIsSHQsZnIsc24sTXIsT3IsUnIsZ3QscHIseG5dKTtmdW5jdGlvbiBOXyhlKXtsZXQgdD1lLmxlbmd0aDtmb3IoO3Q+MCYmKGVbdC0xXT09PSJcciJ8fGVbdC0xXT09PWAKYCk7KXQtLTtyZXR1cm4gdDxlLmxlbmd0aD9lLnNsaWNlKDAsdCk6ZX1mdW5jdGlvbiBsbShlLHQsbil7aWYoIWUuaGFzKHQpKXtsZXQgcj1uKHQpO2Uuc2V0KHQscil9cmV0dXJuIGUuZ2V0KHQpfWZ1bmN0aW9uIExfKGUpe2lmKHR5cGVvZiBlPT0ic3RyaW5nIilyZXR1cm4gZmk7aWYoQXJyYXkuaXNBcnJheShlKSlyZXR1cm4gQnI7aWYoIWUpcmV0dXJuO2xldHt0eXBlOnR9PWU7aWYoSEYuaGFzKHQpKXJldHVybiB0fXZhciBwaT1MXywkXz1lPT5uZXcgSW50bC5MaXN0Rm9ybWF0KCJlbi1VUyIse3R5cGU6ImRpc2p1bmN0aW9uIn0pLmZvcm1hdChlKTtmdW5jdGlvbiBCXyhlKXtsZXQgdD1lPT09bnVsbD8ibnVsbCI6dHlwZW9mIGU7aWYodCE9PSJzdHJpbmciJiZ0IT09Im9iamVjdCIpcmV0dXJuYFVuZXhwZWN0ZWQgZG9jICcke3R9JywgCkV4cGVjdGVkIGl0IHRvIGJlICdzdHJpbmcnIG9yICdvYmplY3QnLmA7aWYocGkoZSkpdGhyb3cgbmV3IEVycm9yKCJkb2MgaXMgdmFsaWQuIik7bGV0IG49T2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKGUpO2lmKG4hPT0iW29iamVjdCBPYmplY3RdIilyZXR1cm5gVW5leHBlY3RlZCBkb2MgJyR7bn0nLmA7bGV0IHI9JF8oWy4uLkhGXS5tYXAocz0+YCcke3N9J2ApKTtyZXR1cm5gVW5leHBlY3RlZCBkb2MudHlwZSAnJHtlLnR5cGV9Jy4KRXhwZWN0ZWQgaXQgdG8gYmUgJHtyfS5gfXZhciBfXz1jbGFzcyBleHRlbmRzIEVycm9ye2NvbnN0cnVjdG9yKHQpe3N1cGVyKEJfKHQpKTtXZSh0aGlzLCJuYW1lIiwiSW52YWxpZERvY0Vycm9yIik7dGhpcy5kb2M9dH19LCRvPV9fLEpGPXt9O2Z1bmN0aW9uIElfKGUsdCxuLHIpe2xldCBzPVtlXTtmb3IoO3MubGVuZ3RoPjA7KXtsZXQgaT1zLnBvcCgpO2lmKGk9PT1KRil7bihzLnBvcCgpKTtjb250aW51ZX1uJiZzLnB1c2goaSxKRik7bGV0IG89cGkoaSk7aWYoIW8pdGhyb3cgbmV3ICRvKGkpO2lmKCh0PT1udWxsP3ZvaWQgMDp0KGkpKSE9PSExKXN3aXRjaChvKXtjYXNlIEJyOmNhc2UgZnI6e2xldCBhPW89PT1Ccj9pOmkucGFydHM7Zm9yKGxldCB1PWEubGVuZ3RoLGw9dS0xO2w+PTA7LS1sKXMucHVzaChhW2xdKTticmVha31jYXNlIHNuOnMucHVzaChpLmZsYXRDb250ZW50cyxpLmJyZWFrQ29udGVudHMpO2JyZWFrO2Nhc2UgSHQ6aWYociYmaS5leHBhbmRlZFN0YXRlcylmb3IobGV0IGE9aS5leHBhbmRlZFN0YXRlcy5sZW5ndGgsdT1hLTE7dT49MDstLXUpcy5wdXNoKGkuZXhwYW5kZWRTdGF0ZXNbdV0pO2Vsc2Ugcy5wdXNoKGkuY29udGVudHMpO2JyZWFrO2Nhc2UgSXI6Y2FzZSBfcjpjYXNlIE1yOmNhc2UgcHI6Y2FzZSBPcjpzLnB1c2goaS5jb250ZW50cyk7YnJlYWs7Y2FzZSBmaTpjYXNlIENzOmNhc2UgUHI6Y2FzZSBScjpjYXNlIGd0OmNhc2UgeG46YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgJG8oaSl9fX12YXIgY209SV87ZnVuY3Rpb24gX2MoZSx0KXtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJuIHQoZSk7bGV0IG49bmV3IE1hcDtyZXR1cm4gcihlKTtmdW5jdGlvbiByKGkpe3JldHVybiBsbShuLGkscyl9ZnVuY3Rpb24gcyhpKXtzd2l0Y2gocGkoaSkpe2Nhc2UgQnI6cmV0dXJuIHQoaS5tYXAocikpO2Nhc2UgZnI6cmV0dXJuIHQoey4uLmkscGFydHM6aS5wYXJ0cy5tYXAocil9KTtjYXNlIHNuOnJldHVybiB0KHsuLi5pLGJyZWFrQ29udGVudHM6cihpLmJyZWFrQ29udGVudHMpLGZsYXRDb250ZW50czpyKGkuZmxhdENvbnRlbnRzKX0pO2Nhc2UgSHQ6e2xldHtleHBhbmRlZFN0YXRlczpvLGNvbnRlbnRzOmF9PWk7cmV0dXJuIG8/KG89by5tYXAociksYT1vWzBdKTphPXIoYSksdCh7Li4uaSxjb250ZW50czphLGV4cGFuZGVkU3RhdGVzOm99KX1jYXNlIElyOmNhc2UgX3I6Y2FzZSBNcjpjYXNlIHByOmNhc2UgT3I6cmV0dXJuIHQoey4uLmksY29udGVudHM6cihpLmNvbnRlbnRzKX0pO2Nhc2UgZmk6Y2FzZSBDczpjYXNlIFByOmNhc2UgUnI6Y2FzZSBndDpjYXNlIHhuOnJldHVybiB0KGkpO2RlZmF1bHQ6dGhyb3cgbmV3ICRvKGkpfX19ZnVuY3Rpb24gZm0oZSx0LG4pe2xldCByPW4scz0hMTtmdW5jdGlvbiBpKG8pe2lmKHMpcmV0dXJuITE7bGV0IGE9dChvKTthIT09dm9pZCAwJiYocz0hMCxyPWEpfXJldHVybiBjbShlLGkpLHJ9ZnVuY3Rpb24gUF8oZSl7aWYoZS50eXBlPT09SHQmJmUuYnJlYWt8fGUudHlwZT09PWd0JiZlLmhhcmR8fGUudHlwZT09PXhuKXJldHVybiEwfWZ1bmN0aW9uIE1fKGUpe3JldHVybiBmbShlLFBfLCExKX1mdW5jdGlvbiB6RihlKXtpZihlLmxlbmd0aD4wKXtsZXQgdD1tdCgwLGUsLTEpOyF0LmV4cGFuZGVkU3RhdGVzJiYhdC5icmVhayYmKHQuYnJlYWs9InByb3BhZ2F0ZWQiKX1yZXR1cm4gbnVsbH1mdW5jdGlvbiBPXyhlKXtsZXQgdD1uZXcgU2V0LG49W107ZnVuY3Rpb24gcihpKXtpZihpLnR5cGU9PT14biYmekYobiksaS50eXBlPT09SHQpe2lmKG4ucHVzaChpKSx0LmhhcyhpKSlyZXR1cm4hMTt0LmFkZChpKX19ZnVuY3Rpb24gcyhpKXtpLnR5cGU9PT1IdCYmbi5wb3AoKS5icmVhayYmekYobil9Y20oZSxyLHMsITApfWZ1bmN0aW9uIFJfKGUpe3JldHVybiBlLnR5cGU9PT1ndCYmIWUuaGFyZD9lLnNvZnQ/IiI6IiAiOmUudHlwZT09PXNuP2UuZmxhdENvbnRlbnRzOmV9ZnVuY3Rpb24gal8oZSl7cmV0dXJuIF9jKGUsUl8pfWZ1bmN0aW9uIEdGKGUpe2ZvcihlPVsuLi5lXTtlLmxlbmd0aD49MiYmbXQoMCxlLC0yKS50eXBlPT09Z3QmJm10KDAsZSwtMSkudHlwZT09PXhuOyllLmxlbmd0aC09MjtpZihlLmxlbmd0aD4wKXtsZXQgdD11dShtdCgwLGUsLTEpKTtlW2UubGVuZ3RoLTFdPXR9cmV0dXJuIGV9ZnVuY3Rpb24gdXUoZSl7c3dpdGNoKHBpKGUpKXtjYXNlIF9yOmNhc2UgTXI6Y2FzZSBIdDpjYXNlIE9yOmNhc2UgcHI6e2xldCB0PXV1KGUuY29udGVudHMpO3JldHVybnsuLi5lLGNvbnRlbnRzOnR9fWNhc2Ugc246cmV0dXJuey4uLmUsYnJlYWtDb250ZW50czp1dShlLmJyZWFrQ29udGVudHMpLGZsYXRDb250ZW50czp1dShlLmZsYXRDb250ZW50cyl9O2Nhc2UgZnI6cmV0dXJuey4uLmUscGFydHM6R0YoZS5wYXJ0cyl9O2Nhc2UgQnI6cmV0dXJuIEdGKGUpO2Nhc2UgZmk6cmV0dXJuIE5fKGUpO2Nhc2UgSXI6Y2FzZSBDczpjYXNlIFByOmNhc2UgUnI6Y2FzZSBndDpjYXNlIHhuOmJyZWFrO2RlZmF1bHQ6dGhyb3cgbmV3ICRvKGUpfXJldHVybiBlfWZ1bmN0aW9uIEtGKGUpe3JldHVybiB1dShVXyhlKSl9ZnVuY3Rpb24gVl8oZSl7c3dpdGNoKHBpKGUpKXtjYXNlIGZyOntsZXR7cGFydHM6dH09ZTtpZih0LmV2ZXJ5KG49Pm49PT0iIikpcmV0dXJuIiI7aWYodC5sZW5ndGg9PT0xKXJldHVybiB0WzBdO2JyZWFrfWNhc2UgSHQ6aWYoIWUuY29udGVudHMmJiFlLmlkJiYhZS5icmVhayYmIWUuZXhwYW5kZWRTdGF0ZXMpcmV0dXJuIiI7aWYoZS5jb250ZW50cy50eXBlPT09SHQmJmUuY29udGVudHMuaWQ9PT1lLmlkJiZlLmNvbnRlbnRzLmJyZWFrPT09ZS5icmVhayYmZS5jb250ZW50cy5leHBhbmRlZFN0YXRlcz09PWUuZXhwYW5kZWRTdGF0ZXMpcmV0dXJuIGUuY29udGVudHM7YnJlYWs7Y2FzZSBJcjpjYXNlIF9yOmNhc2UgTXI6Y2FzZSBPcjppZighZS5jb250ZW50cylyZXR1cm4iIjticmVhaztjYXNlIHNuOmlmKCFlLmZsYXRDb250ZW50cyYmIWUuYnJlYWtDb250ZW50cylyZXR1cm4iIjticmVhaztjYXNlIEJyOntsZXQgdD1bXTtmb3IobGV0IG4gb2YgZSl7aWYoIW4pY29udGludWU7bGV0W3IsLi4uc109QXJyYXkuaXNBcnJheShuKT9uOltuXTt0eXBlb2Ygcj09InN0cmluZyImJnR5cGVvZiBtdCgwLHQsLTEpPT0ic3RyaW5nIj90W3QubGVuZ3RoLTFdKz1yOnQucHVzaChyKSx0LnB1c2goLi4ucyl9cmV0dXJuIHQubGVuZ3RoPT09MD8iIjp0Lmxlbmd0aD09PTE/dFswXTp0fWNhc2UgZmk6Y2FzZSBDczpjYXNlIFByOmNhc2UgUnI6Y2FzZSBndDpjYXNlIHByOmNhc2UgeG46YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgJG8oZSl9cmV0dXJuIGV9ZnVuY3Rpb24gVV8oZSl7cmV0dXJuIF9jKGUsdD0+Vl8odCkpfWZ1bmN0aW9uIHFfKGUsdD1uQSl7cmV0dXJuIF9jKGUsbj0+dHlwZW9mIG49PSJzdHJpbmciP1pGKHQsbi5zcGxpdChgCmApKTpuKX1mdW5jdGlvbiBXXyhlKXtpZihlLnR5cGU9PT1ndClyZXR1cm4hMH1mdW5jdGlvbiBIXyhlKXtyZXR1cm4gZm0oZSxXXywhMSl9ZnVuY3Rpb24gSWMoZSx0KXtyZXR1cm4gZS50eXBlPT09cHI/ey4uLmUsY29udGVudHM6dChlLmNvbnRlbnRzKX06dChlKX12YXIgSl89RV87ZnVuY3Rpb24gUGMoZSl7cmV0dXJue3R5cGU6X3IsY29udGVudHM6ZX19ZnVuY3Rpb24gQm8oZSx0KXtyZXR1cm57dHlwZTpJcixjb250ZW50czp0LG46ZX19ZnVuY3Rpb24gel8oZSl7cmV0dXJuIEJvKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxlKX1mdW5jdGlvbiBYRihlKXtyZXR1cm4gQm8oe3R5cGU6InJvb3QifSxlKX1mdW5jdGlvbiBHXyhlKXtyZXR1cm4gQm8oLTEsZSl9ZnVuY3Rpb24gWUYoZSx0LG4pe2xldCByPWU7aWYodD4wKXtmb3IobGV0IHM9MDtzPE1hdGguZmxvb3IodC9uKTsrK3Mpcj1QYyhyKTtyPUJvKHQlbixyKSxyPUJvKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSxyKX1yZXR1cm4gcn12YXIgTWM9e3R5cGU6eG59LGhpPXt0eXBlOkNzfTtmdW5jdGlvbiBLXyhlKXtyZXR1cm57dHlwZTpmcixwYXJ0czplfX1mdW5jdGlvbiBRRihlLHQ9e30pe3JldHVybiBKXyh0LmV4cGFuZGVkU3RhdGVzKSx7dHlwZTpIdCxpZDp0LmlkLGNvbnRlbnRzOmUsYnJlYWs6ISF0LnNob3VsZEJyZWFrLGV4cGFuZGVkU3RhdGVzOnQuZXhwYW5kZWRTdGF0ZXN9fWZ1bmN0aW9uIFhfKGUsdCl7cmV0dXJuIFFGKGVbMF0sey4uLnQsZXhwYW5kZWRTdGF0ZXM6ZX0pfWZ1bmN0aW9uIFlfKGUsdD0iIixuPXt9KXtyZXR1cm57dHlwZTpzbixicmVha0NvbnRlbnRzOmUsZmxhdENvbnRlbnRzOnQsZ3JvdXBJZDpuLmdyb3VwSWR9fWZ1bmN0aW9uIFFfKGUsdCl7cmV0dXJue3R5cGU6TXIsY29udGVudHM6ZSxncm91cElkOnQuZ3JvdXBJZCxuZWdhdGU6dC5uZWdhdGV9fWZ1bmN0aW9uIFpGKGUsdCl7bGV0IG49W107Zm9yKGxldCByPTA7cjx0Lmxlbmd0aDtyKyspciE9PTAmJm4ucHVzaChlKSxuLnB1c2godFtyXSk7cmV0dXJuIG59ZnVuY3Rpb24gWl8oZSx0KXtyZXR1cm4gZT97dHlwZTpwcixsYWJlbDplLGNvbnRlbnRzOnR9OnR9dmFyIGVBPXt0eXBlOmd0fSxlST17dHlwZTpndCxzb2Z0OiEwfSxwbT17dHlwZTpndCxoYXJkOiEwfSxqcj1bcG0sTWNdLHRBPXt0eXBlOmd0LGhhcmQ6ITAsbGl0ZXJhbDohMH0sbkE9W3RBLE1jXTtmdW5jdGlvbiBobShlKXtyZXR1cm57dHlwZTpPcixjb250ZW50czplfX12YXIgdEk9e3R5cGU6UnJ9LG5JPXt0eXBlOlByfTtmdW5jdGlvbiBWcihlKXt2YXIgdDtpZighZSlyZXR1cm4iIjtpZihBcnJheS5pc0FycmF5KGUpKXtsZXQgbj1bXTtmb3IobGV0IHIgb2YgZSlpZihBcnJheS5pc0FycmF5KHIpKW4ucHVzaCguLi5WcihyKSk7ZWxzZXtsZXQgcz1WcihyKTtzIT09IiImJm4ucHVzaChzKX1yZXR1cm4gbn1yZXR1cm4gZS50eXBlPT09c24/ey4uLmUsYnJlYWtDb250ZW50czpWcihlLmJyZWFrQ29udGVudHMpLGZsYXRDb250ZW50czpWcihlLmZsYXRDb250ZW50cyl9OmUudHlwZT09PUh0P3suLi5lLGNvbnRlbnRzOlZyKGUuY29udGVudHMpLGV4cGFuZGVkU3RhdGVzOih0PWUuZXhwYW5kZWRTdGF0ZXMpPT1udWxsP3ZvaWQgMDp0Lm1hcChWcil9OmUudHlwZT09PWZyP3t0eXBlOiJmaWxsIixwYXJ0czplLnBhcnRzLm1hcChWcil9OmUuY29udGVudHM/ey4uLmUsY29udGVudHM6VnIoZS5jb250ZW50cyl9OmV9ZnVuY3Rpb24gckkoZSl7bGV0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKSxuPW5ldyBTZXQ7cmV0dXJuIHIoVnIoZSkpO2Z1bmN0aW9uIHIoaSxvLGEpe3ZhciB1LGw7aWYodHlwZW9mIGk9PSJzdHJpbmciKXJldHVybiBKU09OLnN0cmluZ2lmeShpKTtpZihBcnJheS5pc0FycmF5KGkpKXtsZXQgZj1pLm1hcChyKS5maWx0ZXIoQm9vbGVhbik7cmV0dXJuIGYubGVuZ3RoPT09MT9mWzBdOmBbJHtmLmpvaW4oIiwgIil9XWB9aWYoaS50eXBlPT09Z3Qpe2xldCBmPSgodT1hPT1udWxsP3ZvaWQgMDphW28rMV0pPT1udWxsP3ZvaWQgMDp1LnR5cGUpPT09eG47cmV0dXJuIGkubGl0ZXJhbD9mPyJsaXRlcmFsbGluZSI6ImxpdGVyYWxsaW5lV2l0aG91dEJyZWFrUGFyZW50IjppLmhhcmQ/Zj8iaGFyZGxpbmUiOiJoYXJkbGluZVdpdGhvdXRCcmVha1BhcmVudCI6aS5zb2Z0PyJzb2Z0bGluZSI6ImxpbmUifWlmKGkudHlwZT09PXhuKXJldHVybigobD1hPT1udWxsP3ZvaWQgMDphW28tMV0pPT1udWxsP3ZvaWQgMDpsLnR5cGUpPT09Z3QmJmFbby0xXS5oYXJkP3ZvaWQgMDoiYnJlYWtQYXJlbnQiO2lmKGkudHlwZT09PVByKXJldHVybiJ0cmltIjtpZihpLnR5cGU9PT1fcilyZXR1cm4iaW5kZW50KCIrcihpLmNvbnRlbnRzKSsiKSI7aWYoaS50eXBlPT09SXIpcmV0dXJuIGkubj09PU51bWJlci5ORUdBVElWRV9JTkZJTklUWT8iZGVkZW50VG9Sb290KCIrcihpLmNvbnRlbnRzKSsiKSI6aS5uPDA/ImRlZGVudCgiK3IoaS5jb250ZW50cykrIikiOmkubi50eXBlPT09InJvb3QiPyJtYXJrQXNSb290KCIrcihpLmNvbnRlbnRzKSsiKSI6ImFsaWduKCIrSlNPTi5zdHJpbmdpZnkoaS5uKSsiLCAiK3IoaS5jb250ZW50cykrIikiO2lmKGkudHlwZT09PXNuKXJldHVybiJpZkJyZWFrKCIrcihpLmJyZWFrQ29udGVudHMpKyhpLmZsYXRDb250ZW50cz8iLCAiK3IoaS5mbGF0Q29udGVudHMpOiIiKSsoaS5ncm91cElkPyhpLmZsYXRDb250ZW50cz8iIjonLCAiIicpK2AsIHsgZ3JvdXBJZDogJHtzKGkuZ3JvdXBJZCl9IH1gOiIiKSsiKSI7aWYoaS50eXBlPT09TXIpe2xldCBmPVtdO2kubmVnYXRlJiZmLnB1c2goIm5lZ2F0ZTogdHJ1ZSIpLGkuZ3JvdXBJZCYmZi5wdXNoKGBncm91cElkOiAke3MoaS5ncm91cElkKX1gKTtsZXQgYz1mLmxlbmd0aD4wP2AsIHsgJHtmLmpvaW4oIiwgIil9IH1gOiIiO3JldHVybmBpbmRlbnRJZkJyZWFrKCR7cihpLmNvbnRlbnRzKX0ke2N9KWB9aWYoaS50eXBlPT09SHQpe2xldCBmPVtdO2kuYnJlYWsmJmkuYnJlYWshPT0icHJvcGFnYXRlZCImJmYucHVzaCgic2hvdWxkQnJlYWs6IHRydWUiKSxpLmlkJiZmLnB1c2goYGlkOiAke3MoaS5pZCl9YCk7bGV0IGM9Zi5sZW5ndGg+MD9gLCB7ICR7Zi5qb2luKCIsICIpfSB9YDoiIjtyZXR1cm4gaS5leHBhbmRlZFN0YXRlcz9gY29uZGl0aW9uYWxHcm91cChbJHtpLmV4cGFuZGVkU3RhdGVzLm1hcChwPT5yKHApKS5qb2luKCIsIil9XSR7Y30pYDpgZ3JvdXAoJHtyKGkuY29udGVudHMpfSR7Y30pYH1pZihpLnR5cGU9PT1mcilyZXR1cm5gZmlsbChbJHtpLnBhcnRzLm1hcChmPT5yKGYpKS5qb2luKCIsICIpfV0pYDtpZihpLnR5cGU9PT1PcilyZXR1cm4ibGluZVN1ZmZpeCgiK3IoaS5jb250ZW50cykrIikiO2lmKGkudHlwZT09PVJyKXJldHVybiJsaW5lU3VmZml4Qm91bmRhcnkiO2lmKGkudHlwZT09PXByKXJldHVybmBsYWJlbCgke0pTT04uc3RyaW5naWZ5KGkubGFiZWwpfSwgJHtyKGkuY29udGVudHMpfSlgO2lmKGkudHlwZT09PUNzKXJldHVybiJjdXJzb3IiO3Rocm93IG5ldyBFcnJvcigiVW5rbm93biBkb2MgdHlwZSAiK2kudHlwZSl9ZnVuY3Rpb24gcyhpKXtpZih0eXBlb2YgaSE9InN5bWJvbCIpcmV0dXJuIEpTT04uc3RyaW5naWZ5KFN0cmluZyhpKSk7aWYoaSBpbiB0KXJldHVybiB0W2ldO2xldCBvPWkuZGVzY3JpcHRpb258fCJzeW1ib2wiO2ZvcihsZXQgYT0wOzthKyspe2xldCB1PW8rKGE+MD9gICMke2F9YDoiIik7aWYoIW4uaGFzKHUpKXJldHVybiBuLmFkZCh1KSx0W2ldPWBTeW1ib2wuZm9yKCR7SlNPTi5zdHJpbmdpZnkodSl9KWB9fX12YXIgc0k9KCk9Pi9bIyowLTldXHVGRTBGP1x1MjBFM3xbXHhBOVx4QUVcdTIwM0NcdTIwNDlcdTIxMjJcdTIxMzlcdTIxOTQtXHUyMTk5XHUyMUE5XHUyMUFBXHUyMzFBXHUyMzFCXHUyMzI4XHUyM0NGXHUyM0VELVx1MjNFRlx1MjNGMVx1MjNGMlx1MjNGOC1cdTIzRkFcdTI0QzJcdTI1QUFcdTI1QUJcdTI1QjZcdTI1QzBcdTI1RkJcdTI1RkNcdTI1RkVcdTI2MDAtXHUyNjA0XHUyNjBFXHUyNjExXHUyNjE0XHUyNjE1XHUyNjE4XHUyNjIwXHUyNjIyXHUyNjIzXHUyNjI2XHUyNjJBXHUyNjJFXHUyNjJGXHUyNjM4LVx1MjYzQVx1MjY0MFx1MjY0Mlx1MjY0OC1cdTI2NTNcdTI2NUZcdTI2NjBcdTI2NjNcdTI2NjVcdTI2NjZcdTI2NjhcdTI2N0JcdTI2N0VcdTI2N0ZcdTI2OTJcdTI2OTQtXHUyNjk3XHUyNjk5XHUyNjlCXHUyNjlDXHUyNkEwXHUyNkE3XHUyNkFBXHUyNkIwXHUyNkIxXHUyNkJEXHUyNkJFXHUyNkM0XHUyNkM4XHUyNkNGXHUyNkQxXHUyNkU5XHUyNkYwLVx1MjZGNVx1MjZGN1x1MjZGOFx1MjZGQVx1MjcwMlx1MjcwOFx1MjcwOVx1MjcwRlx1MjcxMlx1MjcxNFx1MjcxNlx1MjcxRFx1MjcyMVx1MjczM1x1MjczNFx1Mjc0NFx1Mjc0N1x1Mjc1N1x1Mjc2M1x1MjdBMVx1MjkzNFx1MjkzNVx1MkIwNS1cdTJCMDdcdTJCMUJcdTJCMUNcdTJCNTVcdTMwMzBcdTMwM0RcdTMyOTdcdTMyOTldXHVGRTBGP3xbXHUyNjFEXHUyNzBDXHUyNzBEXSg/Olx1RDgzQ1tcdURGRkItXHVERkZGXXxcdUZFMEYpP3xbXHUyNzBBXHUyNzBCXSg/Olx1RDgzQ1tcdURGRkItXHVERkZGXSk/fFtcdTIzRTktXHUyM0VDXHUyM0YwXHUyM0YzXHUyNUZEXHUyNjkzXHUyNkExXHUyNkFCXHUyNkM1XHUyNkNFXHUyNkQ0XHUyNkVBXHUyNkZEXHUyNzA1XHUyNzI4XHUyNzRDXHUyNzRFXHUyNzUzLVx1Mjc1NVx1Mjc5NS1cdTI3OTdcdTI3QjBcdTI3QkZcdTJCNTBdfFx1MjZEM1x1RkUwRj8oPzpcdTIwMERcdUQ4M0RcdURDQTUpP3xcdTI2RjkoPzpcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVGRTBGKT8oPzpcdTIwMERbXHUyNjQwXHUyNjQyXVx1RkUwRj8pP3xcdTI3NjRcdUZFMEY/KD86XHUyMDBEKD86XHVEODNEXHVERDI1fFx1RDgzRVx1REU3OSkpP3xcdUQ4M0MoPzpbXHVEQzA0XHVERDcwXHVERDcxXHVERDdFXHVERDdGXHVERTAyXHVERTM3XHVERjIxXHVERjI0LVx1REYyQ1x1REYzNlx1REY3RFx1REY5Nlx1REY5N1x1REY5OS1cdURGOUJcdURGOUVcdURGOUZcdURGQ0RcdURGQ0VcdURGRDQtXHVERkRGXHVERkY1XHVERkY3XVx1RkUwRj98W1x1REY4NVx1REZDMlx1REZDN10oPzpcdUQ4M0NbXHVERkZCLVx1REZGRl0pP3xbXHVERkM0XHVERkNBXSg/Olx1RDgzQ1tcdURGRkItXHVERkZGXSk/KD86XHUyMDBEW1x1MjY0MFx1MjY0Ml1cdUZFMEY/KT98W1x1REZDQlx1REZDQ10oPzpcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVGRTBGKT8oPzpcdTIwMERbXHUyNjQwXHUyNjQyXVx1RkUwRj8pP3xbXHVEQ0NGXHVERDhFXHVERDkxLVx1REQ5QVx1REUwMVx1REUxQVx1REUyRlx1REUzMi1cdURFMzZcdURFMzgtXHVERTNBXHVERTUwXHVERTUxXHVERjAwLVx1REYyMFx1REYyRC1cdURGMzVcdURGMzctXHVERjQzXHVERjQ1LVx1REY0QVx1REY0Qy1cdURGN0NcdURGN0UtXHVERjg0XHVERjg2LVx1REY5M1x1REZBMC1cdURGQzFcdURGQzVcdURGQzZcdURGQzhcdURGQzlcdURGQ0YtXHVERkQzXHVERkUwLVx1REZGMFx1REZGOC1cdURGRkZdfFx1RERFNlx1RDgzQ1tcdURERTgtXHVEREVDXHVEREVFXHVEREYxXHVEREYyXHVEREY0XHVEREY2LVx1RERGQVx1RERGQ1x1RERGRFx1RERGRl18XHVEREU3XHVEODNDW1x1RERFNlx1RERFN1x1RERFOS1cdURERUZcdURERjEtXHVEREY0XHVEREY2LVx1RERGOVx1RERGQlx1RERGQ1x1RERGRVx1RERGRl18XHVEREU4XHVEODNDW1x1RERFNlx1RERFOFx1RERFOVx1RERFQi1cdURERUVcdURERjAtXHVEREY3XHVEREZBLVx1RERGRl18XHVEREU5XHVEODNDW1x1RERFQVx1RERFQ1x1RERFRlx1RERGMFx1RERGMlx1RERGNFx1RERGRl18XHVEREVBXHVEODNDW1x1RERFNlx1RERFOFx1RERFQVx1RERFQ1x1RERFRFx1RERGNy1cdURERkFdfFx1RERFQlx1RDgzQ1tcdURERUUtXHVEREYwXHVEREYyXHVEREY0XHVEREY3XXxcdURERUNcdUQ4M0NbXHVEREU2XHVEREU3XHVEREU5LVx1RERFRVx1RERGMS1cdURERjNcdURERjUtXHVEREZBXHVEREZDXHVEREZFXXxcdURERURcdUQ4M0NbXHVEREYwXHVEREYyXHVEREYzXHVEREY3XHVEREY5XHVEREZBXXxcdURERUVcdUQ4M0NbXHVEREU4LVx1RERFQVx1RERGMS1cdURERjRcdURERjYtXHVEREY5XXxcdURERUZcdUQ4M0NbXHVEREVBXHVEREYyXHVEREY0XHVEREY1XXxcdURERjBcdUQ4M0NbXHVEREVBXHVEREVDLVx1RERFRVx1RERGMlx1RERGM1x1RERGNVx1RERGN1x1RERGQ1x1RERGRVx1RERGRl18XHVEREYxXHVEODNDW1x1RERFNi1cdURERThcdURERUVcdURERjBcdURERjctXHVEREZCXHVEREZFXXxcdURERjJcdUQ4M0NbXHVEREU2XHVEREU4LVx1RERFRFx1RERGMC1cdURERkZdfFx1RERGM1x1RDgzQ1tcdURERTZcdURERThcdURERUEtXHVEREVDXHVEREVFXHVEREYxXHVEREY0XHVEREY1XHVEREY3XHVEREZBXHVEREZGXXxcdURERjRcdUQ4M0NcdURERjJ8XHVEREY1XHVEODNDW1x1RERFNlx1RERFQS1cdURERURcdURERjAtXHVEREYzXHVEREY3LVx1RERGOVx1RERGQ1x1RERGRV18XHVEREY2XHVEODNDXHVEREU2fFx1RERGN1x1RDgzQ1tcdURERUFcdURERjRcdURERjhcdURERkFcdURERkNdfFx1RERGOFx1RDgzQ1tcdURERTYtXHVEREVBXHVEREVDLVx1RERGNFx1RERGNy1cdURERjlcdURERkJcdURERkQtXHVEREZGXXxcdURERjlcdUQ4M0NbXHVEREU2XHVEREU4XHVEREU5XHVEREVCLVx1RERFRFx1RERFRi1cdURERjRcdURERjdcdURERjlcdURERkJcdURERkNcdURERkZdfFx1RERGQVx1RDgzQ1tcdURERTZcdURERUNcdURERjJcdURERjNcdURERjhcdURERkVcdURERkZdfFx1RERGQlx1RDgzQ1tcdURERTZcdURERThcdURERUFcdURERUNcdURERUVcdURERjNcdURERkFdfFx1RERGQ1x1RDgzQ1tcdURERUJcdURERjhdfFx1RERGRFx1RDgzQ1x1RERGMHxcdURERkVcdUQ4M0NbXHVEREVBXHVEREY5XXxcdURERkZcdUQ4M0NbXHVEREU2XHVEREYyXHVEREZDXXxcdURGNDQoPzpcdTIwMERcdUQ4M0RcdURGRUIpP3xcdURGNEIoPzpcdTIwMERcdUQ4M0RcdURGRTkpP3xcdURGQzMoPzpcdUQ4M0NbXHVERkZCLVx1REZGRl0pPyg/Olx1MjAwRCg/OltcdTI2NDBcdTI2NDJdXHVGRTBGPyg/Olx1MjAwRFx1MjdBMVx1RkUwRj8pP3xcdTI3QTFcdUZFMEY/KSk/fFx1REZGM1x1RkUwRj8oPzpcdTIwMEQoPzpcdTI2QTdcdUZFMEY/fFx1RDgzQ1x1REYwOCkpP3xcdURGRjQoPzpcdTIwMERcdTI2MjBcdUZFMEY/fFx1REI0MFx1REM2N1x1REI0MFx1REM2Mlx1REI0MCg/Olx1REM2NVx1REI0MFx1REM2RVx1REI0MFx1REM2N3xcdURDNzNcdURCNDBcdURDNjNcdURCNDBcdURDNzR8XHVEQzc3XHVEQjQwXHVEQzZDXHVEQjQwXHVEQzczKVx1REI0MFx1REM3Rik/KXxcdUQ4M0QoPzpbXHVEQzNGXHVEQ0ZEXHVERDQ5XHVERDRBXHVERDZGXHVERDcwXHVERDczXHVERDc2LVx1REQ3OVx1REQ4N1x1REQ4QS1cdUREOERcdUREQTVcdUREQThcdUREQjFcdUREQjJcdUREQkNcdUREQzItXHVEREM0XHVEREQxLVx1REREM1x1REREQy1cdUREREVcdURERTFcdURERTNcdURERThcdURERUZcdURERjNcdURERkFcdURFQ0JcdURFQ0QtXHVERUNGXHVERUUwLVx1REVFNVx1REVFOVx1REVGMFx1REVGM11cdUZFMEY/fFtcdURDNDJcdURDNDNcdURDNDYtXHVEQzUwXHVEQzY2XHVEQzY3XHVEQzZCLVx1REM2RFx1REM3Mlx1REM3NC1cdURDNzZcdURDNzhcdURDN0NcdURDODNcdURDODVcdURDOEZcdURDOTFcdURDQUFcdUREN0FcdUREOTVcdUREOTZcdURFNENcdURFNEZcdURFQzBcdURFQ0NdKD86XHVEODNDW1x1REZGQi1cdURGRkZdKT98W1x1REM2RS1cdURDNzFcdURDNzNcdURDNzdcdURDODFcdURDODJcdURDODZcdURDODdcdURFNDUtXHVERTQ3XHVERTRCXHVERTREXHVERTRFXHVERUEzXHVERUI0XHVERUI1XSg/Olx1RDgzQ1tcdURGRkItXHVERkZGXSk/KD86XHUyMDBEW1x1MjY0MFx1MjY0Ml1cdUZFMEY/KT98W1x1REQ3NFx1REQ5MF0oPzpcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVGRTBGKT98W1x1REMwMC1cdURDMDdcdURDMDktXHVEQzE0XHVEQzE2LVx1REMyNVx1REMyNy1cdURDM0FcdURDM0MtXHVEQzNFXHVEQzQwXHVEQzQ0XHVEQzQ1XHVEQzUxLVx1REM2NVx1REM2QVx1REM3OS1cdURDN0JcdURDN0QtXHVEQzgwXHVEQzg0XHVEQzg4LVx1REM4RVx1REM5MFx1REM5Mi1cdURDQTlcdURDQUItXHVEQ0ZDXHVEQ0ZGLVx1REQzRFx1REQ0Qi1cdURENEVcdURENTAtXHVERDY3XHVEREE0XHVEREZCLVx1REUyRFx1REUyRi1cdURFMzRcdURFMzctXHVERTQxXHVERTQzXHVERTQ0XHVERTQ4LVx1REU0QVx1REU4MC1cdURFQTJcdURFQTQtXHVERUIzXHVERUI3LVx1REVCRlx1REVDMS1cdURFQzVcdURFRDAtXHVERUQyXHVERUQ1LVx1REVEOFx1REVEQy1cdURFREZcdURFRUJcdURFRUNcdURFRjQtXHVERUZDXHVERkUwLVx1REZFQlx1REZGMF18XHVEQzA4KD86XHUyMDBEXHUyQjFCKT98XHVEQzE1KD86XHUyMDBEXHVEODNFXHVEREJBKT98XHVEQzI2KD86XHUyMDBEKD86XHUyQjFCfFx1RDgzRFx1REQyNSkpP3xcdURDM0IoPzpcdTIwMERcdTI3NDRcdUZFMEY/KT98XHVEQzQxXHVGRTBGPyg/Olx1MjAwRFx1RDgzRFx1RERFOFx1RkUwRj8pP3xcdURDNjgoPzpcdTIwMEQoPzpbXHUyNjk1XHUyNjk2XHUyNzA4XVx1RkUwRj98XHUyNzY0XHVGRTBGP1x1MjAwRFx1RDgzRCg/Olx1REM4Qlx1MjAwRFx1RDgzRCk/XHVEQzY4fFx1RDgzQ1tcdURGM0VcdURGNzNcdURGN0NcdURGOTNcdURGQTRcdURGQThcdURGRUJcdURGRURdfFx1RDgzRCg/OltcdURDNjhcdURDNjldXHUyMDBEXHVEODNEKD86XHVEQzY2KD86XHUyMDBEXHVEODNEXHVEQzY2KT98XHVEQzY3KD86XHUyMDBEXHVEODNEW1x1REM2Nlx1REM2N10pPyl8W1x1RENCQlx1RENCQ1x1REQyN1x1REQyQ1x1REU4MFx1REU5Ml18XHVEQzY2KD86XHUyMDBEXHVEODNEXHVEQzY2KT98XHVEQzY3KD86XHUyMDBEXHVEODNEW1x1REM2Nlx1REM2N10pPyl8XHVEODNFKD86W1x1RERBRlx1RERCQ1x1RERCRF0oPzpcdTIwMERcdTI3QTFcdUZFMEY/KT98W1x1RERCMC1cdUREQjNdKSl8XHVEODNDKD86XHVERkZCKD86XHUyMDBEKD86W1x1MjY5NVx1MjY5Nlx1MjcwOF1cdUZFMEY/fFx1Mjc2NFx1RkUwRj9cdTIwMERcdUQ4M0QoPzpcdURDOEJcdTIwMERcdUQ4M0QpP1x1REM2OFx1RDgzQ1tcdURGRkItXHVERkZGXXxcdUQ4M0NbXHVERjNFXHVERjczXHVERjdDXHVERjkzXHVERkE0XHVERkE4XHVERkVCXHVERkVEXXxcdUQ4M0QoPzpbXHVEQ0JCXHVEQ0JDXHVERDI3XHVERDJDXHVERTgwXHVERTkyXXxcdURDMzBcdTIwMERcdUQ4M0RcdURDNjhcdUQ4M0NbXHVERkZDLVx1REZGRl0pfFx1RDgzRSg/OltcdUREMURcdURFRUZdXHUyMDBEXHVEODNEXHVEQzY4XHVEODNDW1x1REZGQy1cdURGRkZdfFtcdUREQUZcdUREQkNcdUREQkRdKD86XHUyMDBEXHUyN0ExXHVGRTBGPyk/fFtcdUREQjAtXHVEREIzXSkpKT98XHVERkZDKD86XHUyMDBEKD86W1x1MjY5NVx1MjY5Nlx1MjcwOF1cdUZFMEY/fFx1Mjc2NFx1RkUwRj9cdTIwMERcdUQ4M0QoPzpcdURDOEJcdTIwMERcdUQ4M0QpP1x1REM2OFx1RDgzQ1tcdURGRkItXHVERkZGXXxcdUQ4M0NbXHVERjNFXHVERjczXHVERjdDXHVERjkzXHVERkE0XHVERkE4XHVERkVCXHVERkVEXXxcdUQ4M0QoPzpbXHVEQ0JCXHVEQ0JDXHVERDI3XHVERDJDXHVERTgwXHVERTkyXXxcdURDMzBcdTIwMERcdUQ4M0RcdURDNjhcdUQ4M0NbXHVERkZCXHVERkZELVx1REZGRl0pfFx1RDgzRSg/OltcdUREMURcdURFRUZdXHUyMDBEXHVEODNEXHVEQzY4XHVEODNDW1x1REZGQlx1REZGRC1cdURGRkZdfFtcdUREQUZcdUREQkNcdUREQkRdKD86XHUyMDBEXHUyN0ExXHVGRTBGPyk/fFtcdUREQjAtXHVEREIzXSkpKT98XHVERkZEKD86XHUyMDBEKD86W1x1MjY5NVx1MjY5Nlx1MjcwOF1cdUZFMEY/fFx1Mjc2NFx1RkUwRj9cdTIwMERcdUQ4M0QoPzpcdURDOEJcdTIwMERcdUQ4M0QpP1x1REM2OFx1RDgzQ1tcdURGRkItXHVERkZGXXxcdUQ4M0NbXHVERjNFXHVERjczXHVERjdDXHVERjkzXHVERkE0XHVERkE4XHVERkVCXHVERkVEXXxcdUQ4M0QoPzpbXHVEQ0JCXHVEQ0JDXHVERDI3XHVERDJDXHVERTgwXHVERTkyXXxcdURDMzBcdTIwMERcdUQ4M0RcdURDNjhcdUQ4M0NbXHVERkZCXHVERkZDXHVERkZFXHVERkZGXSl8XHVEODNFKD86W1x1REQxRFx1REVFRl1cdTIwMERcdUQ4M0RcdURDNjhcdUQ4M0NbXHVERkZCXHVERkZDXHVERkZFXHVERkZGXXxbXHVEREFGXHVEREJDXHVEREJEXSg/Olx1MjAwRFx1MjdBMVx1RkUwRj8pP3xbXHVEREIwLVx1RERCM10pKSk/fFx1REZGRSg/Olx1MjAwRCg/OltcdTI2OTVcdTI2OTZcdTI3MDhdXHVGRTBGP3xcdTI3NjRcdUZFMEY/XHUyMDBEXHVEODNEKD86XHVEQzhCXHUyMDBEXHVEODNEKT9cdURDNjhcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVEODNDW1x1REYzRVx1REY3M1x1REY3Q1x1REY5M1x1REZBNFx1REZBOFx1REZFQlx1REZFRF18XHVEODNEKD86W1x1RENCQlx1RENCQ1x1REQyN1x1REQyQ1x1REU4MFx1REU5Ml18XHVEQzMwXHUyMDBEXHVEODNEXHVEQzY4XHVEODNDW1x1REZGQi1cdURGRkRcdURGRkZdKXxcdUQ4M0UoPzpbXHVERDFEXHVERUVGXVx1MjAwRFx1RDgzRFx1REM2OFx1RDgzQ1tcdURGRkItXHVERkZEXHVERkZGXXxbXHVEREFGXHVEREJDXHVEREJEXSg/Olx1MjAwRFx1MjdBMVx1RkUwRj8pP3xbXHVEREIwLVx1RERCM10pKSk/fFx1REZGRig/Olx1MjAwRCg/OltcdTI2OTVcdTI2OTZcdTI3MDhdXHVGRTBGP3xcdTI3NjRcdUZFMEY/XHUyMDBEXHVEODNEKD86XHVEQzhCXHUyMDBEXHVEODNEKT9cdURDNjhcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVEODNDW1x1REYzRVx1REY3M1x1REY3Q1x1REY5M1x1REZBNFx1REZBOFx1REZFQlx1REZFRF18XHVEODNEKD86W1x1RENCQlx1RENCQ1x1REQyN1x1REQyQ1x1REU4MFx1REU5Ml18XHVEQzMwXHUyMDBEXHVEODNEXHVEQzY4XHVEODNDW1x1REZGQi1cdURGRkVdKXxcdUQ4M0UoPzpbXHVERDFEXHVERUVGXVx1MjAwRFx1RDgzRFx1REM2OFx1RDgzQ1tcdURGRkItXHVERkZFXXxbXHVEREFGXHVEREJDXHVEREJEXSg/Olx1MjAwRFx1MjdBMVx1RkUwRj8pP3xbXHVEREIwLVx1RERCM10pKSk/KSk/fFx1REM2OSg/Olx1MjAwRCg/OltcdTI2OTVcdTI2OTZcdTI3MDhdXHVGRTBGP3xcdTI3NjRcdUZFMEY/XHUyMDBEXHVEODNEKD86XHVEQzhCXHUyMDBEXHVEODNEKT9bXHVEQzY4XHVEQzY5XXxcdUQ4M0NbXHVERjNFXHVERjczXHVERjdDXHVERjkzXHVERkE0XHVERkE4XHVERkVCXHVERkVEXXxcdUQ4M0QoPzpbXHVEQ0JCXHVEQ0JDXHVERDI3XHVERDJDXHVERTgwXHVERTkyXXxcdURDNjYoPzpcdTIwMERcdUQ4M0RcdURDNjYpP3xcdURDNjcoPzpcdTIwMERcdUQ4M0RbXHVEQzY2XHVEQzY3XSk/fFx1REM2OVx1MjAwRFx1RDgzRCg/Olx1REM2Nig/Olx1MjAwRFx1RDgzRFx1REM2Nik/fFx1REM2Nyg/Olx1MjAwRFx1RDgzRFtcdURDNjZcdURDNjddKT8pKXxcdUQ4M0UoPzpbXHVEREFGXHVEREJDXHVEREJEXSg/Olx1MjAwRFx1MjdBMVx1RkUwRj8pP3xbXHVEREIwLVx1RERCM10pKXxcdUQ4M0MoPzpcdURGRkIoPzpcdTIwMEQoPzpbXHUyNjk1XHUyNjk2XHUyNzA4XVx1RkUwRj98XHUyNzY0XHVGRTBGP1x1MjAwRFx1RDgzRCg/OltcdURDNjhcdURDNjldfFx1REM4Qlx1MjAwRFx1RDgzRFtcdURDNjhcdURDNjldKVx1RDgzQ1tcdURGRkItXHVERkZGXXxcdUQ4M0NbXHVERjNFXHVERjczXHVERjdDXHVERjkzXHVERkE0XHVERkE4XHVERkVCXHVERkVEXXxcdUQ4M0QoPzpbXHVEQ0JCXHVEQ0JDXHVERDI3XHVERDJDXHVERTgwXHVERTkyXXxcdURDMzBcdTIwMERcdUQ4M0RcdURDNjlcdUQ4M0NbXHVERkZDLVx1REZGRl0pfFx1RDgzRSg/OltcdUREQUZcdUREQkNcdUREQkRdKD86XHUyMDBEXHUyN0ExXHVGRTBGPyk/fFtcdUREQjAtXHVEREIzXXxcdUREMURcdTIwMERcdUQ4M0RbXHVEQzY4XHVEQzY5XVx1RDgzQ1tcdURGRkMtXHVERkZGXXxcdURFRUZcdTIwMERcdUQ4M0RcdURDNjlcdUQ4M0NbXHVERkZDLVx1REZGRl0pKSk/fFx1REZGQyg/Olx1MjAwRCg/OltcdTI2OTVcdTI2OTZcdTI3MDhdXHVGRTBGP3xcdTI3NjRcdUZFMEY/XHUyMDBEXHVEODNEKD86W1x1REM2OFx1REM2OV18XHVEQzhCXHUyMDBEXHVEODNEW1x1REM2OFx1REM2OV0pXHVEODNDW1x1REZGQi1cdURGRkZdfFx1RDgzQ1tcdURGM0VcdURGNzNcdURGN0NcdURGOTNcdURGQTRcdURGQThcdURGRUJcdURGRURdfFx1RDgzRCg/OltcdURDQkJcdURDQkNcdUREMjdcdUREMkNcdURFODBcdURFOTJdfFx1REMzMFx1MjAwRFx1RDgzRFx1REM2OVx1RDgzQ1tcdURGRkJcdURGRkQtXHVERkZGXSl8XHVEODNFKD86W1x1RERBRlx1RERCQ1x1RERCRF0oPzpcdTIwMERcdTI3QTFcdUZFMEY/KT98W1x1RERCMC1cdUREQjNdfFx1REQxRFx1MjAwRFx1RDgzRFtcdURDNjhcdURDNjldXHVEODNDW1x1REZGQlx1REZGRC1cdURGRkZdfFx1REVFRlx1MjAwRFx1RDgzRFx1REM2OVx1RDgzQ1tcdURGRkJcdURGRkQtXHVERkZGXSkpKT98XHVERkZEKD86XHUyMDBEKD86W1x1MjY5NVx1MjY5Nlx1MjcwOF1cdUZFMEY/fFx1Mjc2NFx1RkUwRj9cdTIwMERcdUQ4M0QoPzpbXHVEQzY4XHVEQzY5XXxcdURDOEJcdTIwMERcdUQ4M0RbXHVEQzY4XHVEQzY5XSlcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVEODNDW1x1REYzRVx1REY3M1x1REY3Q1x1REY5M1x1REZBNFx1REZBOFx1REZFQlx1REZFRF18XHVEODNEKD86W1x1RENCQlx1RENCQ1x1REQyN1x1REQyQ1x1REU4MFx1REU5Ml18XHVEQzMwXHUyMDBEXHVEODNEXHVEQzY5XHVEODNDW1x1REZGQlx1REZGQ1x1REZGRVx1REZGRl0pfFx1RDgzRSg/OltcdUREQUZcdUREQkNcdUREQkRdKD86XHUyMDBEXHUyN0ExXHVGRTBGPyk/fFtcdUREQjAtXHVEREIzXXxcdUREMURcdTIwMERcdUQ4M0RbXHVEQzY4XHVEQzY5XVx1RDgzQ1tcdURGRkJcdURGRkNcdURGRkVcdURGRkZdfFx1REVFRlx1MjAwRFx1RDgzRFx1REM2OVx1RDgzQ1tcdURGRkJcdURGRkNcdURGRkVcdURGRkZdKSkpP3xcdURGRkUoPzpcdTIwMEQoPzpbXHUyNjk1XHUyNjk2XHUyNzA4XVx1RkUwRj98XHUyNzY0XHVGRTBGP1x1MjAwRFx1RDgzRCg/OltcdURDNjhcdURDNjldfFx1REM4Qlx1MjAwRFx1RDgzRFtcdURDNjhcdURDNjldKVx1RDgzQ1tcdURGRkItXHVERkZGXXxcdUQ4M0NbXHVERjNFXHVERjczXHVERjdDXHVERjkzXHVERkE0XHVERkE4XHVERkVCXHVERkVEXXxcdUQ4M0QoPzpbXHVEQ0JCXHVEQ0JDXHVERDI3XHVERDJDXHVERTgwXHVERTkyXXxcdURDMzBcdTIwMERcdUQ4M0RcdURDNjlcdUQ4M0NbXHVERkZCLVx1REZGRFx1REZGRl0pfFx1RDgzRSg/OltcdUREQUZcdUREQkNcdUREQkRdKD86XHUyMDBEXHUyN0ExXHVGRTBGPyk/fFtcdUREQjAtXHVEREIzXXxcdUREMURcdTIwMERcdUQ4M0RbXHVEQzY4XHVEQzY5XVx1RDgzQ1tcdURGRkItXHVERkZEXHVERkZGXXxcdURFRUZcdTIwMERcdUQ4M0RcdURDNjlcdUQ4M0NbXHVERkZCLVx1REZGRFx1REZGRl0pKSk/fFx1REZGRig/Olx1MjAwRCg/OltcdTI2OTVcdTI2OTZcdTI3MDhdXHVGRTBGP3xcdTI3NjRcdUZFMEY/XHUyMDBEXHVEODNEKD86W1x1REM2OFx1REM2OV18XHVEQzhCXHUyMDBEXHVEODNEW1x1REM2OFx1REM2OV0pXHVEODNDW1x1REZGQi1cdURGRkZdfFx1RDgzQ1tcdURGM0VcdURGNzNcdURGN0NcdURGOTNcdURGQTRcdURGQThcdURGRUJcdURGRURdfFx1RDgzRCg/OltcdURDQkJcdURDQkNcdUREMjdcdUREMkNcdURFODBcdURFOTJdfFx1REMzMFx1MjAwRFx1RDgzRFx1REM2OVx1RDgzQ1tcdURGRkItXHVERkZFXSl8XHVEODNFKD86W1x1RERBRlx1RERCQ1x1RERCRF0oPzpcdTIwMERcdTI3QTFcdUZFMEY/KT98W1x1RERCMC1cdUREQjNdfFx1REQxRFx1MjAwRFx1RDgzRFtcdURDNjhcdURDNjldXHVEODNDW1x1REZGQi1cdURGRkVdfFx1REVFRlx1MjAwRFx1RDgzRFx1REM2OVx1RDgzQ1tcdURGRkItXHVERkZFXSkpKT8pKT98XHVERDc1KD86XHVEODNDW1x1REZGQi1cdURGRkZdfFx1RkUwRik/KD86XHUyMDBEW1x1MjY0MFx1MjY0Ml1cdUZFMEY/KT98XHVERTJFKD86XHUyMDBEXHVEODNEXHVEQ0E4KT98XHVERTM1KD86XHUyMDBEXHVEODNEXHVEQ0FCKT98XHVERTM2KD86XHUyMDBEXHVEODNDXHVERjJCXHVGRTBGPyk/fFx1REU0Mig/Olx1MjAwRFtcdTIxOTRcdTIxOTVdXHVGRTBGPyk/fFx1REVCNig/Olx1RDgzQ1tcdURGRkItXHVERkZGXSk/KD86XHUyMDBEKD86W1x1MjY0MFx1MjY0Ml1cdUZFMEY/KD86XHUyMDBEXHUyN0ExXHVGRTBGPyk/fFx1MjdBMVx1RkUwRj8pKT8pfFx1RDgzRSg/OltcdUREMENcdUREMEZcdUREMTgtXHVERDFGXHVERDMwLVx1REQzNFx1REQzNlx1REQ3N1x1RERCNVx1RERCNlx1RERCQlx1REREMlx1REREM1x1RERENVx1REVDMy1cdURFQzVcdURFRjBcdURFRjItXHVERUY4XSg/Olx1RDgzQ1tcdURGRkItXHVERkZGXSk/fFtcdUREMjZcdUREMzVcdUREMzctXHVERDM5XHVERDNDLVx1REQzRVx1RERCOFx1RERCOVx1RERDRFx1RERDRlx1RERENFx1RERENi1cdURERERdKD86XHVEODNDW1x1REZGQi1cdURGRkZdKT8oPzpcdTIwMERbXHUyNjQwXHUyNjQyXVx1RkUwRj8pP3xbXHVERERFXHVERERGXSg/Olx1MjAwRFtcdTI2NDBcdTI2NDJdXHVGRTBGPyk/fFtcdUREMERcdUREMEVcdUREMTAtXHVERDE3XHVERDIwLVx1REQyNVx1REQyNy1cdUREMkZcdUREM0FcdUREM0YtXHVERDQ1XHVERDQ3LVx1REQ3Nlx1REQ3OC1cdUREQjRcdUREQjdcdUREQkFcdUREQkMtXHVERENDXHVEREQwXHVEREUwLVx1RERGRlx1REU3MC1cdURFN0NcdURFODAtXHVERThBXHVERThFLVx1REVDMlx1REVDNlx1REVDOFx1REVDRC1cdURFRENcdURFREYtXHVERUVBXHVERUVGXXxcdUREQ0UoPzpcdUQ4M0NbXHVERkZCLVx1REZGRl0pPyg/Olx1MjAwRCg/OltcdTI2NDBcdTI2NDJdXHVGRTBGPyg/Olx1MjAwRFx1MjdBMVx1RkUwRj8pP3xcdTI3QTFcdUZFMEY/KSk/fFx1REREMSg/Olx1MjAwRCg/OltcdTI2OTVcdTI2OTZcdTI3MDhdXHVGRTBGP3xcdUQ4M0NbXHVERjNFXHVERjczXHVERjdDXHVERjg0XHVERjkzXHVERkE0XHVERkE4XHVERkVCXHVERkVEXXxcdUQ4M0RbXHVEQ0JCXHVEQ0JDXHVERDI3XHVERDJDXHVERTgwXHVERTkyXXxcdUQ4M0UoPzpbXHVEREFGXHVEREJDXHVEREJEXSg/Olx1MjAwRFx1MjdBMVx1RkUwRj8pP3xbXHVEREIwLVx1RERCM1x1REU3MF18XHVERDFEXHUyMDBEXHVEODNFXHVEREQxfFx1REREMVx1MjAwRFx1RDgzRVx1REREMig/Olx1MjAwRFx1RDgzRVx1REREMik/fFx1REREMig/Olx1MjAwRFx1RDgzRVx1REREMik/KSl8XHVEODNDKD86XHVERkZCKD86XHUyMDBEKD86W1x1MjY5NVx1MjY5Nlx1MjcwOF1cdUZFMEY/fFx1Mjc2NFx1RkUwRj9cdTIwMEQoPzpcdUQ4M0RcdURDOEJcdTIwMEQpP1x1RDgzRVx1REREMVx1RDgzQ1tcdURGRkMtXHVERkZGXXxcdUQ4M0NbXHVERjNFXHVERjczXHVERjdDXHVERjg0XHVERjkzXHVERkE0XHVERkE4XHVERkVCXHVERkVEXXxcdUQ4M0QoPzpbXHVEQ0JCXHVEQ0JDXHVERDI3XHVERDJDXHVERTgwXHVERTkyXXxcdURDMzBcdTIwMERcdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZDLVx1REZGRl0pfFx1RDgzRSg/OltcdUREQUZcdUREQkNcdUREQkRdKD86XHUyMDBEXHUyN0ExXHVGRTBGPyk/fFtcdUREQjAtXHVEREIzXHVERTcwXXxcdUREMURcdTIwMERcdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVERUVGXHUyMDBEXHVEODNFXHVEREQxXHVEODNDW1x1REZGQy1cdURGRkZdKSkpP3xcdURGRkMoPzpcdTIwMEQoPzpbXHUyNjk1XHUyNjk2XHUyNzA4XVx1RkUwRj98XHUyNzY0XHVGRTBGP1x1MjAwRCg/Olx1RDgzRFx1REM4Qlx1MjAwRCk/XHVEODNFXHVEREQxXHVEODNDW1x1REZGQlx1REZGRC1cdURGRkZdfFx1RDgzQ1tcdURGM0VcdURGNzNcdURGN0NcdURGODRcdURGOTNcdURGQTRcdURGQThcdURGRUJcdURGRURdfFx1RDgzRCg/OltcdURDQkJcdURDQkNcdUREMjdcdUREMkNcdURFODBcdURFOTJdfFx1REMzMFx1MjAwRFx1RDgzRVx1REREMVx1RDgzQ1tcdURGRkJcdURGRkQtXHVERkZGXSl8XHVEODNFKD86W1x1RERBRlx1RERCQ1x1RERCRF0oPzpcdTIwMERcdTI3QTFcdUZFMEY/KT98W1x1RERCMC1cdUREQjNcdURFNzBdfFx1REQxRFx1MjAwRFx1RDgzRVx1REREMVx1RDgzQ1tcdURGRkItXHVERkZGXXxcdURFRUZcdTIwMERcdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZCXHVERkZELVx1REZGRl0pKSk/fFx1REZGRCg/Olx1MjAwRCg/OltcdTI2OTVcdTI2OTZcdTI3MDhdXHVGRTBGP3xcdTI3NjRcdUZFMEY/XHUyMDBEKD86XHVEODNEXHVEQzhCXHUyMDBEKT9cdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZCXHVERkZDXHVERkZFXHVERkZGXXxcdUQ4M0NbXHVERjNFXHVERjczXHVERjdDXHVERjg0XHVERjkzXHVERkE0XHVERkE4XHVERkVCXHVERkVEXXxcdUQ4M0QoPzpbXHVEQ0JCXHVEQ0JDXHVERDI3XHVERDJDXHVERTgwXHVERTkyXXxcdURDMzBcdTIwMERcdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZCXHVERkZDXHVERkZFXHVERkZGXSl8XHVEODNFKD86W1x1RERBRlx1RERCQ1x1RERCRF0oPzpcdTIwMERcdTI3QTFcdUZFMEY/KT98W1x1RERCMC1cdUREQjNcdURFNzBdfFx1REQxRFx1MjAwRFx1RDgzRVx1REREMVx1RDgzQ1tcdURGRkItXHVERkZGXXxcdURFRUZcdTIwMERcdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZCXHVERkZDXHVERkZFXHVERkZGXSkpKT98XHVERkZFKD86XHUyMDBEKD86W1x1MjY5NVx1MjY5Nlx1MjcwOF1cdUZFMEY/fFx1Mjc2NFx1RkUwRj9cdTIwMEQoPzpcdUQ4M0RcdURDOEJcdTIwMEQpP1x1RDgzRVx1REREMVx1RDgzQ1tcdURGRkItXHVERkZEXHVERkZGXXxcdUQ4M0NbXHVERjNFXHVERjczXHVERjdDXHVERjg0XHVERjkzXHVERkE0XHVERkE4XHVERkVCXHVERkVEXXxcdUQ4M0QoPzpbXHVEQ0JCXHVEQ0JDXHVERDI3XHVERDJDXHVERTgwXHVERTkyXXxcdURDMzBcdTIwMERcdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZCLVx1REZGRFx1REZGRl0pfFx1RDgzRSg/OltcdUREQUZcdUREQkNcdUREQkRdKD86XHUyMDBEXHUyN0ExXHVGRTBGPyk/fFtcdUREQjAtXHVEREIzXHVERTcwXXxcdUREMURcdTIwMERcdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZCLVx1REZGRl18XHVERUVGXHUyMDBEXHVEODNFXHVEREQxXHVEODNDW1x1REZGQi1cdURGRkRcdURGRkZdKSkpP3xcdURGRkYoPzpcdTIwMEQoPzpbXHUyNjk1XHUyNjk2XHUyNzA4XVx1RkUwRj98XHUyNzY0XHVGRTBGP1x1MjAwRCg/Olx1RDgzRFx1REM4Qlx1MjAwRCk/XHVEODNFXHVEREQxXHVEODNDW1x1REZGQi1cdURGRkVdfFx1RDgzQ1tcdURGM0VcdURGNzNcdURGN0NcdURGODRcdURGOTNcdURGQTRcdURGQThcdURGRUJcdURGRURdfFx1RDgzRCg/OltcdURDQkJcdURDQkNcdUREMjdcdUREMkNcdURFODBcdURFOTJdfFx1REMzMFx1MjAwRFx1RDgzRVx1REREMVx1RDgzQ1tcdURGRkItXHVERkZFXSl8XHVEODNFKD86W1x1RERBRlx1RERCQ1x1RERCRF0oPzpcdTIwMERcdTI3QTFcdUZFMEY/KT98W1x1RERCMC1cdUREQjNcdURFNzBdfFx1REQxRFx1MjAwRFx1RDgzRVx1REREMVx1RDgzQ1tcdURGRkItXHVERkZGXXxcdURFRUZcdTIwMERcdUQ4M0VcdURERDFcdUQ4M0NbXHVERkZCLVx1REZGRV0pKSk/KSk/fFx1REVGMSg/Olx1RDgzQyg/Olx1REZGQig/Olx1MjAwRFx1RDgzRVx1REVGMlx1RDgzQ1tcdURGRkMtXHVERkZGXSk/fFx1REZGQyg/Olx1MjAwRFx1RDgzRVx1REVGMlx1RDgzQ1tcdURGRkJcdURGRkQtXHVERkZGXSk/fFx1REZGRCg/Olx1MjAwRFx1RDgzRVx1REVGMlx1RDgzQ1tcdURGRkJcdURGRkNcdURGRkVcdURGRkZdKT98XHVERkZFKD86XHUyMDBEXHVEODNFXHVERUYyXHVEODNDW1x1REZGQi1cdURGRkRcdURGRkZdKT98XHVERkZGKD86XHUyMDBEXHVEODNFXHVERUYyXHVEODNDW1x1REZGQi1cdURGRkVdKT8pKT8pL2csaUk9MTIyODgsb0k9NjU1MTAsYUk9WzEyMjg4LDEyMjg4LDY1MjgxLDY1Mzc2LDY1NTA0LDY1NTEwXSx1ST00MzUyLGxJPTI2MjE0MSxyQT1bNDM1Miw0NDQ3LDg5ODYsODk4Nyw5MDAxLDkwMDIsOTE5Myw5MTk2LDkyMDAsOTIwMCw5MjAzLDkyMDMsOTcyNSw5NzI2LDk3NDgsOTc0OSw5Nzc2LDk3ODMsOTgwMCw5ODExLDk4NTUsOTg1NSw5ODY2LDk4NzEsOTg3NSw5ODc1LDk4ODksOTg4OSw5ODk4LDk4OTksOTkxNyw5OTE4LDk5MjQsOTkyNSw5OTM0LDk5MzQsOTk0MCw5OTQwLDk5NjIsOTk2Miw5OTcwLDk5NzEsOTk3Myw5OTczLDk5NzgsOTk3OCw5OTgxLDk5ODEsOTk4OSw5OTg5LDk5OTQsOTk5NSwxMDAyNCwxMDAyNCwxMDA2MCwxMDA2MCwxMDA2MiwxMDA2MiwxMDA2NywxMDA2OSwxMDA3MSwxMDA3MSwxMDEzMywxMDEzNSwxMDE2MCwxMDE2MCwxMDE3NSwxMDE3NSwxMTAzNSwxMTAzNiwxMTA4OCwxMTA4OCwxMTA5MywxMTA5MywxMTkwNCwxMTkyOSwxMTkzMSwxMjAxOSwxMjAzMiwxMjI0NSwxMjI3MiwxMjI4NywxMjI4OSwxMjM1MCwxMjM1MywxMjQzOCwxMjQ0MSwxMjU0MywxMjU0OSwxMjU5MSwxMjU5MywxMjY4NiwxMjY4OCwxMjc3MywxMjc4MywxMjgzMCwxMjgzMiwxMjg3MSwxMjg4MCw0MjEyNCw0MjEyOCw0MjE4Miw0MzM2MCw0MzM4OCw0NDAzMiw1NTIwMyw2Mzc0NCw2NDI1NSw2NTA0MCw2NTA0OSw2NTA3Miw2NTEwNiw2NTEwOCw2NTEyNiw2NTEyOCw2NTEzMSw5NDE3Niw5NDE4MCw5NDE5Miw5NDE5OCw5NDIwOCwxMDE1ODksMTAxNjMxLDEwMTY2MiwxMDE3NjAsMTAxODc0LDExMDU3NiwxMTA1NzksMTEwNTgxLDExMDU4NywxMTA1ODksMTEwNTkwLDExMDU5MiwxMTA4ODIsMTEwODk4LDExMDg5OCwxMTA5MjgsMTEwOTMwLDExMDkzMywxMTA5MzMsMTEwOTQ4LDExMDk1MSwxMTA5NjAsMTExMzU1LDExOTU1MiwxMTk2MzgsMTE5NjQ4LDExOTY3MCwxMjY5ODAsMTI2OTgwLDEyNzE4MywxMjcxODMsMTI3Mzc0LDEyNzM3NCwxMjczNzcsMTI3Mzg2LDEyNzQ4OCwxMjc0OTAsMTI3NTA0LDEyNzU0NywxMjc1NTIsMTI3NTYwLDEyNzU2OCwxMjc1NjksMTI3NTg0LDEyNzU4OSwxMjc3NDQsMTI3Nzc2LDEyNzc4OSwxMjc3OTcsMTI3Nzk5LDEyNzg2OCwxMjc4NzAsMTI3ODkxLDEyNzkwNCwxMjc5NDYsMTI3OTUxLDEyNzk1NSwxMjc5NjgsMTI3OTg0LDEyNzk4OCwxMjc5ODgsMTI3OTkyLDEyODA2MiwxMjgwNjQsMTI4MDY0LDEyODA2NiwxMjgyNTIsMTI4MjU1LDEyODMxNywxMjgzMzEsMTI4MzM0LDEyODMzNiwxMjgzNTksMTI4Mzc4LDEyODM3OCwxMjg0MDUsMTI4NDA2LDEyODQyMCwxMjg0MjAsMTI4NTA3LDEyODU5MSwxMjg2NDAsMTI4NzA5LDEyODcxNiwxMjg3MTYsMTI4NzIwLDEyODcyMiwxMjg3MjUsMTI4NzI4LDEyODczMiwxMjg3MzUsMTI4NzQ3LDEyODc0OCwxMjg3NTYsMTI4NzY0LDEyODk5MiwxMjkwMDMsMTI5MDA4LDEyOTAwOCwxMjkyOTIsMTI5MzM4LDEyOTM0MCwxMjkzNDksMTI5MzUxLDEyOTUzNSwxMjk2NDgsMTI5NjYwLDEyOTY2NCwxMjk2NzQsMTI5Njc4LDEyOTczNCwxMjk3MzYsMTI5NzM2LDEyOTc0MSwxMjk3NTYsMTI5NzU5LDEyOTc3MCwxMjk3NzUsMTI5Nzg0LDEzMTA3MiwxOTY2MDUsMTk2NjA4LDI2MjE0MV0sc0E9KGUsdCk9PntsZXQgbj0wLHI9TWF0aC5mbG9vcihlLmxlbmd0aC8yKS0xO2Zvcig7bjw9cjspe2xldCBzPU1hdGguZmxvb3IoKG4rcikvMiksaT1zKjI7aWYodDxlW2ldKXI9cy0xO2Vsc2UgaWYodD5lW2krMV0pbj1zKzE7ZWxzZSByZXR1cm4hMH1yZXR1cm4hMX0saUE9MTk5NjgsW2NJLGZJXT1wSShyQSk7ZnVuY3Rpb24gcEkoZSl7bGV0IHQ9ZVswXSxuPWVbMV07Zm9yKGxldCByPTA7cjxlLmxlbmd0aDtyKz0yKXtsZXQgcz1lW3JdLGk9ZVtyKzFdO2lmKGlBPj1zJiZpQTw9aSlyZXR1cm5bcyxpXTtpLXM+bi10JiYodD1zLG49aSl9cmV0dXJuW3Qsbl19dmFyIGhJPWU9PmU8aUl8fGU+b0k/ITE6c0EoYUksZSksZEk9ZT0+ZT49Y0kmJmU8PWZJPyEwOmU8dUl8fGU+bEk/ITE6c0EockEsZSksbUk9L14oPzpbXHhBOVx4QUVcdTIwM0NcdTIwNDlcdTIxMjJcdTIxMzlcdTIxOTQtXHUyMTk5XHUyMUE5XHUyMUFBXHUyMzI4XHUyM0NGXHUyM0VELVx1MjNFRlx1MjNGMVx1MjNGMlx1MjNGOC1cdTIzRkFcdTI0QzJcdTI1QUFcdTI1QUJcdTI1QjZcdTI1QzBcdTI1RkJcdTI1RkNcdTI2MDAtXHUyNjA0XHUyNjBFXHUyNjExXHUyNjE4XHUyNjIwXHUyNjIyXHUyNjIzXHUyNjI2XHUyNjJBXHUyNjJFXHUyNjJGXHUyNjM4LVx1MjYzQVx1MjY0MFx1MjY0Mlx1MjY1Rlx1MjY2MFx1MjY2M1x1MjY2NVx1MjY2Nlx1MjY2OFx1MjY3Qlx1MjY3RVx1MjY5Mlx1MjY5NC1cdTI2OTdcdTI2OTlcdTI2OUJcdTI2OUNcdTI2QTBcdTI2QTdcdTI2QjBcdTI2QjFcdTI2QzhcdTI2Q0ZcdTI2RDFcdTI2RDNcdTI2RTlcdTI2RjBcdTI2RjFcdTI2RjRcdTI2RjdcdTI2RjhcdTI3MDJcdTI3MDhcdTI3MDlcdTI3MEZcdTI3MTJcdTI3MTRcdTI3MTZcdTI3MURcdTI3MjFcdTI3MzNcdTI3MzRcdTI3NDRcdTI3NDdcdTI3NjNcdTI3NjRcdTI3QTFcdTI5MzRcdTI5MzVcdTJCMDUtXHUyQjA3XXxcdUQ4M0NbXHVERDcwXHVERDcxXHVERDdFXHVERDdGXHVERjIxXHVERjI0LVx1REYyQ1x1REYzNlx1REY3RFx1REY5Nlx1REY5N1x1REY5OS1cdURGOUJcdURGOUVcdURGOUZcdURGQ0RcdURGQ0VcdURGRDQtXHVERkRGXHVERkYzXHVERkY1XHVERkY3XXxcdUQ4M0RbXHVEQzNGXHVEQzQxXHVEQ0ZEXHVERDQ5XHVERDRBXHVERDZGXHVERDcwXHVERDczXHVERDc2LVx1REQ3OVx1REQ4N1x1REQ4QS1cdUREOERcdUREQTVcdUREQThcdUREQjFcdUREQjJcdUREQkNcdUREQzItXHVEREM0XHVEREQxLVx1REREM1x1REREQy1cdUREREVcdURERTFcdURERTNcdURERThcdURERUZcdURERjNcdURERkFcdURFQ0JcdURFQ0QtXHVERUNGXHVERUUwLVx1REVFNVx1REVFOVx1REVGMFx1REVGM10pJC8sZ0k9ZT0+bUkudGVzdChlKSx5ST0vW15ceDIwLVx4N0ZdLztmdW5jdGlvbiBESShlKXtpZighZSlyZXR1cm4gMDtpZigheUkudGVzdChlKSlyZXR1cm4gZS5sZW5ndGg7bGV0IHQ9MDtlPWUucmVwbGFjZShzSSgpLG49Pih0Kz1nSShuKT8xOjIsIiIpKTtmb3IobGV0IG4gb2YgZSl7bGV0IHI9bi5jb2RlUG9pbnRBdCgwKTtyPD0zMXx8cj49MTI3JiZyPD0xNTl8fHI+PTc2OCYmcjw9ODc5fHxyPj02NTAyNCYmcjw9NjUwMzl8fCh0Kz1oSShyKXx8ZEkocik/MjoxKX1yZXR1cm4gdH12YXIgZG09REksYkk9e3R5cGU6MH0sRUk9e3R5cGU6MX0sb0E9e3ZhbHVlOiIiLGxlbmd0aDowLHF1ZXVlOltdLGdldCByb290KCl7cmV0dXJuIG9BfX07ZnVuY3Rpb24gYUEoZSx0LG4pe2xldCByPXQudHlwZT09PTE/ZS5xdWV1ZS5zbGljZSgwLC0xKTpbLi4uZS5xdWV1ZSx0XSxzPSIiLGk9MCxvPTAsYT0wO2ZvcihsZXQgZCBvZiByKXN3aXRjaChkLnR5cGUpe2Nhc2UgMDpmKCksbi51c2VUYWJzP3UoMSk6bChuLnRhYldpZHRoKTticmVhaztjYXNlIDM6e2xldHtzdHJpbmc6bX09ZDtmKCkscys9bSxpKz1tLmxlbmd0aDticmVha31jYXNlIDI6e2xldHt3aWR0aDptfT1kO28rPTEsYSs9bTticmVha31kZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCBpbmRlbnQgY29tbWVudCAnJHtkLnR5cGV9Jy5gKX1yZXR1cm4gcCgpLHsuLi5lLHZhbHVlOnMsbGVuZ3RoOmkscXVldWU6cn07ZnVuY3Rpb24gdShkKXtzKz0iCSIucmVwZWF0KGQpLGkrPW4udGFiV2lkdGgqZH1mdW5jdGlvbiBsKGQpe3MrPSIgIi5yZXBlYXQoZCksaSs9ZH1mdW5jdGlvbiBmKCl7bi51c2VUYWJzP2MoKTpwKCl9ZnVuY3Rpb24gYygpe28+MCYmdShvKSxoKCl9ZnVuY3Rpb24gcCgpe2E+MCYmbChhKSxoKCl9ZnVuY3Rpb24gaCgpe289MCxhPTB9fWZ1bmN0aW9uIHZJKGUsdCxuKXtpZighdClyZXR1cm4gZTtpZih0LnR5cGU9PT0icm9vdCIpcmV0dXJuey4uLmUscm9vdDplfTtpZih0PT09TnVtYmVyLk5FR0FUSVZFX0lORklOSVRZKXJldHVybiBlLnJvb3Q7bGV0IHI7cmV0dXJuIHR5cGVvZiB0PT0ibnVtYmVyIj90PDA/cj1FSTpyPXt0eXBlOjIsd2lkdGg6dH06cj17dHlwZTozLHN0cmluZzp0fSxhQShlLHIsbil9ZnVuY3Rpb24gRkkoZSx0KXtyZXR1cm4gYUEoZSxiSSx0KX1mdW5jdGlvbiBBSShlKXtsZXQgdD0wO2ZvcihsZXQgbj1lLmxlbmd0aC0xO24+PTA7bi0tKXtsZXQgcj1lW25dO2lmKHI9PT0iICJ8fHI9PT0iCSIpdCsrO2Vsc2UgYnJlYWt9cmV0dXJuIHR9ZnVuY3Rpb24gdUEoZSl7bGV0IHQ9QUkoZSk7cmV0dXJue3RleHQ6dD09PTA/ZTplLnNsaWNlKDAsZS5sZW5ndGgtdCksY291bnQ6dH19dmFyIHdJPShvQz1jbGFzc3tjb25zdHJ1Y3Rvcigpe2J0KHRoaXMsQ3UpO2J0KHRoaXMsd3UsW10pO2J0KHRoaXMsenIsIiIpO2J0KHRoaXMsWG8sMCk7YnQodGhpcyxZbyxbXSk7YnQodGhpcyxBaSxbXSl9bWFya1Bvc2l0aW9uKCl7aWYob2UodGhpcyxZbykubGVuZ3RoK29lKHRoaXMsQWkpLmxlbmd0aD49Mil0aHJvdyBuZXcgRXJyb3IoIlRoZXJlIGFyZSB0b28gbWFueSAnY3Vyc29yJyBpbiBkb2MuIik7b2UodGhpcyxBaSkucHVzaChvZSh0aGlzLFhvKStvZSh0aGlzLHpyKS5sZW5ndGgpfXdyaXRlKGUpe0puKHRoaXMsenIsb2UodGhpcyx6cikrZSl9dHJpbSgpe2xldHt0ZXh0OmUsY291bnQ6dH09dUEob2UodGhpcyx6cikpO3JldHVybiBKbih0aGlzLHpyLGUpLHpuKHRoaXMsQ3UsdDEpLmNhbGwodGhpcyksdH1maW5pc2goKXtyZXR1cm4gem4odGhpcyxDdSx0MSkuY2FsbCh0aGlzKSx7dGV4dDpvZSh0aGlzLHd1KS5qb2luKCIiKSxwb3NpdGlvbnM6b2UodGhpcyxZbyl9fX0sd3U9bmV3IFdlYWtNYXAsenI9bmV3IFdlYWtNYXAsWG89bmV3IFdlYWtNYXAsWW89bmV3IFdlYWtNYXAsQWk9bmV3IFdlYWtNYXAsQ3U9bmV3IFdlYWtTZXQsdDE9ZnVuY3Rpb24oKXtsZXQgZT1vZSh0aGlzLHpyKTtlIT09IiImJihvZSh0aGlzLHd1KS5wdXNoKGUpLEpuKHRoaXMsWG8sb2UodGhpcyxYbykrZS5sZW5ndGgpLEpuKHRoaXMsenIsIiIpKTtmb3IobGV0IHQgb2Ygb2UodGhpcyxBaSkpb2UodGhpcyxZbykucHVzaChNYXRoLm1pbih0LG9lKHRoaXMsWG8pKSk7b2UodGhpcyxBaSkubGVuZ3RoPTB9LG9DKSxDST13SSxrbj1TeW1ib2woIk1PREVfQlJFQUsiKSxocj1TeW1ib2woIk1PREVfRkxBVCIpLG1tPVN5bWJvbCgiRE9DX0ZJTExfUFJJTlRFRF9MRU5HVEgiKTtmdW5jdGlvbiBPYyhlLHQsbixyLHMsaSl7aWYobj09PU51bWJlci5QT1NJVElWRV9JTkZJTklUWSlyZXR1cm4hMDtsZXQgbz10Lmxlbmd0aCxhPSExLHU9W2VdLGw9IiI7Zm9yKDtuPj0wOyl7aWYodS5sZW5ndGg9PT0wKXtpZihvPT09MClyZXR1cm4hMDt1LnB1c2godFstLW9dKTtjb250aW51ZX1sZXR7bW9kZTpmLGRvYzpjfT11LnBvcCgpLHA9cGkoYyk7c3dpdGNoKHApe2Nhc2UgZmk6YyYmKGEmJihsKz0iICIsbi09MSxhPSExKSxsKz1jLG4tPWRtKGMpKTticmVhaztjYXNlIEJyOmNhc2UgZnI6e2xldCBoPXA9PT1Ccj9jOmMucGFydHMsZD1jW21tXT8/MDtmb3IobGV0IG09aC5sZW5ndGgtMTttPj1kO20tLSl1LnB1c2goe21vZGU6Zixkb2M6aFttXX0pO2JyZWFrfWNhc2UgX3I6Y2FzZSBJcjpjYXNlIE1yOmNhc2UgcHI6dS5wdXNoKHttb2RlOmYsZG9jOmMuY29udGVudHN9KTticmVhaztjYXNlIFByOntsZXR7dGV4dDpoLGNvdW50OmR9PXVBKGwpO2w9aCxuKz1kO2JyZWFrfWNhc2UgSHQ6e2lmKGkmJmMuYnJlYWspcmV0dXJuITE7bGV0IGg9Yy5icmVhaz9rbjpmLGQ9Yy5leHBhbmRlZFN0YXRlcyYmaD09PWtuP210KDAsYy5leHBhbmRlZFN0YXRlcywtMSk6Yy5jb250ZW50czt1LnB1c2goe21vZGU6aCxkb2M6ZH0pO2JyZWFrfWNhc2Ugc246e2xldCBoPShjLmdyb3VwSWQ/c1tjLmdyb3VwSWRdfHxocjpmKT09PWtuP2MuYnJlYWtDb250ZW50czpjLmZsYXRDb250ZW50cztoJiZ1LnB1c2goe21vZGU6Zixkb2M6aH0pO2JyZWFrfWNhc2UgZ3Q6aWYoZj09PWtufHxjLmhhcmQpcmV0dXJuITA7Yy5zb2Z0fHwoYT0hMCk7YnJlYWs7Y2FzZSBPcjpyPSEwO2JyZWFrO2Nhc2UgUnI6aWYocilyZXR1cm4hMTticmVha319cmV0dXJuITF9ZnVuY3Rpb24gUmMoZSx0KXtsZXQgbj1PYmplY3QuY3JlYXRlKG51bGwpLHI9dC5wcmludFdpZHRoLHM9dW0odC5lbmRPZkxpbmUpLGk9MCxvPVt7aW5kZW50Om9BLG1vZGU6a24sZG9jOmV9XSxhPSExLHU9W10sbD1uZXcgQ0k7Zm9yKE9fKGUpO28ubGVuZ3RoPjA7KXtsZXR7aW5kZW50OmQsbW9kZTptLGRvYzpnfT1vLnBvcCgpO3N3aXRjaChwaShnKSl7Y2FzZSBmaTp7bGV0IEQ9cyE9PWAKYD9MYygwLGcsYApgLHMpOmc7RCYmKGwud3JpdGUoRCksby5sZW5ndGg+MCYmKGkrPWRtKEQpKSk7YnJlYWt9Y2FzZSBCcjpmb3IobGV0IEQ9Zy5sZW5ndGgtMTtEPj0wO0QtLSlvLnB1c2goe2luZGVudDpkLG1vZGU6bSxkb2M6Z1tEXX0pO2JyZWFrO2Nhc2UgQ3M6bC5tYXJrUG9zaXRpb24oKTticmVhaztjYXNlIF9yOm8ucHVzaCh7aW5kZW50OkZJKGQsdCksbW9kZTptLGRvYzpnLmNvbnRlbnRzfSk7YnJlYWs7Y2FzZSBJcjpvLnB1c2goe2luZGVudDp2SShkLGcubix0KSxtb2RlOm0sZG9jOmcuY29udGVudHN9KTticmVhaztjYXNlIFByOmktPWwudHJpbSgpO2JyZWFrO2Nhc2UgSHQ6e2xldCBEPWZ1bmN0aW9uKCl7aWYobT09PWhyJiYhYSlyZXR1cm57aW5kZW50OmQsbW9kZTpnLmJyZWFrP2tuOmhyLGRvYzpnLmNvbnRlbnRzfTthPSExO2xldCBiPXItaSxFPXUubGVuZ3RoPjAsRj17aW5kZW50OmQsbW9kZTpocixkb2M6Zy5jb250ZW50c307aWYoIWcuYnJlYWsmJk9jKEYsbyxiLEUsbikpcmV0dXJuIEY7aWYoIWcuZXhwYW5kZWRTdGF0ZXMpcmV0dXJue2luZGVudDpkLG1vZGU6a24sZG9jOmcuY29udGVudHN9O2lmKCFnLmJyZWFrKWZvcihsZXQgdj0xO3Y8Zy5leHBhbmRlZFN0YXRlcy5sZW5ndGgtMTt2Kyspe2xldCBDPXtpbmRlbnQ6ZCxtb2RlOmhyLGRvYzpnLmV4cGFuZGVkU3RhdGVzW3ZdfTtpZihPYyhDLG8sYixFLG4pKXJldHVybiBDfXJldHVybntpbmRlbnQ6ZCxtb2RlOmtuLGRvYzptdCgwLGcuZXhwYW5kZWRTdGF0ZXMsLTEpfX0oKTtvLnB1c2goRCksZy5pZCYmKG5bZy5pZF09RC5tb2RlKTticmVha31jYXNlIGZyOntsZXQgRD1yLWksYj1nW21tXT8/MCx7cGFydHM6RX09ZyxGPUUubGVuZ3RoLWI7aWYoRj09PTApYnJlYWs7bGV0IHY9RVtiKzBdLEM9RVtiKzFdLEE9e2luZGVudDpkLG1vZGU6aHIsZG9jOnZ9LHc9e2luZGVudDpkLG1vZGU6a24sZG9jOnZ9LFQ9T2MoQSxbXSxELHUubGVuZ3RoPjAsbiwhMCk7aWYoRj09PTEpe1Q/by5wdXNoKEEpOm8ucHVzaCh3KTticmVha31sZXQgTj17aW5kZW50OmQsbW9kZTpocixkb2M6Q30seD17aW5kZW50OmQsbW9kZTprbixkb2M6Q307aWYoRj09PTIpe1Q/by5wdXNoKE4sQSk6by5wdXNoKHgsdyk7YnJlYWt9bGV0IEw9RVtiKzJdLFM9e2luZGVudDpkLG1vZGU6bSxkb2M6ey4uLmcsW21tXTpiKzJ9fSxrPU9jKHtpbmRlbnQ6ZCxtb2RlOmhyLGRvYzpbdixDLExdfSxbXSxELHUubGVuZ3RoPjAsbiwhMCk7by5wdXNoKFMpLGs/by5wdXNoKE4sQSk6VD9vLnB1c2goeCxBKTpvLnB1c2goeCx3KTticmVha31jYXNlIHNuOmNhc2UgTXI6e2xldCBEPWcuZ3JvdXBJZD9uW2cuZ3JvdXBJZF06bTtpZihEPT09a24pe2xldCBiPWcudHlwZT09PXNuP2cuYnJlYWtDb250ZW50czpnLm5lZ2F0ZT9nLmNvbnRlbnRzOlBjKGcuY29udGVudHMpO2ImJm8ucHVzaCh7aW5kZW50OmQsbW9kZTptLGRvYzpifSl9aWYoRD09PWhyKXtsZXQgYj1nLnR5cGU9PT1zbj9nLmZsYXRDb250ZW50czpnLm5lZ2F0ZT9QYyhnLmNvbnRlbnRzKTpnLmNvbnRlbnRzO2ImJm8ucHVzaCh7aW5kZW50OmQsbW9kZTptLGRvYzpifSl9YnJlYWt9Y2FzZSBPcjp1LnB1c2goe2luZGVudDpkLG1vZGU6bSxkb2M6Zy5jb250ZW50c30pO2JyZWFrO2Nhc2UgUnI6dS5sZW5ndGg+MCYmby5wdXNoKHtpbmRlbnQ6ZCxtb2RlOm0sZG9jOnBtfSk7YnJlYWs7Y2FzZSBndDpzd2l0Y2gobSl7Y2FzZSBocjppZighZy5oYXJkKXtnLnNvZnR8fChsLndyaXRlKCIgIiksaSs9MSk7YnJlYWt9YT0hMDtjYXNlIGtuOmlmKHUubGVuZ3RoPjApe28ucHVzaCh7aW5kZW50OmQsbW9kZTptLGRvYzpnfSwuLi51LnJldmVyc2UoKSksdS5sZW5ndGg9MDticmVha31nLmxpdGVyYWw/KGwud3JpdGUocyksaT0wLGQucm9vdCYmKGQucm9vdC52YWx1ZSYmbC53cml0ZShkLnJvb3QudmFsdWUpLGk9ZC5yb290Lmxlbmd0aCkpOihsLnRyaW0oKSxsLndyaXRlKHMrZC52YWx1ZSksaT1kLmxlbmd0aCk7YnJlYWt9YnJlYWs7Y2FzZSBwcjpvLnB1c2goe2luZGVudDpkLG1vZGU6bSxkb2M6Zy5jb250ZW50c30pO2JyZWFrO2Nhc2UgeG46YnJlYWs7ZGVmYXVsdDp0aHJvdyBuZXcgJG8oZyl9by5sZW5ndGg9PT0wJiZ1Lmxlbmd0aD4wJiYoby5wdXNoKC4uLnUucmV2ZXJzZSgpKSx1Lmxlbmd0aD0wKX1sZXR7dGV4dDpmLHBvc2l0aW9uczpjfT1sLmZpbmlzaCgpO2lmKGMubGVuZ3RoIT09MilyZXR1cm57Zm9ybWF0dGVkOmZ9O2xldFtwLGhdPWM7cmV0dXJue2Zvcm1hdHRlZDpmLGN1cnNvck5vZGVTdGFydDpwLGN1cnNvck5vZGVUZXh0OmYuc2xpY2UocCxoKX19ZnVuY3Rpb24gU0koZSx0LG49MCl7bGV0IHI9MDtmb3IobGV0IHM9bjtzPGUubGVuZ3RoOysrcyllW3NdPT09IgkiP3I9cit0LXIldDpyKys7cmV0dXJuIHJ9dmFyIGdtPVNJLHhJPShhQz1jbGFzc3tjb25zdHJ1Y3RvcihlKXtidCh0aGlzLEdyKTt0aGlzLnN0YWNrPVtlXX1nZXQga2V5KCl7bGV0e3N0YWNrOmUsc2libGluZ3M6dH09dGhpcztyZXR1cm4gbXQoMCxlLHQ9PT1udWxsPy0yOi00KT8/bnVsbH1nZXQgaW5kZXgoKXtyZXR1cm4gdGhpcy5zaWJsaW5ncz09PW51bGw/bnVsbDptdCgwLHRoaXMuc3RhY2ssLTIpfWdldCBub2RlKCl7cmV0dXJuIG10KDAsdGhpcy5zdGFjaywtMSl9Z2V0IHBhcmVudCgpe3JldHVybiB0aGlzLmdldE5vZGUoMSl9Z2V0IGdyYW5kcGFyZW50KCl7cmV0dXJuIHRoaXMuZ2V0Tm9kZSgyKX1nZXQgaXNJbkFycmF5KCl7cmV0dXJuIHRoaXMuc2libGluZ3MhPT1udWxsfWdldCBzaWJsaW5ncygpe2xldHtzdGFjazplfT10aGlzLHQ9bXQoMCxlLC0zKTtyZXR1cm4gQXJyYXkuaXNBcnJheSh0KT90Om51bGx9Z2V0IG5leHQoKXtsZXR7c2libGluZ3M6ZX09dGhpcztyZXR1cm4gZT09PW51bGw/bnVsbDplW3RoaXMuaW5kZXgrMV19Z2V0IHByZXZpb3VzKCl7bGV0e3NpYmxpbmdzOmV9PXRoaXM7cmV0dXJuIGU9PT1udWxsP251bGw6ZVt0aGlzLmluZGV4LTFdfWdldCBpc0ZpcnN0KCl7cmV0dXJuIHRoaXMuaW5kZXg9PT0wfWdldCBpc0xhc3QoKXtsZXR7c2libGluZ3M6ZSxpbmRleDp0fT10aGlzO3JldHVybiBlIT09bnVsbCYmdD09PWUubGVuZ3RoLTF9Z2V0IGlzUm9vdCgpe3JldHVybiB0aGlzLnN0YWNrLmxlbmd0aD09PTF9Z2V0IHJvb3QoKXtyZXR1cm4gdGhpcy5zdGFja1swXX1nZXQgYW5jZXN0b3JzKCl7cmV0dXJuWy4uLnpuKHRoaXMsR3IseWYpLmNhbGwodGhpcyldfWdldE5hbWUoKXtsZXR7c3RhY2s6ZX09dGhpcyx7bGVuZ3RoOnR9PWU7cmV0dXJuIHQ+MT9tdCgwLGUsLTIpOm51bGx9Z2V0VmFsdWUoKXtyZXR1cm4gbXQoMCx0aGlzLnN0YWNrLC0xKX1nZXROb2RlKGU9MCl7bGV0IHQ9em4odGhpcyxHcixuMSkuY2FsbCh0aGlzLGUpO3JldHVybiB0PT09LTE/bnVsbDp0aGlzLnN0YWNrW3RdfWdldFBhcmVudE5vZGUoZT0wKXtyZXR1cm4gdGhpcy5nZXROb2RlKGUrMSl9Y2FsbChlLC4uLnQpe2xldHtzdGFjazpufT10aGlzLHtsZW5ndGg6cn09bixzPW10KDAsbiwtMSk7Zm9yKGxldCBpIG9mIHQpcz1zPT1udWxsP3ZvaWQgMDpzW2ldLG4ucHVzaChpLHMpO3RyeXtyZXR1cm4gZSh0aGlzKX1maW5hbGx5e24ubGVuZ3RoPXJ9fWNhbGxQYXJlbnQoZSx0PTApe2xldCBuPXpuKHRoaXMsR3IsbjEpLmNhbGwodGhpcyx0KzEpLHI9dGhpcy5zdGFjay5zcGxpY2UobisxKTt0cnl7cmV0dXJuIGUodGhpcyl9ZmluYWxseXt0aGlzLnN0YWNrLnB1c2goLi4ucil9fWVhY2goZSwuLi50KXtsZXR7c3RhY2s6bn09dGhpcyx7bGVuZ3RoOnJ9PW4scz1tdCgwLG4sLTEpO2ZvcihsZXQgaSBvZiB0KXM9c1tpXSxuLnB1c2goaSxzKTt0cnl7Zm9yKGxldCBpPTA7aTxzLmxlbmd0aDsrK2kpbi5wdXNoKGksc1tpXSksZSh0aGlzLGkscyksbi5sZW5ndGgtPTJ9ZmluYWxseXtuLmxlbmd0aD1yfX1tYXAoZSwuLi50KXtsZXQgbj1bXTtyZXR1cm4gdGhpcy5lYWNoKChyLHMsaSk9PntuW3NdPWUocixzLGkpfSwuLi50KSxufW1hdGNoKC4uLmUpe2xldCB0PXRoaXMuc3RhY2subGVuZ3RoLTEsbj1udWxsLHI9dGhpcy5zdGFja1t0LS1dO2ZvcihsZXQgcyBvZiBlKXtpZihyPT09dm9pZCAwKXJldHVybiExO2xldCBpPW51bGw7aWYodHlwZW9mIG49PSJudW1iZXIiJiYoaT1uLG49dGhpcy5zdGFja1t0LS1dLHI9dGhpcy5zdGFja1t0LS1dKSxzJiYhcyhyLG4saSkpcmV0dXJuITE7bj10aGlzLnN0YWNrW3QtLV0scj10aGlzLnN0YWNrW3QtLV19cmV0dXJuITB9ZmluZEFuY2VzdG9yKGUpe2ZvcihsZXQgdCBvZiB6bih0aGlzLEdyLHlmKS5jYWxsKHRoaXMpKWlmKGUodCkpcmV0dXJuIHR9aGFzQW5jZXN0b3IoZSl7Zm9yKGxldCB0IG9mIHpuKHRoaXMsR3IseWYpLmNhbGwodGhpcykpaWYoZSh0KSlyZXR1cm4hMDtyZXR1cm4hMX19LEdyPW5ldyBXZWFrU2V0LG4xPWZ1bmN0aW9uKGUpe2xldHtzdGFjazp0fT10aGlzO2ZvcihsZXQgbj10Lmxlbmd0aC0xO24+PTA7bi09MilpZighQXJyYXkuaXNBcnJheSh0W25dKSYmLS1lPDApcmV0dXJuIG47cmV0dXJuLTF9LHlmPWZ1bmN0aW9uKigpe2xldHtzdGFjazplfT10aGlzO2ZvcihsZXQgdD1lLmxlbmd0aC0zO3Q+PTA7dC09Mil7bGV0IG49ZVt0XTtBcnJheS5pc0FycmF5KG4pfHwoeWllbGQgbil9fSxhQyksa0k9eEk7ZnVuY3Rpb24gVEkoZSl7cmV0dXJuIEFycmF5LmlzQXJyYXkoZSkmJmUubGVuZ3RoPjB9dmFyIGxBPVRJO2Z1bmN0aW9uIE5JKGUpe3JldHVybiBlIT09bnVsbCYmdHlwZW9mIGU9PSJvYmplY3QifXZhciB5bT1OSTtmdW5jdGlvbiBsdShlKXtyZXR1cm4odCxuLHIpPT57aWYobj09PSExKXJldHVybiExO2xldCBzPSEhKHIhPW51bGwmJnIuYmFja3dhcmRzKSx7bGVuZ3RoOml9PXQsbz1uO2Zvcig7bz49MCYmbzxpOyl7bGV0IGE9dC5jaGFyQXQobyk7aWYoZSBpbnN0YW5jZW9mIFJlZ0V4cCl7aWYoIWUudGVzdChhKSlyZXR1cm4gb31lbHNlIGlmKCFlLmluY2x1ZGVzKGEpKXJldHVybiBvO3M/by0tOm8rK31yZXR1cm4gbz09PS0xfHxvPT09aT9vOiExfX12YXIgTEk9bHUoL1xzLyksU3M9bHUoIiAJIiksY0E9bHUoIiw7IAkiKSxmQT1sdSgvW15cblxyXS8pLHBBPWU9PmU9PT1gCmB8fGU9PT0iXHIifHxlPT09Ilx1MjAyOCJ8fGU9PT0iXHUyMDI5IjtmdW5jdGlvbiAkSShlLHQsbil7aWYodD09PSExKXJldHVybiExO2xldCByPSEhKG4hPW51bGwmJm4uYmFja3dhcmRzKSxzPWUuY2hhckF0KHQpO2lmKHIpe2lmKGUuY2hhckF0KHQtMSk9PT0iXHIiJiZzPT09YApgKXJldHVybiB0LTI7aWYocEEocykpcmV0dXJuIHQtMX1lbHNle2lmKHM9PT0iXHIiJiZlLmNoYXJBdCh0KzEpPT09YApgKXJldHVybiB0KzI7aWYocEEocykpcmV0dXJuIHQrMX1yZXR1cm4gdH12YXIgZGk9JEk7ZnVuY3Rpb24gQkkoZSx0LG49e30pe2xldCByPVNzKGUsbi5iYWNrd2FyZHM/dC0xOnQsbikscz1kaShlLHIsbik7cmV0dXJuIHIhPT1zfXZhciB4cz1CSTtmdW5jdGlvbipqYyhlLHQpe2xldHtnZXRWaXNpdG9yS2V5czpuLGZpbHRlcjpyPSgpPT4hMH09dCxzPWk9PnltKGkpJiZyKGkpO2ZvcihsZXQgaSBvZiBuKGUpKXtsZXQgbz1lW2ldO2lmKEFycmF5LmlzQXJyYXkobykpZm9yKGxldCBhIG9mIG8pcyhhKSYmKHlpZWxkIGEpO2Vsc2UgcyhvKSYmKHlpZWxkIG8pfX1mdW5jdGlvbipfSShlLHQpe2xldCBuPVtlXTtmb3IobGV0IHI9MDtyPG4ubGVuZ3RoO3IrKyl7bGV0IHM9bltyXTtmb3IobGV0IGkgb2YgamMocyx0KSl5aWVsZCBpLG4ucHVzaChpKX19ZnVuY3Rpb24gSUkoZSx0KXtyZXR1cm4gamMoZSx0KS5uZXh0KCkuZG9uZX1mdW5jdGlvbiBQSShlLHQsbil7dmFyIHU7bGV0e2ZpbHRlcjpyfT1uO2lmKCFyKXJldHVybltdO2xldCBzLGk9KCgodT1uLmdldENoaWxkcmVuKT09bnVsbD92b2lkIDA6dS5jYWxsKG4sZSxuKSk/P1suLi5qYyhlLHtnZXRWaXNpdG9yS2V5czpuLmdldFZpc2l0b3JLZXlzfSldKS5mbGF0TWFwKGw9PihzPz8ocz1bZSwuLi50XSkscihsLHMpP1tsXTpoQShsLHMsbikpKSx7bG9jU3RhcnQ6byxsb2NFbmQ6YX09bjtyZXR1cm4gaS5zb3J0KChsLGYpPT5vKGwpLW8oZil8fGEobCktYShmKSksaX1mdW5jdGlvbiBoQShlLHQsbil7cmV0dXJuIGxtKG4uY2FjaGUsZSxyPT5QSShyLHQsbikpfXZhciBkQT1oQTtmdW5jdGlvbiBNSShlKXtsZXQgdD1lLnR5cGV8fGUua2luZHx8Iih1bmtub3duIHR5cGUpIixuPVN0cmluZyhlLm5hbWV8fGUuaWQmJih0eXBlb2YgZS5pZD09Im9iamVjdCI/ZS5pZC5uYW1lOmUuaWQpfHxlLmtleSYmKHR5cGVvZiBlLmtleT09Im9iamVjdCI/ZS5rZXkubmFtZTplLmtleSl8fGUudmFsdWUmJih0eXBlb2YgZS52YWx1ZT09Im9iamVjdCI/IiI6U3RyaW5nKGUudmFsdWUpKXx8ZS5vcGVyYXRvcnx8IiIpO3JldHVybiBuLmxlbmd0aD4yMCYmKG49bi5zbGljZSgwLDE5KSsi4oCmIiksdCsobj8iICIrbjoiIil9ZnVuY3Rpb24gRG0oZSx0KXsoZS5jb21tZW50cz8/KGUuY29tbWVudHM9W10pKS5wdXNoKHQpLHQucHJpbnRlZD0hMSx0Lm5vZGVEZXNjcmlwdGlvbj1NSShlKX1mdW5jdGlvbiBjdShlLHQpe3QubGVhZGluZz0hMCx0LnRyYWlsaW5nPSExLERtKGUsdCl9ZnVuY3Rpb24gbWkoZSx0LG4pe3QubGVhZGluZz0hMSx0LnRyYWlsaW5nPSExLG4mJih0Lm1hcmtlcj1uKSxEbShlLHQpfWZ1bmN0aW9uIGZ1KGUsdCl7dC5sZWFkaW5nPSExLHQudHJhaWxpbmc9ITAsRG0oZSx0KX12YXIgbUE9bmV3IFdlYWtNYXA7ZnVuY3Rpb24gZ0EoZSx0LG4scixzPVtdKXtsZXR7bG9jU3RhcnQ6aSxsb2NFbmQ6b309bixhPWkodCksdT1vKHQpLGw9ZEEoZSxzLHtjYWNoZTptQSxsb2NTdGFydDppLGxvY0VuZDpvLGdldFZpc2l0b3JLZXlzOm4uZ2V0VmlzaXRvcktleXMsZmlsdGVyOm4ucHJpbnRlci5jYW5BdHRhY2hDb21tZW50LGdldENoaWxkcmVuOm4ucHJpbnRlci5nZXRDb21tZW50Q2hpbGROb2Rlc30pLGYsYyxwPTAsaD1sLmxlbmd0aDtmb3IoO3A8aDspe2xldCBkPXAraD4+MSxtPWxbZF0sZz1pKG0pLEQ9byhtKTtpZihnPD1hJiZ1PD1EKXJldHVybiBnQShtLHQsbixtLFttLC4uLnNdKTtpZihEPD1hKXtmPW0scD1kKzE7Y29udGludWV9aWYodTw9Zyl7Yz1tLGg9ZDtjb250aW51ZX10aHJvdyBuZXcgRXJyb3IoIkNvbW1lbnQgbG9jYXRpb24gb3ZlcmxhcHMgd2l0aCBub2RlIGxvY2F0aW9uIil9aWYoKHI9PW51bGw/dm9pZCAwOnIudHlwZSk9PT0iVGVtcGxhdGVMaXRlcmFsIil7bGV0e3F1YXNpczpkfT1yLG09RW0oZCx0LG4pO2YmJkVtKGQsZixuKSE9PW0mJihmPW51bGwpLGMmJkVtKGQsYyxuKSE9PW0mJihjPW51bGwpfXJldHVybntlbmNsb3NpbmdOb2RlOnIscHJlY2VkaW5nTm9kZTpmLGZvbGxvd2luZ05vZGU6Y319dmFyIGJtPSgpPT4hMTtmdW5jdGlvbiBPSShlLHQpe2xldHtjb21tZW50czpufT1lO2lmKGRlbGV0ZSBlLmNvbW1lbnRzLCFsQShuKXx8IXQucHJpbnRlci5jYW5BdHRhY2hDb21tZW50KXJldHVybjtsZXQgcj1bXSx7cHJpbnRlcjp7ZmVhdHVyZXM6e2V4cGVyaW1lbnRhbF9hdm9pZEFzdE11dGF0aW9uOnN9LGhhbmRsZUNvbW1lbnRzOmk9e319LG9yaWdpbmFsVGV4dDpvfT10LHtvd25MaW5lOmE9Ym0sZW5kT2ZMaW5lOnU9Ym0scmVtYWluaW5nOmw9Ym19PWksZj1uLm1hcCgocCxoKT0+KHsuLi5nQShlLHAsdCksY29tbWVudDpwLHRleHQ6byxvcHRpb25zOnQsYXN0OmUsaXNMYXN0Q29tbWVudDpuLmxlbmd0aC0xPT09aCxwbGFjZW1lbnQ6dm9pZCAwfSkpLGM9IXM7Zm9yKGxldFtwLGhdb2YgZi5lbnRyaWVzKCkpe2xldHtjb21tZW50OmQscHJlY2VkaW5nTm9kZTptLGVuY2xvc2luZ05vZGU6Zyxmb2xsb3dpbmdOb2RlOkQsdGV4dDpiLG9wdGlvbnM6RSxhc3Q6Rixpc0xhc3RDb21tZW50OnZ9PWgsQz1SSShiLEUsZixwKT8ib3duTGluZSI6akkoYixFLGYscCk/ImVuZE9mTGluZSI6InJlbWFpbmluZyIsQTtpZihzPyhoLnBsYWNlbWVudD1DLEE9W2hdKTpBPVtkLGIsRSxGLHZdLGMmJihkLmVuY2xvc2luZ05vZGU9ZyxkLnByZWNlZGluZ05vZGU9bSxkLmZvbGxvd2luZ05vZGU9RCksZC5wbGFjZW1lbnQ9QyxDPT09Im93bkxpbmUiKWEoLi4uQSl8fChEP2N1KEQsZCk6bT9mdShtLGQpOm1pKGd8fEYsZCkpO2Vsc2UgaWYoQz09PSJlbmRPZkxpbmUiKXUoLi4uQSl8fChtP2Z1KG0sZCk6RD9jdShELGQpOm1pKGd8fEYsZCkpO2Vsc2UgaWYoIWwoLi4uQSkpaWYobSYmRCl7bGV0IHc9ci5sZW5ndGg7dz4wJiZyW3ctMV0uZm9sbG93aW5nTm9kZSE9PUQmJkRBKHIsRSksci5wdXNoKGgpfWVsc2UgbT9mdShtLGQpOkQ/Y3UoRCxkKTptaShnfHxGLGQpfWlmKERBKHIsdCksYylmb3IobGV0IHAgb2YgbilkZWxldGUgcC5wcmVjZWRpbmdOb2RlLGRlbGV0ZSBwLmVuY2xvc2luZ05vZGUsZGVsZXRlIHAuZm9sbG93aW5nTm9kZX12YXIgeUE9ZT0+IS9bXFNcblx1MjAyOFx1MjAyOV0vLnRlc3QoZSk7ZnVuY3Rpb24gUkkoZSx0LG4scil7bGV0e2NvbW1lbnQ6cyxwcmVjZWRpbmdOb2RlOml9PW5bcl0se2xvY1N0YXJ0Om8sbG9jRW5kOmF9PXQsdT1vKHMpO2lmKGkpZm9yKGxldCBsPXItMTtsPj0wO2wtLSl7bGV0e2NvbW1lbnQ6ZixwcmVjZWRpbmdOb2RlOmN9PW5bbF07aWYoYyE9PWl8fCF5QShlLnNsaWNlKGEoZiksdSkpKWJyZWFrO3U9byhmKX1yZXR1cm4geHMoZSx1LHtiYWNrd2FyZHM6ITB9KX1mdW5jdGlvbiBqSShlLHQsbixyKXtsZXR7Y29tbWVudDpzLGZvbGxvd2luZ05vZGU6aX09bltyXSx7bG9jU3RhcnQ6byxsb2NFbmQ6YX09dCx1PWEocyk7aWYoaSlmb3IobGV0IGw9cisxO2w8bi5sZW5ndGg7bCsrKXtsZXR7Y29tbWVudDpmLGZvbGxvd2luZ05vZGU6Y309bltsXTtpZihjIT09aXx8IXlBKGUuc2xpY2UodSxvKGYpKSkpYnJlYWs7dT1hKGYpfXJldHVybiB4cyhlLHUpfWZ1bmN0aW9uIERBKGUsdCl7dmFyIGEsdTtsZXQgbj1lLmxlbmd0aDtpZihuPT09MClyZXR1cm47bGV0e3ByZWNlZGluZ05vZGU6cixmb2xsb3dpbmdOb2RlOnN9PWVbMF0saT10LmxvY1N0YXJ0KHMpLG87Zm9yKG89bjtvPjA7LS1vKXtsZXR7Y29tbWVudDpsLHByZWNlZGluZ05vZGU6Zixmb2xsb3dpbmdOb2RlOmN9PWVbby0xXSxwPXQub3JpZ2luYWxUZXh0LnNsaWNlKHQubG9jRW5kKGwpLGkpO2lmKCgodT0oYT10LnByaW50ZXIpLmlzR2FwKT09bnVsbD92b2lkIDA6dS5jYWxsKGEscCx0KSk/Py9eW1xzKF0qJC8udGVzdChwKSlpPXQubG9jU3RhcnQobCk7ZWxzZSBicmVha31mb3IobGV0W2wse2NvbW1lbnQ6Zn1db2YgZS5lbnRyaWVzKCkpbDxvP2Z1KHIsZik6Y3UocyxmKTtmb3IobGV0IGwgb2ZbcixzXSlsLmNvbW1lbnRzJiZsLmNvbW1lbnRzLmxlbmd0aD4xJiZsLmNvbW1lbnRzLnNvcnQoKGYsYyk9PnQubG9jU3RhcnQoZiktdC5sb2NTdGFydChjKSk7ZS5sZW5ndGg9MH1mdW5jdGlvbiBFbShlLHQsbil7bGV0IHI9bi5sb2NTdGFydCh0KS0xO2ZvcihsZXQgcz0xO3M8ZS5sZW5ndGg7KytzKWlmKHI8bi5sb2NTdGFydChlW3NdKSlyZXR1cm4gcy0xO3JldHVybiAwfWZ1bmN0aW9uIFZJKGUsdCl7bGV0IG49dC0xO249U3MoZSxuLHtiYWNrd2FyZHM6ITB9KSxuPWRpKGUsbix7YmFja3dhcmRzOiEwfSksbj1TcyhlLG4se2JhY2t3YXJkczohMH0pO2xldCByPWRpKGUsbix7YmFja3dhcmRzOiEwfSk7cmV0dXJuIG4hPT1yfXZhciB2bT1WSSxiQT0oKT0+ITA7ZnVuY3Rpb24gRUEoZSx0KXtsZXQgbj1lLm5vZGU7cmV0dXJuIG4ucHJpbnRlZD0hMCx0LnByaW50ZXIucHJpbnRDb21tZW50KGUsdCl9ZnVuY3Rpb24gVUkoZSx0KXt2YXIgbDtsZXQgbj1lLm5vZGUscj1bRUEoZSx0KV0se3ByaW50ZXI6cyxvcmlnaW5hbFRleHQ6aSxsb2NTdGFydDpvLGxvY0VuZDphfT10O2lmKChsPXMuaXNCbG9ja0NvbW1lbnQpIT1udWxsJiZsLmNhbGwocyxuKSl7bGV0IGY9IiAiO3hzKGksYShuKSkmJih4cyhpLG8obikse2JhY2t3YXJkczohMH0pP2Y9anI6Zj1lQSksci5wdXNoKGYpfWVsc2Ugci5wdXNoKGpyKTtsZXQgdT1kaShpLFNzKGksYShuKSkpO3JldHVybiB1IT09ITEmJnhzKGksdSkmJnIucHVzaChqcikscn1mdW5jdGlvbiBxSShlLHQsbil7dmFyIGw7bGV0IHI9ZS5ub2RlLHM9RUEoZSx0KSx7cHJpbnRlcjppLG9yaWdpbmFsVGV4dDpvLGxvY1N0YXJ0OmF9PXQsdT0obD1pLmlzQmxvY2tDb21tZW50KT09bnVsbD92b2lkIDA6bC5jYWxsKGkscik7aWYobiE9bnVsbCYmbi5oYXNMaW5lU3VmZml4JiYhKG4hPW51bGwmJm4uaXNCbG9jayl8fHhzKG8sYShyKSx7YmFja3dhcmRzOiEwfSkpe2xldCBmPXZtKG8sYShyKSk7cmV0dXJue2RvYzpobShbanIsZj9qcjoiIixzXSksaXNCbG9jazp1LGhhc0xpbmVTdWZmaXg6ITB9fXJldHVybiF1fHxuIT1udWxsJiZuLmhhc0xpbmVTdWZmaXg/e2RvYzpbaG0oWyIgIixzXSksTWNdLGlzQmxvY2s6dSxoYXNMaW5lU3VmZml4OiEwfTp7ZG9jOlsiICIsc10saXNCbG9jazp1LGhhc0xpbmVTdWZmaXg6ITF9fWZ1bmN0aW9uIFdJKGUsdCxuKXt2YXIgbyxhO2xldCByPXRbU3ltYm9sLmZvcigicHJpbnRlZENvbW1lbnRzIildLHM9YkEsaT1uZXcgU2V0KChhPShvPWUubm9kZSk9PW51bGw/dm9pZCAwOm8uY29tbWVudHMpPT1udWxsP3ZvaWQgMDphLmZpbHRlcih1PT4hKHIhPW51bGwmJnIuaGFzKHUpKSYmdS5sZWFkaW5nJiZzKHUpKSk7cmV0dXJuIGkuc2l6ZT09PTA/IiI6ZS5tYXAoKHtub2RlOnV9KT0+aS5oYXModSk/VUkoZSx0KToiIiwiY29tbWVudHMiKS5maWx0ZXIoQm9vbGVhbil9ZnVuY3Rpb24gSEkoZSx0LG4pe3ZhciBmO2xldCByPShmPWUubm9kZSk9PW51bGw/dm9pZCAwOmYuY29tbWVudHMscz1uZXcgU2V0KHI9PW51bGw/dm9pZCAwOnIuZmlsdGVyKGM9PmMudHJhaWxpbmcpKSxpPXRbU3ltYm9sLmZvcigicHJpbnRlZENvbW1lbnRzIildLG89YkEsYT1uZXcgU2V0KHI9PW51bGw/dm9pZCAwOnIuZmlsdGVyKGM9PnMuaGFzKGMpJiYhKGkhPW51bGwmJmkuaGFzKGMpKSYmbyhjKSkpO2lmKGEuc2l6ZT09PTApcmV0dXJuIiI7bGV0IHU9W10sbDtyZXR1cm4gZS5lYWNoKCh7bm9kZTpjfSk9PntzLmhhcyhjKSYmKGw9cUkoZSx0LGwpLGEuaGFzKGMpJiZ1LnB1c2gobC5kb2MpKX0sImNvbW1lbnRzIiksdX1mdW5jdGlvbiBKSShlLHQsbixyKXtsZXQgcz1XSShlLG4pLGk9SEkoZSxuKTtyZXR1cm4gc3x8aT9JYyh0LG89PltzLG8saV0pOnR9ZnVuY3Rpb24gekkoZSl7bGV0e1tCY106dCxbU3ltYm9sLmZvcigicHJpbnRlZENvbW1lbnRzIildOm59PWU7Zm9yKGxldCByIG9mIHQpe2lmKCFyLnByaW50ZWQmJiFuLmhhcyhyKSl0aHJvdyBuZXcgRXJyb3IoJ0NvbW1lbnQgIicrci52YWx1ZS50cmltKCkrJyIgd2FzIG5vdCBwcmludGVkLiBQbGVhc2UgcmVwb3J0IHRoaXMgZXJyb3IhJyk7ZGVsZXRlIHIucHJpbnRlZH19dmFyIHZBPWNsYXNzIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IoKXtzdXBlciguLi5hcmd1bWVudHMpO1dlKHRoaXMsIm5hbWUiLCJDb25maWdFcnJvciIpfX0sRkE9Y2xhc3MgZXh0ZW5kcyBFcnJvcntjb25zdHJ1Y3Rvcigpe3N1cGVyKC4uLmFyZ3VtZW50cyk7V2UodGhpcywibmFtZSIsIlVuZGVmaW5lZFBhcnNlckVycm9yIil9fSxHST1PYmplY3QuaGFzT3duPz9GdW5jdGlvbi5wcm90b3R5cGUuY2FsbC5iaW5kKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkpLFZjPUdJLEtJPXtjaGVja0lnbm9yZVByYWdtYTp7Y2F0ZWdvcnk6IlNwZWNpYWwiLHR5cGU6ImJvb2xlYW4iLGRlZmF1bHQ6ITEsZGVzY3JpcHRpb246IkNoZWNrIHdoZXRoZXIgdGhlIGZpbGUncyBmaXJzdCBkb2NibG9jayBjb21tZW50IGNvbnRhaW5zICdAbm9wcmV0dGllcicgb3IgJ0Bub2Zvcm1hdCcgdG8gZGV0ZXJtaW5lIGlmIGl0IHNob3VsZCBiZSBmb3JtYXR0ZWQuIixjbGlDYXRlZ29yeToiT3RoZXIifSxjdXJzb3JPZmZzZXQ6e2NhdGVnb3J5OiJTcGVjaWFsIix0eXBlOiJpbnQiLGRlZmF1bHQ6LTEscmFuZ2U6e3N0YXJ0Oi0xLGVuZDoxLzAsc3RlcDoxfSxkZXNjcmlwdGlvbjoiUHJpbnQgKHRvIHN0ZGVycikgd2hlcmUgYSBjdXJzb3IgYXQgdGhlIGdpdmVuIHBvc2l0aW9uIHdvdWxkIG1vdmUgdG8gYWZ0ZXIgZm9ybWF0dGluZy4iLGNsaUNhdGVnb3J5OiJFZGl0b3IifSxlbmRPZkxpbmU6e2NhdGVnb3J5OiJHbG9iYWwiLHR5cGU6ImNob2ljZSIsZGVmYXVsdDoibGYiLGRlc2NyaXB0aW9uOiJXaGljaCBlbmQgb2YgbGluZSBjaGFyYWN0ZXJzIHRvIGFwcGx5LiIsY2hvaWNlczpbe3ZhbHVlOiJsZiIsZGVzY3JpcHRpb246IkxpbmUgRmVlZCBvbmx5IChcXG4pLCBjb21tb24gb24gTGludXggYW5kIG1hY09TIGFzIHdlbGwgYXMgaW5zaWRlIGdpdCByZXBvcyJ9LHt2YWx1ZToiY3JsZiIsZGVzY3JpcHRpb246IkNhcnJpYWdlIFJldHVybiArIExpbmUgRmVlZCBjaGFyYWN0ZXJzIChcXHJcXG4pLCBjb21tb24gb24gV2luZG93cyJ9LHt2YWx1ZToiY3IiLGRlc2NyaXB0aW9uOiJDYXJyaWFnZSBSZXR1cm4gY2hhcmFjdGVyIG9ubHkgKFxcciksIHVzZWQgdmVyeSByYXJlbHkifSx7dmFsdWU6ImF1dG8iLGRlc2NyaXB0aW9uOmBNYWludGFpbiBleGlzdGluZwoobWl4ZWQgdmFsdWVzIHdpdGhpbiBvbmUgZmlsZSBhcmUgbm9ybWFsaXNlZCBieSBsb29raW5nIGF0IHdoYXQncyB1c2VkIGFmdGVyIHRoZSBmaXJzdCBsaW5lKWB9XX0sZmlsZXBhdGg6e2NhdGVnb3J5OiJTcGVjaWFsIix0eXBlOiJwYXRoIixkZXNjcmlwdGlvbjoiU3BlY2lmeSB0aGUgaW5wdXQgZmlsZXBhdGguIFRoaXMgd2lsbCBiZSB1c2VkIHRvIGRvIHBhcnNlciBpbmZlcmVuY2UuIixjbGlOYW1lOiJzdGRpbi1maWxlcGF0aCIsY2xpQ2F0ZWdvcnk6Ik90aGVyIixjbGlEZXNjcmlwdGlvbjoiUGF0aCB0byB0aGUgZmlsZSB0byBwcmV0ZW5kIHRoYXQgc3RkaW4gY29tZXMgZnJvbS4ifSxpbnNlcnRQcmFnbWE6e2NhdGVnb3J5OiJTcGVjaWFsIix0eXBlOiJib29sZWFuIixkZWZhdWx0OiExLGRlc2NyaXB0aW9uOiJJbnNlcnQgQGZvcm1hdCBwcmFnbWEgaW50byBmaWxlJ3MgZmlyc3QgZG9jYmxvY2sgY29tbWVudC4iLGNsaUNhdGVnb3J5OiJPdGhlciJ9LHBhcnNlcjp7Y2F0ZWdvcnk6Ikdsb2JhbCIsdHlwZToiY2hvaWNlIixkZWZhdWx0OnZvaWQgMCxkZXNjcmlwdGlvbjoiV2hpY2ggcGFyc2VyIHRvIHVzZS4iLGV4Y2VwdGlvbjplPT50eXBlb2YgZT09InN0cmluZyJ8fHR5cGVvZiBlPT0iZnVuY3Rpb24iLGNob2ljZXM6W3t2YWx1ZToiZmxvdyIsZGVzY3JpcHRpb246IkZsb3cifSx7dmFsdWU6ImJhYmVsIixkZXNjcmlwdGlvbjoiSmF2YVNjcmlwdCJ9LHt2YWx1ZToiYmFiZWwtZmxvdyIsZGVzY3JpcHRpb246IkZsb3cifSx7dmFsdWU6ImJhYmVsLXRzIixkZXNjcmlwdGlvbjoiVHlwZVNjcmlwdCJ9LHt2YWx1ZToidHlwZXNjcmlwdCIsZGVzY3JpcHRpb246IlR5cGVTY3JpcHQifSx7dmFsdWU6ImFjb3JuIixkZXNjcmlwdGlvbjoiSmF2YVNjcmlwdCJ9LHt2YWx1ZToiZXNwcmVlIixkZXNjcmlwdGlvbjoiSmF2YVNjcmlwdCJ9LHt2YWx1ZToibWVyaXlhaCIsZGVzY3JpcHRpb246IkphdmFTY3JpcHQifSx7dmFsdWU6ImNzcyIsZGVzY3JpcHRpb246IkNTUyJ9LHt2YWx1ZToibGVzcyIsZGVzY3JpcHRpb246Ikxlc3MifSx7dmFsdWU6InNjc3MiLGRlc2NyaXB0aW9uOiJTQ1NTIn0se3ZhbHVlOiJqc29uIixkZXNjcmlwdGlvbjoiSlNPTiJ9LHt2YWx1ZToianNvbjUiLGRlc2NyaXB0aW9uOiJKU09ONSJ9LHt2YWx1ZToianNvbmMiLGRlc2NyaXB0aW9uOiJKU09OIHdpdGggQ29tbWVudHMifSx7dmFsdWU6Impzb24tc3RyaW5naWZ5IixkZXNjcmlwdGlvbjoiSlNPTi5zdHJpbmdpZnkifSx7dmFsdWU6ImdyYXBocWwiLGRlc2NyaXB0aW9uOiJHcmFwaFFMIn0se3ZhbHVlOiJtYXJrZG93biIsZGVzY3JpcHRpb246Ik1hcmtkb3duIn0se3ZhbHVlOiJtZHgiLGRlc2NyaXB0aW9uOiJNRFgifSx7dmFsdWU6InZ1ZSIsZGVzY3JpcHRpb246IlZ1ZSJ9LHt2YWx1ZToieWFtbCIsZGVzY3JpcHRpb246IllBTUwifSx7dmFsdWU6ImdsaW1tZXIiLGRlc2NyaXB0aW9uOiJFbWJlciAvIEhhbmRsZWJhcnMifSx7dmFsdWU6Imh0bWwiLGRlc2NyaXB0aW9uOiJIVE1MIn0se3ZhbHVlOiJhbmd1bGFyIixkZXNjcmlwdGlvbjoiQW5ndWxhciJ9LHt2YWx1ZToibHdjIixkZXNjcmlwdGlvbjoiTGlnaHRuaW5nIFdlYiBDb21wb25lbnRzIn0se3ZhbHVlOiJtam1sIixkZXNjcmlwdGlvbjoiTUpNTCJ9XX0scGx1Z2luczp7dHlwZToicGF0aCIsYXJyYXk6ITAsZGVmYXVsdDpbe3ZhbHVlOltdfV0sY2F0ZWdvcnk6Ikdsb2JhbCIsZGVzY3JpcHRpb246IkFkZCBhIHBsdWdpbi4gTXVsdGlwbGUgcGx1Z2lucyBjYW4gYmUgcGFzc2VkIGFzIHNlcGFyYXRlIGAtLXBsdWdpbmBzLiIsZXhjZXB0aW9uOmU9PnR5cGVvZiBlPT0ic3RyaW5nInx8dHlwZW9mIGU9PSJvYmplY3QiLGNsaU5hbWU6InBsdWdpbiIsY2xpQ2F0ZWdvcnk6IkNvbmZpZyJ9LHByaW50V2lkdGg6e2NhdGVnb3J5OiJHbG9iYWwiLHR5cGU6ImludCIsZGVmYXVsdDo4MCxkZXNjcmlwdGlvbjoiVGhlIGxpbmUgbGVuZ3RoIHdoZXJlIFByZXR0aWVyIHdpbGwgdHJ5IHdyYXAuIixyYW5nZTp7c3RhcnQ6MCxlbmQ6MS8wLHN0ZXA6MX19LHJhbmdlRW5kOntjYXRlZ29yeToiU3BlY2lhbCIsdHlwZToiaW50IixkZWZhdWx0OjEvMCxyYW5nZTp7c3RhcnQ6MCxlbmQ6MS8wLHN0ZXA6MX0sZGVzY3JpcHRpb246YEZvcm1hdCBjb2RlIGVuZGluZyBhdCBhIGdpdmVuIGNoYXJhY3RlciBvZmZzZXQgKGV4Y2x1c2l2ZSkuClRoZSByYW5nZSB3aWxsIGV4dGVuZCBmb3J3YXJkcyB0byB0aGUgZW5kIG9mIHRoZSBzZWxlY3RlZCBzdGF0ZW1lbnQuYCxjbGlDYXRlZ29yeToiRWRpdG9yIn0scmFuZ2VTdGFydDp7Y2F0ZWdvcnk6IlNwZWNpYWwiLHR5cGU6ImludCIsZGVmYXVsdDowLHJhbmdlOntzdGFydDowLGVuZDoxLzAsc3RlcDoxfSxkZXNjcmlwdGlvbjpgRm9ybWF0IGNvZGUgc3RhcnRpbmcgYXQgYSBnaXZlbiBjaGFyYWN0ZXIgb2Zmc2V0LgpUaGUgcmFuZ2Ugd2lsbCBleHRlbmQgYmFja3dhcmRzIHRvIHRoZSBzdGFydCBvZiB0aGUgZmlyc3QgbGluZSBjb250YWluaW5nIHRoZSBzZWxlY3RlZCBzdGF0ZW1lbnQuYCxjbGlDYXRlZ29yeToiRWRpdG9yIn0scmVxdWlyZVByYWdtYTp7Y2F0ZWdvcnk6IlNwZWNpYWwiLHR5cGU6ImJvb2xlYW4iLGRlZmF1bHQ6ITEsZGVzY3JpcHRpb246IlJlcXVpcmUgZWl0aGVyICdAcHJldHRpZXInIG9yICdAZm9ybWF0JyB0byBiZSBwcmVzZW50IGluIHRoZSBmaWxlJ3MgZmlyc3QgZG9jYmxvY2sgY29tbWVudCBpbiBvcmRlciBmb3IgaXQgdG8gYmUgZm9ybWF0dGVkLiIsY2xpQ2F0ZWdvcnk6Ik90aGVyIn0sdGFiV2lkdGg6e3R5cGU6ImludCIsY2F0ZWdvcnk6Ikdsb2JhbCIsZGVmYXVsdDoyLGRlc2NyaXB0aW9uOiJOdW1iZXIgb2Ygc3BhY2VzIHBlciBpbmRlbnRhdGlvbiBsZXZlbC4iLHJhbmdlOntzdGFydDowLGVuZDoxLzAsc3RlcDoxfX0sdXNlVGFiczp7Y2F0ZWdvcnk6Ikdsb2JhbCIsdHlwZToiYm9vbGVhbiIsZGVmYXVsdDohMSxkZXNjcmlwdGlvbjoiSW5kZW50IHdpdGggdGFicyBpbnN0ZWFkIG9mIHNwYWNlcy4ifSxlbWJlZGRlZExhbmd1YWdlRm9ybWF0dGluZzp7Y2F0ZWdvcnk6Ikdsb2JhbCIsdHlwZToiY2hvaWNlIixkZWZhdWx0OiJhdXRvIixkZXNjcmlwdGlvbjoiQ29udHJvbCBob3cgUHJldHRpZXIgZm9ybWF0cyBxdW90ZWQgY29kZSBlbWJlZGRlZCBpbiB0aGUgZmlsZS4iLGNob2ljZXM6W3t2YWx1ZToiYXV0byIsZGVzY3JpcHRpb246IkZvcm1hdCBlbWJlZGRlZCBjb2RlIGlmIFByZXR0aWVyIGNhbiBhdXRvbWF0aWNhbGx5IGlkZW50aWZ5IGl0LiJ9LHt2YWx1ZToib2ZmIixkZXNjcmlwdGlvbjoiTmV2ZXIgYXV0b21hdGljYWxseSBmb3JtYXQgZW1iZWRkZWQgY29kZS4ifV19fTtmdW5jdGlvbiBBQSh7cGx1Z2luczplPVtdLHNob3dEZXByZWNhdGVkOnQ9ITF9PXt9KXtsZXQgbj1lLmZsYXRNYXAocz0+cy5sYW5ndWFnZXM/P1tdKSxyPVtdO2ZvcihsZXQgcyBvZiBZSShPYmplY3QuYXNzaWduKHt9LC4uLmUubWFwKCh7b3B0aW9uczppfSk9PmkpLEtJKSkpIXQmJnMuZGVwcmVjYXRlZHx8KEFycmF5LmlzQXJyYXkocy5jaG9pY2VzKSYmKHR8fChzLmNob2ljZXM9cy5jaG9pY2VzLmZpbHRlcihpPT4haS5kZXByZWNhdGVkKSkscy5uYW1lPT09InBhcnNlciImJihzLmNob2ljZXM9Wy4uLnMuY2hvaWNlcywuLi5YSShzLmNob2ljZXMsbixlKV0pKSxzLnBsdWdpbkRlZmF1bHRzPU9iamVjdC5mcm9tRW50cmllcyhlLmZpbHRlcihpPT57dmFyIG87cmV0dXJuKChvPWkuZGVmYXVsdE9wdGlvbnMpPT1udWxsP3ZvaWQgMDpvW3MubmFtZV0pIT09dm9pZCAwfSkubWFwKGk9PltpLm5hbWUsaS5kZWZhdWx0T3B0aW9uc1tzLm5hbWVdXSkpLHIucHVzaChzKSk7cmV0dXJue2xhbmd1YWdlczpuLG9wdGlvbnM6cn19ZnVuY3Rpb24qWEkoZSx0LG4pe2xldCByPW5ldyBTZXQoZS5tYXAocz0+cy52YWx1ZSkpO2ZvcihsZXQgcyBvZiB0KWlmKHMucGFyc2Vycyl7Zm9yKGxldCBpIG9mIHMucGFyc2VycylpZighci5oYXMoaSkpe3IuYWRkKGkpO2xldCBvPW4uZmluZCh1PT51LnBhcnNlcnMmJlZjKHUucGFyc2VycyxpKSksYT1zLm5hbWU7byE9bnVsbCYmby5uYW1lJiYoYSs9YCAocGx1Z2luOiAke28ubmFtZX0pYCkseWllbGR7dmFsdWU6aSxkZXNjcmlwdGlvbjphfX19fWZ1bmN0aW9uIFlJKGUpe2xldCB0PVtdO2ZvcihsZXRbbixyXW9mIE9iamVjdC5lbnRyaWVzKGUpKXtsZXQgcz17bmFtZTpuLC4uLnJ9O0FycmF5LmlzQXJyYXkocy5kZWZhdWx0KSYmKHMuZGVmYXVsdD1tdCgwLHMuZGVmYXVsdCwtMSkudmFsdWUpLHQucHVzaChzKX1yZXR1cm4gdH12YXIgUUk9QXJyYXkucHJvdG90eXBlLnRvUmV2ZXJzZWQ/P2Z1bmN0aW9uKCl7cmV0dXJuWy4uLnRoaXNdLnJldmVyc2UoKX0sWkk9YXUoInRvUmV2ZXJzZWQiLGZ1bmN0aW9uKCl7aWYoQXJyYXkuaXNBcnJheSh0aGlzKSlyZXR1cm4gUUl9KSxlUD1aSTtmdW5jdGlvbiB0UCgpe3ZhciByLHMsaSxvLGE7bGV0IGU9Z2xvYmFsVGhpcyx0PShyPWUucHJvY2Vzcyk9PW51bGw/dm9pZCAwOnIucGxhdGZvcm07aWYodHlwZW9mIHQ9PSJzdHJpbmciKXJldHVybiB0LnN0YXJ0c1dpdGgoIndpbiIpO2xldCBuPShpPShzPWUuRGVubyk9PW51bGw/dm9pZCAwOnMuYnVpbGQpPT1udWxsP3ZvaWQgMDppLm9zO3JldHVybiB0eXBlb2Ygbj09InN0cmluZyI/bj09PSJ3aW5kb3dzIjooKGE9KG89ZS5uYXZpZ2F0b3IpPT1udWxsP3ZvaWQgMDpvLnBsYXRmb3JtKT09bnVsbD92b2lkIDA6YS5zdGFydHNXaXRoKCJXaW4iKSk/PyExfXZhciBuUD10UCgpO2Z1bmN0aW9uIHdBKGUpe2lmKGU9ZSBpbnN0YW5jZW9mIFVSTD9lOm5ldyBVUkwoZSksZS5wcm90b2NvbCE9PSJmaWxlOiIpdGhyb3cgbmV3IFR5cGVFcnJvcihgVVJMIG11c3QgYmUgYSBmaWxlIFVSTDogcmVjZWl2ZWQgIiR7ZS5wcm90b2NvbH0iYCk7cmV0dXJuIGV9ZnVuY3Rpb24gclAoZSl7cmV0dXJuIGU9d0EoZSksZGVjb2RlVVJJQ29tcG9uZW50KGUucGF0aG5hbWUucmVwbGFjZSgvJSg/IVswLTlBLUZhLWZdezJ9KS9nLCIlMjUiKSl9ZnVuY3Rpb24gc1AoZSl7ZT13QShlKTtsZXQgdD1kZWNvZGVVUklDb21wb25lbnQoZS5wYXRobmFtZS5yZXBsYWNlKC9cLy9nLCJcXCIpLnJlcGxhY2UoLyUoPyFbMC05QS1GYS1mXXsyfSkvZywiJTI1IikpLnJlcGxhY2UoL15cXCooW0EtWmEtel06KShcXHwkKS8sIiQxXFwiKTtyZXR1cm4gZS5ob3N0bmFtZSE9PSIiJiYodD1gXFxcXCR7ZS5ob3N0bmFtZX0ke3R9YCksdH1mdW5jdGlvbiBpUChlKXtyZXR1cm4gblA/c1AoZSk6clAoZSl9dmFyIG9QPWU9PlN0cmluZyhlKS5zcGxpdCgvWy9cXF0vKS5wb3AoKSxhUD1lPT5TdHJpbmcoZSkuc3RhcnRzV2l0aCgiZmlsZToiKTtmdW5jdGlvbiBDQShlLHQpe2lmKCF0KXJldHVybjtsZXQgbj1vUCh0KS50b0xvd2VyQ2FzZSgpO3JldHVybiBlLmZpbmQoKHtmaWxlbmFtZXM6cn0pPT5yPT1udWxsP3ZvaWQgMDpyLnNvbWUocz0+cy50b0xvd2VyQ2FzZSgpPT09bikpPz9lLmZpbmQoKHtleHRlbnNpb25zOnJ9KT0+cj09bnVsbD92b2lkIDA6ci5zb21lKHM9Pm4uZW5kc1dpdGgocykpKX1mdW5jdGlvbiB1UChlLHQpe2lmKHQpcmV0dXJuIGUuZmluZCgoe25hbWU6bn0pPT5uLnRvTG93ZXJDYXNlKCk9PT10KT8/ZS5maW5kKCh7YWxpYXNlczpufSk9Pm49PW51bGw/dm9pZCAwOm4uaW5jbHVkZXModCkpPz9lLmZpbmQoKHtleHRlbnNpb25zOm59KT0+bj09bnVsbD92b2lkIDA6bi5pbmNsdWRlcyhgLiR7dH1gKSl9dmFyIEZtPXZvaWQgMDtmdW5jdGlvbiBTQShlLHQpe2lmKHQpe2lmKGFQKHQpKXRyeXt0PWlQKHQpfWNhdGNoe3JldHVybn1pZih0eXBlb2YgdD09InN0cmluZyIpcmV0dXJuIGUuZmluZCgoe2lzU3VwcG9ydGVkOm59KT0+bj09bnVsbD92b2lkIDA6bih7ZmlsZXBhdGg6dH0pKX19ZnVuY3Rpb24gbFAoZSx0KXt2YXIgcjtsZXQgbj1lUCgwLGUucGx1Z2lucykuZmxhdE1hcChzPT5zLmxhbmd1YWdlcz8/W10pO3JldHVybihyPXVQKG4sdC5sYW5ndWFnZSk/P0NBKG4sdC5waHlzaWNhbEZpbGUpPz9DQShuLHQuZmlsZSk/P1NBKG4sdC5waHlzaWNhbEZpbGUpPz9TQShuLHQuZmlsZSk/PyhGbT09bnVsbD92b2lkIDA6Rm0obix0LnBoeXNpY2FsRmlsZSkpKT09bnVsbD92b2lkIDA6ci5wYXJzZXJzWzBdfXZhciB4QT1sUCxfbz17a2V5OmU9Pi9eWyRfYS16QS1aXVskX2EtekEtWjAtOV0qJC8udGVzdChlKT9lOkpTT04uc3RyaW5naWZ5KGUpLHZhbHVlKGUpe2lmKGU9PT1udWxsfHx0eXBlb2YgZSE9Im9iamVjdCIpcmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpO2lmKEFycmF5LmlzQXJyYXkoZSkpcmV0dXJuYFske2UubWFwKG49Pl9vLnZhbHVlKG4pKS5qb2luKCIsICIpfV1gO2xldCB0PU9iamVjdC5rZXlzKGUpO3JldHVybiB0Lmxlbmd0aD09PTA/Int9IjpgeyAke3QubWFwKG49PmAke19vLmtleShuKX06ICR7X28udmFsdWUoZVtuXSl9YCkuam9pbigiLCAiKX0gfWB9LHBhaXI6KHtrZXk6ZSx2YWx1ZTp0fSk9Pl9vLnZhbHVlKHtbZV06dH0pfSxrQT1uZXcgUHJveHkoU3RyaW5nLHtnZXQ6KCk9PmtBfSksZHI9a0EsY1A9KGUsdCx7ZGVzY3JpcHRvcjpufSk9PntsZXQgcj1bYCR7ZHIueWVsbG93KHR5cGVvZiBlPT0ic3RyaW5nIj9uLmtleShlKTpuLnBhaXIoZSkpfSBpcyBkZXByZWNhdGVkYF07cmV0dXJuIHQmJnIucHVzaChgd2Ugbm93IHRyZWF0IGl0IGFzICR7ZHIuYmx1ZSh0eXBlb2YgdD09InN0cmluZyI/bi5rZXkodCk6bi5wYWlyKHQpKX1gKSxyLmpvaW4oIjsgIikrIi4ifSxUQT1TeW1ib2wuZm9yKCJ2bm9wdHMuVkFMVUVfTk9UX0VYSVNUIiksVWM9U3ltYm9sLmZvcigidm5vcHRzLlZBTFVFX1VOQ0hBTkdFRCIpLE5BPSIgIi5yZXBlYXQoMiksZlA9KGUsdCxuKT0+e2xldHt0ZXh0OnIsbGlzdDpzfT1uLm5vcm1hbGl6ZUV4cGVjdGVkUmVzdWx0KG4uc2NoZW1hc1tlXS5leHBlY3RlZChuKSksaT1bXTtyZXR1cm4gciYmaS5wdXNoKExBKGUsdCxyLG4uZGVzY3JpcHRvcikpLHMmJmkucHVzaChbTEEoZSx0LHMudGl0bGUsbi5kZXNjcmlwdG9yKV0uY29uY2F0KHMudmFsdWVzLm1hcChvPT4kQShvLG4ubG9nZ2VyUHJpbnRXaWR0aCkpKS5qb2luKGAKYCkpLEJBKGksbi5sb2dnZXJQcmludFdpZHRoKX07ZnVuY3Rpb24gTEEoZSx0LG4scil7cmV0dXJuW2BJbnZhbGlkICR7ZHIucmVkKHIua2V5KGUpKX0gdmFsdWUuYCxgRXhwZWN0ZWQgJHtkci5ibHVlKG4pfSxgLGBidXQgcmVjZWl2ZWQgJHt0PT09VEE/ZHIuZ3JheSgibm90aGluZyIpOmRyLnJlZChyLnZhbHVlKHQpKX0uYF0uam9pbigiICIpfWZ1bmN0aW9uICRBKHt0ZXh0OmUsbGlzdDp0fSxuKXtsZXQgcj1bXTtyZXR1cm4gZSYmci5wdXNoKGAtICR7ZHIuYmx1ZShlKX1gKSx0JiZyLnB1c2goW2AtICR7ZHIuYmx1ZSh0LnRpdGxlKX06YF0uY29uY2F0KHQudmFsdWVzLm1hcChzPT4kQShzLG4tTkEubGVuZ3RoKS5yZXBsYWNlKC9efFxuL2csYCQmJHtOQX1gKSkpLmpvaW4oYApgKSksQkEocixuKX1mdW5jdGlvbiBCQShlLHQpe2lmKGUubGVuZ3RoPT09MSlyZXR1cm4gZVswXTtsZXRbbixyXT1lLFtzLGldPWUubWFwKG89Pm8uc3BsaXQoYApgLDEpWzBdLmxlbmd0aCk7cmV0dXJuIHM+dCYmcz5pP3I6bn12YXIgSW89W10sQW09W107ZnVuY3Rpb24gd20oZSx0LG4pe2lmKGU9PT10KXJldHVybiAwO2xldCByPW49PW51bGw/dm9pZCAwOm4ubWF4RGlzdGFuY2Uscz1lO2UubGVuZ3RoPnQubGVuZ3RoJiYoZT10LHQ9cyk7bGV0IGk9ZS5sZW5ndGgsbz10Lmxlbmd0aDtmb3IoO2k+MCYmZS5jaGFyQ29kZUF0KH4taSk9PT10LmNoYXJDb2RlQXQofi1vKTspaS0tLG8tLTtsZXQgYT0wO2Zvcig7YTxpJiZlLmNoYXJDb2RlQXQoYSk9PT10LmNoYXJDb2RlQXQoYSk7KWErKztpZihpLT1hLG8tPWEsciE9PXZvaWQgMCYmby1pPnIpcmV0dXJuIHI7aWYoaT09PTApcmV0dXJuIHIhPT12b2lkIDAmJm8+cj9yOm87bGV0IHUsbCxmLGMscD0wLGg9MDtmb3IoO3A8aTspQW1bcF09ZS5jaGFyQ29kZUF0KGErcCksSW9bcF09KytwO2Zvcig7aDxvOyl7Zm9yKHU9dC5jaGFyQ29kZUF0KGEraCksZj1oKyssbD1oLHA9MDtwPGk7cCsrKWM9dT09PUFtW3BdP2Y6ZisxLGY9SW9bcF0sbD1Jb1twXT1mPmw/Yz5sP2wrMTpjOmM+Zj9mKzE6YztpZihyIT09dm9pZCAwKXtsZXQgZD1sO2ZvcihwPTA7cDxpO3ArKylJb1twXTxkJiYoZD1Jb1twXSk7aWYoZD5yKXJldHVybiByfX1yZXR1cm4gSW8ubGVuZ3RoPWksQW0ubGVuZ3RoPWksciE9PXZvaWQgMCYmbD5yP3I6bH1mdW5jdGlvbiBwUChlLHQsbil7aWYoIUFycmF5LmlzQXJyYXkodCl8fHQubGVuZ3RoPT09MClyZXR1cm47bGV0IHI9bj09bnVsbD92b2lkIDA6bi5tYXhEaXN0YW5jZSxzPWUubGVuZ3RoO2ZvcihsZXQgdSBvZiB0KWlmKHU9PT1lKXJldHVybiB1O2xldCBpLG89TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZLGE9bmV3IFNldDtmb3IobGV0IHUgb2YgdCl7aWYoYS5oYXModSkpY29udGludWU7YS5hZGQodSk7bGV0IGw9TWF0aC5hYnModS5sZW5ndGgtcyk7aWYobD49b3x8bD5yKWNvbnRpbnVlO2xldCBmPU51bWJlci5pc0Zpbml0ZShvKT9NYXRoLm1pbihvLHIpOnIsYz1mPT09dm9pZCAwP3dtKGUsdSk6d20oZSx1LHttYXhEaXN0YW5jZTpmfSk7aWYoYz5yKWNvbnRpbnVlO2xldCBwPWM7aWYoZiE9PXZvaWQgMCYmYz09PWYmJmY9PT1yJiYocD13bShlLHUpKSxwPG8mJihvPXAsaT11LG89PT0wKSlicmVha31pZighKG8+cikpcmV0dXJuIGl9dmFyIF9BPShlLHQse2Rlc2NyaXB0b3I6bixsb2dnZXI6cixzY2hlbWFzOnN9KT0+e2xldCBpPVtgSWdub3JlZCB1bmtub3duIG9wdGlvbiAke2RyLnllbGxvdyhuLnBhaXIoe2tleTplLHZhbHVlOnR9KSl9LmBdLG89cFAoZSxPYmplY3Qua2V5cyhzKSx7bWF4RGlzdGFuY2U6M30pO28mJmkucHVzaChgRGlkIHlvdSBtZWFuICR7ZHIuYmx1ZShuLmtleShvKSl9P2ApLHIud2FybihpLmpvaW4oIiAiKSl9LGhQPVsiZGVmYXVsdCIsImV4cGVjdGVkIiwidmFsaWRhdGUiLCJkZXByZWNhdGVkIiwiZm9yd2FyZCIsInJlZGlyZWN0Iiwib3ZlcmxhcCIsInByZXByb2Nlc3MiLCJwb3N0cHJvY2VzcyJdO2Z1bmN0aW9uIGRQKGUsdCl7bGV0IG49bmV3IGUodCkscj1PYmplY3QuY3JlYXRlKG4pO2ZvcihsZXQgcyBvZiBoUClzIGluIHQmJihyW3NdPW1QKHRbc10sbixrcy5wcm90b3R5cGVbc10ubGVuZ3RoKSk7cmV0dXJuIHJ9dmFyIGtzPWNsYXNze3N0YXRpYyBjcmVhdGUoZSl7cmV0dXJuIGRQKHRoaXMsZSl9Y29uc3RydWN0b3IoZSl7dGhpcy5uYW1lPWUubmFtZX1kZWZhdWx0KGUpe31leHBlY3RlZChlKXtyZXR1cm4ibm90aGluZyJ9dmFsaWRhdGUoZSx0KXtyZXR1cm4hMX1kZXByZWNhdGVkKGUsdCl7cmV0dXJuITF9Zm9yd2FyZChlLHQpe31yZWRpcmVjdChlLHQpe31vdmVybGFwKGUsdCxuKXtyZXR1cm4gZX1wcmVwcm9jZXNzKGUsdCl7cmV0dXJuIGV9cG9zdHByb2Nlc3MoZSx0KXtyZXR1cm4gVWN9fTtmdW5jdGlvbiBtUChlLHQsbil7cmV0dXJuIHR5cGVvZiBlPT0iZnVuY3Rpb24iPyguLi5yKT0+ZSguLi5yLnNsaWNlKDAsbi0xKSx0LC4uLnIuc2xpY2Uobi0xKSk6KCk9PmV9dmFyIGdQPWNsYXNzIGV4dGVuZHMga3N7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5fc291cmNlTmFtZT1lLnNvdXJjZU5hbWV9ZXhwZWN0ZWQoZSl7cmV0dXJuIGUuc2NoZW1hc1t0aGlzLl9zb3VyY2VOYW1lXS5leHBlY3RlZChlKX12YWxpZGF0ZShlLHQpe3JldHVybiB0LnNjaGVtYXNbdGhpcy5fc291cmNlTmFtZV0udmFsaWRhdGUoZSx0KX1yZWRpcmVjdChlLHQpe3JldHVybiB0aGlzLl9zb3VyY2VOYW1lfX0seVA9Y2xhc3MgZXh0ZW5kcyBrc3tleHBlY3RlZCgpe3JldHVybiJhbnl0aGluZyJ9dmFsaWRhdGUoKXtyZXR1cm4hMH19LERQPWNsYXNzIGV4dGVuZHMga3N7Y29uc3RydWN0b3Ioe3ZhbHVlU2NoZW1hOmUsbmFtZTp0PWUubmFtZSwuLi5ufSl7c3VwZXIoey4uLm4sbmFtZTp0fSksdGhpcy5fdmFsdWVTY2hlbWE9ZX1leHBlY3RlZChlKXtsZXR7dGV4dDp0LGxpc3Q6bn09ZS5ub3JtYWxpemVFeHBlY3RlZFJlc3VsdCh0aGlzLl92YWx1ZVNjaGVtYS5leHBlY3RlZChlKSk7cmV0dXJue3RleHQ6dCYmYGFuIGFycmF5IG9mICR7dH1gLGxpc3Q6biYme3RpdGxlOiJhbiBhcnJheSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyIsdmFsdWVzOlt7bGlzdDpufV19fX12YWxpZGF0ZShlLHQpe2lmKCFBcnJheS5pc0FycmF5KGUpKXJldHVybiExO2xldCBuPVtdO2ZvcihsZXQgciBvZiBlKXtsZXQgcz10Lm5vcm1hbGl6ZVZhbGlkYXRlUmVzdWx0KHRoaXMuX3ZhbHVlU2NoZW1hLnZhbGlkYXRlKHIsdCkscik7cyE9PSEwJiZuLnB1c2gocy52YWx1ZSl9cmV0dXJuIG4ubGVuZ3RoPT09MD8hMDp7dmFsdWU6bn19ZGVwcmVjYXRlZChlLHQpe2xldCBuPVtdO2ZvcihsZXQgciBvZiBlKXtsZXQgcz10Lm5vcm1hbGl6ZURlcHJlY2F0ZWRSZXN1bHQodGhpcy5fdmFsdWVTY2hlbWEuZGVwcmVjYXRlZChyLHQpLHIpO3MhPT0hMSYmbi5wdXNoKC4uLnMubWFwKCh7dmFsdWU6aX0pPT4oe3ZhbHVlOltpXX0pKSl9cmV0dXJuIG59Zm9yd2FyZChlLHQpe2xldCBuPVtdO2ZvcihsZXQgciBvZiBlKXtsZXQgcz10Lm5vcm1hbGl6ZUZvcndhcmRSZXN1bHQodGhpcy5fdmFsdWVTY2hlbWEuZm9yd2FyZChyLHQpLHIpO24ucHVzaCguLi5zLm1hcChJQSkpfXJldHVybiBufXJlZGlyZWN0KGUsdCl7bGV0IG49W10scj1bXTtmb3IobGV0IHMgb2YgZSl7bGV0IGk9dC5ub3JtYWxpemVSZWRpcmVjdFJlc3VsdCh0aGlzLl92YWx1ZVNjaGVtYS5yZWRpcmVjdChzLHQpLHMpOyJyZW1haW4iaW4gaSYmbi5wdXNoKGkucmVtYWluKSxyLnB1c2goLi4uaS5yZWRpcmVjdC5tYXAoSUEpKX1yZXR1cm4gbi5sZW5ndGg9PT0wP3tyZWRpcmVjdDpyfTp7cmVkaXJlY3Q6cixyZW1haW46bn19b3ZlcmxhcChlLHQpe3JldHVybiBlLmNvbmNhdCh0KX19O2Z1bmN0aW9uIElBKHtmcm9tOmUsdG86dH0pe3JldHVybntmcm9tOltlXSx0bzp0fX12YXIgYlA9Y2xhc3MgZXh0ZW5kcyBrc3tleHBlY3RlZCgpe3JldHVybiJ0cnVlIG9yIGZhbHNlIn12YWxpZGF0ZShlKXtyZXR1cm4gdHlwZW9mIGU9PSJib29sZWFuIn19O2Z1bmN0aW9uIEVQKGUsdCl7bGV0IG49T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IHIgb2YgZSl7bGV0IHM9clt0XTtpZihuW3NdKXRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlICR7dH0gJHtKU09OLnN0cmluZ2lmeShzKX1gKTtuW3NdPXJ9cmV0dXJuIG59ZnVuY3Rpb24gdlAoZSx0KXtsZXQgbj1uZXcgTWFwO2ZvcihsZXQgciBvZiBlKXtsZXQgcz1yW3RdO2lmKG4uaGFzKHMpKXRocm93IG5ldyBFcnJvcihgRHVwbGljYXRlICR7dH0gJHtKU09OLnN0cmluZ2lmeShzKX1gKTtuLnNldChzLHIpfXJldHVybiBufWZ1bmN0aW9uIEZQKCl7bGV0IGU9T2JqZWN0LmNyZWF0ZShudWxsKTtyZXR1cm4gdD0+e2xldCBuPUpTT04uc3RyaW5naWZ5KHQpO3JldHVybiBlW25dPyEwOihlW25dPSEwLCExKX19ZnVuY3Rpb24gQVAoZSx0KXtsZXQgbj1bXSxyPVtdO2ZvcihsZXQgcyBvZiBlKXQocyk/bi5wdXNoKHMpOnIucHVzaChzKTtyZXR1cm5bbixyXX1mdW5jdGlvbiB3UChlKXtyZXR1cm4gZT09PU1hdGguZmxvb3IoZSl9ZnVuY3Rpb24gQ1AoZSx0KXtpZihlPT09dClyZXR1cm4gMDtsZXQgbj10eXBlb2YgZSxyPXR5cGVvZiB0LHM9WyJ1bmRlZmluZWQiLCJvYmplY3QiLCJib29sZWFuIiwibnVtYmVyIiwic3RyaW5nIl07cmV0dXJuIG4hPT1yP3MuaW5kZXhPZihuKS1zLmluZGV4T2Yocik6biE9PSJzdHJpbmciP051bWJlcihlKS1OdW1iZXIodCk6ZS5sb2NhbGVDb21wYXJlKHQpfWZ1bmN0aW9uIFNQKGUpe3JldHVybiguLi50KT0+e2xldCBuPWUoLi4udCk7cmV0dXJuIHR5cGVvZiBuPT0ic3RyaW5nIj9uZXcgRXJyb3Iobik6bn19ZnVuY3Rpb24gUEEoZSl7cmV0dXJuIGU9PT12b2lkIDA/e306ZX1mdW5jdGlvbiBNQShlKXtpZih0eXBlb2YgZT09InN0cmluZyIpcmV0dXJue3RleHQ6ZX07bGV0e3RleHQ6dCxsaXN0Om59PWU7cmV0dXJuIHhQKCh0fHxuKSE9PXZvaWQgMCwiVW5leHBlY3RlZCBgZXhwZWN0ZWRgIHJlc3VsdCwgdGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IG9uZSBmaWVsZC4iKSxuP3t0ZXh0OnQsbGlzdDp7dGl0bGU6bi50aXRsZSx2YWx1ZXM6bi52YWx1ZXMubWFwKE1BKX19Ont0ZXh0OnR9fWZ1bmN0aW9uIE9BKGUsdCl7cmV0dXJuIGU9PT0hMD8hMDplPT09ITE/e3ZhbHVlOnR9OmV9ZnVuY3Rpb24gUkEoZSx0LG49ITEpe3JldHVybiBlPT09ITE/ITE6ZT09PSEwP24/ITA6W3t2YWx1ZTp0fV06InZhbHVlImluIGU/W2VdOmUubGVuZ3RoPT09MD8hMTplfWZ1bmN0aW9uIGpBKGUsdCl7cmV0dXJuIHR5cGVvZiBlPT0ic3RyaW5nInx8ImtleSJpbiBlP3tmcm9tOnQsdG86ZX06ImZyb20iaW4gZT97ZnJvbTplLmZyb20sdG86ZS50b306e2Zyb206dCx0bzplLnRvfX1mdW5jdGlvbiBDbShlLHQpe3JldHVybiBlPT09dm9pZCAwP1tdOkFycmF5LmlzQXJyYXkoZSk/ZS5tYXAobj0+akEobix0KSk6W2pBKGUsdCldfWZ1bmN0aW9uIFZBKGUsdCl7bGV0IG49Q20odHlwZW9mIGU9PSJvYmplY3QiJiYicmVkaXJlY3QiaW4gZT9lLnJlZGlyZWN0OmUsdCk7cmV0dXJuIG4ubGVuZ3RoPT09MD97cmVtYWluOnQscmVkaXJlY3Q6bn06dHlwZW9mIGU9PSJvYmplY3QiJiYicmVtYWluImluIGU/e3JlbWFpbjplLnJlbWFpbixyZWRpcmVjdDpufTp7cmVkaXJlY3Q6bn19ZnVuY3Rpb24geFAoZSx0KXtpZighZSl0aHJvdyBuZXcgRXJyb3IodCl9dmFyIGtQPWNsYXNzIGV4dGVuZHMga3N7Y29uc3RydWN0b3IoZSl7c3VwZXIoZSksdGhpcy5fY2hvaWNlcz12UChlLmNob2ljZXMubWFwKHQ9PnQmJnR5cGVvZiB0PT0ib2JqZWN0Ij90Ont2YWx1ZTp0fSksInZhbHVlIil9ZXhwZWN0ZWQoe2Rlc2NyaXB0b3I6ZX0pe2xldCB0PUFycmF5LmZyb20odGhpcy5fY2hvaWNlcy5rZXlzKCkpLm1hcChzPT50aGlzLl9jaG9pY2VzLmdldChzKSkuZmlsdGVyKCh7aGlkZGVuOnN9KT0+IXMpLm1hcChzPT5zLnZhbHVlKS5zb3J0KENQKS5tYXAoZS52YWx1ZSksbj10LnNsaWNlKDAsLTIpLHI9dC5zbGljZSgtMik7cmV0dXJue3RleHQ6bi5jb25jYXQoci5qb2luKCIgb3IgIikpLmpvaW4oIiwgIiksbGlzdDp7dGl0bGU6Im9uZSBvZiB0aGUgZm9sbG93aW5nIHZhbHVlcyIsdmFsdWVzOnR9fX12YWxpZGF0ZShlKXtyZXR1cm4gdGhpcy5fY2hvaWNlcy5oYXMoZSl9ZGVwcmVjYXRlZChlKXtsZXQgdD10aGlzLl9jaG9pY2VzLmdldChlKTtyZXR1cm4gdCYmdC5kZXByZWNhdGVkP3t2YWx1ZTplfTohMX1mb3J3YXJkKGUpe2xldCB0PXRoaXMuX2Nob2ljZXMuZ2V0KGUpO3JldHVybiB0P3QuZm9yd2FyZDp2b2lkIDB9cmVkaXJlY3QoZSl7bGV0IHQ9dGhpcy5fY2hvaWNlcy5nZXQoZSk7cmV0dXJuIHQ/dC5yZWRpcmVjdDp2b2lkIDB9fSxUUD1jbGFzcyBleHRlbmRzIGtze2V4cGVjdGVkKCl7cmV0dXJuImEgbnVtYmVyIn12YWxpZGF0ZShlLHQpe3JldHVybiB0eXBlb2YgZT09Im51bWJlciJ9fSxOUD1jbGFzcyBleHRlbmRzIFRQe2V4cGVjdGVkKCl7cmV0dXJuImFuIGludGVnZXIifXZhbGlkYXRlKGUsdCl7cmV0dXJuIHQubm9ybWFsaXplVmFsaWRhdGVSZXN1bHQoc3VwZXIudmFsaWRhdGUoZSx0KSxlKT09PSEwJiZ3UChlKX19LFVBPWNsYXNzIGV4dGVuZHMga3N7ZXhwZWN0ZWQoKXtyZXR1cm4iYSBzdHJpbmcifXZhbGlkYXRlKGUpe3JldHVybiB0eXBlb2YgZT09InN0cmluZyJ9fSxMUD1fbywkUD1fQSxCUD1mUCxfUD1jUCxJUD1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe2xldHtsb2dnZXI6bj1jb25zb2xlLGxvZ2dlclByaW50V2lkdGg6cj04MCxkZXNjcmlwdG9yOnM9TFAsdW5rbm93bjppPSRQLGludmFsaWQ6bz1CUCxkZXByZWNhdGVkOmE9X1AsbWlzc2luZzp1PSgpPT4hMSxyZXF1aXJlZDpsPSgpPT4hMSxwcmVwcm9jZXNzOmY9cD0+cCxwb3N0cHJvY2VzczpjPSgpPT5VY309dHx8e307dGhpcy5fdXRpbHM9e2Rlc2NyaXB0b3I6cyxsb2dnZXI6bnx8e3dhcm46KCk9Pnt9fSxsb2dnZXJQcmludFdpZHRoOnIsc2NoZW1hczpFUChlLCJuYW1lIiksbm9ybWFsaXplRGVmYXVsdFJlc3VsdDpQQSxub3JtYWxpemVFeHBlY3RlZFJlc3VsdDpNQSxub3JtYWxpemVEZXByZWNhdGVkUmVzdWx0OlJBLG5vcm1hbGl6ZUZvcndhcmRSZXN1bHQ6Q20sbm9ybWFsaXplUmVkaXJlY3RSZXN1bHQ6VkEsbm9ybWFsaXplVmFsaWRhdGVSZXN1bHQ6T0F9LHRoaXMuX3Vua25vd25IYW5kbGVyPWksdGhpcy5faW52YWxpZEhhbmRsZXI9U1AobyksdGhpcy5fZGVwcmVjYXRlZEhhbmRsZXI9YSx0aGlzLl9pZGVudGlmeU1pc3Npbmc9KHAsaCk9PiEocCBpbiBoKXx8dShwLGgpLHRoaXMuX2lkZW50aWZ5UmVxdWlyZWQ9bCx0aGlzLl9wcmVwcm9jZXNzPWYsdGhpcy5fcG9zdHByb2Nlc3M9Yyx0aGlzLmNsZWFuSGlzdG9yeSgpfWNsZWFuSGlzdG9yeSgpe3RoaXMuX2hhc0RlcHJlY2F0aW9uV2FybmVkPUZQKCl9bm9ybWFsaXplKGUpe2xldCB0PXt9LG49W3RoaXMuX3ByZXByb2Nlc3MoZSx0aGlzLl91dGlscyldLHI9KCk9Pntmb3IoO24ubGVuZ3RoIT09MDspe2xldCBzPW4uc2hpZnQoKSxpPXRoaXMuX2FwcGx5Tm9ybWFsaXphdGlvbihzLHQpO24ucHVzaCguLi5pKX19O3IoKTtmb3IobGV0IHMgb2YgT2JqZWN0LmtleXModGhpcy5fdXRpbHMuc2NoZW1hcykpe2xldCBpPXRoaXMuX3V0aWxzLnNjaGVtYXNbc107aWYoIShzIGluIHQpKXtsZXQgbz1QQShpLmRlZmF1bHQodGhpcy5fdXRpbHMpKTsidmFsdWUiaW4gbyYmbi5wdXNoKHtbc106by52YWx1ZX0pfX1yKCk7Zm9yKGxldCBzIG9mIE9iamVjdC5rZXlzKHRoaXMuX3V0aWxzLnNjaGVtYXMpKXtpZighKHMgaW4gdCkpY29udGludWU7bGV0IGk9dGhpcy5fdXRpbHMuc2NoZW1hc1tzXSxvPXRbc10sYT1pLnBvc3Rwcm9jZXNzKG8sdGhpcy5fdXRpbHMpO2EhPT1VYyYmKHRoaXMuX2FwcGx5VmFsaWRhdGlvbihhLHMsaSksdFtzXT1hKX1yZXR1cm4gdGhpcy5fYXBwbHlQb3N0cHJvY2Vzcyh0KSx0aGlzLl9hcHBseVJlcXVpcmVkQ2hlY2sodCksdH1fYXBwbHlOb3JtYWxpemF0aW9uKGUsdCl7bGV0IG49W10se2tub3duS2V5czpyLHVua25vd25LZXlzOnN9PXRoaXMuX3BhcnRpdGlvbk9wdGlvbktleXMoZSk7Zm9yKGxldCBpIG9mIHIpe2xldCBvPXRoaXMuX3V0aWxzLnNjaGVtYXNbaV0sYT1vLnByZXByb2Nlc3MoZVtpXSx0aGlzLl91dGlscyk7dGhpcy5fYXBwbHlWYWxpZGF0aW9uKGEsaSxvKTtsZXQgdT0oe2Zyb206Yyx0bzpwfSk9PntuLnB1c2godHlwZW9mIHA9PSJzdHJpbmciP3tbcF06Y306e1twLmtleV06cC52YWx1ZX0pfSxsPSh7dmFsdWU6YyxyZWRpcmVjdFRvOnB9KT0+e2xldCBoPVJBKG8uZGVwcmVjYXRlZChjLHRoaXMuX3V0aWxzKSxhLCEwKTtpZihoIT09ITEpaWYoaD09PSEwKXRoaXMuX2hhc0RlcHJlY2F0aW9uV2FybmVkKGkpfHx0aGlzLl91dGlscy5sb2dnZXIud2Fybih0aGlzLl9kZXByZWNhdGVkSGFuZGxlcihpLHAsdGhpcy5fdXRpbHMpKTtlbHNlIGZvcihsZXR7dmFsdWU6ZH1vZiBoKXtsZXQgbT17a2V5OmksdmFsdWU6ZH07aWYoIXRoaXMuX2hhc0RlcHJlY2F0aW9uV2FybmVkKG0pKXtsZXQgZz10eXBlb2YgcD09InN0cmluZyI/e2tleTpwLHZhbHVlOmR9OnA7dGhpcy5fdXRpbHMubG9nZ2VyLndhcm4odGhpcy5fZGVwcmVjYXRlZEhhbmRsZXIobSxnLHRoaXMuX3V0aWxzKSl9fX07Q20oby5mb3J3YXJkKGEsdGhpcy5fdXRpbHMpLGEpLmZvckVhY2godSk7bGV0IGY9VkEoby5yZWRpcmVjdChhLHRoaXMuX3V0aWxzKSxhKTtpZihmLnJlZGlyZWN0LmZvckVhY2godSksInJlbWFpbiJpbiBmKXtsZXQgYz1mLnJlbWFpbjt0W2ldPWkgaW4gdD9vLm92ZXJsYXAodFtpXSxjLHRoaXMuX3V0aWxzKTpjLGwoe3ZhbHVlOmN9KX1mb3IobGV0e2Zyb206Yyx0bzpwfW9mIGYucmVkaXJlY3QpbCh7dmFsdWU6YyxyZWRpcmVjdFRvOnB9KX1mb3IobGV0IGkgb2Ygcyl7bGV0IG89ZVtpXTt0aGlzLl9hcHBseVVua25vd25IYW5kbGVyKGksbyx0LChhLHUpPT57bi5wdXNoKHtbYV06dX0pfSl9cmV0dXJuIG59X2FwcGx5UmVxdWlyZWRDaGVjayhlKXtmb3IobGV0IHQgb2YgT2JqZWN0LmtleXModGhpcy5fdXRpbHMuc2NoZW1hcykpaWYodGhpcy5faWRlbnRpZnlNaXNzaW5nKHQsZSkmJnRoaXMuX2lkZW50aWZ5UmVxdWlyZWQodCkpdGhyb3cgdGhpcy5faW52YWxpZEhhbmRsZXIodCxUQSx0aGlzLl91dGlscyl9X3BhcnRpdGlvbk9wdGlvbktleXMoZSl7bGV0W3Qsbl09QVAoT2JqZWN0LmtleXMoZSkuZmlsdGVyKHI9PiF0aGlzLl9pZGVudGlmeU1pc3NpbmcocixlKSkscj0+ciBpbiB0aGlzLl91dGlscy5zY2hlbWFzKTtyZXR1cm57a25vd25LZXlzOnQsdW5rbm93bktleXM6bn19X2FwcGx5VmFsaWRhdGlvbihlLHQsbil7bGV0IHI9T0Eobi52YWxpZGF0ZShlLHRoaXMuX3V0aWxzKSxlKTtpZihyIT09ITApdGhyb3cgdGhpcy5faW52YWxpZEhhbmRsZXIodCxyLnZhbHVlLHRoaXMuX3V0aWxzKX1fYXBwbHlVbmtub3duSGFuZGxlcihlLHQsbixyKXtsZXQgcz10aGlzLl91bmtub3duSGFuZGxlcihlLHQsdGhpcy5fdXRpbHMpO2lmKHMpZm9yKGxldCBpIG9mIE9iamVjdC5rZXlzKHMpKXtpZih0aGlzLl9pZGVudGlmeU1pc3NpbmcoaSxzKSljb250aW51ZTtsZXQgbz1zW2ldO2kgaW4gdGhpcy5fdXRpbHMuc2NoZW1hcz9yKGksbyk6bltpXT1vfX1fYXBwbHlQb3N0cHJvY2VzcyhlKXtsZXQgdD10aGlzLl9wb3N0cHJvY2VzcyhlLHRoaXMuX3V0aWxzKTtpZih0IT09VWMpe2lmKHQuZGVsZXRlKWZvcihsZXQgbiBvZiB0LmRlbGV0ZSlkZWxldGUgZVtuXTtpZih0Lm92ZXJyaWRlKXtsZXR7a25vd25LZXlzOm4sdW5rbm93bktleXM6cn09dGhpcy5fcGFydGl0aW9uT3B0aW9uS2V5cyh0Lm92ZXJyaWRlKTtmb3IobGV0IHMgb2Ygbil7bGV0IGk9dC5vdmVycmlkZVtzXTt0aGlzLl9hcHBseVZhbGlkYXRpb24oaSxzLHRoaXMuX3V0aWxzLnNjaGVtYXNbc10pLGVbc109aX1mb3IobGV0IHMgb2Ygcil7bGV0IGk9dC5vdmVycmlkZVtzXTt0aGlzLl9hcHBseVVua25vd25IYW5kbGVyKHMsaSxlLChvLGEpPT57bGV0IHU9dGhpcy5fdXRpbHMuc2NoZW1hc1tvXTt0aGlzLl9hcHBseVZhbGlkYXRpb24oYSxvLHUpLGVbb109YX0pfX19fX0sU207ZnVuY3Rpb24gUFAoZSx0LHtsb2dnZXI6bj0hMSxpc0NMSTpyPSExLHBhc3NUaHJvdWdoOnM9ITEsRmxhZ1NjaGVtYTppLGRlc2NyaXB0b3I6b309e30pe2lmKHIpe2lmKCFpKXRocm93IG5ldyBFcnJvcigiJ0ZsYWdTY2hlbWEnIG9wdGlvbiBpcyByZXF1aXJlZC4iKTtpZighbyl0aHJvdyBuZXcgRXJyb3IoIidkZXNjcmlwdG9yJyBvcHRpb24gaXMgcmVxdWlyZWQuIil9ZWxzZSBvPV9vO2xldCBhPXM/QXJyYXkuaXNBcnJheShzKT8ocCxoKT0+cy5pbmNsdWRlcyhwKT97W3BdOmh9OnZvaWQgMDoocCxoKT0+KHtbcF06aH0pOihwLGgsZCk9PntsZXR7XzptLC4uLmd9PWQuc2NoZW1hcztyZXR1cm4gX0EocCxoLHsuLi5kLHNjaGVtYXM6Z30pfSx1PU1QKHQse2lzQ0xJOnIsRmxhZ1NjaGVtYTppfSksbD1uZXcgSVAodSx7bG9nZ2VyOm4sdW5rbm93bjphLGRlc2NyaXB0b3I6b30pLGY9biE9PSExO2YmJlNtJiYobC5faGFzRGVwcmVjYXRpb25XYXJuZWQ9U20pO2xldCBjPWwubm9ybWFsaXplKGUpO3JldHVybiBmJiYoU209bC5faGFzRGVwcmVjYXRpb25XYXJuZWQpLGN9ZnVuY3Rpb24gTVAoZSx7aXNDTEk6dCxGbGFnU2NoZW1hOm59KXtsZXQgcj1bXTt0JiZyLnB1c2goeVAuY3JlYXRlKHtuYW1lOiJfIn0pKTtmb3IobGV0IHMgb2YgZSlyLnB1c2goT1Aocyx7aXNDTEk6dCxvcHRpb25JbmZvczplLEZsYWdTY2hlbWE6bn0pKSxzLmFsaWFzJiZ0JiZyLnB1c2goZ1AuY3JlYXRlKHtuYW1lOnMuYWxpYXMsc291cmNlTmFtZTpzLm5hbWV9KSk7cmV0dXJuIHJ9ZnVuY3Rpb24gT1AoZSx7aXNDTEk6dCxvcHRpb25JbmZvczpuLEZsYWdTY2hlbWE6cn0pe2xldHtuYW1lOnN9PWUsaT17bmFtZTpzfSxvLGE9e307c3dpdGNoKGUudHlwZSl7Y2FzZSJpbnQiOm89TlAsdCYmKGkucHJlcHJvY2Vzcz1OdW1iZXIpO2JyZWFrO2Nhc2Uic3RyaW5nIjpvPVVBO2JyZWFrO2Nhc2UiY2hvaWNlIjpvPWtQLGkuY2hvaWNlcz1lLmNob2ljZXMubWFwKHU9PnUhPW51bGwmJnUucmVkaXJlY3Q/ey4uLnUscmVkaXJlY3Q6e3RvOntrZXk6ZS5uYW1lLHZhbHVlOnUucmVkaXJlY3R9fX06dSk7YnJlYWs7Y2FzZSJib29sZWFuIjpvPWJQO2JyZWFrO2Nhc2UiZmxhZyI6bz1yLGkuZmxhZ3M9bi5mbGF0TWFwKHU9Plt1LmFsaWFzLHUuZGVzY3JpcHRpb24mJnUubmFtZSx1Lm9wcG9zaXRlRGVzY3JpcHRpb24mJmBuby0ke3UubmFtZX1gXS5maWx0ZXIoQm9vbGVhbikpO2JyZWFrO2Nhc2UicGF0aCI6bz1VQTticmVhaztkZWZhdWx0OnRocm93IG5ldyBFcnJvcihgVW5leHBlY3RlZCB0eXBlICR7ZS50eXBlfWApfWlmKGUuZXhjZXB0aW9uP2kudmFsaWRhdGU9KHUsbCxmKT0+ZS5leGNlcHRpb24odSl8fGwudmFsaWRhdGUodSxmKTppLnZhbGlkYXRlPSh1LGwsZik9PnU9PT12b2lkIDB8fGwudmFsaWRhdGUodSxmKSxlLnJlZGlyZWN0JiYoYS5yZWRpcmVjdD11PT51P3t0bzp0eXBlb2YgZS5yZWRpcmVjdD09InN0cmluZyI/ZS5yZWRpcmVjdDp7a2V5OmUucmVkaXJlY3Qub3B0aW9uLHZhbHVlOmUucmVkaXJlY3QudmFsdWV9fTp2b2lkIDApLGUuZGVwcmVjYXRlZCYmKGEuZGVwcmVjYXRlZD0hMCksdCYmIWUuYXJyYXkpe2xldCB1PWkucHJlcHJvY2Vzc3x8KGw9PmwpO2kucHJlcHJvY2Vzcz0obCxmLGMpPT5mLnByZXByb2Nlc3ModShBcnJheS5pc0FycmF5KGwpP210KDAsbCwtMSk6bCksYyl9cmV0dXJuIGUuYXJyYXk/RFAuY3JlYXRlKHsuLi50P3twcmVwcm9jZXNzOnU9PkFycmF5LmlzQXJyYXkodSk/dTpbdV19Ont9LC4uLmEsdmFsdWVTY2hlbWE6by5jcmVhdGUoaSl9KTpvLmNyZWF0ZSh7Li4uaSwuLi5hfSl9dmFyIFJQPVBQLGpQPUFycmF5LnByb3RvdHlwZS5maW5kTGFzdD8/ZnVuY3Rpb24oZSl7Zm9yKGxldCB0PXRoaXMubGVuZ3RoLTE7dD49MDt0LS0pe2xldCBuPXRoaXNbdF07aWYoZShuLHQsdGhpcykpcmV0dXJuIG59fSxWUD1hdSgiZmluZExhc3QiLGZ1bmN0aW9uKCl7aWYoQXJyYXkuaXNBcnJheSh0aGlzKSlyZXR1cm4galB9KSxxQT1WUCxVUD1TeW1ib2wuZm9yKCJQUkVUVElFUl9JU19GUk9OVF9NQVRURVIiKSxxUD1bXTtmdW5jdGlvbiBXUChlKXtyZXR1cm4hIShlIT1udWxsJiZlW1VQXSl9dmFyIHhtPVdQLFdBPW5ldyBTZXQoWyJ5YW1sIiwidG9tbCJdKSxIQT0oe25vZGU6ZX0pPT54bShlKSYmV0EuaGFzKGUubGFuZ3VhZ2UpO2FzeW5jIGZ1bmN0aW9uIEhQKGUsdCxuLHIpe2xldHtub2RlOnN9PW4se2xhbmd1YWdlOml9PXM7aWYoIVdBLmhhcyhpKSlyZXR1cm47bGV0IG89cy52YWx1ZS50cmltKCksYTtpZihvKXtsZXQgdT1pPT09InlhbWwiP2k6eEEocix7bGFuZ3VhZ2U6aX0pO2lmKCF1KXJldHVybjthPW8/YXdhaXQgZShvLHtwYXJzZXI6dX0pOiIifWVsc2UgYT1vO3JldHVybiBYRihbcy5zdGFydERlbGltaXRlcixzLmV4cGxpY2l0TGFuZ3VhZ2U/PyIiLGpyLGEsYT9qcjoiIixzLmVuZERlbGltaXRlcl0pfWZ1bmN0aW9uIEpQKGUsdCl7cmV0dXJuIEhBKHtub2RlOmV9KSYmKGRlbGV0ZSB0LmVuZCxkZWxldGUgdC5yYXcsZGVsZXRlIHQudmFsdWUpLHR9dmFyIHpQPUpQO2Z1bmN0aW9uIEdQKHtub2RlOmV9KXtyZXR1cm4gZS5yYXd9dmFyIEtQPUdQLEpBPW5ldyBTZXQoWyJ0b2tlbnMiLCJjb21tZW50cyIsInBhcmVudCIsImVuY2xvc2luZ05vZGUiLCJwcmVjZWRpbmdOb2RlIiwiZm9sbG93aW5nTm9kZSJdKSxYUD1lPT5PYmplY3Qua2V5cyhlKS5maWx0ZXIodD0+IUpBLmhhcyh0KSk7ZnVuY3Rpb24gWVAoZSx0KXtsZXQgbj1lP3I9PmUocixKQSk6WFA7cmV0dXJuIHQ/bmV3IFByb3h5KG4se2FwcGx5OihyLHMsaSk9PnhtKGlbMF0pP3FQOlJlZmxlY3QuYXBwbHkocixzLGkpfSk6bn12YXIgekE9WVA7ZnVuY3Rpb24gR0EoZSx0KXtpZighdCl0aHJvdyBuZXcgRXJyb3IoInBhcnNlck5hbWUgaXMgcmVxdWlyZWQuIik7bGV0IG49cUEoMCxlLHM9PnMucGFyc2VycyYmVmMocy5wYXJzZXJzLHQpKTtpZihuKXJldHVybiBuO2xldCByPWBDb3VsZG4ndCByZXNvbHZlIHBhcnNlciAiJHt0fSIuYDt0aHJvdyByKz0iIFBsdWdpbnMgbXVzdCBiZSBleHBsaWNpdGx5IGFkZGVkIHRvIHRoZSBzdGFuZGFsb25lIGJ1bmRsZS4iLG5ldyB2QShyKX1mdW5jdGlvbiBRUChlLHQpe2lmKCF0KXRocm93IG5ldyBFcnJvcigiYXN0Rm9ybWF0IGlzIHJlcXVpcmVkLiIpO2xldCBuPXFBKDAsZSxzPT5zLnByaW50ZXJzJiZWYyhzLnByaW50ZXJzLHQpKTtpZihuKXJldHVybiBuO2xldCByPWBDb3VsZG4ndCBmaW5kIHBsdWdpbiBmb3IgQVNUIGZvcm1hdCAiJHt0fSIuYDt0aHJvdyByKz0iIFBsdWdpbnMgbXVzdCBiZSBleHBsaWNpdGx5IGFkZGVkIHRvIHRoZSBzdGFuZGFsb25lIGJ1bmRsZS4iLG5ldyB2QShyKX1mdW5jdGlvbiBrbSh7cGx1Z2luczplLHBhcnNlcjp0fSl7bGV0IG49R0EoZSx0KTtyZXR1cm4gS0Eobix0KX1mdW5jdGlvbiBLQShlLHQpe2xldCBuPWUucGFyc2Vyc1t0XTtyZXR1cm4gdHlwZW9mIG49PSJmdW5jdGlvbiI/bigpOm59YXN5bmMgZnVuY3Rpb24gWlAoZSx0KXtsZXQgbj1lLnByaW50ZXJzW3RdLHI9dHlwZW9mIG49PSJmdW5jdGlvbiI/YXdhaXQgbigpOm47cmV0dXJuIG5NKHIpfWZ1bmN0aW9uIGVNKGUpe2xldHtmZWF0dXJlczp0LGdldFZpc2l0b3JLZXlzOm4sZW1iZWQ6cixtYXNzYWdlQXN0Tm9kZTpzLHByaW50OmksLi4ub309ZTt0PW9NKHQpO2xldCBhPXQuZXhwZXJpbWVudGFsX2Zyb250TWF0dGVyU3VwcG9ydDtuPXpBKG4sYS5tYXNzYWdlQXN0Tm9kZXx8YS5lbWJlZHx8YS5wcmludCk7bGV0IHU9cztzJiZhLm1hc3NhZ2VBc3ROb2RlJiYodT1uZXcgUHJveHkocyx7YXBwbHkoYyxwLGgpe3JldHVybiB6UCguLi5oKSxSZWZsZWN0LmFwcGx5KGMscCxoKX19KSk7bGV0IGw9cjtpZihyKXtsZXQgYztsPW5ldyBQcm94eShyLHtnZXQocCxoLGQpe3JldHVybiBoPT09ImdldFZpc2l0b3JLZXlzIj8oYz8/KGM9ci5nZXRWaXNpdG9yS2V5cz96QShyLmdldFZpc2l0b3JLZXlzLGEubWFzc2FnZUFzdE5vZGV8fGEuZW1iZWQpOm4pLGMpOlJlZmxlY3QuZ2V0KHAsaCxkKX0sYXBwbHk6KHAsaCxkKT0+YS5lbWJlZCYmSEEoLi4uZCk/SFA6UmVmbGVjdC5hcHBseShwLGgsZCl9KX1sZXQgZj1pO3JldHVybiBhLnByaW50JiYoZj1uZXcgUHJveHkoaSx7YXBwbHkoYyxwLGgpe2xldFtkXT1oO3JldHVybiB4bShkLm5vZGUpP0tQKGQpOlJlZmxlY3QuYXBwbHkoYyxwLGgpfX0pKSx7ZmVhdHVyZXM6dCxnZXRWaXNpdG9yS2V5czpuLGVtYmVkOmwsbWFzc2FnZUFzdE5vZGU6dSxwcmludDpmLC4uLm99fXZhciB0TT1uZXcgV2Vha01hcDtmdW5jdGlvbiBuTShlKXtyZXR1cm4gbG0odE0sZSxlTSl9dmFyIHJNPVsiY2xlYW4iLCJlbWJlZCIsInByaW50Il0sc009T2JqZWN0LmZyb21FbnRyaWVzKHJNLm1hcChlPT5bZSwhMV0pKTtmdW5jdGlvbiBpTShlKXtyZXR1cm57Li4uc00sLi4uZX19ZnVuY3Rpb24gb00oZSl7cmV0dXJue2V4cGVyaW1lbnRhbF9hdm9pZEFzdE11dGF0aW9uOiExLC4uLmUsZXhwZXJpbWVudGFsX2Zyb250TWF0dGVyU3VwcG9ydDppTShlPT1udWxsP3ZvaWQgMDplLmV4cGVyaW1lbnRhbF9mcm9udE1hdHRlclN1cHBvcnQpfX12YXIgWEE9e2FzdEZvcm1hdDoiZXN0cmVlIixwcmludGVyOnt9LG9yaWdpbmFsVGV4dDp2b2lkIDAsbG9jU3RhcnQ6bnVsbCxsb2NFbmQ6bnVsbCxnZXRWaXNpdG9yS2V5czpudWxsfTthc3luYyBmdW5jdGlvbiBhTShlLHQ9e30pe3ZhciBjO2xldCBuPXsuLi5lfTtpZighbi5wYXJzZXIpe2lmKCFuLmZpbGVwYXRoKXRocm93IG5ldyBGQSgiTm8gcGFyc2VyIGFuZCBubyBmaWxlIHBhdGggZ2l2ZW4sIGNvdWxkbid0IGluZmVyIGEgcGFyc2VyLiIpO2lmKG4ucGFyc2VyPXhBKG4se3BoeXNpY2FsRmlsZTpuLmZpbGVwYXRofSksIW4ucGFyc2VyKXRocm93IG5ldyBGQShgTm8gcGFyc2VyIGNvdWxkIGJlIGluZmVycmVkIGZvciBmaWxlICIke24uZmlsZXBhdGh9Ii5gKX1sZXQgcj1BQSh7cGx1Z2luczplLnBsdWdpbnMsc2hvd0RlcHJlY2F0ZWQ6ITB9KS5vcHRpb25zLHM9ey4uLlhBLC4uLk9iamVjdC5mcm9tRW50cmllcyhyLmZpbHRlcihwPT5wLmRlZmF1bHQhPT12b2lkIDApLm1hcChwPT5bcC5uYW1lLHAuZGVmYXVsdF0pKX0saT1HQShuLnBsdWdpbnMsbi5wYXJzZXIpLG89YXdhaXQgS0EoaSxuLnBhcnNlcik7bi5hc3RGb3JtYXQ9by5hc3RGb3JtYXQsbi5sb2NFbmQ9by5sb2NFbmQsbi5sb2NTdGFydD1vLmxvY1N0YXJ0O2xldCBhPShjPWkucHJpbnRlcnMpIT1udWxsJiZjW28uYXN0Rm9ybWF0XT9pOlFQKG4ucGx1Z2lucyxvLmFzdEZvcm1hdCksdT1hd2FpdCBaUChhLG8uYXN0Rm9ybWF0KTtuLnByaW50ZXI9dSxuLmdldFZpc2l0b3JLZXlzPXUuZ2V0VmlzaXRvcktleXM7bGV0IGw9YS5kZWZhdWx0T3B0aW9ucz9PYmplY3QuZnJvbUVudHJpZXMoT2JqZWN0LmVudHJpZXMoYS5kZWZhdWx0T3B0aW9ucykuZmlsdGVyKChbLHBdKT0+cCE9PXZvaWQgMCkpOnt9LGY9ey4uLnMsLi4ubH07Zm9yKGxldFtwLGhdb2YgT2JqZWN0LmVudHJpZXMoZikpbltwXT8/KG5bcF09aCk7cmV0dXJuIG4ucGFyc2VyPT09Impzb24iJiYobi50cmFpbGluZ0NvbW1hPSJub25lIiksUlAobixyLHtwYXNzVGhyb3VnaDpPYmplY3Qua2V5cyhYQSksLi4udH0pfXZhciBQbz1hTSxZQT0vXHJcbnxbXG5cclx1MjAyOFx1MjAyOV0vO2Z1bmN0aW9uIHVNKGUsdCxuLHIpe2xldCBzPXtjb2x1bW46bnVsbCxsaW5lOi0xLC4uLmUuc3RhcnR9LGk9ey4uLnMsLi4uZS5lbmR9LHtsaW5lc0Fib3ZlOm89MixsaW5lc0JlbG93OmE9M309bnx8e30sdT1zLmxpbmUtcixsPXMuY29sdW1uLGY9aS5saW5lLXIsYz1pLmNvbHVtbixwPU1hdGgubWF4KHUtKG8rMSksMCksaD1NYXRoLm1pbih0Lmxlbmd0aCxmK2EpO3U9PT0tMSYmKHA9MCksZj09PS0xJiYoaD10Lmxlbmd0aCk7bGV0IGQ9Zi11LG09e307aWYoZClmb3IobGV0IGc9MDtnPD1kO2crKyl7bGV0IEQ9Zyt1O2lmKGw9PW51bGwpbVtEXT0hMDtlbHNlIGlmKGc9PT0wKXtsZXQgYj10W0QtMV0ubGVuZ3RoO21bRF09W2wsYi1sXX1lbHNlIGlmKGc9PT1kKW1bRF09WzAsY107ZWxzZXtsZXQgYj10W0QtMV0ubGVuZ3RoO21bRF09WzAsYl19fWVsc2UgaWYobD09PWMpbCE9bnVsbD9tW3VdPVtsLDBdOm1bdV09ITA7ZWxzZXtsZXQgZz1sPz8wLEQ9Yz8/ZzttW3VdPVtnLEQtZ119cmV0dXJue3N0YXJ0OnAsZW5kOmgsbWFya2VyTGluZXM6bX19ZnVuY3Rpb24gbE0oZSx0LG49e30scil7bGV0e2RlZnM6cyxoaWdobGlnaHQ6aX09e2RlZnM6e2d1dHRlcjpTdHJpbmcsbWFya2VyOlN0cmluZyxtZXNzYWdlOlN0cmluZyxyZXNldDpTdHJpbmd9LGhpZ2hsaWdodDpTdHJpbmd9LG89KG4uc3RhcnRMaW5lfHwxKS0xLGE9ZS5zcGxpdChZQSkse3N0YXJ0OnUsZW5kOmwsbWFya2VyTGluZXM6Zn09dU0odCxhLG4sbyksYz10LnN0YXJ0JiZ0eXBlb2YgdC5zdGFydC5jb2x1bW49PSJudW1iZXIiLHA9U3RyaW5nKGwrbykubGVuZ3RoLGg9aShlKS5zcGxpdChZQSxsKS5zbGljZSh1LGwpLm1hcCgoZCxtKT0+e2xldCBnPXUrMSttLEQ9YCAke2AgJHtnK299YC5zbGljZSgtcCl9IHxgLGI9ZltnXSxFPSFmW2crMV07aWYoYil7bGV0IEY9IiI7aWYoQXJyYXkuaXNBcnJheShiKSl7bGV0IHY9ZC5zbGljZSgwLGJbMF0pLnJlcGxhY2UoL1teXHRdL2csIiAiKSxDPWJbMV18fDE7Rj1bYAogYCxzLmd1dHRlcihELnJlcGxhY2UoL1xkL2csIiAiKSksIiAiLHYscy5tYXJrZXIoIl4iKS5yZXBlYXQoQyldLmpvaW4oIiIpLEUmJm4ubWVzc2FnZSYmKEYrPSIgIitzLm1lc3NhZ2Uobi5tZXNzYWdlKSl9cmV0dXJuW3MubWFya2VyKCI+Iikscy5ndXR0ZXIoRCksZC5sZW5ndGg+MD9gICR7ZH1gOiIiLEZdLmpvaW4oIiIpfWVsc2UgcmV0dXJuYCAke3MuZ3V0dGVyKEQpfSR7ZC5sZW5ndGg+MD9gICR7ZH1gOiIifWB9KS5qb2luKGAKYCk7cmV0dXJuIG4ubWVzc2FnZSYmIWMmJihoPWAkeyIgIi5yZXBlYXQocCsxKX0ke24ubWVzc2FnZX0KJHtofWApLHMucmVzZXQoaCl9ZnVuY3Rpb24gY00oZSx0LG49e30pe3JldHVybiBsTShlLHQsbil9YXN5bmMgZnVuY3Rpb24gZk0oZSx0KXtsZXQgbj1hd2FpdCBrbSh0KSxyPW4ucHJlcHJvY2Vzcz9hd2FpdCBuLnByZXByb2Nlc3MoZSx0KTplO3Qub3JpZ2luYWxUZXh0PXI7bGV0IHM7dHJ5e3M9YXdhaXQgbi5wYXJzZShyLHQsdCl9Y2F0Y2goaSl7cE0oaSxlKX1yZXR1cm57dGV4dDpyLGFzdDpzfX1mdW5jdGlvbiBwTShlLHQpe2xldHtsb2M6bn09ZTtpZihuKXtsZXR7c3RhcnQ6cixlbmQ6c309bjtyJiYocj17bGluZTpyLmxpbmUsY29sdW1uOnIuY29sdW1uLTF9KSxzJiYocz17bGluZTpzLmxpbmUsY29sdW1uOnMuY29sdW1uLTF9KTtsZXQgaT1jTSh0LHtzdGFydDpyLGVuZDpzfSx7fSk7ZS5tZXNzYWdlKz1gCmAraSxlLmNvZGVGcmFtZT1pfXRocm93IGV9dmFyIHB1PWZNO2FzeW5jIGZ1bmN0aW9uIGhNKGUsdCxuLHIscyl7aWYobi5lbWJlZGRlZExhbmd1YWdlRm9ybWF0dGluZyE9PSJhdXRvIilyZXR1cm47bGV0e3ByaW50ZXI6aX09bix7ZW1iZWQ6b309aTtpZighbylyZXR1cm47aWYoby5sZW5ndGg+Mil0aHJvdyBuZXcgRXJyb3IoInByaW50ZXIuZW1iZWQgaGFzIHRvbyBtYW55IHBhcmFtZXRlcnMuIFRoZSBBUEkgY2hhbmdlZCBpbiBQcmV0dGllciB2My4gUGxlYXNlIHVwZGF0ZSB5b3VyIHBsdWdpbi4gU2VlIGh0dHBzOi8vcHJldHRpZXIuaW8vZG9jcy9wbHVnaW5zI29wdGlvbmFsLWVtYmVkIik7bGV0e2hhc1ByZXR0aWVySWdub3JlOmF9PWkse2dldFZpc2l0b3JLZXlzOnV9PW8sbD1bXTtwKCk7bGV0IGY9ZS5zdGFjaztmb3IobGV0e3ByaW50Omgsbm9kZTpkLHBhdGhTdGFjazptfW9mIGwpdHJ5e2Uuc3RhY2s9bTtsZXQgZz1hd2FpdCBoKGMsdCxlLG4pO2cmJnMuc2V0KGQsZyl9Y2F0Y2goZyl7aWYoZ2xvYmFsVGhpcy5QUkVUVElFUl9ERUJVRyl0aHJvdyBnfWUuc3RhY2s9ZjtmdW5jdGlvbiBjKGgsZCl7cmV0dXJuIGRNKGgsZCxuLHIpfWZ1bmN0aW9uIHAoKXtsZXR7bm9kZTpofT1lO2lmKGg9PT1udWxsfHx0eXBlb2YgaCE9Im9iamVjdCJ8fGEhPW51bGwmJmEoZSkpcmV0dXJuO2ZvcihsZXQgbSBvZiB1KGgpKUFycmF5LmlzQXJyYXkoaFttXSk/ZS5lYWNoKHAsbSk6ZS5jYWxsKHAsbSk7bGV0IGQ9byhlLG4pO2lmKGQpe2lmKHR5cGVvZiBkPT0iZnVuY3Rpb24iKXtsLnB1c2goe3ByaW50OmQsbm9kZTpoLHBhdGhTdGFjazpbLi4uZS5zdGFja119KTtyZXR1cm59cy5zZXQoaCxkKX19fWFzeW5jIGZ1bmN0aW9uIGRNKGUsdCxuLHIpe2xldCBzPWF3YWl0IFBvKHsuLi5uLC4uLnQscGFyZW50UGFyc2VyOm4ucGFyc2VyLG9yaWdpbmFsVGV4dDplLGN1cnNvck9mZnNldDp2b2lkIDAscmFuZ2VTdGFydDp2b2lkIDAscmFuZ2VFbmQ6dm9pZCAwfSx7cGFzc1Rocm91Z2g6ITB9KSx7YXN0Oml9PWF3YWl0IHB1KGUscyksbz1hd2FpdCByKGkscyk7cmV0dXJuIEtGKG8pfWZ1bmN0aW9uIG1NKGUsdCxuLHIpe2xldHtvcmlnaW5hbFRleHQ6cyxbQmNdOmksbG9jU3RhcnQ6byxsb2NFbmQ6YSxbU3ltYm9sLmZvcigicHJpbnRlZENvbW1lbnRzIildOnV9PXQse25vZGU6bH09ZSxmPW8obCksYz1hKGwpO2ZvcihsZXQgaCBvZiBpKW8oaCk+PWYmJmEoaCk8PWMmJnUuYWRkKGgpO2xldHtwcmludFByZXR0aWVySWdub3JlZDpwfT10LnByaW50ZXI7cmV0dXJuIHA/cChlLHQsbixyKTpzLnNsaWNlKGYsYyl9dmFyIGdNPW1NO2FzeW5jIGZ1bmN0aW9uIHFjKGUsdCl7KHthc3Q6ZX09YXdhaXQgWkEoZSx0KSk7bGV0IG49bmV3IE1hcCxyPW5ldyBrSShlKSxzPW5ldyBNYXA7YXdhaXQgaE0ocixvLHQscWMscyk7bGV0IGk9YXdhaXQgUUEocix0LG8sdm9pZCAwLHMpO2lmKHpJKHQpLHQuY3Vyc29yT2Zmc2V0Pj0wKXtpZih0Lm5vZGVBZnRlckN1cnNvciYmIXQubm9kZUJlZm9yZUN1cnNvcilyZXR1cm5baGksaV07aWYodC5ub2RlQmVmb3JlQ3Vyc29yJiYhdC5ub2RlQWZ0ZXJDdXJzb3IpcmV0dXJuW2ksaGldfXJldHVybiBpO2Z1bmN0aW9uIG8odSxsKXtyZXR1cm4gdT09PXZvaWQgMHx8dT09PXI/YShsKTpBcnJheS5pc0FycmF5KHUpP3IuY2FsbCgoKT0+YShsKSwuLi51KTpyLmNhbGwoKCk9PmEobCksdSl9ZnVuY3Rpb24gYSh1KXtsZXQgbD1yLm5vZGU7aWYobD09bnVsbClyZXR1cm4iIjtsZXQgZj15bShsKSYmdT09PXZvaWQgMDtpZihmJiZuLmhhcyhsKSlyZXR1cm4gbi5nZXQobCk7bGV0IGM9UUEocix0LG8sdSxzKTtyZXR1cm4gZiYmbi5zZXQobCxjKSxjfX1mdW5jdGlvbiBRQShlLHQsbixyLHMpe3ZhciB1LGw7bGV0e25vZGU6aX09ZSx7cHJpbnRlcjpvfT10LGE7c3dpdGNoKCh1PW8uaGFzUHJldHRpZXJJZ25vcmUpIT1udWxsJiZ1LmNhbGwobyxlKT9hPWdNKGUsdCxuLHIpOnMuaGFzKGkpP2E9cy5nZXQoaSk6YT1vLnByaW50KGUsdCxuLHIpLGkpe2Nhc2UgdC5jdXJzb3JOb2RlOmE9SWMoYSxmPT5baGksZixoaV0pO2JyZWFrO2Nhc2UgdC5ub2RlQmVmb3JlQ3Vyc29yOmE9SWMoYSxmPT5bZixoaV0pO2JyZWFrO2Nhc2UgdC5ub2RlQWZ0ZXJDdXJzb3I6YT1JYyhhLGY9PltoaSxmXSk7YnJlYWt9cmV0dXJuIG8ucHJpbnRDb21tZW50JiZsQShpLmNvbW1lbnRzKSYmISgobD1vLndpbGxQcmludE93bkNvbW1lbnRzKSE9bnVsbCYmbC5jYWxsKG8sZSx0KSkmJihhPUpJKGUsYSx0KSksYX1hc3luYyBmdW5jdGlvbiBaQShlLHQpe2xldCBuPWUuY29tbWVudHM/P1tdO3RbQmNdPW4sdFtTeW1ib2wuZm9yKCJwcmludGVkQ29tbWVudHMiKV09bmV3IFNldCxPSShlLHQpO2xldHtwcmludGVyOntwcmVwcm9jZXNzOnJ9fT10O3JldHVybiBlPXI/YXdhaXQgcihlLHQpOmUse2FzdDplLGNvbW1lbnRzOm59fWZ1bmN0aW9uIHlNKGUsdCl7bGV0e2N1cnNvck9mZnNldDpuLGxvY1N0YXJ0OnIsbG9jRW5kOnMsZ2V0VmlzaXRvcktleXM6aX09dCxvPWg9PnIoaCk8PW4mJnMoaCk+PW4sYT1lLHU9W2VdO2ZvcihsZXQgaCBvZiBfSShlLHtnZXRWaXNpdG9yS2V5czppLGZpbHRlcjpvfSkpdS5wdXNoKGgpLGE9aDtpZihJSShhLHtnZXRWaXNpdG9yS2V5czppfSkpcmV0dXJue2N1cnNvck5vZGU6YX07bGV0IGwsZixjPS0xLHA9TnVtYmVyLlBPU0lUSVZFX0lORklOSVRZO2Zvcig7dS5sZW5ndGg+MCYmKGw9PT12b2lkIDB8fGY9PT12b2lkIDApOyl7YT11LnBvcCgpO2xldCBoPWwhPT12b2lkIDAsZD1mIT09dm9pZCAwO2ZvcihsZXQgbSBvZiBqYyhhLHtnZXRWaXNpdG9yS2V5czppfSkpe2lmKCFoKXtsZXQgZz1zKG0pO2c8PW4mJmc+YyYmKGw9bSxjPWcpfWlmKCFkKXtsZXQgZz1yKG0pO2c+PW4mJmc8cCYmKGY9bSxwPWcpfX19cmV0dXJue25vZGVCZWZvcmVDdXJzb3I6bCxub2RlQWZ0ZXJDdXJzb3I6Zn19dmFyIGV3PXlNO2Z1bmN0aW9uIERNKGUsdCl7bGV0e3ByaW50ZXI6bn09dCxyPW4ubWFzc2FnZUFzdE5vZGU7aWYoIXIpcmV0dXJuIGU7bGV0e2dldFZpc2l0b3JLZXlzOnN9PW4se2lnbm9yZWRQcm9wZXJ0aWVzOml9PXI7cmV0dXJuIG8oZSk7ZnVuY3Rpb24gbyhhLHUpe2lmKCF5bShhKSlyZXR1cm4gYTtpZihBcnJheS5pc0FycmF5KGEpKXJldHVybiBhLm1hcChwPT5vKHAsdSkpLmZpbHRlcihCb29sZWFuKTtsZXQgbD17fSxmPW5ldyBTZXQocyhhKSk7Zm9yKGxldCBwIGluIGEpIVZjKGEscCl8fGkhPW51bGwmJmkuaGFzKHApfHwoZi5oYXMocCk/bFtwXT1vKGFbcF0sYSk6bFtwXT1hW3BdKTtsZXQgYz1yKGEsbCx1KTtpZihjIT09bnVsbClyZXR1cm4gYz8/bH19dmFyIGJNPURNLEVNPUFycmF5LnByb3RvdHlwZS5maW5kTGFzdEluZGV4Pz9mdW5jdGlvbihlKXtmb3IobGV0IHQ9dGhpcy5sZW5ndGgtMTt0Pj0wO3QtLSl7bGV0IG49dGhpc1t0XTtpZihlKG4sdCx0aGlzKSlyZXR1cm4gdH1yZXR1cm4tMX0sdk09YXUoImZpbmRMYXN0SW5kZXgiLGZ1bmN0aW9uKCl7aWYoQXJyYXkuaXNBcnJheSh0aGlzKSlyZXR1cm4gRU19KSxGTT12TTtmdW5jdGlvbiBBTShlLHQpe3JldHVybiB0PW5ldyBTZXQodCksZS5maW5kKG49Pm53LmhhcyhuLnR5cGUpJiZ0LmhhcyhuKSl9ZnVuY3Rpb24gdHcoZSl7bGV0IHQ9Rk0oMCxlLG49Pm4udHlwZSE9PSJQcm9ncmFtIiYmbi50eXBlIT09IkZpbGUiKTtyZXR1cm4gdD09PS0xP2U6ZS5zbGljZSgwLHQrMSl9ZnVuY3Rpb24gd00oZSx0LHtsb2NTdGFydDpuLGxvY0VuZDpyfSl7bGV0W3MsLi4uaV09ZSxbbywuLi5hXT10O2lmKHM9PT1vKXJldHVybltzLG9dO2xldCB1PW4ocyk7Zm9yKGxldCBmIG9mIHR3KGEpKWlmKG4oZik+PXUpbz1mO2Vsc2UgYnJlYWs7bGV0IGw9cihvKTtmb3IobGV0IGYgb2YgdHcoaSkpe2lmKHIoZik8PWwpcz1mO2Vsc2UgYnJlYWs7aWYocz09PW8pYnJlYWt9cmV0dXJuW3Msb119ZnVuY3Rpb24gVG0oZSx0LG4scixzPVtdLGksbyl7bGV0e2xvY1N0YXJ0OmEsbG9jRW5kOnV9PW8sbD1hKGUpLGY9dShlKTtpZih0PmZ8fHQ8bHx8aT09PSJyYW5nZUVuZCImJnQ9PT1sfHxpPT09InJhbmdlU3RhcnQiJiZ0PT09ZilyZXR1cm47bGV0IGM9W2UsLi4uc10scD1kQShlLGMse2NhY2hlOm1BLGxvY1N0YXJ0OmEsbG9jRW5kOnUsZ2V0VmlzaXRvcktleXM6bi5nZXRWaXNpdG9yS2V5cyxmaWx0ZXI6bi5wcmludGVyLmNhbkF0dGFjaENvbW1lbnQsZ2V0Q2hpbGRyZW46bi5wcmludGVyLmdldENvbW1lbnRDaGlsZE5vZGVzfSk7Zm9yKGxldCBoIG9mIHApe2xldCBkPVRtKGgsdCxuLHIsYyxpLG8pO2lmKGQpcmV0dXJuIGR9aWYocihlLHNbMF0pKXJldHVybiBjfWZ1bmN0aW9uIENNKGUsdCl7cmV0dXJuIHQhPT0iRGVjbGFyZUV4cG9ydERlY2xhcmF0aW9uIiYmZSE9PSJUeXBlUGFyYW1ldGVyRGVjbGFyYXRpb24iJiYoZT09PSJEaXJlY3RpdmUifHxlPT09IlR5cGVBbGlhcyJ8fGU9PT0iVFNFeHBvcnRBc3NpZ25tZW50Inx8ZS5zdGFydHNXaXRoKCJEZWNsYXJlIil8fGUuc3RhcnRzV2l0aCgiVFNEZWNsYXJlIil8fGUuZW5kc1dpdGgoIlN0YXRlbWVudCIpfHxlLmVuZHNXaXRoKCJEZWNsYXJhdGlvbiIpKX12YXIgbnc9bmV3IFNldChbIkpzb25Sb290IiwiT2JqZWN0RXhwcmVzc2lvbiIsIkFycmF5RXhwcmVzc2lvbiIsIlN0cmluZ0xpdGVyYWwiLCJOdW1lcmljTGl0ZXJhbCIsIkJvb2xlYW5MaXRlcmFsIiwiTnVsbExpdGVyYWwiLCJVbmFyeUV4cHJlc3Npb24iLCJUZW1wbGF0ZUxpdGVyYWwiXSksU009bmV3IFNldChbIk9wZXJhdGlvbkRlZmluaXRpb24iLCJGcmFnbWVudERlZmluaXRpb24iLCJWYXJpYWJsZURlZmluaXRpb24iLCJUeXBlRXh0ZW5zaW9uRGVmaW5pdGlvbiIsIk9iamVjdFR5cGVEZWZpbml0aW9uIiwiRmllbGREZWZpbml0aW9uIiwiRGlyZWN0aXZlRGVmaW5pdGlvbiIsIkVudW1UeXBlRGVmaW5pdGlvbiIsIkVudW1WYWx1ZURlZmluaXRpb24iLCJJbnB1dFZhbHVlRGVmaW5pdGlvbiIsIklucHV0T2JqZWN0VHlwZURlZmluaXRpb24iLCJTY2hlbWFEZWZpbml0aW9uIiwiT3BlcmF0aW9uVHlwZURlZmluaXRpb24iLCJJbnRlcmZhY2VUeXBlRGVmaW5pdGlvbiIsIlVuaW9uVHlwZURlZmluaXRpb24iLCJTY2FsYXJUeXBlRGVmaW5pdGlvbiJdKTtmdW5jdGlvbiBydyhlLHQsbil7aWYoIXQpcmV0dXJuITE7c3dpdGNoKGUucGFyc2VyKXtjYXNlImZsb3ciOmNhc2UiaGVybWVzIjpjYXNlImJhYmVsIjpjYXNlImJhYmVsLWZsb3ciOmNhc2UiYmFiZWwtdHMiOmNhc2UidHlwZXNjcmlwdCI6Y2FzZSJhY29ybiI6Y2FzZSJlc3ByZWUiOmNhc2UibWVyaXlhaCI6Y2FzZSJveGMiOmNhc2Uib3hjLXRzIjpjYXNlInl1a3UiOmNhc2UieXVrdS10cyI6Y2FzZSJfX2JhYmVsX2VzdHJlZSI6cmV0dXJuIENNKHQudHlwZSxuPT1udWxsP3ZvaWQgMDpuLnR5cGUpO2Nhc2UianNvbiI6Y2FzZSJqc29uNSI6Y2FzZSJqc29uYyI6Y2FzZSJqc29uLXN0cmluZ2lmeSI6cmV0dXJuIG53Lmhhcyh0LnR5cGUpO2Nhc2UiZ3JhcGhxbCI6cmV0dXJuIFNNLmhhcyh0LmtpbmQpO2Nhc2UidnVlIjpyZXR1cm4gdC50YWchPT0icm9vdCJ9cmV0dXJuITF9ZnVuY3Rpb24geE0oZSx0LG4pe3ZhciBkO2xldHtyYW5nZVN0YXJ0OnIscmFuZ2VFbmQ6c309dCxpPWUuc2xpY2UocixzKS5zZWFyY2goL1xTLyksbz1pPT09LTE7aWYoIW8pZm9yKHIrPWk7cz5yJiYhL1xTLy50ZXN0KGVbcy0xXSk7LS1zKTtsZXQgYT0oKGQ9dC5wcmludGVyLmZlYXR1cmVzKT09bnVsbD92b2lkIDA6ZC5leHBlcmltZW50YWxfbG9jRm9yUmFuZ2VGb3JtYXQpPz90LHU9VG0obixyLHQsKG0sZyk9PnJ3KHQsbSxnKSxbXSwicmFuZ2VTdGFydCIsYSk7aWYoIXUpcmV0dXJuO2xldCBsPW8/dTpUbShuLHMsdCxtPT5ydyh0LG0pLFtdLCJyYW5nZUVuZCIsYSk7aWYoIWwpcmV0dXJuO2xldCBmLGM7aWYobi50eXBlPT09Ikpzb25Sb290Iil7bGV0IG09QU0odSxsKTtmPW0sYz1tfWVsc2VbZixjXT13TSh1LGwsdCk7bGV0e2xvY1N0YXJ0OnAsbG9jRW5kOmh9PWE7cmV0dXJuW01hdGgubWluKHAoZikscChjKSksTWF0aC5tYXgoaChmKSxoKGMpKV19dmFyIHN3PSJcdUZFRkYiLGl3PVN5bWJvbCgiY3Vyc29yIik7YXN5bmMgZnVuY3Rpb24gb3coZSx0LG49MCl7aWYoIWV8fGUudHJpbSgpLmxlbmd0aD09PTApcmV0dXJue2Zvcm1hdHRlZDoiIixjdXJzb3JPZmZzZXQ6LTEsY29tbWVudHM6W119O2xldHthc3Q6cix0ZXh0OnN9PWF3YWl0IHB1KGUsdCk7dC5jdXJzb3JPZmZzZXQ+PTAmJih0PXsuLi50LC4uLmV3KHIsdCl9KTtsZXQgaT1hd2FpdCBxYyhyLHQpO24+MCYmKGk9WUYoW2pyLGldLG4sdC50YWJXaWR0aCkpO2xldCBvPVJjKGksdCk7aWYobj4wKXtsZXQgdT1vLmZvcm1hdHRlZC50cmltKCk7by5jdXJzb3JOb2RlU3RhcnQhPT12b2lkIDAmJihvLmN1cnNvck5vZGVTdGFydC09by5mb3JtYXR0ZWQuaW5kZXhPZih1KSxvLmN1cnNvck5vZGVTdGFydDwwJiYoby5jdXJzb3JOb2RlU3RhcnQ9MCxvLmN1cnNvck5vZGVUZXh0PW8uY3Vyc29yTm9kZVRleHQudHJpbVN0YXJ0KCkpLG8uY3Vyc29yTm9kZVN0YXJ0K28uY3Vyc29yTm9kZVRleHQubGVuZ3RoPnUubGVuZ3RoJiYoby5jdXJzb3JOb2RlVGV4dD1vLmN1cnNvck5vZGVUZXh0LnRyaW1FbmQoKSkpLG8uZm9ybWF0dGVkPXUrdW0odC5lbmRPZkxpbmUpfWxldCBhPXRbQmNdO2lmKHQuY3Vyc29yT2Zmc2V0Pj0wKXtsZXQgdSxsLGYsYztpZigodC5jdXJzb3JOb2RlfHx0Lm5vZGVCZWZvcmVDdXJzb3J8fHQubm9kZUFmdGVyQ3Vyc29yKSYmby5jdXJzb3JOb2RlVGV4dClpZihmPW8uY3Vyc29yTm9kZVN0YXJ0LGM9by5jdXJzb3JOb2RlVGV4dCx0LmN1cnNvck5vZGUpdT10LmxvY1N0YXJ0KHQuY3Vyc29yTm9kZSksbD1zLnNsaWNlKHUsdC5sb2NFbmQodC5jdXJzb3JOb2RlKSk7ZWxzZXtpZighdC5ub2RlQmVmb3JlQ3Vyc29yJiYhdC5ub2RlQWZ0ZXJDdXJzb3IpdGhyb3cgbmV3IEVycm9yKCJDdXJzb3IgbG9jYXRpb24gbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSBvZiBjdXJzb3JOb2RlLCBub2RlQmVmb3JlQ3Vyc29yLCBub2RlQWZ0ZXJDdXJzb3IiKTt1PXQubm9kZUJlZm9yZUN1cnNvcj90LmxvY0VuZCh0Lm5vZGVCZWZvcmVDdXJzb3IpOjA7bGV0IEQ9dC5ub2RlQWZ0ZXJDdXJzb3I/dC5sb2NTdGFydCh0Lm5vZGVBZnRlckN1cnNvcik6cy5sZW5ndGg7bD1zLnNsaWNlKHUsRCl9ZWxzZSB1PTAsbD1zLGY9MCxjPW8uZm9ybWF0dGVkO2xldCBwPXQuY3Vyc29yT2Zmc2V0LXU7aWYobD09PWMpcmV0dXJue2Zvcm1hdHRlZDpvLmZvcm1hdHRlZCxjdXJzb3JPZmZzZXQ6ZitwLGNvbW1lbnRzOmF9O2xldCBoPWwuc3BsaXQoIiIpO2guc3BsaWNlKHAsMCxpdyk7bGV0IGQ9Yy5zcGxpdCgiIiksbT1EXyhoLGQpLGc9Zjtmb3IobGV0IEQgb2YgbSlpZihELnJlbW92ZWQpe2lmKEQudmFsdWUuaW5jbHVkZXMoaXcpKWJyZWFrfWVsc2UgZys9RC5jb3VudDtyZXR1cm57Zm9ybWF0dGVkOm8uZm9ybWF0dGVkLGN1cnNvck9mZnNldDpnLGNvbW1lbnRzOmF9fXJldHVybntmb3JtYXR0ZWQ6by5mb3JtYXR0ZWQsY3Vyc29yT2Zmc2V0Oi0xLGNvbW1lbnRzOmF9fWFzeW5jIGZ1bmN0aW9uIGtNKGUsdCl7bGV0e2FzdDpuLHRleHQ6cn09YXdhaXQgcHUoZSx0KSxbcyxpXT14TShyLHQsbik/P1swLDBdLG89ci5zbGljZShzLGkpLGE9TWF0aC5taW4ocyxyLmxhc3RJbmRleE9mKGAKYCxzKSsxKSx1PXIuc2xpY2UoYSxzKS5tYXRjaCgvXlxzKi8pWzBdLGw9Z20odSx0LnRhYldpZHRoKSxmPWF3YWl0IG93KG8sey4uLnQscmFuZ2VTdGFydDowLHJhbmdlRW5kOk51bWJlci5QT1NJVElWRV9JTkZJTklUWSxjdXJzb3JPZmZzZXQ6dC5jdXJzb3JPZmZzZXQ+cyYmdC5jdXJzb3JPZmZzZXQ8PWk/dC5jdXJzb3JPZmZzZXQtczotMSxlbmRPZkxpbmU6ImxmIn0sbCksYz1mLmZvcm1hdHRlZC50cmltRW5kKCkse2N1cnNvck9mZnNldDpwfT10O3A+aT9wKz1jLmxlbmd0aC1vLmxlbmd0aDpmLmN1cnNvck9mZnNldD49MCYmKHA9Zi5jdXJzb3JPZmZzZXQrcyk7bGV0IGg9ci5zbGljZSgwLHMpK2Mrci5zbGljZShpKTtpZih0LmVuZE9mTGluZSE9PSJsZiIpe2xldCBkPXVtKHQuZW5kT2ZMaW5lKTtwPj0wJiZkPT09YFxyCmAmJihwKz1XRihoLnNsaWNlKDAscCksYApgKSksaD1MYygwLGgsYApgLGQpfXJldHVybntmb3JtYXR0ZWQ6aCxjdXJzb3JPZmZzZXQ6cCxjb21tZW50czpmLmNvbW1lbnRzfX1mdW5jdGlvbiBObShlLHQsbil7cmV0dXJuIHR5cGVvZiB0IT0ibnVtYmVyInx8TnVtYmVyLmlzTmFOKHQpfHx0PDB8fHQ+ZS5sZW5ndGg/bjp0fWZ1bmN0aW9uIGF3KGUsdCl7bGV0e2N1cnNvck9mZnNldDpuLHJhbmdlU3RhcnQ6cixyYW5nZUVuZDpzfT10O3JldHVybiBuPU5tKGUsbiwtMSkscj1ObShlLHIsMCkscz1ObShlLHMsZS5sZW5ndGgpLHsuLi50LGN1cnNvck9mZnNldDpuLHJhbmdlU3RhcnQ6cixyYW5nZUVuZDpzfX1mdW5jdGlvbiB1dyhlLHQpe2xldHtjdXJzb3JPZmZzZXQ6bixyYW5nZVN0YXJ0OnIscmFuZ2VFbmQ6cyxlbmRPZkxpbmU6aX09YXcoZSx0KSxvPWUuY2hhckF0KDApPT09c3c7aWYobyYmKGU9ZS5zbGljZSgxKSxuLS0sci0tLHMtLSksaT09PSJhdXRvIiYmKGk9d18oZSkpLGUuaW5jbHVkZXMoIlxyIikpe2xldCBhPXU9PldGKGUuc2xpY2UoMCxNYXRoLm1heCh1LDApKSxgXHIKYCk7bi09YShuKSxyLT1hKHIpLHMtPWEocyksZT14XyhlKX1yZXR1cm57aGFzQk9NOm8sdGV4dDplLG9wdGlvbnM6YXcoZSx7Li4udCxjdXJzb3JPZmZzZXQ6bixyYW5nZVN0YXJ0OnIscmFuZ2VFbmQ6cyxlbmRPZkxpbmU6aX0pfX1hc3luYyBmdW5jdGlvbiBsdyhlLHQpe2xldCBuPWF3YWl0IGttKHQpO3JldHVybiFuLmhhc1ByYWdtYXx8bi5oYXNQcmFnbWEoZSl9YXN5bmMgZnVuY3Rpb24gVE0oZSx0KXt2YXIgbixyO3JldHVybihyPShuPWF3YWl0IGttKHQpKS5oYXNJZ25vcmVQcmFnbWEpPT1udWxsP3ZvaWQgMDpyLmNhbGwobixlKX1hc3luYyBmdW5jdGlvbiBjdyhlLHQpe2xldHtoYXNCT006bix0ZXh0OnIsb3B0aW9uczpzfT11dyhlLGF3YWl0IFBvKHQpKTtpZihzLnJhbmdlU3RhcnQ+PXMucmFuZ2VFbmQmJnIhPT0iInx8cy5yZXF1aXJlUHJhZ21hJiYhYXdhaXQgbHcocixzKXx8cy5jaGVja0lnbm9yZVByYWdtYSYmYXdhaXQgVE0ocixzKSlyZXR1cm57Zm9ybWF0dGVkOmUsY3Vyc29yT2Zmc2V0OnQuY3Vyc29yT2Zmc2V0LGNvbW1lbnRzOltdfTtsZXQgaTtyZXR1cm4gcy5yYW5nZVN0YXJ0PjB8fHMucmFuZ2VFbmQ8ci5sZW5ndGg/aT1hd2FpdCBrTShyLHMpOighcy5yZXF1aXJlUHJhZ21hJiZzLmluc2VydFByYWdtYSYmcy5wcmludGVyLmluc2VydFByYWdtYSYmIWF3YWl0IGx3KHIscykmJihyPXMucHJpbnRlci5pbnNlcnRQcmFnbWEocikpLGk9YXdhaXQgb3cocixzKSksbiYmKGkuZm9ybWF0dGVkPXN3K2kuZm9ybWF0dGVkLGkuY3Vyc29yT2Zmc2V0Pj0wJiZpLmN1cnNvck9mZnNldCsrKSxpfWFzeW5jIGZ1bmN0aW9uIE5NKGUsdCxuKXtsZXR7dGV4dDpyLG9wdGlvbnM6c309dXcoZSxhd2FpdCBQbyh0KSksaT1hd2FpdCBwdShyLHMpO3JldHVybiBuJiYobi5wcmVwcm9jZXNzRm9yUHJpbnQmJihpLmFzdD1hd2FpdCBaQShpLmFzdCxzKSksbi5tYXNzYWdlJiYoaS5hc3Q9Yk0oaS5hc3QscykpKSxpfWFzeW5jIGZ1bmN0aW9uIExNKGUsdCl7dD1hd2FpdCBQbyh0KTtsZXQgbj1hd2FpdCBxYyhlLHQpO3JldHVybiBSYyhuLHQpfWFzeW5jIGZ1bmN0aW9uICRNKGUsdCl7bGV0IG49ckkoZSkse2Zvcm1hdHRlZDpyfT1hd2FpdCBjdyhuLHsuLi50LHBhcnNlcjoiX19qc19leHByZXNzaW9uIn0pO3JldHVybiByfWFzeW5jIGZ1bmN0aW9uIEJNKGUsdCl7dD1hd2FpdCBQbyh0KTtsZXR7YXN0Om59PWF3YWl0IHB1KGUsdCk7cmV0dXJuIHQuY3Vyc29yT2Zmc2V0Pj0wJiYodD17Li4udCwuLi5ldyhuLHQpfSkscWMobix0KX1hc3luYyBmdW5jdGlvbiBfTShlLHQpe3JldHVybiBSYyhlLGF3YWl0IFBvKHQpKX12YXIgZnc9e307b20oZncse2J1aWxkZXJzOigpPT5JTSxwcmludGVyOigpPT5QTSx1dGlsczooKT0+TU19KTt2YXIgSU09e2pvaW46WkYsbGluZTplQSxzb2Z0bGluZTplSSxoYXJkbGluZTpqcixsaXRlcmFsbGluZTpuQSxncm91cDpRRixjb25kaXRpb25hbEdyb3VwOlhfLGZpbGw6S18sbGluZVN1ZmZpeDpobSxsaW5lU3VmZml4Qm91bmRhcnk6dEksY3Vyc29yOmhpLGJyZWFrUGFyZW50Ok1jLGlmQnJlYWs6WV8sdHJpbTpuSSxpbmRlbnQ6UGMsaW5kZW50SWZCcmVhazpRXyxhbGlnbjpCbyxhZGRBbGlnbm1lbnRUb0RvYzpZRixtYXJrQXNSb290OlhGLGRlZGVudFRvUm9vdDp6XyxkZWRlbnQ6R18saGFyZGxpbmVXaXRob3V0QnJlYWtQYXJlbnQ6cG0sbGl0ZXJhbGxpbmVXaXRob3V0QnJlYWtQYXJlbnQ6dEEsbGFiZWw6Wl8sY29uY2F0OmU9PmV9LFBNPXtwcmludERvY1RvU3RyaW5nOlJjfSxNTT17d2lsbEJyZWFrOk1fLHRyYXZlcnNlRG9jOmNtLGZpbmRJbkRvYzpmbSxtYXBEb2M6X2MscmVtb3ZlTGluZXM6al8sc3RyaXBUcmFpbGluZ0hhcmRsaW5lOktGLHJlcGxhY2VFbmRPZkxpbmU6cV8sY2FuQnJlYWs6SF99LE9NPSIzLjkuNiIscHc9e307b20ocHcse2FkZERhbmdsaW5nQ29tbWVudDooKT0+bWksYWRkTGVhZGluZ0NvbW1lbnQ6KCk9PmN1LGFkZFRyYWlsaW5nQ29tbWVudDooKT0+ZnUsZ2V0QWxpZ25tZW50U2l6ZTooKT0+Z20sZ2V0SW5kZW50U2l6ZTooKT0+V00sZ2V0TWF4Q29udGludW91c0NvdW50OigpPT56TSxnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVyOigpPT5LTSxnZXROZXh0Tm9uU3BhY2VOb25Db21tZW50Q2hhcmFjdGVySW5kZXg6KCk9PnNPLGdldFByZWZlcnJlZFF1b3RlOigpPT5RTSxnZXRTdHJpbmdXaWR0aDooKT0+ZG0saGFzTmV3bGluZTooKT0+eHMsaGFzTmV3bGluZUluUmFuZ2U6KCk9PmVPLGhhc1NwYWNlczooKT0+bk8saXNOZXh0TGluZUVtcHR5OigpPT5sTyxpc05leHRMaW5lRW1wdHlBZnRlckluZGV4OigpPT5fbSxpc1ByZXZpb3VzTGluZUVtcHR5OigpPT5vTyxtYWtlU3RyaW5nOigpPT51Tyxza2lwOigpPT5sdSxza2lwRXZlcnl0aGluZ0J1dE5ld0xpbmU6KCk9PmZBLHNraXBJbmxpbmVDb21tZW50OigpPT5MbSxza2lwTmV3bGluZTooKT0+ZGksc2tpcFNwYWNlczooKT0+U3Msc2tpcFRvTGluZUVuZDooKT0+Y0Esc2tpcFRyYWlsaW5nQ29tbWVudDooKT0+JG0sc2tpcFdoaXRlc3BhY2U6KCk9PkxJfSk7ZnVuY3Rpb24gUk0oZSx0KXtpZih0PT09ITEpcmV0dXJuITE7aWYoZS5jaGFyQXQodCk9PT0iLyImJmUuY2hhckF0KHQrMSk9PT0iKiIpe2ZvcihsZXQgbj10KzI7bjxlLmxlbmd0aDsrK24paWYoZS5jaGFyQXQobik9PT0iKiImJmUuY2hhckF0KG4rMSk9PT0iLyIpcmV0dXJuIG4rMn1yZXR1cm4gdH12YXIgTG09Uk07ZnVuY3Rpb24gak0oZSx0KXtyZXR1cm4gdD09PSExPyExOmUuY2hhckF0KHQpPT09Ii8iJiZlLmNoYXJBdCh0KzEpPT09Ii8iP2ZBKGUsdCk6dH12YXIgJG09ak07ZnVuY3Rpb24gVk0oZSx0KXtsZXQgbj1udWxsLHI9dDtmb3IoO3IhPT1uOyluPXIscj1TcyhlLHIpLHI9TG0oZSxyKSxyPSRtKGUscikscj1kaShlLHIpO3JldHVybiByfXZhciBCbT1WTTtmdW5jdGlvbiBVTShlLHQpe2xldCBuPW51bGwscj10O2Zvcig7ciE9PW47KW49cixyPWNBKGUscikscj1MbShlLHIpLHI9U3MoZSxyKTtyZXR1cm4gcj0kbShlLHIpLHI9ZGkoZSxyKSxyIT09ITEmJnhzKGUscil9dmFyIF9tPVVNO2Z1bmN0aW9uIHFNKGUsdCl7bGV0IG49ZS5sYXN0SW5kZXhPZihgCmApO3JldHVybiBuPT09LTE/MDpnbShlLnNsaWNlKG4rMSkubWF0Y2goL15bXHQgXSovKVswXSx0KX12YXIgV009cU07ZnVuY3Rpb24gSE0oZSl7aWYodHlwZW9mIGUhPSJzdHJpbmciKXRocm93IG5ldyBUeXBlRXJyb3IoIkV4cGVjdGVkIGEgc3RyaW5nIik7cmV0dXJuIGUucmVwbGFjZSgvW3xcXHt9KClbXF1eJCsqPy5dL2csIlxcJCYiKS5yZXBsYWNlKC8tL2csIlxceDJkIil9ZnVuY3Rpb24gSk0oZSx0KXtsZXQgbj1lLm1hdGNoQWxsKG5ldyBSZWdFeHAoYCg/OiR7SE0odCl9KStgLCJnIikpO3JldHVybiBuLnJlZHVjZXx8KG49Wy4uLm5dKSxuLnJlZHVjZSgocixbc10pPT5NYXRoLm1heChyLHMubGVuZ3RoKSwwKS90Lmxlbmd0aH12YXIgek09Sk07ZnVuY3Rpb24gR00oZSx0KXtsZXQgbj1CbShlLHQpO3JldHVybiBuPT09ITE/IiI6ZS5jaGFyQXQobil9dmFyIEtNPUdNLGh3PU9iamVjdC5mcmVlemUoe2NoYXJhY3RlcjoiJyIsY29kZVBvaW50OjM5fSksZHc9T2JqZWN0LmZyZWV6ZSh7Y2hhcmFjdGVyOiciJyxjb2RlUG9pbnQ6MzR9KSxYTT1PYmplY3QuZnJlZXplKHtwcmVmZXJyZWQ6aHcsYWx0ZXJuYXRlOmR3fSksWU09T2JqZWN0LmZyZWV6ZSh7cHJlZmVycmVkOmR3LGFsdGVybmF0ZTpod30pO2Z1bmN0aW9uIFFNKGUsdCl7bGV0e3ByZWZlcnJlZDpuLGFsdGVybmF0ZTpyfT10PT09ITB8fHQ9PT0iJyI/WE06WU0se2xlbmd0aDpzfT1lLGk9MCxvPTA7Zm9yKGxldCBhPTA7YTxzO2ErKyl7bGV0IHU9ZS5jaGFyQ29kZUF0KGEpO3U9PT1uLmNvZGVQb2ludD9pKys6dT09PXIuY29kZVBvaW50JiZvKyt9cmV0dXJuKGk+bz9yOm4pLmNoYXJhY3Rlcn1mdW5jdGlvbiBaTShlLHQsbil7Zm9yKGxldCByPXQ7cjxuOysrcilpZihlLmNoYXJBdChyKT09PWAKYClyZXR1cm4hMDtyZXR1cm4hMX12YXIgZU89Wk07ZnVuY3Rpb24gdE8oZSx0LG49e30pe3JldHVybiBTcyhlLG4uYmFja3dhcmRzP3QtMTp0LG4pIT09dH12YXIgbk89dE87ZnVuY3Rpb24gck8oZSx0LG4pe3JldHVybiBCbShlLG4odCkpfWZ1bmN0aW9uIHNPKGUsdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0yfHx0eXBlb2YgdD09Im51bWJlciI/Qm0oZSx0KTpyTyguLi5hcmd1bWVudHMpfWZ1bmN0aW9uIGlPKGUsdCxuKXtyZXR1cm4gdm0oZSxuKHQpKX1mdW5jdGlvbiBvTyhlLHQpe3JldHVybiBhcmd1bWVudHMubGVuZ3RoPT09Mnx8dHlwZW9mIHQ9PSJudW1iZXIiP3ZtKGUsdCk6aU8oLi4uYXJndW1lbnRzKX1mdW5jdGlvbiBhTyhlLHQsbil7cmV0dXJuIF9tKGUsbih0KSl9ZnVuY3Rpb24gdU8oZSx0LG4pe2xldCByPXQ9PT0nIic/IiciOiciJyxzPUxjKDAsZSwvXFwoLil8KFsiJ10pL2dzLChpLG8sYSk9Pm89PT1yP286YT09PXQ/IlxcIithOmF8fChuJiYvXlteXG5cciInMC03XFxiZm5ydC12eFx1MjAyOFx1MjAyOV0kLy50ZXN0KG8pP286IlxcIitvKSk7cmV0dXJuIHQrcyt0fWZ1bmN0aW9uIGxPKGUsdCl7cmV0dXJuIGFyZ3VtZW50cy5sZW5ndGg9PT0yfHx0eXBlb2YgdD09Im51bWJlciI/X20oZSx0KTphTyguLi5hcmd1bWVudHMpfWZ1bmN0aW9uIGdpKGUsdD0xKXtyZXR1cm4gYXN5bmMoLi4ubik9PntsZXQgcj1uW3RdPz97fSxzPXIucGx1Z2lucz8/W107cmV0dXJuIG5bdF09ey4uLnIscGx1Z2luczpBcnJheS5pc0FycmF5KHMpP3M6T2JqZWN0LnZhbHVlcyhzKX0sYXdhaXQgZSguLi5uKX19dmFyIG13PWdpKGN3KTthc3luYyBmdW5jdGlvbiBJbShlLHQpe2xldHtmb3JtYXR0ZWQ6bn09YXdhaXQgbXcoZSx7Li4udCxjdXJzb3JPZmZzZXQ6LTF9KTtyZXR1cm4gbn1hc3luYyBmdW5jdGlvbiBjTyhlLHQpe3JldHVybiBhd2FpdCBJbShlLHQpPT09ZX12YXIgZk89Z2koQUEsMCkscE89e3BhcnNlOmdpKE5NKSxmb3JtYXRBU1Q6Z2koTE0pLGZvcm1hdERvYzpnaSgkTSkscHJpbnRUb0RvYzpnaShCTSkscHJpbnREb2NUb1N0cmluZzpnaShfTSl9LGhPPU9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzLGRPPShlLHQpPT5mdW5jdGlvbigpe3JldHVybiB0fHwoMCxlW2hPKGUpWzBdXSkoKHQ9e2V4cG9ydHM6e319KS5leHBvcnRzLHQpLHQuZXhwb3J0c30sV2M9ZE8oeyJmaWxsZXJzL2pzb24tc2NoZW1hLmpzb24iKGUsdCl7dC5leHBvcnRzPXt9fX0pO2Z1bmN0aW9uIGd3KGUsdCl7aWYoZS5sZW5ndGg8dC5sZW5ndGgpcmV0dXJuITE7Zm9yKHZhciBuPTA7bjx0Lmxlbmd0aDtuKyspaWYoZVtuXSE9PXRbbl0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gUG0oZSx0KXt2YXIgbj1lLmxlbmd0aC10Lmxlbmd0aDtyZXR1cm4gbj4wP2UubGFzdEluZGV4T2YodCk9PT1uOm49PT0wP2U9PT10OiExfWZ1bmN0aW9uIG1PKGUpe3JldHVybiBndyhlLCIoP2kpIik/bmV3IFJlZ0V4cChlLnN1YnN0cmluZyg0KSwiaSIpOm5ldyBSZWdFeHAoZSl9ZnVuY3Rpb24gTW8oZSl7cmV0dXJuIHR5cGVvZiBlPT0iYm9vbGVhbiJ9dmFyIEF0OyhmdW5jdGlvbihlKXtlW2UuVW5kZWZpbmVkPTBdPSJVbmRlZmluZWQiLGVbZS5FbnVtVmFsdWVNaXNtYXRjaD0xXT0iRW51bVZhbHVlTWlzbWF0Y2giLGVbZS5EZXByZWNhdGVkPTJdPSJEZXByZWNhdGVkIixlW2UuVW5leHBlY3RlZEVuZE9mQ29tbWVudD0yNTddPSJVbmV4cGVjdGVkRW5kT2ZDb21tZW50IixlW2UuVW5leHBlY3RlZEVuZE9mU3RyaW5nPTI1OF09IlVuZXhwZWN0ZWRFbmRPZlN0cmluZyIsZVtlLlVuZXhwZWN0ZWRFbmRPZk51bWJlcj0yNTldPSJVbmV4cGVjdGVkRW5kT2ZOdW1iZXIiLGVbZS5JbnZhbGlkVW5pY29kZT0yNjBdPSJJbnZhbGlkVW5pY29kZSIsZVtlLkludmFsaWRFc2NhcGVDaGFyYWN0ZXI9MjYxXT0iSW52YWxpZEVzY2FwZUNoYXJhY3RlciIsZVtlLkludmFsaWRDaGFyYWN0ZXI9MjYyXT0iSW52YWxpZENoYXJhY3RlciIsZVtlLlByb3BlcnR5RXhwZWN0ZWQ9NTEzXT0iUHJvcGVydHlFeHBlY3RlZCIsZVtlLkNvbW1hRXhwZWN0ZWQ9NTE0XT0iQ29tbWFFeHBlY3RlZCIsZVtlLkNvbG9uRXhwZWN0ZWQ9NTE1XT0iQ29sb25FeHBlY3RlZCIsZVtlLlZhbHVlRXhwZWN0ZWQ9NTE2XT0iVmFsdWVFeHBlY3RlZCIsZVtlLkNvbW1hT3JDbG9zZUJhY2tldEV4cGVjdGVkPTUxN109IkNvbW1hT3JDbG9zZUJhY2tldEV4cGVjdGVkIixlW2UuQ29tbWFPckNsb3NlQnJhY2VFeHBlY3RlZD01MThdPSJDb21tYU9yQ2xvc2VCcmFjZUV4cGVjdGVkIixlW2UuVHJhaWxpbmdDb21tYT01MTldPSJUcmFpbGluZ0NvbW1hIixlW2UuRHVwbGljYXRlS2V5PTUyMF09IkR1cGxpY2F0ZUtleSIsZVtlLkNvbW1lbnROb3RQZXJtaXR0ZWQ9NTIxXT0iQ29tbWVudE5vdFBlcm1pdHRlZCIsZVtlLlNjaGVtYVJlc29sdmVFcnJvcj03NjhdPSJTY2hlbWFSZXNvbHZlRXJyb3IifSkoQXR8fChBdD17fSkpO3ZhciB5dzsoZnVuY3Rpb24oZSl7ZS5MQVRFU1Q9e3RleHREb2N1bWVudDp7Y29tcGxldGlvbjp7Y29tcGxldGlvbkl0ZW06e2RvY3VtZW50YXRpb25Gb3JtYXQ6W3ZyLk1hcmtkb3duLHZyLlBsYWluVGV4dF0sY29tbWl0Q2hhcmFjdGVyc1N1cHBvcnQ6ITB9fX19fSkoeXd8fCh5dz17fSkpO3ZhciBnTz0oZSx0LC4uLm4pPT5uLmxlbmd0aD09PTA/dDp0LnJlcGxhY2VBbGwoL3soXGQrKX0vZywocixbc10pPT5zIGluIG4/U3RyaW5nKG5bc10pOnIpO2Z1bmN0aW9uIE1tKCl7cmV0dXJuIGdPfXZhciB5aT1mdW5jdGlvbigpe3ZhciBlPWZ1bmN0aW9uKHQsbil7cmV0dXJuIGU9T2JqZWN0LnNldFByb3RvdHlwZU9mfHx7X19wcm90b19fOltdfWluc3RhbmNlb2YgQXJyYXkmJmZ1bmN0aW9uKHIscyl7ci5fX3Byb3RvX189c318fGZ1bmN0aW9uKHIscyl7Zm9yKHZhciBpIGluIHMpT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHMsaSkmJihyW2ldPXNbaV0pfSxlKHQsbil9O3JldHVybiBmdW5jdGlvbih0LG4pe2lmKHR5cGVvZiBuIT0iZnVuY3Rpb24iJiZuIT09bnVsbCl0aHJvdyBuZXcgVHlwZUVycm9yKCJDbGFzcyBleHRlbmRzIHZhbHVlICIrU3RyaW5nKG4pKyIgaXMgbm90IGEgY29uc3RydWN0b3Igb3IgbnVsbCIpO2UodCxuKTtmdW5jdGlvbiByKCl7dGhpcy5jb25zdHJ1Y3Rvcj10fXQucHJvdG90eXBlPW49PT1udWxsP09iamVjdC5jcmVhdGUobik6KHIucHJvdG90eXBlPW4ucHJvdG90eXBlLG5ldyByKX19KCksaHU9TW0oKTtodSgiY29sb3JIZXhGb3JtYXRXYXJuaW5nIiwiSW52YWxpZCBjb2xvciBmb3JtYXQuIFVzZSAjUkdCLCAjUkdCQSwgI1JSR0dCQiBvciAjUlJHR0JCQUEuIiksaHUoImRhdGVUaW1lRm9ybWF0V2FybmluZyIsIlN0cmluZyBpcyBub3QgYSBSRkMzMzM5IGRhdGUtdGltZS4iKSxodSgiZGF0ZUZvcm1hdFdhcm5pbmciLCJTdHJpbmcgaXMgbm90IGEgUkZDMzMzOSBkYXRlLiIpLGh1KCJ0aW1lRm9ybWF0V2FybmluZyIsIlN0cmluZyBpcyBub3QgYSBSRkMzMzM5IHRpbWUuIiksaHUoImVtYWlsRm9ybWF0V2FybmluZyIsIlN0cmluZyBpcyBub3QgYW4gZS1tYWlsIGFkZHJlc3MuIik7dmFyIERpPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4scil7cj09PXZvaWQgMCYmKHI9MCksdGhpcy5vZmZzZXQ9bix0aGlzLmxlbmd0aD1yLHRoaXMucGFyZW50PXR9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwiY2hpbGRyZW4iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm5bXX0sZW51bWVyYWJsZTohMSxjb25maWd1cmFibGU6ITB9KSxlLnByb3RvdHlwZS50b1N0cmluZz1mdW5jdGlvbigpe3JldHVybiJ0eXBlOiAiK3RoaXMudHlwZSsiICgiK3RoaXMub2Zmc2V0KyIvIit0aGlzLmxlbmd0aCsiKSIrKHRoaXMucGFyZW50PyIgcGFyZW50OiB7Iit0aGlzLnBhcmVudC50b1N0cmluZygpKyJ9IjoiIil9LGV9KCk7KGZ1bmN0aW9uKGUpe3lpKHQsZSk7ZnVuY3Rpb24gdChuLHIpe3ZhciBzPWUuY2FsbCh0aGlzLG4scil8fHRoaXM7cmV0dXJuIHMudHlwZT0ibnVsbCIscy52YWx1ZT1udWxsLHN9cmV0dXJuIHR9KShEaSksZnVuY3Rpb24oZSl7eWkodCxlKTtmdW5jdGlvbiB0KG4scixzKXt2YXIgaT1lLmNhbGwodGhpcyxuLHMpfHx0aGlzO3JldHVybiBpLnR5cGU9ImJvb2xlYW4iLGkudmFsdWU9cixpfXJldHVybiB0fShEaSksZnVuY3Rpb24oZSl7eWkodCxlKTtmdW5jdGlvbiB0KG4scil7dmFyIHM9ZS5jYWxsKHRoaXMsbixyKXx8dGhpcztyZXR1cm4gcy50eXBlPSJhcnJheSIscy5pdGVtcz1bXSxzfXJldHVybiBPYmplY3QuZGVmaW5lUHJvcGVydHkodC5wcm90b3R5cGUsImNoaWxkcmVuIix7Z2V0OmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuaXRlbXN9LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksdH0oRGkpLGZ1bmN0aW9uKGUpe3lpKHQsZSk7ZnVuY3Rpb24gdChuLHIpe3ZhciBzPWUuY2FsbCh0aGlzLG4scil8fHRoaXM7cmV0dXJuIHMudHlwZT0ibnVtYmVyIixzLmlzSW50ZWdlcj0hMCxzLnZhbHVlPU51bWJlci5OYU4sc31yZXR1cm4gdH0oRGkpLGZ1bmN0aW9uKGUpe3lpKHQsZSk7ZnVuY3Rpb24gdChuLHIscyl7dmFyIGk9ZS5jYWxsKHRoaXMsbixyLHMpfHx0aGlzO3JldHVybiBpLnR5cGU9InN0cmluZyIsaS52YWx1ZT0iIixpfXJldHVybiB0fShEaSksZnVuY3Rpb24oZSl7eWkodCxlKTtmdW5jdGlvbiB0KG4scixzKXt2YXIgaT1lLmNhbGwodGhpcyxuLHIpfHx0aGlzO3JldHVybiBpLnR5cGU9InByb3BlcnR5IixpLmNvbG9uT2Zmc2V0PS0xLGkua2V5Tm9kZT1zLGl9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh0LnByb3RvdHlwZSwiY2hpbGRyZW4iLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy52YWx1ZU5vZGU/W3RoaXMua2V5Tm9kZSx0aGlzLnZhbHVlTm9kZV06W3RoaXMua2V5Tm9kZV19LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksdH0oRGkpLGZ1bmN0aW9uKGUpe3lpKHQsZSk7ZnVuY3Rpb24gdChuLHIpe3ZhciBzPWUuY2FsbCh0aGlzLG4scil8fHRoaXM7cmV0dXJuIHMudHlwZT0ib2JqZWN0IixzLnByb3BlcnRpZXM9W10sc31yZXR1cm4gT2JqZWN0LmRlZmluZVByb3BlcnR5KHQucHJvdG90eXBlLCJjaGlsZHJlbiIse2dldDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnByb3BlcnRpZXN9LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksdH0oRGkpO2Z1bmN0aW9uIHlPKGUpe3JldHVybiBNbyhlKT9lP3t9Ontub3Q6e319OmV9dmFyIER3OyhmdW5jdGlvbihlKXtlW2UuS2V5PTBdPSJLZXkiLGVbZS5FbnVtPTFdPSJFbnVtIn0pKER3fHwoRHc9e30pKSxmdW5jdGlvbigpe2Z1bmN0aW9uIGUoKXt9cmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShlLnByb3RvdHlwZSwic2NoZW1hcyIse2dldDpmdW5jdGlvbigpe3JldHVybltdfSxlbnVtZXJhYmxlOiExLGNvbmZpZ3VyYWJsZTohMH0pLGUucHJvdG90eXBlLmFkZD1mdW5jdGlvbih0KXt9LGUucHJvdG90eXBlLm1lcmdlPWZ1bmN0aW9uKHQpe30sZS5wcm90b3R5cGUuaW5jbHVkZT1mdW5jdGlvbih0KXtyZXR1cm4hMH0sZS5wcm90b3R5cGUubmV3U3ViPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXN9LGUuaW5zdGFuY2U9bmV3IGUsZX0oKTtmdW5jdGlvbiBIYyhlKXtyZXR1cm4gdTkoZSl9ZnVuY3Rpb24gRE8oZSx0KXtpZih0eXBlb2YgZSE9InN0cmluZyIpdGhyb3cgbmV3IFR5cGVFcnJvcigiRXhwZWN0ZWQgYSBzdHJpbmciKTtmb3IodmFyIG49U3RyaW5nKGUpLHI9IiIscz0hIXQsaT0hIXQsbz0hMSxhPXQmJnR5cGVvZiB0LmZsYWdzPT0ic3RyaW5nIj90LmZsYWdzOiIiLHUsbD0wLGY9bi5sZW5ndGg7bDxmO2wrKylzd2l0Y2godT1uW2xdLHUpe2Nhc2UiLyI6Y2FzZSIkIjpjYXNlIl4iOmNhc2UiKyI6Y2FzZSIuIjpjYXNlIigiOmNhc2UiKSI6Y2FzZSI9IjpjYXNlIiEiOmNhc2UifCI6cis9IlxcIit1O2JyZWFrO2Nhc2UiPyI6aWYocyl7cis9Ii4iO2JyZWFrfWNhc2UiWyI6Y2FzZSJdIjppZihzKXtyKz11O2JyZWFrfWNhc2UieyI6aWYocyl7bz0hMCxyKz0iKCI7YnJlYWt9Y2FzZSJ9IjppZihzKXtvPSExLHIrPSIpIjticmVha31jYXNlIiwiOmlmKG8pe3IrPSJ8IjticmVha31yKz0iXFwiK3U7YnJlYWs7Y2FzZSIqIjpmb3IodmFyIGM9bltsLTFdLHA9MTtuW2wrMV09PT0iKiI7KXArKyxsKys7dmFyIGg9bltsKzFdO2lmKCFpKXIrPSIuKiI7ZWxzZXt2YXIgZD1wPjEmJihjPT09Ii8ifHxjPT09dm9pZCAwfHxjPT09InsifHxjPT09IiwiKSYmKGg9PT0iLyJ8fGg9PT12b2lkIDB8fGg9PT0iLCJ8fGg9PT0ifSIpO2Q/KGg9PT0iLyI/bCsrOmM9PT0iLyImJnIuZW5kc1dpdGgoIlxcLyIpJiYocj1yLnN1YnN0cigwLHIubGVuZ3RoLTIpKSxyKz0iKCg/OlteL10qKD86L3wkKSkqKSIpOnIrPSIoW14vXSopIn1icmVhaztkZWZhdWx0OnIrPXV9cmV0dXJuKCFhfHwhfmEuaW5kZXhPZigiZyIpKSYmKHI9Il4iK3IrIiQiKSxuZXcgUmVnRXhwKHIsYSl9dmFyIFRzPU1tKCksYk89IiEiLEVPPSIvIix2Tz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXt0aGlzLmdsb2JXcmFwcGVycz1bXTt0cnl7Zm9yKHZhciByPTAscz10O3I8cy5sZW5ndGg7cisrKXt2YXIgaT1zW3JdLG89aVswXSE9PWJPO298fChpPWkuc3Vic3RyaW5nKDEpKSxpLmxlbmd0aD4wJiYoaVswXT09PUVPJiYoaT1pLnN1YnN0cmluZygxKSksdGhpcy5nbG9iV3JhcHBlcnMucHVzaCh7cmVnZXhwOkRPKCIqKi8iK2kse2V4dGVuZGVkOiEwLGdsb2JzdGFyOiEwfSksaW5jbHVkZTpvfSkpfXRoaXMudXJpcz1ufWNhdGNoe3RoaXMuZ2xvYldyYXBwZXJzLmxlbmd0aD0wLHRoaXMudXJpcz1bXX19cmV0dXJuIGUucHJvdG90eXBlLm1hdGNoZXNQYXR0ZXJuPWZ1bmN0aW9uKHQpe2Zvcih2YXIgbj0hMSxyPTAscz10aGlzLmdsb2JXcmFwcGVycztyPHMubGVuZ3RoO3IrKyl7dmFyIGk9c1tyXSxvPWkucmVnZXhwLGE9aS5pbmNsdWRlO28udGVzdCh0KSYmKG49YSl9cmV0dXJuIG59LGUucHJvdG90eXBlLmdldFVSSXM9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51cmlzfSxlfSgpLEZPPWZ1bmN0aW9uKCl7ZnVuY3Rpb24gZSh0LG4scil7dGhpcy5zZXJ2aWNlPXQsdGhpcy51cmw9bix0aGlzLmRlcGVuZGVuY2llcz17fSxyJiYodGhpcy51bnJlc29sdmVkU2NoZW1hPXRoaXMuc2VydmljZS5wcm9taXNlLnJlc29sdmUobmV3IFRuKHIpKSl9cmV0dXJuIGUucHJvdG90eXBlLmdldFVucmVzb2x2ZWRTY2hlbWE9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy51bnJlc29sdmVkU2NoZW1hfHwodGhpcy51bnJlc29sdmVkU2NoZW1hPXRoaXMuc2VydmljZS5sb2FkU2NoZW1hKHRoaXMudXJsKSksdGhpcy51bnJlc29sdmVkU2NoZW1hfSxlLnByb3RvdHlwZS5nZXRSZXNvbHZlZFNjaGVtYT1mdW5jdGlvbigpe3ZhciB0PXRoaXM7cmV0dXJuIHRoaXMucmVzb2x2ZWRTY2hlbWF8fCh0aGlzLnJlc29sdmVkU2NoZW1hPXRoaXMuZ2V0VW5yZXNvbHZlZFNjaGVtYSgpLnRoZW4oZnVuY3Rpb24obil7cmV0dXJuIHQuc2VydmljZS5yZXNvbHZlU2NoZW1hQ29udGVudChuLHQudXJsLHQuZGVwZW5kZW5jaWVzKX0pKSx0aGlzLnJlc29sdmVkU2NoZW1hfSxlLnByb3RvdHlwZS5jbGVhclNjaGVtYT1mdW5jdGlvbigpe3RoaXMucmVzb2x2ZWRTY2hlbWE9dm9pZCAwLHRoaXMudW5yZXNvbHZlZFNjaGVtYT12b2lkIDAsdGhpcy5kZXBlbmRlbmNpZXM9e319LGV9KCksVG49ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbil7bj09PXZvaWQgMCYmKG49W10pLHRoaXMuc2NoZW1hPXQsdGhpcy5lcnJvcnM9bn1yZXR1cm4gZX0oKSxPbz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCxuKXtuPT09dm9pZCAwJiYobj1bXSksdGhpcy5zY2hlbWE9dCx0aGlzLmVycm9ycz1ufXJldHVybiBlLnByb3RvdHlwZS5nZXRTZWN0aW9uPWZ1bmN0aW9uKHQpe3ZhciBuPXRoaXMuZ2V0U2VjdGlvblJlY3Vyc2l2ZSh0LHRoaXMuc2NoZW1hKTtpZihuKXJldHVybiB5TyhuKX0sZS5wcm90b3R5cGUuZ2V0U2VjdGlvblJlY3Vyc2l2ZT1mdW5jdGlvbih0LG4pe2lmKCFufHx0eXBlb2Ygbj09ImJvb2xlYW4ifHx0Lmxlbmd0aD09PTApcmV0dXJuIG47dmFyIHI9dC5zaGlmdCgpO2lmKG4ucHJvcGVydGllcyYmdHlwZW9mIG4ucHJvcGVydGllc1tyXSlyZXR1cm4gdGhpcy5nZXRTZWN0aW9uUmVjdXJzaXZlKHQsbi5wcm9wZXJ0aWVzW3JdKTtpZihuLnBhdHRlcm5Qcm9wZXJ0aWVzKWZvcih2YXIgcz0wLGk9T2JqZWN0LmtleXMobi5wYXR0ZXJuUHJvcGVydGllcyk7czxpLmxlbmd0aDtzKyspe3ZhciBvPWlbc10sYT1tTyhvKTtpZihhLnRlc3QocikpcmV0dXJuIHRoaXMuZ2V0U2VjdGlvblJlY3Vyc2l2ZSh0LG4ucGF0dGVyblByb3BlcnRpZXNbb10pfWVsc2V7aWYodHlwZW9mIG4uYWRkaXRpb25hbFByb3BlcnRpZXM9PSJvYmplY3QiKXJldHVybiB0aGlzLmdldFNlY3Rpb25SZWN1cnNpdmUodCxuLmFkZGl0aW9uYWxQcm9wZXJ0aWVzKTtpZihyLm1hdGNoKCJbMC05XSsiKSl7aWYoQXJyYXkuaXNBcnJheShuLml0ZW1zKSl7dmFyIHU9cGFyc2VJbnQociwxMCk7aWYoIWlzTmFOKHUpJiZuLml0ZW1zW3VdKXJldHVybiB0aGlzLmdldFNlY3Rpb25SZWN1cnNpdmUodCxuLml0ZW1zW3VdKX1lbHNlIGlmKG4uaXRlbXMpcmV0dXJuIHRoaXMuZ2V0U2VjdGlvblJlY3Vyc2l2ZSh0LG4uaXRlbXMpfX19LGV9KCksQU89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbixyKXt0aGlzLmNvbnRleHRTZXJ2aWNlPW4sdGhpcy5yZXF1ZXN0U2VydmljZT10LHRoaXMucHJvbWlzZUNvbnN0cnVjdG9yPXJ8fFByb21pc2UsdGhpcy5jYWxsT25EaXNwb3NlPVtdLHRoaXMuY29udHJpYnV0aW9uU2NoZW1hcz17fSx0aGlzLmNvbnRyaWJ1dGlvbkFzc29jaWF0aW9ucz1bXSx0aGlzLnNjaGVtYXNCeUlkPXt9LHRoaXMuZmlsZVBhdHRlcm5Bc3NvY2lhdGlvbnM9W10sdGhpcy5yZWdpc3RlcmVkU2NoZW1hc0lkcz17fX1yZXR1cm4gZS5wcm90b3R5cGUuZ2V0UmVnaXN0ZXJlZFNjaGVtYUlkcz1mdW5jdGlvbih0KXtyZXR1cm4gT2JqZWN0LmtleXModGhpcy5yZWdpc3RlcmVkU2NoZW1hc0lkcykuZmlsdGVyKGZ1bmN0aW9uKG4pe3ZhciByPXJ0LnBhcnNlKG4pLnNjaGVtZTtyZXR1cm4gciE9PSJzY2hlbWFzZXJ2aWNlIiYmKCF0fHx0KHIpKX0pfSxPYmplY3QuZGVmaW5lUHJvcGVydHkoZS5wcm90b3R5cGUsInByb21pc2UiLHtnZXQ6ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5wcm9taXNlQ29uc3RydWN0b3J9LGVudW1lcmFibGU6ITEsY29uZmlndXJhYmxlOiEwfSksZS5wcm90b3R5cGUuZGlzcG9zZT1mdW5jdGlvbigpe2Zvcig7dGhpcy5jYWxsT25EaXNwb3NlLmxlbmd0aD4wOyl0aGlzLmNhbGxPbkRpc3Bvc2UucG9wKCkoKX0sZS5wcm90b3R5cGUub25SZXNvdXJjZUNoYW5nZT1mdW5jdGlvbih0KXt2YXIgbj10aGlzO3RoaXMuY2FjaGVkU2NoZW1hRm9yUmVzb3VyY2U9dm9pZCAwO3ZhciByPSExO3Q9TnModCk7Zm9yKHZhciBzPVt0XSxpPU9iamVjdC5rZXlzKHRoaXMuc2NoZW1hc0J5SWQpLm1hcChmdW5jdGlvbihsKXtyZXR1cm4gbi5zY2hlbWFzQnlJZFtsXX0pO3MubGVuZ3RoOylmb3IodmFyIG89cy5wb3AoKSxhPTA7YTxpLmxlbmd0aDthKyspe3ZhciB1PWlbYV07dSYmKHUudXJsPT09b3x8dS5kZXBlbmRlbmNpZXNbb10pJiYodS51cmwhPT1vJiZzLnB1c2godS51cmwpLHUuY2xlYXJTY2hlbWEoKSxpW2FdPXZvaWQgMCxyPSEwKX1yZXR1cm4gcn0sZS5wcm90b3R5cGUuc2V0U2NoZW1hQ29udHJpYnV0aW9ucz1mdW5jdGlvbih0KXtpZih0LnNjaGVtYXMpe3ZhciBuPXQuc2NoZW1hcztmb3IodmFyIHIgaW4gbil7dmFyIHM9TnMocik7dGhpcy5jb250cmlidXRpb25TY2hlbWFzW3NdPXRoaXMuYWRkU2NoZW1hSGFuZGxlKHMsbltyXSl9fWlmKEFycmF5LmlzQXJyYXkodC5zY2hlbWFBc3NvY2lhdGlvbnMpKWZvcih2YXIgaT10LnNjaGVtYUFzc29jaWF0aW9ucyxvPTAsYT1pO288YS5sZW5ndGg7bysrKXt2YXIgdT1hW29dLGw9dS51cmlzLm1hcChOcyksZj10aGlzLmFkZEZpbGVQYXR0ZXJuQXNzb2NpYXRpb24odS5wYXR0ZXJuLGwpO3RoaXMuY29udHJpYnV0aW9uQXNzb2NpYXRpb25zLnB1c2goZil9fSxlLnByb3RvdHlwZS5hZGRTY2hlbWFIYW5kbGU9ZnVuY3Rpb24odCxuKXt2YXIgcj1uZXcgRk8odGhpcyx0LG4pO3JldHVybiB0aGlzLnNjaGVtYXNCeUlkW3RdPXIscn0sZS5wcm90b3R5cGUuZ2V0T3JBZGRTY2hlbWFIYW5kbGU9ZnVuY3Rpb24odCxuKXtyZXR1cm4gdGhpcy5zY2hlbWFzQnlJZFt0XXx8dGhpcy5hZGRTY2hlbWFIYW5kbGUodCxuKX0sZS5wcm90b3R5cGUuYWRkRmlsZVBhdHRlcm5Bc3NvY2lhdGlvbj1mdW5jdGlvbih0LG4pe3ZhciByPW5ldyB2Tyh0LG4pO3JldHVybiB0aGlzLmZpbGVQYXR0ZXJuQXNzb2NpYXRpb25zLnB1c2gocikscn0sZS5wcm90b3R5cGUucmVnaXN0ZXJFeHRlcm5hbFNjaGVtYT1mdW5jdGlvbih0LG4scil7dmFyIHM9TnModCk7cmV0dXJuIHRoaXMucmVnaXN0ZXJlZFNjaGVtYXNJZHNbc109ITAsdGhpcy5jYWNoZWRTY2hlbWFGb3JSZXNvdXJjZT12b2lkIDAsbiYmdGhpcy5hZGRGaWxlUGF0dGVybkFzc29jaWF0aW9uKG4sW3RdKSxyP3RoaXMuYWRkU2NoZW1hSGFuZGxlKHMscik6dGhpcy5nZXRPckFkZFNjaGVtYUhhbmRsZShzKX0sZS5wcm90b3R5cGUuY2xlYXJFeHRlcm5hbFNjaGVtYXM9ZnVuY3Rpb24oKXt0aGlzLnNjaGVtYXNCeUlkPXt9LHRoaXMuZmlsZVBhdHRlcm5Bc3NvY2lhdGlvbnM9W10sdGhpcy5yZWdpc3RlcmVkU2NoZW1hc0lkcz17fSx0aGlzLmNhY2hlZFNjaGVtYUZvclJlc291cmNlPXZvaWQgMDtmb3IodmFyIHQgaW4gdGhpcy5jb250cmlidXRpb25TY2hlbWFzKXRoaXMuc2NoZW1hc0J5SWRbdF09dGhpcy5jb250cmlidXRpb25TY2hlbWFzW3RdLHRoaXMucmVnaXN0ZXJlZFNjaGVtYXNJZHNbdF09ITA7Zm9yKHZhciBuPTAscj10aGlzLmNvbnRyaWJ1dGlvbkFzc29jaWF0aW9ucztuPHIubGVuZ3RoO24rKyl7dmFyIHM9cltuXTt0aGlzLmZpbGVQYXR0ZXJuQXNzb2NpYXRpb25zLnB1c2gocyl9fSxlLnByb3RvdHlwZS5nZXRSZXNvbHZlZFNjaGVtYT1mdW5jdGlvbih0KXt2YXIgbj1Ocyh0KSxyPXRoaXMuc2NoZW1hc0J5SWRbbl07cmV0dXJuIHI/ci5nZXRSZXNvbHZlZFNjaGVtYSgpOnRoaXMucHJvbWlzZS5yZXNvbHZlKHZvaWQgMCl9LGUucHJvdG90eXBlLmxvYWRTY2hlbWE9ZnVuY3Rpb24odCl7aWYoIXRoaXMucmVxdWVzdFNlcnZpY2Upe3ZhciBuPVRzKCJqc29uLnNjaGVtYS5ub3JlcXVlc3RzZXJ2aWNlIiwiVW5hYmxlIHRvIGxvYWQgc2NoZW1hIGZyb20gJ3swfScuIE5vIHNjaGVtYSByZXF1ZXN0IHNlcnZpY2UgYXZhaWxhYmxlIixKYyh0KSk7cmV0dXJuIHRoaXMucHJvbWlzZS5yZXNvbHZlKG5ldyBUbih7fSxbbl0pKX1yZXR1cm4gdGhpcy5yZXF1ZXN0U2VydmljZSh0KS50aGVuKGZ1bmN0aW9uKHIpe2lmKCFyKXt2YXIgcz1UcygianNvbi5zY2hlbWEubm9jb250ZW50IiwiVW5hYmxlIHRvIGxvYWQgc2NoZW1hIGZyb20gJ3swfSc6IE5vIGNvbnRlbnQuIixKYyh0KSk7cmV0dXJuIG5ldyBUbih7fSxbc10pfXZhciBpPXt9LG89W107aT1FZyhyLG8pO3ZhciBhPW8ubGVuZ3RoP1tUcygianNvbi5zY2hlbWEuaW52YWxpZEZvcm1hdCIsIlVuYWJsZSB0byBwYXJzZSBjb250ZW50IGZyb20gJ3swfSc6IFBhcnNlIGVycm9yIGF0IG9mZnNldCB7MX0uIixKYyh0KSxvWzBdLm9mZnNldCldOltdO3JldHVybiBuZXcgVG4oaSxhKX0sZnVuY3Rpb24ocil7dmFyIHM9ci50b1N0cmluZygpLGk9ci50b1N0cmluZygpLnNwbGl0KCJFcnJvcjogIik7cmV0dXJuIGkubGVuZ3RoPjEmJihzPWlbMV0pLFBtKHMsIi4iKSYmKHM9cy5zdWJzdHIoMCxzLmxlbmd0aC0xKSksbmV3IFRuKHt9LFtUcygianNvbi5zY2hlbWEubm9jb250ZW50IiwiVW5hYmxlIHRvIGxvYWQgc2NoZW1hIGZyb20gJ3swfSc6IHsxfS4iLEpjKHQpLHMpXSl9KX0sZS5wcm90b3R5cGUucmVzb2x2ZVNjaGVtYUNvbnRlbnQ9ZnVuY3Rpb24odCxuLHIpe3ZhciBzPXRoaXMsaT10LmVycm9ycy5zbGljZSgwKSxvPXQuc2NoZW1hO2lmKG8uJHNjaGVtYSl7dmFyIGE9TnMoby4kc2NoZW1hKTtpZihhPT09Imh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDMvc2NoZW1hIilyZXR1cm4gdGhpcy5wcm9taXNlLnJlc29sdmUobmV3IE9vKHt9LFtUcygianNvbi5zY2hlbWEuZHJhZnQwMy5ub3RzdXBwb3J0ZWQiLCJEcmFmdC0wMyBzY2hlbWFzIGFyZSBub3Qgc3VwcG9ydGVkLiIpXSkpO2E9PT0iaHR0cHM6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQvMjAxOS0wOS9zY2hlbWEiJiZpLnB1c2goVHMoImpzb24uc2NoZW1hLmRyYWZ0MjAxOTA5Lm5vdHN1cHBvcnRlZCIsIkRyYWZ0IDIwMTktMDkgc2NoZW1hcyBhcmUgbm90IHlldCBmdWxseSBzdXBwb3J0ZWQuIikpfXZhciB1PXRoaXMuY29udGV4dFNlcnZpY2UsbD1mdW5jdGlvbihoLGQpe2lmKCFkKXJldHVybiBoO3ZhciBtPWg7cmV0dXJuIGRbMF09PT0iLyImJihkPWQuc3Vic3RyKDEpKSxkLnNwbGl0KCIvIikuc29tZShmdW5jdGlvbihnKXtyZXR1cm4gZz1nLnJlcGxhY2UoL34xL2csIi8iKS5yZXBsYWNlKC9+MC9nLCJ+IiksbT1tW2ddLCFtfSksbX0sZj1mdW5jdGlvbihoLGQsbSxnKXt2YXIgRD1nP2RlY29kZVVSSUNvbXBvbmVudChnKTp2b2lkIDAsYj1sKGQsRCk7aWYoYilmb3IodmFyIEUgaW4gYiliLmhhc093blByb3BlcnR5KEUpJiYhaC5oYXNPd25Qcm9wZXJ0eShFKSYmKGhbRV09YltFXSk7ZWxzZSBpLnB1c2goVHMoImpzb24uc2NoZW1hLmludmFsaWRyZWYiLCIkcmVmICd7MH0nIGluICd7MX0nIGNhbiBub3QgYmUgcmVzb2x2ZWQuIixELG0pKX0sYz1mdW5jdGlvbihoLGQsbSxnLEQpe3UmJiEvXltBLVphLXpdW0EtWmEtejAtOStcLS4rXSo6XC9cLy4qLy50ZXN0KGQpJiYoZD11LnJlc29sdmVSZWxhdGl2ZVBhdGgoZCxnKSksZD1OcyhkKTt2YXIgYj1zLmdldE9yQWRkU2NoZW1hSGFuZGxlKGQpO3JldHVybiBiLmdldFVucmVzb2x2ZWRTY2hlbWEoKS50aGVuKGZ1bmN0aW9uKEUpe2lmKERbZF09ITAsRS5lcnJvcnMubGVuZ3RoKXt2YXIgRj1tP2QrIiMiK206ZDtpLnB1c2goVHMoImpzb24uc2NoZW1hLnByb2JsZW1sb2FkaW5ncmVmIiwiUHJvYmxlbXMgbG9hZGluZyByZWZlcmVuY2UgJ3swfSc6IHsxfSIsRixFLmVycm9yc1swXSkpfXJldHVybiBmKGgsRS5zY2hlbWEsZCxtKSxwKGgsRS5zY2hlbWEsZCxiLmRlcGVuZGVuY2llcyl9KX0scD1mdW5jdGlvbihoLGQsbSxnKXtpZighaHx8dHlwZW9mIGghPSJvYmplY3QiKXJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7Zm9yKHZhciBEPVtoXSxiPVtdLEU9W10sRj1mdW5jdGlvbigpe2Zvcih2YXIgVD1bXSxOPTA7Tjxhcmd1bWVudHMubGVuZ3RoO04rKylUW05dPWFyZ3VtZW50c1tOXTtmb3IodmFyIHg9MCxMPVQ7eDxMLmxlbmd0aDt4Kyspe3ZhciBTPUxbeF07dHlwZW9mIFM9PSJvYmplY3QiJiZELnB1c2goUyl9fSx2PWZ1bmN0aW9uKCl7Zm9yKHZhciBUPVtdLE49MDtOPGFyZ3VtZW50cy5sZW5ndGg7TisrKVRbTl09YXJndW1lbnRzW05dO2Zvcih2YXIgeD0wLEw9VDt4PEwubGVuZ3RoO3grKyl7dmFyIFM9TFt4XTtpZih0eXBlb2YgUz09Im9iamVjdCIpZm9yKHZhciBrIGluIFMpe3ZhciBJPWssTT1TW0ldO3R5cGVvZiBNPT0ib2JqZWN0IiYmRC5wdXNoKE0pfX19LEM9ZnVuY3Rpb24oKXtmb3IodmFyIFQ9W10sTj0wO048YXJndW1lbnRzLmxlbmd0aDtOKyspVFtOXT1hcmd1bWVudHNbTl07Zm9yKHZhciB4PTAsTD1UO3g8TC5sZW5ndGg7eCsrKXt2YXIgUz1MW3hdO2lmKEFycmF5LmlzQXJyYXkoUykpZm9yKHZhciBrPTAsST1TO2s8SS5sZW5ndGg7aysrKXt2YXIgTT1JW2tdO3R5cGVvZiBNPT0ib2JqZWN0IiYmRC5wdXNoKE0pfX19LEE9ZnVuY3Rpb24oVCl7Zm9yKHZhciBOPVtdO1QuJHJlZjspe3ZhciB4PVQuJHJlZixMPXguc3BsaXQoIiMiLDIpO2lmKGRlbGV0ZSBULiRyZWYsTFswXS5sZW5ndGg+MCl7RS5wdXNoKGMoVCxMWzBdLExbMV0sbSxnKSk7cmV0dXJufWVsc2UgTi5pbmRleE9mKHgpPT09LTEmJihmKFQsZCxtLExbMV0pLE4ucHVzaCh4KSl9RihULml0ZW1zLFQuYWRkaXRpb25hbEl0ZW1zLFQuYWRkaXRpb25hbFByb3BlcnRpZXMsVC5ub3QsVC5jb250YWlucyxULnByb3BlcnR5TmFtZXMsVC5pZixULnRoZW4sVC5lbHNlKSx2KFQuZGVmaW5pdGlvbnMsVC5wcm9wZXJ0aWVzLFQucGF0dGVyblByb3BlcnRpZXMsVC5kZXBlbmRlbmNpZXMpLEMoVC5hbnlPZixULmFsbE9mLFQub25lT2YsVC5pdGVtcyl9O0QubGVuZ3RoOyl7dmFyIHc9RC5wb3AoKTtiLmluZGV4T2Yodyk+PTB8fChiLnB1c2godyksQSh3KSl9cmV0dXJuIHMucHJvbWlzZS5hbGwoRSl9O3JldHVybiBwKG8sbyxuLHIpLnRoZW4oZnVuY3Rpb24oaCl7cmV0dXJuIG5ldyBPbyhvLGkpfSl9LGUucHJvdG90eXBlLmdldFNjaGVtYUZvclJlc291cmNlPWZ1bmN0aW9uKHQsbil7aWYobiYmbi5yb290JiZuLnJvb3QudHlwZT09PSJvYmplY3QiKXt2YXIgcj1uLnJvb3QucHJvcGVydGllcy5maWx0ZXIoZnVuY3Rpb24oRCl7cmV0dXJuIEQua2V5Tm9kZS52YWx1ZT09PSIkc2NoZW1hIiYmRC52YWx1ZU5vZGUmJkQudmFsdWVOb2RlLnR5cGU9PT0ic3RyaW5nIn0pO2lmKHIubGVuZ3RoPjApe3ZhciBzPXJbMF0udmFsdWVOb2RlO2lmKHMmJnMudHlwZT09PSJzdHJpbmciKXt2YXIgaT1IYyhzKTtpZihpJiZndyhpLCIuIikmJnRoaXMuY29udGV4dFNlcnZpY2UmJihpPXRoaXMuY29udGV4dFNlcnZpY2UucmVzb2x2ZVJlbGF0aXZlUGF0aChpLHQpKSxpKXt2YXIgbz1OcyhpKTtyZXR1cm4gdGhpcy5nZXRPckFkZFNjaGVtYUhhbmRsZShvKS5nZXRSZXNvbHZlZFNjaGVtYSgpfX19fWlmKHRoaXMuY2FjaGVkU2NoZW1hRm9yUmVzb3VyY2UmJnRoaXMuY2FjaGVkU2NoZW1hRm9yUmVzb3VyY2UucmVzb3VyY2U9PT10KXJldHVybiB0aGlzLmNhY2hlZFNjaGVtYUZvclJlc291cmNlLnJlc29sdmVkU2NoZW1hO2Zvcih2YXIgYT1PYmplY3QuY3JlYXRlKG51bGwpLHU9W10sbD1DTyh0KSxmPTAsYz10aGlzLmZpbGVQYXR0ZXJuQXNzb2NpYXRpb25zO2Y8Yy5sZW5ndGg7ZisrKXt2YXIgcD1jW2ZdO2lmKHAubWF0Y2hlc1BhdHRlcm4obCkpZm9yKHZhciBoPTAsZD1wLmdldFVSSXMoKTtoPGQubGVuZ3RoO2grKyl7dmFyIG09ZFtoXTthW21dfHwodS5wdXNoKG0pLGFbbV09ITApfX12YXIgZz11Lmxlbmd0aD4wP3RoaXMuY3JlYXRlQ29tYmluZWRTY2hlbWEodCx1KS5nZXRSZXNvbHZlZFNjaGVtYSgpOnRoaXMucHJvbWlzZS5yZXNvbHZlKHZvaWQgMCk7cmV0dXJuIHRoaXMuY2FjaGVkU2NoZW1hRm9yUmVzb3VyY2U9e3Jlc291cmNlOnQscmVzb2x2ZWRTY2hlbWE6Z30sZ30sZS5wcm90b3R5cGUuY3JlYXRlQ29tYmluZWRTY2hlbWE9ZnVuY3Rpb24odCxuKXtpZihuLmxlbmd0aD09PTEpcmV0dXJuIHRoaXMuZ2V0T3JBZGRTY2hlbWFIYW5kbGUoblswXSk7dmFyIHI9InNjaGVtYXNlcnZpY2U6Ly9jb21iaW5lZFNjaGVtYS8iK2VuY29kZVVSSUNvbXBvbmVudCh0KSxzPXthbGxPZjpuLm1hcChmdW5jdGlvbihpKXtyZXR1cm57JHJlZjppfX0pfTtyZXR1cm4gdGhpcy5hZGRTY2hlbWFIYW5kbGUocixzKX0sZS5wcm90b3R5cGUuZ2V0TWF0Y2hpbmdTY2hlbWFzPWZ1bmN0aW9uKHQsbixyKXtpZihyKXt2YXIgcz1yLmlkfHwic2NoZW1hc2VydmljZTovL3VudGl0bGVkL21hdGNoaW5nU2NoZW1hcy8iK3dPKys7cmV0dXJuIHRoaXMucmVzb2x2ZVNjaGVtYUNvbnRlbnQobmV3IFRuKHIpLHMse30pLnRoZW4oZnVuY3Rpb24oaSl7cmV0dXJuIG4uZ2V0TWF0Y2hpbmdTY2hlbWFzKGkuc2NoZW1hKS5maWx0ZXIoZnVuY3Rpb24obyl7cmV0dXJuIW8uaW52ZXJ0ZWR9KX0pfXJldHVybiB0aGlzLmdldFNjaGVtYUZvclJlc291cmNlKHQudXJpLG4pLnRoZW4oZnVuY3Rpb24oaSl7cmV0dXJuIGk/bi5nZXRNYXRjaGluZ1NjaGVtYXMoaS5zY2hlbWEpLmZpbHRlcihmdW5jdGlvbihvKXtyZXR1cm4hby5pbnZlcnRlZH0pOltdfSl9LGV9KCksd089MDtmdW5jdGlvbiBOcyhlKXt0cnl7cmV0dXJuIHJ0LnBhcnNlKGUpLnRvU3RyaW5nKCl9Y2F0Y2h7cmV0dXJuIGV9fWZ1bmN0aW9uIENPKGUpe3RyeXtyZXR1cm4gcnQucGFyc2UoZSkud2l0aCh7ZnJhZ21lbnQ6bnVsbCxxdWVyeTpudWxsfSkudG9TdHJpbmcoKX1jYXRjaHtyZXR1cm4gZX19ZnVuY3Rpb24gSmMoZSl7dHJ5e3ZhciB0PXJ0LnBhcnNlKGUpO2lmKHQuc2NoZW1lPT09ImZpbGUiKXJldHVybiB0LmZzUGF0aH1jYXRjaHt9cmV0dXJuIGV9dmFyIHR0OyhmdW5jdGlvbihlKXtlLmRyYWZ0MDQ9ImRyYWZ0MDQiLGUuZHJhZnQwNz0iZHJhZnQwNyIsZS5kcmFmdDIwMTk9ImRyYWZ0MjAxOS0wOSIsZS5kcmFmdDIwMjA9ImRyYWZ0MjAyMC0xMiJ9KSh0dHx8KHR0PXt9KSk7ZnVuY3Rpb24gUm8oZSl7c3dpdGNoKGUudHlwZSl7Y2FzZSJhcnJheSI6cmV0dXJuIGUuY2hpbGRyZW4ubWFwKFJvKTtjYXNlIm9iamVjdCI6e2NvbnN0IHQ9T2JqZWN0LmNyZWF0ZShudWxsKTtmb3IobGV0IG49MCxyPWUuY2hpbGRyZW47bjxyLmxlbmd0aDtuKyspe2NvbnN0IHM9cltuXSxpPXMuY2hpbGRyZW5bMV07aSYmKHRbcy5jaGlsZHJlblswXS52YWx1ZV09Um8oaSkpfXJldHVybiB0fWNhc2UibnVsbCI6Y2FzZSJzdHJpbmciOmNhc2UibnVtYmVyIjpyZXR1cm4gZS52YWx1ZTtjYXNlImJvb2xlYW4iOnJldHVybiBlLnNvdXJjZTtkZWZhdWx0OnJldHVybn19ZnVuY3Rpb24gYncoZSx0LG49ITEpe3JldHVybiB0Pj1lLm9mZnNldCYmdDw9ZS5vZmZzZXQrZS5sZW5ndGh8fG4mJnQ9PT1lLm9mZnNldCtlLmxlbmd0aH1mdW5jdGlvbiBFdyhlLHQsbil7aWYobj09PXZvaWQgMCYmKG49ITEpLGJ3KGUsdCxuKSl7Y29uc3Qgcj1lLmNoaWxkcmVuO2lmKEFycmF5LmlzQXJyYXkocikpZm9yKGxldCBzPTA7czxyLmxlbmd0aCYmcltzXS5vZmZzZXQ8PXQ7cysrKXtjb25zdCBpPUV3KHJbc10sdCxuKTtpZihpKXJldHVybiBpfXJldHVybiBlfX1mdW5jdGlvbiBTTyhlKXtpZihbInRydWUiLCJUcnVlIiwiVFJVRSIsInkiLCJZIiwieWVzIiwiWWVzIiwiWUVTIiwib24iLCJPbiIsIk9OIl0ubGFzdEluZGV4T2YoZSk+PTApcmV0dXJuITA7aWYoWyJmYWxzZSIsIkZhbHNlIiwiRkFMU0UiLCJuIiwiTiIsIm5vIiwiTm8iLCJOTyIsIm9mZiIsIk9mZiIsIk9GRiJdLmxhc3RJbmRleE9mKGUpPj0wKXJldHVybiExO3Rocm93YEludmFsaWQgYm9vbGVhbiAiJHtlfSJgfWZ1bmN0aW9uIGR1KGUsdCxuKXtpZihuPT09ImJvb2xlYW4iJiZ0eXBlb2YgZT09InN0cmluZyImJihlPVNPKGUpKSxlPT09dClyZXR1cm4hMDtpZihlPT1udWxsfHx0PT09bnVsbHx8dD09PXZvaWQgMHx8dHlwZW9mIGUhPXR5cGVvZiB0fHx0eXBlb2YgZSE9Im9iamVjdCJ8fEFycmF5LmlzQXJyYXkoZSkhPT1BcnJheS5pc0FycmF5KHQpKXJldHVybiExO2xldCByLHM7aWYoQXJyYXkuaXNBcnJheShlKSl7aWYoZS5sZW5ndGghPT10Lmxlbmd0aClyZXR1cm4hMTtmb3Iocj0wO3I8ZS5sZW5ndGg7cisrKWlmKCFkdShlW3JdLHRbcl0pKXJldHVybiExfWVsc2V7Y29uc3QgaT1bXTtmb3IocyBpbiBlKWkucHVzaChzKTtpLnNvcnQoKTtjb25zdCBvPVtdO2ZvcihzIGluIHQpby5wdXNoKHMpO2lmKG8uc29ydCgpLCFkdShpLG8pKXJldHVybiExO2ZvcihyPTA7cjxpLmxlbmd0aDtyKyspaWYoIWR1KGVbaVtyXV0sdFtpW3JdXSkpcmV0dXJuITF9cmV0dXJuITB9ZnVuY3Rpb24gS2UoZSl7cmV0dXJuIHR5cGVvZiBlPT0ibnVtYmVyIn1mdW5jdGlvbiBVcihlKXtyZXR1cm4gdHlwZW9mIGU8InUifWZ1bmN0aW9uIGpvKGUpe3JldHVybiB0eXBlb2YgZT09ImJvb2xlYW4ifWZ1bmN0aW9uIHpjKGUpe3JldHVybiB0eXBlb2YgZT09InN0cmluZyJ9ZnVuY3Rpb24gdncoZSl7cmV0dXJuIFN5bWJvbC5pdGVyYXRvciBpbiBPYmplY3QoZSl9ZnVuY3Rpb24gT20oZSl7Y29uc3QgdD1lLnR5cGUmJmUuY2xvc2VzdFRpdGxlO3JldHVybiBlLnRpdGxlP2UudGl0bGU6ZS4kaWQ/RncoZS4kaWQpOmUuJHJlZnx8ZS5fJHJlZj9GdyhlLiRyZWZ8fGUuXyRyZWYpOkFycmF5LmlzQXJyYXkoZS50eXBlKT9lLnR5cGUuam9pbigiIHwgIik6dD9lLnR5cGUuY29uY2F0KCIoIixlLmNsb3Nlc3RUaXRsZSwiKSIpOmUudHlwZXx8ZS5jbG9zZXN0VGl0bGV9ZnVuY3Rpb24gRncoZSl7Y29uc3QgdD1lLm1hdGNoKC9eKD86LipcLyk/KC4qPykoPzpcLnNjaGVtYVwuanNvbik/JC8pO2xldCBuPSEhdCYmdFsxXTtyZXR1cm4gbnx8KG49InR5cGVOb3RGb3VuZCIsY29uc29sZS5lcnJvcihgJHJlZiAoJHtlfSkgbm90IHBhcnNlZCBwcm9wZXJseWApKSxufWZ1bmN0aW9uIHhPKGUsdCl7Y29uc3Qgbj1ydC5wYXJzZSh0KTtsZXQgcj1abi5iYXNlbmFtZShuLmZzUGF0aCk7cmV0dXJuIFpuLmV4dG5hbWUobi5mc1BhdGgpfHwocis9Ii5qc29uIiksT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCJuYW1lIik/T2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcihlLCJuYW1lIikudmFsdWUrYCAoJHtyfSlgOmUudGl0bGU/ZS5kZXNjcmlwdGlvbj9lLnRpdGxlKyIgLSAiK2UuZGVzY3JpcHRpb24rYCAoJHtyfSlgOmUudGl0bGUrYCAoJHtyfSlgOnJ9ZnVuY3Rpb24ga08oZSl7cmV0dXJuIGUudHlwZSE9PSJvYmplY3QiJiYhUm0oZSl9ZnVuY3Rpb24gUm0oZSl7cmV0dXJuISEoZS5hbnlPZnx8ZS5hbGxPZnx8ZS5vbmVPZil9ZnVuY3Rpb24gbXUoZSx0KXtmb3IoY29uc3QgbiBvZiB0LmRvY3VtZW50cylpZihuLmludGVybmFsRG9jdW1lbnQmJm4uaW50ZXJuYWxEb2N1bWVudC5yYW5nZVswXTw9ZSYmbi5pbnRlcm5hbERvY3VtZW50LnJhbmdlWzJdPj1lKXJldHVybiBuO3JldHVybiB0LmRvY3VtZW50cy5sZW5ndGg9PT0xP3QuZG9jdW1lbnRzWzBdOm51bGx9ZnVuY3Rpb24gQXcoZSl7Y29uc3QgdD1bIm1hcHBpbmciLCJzY2FsYXIiLCJzZXF1ZW5jZSJdO3JldHVybiBlP2UuZmlsdGVyKG49PntpZih0eXBlb2Ygbj09InN0cmluZyIpe2NvbnN0IHI9bi5zcGxpdCgiICIpLHM9clsxXSYmclsxXS50b0xvd2VyQ2FzZSgpfHwic2NhbGFyIjtyZXR1cm4gcz09PSJtYXAiPyExOnQuaW5kZXhPZihzKSE9PS0xfXJldHVybiExfSk6W119ZnVuY3Rpb24gd3coZSx0KXtpZighdHx8IWV8fHQubGVuZ3RoIT09ZS5sZW5ndGgpcmV0dXJuITE7Zm9yKGxldCBuPWUubGVuZ3RoLTE7bj49MDtuLS0paWYoZVtuXSE9PXRbbl0pcmV0dXJuITE7cmV0dXJuITB9ZnVuY3Rpb24gVE8oZSl7cmV0dXJuIGUucmVwbGFjZSgvWy1cXHt9Kz98XiQuLFtcXSgpI1xzXS9nLCJcXCQmIikucmVwbGFjZSgvWypdL2csIi4qIil9ZnVuY3Rpb24gTk8oZSx0KXtpZihlLmxlbmd0aDx0KXJldHVybiAwO2ZvcihsZXQgbj0wO248dDtuKyspe2NvbnN0IHI9ZS5jaGFyQ29kZUF0KG4pO2lmKHIhPT0zMiYmciE9PTkpcmV0dXJuIG59cmV0dXJuIHR9ZnVuY3Rpb24gQ3coZSl7bGV0IHQ9IiI7ZT1lLnJlcGxhY2UoL1woXD8oW2ltc10rKVwpL2csKG4scik9Pntmb3IoY29uc3QgcyBvZiByKXQuaW5jbHVkZXMocyl8fCh0Kz1zKTtyZXR1cm4iIn0pO3RyeXtyZXR1cm4gbmV3IFJlZ0V4cChlLHQrInUiKX1jYXRjaHt0cnl7cmV0dXJuIG5ldyBSZWdFeHAoZSx0KX1jYXRjaHtyZXR1cm59fX1mdW5jdGlvbiBMTyhlLHQpe3QrKztmb3IobGV0IG49dDtuPGUubGVuZ3RoO24rKyl7Y29uc3Qgcj1lLmNoYXJBdChuKTtpZihyPT09IiAifHxyPT09IgkiKXQrKztlbHNlIHJldHVybiB0fXJldHVybiB0fXZhciAkTz1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0cnl7dGhpcy5wYXR0ZXJuUmVnRXhwPW5ldyBSZWdFeHAoVE8oZSkrIiQiKX1jYXRjaHt0aGlzLnBhdHRlcm5SZWdFeHA9bnVsbH10aGlzLnNjaGVtYXM9W119YWRkU2NoZW1hKGUpe3RoaXMuc2NoZW1hcy5wdXNoKGUpfW1hdGNoZXNQYXR0ZXJuKGUpe3JldHVybiB0aGlzLnBhdHRlcm5SZWdFeHAmJnRoaXMucGF0dGVyblJlZ0V4cC50ZXN0KGUpfWdldFNjaGVtYXMoKXtyZXR1cm4gdGhpcy5zY2hlbWFzfX07ZnVuY3Rpb24gQk8oZSx0KXtjb25zdCBuPShlLnRvU3RyaW5nKCkuc3BsaXQoIi4iKVsxXXx8IiIpLmxlbmd0aCxyPSh0LnRvU3RyaW5nKCkuc3BsaXQoIi4iKVsxXXx8IiIpLmxlbmd0aCxzPU1hdGgubWF4KG4sciksaT1wYXJzZUludChlLnRvRml4ZWQocykucmVwbGFjZSgiLiIsIiIpKSxvPXBhcnNlSW50KHQudG9GaXhlZChzKS5yZXBsYWNlKCIuIiwiIikpO3JldHVybiBpJW8vTWF0aC5wb3coMTAscyl9dmFyIF9PPU1tKCksSU89ZnVuY3Rpb24oKXtmdW5jdGlvbiBlKHQsbil7dGhpcy5qc29uU2NoZW1hU2VydmljZT10LHRoaXMucHJvbWlzZT1uLHRoaXMudmFsaWRhdGlvbkVuYWJsZWQ9ITB9cmV0dXJuIGUucHJvdG90eXBlLmNvbmZpZ3VyZT1mdW5jdGlvbih0KXt0JiYodGhpcy52YWxpZGF0aW9uRW5hYmxlZD10LnZhbGlkYXRlIT09ITEsdGhpcy5jb21tZW50U2V2ZXJpdHk9dC5hbGxvd0NvbW1lbnRzP3ZvaWQgMDpRLkVycm9yKX0sZS5wcm90b3R5cGUuZG9WYWxpZGF0aW9uPWZ1bmN0aW9uKHQsbixyLHMpe3ZhciBpPXRoaXM7aWYoIXRoaXMudmFsaWRhdGlvbkVuYWJsZWQpcmV0dXJuIHRoaXMucHJvbWlzZS5yZXNvbHZlKFtdKTt2YXIgbz1bXSxhPXt9LHU9ZnVuY3Rpb24oYyl7dmFyIHA9Yy5yYW5nZS5zdGFydC5saW5lKyIgIitjLnJhbmdlLnN0YXJ0LmNoYXJhY3RlcisiICIrYy5tZXNzYWdlO2FbcF18fChhW3BdPSEwLG8ucHVzaChjKSl9LGw9ZnVuY3Rpb24oYyl7dmFyIHA9ciE9bnVsbCYmci50cmFpbGluZ0NvbW1hcz9HYyhyLnRyYWlsaW5nQ29tbWFzKTpRLkVycm9yLGg9ciE9bnVsbCYmci5jb21tZW50cz9HYyhyLmNvbW1lbnRzKTppLmNvbW1lbnRTZXZlcml0eSxkPXIhPW51bGwmJnIuc2NoZW1hVmFsaWRhdGlvbj9HYyhyLnNjaGVtYVZhbGlkYXRpb24pOlEuV2FybmluZyxtPXIhPW51bGwmJnIuc2NoZW1hUmVxdWVzdD9HYyhyLnNjaGVtYVJlcXVlc3QpOlEuV2FybmluZztpZihjKXtpZihjLmVycm9ycy5sZW5ndGgmJm4ucm9vdCYmbSl7dmFyIGc9bi5yb290LEQ9Zy50eXBlPT09Im9iamVjdCI/Zy5wcm9wZXJ0aWVzWzBdOnZvaWQgMDtpZihEJiZELmtleU5vZGUudmFsdWU9PT0iJHNjaGVtYSIpe3ZhciBiPUQudmFsdWVOb2RlfHxELEU9WS5jcmVhdGUodC5wb3NpdGlvbkF0KGIub2Zmc2V0KSx0LnBvc2l0aW9uQXQoYi5vZmZzZXQrYi5sZW5ndGgpKTt1KFB0LmNyZWF0ZShFLGMuZXJyb3JzWzBdLG0sQXQuU2NoZW1hUmVzb2x2ZUVycm9yKSl9ZWxzZXt2YXIgRT1ZLmNyZWF0ZSh0LnBvc2l0aW9uQXQoZy5vZmZzZXQpLHQucG9zaXRpb25BdChnLm9mZnNldCsxKSk7dShQdC5jcmVhdGUoRSxjLmVycm9yc1swXSxtLEF0LlNjaGVtYVJlc29sdmVFcnJvcikpfX1lbHNlIGlmKGQpe3ZhciBGPW4udmFsaWRhdGUodCxjLnNjaGVtYSxkKTtGJiZGLmZvckVhY2godSl9U3coYy5zY2hlbWEpJiYoaD12b2lkIDApLHh3KGMuc2NoZW1hKSYmKHA9dm9pZCAwKX1mb3IodmFyIHY9MCxDPW4uc3ludGF4RXJyb3JzO3Y8Qy5sZW5ndGg7disrKXt2YXIgQT1DW3ZdO2lmKEEuY29kZT09PUF0LlRyYWlsaW5nQ29tbWEpe2lmKHR5cGVvZiBwIT0ibnVtYmVyIiljb250aW51ZTtBLnNldmVyaXR5PXB9dShBKX1pZih0eXBlb2YgaD09Im51bWJlciIpe3ZhciB3PV9PKCJJbnZhbGlkQ29tbWVudFRva2VuIiwiQ29tbWVudHMgYXJlIG5vdCBwZXJtaXR0ZWQgaW4gSlNPTi4iKTtuLmNvbW1lbnRzLmZvckVhY2goZnVuY3Rpb24oVCl7dShQdC5jcmVhdGUoVCx3LGgsQXQuQ29tbWVudE5vdFBlcm1pdHRlZCkpfSl9cmV0dXJuIG99O2lmKHMpe3ZhciBmPXMuaWR8fCJzY2hlbWFzZXJ2aWNlOi8vdW50aXRsZWQvIitQTysrO3JldHVybiB0aGlzLmpzb25TY2hlbWFTZXJ2aWNlLnJlc29sdmVTY2hlbWFDb250ZW50KG5ldyBUbihzKSxmLHt9KS50aGVuKGZ1bmN0aW9uKGMpe3JldHVybiBsKGMpfSl9cmV0dXJuIHRoaXMuanNvblNjaGVtYVNlcnZpY2UuZ2V0U2NoZW1hRm9yUmVzb3VyY2UodC51cmksbikudGhlbihmdW5jdGlvbihjKXtyZXR1cm4gbChjKX0pfSxlfSgpLFBPPTA7ZnVuY3Rpb24gU3coZSl7aWYoZSYmdHlwZW9mIGU9PSJvYmplY3QiKXtpZihNbyhlLmFsbG93Q29tbWVudHMpKXJldHVybiBlLmFsbG93Q29tbWVudHM7aWYoZS5hbGxPZilmb3IodmFyIHQ9MCxuPWUuYWxsT2Y7dDxuLmxlbmd0aDt0Kyspe3ZhciByPW5bdF0scz1TdyhyKTtpZihNbyhzKSlyZXR1cm4gc319fWZ1bmN0aW9uIHh3KGUpe2lmKGUmJnR5cGVvZiBlPT0ib2JqZWN0Iil7aWYoTW8oZS5hbGxvd1RyYWlsaW5nQ29tbWFzKSlyZXR1cm4gZS5hbGxvd1RyYWlsaW5nQ29tbWFzO3ZhciB0PWU7aWYoTW8odC5hbGxvd3NUcmFpbGluZ0NvbW1hcykpcmV0dXJuIHQuYWxsb3dzVHJhaWxpbmdDb21tYXM7aWYoZS5hbGxPZilmb3IodmFyIG49MCxyPWUuYWxsT2Y7bjxyLmxlbmd0aDtuKyspe3ZhciBzPXJbbl0saT14dyhzKTtpZihNbyhpKSlyZXR1cm4gaX19fWZ1bmN0aW9uIEdjKGUpe3N3aXRjaChlKXtjYXNlImVycm9yIjpyZXR1cm4gUS5FcnJvcjtjYXNlIndhcm5pbmciOnJldHVybiBRLldhcm5pbmc7Y2FzZSJpZ25vcmUiOnJldHVybn19dmFyIGt3PTQ4LE1PPTU3LE9PPTY1LEtjPTk3LFJPPTEwMjtmdW5jdGlvbiBYZShlKXtyZXR1cm4gZTxrdz8wOmU8PU1PP2Uta3c6KGU8S2MmJihlKz1LYy1PTyksZT49S2MmJmU8PVJPP2UtS2MrMTA6MCl9ZnVuY3Rpb24gak8oZSl7aWYoZVswXT09PSIjIilzd2l0Y2goZS5sZW5ndGgpe2Nhc2UgNDpyZXR1cm57cmVkOlhlKGUuY2hhckNvZGVBdCgxKSkqMTcvMjU1LGdyZWVuOlhlKGUuY2hhckNvZGVBdCgyKSkqMTcvMjU1LGJsdWU6WGUoZS5jaGFyQ29kZUF0KDMpKSoxNy8yNTUsYWxwaGE6MX07Y2FzZSA1OnJldHVybntyZWQ6WGUoZS5jaGFyQ29kZUF0KDEpKSoxNy8yNTUsZ3JlZW46WGUoZS5jaGFyQ29kZUF0KDIpKSoxNy8yNTUsYmx1ZTpYZShlLmNoYXJDb2RlQXQoMykpKjE3LzI1NSxhbHBoYTpYZShlLmNoYXJDb2RlQXQoNCkpKjE3LzI1NX07Y2FzZSA3OnJldHVybntyZWQ6KFhlKGUuY2hhckNvZGVBdCgxKSkqMTYrWGUoZS5jaGFyQ29kZUF0KDIpKSkvMjU1LGdyZWVuOihYZShlLmNoYXJDb2RlQXQoMykpKjE2K1hlKGUuY2hhckNvZGVBdCg0KSkpLzI1NSxibHVlOihYZShlLmNoYXJDb2RlQXQoNSkpKjE2K1hlKGUuY2hhckNvZGVBdCg2KSkpLzI1NSxhbHBoYToxfTtjYXNlIDk6cmV0dXJue3JlZDooWGUoZS5jaGFyQ29kZUF0KDEpKSoxNitYZShlLmNoYXJDb2RlQXQoMikpKS8yNTUsZ3JlZW46KFhlKGUuY2hhckNvZGVBdCgzKSkqMTYrWGUoZS5jaGFyQ29kZUF0KDQpKSkvMjU1LGJsdWU6KFhlKGUuY2hhckNvZGVBdCg1KSkqMTYrWGUoZS5jaGFyQ29kZUF0KDYpKSkvMjU1LGFscGhhOihYZShlLmNoYXJDb2RlQXQoNykpKjE2K1hlKGUuY2hhckNvZGVBdCg4KSkpLzI1NX19fXZhciBWTz1mdW5jdGlvbigpe2Z1bmN0aW9uIGUodCl7dGhpcy5zY2hlbWFTZXJ2aWNlPXR9cmV0dXJuIGUucHJvdG90eXBlLmZpbmREb2N1bWVudFN5bWJvbHM9ZnVuY3Rpb24odCxuLHIpe3ZhciBzPXRoaXM7cj09PXZvaWQgMCYmKHI9e3Jlc3VsdExpbWl0Ok51bWJlci5NQVhfVkFMVUV9KTt2YXIgaT1uLnJvb3Q7aWYoIWkpcmV0dXJuW107dmFyIG89ci5yZXN1bHRMaW1pdHx8TnVtYmVyLk1BWF9WQUxVRSxhPXQudXJpO2lmKChhPT09InZzY29kZTovL2RlZmF1bHRzZXR0aW5ncy9rZXliaW5kaW5ncy5qc29uInx8UG0oYS50b0xvd2VyQ2FzZSgpLCIvdXNlci9rZXliaW5kaW5ncy5qc29uIikpJiZpLnR5cGU9PT0iYXJyYXkiKXtmb3IodmFyIHU9W10sbD0wLGY9aS5pdGVtcztsPGYubGVuZ3RoO2wrKyl7dmFyIGM9ZltsXTtpZihjLnR5cGU9PT0ib2JqZWN0Iilmb3IodmFyIHA9MCxoPWMucHJvcGVydGllcztwPGgubGVuZ3RoO3ArKyl7dmFyIGQ9aFtwXTtpZihkLmtleU5vZGUudmFsdWU9PT0ia2V5IiYmZC52YWx1ZU5vZGUpe3ZhciBtPVVpLmNyZWF0ZSh0LnVyaSxMcyh0LGMpKTtpZih1LnB1c2goe25hbWU6SGMoZC52YWx1ZU5vZGUpLGtpbmQ6WW4uRnVuY3Rpb24sbG9jYXRpb246bX0pLG8tLSxvPD0wKXJldHVybiByJiZyLm9uUmVzdWx0TGltaXRFeGNlZWRlZCYmci5vblJlc3VsdExpbWl0RXhjZWVkZWQoYSksdX19fXJldHVybiB1fWZvcih2YXIgZz1be25vZGU6aSxjb250YWluZXJOYW1lOiIifV0sRD0wLGI9ITEsRT1bXSxGPWZ1bmN0aW9uKEMsQSl7Qy50eXBlPT09ImFycmF5Ij9DLml0ZW1zLmZvckVhY2goZnVuY3Rpb24odyl7dyYmZy5wdXNoKHtub2RlOncsY29udGFpbmVyTmFtZTpBfSl9KTpDLnR5cGU9PT0ib2JqZWN0IiYmQy5wcm9wZXJ0aWVzLmZvckVhY2goZnVuY3Rpb24odyl7dmFyIFQ9dy52YWx1ZU5vZGU7aWYoVClpZihvPjApe28tLTt2YXIgTj1VaS5jcmVhdGUodC51cmksTHModCx3KSkseD1BP0ErIi4iK3cua2V5Tm9kZS52YWx1ZTp3LmtleU5vZGUudmFsdWU7RS5wdXNoKHtuYW1lOnMuZ2V0S2V5TGFiZWwodyksa2luZDpzLmdldFN5bWJvbEtpbmQoVC50eXBlKSxsb2NhdGlvbjpOLGNvbnRhaW5lck5hbWU6QX0pLGcucHVzaCh7bm9kZTpULGNvbnRhaW5lck5hbWU6eH0pfWVsc2UgYj0hMH0pfTtEPGcubGVuZ3RoOyl7dmFyIHY9Z1tEKytdO0Yodi5ub2RlLHYuY29udGFpbmVyTmFtZSl9cmV0dXJuIGImJnImJnIub25SZXN1bHRMaW1pdEV4Y2VlZGVkJiZyLm9uUmVzdWx0TGltaXRFeGNlZWRlZChhKSxFfSxlLnByb3RvdHlwZS5maW5kRG9jdW1lbnRTeW1ib2xzMj1mdW5jdGlvbih0LG4scil7dmFyIHM9dGhpcztyPT09dm9pZCAwJiYocj17cmVzdWx0TGltaXQ6TnVtYmVyLk1BWF9WQUxVRX0pO3ZhciBpPW4ucm9vdDtpZighaSlyZXR1cm5bXTt2YXIgbz1yLnJlc3VsdExpbWl0fHxOdW1iZXIuTUFYX1ZBTFVFLGE9dC51cmk7aWYoKGE9PT0idnNjb2RlOi8vZGVmYXVsdHNldHRpbmdzL2tleWJpbmRpbmdzLmpzb24ifHxQbShhLnRvTG93ZXJDYXNlKCksIi91c2VyL2tleWJpbmRpbmdzLmpzb24iKSkmJmkudHlwZT09PSJhcnJheSIpe2Zvcih2YXIgdT1bXSxsPTAsZj1pLml0ZW1zO2w8Zi5sZW5ndGg7bCsrKXt2YXIgYz1mW2xdO2lmKGMudHlwZT09PSJvYmplY3QiKWZvcih2YXIgcD0wLGg9Yy5wcm9wZXJ0aWVzO3A8aC5sZW5ndGg7cCsrKXt2YXIgZD1oW3BdO2lmKGQua2V5Tm9kZS52YWx1ZT09PSJrZXkiJiZkLnZhbHVlTm9kZSl7dmFyIG09THModCxjKSxnPUxzKHQsZC5rZXlOb2RlKTtpZih1LnB1c2goe25hbWU6SGMoZC52YWx1ZU5vZGUpLGtpbmQ6WW4uRnVuY3Rpb24scmFuZ2U6bSxzZWxlY3Rpb25SYW5nZTpnfSksby0tLG88PTApcmV0dXJuIHImJnIub25SZXN1bHRMaW1pdEV4Y2VlZGVkJiZyLm9uUmVzdWx0TGltaXRFeGNlZWRlZChhKSx1fX19cmV0dXJuIHV9Zm9yKHZhciBEPVtdLGI9W3tub2RlOmkscmVzdWx0OkR9XSxFPTAsRj0hMSx2PWZ1bmN0aW9uKEEsdyl7QS50eXBlPT09ImFycmF5Ij9BLml0ZW1zLmZvckVhY2goZnVuY3Rpb24oVCxOKXtpZihUKWlmKG8+MCl7by0tO3ZhciB4PUxzKHQsVCksTD14LFM9U3RyaW5nKE4pLGs9e25hbWU6UyxraW5kOnMuZ2V0U3ltYm9sS2luZChULnR5cGUpLHJhbmdlOngsc2VsZWN0aW9uUmFuZ2U6TCxjaGlsZHJlbjpbXX07dy5wdXNoKGspLGIucHVzaCh7cmVzdWx0OmsuY2hpbGRyZW4sbm9kZTpUfSl9ZWxzZSBGPSEwfSk6QS50eXBlPT09Im9iamVjdCImJkEucHJvcGVydGllcy5mb3JFYWNoKGZ1bmN0aW9uKFQpe3ZhciBOPVQudmFsdWVOb2RlO2lmKE4paWYobz4wKXtvLS07dmFyIHg9THModCxUKSxMPUxzKHQsVC5rZXlOb2RlKSxTPVtdLGs9e25hbWU6cy5nZXRLZXlMYWJlbChUKSxraW5kOnMuZ2V0U3ltYm9sS2luZChOLnR5cGUpLHJhbmdlOngsc2VsZWN0aW9uUmFuZ2U6TCxjaGlsZHJlbjpTLGRldGFpbDpzLmdldERldGFpbChOKX07dy5wdXNoKGspLGIucHVzaCh7cmVzdWx0OlMsbm9kZTpOfSl9ZWxzZSBGPSEwfSl9O0U8Yi5sZW5ndGg7KXt2YXIgQz1iW0UrK107dihDLm5vZGUsQy5yZXN1bHQpfXJldHVybiBGJiZyJiZyLm9uUmVzdWx0TGltaXRFeGNlZWRlZCYmci5vblJlc3VsdExpbWl0RXhjZWVkZWQoYSksRH0sZS5wcm90b3R5cGUuZ2V0U3ltYm9sS2luZD1mdW5jdGlvbih0KXtzd2l0Y2godCl7Y2FzZSJvYmplY3QiOnJldHVybiBZbi5Nb2R1bGU7Y2FzZSJzdHJpbmciOnJldHVybiBZbi5TdHJpbmc7Y2FzZSJudW1iZXIiOnJldHVybiBZbi5OdW1iZXI7Y2FzZSJhcnJheSI6cmV0dXJuIFluLkFycmF5O2Nhc2UiYm9vbGVhbiI6cmV0dXJuIFluLkJvb2xlYW47ZGVmYXVsdDpyZXR1cm4gWW4uVmFyaWFibGV9fSxlLnByb3RvdHlwZS5nZXRLZXlMYWJlbD1mdW5jdGlvbih0KXt2YXIgbj10LmtleU5vZGUudmFsdWU7cmV0dXJuIG4mJihuPW4ucmVwbGFjZSgvW1xuXS9nLCLihrUiKSksbiYmbi50cmltKCk/bjonIicrbisnIid9LGUucHJvdG90eXBlLmdldERldGFpbD1mdW5jdGlvbih0KXtpZih0KXtpZih0LnR5cGU9PT0iYm9vbGVhbiJ8fHQudHlwZT09PSJudW1iZXIifHx0LnR5cGU9PT0ibnVsbCJ8fHQudHlwZT09PSJzdHJpbmciKXJldHVybiBTdHJpbmcodC52YWx1ZSk7aWYodC50eXBlPT09ImFycmF5IilyZXR1cm4gdC5jaGlsZHJlbi5sZW5ndGg/dm9pZCAwOiJbXSI7aWYodC50eXBlPT09Im9iamVjdCIpcmV0dXJuIHQuY2hpbGRyZW4ubGVuZ3RoP3ZvaWQgMDoie30ifX0sZS5wcm90b3R5cGUuZmluZERvY3VtZW50Q29sb3JzPWZ1bmN0aW9uKHQsbixyKXtyZXR1cm4gdGhpcy5zY2hlbWFTZXJ2aWNlLmdldFNjaGVtYUZvclJlc291cmNlKHQudXJpLG4pLnRoZW4oZnVuY3Rpb24ocyl7dmFyIGk9W107aWYocylmb3IodmFyIG89ciYmdHlwZW9mIHIucmVzdWx0TGltaXQ9PSJudW1iZXIiP3IucmVzdWx0TGltaXQ6TnVtYmVyLk1BWF9WQUxVRSxhPW4uZ2V0TWF0Y2hpbmdTY2hlbWFzKHMuc2NoZW1hKSx1PXt9LGw9MCxmPWE7bDxmLmxlbmd0aDtsKyspe3ZhciBjPWZbbF07aWYoIWMuaW52ZXJ0ZWQmJmMuc2NoZW1hJiYoYy5zY2hlbWEuZm9ybWF0PT09ImNvbG9yInx8Yy5zY2hlbWEuZm9ybWF0PT09ImNvbG9yLWhleCIpJiZjLm5vZGUmJmMubm9kZS50eXBlPT09InN0cmluZyIpe3ZhciBwPVN0cmluZyhjLm5vZGUub2Zmc2V0KTtpZighdVtwXSl7dmFyIGg9ak8oSGMoYy5ub2RlKSk7aWYoaCl7dmFyIGQ9THModCxjLm5vZGUpO2kucHVzaCh7Y29sb3I6aCxyYW5nZTpkfSl9aWYodVtwXT0hMCxvLS0sbzw9MClyZXR1cm4gciYmci5vblJlc3VsdExpbWl0RXhjZWVkZWQmJnIub25SZXN1bHRMaW1pdEV4Y2VlZGVkKHQudXJpKSxpfX19cmV0dXJuIGl9KX0sZS5wcm90b3R5cGUuZ2V0Q29sb3JQcmVzZW50YXRpb25zPWZ1bmN0aW9uKHQsbixyLHMpe3ZhciBpPVtdLG89TWF0aC5yb3VuZChyLnJlZCoyNTUpLGE9TWF0aC5yb3VuZChyLmdyZWVuKjI1NSksdT1NYXRoLnJvdW5kKHIuYmx1ZSoyNTUpO2Z1bmN0aW9uIGwoYyl7dmFyIHA9Yy50b1N0cmluZygxNik7cmV0dXJuIHAubGVuZ3RoIT09Mj8iMCIrcDpwfXZhciBmO3JldHVybiByLmFscGhhPT09MT9mPSIjIitsKG8pK2woYSkrbCh1KTpmPSIjIitsKG8pK2woYSkrbCh1KStsKE1hdGgucm91bmQoci5hbHBoYSoyNTUpKSxpLnB1c2goe2xhYmVsOmYsdGV4dEVkaXQ6RGUucmVwbGFjZShzLEpTT04uc3RyaW5naWZ5KGYpKX0pLGl9LGV9KCk7ZnVuY3Rpb24gTHMoZSx0KXtyZXR1cm4gWS5jcmVhdGUoZS5wb3NpdGlvbkF0KHQub2Zmc2V0KSxlLnBvc2l0aW9uQXQodC5vZmZzZXQrdC5sZW5ndGgpKX1mdW5jdGlvbiBVTyhlLHQpe3ZhciBuPVtdO3JldHVybiB0LnZpc2l0KGZ1bmN0aW9uKHIpe3ZhciBzO2lmKHIudHlwZT09PSJwcm9wZXJ0eSImJnIua2V5Tm9kZS52YWx1ZT09PSIkcmVmIiYmKChzPXIudmFsdWVOb2RlKT09PW51bGx8fHM9PT12b2lkIDA/dm9pZCAwOnMudHlwZSk9PT0ic3RyaW5nIil7dmFyIGk9ci52YWx1ZU5vZGUudmFsdWUsbz1XTyh0LGkpO2lmKG8pe3ZhciBhPWUucG9zaXRpb25BdChvLm9mZnNldCk7bi5wdXNoKHt0YXJnZXQ6ZS51cmkrIiMiKyhhLmxpbmUrMSkrIiwiKyhhLmNoYXJhY3RlcisxKSxyYW5nZTpxTyhlLHIudmFsdWVOb2RlKX0pfX1yZXR1cm4hMH0pLFByb21pc2UucmVzb2x2ZShuKX1mdW5jdGlvbiBxTyhlLHQpe3JldHVybiBZLmNyZWF0ZShlLnBvc2l0aW9uQXQodC5vZmZzZXQrMSksZS5wb3NpdGlvbkF0KHQub2Zmc2V0K3QubGVuZ3RoLTEpKX1mdW5jdGlvbiBXTyhlLHQpe3ZhciBuPUhPKHQpO3JldHVybiBuP2ptKG4sZS5yb290KTpudWxsfWZ1bmN0aW9uIGptKGUsdCl7aWYoIXQpcmV0dXJuIG51bGw7aWYoZS5sZW5ndGg9PT0wKXJldHVybiB0O3ZhciBuPWUuc2hpZnQoKTtpZih0JiZ0LnR5cGU9PT0ib2JqZWN0Iil7dmFyIHI9dC5wcm9wZXJ0aWVzLmZpbmQoZnVuY3Rpb24obyl7cmV0dXJuIG8ua2V5Tm9kZS52YWx1ZT09PW59KTtyZXR1cm4gcj9qbShlLHIudmFsdWVOb2RlKTpudWxsfWVsc2UgaWYodCYmdC50eXBlPT09ImFycmF5IiYmbi5tYXRjaCgvXigwfFsxLTldWzAtOV0qKSQvKSl7dmFyIHM9TnVtYmVyLnBhcnNlSW50KG4pLGk9dC5pdGVtc1tzXTtyZXR1cm4gaT9qbShlLGkpOm51bGx9cmV0dXJuIG51bGx9ZnVuY3Rpb24gSE8oZSl7cmV0dXJuIGU9PT0iIyI/W106ZVswXSE9PSIjInx8ZVsxXSE9PSIvIj9udWxsOmUuc3Vic3RyaW5nKDIpLnNwbGl0KC9cLy8pLm1hcChKTyl9ZnVuY3Rpb24gSk8oZSl7cmV0dXJuIGUucmVwbGFjZSgvfjEvZywiLyIpLnJlcGxhY2UoL34wL2csIn4iKX12YXIgWGM9IllBTUwiLFR3PSJ5YW1sLXNjaGVtYTogIixMdDsoZnVuY3Rpb24oZSl7ZS5taXNzaW5nUmVxdWlyZWRQcm9wV2FybmluZz0ibWlzc2luZ1JlcXVpcmVkUHJvcFdhcm5pbmciLGUudHlwZU1pc21hdGNoV2FybmluZz0idHlwZU1pc21hdGNoV2FybmluZyIsZS5jb25zdFdhcm5pbmc9ImNvbnN0V2FybmluZyJ9KShMdHx8KEx0PXt9KSk7dmFyIHpPPXtbTHQubWlzc2luZ1JlcXVpcmVkUHJvcFdhcm5pbmddOidNaXNzaW5nIHByb3BlcnR5ICJ7MH0iLicsW0x0LnR5cGVNaXNtYXRjaFdhcm5pbmddOidJbmNvcnJlY3QgdHlwZS4gRXhwZWN0ZWQgInswfSIuJyxbTHQuY29uc3RXYXJuaW5nXToiVmFsdWUgbXVzdCBiZSB7MH0uIn0sR089Y2xhc3MgYkN7Y29uc3RydWN0b3IodD0tMSxuPW51bGwpe3RoaXMuZm9jdXNPZmZzZXQ9dCx0aGlzLmV4Y2x1ZGU9bix0aGlzLnNjaGVtYXM9W119YWRkKHQpe3RoaXMuc2NoZW1hcy5wdXNoKHQpfW1lcmdlKHQpe3RoaXMuc2NoZW1hcy5wdXNoKC4uLnQuc2NoZW1hcyl9aW5jbHVkZSh0KXtyZXR1cm4odGhpcy5mb2N1c09mZnNldD09PS0xfHxidyh0LHRoaXMuZm9jdXNPZmZzZXQpKSYmdCE9PXRoaXMuZXhjbHVkZX1uZXdTdWIoKXtyZXR1cm4gbmV3IGJDKC0xLHRoaXMuZXhjbHVkZSl9fSxWbz1jbGFzc3tjb25zdHJ1Y3Rvcigpe31nZXQgc2NoZW1hcygpe3JldHVybltdfWFkZCgpe31tZXJnZSgpe31pbmNsdWRlKCl7cmV0dXJuITB9bmV3U3ViKCl7cmV0dXJuIHRoaXN9fTtWby5pbnN0YW5jZT1uZXcgVm87dmFyIEtPPXsiY29sb3ItaGV4Ijp7ZXJyb3JNZXNzYWdlOkooIkludmFsaWQgY29sb3IgZm9ybWF0LiBVc2UgI1JHQiwgI1JHQkEsICNSUkdHQkIgb3IgI1JSR0dCQkFBLiIpLHBhdHRlcm46L14jKFswLTlBLUZhLWZdezMsNH18KFswLTlBLUZhLWZdezJ9KXszLDR9KSQvfSwiZGF0ZS10aW1lIjp7ZXJyb3JNZXNzYWdlOkooIlN0cmluZyBpcyBub3QgYSBSRkMzMzM5IGRhdGUtdGltZS4iKSxwYXR0ZXJuOi9eKFxkezR9KS0oMFsxLTldfDFbMC0yXSktKDBbMS05XXxbMTJdWzAtOV18M1swMV0pVChbMDFdWzAtOV18MlswLTNdKTooWzAtNV1bMC05XSk6KFswLTVdWzAtOV18NjApKFwuWzAtOV0rKT8oWnwoXCt8LSkoWzAxXVswLTldfDJbMC0zXSk6KFswLTVdWzAtOV0pKSQvaX0sZGF0ZTp7ZXJyb3JNZXNzYWdlOkooIlN0cmluZyBpcyBub3QgYSBSRkMzMzM5IGRhdGUuIikscGF0dGVybjovXihcZHs0fSktKDBbMS05XXwxWzAtMl0pLSgwWzEtOV18WzEyXVswLTldfDNbMDFdKSQvaX0sdGltZTp7ZXJyb3JNZXNzYWdlOkooIlN0cmluZyBpcyBub3QgYSBSRkMzMzM5IHRpbWUuIikscGF0dGVybjovXihbMDFdWzAtOV18MlswLTNdKTooWzAtNV1bMC05XSk6KFswLTVdWzAtOV18NjApKFwuWzAtOV0rKT8oWnwoXCt8LSkoWzAxXVswLTldfDJbMC0zXSk6KFswLTVdWzAtOV0pKSQvaX0sZW1haWw6e2Vycm9yTWVzc2FnZTpKKCJTdHJpbmcgaXMgbm90IGFuIGUtbWFpbCBhZGRyZXNzLiIpLHBhdHRlcm46L14oKFtePD4oKVtcXVxcLiw7OlxzQCJdKyhcLltePD4oKVtcXVxcLiw7OlxzQCJdKykqKXwoIi4rIikpQCgoXFtbMC05XXsxLDN9XC5bMC05XXsxLDN9XC5bMC05XXsxLDN9XC5bMC05XXsxLDN9XSl8KChbYS16QS1aXC0wLTldK1wuKStbYS16QS1aXXsyLH0pKSQvfSxpcHY0OntlcnJvck1lc3NhZ2U6SigiU3RyaW5nIGRvZXMgbm90IG1hdGNoIElQdjQgZm9ybWF0LiIpLHBhdHRlcm46L14oKDI1WzAtNV18KDJbMC00XXwxXGR8WzEtOV18KVxkKVwuP1xiKXs0fSQvfSxpcHY2OntlcnJvck1lc3NhZ2U6SigiU3RyaW5nIGRvZXMgbm90IG1hdGNoIElQdjYgZm9ybWF0LiIpLHBhdHRlcm46L14oWzAtOWEtZl18Oil7MSw0fSg6KFswLTlhLWZdezAsNH0pKil7MSw3fSQvaX19LEdlPWNsYXNze2NvbnN0cnVjdG9yKGUpe3RoaXMucHJvYmxlbXM9W10sdGhpcy5wcm9wZXJ0aWVzTWF0Y2hlcz0wLHRoaXMucHJvcGVydGllc1ZhbHVlTWF0Y2hlcz0wLHRoaXMucHJpbWFyeVZhbHVlTWF0Y2hlcz0wLHRoaXMuZW51bVZhbHVlTWF0Y2g9ITEsdGhpcy5lbnVtVmFsdWVzPW51bGwsZSYmKHRoaXMuZW51bVZhbHVlcz1bXSl9Z2V0RXZhbHVhdGVkSXRlbXMoZSl7dGhpcy5ldmFsdWF0ZWRJdGVtc0J5Tm9kZT8/KHRoaXMuZXZhbHVhdGVkSXRlbXNCeU5vZGU9bmV3IE1hcCk7bGV0IHQ9dGhpcy5ldmFsdWF0ZWRJdGVtc0J5Tm9kZS5nZXQoZSk7cmV0dXJuIHR8fCh0PW5ldyBTZXQsdGhpcy5ldmFsdWF0ZWRJdGVtc0J5Tm9kZS5zZXQoZSx0KSksdH1oYXNQcm9ibGVtcygpe3JldHVybiB0aGlzLnByb2JsZW1zLmxlbmd0aD4wfW1lcmdlKGUpe2lmKHRoaXMucHJvYmxlbXM9dGhpcy5wcm9ibGVtcy5jb25jYXQoZS5wcm9ibGVtcyksZS5ldmFsdWF0ZWRQcm9wZXJ0aWVzKXt0aGlzLmV2YWx1YXRlZFByb3BlcnRpZXM/Pyh0aGlzLmV2YWx1YXRlZFByb3BlcnRpZXM9bmV3IFNldCk7Zm9yKGNvbnN0IHQgb2YgZS5ldmFsdWF0ZWRQcm9wZXJ0aWVzKXRoaXMuZXZhbHVhdGVkUHJvcGVydGllcy5hZGQodCl9aWYoZS5ldmFsdWF0ZWRJdGVtc0J5Tm9kZSl7dGhpcy5ldmFsdWF0ZWRJdGVtc0J5Tm9kZT8/KHRoaXMuZXZhbHVhdGVkSXRlbXNCeU5vZGU9bmV3IE1hcCk7Zm9yKGNvbnN0W3Qsbl1vZiBlLmV2YWx1YXRlZEl0ZW1zQnlOb2RlKXtjb25zdCByPXRoaXMuZXZhbHVhdGVkSXRlbXNCeU5vZGUuZ2V0KHQpO2lmKHIpZm9yKGNvbnN0IHMgb2YgbilyLmFkZChzKTtlbHNlIHRoaXMuZXZhbHVhdGVkSXRlbXNCeU5vZGUuc2V0KHQsbmV3IFNldChuKSl9fX1tZXJnZUVudW1WYWx1ZXMoZSl7aWYoIXRoaXMuZW51bVZhbHVlTWF0Y2gmJiFlLmVudW1WYWx1ZU1hdGNoJiZ0aGlzLmVudW1WYWx1ZXMmJmUuZW51bVZhbHVlcyl7dGhpcy5lbnVtVmFsdWVzPXRoaXMuZW51bVZhbHVlcy5jb25jYXQoZS5lbnVtVmFsdWVzKTtmb3IoY29uc3QgdCBvZiB0aGlzLnByb2JsZW1zKXQuY29kZT09PUF0LkVudW1WYWx1ZU1pc21hdGNoJiYodC5tZXNzYWdlPUooIlZhbHVlIGlzIG5vdCBhY2NlcHRlZC4gVmFsaWQgdmFsdWVzOiB7MH0uIixbLi4ubmV3IFNldCh0aGlzLmVudW1WYWx1ZXMpXS5tYXAobj0+SlNPTi5zdHJpbmdpZnkobikpLmpvaW4oIiwgIikpKX19bWVyZ2VXYXJuaW5nR2VuZXJpYyhlLHQpe3ZhciBuLHIscztpZigobj10aGlzLnByb2JsZW1zKSE9bnVsbCYmbi5sZW5ndGgpZm9yKGNvbnN0IGkgb2YgdCl7Y29uc3Qgbz10aGlzLnByb2JsZW1zLmZpbHRlcihhPT5hLnByb2JsZW1UeXBlPT09aSk7Zm9yKGNvbnN0IGEgb2Ygbyl7Y29uc3QgdT0ocj1lLnByb2JsZW1zKT09bnVsbD92b2lkIDA6ci5maW5kKGw9PmwucHJvYmxlbVR5cGU9PT1pJiZhLmxvY2F0aW9uLm9mZnNldD09PWwubG9jYXRpb24ub2Zmc2V0JiYoaSE9PUx0Lm1pc3NpbmdSZXF1aXJlZFByb3BXYXJuaW5nfHx3dyhsLnByb2JsZW1BcmdzLGEucHJvYmxlbUFyZ3MpKSk7dSYmKChzPXUucHJvYmxlbUFyZ3MpIT1udWxsJiZzLmxlbmd0aCYmKHUucHJvYmxlbUFyZ3MuZmlsdGVyKGw9PiFhLnByb2JsZW1BcmdzLmluY2x1ZGVzKGwpKS5mb3JFYWNoKGw9PmEucHJvYmxlbUFyZ3MucHVzaChsKSksYS5wcm9ibGVtVHlwZSYmKGEubWVzc2FnZT1ZYyhhLnByb2JsZW1UeXBlLGEucHJvYmxlbUFyZ3M/P1tdKSkpLHRoaXMubWVyZ2VTb3VyY2VzKHUsYSkpfX19bWVyZ2VQcm9wZXJ0eU1hdGNoKGUsdD0hMCl7dD90aGlzLm1lcmdlKGUpOnRoaXMucHJvYmxlbXM9dGhpcy5wcm9ibGVtcy5jb25jYXQoZS5wcm9ibGVtcyksdGhpcy5wcm9wZXJ0aWVzTWF0Y2hlcysrLChlLmVudW1WYWx1ZU1hdGNofHwhZS5oYXNQcm9ibGVtcygpJiZlLnByb3BlcnRpZXNNYXRjaGVzKSYmdGhpcy5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzKyssZS5lbnVtVmFsdWVNYXRjaCYmZS5lbnVtVmFsdWVzJiZ0aGlzLnByaW1hcnlWYWx1ZU1hdGNoZXMrK31tZXJnZVNvdXJjZXMoZSx0KXtjb25zdCBuPShlLnNvdXJjZT8/IiIpLnJlcGxhY2UoVHcsIiIpO24mJnQuc291cmNlJiYhdC5zb3VyY2UuaW5jbHVkZXMobikmJih0LnNvdXJjZT10LnNvdXJjZSsiIHwgIituKSx0LnNjaGVtYVVyaSYmZS5zY2hlbWFVcmkmJiF0LnNjaGVtYVVyaS5pbmNsdWRlcyhlLnNjaGVtYVVyaVswXSkmJih0LnNjaGVtYVVyaT10LnNjaGVtYVVyaS5jb25jYXQoZS5zY2hlbWFVcmkpKX1jb21wYXJlR2VuZXJpYyhlKXtjb25zdCB0PXRoaXMuaGFzUHJvYmxlbXMoKTtyZXR1cm4gdCE9PWUuaGFzUHJvYmxlbXMoKT90Py0xOjE6dGhpcy5lbnVtVmFsdWVNYXRjaCE9PWUuZW51bVZhbHVlTWF0Y2g/ZS5lbnVtVmFsdWVNYXRjaD8tMToxOnRoaXMucHJvcGVydGllc1ZhbHVlTWF0Y2hlcyE9PWUucHJvcGVydGllc1ZhbHVlTWF0Y2hlcz90aGlzLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMtZS5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzOnRoaXMucHJpbWFyeVZhbHVlTWF0Y2hlcyE9PWUucHJpbWFyeVZhbHVlTWF0Y2hlcz90aGlzLnByaW1hcnlWYWx1ZU1hdGNoZXMtZS5wcmltYXJ5VmFsdWVNYXRjaGVzOnRoaXMucHJvcGVydGllc01hdGNoZXMtZS5wcm9wZXJ0aWVzTWF0Y2hlc31jb21wYXJlS3ViZXJuZXRlcyhlKXtjb25zdCB0PXRoaXMuaGFzUHJvYmxlbXMoKTtyZXR1cm4gdGhpcy5wcm9wZXJ0aWVzTWF0Y2hlcyE9PWUucHJvcGVydGllc01hdGNoZXM/dGhpcy5wcm9wZXJ0aWVzTWF0Y2hlcy1lLnByb3BlcnRpZXNNYXRjaGVzOnRoaXMuZW51bVZhbHVlTWF0Y2ghPT1lLmVudW1WYWx1ZU1hdGNoP2UuZW51bVZhbHVlTWF0Y2g/LTE6MTp0aGlzLnByaW1hcnlWYWx1ZU1hdGNoZXMhPT1lLnByaW1hcnlWYWx1ZU1hdGNoZXM/dGhpcy5wcmltYXJ5VmFsdWVNYXRjaGVzLWUucHJpbWFyeVZhbHVlTWF0Y2hlczp0aGlzLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMhPT1lLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXM/dGhpcy5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzLWUucHJvcGVydGllc1ZhbHVlTWF0Y2hlczp0IT09ZS5oYXNQcm9ibGVtcygpP3Q/LTE6MTp0aGlzLnByb3BlcnRpZXNNYXRjaGVzLWUucHJvcGVydGllc01hdGNoZXN9fSxOdz1jbGFzc3tjb2xsZWN0U2VlbktleXMoZSl7Y29uc3QgdD1PYmplY3QuY3JlYXRlKG51bGwpLG49Wy4uLmUucHJvcGVydGllc107Zm9yKDtuLmxlbmd0aD4wOyl7Y29uc3Qgcj1uLnBvcCgpO2lmKCFyKWNvbnRpbnVlO2NvbnN0IHM9ci5rZXlOb2RlLnZhbHVlO2lmKHM9PT0iPDwiJiZyLnZhbHVlTm9kZSl7Y29uc3QgaT1yLnZhbHVlTm9kZTtzd2l0Y2goaS50eXBlKXtjYXNlIm9iamVjdCI6bi5wdXNoKC4uLmkucHJvcGVydGllcyk7YnJlYWs7Y2FzZSJhcnJheSI6aS5pdGVtcy5mb3JFYWNoKG89PntvJiZvLnR5cGU9PT0ib2JqZWN0IiYmdncoby5wcm9wZXJ0aWVzKSYmbi5wdXNoKC4uLm8ucHJvcGVydGllcyl9KTticmVha319ZWxzZSB0W3NdPXIudmFsdWVOb2RlfXJldHVybiB0fXZhbGlkYXRlRG9jdW1lbnQoZSx0LG4scil7Y29uc3Qgcz1uZXcgR2Uoci5pc0t1YmVybmV0ZXMpO3JldHVybiB0aGlzLnZhbGlkYXRlTm9kZShlLG4sbixzLFZvLmluc3RhbmNlLHIpLHMucHJvYmxlbXMubWFwKGk9Pntjb25zdCBvPVkuY3JlYXRlKHQucG9zaXRpb25BdChpLmxvY2F0aW9uLm9mZnNldCksdC5wb3NpdGlvbkF0KGkubG9jYXRpb24ub2Zmc2V0K2kubG9jYXRpb24ubGVuZ3RoKSksYT1QdC5jcmVhdGUobyxpLm1lc3NhZ2UsaS5zZXZlcml0eSxpLmNvZGU/aS5jb2RlOkF0LlVuZGVmaW5lZCxpLnNvdXJjZSk7cmV0dXJuIGEuZGF0YT17c2NoZW1hVXJpOmkuc2NoZW1hVXJpLC4uLmkuZGF0YX0sYX0pfWdldE1hdGNoaW5nU2NoZW1hcyhlLHQsbixyLHMpe2NvbnN0IGk9bmV3IEdPKHIscyk7cmV0dXJuIHRoaXMudmFsaWRhdGVOb2RlKGUsdCx0LG5ldyBHZShuLmlzS3ViZXJuZXRlcyksaSxuKSxpLnNjaGVtYXN9Z2V0Tm9PcENvbGxlY3Rvcigpe3JldHVybiBWby5pbnN0YW5jZX1nZXRTY2hlbWFTb3VyY2UoZSx0KXtsZXQgbjtpZihlLnRpdGxlKW49ZS50aXRsZTtlbHNlIGlmKGUuY2xvc2VzdFRpdGxlKW49ZS5jbG9zZXN0VGl0bGU7ZWxzZSBpZih0LmNsb3Nlc3RUaXRsZSluPXQuY2xvc2VzdFRpdGxlO2Vsc2V7Y29uc3Qgcj1lLnVybD8/dC51cmw7ciYmKG49cnQucGFyc2UocikudG9TdHJpbmcoKSl9cmV0dXJuIG4/YCR7VHd9JHtufWA6WGN9Z2V0U2NoZW1hVXJpKGUsdCl7Y29uc3Qgbj1lLnVybD8/dC51cmw7cmV0dXJuIG4/W25dOltdfXZhbGlkYXRlTm9kZShlLHQsbixyLHMsaSl7aWYoZSYmISghdHx8dHlwZW9mIHQhPSJvYmplY3QiKSl7aWYodC5fZGlhbGVjdCl7Y29uc3Qgbz10Ll9kaWFsZWN0LGE9dGhpcy5nZXRDdXJyZW50RGlhbGVjdCgpO2lmKG8hPT1hKXtVbShvKS52YWxpZGF0ZU5vZGUoZSx0LG4scixzLGkpO3JldHVybn19c3dpdGNoKHQudXJsfHwodC51cmw9bi51cmwpLHQuY2xvc2VzdFRpdGxlPXQudGl0bGV8fG4uY2xvc2VzdFRpdGxlLGUudHlwZSl7Y2FzZSJvYmplY3QiOnRoaXMudmFsaWRhdGVPYmplY3ROb2RlKGUsdCxuLHIscyxpKTticmVhaztjYXNlImFycmF5Ijp0aGlzLnZhbGlkYXRlQXJyYXlOb2RlKGUsdCxuLHIscyxpKTticmVhaztjYXNlInN0cmluZyI6dGhpcy52YWxpZGF0ZVN0cmluZ05vZGUoZSx0LG4scik7YnJlYWs7Y2FzZSJudW1iZXIiOnRoaXMudmFsaWRhdGVOdW1iZXJOb2RlKGUsdCxuLHIpO2JyZWFrO2Nhc2UicHJvcGVydHkiOnRoaXMudmFsaWRhdGVOb2RlKGUudmFsdWVOb2RlLHQsdCxyLHMsaSk7YnJlYWt9aWYodGhpcy52YWxpZGF0ZUdlbmVyaWNOb2RlKGUsdCxuLHIscyxpKSxzLmFkZCh7bm9kZTplLHNjaGVtYTp0fSksdGhpcy5hcHBseVVuZXZhbHVhdGVkSXRlbXMoZSx0LG4scixzLGkpLGUudHlwZT09PSJvYmplY3QiKXtjb25zdCBvPXRoaXMuY29sbGVjdFNlZW5LZXlzKGUpO3RoaXMuYXBwbHlVbmV2YWx1YXRlZFByb3BlcnRpZXMoZSx0LG4scixzLGksbyl9fX12YWxpZGF0ZUdlbmVyaWNOb2RlKGUsdCxuLHIscyxpKXtjb25zdHtpc0t1YmVybmV0ZXM6byxjYWxsRnJvbUF1dG9Db21wbGV0ZTphfT1pLHU9bT0+ZS50eXBlPT09bXx8bT09PSJpbnRlZ2VyIiYmZS50eXBlPT09Im51bWJlciImJmUuaXNJbnRlZ2VyLGw9KG0sZyk9PntpZihnLmV2YWx1YXRlZFByb3BlcnRpZXMpe20uZXZhbHVhdGVkUHJvcGVydGllcz8/KG0uZXZhbHVhdGVkUHJvcGVydGllcz1uZXcgU2V0KTtmb3IoY29uc3QgRCBvZiBnLmV2YWx1YXRlZFByb3BlcnRpZXMpbS5ldmFsdWF0ZWRQcm9wZXJ0aWVzLmFkZChEKX1pZihnLmV2YWx1YXRlZEl0ZW1zQnlOb2RlKXttLmV2YWx1YXRlZEl0ZW1zQnlOb2RlPz8obS5ldmFsdWF0ZWRJdGVtc0J5Tm9kZT1uZXcgTWFwKTtmb3IoY29uc3RbRCxiXW9mIGcuZXZhbHVhdGVkSXRlbXNCeU5vZGUpe2NvbnN0IEU9bS5ldmFsdWF0ZWRJdGVtc0J5Tm9kZS5nZXQoRCk7aWYoRSlmb3IoY29uc3QgRiBvZiBiKUUuYWRkKEYpO2Vsc2UgbS5ldmFsdWF0ZWRJdGVtc0J5Tm9kZS5zZXQoRCxuZXcgU2V0KGIpKX19fTtpZihBcnJheS5pc0FycmF5KHQudHlwZSkpdC50eXBlLnNvbWUodSl8fHIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LHNldmVyaXR5OlEuV2FybmluZyxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxKKCJJbmNvcnJlY3QgdHlwZS4gRXhwZWN0ZWQgb25lIG9mIHswfS4iLHQudHlwZS5qb2luKCIsICIpKSxzb3VyY2U6dGhpcy5nZXRTY2hlbWFTb3VyY2UodCxuKSxzY2hlbWFVcmk6dGhpcy5nZXRTY2hlbWFVcmkodCxuKX0pO2Vsc2UgaWYodC50eXBlJiYhdSh0LnR5cGUpKXtjb25zdCBtPXQudHlwZT09PSJvYmplY3QiP09tKHQpOnQudHlwZTtyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxzZXZlcml0eTpRLldhcm5pbmcsbWVzc2FnZTp0LmVycm9yTWVzc2FnZXx8WWMoTHQudHlwZU1pc21hdGNoV2FybmluZyxbbV0pLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pLHByb2JsZW1UeXBlOkx0LnR5cGVNaXNtYXRjaFdhcm5pbmcscHJvYmxlbUFyZ3M6W21dfSl9aWYoQXJyYXkuaXNBcnJheSh0LmFsbE9mKSlmb3IoY29uc3QgbSBvZiB0LmFsbE9mKXtjb25zdCBnPVllKG0pLEQ9bmV3IEdlKG8pLGI9cy5uZXdTdWIoKTt0aGlzLnZhbGlkYXRlTm9kZShlLGcsdCxELGIsaSksci5tZXJnZShEKSxyLnByb3BlcnRpZXNNYXRjaGVzKz1ELnByb3BlcnRpZXNNYXRjaGVzLHIucHJvcGVydGllc1ZhbHVlTWF0Y2hlcys9RC5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzLHMubWVyZ2UoYil9Y29uc3QgZj1ZZSh0Lm5vdCk7aWYoZil7Y29uc3QgbT1uZXcgR2UobyksZz1zLm5ld1N1YigpO3RoaXMudmFsaWRhdGVOb2RlKGUsZix0LG0sZyxpKSxtLmhhc1Byb2JsZW1zKCl8fHIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LHNldmVyaXR5OlEuV2FybmluZyxtZXNzYWdlOkooIk1hdGNoZXMgYSBzY2hlbWEgdGhhdCBpcyBub3QgYWxsb3dlZC4iKSxzb3VyY2U6dGhpcy5nZXRTY2hlbWFTb3VyY2UodCxuKSxzY2hlbWFVcmk6dGhpcy5nZXRTY2hlbWFVcmkodCxuKX0pO2Zvcihjb25zdCBEIG9mIGcuc2NoZW1hcylELmludmVydGVkPSFELmludmVydGVkLHMuYWRkKEQpfWNvbnN0IGM9KG0sZyk9Pnt2YXIgdjtjb25zdCBEPVtdLGI9W10sRT1bXTtsZXQgRj1udWxsO2Zvcihjb25zdCBDIG9mIG0pe2NvbnN0IEE9ey4uLlllKEMpfSx3PW5ldyBHZShvKSxUPXMubmV3U3ViKCk7dGhpcy52YWxpZGF0ZU5vZGUoZSxBLHQsdyxULGkpLCghdy5oYXNQcm9ibGVtcygpfHxhKSYmKEQucHVzaChBKSx3LnByb3BlcnRpZXNNYXRjaGVzPT09MCYmYi5wdXNoKEEpLEEuZm9ybWF0JiZELnBvcCgpKSx3Lmhhc1Byb2JsZW1zKCl8fEUucHVzaCh3KSxGP28/Rj10aGlzLmFsdGVybmF0aXZlQ29tcGFyaXNvbih3LEYsQSxUKTpGPXRoaXMuZ2VuZXJpY0NvbXBhcmlzb24oZSxnLHcsRixBLFQpOkY9e3NjaGVtYTpBLHZhbGlkYXRpb25SZXN1bHQ6dyxtYXRjaGluZ1NjaGVtYXM6VH19aWYoRC5sZW5ndGg+MSYmKEQubGVuZ3RoPjF8fGIubGVuZ3RoPT09MCkmJmcmJnIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6MX0sc2V2ZXJpdHk6US5XYXJuaW5nLG1lc3NhZ2U6SigiTWF0Y2hlcyBtdWx0aXBsZSBzY2hlbWFzIHdoZW4gb25seSBvbmUgbXVzdCB2YWxpZGF0ZS4iKSxzb3VyY2U6dGhpcy5nZXRTY2hlbWFTb3VyY2UodCxuKSxzY2hlbWFVcmk6dGhpcy5nZXRTY2hlbWFVcmkodCxuKX0pLEYmJihyLm1lcmdlKEYudmFsaWRhdGlvblJlc3VsdCksci5wcm9wZXJ0aWVzTWF0Y2hlcys9Ri52YWxpZGF0aW9uUmVzdWx0LnByb3BlcnRpZXNNYXRjaGVzLHIucHJvcGVydGllc1ZhbHVlTWF0Y2hlcys9Ri52YWxpZGF0aW9uUmVzdWx0LnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMsci5lbnVtVmFsdWVNYXRjaD1yLmVudW1WYWx1ZU1hdGNofHxGLnZhbGlkYXRpb25SZXN1bHQuZW51bVZhbHVlTWF0Y2gsKHY9Ri52YWxpZGF0aW9uUmVzdWx0LmVudW1WYWx1ZXMpIT1udWxsJiZ2Lmxlbmd0aCYmKHIuZW51bVZhbHVlcz0oci5lbnVtVmFsdWVzfHxbXSkuY29uY2F0KEYudmFsaWRhdGlvblJlc3VsdC5lbnVtVmFsdWVzKSkscy5tZXJnZShGLm1hdGNoaW5nU2NoZW1hcykpLEUubGVuZ3RoPjApZm9yKGNvbnN0IEMgb2YgRSlsKHIsQyl9O0FycmF5LmlzQXJyYXkodC5hbnlPZikmJmModC5hbnlPZiwhMSksQXJyYXkuaXNBcnJheSh0Lm9uZU9mKSYmYyh0Lm9uZU9mLCEwKTtjb25zdCBwPShtLGcpPT57Y29uc3QgRD1uZXcgR2UobyksYj1zLm5ld1N1YigpO3RoaXMudmFsaWRhdGVOb2RlKGUsWWUobSksZyxELGIsaSksci5tZXJnZShEKSxyLnByb3BlcnRpZXNNYXRjaGVzKz1ELnByb3BlcnRpZXNNYXRjaGVzLHIucHJvcGVydGllc1ZhbHVlTWF0Y2hlcys9RC5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzLHMubWVyZ2UoYil9LGg9KG0sZyxELGIpPT57Y29uc3QgRT1ZZShtKSxGPW5ldyBHZShvKSx2PXMubmV3U3ViKCk7dGhpcy52YWxpZGF0ZU5vZGUoZSxFLGcsRix2LGkpLHMubWVyZ2Uodik7Y29uc3QgQz1FPT1udWxsP3ZvaWQgMDpFLmZpbGVQYXR0ZXJuQXNzb2NpYXRpb247QyYmKG5ldyAkTyhDKS5tYXRjaGVzUGF0dGVybihpLnVyaSl8fEYucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LHNldmVyaXR5OlEuV2FybmluZyxtZXNzYWdlOkooImZpbGVQYXR0ZXJuQXNzb2NpYXRpb24gJ3swfScgZG9lcyBub3QgbWF0Y2ggd2l0aCBkb2MgdXJpICd7MX0nIixDLGkudXJpKSxzb3VyY2U6dGhpcy5nZXRTY2hlbWFTb3VyY2UodCxuKSxzY2hlbWFVcmk6dGhpcy5nZXRTY2hlbWFVcmkodCxuKX0pKSxGLmhhc1Byb2JsZW1zKCk/YiYmcChiLGcpOihsKHIsRiksRCYmcChELGcpKX0sZD1ZZSh0LmlmKTtpZihkJiZoKGQsdCxZZSh0LnRoZW4pLFllKHQuZWxzZSkpLEFycmF5LmlzQXJyYXkodC5lbnVtKSl7Y29uc3QgbT1SbyhlKTtsZXQgZz0hMTtmb3IoY29uc3QgRCBvZiB0LmVudW0paWYoZHUobSxELGUudHlwZSl8fEx3KGEsZSxtLEQpKXtnPSEwO2JyZWFrfXIuZW51bVZhbHVlcz10LmVudW0sci5lbnVtVmFsdWVNYXRjaD1nLGd8fHIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LHNldmVyaXR5OlEuV2FybmluZyxjb2RlOkF0LkVudW1WYWx1ZU1pc21hdGNoLG1lc3NhZ2U6dC5lcnJvck1lc3NhZ2V8fEooIlZhbHVlIGlzIG5vdCBhY2NlcHRlZC4gVmFsaWQgdmFsdWVzOiB7MH0uIiwodC5lbnVtPz9bXSkubWFwKEQ9PkpTT04uc3RyaW5naWZ5KEQpKS5qb2luKCIsICIpKSxzb3VyY2U6dGhpcy5nZXRTY2hlbWFTb3VyY2UodCxuKSxzY2hlbWFVcmk6dGhpcy5nZXRTY2hlbWFVcmkodCxuKSxkYXRhOnt2YWx1ZXM6dC5lbnVtfX0pfWlmKFVyKHQuY29uc3QpKXtjb25zdCBtPVJvKGUpLGc9dC5jb25zdDshZHUobSxnLGUudHlwZSkmJiFMdyhhLGUsbSxnKT8oci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmUub2Zmc2V0LGxlbmd0aDplLmxlbmd0aH0sc2V2ZXJpdHk6US5XYXJuaW5nLGNvZGU6QXQuRW51bVZhbHVlTWlzbWF0Y2gscHJvYmxlbVR5cGU6THQuY29uc3RXYXJuaW5nLG1lc3NhZ2U6dC5lcnJvck1lc3NhZ2V8fFljKEx0LmNvbnN0V2FybmluZyxbSlNPTi5zdHJpbmdpZnkoZyldKSxzb3VyY2U6dGhpcy5nZXRTY2hlbWFTb3VyY2UodCxuKSxzY2hlbWFVcmk6dGhpcy5nZXRTY2hlbWFVcmkodCxuKSxwcm9ibGVtQXJnczpbSlNPTi5zdHJpbmdpZnkoZyldLGRhdGE6e3ZhbHVlczpbZ119fSksci5lbnVtVmFsdWVNYXRjaD0hMSk6ci5lbnVtVmFsdWVNYXRjaD0hMCxyLmVudW1WYWx1ZXM9W2ddfXQuZGVwcmVjYXRpb25NZXNzYWdlJiZlLnBhcmVudCYmci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmUucGFyZW50Lm9mZnNldCxsZW5ndGg6ZS5wYXJlbnQubGVuZ3RofSxzZXZlcml0eTpRLldhcm5pbmcsbWVzc2FnZTp0LmRlcHJlY2F0aW9uTWVzc2FnZSxzb3VyY2U6dGhpcy5nZXRTY2hlbWFTb3VyY2UodCxuKSxzY2hlbWFVcmk6dGhpcy5nZXRTY2hlbWFVcmkodCxuKX0pfXZhbGlkYXRlU3RyaW5nTm9kZShlLHQsbixyKXtjb25zdCBzPWUudmFsdWU7aWYoS2UodC5taW5MZW5ndGgpJiZzLmxlbmd0aDwodC5taW5MZW5ndGg/PzApJiZyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxzZXZlcml0eTpRLldhcm5pbmcsbWVzc2FnZTpKKCJTdHJpbmcgaXMgc2hvcnRlciB0aGFuIHRoZSBtaW5pbXVtIGxlbmd0aCBvZiB7MH0uIix0Lm1pbkxlbmd0aCksc291cmNlOnRoaXMuZ2V0U2NoZW1hU291cmNlKHQsbiksc2NoZW1hVXJpOnRoaXMuZ2V0U2NoZW1hVXJpKHQsbil9KSxLZSh0Lm1heExlbmd0aCkmJnMubGVuZ3RoPih0Lm1heExlbmd0aD8/MCkmJnIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LHNldmVyaXR5OlEuV2FybmluZyxtZXNzYWdlOkooIlN0cmluZyBpcyBsb25nZXIgdGhhbiB0aGUgbWF4aW11bSBsZW5ndGggb2YgezB9LiIsdC5tYXhMZW5ndGgpLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pfSksemModC5wYXR0ZXJuKSl7Y29uc3QgaT1Ddyh0LnBhdHRlcm4pO2k/aS50ZXN0KHMpfHxyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxzZXZlcml0eTpRLldhcm5pbmcsbWVzc2FnZTp0LnBhdHRlcm5FcnJvck1lc3NhZ2V8fHQuZXJyb3JNZXNzYWdlfHxKKCdTdHJpbmcgZG9lcyBub3QgbWF0Y2ggdGhlIHBhdHRlcm4gb2YgInswfSIuJyx0LnBhdHRlcm4pLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pfSk6ci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmUub2Zmc2V0LGxlbmd0aDplLmxlbmd0aH0sc2V2ZXJpdHk6US5XYXJuaW5nLG1lc3NhZ2U6SignSW52YWxpZCBwYXR0ZXJuOiAiezB9IicsdC5wYXR0ZXJuKSxzb3VyY2U6dGhpcy5nZXRTY2hlbWFTb3VyY2UodCxuKSxzY2hlbWFVcmk6dGhpcy5nZXRTY2hlbWFVcmkodCxuKX0pfWlmKHQuZm9ybWF0KXN3aXRjaCh0LmZvcm1hdCl7Y2FzZSJ1cmkiOmNhc2UidXJpLXJlZmVyZW5jZSI6e2xldCBpO2lmKCFzKWk9SigiVVJJIGV4cGVjdGVkLiIpO2Vsc2UgdHJ5eyFydC5wYXJzZShzKS5zY2hlbWUmJnQuZm9ybWF0PT09InVyaSImJihpPUooIlVSSSB3aXRoIGEgc2NoZW1lIGlzIGV4cGVjdGVkLiIpKX1jYXRjaChvKXtpPW8gaW5zdGFuY2VvZiBFcnJvcj9vLm1lc3NhZ2U6U3RyaW5nKG8pfWkmJnIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LHNldmVyaXR5OlEuV2FybmluZyxtZXNzYWdlOnQucGF0dGVybkVycm9yTWVzc2FnZXx8dC5lcnJvck1lc3NhZ2V8fEooIlN0cmluZyBpcyBub3QgYSBVUkk6IHswfSIsaSksc291cmNlOnRoaXMuZ2V0U2NoZW1hU291cmNlKHQsbiksc2NoZW1hVXJpOnRoaXMuZ2V0U2NoZW1hVXJpKHQsbil9KTticmVha31jYXNlImNvbG9yLWhleCI6Y2FzZSJkYXRlLXRpbWUiOmNhc2UiZGF0ZSI6Y2FzZSJ0aW1lIjpjYXNlImVtYWlsIjpjYXNlImlwdjQiOmNhc2UiaXB2NiI6e2NvbnN0IGk9S09bdC5mb3JtYXRdOyghc3x8IWkucGF0dGVybi50ZXN0KHMpKSYmci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmUub2Zmc2V0LGxlbmd0aDplLmxlbmd0aH0sc2V2ZXJpdHk6US5XYXJuaW5nLG1lc3NhZ2U6dC5wYXR0ZXJuRXJyb3JNZXNzYWdlfHx0LmVycm9yTWVzc2FnZXx8SihpLmVycm9yTWVzc2FnZSksc291cmNlOnRoaXMuZ2V0U2NoZW1hU291cmNlKHQsbiksc2NoZW1hVXJpOnRoaXMuZ2V0U2NoZW1hVXJpKHQsbil9KTticmVha319fXZhbGlkYXRlTnVtYmVyTm9kZShlLHQsbixyKXtjb25zdCBzPWUudmFsdWU7S2UodC5tdWx0aXBsZU9mKSYmQk8ocyx0Lm11bHRpcGxlT2Y/PzApIT09MCYmci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmUub2Zmc2V0LGxlbmd0aDplLmxlbmd0aH0sc2V2ZXJpdHk6US5XYXJuaW5nLG1lc3NhZ2U6SigiVmFsdWUgaXMgbm90IGRpdmlzaWJsZSBieSB7MH0uIix0Lm11bHRpcGxlT2YpLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pfSk7Y29uc3QgaT10aGlzLmdldE51bWJlckxpbWl0cyh0KTtLZShpLmV4Y2x1c2l2ZU1pbmltdW0pJiZzPD1pLmV4Y2x1c2l2ZU1pbmltdW0mJnIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LHNldmVyaXR5OlEuV2FybmluZyxtZXNzYWdlOkooIlZhbHVlIGlzIGJlbG93IHRoZSBleGNsdXNpdmUgbWluaW11bSBvZiB7MH0uIixpLmV4Y2x1c2l2ZU1pbmltdW0pLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pfSksS2UoaS5leGNsdXNpdmVNYXhpbXVtKSYmcz49aS5leGNsdXNpdmVNYXhpbXVtJiZyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxzZXZlcml0eTpRLldhcm5pbmcsbWVzc2FnZTpKKCJWYWx1ZSBpcyBhYm92ZSB0aGUgZXhjbHVzaXZlIG1heGltdW0gb2YgezB9LiIsaS5leGNsdXNpdmVNYXhpbXVtKSxzb3VyY2U6dGhpcy5nZXRTY2hlbWFTb3VyY2UodCxuKSxzY2hlbWFVcmk6dGhpcy5nZXRTY2hlbWFVcmkodCxuKX0pLEtlKGkubWluaW11bSkmJnM8aS5taW5pbXVtJiZyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxzZXZlcml0eTpRLldhcm5pbmcsbWVzc2FnZTpKKCJWYWx1ZSBpcyBiZWxvdyB0aGUgbWluaW11bSBvZiB7MH0uIixpLm1pbmltdW0pLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pfSksS2UoaS5tYXhpbXVtKSYmcz5pLm1heGltdW0mJnIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LHNldmVyaXR5OlEuV2FybmluZyxtZXNzYWdlOkooIlZhbHVlIGlzIGFib3ZlIHRoZSBtYXhpbXVtIG9mIHswfS4iLGkubWF4aW11bSksc291cmNlOnRoaXMuZ2V0U2NoZW1hU291cmNlKHQsbiksc2NoZW1hVXJpOnRoaXMuZ2V0U2NoZW1hVXJpKHQsbil9KX12YWxpZGF0ZUFycmF5Tm9kZShlLHQsbixyLHMsaSl7Y29uc3R7aXNLdWJlcm5ldGVzOm99PWksYT1lLml0ZW1zPz9bXSx1PXQuaXRlbXM/ci5nZXRFdmFsdWF0ZWRJdGVtcyhlKTp2b2lkIDA7aWYoQXJyYXkuaXNBcnJheSh0Lml0ZW1zKSl7Y29uc3QgbD10Lml0ZW1zO2ZvcihsZXQgZj0wO2Y8bC5sZW5ndGg7ZisrKXtjb25zdCBjPVllKGxbZl0pLHA9bmV3IEdlKG8pLGg9YVtmXTtoPyh0aGlzLnZhbGlkYXRlTm9kZShoLGMsdCxwLHMsaSksci5tZXJnZVByb3BlcnR5TWF0Y2gocCwhMSksci5tZXJnZUVudW1WYWx1ZXMocCksdT09bnVsbHx8dS5hZGQoZikpOmEubGVuZ3RoPj1sLmxlbmd0aCYmci5wcm9wZXJ0aWVzVmFsdWVNYXRjaGVzKyt9aWYoYS5sZW5ndGg+bC5sZW5ndGgpe2NvbnN0IGY9dC5hZGRpdGlvbmFsSXRlbXM7aWYoZj09PSExKXtyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxzZXZlcml0eTpRLldhcm5pbmcsbWVzc2FnZTpKKCJBcnJheSBoYXMgdG9vIG1hbnkgaXRlbXMgYWNjb3JkaW5nIHRvIHNjaGVtYS4gRXhwZWN0ZWQgezB9IG9yIGZld2VyLiIsbC5sZW5ndGgpLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pfSk7Zm9yKGxldCBjPWwubGVuZ3RoO2M8YS5sZW5ndGg7YysrKXU9PW51bGx8fHUuYWRkKGMpfWVsc2UgaWYodHlwZW9mIGY9PSJvYmplY3QiKWZvcihsZXQgYz1sLmxlbmd0aDtjPGEubGVuZ3RoO2MrKyl7Y29uc3QgcD1uZXcgR2Uobyk7dGhpcy52YWxpZGF0ZU5vZGUoYVtjXSxmLHQscCxzLGkpLHIubWVyZ2VQcm9wZXJ0eU1hdGNoKHAsITEpLHIubWVyZ2VFbnVtVmFsdWVzKHApLHU9PW51bGx8fHUuYWRkKGMpfWVsc2UgaWYoZj09PSEwKWZvcihsZXQgYz1sLmxlbmd0aDtjPGEubGVuZ3RoO2MrKyl1PT1udWxsfHx1LmFkZChjKX19ZWxzZXtjb25zdCBsPVllKHQuaXRlbXMpO2lmKGwpe2NvbnN0IGY9ci5nZXRFdmFsdWF0ZWRJdGVtcyhlKTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyl7Y29uc3QgcD1hW2NdLGg9bmV3IEdlKG8pO3RoaXMudmFsaWRhdGVOb2RlKHAsbCx0LGgscyxpKSxyLm1lcmdlUHJvcGVydHlNYXRjaChoLCExKSxyLm1lcmdlRW51bVZhbHVlcyhoKSxmLmFkZChjKX19fXRoaXMuYXBwbHlDb250YWlucyhlLHQsbixyLHMsaSksdGhpcy5hcHBseUFycmF5TGVuZ3RoKGUsdCxuLHIsaSksdGhpcy5hcHBseVVuaXF1ZUl0ZW1zKGUsdCxuLHIpfWFwcGx5Q29udGFpbnMoZSx0LG4scixzLGkpe2NvbnN0e2lzS3ViZXJuZXRlczpvfT1pLGE9WWUodC5jb250YWlucyk7aWYoIWEpcmV0dXJuOyhlLml0ZW1zPz9bXSkuc29tZShsPT57Y29uc3QgZj1uZXcgR2Uobyk7cmV0dXJuIHRoaXMudmFsaWRhdGVOb2RlKGwsYSx0LGYsVm8uaW5zdGFuY2UsaSksIWYuaGFzUHJvYmxlbXMoKX0pfHxyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxzZXZlcml0eTpRLldhcm5pbmcsbWVzc2FnZTp0LmVycm9yTWVzc2FnZXx8SigiQXJyYXkgZG9lcyBub3QgY29udGFpbiByZXF1aXJlZCBpdGVtLiIpLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pfSl9YXBwbHlBcnJheUxlbmd0aChlLHQsbixyLHMpe0tlKHQubWluSXRlbXMpJiZlLml0ZW1zLmxlbmd0aDwodC5taW5JdGVtcz8/MCkmJnIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LHNldmVyaXR5OlEuV2FybmluZyxtZXNzYWdlOkooIkFycmF5IGhhcyB0b28gZmV3IGl0ZW1zLiBFeHBlY3RlZCB7MH0gb3IgbW9yZS4iLHQubWluSXRlbXMpLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pfSksS2UodC5tYXhJdGVtcykmJmUuaXRlbXMubGVuZ3RoPih0Lm1heEl0ZW1zPz8wKSYmci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmUub2Zmc2V0LGxlbmd0aDplLmxlbmd0aH0sc2V2ZXJpdHk6US5XYXJuaW5nLG1lc3NhZ2U6SigiQXJyYXkgaGFzIHRvbyBtYW55IGl0ZW1zLiBFeHBlY3RlZCB7MH0gb3IgZmV3ZXIuIix0Lm1heEl0ZW1zKSxzb3VyY2U6dGhpcy5nZXRTY2hlbWFTb3VyY2UodCxuKSxzY2hlbWFVcmk6dGhpcy5nZXRTY2hlbWFVcmkodCxuKX0pfWFwcGx5VW5pcXVlSXRlbXMoZSx0LG4scil7aWYodC51bmlxdWVJdGVtcz09PSEwKXtjb25zdCBzPVJvKGUpO0FycmF5LmlzQXJyYXkocykmJnMuc29tZSgobyxhKT0+YSE9PXMubGFzdEluZGV4T2YobykpJiZyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxzZXZlcml0eTpRLldhcm5pbmcsbWVzc2FnZTpKKCJBcnJheSBoYXMgZHVwbGljYXRlIGl0ZW1zLiIpLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pfSl9fXZhbGlkYXRlT2JqZWN0Tm9kZShlLHQsbixyLHMsaSl7Y29uc3Qgbz1PYmplY3QuY3JlYXRlKG51bGwpLGE9W10sdT1bLi4uZS5wcm9wZXJ0aWVzXTtmb3IoO3UubGVuZ3RoPjA7KXtjb25zdCBmPXUucG9wKCk7aWYoIWYpY29udGludWU7Y29uc3QgYz1mLmtleU5vZGUudmFsdWU7aWYoYz09PSI8PCImJmYudmFsdWVOb2RlKXN3aXRjaChmLnZhbHVlTm9kZS50eXBlKXtjYXNlIm9iamVjdCI6dS5wdXNoKC4uLmYudmFsdWVOb2RlLnByb3BlcnRpZXMpO2JyZWFrO2Nhc2UiYXJyYXkiOmYudmFsdWVOb2RlLml0ZW1zLmZvckVhY2gocD0+e3AmJnAudHlwZT09PSJvYmplY3QiJiZ2dyhwLnByb3BlcnRpZXMpJiZ1LnB1c2goLi4ucC5wcm9wZXJ0aWVzKX0pO2JyZWFrfWVsc2Ugb1tjXT1mLnZhbHVlTm9kZSxhLnB1c2goYyl9Y29uc3QgbD1mPT57bGV0IGM9YS5pbmRleE9mKGYpO2Zvcig7Yz49MDspYS5zcGxpY2UoYywxKSxjPWEuaW5kZXhPZihmKX07dGhpcy5hcHBseVJlcXVpcmVkKGUsdCxuLHIsaSxvKSx0aGlzLmFwcGx5UHJvcGVydGllcyhlLHQsbixyLHMsaSxvLGEsbCksdGhpcy5hcHBseVBhdHRlcm5Qcm9wZXJ0aWVzKGUsdCxuLHIscyxpLG8sYSxsKSx0aGlzLmFwcGx5QWRkaXRpb25hbFByb3BlcnRpZXMoZSx0LG4scixzLGksbyxhKSx0aGlzLmFwcGx5UHJvcGVydHlDb3VudChlLHQsbixyKSx0aGlzLmFwcGx5RGVwZW5kZW5jaWVzKGUsdCxuLHIscyxpLG8pLHRoaXMuYXBwbHlQcm9wZXJ0eU5hbWVzKGUsdCxyLGkpfWFwcGx5UmVxdWlyZWQoZSx0LG4scixzLGkpe2lmKEFycmF5LmlzQXJyYXkodC5yZXF1aXJlZCkpe2Zvcihjb25zdCBvIG9mIHQucmVxdWlyZWQpaWYoaVtvXT09PXZvaWQgMCl7Y29uc3QgYT1lLnBhcmVudCYmZS5wYXJlbnQudHlwZT09PSJwcm9wZXJ0eSImJmUucGFyZW50LmtleU5vZGUsdT1hP3tvZmZzZXQ6YS5vZmZzZXQsbGVuZ3RoOmEubGVuZ3RofTp7b2Zmc2V0OmUub2Zmc2V0LGxlbmd0aDoxfTtyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOnUsc2V2ZXJpdHk6US5XYXJuaW5nLG1lc3NhZ2U6dC5lcnJvck1lc3NhZ2V8fFljKEx0Lm1pc3NpbmdSZXF1aXJlZFByb3BXYXJuaW5nLFtvXSksc291cmNlOnRoaXMuZ2V0U2NoZW1hU291cmNlKHQsbiksc2NoZW1hVXJpOnRoaXMuZ2V0U2NoZW1hVXJpKHQsbikscHJvYmxlbUFyZ3M6W29dLHByb2JsZW1UeXBlOkx0Lm1pc3NpbmdSZXF1aXJlZFByb3BXYXJuaW5nfSl9fX1hcHBseVByb3BlcnRpZXMoZSx0LG4scixzLGksbyxhLHUpe2NvbnN0e2lzS3ViZXJuZXRlczpsfT1pLGY9dC5wcm9wZXJ0aWVzO2lmKGYpZm9yKGNvbnN0IGMgb2YgT2JqZWN0LmtleXMoZikpe3UoYyk7Y29uc3QgcD1mW2NdLGg9b1tjXTtpZihoKWlmKHIuZXZhbHVhdGVkUHJvcGVydGllcz8/KHIuZXZhbHVhdGVkUHJvcGVydGllcz1uZXcgU2V0KSxyLmV2YWx1YXRlZFByb3BlcnRpZXMuYWRkKGMpLGpvKHApKWlmKHApci5wcm9wZXJ0aWVzTWF0Y2hlcysrLHIucHJvcGVydGllc1ZhbHVlTWF0Y2hlcysrO2Vsc2V7Y29uc3QgZD1oLnBhcmVudDtyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZC5rZXlOb2RlLm9mZnNldCxsZW5ndGg6ZC5rZXlOb2RlLmxlbmd0aH0sc2V2ZXJpdHk6US5XYXJuaW5nLG1lc3NhZ2U6dC5lcnJvck1lc3NhZ2V8fEooIlByb3BlcnR5IHswfSBpcyBub3QgYWxsb3dlZC4iLGMpLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pfSl9ZWxzZXtwLnVybD10LnVybD8/bi51cmw7Y29uc3QgZD1uZXcgR2UobCk7dGhpcy52YWxpZGF0ZU5vZGUoaCxwLHQsZCxzLGkpLHIubWVyZ2VQcm9wZXJ0eU1hdGNoKGQsITEpLHIubWVyZ2VFbnVtVmFsdWVzKGQpfX19YXBwbHlQYXR0ZXJuUHJvcGVydGllcyhlLHQsbixyLHMsaSxvLGEsdSl7Y29uc3R7aXNLdWJlcm5ldGVzOmx9PWksZj10LnBhdHRlcm5Qcm9wZXJ0aWVzO2lmKGYpZm9yKGNvbnN0IGMgb2YgT2JqZWN0LmtleXMoZikpe2NvbnN0IHA9Q3coYyk7aWYocClmb3IoY29uc3QgaCBvZiBhLnNsaWNlKDApKXtpZighcC50ZXN0KGgpKWNvbnRpbnVlO3UoaCk7Y29uc3QgZD1vW2hdO2lmKCFkKWNvbnRpbnVlO3IuZXZhbHVhdGVkUHJvcGVydGllcz8/KHIuZXZhbHVhdGVkUHJvcGVydGllcz1uZXcgU2V0KSxyLmV2YWx1YXRlZFByb3BlcnRpZXMuYWRkKGgpO2NvbnN0IG09ZltjXTtpZihqbyhtKSlpZihtKXIucHJvcGVydGllc01hdGNoZXMrKyxyLnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMrKztlbHNle2NvbnN0IGc9ZC5wYXJlbnQ7ci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0Omcua2V5Tm9kZS5vZmZzZXQsbGVuZ3RoOmcua2V5Tm9kZS5sZW5ndGh9LHNldmVyaXR5OlEuV2FybmluZyxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxKKCJQcm9wZXJ0eSB7MH0gaXMgbm90IGFsbG93ZWQuIixoKSxzb3VyY2U6dGhpcy5nZXRTY2hlbWFTb3VyY2UodCxuKSxzY2hlbWFVcmk6dGhpcy5nZXRTY2hlbWFVcmkodCxuKX0pfWVsc2V7Y29uc3QgZz1uZXcgR2UobCk7dGhpcy52YWxpZGF0ZU5vZGUoZCxtLHQsZyxzLGkpLHIubWVyZ2VQcm9wZXJ0eU1hdGNoKGcsITEpLHIubWVyZ2VFbnVtVmFsdWVzKGcpfX19fWFwcGx5QWRkaXRpb25hbFByb3BlcnRpZXMoZSx0LG4scixzLGksbyxhKXtjb25zdHtpc0t1YmVybmV0ZXM6dX09aSxsPXQuYWRkaXRpb25hbFByb3BlcnRpZXM7aWYodHlwZW9mIGw9PSJvYmplY3QiKXtmb3IoY29uc3QgcCBvZiBhKXtjb25zdCBoPW9bcF07aWYoIWgpY29udGludWU7ci5ldmFsdWF0ZWRQcm9wZXJ0aWVzPz8oci5ldmFsdWF0ZWRQcm9wZXJ0aWVzPW5ldyBTZXQpLHIuZXZhbHVhdGVkUHJvcGVydGllcy5hZGQocCk7Y29uc3QgZD1uZXcgR2UodSk7dGhpcy52YWxpZGF0ZU5vZGUoaCxsLHQsZCxzLGkpLHIubWVyZ2VQcm9wZXJ0eU1hdGNoKGQsITEpLHIubWVyZ2VFbnVtVmFsdWVzKGQpfXJldHVybn1pZihsPT09ITApe2lmKGEubGVuZ3RoPjApe3IuZXZhbHVhdGVkUHJvcGVydGllcz8/KHIuZXZhbHVhdGVkUHJvcGVydGllcz1uZXcgU2V0KTtmb3IoY29uc3QgcCBvZiBhKW9bcF0mJnIuZXZhbHVhdGVkUHJvcGVydGllcy5hZGQocCl9cmV0dXJufWlmKCEobD09PSExfHx0LnR5cGU9PT0ib2JqZWN0IiYmbD09PXZvaWQgMCYmaS5kaXNhYmxlQWRkaXRpb25hbFByb3BlcnRpZXM9PT0hMCl8fGEubGVuZ3RoPT09MClyZXR1cm47Y29uc3QgYz10LnByb3BlcnRpZXMmJk9iamVjdC5lbnRyaWVzKHQucHJvcGVydGllcykuZmlsdGVyKChbcCxoXSk9PiEob1twXXx8aCYmdHlwZW9mIGg9PSJvYmplY3QiJiYoaC5kb05vdFN1Z2dlc3R8fGguZGVwcmVjYXRpb25NZXNzYWdlKSkpLm1hcCgoW3BdKT0+cCk7Zm9yKGNvbnN0IHAgb2YgYSl7Y29uc3QgaD1vW3BdO2lmKCFoKWNvbnRpbnVlO2xldCBkPWgudHlwZT09PSJwcm9wZXJ0eSI/aDpoLnBhcmVudD8/aDtkLnR5cGU9PT0ib2JqZWN0IiYmKGQ9ZC5wcm9wZXJ0aWVzWzBdPz9kKTtjb25zdCBtPWQudHlwZT09PSJwcm9wZXJ0eSI/ZC5rZXlOb2RlOmQsZz17bG9jYXRpb246e29mZnNldDptLm9mZnNldCxsZW5ndGg6bS5sZW5ndGh9LHNldmVyaXR5OlEuV2FybmluZyxjb2RlOkF0LlByb3BlcnR5RXhwZWN0ZWQsbWVzc2FnZTp0LmVycm9yTWVzc2FnZXx8SigiUHJvcGVydHkgezB9IGlzIG5vdCBhbGxvd2VkLiIscCksc291cmNlOnRoaXMuZ2V0U2NoZW1hU291cmNlKHQsbiksc2NoZW1hVXJpOnRoaXMuZ2V0U2NoZW1hVXJpKHQsbil9O2MhPW51bGwmJmMubGVuZ3RoJiYoZy5kYXRhPXtwcm9wZXJ0aWVzOmN9KSxyLnByb2JsZW1zLnB1c2goZyl9fWFwcGx5UHJvcGVydHlDb3VudChlLHQsbixyKXtLZSh0Lm1heFByb3BlcnRpZXMpJiZlLnByb3BlcnRpZXMubGVuZ3RoPih0Lm1heFByb3BlcnRpZXM/PzApJiZyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxzZXZlcml0eTpRLldhcm5pbmcsbWVzc2FnZTpKKCJPYmplY3QgaGFzIG1vcmUgcHJvcGVydGllcyB0aGFuIGxpbWl0IG9mIHswfS4iLHQubWF4UHJvcGVydGllcyksc291cmNlOnRoaXMuZ2V0U2NoZW1hU291cmNlKHQsbiksc2NoZW1hVXJpOnRoaXMuZ2V0U2NoZW1hVXJpKHQsbil9KSxLZSh0Lm1pblByb3BlcnRpZXMpJiZlLnByb3BlcnRpZXMubGVuZ3RoPCh0Lm1pblByb3BlcnRpZXM/PzApJiZyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxzZXZlcml0eTpRLldhcm5pbmcsbWVzc2FnZTpKKCJPYmplY3QgaGFzIGZld2VyIHByb3BlcnRpZXMgdGhhbiB0aGUgcmVxdWlyZWQgbnVtYmVyIG9mIHswfSIsdC5taW5Qcm9wZXJ0aWVzKSxzb3VyY2U6dGhpcy5nZXRTY2hlbWFTb3VyY2UodCxuKSxzY2hlbWFVcmk6dGhpcy5nZXRTY2hlbWFVcmkodCxuKX0pfWFwcGx5RGVwZW5kZW5jaWVzKGUsdCxuLHIscyxpLG8pe2NvbnN0e2lzS3ViZXJuZXRlczphfT1pLHU9dC5kZXBlbmRlbmNpZXM7aWYodSlmb3IoY29uc3QgbCBvZiBPYmplY3Qua2V5cyh1KSl7aWYoIW9bbF0pY29udGludWU7Y29uc3QgYz11W2xdO2lmKEFycmF5LmlzQXJyYXkoYykpZm9yKGNvbnN0IHAgb2YgYylvW3BdP3IucHJvcGVydGllc1ZhbHVlTWF0Y2hlcysrOnIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LHNldmVyaXR5OlEuV2FybmluZyxtZXNzYWdlOkooIk9iamVjdCBpcyBtaXNzaW5nIHByb3BlcnR5IHswfSByZXF1aXJlZCBieSBwcm9wZXJ0eSB7MX0uIixwLGwpLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pfSk7ZWxzZXtjb25zdCBwPVllKGMpO2lmKHApe2NvbnN0IGg9bmV3IEdlKGEpO3RoaXMudmFsaWRhdGVOb2RlKGUscCx0LGgscyxpKSxyLm1lcmdlUHJvcGVydHlNYXRjaChoKSxyLm1lcmdlRW51bVZhbHVlcyhoKX19fX1hcHBseVByb3BlcnR5TmFtZXMoZSx0LG4scil7Y29uc3Qgcz1ZZSh0LnByb3BlcnR5TmFtZXMpO2lmKHMpZm9yKGNvbnN0IGkgb2YgZS5wcm9wZXJ0aWVzKXtjb25zdCBvPWkua2V5Tm9kZTtvJiZ0aGlzLnZhbGlkYXRlTm9kZShvLHMsdCxuLFZvLmluc3RhbmNlLHIpfX1hcHBseVVuZXZhbHVhdGVkUHJvcGVydGllcyhlLHQsbixyLHMsaSxvLGEpe31hcHBseVVuZXZhbHVhdGVkSXRlbXMoZSx0LG4scixzLGkpe31hbHRlcm5hdGl2ZUNvbXBhcmlzb24oZSx0LG4scil7Y29uc3Qgcz1lLmNvbXBhcmVLdWJlcm5ldGVzKHQudmFsaWRhdGlvblJlc3VsdCk7cmV0dXJuIHM+MD97c2NoZW1hOm4sdmFsaWRhdGlvblJlc3VsdDplLG1hdGNoaW5nU2NoZW1hczpyfToocz09PTAmJih0Lm1hdGNoaW5nU2NoZW1hcy5tZXJnZShyKSx0LnZhbGlkYXRpb25SZXN1bHQubWVyZ2VFbnVtVmFsdWVzKGUpKSx0KX1nZW5lcmljQ29tcGFyaXNvbihlLHQsbixyLHMsaSl7aWYoIXQmJiFuLmhhc1Byb2JsZW1zKCkmJiFyLnZhbGlkYXRpb25SZXN1bHQuaGFzUHJvYmxlbXMoKSlyLm1hdGNoaW5nU2NoZW1hcy5tZXJnZShpKSxyLnZhbGlkYXRpb25SZXN1bHQucHJvcGVydGllc01hdGNoZXMrPW4ucHJvcGVydGllc01hdGNoZXMsci52YWxpZGF0aW9uUmVzdWx0LnByb3BlcnRpZXNWYWx1ZU1hdGNoZXMrPW4ucHJvcGVydGllc1ZhbHVlTWF0Y2hlcztlbHNle2NvbnN0IG89bi5jb21wYXJlR2VuZXJpYyhyLnZhbGlkYXRpb25SZXN1bHQpO28+MHx8bz09PTAmJnQmJnIuc2NoZW1hLnR5cGU9PT0ib2JqZWN0IiYmZS50eXBlIT09Im51bGwiJiZlLnR5cGUhPT1yLnNjaGVtYS50eXBlP3I9e3NjaGVtYTpzLHZhbGlkYXRpb25SZXN1bHQ6bixtYXRjaGluZ1NjaGVtYXM6aX06KG89PT0wfHwoZS52YWx1ZT09PW51bGx8fGUudHlwZT09PSJudWxsIikmJmUubGVuZ3RoPT09MCkmJnRoaXMubWVyZ2VWYWxpZGF0aW9uTWF0Y2hlcyhyLGksbil9cmV0dXJuIHJ9bWVyZ2VWYWxpZGF0aW9uTWF0Y2hlcyhlLHQsbil7ZS5tYXRjaGluZ1NjaGVtYXMubWVyZ2UodCksZS52YWxpZGF0aW9uUmVzdWx0Lm1lcmdlRW51bVZhbHVlcyhuKSxlLnZhbGlkYXRpb25SZXN1bHQubWVyZ2VXYXJuaW5nR2VuZXJpYyhuLFtMdC5taXNzaW5nUmVxdWlyZWRQcm9wV2FybmluZyxMdC50eXBlTWlzbWF0Y2hXYXJuaW5nLEx0LmNvbnN0V2FybmluZ10pfX07ZnVuY3Rpb24gWWUoZSl7aWYoZSE9PXZvaWQgMClyZXR1cm4gam8oZSk/ZT97fTp7bm90Ont9fTp0eXBlb2YgZSE9Im9iamVjdCI/KGNvbnNvbGUud2FybihgV3Jvbmcgc2NoZW1hOiAke0pTT04uc3RyaW5naWZ5KGUpfSwgaXQgTVVTVCBiZSBhbiBPYmplY3Qgb3IgQm9vbGVhbmApLHt0eXBlOmV9KTplfWZ1bmN0aW9uIFljKGUsdCl7cmV0dXJuIEooek9bZV0sdC5qb2luKCIgfCAiKSl9ZnVuY3Rpb24gTHcoZSx0LG4scil7cmV0dXJuIGU/bj09PW51bGwmJnQubGVuZ3RoPT09MD8hMDp6YyhuKSYmemMocikmJnIuc3RhcnRzV2l0aChuKTohMX12YXIgWE89Y2xhc3MgZXh0ZW5kcyBOd3tnZXRDdXJyZW50RGlhbGVjdCgpe3JldHVybiB0dC5kcmFmdDA0fWdldE51bWJlckxpbWl0cyhlKXtjb25zdCB0PUtlKGUubWluaW11bSk/ZS5taW5pbXVtOnZvaWQgMCxuPUtlKGUubWF4aW11bSk/ZS5tYXhpbXVtOnZvaWQgMCxyPWpvKGUuZXhjbHVzaXZlTWluaW11bSkmJmUuZXhjbHVzaXZlTWluaW11bT90OnZvaWQgMCxzPWpvKGUuZXhjbHVzaXZlTWF4aW11bSkmJmUuZXhjbHVzaXZlTWF4aW11bT9uOnZvaWQgMDtyZXR1cm57bWluaW11bTpyPT09dm9pZCAwP3Q6dm9pZCAwLG1heGltdW06cz09PXZvaWQgMD9uOnZvaWQgMCxleGNsdXNpdmVNaW5pbXVtOnIsZXhjbHVzaXZlTWF4aW11bTpzfX19LFZtPWNsYXNzIGV4dGVuZHMgTnd7Z2V0Q3VycmVudERpYWxlY3QoKXtyZXR1cm4gdHQuZHJhZnQwN31nZXROdW1iZXJMaW1pdHMoZSl7Y29uc3QgdD1LZShlLm1pbmltdW0pP2UubWluaW11bTp2b2lkIDAsbj1LZShlLm1heGltdW0pP2UubWF4aW11bTp2b2lkIDAscj1LZShlLmV4Y2x1c2l2ZU1pbmltdW0pP2UuZXhjbHVzaXZlTWluaW11bTp2b2lkIDAscz1LZShlLmV4Y2x1c2l2ZU1heGltdW0pP2UuZXhjbHVzaXZlTWF4aW11bTp2b2lkIDA7cmV0dXJue21pbmltdW06cj09PXZvaWQgMD90OnZvaWQgMCxtYXhpbXVtOnM9PT12b2lkIDA/bjp2b2lkIDAsZXhjbHVzaXZlTWluaW11bTpyLGV4Y2x1c2l2ZU1heGltdW06c319fSwkdz1jbGFzcyBleHRlbmRzIFZte2dldEN1cnJlbnREaWFsZWN0KCl7cmV0dXJuIHR0LmRyYWZ0MjAxOX1hcHBseUNvbnRhaW5zKGUsdCxuLHIscyxpKXtjb25zdCBvPVllKHQuY29udGFpbnMpO2lmKCFvKXJldHVybjtjb25zdCBhPXQubWluQ29udGFpbnMsdT10Lm1heENvbnRhaW5zLGw9S2UoYSk/YToxLGY9S2UodSk/dTp2b2lkIDA7bGV0IGM9MDtjb25zdCBwPWUuaXRlbXM/P1tdO2Zvcihjb25zdCBoIG9mIHApe2NvbnN0IGQ9bmV3IEdlKGkuaXNLdWJlcm5ldGVzKTtpZih0aGlzLnZhbGlkYXRlTm9kZShoLG8sdCxkLHRoaXMuZ2V0Tm9PcENvbGxlY3RvcigpLGkpLCFkLmhhc1Byb2JsZW1zKCkmJihjKyssZiE9PXZvaWQgMCYmYz5mKSlicmVha31jPGwmJnIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LHNldmVyaXR5OlEuV2FybmluZyxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxKKCdBcnJheSBoYXMgdG9vIGZldyBpdGVtcyBtYXRjaGluZyAiY29udGFpbnMiLiBFeHBlY3RlZCB7MH0gb3IgbW9yZS4nLGwpLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pfSksZiE9PXZvaWQgMCYmYz5mJiZyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxzZXZlcml0eTpRLldhcm5pbmcsbWVzc2FnZTp0LmVycm9yTWVzc2FnZXx8SignQXJyYXkgaGFzIHRvbyBtYW55IGl0ZW1zIG1hdGNoaW5nICJjb250YWlucyIuIEV4cGVjdGVkIHswfSBvciBmZXdlci4nLGYpLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pfSl9YXBwbHlEZXBlbmRlbmNpZXMoZSx0LG4scixzLGksbyl7c3VwZXIuYXBwbHlEZXBlbmRlbmNpZXMoZSx0LG4scixzLGksbyk7Y29uc3QgYT10LmRlcGVuZGVudFJlcXVpcmVkO2lmKGEmJnR5cGVvZiBhPT0ib2JqZWN0Iilmb3IoY29uc3QgbCBvZiBPYmplY3Qua2V5cyhhKSl7aWYoIW9bbF0pY29udGludWU7Y29uc3QgZj1hW2xdO2lmKEFycmF5LmlzQXJyYXkoZikpZm9yKGNvbnN0IGMgb2YgZilvW2NdP3IucHJvcGVydGllc1ZhbHVlTWF0Y2hlcysrOnIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDplLm9mZnNldCxsZW5ndGg6ZS5sZW5ndGh9LHNldmVyaXR5OlEuV2FybmluZyxtZXNzYWdlOkooIk9iamVjdCBpcyBtaXNzaW5nIHByb3BlcnR5IHswfSByZXF1aXJlZCBieSBwcm9wZXJ0eSB7MX0uIixjLGwpLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pfSl9Y29uc3QgdT10LmRlcGVuZGVudFNjaGVtYXM7aWYodSYmdHlwZW9mIHU9PSJvYmplY3QiKWZvcihjb25zdCBsIG9mIE9iamVjdC5rZXlzKHUpKXtpZighb1tsXSljb250aW51ZTtjb25zdCBmPVllKHVbbF0pO2lmKCFmKWNvbnRpbnVlO2NvbnN0IGM9bmV3IEdlKGkuaXNLdWJlcm5ldGVzKTt0aGlzLnZhbGlkYXRlTm9kZShlLGYsdCxjLHMsaSksci5tZXJnZVByb3BlcnR5TWF0Y2goYyksci5tZXJnZUVudW1WYWx1ZXMoYyl9fWFwcGx5VW5ldmFsdWF0ZWRQcm9wZXJ0aWVzKGUsdCxuLHIscyxpLG8pe3ZhciBmLGMscDtjb25zdCBhPXQudW5ldmFsdWF0ZWRQcm9wZXJ0aWVzO2lmKGE9PT12b2lkIDB8fCFvKXJldHVybjtyLmV2YWx1YXRlZFByb3BlcnRpZXM/PyhyLmV2YWx1YXRlZFByb3BlcnRpZXM9bmV3IFNldCk7Y29uc3QgdT1PYmplY3Qua2V5cyhvKS5maWx0ZXIoaD0+e3ZhciBkO3JldHVybiEoKGQ9ci5ldmFsdWF0ZWRQcm9wZXJ0aWVzKSE9bnVsbCYmZC5oYXMoaCkpfSk7aWYodS5sZW5ndGg9PT0wKXJldHVybjtpZihhPT09ITEpe2Zvcihjb25zdCBoIG9mIHUpe2NvbnN0IGQ9b1toXTtpZighZCljb250aW51ZTtjb25zdCBnPShkLnR5cGU9PT0icHJvcGVydHkiP2Q6ZC5wYXJlbnQpLmtleU5vZGU7ZyYmKHIucHJvYmxlbXMucHVzaCh7bG9jYXRpb246e29mZnNldDpnLm9mZnNldCxsZW5ndGg6Zy5sZW5ndGh9LHNldmVyaXR5OlEuV2FybmluZyxjb2RlOkF0LlByb3BlcnR5RXhwZWN0ZWQsbWVzc2FnZTp0LmVycm9yTWVzc2FnZXx8SigiUHJvcGVydHkgezB9IGlzIG5vdCBhbGxvd2VkLiIsaCksc291cmNlOnRoaXMuZ2V0U2NoZW1hU291cmNlKHQsbiksc2NoZW1hVXJpOnRoaXMuZ2V0U2NoZW1hVXJpKHQsbil9KSwoZj1yLmV2YWx1YXRlZFByb3BlcnRpZXMpPT1udWxsfHxmLmFkZChoKSl9cmV0dXJufWlmKGE9PT0hMCl7Zm9yKGNvbnN0IGggb2YgdSkoYz1yLmV2YWx1YXRlZFByb3BlcnRpZXMpPT1udWxsfHxjLmFkZChoKTtyZXR1cm59Y29uc3QgbD1ZZShhKTtpZihsKWZvcihjb25zdCBoIG9mIHUpe2NvbnN0IGQ9b1toXTtpZighZCljb250aW51ZTtjb25zdCBtPWQudHlwZT09PSJwcm9wZXJ0eSI/ZC52YWx1ZU5vZGU6ZDtpZighbSljb250aW51ZTtjb25zdCBnPW5ldyBHZShpLmlzS3ViZXJuZXRlcyk7dGhpcy52YWxpZGF0ZU5vZGUobSxsLHQsZyxzLGkpLHIubWVyZ2VQcm9wZXJ0eU1hdGNoKGcpLHIubWVyZ2VFbnVtVmFsdWVzKGcpLChwPXIuZXZhbHVhdGVkUHJvcGVydGllcyk9PW51bGx8fHAuYWRkKGgpfX1hcHBseVVuZXZhbHVhdGVkSXRlbXMoZSx0LG4scixzLGkpe2NvbnN0IG89dC51bmV2YWx1YXRlZEl0ZW1zO2lmKG89PT12b2lkIDApcmV0dXJuO2NvbnN0IGE9ZS5pdGVtcz8/W107aWYoYS5sZW5ndGg9PT0wKXJldHVybjtjb25zdCB1PXIuZ2V0RXZhbHVhdGVkSXRlbXMoZSksbD1bXTtmb3IobGV0IGM9MDtjPGEubGVuZ3RoO2MrKyl1LmhhcyhjKXx8bC5wdXNoKGMpO2lmKGwubGVuZ3RoPT09MClyZXR1cm47aWYobz09PSExKXtmb3IoY29uc3QgYyBvZiBsKXtjb25zdCBwPWFbY107ci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OnAub2Zmc2V0LGxlbmd0aDpwLmxlbmd0aHx8MX0sc2V2ZXJpdHk6US5XYXJuaW5nLGNvZGU6QXQuUHJvcGVydHlFeHBlY3RlZCxtZXNzYWdlOnQuZXJyb3JNZXNzYWdlfHxKKCJBcnJheSBoYXMgdG9vIG1hbnkgaXRlbXMgYWNjb3JkaW5nIHRvIHNjaGVtYS4gRXhwZWN0ZWQgezB9IG9yIGZld2VyLiIsYyksc291cmNlOnRoaXMuZ2V0U2NoZW1hU291cmNlKHQsbiksc2NoZW1hVXJpOnRoaXMuZ2V0U2NoZW1hVXJpKHQsbil9KSx1LmFkZChjKX1yZXR1cm59aWYobz09PSEwKXtmb3IoY29uc3QgYyBvZiBsKXUuYWRkKGMpO3JldHVybn1jb25zdCBmPVllKG8pO2lmKGYpZm9yKGNvbnN0IGMgb2YgbCl7Y29uc3QgcD1hW2NdLGg9bmV3IEdlKGkuaXNLdWJlcm5ldGVzKTt0aGlzLnZhbGlkYXRlTm9kZShwLGYsdCxoLHMsaSksci5tZXJnZShoKSxyLm1lcmdlRW51bVZhbHVlcyhoKSx1LmFkZChjKX19fSxZTz1jbGFzcyBleHRlbmRzICR3e2dldEN1cnJlbnREaWFsZWN0KCl7cmV0dXJuIHR0LmRyYWZ0MjAyMH12YWxpZGF0ZUFycmF5Tm9kZShlLHQsbixyLHMsaSl7Y29uc3Qgbz1lLml0ZW1zPz9bXSxhPXIuZ2V0RXZhbHVhdGVkSXRlbXMoZSksdT10LnByZWZpeEl0ZW1zO2lmKEFycmF5LmlzQXJyYXkodSkpe2NvbnN0IGM9TWF0aC5taW4odS5sZW5ndGgsby5sZW5ndGgpO2ZvcihsZXQgcD0wO3A8YztwKyspe2NvbnN0IGg9WWUodVtwXSk7aWYoIWgpe2EuYWRkKHApO2NvbnRpbnVlfWNvbnN0IGQ9bmV3IEdlKGkuaXNLdWJlcm5ldGVzKTt0aGlzLnZhbGlkYXRlTm9kZShvW3BdLGgsdCxkLHMsaSksci5tZXJnZVByb3BlcnR5TWF0Y2goZCwhMSksci5tZXJnZUVudW1WYWx1ZXMoZCksYS5hZGQocCl9fWNvbnN0IGw9dC5pdGVtcyxmPUFycmF5LmlzQXJyYXkodSk/dS5sZW5ndGg6MDtpZihvLmxlbmd0aD5mKWlmKGw9PT0hMSl7ci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmUub2Zmc2V0LGxlbmd0aDplLmxlbmd0aH0sc2V2ZXJpdHk6US5XYXJuaW5nLG1lc3NhZ2U6SigiQXJyYXkgaGFzIHRvbyBtYW55IGl0ZW1zIGFjY29yZGluZyB0byBzY2hlbWEuIEV4cGVjdGVkIHswfSBvciBmZXdlci4iLGYpLHNvdXJjZTp0aGlzLmdldFNjaGVtYVNvdXJjZSh0LG4pLHNjaGVtYVVyaTp0aGlzLmdldFNjaGVtYVVyaSh0LG4pfSk7Zm9yKGxldCBjPWY7YzxvLmxlbmd0aDtjKyspYS5hZGQoYyl9ZWxzZXtjb25zdCBjPVllKGwpO2lmKGMpZm9yKGxldCBwPWY7cDxvLmxlbmd0aDtwKyspe2NvbnN0IGg9bmV3IEdlKGkuaXNLdWJlcm5ldGVzKTt0aGlzLnZhbGlkYXRlTm9kZShvW3BdLGMsdCxoLHMsaSksci5tZXJnZVByb3BlcnR5TWF0Y2goaCwhMSksci5tZXJnZUVudW1WYWx1ZXMoaCksYS5hZGQocCl9fXRoaXMuYXBwbHlDb250YWlucyhlLHQsbixyLHMsaSksdGhpcy5hcHBseUFycmF5TGVuZ3RoKGUsdCxuLHIsaSksdGhpcy5hcHBseVVuaXF1ZUl0ZW1zKGUsdCxuLHIpfWFwcGx5Q29udGFpbnMoZSx0LG4scixzLGkpe2NvbnN0IG89WWUodC5jb250YWlucyk7aWYoIW8pcmV0dXJuO2NvbnN0IGE9ZS5pdGVtcz8/W10sdT10Lm1pbkNvbnRhaW5zLGw9dC5tYXhDb250YWlucyxmPUtlKHUpP3U6MSxjPUtlKGwpP2w6dm9pZCAwO2xldCBwPTA7Y29uc3QgaD1yLmdldEV2YWx1YXRlZEl0ZW1zKGUpO2ZvcihsZXQgZD0wO2Q8YS5sZW5ndGg7ZCsrKXtjb25zdCBtPW5ldyBHZShpLmlzS3ViZXJuZXRlcyk7aWYodGhpcy52YWxpZGF0ZU5vZGUoYVtkXSxvLHQsbSx0aGlzLmdldE5vT3BDb2xsZWN0b3IoKSxpKSwhbS5oYXNQcm9ibGVtcygpJiYoaC5hZGQoZCkscCsrLGMhPT12b2lkIDAmJnA+YykpYnJlYWt9cDxmJiZyLnByb2JsZW1zLnB1c2goe2xvY2F0aW9uOntvZmZzZXQ6ZS5vZmZzZXQsbGVuZ3RoOmUubGVuZ3RofSxzZXZlcml0eTpRLldhcm5pbmcsbWVzc2FnZTp0LmVycm9yTWVzc2FnZXx8SignQXJyYXkgaGFzIHRvbyBmZXcgaXRlbXMgbWF0Y2hpbmcgImNvbnRhaW5zIi4gRXhwZWN0ZWQgezB9IG9yIG1vcmUuJyxmKSxzb3VyY2U6dGhpcy5nZXRTY2hlbWFTb3VyY2UodCxuKSxzY2hlbWFVcmk6dGhpcy5nZXRTY2hlbWFVcmkodCxuKX0pLGMhPT12b2lkIDAmJnA+YyYmci5wcm9ibGVtcy5wdXNoKHtsb2NhdGlvbjp7b2Zmc2V0OmUub2Zmc2V0LGxlbmd0aDplLmxlbmd0aH0sc2V2ZXJpdHk6US5XYXJuaW5nLG1lc3NhZ2U6dC5lcnJvck1lc3NhZ2V8fEooJ0FycmF5IGhhcyB0b28gbWFueSBpdGVtcyBtYXRjaGluZyAiY29udGFpbnMiLiBFeHBlY3RlZCB7MH0gb3IgZmV3ZXIuJyxjKSxzb3VyY2U6dGhpcy5nZXRTY2hlbWFTb3VyY2UodCxuKSxzY2hlbWFVcmk6dGhpcy5nZXRTY2hlbWFVcmkodCxuKX0pfX07ZnVuY3Rpb24gVW0oZSl7c3dpdGNoKGUpe2Nhc2UgdHQuZHJhZnQwNDpyZXR1cm4gbmV3IFhPO2Nhc2UgdHQuZHJhZnQwNzpyZXR1cm4gbmV3IFZtO2Nhc2UgdHQuZHJhZnQyMDE5OnJldHVybiBuZXcgJHc7Y2FzZSB0dC5kcmFmdDIwMjA6cmV0dXJuIG5ldyBZTztkZWZhdWx0OnJldHVybiBuZXcgVm19fXZhciBiaT1jbGFzc3tjb25zdHJ1Y3RvcihlLHQsbixyKXt0aGlzLm9mZnNldD1uLHRoaXMubGVuZ3RoPXIsdGhpcy5wYXJlbnQ9ZSx0aGlzLmludGVybmFsTm9kZT10fWdldE5vZGVGcm9tT2Zmc2V0RW5kSW5jbHVzaXZlKGUpe2NvbnN0IHQ9W10sbj1vPT57aWYoZT49by5vZmZzZXQmJmU8PW8ub2Zmc2V0K28ubGVuZ3RoKXtjb25zdCBhPW8uY2hpbGRyZW47Zm9yKGxldCB1PTA7dTxhLmxlbmd0aCYmYVt1XS5vZmZzZXQ8PWU7dSsrKXtjb25zdCBsPW4oYVt1XSk7bCYmdC5wdXNoKGwpfXJldHVybiBvfXJldHVybiBudWxsfSxyPW4odGhpcyk7bGV0IHM9TnVtYmVyLk1BWF9WQUxVRSxpPW51bGw7Zm9yKGNvbnN0IG8gb2YgdCl7Y29uc3QgYT1vLmxlbmd0aCtvLm9mZnNldC1lKyhlLW8ub2Zmc2V0KTthPHMmJihpPW8scz1hKX1yZXR1cm4gaXx8cn1nZXQgY2hpbGRyZW4oKXtyZXR1cm5bXX10b1N0cmluZygpe3JldHVybiJ0eXBlOiAiK3RoaXMudHlwZSsiICgiK3RoaXMub2Zmc2V0KyIvIit0aGlzLmxlbmd0aCsiKSIrKHRoaXMucGFyZW50PyIgcGFyZW50OiB7Iit0aGlzLnBhcmVudC50b1N0cmluZygpKyJ9IjoiIil9fSxRTz1jbGFzcyBleHRlbmRzIGJpe2NvbnN0cnVjdG9yKGUsdCxuLHIpe3N1cGVyKGUsdCxuLHIpLHRoaXMudHlwZT0ibnVsbCIsdGhpcy52YWx1ZT1udWxsfX0sWk89Y2xhc3MgZXh0ZW5kcyBiaXtjb25zdHJ1Y3RvcihlLHQsbixyLHMsaSl7c3VwZXIoZSx0LHMsaSksdGhpcy50eXBlPSJib29sZWFuIix0aGlzLnZhbHVlPW4sdGhpcy5zb3VyY2U9cn19LGVSPWNsYXNzIGV4dGVuZHMgYml7Y29uc3RydWN0b3IoZSx0LG4scil7c3VwZXIoZSx0LG4sciksdGhpcy50eXBlPSJhcnJheSIsdGhpcy5pdGVtcz1bXX1nZXQgY2hpbGRyZW4oKXtyZXR1cm4gdGhpcy5pdGVtc319LHRSPWNsYXNzIGV4dGVuZHMgYml7Y29uc3RydWN0b3IoZSx0LG4scil7c3VwZXIoZSx0LG4sciksdGhpcy50eXBlPSJudW1iZXIiLHRoaXMuaXNJbnRlZ2VyPSEwLHRoaXMudmFsdWU9TnVtYmVyLk5hTn19LFFjPWNsYXNzIGV4dGVuZHMgYml7Y29uc3RydWN0b3IoZSx0LG4scil7c3VwZXIoZSx0LG4sciksdGhpcy50eXBlPSJzdHJpbmciLHRoaXMudmFsdWU9IiJ9fSxuUj1jbGFzcyBleHRlbmRzIGJpe2NvbnN0cnVjdG9yKGUsdCxuLHIpe3N1cGVyKGUsdCxuLHIpLHRoaXMudHlwZT0icHJvcGVydHkiLHRoaXMuY29sb25PZmZzZXQ9LTF9Z2V0IGNoaWxkcmVuKCl7cmV0dXJuIHRoaXMudmFsdWVOb2RlP1t0aGlzLmtleU5vZGUsdGhpcy52YWx1ZU5vZGVdOlt0aGlzLmtleU5vZGVdfX0sclI9Y2xhc3MgZXh0ZW5kcyBiaXtjb25zdHJ1Y3RvcihlLHQsbixyKXtzdXBlcihlLHQsbixyKSx0aGlzLnR5cGU9Im9iamVjdCIsdGhpcy5wcm9wZXJ0aWVzPVtdfWdldCBjaGlsZHJlbigpe3JldHVybiB0aGlzLnByb3BlcnRpZXN9fSxCdzsoZnVuY3Rpb24oZSl7ZVtlLktleT0wXT0iS2V5IixlW2UuRW51bT0xXT0iRW51bSJ9KShCd3x8KEJ3PXt9KSk7dmFyIHNSPWNsYXNze2NvbnN0cnVjdG9yKGUsdD1bXSxuPVtdKXt0aGlzLnJvb3Q9ZSx0aGlzLnN5bnRheEVycm9ycz10LHRoaXMuY29tbWVudHM9bn1nZXROb2RlRnJvbU9mZnNldChlLHQ9ITEpe2lmKHRoaXMucm9vdClyZXR1cm4gRXcodGhpcy5yb290LGUsdCl9Z2V0Tm9kZUZyb21PZmZzZXRFbmRJbmNsdXNpdmUoZSl7cmV0dXJuIHRoaXMucm9vdCYmdGhpcy5yb290LmdldE5vZGVGcm9tT2Zmc2V0RW5kSW5jbHVzaXZlKGUpfXZpc2l0KGUpe2lmKHRoaXMucm9vdCl7Y29uc3QgdD1uPT57bGV0IHI9ZShuKTtjb25zdCBzPW4uY2hpbGRyZW47aWYoQXJyYXkuaXNBcnJheShzKSlmb3IobGV0IGk9MDtpPHMubGVuZ3RoJiZyO2krKylyPXQoc1tpXSk7cmV0dXJuIHJ9O3QodGhpcy5yb290KX19dmFsaWRhdGUoZSx0KXtyZXR1cm4hdGhpcy5yb290fHwhdD9udWxsOlVtKHQuX2RpYWxlY3QpLnZhbGlkYXRlRG9jdW1lbnQodGhpcy5yb290LGUsdCx7aXNLdWJlcm5ldGVzOnRoaXMuaXNLdWJlcm5ldGVzLGRpc2FibGVBZGRpdGlvbmFsUHJvcGVydGllczp0aGlzLmRpc2FibGVBZGRpdGlvbmFsUHJvcGVydGllcyx1cmk6dGhpcy51cml9KX1nZXRNYXRjaGluZ1NjaGVtYXMoZSx0PS0xLG49bnVsbCxyKXtyZXR1cm4hdGhpcy5yb290fHwhZT9bXTpVbShlLl9kaWFsZWN0KS5nZXRNYXRjaGluZ1NjaGVtYXModGhpcy5yb290LGUse2lzS3ViZXJuZXRlczp0aGlzLmlzS3ViZXJuZXRlcyxkaXNhYmxlQWRkaXRpb25hbFByb3BlcnRpZXM6dGhpcy5kaXNhYmxlQWRkaXRpb25hbFByb3BlcnRpZXMsdXJpOnRoaXMudXJpLGNhbGxGcm9tQXV0b0NvbXBsZXRlOnJ9LHQsbil9fSxxcj17bWF4UmVmQ291bnQ6MWUzLGN1cnJlbnRSZWZEZXB0aDowLGFsaWFzUmVzb2x1dGlvbkNhY2hlOm5ldyBNYXB9O2Z1bmN0aW9uIFVvKGUsdCxuLHIpe2lmKGV8fChxci5jdXJyZW50UmVmRGVwdGg9MCxxci5hbGlhc1Jlc29sdXRpb25DYWNoZT1uZXcgTWFwKSwhdClyZXR1cm4gbnVsbDtpZih6ZSh0KSlyZXR1cm4gaVIodCxlLG4scik7aWYoeWUodCkpcmV0dXJuIG9SKHQsZSxuLHIpO2lmKFJlKHQpKXJldHVybiBhUih0LGUsbixyKTtpZihaKHQpKXJldHVybiB1Uih0LGUpO2lmKE90KHQpJiZxci5jdXJyZW50UmVmRGVwdGg8cXIubWF4UmVmQ291bnQpcmV0dXJuIGxSKHQsZSxuLHIpfWZ1bmN0aW9uIGlSKGUsdCxuLHIpe2xldCBzO2UuZmxvdyYmIWUucmFuZ2U/cz1jUihlKTpzPWUucmFuZ2U7Y29uc3QgaT1uZXcgclIodCxlLC4uLl93KHMscikpO2Zvcihjb25zdCBvIG9mIGUuaXRlbXMpeWUobykmJmkucHJvcGVydGllcy5wdXNoKFVvKGksbyxuLHIpKTtyZXR1cm4gaX1mdW5jdGlvbiBvUihlLHQsbixyKXtjb25zdCBzPWUua2V5LGk9ZS52YWx1ZSxvPXMucmFuZ2VbMF07bGV0IGE9cy5yYW5nZVsxXSx1PXMucmFuZ2VbMl07aSYmKGE9aS5yYW5nZVsxXSx1PWkucmFuZ2VbMl0pO2NvbnN0IGw9bmV3IG5SKHQsZSwuLi5fdyhbbyxhLHVdLHIpKTtpZihPdChzKSl7Y29uc3QgZj1uZXcgUWModCxzLC4uLiRzKHMucmFuZ2UpKTtmLnZhbHVlPXMuc291cmNlLGwua2V5Tm9kZT1mfWVsc2UgbC5rZXlOb2RlPVVvKGwscyxuLHIpO3JldHVybiBsLnZhbHVlTm9kZT1VbyhsLGksbixyKSxsfWZ1bmN0aW9uIGFSKGUsdCxuLHIpe2NvbnN0IHM9bmV3IGVSKHQsZSwuLi4kcyhlLnJhbmdlKSk7Zm9yKGNvbnN0IGkgb2YgZS5pdGVtcylpZihnZShpKSl7Y29uc3Qgbz1VbyhzLGksbixyKTtvJiZzLmNoaWxkcmVuLnB1c2gobyl9cmV0dXJuIHN9ZnVuY3Rpb24gdVIoZSx0KXtpZihlLnZhbHVlPT09bnVsbClyZXR1cm4gbmV3IFFPKHQsZSwuLi4kcyhlLnJhbmdlKSk7c3dpdGNoKHR5cGVvZiBlLnZhbHVlKXtjYXNlInN0cmluZyI6e2NvbnN0IG49bmV3IFFjKHQsZSwuLi4kcyhlLnJhbmdlKSk7cmV0dXJuIG4udmFsdWU9ZS52YWx1ZSxufWNhc2UiYm9vbGVhbiI6cmV0dXJuIG5ldyBaTyh0LGUsZS52YWx1ZSxlLnNvdXJjZSwuLi4kcyhlLnJhbmdlKSk7Y2FzZSJudW1iZXIiOntjb25zdCBuPW5ldyB0Uih0LGUsLi4uJHMoZS5yYW5nZSkpO3JldHVybiBuLnZhbHVlPWUudmFsdWUsbi5pc0ludGVnZXI9TnVtYmVyLmlzSW50ZWdlcihuLnZhbHVlKSxufWRlZmF1bHQ6e2NvbnN0IG49bmV3IFFjKHQsZSwuLi4kcyhlLnJhbmdlKSk7cmV0dXJuIG4udmFsdWU9ZS5zb3VyY2Usbn19fWZ1bmN0aW9uIGxSKGUsdCxuLHIpe2lmKHFyLmFsaWFzUmVzb2x1dGlvbkNhY2hlLmhhcyhlKSlyZXR1cm4gcXIuYWxpYXNSZXNvbHV0aW9uQ2FjaGUuZ2V0KGUpO3FyLmN1cnJlbnRSZWZEZXB0aCsrO2NvbnN0IHM9ZS5yZXNvbHZlKG4pO2xldCBpO2lmKHMpaT1Vbyh0LHMsbixyKTtlbHNle2NvbnN0IG89bmV3IFFjKHQsZSwuLi4kcyhlLnJhbmdlKSk7by52YWx1ZT1lLnNvdXJjZSxpPW99cmV0dXJuIHFyLmN1cnJlbnRSZWZEZXB0aC0tLHFyLmFsaWFzUmVzb2x1dGlvbkNhY2hlLnNldChlLGkpLGl9ZnVuY3Rpb24gJHMoZSl7cmV0dXJuW2VbMF0sZVsxXS1lWzBdXX1mdW5jdGlvbiBfdyhlLHQpe2NvbnN0IG49dC5saW5lUG9zKGVbMF0pLHI9dC5saW5lUG9zKGVbMV0pLHM9W2VbMF0sZVsxXS1lWzBdXTtyZXR1cm4gbi5saW5lIT09ci5saW5lJiYodC5saW5lU3RhcnRzLmxlbmd0aCE9PXIubGluZXx8ci5jb2w9PT0xKSYmc1sxXS0tLHN9ZnVuY3Rpb24gY1IoZSl7bGV0IHQ9TnVtYmVyLk1BWF9TQUZFX0lOVEVHRVIsbj0wO2Zvcihjb25zdCByIG9mIGUuaXRlbXMpeWUocikmJihnZShyLmtleSkmJnIua2V5LnJhbmdlJiZyLmtleS5yYW5nZVswXTw9dCYmKHQ9ci5rZXkucmFuZ2VbMF0pLGdlKHIudmFsdWUpJiZyLnZhbHVlLnJhbmdlJiZyLnZhbHVlLnJhbmdlWzJdPj1uJiYobj1yLnZhbHVlLnJhbmdlWzJdKSk7cmV0dXJuW3QsbixuXX1mdW5jdGlvbiBmUihlLHQpe2xldCBuO2lmKGJlKGUsKHIscyxpKT0+e2lmKHM9PT10KXJldHVybiBuPWlbaS5sZW5ndGgtMV0sYmUuQlJFQUt9KSwhSGkobikpcmV0dXJuIG59ZnVuY3Rpb24gcFIoZSl7aWYoZS5pdGVtcy5sZW5ndGg+MSlyZXR1cm4hMTtjb25zdCB0PWUuaXRlbXNbMF07cmV0dXJuIFoodC5rZXkpJiZaKHQudmFsdWUpJiZ0LmtleS52YWx1ZT09PSIiJiYhdC52YWx1ZS52YWx1ZX1mdW5jdGlvbiBoUihlLHQpe2Zvcihjb25zdFtuLHJdb2YgZS5pdGVtcy5lbnRyaWVzKCkpaWYodD09PXIpcmV0dXJuIG59ZnVuY3Rpb24gZFIoZSx0KXtsZXQgbj0hMTtmb3IoY29uc3QgciBvZiBlKXtpZihyLnR5cGU9PT0iZG9jdW1lbnQiKVdtKFtdLHIscz0+e3ZhciBpO2lmKHFtKHMpJiYoKGk9cy52YWx1ZSk9PW51bGw/dm9pZCAwOmkudHlwZSk9PT0iY29tbWVudCIpe2lmKHIub2Zmc2V0PD10JiZzLnZhbHVlLnNvdXJjZS5sZW5ndGgrcy52YWx1ZS5vZmZzZXQ+PXQpcmV0dXJuIG49ITAsYmUuQlJFQUt9ZWxzZSBpZihzLnR5cGU9PT0iY29tbWVudCImJnMub2Zmc2V0PD10JiZzLm9mZnNldCtzLnNvdXJjZS5sZW5ndGg+PXQpcmV0dXJuIG49ITAsYmUuQlJFQUt9KTtlbHNlIGlmKHIudHlwZT09PSJjb21tZW50IiYmci5vZmZzZXQ8PXQmJnIuc291cmNlLmxlbmd0aCtyLm9mZnNldD49dClyZXR1cm4hMDtpZihuKWJyZWFrfXJldHVybiBufWZ1bmN0aW9uIHFtKGUpe3JldHVybiBlLnN0YXJ0IT09dm9pZCAwfWZ1bmN0aW9uIFdtKGUsdCxuKXtsZXQgcj1uKHQsZSk7aWYodHlwZW9mIHI9PSJzeW1ib2wiKXJldHVybiByO2Zvcihjb25zdCBpIG9mWyJrZXkiLCJ2YWx1ZSJdKXtjb25zdCBvPXRbaV07aWYobyYmIml0ZW1zImluIG8pe2ZvcihsZXQgYT0wO2E8by5pdGVtcy5sZW5ndGg7KythKXtjb25zdCB1PVdtKE9iamVjdC5mcmVlemUoZS5jb25jYXQoW1tpLGFdXSkpLG8uaXRlbXNbYV0sbik7aWYodHlwZW9mIHU9PSJudW1iZXIiKWE9dS0xO2Vsc2V7aWYodT09PWJlLkJSRUFLKXJldHVybiBiZS5CUkVBSzt1PT09YmUuUkVNT1ZFJiYoby5pdGVtcy5zcGxpY2UoYSwxKSxhLT0xKX19dHlwZW9mIHI9PSJmdW5jdGlvbiImJmk9PT0ia2V5IiYmKHI9cih0LGUpKX19Y29uc3Qgcz10LnNlcDtpZihzKWZvcihsZXQgaT0wO2k8cy5sZW5ndGg7KytpKXtjb25zdCBvPVdtKE9iamVjdC5mcmVlemUoZSksc1tpXSxuKTtpZih0eXBlb2Ygbz09Im51bWJlciIpaT1vLTE7ZWxzZXtpZihvPT09YmUuQlJFQUspcmV0dXJuIGJlLkJSRUFLO289PT1iZS5SRU1PVkUmJihzLml0ZW1zLnNwbGljZShpLDEpLGktPTEpfX1yZXR1cm4gdHlwZW9mIHI9PSJmdW5jdGlvbiI/cih0LGUpOnJ9dmFyIEhtPWNsYXNzIEVDIGV4dGVuZHMgc1J7Y29uc3RydWN0b3IodCl7c3VwZXIobnVsbCxbXSksdGhpcy5saW5lQ291bnRlcj10fWNsb25lKCl7Y29uc3QgdD1uZXcgRUModGhpcy5saW5lQ291bnRlcik7cmV0dXJuIHQuaXNLdWJlcm5ldGVzPXRoaXMuaXNLdWJlcm5ldGVzLHQuZGlzYWJsZUFkZGl0aW9uYWxQcm9wZXJ0aWVzPXRoaXMuZGlzYWJsZUFkZGl0aW9uYWxQcm9wZXJ0aWVzLHQudXJpPXRoaXMudXJpLHQuY3VycmVudERvY0luZGV4PXRoaXMuY3VycmVudERvY0luZGV4LHQuX2xpbmVDb21tZW50cz10aGlzLmxpbmVDb21tZW50cy5zbGljZSgpLHQuaW50ZXJuYWxEb2N1bWVudD10aGlzLl9pbnRlcm5hbERvY3VtZW50LmNsb25lKCksdH1jb2xsZWN0TGluZUNvbW1lbnRzKCl7dGhpcy5fbGluZUNvbW1lbnRzPVtdLHRoaXMuX2ludGVybmFsRG9jdW1lbnQuY29tbWVudEJlZm9yZSYmdGhpcy5faW50ZXJuYWxEb2N1bWVudC5jb21tZW50QmVmb3JlLnNwbGl0KGAKYCkuZm9yRWFjaChuPT50aGlzLl9saW5lQ29tbWVudHMucHVzaChgIyR7bn1gKSksYmUodGhpcy5pbnRlcm5hbERvY3VtZW50LCh0LG4pPT57biE9bnVsbCYmbi5jb21tZW50QmVmb3JlJiYobj09bnVsbD92b2lkIDA6bi5jb21tZW50QmVmb3JlLnNwbGl0KGAKYCkpLmZvckVhY2gocz0+dGhpcy5fbGluZUNvbW1lbnRzLnB1c2goYCMke3N9YCkpLG4hPW51bGwmJm4uY29tbWVudCYmdGhpcy5fbGluZUNvbW1lbnRzLnB1c2goYCMke24uY29tbWVudH1gKX0pLHRoaXMuX2ludGVybmFsRG9jdW1lbnQuY29tbWVudCYmdGhpcy5fbGluZUNvbW1lbnRzLnB1c2goYCMke3RoaXMuX2ludGVybmFsRG9jdW1lbnQuY29tbWVudH1gKX11cGRhdGVGcm9tSW50ZXJuYWxEb2N1bWVudCgpe3RoaXMucm9vdD1VbyhudWxsLHRoaXMuX2ludGVybmFsRG9jdW1lbnQuY29udGVudHMsdGhpcy5faW50ZXJuYWxEb2N1bWVudCx0aGlzLmxpbmVDb3VudGVyKX1zZXQgaW50ZXJuYWxEb2N1bWVudCh0KXt0aGlzLl9pbnRlcm5hbERvY3VtZW50PXQsdGhpcy51cGRhdGVGcm9tSW50ZXJuYWxEb2N1bWVudCgpfWdldCBpbnRlcm5hbERvY3VtZW50KCl7cmV0dXJuIHRoaXMuX2ludGVybmFsRG9jdW1lbnR9Z2V0IGxpbmVDb21tZW50cygpe3JldHVybiB0aGlzLl9saW5lQ29tbWVudHN8fHRoaXMuY29sbGVjdExpbmVDb21tZW50cygpLHRoaXMuX2xpbmVDb21tZW50c31zZXQgbGluZUNvbW1lbnRzKHQpe3RoaXMuX2xpbmVDb21tZW50cz10fWdldCBlcnJvcnMoKXtyZXR1cm4gdGhpcy5pbnRlcm5hbERvY3VtZW50LmVycm9ycy5tYXAoUHcpfWdldCB3YXJuaW5ncygpe3JldHVybiB0aGlzLmludGVybmFsRG9jdW1lbnQud2FybmluZ3MubWFwKFB3KX1nZXROb2RlRnJvbVBvc2l0aW9uKHQsbixyKXtjb25zdCBzPW4uZ2V0UG9zaXRpb24odCksaT1uLmdldExpbmVDb250ZW50KHMubGluZSk7aWYoaS50cmltKCkubGVuZ3RoPT09MClyZXR1cm5bdGhpcy5maW5kQ2xvc2VzdE5vZGUodCxuLHIpLCEwXTtjb25zdCBhPWkuc3Vic3RyaW5nKHMuY2hhcmFjdGVyKS5tYXRjaCgvXihbIF0rKVxuPyQvKSx1PSEhYSxsPWE9PW51bGw/dm9pZCAwOmFbMV0ubGVuZ3RoO2xldCBmO3JldHVybiBiZSh0aGlzLmludGVybmFsRG9jdW1lbnQsKGMscCk9PntpZighcClyZXR1cm47Y29uc3QgaD1wLnJhbmdlO2lmKCFoKXJldHVybjtjb25zdCBkPSgpPT51JiZ0K2w9PT1oWzJdJiZaKHApJiZwLnZhbHVlPT09bnVsbDtpZihoWzBdPD10JiZoWzFdPj10fHxkKCkpZj1wO2Vsc2UgcmV0dXJuIGJlLlNLSVB9KSxbZiwhMV19ZmluZENsb3Nlc3ROb2RlKHQsbixyKXtsZXQgcz10aGlzLmludGVybmFsRG9jdW1lbnQucmFuZ2VbMl0saT10aGlzLmludGVybmFsRG9jdW1lbnQucmFuZ2VbMF0sbztiZSh0aGlzLmludGVybmFsRG9jdW1lbnQsKGYsYyk9PntpZighYylyZXR1cm47Y29uc3QgcD1jLnJhbmdlO2lmKCFwKXJldHVybjtjb25zdCBoPXBbMV0tdDtpPD1wWzBdJiZoPD0wJiZNYXRoLmFicyhoKTw9cyYmKHM9TWF0aC5hYnMoaCksaT1wWzBdLG89Yyl9KTtjb25zdCBhPW4uZ2V0UG9zaXRpb24odCksdT1uLmdldExpbmVDb250ZW50KGEubGluZSksbD1OTyh1LGEuY2hhcmFjdGVyKTtyZXR1cm4gWihvKSYmby52YWx1ZT09PW51bGx8fGw9PT1hLmNoYXJhY3RlciYmKG89dGhpcy5nZXRQcm9wZXJQYXJlbnRCeUluZGVudGF0aW9uKGwsbyxuLCIiLHIpKSxvfWdldFByb3BlclBhcmVudEJ5SW5kZW50YXRpb24odCxuLHIscyxpLG8pe2lmKCFuKXJldHVybiB0aGlzLmludGVybmFsRG9jdW1lbnQuY29udGVudHM7aWYoaT1pfHwyLGdlKG4pJiZuLnJhbmdlKXtjb25zdCBhPXIuZ2V0UG9zaXRpb24obi5yYW5nZVswXSksdT1yLmdldExpbmVDb250ZW50KGEubGluZSk7aWYocz1zPT09IiI/dS50cmltKCk6cyxzLnN0YXJ0c1dpdGgoIi0iKSYmdD09PWkmJnM9PT11LnRyaW0oKSYmKGEuY2hhcmFjdGVyKz10KSxhLmNoYXJhY3Rlcj50JiZhLmNoYXJhY3Rlcj4wKXtjb25zdCBsPXRoaXMuZ2V0UGFyZW50KG4pO2lmKGwpcmV0dXJuIHRoaXMuZ2V0UHJvcGVyUGFyZW50QnlJbmRlbnRhdGlvbih0LGwscixzLGksbyl9ZWxzZSBpZihhLmNoYXJhY3Rlcjx0KXtjb25zdCBsPXRoaXMuZ2V0UGFyZW50KG4pO2lmKHllKGwpJiZnZShsLnZhbHVlKSlyZXR1cm4gbC52YWx1ZTtpZih5ZShvKSYmZ2Uoby52YWx1ZSkpcmV0dXJuIG8udmFsdWV9ZWxzZSByZXR1cm4gbn1lbHNlIGlmKHllKG4pKXtvPW47Y29uc3QgYT10aGlzLmdldFBhcmVudChuKTtyZXR1cm4gdGhpcy5nZXRQcm9wZXJQYXJlbnRCeUluZGVudGF0aW9uKHQsYSxyLHMsaSxvKX1yZXR1cm4gbn1nZXRQYXJlbnQodCl7cmV0dXJuIGZSKHRoaXMuaW50ZXJuYWxEb2N1bWVudCx0KX19LEl3PWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy5kb2N1bWVudHM9ZSx0aGlzLnRva2Vucz10LHRoaXMuZXJyb3JzPVtdLHRoaXMud2FybmluZ3M9W119fSxtUj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMuY2FjaGU9bmV3IE1hcH1nZXRZYW1sRG9jdW1lbnQoZSx0LG49ITEpe3JldHVybiB0aGlzLmVuc3VyZUNhY2hlKGUsdD8/WmMsbiksdGhpcy5jYWNoZS5nZXQoZS51cmkpLmRvY3VtZW50fWNsZWFyKCl7dGhpcy5jYWNoZS5jbGVhcigpfWVuc3VyZUNhY2hlKGUsdCxuKXtjb25zdCByPWUudXJpO3RoaXMuY2FjaGUuaGFzKHIpfHx0aGlzLmNhY2hlLnNldChyLHt2ZXJzaW9uOi0xLGRvY3VtZW50Om5ldyBJdyhbXSxbXSkscGFyc2VyT3B0aW9uczpaY30pO2NvbnN0IHM9dGhpcy5jYWNoZS5nZXQocik7aWYocy52ZXJzaW9uIT09ZS52ZXJzaW9ufHx0LmN1c3RvbVRhZ3MmJiF3dyhzLnBhcnNlck9wdGlvbnMuY3VzdG9tVGFncyx0LmN1c3RvbVRhZ3MpKXtsZXQgaT1lLmdldFRleHQoKTtuJiYhL1xTLy50ZXN0KGkpJiYoaT1geyR7aX19YCk7Y29uc3Qgbz1iUihpLHQsZSk7cy5kb2N1bWVudD1vLHMudmVyc2lvbj1lLnZlcnNpb24scy5wYXJzZXJPcHRpb25zPXR9fX0sb249bmV3IG1SO2Z1bmN0aW9uIFB3KGUpe3JldHVybnttZXNzYWdlOmUubWVzc2FnZSxsb2NhdGlvbjp7c3RhcnQ6ZS5wb3NbMF0sZW5kOmUucG9zWzFdLHRvTGluZUVuZDohMH0sc2V2ZXJpdHk6MSxjb2RlOkF0LlVuZGVmaW5lZH19dmFyIGdSPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50YWc9ZSx0aGlzLnR5cGU9dH1nZXQgY29sbGVjdGlvbigpe2lmKHRoaXMudHlwZT09PSJtYXBwaW5nIilyZXR1cm4ibWFwIjtpZih0aGlzLnR5cGU9PT0ic2VxdWVuY2UiKXJldHVybiJzZXEifXJlc29sdmUoZSl7aWYoemUoZSkmJnRoaXMudHlwZT09PSJtYXBwaW5nInx8UmUoZSkmJnRoaXMudHlwZT09PSJzZXF1ZW5jZSJ8fHR5cGVvZiBlPT0ic3RyaW5nIiYmdGhpcy50eXBlPT09InNjYWxhciIpcmV0dXJuIGV9fSx5Uj1jbGFzc3tjb25zdHJ1Y3Rvcigpe3RoaXMudGFnPSIhaW5jbHVkZSIsdGhpcy50eXBlPSJzY2FsYXIifXJlc29sdmUoZSx0KXtpZihlJiZlLmxlbmd0aD4wJiZlLnRyaW0oKSlyZXR1cm4gZTt0KCIhaW5jbHVkZSB3aXRob3V0IHZhbHVlIil9fTtmdW5jdGlvbiBEUihlKXtjb25zdCB0PVtdLG49QXcoZSk7Zm9yKGNvbnN0IHIgb2Ygbil7Y29uc3Qgcz1yLnNwbGl0KCIgIiksaT1zWzBdLG89c1sxXSYmc1sxXS50b0xvd2VyQ2FzZSgpfHwic2NhbGFyIjt0LnB1c2gobmV3IGdSKGksbykpfXJldHVybiB0LnB1c2gobmV3IHlSKSx0fXZhciBXcj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLmRvYz1lfWdldExpbmVDb3VudCgpe3JldHVybiB0aGlzLmRvYy5saW5lQ291bnR9Z2V0TGluZUxlbmd0aChlKXtjb25zdCB0PXRoaXMuZG9jLmdldExpbmVPZmZzZXRzKCk7cmV0dXJuIGU+PXQubGVuZ3RoP3RoaXMuZG9jLmdldFRleHQoKS5sZW5ndGg6ZTwwPzA6KGUrMTx0Lmxlbmd0aD90W2UrMV06dGhpcy5kb2MuZ2V0VGV4dCgpLmxlbmd0aCktdFtlXX1nZXRMaW5lQ29udGVudChlKXtjb25zdCB0PXRoaXMuZG9jLmdldExpbmVPZmZzZXRzKCk7aWYoZT49dC5sZW5ndGgpcmV0dXJuIHRoaXMuZG9jLmdldFRleHQoKTtpZihlPDApcmV0dXJuIiI7Y29uc3Qgbj1lKzE8dC5sZW5ndGg/dFtlKzFdOnRoaXMuZG9jLmdldFRleHQoKS5sZW5ndGg7cmV0dXJuIHRoaXMuZG9jLmdldFRleHQoKS5zdWJzdHJpbmcodFtlXSxuKX1nZXRMaW5lQ2hhckNvZGUoZSx0KXtyZXR1cm4gdGhpcy5kb2MuZ2V0VGV4dChZLmNyZWF0ZShlLTEsdCxlLTEsdCsxKSkuY2hhckNvZGVBdCgwKX1nZXRUZXh0KGUpe3JldHVybiB0aGlzLmRvYy5nZXRUZXh0KGUpfWdldFBvc2l0aW9uKGUpe3JldHVybiB0aGlzLmRvYy5wb3NpdGlvbkF0KGUpfX0sWmM9e2N1c3RvbVRhZ3M6W10seWFtbFZlcnNpb246IjEuMiJ9O2Z1bmN0aW9uIGJSKGUsdD1aYyxuKXtjb25zdCByPXtzdHJpY3Q6ITEsY3VzdG9tVGFnczpEUih0LmN1c3RvbVRhZ3MpLHZlcnNpb246dC55YW1sVmVyc2lvbj8/WmMueWFtbFZlcnNpb24sa2VlcFNvdXJjZVRva2VuczohMH0scz1uZXcgY0QociksaT1uZXcgREQ7bGV0IG89ITE7aWYobil7Y29uc3QgcD1uZXcgV3IobiksaD1wLmdldFBvc2l0aW9uKGUubGVuZ3RoKTtvPXAuZ2V0TGluZUNvbnRlbnQoaC5saW5lKS50cmltKCkubGVuZ3RoPT09MH1jb25zdCB1PShvP25ldyByaDpuZXcgcmgoaS5hZGROZXdMaW5lKSkucGFyc2UoZSksbD1BcnJheS5mcm9tKHUpLGY9cy5jb21wb3NlKGwsITAsZS5sZW5ndGgpLGM9QXJyYXkuZnJvbShmLHA9PkVSKHAsaSkpO3JldHVybiBuZXcgSXcoYyxsKX1mdW5jdGlvbiBFUihlLHQpe2NvbnN0IG49bmV3IEhtKHQpO3JldHVybiBuLmludGVybmFsRG9jdW1lbnQ9ZSxufWZ1bmN0aW9uIHZSKGUpe2lmKGUgaW5zdGFuY2VvZiBIbSl7Y29uc3QgdD1lLmxpbmVDb21tZW50cy5maW5kKG49PkptKG4pKTtpZih0IT1udWxsKXtjb25zdCBuPXQubWF0Y2goL1wkc2NoZW1hKD86PXw6XHMqKShcUyspLyk7aWYobiE9PW51bGwmJm4ubGVuZ3RoPT09MilyZXR1cm4gblsxXX19fWZ1bmN0aW9uIEptKGUpe2NvbnN0IHQ9ZS5tYXRjaCgvXiNccysoPzp5YW1sLWxhbmd1YWdlLXNlcnZlclxzKjp8XCRzY2hlbWE6KS9nKTtyZXR1cm4gdCE9PW51bGwmJnQubGVuZ3RoPT09MX1mdW5jdGlvbiBGUigpe3JldHVybiEwfXZhciBlZj1jbGFzc3tjb21waWxlKCl7cmV0dXJuIEZSfWRlZmF1bHRNZXRhKCl7cmV0dXJuImh0dHA6Ly9qc29uLXNjaGVtYS5vcmcvZHJhZnQtMDcvc2NoZW1hIn19LEFSPWNsYXNzIGV4dGVuZHMgZWZ7ZGVmYXVsdE1ldGEoKXtyZXR1cm4iaHR0cDovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC0wNC9zY2hlbWEifX0sd1I9Y2xhc3MgZXh0ZW5kcyBlZntkZWZhdWx0TWV0YSgpe3JldHVybiJodHRwczovL2pzb24tc2NoZW1hLm9yZy9kcmFmdC8yMDE5LTA5L3NjaGVtYSJ9fSxDUj1jbGFzcyBleHRlbmRzIGVme2RlZmF1bHRNZXRhKCl7cmV0dXJuImh0dHBzOi8vanNvbi1zY2hlbWEub3JnL2RyYWZ0LzIwMjAtMTIvc2NoZW1hIn19LE13PSJodHRwczovL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20veWFubmgva3ViZXJuZXRlcy1qc29uLXNjaGVtYS9tYXN0ZXIvdjEuMzIuMS1zdGFuZGFsb25lLXN0cmljdC8iLE93PU13KyJhbGwuanNvbiIsU1I9Imh0dHBzOi8vcmF3LmdpdGh1YnVzZXJjb250ZW50LmNvbS9kYXRyZWVpby9DUkRzLWNhdGFsb2cvbWFpbiI7ZnVuY3Rpb24geFIoZSl7Y29uc3QgdD1uZXcgTWFwO3JldHVybiBlJiYoZS51cmw/ZS51cmwuc3RhcnRzV2l0aCgic2NoZW1hc2VydmljZTovL2NvbWJpbmVkU2NoZW1hLyIpP1J3KGUsdCk6dC5zZXQoZS51cmwsZSk6UncoZSx0KSksdH1mdW5jdGlvbiBSdyhlLHQpe2UuYWxsT2YmJnptKGUuYWxsT2YsdCksZS5hbnlPZiYmem0oZS5hbnlPZix0KSxlLm9uZU9mJiZ6bShlLm9uZU9mLHQpfWZ1bmN0aW9uIHptKGUsdCl7Zm9yKGNvbnN0IG4gb2YgZSkham8obikmJm4udXJsJiYhdC5oYXMobi51cmwpJiZ0LnNldChuLnVybCxuKX1mdW5jdGlvbiBrUihlLHQsbil7Y29uc3Qgcj1MUihlKTtpZighcnx8IXIuZ3JvdXB8fCFyLnZlcnNpb258fCFyLmtpbmQpcmV0dXJuO2NvbnN0IHM9VFIocix0KTtpZihzKXJldHVybiBzO2NvbnN0IGk9TlIocixuKTtpZihpKXJldHVybiBpfWZ1bmN0aW9uIFRSKGUsdCl7Y29uc3R7Z3JvdXA6bix2ZXJzaW9uOnIsa2luZDpzfT1lLG89YGlvLms4cy5hcGkuJHtuLnJlcGxhY2UoIi5rOHMuaW8iLCIiKS5yZXBsYWNlKCJyYmFjLmF1dGhvcml6YXRpb24iLCJyYmFjIikudG9Mb3dlckNhc2UoKX0uJHtyLnRvTG93ZXJDYXNlKCl9LiR7cy50b0xvd2VyQ2FzZSgpfWAsdT0odC5zY2hlbWEub25lT2Z8fFtdKS5tYXAobD0+e2lmKHR5cGVvZiBsIT0iYm9vbGVhbiIpcmV0dXJuIGwuXyRyZWZ8fGwuJHJlZn0pLmZpbmQobD0+bD9sLnJlcGxhY2UoIl9kZWZpbml0aW9ucy5qc29uIy9kZWZpbml0aW9ucy8iLCIiKS50b0xvd2VyQ2FzZSgpPT09bzohMSk7aWYodSlyZXR1cm4gTXcrdX1mdW5jdGlvbiBOUihlLHQpe2NvbnN0e2dyb3VwOm4sdmVyc2lvbjpyLGtpbmQ6c309ZTtyZXR1cm5gaW8uazhzLmFwaS4ke24ucmVwbGFjZSgiLms4cy5pbyIsIiIpLnJlcGxhY2UoInJiYWMuYXV0aG9yaXphdGlvbiIsInJiYWMiKS50b0xvd2VyQ2FzZSgpfS4ke3IudG9Mb3dlckNhc2UoKX0uJHtzLnRvTG93ZXJDYXNlKCl9YC5pbmNsdWRlcygib3BlbnNoaWZ0LmlvIik/YCR7dH0vb3BlbnNoaWZ0L3Y0LjE1LXN0cmljdC8ke3MudG9Mb3dlckNhc2UoKX1fJHtuLnRvTG93ZXJDYXNlKCl9XyR7ci50b0xvd2VyQ2FzZSgpfS5qc29uYDpgJHt0fS8ke24udG9Mb3dlckNhc2UoKX0vJHtzLnRvTG93ZXJDYXNlKCl9XyR7ci50b0xvd2VyQ2FzZSgpfS5qc29uYH1mdW5jdGlvbiBMUihlKXtpZihlIGluc3RhbmNlb2YgSG0pdHJ5e2NvbnN0IHQ9ZS5yb290LmludGVybmFsTm9kZS50b0pTT04oKTtpZighdClyZXR1cm47Y29uc3Qgbj10LmFwaVZlcnNpb247aWYoIW4pcmV0dXJuO2NvbnN0W3Isc109bi5zcGxpdCgiLyIpO2lmKCFyfHwhcylyZXR1cm47Y29uc3QgaT10LmtpbmQ7cmV0dXJuIGk/e2dyb3VwOnIsdmVyc2lvbjpzLGtpbmQ6aX06dm9pZCAwfWNhdGNoKHQpe2NvbnNvbGUuZXJyb3IoIkVycm9yIHBhcnNpbmcgWUFNTCBkb2N1bWVudDoiLHQpO3JldHVybn19dmFyIGp3PW5ldyBBUih7YWxsRXJyb3JzOiEwfSksVnc9bmV3IGVmKHthbGxFcnJvcnM6ITB9KSxVdz1uZXcgd1Ioe2FsbEVycm9yczohMH0pLHF3PW5ldyBDUih7YWxsRXJyb3JzOiEwfSksJFI9V2MoKSxCUj12b2lkIDAsX1I9V2MoKSxJUj1XYygpLHRmPVdjKCksUFI9ancuY29tcGlsZSgkUiksTVI9VncuY29tcGlsZShCUiksT1I9VXcuY29tcGlsZShfUiksUlI9cXcuY29tcGlsZShJUiksV3c9bmV3IE1hcCxHbT1uZXcgTWFwLGpSPW5ldyBNYXAoW1siemgtY24iLCJ6aCJdLFsiemgtdHciLCJ6aC1UVyJdXSksS209bmV3IFNldChbIiRyZWYiLCJfJHJlZiIsIiRzY2hlbWEiLCIkaWQiLCJpZCIsIl9iYXNlVXJpIiwiX3NvdXJjZVVyaSIsIl9kaWFsZWN0IiwiJGFuY2hvciIsIiRkeW5hbWljQW5jaG9yIiwiJGR5bmFtaWNSZWYiLCIkcmVjdXJzaXZlQW5jaG9yIiwiJHJlY3Vyc2l2ZVJlZiIsImRlZmluaXRpb25zIiwiJGRlZnMiLCIkY29tbWVudCIsInRpdGxlIiwiZGVzY3JpcHRpb24iLCJtYXJrZG93bkRlc2NyaXB0aW9uIiwiJHZvY2FidWxhcnkiLCJleGFtcGxlcyIsImRlZmF1bHQiLCJ1cmwiLCJjbG9zZXN0VGl0bGUiLCJ1bmV2YWx1YXRlZFByb3BlcnRpZXMiLCJ1bmV2YWx1YXRlZEl0ZW1zIl0pLEh3OyhmdW5jdGlvbihlKXtlW2UuZGVsZXRlPTBdPSJkZWxldGUiLGVbZS5hZGQ9MV09ImFkZCIsZVtlLmRlbGV0ZUFsbD0yXT0iZGVsZXRlQWxsIn0pKEh3fHwoSHc9e30pKTt2YXIgVlI9Y2xhc3MgZXh0ZW5kcyBBT3tjb25zdHJ1Y3RvcihlLHQsbixyKXtzdXBlcihlLHQsbiksdGhpcy5zY2hlbWFVcmlUb05hbWVBbmREZXNjcmlwdGlvbj1uZXcgTWFwLHRoaXMuY3VzdG9tU2NoZW1hUHJvdmlkZXI9dm9pZCAwLHRoaXMucmVxdWVzdFNlcnZpY2U9ZSx0aGlzLnNjaGVtYVByaW9yaXR5TWFwcGluZz1uZXcgTWFwLHRoaXMueWFtbFNldHRpbmdzPXJ9cmVnaXN0ZXJDdXN0b21TY2hlbWFQcm92aWRlcihlKXt0aGlzLmN1c3RvbVNjaGVtYVByb3ZpZGVyPWV9Z2V0QWxsU2NoZW1hcygpe2NvbnN0IGU9W10sdD1uZXcgU2V0O2Zvcihjb25zdCBuIG9mIHRoaXMuZmlsZVBhdHRlcm5Bc3NvY2lhdGlvbnMpe2NvbnN0IHI9bi51cmlzWzBdO2lmKHQuaGFzKHIpKWNvbnRpbnVlO3QuYWRkKHIpO2NvbnN0IHM9e3VyaTpyLGZyb21TdG9yZTohMSx1c2VkRm9yQ3VycmVudEZpbGU6ITF9O2lmKHRoaXMuc2NoZW1hVXJpVG9OYW1lQW5kRGVzY3JpcHRpb24uaGFzKHIpKXtjb25zdHtuYW1lOmksZGVzY3JpcHRpb246byx2ZXJzaW9uczphfT10aGlzLnNjaGVtYVVyaVRvTmFtZUFuZERlc2NyaXB0aW9uLmdldChyKTtzLm5hbWU9aSxzLmRlc2NyaXB0aW9uPW8scy5mcm9tU3RvcmU9ITAscy52ZXJzaW9ucz1hfWUucHVzaChzKX1yZXR1cm4gZX1jb2xsZWN0U2NoZW1hTm9kZXMoZSwuLi50KXtjb25zdCBuPXI9PntpZighKCFyfHx0eXBlb2YgciE9Im9iamVjdCIpKXtpZihBcnJheS5pc0FycmF5KHIpKXtmb3IoY29uc3QgcyBvZiByKW4ocyk7cmV0dXJufWUocil9fTtmb3IoY29uc3QgciBvZiB0KW4ocil9c2NoZW1hTWFwVmFsdWVzKGUpe2lmKCEoIWV8fHR5cGVvZiBlIT0ib2JqZWN0IikpcmV0dXJuIE9iamVjdC52YWx1ZXMoZSl9YXN5bmMgcmVzb2x2ZVNjaGVtYUNvbnRlbnQoZSx0LG4pe3ZhciBOO2NvbnN0IHI9ZS5lcnJvcnMuc2xpY2UoMCkscz1ndSh0KSxpPWUuc2NoZW1hO2lmKGk9PT1udWxsfHxBcnJheS5pc0FycmF5KGkpfHx0eXBlb2YgaSE9Im9iamVjdCImJnR5cGVvZiBpIT0iYm9vbGVhbiIpe2NvbnN0IHg9aT09PW51bGw/Im51bGwiOkFycmF5LmlzQXJyYXkoaSk/ImFycmF5Ijp0eXBlb2YgaTtyZXR1cm4gci5wdXNoKEooIlNjaGVtYSAnezB9JyBpcyBub3QgdmFsaWQ6IHsxfSIscyxgZXhwZWN0ZWQgYSBKU09OIFNjaGVtYSBvYmplY3Qgb3IgYm9vbGVhbiwgZ290ICIke3h9Ii5gKSksbmV3IE9vKHt9LHIpfWNvbnN0IG89KHgsTCk9PnsheHx8dHlwZW9mIHghPSJvYmplY3QifHwhTHx8KHguX3NvdXJjZVVyaT1MKX0sYT0oeCxMLFMpPT57aWYoeD09PW51bGx8fHR5cGVvZiB4IT0ib2JqZWN0IilyZXR1cm4geDtpZihTKXtjb25zdCBJPVMoeCxMLnNpemUpO2lmKEkhPT12b2lkIDApcmV0dXJuIEl9aWYoTC5oYXMoeCkpcmV0dXJuIEwuZ2V0KHgpO2lmKEFycmF5LmlzQXJyYXkoeCkpe2NvbnN0IEk9W107TC5zZXQoeCxJKTtmb3IoY29uc3QgTSBvZiB4KUkucHVzaChhKE0sTCxTKSk7cmV0dXJuIEl9Y29uc3Qgaz17fTtMLnNldCh4LGspO2Zvcihjb25zdCBJIGluIHgpa1tJXT1hKHhbSV0sTCxTKTtyZXR1cm4gbyhrLHguX3NvdXJjZVVyaSksa30sdT10aGlzLmxvYWRTY2hlbWEuYmluZCh0aGlzKSxsPShOPXRoaXMueWFtbFNldHRpbmdzKT09bnVsbD92b2lkIDA6Ti5sb2NhbGU7YXN5bmMgZnVuY3Rpb24gZih4LEwpe2lmKCF4fHx0eXBlb2YgeCE9Im9iamVjdCIpcmV0dXJuO2NvbnN0IFM9YXdhaXQgSFIoeC4kc2NoZW1hLHUpO1MmJih4Ll9kaWFsZWN0PVMpO2NvbnN0IGs9SlIoUyk7aWYoIWspcmV0dXJuO2xldCBJPXg7aWYoTCYmKEk9YSh4LG5ldyBNYXAsKGosVSk9PntpZihVIT09MCYmaiYmdHlwZW9mIGo9PSJvYmplY3QiJiZqLiRzY2hlbWEpcmV0dXJue319KSksIWsoSSkpe1dSKGsuZXJyb3JzLGwpO2NvbnN0IE09W107Zm9yKGNvbnN0IGogb2Ygay5lcnJvcnMpTS5wdXNoKGAke2ouaW5zdGFuY2VQYXRofSA6ICR7ai5tZXNzYWdlfWApO3IucHVzaChKKCJTY2hlbWEgJ3swfScgaXMgbm90IHZhbGlkOiB7MX0iLHMsYAoke00uam9pbihgCmApfWApKX19Y29uc3QgYz1uZXcgTWFwLHA9eD0+e2xldCBMPWMuZ2V0KHgpO3JldHVybiBMfHwoTD17ZnJhZ21lbnRzOm5ldyBNYXB9LGMuc2V0KHgsTCkpLEx9LGg9KHgsTCk9Pntjb25zdCBTPWMuZ2V0KEwpO2lmKCFTfHxTLmZyYWdtZW50cy5zaXplPT09MClyZXR1cm4geDtsZXQgaz14O2Zvcihjb25zdFtJLE1db2YgUy5mcmFnbWVudHMpe2lmKCFNLmR5bmFtaWMpY29udGludWU7Y29uc3Qgaj0oaz09bnVsbD92b2lkIDA6ay5nZXQoSSkpPz9bXTtqLnNvbWUoVT0+VS5fYmFzZVVyaT09PUwpfHwoaz09PXgmJihrPXg/bmV3IE1hcCh4KTpuZXcgTWFwKSxrLnNldChJLGouY29uY2F0KE0ubm9kZSkpKX1yZXR1cm4ga30sZD0oeCxMKT0+dGhpcy5jb250ZXh0U2VydmljZT90aGlzLmNvbnRleHRTZXJ2aWNlLnJlc29sdmVSZWxhdGl2ZVBhdGgoTCx4KTp0aGlzLm5vcm1hbGl6ZUlkKEwpLG09YXN5bmMoeCxMKT0+e2NvbnN0IFM9W3tub2RlOngsYmFzZVVyaTpMLHNvdXJjZVVyaTpMfV0saz1bXSxJPW5ldyBXZWFrTWFwLE09bmV3IFNldDtmb3IoO1MubGVuZ3RoOyl7Y29uc3QgVT1TLnBvcCgpO2lmKCFVKWNvbnRpbnVlO2NvbnN0IFY9VS5ub2RlO2lmKCFWfHx0eXBlb2YgViE9Im9iamVjdCJ8fE0uaGFzKFYpKWNvbnRpbnVlO00uYWRkKFYpO2xldCBuZT1VLmJhc2VVcmk7byhWLFUuc291cmNlVXJpKTtjb25zdCBOZT1WLiRpZHx8Vi5pZDtpZihOZSl7Y29uc3QgdGU9ZChuZSxOZSk7Vi5fYmFzZVVyaT10ZTtjb25zdCBwZT10ZS5pbmRleE9mKCIjIik7aWYocGUhPT0tMSYmcGU8dGUubGVuZ3RoLTEpe2NvbnN0IF90PXRlLnNsaWNlKHBlKzEpO3AobmUpLmZyYWdtZW50cy5zZXQoX3Qse25vZGU6Vn0pfWVsc2V7bmU9dGU7Y29uc3QgX3Q9cCh0ZSk7X3Qucm9vdHx8KF90LnJvb3Q9Vil9fVYuJGFuY2hvciYmcChuZSkuZnJhZ21lbnRzLnNldChWLiRhbmNob3Ise25vZGU6Vn0pLFYuJGR5bmFtaWNBbmNob3ImJihWLl9iYXNlVXJpPW5lLHAobmUpLmZyYWdtZW50cy5zZXQoVi4kZHluYW1pY0FuY2hvcix7bm9kZTpWLGR5bmFtaWM6ITB9KSk7Y29uc3QgVz1bXTtJLnNldChWLFcpLHRoaXMuY29sbGVjdFNjaGVtYU5vZGVzKHRlPT57Vy5wdXNoKHRlKSxTLnB1c2goe25vZGU6dGUsYmFzZVVyaTpuZSxzb3VyY2VVcmk6VS5zb3VyY2VVcml9KX0sVi5ub3QsVi5pZixWLnRoZW4sVi5lbHNlLFYuY29udGFpbnMsVi5wcm9wZXJ0eU5hbWVzLFYuYWRkaXRpb25hbFByb3BlcnRpZXMsVi5pdGVtcyxWLmFkZGl0aW9uYWxJdGVtcyxWLnByZWZpeEl0ZW1zLHRoaXMuc2NoZW1hTWFwVmFsdWVzKFYucHJvcGVydGllcyksdGhpcy5zY2hlbWFNYXBWYWx1ZXMoVi5wYXR0ZXJuUHJvcGVydGllcyksdGhpcy5zY2hlbWFNYXBWYWx1ZXMoVi5kZWZpbml0aW9ucyksdGhpcy5zY2hlbWFNYXBWYWx1ZXMoVi4kZGVmcyksdGhpcy5zY2hlbWFNYXBWYWx1ZXMoVi5kZXBlbmRlbnRTY2hlbWFzKSx0aGlzLnNjaGVtYU1hcFZhbHVlcyhWLmRlcGVuZGVuY2llcyksVi5hbGxPZixWLmFueU9mLFYub25lT2YsVi5zY2hlbWFTZXF1ZW5jZSksay5wdXNoKFYpfWNvbnN0IGo9bmV3IFdlYWtNYXA7Zm9yKDtrLmxlbmd0aDspe2NvbnN0IFU9ay5wb3AoKTtsZXQgVj0hMTtmb3IoY29uc3QgbmUgb2YgSS5nZXQoVSkpaWYobmUuJHNjaGVtYXx8ai5nZXQobmUpKXtWPSEwO2JyZWFrfWouc2V0KFUsViksKFU9PT14fHxVLiRzY2hlbWEpJiZhd2FpdCBmKFUsVil9fTtsZXQgZz1pO2NvbnN0IEQ9ZS51cmk/P3Q7YXdhaXQgbShnLEQpO2NvbnN0IGI9KHgsTCxTKT0+e2lmKCFMKXJldHVybiB4O2lmKExbMF09PT0iLyIpe2xldCBrPXg7Y29uc3QgST1MLnN1YnN0cigxKS5zcGxpdCgiLyIpO2Zvcihjb25zdCBNIG9mIEkpaWYoaz1rPT1udWxsP3ZvaWQgMDprW00ucmVwbGFjZSgvfjEvZywiLyIpLnJlcGxhY2UoL34wL2csIn4iKV0saz09PW51bGwpcmV0dXJuO3JldHVybiBrfXJldHVybiBwKFMpLmZyYWdtZW50cy5nZXQoTCkubm9kZX0sRT0oeCxMLFMsayxJPSExKT0+e2NvbnN0IE09YihMLGssUyk7aWYodHlwZW9mIE09PSJib29sZWFuIil7TXx8KHgubm90PXt9KTtyZXR1cm59aWYodHlwZW9mIE09PSJvYmplY3QiJiZNKXtjb25zdCBqPUk/YShNLG5ldyBNYXApOk07Zm9yKGNvbnN0IFUgaW4gailPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwoaixVKSYmIU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbCh4LFUpJiYoeFtVXT1qW1VdKTtvKHgsai5fc291cmNlVXJpKTtyZXR1cm59ZWxzZSByLnB1c2goSigiJHJlZiAnezB9JyBpbiAnezF9JyBjYW5ub3QgYmUgcmVzb2x2ZWQuIixrLFMpKX0sRj0oeCxMKT0+e3ZhciBqO2NvbnN0IFM9ZCh4LEwpO2lmKCFMLnN0YXJ0c1dpdGgoIi8iKSlyZXR1cm4gUztjb25zdCBrPShqPWMuZ2V0KHgpKT09bnVsbD92b2lkIDA6ai5yb290LEk9KGs9PW51bGw/dm9pZCAwOmsuJGlkKXx8KGs9PW51bGw/dm9pZCAwOmsuaWQpO2lmKCFJKXJldHVybiBTO2NvbnN0IE09ZCh4LEkpO3JldHVybiFNLnN0YXJ0c1dpdGgoImh0dHA6Ly8iKSYmIU0uc3RhcnRzV2l0aCgiaHR0cHM6Ly8iKT9TOmQoTSxMKX0sdj0oeCxMKT0+e3RyeXtjb25zdCBTPXJ0LnBhcnNlKHgpLGs9cnQucGFyc2UoTCk7aWYoUy5zY2hlbWUhPT0iZmlsZSJ8fGsuc2NoZW1lIT09Imh0dHAiJiZrLnNjaGVtZSE9PSJodHRwcyIpcmV0dXJuO2NvbnN0IEk9Wm4ucG9zaXguYmFzZW5hbWUoay5wYXRoKTtpZighSSlyZXR1cm47Y29uc3QgTT1abi5wb3NpeC5kaXJuYW1lKFMucGF0aCksaj1abi5wb3NpeC5qb2luKE0sSSk7cmV0dXJuIFMud2l0aCh7cGF0aDpqLHF1ZXJ5OmsucXVlcnksZnJhZ21lbnQ6ay5mcmFnbWVudH0pLnRvU3RyaW5nKCl9Y2F0Y2h7cmV0dXJufX0sQz0oeCxMLFMsayxJLE0saixVLFYpPT57dmFyIFBlO2NvbnN0IG5lPSh5dCxEdCxGZSxMbiwkbixRbyx3dCxLcixYcik9PnskbltGZV09ITAsRSh5dCxEdCxGZSxMbiwhIVhyfHwhIUtyKSwoIUtyfHwheXQuX2Jhc2VVcmkpJiYoeXQuX2Jhc2VVcmk9RmUpLHl0LnVybD1GZTtjb25zdCBTdT1uZXcgU2V0KHd0KTtyZXR1cm4gU3UuYWRkKEZlKSxBKHl0LER0LEZlLFFvLFN1LEtyLFhyKX0sTmU9KHl0LER0PTApPT57dmFyIFFvO2NvbnN0IEZlPXl0W0R0XSxMbj0oUW89Yy5nZXQoRmUpKT09bnVsbD92b2lkIDA6UW8ucm9vdDtpZihMbilyZXR1cm4gbmUoeCxMbixGZSxTLE0sTSxqLFUsVik7Y29uc3QgJG49dGhpcy5nZXRPckFkZFNjaGVtYUhhbmRsZShGZSk7cmV0dXJuICRuLmdldFVucmVzb2x2ZWRTY2hlbWEoKS50aGVuKGFzeW5jIHd0PT57dmFyIEtyO2lmKChLcj13dC5lcnJvcnMpIT1udWxsJiZLci5zb21lKFhyPT5Yci50b0xvd2VyQ2FzZSgpLmluY2x1ZGVzKCJ1bmFibGUgdG8gbG9hZCBzY2hlbWEgZnJvbSIpKSYmRHQrMTx5dC5sZW5ndGgpcmV0dXJuIE5lKHl0LER0KzEpO2lmKHd0LmVycm9ycy5sZW5ndGgpe2NvbnN0IFhyPVM/RmUrIiMiK1M6RmU7ci5wdXNoKEooIlByb2JsZW1zIGxvYWRpbmcgcmVmZXJlbmNlICd7MH0nOiB7MX0iLFhyLHd0LmVycm9yc1swXSkpfXJldHVybiBhd2FpdCBtKHd0LnNjaGVtYSxGZSksbmUoeCx3dC5zY2hlbWEsRmUsUyxNLCRuLmRlcGVuZGVuY2llcyxqLFUsVil9KX0sVz1GKGssTCkscGU9KChQZT1jLmdldChXKSk9PW51bGw/dm9pZCAwOlBlLnJvb3QpP3ZvaWQgMDp2KEksVyk7cmV0dXJuIE5lKHBlJiZwZSE9PVc/W3BlLFddOltXXSl9LEE9YXN5bmMoeCxMLFMsayxJLE0saik9PntpZigheHx8dHlwZW9mIHghPSJvYmplY3QiKXJldHVybiBudWxsO2NvbnN0IFU9W3tub2RlOngsYmFzZVVyaTpTLHNvdXJjZVVyaTp4Ll9zb3VyY2VVcmk/P1MscmVjdXJzaXZlQW5jaG9yQmFzZTpNLGluaGVyaXRlZER5bmFtaWNTY29wZTpqfV0sVj1uZXcgV2Vha1NldCxuZT1bXSxOZT0oVyx0ZSxwZSxfdCxQZSx5dCxEdCk9Pnt2YXIgWHIsU3UsdUMsbEMsY0M7Y29uc3QgRmU9aCh5dCx0ZSk7dGhpcy5jb2xsZWN0U2NoZW1hTm9kZXMoQWU9PlUucHVzaCh7bm9kZTpBZSxiYXNlVXJpOnRlLHNvdXJjZVVyaTpwZSxyZWN1cnNpdmVBbmNob3JCYXNlOlBlLGluaGVyaXRlZER5bmFtaWNTY29wZTpGZX0pLHRoaXMuc2NoZW1hTWFwVmFsdWVzKFcuZGVmaW5pdGlvbnN8fFcuJGRlZnMpKTtjb25zdCBMbj1BZT0+e2Zvcihjb25zdCBhbiBvZiBPYmplY3Qua2V5cyhBZSkpaWYoIUttLmhhcyhhbikpcmV0dXJuITA7cmV0dXJuITF9LCRuPUFlPT57Y29uc3QgYW49e307Zm9yKGNvbnN0IG90IG9mIE9iamVjdC5rZXlzKEFlKSlLbS5oYXMob3QpfHwoYW5bb3RdPUFlW290XSxkZWxldGUgQWVbb3RdKTtjb25zdCBfcz1BZS4kZHluYW1pY1JlZj8/QWUuJHJlY3Vyc2l2ZVJlZj8/QWUuJHJlZjt0eXBlb2YgX3M9PSJzdHJpbmciJiYoQWUuYWxsT2Y9W3tbQWUuJGR5bmFtaWNSZWY/IiRkeW5hbWljUmVmIjpBZS4kcmVjdXJzaXZlUmVmPyIkcmVjdXJzaXZlUmVmIjoiJHJlZiJdOl9zfSxhbl0sZGVsZXRlIEFlLiRkeW5hbWljUmVmLGRlbGV0ZSBBZS4kcmVjdXJzaXZlUmVmLGRlbGV0ZSBBZS4kcmVmKX0sUW89QWU9Pntmb3IoY29uc3QgYW4gb2YgT2JqZWN0LmtleXMoQWUpKUttLmhhcyhhbil8fGRlbGV0ZSBBZVthbl19LHd0PW5ldyBTZXQsS3I9KEFlLGFuLF9zKT0+e3ZhciBvdDtpZighSS5oYXMoYW4pKXJldHVybiExO2lmKCF3dC5oYXMoQWUpKXtjb25zdCB3aT0ob3Q9Yy5nZXQoYW4pKT09bnVsbD92b2lkIDA6b3Qucm9vdDt3aSYmdHlwZW9mIHdpPT0ib2JqZWN0IiYmRShXLHdpLGFuLF9zLCEhUGUpLHd0LmFkZChBZSl9cmV0dXJuITB9O2Zvcig7Vy4kZHluYW1pY1JlZnx8Vy4kcmVjdXJzaXZlUmVmfHxXLiRyZWY7KXtjb25zdCBBZT10eXBlb2YgVy4kZHluYW1pY1JlZj09InN0cmluZyIsYW49IUFlJiZ0eXBlb2YgVy4kcmVjdXJzaXZlUmVmPT0ic3RyaW5nIixfcz1XLiRkeW5hbWljUmVmPz9XLiRyZWN1cnNpdmVSZWY/P1cuJHJlZjtpZih0eXBlb2YgX3MhPSJzdHJpbmciKWJyZWFrO1cuXyRyZWY9X3M7Y29uc3Qgb3Q9ZGVjb2RlVVJJQ29tcG9uZW50KF9zKSx3aT1vdC5zcGxpdCgiIyIsMiksSXM9d2lbMF0sWXI9d2kubGVuZ3RoPjE/d2lbMV06IiIsZkM9YCR7SXM/ZCh0ZSxJcyk6dGV9IyR7WXJ9YDtpZihMbihXKSlpZihfdD09PXR0LmRyYWZ0MDR8fF90PT09dHQuZHJhZnQwNylRbyhXKTtlbHNle2lmKER0IT1udWxsJiZEdC5oYXMoZkMpKWJyZWFrO2lmKCRuKFcpLEFycmF5LmlzQXJyYXkoVy5hbGxPZikpZm9yKGxldCB1bj0wO3VuPFcuYWxsT2YubGVuZ3RoO3VuKyspe2NvbnN0IEp0PVcuYWxsT2ZbdW5dO2lmKEp0JiZ0eXBlb2YgSnQ9PSJvYmplY3QiKXtsZXQgUHM7dW49PT0wJiYoUHM9bmV3IFNldChEdCksUHMuYWRkKGZDKSksVS5wdXNoKHtub2RlOkp0LGJhc2VVcmk6dGUsc291cmNlVXJpOnBlLHJlY3Vyc2l2ZUFuY2hvckJhc2U6UGUsaW5oZXJpdGVkRHluYW1pY1Njb3BlOkZlLHNpYmxpbmdSZWZDeWNsZUtleXM6UHN9KX19cmV0dXJufWlmKGRlbGV0ZSBXLiRkeW5hbWljUmVmLGRlbGV0ZSBXLiRyZWN1cnNpdmVSZWYsZGVsZXRlIFcuJHJlZixhbiYmKG90PT09IiMifHxvdD09PSIiKSl7Y29uc3QgdW49KFhyPWMuZ2V0KHRlKSk9PW51bGw/dm9pZCAwOlhyLnJvb3QsSnQ9dW4hPW51bGwmJnVuLiRyZWN1cnNpdmVBbmNob3ImJlBlP1BlOnRlO2lmKEp0Lmxlbmd0aD4wKXtpZihJIT1udWxsJiZJLmhhcyhKdCl8fEp0PT09dGUpe2NvbnN0IFBzPSgoU3U9Yy5nZXQoSnQpKT09bnVsbD92b2lkIDA6U3Uucm9vdCk/P0w7d3QuaGFzKG90KXx8KEUoVyxQcyxKdCwiIiwhMSksd3QuYWRkKG90KSk7Y29udGludWV9bmUucHVzaChDKFcsSnQsIiIsdGUscGUsayxJLFBlLEZlKSk7cmV0dXJufWNvbnRpbnVlfWVsc2UgaWYoQWUpe2NvbnN0IHVuPUlzLmxlbmd0aD4wP2QodGUsSXMpOnRlLEp0PSh1Qz1jLmdldCh1bikpPT1udWxsP3ZvaWQgMDp1Qy5mcmFnbWVudHMsUHM9WXIubGVuZ3RoPjAmJigobEM9SnQ9PW51bGw/dm9pZCAwOkp0LmdldChZcikpPT1udWxsP3ZvaWQgMDpsQy5keW5hbWljKSxtZj1Qcz8oY0M9RmU9PW51bGw/dm9pZCAwOkZlLmdldChZcikpPT1udWxsP3ZvaWQgMDpjQ1swXTp2b2lkIDAseHU9bWY/bWYuX2Jhc2VVcmk6dW47aWYobWYmJih4dT09PXRlfHxJLmhhcyh4dSkpKXt3dC5oYXMob3QpfHwoRShXLG1mLHh1LCIiLCExKSx3dC5hZGQob3QpKTtjb250aW51ZX1pZihJcy5sZW5ndGg+MHx8UHMpe2lmKEtyKG90LHh1LFlyKSljb250aW51ZTtuZS5wdXNoKEMoVyx4dSxZcix0ZSxwZSxrLEksUGUsRmUpKTtyZXR1cm59fWVsc2UgaWYoSXMubGVuZ3RoPjApe2NvbnN0IHVuPWQodGUsSXMpO2lmKEtyKG90LHVuLFlyKSljb250aW51ZTtuZS5wdXNoKEMoVyxJcyxZcix0ZSxwZSxrLEksUGUsRmUpKTtyZXR1cm59d3QuaGFzKG90KXx8KEUoVyxMLHRlLFlyLEFlJiYhIUZlKSx3dC5hZGQob3QpKX10aGlzLmNvbGxlY3RTY2hlbWFOb2RlcyhBZT0+VS5wdXNoKHtub2RlOkFlLGJhc2VVcmk6Vy5fYmFzZVVyaXx8dGUsc291cmNlVXJpOlcuX3NvdXJjZVVyaXx8cGUsZGlhbGVjdDpfdCxyZWN1cnNpdmVBbmNob3JCYXNlOlBlLGluaGVyaXRlZER5bmFtaWNTY29wZTpGZX0pLFcubm90LFcuaWYsVy50aGVuLFcuZWxzZSxXLmNvbnRhaW5zLFcucHJvcGVydHlOYW1lcyxXLmFkZGl0aW9uYWxQcm9wZXJ0aWVzLFcuaXRlbXMsVy5hZGRpdGlvbmFsSXRlbXMsVy5wcmVmaXhJdGVtcyx0aGlzLnNjaGVtYU1hcFZhbHVlcyhXLnByb3BlcnRpZXMpLHRoaXMuc2NoZW1hTWFwVmFsdWVzKFcucGF0dGVyblByb3BlcnRpZXMpLHRoaXMuc2NoZW1hTWFwVmFsdWVzKFcuZGVwZW5kZW50U2NoZW1hcyksdGhpcy5zY2hlbWFNYXBWYWx1ZXMoVy5kZXBlbmRlbmNpZXMpLFcuYWxsT2YsVy5hbnlPZixXLm9uZU9mLFcuc2NoZW1hU2VxdWVuY2UpfTtpZihTLmluZGV4T2YoIiMiKT4wKXtjb25zdCBXPVMuc3BsaXQoIiMiLDIpO2lmKFdbMF0ubGVuZ3RoPjAmJldbMV0ubGVuZ3RoPjApe2NvbnN0IHRlPXt9O2F3YWl0IEModGUsV1swXSxXWzFdLFMsZy5fc291cmNlVXJpPz9TLGssSSxNLGopO2Zvcihjb25zdCBwZSBpbiBnKXBlIT09InJlcXVpcmVkIiYmT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKGcscGUpJiYhT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKHRlLHBlKSYmKHRlW3BlXT1nW3BlXSk7Zz10ZX19Zm9yKDtVLmxlbmd0aDspe2NvbnN0IFc9VS5wb3AoKSx0ZT1XLm5vZGUscGU9dGUuX2Jhc2VVcml8fFcuYmFzZVVyaSxfdD10ZS5fc291cmNlVXJpfHxwZSxQZT10ZS5fZGlhbGVjdHx8Vy5kaWFsZWN0LHl0PVcucmVjdXJzaXZlQW5jaG9yQmFzZT8/KHRlLiRyZWN1cnNpdmVBbmNob3I/cGU6dm9pZCAwKTtWLmhhcyh0ZSl8fChWLmFkZCh0ZSksTmUodGUscGUsX3QsUGUseXQsVy5pbmhlcml0ZWREeW5hbWljU2NvcGUsVy5zaWJsaW5nUmVmQ3ljbGVLZXlzKSl9cmV0dXJuIFByb21pc2UuYWxsKG5lKX0sdz1uZXcgU2V0LFQ9Zy5fYmFzZVVyaXx8dDtyZXR1cm4gVCYmdy5hZGQoVCksYXdhaXQgQShnLGcsdCxuLHcpLG5ldyBPbyhnLHIpfWdldFNjaGVtYUZvclJlc291cmNlKGUsdCl7Y29uc3Qgbj0oKT0+e2xldCBvPXZSKHQpO2lmKG8hPT12b2lkIDApe2lmKCFvLnN0YXJ0c1dpdGgoImZpbGU6IikmJiFvLnN0YXJ0c1dpdGgoImh0dHAiKSl7bGV0IGE9IiI7aWYoby5pbmRleE9mKCIjIik+MCl7Y29uc3QgdT1vLnNwbGl0KCIjIiwyKTtvPXVbMF0sYT11WzFdfWlmKFpuLmlzQWJzb2x1dGUobykpbz1ydC5maWxlKG8pLnRvU3RyaW5nKCk7ZWxzZXtjb25zdCB1PXJ0LnBhcnNlKGUpO289cnQuZmlsZShabi5yZXNvbHZlKFpuLnBhcnNlKHUuZnNQYXRoKS5kaXIsbykpLnRvU3RyaW5nKCl9YS5sZW5ndGg+MCYmKG8rPSIjIithKX1yZXR1cm4gb319LHI9bz0+e2NvbnN0IGE9c3VwZXIuY3JlYXRlQ29tYmluZWRTY2hlbWEoZSxvKTtyZXR1cm4gYS5nZXRSZXNvbHZlZFNjaGVtYSgpLnRoZW4odT0+dGhpcy5maW5hbGl6ZVJlc29sdmVkU2NoZW1hKHUsYS51cmwsdCwhMSkpfSxzPWFzeW5jKCk9Pnt2YXIgbDtjb25zdCBvPU9iamVjdC5jcmVhdGUobnVsbCksYT1bXTtsZXQgdTtmb3IoY29uc3QgZiBvZiB0aGlzLmZpbGVQYXR0ZXJuQXNzb2NpYXRpb25zKWlmKGYubWF0Y2hlc1BhdHRlcm4oZSkpe2Zvcihjb25zdCBjIG9mIGYuZ2V0VVJJcygpKWlmKCFvW2NdKWlmKChsPXRoaXMueWFtbFNldHRpbmdzKSE9bnVsbCYmbC5rdWJlcm5ldGVzQ1JEU3RvcmVFbmFibGVkJiZjPT09T3cpe3V8fCh1PWF3YWl0IHRoaXMuZ2V0UmVzb2x2ZWRTY2hlbWEoT3cpKTtjb25zdCBwPWtSKHQsdSx0aGlzLnlhbWxTZXR0aW5ncy5rdWJlcm5ldGVzQ1JEU3RvcmVVcmw/P1NSKTtwPyhhLnB1c2gocCksb1tjXT0hMCk6KGEucHVzaChjKSxvW2NdPSEwKX1lbHNlIGEucHVzaChjKSxvW2NdPSEwfWlmKGEubGVuZ3RoPjApe2NvbnN0IGY9dGhpcy5oaWdoZXN0UHJpb3JpdHlTY2hlbWFzKGEpO3JldHVybiByKGYpfXJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCl9LGk9bigpO3JldHVybiBpP3IoW2ldKTp0aGlzLmN1c3RvbVNjaGVtYVByb3ZpZGVyP3RoaXMuY3VzdG9tU2NoZW1hUHJvdmlkZXIoZSkudGhlbihvPT5BcnJheS5pc0FycmF5KG8pP28ubGVuZ3RoPT09MD9zKCk6UHJvbWlzZS5hbGwoby5tYXAoYT0+dGhpcy5yZXNvbHZlQ3VzdG9tU2NoZW1hKGEsdCkpKS50aGVuKGE9Pih7ZXJyb3JzOltdLHNjaGVtYTp7YWxsT2Y6YS5tYXAodT0+dS5zY2hlbWEpfX0pLCgpPT5zKCkpOm8/dGhpcy5yZXNvbHZlQ3VzdG9tU2NoZW1hKG8sdCk6cygpKS50aGVuKG89Pm8sKCk9PnMoKSk6cygpfWZpbmFsaXplUmVzb2x2ZWRTY2hlbWEoZSx0LG4scil7aWYoZS5zY2hlbWEmJnR5cGVvZiBlLnNjaGVtYT09Im9iamVjdCImJihlLnNjaGVtYS51cmw9dCxlLnNjaGVtYS5zY2hlbWFTZXF1ZW5jZSYmZS5zY2hlbWEuc2NoZW1hU2VxdWVuY2Vbbi5jdXJyZW50RG9jSW5kZXhdKSl7Y29uc3Qgcz1lLnNjaGVtYS5zY2hlbWFTZXF1ZW5jZVtuLmN1cnJlbnREb2NJbmRleF07cmV0dXJuIHI/bmV3IE9vKHMsZS5lcnJvcnMpOm5ldyBPbyhzKX1yZXR1cm4gZX1hZGRTY2hlbWFQcmlvcml0eShlLHQpe2xldCBuPXRoaXMuc2NoZW1hUHJpb3JpdHlNYXBwaW5nLmdldChlKTtuPyhuPW4uYWRkKHQpLHRoaXMuc2NoZW1hUHJpb3JpdHlNYXBwaW5nLnNldChlLG4pKTp0aGlzLnNjaGVtYVByaW9yaXR5TWFwcGluZy5zZXQoZSxuZXcgU2V0KCkuYWRkKHQpKX1oaWdoZXN0UHJpb3JpdHlTY2hlbWFzKGUpe2xldCB0PTA7Y29uc3Qgbj1uZXcgTWFwO3JldHVybiBlLmZvckVhY2gocj0+eyh0aGlzLnNjaGVtYVByaW9yaXR5TWFwcGluZy5nZXQocil8fFswXSkuZm9yRWFjaChpPT57aT50JiYodD1pKTtsZXQgbz1uLmdldChpKTtvPyhvPW8uY29uY2F0KHIpLG4uc2V0KGksbykpOm4uc2V0KGksW3JdKX0pfSksbi5nZXQodCl8fFtdfWFzeW5jIHJlc29sdmVDdXN0b21TY2hlbWEoZSx0KXtjb25zdCBuPWF3YWl0IHRoaXMubG9hZFNjaGVtYShlKSxyPWF3YWl0IHRoaXMucmVzb2x2ZVNjaGVtYUNvbnRlbnQobixlLFtdKTtyZXR1cm4gdGhpcy5maW5hbGl6ZVJlc29sdmVkU2NoZW1hKHIsZSx0LCEwKX1hc3luYyBzYXZlU2NoZW1hKGUsdCl7Y29uc3Qgbj10aGlzLm5vcm1hbGl6ZUlkKGUpO3JldHVybiB0aGlzLmdldE9yQWRkU2NoZW1hSGFuZGxlKG4sdCksdGhpcy5zY2hlbWFQcmlvcml0eU1hcHBpbmcuc2V0KG4sbmV3IFNldCgpLmFkZChYbS5TZXR0aW5ncykpLFByb21pc2UucmVzb2x2ZSh2b2lkIDApfWFzeW5jIGRlbGV0ZVNjaGVtYXMoZSl7cmV0dXJuIGUuc2NoZW1hcy5mb3JFYWNoKHQ9Pnt0aGlzLmRlbGV0ZVNjaGVtYSh0KX0pLFByb21pc2UucmVzb2x2ZSh2b2lkIDApfWFzeW5jIGRlbGV0ZVNjaGVtYShlKXtjb25zdCB0PXRoaXMubm9ybWFsaXplSWQoZSk7cmV0dXJuIHRoaXMuc2NoZW1hc0J5SWRbdF0mJmRlbGV0ZSB0aGlzLnNjaGVtYXNCeUlkW3RdLHRoaXMuc2NoZW1hUHJpb3JpdHlNYXBwaW5nLmRlbGV0ZSh0KSxQcm9taXNlLnJlc29sdmUodm9pZCAwKX1hc3luYyBhZGRDb250ZW50KGUpe2NvbnN0IHQ9YXdhaXQgdGhpcy5nZXRSZXNvbHZlZFNjaGVtYShlLnNjaGVtYSk7aWYodCl7Y29uc3Qgbj10aGlzLnJlc29sdmVKU09OU2NoZW1hVG9TZWN0aW9uKHQuc2NoZW1hLGUucGF0aCk7dHlwZW9mIG49PSJvYmplY3QiJiYobltlLmtleV09ZS5jb250ZW50KSxhd2FpdCB0aGlzLnNhdmVTY2hlbWEoZS5zY2hlbWEsdC5zY2hlbWEpfX1hc3luYyBkZWxldGVDb250ZW50KGUpe2NvbnN0IHQ9YXdhaXQgdGhpcy5nZXRSZXNvbHZlZFNjaGVtYShlLnNjaGVtYSk7aWYodCl7Y29uc3Qgbj10aGlzLnJlc29sdmVKU09OU2NoZW1hVG9TZWN0aW9uKHQuc2NoZW1hLGUucGF0aCk7dHlwZW9mIG49PSJvYmplY3QiJiZkZWxldGUgbltlLmtleV0sYXdhaXQgdGhpcy5zYXZlU2NoZW1hKGUuc2NoZW1hLHQuc2NoZW1hKX19cmVzb2x2ZUpTT05TY2hlbWFUb1NlY3Rpb24oZSx0KXtjb25zdCBuPXQuc3BsaXQoIi8iKTtsZXQgcj1lO2Zvcihjb25zdCBzIG9mIG4pcyE9PSIiJiYodGhpcy5yZXNvbHZlTmV4dChyLHMpLHI9cltzXSk7cmV0dXJuIHJ9cmVzb2x2ZU5leHQoZSx0KXtpZihBcnJheS5pc0FycmF5KGUpJiZpc05hTih0KSl0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGEgbnVtYmVyIGFmdGVyIHRoZSBhcnJheSBvYmplY3QiKTtpZih0eXBlb2YgZT09Im9iamVjdCImJnR5cGVvZiB0IT0ic3RyaW5nIil0aHJvdyBuZXcgRXJyb3IoIkV4cGVjdGVkIGEgc3RyaW5nIGFmdGVyIHRoZSBvYmplY3QiKX1ub3JtYWxpemVJZChlKXt0cnl7cmV0dXJuIHJ0LnBhcnNlKGUpLnRvU3RyaW5nKCl9Y2F0Y2h7cmV0dXJuIGV9fWdldE9yQWRkU2NoZW1hSGFuZGxlKGUsdCl7cmV0dXJuIHN1cGVyLmdldE9yQWRkU2NoZW1hSGFuZGxlKGUsdCl9bG9hZFNjaGVtYShlKXtjb25zdCB0PXRoaXMucmVxdWVzdFNlcnZpY2U7cmV0dXJuIHN1cGVyLmxvYWRTY2hlbWEoZSkudGhlbihhc3luYyBuPT57aWYobi5lcnJvcnMmJihuLnNjaGVtYT09PXZvaWQgMHx8dHlwZW9mIG4uc2NoZW1hPT0ibnVtYmVyIikpcmV0dXJuIHQoZSkudGhlbihyPT57aWYoIXIpe2NvbnN0IHM9SigiVW5hYmxlIHRvIGxvYWQgc2NoZW1hIGZyb20gJ3swfSc6IE5vIGNvbnRlbnQuIHsxfSIsZ3UoZSksbi5lcnJvcnMpO3JldHVybiBuZXcgVG4oe30sW3NdKX10cnl7Y29uc3Qgcz1TeChyKTtyZXR1cm4gbmV3IFRuKHMsW10pfWNhdGNoKHMpe2NvbnN0IGk9SigiVW5hYmxlIHRvIHBhcnNlIGNvbnRlbnQgZnJvbSAnezB9JzogezF9LiIsZ3UoZSkscyk7cmV0dXJuIG5ldyBUbih7fSxbaV0pfX0scj0+e2xldCBzPXIudG9TdHJpbmcoKTtjb25zdCBpPXIudG9TdHJpbmcoKS5zcGxpdCgiRXJyb3I6ICIpO3JldHVybiBpLmxlbmd0aD4xJiYocz1pWzFdKSxuZXcgVG4oe30sW3NdKX0pO2lmKG4udXJpPWUsdGhpcy5zY2hlbWFVcmlUb05hbWVBbmREZXNjcmlwdGlvbi5oYXMoZSkpe2NvbnN0e25hbWU6cixkZXNjcmlwdGlvbjpzLHZlcnNpb25zOml9PXRoaXMuc2NoZW1hVXJpVG9OYW1lQW5kRGVzY3JpcHRpb24uZ2V0KGUpO24uc2NoZW1hLnRpdGxlPXI/P24uc2NoZW1hLnRpdGxlLG4uc2NoZW1hLmRlc2NyaXB0aW9uPXM/P24uc2NoZW1hLmRlc2NyaXB0aW9uLG4uc2NoZW1hLnZlcnNpb25zPWk/P24uc2NoZW1hLnZlcnNpb25zfWVsc2UgaWYobi5lcnJvcnMmJm4uZXJyb3JzLmxlbmd0aD4wKXtsZXQgcj1uLmVycm9yc1swXTtpZihyLnRvTG93ZXJDYXNlKCkuaW5kZXhPZigibG9hZCIpIT09LTEpcj1KKCJVbmFibGUgdG8gbG9hZCBzY2hlbWEgZnJvbSAnezB9JzogTm8gY29udGVudC4iLGd1KGUpKTtlbHNlIGlmKHIudG9Mb3dlckNhc2UoKS5pbmRleE9mKCJwYXJzZSIpIT09LTEpe2NvbnN0IHM9YXdhaXQgdChlKSxpPVtdLG89RWcocyxpKTtpZihpLmxlbmd0aCYmbyl7Y29uc3R7b2Zmc2V0OmF9PWlbMF0se2xpbmU6dSxjb2x1bW46bH09VVIocyxhKTtyPUooIlVuYWJsZSB0byBwYXJzZSBjb250ZW50IGZyb20gJ3swfSc6IFBhcnNlIGVycm9yIGF0IGxpbmU6IHsxfSBjb2x1bW46IHsyfSIsZ3UoZSksdSxsKX19cmV0dXJuIG5ldyBUbih7fSxbcl0pfXJldHVybiBufSl9cmVnaXN0ZXJFeHRlcm5hbFNjaGVtYShlLHQsbixyLHMsaSl7cmV0dXJuKHJ8fHMpJiZ0aGlzLnNjaGVtYVVyaVRvTmFtZUFuZERlc2NyaXB0aW9uLnNldChlLHtuYW1lOnIsZGVzY3JpcHRpb246cyx2ZXJzaW9uczppfSksc3VwZXIucmVnaXN0ZXJFeHRlcm5hbFNjaGVtYShlLHQsbil9Y2xlYXJFeHRlcm5hbFNjaGVtYXMoKXtzdXBlci5jbGVhckV4dGVybmFsU2NoZW1hcygpfXNldFNjaGVtYUNvbnRyaWJ1dGlvbnMoZSl7c3VwZXIuc2V0U2NoZW1hQ29udHJpYnV0aW9ucyhlKX1nZXRSZWdpc3RlcmVkU2NoZW1hSWRzKGUpe3JldHVybiBzdXBlci5nZXRSZWdpc3RlcmVkU2NoZW1hSWRzKGUpfWdldFJlc29sdmVkU2NoZW1hKGUpe3JldHVybiBzdXBlci5nZXRSZXNvbHZlZFNjaGVtYShlKX1vblJlc291cmNlQ2hhbmdlKGUpe3JldHVybiBzdXBlci5vblJlc291cmNlQ2hhbmdlKGUpfX07ZnVuY3Rpb24gZ3UoZSl7dHJ5e2NvbnN0IHQ9cnQucGFyc2UoZSk7aWYodC5zY2hlbWU9PT0iZmlsZSIpcmV0dXJuIHQuZnNQYXRofWNhdGNoe31yZXR1cm4gZX1mdW5jdGlvbiBVUihlLHQpe2NvbnN0IG49ZS5zbGljZSgwLHQpLnNwbGl0KC9ccj9cbi8pLHI9bi5sZW5ndGgscz1uW24ubGVuZ3RoLTFdLmxlbmd0aCsxO3JldHVybntsaW5lOnIsY29sdW1uOnN9fWZ1bmN0aW9uIHl1KGUpe2lmKCFlKXJldHVybiIiO2xldCB0O3R5cGVvZiBlPT0ic3RyaW5nIj90PWU6dD1lLiRpZHx8ZS5pZHx8IiIsdD10LnRyaW0oKTtjb25zdCBuPXQuaW5kZXhPZigiIyIpO3JldHVybiB0PW49PT0tMT90OnQuc2xpY2UoMCxuKSx0PXQucmVwbGFjZSgvXmh0dHA6XC9cL2pzb24tc2NoZW1hXC5vcmdcLy9pLCJodHRwczovL2pzb24tc2NoZW1hLm9yZy8iKSx0PXQucmVwbGFjZSgvXC8rJC9nLCIiKSx0fWZ1bmN0aW9uIEp3KGUpe2lmKGU9PT15dShqdy5kZWZhdWx0TWV0YSgpKSlyZXR1cm4gdHQuZHJhZnQwNDtpZihlPT09eXUoVncuZGVmYXVsdE1ldGEoKSkpcmV0dXJuIHR0LmRyYWZ0MDc7aWYoZT09PXl1KFV3LmRlZmF1bHRNZXRhKCkpKXJldHVybiB0dC5kcmFmdDIwMTk7aWYoZT09PXl1KHF3LmRlZmF1bHRNZXRhKCkpKXJldHVybiB0dC5kcmFmdDIwMjB9ZnVuY3Rpb24gcVIoZSl7aWYoIWUpcmV0dXJuO2NvbnN0IHQ9ZS50cmltKCkudG9Mb3dlckNhc2UoKSxuPWpSLmdldCh0KTtyZXR1cm4gdGZbZV18fHRmW3RdfHwobj90ZltuXTp2b2lkIDApfWZ1bmN0aW9uIFdSKGUsdCl7KHFSKHQpfHx0Zi5lbikoZSl9YXN5bmMgZnVuY3Rpb24gSFIoZSx0KXtpZighZSlyZXR1cm47Y29uc3Qgbj15dShlfHwiIikscj1KdyhuKTtpZihyKXJldHVybiByO2NvbnN0IHM9V3cuZ2V0KG4pO2lmKHMpcmV0dXJuIHM7Y29uc3QgaT1HbS5nZXQobik7aWYoaSlyZXR1cm4gaTtpZighdClyZXR1cm47Y29uc3Qgbz0oYXN5bmMoKT0+e3ZhciBmO2NvbnN0IGE9YXdhaXQgdChuKTtpZigoZj1hLmVycm9ycykhPW51bGwmJmYubGVuZ3RoKXJldHVybjtjb25zdCB1PWEuc2NoZW1hO2lmKCF1fHx0eXBlb2YgdSE9Im9iamVjdCIpcmV0dXJuO2NvbnN0IGw9SncodS4kc2NoZW1hKTtpZihsKXJldHVybiBsfSkoKTtHbS5zZXQobixvKTt0cnl7Y29uc3QgYT1hd2FpdCBvO3JldHVybiBXdy5zZXQobixhKSxhfWZpbmFsbHl7R20uZGVsZXRlKG4pfX1mdW5jdGlvbiBKUihlKXtzd2l0Y2goZSl7Y2FzZSB0dC5kcmFmdDA0OnJldHVybiBQUjtjYXNlIHR0LmRyYWZ0MDc6cmV0dXJuIE1SO2Nhc2UgdHQuZHJhZnQyMDE5OnJldHVybiBPUjtjYXNlIHR0LmRyYWZ0MjAyMDpyZXR1cm4gUlI7ZGVmYXVsdDpyZXR1cm59fXZhciB6Uj1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMudGVsZW1ldHJ5PXQsdGhpcy5qc29uRG9jdW1lbnRTeW1ib2xzPW5ldyBWTyhlKSx0aGlzLmpzb25Eb2N1bWVudFN5bWJvbHMuZ2V0S2V5TGFiZWw9bj0+e2NvbnN0IHI9bi5rZXlOb2RlLmludGVybmFsTm9kZTtsZXQgcz0iIjtyZXR1cm4gemUocik/cz0ie30iOlJlKHIpP3M9IltdIjpzPXIuc291cmNlLHN9fWZpbmREb2N1bWVudFN5bWJvbHMoZSx0PXtyZXN1bHRMaW1pdDpOdW1iZXIuTUFYX1ZBTFVFfSl7dmFyIHI7bGV0IG49W107dHJ5e2NvbnN0IHM9b24uZ2V0WWFtbERvY3VtZW50KGUpO2lmKCFzfHxzLmRvY3VtZW50cy5sZW5ndGg9PT0wKXJldHVybiBudWxsO2Zvcihjb25zdCBpIG9mIHMuZG9jdW1lbnRzKWkucm9vdCYmKG49bi5jb25jYXQodGhpcy5qc29uRG9jdW1lbnRTeW1ib2xzLmZpbmREb2N1bWVudFN5bWJvbHMoZSxpLHQpKSl9Y2F0Y2gocyl7KHI9dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxyLnNlbmRFcnJvcigieWFtbC5kb2N1bWVudFN5bWJvbHMuZXJyb3IiLHMpfXJldHVybiBufWZpbmRIaWVyYXJjaGljYWxEb2N1bWVudFN5bWJvbHMoZSx0PXtyZXN1bHRMaW1pdDpOdW1iZXIuTUFYX1ZBTFVFfSl7dmFyIHI7bGV0IG49W107dHJ5e2NvbnN0IHM9b24uZ2V0WWFtbERvY3VtZW50KGUpO2lmKCFzfHxzLmRvY3VtZW50cy5sZW5ndGg9PT0wKXJldHVybiBudWxsO2Zvcihjb25zdCBpIG9mIHMuZG9jdW1lbnRzKWkucm9vdCYmKG49bi5jb25jYXQodGhpcy5qc29uRG9jdW1lbnRTeW1ib2xzLmZpbmREb2N1bWVudFN5bWJvbHMyKGUsaSx0KSkpfWNhdGNoKHMpeyhyPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8ci5zZW5kRXJyb3IoInlhbWwuaGllcmFyY2hpY2FsRG9jdW1lbnRTeW1ib2xzLmVycm9yIixzKX1yZXR1cm4gbn19O2Z1bmN0aW9uIHp3KGUsdCl7Zm9yKGNvbnN0IG4gb2YgZSluLmlzS3ViZXJuZXRlcz10fWZ1bmN0aW9uIEVpKGUsdD0hMSl7Y29uc3Qgbj10PyInIjonIic7aWYoZS5sZW5ndGg9PT0wKXJldHVybmAke259JHtufWA7aWYoZS5sZW5ndGg9PT0xJiZlPT09JyInKXJldHVybiciXFwiIic7aWYoZS5sZW5ndGg9PT0yJiYoZVswXT09PSciJyYmZVsxXT09PSciJ3x8ZVswXT09PSInIiYmZVsxXT09PSInIikpcmV0dXJuIGVbMF09PT0nIic/JyJcXCJcXCIiJzpgIicnImA7aWYoZS5sZW5ndGg+PTIpe2NvbnN0IHI9ZVswXSxzPWVbZS5sZW5ndGgtMV07aWYocj09PSciJyYmcz09PSciJ3x8cj09PSInIiYmcz09PSInIilyZXR1cm4gZX1yZXR1cm4vWyJcXF0vLnRlc3QoZSk/SlNPTi5zdHJpbmdpZnkoZSk6L14oPzpvbnxvZmZ8dHJ1ZXxmYWxzZXx5ZXN8bm98bnVsbHx+KSQvaS50ZXN0KGUpP2Ake259JHtlfSR7bn1gOi9eLT8oPzowfFsxLTldXGQqKSg/OlwuXGQrKT8oPzpbZUVdWystXT9cZCspPyQvLnRlc3QoZSl8fC9eMHhbMC05YS1mQS1GXSskLy50ZXN0KGUpfHwvXjBvWzAtN10rJC8udGVzdChlKXx8L14wWzAtN10rJC8udGVzdChlKT9gIiR7ZX0iYDovXlxzfFxzJC8udGVzdChlKT90P2AnJHtlLnJlcGxhY2UoLycvZywiJyciKX0nYDpKU09OLnN0cmluZ2lmeShlKTovKD86XnxccykjLy50ZXN0KGUpP3Q/YCcke2UucmVwbGFjZSgvJy9nLCInJyIpfSdgOkpTT04uc3RyaW5naWZ5KGUpOi9eW1xdW3t9IyYqIXw+JyIlQGBdLy50ZXN0KGUpP3Q/YCcke2UucmVwbGFjZSgvJy9nLCInJyIpfSdgOkpTT04uc3RyaW5naWZ5KGUpOi9eWy0/Ol0oXHN8JCkvLnRlc3QoZSk/dD9gJyR7ZS5yZXBsYWNlKC8nL2csIicnIil9J2A6SlNPTi5zdHJpbmdpZnkoZSk6Lyg/Ol58W146XSk6KD86XHN8JCkvLnRlc3QoZSk/dD9gJyR7ZS5yZXBsYWNlKC8nL2csIicnIil9J2A6SlNPTi5zdHJpbmdpZnkoZSk6L1tcblx0XHJdLy50ZXN0KGUpP0pTT04uc3RyaW5naWZ5KGUpOmV9dmFyIEdSPWNsYXNze2NvbnN0cnVjdG9yKGUsdCl7dGhpcy50ZWxlbWV0cnk9dCx0aGlzLnNob3VsZEhvdmVyPSEwLHRoaXMuc2NoZW1hU2VydmljZT1lfWNvbmZpZ3VyZShlKXtlJiYodGhpcy5zaG91bGRIb3Zlcj1lLmhvdmVyLHRoaXMuc2hvdWxkSG92ZXJBbmNob3I9ZS5ob3ZlckFuY2hvcix0aGlzLmluZGVudGF0aW9uPWUuaW5kZW50YXRpb24sdGhpcy5ob3ZlclNjaGVtYVNvdXJjZT1lLmhvdmVyU2NoZW1hU291cmNlPz8hMCl9ZG9Ib3ZlcihlLHQsbj0hMSl7dmFyIHI7dHJ5e2lmKCF0aGlzLnNob3VsZEhvdmVyfHwhZSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZvaWQgMCk7Y29uc3Qgcz1vbi5nZXRZYW1sRG9jdW1lbnQoZSksaT1lLm9mZnNldEF0KHQpLG89bXUoaSxzKTtpZihvPT09bnVsbClyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHZvaWQgMCk7encocy5kb2N1bWVudHMsbik7Y29uc3QgYT1zLmRvY3VtZW50cy5pbmRleE9mKG8pO3JldHVybiBvLmN1cnJlbnREb2NJbmRleD1hLHRoaXMuZ2V0SG92ZXIoZSx0LG8pfWNhdGNoKHMpeyhyPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8ci5zZW5kRXJyb3IoInlhbWwuaG92ZXIuZXJyb3IiLHMpfX1nZXRIb3ZlcihlLHQsbil7Y29uc3Qgcj1lLm9mZnNldEF0KHQpO2xldCBzPW4uZ2V0Tm9kZUZyb21PZmZzZXQocik7aWYoIXN8fChzLnR5cGU9PT0ib2JqZWN0Inx8cy50eXBlPT09ImFycmF5IikmJnI+cy5vZmZzZXQrMSYmcjxzLm9mZnNldCtzLmxlbmd0aC0xKXJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7Y29uc3QgaT1zO2lmKHMudHlwZT09PSJzdHJpbmciKXtjb25zdCBsPXMucGFyZW50O2lmKGwmJmwudHlwZT09PSJwcm9wZXJ0eSImJmwua2V5Tm9kZT09PXMmJihzPWwudmFsdWVOb2RlLCFzKSlyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpfWNvbnN0IG89WS5jcmVhdGUoZS5wb3NpdGlvbkF0KGkub2Zmc2V0KSxlLnBvc2l0aW9uQXQoaS5vZmZzZXQraS5sZW5ndGgpKSxhPWw9Pih7Y29udGVudHM6e2tpbmQ6dnIuTWFya2Rvd24sdmFsdWU6bH0scmFuZ2U6b30pO2lmKHRoaXMuc2hvdWxkSG92ZXJBbmNob3ImJnMudHlwZT09PSJwcm9wZXJ0eSImJnMudmFsdWVOb2RlJiZzLnZhbHVlTm9kZS50eXBlPT09Im9iamVjdCIpe2NvbnN0IGw9dGhpcy5yZXNvbHZlTWVyZ2VLZXlzKHMudmFsdWVOb2RlLG4pLGY9ImBgYHlhbWxcbiIrRkQobCxudWxsLDIpKyJcbmBgYCI7cmV0dXJuIFByb21pc2UucmVzb2x2ZShhKGYpKX1jb25zdCB1PWw9PmwucmVwbGFjZSgvXHNcfFx8XHMqJC8sIiIpO3JldHVybiB0aGlzLnNjaGVtYVNlcnZpY2UuZ2V0U2NoZW1hRm9yUmVzb3VyY2UoZS51cmksbikudGhlbihsPT57aWYobCYmcyYmIWwuZXJyb3JzLmxlbmd0aCl7Y29uc3QgZj1uLmdldE1hdGNoaW5nU2NoZW1hcyhsLnNjaGVtYSxzLm9mZnNldCk7bGV0IGMscCxoPVtdO2NvbnN0IGQ9W10sbT1bXTtsZXQgZztmLmV2ZXJ5KGI9PigoYi5ub2RlPT09c3x8cy50eXBlPT09InByb3BlcnR5IiYmcy52YWx1ZU5vZGU9PT1iLm5vZGUpJiYhYi5pbnZlcnRlZCYmYi5zY2hlbWEmJihjPWN8fGIuc2NoZW1hLnRpdGxlfHxiLnNjaGVtYS5jbG9zZXN0VGl0bGUscD1wfHxiLnNjaGVtYS5tYXJrZG93bkRlc2NyaXB0aW9ufHx0aGlzLnRvTWFya2Rvd24oYi5zY2hlbWEuZGVzY3JpcHRpb24pLGIuc2NoZW1hLmVudW0mJihnPWIuc2NoZW1hLmVudW0uaW5kZXhPZihSbyhzKSksYi5zY2hlbWEubWFya2Rvd25FbnVtRGVzY3JpcHRpb25zP2g9Yi5zY2hlbWEubWFya2Rvd25FbnVtRGVzY3JpcHRpb25zOmIuc2NoZW1hLmVudW1EZXNjcmlwdGlvbnM/aD1iLnNjaGVtYS5lbnVtRGVzY3JpcHRpb25zLm1hcCh0aGlzLnRvTWFya2Rvd24sdGhpcyk6aD1bXSxiLnNjaGVtYS5lbnVtLmZvckVhY2goKEUsRik9Pnt2YXIgdjtFPXR5cGVvZiBFPT0ic3RyaW5nIj9FaShFLCExKTpKU09OLnN0cmluZ2lmeShFKTtjb25zdCBDPW0uZmluZEluZGV4KEE9PkEudmFsdWU9PT1FKTtDPDA/bS5wdXNoKHt2YWx1ZTpFLGRlc2NyaXB0aW9uOmhbRl19KToodj1tW0NdKS5kZXNjcmlwdGlvbnx8KHYuZGVzY3JpcHRpb249aFtGXSl9KSksYi5zY2hlbWEuYW55T2YmJlhSKHMsZixiLnNjaGVtYSkmJihjPSIiLHA9Yi5zY2hlbWEuZGVzY3JpcHRpb24/Yi5zY2hlbWEuZGVzY3JpcHRpb24rYApgOiIiLGIuc2NoZW1hLmFueU9mLmZvckVhY2goKEUsRik9PntjKz1FLnRpdGxlfHxiLnNjaGVtYS5jbG9zZXN0VGl0bGV8fCIiLHArPUUubWFya2Rvd25EZXNjcmlwdGlvbnx8dGhpcy50b01hcmtkb3duKEUuZGVzY3JpcHRpb24pfHwiIixGIT09Yi5zY2hlbWEuYW55T2YubGVuZ3RoLTEmJihjKz0iIHx8ICIscCs9IiB8fCAiKX0pLGM9dShjKSxwPXUocCkpLGIuc2NoZW1hLmV4YW1wbGVzJiZiLnNjaGVtYS5leGFtcGxlcy5mb3JFYWNoKEU9PntkLnB1c2goRkQoRSxudWxsLDIpKX0pKSwhMCkpO2xldCBEPSIiO3JldHVybiBjJiYoRD0iIyMjIyAiK3RoaXMudG9NYXJrZG93bihjKSkscCYmKEQ9bmYoRCksRCs9cCksbS5sZW5ndGghPT0wJiYoRD1uZihEKSxEKz1KKCJBbGxvd2VkIFZhbHVlczoiKStgCgpgLGcmJm0udW5zaGlmdChtLnNwbGljZShnLDEpWzBdKSxtLmZvckVhY2goYj0+e2IuZGVzY3JpcHRpb24/RCs9YCogXGAke0d3KGIudmFsdWUpfVxgOiAke2IuZGVzY3JpcHRpb259CmA6RCs9YCogXGAke0d3KGIudmFsdWUpfVxgCmB9KSksZC5sZW5ndGghPT0wJiZkLmZvckVhY2goYj0+e0Q9bmYoRCksRCs9SigiRXhhbXBsZToiKStgCgpgLEQrPWBcYFxgXGB5YW1sCiR7Yn1cYFxgXGAKYH0pLEQubGVuZ3RoPjAmJmwuc2NoZW1hLnVybCYmdGhpcy5ob3ZlclNjaGVtYVNvdXJjZSYmKEQ9bmYoRCksRCs9SigiU291cmNlOiBbezB9XSh7MX0pIixLUihsLnNjaGVtYSksbC5zY2hlbWEudXJsKSksYShEKX1yZXR1cm4gbnVsbH0pfXJlc29sdmVNZXJnZUtleXMoZSx0LG49MCl7Y29uc3Qgcj17fSxzPVsuLi5lLnByb3BlcnRpZXNdO2Zvcig7cy5sZW5ndGg+MDspe2NvbnN0IGk9cy5zaGlmdCgpLG89aS5rZXlOb2RlLnZhbHVlO2lmKG89PT0iPDwiJiZpLnZhbHVlTm9kZSl7Y29uc3QgYT10aGlzLnJlc29sdmVNZXJnZVZhbHVlKGkudmFsdWVOb2RlLHQsbisxKTtpZihhJiZ0eXBlb2YgYT09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGEpKXtjb25zdCB1PU9iamVjdC5rZXlzKGEpO2Zvcihjb25zdCBsIG9mIHUpcltsXT1hW2xdfX1lbHNlIHJbb109dGhpcy5hc3ROb2RlVG9WYWx1ZShpLnZhbHVlTm9kZSx0LG4pfXJldHVybiByfXJlc29sdmVNZXJnZVZhbHVlKGUsdCxuKXtyZXR1cm4gbj49MTA/eyI8PCI6ZS5wYXJlbnQuaW50ZXJuYWxOb2RlLnZhbHVlKyIgKHJlY3Vyc2lvbiBsaW1pdCByZWFjaGVkKSJ9OmUudHlwZT09PSJvYmplY3QiP3RoaXMucmVzb2x2ZU1lcmdlS2V5cyhlLHQsbik6dGhpcy5hc3ROb2RlVG9WYWx1ZShlLHQsbil9YXN0Tm9kZVRvVmFsdWUoZSx0LG4pe2lmKCFlKXJldHVybiBudWxsO3N3aXRjaChlLnR5cGUpe2Nhc2Uib2JqZWN0IjpyZXR1cm4gdGhpcy5yZXNvbHZlTWVyZ2VLZXlzKGUsdCxuKTtjYXNlImFycmF5IjpyZXR1cm4gZS5jaGlsZHJlbi5tYXAocj0+dGhpcy5hc3ROb2RlVG9WYWx1ZShyLHQsbikpO2Nhc2Uic3RyaW5nIjpjYXNlIm51bWJlciI6Y2FzZSJib29sZWFuIjpjYXNlIm51bGwiOnJldHVybiBlLnZhbHVlO2RlZmF1bHQ6cmV0dXJuIHRoaXMubm9kZVRvVmFsdWUoZS5pbnRlcm5hbE5vZGUpfX1ub2RlVG9WYWx1ZShlKXtpZihPdChlKSlyZXR1cm4gZS5zb3VyY2U7aWYoemUoZSkpe2NvbnN0IHQ9e307Zm9yKGNvbnN0IG4gb2YgZS5pdGVtcylpZihuLmtleSYmbi52YWx1ZSl7Y29uc3Qgcj10aGlzLm5vZGVUb1ZhbHVlKG4ua2V5KSxzPXRoaXMubm9kZVRvVmFsdWUobi52YWx1ZSk7dHlwZW9mIHI9PSJzdHJpbmciJiYodFtyXT1zKX1yZXR1cm4gdH1yZXR1cm4gUmUoZSk/ZS5pdGVtcy5tYXAodD0+dGhpcy5ub2RlVG9WYWx1ZSh0KSk6ZS52YWx1ZX10b01hcmtkb3duKGUpe2lmKGUpe2xldCB0PWUucmVwbGFjZSgvKFteXG5ccl0pKFxyP1xuKShbXlxuXHJdKS9nbSxgJDEKCiQzYCk7aWYodD10LnJlcGxhY2UoL1tcXGAqX3t9W1xdIyshXS9nLCJcXCQmIiksdGhpcy5pbmRlbnRhdGlvbiE9PXZvaWQgMCl7Y29uc3Qgbj1uZXcgUmVnRXhwKGAgeyR7dGhpcy5pbmRlbnRhdGlvbi5sZW5ndGh9fWAsImciKTt0PXQucmVwbGFjZShuLCImZW1zcDsiKX1yZXR1cm4gdH19fTtmdW5jdGlvbiBuZihlKXtyZXR1cm4gZS5sZW5ndGg9PT0wP2U6KGUuZW5kc1dpdGgoYApgKXx8KGUrPWAKYCksZStgCmApfWZ1bmN0aW9uIEtSKGUpe2xldCB0PSJKU09OIFNjaGVtYSI7Y29uc3Qgbj1lLnVybDtpZihuKXtjb25zdCByPXJ0LnBhcnNlKG4pO3Q9Wm4uYmFzZW5hbWUoci5mc1BhdGgpfWVsc2UgZS50aXRsZSYmKHQ9ZS50aXRsZSk7cmV0dXJuIHR9ZnVuY3Rpb24gR3coZSl7cmV0dXJuIGUuaW5kZXhPZigiYCIpIT09LTE/ImBgICIrZSsiIGBgIjplfWZ1bmN0aW9uIFhSKGUsdCxuKXtsZXQgcj0wO2Zvcihjb25zdCBzIG9mIHQpZT09PXMubm9kZSYmcy5zY2hlbWEhPT1uJiZuLmFueU9mLmZvckVhY2goaT0+e3Muc2NoZW1hLnRpdGxlPT09aS50aXRsZSYmcy5zY2hlbWEuZGVzY3JpcHRpb249PT1pLmRlc2NyaXB0aW9uJiZzLnNjaGVtYS5wcm9wZXJ0aWVzPT09aS5wcm9wZXJ0aWVzJiZyKyt9KTtyZXR1cm4gcj09PW4uYW55T2YubGVuZ3RofXZhciBZUj0vXlxzKiNccyp5YW1sLWxhbmd1YWdlLXNlcnZlci1kaXNhYmxlXGIoLiopJC87ZnVuY3Rpb24gUVIoZSl7Y29uc3QgdD1lLnRyaW0oKTtyZXR1cm4gdD90LnNwbGl0KCIsIikubWFwKG49Pm4udHJpbSgpLnRvTG93ZXJDYXNlKCkpLmZpbHRlcihuPT5uLmxlbmd0aD4wKTpbXX1mdW5jdGlvbiBaUihlLHQpe2lmKGUubGVuZ3RoPT09MClyZXR1cm4hMDtjb25zdCBuPXQudG9Mb3dlckNhc2UoKTtyZXR1cm4gZS5zb21lKHI9Pm4uaW5jbHVkZXMocikpfWZ1bmN0aW9uIGVqKGUsdCxuLHIpe3JldHVybiBlLmZpbHRlcihzPT57Y29uc3QgaT10KHMpO2lmKGk9PT0wKXJldHVybiEwO2NvbnN0IG89cihpLTEpO2lmKG89PT12b2lkIDApcmV0dXJuITA7Y29uc3QgYT1ZUi5leGVjKG8pO2lmKCFhKXJldHVybiEwO2NvbnN0IHU9UVIoYVsxXSk7cmV0dXJuIVpSKHUsbihzKSl9KX12YXIgdGo9Y2xhc3N7dmFsaWRhdGUoZSx0KXtjb25zdCBuPVtdLHI9bmV3IFNldCxzPW5ldyBTZXQsaT1uZXcgU2V0LG89bmV3IE1hcDtiZSh0LmludGVybmFsRG9jdW1lbnQsKGEsdSxsKT0+e2dlKHUpJiYoKEllKHUpfHxaKHUpKSYmdS5hbmNob3ImJihyLmFkZCh1KSxvLnNldCh1LGxbbC5sZW5ndGgtMV0pKSxPdCh1KSYmKHUucmVzb2x2ZSh0LmludGVybmFsRG9jdW1lbnQpP3MuYWRkKHUucmVzb2x2ZSh0LmludGVybmFsRG9jdW1lbnQpKTppLmFkZCh1KSkpfSk7Zm9yKGNvbnN0IGEgb2YgcilpZighcy5oYXMoYSkpe2NvbnN0IHU9dGhpcy5nZXRBbmNob3JOb2RlKG8uZ2V0KGEpLGEpO2lmKHUpe2NvbnN0IGw9WS5jcmVhdGUoZS5wb3NpdGlvbkF0KHUub2Zmc2V0KSxlLnBvc2l0aW9uQXQodS5vZmZzZXQrdS5zb3VyY2UubGVuZ3RoKSksZj1QdC5jcmVhdGUobCxKKCdVbnVzZWQgYW5jaG9yICJ7MH0iJyx1LnNvdXJjZSksUS5JbmZvcm1hdGlvbiwwKTtmLnRhZ3M9W1p1LlVubmVjZXNzYXJ5XSxuLnB1c2goZil9fXJldHVybiBpLmZvckVhY2goYT0+e2NvbnN0IHU9YS5yYW5nZTtpZih1KXtjb25zdCBsPXVbMF0sZj11WzFdLGM9WS5jcmVhdGUoZS5wb3NpdGlvbkF0KGwpLGUucG9zaXRpb25BdChmKSkscD1QdC5jcmVhdGUoYyxKKCdVbnJlc29sdmVkIGFsaWFzICJ7MH0iJyxhLnRvU3RyaW5nKCkpLFEuSW5mb3JtYXRpb24sMCk7cC50YWdzPVtadS5Vbm5lY2Vzc2FyeV0sbi5wdXNoKHApfX0pLG59Z2V0QW5jaG9yTm9kZShlLHQpe2lmKGUmJmUuc3JjVG9rZW4pe2NvbnN0IG49ZS5zcmNUb2tlbjtpZihxbShuKSlyZXR1cm4gS3cobik7aWYoZ0QobikpZm9yKGNvbnN0IHIgb2Ygbi5pdGVtcyl7aWYodC5zcmNUb2tlbiE9PXIudmFsdWUpY29udGludWU7Y29uc3Qgcz1LdyhyKTtpZihzKXJldHVybiBzfX19fTtmdW5jdGlvbiBLdyhlKXtmb3IoY29uc3QgdCBvZiBlLnN0YXJ0KWlmKHQudHlwZT09PSJhbmNob3IiKXJldHVybiB0O2lmKGUuc2VwJiZBcnJheS5pc0FycmF5KGUuc2VwKSl7Zm9yKGNvbnN0IHQgb2YgZS5zZXApaWYodC50eXBlPT09ImFuY2hvciIpcmV0dXJuIHR9fXZhciBuaj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLmZvcmJpZE1hcHBpbmc9ZS5mbG93TWFwcGluZz09PSJmb3JiaWQiLHRoaXMuZm9yYmlkU2VxdWVuY2U9ZS5mbG93U2VxdWVuY2U9PT0iZm9yYmlkIn12YWxpZGF0ZShlLHQpe2NvbnN0IG49W107cmV0dXJuIGJlKHQuaW50ZXJuYWxEb2N1bWVudCwocixzKT0+e3ZhciBpLG87dGhpcy5mb3JiaWRNYXBwaW5nJiZ6ZShzKSYmKChpPXMuc3JjVG9rZW4pPT1udWxsP3ZvaWQgMDppLnR5cGUpPT09ImZsb3ctY29sbGVjdGlvbiImJm4ucHVzaChQdC5jcmVhdGUodGhpcy5nZXRSYW5nZU9mKGUscy5zcmNUb2tlbiksSigiRmxvdyBzdHlsZSBtYXBwaW5nIGlzIGZvcmJpZGRlbiIpLFEuRXJyb3IsImZsb3dNYXAiKSksdGhpcy5mb3JiaWRTZXF1ZW5jZSYmUmUocykmJigobz1zLnNyY1Rva2VuKT09bnVsbD92b2lkIDA6by50eXBlKT09PSJmbG93LWNvbGxlY3Rpb24iJiZuLnB1c2goUHQuY3JlYXRlKHRoaXMuZ2V0UmFuZ2VPZihlLHMuc3JjVG9rZW4pLEooIkZsb3cgc3R5bGUgc2VxdWVuY2UgaXMgZm9yYmlkZGVuIiksUS5FcnJvciwiZmxvd1NlcSIpKX0pLG59Z2V0UmFuZ2VPZihlLHQpe2NvbnN0IG49dC5lbmRbMF0ub2Zmc2V0O2xldCByPWUucG9zaXRpb25BdChuKTtyZXR1cm4gcj17Y2hhcmFjdGVyOnIuY2hhcmFjdGVyKzEsbGluZTpyLmxpbmV9LFkuY3JlYXRlKGUucG9zaXRpb25BdCh0LnN0YXJ0Lm9mZnNldCkscil9fSxyaj1jbGFzc3t2YWxpZGF0ZShlLHQpe2NvbnN0IG49W107cmV0dXJuIGJlKHQuaW50ZXJuYWxEb2N1bWVudCwocixzKT0+e2lmKHplKHMpKXtmb3IobGV0IGk9MTtpPHMuaXRlbXMubGVuZ3RoO2krKylpZihpaihzLml0ZW1zW2ktMV0scy5pdGVtc1tpXSk+MCl7Y29uc3Qgbz1zaihlLHMuaXRlbXNbaS0xXSk7bi5wdXNoKFB0LmNyZWF0ZShvLGBXcm9uZyBvcmRlcmluZyBvZiBrZXkgIiR7cy5pdGVtc1tpLTFdLmtleX0iIGluIG1hcHBpbmdgLFEuRXJyb3IsIm1hcEtleU9yZGVyIikpO2JyZWFrfX19KSxufX07ZnVuY3Rpb24gc2ooZSx0KXtjb25zdCBuPXQua2V5LnNyY1Rva2VuLHI9bi5vZmZzZXQscz1yK24uc291cmNlLmxlbmd0aDtyZXR1cm4gWS5jcmVhdGUoZS5wb3NpdGlvbkF0KHIpLGUucG9zaXRpb25BdChzKSl9ZnVuY3Rpb24gaWooZSx0KXtjb25zdCBuPVN0cmluZyh0LmtleSk7cmV0dXJuIFN0cmluZyhlLmtleSkubG9jYWxlQ29tcGFyZShuKX12YXIgb2o9KGUsdCk9Pntjb25zdCBuPXQucG9zaXRpb25BdChlLmxvY2F0aW9uLnN0YXJ0KSxyPXtzdGFydDpuLGVuZDplLmxvY2F0aW9uLnRvTGluZUVuZD91dC5jcmVhdGUobi5saW5lLG5ldyBXcih0KS5nZXRMaW5lTGVuZ3RoKG4ubGluZSkpOnQucG9zaXRpb25BdChlLmxvY2F0aW9uLmVuZCl9O3JldHVybiBQdC5jcmVhdGUocixlLm1lc3NhZ2UsZS5zZXZlcml0eSxlLmNvZGUsWGMpfSxhaj1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMudGVsZW1ldHJ5PXQsdGhpcy52YWxpZGF0b3JzPVtdLHRoaXMuTUFUQ0hFU19NVUxUSVBMRT0iTWF0Y2hlcyBtdWx0aXBsZSBzY2hlbWFzIHdoZW4gb25seSBvbmUgbXVzdCB2YWxpZGF0ZS4iLHRoaXMudmFsaWRhdGlvbkVuYWJsZWQ9ITAsdGhpcy5qc29uVmFsaWRhdGlvbj1uZXcgSU8oZSxQcm9taXNlKX1jb25maWd1cmUoZSl7dGhpcy52YWxpZGF0b3JzPVtdLGUmJih0aGlzLnZhbGlkYXRpb25FbmFibGVkPWUudmFsaWRhdGUsdGhpcy5jdXN0b21UYWdzPWUuY3VzdG9tVGFncyx0aGlzLmRpc2FibGVBZGRpdGlvbmFsUHJvcGVydGllcz1lLmRpc2FibGVBZGRpdGlvbmFsUHJvcGVydGllcyx0aGlzLnlhbWxWZXJzaW9uPWUueWFtbFZlcnNpb24sKGUuZmxvd01hcHBpbmc9PT0iZm9yYmlkInx8ZS5mbG93U2VxdWVuY2U9PT0iZm9yYmlkIikmJnRoaXMudmFsaWRhdG9ycy5wdXNoKG5ldyBuaihlKSksZS5rZXlPcmRlcmluZyYmdGhpcy52YWxpZGF0b3JzLnB1c2gobmV3IHJqKSksdGhpcy52YWxpZGF0b3JzLnB1c2gobmV3IHRqKX1hc3luYyBkb1ZhbGlkYXRpb24oZSx0PSExKXt2YXIgYTtpZighdGhpcy52YWxpZGF0aW9uRW5hYmxlZClyZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtjb25zdCBuPVtdO3RyeXtjb25zdCB1PW9uLmdldFlhbWxEb2N1bWVudChlLHtjdXN0b21UYWdzOnRoaXMuY3VzdG9tVGFncyx5YW1sVmVyc2lvbjp0aGlzLnlhbWxWZXJzaW9ufSwhMCk7bGV0IGw9MDtmb3IoY29uc3QgZiBvZiB1LmRvY3VtZW50cyl7Zi5pc0t1YmVybmV0ZXM9dCxmLmN1cnJlbnREb2NJbmRleD1sLGYuZGlzYWJsZUFkZGl0aW9uYWxQcm9wZXJ0aWVzPXRoaXMuZGlzYWJsZUFkZGl0aW9uYWxQcm9wZXJ0aWVzLGYudXJpPWUudXJpO2NvbnN0IGM9YXdhaXQgdGhpcy5qc29uVmFsaWRhdGlvbi5kb1ZhbGlkYXRpb24oZSxmKSxwPWY7cC5lcnJvcnMubGVuZ3RoPjAmJm4ucHVzaCguLi5wLmVycm9ycykscC53YXJuaW5ncy5sZW5ndGg+MCYmbi5wdXNoKC4uLnAud2FybmluZ3MpLG4ucHVzaCguLi5jKSxuLnB1c2goLi4udGhpcy5ydW5BZGRpdGlvbmFsVmFsaWRhdG9ycyhlLGYpKSxsKyt9fWNhdGNoKHUpeyhhPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8YS5zZW5kRXJyb3IoInlhbWwudmFsaWRhdGlvbi5lcnJvciIsdSl9bGV0IHI7Y29uc3Qgcz1uZXcgU2V0LGk9W107Zm9yKGxldCB1IG9mIG4pe2lmKHQmJnUubWVzc2FnZT09PXRoaXMuTUFUQ0hFU19NVUxUSVBMRSljb250aW51ZTtpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodSwibG9jYXRpb24iKSYmKHU9b2oodSxlKSksdS5zb3VyY2V8fCh1LnNvdXJjZT1YYyksciYmci5tZXNzYWdlPT09dS5tZXNzYWdlJiZyLnJhbmdlLmVuZC5saW5lPT09dS5yYW5nZS5zdGFydC5saW5lJiZNYXRoLmFicyhyLnJhbmdlLmVuZC5jaGFyYWN0ZXItdS5yYW5nZS5lbmQuY2hhcmFjdGVyKT49MSl7ci5yYW5nZS5lbmQ9dS5yYW5nZS5lbmQ7Y29udGludWV9ZWxzZSByPXU7Y29uc3QgbD11LnJhbmdlLnN0YXJ0LmxpbmUrIiAiK3UucmFuZ2Uuc3RhcnQuY2hhcmFjdGVyKyIgIit1Lm1lc3NhZ2U7cy5oYXMobCl8fChpLnB1c2godSkscy5hZGQobCkpfWNvbnN0IG89bmV3IFdyKGUpO3JldHVybiBlaihpLHU9PnUucmFuZ2Uuc3RhcnQubGluZSx1PT51Lm1lc3NhZ2UsdT0+e2lmKCEodTwwfHx1Pj1vLmdldExpbmVDb3VudCgpKSlyZXR1cm4gby5nZXRMaW5lQ29udGVudCh1KS5yZXBsYWNlKC9bXHJcbl0rJC8sIiIpfSl9cnVuQWRkaXRpb25hbFZhbGlkYXRvcnMoZSx0KXtjb25zdCBuPVtdO2Zvcihjb25zdCByIG9mIHRoaXMudmFsaWRhdG9ycyluLnB1c2goLi4uci52YWxpZGF0ZShlLHQpKTtyZXR1cm4gbn19LHVqPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5mb3JtYXR0ZXJFbmFibGVkPSEwfWNvbmZpZ3VyZShlKXtlJiYodGhpcy5mb3JtYXR0ZXJFbmFibGVkPWUuZm9ybWF0KX1hc3luYyBmb3JtYXQoZSx0PXt9KXtpZighdGhpcy5mb3JtYXR0ZXJFbmFibGVkKXJldHVybltdO3RyeXtjb25zdCBuPWUuZ2V0VGV4dCgpLHI9e3BhcnNlcjoieWFtbCIscGx1Z2luczpbbGssY19dLHRhYldpZHRoOnQudGFiV2lkdGh8fHQudGFiU2l6ZSxzaW5nbGVRdW90ZTp0LnNpbmdsZVF1b3RlLGJyYWNrZXRTcGFjaW5nOnQuYnJhY2tldFNwYWNpbmcscHJvc2VXcmFwOnQucHJvc2VXcmFwPT09ImFsd2F5cyI/ImFsd2F5cyI6dC5wcm9zZVdyYXA9PT0ibmV2ZXIiPyJuZXZlciI6InByZXNlcnZlIixwcmludFdpZHRoOnQucHJpbnRXaWR0aCx0cmFpbGluZ0NvbW1hOnQudHJhaWxpbmdDb21tYT09PSExPyJub25lIjoiYWxsIn0scz1hd2FpdCBJbShuLHIpO3JldHVybiBzPT09bj9bXTpbRGUucmVwbGFjZShZLmNyZWF0ZSh1dC5jcmVhdGUoMCwwKSxlLnBvc2l0aW9uQXQobi5sZW5ndGgpKSxzKV19Y2F0Y2h7cmV0dXJuW119fX0sbGo9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy50ZWxlbWV0cnk9ZX1maW5kTGlua3MoZSl7dmFyIHQ7dHJ5e2NvbnN0IG49b24uZ2V0WWFtbERvY3VtZW50KGUpLHI9W107Zm9yKGNvbnN0IHMgb2Ygbi5kb2N1bWVudHMpci5wdXNoKFVPKGUscykpO3JldHVybiBQcm9taXNlLmFsbChyKS50aGVuKHM9PltdLmNvbmNhdCguLi5zKSl9Y2F0Y2gobil7KHQ9dGhpcy50ZWxlbWV0cnkpPT1udWxsfHx0LnNlbmRFcnJvcigieWFtbC5kb2N1bWVudExpbmsuZXJyb3IiLG4pfX19O2Z1bmN0aW9uIGNqKGUsdCl7aWYoIWUpcmV0dXJuO2NvbnN0IG49W10scj1vbi5nZXRZYW1sRG9jdW1lbnQoZSk7Zm9yKGNvbnN0IGkgb2Ygci5kb2N1bWVudHMpci5kb2N1bWVudHMubGVuZ3RoPjEmJm4ucHVzaChyZihlLGkucm9vdCkpLGkudmlzaXQobz0+e3ZhciBhO2lmKG8udHlwZT09PSJvYmplY3QiJiYoKGE9by5wYXJlbnQpPT1udWxsP3ZvaWQgMDphLnR5cGUpPT09ImFycmF5IiYmbi5wdXNoKHJmKGUsbykpLG8udHlwZT09PSJwcm9wZXJ0eSImJm8udmFsdWVOb2RlKXN3aXRjaChvLnZhbHVlTm9kZS50eXBlKXtjYXNlImFycmF5IjpjYXNlIm9iamVjdCI6bi5wdXNoKHJmKGUsbykpO2JyZWFrO2Nhc2Uic3RyaW5nIjp7Y29uc3QgdT1lLnBvc2l0aW9uQXQoby5vZmZzZXQpLGw9ZS5wb3NpdGlvbkF0KG8udmFsdWVOb2RlLm9mZnNldCtvLnZhbHVlTm9kZS5sZW5ndGgpO3UubGluZSE9PWwubGluZSYmbi5wdXNoKHJmKGUsbykpO2JyZWFrfWRlZmF1bHQ6cmV0dXJuITB9cmV0dXJuITB9KTtjb25zdCBzPXQmJnQucmFuZ2VMaW1pdDtyZXR1cm4gdHlwZW9mIHMhPSJudW1iZXIifHxuLmxlbmd0aDw9cz9uOih0JiZ0Lm9uUmFuZ2VMaW1pdEV4Y2VlZGVkJiZ0Lm9uUmFuZ2VMaW1pdEV4Y2VlZGVkKGUudXJpKSxuLnNsaWNlKDAsdC5yYW5nZUxpbWl0KSl9ZnVuY3Rpb24gcmYoZSx0KXtjb25zdCBuPWUucG9zaXRpb25BdCh0Lm9mZnNldCk7bGV0IHI9ZS5wb3NpdGlvbkF0KHQub2Zmc2V0K3QubGVuZ3RoKTtjb25zdCBzPWUuZ2V0VGV4dChZLmNyZWF0ZShuLHIpKSxpPXMubGVuZ3RoLXMudHJpbVJpZ2h0KCkubGVuZ3RoO3JldHVybiBpPjAmJihyPWUucG9zaXRpb25BdCh0Lm9mZnNldCt0Lmxlbmd0aC1pKSkscHAuY3JlYXRlKG4ubGluZSxyLmxpbmUsbi5jaGFyYWN0ZXIsci5jaGFyYWN0ZXIpfXZhciBzZjsoZnVuY3Rpb24oZSl7ZS5KVU1QX1RPX1NDSEVNQT0ianVtcFRvU2NoZW1hIn0pKHNmfHwoc2Y9e30pKTt2YXIgZmo9Y2xhc3N7Y29uc3RydWN0b3IoZSx0KXt0aGlzLmluZGVudGF0aW9uPWUsdGhpcy5tYXhMaW5lTGVuZ3RoPXR9d3JpdGVGb2xkZWRCbG9ja1NjYWxhcihlKXtpZihlLnR5cGUhPT0iUVVPVEVfRE9VQkxFIiYmZS50eXBlIT09IlFVT1RFX1NJTkdMRSIpcmV0dXJuIG51bGw7Y29uc3QgdD1lLnZhbHVlLG49ZS5zcmNUb2tlbi5pbmRlbnQ7bGV0IHI9dGhpcy5pbmRlbnRhdGlvbjtmb3IobGV0IGw9MDtsPG4vdGhpcy5pbmRlbnRhdGlvbi5sZW5ndGg7bCsrKXIrPXRoaXMuaW5kZW50YXRpb247Y29uc3Qgcz1bXSxpPXQuc3BsaXQoYApgKTtmb3IoY29uc3QgbCBvZiBpKXtsZXQgZj1sO2U6Zm9yKDtmLmxlbmd0aD50aGlzLm1heExpbmVMZW5ndGg7KXtsZXQgYz10aGlzLm1heExpbmVMZW5ndGg7Zm9yKDshLyAvLnRlc3QoZi5jaGFyQXQoYykpOylpZihjKyssYz49Zi5sZW5ndGgpYnJlYWsgZTtmb3IoOy8gLy50ZXN0KGYuY2hhckF0KGMpKTspaWYoYysrLGM+PWYubGVuZ3RoKWJyZWFrIGU7Y29uc3QgcD1mLnN1YnN0cmluZygwLGMtMSk7cy5wdXNoKHApLGY9Zi5zdWJzdHJpbmcoYyl9cy5wdXNoKGYpLHMucHVzaChgCmApfXMucG9wKCk7Zm9yKGxldCBsPTE7bDxzLmxlbmd0aDspe2lmKC9eWyBcdF0rJC8udGVzdChzW2xdKSlpZihzW2wtMV09PT1gCmB8fHNbbC0xXT09PSIiKXtzLnNwbGljZShsLTEsMSk7Y29udGludWV9ZWxzZSByZXR1cm4gbnVsbDtsKyt9bGV0IG89Ij4iO3Nbcy5sZW5ndGgtMV0hPT1gCmAmJnNbcy5sZW5ndGgtMV0hPT0iIj9vKz0iLSI6KHNbcy5sZW5ndGgtMl09PT1gCmB8fHNbcy5sZW5ndGgtMl09PT0iIikmJnNbcy5sZW5ndGgtM10hPT1gCmAmJnNbcy5sZW5ndGgtM10hPT0iIj9zLnNwbGljZShzLmxlbmd0aC0yLDIpOm8rPSIrIiwvIC8udGVzdCh0LmNoYXJBdCgwKSkmJihvKz1gJHtyLmxlbmd0aH1gKTtjb25zdCBhPXMuZmxhdE1hcChsPT5sPT09YApgfHxsPT09IiI/W3t0eXBlOiJuZXdsaW5lIixpbmRlbnQ6MCxvZmZzZXQ6ZS5zcmNUb2tlbi5vZmZzZXQsc291cmNlOmAKYH1dOlt7dHlwZToibmV3bGluZSIsaW5kZW50OjAsb2Zmc2V0OmUuc3JjVG9rZW4ub2Zmc2V0LHNvdXJjZTpgCmB9LHt0eXBlOiJzcGFjZSIsaW5kZW50OjAsb2Zmc2V0OmUuc3JjVG9rZW4ub2Zmc2V0LHNvdXJjZTpyfSx7dHlwZToic2NhbGFyIixpbmRlbnQ6MCxvZmZzZXQ6ZS5zcmNUb2tlbi5vZmZzZXQsc291cmNlOmx9XSk7YS51bnNoaWZ0KHt0eXBlOiJibG9jay1zY2FsYXItaGVhZGVyIixzb3VyY2U6byxvZmZzZXQ6ZS5zcmNUb2tlbi5vZmZzZXQsaW5kZW50OjB9KTtjb25zdCB1PXt0eXBlOiJibG9jay1zY2FsYXIiLG9mZnNldDplLnNyY1Rva2VuLm9mZnNldCxpbmRlbnQ6MCxzb3VyY2U6IiIscHJvcHM6YX07cmV0dXJuIEVsKHUpfXdyaXRlTGl0ZXJhbEJsb2NrU2NhbGFyKGUpe2lmKGUudHlwZSE9PSJRVU9URV9ET1VCTEUiJiZlLnR5cGUhPT0iUVVPVEVfU0lOR0xFIilyZXR1cm4gbnVsbDtjb25zdCB0PWUudmFsdWU7aWYodC5pbmRleE9mKGAKYCk8MClyZXR1cm4gbnVsbDtjb25zdCBuPWUuc3JjVG9rZW4uaW5kZW50O2xldCByPXRoaXMuaW5kZW50YXRpb247Zm9yKGxldCB1PTA7dTxuL3RoaXMuaW5kZW50YXRpb24ubGVuZ3RoO3UrKylyKz10aGlzLmluZGVudGF0aW9uO2NvbnN0IHM9dC5zcGxpdChgCmApO2xldCBpPSJ8IjtzW3MubGVuZ3RoLTFdIT09YApgJiZzW3MubGVuZ3RoLTFdIT09IiI/aSs9Ii0iOnNbcy5sZW5ndGgtMl0hPT1gCmAmJnNbcy5sZW5ndGgtMl0hPT0iIj9zLnNwbGljZShzLmxlbmd0aC0xLDEpOmkrPSIrIiwvIC8udGVzdCh0LmNoYXJBdCgwKSkmJihpKz1gJHtyLmxlbmd0aH1gKTtjb25zdCBvPXMuZmxhdE1hcCh1PT51PT09IiI/W3t0eXBlOiJuZXdsaW5lIixpbmRlbnQ6MCxvZmZzZXQ6ZS5zcmNUb2tlbi5vZmZzZXQsc291cmNlOmAKYH1dOlt7dHlwZToibmV3bGluZSIsaW5kZW50OjAsb2Zmc2V0OmUuc3JjVG9rZW4ub2Zmc2V0LHNvdXJjZTpgCmB9LHt0eXBlOiJzcGFjZSIsaW5kZW50OjAsb2Zmc2V0OmUuc3JjVG9rZW4ub2Zmc2V0LHNvdXJjZTpyfSx7dHlwZToic2NhbGFyIixpbmRlbnQ6MCxvZmZzZXQ6ZS5zcmNUb2tlbi5vZmZzZXQsc291cmNlOnV9XSk7by51bnNoaWZ0KHt0eXBlOiJibG9jay1zY2FsYXItaGVhZGVyIixzb3VyY2U6aSxvZmZzZXQ6ZS5zcmNUb2tlbi5vZmZzZXQsaW5kZW50OjB9KTtjb25zdCBhPXt0eXBlOiJibG9jay1zY2FsYXIiLG9mZnNldDplLnNyY1Rva2VuLm9mZnNldCxpbmRlbnQ6MCxzb3VyY2U6IiIscHJvcHM6b307cmV0dXJuIEVsKGEpfX0scGo9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5pbmRlbnRhdGlvbj1lfXdyaXRlKGUpe2lmKGUuaW50ZXJuYWxOb2RlLnNyY1Rva2VuLnR5cGUhPT0iZmxvdy1jb2xsZWN0aW9uIilyZXR1cm4gbnVsbDtjb25zdCB0PWUuaW50ZXJuYWxOb2RlLnNyY1Rva2VuLG49dC5zdGFydC50eXBlPT09ImZsb3ctbWFwLXN0YXJ0Ij8iYmxvY2stbWFwIjoiYmxvY2stc2VxIixyPWUucGFyZW50LnR5cGUscz17dHlwZTpuLG9mZnNldDp0Lm9mZnNldCxpbmRlbnQ6dC5pbmRlbnQsaXRlbXM6W119O2Zvcihjb25zdCBpIG9mIHQuaXRlbXMpV3MoaSwoe2tleTpvLHNlcDphLHZhbHVlOnV9KT0+e2lmKG49PT0iYmxvY2stbWFwIil7Y29uc3QgbD1be3R5cGU6InNwYWNlIixpbmRlbnQ6MCxvZmZzZXQ6by5vZmZzZXQsc291cmNlOnRoaXMuaW5kZW50YXRpb259XTtyPT09InByb3BlcnR5IiYmbC51bnNoaWZ0KHt0eXBlOiJuZXdsaW5lIixpbmRlbnQ6MCxvZmZzZXQ6by5vZmZzZXQsc291cmNlOmAKYH0pLHMuaXRlbXMucHVzaCh7c3RhcnQ6bCxrZXk6byxzZXA6YSx2YWx1ZTp1fSl9ZWxzZSBuPT09ImJsb2NrLXNlcSImJnMuaXRlbXMucHVzaCh7c3RhcnQ6W3t0eXBlOiJuZXdsaW5lIixpbmRlbnQ6MCxvZmZzZXQ6dS5vZmZzZXQsc291cmNlOmAKYH0se3R5cGU6InNwYWNlIixpbmRlbnQ6MCxvZmZzZXQ6dS5vZmZzZXQsc291cmNlOnRoaXMuaW5kZW50YXRpb259LHt0eXBlOiJzZXEtaXRlbS1pbmQiLGluZGVudDowLG9mZnNldDp1Lm9mZnNldCxzb3VyY2U6Ii0ifSx7dHlwZToic3BhY2UiLGluZGVudDowLG9mZnNldDp1Lm9mZnNldCxzb3VyY2U6IiAifV0sdmFsdWU6dX0pO2lmKHUudHlwZT09PSJmbG93LWNvbGxlY3Rpb24iKXJldHVybiBiZS5TS0lQfSk7cmV0dXJuIEVsKHMpfX0saGo9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy5jbGllbnRDYXBhYmlsaXRpZXM9ZSx0aGlzLmluZGVudGF0aW9uPSIgICIsdGhpcy5saW5lV2lkdGg9ODB9Y29uZmlndXJlKGUsdCl7dGhpcy5pbmRlbnRhdGlvbj1lLmluZGVudGF0aW9uLHRoaXMubGluZVdpZHRoPXR9Z2V0Q29kZUFjdGlvbihlLHQpe2lmKCF0LmNvbnRleHQuZGlhZ25vc3RpY3MpcmV0dXJuO2NvbnN0IG49W107cmV0dXJuIG4ucHVzaCguLi50aGlzLmdldENvbnZlcnRUb0Jvb2xlYW5BY3Rpb25zKHQuY29udGV4dC5kaWFnbm9zdGljcyxlKSksbi5wdXNoKC4uLnRoaXMuZ2V0SnVtcFRvU2NoZW1hQWN0aW9ucyh0LmNvbnRleHQuZGlhZ25vc3RpY3MpKSxuLnB1c2goLi4udGhpcy5nZXRUYWJUb1NwYWNlQ29udmVydGluZyh0LmNvbnRleHQuZGlhZ25vc3RpY3MsZSkpLG4ucHVzaCguLi50aGlzLmdldFVudXNlZEFuY2hvcnNEZWxldGUodC5jb250ZXh0LmRpYWdub3N0aWNzLGUpKSxuLnB1c2goLi4udGhpcy5nZXRDb252ZXJ0VG9CbG9ja1N0eWxlQWN0aW9ucyh0LmNvbnRleHQuZGlhZ25vc3RpY3MsZSkpLG4ucHVzaCguLi50aGlzLmdldENvbnZlcnRTdHJpbmdUb0Jsb2NrU3R5bGVBY3Rpb25zKHQucmFuZ2UsZSkpLG4ucHVzaCguLi50aGlzLmdldEtleU9yZGVyQWN0aW9ucyh0LmNvbnRleHQuZGlhZ25vc3RpY3MsZSkpLG4ucHVzaCguLi50aGlzLmdldFF1aWNrRml4Rm9yUHJvcGVydHlPclZhbHVlTWlzbWF0Y2godC5jb250ZXh0LmRpYWdub3N0aWNzLGUpKSxufWdldEp1bXBUb1NjaGVtYUFjdGlvbnMoZSl7dmFyIHMsaSxvLGE7aWYoISgoKG89KGk9KHM9dGhpcy5jbGllbnRDYXBhYmlsaXRpZXMpPT1udWxsP3ZvaWQgMDpzLndpbmRvdyk9PW51bGw/dm9pZCAwOmkuc2hvd0RvY3VtZW50KT09bnVsbD92b2lkIDA6by5zdXBwb3J0KT8/ITEpKXJldHVybltdO2NvbnN0IG49bmV3IE1hcDtmb3IoY29uc3QgdSBvZiBlKXtjb25zdCBsPSgoYT11LmRhdGEpPT1udWxsP3ZvaWQgMDphLnNjaGVtYVVyaSl8fFtdO2Zvcihjb25zdCBmIG9mIGwpZiYmKG4uaGFzKGYpfHxuLnNldChmLFtdKSxuLmdldChmKS5wdXNoKHUpKX1jb25zdCByPVtdO2Zvcihjb25zdCB1IG9mIG4ua2V5cygpKXtjb25zdCBsPXBuLmNyZWF0ZShKKCJKdW1wIHRvIHNjaGVtYSBsb2NhdGlvbiAoezB9KSIsWm4uYmFzZW5hbWUodSkpLE1zLmNyZWF0ZSgiSnVtcFRvU2NoZW1hIixzZi5KVU1QX1RPX1NDSEVNQSx1KSk7bC5kaWFnbm9zdGljcz1uLmdldCh1KSxyLnB1c2gobCl9cmV0dXJuIHJ9Z2V0VGFiVG9TcGFjZUNvbnZlcnRpbmcoZSx0KXtjb25zdCBuPVtdLHI9bmV3IFdyKHQpLHM9W107Zm9yKGNvbnN0IGkgb2YgZSlpZihpLm1lc3NhZ2U9PT0iVGFicyBhcmUgbm90IGFsbG93ZWQgYXMgaW5kZW50YXRpb24iKXtpZihzLmluY2x1ZGVzKGkucmFuZ2Uuc3RhcnQubGluZSkpY29udGludWU7Y29uc3Qgbz1yLmdldExpbmVDb250ZW50KGkucmFuZ2Uuc3RhcnQubGluZSk7bGV0IGE9MCx1PSIiO2ZvcihsZXQgZj1pLnJhbmdlLnN0YXJ0LmNoYXJhY3RlcjtmPD1pLnJhbmdlLmVuZC5jaGFyYWN0ZXImJm8uY2hhckF0KGYpPT09IgkiO2YrKylhKyssdSs9dGhpcy5pbmRlbnRhdGlvbjtzLnB1c2goaS5yYW5nZS5zdGFydC5saW5lKTtsZXQgbD1pLnJhbmdlO2EhPT1pLnJhbmdlLmVuZC5jaGFyYWN0ZXItaS5yYW5nZS5zdGFydC5jaGFyYWN0ZXImJihsPVkuY3JlYXRlKGkucmFuZ2Uuc3RhcnQsdXQuY3JlYXRlKGkucmFuZ2UuZW5kLmxpbmUsaS5yYW5nZS5zdGFydC5jaGFyYWN0ZXIrYSkpKSxuLnB1c2gocG4uY3JlYXRlKEooIkNvbnZlcnQgVGFiIHRvIFNwYWNlcyIpLEhyKHQudXJpLFtEZS5yZXBsYWNlKGwsdSldKSxNbi5RdWlja0ZpeCkpfWlmKG4ubGVuZ3RoIT09MCl7Y29uc3QgaT1bXTtmb3IobGV0IG89MDtvPD1yLmdldExpbmVDb3VudCgpO28rKyl7Y29uc3QgYT1yLmdldExpbmVDb250ZW50KG8pO2xldCB1PTAsbD0iIjtmb3IobGV0IGY9MDtmPGEubGVuZ3RoO2YrKyl7Y29uc3QgYz1hLmNoYXJBdChmKTtpZihjIT09IiAiJiZjIT09IgkiKXt1IT09MCYmKGkucHVzaChEZS5yZXBsYWNlKFkuY3JlYXRlKG8sZi11LG8sZiksbCkpLHU9MCxsPSIiKTticmVha31pZihjPT09IiAiJiZ1IT09MCl7aS5wdXNoKERlLnJlcGxhY2UoWS5jcmVhdGUobyxmLXUsbyxmKSxsKSksdT0wLGw9IiI7Y29udGludWV9Yz09PSIJIiYmKGwrPXRoaXMuaW5kZW50YXRpb24sdSsrKX11IT09MCYmaS5wdXNoKERlLnJlcGxhY2UoWS5jcmVhdGUobywwLG8sci5nZXRMaW5lTGVuZ3RoKG8pKSxsKSl9aS5sZW5ndGg+MCYmbi5wdXNoKHBuLmNyZWF0ZShKKCJDb252ZXJ0IGFsbCBUYWJzIHRvIFNwYWNlcyIpLEhyKHQudXJpLGkpLE1uLlF1aWNrRml4KSl9cmV0dXJuIG59Z2V0VW51c2VkQW5jaG9yc0RlbGV0ZShlLHQpe2NvbnN0IG49W10scj1uZXcgV3IodCk7Zm9yKGNvbnN0IHMgb2YgZSlpZihzLm1lc3NhZ2Uuc3RhcnRzV2l0aCgiVW51c2VkIGFuY2hvciIpJiZzLnNvdXJjZT09PVhjKXtjb25zdCBpPVkuY3JlYXRlKHMucmFuZ2Uuc3RhcnQscy5yYW5nZS5lbmQpLG89ci5nZXRUZXh0KGkpLGE9ci5nZXRMaW5lQ29udGVudChpLmVuZC5saW5lKSx1PUxPKGEsaS5lbmQuY2hhcmFjdGVyKTtpLmVuZC5jaGFyYWN0ZXI9dTtjb25zdCBsPXBuLmNyZWF0ZShKKCJEZWxldGUgdW51c2VkIGFuY2hvcjogezB9IixvKSxIcih0LnVyaSxbRGUuZGVsKGkpXSksTW4uUXVpY2tGaXgpO2wuZGlhZ25vc3RpY3M9W3NdLG4ucHVzaChsKX1yZXR1cm4gbn1nZXRDb252ZXJ0VG9Cb29sZWFuQWN0aW9ucyhlLHQpe2NvbnN0IG49W107Zm9yKGNvbnN0IHIgb2YgZSlpZihyLm1lc3NhZ2U9PT0nSW5jb3JyZWN0IHR5cGUuIEV4cGVjdGVkICJib29sZWFuIi4nKXtjb25zdCBzPXQuZ2V0VGV4dChyLnJhbmdlKS50b0xvY2FsZUxvd2VyQ2FzZSgpO2lmKHM9PT0nInRydWUiJ3x8cz09PSciZmFsc2UiJ3x8cz09PSIndHJ1ZScifHxzPT09IidmYWxzZSciKXtjb25zdCBpPXMuaW5jbHVkZXMoInRydWUiKT8idHJ1ZSI6ImZhbHNlIjtuLnB1c2gocG4uY3JlYXRlKEooIkNvbnZlcnQgdG8gYm9vbGVhbiIpLEhyKHQudXJpLFtEZS5yZXBsYWNlKHIucmFuZ2UsaSldKSxNbi5RdWlja0ZpeCkpfX1yZXR1cm4gbn1nZXRDb252ZXJ0VG9CbG9ja1N0eWxlQWN0aW9ucyhlLHQpe2NvbnN0IG49W107Zm9yKGNvbnN0IHIgb2YgZSlpZihyLmNvZGU9PT0iZmxvd01hcCJ8fHIuY29kZT09PSJmbG93U2VxIil7Y29uc3Qgcz1Ydyh0LHIpO2lmKHplKHMuaW50ZXJuYWxOb2RlKXx8UmUocy5pbnRlcm5hbE5vZGUpKXtjb25zdCBpPXplKHMuaW50ZXJuYWxOb2RlKT8ibWFwIjoic2VxdWVuY2UiLG89bmV3IHBqKHRoaXMuaW5kZW50YXRpb24pO24ucHVzaChwbi5jcmVhdGUoSigiQ29udmVydCB0byBibG9jayBzdHlsZSB7MH0iLGkpLEhyKHQudXJpLFtEZS5yZXBsYWNlKHIucmFuZ2Usby53cml0ZShzKSldKSxNbi5RdWlja0ZpeCkpfX1yZXR1cm4gbn1nZXRDb252ZXJ0U3RyaW5nVG9CbG9ja1N0eWxlQWN0aW9ucyhlLHQpe2NvbnN0IG49b24uZ2V0WWFtbERvY3VtZW50KHQpLHI9ZT90Lm9mZnNldEF0KGUuc3RhcnQpOjAscz1lP3Qub2Zmc2V0QXQoZS5lbmQpOjEvMCxpPVtdO2Zvcihjb25zdCBvIG9mIG4uZG9jdW1lbnRzKXtjb25zdCBhPVtdO2JlKG8uaW50ZXJuYWxEb2N1bWVudCwodSxsKT0+e1oobCkmJihyPD1sLnJhbmdlWzBdJiZsLnJhbmdlWzJdPD1zfHxsLnJhbmdlWzBdPD1yJiZzPD1sLnJhbmdlWzJdKSYmKGwudHlwZT09PSJRVU9URV9ET1VCTEUifHxsLnR5cGU9PT0iUVVPVEVfU0lOR0xFIikmJnR5cGVvZiBsLnZhbHVlPT0ic3RyaW5nIiYmKGwudmFsdWUuaW5kZXhPZihgCmApPj0wfHxsLnZhbHVlLmxlbmd0aD50aGlzLmxpbmVXaWR0aCkmJmEucHVzaChsKX0pO2Zvcihjb25zdCB1IG9mIGEpe2NvbnN0IGw9WS5jcmVhdGUodC5wb3NpdGlvbkF0KHUucmFuZ2VbMF0pLHQucG9zaXRpb25BdCh1LnJhbmdlWzFdKSksZj1uZXcgZmoodGhpcy5pbmRlbnRhdGlvbix0aGlzLmxpbmVXaWR0aCksYz1mLndyaXRlRm9sZGVkQmxvY2tTY2FsYXIodSk7YyE9PW51bGwmJmkucHVzaChwbi5jcmVhdGUoSigiQ29udmVydCBzdHJpbmcgdG8gZm9sZGVkIGJsb2NrIHN0cmluZyIpLEhyKHQudXJpLFtEZS5yZXBsYWNlKGwsYyldKSxNbi5SZWZhY3RvcikpO2NvbnN0IHA9Zi53cml0ZUxpdGVyYWxCbG9ja1NjYWxhcih1KTtwIT09bnVsbCYmaS5wdXNoKHBuLmNyZWF0ZShKKCJDb252ZXJ0IHN0cmluZyB0byBsaXRlcmFsIGJsb2NrIHN0cmluZyIpLEhyKHQudXJpLFtEZS5yZXBsYWNlKGwscCldKSxNbi5SZWZhY3RvcikpfX1yZXR1cm4gaX1nZXRLZXlPcmRlckFjdGlvbnMoZSx0KXt2YXIgcixzLGk7Y29uc3Qgbj1bXTtmb3IoY29uc3QgbyBvZiBlKWlmKChvPT1udWxsP3ZvaWQgMDpvLmNvZGUpPT09Im1hcEtleU9yZGVyIil7bGV0IGE9WHcodCxvKTtmb3IoO2EmJmEudHlwZSE9PSJvYmplY3QiOylhPWEucGFyZW50O2lmKGEmJnplKGEuaW50ZXJuYWxOb2RlKSl7Y29uc3QgdT1zdHJ1Y3R1cmVkQ2xvbmUoYS5pbnRlcm5hbE5vZGUpLGw9Yz0+e2lmKGMpe2lmKHRoKGMpKXJldHVybiBjLnR5cGU9PT0iYmxvY2stc2NhbGFyIj8oYy5wcm9wcz8/KGMucHJvcHM9W10pLGMucHJvcHMpOihjLmVuZD8/KGMuZW5kPVtdKSxjLmVuZCk7aWYoYy50eXBlPT09ImZsb3ctY29sbGVjdGlvbiIpcmV0dXJuIGMuZW5kPz8oYy5lbmQ9W10pLGMuZW5kO2lmKGMudHlwZT09PSJibG9jay1tYXAiKXtjb25zdCBwPWMuaXRlbXNbYy5pdGVtcy5sZW5ndGgtMV07cmV0dXJuIHA/bChwLnZhbHVlKTp2b2lkIDB9fX07aWYoKHUuc3JjVG9rZW4udHlwZT09PSJibG9jay1tYXAifHx1LnNyY1Rva2VuLnR5cGU9PT0iZmxvdy1jb2xsZWN0aW9uIikmJihhLmludGVybmFsTm9kZS5zcmNUb2tlbi50eXBlPT09ImJsb2NrLW1hcCJ8fGEuaW50ZXJuYWxOb2RlLnNyY1Rva2VuLnR5cGU9PT0iZmxvdy1jb2xsZWN0aW9uIikpe3Uuc3JjVG9rZW4uaXRlbXMuc29ydCgoYyxwKT0+e2lmKGMua2V5JiZwLmtleSYmdGgoYy5rZXkpJiZ0aChwLmtleSkpcmV0dXJuIGMua2V5LnNvdXJjZS5sb2NhbGVDb21wYXJlKHAua2V5LnNvdXJjZSk7aWYoIWMua2V5JiZwLmtleSlyZXR1cm4tMTtpZihjLmtleSYmIXAua2V5KXJldHVybiAxO2lmKCFjLmtleSYmIXAua2V5KXJldHVybiAwfSk7Zm9yKGxldCBjPTA7Yzx1LnNyY1Rva2VuLml0ZW1zLmxlbmd0aDtjKyspe2NvbnN0IHA9dS5zcmNUb2tlbi5pdGVtc1tjXSxoPWEuaW50ZXJuYWxOb2RlLnNyY1Rva2VuLml0ZW1zW2NdO2ZvcihwLnN0YXJ0PWguc3RhcnQ7KChzPShyPXAuc3RhcnQpPT1udWxsP3ZvaWQgMDpyWzBdKT09bnVsbD92b2lkIDA6cy50eXBlKT09PSJuZXdsaW5lIjspcC5zdGFydC5zaGlmdCgpO2NvbnN0IGQ9bChwLnZhbHVlKSxtPShkPT1udWxsP3ZvaWQgMDpkLmZpbmRJbmRleChEPT5ELnR5cGU9PT0ibmV3bGluZSIpKT8/LTEsZz0oKGk9bChoLnZhbHVlKSk9PW51bGw/dm9pZCAwOmkuZmluZChEPT5ELnR5cGU9PT0ibmV3bGluZSImJkQub2Zmc2V0PGEub2Zmc2V0K2EubGVuZ3RoKSk/P251bGw7ZyYmbTwwJiZkJiZkLnB1c2goe3R5cGU6Im5ld2xpbmUiLGluZGVudDowLG9mZnNldDpwLnZhbHVlLm9mZnNldCxzb3VyY2U6YApgfSksIWcmJm0+LTEmJmQmJmQuc3BsaWNlKG0sMSl9fWNvbnN0IGY9WS5jcmVhdGUodC5wb3NpdGlvbkF0KGEub2Zmc2V0KSx0LnBvc2l0aW9uQXQoYS5vZmZzZXQrYS5sZW5ndGgpKTtuLnB1c2gocG4uY3JlYXRlKEooIkZpeCBrZXkgb3JkZXIgZm9yIHRoaXMgbWFwIiksSHIodC51cmksW0RlLnJlcGxhY2UoZixFbCh1LnNyY1Rva2VuKSldKSxNbi5RdWlja0ZpeCkpfX1yZXR1cm4gbn1nZXRQb3NzaWJsZVF1aWNrRml4VmFsdWVzKGUpe2lmKHR5cGVvZiBlLmRhdGE9PSJvYmplY3QiKXtpZihlLmNvZGU9PT1BdC5FbnVtVmFsdWVNaXNtYXRjaCYmInZhbHVlcyJpbiBlLmRhdGEmJkFycmF5LmlzQXJyYXkoZS5kYXRhLnZhbHVlcykpcmV0dXJuIGUuZGF0YS52YWx1ZXM7aWYoZS5jb2RlPT09QXQuUHJvcGVydHlFeHBlY3RlZCYmInByb3BlcnRpZXMiaW4gZS5kYXRhJiZBcnJheS5pc0FycmF5KGUuZGF0YS5wcm9wZXJ0aWVzKSlyZXR1cm4gZS5kYXRhLnByb3BlcnRpZXN9fWdldFF1aWNrRml4Rm9yUHJvcGVydHlPclZhbHVlTWlzbWF0Y2goZSx0KXtjb25zdCBuPVtdO2Zvcihjb25zdCByIG9mIGUpe2NvbnN0IHM9dGhpcy5nZXRQb3NzaWJsZVF1aWNrRml4VmFsdWVzKHIpO2lmKHMhPW51bGwmJnMubGVuZ3RoKWZvcihjb25zdCBpIG9mIHMpe2NvbnN0IG89dHlwZW9mIGk9PSJzdHJpbmciP0VpKGkpOlN0cmluZyhpKTtuLnB1c2gocG4uY3JlYXRlKG8sSHIodC51cmksW0RlLnJlcGxhY2Uoci5yYW5nZSxvKV0pLE1uLlF1aWNrRml4KSl9fXJldHVybiBufX07ZnVuY3Rpb24gWHcoZSx0KXtjb25zdCBuPW9uLmdldFlhbWxEb2N1bWVudChlKSxyPWUub2Zmc2V0QXQodC5yYW5nZS5zdGFydCkscz1lLm9mZnNldEF0KHQucmFuZ2UuZW5kKSxpPW11KHIsbik7bGV0IG89aS5nZXROb2RlRnJvbU9mZnNldChyKTtpZihvJiZyPHMmJm8ub2Zmc2V0K28ubGVuZ3RoPT09cil7Y29uc3QgYT1pLmdldE5vZGVGcm9tT2Zmc2V0KHIrMSk7YSYmKG89YSl9cmV0dXJuIG99ZnVuY3Rpb24gSHIoZSx0KXtjb25zdCBuPXt9O3JldHVybiBuW2VdPXQse2NoYW5nZXM6bn19ZnVuY3Rpb24gZGooZSx0KXtjb25zdHtwb3NpdGlvbjpufT10LHI9bmV3IFdyKGUpO2lmKHQuY2g9PT1gCmApe2NvbnN0IHM9ci5nZXRMaW5lQ29udGVudChuLmxpbmUtMSk7aWYocy50cmltUmlnaHQoKS5lbmRzV2l0aCgiOiIpKXtjb25zdCBpPXIuZ2V0TGluZUNvbnRlbnQobi5saW5lKSxvPWkuc3Vic3RyaW5nKG4uY2hhcmFjdGVyLGkubGVuZ3RoKSxhPXMuaW5kZXhPZigiIC0gIikhPT0tMTtpZihvLnRyaW1SaWdodCgpLmxlbmd0aD09PTApe2NvbnN0IHU9bi5jaGFyYWN0ZXItKHMubGVuZ3RoLXMudHJpbUxlZnQoKS5sZW5ndGgpO2lmKHU9PT10Lm9wdGlvbnMudGFiU2l6ZSYmIWEpcmV0dXJuO2NvbnN0IGw9W107cmV0dXJuIGkubGVuZ3RoPjAmJmwucHVzaChEZS5kZWwoWS5jcmVhdGUobix1dC5jcmVhdGUobi5saW5lLGkubGVuZ3RoLTEpKSkpLGwucHVzaChEZS5pbnNlcnQobiwiICIucmVwZWF0KHQub3B0aW9ucy50YWJTaXplKyhhPzItdTowKSkpKSxsfWlmKGEpcmV0dXJuW0RlLmluc2VydChuLCIgIi5yZXBlYXQodC5vcHRpb25zLnRhYlNpemUpKV19aWYocy50cmltUmlnaHQoKS5lbmRzV2l0aCgifCIpKXJldHVybltEZS5pbnNlcnQobiwiICIucmVwZWF0KHQub3B0aW9ucy50YWJTaXplKSldO2lmKHMuaW5jbHVkZXMoIiAtICIpJiYhcy5pbmNsdWRlcygiOiAiKSlyZXR1cm5bRGUuaW5zZXJ0KG4sIi0gIildO2lmKHMuaW5jbHVkZXMoIiAtICIpJiZzLmluY2x1ZGVzKCI6ICIpKXJldHVybltEZS5pbnNlcnQobiwiICAiKV19fXZhciBtaj1jbGFzc3tjb25zdHJ1Y3RvcihlLHQpe3RoaXMuc2NoZW1hU2VydmljZT1lLHRoaXMudGVsZW1ldHJ5PXR9YXN5bmMgZ2V0Q29kZUxlbnMoZSl7dmFyIG47Y29uc3QgdD1bXTt0cnl7Y29uc3Qgcj1vbi5nZXRZYW1sRG9jdW1lbnQoZSk7bGV0IHM9bmV3IE1hcDtmb3IoY29uc3QgaSBvZiByLmRvY3VtZW50cyl7Y29uc3Qgbz1hd2FpdCB0aGlzLnNjaGVtYVNlcnZpY2UuZ2V0U2NoZW1hRm9yUmVzb3VyY2UoZS51cmksaSk7byE9bnVsbCYmby5zY2hlbWEmJihzPW5ldyBNYXAoWy4uLnhSKG89PW51bGw/dm9pZCAwOm8uc2NoZW1hKSwuLi5zXSkpfWZvcihjb25zdCBpIG9mIHMpe2NvbnN0IG89d3AuY3JlYXRlKFkuY3JlYXRlKDAsMCwwLDApKTtvLmNvbW1hbmQ9e3RpdGxlOnhPKGlbMV0saVswXSksY29tbWFuZDpzZi5KVU1QX1RPX1NDSEVNQSxhcmd1bWVudHM6W2lbMF1dfSx0LnB1c2gobyl9fWNhdGNoKHIpeyhuPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8bi5zZW5kRXJyb3IoInlhbWwuY29kZUxlbnMuZXJyb3IiLHIpfXJldHVybiB0fXJlc29sdmVDb2RlTGVucyhlKXtyZXR1cm4gZX19LGdqPWNsYXNze2NvbnN0cnVjdG9yKCl7dGhpcy5zcGFjZXNEaWZmPTAsdGhpcy5sb29rc0xpa2VBbGlnbm1lbnQ9ITF9fTtmdW5jdGlvbiB5aihlLHQsbixyLHMpe3Muc3BhY2VzRGlmZj0wLHMubG9va3NMaWtlQWxpZ25tZW50PSExO2xldCBpO2ZvcihpPTA7aTx0JiZpPHI7aSsrKXtjb25zdCBwPWUuY2hhckNvZGVBdChpKSxoPW4uY2hhckNvZGVBdChpKTtpZihwIT09aClicmVha31sZXQgbz0wLGE9MDtmb3IobGV0IHA9aTtwPHQ7cCsrKWUuY2hhckNvZGVBdChwKT09PTMyP28rKzphKys7bGV0IHU9MCxsPTA7Zm9yKGxldCBwPWk7cDxyO3ArKyluLmNoYXJDb2RlQXQocCk9PT0zMj91Kys6bCsrO2lmKG8+MCYmYT4wfHx1PjAmJmw+MClyZXR1cm47Y29uc3QgZj1NYXRoLmFicyhhLWwpLGM9TWF0aC5hYnMoby11KTtpZihmPT09MCl7cy5zcGFjZXNEaWZmPWMsYz4wJiYwPD11LTEmJnUtMTxlLmxlbmd0aCYmdTxuLmxlbmd0aCYmbi5jaGFyQ29kZUF0KHUpIT09MzImJmUuY2hhckNvZGVBdCh1LTEpPT09MzImJmUuY2hhckNvZGVBdChlLmxlbmd0aC0xKT09PTQ0JiYocy5sb29rc0xpa2VBbGlnbm1lbnQ9ITApO3JldHVybn1jJWY9PT0wJiYocy5zcGFjZXNEaWZmPWMvZil9ZnVuY3Rpb24gRGooZSx0LG4pe2NvbnN0IHI9TWF0aC5taW4oZS5nZXRMaW5lQ291bnQoKSwxZTQpO2xldCBzPTAsaT0wLG89IiIsYT0wO2NvbnN0IHU9WzIsNCw2LDgsMyw1LDddLGw9OCxmPVswLDAsMCwwLDAsMCwwLDAsMF0sYz1uZXcgZ2o7Zm9yKGxldCBkPTE7ZDw9cjtkKyspe2NvbnN0IG09ZS5nZXRMaW5lTGVuZ3RoKGQpLGc9ZS5nZXRMaW5lQ29udGVudChkKSxEPW08PTY1NTM2O2xldCBiPSExLEU9MCxGPTAsdj0wO2ZvcihsZXQgQT0wLHc9bTtBPHc7QSsrKXtjb25zdCBUPUQ/Zy5jaGFyQ29kZUF0KEEpOmUuZ2V0TGluZUNoYXJDb2RlKGQsQSk7aWYoVD09PTkpdisrO2Vsc2UgaWYoVD09PTMyKUYrKztlbHNle2I9ITAsRT1BO2JyZWFrfX1pZighYnx8KHY+MD9zKys6Rj4xJiZpKysseWoobyxhLGcsRSxjKSxjLmxvb2tzTGlrZUFsaWdubWVudCYmdCE9PWMuc3BhY2VzRGlmZikpY29udGludWU7Y29uc3QgQz1jLnNwYWNlc0RpZmY7Qzw9bCYmZltDXSsrLG89ZyxhPUV9bGV0IHA9bjtzIT09aSYmKHA9czxpKTtsZXQgaD10O2lmKHApe2xldCBkPXA/MDouMSpyO3UuZm9yRWFjaChtPT57Y29uc3QgZz1mW21dO2c+ZCYmKGQ9ZyxoPW0pfSksaD09PTQmJmZbNF0+MCYmZlsyXT4wJiZmWzJdPj1mWzRdLzImJihoPTIpfXJldHVybntpbnNlcnRTcGFjZXM6cCx0YWJTaXplOmh9fWZ1bmN0aW9uIG9mKGUsdCxuLHIscz0wLGk9MCl7aWYoZSE9PW51bGwmJnR5cGVvZiBlPT0ib2JqZWN0Iil7Y29uc3Qgbz1zPT09MCYmci5zaG91bGRJbmRlbnRXaXRoVGFifHxzPjA/dCtyLmluZGVudGF0aW9uOiIiO2lmKEFycmF5LmlzQXJyYXkoZSkpe2lmKGkrPTEsZS5sZW5ndGg9PT0wKXJldHVybiIiO2xldCBhPSIiO2ZvcihsZXQgdT0wO3U8ZS5sZW5ndGg7dSsrKXtsZXQgbD1lW3VdO2lmKHR5cGVvZiBlW3VdIT0ib2JqZWN0Iil7YSs9YApgK28rIi0gIituKGVbdV0pO2NvbnRpbnVlfUFycmF5LmlzQXJyYXkoZVt1XSl8fChsPWJqKGVbdV0saSkpLGErPW9mKGwsdCxuLHIscys9MSxpKX1yZXR1cm4gYX1lbHNle2NvbnN0IGE9T2JqZWN0LmtleXMoZSk7aWYoYS5sZW5ndGg9PT0wKXJldHVybiIiO2xldCB1PXM9PT0wJiZyLm5ld0xpbmVGaXJzdHx8cz4wP2AKYDoiIixsPSEwO2ZvcihsZXQgZj0wO2Y8YS5sZW5ndGg7ZisrKXtjb25zdCBjPWFbZl07aWYocz09PTAmJnIuZXhpc3RpbmdQcm9wcy5pbmNsdWRlcyhjKSljb250aW51ZTtjb25zdCBwPXR5cGVvZiBlW2NdPT0ib2JqZWN0IixoPXA/IjoiOiI6ICIsZD1wJiYvXlxzfC0vLnRlc3QoYyk/ci5pbmRlbnRhdGlvbjoiIixtPW8rZCxnPWw/IiI6YApgO2lmKHM9PT0wJiZsJiYhci5pbmRlbnRGaXJzdE9iamVjdCl7Y29uc3QgRD1vZihlW2NdLG0sbixyLHMrMSwwKTt1Kz1nK3QrYytoK0R9ZWxzZXtjb25zdCBEPW9mKGVbY10sbSxuLHIscysxLDApO3UrPWcrbytjK2grRH1sPSExfXJldHVybiB1fX1yZXR1cm4gbihlKX1mdW5jdGlvbiBiaihlLHQpe2NvbnN0IG49e307Zm9yKGxldCByPTA7cjxPYmplY3Qua2V5cyhlKS5sZW5ndGg7cisrKXtjb25zdCBzPU9iamVjdC5rZXlzKGUpW3JdO3I9PT0wP25bIi0gIi5yZXBlYXQodCkrc109ZVtzXTpuWyIgICIucmVwZWF0KHQpK3NdPWVbc119cmV0dXJuIG59dmFyIFl3PU10LkNsYXNzLGFmPSJfXyIsRWo9Y2xhc3N7Y29uc3RydWN0b3IoZSx0PXt9LG4scil7dGhpcy5zY2hlbWFTZXJ2aWNlPWUsdGhpcy5jbGllbnRDYXBhYmlsaXRpZXM9dCx0aGlzLnlhbWxEb2N1bWVudD1uLHRoaXMudGVsZW1ldHJ5PXIsdGhpcy5jb21wbGV0aW9uRW5hYmxlZD0hMCx0aGlzLmFycmF5UHJlZml4SW5kZW50YXRpb249IiJ9Y29uZmlndXJlKGUsdCl7dmFyIG47ZSYmKHRoaXMuY29tcGxldGlvbkVuYWJsZWQ9ZS5jb21wbGV0aW9uKSx0aGlzLmN1c3RvbVRhZ3M9ZS5jdXN0b21UYWdzLHRoaXMueWFtbFZlcnNpb249ZS55YW1sVmVyc2lvbix0aGlzLmlzU2luZ2xlUXVvdGU9KChuPXQ9PW51bGw/dm9pZCAwOnQueWFtbEZvcm1hdHRlclNldHRpbmdzKT09bnVsbD92b2lkIDA6bi5zaW5nbGVRdW90ZSl8fCExLHRoaXMuY29uZmlndXJlZEluZGVudGF0aW9uPWUuaW5kZW50YXRpb24sdGhpcy5kaXNhYmxlRGVmYXVsdFByb3BlcnRpZXM9ZS5kaXNhYmxlRGVmYXVsdFByb3BlcnRpZXMsdGhpcy5wYXJlbnRTa2VsZXRvblNlbGVjdGVkRmlyc3Q9ZS5wYXJlbnRTa2VsZXRvblNlbGVjdGVkRmlyc3R9YXN5bmMgZG9Db21wbGV0ZShlLHQsbj0hMSxyPSEwKXt2YXIgRjtjb25zdCBzPUZwLmNyZWF0ZShbXSwhMSk7aWYoIXRoaXMuY29tcGxldGlvbkVuYWJsZWQpcmV0dXJuIHM7Y29uc3QgaT10aGlzLnlhbWxEb2N1bWVudC5nZXRZYW1sRG9jdW1lbnQoZSx7Y3VzdG9tVGFnczp0aGlzLmN1c3RvbVRhZ3MseWFtbFZlcnNpb246dGhpcy55YW1sVmVyc2lvbn0sITApLG89bmV3IFdyKGUpO2lmKHRoaXMuY29uZmlndXJlZEluZGVudGF0aW9uKXRoaXMuaW5kZW50YXRpb249dGhpcy5jb25maWd1cmVkSW5kZW50YXRpb247ZWxzZXtjb25zdCB2PURqKG8sMiwhMCk7dGhpcy5pbmRlbnRhdGlvbj12Lmluc2VydFNwYWNlcz8iICIucmVwZWF0KHYudGFiU2l6ZSk6IgkifXp3KGkuZG9jdW1lbnRzLG4pO2Zvcihjb25zdCB2IG9mIGkuZG9jdW1lbnRzKXYudXJpPWUudXJpO2NvbnN0IGE9ZS5vZmZzZXRBdCh0KSx1PWUuZ2V0VGV4dCgpO2lmKHUuY2hhckF0KGEtMSk9PT0iOiIpcmV0dXJuIFByb21pc2UucmVzb2x2ZShzKTtsZXQgbD1tdShhLGkpO2lmKGw9PT1udWxsKXJldHVybiBQcm9taXNlLnJlc29sdmUocyk7bD1sLmNsb25lKCk7bGV0W2YsY109bC5nZXROb2RlRnJvbVBvc2l0aW9uKGEsbyx0aGlzLmluZGVudGF0aW9uLmxlbmd0aCk7Y29uc3QgcD10aGlzLmdldEN1cnJlbnRXb3JkKGUsYSk7bGV0IGg9by5nZXRMaW5lQ29udGVudCh0LmxpbmUpO2NvbnN0IGQ9aC5zdWJzdHJpbmcodC5jaGFyYWN0ZXIpLG09L15bIF0rXG4/JC8udGVzdChkKTt0aGlzLmFycmF5UHJlZml4SW5kZW50YXRpb249IiI7bGV0IGc9bnVsbDtpZihtKXtnPVkuY3JlYXRlKHQsdXQuY3JlYXRlKHQubGluZSxoLmxlbmd0aCkpO2NvbnN0IHY9aC50cmltKCkubGVuZ3RoPT09MCxDPWgubWF0Y2goL15ccyooLSlccyokLyk7aWYoZiYmWihmKSYmIXYmJiFDKXtjb25zdCBBPWguc3Vic3RyaW5nKDAsdC5jaGFyYWN0ZXIpLHc9QS5tYXRjaCgvXltccy1dKihbXjpdKyk/JC8pfHxBLm1hdGNoKC86WyBcdF0oKD8hOlsgXHRdKS4qKSQvKTt3IT1udWxsJiZ3WzFdJiYoZz1ZLmNyZWF0ZSh1dC5jcmVhdGUodC5saW5lLHQuY2hhcmFjdGVyLXdbMV0ubGVuZ3RoKSx1dC5jcmVhdGUodC5saW5lLGgubGVuZ3RoKSkpfX1lbHNlIGlmKGYmJlooZikmJmYudmFsdWU9PT0ibnVsbCIpe2NvbnN0IHY9ZS5wb3NpdGlvbkF0KGYucmFuZ2VbMF0pO3YuY2hhcmFjdGVyKz0xO2NvbnN0IEM9ZS5wb3NpdGlvbkF0KGYucmFuZ2VbMl0pO0MuY2hhcmFjdGVyKz0xLGc9WS5jcmVhdGUodixDKX1lbHNlIGlmKGYmJlooZikmJmYudmFsdWUpe2NvbnN0IHY9ZS5wb3NpdGlvbkF0KGYucmFuZ2VbMF0pO2c9WS5jcmVhdGUodixlLnBvc2l0aW9uQXQoZi5yYW5nZVsxXSkpfWVsc2UgaWYoZiYmWihmKSYmZi52YWx1ZT09PW51bGwmJnA9PT0iLSIpZz1ZLmNyZWF0ZSh0LHQpLHRoaXMuYXJyYXlQcmVmaXhJbmRlbnRhdGlvbj0iICI7ZWxzZXtsZXQgdj1hLXAubGVuZ3RoO3Y+MCYmdVt2LTFdPT09JyInJiZ2LS0sZz1ZLmNyZWF0ZShlLnBvc2l0aW9uQXQodiksdCl9Y29uc3QgRD17fSxiPXthZGQ6KHYsQyk9Pntjb25zdCBBPWZ1bmN0aW9uKEwpe3ZhciBVO2lmKCgoVT1EW0wubGFiZWxdKT09bnVsbD92b2lkIDA6VS5sYWJlbCk9PT1hZilyZXR1cm47Y29uc3Qgaz1MLnBhcmVudC5zY2hlbWEsST1PbShrKSxNPWsubWFya2Rvd25EZXNjcmlwdGlvbnx8ay5kZXNjcmlwdGlvbjtsZXQgaj1zLml0ZW1zLmZpbmQoVj0+e3ZhciBuZTtyZXR1cm4oKG5lPVYucGFyZW50KT09bnVsbD92b2lkIDA6bmUuc2NoZW1hKT09PWsmJlYua2luZD09PVl3fSk7aiYmai5wYXJlbnQuaW5zZXJ0VGV4dHMuaW5jbHVkZXMoTC5pbnNlcnRUZXh0KXx8KGo/ai5wYXJlbnQuaW5zZXJ0VGV4dHMucHVzaChMLmluc2VydFRleHQpOihqPXsuLi5MLGxhYmVsOkksZG9jdW1lbnRhdGlvbjpNLHNvcnRUZXh0OiJfIitJLGtpbmQ6WXd9LGoubGFiZWw9ai5sYWJlbHx8TC5sYWJlbCxqLnBhcmVudC5pbnNlcnRUZXh0cz1bTC5pbnNlcnRUZXh0XSxzLml0ZW1zLnB1c2goaikpKX0sdz0hIXYucGFyZW50O2xldCBUPXYubGFiZWw7aWYoIVQpe2NvbnNvbGUud2FybihgSWdub3JpbmcgQ29tcGxldGlvbkl0ZW0gd2l0aG91dCBsYWJlbDogJHtKU09OLnN0cmluZ2lmeSh2KX1gKTtyZXR1cm59aWYoemMoVCl8fChUPVN0cmluZyhUKSksVD1ULnJlcGxhY2UoL1xufFxcbi9nLCLihrUiKSxULmxlbmd0aD42MCl7Y29uc3QgTD1ULnN1YnN0cigwLDU3KS50cmltKCkrIi4uLiI7RFtMXXx8KFQ9TCl9aWYodi5sYWJlbC50b0xvd2VyQ2FzZSgpPT09InJlZ3VsYXIgZXhwcmVzc2lvbiIpe2NvbnN0IFM9di5kb2N1bWVudGF0aW9uLnZhbHVlLnNwbGl0KCI6Iik7VD1TLmxlbmd0aD4wP2Ake3RoaXMuZ2V0UXVvdGUoKX1cXCR7SlNPTi5wYXJzZShTWzFdKX0ke3RoaXMuZ2V0UXVvdGUoKX1gOnYubGFiZWwsdi5pbnNlcnRUZXh0PVQsdi50ZXh0RWRpdD1EZS5yZXBsYWNlKGcsVCl9ZWxzZXtjb25zdCBTPXYuaW5zZXJ0VGV4dC5yZXBsYWNlKC9cJHtbMC05XStbOnxdKC4qKX0vZywoayxJKT0+SSkucmVwbGFjZSgvXCQoWzAtOV0rKS9nLCIiKS5tYXRjaCgvXihbXjoiXSspOlxzKihbJ1xcIlxcXSkkLyk7aWYoUyl7Y29uc3Qgaz1TWzFdLEk9U1syXTt2Lmluc2VydFRleHQ9YCR7a306ICR7dGhpcy5nZXRRdW90ZSgpfVxcJHtJfSR7dGhpcy5nZXRRdW90ZSgpfWB9di5pbnNlcnRUZXh0LmVuZHNXaXRoKCIkMSIpJiYhdyYmKHYuaW5zZXJ0VGV4dD12Lmluc2VydFRleHQuc3Vic3RyKDAsdi5pbnNlcnRUZXh0Lmxlbmd0aC0yKSksZyYmZy5zdGFydC5saW5lPT09Zy5lbmQubGluZSYmKHYudGV4dEVkaXQ9RGUucmVwbGFjZShnLHYuaW5zZXJ0VGV4dCkpfWlmKHYubGFiZWw9VCx3KXtBKHYpO3JldHVybn10aGlzLmFycmF5UHJlZml4SW5kZW50YXRpb24mJnRoaXMudXBkYXRlQ29tcGxldGlvblRleHQodix0aGlzLmFycmF5UHJlZml4SW5kZW50YXRpb24rdi5pbnNlcnRUZXh0KTtjb25zdCBOPURbVF0seD0oTj09bnVsbD92b2lkIDA6Ti5sYWJlbCkhPT1hZiYmKE49PW51bGw/dm9pZCAwOk4uaW5zZXJ0VGV4dCkhPT12Lmluc2VydFRleHQ7aWYoIU4pRFtUXT12LHMuaXRlbXMucHVzaCh2KTtlbHNlIGlmKHgpe2NvbnN0IEw9dGhpcy5tZXJnZVNpbXBsZUluc2VydFRleHRzKFQsTi5pbnNlcnRUZXh0LHYuaW5zZXJ0VGV4dCxDKTtMP3RoaXMudXBkYXRlQ29tcGxldGlvblRleHQoTixMKTooRFtUXT12LHMuaXRlbXMucHVzaCh2KSl9TiYmIU4uZG9jdW1lbnRhdGlvbiYmdi5kb2N1bWVudGF0aW9uJiYoTi5kb2N1bWVudGF0aW9uPXYuZG9jdW1lbnRhdGlvbiksTiYmIU4uZGV0YWlsJiZ2LmRldGFpbCYmKE4uZGV0YWlsPXYuZGV0YWlsKX0sZXJyb3I6dj0+e3ZhciBDOyhDPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8Qy5zZW5kRXJyb3IoInlhbWwuY29tcGxldGlvbi5lcnJvciIsdil9LGxvZzp2PT57Y29uc29sZS5sb2codil9LGdldE51bWJlck9mUHJvcG9zYWxzOigpPT5zLml0ZW1zLmxlbmd0aCxyZXN1bHQ6cyxwcm9wb3NlZDpEfTt0aGlzLmN1c3RvbVRhZ3MmJnRoaXMuY3VzdG9tVGFncy5sZW5ndGg+MCYmdGhpcy5nZXRDdXN0b21UYWdWYWx1ZUNvbXBsZXRpb25zKGIpLGguZW5kc1dpdGgoYApgKSYmKGg9aC5zdWJzdHIoMCxoLmxlbmd0aC0xKSk7dHJ5e2NvbnN0IHY9YXdhaXQgdGhpcy5zY2hlbWFTZXJ2aWNlLmdldFNjaGVtYUZvclJlc291cmNlKGUudXJpLGwpO2lmKCghdnx8di5lcnJvcnMubGVuZ3RoKSYmdC5saW5lPT09MCYmdC5jaGFyYWN0ZXI9PT0wJiYhSm0oaCkpe2NvbnN0IE49e2tpbmQ6TXQuVGV4dCxsYWJlbDpKKCJJbmxpbmUgc2NoZW1hIiksaW5zZXJ0VGV4dDoiIyB5YW1sLWxhbmd1YWdlLXNlcnZlcjogJHNjaGVtYT0iLGluc2VydFRleHRGb3JtYXQ6bHQuUGxhaW5UZXh0fTtzLml0ZW1zLnB1c2goTil9aWYoSm0oaCl8fGRSKGkudG9rZW5zLGEpKXtjb25zdCBOPWgubWF0Y2goL1wkc2NoZW1hWz06XS8pO2lmKE4pcmV0dXJuIE4uaW5kZXgrTlswXS5sZW5ndGg8PXQuY2hhcmFjdGVyJiZ0aGlzLnNjaGVtYVNlcnZpY2UuZ2V0QWxsU2NoZW1hcygpLmZvckVhY2goTD0+e2NvbnN0IFM9e2tpbmQ6TXQuQ29uc3RhbnQsbGFiZWw6TC5uYW1lPz9MLnVyaSxkZXRhaWw6TC5kZXNjcmlwdGlvbixpbnNlcnRUZXh0OkwudXJpLGluc2VydFRleHRGb3JtYXQ6bHQuUGxhaW5UZXh0LGluc2VydFRleHRNb2RlOkVwLmFzSXN9O3MuaXRlbXMucHVzaChTKX0pLHN9aWYoIXZ8fHYuZXJyb3JzLmxlbmd0aClyZXR1cm4gcztsZXQgQz1udWxsO2lmKCFmKWlmKCFsLmludGVybmFsRG9jdW1lbnQuY29udGVudHN8fFoobC5pbnRlcm5hbERvY3VtZW50LmNvbnRlbnRzKSl7Y29uc3QgTj1sLmludGVybmFsRG9jdW1lbnQuY3JlYXRlTm9kZSh7fSk7Ti5yYW5nZT1bYSxhKzEsYSsxXSxsLmludGVybmFsRG9jdW1lbnQuY29udGVudHM9TixsLnVwZGF0ZUZyb21JbnRlcm5hbERvY3VtZW50KCksZj1OfWVsc2UgZj1sLmZpbmRDbG9zZXN0Tm9kZShhLG8pLGM9ITA7Y29uc3QgQT1mO2lmKGYpaWYoaC5sZW5ndGg9PT0wKWY9bC5pbnRlcm5hbERvY3VtZW50LmNvbnRlbnRzO2Vsc2V7Y29uc3QgTj1sLmdldFBhcmVudChmKTtpZihOKXtpZihaKGYpKXtpZihmLnZhbHVlKXtpZih5ZShOKSl7aWYoTi52YWx1ZT09PWYpe2lmKGgudHJpbSgpLmxlbmd0aD4wJiZoLmluZGV4T2YoIjoiKTwwKXtjb25zdCB4PXRoaXMuY3JlYXRlVGVtcE9iak5vZGUocCxmLGwpLEw9bC5nZXRQYXJlbnQoTik7aWYoUmUobC5pbnRlcm5hbERvY3VtZW50LmNvbnRlbnRzKSl7Y29uc3QgUz1oUihsLmludGVybmFsRG9jdW1lbnQuY29udGVudHMsTik7dHlwZW9mIFM9PSJudW1iZXIiJiYobC5pbnRlcm5hbERvY3VtZW50LnNldChTLHgpLGwudXBkYXRlRnJvbUludGVybmFsRG9jdW1lbnQoKSl9ZWxzZSBMJiYoemUoTCl8fFJlKEwpKT8oTC5zZXQoTi5rZXkseCksbC51cGRhdGVGcm9tSW50ZXJuYWxEb2N1bWVudCgpKToobC5pbnRlcm5hbERvY3VtZW50LnNldChOLmtleSx4KSxsLnVwZGF0ZUZyb21JbnRlcm5hbERvY3VtZW50KCkpO0M9eC5pdGVtc1swXSxmPXh9ZWxzZSBpZihoLnRyaW0oKS5sZW5ndGg9PT0wKXtjb25zdCB4PWwuZ2V0UGFyZW50KE4pO3gmJihmPXgpfX1lbHNlIGlmKE4ua2V5PT09Zil7Y29uc3QgeD1sLmdldFBhcmVudChOKTtDPU4seCYmKGY9eCl9fWVsc2UgaWYoUmUoTikpaWYoaC50cmltKCkubGVuZ3RoPjApe2NvbnN0IHg9dGhpcy5jcmVhdGVUZW1wT2JqTm9kZShwLGYsbCk7Ti5kZWxldGUoZiksTi5hZGQoeCksbC51cGRhdGVGcm9tSW50ZXJuYWxEb2N1bWVudCgpLGY9eH1lbHNlIGY9Tn1lbHNlIGlmKGYudmFsdWU9PT1udWxsKXtpZih5ZShOKSl7aWYoTi5rZXk9PT1mKWY9TjtlbHNlIGlmKGdlKE4ua2V5KSYmTi5rZXkucmFuZ2Upe2NvbnN0IHg9bC5nZXRQYXJlbnQoTik7aWYoYyYmeCYmemUoeCkmJnBSKHgpKWY9eDtlbHNle2NvbnN0IEw9ZS5wb3NpdGlvbkF0KE4ua2V5LnJhbmdlWzBdKTtpZih0LmNoYXJhY3Rlcj5MLmNoYXJhY3RlciYmdC5saW5lIT09TC5saW5lKXtjb25zdCBTPXRoaXMuY3JlYXRlVGVtcE9iak5vZGUocCxmLGwpO3gmJih6ZSh4KXx8UmUoeCkpPyh4LnNldChOLmtleSxTKSxsLnVwZGF0ZUZyb21JbnRlcm5hbERvY3VtZW50KCkpOihsLmludGVybmFsRG9jdW1lbnQuc2V0KE4ua2V5LFMpLGwudXBkYXRlRnJvbUludGVybmFsRG9jdW1lbnQoKSksQz1TLml0ZW1zWzBdLGY9U31lbHNlIEwuY2hhcmFjdGVyPT09dC5jaGFyYWN0ZXImJngmJihmPXgpfX19ZWxzZSBpZihSZShOKSlpZihoLmNoYXJBdCh0LmNoYXJhY3Rlci0xKSE9PSItIil7Y29uc3QgeD10aGlzLmNyZWF0ZVRlbXBPYmpOb2RlKHAsZixsKTtOLmRlbGV0ZShmKSxOLmFkZCh4KSxsLnVwZGF0ZUZyb21JbnRlcm5hbERvY3VtZW50KCksZj14fWVsc2UgaWYoaC5jaGFyQXQodC5jaGFyYWN0ZXItMSk9PT0iLSIpe2NvbnN0IHg9dGhpcy5jcmVhdGVUZW1wT2JqTm9kZSgiIixmLGwpO04uZGVsZXRlKGYpLE4uYWRkKHgpLGwudXBkYXRlRnJvbUludGVybmFsRG9jdW1lbnQoKSxmPXh9ZWxzZSBmPU59fWVsc2UgaWYoemUoZikmJiFjJiZoLnRyaW0oKS5sZW5ndGg9PT0wJiZSZShOKSl7Y29uc3QgeD1vLmdldExpbmVDb250ZW50KHQubGluZSsxKTsoby5nZXRMaW5lQ291bnQoKT09PXQubGluZSsxfHx4LnRyaW0oKS5sZW5ndGg9PT0wKSYmKGY9Til9fWVsc2UgaWYoWihmKSl7Y29uc3QgeD10aGlzLmNyZWF0ZVRlbXBPYmpOb2RlKHAsZixsKTtsLmludGVybmFsRG9jdW1lbnQuY29udGVudHM9eCxsLnVwZGF0ZUZyb21JbnRlcm5hbERvY3VtZW50KCksQz14Lml0ZW1zWzBdLGY9eH1lbHNlIGlmKHplKGYpKWZvcihjb25zdCB4IG9mIGYuaXRlbXMpZ2UoeC52YWx1ZSkmJngudmFsdWUucmFuZ2UmJngudmFsdWUucmFuZ2VbMF09PT1hKzEmJihmPXgudmFsdWUpO2Vsc2UgaWYoUmUoZikmJmguY2hhckF0KHQuY2hhcmFjdGVyLTEpIT09Ii0iKXtjb25zdCB4PXRoaXMuY3JlYXRlVGVtcE9iak5vZGUocCxmLGwpO3guaXRlbXM9W10sbC51cGRhdGVGcm9tSW50ZXJuYWxEb2N1bWVudCgpO2Zvcihjb25zdCBMIG9mIGYuaXRlbXMpemUoTCkmJkwuaXRlbXMuZm9yRWFjaChTPT57eC5pdGVtcy5wdXNoKFMpfSk7Zj14fX1jb25zdCB3PW8uZ2V0TGluZUNvbnRlbnQoZy5zdGFydC5saW5lKS50cmltKCkubGVuZ3RoPT09MCYmQSYmKFooQSkmJkEudmFsdWU9PT1udWxsfHxSZShBKSk7aWYoZiYmemUoZikpe2NvbnN0IE49Zi5pdGVtcztmb3IoY29uc3QgeCBvZiBOKSghQ3x8QyE9PXgpJiZaKHgua2V5KSYmKERbeC5rZXkudmFsdWUrIiJdPXZwLmNyZWF0ZShhZikpO3RoaXMuYWRkUHJvcGVydHlDb21wbGV0aW9ucyh2LGwsZixBLCIiLGIsbyxnLHIsdyksIXYmJnAubGVuZ3RoPjAmJnUuY2hhckF0KGEtcC5sZW5ndGgtMSkhPT0nIicmJmIuYWRkKHtraW5kOk10LlByb3BlcnR5LGxhYmVsOnAsaW5zZXJ0VGV4dDp0aGlzLmdldEluc2VydFRleHRGb3JQcm9wZXJ0eShwLG51bGwsIiIpLGluc2VydFRleHRGb3JtYXQ6bHQuU25pcHBldH0pfWNvbnN0IFQ9e307dGhpcy5nZXRWYWx1ZUNvbXBsZXRpb25zKHYsbCxmLGEsZSxiLFQscix3KX1jYXRjaCh2KXsoRj10aGlzLnRlbGVtZXRyeSk9PW51bGx8fEYuc2VuZEVycm9yKCJ5YW1sLmNvbXBsZXRpb24uZXJyb3IiLHYpfXRoaXMuZmluYWxpemVQYXJlbnRDb21wbGV0aW9uKHMpO2NvbnN0IEU9cy5pdGVtcy5maWx0ZXIoKHYsQyxBKT0+Qz09PUEuZmluZEluZGV4KHc9PncubGFiZWw9PT12LmxhYmVsJiZ3Lmluc2VydFRleHQ9PT12Lmluc2VydFRleHQmJncua2luZD09PXYua2luZCkpO3JldHVybihFPT1udWxsP3ZvaWQgMDpFLmxlbmd0aCk+MCYmKHMuaXRlbXM9RSksc311cGRhdGVDb21wbGV0aW9uVGV4dChlLHQpe2UuaW5zZXJ0VGV4dD10LGUudGV4dEVkaXQmJihlLnRleHRFZGl0Lm5ld1RleHQ9dCl9bWVyZ2VTaW1wbGVJbnNlcnRUZXh0cyhlLHQsbixyKXtjb25zdCBzPWY9PmYuaW5jbHVkZXMoYApgKSxpPWY9PmYuc3RhcnRzV2l0aChgCmApLG89Zj0+e2NvbnN0IGM9Zi5pbmRleE9mKGAKYCk7cmV0dXJuIGM+MCYmZi5zdWJzdHJpbmcoYyxmLmxlbmd0aCkudHJpbSgpLmxlbmd0aD09PTB9O2lmKHModCl8fHMobikpcmV0dXJuIHImJm8odCkmJiFvKG4pJiYhaShuKT9uOnZvaWQgMDtjb25zdCBhPXRoaXMuZ2V0VmFsdWVzRnJvbUluc2VydFRleHQodCksdT10aGlzLmdldFZhbHVlc0Zyb21JbnNlcnRUZXh0KG4pLGw9QXJyYXkucHJvdG90eXBlLmNvbmNhdChhLHUpO2lmKGwubGVuZ3RoKXJldHVybiBsLmxlbmd0aD09PTE/YCR7ZX06IFwkezE6JHtsWzBdfX1gOmAke2V9OiBcJHsxfCR7bC5qb2luKCIsIil9fH1gfWdldFZhbHVlc0Zyb21JbnNlcnRUZXh0KGUpe2NvbnN0IHQ9ZS5zdWJzdHJpbmcoZS5pbmRleE9mKCI6IikrMSkudHJpbSgpO2lmKCF0KXJldHVybltdO2NvbnN0IG49dC5tYXRjaCgvXlwkezFbfDpdKFtefF0qKStcfD99JC8pO3JldHVybiBuP25bMV0uc3BsaXQoIiwiKTpbdF19ZmluYWxpemVQYXJlbnRDb21wbGV0aW9uKGUpe2NvbnN0IHQ9bj0+e2xldCByPTA7cmV0dXJuIG4ubWFwKHM9Pntjb25zdCBpPXMubWF0Y2goL1wkKFswLTldKyl8XCR7WzAtOV0rOi9nKTtpZighaSlyZXR1cm4gcztjb25zdCBvPWkubWFwKHU9Pit1LnJlcGxhY2UoL1wkeyhbMC05XSspWzp8XS9nLCIkMSIpLnJlcGxhY2UoIiQiLCIiKSkucmVkdWNlKCh1LGwpPT5sPnU/bDp1LDApLGE9cy5yZXBsYWNlKC9cJChbMC05XSspL2csKHUsbCk9PiIkIisoK2wrcikpLnJlcGxhY2UoL1wkeyhbMC05XSspWzp8XS9nLCh1LGwpPT4iJHsiKygrbCtyKSsiOiIpO3JldHVybiByKz1vLGF9KX07ZS5pdGVtcy5mb3JFYWNoKG49PntpZih0aGlzLmlzUGFyZW50Q29tcGxldGlvbkl0ZW0obikpe2NvbnN0IHI9bi5wYXJlbnQuaW5kZW50fHwiIjtsZXQgaT10KG4ucGFyZW50Lmluc2VydFRleHRzKS5qb2luKGAKJHtyfWApO2kuZW5kc1dpdGgoIiQxIikmJihpPWkuc3Vic3RyaW5nKDAsaS5sZW5ndGgtMikpLG4uaW5zZXJ0VGV4dD10aGlzLmFycmF5UHJlZml4SW5kZW50YXRpb24raSxuLnRleHRFZGl0JiYobi50ZXh0RWRpdC5uZXdUZXh0PW4uaW5zZXJ0VGV4dCk7Y29uc3Qgbz1pLnJlcGxhY2UoL1wke1swLTldK1s6fF0oLiopfS9nLCh1LGwpPT5sKS5yZXBsYWNlKC9cJChbMC05XSspL2csIiIpLGE9bi5kb2N1bWVudGF0aW9uP1tuLmRvY3VtZW50YXRpb24sIiIsIi0tLS0iLCIiXTpbXTtuLmRvY3VtZW50YXRpb249e2tpbmQ6dnIuTWFya2Rvd24sdmFsdWU6Wy4uLmEsImBgYHlhbWwiLHIrbywiYGBgIl0uam9pbihgCmApfSxkZWxldGUgbi5wYXJlbnR9fSl9Y3JlYXRlVGVtcE9iak5vZGUoZSx0LG4pe2NvbnN0IHI9e307cltlXT1udWxsO2NvbnN0IHM9bi5pbnRlcm5hbERvY3VtZW50LmNyZWF0ZU5vZGUocik7cmV0dXJuIHMucmFuZ2U9dC5yYW5nZSxzLml0ZW1zWzBdLmtleS5yYW5nZT10LnJhbmdlLHMuaXRlbXNbMF0udmFsdWUucmFuZ2U9dC5yYW5nZSxzfWFkZFByb3BlcnR5Q29tcGxldGlvbnMoZSx0LG4scixzLGksbyxhLHUsbCl7dmFyIEYsdixDO2NvbnN0IGY9dC5nZXRNYXRjaGluZ1NjaGVtYXMoZS5zY2hlbWEsLTEsbnVsbCx1KSxjPW8uZ2V0VGV4dChhKSxwPW8uZ2V0TGluZUNvbnRlbnQoYS5zdGFydC5saW5lKSxoPXAudHJpbSgpLmxlbmd0aD09PTAsZD1wLmluZGV4T2YoIjoiKSE9PS0xLG09cC50cmltTGVmdCgpLmluZGV4T2YoIi0iKT09PTAsZz10LmdldFBhcmVudChuKSxEPWYuZmluZChBPT5BLm5vZGUuaW50ZXJuYWxOb2RlPT09ciYmQS5zY2hlbWEucHJvcGVydGllcyksYj1mLmZpbHRlcihBPT5BLnNjaGVtYS5vbmVPZikubWFwKEE9PkEuc2NoZW1hLm9uZU9mKVswXTtsZXQgRT0hMTsoYj09bnVsbD92b2lkIDA6Yi5sZW5ndGgpPGYubGVuZ3RoJiYoYj09bnVsbHx8Yi5mb3JFYWNoKChBLHcpPT57dmFyIFQsTjshKChUPWZbd10pIT1udWxsJiZULnNjaGVtYS5vbmVPZikmJigoTj1mW3ddKT09bnVsbD92b2lkIDA6Ti5zY2hlbWEucHJvcGVydGllcyk9PT1BLnByb3BlcnRpZXMmJihFPSEwKX0pKTtmb3IoY29uc3QgQSBvZiBmKXtpZigoQS5ub2RlLmludGVybmFsTm9kZT09PW4mJiFEfHxBLm5vZGUuaW50ZXJuYWxOb2RlPT09ciYmIWR8fCgoRj1BLm5vZGUucGFyZW50KT09bnVsbD92b2lkIDA6Ri5pbnRlcm5hbE5vZGUpPT09ciYmIWQpJiYhQS5pbnZlcnRlZCl7dGhpcy5jb2xsZWN0RGVmYXVsdFNuaXBwZXRzKEEuc2NoZW1hLHMsaSx7bmV3TGluZUZpcnN0OiExLGluZGVudEZpcnN0T2JqZWN0OiExLHNob3VsZEluZGVudFdpdGhUYWI6bX0pO2NvbnN0IHc9QS5zY2hlbWEucHJvcGVydGllcztpZih3KXtjb25zdCBUPUEuc2NoZW1hLm1heFByb3BlcnRpZXM7aWYoVD09PXZvaWQgMHx8bi5pdGVtcz09PXZvaWQgMHx8bi5pdGVtcy5sZW5ndGg8VHx8bi5pdGVtcy5sZW5ndGg9PT1UJiYhaCl7Zm9yKGNvbnN0IE4gaW4gdylpZihPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwodyxOKSl7Y29uc3QgeD13W05dO2lmKHR5cGVvZiB4PT0ib2JqZWN0IiYmIXguZGVwcmVjYXRpb25NZXNzYWdlJiYheC5kb05vdFN1Z2dlc3Qpe2xldCBMPSIiO2lmKGcmJlJlKGcpJiZuLml0ZW1zLmxlbmd0aDw9MSYmIWgpe2NvbnN0IFU9by5nZXRUZXh0KCksVj1VLmxhc3RJbmRleE9mKCItIixuLnJhbmdlWzBdLTEpO2lmKFY+PTApe2NvbnN0IG5lPWEuZW5kLmNoYXJhY3Rlci1hLnN0YXJ0LmNoYXJhY3RlcjtMPSIgIitVLnNsaWNlKFYrMSxuLnJhbmdlWzFdLW5lKX19TCs9dGhpcy5hcnJheVByZWZpeEluZGVudGF0aW9uO2xldCBTO3gudHlwZT09PSJhcnJheSImJihTPW4uaXRlbXMuZmluZChVPT5aKFUua2V5KSYmVS5rZXkucmFuZ2UmJlUua2V5LnZhbHVlPT09TiYmWihVLnZhbHVlKSYmIVUudmFsdWUudmFsdWUmJm8uZ2V0UG9zaXRpb24oVS5rZXkucmFuZ2VbMl0pLmxpbmU9PT1hLmVuZC5saW5lLTEpKSYmUyYmKEFycmF5LmlzQXJyYXkoeC5pdGVtcyk/dGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKHguaXRlbXNbMF0scyxpLHt9LGwsITApOnR5cGVvZiB4Lml0ZW1zPT0ib2JqZWN0IiYmeC5pdGVtcy50eXBlPT09Im9iamVjdCImJnRoaXMuYWRkQXJyYXlJdGVtVmFsdWVDb21wbGV0aW9uKHguaXRlbXMscyxpKSk7bGV0IGs9Tjtjb25zdCBJPUFycmF5LmlzQXJyYXkoQS5zY2hlbWEucmVxdWlyZWQpP0Euc2NoZW1hLnJlcXVpcmVkLmluY2x1ZGVzKE4pOiExOyghTi5zdGFydHNXaXRoKGMpfHwhZCkmJihrPXRoaXMuZ2V0SW5zZXJ0VGV4dEZvclByb3BlcnR5KE4seCxzLEwrdGhpcy5pbmRlbnRhdGlvbixJKSk7Y29uc3QgTT1aKHIpJiZyLnZhbHVlPT09bnVsbHx8emUocikmJnIuaXRlbXMubGVuZ3RoPT09MCxqPSgodj1BLnNjaGVtYS5yZXF1aXJlZCk9PW51bGw/dm9pZCAwOnYubGVuZ3RoKT4wOyghdGhpcy5wYXJlbnRTa2VsZXRvblNlbGVjdGVkRmlyc3R8fCFNfHwhaikmJmkuYWRkKHtraW5kOk10LlByb3BlcnR5LGxhYmVsOk4saW5zZXJ0VGV4dDprLGluc2VydFRleHRGb3JtYXQ6bHQuU25pcHBldCxkb2N1bWVudGF0aW9uOnRoaXMuZnJvbU1hcmt1cCh4Lm1hcmtkb3duRGVzY3JpcHRpb24pfHx4LmRlc2NyaXB0aW9ufHwiIn0sRSksKEM9QS5zY2hlbWEucmVxdWlyZWQpIT1udWxsJiZDLmluY2x1ZGVzKE4pJiZpLmFkZCh7bGFiZWw6TixpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclByb3BlcnR5KE4seCxzLEwrdGhpcy5pbmRlbnRhdGlvbiwhMCksaW5zZXJ0VGV4dEZvcm1hdDpsdC5TbmlwcGV0LGRvY3VtZW50YXRpb246dGhpcy5mcm9tTWFya3VwKHgubWFya2Rvd25EZXNjcmlwdGlvbil8fHguZGVzY3JpcHRpb258fCIiLHBhcmVudDp7c2NoZW1hOkEuc2NoZW1hLGluZGVudDpMfX0pfX19fWlmKGcmJlJlKGcpJiZrTyhBLnNjaGVtYSkmJnRoaXMuYWRkU2NoZW1hVmFsdWVDb21wbGV0aW9ucyhBLnNjaGVtYSxzLGkse30sbCksQS5zY2hlbWEudHlwZT09PSJvYmplY3QiJiZBLnNjaGVtYS5wcm9wZXJ0eU5hbWVzJiZBLnNjaGVtYS5hZGRpdGlvbmFsUHJvcGVydGllcyE9PSExKXtjb25zdCBUPVllKEEuc2NoZW1hLnByb3BlcnR5TmFtZXMpO2lmKCFULmRlcHJlY2F0aW9uTWVzc2FnZSYmIVQuZG9Ob3RTdWdnZXN0KXtjb25zdCBOPXRoaXMuZnJvbU1hcmt1cCgoVC5tYXJrZG93bkRlc2NyaXB0aW9ufHxULmRlc2NyaXB0aW9ufHwiIikrKFQucGF0dGVybj9gCgoqKlBhdHRlcm46KiogXGAke1QucGF0dGVybn1cYGA6IiIpKSx7Y2FuZGlkYXRlczp4LGltcG9zc2libGU6TH09dGhpcy5nZXRQcm9wZXJ0eU5hbWVzQ2FuZGlkYXRlcyhUKTtpZighTClpZih4Lmxlbmd0aClmb3IoY29uc3QgUyBvZiB4KWkuYWRkKHtraW5kOk10LlByb3BlcnR5LGxhYmVsOlMsaW5zZXJ0VGV4dDpgJHtTfTogYCxpbnNlcnRUZXh0Rm9ybWF0Omx0LlBsYWluVGV4dCxkb2N1bWVudGF0aW9uOk59KTtlbHNle2NvbnN0IFM9VC50aXRsZXx8InByb3BlcnR5IjtpLmFkZCh7a2luZDpNdC5Qcm9wZXJ0eSxsYWJlbDpTLGluc2VydFRleHQ6YFwkezE6JHtTfX06IGAsaW5zZXJ0VGV4dEZvcm1hdDpsdC5TbmlwcGV0LGRvY3VtZW50YXRpb246Tn0pfX19fWcmJkEubm9kZS5pbnRlcm5hbE5vZGU9PT1nJiZBLnNjaGVtYS5kZWZhdWx0U25pcHBldHMmJihuLml0ZW1zLmxlbmd0aD09PTE/dGhpcy5jb2xsZWN0RGVmYXVsdFNuaXBwZXRzKEEuc2NoZW1hLHMsaSx7bmV3TGluZUZpcnN0OiExLGluZGVudEZpcnN0T2JqZWN0OiExLHNob3VsZEluZGVudFdpdGhUYWI6ITB9LDEpOnRoaXMuY29sbGVjdERlZmF1bHRTbmlwcGV0cyhBLnNjaGVtYSxzLGkse25ld0xpbmVGaXJzdDohMSxpbmRlbnRGaXJzdE9iamVjdDohMCxzaG91bGRJbmRlbnRXaXRoVGFiOiExfSwxKSl9fWdldFZhbHVlQ29tcGxldGlvbnMoZSx0LG4scixzLGksbyxhLHUpe2xldCBsPW51bGw7aWYobiYmWihuKSYmKG49dC5nZXRQYXJlbnQobikpLCFuKXt0aGlzLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMoZS5zY2hlbWEsIiIsaSxvLCExKTtyZXR1cm59aWYoeWUobikpe2NvbnN0IGY9bi52YWx1ZTtpZihmJiZmLnJhbmdlJiZyPmYucmFuZ2VbMF0rZi5yYW5nZVsyXSlyZXR1cm47bD1aKG4ua2V5KT9uLmtleS52YWx1ZSsiIjpudWxsLG49dC5nZXRQYXJlbnQobil9aWYobiYmKGwhPT1udWxsfHxSZShuKSkpe2NvbnN0IGY9IiIsYz10LmdldE1hdGNoaW5nU2NoZW1hcyhlLnNjaGVtYSwtMSxudWxsLGEpO2Zvcihjb25zdCBwIG9mIGMpaWYocC5ub2RlLmludGVybmFsTm9kZT09PW4mJiFwLmludmVydGVkJiZwLnNjaGVtYSl7aWYocC5zY2hlbWEuaXRlbXMmJih0aGlzLmNvbGxlY3REZWZhdWx0U25pcHBldHMocC5zY2hlbWEsZixpLHtuZXdMaW5lRmlyc3Q6ITEsaW5kZW50Rmlyc3RPYmplY3Q6ITEsc2hvdWxkSW5kZW50V2l0aFRhYjohMX0pLFJlKG4pJiZuLml0ZW1zKSlpZihBcnJheS5pc0FycmF5KHAuc2NoZW1hLml0ZW1zKSl7Y29uc3QgaD10aGlzLmZpbmRJdGVtQXRPZmZzZXQobixzLHIpO2g8cC5zY2hlbWEuaXRlbXMubGVuZ3RoJiZ0aGlzLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMocC5zY2hlbWEuaXRlbXNbaF0sZixpLG8sITEpfWVsc2UgdGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKHAuc2NoZW1hLml0ZW1zLGYsaSxvLHUsdHlwZW9mIHAuc2NoZW1hLml0ZW1zPT0ib2JqZWN0IiYmKHAuc2NoZW1hLml0ZW1zLnR5cGU9PT0ib2JqZWN0Inx8Um0ocC5zY2hlbWEuaXRlbXMpKSk7aWYocC5zY2hlbWEucHJvcGVydGllcyl7Y29uc3QgaD1wLnNjaGVtYS5wcm9wZXJ0aWVzW2xdO2gmJnRoaXMuYWRkU2NoZW1hVmFsdWVDb21wbGV0aW9ucyhoLGYsaSxvLHUpfXAuc2NoZW1hLmFkZGl0aW9uYWxQcm9wZXJ0aWVzJiZ0aGlzLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMocC5zY2hlbWEuYWRkaXRpb25hbFByb3BlcnRpZXMsZixpLG8sdSl9by5ib29sZWFuJiYodGhpcy5hZGRCb29sZWFuVmFsdWVDb21wbGV0aW9uKCEwLGYsaSksdGhpcy5hZGRCb29sZWFuVmFsdWVDb21wbGV0aW9uKCExLGYsaSkpLG8ubnVsbCYmdGhpcy5hZGROdWxsVmFsdWVDb21wbGV0aW9uKGYsaSl9fWFkZEFycmF5SXRlbVZhbHVlQ29tcGxldGlvbihlLHQsbixyKXtjb25zdCBzPU9tKGUpLGk9YC0gJHt0aGlzLmdldEluc2VydFRleHRGb3JPYmplY3QoZSx0KS5pbnNlcnRUZXh0LnRyaW1MZWZ0KCl9YCxvPXM/IiB0eXBlIGAiK3MrImAiOiIiLGE9ZS5kZXNjcmlwdGlvbj8iICgiK2UuZGVzY3JpcHRpb24rIikiOiIiLHU9dGhpcy5nZXREb2N1bWVudGF0aW9uV2l0aE1hcmtkb3duVGV4dChKKCJDcmVhdGUgYW4gaXRlbSBvZiBhbiBhcnJheXswfXsxfSIsbyxhKSxpKTtuLmFkZCh7a2luZDp0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKGUudHlwZSksbGFiZWw6SigiLSAoYXJyYXkgaXRlbSkgIikrKHN8fHIpLGRvY3VtZW50YXRpb246dSxpbnNlcnRUZXh0OmksaW5zZXJ0VGV4dEZvcm1hdDpsdC5TbmlwcGV0fSl9Z2V0SW5zZXJ0VGV4dEZvclByb3BlcnR5KGUsdCxuLHI9dGhpcy5pbmRlbnRhdGlvbixzPSExKXtjb25zdCBpPXRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKGUsIiIsInN0cmluZyIpLG89aSsiOiIsYT10JiZzJiZVcih0LmRlZmF1bHQpO2xldCB1LGw9MDtpZih0KXtsZXQgZj1BcnJheS5pc0FycmF5KHQudHlwZSk/dC50eXBlWzBdOnQudHlwZTtpZihmfHwodC5wcm9wZXJ0aWVzP2Y9Im9iamVjdCI6dC5pdGVtcz9mPSJhcnJheSI6dC5hbnlPZiYmKGY9ImFueU9mIikpLEFycmF5LmlzQXJyYXkodC5kZWZhdWx0U25pcHBldHMpKXtpZih0LmRlZmF1bHRTbmlwcGV0cy5sZW5ndGg9PT0xKXtjb25zdCBjPXQuZGVmYXVsdFNuaXBwZXRzWzBdLmJvZHk7VXIoYykmJih1PXRoaXMuZ2V0SW5zZXJ0VGV4dEZvclNuaXBwZXRWYWx1ZShjLCIiLHtuZXdMaW5lRmlyc3Q6ITAsaW5kZW50Rmlyc3RPYmplY3Q6ITEsc2hvdWxkSW5kZW50V2l0aFRhYjohMX0sW10sMSksIXUuc3RhcnRzV2l0aCgiICIpJiYhdS5zdGFydHNXaXRoKGAKYCkmJih1PSIgIit1KSl9bCs9dC5kZWZhdWx0U25pcHBldHMubGVuZ3RofWlmKHQuZW51bSYmKCF1JiZ0LmVudW0ubGVuZ3RoPT09MSYmKHU9IiAiK3RoaXMuZ2V0SW5zZXJ0VGV4dEZvckd1ZXNzZWRWYWx1ZSh0LmVudW1bMF0sIiIsZikpLGwrPXQuZW51bS5sZW5ndGgpLFVyKHQuY29uc3QpJiYodXx8KHU9dGhpcy5nZXRJbnNlcnRUZXh0Rm9yR3Vlc3NlZFZhbHVlKHQuY29uc3QsIiIsZiksdT10aGlzLmV2YWx1YXRlVGFiMVN5bWJvbCh1KSx1PSIgIit1KSxsKyspLFVyKHQuZGVmYXVsdCkpe2lmKCF1fHxhKXtsZXQgYz10aGlzLmdldEluc2VydFRleHRGb3JHdWVzc2VkVmFsdWUodC5kZWZhdWx0LCIiLGYpO2EmJihjPXRoaXMuZXZhbHVhdGVUYWIxU3ltYm9sKGMpKSx1PSIgIitjfWwrK31pZihBcnJheS5pc0FycmF5KHQuZXhhbXBsZXMpJiZ0LmV4YW1wbGVzLmxlbmd0aCYmKHV8fCh1PSIgIit0aGlzLmdldEluc2VydFRleHRGb3JHdWVzc2VkVmFsdWUodC5leGFtcGxlc1swXSwiIixmKSksbCs9dC5leGFtcGxlcy5sZW5ndGgpLHQucHJvcGVydGllcylyZXR1cm5gJHtvfQoke3RoaXMuZ2V0SW5zZXJ0VGV4dEZvck9iamVjdCh0LG4scikuaW5zZXJ0VGV4dH1gO2lmKHQuaXRlbXMpcmV0dXJuYCR7b30KJHtyfS0gJHt0aGlzLmdldEluc2VydFRleHRGb3JBcnJheSh0Lml0ZW1zLG4sMSxyKS5pbnNlcnRUZXh0fWA7aWYobD09PTApc3dpdGNoKGYpe2Nhc2UiYm9vbGVhbiI6Y2FzZSJzdHJpbmciOmNhc2UiYW55T2YiOnU9IiAkMSI7YnJlYWs7Y2FzZSJvYmplY3QiOnU9YAoke3J9YDticmVhaztjYXNlImFycmF5Ijp1PWAKJHtyfS0gYDticmVhaztjYXNlIm51bWJlciI6Y2FzZSJpbnRlZ2VyIjp1PSIgJHsxOjB9IjticmVhaztjYXNlIm51bGwiOnU9IiAkezE6bnVsbH0iO2JyZWFrO2RlZmF1bHQ6cmV0dXJuIGl9fXJldHVybighdXx8bD4xJiYhYSkmJih1PSIgJDEiKSxvK3Urbn1nZXRJbnNlcnRUZXh0Rm9yT2JqZWN0KGUsdCxuPXRoaXMuaW5kZW50YXRpb24scj0xKXtsZXQgcz0iIjtyZXR1cm4gZS5wcm9wZXJ0aWVzPyhPYmplY3Qua2V5cyhlLnByb3BlcnRpZXMpLmZvckVhY2goaT0+e2NvbnN0IG89ZS5wcm9wZXJ0aWVzW2ldO2xldCBhPUFycmF5LmlzQXJyYXkoby50eXBlKT9vLnR5cGVbMF06by50eXBlO2lmKGF8fChvLmFueU9mJiYoYT0iYW55T2YiKSxvLnByb3BlcnRpZXMmJihhPSJvYmplY3QiKSxvLml0ZW1zJiYoYT0iYXJyYXkiKSksZS5yZXF1aXJlZCYmZS5yZXF1aXJlZC5pbmRleE9mKGkpPi0xKXN3aXRjaChhKXtjYXNlImJvb2xlYW4iOmNhc2Uic3RyaW5nIjpjYXNlIm51bWJlciI6Y2FzZSJpbnRlZ2VyIjpjYXNlImFueU9mIjp7bGV0IHU9by5kZWZhdWx0IT09dm9pZCAwP28uZGVmYXVsdDpvLmNvbnN0O3UhPT12b2lkIDA/KGE9PT0ic3RyaW5nIiYmKHU9RWkodSkpLHMrPWAke259JHtpfTogXCR7JHtyKyt9OiR7dX19CmApOnMrPWAke259JHtpfTogJCR7cisrfQpgO2JyZWFrfWNhc2UiYXJyYXkiOntjb25zdCB1PXRoaXMuZ2V0SW5zZXJ0VGV4dEZvckFycmF5KG8uaXRlbXMsdCxyKyssbiksbD11Lmluc2VydFRleHQuc3BsaXQoYApgKTtsZXQgZj11Lmluc2VydFRleHQ7aWYobC5sZW5ndGg+MSl7Zm9yKGxldCBjPTE7YzxsLmxlbmd0aDtjKyspe2NvbnN0IHA9bFtjXTtsW2NdPWAgICR7cH1gfWY9bC5qb2luKGAKYCl9cj11Lmluc2VydEluZGV4LHMrPWAke259JHtpfToKJHtufSR7dGhpcy5pbmRlbnRhdGlvbn0tICR7Zn0KYH1icmVhaztjYXNlIm9iamVjdCI6e2NvbnN0IHU9dGhpcy5nZXRJbnNlcnRUZXh0Rm9yT2JqZWN0KG8sdCxgJHtufSR7dGhpcy5pbmRlbnRhdGlvbn1gLHIrKyk7cj11Lmluc2VydEluZGV4LHMrPWAke259JHtpfToKJHt1Lmluc2VydFRleHR9CmB9YnJlYWt9ZWxzZSBpZighdGhpcy5kaXNhYmxlRGVmYXVsdFByb3BlcnRpZXMmJm8uZGVmYXVsdCE9PXZvaWQgMClzd2l0Y2goYSl7Y2FzZSJib29sZWFuIjpjYXNlIm51bWJlciI6Y2FzZSJpbnRlZ2VyIjpzKz1gJHtufSR7aT09PSJudWxsIj90aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZShpLCIiLCJzdHJpbmciKTppfTogXCR7JHtyKyt9OiR7by5kZWZhdWx0fX0KYDticmVhaztjYXNlInN0cmluZyI6cys9YCR7bn0ke2l9OiBcJHske3IrK306JHtFaShvLmRlZmF1bHQpfX0KYDticmVha319KSxzLnRyaW0oKS5sZW5ndGg9PT0wJiYocz1gJHtufSQke3IrK30KYCkscz1zLnRyaW1SaWdodCgpK3Qse2luc2VydFRleHQ6cyxpbnNlcnRJbmRleDpyfSk6KHM9YCR7bn0kJHtyKyt9CmAse2luc2VydFRleHQ6cyxpbnNlcnRJbmRleDpyfSl9Z2V0SW5zZXJ0VGV4dEZvckFycmF5KGUsdCxuPTEscj10aGlzLmluZGVudGF0aW9uKXtsZXQgcz0iIjtpZighZSlyZXR1cm4gcz1gJCR7bisrfWAse2luc2VydFRleHQ6cyxpbnNlcnRJbmRleDpufTtsZXQgaT1BcnJheS5pc0FycmF5KGUudHlwZSk/ZS50eXBlWzBdOmUudHlwZTtzd2l0Y2goaXx8KGUucHJvcGVydGllcyYmKGk9Im9iamVjdCIpLGUuaXRlbXMmJihpPSJhcnJheSIpKSxlLnR5cGUpe2Nhc2UiYm9vbGVhbiI6cz1gXCR7JHtuKyt9OmZhbHNlfWA7YnJlYWs7Y2FzZSJudW1iZXIiOmNhc2UiaW50ZWdlciI6cz1gXCR7JHtuKyt9OjB9YDticmVhaztjYXNlInN0cmluZyI6cz1gXCR7JHtuKyt9fWA7YnJlYWs7Y2FzZSJvYmplY3QiOntjb25zdCBvPXRoaXMuZ2V0SW5zZXJ0VGV4dEZvck9iamVjdChlLHQsYCR7cn0gIGAsbisrKTtzPW8uaW5zZXJ0VGV4dC50cmltTGVmdCgpLG49by5pbnNlcnRJbmRleH1icmVha31yZXR1cm57aW5zZXJ0VGV4dDpzLGluc2VydEluZGV4Om59fWdldEluc2VydFRleHRGb3JHdWVzc2VkVmFsdWUoZSx0LG4pe3N3aXRjaCh0eXBlb2YgZSl7Y2FzZSJvYmplY3QiOnJldHVybiBlPT09bnVsbD8iJHsxOm51bGx9Iit0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKGUsdCxuKTtjYXNlInN0cmluZyI6cmV0dXJuIG49PT0ibnVtYmVyInx8bj09PSJpbnRlZ2VyIj8iJHsxOiIrZSsifSIrdDoiJHsxOiIrdGhpcy5nZXRJbnNlcnRUZXh0Rm9yUGxhaW5UZXh0KEVpKGUpKSsifSIrdDtjYXNlIm51bWJlciI6Y2FzZSJib29sZWFuIjpyZXR1cm4iJHsxOiIrZSsifSIrdH1yZXR1cm4gdGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoZSx0LG4pfWdldEluc2VydFRleHRGb3JQbGFpblRleHQoZSl7cmV0dXJuIGUucmVwbGFjZSgvXFwoPz1bJH1cXF0pL2csIlxcXFwiKS5yZXBsYWNlKC9bJH1dL2csIlxcJCYiKX1nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoZSx0LG4pe2lmKGU9PT1udWxsKXJldHVybiJudWxsIjtzd2l0Y2godHlwZW9mIGUpe2Nhc2Uib2JqZWN0Ijp7Y29uc3Qgcj10aGlzLmluZGVudGF0aW9uO3JldHVybiB0aGlzLmdldEluc2VydFRlbXBsYXRlRm9yVmFsdWUoZSxyLHtpbmRleDoxfSx0KX1jYXNlIm51bWJlciI6Y2FzZSJib29sZWFuIjpyZXR1cm4gdGhpcy5nZXRJbnNlcnRUZXh0Rm9yUGxhaW5UZXh0KGUrdCl9cmV0dXJuIG49QXJyYXkuaXNBcnJheShuKT9uWzBdOm4sbj09PSJzdHJpbmciJiYoZT1FaShTdHJpbmcoZSksdGhpcy5pc1NpbmdsZVF1b3RlKSksdGhpcy5nZXRJbnNlcnRUZXh0Rm9yUGxhaW5UZXh0KGUrdCl9Z2V0SW5zZXJ0VGVtcGxhdGVGb3JWYWx1ZShlLHQsbixyKXtpZihBcnJheS5pc0FycmF5KGUpKXtsZXQgcz1gCmA7Zm9yKGNvbnN0IGkgb2YgZSlzKz1gJHt0fS0gXCR7JHtuLmluZGV4Kyt9OiR7aX19CmA7cmV0dXJuIHN9ZWxzZSBpZih0eXBlb2YgZT09Im9iamVjdCIpe2xldCBzPWAKYDtmb3IoY29uc3QgaSBpbiBlKWlmKE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChlLGkpKXtjb25zdCBvPWVbaV07cys9YCR7dH1cJHske24uaW5kZXgrK306JHtpfX06YDtsZXQgYTt0eXBlb2Ygbz09Im9iamVjdCI/YT1gJHt0aGlzLmdldEluc2VydFRlbXBsYXRlRm9yVmFsdWUobyx0K3RoaXMuaW5kZW50YXRpb24sbixyKX1gOmE9YCBcJHske24uaW5kZXgrK306JHt0aGlzLmdldEluc2VydFRleHRGb3JQbGFpblRleHQobytyKX19CmAscys9YCR7YX1gfXJldHVybiBzfXJldHVybiB0aGlzLmdldEluc2VydFRleHRGb3JQbGFpblRleHQoZStyKX1hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKGUsdCxuLHIscz0hMSxpPSExKXt0eXBlb2YgZT09Im9iamVjdCImJih0aGlzLmFkZEVudW1WYWx1ZUNvbXBsZXRpb25zKGUsdCxuLHMpLHRoaXMuYWRkRGVmYXVsdFZhbHVlQ29tcGxldGlvbnMoZSx0LG4pLHRoaXMuY29sbGVjdFR5cGVzKGUsciksaSYmIVJtKGUpJiZ0aGlzLmFkZEFycmF5SXRlbVZhbHVlQ29tcGxldGlvbihlLHQsbiksQXJyYXkuaXNBcnJheShlLmFsbE9mKSYmZS5hbGxPZi5mb3JFYWNoKG89PnRoaXMuYWRkU2NoZW1hVmFsdWVDb21wbGV0aW9ucyhvLHQsbixyLHMsaSkpLEFycmF5LmlzQXJyYXkoZS5hbnlPZikmJmUuYW55T2YuZm9yRWFjaChvPT50aGlzLmFkZFNjaGVtYVZhbHVlQ29tcGxldGlvbnMobyx0LG4scixzLGkpKSxBcnJheS5pc0FycmF5KGUub25lT2YpJiZlLm9uZU9mLmZvckVhY2gobz0+dGhpcy5hZGRTY2hlbWFWYWx1ZUNvbXBsZXRpb25zKG8sdCxuLHIscyxpKSkpfWNvbGxlY3RUeXBlcyhlLHQpe2lmKEFycmF5LmlzQXJyYXkoZS5lbnVtKXx8VXIoZS5jb25zdCkpcmV0dXJuO2NvbnN0IG49ZS50eXBlO0FycmF5LmlzQXJyYXkobik/bi5mb3JFYWNoKGZ1bmN0aW9uKHIpe3JldHVybiB0W3JdPSEwfSk6biYmKHRbbl09ITApfWFkZERlZmF1bHRWYWx1ZUNvbXBsZXRpb25zKGUsdCxuLHI9MCl7bGV0IHM9ITE7aWYoVXIoZS5kZWZhdWx0KSl7bGV0IGk9ZS50eXBlLG89ZS5kZWZhdWx0O2ZvcihsZXQgdT1yO3U+MDt1LS0pbz1bb10saT0iYXJyYXkiO2xldCBhO3R5cGVvZiBvPT0ib2JqZWN0Ij9hPUooIkRlZmF1bHQgdmFsdWUiKTphPXRoaXMuZ2V0TGFiZWxGb3JWYWx1ZShvKSxuLmFkZCh7a2luZDp0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKGkpLGxhYmVsOmEsaW5zZXJ0VGV4dDp0aGlzLmdldEluc2VydFRleHRGb3JWYWx1ZShvLHQsaSksaW5zZXJ0VGV4dEZvcm1hdDpsdC5TbmlwcGV0LGRldGFpbDpKKCJEZWZhdWx0IHZhbHVlIil9KSxzPSEwfUFycmF5LmlzQXJyYXkoZS5leGFtcGxlcykmJmUuZXhhbXBsZXMuZm9yRWFjaChpPT57bGV0IG89ZS50eXBlLGE9aTtmb3IobGV0IHU9cjt1PjA7dS0tKWE9W2FdLG89ImFycmF5IjtuLmFkZCh7a2luZDp0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKG8pLGxhYmVsOnRoaXMuZ2V0TGFiZWxGb3JWYWx1ZShhKSxpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKGEsdCxvKSxpbnNlcnRUZXh0Rm9ybWF0Omx0LlNuaXBwZXR9KSxzPSEwfSksdGhpcy5jb2xsZWN0RGVmYXVsdFNuaXBwZXRzKGUsdCxuLHtuZXdMaW5lRmlyc3Q6ITAsaW5kZW50Rmlyc3RPYmplY3Q6ITAsc2hvdWxkSW5kZW50V2l0aFRhYjohMH0pLCFzJiZ0eXBlb2YgZS5pdGVtcz09Im9iamVjdCImJiFBcnJheS5pc0FycmF5KGUuaXRlbXMpJiZ0aGlzLmFkZERlZmF1bHRWYWx1ZUNvbXBsZXRpb25zKGUuaXRlbXMsdCxuLHIrMSl9YWRkRW51bVZhbHVlQ29tcGxldGlvbnMoZSx0LG4scil7aWYoVXIoZS5jb25zdCkmJighcnx8dHlwZW9mIGUuY29uc3Q9PSJvYmplY3QiKSYmbi5hZGQoe2tpbmQ6dGhpcy5nZXRTdWdnZXN0aW9uS2luZChlLnR5cGUpLGxhYmVsOnRoaXMuZ2V0TGFiZWxGb3JWYWx1ZShlLmNvbnN0KSxpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKGUuY29uc3QsdCxlLnR5cGUpLGluc2VydFRleHRGb3JtYXQ6bHQuU25pcHBldCxkb2N1bWVudGF0aW9uOnRoaXMuZnJvbU1hcmt1cChlLm1hcmtkb3duRGVzY3JpcHRpb24pfHxlLmRlc2NyaXB0aW9ufSksQXJyYXkuaXNBcnJheShlLmVudW0pKWZvcihsZXQgcz0wLGk9ZS5lbnVtLmxlbmd0aDtzPGk7cysrKXtjb25zdCBvPWUuZW51bVtzXTtpZihyJiZ0eXBlb2YgbyE9Im9iamVjdCIpY29udGludWU7bGV0IGE9dGhpcy5mcm9tTWFya3VwKGUubWFya2Rvd25EZXNjcmlwdGlvbil8fGUuZGVzY3JpcHRpb247ZS5tYXJrZG93bkVudW1EZXNjcmlwdGlvbnMmJnM8ZS5tYXJrZG93bkVudW1EZXNjcmlwdGlvbnMubGVuZ3RoJiZ0aGlzLmRvZXNTdXBwb3J0TWFya2Rvd24oKT9hPXRoaXMuZnJvbU1hcmt1cChlLm1hcmtkb3duRW51bURlc2NyaXB0aW9uc1tzXSk6ZS5lbnVtRGVzY3JpcHRpb25zJiZzPGUuZW51bURlc2NyaXB0aW9ucy5sZW5ndGgmJihhPWUuZW51bURlc2NyaXB0aW9uc1tzXSksbi5hZGQoe2tpbmQ6dGhpcy5nZXRTdWdnZXN0aW9uS2luZChlLnR5cGUpLGxhYmVsOnRoaXMuZ2V0TGFiZWxGb3JWYWx1ZShvKSxpbnNlcnRUZXh0OnRoaXMuZ2V0SW5zZXJ0VGV4dEZvclZhbHVlKG8sdCxlLnR5cGUpLGluc2VydFRleHRGb3JtYXQ6bHQuU25pcHBldCxkb2N1bWVudGF0aW9uOmF9KX19Z2V0TGFiZWxGb3JWYWx1ZShlKXtyZXR1cm4gZT09PW51bGw/Im51bGwiOkFycmF5LmlzQXJyYXkoZSk/SlNPTi5zdHJpbmdpZnkoZSk6dHlwZW9mIGU9PSJzdHJpbmciP0VpKGUsdGhpcy5pc1NpbmdsZVF1b3RlKTpTdHJpbmcoZSl9Y29sbGVjdERlZmF1bHRTbmlwcGV0cyhlLHQsbixyLHM9MCl7aWYoQXJyYXkuaXNBcnJheShlLmRlZmF1bHRTbmlwcGV0cykpZm9yKGNvbnN0IGkgb2YgZS5kZWZhdWx0U25pcHBldHMpe2xldCBvPWUudHlwZSxhPWkuYm9keSx1PWkubGFiZWwsbCxmO2lmKFVyKGEpKXtjb25zdCBjPWkudHlwZXx8ZS50eXBlO2lmKHM9PT0wJiZjPT09ImFycmF5Iil7Y29uc3QgaD17fTtPYmplY3Qua2V5cyhhKS5mb3JFYWNoKChkLG0pPT57bT09PTAmJiFkLnN0YXJ0c1dpdGgoIi0iKT9oW2AtICR7ZH1gXT1hW2RdOmhbYCAgJHtkfWBdPWFbZF19KSxhPWh9Y29uc3QgcD1PYmplY3Qua2V5cyhuLnByb3Bvc2VkKS5maWx0ZXIoaD0+bi5wcm9wb3NlZFtoXS5sYWJlbD09PWFmKTtpZihsPXRoaXMuZ2V0SW5zZXJ0VGV4dEZvclNuaXBwZXRWYWx1ZShhLHQscixwKSxsPT09IiImJmEpY29udGludWU7dT11fHx0aGlzLmdldExhYmVsRm9yU25pcHBldFZhbHVlKGEpfWVsc2UgaWYodHlwZW9mIGkuYm9keVRleHQ9PSJzdHJpbmciKXtsZXQgYz0iIixwPSIiLGg9IiI7Zm9yKGxldCBkPXM7ZD4wO2QtLSljPWMraCtgWwpgLHA9cCtgCmAraCsiXSIsaCs9dGhpcy5pbmRlbnRhdGlvbixvPSJhcnJheSI7bD1jK2graS5ib2R5VGV4dC5zcGxpdChgCmApLmpvaW4oYApgK2gpK3ArdCx1PXV8fGwsZj1sLnJlcGxhY2UoL1tcbl0vZywiIil9bi5hZGQoe2tpbmQ6aS5zdWdnZXN0aW9uS2luZHx8dGhpcy5nZXRTdWdnZXN0aW9uS2luZChvKSxsYWJlbDp1LHNvcnRUZXh0Omkuc29ydFRleHR8fGkubGFiZWwsZG9jdW1lbnRhdGlvbjp0aGlzLmZyb21NYXJrdXAoaS5tYXJrZG93bkRlc2NyaXB0aW9uKXx8aS5kZXNjcmlwdGlvbixpbnNlcnRUZXh0OmwsaW5zZXJ0VGV4dEZvcm1hdDpsdC5TbmlwcGV0LGZpbHRlclRleHQ6Zn0pfX1nZXRJbnNlcnRUZXh0Rm9yU25pcHBldFZhbHVlKGUsdCxuLHIscyl7cmV0dXJuIG9mKGUsIiIsbz0+e2lmKHR5cGVvZiBvPT0ic3RyaW5nIil7aWYob1swXT09PSJeIilyZXR1cm4gby5zdWJzdHIoMSk7aWYobz09PSJ0cnVlInx8bz09PSJmYWxzZSIpcmV0dXJuYCIke299ImB9cmV0dXJuIG99LHsuLi5uLGluZGVudGF0aW9uOnRoaXMuaW5kZW50YXRpb24sZXhpc3RpbmdQcm9wczpyfSxzKSt0fWFkZEJvb2xlYW5WYWx1ZUNvbXBsZXRpb24oZSx0LG4pe24uYWRkKHtraW5kOnRoaXMuZ2V0U3VnZ2VzdGlvbktpbmQoImJvb2xlYW4iKSxsYWJlbDplPyJ0cnVlIjoiZmFsc2UiLGluc2VydFRleHQ6dGhpcy5nZXRJbnNlcnRUZXh0Rm9yVmFsdWUoZSx0LCJib29sZWFuIiksaW5zZXJ0VGV4dEZvcm1hdDpsdC5TbmlwcGV0LGRvY3VtZW50YXRpb246IiJ9KX1hZGROdWxsVmFsdWVDb21wbGV0aW9uKGUsdCl7dC5hZGQoe2tpbmQ6dGhpcy5nZXRTdWdnZXN0aW9uS2luZCgibnVsbCIpLGxhYmVsOiJudWxsIixpbnNlcnRUZXh0OiJudWxsIitlLGluc2VydFRleHRGb3JtYXQ6bHQuU25pcHBldCxkb2N1bWVudGF0aW9uOiIifSl9Z2V0TGFiZWxGb3JTbmlwcGV0VmFsdWUoZSl7cmV0dXJuIEpTT04uc3RyaW5naWZ5KGUpLnJlcGxhY2UoL1wkXHtcZCs6KFtefV0rKVx9fFwkXGQrL2csIiQxIil9Z2V0Q3VzdG9tVGFnVmFsdWVDb21wbGV0aW9ucyhlKXtBdyh0aGlzLmN1c3RvbVRhZ3MpLmZvckVhY2gobj0+e2NvbnN0IHI9bi5zcGxpdCgiICIpWzBdO3RoaXMuYWRkQ3VzdG9tVGFnVmFsdWVDb21wbGV0aW9uKGUsIiAiLHIpfSl9YWRkQ3VzdG9tVGFnVmFsdWVDb21wbGV0aW9uKGUsdCxuKXtlLmFkZCh7a2luZDp0aGlzLmdldFN1Z2dlc3Rpb25LaW5kKCJzdHJpbmciKSxsYWJlbDpuLGluc2VydFRleHQ6bit0LGluc2VydFRleHRGb3JtYXQ6bHQuU25pcHBldCxkb2N1bWVudGF0aW9uOiIifSl9Z2V0RG9jdW1lbnRhdGlvbldpdGhNYXJrZG93blRleHQoZSx0KXtsZXQgbj1lO3JldHVybiB0aGlzLmRvZXNTdXBwb3J0TWFya2Rvd24oKSYmKHQ9dC5yZXBsYWNlKC9cJHtbMC05XStbOnxdKC4qKX0vZywocixzKT0+cykucmVwbGFjZSgvXCQoWzAtOV0rKS9nLCIiKSxuPXRoaXMuZnJvbU1hcmt1cChgJHtlfQogXGBcYFxgCiR7dH0KXGBcYFxgYCkpLG59Z2V0U3VnZ2VzdGlvbktpbmQoZSl7aWYoQXJyYXkuaXNBcnJheShlKSl7Y29uc3QgdD1lO2U9dC5sZW5ndGg+MD90WzBdOm51bGx9aWYoIWUpcmV0dXJuIE10LlZhbHVlO3N3aXRjaChlKXtjYXNlInN0cmluZyI6cmV0dXJuIE10LlZhbHVlO2Nhc2Uib2JqZWN0IjpyZXR1cm4gTXQuTW9kdWxlO2Nhc2UicHJvcGVydHkiOnJldHVybiBNdC5Qcm9wZXJ0eTtkZWZhdWx0OnJldHVybiBNdC5WYWx1ZX19Z2V0Q3VycmVudFdvcmQoZSx0KXtsZXQgbj10LTE7Y29uc3Qgcj1lLmdldFRleHQoKTtmb3IoO24+PTAmJmAgCQpcclx2Ijp7WyxdfWAuaW5kZXhPZihyLmNoYXJBdChuKSk9PT0tMTspbi0tO3JldHVybiByLnN1YnN0cmluZyhuKzEsdCl9ZnJvbU1hcmt1cChlKXtpZihlJiZ0aGlzLmRvZXNTdXBwb3J0TWFya2Rvd24oKSlyZXR1cm57a2luZDp2ci5NYXJrZG93bix2YWx1ZTplfX1kb2VzU3VwcG9ydE1hcmtkb3duKCl7aWYodGhpcy5zdXBwb3J0c01hcmtkb3duPT09dm9pZCAwKXtjb25zdCBlPXRoaXMuY2xpZW50Q2FwYWJpbGl0aWVzLnRleHREb2N1bWVudCYmdGhpcy5jbGllbnRDYXBhYmlsaXRpZXMudGV4dERvY3VtZW50LmNvbXBsZXRpb247dGhpcy5zdXBwb3J0c01hcmtkb3duPWUmJmUuY29tcGxldGlvbkl0ZW0mJkFycmF5LmlzQXJyYXkoZS5jb21wbGV0aW9uSXRlbS5kb2N1bWVudGF0aW9uRm9ybWF0KSYmZS5jb21wbGV0aW9uSXRlbS5kb2N1bWVudGF0aW9uRm9ybWF0LmluZGV4T2YodnIuTWFya2Rvd24pIT09LTF9cmV0dXJuIHRoaXMuc3VwcG9ydHNNYXJrZG93bn1maW5kSXRlbUF0T2Zmc2V0KGUsdCxuKXtmb3IobGV0IHI9ZS5pdGVtcy5sZW5ndGgtMTtyPj0wO3ItLSl7Y29uc3Qgcz1lLml0ZW1zW3JdO2lmKGdlKHMpJiZzLnJhbmdlKXtpZihuPnMucmFuZ2VbMV0pcmV0dXJuIHI7aWYobj49cy5yYW5nZVswXSlyZXR1cm4gcn19cmV0dXJuIDB9Z2V0UHJvcGVydHlOYW1lc0NhbmRpZGF0ZXMoZSl7bGV0IHQ9ITE7Y29uc3Qgbj1zPT57dmFyIG8sYSx1O2lmKCFzfHx0eXBlb2YgcyE9Im9iamVjdCIpcmV0dXJuIG51bGw7aWYoQXJyYXkuaXNBcnJheShzLmFsbE9mKSYmcy5hbGxPZi5sZW5ndGgpe2xldCBsPW51bGw7Zm9yKGNvbnN0IGYgb2Ygcy5hbGxPZil7Y29uc3QgYz1uKGYpO2lmKGMmJihsPWw/bmV3IFNldChbLi4ubF0uZmlsdGVyKHA9PmMuaGFzKHApKSk6bmV3IFNldChjKSxsLnNpemU9PT0wKSlyZXR1cm4gdD0hMCxuZXcgU2V0fWlmKGwpcmV0dXJuIGx9Y29uc3QgaT1uZXcgU2V0O3JldHVybiB0eXBlb2Ygcy5jb25zdD09InN0cmluZyImJmkuYWRkKHMuY29uc3QpLChvPXMuZW51bSk9PW51bGx8fG8uZm9yRWFjaChsPT50eXBlb2YgbD09InN0cmluZyImJmkuYWRkKGwpKSwoYT1zLmFueU9mKT09bnVsbHx8YS5mb3JFYWNoKGw9Pnt2YXIgZjtyZXR1cm4oZj1uKGwpKT09bnVsbD92b2lkIDA6Zi5mb3JFYWNoKGM9PmkuYWRkKGMpKX0pLCh1PXMub25lT2YpPT1udWxsfHx1LmZvckVhY2gobD0+e3ZhciBmO3JldHVybihmPW4obCkpPT1udWxsP3ZvaWQgMDpmLmZvckVhY2goYz0+aS5hZGQoYykpfSksaS5zaXplP2k6bnVsbH0scj1uKGUpO3JldHVybntjYW5kaWRhdGVzOnI/Wy4uLnJdOltdLGltcG9zc2libGU6dH19Z2V0UXVvdGUoKXtyZXR1cm4gdGhpcy5pc1NpbmdsZVF1b3RlPyInIjonIid9ZXZhbHVhdGVUYWIxU3ltYm9sKGUpe3JldHVybiBlLnJlcGxhY2UoL1wkXHsxOiguKilcfS8sIiQxIil9aXNQYXJlbnRDb21wbGV0aW9uSXRlbShlKXtyZXR1cm4icGFyZW50ImluIGV9fSx2aj1jbGFzc3tjb25zdHJ1Y3RvcihlKXt0aGlzLnRlbGVtZXRyeT1lfWdldERlZmluaXRpb24oZSx0KXt2YXIgbjt0cnl7Y29uc3Qgcj1vbi5nZXRZYW1sRG9jdW1lbnQoZSkscz1lLm9mZnNldEF0KHQucG9zaXRpb24pLGk9bXUocyxyKTtpZihpKXtjb25zdFtvXT1pLmdldE5vZGVGcm9tUG9zaXRpb24ocyxuZXcgV3IoZSkpO2lmKG8mJk90KG8pKXtjb25zdCBhPW8ucmVzb2x2ZShpLmludGVybmFsRG9jdW1lbnQpO2lmKGEmJmEucmFuZ2Upe2NvbnN0IHU9WS5jcmVhdGUoZS5wb3NpdGlvbkF0KGEucmFuZ2VbMF0pLGUucG9zaXRpb25BdChhLnJhbmdlWzJdKSksbD1ZLmNyZWF0ZShlLnBvc2l0aW9uQXQoYS5yYW5nZVswXSksZS5wb3NpdGlvbkF0KGEucmFuZ2VbMV0pKTtyZXR1cm5bY3AuY3JlYXRlKGUudXJpLHUsbCldfX19fWNhdGNoKHIpeyhuPXRoaXMudGVsZW1ldHJ5KT09bnVsbHx8bi5zZW5kRXJyb3IoInlhbWwuZGVmaW5pdGlvbi5lcnJvciIscil9fX07ZnVuY3Rpb24gRmooZSx0KXtjb25zdCBuPW9uLmdldFlhbWxEb2N1bWVudChlKTtyZXR1cm4gdC5tYXAobz0+e2NvbnN0IGE9cihvKTtsZXQgdTtmb3IoY29uc3QgbCBvZiBhKXU9cmwuY3JlYXRlKGwsdSk7cmV0dXJuIHU/P3JsLmNyZWF0ZSh7c3RhcnQ6byxlbmQ6b30pfSk7ZnVuY3Rpb24gcihvKXtjb25zdCBhPWUub2Zmc2V0QXQobyksdT1bXTtmb3IoY29uc3QgbCBvZiBuLmRvY3VtZW50cyl7bGV0IGYsYztmb3IobC52aXNpdChwPT57Y29uc3QgaD1wLm9mZnNldCtwLmxlbmd0aDtpZihoPGF8fGkoaC0xLGgpPT09YApgJiZoLTE8YSlyZXR1cm4hMDtsZXQgZD1wLm9mZnNldDtpZihkPmEpe2NvbnN0IG09cyhwLG8pO2lmKCFtfHxtPmEpcmV0dXJuITA7ZD1tfXJldHVybighZnx8ZD49Zi5vZmZzZXQpJiYoZj1wLGM9ZCksITB9KTtmOyl7Y29uc3QgcD1jPz9mLm9mZnNldCxoPWYub2Zmc2V0K2YubGVuZ3RoLGQ9e3N0YXJ0OmUucG9zaXRpb25BdChwKSxlbmQ6ZS5wb3NpdGlvbkF0KGgpfSxtPWUuZ2V0VGV4dChkKSxnPUFqKG0pLEQ9cCtnLmxlbmd0aDtEPj1hJiYoZC5lbmQ9ZS5wb3NpdGlvbkF0KEQpKTtjb25zdCBiPShFLEYpPT5nLnN0YXJ0c1dpdGgoRSkmJmcuZW5kc1dpdGgoRnx8RSk7KGYudHlwZT09PSJzdHJpbmciJiYoYigiJyIpfHxiKCciJykpfHxmLnR5cGU9PT0ib2JqZWN0IiYmYigieyIsIn0iKXx8Zi50eXBlPT09ImFycmF5IiYmYigiWyIsIl0iKSkmJnUucHVzaCh7c3RhcnQ6ZS5wb3NpdGlvbkF0KHArMSksZW5kOmUucG9zaXRpb25BdChoLTEpfSksdS5wdXNoKGQpLGY9Zi5wYXJlbnQsYz12b2lkIDB9aWYodS5sZW5ndGg+MClicmVha31yZXR1cm4gdS5yZXZlcnNlKCl9ZnVuY3Rpb24gcyhvLGEpe3ZhciBsO2NvbnN0IHU9ZS5wb3NpdGlvbkF0KG8ub2Zmc2V0KTtpZih1LmxpbmU9PT1hLmxpbmUpe2lmKCgobD1vLnBhcmVudCk9PW51bGw/dm9pZCAwOmwudHlwZSk9PT0iYXJyYXkiJiZpKG8ub2Zmc2V0LTIsby5vZmZzZXQpPT09Ii0gIilyZXR1cm4gby5vZmZzZXQtMjtpZihvLnR5cGU9PT0iYXJyYXkifHxvLnR5cGU9PT0ib2JqZWN0Iil7Y29uc3QgZj17bGluZTp1LmxpbmUsY2hhcmFjdGVyOjB9O2lmKGUuZ2V0VGV4dCh7c3RhcnQ6ZixlbmQ6dX0pLnRyaW0oKS5sZW5ndGg9PT0wKXJldHVybiBlLm9mZnNldEF0KGYpfX19ZnVuY3Rpb24gaShvLGEpe3JldHVybiBlLmdldFRleHQoe3N0YXJ0OmUucG9zaXRpb25BdChvKSxlbmQ6ZS5wb3NpdGlvbkF0KGEpfSl9fWZ1bmN0aW9uIEFqKGUpe3JldHVybiBlLmVuZHNXaXRoKGBccgpgKT9lLnN1YnN0cmluZygwLGUubGVuZ3RoLTIpOmUuZW5kc1dpdGgoYApgKT9lLnN1YnN0cmluZygwLGUubGVuZ3RoLTEpOmV9dmFyIHdqPXt9LFF3PWNsYXNzIGV4dGVuZHMgRXJyb3J7Y29uc3RydWN0b3IodCxuKXtzdXBlcihuKTtXZSh0aGlzLCJuYW1lIiwiUmVzcG9uc2VFcnJvciIpfX0sQ2o9Y2xhc3N7Y29uc3RydWN0b3IoZSl7dGhpcy50ZWxlbWV0cnk9ZX1wcmVwYXJlUmVuYW1lKGUsdCl7dmFyIG47dHJ5e2NvbnN0IHI9dGhpcy5maW5kVGFyZ2V0KGUsdC5wb3NpdGlvbik7cmV0dXJuIXJ8fCF0aGlzLmZpbmRBbmNob3JUb2tlbihyLnlhbWxEb2Msci5hbmNob3JOb2RlKT9udWxsOnRoaXMuZ2V0TmFtZVJhbmdlKGUsci50b2tlbil9Y2F0Y2gocil7cmV0dXJuKG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLnNlbmRFcnJvcigieWFtbC5wcmVwYXJlUmVuYW1lLmVycm9yIixyKSxudWxsfX1kb1JlbmFtZShlLHQpe3ZhciBuO3RyeXtjb25zdCByPXRoaXMuZmluZFRhcmdldChlLHQucG9zaXRpb24pO2lmKCFyKXJldHVybiBudWxsO2NvbnN0IHM9dGhpcy5maW5kQW5jaG9yVG9rZW4oci55YW1sRG9jLHIuYW5jaG9yTm9kZSk7aWYoIXMpcmV0dXJuIG51bGw7Y29uc3QgaT10Lm5ld05hbWUsbz10aGlzLmZpbmRJbnZhbGlkQW5jaG9yQ2hhcihpKTtpZihvIT09bnVsbCl0aHJvdyBuZXcgUXcod2ouSW52YWxpZFBhcmFtcyxgQW5jaG9yIG5hbWUgY2Fubm90IGNvbnRhaW4gJyR7b30nYCk7Y29uc3QgYT1bXTtyZXR1cm4gYS5wdXNoKERlLnJlcGxhY2UodGhpcy5nZXROYW1lUmFuZ2UoZSxzKSxpKSksYmUoci55YW1sRG9jLmludGVybmFsRG9jdW1lbnQsKHUsbCk9PntPdChsKSYmbC5zcmNUb2tlbiYmbC5yZXNvbHZlKHIueWFtbERvYy5pbnRlcm5hbERvY3VtZW50KT09PXIuYW5jaG9yTm9kZSYmYS5wdXNoKERlLnJlcGxhY2UodGhpcy5nZXROYW1lUmFuZ2UoZSxsLnNyY1Rva2VuKSxpKSl9KSx7Y2hhbmdlczp7W2UudXJpXTphfX19Y2F0Y2gocil7aWYociBpbnN0YW5jZW9mIFF3KXRocm93IHI7cmV0dXJuKG49dGhpcy50ZWxlbWV0cnkpPT1udWxsfHxuLnNlbmRFcnJvcigieWFtbC5yZW5hbWUuZXJyb3IiLHIpLG51bGx9fWZpbmRUYXJnZXQoZSx0KXtjb25zdCBuPW9uLmdldFlhbWxEb2N1bWVudChlKSxyPWUub2Zmc2V0QXQodCkscz1tdShyLG4pO2lmKCFzKXJldHVybiBudWxsO2NvbnN0W2ldPXMuZ2V0Tm9kZUZyb21Qb3NpdGlvbihyLG5ldyBXcihlKSk7aWYoIWkpcmV0dXJuIHRoaXMuZmluZEJ5VG9rZW4ocyxyKTtpZihPdChpKSYmaS5zcmNUb2tlbiYmdGhpcy5pc09mZnNldEluc2lkZVRva2VuKGkuc3JjVG9rZW4scikpe2NvbnN0IG89aS5yZXNvbHZlKHMuaW50ZXJuYWxEb2N1bWVudCk7cmV0dXJuIG8/e2FuY2hvck5vZGU6byx0b2tlbjppLnNyY1Rva2VuLHlhbWxEb2M6c306bnVsbH1pZigoSWUoaSl8fFooaSkpJiZpLmFuY2hvcil7Y29uc3Qgbz10aGlzLmZpbmRBbmNob3JUb2tlbihzLGkpO2lmKG8mJnRoaXMuaXNPZmZzZXRJbnNpZGVUb2tlbihvLHIpKXJldHVybnthbmNob3JOb2RlOmksdG9rZW46byx5YW1sRG9jOnN9fXJldHVybiB0aGlzLmZpbmRCeVRva2VuKHMscil9ZmluZEJ5VG9rZW4oZSx0KXtsZXQgbjtyZXR1cm4gYmUoZS5pbnRlcm5hbERvY3VtZW50LChyLHMpPT57aWYoT3QocykmJnMuc3JjVG9rZW4mJnRoaXMuaXNPZmZzZXRJbnNpZGVUb2tlbihzLnNyY1Rva2VuLHQpKXtjb25zdCBpPXMucmVzb2x2ZShlLmludGVybmFsRG9jdW1lbnQpO2lmKGkpcmV0dXJuIG49e2FuY2hvck5vZGU6aSx0b2tlbjpzLnNyY1Rva2VuLHlhbWxEb2M6ZX0sYmUuQlJFQUt9aWYoKEllKHMpfHxaKHMpKSYmcy5hbmNob3Ipe2NvbnN0IGk9dGhpcy5maW5kQW5jaG9yVG9rZW4oZSxzKTtpZihpJiZ0aGlzLmlzT2Zmc2V0SW5zaWRlVG9rZW4oaSx0KSlyZXR1cm4gbj17YW5jaG9yTm9kZTpzLHRva2VuOmkseWFtbERvYzplfSxiZS5CUkVBS319KSxuPz9udWxsfWZpbmRBbmNob3JUb2tlbihlLHQpe2NvbnN0IG49ZS5nZXRQYXJlbnQodCkscj1bXTtuJiZuLnNyY1Rva2VuJiZyLnB1c2gobi5zcmNUb2tlbiksdC5zcmNUb2tlbiYmci5wdXNoKHQuc3JjVG9rZW4pO2Zvcihjb25zdCBzIG9mIHIpe2NvbnN0IGk9dGhpcy5nZXRBbmNob3JGcm9tVG9rZW4ocyx0KTtpZihpKXJldHVybiBpfX1nZXRBbmNob3JGcm9tVG9rZW4oZSx0KXtpZihxbShlKSlyZXR1cm4gdGhpcy5nZXRBbmNob3JGcm9tQ29sbGVjdGlvbkl0ZW0oZSk7aWYoZ0QoZSkpe2NvbnN0IG49ZTtmb3IoY29uc3QgciBvZiBuLml0ZW1zPz9bXSl7aWYoci52YWx1ZSE9PXQuc3JjVG9rZW4pY29udGludWU7Y29uc3Qgcz10aGlzLmdldEFuY2hvckZyb21Db2xsZWN0aW9uSXRlbShyKTtpZihzKXJldHVybiBzfX19Z2V0QW5jaG9yRnJvbUNvbGxlY3Rpb25JdGVtKGUpe2Zvcihjb25zdCB0IG9mIGUuc3RhcnQpaWYodC50eXBlPT09ImFuY2hvciIpcmV0dXJuIHQ7aWYoZS5zZXAmJkFycmF5LmlzQXJyYXkoZS5zZXApKXtmb3IoY29uc3QgdCBvZiBlLnNlcClpZih0LnR5cGU9PT0iYW5jaG9yIilyZXR1cm4gdH19Z2V0TmFtZVJhbmdlKGUsdCl7Y29uc3Qgbj10Lm9mZnNldCsxLHI9dC5vZmZzZXQrdC5zb3VyY2UubGVuZ3RoO3JldHVybiBZLmNyZWF0ZShlLnBvc2l0aW9uQXQobiksZS5wb3NpdGlvbkF0KHIpKX1pc09mZnNldEluc2lkZVRva2VuKGUsdCl7cmV0dXJuIHQ+PWUub2Zmc2V0JiZ0PD1lLm9mZnNldCtlLnNvdXJjZS5sZW5ndGh9ZmluZEludmFsaWRBbmNob3JDaGFyKGUpe2NvbnN0IHQ9WyJbIiwiXSIsInsiLCJ9IiwiLCIsIiAiLCIJIl07Zm9yKGNvbnN0IG4gb2YgdClpZihlLmluY2x1ZGVzKG4pKXJldHVybiBuPT09IiAiPyJzcGFjZSI6bj09PSIJIj8idGFiIjpuO3JldHVybiBudWxsfX0sWG07KGZ1bmN0aW9uKGUpe2VbZS5TY2hlbWFTdG9yZT0xXT0iU2NoZW1hU3RvcmUiLGVbZS5TY2hlbWFBc3NvY2lhdGlvbj0yXT0iU2NoZW1hQXNzb2NpYXRpb24iLGVbZS5TZXR0aW5ncz0zXT0iU2V0dGluZ3MifSkoWG18fChYbT17fSkpO2Z1bmN0aW9uIFNqKGUpe2NvbnN0IHQ9bmV3IFZSKGUuc2NoZW1hUmVxdWVzdFNlcnZpY2UsZS53b3Jrc3BhY2VDb250ZXh0LG51bGwsZS55YW1sU2V0dGluZ3MpLG49bmV3IEVqKHQsZS5jbGllbnRDYXBhYmlsaXRpZXMsb24sZS50ZWxlbWV0cnkpLHI9bmV3IEdSKHQsZS50ZWxlbWV0cnkpLHM9bmV3IHpSKHQsZS50ZWxlbWV0cnkpLGk9bmV3IGFqKHQsZS50ZWxlbWV0cnkpLG89bmV3IHVqLGE9bmV3IGhqKGUuY2xpZW50Q2FwYWJpbGl0aWVzKSx1PW5ldyBtaih0LGUudGVsZW1ldHJ5KSxsPW5ldyBsaihlLnRlbGVtZXRyeSksZj1uZXcgdmooZS50ZWxlbWV0cnkpLGM9bmV3IENqKGUudGVsZW1ldHJ5KTtyZXR1cm57Y29uZmlndXJlOnA9Pnt2YXIgaCxkO3QuY2xlYXJFeHRlcm5hbFNjaGVtYXMoKSxwLnNjaGVtYXMmJih0LnNjaGVtYVByaW9yaXR5TWFwcGluZz1uZXcgTWFwLHAuc2NoZW1hcy5mb3JFYWNoKG09Pntjb25zdCBnPW0ucHJpb3JpdHk/bS5wcmlvcml0eTowO3QuYWRkU2NoZW1hUHJpb3JpdHkobS51cmksZyksdC5yZWdpc3RlckV4dGVybmFsU2NoZW1hKG0udXJpLG0uZmlsZU1hdGNoLG0uc2NoZW1hLG0ubmFtZSxtLmRlc2NyaXB0aW9uLG0udmVyc2lvbnMpfSkpLGkuY29uZmlndXJlKHApLHIuY29uZmlndXJlKHApLG4uY29uZmlndXJlKHAsZS55YW1sU2V0dGluZ3MpLG8uY29uZmlndXJlKHApLGEuY29uZmlndXJlKHAsKChkPShoPWU9PW51bGw/dm9pZCAwOmUueWFtbFNldHRpbmdzKT09bnVsbD92b2lkIDA6aC55YW1sRm9ybWF0dGVyU2V0dGluZ3MpPT1udWxsP3ZvaWQgMDpkLnByaW50V2lkdGgpfHw4MCl9LHJlZ2lzdGVyQ3VzdG9tU2NoZW1hUHJvdmlkZXI6cD0+e3QucmVnaXN0ZXJDdXN0b21TY2hlbWFQcm92aWRlcihwKX0sZmluZExpbmtzOmwuZmluZExpbmtzLmJpbmQobCksZG9Db21wbGV0ZTpuLmRvQ29tcGxldGUuYmluZChuKSxkb1ZhbGlkYXRpb246aS5kb1ZhbGlkYXRpb24uYmluZChpKSxkb0hvdmVyOnIuZG9Ib3Zlci5iaW5kKHIpLGZpbmREb2N1bWVudFN5bWJvbHM6cy5maW5kRG9jdW1lbnRTeW1ib2xzLmJpbmQocyksZmluZERvY3VtZW50U3ltYm9sczI6cy5maW5kSGllcmFyY2hpY2FsRG9jdW1lbnRTeW1ib2xzLmJpbmQocyksZG9EZWZpbml0aW9uOmYuZ2V0RGVmaW5pdGlvbi5iaW5kKGYpLHJlc2V0U2NoZW1hOnA9PnQub25SZXNvdXJjZUNoYW5nZShwKSxkb0Zvcm1hdDpvLmZvcm1hdC5iaW5kKG8pLGRvRG9jdW1lbnRPblR5cGVGb3JtYXR0aW5nOmRqLGFkZFNjaGVtYToocCxoKT0+dC5zYXZlU2NoZW1hKHAsaCksZGVsZXRlU2NoZW1hOnA9PnQuZGVsZXRlU2NoZW1hKHApLG1vZGlmeVNjaGVtYUNvbnRlbnQ6cD0+dC5hZGRDb250ZW50KHApLGRlbGV0ZVNjaGVtYUNvbnRlbnQ6cD0+dC5kZWxldGVDb250ZW50KHApLGRlbGV0ZVNjaGVtYXNXaG9sZTpwPT50LmRlbGV0ZVNjaGVtYXMocCksZ2V0Rm9sZGluZ1JhbmdlczpjaixnZXRTZWxlY3Rpb25SYW5nZXM6RmosZ2V0Q29kZUFjdGlvbjoocCxoKT0+YS5nZXRDb2RlQWN0aW9uKHAsaCksZ2V0Q29kZUxlbnM6cD0+dS5nZXRDb2RlTGVucyhwKSxyZXNvbHZlQ29kZUxlbnM6cD0+dS5yZXNvbHZlQ29kZUxlbnMocCkscHJlcGFyZVJlbmFtZToocCxoKT0+Yy5wcmVwYXJlUmVuYW1lKHAsaCksZG9SZW5hbWU6KHAsaCk9PmMuZG9SZW5hbWUocCxoKX19YXN5bmMgZnVuY3Rpb24geGooZSl7Y29uc3QgdD1hd2FpdCBmZXRjaChlKTtpZih0Lm9rKXJldHVybiB0LnRleHQoKTt0aHJvdyBuZXcgRXJyb3IoYFNjaGVtYSByZXF1ZXN0IGZhaWxlZCBmb3IgJHtlfWApfXZhciBraj17c2VuZCgpe30sc2VuZEVycm9yKGUsdCl7Y29uc29sZS5lcnJvcigibW9uYWNvLXlhbWwiLGUsdCl9LHNlbmRUcmFjaygpe319O3I5KChlLHtlbmFibGVTY2hlbWFSZXF1ZXN0OnQsZm9ybWF0Om4sLi4ucn0pPT57Y29uc3Qgcz1Taih7c2NoZW1hUmVxdWVzdFNlcnZpY2U6dD94ajpudWxsLHRlbGVtZXRyeTpraix3b3Jrc3BhY2VDb250ZXh0OntyZXNvbHZlUmVsYXRpdmVQYXRoKG8sYSl7cmV0dXJuIFN0cmluZyhuZXcgVVJMKG8sYSkpfX0sY2xpZW50Q2FwYWJpbGl0aWVzOnt0ZXh0RG9jdW1lbnQ6e2NvbXBsZXRpb246e2NvbXBsZXRpb25JdGVtOntjb21taXRDaGFyYWN0ZXJzU3VwcG9ydDohMCxkb2N1bWVudGF0aW9uRm9ybWF0OlsibWFya2Rvd24iLCJwbGFpbnRleHQiXSxsYWJlbERldGFpbHNTdXBwb3J0OiEwfX19fX0pLGk9bz0+KGEsLi4udSk9Pntjb25zdCBsPWUuZ2V0TWlycm9yTW9kZWxzKCk7Zm9yKGNvbnN0IGYgb2YgbClpZihTdHJpbmcoZi51cmkpPT09YSlyZXR1cm4gbyhzcC5jcmVhdGUoYSwieWFtbCIsZi52ZXJzaW9uLGYuZ2V0VmFsdWUoKSksLi4udSl9O3JldHVybiBzLmNvbmZpZ3VyZSh7Li4ucixmb3JtYXQ6ISEobiE9bnVsbCYmbi5lbmFibGUpfSkse2RvVmFsaWRhdGlvbjppKG89PnMuZG9WYWxpZGF0aW9uKG8sISFyLmlzS3ViZXJuZXRlcykpLGRvQ29tcGxldGU6aSgobyxhKT0+cy5kb0NvbXBsZXRlKG8sYSwhIXIuaXNLdWJlcm5ldGVzKSksZG9EZWZpbml0aW9uOmkoKG8sYSk9PnMuZG9EZWZpbml0aW9uKG8se3Bvc2l0aW9uOmEsdGV4dERvY3VtZW50Om99KSksZG9Eb2N1bWVudE9uVHlwZUZvcm1hdHRpbmc6aSgobyxhLHUsbCk9PnMuZG9Eb2N1bWVudE9uVHlwZUZvcm1hdHRpbmcobyx7Y2g6dSxvcHRpb25zOmwscG9zaXRpb246YSx0ZXh0RG9jdW1lbnQ6b30pKSxkb0hvdmVyOmkocy5kb0hvdmVyKSxkb1JlbmFtZTppKChvLGEsdSk9PnMuZG9SZW5hbWUobyx7bmV3TmFtZTp1LHBvc2l0aW9uOmEsdGV4dERvY3VtZW50Om99KSksZm9ybWF0Omkobz0+cy5kb0Zvcm1hdChvLG4pKSxyZXNldFNjaGVtYTpzLnJlc2V0U2NoZW1hLGZpbmREb2N1bWVudFN5bWJvbHM6aShzLmZpbmREb2N1bWVudFN5bWJvbHMyKSxmaW5kTGlua3M6aShzLmZpbmRMaW5rcyksZ2V0Q29kZUFjdGlvbjppKChvLGEsdSk9PnMuZ2V0Q29kZUFjdGlvbihvLHtyYW5nZTphLHRleHREb2N1bWVudDpvLGNvbnRleHQ6dX0pKSxnZXRDb2RlTGVuczppKHMuZ2V0Q29kZUxlbnMpLGdldEZvbGRpbmdSYW5nZXM6aShvPT5zLmdldEZvbGRpbmdSYW5nZXMobyx7bGluZUZvbGRpbmdPbmx5OiEwfSkpLGdldFNlbGVjdGlvblJhbmdlczppKHMuZ2V0U2VsZWN0aW9uUmFuZ2VzKSxwcmVwYXJlUmVuYW1lOmkoKG8sYSk9PnMucHJlcGFyZVJlbmFtZShvLHtwb3NpdGlvbjphLHRleHREb2N1bWVudDpvfSkpfX0pfSkoKTsK", NNe = (s) => Uint8Array.from(atob(s), (e) => e.charCodeAt(0)), MU = typeof self < "u" && self.Blob && new Blob([NNe(a6)], { type: "text/javascript;charset=utf-8" }); +function wNe(s) { let e; try { - if (e = qB && (self.URL || self.webkitURL).createObjectURL(qB), !e) throw ""; + if (e = MU && (self.URL || self.webkitURL).createObjectURL(MU), !e) throw ""; const t = new Worker(e, { name: s == null ? void 0 : s.name }); @@ -108845,7 +109778,7 @@ function QNe(s) { }), t; } catch { return new Worker( - "data:text/javascript;base64," + y8, + "data:text/javascript;base64," + a6, { name: s == null ? void 0 : s.name } @@ -108854,47 +109787,111 @@ function QNe(s) { e && (self.URL || self.webkitURL).revokeObjectURL(e); } } -const jNe = "data:font/ttf;base64,AAEAAAALAIAAAwAwR1NVQiCLJXoAAAE4AAAAVE9TLzI3T0tHAAABjAAAAGBjbWFwQ5s/ewAACSQAABreZ2x5ZvJtKHkAACekAAD3FGhlYWRYl6BTAAAA4AAAADZoaGVhAlsC+QAAALwAAAAkaG10eBxB//oAAAHsAAAHOGxvY2EFi8dWAAAkBAAAA55tYXhwAu8BgQAAARgAAAAgbmFtZZP3uUsAAR64AAAB+HBvc3RjGEbCAAEgsAAAGSQAAQAAASwAAAAAASz////+AS4AAQAAAAAAAAAAAAAAAAAAAc4AAQAAAAEAAFT7+XFfDzz1AAsBLAAAAAB8JbCAAAAAAHwlsID////9AS4BLQAAAAgAAgAAAAAAAAABAAABzgF1ABcAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKADAAPgACREZMVAAObGF0bgAaAAQAAAAAAAAAAQAAAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAQBKwGQAAUAAADLANIAAAAqAMsA0gAAAJAADgBNAAACAAUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBmRWQAwOpg8QEBLAAAABsBRwADAAAAAQAAAAAAAAAAAAAAAAACAAAAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEs//8BLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLP//ASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEs//8BLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASz//wEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASz//wEsAAABLAAAASwAAAEs//8BLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAAAAABQAAAAMAAAAsAAAABAAABSYAAQAAAAAEIAADAAEAAAAsAAMACgAABSYABAP0AAAAEgAQAAMAAuqI6ozqx+rJ6wnrTuw08QH//wAA6mDqiuqP6snqzOsL61DxAf//AAAAAAAAAAAAAAAAAAAAAAABABIAYgBmANYA1gFQAdYDngAAAAMA8QFKAUcAtAE3AZUBJQFuAQ4BdABOAcMBYAFqAWkAkQA2ATAAhgDPAP4AQQGTAHkAFwG+AJsAiAFDAR0BFAEVAagAyQCmALwBoAGAAIsBkQF5AYgBhgF6AYkBkAGLAYQAvgF/AY0AAgAEAAUACgALAAwADQAOAA8AEAASABsAHQAeAB8AXABdAF4AXwBiAGMAIgAjACQAJQAmACkAKwAsAC0ALgAvADAAMgAzADQANQA8ADkAPQA+AD8AQABCAEMARgBIAEkASwBVAFYAVwBYAGcAaQBrAG4AcgB0AHUAdgB3AHgAegB7AHwAfQB+AH8AgQCCAIQAhQCHAIkAjACPAJAAkwCUAJUAlgCXAJgAmQCaAJwAngCfAKAAoQCiAKMApQCoAKkAqgCUAKsArACuALgAuQC9AMAAxADFAMgAygDLAMwAzQDTANQA1QDWANcA2ADZANoA7wDyAPMA9gD5APoA+wD8AQABAQEGAQcBCAENAQ8BEAERARMBFwEYARsBHAEfASABKAEsAS0BLgEvATEBMgEzATQBNQE2ATsBPAE9AT4BPwFAAUEBQgFEAUYBSAFJAUsBTAFOAU8BUAFRAVIBWQFaAVsBXAFdAV8BZAFlAWYBaAFrAW0BcQFyAXMBdQF2AXsBfAF9AX4BgQGCAYMBhQGHAYoBjAGOAZcBmAGhAaIBpAGmAacBqQGqAasBrAGtAbEBswG0AbUBuAG5AboBvAG9AcQBxQHGAccByAHMAc0A9AD1APcA+ABgAGEAcAA6AHEAZAGPAG8AcwBtAFsAJwAoAQkAjQCSAMYBsgABABgAZQDuAR4BVQGSASoAugFjAWIBIgF3ASsBOQBaAbsARAEKAI4AwQD/ARoBOgAqASkBIQA3ADgASgGUAbYBsAGuAa8AsAFTAVYBGQBsAckBywHKAZoBmwGcAZ0BngGfAZkAEQBTASQAnQHCAGoA0QDdANwA2wBRAFAATwAVANIArwCxAFkAaAFYAKQAZgAWAMIAwwEnACAAIQD9ABQBtwEWAO0A3gDfAOQA4gDjAOYA5wDpAOsA7ADhAOABlgDOATgAigAGAAcACAAJAOoA5QDoABwAxwEFAQIAOwAaABkATQCyALMBXgBMAWEBcADQAQwBowGlAEcBbACnAb8AMQEmARIBCwFFAFIA8AFNAW8AgwCAAXgBZwC3ALUAtgHBAcAARQFXAVQAVAC7AQQBAwC/ASMAEwCtAAABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAABW4AAAAAAAAAc4AAOpgAADqYAAAAAMAAOphAADqYQAAAPEAAOpiAADqYgAAAUoAAOpjAADqYwAAAUcAAOpkAADqZAAAALQAAOplAADqZQAAATcAAOpmAADqZgAAAZUAAOpnAADqZwAAASUAAOpoAADqaAAAAW4AAOppAADqaQAAAQ4AAOpqAADqagAAAXQAAOprAADqawAAAE4AAOpsAADqbAAAAcMAAOptAADqbQAAAWAAAOpuAADqbgAAAWoAAOpvAADqbwAAAWkAAOpwAADqcAAAAJEAAOpxAADqcQAAADYAAOpyAADqcgAAATAAAOpzAADqcwAAAIYAAOp0AADqdAAAAM8AAOp1AADqdQAAAP4AAOp2AADqdgAAAEEAAOp3AADqdwAAAZMAAOp4AADqeAAAAHkAAOp5AADqeQAAABcAAOp6AADqegAAAb4AAOp7AADqewAAAJsAAOp8AADqfAAAAIgAAOp9AADqfQAAAUMAAOp+AADqfgAAAR0AAOp/AADqfwAAARQAAOqAAADqgAAAARUAAOqBAADqgQAAAagAAOqCAADqggAAAMkAAOqDAADqgwAAAKYAAOqEAADqhAAAALwAAOqFAADqhQAAAaAAAOqGAADqhgAAAYAAAOqHAADqhwAAAIsAAOqIAADqiAAAAZEAAOqKAADqigAAAXkAAOqLAADqiwAAAYgAAOqMAADqjAAAAYYAAOqPAADqjwAAAXoAAOqQAADqkAAAAYkAAOqRAADqkQAAAZAAAOqSAADqkgAAAYsAAOqTAADqkwAAAYQAAOqUAADqlAAAAL4AAOqVAADqlQAAAX8AAOqWAADqlgAAAY0AAOqXAADqlwAAAAIAAOqYAADqmAAAAAQAAOqZAADqmQAAAAUAAOqaAADqmgAAAAoAAOqbAADqmwAAAAsAAOqcAADqnAAAAAwAAOqdAADqnQAAAA0AAOqeAADqngAAAA4AAOqfAADqnwAAAA8AAOqgAADqoAAAABAAAOqhAADqoQAAABIAAOqiAADqogAAABsAAOqjAADqowAAAB0AAOqkAADqpAAAAB4AAOqlAADqpQAAAB8AAOqmAADqpgAAAFwAAOqnAADqpwAAAF0AAOqoAADqqAAAAF4AAOqpAADqqQAAAF8AAOqqAADqqgAAAGIAAOqrAADqqwAAAGMAAOqsAADqrAAAACIAAOqtAADqrQAAACMAAOquAADqrgAAACQAAOqvAADqrwAAACUAAOqwAADqsAAAACYAAOqxAADqsQAAACkAAOqyAADqsgAAACsAAOqzAADqswAAACwAAOq0AADqtAAAAC0AAOq1AADqtQAAAC4AAOq2AADqtgAAAC8AAOq3AADqtwAAADAAAOq4AADquAAAADIAAOq5AADquQAAADMAAOq6AADqugAAADQAAOq7AADquwAAADUAAOq8AADqvAAAADwAAOq9AADqvQAAADkAAOq+AADqvgAAAD0AAOq/AADqvwAAAD4AAOrAAADqwAAAAD8AAOrBAADqwQAAAEAAAOrCAADqwgAAAEIAAOrDAADqwwAAAEMAAOrEAADqxAAAAEYAAOrFAADqxQAAAEgAAOrGAADqxgAAAEkAAOrHAADqxwAAAEsAAOrJAADqyQAAAFUAAOrMAADqzAAAAFYAAOrNAADqzQAAAFcAAOrOAADqzgAAAFgAAOrPAADqzwAAAGcAAOrQAADq0AAAAGkAAOrRAADq0QAAAGsAAOrSAADq0gAAAG4AAOrTAADq0wAAAHIAAOrUAADq1AAAAHQAAOrVAADq1QAAAHUAAOrWAADq1gAAAHYAAOrXAADq1wAAAHcAAOrYAADq2AAAAHgAAOrZAADq2QAAAHoAAOraAADq2gAAAHsAAOrbAADq2wAAAHwAAOrcAADq3AAAAH0AAOrdAADq3QAAAH4AAOreAADq3gAAAH8AAOrfAADq3wAAAIEAAOrgAADq4AAAAIIAAOrhAADq4QAAAIQAAOriAADq4gAAAIUAAOrjAADq4wAAAIcAAOrkAADq5AAAAIkAAOrlAADq5QAAAIwAAOrmAADq5gAAAI8AAOrnAADq5wAAAJAAAOroAADq6AAAAJMAAOrpAADq6QAAAJQAAOrqAADq6gAAAJUAAOrrAADq6wAAAJYAAOrsAADq7AAAAJcAAOrtAADq7QAAAJgAAOruAADq7gAAAJkAAOrvAADq7wAAAJoAAOrwAADq8AAAAJwAAOrxAADq8QAAAJ4AAOryAADq8gAAAJ8AAOrzAADq8wAAAKAAAOr0AADq9AAAAKEAAOr1AADq9QAAAKIAAOr2AADq9gAAAKMAAOr3AADq9wAAAKUAAOr4AADq+AAAAKgAAOr5AADq+QAAAKkAAOr6AADq+gAAAKoAAOr7AADq+wAAAJQAAOr8AADq/AAAAKsAAOr9AADq/QAAAKwAAOr+AADq/gAAAK4AAOr/AADq/wAAALgAAOsAAADrAAAAALkAAOsBAADrAQAAAL0AAOsCAADrAgAAAMAAAOsDAADrAwAAAMQAAOsEAADrBAAAAMUAAOsFAADrBQAAAMgAAOsGAADrBgAAAMoAAOsHAADrBwAAAMsAAOsIAADrCAAAAMwAAOsJAADrCQAAAM0AAOsLAADrCwAAANMAAOsMAADrDAAAANQAAOsNAADrDQAAANUAAOsOAADrDgAAANYAAOsPAADrDwAAANcAAOsQAADrEAAAANgAAOsRAADrEQAAANkAAOsSAADrEgAAANoAAOsTAADrEwAAAO8AAOsUAADrFAAAAPIAAOsVAADrFQAAAPMAAOsWAADrFgAAAPYAAOsXAADrFwAAAPkAAOsYAADrGAAAAPoAAOsZAADrGQAAAPsAAOsaAADrGgAAAPwAAOsbAADrGwAAAQAAAOscAADrHAAAAQEAAOsdAADrHQAAAQYAAOseAADrHgAAAQcAAOsfAADrHwAAAQgAAOsgAADrIAAAAQ0AAOshAADrIQAAAQ8AAOsiAADrIgAAARAAAOsjAADrIwAAAREAAOskAADrJAAAARMAAOslAADrJQAAARcAAOsmAADrJgAAARgAAOsnAADrJwAAARsAAOsoAADrKAAAARwAAOspAADrKQAAAR8AAOsqAADrKgAAASAAAOsrAADrKwAAASgAAOssAADrLAAAASwAAOstAADrLQAAAS0AAOsuAADrLgAAAS4AAOsvAADrLwAAAS8AAOswAADrMAAAATEAAOsxAADrMQAAATIAAOsyAADrMgAAATMAAOszAADrMwAAATQAAOs0AADrNAAAATUAAOs1AADrNQAAATYAAOs2AADrNgAAATsAAOs3AADrNwAAATwAAOs4AADrOAAAAT0AAOs5AADrOQAAAT4AAOs6AADrOgAAAT8AAOs7AADrOwAAAUAAAOs8AADrPAAAAUEAAOs9AADrPQAAAUIAAOs+AADrPgAAAUQAAOs/AADrPwAAAUYAAOtAAADrQAAAAUgAAOtBAADrQQAAAUkAAOtCAADrQgAAAUsAAOtDAADrQwAAAUwAAOtEAADrRAAAAU4AAOtFAADrRQAAAU8AAOtGAADrRgAAAVAAAOtHAADrRwAAAVEAAOtIAADrSAAAAVIAAOtJAADrSQAAAVkAAOtKAADrSgAAAVoAAOtLAADrSwAAAVsAAOtMAADrTAAAAVwAAOtNAADrTQAAAV0AAOtOAADrTgAAAV8AAOtQAADrUAAAAWQAAOtRAADrUQAAAWUAAOtSAADrUgAAAWYAAOtTAADrUwAAAWgAAOtUAADrVAAAAWsAAOtVAADrVQAAAW0AAOtWAADrVgAAAXEAAOtXAADrVwAAAXIAAOtYAADrWAAAAXMAAOtZAADrWQAAAXUAAOtaAADrWgAAAXYAAOtbAADrWwAAAXsAAOtcAADrXAAAAXwAAOtdAADrXQAAAX0AAOteAADrXgAAAX4AAOtfAADrXwAAAYEAAOtgAADrYAAAAYIAAOthAADrYQAAAYMAAOtiAADrYgAAAYUAAOtjAADrYwAAAYcAAOtkAADrZAAAAYoAAOtlAADrZQAAAYwAAOtmAADrZgAAAY4AAOtnAADrZwAAAZcAAOtoAADraAAAAZgAAOtpAADraQAAAaEAAOtqAADragAAAaIAAOtrAADrawAAAaQAAOtsAADrbAAAAaYAAOttAADrbQAAAacAAOtuAADrbgAAAakAAOtvAADrbwAAAaoAAOtwAADrcAAAAasAAOtxAADrcQAAAawAAOtyAADrcgAAAa0AAOtzAADrcwAAAbEAAOt0AADrdAAAAbMAAOt1AADrdQAAAbQAAOt2AADrdgAAAbUAAOt3AADrdwAAAbgAAOt4AADreAAAAbkAAOt5AADreQAAAboAAOt6AADregAAAbwAAOt7AADrewAAAb0AAOt8AADrfAAAAcQAAOt9AADrfQAAAcUAAOt+AADrfgAAAcYAAOt/AADrfwAAAccAAOuAAADrgAAAAcgAAOuBAADrgQAAAcwAAOuCAADrggAAAc0AAOuDAADrgwAAAPQAAOuEAADrhAAAAPUAAOuFAADrhQAAAPcAAOuGAADrhgAAAPgAAOuHAADrhwAAAGAAAOuIAADriAAAAGEAAOuJAADriQAAAHAAAOuKAADrigAAADoAAOuLAADriwAAAHEAAOuMAADrjAAAAGQAAOuNAADrjQAAAY8AAOuOAADrjgAAAG8AAOuPAADrjwAAAHMAAOuQAADrkAAAAG0AAOuRAADrkQAAAFsAAOuSAADrkgAAACcAAOuTAADrkwAAACgAAOuUAADrlAAAAQkAAOuVAADrlQAAAI0AAOuWAADrlgAAAJIAAOuXAADrlwAAAMYAAOuYAADrmAAAAbIAAOuZAADrmQAAAAEAAOuaAADrmgAAABgAAOubAADrmwAAAGUAAOucAADrnAAAAO4AAOudAADrnQAAAR4AAOueAADrngAAAVUAAOufAADrnwAAAZIAAOugAADroAAAASoAAOuhAADroQAAALoAAOuiAADrogAAAWMAAOujAADrowAAAWIAAOukAADrpAAAASIAAOulAADrpQAAAXcAAOumAADrpgAAASsAAOunAADrpwAAATkAAOuoAADrqAAAAFoAAOupAADrqQAAAbsAAOuqAADrqgAAAEQAAOurAADrqwAAAQoAAOusAADrrAAAAI4AAOutAADrrQAAAMEAAOuuAADrrgAAAP8AAOuvAADrrwAAARoAAOuwAADrsAAAAToAAOuxAADrsQAAACoAAOuyAADrsgAAASkAAOuzAADrswAAASEAAOu0AADrtAAAADcAAOu1AADrtQAAADgAAOu2AADrtgAAAEoAAOu3AADrtwAAAZQAAOu4AADruAAAAbYAAOu5AADruQAAAbAAAOu6AADrugAAAa4AAOu7AADruwAAAa8AAOu8AADrvAAAALAAAOu9AADrvQAAAVMAAOu+AADrvgAAAVYAAOu/AADrvwAAARkAAOvAAADrwAAAAGwAAOvBAADrwQAAAckAAOvCAADrwgAAAcsAAOvDAADrwwAAAcoAAOvEAADrxAAAAZoAAOvFAADrxQAAAZsAAOvGAADrxgAAAZwAAOvHAADrxwAAAZ0AAOvIAADryAAAAZ4AAOvJAADryQAAAZ8AAOvKAADrygAAAZkAAOvLAADrywAAABEAAOvMAADrzAAAAFMAAOvNAADrzQAAASQAAOvOAADrzgAAAJ0AAOvPAADrzwAAAcIAAOvQAADr0AAAAGoAAOvRAADr0QAAANEAAOvSAADr0gAAAN0AAOvTAADr0wAAANwAAOvUAADr1AAAANsAAOvVAADr1QAAAFEAAOvWAADr1gAAAFAAAOvXAADr1wAAAE8AAOvYAADr2AAAABUAAOvZAADr2QAAANIAAOvaAADr2gAAAK8AAOvbAADr2wAAALEAAOvcAADr3AAAAFkAAOvdAADr3QAAAGgAAOveAADr3gAAAVgAAOvfAADr3wAAAKQAAOvgAADr4AAAAGYAAOvhAADr4QAAABYAAOviAADr4gAAAMIAAOvjAADr4wAAAMMAAOvkAADr5AAAAScAAOvlAADr5QAAACAAAOvmAADr5gAAACEAAOvnAADr5wAAAP0AAOvoAADr6AAAABQAAOvpAADr6QAAAbcAAOvqAADr6gAAARYAAOvrAADr6wAAAO0AAOvsAADr7AAAAN4AAOvtAADr7QAAAN8AAOvuAADr7gAAAOQAAOvvAADr7wAAAOIAAOvwAADr8AAAAOMAAOvxAADr8QAAAOYAAOvyAADr8gAAAOcAAOvzAADr8wAAAOkAAOv0AADr9AAAAOsAAOv1AADr9QAAAOwAAOv2AADr9gAAAOEAAOv3AADr9wAAAOAAAOv4AADr+AAAAZYAAOv5AADr+QAAAM4AAOv6AADr+gAAATgAAOv7AADr+wAAAIoAAOv8AADr/AAAAAYAAOv9AADr/QAAAAcAAOv+AADr/gAAAAgAAOv/AADr/wAAAAkAAOwAAADsAAAAAOoAAOwBAADsAQAAAOUAAOwCAADsAgAAAOgAAOwDAADsAwAAABwAAOwEAADsBAAAAMcAAOwFAADsBQAAAQUAAOwGAADsBgAAAQIAAOwHAADsBwAAADsAAOwIAADsCAAAABoAAOwJAADsCQAAABkAAOwKAADsCgAAAE0AAOwLAADsCwAAALIAAOwMAADsDAAAALMAAOwNAADsDQAAAV4AAOwOAADsDgAAAEwAAOwPAADsDwAAAWEAAOwQAADsEAAAAXAAAOwRAADsEQAAANAAAOwSAADsEgAAAQwAAOwTAADsEwAAAaMAAOwUAADsFAAAAaUAAOwVAADsFQAAAEcAAOwWAADsFgAAAWwAAOwXAADsFwAAAKcAAOwYAADsGAAAAb8AAOwZAADsGQAAADEAAOwaAADsGgAAASYAAOwbAADsGwAAARIAAOwcAADsHAAAAQsAAOwdAADsHQAAAUUAAOweAADsHgAAAFIAAOwfAADsHwAAAPAAAOwgAADsIAAAAU0AAOwhAADsIQAAAW8AAOwiAADsIgAAAIMAAOwjAADsIwAAAIAAAOwkAADsJAAAAXgAAOwlAADsJQAAAWcAAOwmAADsJgAAALcAAOwnAADsJwAAALUAAOwoAADsKAAAALYAAOwpAADsKQAAAcEAAOwqAADsKgAAAcAAAOwrAADsKwAAAEUAAOwsAADsLAAAAVcAAOwtAADsLQAAAVQAAOwuAADsLgAAAFQAAOwvAADsLwAAALsAAOwwAADsMAAAAQQAAOwxAADsMQAAAQMAAOwyAADsMgAAAL8AAOwzAADsMwAAASMAAOw0AADsNAAAABMAAPEBAADxAQAAAK0AAAAAAAAAlADUAOgBFAEyAWwBpgHgAhoCLgJCAlYCagJ+ApICpgLIAt4DGgM4A4oD5AQQBGYEzAUcBWoFagWYBeoGBgamB1oHmggkCEIIqgkcCdQKiArOCvYLCAtQC2ILdAuGC5gL4Av6DAwMGAw2DGIMkAz0DSoNPg1mDY4N/A4uDnwOtg7QDyYPgA/IEAIQJhCyEN4RBBFiEZwR8BImEkoSuBMWE2AUFBQ4FI4UuBTEFTYVihX0FlQWthbsFxAXKBc4F0gXVBdoF3YXmhgYGDIYTBiaGQoZNhlIGYIZzBn8GhYaPhpaGnAaohrEGugbHBs0G7Qb5BwKHFgcdhycHLwc4B0aHTYdWB2IHbod5h4IHjAeXB6EHrwfFB+WH8gf4iAaIHgguiEeIXohsiIEImwitCL6IzojoCPCI/AkAiQeJKIkwCTcJPglRiWEJbgl5iZYJsonQieOJ7goOCheKOQpeCn0KnwqxisKK54r3iwULEosiC0qLaQtyC5iLuQvIi9sL4Avxi/qMBYwVjB8MNoxCjFsMagx1jIcMnwyrDLKMxgzTDNwM940NDRwNKA07jWmNdg2PjamNvo3PDdqN4I3mje4N+A4BDgmOEQ4YjiAOJg4tjjOOOw5BDkcOVY5kjnkOn46vjriO0Q7XDt4PA48JjxGPHg83Dz6PUw9eD2mPew+Ej4yPko+ZD6QPrw+4j8SP3I/jD/iQBhAZECOQMpBAkFCQXZBxkH4QiZCYEJ+QsJC6kNwQ6pEJERuRVJFikW8RiJGRkaURtRHNkeOR8pIEEhkSNxJMEmCSZhJyEoOSkZKXkqGSqZLBks6S8RMIkyETLZNBk0yTZhNyE3uTkZOYk5wTypPkE+0UC5QqlDwUWBRmFHQUihSVlKGUxZTcFPMVCZUTlRyVJZU7lUOVTJVhlXiVhxWXFaCVrZW8Fc6V5hXylfoWCRYsFkaWZRZ+lpaWtBbCFtCW5xcEFxWXMJdSl4QXi5eTF86X2xfgl+oX/JgOGBYYIpgzmFeYYBhumH6Yh5iSmJsYqJjOGNsY5hj3mSWZMBlQGV8ZeZmDmZIZr5m+mc+Z4BnvGgCaE5opmjKaRRprGoEbARtum3mbgpudm6ebspu4m8Qb2JvkG/icIBwunDKcNpw6nD6cVpxmnHaciRyanLacwRzUnPYdHR0pHT2dSh1ZHW6dfx2SHZodtp3Hndgd7p32ngYeER4nni8eYB58HqSewp7TnuKAAAABAAA//8BLAEsABEAIgA0AGQAACU0LgEiDgEVFBYfARYyPwE+AQciJzc+BDMyHgEXFhcGJyY0PgIyHgIUDgEHBicuARcwPQEuAScmJzY3Njc2JzYuAiIOAhUUHgEXFhcGBw4BBxUuATU0PgEyHgEVFAYBLChFUkUoHBkNJlwmDhgclikiAQMKDhAVCg8dFQYDAiJYBAgNEhYRDggIDgkTFAgOhwQRDAkLBQQHBQoBAQsUGh0aEwsGCAgEBQoJDBEFEhQjPEg8IxOWKUUoKEUpITwVChoaChU8YhgHChEOCgULFQ4ICRiLCRQSDQkIDhIVEQ4ECAgEDlsBAQ4YCQcFAwQHCBAUDhoUCgoUGg4KEw4IBAQEBwkYDwESMBokPCMjPCQaMAAAAAACAAAAAAEaARoAGgAoAAAlFg4BBzQnPgE3LgMOAQcmIz4CMzIeAgciDgEUHgEyPgE0LgEjARkBFCIWAxkiAQEQHSMeEwIJCgMYJRURHxgMshcnFhYnLicXFycXxRYlGAIKCQMlGhEeEgEPHBEDFSIUDBgfGhcnLicWFicuJxYAAAEAAAAAAQcBGgALAAAlFSMVIzUjNTM1MxUBB3ETcHATqRNwcBNwcAAEAAAAAAEaARoADQASABYAGgAAASMHFRczFRczNzUzNzUHIzUzFQc1MxUnIxUzARD0CQkKCc4KCQkc1+HPvCZwcAEZCTgKnwkJnwo4LyYmqZaWcRMAAAAAAQAAAAABEgDMAA8AADcXByc1NxcHMyc3FxUHJzc4KA04OA0ovCgNODgNKIMoDTgNOQ4oKA45DTgNKAAAAwAAAAABBwEHAAkAFgAjAAA3FzUzFTcXByMnNzQuASIOARQeATI+AScUDgEiLgE0PgEyHgFlKBMmDjgNOLAfMz4zHh4zPjMfExksMiwZGSwyLBmUKGxqJg03Nw8fMx8fMz4zHh4zHxksGRksMiwZGSwAAAADAAAAAAEHAQcACQAXACQAADcnMzUjNycHFRc3Mh4BFA4CLgI+ARcVIg4BFB4BMj4BNC4BlChsaiYNNzcPHzMfHzM+Mx4BHzMfGSwZGSwyLBkZLGUoEyYOOA04sB8zPjMeAR8zPjMfARIZLDIsGRksMiwZAAMAAAAAAQcBBwAJABYAIwAANxcjFTMHFzc1JwcGLgI+ATIeARQOAScyPgE0LgEiDgEUHgGYKGxqJg03Nw8fMx4BHzM+Mx8fMx8ZLBkZLDIsGRksxygTJg44DTivAR8zPjMfHzM+Mx4SGSwyLBkZLDIsGQAAAwAAAAABBwEHAAkAFgAjAAA/ARUzNRc3JyMHFxQOAi4CPgEyHgEHNC4BIg4BFB4BMj4BZSgTJg44DTiwHzM+Mx4BHzM+Mx8TGSwyLBkZLDIsGZgobGomDTc3Dx8zHgEfMz4zHx8zHxksGRksMiwZGSwAAAABAAAAAAEEAQcACQAANxczNycHNSMVJzteDV4NThNOg11dDk7ExE4AAQAAAAABBwDzAAkAADcHFRc3JzM1IzeDXV0OTsTETvJeDV4OTRNOAAEAAAAAAQcA8QAJAAA/ATUnBxcjFTMHqV5eDk7Dw04oXQ5dDU4STgABAAAAAADJAOEACQAANwcjJzcXNTMVN8kvDS8NHxMfii8vDR5oaB8AAQAAAAAA0QDPAAkAADcnNTcXBzMVIxd6Ly8NH2lpH2MvDS8NHxMeAAEAAAAAANEAzwAJAAA3FxUHJzcjNTMnoi8vDR5oaB7OLw0vDh4THwABAAAAAADJAOEACQAAPwEzFwcnFSM1B14vDS8NHxMfsi8vDR9paR8AAgAAAAABGgEbAAkAEwAANyc1NxcHMxUjFz8BNScHFyMVMwdPPDwNLOnpLIE8PA0s6eksEjwNPA0sEyx2PA08DSwTLAABAAAAAAEEAQcACQAAJScjBxc3FTM1FwEEXg1eDU4TTaleXg5Ow8NOAAAAAAEAAAAAARwBHAAlAAA/ATYyFhQPAQYiJjQ/ATY0JiIPAQYUFjI/AT4BLgIGDwEOARYyNm0RMCIRgggYEQh0AwUIA3QOHCgOgg4LCx0oKA9tAgEGCI9oECAuEHwIEBcIbwIIBQJvDSYbDXwOJiYcCgoOaAMIBQAAAAIAAAAAARoBGgAHAA8AACUVBycVJxc1FycVDwEVFzUBGUFmOqgBXlYaJeigNSUlSw2QATklGiFLEWEAAAMAAAAAASIBGgAbACcANgAAJScuAQcjIgYPAQYeAjsBMjY/ARcWOwEyPgIHIi8BMzcXHAEOASMzIzYvATMeARUXFg4CIwEgSwIKB1gGCgJMAgIFCQU3BQoCDDgFBlgECQUCawICbDkUKgIEAVdFAgJMRQIETAEBAgICLOEFCAEHBeEFCQgDBwYhKwMEBwkIAVA0fQEDAwEGB+EBAgLhAQMCAgAABAAAAAABGgEaAB0ALAA1AD0AADczJicjNzM0NyM3NTMVFzY3JzUzNSMVMxUHBh4CNzYzMh4CFRQOAS4CNhcWFzI3JwYVFDcXNjU0JiMiOF4LCEsdGwITJCYBCQkBE3ASSQIBBQhyEhcPHBULGSotIAkSFBEXEg9PChhOCyEYEhMICjkJCUhOTwMEAgFLExJLjgUJCQSJDQwVGw8XJhEJICwqWRABC04OEhhGTw8SFyEAAAAAAwAAAAABCgEaAA8AFgAaAAAlJzUzNSMVMxUHBhY7ATI2Jzc1MxUXIwc3MxcBBEgScBNKBAsKvAoLiAImJG4nHYIdLo1LExJLjgoREZAETk9HSzk5AAAAAAMAAAAAARoBGwAqADEAOgAANwYjFRQfASM3Nj0BND4CFzM2NyYnJg4CHQEUDwEXMxQWMjY1MzcnJjUHMjYnIxQWNzI2NCYiBhQW9AkKCAe1BwkNFx8PAwUHBgcUJh0QBwsIQhYfFkIJCwdeBwwBJQtTFyEhLiEhmAIEGhkUFRkZKRAeFQoCCQcCAQINGyQUKRYWIQ0PFhYPDSEWFm0LCAgLhCEuISEuIQAAAAAGAAAAAAEqASYAFQAnAC4AMwA4AEEAABMGByIHDgIdARQPATc2PQE0PgIfAQYHFh8BIwczFBYyNjUzNycmBwYiJjUzFjcmJzcXDwEXNyYXMjY0JiIGFBaiCgcJCg8XDQQcBgcQHSYUVQkKAgYHehIMFh8WQgkLBlIGDwslAXUGBwsNgpQNlQczFyEhLiEhARgICgMFFR4QKRERHRMWFikUJBsNApEDARMSFBMPFhYPDSERTAYLCAjdBwcKDWeVDZUGASEuISEuIQAAAAAEAAAAAAEqASYAFQAnAC4AMgAAEyYnJg4CHQEUBzc2PQE0PgIXFhcHMycmPQE3FRQfAQcjFAYiJicXMjYnIxQWBwEXAc8VGxQmHRAHGQENFx8PFBA9bAcIEwcLCUIWHxUBJgcMASULewEJDf73AQUQBAINGyQUKRYVGQkJKRAeFQoCAwysFBkaFhMpFhYhDQ8WFQ8SCwgICwkBCQ3+9wAAAwAAAAABBgEbABoAIQA0AAA3Jj0BNC4CJyYOAh0BFA8BFzMUFjI2NTM3BwYiJjUzFic3Nj0BND4CFxYXHgEdARQfAfsHDBgfEhQmHRAHCwhCFh8WQgljBg8LJQFuBwkNFx8PHhMJCggHZhUXJhIhGxECAg0bJBQpFxUhDQ8WFg8NGgYLCAgbFRgaKRAeFQoCBBYLGw4mGhkUAAAAAwAAAAAA4QD0AA4AFgAeAAA3NTMyFhUUBgceARUUBiMnFTMyNjU0IyczMjY0JisBXj8fIBANEBIiHioqEhQlKycQFBITJji8GhgNFQUEGBEZHVhEEhAiFBAdDgAJAAAAAAEaAQcAEAAXAB4AIgAmACoALgAyADYAAAEjDwEvASMHFRczFzM3Mzc1By8BIzUzHwEjDwE1NzMHIxUzFSMVMyczFSM3IxUzBzMVIxUzFSMBEGcHDAwHZwkJYxAOEGMJjAQGXVkOel4HAg1aljk5OTk5OTm8ODg4ODg4OAEHAwwMAwq7ChAQCru4AwOpDpsDAqENJhI5EjgTOBITExMSAAIAAAAAAPQBGgAIAA4AABMjBxUXNxc3NQcnIwc1M+qoChFNTRETRA5ElgEZCfQGVlYG9NtLS9IAAwAAAAABGgEHAEcAcQB9AAA3MSMiDgIdARQOAgceAx0BFB4COwEVIyIuAScxJic1Jjc1NCcxJic1JicxJisBNTMyPgE3MTY9ASY3MTY3MT4COwEXMzUjIicxJic1JicxJj0BNic1JicxLgIrARUzMh4CHQEUHgIXIxYHIg4BHgI+ATU0JnECBgoHBAIEBwUFBwQCBAcKBgICCRANAwMBAQECAgQDBQUGAQEGCgcCAgEBAQMDDRAJApQCAgYFBQMEAgIBAQEDAw0QCQEBBgoHBAIEBwUBDxcRHA0GGCIfEyH0BAgKBhkGDAsIBAQICwwGGQYKCAQSBg0ICAcBCAgQBgUFAwEDAgMSBQcFBQYQCAgICAgNB3oSAwIDAQMFBQYQCAgBBwgIDQcTBAgKBhkGDAsIBAIREx8iGAYNHBEXIQAEAAAAAAEaAQcARwBxAH4AigAANzEjIg4CHQEUDgIHHgMdARQeAjsBFSMiLgEnMSYnNSY3NTQnMSYnNSYnMSYrATUzMj4BNzE2PQEmNzE2NzE+AjsBFzM1IyInMSYnNSYnMSY9ATYnNSYnMS4CKwEVMzIeAh0BFB4CFyMWBzYzMhYVFA4BLgI2FwcnBxcHFzcXNyc3cQIGCgcEAgQHBQUHBAIEBwoGAgIJEA0DAwEBAQICBAMFBQYBAQYKBwICAQEBAwMNEAkClAICBgUFAwQCAgEBAQMDDRAJAQEGCgcEAgQHBQEPNg4RFyETHyIYBg1CFRUOFhYOFRUOFhb0BAgKBhkGDAsIBAQICwwGGQYKCAQSBg0ICAcBCAgQBgUFAwEDAgMSBQcFBQYQCAgICAgNB3oSAwIDAQMFBQYQCAgBBwgIDQcTBAgKBhkGDAsIBAIaCSEXERwNBhgiHwIWFg4VFQ4WFg4VFQAFAAAAAAEaAQcADQARABsAHwApAAAlIzUnIwcVIwcVFzM3NSczFSMXFQc1JyMHFSc1FxUjNQc1FxUXMzc1NxUBEEIJXglCCQn0CahLS5ZLCjgJS4MmXUsJOApL4RwKChwJlgoKlhwTEw4qCQoKCSsNOBMTS2ArBgkJBipfAAAAAAQAAAAAAQcBGgAiAD8AWwBkAAATNjMyHgEXDgEHNTE2PQE+AiYnLgEOAhYXFRQXFS4CNhcGIxUUBisBMCMxLgE9ASImPQE0NjsBMhYdARQHNxQHFh0BPgImJy4BDgIWFzU0NyY+Ah4BByMUBiImNDYyFlgcIh8zHgEBKSEJERcJBwoRNjkoCRoZCR4oCBtyAgQFBBQBBAQEBQsIEggLAxkJBgkLAQsJDSQjGgkLDQYJARQeHhMBHgsQCwsQCwEGEx40HiQ6DAEJCwMJICYnEBkVDCs6NQ4DDAgBCzFAOqcDLwQFAQQELwUEJggLCwgmBAJbDw0JCgIJGRwZCQ4KChokIw0CCwkNHxoJCxkQCAsLEAsLAAMAAAAAARoBGgAHAAsADwAAEzMXFQcjJzUXFTM1JzM1Ixz0CQn0CRPh4eHhARkJ4QkJ4UKWlhMmAAAAAAMAAAAAARgBGgAxADkASQAANzU0JiIGHQEjJwcXBwYdASMVOwEWHwEHFzcXHgEyNj8BFzcnNTY3MTM1IzU2LwE3JwcjNTQ2MhYdARcVFhUUDgIiLgI1NDc1zCAtIBAfCx4BCSYoAQQNASULIwIMHyIfDAEkCyUOBSknAQoBHgsfbRcgFx0JDRYbHRwWDAjYCxYgIBYLHwseARobDBAbFQElCyMBDhAPDgEkCyYBFhsQDBsaAR4LHwsQFxcQCxABFhkXJxwPDxwnFxkWAQAAAAARAAAAAAEaARoADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwBDAEcASwBPAAABIzUjFSM1IxUjBxUXMzc1ByM1MzUjNTMHIxUzBzMVIxcjFTM3MxUjFyMVMwczFSM3IxUzFzMVIxcjFTMHMxUjNyMVMxczFSMXIxUzJzMVIwEQHBOWExwJCfQJEuHh4eG8ExMTExMTExMmEhISEhISEhISEhImExMTExMTExMTExMlExMTExMTExMBBxISEhIK4QkJ4deoExNeExITExNeExITExOEExMTEhMTE4QTExMSE14TAAADAAAAAAEaARoAPQB5AIIAADcuAQ4BDwIGJi8BJicuAj8CPgI1NCcuAyMiDwEOAhUUHgYzMj4BPwE2NTQmLwEmLwEmBwYnIiYnJicuAzUmPgE/ATYzMh8BFh8BFhQPAQ4CFBYfARYzMjc2PwE+ATIfAhYfARYVFA8BDgE3BzMVIzUzFTfrBQsKBwMGBQMIAikLCwQGAQMEBwMGAwgFCwwNCAwIDgUJAwoRGBwgIiEQChENBg4IAwMHBAQPBA0HCA4eDh8aDRYQCQEEBgULAwQCBAcKBwYDAgsEBQQEBUUJDAUFCQYGAgYFBAcJBQMGAwQKBQovVz5eE1d9AgEFBQQGBAMBAycLDAUIBQMFBgMHCQYMCQUMCwgIDgYNEQoPIiEgHBkRCgQIBQ4IDAUKBAgEBA4EVAIBCQcSGg0cHh4PBw4JBQoEAwYICQcEBQMLAwcKCwoFRQkCBAcGAwQDBggEBQgDAgQDCwQH41cTXj5XAAMAAAAAARoBGgAIAEQAgAAAPwEjNTMVIzUHFzIfAx4BFRQPAQ4CIyIuBjU0PgE/ATYzMh4CFxYVFA4BDwIGFBYXFh8BHgE/Aj4CBzI+AT8BNic2LwEmLwImIgYPAQ4CIyIvAS4BND4CPwE2NC8EJiMiDwEOAgceAxcWFx4Bolc9XRJYMQwJDwgHAwMIDgUOEQoQIiEgHBgRCgMIBg4IDAcODQoFCAMGAwcEAgYECwspAggDBQYDCAkGCQwKBQoEAQEDBgMFCQcEBQYCBgMHCgUMCUUFBAQFBwMFAgMGCAkHBAIEAwsEBwMBAQkQFg0aHw4er1gSXT1XIwgOCAgECgUMCA4FCAQKEhgcICEhEAsQDQYOCAgLDQQJDAUJCAMGBQMFCAUMCycDAQMEBgQFBVoDBgULAwQCAwgFBAgGAwQDBgQFBAlFBAsMCQcGAwUDBQQHCQgGAwQKBAsNBw4fHhwNGhEICQAAAAQAAAAAAQIA4QAHAA8AJAAvAAA3IycjByM3MxcnJicjBg8BFyM1MQYjIiY1ND8BNCMiBzU2MzIVDwEOARUUFjMyNjWmEw89DxI3ERAWAQEBAQEXthELFQ8SIh8VEg8PFCQRGAwMCwkMEFEoKJBZPgMGBgM+NxATEA4dBQQaDBAKJg8EAQgLBwoRDQAABAAAAAABJQD0AAYACgAMABMAACUHIyc3FzcHNycPARcHFwcjJzcXASWSDjoONIuQUg1QEgopCw8OOg406a1TCkmkbWILXhYPFQ8RUwpJAAABAAAAAAEPAPoABgAAJQcvATcXNwEPnw8/DziX7rwBWQtPsgAIAAAAAAEaAQcABgAKAA4AEgAWAB0AJAArAAA3Iyc3FzcfATMVIxUzFSMXIxUzBzMVIyczNycHJwcXIyc3FzcXBzM3JwcnB0YNEw0NGg4blpaWlpaWlpaWlkoNIg4aDQ0gDRMNDRoOLw0iDhoNDdgUDQ0bDgUTJRMmEiYTaCENGg0OTBQNDRsNWiENGg0NAAABAAAAAADzAMEABgAAPwEXByMnN5ZRDFgLWAxvUgxXVwwAAAABAAAAAADBAPQABgAANxcHJzU3F29SDFdXDJZRDFgLWAwAAAABAAAAAADPAPMABgAANyc3FxUHJ71SDFdXDJZRDFgLWAwAAAABAAAAAAD0AM8ABgAANwcnNzMXB5ZRDFgLWAy9UgxXVwwAAAACAAAAAAEHARoANwA7AAATMxUzNTMVMzUzFTMXFTMVIxUzFSMVMxUjFQcjFSM1IxUjNSMVIzUjJzUjNTM1IzUzNSM1MzU3MwczNSNeExITExMSEyYmJiYmJhMSExMTEhMTEyUlJSUlJRMTE4ODARklJSUlJRMTEhMTExITEyUlJSUlJRMTEhMTExITE5aDAAABAAAAAAD9AP0ACwAANwcXNxc3JzcnBycHhVURVVURVVURVVURllURVVURVVURVVURAAAAAgAAAAAA9AD0AAMABwAANxUzNQcjNTM4vBOWlvS8vKmWAAAAAQAAAAABBwCWAAMAACUVIzUBB8+WExMAAwAAAAABBwD0AAMABwARAAA3FTM1ByM1MyczNTMVIxUzNSM4qRODg3ATgxMmqc6oqJaEEhODE6kAAAAAAQAAAAAA4gDiABkAADcyFx4BFxYUBw4BBwYiJy4BJyY0Njc2Nz4BlgoKExwFAwMFHBMKFAoTHAUDBQUKEQkT4QMFHBMKFAoTHAUDAwUcEwoUEwkRCgUFAAEAAAAAARoBGgAaAAATMhceARcWFAYHBgcOASIuBDQ2NzY3PgGWEhEhMQoECQkRHg8hJCEeGBEJCQkRHg8hARkECjEhESQhDx4RCQkJERgeISQhDx4RCQkAAAAAAgAAAAABGgEaACoARAAAEyYiBzEGBwYHMQ4BFhcWFx4CPgE3MTY3NjcxNiYnMSYnMSYnMSYnMSYnFwYHDgEiLgQ0Njc2Nz4BMhceARcWFAa0Dx4PDg0ZDwgIAQMIFQsZHR8cDRkPCAMFAQQDCAcLCgwNDlMRHg8hJCEeGBEJCQkRHg8hJBEhMQoECQECBQUDCA8ZDR0fDhwWCg8IAQcIDxkNDg8fDg4NDAoLBwgDrh4RCQkJERgeISQhDx4RCQkECjEhESQhAAADAAAAAAEaARoADAAWAB8AABMyHgEUDgEiLgE0PgEHFBYXNy4BDgEVMzQmJwceAT4BliQ8IyM8SDwjIzxMDQ2fGUI7JOIODZ8ZQjskARkjPEg8IyM8SDwjgxQlEJ8VCRw3IRQlEJ8VCRw3AAABAAAAAAC8ALwACAAANxQGLgE0NjIWvBYgFRUgFpYQFgEVIBYWAAAAAgAAAAAAvAC8AAoAFwAANw4BLgI+ATIWFBc2NTQmIyIOAR4CNqYECgsIAgQJDgsMBxYQCxMJBBEWFYwFBAIICwoHCw4PCgsQFg0VFhEECQADAAAAAADhAOIADAAVABYAADcyPgE0LgEiDgEUHgE3FAYiJjQ2MhYnlhQjFBQjKCMUFCNFHSgdHSgdMUsUIygjFBQjKCMUSxQdHSgdHSAAAAUAAAAAARoBGgAHADQAPQBGAE8AAAEjBxUXMzc1ByM1Mx4BMzI2NCYiBhUjFSM1MxUOARUUFjI2NTMUFjI2NCYjIgYHIy4BIzUzBzQ2MhYUBiImJzIWFAYiJjQ2MzIWFAYiJjQ2ARD0CQn0CRKpKwQSCg8WFh8WOCUlCAsWHxYmFh8WFhAKEQUwBREKqXEKEQsLEQo4CAsLEQoKeQkKChEKCgEZCfQJCfTqJQgLFh8WFg844SwEEgkQFhYQEBYWHxYKCQkKJqkICwsRCgp5ChEKChEKChEKChEKAAAFAAAAAAEaAPQACwAPABMAGAAcAAA3FzcXNyc3JwcnBxcnITUhFSE1IRc1IxUzFTUjFbwNHh4PICAPHh4NHscBBv76AQb++paWlpZADR4eDR4eDyAgDx6DE0sTQgkSORMTAAAABAAAAAABFgEaABYAIgAsADYAADcjNTMVMzUnIzUjNCYiBhUjFSMHFRczNT4CHgEUDgEuAhcHNSMVJwcXMzcnMxcHJxUjNQcngziWEwocEhYgFRQbCgpBAQkLCgcFCgsIBYYUExQOJQ0kfA0lDhQTFA0mqCUvCRMPFhYPEwm8CeUFCQIECgoKBQEGCqwUZGQUDSQkWyQNFGRkFA0ABAAAAAABBwEHAAsAGQAgACQAADcnBycHFwcXNxc3LwE3MxcVByMVByMnNTc7AhcVMzUjFyMVM6IOGhsNGxsNGxoOGykTgxMTJhKEEhImE0sSJoNLhISUDhsbDhobDRsbDRt6ExODEyYSEoQSEkuDOIQAAAABAAAAAADoAOgACwAANxc3JzcnBycHFwcXlkQORUUOREQORUUOiUUOREQORUUOREQOAAAAAgAAAAABGgD2AC8AOQAANzMeARQGIzUyNjQmJyMnLgIGDwEnJiciBw4BHgE7ARUjIiYnLgE+ATc2Fz4BHgEHFzUzFTcXByMn4AEXISEXDxUVDxECAhcfGwYGEAUFFA0KBgsYDgkJDhoJDAcLGxEODgkmKx9fGBMYDSgNKLwBIC8hExYeFgEQDxYFEA4OAwEBDgocGhATCwsNIyIXAwMEFBYGH3YYZmUXDSgoAAIAAAAAARoA9gAyADwAADczHgEUBisBNTMyNjQmJyMnLgIGDwEnJicGBw4BHgE7ARUjIiYnLgE3PgIXPgEeARcHJxUjNQcnNzMX4AEXISEXJSUPFRUPEQICFx8bBgYQBQUUDQoGCxgOLy8OGgkPBAsHFxwOCSYrHwMfGRIYDSgNKLwBIC8hExYeFgEQDxYFEA4OAwEBAQ0KHBoQEwsLECsSDBEFBBQWBh8WSBlmZRgOKCgAAAIAAAAAARoA9gAVAC4AADczHgEUBisBIiYnLgE+ATc2Fz4BHgEHMzI2NCYrAScuAgYPAScmJyIHDgEeATPgARchIReMDhoJDAcLGxEODgkmKx9/gxAWFhARAgIXHxsGBhAFBRQNCgYLGA68ASAvIQsLDSMiFwMDBBQWBh9zFh8WEA8WBRAODgMBAQ4KHBoQAAcAAAAAARoBGgADAAcACwAPABMAFwAnAAATMxUjNzMVIxczFSMVMxUjFTMVIwczFSMnBxUzNTMVIzUjFRczNzUnXhMTJUtLJktLS0tLSyZLS10TE+HhExPhEhIBB8+8ExMSExMTEhMTzhJeXs9xcRISzxIAAwAAAAABFAD0AAYADQARAAA3BxcHJzU3MwcXBxc3NQcXNydYMTENODiRDjIyDji4EV4RwzEyDTgNOQ4xMg04DWAIuwkAAAAABgAAAAABLAEaABUAKwBBAFMAXQBlAAATFRQWFzMWFxYdASM1NCYvASYnJj0BMxUGFhczFhcWHQEjNTQmJzUmJyY9ATMVFBYXMRYXFh0BIzU0Ji8BJicmPQEHNzMyFhQGKwEOASsBIi4BPQEXNSMVFBY7ATI2NxUzFjY0JiM4BwgBCgQIEwcIAQoECEwBBwgBCgQIEwYJCgUHSwYJCgUHEgcIAQoECHASxRQbGxQMBigaOBUiFbypIRc5FyETCQwQEAwBGQkGCAcIBQoMCgoGCAYBBwYKDAkJBggHCAUKDAoKBggGAQcGCgwJCQYIBwgFCgwKCgYIBgEHBgoMCXATHCcbGR8UIhQ5ODg4GCEhUDgBERcRAAAAAAQAAAAAAQcBBwADABEAGAAcAAA3IxUzJzczFxUHIxUHIyc1NzsCFxUzNSMXIxUzqV5eSxODExMmEoQSEiYTSxImg0uEhIMSgxMTgxMmEhKEEhJLgziEAAACAAAAAAEaARoADAAUAAATIg4BFB4BMj4BNC4BBzUyHgEUDgGWJDwjIzxIPCMjPCQfMx8fMwEZIzxIPCMjPEg8I/PhHzM+Mx4AAAAACgAAAAABLAEaAAcACwATABcAHwAjACsALwAzAD0AABMHFRczNzUnBzUzFQ8BFRczNzUnBzUzFQc3MxcVByMnNxUzNTcHFRczNzUnByM1MxUjNTMnIxUzBxc3NScHHAkJOAoKLiUvCQk4CgouJTgJOAoKOAkTJZ8JCTkJCQolJSUlbjo6Ew0iIg0BGQk4Cgo4CTgmJiUKOAkJOAo5JiYvCgo4CQkvJSWDCXEJCXEJOCZeJRMTEgwiDSINAAADAAAAAAEaARoAEgAeACcAAD8BFQcnNSMnNTczFxUjNSMVMx8CNzUzNzUnIwcVFzcjNTMVIwcVJ0sTFhAcCQnhChPOHAl2IxAcCQmWCQlLQoQdCRZYExsVBy8JlgkJVEuECUIiBhwKXQoKXQoTS0sJDxUAAAoAAAAAARoBBwAGAAoADgAUABgAIwAnAC0AMQA4AAABIxUzFTM1JzMVIyczFSMXHQEzNzUHNSMVJyMPATUnIxUXNzM3NSMVBzUjFRczPQEjFTcVIzU3MxUBEBwTEnAlJUslJakJCTglJgkHKAoJEDYFgxLhEwkKExMTCRwBBhITHAkSEhKEEhMJHCUTExMDKCEKQgc2SyUlOBIcCUslJV4THAkSAAAAAAIAAAAAARoBBwAXACMAABMzFxUmJzUjFTMXFT8BMwYVIwcnNSMnNRciDgEeAj4BNTQmHPQJCArhLgooBwsCBTYQLwnOERwNBhgiHxMhAQcKgAkGaJYKISgDCQo2By8JqXoTHyIYBg0cERchAAIAAAAAARoBBwALABQAAAEjBxUXMxUXNzM3NQcjDwE1JyM1MwEQ9AkJLxA2fwkSegcoCi7hAQcKqQkvBzYJqZ8DKCEKlgAAAAUAAP/9AS0BGgAsADIANgBDAEoAADcGIzUjFS4CJzM1Iz4CNxUzNR4CFyMVMwcWFzY1NC4BIg4BFB4BMzI3JjcvAR8BBi8CHwE2FzIWFRQOAS4CNhc3JwcnBxerBgYSGy4cAhISAh0tGxIbLhwCEhIBCQgDIzxIPCMjPCQODQQNNyZMGwYNEiQSRw8RFyETHyIYBw0uIg8cEAwYJwESEgIdLRsTGy0cAhISAhwuGxIMAgQNDiQ8IyM8SDwjAwhKG0wmNwQNJBIkJgoBIBgRHA0GGSEgPy0LJQ4PEwAEAAAAAAEsARoALAAyADYAPwAANwYjNSMVLgInMzUjPgI3FTM1HgIXIxUzBxYXNjU0LgEiDgEUHgEzMjcmNy8BHwEGLwIfARQWMjY0JiIGqwYGEhsuHAISEgIdLRsSGy4cAhISAQkIAyM8SDwjIzwkDg0EDTcmTBsGDRIkEi8gLyEhLyAnARISAh0tGxMbLRwCEhICHC4bEgwCBA0OJDwjIzxIPCMDCEobTCY3BA0kEiRVFyEhLyEhAAAAAAQAAAAAARoBGgADAAcAIwAwAAA3Fy8BFy8BFzMOAgc1IxUuAiczNSM+AjcVMzUeAhcjFQcyPgE0LgEiDgEUHgGpJkwmVBIkEnkCHC4bEhsuHAISEgIdLRsSGy4cAhJeJDwjIzxIPCMjPKlMJkxUJBIkGy4cAhISAh0tGxMbLRwCEhICHC4bEnojPEg8IyM8SDwjAAAG//8AAAEsAQsADAAYAE4AZwBxAHsAADcyFh0BFAYiJj0BNDYXNCYiBh0BFBYyNjUnFhc3NhcWFxYVFAcXMx4BHQEUBw4BDwEGBwYHBiInJicmLwEuAScmPQE0NjczNyY1NDc2NzYPARUXFhcWMjc2PwE1JwYjIicmJwYHBiMiNyYOARQWMjY3NjcGFx4BMjY0LgF1BggIDAgIVggMCAgMCDICAQMRJiMQDQUDAQ4PAwIHBwsGBwwNKVIpDQwHBgsHBwIDDw4BAwUNECMmSQEBCgwkRiQMCgEBDBQhEgYEBAYSIRQ6CDAPDCoTAgMnBwMCEyoMDzBxCQYcBggIBhwGCQ8GCQkGHAYICAayAQIDEwUEExEeEwwQBxkOGAUGAwkFCAUEBwUSEgUHBAUIBQkDBgUYDhkHEAwTHhETBAWCAlABBgUPDwUGAVACBhMGCAgGE2IIBRMoDhQUFggIFhQUDigTBQAAAAADAAAAAAEHARoABwAMABMAAD8BMxcVByMnNycjFTMnBxUXNTMnSxNlRBOWE6k4Xpa8EhJ5E+ETQ4sTE4M4u/MSvBPPEgAAAAAEAAAAAAEHAPQABgAbACgANgAANw8BJzcXNxc+ATU0LgEjIgcmIzYzMh4BFAYHNgciLgE0PgIeAg4BBzI+ATQuASIOARQeARenLw4cDRUoSQkKEh4SDQwNDxceFycXGRQFZRIeEhIeJB4RARIeEhcnFhYnLicWFicXkDgBHA4VMCsJGA0SHhIFBRMXJy4oCw4rEh4kHhEBEh4kHhISFicuJxYWJy4nFgEAAAAABAAAAAABGgDiAAMABwAXABsAACUVIzUVMxUjNyMiBh0BFBY7ATI2PQE0JgczFSMBB+Hh4eHhCAsLCOEHCwtAJibOEhIlXpYLCIMICwsIgwgLcBMAAQAAAAAAzwCWAAMAADczFSNecHCWEwAABgAAAAABCQEcAAwAHAAoADAAOgBIAAATPgEeAg4CLgI2FxYzMj4BNTQuAg4CHgE3FwcWDgEuAj4BFwcWNjQmDgEWNwcWFRQHFz4BLwEmIyIOARQXByY+AhdJG0E7JAQdNkE6JQQcJhogHC8cFiUwLiQTAxiCDSgEBREUDwIMFAoSBQoHCAQBVA8FCQ4MAwo0CwwSHhIJDRADJjgaAQUSBB02QTskBBw3QTqoEhwvHBkqHgkMIC0vKooNKQkUDAIOFREFBCEDBAsFAQcHKw4LDRIPDhMuFBcFEh4kDw4YOSsMDQAAAwAAAAAA9AEaABMAJAA1AAA3NC4BIg4BFRcjFRceATI2PwE1IycyFx4BFAYHBiInLgE0Njc2FwcOAQcGIicuAS8BNRY3Fjf0GSwyLBkBAQEENUg1BAEBXRUTEBMTEBMqExATExATYAEBEw8SKhIPEwEBIygoI+oNFgwMFg0CpgcRFxcRB6YeBQQOCg0EBQUEDQoOBAXEAwUMBAUFBAwFA4wUAQEVAAAABQAAAAABKAEHACUALAA1AD8ARgAANwcuASIGBycHFwcVIxUzFRYXBxc3HgEyNjcXNyc2NzUzNSM1JzcnMhYVIzQ2Fw4BBy4BJzUzJwcVMzUXBxU3NQc1Nyc1FxWJEQQZIBkEEQ0WAxMTAQQYDRUHFhgWBxUNGAQBExMDFksMEDgQMgIVDw8VAUsqDxOOMEdHaY+lgxAPFBQPEA0WAhMTAQkJGA0VCgsLChUNGAkKARITAhYNEAwMEEsPFQEBFQ8cswhWRF8gFy8QZBZGXxduEAAAAAAEAAAAAAEWAQcAJQAsADUAPwAANwcuASIGBycHFwcVIxUzFRYXBxc3HgEyNjcXNyc2NzUzNSM1JzcnMhYVIzQ2Fw4BBy4BJzUzJzcXFQc1NycVI4kRBBkgGQQRDRYDExMBBBgNFQcWGBYHFQ0YBAETEwMWSwwQOBAyAhUPDxUBSxMOqWxWjhODEA8UFA8QDRYCExMBCQkYDRUKCwsKFQ0YCQoBEhMCFg0QDAwQSw8VAQEVDxyrCHEQSBc5X0QAAAAEAAAAAAEpASwAJQAsADUAQAAANwcuASIGBycHFwcVIxUzFRYXBxc3HgEyNjcXNyc2NzUzNSM1JzcnMhYVIzQ2Fw4BBy4BJzUzNxUHNTcnFSYnNTeJEQQZIBkEEQ0WAxMTAQQYDRUHFhgWBxUNGAQBExMCFUsMEDgQMgIVDw8VAUu4gGqiCQoOgxAPFBQPEA0VAxMTAQkJGA0VCgsLChUNGQgKARITAxUNEAwMEEsPFQEBFQ8cYBBRFkNndgYDfggAAAAABAAAAAAA4wDjAAwAGAAcACAAADc+AR4CDgIuAjYXHgE+AiYnJg4BFjcjFTMVIxUzbBEoJBcCEiEoJBYDEh0MHBkPAg0LEikYCEo4ODg41AwCESIoJBcCEiEoJF4IAgwXHBkICwgjKjsTEhMAAwAAAAAA4QDiAAwAEAAUAAA3Ig4BFB4BMj4BNC4BFxUjNTcVIzWWFCMUFCMoIxQUIxJLS0vhFCMoIxQUIygjFF4SEjkTEwAAAgAAAAAA5gDhAAUACwAANyMHFzM3ByMnNzMXulYsLFYsOjoeHjod4UtLSzMzMzMAAQAAAAAA5gDhAAUAADcHIyc3M+UrViwsVpZLS0sAAAACAAAAAADhAOEAAgAFAAA3MycHMydLlksjRiNeg2w9AAEAAAAAAOEA4QACAAA3FyOWS5bhgQAAAAIAAAAAAPQA9AADAAcAAD8BFwc1NycHOV1dXTQ0NJZeXl0pNDU1AAABAAAAAAD0APQAAwAANxcHJ5ZeXl70Xl5eAAAAAwAAAAAA4wDjAAwAEAAUAAA3PgEuAg4CHgI2JyMVMyc1MxXUDAIRIigkFwIRIigkJxcXFxdsESgkFwIRIigkFwIRFhMlS0sABQAAAAABHAEcABUAHgBEAEwAVgAAEzczHwIVDwErATU0JzM1IxUmIz0BFwcmLwE3JzcXBzcXBxcVMxUjFQYHFwcnDgEiJicHJzcmJzUjNTM1Nyc3Fz4BMhYHLgEOARUzNAc2NzUjFR4BFzZYArEBDwEBDwFcB2CsCQqGIwICBhwtCjRXEQ0VAhMTAQQYDRUHFhgWBxUNGAQBExMDFg0RBBkgGRUGERAJOAIKAUoBFQ8PARsBAQ8BsQIPAgoHrFsCXAFnIwMDBRwuCjM7EA0VAxMSAQoJGA0VCgsLChUNGQgJARMTAxUNEA8UFAcGAwYOCQxUCg8cHA8VAQEAAwAAAAABDAEHAAMACQAMAAATIxUzNwcVFzc1DwE1SxMTPg8PgxZpAQfh1Qe8B10QCEyYAAMAAAAAAQ8BBwADAAkADAAAEzMVIzcHFRc3NQ8BNS8cHFwWFoQhXQEH4dkLvAteFgtChAADAAAAAAEWAQcACQAuADgAAD8BFxUHNTcnFSMXDgEdARQOAisBIi4CPQE0LgI1ND4EMh4EFRQGByMVFBY7ATI2NV4OqWxWjhMVBQYCAwUDEAMFAwIGCwcDBggKDAwMCggGBAccFgIBEAEC/whxEEgXOV9EYAUNBxADBQMCAgMFAxAHDQsQCgYLCwgGAwMGCAsLBgoQGRYBAgIBAAAEAAAAAAERARoAEQAfADcARAAANyYnNycHJicmBwYPARc3Njc2BwYPASc3Njc2Fx4BFxYHNycHJzcnBycHDgEUFhcHFzceATI2PwEHBiIuAjU0PwEXBwb/AwUZCxoHCRQUCwgdUR0JBAgXAwYSOhIGBxAQBwsEBmEcDBsjHAwcCx0JCAUGGQsaBxIVFQgdNggQDwwGDBI6EgbkCQcaCxkGAgcIBAkdUR0ICxQOBwYSOhIGAwYGBAsHEG4dDB0jHQwdCx0IFRURCBkMGQUGCQgdGgQHCw8IEQwSOhIFAAAAAAYAAAAAARoBAAADAAcACwAPABUAGAAANzUzFSczFSM3FSM1HQEzNSU3FxUHJzcVN3GoXV1dXaio/voOZWUOE0pxEhJLE0sTE6kTE60HQw9ECHVjMQAAAAACAAAAAADYAPQAAwAHAAA3MxUjNxUjNVQdHYQc9Ly8vLwAAAACAAD//QEWAQcAGgAkAAA3FA4BJicHHgE+Ai4BBgc1IxUXMzUjPgEeASc3FxUHNTcnFSOGGScjCBIKLTIjBxovMQ8TCSwYCiMlFygOqVlDjhNLFB8IEhIHFxkHJTIsEw0UFzIKExEOCh6hCHEQOxYtX0QAAAUAAAAAARwA9AAEAAkADgASAC0AADc1MwYHNzY3IxUXJicjFSUVITUXMj4BLgEGBzMVIyc1MxU+AR4BDgImJzceARNhAgEXCQuJaQUDYQEG/vrHEhoGESEgCRQlCBANKicWBh4qJQkPBhdxEgkJOAoIEnEJChO8ExO8FiIeDAwPEAgqExELESQrHgcVFAYNDwAAAAABAAAAAAEMAQ0AHQAANxQOASYnBx4CPgI1NC4BBgc1IxUXMzUjPgEeAe8mOjUMGgooMjMpFypERRYcDkEjDjU3I5YeLg0bHAsYIQ0KIC8aJDsXFRwiSw4cGRYPLQAAAAADAAAAAAD+AQcAAwAJAAwAABMjFTMnFxUHJzUfATX9HBxcFhaEIV0BB+HZC7wLXhYLQoQAAwAAAAABEAEHAAgAEgAXAAA3FAYuATQ2MhYzLwEjBxUXMz8BByM1Mxe8FiAVFSAWVFARXxgYXxFQYV9fT5YQFgEVIBYWWQgYshcIWUqyWQACAAAAAAEQAQcACQAOAAAlLwEjBxUXMz8BByM1MxcBEFARXxgYXxFQYV9fT6ZZCBiyFwhZSrJZAAIAAAAAAPwBAAAFAAgAAD8BFxUHJzcVN1AWlpYWHG70C2QXZAytk0oAAAAAAgAAAAABDAEMABcAIAAANzUzFT4BMzIeAR8BIzUuAiIGBzMVIycXIiY0NjIWFAYhHBAwGx00IAIBHQIYJy4pCzVOEnUQFRUgFhbASy8TFhsuHAUEFCIUFhMcEpAVIBYWIBUAAAIAAAAAAOoBGgAKABMAADczNycHNSMVJwcfARQGIiY0NjIWlgpJFDEcMRRJLxYfFhYfFnlJFDF0dDEUSUEQFRUgFhYAAgAAAAAA6gEaAAoAEwAAEyMHFzcVMzUXNycXFAYiJjQ2MhaWCkkUMRwxFEkbFh8WFh8WARlJFDF0dDEUSeEQFRUgFhYAAAAAAgAAAAABDAEMABcAIQAAJTUjFS4BIyIOAQ8BMzU+AjIWFyMVMzcHMjY0LgEGFBYzAQscEDAbHTQgAgEdAhgnLikLNU4SdRAWFiAVFRDASy8TFhsuHAUEFCIUFhMcEpAVIBUBFiAWAAACAAAAAAEHAQcABwALAAATFxUHIyc1NxcjFTP0ExO8EhK3srIBBxO8EhK8ExiyAAAFAAAAAAErASwAAQANAEEASQBZAAA3NRcnNxc3FwcXBycHJzcVMzcXBxUWFQczFSMxBg8BFwcnBw4BIiYvAQcnNycmJysBNTM1NDc1JzcXMzU0PgEyHgEHFTM1NCYiBhc1IwcGFRQeAjI+AjU0K1smDSgnDSYmDSgnDXQQJA0iDAEsLgYPASsNKQEOJCYkDgEpDCoBDwUBLiwLIw0kEhAdIh0Ra1kaJRp6mwEJDhkfIh8ZD4sBCSYMKCgNJiYNKSgNkAwkDSIBHh8OEh8ZASsMKQIPEhIQAigMKgEZHhIOIBwBIw0kDBEdEREdEQwMExoaMgEBGhwZLSERESEtGR0AAgAAAAABGgEHABQAHgAANzUyNjc2NSMnNTczFxUnNSMVMwcXMzcnBzUjFScHF0sREQICVQkJ9AkS4WsJLigvDR8THg4vExMFBQMFCrsKCq0TkakJLy8NH3l5Hw0vAAAAAwAAAAABGgDhAA0AEQAVAAAlBzUnIwcVFzM3NRc3NQcjNTMXJzU3AQs9CakJCakJPQ5dlpZLOTnTIygJCYQJCSYjCWttcF0fCiIAAAUAAAAAARoBBwANABcAIAApADIAADczFxUHIyc1NzM/ATMXBzM1Iy8BIw8BIxciBhQWPgE0JhcyFhQGLgE0NjciBhQWMjY0JslHCQn0CQlHEAc4B5PhQgcQMBAHQRwEBgYIBQVQEBYWIBUVEBchIS4hIfQKqAoKqAoQAwO5lgMQEAMTBQgGAQUIBRIWIBYBFSAWEiEuISEuIQAAAAMAAAAAAPQBGgAHAAsADwAAEzMXFQcjJzUXMzUjFzMVI1SWCgqWCRODgy8lJQEZCfQJCfTq4bwTAAAAAAMAAAAAAQcBGgAHAAsAFwAAEzMXFQcjJzUXMzUjFyMVIxUzFTM1MzUjHOEKCuEJE87OcBM4OBM4OAEZCeEJCeHYzyY4Ezg4EwAAAAADAAAAAAEaARoABwALABEAABMzFxUHIyc1FzM1IxczFQcjNRz0CQn0CRPh4ZYlcCYBGQn0CQn06uEmJXEmAAAAAwAAAAABGgEaAAcACwAUAAATMxcVByMnNRcVMzUHMjY0JiIGFBYc9AkJ9AkT4XEXISEuISEBGQn0CQn0CeHhqSEuISEuIQAABQAAAAABGgEaAAkADgAaAB4AJQAAEx8BFQcjJzU3MwczNScjFyMVMxUzNTM1IzUjBzMVIzcfARUHLwG2OAYTqRMTcXGpOHFLJSUTJiYTJV5eiysFEgE4ARQ4DqgTE+ES86g5SxMmJhMlgxPOKw27E844AAADAAAAAAEHARoAAwALAA8AADcVIzUnMxcVByMnNRczNSO8XkLhCgrhCRPOzqkTE3AJ4QkJ4djPAAMAAAAAARoBGgAHAAsAEgAAEzMXFQcjJzUXMzUjFzMVNycVIxz0CQn0CRPh4SU4Xl44ARkJ9AkJ9OrhhDhLSzgAAAAABAAAAAABBwEaAAkADgAaAB4AABMfARUHIyc1NzMHMzUnIxcjFTMVMzUzNSM1IwczFSPJOAUSqRMTcHCpOXBLJSUTJSUTJV1dARQ4DqgTE+ES86g5SxMmJhMlgxMAAAAABgAAAAABGgD0AAcACwAPABcAGwAfAAA/ATMXFQcjJzczNSM1MzUjNzMXFQcjJzUXMzUjNTM1IyYJXgkJXgkSS0tLS3peCQleCRNLS0tL6goKqAoKCXESExMKqAoKqJ8mJUsAAAEAAAAAAPcBCgAZAAATFRczNSM3PgEeAgYPARc3PgEuAgYPATVCCUIwEg0iIxkKCg1hDWIQDAwhLCwQDgEHQgkSEg0JCRkjIwxiDWERLCwhCwsRDScAAAADAAAAAAEaARoACQAMABAAABMjDwIXPwI1BzcXNyc3F/gbmwMsGk0FmuwdGxAhliEBGZoFTRosA5sbyzgbCiGWIQAAAAMAAAAAARoBGgANABEAGAAAJScjNScjBxUXMxUXMzcnNTMVFyM1Mzc1MwEZCY0JXgkJLwm8CfNLlqkcCYSyClQJCZcIVQkJZ3FxXUsIHQAAAwAAAAABBwCpAAgAEQAaAAA3FAYiJjQ2MhYXFAYiJjQ2MhYXFAYiJjQ2MhZLCxAKChALXgsQCwsQC14LEAsLEAuWCAsLEAsLCAgLCxALCwgICwsQCwsAAAIAAAAAARoBGgALABwAADczFSMVIzUjNTM1Mwc1MxUzNSM1MzUjNTMXFQcjSzg4Ezg4EzgT4XFxcXoJCfThEzg4Ezj9Z12DEyUTCs4JAAAAAwAAAAAA4gDhAAsAGAAhAAA3JwcnNyc3FzcXBxc3FA4BIi4BND4BMh4BBzQmIgYUFjI2rBYWERYWERYWERYWJBQjKCMUFCMoIxQTIS4hIS4hbxYWERYWERYWERYWFhQjFBQjKCMUFCMUFyEhLiEhAAMAAAAAARYBGwAVACgANAAAEx4BFxYVFAcOAQcGJy4DNzY3PgEXNjc2JzQmJyYnJgYHDgEWFx4BJzcXBxcHJwcnNyc3oRYpECYeDyYWMCcUHhADBw8mEishJhkZAhEPHSYTJg8gFyEiECYELQ0tLQ0tLQ0tLQ0BGQEUECk3KycSFwQJFgsiKi4VLhkMDPQJHyIlFyoQHQMBCQsYTkgTCgZ8Lw0vLw0vLw0vLw0AAAAABAAAAAABHQEaAC8AQwBQAFQAABMjBycHFwcVFwcXNxczJicjLwEHJzcvATU/ASc3Fz8BMx8BNxcHHwEVFhc1JzcnDwEyFhcGBy4BDgIWFwYHLgE+AR8BPgEeAg4CLgI2FxUzNbA0CiYmGi0tGiYmCicKCAYJDiYPGQYsLAYZDyYOCRYJDiYPGQYsCwgtGiYmJAwTBAkIAQsOCgEIBwYDDQ0EFQ4YDiMhFwUNHCIgFgYMCF4BGS0aJiYKNAomJhotCAssBhkPJg4JFgkOJg8ZBiwsBhkPJg4JBggKJwomJhowDgsDBgcIAQoOCwEICQUXGxIBNAwGDBwjIRYFDBsiIR4TEwAFAAAAAAEHAQcAAwAHABUAHAAgAAA3IxUzBzUjFSc3MxcVByMVByMnNTc7AhcVMzUjFyMVM6leXiYSExODExMmEoQSEiYTSxImg0uEhIMSJl5eqRMTgxMmEhKEEhJLgziEAAAAAgAAAAABGgDjAAgADAAANyc3FwcnNyM1JzMVI/UsDUNDDSy9JRMTqS0NREMNLRM4gwAAAAYAAAAAASwBLAAHAAsAFwAbAB8AIwAAEzczFxUHIyc3FTM1BTU3MxcVMxcVByMnNzUjFRcjFTsCNSOpE10TE10TE13+5xNeEl4TE84TcV5eXl4SXl4BGRMTXRMTXV1dqHATE14SXhMTcF5eEl5eAAAEAAAAAAEUARQAIAAmADcAOwAAEwYUHwEOAQcGHgE2Nz4BNxcGFBYyNxcWMjY0LwExJyYiHwEGIiY0NyIHFzYzMhYXHgE+AScuAgcXLgEcAwIzEhoFAQQHBwEFFxEWDh0pD0oDCAUCgGgDCGIsCRoSHxMRDwsKJTkJAQcHBAEHIzMaMAEbARACBwMzDSUWBAcCBAQUIAsXDikeD0oDBQcDgGgDdCwJExlRBRADLiMEBAIHBBsrGCwvExsAAAMAAAAAAREA6AAIABEAKAAANzIWFAYiJjQ2FyIGFBYyNjQmJzIeARcWDgEmJy4BIgYHDgEuATc+ApYVHR0qHR0VDRISGhISDRwzIwcBBAcHAQk5SjkJAQcHBAEHIzO7HSkeHikdEhMaEhIaEz4YKxsEBwIEBCMtLSMEBAIHBBsrGAAAAAP//wAAARoBGgAVADsARAAAEwcVNxc1MxUjBzUjFwczFRc3Mzc1Jwc+ATQuASIOARQWFw4BBwYPATM1ND4COwEyHgIdATMnJicuASciJjQ2MhYUBlQJCQqpIRgmAQEUECIiCQmYDhASHiMfERANDRYHBAEBEwoSGA0BDRgSChMBAQUGFjITGxsnGxsBGQkdAQEUXhgYCgkcByMJcQmxCR0jHhISHiMdCQYWEAsMEgoNFxMKChMXDQoTCwsQFg8bJxsbJxsAAAAACAAAAAABBwEaAAkADgAYAB0AJwAxADsAQAAAEx8BFQcjJzU3MwcVMzUnBxQzMjY1NCMiBhc0MhQiFzM1IzUHFTcVIwcjNTM1BzU3FTM3FDMyNjU0IyIGFzQyFCLGPgMKzgkJkYi8OGgZDQ4ZDQ4QFBQ8LQ8fEA8aLQ8QIA4UGg0NGQ0OEBQUARc+B7YJCfQJEuGoOUwlFBIlFBIaMgsMPQYNAy1qDC0DDQY9GCQTEyUUExoyAAAAAAUAAAAAAQcBGgAJAAwAEwAaACEAABMfARUHIyc1NzMHMycjFTM1Iyc1BzcnBxUXPwIXFQcnN8Y+AwrOCQmRBDg4hLxCCUoiDSkpDSQNKSkNIgEXPge2CQn0CUs54ZYJQo4jDSkNKQ1EDikNKQ0iAAAHAAAAAAEaARoAEQAUABwAJQApAC0ANgAAEzMVFzMVMzUvAiMHFRczNSM3FyMXIwcVFzM3NQcVJyMHJyMHNRc3FysBNTcXNzI2NCYiBhQWJnAJQhMDPgaRCQlCOIM4OGeWCQmWCRIfDRYoDQ1PDx0eXRMvJQQGBggFBQEHQgkTKQc+Agn0CRPhOTgJcQkJcQpLHhYoDCdQDxwbEy5BBgcGBgcGAAkAAAAAAQcBGgAOABEAGQAeACgALgA3AD8ASQAAJS8BIwcVMzUzFRczFTM1BzUXDwEVFzM3NScHFSM1MwcjFSM1MzIVFAYnIxUzMjQXNic0ByMVMzInNTM2FhQGJzcjFSM1MxUjFTMBBD4GkQkScQlCE0s4xQkJzgoKCby8lgYNFBUNCgUFCkIJAR4UFA0UBgcLCghNEg0hFBLZPgIJZ15CCRMpBDk5OAlxCQlxCV4SXTgTORMICxsRESYJDBwBOAsjAQsPCwELFjkLDgAAAAAEAAAAAAEaAQcAAwAhACsAMgAANzM1Izc1NzMfATMXFQcjJzUjJzU3Mx8BMxcVIzUjLwEjFRcnIxUzPwEzNSMHIxUzNSMHJhISEgpTCAhrCQnOChwJCVMICGsKE2cICERxCEQ7CAhxaBNBvGsIXksTCQkEDgqWCQkvCakKBQ4KLiUFDjgPDzkOBRM4S10OAAAEAAAAAAEaAQcACgASABwALAAANzMXFQcjJzU3Mx8BNTcjDwEjFTczNyMvASMVMzcXJzcXFQcnNyMOARcjNDY3kX8JCfQJCV4HhQF3EAZUZnoBegcQUFAQMRkOKSsNGxoPFQETHhf0CrsJCc4KA8wdZxADcZYTAxA5EEkaDSoNKg4ZARUOFiABAAAAAAUAAAAAAQcBGgARABQAHAAgACoAABMfARUHIzUzNSMnNSMVIzU3MwczJwcjBxUXMzc1ByM1MwcVIzUHJzcjNTPGPgMKQThCCXESCZEEODgdgwkJgwoTcHATEjINMSE4ARc+B7YJE5YJQktUCUs5XgqDCQmDeXAcOCExDTISAAAACwAAAAABBwEaAAoADgAjACcAKwAvADMANwA7AD8ASQAAEzMXFQ8BFQcjJzUXIxUzFTM1LwE1IxUHIxUjNSMnNSMVMzUzNRUzNScVIzU3MxUjNRUjNTczFSM1FSM1OwE1Ixc3NSMVHwEVMzUvzgoDEAq7CUsTE0sQAyYJCRMKCRMmExISExMSEhMTEhITExIScxA4DwMTARkJXgYRfwkJ9Akmu3YQB1QvChISCi/hEhMTExMTExMTJRISExMmExMTFhBRUQ8HenkAAAAAAwAAAAABBwEaAAkADwASAAAlLwEjBxUXMzc1ByM1MxUzJzUXAQE4DXETE6kTE6leSzg43DgFEuETE6io4UsSOTkAAAAEAAAAAAETASwADQAQABcAHQAAEyMHFSMHFRczNzUzNzUnFyMHIzUzFRczNyM1MxUz23ESORISlxI7EDgeHiaWORJLS5ZeOAEsEzgTvBISORKXHh7hu3ESE7s4AAEAAAAAARoBBwAHAAABFQcVIzUnNQEZXUteAQcgWWhoWSAAAAIAAAAAARoBBwAHAA8AAAEVBxUjNSc1FxUzNTc1IxUBGV1LXnAmXuEBByBZaGhZIHFeXlkFBQAAAgAAAAAA+wEaAC0AUwAANyc2JicmJwYHBhcWFwcuAjc1Njc2NzY/ATY3Njc2JzceAQc2PwEVFhcWBw4BJxcGFhceAQc+ATc2JicOAS8BNiYnBgcGDwEGBwYVMQYWFyY3NjerCgkDCxIEDgIDBgMKCxQfEQEBAwQJChAICQcKAwQGDR8bCQYEEQoGCwsJJTsQAQkJDQoEDBIFBQQIBhMKBgwJFAIRCQ8CFwkEARAPCgUGHBMOCxwJDxYTEQ4NCA4OBBglFAcJCQ0NDw4ICgsPDBEMDBZHJQcIAgEQEyUbFBp/Bw0ZCQkcDwQRCxEjEAkJAg0bOxYWGg0PAhQXDAoSHwoXFRwfAAAAAgAAAAABCwEaAAYADQAAAScHJwcXMzcnBycHFzMBCg1wcQ13DXcNcHENdw0BDA1wcA13Bg5xcQ53AAAAAgAAAAABDgEaAAYADQAANxc3FzcnIwcXNxc3JyMTDXBxDXYNeA1wcQ12DaENcXENeOgNcHANeAACAAAAAADuAQAABgANAAA3BycHFzM3BzcXNycjB+BKSwxRC1GjTUwMUwtS/0pKC1FRzkxMC1JSAAQAAP//AS4BBwAUAB4AKwAyAAA3MxcVJic1Iw8BIxUzFhcjJzU3Mx8BMzcjLwEjFTM3Fz4BHgIOAi4CNhc3JwcnBxeRfwkIC3YQBlVgAgRvCQleBwt6AXoHEFBQEDERKCQXAhIhKCQWAxI4LQ8nGAwg9ApUBwQbEANxCQkJzgoDNhMDEDkQQgwCESIoJBcCEiEoJFI7DDQTDhoAAAUAAAAAARoBBwASABwAIAAkACgAADczFxUjNSMPASMVMxUjJzU3Mx8BMzcjLwEjFTM3FzMVIzczFSM/ARcHkX8JEncQB1ReZwkJXgcLegF6BxBQUBAQExMmEhIlEiYR9ApBExADcRIJzgoDNhMDEDkQNXBwcGkHagYAAAADAAAAAAElAQcADQAZACAAADczPwEnIzUnIy8BIwcVNzMfATMVIw8BIw8BFyM3Mz8BMxzOCTIJFQpsEQZeCRNQEAdnVQYQRwkTvbofRQYQbSYGhAwuChADCs7FEAMlAxAHOTFeAxAAAAMAAAAAARoBBwAKABIAHAAAJSMvASMHFRczNzUHFSM1Mz8BMycjDwEjNTMfATMBEH8QB14JCfQJE+FVBhB3AXoGEFBQEAd69BADCs4JCbuVHXEDEBIDEDkQAwAABQAAAAABLAD0ABMAIwBAAEkAUwAANzMyHgEdARQOASsBIi4BPQE0PgEXIgYdARQWOwEyNj0BNCYjByIGHQEjIgYUFjsBFRQWMjY9ATMyNjQmKwE1NCYXFAYiJjQ2HgEHFAYiJj4BMhYVS5YUIxQUIxSWFCMUFCMUFyEhF5YXISEXegQFHAQGBgQcBQgGHAQFBQQcBokLEAsLEAsTCxALAQoQC/QUIxQ4FSIUFCIUORQjFBMhFzgYISEYOBchJQYEHAUIBhwEBQUEHAYIBRwEBhMICwsQCwEKQAgLCw8LCwgAAAAABAAAAAABGgEaAB8ANwBAAEkAADcnIw8BJwcXDwEVHwEHFzcfATM/ARc3Jz8BNS8BNycHJxc3FwcXFQcXBycHIycHJzcnNTcnNxc3FxQGIiY0NjIWBzI2NCYiBhQWqwoWCg0lERgDLS0FGA8lDwgWCg8lDxgFLC0GGA8lCAonJhstLRsmJwo0CiclGi0tGSYnCEAXHhYWHhcmCAsLEAsL2i0tBhgPJQ0KFgoPJQ8YBSstBRgPJQ8IFgoPJQ8YQy0ZJicINAonJRotLRkmJwg0CicmGy2DDxYWHhcXIgsQCwsQCwAABQAAAAABBwEaACIAJgA5AEwAUAAANyM2NSYnJi8BJiIGBwYHJicmIyIHBgcGDwEUFyMHFRczNzUHIzUzNSM1JjU3Njc2NzYyFxYXFhcWFTM0NzY3Njc2MhYXFh8BFAcVByMXIzUz/R4CBAMGCAUICQgDEQ0NEQwFCQgHBgMEAQIeCQnhCoRdXTgCAQIDAgcCDwQJBgQBAhMCAgQFCgMPCAUBAQICAjZeXl7hCA8LBQkDAgMBAgUUFAUDBQMJAwsDDggJqQkJqaCWEwQFCgMFAQQEAgIECAUDBQUFBQMFCAQCBAYBAwUKBQICqZYAAAAABQAAAAABGgEaABMAFgAmADAANAAANzMVFyMnNTczHwIVJic1Iyc1IxcnFRcVMxcVByMnNTczNTQ2MhYHBh0BMzU0LgEGBxUzNThLAlYJCZEGPgMIC0IJcbw4QRMJCXEJCRMWHxYzBSUGCgwlXiYSAQn0CQI+BzALBwgJQjk5OUsSCksJCUsKEhAWFgIGCBISBgkFAjc4OAACAAAAAADhASwADwAYAAATMxUeARQGBxUjNS4BNDY3FzI2NCYiBhQWjRIcJiYcEhwmJhwJFB0dKB0dASxMAyo6KgNMTAMqOioDex0oHR0oHQAAAAAEAAD//gEcARoAHwAqAEkAVQAANyc3FxUHJzcjBiY9AS4CPgEzMhcWFxYVFAYHFRQWMycWPgIuAQ4CFhcWFx4BBw4BLgI2NzY3NTQmKwEXByc1NxcHMzIWDwE+Ai4CDgIeAYsYDCgoDRgjExwOFAULFw8JCRIIAxUQEAw1CBQOAgoQEA0DB8gOCgwDCQgaHBQGCwwICRELIxgOKCgOGCMTHAEGBwwHAQkQEQwDBxA4GA0oDSgOGAEcE2gDFBwaEAMIEgkJERoDZwwRmwUCDhQPBwMNEBB7AwoMIQ4MCwYUHBoIBQJoDBAYDSgNKA0YGxSyAQgODg4GAwwREAoAAAAABAAAAAABBAEHAAMADQARABUAABMjFTMHJzcXNTMVNxcHJzMVIxcjFTOpExMQXg1OE00OXhATExMTEwEHE85dDk4bG04OXagSJhMAAAQAAAAAAQgBLQA0AD8ASgBXAAA3LgEHBgcGBy4BJzI3PgE1NCcmJyYjIg4BHgEXFQYHDgEeAj4BNTYuASc1FhcWFx4BPgE0Bx4BDgIuAT4CJyIuAT4CHgEOARcOAS4CPgIeAgb5DCEODAYBAR4qAwQEDRAEBxIJCg4XCwUUDgkICwsFFBwbDwEJEgsPFhMUBB0kGKgICgIOFA8HAw0QAwgOBwMNEBEKBA+NBQ4OCwYEDBEOCQMEmwwDCQgNBAQDKh4CBhcOCgkSBwQQGhwUA18CBQgbGxQGCxcPCRQPAi0VCwoBEhUDGyUyBA8UDgIKEBANA4IKDxEMAwcRFA17BQQDCQ4RDAMGCw0OAAAGAAD//gEaARoAIQAtADkASgBVAGEAADcGDwEVFhceARUUDgIjIi4BPgE3NS4CPgEzMh4CFRQHLgEiDgEeAj4CJxYyPgEuAg4CFhcWFxYVFA4BLgI2NzY3NTMXPgEuAQ4CHgE2JwcXNxc3JzcnBycHaQgNCAQEDRAHDRIJDxcLBRQODhQFCxcPCRINBxYEDRAOBwMNEBAJASwHEA0IAQkQEQwDB8gOCg4QGhwUBgsMBwoSCwcCChARDAMGEBQdHw0fIA0fHw0gHw3QDAYCXgECBRgOChEOBxAaHBQDXwMUHBoQBw0SCQ+fBwgKDxEMAwYOD54FCA4QDQcEDBAQewMKDhMOGAsGFBwaCAUCQ4UHFBAGAwwRDwsC2B8OICAOHyANHx8NAAAAAAUAAAAAASwBGgAdACoANgBKAFYAADcGDwEVFhcWFRQHDgEiLgE+ATc1LgI+ATM2FgcUBy4BIyIGFx4CPgInFjI+AS4CDgIWFyM1NCYrARcHJzU3FwczMhYXFgcVIzUjNTM1MxUzFSNpCA0IEwoIAwYYHRcLBRQODhQFCxcPEx0BFgQNCA0RAwENEBAJASwHEA0IAQkQEQwDB8gSEQsjGA4oKA4YIw4YBQQBEzg4Ezg40AwGAl4EEAwOCgkNEBAaHBQDXwMUHBoQARwUD58HCBUNCAwDBg4PngUIDhANBwQMEBAvHAwQGA0oDSgNGBANCQnFOBM4OBMABwAAAAABGwEaACAALAA4AEEASgBTAFwAADc+ATU0LgIjIg4BHgEXFQ4CHgEzMj4CNTQmJyYnNRceAQ4CLgI+ATInIi4BPgIeAg4BFxQGIiY0NjIWBzI2NCYiBhQWJxQWMjY0JiIGNRQWMjY0JiIGVA0QBw0SCQ8XCwUUDg4UBQsXDwkSDQcQDQQEBQYIAQkQEA0DBw4QCAgOBwMMERAJAQgN0BsnGxsnGy8MEREXEREHCw8LCw8LCw8LCw8LvgYXDwkSDQcQGhwUA18DFBwaEAcOEQoOGAUCAV51BA4PDgYDDBEPCoMKEBAMBAcNEA4InxQbGyccHC8QGBAQGBCICAsLDwsLSAcLCw8LCwAAAAAE//8AAAEHARoADwAbAB8ANQAANxUXMzc1LwIjFTMXFSM1NyM1IxUjFTMVMzUzBzMVIzcHJzcjIgYUFjsBFSMiJjQ2OwEnNxc4E6kSBTgOJSU5qYMlEyUlEyVdXV0TKA0YOAwQEAwJCRQbGxQ4GA0ocUsTE6gOOAUSOahLSyUlEyYmSxOZKA0YEBgQExsnHBgNKAAABAAAAAABGgEaABEAFgAiAC4AACUvASMHFRczJicjNTMXFRYXNQcjFTM0JzM1MxUzFSMVIzUjFyIOAR4CPgE1NCYBATgOcBMTZAkGVXA5CghuJyUlJRMlJRMlcBEcDQYYIh8TIdw4BRLhEwgK4jk6AwVCcBMKZyUlEyYmJhMfIhgGDRwRFyEAAAUAAP/+ARoBGgAdACoANgBXAGMAADcGDwEVFhcWFRQHDgEiLgE+ATc1LgI+ATM2FgcUBy4BIyIGFx4CPgInFjI+AS4CDgIWFxYXFhUUDgEuAjY3Njc1NCYrARcHJzU3FwczMhYXFgcXPgEuAQ4CHgI2aQgNCBMKCAMGGB0XCwUUDg4UBQsXDxMdARYEDQgNEQMBDRAQCQEsBxANCAEJEBEMAwfIDgoOEBocFAYLDAgJEQsjGA4oKA4YIw4YBQQBCwcCChARDAMGCw0O0AwGAl4EEAwOCgkNEBAaHBQDXwMUHBoQARwUD58HCBUNCAwDBg4PngUIDhANBwQMEBB7AwoOEw4YCwYUHBoIBQJoDBAYDSgNKA0YEA0JCaoHFBAGAwwRDgkDBAAABQAAAAABBwEOAAkAFwAhACUAKQAANxUzNRc3JyMHFw8BFRczNzUnIw4BIiYnFzMVIzUzHgEyNiczFSMVMxUjgxMyDUINQg42CQnhCgpCBBohGgNpLM4rCCAnID0TExMT8CIiMg5BQQ47CV4JCV4JEBUVEBJLSxEVFVwTExMAAAADAAAAAAEHAQ4ACQAXACEAADcVMzUXNycjBxcPARUXMzc1JyMOASImJxczFSM1Mx4BMjaDEzINQg1CDjYJCeEKCkIEGiEaA2kszisIICcg8G1tMg5BQQ47CV4JCV4JEBUVEBJLSxEVFQAAAAADAAAAAAEHARoACQAXACEAADc1MxU3FwcjJzcPARUXMzc1JyMOASImJxczFSM1Mx4BMjaDEzINQg1CDjYJCeEKCkIEGiEaA2kszisIICcgrWxsMQ1CQg1bCV4JCV4JEBUVEBJLSxEVFQAAAAAFAAAAAAEaARoADAAYAB8AIwAnAAA3MxcjJzU3MxcVJzUjFwczNycjNycjDwEXNzMHMwc3IycjNTMHIzUzOTANRgoK4QkTzmgbKmkNHw8PNhErESs2I0JsHzMKNj8aJS5xEwmpCQlaITCpQWwgGx0LXhpwOG1IOBM5EwAAAQAAAAABGAEhAGwAACUWFRQHBgcWHQEUBiImPQE2Jic3Njc2NzY1NC8BNicGDwEmBycmIwYXBw4BFRQXFhcWHwEGFxUWBiImPQEGJyYnJi8BLgEnLgE+ARcWFxYfARYXFjc1JjcmJyY1NDcmPwE2FxYXNhc2NzYfARYBBxEXEiAGBQcFAQUFBRYNEQkLEAIHBhETBykpBxoLBgcDCAkLCBINFgULAQEGBwYRDQsJBQgBBQcDAgMCBgMHBwMHAQoIDRUCByARGREFCQYEChAVKSoUEAsEBgnqFBstGBEFChEuBAUFBC4IDQYOAwYHDxIdFhEKEBIEDQILCwIQExAJCBUKHREPCAYDDwoPLwQGBgQaBAQDCAQLAQYGAQEGBgQCAQUDCAINBAcFBA4NBhEYKxwUGhUEAgEDDQoKDQQCAgUZAAAAAf//AAABLQEsAFQAABMiDgEVFB4BFzI2PQEGJyYnJi8BLgEvASY3NjMxHgEfARYXFjc2NyYnJjU0NzEmNzMyFxYXNjMyFzY3NhcxFg8BFhUUBwYHHgEdARQWMz4CNTQuAZYpRSgaLh4FBQ4LCQcEAwMCCAMDCQQCBAYLAwMJDgoKAQgeEBYQBwkEBggKDQ8XERQSDQcDCAUBEBYPHwQGBQUeLxkpRQEsKEUpIDoqCgQEGQMDAgUEBQQICgMBBgMBAQcEBA8BAQQMCAQNEycXERMUAwQJBQUMAwIBExQBERcnEg0EAw4KKQQECis6HylFKAAAAAMAAAAAAQcBBwALABMAFwAANzM1MzUjNSMVIxUzJzMXFQcjJzUXMzUjcRJxcRI5OULOCgrOCRK8vDhxEjk5El4KzgkJzsW8AAIAAAAAAS0BLAAMAGoAABMiDgEUHgEyPgE0LgEDIyImPQE0Jic+Ajc2NTQmJz4BNCYnIyIGDwImBy8BLgErAQ4BFBYXDgEVFBceAhcOAQcOASYvAi4BIwcGFB8BFh8BHgE3MzcVFAYrAS4CPgIyHgIOAQeWKUUoKEVSRSgoRQECAgQEBQ0XEAMEBwYBAQICAgUIBAkHICAHCQQJBAMBAgEBBgcEAxAWDQMEAQcPCwQEBAMGAwUBAggCAgYDEQoGBwQDAR0sEwokNz43JAoTLB0BLChFUkUoKEVSRSj+8AMDIwcNBAEJEAsNDgkSBwQHCQkFAgIFBAkJBAUCAgUJCQcEBxIJDg0LEAkBAwkFAwEIBwQFAQMBAQICBgICCwkKAQEWAwMJLDo+MhwcMj46LAkAAAAACgAAAAABGgEaAAwAEgAeACoAMQA3AEEASABNAFMAABMyHgEUDgEiLgE0PgEXLgEnFh8BNjUmJyMWFRQHMzYnNTY0JyMGFRQXMzYnJicrAQYHIzY3DgEPAQYUFzMmNTQ3IxcjHgEXJicXNjcjFjcGBz4BN58hOCEhOEI4ISE4fQkeEgwGMgEBAywBBC8CQQECSAEEQwIDBxAKCREGFAUNEx0JCAQELwQBLDQsCiYXEgkvEgo3CUIJEhclCwEZIThCOCAgOEI4IUsSGgYXGzgFBA8NCggTEwkKAQkSCQkJExMKQR4aGh4bGAcaEhIOHQ4TEwgKShYcBRkdMRYbGxweGQUcFgADAAAAAAEsARoAFgAnACoAAD8BNScHFyMiBhQWOwE1IyIuATY7AQcXNyMnMx8CFQcjJzUXFTM1IzcVM3EmKA0YOBQbGxQJCQwQAREMOBgNXzITWA05BROoExOoSxM4vScNKA0YHCcbExAYEBgNSxIFOA6oExOMEHyWSzkAAwAAAAABDwEaAAMAGgAwAAA3Bxc3Jx4BMj4BNC4BIyIHFzMyHgEUDgEiJic3Byc3IyIGFBY7ARUjIiY0NjsBJzcXWkcORx0NMTovHBwvHAwMEQcXJxYWJy0lCzYoDRg4DBAQDAkJFBsbFDgYDShuRQ1FIhkfHC84MBsCERYnLicWFBFhKA0YEBgQExsnHBgNKAAAAAIAAAAAARoAvAADAAcAACUhFSEVIRUhARn++gEG/voBBrwTJhIAAAAHAAAAAAEaAQ8ACQARABUAHQAhACkALQAANxcHJzU3FwczFQc1NzMXFQcjNzUjFTc1NzMXFQcjNzUjFTcVFzM3NScjFxUjNSgQCyAgCw/wzgkmCQkmHRM4CSYJCSYdEzgJJgkJJh0T4RELHwwfDA8TxqsICKsIEZmZHYUICIUJEXV1fWAICGAIEFBQAAIAAAAAASABLAAGABMAACUVIyc1MxU3ByMnByc3Mxc3MxcHARn9CRPOYQ0fRA5LDh9gDSYNOBIJ/fS4YR9EDUsfYSYNAAAAAAYAAAAAARoBLAAGAAoADgASABYAGgAAJRUjJzUzFTczFSM3MxUjBzMVIwczFSM3MxUjARn9CRM4JSWDJiZLJiY4JSWDJiY4Egn99M8mOCUmJSYlOCUAAAAHAAAAAAEaASwABgAOABIAGgAeACYAKgAANzM1IzUjFTc1NzMXFQcjNzUjFTcVFzM3NScjFxUjNQc1NzMXFQcjNzUjFRz98xMlCiUKCiUcE4MKJQoKJRwTXgolCgolHBMmEvT9JZYKCpYJE4ODsrwJCbwJEqmps3EJCXEJE15eAAYAAAAAAM8A9AADAAcACwAPABMAFwAANzMVIxUzFSMVMxUjNzMVIxUzFSMVMxUjXiUlJSUlJUslJSUlJSX0JiUmJSa8JiUmJSYAAAALAAAAAAEHARoACQARABUAHQAhACkALQA1ADkAPQBBAAATMxUjFTMVIyc1FyMnNTczFxUnMzUjFyMnNTczFxUnMzUjByMnNTczFxUnMzUjFyMnNTczFxUnMzUrAhUzNSMVMxwmHBwmCXomCQkmCSUSEow4CQk4CjkmJkEmCQkmCSUSEow4CQk4CjkmJhImJiYmARkS4RMJ9GcJJgkJJgoSJQk4Cgo4CiWWCSYJCSYKEzkKOAkJOAkmE3ASAAEAAAAAARoBBwAcAAAlLgEnLgEiBg8BJy4BIgYHDgIUHgEfATc+AjQBFwIJBwoaGxkKDQ0KGRsaCgcJBAQJB29vBwkE0gkRBgoKCgkNDQkKCgoHEBISEhAHbm4HEBISAAIAAAAAARoBBwAdAD0AACUuAScuASIGDwEnLgEiBgcGBwYUHgEfATc2NzY1NAcGDwEnLgI0PgE3Njc2FxYfATc2NzYXFhcWFxYVFAcBFwIJBwoaGxkKDQ0KGRsaCg0FAgQJB29vBwQJFQMKYWIFBwMDBwUHChMUCQcaGQcKExQJBwUDBwHSCREGCgsLCQ0NCQsLCg0TCRISEAZvbwYIEBMJFQ0KYWEFDAwODQsFBwQICAMIGRkHBAgIBAcFBgsOBwYAAAACAAAAAAEdARsAHgAlAAA3PgEmJy4BDgEHNSMVFzM1Iz4BHgEOAiYnBx4CNic3JzUjFRf9Eg0MEhM8QTgQEwlCKRNISi4CMUtGEhAPOEI+Kw42EwNFFzk5FxocBCEcLUIJEiIdFT5NPBIhIgkdJgYbLA02R0sHAAACAAAAAAEUARMAEQAcAAATFwcnFQcjJzUjFQcjJzUHJzcHFTM1NzMXFTM1J513DRMKOAkmCTgKEg53RCYJOAolSwESbA4RegkJQkIJCXoRDmxYgkIJCUKCRAAAAAQAAAAAAPQA4gALACAALAAwAAA3MzUjFSM1IxUzNTMXMyc2NzY3NjQuAScmJyYrARUzNTM3BisBNTMyFhUUBwYXIxUzeQ8PMRAQMWoRGAMECAMCAwUEBgcEAy4PHAkDAiAgBgoBAxe8vHFwMTFwMDAxAQMGCQULCgcDBQIBcC4QASQKCAUDB2YTAAAABQAAAAABBwEaACQALgA7AD8AQwAANzMXFTMXFQcjFQcjByc1Iyc1Iyc1NzM1NzM1LgE1NDYyFhUGBxc1IxUXMxU/ATMnBgcxBiYnBx4BMjY3JyMVMzczFSOfSwkKCgoKCTovEC8KCQkJCQpLBAYLEAsBCUKWLwkiBzUoCw4NGAkNChkcGQlMExM4ExPhCSYKEgk5CTQHLQw2CRIKKAcVAwgGBwsLBwsFYThuAikmAy4KAwMICQ4JCwsJMxMTEwAAAwAAAAABGgEaAAkAEwAdAAA3Mzc1LwEjDwEVNyM1Mx8BMz8BMycjDwEjLwEjNzMc9Ak0CI0JNPThLw4IVggNMQE1CQxLDgg1MX8mCVSQBgaLWQk4FwUFFxMFFxcFhAAAAQAAAAAA9ADPABEAADcVFBY7ASc3FxUHJzcjIiY9AUsFBIEeDTAwDR6BCxHOJQQFHg4wCy8NHhAMJQAABAAAAAABGQEbABMAJwArAC8AABMeARceAQYHDgEmJy4DPgMXPgE3PgEmJy4BBgcOAR4BFx4BNyczNSMXFSM1oRYpDxgSDBUTNzwbFB4RAg0aJisgEiEMEgsQFBIxMxUZGgMfGhEmEh8YGBgYARkDExAYPkAaGBkCDgsiKi0sJBoL8wQUDxY3NRUSEQcOETU7Mg4JBgSUEiVLSwAABQAAAAABGgEaAAcACwATABcAHQAAARcVByMnNTcXIxUzFRcVByMnNTcXIxUzJxcHFzcnAQcSEpYTE5aWlhISlhMTlpaW9B4eDSsrARkSSxMTSxISSzkSSxMTSxISS44eHg0rKwAAAAADAAAAAAEnAQcADAAQABQAAD8BMxcVIzUjFTMVIycFJxU3BzUXIxMT4RIS4V1dEwEUfjMgPSX0ExNxcZYTEyB+sTMGVj4AAAAJAAAAAAEHARoABwANABUAGwAkACoAMgA4AEEAADcXNjQnBxYUJzcmJwcWJzcmIgcXNjIHJwYHFzYHNDcXBhYXByYXBxYXNyYXBx4BNycGIjcXNjcnBicyNjQmIgYUFu8SBgYSBQsQEiMJHiwFEicSBg8hPwkjEhEPLQYSBgEFEgYeERIjCR4tBhInEgUQIT8JIxIQEEwHCwsPCwt/BRInEgYPIT8JIxIRDxUSBgYSBgwREiMJHk0UEgYPIRAFEhsJIxIQEBYSBQEGEgULEBIjCR46Cw8LCw8LAAAAAwAAAAABIwEbABUAMAA5AAA3By8BNxc+Ax4DFyMuAgYHNx8BBycOAy4DJzM1FB4DPgI3Byc3JxQWMjY0JiIGYz0NGREPCBskKCklHBABEgQySD4MLK0ZEQ8IGyQpKSQcEAITDBgfJCMgFwcrBz1/CxALCxALwhkFPAckEx8UCAYUHiYUJDQJJyISQz0IJRMfFAgHFB4mFQkSIhwSBgYSHBESEhkKCAsLDwsLAAMAAAAAAQcBGgANABsAJAAAEyIOAR4CPgEnNi4CByIuAT4CHgEVFA4CJxQWMjY0JiIGjSU+HA41SEQqAQETIi0YIDQYDSw9OiMQHSYnCw8LCw8LARkpREk0Dhw9JRksIxLhIzo9LA0YNCAUJh0QZwcLCw8LCwAAAAEAAAAAAOABBwAcAAA3ByM3Mjc2NzY/ATY1NC4BIzczByYOAQ8BBhQeAakCXAIOBQcDBgYmBQQJDAJWAgoNCAYmBgQJLQYGAgMFCBSHEAkEBwIHBwEGDBWHEwkGAwAAAAIAAAAAARoBBwAbADEAADcjJzUjLwE/ARceARcWFxY3Nj8DHwEPASMVJzM1NzM3JwcGBw4BIiYnJi8BBxczF9+TCRsJDAZQDAEFAgUGDg0GBQUEDFAGDAkbk4AJHQg/AwMDCBQVEwcEAwNACRwKIQp9BzILGwYFBwIFAwUGAgUFCQYbCzIHfQl9CSMVBAUDCAgICAMFBBUjCQAAAAIAAAAAAQcBBwBGAI0AADc1IyIOAQcxBgcxBhcVFAcxBgcGKwEVMzIXFRYXFRYXMRYdAQYXFRYXMR4CFzM1IyIuAj0BNCYnJic2Nz4BPQE0Njc2MxcVMzI+ATcxNjcxNic1NDcxNjc2OwE1IyInNSYnNSYnMSY9ATYnNSYnMS4CByMVMzIeAh0BFBYXFhcGBw4BHQEUBgcGI3ECCREMAwMBAQECBAoFBgEBBgUFAwQCAgEBAQMDDRAJAgIGCgcEAgIFCQkFAgIJBwUGTQEJEA0DAwEBAQIECgUGAgIGBQUDBAICAQEBAwMNEAkBAQYKBwQCAgUJCQUCAgkHBQb0EwcNCAgICAgQBgUKBQISAgECAwEDBQUGEAgIAQcICA0GARMECAoGGQYMBQsHBwsFDAYZCQ0EArwSBg0IBwkICBAGBQoFAhICAQIDAQMFBQYQCAgBBwgIDQcBEgQICgYZBgwFCwcHCwUMBhkJDQQCAAAAAwAAAAAAqgEHAAsAFAAdAAA3HgE+AiYnJg4BFjciJjQ2MhYUBiciJjQ2MhYUBowECgkFAQQFBg8IAhEICwsQCwsICAsLEAsLKQMBBQgKCQMEAw0PVgsQCwsQC14LEAsLEAsAAAMAAAAAARwBHAAcADkARQAAEx4CBw4BIyInDwEjFQcjFQcjJzU/ASY1ND4CFzY3MTYuAgcOARUGFw8BFTM1NzM1NzM/ARYzMjc+AS4CBgcGHgE21RcjDAQGLx4NCw8HEwkcCjgJAl4EER0lLBIFAwkYIBEWHgEFAl4lCR0JFxEKDAwXAwMBBQgLCQIEAw0OARgFICsWHSYEEgMcChwJCSsHXQ0OEiMXCYoOFxEgGAkDBSQXDQwKXx4dCRwJEwMEQgQKCQYBBQQHDwgDAAYAAAAAARoBGgAvADYAOQA9AEAARwAAJSczNSM1IxUjFTMHIxUzHgEyNjczNSMnMxUjDwEXMzcvASM1MwcjFTMeATI2NzM1BwYiJiczBicjNx8BIz8BFyMXBiImJzMGARIeE14TXhMeBwIFGB4ZBQIIHzolCCUHqQclCCU6HwgCBRgfGAUCtwYPDAQvBAEmE3YXgxd2EyYgBg8MBC8EqUsTEhITSxMOEhIOE0uWBC8PDy8ElksTDhISDhMdAwcGBhktixwcii0cBAgGBgAAAAAGAAD//QEtARgABwALABcAHwAsADMAABMjBxUXMzc1BzcXDwEnMxc3MwcjIgYPARcHJyMXMzcmNzYXMhYVFA4BLgI2FzcnBycHF5kKb28Kc9ZeYWEFbSFRVCIPBxknCBMQFVEhbQoUBCsPERchEx8iGAcNLiIPHBAMGAEYTBBKShAIQUE/Qko3NwodFg0ODjdKDQk9CgEgGBEcDQYZISA/LQslDg8TAAAFAAAAAAEsARgABwALABcAHwAoAAATIwcVFzM3NQc3Fw8BJzMXNzMHIyIGDwEXBycjFzM3JjcUFjI2NCYiBpkKb28Kc9ZeYWEFbSFRVCIPBxknCBMQFVEhbQoUBBMgLyEhLyABGEwQSkoQCEFBP0JKNzcKHRYNDg43Sg0JDhchIS8hIQAEAAAAAAEMARgABwALABIAGQAAEzMXFQcjJzU3Bxc3BxczNyMHJxcnMxc3MwePCnNzCm90Xl5h020KcSJUUUxtIVFUInEBGEwQSkoQOUE/PzdKSjc3eUo3N0oAAAIAAAAAARoBGgAHAAsAABMHFRczNzUnFSM1MyYTE+ESEry8ARkS4RMT4RLz4QAAAAIAAAAAARoBGgAHAAsAABMHFRczNzUnBzUzFSYTE+ESEuG7ARkS4RMT4RLz4eEAAAMAAAAAARoBGgAHAAsADwAAEwcVFzM3NScHNTMVMzUzFSYTE+ESEuFLS0sBGRLhExPhEvPh4eHhAAAAAAUAAAAAARoBGgAHAAsADwATABcAABM3MxcVByMnNxUzNQczFSM3MxUjNyMVMxMT4RIS4RMT4c8mJjklJV0lJQEGExPhEhLh4eESExMTExMABAAAAAABGgEaAAcACwAPABMAABMHFRczNzUnBzUzFTc1MxU3MxUjJhMT4RIS4SUTcBMmJgEZEuETE+ES8+HhS5aWluEAAAAABAAAAAABGgEaAAcACwAPABMAABMHFRczNzUnBzUzFTM1MxUzNTMVJhMT4RIS4SUTcBMmARkS4RMT4RKolpaWlpaWAAADAAAAAAEaARoABwALAA8AABM3MxcVByMnNxUzNTMVMzUTE+ESEuETE5YSOQEHEhLhExPhlpbh4QAAAAADAAAAAAEaARoABwALAA8AABMHFRczNzUnBzUzFQczFSMmExPhEhLh4eHh4QEZE+ESEuETqZaWEjkAAAADAAAAAAEaARoABwALAA8AABM3MxcVByMnNxUzNTMVMzUTE+ESEuETEzgTlgEHEhLhExPh4eGWlgAAAAACAAAAAAEaARoABwALAAATBxUXMzc1Jwc1MxUmExPhEhLh4QEZEuETE+ESqJaWAAADAAAAAAEaARoABwALAA8AABMHFRczNzUnBzUzFTM1MxUmExPhEhLhSxKEARkT4RIS4RP04eHh4QAAAAACAAAAAAEaARoABwALAAATBxUXMzc1JxUjNTMmExPhEhKEhAEZEuETE+ES8+EAAAADAAAAAAEaARoABwALAA8AABMHFRczNzUnBzUzFTM1MxUmExPhEhLhgxNLARkT4RIS4RP04eHh4QAAAAACAAAAAAEaARoABwALAAATBxUXMzc1Jwc1MxUmExPhEhLhgwEZEuETE+ES8+HhAAACAAAAAAEaARoABwALAAATBxUXMzc1Jwc1MxUmExPhEhLh4QEZE+ESEuET4c7OAAAGAAAAAAEaAQcABwALABMAFwAfACMAABMHFRczNzUnBzUzFT8BMxcVByMnNxUzNQc3MxcVByMnNxUzNTgSEksTE0tLORI5EhI5EhI5SxI5EhI5EhI5AQcTvBISvBPPvLy8ExM4ExM4ODiDEhI5EhI5OTkAAAYAAAAAASgBBwAHAAsAEwAXAB8AIwAAPwEzFxUHIyc3FTM1Fz8BHwEPAS8BFzcvATczFxUHIyc3FTM1XgkmCQkmCRMSKQYjDEYFIwwyQBJBvwkmCQkmCRMS/QoKzgkJxby8BwwNBcIMDQXAsAawDAoKzgkJxby8AAMAAAAAARoBGgAIABIANwAANyIGFBYyNjQmFycHNyczNxczBycOAQcjFRQWOwEWFyMGJj0BNCYnLgE1NDc+AzMyHgEVFAcG4RchIS4hIQIZGAkWGwoKHBcfEh0HIwMDGgMFIgoPCgkMDgwFEBMVDBcnFwcEgyEuISEuIV0SEhwQHx8QUgMYEikCBAoIAQ8KHg0YCQsfERcTCg8LBhYnFxIOCQAAAwAAAAABHQEaADsAWABsAAA3Njc2PwE2NzY1NC4EIg4EBx4BFx4BHQEUHgI7ATI+AjUnIyYnFRQGKwEiJj0BMz4BMzcyFzY3Njc2MzAxJyYnJicmJwYHBgcGDwEXFhcWFxYXNjc2MhcWFxYUBwYHBiInJicmNKgFCAYEAgIHBQYLEBMVGBUTDwsGAQENDAoKAwcJBR4FCQcEAQIJBwMDHgIEJQMLBwIEMwYOCw0HBQcICAsICgQFCggLBwkHBwkHCwgKHwkGAgcCBgkCAgkGAgcCBgkCeAoIBQYHCAUNDwwVEw8LBgYLDxMVDBIdDAoXDR4FCQcDAwcJBQgBBg8CBAQCKQYIAVAYDwoFAgEBBQYKDhMTDgoGBQEBAQIEBgsNBQYJAgIJBgIGAgYJAwMJBgIGAAACAAAAAAD1ARoAIQArAAA3DgEdARQGBwYnIwYmPQE0JicuATU0Nz4DMzIeARUUBgcjFRQWOwEyNjXbCQsIBwQFHgsOCgkMDgwFDxMWDBcnFg0zKQMDHgIDigkYDR4HDQMCAQEPCh4NGAkLHxEXEwoPCwYWJxcSHi4pAgQDAwAAAAIAAAAAARoBGgAMABYAABMzFSMVMzUzFQcjJzUhFSM1Byc3IzUzHFVL4RIJ9AkBBhJ/DX5jegEZEuFLVQkJ9Hpjfg1/EgAAAAIAAAAAARoA9AAkAEkAADczMh4BHQEUDgErATUzMjY9ATQmKwEiBh0BHgEXFS4BPQE0PgEXNR4BHQEUDgErASIuAT0BND4BOwEVIyIGHQEUFjsBMjY3NS4BUzkSHRERHRIJCRMaGhM5ExsBFRAYIBEdoBggER0ROhIdEREdEgkJExoaEzoSGgEBFfQRHhEEER0SExsSBBMaGhMEEBkDEwMkGAQRHhFMEwMkGAQRHhERHhEEER0REhsSBBMaGhMEEBkAAAADAAAAAAEHAPQAAwAHAAsAADc1MxUnMxUjNxUjNXFLcZaWvOFLExNeE14TEwAAAAAEAAAAAAEHAPQAAwAHAAsADwAANzMVIxUzFSM1MxUjNTMVIyaoqJaW4eHOzoMSJhOEE0sTAAAAAAYAAAAAARoBBwAGAAoADgASADMAawAAEzczFSM1BzczFSMVMxUjFyMVMyc/ATY0JyYnJiIHBgcGBxUzNTQ/ATIzFxUWDwIVMzUjFzIXFhUUBwYHBiIuAS8BJicxMxUXFjM/Ai8BKwE1NzM/ASc0Jg8BBh0BIzU0Nz4CMh4CFAcrBw0NBzO7u7u7u7u70wEBAwECBwUIBQYCAQEQAQEBAgEBAQITJRELAgEDAQIHBQgFBAICAQEQAQIBAQEBAQEBBAQBAQEBAwEBAQ8DAQQGBwYGBAMBAAc5KgYCEzgTOBNSAQEFCAQHAgICAgcDAwEBAQIBAgEDAwMVCw06AgQGAwMHAgICAwIEAwQCAgEBAgIDAgwBAQMCAQEBAQECAQEGBQIDAgIDBwkEAAAAAAMAAAAAARoA9AADAAcACwAANzUzFSchFSE3FSM1E6mpAQb++s7OSxMTXhNeExMAAAUAAAAAAQcA9AADAAcACwAPABMAADczFSMVMxUjNTMVIyczFSM7ARUjS6mpg4O8vDjOzjgTE4MSJhOEE0sTqQAIAAAAAAEaAPQAAwAHAAsADwATABcAGwAfAAA3IxUzFSMVMwczFSMXIxUzNzMVIxcjFTMHMxUjFyMVMyYTExMTExMTExMTJc7Ozs7Ozs7Ozs7O9BMlEyYSJhO8EyUTJhImEwAABAAAAAABIwEgABYAJwAzAD8AABM3FxUHJzUjIgcGBwYHJyY3PgMXMxcVNycVIyYGBwYHNjc2NzYzBz4BHgIGBwYuATYXHgE+AiYnJg4BFqwSZGQSCB8PFhQVFxMBBAQZKDAaDRZHRiQYLhEVCRQUEhYPHEIMHRoQAg0MEysZCR4HERAJAggHDBoPBgEXCVARTAkjAwQNDx4GDg4ZLCARAUEjNjghARERFh0TCggDAkoJAg0YHRsHDAkkLDsFAggPERAECAYWGgABAAAAAAEYARoADwAAJS4CIg4BByM+AjIeARcBBQUfMDYwHwUTBSU4QDglBakaKxgYKxogMx0dMyAAAAAEAAAAAADiARAAEAAeACcAMwAANy4BIzEiDgIfATM3Nic0Jic7AR4BFxQPAScmNT4BFyYOAR4BPgEmJz4BHgIGBwYuATbLChwPFSIUAQw7CjsMAQtBAQIWIAEJMDAJASAiBhAIAw0PCQMmCBUSCwEJCQweEQX6CgwVIioSd3cSFg8bDgEhFxANYWENEBchKAUDDQ8JAw0PFAYCCREVEgUIBhkeAAMAAAAAAPQBBwAHAAsAGwAAPwEzFxUHIyc3FTM1JzU0JiIGHQEzNTQ2MhYdATgTlhMTlhMTlhMhLiETFSAVlhMTXhISXl5eEyUYISEYJSUQFhYQJQAAAAADAAAAAAEHARoAEQAZAB0AADcjNTQuASIOAR0BIwcVFzM3NSc0PgEWHQEjFyM1M/QTFCMoIxQTEhK8E6khLiFwlry8qSUVIhQUIhUlE3ATE3A4GCABIRglg3AAAAQAAAAAARoBEAAWABoAHgAwAAATIg4BHQEXMzc1NDYyFh0BFzM3NTQuAQcjNTMXIzUzJzU0JiIGBxUjNTQ+ATIeAR0BliQ8IxM4ExYeFxI5EiM8XDg4qTk5OSAuIQE4HjQ8NB8BECM8JF4TE14PFhYPXhMTXiQ8I+E4ODgTExggHxYWEx40Hh40HhMAAwAAAAABGgEPAAcADAAUAAATIwcVFzM3NScXByMnFyM1HwEzPwGbCn4J9AmDahqgGNnhFAioCBUBD0uVCQmVOD8dHYVyGgMDGgAAAAMAAAAAARoA9AAHAA0AEAAAPwEzFxUHIyc3FTM1ByM3IxcTCfQJCfQJE+FrDGS8XuoKCqgKCpWMjFJcSQAAAAADAAAAAAEHAPQAAwAHAAsAADcVNzUXNScVFzU3FSZBSzhLQsWNKY2wjSONI40pjQADAAAAAAD0AQcAAwAHAAsAABMzByMXIyczFyMHM2eNKY2wjSONI40pjQEHQks4S0EAAAAABAAAAAAA/AEQAAMABwAVABkAADczByMVMxcjPwEnIw8BFRcHFzM/ATUHMwcjbHcjd3cjd2QsCI0ILywsCI0IL5B3I3f9OBM4QkYOBUsJRkcOBUsJDjgAAAQAAAAAARAA/AADAAcAFQAZAAA3FTc1MxUXNQ8BJzU/ATMXNxcVDwEjNxU3NS84EzhBRw4FSwlHRg4FSwkOOMB3I3d3I3dkLAiNCC8sLAiNCC+QdyN3AAACAAAAAAEaAM8AEAAXAAA3MxUjNwcjJxQVFyM1MxcWFzc1IxUjFzd3JxsBIRchARkoDw4BnCUkNzbOemNjYwcvLXorKwQWQkI2NgAAAwAAAAABGgDuAA8AFwAbAAA/ARcVBycOAi4CNy8BNRcGFRQeATY3Jxc1BybnDAxyAw8VFg8GAyYIQAELEA4CWNfXrUAKoQoeCw8GBRAVCwoKJD0CAgkMAggILDmKPQAAAgAAAAAA7gD1ADgAQgAANwYnBi4CNzQ+AjMyFxYVFAYjIjUOASMiJjQ+ATM2Fhc3MwcGFjMyNjU0JiMiDgEVBh4CNxY3JxQzMjY3NiMiBsQaHxEhGQwBDh0mFCQWGR8XFQYRCg4RDRcNCQ8DBBEPAwMGDhUlHxglFQEJFBsOHBlMEQsQBAkZDhJEDwEBDBkgEhQnHRATFSMeJxIJCRMiHRIBCggPPA0KHxYdIBgpGA8aFAoBAQ04FxIRJB4AAAAAAwAAAAABLADhAAMABwALAAAlITUhFSE1ITUhNSEBLP7UASz+1AEs/tQBLM4TqRM4EwAAAAIAAAAAAOsA/gAmADsAADcnIwcXNxUxFTEVFB8BFhceAR8BHgIdATM1NC4CLwEuAjcnFwc2NyYvAQYPAQ4DHQEzNTQ+ATfFKA4oDRUBAgICBA0HDgcMBxoFCwwHDQYLBgEBFTQDAwcEAgUGDQcMCwUaBwwH1SgoDRQTCQYFBQsGBgsRCA8HERMNERENGBIQBw4GEBQLHRRTBAMKDAUHBg4HDxMYDRERDRMRBwADAAAAAAD+ARAACwAPACMAADc0NjIWHQEUBiImNRc1MxUnBi4BNTMUHgE7ATI+ATUzFA4BI14hLiEhLiEvEhIaKxkTFCIVEhUiFBMZKxrYFyEhF0sYISEYjSYmJgEaKxkUIxQUIxQZKxkAAAAEAAAAAAD+ARoACwAcACAANAAANzU0NjIWHQEUBiImNyIOAR0BFB4BMj4BPQE0LgEDNTMVJwYuATUzFB4BOwEyPgE1MxQOASNnHCYcHCYcLxIeEhIeJB4SEh4bEhIaKxkTFCIVEhUiFBMZKxqNSxMcHBNLFBsboBEfEUsSHhISHhJLER8R/ucmJiYBGisZFCMUFCMUGSsZAAMAAAAAARoBGgARABYAGgAAEyMVIwcVFzMVMzUzPwE1LwEjFyM1MxcnMxUjlhNnCQlnE1QHKCgHVFDAwB+nXl4BGSUKSwmDgwImDiUDSzgcCRIAAAMAAAAAARoBGgAKABUAJQAAEx8BFQcnByc1PwEfATUnFSM1BxU3MT8BFxUHJzcjFwcnNTcXBzOhdAQOdXUOBHQVZ2cTZ2cjDi4uDR5xHg0uLg0fcgEZSwesCEtLCKwHS6tClkI2NkKWQloNLw0uDR4eDS4NLw0fAAMAAAAAARoA9AATAB4AIgAAJScjBxUzNRcGHQEfATM/ATU0JzcHFQcnNTY3FzM3Fi8BNxcBGYAGgBMrDwVLCEkGDz9CQUIBDTEHMA1BZ2dnwjIyd14RFRoIByIiCAgZFRlHAR4eARYSExMSESgoKAAEAAAAAAEQARoACQATAB0AJwAANwc1IxUnBxczNycXNxUzNRc3JyMPATMVIxcHJzU3FzMnNxcVByc3I8AhEiENMA4wbg0hEiENMA41IUFBIQ0xMWVBIQ0xMQ0hQWMgQEAgDTAwkw0gQEAgDTBQIBMgDjENMC0gDTANMQ4gAAAAAAUAAAAAARoBGgAMABAAGAAcACAAABM3MxcVByM1MzUjFSM3FTM1DwEVFzM3NScHNTMVBzMVI3EJlgkJLyaEEhKE6wkJlgoKjIODg4MBEAkJgwoTSxM5ExNeCoMJCYMKJhMTEksAAAAABQAAAAABBwEHAAwAFQAnACsANAAAJSMVJiMiBhQWPgE9AQcyFhQGIiY+ATcPARUmIw4BFBYyNj0BNxUzNQcVBzUHMhYUBiImNDYBBxMNDxQbGycbLgsRERcRARAxlgkNDxQbGycbhBMTgy8LEREXEBCpLwkbJxwBGxNVOBEXEREXEZUJCY0KARsnGxsUcQgSVAolCSaNERcQEBcRAAAAAAMAAAAAARkBFwAJABEAHQAANzM3FxUHJyMnNR8BNQ8BIxUzNxcHFwcnByc3JzcXHDRJEBBJNAlIOzsHLi63DSAgDSEgDSAgDSDOSAb0BkgJXlg7xzsCS0kNICENICANISANIAADAAAAAAEsARoAEAATAB8AABMfARUjNSM1IxUzFSMnNTczBxUzFyM1IzUzNTMVMxUjskACE0teS1QJCX4ENhUTODgTODgBF0EIJRNLzxIJ4QkSOc44Ezg4EwAAAAMAAAAAASwBGgASABwAKAAAASMvASMHFRczNSM1Mz8BMwczNQcjDwEjNTMfATMHIzUjNTM1MxUzFSMBEH8QB14JCWdeVQYQdwETE3oGEFBQEAd6ExM4OBM4OAEHDwMJzgoTcQIQJVQcAxA4EAL0OBM4OBMAAQAAAAAA9ADFABEAADcVFAYrATcnBxUXNyczMjY9AeEFBIEeDTAwDR6BCxHFJQQGHw0wCjANHxAMJQAABAAAAAABGgDSAAgADwAWACgAADc2HgEOAS4BNhcuAQ4BFh8BHgE+ASYnNxUUBisBNycHFRc3JzMyNj0BLBMuGgknLhoJRgkUEgoBBQ0JFBIKAQWcBgRNHg0wMA0eTQwQxQ0JJy4aCScuAgUBChIUCQ0FAQoSFAklJQQFHg4wCy8NHhAMJQAAAAUAAAAAARoBBwAHAAsADwATABcAABMzFxUHIyc1FxUzNQczFSMXIxUzBzMVIxz0CQn0CRPhvJaWcXFxcUtLAQcKuwoKuwmpqSYSExMTEgAAFwAAAAABLAEsAAMABwALAA8AEwAXABsAHwAjACcAKwAvADMANwA7AD8AQwBLAE8AUwBXAFsAXwAANyM1MxUjNTMVIzUzFSM1MxUjNTMdASM1FzMVIzczFSMDIzUzFyM1OwIVIzMjNTMXIzUzFyM1MxU1Mx0BIzUzKwE1Mxc3MxcVByMnNxUzNRczFSMVMxUjFTMVIyczFSMTExMTExMTExMTExMTExMlExMlExMlEhITExM4EhImExMlEhITExPOExNLE4MTE4MTE4MlExMTExMTll5ezhM4EzkTOBM5EyUTExMTExMBGRMTExMTExMTEyUSEiYTE0sSEqkTE6mpqRMmEiYTJYMTAAAAAAcAAAAAARoBGgAHAAsAEwAXABsAHwAjAAATNzMXFQcjJzcVMzUHNzMXFQcjJzcVMzUXIxUzBzMVIxcjFTMmEqkTE6kSEqmWE14SEl4TE15dEhISEhISEhIBBxIS4RMT4eHhJhMTExISExMTEyUTJRMmAAAABAAAAAABGgD6ACUAQABJAFIAACU2NzYnIyYHBgcGByYiByYnJgcxBhcWFwYVFBcWFxYyNzY3NjU0ByInJicmNTQ3NjcyFxYyNzYzFhcWFRQHBgcGJyIGFBYyNjQmMyIGFBYyNjQmAQQDAQEHBAQGCAkMDhJCEhkSCQUHAQEDFREPHxpTGx8PEYMhEBgMDREIDwoWERISFQoPCBENDBgQSggMDBAMDEoIDAwQDAzCCAoSEgECAQUFCQUFEAQCARISCggXICkYFQoICAoVGCkgeAMECwwZEw8IAgEBAQECCA8TGA0LBANSERgRERgRERgRERgRAAQAAAAAAS0BGgAMABAAIgAuAAATMxcVJic1IxUHIyc1FzM1IxciByMOARcHFzceAT4CLgIHBi4BPgIeAg4BOM8SCQpdFVwSEl5ewwwKAREJCywNLAkXFQ8HBA0VCAoPBwQMEBAJAQYMARkSZAQCXswVEs/Pz3EHCicRLA0sBgMIEBUWEgpLAQsPEQwDBg0PDggAAAAKAAAAAAEaARwACwAXACQALQBIAGIAdwCSAJ4ApwAANw4BLgI2NzYeAQYnLgEOAhYXFj4BJjc2FhceAQ4CJicmNhcWMjY0JiIGFAczFSMiJj0BIiY9ATQ2OwEGByMiBh0BMxUUFjcmKwEiBh0BFBYzFQYXFhczPgE9ATI2PQE0ByMVFAYrASImPQEjNSY2OwEyHgEVFyM1MzI2PQEzNTQmKwEmJzMyFh0BFAYjFRQGJyIOAR4CPgE1NCYHIiY0NjIWFAarCRQSCwIKCA0eEgYYBAoJBgEFBQYPCAMrCRQHBQQDCQ4RBgkCFAMIBQUIBZwiIgkOBwsTDiIHAxgGCRMCiwoOLg4TCwgBBwUHJggLBwsSEwICHgICEgEJBi4FBwM0IiIBAxMJBhgDByIOEwsHDq4JDgYDDBEQCRAMBAUFCAUF1QYCCREUEgYIBhkfJgMBBAkKCQMEBAwPBAUCBwUNDgsGAwYKGhYDBQgGBgilEw0KIgwIKQ0UCAsJBSo1AgJ6ChQOOwgMLAkHBQECDAgsDAg8DUo/AQICAT89BQkFBwJ2EwICNSoFCQsIFA0pCAwiCg3ZChARDAMGDwgMESYFCAYGCAUAAAAFAAAAAAEHASwAFQAZAB0AIQAlAAATFRcVByMnNTc1MxUzNTMVMzUzFTM1AzM1IxczFSMXIxUzBzMVI/QTE7wSEhMmEiYTJam8vCZwcHBwcHBwcAEsExL0ExP0EhMTExMTExP+5/QmEzgTOBMAAAAABAAAAAABGgD0AAoAEAAUABwAADcfARUPAS8BNT8BFwcfAT8BBxc1JxcVNzUHFQc1oWwMB3NzBgtrBEsKQDkRsV5ecV4mE/QdCX4JICAJfgkdExMDEQ8FdxpsGRlsGmsKMAUwAAMAAAAAARIBGgAjAC0AQgAAJSc1JzU0JyYnJiMiBh0BBwYUHwEWFxY3Nj8BBxQeAjI+AicmPgIeAR0BBxcOASYvASY0PwEVBhQeAT4BJic1FwERFlwCBAsGBQwQOQkJRAQFCwoFBF0NAQYHCggGApYBAQMEBgQSEwEFBgFEAwNSBQYKCQQDBEhPOgFcFwYFCwQCEAw9OAgXCUQEAgQEAgRdKgQJBwQEBwizAgQDAQEFBBcTqgICAgJEAggDUTUECwkDBQkKAzVJAAAAAAIAAAAAARoBGgAMABMAADcyPgE0LgEiDgEUHgE3Iyc3FzcXliQ8IyM8SDwjIzwRDSsNJE8NEyM8SDwjIzxIPCNNKw0kTw0AAAMAAAAAARYBGwAGABwALwAANzM3JwcnBzceARcWFRQHDgEHBicuAzc2Nz4BFzY3Nic0JicmJyYGBw4BFhceAXYNVQ1PJA1WFikQJh4PJhYwJxQeEAMHDyYSKyEmGRkCEQ8dJhMmDyAXISIQJmBWDU8kDY4BFBApNysnEhcECRYLIiouFS4ZDAz0CR8iJRcqEB0DAQkLGE5IEwoGAAUAAAAAAQcA/gADAAwAFQAeACcAAD8BFwc3IiY0NjIWFAYHMjY0JiIGFBYXIiY+ATIWFAYHMjY0JiIGFBZElg6WAgsRERcREQwUGxsnGxuXDBEBEBcREQsTHBwnGxs+vAy8gBEXEBAXERMcJxsbJxxdEBcRERcQExsnHBwnGwAABAAAAAABGgEbAAsAFwAjAEUAADcjFSMVMxUzNTM1IycuAQ4CFhcWPgEmJz4BHgIGBwYuATYXMzIWHQEjNTQmKwEiBh0BMxUUFjsBFSMiJjc1IiY3NTQ29BMlJRMlJVQECgkFAQQFBg8JAyYJFBILAgoIDR4RBgouDhMSCQYuBgkTAgIPDwkOAQkLARNxJhMlJRO4AwEFCAoJAwQDDQ8UBgEJERQSBQkHGR5FEw4ODgYICAYzPwECEw0JLAwIMg4TAAAAAAQAAAAAAM8BGgAIABEAKQA9AAATMhYUBiImNDY3IgYeATI2NCYXIyIGHQEGFjMVBhY7ATI2PQEyNic1NCYHNSY2OwEyFgcVIxUUBisBIiY9AZYICwsQCwsIEBYBFSAWFgcuDhMBCwkBDgkeCg0ICwETSgEJBi4GCQESAgIeAgIBBwsQCwsQCxIWHxYWHxZUEw4yCAwsCQ0NCisMCDIOE1QzBggIBjM/AQICAT8AAAAAAQAAAAABLAEHAC0AABMHFTM1MxUXMzc1MxUXMzc1MxUXMzc1MxUjNSMVIzUjFSM1IxUjNSMVFyE3NScTExMlChIKJQoSCiUKEgolOBMvEi8TOBMTAQYTEwEHE3FxZwoKZ2cKCmdnCgpnvDk5OTk5OUtLEhK8EwAABAAAAAABGgEaAAUADgAbAC0AADczLgEnFTceARcWFSM1MgcXMw4BIyIuATU0NjcXMj4BNzY1IzUiBw4CFxQeAbxJBigcASMzBgFwCS8TXAczIhksGSsgExswIAQCcQkKGisZAR4zvBsoBklcBjMjCglwgxMgKxksGSIzB8wYKxoKCXECBCAwGx8zHgACAAAAAAEHAOEAHAA3AAAlFSMiJicjDgMrATUjJzczNTMyFhcWFzM+ATMHBgcGDwEjJyYnLgEnFT4BNzY/ATMXFh8BFhcBBwYLEwc2BAwPEgoJPBMTPAkKEQgQCDYHEwsJAwMFAwRNAgQJBA8GBg8ECQQCTQQBAgUCBM6DCgkJDgoFSwoJSwUFChIJChQBAgMGBQYMCAMHAYMBBwQICwcGAwIEAgEAAAACAAAAAAEtAQcANgBQAAATMxUUBgcVHgEXBgcxJi8BNTc2PwE2NyMWFxYfARUHBgcOAQczBgcjFQcnNSM1NDY3Njc1LgE1Fz4CFx4BFxYUBw4BBwYiJy4BJyY2NzY3NkuDCQoJDQQJCAkMBgUDAgQCAVsCAQQFBgcLCAQHAV4FBAoJCksGBAoSCQqMBw4PCA4VBAICBBUOCA8HDhYEAgEBBQwEAQcGCxMHNgQLBgMFCgQCTQQBAgUDAwQCBQMETQIECQQPBgcIPBMTPAkKEQgQCDYHEwuYBAMBAwMVDwcPCA4VBAICBBUOCA8HEAsEAAACAAAAAADhAQcAHAA3AAATMxUUBgcVHgMdASMVByc1IzU0Njc2NzUuATUXFhcWHwEVBwYHDgEHMy4BJyYvATU3Nj8BNjdLgwkKCQ4KBUsJCksGBAoSCQoUAgEEBQYHCwgEBwGDAQYECAwGBQMCBAIBAQcGCxMHNgQMDxIKCTwTEzwJChEIEAg2BxMLCQQCBQMETQIECQQPBgYPBAkEAk0EAQIFAwMAAAAEAAAAAAEWARsAFQAoAC4AMQAAEx4BFxYVFAcOAQcGJy4DNzY3PgEXNjc2JzQmJyYnJgYHDgEWFx4BJzcXFQcnNxU3oRYpECYeDyYWMCcUHhADBw8mEishJhkZAhEPHSYTJg8gFyEiECYnDlRUDhI6ARkBFBApNysnEhcECRYLIiouFS4ZDAz0CR8iJRcqEB0DAQkLGE5IEwoGqwg4EDgIX04nAAIAAAAAAPABBwAFAAgAABMHFRc3NQc1F0cPD6mljwEHCOEIcBBnvl8AAAAAAgAAAAAA4gEaABUAHwAAEyMVIwcVFBYXFTM1PgE9AScjNSMVIxcOAS4BPQEzFRSDEh0JJR0SHSUJHBMmOwwiHxNwARk4CUIcKwM5OQMrHEIJODhzDAYNHBE4OBcAAAAABQAAAAABDQDvAAcADwAfACcALwAANyMnIwcjNzMXJyYnMQYPARc1MzIWFRQGBxUeARUUBiMnFTMyNjU0IwcVMzI2NTQjoBMPPg4TOBEQFwEBAQIWbikTFg4LDhIbFBkRDhAcExcPECNeKCiQWT4DBwcDPjeQEg8MEgQBARMPEheBLw4MFT40DgwaAAAIAAAAAAEaAQcABwALAA8AEwAXABsAHwAjAAATMxcVByMnNRczNSMXIxUzJyM1MwczNSMXMxUjJyMVMwczFSMm4RIS4RMT4eHOvLwTlpY4S0sTJSU5S0tLS0sBBxO8EhK8vLwTOBMSg0sTJTgTJRMAAgAAAAAA6wDrAAcACwAAPwEzFxUHIyc3FTM1QgmWCQmWCRKE4QkJlgkJjYSEAAAABQAAAAABGgEaAAcACwAPABMAFwAAEzMXFQcjJzUXMzUjFzMVIzcjFTM3MxUjHPQJCfQJE+HhEiYmcSYmJSYmARkJ9AkJ9OrhE7y8cXGWAAABAAAAAAEaAPQAEgAANycjBycjByMVMz8BFzM3HwEzNd0hEyMWEhY1PAoNFhMjGwlDg3F9XVESBzJfhFgGEgAABAAAAAABBwEaAAwAGQA8AEAAABMiDgEUHgEyPgE0LgEHIi4BPgIyHgEUDgE3LgEiDgIHMzQ+ATIeAhQGDwEOARcVMzU0Nj8BPgI0JgczFSONITghIThCOCEhOCEcMBwBGzA4LxwcLwEFDxEPCgQBFwUHBgUEAgQDDgMEARYEAwcEBgQELhUVARkhOEI4ICA4Qjgh4RwvODAcHDA4LxyeBQYGCw0HBQcDAQMFCAkEEAQJBQwJBAgECAQKCw0MXhYAAgAAAAABCgENABAAIgAANw4BFTIzMhYUBiMiJjU0NjcXDgEVMjMyFhQGIyImNTQ2NxeGIyADBRMcGhUbHS8vmSQgAwUTHBoVGx0wLhbqFjMkGCsbKiY1ThsjFjMkGCsbKiY1ThsjAAAIAAAAAAEZARoADAAZACUAMQBDAE4AUgBWAAA3NDY3Jw4BFBYXNy4BNxQWFzcuATQ2NycOARcnPgE0Jic3HgEUBjcHHgEUBgcXPgE0JgcWDwEXBycjByc3LgE+Ah4BBw4CHgEyNjQuARcjBzMXJyMHOBAPDhETExEODxAUDQwNCQoKCQ0MDZAOCgoKCg4LDQ0ODQ4QEA4NERMTSwEFBUARDmgPEUAFBAcNDw0JHgIEAQIFBgYEBQIFESYZETYQwxUmDg0RLDEsEQ0OJhQQHwwNCRgaGAkODB9NDgkYGhgJDQwfIR+GDQ4mKSYODREsMSxCCggEkQghIQiRBhAQCQEGDAEBBAUFAwUHBAInJDglJQAAAAAFAAAAAAEaAQsAFQAeACoAMwA/AAA3FAczNi4BDgIeATc1Bi4BPgIeAQcyNjQmIgYUFhcyNxcOASImJzceATcyNjQmIgYUFhczFTMVIxUjNSM1M+EBEwMgO0AuDBw5IBouGAYjMzEeeggLCxALCy4UDg0JGRsZCQ0HEi8ICwsQCws3EyUlEyUlnwQFIDkcDC5AOyADEwMYLzQnDRMrEQsPCwsPCy8ODQkLCwoNBwgvCw8LCw8LOCYTJSUTAA4AAAAAARoA9AAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AEMAACUjIgYdARQWOwEyNj0BNCYHIzUzByMVMwcjFTM3MxUjFyMVMyczFSM3IxUzJzMVIxUjFTMHMxUjNTMVIzcjFTMHMxUjAQfPCAoKCM8HCwsHz885EhISExMlExMTExODXV2DJiZeExMTE0sTExMTOBISOCYm9AsIgwgLCwiDCAuWgxMSExM4EjkSEhI4EzgSExMTEl0SEhITEwAAAAADAAAAAADiAOEACAAVAB4AADcyNjQmIgYUFjcUDgEiLgE0PgEyHgEHNCYiBhQWMjaWCAsLEAsLUxQjKCMUFCMoIxQTIS4hIS4hgwsQCwsQCxMUIxQUIygjFBQjFBchIS4hIQAAAwAAAAABFgEbAAgAHgAxAAA3MjY0JiIGHgE3HgEXFhUUBw4BBwYnLgM3Njc+ARc2NzYnNCYnJicmBgcOARYXHgGWEBYWIBYBFRsWKRAmHg8mFjAnFB4QAwcPJhIrISYZGQIRDx0mEyYPIBchIhAmcRUgFhYgFagBFBApNysnEhcECRYLIiouFS4ZDAz0CR8iJRcqEB0DAQkLGE5IEwoGAAEAAAAAAOsBCgAZAAATFQcjNTMnLgEOAhYfAQcnLgE+AhYfATXqCUIwEg0iIxkKCg1hDWIQDAwhLCwRDQEHQgkSEg0JCRkjIwxiDWERLCwhCwsRDScAAAAKAAAAAAEqASwAFQAdACEALgAyADYAOgA+AEIARwAANwcnNyMiBhQWOwEVIy4BNDY3Myc3FxMjJzU3MxcVJzM1IzczFxUHIzUzNSMVIzUXIxUzBzMVIxcjFTM3MxUjFyMVMycxMxUjiysOGjwNERENCwsUHBwUPBoOK0V4Cgp4CnhkZEZ4CgoyKGQUFDw8PDw8PDw8FDw8PBQUKioW8ysOGhEZEhQBHSgdARoOK/7/CqAKCqAKjHgKoAoUjDxGghQUFBQUyBQ8FDwUAAABAAAAAAEJAQcAHQAANyM1MxcVIzUOAR4BPgImJzceAg4DLgI+AVgyQQoTGhEaOUArBSQfBRklEgQaKzMxJRIEGvQTCkElEz88HwswQTUKEggjMDMsHQcQIzAzLAAAAAACAAAAAAEIAQcAEQAVAAATMxU3FwcXBycVIzUHJzcnNxcHMxUjvBIwCTAwCTASMAkwMAkwlktLAQc7HRAdHhAdOjodEB4dEB1bSwAABQAAAAABLQESABIAHwAsADIAOAAAEzMXFSYnNSMVMxQXIzUzNSMnNRciDgEUHgEyPgE0LgEHIi4BND4BMh4BFA4BNyc3FwcXJxcHFzcnEf4JCQrqYRROOmsK1xUkFRUkKiQVFSQVEBsQEBsgGw8PGxAaGgkTE0sSEggbGwERCWwHBVawIBoTFAnEbBUkKiQVFSQqJBWIDxsgGxAQGyAbDycbGwkSExESEwgbGwAAAAACAAAAAADyARoABgANAAA3JzcnBxUXJxcHFzc1J/JLSwxQUK5NTQxSUnlKSwtQDFBWTUwMUwtSAAEAAAAAARoAqQADAAAlITUhARn++gEGlhMAAAALAAAAAAEaARoACwAVACYAOgBEAFgAYQBzAHsAfwCGAAA3NjIWFAYiJwcjNTMVFBYyNjQmIgYVByc3FzU0NjsBFSMiBh0BNxc3MzU0IyIGBxU2Mg8BBhUUFjMyPwEVFAYiJjU0PwEHIzUGIyImNTQ/ATQiBzU+ATcyFQc1BwYVFBYyNhcyNzUGIiY0NjIXNSYnIgYUFic3MxcVByMnNxUzNSc3MxcVBzXaBA4ICQ4DAQsLBAcEAwcFjCcMEw8LLCwEBRIMOw0SBAkDBw8BCw4HBggEAQUGAwYHLAwECAYHDgsOBwMJBBEMBwYDBgQ3CQUFDAcICwQDCAwODX0SqRMTqRISqXAShBIS+gkOGA8HBko0BAcIDgcIBU4oDBMdChARBgMdEgwNIBcDAgwFCQEDEAcJCRIEBAcEAgcBAa8HCQkHEAMBCQUMAgIBFwsEAQEHAgQGEgMOBAgOCQQOAgEQGg9LExNdExNdXV0mExNeE3EAAAAGAAAAAADiARoAEAAdACcAOgBCAEYAADcXNycHNTQ2OwE1IyIGHQEnFzMWPgE0JiIHJyMVMz0BNDYyFhQGIiYHBiMiJjUmNjMyFxUmIgYUFjI3JwcVFzM3NScHMxUjPCspDRMGAx0cDBAUbwEFFQ0LFgYBEBAGCwYGCwYQBw4QEwEWEQwGBxELChEIXhMTgxMTg4OD5isqDRMeBAYSEAweFC8JARIeEQsnXBsHBwgJEQoJlgUUEBIVAxMFCxMLBVsTcBMTcBMTcAAAAAABAAAAAAEHAQQAFQAAEwcVFzcnMzIWFxYdATM1NC4CKwE3dktLDj0kJzQQHhMRJjwpIjsBBEwNSw08EBAfRwYGJzkmEzoAAAAJAAAAAAEaARoAKAAsADAANAA7AEsAUwBXAFsAADcjNTM1IyIOAh0BBhYXFhczNSMiJyYnND0BNDU2NzY7ARUjFTM3NSMnIxUzBzMVIxUzFSMXIzUzFSMnNzMXFQcjFSM1IyImPQE0NhczNSMiBh4BOwE1IyczNSP0qUtQBg0JBAELCgYGBQUDAgYCAgYCA65LVAoTgxMTExMTExMFBTgFF0JUCQkvExIICwsRCQkEBgEFICYmEzk5cZYSBQoMBrIKEAQCARMBAwUDAgoCAwUDASYTClRxExMSExODODgc6glxCRMTCwheBwtwEwYIBRMSOQAABwAAAAABGgEsAA8AHwAvAD8ARwBXAGAAADcxMhYVMRQGIzEiJjUxNDYXMTIWFTEUBiMxIiY1MTQ2NzEyFhUxFAYjMSImNTE0NjcxMhYVMRQGIzEiJjUxNDYHMzcXByMnNxcjFTMeATI2NzM1Iy4BIgYXFAYiLgE+ARafBAYGBAQFBQQEBgYEBAUFBAQGBgQEBQUEBAYGBAQFBQUTRA1UDVUODDg4BCUxJQM5OQMlMSVsGycbARwnG+EFBAQGBgQEBSUGBAQFBQQEBksGBAQFBQQEBiUFBAQGBgQEBXlFDlRUDq0TGCAgGBMYICAhFBsbJxsBHAAAAAAEAAAAAAEaARoACQATACMALAAANxUzNRc3JyMHFzcVMzUXNycjBx8BIxUzHgEyNjczNSMuASIGFxQGIi4BPgEWlhNEDVQNVQ5EE0QNVA1VDgw4OAQlMSUDOTkDJTElbBsnGwEcJxv8EhJEDVRUDQwuLkUOVFQONBMYICAYExggICEUGxsnGwEcAAAAAAQAAAAAAQcBCAAvADgAQQBKAAAlNC4BDgEWFxUUDwEnJj0BPgEuASIOARYXFRQWHwEVDgEeATI+ASYnNTc+AT0BPgEnNDYyFhQGIiYXFAYiJjQ2MhY3IiY0NjIWFAYBBxQeFwQQDgU0NAUOEAQVHBUEEA4IBzMOEAQVHRUDEA0yCAgMD7sLEAoKEAtnCxALCxALLwgLCxALC+EPFQMTHBkDFAYDGhoDBhQDGBwSEhwYAxQIDgMbGAQXHBMTHBcEGBoEDggUAxQNCAsLEAsLoQgKChALC44LEAsLEAsAAAAAAwAAAAABGgEsAA8AGAAiAAA3IxUzHgEyNjczNSMuASIGFxQGIi4BPgEWJzUzFTcXByMnN144OAQlMSUDOTkDJTElbBsnGwEcJxs4E0QNVA1VDksTGCAgGBMYICAhFBsbJxsBHF55eUUOVFQOAAAAAAMAAAAAARoBGgAJABkAIgAANxUzNRc3JyMHHwEjFTMeATI2NzM1Iy4BIgYXFAYiLgE+ARaWE0QNVA1VDgw4OAQlMSUDOTkDJTElbBsnGwEcJxv8ZmZEDVRUDW0TGCAgGBMYICAhFBsbJxsBHAAAAAAGAAAAAAEHARoAJgAqAC4AMgA2AD0AACU1JyMiBwYHBgcVFBcWFxY7ATUjIicmJyY9ATQ3Njc2OwEVIxUzNyc1MxUnMxUjFTMVIxcjFTMXByM1MxUjAQcKtwYGDQUCAQMFDQYGBQUDAgYCAQECBgIDrktUCryplhMTExMTExMJFwU4BXGfCQIGDQYGsgYGDQUCEgEDBQMCCgIDBQMBJhIJQpaWgxMTEhMTZxw4OAAAAAQAAAAAARoBGgALABQAGAAcAAATMxcVByMHJzUjJzUXMzUjFTMXFT8BMxUjFTM1Ixz0CQl/NhAvCXp64S4KKAcSEhISARkJvAk2By8JvLKpqQohKJleJRIAAAAABAAAAAABBwEaAAkADgAaAB4AABMfARUHIyc1NzMHMzUnIxcjFTMVMzUzNSM1IwczFSPJOAUSqRMTcHCpOXBLJSUTJSUTJV1dARQ4DqgTE+ES86g5SxMmJhMlgxMAAAAABwAAAAABGgEsAAgAEQAaACMAMABWAGYAADcUBiImNDYyFgcUFjI2NCYiBhcUFjI2NCYiBhcUBiImNDYyFgc2NxcOASImJzceAT8BFAYHFTMyFh0BFxUHFRQGKwEiJj0BJzU3NTQ2OwE1LgE1NDYyFgciBh0BFBY7AT4BPQE0JiOWFh8WFh8WOAsPCwsPCzgWHxYWHxY4Cw8LCw8LLg4LDQkZHBkKDQkYDRIKCS8YIBMSIRhwGCATEyAYLwkKEBgQVBAWFhBwEBYWEJYQFRUgFRUQCAsLEAsLCBAVFSAVFRAICwsQCwtFAwsNCgoKCg0JBwK3CQ8DASEXExMlExMXISEXExMlExMXIQEDDwkMEBA7Fg9xEBYBFRBxDxYAAAAABgAAAAABGgEaABEAFgAbACgALgA3AAABIgcGByMHFR8CMzc1Njc2NQczBgcnFyc2NxUvATY3Njc2NwYHBgcGBzUjNSMVNzYuAQ4BHgE2ARAvLiUkTgkDcAc4CSETF/MxFxMHagcbF0BAEBUjJDAvAx4XJBdIJRO3BgUTFw0FExcBGRcTIQk4B3ECCU4kJS4vVBgbB2oHExcxFUAYFyQXHgMvMCQjFTgTJTiQCRcNBRMXDQUABAAAAAABJQEHAB4AKAA1AD4AADc1NzMfATMXFTMXDwEjNjczNyMmJz8BMzUjLwEjFQYXFAYiJjQ2MhYVMxQOASIuATQ+ATIeAQcyNjQmIgYUFhMJXgYRbAoVCTIJRgcFMy1sBggDBlVnBxBQClURFxERFxAmEh4jHxERHyMeEkIUGxsnGxu3RgoDEAouDIQGCApxBwYDAyUDEDEFVwwQEBgQEAwSHhERHiQeEhIeQRwnGxsnHAAAAAQAAAAAARoBBwAcACYAMwA8AAA3MxcVByM2NzM3IxUmJz8BMzcjLwEjFQYHNTczFwcUBiImNDYyFhUzFA4BIi4BND4BMh4BBzI2NCYiBhQWkX8JCWwHBVYBdwgJBwZ6AXoHEFAKCQleBxARFxERFxAmEh4jHxERHyMeEkIUGxsnGxv0CrsJCAqEAQYEBgMTAxAxBQdGCgOdDBAQGBAQDBIeEREeJB4SEh5BHCcbGyccAAAAAAMAAAAAAPQA9AAEAA4AGAAANyM1MhYnFTIeARUzNC4BBxUyHgEVMzQuAV4mEBYmLk4tEzNWMxorGRMfMzgmFqwTLU4uM1YzSxMZKxofMx8AAwAAAAABGgD0AAkADgASAAA3FzM3NS8BIw8BFyc3MxcnMxcHE3wOfD4HfAc+g281dDVvMiJUpXx8Dj4DAz52bzU1IiJTAAAAAwAAAAABIAEaAAUACAASAAATBxUXNzUHNR8BMxcHJxUjNQcnIQ4OqaSOMA0vDR8THw0BGQjhB3AQZ75fCy8NH2ZmHw0AAAAABQAAAAABFwD4AAYAEAAgADIAOQAAPwE1JxUXByc3FxUHNTcnFSMXJg4BHgE2NzE2NTQnMS4BBzYXMRYXHgEVMRYOAS4BNzE2FwcjJzcXN593moZjag6fQy6GEiEYJg4RKS4QDxMIFS0NExENBggBFiMeDwYFSiMNEQwMHS9QDmcVWUKsB2oOLRUfWUAOARktLBcIExQWGxUIChgKAQINBhMLEB0IEiASERMjEQ0MHQADAAAAAAEWAQcABQAIAA8AABMHFRc3NQc1Fwc3NScVFwc0Dg6ppY9WpKSOjgEHCOEIcBBnvl91bRBuF19fAAAAAwAAAAABIAEaAAUACAASAAATBxUXNzUHNR8BIyc3FzUzFTcXIg8PqaWOPQ0vDR8THw0BGQjhB3AQZ75fji8NH2ZmHw4AAAAABAAAAAABFgEHAAkAHAAuADUAAD8BFxUHNTcnFSMHJgYHBhYXHgE2NzE2NTQnNS4BBzYXMRYXHgEVMRYOAS4BNzE2FwcjJzcXN14OqWxWjhMDGSgIBAIECSsxERAUCRYwDhQSDgcIARgkIBAGBU8lDhINDB//CHEQSBc5X0QPARoZDBgMFhkKExUXHhUBCAsZCgECDQgUCxEfCBMhExMVJRMNDB8AAAAABAAAAAABFgEHAAkAHAAuADoAAD8BFxUHNTcnFSMHJgYHBhYXHgE2NzE2NTQnNS4BBzYXMRYXHgEVMRYOAS4BNzE2FycHFwcXNxc3JzcnXg6pbFaOEwMZKAgEAgQJKzEREBQJFjAOFBIOBwgBGCQgEAYFLBYMFxcMFhcMFxcM/whxEEgXOV9EDwEaGQwYDBYZChMVFx4VAQgLGQoBAg0IFAsRHwgTIRMTFxcMGBcMFxcMFxgMAAAAAAQAAAAAARoBGgAPABgAHAAmAAAlLwEjBxUjBxUXMzc1Mzc1ByM1MxUzNTMXBzUzFRcjNS8CIzUzFwEWHAagCS8JCbwJLwlLqBJxDxZdJXEmAxwGXpIX+hwDCS8JvAkJLwmgzqg5ORYPJSVLXgYcAyYXAAAABQAAAAABGgEZABQAGAAgACMAJwAAEx8BFSMHNScjFSM1IxUzByMnNTczBzM1Ix8BFQ8BJz8BDwE/ARc3J88fBgoJHwZxJTgKLhMTnD8mJnoccjkMHHJnChMDD2EPARMfDgYJDyBLS7wSErwTSzk5HA1yHA04cocTCR0PYQ4AAAADAAAAAAEaARoACQASABYAABMfARUHIyc1NzMHFTM1JyMVIzUzFTM1+hwDCfQJCdjO4Rcig0smARcdBtgJCfQJEuHKF0tLOTkAAAAABgAAAAABGgEHAAMABwAOABUAHAAjAAA3MzUjFzMVIycjNTczFSM3FSM1IzUzBzMVByM1MyMzFSMnNTM4vLwmcHA4EwlCOPMSOUIJEglCOeE4QgkTS5YlS0tBChMJQTgTlkIJEhIJQgAGAAAAAAEaARoABgANABQAGwAjACcAADcjNTM1MxU3NSMVFzM1BxUzNTM1KwEVMxUzNSc3ByMnNTczFwcjFTNCLyUTqRMJLzgTJS/XJRMJnwmECQmECSVLS+ETJS8KJS8JE7IvJRMTJS8JHAkJXgkJHCYAAAMAAP//ASwBEAASAB8ALwAAEyIOARUUFhcHFzcWMzI+ATQuAQc0PgEyHgEUDgEiLgEXByMnNxc3Mxc3MxcVJwcjlhcnFgwLRQ1GFRoXJxYWJ1kSHiQeEhIeJB4SVSgOHA0WKA0pKA0fJSkNARAXJxYRHgxFDUYOFyctJxdUER4SEh4jHhISHoIoHA0VKCgoHxolKAAEAAAAAAEbAR8AHAApADIAOgAANw4BFxYXBhcVJwcnNy4BPgEeARUUByYnNTQuAQYXPgEeAg4CLgI2FxY3FjcnBhUUNxc2JzYmIyJsEwkLCA8CAQlHDkcXBSRBQikBCAkdLzInECkkFgMSIigkFgIREhEXEg9PChhOCwEBIRgS7hM1GBIMCQkDBkUNRRlFOhkTNyMHCAcGAhoqFApkCwMSISgkFwIRIigkWxEBAQtODhIYRk8PEhchAAAAAAIAAAAAASwBLQAPAB0AABMiDgEWFwcXNx4BPgEuASMVIi4BND4BMh4BFA4BI78fMxkJFGQOZBtDOBYUNyEXJxcXJy4mFxcmFwEsITg8FnMMchUCJkBBKLsWJy4nFhYnLicXAAACAAAAAAEaARAABgANAAATNxcVByc3Fwc3Jx8BFRMO+PgOHRQY0dEYZQEICHARcAhvCVdiX1YCEgAAAAAGAAAAAAEcARoAAwAHAAsAHQAhACkAADczFSMVMxUjFTMVIxchNzM1ND4COwEyHgIdATMHMzUjFycjFSM1IwdxS0tLS0tLq/70GCMDBQcEcAQHBQMjpnBwpg4VlhUO9BNeEhMTS16pAwcFAwMFBwSoJs/0OCUlOAAGAAAAAAEaAQcADAAQAC4ANwBVAF4AABMzFxUjNSMVMxUjJzUXMzUjFzUmJwcnNyY3JzcXNjc1MxUWFzcXBxYHFwcnBgcVJxQWMjY0JiIGFzUmJwcnNyY3JzcXNjc1MxUWFzcXBxYHFwcnBgcVJxQWMjY0JiIGHPQJEuGDjQkT4eFdBQQRChIBARIKEQUEEwUEEgkSAQESCRIEBRcICwkJCwllBQQSCREBAREJEgQFEgUEEgkRAQERCRIEBRcIDAgIDAgBBwp6OYQSCc4vJqkVAQMKEQoFBQoQCgQBFRUBBAoQCgUFChELBAEVLwYICAwICG0UAgMKEAsFBQoQCgMCFRUCAwoQCgUFCxAKAwIULwYJCQsJCQAABgAAAAABBwEaAAcAGwAjADcAPwBTAAA3JzU3MxcVBycjFSM1IxUjNSMVIzUjFTM1IxUjByc1NzMXFQcnIxUjNSMVMzUjFSM1IxUjNSMVIxc3NScjBxUXNzUzFTM1MxUzNTMVMzUzFTM1MxUvCQnOCgpBExMTEhMTE7wmEo0JCc4KCowTExO8JhITExMSjAoKzgkJCRMTExITExMSJs4KOAkJOAo5ExMTExMTJiYTgwk4Cgo4CTgTEyYmExMTExODCTgKCjgJEyUTExMTExMTEyUAAAAEAAAAAAEsASwAFwA3AEMATgAANxcVBxcHJwcjJwcnNyc1Nyc3FzczFzcXBzc1LwE3JwcvASMPAScHFw8BFR8BBxc3HwEzPwEXNy8BNjMyFhUUDgEuATYXFjMyNjQuAQ4BFvg0NB4rLAs8CywqHTQ0HSosCzwLLCsxMjIHHBErEQoZChArEh0HMjIHHRIrEAoZChErERxgCw0SGRQeGwsIGQYGCQwJDw4GBb8LPAssKh00NB4rLAs8CywrHjQ0HitsChkLECsSHQcyMgcdEisQCxkKECsSHQcyMgcdEitLBxkSDxgGDh0dLQMMEQsDBw4PAAAABAAAAAABBwD+ABkAIwA8AEYAADcyFhczMhYUBgcjDgEiJicjIiY+ATczPgEzFyIGFBYyNjQmIzcyFhczMhYUBgcjDgEiJicjIiY0NjczPgEXIgYUFjI2NCYjcQwVA2gEBgUDagMVGRUDHQQGAQQDHwMVDAEICwsPCwsITAwVAx0EBgUDHwMVGRUDaAQFBANqAxUNCAsLDwsLCHoQDAYHBQEMEBAMBQgFAQwQEwsPCwsPC5YQDAUIBQEMEBAMBgcFAQwQEwsPCwsPCwAABQAAAAABGQEaAAwAJQA9AEAAQgAANyMHFRczNzUjFSM1MxcjNTQ2NzU0NjIfARUHBiImPQEGBwYPASM3Ig4BDwEzNjc2NzYzFxQWMj8BJy4BBhUHMjAjMV5CCQnOChO7OBMTKiEPFQdFRQcVDxUKBAIBE0wUIRUBAQQFCg8XCQkBAwYCREQCBgM5AQHhCbwJCTgvqXAvITQGGAoPCEkZSQgPChQFEQcKBnoTIBMhDwsPBAEoAwMCSUgCAQQDogAAAwAAAAABGgEcACQARQBRAAA3LgU3NTcyPgI3Njc2FxYXFhceAzMXFRQOBAcnFRQeAx8BNjc+BD0BIyYnJi8BJicmBw4DBxc+AS4BIg4BFhcHM5sPHBoWEQoBCQoQEQ8HCwwSEwwLBgUIDxEQCgkJERcZHA9sCA8VGA0WDAsNGBUOCQsJChQRCQgKDg8JERMTCmgJCgQQFA8ECQoIJRgJExYZHiMSPAkCAwYFBwQFAwEGAwMFBgMCCTwSIx4ZFhMJ0TMQHRsXFQgPBwgJFBcbHRAzAQIECwUEAgIEAwsIBAFRBBITDQ0TEgQxAAADAAAAAAEbAQcAFQAZACMAADc1FzUnIwcVHwE3NTM3NQcVIzUvATMHJzUfATMVIxcHJzU3F88SCakJBl4MQgkSOQZEg0xLSzpdXB4OLi8N5QETKgoKygkgCRMJKhMOnAgY1BmtGS4THg0uDS8NAAAAAwAAAAABGwEHABcAGwAlAAA3FTc1JyMHFTEVHwE3NTM3NScVIzUvATMHJzUfASM1Myc3FxUHJ88SCakJBl4MQgkSOQZEg0xLS3teXR4NLi4N5R0TIgoKCcEJIAkTCSITLJwIGNQZrRlAEx4NLg4uDQAAAAAFAAAAAAEdAR0ADAAZACIAKwA4AAATPgEeAg4CLgI2Fx4BPgIuAg4CFjcUBiImNDYyFhcUBiImNDYyFgciJicHHgE+ATcnDgFNHUc/KAQgO0U/KAQeKRk8NiIEGzM7NiIEGjwLEAsLEAteCxALCxALQhAaCBAKJSojCRAHHAEDFAUfO0ZAJwQePEU/txAFGzI9NiEEGzI8NV8ICwsQCwsICAsLEAsLUxANCRIVARYTCA4RAAADAAAAAAEaARoACAAxAFgAADcUBiImNDYyFiciBhUUFwcjFTMVMzU3FhczFSMiBhUiBh4BOwE+ATQmIzQmIzU0LgEjBzQ2OwEyFh0BFzMyFh0BMzIWFAYrASImNDY7ATU0NjsBNzUnIyImlgUIBgYIBS8THAgVIh0SFQwOHBIQFhAWARUQqQ8WFg8WEBEfEUIQDCYTGwoJCAsTCAsLCKkICwsIEwsIHAkJJgwQ6gQFBQgGBisbFA4LFRMcIRUHASUWDxYgFgEVIBYPFkIRHxEvDBEcE0sKCwgSCxALCxALEwcLCjgJEQAABwAAAAABGgEHAAoADgASABoAHgAiACwAABMHFTM1MxU3FzUnBzMVIwcjFTMnBxUXMzc1Jwc1MxUnIxUzNyMVJwcXMzcnB4MSEoQDDxJxJiY4JiY4ExODExODgxMlJV4TFg0mDSYNFgEHEzg4LgMPOhMmJTklSxNeEhJeE3FeXjkmlkgWDiYmDhYAAAAEAAD//wEHASwALAA1AD4ARwAAJTQuAQ4CHgEXDgErASIHNT4BLgEiDgEWFxUOAR4CPgEmJz4BOwEyNjc+ASc0NjIWFAYiJhcUBiImNDYyFjciJjQ2MhYUBgEHDhgaFgkEEg0FEgslFhASFQMbJBsDFRISFgMZJBwGEhIFEgslEh0GERjOEBgQEBgQOBAYEBAYEGcMEBAXERHFDRcMAhAZGhMECgsPWwMdJBgYJB0DcgQcJBkCFiQeBQoLFRECG0kMEBAXERHCDBAQFxERbhEXEBAXEQAAAAACAAAAAAEaARoALABXAAA3FjI2PwE+AT8BPgIuAS8BLgEvAS4CDgEPAQ4BDwEOAh4BHwEWFxYfARYXFjI2PwE+AT8BPgIuAS8BLgEvAS4CDgEPAQ4BDwEOARQWHwEeAR8BFmUFDQoCCAQOChoFBgMCBgcZCg8DCQIJCQkGAggDDwkaBQYDAgYGGgwJBAMIAngECggBBQEHBQ4FBQEDBQMPBAcBBQIGCAYFAgQCBgUOBQUFBQ4FBwEFAWEDBwYaCg4ECAIGCQkJAgkDDgoaBgYCAwcEGgoOAwkBBwkJCQIIBAsGBxoGTwMFBQ4FBwEFAQcHBwUBBQEHBQ4FBQEDBQMOBQcBBQEICggBBQEHBQ4FAAQAAAAAARoBGgAsAEAAawB/AAA3FjI2PwE+AT8BPgIuAS8BLgEvAS4CDgEPAQ4BDwEOAh4BHwEWFxYfARY/ARceAR8BBw4BDwEnLgEvATc+ARcWMjY/AT4BPwE+Ai4BLwEuAS8BLgIOAQ8BDgEPAQ4BFBYfAR4BHwEWLwE3PgE/ARceAR8BBw4BDwEnLgFlBQ0KAggEDgoaBQYDAgYHGQoPAwkCCQkJBgIIAw8JGgUGAwIGBhoMCQQDCAIHCggFFQ4aGg4VBQkJBBUOGhoOFHYECggBBQEHBQ4FBQEDBQMPBAcBBQIGCAYFAgQCBgUOBQUFBQ4FBwEFAQ0DAwkNAwEBAw0JAwMJDQMBAQMNYQMHBhoKDgQIAgYJCQkCCQMOChoGBgIDBwQaCg4DCQEHCQkJAggECwYHGgaHGhoOFQQKCQQVDhoaDhUFCQkFFMgDBQUOBQcBBQEHBwcFAQUBBwUOBQUBAwUDDgUGAgUBCAoIAQUBBwUOBTIBAQMNCQMDCQ0DAQEDDQkDAwkNAAMAAAAAARoBGgAHAAsADwAAASMHFRczNzUHIzUzFyM1MwEHzxISzxKDXl5xXl4BGRLPEhLPz8/PzwAAAAMAAAAAARoBGgAHAAsADwAAASMHFRczNzUHIzUzNSM1MwEHzxISzxISz8/PzwEZEs8SEs/PXhNeAAAAAAMAAAAAARoBEgBNAJwApgAANyYjLgEjFQ4BBxUWFxYXMjEGBwYHBh0BFBYyNzMGByMOARUGFjsBFj4CJyYvAS4BNj8BMzIXFhcWNjc2NTQnJicmBwYHBgcmJzU0JicXFgcGBwYrATQ2OwE1JjY3JwYHIyIHBiY+ATsBMjY/AQYmJz4BNzMyFxYXFh8BMzUmNjc+ATc2Fx4BFxUUDgEmJyYHDgEHBhYfAR4BByYvASIGFBY+ATQmI2gBAQIPChYeBAURCAoBEAoIBAMLDwcnBQIGERcBBAR9EBwWCQEBDQIHBQMDAgMDAwYHChIFAg0MERgaEg0KBQUHDwxkAgIDDggJbgoIGAESDgwIAzwDAgUFBAoHEwQFAQYPHAoEIRUCCAcKEAgGAQMBAgEEEw4TEA0RAgUHCAQKCwcJAgMHCAIKAQYBB4MEBgYHBgYE+gEJDBkJIxcICgYEAgIHBggGBwYHCgMJCgIbEgQFAQsXHRAWEQMICwkCAQEEAgEJCQYHERYSCw0FAw4LDgcHAwsQAbkPCQ4IAwcLCg0UAREDAgECAwsIBQMYAgkKFRwBAwUVCwoBAQcXBgwTAgQJCBsMAgcFAgICBgMCCgcLFwgDDB4NDQxwBQgGAQUIBQAABQAAAAABGgEaAAkADQAPABEAGwAANycHIxcHNxcnNwczNw8CNyMHMzcXMwcXJwc3tB4eZVIfUFAfUu1SGBgQGKpSUiwODiwkDiQkDrdiYkBkPj5kQAlPTzRQhBEtLRwtHBwtAAEAAAAAARoBGgAJAAA3JwcjFwc3Fyc3tB4eZVIfUFAfUrdiYkBkPj5kQAAABAAAAAABGgEaAAkADwAQABIAAD8BFzMHFycHNycfASc3Iyc1FyN4Hh5lUh9QUB9SgyQOJCwOalK3YmJAZD4+ZEBHHC0cLTNPAAAAAAMAAAAAARYBGwADABkALAAANzMVIzceARcWFRQHDgEHBicuAzc2Nz4BFzY3Nic0JicmJyYGBw4BFhceAXFLSzAWKRAmHg8mFjAnFB4QAwcPJhIrISYZGQIRDx0mEyYPIBchIhAmvEuoARQQKTcrJxIXBAkWCyIqLhUuGQwM9AkfIiUXKhAdAwEJCxhOSBMKBgAAAAAFAAAAAAEaAPQACQATABwAJQAuAAA3MzUjBxUXMzUjNyMVMxUjFTM3NQcyNjQmIgYUFjcUBiImNDYyFhcyNjQmIgYeASYSHAkJHBLqHBMTHAm7CAsLEAsLUwsQCwsQCyUICwsQCwEK4RMKqAoTqROWEwqoZwsQCwsQCxMICwsQCwsbCxALCxALAAAAAAIAAAAAARoBBwAJABMAABMHFRczNSM1MzUXNzUnIxUzFSMVHAkJLyUlxQkJLyYmAQcKzgkSvBPhCc4KE7wSAAACAAAAAAEaAPQABwAfAAA/ATMXFQcjJzcjFSM3JwcVFzcnMzUzJzcXFQcnNyMVMxMJ9AkJ9An0cUwnDTg4DShNSScNNzcNJ0lx6goKqAoKn0EnDTcONw0oEigNNw43DSdBAAAABAAAAAABFAEaACAAJAAoACwAADczNzUnIwcjNTc1JyMHFRczNxUXMxUXMzc1JyMHIzUzFTcXBycfAQcvAjcX1Q0yGQ0iXiMmDUslDhUJWBgOMhkNI15POAwlDCUMJQyQGD0ZdjINGSIYIg4lSw0mFm0JChkyDhkjSwkqCyYMOAwmDHgZPRgAAAcAAAAAARoBGgAZADUAPgBHAFAAWQBiAAATIg4CHQEeAT4BHgIOARYXMzI+ATQuASMHIy4BNSY3NjQmIgcGJyImPQE0PgEyHgEUDgEjNxQGIiY0NjIWFxQGIiY+ATIWJzI2LgEiBhQWNxQGIiY+ATIWFxQGIiY0NjIWlhowJRQBExoUHBQBFAMODwsjPSMjPSMBCgQFAggPHywQBwoCBB8zPTQeHjQeEgsQCwsQCzgLEAsBChALgwgLAQoQCwuLCxALAQoQCxMLEAsLEAsBGRQlMBoIDg0EEwEUGxUcFQEkPEc8JPUBBAQMCBArIBAIAgQDBx8zHx8zPTQevAgLCxALC4sICwsPCwtWCxALCxALEwgLCxALC0AICwsQCwsAAAQAAAAAARoA9AADAAcADwATAAA3MxUjFyMVMyc3MxcVByMnNxUzNUuWlpaWls4T4RIS4RMT4bwTJhJwExOWExOWlpYABgAAAAABGgEHAAwAFQAZAB4AIgAmAAA/ATMXFQcjNTM1IxUjFzUnIwcVFzM3JxUjNTcnNTMVJzMVIwcjFTODE3ESEktLcRMmE3ATE3ATE3CLCEtLS0smS0v0ExNeExNeODkTExNeEhJeXl4TCAsTOBNdEwAHAAAAAAEaAQcADAARABoAHgAiACYAKgAAASMHFTM1MxUjFTM3NQczFSMnByMHFRczNzUnFSM1MwczFSMVMxUjNzMVIwEHcRMTcUtLEnBLRAcmXRMTcBMTcHBeS0tLS3FLSwEHEzg4XhMTXjgTBwcTXhISXhNxXhMSExOWEwAAAAIAAAAAAO8BGgALABIAABM3MxcHMxcHJzcjJxcHNyM3IweLET4PKSEOhh4oFxFHNoVFPj5AAQ8KHUAgiRZIGwljiV6EAAAAAAQAAAAAARoBBwALAA8AEwAXAAAlJyMPARUfATM/ATUHJzUXNyc3HwEHNTcBD14RgwoKXhGDCqBUVAlXfVcHenrYL0IRVBEvQhFUkSpGJhAnPyxXPUk5AAADAAAAAAEHARoACQAMABMAACUvASMHFRczNzUHIzUHNTMVFzMVAQQ+BpEJCc4KEziEcQlC2T4CCfQJCbYEOeHhQgmWAAIAAAAAARsA4gAXACEAADciBgcjLgEOARQeATY3Mx4CPgIuAgciJjQ2MhYUBiPYGSUDOgQXHRISHRcEOgIVHyIcDwISHREUGxsnGxsT4SAYDRADFR0VBBAOERsOBBMeIxwRcBsnGxsnHAAAAAUAAAAAARoA6wASACUAPwBKAGUAADcWPgE3Nic2Jy4BIyIHNSMVMzU3Nhc2FxYVFgcOAScGJjc1Jjc2Jw4BDwEVNzY3MhYVBw4BFBYzMj8BFTM1NiYXFAYjIiY0NzY/ARcWNxY/ATUHBiImNDYXMh8BNScmIgYHBhQXFocKFBIGDQEBDAYQCRAMExMQBQYLBgcBCQMJBgsPAQEIBFAJEQcCCAsPBwkXDhUTDgsJBhEBEwEPCwYJBAgKE5wICg4MAwkJFxASDQoICAMKFhMHDw4GXwYBCAgRFhQPBwcLNI8GTAMBAQkKDQ8NBAYBARELCwwKBBYBBQUBFwcKAQwIBAESGhIGBQk/EBc5DREIDAQFAQMvBAEBCAEWBgcUHBYBBQUWAQUIBxEqEAcAAAgAAAAAARoBBwADAAcACwAPABMAFwAbAB8AACUjNTMHIxUzJyMVMxcjFTMnIxUzNyMVMycVIzUXIxUzARldXRImJkupqSXOzl5wcJZdXYODcF1d4RNLExMTXhJLExMTqTk5ExMAAAAABAAAAAABBwEaAAsADwATABcAADcnIw8BFR8BMz8BNQcnNRcnNxcHFwc1N/1dE14JCV4TXQp6VVVQWVlZXlRU4Tg4EHEQODgQcaMyYS5BNTUxQzJlLgAAAAUAAAAAARwBGgAIAAwAEAAdACkAABMzFRYXNSMVNxcnBzMnPwEXNz4BHgIOAi4CNhceAT4CJicmDgEWS5YKCbwTKBVLlnYgCysqDyMgFAIQHiIfFAIPGQoZFw4CDAoQJhYIAQdLAQRinyEqJYMTOBNLeAoCDx4jIBMCEB0iIFQHAgsVGhYHCwggJgAAAgAAAAABBwEHAEYAjQAANzUjIg4BBzEGBzEGFxUUBzEGBwYrARUzMhcVFhcVFhcxFh0BBhcVFhcxHgIXMzUjIi4CPQE0JicmJzY3PgE9ATQ2NzYzFxUzMj4BNzE2NzE2JzU0NzE2NzY7ATUjIic1Jic1JicxJj0BNic1JicxLgIHIxUzMh4CHQEUFhcWFwYHDgEdARQHDgEjcQIJEQwDAwEBAQIECgUGAQEGBQUDBAICAQEBAwMNEAkCAgYKBwQCAgUJCQUCAgkHBQZNAQkQDQMDAQEBAgQKBQYCAgYFBQMEAgIBAQEDAwwRCQEBBgoHBAICBQkJBQICCAMKBvQTBw0ICAgICBAGBQoFAhICAQIDAQMFBQYQCAgBBwgIDQYBEwQICgYZBgwFCwcHCwUMBhkJDQQCvBIGDQgHCQgIEAYFCgUCEgIBAgMBAwUFBhAICAEHCAgNBwESBAgKBhkGDAULBwcLBQwGGQwIBAQAAAACAAAAAAEaARoAGwAfAAATFTMVIxUzFSMVIzUjFSM1IzUzNSM1MzUzFTM1BxUzNc5LS0tLEksTS0tLSxNLS0sBGUsSSxNLS0tLE0sSS0tLXUtLAAAIAAAAAAEaARwADgAZAB0AKQA1AEIATwBTAAATFhcWFA4BIyImNTQ2NzYXNjc0LgEOARQeATcHFzcXMxUzFSMVIzUjNTMnFwcXBycHJzcnNxc3LgEiDgEeAz4CBwYHBicuAT4CFhcWNyMVMzYKBAIGDAgKDwgHCgQGAQUGBgQFBkxkDWNTEi8vEi8vbA0hIQ0hIQ0hIQ0hOgMMEA0FAQcLDQwHAREBBAYFAgIBBQYFAQWNS0sBFwQJBQwLCA8LBw0DBCUDBwMGAgMFBwUCImQMY4cvEi8vEiUNISENISENISENIXAHCQkNDQoGAQcKDQgEAQMFAQUGBQECAgU0EwAAAwAAAAABGQDhABsAIgApAAA3IzU0JisBFRQWOwEVIzUzMjY9ASMiBgcVIzUzFyc3FxUHJyMnNycHFRfOEgYEEwUECjkKBAUSBAUBEnA3HA4iIQ6nHBsOISK8CQQFZwQFExMFBGcFBAklTBwNIg4hDhsbDSEOIgAAAgAAAAABGgEbAB8AQwAANyIuATc2NyY0NzY3PgEfAQcXNxcWFAYHBgcOAScGBwY3IgcGBw4BHwEHBgcGHgIyNzY/ARcWNjc2Nz4BNTQnByc3JjUOEwIII0AFBgoVESkSDDYXOAUGDAsGCBAlEkQgCYkSEAYFDgcIAwREIwMBBwYIAx5JBQUPIA4GBQkJATEwMAYTExkKJj4OHg4YDQsECAU4FzYMDyAeCwYFCwQHRR4I9QsDBQ4mEgYEQiUFCwcCAxtLBAIHAwkDBQkXDQYGMDAxAQACAAAAAAD0ARoABwAbAAATBxUXMzc1Jwc1MxUjNTM1IzUzNSM1MzUjNTM1SxMTlhMTlpaWJiZLSyYmSwEZEuETE+ESJRPhEhMmEiYTJRMAAAgAAAAAARoBGgAJAA0AEQAVABkAHQAhACUAABMHFTM1MxUzNScDNTMVNyMVMzczFSM3IxUzNzMVIzM1IxUnMxUjLwkSzxIJ6hImExMTEhI4ExMTEhJdEiYTEwEZCdjPz9gJ/voTExMTExMTExMTExMTEwAABwAAAAABGgEHAAcACwAfACkANgBAAFIAABMHFRczNzUnBzUzFSczNTQjIgYHFTYyFQcGFRQWMzI/ARUUBiImNTQ/ARcjFSM1Mxc2MhYUBiInFRQWMjY0JiIGFzI3NQYiJjQ2Mhc1JgcmBhQWJhMT4RIS4eGjDRIECQMHDwwOBwYIBAEFBgMGBysBCwsBBA4ICQ4EBAcEAwcFRQkFBQsHBwwEBAgLDg0BBxOpExOpE7ypqTogFwMCDAUJAQMQBwkJEgQEBwQCBwEBFAZKHwkOGA8cBQQHCA4HCCEDDgQIDgkEDgMBARAaDwAAAAAGAAAAAAEaAQcABwALABMAGAAgACUAABMHFRczNzUnBzMVIwc3MxcVByMnNyMVMzUzNzMXFQcjJzcjFTM1JhMT4RIS4eHhExM4ExM4EyUSOF4SORISORIlEzkBBxM4ExM4ExM4SxISORISOTk5EhI5EhI5OTkAAAAGAAAAAAEaAOEACQATAB8AIwAnACsAADczNSMHFRczNSM3IxUzFSMVMzc1BxcVDwEjLwE1PwEzBxc1JzcXNycHNzUHJiUvCQkvJeovJiYvCTwEBlQJLgUGVAlQHBwLGz8bG0JCzhMJlgoTlhODEwqWJwgvCSUcCC8IJlcRGREPEBwQVx0aHQAAAwAAAAABKwEIABEAIwAnAAA3Jz4BHgEXNxcHIyc3Fy4CBh8BBi4CJwcnNzMXByceAyc3FwdnDxo9NiABFw4nDycPFwEaLDFADxo6Mh4BFw8nDigPFgIYJy6SDd8N5w0RAxwzHxYOJygOFxgqGAGzDQ4BHTEdFw4nKA4WFycXA74N0A4AAgAAAAABKwENABEAIwAANwcnNzMXByceAjY3Fw4BLgE3JwcXMzcnBy4CBgcXPgEeASYXDycOKA8WAyk9OQ8PE0VJMM0XDycPJw4XAS5IRRQPEDo8J5EXDicoDhYfLw0aHAshHhE6LxcOKCcOFiU6ExsgCxsYEDAACwAAAAABBwEHAAcACwAPABMAFwAbAB8AIwAnACsALwAAEyMHFRczNzUHMxUjFyM1Mx0BIzUnMxUjFTMVIxU1MxUzNTMVMyM1MzUjNTMnNTMV/eEJCeEK4c7Ogzg4OEs4ODg4OBM4Szg4ODg4OAEHCs4JCc4JEzglOCUlOCUTJTkmJiYmJhMlEyUlAAADAAAAAAEnAQcAEQAjADAAABMjDwEVFzM3FjI+AT8BNCYnNQcmIyIGFBYzMhcVBwYPASc3MxceARUGFQ4DJz8B+GIGfWENKhIqJRcCARQREw4OBAUFBA8NSQMCJVRzVBMJCgECERseDkUDAQcDfQ1iKgoUIhUKFSUMKiEFBQgGBihKAQMmVHQ5ChcNBQUPGQ8CBkUHAAAAAAUAAAAAARoBGgAIABUAHgArADgAADcyNjQmIgYUFjcUDgEiLgE0PgEyHgEHMjY0JiIGFBY3FA4BIi4BND4BMh4BBzI+ATQuASIOARQeAZYICwsQCwtTFCMoIxQUIygjFEsXISEuISGaIzxIPCMjPEg8I4MfMx8fMz4zHh4zgwsQCwsQCxMUIxQUIygjFBQjTCEuISEuITgkPCMjPEg8IyM8lB4zPjMfHzM+Mx4AAAAABAAAAAABGgEaAAYACgAOABIAAD8BJwcnBxc3IzczBzMVIxcjFTNDaw1kHA4i5JkrbqioqKioqK5dDlYiDCofJksmJSYAAAAABQAAAAABBgEaABMAFwAbACAAKgAAEx8BDwEvAQcvAQcvAT8BJz8BJzcHFzcnNxc3JzcXNycPARcjJxUjNQcjN9MLJwQ+CwNDCgMwCw4FLwMEQwMFZwYqBwoVOBQKIyshLgU5FiMTIxUgARkEXQsaBAgcBAcUBR8LFAgKHQgLYhAREBcuGC0YTRNNE3NbOEthTkkAAAQAAAAAARIBIwAXAEcAUQBuAAAlJyYiDwEOAR0BFBYfARYyPwE+AT0BNCYHFRQPAQY9AQYnIjU3NDczFjc2NCImNTQ3NTQ/ATIdATYXMg8BFAcxJgYVFBYzMhQ3FCMHIzU0PwExNwcOAR0BFBcjIi8BLgE9ATQ2PwE2Mh8BFhcuAQcBAFkIEghZCAkJCFkIEghZCAkJTQEFAQUFAQIBAQUEBw0GCgEFAQQEAgECAQUKBAQMJAEWAQEWEFQJCQgFBwdZBggIBlkHDwZZCwICCQbpNQUFNQUQCWoJEAU1BQU1BRAJagkQnwgBAQMBAggDAgEHAQEBAgMNBAcNCAgBAQMBCAIBAgYBAQEFBwICGgQBDgYBAQ18NAUMCWcLAwM1BA4HagcOBDUDAzUHDQQCAwAHAAAAAAEsARoAAwAgACQAKAAwADQAOAAANxcjJwciDgIUHgIyNxcGIwYiLgI0PgIyFhcHLgEXMxUjFTMVIzchBxUXITc1ByE1ITUhNSHMJg4lUwgMCgUFCQwSCQIEBQcQEAwHBwwSEgoCAgQJJRMTExON/uYJCQEaCRP++gEG/voBBqleXgsFCQ8QDQkFAwkCAgYMERQRDAcCAgkCAggTEhO7CfQJCfTqqBMmAAAAAA///wAAAPIBLQAEARcBGgEtATUBOwFKAVABUgFXAV4BYwFkAW4BdAAAEyIrATcXNjUHNj0BIy4BJy4BBz4BJw4BBwYHBjM3MAcjDgEHFDYxByYHBgczBgcxBhUHBhUUFwcXIx4DFyYnFBYXBxYfASYXFh8BNwYXMx4BMwcWFzMWFycXHgIXIyYnLgI3Jjc0JzU2NzUxFj8BNjczNjc2NzE2NxU2NzY/AQYzNwc2FzEyMwcGMRY3MTYXJxcWFzI3MTYXFRYXMicxHgEXJjEVFiMWFzUmJxQjMSYGFxY3MTQxFxYfASInMSYVHgEVMSIVFBY3MwcGFycUFTEWBzY0BxYHMQYVJwYWBzY1MTQ3Ig8BDgEnNCcmJyY3Njc2Nz4CFhcuAQ4BFzcyNRQeATcVNj8BBwY2PwE2NTEmPwEHMDkBFBYXFjcGLgEnMhcxFhcmJxYXNyIjMhYjMCcXNCIHFxQHBgc0JjY3FAcxBhQ/ATYHLgE3FjcnDwIXFhcnFh8BJyYnNwcGBzYnFTAzMTIUDwE1NgcUBzU0N4UEAwIOSAMCAgEBGxANIwkBBgEHCAMGBgEBBgMFBQgFBAIIDw0FAwIEBQECBAEDAQIEBQUEBAIFAwICAwEEAwIGAwIBCAUBCAMDBQIBAwYDBgUNDgUEFAccMhwCAQEBBwcCAwMDAQIBBQQHBwIHDAcNCAEBDwcFBAQFBQIFBQYGAQsKCgICBAUBCAEFDxoFAwEBBAIGBgMCAQIBAQIBAQEBAQIBAwECAQECAwEDAQIBAgEFBAMEAQMBAQEFBxAmFAISBgkDAgIDBQQSFhIFCRoYDgEBARUfDgUDCQEDBQ4DAQECBFQGAwsSCRsYBgEFCAQEBgkLAwEBBgICBDYCAQIDAgQEAQQCAgQBAxkFBgQHBRoBJwEDBAMFAgIBAQMBjAECBgfgAgEBBAIGAgMBKwGQCAYFCBAKEyYHBgIEAQEBAQICBAIBAQIBAwYBAgMBDwwJBQcJBAwRCA0FBwcJBAEFCQEEAgkFAgMCAQIGAwgEAgUJAwcEAQIDAgQFBgUCAgECCC1AIQYMDwICFg4BAgUFBwQEBgQHBgIDBgcDBgMBAgQBAQEBAQIBAgMEAwUBAQIBAwQFCB4RBAQFCwoBFAkCAQMFAgEBBAIGBQIDAQQGAQMFAwEECQcIAwQFBgYJAwcKCAMEBwUEAgEBAgUHDQUHAQIOCw8XAQYLAwcMAQoHCAQLGQ4BAhEbCwcBAQIIAgMBDQMCAgIDAykBBAIEAQQGEAoFCgEDCAoFuwEBegYEAwELBwYBAQQFAgIEAQIBBBMBAgEBAZkBnwQEBgMXBAIFAgYDGAIPDQ5XAQEDAwEDFQQEAgQEAAAFAAAAAAESAS0AWgCxAM8BGQE+AAA3HgEfARYfAR4BFA4BDwEOAgcOASMiJicmLwIiDwEiDwEOASImJyYvAS4CNDY1JzQ2NzY/Ayc0PgI3PgE1JzQ1ND4CMzIeAh0BFhcWHwEeAhUUJzIWHwEVDwEGDwEGFBcWHwEeATsBMj8DNC8CLgEvAT0BND4BMzIWFAYUFzMyNjUnLgIjIgYHFycmByMiPQEuAiIOARUHFB8BFjI2NSMiLwEmNgcyPgMmLwIuAgYPAQ4CFRcUBhQWHwIWFzcyNzY3Njc1PwE0PgE3NTQ/ATY/AS8BJi8BJjUnJi8CJiIPAQYiJi8BJiIdAQcGBxcUFwcOAR0CMh8BFh8BFh8BFAYHHgMXMj4BNzY/AjY9AS8CJiMiDwEGIiYvAQcGBwYVBwYPAhQW+QQFAQIBAwMCAwMGBAcGCQoGBAcECAsEAgEEHQcGDQEBBAMICwoFCQkZAwUDAwEHBwMCBQcBAQcKDAYICQEFCxINDhIJAwEDAwQOBwwIfgIDAQEBBAECBgICAwEEAQYGAQYFDgsBAQIFAwcDAQIDAgUEAgECAwMBAQMGBAgGAQEFAgICAgECBAYDAwECAQECAgEBAQIBBB0EBgYDAQICDQoCBAUGAwoDCAUBAgUEEAgDBUMEBQkJBAQCBQMGAwECAQIDBQICAgcBAQIDAwMCBQUUBQkHAwUDAggDAQEBBQYEAwMHBAQGBAECBQMCCAgKQAMHCAMICgoDAQUDBQMGAwIKAwUFAQQCAgECAgEDAQEJWwIHBQYEBQQCBgcFBAEEAwcKBAIDBggCAQEBAQICBQIEAgMEAgQBAwYICAUNBwcCAQIECQIHChQTEggKGA4LBgYMEg4HDBMXDA0KCQQGEgkUFg0KjwIBBAQCBQEBBQIDAQIEBgMFAwgIBAIBAgEBBAEBAgcCAwIHBQQCAQMDBwQIBAcICQEBAQEGAwYFAwQDBQQDBQECAQEFBAbkAgMGBwUCEhAEBgQBAgoDAwQEDAQHBwMBAwEBAw4BAgQCAwEIHwQGBQIBAQIDAQECFwYEAgoCAgQHBwcFAwMNAgUEBgMCBw0HCAQCAgcIEwkKBAIEAwQIAwQGBAUBBAYEAhUCBQQJBQUCAgICCAUPBAEGAQMCCgMCAgUFEQgIBQUHCgAAAAAEAAAAAAErARoABwALAA8AFQAAEx8BDwEvATcHFzcnFwcXNy8BBxcHFy/0CCIL9AgiDuEg4U0DXgI9RQ0yPQkBGQMJ8gkDCvHoA98CnRICEy83DycnDwAABAAAAAABBwEaAAcADAAQABQAABMjBxUXMzc1BxUjNTMXIzUzNSM1M/3hCQnhCoRdXXFeXl5eARkJ9AkJ9HFnz89eE14AAAAABv//AAABHAEaAAgAEQAeACcANABEAAA3FAYiJjQ2MhYHFAYiJjQ2MhYXLgEnBiceARcWMyY1NxQGIiY0NjIWFzY3NiYnBgcWBwYHFiciMT4BFwYPAQ4BByYnJiP2FyEXFyEXphghFxchGDIWIgoREg0xIA4OC2EXIRgYIRcQEwYGCg8GEBEIAwkO0gESRCYJAgEYKQ4ICgYG8xEWFiEWFmURFhYhFhZ0BBoTCAQeKAcCDhIBEBYWIRYWAhcdGTIWEQkfIhAOC3wgIwMKDQgBFRMFAgEAAAAABAAAAAABGgEaAAcACwASABYAABM3MxcVByMnNxUzNQ8BFwcXNzUVMxUjExPhEhLhExPhrw01NQ0+S0sBBxIS4RMT4eHhOQ01NQ09CjMTAAAEAAAAAAEaAOEABwAKABIAGAAANwczNzMXMycHNxc3IwczNzMXMyc3NjcfAT8sGQkrChksGw8OhR49Hg4/Dh1kFgIBAhepcRwccUIoKHqpKytCQwYFC0MAAwAAAAABBwD0AAMABwALAAAlIzUzFSM1MwczNSMBB+Hh4eHh4eHOJnEmcSYAAAAAAQAAAAABGgEHABsAADciLgE/ASMGLgI3Njc+ATczHgEdARQGKwEHBmYIDgUEEjQHDAcBAyMIAw0IpwsPDwsZbggjCxEJKQEGCw4GShcHCQEBDwtCCg9nBwAAAAACAAAAAAEaAQcAGwA2AAA3Ii4BPwEjBi4CNzY3PgE3Mx4BHQEUBisBBwYnIgcGBwYWNzMXFQcGHgEyPwIzMjY9ATQmI2YIDgUEEjQHDAcBAyMIAw0IpwsPDwsZbggYBQILIAIEBT4JFAEBBAUCcgkZAwUFAyMLEQkpAQYLDgZKFwcJAQEPC0IKD2cH0QUfQwQHAQwJLgIFAwJoAwQDQgMFAAAAAAEAAAAAARoBBwAbAAATHgIPATM2HgIHBgcOASsBLgE9ATQ2OwE3NsYIDgUEEjQHDAcBAyMIAw0IpwsPDwsabQgBBwEKEQkpAQcLDQZKFwcKAQ8LQgoPZwYAAAAAAgAAAAABGgEHABsANgAAEx4CDwEzNh4CBwYHDgErAS4BPQE0NjsBNzYXMjc2NzYmByMnNTc2LgEiDwIjIgYXFQYWM8YIDgUEEjQHDAcBAyMIAw0IpwsPDwsabQgYBQILIQEEBT0KFAEBBAUCcgkZAwUBAQUDAQcBChEJKQEHCw0GShcHCgEPC0IKD2cG0AUfQwQHAQwJLgIFAwJoAwQDQgMFAAAGAAAAAAEZARoAIAAvAEEATQBSAGgAACUnByc3JyYiDgIUFwYHBhYXHgEzMjc2NzY3FjI+AjQHBisBIi4CNzY3HgEXBjcWBiInLgE3PgI7AQcVFzM3BzMXNyc3LwEPAhcnFxUjJxc3FxYUBw4BJyYvATcXHgE+AjQmJwEVDycXJwMNGxoUCwU6OQYBCAQJBQkHFSQiGg0cGhQL4gECAgICAwIBKkYDBgRJqQEgLA8MBgYEDxQKBSIjDSLKHA4MDAEENgsPAiMKKxQcig06CAgGDwgFAzsNOgIFBQIBAQHrAycXKA8ECxQbHQ06OwgVBwQFBxMlIRsGCxUaHLcBAQQGAixGBAcDS4UXHw8MIA8KEAgjDSMiJw4NDR8IJAIPDDZAHRUsfQ08CBYIBgMDAgQ8DTwCAgIDAwQDAQAABgAAAAAA9AEaABMAFwAbAB8AIwAnAAA3MxUjFQcjJzUjNTM1NDY7ATIWFSsBFTMHMzUjFyMVMzczFSM3MxUjvDgTE4MTEjgLCDgICxM4OF6DgyYTExITEyYTE/QTqRISqRMTBwsLBxO8qRODg4ODgwAAAAABAAAAAAEHAM8ABQAAPwEzFwcjJgfSCGoQxAoKZgAAAAEAAAAAAM8BBwAFAAATFxUHJzXECgpmAQcI0ghqEAAAAQAAAAAAzwEHAAUAADcnNTcXFWgKCmYmB9IIahAAAAABAAAAAAEHAM8ABQAAJQcjJzczAQcI0gdpEGgKCmYAAAEAAAAAARoA/wA+AAAlDgEHFxQGBw4DIiYnFjY3IiYnJicXFjcuAScmNTEWMyYnJicmNzY3FhcWFxYXJzU0NzY3NjIWFzY3Bgc2ARkFDggBBwcJHSQrLSoSFSoQDBcHBQMFCgkJEAYMDA0LBwMCAwQBBAoNGR8QEAEECBUKFhQIEhAGEhDlCA4GBxAfDxUiGAwMDAILDgwKBwgBAQMCCQgOFAYHDAYGDg0HBgwKFQgEAQYGDAkVCAQJCAQJEwoBAAQAAAAAAQcBGgAeACIAJgAqAAA3IyczNzUnIwcVFzMHIwcVFzM3NScjNxcjBxUXMzc1JzUzFQcVIzUXIzUz/SA/FAoKSwkJFD4hCQk4CgoBOjkBCQk4CpY4XiXOJiZeXglLCQlLCV4KOAkJOApWVgo4CQk4ejk5gyUlJSUAAAAABAAAAAABBwEaAB4AIgAmACoAABMjBxUXMwcnMzc1JyMHFRczFyMHFRczNzUnIzczNzUHNTMVFxUjNTcjNTP9OAkJATk6AQoKOAkJIT4UCQlLCgoUPyAK4SVeOIMmJgEZCTgKVlYKOAkJOApdCksJCUsKXQo4LyYmgzg4gyYAAAAFAAAAAAEHARoAIwAnACsALwAzAAA3Iyc1JyM1Mzc1JyMHFRczFSMHFQcjBxUXMzc1NzMXFRczNzUnMxUjBzMVIwcjNTMXIzUz/SEgChwJCgolCQkJHAkgIgkJJgkgQyAKJQqEExMSODg5EhK8ExNLIEcKJQkmCQkmCSUKRyAJJgkJIiAgIgkJJsUTSzhLEhISAAAAAwAAAAABBwEaAAkAEwAtAAA3NQcnNzMXBycVBxUnBxczNycHNTcXBxcHIzUzJyMHMxUjJzcnNzMVIxczNyM1jRMNIg4iDRMSEw0iDiINE2IGRUUGTjg4ODo5TwVFRQVPOTg4OjiySxMOISINE0s4SxMNIiINE0tnEzc5ExMtLRMTNzkTEy0tEwAAAAAMAAAAAAEaARoACQATABsAHwAnACsAMwA3AD8AQwBHAEsAABMXBycVIzUHJzcXNSMVJwcXMzcnNyMnNTczFxUnMzUjFyMnNTczFxUnMzUjByMnNTczFxUnMzUjFyMnNTczFxUnMzUrAhUzNSMVMzYoDxcSFw0nDxIXDScNKA1OJQkJJQomExONOAoKOAk4JiZCJQkJJQomExONOAoKOAk4JiYTJSUlJQEZJw0WUlQYDSfoUlIWDScnDWIJJgkJJgoSJQk4Cgo4CiWWCSYJCSYKEzkKOAkJOAkmE3ASAAAAAAIAAAAAAQcBHQAVABoAADc1ND4BFhczLgEOAR0BIwcVFzM3NScHMxUjNV4aKSMHFAguOCYTEhK8ExMmJrypJRUfBxUTGyAHKh0lE3ATE3ATE3BwAAUAAAAAARoBGgAJABEAHgAnAC8AADczNxcVBycjJzUfATUPASMVMzcUBgcnPgEnNic3HgEHFAcnNjQnNxYHFAcnNic3Fhw0SRAQSTQJSDs7By4uxQ8ODgwNAQEZDg4PJRMNDQ0NEyYIDgcHDgjRSAb0BkgJXlc7xjoDSyUXKhINDyQTJx8NESsXHxkNFC8TDRkfEA0ODxANDQAAAAQAAAAAARUBFAAXAC8AWwBfAAA3MzczNzU3NSc1JyMnIwcjBxUHFRcVFzM3IzUvAT8BNTM/AR8BMxUfAQ8BFSMPASc3Bg8BIzU2Nz4DMzIeAhQOAQ8BDgEdASM1NDY/AT4BNCcxLgEnMSYiBhcjNTOQDSAtCiAgCS4gDR8vCh8fCi8DKQIdHAMpBhwdBigDHR0DKAccHBUCAQERAQMCBAcJBQgLCAMEBQMGAgQRBAMLAwMBAQMCAwYGDxAQGCAKLSAOIC4JICAKLSAOIC0KEygHHBwHKAMcHAMoBxwcBygDHBxxAwMGAQkHAwYEAwUICwwJCAQHAwYDCQoFCAMOAwgHAwIEAQIEXRAAAAAGAAAAAAEsARoAQgBOAFoAYgBmAGoAADc0Nh8BFjI2PwInLgIiBzU3Fh8BNz4DFhUUIyImIgYHBgcXFh8BFjI3Nj8BFw4DIi4BLwEmJw8BDgIiJhc+ATQmJzMWFRQGByMuATU0NzMOARUUFzchBxUXITc1ByE1ITUhNSFlBwQFAQMFAwsGBwEFBgcDGwYDBQUDCQkJBggDBQYGAwUECAEBAgEEAQUDAwMBBgcIBgUDAQQBAQkGAwgHCAZzBwkJBw0SCQmeCQkSDQgIEM/+5gkJARoJE/76AQb++gEGVAQFAgQBBQMQDRsDBQMBBAUGCBAIBgkGAQQECAMGBAYIIgQDAwEBBAUEAgMIBwYEBgMUBAMPCQUGBQUFChgaGAoVGg4XCgkZDRoVChkMGxTOCfQJCfTqqBMmAAACAAAAAAEVARQAFwAeAAA3IycjJzUnNTc1NzM3MxczFxUXFQcVByMnMzcnBycHnQ0fLwofHwovHw0gLgkgIAotPw5GDUAaDRggCi0gDiAtCiAgCS4gDiAtCjBGDkEaDQADAAAAAAEVARQAFwAvADYAADczNzM3NTc1JzUnIycjByMHFQcVFxUXMzcjNS8BPwE1Mz8BHwEzFR8BDwEVIw8BJzczNycHJweQDSAtCiAgCS4gDR8vCh8fCi8DKQIdHAMpBhwdBigDHR0DKAccHAQORg1AGg0YIAotIA4gLgkgIAotIA4gLQoTKAccHAcoAxwcAygHHBwHKAMcHCBGDkEaDQAAAAQAAAAAARoA9AAHAAsAFgAhAAA3BxUXMzc1JxUjNTMHNTM1IwcVFzM1Iyc1MzUjBxUXMzUjlhMTcRIScXGpEx0JCR0TOBIcCQkcEvQTlhMTlhOpll5LEwmECRM4JhIJXgkTAAADAAD//wEuAQcAEgAfACYAABMzFxUmJzUjFTMUFyM1MzUjJzUXPgEeAg4CLgI2FzcnBycHFxz0CQgL4F0TSzhnCaQRKCQXAhIhKCQWAxI4LQ8nGAwgAQcKZwcEU6kfGRMSCrt0DAIRIigkFwISISgkUjsMNBMOGgAFAAAAAAEsAQcAEgAfACsAMQA3AAATMxcVJic1IxUzFBcjNTM1Iyc1FyIOARQeATI+ATQuAQciLgE0PgEzMhYUBicXNyc3JwcnNxcHJxz0CQgL4F0TSzhnCc4UIxQUIygjFBQjFA8aDw8aDxchIRUbCRMTCTASCBsbCAEHCmcHBFOpHxkTEgq7ZxQjKCMUFCMoIxSDDxoeGg8hLiFDGwgTEgguEggaGwgAAAAAAwAAAAABLAEHABIAHwArAAATMxcVJic1IxUzFBcjNTM1Iyc1FyIOARQeATI+ATQuAQciLgE0PgEzMhYUBhz0CQgL4F0TSzhnCc4UIxQUIygjFBQjFA8aDw8aDxchIQEHCmcHBFOpHxkTEgq7ZxQjKCMUFCMoIxSDDxoeGg8hLiEAAAAAAwAA//4BLgEHABIALgAxAAATMxcVJic1IxUzFBcjNTM1Iyc1FzIeAhceAQcOAgcOAScuAicuATc+Ajc2FycVHPQJCAvgXRNLOGcJzgoTEQ4FBwQEAgoOCA0eDwkRDgUHBAQCCg4IEjo5AQcKZwcEU6kfGRMSCrtnBQoOCA0eDwkRDgUHBAQCCg4IDR4PCREOBQpLJksAAAACAAAAAAEaAQcADwATAAABIwcVFzMVIxUzNSM1Mzc1ByM1MwEQ9AkJZziWOGcJEuHhAQcKuwoSExMSCruyqQAABgAAAAABLAD0ABkAMwA3ADsARwBTAAA3MzIWHQEUBisBIi8BJiIPAQYrASImPQE0NhciBh0BHgE7ATI/ATYyHwEWOwEyNj0BNCYjBzMVIyUzFSMnMhYUBisBIiY0NjsBMhYUBisBIiY0NjNLlhchIRcHEQ8PChYKDw8RBxchIRcQFgEVEAcMCRAOIg4QCQwHEBYWEOETEwEZExOfBAUFBC8EBQUElgQFBQQvBAUFBPQhF0sYIQoKBgYKCiEYSxchExYPSxAWBgsJCQsGFhBLDxY4ODg4JQUIBgYIBQUIBgYIBQAABAAAAAABBwEZAAUAEQAfACkAABMHFzc1NBUnJiIPAQ4BHwE2NTcWHQEUBzc+AT0BNiYnBzcXBwYiLwEmNLdPKCyMAggDDQMBBKEFDgQENAQEAQUE6BYfGwIIAw0DARJIHyE7BppqAgMMAwkDlAUG4QkJzwkJGQIIBKUECAGBFRwVAgMMAwkAAAEAAAAAAQcBGgAqAAA3BicmLwEHBiIvASY0PwEnJjQ/ATYyHwE3PgEfAR4BHQEjNQcXNTMVFAYHzAYGAwNgKgIIAw0DAyQkAwMNAwgCKmIECAQyBAQ8SUk9BQQnAwMBAlggAgMMAwkDISIDCQMMAwIgWQMBAhkBCARcQTg3LkkECAIAAAYAAAAAARoBGgALABcAIwAwADgAQAAANzM1MzUjNSMVIxUzFyMVIxUzFTM1MzUjNzUjFSMVMxUzNTM1ByYiDwEGFBYyPwE2NAcGIiY0PwEXNwcnNzYyFhRSExMTExMTlhMSEhMTEx8TExMTEkoIFwmMCBAYCIwIogIIBgN5DhMGDQYCCAbOExMTExNeEhMTExOWEhITExMTLggIjQgXEQmMCBeeAwYHA3kNEwYOBgIFCAAAAAQAAAAAARkBGgAFAAgADAAQAAATMxcHIyc3BzMnNSMVPQEzFY4Qewj2CINr1l8YGAEZ5g0NzskTExMmS0sAAAADAAAAAAD0ARoABgAaACcAADczNSM1IxUnDgEUFhcVFzM3NT4BNCYnNScjBxcUDgEiLgE0PgEyHgGNJRwTHBYZGRYKSwkWGRkWCUsKehQjKCMUFCMoIxSDEy84WgwsMiwMKQkJKQwsMiwMKQkJehQjFBQjKCMUFCMAAAAAAwAAAAAA4QEaABEAGQAdAAATNSMiDgEUHgE7ARUjFTM1IzUHIyImNDY7ARcjNTPhZxIeEhIeEhwTXhM4HBQbGxQcJhMTAQcSER8jHhJeEhLPXhsnHM/PAAUAAAAAASwA9wAHABwAJwA3AEMAADUzFSE1MxUhNyM1IwYjIiY1ND8BNCMiBzU2MzIVDwEOARUUFjMyNjUXMRUjNTMVMTYzMhYVFAYiJxUUFjMyNjU0JiIGEwEGE/7UgBABChUQESIfFhIPDxQkEBkMCwoJDRA/EREMGBQWGSoLEA0PERAcEV4mJjg4EBMRDR0FBBoMEQkmDwQBCAsHChEOGw+YQxQbGBofOw4NEhcVERMUAAMAAAAAARoBBwAHAAsADwAAASMHFRczNzUHIzUzNSM1MwEQ9AkJ9AkS4eHh4QEHCs4JCc7FhBImAAAAAAYAAAAAARoBGgAfAC8ARQBaAHoAigAANyYnJgcGDwEVNz4BMhYXBw4CBwYWFxYzMjcVMzU0JgcVFAcOAScuAj0BND4BMzcuAiIHBgc1IxUzNRYXFjMyPgI0BxQOAQcGJy4CPQE+Axc2Fx4BBz4BMhYfATUnJg4DFB4CMjY/ATUPAQYnLgI0NjcjNTMXFQcjFwcnNTcXBzNJBAUJCwcGBgQECwsFARIHCQYBAwYJBQULBxMDDwECCgUCAgEDBANrAQYLDgUDAhISAwYCBAcLBwQSAgQCBgUCBAIBAgMFAwYEAQJeAwYIBgMHAggSDgoFBQkNDgoEAgYKBgYDBQME3EtUCQl8Jw42Ng4mcusFAgMCAQMDFAMDBQYGAgEFBwQKEgQCCQcxBwsfBQMDBgUCAQIDAgQBAwIWBgsHBAIDLnQFBQEBBgwQEAcHCgYBAwICBAYECgQIBQMBAQYCCWADAwICBRUBBQEGDA8RDgoGAwIBEQIEAQICBggLCU0SCXEJJw02DTcOJQAAAwAAAAABJQEtACQAPwBMAAATMh4CFxYXFhcWMxUUDgQPAScuBT0BMj4CNz4BFy4BJy4BIgYHDgEHFRQeBBc+BTUvAQ8BLwEPAR8CPwGXCA0NDAcKCxUXDAsLExkfIREEBREiHhoTCgsYFhUKDBqIFSkSCRYWFQkSKRYKERgaHg8QHRsXEgk0CAhRHAgIAiQECQRbASwCBAYEBgUIAgFKFiYjHhsXCgMDChcbHiMnFEwBBQkGCAg4AQwMBgYGBgwMATkSIiAbGBUJCRQZGyAiEhkHAWAnAgcHMwIBAmsAAAAEAAAAAAElAS0AJAA/AGkAcQAAEzIeAhcWFxYXMhcVFA4EDwEnLgU9ARY+Ajc+ARcuAScuASIGBw4BBxUUHgQXPgU1Jx4BFA4BDwEOAR0BByMnNTQ+AT8BPgE0JicmIgcOARUHIyc0PgE3NhcWBzczFxUHIyeXCA0NDAcKCxUWDQsLExkfIREFBBEiHhoTCgsYFhUKDBqIFSkSCRYWFQkSKRYKERgaHg8QHRsXEQpgBQYFBgQGAwMDDQMFBgQGAwMDAgUPBQIDAw0DBgoGDg8GHgMNAwMNAwEsAgQGBAYFCAIBShYmIx4bFwoDAwoXGx4jJxRMAQIFCQYICDgBDAwGBgYGDAwBORIiIBsYFQkJFBkbICISGQYMDgsIAwYDBgQGAwMGBwsHAwYEBgcGAwUFAwYEAgIIDQoCBgYDYQMDDQMDAAADAAAAAAElAS0AJAA/AFMAABMyHgIXFhcWFzIXFRQOBA8BJy4FPQEWPgI3PgEXLgEnLgEiBgcOAQcVFB4EFz4FNS8BIwcnIwcVFwcVFzM3FzM3NSc3lwgNDQwHCgsVFg0LCxMZHyERBQQRIh4aEwoLGBYVCgwaiBUpEgkWFhUJEikWChEYGh4PEB0bFxEKRwcEJSUECCUlCAQlJQQHJSUBLAIEBgQGBQgCAUoWJiMeGxcKAwMKFxseIycUTAECBQkGCAg4AQwMBgYGBgwMATkSIiAbGBUJCRQZGyAiEgsIJiYIBCUlBAgmJggEJSUAAAADAAAAAAEaAR4ADgAfACsAADcWBgcXBycOAS4BPgEeAQcyNjcHPgE1NC4BIg4BFB4BNzUjNSMVIxUzFTM14gENDFAOTxxIORMcP0cwZBEfDAEMDhcnLiYXFyZFJRMmJhO5FCYQTw5QFwIrRUIjDDWADQwBDB8RFycXFyctJxdLEyUlEyUlAAAAAwAAAAABGgEeAA4AHwAjAAA3FgYHFwcnDgEuAT4BHgEHMjY3Bz4BNTQuASIOARQeASczFSPiAQ0MUA5PHEg5Exw/RzBkER8MAQwOFycuJhcXJhhdXbkUJhBPDlAXAitFQiMMNYANDAEMHxEXJxcXJy0nF10SAAAAAAAQAMYAAQAAAAAAAQAHAAAAAQAAAAAAAgAHAAcAAQAAAAAAAwAHAA4AAQAAAAAABAAHABUAAQAAAAAABQAMABwAAQAAAAAABgAHACgAAQAAAAAACgAkAC8AAQAAAAAACwATAFMAAwABBAkAAQAOAGYAAwABBAkAAgAOAHQAAwABBAkAAwAOAIIAAwABBAkABAAOAJAAAwABBAkABQAYAJ4AAwABBAkABgAOALYAAwABBAkACgBIAMQAAwABBAkACwAmAQxjb2RpY29uUmVndWxhcmNvZGljb25jb2RpY29uVmVyc2lvbiAxLjExY29kaWNvblRoZSBpY29uIGZvbnQgZm9yIFZpc3VhbCBTdHVkaW8gQ29kZWh0dHA6Ly9mb250ZWxsby5jb20AYwBvAGQAaQBjAG8AbgBSAGUAZwB1AGwAYQByAGMAbwBkAGkAYwBvAG4AYwBvAGQAaQBjAG8AbgBWAGUAcgBzAGkAbwBuACAAMQAuADEAMQBjAG8AZABpAGMAbwBuAFQAaABlACAAaQBjAG8AbgAgAGYAbwBuAHQAIABmAG8AcgAgAFYAaQBzAHUAYQBsACAAUwB0AHUAZABpAG8AIABDAG8AZABlAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAgAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHOAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9Af4B/wIAAgECAgIDAgQCBQIGAgcCCAIJAgoCCwIMAg0CDgIPAhACEQISAhMCFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIAIhAiICIwIkAiUCJgInAigCKQIqAisCLAItAi4CLwIwAjECMgIzAjQCNQI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMCRAJFAkYCRwJIAkkCSgJLAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAmcCaAJpAmoCawJsAm0CbgJvAnACcQJyAnMCdAJ1AnYCdwJ4AnkCegJ7AnwCfQJ+An8CgAKBAoICgwKEAoUChgKHAogCiQKKAosCjAKNAo4CjwKQApECkgKTApQClQKWApcCmAKZApoCmwKcAp0CngKfAqACoQKiAqMCpAKlAqYCpwKoAqkCqgKrAqwCrQKuAq8CsAKxArICswK0ArUCtgK3ArgCuQK6ArsCvAK9Ar4CvwLAAsECwgLDAsQCxQLGAscCyALJAsoCywLMAs0CzgLPAAdhY2NvdW50FGFjdGl2YXRlLWJyZWFrcG9pbnRzA2FkZAdhcmNoaXZlCmFycm93LWJvdGgRYXJyb3ctY2lyY2xlLWRvd24RYXJyb3ctY2lyY2xlLWxlZnQSYXJyb3ctY2lyY2xlLXJpZ2h0D2Fycm93LWNpcmNsZS11cAphcnJvdy1kb3duCmFycm93LWxlZnQLYXJyb3ctcmlnaHQQYXJyb3ctc21hbGwtZG93bhBhcnJvdy1zbWFsbC1sZWZ0EWFycm93LXNtYWxsLXJpZ2h0DmFycm93LXNtYWxsLXVwCmFycm93LXN3YXAIYXJyb3ctdXAGYXR0YWNoDGF6dXJlLWRldm9wcwVhenVyZQtiZWFrZXItc3RvcAZiZWFrZXIIYmVsbC1kb3QOYmVsbC1zbGFzaC1kb3QKYmVsbC1zbGFzaARiZWxsBWJsYW5rBGJvbGQEYm9vawhib29rbWFyawticmFja2V0LWRvdA1icmFja2V0LWVycm9yCWJyaWVmY2FzZQlicm9hZGNhc3QHYnJvd3NlcgNidWcIY2FsZW5kYXINY2FsbC1pbmNvbWluZw1jYWxsLW91dGdvaW5nDmNhc2Utc2Vuc2l0aXZlCWNoZWNrLWFsbAVjaGVjawljaGVja2xpc3QMY2hldnJvbi1kb3duDGNoZXZyb24tbGVmdA1jaGV2cm9uLXJpZ2h0CmNoZXZyb24tdXAEY2hpcAxjaHJvbWUtY2xvc2UPY2hyb21lLW1heGltaXplD2Nocm9tZS1taW5pbWl6ZQ5jaHJvbWUtcmVzdG9yZQ1jaXJjbGUtZmlsbGVkE2NpcmNsZS1sYXJnZS1maWxsZWQMY2lyY2xlLWxhcmdlDGNpcmNsZS1zbGFzaBNjaXJjbGUtc21hbGwtZmlsbGVkDGNpcmNsZS1zbWFsbAZjaXJjbGUNY2lyY3VpdC1ib2FyZAljbGVhci1hbGwGY2xpcHB5CWNsb3NlLWFsbAVjbG9zZQ5jbG91ZC1kb3dubG9hZAxjbG91ZC11cGxvYWQFY2xvdWQIY29kZS1vc3MEY29kZQZjb2ZmZWUMY29sbGFwc2UtYWxsCmNvbG9yLW1vZGUHY29tYmluZRJjb21tZW50LWRpc2N1c3Npb24NY29tbWVudC1kcmFmdBJjb21tZW50LXVucmVzb2x2ZWQHY29tbWVudA5jb21wYXNzLWFjdGl2ZQtjb21wYXNzLWRvdAdjb21wYXNzB2NvcGlsb3QEY29weQhjb3ZlcmFnZQtjcmVkaXQtY2FyZARkYXNoCWRhc2hib2FyZAhkYXRhYmFzZQlkZWJ1Zy1hbGwPZGVidWctYWx0LXNtYWxsCWRlYnVnLWFsdCdkZWJ1Zy1icmVha3BvaW50LWNvbmRpdGlvbmFsLXVudmVyaWZpZWQcZGVidWctYnJlYWtwb2ludC1jb25kaXRpb25hbCBkZWJ1Zy1icmVha3BvaW50LWRhdGEtdW52ZXJpZmllZBVkZWJ1Zy1icmVha3BvaW50LWRhdGEkZGVidWctYnJlYWtwb2ludC1mdW5jdGlvbi11bnZlcmlmaWVkGWRlYnVnLWJyZWFrcG9pbnQtZnVuY3Rpb24fZGVidWctYnJlYWtwb2ludC1sb2ctdW52ZXJpZmllZBRkZWJ1Zy1icmVha3BvaW50LWxvZxxkZWJ1Zy1icmVha3BvaW50LXVuc3VwcG9ydGVkDWRlYnVnLWNvbnNvbGUUZGVidWctY29udGludWUtc21hbGwOZGVidWctY29udGludWUOZGVidWctY292ZXJhZ2UQZGVidWctZGlzY29ubmVjdBJkZWJ1Zy1saW5lLWJ5LWxpbmULZGVidWctcGF1c2ULZGVidWctcmVydW4TZGVidWctcmVzdGFydC1mcmFtZQ1kZWJ1Zy1yZXN0YXJ0FmRlYnVnLXJldmVyc2UtY29udGludWUXZGVidWctc3RhY2tmcmFtZS1hY3RpdmUQZGVidWctc3RhY2tmcmFtZQtkZWJ1Zy1zdGFydA9kZWJ1Zy1zdGVwLWJhY2sPZGVidWctc3RlcC1pbnRvDmRlYnVnLXN0ZXAtb3V0D2RlYnVnLXN0ZXAtb3ZlcgpkZWJ1Zy1zdG9wBWRlYnVnEGRlc2t0b3AtZG93bmxvYWQTZGV2aWNlLWNhbWVyYS12aWRlbw1kZXZpY2UtY2FtZXJhDWRldmljZS1tb2JpbGUKZGlmZi1hZGRlZAxkaWZmLWlnbm9yZWQNZGlmZi1tb2RpZmllZA1kaWZmLW11bHRpcGxlDGRpZmYtcmVtb3ZlZAxkaWZmLXJlbmFtZWQLZGlmZi1zaW5nbGUEZGlmZgdkaXNjYXJkBGVkaXQNZWRpdG9yLWxheW91dAhlbGxpcHNpcwxlbXB0eS13aW5kb3cLZXJyb3Itc21hbGwFZXJyb3IHZXhjbHVkZQpleHBhbmQtYWxsBmV4cG9ydApleHRlbnNpb25zCmV5ZS1jbG9zZWQDZXllCGZlZWRiYWNrC2ZpbGUtYmluYXJ5CWZpbGUtY29kZQpmaWxlLW1lZGlhCGZpbGUtcGRmDmZpbGUtc3VibW9kdWxlFmZpbGUtc3ltbGluay1kaXJlY3RvcnkRZmlsZS1zeW1saW5rLWZpbGUIZmlsZS16aXAEZmlsZQVmaWxlcw1maWx0ZXItZmlsbGVkBmZpbHRlcgVmbGFtZQlmb2xkLWRvd24HZm9sZC11cARmb2xkDWZvbGRlci1hY3RpdmUOZm9sZGVyLWxpYnJhcnkNZm9sZGVyLW9wZW5lZAZmb2xkZXIEZ2FtZQRnZWFyBGdpZnQLZ2lzdC1zZWNyZXQKZ2l0LWNvbW1pdAtnaXQtY29tcGFyZQlnaXQtZmV0Y2gJZ2l0LW1lcmdlF2dpdC1wdWxsLXJlcXVlc3QtY2xvc2VkF2dpdC1wdWxsLXJlcXVlc3QtY3JlYXRlFmdpdC1wdWxsLXJlcXVlc3QtZHJhZnQeZ2l0LXB1bGwtcmVxdWVzdC1nby10by1jaGFuZ2VzHGdpdC1wdWxsLXJlcXVlc3QtbmV3LWNoYW5nZXMQZ2l0LXB1bGwtcmVxdWVzdA9naXQtc3Rhc2gtYXBwbHkNZ2l0LXN0YXNoLXBvcAlnaXQtc3Rhc2gNZ2l0aHViLWFjdGlvbgpnaXRodWItYWx0D2dpdGh1Yi1pbnZlcnRlZA5naXRodWItcHJvamVjdAZnaXRodWIFZ2xvYmUKZ28tdG8tZmlsZQxnby10by1zZWFyY2gHZ3JhYmJlcgpncmFwaC1sZWZ0CmdyYXBoLWxpbmUNZ3JhcGgtc2NhdHRlcgVncmFwaAdncmlwcGVyEWdyb3VwLWJ5LXJlZi10eXBlDGhlYXJ0LWZpbGxlZAVoZWFydAdoaXN0b3J5BGhvbWUPaG9yaXpvbnRhbC1ydWxlBWh1Ym90BWluYm94BmluZGVudARpbmZvBmluc2VydAdpbnNwZWN0C2lzc3VlLWRyYWZ0Dmlzc3VlLXJlb3BlbmVkBmlzc3VlcwZpdGFsaWMGamVyc2V5BGpzb24Oa2ViYWItdmVydGljYWwDa2V5A2xhdw1sYXllcnMtYWN0aXZlCmxheWVycy1kb3QGbGF5ZXJzF2xheW91dC1hY3Rpdml0eWJhci1sZWZ0GGxheW91dC1hY3Rpdml0eWJhci1yaWdodA9sYXlvdXQtY2VudGVyZWQObGF5b3V0LW1lbnViYXITbGF5b3V0LXBhbmVsLWNlbnRlchRsYXlvdXQtcGFuZWwtanVzdGlmeRFsYXlvdXQtcGFuZWwtbGVmdBBsYXlvdXQtcGFuZWwtb2ZmEmxheW91dC1wYW5lbC1yaWdodAxsYXlvdXQtcGFuZWwXbGF5b3V0LXNpZGViYXItbGVmdC1vZmYTbGF5b3V0LXNpZGViYXItbGVmdBhsYXlvdXQtc2lkZWJhci1yaWdodC1vZmYUbGF5b3V0LXNpZGViYXItcmlnaHQQbGF5b3V0LXN0YXR1c2JhcgZsYXlvdXQHbGlicmFyeRFsaWdodGJ1bGItYXV0b2ZpeBFsaWdodGJ1bGItc3BhcmtsZQlsaWdodGJ1bGINbGluay1leHRlcm5hbARsaW5rC2xpc3QtZmlsdGVyCWxpc3QtZmxhdAxsaXN0LW9yZGVyZWQObGlzdC1zZWxlY3Rpb24JbGlzdC10cmVlDmxpc3QtdW5vcmRlcmVkCmxpdmUtc2hhcmUHbG9hZGluZwhsb2NhdGlvbgpsb2NrLXNtYWxsBGxvY2sGbWFnbmV0CW1haWwtcmVhZARtYWlsCm1hcC1maWxsZWQTbWFwLXZlcnRpY2FsLWZpbGxlZAxtYXAtdmVydGljYWwDbWFwCG1hcmtkb3duCW1lZ2FwaG9uZQdtZW50aW9uBG1lbnUFbWVyZ2UKbWljLWZpbGxlZANtaWMJbWlsZXN0b25lBm1pcnJvcgxtb3J0YXItYm9hcmQEbW92ZRBtdWx0aXBsZS13aW5kb3dzBW11c2ljBG11dGUIbmV3LWZpbGUKbmV3LWZvbGRlcgduZXdsaW5lCm5vLW5ld2xpbmUEbm90ZRFub3RlYm9vay10ZW1wbGF0ZQhub3RlYm9vawhvY3RvZmFjZQxvcGVuLXByZXZpZXcMb3JnYW5pemF0aW9uBm91dHB1dAdwYWNrYWdlCHBhaW50Y2FuC3Bhc3MtZmlsbGVkBHBhc3MKcGVyY2VudGFnZQpwZXJzb24tYWRkBnBlcnNvbgVwaWFubwlwaWUtY2hhcnQDcGluDHBpbm5lZC1kaXJ0eQZwaW5uZWQLcGxheS1jaXJjbGUEcGxheQRwbHVnDXByZXNlcnZlLWNhc2UHcHJldmlldxBwcmltaXRpdmUtc3F1YXJlB3Byb2plY3QFcHVsc2UIcXVlc3Rpb24FcXVvdGULcmFkaW8tdG93ZXIJcmVhY3Rpb25zC3JlY29yZC1rZXlzDHJlY29yZC1zbWFsbAZyZWNvcmQEcmVkbwpyZWZlcmVuY2VzB3JlZnJlc2gFcmVnZXgPcmVtb3RlLWV4cGxvcmVyBnJlbW90ZQZyZW1vdmULcmVwbGFjZS1hbGwHcmVwbGFjZQVyZXBseQpyZXBvLWNsb25lCnJlcG8tZmV0Y2gPcmVwby1mb3JjZS1wdXNoC3JlcG8tZm9ya2VkCXJlcG8tcHVsbAlyZXBvLXB1c2gEcmVwbwZyZXBvcnQPcmVxdWVzdC1jaGFuZ2VzBXJvYm90BnJvY2tldBJyb290LWZvbGRlci1vcGVuZWQLcm9vdC1mb2xkZXIDcnNzBHJ1YnkJcnVuLWFib3ZlEHJ1bi1hbGwtY292ZXJhZ2UHcnVuLWFsbAlydW4tYmVsb3cMcnVuLWNvdmVyYWdlCnJ1bi1lcnJvcnMIc2F2ZS1hbGwHc2F2ZS1hcwRzYXZlC3NjcmVlbi1mdWxsDXNjcmVlbi1ub3JtYWwMc2VhcmNoLWZ1enp5C3NlYXJjaC1zdG9wBnNlYXJjaARzZW5kEnNlcnZlci1lbnZpcm9ubWVudA5zZXJ2ZXItcHJvY2VzcwZzZXJ2ZXINc2V0dGluZ3MtZ2VhcghzZXR0aW5ncwVzaGFyZQZzaGllbGQHc2lnbi1pbghzaWduLW91dAZzbWlsZXkFc25ha2UPc29ydC1wcmVjZWRlbmNlDnNvdXJjZS1jb250cm9sDnNwYXJrbGUtZmlsbGVkB3NwYXJrbGUQc3BsaXQtaG9yaXpvbnRhbA5zcGxpdC12ZXJ0aWNhbAhzcXVpcnJlbApzdGFyLWVtcHR5CXN0YXItZnVsbAlzdGFyLWhhbGYLc3RvcC1jaXJjbGUNc3Vycm91bmQtd2l0aAxzeW1ib2wtYXJyYXkOc3ltYm9sLWJvb2xlYW4Mc3ltYm9sLWNsYXNzDHN5bWJvbC1jb2xvcg9zeW1ib2wtY29uc3RhbnQSc3ltYm9sLWVudW0tbWVtYmVyC3N5bWJvbC1lbnVtDHN5bWJvbC1ldmVudAxzeW1ib2wtZmllbGQLc3ltYm9sLWZpbGUQc3ltYm9sLWludGVyZmFjZQpzeW1ib2wta2V5DnN5bWJvbC1rZXl3b3JkDXN5bWJvbC1tZXRob2QLc3ltYm9sLW1pc2MQc3ltYm9sLW5hbWVzcGFjZQ5zeW1ib2wtbnVtZXJpYw9zeW1ib2wtb3BlcmF0b3IQc3ltYm9sLXBhcmFtZXRlcg9zeW1ib2wtcHJvcGVydHkMc3ltYm9sLXJ1bGVyDnN5bWJvbC1zbmlwcGV0DXN5bWJvbC1zdHJpbmcQc3ltYm9sLXN0cnVjdHVyZQ9zeW1ib2wtdmFyaWFibGUMc3luYy1pZ25vcmVkBHN5bmMFdGFibGUDdGFnBnRhcmdldAh0YXNrbGlzdAl0ZWxlc2NvcGUNdGVybWluYWwtYmFzaAx0ZXJtaW5hbC1jbWQPdGVybWluYWwtZGViaWFuDnRlcm1pbmFsLWxpbnV4E3Rlcm1pbmFsLXBvd2Vyc2hlbGwNdGVybWluYWwtdG11eA90ZXJtaW5hbC11YnVudHUIdGVybWluYWwJdGV4dC1zaXplCnRocmVlLWJhcnMRdGh1bWJzZG93bi1maWxsZWQKdGh1bWJzZG93bg90aHVtYnN1cC1maWxsZWQIdGh1bWJzdXAFdG9vbHMFdHJhc2gNdHJpYW5nbGUtZG93bg10cmlhbmdsZS1sZWZ0DnRyaWFuZ2xlLXJpZ2h0C3RyaWFuZ2xlLXVwB3R3aXR0ZXISdHlwZS1oaWVyYXJjaHktc3ViFHR5cGUtaGllcmFyY2h5LXN1cGVyDnR5cGUtaGllcmFyY2h5BnVuZm9sZBN1bmdyb3VwLWJ5LXJlZi10eXBlBnVubG9jawZ1bm11dGUKdW52ZXJpZmllZA52YXJpYWJsZS1ncm91cA92ZXJpZmllZC1maWxsZWQIdmVyaWZpZWQIdmVyc2lvbnMJdm0tYWN0aXZlCnZtLWNvbm5lY3QKdm0tb3V0bGluZQp2bS1ydW5uaW5nAnZtAnZyD3ZzY29kZS1pbnNpZGVycwZ2c2NvZGUEd2FuZAd3YXJuaW5nBXdhdGNoCndoaXRlc3BhY2UKd2hvbGUtd29yZAZ3aW5kb3cJd29yZC13cmFwEXdvcmtzcGFjZS10cnVzdGVkEXdvcmtzcGFjZS11bmtub3duE3dvcmtzcGFjZS11bnRydXN0ZWQHem9vbS1pbgh6b29tLW91dAAA", qNe = 300; -let $B = !1; -function $Ne() { - if ($B) return; - $B = !0; +const TNe = "data:font/ttf;base64,AAEAAAALAIAAAwAwR1NVQiCLJXoAAAE4AAAAVE9TLzI3T0tHAAABjAAAAGBjbWFwQ5s/ewAACSQAABreZ2x5ZvJtKHkAACekAAD3FGhlYWRYl6BTAAAA4AAAADZoaGVhAlsC+QAAALwAAAAkaG10eBxB//oAAAHsAAAHOGxvY2EFi8dWAAAkBAAAA55tYXhwAu8BgQAAARgAAAAgbmFtZZP3uUsAAR64AAAB+HBvc3RjGEbCAAEgsAAAGSQAAQAAASwAAAAAASz////+AS4AAQAAAAAAAAAAAAAAAAAAAc4AAQAAAAEAAFT7+XFfDzz1AAsBLAAAAAB8JbCAAAAAAHwlsID////9AS4BLQAAAAgAAgAAAAAAAAABAAABzgF1ABcAAAAAAAIAAAAKAAoAAAD/AAAAAAAAAAEAAAAKADAAPgACREZMVAAObGF0bgAaAAQAAAAAAAAAAQAAAAQAAAAAAAAAAQAAAAFsaWdhAAgAAAABAAAAAQAEAAQAAAABAAgAAQAGAAAAAQAAAAQBKwGQAAUAAADLANIAAAAqAMsA0gAAAJAADgBNAAACAAUDAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFBmRWQAwOpg8QEBLAAAABsBRwADAAAAAQAAAAAAAAAAAAAAAAACAAAAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEs//8BLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLP//ASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEs//8BLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASz//wEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASz//wEsAAABLAAAASwAAAEs//8BLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAASwAAAEsAAABLAAAAAAABQAAAAMAAAAsAAAABAAABSYAAQAAAAAEIAADAAEAAAAsAAMACgAABSYABAP0AAAAEgAQAAMAAuqI6ozqx+rJ6wnrTuw08QH//wAA6mDqiuqP6snqzOsL61DxAf//AAAAAAAAAAAAAAAAAAAAAAABABIAYgBmANYA1gFQAdYDngAAAAMA8QFKAUcAtAE3AZUBJQFuAQ4BdABOAcMBYAFqAWkAkQA2ATAAhgDPAP4AQQGTAHkAFwG+AJsAiAFDAR0BFAEVAagAyQCmALwBoAGAAIsBkQF5AYgBhgF6AYkBkAGLAYQAvgF/AY0AAgAEAAUACgALAAwADQAOAA8AEAASABsAHQAeAB8AXABdAF4AXwBiAGMAIgAjACQAJQAmACkAKwAsAC0ALgAvADAAMgAzADQANQA8ADkAPQA+AD8AQABCAEMARgBIAEkASwBVAFYAVwBYAGcAaQBrAG4AcgB0AHUAdgB3AHgAegB7AHwAfQB+AH8AgQCCAIQAhQCHAIkAjACPAJAAkwCUAJUAlgCXAJgAmQCaAJwAngCfAKAAoQCiAKMApQCoAKkAqgCUAKsArACuALgAuQC9AMAAxADFAMgAygDLAMwAzQDTANQA1QDWANcA2ADZANoA7wDyAPMA9gD5APoA+wD8AQABAQEGAQcBCAENAQ8BEAERARMBFwEYARsBHAEfASABKAEsAS0BLgEvATEBMgEzATQBNQE2ATsBPAE9AT4BPwFAAUEBQgFEAUYBSAFJAUsBTAFOAU8BUAFRAVIBWQFaAVsBXAFdAV8BZAFlAWYBaAFrAW0BcQFyAXMBdQF2AXsBfAF9AX4BgQGCAYMBhQGHAYoBjAGOAZcBmAGhAaIBpAGmAacBqQGqAasBrAGtAbEBswG0AbUBuAG5AboBvAG9AcQBxQHGAccByAHMAc0A9AD1APcA+ABgAGEAcAA6AHEAZAGPAG8AcwBtAFsAJwAoAQkAjQCSAMYBsgABABgAZQDuAR4BVQGSASoAugFjAWIBIgF3ASsBOQBaAbsARAEKAI4AwQD/ARoBOgAqASkBIQA3ADgASgGUAbYBsAGuAa8AsAFTAVYBGQBsAckBywHKAZoBmwGcAZ0BngGfAZkAEQBTASQAnQHCAGoA0QDdANwA2wBRAFAATwAVANIArwCxAFkAaAFYAKQAZgAWAMIAwwEnACAAIQD9ABQBtwEWAO0A3gDfAOQA4gDjAOYA5wDpAOsA7ADhAOABlgDOATgAigAGAAcACAAJAOoA5QDoABwAxwEFAQIAOwAaABkATQCyALMBXgBMAWEBcADQAQwBowGlAEcBbACnAb8AMQEmARIBCwFFAFIA8AFNAW8AgwCAAXgBZwC3ALUAtgHBAcAARQFXAVQAVAC7AQQBAwC/ASMAEwCtAAABBgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAMAAAAABW4AAAAAAAAAc4AAOpgAADqYAAAAAMAAOphAADqYQAAAPEAAOpiAADqYgAAAUoAAOpjAADqYwAAAUcAAOpkAADqZAAAALQAAOplAADqZQAAATcAAOpmAADqZgAAAZUAAOpnAADqZwAAASUAAOpoAADqaAAAAW4AAOppAADqaQAAAQ4AAOpqAADqagAAAXQAAOprAADqawAAAE4AAOpsAADqbAAAAcMAAOptAADqbQAAAWAAAOpuAADqbgAAAWoAAOpvAADqbwAAAWkAAOpwAADqcAAAAJEAAOpxAADqcQAAADYAAOpyAADqcgAAATAAAOpzAADqcwAAAIYAAOp0AADqdAAAAM8AAOp1AADqdQAAAP4AAOp2AADqdgAAAEEAAOp3AADqdwAAAZMAAOp4AADqeAAAAHkAAOp5AADqeQAAABcAAOp6AADqegAAAb4AAOp7AADqewAAAJsAAOp8AADqfAAAAIgAAOp9AADqfQAAAUMAAOp+AADqfgAAAR0AAOp/AADqfwAAARQAAOqAAADqgAAAARUAAOqBAADqgQAAAagAAOqCAADqggAAAMkAAOqDAADqgwAAAKYAAOqEAADqhAAAALwAAOqFAADqhQAAAaAAAOqGAADqhgAAAYAAAOqHAADqhwAAAIsAAOqIAADqiAAAAZEAAOqKAADqigAAAXkAAOqLAADqiwAAAYgAAOqMAADqjAAAAYYAAOqPAADqjwAAAXoAAOqQAADqkAAAAYkAAOqRAADqkQAAAZAAAOqSAADqkgAAAYsAAOqTAADqkwAAAYQAAOqUAADqlAAAAL4AAOqVAADqlQAAAX8AAOqWAADqlgAAAY0AAOqXAADqlwAAAAIAAOqYAADqmAAAAAQAAOqZAADqmQAAAAUAAOqaAADqmgAAAAoAAOqbAADqmwAAAAsAAOqcAADqnAAAAAwAAOqdAADqnQAAAA0AAOqeAADqngAAAA4AAOqfAADqnwAAAA8AAOqgAADqoAAAABAAAOqhAADqoQAAABIAAOqiAADqogAAABsAAOqjAADqowAAAB0AAOqkAADqpAAAAB4AAOqlAADqpQAAAB8AAOqmAADqpgAAAFwAAOqnAADqpwAAAF0AAOqoAADqqAAAAF4AAOqpAADqqQAAAF8AAOqqAADqqgAAAGIAAOqrAADqqwAAAGMAAOqsAADqrAAAACIAAOqtAADqrQAAACMAAOquAADqrgAAACQAAOqvAADqrwAAACUAAOqwAADqsAAAACYAAOqxAADqsQAAACkAAOqyAADqsgAAACsAAOqzAADqswAAACwAAOq0AADqtAAAAC0AAOq1AADqtQAAAC4AAOq2AADqtgAAAC8AAOq3AADqtwAAADAAAOq4AADquAAAADIAAOq5AADquQAAADMAAOq6AADqugAAADQAAOq7AADquwAAADUAAOq8AADqvAAAADwAAOq9AADqvQAAADkAAOq+AADqvgAAAD0AAOq/AADqvwAAAD4AAOrAAADqwAAAAD8AAOrBAADqwQAAAEAAAOrCAADqwgAAAEIAAOrDAADqwwAAAEMAAOrEAADqxAAAAEYAAOrFAADqxQAAAEgAAOrGAADqxgAAAEkAAOrHAADqxwAAAEsAAOrJAADqyQAAAFUAAOrMAADqzAAAAFYAAOrNAADqzQAAAFcAAOrOAADqzgAAAFgAAOrPAADqzwAAAGcAAOrQAADq0AAAAGkAAOrRAADq0QAAAGsAAOrSAADq0gAAAG4AAOrTAADq0wAAAHIAAOrUAADq1AAAAHQAAOrVAADq1QAAAHUAAOrWAADq1gAAAHYAAOrXAADq1wAAAHcAAOrYAADq2AAAAHgAAOrZAADq2QAAAHoAAOraAADq2gAAAHsAAOrbAADq2wAAAHwAAOrcAADq3AAAAH0AAOrdAADq3QAAAH4AAOreAADq3gAAAH8AAOrfAADq3wAAAIEAAOrgAADq4AAAAIIAAOrhAADq4QAAAIQAAOriAADq4gAAAIUAAOrjAADq4wAAAIcAAOrkAADq5AAAAIkAAOrlAADq5QAAAIwAAOrmAADq5gAAAI8AAOrnAADq5wAAAJAAAOroAADq6AAAAJMAAOrpAADq6QAAAJQAAOrqAADq6gAAAJUAAOrrAADq6wAAAJYAAOrsAADq7AAAAJcAAOrtAADq7QAAAJgAAOruAADq7gAAAJkAAOrvAADq7wAAAJoAAOrwAADq8AAAAJwAAOrxAADq8QAAAJ4AAOryAADq8gAAAJ8AAOrzAADq8wAAAKAAAOr0AADq9AAAAKEAAOr1AADq9QAAAKIAAOr2AADq9gAAAKMAAOr3AADq9wAAAKUAAOr4AADq+AAAAKgAAOr5AADq+QAAAKkAAOr6AADq+gAAAKoAAOr7AADq+wAAAJQAAOr8AADq/AAAAKsAAOr9AADq/QAAAKwAAOr+AADq/gAAAK4AAOr/AADq/wAAALgAAOsAAADrAAAAALkAAOsBAADrAQAAAL0AAOsCAADrAgAAAMAAAOsDAADrAwAAAMQAAOsEAADrBAAAAMUAAOsFAADrBQAAAMgAAOsGAADrBgAAAMoAAOsHAADrBwAAAMsAAOsIAADrCAAAAMwAAOsJAADrCQAAAM0AAOsLAADrCwAAANMAAOsMAADrDAAAANQAAOsNAADrDQAAANUAAOsOAADrDgAAANYAAOsPAADrDwAAANcAAOsQAADrEAAAANgAAOsRAADrEQAAANkAAOsSAADrEgAAANoAAOsTAADrEwAAAO8AAOsUAADrFAAAAPIAAOsVAADrFQAAAPMAAOsWAADrFgAAAPYAAOsXAADrFwAAAPkAAOsYAADrGAAAAPoAAOsZAADrGQAAAPsAAOsaAADrGgAAAPwAAOsbAADrGwAAAQAAAOscAADrHAAAAQEAAOsdAADrHQAAAQYAAOseAADrHgAAAQcAAOsfAADrHwAAAQgAAOsgAADrIAAAAQ0AAOshAADrIQAAAQ8AAOsiAADrIgAAARAAAOsjAADrIwAAAREAAOskAADrJAAAARMAAOslAADrJQAAARcAAOsmAADrJgAAARgAAOsnAADrJwAAARsAAOsoAADrKAAAARwAAOspAADrKQAAAR8AAOsqAADrKgAAASAAAOsrAADrKwAAASgAAOssAADrLAAAASwAAOstAADrLQAAAS0AAOsuAADrLgAAAS4AAOsvAADrLwAAAS8AAOswAADrMAAAATEAAOsxAADrMQAAATIAAOsyAADrMgAAATMAAOszAADrMwAAATQAAOs0AADrNAAAATUAAOs1AADrNQAAATYAAOs2AADrNgAAATsAAOs3AADrNwAAATwAAOs4AADrOAAAAT0AAOs5AADrOQAAAT4AAOs6AADrOgAAAT8AAOs7AADrOwAAAUAAAOs8AADrPAAAAUEAAOs9AADrPQAAAUIAAOs+AADrPgAAAUQAAOs/AADrPwAAAUYAAOtAAADrQAAAAUgAAOtBAADrQQAAAUkAAOtCAADrQgAAAUsAAOtDAADrQwAAAUwAAOtEAADrRAAAAU4AAOtFAADrRQAAAU8AAOtGAADrRgAAAVAAAOtHAADrRwAAAVEAAOtIAADrSAAAAVIAAOtJAADrSQAAAVkAAOtKAADrSgAAAVoAAOtLAADrSwAAAVsAAOtMAADrTAAAAVwAAOtNAADrTQAAAV0AAOtOAADrTgAAAV8AAOtQAADrUAAAAWQAAOtRAADrUQAAAWUAAOtSAADrUgAAAWYAAOtTAADrUwAAAWgAAOtUAADrVAAAAWsAAOtVAADrVQAAAW0AAOtWAADrVgAAAXEAAOtXAADrVwAAAXIAAOtYAADrWAAAAXMAAOtZAADrWQAAAXUAAOtaAADrWgAAAXYAAOtbAADrWwAAAXsAAOtcAADrXAAAAXwAAOtdAADrXQAAAX0AAOteAADrXgAAAX4AAOtfAADrXwAAAYEAAOtgAADrYAAAAYIAAOthAADrYQAAAYMAAOtiAADrYgAAAYUAAOtjAADrYwAAAYcAAOtkAADrZAAAAYoAAOtlAADrZQAAAYwAAOtmAADrZgAAAY4AAOtnAADrZwAAAZcAAOtoAADraAAAAZgAAOtpAADraQAAAaEAAOtqAADragAAAaIAAOtrAADrawAAAaQAAOtsAADrbAAAAaYAAOttAADrbQAAAacAAOtuAADrbgAAAakAAOtvAADrbwAAAaoAAOtwAADrcAAAAasAAOtxAADrcQAAAawAAOtyAADrcgAAAa0AAOtzAADrcwAAAbEAAOt0AADrdAAAAbMAAOt1AADrdQAAAbQAAOt2AADrdgAAAbUAAOt3AADrdwAAAbgAAOt4AADreAAAAbkAAOt5AADreQAAAboAAOt6AADregAAAbwAAOt7AADrewAAAb0AAOt8AADrfAAAAcQAAOt9AADrfQAAAcUAAOt+AADrfgAAAcYAAOt/AADrfwAAAccAAOuAAADrgAAAAcgAAOuBAADrgQAAAcwAAOuCAADrggAAAc0AAOuDAADrgwAAAPQAAOuEAADrhAAAAPUAAOuFAADrhQAAAPcAAOuGAADrhgAAAPgAAOuHAADrhwAAAGAAAOuIAADriAAAAGEAAOuJAADriQAAAHAAAOuKAADrigAAADoAAOuLAADriwAAAHEAAOuMAADrjAAAAGQAAOuNAADrjQAAAY8AAOuOAADrjgAAAG8AAOuPAADrjwAAAHMAAOuQAADrkAAAAG0AAOuRAADrkQAAAFsAAOuSAADrkgAAACcAAOuTAADrkwAAACgAAOuUAADrlAAAAQkAAOuVAADrlQAAAI0AAOuWAADrlgAAAJIAAOuXAADrlwAAAMYAAOuYAADrmAAAAbIAAOuZAADrmQAAAAEAAOuaAADrmgAAABgAAOubAADrmwAAAGUAAOucAADrnAAAAO4AAOudAADrnQAAAR4AAOueAADrngAAAVUAAOufAADrnwAAAZIAAOugAADroAAAASoAAOuhAADroQAAALoAAOuiAADrogAAAWMAAOujAADrowAAAWIAAOukAADrpAAAASIAAOulAADrpQAAAXcAAOumAADrpgAAASsAAOunAADrpwAAATkAAOuoAADrqAAAAFoAAOupAADrqQAAAbsAAOuqAADrqgAAAEQAAOurAADrqwAAAQoAAOusAADrrAAAAI4AAOutAADrrQAAAMEAAOuuAADrrgAAAP8AAOuvAADrrwAAARoAAOuwAADrsAAAAToAAOuxAADrsQAAACoAAOuyAADrsgAAASkAAOuzAADrswAAASEAAOu0AADrtAAAADcAAOu1AADrtQAAADgAAOu2AADrtgAAAEoAAOu3AADrtwAAAZQAAOu4AADruAAAAbYAAOu5AADruQAAAbAAAOu6AADrugAAAa4AAOu7AADruwAAAa8AAOu8AADrvAAAALAAAOu9AADrvQAAAVMAAOu+AADrvgAAAVYAAOu/AADrvwAAARkAAOvAAADrwAAAAGwAAOvBAADrwQAAAckAAOvCAADrwgAAAcsAAOvDAADrwwAAAcoAAOvEAADrxAAAAZoAAOvFAADrxQAAAZsAAOvGAADrxgAAAZwAAOvHAADrxwAAAZ0AAOvIAADryAAAAZ4AAOvJAADryQAAAZ8AAOvKAADrygAAAZkAAOvLAADrywAAABEAAOvMAADrzAAAAFMAAOvNAADrzQAAASQAAOvOAADrzgAAAJ0AAOvPAADrzwAAAcIAAOvQAADr0AAAAGoAAOvRAADr0QAAANEAAOvSAADr0gAAAN0AAOvTAADr0wAAANwAAOvUAADr1AAAANsAAOvVAADr1QAAAFEAAOvWAADr1gAAAFAAAOvXAADr1wAAAE8AAOvYAADr2AAAABUAAOvZAADr2QAAANIAAOvaAADr2gAAAK8AAOvbAADr2wAAALEAAOvcAADr3AAAAFkAAOvdAADr3QAAAGgAAOveAADr3gAAAVgAAOvfAADr3wAAAKQAAOvgAADr4AAAAGYAAOvhAADr4QAAABYAAOviAADr4gAAAMIAAOvjAADr4wAAAMMAAOvkAADr5AAAAScAAOvlAADr5QAAACAAAOvmAADr5gAAACEAAOvnAADr5wAAAP0AAOvoAADr6AAAABQAAOvpAADr6QAAAbcAAOvqAADr6gAAARYAAOvrAADr6wAAAO0AAOvsAADr7AAAAN4AAOvtAADr7QAAAN8AAOvuAADr7gAAAOQAAOvvAADr7wAAAOIAAOvwAADr8AAAAOMAAOvxAADr8QAAAOYAAOvyAADr8gAAAOcAAOvzAADr8wAAAOkAAOv0AADr9AAAAOsAAOv1AADr9QAAAOwAAOv2AADr9gAAAOEAAOv3AADr9wAAAOAAAOv4AADr+AAAAZYAAOv5AADr+QAAAM4AAOv6AADr+gAAATgAAOv7AADr+wAAAIoAAOv8AADr/AAAAAYAAOv9AADr/QAAAAcAAOv+AADr/gAAAAgAAOv/AADr/wAAAAkAAOwAAADsAAAAAOoAAOwBAADsAQAAAOUAAOwCAADsAgAAAOgAAOwDAADsAwAAABwAAOwEAADsBAAAAMcAAOwFAADsBQAAAQUAAOwGAADsBgAAAQIAAOwHAADsBwAAADsAAOwIAADsCAAAABoAAOwJAADsCQAAABkAAOwKAADsCgAAAE0AAOwLAADsCwAAALIAAOwMAADsDAAAALMAAOwNAADsDQAAAV4AAOwOAADsDgAAAEwAAOwPAADsDwAAAWEAAOwQAADsEAAAAXAAAOwRAADsEQAAANAAAOwSAADsEgAAAQwAAOwTAADsEwAAAaMAAOwUAADsFAAAAaUAAOwVAADsFQAAAEcAAOwWAADsFgAAAWwAAOwXAADsFwAAAKcAAOwYAADsGAAAAb8AAOwZAADsGQAAADEAAOwaAADsGgAAASYAAOwbAADsGwAAARIAAOwcAADsHAAAAQsAAOwdAADsHQAAAUUAAOweAADsHgAAAFIAAOwfAADsHwAAAPAAAOwgAADsIAAAAU0AAOwhAADsIQAAAW8AAOwiAADsIgAAAIMAAOwjAADsIwAAAIAAAOwkAADsJAAAAXgAAOwlAADsJQAAAWcAAOwmAADsJgAAALcAAOwnAADsJwAAALUAAOwoAADsKAAAALYAAOwpAADsKQAAAcEAAOwqAADsKgAAAcAAAOwrAADsKwAAAEUAAOwsAADsLAAAAVcAAOwtAADsLQAAAVQAAOwuAADsLgAAAFQAAOwvAADsLwAAALsAAOwwAADsMAAAAQQAAOwxAADsMQAAAQMAAOwyAADsMgAAAL8AAOwzAADsMwAAASMAAOw0AADsNAAAABMAAPEBAADxAQAAAK0AAAAAAAAAlADUAOgBFAEyAWwBpgHgAhoCLgJCAlYCagJ+ApICpgLIAt4DGgM4A4oD5AQQBGYEzAUcBWoFagWYBeoGBgamB1oHmggkCEIIqgkcCdQKiArOCvYLCAtQC2ILdAuGC5gL4Av6DAwMGAw2DGIMkAz0DSoNPg1mDY4N/A4uDnwOtg7QDyYPgA/IEAIQJhCyEN4RBBFiEZwR8BImEkoSuBMWE2AUFBQ4FI4UuBTEFTYVihX0FlQWthbsFxAXKBc4F0gXVBdoF3YXmhgYGDIYTBiaGQoZNhlIGYIZzBn8GhYaPhpaGnAaohrEGugbHBs0G7Qb5BwKHFgcdhycHLwc4B0aHTYdWB2IHbod5h4IHjAeXB6EHrwfFB+WH8gf4iAaIHgguiEeIXohsiIEImwitCL6IzojoCPCI/AkAiQeJKIkwCTcJPglRiWEJbgl5iZYJsonQieOJ7goOCheKOQpeCn0KnwqxisKK54r3iwULEosiC0qLaQtyC5iLuQvIi9sL4Avxi/qMBYwVjB8MNoxCjFsMagx1jIcMnwyrDLKMxgzTDNwM940NDRwNKA07jWmNdg2PjamNvo3PDdqN4I3mje4N+A4BDgmOEQ4YjiAOJg4tjjOOOw5BDkcOVY5kjnkOn46vjriO0Q7XDt4PA48JjxGPHg83Dz6PUw9eD2mPew+Ej4yPko+ZD6QPrw+4j8SP3I/jD/iQBhAZECOQMpBAkFCQXZBxkH4QiZCYEJ+QsJC6kNwQ6pEJERuRVJFikW8RiJGRkaURtRHNkeOR8pIEEhkSNxJMEmCSZhJyEoOSkZKXkqGSqZLBks6S8RMIkyETLZNBk0yTZhNyE3uTkZOYk5wTypPkE+0UC5QqlDwUWBRmFHQUihSVlKGUxZTcFPMVCZUTlRyVJZU7lUOVTJVhlXiVhxWXFaCVrZW8Fc6V5hXylfoWCRYsFkaWZRZ+lpaWtBbCFtCW5xcEFxWXMJdSl4QXi5eTF86X2xfgl+oX/JgOGBYYIpgzmFeYYBhumH6Yh5iSmJsYqJjOGNsY5hj3mSWZMBlQGV8ZeZmDmZIZr5m+mc+Z4BnvGgCaE5opmjKaRRprGoEbARtum3mbgpudm6ebspu4m8Qb2JvkG/icIBwunDKcNpw6nD6cVpxmnHaciRyanLacwRzUnPYdHR0pHT2dSh1ZHW6dfx2SHZodtp3Hndgd7p32ngYeER4nni8eYB58HqSewp7TnuKAAAABAAA//8BLAEsABEAIgA0AGQAACU0LgEiDgEVFBYfARYyPwE+AQciJzc+BDMyHgEXFhcGJyY0PgIyHgIUDgEHBicuARcwPQEuAScmJzY3Njc2JzYuAiIOAhUUHgEXFhcGBw4BBxUuATU0PgEyHgEVFAYBLChFUkUoHBkNJlwmDhgclikiAQMKDhAVCg8dFQYDAiJYBAgNEhYRDggIDgkTFAgOhwQRDAkLBQQHBQoBAQsUGh0aEwsGCAgEBQoJDBEFEhQjPEg8IxOWKUUoKEUpITwVChoaChU8YhgHChEOCgULFQ4ICRiLCRQSDQkIDhIVEQ4ECAgEDlsBAQ4YCQcFAwQHCBAUDhoUCgoUGg4KEw4IBAQEBwkYDwESMBokPCMjPCQaMAAAAAACAAAAAAEaARoAGgAoAAAlFg4BBzQnPgE3LgMOAQcmIz4CMzIeAgciDgEUHgEyPgE0LgEjARkBFCIWAxkiAQEQHSMeEwIJCgMYJRURHxgMshcnFhYnLicXFycXxRYlGAIKCQMlGhEeEgEPHBEDFSIUDBgfGhcnLicWFicuJxYAAAEAAAAAAQcBGgALAAAlFSMVIzUjNTM1MxUBB3ETcHATqRNwcBNwcAAEAAAAAAEaARoADQASABYAGgAAASMHFRczFRczNzUzNzUHIzUzFQc1MxUnIxUzARD0CQkKCc4KCQkc1+HPvCZwcAEZCTgKnwkJnwo4LyYmqZaWcRMAAAAAAQAAAAABEgDMAA8AADcXByc1NxcHMyc3FxUHJzc4KA04OA0ovCgNODgNKIMoDTgNOQ4oKA45DTgNKAAAAwAAAAABBwEHAAkAFgAjAAA3FzUzFTcXByMnNzQuASIOARQeATI+AScUDgEiLgE0PgEyHgFlKBMmDjgNOLAfMz4zHh4zPjMfExksMiwZGSwyLBmUKGxqJg03Nw8fMx8fMz4zHh4zHxksGRksMiwZGSwAAAADAAAAAAEHAQcACQAXACQAADcnMzUjNycHFRc3Mh4BFA4CLgI+ARcVIg4BFB4BMj4BNC4BlChsaiYNNzcPHzMfHzM+Mx4BHzMfGSwZGSwyLBkZLGUoEyYOOA04sB8zPjMeAR8zPjMfARIZLDIsGRksMiwZAAMAAAAAAQcBBwAJABYAIwAANxcjFTMHFzc1JwcGLgI+ATIeARQOAScyPgE0LgEiDgEUHgGYKGxqJg03Nw8fMx4BHzM+Mx8fMx8ZLBkZLDIsGRksxygTJg44DTivAR8zPjMfHzM+Mx4SGSwyLBkZLDIsGQAAAwAAAAABBwEHAAkAFgAjAAA/ARUzNRc3JyMHFxQOAi4CPgEyHgEHNC4BIg4BFB4BMj4BZSgTJg44DTiwHzM+Mx4BHzM+Mx8TGSwyLBkZLDIsGZgobGomDTc3Dx8zHgEfMz4zHx8zHxksGRksMiwZGSwAAAABAAAAAAEEAQcACQAANxczNycHNSMVJzteDV4NThNOg11dDk7ExE4AAQAAAAABBwDzAAkAADcHFRc3JzM1IzeDXV0OTsTETvJeDV4OTRNOAAEAAAAAAQcA8QAJAAA/ATUnBxcjFTMHqV5eDk7Dw04oXQ5dDU4STgABAAAAAADJAOEACQAANwcjJzcXNTMVN8kvDS8NHxMfii8vDR5oaB8AAQAAAAAA0QDPAAkAADcnNTcXBzMVIxd6Ly8NH2lpH2MvDS8NHxMeAAEAAAAAANEAzwAJAAA3FxUHJzcjNTMnoi8vDR5oaB7OLw0vDh4THwABAAAAAADJAOEACQAAPwEzFwcnFSM1B14vDS8NHxMfsi8vDR9paR8AAgAAAAABGgEbAAkAEwAANyc1NxcHMxUjFz8BNScHFyMVMwdPPDwNLOnpLIE8PA0s6eksEjwNPA0sEyx2PA08DSwTLAABAAAAAAEEAQcACQAAJScjBxc3FTM1FwEEXg1eDU4TTaleXg5Ow8NOAAAAAAEAAAAAARwBHAAlAAA/ATYyFhQPAQYiJjQ/ATY0JiIPAQYUFjI/AT4BLgIGDwEOARYyNm0RMCIRgggYEQh0AwUIA3QOHCgOgg4LCx0oKA9tAgEGCI9oECAuEHwIEBcIbwIIBQJvDSYbDXwOJiYcCgoOaAMIBQAAAAIAAAAAARoBGgAHAA8AACUVBycVJxc1FycVDwEVFzUBGUFmOqgBXlYaJeigNSUlSw2QATklGiFLEWEAAAMAAAAAASIBGgAbACcANgAAJScuAQcjIgYPAQYeAjsBMjY/ARcWOwEyPgIHIi8BMzcXHAEOASMzIzYvATMeARUXFg4CIwEgSwIKB1gGCgJMAgIFCQU3BQoCDDgFBlgECQUCawICbDkUKgIEAVdFAgJMRQIETAEBAgICLOEFCAEHBeEFCQgDBwYhKwMEBwkIAVA0fQEDAwEGB+EBAgLhAQMCAgAABAAAAAABGgEaAB0ALAA1AD0AADczJicjNzM0NyM3NTMVFzY3JzUzNSMVMxUHBh4CNzYzMh4CFRQOAS4CNhcWFzI3JwYVFDcXNjU0JiMiOF4LCEsdGwITJCYBCQkBE3ASSQIBBQhyEhcPHBULGSotIAkSFBEXEg9PChhOCyEYEhMICjkJCUhOTwMEAgFLExJLjgUJCQSJDQwVGw8XJhEJICwqWRABC04OEhhGTw8SFyEAAAAAAwAAAAABCgEaAA8AFgAaAAAlJzUzNSMVMxUHBhY7ATI2Jzc1MxUXIwc3MxcBBEgScBNKBAsKvAoLiAImJG4nHYIdLo1LExJLjgoREZAETk9HSzk5AAAAAAMAAAAAARoBGwAqADEAOgAANwYjFRQfASM3Nj0BND4CFzM2NyYnJg4CHQEUDwEXMxQWMjY1MzcnJjUHMjYnIxQWNzI2NCYiBhQW9AkKCAe1BwkNFx8PAwUHBgcUJh0QBwsIQhYfFkIJCwdeBwwBJQtTFyEhLiEhmAIEGhkUFRkZKRAeFQoCCQcCAQINGyQUKRYWIQ0PFhYPDSEWFm0LCAgLhCEuISEuIQAAAAAGAAAAAAEqASYAFQAnAC4AMwA4AEEAABMGByIHDgIdARQPATc2PQE0PgIfAQYHFh8BIwczFBYyNjUzNycmBwYiJjUzFjcmJzcXDwEXNyYXMjY0JiIGFBaiCgcJCg8XDQQcBgcQHSYUVQkKAgYHehIMFh8WQgkLBlIGDwslAXUGBwsNgpQNlQczFyEhLiEhARgICgMFFR4QKRERHRMWFikUJBsNApEDARMSFBMPFhYPDSERTAYLCAjdBwcKDWeVDZUGASEuISEuIQAAAAAEAAAAAAEqASYAFQAnAC4AMgAAEyYnJg4CHQEUBzc2PQE0PgIXFhcHMycmPQE3FRQfAQcjFAYiJicXMjYnIxQWBwEXAc8VGxQmHRAHGQENFx8PFBA9bAcIEwcLCUIWHxUBJgcMASULewEJDf73AQUQBAINGyQUKRYVGQkJKRAeFQoCAwysFBkaFhMpFhYhDQ8WFQ8SCwgICwkBCQ3+9wAAAwAAAAABBgEbABoAIQA0AAA3Jj0BNC4CJyYOAh0BFA8BFzMUFjI2NTM3BwYiJjUzFic3Nj0BND4CFxYXHgEdARQfAfsHDBgfEhQmHRAHCwhCFh8WQgljBg8LJQFuBwkNFx8PHhMJCggHZhUXJhIhGxECAg0bJBQpFxUhDQ8WFg8NGgYLCAgbFRgaKRAeFQoCBBYLGw4mGhkUAAAAAwAAAAAA4QD0AA4AFgAeAAA3NTMyFhUUBgceARUUBiMnFTMyNjU0IyczMjY0JisBXj8fIBANEBIiHioqEhQlKycQFBITJji8GhgNFQUEGBEZHVhEEhAiFBAdDgAJAAAAAAEaAQcAEAAXAB4AIgAmACoALgAyADYAAAEjDwEvASMHFRczFzM3Mzc1By8BIzUzHwEjDwE1NzMHIxUzFSMVMyczFSM3IxUzBzMVIxUzFSMBEGcHDAwHZwkJYxAOEGMJjAQGXVkOel4HAg1aljk5OTk5OTm8ODg4ODg4OAEHAwwMAwq7ChAQCru4AwOpDpsDAqENJhI5EjgTOBITExMSAAIAAAAAAPQBGgAIAA4AABMjBxUXNxc3NQcnIwc1M+qoChFNTRETRA5ElgEZCfQGVlYG9NtLS9IAAwAAAAABGgEHAEcAcQB9AAA3MSMiDgIdARQOAgceAx0BFB4COwEVIyIuAScxJic1Jjc1NCcxJic1JicxJisBNTMyPgE3MTY9ASY3MTY3MT4COwEXMzUjIicxJic1JicxJj0BNic1JicxLgIrARUzMh4CHQEUHgIXIxYHIg4BHgI+ATU0JnECBgoHBAIEBwUFBwQCBAcKBgICCRANAwMBAQECAgQDBQUGAQEGCgcCAgEBAQMDDRAJApQCAgYFBQMEAgIBAQEDAw0QCQEBBgoHBAIEBwUBDxcRHA0GGCIfEyH0BAgKBhkGDAsIBAQICwwGGQYKCAQSBg0ICAcBCAgQBgUFAwEDAgMSBQcFBQYQCAgICAgNB3oSAwIDAQMFBQYQCAgBBwgIDQcTBAgKBhkGDAsIBAIREx8iGAYNHBEXIQAEAAAAAAEaAQcARwBxAH4AigAANzEjIg4CHQEUDgIHHgMdARQeAjsBFSMiLgEnMSYnNSY3NTQnMSYnNSYnMSYrATUzMj4BNzE2PQEmNzE2NzE+AjsBFzM1IyInMSYnNSYnMSY9ATYnNSYnMS4CKwEVMzIeAh0BFB4CFyMWBzYzMhYVFA4BLgI2FwcnBxcHFzcXNyc3cQIGCgcEAgQHBQUHBAIEBwoGAgIJEA0DAwEBAQICBAMFBQYBAQYKBwICAQEBAwMNEAkClAICBgUFAwQCAgEBAQMDDRAJAQEGCgcEAgQHBQEPNg4RFyETHyIYBg1CFRUOFhYOFRUOFhb0BAgKBhkGDAsIBAQICwwGGQYKCAQSBg0ICAcBCAgQBgUFAwEDAgMSBQcFBQYQCAgICAgNB3oSAwIDAQMFBQYQCAgBBwgIDQcTBAgKBhkGDAsIBAIaCSEXERwNBhgiHwIWFg4VFQ4WFg4VFQAFAAAAAAEaAQcADQARABsAHwApAAAlIzUnIwcVIwcVFzM3NSczFSMXFQc1JyMHFSc1FxUjNQc1FxUXMzc1NxUBEEIJXglCCQn0CahLS5ZLCjgJS4MmXUsJOApL4RwKChwJlgoKlhwTEw4qCQoKCSsNOBMTS2ArBgkJBipfAAAAAAQAAAAAAQcBGgAiAD8AWwBkAAATNjMyHgEXDgEHNTE2PQE+AiYnLgEOAhYXFRQXFS4CNhcGIxUUBisBMCMxLgE9ASImPQE0NjsBMhYdARQHNxQHFh0BPgImJy4BDgIWFzU0NyY+Ah4BByMUBiImNDYyFlgcIh8zHgEBKSEJERcJBwoRNjkoCRoZCR4oCBtyAgQFBBQBBAQEBQsIEggLAxkJBgkLAQsJDSQjGgkLDQYJARQeHhMBHgsQCwsQCwEGEx40HiQ6DAEJCwMJICYnEBkVDCs6NQ4DDAgBCzFAOqcDLwQFAQQELwUEJggLCwgmBAJbDw0JCgIJGRwZCQ4KChokIw0CCwkNHxoJCxkQCAsLEAsLAAMAAAAAARoBGgAHAAsADwAAEzMXFQcjJzUXFTM1JzM1Ixz0CQn0CRPh4eHhARkJ4QkJ4UKWlhMmAAAAAAMAAAAAARgBGgAxADkASQAANzU0JiIGHQEjJwcXBwYdASMVOwEWHwEHFzcXHgEyNj8BFzcnNTY3MTM1IzU2LwE3JwcjNTQ2MhYdARcVFhUUDgIiLgI1NDc1zCAtIBAfCx4BCSYoAQQNASULIwIMHyIfDAEkCyUOBSknAQoBHgsfbRcgFx0JDRYbHRwWDAjYCxYgIBYLHwseARobDBAbFQElCyMBDhAPDgEkCyYBFhsQDBsaAR4LHwsQFxcQCxABFhkXJxwPDxwnFxkWAQAAAAARAAAAAAEaARoADwATABcAGwAfACMAJwArAC8AMwA3ADsAPwBDAEcASwBPAAABIzUjFSM1IxUjBxUXMzc1ByM1MzUjNTMHIxUzBzMVIxcjFTM3MxUjFyMVMwczFSM3IxUzFzMVIxcjFTMHMxUjNyMVMxczFSMXIxUzJzMVIwEQHBOWExwJCfQJEuHh4eG8ExMTExMTExMmEhISEhISEhISEhImExMTExMTExMTExMlExMTExMTExMBBxISEhIK4QkJ4deoExNeExITExNeExITExOEExMTEhMTE4QTExMSE14TAAADAAAAAAEaARoAPQB5AIIAADcuAQ4BDwIGJi8BJicuAj8CPgI1NCcuAyMiDwEOAhUUHgYzMj4BPwE2NTQmLwEmLwEmBwYnIiYnJicuAzUmPgE/ATYzMh8BFh8BFhQPAQ4CFBYfARYzMjc2PwE+ATIfAhYfARYVFA8BDgE3BzMVIzUzFTfrBQsKBwMGBQMIAikLCwQGAQMEBwMGAwgFCwwNCAwIDgUJAwoRGBwgIiEQChENBg4IAwMHBAQPBA0HCA4eDh8aDRYQCQEEBgULAwQCBAcKBwYDAgsEBQQEBUUJDAUFCQYGAgYFBAcJBQMGAwQKBQovVz5eE1d9AgEFBQQGBAMBAycLDAUIBQMFBgMHCQYMCQUMCwgIDgYNEQoPIiEgHBkRCgQIBQ4IDAUKBAgEBA4EVAIBCQcSGg0cHh4PBw4JBQoEAwYICQcEBQMLAwcKCwoFRQkCBAcGAwQDBggEBQgDAgQDCwQH41cTXj5XAAMAAAAAARoBGgAIAEQAgAAAPwEjNTMVIzUHFzIfAx4BFRQPAQ4CIyIuBjU0PgE/ATYzMh4CFxYVFA4BDwIGFBYXFh8BHgE/Aj4CBzI+AT8BNic2LwEmLwImIgYPAQ4CIyIvAS4BND4CPwE2NC8EJiMiDwEOAgceAxcWFx4Bolc9XRJYMQwJDwgHAwMIDgUOEQoQIiEgHBgRCgMIBg4IDAcODQoFCAMGAwcEAgYECwspAggDBQYDCAkGCQwKBQoEAQEDBgMFCQcEBQYCBgMHCgUMCUUFBAQFBwMFAgMGCAkHBAIEAwsEBwMBAQkQFg0aHw4er1gSXT1XIwgOCAgECgUMCA4FCAQKEhgcICEhEAsQDQYOCAgLDQQJDAUJCAMGBQMFCAUMCycDAQMEBgQFBVoDBgULAwQCAwgFBAgGAwQDBgQFBAlFBAsMCQcGAwUDBQQHCQgGAwQKBAsNBw4fHhwNGhEICQAAAAQAAAAAAQIA4QAHAA8AJAAvAAA3IycjByM3MxcnJicjBg8BFyM1MQYjIiY1ND8BNCMiBzU2MzIVDwEOARUUFjMyNjWmEw89DxI3ERAWAQEBAQEXthELFQ8SIh8VEg8PFCQRGAwMCwkMEFEoKJBZPgMGBgM+NxATEA4dBQQaDBAKJg8EAQgLBwoRDQAABAAAAAABJQD0AAYACgAMABMAACUHIyc3FzcHNycPARcHFwcjJzcXASWSDjoONIuQUg1QEgopCw8OOg406a1TCkmkbWILXhYPFQ8RUwpJAAABAAAAAAEPAPoABgAAJQcvATcXNwEPnw8/DziX7rwBWQtPsgAIAAAAAAEaAQcABgAKAA4AEgAWAB0AJAArAAA3Iyc3FzcfATMVIxUzFSMXIxUzBzMVIyczNycHJwcXIyc3FzcXBzM3JwcnB0YNEw0NGg4blpaWlpaWlpaWlkoNIg4aDQ0gDRMNDRoOLw0iDhoNDdgUDQ0bDgUTJRMmEiYTaCENGg0OTBQNDRsNWiENGg0NAAABAAAAAADzAMEABgAAPwEXByMnN5ZRDFgLWAxvUgxXVwwAAAABAAAAAADBAPQABgAANxcHJzU3F29SDFdXDJZRDFgLWAwAAAABAAAAAADPAPMABgAANyc3FxUHJ71SDFdXDJZRDFgLWAwAAAABAAAAAAD0AM8ABgAANwcnNzMXB5ZRDFgLWAy9UgxXVwwAAAACAAAAAAEHARoANwA7AAATMxUzNTMVMzUzFTMXFTMVIxUzFSMVMxUjFQcjFSM1IxUjNSMVIzUjJzUjNTM1IzUzNSM1MzU3MwczNSNeExITExMSEyYmJiYmJhMSExMTEhMTEyUlJSUlJRMTE4ODARklJSUlJRMTEhMTExITEyUlJSUlJRMTEhMTExITE5aDAAABAAAAAAD9AP0ACwAANwcXNxc3JzcnBycHhVURVVURVVURVVURllURVVURVVURVVURAAAAAgAAAAAA9AD0AAMABwAANxUzNQcjNTM4vBOWlvS8vKmWAAAAAQAAAAABBwCWAAMAACUVIzUBB8+WExMAAwAAAAABBwD0AAMABwARAAA3FTM1ByM1MyczNTMVIxUzNSM4qRODg3ATgxMmqc6oqJaEEhODE6kAAAAAAQAAAAAA4gDiABkAADcyFx4BFxYUBw4BBwYiJy4BJyY0Njc2Nz4BlgoKExwFAwMFHBMKFAoTHAUDBQUKEQkT4QMFHBMKFAoTHAUDAwUcEwoUEwkRCgUFAAEAAAAAARoBGgAaAAATMhceARcWFAYHBgcOASIuBDQ2NzY3PgGWEhEhMQoECQkRHg8hJCEeGBEJCQkRHg8hARkECjEhESQhDx4RCQkJERgeISQhDx4RCQkAAAAAAgAAAAABGgEaACoARAAAEyYiBzEGBwYHMQ4BFhcWFx4CPgE3MTY3NjcxNiYnMSYnMSYnMSYnMSYnFwYHDgEiLgQ0Njc2Nz4BMhceARcWFAa0Dx4PDg0ZDwgIAQMIFQsZHR8cDRkPCAMFAQQDCAcLCgwNDlMRHg8hJCEeGBEJCQkRHg8hJBEhMQoECQECBQUDCA8ZDR0fDhwWCg8IAQcIDxkNDg8fDg4NDAoLBwgDrh4RCQkJERgeISQhDx4RCQkECjEhESQhAAADAAAAAAEaARoADAAWAB8AABMyHgEUDgEiLgE0PgEHFBYXNy4BDgEVMzQmJwceAT4BliQ8IyM8SDwjIzxMDQ2fGUI7JOIODZ8ZQjskARkjPEg8IyM8SDwjgxQlEJ8VCRw3IRQlEJ8VCRw3AAABAAAAAAC8ALwACAAANxQGLgE0NjIWvBYgFRUgFpYQFgEVIBYWAAAAAgAAAAAAvAC8AAoAFwAANw4BLgI+ATIWFBc2NTQmIyIOAR4CNqYECgsIAgQJDgsMBxYQCxMJBBEWFYwFBAIICwoHCw4PCgsQFg0VFhEECQADAAAAAADhAOIADAAVABYAADcyPgE0LgEiDgEUHgE3FAYiJjQ2MhYnlhQjFBQjKCMUFCNFHSgdHSgdMUsUIygjFBQjKCMUSxQdHSgdHSAAAAUAAAAAARoBGgAHADQAPQBGAE8AAAEjBxUXMzc1ByM1Mx4BMzI2NCYiBhUjFSM1MxUOARUUFjI2NTMUFjI2NCYjIgYHIy4BIzUzBzQ2MhYUBiImJzIWFAYiJjQ2MzIWFAYiJjQ2ARD0CQn0CRKpKwQSCg8WFh8WOCUlCAsWHxYmFh8WFhAKEQUwBREKqXEKEQsLEQo4CAsLEQoKeQkKChEKCgEZCfQJCfTqJQgLFh8WFg844SwEEgkQFhYQEBYWHxYKCQkKJqkICwsRCgp5ChEKChEKChEKChEKAAAFAAAAAAEaAPQACwAPABMAGAAcAAA3FzcXNyc3JwcnBxcnITUhFSE1IRc1IxUzFTUjFbwNHh4PICAPHh4NHscBBv76AQb++paWlpZADR4eDR4eDyAgDx6DE0sTQgkSORMTAAAABAAAAAABFgEaABYAIgAsADYAADcjNTMVMzUnIzUjNCYiBhUjFSMHFRczNT4CHgEUDgEuAhcHNSMVJwcXMzcnMxcHJxUjNQcngziWEwocEhYgFRQbCgpBAQkLCgcFCgsIBYYUExQOJQ0kfA0lDhQTFA0mqCUvCRMPFhYPEwm8CeUFCQIECgoKBQEGCqwUZGQUDSQkWyQNFGRkFA0ABAAAAAABBwEHAAsAGQAgACQAADcnBycHFwcXNxc3LwE3MxcVByMVByMnNTc7AhcVMzUjFyMVM6IOGhsNGxsNGxoOGykTgxMTJhKEEhImE0sSJoNLhISUDhsbDhobDRsbDRt6ExODEyYSEoQSEkuDOIQAAAABAAAAAADoAOgACwAANxc3JzcnBycHFwcXlkQORUUOREQORUUOiUUOREQORUUOREQOAAAAAgAAAAABGgD2AC8AOQAANzMeARQGIzUyNjQmJyMnLgIGDwEnJiciBw4BHgE7ARUjIiYnLgE+ATc2Fz4BHgEHFzUzFTcXByMn4AEXISEXDxUVDxECAhcfGwYGEAUFFA0KBgsYDgkJDhoJDAcLGxEODgkmKx9fGBMYDSgNKLwBIC8hExYeFgEQDxYFEA4OAwEBDgocGhATCwsNIyIXAwMEFBYGH3YYZmUXDSgoAAIAAAAAARoA9gAyADwAADczHgEUBisBNTMyNjQmJyMnLgIGDwEnJicGBw4BHgE7ARUjIiYnLgE3PgIXPgEeARcHJxUjNQcnNzMX4AEXISEXJSUPFRUPEQICFx8bBgYQBQUUDQoGCxgOLy8OGgkPBAsHFxwOCSYrHwMfGRIYDSgNKLwBIC8hExYeFgEQDxYFEA4OAwEBAQ0KHBoQEwsLECsSDBEFBBQWBh8WSBlmZRgOKCgAAAIAAAAAARoA9gAVAC4AADczHgEUBisBIiYnLgE+ATc2Fz4BHgEHMzI2NCYrAScuAgYPAScmJyIHDgEeATPgARchIReMDhoJDAcLGxEODgkmKx9/gxAWFhARAgIXHxsGBhAFBRQNCgYLGA68ASAvIQsLDSMiFwMDBBQWBh9zFh8WEA8WBRAODgMBAQ4KHBoQAAcAAAAAARoBGgADAAcACwAPABMAFwAnAAATMxUjNzMVIxczFSMVMxUjFTMVIwczFSMnBxUzNTMVIzUjFRczNzUnXhMTJUtLJktLS0tLSyZLS10TE+HhExPhEhIBB8+8ExMSExMTEhMTzhJeXs9xcRISzxIAAwAAAAABFAD0AAYADQARAAA3BxcHJzU3MwcXBxc3NQcXNydYMTENODiRDjIyDji4EV4RwzEyDTgNOQ4xMg04DWAIuwkAAAAABgAAAAABLAEaABUAKwBBAFMAXQBlAAATFRQWFzMWFxYdASM1NCYvASYnJj0BMxUGFhczFhcWHQEjNTQmJzUmJyY9ATMVFBYXMRYXFh0BIzU0Ji8BJicmPQEHNzMyFhQGKwEOASsBIi4BPQEXNSMVFBY7ATI2NxUzFjY0JiM4BwgBCgQIEwcIAQoECEwBBwgBCgQIEwYJCgUHSwYJCgUHEgcIAQoECHASxRQbGxQMBigaOBUiFbypIRc5FyETCQwQEAwBGQkGCAcIBQoMCgoGCAYBBwYKDAkJBggHCAUKDAoKBggGAQcGCgwJCQYIBwgFCgwKCgYIBgEHBgoMCXATHCcbGR8UIhQ5ODg4GCEhUDgBERcRAAAAAAQAAAAAAQcBBwADABEAGAAcAAA3IxUzJzczFxUHIxUHIyc1NzsCFxUzNSMXIxUzqV5eSxODExMmEoQSEiYTSxImg0uEhIMSgxMTgxMmEhKEEhJLgziEAAACAAAAAAEaARoADAAUAAATIg4BFB4BMj4BNC4BBzUyHgEUDgGWJDwjIzxIPCMjPCQfMx8fMwEZIzxIPCMjPEg8I/PhHzM+Mx4AAAAACgAAAAABLAEaAAcACwATABcAHwAjACsALwAzAD0AABMHFRczNzUnBzUzFQ8BFRczNzUnBzUzFQc3MxcVByMnNxUzNTcHFRczNzUnByM1MxUjNTMnIxUzBxc3NScHHAkJOAoKLiUvCQk4CgouJTgJOAoKOAkTJZ8JCTkJCQolJSUlbjo6Ew0iIg0BGQk4Cgo4CTgmJiUKOAkJOAo5JiYvCgo4CQkvJSWDCXEJCXEJOCZeJRMTEgwiDSINAAADAAAAAAEaARoAEgAeACcAAD8BFQcnNSMnNTczFxUjNSMVMx8CNzUzNzUnIwcVFzcjNTMVIwcVJ0sTFhAcCQnhChPOHAl2IxAcCQmWCQlLQoQdCRZYExsVBy8JlgkJVEuECUIiBhwKXQoKXQoTS0sJDxUAAAoAAAAAARoBBwAGAAoADgAUABgAIwAnAC0AMQA4AAABIxUzFTM1JzMVIyczFSMXHQEzNzUHNSMVJyMPATUnIxUXNzM3NSMVBzUjFRczPQEjFTcVIzU3MxUBEBwTEnAlJUslJakJCTglJgkHKAoJEDYFgxLhEwkKExMTCRwBBhITHAkSEhKEEhMJHCUTExMDKCEKQgc2SyUlOBIcCUslJV4THAkSAAAAAAIAAAAAARoBBwAXACMAABMzFxUmJzUjFTMXFT8BMwYVIwcnNSMnNRciDgEeAj4BNTQmHPQJCArhLgooBwsCBTYQLwnOERwNBhgiHxMhAQcKgAkGaJYKISgDCQo2By8JqXoTHyIYBg0cERchAAIAAAAAARoBBwALABQAAAEjBxUXMxUXNzM3NQcjDwE1JyM1MwEQ9AkJLxA2fwkSegcoCi7hAQcKqQkvBzYJqZ8DKCEKlgAAAAUAAP/9AS0BGgAsADIANgBDAEoAADcGIzUjFS4CJzM1Iz4CNxUzNR4CFyMVMwcWFzY1NC4BIg4BFB4BMzI3JjcvAR8BBi8CHwE2FzIWFRQOAS4CNhc3JwcnBxerBgYSGy4cAhISAh0tGxIbLhwCEhIBCQgDIzxIPCMjPCQODQQNNyZMGwYNEiQSRw8RFyETHyIYBw0uIg8cEAwYJwESEgIdLRsTGy0cAhISAhwuGxIMAgQNDiQ8IyM8SDwjAwhKG0wmNwQNJBIkJgoBIBgRHA0GGSEgPy0LJQ4PEwAEAAAAAAEsARoALAAyADYAPwAANwYjNSMVLgInMzUjPgI3FTM1HgIXIxUzBxYXNjU0LgEiDgEUHgEzMjcmNy8BHwEGLwIfARQWMjY0JiIGqwYGEhsuHAISEgIdLRsSGy4cAhISAQkIAyM8SDwjIzwkDg0EDTcmTBsGDRIkEi8gLyEhLyAnARISAh0tGxMbLRwCEhICHC4bEgwCBA0OJDwjIzxIPCMDCEobTCY3BA0kEiRVFyEhLyEhAAAAAAQAAAAAARoBGgADAAcAIwAwAAA3Fy8BFy8BFzMOAgc1IxUuAiczNSM+AjcVMzUeAhcjFQcyPgE0LgEiDgEUHgGpJkwmVBIkEnkCHC4bEhsuHAISEgIdLRsSGy4cAhJeJDwjIzxIPCMjPKlMJkxUJBIkGy4cAhISAh0tGxMbLRwCEhICHC4bEnojPEg8IyM8SDwjAAAG//8AAAEsAQsADAAYAE4AZwBxAHsAADcyFh0BFAYiJj0BNDYXNCYiBh0BFBYyNjUnFhc3NhcWFxYVFAcXMx4BHQEUBw4BDwEGBwYHBiInJicmLwEuAScmPQE0NjczNyY1NDc2NzYPARUXFhcWMjc2PwE1JwYjIicmJwYHBiMiNyYOARQWMjY3NjcGFx4BMjY0LgF1BggIDAgIVggMCAgMCDICAQMRJiMQDQUDAQ4PAwIHBwsGBwwNKVIpDQwHBgsHBwIDDw4BAwUNECMmSQEBCgwkRiQMCgEBDBQhEgYEBAYSIRQ6CDAPDCoTAgMnBwMCEyoMDzBxCQYcBggIBhwGCQ8GCQkGHAYICAayAQIDEwUEExEeEwwQBxkOGAUGAwkFCAUEBwUSEgUHBAUIBQkDBgUYDhkHEAwTHhETBAWCAlABBgUPDwUGAVACBhMGCAgGE2IIBRMoDhQUFggIFhQUDigTBQAAAAADAAAAAAEHARoABwAMABMAAD8BMxcVByMnNycjFTMnBxUXNTMnSxNlRBOWE6k4Xpa8EhJ5E+ETQ4sTE4M4u/MSvBPPEgAAAAAEAAAAAAEHAPQABgAbACgANgAANw8BJzcXNxc+ATU0LgEjIgcmIzYzMh4BFAYHNgciLgE0PgIeAg4BBzI+ATQuASIOARQeARenLw4cDRUoSQkKEh4SDQwNDxceFycXGRQFZRIeEhIeJB4RARIeEhcnFhYnLicWFicXkDgBHA4VMCsJGA0SHhIFBRMXJy4oCw4rEh4kHhEBEh4kHhISFicuJxYWJy4nFgEAAAAABAAAAAABGgDiAAMABwAXABsAACUVIzUVMxUjNyMiBh0BFBY7ATI2PQE0JgczFSMBB+Hh4eHhCAsLCOEHCwtAJibOEhIlXpYLCIMICwsIgwgLcBMAAQAAAAAAzwCWAAMAADczFSNecHCWEwAABgAAAAABCQEcAAwAHAAoADAAOgBIAAATPgEeAg4CLgI2FxYzMj4BNTQuAg4CHgE3FwcWDgEuAj4BFwcWNjQmDgEWNwcWFRQHFz4BLwEmIyIOARQXByY+AhdJG0E7JAQdNkE6JQQcJhogHC8cFiUwLiQTAxiCDSgEBREUDwIMFAoSBQoHCAQBVA8FCQ4MAwo0CwwSHhIJDRADJjgaAQUSBB02QTskBBw3QTqoEhwvHBkqHgkMIC0vKooNKQkUDAIOFREFBCEDBAsFAQcHKw4LDRIPDhMuFBcFEh4kDw4YOSsMDQAAAwAAAAAA9AEaABMAJAA1AAA3NC4BIg4BFRcjFRceATI2PwE1IycyFx4BFAYHBiInLgE0Njc2FwcOAQcGIicuAS8BNRY3Fjf0GSwyLBkBAQEENUg1BAEBXRUTEBMTEBMqExATExATYAEBEw8SKhIPEwEBIygoI+oNFgwMFg0CpgcRFxcRB6YeBQQOCg0EBQUEDQoOBAXEAwUMBAUFBAwFA4wUAQEVAAAABQAAAAABKAEHACUALAA1AD8ARgAANwcuASIGBycHFwcVIxUzFRYXBxc3HgEyNjcXNyc2NzUzNSM1JzcnMhYVIzQ2Fw4BBy4BJzUzJwcVMzUXBxU3NQc1Nyc1FxWJEQQZIBkEEQ0WAxMTAQQYDRUHFhgWBxUNGAQBExMDFksMEDgQMgIVDw8VAUsqDxOOMEdHaY+lgxAPFBQPEA0WAhMTAQkJGA0VCgsLChUNGAkKARITAhYNEAwMEEsPFQEBFQ8cswhWRF8gFy8QZBZGXxduEAAAAAAEAAAAAAEWAQcAJQAsADUAPwAANwcuASIGBycHFwcVIxUzFRYXBxc3HgEyNjcXNyc2NzUzNSM1JzcnMhYVIzQ2Fw4BBy4BJzUzJzcXFQc1NycVI4kRBBkgGQQRDRYDExMBBBgNFQcWGBYHFQ0YBAETEwMWSwwQOBAyAhUPDxUBSxMOqWxWjhODEA8UFA8QDRYCExMBCQkYDRUKCwsKFQ0YCQoBEhMCFg0QDAwQSw8VAQEVDxyrCHEQSBc5X0QAAAAEAAAAAAEpASwAJQAsADUAQAAANwcuASIGBycHFwcVIxUzFRYXBxc3HgEyNjcXNyc2NzUzNSM1JzcnMhYVIzQ2Fw4BBy4BJzUzNxUHNTcnFSYnNTeJEQQZIBkEEQ0WAxMTAQQYDRUHFhgWBxUNGAQBExMCFUsMEDgQMgIVDw8VAUu4gGqiCQoOgxAPFBQPEA0VAxMTAQkJGA0VCgsLChUNGQgKARITAxUNEAwMEEsPFQEBFQ8cYBBRFkNndgYDfggAAAAABAAAAAAA4wDjAAwAGAAcACAAADc+AR4CDgIuAjYXHgE+AiYnJg4BFjcjFTMVIxUzbBEoJBcCEiEoJBYDEh0MHBkPAg0LEikYCEo4ODg41AwCESIoJBcCEiEoJF4IAgwXHBkICwgjKjsTEhMAAwAAAAAA4QDiAAwAEAAUAAA3Ig4BFB4BMj4BNC4BFxUjNTcVIzWWFCMUFCMoIxQUIxJLS0vhFCMoIxQUIygjFF4SEjkTEwAAAgAAAAAA5gDhAAUACwAANyMHFzM3ByMnNzMXulYsLFYsOjoeHjod4UtLSzMzMzMAAQAAAAAA5gDhAAUAADcHIyc3M+UrViwsVpZLS0sAAAACAAAAAADhAOEAAgAFAAA3MycHMydLlksjRiNeg2w9AAEAAAAAAOEA4QACAAA3FyOWS5bhgQAAAAIAAAAAAPQA9AADAAcAAD8BFwc1NycHOV1dXTQ0NJZeXl0pNDU1AAABAAAAAAD0APQAAwAANxcHJ5ZeXl70Xl5eAAAAAwAAAAAA4wDjAAwAEAAUAAA3PgEuAg4CHgI2JyMVMyc1MxXUDAIRIigkFwIRIigkJxcXFxdsESgkFwIRIigkFwIRFhMlS0sABQAAAAABHAEcABUAHgBEAEwAVgAAEzczHwIVDwErATU0JzM1IxUmIz0BFwcmLwE3JzcXBzcXBxcVMxUjFQYHFwcnDgEiJicHJzcmJzUjNTM1Nyc3Fz4BMhYHLgEOARUzNAc2NzUjFR4BFzZYArEBDwEBDwFcB2CsCQqGIwICBhwtCjRXEQ0VAhMTAQQYDRUHFhgWBxUNGAQBExMDFg0RBBkgGRUGERAJOAIKAUoBFQ8PARsBAQ8BsQIPAgoHrFsCXAFnIwMDBRwuCjM7EA0VAxMSAQoJGA0VCgsLChUNGQgJARMTAxUNEA8UFAcGAwYOCQxUCg8cHA8VAQEAAwAAAAABDAEHAAMACQAMAAATIxUzNwcVFzc1DwE1SxMTPg8PgxZpAQfh1Qe8B10QCEyYAAMAAAAAAQ8BBwADAAkADAAAEzMVIzcHFRc3NQ8BNS8cHFwWFoQhXQEH4dkLvAteFgtChAADAAAAAAEWAQcACQAuADgAAD8BFxUHNTcnFSMXDgEdARQOAisBIi4CPQE0LgI1ND4EMh4EFRQGByMVFBY7ATI2NV4OqWxWjhMVBQYCAwUDEAMFAwIGCwcDBggKDAwMCggGBAccFgIBEAEC/whxEEgXOV9EYAUNBxADBQMCAgMFAxAHDQsQCgYLCwgGAwMGCAsLBgoQGRYBAgIBAAAEAAAAAAERARoAEQAfADcARAAANyYnNycHJicmBwYPARc3Njc2BwYPASc3Njc2Fx4BFxYHNycHJzcnBycHDgEUFhcHFzceATI2PwEHBiIuAjU0PwEXBwb/AwUZCxoHCRQUCwgdUR0JBAgXAwYSOhIGBxAQBwsEBmEcDBsjHAwcCx0JCAUGGQsaBxIVFQgdNggQDwwGDBI6EgbkCQcaCxkGAgcIBAkdUR0ICxQOBwYSOhIGAwYGBAsHEG4dDB0jHQwdCx0IFRURCBkMGQUGCQgdGgQHCw8IEQwSOhIFAAAAAAYAAAAAARoBAAADAAcACwAPABUAGAAANzUzFSczFSM3FSM1HQEzNSU3FxUHJzcVN3GoXV1dXaio/voOZWUOE0pxEhJLE0sTE6kTE60HQw9ECHVjMQAAAAACAAAAAADYAPQAAwAHAAA3MxUjNxUjNVQdHYQc9Ly8vLwAAAACAAD//QEWAQcAGgAkAAA3FA4BJicHHgE+Ai4BBgc1IxUXMzUjPgEeASc3FxUHNTcnFSOGGScjCBIKLTIjBxovMQ8TCSwYCiMlFygOqVlDjhNLFB8IEhIHFxkHJTIsEw0UFzIKExEOCh6hCHEQOxYtX0QAAAUAAAAAARwA9AAEAAkADgASAC0AADc1MwYHNzY3IxUXJicjFSUVITUXMj4BLgEGBzMVIyc1MxU+AR4BDgImJzceARNhAgEXCQuJaQUDYQEG/vrHEhoGESEgCRQlCBANKicWBh4qJQkPBhdxEgkJOAoIEnEJChO8ExO8FiIeDAwPEAgqExELESQrHgcVFAYNDwAAAAABAAAAAAEMAQ0AHQAANxQOASYnBx4CPgI1NC4BBgc1IxUXMzUjPgEeAe8mOjUMGgooMjMpFypERRYcDkEjDjU3I5YeLg0bHAsYIQ0KIC8aJDsXFRwiSw4cGRYPLQAAAAADAAAAAAD+AQcAAwAJAAwAABMjFTMnFxUHJzUfATX9HBxcFhaEIV0BB+HZC7wLXhYLQoQAAwAAAAABEAEHAAgAEgAXAAA3FAYuATQ2MhYzLwEjBxUXMz8BByM1Mxe8FiAVFSAWVFARXxgYXxFQYV9fT5YQFgEVIBYWWQgYshcIWUqyWQACAAAAAAEQAQcACQAOAAAlLwEjBxUXMz8BByM1MxcBEFARXxgYXxFQYV9fT6ZZCBiyFwhZSrJZAAIAAAAAAPwBAAAFAAgAAD8BFxUHJzcVN1AWlpYWHG70C2QXZAytk0oAAAAAAgAAAAABDAEMABcAIAAANzUzFT4BMzIeAR8BIzUuAiIGBzMVIycXIiY0NjIWFAYhHBAwGx00IAIBHQIYJy4pCzVOEnUQFRUgFhbASy8TFhsuHAUEFCIUFhMcEpAVIBYWIBUAAAIAAAAAAOoBGgAKABMAADczNycHNSMVJwcfARQGIiY0NjIWlgpJFDEcMRRJLxYfFhYfFnlJFDF0dDEUSUEQFRUgFhYAAgAAAAAA6gEaAAoAEwAAEyMHFzcVMzUXNycXFAYiJjQ2MhaWCkkUMRwxFEkbFh8WFh8WARlJFDF0dDEUSeEQFRUgFhYAAAAAAgAAAAABDAEMABcAIQAAJTUjFS4BIyIOAQ8BMzU+AjIWFyMVMzcHMjY0LgEGFBYzAQscEDAbHTQgAgEdAhgnLikLNU4SdRAWFiAVFRDASy8TFhsuHAUEFCIUFhMcEpAVIBUBFiAWAAACAAAAAAEHAQcABwALAAATFxUHIyc1NxcjFTP0ExO8EhK3srIBBxO8EhK8ExiyAAAFAAAAAAErASwAAQANAEEASQBZAAA3NRcnNxc3FwcXBycHJzcVMzcXBxUWFQczFSMxBg8BFwcnBw4BIiYvAQcnNycmJysBNTM1NDc1JzcXMzU0PgEyHgEHFTM1NCYiBhc1IwcGFRQeAjI+AjU0K1smDSgnDSYmDSgnDXQQJA0iDAEsLgYPASsNKQEOJCYkDgEpDCoBDwUBLiwLIw0kEhAdIh0Ra1kaJRp6mwEJDhkfIh8ZD4sBCSYMKCgNJiYNKSgNkAwkDSIBHh8OEh8ZASsMKQIPEhIQAigMKgEZHhIOIBwBIw0kDBEdEREdEQwMExoaMgEBGhwZLSERESEtGR0AAgAAAAABGgEHABQAHgAANzUyNjc2NSMnNTczFxUnNSMVMwcXMzcnBzUjFScHF0sREQICVQkJ9AkS4WsJLigvDR8THg4vExMFBQMFCrsKCq0TkakJLy8NH3l5Hw0vAAAAAwAAAAABGgDhAA0AEQAVAAAlBzUnIwcVFzM3NRc3NQcjNTMXJzU3AQs9CakJCakJPQ5dlpZLOTnTIygJCYQJCSYjCWttcF0fCiIAAAUAAAAAARoBBwANABcAIAApADIAADczFxUHIyc1NzM/ATMXBzM1Iy8BIw8BIxciBhQWPgE0JhcyFhQGLgE0NjciBhQWMjY0JslHCQn0CQlHEAc4B5PhQgcQMBAHQRwEBgYIBQVQEBYWIBUVEBchIS4hIfQKqAoKqAoQAwO5lgMQEAMTBQgGAQUIBRIWIBYBFSAWEiEuISEuIQAAAAMAAAAAAPQBGgAHAAsADwAAEzMXFQcjJzUXMzUjFzMVI1SWCgqWCRODgy8lJQEZCfQJCfTq4bwTAAAAAAMAAAAAAQcBGgAHAAsAFwAAEzMXFQcjJzUXMzUjFyMVIxUzFTM1MzUjHOEKCuEJE87OcBM4OBM4OAEZCeEJCeHYzyY4Ezg4EwAAAAADAAAAAAEaARoABwALABEAABMzFxUHIyc1FzM1IxczFQcjNRz0CQn0CRPh4ZYlcCYBGQn0CQn06uEmJXEmAAAAAwAAAAABGgEaAAcACwAUAAATMxcVByMnNRcVMzUHMjY0JiIGFBYc9AkJ9AkT4XEXISEuISEBGQn0CQn0CeHhqSEuISEuIQAABQAAAAABGgEaAAkADgAaAB4AJQAAEx8BFQcjJzU3MwczNScjFyMVMxUzNTM1IzUjBzMVIzcfARUHLwG2OAYTqRMTcXGpOHFLJSUTJiYTJV5eiysFEgE4ARQ4DqgTE+ES86g5SxMmJhMlgxPOKw27E844AAADAAAAAAEHARoAAwALAA8AADcVIzUnMxcVByMnNRczNSO8XkLhCgrhCRPOzqkTE3AJ4QkJ4djPAAMAAAAAARoBGgAHAAsAEgAAEzMXFQcjJzUXMzUjFzMVNycVIxz0CQn0CRPh4SU4Xl44ARkJ9AkJ9OrhhDhLSzgAAAAABAAAAAABBwEaAAkADgAaAB4AABMfARUHIyc1NzMHMzUnIxcjFTMVMzUzNSM1IwczFSPJOAUSqRMTcHCpOXBLJSUTJSUTJV1dARQ4DqgTE+ES86g5SxMmJhMlgxMAAAAABgAAAAABGgD0AAcACwAPABcAGwAfAAA/ATMXFQcjJzczNSM1MzUjNzMXFQcjJzUXMzUjNTM1IyYJXgkJXgkSS0tLS3peCQleCRNLS0tL6goKqAoKCXESExMKqAoKqJ8mJUsAAAEAAAAAAPcBCgAZAAATFRczNSM3PgEeAgYPARc3PgEuAgYPATVCCUIwEg0iIxkKCg1hDWIQDAwhLCwQDgEHQgkSEg0JCRkjIwxiDWERLCwhCwsRDScAAAADAAAAAAEaARoACQAMABAAABMjDwIXPwI1BzcXNyc3F/gbmwMsGk0FmuwdGxAhliEBGZoFTRosA5sbyzgbCiGWIQAAAAMAAAAAARoBGgANABEAGAAAJScjNScjBxUXMxUXMzcnNTMVFyM1Mzc1MwEZCY0JXgkJLwm8CfNLlqkcCYSyClQJCZcIVQkJZ3FxXUsIHQAAAwAAAAABBwCpAAgAEQAaAAA3FAYiJjQ2MhYXFAYiJjQ2MhYXFAYiJjQ2MhZLCxAKChALXgsQCwsQC14LEAsLEAuWCAsLEAsLCAgLCxALCwgICwsQCwsAAAIAAAAAARoBGgALABwAADczFSMVIzUjNTM1Mwc1MxUzNSM1MzUjNTMXFQcjSzg4Ezg4EzgT4XFxcXoJCfThEzg4Ezj9Z12DEyUTCs4JAAAAAwAAAAAA4gDhAAsAGAAhAAA3JwcnNyc3FzcXBxc3FA4BIi4BND4BMh4BBzQmIgYUFjI2rBYWERYWERYWERYWJBQjKCMUFCMoIxQTIS4hIS4hbxYWERYWERYWERYWFhQjFBQjKCMUFCMUFyEhLiEhAAMAAAAAARYBGwAVACgANAAAEx4BFxYVFAcOAQcGJy4DNzY3PgEXNjc2JzQmJyYnJgYHDgEWFx4BJzcXBxcHJwcnNyc3oRYpECYeDyYWMCcUHhADBw8mEishJhkZAhEPHSYTJg8gFyEiECYELQ0tLQ0tLQ0tLQ0BGQEUECk3KycSFwQJFgsiKi4VLhkMDPQJHyIlFyoQHQMBCQsYTkgTCgZ8Lw0vLw0vLw0vLw0AAAAABAAAAAABHQEaAC8AQwBQAFQAABMjBycHFwcVFwcXNxczJicjLwEHJzcvATU/ASc3Fz8BMx8BNxcHHwEVFhc1JzcnDwEyFhcGBy4BDgIWFwYHLgE+AR8BPgEeAg4CLgI2FxUzNbA0CiYmGi0tGiYmCicKCAYJDiYPGQYsLAYZDyYOCRYJDiYPGQYsCwgtGiYmJAwTBAkIAQsOCgEIBwYDDQ0EFQ4YDiMhFwUNHCIgFgYMCF4BGS0aJiYKNAomJhotCAssBhkPJg4JFgkOJg8ZBiwsBhkPJg4JBggKJwomJhowDgsDBgcIAQoOCwEICQUXGxIBNAwGDBwjIRYFDBsiIR4TEwAFAAAAAAEHAQcAAwAHABUAHAAgAAA3IxUzBzUjFSc3MxcVByMVByMnNTc7AhcVMzUjFyMVM6leXiYSExODExMmEoQSEiYTSxImg0uEhIMSJl5eqRMTgxMmEhKEEhJLgziEAAAAAgAAAAABGgDjAAgADAAANyc3FwcnNyM1JzMVI/UsDUNDDSy9JRMTqS0NREMNLRM4gwAAAAYAAAAAASwBLAAHAAsAFwAbAB8AIwAAEzczFxUHIyc3FTM1BTU3MxcVMxcVByMnNzUjFRcjFTsCNSOpE10TE10TE13+5xNeEl4TE84TcV5eXl4SXl4BGRMTXRMTXV1dqHATE14SXhMTcF5eEl5eAAAEAAAAAAEUARQAIAAmADcAOwAAEwYUHwEOAQcGHgE2Nz4BNxcGFBYyNxcWMjY0LwExJyYiHwEGIiY0NyIHFzYzMhYXHgE+AScuAgcXLgEcAwIzEhoFAQQHBwEFFxEWDh0pD0oDCAUCgGgDCGIsCRoSHxMRDwsKJTkJAQcHBAEHIzMaMAEbARACBwMzDSUWBAcCBAQUIAsXDikeD0oDBQcDgGgDdCwJExlRBRADLiMEBAIHBBsrGCwvExsAAAMAAAAAAREA6AAIABEAKAAANzIWFAYiJjQ2FyIGFBYyNjQmJzIeARcWDgEmJy4BIgYHDgEuATc+ApYVHR0qHR0VDRISGhISDRwzIwcBBAcHAQk5SjkJAQcHBAEHIzO7HSkeHikdEhMaEhIaEz4YKxsEBwIEBCMtLSMEBAIHBBsrGAAAAAP//wAAARoBGgAVADsARAAAEwcVNxc1MxUjBzUjFwczFRc3Mzc1Jwc+ATQuASIOARQWFw4BBwYPATM1ND4COwEyHgIdATMnJicuASciJjQ2MhYUBlQJCQqpIRgmAQEUECIiCQmYDhASHiMfERANDRYHBAEBEwoSGA0BDRgSChMBAQUGFjITGxsnGxsBGQkdAQEUXhgYCgkcByMJcQmxCR0jHhISHiMdCQYWEAsMEgoNFxMKChMXDQoTCwsQFg8bJxsbJxsAAAAACAAAAAABBwEaAAkADgAYAB0AJwAxADsAQAAAEx8BFQcjJzU3MwcVMzUnBxQzMjY1NCMiBhc0MhQiFzM1IzUHFTcVIwcjNTM1BzU3FTM3FDMyNjU0IyIGFzQyFCLGPgMKzgkJkYi8OGgZDQ4ZDQ4QFBQ8LQ8fEA8aLQ8QIA4UGg0NGQ0OEBQUARc+B7YJCfQJEuGoOUwlFBIlFBIaMgsMPQYNAy1qDC0DDQY9GCQTEyUUExoyAAAAAAUAAAAAAQcBGgAJAAwAEwAaACEAABMfARUHIyc1NzMHMycjFTM1Iyc1BzcnBxUXPwIXFQcnN8Y+AwrOCQmRBDg4hLxCCUoiDSkpDSQNKSkNIgEXPge2CQn0CUs54ZYJQo4jDSkNKQ1EDikNKQ0iAAAHAAAAAAEaARoAEQAUABwAJQApAC0ANgAAEzMVFzMVMzUvAiMHFRczNSM3FyMXIwcVFzM3NQcVJyMHJyMHNRc3FysBNTcXNzI2NCYiBhQWJnAJQhMDPgaRCQlCOIM4OGeWCQmWCRIfDRYoDQ1PDx0eXRMvJQQGBggFBQEHQgkTKQc+Agn0CRPhOTgJcQkJcQpLHhYoDCdQDxwbEy5BBgcGBgcGAAkAAAAAAQcBGgAOABEAGQAeACgALgA3AD8ASQAAJS8BIwcVMzUzFRczFTM1BzUXDwEVFzM3NScHFSM1MwcjFSM1MzIVFAYnIxUzMjQXNic0ByMVMzInNTM2FhQGJzcjFSM1MxUjFTMBBD4GkQkScQlCE0s4xQkJzgoKCby8lgYNFBUNCgUFCkIJAR4UFA0UBgcLCghNEg0hFBLZPgIJZ15CCRMpBDk5OAlxCQlxCV4SXTgTORMICxsRESYJDBwBOAsjAQsPCwELFjkLDgAAAAAEAAAAAAEaAQcAAwAhACsAMgAANzM1Izc1NzMfATMXFQcjJzUjJzU3Mx8BMxcVIzUjLwEjFRcnIxUzPwEzNSMHIxUzNSMHJhISEgpTCAhrCQnOChwJCVMICGsKE2cICERxCEQ7CAhxaBNBvGsIXksTCQkEDgqWCQkvCakKBQ4KLiUFDjgPDzkOBRM4S10OAAAEAAAAAAEaAQcACgASABwALAAANzMXFQcjJzU3Mx8BNTcjDwEjFTczNyMvASMVMzcXJzcXFQcnNyMOARcjNDY3kX8JCfQJCV4HhQF3EAZUZnoBegcQUFAQMRkOKSsNGxoPFQETHhf0CrsJCc4KA8wdZxADcZYTAxA5EEkaDSoNKg4ZARUOFiABAAAAAAUAAAAAAQcBGgARABQAHAAgACoAABMfARUHIzUzNSMnNSMVIzU3MwczJwcjBxUXMzc1ByM1MwcVIzUHJzcjNTPGPgMKQThCCXESCZEEODgdgwkJgwoTcHATEjINMSE4ARc+B7YJE5YJQktUCUs5XgqDCQmDeXAcOCExDTISAAAACwAAAAABBwEaAAoADgAjACcAKwAvADMANwA7AD8ASQAAEzMXFQ8BFQcjJzUXIxUzFTM1LwE1IxUHIxUjNSMnNSMVMzUzNRUzNScVIzU3MxUjNRUjNTczFSM1FSM1OwE1Ixc3NSMVHwEVMzUvzgoDEAq7CUsTE0sQAyYJCRMKCRMmExISExMSEhMTEhITExIScxA4DwMTARkJXgYRfwkJ9Akmu3YQB1QvChISCi/hEhMTExMTExMTJRISExMmExMTFhBRUQ8HenkAAAAAAwAAAAABBwEaAAkADwASAAAlLwEjBxUXMzc1ByM1MxUzJzUXAQE4DXETE6kTE6leSzg43DgFEuETE6io4UsSOTkAAAAEAAAAAAETASwADQAQABcAHQAAEyMHFSMHFRczNzUzNzUnFyMHIzUzFRczNyM1MxUz23ESORISlxI7EDgeHiaWORJLS5ZeOAEsEzgTvBISORKXHh7hu3ESE7s4AAEAAAAAARoBBwAHAAABFQcVIzUnNQEZXUteAQcgWWhoWSAAAAIAAAAAARoBBwAHAA8AAAEVBxUjNSc1FxUzNTc1IxUBGV1LXnAmXuEBByBZaGhZIHFeXlkFBQAAAgAAAAAA+wEaAC0AUwAANyc2JicmJwYHBhcWFwcuAjc1Njc2NzY/ATY3Njc2JzceAQc2PwEVFhcWBw4BJxcGFhceAQc+ATc2JicOAS8BNiYnBgcGDwEGBwYVMQYWFyY3NjerCgkDCxIEDgIDBgMKCxQfEQEBAwQJChAICQcKAwQGDR8bCQYEEQoGCwsJJTsQAQkJDQoEDBIFBQQIBhMKBgwJFAIRCQ8CFwkEARAPCgUGHBMOCxwJDxYTEQ4NCA4OBBglFAcJCQ0NDw4ICgsPDBEMDBZHJQcIAgEQEyUbFBp/Bw0ZCQkcDwQRCxEjEAkJAg0bOxYWGg0PAhQXDAoSHwoXFRwfAAAAAgAAAAABCwEaAAYADQAAAScHJwcXMzcnBycHFzMBCg1wcQ13DXcNcHENdw0BDA1wcA13Bg5xcQ53AAAAAgAAAAABDgEaAAYADQAANxc3FzcnIwcXNxc3JyMTDXBxDXYNeA1wcQ12DaENcXENeOgNcHANeAACAAAAAADuAQAABgANAAA3BycHFzM3BzcXNycjB+BKSwxRC1GjTUwMUwtS/0pKC1FRzkxMC1JSAAQAAP//AS4BBwAUAB4AKwAyAAA3MxcVJic1Iw8BIxUzFhcjJzU3Mx8BMzcjLwEjFTM3Fz4BHgIOAi4CNhc3JwcnBxeRfwkIC3YQBlVgAgRvCQleBwt6AXoHEFBQEDERKCQXAhIhKCQWAxI4LQ8nGAwg9ApUBwQbEANxCQkJzgoDNhMDEDkQQgwCESIoJBcCEiEoJFI7DDQTDhoAAAUAAAAAARoBBwASABwAIAAkACgAADczFxUjNSMPASMVMxUjJzU3Mx8BMzcjLwEjFTM3FzMVIzczFSM/ARcHkX8JEncQB1ReZwkJXgcLegF6BxBQUBAQExMmEhIlEiYR9ApBExADcRIJzgoDNhMDEDkQNXBwcGkHagYAAAADAAAAAAElAQcADQAZACAAADczPwEnIzUnIy8BIwcVNzMfATMVIw8BIw8BFyM3Mz8BMxzOCTIJFQpsEQZeCRNQEAdnVQYQRwkTvbofRQYQbSYGhAwuChADCs7FEAMlAxAHOTFeAxAAAAMAAAAAARoBBwAKABIAHAAAJSMvASMHFRczNzUHFSM1Mz8BMycjDwEjNTMfATMBEH8QB14JCfQJE+FVBhB3AXoGEFBQEAd69BADCs4JCbuVHXEDEBIDEDkQAwAABQAAAAABLAD0ABMAIwBAAEkAUwAANzMyHgEdARQOASsBIi4BPQE0PgEXIgYdARQWOwEyNj0BNCYjByIGHQEjIgYUFjsBFRQWMjY9ATMyNjQmKwE1NCYXFAYiJjQ2HgEHFAYiJj4BMhYVS5YUIxQUIxSWFCMUFCMUFyEhF5YXISEXegQFHAQGBgQcBQgGHAQFBQQcBokLEAsLEAsTCxALAQoQC/QUIxQ4FSIUFCIUORQjFBMhFzgYISEYOBchJQYEHAUIBhwEBQUEHAYIBRwEBhMICwsQCwEKQAgLCw8LCwgAAAAABAAAAAABGgEaAB8ANwBAAEkAADcnIw8BJwcXDwEVHwEHFzcfATM/ARc3Jz8BNS8BNycHJxc3FwcXFQcXBycHIycHJzcnNTcnNxc3FxQGIiY0NjIWBzI2NCYiBhQWqwoWCg0lERgDLS0FGA8lDwgWCg8lDxgFLC0GGA8lCAonJhstLRsmJwo0CiclGi0tGSYnCEAXHhYWHhcmCAsLEAsL2i0tBhgPJQ0KFgoPJQ8YBSstBRgPJQ8IFgoPJQ8YQy0ZJicINAonJRotLRkmJwg0CicmGy2DDxYWHhcXIgsQCwsQCwAABQAAAAABBwEaACIAJgA5AEwAUAAANyM2NSYnJi8BJiIGBwYHJicmIyIHBgcGDwEUFyMHFRczNzUHIzUzNSM1JjU3Njc2NzYyFxYXFhcWFTM0NzY3Njc2MhYXFh8BFAcVByMXIzUz/R4CBAMGCAUICQgDEQ0NEQwFCQgHBgMEAQIeCQnhCoRdXTgCAQIDAgcCDwQJBgQBAhMCAgQFCgMPCAUBAQICAjZeXl7hCA8LBQkDAgMBAgUUFAUDBQMJAwsDDggJqQkJqaCWEwQFCgMFAQQEAgIECAUDBQUFBQMFCAQCBAYBAwUKBQICqZYAAAAABQAAAAABGgEaABMAFgAmADAANAAANzMVFyMnNTczHwIVJic1Iyc1IxcnFRcVMxcVByMnNTczNTQ2MhYHBh0BMzU0LgEGBxUzNThLAlYJCZEGPgMIC0IJcbw4QRMJCXEJCRMWHxYzBSUGCgwlXiYSAQn0CQI+BzALBwgJQjk5OUsSCksJCUsKEhAWFgIGCBISBgkFAjc4OAACAAAAAADhASwADwAYAAATMxUeARQGBxUjNS4BNDY3FzI2NCYiBhQWjRIcJiYcEhwmJhwJFB0dKB0dASxMAyo6KgNMTAMqOioDex0oHR0oHQAAAAAEAAD//gEcARoAHwAqAEkAVQAANyc3FxUHJzcjBiY9AS4CPgEzMhcWFxYVFAYHFRQWMycWPgIuAQ4CFhcWFx4BBw4BLgI2NzY3NTQmKwEXByc1NxcHMzIWDwE+Ai4CDgIeAYsYDCgoDRgjExwOFAULFw8JCRIIAxUQEAw1CBQOAgoQEA0DB8gOCgwDCQgaHBQGCwwICRELIxgOKCgOGCMTHAEGBwwHAQkQEQwDBxA4GA0oDSgOGAEcE2gDFBwaEAMIEgkJERoDZwwRmwUCDhQPBwMNEBB7AwoMIQ4MCwYUHBoIBQJoDBAYDSgNKA0YGxSyAQgODg4GAwwREAoAAAAABAAAAAABBAEHAAMADQARABUAABMjFTMHJzcXNTMVNxcHJzMVIxcjFTOpExMQXg1OE00OXhATExMTEwEHE85dDk4bG04OXagSJhMAAAQAAAAAAQgBLQA0AD8ASgBXAAA3LgEHBgcGBy4BJzI3PgE1NCcmJyYjIg4BHgEXFQYHDgEeAj4BNTYuASc1FhcWFx4BPgE0Bx4BDgIuAT4CJyIuAT4CHgEOARcOAS4CPgIeAgb5DCEODAYBAR4qAwQEDRAEBxIJCg4XCwUUDgkICwsFFBwbDwEJEgsPFhMUBB0kGKgICgIOFA8HAw0QAwgOBwMNEBEKBA+NBQ4OCwYEDBEOCQMEmwwDCQgNBAQDKh4CBhcOCgkSBwQQGhwUA18CBQgbGxQGCxcPCRQPAi0VCwoBEhUDGyUyBA8UDgIKEBANA4IKDxEMAwcRFA17BQQDCQ4RDAMGCw0OAAAGAAD//gEaARoAIQAtADkASgBVAGEAADcGDwEVFhceARUUDgIjIi4BPgE3NS4CPgEzMh4CFRQHLgEiDgEeAj4CJxYyPgEuAg4CFhcWFxYVFA4BLgI2NzY3NTMXPgEuAQ4CHgE2JwcXNxc3JzcnBycHaQgNCAQEDRAHDRIJDxcLBRQODhQFCxcPCRINBxYEDRAOBwMNEBAJASwHEA0IAQkQEQwDB8gOCg4QGhwUBgsMBwoSCwcCChARDAMGEBQdHw0fIA0fHw0gHw3QDAYCXgECBRgOChEOBxAaHBQDXwMUHBoQBw0SCQ+fBwgKDxEMAwYOD54FCA4QDQcEDBAQewMKDhMOGAsGFBwaCAUCQ4UHFBAGAwwRDwsC2B8OICAOHyANHx8NAAAAAAUAAAAAASwBGgAdACoANgBKAFYAADcGDwEVFhcWFRQHDgEiLgE+ATc1LgI+ATM2FgcUBy4BIyIGFx4CPgInFjI+AS4CDgIWFyM1NCYrARcHJzU3FwczMhYXFgcVIzUjNTM1MxUzFSNpCA0IEwoIAwYYHRcLBRQODhQFCxcPEx0BFgQNCA0RAwENEBAJASwHEA0IAQkQEQwDB8gSEQsjGA4oKA4YIw4YBQQBEzg4Ezg40AwGAl4EEAwOCgkNEBAaHBQDXwMUHBoQARwUD58HCBUNCAwDBg4PngUIDhANBwQMEBAvHAwQGA0oDSgNGBANCQnFOBM4OBMABwAAAAABGwEaACAALAA4AEEASgBTAFwAADc+ATU0LgIjIg4BHgEXFQ4CHgEzMj4CNTQmJyYnNRceAQ4CLgI+ATInIi4BPgIeAg4BFxQGIiY0NjIWBzI2NCYiBhQWJxQWMjY0JiIGNRQWMjY0JiIGVA0QBw0SCQ8XCwUUDg4UBQsXDwkSDQcQDQQEBQYIAQkQEA0DBw4QCAgOBwMMERAJAQgN0BsnGxsnGy8MEREXEREHCw8LCw8LCw8LCw8LvgYXDwkSDQcQGhwUA18DFBwaEAcOEQoOGAUCAV51BA4PDgYDDBEPCoMKEBAMBAcNEA4InxQbGyccHC8QGBAQGBCICAsLDwsLSAcLCw8LCwAAAAAE//8AAAEHARoADwAbAB8ANQAANxUXMzc1LwIjFTMXFSM1NyM1IxUjFTMVMzUzBzMVIzcHJzcjIgYUFjsBFSMiJjQ2OwEnNxc4E6kSBTgOJSU5qYMlEyUlEyVdXV0TKA0YOAwQEAwJCRQbGxQ4GA0ocUsTE6gOOAUSOahLSyUlEyYmSxOZKA0YEBgQExsnHBgNKAAABAAAAAABGgEaABEAFgAiAC4AACUvASMHFRczJicjNTMXFRYXNQcjFTM0JzM1MxUzFSMVIzUjFyIOAR4CPgE1NCYBATgOcBMTZAkGVXA5CghuJyUlJRMlJRMlcBEcDQYYIh8TIdw4BRLhEwgK4jk6AwVCcBMKZyUlEyYmJhMfIhgGDRwRFyEAAAUAAP/+ARoBGgAdACoANgBXAGMAADcGDwEVFhcWFRQHDgEiLgE+ATc1LgI+ATM2FgcUBy4BIyIGFx4CPgInFjI+AS4CDgIWFxYXFhUUDgEuAjY3Njc1NCYrARcHJzU3FwczMhYXFgcXPgEuAQ4CHgI2aQgNCBMKCAMGGB0XCwUUDg4UBQsXDxMdARYEDQgNEQMBDRAQCQEsBxANCAEJEBEMAwfIDgoOEBocFAYLDAgJEQsjGA4oKA4YIw4YBQQBCwcCChARDAMGCw0O0AwGAl4EEAwOCgkNEBAaHBQDXwMUHBoQARwUD58HCBUNCAwDBg4PngUIDhANBwQMEBB7AwoOEw4YCwYUHBoIBQJoDBAYDSgNKA0YEA0JCaoHFBAGAwwRDgkDBAAABQAAAAABBwEOAAkAFwAhACUAKQAANxUzNRc3JyMHFw8BFRczNzUnIw4BIiYnFzMVIzUzHgEyNiczFSMVMxUjgxMyDUINQg42CQnhCgpCBBohGgNpLM4rCCAnID0TExMT8CIiMg5BQQ47CV4JCV4JEBUVEBJLSxEVFVwTExMAAAADAAAAAAEHAQ4ACQAXACEAADcVMzUXNycjBxcPARUXMzc1JyMOASImJxczFSM1Mx4BMjaDEzINQg1CDjYJCeEKCkIEGiEaA2kszisIICcg8G1tMg5BQQ47CV4JCV4JEBUVEBJLSxEVFQAAAAADAAAAAAEHARoACQAXACEAADc1MxU3FwcjJzcPARUXMzc1JyMOASImJxczFSM1Mx4BMjaDEzINQg1CDjYJCeEKCkIEGiEaA2kszisIICcgrWxsMQ1CQg1bCV4JCV4JEBUVEBJLSxEVFQAAAAAFAAAAAAEaARoADAAYAB8AIwAnAAA3MxcjJzU3MxcVJzUjFwczNycjNycjDwEXNzMHMwc3IycjNTMHIzUzOTANRgoK4QkTzmgbKmkNHw8PNhErESs2I0JsHzMKNj8aJS5xEwmpCQlaITCpQWwgGx0LXhpwOG1IOBM5EwAAAQAAAAABGAEhAGwAACUWFRQHBgcWHQEUBiImPQE2Jic3Njc2NzY1NC8BNicGDwEmBycmIwYXBw4BFRQXFhcWHwEGFxUWBiImPQEGJyYnJi8BLgEnLgE+ARcWFxYfARYXFjc1JjcmJyY1NDcmPwE2FxYXNhc2NzYfARYBBxEXEiAGBQcFAQUFBRYNEQkLEAIHBhETBykpBxoLBgcDCAkLCBINFgULAQEGBwYRDQsJBQgBBQcDAgMCBgMHBwMHAQoIDRUCByARGREFCQYEChAVKSoUEAsEBgnqFBstGBEFChEuBAUFBC4IDQYOAwYHDxIdFhEKEBIEDQILCwIQExAJCBUKHREPCAYDDwoPLwQGBgQaBAQDCAQLAQYGAQEGBgQCAQUDCAINBAcFBA4NBhEYKxwUGhUEAgEDDQoKDQQCAgUZAAAAAf//AAABLQEsAFQAABMiDgEVFB4BFzI2PQEGJyYnJi8BLgEvASY3NjMxHgEfARYXFjc2NyYnJjU0NzEmNzMyFxYXNjMyFzY3NhcxFg8BFhUUBwYHHgEdARQWMz4CNTQuAZYpRSgaLh4FBQ4LCQcEAwMCCAMDCQQCBAYLAwMJDgoKAQgeEBYQBwkEBggKDQ8XERQSDQcDCAUBEBYPHwQGBQUeLxkpRQEsKEUpIDoqCgQEGQMDAgUEBQQICgMBBgMBAQcEBA8BAQQMCAQNEycXERMUAwQJBQUMAwIBExQBERcnEg0EAw4KKQQECis6HylFKAAAAAMAAAAAAQcBBwALABMAFwAANzM1MzUjNSMVIxUzJzMXFQcjJzUXMzUjcRJxcRI5OULOCgrOCRK8vDhxEjk5El4KzgkJzsW8AAIAAAAAAS0BLAAMAGoAABMiDgEUHgEyPgE0LgEDIyImPQE0Jic+Ajc2NTQmJz4BNCYnIyIGDwImBy8BLgErAQ4BFBYXDgEVFBceAhcOAQcOASYvAi4BIwcGFB8BFh8BHgE3MzcVFAYrAS4CPgIyHgIOAQeWKUUoKEVSRSgoRQECAgQEBQ0XEAMEBwYBAQICAgUIBAkHICAHCQQJBAMBAgEBBgcEAxAWDQMEAQcPCwQEBAMGAwUBAggCAgYDEQoGBwQDAR0sEwokNz43JAoTLB0BLChFUkUoKEVSRSj+8AMDIwcNBAEJEAsNDgkSBwQHCQkFAgIFBAkJBAUCAgUJCQcEBxIJDg0LEAkBAwkFAwEIBwQFAQMBAQICBgICCwkKAQEWAwMJLDo+MhwcMj46LAkAAAAACgAAAAABGgEaAAwAEgAeACoAMQA3AEEASABNAFMAABMyHgEUDgEiLgE0PgEXLgEnFh8BNjUmJyMWFRQHMzYnNTY0JyMGFRQXMzYnJicrAQYHIzY3DgEPAQYUFzMmNTQ3IxcjHgEXJicXNjcjFjcGBz4BN58hOCEhOEI4ISE4fQkeEgwGMgEBAywBBC8CQQECSAEEQwIDBxAKCREGFAUNEx0JCAQELwQBLDQsCiYXEgkvEgo3CUIJEhclCwEZIThCOCAgOEI4IUsSGgYXGzgFBA8NCggTEwkKAQkSCQkJExMKQR4aGh4bGAcaEhIOHQ4TEwgKShYcBRkdMRYbGxweGQUcFgADAAAAAAEsARoAFgAnACoAAD8BNScHFyMiBhQWOwE1IyIuATY7AQcXNyMnMx8CFQcjJzUXFTM1IzcVM3EmKA0YOBQbGxQJCQwQAREMOBgNXzITWA05BROoExOoSxM4vScNKA0YHCcbExAYEBgNSxIFOA6oExOMEHyWSzkAAwAAAAABDwEaAAMAGgAwAAA3Bxc3Jx4BMj4BNC4BIyIHFzMyHgEUDgEiJic3Byc3IyIGFBY7ARUjIiY0NjsBJzcXWkcORx0NMTovHBwvHAwMEQcXJxYWJy0lCzYoDRg4DBAQDAkJFBsbFDgYDShuRQ1FIhkfHC84MBsCERYnLicWFBFhKA0YEBgQExsnHBgNKAAAAAIAAAAAARoAvAADAAcAACUhFSEVIRUhARn++gEG/voBBrwTJhIAAAAHAAAAAAEaAQ8ACQARABUAHQAhACkALQAANxcHJzU3FwczFQc1NzMXFQcjNzUjFTc1NzMXFQcjNzUjFTcVFzM3NScjFxUjNSgQCyAgCw/wzgkmCQkmHRM4CSYJCSYdEzgJJgkJJh0T4RELHwwfDA8TxqsICKsIEZmZHYUICIUJEXV1fWAICGAIEFBQAAIAAAAAASABLAAGABMAACUVIyc1MxU3ByMnByc3Mxc3MxcHARn9CRPOYQ0fRA5LDh9gDSYNOBIJ/fS4YR9EDUsfYSYNAAAAAAYAAAAAARoBLAAGAAoADgASABYAGgAAJRUjJzUzFTczFSM3MxUjBzMVIwczFSM3MxUjARn9CRM4JSWDJiZLJiY4JSWDJiY4Egn99M8mOCUmJSYlOCUAAAAHAAAAAAEaASwABgAOABIAGgAeACYAKgAANzM1IzUjFTc1NzMXFQcjNzUjFTcVFzM3NScjFxUjNQc1NzMXFQcjNzUjFRz98xMlCiUKCiUcE4MKJQoKJRwTXgolCgolHBMmEvT9JZYKCpYJE4ODsrwJCbwJEqmps3EJCXEJE15eAAYAAAAAAM8A9AADAAcACwAPABMAFwAANzMVIxUzFSMVMxUjNzMVIxUzFSMVMxUjXiUlJSUlJUslJSUlJSX0JiUmJSa8JiUmJSYAAAALAAAAAAEHARoACQARABUAHQAhACkALQA1ADkAPQBBAAATMxUjFTMVIyc1FyMnNTczFxUnMzUjFyMnNTczFxUnMzUjByMnNTczFxUnMzUjFyMnNTczFxUnMzUrAhUzNSMVMxwmHBwmCXomCQkmCSUSEow4CQk4CjkmJkEmCQkmCSUSEow4CQk4CjkmJhImJiYmARkS4RMJ9GcJJgkJJgoSJQk4Cgo4CiWWCSYJCSYKEzkKOAkJOAkmE3ASAAEAAAAAARoBBwAcAAAlLgEnLgEiBg8BJy4BIgYHDgIUHgEfATc+AjQBFwIJBwoaGxkKDQ0KGRsaCgcJBAQJB29vBwkE0gkRBgoKCgkNDQkKCgoHEBISEhAHbm4HEBISAAIAAAAAARoBBwAdAD0AACUuAScuASIGDwEnLgEiBgcGBwYUHgEfATc2NzY1NAcGDwEnLgI0PgE3Njc2FxYfATc2NzYXFhcWFxYVFAcBFwIJBwoaGxkKDQ0KGRsaCg0FAgQJB29vBwQJFQMKYWIFBwMDBwUHChMUCQcaGQcKExQJBwUDBwHSCREGCgsLCQ0NCQsLCg0TCRISEAZvbwYIEBMJFQ0KYWEFDAwODQsFBwQICAMIGRkHBAgIBAcFBgsOBwYAAAACAAAAAAEdARsAHgAlAAA3PgEmJy4BDgEHNSMVFzM1Iz4BHgEOAiYnBx4CNic3JzUjFRf9Eg0MEhM8QTgQEwlCKRNISi4CMUtGEhAPOEI+Kw42EwNFFzk5FxocBCEcLUIJEiIdFT5NPBIhIgkdJgYbLA02R0sHAAACAAAAAAEUARMAEQAcAAATFwcnFQcjJzUjFQcjJzUHJzcHFTM1NzMXFTM1J513DRMKOAkmCTgKEg53RCYJOAolSwESbA4RegkJQkIJCXoRDmxYgkIJCUKCRAAAAAQAAAAAAPQA4gALACAALAAwAAA3MzUjFSM1IxUzNTMXMyc2NzY3NjQuAScmJyYrARUzNTM3BisBNTMyFhUUBwYXIxUzeQ8PMRAQMWoRGAMECAMCAwUEBgcEAy4PHAkDAiAgBgoBAxe8vHFwMTFwMDAxAQMGCQULCgcDBQIBcC4QASQKCAUDB2YTAAAABQAAAAABBwEaACQALgA7AD8AQwAANzMXFTMXFQcjFQcjByc1Iyc1Iyc1NzM1NzM1LgE1NDYyFhUGBxc1IxUXMxU/ATMnBgcxBiYnBx4BMjY3JyMVMzczFSOfSwkKCgoKCTovEC8KCQkJCQpLBAYLEAsBCUKWLwkiBzUoCw4NGAkNChkcGQlMExM4ExPhCSYKEgk5CTQHLQw2CRIKKAcVAwgGBwsLBwsFYThuAikmAy4KAwMICQ4JCwsJMxMTEwAAAwAAAAABGgEaAAkAEwAdAAA3Mzc1LwEjDwEVNyM1Mx8BMz8BMycjDwEjLwEjNzMc9Ak0CI0JNPThLw4IVggNMQE1CQxLDgg1MX8mCVSQBgaLWQk4FwUFFxMFFxcFhAAAAQAAAAAA9ADPABEAADcVFBY7ASc3FxUHJzcjIiY9AUsFBIEeDTAwDR6BCxHOJQQFHg4wCy8NHhAMJQAABAAAAAABGQEbABMAJwArAC8AABMeARceAQYHDgEmJy4DPgMXPgE3PgEmJy4BBgcOAR4BFx4BNyczNSMXFSM1oRYpDxgSDBUTNzwbFB4RAg0aJisgEiEMEgsQFBIxMxUZGgMfGhEmEh8YGBgYARkDExAYPkAaGBkCDgsiKi0sJBoL8wQUDxY3NRUSEQcOETU7Mg4JBgSUEiVLSwAABQAAAAABGgEaAAcACwATABcAHQAAARcVByMnNTcXIxUzFRcVByMnNTcXIxUzJxcHFzcnAQcSEpYTE5aWlhISlhMTlpaW9B4eDSsrARkSSxMTSxISSzkSSxMTSxISS44eHg0rKwAAAAADAAAAAAEnAQcADAAQABQAAD8BMxcVIzUjFTMVIycFJxU3BzUXIxMT4RIS4V1dEwEUfjMgPSX0ExNxcZYTEyB+sTMGVj4AAAAJAAAAAAEHARoABwANABUAGwAkACoAMgA4AEEAADcXNjQnBxYUJzcmJwcWJzcmIgcXNjIHJwYHFzYHNDcXBhYXByYXBxYXNyYXBx4BNycGIjcXNjcnBicyNjQmIgYUFu8SBgYSBQsQEiMJHiwFEicSBg8hPwkjEhEPLQYSBgEFEgYeERIjCR4tBhInEgUQIT8JIxIQEEwHCwsPCwt/BRInEgYPIT8JIxIRDxUSBgYSBgwREiMJHk0UEgYPIRAFEhsJIxIQEBYSBQEGEgULEBIjCR46Cw8LCw8LAAAAAwAAAAABIwEbABUAMAA5AAA3By8BNxc+Ax4DFyMuAgYHNx8BBycOAy4DJzM1FB4DPgI3Byc3JxQWMjY0JiIGYz0NGREPCBskKCklHBABEgQySD4MLK0ZEQ8IGyQpKSQcEAITDBgfJCMgFwcrBz1/CxALCxALwhkFPAckEx8UCAYUHiYUJDQJJyISQz0IJRMfFAgHFB4mFQkSIhwSBgYSHBESEhkKCAsLDwsLAAMAAAAAAQcBGgANABsAJAAAEyIOAR4CPgEnNi4CByIuAT4CHgEVFA4CJxQWMjY0JiIGjSU+HA41SEQqAQETIi0YIDQYDSw9OiMQHSYnCw8LCw8LARkpREk0Dhw9JRksIxLhIzo9LA0YNCAUJh0QZwcLCw8LCwAAAAEAAAAAAOABBwAcAAA3ByM3Mjc2NzY/ATY1NC4BIzczByYOAQ8BBhQeAakCXAIOBQcDBgYmBQQJDAJWAgoNCAYmBgQJLQYGAgMFCBSHEAkEBwIHBwEGDBWHEwkGAwAAAAIAAAAAARoBBwAbADEAADcjJzUjLwE/ARceARcWFxY3Nj8DHwEPASMVJzM1NzM3JwcGBw4BIiYnJi8BBxczF9+TCRsJDAZQDAEFAgUGDg0GBQUEDFAGDAkbk4AJHQg/AwMDCBQVEwcEAwNACRwKIQp9BzILGwYFBwIFAwUGAgUFCQYbCzIHfQl9CSMVBAUDCAgICAMFBBUjCQAAAAIAAAAAAQcBBwBGAI0AADc1IyIOAQcxBgcxBhcVFAcxBgcGKwEVMzIXFRYXFRYXMRYdAQYXFRYXMR4CFzM1IyIuAj0BNCYnJic2Nz4BPQE0Njc2MxcVMzI+ATcxNjcxNic1NDcxNjc2OwE1IyInNSYnNSYnMSY9ATYnNSYnMS4CByMVMzIeAh0BFBYXFhcGBw4BHQEUBgcGI3ECCREMAwMBAQECBAoFBgEBBgUFAwQCAgEBAQMDDRAJAgIGCgcEAgIFCQkFAgIJBwUGTQEJEA0DAwEBAQIECgUGAgIGBQUDBAICAQEBAwMNEAkBAQYKBwQCAgUJCQUCAgkHBQb0EwcNCAgICAgQBgUKBQISAgECAwEDBQUGEAgIAQcICA0GARMECAoGGQYMBQsHBwsFDAYZCQ0EArwSBg0IBwkICBAGBQoFAhICAQIDAQMFBQYQCAgBBwgIDQcBEgQICgYZBgwFCwcHCwUMBhkJDQQCAAAAAwAAAAAAqgEHAAsAFAAdAAA3HgE+AiYnJg4BFjciJjQ2MhYUBiciJjQ2MhYUBowECgkFAQQFBg8IAhEICwsQCwsICAsLEAsLKQMBBQgKCQMEAw0PVgsQCwsQC14LEAsLEAsAAAMAAAAAARwBHAAcADkARQAAEx4CBw4BIyInDwEjFQcjFQcjJzU/ASY1ND4CFzY3MTYuAgcOARUGFw8BFTM1NzM1NzM/ARYzMjc+AS4CBgcGHgE21RcjDAQGLx4NCw8HEwkcCjgJAl4EER0lLBIFAwkYIBEWHgEFAl4lCR0JFxEKDAwXAwMBBQgLCQIEAw0OARgFICsWHSYEEgMcChwJCSsHXQ0OEiMXCYoOFxEgGAkDBSQXDQwKXx4dCRwJEwMEQgQKCQYBBQQHDwgDAAYAAAAAARoBGgAvADYAOQA9AEAARwAAJSczNSM1IxUjFTMHIxUzHgEyNjczNSMnMxUjDwEXMzcvASM1MwcjFTMeATI2NzM1BwYiJiczBicjNx8BIz8BFyMXBiImJzMGARIeE14TXhMeBwIFGB4ZBQIIHzolCCUHqQclCCU6HwgCBRgfGAUCtwYPDAQvBAEmE3YXgxd2EyYgBg8MBC8EqUsTEhITSxMOEhIOE0uWBC8PDy8ElksTDhISDhMdAwcGBhktixwcii0cBAgGBgAAAAAGAAD//QEtARgABwALABcAHwAsADMAABMjBxUXMzc1BzcXDwEnMxc3MwcjIgYPARcHJyMXMzcmNzYXMhYVFA4BLgI2FzcnBycHF5kKb28Kc9ZeYWEFbSFRVCIPBxknCBMQFVEhbQoUBCsPERchEx8iGAcNLiIPHBAMGAEYTBBKShAIQUE/Qko3NwodFg0ODjdKDQk9CgEgGBEcDQYZISA/LQslDg8TAAAFAAAAAAEsARgABwALABcAHwAoAAATIwcVFzM3NQc3Fw8BJzMXNzMHIyIGDwEXBycjFzM3JjcUFjI2NCYiBpkKb28Kc9ZeYWEFbSFRVCIPBxknCBMQFVEhbQoUBBMgLyEhLyABGEwQSkoQCEFBP0JKNzcKHRYNDg43Sg0JDhchIS8hIQAEAAAAAAEMARgABwALABIAGQAAEzMXFQcjJzU3Bxc3BxczNyMHJxcnMxc3MwePCnNzCm90Xl5h020KcSJUUUxtIVFUInEBGEwQSkoQOUE/PzdKSjc3eUo3N0oAAAIAAAAAARoBGgAHAAsAABMHFRczNzUnFSM1MyYTE+ESEry8ARkS4RMT4RLz4QAAAAIAAAAAARoBGgAHAAsAABMHFRczNzUnBzUzFSYTE+ESEuG7ARkS4RMT4RLz4eEAAAMAAAAAARoBGgAHAAsADwAAEwcVFzM3NScHNTMVMzUzFSYTE+ESEuFLS0sBGRLhExPhEvPh4eHhAAAAAAUAAAAAARoBGgAHAAsADwATABcAABM3MxcVByMnNxUzNQczFSM3MxUjNyMVMxMT4RIS4RMT4c8mJjklJV0lJQEGExPhEhLh4eESExMTExMABAAAAAABGgEaAAcACwAPABMAABMHFRczNzUnBzUzFTc1MxU3MxUjJhMT4RIS4SUTcBMmJgEZEuETE+ES8+HhS5aWluEAAAAABAAAAAABGgEaAAcACwAPABMAABMHFRczNzUnBzUzFTM1MxUzNTMVJhMT4RIS4SUTcBMmARkS4RMT4RKolpaWlpaWAAADAAAAAAEaARoABwALAA8AABM3MxcVByMnNxUzNTMVMzUTE+ESEuETE5YSOQEHEhLhExPhlpbh4QAAAAADAAAAAAEaARoABwALAA8AABMHFRczNzUnBzUzFQczFSMmExPhEhLh4eHh4QEZE+ESEuETqZaWEjkAAAADAAAAAAEaARoABwALAA8AABM3MxcVByMnNxUzNTMVMzUTE+ESEuETEzgTlgEHEhLhExPh4eGWlgAAAAACAAAAAAEaARoABwALAAATBxUXMzc1Jwc1MxUmExPhEhLh4QEZEuETE+ESqJaWAAADAAAAAAEaARoABwALAA8AABMHFRczNzUnBzUzFTM1MxUmExPhEhLhSxKEARkT4RIS4RP04eHh4QAAAAACAAAAAAEaARoABwALAAATBxUXMzc1JxUjNTMmExPhEhKEhAEZEuETE+ES8+EAAAADAAAAAAEaARoABwALAA8AABMHFRczNzUnBzUzFTM1MxUmExPhEhLhgxNLARkT4RIS4RP04eHh4QAAAAACAAAAAAEaARoABwALAAATBxUXMzc1Jwc1MxUmExPhEhLhgwEZEuETE+ES8+HhAAACAAAAAAEaARoABwALAAATBxUXMzc1Jwc1MxUmExPhEhLh4QEZE+ESEuET4c7OAAAGAAAAAAEaAQcABwALABMAFwAfACMAABMHFRczNzUnBzUzFT8BMxcVByMnNxUzNQc3MxcVByMnNxUzNTgSEksTE0tLORI5EhI5EhI5SxI5EhI5EhI5AQcTvBISvBPPvLy8ExM4ExM4ODiDEhI5EhI5OTkAAAYAAAAAASgBBwAHAAsAEwAXAB8AIwAAPwEzFxUHIyc3FTM1Fz8BHwEPAS8BFzcvATczFxUHIyc3FTM1XgkmCQkmCRMSKQYjDEYFIwwyQBJBvwkmCQkmCRMS/QoKzgkJxby8BwwNBcIMDQXAsAawDAoKzgkJxby8AAMAAAAAARoBGgAIABIANwAANyIGFBYyNjQmFycHNyczNxczBycOAQcjFRQWOwEWFyMGJj0BNCYnLgE1NDc+AzMyHgEVFAcG4RchIS4hIQIZGAkWGwoKHBcfEh0HIwMDGgMFIgoPCgkMDgwFEBMVDBcnFwcEgyEuISEuIV0SEhwQHx8QUgMYEikCBAoIAQ8KHg0YCQsfERcTCg8LBhYnFxIOCQAAAwAAAAABHQEaADsAWABsAAA3Njc2PwE2NzY1NC4EIg4EBx4BFx4BHQEUHgI7ATI+AjUnIyYnFRQGKwEiJj0BMz4BMzcyFzY3Njc2MzAxJyYnJicmJwYHBgcGDwEXFhcWFxYXNjc2MhcWFxYUBwYHBiInJicmNKgFCAYEAgIHBQYLEBMVGBUTDwsGAQENDAoKAwcJBR4FCQcEAQIJBwMDHgIEJQMLBwIEMwYOCw0HBQcICAsICgQFCggLBwkHBwkHCwgKHwkGAgcCBgkCAgkGAgcCBgkCeAoIBQYHCAUNDwwVEw8LBgYLDxMVDBIdDAoXDR4FCQcDAwcJBQgBBg8CBAQCKQYIAVAYDwoFAgEBBQYKDhMTDgoGBQEBAQIEBgsNBQYJAgIJBgIGAgYJAwMJBgIGAAACAAAAAAD1ARoAIQArAAA3DgEdARQGBwYnIwYmPQE0JicuATU0Nz4DMzIeARUUBgcjFRQWOwEyNjXbCQsIBwQFHgsOCgkMDgwFDxMWDBcnFg0zKQMDHgIDigkYDR4HDQMCAQEPCh4NGAkLHxEXEwoPCwYWJxcSHi4pAgQDAwAAAAIAAAAAARoBGgAMABYAABMzFSMVMzUzFQcjJzUhFSM1Byc3IzUzHFVL4RIJ9AkBBhJ/DX5jegEZEuFLVQkJ9Hpjfg1/EgAAAAIAAAAAARoA9AAkAEkAADczMh4BHQEUDgErATUzMjY9ATQmKwEiBh0BHgEXFS4BPQE0PgEXNR4BHQEUDgErASIuAT0BND4BOwEVIyIGHQEUFjsBMjY3NS4BUzkSHRERHRIJCRMaGhM5ExsBFRAYIBEdoBggER0ROhIdEREdEgkJExoaEzoSGgEBFfQRHhEEER0SExsSBBMaGhMEEBkDEwMkGAQRHhFMEwMkGAQRHhERHhEEER0REhsSBBMaGhMEEBkAAAADAAAAAAEHAPQAAwAHAAsAADc1MxUnMxUjNxUjNXFLcZaWvOFLExNeE14TEwAAAAAEAAAAAAEHAPQAAwAHAAsADwAANzMVIxUzFSM1MxUjNTMVIyaoqJaW4eHOzoMSJhOEE0sTAAAAAAYAAAAAARoBBwAGAAoADgASADMAawAAEzczFSM1BzczFSMVMxUjFyMVMyc/ATY0JyYnJiIHBgcGBxUzNTQ/ATIzFxUWDwIVMzUjFzIXFhUUBwYHBiIuAS8BJicxMxUXFjM/Ai8BKwE1NzM/ASc0Jg8BBh0BIzU0Nz4CMh4CFAcrBw0NBzO7u7u7u7u70wEBAwECBwUIBQYCAQEQAQEBAgEBAQITJRELAgEDAQIHBQgFBAICAQEQAQIBAQEBAQEBBAQBAQEBAwEBAQ8DAQQGBwYGBAMBAAc5KgYCEzgTOBNSAQEFCAQHAgICAgcDAwEBAQIBAgEDAwMVCw06AgQGAwMHAgICAwIEAwQCAgEBAgIDAgwBAQMCAQEBAQECAQEGBQIDAgIDBwkEAAAAAAMAAAAAARoA9AADAAcACwAANzUzFSchFSE3FSM1E6mpAQb++s7OSxMTXhNeExMAAAUAAAAAAQcA9AADAAcACwAPABMAADczFSMVMxUjNTMVIyczFSM7ARUjS6mpg4O8vDjOzjgTE4MSJhOEE0sTqQAIAAAAAAEaAPQAAwAHAAsADwATABcAGwAfAAA3IxUzFSMVMwczFSMXIxUzNzMVIxcjFTMHMxUjFyMVMyYTExMTExMTExMTJc7Ozs7Ozs7Ozs7O9BMlEyYSJhO8EyUTJhImEwAABAAAAAABIwEgABYAJwAzAD8AABM3FxUHJzUjIgcGBwYHJyY3PgMXMxcVNycVIyYGBwYHNjc2NzYzBz4BHgIGBwYuATYXHgE+AiYnJg4BFqwSZGQSCB8PFhQVFxMBBAQZKDAaDRZHRiQYLhEVCRQUEhYPHEIMHRoQAg0MEysZCR4HERAJAggHDBoPBgEXCVARTAkjAwQNDx4GDg4ZLCARAUEjNjghARERFh0TCggDAkoJAg0YHRsHDAkkLDsFAggPERAECAYWGgABAAAAAAEYARoADwAAJS4CIg4BByM+AjIeARcBBQUfMDYwHwUTBSU4QDglBakaKxgYKxogMx0dMyAAAAAEAAAAAADiARAAEAAeACcAMwAANy4BIzEiDgIfATM3Nic0Jic7AR4BFxQPAScmNT4BFyYOAR4BPgEmJz4BHgIGBwYuATbLChwPFSIUAQw7CjsMAQtBAQIWIAEJMDAJASAiBhAIAw0PCQMmCBUSCwEJCQweEQX6CgwVIioSd3cSFg8bDgEhFxANYWENEBchKAUDDQ8JAw0PFAYCCREVEgUIBhkeAAMAAAAAAPQBBwAHAAsAGwAAPwEzFxUHIyc3FTM1JzU0JiIGHQEzNTQ2MhYdATgTlhMTlhMTlhMhLiETFSAVlhMTXhISXl5eEyUYISEYJSUQFhYQJQAAAAADAAAAAAEHARoAEQAZAB0AADcjNTQuASIOAR0BIwcVFzM3NSc0PgEWHQEjFyM1M/QTFCMoIxQTEhK8E6khLiFwlry8qSUVIhQUIhUlE3ATE3A4GCABIRglg3AAAAQAAAAAARoBEAAWABoAHgAwAAATIg4BHQEXMzc1NDYyFh0BFzM3NTQuAQcjNTMXIzUzJzU0JiIGBxUjNTQ+ATIeAR0BliQ8IxM4ExYeFxI5EiM8XDg4qTk5OSAuIQE4HjQ8NB8BECM8JF4TE14PFhYPXhMTXiQ8I+E4ODgTExggHxYWEx40Hh40HhMAAwAAAAABGgEPAAcADAAUAAATIwcVFzM3NScXByMnFyM1HwEzPwGbCn4J9AmDahqgGNnhFAioCBUBD0uVCQmVOD8dHYVyGgMDGgAAAAMAAAAAARoA9AAHAA0AEAAAPwEzFxUHIyc3FTM1ByM3IxcTCfQJCfQJE+FrDGS8XuoKCqgKCpWMjFJcSQAAAAADAAAAAAEHAPQAAwAHAAsAADcVNzUXNScVFzU3FSZBSzhLQsWNKY2wjSONI40pjQADAAAAAAD0AQcAAwAHAAsAABMzByMXIyczFyMHM2eNKY2wjSONI40pjQEHQks4S0EAAAAABAAAAAAA/AEQAAMABwAVABkAADczByMVMxcjPwEnIw8BFRcHFzM/ATUHMwcjbHcjd3cjd2QsCI0ILywsCI0IL5B3I3f9OBM4QkYOBUsJRkcOBUsJDjgAAAQAAAAAARAA/AADAAcAFQAZAAA3FTc1MxUXNQ8BJzU/ATMXNxcVDwEjNxU3NS84EzhBRw4FSwlHRg4FSwkOOMB3I3d3I3dkLAiNCC8sLAiNCC+QdyN3AAACAAAAAAEaAM8AEAAXAAA3MxUjNwcjJxQVFyM1MxcWFzc1IxUjFzd3JxsBIRchARkoDw4BnCUkNzbOemNjYwcvLXorKwQWQkI2NgAAAwAAAAABGgDuAA8AFwAbAAA/ARcVBycOAi4CNy8BNRcGFRQeATY3Jxc1BybnDAxyAw8VFg8GAyYIQAELEA4CWNfXrUAKoQoeCw8GBRAVCwoKJD0CAgkMAggILDmKPQAAAgAAAAAA7gD1ADgAQgAANwYnBi4CNzQ+AjMyFxYVFAYjIjUOASMiJjQ+ATM2Fhc3MwcGFjMyNjU0JiMiDgEVBh4CNxY3JxQzMjY3NiMiBsQaHxEhGQwBDh0mFCQWGR8XFQYRCg4RDRcNCQ8DBBEPAwMGDhUlHxglFQEJFBsOHBlMEQsQBAkZDhJEDwEBDBkgEhQnHRATFSMeJxIJCRMiHRIBCggPPA0KHxYdIBgpGA8aFAoBAQ04FxIRJB4AAAAAAwAAAAABLADhAAMABwALAAAlITUhFSE1ITUhNSEBLP7UASz+1AEs/tQBLM4TqRM4EwAAAAIAAAAAAOsA/gAmADsAADcnIwcXNxUxFTEVFB8BFhceAR8BHgIdATM1NC4CLwEuAjcnFwc2NyYvAQYPAQ4DHQEzNTQ+ATfFKA4oDRUBAgICBA0HDgcMBxoFCwwHDQYLBgEBFTQDAwcEAgUGDQcMCwUaBwwH1SgoDRQTCQYFBQsGBgsRCA8HERMNERENGBIQBw4GEBQLHRRTBAMKDAUHBg4HDxMYDRERDRMRBwADAAAAAAD+ARAACwAPACMAADc0NjIWHQEUBiImNRc1MxUnBi4BNTMUHgE7ATI+ATUzFA4BI14hLiEhLiEvEhIaKxkTFCIVEhUiFBMZKxrYFyEhF0sYISEYjSYmJgEaKxkUIxQUIxQZKxkAAAAEAAAAAAD+ARoACwAcACAANAAANzU0NjIWHQEUBiImNyIOAR0BFB4BMj4BPQE0LgEDNTMVJwYuATUzFB4BOwEyPgE1MxQOASNnHCYcHCYcLxIeEhIeJB4SEh4bEhIaKxkTFCIVEhUiFBMZKxqNSxMcHBNLFBsboBEfEUsSHhISHhJLER8R/ucmJiYBGisZFCMUFCMUGSsZAAMAAAAAARoBGgARABYAGgAAEyMVIwcVFzMVMzUzPwE1LwEjFyM1MxcnMxUjlhNnCQlnE1QHKCgHVFDAwB+nXl4BGSUKSwmDgwImDiUDSzgcCRIAAAMAAAAAARoBGgAKABUAJQAAEx8BFQcnByc1PwEfATUnFSM1BxU3MT8BFxUHJzcjFwcnNTcXBzOhdAQOdXUOBHQVZ2cTZ2cjDi4uDR5xHg0uLg0fcgEZSwesCEtLCKwHS6tClkI2NkKWQloNLw0uDR4eDS4NLw0fAAMAAAAAARoA9AATAB4AIgAAJScjBxUzNRcGHQEfATM/ATU0JzcHFQcnNTY3FzM3Fi8BNxcBGYAGgBMrDwVLCEkGDz9CQUIBDTEHMA1BZ2dnwjIyd14RFRoIByIiCAgZFRlHAR4eARYSExMSESgoKAAEAAAAAAEQARoACQATAB0AJwAANwc1IxUnBxczNycXNxUzNRc3JyMPATMVIxcHJzU3FzMnNxcVByc3I8AhEiENMA4wbg0hEiENMA41IUFBIQ0xMWVBIQ0xMQ0hQWMgQEAgDTAwkw0gQEAgDTBQIBMgDjENMC0gDTANMQ4gAAAAAAUAAAAAARoBGgAMABAAGAAcACAAABM3MxcVByM1MzUjFSM3FTM1DwEVFzM3NScHNTMVBzMVI3EJlgkJLyaEEhKE6wkJlgoKjIODg4MBEAkJgwoTSxM5ExNeCoMJCYMKJhMTEksAAAAABQAAAAABBwEHAAwAFQAnACsANAAAJSMVJiMiBhQWPgE9AQcyFhQGIiY+ATcPARUmIw4BFBYyNj0BNxUzNQcVBzUHMhYUBiImNDYBBxMNDxQbGycbLgsRERcRARAxlgkNDxQbGycbhBMTgy8LEREXEBCpLwkbJxwBGxNVOBEXEREXEZUJCY0KARsnGxsUcQgSVAolCSaNERcQEBcRAAAAAAMAAAAAARkBFwAJABEAHQAANzM3FxUHJyMnNR8BNQ8BIxUzNxcHFwcnByc3JzcXHDRJEBBJNAlIOzsHLi63DSAgDSEgDSAgDSDOSAb0BkgJXlg7xzsCS0kNICENICANISANIAADAAAAAAEsARoAEAATAB8AABMfARUjNSM1IxUzFSMnNTczBxUzFyM1IzUzNTMVMxUjskACE0teS1QJCX4ENhUTODgTODgBF0EIJRNLzxIJ4QkSOc44Ezg4EwAAAAMAAAAAASwBGgASABwAKAAAASMvASMHFRczNSM1Mz8BMwczNQcjDwEjNTMfATMHIzUjNTM1MxUzFSMBEH8QB14JCWdeVQYQdwETE3oGEFBQEAd6ExM4OBM4OAEHDwMJzgoTcQIQJVQcAxA4EAL0OBM4OBMAAQAAAAAA9ADFABEAADcVFAYrATcnBxUXNyczMjY9AeEFBIEeDTAwDR6BCxHFJQQGHw0wCjANHxAMJQAABAAAAAABGgDSAAgADwAWACgAADc2HgEOAS4BNhcuAQ4BFh8BHgE+ASYnNxUUBisBNycHFRc3JzMyNj0BLBMuGgknLhoJRgkUEgoBBQ0JFBIKAQWcBgRNHg0wMA0eTQwQxQ0JJy4aCScuAgUBChIUCQ0FAQoSFAklJQQFHg4wCy8NHhAMJQAAAAUAAAAAARoBBwAHAAsADwATABcAABMzFxUHIyc1FxUzNQczFSMXIxUzBzMVIxz0CQn0CRPhvJaWcXFxcUtLAQcKuwoKuwmpqSYSExMTEgAAFwAAAAABLAEsAAMABwALAA8AEwAXABsAHwAjACcAKwAvADMANwA7AD8AQwBLAE8AUwBXAFsAXwAANyM1MxUjNTMVIzUzFSM1MxUjNTMdASM1FzMVIzczFSMDIzUzFyM1OwIVIzMjNTMXIzUzFyM1MxU1Mx0BIzUzKwE1Mxc3MxcVByMnNxUzNRczFSMVMxUjFTMVIyczFSMTExMTExMTExMTExMTExMlExMlExMlEhITExM4EhImExMlEhITExPOExNLE4MTE4MTE4MlExMTExMTll5ezhM4EzkTOBM5EyUTExMTExMBGRMTExMTExMTEyUSEiYTE0sSEqkTE6mpqRMmEiYTJYMTAAAAAAcAAAAAARoBGgAHAAsAEwAXABsAHwAjAAATNzMXFQcjJzcVMzUHNzMXFQcjJzcVMzUXIxUzBzMVIxcjFTMmEqkTE6kSEqmWE14SEl4TE15dEhISEhISEhIBBxIS4RMT4eHhJhMTExISExMTEyUTJRMmAAAABAAAAAABGgD6ACUAQABJAFIAACU2NzYnIyYHBgcGByYiByYnJgcxBhcWFwYVFBcWFxYyNzY3NjU0ByInJicmNTQ3NjcyFxYyNzYzFhcWFRQHBgcGJyIGFBYyNjQmMyIGFBYyNjQmAQQDAQEHBAQGCAkMDhJCEhkSCQUHAQEDFREPHxpTGx8PEYMhEBgMDREIDwoWERISFQoPCBENDBgQSggMDBAMDEoIDAwQDAzCCAoSEgECAQUFCQUFEAQCARISCggXICkYFQoICAoVGCkgeAMECwwZEw8IAgEBAQECCA8TGA0LBANSERgRERgRERgRERgRAAQAAAAAAS0BGgAMABAAIgAuAAATMxcVJic1IxUHIyc1FzM1IxciByMOARcHFzceAT4CLgIHBi4BPgIeAg4BOM8SCQpdFVwSEl5ewwwKAREJCywNLAkXFQ8HBA0VCAoPBwQMEBAJAQYMARkSZAQCXswVEs/Pz3EHCicRLA0sBgMIEBUWEgpLAQsPEQwDBg0PDggAAAAKAAAAAAEaARwACwAXACQALQBIAGIAdwCSAJ4ApwAANw4BLgI2NzYeAQYnLgEOAhYXFj4BJjc2FhceAQ4CJicmNhcWMjY0JiIGFAczFSMiJj0BIiY9ATQ2OwEGByMiBh0BMxUUFjcmKwEiBh0BFBYzFQYXFhczPgE9ATI2PQE0ByMVFAYrASImPQEjNSY2OwEyHgEVFyM1MzI2PQEzNTQmKwEmJzMyFh0BFAYjFRQGJyIOAR4CPgE1NCYHIiY0NjIWFAarCRQSCwIKCA0eEgYYBAoJBgEFBQYPCAMrCRQHBQQDCQ4RBgkCFAMIBQUIBZwiIgkOBwsTDiIHAxgGCRMCiwoOLg4TCwgBBwUHJggLBwsSEwICHgICEgEJBi4FBwM0IiIBAxMJBhgDByIOEwsHDq4JDgYDDBEQCRAMBAUFCAUF1QYCCREUEgYIBhkfJgMBBAkKCQMEBAwPBAUCBwUNDgsGAwYKGhYDBQgGBgilEw0KIgwIKQ0UCAsJBSo1AgJ6ChQOOwgMLAkHBQECDAgsDAg8DUo/AQICAT89BQkFBwJ2EwICNSoFCQsIFA0pCAwiCg3ZChARDAMGDwgMESYFCAYGCAUAAAAFAAAAAAEHASwAFQAZAB0AIQAlAAATFRcVByMnNTc1MxUzNTMVMzUzFTM1AzM1IxczFSMXIxUzBzMVI/QTE7wSEhMmEiYTJam8vCZwcHBwcHBwcAEsExL0ExP0EhMTExMTExP+5/QmEzgTOBMAAAAABAAAAAABGgD0AAoAEAAUABwAADcfARUPAS8BNT8BFwcfAT8BBxc1JxcVNzUHFQc1oWwMB3NzBgtrBEsKQDkRsV5ecV4mE/QdCX4JICAJfgkdExMDEQ8FdxpsGRlsGmsKMAUwAAMAAAAAARIBGgAjAC0AQgAAJSc1JzU0JyYnJiMiBh0BBwYUHwEWFxY3Nj8BBxQeAjI+AicmPgIeAR0BBxcOASYvASY0PwEVBhQeAT4BJic1FwERFlwCBAsGBQwQOQkJRAQFCwoFBF0NAQYHCggGApYBAQMEBgQSEwEFBgFEAwNSBQYKCQQDBEhPOgFcFwYFCwQCEAw9OAgXCUQEAgQEAgRdKgQJBwQEBwizAgQDAQEFBBcTqgICAgJEAggDUTUECwkDBQkKAzVJAAAAAAIAAAAAARoBGgAMABMAADcyPgE0LgEiDgEUHgE3Iyc3FzcXliQ8IyM8SDwjIzwRDSsNJE8NEyM8SDwjIzxIPCNNKw0kTw0AAAMAAAAAARYBGwAGABwALwAANzM3JwcnBzceARcWFRQHDgEHBicuAzc2Nz4BFzY3Nic0JicmJyYGBw4BFhceAXYNVQ1PJA1WFikQJh4PJhYwJxQeEAMHDyYSKyEmGRkCEQ8dJhMmDyAXISIQJmBWDU8kDY4BFBApNysnEhcECRYLIiouFS4ZDAz0CR8iJRcqEB0DAQkLGE5IEwoGAAUAAAAAAQcA/gADAAwAFQAeACcAAD8BFwc3IiY0NjIWFAYHMjY0JiIGFBYXIiY+ATIWFAYHMjY0JiIGFBZElg6WAgsRERcREQwUGxsnGxuXDBEBEBcREQsTHBwnGxs+vAy8gBEXEBAXERMcJxsbJxxdEBcRERcQExsnHBwnGwAABAAAAAABGgEbAAsAFwAjAEUAADcjFSMVMxUzNTM1IycuAQ4CFhcWPgEmJz4BHgIGBwYuATYXMzIWHQEjNTQmKwEiBh0BMxUUFjsBFSMiJjc1IiY3NTQ29BMlJRMlJVQECgkFAQQFBg8JAyYJFBILAgoIDR4RBgouDhMSCQYuBgkTAgIPDwkOAQkLARNxJhMlJRO4AwEFCAoJAwQDDQ8UBgEJERQSBQkHGR5FEw4ODgYICAYzPwECEw0JLAwIMg4TAAAAAAQAAAAAAM8BGgAIABEAKQA9AAATMhYUBiImNDY3IgYeATI2NCYXIyIGHQEGFjMVBhY7ATI2PQEyNic1NCYHNSY2OwEyFgcVIxUUBisBIiY9AZYICwsQCwsIEBYBFSAWFgcuDhMBCwkBDgkeCg0ICwETSgEJBi4GCQESAgIeAgIBBwsQCwsQCxIWHxYWHxZUEw4yCAwsCQ0NCisMCDIOE1QzBggIBjM/AQICAT8AAAAAAQAAAAABLAEHAC0AABMHFTM1MxUXMzc1MxUXMzc1MxUXMzc1MxUjNSMVIzUjFSM1IxUjNSMVFyE3NScTExMlChIKJQoSCiUKEgolOBMvEi8TOBMTAQYTEwEHE3FxZwoKZ2cKCmdnCgpnvDk5OTk5OUtLEhK8EwAABAAAAAABGgEaAAUADgAbAC0AADczLgEnFTceARcWFSM1MgcXMw4BIyIuATU0NjcXMj4BNzY1IzUiBw4CFxQeAbxJBigcASMzBgFwCS8TXAczIhksGSsgExswIAQCcQkKGisZAR4zvBsoBklcBjMjCglwgxMgKxksGSIzB8wYKxoKCXECBCAwGx8zHgACAAAAAAEHAOEAHAA3AAAlFSMiJicjDgMrATUjJzczNTMyFhcWFzM+ATMHBgcGDwEjJyYnLgEnFT4BNzY/ATMXFh8BFhcBBwYLEwc2BAwPEgoJPBMTPAkKEQgQCDYHEwsJAwMFAwRNAgQJBA8GBg8ECQQCTQQBAgUCBM6DCgkJDgoFSwoJSwUFChIJChQBAgMGBQYMCAMHAYMBBwQICwcGAwIEAgEAAAACAAAAAAEtAQcANgBQAAATMxUUBgcVHgEXBgcxJi8BNTc2PwE2NyMWFxYfARUHBgcOAQczBgcjFQcnNSM1NDY3Njc1LgE1Fz4CFx4BFxYUBw4BBwYiJy4BJyY2NzY3NkuDCQoJDQQJCAkMBgUDAgQCAVsCAQQFBgcLCAQHAV4FBAoJCksGBAoSCQqMBw4PCA4VBAICBBUOCA8HDhYEAgEBBQwEAQcGCxMHNgQLBgMFCgQCTQQBAgUDAwQCBQMETQIECQQPBgcIPBMTPAkKEQgQCDYHEwuYBAMBAwMVDwcPCA4VBAICBBUOCA8HEAsEAAACAAAAAADhAQcAHAA3AAATMxUUBgcVHgMdASMVByc1IzU0Njc2NzUuATUXFhcWHwEVBwYHDgEHMy4BJyYvATU3Nj8BNjdLgwkKCQ4KBUsJCksGBAoSCQoUAgEEBQYHCwgEBwGDAQYECAwGBQMCBAIBAQcGCxMHNgQMDxIKCTwTEzwJChEIEAg2BxMLCQQCBQMETQIECQQPBgYPBAkEAk0EAQIFAwMAAAAEAAAAAAEWARsAFQAoAC4AMQAAEx4BFxYVFAcOAQcGJy4DNzY3PgEXNjc2JzQmJyYnJgYHDgEWFx4BJzcXFQcnNxU3oRYpECYeDyYWMCcUHhADBw8mEishJhkZAhEPHSYTJg8gFyEiECYnDlRUDhI6ARkBFBApNysnEhcECRYLIiouFS4ZDAz0CR8iJRcqEB0DAQkLGE5IEwoGqwg4EDgIX04nAAIAAAAAAPABBwAFAAgAABMHFRc3NQc1F0cPD6mljwEHCOEIcBBnvl8AAAAAAgAAAAAA4gEaABUAHwAAEyMVIwcVFBYXFTM1PgE9AScjNSMVIxcOAS4BPQEzFRSDEh0JJR0SHSUJHBMmOwwiHxNwARk4CUIcKwM5OQMrHEIJODhzDAYNHBE4OBcAAAAABQAAAAABDQDvAAcADwAfACcALwAANyMnIwcjNzMXJyYnMQYPARc1MzIWFRQGBxUeARUUBiMnFTMyNjU0IwcVMzI2NTQjoBMPPg4TOBEQFwEBAQIWbikTFg4LDhIbFBkRDhAcExcPECNeKCiQWT4DBwcDPjeQEg8MEgQBARMPEheBLw4MFT40DgwaAAAIAAAAAAEaAQcABwALAA8AEwAXABsAHwAjAAATMxcVByMnNRczNSMXIxUzJyM1MwczNSMXMxUjJyMVMwczFSMm4RIS4RMT4eHOvLwTlpY4S0sTJSU5S0tLS0sBBxO8EhK8vLwTOBMSg0sTJTgTJRMAAgAAAAAA6wDrAAcACwAAPwEzFxUHIyc3FTM1QgmWCQmWCRKE4QkJlgkJjYSEAAAABQAAAAABGgEaAAcACwAPABMAFwAAEzMXFQcjJzUXMzUjFzMVIzcjFTM3MxUjHPQJCfQJE+HhEiYmcSYmJSYmARkJ9AkJ9OrhE7y8cXGWAAABAAAAAAEaAPQAEgAANycjBycjByMVMz8BFzM3HwEzNd0hEyMWEhY1PAoNFhMjGwlDg3F9XVESBzJfhFgGEgAABAAAAAABBwEaAAwAGQA8AEAAABMiDgEUHgEyPgE0LgEHIi4BPgIyHgEUDgE3LgEiDgIHMzQ+ATIeAhQGDwEOARcVMzU0Nj8BPgI0JgczFSONITghIThCOCEhOCEcMBwBGzA4LxwcLwEFDxEPCgQBFwUHBgUEAgQDDgMEARYEAwcEBgQELhUVARkhOEI4ICA4Qjgh4RwvODAcHDA4LxyeBQYGCw0HBQcDAQMFCAkEEAQJBQwJBAgECAQKCw0MXhYAAgAAAAABCgENABAAIgAANw4BFTIzMhYUBiMiJjU0NjcXDgEVMjMyFhQGIyImNTQ2NxeGIyADBRMcGhUbHS8vmSQgAwUTHBoVGx0wLhbqFjMkGCsbKiY1ThsjFjMkGCsbKiY1ThsjAAAIAAAAAAEZARoADAAZACUAMQBDAE4AUgBWAAA3NDY3Jw4BFBYXNy4BNxQWFzcuATQ2NycOARcnPgE0Jic3HgEUBjcHHgEUBgcXPgE0JgcWDwEXBycjByc3LgE+Ah4BBw4CHgEyNjQuARcjBzMXJyMHOBAPDhETExEODxAUDQwNCQoKCQ0MDZAOCgoKCg4LDQ0ODQ4QEA4NERMTSwEFBUARDmgPEUAFBAcNDw0JHgIEAQIFBgYEBQIFESYZETYQwxUmDg0RLDEsEQ0OJhQQHwwNCRgaGAkODB9NDgkYGhgJDQwfIR+GDQ4mKSYODREsMSxCCggEkQghIQiRBhAQCQEGDAEBBAUFAwUHBAInJDglJQAAAAAFAAAAAAEaAQsAFQAeACoAMwA/AAA3FAczNi4BDgIeATc1Bi4BPgIeAQcyNjQmIgYUFhcyNxcOASImJzceATcyNjQmIgYUFhczFTMVIxUjNSM1M+EBEwMgO0AuDBw5IBouGAYjMzEeeggLCxALCy4UDg0JGRsZCQ0HEi8ICwsQCws3EyUlEyUlnwQFIDkcDC5AOyADEwMYLzQnDRMrEQsPCwsPCy8ODQkLCwoNBwgvCw8LCw8LOCYTJSUTAA4AAAAAARoA9AAPABMAFwAbAB8AIwAnACsALwAzADcAOwA/AEMAACUjIgYdARQWOwEyNj0BNCYHIzUzByMVMwcjFTM3MxUjFyMVMyczFSM3IxUzJzMVIxUjFTMHMxUjNTMVIzcjFTMHMxUjAQfPCAoKCM8HCwsHz885EhISExMlExMTExODXV2DJiZeExMTE0sTExMTOBISOCYm9AsIgwgLCwiDCAuWgxMSExM4EjkSEhI4EzgSExMTEl0SEhITEwAAAAADAAAAAADiAOEACAAVAB4AADcyNjQmIgYUFjcUDgEiLgE0PgEyHgEHNCYiBhQWMjaWCAsLEAsLUxQjKCMUFCMoIxQTIS4hIS4hgwsQCwsQCxMUIxQUIygjFBQjFBchIS4hIQAAAwAAAAABFgEbAAgAHgAxAAA3MjY0JiIGHgE3HgEXFhUUBw4BBwYnLgM3Njc+ARc2NzYnNCYnJicmBgcOARYXHgGWEBYWIBYBFRsWKRAmHg8mFjAnFB4QAwcPJhIrISYZGQIRDx0mEyYPIBchIhAmcRUgFhYgFagBFBApNysnEhcECRYLIiouFS4ZDAz0CR8iJRcqEB0DAQkLGE5IEwoGAAEAAAAAAOsBCgAZAAATFQcjNTMnLgEOAhYfAQcnLgE+AhYfATXqCUIwEg0iIxkKCg1hDWIQDAwhLCwRDQEHQgkSEg0JCRkjIwxiDWERLCwhCwsRDScAAAAKAAAAAAEqASwAFQAdACEALgAyADYAOgA+AEIARwAANwcnNyMiBhQWOwEVIy4BNDY3Myc3FxMjJzU3MxcVJzM1IzczFxUHIzUzNSMVIzUXIxUzBzMVIxcjFTM3MxUjFyMVMycxMxUjiysOGjwNERENCwsUHBwUPBoOK0V4Cgp4CnhkZEZ4CgoyKGQUFDw8PDw8PDw8FDw8PBQUKioW8ysOGhEZEhQBHSgdARoOK/7/CqAKCqAKjHgKoAoUjDxGghQUFBQUyBQ8FDwUAAABAAAAAAEJAQcAHQAANyM1MxcVIzUOAR4BPgImJzceAg4DLgI+AVgyQQoTGhEaOUArBSQfBRklEgQaKzMxJRIEGvQTCkElEz88HwswQTUKEggjMDMsHQcQIzAzLAAAAAACAAAAAAEIAQcAEQAVAAATMxU3FwcXBycVIzUHJzcnNxcHMxUjvBIwCTAwCTASMAkwMAkwlktLAQc7HRAdHhAdOjodEB4dEB1bSwAABQAAAAABLQESABIAHwAsADIAOAAAEzMXFSYnNSMVMxQXIzUzNSMnNRciDgEUHgEyPgE0LgEHIi4BND4BMh4BFA4BNyc3FwcXJxcHFzcnEf4JCQrqYRROOmsK1xUkFRUkKiQVFSQVEBsQEBsgGw8PGxAaGgkTE0sSEggbGwERCWwHBVawIBoTFAnEbBUkKiQVFSQqJBWIDxsgGxAQGyAbDycbGwkSExESEwgbGwAAAAACAAAAAADyARoABgANAAA3JzcnBxUXJxcHFzc1J/JLSwxQUK5NTQxSUnlKSwtQDFBWTUwMUwtSAAEAAAAAARoAqQADAAAlITUhARn++gEGlhMAAAALAAAAAAEaARoACwAVACYAOgBEAFgAYQBzAHsAfwCGAAA3NjIWFAYiJwcjNTMVFBYyNjQmIgYVByc3FzU0NjsBFSMiBh0BNxc3MzU0IyIGBxU2Mg8BBhUUFjMyPwEVFAYiJjU0PwEHIzUGIyImNTQ/ATQiBzU+ATcyFQc1BwYVFBYyNhcyNzUGIiY0NjIXNSYnIgYUFic3MxcVByMnNxUzNSc3MxcVBzXaBA4ICQ4DAQsLBAcEAwcFjCcMEw8LLCwEBRIMOw0SBAkDBw8BCw4HBggEAQUGAwYHLAwECAYHDgsOBwMJBBEMBwYDBgQ3CQUFDAcICwQDCAwODX0SqRMTqRISqXAShBIS+gkOGA8HBko0BAcIDgcIBU4oDBMdChARBgMdEgwNIBcDAgwFCQEDEAcJCRIEBAcEAgcBAa8HCQkHEAMBCQUMAgIBFwsEAQEHAgQGEgMOBAgOCQQOAgEQGg9LExNdExNdXV0mExNeE3EAAAAGAAAAAADiARoAEAAdACcAOgBCAEYAADcXNycHNTQ2OwE1IyIGHQEnFzMWPgE0JiIHJyMVMz0BNDYyFhQGIiYHBiMiJjUmNjMyFxUmIgYUFjI3JwcVFzM3NScHMxUjPCspDRMGAx0cDBAUbwEFFQ0LFgYBEBAGCwYGCwYQBw4QEwEWEQwGBxELChEIXhMTgxMTg4OD5isqDRMeBAYSEAweFC8JARIeEQsnXBsHBwgJEQoJlgUUEBIVAxMFCxMLBVsTcBMTcBMTcAAAAAABAAAAAAEHAQQAFQAAEwcVFzcnMzIWFxYdATM1NC4CKwE3dktLDj0kJzQQHhMRJjwpIjsBBEwNSw08EBAfRwYGJzkmEzoAAAAJAAAAAAEaARoAKAAsADAANAA7AEsAUwBXAFsAADcjNTM1IyIOAh0BBhYXFhczNSMiJyYnND0BNDU2NzY7ARUjFTM3NSMnIxUzBzMVIxUzFSMXIzUzFSMnNzMXFQcjFSM1IyImPQE0NhczNSMiBh4BOwE1IyczNSP0qUtQBg0JBAELCgYGBQUDAgYCAgYCA65LVAoTgxMTExMTExMFBTgFF0JUCQkvExIICwsRCQkEBgEFICYmEzk5cZYSBQoMBrIKEAQCARMBAwUDAgoCAwUDASYTClRxExMSExODODgc6glxCRMTCwheBwtwEwYIBRMSOQAABwAAAAABGgEsAA8AHwAvAD8ARwBXAGAAADcxMhYVMRQGIzEiJjUxNDYXMTIWFTEUBiMxIiY1MTQ2NzEyFhUxFAYjMSImNTE0NjcxMhYVMRQGIzEiJjUxNDYHMzcXByMnNxcjFTMeATI2NzM1Iy4BIgYXFAYiLgE+ARafBAYGBAQFBQQEBgYEBAUFBAQGBgQEBQUEBAYGBAQFBQUTRA1UDVUODDg4BCUxJQM5OQMlMSVsGycbARwnG+EFBAQGBgQEBSUGBAQFBQQEBksGBAQFBQQEBiUFBAQGBgQEBXlFDlRUDq0TGCAgGBMYICAhFBsbJxsBHAAAAAAEAAAAAAEaARoACQATACMALAAANxUzNRc3JyMHFzcVMzUXNycjBx8BIxUzHgEyNjczNSMuASIGFxQGIi4BPgEWlhNEDVQNVQ5EE0QNVA1VDgw4OAQlMSUDOTkDJTElbBsnGwEcJxv8EhJEDVRUDQwuLkUOVFQONBMYICAYExggICEUGxsnGwEcAAAAAAQAAAAAAQcBCAAvADgAQQBKAAAlNC4BDgEWFxUUDwEnJj0BPgEuASIOARYXFRQWHwEVDgEeATI+ASYnNTc+AT0BPgEnNDYyFhQGIiYXFAYiJjQ2MhY3IiY0NjIWFAYBBxQeFwQQDgU0NAUOEAQVHBUEEA4IBzMOEAQVHRUDEA0yCAgMD7sLEAoKEAtnCxALCxALLwgLCxALC+EPFQMTHBkDFAYDGhoDBhQDGBwSEhwYAxQIDgMbGAQXHBMTHBcEGBoEDggUAxQNCAsLEAsLoQgKChALC44LEAsLEAsAAAAAAwAAAAABGgEsAA8AGAAiAAA3IxUzHgEyNjczNSMuASIGFxQGIi4BPgEWJzUzFTcXByMnN144OAQlMSUDOTkDJTElbBsnGwEcJxs4E0QNVA1VDksTGCAgGBMYICAhFBsbJxsBHF55eUUOVFQOAAAAAAMAAAAAARoBGgAJABkAIgAANxUzNRc3JyMHHwEjFTMeATI2NzM1Iy4BIgYXFAYiLgE+ARaWE0QNVA1VDgw4OAQlMSUDOTkDJTElbBsnGwEcJxv8ZmZEDVRUDW0TGCAgGBMYICAhFBsbJxsBHAAAAAAGAAAAAAEHARoAJgAqAC4AMgA2AD0AACU1JyMiBwYHBgcVFBcWFxY7ATUjIicmJyY9ATQ3Njc2OwEVIxUzNyc1MxUnMxUjFTMVIxcjFTMXByM1MxUjAQcKtwYGDQUCAQMFDQYGBQUDAgYCAQECBgIDrktUCryplhMTExMTExMJFwU4BXGfCQIGDQYGsgYGDQUCEgEDBQMCCgIDBQMBJhIJQpaWgxMTEhMTZxw4OAAAAAQAAAAAARoBGgALABQAGAAcAAATMxcVByMHJzUjJzUXMzUjFTMXFT8BMxUjFTM1Ixz0CQl/NhAvCXp64S4KKAcSEhISARkJvAk2By8JvLKpqQohKJleJRIAAAAABAAAAAABBwEaAAkADgAaAB4AABMfARUHIyc1NzMHMzUnIxcjFTMVMzUzNSM1IwczFSPJOAUSqRMTcHCpOXBLJSUTJSUTJV1dARQ4DqgTE+ES86g5SxMmJhMlgxMAAAAABwAAAAABGgEsAAgAEQAaACMAMABWAGYAADcUBiImNDYyFgcUFjI2NCYiBhcUFjI2NCYiBhcUBiImNDYyFgc2NxcOASImJzceAT8BFAYHFTMyFh0BFxUHFRQGKwEiJj0BJzU3NTQ2OwE1LgE1NDYyFgciBh0BFBY7AT4BPQE0JiOWFh8WFh8WOAsPCwsPCzgWHxYWHxY4Cw8LCw8LLg4LDQkZHBkKDQkYDRIKCS8YIBMSIRhwGCATEyAYLwkKEBgQVBAWFhBwEBYWEJYQFRUgFRUQCAsLEAsLCBAVFSAVFRAICwsQCwtFAwsNCgoKCg0JBwK3CQ8DASEXExMlExMXISEXExMlExMXIQEDDwkMEBA7Fg9xEBYBFRBxDxYAAAAABgAAAAABGgEaABEAFgAbACgALgA3AAABIgcGByMHFR8CMzc1Njc2NQczBgcnFyc2NxUvATY3Njc2NwYHBgcGBzUjNSMVNzYuAQ4BHgE2ARAvLiUkTgkDcAc4CSETF/MxFxMHagcbF0BAEBUjJDAvAx4XJBdIJRO3BgUTFw0FExcBGRcTIQk4B3ECCU4kJS4vVBgbB2oHExcxFUAYFyQXHgMvMCQjFTgTJTiQCRcNBRMXDQUABAAAAAABJQEHAB4AKAA1AD4AADc1NzMfATMXFTMXDwEjNjczNyMmJz8BMzUjLwEjFQYXFAYiJjQ2MhYVMxQOASIuATQ+ATIeAQcyNjQmIgYUFhMJXgYRbAoVCTIJRgcFMy1sBggDBlVnBxBQClURFxERFxAmEh4jHxERHyMeEkIUGxsnGxu3RgoDEAouDIQGCApxBwYDAyUDEDEFVwwQEBgQEAwSHhERHiQeEhIeQRwnGxsnHAAAAAQAAAAAARoBBwAcACYAMwA8AAA3MxcVByM2NzM3IxUmJz8BMzcjLwEjFQYHNTczFwcUBiImNDYyFhUzFA4BIi4BND4BMh4BBzI2NCYiBhQWkX8JCWwHBVYBdwgJBwZ6AXoHEFAKCQleBxARFxERFxAmEh4jHxERHyMeEkIUGxsnGxv0CrsJCAqEAQYEBgMTAxAxBQdGCgOdDBAQGBAQDBIeEREeJB4SEh5BHCcbGyccAAAAAAMAAAAAAPQA9AAEAA4AGAAANyM1MhYnFTIeARUzNC4BBxUyHgEVMzQuAV4mEBYmLk4tEzNWMxorGRMfMzgmFqwTLU4uM1YzSxMZKxofMx8AAwAAAAABGgD0AAkADgASAAA3FzM3NS8BIw8BFyc3MxcnMxcHE3wOfD4HfAc+g281dDVvMiJUpXx8Dj4DAz52bzU1IiJTAAAAAwAAAAABIAEaAAUACAASAAATBxUXNzUHNR8BMxcHJxUjNQcnIQ4OqaSOMA0vDR8THw0BGQjhB3AQZ75fCy8NH2ZmHw0AAAAABQAAAAABFwD4AAYAEAAgADIAOQAAPwE1JxUXByc3FxUHNTcnFSMXJg4BHgE2NzE2NTQnMS4BBzYXMRYXHgEVMRYOAS4BNzE2FwcjJzcXN593moZjag6fQy6GEiEYJg4RKS4QDxMIFS0NExENBggBFiMeDwYFSiMNEQwMHS9QDmcVWUKsB2oOLRUfWUAOARktLBcIExQWGxUIChgKAQINBhMLEB0IEiASERMjEQ0MHQADAAAAAAEWAQcABQAIAA8AABMHFRc3NQc1Fwc3NScVFwc0Dg6ppY9WpKSOjgEHCOEIcBBnvl91bRBuF19fAAAAAwAAAAABIAEaAAUACAASAAATBxUXNzUHNR8BIyc3FzUzFTcXIg8PqaWOPQ0vDR8THw0BGQjhB3AQZ75fji8NH2ZmHw4AAAAABAAAAAABFgEHAAkAHAAuADUAAD8BFxUHNTcnFSMHJgYHBhYXHgE2NzE2NTQnNS4BBzYXMRYXHgEVMRYOAS4BNzE2FwcjJzcXN14OqWxWjhMDGSgIBAIECSsxERAUCRYwDhQSDgcIARgkIBAGBU8lDhINDB//CHEQSBc5X0QPARoZDBgMFhkKExUXHhUBCAsZCgECDQgUCxEfCBMhExMVJRMNDB8AAAAABAAAAAABFgEHAAkAHAAuADoAAD8BFxUHNTcnFSMHJgYHBhYXHgE2NzE2NTQnNS4BBzYXMRYXHgEVMRYOAS4BNzE2FycHFwcXNxc3JzcnXg6pbFaOEwMZKAgEAgQJKzEREBQJFjAOFBIOBwgBGCQgEAYFLBYMFxcMFhcMFxcM/whxEEgXOV9EDwEaGQwYDBYZChMVFx4VAQgLGQoBAg0IFAsRHwgTIRMTFxcMGBcMFxcMFxgMAAAAAAQAAAAAARoBGgAPABgAHAAmAAAlLwEjBxUjBxUXMzc1Mzc1ByM1MxUzNTMXBzUzFRcjNS8CIzUzFwEWHAagCS8JCbwJLwlLqBJxDxZdJXEmAxwGXpIX+hwDCS8JvAkJLwmgzqg5ORYPJSVLXgYcAyYXAAAABQAAAAABGgEZABQAGAAgACMAJwAAEx8BFSMHNScjFSM1IxUzByMnNTczBzM1Ix8BFQ8BJz8BDwE/ARc3J88fBgoJHwZxJTgKLhMTnD8mJnoccjkMHHJnChMDD2EPARMfDgYJDyBLS7wSErwTSzk5HA1yHA04cocTCR0PYQ4AAAADAAAAAAEaARoACQASABYAABMfARUHIyc1NzMHFTM1JyMVIzUzFTM1+hwDCfQJCdjO4Rcig0smARcdBtgJCfQJEuHKF0tLOTkAAAAABgAAAAABGgEHAAMABwAOABUAHAAjAAA3MzUjFzMVIycjNTczFSM3FSM1IzUzBzMVByM1MyMzFSMnNTM4vLwmcHA4EwlCOPMSOUIJEglCOeE4QgkTS5YlS0tBChMJQTgTlkIJEhIJQgAGAAAAAAEaARoABgANABQAGwAjACcAADcjNTM1MxU3NSMVFzM1BxUzNTM1KwEVMxUzNSc3ByMnNTczFwcjFTNCLyUTqRMJLzgTJS/XJRMJnwmECQmECSVLS+ETJS8KJS8JE7IvJRMTJS8JHAkJXgkJHCYAAAMAAP//ASwBEAASAB8ALwAAEyIOARUUFhcHFzcWMzI+ATQuAQc0PgEyHgEUDgEiLgEXByMnNxc3Mxc3MxcVJwcjlhcnFgwLRQ1GFRoXJxYWJ1kSHiQeEhIeJB4SVSgOHA0WKA0pKA0fJSkNARAXJxYRHgxFDUYOFyctJxdUER4SEh4jHhISHoIoHA0VKCgoHxolKAAEAAAAAAEbAR8AHAApADIAOgAANw4BFxYXBhcVJwcnNy4BPgEeARUUByYnNTQuAQYXPgEeAg4CLgI2FxY3FjcnBhUUNxc2JzYmIyJsEwkLCA8CAQlHDkcXBSRBQikBCAkdLzInECkkFgMSIigkFgIREhEXEg9PChhOCwEBIRgS7hM1GBIMCQkDBkUNRRlFOhkTNyMHCAcGAhoqFApkCwMSISgkFwIRIigkWxEBAQtODhIYRk8PEhchAAAAAAIAAAAAASwBLQAPAB0AABMiDgEWFwcXNx4BPgEuASMVIi4BND4BMh4BFA4BI78fMxkJFGQOZBtDOBYUNyEXJxcXJy4mFxcmFwEsITg8FnMMchUCJkBBKLsWJy4nFhYnLicXAAACAAAAAAEaARAABgANAAATNxcVByc3Fwc3Jx8BFRMO+PgOHRQY0dEYZQEICHARcAhvCVdiX1YCEgAAAAAGAAAAAAEcARoAAwAHAAsAHQAhACkAADczFSMVMxUjFTMVIxchNzM1ND4COwEyHgIdATMHMzUjFycjFSM1IwdxS0tLS0tLq/70GCMDBQcEcAQHBQMjpnBwpg4VlhUO9BNeEhMTS16pAwcFAwMFBwSoJs/0OCUlOAAGAAAAAAEaAQcADAAQAC4ANwBVAF4AABMzFxUjNSMVMxUjJzUXMzUjFzUmJwcnNyY3JzcXNjc1MxUWFzcXBxYHFwcnBgcVJxQWMjY0JiIGFzUmJwcnNyY3JzcXNjc1MxUWFzcXBxYHFwcnBgcVJxQWMjY0JiIGHPQJEuGDjQkT4eFdBQQRChIBARIKEQUEEwUEEgkSAQESCRIEBRcICwkJCwllBQQSCREBAREJEgQFEgUEEgkRAQERCRIEBRcIDAgIDAgBBwp6OYQSCc4vJqkVAQMKEQoFBQoQCgQBFRUBBAoQCgUFChELBAEVLwYICAwICG0UAgMKEAsFBQoQCgMCFRUCAwoQCgUFCxAKAwIULwYJCQsJCQAABgAAAAABBwEaAAcAGwAjADcAPwBTAAA3JzU3MxcVBycjFSM1IxUjNSMVIzUjFTM1IxUjByc1NzMXFQcnIxUjNSMVMzUjFSM1IxUjNSMVIxc3NScjBxUXNzUzFTM1MxUzNTMVMzUzFTM1MxUvCQnOCgpBExMTEhMTE7wmEo0JCc4KCowTExO8JhITExMSjAoKzgkJCRMTExITExMSJs4KOAkJOAo5ExMTExMTJiYTgwk4Cgo4CTgTEyYmExMTExODCTgKCjgJEyUTExMTExMTEyUAAAAEAAAAAAEsASwAFwA3AEMATgAANxcVBxcHJwcjJwcnNyc1Nyc3FzczFzcXBzc1LwE3JwcvASMPAScHFw8BFR8BBxc3HwEzPwEXNy8BNjMyFhUUDgEuATYXFjMyNjQuAQ4BFvg0NB4rLAs8CywqHTQ0HSosCzwLLCsxMjIHHBErEQoZChArEh0HMjIHHRIrEAoZChErERxgCw0SGRQeGwsIGQYGCQwJDw4GBb8LPAssKh00NB4rLAs8CywrHjQ0HitsChkLECsSHQcyMgcdEisQCxkKECsSHQcyMgcdEitLBxkSDxgGDh0dLQMMEQsDBw4PAAAABAAAAAABBwD+ABkAIwA8AEYAADcyFhczMhYUBgcjDgEiJicjIiY+ATczPgEzFyIGFBYyNjQmIzcyFhczMhYUBgcjDgEiJicjIiY0NjczPgEXIgYUFjI2NCYjcQwVA2gEBgUDagMVGRUDHQQGAQQDHwMVDAEICwsPCwsITAwVAx0EBgUDHwMVGRUDaAQFBANqAxUNCAsLDwsLCHoQDAYHBQEMEBAMBQgFAQwQEwsPCwsPC5YQDAUIBQEMEBAMBgcFAQwQEwsPCwsPCwAABQAAAAABGQEaAAwAJQA9AEAAQgAANyMHFRczNzUjFSM1MxcjNTQ2NzU0NjIfARUHBiImPQEGBwYPASM3Ig4BDwEzNjc2NzYzFxQWMj8BJy4BBhUHMjAjMV5CCQnOChO7OBMTKiEPFQdFRQcVDxUKBAIBE0wUIRUBAQQFCg8XCQkBAwYCREQCBgM5AQHhCbwJCTgvqXAvITQGGAoPCEkZSQgPChQFEQcKBnoTIBMhDwsPBAEoAwMCSUgCAQQDogAAAwAAAAABGgEcACQARQBRAAA3LgU3NTcyPgI3Njc2FxYXFhceAzMXFRQOBAcnFRQeAx8BNjc+BD0BIyYnJi8BJicmBw4DBxc+AS4BIg4BFhcHM5sPHBoWEQoBCQoQEQ8HCwwSEwwLBgUIDxEQCgkJERcZHA9sCA8VGA0WDAsNGBUOCQsJChQRCQgKDg8JERMTCmgJCgQQFA8ECQoIJRgJExYZHiMSPAkCAwYFBwQFAwEGAwMFBgMCCTwSIx4ZFhMJ0TMQHRsXFQgPBwgJFBcbHRAzAQIECwUEAgIEAwsIBAFRBBITDQ0TEgQxAAADAAAAAAEbAQcAFQAZACMAADc1FzUnIwcVHwE3NTM3NQcVIzUvATMHJzUfATMVIxcHJzU3F88SCakJBl4MQgkSOQZEg0xLSzpdXB4OLi8N5QETKgoKygkgCRMJKhMOnAgY1BmtGS4THg0uDS8NAAAAAwAAAAABGwEHABcAGwAlAAA3FTc1JyMHFTEVHwE3NTM3NScVIzUvATMHJzUfASM1Myc3FxUHJ88SCakJBl4MQgkSOQZEg0xLS3teXR4NLi4N5R0TIgoKCcEJIAkTCSITLJwIGNQZrRlAEx4NLg4uDQAAAAAFAAAAAAEdAR0ADAAZACIAKwA4AAATPgEeAg4CLgI2Fx4BPgIuAg4CFjcUBiImNDYyFhcUBiImNDYyFgciJicHHgE+ATcnDgFNHUc/KAQgO0U/KAQeKRk8NiIEGzM7NiIEGjwLEAsLEAteCxALCxALQhAaCBAKJSojCRAHHAEDFAUfO0ZAJwQePEU/txAFGzI9NiEEGzI8NV8ICwsQCwsICAsLEAsLUxANCRIVARYTCA4RAAADAAAAAAEaARoACAAxAFgAADcUBiImNDYyFiciBhUUFwcjFTMVMzU3FhczFSMiBhUiBh4BOwE+ATQmIzQmIzU0LgEjBzQ2OwEyFh0BFzMyFh0BMzIWFAYrASImNDY7ATU0NjsBNzUnIyImlgUIBgYIBS8THAgVIh0SFQwOHBIQFhAWARUQqQ8WFg8WEBEfEUIQDCYTGwoJCAsTCAsLCKkICwsIEwsIHAkJJgwQ6gQFBQgGBisbFA4LFRMcIRUHASUWDxYgFgEVIBYPFkIRHxEvDBEcE0sKCwgSCxALCxALEwcLCjgJEQAABwAAAAABGgEHAAoADgASABoAHgAiACwAABMHFTM1MxU3FzUnBzMVIwcjFTMnBxUXMzc1Jwc1MxUnIxUzNyMVJwcXMzcnB4MSEoQDDxJxJiY4JiY4ExODExODgxMlJV4TFg0mDSYNFgEHEzg4LgMPOhMmJTklSxNeEhJeE3FeXjkmlkgWDiYmDhYAAAAEAAD//wEHASwALAA1AD4ARwAAJTQuAQ4CHgEXDgErASIHNT4BLgEiDgEWFxUOAR4CPgEmJz4BOwEyNjc+ASc0NjIWFAYiJhcUBiImNDYyFjciJjQ2MhYUBgEHDhgaFgkEEg0FEgslFhASFQMbJBsDFRISFgMZJBwGEhIFEgslEh0GERjOEBgQEBgQOBAYEBAYEGcMEBAXERHFDRcMAhAZGhMECgsPWwMdJBgYJB0DcgQcJBkCFiQeBQoLFRECG0kMEBAXERHCDBAQFxERbhEXEBAXEQAAAAACAAAAAAEaARoALABXAAA3FjI2PwE+AT8BPgIuAS8BLgEvAS4CDgEPAQ4BDwEOAh4BHwEWFxYfARYXFjI2PwE+AT8BPgIuAS8BLgEvAS4CDgEPAQ4BDwEOARQWHwEeAR8BFmUFDQoCCAQOChoFBgMCBgcZCg8DCQIJCQkGAggDDwkaBQYDAgYGGgwJBAMIAngECggBBQEHBQ4FBQEDBQMPBAcBBQIGCAYFAgQCBgUOBQUFBQ4FBwEFAWEDBwYaCg4ECAIGCQkJAgkDDgoaBgYCAwcEGgoOAwkBBwkJCQIIBAsGBxoGTwMFBQ4FBwEFAQcHBwUBBQEHBQ4FBQEDBQMOBQcBBQEICggBBQEHBQ4FAAQAAAAAARoBGgAsAEAAawB/AAA3FjI2PwE+AT8BPgIuAS8BLgEvAS4CDgEPAQ4BDwEOAh4BHwEWFxYfARY/ARceAR8BBw4BDwEnLgEvATc+ARcWMjY/AT4BPwE+Ai4BLwEuAS8BLgIOAQ8BDgEPAQ4BFBYfAR4BHwEWLwE3PgE/ARceAR8BBw4BDwEnLgFlBQ0KAggEDgoaBQYDAgYHGQoPAwkCCQkJBgIIAw8JGgUGAwIGBhoMCQQDCAIHCggFFQ4aGg4VBQkJBBUOGhoOFHYECggBBQEHBQ4FBQEDBQMPBAcBBQIGCAYFAgQCBgUOBQUFBQ4FBwEFAQ0DAwkNAwEBAw0JAwMJDQMBAQMNYQMHBhoKDgQIAgYJCQkCCQMOChoGBgIDBwQaCg4DCQEHCQkJAggECwYHGgaHGhoOFQQKCQQVDhoaDhUFCQkFFMgDBQUOBQcBBQEHBwcFAQUBBwUOBQUBAwUDDgUGAgUBCAoIAQUBBwUOBTIBAQMNCQMDCQ0DAQEDDQkDAwkNAAMAAAAAARoBGgAHAAsADwAAASMHFRczNzUHIzUzFyM1MwEHzxISzxKDXl5xXl4BGRLPEhLPz8/PzwAAAAMAAAAAARoBGgAHAAsADwAAASMHFRczNzUHIzUzNSM1MwEHzxISzxISz8/PzwEZEs8SEs/PXhNeAAAAAAMAAAAAARoBEgBNAJwApgAANyYjLgEjFQ4BBxUWFxYXMjEGBwYHBh0BFBYyNzMGByMOARUGFjsBFj4CJyYvAS4BNj8BMzIXFhcWNjc2NTQnJicmBwYHBgcmJzU0JicXFgcGBwYrATQ2OwE1JjY3JwYHIyIHBiY+ATsBMjY/AQYmJz4BNzMyFxYXFh8BMzUmNjc+ATc2Fx4BFxUUDgEmJyYHDgEHBhYfAR4BByYvASIGFBY+ATQmI2gBAQIPChYeBAURCAoBEAoIBAMLDwcnBQIGERcBBAR9EBwWCQEBDQIHBQMDAgMDAwYHChIFAg0MERgaEg0KBQUHDwxkAgIDDggJbgoIGAESDgwIAzwDAgUFBAoHEwQFAQYPHAoEIRUCCAcKEAgGAQMBAgEEEw4TEA0RAgUHCAQKCwcJAgMHCAIKAQYBB4MEBgYHBgYE+gEJDBkJIxcICgYEAgIHBggGBwYHCgMJCgIbEgQFAQsXHRAWEQMICwkCAQEEAgEJCQYHERYSCw0FAw4LDgcHAwsQAbkPCQ4IAwcLCg0UAREDAgECAwsIBQMYAgkKFRwBAwUVCwoBAQcXBgwTAgQJCBsMAgcFAgICBgMCCgcLFwgDDB4NDQxwBQgGAQUIBQAABQAAAAABGgEaAAkADQAPABEAGwAANycHIxcHNxcnNwczNw8CNyMHMzcXMwcXJwc3tB4eZVIfUFAfUu1SGBgQGKpSUiwODiwkDiQkDrdiYkBkPj5kQAlPTzRQhBEtLRwtHBwtAAEAAAAAARoBGgAJAAA3JwcjFwc3Fyc3tB4eZVIfUFAfUrdiYkBkPj5kQAAABAAAAAABGgEaAAkADwAQABIAAD8BFzMHFycHNycfASc3Iyc1FyN4Hh5lUh9QUB9SgyQOJCwOalK3YmJAZD4+ZEBHHC0cLTNPAAAAAAMAAAAAARYBGwADABkALAAANzMVIzceARcWFRQHDgEHBicuAzc2Nz4BFzY3Nic0JicmJyYGBw4BFhceAXFLSzAWKRAmHg8mFjAnFB4QAwcPJhIrISYZGQIRDx0mEyYPIBchIhAmvEuoARQQKTcrJxIXBAkWCyIqLhUuGQwM9AkfIiUXKhAdAwEJCxhOSBMKBgAAAAAFAAAAAAEaAPQACQATABwAJQAuAAA3MzUjBxUXMzUjNyMVMxUjFTM3NQcyNjQmIgYUFjcUBiImNDYyFhcyNjQmIgYeASYSHAkJHBLqHBMTHAm7CAsLEAsLUwsQCwsQCyUICwsQCwEK4RMKqAoTqROWEwqoZwsQCwsQCxMICwsQCwsbCxALCxALAAAAAAIAAAAAARoBBwAJABMAABMHFRczNSM1MzUXNzUnIxUzFSMVHAkJLyUlxQkJLyYmAQcKzgkSvBPhCc4KE7wSAAACAAAAAAEaAPQABwAfAAA/ATMXFQcjJzcjFSM3JwcVFzcnMzUzJzcXFQcnNyMVMxMJ9AkJ9An0cUwnDTg4DShNSScNNzcNJ0lx6goKqAoKn0EnDTcONw0oEigNNw43DSdBAAAABAAAAAABFAEaACAAJAAoACwAADczNzUnIwcjNTc1JyMHFRczNxUXMxUXMzc1JyMHIzUzFTcXBycfAQcvAjcX1Q0yGQ0iXiMmDUslDhUJWBgOMhkNI15POAwlDCUMJQyQGD0ZdjINGSIYIg4lSw0mFm0JChkyDhkjSwkqCyYMOAwmDHgZPRgAAAcAAAAAARoBGgAZADUAPgBHAFAAWQBiAAATIg4CHQEeAT4BHgIOARYXMzI+ATQuASMHIy4BNSY3NjQmIgcGJyImPQE0PgEyHgEUDgEjNxQGIiY0NjIWFxQGIiY+ATIWJzI2LgEiBhQWNxQGIiY+ATIWFxQGIiY0NjIWlhowJRQBExoUHBQBFAMODwsjPSMjPSMBCgQFAggPHywQBwoCBB8zPTQeHjQeEgsQCwsQCzgLEAsBChALgwgLAQoQCwuLCxALAQoQCxMLEAsLEAsBGRQlMBoIDg0EEwEUGxUcFQEkPEc8JPUBBAQMCBArIBAIAgQDBx8zHx8zPTQevAgLCxALC4sICwsPCwtWCxALCxALEwgLCxALC0AICwsQCwsAAAQAAAAAARoA9AADAAcADwATAAA3MxUjFyMVMyc3MxcVByMnNxUzNUuWlpaWls4T4RIS4RMT4bwTJhJwExOWExOWlpYABgAAAAABGgEHAAwAFQAZAB4AIgAmAAA/ATMXFQcjNTM1IxUjFzUnIwcVFzM3JxUjNTcnNTMVJzMVIwcjFTODE3ESEktLcRMmE3ATE3ATE3CLCEtLS0smS0v0ExNeExNeODkTExNeEhJeXl4TCAsTOBNdEwAHAAAAAAEaAQcADAARABoAHgAiACYAKgAAASMHFTM1MxUjFTM3NQczFSMnByMHFRczNzUnFSM1MwczFSMVMxUjNzMVIwEHcRMTcUtLEnBLRAcmXRMTcBMTcHBeS0tLS3FLSwEHEzg4XhMTXjgTBwcTXhISXhNxXhMSExOWEwAAAAIAAAAAAO8BGgALABIAABM3MxcHMxcHJzcjJxcHNyM3IweLET4PKSEOhh4oFxFHNoVFPj5AAQ8KHUAgiRZIGwljiV6EAAAAAAQAAAAAARoBBwALAA8AEwAXAAAlJyMPARUfATM/ATUHJzUXNyc3HwEHNTcBD14RgwoKXhGDCqBUVAlXfVcHenrYL0IRVBEvQhFUkSpGJhAnPyxXPUk5AAADAAAAAAEHARoACQAMABMAACUvASMHFRczNzUHIzUHNTMVFzMVAQQ+BpEJCc4KEziEcQlC2T4CCfQJCbYEOeHhQgmWAAIAAAAAARsA4gAXACEAADciBgcjLgEOARQeATY3Mx4CPgIuAgciJjQ2MhYUBiPYGSUDOgQXHRISHRcEOgIVHyIcDwISHREUGxsnGxsT4SAYDRADFR0VBBAOERsOBBMeIxwRcBsnGxsnHAAAAAUAAAAAARoA6wASACUAPwBKAGUAADcWPgE3Nic2Jy4BIyIHNSMVMzU3Nhc2FxYVFgcOAScGJjc1Jjc2Jw4BDwEVNzY3MhYVBw4BFBYzMj8BFTM1NiYXFAYjIiY0NzY/ARcWNxY/ATUHBiImNDYXMh8BNScmIgYHBhQXFocKFBIGDQEBDAYQCRAMExMQBQYLBgcBCQMJBgsPAQEIBFAJEQcCCAsPBwkXDhUTDgsJBhEBEwEPCwYJBAgKE5wICg4MAwkJFxASDQoICAMKFhMHDw4GXwYBCAgRFhQPBwcLNI8GTAMBAQkKDQ8NBAYBARELCwwKBBYBBQUBFwcKAQwIBAESGhIGBQk/EBc5DREIDAQFAQMvBAEBCAEWBgcUHBYBBQUWAQUIBxEqEAcAAAgAAAAAARoBBwADAAcACwAPABMAFwAbAB8AACUjNTMHIxUzJyMVMxcjFTMnIxUzNyMVMycVIzUXIxUzARldXRImJkupqSXOzl5wcJZdXYODcF1d4RNLExMTXhJLExMTqTk5ExMAAAAABAAAAAABBwEaAAsADwATABcAADcnIw8BFR8BMz8BNQcnNRcnNxcHFwc1N/1dE14JCV4TXQp6VVVQWVlZXlRU4Tg4EHEQODgQcaMyYS5BNTUxQzJlLgAAAAUAAAAAARwBGgAIAAwAEAAdACkAABMzFRYXNSMVNxcnBzMnPwEXNz4BHgIOAi4CNhceAT4CJicmDgEWS5YKCbwTKBVLlnYgCysqDyMgFAIQHiIfFAIPGQoZFw4CDAoQJhYIAQdLAQRinyEqJYMTOBNLeAoCDx4jIBMCEB0iIFQHAgsVGhYHCwggJgAAAgAAAAABBwEHAEYAjQAANzUjIg4BBzEGBzEGFxUUBzEGBwYrARUzMhcVFhcVFhcxFh0BBhcVFhcxHgIXMzUjIi4CPQE0JicmJzY3PgE9ATQ2NzYzFxUzMj4BNzE2NzE2JzU0NzE2NzY7ATUjIic1Jic1JicxJj0BNic1JicxLgIHIxUzMh4CHQEUFhcWFwYHDgEdARQHDgEjcQIJEQwDAwEBAQIECgUGAQEGBQUDBAICAQEBAwMNEAkCAgYKBwQCAgUJCQUCAgkHBQZNAQkQDQMDAQEBAgQKBQYCAgYFBQMEAgIBAQEDAwwRCQEBBgoHBAICBQkJBQICCAMKBvQTBw0ICAgICBAGBQoFAhICAQIDAQMFBQYQCAgBBwgIDQYBEwQICgYZBgwFCwcHCwUMBhkJDQQCvBIGDQgHCQgIEAYFCgUCEgIBAgMBAwUFBhAICAEHCAgNBwESBAgKBhkGDAULBwcLBQwGGQwIBAQAAAACAAAAAAEaARoAGwAfAAATFTMVIxUzFSMVIzUjFSM1IzUzNSM1MzUzFTM1BxUzNc5LS0tLEksTS0tLSxNLS0sBGUsSSxNLS0tLE0sSS0tLXUtLAAAIAAAAAAEaARwADgAZAB0AKQA1AEIATwBTAAATFhcWFA4BIyImNTQ2NzYXNjc0LgEOARQeATcHFzcXMxUzFSMVIzUjNTMnFwcXBycHJzcnNxc3LgEiDgEeAz4CBwYHBicuAT4CFhcWNyMVMzYKBAIGDAgKDwgHCgQGAQUGBgQFBkxkDWNTEi8vEi8vbA0hIQ0hIQ0hIQ0hOgMMEA0FAQcLDQwHAREBBAYFAgIBBQYFAQWNS0sBFwQJBQwLCA8LBw0DBCUDBwMGAgMFBwUCImQMY4cvEi8vEiUNISENISENISENIXAHCQkNDQoGAQcKDQgEAQMFAQUGBQECAgU0EwAAAwAAAAABGQDhABsAIgApAAA3IzU0JisBFRQWOwEVIzUzMjY9ASMiBgcVIzUzFyc3FxUHJyMnNycHFRfOEgYEEwUECjkKBAUSBAUBEnA3HA4iIQ6nHBsOISK8CQQFZwQFExMFBGcFBAklTBwNIg4hDhsbDSEOIgAAAgAAAAABGgEbAB8AQwAANyIuATc2NyY0NzY3PgEfAQcXNxcWFAYHBgcOAScGBwY3IgcGBw4BHwEHBgcGHgIyNzY/ARcWNjc2Nz4BNTQnByc3JjUOEwIII0AFBgoVESkSDDYXOAUGDAsGCBAlEkQgCYkSEAYFDgcIAwREIwMBBwYIAx5JBQUPIA4GBQkJATEwMAYTExkKJj4OHg4YDQsECAU4FzYMDyAeCwYFCwQHRR4I9QsDBQ4mEgYEQiUFCwcCAxtLBAIHAwkDBQkXDQYGMDAxAQACAAAAAAD0ARoABwAbAAATBxUXMzc1Jwc1MxUjNTM1IzUzNSM1MzUjNTM1SxMTlhMTlpaWJiZLSyYmSwEZEuETE+ESJRPhEhMmEiYTJRMAAAgAAAAAARoBGgAJAA0AEQAVABkAHQAhACUAABMHFTM1MxUzNScDNTMVNyMVMzczFSM3IxUzNzMVIzM1IxUnMxUjLwkSzxIJ6hImExMTEhI4ExMTEhJdEiYTEwEZCdjPz9gJ/voTExMTExMTExMTExMTEwAABwAAAAABGgEHAAcACwAfACkANgBAAFIAABMHFRczNzUnBzUzFSczNTQjIgYHFTYyFQcGFRQWMzI/ARUUBiImNTQ/ARcjFSM1Mxc2MhYUBiInFRQWMjY0JiIGFzI3NQYiJjQ2Mhc1JgcmBhQWJhMT4RIS4eGjDRIECQMHDwwOBwYIBAEFBgMGBysBCwsBBA4ICQ4EBAcEAwcFRQkFBQsHBwwEBAgLDg0BBxOpExOpE7ypqTogFwMCDAUJAQMQBwkJEgQEBwQCBwEBFAZKHwkOGA8cBQQHCA4HCCEDDgQIDgkEDgMBARAaDwAAAAAGAAAAAAEaAQcABwALABMAGAAgACUAABMHFRczNzUnBzMVIwc3MxcVByMnNyMVMzUzNzMXFQcjJzcjFTM1JhMT4RIS4eHhExM4ExM4EyUSOF4SORISORIlEzkBBxM4ExM4ExM4SxISORISOTk5EhI5EhI5OTkAAAAGAAAAAAEaAOEACQATAB8AIwAnACsAADczNSMHFRczNSM3IxUzFSMVMzc1BxcVDwEjLwE1PwEzBxc1JzcXNycHNzUHJiUvCQkvJeovJiYvCTwEBlQJLgUGVAlQHBwLGz8bG0JCzhMJlgoTlhODEwqWJwgvCSUcCC8IJlcRGREPEBwQVx0aHQAAAwAAAAABKwEIABEAIwAnAAA3Jz4BHgEXNxcHIyc3Fy4CBh8BBi4CJwcnNzMXByceAyc3FwdnDxo9NiABFw4nDycPFwEaLDFADxo6Mh4BFw8nDigPFgIYJy6SDd8N5w0RAxwzHxYOJygOFxgqGAGzDQ4BHTEdFw4nKA4WFycXA74N0A4AAgAAAAABKwENABEAIwAANwcnNzMXByceAjY3Fw4BLgE3JwcXMzcnBy4CBgcXPgEeASYXDycOKA8WAyk9OQ8PE0VJMM0XDycPJw4XAS5IRRQPEDo8J5EXDicoDhYfLw0aHAshHhE6LxcOKCcOFiU6ExsgCxsYEDAACwAAAAABBwEHAAcACwAPABMAFwAbAB8AIwAnACsALwAAEyMHFRczNzUHMxUjFyM1Mx0BIzUnMxUjFTMVIxU1MxUzNTMVMyM1MzUjNTMnNTMV/eEJCeEK4c7Ogzg4OEs4ODg4OBM4Szg4ODg4OAEHCs4JCc4JEzglOCUlOCUTJTkmJiYmJhMlEyUlAAADAAAAAAEnAQcAEQAjADAAABMjDwEVFzM3FjI+AT8BNCYnNQcmIyIGFBYzMhcVBwYPASc3MxceARUGFQ4DJz8B+GIGfWENKhIqJRcCARQREw4OBAUFBA8NSQMCJVRzVBMJCgECERseDkUDAQcDfQ1iKgoUIhUKFSUMKiEFBQgGBihKAQMmVHQ5ChcNBQUPGQ8CBkUHAAAAAAUAAAAAARoBGgAIABUAHgArADgAADcyNjQmIgYUFjcUDgEiLgE0PgEyHgEHMjY0JiIGFBY3FA4BIi4BND4BMh4BBzI+ATQuASIOARQeAZYICwsQCwtTFCMoIxQUIygjFEsXISEuISGaIzxIPCMjPEg8I4MfMx8fMz4zHh4zgwsQCwsQCxMUIxQUIygjFBQjTCEuISEuITgkPCMjPEg8IyM8lB4zPjMfHzM+Mx4AAAAABAAAAAABGgEaAAYACgAOABIAAD8BJwcnBxc3IzczBzMVIxcjFTNDaw1kHA4i5JkrbqioqKioqK5dDlYiDCofJksmJSYAAAAABQAAAAABBgEaABMAFwAbACAAKgAAEx8BDwEvAQcvAQcvAT8BJz8BJzcHFzcnNxc3JzcXNycPARcjJxUjNQcjN9MLJwQ+CwNDCgMwCw4FLwMEQwMFZwYqBwoVOBQKIyshLgU5FiMTIxUgARkEXQsaBAgcBAcUBR8LFAgKHQgLYhAREBcuGC0YTRNNE3NbOEthTkkAAAQAAAAAARIBIwAXAEcAUQBuAAAlJyYiDwEOAR0BFBYfARYyPwE+AT0BNCYHFRQPAQY9AQYnIjU3NDczFjc2NCImNTQ3NTQ/ATIdATYXMg8BFAcxJgYVFBYzMhQ3FCMHIzU0PwExNwcOAR0BFBcjIi8BLgE9ATQ2PwE2Mh8BFhcuAQcBAFkIEghZCAkJCFkIEghZCAkJTQEFAQUFAQIBAQUEBw0GCgEFAQQEAgECAQUKBAQMJAEWAQEWEFQJCQgFBwdZBggIBlkHDwZZCwICCQbpNQUFNQUQCWoJEAU1BQU1BRAJagkQnwgBAQMBAggDAgEHAQEBAgMNBAcNCAgBAQMBCAIBAgYBAQEFBwICGgQBDgYBAQ18NAUMCWcLAwM1BA4HagcOBDUDAzUHDQQCAwAHAAAAAAEsARoAAwAgACQAKAAwADQAOAAANxcjJwciDgIUHgIyNxcGIwYiLgI0PgIyFhcHLgEXMxUjFTMVIzchBxUXITc1ByE1ITUhNSHMJg4lUwgMCgUFCQwSCQIEBQcQEAwHBwwSEgoCAgQJJRMTExON/uYJCQEaCRP++gEG/voBBqleXgsFCQ8QDQkFAwkCAgYMERQRDAcCAgkCAggTEhO7CfQJCfTqqBMmAAAAAA///wAAAPIBLQAEARcBGgEtATUBOwFKAVABUgFXAV4BYwFkAW4BdAAAEyIrATcXNjUHNj0BIy4BJy4BBz4BJw4BBwYHBjM3MAcjDgEHFDYxByYHBgczBgcxBhUHBhUUFwcXIx4DFyYnFBYXBxYfASYXFh8BNwYXMx4BMwcWFzMWFycXHgIXIyYnLgI3Jjc0JzU2NzUxFj8BNjczNjc2NzE2NxU2NzY/AQYzNwc2FzEyMwcGMRY3MTYXJxcWFzI3MTYXFRYXMicxHgEXJjEVFiMWFzUmJxQjMSYGFxY3MTQxFxYfASInMSYVHgEVMSIVFBY3MwcGFycUFTEWBzY0BxYHMQYVJwYWBzY1MTQ3Ig8BDgEnNCcmJyY3Njc2Nz4CFhcuAQ4BFzcyNRQeATcVNj8BBwY2PwE2NTEmPwEHMDkBFBYXFjcGLgEnMhcxFhcmJxYXNyIjMhYjMCcXNCIHFxQHBgc0JjY3FAcxBhQ/ATYHLgE3FjcnDwIXFhcnFh8BJyYnNwcGBzYnFTAzMTIUDwE1NgcUBzU0N4UEAwIOSAMCAgEBGxANIwkBBgEHCAMGBgEBBgMFBQgFBAIIDw0FAwIEBQECBAEDAQIEBQUEBAIFAwICAwEEAwIGAwIBCAUBCAMDBQIBAwYDBgUNDgUEFAccMhwCAQEBBwcCAwMDAQIBBQQHBwIHDAcNCAEBDwcFBAQFBQIFBQYGAQsKCgICBAUBCAEFDxoFAwEBBAIGBgMCAQIBAQIBAQEBAQIBAwECAQECAwEDAQIBAgEFBAMEAQMBAQEFBxAmFAISBgkDAgIDBQQSFhIFCRoYDgEBARUfDgUDCQEDBQ4DAQECBFQGAwsSCRsYBgEFCAQEBgkLAwEBBgICBDYCAQIDAgQEAQQCAgQBAxkFBgQHBRoBJwEDBAMFAgIBAQMBjAECBgfgAgEBBAIGAgMBKwGQCAYFCBAKEyYHBgIEAQEBAQICBAIBAQIBAwYBAgMBDwwJBQcJBAwRCA0FBwcJBAEFCQEEAgkFAgMCAQIGAwgEAgUJAwcEAQIDAgQFBgUCAgECCC1AIQYMDwICFg4BAgUFBwQEBgQHBgIDBgcDBgMBAgQBAQEBAQIBAgMEAwUBAQIBAwQFCB4RBAQFCwoBFAkCAQMFAgEBBAIGBQIDAQQGAQMFAwEECQcIAwQFBgYJAwcKCAMEBwUEAgEBAgUHDQUHAQIOCw8XAQYLAwcMAQoHCAQLGQ4BAhEbCwcBAQIIAgMBDQMCAgIDAykBBAIEAQQGEAoFCgEDCAoFuwEBegYEAwELBwYBAQQFAgIEAQIBBBMBAgEBAZkBnwQEBgMXBAIFAgYDGAIPDQ5XAQEDAwEDFQQEAgQEAAAFAAAAAAESAS0AWgCxAM8BGQE+AAA3HgEfARYfAR4BFA4BDwEOAgcOASMiJicmLwIiDwEiDwEOASImJyYvAS4CNDY1JzQ2NzY/Ayc0PgI3PgE1JzQ1ND4CMzIeAh0BFhcWHwEeAhUUJzIWHwEVDwEGDwEGFBcWHwEeATsBMj8DNC8CLgEvAT0BND4BMzIWFAYUFzMyNjUnLgIjIgYHFycmByMiPQEuAiIOARUHFB8BFjI2NSMiLwEmNgcyPgMmLwIuAgYPAQ4CFRcUBhQWHwIWFzcyNzY3Njc1PwE0PgE3NTQ/ATY/AS8BJi8BJjUnJi8CJiIPAQYiJi8BJiIdAQcGBxcUFwcOAR0CMh8BFh8BFh8BFAYHHgMXMj4BNzY/AjY9AS8CJiMiDwEGIiYvAQcGBwYVBwYPAhQW+QQFAQIBAwMCAwMGBAcGCQoGBAcECAsEAgEEHQcGDQEBBAMICwoFCQkZAwUDAwEHBwMCBQcBAQcKDAYICQEFCxINDhIJAwEDAwQOBwwIfgIDAQEBBAECBgICAwEEAQYGAQYFDgsBAQIFAwcDAQIDAgUEAgECAwMBAQMGBAgGAQEFAgICAgECBAYDAwECAQECAgEBAQIBBB0EBgYDAQICDQoCBAUGAwoDCAUBAgUEEAgDBUMEBQkJBAQCBQMGAwECAQIDBQICAgcBAQIDAwMCBQUUBQkHAwUDAggDAQEBBQYEAwMHBAQGBAECBQMCCAgKQAMHCAMICgoDAQUDBQMGAwIKAwUFAQQCAgECAgEDAQEJWwIHBQYEBQQCBgcFBAEEAwcKBAIDBggCAQEBAQICBQIEAgMEAgQBAwYICAUNBwcCAQIECQIHChQTEggKGA4LBgYMEg4HDBMXDA0KCQQGEgkUFg0KjwIBBAQCBQEBBQIDAQIEBgMFAwgIBAIBAgEBBAEBAgcCAwIHBQQCAQMDBwQIBAcICQEBAQEGAwYFAwQDBQQDBQECAQEFBAbkAgMGBwUCEhAEBgQBAgoDAwQEDAQHBwMBAwEBAw4BAgQCAwEIHwQGBQIBAQIDAQECFwYEAgoCAgQHBwcFAwMNAgUEBgMCBw0HCAQCAgcIEwkKBAIEAwQIAwQGBAUBBAYEAhUCBQQJBQUCAgICCAUPBAEGAQMCCgMCAgUFEQgIBQUHCgAAAAAEAAAAAAErARoABwALAA8AFQAAEx8BDwEvATcHFzcnFwcXNy8BBxcHFy/0CCIL9AgiDuEg4U0DXgI9RQ0yPQkBGQMJ8gkDCvHoA98CnRICEy83DycnDwAABAAAAAABBwEaAAcADAAQABQAABMjBxUXMzc1BxUjNTMXIzUzNSM1M/3hCQnhCoRdXXFeXl5eARkJ9AkJ9HFnz89eE14AAAAABv//AAABHAEaAAgAEQAeACcANABEAAA3FAYiJjQ2MhYHFAYiJjQ2MhYXLgEnBiceARcWMyY1NxQGIiY0NjIWFzY3NiYnBgcWBwYHFiciMT4BFwYPAQ4BByYnJiP2FyEXFyEXphghFxchGDIWIgoREg0xIA4OC2EXIRgYIRcQEwYGCg8GEBEIAwkO0gESRCYJAgEYKQ4ICgYG8xEWFiEWFmURFhYhFhZ0BBoTCAQeKAcCDhIBEBYWIRYWAhcdGTIWEQkfIhAOC3wgIwMKDQgBFRMFAgEAAAAABAAAAAABGgEaAAcACwASABYAABM3MxcVByMnNxUzNQ8BFwcXNzUVMxUjExPhEhLhExPhrw01NQ0+S0sBBxIS4RMT4eHhOQ01NQ09CjMTAAAEAAAAAAEaAOEABwAKABIAGAAANwczNzMXMycHNxc3IwczNzMXMyc3NjcfAT8sGQkrChksGw8OhR49Hg4/Dh1kFgIBAhepcRwccUIoKHqpKytCQwYFC0MAAwAAAAABBwD0AAMABwALAAAlIzUzFSM1MwczNSMBB+Hh4eHh4eHOJnEmcSYAAAAAAQAAAAABGgEHABsAADciLgE/ASMGLgI3Njc+ATczHgEdARQGKwEHBmYIDgUEEjQHDAcBAyMIAw0IpwsPDwsZbggjCxEJKQEGCw4GShcHCQEBDwtCCg9nBwAAAAACAAAAAAEaAQcAGwA2AAA3Ii4BPwEjBi4CNzY3PgE3Mx4BHQEUBisBBwYnIgcGBwYWNzMXFQcGHgEyPwIzMjY9ATQmI2YIDgUEEjQHDAcBAyMIAw0IpwsPDwsZbggYBQILIAIEBT4JFAEBBAUCcgkZAwUFAyMLEQkpAQYLDgZKFwcJAQEPC0IKD2cH0QUfQwQHAQwJLgIFAwJoAwQDQgMFAAAAAAEAAAAAARoBBwAbAAATHgIPATM2HgIHBgcOASsBLgE9ATQ2OwE3NsYIDgUEEjQHDAcBAyMIAw0IpwsPDwsabQgBBwEKEQkpAQcLDQZKFwcKAQ8LQgoPZwYAAAAAAgAAAAABGgEHABsANgAAEx4CDwEzNh4CBwYHDgErAS4BPQE0NjsBNzYXMjc2NzYmByMnNTc2LgEiDwIjIgYXFQYWM8YIDgUEEjQHDAcBAyMIAw0IpwsPDwsabQgYBQILIQEEBT0KFAEBBAUCcgkZAwUBAQUDAQcBChEJKQEHCw0GShcHCgEPC0IKD2cG0AUfQwQHAQwJLgIFAwJoAwQDQgMFAAAGAAAAAAEZARoAIAAvAEEATQBSAGgAACUnByc3JyYiDgIUFwYHBhYXHgEzMjc2NzY3FjI+AjQHBisBIi4CNzY3HgEXBjcWBiInLgE3PgI7AQcVFzM3BzMXNyc3LwEPAhcnFxUjJxc3FxYUBw4BJyYvATcXHgE+AjQmJwEVDycXJwMNGxoUCwU6OQYBCAQJBQkHFSQiGg0cGhQL4gECAgICAwIBKkYDBgRJqQEgLA8MBgYEDxQKBSIjDSLKHA4MDAEENgsPAiMKKxQcig06CAgGDwgFAzsNOgIFBQIBAQHrAycXKA8ECxQbHQ06OwgVBwQFBxMlIRsGCxUaHLcBAQQGAixGBAcDS4UXHw8MIA8KEAgjDSMiJw4NDR8IJAIPDDZAHRUsfQ08CBYIBgMDAgQ8DTwCAgIDAwQDAQAABgAAAAAA9AEaABMAFwAbAB8AIwAnAAA3MxUjFQcjJzUjNTM1NDY7ATIWFSsBFTMHMzUjFyMVMzczFSM3MxUjvDgTE4MTEjgLCDgICxM4OF6DgyYTExITEyYTE/QTqRISqRMTBwsLBxO8qRODg4ODgwAAAAABAAAAAAEHAM8ABQAAPwEzFwcjJgfSCGoQxAoKZgAAAAEAAAAAAM8BBwAFAAATFxUHJzXECgpmAQcI0ghqEAAAAQAAAAAAzwEHAAUAADcnNTcXFWgKCmYmB9IIahAAAAABAAAAAAEHAM8ABQAAJQcjJzczAQcI0gdpEGgKCmYAAAEAAAAAARoA/wA+AAAlDgEHFxQGBw4DIiYnFjY3IiYnJicXFjcuAScmNTEWMyYnJicmNzY3FhcWFxYXJzU0NzY3NjIWFzY3Bgc2ARkFDggBBwcJHSQrLSoSFSoQDBcHBQMFCgkJEAYMDA0LBwMCAwQBBAoNGR8QEAEECBUKFhQIEhAGEhDlCA4GBxAfDxUiGAwMDAILDgwKBwgBAQMCCQgOFAYHDAYGDg0HBgwKFQgEAQYGDAkVCAQJCAQJEwoBAAQAAAAAAQcBGgAeACIAJgAqAAA3IyczNzUnIwcVFzMHIwcVFzM3NScjNxcjBxUXMzc1JzUzFQcVIzUXIzUz/SA/FAoKSwkJFD4hCQk4CgoBOjkBCQk4CpY4XiXOJiZeXglLCQlLCV4KOAkJOApWVgo4CQk4ejk5gyUlJSUAAAAABAAAAAABBwEaAB4AIgAmACoAABMjBxUXMwcnMzc1JyMHFRczFyMHFRczNzUnIzczNzUHNTMVFxUjNTcjNTP9OAkJATk6AQoKOAkJIT4UCQlLCgoUPyAK4SVeOIMmJgEZCTgKVlYKOAkJOApdCksJCUsKXQo4LyYmgzg4gyYAAAAFAAAAAAEHARoAIwAnACsALwAzAAA3Iyc1JyM1Mzc1JyMHFRczFSMHFQcjBxUXMzc1NzMXFRczNzUnMxUjBzMVIwcjNTMXIzUz/SEgChwJCgolCQkJHAkgIgkJJgkgQyAKJQqEExMSODg5EhK8ExNLIEcKJQkmCQkmCSUKRyAJJgkJIiAgIgkJJsUTSzhLEhISAAAAAwAAAAABBwEaAAkAEwAtAAA3NQcnNzMXBycVBxUnBxczNycHNTcXBxcHIzUzJyMHMxUjJzcnNzMVIxczNyM1jRMNIg4iDRMSEw0iDiINE2IGRUUGTjg4ODo5TwVFRQVPOTg4OjiySxMOISINE0s4SxMNIiINE0tnEzc5ExMtLRMTNzkTEy0tEwAAAAAMAAAAAAEaARoACQATABsAHwAnACsAMwA3AD8AQwBHAEsAABMXBycVIzUHJzcXNSMVJwcXMzcnNyMnNTczFxUnMzUjFyMnNTczFxUnMzUjByMnNTczFxUnMzUjFyMnNTczFxUnMzUrAhUzNSMVMzYoDxcSFw0nDxIXDScNKA1OJQkJJQomExONOAoKOAk4JiZCJQkJJQomExONOAoKOAk4JiYTJSUlJQEZJw0WUlQYDSfoUlIWDScnDWIJJgkJJgoSJQk4Cgo4CiWWCSYJCSYKEzkKOAkJOAkmE3ASAAAAAAIAAAAAAQcBHQAVABoAADc1ND4BFhczLgEOAR0BIwcVFzM3NScHMxUjNV4aKSMHFAguOCYTEhK8ExMmJrypJRUfBxUTGyAHKh0lE3ATE3ATE3BwAAUAAAAAARoBGgAJABEAHgAnAC8AADczNxcVBycjJzUfATUPASMVMzcUBgcnPgEnNic3HgEHFAcnNjQnNxYHFAcnNic3Fhw0SRAQSTQJSDs7By4uxQ8ODgwNAQEZDg4PJRMNDQ0NEyYIDgcHDgjRSAb0BkgJXlc7xjoDSyUXKhINDyQTJx8NESsXHxkNFC8TDRkfEA0ODxANDQAAAAQAAAAAARUBFAAXAC8AWwBfAAA3MzczNzU3NSc1JyMnIwcjBxUHFRcVFzM3IzUvAT8BNTM/AR8BMxUfAQ8BFSMPASc3Bg8BIzU2Nz4DMzIeAhQOAQ8BDgEdASM1NDY/AT4BNCcxLgEnMSYiBhcjNTOQDSAtCiAgCS4gDR8vCh8fCi8DKQIdHAMpBhwdBigDHR0DKAccHBUCAQERAQMCBAcJBQgLCAMEBQMGAgQRBAMLAwMBAQMCAwYGDxAQGCAKLSAOIC4JICAKLSAOIC0KEygHHBwHKAMcHAMoBxwcBygDHBxxAwMGAQkHAwYEAwUICwwJCAQHAwYDCQoFCAMOAwgHAwIEAQIEXRAAAAAGAAAAAAEsARoAQgBOAFoAYgBmAGoAADc0Nh8BFjI2PwInLgIiBzU3Fh8BNz4DFhUUIyImIgYHBgcXFh8BFjI3Nj8BFw4DIi4BLwEmJw8BDgIiJhc+ATQmJzMWFRQGByMuATU0NzMOARUUFzchBxUXITc1ByE1ITUhNSFlBwQFAQMFAwsGBwEFBgcDGwYDBQUDCQkJBggDBQYGAwUECAEBAgEEAQUDAwMBBgcIBgUDAQQBAQkGAwgHCAZzBwkJBw0SCQmeCQkSDQgIEM/+5gkJARoJE/76AQb++gEGVAQFAgQBBQMQDRsDBQMBBAUGCBAIBgkGAQQECAMGBAYIIgQDAwEBBAUEAgMIBwYEBgMUBAMPCQUGBQUFChgaGAoVGg4XCgkZDRoVChkMGxTOCfQJCfTqqBMmAAACAAAAAAEVARQAFwAeAAA3IycjJzUnNTc1NzM3MxczFxUXFQcVByMnMzcnBycHnQ0fLwofHwovHw0gLgkgIAotPw5GDUAaDRggCi0gDiAtCiAgCS4gDiAtCjBGDkEaDQADAAAAAAEVARQAFwAvADYAADczNzM3NTc1JzUnIycjByMHFQcVFxUXMzcjNS8BPwE1Mz8BHwEzFR8BDwEVIw8BJzczNycHJweQDSAtCiAgCS4gDR8vCh8fCi8DKQIdHAMpBhwdBigDHR0DKAccHAQORg1AGg0YIAotIA4gLgkgIAotIA4gLQoTKAccHAcoAxwcAygHHBwHKAMcHCBGDkEaDQAAAAQAAAAAARoA9AAHAAsAFgAhAAA3BxUXMzc1JxUjNTMHNTM1IwcVFzM1Iyc1MzUjBxUXMzUjlhMTcRIScXGpEx0JCR0TOBIcCQkcEvQTlhMTlhOpll5LEwmECRM4JhIJXgkTAAADAAD//wEuAQcAEgAfACYAABMzFxUmJzUjFTMUFyM1MzUjJzUXPgEeAg4CLgI2FzcnBycHFxz0CQgL4F0TSzhnCaQRKCQXAhIhKCQWAxI4LQ8nGAwgAQcKZwcEU6kfGRMSCrt0DAIRIigkFwISISgkUjsMNBMOGgAFAAAAAAEsAQcAEgAfACsAMQA3AAATMxcVJic1IxUzFBcjNTM1Iyc1FyIOARQeATI+ATQuAQciLgE0PgEzMhYUBicXNyc3JwcnNxcHJxz0CQgL4F0TSzhnCc4UIxQUIygjFBQjFA8aDw8aDxchIRUbCRMTCTASCBsbCAEHCmcHBFOpHxkTEgq7ZxQjKCMUFCMoIxSDDxoeGg8hLiFDGwgTEgguEggaGwgAAAAAAwAAAAABLAEHABIAHwArAAATMxcVJic1IxUzFBcjNTM1Iyc1FyIOARQeATI+ATQuAQciLgE0PgEzMhYUBhz0CQgL4F0TSzhnCc4UIxQUIygjFBQjFA8aDw8aDxchIQEHCmcHBFOpHxkTEgq7ZxQjKCMUFCMoIxSDDxoeGg8hLiEAAAAAAwAA//4BLgEHABIALgAxAAATMxcVJic1IxUzFBcjNTM1Iyc1FzIeAhceAQcOAgcOAScuAicuATc+Ajc2FycVHPQJCAvgXRNLOGcJzgoTEQ4FBwQEAgoOCA0eDwkRDgUHBAQCCg4IEjo5AQcKZwcEU6kfGRMSCrtnBQoOCA0eDwkRDgUHBAQCCg4IDR4PCREOBQpLJksAAAACAAAAAAEaAQcADwATAAABIwcVFzMVIxUzNSM1Mzc1ByM1MwEQ9AkJZziWOGcJEuHhAQcKuwoSExMSCruyqQAABgAAAAABLAD0ABkAMwA3ADsARwBTAAA3MzIWHQEUBisBIi8BJiIPAQYrASImPQE0NhciBh0BHgE7ATI/ATYyHwEWOwEyNj0BNCYjBzMVIyUzFSMnMhYUBisBIiY0NjsBMhYUBisBIiY0NjNLlhchIRcHEQ8PChYKDw8RBxchIRcQFgEVEAcMCRAOIg4QCQwHEBYWEOETEwEZExOfBAUFBC8EBQUElgQFBQQvBAUFBPQhF0sYIQoKBgYKCiEYSxchExYPSxAWBgsJCQsGFhBLDxY4ODg4JQUIBgYIBQUIBgYIBQAABAAAAAABBwEZAAUAEQAfACkAABMHFzc1NBUnJiIPAQ4BHwE2NTcWHQEUBzc+AT0BNiYnBzcXBwYiLwEmNLdPKCyMAggDDQMBBKEFDgQENAQEAQUE6BYfGwIIAw0DARJIHyE7BppqAgMMAwkDlAUG4QkJzwkJGQIIBKUECAGBFRwVAgMMAwkAAAEAAAAAAQcBGgAqAAA3BicmLwEHBiIvASY0PwEnJjQ/ATYyHwE3PgEfAR4BHQEjNQcXNTMVFAYHzAYGAwNgKgIIAw0DAyQkAwMNAwgCKmIECAQyBAQ8SUk9BQQnAwMBAlggAgMMAwkDISIDCQMMAwIgWQMBAhkBCARcQTg3LkkECAIAAAYAAAAAARoBGgALABcAIwAwADgAQAAANzM1MzUjNSMVIxUzFyMVIxUzFTM1MzUjNzUjFSMVMxUzNTM1ByYiDwEGFBYyPwE2NAcGIiY0PwEXNwcnNzYyFhRSExMTExMTlhMSEhMTEx8TExMTEkoIFwmMCBAYCIwIogIIBgN5DhMGDQYCCAbOExMTExNeEhMTExOWEhITExMTLggIjQgXEQmMCBeeAwYHA3kNEwYOBgIFCAAAAAQAAAAAARkBGgAFAAgADAAQAAATMxcHIyc3BzMnNSMVPQEzFY4Qewj2CINr1l8YGAEZ5g0NzskTExMmS0sAAAADAAAAAAD0ARoABgAaACcAADczNSM1IxUnDgEUFhcVFzM3NT4BNCYnNScjBxcUDgEiLgE0PgEyHgGNJRwTHBYZGRYKSwkWGRkWCUsKehQjKCMUFCMoIxSDEy84WgwsMiwMKQkJKQwsMiwMKQkJehQjFBQjKCMUFCMAAAAAAwAAAAAA4QEaABEAGQAdAAATNSMiDgEUHgE7ARUjFTM1IzUHIyImNDY7ARcjNTPhZxIeEhIeEhwTXhM4HBQbGxQcJhMTAQcSER8jHhJeEhLPXhsnHM/PAAUAAAAAASwA9wAHABwAJwA3AEMAADUzFSE1MxUhNyM1IwYjIiY1ND8BNCMiBzU2MzIVDwEOARUUFjMyNjUXMRUjNTMVMTYzMhYVFAYiJxUUFjMyNjU0JiIGEwEGE/7UgBABChUQESIfFhIPDxQkEBkMCwoJDRA/EREMGBQWGSoLEA0PERAcEV4mJjg4EBMRDR0FBBoMEQkmDwQBCAsHChEOGw+YQxQbGBofOw4NEhcVERMUAAMAAAAAARoBBwAHAAsADwAAASMHFRczNzUHIzUzNSM1MwEQ9AkJ9AkS4eHh4QEHCs4JCc7FhBImAAAAAAYAAAAAARoBGgAfAC8ARQBaAHoAigAANyYnJgcGDwEVNz4BMhYXBw4CBwYWFxYzMjcVMzU0JgcVFAcOAScuAj0BND4BMzcuAiIHBgc1IxUzNRYXFjMyPgI0BxQOAQcGJy4CPQE+Axc2Fx4BBz4BMhYfATUnJg4DFB4CMjY/ATUPAQYnLgI0NjcjNTMXFQcjFwcnNTcXBzNJBAUJCwcGBgQECwsFARIHCQYBAwYJBQULBxMDDwECCgUCAgEDBANrAQYLDgUDAhISAwYCBAcLBwQSAgQCBgUCBAIBAgMFAwYEAQJeAwYIBgMHAggSDgoFBQkNDgoEAgYKBgYDBQME3EtUCQl8Jw42Ng4mcusFAgMCAQMDFAMDBQYGAgEFBwQKEgQCCQcxBwsfBQMDBgUCAQIDAgQBAwIWBgsHBAIDLnQFBQEBBgwQEAcHCgYBAwICBAYECgQIBQMBAQYCCWADAwICBRUBBQEGDA8RDgoGAwIBEQIEAQICBggLCU0SCXEJJw02DTcOJQAAAwAAAAABJQEtACQAPwBMAAATMh4CFxYXFhcWMxUUDgQPAScuBT0BMj4CNz4BFy4BJy4BIgYHDgEHFRQeBBc+BTUvAQ8BLwEPAR8CPwGXCA0NDAcKCxUXDAsLExkfIREEBREiHhoTCgsYFhUKDBqIFSkSCRYWFQkSKRYKERgaHg8QHRsXEgk0CAhRHAgIAiQECQRbASwCBAYEBgUIAgFKFiYjHhsXCgMDChcbHiMnFEwBBQkGCAg4AQwMBgYGBgwMATkSIiAbGBUJCRQZGyAiEhkHAWAnAgcHMwIBAmsAAAAEAAAAAAElAS0AJAA/AGkAcQAAEzIeAhcWFxYXMhcVFA4EDwEnLgU9ARY+Ajc+ARcuAScuASIGBw4BBxUUHgQXPgU1Jx4BFA4BDwEOAR0BByMnNTQ+AT8BPgE0JicmIgcOARUHIyc0PgE3NhcWBzczFxUHIyeXCA0NDAcKCxUWDQsLExkfIREFBBEiHhoTCgsYFhUKDBqIFSkSCRYWFQkSKRYKERgaHg8QHRsXEQpgBQYFBgQGAwMDDQMFBgQGAwMDAgUPBQIDAw0DBgoGDg8GHgMNAwMNAwEsAgQGBAYFCAIBShYmIx4bFwoDAwoXGx4jJxRMAQIFCQYICDgBDAwGBgYGDAwBORIiIBsYFQkJFBkbICISGQYMDgsIAwYDBgQGAwMGBwsHAwYEBgcGAwUFAwYEAgIIDQoCBgYDYQMDDQMDAAADAAAAAAElAS0AJAA/AFMAABMyHgIXFhcWFzIXFRQOBA8BJy4FPQEWPgI3PgEXLgEnLgEiBgcOAQcVFB4EFz4FNS8BIwcnIwcVFwcVFzM3FzM3NSc3lwgNDQwHCgsVFg0LCxMZHyERBQQRIh4aEwoLGBYVCgwaiBUpEgkWFhUJEikWChEYGh4PEB0bFxEKRwcEJSUECCUlCAQlJQQHJSUBLAIEBgQGBQgCAUoWJiMeGxcKAwMKFxseIycUTAECBQkGCAg4AQwMBgYGBgwMATkSIiAbGBUJCRQZGyAiEgsIJiYIBCUlBAgmJggEJSUAAAADAAAAAAEaAR4ADgAfACsAADcWBgcXBycOAS4BPgEeAQcyNjcHPgE1NC4BIg4BFB4BNzUjNSMVIxUzFTM14gENDFAOTxxIORMcP0cwZBEfDAEMDhcnLiYXFyZFJRMmJhO5FCYQTw5QFwIrRUIjDDWADQwBDB8RFycXFyctJxdLEyUlEyUlAAAAAwAAAAABGgEeAA4AHwAjAAA3FgYHFwcnDgEuAT4BHgEHMjY3Bz4BNTQuASIOARQeASczFSPiAQ0MUA5PHEg5Exw/RzBkER8MAQwOFycuJhcXJhhdXbkUJhBPDlAXAitFQiMMNYANDAEMHxEXJxcXJy0nF10SAAAAAAAQAMYAAQAAAAAAAQAHAAAAAQAAAAAAAgAHAAcAAQAAAAAAAwAHAA4AAQAAAAAABAAHABUAAQAAAAAABQAMABwAAQAAAAAABgAHACgAAQAAAAAACgAkAC8AAQAAAAAACwATAFMAAwABBAkAAQAOAGYAAwABBAkAAgAOAHQAAwABBAkAAwAOAIIAAwABBAkABAAOAJAAAwABBAkABQAYAJ4AAwABBAkABgAOALYAAwABBAkACgBIAMQAAwABBAkACwAmAQxjb2RpY29uUmVndWxhcmNvZGljb25jb2RpY29uVmVyc2lvbiAxLjExY29kaWNvblRoZSBpY29uIGZvbnQgZm9yIFZpc3VhbCBTdHVkaW8gQ29kZWh0dHA6Ly9mb250ZWxsby5jb20AYwBvAGQAaQBjAG8AbgBSAGUAZwB1AGwAYQByAGMAbwBkAGkAYwBvAG4AYwBvAGQAaQBjAG8AbgBWAGUAcgBzAGkAbwBuACAAMQAuADEAMQBjAG8AZABpAGMAbwBuAFQAaABlACAAaQBjAG8AbgAgAGYAbwBuAHQAIABmAG8AcgAgAFYAaQBzAHUAYQBsACAAUwB0AHUAZABpAG8AIABDAG8AZABlAGgAdAB0AHAAOgAvAC8AZgBvAG4AdABlAGwAbABvAC4AYwBvAG0AAgAAAAAAAAADAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAHOAQIBAwEEAQUBBgEHAQgBCQEKAQsBDAENAQ4BDwEQAREBEgETARQBFQEWARcBGAEZARoBGwEcAR0BHgEfASABIQEiASMBJAElASYBJwEoASkBKgErASwBLQEuAS8BMAExATIBMwE0ATUBNgE3ATgBOQE6ATsBPAE9AT4BPwFAAUEBQgFDAUQBRQFGAUcBSAFJAUoBSwFMAU0BTgFPAVABUQFSAVMBVAFVAVYBVwFYAVkBWgFbAVwBXQFeAV8BYAFhAWIBYwFkAWUBZgFnAWgBaQFqAWsBbAFtAW4BbwFwAXEBcgFzAXQBdQF2AXcBeAF5AXoBewF8AX0BfgF/AYABgQGCAYMBhAGFAYYBhwGIAYkBigGLAYwBjQGOAY8BkAGRAZIBkwGUAZUBlgGXAZgBmQGaAZsBnAGdAZ4BnwGgAaEBogGjAaQBpQGmAacBqAGpAaoBqwGsAa0BrgGvAbABsQGyAbMBtAG1AbYBtwG4AbkBugG7AbwBvQG+Ab8BwAHBAcIBwwHEAcUBxgHHAcgByQHKAcsBzAHNAc4BzwHQAdEB0gHTAdQB1QHWAdcB2AHZAdoB2wHcAd0B3gHfAeAB4QHiAeMB5AHlAeYB5wHoAekB6gHrAewB7QHuAe8B8AHxAfIB8wH0AfUB9gH3AfgB+QH6AfsB/AH9Af4B/wIAAgECAgIDAgQCBQIGAgcCCAIJAgoCCwIMAg0CDgIPAhACEQISAhMCFAIVAhYCFwIYAhkCGgIbAhwCHQIeAh8CIAIhAiICIwIkAiUCJgInAigCKQIqAisCLAItAi4CLwIwAjECMgIzAjQCNQI2AjcCOAI5AjoCOwI8Aj0CPgI/AkACQQJCAkMCRAJFAkYCRwJIAkkCSgJLAkwCTQJOAk8CUAJRAlICUwJUAlUCVgJXAlgCWQJaAlsCXAJdAl4CXwJgAmECYgJjAmQCZQJmAmcCaAJpAmoCawJsAm0CbgJvAnACcQJyAnMCdAJ1AnYCdwJ4AnkCegJ7AnwCfQJ+An8CgAKBAoICgwKEAoUChgKHAogCiQKKAosCjAKNAo4CjwKQApECkgKTApQClQKWApcCmAKZApoCmwKcAp0CngKfAqACoQKiAqMCpAKlAqYCpwKoAqkCqgKrAqwCrQKuAq8CsAKxArICswK0ArUCtgK3ArgCuQK6ArsCvAK9Ar4CvwLAAsECwgLDAsQCxQLGAscCyALJAsoCywLMAs0CzgLPAAdhY2NvdW50FGFjdGl2YXRlLWJyZWFrcG9pbnRzA2FkZAdhcmNoaXZlCmFycm93LWJvdGgRYXJyb3ctY2lyY2xlLWRvd24RYXJyb3ctY2lyY2xlLWxlZnQSYXJyb3ctY2lyY2xlLXJpZ2h0D2Fycm93LWNpcmNsZS11cAphcnJvdy1kb3duCmFycm93LWxlZnQLYXJyb3ctcmlnaHQQYXJyb3ctc21hbGwtZG93bhBhcnJvdy1zbWFsbC1sZWZ0EWFycm93LXNtYWxsLXJpZ2h0DmFycm93LXNtYWxsLXVwCmFycm93LXN3YXAIYXJyb3ctdXAGYXR0YWNoDGF6dXJlLWRldm9wcwVhenVyZQtiZWFrZXItc3RvcAZiZWFrZXIIYmVsbC1kb3QOYmVsbC1zbGFzaC1kb3QKYmVsbC1zbGFzaARiZWxsBWJsYW5rBGJvbGQEYm9vawhib29rbWFyawticmFja2V0LWRvdA1icmFja2V0LWVycm9yCWJyaWVmY2FzZQlicm9hZGNhc3QHYnJvd3NlcgNidWcIY2FsZW5kYXINY2FsbC1pbmNvbWluZw1jYWxsLW91dGdvaW5nDmNhc2Utc2Vuc2l0aXZlCWNoZWNrLWFsbAVjaGVjawljaGVja2xpc3QMY2hldnJvbi1kb3duDGNoZXZyb24tbGVmdA1jaGV2cm9uLXJpZ2h0CmNoZXZyb24tdXAEY2hpcAxjaHJvbWUtY2xvc2UPY2hyb21lLW1heGltaXplD2Nocm9tZS1taW5pbWl6ZQ5jaHJvbWUtcmVzdG9yZQ1jaXJjbGUtZmlsbGVkE2NpcmNsZS1sYXJnZS1maWxsZWQMY2lyY2xlLWxhcmdlDGNpcmNsZS1zbGFzaBNjaXJjbGUtc21hbGwtZmlsbGVkDGNpcmNsZS1zbWFsbAZjaXJjbGUNY2lyY3VpdC1ib2FyZAljbGVhci1hbGwGY2xpcHB5CWNsb3NlLWFsbAVjbG9zZQ5jbG91ZC1kb3dubG9hZAxjbG91ZC11cGxvYWQFY2xvdWQIY29kZS1vc3MEY29kZQZjb2ZmZWUMY29sbGFwc2UtYWxsCmNvbG9yLW1vZGUHY29tYmluZRJjb21tZW50LWRpc2N1c3Npb24NY29tbWVudC1kcmFmdBJjb21tZW50LXVucmVzb2x2ZWQHY29tbWVudA5jb21wYXNzLWFjdGl2ZQtjb21wYXNzLWRvdAdjb21wYXNzB2NvcGlsb3QEY29weQhjb3ZlcmFnZQtjcmVkaXQtY2FyZARkYXNoCWRhc2hib2FyZAhkYXRhYmFzZQlkZWJ1Zy1hbGwPZGVidWctYWx0LXNtYWxsCWRlYnVnLWFsdCdkZWJ1Zy1icmVha3BvaW50LWNvbmRpdGlvbmFsLXVudmVyaWZpZWQcZGVidWctYnJlYWtwb2ludC1jb25kaXRpb25hbCBkZWJ1Zy1icmVha3BvaW50LWRhdGEtdW52ZXJpZmllZBVkZWJ1Zy1icmVha3BvaW50LWRhdGEkZGVidWctYnJlYWtwb2ludC1mdW5jdGlvbi11bnZlcmlmaWVkGWRlYnVnLWJyZWFrcG9pbnQtZnVuY3Rpb24fZGVidWctYnJlYWtwb2ludC1sb2ctdW52ZXJpZmllZBRkZWJ1Zy1icmVha3BvaW50LWxvZxxkZWJ1Zy1icmVha3BvaW50LXVuc3VwcG9ydGVkDWRlYnVnLWNvbnNvbGUUZGVidWctY29udGludWUtc21hbGwOZGVidWctY29udGludWUOZGVidWctY292ZXJhZ2UQZGVidWctZGlzY29ubmVjdBJkZWJ1Zy1saW5lLWJ5LWxpbmULZGVidWctcGF1c2ULZGVidWctcmVydW4TZGVidWctcmVzdGFydC1mcmFtZQ1kZWJ1Zy1yZXN0YXJ0FmRlYnVnLXJldmVyc2UtY29udGludWUXZGVidWctc3RhY2tmcmFtZS1hY3RpdmUQZGVidWctc3RhY2tmcmFtZQtkZWJ1Zy1zdGFydA9kZWJ1Zy1zdGVwLWJhY2sPZGVidWctc3RlcC1pbnRvDmRlYnVnLXN0ZXAtb3V0D2RlYnVnLXN0ZXAtb3ZlcgpkZWJ1Zy1zdG9wBWRlYnVnEGRlc2t0b3AtZG93bmxvYWQTZGV2aWNlLWNhbWVyYS12aWRlbw1kZXZpY2UtY2FtZXJhDWRldmljZS1tb2JpbGUKZGlmZi1hZGRlZAxkaWZmLWlnbm9yZWQNZGlmZi1tb2RpZmllZA1kaWZmLW11bHRpcGxlDGRpZmYtcmVtb3ZlZAxkaWZmLXJlbmFtZWQLZGlmZi1zaW5nbGUEZGlmZgdkaXNjYXJkBGVkaXQNZWRpdG9yLWxheW91dAhlbGxpcHNpcwxlbXB0eS13aW5kb3cLZXJyb3Itc21hbGwFZXJyb3IHZXhjbHVkZQpleHBhbmQtYWxsBmV4cG9ydApleHRlbnNpb25zCmV5ZS1jbG9zZWQDZXllCGZlZWRiYWNrC2ZpbGUtYmluYXJ5CWZpbGUtY29kZQpmaWxlLW1lZGlhCGZpbGUtcGRmDmZpbGUtc3VibW9kdWxlFmZpbGUtc3ltbGluay1kaXJlY3RvcnkRZmlsZS1zeW1saW5rLWZpbGUIZmlsZS16aXAEZmlsZQVmaWxlcw1maWx0ZXItZmlsbGVkBmZpbHRlcgVmbGFtZQlmb2xkLWRvd24HZm9sZC11cARmb2xkDWZvbGRlci1hY3RpdmUOZm9sZGVyLWxpYnJhcnkNZm9sZGVyLW9wZW5lZAZmb2xkZXIEZ2FtZQRnZWFyBGdpZnQLZ2lzdC1zZWNyZXQKZ2l0LWNvbW1pdAtnaXQtY29tcGFyZQlnaXQtZmV0Y2gJZ2l0LW1lcmdlF2dpdC1wdWxsLXJlcXVlc3QtY2xvc2VkF2dpdC1wdWxsLXJlcXVlc3QtY3JlYXRlFmdpdC1wdWxsLXJlcXVlc3QtZHJhZnQeZ2l0LXB1bGwtcmVxdWVzdC1nby10by1jaGFuZ2VzHGdpdC1wdWxsLXJlcXVlc3QtbmV3LWNoYW5nZXMQZ2l0LXB1bGwtcmVxdWVzdA9naXQtc3Rhc2gtYXBwbHkNZ2l0LXN0YXNoLXBvcAlnaXQtc3Rhc2gNZ2l0aHViLWFjdGlvbgpnaXRodWItYWx0D2dpdGh1Yi1pbnZlcnRlZA5naXRodWItcHJvamVjdAZnaXRodWIFZ2xvYmUKZ28tdG8tZmlsZQxnby10by1zZWFyY2gHZ3JhYmJlcgpncmFwaC1sZWZ0CmdyYXBoLWxpbmUNZ3JhcGgtc2NhdHRlcgVncmFwaAdncmlwcGVyEWdyb3VwLWJ5LXJlZi10eXBlDGhlYXJ0LWZpbGxlZAVoZWFydAdoaXN0b3J5BGhvbWUPaG9yaXpvbnRhbC1ydWxlBWh1Ym90BWluYm94BmluZGVudARpbmZvBmluc2VydAdpbnNwZWN0C2lzc3VlLWRyYWZ0Dmlzc3VlLXJlb3BlbmVkBmlzc3VlcwZpdGFsaWMGamVyc2V5BGpzb24Oa2ViYWItdmVydGljYWwDa2V5A2xhdw1sYXllcnMtYWN0aXZlCmxheWVycy1kb3QGbGF5ZXJzF2xheW91dC1hY3Rpdml0eWJhci1sZWZ0GGxheW91dC1hY3Rpdml0eWJhci1yaWdodA9sYXlvdXQtY2VudGVyZWQObGF5b3V0LW1lbnViYXITbGF5b3V0LXBhbmVsLWNlbnRlchRsYXlvdXQtcGFuZWwtanVzdGlmeRFsYXlvdXQtcGFuZWwtbGVmdBBsYXlvdXQtcGFuZWwtb2ZmEmxheW91dC1wYW5lbC1yaWdodAxsYXlvdXQtcGFuZWwXbGF5b3V0LXNpZGViYXItbGVmdC1vZmYTbGF5b3V0LXNpZGViYXItbGVmdBhsYXlvdXQtc2lkZWJhci1yaWdodC1vZmYUbGF5b3V0LXNpZGViYXItcmlnaHQQbGF5b3V0LXN0YXR1c2JhcgZsYXlvdXQHbGlicmFyeRFsaWdodGJ1bGItYXV0b2ZpeBFsaWdodGJ1bGItc3BhcmtsZQlsaWdodGJ1bGINbGluay1leHRlcm5hbARsaW5rC2xpc3QtZmlsdGVyCWxpc3QtZmxhdAxsaXN0LW9yZGVyZWQObGlzdC1zZWxlY3Rpb24JbGlzdC10cmVlDmxpc3QtdW5vcmRlcmVkCmxpdmUtc2hhcmUHbG9hZGluZwhsb2NhdGlvbgpsb2NrLXNtYWxsBGxvY2sGbWFnbmV0CW1haWwtcmVhZARtYWlsCm1hcC1maWxsZWQTbWFwLXZlcnRpY2FsLWZpbGxlZAxtYXAtdmVydGljYWwDbWFwCG1hcmtkb3duCW1lZ2FwaG9uZQdtZW50aW9uBG1lbnUFbWVyZ2UKbWljLWZpbGxlZANtaWMJbWlsZXN0b25lBm1pcnJvcgxtb3J0YXItYm9hcmQEbW92ZRBtdWx0aXBsZS13aW5kb3dzBW11c2ljBG11dGUIbmV3LWZpbGUKbmV3LWZvbGRlcgduZXdsaW5lCm5vLW5ld2xpbmUEbm90ZRFub3RlYm9vay10ZW1wbGF0ZQhub3RlYm9vawhvY3RvZmFjZQxvcGVuLXByZXZpZXcMb3JnYW5pemF0aW9uBm91dHB1dAdwYWNrYWdlCHBhaW50Y2FuC3Bhc3MtZmlsbGVkBHBhc3MKcGVyY2VudGFnZQpwZXJzb24tYWRkBnBlcnNvbgVwaWFubwlwaWUtY2hhcnQDcGluDHBpbm5lZC1kaXJ0eQZwaW5uZWQLcGxheS1jaXJjbGUEcGxheQRwbHVnDXByZXNlcnZlLWNhc2UHcHJldmlldxBwcmltaXRpdmUtc3F1YXJlB3Byb2plY3QFcHVsc2UIcXVlc3Rpb24FcXVvdGULcmFkaW8tdG93ZXIJcmVhY3Rpb25zC3JlY29yZC1rZXlzDHJlY29yZC1zbWFsbAZyZWNvcmQEcmVkbwpyZWZlcmVuY2VzB3JlZnJlc2gFcmVnZXgPcmVtb3RlLWV4cGxvcmVyBnJlbW90ZQZyZW1vdmULcmVwbGFjZS1hbGwHcmVwbGFjZQVyZXBseQpyZXBvLWNsb25lCnJlcG8tZmV0Y2gPcmVwby1mb3JjZS1wdXNoC3JlcG8tZm9ya2VkCXJlcG8tcHVsbAlyZXBvLXB1c2gEcmVwbwZyZXBvcnQPcmVxdWVzdC1jaGFuZ2VzBXJvYm90BnJvY2tldBJyb290LWZvbGRlci1vcGVuZWQLcm9vdC1mb2xkZXIDcnNzBHJ1YnkJcnVuLWFib3ZlEHJ1bi1hbGwtY292ZXJhZ2UHcnVuLWFsbAlydW4tYmVsb3cMcnVuLWNvdmVyYWdlCnJ1bi1lcnJvcnMIc2F2ZS1hbGwHc2F2ZS1hcwRzYXZlC3NjcmVlbi1mdWxsDXNjcmVlbi1ub3JtYWwMc2VhcmNoLWZ1enp5C3NlYXJjaC1zdG9wBnNlYXJjaARzZW5kEnNlcnZlci1lbnZpcm9ubWVudA5zZXJ2ZXItcHJvY2VzcwZzZXJ2ZXINc2V0dGluZ3MtZ2VhcghzZXR0aW5ncwVzaGFyZQZzaGllbGQHc2lnbi1pbghzaWduLW91dAZzbWlsZXkFc25ha2UPc29ydC1wcmVjZWRlbmNlDnNvdXJjZS1jb250cm9sDnNwYXJrbGUtZmlsbGVkB3NwYXJrbGUQc3BsaXQtaG9yaXpvbnRhbA5zcGxpdC12ZXJ0aWNhbAhzcXVpcnJlbApzdGFyLWVtcHR5CXN0YXItZnVsbAlzdGFyLWhhbGYLc3RvcC1jaXJjbGUNc3Vycm91bmQtd2l0aAxzeW1ib2wtYXJyYXkOc3ltYm9sLWJvb2xlYW4Mc3ltYm9sLWNsYXNzDHN5bWJvbC1jb2xvcg9zeW1ib2wtY29uc3RhbnQSc3ltYm9sLWVudW0tbWVtYmVyC3N5bWJvbC1lbnVtDHN5bWJvbC1ldmVudAxzeW1ib2wtZmllbGQLc3ltYm9sLWZpbGUQc3ltYm9sLWludGVyZmFjZQpzeW1ib2wta2V5DnN5bWJvbC1rZXl3b3JkDXN5bWJvbC1tZXRob2QLc3ltYm9sLW1pc2MQc3ltYm9sLW5hbWVzcGFjZQ5zeW1ib2wtbnVtZXJpYw9zeW1ib2wtb3BlcmF0b3IQc3ltYm9sLXBhcmFtZXRlcg9zeW1ib2wtcHJvcGVydHkMc3ltYm9sLXJ1bGVyDnN5bWJvbC1zbmlwcGV0DXN5bWJvbC1zdHJpbmcQc3ltYm9sLXN0cnVjdHVyZQ9zeW1ib2wtdmFyaWFibGUMc3luYy1pZ25vcmVkBHN5bmMFdGFibGUDdGFnBnRhcmdldAh0YXNrbGlzdAl0ZWxlc2NvcGUNdGVybWluYWwtYmFzaAx0ZXJtaW5hbC1jbWQPdGVybWluYWwtZGViaWFuDnRlcm1pbmFsLWxpbnV4E3Rlcm1pbmFsLXBvd2Vyc2hlbGwNdGVybWluYWwtdG11eA90ZXJtaW5hbC11YnVudHUIdGVybWluYWwJdGV4dC1zaXplCnRocmVlLWJhcnMRdGh1bWJzZG93bi1maWxsZWQKdGh1bWJzZG93bg90aHVtYnN1cC1maWxsZWQIdGh1bWJzdXAFdG9vbHMFdHJhc2gNdHJpYW5nbGUtZG93bg10cmlhbmdsZS1sZWZ0DnRyaWFuZ2xlLXJpZ2h0C3RyaWFuZ2xlLXVwB3R3aXR0ZXISdHlwZS1oaWVyYXJjaHktc3ViFHR5cGUtaGllcmFyY2h5LXN1cGVyDnR5cGUtaGllcmFyY2h5BnVuZm9sZBN1bmdyb3VwLWJ5LXJlZi10eXBlBnVubG9jawZ1bm11dGUKdW52ZXJpZmllZA52YXJpYWJsZS1ncm91cA92ZXJpZmllZC1maWxsZWQIdmVyaWZpZWQIdmVyc2lvbnMJdm0tYWN0aXZlCnZtLWNvbm5lY3QKdm0tb3V0bGluZQp2bS1ydW5uaW5nAnZtAnZyD3ZzY29kZS1pbnNpZGVycwZ2c2NvZGUEd2FuZAd3YXJuaW5nBXdhdGNoCndoaXRlc3BhY2UKd2hvbGUtd29yZAZ3aW5kb3cJd29yZC13cmFwEXdvcmtzcGFjZS10cnVzdGVkEXdvcmtzcGFjZS11bmtub3duE3dvcmtzcGFjZS11bnRydXN0ZWQHem9vbS1pbgh6b29tLW91dAAA", MNe = 300; +let YU = !1; +function YNe() { + if (YU) return; + YU = !0; const s = document.createElement("style"); - s.textContent = `@font-face{font-family:codicon;font-display:block;src:url(${jNe}) format("truetype")}`, document.head.appendChild(s); + s.textContent = `@font-face{font-family:codicon;font-display:block;src:url(${TNe}) format("truetype")}`, document.head.appendChild(s); } +const kNe = self.fetch.bind(self); +self.fetch = (s, ...e) => String((s == null ? void 0 : s.url) ?? s).startsWith("inmemory:") ? Promise.reject(new TypeError("inmemory:// resolves from the schema store, not by fetch")) : kNe(s, ...e); self.MonacoEnvironment = { getWorker(s, e) { - return e === "json" ? new QNe() : new UNe(); + return e === "json" ? new ORe() : e === "yaml" ? new wNe() : new _Re(); } }; -const ZR = /* @__PURE__ */ new Map(), eWe = ["ignore", "warning", "error"], _R = /* @__PURE__ */ new Map(); -let tWe = 0; -function w8() { - const s = [..._R.values()]; - g8.json.jsonDefaults.setDiagnosticsOptions({ +self.monaco || (self.monaco = C0); +let xN = null; +function vNe() { + return xN || (xN = RNe(C0, { enableSchemaRequest: !1, schemas: [] })), xN; +} +let kU = !1; +function JNe() { + kU || (kU = !0, Xy.register({ id: "turtle", extensions: [".ttl"], aliases: ["Turtle"] }), Xy.setLanguageConfiguration("turtle", { + comments: { lineComment: "#" }, + brackets: [["[", "]"], ["(", ")"]], + autoClosingPairs: [ + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "<", close: ">" } + ] + }), Xy.setMonarchTokensProvider("turtle", { + defaultToken: "", + tokenizer: { + root: [ + [/#.*$/, "comment"], + [/@(prefix|base)\b/, "keyword"], + [/\b(a|true|false)\b/, "keyword"], + [/<[^<>"{}|^`\s]*>/, "type.identifier"], + [/"""/, { token: "string", next: "@longString" }], + [/"(?:[^"\\]|\\.)*"(?:\^\^|@[a-zA-Z][a-zA-Z0-9-]*)?/, "string"], + [/[+-]?\d+(\.\d+)?([eE][+-]?\d+)?/, "number"], + [/[A-Za-z_][\w.-]*:[\w.%-]*/, "identifier"], + [/:[\w.%-]+/, "identifier"], + [/[;,.\[\]()]/, "delimiter"] + ], + longString: [ + [/"""/, { token: "string", next: "@pop" }], + [/./, "string"] + ] + } + })); +} +const Qk = /* @__PURE__ */ new Map(), HNe = "inmemory://panelini/", Ok = /* @__PURE__ */ new Map(); +function ENe() { + const s = /* @__PURE__ */ new Map(); + for (const e of Ok.values()) + for (const [t, i] of Object.entries(e || {})) { + const n = /^[a-z][a-z0-9+.-]*:/i.test(t) ? t : new URL(t, HNe).href; + s.set(n, i); + } + return s; +} +const DNe = ["ignore", "warning", "error"], jk = /* @__PURE__ */ new Map(), qk = /* @__PURE__ */ new Map(); +let FNe = 0, CN = !1; +function LC() { + CN || (CN = !0, setTimeout(() => { + CN = !1, zNe(); + }, 50)); +} +function zNe() { + const s = [...jk.values()], e = [...qk.values()].some(Boolean), t = [...Qk].map(([n, o]) => ({ + uri: `${n}.schema`, + fileMatch: [n], + schema: o + })), i = [...ENe()].map(([n, o]) => ({ uri: n, schema: o })); + Xy.json.jsonDefaults.setDiagnosticsOptions({ validate: !0, - enableSchemaRequest: !1, - schemaRequest: eWe.find((e) => s.includes(e)) ?? "warning", - schemas: [...ZR].map(([e, t]) => ({ - uri: `${e}#schema`, - fileMatch: [e], - schema: t - })) + enableSchemaRequest: e, + schemaRequest: DNe.find((n) => s.includes(n)) ?? "warning", + schemas: [...t, ...i] + }), vNe().update({ + enableSchemaRequest: e, + schemas: [...t, ...i] }); } -function d2(s, e) { - e ? _R.set(s, e) : _R.delete(s), w8(); +function RN(s, e) { + e ? jk.set(s, e) : jk.delete(s), LC(); +} +function NN(s, e) { + e ? Qk.set(s, e) : Qk.delete(s), LC(); } -function h2(s, e) { - e ? ZR.set(s, e) : ZR.delete(s), w8(); +function wN(s, e) { + e ? qk.set(s, !0) : qk.delete(s), LC(); } -function yDe({ model: s, el: e }) { - $Ne(), e.style.height = "100%"; +function TN(s, e) { + e && Object.keys(e).length ? Ok.set(s, e) : Ok.delete(s), LC(); +} +function b5e({ model: s, el: e }) { + YNe(), JNe(), e.style.height = "100%"; const t = document.createElement("div"); t.style.cssText = "width:100%;height:100%;min-height:150px", e.appendChild(t); - const i = u8.parse(`inmemory://panelini/editor-${tWe++}.json`), n = xy.createModel(s.get("value"), s.get("language"), i); - h2(i.toString(), s.get("json_schema")), d2(i.toString(), s.get("schema_request")); - const o = xy.create(t, { + const i = _8.parse(`inmemory://panelini/editor-${FNe++}.json`), n = Yf.createModel(s.get("value"), s.get("language"), i); + NN(i.toString(), s.get("json_schema")), TN(i.toString(), s.get("schema_store")), RN(i.toString(), s.get("schema_request")), wN(i.toString(), s.get("enable_schema_request")); + const o = Yf.create(t, { model: n, theme: s.get("theme"), readOnly: s.get("read_only"), @@ -108903,17 +109900,17 @@ function yDe({ model: s, el: e }) { scrollBeyondLastLine: !1, ...s.get("options") || {} }); - t.addEventListener("mousemove", (a) => a.stopPropagation()); - let r = !1, l = null; + s.set("ready", !0), s.save_changes(), t.addEventListener("mousemove", (c) => c.stopPropagation()); + let l = !1, r = null; return n.onDidChangeContent(() => { - r || (clearTimeout(l), l = setTimeout(() => { + l || (clearTimeout(r), r = setTimeout(() => { s.set("value", n.getValue()), s.save_changes(); - }, qNe)); + }, MNe)); }), s.on("change:value", () => { - const a = s.get("value"); - a !== n.getValue() && (r = !0, n.setValue(a), r = !1); - }), s.on("change:json_schema", () => h2(i.toString(), s.get("json_schema"))), s.on("change:schema_request", () => d2(i.toString(), s.get("schema_request"))), s.on("change:language", () => xy.setModelLanguage(n, s.get("language"))), s.on("change:theme", () => xy.setTheme(s.get("theme"))), s.on("change:read_only", () => o.updateOptions({ readOnly: s.get("read_only") })), () => { - clearTimeout(l), o.dispose(), n.dispose(), h2(i.toString(), null), d2(i.toString(), null); + const c = s.get("value"); + c !== n.getValue() && (l = !0, n.setValue(c), l = !1); + }), s.on("change:json_schema", () => NN(i.toString(), s.get("json_schema"))), s.on("change:schema_store", () => TN(i.toString(), s.get("schema_store"))), s.on("change:schema_request", () => RN(i.toString(), s.get("schema_request"))), s.on("change:enable_schema_request", () => wN(i.toString(), s.get("enable_schema_request"))), s.on("change:language", () => Yf.setModelLanguage(n, s.get("language"))), s.on("change:theme", () => Yf.setTheme(s.get("theme"))), s.on("change:read_only", () => o.updateOptions({ readOnly: s.get("read_only") })), () => { + clearTimeout(r), o.dispose(), n.dispose(), NN(i.toString(), null), TN(i.toString(), null), RN(i.toString(), null), wN(i.toString(), !1); }; } /*!----------------------------------------------------------------------------- @@ -108922,14 +109919,14 @@ function yDe({ model: s, el: e }) { * Released under the MIT license * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt *-----------------------------------------------------------------------------*/ -var iWe = Object.defineProperty, nWe = Object.getOwnPropertyDescriptor, sWe = Object.getOwnPropertyNames, oWe = Object.prototype.hasOwnProperty, rWe = (s, e, t, i) => { +var ANe = Object.defineProperty, KNe = Object.getOwnPropertyDescriptor, UNe = Object.getOwnPropertyNames, PNe = Object.prototype.hasOwnProperty, BNe = (s, e, t, i) => { if (e && typeof e == "object" || typeof e == "function") - for (let n of sWe(e)) - !oWe.call(s, n) && n !== t && iWe(s, n, { get: () => e[n], enumerable: !(i = nWe(e, n)) || i.enumerable }); + for (let n of UNe(e)) + !PNe.call(s, n) && n !== t && ANe(s, n, { get: () => e[n], enumerable: !(i = KNe(e, n)) || i.enumerable }); return s; -}, lWe = (s, e, t) => (rWe(s, e, "default"), t), At = {}; -lWe(At, m8); -var aWe = 2 * 60 * 1e3, C8 = class { +}, _Ne = (s, e, t) => (BNe(s, e, "default"), t), Vt = {}; +_Ne(Vt, C0); +var QNe = 2 * 60 * 1e3, h6 = class { constructor(s) { this._defaults = s, this._worker = null, this._client = null, this._idleCheckInterval = window.setInterval(() => this._checkIfIdle(), 30 * 1e3), this._lastUsedTime = 0, this._configChangeListener = this._defaults.onDidChange(() => this._stopWorker()); } @@ -108942,10 +109939,10 @@ var aWe = 2 * 60 * 1e3, C8 = class { _checkIfIdle() { if (!this._worker) return; - Date.now() - this._lastUsedTime > aWe && this._stopWorker(); + Date.now() - this._lastUsedTime > QNe && this._stopWorker(); } _getClient() { - return this._lastUsedTime = Date.now(), this._client || (this._worker = At.editor.createWebWorker({ + return this._lastUsedTime = Date.now(), this._client || (this._worker = Vt.editor.createWebWorker({ // module that exports the create() method and returns a `JSONWorker` instance moduleId: "vs/language/json/jsonWorker", label: this._defaults.languageId, @@ -108966,40 +109963,40 @@ var aWe = 2 * 60 * 1e3, C8 = class { return this._worker.withSyncedResources(s); }).then((t) => e); } -}, eO; +}, vU; (function(s) { function e(t) { return typeof t == "string"; } s.is = e; -})(eO || (eO = {})); -var IR; +})(vU || (vU = {})); +var $k; (function(s) { function e(t) { return typeof t == "string"; } s.is = e; -})(IR || (IR = {})); -var tO; +})($k || ($k = {})); +var JU; (function(s) { s.MIN_VALUE = -2147483648, s.MAX_VALUE = 2147483647; function e(t) { return typeof t == "number" && s.MIN_VALUE <= t && t <= s.MAX_VALUE; } s.is = e; -})(tO || (tO = {})); -var OM; +})(JU || (JU = {})); +var l2; (function(s) { s.MIN_VALUE = 0, s.MAX_VALUE = 2147483647; function e(t) { return typeof t == "number" && s.MIN_VALUE <= t && t <= s.MAX_VALUE; } s.is = e; -})(OM || (OM = {})); -var wl; +})(l2 || (l2 = {})); +var Vr; (function(s) { function e(i, n) { - return i === Number.MAX_VALUE && (i = OM.MAX_VALUE), n === Number.MAX_VALUE && (n = OM.MAX_VALUE), { line: i, character: n }; + return i === Number.MAX_VALUE && (i = l2.MAX_VALUE), n === Number.MAX_VALUE && (n = l2.MAX_VALUE), { line: i, character: n }; } s.create = e; function t(i) { @@ -109007,24 +110004,24 @@ var wl; return $.objectLiteral(n) && $.uinteger(n.line) && $.uinteger(n.character); } s.is = t; -})(wl || (wl = {})); -var pn; +})(Vr || (Vr = {})); +var gn; (function(s) { - function e(i, n, o, r) { - if ($.uinteger(i) && $.uinteger(n) && $.uinteger(o) && $.uinteger(r)) - return { start: wl.create(i, n), end: wl.create(o, r) }; - if (wl.is(i) && wl.is(n)) + function e(i, n, o, l) { + if ($.uinteger(i) && $.uinteger(n) && $.uinteger(o) && $.uinteger(l)) + return { start: Vr.create(i, n), end: Vr.create(o, l) }; + if (Vr.is(i) && Vr.is(n)) return { start: i, end: n }; - throw new Error(`Range#create called with invalid arguments[${i}, ${n}, ${o}, ${r}]`); + throw new Error(`Range#create called with invalid arguments[${i}, ${n}, ${o}, ${l}]`); } s.create = e; function t(i) { let n = i; - return $.objectLiteral(n) && wl.is(n.start) && wl.is(n.end); + return $.objectLiteral(n) && Vr.is(n.start) && Vr.is(n.end); } s.is = t; -})(pn || (pn = {})); -var HM; +})(gn || (gn = {})); +var r2; (function(s) { function e(i, n) { return { uri: i, range: n }; @@ -109032,30 +110029,30 @@ var HM; s.create = e; function t(i) { let n = i; - return $.objectLiteral(n) && pn.is(n.range) && ($.string(n.uri) || $.undefined(n.uri)); + return $.objectLiteral(n) && gn.is(n.range) && ($.string(n.uri) || $.undefined(n.uri)); } s.is = t; -})(HM || (HM = {})); -var iO; +})(r2 || (r2 = {})); +var HU; (function(s) { - function e(i, n, o, r) { - return { targetUri: i, targetRange: n, targetSelectionRange: o, originSelectionRange: r }; + function e(i, n, o, l) { + return { targetUri: i, targetRange: n, targetSelectionRange: o, originSelectionRange: l }; } s.create = e; function t(i) { let n = i; - return $.objectLiteral(n) && pn.is(n.targetRange) && $.string(n.targetUri) && pn.is(n.targetSelectionRange) && (pn.is(n.originSelectionRange) || $.undefined(n.originSelectionRange)); + return $.objectLiteral(n) && gn.is(n.targetRange) && $.string(n.targetUri) && gn.is(n.targetSelectionRange) && (gn.is(n.originSelectionRange) || $.undefined(n.originSelectionRange)); } s.is = t; -})(iO || (iO = {})); -var NR; +})(HU || (HU = {})); +var ev; (function(s) { - function e(i, n, o, r) { + function e(i, n, o, l) { return { red: i, green: n, blue: o, - alpha: r + alpha: l }; } s.create = e; @@ -109064,8 +110061,8 @@ var NR; return $.objectLiteral(n) && $.numberRange(n.red, 0, 1) && $.numberRange(n.green, 0, 1) && $.numberRange(n.blue, 0, 1) && $.numberRange(n.alpha, 0, 1); } s.is = t; -})(NR || (NR = {})); -var nO; +})(ev || (ev = {})); +var EU; (function(s) { function e(i, n) { return { @@ -109076,11 +110073,11 @@ var nO; s.create = e; function t(i) { const n = i; - return $.objectLiteral(n) && pn.is(n.range) && NR.is(n.color); + return $.objectLiteral(n) && gn.is(n.range) && ev.is(n.color); } s.is = t; -})(nO || (nO = {})); -var sO; +})(EU || (EU = {})); +var DU; (function(s) { function e(i, n, o) { return { @@ -109092,22 +110089,22 @@ var sO; s.create = e; function t(i) { const n = i; - return $.objectLiteral(n) && $.string(n.label) && ($.undefined(n.textEdit) || Hb.is(n)) && ($.undefined(n.additionalTextEdits) || $.typedArray(n.additionalTextEdits, Hb.is)); + return $.objectLiteral(n) && $.string(n.label) && ($.undefined(n.textEdit) || qZ.is(n)) && ($.undefined(n.additionalTextEdits) || $.typedArray(n.additionalTextEdits, qZ.is)); } s.is = t; -})(sO || (sO = {})); -var hw; +})(DU || (DU = {})); +var Vy; (function(s) { s.Comment = "comment", s.Imports = "imports", s.Region = "region"; -})(hw || (hw = {})); -var oO; +})(Vy || (Vy = {})); +var FU; (function(s) { - function e(i, n, o, r, l, a) { - const c = { + function e(i, n, o, l, r, c) { + const d = { startLine: i, endLine: n }; - return $.defined(o) && (c.startCharacter = o), $.defined(r) && (c.endCharacter = r), $.defined(l) && (c.kind = l), $.defined(a) && (c.collapsedText = a), c; + return $.defined(o) && (d.startCharacter = o), $.defined(l) && (d.endCharacter = l), $.defined(r) && (d.kind = r), $.defined(c) && (d.collapsedText = c), d; } s.create = e; function t(i) { @@ -109115,8 +110112,8 @@ var oO; return $.objectLiteral(n) && $.uinteger(n.startLine) && $.uinteger(n.startLine) && ($.undefined(n.startCharacter) || $.uinteger(n.startCharacter)) && ($.undefined(n.endCharacter) || $.uinteger(n.endCharacter)) && ($.undefined(n.kind) || $.string(n.kind)); } s.is = t; -})(oO || (oO = {})); -var WR; +})(FU || (FU = {})); +var tv; (function(s) { function e(i, n) { return { @@ -109127,45 +110124,45 @@ var WR; s.create = e; function t(i) { let n = i; - return $.defined(n) && HM.is(n.location) && $.string(n.message); + return $.defined(n) && r2.is(n.location) && $.string(n.message); } s.is = t; -})(WR || (WR = {})); -var tf; +})(tv || (tv = {})); +var cg; (function(s) { s.Error = 1, s.Warning = 2, s.Information = 3, s.Hint = 4; -})(tf || (tf = {})); -var rO; +})(cg || (cg = {})); +var zU; (function(s) { s.Unnecessary = 1, s.Deprecated = 2; -})(rO || (rO = {})); -var lO; +})(zU || (zU = {})); +var AU; (function(s) { function e(t) { const i = t; return $.objectLiteral(i) && $.string(i.href); } s.is = e; -})(lO || (lO = {})); -var JM; +})(AU || (AU = {})); +var c2; (function(s) { - function e(i, n, o, r, l, a) { - let c = { range: i, message: n }; - return $.defined(o) && (c.severity = o), $.defined(r) && (c.code = r), $.defined(l) && (c.source = l), $.defined(a) && (c.relatedInformation = a), c; + function e(i, n, o, l, r, c) { + let d = { range: i, message: n }; + return $.defined(o) && (d.severity = o), $.defined(l) && (d.code = l), $.defined(r) && (d.source = r), $.defined(c) && (d.relatedInformation = c), d; } s.create = e; function t(i) { var n; let o = i; - return $.defined(o) && pn.is(o.range) && $.string(o.message) && ($.number(o.severity) || $.undefined(o.severity)) && ($.integer(o.code) || $.string(o.code) || $.undefined(o.code)) && ($.undefined(o.codeDescription) || $.string((n = o.codeDescription) === null || n === void 0 ? void 0 : n.href)) && ($.string(o.source) || $.undefined(o.source)) && ($.undefined(o.relatedInformation) || $.typedArray(o.relatedInformation, WR.is)); + return $.defined(o) && gn.is(o.range) && $.string(o.message) && ($.number(o.severity) || $.undefined(o.severity)) && ($.integer(o.code) || $.string(o.code) || $.undefined(o.code)) && ($.undefined(o.codeDescription) || $.string((n = o.codeDescription) === null || n === void 0 ? void 0 : n.href)) && ($.string(o.source) || $.undefined(o.source)) && ($.undefined(o.relatedInformation) || $.typedArray(o.relatedInformation, tv.is)); } s.is = t; -})(JM || (JM = {})); -var Ob; +})(c2 || (c2 = {})); +var jZ; (function(s) { function e(i, n, ...o) { - let r = { title: i, command: n }; - return $.defined(o) && o.length > 0 && (r.arguments = o), r; + let l = { title: i, command: n }; + return $.defined(o) && o.length > 0 && (l.arguments = o), l; } s.create = e; function t(i) { @@ -109173,15 +110170,15 @@ var Ob; return $.defined(n) && $.string(n.title) && $.string(n.command); } s.is = t; -})(Ob || (Ob = {})); -var Hb; +})(jZ || (jZ = {})); +var qZ; (function(s) { - function e(o, r) { - return { range: o, newText: r }; + function e(o, l) { + return { range: o, newText: l }; } s.replace = e; - function t(o, r) { - return { range: { start: o, end: o }, newText: r }; + function t(o, l) { + return { range: { start: o, end: o }, newText: l }; } s.insert = t; function i(o) { @@ -109189,16 +110186,16 @@ var Hb; } s.del = i; function n(o) { - const r = o; - return $.objectLiteral(r) && $.string(r.newText) && pn.is(r.range); + const l = o; + return $.objectLiteral(l) && $.string(l.newText) && gn.is(l.range); } s.is = n; -})(Hb || (Hb = {})); -var vR; +})(qZ || (qZ = {})); +var iv; (function(s) { function e(i, n, o) { - const r = { label: i }; - return n !== void 0 && (r.needsConfirmation = n), o !== void 0 && (r.description = o), r; + const l = { label: i }; + return n !== void 0 && (l.needsConfirmation = n), o !== void 0 && (l.description = o), l; } s.create = e; function t(i) { @@ -109206,36 +110203,36 @@ var vR; return $.objectLiteral(n) && $.string(n.label) && ($.boolean(n.needsConfirmation) || n.needsConfirmation === void 0) && ($.string(n.description) || n.description === void 0); } s.is = t; -})(vR || (vR = {})); -var Jb; +})(iv || (iv = {})); +var $Z; (function(s) { function e(t) { const i = t; return $.string(i); } s.is = e; -})(Jb || (Jb = {})); -var aO; +})($Z || ($Z = {})); +var KU; (function(s) { - function e(o, r, l) { - return { range: o, newText: r, annotationId: l }; + function e(o, l, r) { + return { range: o, newText: l, annotationId: r }; } s.replace = e; - function t(o, r, l) { - return { range: { start: o, end: o }, newText: r, annotationId: l }; + function t(o, l, r) { + return { range: { start: o, end: o }, newText: l, annotationId: r }; } s.insert = t; - function i(o, r) { - return { range: o, newText: "", annotationId: r }; + function i(o, l) { + return { range: o, newText: "", annotationId: l }; } s.del = i; function n(o) { - const r = o; - return Hb.is(r) && (vR.is(r.annotationId) || Jb.is(r.annotationId)); + const l = o; + return qZ.is(l) && (iv.is(l.annotationId) || $Z.is(l.annotationId)); } s.is = n; -})(aO || (aO = {})); -var TR; +})(KU || (KU = {})); +var nv; (function(s) { function e(i, n) { return { textDocument: i, edits: n }; @@ -109243,68 +110240,68 @@ var TR; s.create = e; function t(i) { let n = i; - return $.defined(n) && RR.is(n.textDocument) && Array.isArray(n.edits); + return $.defined(n) && cv.is(n.textDocument) && Array.isArray(n.edits); } s.is = t; -})(TR || (TR = {})); -var DR; +})(nv || (nv = {})); +var sv; (function(s) { function e(i, n, o) { - let r = { + let l = { kind: "create", uri: i }; - return n !== void 0 && (n.overwrite !== void 0 || n.ignoreIfExists !== void 0) && (r.options = n), o !== void 0 && (r.annotationId = o), r; + return n !== void 0 && (n.overwrite !== void 0 || n.ignoreIfExists !== void 0) && (l.options = n), o !== void 0 && (l.annotationId = o), l; } s.create = e; function t(i) { let n = i; - return n && n.kind === "create" && $.string(n.uri) && (n.options === void 0 || (n.options.overwrite === void 0 || $.boolean(n.options.overwrite)) && (n.options.ignoreIfExists === void 0 || $.boolean(n.options.ignoreIfExists))) && (n.annotationId === void 0 || Jb.is(n.annotationId)); + return n && n.kind === "create" && $.string(n.uri) && (n.options === void 0 || (n.options.overwrite === void 0 || $.boolean(n.options.overwrite)) && (n.options.ignoreIfExists === void 0 || $.boolean(n.options.ignoreIfExists))) && (n.annotationId === void 0 || $Z.is(n.annotationId)); } s.is = t; -})(DR || (DR = {})); -var VR; +})(sv || (sv = {})); +var ov; (function(s) { - function e(i, n, o, r) { - let l = { + function e(i, n, o, l) { + let r = { kind: "rename", oldUri: i, newUri: n }; - return o !== void 0 && (o.overwrite !== void 0 || o.ignoreIfExists !== void 0) && (l.options = o), r !== void 0 && (l.annotationId = r), l; + return o !== void 0 && (o.overwrite !== void 0 || o.ignoreIfExists !== void 0) && (r.options = o), l !== void 0 && (r.annotationId = l), r; } s.create = e; function t(i) { let n = i; - return n && n.kind === "rename" && $.string(n.oldUri) && $.string(n.newUri) && (n.options === void 0 || (n.options.overwrite === void 0 || $.boolean(n.options.overwrite)) && (n.options.ignoreIfExists === void 0 || $.boolean(n.options.ignoreIfExists))) && (n.annotationId === void 0 || Jb.is(n.annotationId)); + return n && n.kind === "rename" && $.string(n.oldUri) && $.string(n.newUri) && (n.options === void 0 || (n.options.overwrite === void 0 || $.boolean(n.options.overwrite)) && (n.options.ignoreIfExists === void 0 || $.boolean(n.options.ignoreIfExists))) && (n.annotationId === void 0 || $Z.is(n.annotationId)); } s.is = t; -})(VR || (VR = {})); -var kR; +})(ov || (ov = {})); +var lv; (function(s) { function e(i, n, o) { - let r = { + let l = { kind: "delete", uri: i }; - return n !== void 0 && (n.recursive !== void 0 || n.ignoreIfNotExists !== void 0) && (r.options = n), o !== void 0 && (r.annotationId = o), r; + return n !== void 0 && (n.recursive !== void 0 || n.ignoreIfNotExists !== void 0) && (l.options = n), o !== void 0 && (l.annotationId = o), l; } s.create = e; function t(i) { let n = i; - return n && n.kind === "delete" && $.string(n.uri) && (n.options === void 0 || (n.options.recursive === void 0 || $.boolean(n.options.recursive)) && (n.options.ignoreIfNotExists === void 0 || $.boolean(n.options.ignoreIfNotExists))) && (n.annotationId === void 0 || Jb.is(n.annotationId)); + return n && n.kind === "delete" && $.string(n.uri) && (n.options === void 0 || (n.options.recursive === void 0 || $.boolean(n.options.recursive)) && (n.options.ignoreIfNotExists === void 0 || $.boolean(n.options.ignoreIfNotExists))) && (n.annotationId === void 0 || $Z.is(n.annotationId)); } s.is = t; -})(kR || (kR = {})); -var GR; +})(lv || (lv = {})); +var rv; (function(s) { function e(t) { let i = t; - return i && (i.changes !== void 0 || i.documentChanges !== void 0) && (i.documentChanges === void 0 || i.documentChanges.every((n) => $.string(n.kind) ? DR.is(n) || VR.is(n) || kR.is(n) : TR.is(n))); + return i && (i.changes !== void 0 || i.documentChanges !== void 0) && (i.documentChanges === void 0 || i.documentChanges.every((n) => $.string(n.kind) ? sv.is(n) || ov.is(n) || lv.is(n) : nv.is(n))); } s.is = e; -})(GR || (GR = {})); -var cO; +})(rv || (rv = {})); +var UU; (function(s) { function e(i) { return { uri: i }; @@ -109315,8 +110312,8 @@ var cO; return $.defined(n) && $.string(n.uri); } s.is = t; -})(cO || (cO = {})); -var dO; +})(UU || (UU = {})); +var PU; (function(s) { function e(i, n) { return { uri: i, version: n }; @@ -109327,8 +110324,8 @@ var dO; return $.defined(n) && $.string(n.uri) && $.integer(n.version); } s.is = t; -})(dO || (dO = {})); -var RR; +})(PU || (PU = {})); +var cv; (function(s) { function e(i, n) { return { uri: i, version: n }; @@ -109339,11 +110336,11 @@ var RR; return $.defined(n) && $.string(n.uri) && (n.version === null || $.integer(n.version)); } s.is = t; -})(RR || (RR = {})); -var hO; +})(cv || (cv = {})); +var BU; (function(s) { - function e(i, n, o, r) { - return { uri: i, languageId: n, version: o, text: r }; + function e(i, n, o, l) { + return { uri: i, languageId: n, version: o, text: l }; } s.create = e; function t(i) { @@ -109351,8 +110348,8 @@ var hO; return $.defined(n) && $.string(n.uri) && $.string(n.languageId) && $.integer(n.version) && $.string(n.text); } s.is = t; -})(hO || (hO = {})); -var ER; +})(BU || (BU = {})); +var dv; (function(s) { s.PlainText = "plaintext", s.Markdown = "markdown"; function e(t) { @@ -109360,28 +110357,28 @@ var ER; return i === s.PlainText || i === s.Markdown; } s.is = e; -})(ER || (ER = {})); -var rC; +})(dv || (dv = {})); +var yG; (function(s) { function e(t) { const i = t; - return $.objectLiteral(t) && ER.is(i.kind) && $.string(i.value); + return $.objectLiteral(t) && dv.is(i.kind) && $.string(i.value); } s.is = e; -})(rC || (rC = {})); -var Sn; +})(yG || (yG = {})); +var Xn; (function(s) { s.Text = 1, s.Method = 2, s.Function = 3, s.Constructor = 4, s.Field = 5, s.Variable = 6, s.Class = 7, s.Interface = 8, s.Module = 9, s.Property = 10, s.Unit = 11, s.Value = 12, s.Enum = 13, s.Keyword = 14, s.Snippet = 15, s.Color = 16, s.File = 17, s.Reference = 18, s.Folder = 19, s.EnumMember = 20, s.Constant = 21, s.Struct = 22, s.Event = 23, s.Operator = 24, s.TypeParameter = 25; -})(Sn || (Sn = {})); -var XR; +})(Xn || (Xn = {})); +var av; (function(s) { s.PlainText = 1, s.Snippet = 2; -})(XR || (XR = {})); -var uO; +})(av || (av = {})); +var _U; (function(s) { s.Deprecated = 1; -})(uO || (uO = {})); -var gO; +})(_U || (_U = {})); +var QU; (function(s) { function e(i, n, o) { return { newText: i, insert: n, replace: o }; @@ -109389,37 +110386,37 @@ var gO; s.create = e; function t(i) { const n = i; - return n && $.string(n.newText) && pn.is(n.insert) && pn.is(n.replace); + return n && $.string(n.newText) && gn.is(n.insert) && gn.is(n.replace); } s.is = t; -})(gO || (gO = {})); -var mO; +})(QU || (QU = {})); +var OU; (function(s) { s.asIs = 1, s.adjustIndentation = 2; -})(mO || (mO = {})); -var pO; +})(OU || (OU = {})); +var jU; (function(s) { function e(t) { const i = t; return i && ($.string(i.detail) || i.detail === void 0) && ($.string(i.description) || i.description === void 0); } s.is = e; -})(pO || (pO = {})); -var fO; +})(jU || (jU = {})); +var qU; (function(s) { function e(t) { return { label: t }; } s.create = e; -})(fO || (fO = {})); -var bO; +})(qU || (qU = {})); +var $U; (function(s) { function e(t, i) { return { items: t || [], isIncomplete: !!i }; } s.create = e; -})(bO || (bO = {})); -var UM; +})($U || ($U = {})); +var d2; (function(s) { function e(i) { return i.replace(/[\\`*_{}[\]()#+\-.!]/g, "\\$&"); @@ -109430,123 +110427,123 @@ var UM; return $.string(n) || $.objectLiteral(n) && $.string(n.language) && $.string(n.value); } s.is = t; -})(UM || (UM = {})); -var yO; +})(d2 || (d2 = {})); +var eP; (function(s) { function e(t) { let i = t; - return !!i && $.objectLiteral(i) && (rC.is(i.contents) || UM.is(i.contents) || $.typedArray(i.contents, UM.is)) && (t.range === void 0 || pn.is(t.range)); + return !!i && $.objectLiteral(i) && (yG.is(i.contents) || d2.is(i.contents) || $.typedArray(i.contents, d2.is)) && (t.range === void 0 || gn.is(t.range)); } s.is = e; -})(yO || (yO = {})); -var wO; +})(eP || (eP = {})); +var tP; (function(s) { function e(t, i) { return i ? { label: t, documentation: i } : { label: t }; } s.create = e; -})(wO || (wO = {})); -var CO; +})(tP || (tP = {})); +var iP; (function(s) { function e(t, i, ...n) { let o = { label: t }; return $.defined(i) && (o.documentation = i), $.defined(n) ? o.parameters = n : o.parameters = [], o; } s.create = e; -})(CO || (CO = {})); -var uw; +})(iP || (iP = {})); +var Ly; (function(s) { s.Text = 1, s.Read = 2, s.Write = 3; -})(uw || (uw = {})); -var SO; +})(Ly || (Ly = {})); +var nP; (function(s) { function e(t, i) { let n = { range: t }; return $.number(i) && (n.kind = i), n; } s.create = e; -})(SO || (SO = {})); -var Ln; +})(nP || (nP = {})); +var Vn; (function(s) { s.File = 1, s.Module = 2, s.Namespace = 3, s.Package = 4, s.Class = 5, s.Method = 6, s.Property = 7, s.Field = 8, s.Constructor = 9, s.Enum = 10, s.Interface = 11, s.Function = 12, s.Variable = 13, s.Constant = 14, s.String = 15, s.Number = 16, s.Boolean = 17, s.Array = 18, s.Object = 19, s.Key = 20, s.Null = 21, s.EnumMember = 22, s.Struct = 23, s.Event = 24, s.Operator = 25, s.TypeParameter = 26; -})(Ln || (Ln = {})); -var LO; +})(Vn || (Vn = {})); +var sP; (function(s) { s.Deprecated = 1; -})(LO || (LO = {})); -var AO; +})(sP || (sP = {})); +var oP; (function(s) { - function e(t, i, n, o, r) { - let l = { + function e(t, i, n, o, l) { + let r = { name: t, kind: i, location: { uri: o, range: n } }; - return r && (l.containerName = r), l; + return l && (r.containerName = l), r; } s.create = e; -})(AO || (AO = {})); -var xO; +})(oP || (oP = {})); +var lP; (function(s) { function e(t, i, n, o) { return o !== void 0 ? { name: t, kind: i, location: { uri: n, range: o } } : { name: t, kind: i, location: { uri: n } }; } s.create = e; -})(xO || (xO = {})); -var MO; +})(lP || (lP = {})); +var rP; (function(s) { - function e(i, n, o, r, l, a) { - let c = { + function e(i, n, o, l, r, c) { + let d = { name: i, detail: n, kind: o, - range: r, - selectionRange: l + range: l, + selectionRange: r }; - return a !== void 0 && (c.children = a), c; + return c !== void 0 && (d.children = c), d; } s.create = e; function t(i) { let n = i; - return n && $.string(n.name) && $.number(n.kind) && pn.is(n.range) && pn.is(n.selectionRange) && (n.detail === void 0 || $.string(n.detail)) && (n.deprecated === void 0 || $.boolean(n.deprecated)) && (n.children === void 0 || Array.isArray(n.children)) && (n.tags === void 0 || Array.isArray(n.tags)); + return n && $.string(n.name) && $.number(n.kind) && gn.is(n.range) && gn.is(n.selectionRange) && (n.detail === void 0 || $.string(n.detail)) && (n.deprecated === void 0 || $.boolean(n.deprecated)) && (n.children === void 0 || Array.isArray(n.children)) && (n.tags === void 0 || Array.isArray(n.tags)); } s.is = t; -})(MO || (MO = {})); -var ZO; +})(rP || (rP = {})); +var cP; (function(s) { s.Empty = "", s.QuickFix = "quickfix", s.Refactor = "refactor", s.RefactorExtract = "refactor.extract", s.RefactorInline = "refactor.inline", s.RefactorRewrite = "refactor.rewrite", s.Source = "source", s.SourceOrganizeImports = "source.organizeImports", s.SourceFixAll = "source.fixAll"; -})(ZO || (ZO = {})); -var KM; +})(cP || (cP = {})); +var a2; (function(s) { s.Invoked = 1, s.Automatic = 2; -})(KM || (KM = {})); -var _O; +})(a2 || (a2 = {})); +var dP; (function(s) { function e(i, n, o) { - let r = { diagnostics: i }; - return n != null && (r.only = n), o != null && (r.triggerKind = o), r; + let l = { diagnostics: i }; + return n != null && (l.only = n), o != null && (l.triggerKind = o), l; } s.create = e; function t(i) { let n = i; - return $.defined(n) && $.typedArray(n.diagnostics, JM.is) && (n.only === void 0 || $.typedArray(n.only, $.string)) && (n.triggerKind === void 0 || n.triggerKind === KM.Invoked || n.triggerKind === KM.Automatic); + return $.defined(n) && $.typedArray(n.diagnostics, c2.is) && (n.only === void 0 || $.typedArray(n.only, $.string)) && (n.triggerKind === void 0 || n.triggerKind === a2.Invoked || n.triggerKind === a2.Automatic); } s.is = t; -})(_O || (_O = {})); -var IO; +})(dP || (dP = {})); +var aP; (function(s) { function e(i, n, o) { - let r = { title: i }, l = !0; - return typeof n == "string" ? (l = !1, r.kind = n) : Ob.is(n) ? r.command = n : r.edit = n, l && o !== void 0 && (r.kind = o), r; + let l = { title: i }, r = !0; + return typeof n == "string" ? (r = !1, l.kind = n) : jZ.is(n) ? l.command = n : l.edit = n, r && o !== void 0 && (l.kind = o), l; } s.create = e; function t(i) { let n = i; - return n && $.string(n.title) && (n.diagnostics === void 0 || $.typedArray(n.diagnostics, JM.is)) && (n.kind === void 0 || $.string(n.kind)) && (n.edit !== void 0 || n.command !== void 0) && (n.command === void 0 || Ob.is(n.command)) && (n.isPreferred === void 0 || $.boolean(n.isPreferred)) && (n.edit === void 0 || GR.is(n.edit)); + return n && $.string(n.title) && (n.diagnostics === void 0 || $.typedArray(n.diagnostics, c2.is)) && (n.kind === void 0 || $.string(n.kind)) && (n.edit !== void 0 || n.command !== void 0) && (n.command === void 0 || jZ.is(n.command)) && (n.isPreferred === void 0 || $.boolean(n.isPreferred)) && (n.edit === void 0 || rv.is(n.edit)); } s.is = t; -})(IO || (IO = {})); -var NO; +})(aP || (aP = {})); +var hP; (function(s) { function e(i, n) { let o = { range: i }; @@ -109555,11 +110552,11 @@ var NO; s.create = e; function t(i) { let n = i; - return $.defined(n) && pn.is(n.range) && ($.undefined(n.command) || Ob.is(n.command)); + return $.defined(n) && gn.is(n.range) && ($.undefined(n.command) || jZ.is(n.command)); } s.is = t; -})(NO || (NO = {})); -var WO; +})(hP || (hP = {})); +var uP; (function(s) { function e(i, n) { return { tabSize: i, insertSpaces: n }; @@ -109570,8 +110567,8 @@ var WO; return $.defined(n) && $.uinteger(n.tabSize) && $.boolean(n.insertSpaces); } s.is = t; -})(WO || (WO = {})); -var vO; +})(uP || (uP = {})); +var mP; (function(s) { function e(i, n, o) { return { range: i, target: n, data: o }; @@ -109579,11 +110576,11 @@ var vO; s.create = e; function t(i) { let n = i; - return $.defined(n) && pn.is(n.range) && ($.undefined(n.target) || $.string(n.target)); + return $.defined(n) && gn.is(n.range) && ($.undefined(n.target) || $.string(n.target)); } s.is = t; -})(vO || (vO = {})); -var TO; +})(mP || (mP = {})); +var bP; (function(s) { function e(i, n) { return { range: i, parent: n }; @@ -109591,27 +110588,27 @@ var TO; s.create = e; function t(i) { let n = i; - return $.objectLiteral(n) && pn.is(n.range) && (n.parent === void 0 || s.is(n.parent)); + return $.objectLiteral(n) && gn.is(n.range) && (n.parent === void 0 || s.is(n.parent)); } s.is = t; -})(TO || (TO = {})); -var DO; +})(bP || (bP = {})); +var pP; (function(s) { s.namespace = "namespace", s.type = "type", s.class = "class", s.enum = "enum", s.interface = "interface", s.struct = "struct", s.typeParameter = "typeParameter", s.parameter = "parameter", s.variable = "variable", s.property = "property", s.enumMember = "enumMember", s.event = "event", s.function = "function", s.method = "method", s.macro = "macro", s.keyword = "keyword", s.modifier = "modifier", s.comment = "comment", s.string = "string", s.number = "number", s.regexp = "regexp", s.operator = "operator", s.decorator = "decorator"; -})(DO || (DO = {})); -var VO; +})(pP || (pP = {})); +var gP; (function(s) { s.declaration = "declaration", s.definition = "definition", s.readonly = "readonly", s.static = "static", s.deprecated = "deprecated", s.abstract = "abstract", s.async = "async", s.modification = "modification", s.documentation = "documentation", s.defaultLibrary = "defaultLibrary"; -})(VO || (VO = {})); -var kO; +})(gP || (gP = {})); +var ZP; (function(s) { function e(t) { const i = t; return $.objectLiteral(i) && (i.resultId === void 0 || typeof i.resultId == "string") && Array.isArray(i.data) && (i.data.length === 0 || typeof i.data[0] == "number"); } s.is = e; -})(kO || (kO = {})); -var GO; +})(ZP || (ZP = {})); +var fP; (function(s) { function e(i, n) { return { range: i, text: n }; @@ -109619,11 +110616,11 @@ var GO; s.create = e; function t(i) { const n = i; - return n != null && pn.is(n.range) && $.string(n.text); + return n != null && gn.is(n.range) && $.string(n.text); } s.is = t; -})(GO || (GO = {})); -var RO; +})(fP || (fP = {})); +var yP; (function(s) { function e(i, n, o) { return { range: i, variableName: n, caseSensitiveLookup: o }; @@ -109631,11 +110628,11 @@ var RO; s.create = e; function t(i) { const n = i; - return n != null && pn.is(n.range) && $.boolean(n.caseSensitiveLookup) && ($.string(n.variableName) || n.variableName === void 0); + return n != null && gn.is(n.range) && $.boolean(n.caseSensitiveLookup) && ($.string(n.variableName) || n.variableName === void 0); } s.is = t; -})(RO || (RO = {})); -var EO; +})(yP || (yP = {})); +var WP; (function(s) { function e(i, n) { return { range: i, expression: n }; @@ -109643,11 +110640,11 @@ var EO; s.create = e; function t(i) { const n = i; - return n != null && pn.is(n.range) && ($.string(n.expression) || n.expression === void 0); + return n != null && gn.is(n.range) && ($.string(n.expression) || n.expression === void 0); } s.is = t; -})(EO || (EO = {})); -var XO; +})(WP || (WP = {})); +var GP; (function(s) { function e(i, n) { return { frameId: i, stoppedLocation: n }; @@ -109655,19 +110652,19 @@ var XO; s.create = e; function t(i) { const n = i; - return $.defined(n) && pn.is(i.stoppedLocation); + return $.defined(n) && gn.is(i.stoppedLocation); } s.is = t; -})(XO || (XO = {})); -var FR; +})(GP || (GP = {})); +var hv; (function(s) { s.Type = 1, s.Parameter = 2; function e(t) { return t === 1 || t === 2; } s.is = e; -})(FR || (FR = {})); -var YR; +})(hv || (hv = {})); +var uv; (function(s) { function e(i) { return { value: i }; @@ -109675,113 +110672,113 @@ var YR; s.create = e; function t(i) { const n = i; - return $.objectLiteral(n) && (n.tooltip === void 0 || $.string(n.tooltip) || rC.is(n.tooltip)) && (n.location === void 0 || HM.is(n.location)) && (n.command === void 0 || Ob.is(n.command)); + return $.objectLiteral(n) && (n.tooltip === void 0 || $.string(n.tooltip) || yG.is(n.tooltip)) && (n.location === void 0 || r2.is(n.location)) && (n.command === void 0 || jZ.is(n.command)); } s.is = t; -})(YR || (YR = {})); -var FO; +})(uv || (uv = {})); +var XP; (function(s) { function e(i, n, o) { - const r = { position: i, label: n }; - return o !== void 0 && (r.kind = o), r; + const l = { position: i, label: n }; + return o !== void 0 && (l.kind = o), l; } s.create = e; function t(i) { const n = i; - return $.objectLiteral(n) && wl.is(n.position) && ($.string(n.label) || $.typedArray(n.label, YR.is)) && (n.kind === void 0 || FR.is(n.kind)) && n.textEdits === void 0 || $.typedArray(n.textEdits, Hb.is) && (n.tooltip === void 0 || $.string(n.tooltip) || rC.is(n.tooltip)) && (n.paddingLeft === void 0 || $.boolean(n.paddingLeft)) && (n.paddingRight === void 0 || $.boolean(n.paddingRight)); + return $.objectLiteral(n) && Vr.is(n.position) && ($.string(n.label) || $.typedArray(n.label, uv.is)) && (n.kind === void 0 || hv.is(n.kind)) && n.textEdits === void 0 || $.typedArray(n.textEdits, qZ.is) && (n.tooltip === void 0 || $.string(n.tooltip) || yG.is(n.tooltip)) && (n.paddingLeft === void 0 || $.boolean(n.paddingLeft)) && (n.paddingRight === void 0 || $.boolean(n.paddingRight)); } s.is = t; -})(FO || (FO = {})); -var YO; +})(XP || (XP = {})); +var VP; (function(s) { function e(t) { return { kind: "snippet", value: t }; } s.createSnippet = e; -})(YO || (YO = {})); -var zO; +})(VP || (VP = {})); +var LP; (function(s) { function e(t, i, n, o) { return { insertText: t, filterText: i, range: n, command: o }; } s.create = e; -})(zO || (zO = {})); -var PO; +})(LP || (LP = {})); +var IP; (function(s) { function e(t) { return { items: t }; } s.create = e; -})(PO || (PO = {})); -var BO; +})(IP || (IP = {})); +var SP; (function(s) { s.Invoked = 0, s.Automatic = 1; -})(BO || (BO = {})); -var OO; +})(SP || (SP = {})); +var xP; (function(s) { function e(t, i) { return { range: t, text: i }; } s.create = e; -})(OO || (OO = {})); -var HO; +})(xP || (xP = {})); +var CP; (function(s) { function e(t, i) { return { triggerKind: t, selectedCompletionInfo: i }; } s.create = e; -})(HO || (HO = {})); -var JO; +})(CP || (CP = {})); +var RP; (function(s) { function e(t) { const i = t; - return $.objectLiteral(i) && IR.is(i.uri) && $.string(i.name); + return $.objectLiteral(i) && $k.is(i.uri) && $.string(i.name); } s.is = e; -})(JO || (JO = {})); -var UO; +})(RP || (RP = {})); +var NP; (function(s) { - function e(o, r, l, a) { - return new cWe(o, r, l, a); + function e(o, l, r, c) { + return new ONe(o, l, r, c); } s.create = e; function t(o) { - let r = o; - return !!($.defined(r) && $.string(r.uri) && ($.undefined(r.languageId) || $.string(r.languageId)) && $.uinteger(r.lineCount) && $.func(r.getText) && $.func(r.positionAt) && $.func(r.offsetAt)); + let l = o; + return !!($.defined(l) && $.string(l.uri) && ($.undefined(l.languageId) || $.string(l.languageId)) && $.uinteger(l.lineCount) && $.func(l.getText) && $.func(l.positionAt) && $.func(l.offsetAt)); } s.is = t; - function i(o, r) { - let l = o.getText(), a = n(r, (d, h) => { - let u = d.range.start.line - h.range.start.line; - return u === 0 ? d.range.start.character - h.range.start.character : u; - }), c = l.length; - for (let d = a.length - 1; d >= 0; d--) { - let h = a[d], u = o.offsetAt(h.range.start), g = o.offsetAt(h.range.end); - if (g <= c) - l = l.substring(0, u) + h.newText + l.substring(g, l.length); + function i(o, l) { + let r = o.getText(), c = n(l, (a, h) => { + let u = a.range.start.line - h.range.start.line; + return u === 0 ? a.range.start.character - h.range.start.character : u; + }), d = r.length; + for (let a = c.length - 1; a >= 0; a--) { + let h = c[a], u = o.offsetAt(h.range.start), m = o.offsetAt(h.range.end); + if (m <= d) + r = r.substring(0, u) + h.newText + r.substring(m, r.length); else throw new Error("Overlapping edit"); - c = u; + d = u; } - return l; + return r; } s.applyEdits = i; - function n(o, r) { + function n(o, l) { if (o.length <= 1) return o; - const l = o.length / 2 | 0, a = o.slice(0, l), c = o.slice(l); - n(a, r), n(c, r); - let d = 0, h = 0, u = 0; - for (; d < a.length && h < c.length; ) - r(a[d], c[h]) <= 0 ? o[u++] = a[d++] : o[u++] = c[h++]; - for (; d < a.length; ) - o[u++] = a[d++]; - for (; h < c.length; ) - o[u++] = c[h++]; + const r = o.length / 2 | 0, c = o.slice(0, r), d = o.slice(r); + n(c, l), n(d, l); + let a = 0, h = 0, u = 0; + for (; a < c.length && h < d.length; ) + l(c[a], d[h]) <= 0 ? o[u++] = c[a++] : o[u++] = d[h++]; + for (; a < c.length; ) + o[u++] = c[a++]; + for (; h < d.length; ) + o[u++] = d[h++]; return o; } -})(UO || (UO = {})); -var cWe = class { +})(NP || (NP = {})); +var ONe = class { constructor(s, e, t, i) { this._uri = s, this._languageId = e, this._version = t, this._content = i, this._lineOffsets = void 0; } @@ -109822,13 +110819,13 @@ var cWe = class { s = Math.max(Math.min(s, this._content.length), 0); let e = this.getLineOffsets(), t = 0, i = e.length; if (i === 0) - return wl.create(0, s); + return Vr.create(0, s); for (; t < i; ) { let o = Math.floor((t + i) / 2); e[o] > s ? i = o : t = o + 1; } let n = t - 1; - return wl.create(n, s - e[n]); + return Vr.create(n, s - e[n]); } offsetAt(s) { let e = this.getLineOffsets(); @@ -109845,116 +110842,116 @@ var cWe = class { }, $; (function(s) { const e = Object.prototype.toString; - function t(g) { - return typeof g < "u"; + function t(m) { + return typeof m < "u"; } s.defined = t; - function i(g) { - return typeof g > "u"; + function i(m) { + return typeof m > "u"; } s.undefined = i; - function n(g) { - return g === !0 || g === !1; + function n(m) { + return m === !0 || m === !1; } s.boolean = n; - function o(g) { - return e.call(g) === "[object String]"; + function o(m) { + return e.call(m) === "[object String]"; } s.string = o; - function r(g) { - return e.call(g) === "[object Number]"; + function l(m) { + return e.call(m) === "[object Number]"; } - s.number = r; - function l(g, m, f) { - return e.call(g) === "[object Number]" && m <= g && g <= f; + s.number = l; + function r(m, b, g) { + return e.call(m) === "[object Number]" && b <= m && m <= g; } - s.numberRange = l; - function a(g) { - return e.call(g) === "[object Number]" && -2147483648 <= g && g <= 2147483647; + s.numberRange = r; + function c(m) { + return e.call(m) === "[object Number]" && -2147483648 <= m && m <= 2147483647; } - s.integer = a; - function c(g) { - return e.call(g) === "[object Number]" && 0 <= g && g <= 2147483647; + s.integer = c; + function d(m) { + return e.call(m) === "[object Number]" && 0 <= m && m <= 2147483647; } - s.uinteger = c; - function d(g) { - return e.call(g) === "[object Function]"; + s.uinteger = d; + function a(m) { + return e.call(m) === "[object Function]"; } - s.func = d; - function h(g) { - return g !== null && typeof g == "object"; + s.func = a; + function h(m) { + return m !== null && typeof m == "object"; } s.objectLiteral = h; - function u(g, m) { - return Array.isArray(g) && g.every(m); + function u(m, b) { + return Array.isArray(m) && m.every(b); } s.typedArray = u; })($ || ($ = {})); -var S8 = class { +var u6 = class { constructor(s, e, t) { this._languageId = s, this._worker = e, this._disposables = [], this._listener = /* @__PURE__ */ Object.create(null); const i = (o) => { - let r = o.getLanguageId(); - if (r !== this._languageId) + let l = o.getLanguageId(); + if (l !== this._languageId) return; - let l; + let r; this._listener[o.uri.toString()] = o.onDidChangeContent(() => { - window.clearTimeout(l), l = window.setTimeout(() => this._doValidate(o.uri, r), 500); - }), this._doValidate(o.uri, r); + window.clearTimeout(r), r = window.setTimeout(() => this._doValidate(o.uri, l), 500); + }), this._doValidate(o.uri, l); }, n = (o) => { - At.editor.setModelMarkers(o, this._languageId, []); - let r = o.uri.toString(), l = this._listener[r]; - l && (l.dispose(), delete this._listener[r]); + Vt.editor.setModelMarkers(o, this._languageId, []); + let l = o.uri.toString(), r = this._listener[l]; + r && (r.dispose(), delete this._listener[l]); }; - this._disposables.push(At.editor.onDidCreateModel(i)), this._disposables.push(At.editor.onWillDisposeModel(n)), this._disposables.push( - At.editor.onDidChangeModelLanguage((o) => { + this._disposables.push(Vt.editor.onDidCreateModel(i)), this._disposables.push(Vt.editor.onWillDisposeModel(n)), this._disposables.push( + Vt.editor.onDidChangeModelLanguage((o) => { n(o.model), i(o.model); }) ), this._disposables.push( t((o) => { - At.editor.getModels().forEach((r) => { - r.getLanguageId() === this._languageId && (n(r), i(r)); + Vt.editor.getModels().forEach((l) => { + l.getLanguageId() === this._languageId && (n(l), i(l)); }); }) ), this._disposables.push({ dispose: () => { - At.editor.getModels().forEach(n); + Vt.editor.getModels().forEach(n); for (let o in this._listener) this._listener[o].dispose(); } - }), At.editor.getModels().forEach(i); + }), Vt.editor.getModels().forEach(i); } dispose() { this._disposables.forEach((s) => s && s.dispose()), this._disposables.length = 0; } _doValidate(s, e) { this._worker(s).then((t) => t.doValidation(s.toString())).then((t) => { - const i = t.map((o) => hWe(s, o)); - let n = At.editor.getModel(s); - n && n.getLanguageId() === e && At.editor.setModelMarkers(n, e, i); + const i = t.map((o) => qNe(s, o)); + let n = Vt.editor.getModel(s); + n && n.getLanguageId() === e && Vt.editor.setModelMarkers(n, e, i); }).then(void 0, (t) => { console.error(t); }); } }; -function dWe(s) { +function jNe(s) { switch (s) { - case tf.Error: - return At.MarkerSeverity.Error; - case tf.Warning: - return At.MarkerSeverity.Warning; - case tf.Information: - return At.MarkerSeverity.Info; - case tf.Hint: - return At.MarkerSeverity.Hint; + case cg.Error: + return Vt.MarkerSeverity.Error; + case cg.Warning: + return Vt.MarkerSeverity.Warning; + case cg.Information: + return Vt.MarkerSeverity.Info; + case cg.Hint: + return Vt.MarkerSeverity.Hint; default: - return At.MarkerSeverity.Info; + return Vt.MarkerSeverity.Info; } } -function hWe(s, e) { +function qNe(s, e) { let t = typeof e.code == "number" ? String(e.code) : e.code; return { - severity: dWe(e.severity), + severity: jNe(e.severity), startLineNumber: e.range.start.line + 1, startColumn: e.range.start.character + 1, endLineNumber: e.range.end.line + 1, @@ -109964,7 +110961,7 @@ function hWe(s, e) { source: e.source }; } -var L8 = class { +var m6 = class { constructor(s, e) { this._worker = s, this._triggerCharacters = e; } @@ -109973,43 +110970,43 @@ var L8 = class { } provideCompletionItems(s, e, t, i) { const n = s.uri; - return this._worker(n).then((o) => o.doComplete(n.toString(), nu(e))).then((o) => { + return this._worker(n).then((o) => o.doComplete(n.toString(), ru(e))).then((o) => { if (!o) return; - const r = s.getWordUntilPosition(e), l = new At.Range( + const l = s.getWordUntilPosition(e), r = new Vt.Range( e.lineNumber, - r.startColumn, + l.startColumn, e.lineNumber, - r.endColumn - ), a = o.items.map((c) => { - const d = { - label: c.label, - insertText: c.insertText || c.label, - sortText: c.sortText, - filterText: c.filterText, - documentation: c.documentation, - detail: c.detail, - command: mWe(c.command), - range: l, - kind: gWe(c.kind) + l.endColumn + ), c = o.items.map((d) => { + const a = { + label: d.label, + insertText: d.insertText || d.label, + sortText: d.sortText, + filterText: d.filterText, + documentation: d.documentation, + detail: d.detail, + command: twe(d.command), + range: r, + kind: ewe(d.kind) }; - return c.textEdit && (uWe(c.textEdit) ? d.range = { - insert: Gs(c.textEdit.insert), - replace: Gs(c.textEdit.replace) - } : d.range = Gs(c.textEdit.range), d.insertText = c.textEdit.newText), c.additionalTextEdits && (d.additionalTextEdits = c.additionalTextEdits.map(Ub)), c.insertTextFormat === XR.Snippet && (d.insertTextRules = At.languages.CompletionItemInsertTextRule.InsertAsSnippet), d; + return d.textEdit && ($Ne(d.textEdit) ? a.range = { + insert: Hs(d.textEdit.insert), + replace: Hs(d.textEdit.replace) + } : a.range = Hs(d.textEdit.range), a.insertText = d.textEdit.newText), d.additionalTextEdits && (a.additionalTextEdits = d.additionalTextEdits.map(e0)), d.insertTextFormat === av.Snippet && (a.insertTextRules = Vt.languages.CompletionItemInsertTextRule.InsertAsSnippet), a; }); return { isIncomplete: o.isIncomplete, - suggestions: a + suggestions: c }; }); } }; -function nu(s) { +function ru(s) { if (s) return { character: s.column - 1, line: s.lineNumber - 1 }; } -function L9(s) { +function BE(s) { if (s) return { start: { @@ -110019,178 +111016,178 @@ function L9(s) { end: { line: s.endLineNumber - 1, character: s.endColumn - 1 } }; } -function Gs(s) { +function Hs(s) { if (s) - return new At.Range( + return new Vt.Range( s.start.line + 1, s.start.character + 1, s.end.line + 1, s.end.character + 1 ); } -function uWe(s) { +function $Ne(s) { return typeof s.insert < "u" && typeof s.replace < "u"; } -function gWe(s) { - const e = At.languages.CompletionItemKind; +function ewe(s) { + const e = Vt.languages.CompletionItemKind; switch (s) { - case Sn.Text: + case Xn.Text: return e.Text; - case Sn.Method: + case Xn.Method: return e.Method; - case Sn.Function: + case Xn.Function: return e.Function; - case Sn.Constructor: + case Xn.Constructor: return e.Constructor; - case Sn.Field: + case Xn.Field: return e.Field; - case Sn.Variable: + case Xn.Variable: return e.Variable; - case Sn.Class: + case Xn.Class: return e.Class; - case Sn.Interface: + case Xn.Interface: return e.Interface; - case Sn.Module: + case Xn.Module: return e.Module; - case Sn.Property: + case Xn.Property: return e.Property; - case Sn.Unit: + case Xn.Unit: return e.Unit; - case Sn.Value: + case Xn.Value: return e.Value; - case Sn.Enum: + case Xn.Enum: return e.Enum; - case Sn.Keyword: + case Xn.Keyword: return e.Keyword; - case Sn.Snippet: + case Xn.Snippet: return e.Snippet; - case Sn.Color: + case Xn.Color: return e.Color; - case Sn.File: + case Xn.File: return e.File; - case Sn.Reference: + case Xn.Reference: return e.Reference; } return e.Property; } -function Ub(s) { +function e0(s) { if (s) return { - range: Gs(s.range), + range: Hs(s.range), text: s.newText }; } -function mWe(s) { +function twe(s) { return s && s.command === "editor.action.triggerSuggest" ? { id: s.command, title: s.title, arguments: s.arguments } : void 0; } -var A8 = class { +var b6 = class { constructor(s) { this._worker = s; } provideHover(s, e, t) { let i = s.uri; - return this._worker(i).then((n) => n.doHover(i.toString(), nu(e))).then((n) => { + return this._worker(i).then((n) => n.doHover(i.toString(), ru(e))).then((n) => { if (n) return { - range: Gs(n.range), - contents: fWe(n.contents) + range: Hs(n.range), + contents: nwe(n.contents) }; }); } }; -function pWe(s) { +function iwe(s) { return s && typeof s == "object" && typeof s.kind == "string"; } -function KO(s) { +function wP(s) { return typeof s == "string" ? { value: s - } : pWe(s) ? s.kind === "plaintext" ? { + } : iwe(s) ? s.kind === "plaintext" ? { value: s.value.replace(/[\\`*_{}[\]()#+\-.!]/g, "\\$&") } : { value: s.value } : { value: "```" + s.language + ` ` + s.value + "\n```\n" }; } -function fWe(s) { +function nwe(s) { if (s) - return Array.isArray(s) ? s.map(KO) : [KO(s)]; + return Array.isArray(s) ? s.map(wP) : [wP(s)]; } -var bWe = class { +var swe = class { constructor(s) { this._worker = s; } provideDocumentHighlights(s, e, t) { const i = s.uri; - return this._worker(i).then((n) => n.findDocumentHighlights(i.toString(), nu(e))).then((n) => { + return this._worker(i).then((n) => n.findDocumentHighlights(i.toString(), ru(e))).then((n) => { if (n) return n.map((o) => ({ - range: Gs(o.range), - kind: yWe(o.kind) + range: Hs(o.range), + kind: owe(o.kind) })); }); } }; -function yWe(s) { +function owe(s) { switch (s) { - case uw.Read: - return At.languages.DocumentHighlightKind.Read; - case uw.Write: - return At.languages.DocumentHighlightKind.Write; - case uw.Text: - return At.languages.DocumentHighlightKind.Text; + case Ly.Read: + return Vt.languages.DocumentHighlightKind.Read; + case Ly.Write: + return Vt.languages.DocumentHighlightKind.Write; + case Ly.Text: + return Vt.languages.DocumentHighlightKind.Text; } - return At.languages.DocumentHighlightKind.Text; + return Vt.languages.DocumentHighlightKind.Text; } -var wWe = class { +var lwe = class { constructor(s) { this._worker = s; } provideDefinition(s, e, t) { const i = s.uri; - return this._worker(i).then((n) => n.findDefinition(i.toString(), nu(e))).then((n) => { + return this._worker(i).then((n) => n.findDefinition(i.toString(), ru(e))).then((n) => { if (n) - return [x8(n)]; + return [p6(n)]; }); } }; -function x8(s) { +function p6(s) { return { - uri: At.Uri.parse(s.uri), - range: Gs(s.range) + uri: Vt.Uri.parse(s.uri), + range: Hs(s.range) }; } -var CWe = class { +var rwe = class { constructor(s) { this._worker = s; } provideReferences(s, e, t, i) { const n = s.uri; - return this._worker(n).then((o) => o.findReferences(n.toString(), nu(e))).then((o) => { + return this._worker(n).then((o) => o.findReferences(n.toString(), ru(e))).then((o) => { if (o) - return o.map(x8); + return o.map(p6); }); } -}, SWe = class { +}, cwe = class { constructor(s) { this._worker = s; } provideRenameEdits(s, e, t, i) { const n = s.uri; - return this._worker(n).then((o) => o.doRename(n.toString(), nu(e), t)).then((o) => LWe(o)); + return this._worker(n).then((o) => o.doRename(n.toString(), ru(e), t)).then((o) => dwe(o)); } }; -function LWe(s) { +function dwe(s) { if (!s || !s.changes) return; let e = []; for (let t in s.changes) { - const i = At.Uri.parse(t); + const i = Vt.Uri.parse(t); for (let n of s.changes[t]) e.push({ resource: i, versionId: void 0, textEdit: { - range: Gs(n.range), + range: Hs(n.range), text: n.newText } }); @@ -110199,7 +111196,7 @@ function LWe(s) { edits: e }; } -var M8 = class { +var g6 = class { constructor(s) { this._worker = s; } @@ -110207,75 +111204,75 @@ var M8 = class { const t = s.uri; return this._worker(t).then((i) => i.findDocumentSymbols(t.toString())).then((i) => { if (i) - return i.map((n) => AWe(n) ? Z8(n) : { + return i.map((n) => awe(n) ? Z6(n) : { name: n.name, detail: "", containerName: n.containerName, - kind: _8(n.kind), - range: Gs(n.location.range), - selectionRange: Gs(n.location.range), + kind: f6(n.kind), + range: Hs(n.location.range), + selectionRange: Hs(n.location.range), tags: [] }); }); } }; -function AWe(s) { +function awe(s) { return "children" in s; } -function Z8(s) { +function Z6(s) { return { name: s.name, detail: s.detail ?? "", - kind: _8(s.kind), - range: Gs(s.range), - selectionRange: Gs(s.selectionRange), + kind: f6(s.kind), + range: Hs(s.range), + selectionRange: Hs(s.selectionRange), tags: s.tags ?? [], - children: (s.children ?? []).map((e) => Z8(e)) + children: (s.children ?? []).map((e) => Z6(e)) }; } -function _8(s) { - let e = At.languages.SymbolKind; +function f6(s) { + let e = Vt.languages.SymbolKind; switch (s) { - case Ln.File: + case Vn.File: return e.File; - case Ln.Module: + case Vn.Module: return e.Module; - case Ln.Namespace: + case Vn.Namespace: return e.Namespace; - case Ln.Package: + case Vn.Package: return e.Package; - case Ln.Class: + case Vn.Class: return e.Class; - case Ln.Method: + case Vn.Method: return e.Method; - case Ln.Property: + case Vn.Property: return e.Property; - case Ln.Field: + case Vn.Field: return e.Field; - case Ln.Constructor: + case Vn.Constructor: return e.Constructor; - case Ln.Enum: + case Vn.Enum: return e.Enum; - case Ln.Interface: + case Vn.Interface: return e.Interface; - case Ln.Function: + case Vn.Function: return e.Function; - case Ln.Variable: + case Vn.Variable: return e.Variable; - case Ln.Constant: + case Vn.Constant: return e.Constant; - case Ln.String: + case Vn.String: return e.String; - case Ln.Number: + case Vn.Number: return e.Number; - case Ln.Boolean: + case Vn.Boolean: return e.Boolean; - case Ln.Array: + case Vn.Array: return e.Array; } return e.Function; } -var xWe = class { +var hwe = class { constructor(s) { this._worker = s; } @@ -110285,42 +111282,42 @@ var xWe = class { if (i) return { links: i.map((n) => ({ - range: Gs(n.range), + range: Hs(n.range), url: n.target })) }; }); } -}, I8 = class { +}, y6 = class { constructor(s) { this._worker = s; } provideDocumentFormattingEdits(s, e, t) { const i = s.uri; - return this._worker(i).then((n) => n.format(i.toString(), null, W8(e)).then((o) => { + return this._worker(i).then((n) => n.format(i.toString(), null, G6(e)).then((o) => { if (!(!o || o.length === 0)) - return o.map(Ub); + return o.map(e0); })); } -}, N8 = class { +}, W6 = class { constructor(s) { this._worker = s, this.canFormatMultipleRanges = !1; } provideDocumentRangeFormattingEdits(s, e, t, i) { const n = s.uri; - return this._worker(n).then((o) => o.format(n.toString(), L9(e), W8(t)).then((r) => { - if (!(!r || r.length === 0)) - return r.map(Ub); + return this._worker(n).then((o) => o.format(n.toString(), BE(e), G6(t)).then((l) => { + if (!(!l || l.length === 0)) + return l.map(e0); })); } }; -function W8(s) { +function G6(s) { return { tabSize: s.tabSize, insertSpaces: s.insertSpaces }; } -var v8 = class { +var X6 = class { constructor(s) { this._worker = s; } @@ -110330,25 +111327,25 @@ var v8 = class { if (i) return i.map((n) => ({ color: n.color, - range: Gs(n.range) + range: Hs(n.range) })); }); } provideColorPresentations(s, e, t) { const i = s.uri; return this._worker(i).then( - (n) => n.getColorPresentations(i.toString(), e.color, L9(e.range)) + (n) => n.getColorPresentations(i.toString(), e.color, BE(e.range)) ).then((n) => { if (n) return n.map((o) => { - let r = { + let l = { label: o.label }; - return o.textEdit && (r.textEdit = Ub(o.textEdit)), o.additionalTextEdits && (r.additionalTextEdits = o.additionalTextEdits.map(Ub)), r; + return o.textEdit && (l.textEdit = e0(o.textEdit)), o.additionalTextEdits && (l.additionalTextEdits = o.additionalTextEdits.map(e0)), l; }); }); } -}, T8 = class { +}, V6 = class { constructor(s) { this._worker = s; } @@ -110357,26 +111354,26 @@ var v8 = class { return this._worker(i).then((n) => n.getFoldingRanges(i.toString(), e)).then((n) => { if (n) return n.map((o) => { - const r = { + const l = { start: o.startLine + 1, end: o.endLine + 1 }; - return typeof o.kind < "u" && (r.kind = MWe(o.kind)), r; + return typeof o.kind < "u" && (l.kind = uwe(o.kind)), l; }); }); } }; -function MWe(s) { +function uwe(s) { switch (s) { - case hw.Comment: - return At.languages.FoldingRangeKind.Comment; - case hw.Imports: - return At.languages.FoldingRangeKind.Imports; - case hw.Region: - return At.languages.FoldingRangeKind.Region; + case Vy.Comment: + return Vt.languages.FoldingRangeKind.Comment; + case Vy.Imports: + return Vt.languages.FoldingRangeKind.Imports; + case Vy.Region: + return Vt.languages.FoldingRangeKind.Region; } } -var D8 = class { +var L6 = class { constructor(s) { this._worker = s; } @@ -110385,180 +111382,180 @@ var D8 = class { return this._worker(i).then( (n) => n.getSelectionRanges( i.toString(), - e.map(nu) + e.map(ru) ) ).then((n) => { if (n) return n.map((o) => { - const r = []; + const l = []; for (; o; ) - r.push({ range: Gs(o.range) }), o = o.parent; - return r; + l.push({ range: Hs(o.range) }), o = o.parent; + return l; }); }); } }; -function ZWe(s, e = !1) { +function mwe(s, e = !1) { const t = s.length; - let i = 0, n = "", o = 0, r = 16, l = 0, a = 0, c = 0, d = 0, h = 0; - function u(C, S) { - let L = 0, x = 0; - for (; L < C; ) { - let Z = s.charCodeAt(i); - if (Z >= 48 && Z <= 57) - x = x * 16 + Z - 48; - else if (Z >= 65 && Z <= 70) - x = x * 16 + Z - 65 + 10; - else if (Z >= 97 && Z <= 102) - x = x * 16 + Z - 97 + 10; + let i = 0, n = "", o = 0, l = 16, r = 0, c = 0, d = 0, a = 0, h = 0; + function u(W, G) { + let X = 0, L = 0; + for (; X < W; ) { + let S = s.charCodeAt(i); + if (S >= 48 && S <= 57) + L = L * 16 + S - 48; + else if (S >= 65 && S <= 70) + L = L * 16 + S - 65 + 10; + else if (S >= 97 && S <= 102) + L = L * 16 + S - 97 + 10; else break; - i++, L++; + i++, X++; } - return L < C && (x = -1), x; + return X < W && (L = -1), L; } - function g(C) { - i = C, n = "", o = 0, r = 16, h = 0; + function m(W) { + i = W, n = "", o = 0, l = 16, h = 0; } - function m() { - let C = i; + function b() { + let W = i; if (s.charCodeAt(i) === 48) i++; else - for (i++; i < s.length && Lp(s.charCodeAt(i)); ) + for (i++; i < s.length && Cp(s.charCodeAt(i)); ) i++; if (i < s.length && s.charCodeAt(i) === 46) - if (i++, i < s.length && Lp(s.charCodeAt(i))) - for (i++; i < s.length && Lp(s.charCodeAt(i)); ) + if (i++, i < s.length && Cp(s.charCodeAt(i))) + for (i++; i < s.length && Cp(s.charCodeAt(i)); ) i++; else - return h = 3, s.substring(C, i); - let S = i; + return h = 3, s.substring(W, i); + let G = i; if (i < s.length && (s.charCodeAt(i) === 69 || s.charCodeAt(i) === 101)) - if (i++, (i < s.length && s.charCodeAt(i) === 43 || s.charCodeAt(i) === 45) && i++, i < s.length && Lp(s.charCodeAt(i))) { - for (i++; i < s.length && Lp(s.charCodeAt(i)); ) + if (i++, (i < s.length && s.charCodeAt(i) === 43 || s.charCodeAt(i) === 45) && i++, i < s.length && Cp(s.charCodeAt(i))) { + for (i++; i < s.length && Cp(s.charCodeAt(i)); ) i++; - S = i; + G = i; } else h = 3; - return s.substring(C, S); + return s.substring(W, G); } - function f() { - let C = "", S = i; + function g() { + let W = "", G = i; for (; ; ) { if (i >= t) { - C += s.substring(S, i), h = 2; + W += s.substring(G, i), h = 2; break; } - const L = s.charCodeAt(i); - if (L === 34) { - C += s.substring(S, i), i++; + const X = s.charCodeAt(i); + if (X === 34) { + W += s.substring(G, i), i++; break; } - if (L === 92) { - if (C += s.substring(S, i), i++, i >= t) { + if (X === 92) { + if (W += s.substring(G, i), i++, i >= t) { h = 2; break; } switch (s.charCodeAt(i++)) { case 34: - C += '"'; + W += '"'; break; case 92: - C += "\\"; + W += "\\"; break; case 47: - C += "/"; + W += "/"; break; case 98: - C += "\b"; + W += "\b"; break; case 102: - C += "\f"; + W += "\f"; break; case 110: - C += ` + W += ` `; break; case 114: - C += "\r"; + W += "\r"; break; case 116: - C += " "; + W += " "; break; case 117: - const Z = u(4); - Z >= 0 ? C += String.fromCharCode(Z) : h = 4; + const S = u(4); + S >= 0 ? W += String.fromCharCode(S) : h = 4; break; default: h = 5; } - S = i; + G = i; continue; } - if (L >= 0 && L <= 31) - if (iy(L)) { - C += s.substring(S, i), h = 2; + if (X >= 0 && X <= 31) + if (uf(X)) { + W += s.substring(G, i), h = 2; break; } else h = 6; i++; } - return C; + return W; } - function b() { - if (n = "", h = 0, o = i, a = l, d = c, i >= t) - return o = t, r = 17; - let C = s.charCodeAt(i); - if (u2(C)) { + function Z() { + if (n = "", h = 0, o = i, c = r, a = d, i >= t) + return o = t, l = 17; + let W = s.charCodeAt(i); + if (MN(W)) { do - i++, n += String.fromCharCode(C), C = s.charCodeAt(i); - while (u2(C)); - return r = 15; - } - if (iy(C)) - return i++, n += String.fromCharCode(C), C === 13 && s.charCodeAt(i) === 10 && (i++, n += ` -`), l++, c = i, r = 14; - switch (C) { + i++, n += String.fromCharCode(W), W = s.charCodeAt(i); + while (MN(W)); + return l = 15; + } + if (uf(W)) + return i++, n += String.fromCharCode(W), W === 13 && s.charCodeAt(i) === 10 && (i++, n += ` +`), r++, d = i, l = 14; + switch (W) { case 123: - return i++, r = 1; + return i++, l = 1; case 125: - return i++, r = 2; + return i++, l = 2; case 91: - return i++, r = 3; + return i++, l = 3; case 93: - return i++, r = 4; + return i++, l = 4; case 58: - return i++, r = 6; + return i++, l = 6; case 44: - return i++, r = 5; + return i++, l = 5; case 34: - return i++, n = f(), r = 10; + return i++, n = g(), l = 10; case 47: - const S = i - 1; + const G = i - 1; if (s.charCodeAt(i + 1) === 47) { - for (i += 2; i < t && !iy(s.charCodeAt(i)); ) + for (i += 2; i < t && !uf(s.charCodeAt(i)); ) i++; - return n = s.substring(S, i), r = 12; + return n = s.substring(G, i), l = 12; } if (s.charCodeAt(i + 1) === 42) { i += 2; - const L = t - 1; - let x = !1; - for (; i < L; ) { - const Z = s.charCodeAt(i); - if (Z === 42 && s.charCodeAt(i + 1) === 47) { - i += 2, x = !0; + const X = t - 1; + let L = !1; + for (; i < X; ) { + const S = s.charCodeAt(i); + if (S === 42 && s.charCodeAt(i + 1) === 47) { + i += 2, L = !0; break; } - i++, iy(Z) && (Z === 13 && s.charCodeAt(i) === 10 && i++, l++, c = i); + i++, uf(S) && (S === 13 && s.charCodeAt(i) === 10 && i++, r++, d = i); } - return x || (i++, h = 1), n = s.substring(S, i), r = 13; + return L || (i++, h = 1), n = s.substring(G, i), l = 13; } - return n += String.fromCharCode(C), i++, r = 16; + return n += String.fromCharCode(W), i++, l = 16; case 45: - if (n += String.fromCharCode(C), i++, i === t || !Lp(s.charCodeAt(i))) - return r = 16; + if (n += String.fromCharCode(W), i++, i === t || !Cp(s.charCodeAt(i))) + return l = 16; case 48: case 49: case 50: @@ -110569,28 +111566,28 @@ function ZWe(s, e = !1) { case 55: case 56: case 57: - return n += m(), r = 11; + return n += b(), l = 11; default: - for (; i < t && y(C); ) - i++, C = s.charCodeAt(i); + for (; i < t && f(W); ) + i++, W = s.charCodeAt(i); if (o !== i) { switch (n = s.substring(o, i), n) { case "true": - return r = 8; + return l = 8; case "false": - return r = 9; + return l = 9; case "null": - return r = 7; + return l = 7; } - return r = 16; + return l = 16; } - return n += String.fromCharCode(C), i++, r = 16; + return n += String.fromCharCode(W), i++, l = 16; } } - function y(C) { - if (u2(C) || iy(C)) + function f(W) { + if (MN(W) || uf(W)) return !1; - switch (C) { + switch (W) { case 125: case 93: case 123: @@ -110603,71 +111600,71 @@ function ZWe(s, e = !1) { } return !0; } - function w() { - let C; + function y() { + let W; do - C = b(); - while (C >= 12 && C <= 15); - return C; + W = Z(); + while (W >= 12 && W <= 15); + return W; } return { - setPosition: g, + setPosition: m, getPosition: () => i, - scan: e ? w : b, - getToken: () => r, + scan: e ? y : Z, + getToken: () => l, getTokenValue: () => n, getTokenOffset: () => o, getTokenLength: () => i - o, - getTokenStartLine: () => a, - getTokenStartCharacter: () => o - d, + getTokenStartLine: () => c, + getTokenStartCharacter: () => o - a, getTokenError: () => h }; } -function u2(s) { +function MN(s) { return s === 32 || s === 9; } -function iy(s) { +function uf(s) { return s === 10 || s === 13; } -function Lp(s) { +function Cp(s) { return s >= 48 && s <= 57; } -var QO; +var TP; (function(s) { s[s.lineFeed = 10] = "lineFeed", s[s.carriageReturn = 13] = "carriageReturn", s[s.space = 32] = "space", s[s._0 = 48] = "_0", s[s._1 = 49] = "_1", s[s._2 = 50] = "_2", s[s._3 = 51] = "_3", s[s._4 = 52] = "_4", s[s._5 = 53] = "_5", s[s._6 = 54] = "_6", s[s._7 = 55] = "_7", s[s._8 = 56] = "_8", s[s._9 = 57] = "_9", s[s.a = 97] = "a", s[s.b = 98] = "b", s[s.c = 99] = "c", s[s.d = 100] = "d", s[s.e = 101] = "e", s[s.f = 102] = "f", s[s.g = 103] = "g", s[s.h = 104] = "h", s[s.i = 105] = "i", s[s.j = 106] = "j", s[s.k = 107] = "k", s[s.l = 108] = "l", s[s.m = 109] = "m", s[s.n = 110] = "n", s[s.o = 111] = "o", s[s.p = 112] = "p", s[s.q = 113] = "q", s[s.r = 114] = "r", s[s.s = 115] = "s", s[s.t = 116] = "t", s[s.u = 117] = "u", s[s.v = 118] = "v", s[s.w = 119] = "w", s[s.x = 120] = "x", s[s.y = 121] = "y", s[s.z = 122] = "z", s[s.A = 65] = "A", s[s.B = 66] = "B", s[s.C = 67] = "C", s[s.D = 68] = "D", s[s.E = 69] = "E", s[s.F = 70] = "F", s[s.G = 71] = "G", s[s.H = 72] = "H", s[s.I = 73] = "I", s[s.J = 74] = "J", s[s.K = 75] = "K", s[s.L = 76] = "L", s[s.M = 77] = "M", s[s.N = 78] = "N", s[s.O = 79] = "O", s[s.P = 80] = "P", s[s.Q = 81] = "Q", s[s.R = 82] = "R", s[s.S = 83] = "S", s[s.T = 84] = "T", s[s.U = 85] = "U", s[s.V = 86] = "V", s[s.W = 87] = "W", s[s.X = 88] = "X", s[s.Y = 89] = "Y", s[s.Z = 90] = "Z", s[s.asterisk = 42] = "asterisk", s[s.backslash = 92] = "backslash", s[s.closeBrace = 125] = "closeBrace", s[s.closeBracket = 93] = "closeBracket", s[s.colon = 58] = "colon", s[s.comma = 44] = "comma", s[s.dot = 46] = "dot", s[s.doubleQuote = 34] = "doubleQuote", s[s.minus = 45] = "minus", s[s.openBrace = 123] = "openBrace", s[s.openBracket = 91] = "openBracket", s[s.plus = 43] = "plus", s[s.slash = 47] = "slash", s[s.formFeed = 12] = "formFeed", s[s.tab = 9] = "tab"; -})(QO || (QO = {})); +})(TP || (TP = {})); new Array(20).fill(0).map((s, e) => " ".repeat(e)); -var Ap = 200; -new Array(Ap).fill(0).map((s, e) => ` -` + " ".repeat(e)), new Array(Ap).fill(0).map((s, e) => "\r" + " ".repeat(e)), new Array(Ap).fill(0).map((s, e) => `\r -` + " ".repeat(e)), new Array(Ap).fill(0).map((s, e) => ` -` + " ".repeat(e)), new Array(Ap).fill(0).map((s, e) => "\r" + " ".repeat(e)), new Array(Ap).fill(0).map((s, e) => `\r +var Rp = 200; +new Array(Rp).fill(0).map((s, e) => ` +` + " ".repeat(e)), new Array(Rp).fill(0).map((s, e) => "\r" + " ".repeat(e)), new Array(Rp).fill(0).map((s, e) => `\r +` + " ".repeat(e)), new Array(Rp).fill(0).map((s, e) => ` +` + " ".repeat(e)), new Array(Rp).fill(0).map((s, e) => "\r" + " ".repeat(e)), new Array(Rp).fill(0).map((s, e) => `\r ` + " ".repeat(e)); -var jO; +var MP; (function(s) { s.DEFAULT = { allowTrailingComma: !1 }; -})(jO || (jO = {})); -var _We = ZWe, qO; +})(MP || (MP = {})); +var bwe = mwe, YP; (function(s) { s[s.None = 0] = "None", s[s.UnexpectedEndOfComment = 1] = "UnexpectedEndOfComment", s[s.UnexpectedEndOfString = 2] = "UnexpectedEndOfString", s[s.UnexpectedEndOfNumber = 3] = "UnexpectedEndOfNumber", s[s.InvalidUnicode = 4] = "InvalidUnicode", s[s.InvalidEscapeCharacter = 5] = "InvalidEscapeCharacter", s[s.InvalidCharacter = 6] = "InvalidCharacter"; -})(qO || (qO = {})); -var $O; +})(YP || (YP = {})); +var kP; (function(s) { s[s.OpenBraceToken = 1] = "OpenBraceToken", s[s.CloseBraceToken = 2] = "CloseBraceToken", s[s.OpenBracketToken = 3] = "OpenBracketToken", s[s.CloseBracketToken = 4] = "CloseBracketToken", s[s.CommaToken = 5] = "CommaToken", s[s.ColonToken = 6] = "ColonToken", s[s.NullKeyword = 7] = "NullKeyword", s[s.TrueKeyword = 8] = "TrueKeyword", s[s.FalseKeyword = 9] = "FalseKeyword", s[s.StringLiteral = 10] = "StringLiteral", s[s.NumericLiteral = 11] = "NumericLiteral", s[s.LineCommentTrivia = 12] = "LineCommentTrivia", s[s.BlockCommentTrivia = 13] = "BlockCommentTrivia", s[s.LineBreakTrivia = 14] = "LineBreakTrivia", s[s.Trivia = 15] = "Trivia", s[s.Unknown = 16] = "Unknown", s[s.EOF = 17] = "EOF"; -})($O || ($O = {})); -var eH; +})(kP || (kP = {})); +var vP; (function(s) { s[s.InvalidSymbol = 1] = "InvalidSymbol", s[s.InvalidNumberFormat = 2] = "InvalidNumberFormat", s[s.PropertyNameExpected = 3] = "PropertyNameExpected", s[s.ValueExpected = 4] = "ValueExpected", s[s.ColonExpected = 5] = "ColonExpected", s[s.CommaExpected = 6] = "CommaExpected", s[s.CloseBraceExpected = 7] = "CloseBraceExpected", s[s.CloseBracketExpected = 8] = "CloseBracketExpected", s[s.EndOfFileExpected = 9] = "EndOfFileExpected", s[s.InvalidCommentToken = 10] = "InvalidCommentToken", s[s.UnexpectedEndOfComment = 11] = "UnexpectedEndOfComment", s[s.UnexpectedEndOfString = 12] = "UnexpectedEndOfString", s[s.UnexpectedEndOfNumber = 13] = "UnexpectedEndOfNumber", s[s.InvalidUnicode = 14] = "InvalidUnicode", s[s.InvalidEscapeCharacter = 15] = "InvalidEscapeCharacter", s[s.InvalidCharacter = 16] = "InvalidCharacter"; -})(eH || (eH = {})); -function IWe(s) { +})(vP || (vP = {})); +function pwe(s) { return { - getInitialState: () => new k8(null, null, !1, null), - tokenize: (e, t) => EWe(s, e, t) + getInitialState: () => new S6(null, null, !1, null), + tokenize: (e, t) => Iwe(s, e, t) }; } -var tH = "delimiter.bracket.json", iH = "delimiter.array.json", NWe = "delimiter.colon.json", WWe = "delimiter.comma.json", vWe = "keyword.json", TWe = "keyword.json", DWe = "string.value.json", VWe = "number.json", kWe = "string.key.json", GWe = "comment.block.json", RWe = "comment.line.json", My = class V8 { +var JP = "delimiter.bracket.json", HP = "delimiter.array.json", gwe = "delimiter.colon.json", Zwe = "delimiter.comma.json", fwe = "keyword.json", ywe = "keyword.json", Wwe = "string.value.json", Gwe = "number.json", Xwe = "string.key.json", Vwe = "comment.block.json", Lwe = "comment.line.json", vf = class I6 { constructor(e, t) { this.parent = e, this.type = t; } @@ -110675,7 +111672,7 @@ var tH = "delimiter.bracket.json", iH = "delimiter.array.json", NWe = "delimiter return e ? e.parent : null; } static push(e, t) { - return new V8(e, t); + return new I6(e, t); } static equals(e, t) { if (!e && !t) @@ -110691,15 +111688,15 @@ var tH = "delimiter.bracket.json", iH = "delimiter.array.json", NWe = "delimiter } return !0; } -}, k8 = class zR { +}, S6 = class mv { constructor(e, t, i, n) { this._state = e, this.scanError = t, this.lastWasColon = i, this.parents = n; } clone() { - return new zR(this._state, this.scanError, this.lastWasColon, this.parents); + return new mv(this._state, this.scanError, this.lastWasColon, this.parents); } equals(e) { - return e === this ? !0 : !e || !(e instanceof zR) ? !1 : this.scanError === e.scanError && this.lastWasColon === e.lastWasColon && My.equals(this.parents, e.parents); + return e === this ? !0 : !e || !(e instanceof mv) ? !1 : this.scanError === e.scanError && this.lastWasColon === e.lastWasColon && vf.equals(this.parents, e.parents); } getStateData() { return this._state; @@ -110708,7 +111705,7 @@ var tH = "delimiter.bracket.json", iH = "delimiter.array.json", NWe = "delimiter this._state = e; } }; -function EWe(s, e, t, i = 0) { +function Iwe(s, e, t, i = 0) { let n = 0, o = !1; switch (t.scanError) { case 2: @@ -110718,99 +111715,99 @@ function EWe(s, e, t, i = 0) { e = "/*" + e, n = 2; break; } - const r = _We(e); - let l = t.lastWasColon, a = t.parents; - const c = { + const l = bwe(e); + let r = t.lastWasColon, c = t.parents; + const d = { tokens: [], endState: t.clone() }; for (; ; ) { - let d = i + r.getPosition(), h = ""; - const u = r.scan(); + let a = i + l.getPosition(), h = ""; + const u = l.scan(); if (u === 17) break; - if (d === i + r.getPosition()) + if (a === i + l.getPosition()) throw new Error( - "Scanner did not advance, next 3 characters are: " + e.substr(r.getPosition(), 3) + "Scanner did not advance, next 3 characters are: " + e.substr(l.getPosition(), 3) ); - switch (o && (d -= n), o = n > 0, u) { + switch (o && (a -= n), o = n > 0, u) { case 1: - a = My.push( - a, + c = vf.push( + c, 0 /* Object */ - ), h = tH, l = !1; + ), h = JP, r = !1; break; case 2: - a = My.pop(a), h = tH, l = !1; + c = vf.pop(c), h = JP, r = !1; break; case 3: - a = My.push( - a, + c = vf.push( + c, 1 /* Array */ - ), h = iH, l = !1; + ), h = HP, r = !1; break; case 4: - a = My.pop(a), h = iH, l = !1; + c = vf.pop(c), h = HP, r = !1; break; case 6: - h = NWe, l = !0; + h = gwe, r = !0; break; case 5: - h = WWe, l = !1; + h = Zwe, r = !1; break; case 8: case 9: - h = vWe, l = !1; + h = fwe, r = !1; break; case 7: - h = TWe, l = !1; + h = ywe, r = !1; break; case 10: - const m = (a ? a.type : 0) === 1; - h = l || m ? DWe : kWe, l = !1; + const b = (c ? c.type : 0) === 1; + h = r || b ? Wwe : Xwe, r = !1; break; case 11: - h = VWe, l = !1; + h = Gwe, r = !1; break; } switch (u) { case 12: - h = RWe; + h = Lwe; break; case 13: - h = GWe; + h = Vwe; break; } - c.endState = new k8( + d.endState = new S6( t.getStateData(), - r.getTokenError(), - l, - a - ), c.tokens.push({ - startIndex: d, + l.getTokenError(), + r, + c + ), d.tokens.push({ + startIndex: a, scopes: h }); } - return c; + return d; } -var Nr; -function XWe() { +var Tl; +function Swe() { return new Promise((s, e) => { - if (!Nr) + if (!Tl) return e("JSON not registered!"); - s(Nr); + s(Tl); }); } -var FWe = class extends S8 { +var xwe = class extends u6 { constructor(s, e, t) { super(s, e, t.onDidChange), this._disposables.push( - At.editor.onWillDisposeModel((i) => { + Vt.editor.onWillDisposeModel((i) => { this._resetSchema(i.uri); }) ), this._disposables.push( - At.editor.onDidChangeModelLanguage((i) => { + Vt.editor.onDidChangeModelLanguage((i) => { this._resetSchema(i.model.uri); }) ); @@ -110821,64 +111818,64 @@ var FWe = class extends S8 { }); } }; -function YWe(s) { - const e = [], t = [], i = new C8(s); - e.push(i), Nr = (...r) => i.getLanguageServiceWorker(...r); +function Cwe(s) { + const e = [], t = [], i = new h6(s); + e.push(i), Tl = (...l) => i.getLanguageServiceWorker(...l); function n() { - const { languageId: r, modeConfiguration: l } = s; - G8(t), l.documentFormattingEdits && t.push( - At.languages.registerDocumentFormattingEditProvider( - r, - new I8(Nr) + const { languageId: l, modeConfiguration: r } = s; + x6(t), r.documentFormattingEdits && t.push( + Vt.languages.registerDocumentFormattingEditProvider( + l, + new y6(Tl) ) - ), l.documentRangeFormattingEdits && t.push( - At.languages.registerDocumentRangeFormattingEditProvider( - r, - new N8(Nr) + ), r.documentRangeFormattingEdits && t.push( + Vt.languages.registerDocumentRangeFormattingEditProvider( + l, + new W6(Tl) ) - ), l.completionItems && t.push( - At.languages.registerCompletionItemProvider( - r, - new L8(Nr, [" ", ":", '"']) + ), r.completionItems && t.push( + Vt.languages.registerCompletionItemProvider( + l, + new m6(Tl, [" ", ":", '"']) ) - ), l.hovers && t.push( - At.languages.registerHoverProvider(r, new A8(Nr)) - ), l.documentSymbols && t.push( - At.languages.registerDocumentSymbolProvider( - r, - new M8(Nr) + ), r.hovers && t.push( + Vt.languages.registerHoverProvider(l, new b6(Tl)) + ), r.documentSymbols && t.push( + Vt.languages.registerDocumentSymbolProvider( + l, + new g6(Tl) ) - ), l.tokens && t.push(At.languages.setTokensProvider(r, IWe(!0))), l.colors && t.push( - At.languages.registerColorProvider( - r, - new v8(Nr) + ), r.tokens && t.push(Vt.languages.setTokensProvider(l, pwe(!0))), r.colors && t.push( + Vt.languages.registerColorProvider( + l, + new X6(Tl) ) - ), l.foldingRanges && t.push( - At.languages.registerFoldingRangeProvider( - r, - new T8(Nr) + ), r.foldingRanges && t.push( + Vt.languages.registerFoldingRangeProvider( + l, + new V6(Tl) ) - ), l.diagnostics && t.push(new FWe(r, Nr, s)), l.selectionRanges && t.push( - At.languages.registerSelectionRangeProvider( - r, - new D8(Nr) + ), r.diagnostics && t.push(new xwe(l, Tl, s)), r.selectionRanges && t.push( + Vt.languages.registerSelectionRangeProvider( + l, + new L6(Tl) ) ); } - n(), e.push(At.languages.setLanguageConfiguration(s.languageId, zWe)); + n(), e.push(Vt.languages.setLanguageConfiguration(s.languageId, Rwe)); let o = s.modeConfiguration; - return s.onDidChange((r) => { - r.modeConfiguration !== o && (o = r.modeConfiguration, n()); - }), e.push(nH(t)), nH(e); + return s.onDidChange((l) => { + l.modeConfiguration !== o && (o = l.modeConfiguration, n()); + }), e.push(EP(t)), EP(e); } -function nH(s) { - return { dispose: () => G8(s) }; +function EP(s) { + return { dispose: () => x6(s) }; } -function G8(s) { +function x6(s) { for (; s.length; ) s.pop().dispose(); } -var zWe = { +var Rwe = { wordPattern: /(-?\d*\.\d\w*)|([^\[\{\]\}\:\"\,\s]+)/g, comments: { lineComment: "//", @@ -110894,30 +111891,242 @@ var zWe = { { open: '"', close: '"', notIn: ["string"] } ] }; -const PWe = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ +const Nwe = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ + __proto__: null, + CompletionAdapter: m6, + DefinitionAdapter: lwe, + DiagnosticsAdapter: u6, + DocumentColorAdapter: X6, + DocumentFormattingEditProvider: y6, + DocumentHighlightAdapter: swe, + DocumentLinkAdapter: hwe, + DocumentRangeFormattingEditProvider: W6, + DocumentSymbolAdapter: g6, + FoldingRangeAdapter: V6, + HoverAdapter: b6, + ReferenceAdapter: rwe, + RenameAdapter: cwe, + SelectionRangeAdapter: L6, + WorkerManager: h6, + fromPosition: ru, + fromRange: BE, + getWorker: Swe, + setupMode: Cwe, + toRange: Hs, + toTextEdit: e0 +}, Symbol.toStringTag, { value: "Module" })); +/*!----------------------------------------------------------------------------- + * Copyright (c) Microsoft Corporation. All rights reserved. + * Version: 0.52.2(404545bded1df6ffa41ea0af4e8ddb219018c6c1) + * Released under the MIT license + * https://github.com/microsoft/monaco-editor/blob/main/LICENSE.txt + *-----------------------------------------------------------------------------*/ +var wwe = Object.defineProperty, Twe = Object.getOwnPropertyDescriptor, Mwe = Object.getOwnPropertyNames, Ywe = Object.prototype.hasOwnProperty, kwe = (s, e, t, i) => { + if (e && typeof e == "object" || typeof e == "function") + for (let n of Mwe(e)) + !Ywe.call(s, n) && n !== t && wwe(s, n, { get: () => e[n], enumerable: !(i = Twe(e, n)) || i.enumerable }); + return s; +}, vwe = (s, e, t) => (kwe(s, e, "default"), t), C6 = {}; +vwe(C6, C0); +var Jwe = { + comments: { + lineComment: "#" + }, + brackets: [ + ["{", "}"], + ["[", "]"], + ["(", ")"] + ], + autoClosingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ], + surroundingPairs: [ + { open: "{", close: "}" }, + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "'", close: "'" } + ], + folding: { + offSide: !0 + }, + onEnterRules: [ + { + beforeText: /:\s*$/, + action: { + indentAction: C6.languages.IndentAction.Indent + } + } + ] +}, Hwe = { + tokenPostfix: ".yaml", + brackets: [ + { token: "delimiter.bracket", open: "{", close: "}" }, + { token: "delimiter.square", open: "[", close: "]" } + ], + keywords: ["true", "True", "TRUE", "false", "False", "FALSE", "null", "Null", "Null", "~"], + numberInteger: /(?:0|[+-]?[0-9]+)/, + numberFloat: /(?:0|[+-]?[0-9]+)(?:\.[0-9]+)?(?:e[-+][1-9][0-9]*)?/, + numberOctal: /0o[0-7]+/, + numberHex: /0x[0-9a-fA-F]+/, + numberInfinity: /[+-]?\.(?:inf|Inf|INF)/, + numberNaN: /\.(?:nan|Nan|NAN)/, + numberDate: /\d{4}-\d\d-\d\d([Tt ]\d\d:\d\d:\d\d(\.\d+)?(( ?[+-]\d\d?(:\d\d)?)|Z)?)?/, + escapes: /\\(?:[btnfr\\"']|[0-7][0-7]?|[0-3][0-7]{2})/, + tokenizer: { + root: [ + { include: "@whitespace" }, + { include: "@comment" }, + // Directive + [/%[^ ]+.*$/, "meta.directive"], + // Document Markers + [/---/, "operators.directivesEnd"], + [/\.{3}/, "operators.documentEnd"], + // Block Structure Indicators + [/[-?:](?= )/, "operators"], + { include: "@anchor" }, + { include: "@tagHandle" }, + { include: "@flowCollections" }, + { include: "@blockStyle" }, + // Numbers + [/@numberInteger(?![ \t]*\S+)/, "number"], + [/@numberFloat(?![ \t]*\S+)/, "number.float"], + [/@numberOctal(?![ \t]*\S+)/, "number.octal"], + [/@numberHex(?![ \t]*\S+)/, "number.hex"], + [/@numberInfinity(?![ \t]*\S+)/, "number.infinity"], + [/@numberNaN(?![ \t]*\S+)/, "number.nan"], + [/@numberDate(?![ \t]*\S+)/, "number.date"], + // Key:Value pair + [/(".*?"|'.*?'|[^#'"]*?)([ \t]*)(:)( |$)/, ["type", "white", "operators", "white"]], + { include: "@flowScalars" }, + // String nodes + [ + /.+?(?=(\s+#|$))/, + { + cases: { + "@keywords": "keyword", + "@default": "string" + } + } + ] + ], + // Flow Collection: Flow Mapping + object: [ + { include: "@whitespace" }, + { include: "@comment" }, + // Flow Mapping termination + [/\}/, "@brackets", "@pop"], + // Flow Mapping delimiter + [/,/, "delimiter.comma"], + // Flow Mapping Key:Value delimiter + [/:(?= )/, "operators"], + // Flow Mapping Key:Value key + [/(?:".*?"|'.*?'|[^,\{\[]+?)(?=: )/, "type"], + // Start Flow Style + { include: "@flowCollections" }, + { include: "@flowScalars" }, + // Scalar Data types + { include: "@tagHandle" }, + { include: "@anchor" }, + { include: "@flowNumber" }, + // Other value (keyword or string) + [ + /[^\},]+/, + { + cases: { + "@keywords": "keyword", + "@default": "string" + } + } + ] + ], + // Flow Collection: Flow Sequence + array: [ + { include: "@whitespace" }, + { include: "@comment" }, + // Flow Sequence termination + [/\]/, "@brackets", "@pop"], + // Flow Sequence delimiter + [/,/, "delimiter.comma"], + // Start Flow Style + { include: "@flowCollections" }, + { include: "@flowScalars" }, + // Scalar Data types + { include: "@tagHandle" }, + { include: "@anchor" }, + { include: "@flowNumber" }, + // Other value (keyword or string) + [ + /[^\],]+/, + { + cases: { + "@keywords": "keyword", + "@default": "string" + } + } + ] + ], + // First line of a Block Style + multiString: [[/^( +).+$/, "string", "@multiStringContinued.$1"]], + // Further lines of a Block Style + // Workaround for indentation detection + multiStringContinued: [ + [ + /^( *).+$/, + { + cases: { + "$1==$S2": "string", + "@default": { token: "@rematch", next: "@popall" } + } + } + ] + ], + whitespace: [[/[ \t\r\n]+/, "white"]], + // Only line comments + comment: [[/#.*$/, "comment"]], + // Start Flow Collections + flowCollections: [ + [/\[/, "@brackets", "@array"], + [/\{/, "@brackets", "@object"] + ], + // Start Flow Scalars (quoted strings) + flowScalars: [ + [/"([^"\\]|\\.)*$/, "string.invalid"], + [/'([^'\\]|\\.)*$/, "string.invalid"], + [/'[^']*'/, "string"], + [/"/, "string", "@doubleQuotedString"] + ], + doubleQuotedString: [ + [/[^\\"]+/, "string"], + [/@escapes/, "string.escape"], + [/\\./, "string.escape.invalid"], + [/"/, "string", "@pop"] + ], + // Start Block Scalar + blockStyle: [[/[>|][0-9]*[+-]?$/, "operators", "@multiString"]], + // Numbers in Flow Collections (terminate with ,]}) + flowNumber: [ + [/@numberInteger(?=[ \t]*[,\]\}])/, "number"], + [/@numberFloat(?=[ \t]*[,\]\}])/, "number.float"], + [/@numberOctal(?=[ \t]*[,\]\}])/, "number.octal"], + [/@numberHex(?=[ \t]*[,\]\}])/, "number.hex"], + [/@numberInfinity(?=[ \t]*[,\]\}])/, "number.infinity"], + [/@numberNaN(?=[ \t]*[,\]\}])/, "number.nan"], + [/@numberDate(?=[ \t]*[,\]\}])/, "number.date"] + ], + tagHandle: [[/\![^ ]*/, "tag"]], + anchor: [[/[&*][^ ]+/, "namespace"]] + } +}; +const Ewe = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({ __proto__: null, - CompletionAdapter: L8, - DefinitionAdapter: wWe, - DiagnosticsAdapter: S8, - DocumentColorAdapter: v8, - DocumentFormattingEditProvider: I8, - DocumentHighlightAdapter: bWe, - DocumentLinkAdapter: xWe, - DocumentRangeFormattingEditProvider: N8, - DocumentSymbolAdapter: M8, - FoldingRangeAdapter: T8, - HoverAdapter: A8, - ReferenceAdapter: CWe, - RenameAdapter: SWe, - SelectionRangeAdapter: D8, - WorkerManager: C8, - fromPosition: nu, - fromRange: L9, - getWorker: XWe, - setupMode: YWe, - toRange: Gs, - toTextEdit: Ub + conf: Jwe, + language: Hwe }, Symbol.toStringTag, { value: "Module" })); export { - yDe as render + b5e as render }; diff --git a/src/panelini/panels/monacoeditor/js/package-lock.json b/src/panelini/panels/monacoeditor/js/package-lock.json index 3953141b..2f34c8a8 100644 --- a/src/panelini/panels/monacoeditor/js/package-lock.json +++ b/src/panelini/panels/monacoeditor/js/package-lock.json @@ -6,7 +6,8 @@ "": { "name": "panelini-monacoeditor", "dependencies": { - "monaco-editor": "0.52.2" + "monaco-editor": "0.52.2", + "monaco-yaml": "^5.5.1" }, "devDependencies": { "vite": "^5.0.0" @@ -777,6 +778,12 @@ "dev": true, "license": "MIT" }, + "node_modules/@vscode/l10n": { + "version": "0.0.18", + "resolved": "https://registry.npmjs.org/@vscode/l10n/-/l10n-0.0.18.tgz", + "integrity": "sha512-KYSIHVmslkaCDyw013pphY+d7x1qV8IZupYfeIfzNA+nsaWHbn5uPuQRvdRFsa9zFzGeudPuoGoZ1Op4jrJXIQ==", + "license": "MIT" + }, "node_modules/esbuild": { "version": "0.21.5", "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", @@ -831,12 +838,92 @@ "node": "^8.16.0 || ^10.6.0 || >=11.0.0" } }, + "node_modules/jsonc-parser": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/jsonc-parser/-/jsonc-parser-3.3.1.tgz", + "integrity": "sha512-HUgH65KyejrUFPvHFPbqOY0rsFip3Bo5wb4ngvdi1EpCYWUQDC5V+Y7mZws+DLkr4M//zQJoanu1SP+87Dv1oQ==", + "license": "MIT" + }, "node_modules/monaco-editor": { "version": "0.52.2", "resolved": "https://registry.npmjs.org/monaco-editor/-/monaco-editor-0.52.2.tgz", "integrity": "sha512-GEQWEZmfkOGLdd3XK8ryrfWz3AIP8YymVXiPHEdewrUq7mh0qrKrfHLNCXcbB6sTnMLnOZ3ztSiKcciFUkIJwQ==", "license": "MIT" }, + "node_modules/monaco-languageserver-types": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/monaco-languageserver-types/-/monaco-languageserver-types-0.4.1.tgz", + "integrity": "sha512-uLiYM6K6jPqAa1ni9lRBoj8ZJAErOcegBrfEpurIUUO8cBhlhrGYjWbjhl4OPcxUNoj1JvqSETjwCTyhGgwymQ==", + "license": "MIT", + "dependencies": { + "monaco-types": "^0.1.0", + "vscode-languageserver-protocol": "^3.0.0", + "vscode-uri": "^3.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/monaco-marker-data-provider": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/monaco-marker-data-provider/-/monaco-marker-data-provider-1.2.5.tgz", + "integrity": "sha512-5ZdcYukhPwgYMCvlZ9H5uWs5jc23BQ8fFF5AhSIdrz5mvYLsqGZ58ZLxTv8rCX6+AxdJ8+vxg1HVSk+F2bLosg==", + "license": "MIT", + "dependencies": { + "monaco-types": "^0.1.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/monaco-types": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/monaco-types/-/monaco-types-0.1.2.tgz", + "integrity": "sha512-8LwfrlWXsedHwAL41xhXyqzPibS8IqPuIXr9NdORhonS495c2/wky+sI1PRLvMCuiI0nqC2NH1six9hdiRY4Xg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, + "node_modules/monaco-worker-manager": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/monaco-worker-manager/-/monaco-worker-manager-2.0.1.tgz", + "integrity": "sha512-kdPL0yvg5qjhKPNVjJoym331PY/5JC11aPJXtCZNwWRvBr6jhkIamvYAyiY5P1AWFmNOy0aRDRoMdZfa71h8kg==", + "license": "MIT", + "peerDependencies": { + "monaco-editor": ">=0.30.0" + } + }, + "node_modules/monaco-yaml": { + "version": "5.5.1", + "resolved": "https://registry.npmjs.org/monaco-yaml/-/monaco-yaml-5.5.1.tgz", + "integrity": "sha512-vLR1EoV7Au0tkuA9T6ZJr2q7CooRP69AvlqzWh9Gui6amuijdTsfCAQHtCFobRMwkhbuly6J1Q16NziTTiWtWQ==", + "license": "MIT", + "workspaces": [ + "examples/*" + ], + "dependencies": { + "@vscode/l10n": "^0.0.18", + "jsonc-parser": "^3.0.0", + "monaco-languageserver-types": "^0.4.0", + "monaco-marker-data-provider": "^1.0.0", + "monaco-types": "^0.1.0", + "monaco-worker-manager": "^2.0.0", + "path-browserify": "^1.0.0", + "prettier": "^3.0.0", + "proxy-disposable": "^1.0.0", + "vscode-languageserver-textdocument": "^1.0.0", + "vscode-languageserver-types": "^3.0.0", + "vscode-uri": "^3.0.0", + "yaml": "^2.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + }, + "peerDependencies": { + "monaco-editor": ">=0.36" + } + }, "node_modules/nanoid": { "version": "3.3.18", "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.18.tgz", @@ -856,6 +943,12 @@ "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" } }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "license": "MIT" + }, "node_modules/picocolors": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", @@ -892,6 +985,30 @@ "node": "^10 || ^12 || >=14" } }, + "node_modules/prettier": { + "version": "3.9.6", + "resolved": "https://registry.npmjs.org/prettier/-/prettier-3.9.6.tgz", + "integrity": "sha512-OpN0zzVdiaiAhxpuuj5efpIS4sY9j7bY6uR5mnj5yPzGkdkjNKSJeUThPb60Jw29QuAZgA4o+/iB49kFiaBX6g==", + "license": "MIT", + "bin": { + "prettier": "bin/prettier.cjs" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/prettier/prettier?sponsor=1" + } + }, + "node_modules/proxy-disposable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/proxy-disposable/-/proxy-disposable-1.0.0.tgz", + "integrity": "sha512-Y673BKpFqk8XkYuoK9DGZ1RIzldz5SkzxTKc/+DkpaMdrDEbEalWlO/uMRMdJsXvdbTybJI26XDwN0KJpZDN4w==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/remcohaszing" + } + }, "node_modules/rollup": { "version": "4.63.0", "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.63.0.tgz", @@ -1007,6 +1124,58 @@ "optional": true } } + }, + "node_modules/vscode-jsonrpc": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/vscode-jsonrpc/-/vscode-jsonrpc-9.0.2.tgz", + "integrity": "sha512-SbQSV9yRemARxeXw6LU5sS6Zq0e9/DgCCX5yelH263ZQWukbTk8EF8fjTrr1dziasf4GwlJbvTwFnTrnQFWZXQ==", + "license": "MIT", + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/vscode-languageserver-protocol": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-protocol/-/vscode-languageserver-protocol-3.18.3.tgz", + "integrity": "sha512-DF49+WeV5py4zO5hhobp60jjsDSK0lAqA0OuKBLBvp423HPWQcCbhZz3JgyfIewsEz2f8U+X75xNIFHdiXZm2w==", + "license": "MIT", + "dependencies": { + "vscode-jsonrpc": "9.0.2", + "vscode-languageserver-types": "3.18.3" + } + }, + "node_modules/vscode-languageserver-textdocument": { + "version": "1.0.14", + "resolved": "https://registry.npmjs.org/vscode-languageserver-textdocument/-/vscode-languageserver-textdocument-1.0.14.tgz", + "integrity": "sha512-EQyqJMi552E4ZTf46izQ4Fj6XquqxCySR3J5ZSD1SisMf6RfpeOWHxGBE8Gr6V0/3GHIGdAzDn8F8+1nTGCnoQ==", + "license": "MIT" + }, + "node_modules/vscode-languageserver-types": { + "version": "3.18.3", + "resolved": "https://registry.npmjs.org/vscode-languageserver-types/-/vscode-languageserver-types-3.18.3.tgz", + "integrity": "sha512-XIlzJ7Qp/jzSI1ds7/FwPAWrPeTZA7pAtlW4hdJ1J6xXWJL6dR9QYnDhJOdLzdKhUQ5Mm6mvUMw+3DcOQQasPw==", + "license": "MIT" + }, + "node_modules/vscode-uri": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.2.0.tgz", + "integrity": "sha512-m2gXo3bn0G1kT9InzMf07fTbqMbGtyckj3bH5ktLO+1Ssv+yiATZ4dhwaQv9UZWxJh6E9IFGnQyjgWVDWVBDrg==", + "license": "MIT" + }, + "node_modules/yaml": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.9.1.tgz", + "integrity": "sha512-3NxN8+78OdzbT7C/WjGsyfPAtJaN3FNDsWxv7Y7mcDsT/oOmgW8BpyQQFFBnvZE3j9Y2Sdz1ULFLezL7Eb2yFw==", + "license": "ISC", + "bin": { + "yaml": "bin.mjs" + }, + "engines": { + "node": ">= 14.6" + }, + "funding": { + "url": "https://github.com/sponsors/eemeli" + } } } } diff --git a/src/panelini/panels/monacoeditor/js/package.json b/src/panelini/panels/monacoeditor/js/package.json index d3f2dc2b..072e1bd8 100644 --- a/src/panelini/panels/monacoeditor/js/package.json +++ b/src/panelini/panels/monacoeditor/js/package.json @@ -5,7 +5,8 @@ "vite": "^5.0.0" }, "dependencies": { - "monaco-editor": "0.52.2" + "monaco-editor": "0.52.2", + "monaco-yaml": "^5.5.1" }, "scripts": { "build": "vite build --config vite.config.js", diff --git a/src/panelini/panels/monacoeditor/js/src/monacoeditor_component.js b/src/panelini/panels/monacoeditor/js/src/monacoeditor_component.js index 83422f46..9eb1cea2 100644 --- a/src/panelini/panels/monacoeditor/js/src/monacoeditor_component.js +++ b/src/panelini/panels/monacoeditor/js/src/monacoeditor_component.js @@ -4,9 +4,17 @@ // `?worker` so the workers are embedded and dist stays self-contained. import "monaco-editor/esm/vs/editor/editor.all.js"; import "monaco-editor/esm/vs/language/json/monaco.contribution.js"; +// Monarch highlighting only: YAML gets colors but no schema service, which the JSON side +// provides for the same document. +import "monaco-editor/esm/vs/basic-languages/yaml/yaml.contribution.js"; import * as monaco from "monaco-editor/esm/vs/editor/editor.api.js"; import EditorWorker from "monaco-editor/esm/vs/editor/editor.worker?worker&inline"; import JsonWorker from "monaco-editor/esm/vs/language/json/json.worker?worker&inline"; +// A real YAML language service (validation, completion, hover against JSON schemas), not +// just the Monarch tokenizer: YAML has no in-document $schema, so fileMatch is its only +// association and the same schemas registered for JSON apply. +import { configureMonacoYaml } from "monaco-yaml"; +import YamlWorker from "monaco-yaml/yaml.worker?worker&inline"; import codiconTtf from "monaco-editor/esm/vs/base/browser/ui/codicons/codicon/codicon.ttf?inline"; const SYNC_DEBOUNCE_MS = 300; @@ -23,33 +31,154 @@ function injectCodiconFont() { document.head.appendChild(style); } +// With schema fetching enabled, monaco may ask for a buffer's relative $schema in the +// moment before the debounced schema store lands. That resolves against the models' +// inmemory:// base, and Chrome reports the unsupported scheme as a console error even +// though the store answers 50 ms later. Rejecting before the native call keeps the console +// clean; real http(s) requests pass through untouched. +const nativeFetch = self.fetch.bind(self); +self.fetch = (resource, ...rest) => { + if (String(resource?.url ?? resource).startsWith("inmemory:")) { + return Promise.reject(new TypeError("inmemory:// resolves from the schema store, not by fetch")); + } + return nativeFetch(resource, ...rest); +}; + self.MonacoEnvironment = { getWorker(_, label) { if (label === "json") return new JsonWorker(); + if (label === "yaml") return new YamlWorker(); return new EditorWorker(); }, }; +// The ESM build never assigns the global the AMD loader would, leaving outside automation +// no handle on the API (MonacoEnvironment.globalAPI only works when it is set before +// monaco's module evaluates, which import hoisting makes unreliable). Assigned, not +// spread-merged: this bundle carries its own complete monaco. +if (!self.monaco) { + self.monaco = monaco; +} + +// configureMonacoYaml registers global providers, exactly like jsonDefaults; created once +// and fed by the same schema maps. +let monacoYaml = null; + +function yamlService() { + if (!monacoYaml) { + monacoYaml = configureMonacoYaml(monaco, { enableSchemaRequest: false, schemas: [] }); + } + return monacoYaml; +} + +// Monaco ships no Turtle language, so a small Monarch tokenizer supplies the highlighting: +// IRIs, prefixed names, literals with language tags or datatypes, and the @prefix/@base +// directives cover what serializers emit. +let turtleRegistered = false; + +function registerTurtle() { + if (turtleRegistered) return; + turtleRegistered = true; + monaco.languages.register({ id: "turtle", extensions: [".ttl"], aliases: ["Turtle"] }); + monaco.languages.setLanguageConfiguration("turtle", { + comments: { lineComment: "#" }, + brackets: [["[", "]"], ["(", ")"]], + autoClosingPairs: [ + { open: "[", close: "]" }, + { open: "(", close: ")" }, + { open: '"', close: '"' }, + { open: "<", close: ">" }, + ], + }); + monaco.languages.setMonarchTokensProvider("turtle", { + defaultToken: "", + tokenizer: { + root: [ + [/#.*$/, "comment"], + [/@(prefix|base)\b/, "keyword"], + [/\b(a|true|false)\b/, "keyword"], + [/<[^<>"{}|^`\s]*>/, "type.identifier"], + [/"""/, { token: "string", next: "@longString" }], + [/"(?:[^"\\]|\\.)*"(?:\^\^|@[a-zA-Z][a-zA-Z0-9-]*)?/, "string"], + [/[+-]?\d+(\.\d+)?([eE][+-]?\d+)?/, "number"], + [/[A-Za-z_][\w.-]*:[\w.%-]*/, "identifier"], + [/:[\w.%-]+/, "identifier"], + [/[;,.\[\]()]/, "delimiter"], + ], + longString: [ + [/"""/, { token: "string", next: "@pop" }], + [/./, "string"], + ], + }, + }); +} + // jsonDefaults is a page-wide singleton, so every editor's schema is tracked here and // scoped to that editor's model URI via fileMatch. const schemas = new Map(); +// Schemas registered by the URI a document's own `$schema` names, because that in-document +// pointer takes precedence over any fileMatch association: without a local copy under that +// URI the buffer gets no schema at all, since nothing is ever fetched. Keyed per editor so +// disposal removes exactly what one editor contributed; a relative pointer resolves against +// the in-memory folder the models live in, mirroring how the JSON service resolves it. +const SCHEMA_STORE_BASE = "inmemory://panelini/"; +const schemaStores = new Map(); + +function storeEntries() { + const merged = new Map(); + for (const store of schemaStores.values()) { + for (const [key, schema] of Object.entries(store || {})) { + const uri = /^[a-z][a-z0-9+.-]*:/i.test(key) ? key : new URL(key, SCHEMA_STORE_BASE).href; + merged.set(uri, schema); + } + } + return merged; +} // schemaRequest has no per-editor equivalent either, and unlike schemas it cannot be // scoped by fileMatch, so it is merged: the most permissive level on the page wins. const SCHEMA_REQUEST_LEVELS = ["ignore", "warning", "error"]; const schemaRequests = new Map(); +// Fetching schemas over the network is opt-in and page-wide (another jsonDefaults +// singleton): one editor asking for it turns it on for all. +const schemaFetch = new Map(); let modelSeq = 0; +// Registrations arrive in a burst (four settings per editor, any number of editors on the +// page), and both language services treat every options update as a reset - monaco-yaml +// restarts its worker each time. Applied unbatched, a page of editors spends minutes +// re-initialising; coalesced, the burst costs one update. +let syncScheduled = false; + function syncSchemas() { + if (syncScheduled) return; + syncScheduled = true; + setTimeout(() => { + syncScheduled = false; + applySchemas(); + }, 50); +} + +function applySchemas() { const levels = [...schemaRequests.values()]; + const fetchEnabled = [...schemaFetch.values()].some(Boolean); + // The registration URI must be fragment-free: yaml-language-server reads a fragment as a + // JSON-pointer section into the schema and crashes on one that does not exist, where the + // JSON service treats the URI as an opaque id. + const fileMatched = [...schemas].map(([uri, schema]) => ({ + uri: `${uri}.schema`, + fileMatch: [uri], + schema, + })); + const stored = [...storeEntries()].map(([uri, schema]) => ({ uri, schema })); monaco.languages.json.jsonDefaults.setDiagnosticsOptions({ validate: true, - enableSchemaRequest: false, + enableSchemaRequest: fetchEnabled, schemaRequest: SCHEMA_REQUEST_LEVELS.find((level) => levels.includes(level)) ?? "warning", - schemas: [...schemas].map(([uri, schema]) => ({ - uri: `${uri}#schema`, - fileMatch: [uri], - schema, - })), + schemas: [...fileMatched, ...stored], + }); + yamlService().update({ + enableSchemaRequest: fetchEnabled, + schemas: [...fileMatched, ...stored], }); } @@ -71,8 +200,27 @@ function setSchema(uri, schema) { syncSchemas(); } +function setSchemaFetch(uri, enabled) { + if (enabled) { + schemaFetch.set(uri, true); + } else { + schemaFetch.delete(uri); + } + syncSchemas(); +} + +function setSchemaStore(uri, store) { + if (store && Object.keys(store).length) { + schemaStores.set(uri, store); + } else { + schemaStores.delete(uri); + } + syncSchemas(); +} + export function render({ model, el }) { injectCodiconFont(); + registerTurtle(); el.style.height = "100%"; const container = document.createElement("div"); container.style.cssText = "width:100%;height:100%;min-height:150px"; @@ -81,7 +229,9 @@ export function render({ model, el }) { const uri = monaco.Uri.parse(`inmemory://panelini/editor-${modelSeq++}.json`); const textModel = monaco.editor.createModel(model.get("value"), model.get("language"), uri); setSchema(uri.toString(), model.get("json_schema")); + setSchemaStore(uri.toString(), model.get("schema_store")); setSchemaRequest(uri.toString(), model.get("schema_request")); + setSchemaFetch(uri.toString(), model.get("enable_schema_request")); const editor = monaco.editor.create(container, { model: textModel, @@ -93,6 +243,9 @@ export function render({ model, el }) { ...(model.get("options") || {}), }); + model.set("ready", true); + model.save_changes(); + // Monaco's global mouse-leave monitor tests viewDomNode.contains(event.target) on a // document listener. Inside a shadow root the event retargets to the host, so that is // always false and every mouse move is treated as leaving the editor, which cancels the @@ -119,7 +272,9 @@ export function render({ model, el }) { applying = false; }); model.on("change:json_schema", () => setSchema(uri.toString(), model.get("json_schema"))); + model.on("change:schema_store", () => setSchemaStore(uri.toString(), model.get("schema_store"))); model.on("change:schema_request", () => setSchemaRequest(uri.toString(), model.get("schema_request"))); + model.on("change:enable_schema_request", () => setSchemaFetch(uri.toString(), model.get("enable_schema_request"))); model.on("change:language", () => monaco.editor.setModelLanguage(textModel, model.get("language"))); model.on("change:theme", () => monaco.editor.setTheme(model.get("theme"))); model.on("change:read_only", () => editor.updateOptions({ readOnly: model.get("read_only") })); @@ -129,6 +284,8 @@ export function render({ model, el }) { editor.dispose(); textModel.dispose(); setSchema(uri.toString(), null); + setSchemaStore(uri.toString(), null); setSchemaRequest(uri.toString(), null); + setSchemaFetch(uri.toString(), false); }; } diff --git a/src/panelini/panels/monacoeditor/monacoeditor.py b/src/panelini/panels/monacoeditor/monacoeditor.py index c9844c1b..dc919c7c 100644 --- a/src/panelini/panels/monacoeditor/monacoeditor.py +++ b/src/panelini/panels/monacoeditor/monacoeditor.py @@ -1,6 +1,7 @@ """Entrypoint of monacoeditor panel.""" import json +import os from pathlib import Path from typing import Any, ClassVar @@ -12,15 +13,67 @@ bundled_assets_dir = Path(__file__).parent / "js" / "dist" +#: The commit whose committed ``js/dist`` bundle the import map points at. Update when the +#: bundle is rebuilt (the pin must name a commit that already contains the new dist). +_BUNDLE_REF = "a748bb7cbbab8798b6abe8e858e013968dbc35d6" +_BUNDLE_CDN = ( + "https://cdn.jsdelivr.net/gh/opensemanticworld/panelini" + f"@{_BUNDLE_REF}/src/panelini/panels/monacoeditor/js/dist/monacoeditor.mjs" +) +#: Override with a self-hosted URL, or "inline" to embed the module text in the document +#: (offline use). Inline costs dearly with many editors: ``_esm`` is a per-instance model +#: property, so a page with 24 editors ships the 6.6 MB bundle 24 times. +_BUNDLE_URL = os.environ.get("PANELINI_MONACO_BUNDLE", _BUNDLE_CDN) + class MonacoEditor(AnyWidgetComponent): """A code and JSON editor using https://github.com/microsoft/monaco-editor""" - _esm = (bundled_assets_dir / "monacoeditor.mjs").read_text(encoding="utf-8") + if _BUNDLE_URL == "inline": + _esm = (bundled_assets_dir / "monacoeditor.mjs").read_text(encoding="utf-8") + else: + # A shim that re-exports the real module: the browser fetches and caches the bundle + # once, and the document carries these two lines per editor instead of the bundle. + _esm = 'export { render } from "monacoeditor-bundle";' + _importmap: ClassVar = {"imports": {"monacoeditor-bundle": _BUNDLE_URL}} + + # Monaco tracks list focus through document.activeElement, which a shadow root retargets, + # so a suggest row ends up with the focused-row *foreground* (white) while the matching + # focus *background* rule never applies: white text on the widget's near-white ground. + # Pinning both sides of each state keeps every row readable whatever the focus tracking + # concluded. + _SUGGEST_CONTRAST_CSS: ClassVar = """ +.monaco-editor .suggest-widget .monaco-list-row { + color: var(--vscode-editorSuggestWidget-foreground, #000000); +} +.monaco-editor .suggest-widget .monaco-list-row.focused { + color: var(--vscode-editorSuggestWidget-selectedForeground, #ffffff); + background-color: var(--vscode-editorSuggestWidget-selectedBackground, #0060c0); +} +.monaco-editor .suggest-widget .monaco-list-row .details-label, +.monaco-editor .suggest-widget .suggest-details { + color: var(--vscode-editorSuggestWidget-foreground, #333333); +} +/* Monaco's suggest rows use the generic class names .main, .left and .right, and a host + app's global stylesheets reach into the shadow root (Panel distributes them there). A + host rule like `.main { padding-top: 17px }` pushed every label out of its 16px row, so + the box properties monaco relies on are pinned. */ +.monaco-editor .suggest-widget .monaco-list-row .contents > .main, +.monaco-editor .suggest-widget .monaco-list-row .contents > .main > .left, +.monaco-editor .suggest-widget .monaco-list-row .contents > .main > .right { + padding: 0 !important; + margin: 0 !important; + border: none !important; + min-height: 0 !important; + height: 100% !important; + align-items: center !important; +} +""" _stylesheets: ClassVar = [ (bundled_assets_dir / "monacoeditor.css").read_text(encoding="utf-8"), + _SUGGEST_CONTRAST_CSS, ] value = param.String(default="", doc="Editor text, synced from the browser.") @@ -28,7 +81,24 @@ class MonacoEditor(AnyWidgetComponent): json_schema = param.Dict( default=None, allow_None=True, - doc="JSON schema validated against the buffer. None disables validation.", + doc=( + "JSON schema validated against the buffer. None disables validation. Ignored by " + "Monaco when the buffer itself declares `$schema`, which always wins; register " + "the schema under that URI in `schema_store` for such documents." + ), + ) + schema_store = param.Dict( + default=None, + allow_None=True, + doc=( + "Schemas keyed by the URI a buffer's own `$schema` may name, resolved locally " + "since Monaco never fetches. A buffer that declares `$schema` bypasses " + "`json_schema` entirely, so without a store entry under that URI it gets no " + "validation and no completion at all. Relative keys resolve against the " + "in-memory folder the editor models live in, mirroring how the JSON service " + "resolves a relative `$schema`. The store is page-wide; on a key registered by " + "several editors the last one wins." + ), ) schema_request = param.Selector( default="warning", @@ -41,8 +111,26 @@ class MonacoEditor(AnyWidgetComponent): "so the most permissive setting among the editors on the page wins." ), ) + enable_schema_request = param.Boolean( + default=False, + doc=( + "Let Monaco fetch schemas over the network: a buffer's `$schema` pointer and any " + "remote `$ref` inside a schema resolve live (CORS permitting) instead of only " + "against `schema_store`. Page-wide, like the other jsonDefaults settings: one " + "editor enabling it enables it for all." + ), + ) theme = param.Selector(default="vs", objects=["vs", "vs-dark", "hc-black", "hc-light"]) read_only = param.Boolean(default=False) + ready = param.Boolean( + default=False, + doc=( + "Set from the browser once the editor exists. Monaco boots noticeably later than " + "the page (the bundle is large), so a host that wants a loading indicator needs " + "this signal rather than the page's own load event. Same convention as " + "JsonEditor.ready." + ), + ) options = param.Dict(default={}, doc="Extra monaco.editor.create options, merged last.") # Sizing modes that already hand Monaco a height to fill. Pinning a height on top of diff --git a/tests/panels/monacoeditor/test_monacoeditor.py b/tests/panels/monacoeditor/test_monacoeditor.py index 6a03b0ca..71fa4926 100644 --- a/tests/panels/monacoeditor/test_monacoeditor.py +++ b/tests/panels/monacoeditor/test_monacoeditor.py @@ -1,5 +1,6 @@ """Test cases for the Panelini monacoeditor panel.""" +import importlib import json from panelini.panels.monacoeditor import MonacoEditor @@ -62,3 +63,23 @@ def test_monacoeditor_retains_schema(): schema = {"type": "object", "required": ["name"], "properties": {"name": {"type": "string"}}} editor = MonacoEditor(json_schema=schema) assert editor.json_schema == schema + + +def test_monacoeditor_inline_bundle_embeds_module_text(monkeypatch): + """PANELINI_MONACO_BUNDLE=inline embeds the bundle text instead of the CDN shim. + + The inline branch runs at class-definition time, so the module has to be reimported + with the environment set before MonacoEditor picks up the inlined ``_esm``. + """ + from panelini.panels.monacoeditor import monacoeditor as module + + bundle_text = (module.bundled_assets_dir / "monacoeditor.mjs").read_text(encoding="utf-8") + monkeypatch.setenv("PANELINI_MONACO_BUNDLE", "inline") + try: + importlib.reload(module) + assert module.MonacoEditor._esm == bundle_text + # The inline build carries the module text itself, so it needs no import map. + assert "_importmap" not in module.MonacoEditor.__dict__ + finally: + monkeypatch.undo() + importlib.reload(module) diff --git a/tests/portfolio/test_apps.py b/tests/portfolio/test_apps.py index 97c65d1c..fb1237c8 100644 --- a/tests/portfolio/test_apps.py +++ b/tests/portfolio/test_apps.py @@ -41,6 +41,7 @@ # The chat runs against the LangChain stand-ins (see panelini.ai_testing); its # prompt box is the signature widget. "ai": "textarea", + "monacoeditor": ".monaco-editor", } # First load fetches Pyodide + wheels over the network; keep this well above a normal